mricron-0.20120505.1~dfsg.1.orig/0000775000175000017500000000000011754254530015656 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/_xclean.bat0000664000175000017500000000047711423266400017757 0ustar michaelmichaelrm -r *.o rm -r *.ppu rm -r *.bak rm mricron cd ./rgb rm -r *.o rm -r *.ppu rm -r *.bak cd .. cd ./common rm -r *.o rm -r *.ppu rm -r *.bak cd .. cd ./dcm2nii rm ./dcm2niigui rm ./dcm2nii rm -r *.o rm -r *.ppu rm -r *.bak rm -rf dcm2niigui.app cd .. cd ./npm rm ./npm rm -r *.o rm -r *.ppu rm -r *.bak mricron-0.20120505.1~dfsg.1.orig/_xcarbon.bat0000664000175000017500000000060210722047740020134 0ustar michaelmichaelrm ~/Documents/mricron/mricron.app/mricron ln -s ~/Documents/mricron/mricron ~/Documents/mricron/mricron.app/mricron rm ~/Documents/mricron/npm/npm.app/npm ln -s ~/Documents/mricron/npm/npm ~/Documents/mricron/npm/npm.app/npm rm ~/Documents/mricron/dcm2nii/dcm2niigui.app/dcm2niigui ln -s ~/Documents/mricron/dcm2nii/dcm2niigui ~/Documents/mricron/dcm2nii/dcm2niigui.app/dcm2niigui mricron-0.20120505.1~dfsg.1.orig/_winscript.bat0000664000175000017500000000073511050304306020516 0ustar michaelmichaelcall _clean.bat copy .\common\notgui.inc .\common\isgui.inc c:\lazarus\lazbuild .\dcm2nii\dcm2nii.lpr copy .\dcm2nii\dcm2nii.exe c:\mricron\dcm2nii.exe call _clean.bat copy .\common\gui.inc .\common\isgui.inc c:\lazarus\lazbuild .\npm\npm.lpr copy .\npm\npm.exe c:\mricron\npm.exe c:\lazarus\lazbuild .\dcm2nii\dcm2niigui.lpr copy .\dcm2nii\dcm2niigui.exe c:\mricron\dcm2niigui.exe c:\lazarus\lazbuild .\mricron.lpr copy .\mricron.exe c:\mricron\mricron.exe call _clean.bat mricron-0.20120505.1~dfsg.1.orig/_script.bat0000664000175000017500000000130011070150324017766 0ustar michaelmichaelchmod 777 ./_xclean.bat ./_xclean.bat cp ./common/notgui.inc ./common/isgui.inc lazbuild ./dcm2nii/dcm2nii.lpr cp ./dcm2nii/dcm2nii ../gtk1/mricron/dcm2nii cp ./dcm2nii/dcm2nii ../gtk2/mricron/dcm2nii cp ./common/gui.inc ./common/isgui.inc ./_xclean.bat lazbuild ./mricron.lpr lazbuild ./npm/npm.lpr lazbuild ./dcm2nii/dcm2niigui.lpr cp ./mricron ../gtk1/mricron/mricron cp ./npm/npm ../gtk1/mricron/npm cp ./dcm2nii/dcm2niigui ../gtk1/mricron/dcm2niigui ./_xclean.bat lazbuild ./mricron.lpr --ws=gtk2 lazbuild ./npm/npm.lpr --ws=gtk2 lazbuild ./dcm2nii/dcm2niigui.lpr --ws=gtk2 cp ./mricron ../gtk2/mricron/mricron cp ./npm/npm ../gtk2/mricron/npm cp ./dcm2nii/dcm2niigui ../gtk2/mricron/dcm2niigui mricron-0.20120505.1~dfsg.1.orig/_qtscript.bat0000664000175000017500000000172511070137626020360 0ustar michaelmichaelchmod 777 ./_xclean.bat ./_xclean.bat cp ./common/notgui.inc ./common/isgui.inc lazbuild ./dcm2nii/dcm2nii.lpr cp ./dcm2nii/dcm2nii ../gtk1/mricron/dcm2nii cp ./dcm2nii/dcm2nii ../gtk2/mricron/dcm2nii cp ./dcm2nii/dcm2nii ../qt/mricron/dcm2nii cp ./common/gui.inc ./common/isgui.inc ./_xclean.bat lazbuild ./mricron.lpr lazbuild ./npm/npm.lpr lazbuild ./dcm2nii/dcm2niigui.lpr cp ./mricron ../gtk1/mricron/mricron cp ./npm/npm ../gtk1/mricron/npm cp ./dcm2nii/dcm2niigui ../gtk1/mricron/dcm2niigui ./_xclean.bat lazbuild ./mricron.lpr --ws=gtk2 lazbuild ./npm/npm.lpr --ws=gtk2 lazbuild ./dcm2nii/dcm2niigui.lpr --ws=gtk2 cp ./mricron ../gtk2/mricron/mricron cp ./npm/npm ../gtk2/mricron/npm cp ./dcm2nii/dcm2niigui ../gtk2/mricron/dcm2niigui ./_xclean.bat lazbuild ./mricron.lpr --ws=qt lazbuild ./npm/npm.lpr --ws=qt lazbuild ./dcm2nii/dcm2niigui.lpr --ws=qt cp ./mricron ../qt/mricron/mricron cp ./npm/npm ../qt/mricron/npm cp ./dcm2nii/dcm2niigui ../qt/mricron/dcm2niigui mricron-0.20120505.1~dfsg.1.orig/_macscriptppc.bat0000664000175000017500000000067111266103402021166 0ustar michaelmichaelchmod 777 ./_xclean.bat ./_xclean.bat cp ./common/notgui.inc ./common/isgui.inc lazbuild ./dcm2nii/dcm2nii.lpr cp ./dcm2nii/dcm2nii ../distro/ppc/dcm2nii ./_xclean.bat cp ./common/gui.inc ./common/isgui.inc lazbuild ./mricron.lpr --ws=carbon lazbuild ./npm/npm.lpr --ws=carbon lazbuild ./dcm2nii/dcm2niigui.lpr --ws=carbon cp ./mricron ../distro/ppc/mricron cp ./npm/npm ../distro/ppc/npm cp ./dcm2nii/dcm2niigui ../distro/ppc/dcm2niigui mricron-0.20120505.1~dfsg.1.orig/_macscriptintel104.bat0000664000175000017500000000122611311704532021743 0ustar michaelmichaelchmod 777 ./_xclean.bat ./_xclean.bat cp ./common/notgui.inc ./common/isgui.inc lazbuild ./dcm2nii/dcm2nii.lpr="-va -k-macosx_version_min -k10.4 -XR/Developer/SDKs/MacOSX10.4u.sdk/" cp ./dcm2nii/dcm2nii ../distro/intel/dcm2nii ./_xclean.bat cp ./common/gui.inc ./common/isgui.inc lazbuild ./mricron.lpr="-va -k-macosx_version_min -k10.4 -XR/Developer/SDKs/MacOSX10.4u.sdk/" --ws=carbon lazbuild ./npm/npm.lpr="-va -k-macosx_version_min -k10.4 -XR/Developer/SDKs/MacOSX10.4u.sdk/" --ws=carbon lazbuild ./dcm2nii/dcm2niigui.lpr --ws=carbon cp ./mricron ../distro/intel/mricron cp ./npm/npm ../distro/intel/npm cp ./dcm2nii/dcm2niigui ../distro/intel/dcm2niigui mricron-0.20120505.1~dfsg.1.orig/_macscriptintel.bat0000664000175000017500000000070111023167542021517 0ustar michaelmichaelchmod 777 ./_xclean.bat ./_xclean.bat cp ./common/notgui.inc ./common/isgui.inc lazbuild ./dcm2nii/dcm2nii.lpr cp ./dcm2nii/dcm2nii ../distro/intel/dcm2nii ./_xclean.bat cp ./common/gui.inc ./common/isgui.inc lazbuild ./mricron.lpr --ws=carbon lazbuild ./npm/npm.lpr --ws=carbon lazbuild ./dcm2nii/dcm2niigui.lpr --ws=carbon cp ./mricron ../distro/intel/mricron cp ./npm/npm ../distro/intel/npm cp ./dcm2nii/dcm2niigui ../distro/intel/dcm2niigui mricron-0.20120505.1~dfsg.1.orig/_macscript.bat0000664000175000017500000000071411017222334020461 0ustar michaelmichaelchmod 777 ./_xclean.bat ./_xclean.bat cp ./common/notgui.inc ./common/isgui.inc lazbuild ./dcm2nii/dcm2nii.lpr cp ./dcm2nii/dcm2nii ../distro/dcm2nii ./_xclean.bat cp ./common/gui.inc ./common/isgui.inc lazbuild ./mricron.lpr --ws=carbon lazbuild ./npm/npm.lpr --ws=carbon lazbuild ./dcm2nii/dcm2niigui.lpr --ws=carbon cp ./mricron ../distro/mricron.app/mricron cp ./npm/npm ../distro/npm.app/npm cp ./dcm2nii/dcm2niigui ../distro/dcm2niigui.app/dcm2niigui mricron-0.20120505.1~dfsg.1.orig/_maclipo.bat0000664000175000017500000000064111372527052020130 0ustar michaelmichaellipo -create ../distro/ppc/dcm2nii ../distro/intel/dcm2nii -output ../distro/dcm2nii lipo -create ../distro/ppc/mricron ../distro/intel/mricron -output ../distro/mricron.app/Contents/MacOS/mricron lipo -create ../distro/ppc/dcm2niigui ../distro/intel/dcm2niigui -output ../distro/dcm2niigui.app/Contents/MacOS/dcm2niigui lipo -create ../distro/ppc/npm ../distro/intel/npm -output ../distro/npm.app/Contents/MacOS/npm mricron-0.20120505.1~dfsg.1.orig/_lxall.bat0000664000175000017500000000034111070415754017615 0ustar michaelmichael cd ~/mricron chmod 777 ./_qtscript.bat ./_qtscript.bat cd ~/qt zip -r mricronqt mricron mv mricronqt.zip .. cd ~/gtk1 zip -r mricronlx mricron mv mricronlx.zip .. cd ~/gtk2 zip -r mricronlx2 mricron mv mricronlx2.zip .. mricron-0.20120505.1~dfsg.1.orig/_gtscript.bat0000664000175000017500000000176011266106774020354 0ustar michaelmichaelchmod 777 ./_xclean.bat ./_xclean.bat cp ./common/notgui.inc ./common/isgui.inc lazbuild ./dcm2nii/dcm2nii.lpr cp ./dcm2nii/dcm2nii ../gtk1/mricron/dcm2nii cp ./dcm2nii/dcm2nii ../gtk2/mricron/dcm2nii cp ./dcm2nii/dcm2nii ../qt/mricron/dcm2nii cp ./common/gui.inc ./common/isgui.inc ./_xclean.bat lazbuild ./mricron.lpr --ws=gtk lazbuild ./npm/npm.lpr --ws=gtk lazbuild ./dcm2nii/dcm2niigui.lpr --ws=gtk cp ./mricron ../gtk1/mricron/mricron cp ./npm/npm ../gtk1/mricron/npm cp ./dcm2nii/dcm2niigui ../gtk1/mricron/dcm2niigui ./_xclean.bat lazbuild ./mricron.lpr --ws=gtk2 lazbuild ./npm/npm.lpr --ws=gtk2 lazbuild ./dcm2nii/dcm2niigui.lpr --ws=gtk2 cp ./mricron ../gtk2/mricron/mricron cp ./npm/npm ../gtk2/mricron/npm cp ./dcm2nii/dcm2niigui ../gtk2/mricron/dcm2niigui ./_xclean.bat lazbuild ./mricron.lpr --ws=qt lazbuild ./npm/npm.lpr --ws=qt lazbuild ./dcm2nii/dcm2niigui.lpr --ws=qt cp ./mricron ../qt/mricron/mricron cp ./npm/npm ../qt/mricron/npm cp ./dcm2nii/dcm2niigui ../qt/mricron/dcm2niigui mricron-0.20120505.1~dfsg.1.orig/_gtall64.bat0000664000175000017500000000021211423246232017746 0ustar michaelmichael cd ~/mricron chmod 777 ./_gtscript.bat ./_gtscript.bat cd ~/gtk1 zip -r mricronlx641 mricron cd ~/gtk2 zip -r mricronlx642 mricron mricron-0.20120505.1~dfsg.1.orig/_gtall.bat0000664000175000017500000000025411265622702017606 0ustar michaelmichael cd ~/mricron chmod 777 ./_gtscript.bat ./_gtscript.bat cd ~/gtk1 zip -r mricronlx mricron mv mricronlx.zip .. cd ~/gtk2 zip -r mricronlx2 mricron mv mricronlx2.zip .. mricron-0.20120505.1~dfsg.1.orig/_delphizip.bat0000664000175000017500000000056411417300070020465 0ustar michaelmichaeldel c:\mricrond.zip del c:\mricron\*.ini c:\Progra~1\7-Zip\7z a -tzip c:\mricrond.zip c:\mricron del Z:\html\temp\mricron\mricrond.zip copy c:\mricrond.zip Z:\html\temp\mricron\mricrond.zip call _clean.bat del Z:\html\temp\mricron\mricron.zip del mricron.zip c:\Progra~1\7-Zip\7z a -tzip c:\mricron.zip c:\pas\mricron copy c:\mricron.zip Z:\html\temp\mricron\mricron.zipmricron-0.20120505.1~dfsg.1.orig/_delphi.bat0000664000175000017500000000164011633672562017760 0ustar michaelmichaeldel c:\mricron\*.ini call _clean.bat copy .\common\notgui.inc .\common\isgui.inc cd .\dcm2nii C:\PROGRA~2\BORLAND\DELPHI7\BIN\dcc32 -U..\..\d4\RX\Units -U..\delphionly -CC -B dcm2nii.dpr c:\strip dcm2nii.exe copy dcm2nii.exe c:\mricron cd .. call _clean.bat copy .\common\gui.inc .\common\isgui.inc cd .\npm C:\PROGRA~2\BORLAND\DELPHI7\BIN\dcc32 -U..\delphionly -B npm.dpr c:\strip npm.exe copy npm.exe c:\mricron cd .. cd .\dcm2nii C:\PROGRA~2\BORLAND\DELPHI7\BIN\dcc32 -U..\delphionly;C:\pas\d7\rx275d7\Units -B dcm2niigui.dpr c:\strip dcm2niigui.exe copy dcm2niigui.exe c:\mricron cd .. call _clean.bat cd c:\pas\delphi\niftiview7 C:\PROGRA~2\BORLAND\DELPHI7\BIN\dcc32 -UC:\pas\d7\rx275d7\Units;C:\PROGRA~2\PngComponents\Source -B mricron.dpr c:\strip c:\pas\delphi\niftiview7\mricron.exe copy c:\pas\delphi\niftiview7\mricron.exe c:\mricron\ "C:\Program Files\NSIS2\makensis" "C:\Program Files\NSIS2\mricron.nsi" mricron-0.20120505.1~dfsg.1.orig/_clean.bat0000664000175000017500000000031611326435212017560 0ustar michaelmichaeldel /S *.o del /S *.ppu del /S *.bak del /S *.~* del /S *.dcu del /S *.dsk del /S *.obj del /S *.hpp del /S *.ddp del /S *.mps del /S *.mpt del /S *.exe del /S *.old rmdir /S /Q mricron.app mricron-0.20120505.1~dfsg.1.orig/_build.bat0000664000175000017500000000044710617642042017605 0ustar michaelmichaelC:\lazarus\pp\bin\i386-win32\strip --verbose --strip-all "C:\lazarus\mricron\mricron.exe" copy "C:\lazarus\mricron\mricron.exe" C:\mricron\mricron.exe copy "C:\lazarus\mricron\dcm2nii\dcm2nii.exe" C:\mricron\dcm2nii.exe "C:\Program Files\NSIS2\makensis" "C:\Program Files\NSIS2\mricron.nsi" mricron-0.20120505.1~dfsg.1.orig/zconf.inc0000664000175000017500000000127410251352300017455 0ustar michaelmichael{ -------------------------------------------------------------------- } {$DEFINE MAX_MATCH_IS_258} { Compile with -DMAXSEG_64K if the alloc function cannot allocate more than 64k bytes at a time (needed on systems with 16-bit int). } {- $DEFINE MAXSEG_64K} {$IFNDEF WIN32} {$DEFINE UNALIGNED_OK} { requires SizeOf(ush) = 2 ! } {$ENDIF} {$UNDEF DYNAMIC_CRC_TABLE} {$UNDEF FASTEST} {$define patch112} { apply patch from the zlib home page } { -------------------------------------------------------------------- } {$IFDEF FPC} {$DEFINE Use32} {$UNDEF DPMI} {$UNDEF MSDOS} {$UNDEF UNALIGNED_OK} { requires SizeOf(ush) = 2 ! } {$UNDEF MAXSEG_64K} {$ENDIF} mricron-0.20120505.1~dfsg.1.orig/yokesharemem.pas0000664000175000017500000000756411450351544021064 0ustar michaelmichaelunit yokesharemem; {$mode objfpc}{$H+} interface //http://community.freepascal.org:10000/docs-html/rtl/ipc/shmctl // call CreateSharedMem when an application is created and CloseSharedMem when a program is closed // along with NInstances, these functions return the number of concurrent instances. // if a program crashes, the values may not be reset until the next reboot uses forms, classes, {$IFDEF UNIX} BaseUnix, SysUtils, ipc,dialogs; {$ELSE} winmemmap; {$ENDIF} function CreateSharedMem (lApp: TComponent): integer; //returns number of instances after including this one... function CloseSharedMem: integer; //returns number of instances after after this one closes function NInstances: integer; //returns number of instances function SetShareFloats(lXmm,lYmm,lZmm: single): boolean; function GetShareFloats(var lXmm,lYmm,lZmm: single): boolean; implementation type TShareMem = record Instances: integer; Xmm,Ymm,Zmm: single; end; PIntBuffer = ^TShareMem; var gShareIntBuf: PIntBuffer; gPrevShare : TShareMem; function NInstances: integer; begin result := gShareIntBuf^.Instances; end; function SetShareFloats(lXmm,lYmm,lZmm: single): boolean; begin gShareIntBuf^.Xmm := lXmm; gShareIntBuf^.Ymm := lYmm; gShareIntBuf^.Zmm := lZmm; gPrevShare := gShareIntBuf^; end; function GetShareFloats(var lXmm,lYmm,lZmm: single): boolean; begin lXmm := gShareIntBuf^.Xmm; lYmm := gShareIntBuf^.Ymm; lZmm := gShareIntBuf^.Zmm; if (lXmm = gPrevShare.Xmm) and (lYmm = gPrevShare.Ymm) and(lZmm = gPrevShare.Zmm) then result := false else result := true; gPrevShare := gShareIntBuf^; end; {$IFNDEF UNIX} //Windows implementation var EMemMap : TEMemMap; function CreateSharedMem (lApp: TComponent): integer; //returns number of instances after including this one... var I: integer; begin EMemMap:=TEMemMap.Create(lApp{Self}); EMemMap.CreateMutex('MRICROMUTEX3'); If NOT EMemMap.MapExisting('MRICROMAP3',SizeOf(TShareMem)) then begin gPrevShare.Xmm:=0; gPrevShare.Ymm:=0; gPrevShare.Zmm:=0; gPrevShare.Instances:=0; If NOT EMemMap.CreateMemMap('MRICROMAP2',SizeOf(TShareMem),gPrevShare) then EMemMap.RaiseMappingException; gShareIntBuf := PINtBuffer(EMemMap.MemMap); end else gShareIntBuf^.Instances := gShareIntBuf^.Instances + 1; end; function CloseSharedMem: integer; //returns number of instances after after this one closesb begin EMemMap.Free; end; {$ELSE} var fshmid: longint; segptr : Pointer; function CreateSharedMem (lApp: TComponent): integer; //returns number of instances after including this one... var key : Tkey; new: boolean; const ftokpath = '.'#0; begin key := ftok (pchar(@ftokpath[1]),ord('S')); fshmid := shmget(key,SizeOf(TShareMem) {segsize},IPC_CREAT or IPC_EXCL or 438); If fshmid=-1 then begin //showmessage('Loading existing memory.'); new := false; fshmid := shmget(key,SizeOf(TShareMem){segsize},0); If fshmid = -1 then begin showmessage ('Shared memory : Error !'+inttostr(fpgeterrno)); halt(1); end end else begin new := true; //showmessage ('Creating new shared memory segment.'); end; segptr:=shmat(fshmid,nil,0); gShareIntBuf := segptr; if new then gShareIntBuf^.Instances := 1 else gShareIntBuf^.Instances :=gShareIntBuf^.Instances + 1; result := gShareIntBuf^.Instances; end; function CloseSharedMem: integer; //returns number of instances after this application quits begin gShareIntBuf^.Instances := gShareIntBuf^.Instances -1; result := gShareIntBuf^.Instances; if Assigned (segptr) then shmdt (segptr); if result < 1 then begin //last running instance - close shared memory if shmctl (FShmId, IPC_RMID, nil) = -1 then Showmessage('unable to release shared memory'); end; end; {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/xfmri3.bat0000664000175000017500000000017110426701072017546 0ustar michaelmichael./mricron ./templates/aal.nii.gz -o ./example/attention.nii.gz -c -0 -l 1.96 -h 5 -z -b 40 -t 50 -r ./example/fmri3r.inimricron-0.20120505.1~dfsg.1.orig/xfmri2.bat0000664000175000017500000000027410426701010017541 0ustar michaelmichael./mricron ./templates/ch2.nii.gz -s 3 -l 0 -h 140 -c pink -o ./templates/ch2bet.nii.gz -c -0 -l 30 -h 200 -o ./example/attention.nii.gz -l 1.96 -h 5 -z -b 40 -t 50 -r ./example/fmri2r.inimricron-0.20120505.1~dfsg.1.orig/xfmri.bat0000664000175000017500000000027410426700736017475 0ustar michaelmichael./mricron ./templates/ch2bet.nii.gz -s 3 -c -0 -l 20 -h 140 -b 40 -t -1 -r ./example/fmrir.ini -o ./example/saccades.nii.gz -l 1.96 -h 5 -z -o ./example/attention.nii.gz -l 1.96 -h 5 -z -xmricron-0.20120505.1~dfsg.1.orig/xcut.bat0000664000175000017500000000012310426700640017316 0ustar michaelmichael./mricron ./templates/ch2bet.nii.gz -s 3 -c pink -l 40 -h 120 -r ./example/cutr.inimricron-0.20120505.1~dfsg.1.orig/xclip.bat0000664000175000017500000000013010426664506017462 0ustar michaelmichael./mricron ./templates/ch2bet.nii.gz -s 3 -c pink -l 40 -h 120 -r ./example/clipnearr.inimricron-0.20120505.1~dfsg.1.orig/winres.res0000664000175000017500000002243210617641306017701 0ustar michaelmichael џџџџЈ џџџџ( @ €ќќќ ќќќќќ$"ќ|zќќќќ ќќќќќќќќ0*ќjaќќќќ+ ќˆќ‡ќќќќќќќ ќ/)ќќ ќќ>ќщќџќџ ќыќšќќќЄЖќќќќќќќБ ќџќџќљќњћџћџќ@љїњќ ќќќ42ќ42ќ43ќџџЄЖќќќќќmќтќџќќќ§ќџќўќќќќћЯџџњќ ќќќќќќќќDBќDBќDCќTfќќІИќ`jќќ‰ќуќџќџќќќџќўќџћџћўњџ/ўљ}И”џ“љќ “ќNќќќџџќќќќќDLќDLќDNќќAќ=#ќk#(ќхќџќџќћќ§ќўќџќўќџGќџњџећџђєџџ(џњџћџќџќќќЬќќћќќ‚ќ™ќ˜ќ› ќ™ ќоќџќџќџќџќћќ§ќџќўќџ#ќџ†ћџаћџџњџџјўџџџџўјњћњќњќњќ§ќџќеќ §Ј7ќщ^ќџqќџ{ќџƒќџ|ќџwќџmќћeќћUќћ<ќўќўќџќўќџ…ќџэћџџќџџњџјїџљџџњ‹џћџћџќџћўќўќџќћќџќaряџџћџџќћџћљџќњџќњџќљџќќџќџџќўџќџџќџеќџƒќџ ќџУћџџћџўќџјљџљњџћџџќ•џћџќџќџќџќџќџќўќџќќќџџЂ§§ќўњћўћќџћћўћќџћќџћќџњќџњќџњќџќќџџћџ џќџРЛћџџ њџіјџњјџћџџќљџћ€џќџќџќџќџќџќџќџќџќўќџќћћ}ћ§№ўўќџ§ћў§ќџўћџўќџўќџ§ћџ§ќџўћџ§ћџћћџrїљџџџјџїџџћџџќџџћЭџќIџќџќџќџќџќџќџќџќџќџќўќџќў§ЁўІџўџџўѕџўњџўќџўћџўќџўћџўњџўјџ§њџўўџУћџџ§ќџџјихџћЖџћaџќџќџќџќџќџќџќџќџќџќџќџќџќџќџ ў‘ўљўеўўџўўћўўїџўїџўїџўњџўџџўџџўџџ*§№џшќЉџўџZџњє(џќџќџќџќџќџќџќџќџќџќџќџќџќўќўќќќєўўŽў$ќўАњўјџўџџўџџўџџўўџўмџўБџўoџ>ў џўќџљџџњѓџћџќџќџќџќџќџќџќџќџќџќџќўќџќќќџќ/ўў~ўџўљў7ўўYўўeџўWџў@џўџўџўџMўџўћџїџџћсџќџќџќџќџќџќџќџќџќџќџќџќџќћќџќВќўўўŸўџўќўџўџўџўџўџўџўџdўџўћџїџџќНџќџќџќџќџќџќџќџќџќџќџќўќўќљќєќLќ ў  ў ўўєўћўўўўўџўџўџўџўџ{§џџњџјўџћЄџќџќџќџќџќџќџќџќџќџќўќџќћќџќЭќќ)ў)ўўў”ўўўјўџўџўџўџўџўџŸўџўљџјўџќџќџќџќџќџќџќџќџќўќџќўќїќ џќ,.мќ+-!ќ&(ќ,ў,"ў" ў ў $ ў ђўћў§ўўўўўџўџ§џЯ§џџњџљўџќOџќџќџќџќџќџќўќџќџќўќќќџќ мќ "ќ "ќvxќ#ў#ў ў .ў.›ўџўљўџўџўџўџ§џёњџў§џћкџќџќџќџќџќџќўќџќ§ќњќџќўќ™ќќќќuwќўў ў ўў›ўџўјўўўў§ўgўџ§њџњџџњyџќџќџќўќџќ§ќ§ќћќџќ џќфќ[ќќќќќZ\ўъўъўўўŸўџўј§§ўџВћўџџџїаџћ џќўќџќћќњќџќџќџќнќ„ќќprќќќќўўўўў›ўџўџ+ћћёўќўђќњ;ќќќќќќќќџќ џќэќрќgќќќџџџџўўў ў ў§кќџМјџўcџљџћ џќџќџќ ГќŽќ'ќќќ ќќўўў'ў'ў!-ќ'џ5kы<4џ/5ј 5њ5ќ4ќ5ќќќќќќ ќќ&ў&ў!,ќ'џnы;џ.ј њќќќќќќќўў §џё,џ5#љ ћќќќќќџџџџџџџџџџџџџџчџџџСџџџџџќџџ№џРР€€Ррр№№ј?ќџўџџџџџџџџџџџџџџџџџџџџџџџˆ џџџџ(0 ` ќќќ ќќќќќќќ ќќќќќќ$"ќЎЈќќќќќ ќKќCќќќќ$&ќџџќќеЬќ ќ ќ ќ%ќ—ќџћџћМќј ђњ ќќќ42ќ42ќ64ќ*-ќџџќќ''ќ*,ќќV ќъќџќљќјќџћџџњ ќќќ‹‘ќ‹Mќ"ќ0ќ1ќ3ќ)/ќYbќBGќќUќЭќџќџќћћџћ§ћћўюUФ[џYљ Zќќќџџ3ќ4 ќ6$ќ"ќa++ќ`%(ќЭќџќџќћћ§ћџ'ќўpјџКўџшцџџџљџћџќъќ lќ  ќNћ‰)ќо 0ћн 0ќо ,ќёќџќџќџќќќ§ћў7ќўЉќў№јџџњўџїџџPўљћћћќњќџќ џќC ­ѕџдћџшќџіћџѕќџѓќџяќњъќњлћќ›ћў0ћўzћўћњџџіџ§џџїћџљ\џњџћџќўћџќ§ќ§ќ ьџЩџџќњџћ§џќќџћ§џќ§џћџџћўџћџџњџgёјџџ>љџњўџїџџћфџћNџћџћџќџќџќўќџќўќџњlфћюџќќџќјџќћџќћџќњџќјџћљџіџџтџџџ§Уџџљэџќ•џћ џћџќџќџќџќџќўќџќўќџ §Аўvљўџўўџўўўўўџџўџџ§џџўџџGќшџ§ўЁџћ№Yџћџћџќџќџќџќџќџќџќџќўќџќіў ўдў`џўбќўюџўяџўжџў џ§^џfќџўџџјяџћџќџќџќџќџќџќџќўќўќќќ§ќOў ў {ўќўћўўўўўџўџ§џ|ћџўџџїжџћџќџќџќџќџќџќўќџќћќ§ќОќўўўПўџўћўџўџўџўџ’њџўўџјКџќџќџќџќџќџќўќџќ§ќљќџќBќўўўDўћўљўўўў§џ§џЕљџў§џљšџћџќџќџќўќўќўќќќџќ џќ/1xќ.0ќ02ПўПўўўТўџўњўџўў §џрћџџџџњYџќџќўќўќўќќќќќџќяќxќ ќ ќџџџџў ў  ў ўжўџ§њ§џ@ћўћџўњйўњ џќўќ§ќћќќќџќ џќЦќ ќ ќ џџџџўўўўўзўџќћšќћџџћїOћћћќќќџќџќџќЦќ"$MќќJLќJLќќўўўўў §ПћџІќ џў€ џјџћџќџќвќ ŒќKќ ќ!#ќќўўў…ў…џџ ERѓ Pџ"OјPњPќJќ ќќќќ!#ќўўŠўŠџџ Qѓ!џ#ј њќќ ќќќ|ў|џ _ѕџ1 љ ћќќќќџџџџџџџџџџјџр?џ€ќ€€€Ррр№јќџџOџџџџџџџџџџh џџџџ(  @ќќ ќќ ќќќќќ$&ќ48ќќќ ќќ ћќ ћ ыџі ќќ!ќќќ7<ќќќќ ќYќчћрћAџџі ќџќќ-ќ*3ќ'.ќќ: ћЌћџќџњџ џЭ,л*b›*ѕ ќћ%ћ$ ќ3 ћA ќ‚'ќ­ћџќџћќIі§џ§лЮџџџџџњ КќMOuњЭ’ћјЁћџЈќџžћџˆћџOњў0јћЦїўџџўџрџџ%§ћўљќќџќЬџкџџўџџј§џј§џјњџљќџџўцŠџўџџўјОџј"џњўћўќџћќќџњAгњз§њџўњџџњџўјџџn§рџџ№›џѕ Lџќџќџћџќџќўќўќџ§ 5ў#юўŒўўЇ§§џќNџ•ўџ§ъџїџћџќџќўќўќћќџќ^ўўvўџўњ§џћўЉўџўгџјџћўќўќўќљќџќСќ ў ў ўцўўўњљџЫ§ўџБўљўќ§ќћќќќџќ еќ+-ќ<>ўў ў L§§§ў#ћљѓџћ§Sћњќќџќџќћќ”ќќќўўў ўPћїdўџџ џјџћџќ хќЂќ2ќ ќќќў!ў!џ§ (Pњkў*iљjћPќ ќќ56ќќџџќўўџќ Xћ џ1љћ ќќќ13ќќўџќ Tћ џD љ ћ ќќќ(*џџџџџў№€€Рррјџџџџ* џџџџEmpty0.џџMAINICON Јˆ ht џџџџt4VS_VERSION_INFOНяўвStringFileInfoЎ040904E4>CompanyNamewww.mricro.com0FileVersion0.7.5.0*FileDescription0InternalNamemricron&LegalCopyright*LegalTrademarks*OriginalFilename"ProductName&ProductVersionDVarFileInfo$Translation фŸ џџџџ A program made under Lazarus mricron-0.20120505.1~dfsg.1.orig/WINRES.or0000664000175000017500000002321410670044624017226 0ustar michaelmichaelLv&.rsrcє%<0&@PгрF8€Ј€и€€8€грF`€x€€грF|грFŒгрFœгрFР€грFЌгрFh€№€грFМгрF €грFЬгрFP€грFмMAINICONьЈ”ˆ h„ *А 0р tT#Ÿ( @ €ќќќ ќќќќќ$"ќ|zќќќќ ќќќќќќќќ0*ќjaќќќќ+ ќˆќ‡ќќќќќќќ ќ/)ќќ ќќ>ќщќџќџ ќыќšќќќЄЖќќќќќќќБ ќџќџќљќњћџћџќ@љїњќ ќќќ42ќ42ќ43ќџџЄЖќќќќќmќтќџќќќ§ќџќўќќќќћЯџџњќ ќќќќќќќќDBќDBќDCќTfќќІИќ`jќќ‰ќуќџќџќќќџќўќџћџћўњџ/ўљ}И”џ“љќ “ќNќќќџџќќќќќDLќDLќDNќќAќ=#ќk#(ќхќџќџќћќ§ќўќџќўќџGќџњџећџђєџџ(џњџћџќџќќќЬќќћќќ‚ќ™ќ˜ќ› ќ™ ќоќџќџќџќџќћќ§ќџќўќџ#ќџ†ћџаћџџњџџјўџџџџўјњћњќњќњќ§ќџќеќ §Ј7ќщ^ќџqќџ{ќџƒќџ|ќџwќџmќћeќћUќћ<ќўќўќџќўќџ…ќџэћџџќџџњџјїџљџџњ‹џћџћџќџћўќўќџќћќџќaряџџћџџќћџћљџќњџќњџќљџќќџќџџќўџќџџќџеќџƒќџ ќџУћџџћџўќџјљџљњџћџџќ•џћџќџќџќџќџќџќўќџќќќџџЂ§§ќўњћўћќџћћўћќџћќџћќџњќџњќџњќџќќџџћџ џќџРЛћџџ њџіјџњјџћџџќљџћ€џќџќџќџќџќџќџќџќџќўќџќћћ}ћ§№ўўќџ§ћў§ќџўћџўќџўќџ§ћџ§ќџўћџ§ћџћћџrїљџџџјџїџџћџџќџџћЭџќIџќџќџќџќџќџќџќџќџќџќўќџќў§ЁўІџўџџўѕџўњџўќџўћџўќџўћџўњџўјџ§њџўўџУћџџ§ќџџјихџћЖџћaџќџќџќџќџќџќџќџќџќџќџќџќџќџќџ ў‘ўљўеўўџўўћўўїџўїџўїџўњџўџџўџџўџџ*§№џшќЉџўџZџњє(џќџќџќџќџќџќџќџќџќџќџќџќџќўќўќќќєўўŽў$ќўАњўјџўџџўџџўџџўўџўмџўБџўoџ>ў џўќџљџџњѓџћџќџќџќџќџќџќџќџќџќџќџќўќџќќќџќ/ўў~ўџўљў7ўўYўўeџўWџў@џўџўџўџMўџўћџїџџћсџќџќџќџќџќџќџќџќџќџќџќџќџќћќџќВќўўўŸўџўќўџўџўџўџўџўџўџdўџўћџїџџќНџќџќџќџќџќџќџќџќџќџќџќўќўќљќєќLќ ў  ў ўўєўћўўўўўџўџўџўџўџ{§џџњџјўџћЄџќџќџќџќџќџќџќџќџќџќўќџќћќџќЭќќ)ў)ўўў”ўўўјўџўџўџўџўџўџŸўџўљџјўџќџќџќџќџќџќџќџќџќўќџќўќїќ џќ,.мќ+-!ќ&(ќ,ў,"ў" ў ў $ ў ђўћў§ўўўўўџўџ§џЯ§џџњџљўџќOџќџќџќџќџќџќўќџќџќўќќќџќ мќ "ќ "ќvxќ#ў#ў ў .ў.›ўџўљўџўџўџўџ§џёњџў§џћкџќџќџќџќџќџќўќџќ§ќњќџќўќ™ќќќќuwќўў ў ўў›ўџўјўўўў§ўgўџ§њџњџџњyџќџќџќўќџќ§ќ§ќћќџќ џќфќ[ќќќќќZ\ўъўъўўўŸўџўј§§ўџВћўџџџїаџћ џќўќџќћќњќџќџќџќнќ„ќќprќќќќўўўўў›ўџўџ+ћћёўќўђќњ;ќќќќќќќќџќ џќэќрќgќќќџџџџўўў ў ў§кќџМјџўcџљџћ џќџќџќ ГќŽќ'ќќќ ќќўўў'ў'ў!-ќ'џ5kы<4џ/5ј 5њ5ќ4ќ5ќќќќќќ ќќ&ў&ў!,ќ'џnы;џ.ј њќќќќќќќўў §џё,џ5#љ ћќќќќќџџџџџџџџџџџџџџчџџџСџџџџџќџџ№џРР€€Ррр№№ј?ќџўџџџџџџџџџџџџџџџџџџџџџџџ(0 ` ќќќ ќќќќќќќ ќќќќќќ$"ќЎЈќќќќќ ќKќCќќќќ$&ќџџќќеЬќ ќ ќ ќ%ќ—ќџћџћМќј ђњ ќќќ42ќ42ќ64ќ*-ќџџќќ''ќ*,ќќV ќъќџќљќјќџћџџњ ќќќ‹‘ќ‹Mќ"ќ0ќ1ќ3ќ)/ќYbќBGќќUќЭќџќџќћћџћ§ћћўюUФ[џYљ Zќќќџџ3ќ4 ќ6$ќ"ќa++ќ`%(ќЭќџќџќћћ§ћџ'ќўpјџКўџшцџџџљџћџќъќ lќ  ќNћ‰)ќо 0ћн 0ќо ,ќёќџќџќџќќќ§ћў7ќўЉќў№јџџњўџїџџPўљћћћќњќџќ џќC ­ѕџдћџшќџіћџѕќџѓќџяќњъќњлћќ›ћў0ћўzћўћњџџіџ§џџїћџљ\џњџћџќўћџќ§ќ§ќ ьџЩџџќњџћ§џќќџћ§џќ§џћџџћўџћџџњџgёјџџ>љџњўџїџџћфџћNџћџћџќџќџќўќџќўќџњlфћюџќќџќјџќћџќћџќњџќјџћљџіџџтџџџ§Уџџљэџќ•џћ џћџќџќџќџќџќўќџќўќџ §Аўvљўџўўџўўўўўџџўџџ§џџўџџGќшџ§ўЁџћ№Yџћџћџќџќџќџќџќџќџќџќўќџќіў ўдў`џўбќўюџўяџўжџў џ§^џfќџўџџјяџћџќџќџќџќџќџќџќўќўќќќ§ќOў ў {ўќўћўўўўўџўџ§џ|ћџўџџїжџћџќџќџќџќџќџќўќџќћќ§ќОќўўўПўџўћўџўџўџўџ’њџўўџјКџќџќџќџќџќџќўќџќ§ќљќџќBќўўўDўћўљўўўў§џ§џЕљџў§џљšџћџќџќџќўќўќўќќќџќ џќ/1xќ.0ќ02ПўПўўўТўџўњўџўў §џрћџџџџњYџќџќўќўќўќќќќќџќяќxќ ќ ќџџџџў ў  ў ўжўџ§њ§џ@ћўћџўњйўњ џќўќ§ќћќќќџќ џќЦќ ќ ќ џџџџўўўўўзўџќћšќћџџћїOћћћќќќџќџќџќЦќ"$MќќJLќJLќќўўўўў §ПћџІќ џў€ џјџћџќџќвќ ŒќKќ ќ!#ќќўўў…ў…џџ ERѓ Pџ"OјPњPќJќ ќќќќ!#ќўўŠўŠџџ Qѓ!џ#ј њќќ ќќќ|ў|џ _ѕџ1 љ ћќќќќџџџџџџџџџџјџр?џ€ќ€€€Ррр№јќџџOџџџџџџџџџџ(  @ќќ ќќ ќќќќќ$&ќ48ќќќ ќќ ћќ ћ ыџі ќќ!ќќќ7<ќќќќ ќYќчћрћAџџі ќџќќ-ќ*3ќ'.ќќ: ћЌћџќџњџ џЭ,л*b›*ѕ ќћ%ћ$ ќ3 ћA ќ‚'ќ­ћџќџћќIі§џ§лЮџџџџџњ КќMOuњЭ’ћјЁћџЈќџžћџˆћџOњў0јћЦїўџџўџрџџ%§ћўљќќџќЬџкџџўџџј§џј§џјњџљќџџўцŠџўџџўјОџј"џњўћўќџћќќџњAгњз§њџўњџџњџўјџџn§рџџ№›џѕ Lџќџќџћџќџќўќўќџ§ 5ў#юўŒўўЇ§§џќNџ•ўџ§ъџїџћџќџќўќўќћќџќ^ўўvўџўњ§џћўЉўџўгџјџћўќўќўќљќџќСќ ў ў ўцўўўњљџЫ§ўџБўљўќ§ќћќќќџќ еќ+-ќ<>ўў ў L§§§ў#ћљѓџћ§Sћњќќџќџќћќ”ќќќўўў ўPћїdўџџ џјџћџќ хќЂќ2ќ ќќќў!ў!џ§ (Pњkў*iљjћPќ ќќ56ќќџџќўўџќ Xћ џ1љћ ќќќ13ќќўџќ Tћ џD љ ћ ќќќ(*џџџџџў№€€РррјџџџџEmpty Јˆ ht4VS_VERSION_INFOНяўвStringFileInfoЎ040904E4>CompanyNamewww.mricro.com0FileVersion0.7.5.0*FileDescription0InternalNamemricron&LegalCopyright*LegalTrademarks*OriginalFilename"ProductName&ProductVersionDVarFileInfo$Translation ф A program made under Lazarus |ŒœЌМЬм.rsrcmricron-0.20120505.1~dfsg.1.orig/winmemmap.pas0000664000175000017500000002107211436451036020354 0ustar michaelmichaelunit winmemmap; {$H+} interface { This Unit implements an interface to Win32 memory mapped files. It can be used to map data simply residing in memory or data residing in a file. The data can be fully mapped into the processes address space or chunks can be mapped. It also provides capabilities for processes to synchronize via mutexes. When mapping sections of the memory, you must be aware that the Win32 memory mapped file interface requires that when you are requesting an offset into the memory region, this offset must be a multiple of the system's memory allocation granularity (I've called it PageSize). At this point it is 64K. This is not a concern when you are mapping anything less than 64K. However, to map anything > 64K the total memory size mapped must be a multiple of 64K or you will not have access to the memorysize MOD 64K bytes left over. Basically there are five rules to be successful when using these routines: 1. Mapname must be unique for each different case you use these objects (MyMap1 for case 1, MyMap2 for case 2 etc.).However, each process using the same memory map MUST use the same MapName. 2. Call MapExisting before CreateMemMap or FCreateMemMap. If another process has already started the mapping, all you want to do is map to the existing map. ie. If NOT MapExisting then CreateMemMap. 3. If your processes are going to write to the mapped memory, it is suggested you use the mutex stuff. 4. Pay heed to the warning above concerning seeking offsets into the mapped memory. Whenever you call the seek function, always check for an error. Errors in mapping to the file will result in the Memmap pointer being Nil. 5. You MUST call LeaveCriticalSection after calling EnterCriticalSection or you will lock other processes wishing to use the map into an infinite wait state. Always use a Try..Finally block. } Uses Classes,Windows; Const hMemMap = $FFFFFFFF; Type //Map to memory TEMemMap = Class(TComponent) Private FhFile : THandle; //File handle, hMemMap when simple memory FhMap : THandle; //Mapping handle FMap : Pointer; //Memory Pointer FMapSize : Cardinal; //Mapping Page Size FMemSize : Cardinal; //Maximum size allocated, >=FileSize when a file FPageSize : Cardinal; //Minimum System allocation size FMaxSeeks : Cardinal; //Maximum seeks available,(FMemSize DIV PageSize)-1 FMapError : Integer; //Error returned FhMutex : THandle; //Mutex handle for sharing FInMutex : Boolean; //Internal flag Function SetMapError : Boolean; Procedure SetMemSize(Size : Cardinal); Public Constructor Create(Aowner : TComponent); Override; Destructor Destroy; Override; //Create a mutex for sychronizing access Function CreateMutex(Const MutexName : String) : Boolean; //Use the mutex Procedure EnterCriticalSection; //Release the mutex Procedure LeaveCriticalSection; //Map to existing memory map Function MapExisting(Const MapName : String; Const MapSize : Cardinal) : Boolean;Virtual; //Create a new memory map Function CreateMemMap(Const MapName : String; Const MapSize : Cardinal; Const MapData ) : Boolean;Virtual; //seek to an offset in the memory map Function Seek(Const OffSet : Cardinal) : Boolean; //duh? Procedure RaiseMappingException;Virtual; Property MemMap : Pointer Read FMap; //The mapped memory Property MapError : Integer Read FMapError Write FMapError; Property MemSize : Cardinal Read FMemSize Write SetMemSize; //Memory size to allocate Property PageSize : Cardinal Read FPageSize; //system returned page size Property MaxSeeks : Cardinal Read FMaxSeeks; //maximum seeks allowed end; //map to a file TEFileMap = Class(TEMemMap) Public Function FCreateMemMap(Const Filename : String; Const MapName : String; Const MapSize : Cardinal) : Boolean; Function FlushFileView : Boolean; end; implementation Uses SysUtils; Type EMappingException = class(Exception); Constructor TEMemMap.Create(AOwner : TComponent); Var SysInfo : TSystemInfo; begin Inherited Create(AOwner); FhFile:=hMemMap; GetSystemInfo(SysInfo); FPageSize:=SysInfo.dwAllocationGranularity; end; Destructor TEMemmap.Destroy; begin LeaveCriticalSection; If FhMutex<>0 then CloseHandle(FhMutex); If FMap<>Nil then UnMapViewOfFile(FMap); If FHMap<>0 then CloseHandle(FHMap); Inherited Destroy; end; Function TEMemMap.CreateMutex(Const MutexName : String) : Boolean; begin If FhMutex=0 then FhMutex:=Windows.CreateMutex(Nil,False,PChar(MutexName)); If FhMutex=0 then Result:=SetMapError else Result:=True; end; Procedure TEMemMap.EnterCriticalSection; begin If (NOT FInMutex) AND (FhMutex>0) then begin WaitForSingleObject(FhMutex,INFINITE); FInMutex:=True; end; end; Procedure TEMemMap.LeaveCriticalSection; begin If FInMutex AND (FhMutex>0) then begin ReleaseMutex(FhMutex); FInMutex:=False; end; end; Function TEMemMap.SetMapError : Boolean; begin FMapError:=GetLastError; Result:=False; end; Procedure TEMemMap.RaiseMappingException; Var TError : Integer; begin If FMapError<>0 then begin LeaveCriticalSection; TError:=FMapError; FMapError:=0; Raise EMappingException.Create('Memory Mapping Error #'+IntToStr(TError)); end; end; Procedure TEMemMap.SetMemSize(Size : Cardinal); begin FMemSize:=Size; If FMemSize>PageSize then FMaxSeeks:=(FMemSize DIV PageSize)-1 else FMaxSeeks:=0; end; //map to an existing memory map described by MapName Function TEMemMap.MapExisting(Const MapName : String; Const MapSize : Cardinal) : Boolean; begin FMapSize:=MapSize; FMap:=Nil; FhMap:=OpenFileMapping(FILE_MAP_WRITE,BOOL(True),PChar(MapName)); If FhMap<>0 then begin FMap:=MapViewOfFile(FhMap,FILE_MAP_WRITE,0,0,MapSize); If FMap=Nil then begin CloseHandle(FHMap); FHMap:=0; SetMapError; end; end; Result:=FMap<>Nil; end; //Create a new memory mapping Function TEMemMap.CreateMemMap(Const MapName : String; Const MapSize : Cardinal; Const MapData ) : Boolean; begin If FMemSize=0 then FMemSize:=MapSize; FhMap:=CreateFileMapping(FhFile,nil,PAGE_READWRITE,0,FMemSize,PChar(MapName)); If FhMap<>0 then begin FMap:=MapViewOfFile(FhMap,FILE_MAP_WRITE,0,0,MapSize); If FMap<>Nil then begin If fHFile=hMemMap then begin EnterCriticalSection; Try Move(MapData,FMap^,MapSize); Finally LeaveCriticalSection; end; end; Result:=True; end else Result:=SetMapError; end else Result:=SetMapError; end; //seek to a different position in map (0..MaxSeeks) Function TEMemMap.Seek(Const OffSet : Cardinal) : Boolean; begin Result:=True; If NOT UnMapViewOfFile(FMap) then Result:=SetMapError else begin FMap:=MapViewOfFile(FhMap,FILE_MAP_WRITE,0,OffSet*PageSize,FMapSize); If FMap=Nil then Result:=SetMapError; end; end; //Create a file mapping Function TEFileMap.FCreateMemMap(Const Filename : String; Const MapName : String; Const MapSize : Cardinal) : Boolean; Var TInt : Cardinal; begin FHFile:=CreateFile(PChar(FileName),GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE,NIl,OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS,0); If FhFile<>0 then begin Try Result:=CreateMemMap(MapName,MapSize,TInt); Finally CloseHandle(FhFile); end; end else Result:=SetMapError; end; Function TEFileMap.FlushFileView : Boolean; begin EnterCriticalSection; Try Result:=FlushViewOfFile(FMap,FMapSize) OR SetMapError; Finally LeaveCriticalSection; end; end; end. mricron-0.20120505.1~dfsg.1.orig/wgraphics.pas0000664000175000017500000000507411326434470020356 0ustar michaelmichaelunit wgraphics; //only for windows {$mode objfpc}{$H+} interface uses Interfaces, SysUtils, LCLType, LCLProc, InterfaceBase, FPImage, IntfGraphics, Math, Windows,Classes,define_types; procedure Draw32Bitmap(Dest: HDC; lWidth, lHeight: Integer; Bitmap: RGBQuadp); procedure StretchDraw32Bitmap(Dest: HDC; DstWidth, DstHeight,SrcWidth, SrcHeight: Integer; Bitmap: RGBQuadp); implementation procedure StretchDraw32Bitmap(Dest: HDC; DstWidth, DstHeight,SrcWidth, SrcHeight: Integer; Bitmap: RGBQuadp); var Clip: TRect; Info: BITMAPINFO; DstX, DstY,SrcX, SrcY: integer; begin if (Bitmap = nil) then Exit; if (SrcWidth <= 0) or (SrcHeight <= 0) then Exit; if (DstWidth <= 0) or (DstHeight <= 0) then Exit; DstX := 0; DstY := 0; SrcX := 0; SrcY := 0; Widgetset.GetClipBox(Dest, @Clip); if (DstX >= Clip.Right) or (DstY >= Clip.Bottom) or (DstX + DstWidth < Clip.Left) or (DstY + DstHeight < Clip.Top) then Exit; if (DstWidth = SrcWidth) and (DstHeight = SrcHeight) then begin Draw32Bitmap(Dest, SrcWidth, SrcHeight, Bitmap); Exit; end; with Info.bmiHeader do begin biSize := SizeOf(BITMAPINFOHEADER); biWidth := SrcWidth; biHeight := SrcHeight; biPlanes := 1; biBitCount := 32; biCompression := BI_RGB; biSizeImage := 0; biClrImportant := 0; end; SetStretchBltMode(Dest, COLORONCOLOR); StretchDIBits(Dest, DstX, Pred(DstY + DstHeight), DstWidth, -DstHeight, SrcX, SrcY, SrcWidth, SrcHeight, Bitmap, Info, DIB_RGB_COLORS, SRCCOPY); end; // ! SrcX < 0, SrcY < 0, SrcX + SrcWidth > Bitmap.Width, SrcY + SrcHeight > Bitmap.Height // ! results in mash procedure Draw32Bitmap(Dest: HDC; lWidth, lHeight: Integer; Bitmap: RGBQuadp); var Clip: TRect; SrcX,SrcY,DstX,DstY:integer; Info: BITMAPINFO; begin if (Bitmap = nil) then Exit; if (lWidth <= 0) or (lHeight <= 0) then Exit; Widgetset.GetClipBox(Dest, @Clip); // clipping: SrcX := 0; SrcY := 0;DstX := 0; DstY := 0; //ClipDimension(Clip.Left, Clip.Right, DstX, SrcX, lWidth); //ClipDimension(Clip.Top, Clip.Bottom, DstY, SrcY, lHeight); with Info.bmiHeader do begin biSize := SizeOf(BITMAPINFOHEADER); biWidth := lWidth; biHeight := lHeight; biPlanes := 1; biBitCount := 32; biCompression := BI_RGB; biSizeImage := 0; biClrImportant := 0; end; SetStretchBltMode(Dest, COLORONCOLOR); StretchDIBits(Dest, DstX, Pred(DstY + lHeight), lWidth, -lHeight, SrcX, SrcY, lWidth, lHeight, Bitmap, Info, DIB_RGB_COLORS, SRCCOPY); end; end. mricron-0.20120505.1~dfsg.1.orig/voismooth.pas0000664000175000017500000004245411545352360020421 0ustar michaelmichaelunit voismooth; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons, Spin,define_types; type { Tvoismoothform } Tvoismoothform = class(TForm) CancelBtn: TSpeedButton; Label37: TLabel; Label38: TLabel; OKBtn: TSpeedButton; ScaleSides: TComboBox; HelpBtn: TSpeedButton; XROIfwhm: TSpinEdit; xROIoutput: TComboBox; XROIthresh: TFloatSpinEdit; procedure FormCreate(Sender: TObject); procedure SmoothOpenVOI(Sender: TObject); procedure BtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure HelpBtnClick(Sender: TObject); procedure SmoothVOI_SPM5masks; private { private declarations } public { public declarations } end; var voismoothform: Tvoismoothform; implementation uses nifti_img_view,nifti_img; { Tvoismoothform } procedure Tvoismoothform.HelpBtnClick(Sender: TObject); begin Showmessage('The Full Width Half Maximum [FWHM] defines the width of the smoothing Gaussian. '+ 'The threshold defines a binary cutoff boundary - signals greater than the threshold will be included in the output. '+ 'A threshold of 0 will create an continuous 8-bit output (0..200 for signal 0..1)'); end; procedure Tvoismoothform.SmoothOpenVOI(Sender: TObject); var lScaleXY,lOK,lResliceNotMask: boolean; lYOutra,lROIrealRA: SingleP; lIncX,lMissing,lZPos,lYPos,lSliceSz,lXt,lYt,lZt,lX,lY,lZ,lXoffset,lYOffset,lZOffset,lI,lI2,lImgSz,lcutoffvoxx,lcutoffvoxy,lcutoffvoxz: integer; lScale,lThreshComp,lExpd,lThresh,lSig,lXmm,lYmm,lZmm,lcumgauss: single;//double; lxra,lyra,lzra,lzraScaled,lxCutra,lyCutra,lzCutra:SingleP0;//x0P; lStartTime,lEndTime: DWord; lXDim,lYDim,lZDim,lPlanes,lMinX,lMaxX,lMinY,lMaxY,lMinZ,lMaxZ: integer; begin lXDim := gBGImg.ScrnDim[1]; lYDim := gBGImg.ScrnDim[2]; lZDim := gBGImg.ScrnDim[3]; lXmm := gBGImg.ScrnMM[1]; lYmm := gBGImg.ScrnMM[2]; lZmm := gBGImg.ScrnMM[3]; lResliceNotMask := false; if not IsVOIOpen then begin ShowMessage('You have not created or opened a region of interest.'); exit; end; if (gBGImg.ScrnMM[1] = 0) or (lXmm = 0) or (lYmm = 0) or (lZmm =0) or (XROIfwhm.value=0) then begin ShowMessage('At least one of the images ''size [mm]'' settings or the ''FWHM [mm]'' is zero. Smoothing requires the image size to be specified.'); Exit; end; if ScaleSides.itemindex = 1 then lScaleXY := true else lScaleXY := false; lOK := true; if lScaleXY then begin lsig := (XROIfwhm.value / lXmm)/sqrt(8*ln(2)); // % FWHM -> sigma lcutoffvoxX := round(6*lsig); if (lcutoffvoxX *2) >= lXdim then lOK := false; lsig := (XROIfwhm.value / lYmm)/sqrt(8*ln(2)); // % FWHM -> sigma lcutoffvoxY := round(6*lsig); if (lcutoffvoxY *2) >= lYdim then lOK := false; end; {scaleXY} lsig := (XROIfwhm.value / lZmm)/sqrt(8*ln(2)); // % FWHM -> sigma lcutoffvoxZ := round(6*lsig); if (lcutoffvoxZ *2) >= lZdim then lOK := false; if not lOK then begin showmessage('Unable to smooth image: image dimensions are too small for such a broad smoothing. Reduce the FWHM'); exit; end; if xROIoutput.itemindex <> 1 then lResliceNotMask := true; lImgSz := gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems; if lImgSz < 1 then exit; CreateUndoVol;//create gBGImg.VOIUndoVol Move(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,gBGImg.VOIUndoVol^,gBGImg.VOIUndoVolItems); if lResliceNotMask then begin //reslice for lI := 1 to lImgSz do if gBGImg.VOIUndoVol^[lI] <> 0 then gBGImg.VOIUndoVol^[lI] := 1; end else begin //create mask: invert for lI := 1 to lImgSz do if gBGImg.VOIUndoVol^[lI] = 0 then gBGImg.VOIUndoVol^[lI] := 1 else gBGImg.VOIUndoVol^[lI] := 0; end; //create mask lSliceSz := lXdim * lYdim; //lZXi := lZdim*lXdim; //for swizzle lPlanes := 0; ImgForm.ProgressBar1.Position := 0; ImgForm.ProgressBar1.Min := 0; ImgForm.ProgressBar1.Max := lZdim * 3; ImgForm.StatusLabel.caption := 'Smoothing slice data: X-plane'; //lStartTime := GetTickCount; lThresh := XRoiThresh.value; lsig := (XROIfwhm.value / lXmm)/sqrt(8*ln(2)); // % FWHM -> sigma if lsig = 0 then begin Showmessage('Unable to compute gaussian with current FWHM'); exit; end; lcutoffvoxx := round(6*lsig); // % highest / lowest voxel to go out to getmem(lxra,(lcutoffvoxx+1)*sizeof(double {was extended})); getmem(lxCutra,(lcutoffvoxx+1)*sizeof(double {was extended})); lexpd := 2*lsig*lsig; lCumGauss := 0; for lI := 0 to lcutoffvoxx do begin lxra^[lI] := exp(-1*(lI*lI)/lexpd) ; lCumGauss := lCumGauss + lxra^[lI]; end; lCumGauss := 2*lCumGauss - lxra^[0]; if lCumGauss <> 0 then for lI := 0 to lcutoffvoxx do begin lxra^[lI] := lxra^[lI]/lCumGauss; end; for lI := 1 to lcutoffvoxX do begin lCumGauss := 0; for lI2 := (lcutoffvoxX - lI) downto -lcutoffvoxX do lCumGauss := lCumGauss + lXra^[abs(lI2)]; if lCumGauss <> 0 then lXCutra^[lI] := 1/lCumGauss; end; lXCutra^[0] := 1; lsig := (XROIfwhm.value / lYmm)/sqrt(8*ln(2)); // % FWHM -> sigma if lsig = 0 then begin Showmessage('Unable to compute gaussian with current FWHM'); exit; end; lcutoffvoxY := round(6*lsig); // % highest / lowest voxel to go out to getmem(lYra,(lcutoffvoxY+1)*sizeof(double {was extended})); getmem(lYCutra,(lcutoffvoxY+1)*sizeof(double {was extended})); lexpd := 2*lsig*lsig; lCumGauss := 0; for lI := 0 to lcutoffvoxY do begin lYra^[lI] := exp(-1*(lI*lI)/lexpd) ; lCumGauss := lCumGauss + lYra^[lI]; end; lCumGauss := 2*lCumGauss - lYra^[0]; if lCumGauss <> 0 then for lI := 0 to lcutoffvoxY do begin lYra^[lI] := lYra^[lI]/lCumGauss; end; for lI := 1 to lcutoffvoxY do begin lCumGauss := 0; for lI2 := (lcutoffvoxY - lI) downto -lcutoffvoxY do lCumGauss := lCumGauss + lYra^[abs(lI2)]; if lCumGauss <> 0 then lYCutra^[lI] := 1/lCumGauss; end; lYCutra^[0] := 1; lsig := (XROIfwhm.value / lZmm)/sqrt(8*ln(2)); // % FWHM -> sigma if lsig = 0 then begin Showmessage('Unable to compute gaussian with current FWHM'); exit; end; lcutoffvoxZ := round(6*lsig); // % highest / lowest voxel to go out to getmem(lZra,(lcutoffvoxZ+1)*sizeof(double {was extended})); getmem(lZraScaled,(lcutoffvoxZ+lcutoffvoxZ+1)*sizeof(double {was extended})); getmem(lZCutra,(lcutoffvoxZ+1)*sizeof(double {was extended})); lexpd := 2*lsig*lsig; lCumGauss := 0; for lI := 0 to lcutoffvoxZ do begin lZra^[lI] := exp(-1*(lI*lI)/lexpd ); lCumGauss := lCumGauss + lZra^[lI]; end; lCumGauss := 2*lCumGauss - lZra^[0]; if lCumGauss <> 0 then for lI := 0 to lcutoffvoxZ do begin lZra^[lI] := lZra^[lI]/lCumGauss; end; for lI := 1 to lcutoffvoxZ do begin lCumGauss := 0; for lI2 := (lcutoffvoxZ - lI) downto -lcutoffvoxZ do lCumGauss := lCumGauss + lZra^[abs(lI2)]; if lCumGauss <> 0 then lZCutra^[lI] := 1/lCumGauss; end; lZCutra^[0] := 1;(**) GetMem ( lROIrealRA , sizeof(single)*lImgSz); GetMem (lYOutRA, sizeof(single) * lYdim); if lResliceNotMask then for lI := 1 to lImgSz do lROIrealRA^[lI] := 0 else for lI := 1 to lImgSz do lROIrealRA^[lI] := 1; //X-direction for lZ := 1 to lZdim do begin lZPos := (lZ-1)*lSliceSz; for lY := 1 to lYdim do begin lyPos := (lY-1)*lXdim; for lX := 1 to lXdim do begin lMinX := lX - lCutoffVoxX; if lMinX < 1 then lMinX := 1; lMaxX := lX + lCutoffVoxX; if lMaxX > lXdim then lMaxX := lXdim; lMissing := (2*lCutOffVoxX)-(lMaxX-lMinX); if lScaleXY then lScale := lXCutRA^[lMissing] else lScale := lXCutRA^[0]; lCumGauss := 0; for lXt := lMinX to lMaxX do begin //SSE optimization? if (gBGImg.VOIUndoVol^[lXt+lYPos+lZpos] <> 0) then lCumGauss := lCumGauss + lScale*lXra^[abs(lX-lXt)] (*{kSmoothImg}*(gROIEXport[lXt+lYPos+lZpos]/255)*); end; {for each position} lROIrealRA^[lX+lYPos+lZpos] := lCumGauss; end; {lX} end; {lY} Application.ProcessMessages; inc(lPlanes); ImgForm.ProgressBar1.Position := lPLanes; end; {lZ loop for X-plane} ImgForm.StatusLabel.caption := 'Smoothing slice data: Y-plane'; for lZ := 1 to lZdim do begin {Z loop for Y plane} lZPos := (lZ-1)*lSliceSz; for lX := 1 to lXdim do begin for lY := 1 to lYdim do begin lMinY := lY - lCutoffVoxY; if lMinY < 1 then lMinY := 1; lMaxY := lY + lCutoffVoxY; if lMaxY > lYdim then lMaxY := lYdim; lMissing := (2*lCutOffVoxY)-(lMaxY-lMinY); if lScaleXY then lScale := lYCutRA^[lMissing] else lScale := lYCutRA^[0]; lCumGauss := 0; for lYt := lMinY to lMaxY do begin //SSE optimization? lCumGauss := lCumGauss+ lScale*(lROIrealRA^[lX+((lYt-1)*lXdim)+lZpos])*lYra^[abs(lY-lYt)]; end; {for each position} lYOutRA^[lY] := lCumGauss; end; {lY} for lY := 1 to lYdim do begin //SSE optimization lROIrealRA^[lX+((lY-1)*lXdim)+lZpos] := lYOutRA^[lY]; end; end; {lX} Application.ProcessMessages; inc(lPlanes); ImgForm.ProgressBar1.Position := lPlanes; end; {Z loop for Y plane} (*if (not lScaleXY) then begin //lOrigZPos := (lFirstEmptySlice-1)*lSliceSz; for lZ := lFirstEmptySlice to lZi do begin if (lROIonSliceRA[lZ]=0) then begin lZPos := (lZ-1)*lSliceSz; for lX := 1 to lSliceSz do //SSE optimization? lROIrealRA[lX+lZPos] := lROIrealRA[lX+lOrigZPos]; Application.ProcessMessages; end; {no ROI on this slice} end; {for n slices} end; {not scaled} *) lThreshComp := 1 - lThresh; ImgForm.StatusLabel.caption := 'Smoothing slice data: Z-plane'; lI := 0; for lZ := 1 to lZdim do begin lMinZ := lZ - lCutoffVoxZ; if lMinZ < 1 then lMinZ := 1; lMaxZ := lZ + lCutoffVoxZ; if lMaxZ > lZdim then lMaxZ := lZdim; lScale := 1; lMissing := (2*lCutOffVoxZ)-(lMaxZ-lMinZ); if (lMissing >= 0) and (lMissing <= lCutOffVoxZ) then lScale := lZCutRA^[lMissing]; if lThreshComp <> 1 then begin if lResliceNotMask then begin for lIncX := 1 to lcutoffvoxZ do lZraScaled^[lcutoffvoxZ-lIncX] := lZra^[lIncX]*lScale; for lIncX := 0 to lcutoffvoxZ do lZraScaled^[lcutoffvoxZ+lIncX] := lZra^[lIncX]*lScale; lZOffset := lcutoffvoxZ + lZ; for lY := 1 to lYdim do begin lyPos := (lY-1)*lXdim; for lX := 1 to lXdim do begin lCumGauss := 0; lIncX := ((lMinZ-1)*lSliceSz)+lX+lYPos; for lZt := lMinZ to lMaxZ do begin lCumGauss := lCumGauss + lROIrealRA^[lIncX]*lZraScaled^[(lZoffset-lZt)]; lIncX := lIncX+ lSliceSz //SSE optimization //lCumGauss := lCumGauss + lROIrealRA[lX+lYPos+(lZt-1)*lSliceSz]*lZra[abs(lZ-lZt)]*lScale; end; inc(lI); if (lCumGauss < (1-lThreshComp)) then gBGImg.VOIUndoVol^[lI] := 100 else gBGImg.VOIUndoVol^[lI] := 0; end; {lX} end; {lY} end else begin //this is a mask -> unrolled loop means faster processing for lY := 1 to lYdim do begin lyPos := (lY-1)*lXdim; for lX := 1 to lXdim do begin lCumGauss := 0; for lZt := lMinZ to lMaxZ do lCumGauss := lCumGauss + lROIrealRA^[lX+lYPos+(lZt-1)*lSliceSz]*lZra^[abs(lZ-lZt)]*lScale; inc(lI); if lCumGauss > lThreshComp then gBGImg.VOIUndoVol^[lI] := 0 else gBGImg.VOIUndoVol^[lI] := 100; end; {lX} end; {lY} end; end else begin //threshcomp = 1 analogua output for lY := 1 to lYdim do begin lyPos := (lY-1)*lXdim; for lX := 1 to lXdim do begin lCumGauss := 0; for lZt := lMinZ to lMaxZ do //SSE optimization? lCumGauss := lCumGauss + lROIrealRA^[lX+lYPos+(lZt-1)*lSliceSz]*lZra^[abs(lZ-lZt)]*lScale; inc(lI); gBGImg.VOIUndoVol^[lI] := round(200 * lCumGauss); end; {lX} end; {lY} end; //threshcomp=1 analogue output Application.ProcessMessages; inc(lPlanes); ImgForm.ProgressBar1.Position := lPlanes; end; {lZ loop} //lEndTime := GetTickCOunt; // ImgForm.StatusLabel.caption :=('Smoothing time(ms): '+inttostr(lEndTime-lStartTime)); FreeMem (lROIrealRA); FreeMem (lYOutRA); Freemem(lXra); Freemem(lYra); Freemem(lZra); Freemem(lZraScaled); Freemem(lXCutra); Freemem(lYCutra); Freemem(lZCutra); if (lThreshComp = 1) then begin //analogue output //gGlMaxUnscaledS := 200; //Scale.value := 0.0050000; for lI := 1 to lImgSz do gBGImg.VOIUndoVol^[lI] := 200 - gBGImg.VOIUndoVol^[lI]; end else begin //threshcomp <> 1 //gGlMaxUnscaledS := 100; //Scale.value := 0.0100000; for lI := 1 to lImgSz do if gBGImg.VOIUndoVol^[lI] = 0 then gBGImg.VOIUndoVol^[lI] := kVOI8bit else gBGImg.VOIUndoVol^[lI] := 0; end; //Threshcomp <> 1 so digital output lResliceNotMask := false; gBGImg.VOIchanged := true; ImgForm.ProgressBar1.Position := 0; ImgForm.Undo1Click(nil); //show smoothed buffer end; procedure Tvoismoothform.FormCreate(Sender: TObject); begin XROIthresh.value := 0.5; XROIfwhm.value := 8; ScaleSides.ItemIndex := 0; xROIoutput.ItemIndex := 0; end; procedure Tvoismoothform.BtnClick(Sender: TObject); begin if (Sender as TSpeedButton).tag = 1 then SmoothOpenVOI(Sender); voismoothform.Close; end; procedure Tvoismoothform.FormShow(Sender: TObject); begin // voismoothform.ModalResult := mrCancel; end; procedure VOIinvert; var lI,lImgSz: integer; begin lImgSz := gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems; if lImgSz < 1 then exit; CreateUndoVol; Move(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,gBGImg.VOIUndoVol^,gBGImg.VOIUndoVolItems); for lI := 1 to lImgSz do if gBGImg.VOIUndoVol^[lI] = 0 then gBGImg.VOIUndoVol^[lI] := 1 else gBGImg.VOIUndoVol^[lI] := 0; gBGImg.VOIchanged := true; ImgForm.Undo1Click(nil); //show smoothed buffer end; procedure Tvoismoothform.SmoothVOI_SPM5masks; var lBGname,lmaskname,llesionname: string; lorigFWHM , lorigThresh : single; lorigSS,lOrigOut: integer; begin if not IsVOIOpen then begin ShowMessage('You have not created or opened a region of interest.'); exit; end; lBGname := gMRIcroOverlay[kBGOverlayNum].HdrFileName; if not gMRIcroOverlay[kBGOverlayNum].NIfTItransform then begin //need to save BG as NIfTI lBGName := ChangeFilePrefix(lBGname,'x'); SaveAsVOIorNIFTIcore(lBGName,gMRIcroOverlay[kBGOverlayNum].ImgBuffer,gMRIcroOverlay[kBGOverlayNum].ImgBufferItems,gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); end; lmaskname := ChangeFilePrefix(lBGname,'m'); lmaskname := changefileextx(lmaskname, '.nii'); llesionname := ChangeFilePrefix(lBGname,'l'); llesionname := changefileextx(llesionname, '.nii'); if (fileexists(lmaskname)) or (fileexists(llesionname)) then begin showmessage ('Files already exist named '+lmaskname+' '+llesionname); exit; end; //init lorigFWHM := XROIfwhm.value; lorigThresh := XROIthresh.value; lorigSS := voismoothform.ScaleSides.itemindex; lorigOut := xROIoutput.itemindex; //compute mask //XROIfwhm.value := 8; XROIfwhm.value := gBGImg.LesionDilate; XROIthresh.value := 0.001; ScaleSides.itemindex:=(1); xROIoutput.itemindex:=(1); if gBGImg.LesionDilate <= 0 then VOIinvert else SmoothOpenVOI(nil); if (gBGImg.VOIUndoSlice < 1) or (gBGImg.VOIUndoOrient <> 4) then begin //should be impossible - smoothVOI creates undovol showmessage('Serious error.'); exit; end; ImgForm.StatusLabel.caption := 'Smoothed :'+lMaskName; gMRIcroOverlay[kVOIOverlayNum].HdrFileName := lmaskname; ImgForm.SaveVOIcore(false);//12/2010 //unmirrors image //12/2010 SaveAsVOIorNIFTIcore (lmaskname, gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems, 1,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); //compute lesion UndoVolVOI; XROIfwhm.value := gBGImg.LesionSmooth; XROIthresh.value := 0.5; //ScaleSides.setitemindex(0); xROIoutput.itemindex:=(0); SmoothOpenVOI(nil); gMRIcroOverlay[kVOIOverlayNum].HdrFileName := llesionname; ImgForm.SaveVOIcore(false);//12/2010 //unmirrors image gMRIcroOverlay[kVOIOverlayNum].HdrFileName := lmaskname; //SaveAsVOIorNIFTIcore (llesionname, gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems, 1,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); //re-init UndoVolVOI; XROIfwhm.value := round(lorigFWHM); XROIthresh.value := lorigThresh; ScaleSides.itemindex:=(lOrigSS); xROIoutput.itemindex:=(lOrigOut); end; initialization {$I voismooth.lrs} end. mricron-0.20120505.1~dfsg.1.orig/voismooth.lrs0000664000175000017500000000562311545352360020433 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('Tvoismoothform','FORMDATA',[ 'TPF0'#14'Tvoismoothform'#13'voismoothform'#4'Left'#3#138#2#6'Height'#3#222#0 +#3'Top'#3#241#0#5'Width'#3#252#0#13'ActiveControl'#7#8'XROIfwhm'#11'BorderIc' +'ons'#11#12'biSystemMenu'#0#11'BorderStyle'#7#8'bsDialog'#7'Caption'#6#8'Blu' +'r VOI'#12'ClientHeight'#3#222#0#11'ClientWidth'#3#252#0#21'Constraints.MaxH' +'eight'#3#222#0#20'Constraints.MaxWidth'#3#252#0#21'Constraints.MinHeight'#3 +#222#0#20'Constraints.MinWidth'#3#252#0#8'OnCreate'#7#10'FormCreate'#6'OnSho' +'w'#7#8'FormShow'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29' +#0#6'TLabel'#7'Label37'#4'Left'#2#12#6'Height'#2#17#3'Top'#2'.'#5'Width'#2'>' +#7'Caption'#6#9'Threshold'#12'Font.CharSet'#7#12'ANSI_CHARSET'#9'Font.Name'#6 +#13'MS Sans Serif'#11'ParentColor'#8#10'ParentFont'#8#0#0#12'TSpeedButton'#9 +'CancelBtn'#4'Left'#2'^'#6'Height'#2#25#4'Hint'#6'#Save to small-endian [Int' +'el] format'#3'Top'#3#167#0#5'Width'#2'B'#7'Caption'#6#6'Cancel'#5'Color'#7#9 +'clBtnFace'#9'NumGlyphs'#2#0#7'OnClick'#7#8'BtnClick'#8'ShowHint'#9#14'Paren' +'tShowHint'#8#0#0#12'TSpeedButton'#5'OKBtn'#3'Tag'#2#1#4'Left'#3#165#0#6'Hei' +'ght'#2#25#4'Hint'#6#31'Save to big-endian [Sun] format'#3'Top'#3#167#0#5'Wi' +'dth'#2'B'#7'Caption'#6#2'OK'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnC' +'lick'#7#8'BtnClick'#8'ShowHint'#9#14'ParentShowHint'#8#0#0#12'TSpeedButton' +#7'HelpBtn'#3'Tag'#2#2#4'Left'#2#21#6'Height'#2#25#3'Top'#3#167#0#5'Width'#2 +'B'#7'Caption'#6#4'Help'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClick' +#7#12'HelpBtnClick'#14'ParentShowHint'#8#0#0#6'TLabel'#7'Label38'#4'Left'#2 +#12#6'Height'#2#17#3'Top'#2#9#5'Width'#3#143#0#7'Caption'#6#19'Smoothing (FW' +'HM mm)'#12'Font.CharSet'#7#12'ANSI_CHARSET'#9'Font.Name'#6#13'MS Sans Serif' +#11'ParentColor'#8#10'ParentFont'#8#0#0#9'TComboBox'#10'ScaleSides'#4'Left'#2 +#12#6'Height'#2#21#3'Top'#2'T'#5'Width'#3#229#0#10'ItemHeight'#2#13#13'Items' +'.Strings'#1#6'"Adjust sides in Z-plane only [SPM]'#6' Adjust sides in X,Y a' +'nd Z planes'#0#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#0#0#0#9'TComboBo' +'x'#10'xROIoutput'#4'Left'#2#12#6'Height'#2#21#3'Top'#2'u'#5'Width'#3#229#0 +#10'ItemHeight'#2#13#13'Items.Strings'#1#6#22'ROI is 1 [reslice ROI]'#6#26'R' +'OI is 0 [SPM object mask]'#0#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#1#0 +#0#14'TFloatSpinEdit'#10'XROIthresh'#4'Left'#3#175#0#6'Height'#2#21#3'Top'#2 +')'#5'Width'#2'F'#13'DecimalPlaces'#2#4#9'Increment'#5#0'('#206#251#255'n'#18 +#131#245'?'#8'MaxValue'#5#0#0#0#0#0#0#0#128#255'?'#8'MinValue'#5#0#0#0#0#0#0 +#0#0#0#0#8'TabOrder'#2#2#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#9'TSpinEdit' +#8'XROIfwhm'#4'Left'#3#175#0#6'Height'#2#21#3'Top'#2#4#5'Width'#2'F'#8'MaxVa' +'lue'#2'('#8'MinValue'#2#1#8'TabOrder'#2#3#5'Value'#2#1#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/voismooth.lfm0000664000175000017500000000506111545352360020405 0ustar michaelmichaelobject voismoothform: Tvoismoothform Left = 650 Height = 222 Top = 241 Width = 252 ActiveControl = XROIfwhm BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Blur VOI' ClientHeight = 222 ClientWidth = 252 Constraints.MaxHeight = 222 Constraints.MaxWidth = 252 Constraints.MinHeight = 222 Constraints.MinWidth = 252 OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object Label37: TLabel Left = 12 Height = 17 Top = 46 Width = 62 Caption = 'Threshold' Font.CharSet = ANSI_CHARSET Font.Name = 'MS Sans Serif' ParentColor = False ParentFont = False end object CancelBtn: TSpeedButton Left = 94 Height = 25 Hint = 'Save to small-endian [Intel] format' Top = 167 Width = 66 Caption = 'Cancel' Color = clBtnFace NumGlyphs = 0 OnClick = BtnClick ShowHint = True ParentShowHint = False end object OKBtn: TSpeedButton Tag = 1 Left = 165 Height = 25 Hint = 'Save to big-endian [Sun] format' Top = 167 Width = 66 Caption = 'OK' Color = clBtnFace NumGlyphs = 0 OnClick = BtnClick ShowHint = True ParentShowHint = False end object HelpBtn: TSpeedButton Tag = 2 Left = 21 Height = 25 Top = 167 Width = 66 Caption = 'Help' Color = clBtnFace NumGlyphs = 0 OnClick = HelpBtnClick ParentShowHint = False end object Label38: TLabel Left = 12 Height = 17 Top = 9 Width = 143 Caption = 'Smoothing (FWHM mm)' Font.CharSet = ANSI_CHARSET Font.Name = 'MS Sans Serif' ParentColor = False ParentFont = False end object ScaleSides: TComboBox Left = 12 Height = 21 Top = 84 Width = 229 ItemHeight = 13 Items.Strings = ( 'Adjust sides in Z-plane only [SPM]' 'Adjust sides in X,Y and Z planes' ) Style = csDropDownList TabOrder = 0 end object xROIoutput: TComboBox Left = 12 Height = 21 Top = 117 Width = 229 ItemHeight = 13 Items.Strings = ( 'ROI is 1 [reslice ROI]' 'ROI is 0 [SPM object mask]' ) Style = csDropDownList TabOrder = 1 end object XROIthresh: TFloatSpinEdit Left = 175 Height = 21 Top = 41 Width = 70 DecimalPlaces = 4 Increment = 0.00100000004749 MaxValue = 1 MinValue = 0 TabOrder = 2 Value = 1 end object XROIfwhm: TSpinEdit Left = 175 Height = 21 Top = 4 Width = 70 MaxValue = 40 MinValue = 1 TabOrder = 3 Value = 1 end end mricron-0.20120505.1~dfsg.1.orig/text.pas0000664000175000017500000000344511425653330017351 0ustar michaelmichaelunit text; {$H+} interface uses {$IFDEF FPC}LResources,{$ENDIF} {$IFNDEF Unix} Windows,{$ENDIF} SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls,Define_Types; type TTextForm = class(TForm) MainMenu1: TMainMenu; File1: TMenuItem; Save1: TMenuItem; Closewindow1: TMenuItem; Copy1: TMenuItem; Copy2: TMenuItem; MemoT: TMemo; procedure Closewindow1Click(Sender: TObject); procedure Copy2Click(Sender: TObject); procedure Save1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var TextForm: TTextForm; implementation uses nifti_img_view; {$IFNDEF FPC} {$R *.DFM} {$ENDIF} procedure TTextForm.Closewindow1Click(Sender: TObject); begin TextForm.Close; end; procedure TTextForm.Copy2Click(Sender: TObject); begin {$IFDEF zxDarwin} Showmessage('Copy not yet supported with OSX: use File/Save'); exit; {$ENDIF} MemoT.SelectAll; MemoT.CopyToClipboard; end; procedure TTextForm.Save1Click(Sender: TObject); begin ImgForm.SaveDialog1.Filename := parsefilename(gMRIcroOverlay[kBGOverlayNum].HdrFilename); if kTextSep = chr(9) then ImgForm.SaveDialog1.Filter := 'Tab Separated (*.tab)|*.tab|Comma Separated (*.csv)|*.csv|Text (*.txt)|*.txt' else ImgForm.SaveDialog1.Filter := 'Comma Separated (*.csv)|*.csv|Tab Separated (*.tab)|*.tab|Text (*.txt)|*.txt'; if kTextSep = chr(9) then ImgForm.SaveDialog1.DefaultExt := '.tab' else ImgForm.SaveDialog1.DefaultExt := '.csv'; if not ImgForm.SaveDialog1.Execute then exit; MemoT.Lines.SaveToFile(ImgForm.SaveDialog1.Filename); end; {$IFDEF FPC} initialization {$I Text.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/Text.lrs0000664000175000017500000000214511425653330017322 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TTextForm','FORMDATA',[ 'TPF0'#9'TTextForm'#8'TextForm'#4'Left'#3#161#1#6'Height'#3#224#1#3'Top'#3#195 +#0#5'Width'#3#184#2#18'HorzScrollBar.Page'#3#183#2#18'VertScrollBar.Page'#3 +#203#1#13'ActiveControl'#7#5'MemoT'#7'Caption'#6#22'Descriptive Statistics' +#12'ClientHeight'#3#205#1#11'ClientWidth'#3#184#2#11'Font.Height'#2#245#9'Fo' +'nt.Name'#6#13'MS Sans Serif'#4'Menu'#7#9'MainMenu1'#10'LCLVersion'#6#6'0.9.' +'29'#0#5'TMemo'#5'MemoT'#4'Left'#2#0#6'Height'#3#205#1#3'Top'#2#0#5'Width'#3 +#184#2#5'Align'#7#8'alClient'#10'ScrollBars'#7#10'ssVertical'#8'TabOrder'#2#0 +#0#0#9'TMainMenu'#9'MainMenu1'#4'left'#2'p'#3'top'#2#10#0#9'TMenuItem'#5'Fil' +'e1'#7'Caption'#6#4'File'#0#9'TMenuItem'#5'Save1'#7'Caption'#6#4'Save'#7'OnC' +'lick'#7#10'Save1Click'#0#0#9'TMenuItem'#12'Closewindow1'#7'Caption'#6#12'Cl' +'ose window'#7'OnClick'#7#17'Closewindow1Click'#0#0#0#9'TMenuItem'#5'Copy1'#7 +'Caption'#6#4'Edit'#0#9'TMenuItem'#5'Copy2'#7'Caption'#6#4'Copy'#7'OnClick'#7 +#10'Copy2Click'#0#0#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/Text.lfm0000664000175000017500000000177311425653330017306 0ustar michaelmichaelobject TextForm: TTextForm Left = 417 Height = 480 Top = 195 Width = 696 HorzScrollBar.Page = 695 VertScrollBar.Page = 459 ActiveControl = MemoT Caption = 'Descriptive Statistics' ClientHeight = 461 ClientWidth = 696 Font.Height = -11 Font.Name = 'MS Sans Serif' Menu = MainMenu1 LCLVersion = '0.9.29' object MemoT: TMemo Left = 0 Height = 461 Top = 0 Width = 696 Align = alClient ScrollBars = ssVertical TabOrder = 0 end object MainMenu1: TMainMenu left = 112 top = 10 object File1: TMenuItem Caption = 'File' object Save1: TMenuItem Caption = 'Save' OnClick = Save1Click end object Closewindow1: TMenuItem Caption = 'Close window' OnClick = Closewindow1Click end end object Copy1: TMenuItem Caption = 'Edit' object Copy2: TMenuItem Caption = 'Copy' OnClick = Copy2Click end end end end mricron-0.20120505.1~dfsg.1.orig/templates/0000775000175000017500000000000011660470014017645 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/templates/ch2bet.nii.gz0000664000175000017500000504401610403121336022140 0ustar michaelmichael‹нƒ Dch2bet.niiьнл’з•оёлОsЬЭDиžа8$J$-<‚FЃы•‡}ЮcхБ RxТс‘?€ŸРЯт ћц-ќ*ОБW5AЄВZ3퉧`u7ЋwОкЕік;‹ьџ"Š~ѕїПћЩ­шУП§эп§њУџќлП§Э‡П:ќЗУ‡П‰ОіЛш_Fџ;њ?ђј‹WОы_DџњіћўнЧї§ЯеўkџяеїПџЏї“_ўф№_ўгЏП;Мi№ќцЗПљѕOўќц_EoЮѓњѓџыОћмџ§‡яŽћЏ§ћЋПѓ§ў ’рЯDПt…ВщКЎ­—ЮqE?O§0OcЛt’;$ђ0Юѓ4tKG9[7Mу8ЪDOуАt–Г ‡Уиї‡yž—zџыУ(е1ІЙZ:Ы]Ьу8MЧcПtŽ;hцЉлгсАt;kЧЁY:ŒЕvщwфCеэл:шЅƒмЦЁяхЫўrfлtг8tћ~œњnщ,gkЇiшКЖІivK‡9зx8Œ}Ъ|–ЮrЖўхaЦqœчЙ^:ЫйТqšGI=Ц‹ЉŽ(ъцЉoЛщ’&Z6–ОЏC;Э—г;О†~щ—Ii/сŽlQЗm]yГt;№ћaКaю[Пt”Гy‰ЉцЉmO•Нt’;ЈЧсд<†‹ЉшПЏ|3 хв9ю.\LЛџŒх:O“ЅCм uS•uаK9_Zu§д7ндЕХвYЮVУаяЋvћо-цLЩ0ЦЁЋїУ8єЭвiЮ”tу,“мі‡уиWKЇ9W;“Lѕ0ПмЮt;Ьѓ‡q”љ/ЈQя_ОФF•Е3хО) {S'жnЃuт›J›І-‚^:бv;хLКнЈzoRПЏЫK(8ЭДS›ыШTeЎк}–NtŽ$SZ%/"хл2+ЦІX:аYт$Эђmd\UdЊ+нвyЮG;G™sAEХ[>б›o~ˆЅFфдсмiОхЁЗёїž6ВHЛи&K'јSФпŸjќљŠѓ<оn—Nq'iѕОє•Щ6?>ј-ЁкQtн('ЂнвaЮЕŸцyшіћ~њvщ0gR}?cпюћqшЧK81 7єг4ін0Lѓд_ФсSnЖЛщјђ8ѕЇЬc{!3Нычƒ„žцуqЊ Y‰зЭ<Г8‡KИŸК‡уqчi>д2бQddЂѓt˜цб/х|э(е1S{A2цХО•ргўBZЧ+iљ}uAŸ/€~т,^:ТХy:“dщ w(эCщ­Nгtщ,чкІЙЖEСjэдвiЮДЭ•жЁ*М7™ zщ8ч‰mQSжeQdЊtvщ}џ№ќKжЉ‡’=%”!оhп6оялтс–aь|~њIДŠVыs.Ymтмщ,•ЗЅKMU5•+ЛЊxАŠжСnoxБYЏ7g]’фiюœкYЉуЂёЊЌкжшЎё6еFЧ_GНоЌжЋГ.Щlž™`’ДЊƒЏЊЬTuчЂЊЖю>ƒОNŽ9_ЯєЋY>#w^˜,ї&‰mщ•mTZ”}йЖ№ї˜ѓћЖЏџЫ…–пыЊШwrЎ‹S9$eЅ‰lhк(ЊУ=fќЧ‘Ѕš†ТШ‘4‘<ЯvVкœqU…‡œш;K\№*ЩО9іŸЮбЗЋќЩrыеюЂюUDЌДкnЖ?>pAлЬэвiЮеIIKш—ѓ4uoѕ1юuХ<Э‡iz)в\HuШСГІq<ќњхмšЅГœ/ѓm[ЕѓаМЭŸ§QixћOљ€ЫЖоl6KgИЛmю\ВSЦшlщ(g['Ў.­вО &Y:Ь™6JлRRч:СщЅуœeЅSІYжкWupK:Ч*Гޘr_y“ЋP—A-ш лФyk]лmЕ.ътmŸъѕ&ŽуіE№ЎЈœіЦVЁђ`Ен^їЙПќС+V‰RЦЉэ:/ЪК(іUnђUS>аbмnVЋuœюЎЯП$жЦ:ЋƒOжYQVe(л l–•Miя-чыšФ'ЛѕГѓ/Ъ*gН—nв,дЭО,ъЦЋэ6tѕƒдGІs‘Ц/ž>nvЛxsE/~ј’е./ƒ•д&Д!SE3ДОh*ЏВІ}ˆњиЩюP”>НЙzzНеFтoЃењ‡ЏйfКЊНuepemcS5}Ъ}Б[ЧО,ЭC„–6лКјњњzЃЌRy–$Л7‡^ЅЇаZщВv:4A–^žћPЗ•oЕKДwаЊує4k&Y­bхt–Ћ|—эnо<мюф‹ѓЦЕUžеЕMЁф­к7Ўъ •х:ПџЬQМsU0.нnЅ()№ЬіУЗVЅЇ†сх§ёihЊЂh|f|езеЦ<аI/+ yOЗыTіЖ\ын.гъЭхБ6VЏirЦю[ЃЪЖU›ЅNк†nghЗЕбЅкЦ&89>ЈЭЮшdЕ~SџИQ…‘Н;^ЫчОЉCиЛд†}“…Ў0ДЕ8›Й'ЙЕ:е&‘ЪNз›7.ХЋМЙœžkчjЏЌlЖЉ’<ДCЎ†R?Pшl—z“%кЈ$QYВгf­т7-ХgcЮmУFх•єшТ•­’;оEћіAЖУЏIoŽГ,нl“”єі&ZПБЈ_Ѕ:Э”їeЁB‘Чyѓн^GJкtTдаЃ_ГйH+“]e}{›КYНiмЧ_Ќ’mœЪnX[d›mЎвнiљ™"Dц'њНљўњƒGђe-MЏЈ]юЅ‚wЇнцєxЈ5јFп+ЙgН-™_М{ћФк‡*$ъ!6’?ЭJU+ЇКрu}јЮэs_%6Иэ6^8к›•н8Ž}лЯ}SЙчяп>їщ3Y чњ!f:eоз§<}g?Л}ђ—?]ПyЏ_^= whкqœ†Ё]:Юy†iœѓаuг$йї—ё)в0JъišчУћЗwќ- ё№rRcЙtšs5ЉщуёW/cs ŠоЪšQJz–šЎ/Є8nl9vхл|кју.ч?x{­2­wK‡ИЃm’kmђM­—ŽrОD[чŒ1YІ•Жfщ8чйlsWуМ/ яœ^:Я9nЄŽОzі"NЗБ–то—ЕIR[жMщtvПYПgJщ<“іeП.ЩŸ§№јЧ_>ЛYХЙЮѓ,ЯЕЏъЂhыl“†}#…т qЅЮYkД+œNVЗЯ|њУ\]­3Ѕ]8Ец]ъЊІmкЎиIћЋіћ`еdЮГоW…<^oтЭfѓтХ)ј{яќ‡ПŽўњЇя}№WlжщЉ9kB‘чR]зд­лnзv•ёїy­ƒжЮЩят8WЪфIЊве“O?ўх{бЃO>ћјћ—Ќv™ЬЉ1О№^ЪС†Ђю%u‘oVIг7Со{шЬЫп‚Диt—Jл’9WYЎГеееW?ЎŸ>}ќк+L7л­|UЮ•…жЁ,ЋвKUлrпд•й­6ЁЋУН/Х=еFБпћуЫЦфЁ2™sйњzgЭVe7OП§шЙбJŸЫ ™gy•R-uуЅ ЌЏ:gOЏ=ŠюНOяЂДДЎБВБ•2oВ+J;“‰VёvЛЭMœІWЏѕщї?пщ\циЇRќЕќуrWweЈmnЫЮЋЖPїПГœ(—и*—.цmцф\,G™іфE’­Е‰з_МЖџќƒЋ8‘Wv* iдЁ•уGYЖё;]ѕ>mћ@Ёг(“faIskŒ-|ОS&Ž’l›Є/^<ћфнзBПїљЭ*‘ЃЈВE%Хм–ZеMхъ"SхафU§0™_‰•ЪЖЉTxІђ$ЮєZBяvыgOŸ<њщЗЃољљ‡OžЩ{#;ЕЏЋЦзЅJМJ_e‘4шшЮJHІ›xЛЙIВUЧлјъёуЯо}GžпЄЛгo?џјƒGŸЩЫЊФ”EуМœ7”еq^˜HnМHќћфЋu"70/ЎŸ_љЩЧџёчŸЪd–M%чЃ Вѕ—Щ K’MZ”roUhyWфќ,ќ!Žб?$–Ч—_>yђЩўќ§на‡Й/ЊЁoхxёѕIѕf#ћ—ЙЛ|K>лШубGŸ|ђўЛПјщче4ŒУа†z:†ЉОКёфIЌЩ’З$№ш:ЩмЗU3NƒФџК >zєфљѕ6^8кeѓ0Žѓ4t§$Sоїaщ@ча2П§t˜Іy>MєАDWЛГ|хЯс”z’%9\ФGЃщ(ІУ<{ъ.с#Ц(›Nއљ0ЯѓaЌ—Юs-г; ѓ+SГtžГЄн,нCJњ0ŸšШeЬtd%ыэ,s__Dѓе4Ч—ЧуБ+/т?PмђMл6§ё8нћнп?ЙЂ|˜q€%ЌуЭвюj•XgtКtŒ;Y'кUT’l—ЮrЎUjŠр]/о;ч.bЪГ,m[„ Щ‹ТZ_ЈMЂ–NѕУЄž­БЁЊJЋ\ЙпWжк$1fї€^МИyq‡сз7›$ЯwОЌKяДoК*Ћ”5їёћVI–ЅЛЭљБЏn6лэN9­%uхЌЋ†Ў-eђ­ д/6Ъ9“ч*н^ŸuС'Ožпlv›–ѕg}еXуТОkлRхЙіњ~гоZЧвКd1yo•N~џє_ў›7_ђеѕz›ЈlgŠВ•LЕіЇд.M”їŸљ&зЦ™0щ\Eјv§лПzУ_оl6ё.ЫЭ2{ЊщЖ.CЧf?tЕI]QоъTЪаKГue%ХЙyq}§ѕѓПј›7\p#ѕŸч6m2ЅLQЗћІіљ6v}ЗwЇw­КяЬБ>e.C!яtАyМ‹SY‘Ћеѕ“оџйпќ‘р7IšЪ›уЪRо-нЎЎі}[К|›дВU& ;ПпЬ[™ВТ2ЫЕ”ˆtЌ<3ZiЋвѕегO>њјѓЏП6њTёы\~‚іrEpFЪ*ДЃЄ5ЩжжMыvVžОзЬ’@JЃ№ЁЎdž%B0Ю_8•юВјњъцf{ѕэш,фiМQ…ЗЁqЪwЇзЉЅƒј~’ŸeЊCлUIюНза‰М—’Ёhšђд@œєтvMЊD:Щ*6‰ЩОэk[ifuQ5Е3EЛ/ƒM3Ѓl7t•йmTнЗ:6і~7s%•сrл4вN‡ˆтіј#?hывэZ‡Tчып•Љі2З*дuSYSuMUц;х]=t…KWq9ьУ.Лпэ%>Mnš‡њ4гNlR'Aо|y8Kџ.rЧЋWЃз2гХўtжŠjіeІBгT>—SШЉ.J#ѕбЕЕоЉ{MKК}ўjјеs[iзVЅNkКЎЕкUћЊА‰Љъ§XЗnлv?фб}vL[“Jк}c”.kЩ\ћLKСЪІ‘ІЖr™”й~љjјЯђкšКЉud”УЈМ+­œH•дG76u•lха7ояжВ“}"г&tAjANUSъМЈ%О’ ZЩ‰B~к]}ђjј'_%u)бШ;P•uнЖо8y—*/Л`гЗM“'yфћ{Э, бф*„КЕЛЌЊ 9ћШMH]ua2чUс2)ŽѕГGЏF№јZWжеUШэ)tгљLмqЅЙД•ВЈm’EњОO™NliЊFЅNЕфеЊ­Б)l^T&ИмЉЭеgМ§‹ОмШV/#Œ-ЋВЊ†2OC%mC%Й“нe_чr–Ої›€4В!/Ы<“B6Ё‘=Ѕn\ЈKЉкЦzЈфљуї~њj№Яп§шijѓаHџ0RKuзиTіiяYюЄvНчЃв+љ.’›бФ—A—•б2ЫІ”Ѕ–…*јt›ЎПxєю/^ }џї>zžЄVŠX)YЕeнШК•†SœЦwЕj:ї0ЁEGЩiE9ећг~'››>Ÿте6њјУ/ЎЂеэ‡_ЯПјєбуgQ&1,)§*([J‡lЄњћFЭУнеŠ8лFЛ,“S?‘bVRЭЙŠžоDЎф‚‰ЗF6ьЭѕQЄхїVŽпu8н–•„.ГА/#}ПЇЛ?fГ]Grы—J#Ь’mМйЦбOЂЯд~пїc“ЉvD=•‘вЕ—fSШ *•kJ \<ш,ЧjЕ^ЇщіХ“'_>Л‰>ў8КъІqшЇVЙa>§ўі&rЛ]eЇ[ы­ммšTпяЉџёіњЩЃGНї^”N§Ия‡6TЃЄЦт4т‹ш‰ЌHхrщЫ‰~АХw6?ѕƒLvзюOЁћaПt sc/еq˜ЦyЧq˜ЛЅ#Ьгqžчi:$ѕ4еK:‡„–Фћp<Іi|јЎі'ЈчQ"цг)’ў>9z -3=Ю/2хCŸ§ј%ЫkцЃЬђс4ЯГЬєИ|G>CоžBRгВ‡Ю/ш,jx9^О<Эѕ<4!љё+оnъбѓЏŽsW\Ф2М•(­"-[љEДЛ“ŸНѓЭO—3ЫъgKрЯРzщwЖ=§џБ7KЇИ“б6SжыlнЌ6Щ.^:атERc)<4щ0ŒИиQ…>••y2Г№ƒ>РНHuёХ3О№ѓщŽЭхЇ•ЕЈ™t]ŸМхЬxo-]ZsM9МЫ!­žCW1ЕŸМ>пUD@ГA\­6оq*ljЂз5ббyПАшŠpЮИЖ ї‚Ађь Їœ5aBpЦ„БИZ !вЅфx]Й`‚\TѓЖЎCM7Э…ЈЫb{qvvzќтsЇ\дђ‚БЊ64M—œbЄVЁ‰Š”ЊУе/*zWTsV~pмџВЌЌ((‹ѕхgNЉУ™Нж‚I”BшњЦk՘ыћ@J’šЅEя˜Tx_Я ІЅ?!ч’Гj{іњйOПМY]pcц@ЃтŒFŽkLп7Иj&КЉUЉкш–l1ы тцb0ГˆˆЦ ЪЅсgBжЛѕХo'Šв№]QЯ]NЃBtИ4ЪЄєcпXЅЈя{_­IзEЛ шЂтЬtфtŒN`„@r8ƒ4šNt§зЃЗЪ -+Ё™škOХф`%ЕІЇTЉћЖгEсл%ѓeHU ’УЕBДГѓ …лЎц­Љ„ЂZа_M*/Bœ+P‡&HщP‚^–5ЪИEЗ4І6ж_NєЊЌyŠ’iяccGMкНР&e 3цHёщЅŽв6h!BлиEЉB‹єeGгЗ–ЅŠБ‘Eг’•Xq“ ’8Жp-ЮЦ$8lл;UoЙdVŒне4ІЁLл;ІSлD#ˆєОЧEдЅˆMђДД­[P4ёЩ Ё\з‡rMˆAaœА№ОЂв’щМњд*6Ц^ФюV1•ЦVbNBЌ5ЉЕkЇо‹’ИЁоЉfAб;щЃ ТtН“ w;՘4‡N”$-…чФX\Х'џКаІMащœЌЅін…pM‹;ƒмїг>Jd:W.*š! jЊcчXUsс!hЪ}ŒFБВ–&цcВьубЧ5Гв)ZYлрC?8ЪВZcU4УuлЪ’"ЛcСуrЂkфЎ&Т4­*v1…lЩ”Kс„*ŽpcИŽ|<ќшœшd%B-kxŽI}i1 “mкw­н}[ёЇSЏрD б3T‚ОVSDПAqbX•H „бЈOЋСƒ;бFQfœіЉu\†ОјФЕп]ЌKŽ_RSБ˜цеŠ+;j­З$FыS#ˆі!%Џ˜ЖТЃW’wОћфŒš`e€J&VФ!Jюл>щ’ТN:фGQ2пЎVKŠЎД!LЛdj-=y‚uGО~џњЇЧ—­žШ1џЛ6*jЃЗABtЇ‘д7#КZUВ\IДЖŠbо4ЃЁsђЖ”ыїЅЈКrюљЄмœПП 3о~ќ№Ч§ў˜єjф\Р/Таy#t БяєЎаnмbЖЗ)сuœPуW aіИЕ­цH*‰Ў8ysђђёџœ dQЯ9’ХёZr\ Жqш‚”HАnх–ј!i%—]”œ Id№Ю(МgJpdЙЕxSeД‚VтSЗЙЭТЬ-7"6VЬUˆKЌЉдЭ~REлШЗ;й'јрRЂw”ж’Kє0m№†)Рђр€7ЎЈ–’[%жѓСЋZ в–SJа-.ГVе;цтИoа* .v4Е)кХš9!”хŒеЎщ‡&УЕFc\#+бжQ`ЮИљVџpw%ЂkДСa5ЗЖmДmœ&м…v?Ж8о-J‘њ6ФхœКЈSдИ.­—66MТ'ЇHЩ7)c.ш{+зИЮ™Жq|ЖѕЁS2v ІiДпNчЕьњdJbЛ&…Ѕ"Нн•D8‡ь€8rТЇ.jсЛшeY%"zЕ’8Xщdћ SB7‚S”›Сб(aдЃЦЮrОыrіЅкKAv…@ъ:№ ІД№išЄ5AЎJ™`,[ръЮЇ5*4ЪŠк:лŽQ"ІшIBžЎ†(ЉlЦV–Д‚_fh*-*$,њD— ™r ШmФт[ЇUU sЅЗ˜”kTтСе… MlFд>ZLv–ЛЎ1ѓгWћ„PЧБѕ.ŽЩ-г]JИœC):KjЪцюжXYлTЇк›б†aьЛwАzХœыМn[ЅˆŒA#­q+Цу?і–сК ’ЛОiШЪ ‹ ѓмуц8uЌJЂ-”DНŘ%ЄГЈ= mтdЕК{АzrВlы=С W7Ш3ь TЊp…ЛDUлtrЅЗTs)Јu'…э,&;$CъZLєЁMXI˜ а†і1‹>‡ш;Ћћ/j‡іЁRC#ЗЁoЅlЇЄi§p[ѓˆz€9.7х єm:&EŠrжа%tѓ„Њ‹ЉСƒQqŒBEОЉ–-гМb˜œMЌи‹mЫЃkGt,{Ÿч˜Œ={yїИЛК{яЧ5ГЩ‹„иЪšaпj“žCŽRЃœc#.7дЫ•\rI$\Vp L9#žKшu!…DM1­"юищіебГюqяс§g•oхь!шEˆzлjŽЮд„ЊдЉuЏЗЋХŸ T CЛМДштЎЕ л5і%1{a€ дbЙ=yїx~oѕфХГчЏOvиЎаQPž&Іv Bbc‰lЧcВmbев’?РŒШˆъ иЇu„hЄЌВиZ%qО.ЧЊїOV'›нњьєЌВ™ƒaj;ЖœЇљR’T“јЭ<„œgІК„ЗЩ wшwI­ R\@пТ} њќhЕNsZЎБЃЭЫAl›БaЂыrBК„ххцA’ ЖrЮŒтФDEJ3ЦИ lGжgbl&ХЋUх{ŒoъќД :X œЛ,kZф6сcњž-§†’”:ЬŽc5ёIIВйА@.O^žФЋ~шћ$w;гУаЗЛчЧЇmH%­ёИˆЃ^лVlž6–[g?+Ми­ LўЦ)Бyѓf+жo^ћЁыКЖБЎычQyvј№СЃЫn№ёЫѕ~?]а<ЪЇwюоЙї№№оНЃ—ѓс/N‹’йхжяП‡vёДПОКККЦзЉЏžо9Иs№^ї?>\XзD.љьџO1Bє~œЎіћЋ§0NSКmE_КдёјщемЖЂЏР_С>z$є0‚љѓх§Я?Кў'СMге4ŽћБ›ПтЛЉ|tpлЂО1§еДПКоУѕЎfљCqxчЖE}ЏЛF~ЈФЎѓ'їПбЋаЃ­4э„@cNКm5_ “’Ќx7ѕё†ўАљѓгб‹пф[‘ќ­ѓшCг~§Х?шўђъЖќ=пЖ€L&“Щd2™L&“Щd2™L&“Щd2™L&“Щd2™L&“Щd2™L&“Щd2™L&“љoіЮs9Ў#ЩТxˆ§Гк A'RЂ$Zб @›ыЪ{sM78яџ { ’&fgЄcW—TlдAЁеЌŠЮ›•yђTѓ*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRљгђэг“7лЖm>wЯљ“зћЖЈ”|шКvѓЙњПn(g\jkeЦ;­љŸ>ч?ь™” e­TИCаЌћмa§{ЖTY­ЌRж(Х…qЮ—Ј?щooо4CПп\]}ьњч›–HС­uоj#)UЮћ€Єѓнšaў#лž1Jиаn.Џ.>fУƒW›Е!”’жY”Е@ЁИˆј­бtн`ІR2ЁЕЄ]л5‘эгЏоtЪ‚e\YŒЕ75‚˜mr§OzЉЅщт„В~{ѓ‹ЎџыЗwœЗ—ZkыŒтœ1dл9<2Го!ю˜дъ1ЗB ^š‰ ­„дŠї7uљ№7wмКџVX#•Aдк•=.x 1aЪ{c|Nkчš)­•ТGr*Ц N‡ОkwяŸ?>§_пrч1(&эJrж6$Џ9a6gТФК1‹4R"p‹ЛџХЏF}ћб;b”."qЦTˆIгh%2цшu=Y1f|КTЮ–PuHС*d Щ†–Дл7_ŸўчПю8;{ќЎэPLЈjsЪ99кcКрЇDд!%gђж‹Й“FHk9“кЄфoъS§д“ЄпМ|xіх_џyЫљЃЗDЎIЧЄђ)ŽS j`кљш{•S26Ћ5#FБDы‹s1CЖ8DС Д%'mГ{§ЭНлЇџѓ“ ŠЙMХЭTTЪуœ!w6Ф н5~Š^Х)Ў4њ оAє-Е):ЬДўOEJцэ/^<К{ў?Ж|џІWE!%‹ ‘(‘iВЈ)7O9ЊnOrД6фq-сЅŸdп Іt”ЕEoвŒ"Ѓ€ѓцх7OОКwїьєчWћэPЄN ŒE ЪБ,а֘=й5vŒСКМRЊ)ДBкѕ&Хш1ЪpРiцЈn„.xЗнО}ішєьfУІG‡R<žNС•ЂoёџдфУшЁ9yЃия†<'kт:AwЊHЌ:yГ/:`JcГF8e)˜ §›ћЗov`rЃ†0њк朘‚ЦіN†љ0{#ь4fпmwH-КJаhЈ2 ‚& шЈ†GАтш‘A9Р! pбšЭГeЫaђoїTК1Y7Žх)[сУ&Ј5_#шaшіЛ~А 2F г™ЁqБ6F- ZEИŒV6pІlBRAЃ‡UžœіcР”ŽЋх8БгВјЭ^N‡˜тAhБ§Ўх%J?YFЙЇ:t—‰Ф нЃКc6ЂмXйб*!ЩЩ(б+Иа”ЕЩВNДщCdL‡iIЭІѓKЮk ђ2Lv;ъcpvђP2)ЁаgчŽ“2. ‚šQ—-—\јЩ™ф4ѓNфнBrDЯЃѓІ"’0Nќjg1hVq„HКot™€a–„KŒ ?^™8{ЄNB|JšCaЪŽзDСzGфžQ”AяEШПpZ*с7[‹сhзКыhЙсiИvХЫ$MAIŸ=дWUИхщЅіeЧѓ}yŒЁ o&НO“їHЗьЉ iI0RuБЙrc№f !ytа—;ЦzŽ‹в˜­„hЎ8-Кb7)&њzЇW К‡Й3л‚bЎaX@ЂqоаiAЙ’!Лˆ Й”єmй№№ћ+1 ~‰BТxячƒQs‚Рр21Юžu,фиэ\дЋYSдh€5‚ А–Сјфd0 ЁdЂ`P3tФIЦ†vї}Y~џб j0юн”сY {VчЃgщ`QChЬ—Оз!4MLынǘ…ѕU2'EZŽ4zД_Nк№=uUcюP§іЧз_•хwю<ј28BЎ­2†CmтЙЛЮ–5шeДЄlьњДNAџ4 юW9ЋR‹[ДFЁNбоЕЫLG˜Іэыч/•хgwю<ЙЂ:GьР‡<Л8gЅч)шЎS0 aŒš“СЏѓIз“ђ-MLrPpвcр Bы dЇ<& w$†элз?”хч_=ўњхEяšеb эг’‡nxдG„3UИP 2жНŒŸžЙX№OA›2† ЇИТ oЦЃ…ЁЌ}ќђнЛї—;Н ш:`б2)–œxЧ}†‰љyxЎЭ€ %Ёf/˜ƒq‚СcкЧЩСоыОкz]„њХžsŠЖAЈl5ы•uЧYа8ЇЈ“Хbх$џчВщЪ—EгAћ`)•№ї †uЙ‘`с{ЁПjП•ŠкЫЁpYєA‡ŽbžcЖš˜ЁзвCФ9†wо;јlІМщ‡Эы§x˜ч1;rЙaхe^иЋЫaЩ­JИеъFO№t Gg˜ѕПХћGжь1[iU‘бo;ЋлЋчп5‡y™ЦqL0Ciœцљ`Ÿ==yТЩv+Šйj_їmбЪUПUњuКнnš-S”У[“Ы.†цЭѓG_їШэ2ŽЧiЙ>LумNЫtX–ыусx№‡Ѓxv~rzrђїoqОuБщ(љ_Ѕ,d9Ю‡УсoзЫёmˆ2й?К{rѓёіпз\ДЋмџї˜CQŒУёАЧRнучŽш#Ч’ъ#‚F}у<}юˆ>‚€b†d Ќ‘эђђа~ю~•QбЧ’щR‡y:~sёЃcˆњњњњУБд4r>§Щџ-МzћN,ˆ)ОFIOбГ7ї?wPEЃcjљ№с`?щ?~џжЙaW*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•JЅRЉT*•ЪџoО8ћњйлЫ}лЗMЗџмС|,їО{Пэ eJGoыšЯаGpўэ›§@Ш@˜Аж9чфŠџЩ=іЃW›AF™BiыB Ц8oщЇфђbГлm.NžœпњнЕпО8gœKЅ•вZЂг[}‚@сrпQY"рlџіћ‡ПЗќќщ†i-ЕБЦYkЕ:„р­2ёгEН„ECсМ щ/_?§Нѕч/Ж“HpLЩ{Ї9сЦЛіЩ‘OЃ&=S.ZЅ„ CЯhЛљѕНћbлSqSЪzo$ШњMa‡):ё bю„ёV—ГV…*HЗЛx§oжџхжƒ—{eхФuљЉ/яЋcŠa§_XOpВ 8WЦH&$twwѕ›ыo§ѕь› ŠcQЮB<8Ч3;#)ж‡фP2бђuCО’Јf‰Я—Ш1"‘8t…2i6яŸўzCžžо{IЌ‘BЃ ‘[%]Ъ!№Ж':цˆŽ“‘kЦмЈ’fc­1Кœ14ЗЄœ Щ‡Э‹ЛПєэЧ;Ё@РЪF(T(чфаˆzšЦГ3+цz+\pвyT4zЊ-ЊЛфI”нЛЧЇ_ќыžГЛ/ZСˆТZrђжIТѓYƒ<“І/яD@ЛђгaЪБvяŸœŸžн>;=Н§ѓžЏZ]цJВЁЇѓ;Я‡,Ё гa œФЮK№СЙ•ЊZЦ„DжьЉС‰bЖчƒџеХ!†ЭЗwѓйщ—Ї?яyЙхE5Є†Зн@%JфxˆZПFЫњžЅCђНJЬФgC}лЫ# "Ё&є&„OjuѕьлЧїю|yыьЇ=ˆ“ƒАQA Щ™4a<,^IЫhћІЗ‡Ђbн1я4’Ђ‹ lбєcі‚єDY”tqDR§ўђеуГГгВЅWZ0?Š"‚FGWНЇ~Йž!":Ї$їШЧНJа ўю]4…(ХЃЧŒ!АBF БхЋUџўл{7™V.•сЩ(.,pJ9a'DЇх8Z”зВŒЎйv™ёЗkHuЃ=’хuПmŠ"ФŸї!‹™ИёЦ= I–vћїБЅ5vŠ0Fхm—ЦrР,’xЦ€ŠР|ЧШfБсЂV˜ŠDCуМхэ~@mЧŒ1Ё0Ч1Цa€аŸQУMH›ЬлAЖХЎіLb•(w)KЬP dлšщpRЧ1fЕн№ДL˜ц+д+чЏq%эš/Œ#bцЈbq№#šєдh \п ѕЛђœ\ЦНjМ$F뚘cN˜ Qi9d!mžFлmPфKТi§ёAs\HKЬ 1и”=TK)ф‰†хQМoА$•ˆоMЅpS‚NZ1РйљiЃ+s_Ї8BЌ Ј z…љˆчYЁІ;GднnKаO0fV•q A&N(еОч<.ЩˆŽHуЖиУ$&_HхL†A[эІ1ЦрKПЦt<:JЫ;jЗeёИ$Kў№ єЃЭЎеХMf/ЫHQх^эДŸœё‚#їyv’Жш;u‰=DQю|ž’зЪЧl<Юаw­ ЕaМбУ Жtв— е юCЅЩ~Ы‹YKШl9ehBі % Œbx ?ކu=L+5НGЉЈ8ЮF‰=4sœrбŠ=\љѕЂ9Ч;Ў?І‡Д†Ѕ&Вi Дкgh—’‘ГбушаЁŒK< МющЦrџкд‡KЫЄ Oeн4cаšR"#у‰œ eМЌr/gJ‘€Rx?zЇЪm ZmЅŸofŒвd|4щЁ)ЊyŽя:)8Іі2сЃ”оЊ„9’=5<Ш‡I іХ Ožw {Ÿv3Ю{шTˆ)'ЅЇщПй;Џх8Ўэ їи._И|Ъі“D "Љ@LH3гqчмy@Пџ+јп ||t”e (U­р`шљ{ѕŠЛ/!‰„ˆL2єнpiЭЩV<{]Ђз€ьгЩrу4ЊJ˜а+ЖNыl9GУ жG3“weХ‚CЧŸ&ЏvMC |эUr@BSWнОz•+ту/_”gћ8OJєQФq4="‚52 SШy$В‚сŠљƒh.ЊM‰‚‡с0 FVёиG…кU§Žкb ŒŒЕеWwБро§ЧЧЕq1є(юnГq(с]ХнАpВїP=‚ѓ0Ђ![чšЌ‡оЪF#YїZК,Zwy3?ЙЕnvo_=М…УямОїј *ŽOгduP †јДFQE”­JЫhšЮ^˜^nАн16гhCŠ{Сэї0-З6ЬNхщБ-/оО~’ѓлwнжhЅ­uЮ8mœГК§|ЄwСкКi9t{|ˆоˆнЭJ8==;=Л(ыjѓъW}ВыИ”JkЩ…4.јрMН“7љёМлІL(kљюэ/RwŒqэЌQZIilьaяƒЛЙШ.Bш|ƒaхЛ_\А‘8=у!a(АкЅНv}ŠтfrЩІe“Ц{‡иRВkЖП`ы{пnqŠчиG‹мЁЎDЇ>d Vо€gя˜рŒ›l4­E'•рЭюќgEuжtB(ЃЅ2.Џ9W№>зїЮЉƒk.9T"šЌAкRЂn^sжР\wўэGW|ђщ7gЬ:­тRЋь%Rt­N§8E—Ќr‡Ю"Сe–“гpl™_(T ХЫwЯюќш’[ї+!97N!у)#СђКфq˜цшЌЏjь .3jCШšГщЄ†ХЏœ[tлW_ќшš;GBсфЌE4j.]Чоveйкažœёq@еЛœИŒCф[-‘ё ёˆчйГЛЭѓ?ЖшгчЂ‡Z“гАqTлж­IыдG-ЌГэЁ4Ÿ7Œ+g=ЎЉюZ”7Єк\‘ЅRж{л|yї“Ўњту0—ЇOЙZ 7NAГЖуf˜‡фЄДњPeцЂх2ЧQŠ•…I`8! *j`ЭйГ{Ÿќѕ=јњЌСљЁСОу0єЩЃМ„!y‰ЫІќ4LЃут`^нICУe[K-ё,П?Ъ…Aw•ѕлЯoђ}[п}zкЁx[•ЏŒё! ѓˆыфЦy@]Њ;“†qє^'$ZxDHВъRqLˆ@gс"еЭ(&dѓъб­џќЏП_stвТŠ9ПˆКlBxœѓB‡БзMХУиЯНe-?Œш2;‚KСр­ДMC„Ѓ$„–ЫE‰Щз/нЙѕЩ­џ[tZ ‰š+cwвЦa^І`ЕCцF4<і№%#њЂе0lJN4љНS§8ЄЌ`А1Š#Я\yќе“‡woнК}%ќЂmЭqNЙіZH†ˆŒгв#ћAtяM[)ИК7pГ ;–ƒА?MgbcX[1˜H”mUžѕйН[ЗЏ4Л(a^iЊ5К #)LПю{#=ВЕWэЖB*щsжђкEЃђЁo’jыZ!thбС“;ЃuШ„ЦH–НЗ­ЊгЇwГшЂQэwŽ”№—lјёiъs’ЦПІЫ5HнЯSр›Г:LМЛ3з.šхž!єН(›ЮOSп#бbLХ4"1ˆ\uЪœЁэKІЋ[щхЫ{EбЈFD4Eж0,Зѓ:Цмd)шпПŸ5гмынfkёї<ўŽНю‰Бix№ШYiN6еЅJ^ЕUgб ЉІFj”яфйЛƒшetž—ЦлАЎ#КQ"пOыъ;“лМfГх=ВŸR&\wahjb2ЭйNХЁя:­ГЬшУ”Œщ*ј.ъDЛƒwŠг‡ХЉ3-ї№tIpNњyPЧ!л…a?хњyPeХђŸƒЋywЭЂ%†Ѓ!№нyЅ#Ъкф=мУ\ \№šСaˆКf#лŠ#"Я'жw­ ѓ wGFЉNы яEяЁlкЯјжуБЊ›Ч‘­Аіz5уђJUyО­R§8ц€=jCяЌj˜ѕn4Ђ„шэQёFСW8мшЂцж!“ЗШь:ŒKB(Ў‹kъRЏKЕИюJоd—ѓlsV2фч4бШЌyƒO:Y•v™мJKСЙMІнn4№ wЕaœƒgДїh󕉞бЊМ‰}ѓАxЖсжBt˜п{…Д‚œmэx‰іЅSКuaяЉ7U З2ЌЛ~бШcV”лFїW†жmƒ:‚Жы1ќ)T;?ю“сLыеюлO‹Я_žV(Е—Н l‰ЈэїЫ-DЋљ}ђŽdЗншi0щ—*&Кн–љ„ёcьUƒQ)ЭkЏ‡ н)zk љs4<ЗмN|~Їxјє›угFhk—ХЙ1ЂцЁђЯгˆFБуЊПЕдi0ч…ЮчqбEйЖЛD?уuгa>Eн0гœч-d53Ќйk:сМhŽо)ю>ќтщѓMЎ… $іЎ•1 MB ЦД_fЭатщ‹ТN!\{ џ@еэj\NV•"&шUa•::•‹{Ш9@Б‹з_мЛ]мО}яббЋFх$ГO:œhнiРqвŒЋGхя§ЖH}ЈMН]У …K*Pcв<*зфЌPбъД ƒЏђnїцыЯnCє[P§r—ЧЪy№vPŠH’fo™–иU2ХЂ€Ь4юъmъu[УrKЏPPeаbX?-№!EЧКђьѕgЗŠ;їю}§ьщq SЇ)йСЖХe’X#ыFуg]еˆг!7kИХ sЋКq>‹VxКdСЅЕЗЙWcc/ПљДИѓщбы‹ЭщI…9мїƒGя­<*67гh›ZІiP53алаЮ хy‚ŽЂn-ЦІ„шCSUkЎ9ДЩ†a:’<9*ю?}Sч§ЛЎƒWР›НD$І1ЕэА&О“улѓьЫ‡еœяOm:xЭМ‰C`Й:$л4ЪЃАл wЇ|šWєЎќЄx~кшМЯЁЗ;‰ЁМ)іОь0Ы­ASЄМЁ]uЬ|Ќ†ЛоwКŸа:ЕХЃ5О-ŽбќLУ€В‡zWžїыА=.йSяLиіGЮ3эу ДлёCšІЎВs M‹Ь{‰ЖН[‡yњ[З‡ЁЇu™ћш8ЏћЕ>ТЂ“ттMСu]<{йЂ5їЅ›а/~kњяЉДl-+№жОйmwхiўљSЙпЯѓВЙ_зyœC“wSŸп<+ђ-ƒЃч›Ž;Еsž™ыюњ $6&7о5в^m>Яі,ŽZИЧДю!y‘срЫА{Œ_<(=*ђ!OžП{ЗщЮOЄ(nжЮ эjЮ7o7яЖnѕ|~??~ЩaтeйџwЖє~™чyѕ7-эghыЖЛxUМ§њЛзїяхЧЏЬхВ@ыš•У?–e:иЮѓяЃоМ-^}їтю•шзш=Ё7kОђ“y™nјЖья`‡М‘ѕТи—ы<сљђЧПyпР' xЙ\Ёѓ“y9РuЭœ‡aЪю|ЙLp‘iDuЙщМілyvС‡Ы§ўVЦУ8NЫx€сяšЙєZ­—0є0_"ыЭhL>ЖЄ_ZЉ^7ХeЪ-ц7‚aёƒAAAAAAAAAAAAAAAAAAAAAAAAAAAAqѓќs~јєйёЛMУкЎЉ6[аЏсŸђУѓ‹ЊвXяМїNБ?њ‡Ўўk~Ј„PЦ‹/ыуа;нžlaПDчЌRZяC№ЮІ!ЫЌОYчeЕ;ЛиV][^Yь/?{єОм4mл1Ўу0Єcп‡рЌКСОш„`]'”uZЩnїЎИїГЧŸUm—=кШŽIэВт}LСzvC’‹,ЦЅвЦhуœ‘ЭEёфgМmBу“‚Щ0 SpОONšъf4W-ƒЋ`:ЃзŠэоМШПј—ŸZqЪ5атПцR iЧyRp!ЉnDѕfыи•oxoЕбЩїтьЄ(ўуљїXRjkƒшrˆИ@qœR№†3жўѓъkXoФЬ•н6RёьсэЎxќзŸXГ…}aS­Е‰}„C МHуиЋYЫes`й­QМeRй>ИFk,ФH.лѓŸ}ђ?ь]‰n[W–фw КmYВи‰—Б”іж–mQ"пrї}y )ЇћџП`ъЩ™:’™€Tz€[ Fт“Я­SUч)€nПш’Х х_OЧjf1сRŒЩтлAТХ!knЄФrэBLh#Ra Е’\rљњћлЏZ3СЁвš2%!Иp†Њ“—T&­>`ЭœS"„ ’%oN™saцІУ>к‹—'З^FЄ B[-ЄЦ;PФœ—p1ѕЫІцЪЉCе\vгgWЄn@UСЭЭˆaКHЗz§ј6Z_ЁНZB­™-$/ŠЎ%:чО7‚mNЊ;TЭ]лсЇњ,jсж(1Wb њщ‡Ѓ[Ў[SТPpˆ9Ј.J)yбu<Є8D)ЛГ|˜ППцЗ}ЪQ ~bЈ rmчZ8m/^;‹UлR oyЇ˜“СћSЁO‡Цќ0dя^СјAЬБЁЄYw:ф g.Яvьца $A3Кz§№шўЏЪОъ`‡NtаIf}’jЛaJŠcу0ЃA5r˜V7]ГЎT oФРFЬ*6оЙ`С‡Оzyќз{Gџ]і<.Љ`˜&AbЊяњ>`т8F}yъН…r" цЖыšZх-ƒтJŸЃїєXIzc0m>§x|џСб/—O­!вbеШkŠuBкР6]ћњсуЯV5Dњq0ЂхЦЮ§Э ‡€№Ѕнuz1д›ZИнНœ}vПEwЄmrЅ… P‹м%lесXAђlB5ГEкьYлHCщчяП[ЮНvЕF’uFyАиj&˜Д­№}єxЩж иsб5gш–3Ћ,EO WЮi ˜ˆ€ R J%БYвjGјцљїЪСќь0:œr •§—/=ЖB•эЏ7}Њнp=L=‰oФіZ4нF† šКЉЅ‹§b'ч5QуG #ЬЅE3UпKd*х9o_=Лd‘*1sмfќчЮ(А…щД…ŒC?„юGФїMТ›ФЅUЛЁp5HЌodHBћh Чb`грБgѕЋg•є–сиЇ^2…бћнЯУ,ь„™эЮ гїžзLХєш|оs<эШFЦЄъuгљ>ч]†жu”cгCб^YСёfŽЯю„мМxZAЬЁ."N‘ыdЉAЯзз’ƒЯі_вмт(šV‡1ђ–š}ы4LЯЄ/hхћqrJlК›;/iBeГ„щІ„m“$4яЛox4§VщфQ}яТјѓЮТў$їзYъ8$QU2Ž–6Tэ{{AW]rЄКЌнњ-T–cѓРРЇA›ъъќ?о{pђ№сЃчggяZ ЗЦz|йSШCрду(Ћж&К`Й?рЭšš˜9Э™,ыŠt0lЫZШpк%oˆ˜}’Ві#8}|ђфь|љщУк*aч„‡ЁWnЬЂc ‰Ѓkdl›лСюе зТET6эF!:†x­Ѕї§hБ Š3‰… ~ћєјфщйсДYз˜Yфяhh=ЭY?jЄюІЏџцюCЛйtЫїNч.ЯХЃљзчdžfR`s‘4юш7…џ[l–oЯž}ЗјЅг'sбЭ"‡šЇ!7;ЮvКГ_Ъўaˆk п\і8lчhдчщ nЗTiИŽцpœk†џй5§>6ЊпmЗЛэLŒinuїёрQёnзз;<щуП?;fl210sЊѓўПCдz…4šю,Zьџюџ{UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAС­ИИ\oжыЋ?ЛŒџЄБоZ%i›џWѓcе Љ”2Юйœ6JЋюЯ.ъїP3.ЅVJуЁ|№СчUsзTYЎ›ІЊVЋК­ЋПїтJ#PЗu>cёжрytВНМ‹bПтŠJ!8!L­%iWП§ђšБЎЉ7uGS>zoѕмєЙj~gьn•т”R&ДЕzюYўцы?Ў Ѕ]GЃmЧ”r18Ћ­ЦЕšпMЏ—Tq†ŸOPЕдCЅy}ёс7Ўx{Eч ”Ž‹„ыЇqˆЩ)Љ(­яЄf&(ЃД­7-х?Z+)Кj§{~Hk%ІQЬ.ЄaъГw†5еz}EP™еЋuеR а8fЉЅЄўtіш?nНфЈo=”ƒшP;ЃТЅмчфeWmкЎk[ј’PвЖMнЎРhДгЎP?Н<{xыE\ЁСŒ+Д8fЏК 11І~šwMKЅВ‡ќ“ѕЫVpZзVЁЁY8`0 ŒŠeэЇЗ^ѕЉуИŒтuЦȘ’ъ@ЌrNgдvB;-WtУ%#&.ДїА7#јЌ|RpH %ы7З^ѕ™i”їq:!їqA‰fЧьmТ­ ћ[ъ0cNZйВ37б]дZуhУ—/Žя§х›Ы.9eJУ`Єœ­мЯŽh8U!Щrha‡ЫН8LЭ ZŒ;v  yјрBYkєW] ЋГ“П~[t4mЮH ’5 МŠл)BђеЌœЦД‡Ј &ј~:Œ‡’…рAi†&‚$эћ'п§ъЂ“GsŒx{Jpх3žIJuП {xv>ЉдМš7UMEœјFuanоœ<к­…`эљGїuн9ј„ѓш6f|цœ‡!GЇ1yЬaўNШк е˜ПЎЊЈє)яаd ё Ј$ХщЂhЮКхГGїю§Ыu„kbHЧиGƒшС‹ВыЄЫ}и<JОїš7˜—Mеq“ЃP Љ њЁBЏqфRJx;Љп>њЫ§џiіЩ|œs?(РЏ оё4:ЄŽ~ъ­hЉ‰9Ч9kkу‚л{б єL4)8ЬФЫЃт”МUJRXКbmKщъХбёЩ§{їясšя кiцt4 Євцн.Iz(‡h[BœчдтДьОХškйm ђE'ЈаГPЧqЪшЬnЖvА€IоŸž={||oюіћХВ РgŸцW*%Єѕiк:LCпG/7 (0ܘS§~kЎЕхuгiS’(Тиѓ4FˆСFК­Ќž‹п,Ћjљіщ EhЛюДl6 ф0ОsŒ5xzбк~ьƒfѕiЛааиЛ=-Аe4uЧCH–P­uˆ§сг–u0iЅ,єLв†ђКbМЛњщ!ŠfЖл0hMрF8–с_мd;%›ЇlИh+›Ч/бхЧ щ>knД%XЌ(т{’вјaˆ Њus0Ф”ќЅуКnЅbнХѓЃХҘŽp“"З гn€c]wЃwУ.!b72ІŸ'ѓ0ЗWW$ZЖ›Њб;‹ЯMРєcс р)ŒУ'ЄcŽ9”оЖ 7аОw+œ#žе`ЕѓуЎwжK"LмэЂ†Т;šвѕ9dЧї[4—dЕ".9ЫAщћн˜R„жС ]њф5bЕQ•ЫеегХšKc…L#ь/дТmwбF‹`аeыђёH„/bСqЫїY4rs‰y VЕ •vзYšн,\a˜0љЧ.]B’Ю гОZРˆаkщЇYсДР;ФevMЈ№№oІ,лЎБ85g#4аэUѓИхЫ%œ=k ўэ”ŒФ„н)Ž[ˆЕА~œcH=зэ)і_ƒН›ЉЉд9hЄЖУ?ЏЃГ№"‘wQКatL4+Ѓ…GB^і*LuŸ7hА%œ пy;yХёfѓэw=ŒƒОrкў{Wк7r%ё6ТЛK")’К/Rдш$%‘ьnмЈћP8šœ™иџџ}Г({НобиГуІ$GT*дЄZ]ъ‡‡ї2ѓU‚ЌЉœF?>K*Љ‘WJкI7ЦqЙoЇŸж0ˆ”7zі Вш()™НV6”[Гб izZ*kXFРЦЯШm№бш+АЕb’R$[Џ=o0ЖB2eў4ЩoAфDŒž†ТCkwёѓ€^ЦпNМQоƒл jкс€@л›Œ9)›lйЈжVЫУ‘ѕ8ѕ ЏдMSЫЅŸHкЎ-iИmД.ž$)ˆЅƒѓч§ˆf… HŠПœqьТR=šZњС@G[08ьjЏ7šhиџ4ЃІSщYUСŽ"Йu ?йтдЂD`ь­d~5 Š­˜ЪŸ$K8?‹cAзaž…Т 3џиC“йЉ'ЂK 3єЂ‹šЦ ЮУm4ЭN3‚ъCчi ЊОСOV:‰сЯ*„ъ€oC§2PоЛ ™эœ Ќ}+˜Цљм§8AD8Lъ@7Д,+д`iнДЫЫС­F•ЫгT„’0R”•ЗЖуЈd  eР\ŠТa*ЁЌzЗŸ<~w–ƒє@†ТO„Fcf‘b}йaж1н0ѓЄЧГJzSчТvїг Ю­,Vg)ЃnF-фЅ„іИc­рЃрљц3H .ШљГлЩо“чЧФ4ЃЧ „gœэЦˆу…c щ—­ЊsЎеІcЦ€ШЄ(ВEi?ešц <“SS+бKГ€Ÿ- 3#мHuіњСNВЕ{яљYI8+kб‚и†е§4ЂdиЩддvВЈ„“5^w ›АљДHSж9Ф‡Б:чјЊефД!щw(˜жАч”Мxrw7йкЙsяр„ДЎ‚n[Сm0_­Ї^cвtc[ƒ‘Ф*k*z=[)в\bЈЕ=" EшЙž­Ж„ы0w“eиŒќјђбюVrkыіюў“о.4m;:˜oxџa№КnŒ&Š#чЫTћ–“ыкb"ѕ2W˜a7Є,”э;f'klJ˜Ув—W;PeyўтўNr{чіУЃWЏ_Ї8IЊŸЏL•ь{Œ.-БO#ЧДХ“e&Џcџр E‘ж*lсtІ™jGэ„ЬзЕвэф"‚Щ(хфуб§dgџўыД.WоgрєZ]Ї%‚ Žо‘WАаД эзtœ“!Б0{Ъ"h5€сŠBh?Z žHW`рвљёeђфХ›%Чмл,>,1ЁЙAg‹:Œk|шТNЭ0ъЊ$Y"}Лљ9ќЃ ІUBгВФ(bjы.ѓ†ыVJ‹^ZКaш:gxЕXц%q}лЕє=ŒУsК ЛЄЫк{pр Ћ,IкvѓdїЗР@qд4/lIќшLНЈЕ Ÿ§,“dеSп{ŒБNЛэќ0юиИџрсЃЛїŸН9yНЂ…Ж_8fIQШє4?}ї>yv>ипЧУЁ˜НќUрdAЫ№)уўеšн§лРо{N>ОЇзЩsŸGБ<ЯоН|њј09<:Р{{xx‡‘ЕЧЏсhHЬзВYОQШ2„zœѕ‹ УlЖп :ЃˆЏЪEтћЮћщк>кV!ЭУ4ЭƒCK‚I6=E]rсgрbєу4!ю~њвМіЛржгМ^wн Š†Ц˜єkє[PыyіTЬыѕ ѓЏЮoDm{г уг<^Зк8– лш.hDDDDDDDDФ7OЛJЩ~иЈ9КњіебГЇ‡яNŽН\%_}На~Ÿv•’ƒА)ђїТњТоЇ/Т№ђэo~ќ?})УЦЧЇ‹->І_фgМџќЙІЫП~”}ћИќхg|џ:t-‹гГХ7љ_.Ъјыu8gЫ,/вХы;7ОћуўСёз ыяCўт™ѓU–йЛЛџљ‡яnн?:§/фђПxf‘Іeqђшцўэ?ЗПџђ1§œЏV‹фбЮЭџјюцоУ‡п.ОЩ љ?HCојуї7vяплло~ёіѓ|ƒјгŸnо}ўъ№бюї{ћ;_;˜пŠ›[OŽГњьХНпџщ—?‹џтЮaЊЌi>>П}cћізцЗтUо ­Ќџ%v€џЉѓFаъ:/"к< -YИєфšЏик,2RфUU}ЁЋњ6…Хћ“ѓЌЈЊЉ ~8†6~э0"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ўYќЫм>'љїяw“WgyCššrZeЋѓ_;Єп„EE9ч"м’œ|a”|уї/}јЎ М  ПЃ\J%esіХC9_хe™хeU^§пш7ОћеWОZжŒ6Œ Љ” ”бŠ0&Є6јУНнR‰їe@H$Џ*В“'П~?ˆ7)тЊ4$BепB˜чхЏЎл0r&ЁWAsМЛ<{ѓќW_§Cк4„VUUVјF(ЉЌbXвЭћBw“(?ЕRSeMбaJ’ь,Ай?ћђя–y]eU•Xб0Ё\kтсРiQ~‘ OQžш$юJГŠЫ6oъ&?Kмјм‚нУГ’4„3p^]#fлѕCп-XSЅYž^џŠNk3ЊЂ\ЎђŠ(g”AeR@“?ўмŠ­ЇЇUеH…zр` ŽАЅvmл*СЋUZ6ѕu‡НjP„еH3H­ХX RжщлЯEН} vе„ЦhЈI^ˆЖїCЋi]—ыQ_зsIСS(чКЊ+B9ТU’2Žѓм€ъѓЯЕуі‹*0eкYcЅPЊZежљaшјUјжy}7JЉ W1зЄ*Йв!s4G™дeC %еЩgэО.№zJ…VЪXmЌхuУЄiЛоЙСЗ-šфšb^дUCбsр.ТДХЉ‚еE‘#я5rYWчП\Еџj•зR„\…jF0ЩuлwNЁАИд­гКЙž I]ЫSU`9йZpVU@›ЁЈ№5%ХgюЃuчх2Ћ EрQS(ИВF-7Ўэ,ž)гMЬЕTHCkŠwЋ@[R!бН—W e‚:с(mЮЊOБьбћѕ,…QBдАKLижH‚А]лї ‰Жm7јж№kˆЙDУ!Ь2œNm;œђOЄ>kBКЋХбю­›Люh‰bтІѓq…‚Т gm*еvОc„ЋЖэГjѓ’!‘Д\Ѕ ТDj,Cw!dtи,˜ ˆ2ъухож­П]јЁЉs0›0Rзсј€іъжJЅшћЮŠ ‘}‹Во|Њƒз E#/ёpТзp>WЙ†jy}wg;ЙyуцЭ[ЩжЇ…­KpNCbЦС†“гЕМaUЁ}oС”тzЛё a8$+ №„А]Ћ‚gCгCŒ-Rr š†!Ъ?>FаЗЖnmm%[лЛX˜Тј7"1AY!ь‹t;8иеšИЁGs€RŠGдškХЋ,ЏJX54Д|бšd!gEоатho?й HЖя€пч5 5„…усНCOt†S٘Ц?бu`/›™XЋ (eEањ‚JХИыЧyъƒ•'С]У!еЄxѓќMђрі6кqїљ*_eu™зЁЮ‰+Ђ–hОiВ&4 Q›ažЦЮšЈ6Њ0Kэ‡юС"Yа†PрЉn\Nr$=д ЫѓђУћlёц`яжфб)ŒUMHš‚‘кь‚Днtщ­E˜+њѕххœIm2hb X9rШxHМУ„гЌq’)žоQЮЪњ<%Хђ§Г›Щ+^ijAЫ"чІ.<* єЌЛyœѓsЧRЈ•..‡vшЌo•о`Ь)ђKъ*Š‚cфЃІŸ&Мq††aJЦ‚?­С>Ў:{М“œ!>MJоъ"…ъ‡Ј5ъ–сІЙwэ4и2 гьŠк[g7Hе ССyТ–Њоx#хЦiDј4‹ёЅОЗ ЮlооKrТŒij=ДЄB3Ю=NMаUЌя[YЅњѕф{яКCџq0ПBUg9HЋѕC­hЧѕш №k0і(ЇСм‚ЉžTp~šГtЈ1ЄQSG…Х"Їks =NŽ[яTU й§Иі}НВжlА™в,]BЧM?дчЦ_Ь"ƒЎуpŒ[ќ5уœЉЉБХO'№ЮС#љžєБГмЎєш6СЉМдpIЌDQ_\"шa„2ПМ‹ьяEŠtжч+˜гœifC*}e–†ЙaЖfМ*I#Ю'%з}ЙogЩœAя:=ўtбC<ЕрўТд/ 9ыЙяZяЛ2ЕБ ЂDЖЈ$d[3Шsгр-Јі21їЫЄхlєДц№MЩ—OЁпz№arэ8Œ,ŠкИёчK оsвЬ-mGЏТИ5Эmы‡ОѓFnPЩkЩвRŒ|бРе~=tъ“Ї7н4Ё!з†˜й1a‚Г/YzдŒ#ЄфкKдж0Vf§_ЃU•ДrŽЩж 2} Y0Щ(ЕСFЬE“. ЂZY‘Ђфn\ћ6ьweћy йРˆžkGйзЩKВzšPЋ4МЇеУКэ4FD˜Bц~КtЊс­ѓ“Тxkыš+ˆ ЪЃs8єЭХ ‹W/Я a]4YЉЛqю ŽЩДc /Э„РјзїЄ„ёЩЩљ§ЄPZ9TЕ’р:Ш(ц3Ьјѓ`Žmœ5‡m ужx;=tNВ:ІšœŸW˜ШiVHвhУЬ‡ОьзkШ"Tгiя%N†їZ@иOі““FbIpFfš йK…JК\wЊЎеxб ;р`˜&8(${ƒмз‹UЃ0[œ9uAС`9@nПЕQPЁЛЉ'еб(bњb7ytœ6јK сЬЌq˜ЂSдДв_ДКiфpщ Uaм”Rƒ@4љЧ‘ќeЃ[й,вJКёbАЌЉ‚9ѕЃБJŒ0уdъFРdJB‹wЖ“н‡/O)‚[9-ФZG˜•эƒх”w—=\HЧ1Чїч тВagŠљƒ€h™Ўјјuяh]ƒэк~„ЅGysе­GыbЌ<~КЗlян?јаРK3$ж`NQxŸgЈ"„fТ„XЙ^€F;Лщ˜4FМ*Ы–,јГж4%ЕЮlBА™FC™l­MіісН;{Щіюн;ONVuEэ8Z$ЮџДF№рњЩRллІd]'ЂэF}щђтPЇiFшЩШЕэМёГEж Ђ=вЅн­>ОМw7ЙНГwчюу7gYи‘’нХ–Є•зs+0L`Z$ >dкwtНљ˜šщzБ(УH=:QЎ˜kНьцжЂНЌёSЧ1єrZчyКxћ™ойЙ}яйГƒWяЮЪІЁjžfсFї~:d№І!ЮхЙђ№†фšЖХ б,Яџ›Н+mnлЪВј“ŽзФJlЩВЕя"ЕoЄИ‚иоŽѕa!);ЉЎљ85ŸцЗЯyrejтШЗ‡TwOсиВЋ(@КИямsЯ…=?FiхZ:рI– Д№1N—cs‹Юм4УLNFЇћњ§ўэАuu}еs<ІUЩG ŽЂБ|…E"$Jь‘1OСМnхYžлщу9тLy=3МˆИҘыRјkЬ ЃцxЉбА6w—О žнОjA}рЄќ>КŠ–|\O'šzRѕэ5:Џ?.•њ2N„E!д.Фr­#Ѕј$2жГo`ЗЎЛƒ‘ЪвDz­ГЋОэ:Н›[T%Dkр…уœљЬЙqВ|іbї{Р#QWdТ u)ЦЙшоњцЦГУц˜b2 —ЩˆЙGЊЫ*ьгЃ+Ы:=мо9ЙщЖЛDlрD•цюЈuAŠtО!TњŽ€Ѕь‡Бж.ў†іеewияї.їAќЂ,rSŠ‚УUTЅfчЛ‡–uДЗННг8й?№D \]`B^ЕЃlю1п#ˆ#:‚‘аЎŸfYъœю6/.-kwлВ:КBР…љ— JfтччыјTcЏqд8мпк;ЛЕGm’ЧY2Зђ{ѕм$ŠѕШM`ЎїЯN,ksPрЈJф9зyY–‰нxПfY[k›;Л;Лл[{‡Ѓ—б<БйјsЮRЇяvoZЇG—чЛ–ЕВbY‡|bШR”…ЂŽэѓн5\ЯъђђЛЕѕеЕЕЕЭн›ж Ž;fЏнlZЭ‹ГГГці&ЂZЕЌ3iт,@чO!ы2ŸпЯ€f† e˜—еИDч+Д)ЫђwI#[•уЊƒгHwUњVƒoƒ6‚WVFДЫGЏЖП#…hЧcє})ъђQuэбKЇSаC'&j№zіо~`ущdZq^˜„gsњ™цЬ!QŠ‘еЭ&“iіЯ/ПСc~Ч4{џ hєgЮѓ 5jдЈQуџ!ў\r{иVw8УŸe§-vУzіoп=љiѕ yАЛжОЕ[ыгЫ‹cЫкС`k=№&йwKЋ[;–Е|y~ЖПЕО{trx:є-Ч›ѕ;i†ЧЇжЯOПћюћ—KяWж6ЯлVїтр qvБoYЇц­І+<ыэЛе-|zїјњЂЙНwмjžі=kа:~Œ˜mПЗЛjНyёєћяž<ѕѓђж~ѓЪъл§ыуцо&f–SsјЧгVЖЖіЮ-kяфИбоnoф8Uœ/hїpt?tЕНNЗзэі1dЫњ8ёv­яўђьХћыСѕЩцТOлІ–§nп{ЃOгъє{іаЦпљПЁў!‹ЌЅWжїп?{ЖаьЗЏo_.Ќпея}ХйноРі<пцчя€ѕѕЬzіфћЇЯ_Е[ћЫ /Œ,сзyОАмИ9?:ɘwаіШњс™сєтъвЯ[GлЫЏ_-˜з‡ƒЏa[эў``;ƒ›ƒхOŸ§№z­qy}нžћгg~зњ™~ёrуђрЇпП_|ѓцSќЊПЙэє†ірцpyёч…зяж7vNnZзчsрm“щЯ~x|А№|aiyiiщыЯООэGCыl}qe{ПyдиZн=hž4чю'ЄѓdйГ—oVЗп>{љvяИБНњѕgпєЃ1ы›Э–эєЏš+KЋЛ§љ…ћ ХаZ|n§ххZcу‡ЇKЇЖ~~§йћў™ЇНsW*ю л[KЋГЙћ;Ыњщ…ѕфхњѕёТЋMuт=№фТ—0ќЄ1ЭЫbСЗМбlwцЎЙBЃO.—–NYœхбпЏЙ=Їц!ˆРП=kцƒR#шчж Џw/жwЛОхпџM}ѓpЂy)єNрЯНЇ‡№јЏЌзo–w/їо-я_ѕ†_г ŸL„QG<Шќƒц–ЕёоzЗВsкiЎЎМ[;јСВ§€ё(M“HqъЮџЦ* щ`гZл8МшйэыГэ•ѕѕoј*#ТT”$Б”‚>Ю§ыэMkПqvеЇ4ЪG—{пД5 D†J зЅ2™ўњз2јІ&мs|ѓЌ—$о#=`ћdІ§ЯџАОёMќhш0жГшЯaЉ.џ§ПЌ§kдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃFˆуйЖїиПЛљџ‚ŽэzT?рЬйŽйАўвŸ iyf‡zтљ„˜џeœ NџIow{ŽkНС§o_ќёЩ—ŽМѕbпї<Т$s ” KџqуЖЉTBH!8cЬw†Зе7_:жЁOp—сž‹"У$Иџh›шt|.R)%Чч‚ .ЬжнЃP†ђ„d”3€уTХY–FДЯ­KЃT†J2B‰†RЗлОАV<ќ:`&T„ыTQŒUb8WDI’ФђЋе.L–"щЛŽPB)c`Р№іjљЁуК#Ч‚$ё}*Т8Kт8фX*Ž‚’>ТЏнw)х2Žs/cJЁЎн>АQ˜eэпИЬuЙ@а„рд0Œ“k%%‚Ц‚Э}‡л‡`I|Sц`SqEїUIнўCћœl]{dD”IЋБ24LГ8Š%Xv_މœы&.aTФ V70f‚ЄCAчцфж[€и˜‹ Aџ\bIЉГ Ddœцi’%сќъб'E…‚ЎуTFirа…&ъuš8iГ'Єš8FеЅGƒiš‰„ШAЇРМЖRw(8Ё‰чЁ%›omˆт9Žы€нчђ;ёэ Ш':se9’ њѓ$е:‰ ѓTх:“(žSд=Ц‰ˆBS9ЪьЙZВРwG.:ŒxнЗŸŸЖлul'№L1D2ŒuŠ }ъ‰WœI]hГOJ’Ьe‹GŸBАP?дdAЇ)z C тœбЩЛЯOлiлŽg6žASф*ГcŽCešfYŒ&хЅЦ‹a,цs@nВЫ(1lNа(„б†VŽ`%pAA{kёГѓv;h,œЉP*N:&9„#pI”)ДO%UЅC.е7lєgpс ј=8ˆІ‘€ 8ˆЉMфNŽчzћs~œк(QЇi˜„=ДС4IBДrх9xЂ&г1%fПЫ,ѓ=5†м‚YŠ…EcІјƒоlL…РХ0ъwїо}жло§еЁ‚uЂsє–0Ju&p‰<в‚­‹<‹Stц™іa„!]<(CG #xгв$ yЦ+Ъюїї? њEHРzДˆвI…C|'рШЎЃђЈ;у˜ћ˜I\m"‰L†У8Щ2šfх€юн\љŸ —LQ№)д*С?Ё ГМШБ2qUDЪаUŽМуJZЭŒƒFG0m˜СRrDG”HыјЭ6­ qGЃQЁ‚<ЅR]N*\l^ъА8бг_Jд#A„?SVsЅLћ5њ&APYQЂПa­9š ”EЊˆ †г–}ƒ30Шt…Q–0ј" ›CEzu™‡!qd‚TчmFQ\§, Р!Я0HЈBT"јЏЊЊ"KSMсШ˜ФБaЧ Ьц|Оф<хn №ВBpЅŽ е4йtRцКJТа (у"‹C ј*l†.+š€смcФ ‘Uq1WшdЪh5pі!ѓGTьgŽЕnІ…@Хду:4[Vё0›ф8\!ъ<+sr?дz‚ЏcК+їfgіH(BSjмlЇЫжЇ—1І[jŒŸЪrcї<;ˆGвXанУЅJєzXцB‚™§уђ ЮŽS”­ОЋR=IЄ xQLІй§ХSГ Zšсф5ГљІQR fф]i6|хцv†Jс%(>lXз<Œ2VЇ+(хIг2ULЉЊI—9‰&yugМ'>ф|vЄ†КЁЋPє-‰ (p•)и‰ ‹––"Ѓœ"Ј4‚ЛЧV‹Ј$+RE“Љd)gQЅ7œЇ*чЁ.œxT–ShF!t2УL›DЃ­q& бaЈЊE…ъDO†Š ЃAЭhV1ŠNC=тŸ[&"y&ф$’ NQ”ќ˜E!ІbUNЂАJбљUUнU†Ыј,3-bxhjœZŒЂBOШЋ*ƒФ!n8ŠБ1kh5‚Wšˆ,1s ЙЖ:И ]‘EUСD'f6+~Іш$q\~HUЅбgYQV9f—#>МЫь‚F@ФиЅ$Œ””Ѓ 5чˆƒuq7NЭ`ЋOTŽѕМkые‹~Ÿчz<бZШ<сPјЩ/EЌˆLЋЛL–ЅТdЌALˆ˜Г™ХlСАso`}Ё6Ь‡žLІc•ђЛ‰ЦиЃ—ЦYЩ%†'јŽ{eЃЄJ3${:IaЃ3eQіс.Q№ЁzZЊ4!‘ш.•УАhBЮ.h—Eд`(Œ№Ml_ЂѕŽC)aа&9˜',ƒЎ2ћ3зŽЎЌ!5Ъ'д­"д‰ ЦП”‰ ,ОЛƒжч"4ИІ11*s7dvAHЭiЄсєT\§,c†7ѕ\mCТhђИ˜Thзp№y5…эQЭ9­ЦAiapТˆ~НїоZ\ок;М8СHe>‰Y#шќ—Ъ0+›$ЗbH3п†)”šmЬP§бp$ЁЬeDпЫ‹I‚™Х$g$Ь@сuЯіжW­ХЗk›[;Э.кЖёpЂЊ„„D‡R-)гу”Ы,a0Tf‹ѓxії<ИO­FУОg0>1ёš4‹aЌ–DаЃqbі/юžlЌlZoп­nlЎo4z^Р”$дЄ6•пнiщб|’2žfму9є~уўЁ >єМ$ УРёуЌТ„cШMЅО+d€ц!ЯщЕZG›kжђлїkkлл[ЭЫ[зLёa^РЇРє!€#?’†0]D4“™“У•OЛ§Ў)Ў х §(ЉввpZХa1Э0у…’ŒŸж­ххХЗ›ч7ЇЭцiлc$ 1ZLˆі“gEьКЩД С'жЇi.=_cAЃХл.хШ‹аы‘,ЃЙЄ0Ѕ0mЌ‡†ŠЦ–ІќцаZ]]л:1wаКИъЙЎыГˆ }_ЂђмХу\§7{WкдFВeѕцЕлЦ`Л  @ B+h­R­YY[ж^%‰Х§ОЬџџ2'Хы˜`КщЖ;$zQ'l…*щTцНчž[ЮRЊf@‡ э(Ъ’…уaс•h1зB‘#‚Š„dСuъŠц%ќЙvUш[Јк($Š0ИЈЕ.œ.;CAЧ§VН+Д(^Ќ v98щЪLв•DЦo BOД\‹˜A`ВЇдœЯC}а• ]‘Цќ’:‹б Тp0K–ˆdMQnфnГ}йmV‹ХzЗгWYBЧ$mEW//aWVЩyо`ыžЇ7ITc–фЊ\muZЭZ…їXiš%ЈЬ№и^‡!П:КУjхЂнЈžЪЭFk(›кР@b  ю*Съ9CБ,2‡Њ—„š†uy|TmЕZх"H+I–Ѕi'Y’pњ`EСфЌXЊVЋЕъiЅйi_uлэЎKЂBhV@|•1єъyP>­Злѕ‹Г/EќЪцŒљN:MЂ8kp|pјхАX:=­5›ЭN§фЈІRЎтŠєŸ@ЇtА0u..jн^Їv|\„8 ZВ œ%ˆŒ4~Ја,ью|кћ|xRmT+ЕГƒНbуЪŒVЂrЉ:VкgхRЕйhЗš•пHыIВру/iЉъеГтЮЇ?n}.žœœюь~>ЌŒ'чќмћИH9k>рYјO3њD‹Р0)ў1MўiFп€ 7IЇг4MВ)ўЦЩгn9џЗ0ё@9у|y>rўiJп!žMС:єPV" њыкп„;ŸС}šfИНЅіЊЋƒ’ЬЇг`4‰Вl–™џ4›oФи‰B_/ДhžїЃ,ФSзR …г šУU­-X:$ЫЁру‘ЭђЃŒДdZdT(”/`єGаЛФХџЌе5ЧІOВl™+Ъ3Ю9rќ х‡†‚$Щ+YмЕjLFЭѓ‹жљбчн/ЇхуГrёЈјћ•„їЈ”+ЇЇ'gеVНR:9јД§љЄк вЊз˜ў† xёЏџњљ§ёEїВQЎvFНѓуƒЃZЋY§R<кфА/Ч%єГЅjЋ[?кн=*зы-A)Pї–І.Ÿ3уЕn§йПž­НџR;ЏUЫѕ+Iъ7*•fчќјььїЫяёљАxz|T<НhTŽNЊіys8™4щБ“\*<Ѕ‚ЧkЯ_ЌmœTыЕѓfO1”СE§МZjvЊwpR:;;.7ЮN*­vЃq)ˆbЁWz§Є…v Џ^­Пн\_пќxмю_vК™ЈЃKŒau4xфИjНйя—ЊчzЛнlЖ.Gq\8н|іќхыWЯ1k/љЫVе0№ЮњчзяЖw7зЗЫ§Щh0$U“†ЭутрБ…SЭю@Ÿж;НVїЊзˆ“ё [xЗ"ŽџЩХљчЕз[ѕюЩЮЛЗПœ%PVUEš [ѕёc ы№eмЈTБлФ‰,=й=€ПЉŸžП|Sь]~|ГЖuоŽЅia8ig#^ S‹ЊFє'­K“EаОxЙіѓЦqѕxw§љкжig0–U™LсOЙˆ‚Ќ[žC‰ІЊOzљІЙx|Лёv}cћЄ_МxЛsv9ЦТDќKыь”Ъћ>mmМ}ЛО]lFусшЏOTјЪ;e2жŠ76?юŸUЪеFЇл ЃіъHпп5Дў~Ї)”?Мпоойл=(AЧТшЏSk$ШФPћR­U9.UЫЧХуJЛзЛрЌWGњ|ёИЙёсЈYќА}PnœWЋUўфxђзUЗЏR}" ЎК­”В?hїЊНб№П\!щЮтёЭњЦЮб‡ƒњX—Ц§Nƒ?'ќѕкжжˆђАзПNtщ( еbGTХўъsмWМЕЭНƒ­з›gcн2 Uь}уС ‘GW—Нъ@C CW5б вcutIИŸФч›ХђюЫwЭХкGKћV§ТМˆ…Vs №•вдВ)щWћ„eХ•ІЛx|ўfџМДОYнВЩ7‹ю"€j­!1 ОаЯ6ˆ2вјэŒ+Оuѕ>лžПјPЊlОо­]‰š6љОqЊ_M4B ЫБљ§f:5 jЌјтШ}Ћё|mуKcocsы дИќЮwhKќ^$зelБ№šЏЧ^ѕ]”ї Щ_МњЅи,~њ№ў—Н/пљmE1l/№УЏЪЗј§ЎЋОDy /_}pЬЕ‡R2щЕJЛЗ–јTљЎ"І`|iЫ‚(„о9&‚=ˆУ8Д1o+c­ЛШ"Ўпћ‘acЄ< Іš`,‰.]ž—іЖ’ЎjHзA,Cу|о,тч€Бvƒ0I„˜НЂнВЧдBќB^йbn-|Єч3ќ@d‰— w’о>WЬ\тlˆE’ŽNL;JBŸaжќЯљ У\ kЭ4mё`–љЇ О!И–MUQBХQёˆвўВѕ0’emБIŽщКОчG>o„!цЬKт(єДБЈк+иiPх; AЃm-іОA„/Ж†SdдHФ€ USЊ;ŸwXˆfр‹R>/nHдYш{Ј/~h‰Ђf.Є‡+|ŒЯ|†!cш ТDч pPbБКПїєХФ"дwТƒWCМIрYœ?Ш†HMфr`O&ВК|зЇ…тC†Сiз <.`ѕyБнN€ШћGњЌ#тЬ,$-Ф-‰!№nћЬжt'ˆЃ$т”1S–б#,›Г@Э^”^зlЦ%‚‹Jу‚8wOЎmhЭƒ‡ЄћвDЂ–ЎPјPКауЕ%є]KгX&ѓYŠBCy2/{ЇEW-$aШ адіaИ™ N€< |аЖщЂ!1HsћЗƒ~Й?]]ƒ­#:Фe%ž&P „„cУ‰ВљMxІЦѓBв—kDш45 Њƒ3ђлтК…\‚?…nCяШDщУНп љ^Ё?ŒTЯхЕ5c›Ѕ№б 1Œ ЮГЭ€*)ВИфЊ Jн ‚хi„.A.BВ8 <—;<оњQYаФњщЩўі/јQхžЈыВ8Q!юŒYФДˆ^˜Э2дпЁu“щ, /iтŸяdљна(<4тšХъ№~œђрp-^ УGэ‹ЮUГrАы*†Mј6ЮCСg8ж‚Xйt:#Bp>вбeY/йъ™Кс„(iЫEњXЈh6‹“iЪ)\€)wїš$ ЦЊІŒы =рaеЄ’ЦC)‰ЌЌуљЭЭ4Nlj[,O#єšвdй;ЊDЗН0‚Щq™uep|tšРСCч(И1?`І**†j8†ЎЪШFu᎘4№Pс5ъ†Sє)”›ЃрцnžФBЮ gгŒ‡‡8ўж- ПfО+Yx` йГ ќi’M#Д0ќZ€э†‘чCютРfъŠ*Е>#Ј`\aHiЎ­ЃOfЉяX6t=НН†F;: uЦЈ. њнvo™šgp• Pќ0IсЮ b›бl–0оu1˜<‹Jƒљ@VzЬ2<,\Ё‚bf<гУZщШмp:OРкХЩЯn“( qНј: рGKhT4ˆДйїЃ$7StЧC*СўјpЪn”dqФћ'Ѕ(3–!+T*^ДMТ ` aaсќ&ѕm“…^z3…‘Ж53ˆд(.Трђj™Wјц€‹Х0šLЏ3еD\?›MЖЯ1УФє"~ЯR*єaI‚$œGЈžo"‚on.зg3^П)ѕЂй<ѕ(пuu‰”›КŽvEаГibЁ‡uЁЕ!œњЧEƒ†XМgšFNђўмЯ CлаMл‚˜пLAЯ‹гью&tMУЏoЂЯNЁ;К$‹ƒe†ДŒЬGt~ЧI„єGьf‰Э"—кр|=ƒёГќutэy‘ц‘RЕUшш*Њ:zУt>Ÿzд}'ˆЂыЯсёЌ`~›‰Џыv8ущiШ’ ,ѕRL):Yо• eœиЩ,ТI№BЮg:s)7Ю2/Ц™№‹vњeЁ")*\–хФйѕ5М‹˜–ьыЏ‰kй~v›ДЁ9a6Maњˆ2yt?ъПф!w;ž ёTт˜l6ѕ}XyЧ ЏяxпGѕHg˜qђ‹!:щNњŠ*k–a‡Qv=УЋB†d ЎПоD–Nќ н0НNљ5=U5‰ДDкhDсwаƒЃУ›ft“zЁo›%ЗsbЖбч ,3уM,ЁzЛpPUwКЯ0жp0Inzїы”9Сьnю'Љ‡FcŽbыррЮ—GК`ТмЉ”aTeйpвЛ„С;РF@ \шžgкHв Lx–Q4VbЕАWь#@4^ˆќ ™M='„sA<ЎыЅЗ7^˜њ(Ѕйэ,Y46Е–IZA'…NaiЈКLиь6rа31?љŠhѕ,пГНй,pгФПї jћААsиŠ2&Цтќ4ƒkA§dйн<іМєюšЉOm7ЙKQЙ|='["gдDq %)|/qЇѓe §Kv—љш[рA’ydГ­:ЊЙЎѕJŸ Ÿk­о@аљ5)xoš w‘ЯйW‹ngŒE>ERпNУ( ‘ЮЎЛTвh˜ЈІлŽgˆЈбlzXМЧ Q}щhГљ”Y^8ш`ЁW9ќ\и>8Ћжы­ЁsТ<і< PšЂйПП"+(Ѕ–jDз‰Ўяс.љ"‚bІжФ‘4 О"™н ЖЃZКёmb›>FмІdдnї ŸіŽ‹Х“гjWPЉ‡)Ат)Œ"jсЏ_ЇŽсЯЎCД@ŽЊХѓ>M‘o-—3* љіЎДЉdЫж˜юoр !!$ФЎ})еОWeэЋ$А{цџ“єГуљiл’ŽЈc‚ИнКuяЙч–2+Уїu™gUZФ".тtОH % ›Š™‹Ž†6шTА [еCfgчнСAэЈR;щЪ'˜х šяХ-œl8љ"ВI@d9ЄŠеЫЙ}Y1_т&\šЎ:A1›'žiCЖц8 тћ„~ЃkкЈКЧьююьœЖOЊя†VˆkрЉывŒ,f‰mхs…+Ы~eт&AА|›iЯ„ЫŒ• H‹HS4fЮРZ:/v у—њЩŠЏ_1Л;ћћuV—'mС‚є'DХpƒ4З”Ќ€ЦЌЉЄЁ%[ёJl…Ÿ3Ќ Й™%†(ЛёoѕxYгІчЕŽŸкИ;Pуpѕ&Yрq‚›ИМ,њ‹Ыоxpн:Ў5†%ТF'дпy"\’Hgіі+Чч—WЃщ_­wMV‹ШД?6V”€_ƒHŠч˜НNџњКгюGН“ƒZ§џ#ЁQHшэ…4Я 8=I#Я™їЛ[[{яЊЇƒaЇг>;~їўЈOтuэл§ ?GЃ‹‹NЛнщ"ЫЎ›ѕу#К‘З€РШВ п4Оc}21Лo^П~НS9=ЛьЕыяп5Цж ю§џ3h08g ­"E–Џёњџcъм(Щa6\ ЃWP—7ArШТ,ExРі_СhЦK)сЅ”;hJцўЯ6ш{0‰rд–,І ЦŽ—ўQЪJЮŠ"O‚0‰ЌRW,l4›Яц'%E>Ÿ§СС0zЃs‹щ†E1/~ТЌДШѓ€c.H–ЃWQ~Ж=пЮЙЛuЭ0CJ#EБЂ)K†‰Ц$%БiVЬfХКѕХ?‡~*а&yПу1 +ОлБЛŠI+„BяКџiјoрtS]ЫьЦЅBfњџzЕЗЫььWъ­wov+‹сЏw.?Ы§№}=рЭЖпUЃі§ілoš’Ј(\ПгО8ЊьОй?ЌžЗъ•ъб=уšЇЬХYГur=КlTЖ^Мк=КNзuБL›–Š?~ћЏпŸ7{“)лЛюO‡гкЛкЩyЃR9<Мg\ЋХ4jѕF§ЂнЌlНм9h\єEqжc4ЙKћ'ќўЧУзЭСhдЛОŠ{еЈЗ:ѕj­vЯИуcІrP­ОЏюэUŽЭ'ЏЭшП§гGŸ<киnvЧу^Ї;‘фщрђќъЂyвjм3ЎVgšѕZЃњОRЋЕК^Tnяkгё—Žўнї‡/wЗ6П:ь мhЬ‰ВШO†эГцyЏsЯИJƒ9щіЭЫFНйh]ѕYAц№б<о|ёlcѓЩ=уVAр%ЭPDA_Ÿ4ЛїMш9>g:ьАГ:ЛшєqžЂРu™Эпєђ]uw{чЭ‹ЋГё/Хіп6*гнЭGOЖ/XQжmK—йіфОJз0SЉзш+R0…“%~ЅSгП†OПh\VЗ?xИ{>с$еаIQDQОЏ‰UE†х=% žn2:нлd~Д]=?;iЕЧkXвѕќхгЭнf§эѓ‡ž^&§ф^w,MЙO;Ѓ‹œBђE LЧущ№ВђќёуэjЃurv=т–=ѕё+x[9ип­5їžm>~КгшO&, qуя>Ž$ХёŠТцƒ;Й>кyёrЗvT­Е@ѕВАњhйkv‡эF}џЭ›НЗ‡§сhŠlд4C§л'ъnœ‡ъd4aY‘ыUŽ[ЇЕ§У‹‹žAZљКЂ—еk^я=ŒќєУГэЭУЁЈШ*€Ќ|_i ‹Z( tŒEчьйB_І74š‡гхЏ;ЃkW>§АЙїіљЦл‡ќS$IјN–Ec.Ш‚0. $Ž­Hp8Бu…ц№ŠњЦъЇ^эl=yY9яAс‰?T‘eM“йtlЧ&tСšMшт$eE§Сцын/vO;ƒё1ьPЗuе&.Ё‹ ˆуњЭдзБњѓСЦVхнычOбƒдlфаДUгї|ŸЮZ нП–škY!ќpcыЈyИПѓђйѓWп>њп!ЖсИ^†!kOЌѕм…zАБн zэц›ЇїЏМў*Ьа0ˆыњA†AœРvЯўU. 6РвЊ! ›Џ6~l$ёщDNXtэVрљЮZxєhѓ§…HTeИџьЧFzі„сUлІЫt?\w}ЗЏŸНиЋwЁ§G•ч?6аГiну$E3lК iЩЫqОэJ‹б=ЗѓюЧ†9юч>eи_фъJVJЎdщз{MЗ•– у—˜“№ŸXУЬА%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%V‡Sf<сE’$M“Іv2њй}F‚ІыКІІхИЖfй†$‹kпх1DX X–iт:ŽišЖљSvРš№МРБ,Ўіpјw‡)2?eYUaЙNŸЖOwy7-лБui­OrsМ$+ŠCtMжtщўЇ2Ы†‚Tе„Ћuн2iŒrїфњ0№н5=œ˜JВjр§mЧq]Ї™ЫО~ЌjСрЛC›>^па bЛq\?p­5ь@p }˜Л‡/пХ з4,C•іыAТkВNlЫuр^ЯЗMъёЛЧ“ћž‡бŽГЋG‚j"™МфSКaйАлдПОЯH_Б=O7ю"†Л6Ђ[^њ8ч€ аWОѓрHRuъ-Ч=8ОДшРЖЈПВMAWq,MB0[6ё}? ЇŠ qМ(ŽЂа'†ЌЋЭGVR „F\ѓnЫ Д@79ЁOvoзп|1ф’гTžWdеЖmїюЙФІOGАDI@Uвtq…f šmЁNЖу…aOу‚Л№1Ђ„юЯB7*’ћ/>J4UЫ15D3нŽСїЙ3:I"K3Tue-С•ЊЂЊВШwь;њ"p›ы!%=‡š­Шу“З_ :Мц“;іp|Q–Хˆ ќТ‹ТР5mU•Uіn†/MЧh4К /Чѓ\\k‡†5ZЛ'ћ_ŒкяhєЬ<К—Aрyžcй> чgK‚0єA˜‹šЙЋuзSИ0p€‰+ 3<ѕХDpРб|чьhя‹Qяћ–ћpX”ФДœ <;НжmгВ‚ IТ,rl/N#Ъ$Ь77YТг*ЧsAZђ:ъПvМAp ћQУуЄ.сЂFРažKPАЭоб>ѓцЭочХК§ЮnQv Г\ЦIhв?ц‹лyйЊ&№"'(цrSQЄквc*’l“jЯ†BB˜у"Їp:ЭIam˜]xz{чнч=SЦ/XДЁХYQфqЅ)б,dG”п,2ФУ "ЇjKо„ cКЂЧGNт ћižE>­ф*‹"ŒeёFoэь*‹УЉ(ЉtЫ'ђ Ž“,GњŽaИQ”омфЎf*/ъЗі§ћAш–сX>„jт7 ]Z-7СћЇ”iuTbШ?i*ЮъfwыЭ]x yN”9N!H‚ј!ђ/Ы’РГь$Iч№ДiJМ()ќrїЄЉ&Јg”юш6NlF=KŠПDX UYж,Mœ\Lco›V˜ Ћ SNDуtС>6jxВИ™ЯЈе^œ‹ЬГtQ”$aиN—Hе6Є S”BфPSЂ…щlžВMєћ$Аќ”яаmўDEп5T‘г!ъТ4siyr§tёсCЖцљ<ѓ\CEn2Œљх)T ~ѕ]p\%Q6ЫГтЮђ‘Ti@E.К0їCT,TrQ5xzЄBd„фœ‚nХёу"іh}ђ§фУŸ Ик!IŽПцТгг>0ZтЭе0!>ёіA˜'3фПkЛІ7yDћt‹^œ%шATD­ыъ’ЈЉWћ”лбwБЄŽя˜(…љ W —+ ‹щkЫЯgEB4Uх†уб`™7p @Ц4џЂ4ПЭbгt,T†ТџЋO$~–ЧJКц€А]‘L2­2]†NEU8CЉжmп‹pž!К—(Юn?тЅGМ8ŸОa(ьh8d—iДqDЎA:П-Š5vІО‹j†Hв"‹@{Фrг0r ѕ,"ž0CM— Ѓм0AмZˆDѓќ6 pX’јˆЈЦѕЃс†Ёђt2/ѕN™I§ЃЃƒЦЙYфy`ЙR(„mШ/žхЁm˜vрDYи %uщ’щ)ХjGйb‘8(уќxqƒыу№єЧyю;n˜ЮsœА<OИeRž’†ЇAwq†шHbr/*R”eЧ‹Q?{TѓAŽ> •м&Dэ2WЂРЩŠ†ШšпЮЁƒ–gvћ!…Ж|МE0љЂH}=˜.WфщgTъ8™Э‹8 Кэц`hШ:б_!!Q1‡ ЂэЙу˜цŒPч4T§тfžx6"Ч…Ео$a”Эo>мЬзёгљ,ѕ…rЫН*Qš‚бQ’Юfyр;ЊЮђ}z0`cЖ Д.ЙKb›&Zъ#$p ѕŠ.||{{SWущэД$ѕhKСr“Q5НyѓцfTOn'У<‹\Љ˜e‰р@ОƒцlзЇІцѓ5ДŸД!Чђb:Et„8щ“IГеЯЖLUМмк:ф^ЎЗZ­ГNЗз—MT˜,.ЏЇгл›ллџAxŒЦЗг<…бnШŒЦ‹@sžH\KеР!&ЉЖ?—aђШoІУФ дŠa”фЈ6д6$Aр[[;мвђцжц^kПеКС3 ŽЊ*Ъjr}{{;)Šщr7 Nˆт„і z8пш ]1 0]U„пђQёjOы4€іЋ –,šYЬ[fw§%Zђ•еѕƒГжЮж^зСiћxH6?Lыщ8ЫЦCзMBУ ‡Uš ƒ9Ч[h†ŸyІи,/)+DЏ—–њІ4‹“€]fѓUБйт“jЋ0zyyЛЋ ЎŽ.бКА†ССЙ(+КW oehШЉЌ„р(Љlюn~ “Іž&tћvщфлјХІаЪƒО(ђ‹Ю‰"жсјJ‡[[;8К4аЯЊ€ž—qВy.*RПoІЁWЅІА~ЦO’ХиЬ+аёІ("Щ P7еzg­§Ѓ“ЃУУ@ŸА™а5{Мf˜~’ВeЅзˆ§ЫнЖaлк 'Љf‘тыМЪhtAП…эrƒюРB‰+bЕGЪ˜ИŽ)З//[Ggчч№Д_ ы+RЄV†jФ–HбfЉЫЗЮЎ..NOz:#ЯСёŸІD—zољНLдt—ФБвЕ Oб!?!р;п†Џ9;F™ЇаиУ!S*i”ЃЧ&ƒееН§sI4 *Ъ8_=ДЂаьДѕИ*юУfНњlНOBНнє!šUYЎіжЖZHзИЬГ4цy^У"ЧU9 ЙWП/-oœ Вi(‚ œНZ;–"—я™Qz/6УеžnEvO–Л—<­щŠ"Žзжwї9юDЯ`jQр++jЖЦцŠ;мквГч/6NКšЎŠНГƒѕWЋ‡к‚уУ№ь‹‹^Ї#ыф™(‹жцЮЮЧmіcцa^’nЇŠТСшпž>{Б~pй“•ћЙ~аsШBП}vИНЙКЃ{IШ`щXАяУђk˜,0ЃГ|–ˆјWV_Хщ6gŒ2†q№їœ—ї-e‰ц+аЉ яuїЬg#dз­аDт  _кœO‚‘•hБ‡.M Уl№ЅэљшiYЃqMrZ–u].р’цќдU=šдюEv<‡ п7ѓїЁ'5м[ЄЇчUUз“ъ+@o%ЃzT—ЙЇ…LЃёДКїb§пУˆЃВ№hY•ѕh|]њ_Оj Z ЊCЏJ„іЈMŠЏЁ"њQ’В5ьДFF"Јуџgй?†УZ\гˆ†eYVyј58šу$Yc;жь(/ђјўЖ’ЮВуЛЮŸ•ххђЪъіцвГЇ/6ŽxkБ­ьчC2дw}ЙМЖИіфљъС%/|Љ0зјЮљођЏ?<њщїчЯ^ЌЌЌmЗNЖ8nѕgќSдtС§№€уўѕЭу5•ŠU.qЯrмЗп|їRЧј dХьŒ/=цИО}| +ЊeJДж;KK›{{›k;>єhgeїh}щщOП=DUг$Qр/Zлл{ЧЧ{Ћ+›>ю`ccэхЪЋчO~yіbyуИoм'|№јщз?zєДеSUCзTyаkŸžžюmn|јИ•Е­ехпŸ<§эљъюйЏн'ƒDќљхъo?<|ВеU г"ШH‰П:;9;;<ј№qЏ6Z‡;лЋKKЫG—МЄ~С44‹R“н;вП<>9Лќ№3ЗN:Ї‡;Ы/з[=Q–ПшН9йt,]Ute0№wєƒч|џєфќlkmџДлч;'›ЯОјшёгЅЭ§гірОХы /JЊЎYDг љŽџœяїЮЎ.{Wћ{‡ЧЧћЋOџјя'/з76їлВnЋ>p|Ÿ5JƒЈwнz]œŒЋн­ƒу§неgO^ЌэьяlnєUн^TVўќјgі№гSŽЛ:он??й^~ОМ%iв /(a—Фя(6=QдT]<ло9<щєКЇ[л­ѓЋГѕ}о0mBяjYслчgчЇmйЖARTƒ]ѓПk]FBYІp|xС ЊiЊ| ЖЛЛнжmт"-cщЃŸŸЬХ/ Ўz}EгuлwQбeЩ$ФОKМБ0Ї‡—}Y5ЉK,лБьооЁТі1SЧюя/ž;"Hš8ŽчšКi Щ4ю>ХбЙ“ƒs^Vxl“8охUЋЧ.žSЧs”уsёьйЂ­EЖыеЁ–eˆ]N!wg“Juю№Јнuна-Т.ѓыgšуњЎK=GОшŠ' 7К v+%lг%$рнL$ЊqmžpblЖУ‚кђе€А=ћЎMLЏі—ю|…yNrрjгаeEћјŠhs\ЛЫ‹ьFF„„Š”z&Ѕл­j‰МРяЎ~єUў.“e15UQюbшџ€5ЛВ,iКІйЎч‡Ёчh*ѕƒ(t бљЮ|7"<ЛtL,vЉH§Д]нщvtй>.—Zl—bњФКЯnBдMл6uY6>mAЗoЛp+ЛтŸцУ„нњ™fБч:ц€Л˜ч>ф€‡юPйўД +mЦožяGyUOЊ"Я‡eњдVxЎ#ЦGHsŽ@џЂJЦЇ­#ёь(~Vеx4U%лёItз€1шn„њUчдOл›&'a{јв,ЫЫсhTцьf}Ж5ж}.ЬшГяПНћЇO^{б"г ьnлй IGaшš"Я>g@Ж-mСїП?љЌЃ4G“А ƒйkОw!ё™FЋЄu•‡œƒhё|кїй*ўќy‡™BЗгgwХѓhфЛ:EрЧЯ;ЬвDAњ*Ў,Оˆ%EњJжџ„Гˆ›R ћk4šЛOŠ›rЇuƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа AЎЏjК"ˆВ"ЩЊђu|ЋЂЖу8ЎKbЛžmќгЇ АиїR‡КЎыЬ† PзБПЬ0П^ŸgŸЂџЧяlРФwпџѕY}Y3,˜ыБЩ ѕрg6‘ФqЉ!пг'жџ‰Ў(K’ Ш"пы‰Гџ} _Ољі/Я“5ER Mw<Ÿ2ŸЛдЅ„лrМРГѕћЁУ‹šЁЩŠfZ–ЎiК*є§ ќ§бwОyџ™1 ЫС?ь#Ї™Б‚л4ё>|jоS˜ŠЮfuи†iУЯЃ&X†tХq+Я~њK€8ŽIu™ЕОя1г) Я$хlЦ}Œ-ъиšjP/ˆТ(ђƒ0`МрXќ}йкќ§§Їу\И3:Тo'H"зcЩImнvoЕjВq‚l:~†QьЯЕm Z3uЅБћўѓт>ёgОХг# bќˆw€HtХ$‹žu+Š$IВb:дŸ}’;˜ ітqтСq§Žћ§н7щyаƒga'|њŽe{~'q"Ф4йД:е@Д4i )Šf M“иGtКд" Фьі‰кyџcтЅYьлŒѕ`7ЮM!В=*aЛZГюКѓwmжli Dнrќ8‰`0ѓДуј`œtлВmлшМeьџУ•Єъ– ВLлѕag’ІqрћaGiъQ]Е E_д"„ЇЌ‚,K†ыХYЬœŒв ЏE1’iГM›№я}аQˆc›ЮŒђ\˜ХYŽЃН0KТ8p-ХєTйЂ њ\jбBX(& š7›ІИ0g?Pп˜ЛMYC‰|њЮQ›Eл ск,C@:AœIЅУ, *бћˆžХјљЂi†УЦБАdљхПЕžMfAx8ФVкWЇяНеЅ‘я†q˜фqтtа ЪВќ-b”†ЃX ћE|ЊНю˜ЊЎ‡Рц0‚б.ЫІФЧY7QmjЂєщќщСћ‰xи3%†LВ@&Э"#LbшІЉУhK•MЂžnsм‹wŽ;:tiHЭaœIр;ЌЎЏЏЧу9щЙ:bУ]kюVЃ|АDЛљЌВюlїЈeZФБ тк†f9жхцЛ#Vaєn› ~иž‡"ЦГР#Ќžо\‹ToRп БcsžђmКŽч˜šEPASxA ђŠ‡аbвž „ЃІх:ќЧmПsфљЮ ~ŠЃPН0Eˆ„ы<ЏЇЗЗ“/b{ЎхІэѓ5к%4pm‹1ж, Ә% rб7SЦd!+ˆ%]”ёw+yЛЕЇx(уi’тфC>D`;A‘•узЏoFŠMЂfЮwј4B™13ЩE‘G,2Syј#*H ’гщќХhО}иsmаG”de7'iQР­Щr{SЇД\т8qфЯГ <мщњ8ЙyЛС`‘GqК}№W’DЌ$ƒQj]эМotWtXьl€ž‡%Я‡1%^ZVЃщэ$C™СЫ{4IsžЌG‘DЄЄ›dЌœЅА2Aa`t8йL,Л 6u є6РЭялЈ a6W \ЧFWщЊœesQз“лIŽвJaДCH‘љХ‡ј.г’n”Чawр\п‡Щe•БИАM ] рйіЦлЦ‹Ё-ЁЁiѓКкН™bJ†еh2Ї81I5™м^ЃЂ3)Ѕ– ИkФтА":!JB62ЋЪу™ˆOсЕ„UCC-ЫvMcp|tђ{ДEУtLЁлU Dу€RŸdХЭ›лQ†DHыЩtRok;hД8З9š›‚D§$єСq1WY{4ЬЪКdЕС!ш­ЁїмТЕгу{§ЮьИŽЈи~ф;T$МУоf:КМy}SЧQ–сѓ/`Й.Бd+[xPФF a06Ћ&Ѓ"I=—Mќ&Ќ‡ђ]‡BhB6™kЊˆrЖˆ$ЈЫО-rЇч]вБКОН)ёў‹ёДNƒYЯƒІ‚DЎ97Ѓ]7 bJYі!ъЩ! +‹Q•‚ј`3‚ЛТ6“€mИŒXz}„i˜ ‡‰Ow”Ѓ:AYЪЪrrs;)ЂМЌЇЃФGxЊAl7ВчWЩQЯ|”ƒ˜]”ѕИЪГЌъ йФ J˜YТжbм"убAџtЅШD †ЃЁя„ уЄšж87QСњі:O№buЙш4Ы"!ъ"™W“ ЕŒф'aЪ$pЃг”‘WY@–њ`УЭБ шfžЭ4ЖoїИ‹AŸ4Уђ1 2’|t=*т8?пМ~=ЪŠzRЁkыџЫоu6Зq%лљўЪYЖДЖф S‰I"ХL&чœ#0$(џџOя4энЕфUи5@QUs\Bб* егsnїщ;їо$EБ=м э.'~ШЎCгЯаЋLat\CQb{A>*c"ЖуgxќЖј?Ž9щs‚„,oХЄŒм8rУДœЮы,+ыйхХхb‚L>Уhё<ЏКІjћˆжK1ZEfёƒФ РЈ•Ф 7?3шSп‹02S#$'РY57Лs0МnIŠ:+……ŸЧЫъ‹‹щИžТЯWWѓЊ@z]гƒэkŽ$[xjЫQz =n?ёЂ2 уЂ,0оСƒЩИŒ‘т<њЉ WУш0Ё Єоуt]U!џd2™d~Œ'ГХb>Ю/рщE=зѕ(B q=ХрD лшУšОˆ­A@д€P+ЫМL JО4ˆЫzR-~рЅЃI=JУˆJAгр˜СW7 Г‚Q=Љг4Р+gW‹Ыљ|›/ЏІ%rт8/ФAO{‚э„сrlfЈ|$№G9.ѓb:ŸŒВЩ9ЋAŽш:пёу('шZ–вa8зѕlЭ ǘL'Ѓб(-Цу <| ?_.Ў.gUUO&E`Љќp А] CФ]’бRD\РЭI’ъ"‘еЪI•fa€ь0A?ХHјМH#HTxxxРьѕhbСr гz:NІuUЯg—АwБxЕИњ FxeрЈь№œєTќтЅхqƒh бІy]€^\ ’ЄЃ‹‹й(ХЭTc”|QDeˆ'лЬ^лЁщ:—7Ѕ‘щХ.РчЫWП]Сьљt\ТеUфШзэŸЈсуВlfDHGT Ay•аДBo%I>НИœŠ<gѓ ЊдШїТиЗдю‹MfЇЅ€ЂgSoв(GФX\Ю~g3њеХХFOІШ—*/ ЌD ›—f4ЊZ—ъ•(-‹‚G QcXu™ІщшеaЁЎЇ3x-"&@ІЊВxВupЦ<о>mЕ:^ђЪ^a;нЮбіГgOŸЎгеTЫ„žR”.г|<"RWeюоюиq ЅXћbbGъyЗѕЎJF˜вjSМнсюuh4Сё)8љЯамл”М?g>џьџ>џБ+sУюёѓ_ю}їУНЛ~н|іыњоў цёПОwЋhё9ѓх—ŸінОƒѕ–gКуkцлЛп|іе‰о1+Ÿ@8#|Хм{pџЮ—w79Уім%.…Y%`єЯkОљтюЦЙnи–ўI8ћ ц›?ЛџЭ—џишгТy]boџЁ/Оўіл_ЖŸўpчы;CYб4™ †чGG'ЧћЬол.{єє9УЪэлrlC—С ўМХpњЛ^DhДБlkчєЄХГЌBK›lгфлчši_/{зOЛBoы‡wќ†%€зMzWš"rlŸЭwэњ ЈЋНЃ“Н–$ нБiщ§ЖGг*JSэѕњЧOя­жшŽBKЇ=Яд UU$сН–$!вЯQO’5Ы‚{mKшВ†щ&БМ*o"СˆmжђРEUUљН*U†F9м;ю ЂЄ›–‡Ж1ш*Д5ё-S“†7Б ”еШбє:\W5]{ЏцЇHм9m#АЋ–…ъ7tM^0эИ*<л2Q”n +іEШ%зЁz8њAйgA|нviYaтZŠnХИpуИг\ъBѕџŒюPжэы Ъpѕ‡-" }26-xЩЦЃ:ZRХžmЊ’bг’фUлLшђКM{Њ5Uџ0Ѓ]лtl/ЪЊщt>Ÿдu='kЉВЄ{žэмаЫ[N3iЗ­Ќ~бjDƒ—V^Њz6П€н9‹&‰2эsvэUK?0TШгXсОИ^вП4ЫЋ2OBЯж“,к2рЌ`ћж„ЈМшйД ‹va;žњПУuM‘ЅmƒДЄТМБyI§рEёš*гjЈыЈƒя"Ч8њя;х!УTeeьјЫЙТёo †,„…іыMу:пeоЁТ—…П§п€—вP—~иcњ=ІupРм@*МѓЗЎF:Є-юЬ7yТп„J0VЛU|Й m‹&”!и|эъG'7~\ЦџУ q…Ѕ~Bќ`гeM‘eёz^ЊџЩLМ2ŠІЈтЕЄ{ПП=Х?Œ§„†cƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hарХ€8Žі{CŽћŽзЄГnнА УВlзѓ]зЖ ѕ–7HВЊ[–уИЌ\зulћУЮ3_†ь {ЮrƒС€gЯЏџц‹/оќŽdќqfЌmъКЊКІiдьXЗрэ ‰|П?шŸw:=|^џхЏоДZ‚‰Žmšuk8>ujаЌщtЂГyЃўюБЂ,АЧ ЂРГ№ѕp@f?ќўЭѓ‡9YІƒщAкЅЦнјЩФшКa{ŽчодсоУ>+ЈІЁJВ$JšЎ)ЂЂ)В(єЛЧлko|WвIжtлw,;ќыоtP=u 0,гr}ч&М-ЪКЁЉ ЇЁ) ќЈxтІad§рєЭoгбіАЭЃ`„m{ОчGОѓл1u'ое3cI6ЋšЎKь@€‹5УЖсD8а!№Ш-э0Ь›†уОCЭD|є№|?щз&Ж;ОЗъў‚* ‚РsМЂф9?ШjКžИэšЏwƒ` УЅ/yaœФqRшsƒ LB‡:ЋP7]wЅVdUђ‚$Щ`„e{^zОEНYl:СлЁNЏGВЎщЛ–Ф!ZяйNgYašФПТ‚Є‹ШШЂЈ№ЉKvxЖ…afлўus2ћѕ3ƒ[ІЃщžeтЎ>ря8ЁУ$/FЃW#рŽ={e ШQQXpC1Љ— FЈicКО‡чNйЮІоЏ]sШ ‚Іq’Њhд‹Шу4Kу(†бу" p nпіgEч#Гš(ЫМ&)?DfŒ'п…Ысn/ jXD™уѕ'§Ђе“"$ž‚nИA')ЕQ/ЊКЮгd11 ЃР]Џ%M@Œ35гv) \wWР s/Œ№3Ј"ОбžaыeWЗLЄ’oj ЏD)ЈQ”ѕtVe юЌ1‚4tVaѕP—]жhиaьGQcixљf6Q„ШЁ 7ОvеюЫŽ Ж‡^”Ф~BфљY5ЎЇуёx2…Ћг8 миѕВ4АWpъЗЊ‹р”\•&IDъ№:ЩY`,Ц ЎkУуузЎ:y„–ШЋ ”Є(ВЌШг4ђ!юр‹ёюбš„ШCЎЙ_?ПИhuPдPЃkѕГЖdи†)G)(Щ xХ4 “В˜\Яa5"$Ч О KТеe=PЄЅ% xw;ЮЫ)=ЛЖГ‹юNЦшl<з Uyž=й9nœ7ZНe4іzч'ЂчƒЁ^ nQ.ЄГ(У,P#œc„оBsћоЪNЎ—Bпv@РŠucѓщ|’g!ЩшэqрR%џAЭЇЊBуфМ}qАwдьійAЇ?”‡­zC м2F‚Ь‘юЎЏЏчEVN&s<&#“‘Х!ЛVeД††В4У&TbкA6›•EDyeœх1-œ,Љu,vZ=–эдkWМ в“UHМЖ`ЂOО(tœfг9ЌЮГщb~НШЦД4-†cpІПВ–&6tЇ РbQЫЪI™Az!=7+ <„ЖђlшT бЄ~ЇЧIє4?”’ЖЃƒЦё‚4ЫiВ‹‹йlqНИ)ѓ9ВЕ†CD(VЅPQ{ъ„хi№л‡rШ "‚qQP:GкC9R)Bu!Ўc2зы "/а1;N"Z$иО< НQ1‡ЕЗЗѓЩtΘgЁkа_А=ŠќР7WdДD ‡†ЌЎы.-ЄcфŽиЗœцiи g/Ъ’РСћБg:pr$лcљЧЁШбќМpЭq1ЪgЭxх|qs{s;G Ю2ф9\@#ІeфиYб‚ЌЫпг…Iašч‚=.hƒ{ДLŒѓ"BСg…Qц.ЊUОпaщ)Б2бИHQa96hЪIуЁx{s=‡ogށPРg гШЃmЏЦhYб%Iьы–ŽДLЃЏЬУ ) †C*›FјwьгR^‹О†б№dўъr ЩЈО bљ,Eр:оИX,ѓйэнэѕтіюšцОb[ЂbcјЭ}Ћ1ЙLQс„_Ёъ(ђqRNKˆс’2›M’tgљ ŸTЂ(УЫsV%t8„˜~1›ІTю‡љьњњžqЛ|ИОЙž&­ѓœJŒqŒX…x\ Н@nZЈў$“ шhœРДlœNЇ9ЈhxT!{ptYљR‘hšІАч ujVCР‚e–ХY^LonnНƒС7ЗˆХ›ХС ђœЌjуШ иоj2Е`ЈДИSЁ zЧxы4‹‹ХЌ(аz9$f™AѕAaN ъц(pUHzC&t,пЗCJн“Y™Ogѓ›››;X‹fОНЛY\ЯвРVeATHXЄоŠтќдй’#+т(.TAФйdΘfЋI^NІh6”SКЎ*lcП6€zі‘"УюQ UЬ‹k8ђв1~НЙЛC8N“‘ƒ(5ХіЌ0‰VF‰bЩYH 0z’dYDГфpAiM>)ђ6Я'аNЈг-S:Ї‡']гp(E‡ЃtRц“ыЛЛХ55о/A8NЃ‘-ЫŠO !GСЊ#%zЄ!И,єA,hЭ8ђЦГљd2ЩЉіЙžNчхtƘУЫСj”О.ѕšѕкЩ˜вЃRЁ4IgзЗПо"o oоVŸ'c$08A7§(Vd3xBu'„~„XЪтqЯч%œt‚^@ЬOчѓ›E‡ђЃйЦёQ§ИЉ Єё “GјИёlI(Ko^Іщ;|ѓШ%0ЂVеGўЪŒVAЬсиGW‘!в‘?ŠiKЯР7З‹й|FuNs5ъ€а3ДЫН“ГZН'нР!ч ДђвЉo`7\фюѕVћ–6фPшh гъiЦДM?єƒp•%ЈлёGЫ@œ.Гж›№ZLB:мd;MкЩV­е<<<ы‘ЊmnbЛ#Ј:М№єB-ОІ<^вю{К(ˆЋЈКы­ЮfFЕLЙО ‘§шХ|RBaўzGп§ QAk:дOtюрѕљEcчрќьЌоrlzЌе‚ @™уУ‚ЪoІI\NQ0ъ’,Ќ(!Wh4c@uXŒЮ‹1mЗ …†˜ аœ{Н й–Š;zуM‘„ЮбЮСёСЫЭуУУz›7m: lкH…ИГ Ё€ЮЧЈ&QhHъp y*ЮFPХIтуН‰ЃјGъEd-ІEќЪШJЂ(Л'[›/6žНкм?m^^ѕE—шІЦqzˆŒžчSЊ:r(:ў‘ŽЭћнћб ІхІuр!ЅЊю8цsx8є‡mнVЋнчXNІїйlГЛџтйЯП<{Жпщ:нAŸхU]л‚‚\&Гы2!яOгLПЃЉнDГ\пЗ$(Nc„*ФЯRзxЖ-їZЭŠйЁN?з8 ƒЦС‹ч{'-…žрNDЖУJlЇ‡ВЫЖМQhJv‘„cЯpS:rњы;”™ R|W—шмуhY-з,MZ‡чЊ.е’Р[щpЧћрњзщ Ф‹‚СхeЇ7Œ–w/…9<щhPTЈvGI/Пƒ=ЃqGQ0<оЌo™`TЖ]ло:ыXй‹=TђЋЃС€Lмˆх9эЃZSd…ЃчШАћ‡— ДєrФ(‰cиNЧшЂё8а/Зxл1 Mз$О}ВЗsXПь)ЮкB№=І[†r~оя№„ЛЈJ]…ajЭ‹K–№Ž˜Жn”Р1ЦДЁCпжЙЦ!#-ягXјрƒіСюыЃцркЬ0 w~&[‚rН{žоg˜ЃкёызG-‹%NЧBGqE#gаЊР%гj6JoгШч:ЁЭ­R=и–Ћ] Ѕw_Н|uЈ,§9#„щxАФAПнюєyŽй;МрСЎkТp§Зёп!+ЂTyQъзfwwwыхЫ5йђNсђ–С8TЯONчW,ЯОмnщ­ §О'”ЏВaѕš­vу€aЖv^яяэюЗЌhєІБбаqŒМБпh^Ж//;ЬХю‹У.'|іwUЂ\Т™їЖцеіQуМещ›Шr)Нm…ДG+nы­ObF‡^7FžмыгØ?ЗaП#. dg rщLƒ4бŒ8rз= х/€‹YeeBeNš-Q”щш“цуƒ‘e–фe9-в$ЩPчјЩtRŒ?еœА?5/‹М(Ъb’ЇYšЄE™gy9›—kW(h–#M%ŒІ#бE1ЩОшт—S˜MяйС=jo‰oYјЙѓя‚ЄАЙЬRДsœDYw)Š<^_aВ„йlVР-вž9’Gžљk›UЕX"Y#Ѕe D4њшKf–%})Muє ШёL,o!љр”\дbикk­EыŠ šžЂВт4p эsЩ§/0М™Œ …ЮBўмЦ| јO0ПјЯ€xіsл№б{“qW†oО§цсцХЮЫяњщd KљТ]фцсƒЏ|ѓнуьm<§юёѓГЁЂЫ_јВІя™G_}ѕ№ЩПl5кЇл?oЖќpаЛjŸ5ъG szМЗГГ§ўkї6_М:`6~xєрыЧ?mllќ№эCцёЯЗvvЗїл‚ЄHнї_ЗBєDсъє`wПощїzнVНvvж`˜FН~й:xџ› fыљгЏ>~ђфщ“'џicsПq~Q;И”‰ІЉkЇ +NбФюйёqНЭђп­6Юцфє|H:яПфхЋУfйп{ўнЃoџУпо<:Л{zТiКAжntЛ?”TMт:эЇшК*ї‡g SЋ5њZзДЙW;Џ1ѕкжгoОџсйЋэНZ‡“UUa›-Хpm][ыBЎ+ЎпуD….б5BзПЉ2?hœ0ЬyГqѕЁЫvічgL§hћЇŸŸo5/2ЅЊє.Yе Г™ћ'ѕnoѕцvЛvаЙbН / 9ЖA4: кяŸУ—лЋ†гIутЌЩlПм|}мМъї‡ŠfD—:mEЗ"п"§Ѓ&Пњ<4ЄЋЎ–яй—оЌˆtLM•†"пmu=кь‡’.кчѕfwgџ№ЈеуIFщ„ л}н№уРд‡ѕГсрCWџYtљЗѓt™ŸПnєeК0.]@S+bяќйƒе?МфzЭГ}ZлЋѕ9:ёMеM]—њI3FqрЌgMб@оі§wп?л;Јt ЇcZКЎЉђАзnCџ.`%mxuЪь7їšмP!„иžЅЫУ.K ?ЫBз2жСЌƒп–d}ћшЩѓƒЫ!1 ЫuКxA•…^ћї/udцѕоы“ЋЁHtbiŠ}Ž˜v2ЩCл4ф50ыП~х7п=}qд4К@‡..D’Ueіљљ7H’8`vwOк›—Щ>fЃЧшЄЁЕЌпZBаˆ*єš/XФhл–Ьмku/q,зvТ8…є†]9ЭвШЅ‹рm‡Юђ]{]КщŠWˆ2h.Ÿw%Вlщ{.HFдвYР>к‰Ч ЧЃNa:›ФЁ яЬЕ‰Н4{Џўц9jFпsxƒайЇŽk˜єООAз5ƒT5~0рUƒN 0з7Žн…кшП] ‘JїИч•‚lа•#ŠB4)У2„vѓДоh –+бзx—ЃЧѓ\ыЭSЁЈkї^Ў.–C§кr‚Ќы/Гў ŽчўљfTё§ХŽСтyЎmъŠАrMїGш§Із9IбюпЉаT]Xр˜КFkйэ-†iuŸм~цЃ‘XІTAy› Гё2| Ъђ=ДŠdувiœШ}tIм/›4…ЊкGtжч]%ў†ќщZэ}:Ёэ‹О§EН‰аB ­Л Ž‚2џlѓlю™&hа9a˜Z—Ю1Пlчx bдІУб5єџ ЦtjГхXtЃ/ јп€ŠыsmiTЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… ж^xЛщ—}МЧПач†ВЎ›ІЁуЛeъD§єБОWowTџњoџ§A%ЭащFеОяИЖEЗЧіŒЕя ўє†/бНzщЦЄtgФЇўіџёVRdM#DSEЃ[l[ЖxžяјцЇ?ОІ'вр‰Њ"Ћ†ЁБЧ0Џ~јіСЛ/“4Mз4E’шОрМЄъцђ w?p\з6”OЛ5Ј ЖEdQxq(ˆЂ( ƒ+ц`ыOп}jТ!lC#ЫюаM<ЫЕ зwш†›юЇ;ši0hŠ<ЯВ^ьЂЄ(Sz@і8 <КiН8kД$A№ф†ц_X†œыXžи&xУ2tф”;ЖчєџйЛюяЖЮфŠП .k{wЯЎ›dI–(‘ ‰FtМо{oоC%хџџ—мyŒcoŽ+ )'ћ‰: $>тbоЬ;_СШ0ГИa„c„хЫљb>'рлG˜zGћ,gІUdИLЊY–хQ’@xДхК [ 7…ыџvЩЅьб'{УхMл‹’,{ьљ^”дu5O’4N"rы№X­EE6m˜=jVсуОqmЙD^ р6uсюЗk^s2ЁФЫЊŽРѓр$ХМШЈ[,lwЋчIш‡QpЄFШŠІДkQьј~'0’kб‡шЛAGЎ‰Фўа„юя@їЧд*ƒ>rк1$йŽГКї1ЕО(чАtнр; ыў№ЧРЬ@>—я†TИЧiСŸ-jB=!eКЦжИлп.КjЗŠaшИ5ЎЉiŽяХ9ЏзeY•‹,fИv…pіcxˆb)ŠerD}ц— *єˆЦjЯv<0ЁЇp­п.КюоteвръШсљqО\oЗ›UU–ЫEZЗ&OYТСŽ@з1ММ'pУyUf8 ŒM кPu„ЄІш\w0њOЗЦн[жї?Ъbј“EYmVЋ ’%IœЄдМ>†ojЙDA>уtОР+ц9м#„§“Iз‹Ш4ЂЈэіˆaЙ_eчTрn[ŠЅCz>н$ќMЋеКЊJъпœD`p0vХШшVO,+rЂІ^QєuеEХ>б4h[“f3†›1К:шL5hПКЌsКaMомЉ ›ВHКn˜Г\ЏЋ%ќ"ЁќЅyFNд~а+лЩS УOвœКq/@\5[QЇZтгдEbФ4ЦmVз4™у U{C7„VЧ 6L№"щtЙDјЭŠЋ"ƒ(ƒЫDРŽДzсA[ВZš­NgЂщњITЖФ(ч№jd3И\‡rЄjщŠЁ‡КahШёš<эД%|?nC2!ы!ѓСЃѓВšЇѓjUwњ јF КрQрВЯ™f™ž<™ фдВ}‰P"ЦB(’мЈ™Ќ{І#єX zвD‘™ЛfWTЎ'иvXgП,ЯђХv=_TыЭvНL#ю†СsТ8>h6З!‹dвБDй`‰зЌ–P˜oл †,Љ“qъоLФК(DY( o›НёŒч$Ыrёa6=ЏwћѕЊммяЗы2ƒэc`‰ФШ0qr8бМU•Кы†s`FBЫ vТL‹Т F]" LГ9yNЌ[г№УvЋгщq–yEеJххjЗПпmVНAŠЁД™ ZщA7ЎпeЂў'оДt/I2Ф>ŒDR3) 'Ÿ 'ЊC`nZSvаNfЈТХiїnиКhё пЗ(w†Щpя{ЗпяжхrŽыу А}|xРцШІЦs“щdФQЬХ M˜s"’rž€_эк––eЈJП;™u›WeКЪіњгбЭySАм$ЅbХвхfџ№pПш d"Т„‡пуGtv†Ь„2ЧOEыљ|ьЛZC> шЪrZ‘Fc^wnЦ˜ажEf8œŒz‚хCES ФY‰м“Бяїћ§ЖB‚![ЧP!ИaюсZœIђdpлŸFšiК^2Gf<"Љeq`SW9mш9šФHКЉЮ†"D’nрщн#Ћ6фk/ЪВ(цK85@я`ь_оnЋ9ДjŠфZЫНФwжы{ЦŽF­іx0TЈ­W@Mы]Œ‹y8TbЧHŽ =OS фl•zMъа*тl<Œ8fЯKЋMUVЋэfОИxћА_ƒьcŠdИ5Т18ъщl<юєfƒЄ#šќДDх%)5фd(&ŠЧ‹Ђеu#ЕЙЬŠЄ§•к.™i•Ё ёTЛ-@яїїoп>tQkъМШ’,ІRгїš›єћ§ AЅйŠtIЕвzЛY/ 2TŒт)…š6ƒХДХ'Jœ(KВЄщ† 5,Ћ<І4ВмюwˆBxЦnФїo6Й%A\фqZoКіЁ@Гќp4щMfSуpоЌЊ€yЗлТI AЈџ^ ђмtQФ0ДЁ‹ŠШгд“b@ЕъVPn  iъ`Еƒk іћЗПрсa{р[n aRщк‡тŽёгоŒe Уpќ ЂDZлAѓРфеfЛ*SвЈ)H7\š€жdfB}…-Ч,'нP­‚{Гн"Змя(A}ћuтИдм1ЁBdЎы43›‰у;†с!0Q€ЇЫ ш N]ŠэКB­Z “х"vLяMѕЧЪ3sшхаt[xЦnГ!афї =ќdCiiF€Lž&5ъƒ•ŠЌ NG Ч™TУf(ёЊ-Hk%'йТŠЫj…Q.ђ,t-šщу­>tЂЌШJ„ьzCyяя–8ЏfъћћMb@Јh.т0 ќC%rže~6f,јsдЋ-МђpЗ@ 7l6еЊˆъЉEв ƒл.’Ђх%YЈХ;Њˆшv„ИЦMљЫУ§&wE—L$—МЎ‚•ШIQ‰A!€4œФЫjYЎшѕяЩЬ”жv@МцѕhDF7†“іэH1 'ЭЉ D –фћс€ kЊО_'. xIп1 NяP.­Јš"‚ЂkІЛX’70О @МЛШ:/AxЎхи:Š˜YџъЂƒт톔…ъFB'эШ9шшсжoс"›4@'ЋЈ QљІбСŠ[JЩŠЃЊІe‡а№pŽEY{хžŒM~ ЋяWаХqф8~xиы\П9УRмRtRБE“[ьяЗПRЬ6 tйT%И]%YфlЂЩ2PNЃxёмd1_"WаY‚ЬіhэuЂ:їBп0ІW—ЭЫЫцYGДhZкƒnuCpN‰ф§Лн#y€Ї–V;pЈ&УCanа #E†Щ’цГђљrMњВЮmфЉˆ­ЭмВ(У–f OЮ›7эы‹ЋGK>ЭLЃPЫp~xЏО7taakšЂHšk†Фе‡Ъ‡TЙ@nˆZ L\.“ИX§›Љ€™ŒОЏR[1hŠrћтьКл==ПОюВ*кz‘ТГЬx Co6ыGд@Мйm<4P§r0Ь†юшс"І–тХПћ*<ЇЈЮЁшюз•њ~'y‘8†‰ИкьVћ} ] qКЪxаъŒЇ -(kКtwўь‡яŸ<}rоŒЇ4їФŠЊ$Љ~žЅХr фpŒЭЊXЌЪ"іu†;вj"И 5yиБ…Д\T)Э Ь|G—ЄснˆUh(=Н=yђфхE›г+v<J>ЭЬаъV‹E^Фј%Ј"Œ#ЖЁtlMЕh…ФфСH–ibѓД†]ЏКЁ-23ВЃgЫЉ’Ѕ^НММщЯfш \х†J4!а4ЯЈЬNшIœљ’Ф|L“q|}ёђѕEГ/ъЊaeБх]C6'W§йp$HКэ‘<гxъЖЬ‰К‹g1M•бŠA–D)!Ї)пдн„flьй…R1$–B…Rь ЌШВгбhШКuHDSє№8;ч‘&›~р™–Ё‰цЧjЈŠJunOuWиЦdмяЕК*ЁЅ‰н(ЅЉЃ(А к фg…/ŽЭѕ\dN[сўwіLМcШЖя†jЛm˜ёГСнЅѕ‚А'4|™“,Ч a~ЃwЭ ЉSofUs7і_МдЬDVъ­‚Ђ М }IІ:ЫIД‚ˆfЬУovyEг ѕcіV• Ы5G#fT/rPjдIžCbЂМХ Pп<ЖeQџXЦ§Ч!ы†<„@zIOXo^•EŠќB3Єa”аўX|ЙF:Ÿfгh.нЎ—H'RLBkšEžгBщzЗЉRчmfЌ,жДОXаZR>ЯГbОРŸЂ\ЃT?еFзfЙЎaвWŽ КX. ZVZk?ЧџxШѓM ЕL‹ЃsјЭва4:jс*љt[GЇ+ ѓ–sЪтє-\dYVŸЎЁ ЂО\вL№<”fKкіƒ>§Xлa?`hѓЊЈwŸt\[К6ћjyЄН>‡i9‡ч P(zA%dБЈЊрcуњO‡WTЋЊ^ШСзDyEњ§гBRP{4љ1mЫФ$Х'…ѕаB]Ў`№ВЊљo^DŸfўўнА’‚ЖU40УЮѓ"9шЮ“у гOъЪWNууз­Pе’ъ:ъt7№ьcNХxu-ХЫџwџsќ?“іщгПџјъВ5ъwл—Џ^ќ|RџѓгŸ/zяОрњњіДёъй“П|§хgŸ}љѕ7_}љљч_ўх‡чgoN_^ŽY>њI™j(мрњЭхUk4Мы5_ŸžŸжџёќщЯчя}qўВqvњє›?є_}ѓЗgЏoњЃaћfTя 9ђI4FГЧжХЩ]Ћ3œ2“жЩЋ7—ѕџ\]ОyљюkNŸ§tвxг<љыŸ§ЫgŸљЇП>љљЂ5˜‰г*†iщъ‘Х+Ї›Žу˜Њ0щuG‚"3З'/Aї‡|чнз<{ђтЂqй:џіЋЯ?џт›П}їьЊ;ž ’*sƒ™fљžЎCTGЃaаo7њ}žŽy@-M‡SХаіютбЇл#џ=ФќфХйEуЊs§ьЯ_џљяЯ^_мŽQ1h‹ХH4‚иг•#œіЃШЊ„›йшїІŠit`Ь6eVаdn6ъ?Zњђ=vn4^œ_Нi4;WЯОћюЧ—зноDUнPTa4Uє8БUОлžк­yЭВM]ц†NЛЯЉ†I;Ф€ZЅ=4LЛѕx  љюh4^^^œ5šo^§єќљi{ЬЬxЅоЉБCAГŠЬвІWWcvrXс5У65ЖxuвšJtЌЖЖiжVPиЮеM§SwяНўњtvrђњєє–сyIRMз1,y2V5ЏЬm}zy~7™МїњџЮsЊЎ‰<3h4ОџўU{"УдtЌ†ŒЅЈтјњ‘щоLЃaчЂётuѓьфђŽ“DY5<\ЌЮFœa&UюXRяЭэнaAO9E˜ 07О§юћW7cQЃгЇQ`†ЎЪТшъ~ЧzŸN›Џ_пŽXФ‡ЄžЉI Ї™AЙЛŽuxі`D™›ŒэYyЌХh†aљIфЧЪВј~ЧxšЦp№ЌГѓk„ І^žЛ–Ь!Tœ|Л/cЯ1>o&Hмt<МЃ,?~ћфД3•uк0ХЁcгЖXљK68БqёъѕѕHRщPsВЬCTЧ+6ЛЭ2і=лжЬzЂ0ž`аЁЌžœѕ%јZŽFЂбTх?МЙ" йДЈ;ЖљŽЅ№ˆШњ”ДСlЬ ю-8вє*ЏALлЖд=§Љ1ЃMрžgъИФынЫ9†\‘љё]чІy;`%Ик<Р}А1“ў•НыlŽу:Жј–DЉЌвГЊ,*0€”‚Ш6LЮ9чАпџџ№N(к%[ЄДшђŠ @юžюгЇяНmS"ТšљЂња+) а]Щ’Ф*8>:9;й}ЙГЗwђџi—? ^Ѕw;& ЭшДѕ‡?dbал)щx›~lЊU‡gcŽЛ§“JЦ’NoдГЕ |"щКвО–* НSЧЃЗИšTВNXUз5YИѕ§ ^ЅЗT›нЭдuнњpЃ%Э""FрrŠЊ‹Ю6Ом­o—HЕN–Щуh::УІ‡OсmшК‘MTW:\хvtЧв[‘Є~мcSєіq—J ŽјU‘зю]˜СџAIfи]\Јƒd'Џгбў‡жд? ю 2:ЅТѓCd"E1Џ{єЮbэ–zmPuН=ДЗ|zŸю}>ДђaPm?ˆ#П+йœЙѕЧ з66Ќ›Є УМЏGА>SF{єшбЃG=zєшбЃG=zєшбЃG=zєшбЃG=zєшбЃG=zєшбЃG=zєшбЃG=zєшбЃG=zєшбЃG=zєшбуП ЌЄ[Ўу˜К&)†miвЇ0юl0bиЗЧЉ>јќ_џ™%Эђ<Яu<—Ю{ЄSs]ыGqБЂЂ™tЕЎt"њз_ќі Чё’Ђл–iвqЪЭx?№Мћ8й7 ˜ ИžчиžgбШ‡пќіUВЂЈЊ$№еUšŽБёуЛзВrŽЮw]a­›Жг$я4ЁиŽЃ8B€пСBн “Оq—}з24MQe™†ІH’Lc UlьН{ёёX“4ЮИuщА{л “ДЌЋ"/в8п†wДігп&uР XэX†ihЊІвYЬtLВ"Уз†.2gя^ўjh€^\/єщˆoX˜de5iЪМ,JšІб№AxЛVK&Ш‚в( УFъnКaлq‚V5LUњЧИЯG.ўжЁ3Ї}ЯŸѓzвЖ“КШ“<Їyъq@Дэпf„h4QЩ Ѓ(ЩwˆTГ#ЯГ‘oMWM§ŸfJ<xЎ‰ТТ,BцeUMѓ)ы<‰hrž&!YэнољТ№Јяљ1lюFrЃJј^AХpmз\гu4аЗёŽ\пF) В‚†п„sCГn‹$ŒвЌЬВ­XІК>–бШљ8Эг48qn‘пmје4щн0™'ЏаХMqНюЊЊiы2ЯiЦmUФОB‘Тj›ымN]guг…_#|s{˜ФY Ч-нёшoЄšижиwг]žtвНAчzуПЈhч“†† —5\эQbтыЄ|снЪСШ’са…4Џ‹ž.*aœЇ!Ј ?Iœ†ОяQКY&Лџы5;‡cV1U ,Ў›Кх'E3ЁЁгœŽIƒ$Yу‹јЈЊЗ1–Pu:zЪKаU–M3™6”^юЭЙнˆРBЁб-sєтзkŽ_Ÿбд5ЦДCDq3›O)г,NS”˜„ЦЉЇ‘;ч9ыŽ тШi†xž Ў <!-“$ \УFшиš& ІЩlџzЭЩ`x|Ъ;ŽeћT`<„T;%Ћo.у9^”AœРыжК‡Йlаєл dФSy7іЕBtЄјvžућ4Ј…Ъјš‘˜Г ŽaX€с5юшЬєˆsPћHn @f‹Ж*вШsУ8,'L/їнBThшE˜чI–e(ХeM#vSPМфй–*KЊeЈЊpt:fU‘N@14LspР{(+ ЭBIВœтc9kЫ<C“еŽИЙФЩяЭtћурY%†бЗЊ†Ь&$+,•у$‰WЕ‹SVV УАTQTMKЗхЃUЕIЌPOЇ ySgIh[p?ˆ2NcЂХЕF†c%гwУ8.$‚zк} b„†ЊРНš:К4шQ]зef,й†eŒEC§tќ4ЋЇ‹Хd:Ї5ТŒт"<|MPЕЙоКШВТ‘ЕNNњA нPУ_Аљ&ЄСtЎeй†*ывXшєˆѕЄpŒ†ЏœЪ`E†рЩv~Й\Ьчѓiг4yцƒWмDЎіsuЮот9EИ`Uн%bѓ‚Є(Ыv6ŸхETƒ!ш;)bŽШˆp њZУ…Ј.cжБ!Xвд1­ЎV‹ХEІUЛ:ЭБ HУA‰ZЇбcyx6LМT‘”u3Я'5ŠшŽ:Z(ђЃРŽ …ФСНЖL™eyAЅ˜Ј<ЬkќЈЫеѕхrЕZ-&а!(с4}Ы"W[ЖыmvGЇЧGШЬд šЯgа]ц Ь—%š/іtЌъŠbB‚@Zѓƒ7№ЖЉR;щquuyЙКzsu9Y'`(,HЅЅпЦ\б]тлЌnл9ntл4 ƒŽ@Hcћ–&3#Iзи1;ц]CLНœž№`d0ХUш€езРrвц!DShSГІЩВЌhkdjv|~vxxx4вbжЌ€­ѓХlв€rrлBѓj:†ТБ{vД&Ђ-0TцјјhчхЎhxЂ:ofЫKрЭ›Ћыыy[Ѕaа=ђ5Mџ[#QЫ*s~јњќшЕ„цƒ НœЗэtБœR:EЕ ,GхV`Nw%Еe[к`їеоўЁшРтВEЬ–Ћх!ВZ]_Э'Шš&ЛЙј‘%њЧй*;<;??:т ’)Щ'ѓХjŽˆыi•Ч4:/r=™YŸuŠRќцЮF‚щЧq\внY,WАїП–ˆ‘e‹О‹Фž‹‘dе\п+чxnx18=ЈlARЖpєrЙqMл mT%yFmŒ#щ–Ђ* ЇаZ‡~€Хl(HўjFЌб™ŒА†Э—ЋY ўСЯxhдdIQ5I=Eфx‘1Уузc™СТ›гm^аиљВЈа>с>ћAЙG {<!ЛсmлvbЪж$-'s4ŒОD.^_Qˆ,au–R#с:ЖЎЁГ_SлЅ№JЧŒ`]F}fэw•m6!iі<ќ d_€цмВ4AЕhі’nzш ’А*ЖЃ;Ѓсh№Шеj’BХ! вБ Цз5^IfE•х!#№’ Zа yKЙtЕътђ‡šЦЊєiDЅc+2:Д&и!+Ї Dгy‹Ÿ•"уђ }лЏWStАšf:ZКЂЛ:сэН^gˆAЋГЖs"tБX‘щѓnкa ‘]Fv7ЕME(Ь ЫŠхГЫ?DlХ]XПЙюRБ@ƒœЄ4 *Ыrз4ЗхЁ8–AЛ‡Hѕ’rŠяz“76C†LЇаmG4РЬ1N$еЇИQХUЗXнз—нmZЊЏm6JS}@“Z-?Xб'тйˆe йpыƒДœ­Ўп “ž+ Žю;бпЄNZJuLMf9%ЮBtфE1щ^{V7.ыјЋe›њIžPSК†NузbГ ˆšЮ 9жDуфФE /НAQ#Ѓ—АfNБ Б9+Ы&бЁЈІФ0‚DВ0BGцЮqw–dѓ’Ь%Ж†ЃЏ(<ќ0‹2шХ тAАЏХш C1хСˆсоД ‹z‚L‚Ћ/Щqѓu‚юœ&išЌЊІ+_œ б5xДƒ›SGƒёV‹eї с‚<МКZ4yЄQкѕn!IС5ХДЁ›т4/hшPЂr[ŽА|E†Рњ=)к’vlFrЬўЋ#о"3|ЧЁйЄнK—нЫEWЪ—dєВ)"/KГІЊ0ŸчЏЩб4нK№' Џ7-ЇИЛDФчшІƒЛЊдwlзV~ФБЇлл[g$Р]лDoщХ5йLСDf/hЎˆЋлмГу,F‰AћQИ&ЃSSXIфDIF’W3„2тšИ3{IŠbБ˜&е5ЯRљУ§ѓГн—ЏžНiЕУsћО–ѓe—Ай эЋ7з‹* ,?GКfр>ЈБЕM*ЕбЄъŠ jЊпQ$_Q]]R}Ё4\L3]ѕhaЬаЙ?ьяьНzБu&;œoб0AлЪfd№|J™‹;D5цzY!шэ(IŠw*NжDxdДщ  ‘ к‚МЈf‹ъё%Б,иvqуЗIЌ^ŒZЩ3ДСѓЭ­W‡[;;ЛЇ‚^›ˆвvЬ ЂЕƒљt2ПсmŠщyŽNЫpуев+ZŸб-}zЈVnW5К№К^РгoЎ:#ъ˜$њХс…ц Ћмоц“ЭŸЗyєЫі/ЏNY™vИ Г\+ШбСгЮvвІ—ЋiтйŠ=кЁД‚L]›ЭДšюјБ њŠв Л­ђz ІО&њ@U_Х&vp!*’Рї_>{єшЇ~zњєхсыУ ’ў6дsL†#D№уЂЖ4‘ §Њ:ЎЧEОN›76,ЯCjSk„ІЖШВ$mа2§/< •WЂшEЎ-ŸBZЁkR%цјХO>ќщЧgћчC†–5в …~!2C_Œ™ е,“@—љZM&8ДЏFЋY :тЪmкLаBхhbdЈ}>0ќ˜V$#Wэlў№§уg;cЈ=гum}xІхuгт>с"ќб”‰kЙižИЯЪКЌмЪ^‘ЖnGq˜dŽџЩs_ГJвЄД“Ф™3Tт4>wХŽxОНu4,/юі:cƒ3ЊКЈъВ*ŠВL,YИБрЦскДшя˜Xz7ееdt$ќСоиOZЉѕ‘HЙ'hOŠ<Ы3 В%в#І…JZ•ImЇjЊВLгЂL|?пuxrЁxС] (е xuк\v=л ВцwЛšpЎ Gгš{ŠŽŽvЏh›‚tвМL“Њ…Ÿs4п–2:й}ўѓ‹эƒБцКw1эSЕ]MўєЩулћ' X„PŽТ„жіanЇДБ‰є,a;mdiJ›JM‹ЄѕiЋwИЗѓlsѓщц.kzСmя2LKa†УсЮцўёЩбЩHВхEПЂeЂdjМ2ђ.ќ\€gВ<Ї§ЛЊD ЮЋ$DnЇУ—[xВ=аМ;АљŸ (#A_чДDж AРЖC›uˆќљŸгЪ$5)uc№vž„ЎЮŽф[и_љˆŠlаŒtФpщ…a’вFў‚2ўЮєLф”чd:­bм‰ШCŸ ‹ќ‡Юћ^+$v,ЙЈ8Бmљ(ТОŸTuFЯBЄiLћАa”лФуЌЊл5ПЈ…QўБMлГюiьЇэИЧЄš•ЂЅЉ№rœ 1§ކР*ђЂn›йb‚†=œЃЯЄЇЏ\лОЏQЅhЅB“Ѕб€3уЄlgгЖ"ЮaФИ:ЏŠ …jwЦБx‚YЄЧDюЩт ъtЯ™ЃУ н!щ *О1:Їи€“ДЃDкЎАEžcoc3љЃaH{[ЛћˆqЏ†AбЫщAŽœ>eе€щкnЏЃ№ЄСсю)ѓIX§+ЄА]LЛЭХВ,nŒ.щЩŽВn!Ÿлќ.jШЧУk–ДЃбжЬЮђВ„Х ЙОžЬІеЇiѓ†Q-fшzІЂЂGQЊ -=GƒD\ЏО_Є|>­*Ф‰{дя‚Ж+ZњМ™4цЩ‹нЗ‰џсlŽph!шH ѕjRќtR[ЧЬж“яялРЛх‘ЅM[Ё7ШЩЩ]"NГOwКšƒђ ?kъ!§**ˆшiыоЗiП1+ЃuEX‘є#“KDј,ЛЧGМп '-Л˜щqQвУN“цЅЛЗp‰“чЈй0 YQƒиLвћ6ы_РНи|јЗПп|"Feл=YE 2mWiъІИƒg?wАћќлoп~&GHПЩ iJЫ№IsЧ§д€р$аЃHРзжE№)МCф}рнt"_зН]@hў'и|ƒNJІЅ§ч˜ќ_!/ŒоџЊ?…‘jXЪhџй“ЭЧOіі^=єhыХ{ЎйлпниxђшяћіЏ_|ій_>јђС_П{Мs>f™ГSF7tѕvšfљaˆжp|qtxvzКџєЛя7ЗоsбсоЫgOОџі›Џ>џЫg|ѕ?ŸэПf5УP™1=ЇЅЫƒл4šЕш=AОяš sqСŠуƒg?>}љž‹іЖolќђќ‡Џ|ўХч_~§ЭwЯwŽ‡МЌыšРšэкš<ић?іЎД9n#Щђlx6b'1ыЕ­УВ(‰ЂDQ"е<њЦЊPИЯОO’ђџи—акіЦŽhшйx>$QD3‘•љ2ЈЪ<>:4Зˆ€ЎЎzУСѕѕХИ>MјОcєЯЯ†–9шМ~ђќ pјјлƒƒзЧЯОўъЋПќхыяžО>Л*КU+ZчAъZzЗsйщ+Э=.SE}"ˆ3cx}1ž ЉЅфцшЊг7юх‡WЯО№ џpp№ц§ѓoўуЏ_џчGЇ—}ХДЬТь -™хŽЅѕ‡УОniЉкp§А>фшнІ'=з|зa†ЊЈњАѓіэ›/|Тг—0 “Зпџэ›oП?<эєFšэx.ќoмгy\ХЬуk†m7ЗлTsdСћЄ0zoп ЙыJк^ъбЦ4CгЎоМ:љТ'Оа/Ÿ~ћ§ГЯz#е0D”H!єыЁЭГJкzЏћvs$Ђ2Ykкeъх‹ч сz2І]€Ўу0нžПў{М;Хwp‡vœ•EšЁЪь hŸ!m§…w7ЮПAŸЊЙКј]GСЮди#/S:вPkУмќ1vпЂэфJx.Є.Ыb"ВзчX)ФzMљПЁpЯsўаrж5Oœхi­iQ‘к› а№Э*ЪЏ?К1„ЄЕP9ВюYт?ќ–ЭBЕbўсїlЕ}>Vj(ќКяŽ|јї2ЊЩьце Ђ€№ыMщЂVtишщкrЃрѓбeyeчџj‰юіsьЗИ‹˜њЏІE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹ї‚Ђ›L8œicЭfьџЧdЈ~0ќЙЕјWџыoGЬuЈ›ІчRSM?ŒBŸЦ"ќЙ"ўC1Сw˜^wщўїћэ7h6Е. ‚ZV‡Aд_3Кg#хІ1ЖЉЅН#зЬq„ цтпќѕ7п5Uгž'ƒ0ЁPR'aˆ/џєщЊCЛ‹эQлКДяТfЯ=фNБMSGŠnsWIн:–Z§zžу…ћSЇRка[RыњЈBpшмfš:ш|јеї™ІiŒкШ Wт’ˆК?RЯ[щQыXпeжо‘эq=T7ЁЙ.ž ЃѕaЋ0nћWнўЮa9„œLћiQM‹4K#ъРJ}ЩяOщJЈ[дYzŽтЮRwuORwxNЫ-эяbЙч;.юJаpз ъAeYЮЊ<p›Схƒћ$wЉQvD#ЦЉї+–š&Н0ЮI—‚й\Xк/нў;c‹3?IТм|—VгIYЩч1гдцў к%ыVЛ!Е"ƒ&’DЁфfaYЬд qDз~™pr5&єeH„gYQLЊЌ(_врzјeшQџь‡mjjЛ~œ :РЄ“Є(ђ4Љ)Œ&DлLX67LЫДьŸы№ниul 6ТQ’•еДЪRˆ Ѓ  я(ŠШЄДM/#ž У(ЂYтEFгЯѓ4АТp5лБM! В§ “=~ЃIxiGѕDь‚ІкfАЈ(Љ?/>П‡7zќсb;MuСRG9 Љ-ЫМ*sšа%юТг˜ч3ЦЭ_šйџз‘ / iєK‘WГљjН 6пјŒ83Ш0Kќ0ЉЩЊ!э?ьЙ^UhyR@Ыe=e’&ЉFИ—ŠX4щЂ§фhФa$}ZнrГ^LhЌ,Š|ЧёгШѓaйЁћ@R›n=ё!-ЪŒz^CлSH Yћё-KЎУMѓgѓxsr‹BȘ1LВ)Э{\LШш О€НХ2Li”їУDG№†є`‡Eчq ƒЎ&4jЗЬbЪмќ$ ыIЧќyXйЧЋЫюРtM aK`QЦuЏЂ@07IР$pї!T­ШЯŸRXё‰:ЊI5™Ю&9MœуМH|№в5.ўчšЫaяуЧС,EЇд#Џ šO9+3PЕe—ЬvГдѕсўCЄЋšDќ‹sj—t­ сК4}™І0gYуявРcмPИKУzMSAмЃчэЛN˜TГХb5ЇйМ1 ‰l„ыn"p"“z€VпЊJ–РМ0/“$%ЋFTЎШГBWPЦчИкхиь_є4‹Ц' $лЪyЧ‚+$Ш"*ІЫѕf5›Э „%Ќ/%3œXтbјpѓV­Й~иСЏdй“ЌЊчЬ/Сј’ЫMЫѕИ=ўащї4ХaеIЖУGG>–&Ѕ гsš’ГYMfг<1#їs]s(ЏЕ НyЋVЯ”J–Ч~о-рUДдurЗ4“›†оНьЋ№<ФHFsŸ§ŽсH№Z’Я—ы§ЭЭvГ бМШѕ„Žъб2lј*ГЕaУу (cC>ь‡1ў• _[,W‹љЌJBJе0…k(еv+ЪѕэOŸ>еb“?QвDJ\ЅЉДУ‘Б}XЪљыу—/ЎaаFј‘АГ…Ё ‡5…Ѕ=>QqCхЯЂЪшљ+•2M }ръjЄŽІb0Њ6З?не1Є†тXУRWЅй5aаЖЁwOЮЯпН>::|7А3шЙЕЫЬ`БЁшЙ\lжЕM}ІН HgR9|M -TЅ?ѕ†Ъd@ AUЗu пеL_W^џ|dг;хн/ŽоœœМs:ћqЦ9ЗЭpО&^œЯзtхеt§jи_pе4Ят(iJцІ(§ёЈлЗ-цјQБидмЁpИ­eX–ошь yМЎ\Мzіќ№хбёѓ—'ЧЧч]ЅžјЪ-;A!МІЇ+ZјХѓЭ|ŠTЛ, ъvн˜q|†n)C2г4ŸЎvл§нOŸ`"ДоH—Ј|Щѓw]Eе†гуУg?>}ќуЏ>\_wQ”ЈъШH+zfJкjЕЂIў—fЈоR˜FYLђ†eЖ™Я SHщЇхdF,pWлШŽ’Žщl6™VIї=и"Т_žМјсё“я?zrrещtUCщ]%U[ЕаЋХЙѕ2хš.<щЂ‚,жUГ""N§P9Ю+`^LW”LаJOЇ “*зЕ0ЯЫ ѕ*WЮ_<љўЛGO?ŽUCБяшЂXЌў›Н+koлHЖќ™Ф3‰“‰ЧЛeйжbЫжNQ$@ьh ћB$@RЂфќџЇ9EMю$іШvШhpт|‰ *OŸЊЊЛШhr3тЩйа=}їцXcœ†—fa:Ш—nsЋх-^UFQ˜УLPйЪТё VGpSQD: `#PфыН{ў|kЏќ;У hLї”Ќ,œ]—Оєіхг'л=Уb‚ФKІЦП #@=рЃВИ!ЗпnкC$ ѕx˜УбИШё/y1 <0ЛеrуAYApSУъЪг$Ы“a ПyђрсуW'КiлЋA 3‡ю*эЕЇћЊfєv8‚щхˆФ‹зBС|rr ВFєъЎDP™ƒ99“ж=xєh§P5џŠЦгž#эo>~МОuа5ќbLЏ^Pн–#zЗrЄƒ!U^E‰џ2  ЧOЃšЄyвЙП~В cLо{ћf§ЩГ—[;ћ’_дєhЊФйH єŽqX–E–вак4+ы ДЊЎG‘t§oY)Д KЇјЋЎ)•ЧZ„Л4Ё—2=a-ВlPOР$Ё“ё8ПсŽЬБi }‰E†х5›U`4‚ѕ$Gм<{‘FPўŽОКќбŸЄC8'ZŽй|FЏˆy‘GЈ%д"AЪТх*vВažХєRƒ­|nэGРŽКрЄЧЂtHЩлlБ(KJиВuYО wYŽAŽEL тб;^Овљбџ&5EЇRЗkФфK№c<"Щ#2™xRB\*z˜M™Ча<ь›І rзЛБЊКk2ЋМГгц ,ŠНЇЧ‹|Ђ( р`є”žчŒтtяИ‹М{ѕs˜ЏБ[оникйщ†#z`RУГ%iqЙЄАS/^нM&EТO7_Н=>]ёˆюЯGюg–eU•d6Е„€пxFН/У›bёG№lmЋUP"GW`ѕТ`ъЃЁ—ўєк9Jњ?fѓAMЏbЫކн1й=Ђзб“ъbї'РЉ/цS˜9&П–Єv#њ šGМњrЋѕфбMљфччP˜žјV”#!эЋ@pтu=ЅVыСM›јGјГљœЈ(уЃ&ЦVDИО0о­пД}„^б3л %уЄЈSтŠ,U57mмG‘MЊ…‘zљLљ4ВPЄžЎЂў[мzZC‘I”Ђ7žžŽџђўюЯ@\QgRдЩ,Ё*H]збMі_‘#\#dSFw6ЋA ЂK]мdњќ!8Йе9йК{їст+=_№ƒžHžС~• ЊѕЫч>Šд•еіЫћїЎОвƒѕє!^J,њ*ў'ЩЁЈЧЏ7žџњ•ƒ*kX# !~OъЊјUэ Ÿ>ЙџѓяnнњiK]YGьBеuКsЄЈбMUU_ ењЯЬёсгѕ?|§еWЗю<{vїж­oя}лщ*Км>RmC]эжй‹у8АњіюЦіСл­Її~ќщХцкЕ?‡яxЙі№юwп|§ЗoўўэЗпнл<’m‡ KТ?˜НќўXЉЛџќЮ6оЕ;6=яЭЈщб–eщјрЭГŸzМБqэ5юУшGї~ќЧ7Р?ОПЗіІЇ›дЅЫ&.ŒонкмяЪKГнtГНЙ}д“Qx/vЅдя9†,ѕ{‡ЏŸмБyэEю€жяРцЏџ~ћюГ7Ч]ХА\зЕ5Хд$JІБЌ.й>ЯVTЧefїФA˜fiз”кЊrДЗ§шёГkЏ%_{јУ7ЗОН}чёцAЗЏЈ–’ЦBˆŒ)wЛ=У6%ЙZїhŸŠGэТŽджМ0ˆSъЁБ-ѕД-Ыћ;›/_>Ні*?CЇњўћКџ|чИЏ |vЋwjИй(p˜Іk:ѕХ-Чц–сGX{Д'Чz[rƒ Ђ–ЯЎжййи|{НzрЖоўёЩг'[ћОnА0N|зV;* ЫТu˜iSЃ'[жѓM„a–ХдV/ŒЃCУ~Lо|СЙk™воЮі›з^х%ђрйњњЫ§žjZЖ——ЙчŽхфuЬэhХхœe=Цщsъ LhOзіЖOoБЁЁр&Аю•ун­ыЦR}ўfcm§­Є"ЋЦ!ЗzGŠ#ЊIръŠEЭЉЎЙЌŒPr}IyvwыЩЖLяvЂdX— V#3z{[/ЎЇDqkwѓхыЖN-:щИJ„ЋЖ;Ю&ЃіTˆі7піЁr1ь8X{јdЛЃг*ŠЪЊHаPяьПОогћpіЦЫm„?Wxщx’ зшutсч™gЪНОbЫЫМ5*'дCЂюЎ=~МО+уо .ѓаAdљxћкЋєZ­ыл‡ й•гIьšЌѓpxіЫћq,LEюuЎНШЇУ`Д9Тв Ь“7ыЏv{ƒЋУrZЁG{д“kЏ"г›=jdrшЗMЫKGГљ/яЯы,рЖВдДЩrдЮЉѕœhŒгРхЖЌ]џЙ‚­{]y^˜WГѓy•~2œ^œЭ/ц—гaЬ‘6-1бl7ˆъ!дуc БЧ6NŠЩЄ }вЩѕAwдэ[“3ъhBѕ;=;›ŽŠсИžЮчUйЖйвX-+†G›ОЃаQ:*ї‚”Жц .тr:J„уії>щ:нЎЦ=‘Žщ…:LWуб ЁMЁЈfГT,эiƒд“œ˜’ЄРбUљRž†Ph‡Y=Š]Цњ;ŸtNЯі§xxv^Ё"HRD]д)цѕЂ Ъ[цa‹ізG؈в>Iз6,.’qs§ц“.вUD€чЌЮлЄ\Zю86m'vD2,Г@№e–g}AЛдg0„YqІЊаЎб(Сяе?щ"’юёј|ZIЃaйŽЅkZ_–ћЊюIžТыKДКGЇ/јž5XфЁpњoп(.TvœгЖœO[>В)ќДžAqВџ3˜ˆя’r2Ё ih- —ЂТžND№ИО*Ћ[=PЉHšј\kщЈ6>cѕ˜ЎG{]Gд’…„ђ3ˆTЩqœ„aАв3zК‹_zцbŸУчќ* |Jђсh2#_ъЖLjO,Y–бёЋmЇPАшЃЋƒ9>ЫfXэваAEКчД5R,zАВWhВ$ЩдK„џ%VчTы1\лm9aˆѕ‘гц‹`…Яо “Nђ(ж—QЌЃЂDВ„•Qњ•ЧtвРъ­0”њДЙ1э Ÿ`9.В’‡›vHїQШСбKъЋџ ‚sшћrbwуA—ŸtfPДЄ ’цˆ?їPХЃ= ”9[}p#JVўJз0ўtќpAЭЅ'(Q/­­ў/X„и›6у3fЕ|nа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4hа Aƒ 4h№9аL›9ЖЉіnкџ€$+JПлњШqН’сpOјaїМ0р+sё™аЯsi4ЗЎœ~рЫ6w™+„чгпОчв)БBpїІfаєњКx0F8ŒЛ–mhє эИ^ргЁxЁ, ЇуfмЙ)‰:ш XBњœ{4 н<љ§ЗЩ’j2ц…q.Ž'ш\e8пfЖЛТcL?“ŽМ†О…Ёяс#їc†ўћ“k M‘z ;‹;ŒЂ8Йь…B8їџ Чh:> hІУ+щˆО4ІiЭmZъo&рш–ЉУhУА8Ъƒ‚†˜fyžFa>–%[ж(”k 9TK‡п†aœ/цП†"ђnУЃAъЏGч–эк–eГУ8ЃaЭА:Ёуйу Œpаcжj§,`Ві;У$Ы šЂš&p|‡P7юкWl•@f:hš;ЬQ6\ŒгБЧilIDт6cеJЂpЮAŠХ„š  :|Ÿ(NR&HM~`БЋ И7$„аБеy>ШB:ћйхnЅПИЭUр2iбСЌрjвѕˆ]`4ќщиЖЭЩ24ћŠkGŠС8x@ & rƒ9ю8№l‡І­ ЦџА~— Ÿ'~ЉІyAУj‹Х`єAУwŽщX†i††хwАяoіmюp,Т(Iђ‚Цz'ШтуИ8ї}шЗџ'NHН4ш$“8ЭЫaNгЂ и\Рha›§qu]‡0_буў“]гЎ#RL9TEN”З+P7мHЭ\ceО6=И™{ gšYœ‚Ѓƒ|8OЪ,vm—вo‘ZXW6<|Дc‚LФw79;ŸMGх ђЙiгйLQ]HЕя9ЮЪ„OCФ?Žг8‹a4\=(Цgгq™ћ^EqЙ‡@чКюеAуылЛ}0!Y •ƒЃitsYцрЕM7уъ=еёЙ#—ьMNgˆѓ0MГ‚яa-ц4 o<ЊFƒ˜‚4ў„\8cWœо>9щК4‰ŽˆM‹бd:Ійy{š…ЫжeХtmаоXк<ЅпТ )X' EHSdВŒ†eУjBу=`LFjŽЊWѓ;OЛm“Ty1H=™MЋ2В”#iВБjћ}‰3ЅЭ&њ ,ф 4к,‰Aнˆ )яЈЎh$щА,ђAL”w\„tщ~@1UяМ;MІkDьbLVJ(_žEмД нDnЂZŠЩб–9ЫхW0п вxЁn>нŽ=ŒЦЃиНЮЂ4ƒ“ЁбžаŽлВIуЫ8{:шyЖ…№FљЈžM'ѕ(MrgЊНзQДS‰І_шЫЗкr­TŽ|ЦС(є"ш^UVdХ0‹cO„4бЪ:UMЉƒ Їъ@?>Ж)ЏŠщ'ggГY=РB“Ф3CзД^GюžtNNЅШžю˜aтE!cA’І№AвzZбzР:&˜~мщ+–mBј`1s=O?юW9ў>ЃЩ>ГIQMрnПзяkЪбQЇ}ВЬ™JџОm…r9ЫЁY>J4ЋЩt‚Х5H#гфОЅœД%‹“НtŒЙ€Ўћ§CЭ‹ѓtXеАљ§ћK№Љ)ЅVЌ{"Уш§“ЮqћCХкŸcaр ŽсЃŽxНЫЫq5Ю c)"ЅчqCC—Л:›C,&Є*;<БyЃчП\^\žM'УФШW„ж“zъщоССЛwћэ=hЮВƒŒfћТД-YЉ Вd ?ŸжуaŽ\Б‚л}Щ2 Љ+rQ—1Ы‚6ЦiЄі,‰Фc~yyљўr>— –ІЧQьh* Fмлнй}ЗлRД%—2}гuUнвx Цd;(иtZ‰!•\мЂс)Qт9ˆ‹œІу9Ž— OG:gАy>yy1‡Џ#TH -пЩўёIЛ}ДЛн’Œ%žЛп“ЛmЩА,Ё)‡^ЧE5;ЧЪš" Cёhp€АYIД(–C;/ыЌ_\^ўђў§ћy]Ръа5™Ћ;GэЎЌ*­}E,ih”Ÿ43uMз5гЁч'E^Tгљќќ F“R9Ђ хkјР™eвWpЃлULCБуЩєьђЎО€Э`іХЌ@…щлІ‹dEыЪ†э0ујиXЮ0 вEC M9B›RF:=;П ?ŸAxЋ№ЎcщŠtМпU4DјxxpДїжСŠ=7.Юh%Тт_оуяљ0AmkъЈzЙд3ўХоuhЗm-лќAђт'Nb[VsдЋ%S• ‰о{! ARЂЌМџ_ot“ЛRю“œ@ЖяZиQlЫKƒ9{іœ3‡“u}xоЋфTGTX 3„ЊФѕ‡Ђ@%Љс€ь&WxаГЩtRLJW{4‘0<;=;}ГЕG‡MШВ&ЉТљіію6 7c^ЭфeŠы›wзг$єL•рвm†хP~rНJ†"vЇ:Ў&#{…б4‡›"˜g4Ќрщ’ч)"$pк{‡'З!4ЉЙ}pвRѓI1Н3vzu=/Ууццњf–'†5ž%ЯCшIŠ!w™*Œ†ЫУг‰ D:К ђЮ‰&ф+|4(Ќ4о†Р…RЏгcLƒЌ%E3ФNЃЭ[ЃЩ™LУœ›чѓ›wјџfVЄЁEqзаьЅUЂPтЫ‚рTdдSКчeзDѓЋr вp,з;tPuК0Єj’Ž|й.ЏуСЬfЅЃчtЏWяШшwHEh›Ш2aŽcZF%г М,ЪКЅш(Еtш…ђД0/П&#ЎЎ(HЎ0 1`>д/JyTЊЌаФ‚Ј9б˜F!н'=а4ЌцфыљuQ`P4.*dГšZ@щИKS4˜‹‡ŒёБФ%…a0NQГТй)~: hƒЁr y\TTЭIŠiљ@ІS2}>'ћЫ;ИІРОšŒG }šуsГš9ВЁі0m(СBЕчХE)!(@0ВfwМW—%AhIМ$0‚ѕ*r’*Ъv–цх#бєˆJђ(яљš<Л˜хЈg|ЏЂ#xŠRWхe х>ујй  ƒidQ&ŸЮюŒN C<з’с^Ф”|н$ib=ПKžWѓ_9oўЎŒm7ОЎІЃРqPЩ9Ž8Peн69‘жЪуŽнЈИ.ƒ‘шоЃGOd эz )]бm™—бЂ гŠ"7ЬЦtd&иcBвa5'?г€|w3П™4ыnZNUE9тиV‡"ЉУ$ОЫg7ѓrЛf4‹ЩvgyŒБК–ЎлЖ< цэФ!oИAфZў˜˜§šЦ™\j›л_nqџЙc4щnі/Ћ™"“QIKCQз ќaxq>/НCBЄW5мgayЌ0ВЃUсћmдŠ†ч†mІdь”Ъ-Иœ~Ї$3Пљх—лw7гижUнFкeиjHBŸзЄdкЊ ‰ySZ Ѓ)%Тг4ТfГqŠвЯ2-|™†6ШrПлQУј–^ŸЃр*ШхГВ№Bdп‚АЏЧО!Щфi•+Šjd7Ў7љBDŒОКЅPМ)9‹‚zBоžЮ _ІšFЇj вчЂyzв„АѕЖЩ*“+ §=B)PчЗяnчгYšHЛЙ_е‰aЂ*ŠНЯuyЈ ;HЎ№IЗаПD2КˆХжP‚О™Ž ‹н§н§ээsAЁ;ёєФtRоhП)ЧХээl\d‘E ЧАЁЊУŠduРu;C0Y“-7žРцлwЅф™uЋ'гЬщœv9Žу‡ЧЛ'чЧ[[ыЋћ х~:‘ЛU=НKŸХИдЈHу`О2)ЊLШ&л”DЋ"Ѓ?SzvЋЧє†p5Дt~§ Ђуv—TM†Р№ФjŸBXђэнѕНƒ§Н­эƒ­ЕF_YKPљrF&ЃzЧ]вЏззSа=’г$KSЯ4dAЖ-UЎЬhЉнj]^Ж[ЌёdBун`ќРMwкДŠ“"ѕиУуfЛз>ойии>8млимпйм?яАƒсАпjiYY/€аЉкЙSЖг,ђУ(*F ќ8gрq2”ˆуЃhЙ~~НѓsA„‡с5тO/™Чœn.ЏnnЏЏ­Ў­Ўя_œ6Žкv^Цs'уw"ПiЄњCA1УuБ mc>Цё[=‰ БУЏџї–”qЩyЄ—Ц‰6„Мt-‘9п_{НКМКИААјzkkѓјВеjѓQQўTŽаШсят*7:oіN[Ќdy6fVџ3D‘a8ЖТvњњhz3Gf+§ЛQ„x­x ЎГ•…ХW0zѓ№ДЭk$;“‚є+Y\ўxѓoЗўyчm‹*Žщ§ЇЩЩ 3‰ЮSYГgGGЧM)&вChРs9фRœDОбЊ—Ѓ2o7––зЗ›АwE#шгвЭХ8ƒЃЇAџ`eeqсѕ!d‹ЮwСцЯ>ŠuЏKЗлkoћС”§”\7Œ’4tН „…a`‰нЗG—,œьFє7№4хЪ.№u>тпЌ.МZZ^н:aiљЫ“K пЁрвјцёўццњк^ЯLРЫ žMвQД(ыУп‘g‰Мj9рZjєН /ƒ‚В!Ъџ1OpќPЪ<{КНОsАЕДМз’ќ1х9веyBжљ!Щљ(ŽCз #И=BиьFH„АyQэ ?t;Ч\ьЌo5v—_яЗФ€hzŒ@BZ3ЂаŽ(Д„„?‡žЄyЄЋazєšj~жЪP%R-5' *[0H@‹Ўх…нѓРF„хѓ€ЋгG?uђt[‚—Іљбљ8…A˜Ф$Э”†у.ќžлн•Пy\љљмя~ШДКМ ;йE x8ЁE!FЃ­ ЁќŠˆc"Х’юВ$t%v№њiўœ&vЛэгFGvš/Ÿ­ЮQ`ћОЋ[БёkLip\Ф–ЪQХGZЂ}й§юФХeЯ—в 9M}D~ИЖ‡ˆapВ4Ѓ№(2Ггь0В.ЫВRQ‰ђOр_‘ЌЮ’”ц>т ьЋ(}\щžg>{АЕsJ‡яrќЧь*ij$˜Q<ЂV%x8 Свaœfd3тb)іV^нщ~lЪћTл4ƒBдѓя 'Žв1Ш%yїЯрЯ Bв$хЅбАv”ІYQŠ GIyт*ў Jq5ЭгQRKГ;/#Pс№zH+ЛI№ DёЮfу,"3г,Ѕж7„E’’љQŒшШНO€.ўХHF‹‹2в„fawZd•MгU‹беƒ.эEОы…I6*[X’$/Ме0}ЬщСявZ(4Њьт“ёЇщg )Ш^G…tŽˆЦ($ллЖџЋШ3J}хj9ђ тїЅЩ8xЄЖ РЦEАЖ#FBFЄŽЊ™П}(уqd9 Ш#Ѕљд‚ƒг˜‹“ЕŸ^м}gS{PЉч œФиё(ќРЭџїbhrёlёйПОЕвЂœљ*—!Hсѓ4И+Н—–—W_ў№э7Я—ї.Е§ј>єй>зк~ѕыЗЊ”] ЬE~Ь32:њWЧвТтЪЪвѓяž|ёфљn—ћMѕџКLћp{чЗoеВн8t‚˜tч"ƒ№ЂлjьяььoЏ>њэѓУЅ­пџD™ўнЕŒ7Ъ,ЏЎ,МZ~ѕєѓ/>џja}сщ“gЫћЧK†aл­AПџИсrЩЖ)™AЗБЛЗПњтЇ…\^ЛџпmЏМxѕzcх›Я?џтЩгяПўњЇэІЈpЂ* Н( |еyОУ2­НХg/^я6N›<5lњŽi™<У NЗО‡Л_п‘­—/з6зОњтО|ђѕ7п-ь2Њa*Њ*q}A’%Ž9;>ltњО›[М, ы‹ћ­.лc$Эt<*И][SЙЮљ›нѕ?,м•ечЋk‹ЯОњђЩ—_=§щѕa[’i#‡4ЄЕ]v›gЇmNЈШхМЊЋstФ "пg%УrЉѕиГ-Mиnїђdыљї_цхТЯЫ‹п?yђѕWп|ПД{СђЂЈшš"Г=^БeШv[­@ћЋ0К![ЖaŠнЕ9Y^5œxyŽЉулг9y{ИЖtџe~\Z~Pўюй/зŽ;CnШЋІЉI\Ћ/ЊAЌ \Ÿ№’"TГУшR5Ъ 55и ЬP1ь8] 6‹Тpаkь?РшХ—ЯОўvaeieчЄ;фxйА]S•{МbЅЁЊ”Н|FUлЂ.aЅk[vЙ~ЌєВaI 8IQDюrџрэ§—Y}§тщїЏ67жvOл,'Јv9Š48яHj:Њ ЇшЖЉ‰е№њЅ‚‘FˆbпжeЖЭЋЊ$Ѓа5TкУ)tŽіЖwяПЬцЪѓХ­­ѕ ђ3/(v<Žt™П<HVыŠЌ(Кa™ЊXMпfG3L'ІОЊРдфЮQЛмШAqњŽN;OЯv76юПЬжТOЛ'{›Ч]^”3чЖ"tоЖD9šдyЅh†ЁK1^sCTM‘oЋмйк.#сQZ^:ЩCу_hПйy€бЋЫ‡[;дNЁ˜бИp‘9=dc<ѕЄAŸ:ŒьŠŒVLлF|ФЁg+нƒхх§ц€ЭЭ' |ЏJЬIуЭ§—i š7жwNXA5?ŸІ†8hГšЯчЁ:шБQ–ХЊђ"#j0кGTУhцЭЯKЏšД›гL'уФбTEh6[ї_Іѕfcc}Збс$YuGу XZ@6ЃщЭMц€KйС _йŒЖWЛ~ž­ Э§Эƒ $^ђ4Эƒв~ц^ѓŸе9†Э'м­fFљd:Вh/šŸLЎчѓiцk?ьїћ•)жžBћp( ZbсmWP1н(Ы'EH[™й†Рœюю5.{‚ЂZaFMыБяEi1›”UC9*ВЁРWЖF ъ–K‹Uc*ƒVOж зCп2­ЊOюПл<9Лh eUw3ъчЃiдМHG‘KЩЇYhЋUЮЕ3’a;AœDŽ.s(&ZI159FЊ†Ч[ИHЗнjіdEЕЃёе,iУїэr‹ЃjИЃщ$Ж $ЌЪ$j‡$$Ѓ%6G 9Фчe‰ЅHт ёЪыv{­6ЇЉe#sъ’V*їНxЄђQ1Ž еъt5Ћ;­bвFfУKcC”†}^Етд–%aи~@x|жeЛYзЬ0Ÿ! д„O;х,гƒ<5Ѓ,qСE•йŒА6ЉSаs,ЫrгмW$іьœSДpь)Ђ№ыІк{Рt:ŠЊй1"йбОЯtšЭ^8`к—AsBп„–ЉашЖbYžяЙ0}TфžЎєNxYѕЦ#SЂ­…ЙFЏЧТh+#K7TЁўІС’D;Ю8jЗжj'оU7]пѓ‚x4.]Л}IБ0Ќ$ђъ‰gи!Š'O2j™VeІб”Љб™9~sм‘hЛ„ZёьjO„vм JВ"Ћ%Ж'HЊcєШТІЖFcFMZœIoрN.†ŠКъWr{2DˆKЄšЇ>D$3е ]§ ЯВ(ЭŽЈQ Ъ.feCЗ Ua./.™auщ№wрЈЧоВ§(E rЬPP,Яеœxк_gWW“Ќ,ѕ$УєШzŽGI[Щ—ПР%ЂR5 гF>ЊИNГ]§сFC}BISSо4ВLО#f: }•^МЁ>жы>šНˆА#Ф2Я Ј№с-€К 4RЙ#*25цBжMAчиЖуXяqЅїЗ›ƒнРжЅNW%ѕ=’  Ч‹hГZhЈнsѕf>Щ’˜ФКeшboЛЯ2L—Э&Ѓiыэћmk“р[лЖPD†ж:Ё˜ЮІE^nyеЇ3I/HХbš>CxПўРВ1*|So7$гДGу4KCз6Љ…ŒЇm#єІкв Kg†ŸЃ§QŠхЎe5ЊmЙ1ѕˆx ыŠЖ"ў0‡Fo1ВрэoŽuдЕЊюE6†н™nYўhб^ЂЧr4-Б˜ІQО Цx8;џ ‚ІЛˆюГ–j  ‚ђQМѕ~^-%ЦЬ?™ а ЫЖ@}zї НтШЕЕGЄ;кa$I’ќЯ$Qˆ‰Лю+Н(Ф…бмЌЧUЂФю‚kЂЖ\к–SХ5?ЭДŒТmЧ{B5ўЋМ\ЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5j优јЈ'ЁќшАщџќжlz!БЎыŠ$ 7VіZь‚Н:ЯЖt™ыџ•9t"‚Њkš*ђ‚ЄШ’ЂсЯJEo{џ{ wШкІiє>:і'Г9ЊЈ†ЉУ^™Ž/ ЗjКІЪх п)НˆЮащА…ЮgјУ‹†yEГLгДшЕƒВЄ§(@яœўрч‡ёYЉъКЊ’]џЧмuАХq-Yџ‚}іZВlЏeЩ „„Т†Щг9чœІЇ{ яџџіTcяњйяiЩ%„MCuѕЉSЇn7З,У4eД{џє2ŽЃmпuЧs=л6mРШѓЯiі4-эЃŽ+Mxльїg鈇eшК,‹4}„FNЦО‹ юрЪгОЇКвZ_u\ ФЌЊЁ(Ђшj’lzž!‹Њы›X’6њОcŸeд4пuЃЈй‹:‰Ф:CЖ‰ў@'Цэˆ‚§ЁЂi–Gлc{a’g1li’Єш†<БšЅёЂ ˆќн„‘dХяњŽуљЎeћaьyр„8ЅI/Ј ЭПQTх6xOпѕбљQšEКŽiъ'HЬ`8`džсxv4МЫЪЮ Ђb‚Ќ|ЧF:йnњ0„pЕYSeEс‘РГz§ѓнŽ šС! yЬfˆ5Ў‘g0ŽчИAwЬ1ƒ ;юЦw†IdyнђdЫ l›і‹vє2Э| p(ŠЬЁžр…'tРЋ§ хЧtМ$/šAЖ`iˆЇ †FЦ§ёИзщO~ЧрŒ?k‚*p.Ек*ZˆДв­f0T>-@y6tœЂ)ЊFЃdša­ЫоФВ-(/Іеb6M}ЫB™ё Ж7d&,;zЇЇНЛCЧHц7ЙЎ*У‘T`‚iz*ЭЙ -Є(rЫ0 ‹FћtHЛ{~Љ@J…ЭдвК*сЕgZŽkыьˆхY†Œ†іYЏ{WN3BŸ%YdиŠ y‘oы4P'JВЌ(h2i œ‘”оŽі;gGˆвb6ŸWГ<Х ш[тИ& йсХљйeїђ3†Н%2txЬ`ЊЌdCЕYКа†Ц(tEYVгюи8+г6TютŒ))љюi—гоiPњМ*ЫiZ’ ‘ Џ8^йюХХљххgNндPЅ_8нПdež—N€Иг4н ƒ0‰CтВщtšHPеUй6јQŸ'§ŒS”'ƒ+б”­(-ЊК.‹$ђ!ћ, њŠxA’GЧччЇчhХмј,Х^wТ1МТŽUˆcптФЇaЦг"O@дk(/#jd š”ёPвН0­чѕ|^ІQф LQдЅ +)ъЄuм9ы|жŽDнм|k0yЖЯ!еdA0|Ч“>ЯfDy€ЊF|Ь№ gIВUYФ…оJ*LgЫхjЙ\ж9”)Д•&Ј&?T•=nu;—НоegШk›п8{8шВ§bhŠ€žХžˆгbJLƒ^,Uв…ы"`š!YЅƒ*ЬЩЅ`GщtО\,W‹Хj‘…аJдr™ЯЋКдowћНЫс№Ђ'˜юяHёЛ­з› Ль` +В,ЃАI—цгzБЈђ˜иФT)ЏFМЂAщ5NCŽјAhtŠцГХbЙ\/ЏЎчЭДTV eTGџrйњУIЇЏио;{Шѓ"; G’"К­ъ4_.-гŠ6љЇ&@e{,/™ŽышoŠ"ЊЄaCQѕсє|ЛК^/Ъ8t!N!аО>БЯ ƒЎŒ.hƒѓЄŸ'ЗN(y lдT4ВиE3ƒЄƒ> BO‡б!•AЈBЁ)*V2ЋzЏWѓiфв^й–Ё!ф2У#TiРрD6ЖЕ:ЇЈdД"0†•‘_дjЁ^”Гљr NXЬŠи5ЭsT…бО@С"л4Х‡”‹Х|БZ"дыЋѕzН,Qљ§Рб5ъЭЁX Ly$yо†жD8йlЊ†ЎH@*ИŒ^V‹%pКЈыfDСjYІ8ay‡ƒdа/8n’ХЩ”ІЏW @ЎЎЎЏзѓY†ОЉ˜­ŠЈДВ`s#нЗ6’Š<2дoˆ EзŸЇsrЙ 5œЮГШAAžЊŠFы дВФФ’™ЯŽеz‰Џ)кыЋыЋЋѕНЅЮ АTУЇmї'cглШŒ›Њšd jRз!ЅIKгtНЄвСTЂшwHZ< aн;;mwнzЙОООi<^‚?Ћ››5R8\ ‡йŠт§О:7jХqЁє) ЈIЫ, чhwIЃЃKФКЬг$VЮZG‡oі.x™К_Д1sђЎнЗg№СНZЏф5}€|\у@t3И@ш‡I њ6ЯXюœF~ЙFЖыъЁрг-щz“лpz+ЇE"žьяП{їn ;v3жУЖ„гЃ‘–Ь Ч7pѓ G­oA}…ЏЏцe–аІыA|ŽФ(С_Ÿ‚вD†нЬХB^yЩl‰h"Ћ~Žu3Љ;wЅao0шs:^q—?=ч­|ŽЎoрц5…0пМ‡ч7АЋEYfыAЃЏP9ољы™тrМ0pheˆф; ,цˆж5§№Хa^V†ЊN[х9Q”€^oћп+VОX6€ ЏŽ+Bј5pўўЧїWЫy•GОO3ѕBOeј $"-Š" УШsmВШѓУЌZ!ЬWkТFу4yНЈЋйlšјЁЏЪКФЋ–бЌы‚?d;ШыеuCзpqhрoœNcŒ,В8 }[2 @I2P.бьuуtCМЫи:ˆгиеCаPЂ]`ET(q‚’t)5иŽ’№КI|˜мќ7и/uб?Штф|NгК8Xк…Z‹=7ŒГЂšQu `­)чuШЧyЂФЩ4Ю1dAбƒ$ЕАпм^"2œѕѕћїР9{Q†–"I"?ъlЄS”PЌт1Šс84НZпмP}*цѓц2Ј!œ"œ_’%TЯ%EQзЁѓ\М/чtQжЋњЇb”#С"ыkЄbтZВ$Šм`А‘P­ЂИ„ѕWyQ!‹ˆЊnЎ)с5Q2rQŽюFi€X&dЉ!k\—З фАЏ 4bq[ШЉКРi`zEk )ˆ’Ш йЭLWЂСkјХpœ–з?оМGbmIФ1ЏI •‰nњЈjQ’BЇBK›wЦ:NЂ0rN@’VеЂ љК!jТйbJыj&К3GПЇEšWe9q †Юѓ’x Nп4ЕxЕЂ(Уk*.‰Єњ^…–nJЂf(§Žт:Q„O!]пžр’ІСт  œеz–в\NKЯ ЬІ–PT<г |ЫCЈ–ыї( яЉЖ€ VЗ$MВКђ'‚Mы‹žg*4‡Pt сh§Ь„dеф+љ ђЃf‘‚}ƒЏІД`ŒЄEз#Œ75{ ЪзлёаЌФ46їцGX“‰РЧт6в№{fw/Эp\M5•iЗЯŽїЮ4*Gž­ѓBж8ФE™S]B‚­ыљ,ЦЗ UВ3кд`6tЌ††і[ГТЈ†зtƒFъ nХGiїŽ:<ђЏ{1vw^ПyѕєѕШ€\БmФЇ”Аtrdф;hcU/Q“в JCSFK,Ч›rZ5%Y$C!•JS‚Џ~|CUЁЁjZ UЧ№Ј=иўqы ЕПћbwПЕЛ}ЬаР+ytЮgU Kж№#jјj=/Ы<Ю3ДѕОС3у.цi,+ŽGЊ,šОAœAфСхы+*tЙс С#dЯO;нЮЩQыѕ›жбоы7oїїїлН38?>‘P”`hanIАІ’‚вm“ђuюd^› VsЏ§QБBY IэT эЭbKyvxВџz{Зuќvw{ыхЫН§Vћј =pJ€‚:ї ЏЏЋ d™ќd2 4ћoёгЂа7ьsNѕўfuлЬЋЈUоˆK“ЛlНо~ЙћъѕжгgOŸ>{О{мeT?•џ4№КЎШ–3›\œžžFЌ(пхMPYзФqчј№шœOЎ ЮuEДP—EY$I’FЖа;|љфЩѓ'А­—‡=ЩЅСІГFОVеЌЎ(рѓR\œЖоО;<ЛьOхŽруXN€>8yћЎе:ъ{ Rz$№ўхyбЗФзЙГНэЇOЗvіћЂy–х8Гz†HЯgeMѓХ­‹Ѓіс›н—ёdЬkw5юS† Ѓа“іўўсёбqЯЌ!zˆ=šEК*Я Їг4ЇБф*л}Зw|9т ?‡Ыi’Ё­„Ы3r}6ЋР­УжоЋOwAuŠюпЯd4JUээЕЯ;­s-_6N“Xn–єаœв[GžЩLdг2rКeg ТЦр˜U…ћякМІ:nПy}p1^žШ)Ёš б Ÿ(IPсВ,Kl •.ƒЎHœHŽ№’5я gsCХџ€1ЊЪ>q"Fѓ5 NZДЉЪ8 ч(Т$ЭдЙЌШЩч8О]ЧFˆцЊš:ќХЮ“=ˆ#сЃ>ЄшЪЄѕ|kя\ŠчMЋИ .БЙ!ЃUєщfт Y6­ЪБІJ^•юјђ`kћ„3ўв Ю?nЌФvŽі[­жЅDѓЁW‹лоЅimAз-@;єlAгОСшжВЋbсђтэіЋіP2яpЮч‡MpSZё]в"BAў"ˆ6:ї( бш"жiAu^зГКŒ?fpџ…qVћЈЭXQV7^Y‚д‹Д".:ꘜ†4AУSпfaYxBЏџІљUš~‰POЫ4ЭшЁ$@$` 4]LЫВЁЛ*3G'mFт™>Зс[BмФ F!­‰R‚p'”Œpš KQNЫ§яЌд{­­wЌЈ™М|7УЃџˆщГ+єуˆ4JvN–ўdйt К›–ЃАQїЭЮуЇНёЧ{ДэЦg ІЩeИ8+ŠМ((ф>'ˆаˆёЊž~є‡?l>ѕЖ4нн‚‹Юу/i%€ЅЊЋЊє>Е—П29G 3C`Ыщ”œОЭ@шŽЦяgRUљ'}˜ї_™u_ц *w‘OЫХ  ЇЇyš•TѓЛœОќчLЭ‹)A˜]P9Ї `Їщ”žКњєtё[ѓъх4Cyi№‘7O• B БЋКŒ>UХў ЩХЂЬgг[ЫcRЃ%=‹GБЏЫрoArП5ЏЎЇЂVГ]TS9ЭˆEpгѕ№[э?gм`|Й§ЭWЗŸEнЌzеsZтЈPЛQй‹јoW џйдЄY'˜/цK8œ,ЋŸйюљГЇ[;/?јЧч_>мy{№цб—žlН<8›|дп1ъwZЯПОџУAЛ§zяч/2v’"гi]SаЋЊјљQЊgOŸэь<љцЫЯџуѓ[Л[ОњњХбqЛЫ†м0“Э{>ь_Жv~јњўƒžo\Œ‘уVфGчЏПНџЭ“gvоќпkQ1\CRнт.vџW>пк}ёфЛЏсєїП{јрозл—В"щЎgKcN–UютнЋWч›YХyјv Ъп?xў§уWЇЇ— §2EрЛОgЊ w№ш>ьлgП:шМEяЅ_–С7ЛЯŸ<ќўћ{џјЧ_оЛџс^Oё|/ ldMWиоyћl((ђ&:ШGGЂЊщ*лон;щБЌЈыЖ‡ў/NbЯqMіdчйЃoОњіWНнўЭїyЗ§шбуgппћт?янџъ›g‡Œэy^9šФЫКeKьxдrЂЂm"mŸ^ЈšiшBчЈ/ЩЊЊшІEt34Є'ќ5Оп=пјеЏклњЭїyѓјЛЧЯ~јіо—їя}ћxї”б Лo*‚ ˜О-r 3fUкРšйџАw%JrGv>УіnЌЅ•dY6)’Cёа\}wу> Ј*…ЋЛFп=CяџЧОьбюZБВf(іасМ ƒУ™ ‘ШzљЈЊ|Ў IauznHsэГ2Ѓй;уЃюеГ?>|œ?џс_љћп§ћ|ёе7ЏzІp™)їѕБХФ4qlЫ4KЧ>СЛ——&ђT:GpЮiвk\BП—уxfя§ХХЛ‡ѓе—п~ѕ‡п}ѕќйГяп)тТЄ,%sњ#7Шš,Є™љ2Ы…я Јпи2*ц*№8НnЁWБ"C• bрДтŒ9УЗя3цПјцыћ§Оzѓ§ЋыБсx>Wг™ ифJѓEЕ*#ŠЄ(bЦNёЂљŒž.І*ŠЦžpq3Ѓ)Rо4‰dГ=этЭыїчлП|ёХŸžП>љ~dЙ~ ГЊЩyрtnl_!Х4=Б‚Ѓ§SАЧЕOУЕuН\а нцBUduF“Ef]Пzў§УЧyёэ—o.Ю_Оzл+3™.жsxƒ‹‰”Ы"’єОŒ™х=рIœелУnЗmŠHи> qk‘ђ–s„HРмюычЯ>ЮлЏџдН|ёђќZsущtНBШьx^мдЭВLгћ$ыЯ†ЁRй|}иoжU*§ёыѓ D”LWЛuF’ГсЛ^=|œЫяžН{ё—oGŽя‡IеЌJюЏ.4Яwuш3вБ‚гМЖzqšгdинzІЄл{ўЭф-ШщvЛ,$XO{џўэУЧЙzљ§Ыg}uczОЧѓХfњіЈ3іEБ§азѓќ€жШœш‰*в6НпюЖ‹< &oўќнyЯpќ0‡бЙs.~Мzј0НЗ/ž??ПР{~2oжыŒЙІЦгѕсУІ@”сbќа?б Z#›/wћ]S$вэП9?4нPN7k\œу^ПО|ј0уПёњЂwœ}Ÿ- ^ЫHШtЖмвŒъuёгќ[vЊGюLFiБиіЋRELыt ?8нfгф"dЬэМxѓ№Qє›wз77#Ђ@M› ­ч ZQPWsH№:ƒ&`Д№я4FOMŠmіћѕ\EЅйpUYЃЂZ.KњžеyўтсЃXЦp<шh>(:­Vћнv…ЪНІEЌR&YГ[ср!'Щ-SЈ$mі›JЩРѕyT.ъRAƒ4ГСh^>‚Їuзж{=7`ADУА"‘훉ž,іћf–ЧИq'2њЬŒU4ЛMЫСцІVP,ЎЋ„б|‰ыGPо™уX§1 ЁІыЭLAгќлt#H—ЛЭr–ž.ЈqB™цте щ6Ю›… ™iј|КШlБЬ›GУ†Ї †a˜ЯWЫRЩ4ДёXЇE—ІсŠUp Б{ТgQnЌp.šЂ]TыэѓэjŠь›нЎ'(Ў}з Ѓ”Оœv7 MBхЁа^гЌЫ:сLи~6 ЈњБFk0šAз‡m“бКfнр2‰x`ЃЬЂ,~2Тћ<ІХ|0{ГлжIшгŠY6вфЃтЇY™гйbГ}ј&ЊP9%FyЗšЎ>BйЭ“љціюph”`“j)`єЧ4ŸdыŒ1U/ДяEйЌkzІƒА. Щ7т}тЃТœвй§э2>RkВ YmXД.ц‰ЖW[cšЁЂdh›(AJЄЧ§2Њ4š6Ыѕz{WKсL<ЁšIХ0…ŒŸhПсDг,ˆШh6с)гїЅњˆ™€ŽЧЂ|6ŸЭзЗuNњLФ HšŒі*I“˜Ÿv9т=ЦВзxrљ\‰@г &хGМjГЉ~P*IъC‡ƒnШeMCЏjцe‹'xc`КьИР–V75ŒŸй@“ќуўFŒћEn Ын--ЈZЮѓDždБйЯЁ—ьб~DœЧГ*ЁьЅл—vн08ЎЭVы*цƒKЭхfц_Vdящm>3CIЪ`Ш3Х4Нп&чcŸМЙ0-QєЏТ(™бУьM бї4otнуѓš8ІeEАљ7ъ1лєBQTiТЯКB&MЛofЉфOєfЦ HЧДвяSЮсРгeyg†ЩДYЌI]‹'{uюqNSЯ‰Xйo— . ЂarЄхМZжy }$дљ(Рƒ№“do@Ћvq„@ˆˆІЇДУЩЉLќаgь‘yћУЛПjлЖ,OсшSїё‘$їЋ№xDUsђЄ~>9˜” џйf|$BџЋ™мЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZќkрWЖЏŸ˜ŽыZњчь%ђ ,7рBHfЃ_јЉ№ `Žу˜–уzОы1Я6ўЩіл>m†Nв%QФџ[7яYД‰АуБ ЮЙрЬ=ЩvяПCЭ h›AX Cт$†щўЯУФfA„Ьu,гёН@ЪHRGBјOВ‰щЏƒv fДs;mюIЖа6‹< мПУDФCпї=\˜LsGq$ЙPДѓмчnХЅ…’уF I˜‘dДчЄяZІ6Бў~=jМ 8œЋвLЉЌШU$Ѓ$‰ЅˆTF=Q>gфру~*Э3j Ќ’8єlЫвMЯњ?_šazˆіЄ˜NЉЃf–F‚yAœD"‚ЙЖїљМэ“›#rZšЅд•”:ЈІЁч8žЃйŒyŽ9ЄЯiжЎч"JЇU=/‹4–RЦˆ– J„g;žчњюgjxlE‚6ЄMQšц0ЉšјVлђћ.ЈNз,–P?яœЖlv]†Q86†Ѕ9б]пsэЯТšŒe‡"Ž1šрЙ !2ЃюZ‰УHxдёХcфj Ќь&уIQ”…ŠDH?D˜лУf;њh41 Уў ОкœKёDиДcш}џх _c”qмЬШC%Ё J nЦ,Wр щ›Іmыƒ^o4™ К§сXџ ЙFcœУ2ЧŠDФэ‘Х4*ЦEё€вЬkMFm|y=šєкЄ?ДЉп…(j—@WUU!ƒžЫЦoЏЮњУюеехР‹AыйœњIзѓ"U2№ШjЯ0H&рNПлщЧ†ЦђIњ(v;ƒёxазaВMБ‘d*Ž3„єМnUъ8Ж‡rохиDоАьQwф Њљ hцШ‹, cК#Р$Bhз§‘fX>•z‚Ія§Ng0ъwGКс8–GХрр(/`s}д’!@ЗЭсБ Эk4бmŸgГхf _OєДiњд—ŽSfroаY0šЈёф|нэмєНЋЮ•“Љ{щP„Q6е j3ž#ZDшК!UVD!.ЕŒ`цЈo&ЫjЙнnжЫ)$5И=‡`„P\ЮuЯ#щ  д‰Зьэп\]uЎn:зИсAЊb9A8зѕbVP’F*є CGeхсчу#"0ћфЩŠzьї›u jФѕR<УќЄH§биcДС<эШ­NЙ|џЌ{sqгyпэmѕЃz%ŽЃ$ЏЭВYЬЫ4‰˜'И5œ ЈёUYдT,U|<АЃЂйlЗЛн~ЗнЎЋќ/“B цјt8JT а=:FњhЅщкІХ зpŠHѓEГІ–юP"CыHєќ(8Ј”i–Јp4bjБлoaѓŽ cg$XT"#д<‚ќŒ›BгDёщ\=4M№Ћk–…<ю žЉKЌВi]Џ6ыѕ7=Ц7'šaxjђИx @-Шˆ\=_яЖ›УaіЛe5ƒZ…еqЩp”2Pу~Œџœ.Њa(†„в5ЃPKG‚Ў›m˜ПЌ‘70ЖtУ—I,pYЈdёq_PuNкlwл5y{wИ=мнnVд9S9r;.•R8ОЪфЩЈІЉ \֘Фyф16V›эf…јX.‘ЉэBпІцœŠs<‘Љˆц›ћаиnЗ{X}8мюжЫU]тКSIѕ&Ѓє –сГЇ1yтP кГ>+pђћў5| ЃзФРHвгъщЄ‰СфБяF/›КЬГFЅˆјDСr|рНЌоR—;јx“wАњNƒЁ Ї!QšЊЄЎEйIЂкu1Њ‘­р=PТ/ЭfФa УѕщќГТŽЎŽ’ ƒРж5cмэLиtƒбw{‹А@PяИЛУэ‡ЗИx{AO Р€1Є­­{yt‚N#дˆмŽТ­C№юх‘Pw ЌоR,сыh№Уыз/_ї&ќ0“=Ибх|Ей“бЗ‡нёзјђюУнa‡˜йжѓyLRсЙŽЃвlОI мМ,Kш9\œAj,™ЛэSK8 D˜YVБёуљљљѕ{%вƒzrЧ7zRS2D<еDz•л#`љМM§НKˆ€РЕ-‘}:}€є#‰ЋOЁ*UЂ Тf WлБИZџiъ:чZчт}Ч†"‚е Х4о˜1ŒІ~‚{Œ>\ъ§HМН…яА~wи-M3WIBЫтгУ#~LђD•г\ЁВдЋEчэžN4M‚Sчм7{WЭ—дD %aьѕћŽсСел-lм~ ”УžeƒяуPt›2.І-ВOWе ЮЎЂE rиlzЬ&ћЛ4Є(Іяљу8 —‹zž"ЛКу9F-=ЖѕБDо~ПZmУЧЌТлPПтТEŠœd˜V”~ВЭgRqU ыЮЊrV7Kмhrд‘Ј уAд‹EA VфŽ“Ё— R_%aЙЄ$D1rиЎNпмпЃцhєzН[ЭтРБ Ы'0кФя}!XAбСЯ‡#ЯRŒтф;ђз1А‘“€Щ"M8ZDа@Бp]ЁrхЫr‰P0(ŽЗ ЉёpX/ж8ЬЂ^Ve’~д#ѕщFл=‰TŠJЊЊ^ТA4ш:ѕ}TУkлc&O}/T3Ј jyHJпс4x…ЯKjtКG Шж=B›FХнЎЊЖћѕДыс Љ RЇhEcd3фтК^n‡{К:ъ5"=мхЭ‘ѓV5wD’eH№aшyAшЫРА“4ЅoИq9R…ХЦбtанjSeй2$r]цёьYB С‘ЅгщД^€ьЗћp‹МАћЩhŠеšŒžAЏЊ<“œc †’%Ќ;ЪуBХ~В$7яїїQB$Ь4ЛeНЈJUT‹Йтdo|‚ш —+"ЯЩг0У |ѕ_#Т:оdиА=Š&8{Uў7{зйХ‘„ѕ Ю6& X !@9ч3;БЇ'ч<ГAћўўU|~lЮœ„YЩў0ЏHЫjTSSс­юъn"Ћ–cш–ЃKxт“bАћгђˆ ЄХ­hDG№€34ш!’ВaњŽФE%ŠЦё0S–•КјI‰ЎnxyQљвЫЇ*ьAUі#YЄ&Ю˜К,ѓ 5ЉqBlУгё`xoP%"p јЉ†gрШNНЈ‡эХЁIVRЦUn):ЊкїН(Ч”}vyy…lgt]ђЁž1ђѕЫ˜№шЋLZ’ЯŠьоаkЫ†‚ŠFУъMt€ЪІРwE’‡v88,™2Ч№вИN§воѓС6нВmVž_^ДщŠs +1FeBлL…TQ$~§№ј`uK2eЂ›ЊЄFƒŠУV–OЅМHТФ7ќШz"є ‘эБќИъЊCP€n{є’ §tZёaќ`GžWІZcЗ%SY`Z'ћяV7зц@Пм 4T&„N‹кСG§,іХ„Ѓ[AшъB—a{уc’U…ŸњnG^IqаaщQЅE,Q†~?5К[л І}МЗіaqnіэкътќf›јюё‰—†h>Јl |:‹BлђMнѓ аŠAЧ;К•,0Ч5Я/гЁ8^`ЈFЪ JdLE@л{;{л[ыЫыыоУЧ‡Х•НЃН•хCc/ђRjYVw9Ь<Јр-–"Љ–>юЙQ T6\MЗt0WЋqѓS,ђ >W& @SdKУЕwKЋk;Л[ ЏgцfgцAі]fXў",њ№ пфedЉ-ІСШ_q`кgСsуš.ƒС5к=šŒ €TQКGY§~cШе:›‹яо...О›™šžššœš[яшQšхрАežeŸ xAlƒиnћЄyg“Э’иazЌ ГGлыы{Э.Ѓ„XІ‚MЃКЁи‹УђІ+76пЭNOOO‚Ьг3 ЛМŸФ dгСМШЁ,С‡“?э#(эuЛLЇqДГОњaу] Я.@ъk‘бHЁА†hœ[cVчЇ''ЇfоМ]=Qƒ8ŽCрс§~žЇ(s’—Vы§ŸvœqAфЊЇЙЗѕ~yПХp=оžWe ќˆPт‚Šž.В'›ѓsK[{‡m$aјQ†nXdФ"ЫНгdяЉAИЃѕѕх­лхVЫшCœFњйЎШcъ1ЈB<аN>мgd ^@с…9< №Fœ(‹д>Z>ЏЇ§я ,d>­ЛyЄїЯO+ђF ŒP>P6ТЃФТoƒ_ >Ы3œ™+0жјНхљCU'їж„€€lЃ)Ькћ}НЈ МЪѓ4‰ЂаУ‰r4mлŽ’$р+И…jž"MKœšЫѓьМYlx|эœћ9PВucљЭТЭG}ЈЕ!уS’ Г6т›и1#КXge5іn˜fYЈ6_ouv lжю`rшЯСЪЂд;\}7Зp 8ЈXq "cЈ ~€qл† М`a˜@РЈ2KVщьімь#RнВютиЯЃЧ4vVпНY>1‹jЌipmž‚zС]Ы{~р)’ išG”=њ0їve{Пб%лYŽVZХi:KH/иЏф)DЁ0sЈ.KuYBgб§ъіsрьЄTуНАу­Т­bv‹FыШ3 вс?CfАp+V8€дР`“ШџUхpPЦуд8fpO<\^онщHЮнœв§RHNбІAгј q„Rƒkт+IZ˜У;э љBаtTцЌ1&Tx‚пЄзіч€ —пcTОмf˜ Lт0Z |…*@ђ\1ЉBG№w‹љG т^?­Ђ–БЫ*ЊЄЏm%АЙхŽи§bШ0iWцV =Œёыјз ољЗŸ‚фЃб ‰Ўў†Hэ‡шŽ№ч:#іг;:šћ+рAЙšФY|m (4PЛ*ГФhв§"ўgya>єгу(:K ЦПЦПg§ѓ№Ÿfа(d˜‡s ~фIPѕ5U–И tјд3Тігr&э8М 8аЇ(‹џyі| 6/тrаЯ"FNŠnˆ}B^’eдљN`B`Уо аuЌ”е оQSц8р@Д(Щ2aџ•@)Г33Sг333гS?>ўюлoz<НЯpЂъиšмэŠВ4V~Нм`"KЬёЦТфєъњк^“ax™(ЊЎЉrcсйуžyєlz[аШ@ЖЪ3œЌRББНЙsЬpЬ8ј6КDVpЕеўквVЛг“…рJ!гЖmSm-ОzіуžќёgижСƒMъП™ыЬьТ‡їГЯ=U?xј§у—oxUwЂ,аd–rЭ“а(ŽCх[,6,*rї№р„%ВЌЊšŽ‹‰А_Ь2ЕюцЪњтдгO~heё“цп--ПўщЧчЯž~џ§ЃЧЯf7ьqђвдR–#КCјnЇнх$ltџzЁ]Г Uf'з4гqMCЃиQaш ЁNчd}њ“z?џЩ k+o^MОzёђХ‹ч?L.JКЁЊV˜yTfIu}‰ы1]Žи)їѕkбZд0W:]™bŸенаГсFќРSБ}tвиОщ*ћћ+г?MПzЙАОБМИж-S™гP#\Г+ЉqЂЪ’$kŽgS‘џzщ€щСХyFдА˜PнЮц‹ lCЇ”twv›7ц‡FcmzъЇWѓ;§ƒЖ„Ы.M"И ёЎ'Yсс*‡ r4"‰_ЏщЎjКEnI5mзжБЩ4D>—U+TUщэm­мt•іёвдЬыЙУ­#F$ QАШ…єі" FУФт4ѕ50щ1ŒЄіРˆЫQьйnЅЎ.ё’f&8w™…ИЂўpcqщІЋ4і'_onmooь4 `RЭŠŠAЈЪBc—QŒtдЯвМЬ#KеНЬЂnийхХ œТC$=ŽЊv>€:Ж„;СVЮЃхї7 Н=їrБ}ДББyаe™ša9Ш Eюь6$ъB]єА,B]–ЧВ0€˜–“ž§ќѓЧЯs['э‰ЊnRŽFЃЌoм(twuiyqqu‡‘IЕр–SU`›"ѕWЇОZЕг‚cХЄ'zдАƒltёё—_.rзPКыoWіЛ‚lЇЅ™’Ч‹яoŒгнжкв2XЎZ К›†™I$‰кс№ќъ<Г ХbžЅЪxˆ“Ј[nЃд—}Ш'bcueЏУSЇ<-]\`ЦПŸпМё*noc{gk˜ŒL5xLЃ~фЙAR Fи^m(Ў’ЯXp>Тlxљёу(quТЗyBt4*]Э5WчotФ‰–а<щ4wwь7|ьlƒ-БNѓсY?ёЊuЮ Яє"iХA Й:Ы}вЌЌ:aŽгс$_žmя,ОЛљ*НЫЕw{р†šю—gЃ2OуаІ4Ц/ЯЯYь;–ЂŒЉžфTаu^œeОЉ**$р,t­ ˆuYрzlkћfMƒЊEЁЙг€uA6  B'Х D FWWчУ<АUm\KїЛЄŽњч—УШ6 ;*s~Ÿe6с9Гw‹‹0џeWe"‹DqЪPU[л‚jfчgчWЇedk_ђШn ЬQЗ][JГФU ‰ў•^ Z4(Т—_€Њ‡P#п6Њ_&ЋКiUЛІјИЧФ_ОЌjƒpФъ†WbvŠ[нбTЃHUЭЖmЧРѕГ§2PFИ–N{ЊšA‰ ь|лј"ў"ˆеШ4%Вђ5Г;ЎвU…Ў Њ–—ц}А s >?˜Ўє•}=ВЎ‹•№КэGIйцЮє\A’ г$юД‡е'дГумNрŽ!(Из—чŽ{З‰;5tгУФ5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃЦяаю‰’ЄHŸ9Г‚'В$pМРqЯБLћž…ћStxY"Dd…PM•>•‰'’$є˜.м—ЌhІЉk*%впz #ЊЊJ$Q”IзuђЧ=ў%ђ r—э ЁКa№ј‡№їxЊъ%VЈjšUU]ЃJЕwЈЁбпярХkš"€MT{N– Р“T]Ї?Ў›П@bUWUь0Lлѕ\з64…–eќ^з2м†ŠлФxšН‡'8р %*м­"нћYKЂђЂЬю„‹‡NžЅЪИwА&ўЖ§|дkxІ…ыzžы8–AeAЂК&ѕИњф=tŒh+**е-У#wЋЃƒРе%AфyB%‘Й–›•Иž кŽЇЌщŠb˜№п‚ 2­“FГЭJїgм<%šeЊИѕцЕ8^Ў­ŠЂЬtxQ–иJ”sмъ)–у'‘kjDyAV-Cъ6кнNѓш С№’" їKКЂЈX:n‰'ч€•jКG0ЛІЂh"„ Œs(5/€l]т„Qр˜`ВШїzВ;‡{ћGЧџaю:˜ЃX“$?𖇂‡“Х#Œ„@h4Оgк{янt•xџ?тВZмnьХнюE0тј)@LЧTWgef}нšjŸu‡Ќ(ƒV~СЬRž-CFЪ\Іƒь 7hГЎ™КТG2 p>НUЧŒьQšQЎёjCtКНЮйщЗ““гжйr.(К}х“З†Џ’т\’—*Ёішƒњ’,]p™epјš>эєL6MUV /Юђ Щvh\зmuћ§~члЗvЗзыіЧМhZW<нЖЧy•чLSDU%ZсGIF3`Cлв,ьm›єЧ1$аж57)Г8pPЛ–ЁЁJ;=f шt:оhДЉфDipŒ#оГКaš^>ЇЙМЉ#Щ‡/ ьу jgQ—E’ѕЧъЋйtБœO‹sЌ‹яп/.V `Qy |€64ъ+PŒŽНTƒ Сb‚Ђ) HЄeMхIQЭ№юѓщЄ*ВФЗUДWаEДTЊBЕhи€МЋpV>уuK cЙZ}ЇuqОZтАjH шšЇхG0‚k š9щkLЏIў™ o`Т8++@{˜V“<€ИшŽGSЯhde3ХAƒ€у /6(шхъ;в§§;ўЌцИF8 —Ьst]{р[Ю::fx:6€ *-8"ЫЁ<ЏІsФЇ/–ЈТHфѕxБКјўзХљљQг„я 4єюц:‚FМЉЅЭ!аЩB”“Єbɘ7и˜!ьйŒP&7I4д;bYСN , МuH‡ ўѓsJњ И>?FЊIY&ЈFЕ|€хчcцEA‘a‰Р dQ˜@JІЭ[7Ьg—ЙЎЇS­NЯZэ+ТSЋ№oшn$'ŸTг.ЬВ!ъх 'іhޘŽьCsтР5uФН†v€aŒKЦQ„т’—tЅ)б Мє™’ЎЎЪФњнюбi˜€"X‚™–5.СŒpЏп%h˜*ЇЫ‹ячTЄѓ,pЌFЫў“ьhВbЊРšчi6Љ x[ф Ј&б ЄЯБ-кЧ] NY‡/БпzbPV§Ђ4. Боj…˜Ћyфѕly> MиmкЄєгВЄ(†Ў@БНИЈъYѓо"шkб€ƒ‚†r,І4Ѕ;д%Жsмba#@#№šОЩœŽЌЄЂiЌt’MІ›|Я §ѕ$ вjОšхe=M#˜=€0јљFз$ЭVLHЌЖѓЫ‹лM(ЙЬ5айŒщЮlYVј~Ќ@,hїWW…A‡‘i„lƒ{ШЫrqIиѕЄ +^”WГ<@Bђ$И,œŸпo‚=6-ЩжQж)ЬŒ’_-ˆЛ(ЩГ&h8|b€HуUиIЌfУРАM‘хE›‰щ1ъ…@Ь7Џ&\“ ­I]и< РPh”:цkЊ…ЗVаnјвEШXвЬ6˜‘И#qх$6Uй ,ЭRX^ ЏchыЊ?™A‹fs0Gуїюz’ЇeщЛaQ%Ж—Р>ХLvА† EК†ж ŠRПИhв„ МљДЮ .žD-”†іIфu;jВщš†яШZ†—Lз`Є†YJЫа­m‡Y–GЌc †pv˜ƒлЄaqNАX\ŠјМбЦК.\•ќš,ы†ЬЊІЉйІРAѓUлеД 1O I№Ї‹бхД,’(‹m'I#™ч‘~ИУЄТЪ#б†эg0 ѕŒнКhŒ2нˆ"ЩšrДmи5Ы .В.їGРˆЄ[ŠUжѕМ9O"ьEsОež„iъи*аrГ, ]ИЋ`ћОВmІ&zСЦ=/ ИаГKЁ7oX”1бe@Bƒ~š'аdИЖ`><€цM*͘6J4#О™ЯЪ4 ЂЬ2[ї2Д>n„ы’ЂЛ Ї‡#JЈžh{4ИFаЄŠѓy]xРБ&JІc*шy†тi4ХБšашщшщ”ДhŸј œ#Csг(Žь зГЯЄКpѕ№w~ ZJ’|.ЮW—ѕDЂЙкГ* 6ЄсЙѕqŸчxfЄЈNAГsЪoУ‘ ыЩvЅЎВ №маБ‚$€щˆc@л “ѕtЖЊыšњфц~Oхh‹|BšŒbš//}]њЊ№TКpSUљV‹иN‹бD№ЅTГЦVMЇрt$ОJa ьаГ§ФУi ‰‹ЏЇGщЎšIwXЂ<[WYšЅE='љA PwФ?-}>zџънЩ з:;^й,'еЅ“Mc=™чЈJЈ‚d†ОыDQДž˜)jЧ1с[“аŠшŽ‹ŽЖnД ŠИdJЖКЪ}сыћG­іЩ—ЯŸоН}ѓ|яѕЇїЯп  NЏЂ™ѓфAАŠ"rQž­ ЖЏpМц"-ЁЎ+шfжЇmЙ.”Žу$A5=?*‰ЖъK#д|›y™…ђщлoŽOOOŽо?плyіdkggїШ„Ÿ›LЧ]”`y†эp5VЕ з,Ўлс`ЩаPЎ+f,$*ън~w :vгrЖ$Ѕ˜70­„8gјљ}ћњљоіжГЇOž=й9RrŠЕЊiУЋDЖqLёrcAIЦјы‡/mВЏ1fЧІСuŠ0ЫŸПЗIГМpB˜ІђЊ(‹iEIpŸ_lSРл[OŸ=лк9г~Ў ˆёНЎKњVO`J„AџЫIыЄ/]еНfU8ІѕёэлOG‡gА–г^ЊЉЊI6эŒЁ%KRŸ?9xЕПѕlkk{{{џPˆ@7hг`њ'—ёV“МЈR[W„qяŠЂ§ћЧ§“Уїoпщг]VиєSB5]Wž0„ЎХ?ш~=ий~u№ўУсаЫрˆ‚”pЫПX:h[3mОЫx№еДCjТ!ггIЧЁчgišЦiРРЕЭљ%Аёхu4ПQ !Птлт_ŠЋH†Ї O>u!MФŸ9u&фŽвЦq”9с;Ё›шщoѓЕkСЌЬшюT№ˆxdЄфQVMЌў‡§Н/Ÿo=нzМyїЦЭ[Зn^П~ус›ЏнбеwЗџbёљ$џб )iJЦ OтВ йУНнНчћ[oоЙљЧ­›\џуЦцЛюX”Фѕ=Зєoж пўњіЩН;Ÿэьќy{cїрѕюБ5!Ч\г}.№р…ж%ЩЋLљњr{kgoћЩУ;мИ…uуцнч]AdQ]{O~scыећOяп>йМwуњпЎ_џПнкў:фEQрŸЗ76>оzrџЮŸЏпьь_ jкЙЉ*кЫ…*tЗp2ЩмбЧэ­ээНн'ЗoмМwoуюэлїЖŽ8A”UUe;Cq­mљэmf4hОл{ИyяСн[wО{ZщДЛ6LЫ єkЌЭйŒНЬ|лP§ЛŸ:ё–ч—ћ6Ђ}•q‘гЦчЄю‘„6}ЛЩя7‘#п\rШsЂЭЖЯщЁОњx~u}іўы—1ЄХљЯПœ_œП›)ЊfАпž1DAеŠћ—CCЯŸжыФaЮIŽљЩnЅEUїћЯП>7‰osЂюVл>u,фRЫЛя?ž=|§*’Њ\ИИНњљ‚—щXFвn‡5НgŽђсљх0і(с‘|г.ё“ЄL6Т@’•ыў№љЅЯ#GНПИtg="›КІЌfзя.ПyЦ—зO3юъЇ‘j–Е[јDUЎ›Іїќœ?б)ƒeДЇЖ*вубЉ нŒ_>іћЁŠO%є$вШѓИŽ§ Ь6M™цэ&аe$ЋКЦ}У р$suў~ЦS‹ЇЛŠŽ/вYa ФпПМь‡vSFЬ>елЙ`И~˜еЛOЯC]RЯ=7(КТRPхК:{ХE–šХ§|1щ6НѕЎђh_ъŒ“4ЫEJ6n›2K"ЯqNї$jЅЛ~TŠЛqw+1lки4QЏ{Ч­Y‹?,RЕпŽгuщўИ7Рђfш*к@эœЪ:ЮцwO"є­ЛэўpxyR[\hNвmBзeŽiМЪу5{љухB@Ёb'уnФY™ 6НfOІт!ž'{ВтцO+ ™yjКё0ІЖќШ›Nеm2д/–і*ЁUcўгЭJR$#lžї]Тl]2н0ЯSbд<€ЬЦщ^}ё<ǘѓ:RЇu_БЦЪ7оАќВнT‰oiЏz\Ўк‹wOВn^к( ^1,ћx.mћдЕQ“Aе>Ъз|ПlЭžшŒbМ‡УОdКoЖ‘m‚ƒPт‹oв:c.ЂЦG ячcЛ– —ŠъТ3^Ѕш3нц”AбЖ›ў0&АХ Ч1Ц?V’ЌЂФ‹g‘3nЕтxA6ƒѕЖr™ТЩІЏэП`иЂd ?Ь‹8Ф]G–4зэh<”шо2mзѕ“KЭщ–ЉKЋЇЛ{бЭ†ўЗрt#Ш_ћМм0$й4?Om˜Ыƒл/л‚jsъ"=БЬВэ:.Й.юy;ькР6sУєђWŸAV%б0шqŒІлuу™ГkƒљЭЇ—mSгЃжužфржя 0:ЊчЙЊ|ЌjЗѓCљ†“ОўЉgд'i–Ю ДНxВys<›јќВыK:xZЁ-jQgiф{ЬElЬІœqЈQџr$гВ-EдМЖqlўƒрј ияххѓЫИI@еЇ•љЬ№|/ШЊК.г4Џ›A—?“tиљКŒD'КL;jsЧ^]‹–Пy9<P%ЏSп=љо jPфE9НŸ@юžљЧiщI/[Ь)šи5ЊuЯуА)‹<оЂЧ‡h"]щUU]%СК_UўЊЫќ2ї,u.3ЏЛ&‹Т №оц5ДЌУikb ў;oиЬOŽOР,жHЛюНYƒо‡>3Эя)?™Х<ЧR‹ЙёzиялЄє†/цt‹йŽešпЗ BЗ]І šKЯ47§P'ОџІћW4лfЬ|]Вё @tз‹@HeОѕM;U^ћ№ЂNŸЖГЧУpшиќ)Ю ўЙјџЄу &L˜0aТ„ &L˜0aТ„ &L˜0aТ„ &L˜0aТ„ &L˜0aТ„ &L˜0aТ„ &L˜0aТ„ &L˜0aТ„ &L˜p,љџН}#'H‚А:[,ўDyОA3LЫ4 лд §6’UEVt“9Œй–m™ŠpŠіупСĘ q4E”E5­ПыЬЫђŠ[‰4ђУѕц2ЯuC§'Ю…ZъЖуzi˜cЊ Є6џїmЭЫц ^в,Ч |Ÿц3ЫЂйџ$‘%еёЉнЄяAGaрX†Ў›6ћ]/…,’FыВ,і]цzЎУT~%ќŸo&’aЛиulфz@ђт|ЙZ.AVKaёИрИй§ ЫPŒ‰Ž#2ѓ€Шƒ[’•ž?дa;ЬЋ:ї-]“И9ОIд]п h$4ЏА0dѓїmЄц$^”јХггJ’„е’[qPЛhЛŽM3Ђм -ЋќAБк2ŽЭбяЉэzuyП•ЏшšЦBВjАЌ#ђ#Y`ЁрMZБBS`†ЧЧ•*KŠИZЬ№~M'.cnЇ4G:‹]jлВ4 вWW3њ\Pu›"‰}DOK‘aя:L Ži#эcЖЎГаƒСŒз˜ =?м/Mб4aSDU•ёЭdAr[›xд@њ;эyїюFuж%mW•9Ќ7d"”2„Ѕ8 А>4aЩa6‚+%1'/ђ{(ŒЩЋхlЖ’eUз……€…ЕLMЬ:фdaRT%иУБAлКЖМ?;›?]œ?Ь вЖƒЙ‡.ѕSї yъDA Ё^ВžС qш…Ю‰ЅЖŽЮОн0LSY)ЬІљ†ih:ё(Ѓнiф1U5[ИО Š<ЛН).bbCУІSx)eВd№OCЬС\x"hйIьŸЄЧыЫ ЅЊ:,˜Шj’щ1ЧcTŒ˜Ч$QлЈзEгTS›?rцšРЭю8xyллЎЎђ$JЄ)H  9’Zюіb!!ˆ3O)ЕHЃ5Ыж‘™ЊІZхЄX]0Э;ЁЬКi7e‘рƒІ)Џ$K‚/ЮgŠaЅuGcККЖЏhЌ7n.ЫЪ<)зb ŽWђcЄ‚žw: бmПl]3tfв J№lТАЬŽХ9Э­Ыˆ™ИЋу<8ѕєE|”§lил~;ŽCпѕCGу)зu™ЅqИdб JW‰ ŒSЩ, jС`О*ŒvˆД™В3š‡bЫK2šу9ŠФRužЇB?}кХљЃ$нЖяћa7Ž#$?ЮпlšM…Hц‚j"rSŸщ˜† ‰š@‰œ?„АˆОXO7„ФmзЕ4(3pде§’"L‹сY"Т тцн oЧнnП?ьwћнИё‘ЎЉЋ$ˆB”~Е‡ЁЯNдЂ\ЖTQV2„8€EѕЈP%Щт|гB‰mз6ы2EЌрfвЇМ 2КуШ‚žuа3„їxмBє§сАё{(‘вFQ"ЂТOgNгq%‘щиВ ёIНФZ!j,ЋХКэЗДђ-)КHЄџjHqƒrдЕја”ЄУ— B4<я№Мп љѓЎƒUЅI yKФЭ(АOc Ч[ŽЎXdй.Mњ Ѓ˜f\WыMKм0 FYЅH:a4ъ„Вl,НъЖŠv ЁЗdв[x#Љ}wx9^^vmнЌѓ,ЯЃDЧŒBfQžsŒЉІ‡"еёP`#MЫ5йё0n „Он!c>ИРЂ№ь"єС~\'pƒЬ1Р(№ѕpЦmGшwа6ЌdлЖ}ЗFц’ ФeЇ(c4~&‚шX)ˆ#zZP‚”‰xIqФa=§КfГЮскƒЬBУУВВУ јjZмc[Џ›ІnЧБяЧУžИЄнPв#І"г>авrЁXšР…тЕ(` {иэ х-§\š|DЛЁ2œтв”$у’Вh†Ћw{шU_Ў‡qГщGтмIt+Юђ48U "Зh~+2fH\ƒ_{*ўЭH!аа§&xНЮ=Є(шм4uC•hВŒ—р–ЃAР)Фє4“7MЪІЏ‹К…иt)ИDŠEIќS ‘.LbНЈк4нoњкс‡4 MŽ*„"Ёh˜мгzЉўіШ@dнЫы†ЦLЗПйBЬ_‰ќ lYЦqеnї]еMНeёI4Э#ы™Ћ(;œЄ!ЊиэvXd ХрgR4ЉnБj /ЖІшЖaX6ђ•cТтчѕІƒr;"э~K&‚ ‚<%Ю‹ШзэАЩѓК^oЪ,Ї~'Šф3žy–[BР‘bаз4€ RtG/Ф J,zьhмя”к[ŒЁ4–еP-˜њшКyТа@бI’ц‘чЇUЛ§Yb™ф(‚“НDYeƒ ЊcHл 0аv]mкК#ƒю‰Я:вНЮ|S|КzP‘Jxєˆ4Š=сnщЧe!B?’5жЊ]Ут8K='ЪыЪgмЕ г,pМя‰wЯqKUЕ‚x wџХмu?Зqdiўь]лZ[’-Kk1 Ђ˜D1€$HDLюЩ9 ‘Aћїп{Cћъъюds‹АНMUAР‡з/|пыnєЭЭHhšЋŽ+яЈў`цH™+ „n]Е‰ љYE^%5OЏ$/Œ0тСГ'гљЄˆ` К ”š%A8H X‹`L sMQ="ЪvО‡71–€7ŒВ|ˆгŒ“aˆ‹'Y I%}šbmЄЖњФVГK4+-!`jFПd>Шz•+xX|‚дeзЯ€†ј‹ЙˆFdXІ+ЪŠCШЪйdy˜ф;FX0 1џA№чі‹,—dFТ јtгQй>-#Б‹QЕ?! ŸЬЧYјžm‡>ди0q%bћYŠqИQЎH<гцeХŠ!9Dљd”%E‚Зў<„ІБ1R&Аd$ *Јј„%ет‘ЦВРg™Б!Й@оc’O: гиѓ=У еc_•-/ŽТабZвзсй€ъњq9„0‘. Ћ" +:^>_dJ•LƒђMвosŠFL…uGБ8Њj $ыaйV`YЁЋаCbИ~?tс’­ эОŒіˆ KA6ЭR/Ѕvђ3C!U7 д&(1УyP94 2˜Оjgс4ƒјЄуŠY=ЬLYЂžєAѓŠц…ž*˜Ж оaы ЙЛCД5Ёг#Š%ЁчкQ?PЯг“v•>FЬ %фiW!’ЁВŠeЈT‡уyЊЫHš-Hš‘ЫЈX ’0љЄL"Wт†І–miКIш;цBюярM]Єz‚  !?™aЇA†P}БаT4љРЗІЖЌ<ŠEaЛ/ "'(А-їЁˆƒcJ^f Це}пвьШе „†yр: КиХа нх!1…Ўe8@зCлї‚Ќ€Š^ёcЄѕ0АффЁЁ*Ђb*DЇ&ВФu9ХжE-)'<|Ѕ!ФC9Р^5ШдЊx–,(QЖы.Дn–цTл< Бяxv%%њєЇЎЌ sŸE† ЪЊ.Q-p( |њœV4‰їаЮ#`ЅFcQХоёf{ЖЄ…Ю1*Sз[ŒЅ‰%ѓиў†Љ]B 4”э)&qхв˜|AЦ”ƒ42њmFЉњAЃпk^4ŽіЏ8ІУ†EEQъЁŸT)gAзL7’xrЏЏz‚^а%:†FXЊ/jКФУБгХхŠh0ЉЈг >Š­a |гь^tЉf§шшьєјфdчЄyМл @L(и ќ§рРžIЕ.ŽЃBrє х™ўЂК5š ™“UžЂ‰šе0=л ВЙWi4РОQШь5ZЭњсСЮЮЮжЦж^mЃ  Љrˆ"&&E>зефћКЃіД‡iz1.Н„+ЏиД“%†ъГМЌЫDЖL7ŠуŠv”@;ЫŠ˜B™ЬМюіцжюсёЇ›kыk+oзз—kPЉHь0Z€ ю’YЊ&З;}Ю"=Х–[']з]ˆјяЁš†JDКCѕ{}ІMБВцј^†ŒtŒ2'›ЙiEn{gmѕнЛ•х••ххЗЫoзъж а"GF;@ЯЎЂJНNГЩKМтў!‹[Р xŽn5Юъч“ѓЖ й–•O1ЂА€ €ђрGN{{аО]Yм€ќЃЄi’ƒЅГA†ЪЋB] B[YЖsvвьIŽёЈ{’Ÿ4hьжњW‚Е Ћfab$V6№ъ ќYнъј)бмgPфž”А&ОЁщ:ѕщшЌЏ.Јіхбa5гt|аЋу*o`bŒe V§0 <юђьјcmuuГVлмЌЋ1оcœуlфшк9Œ п‡ЂђЧ›И”d{HМ$)~IбX2@Ћ!ЦЎœoJЯЖ?эеЏ./.h,ЂQ†рb+;і§иіfžv—оcAЫ–эxš9nRb›Ћ\Y5ЈЦу†Я‡jЧѕ%Ш9Њ„~Р'BЈ9F$Ц"8ДfлnфњžГцняbiЂЂ‡žІшQеfFAg…’xе’"xЗeСпP•0ˆ€фЁ}Г4VE†жp-нќsPЋЇ:žЪ Ю*й‚э—М dъЉр—W€Јd8zцѓФU—(ŽcЄЏ>P‹Ъ9атQ’BЎN“$3ЉvЙмS-Sb›ДђЇ„с/ƒezWз­ЃЭ}u8Хz‘a–V˜„Šћ)oTЙGŠ#ЬVчУцЧ&K€+§uЛ =la3 ^аР;’БB} у8‰qЉ?пHsцqЧk›‡Эвї/УМDЇШP+9ždI„ч4K’ŽэlŒЦƒ ѓ.o>iшЃйl‚=ѕЪЬЂi!?Ѓ+ƒБSpwјЧр?чЂЬ„јЧ\Кrƒ$јcю~ Рћ їЦўЏЁgЄЈYœ`БN||=%ХŽ†"€ў$ІёЈсLfИК•…)™ —T яЕSŒLШ1&–4њsjпcG4C­šХ:У}ІŒЃ~BШ!yŸ`Бћ9ž<˜Є"€Nь!1ŠЋHDа`i р:БѓЧntќї‡ю‘WС0Г<CЇшмшпX\€$Yє_ ђџŒl\’ЈrUiфћ1Ј Ч$†м‘бц%e8)АPCYAющ;–•Є*0?,Ќ9АШއyVr њ М"x€ sH–SВЛsEБ‡ЋЋЫoпМ|ў§Г<{і|љАMГЬ—O›ќсCLŠJўЁФŒWŽТЊЬф‰еЌэ^vћЧыЫЫo^~П}ітŸG}^$‚А№у_ћ?М~§тй7_џ§ЋП}ѕепП~ОњщЊKuлƒѕŸПxљ§wЯкмyЗ~jJьХ БЫ‘%˜чА2V\КмоњіyЋ[_{ћѓЫяŸ}їнЗЯžПоюKDТ}r‹§ьљJэ§ожЦOЯПџіo_ђo^эЕ^ŽЊз~њс‡_НxБv|ДYыЦр  tŽIwНЗ Ѕ‰~ООZ;КlМ[ўёћ—ЏпМ„_’D@wIЄзeљЦщз/жOšэоe}ksэЭЋWЏ`b—OY\љ–$‰9ЏНљсљЫќљгсће=>Ÿ<4n@UЁ—€sУcЭ,w™ы+ћg“wЏxНQ[ћљЭђц~›ХД‘Ї‰ЎЫ‹Ѓ%пќ|ЪЂШбз—ЇwЗЖWпЌ|hpnmХ —япМ|ёъЭЪћя7ж•Ќj7сРFњ :K ˜OЗ7WжwN/Žз_џДБГЙБОQл=ьJD<…АœЂi2л:мй?kЕŸњхM$O‰|Џйhяю^ёDRpчЋЊЦжЪ?WоНџАЙОЙY;•’ЂB]а_хC356–>еоЮнѓГЕеЕЛяпo68YvRWiNжTТR­ЫЋKГO>ЗГбТx&ю8—…~“j_ї:=№hE3м—Ы7іЖŽК—G;ыkяоН?ЄŒ];f`чA@“6жззз6їы'ЗkяjЕ­Н“ЫжEˆgІТѕyйtdžЅЉЧsМ ѕ~иoSIе ' m]‹tŽ—ЊcZ’bј!.€ГSЪб:Ч6—іЖkл yeЂšВdј1фО4ё dIkы›ЕѕѓѓЃ­Эѕэг.Cї9Q FЉF(Fв‚\№‚Щ%Iy"БърbqTфОЎрв QpWЌ$ ЂЌљYhщšдНь{y№niщфpћќWZ6Cz`аkkЕ§уzЃйcЉгкћSђ†Hd{0ђTЁУШF–š2‘4Уѓмї4а,žРЩЇЙ­ŠУJИ-Щ6dIр‰Ž2ЧаTюђМЧаT@ЗЏП№2ыЕƒ‹vЇнa‰Фž~Ј :ю—SЭx’щrџšWэr8ŽыуВ‹ЁШъгј ЃщІWЬ2ƒє)йі‚ШзСд’М7iœRbу=юГh|сevъMNdКн>У6/8цЯДМИ9.­ъсdZYшšеDJђг’6­‚ЅЫћЁ-бЌbи~ќT‘5ЏЉЉrчЄ~иъ0-є—ђеiЋM‹‚@ЕЎЎšgYƒ у|8ŒT…ЛІ‰9МЙН)_ —Їњ4€v‚бПn’jK|Œz;jс;сp:.|C•фоЩщЩ5u„ЯfОЄЏ:4гщˆмEЃyіЉЋ(Њщ'EYц!зWœьNnof™ЃgY^|ЊРЁ5€:ўќyМ3/'“"Дэ ЊН™ЋУ\іЯЯЮ.–ŽЋЇЉЊ]wшn§„эž\\t!ѓы~6š"2ч-ЂFѓ›щ(аd§ХЩњ7Ѓ9^2™п}О›понОКf@dЮgГё0В5Hp§ЫѓЦйвЩoОLѓКз:иo6ЯЏъћG” ЊF4šЯsSт›ѕОdцгiY*Є”Eєrx@c›омпОЏцP†аФлЙg*D‚ByyyЖєЅМё0.ЦсюёyѓъјАбХŠааЊH79чУY™љ&иz!:RВl?A1 ЧwŸo'Љ%1ДЂyљx:J-ЯvЎл­‹пнш]_Ÿœ\\Ÿ5к@fd#M ‡№НЋ:х8оŒЧEhСЬ-т((Ѓ™6ž–№Тtr3№TЗЫийdGƒv)ЊsНєЅdї0ЮйпЊŸ_ЗŽЮ;MД`8…сЭ/oчУљЭl:@`k !зЂ^3АА˜нп"Sъw8ЈЛ“q†цX uНєлtЁNQ\їšъ_7ћ}”ІЩd:Ў•юnnююooч% Vв…"ˆк4M/ооЯrW#4'щСhу9OШPзk.§v9hS^‡!ЬiНУА |+A(—Иы"ќfўљ_ŸяnчW_Ь’bWTЁ,PYвйнmš@iT;OSА}VTB]ќЮk Ѓ6ЕL Ш'QŒxin2тЖГ fІЛ›щt< €ƒ-t“\xЂХЪЛЯѓдЕMЫЯЦ“iaЫЭY–Јњ#^ч‚[Gп@ щd6Ф‘хм‹љэЛлiфYњB&vк}†ілС`ўљЗgчИЙЃœФšР№ВdѕќЏгdФЋOšюгœb 'e дEіЌ:йl6Р“:Ž }! a>;mŠ“TгMЦww7Гёl>N\'=ошЧЃX{—у{чЫv{œьM9jеьё2€žР Яе MбЂyUfкз]љRRLчЗЗwЗ…4?lYЉЮa?ЊŽ‰ќХіqхњЋЦѓYjШ„jВŠюФРcрб№љ5y1Ы]‡ ˆz4ф>Ы гМœоN3c'}Лтзz'kэSИяиЃЛ›ЁЋЩPЈt/-&3(т@J"У.У›NЕљпЩЧEd*sVч.xO Œц77ѓТ’'[Улƒ‡э4ЛZњы ˆЌ)BїъВйщГT@еLЁВШЂ@$gP†КD= }-JР•Иx–j"Я+Юx›*ј @Ž/pёЋ‡пиpY?<Тo‹Июб‚ь–ЅсЩе+"эБ|RЁЛ’ЂY иШ—"B–wІw‘*24+ˆиЗњОЋч‰уПиЛвю6Ў#Ћ_‹’'™XN,Ы’I‘ БіО/яѕО/h,ЄœxЮќќЙеђŒэЬœ-MO>є• ˆ<@ЃК^-З^ЃЋюqЗZмМ]щМ>еЬгНY]xњ mЉ’eЃдt vœљDЗќ…zЬїpcМeЫN4­Иќ`э€Щд‹OvyээЅц†qt?тj—iОћп}Кm9‰шцLлхеБђmm-лv”}ј%MБкr]U0œzёЕрУOџлHоп†" Іќ $>‡aRv=нž„eпFШgkнvу№ЃŽŽL$ЫŽпіЁЇ] ^|o•ЪdвЏm’аШ†  ” РнаЎЋ ЂM_˜§ИIЊFмЋG…ЉмЊ~zњщЧЁІЏXŸќл›T ФEwD-w>4хXЂhиШ}$“{ЌнїЄщgчŸFG у0˜ўвЙb{.SбN‡:В CУ2?Слq АFFБeјaћупЯ9gєgЂЛЏ *<—]“ИІŠ|`˜цЇ0v—і1CЯ1 —ЁTќёО ИяMv›ћ?BЖ]Аъ,–žž?щ(u^Ёвv"ЇwяXѓф—х~њЊzИу^ЙёЩ…‘НBfЮг†nbыГ€=ъ7Ц~}іч~„щ 9ЂшIŠЊЊщЋЇбќхW€!™Op ‹nр“$/ЫtЂ{rў&ъ>„zРAєЉГЧ4GќНрПƒ–gܘ1cЦŒ3fܘ1cЦŒ3fܘ1cЦŒ3fܘ1cЦŒ3fܘ1cЦŒ3fܘ1cЦŒ3fܘ1cЦŒ3fܘ1cЦŒ3fܘ1cЦПvšiйЖmъџ9ГB6FcБ-Kзѕ‘љfЊCџ\зЖ-SзMућt cЛЅ0рœQ\ЧP&“ѓ‘и>c#66ž—EIw~гnK7[ХtзС<пГ-eКŽЋюё0dAЦqsЯR!ЕЩ~еКЪ2ЄѕF2§ Nв$‚ВyР=clЊП§™ІД“lr(š:0'$UЬ]г€1ќЯњ+Ў­)ŠЩг,KЂ( <лё\зг7OžlDIћн%юХєHˆ0ŒHгxJђ,tЉЇЁ§Мў У№“<сОm{аshK‚ @гw[QЗ?А™ђ4eU”EU5Чѓ§Іў2ЦYQ$ №a)c˜pa<žŸ$улВ<Цuw{}}ЗZo%gСмkMќй%YU%Ф7nX6gŽэ8dO‹Њ„NЉ‰шћоН–gйaбцм2LгаT]6ЫХеы7wд:міŸІЧў?…ІЫВ"+ЊtwЛйBj]зTU7tгѕЃМЬcюS7$ВI^ЪAY%Оƒ•`žЅ З—п}џцђzЙнneУrY”UYlЫаUгЄѕх›ы• ‹тz)hѕє<—œб’ж[YЃU_Š‹­з9|4Йoђvu}Л“qyЕR‘‘\hкw=іЈУ‘і WEИy§њf%HлхтzЅћѕŽЃFЛi–0пиЎЈЅ=BФ•*K:Џ ŸF)’Илюdнe0!]TсЇЎыВ#ŒѓЧ”юgj›ЫзWЗkQк,яЎВУ„МœЦ{ЖЁ*ЌЉё{йГ 'kЫц —“жыЌ#Aњ0{S3œ)sМ №‰Kfи†І™ъіюzБмŠЂАлЎHгдО…IšW0fi–IіЁП[ћмВЂЊ‚}рїТvГХЫН(цœУ{=<ќ†|B{д‚c–Ѓ+›еF"зSEмэЄB-(m—fдбЄ~‹™Чbm>‹вЊЪЉYГ&эDEƒSrє\š+eМФХB|t#к”йuРŠjco"Г™$ЗДнЌTS7Mгe<Ь*šЈрљ}е[dЅlЙ<Ъъ&eвŽяуuО‡гˆ8#ЭІ№\Ы ёDєiЦGќ†яQѓiQдh,B f!›D6t›ХЭ#-Zm§ъЩ“зoЗx1Џіm–†ˆ{~шУхТˆ|ЫGrЁЩi0jЄЈ€?BY—’ˆ.Щ&>8 PhЫPuUжhшќ-Ьis†РР`]љ5Ьуэf;,mіm0ъEЬiФJL-ВЃ(фЕ№Ч“$aСD§0Х1}‹С‰n[яЙ&%gЧђКВК.ѓ”;NBYќА7—?l —ЇЭahвЊхAЧi–&Iс/l„Wр еG1\rкжф ьбЛЛXOj‰юPC`’DШЅМТ‚(IЋЖЮ#Žd+w7kфњлыъ†y7 }S4;НЊiRlYTНЃˆћєNц)ЈkњSJ-"kй YCp9вOr‡ьИkуфpšл^E8 ЧXпвЈоёуа–о[dY^ЕЉк›fШВЗO ѕ№Lц ‘#,lBE яін~п•мГi0Žiг|Mзд„ѕъzщDЭљx€ДШ@Oјt>?œšВЬѓqd}ЉIІ2›t:Ж›m P&yQв”кКhФчЁяЛЖ -e)Ујёœ‘hu+иqw Qaуєїж}>їїg˜xSЗ=ЭuЎСЦЇъCm8v@5†/‡e#ч‚h€№УˆЛn€‡#Фи#DЄЁ%­4|4РЖLЫLY лУё_ЏRшЇ;СхiНн‰ОщЗчi‰$ѓ4Œ‹Мl?N &ЙkPTЙ:Qџ„(k8‹2o§v!љ%ŒКЉ(^вШггqh‘ёc2с Е-+ GЕќUд?љЖwk МЈЋ4Ю†ОŠТ,‰ђ,)№(Œь & ђ:Њb˜ТнЬPKHЇ‘єУы›Ер7ˆ7M?ЎЌфt@NDqјQFіQT7ƒšрЇрІЊМ]ouшЄ*Т0Њл"HŠ(Ъiжѓ ќ “ю:И&kгЖkбu€ъ1mq}Л––jNŠ>ŒёqO)ІŽВ„Ї ‹ЋЬЕ§ДŠРP&zЈ>o,ѓЯBЋЛЛЕЦр3HйfA’AI1hџ0Ауhж0ЎхЊjК5AЃ!њђZ”%sЇ=шч@Ќj ’tlсЩ>GВ,rпі“<В,Ош‡SЄ–'OduЛиЊ<‚‹3Ф(иHž2фрЂъї(HŽЪNФ<к6бi Ÿ­XЎ"ЊкђђЮАT_7‘ёњaфU”аŽ}Jт"‚Є9GаKcЫVŒ8b;Эю‡ВЙнШ~”)тAZЦq3š7иєУ™x%YЧHя›І€x<аuЧQз‚iвђvkЙКgљ™є8\‹‚Ї }к@рqЛ(и ЯVt˜ ѓЇZн-ЗВ„iтаBBчЈbФУсўў4Іqвtыv`ЫŽ‡д/›U‰Ђэ™Њї-ьgLјч‘ƒ ]FUъу A/Ь3OŒ$fбDУ•TaЕUМ<•VJl'Q”&e7жLˆФ№aе”)БІъ[ЈlMКЈaЩŠы[k qі<&#J/mSНЩсжžСВŒЋ;3NhыwЁЅ 4 юЦ]—g‹Ђ BЄ ђіˆšZОП!АЇгu[GО[Ф—\cГГlqЭ‘ХQщрЯ0†8o]ЄaФF™ЃyyШ=HAЇй†дЕ Z4vб2YЪƒ8SŽAvZpzd–ѓШёЦШа6…+‰ЊБНМVlг4де MМо‡ЃEї4!˜ЖŽuŠr>0=;зp“и‘ж ђ‰Цў ј‡с3Ч0(Hб Рœ9­ФэЉ†!ŠзIБц‹ЋэюэїH(ыеzu§ъ­pѕЪщЦU{OEНќдЇ—ЩfР"ІAЪхЅЧЬуSm!(ЂАнЉКИ‘>#Dіт.Т ц|"ОDБ ,ЏъpёзХтЭ‹›››ЗзWпНјіЭŸП Љ˜ъFж4&DŠ‘ЇkчэDн}Qay*^k є<хe IеххЭ%yрˆС6JСњ0n‘eРVћv:нќщЏп}ѓ—WЏ^О|ёѕз_=џђЯ^†(ЛQhHMš>@єцkK›ЛЅУTЭЭсZtМ`ЪuEб”ээЭZЗœШ^-жКƒв/;ѓ :q MХЖЎ›К.­Яž_<ћъЋ/ПМž^<џтUи6Mƒ4ol‰ьAhЈдGЩ,о\‰ОЇ9Y ^нJЦЃЬБRй.ov ЩAPŒ1†JhВEНWUљцO_|ёєтщž^\рљттйuЁ[<Нfмт€OЂцJпбФхт(vO<6ѓa­y,Œ“і№О˜нSuHЎVхyžќђљРуйХГЇЯžО0@žѓ ФЕЉIюО?iЗUјщsхъF\ыI>ъEђd"КІe3Д№+кhqЅi–чЪ7ЯЁщ/.ž=УгХ—7I…п6-йHuƒХ’фMUууРиЌЖkкрс“_Нј‚ю‚ˆdE^v-"йЧшcјЇ­В4KsЖxљѕŸџјœ4§ќйѓoдВHгNŠ€иРА‘eZš—ф(_|лR–Ук=т`6СА§8гKЪЌ™ЧESБе ЯЁыд7ыЛ7џўo/^Оњіе’UežеэИхо’аt1`(=5YЧI?вuЯ_CГ9w\цБŸіяЗœщb„ЎыЊ$ Щbю{цнbЇ*ŠъЄT™u2Sѕл мВ MзГЋ@’>nhшЇAї}UcIцКqоМW5Bё#‡ащБwЅЭmЭ™џ •8Џ";ЏlKЄЌћфM‚qю}ЬЬоіФ}ƒВѓѓг йŽ%Ч6-‚R*ЕЯ—UФЂбѓLOwOwo39шМaz#ТL†Тn љАШСјѕвЌыP]д™эшlЋїC‰ЈFшщŠКv†y#єр@гƒMъ„LAЙqІ˜Р$‚ш=6уN„-ЛYиыBLЁ‹Mpдoэ ”CіЕ%[‘ДоlŒ‡nЧ&Dc8Уn7Œв$IRЬЦ = kбGfфЃ6ьY[­7Јg~ЖB&|}ъYRЇ"oюл&єL‹x‘€д †qдM“.(“Œ*6™&0§Pi‹дw‚ињ<LПBQx*’pВo€г9}ŸЎщуЁ˜ ;ЂїфЕ'Њ>Ы{yŠBЗ#ўшМ­;†љўэз/§ТMŠУq8­‹|Cф$юvё С[ў/h‘в}<:‡‰ќіщqSдЉщlЫyўф”ЃЫћ-KsАз9О8Ц ~М!ФŸ‘g`ё№Ђ&agŸVыMNН­Т”kСFЏz4ьхI–')hDGљhG’œьѕ_PЙЂ˜ЮfЃЭ‘ŠFЕ‡šFѕІѓLЧF†_Zж_сm2ЁCМИъ!Б ,hUІ]јоvНhыo›џd jМŸЯ“ќНл\€ІiО\vЬ4ќ$џ’,ўVК:ЮёШSQ€Ёл—Ђ~QэH рLўй+yџ Ќ‡щи‰ш5gшп ŽDF’$ Ј~G’~i9?„1š‚аx+&Џ—ЃбРџЫ’ Г №”7ьўпЁєйŒ^ЖQ/†pЈ 3рœСКˆДW 3ІXо­О6њяƒЁГ‡vќЙ!оovбIЪ6ћ1 йЙКск•НћЛˆ§ѓюм§fя”S4љ =ŸТ)Ў\бIAn†DW$пјw=чИтнЮу{|{їЮ;џёЭю‰Lе”ЯдаlЗћ{_ѕеWџzчлЇ'ечoьЩxsgлЫ7YdЯ~>ez…њьміЛђѓнНћїюўуЮзп|ћh_$„aaHѓsШм‘dTyіэз Вo~Иш>FVo Сњt—QбHы/бСљю ЕC§ѕююНoю~}яўƒЧЏ/u,65)[u›$љїћЏO*Ы“§—юнН{їЋљЗн /ы:оЉ(ѕ—{пнћчю^ацг2˜іњУ>Іšњ?oI0t`Ћ‘0ЉєтС[…9єјсїп~їр‡'OžП:Т йLЂ‹ЊэmГМэћcNQUIlд.і_О|~џоНч-Y%ts_Џ^О}Оћн§G{ЕГуŽ1Ё‹Щ„>:M i№W7‡с `ЇЯО” Ўь~џ№е›§§§Уƒ§ІFь$5‰*Ч1Дъ›ЇOЊл ј ЩААаT+rэцЩыgoZšN Ћ#ˆ\;xўhяM[хvv.УЭЅ,жlb”Mjнд^až=БїŒ7,ЃњУЃ§ЪсбщљйЩЋКJќ~ЬTI"ІMхNНVчEEњ_{РўЮ‰хFwŒjjЋrpабu–K[ЉX=z§ЊІ3ёxgчyгУ ЧMž ŽˆuбіъїюНlFšЏ_П=Љ5šЕуŽЮЂQD5QІЖGQ‘U\Ц›†aXђДL|лdКІ‰\Нвб5Н8ыК–ЉЗЯЮ˜яhе‡ЯЋ4l. ‘&˜wъѕрpIЌ{{ОlыŒ 'Ї'ћ‡M^‚neC‡*МBНФа0MЂc}­eнlWbуUвO]ьљ5U–EQбtУNEшTК8Й MaI?|rМcl*v/Цl#X’$іѕаѓюЏZЬ lЎКџіЂ%Рƒ‰ƒм ГЛЛїєѕ‰`И~РЊoЮMзTU#V6ђ˜офˆн›цЁчcјkzУЊѕ–хКA6]MК6‘AС^“iŠJ™?˜dŽХwrTЙ)ž'/оьшчџъэў№тЄжб˜&kтёлцІ~™1'їL&5dцгQ/K0KD4oд а4]лЯЇЫqdˆVжл~шлLS †умƒ­(UЯNЯxЕнЉэПџиЫŸѓшщлšЈPвЌ6+ЏŽ$ƒasLœF!Ѕ|G7“хz=ы…XgiйЛaХ)sм ŸП[Є–А§(ЭгШ&:1“ё(ѓ-ƒ*­‹jЅе9„?–„ъћO=џј1oOк\C‘jЕкСГХ0l7ЭЃIFК-RwАZЯ—aЛСBЂ›Њ€JКУѕ?MтРѓБж MBь;Nw<F.аCсZэZѕт ќ1/џмдїфуЧT[œX?jЖ/чћ/+@.+РRЂQ@(ьgыEnыbЛЭ `ёn(ѓГНtМXЌ–›хё|:ъ=Ь{ {ОiPЬЋаЌžСсВУ§тeўNгU+oЯ.›ЕгггšЄ#,f‹EыWk(,_.f1UЅvЋгц%хІ§ЌдђbŒя†уйњjЕ~ЗgQ˜ ЇѓХ|œ:ЦІMV„њщ1ŠіK[№сЧir|ЋВXoŸŸ]6.9`Zи_,ЇpАДЮ:К?]ЭЇ‰ET‘кѕJ а] EАkЦЫЋwяНШГ7ZšКи% `џфЦљщo?ѕ;Ё+;ѕњхёYЇ]ЉёB‹WЉсїg3`‡жК”Эl6ЃйTзеmd"jlї1-Џл_^­=0и@Шщbої(;(jDWЙzѕЗŸzћёcwNЋѓ†мМр4™уЗюp6ю{DdЃ;™ Ћй Рzmє:ЫІНi+k—яжУЎMЉКžїlPŒ,Ъи›#u>№уЋ?х`чLыœxY“t™ч€дЮ`ОС 7™ЌfгЋѕj6юEЎi’-DU™иNH˜щЧгwяІЉЊvгщВgЮТ@h‘ћРЃќ]ёдсN‹(M…ЋЖU]•x4=РšеїA#лшЙ іv›aСJ^]MѓРq‚bКœLтˆРйўЋК4X‡vЕ.еЊВ†›“Љ?ФЦ‘98руХђj5ХсA![ШЋ X5žуE™˜n8X]­Ц9D#уй|ž™ŠvРаЉvнSi ЇŠRЃ/žgУЌ†Q>Y.Š`гЦхXЖБMЫІE5ОQotTУёГбbНšf“ЩbA<д`њubЄѓVsџ\в4АэЂfф 38LЇf0˜ƒCfPŠ•–Б…‹л2еNуВ.PˆaВСlЕZ-'НД/F6ДlnŠЏёЄVЇњњH€нЁЪѓA„•dК–уа€ŽbУрVZŠ Чu-"ЕъœnИУщr9‰m7žЬ‡qр‡шзљІvЋњvŸУ Љ4žЏ=›j‚LНŒ_ђ+В,‰Якј4Pћ Ю#‹^Oгœ$Uк&™ћ“й|9ЯpД†е+Zр8"mQhйёlіеФf­оlД%Э ‡р”Qёвhв‡0PЛ^єЌj б`v˜aљцbвЅDеНЩOЫ œ=хNGмZvЬpР†:†ж8;:<<>ЋЕ5ЦчЗР\7O!+m…NŒЗ^НйШХ–Дh~5іq­d"ђ-I-a–аа:•“уЃЃƒ§Уг6ёГ gўP'/CЛІ™Ф– ЫbЛHЩ, ™у”˜І›SАnКщan)6№lїм­ )ЖFиnЧуТWGжЖ‡џ§@УДь0ЯБŽКйl§n о’ŽЅ~[ЁQє—,'юїК8Т*AЗ§Bq`Тj†ЃХ|5л$Щ­•jшѕЧihШЮOљД/b–г Бмb6/V…gп4}їЇиф#AU§фW'UЬ№ТоИŸї'#ˆgoЕnŒ€Ў]›СЁv“ЇАMHh‡ižuЛљ0ѓМ[ўђР–БЬ›+{†mчda’јў-ŽB€дл(љТi,ІэA„сћЛ…~> Т[жr‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%J”(QЂD‰%JќП'ЉЊіGгŒyчЫЖЗ1WzkPLgˆzјVкпЯ зБ |#6#”h5ˆјѓ@І8евBрPxIљp,Ї2ЫЄ:1 Чq}ЧІЪ_ }О}Ј&О!Хі{­sqqйъ€ЬРзБйчzх–LбYткэVЋнтdКy‹iЙ~‡Hgl3рTN7іЈІi„Ш’Феjеjэ’г Џ­ѓsМУv‡šЬ—ЊrѕfЃ^oЗ:Ч ЂЌЈдіЃ$ A`HкfлfX„TBюk\Г~qrrrvQk+ЬВ]Ыђ=Яs“neLіŸ@4q\#ОЄЃv:kЖыЕЫz‹W4Uг™ФqаP щ*™v ŸЫѓ,MИfЃбrШ• [СЦчню+5UлД€„ЋŸ_дл’аК8Ћu$j:.к/JcпbZЇ%тhј Б!љiфz@]hТФЙлІi2ЊЪЧОуXIЧ4,ы_ŒGmОп&эЪE­)Шš&Е/›œ у4ј №]7ŒЛ‘­ђmN1`‹ri’§`– ё]+8ЩCŠxA$2š7ЙСЈШЫн†.xƒ€Eіz8ЅБgщOYгС ’Ua•ј( ˜Г0Ъђ$DR4лЧплЊЊк:ар‰yіЃЎ™І qј $ˆGYV0•еІ <ъ–FяЦЮђ~ЂюZEыДИ#OЇs=ЅSЃ/)b"Є‘ќДŒDf Э„Щ‹ЂЌRd`иџъHŠџћXРсЙ0Ўї"d2(Ђ}иЕ€ДУYжнѕЅ@#\–4–Qhк6е­Љ­х•–Дјз-xnS$,0кЁd)0‚й7л2Mв< ШCў/ сљЇ‡Ђ+Ш?№ќ8Yо€Ќ@a›Њ јTЅд"шu]D–ІЁ ’5`К™jФ›Ї‰ HA,Щ)Mbј‘ˆЪ‡Ч,BKL…kXžЗŸє` ‚’ж5DAЩЗ}xмж )pTм 'а`Ў EЛЪp =TЭzШbшєК]lъюd7uBф‰ ЁA#ТБACѕ.wН$ cпX›ЅьѕŠСШBlD"Egи>>ь6MQqwkIQ6-0ЃPšд… z6~†Ё‹No1ПЁ3"…фј:XP$žхnж–Ў 1“„жR‰cUcЄр'y]—эnлTE^ˆ ђhжAœ–]ЛЃ.ба Є%‰Œ`“TŽЂРВ >ˆlv€ ЖЎ2 :§Нyц™ЫL“‡!—$пнЧИІƒvбE7%zћаYVФ”АОш’qІНЁšЌъ<і!;?eТ3€˜Н Фщ€^P‡Ш’m›u:”гУы#Ÿ­Oе5„ЖД‚zмSгиZеђНАЈ€БmrЈШ„дЛYєІB”а%J3ЇйБ +ƒ&4ЂЯXQQWmзe>ˆЇ‰§nИЪ.Ў >Э„Ў3-eŽ\пУУїi$@ 8jЅ)D„цшGднВ'(ˆ3ѕЦьŠ ЪGћsУ(0dцХБ…s„†бчїіАцЄ)ЊЌЂКѓLxNX'Ёы иž№l_Ф9šјюI х Zœ г-Ž1Ј7Liтqг PЏI…ряТ`dроэИ–ЄЎЫVЖуэ=иZQUп‹ŠдЗ,Q!eнj žš‡IQoўNv5AЮвШeыхšг>Z(ЅUGKГ…šцx7%JyїиІQу;кбX\„њJ…№Eяuіё({}НRUЈВЌŽ(cŽњсІC+3a\ЂiLOнaЮб[Tјѓл…І`?ДfƒўдЪ9ykв ‚4SЯрqM\АР5U? E6]OW\Ў\YЏжTA˜†fЁcљЁ­;Є^R4;т1ъч C(7{ЙWуѓ+™„7ќ97GП}ќв›љ4ž„ŽЁцДЩ}ЫГm" щкN–yњJЖ=]Жн}tDY•%Э #сЉЊ$ОСg‚ИшЫ зњaGм:,‹RАЩBU—зŸF4їЫDRO?ќrйкY–шœ$ ЛЄр*Mг БGм„cЯИОœ™žІиЮlќѕ’ZZ/ifš‰Ўл№m7єLјDАI^nКжМ%ŸŠ@W ›ЌL[›\оM—г-6=џэњю~8Дђ<ЋšП д.ЉC†ЅлО—F3УФбч#=А˜kf_OдВ̘ъvLK[šƒоmpЗ§X@USvlmз ЋмZ(ЖЅLћ§лС =IОПМžL'ГБ]фiеЮtO –ŠЎZжjМВdГcI УD€ТЌюКž@ЃOCухщт]ЏЪ[­fѓЩѕЇЋ›їПй%\:8-ƒU$С’@k3дЉаы@№еxэюmс 6гЇ§™х›ЎЋЎЦ(ГР Knтiъ.-oхЙіўЫЭЇOНћўрњІїўХЋзgWaYW9€зШkZ€ьLCТ”х№fх9ЊФ…ЛILпыэЙХjzw;Г\Ы5Ц7їДЗдR6“ЯІ5ЊшфtnМљюьєелїпМ~}rtttи‹hн ?КМю%Ш– ,G_tnЫVф+Ѓб|Н‡iСџЙaщІzћљ~eа:~Ž~Мэж>Z*B‚ ЗЫЯOONŽŸ^ њ]’1nš‰Т*K  y1˜Ц’yў7p6гйt<юѕ 5<ˆZ2Д 4^Qц йѓй‹Уg‡G‡Прa>>:@‹Ч aЦyеmеw“ЇI† A5Žo‹ц…Јяoqыv.MЮЯћЃ,i В–МQsPФQ$2їЫс}і ё>:<9|­фI€hSИQАДЦ“FBЄ‰Cg9˜яM8АhžхO‰nйœnœ$Иш`МNрбŠ ­Ї"q2yytє A>DЄ.м, Л щV-Ы'а1NЮX„œЉІ2s<нLќo„љР€г Ђ(y”FYћАщђ“ bžNE,Rvёцьф xНœDЉ€/‡“M  !Й' ;l' Cюћњ”С}Лщ[sfЙšщІ5[К7Q—!„аr:КО<џ№ќјх›7oоѕX‚TЯщшвЄW—M“yЬ2dИ€а`oІњўyу‡ъР/ЏM'Œ™%ЪMg[ЈзQNД"ŠИЁiг/Ÿя'“ЩBŽ—!/!Ћhн?/г$LuКf44їОхœСюЎЌс›Њ—ˆќaгtbšфtбE:ю^piiyžб%IVцДPvЊE„*єMi8д"яЛьS‘дЕјы9‹„уWдZtCз>CvКŸ№мOгla ёQ>ѕ*ZаŒэEPЗіјrbњоwкХg:ƒ30l/л<-Уt†Ѕ0“iiZяGc§_№RюњHFwЬsJц'фEъєGCќУAw7сmЉё‘Ž#и9FސPJcК'K ПЭžАџпa‡m‚(HЫбB5pё‘>}ž‘œЊыќG§уЁK.LTMn<ы43Њ0ЮВИŸвƒVХђ" ~4а?іl“яЂ[ѓ]ŠпкŽАг~АЌ›щ“ЇЇЇpaЇ/рЮЮ^,–‹Х?џОХСз7ZP]vtт3]ŒjˆiŒоRи I“???=;9~~vќьјеЋїWSEU•ѕїB=™Nю?§ђѓ_ўђ'Џяlћv”nЛ[”е:&аD|`О„ гхd™НЯŸŸœ=?ќхјхЫН™Ђi†ЁШпхsRfзNўѓЇŸџzzmИгžГkiс‹2Џyw,ЇшЌЈНЫХѕoNOчУ“зяп]Œзєж[WWƒў|Ÿoxіщціv<ПК…ыћыЯ?§ћП§tж›-dMSuMП==9:НДхќ мVO™ШхR!‚і(?RjюєыЭ NNЯ^>?{ћљќгХL5,?Ж5]– wŸcв_н­hьМЂHу‹}}іќуp))КбНChz§ёэ›W—<Е/œmS‘ŒЋIюЇфБаZ„ Є,мЫsзŸNO_xїстЖпыД“ŽЊЎXec|ўўЭљ`ЉrЙЖ8ь7mд^ЮГСеХЭŒоРЫ2 yxwёыЏз<ёњУN€nв’ EЙШЪ*Kв„R“яквЎ_<qqйŸЭћН‰ЦxQXš"Љ6ЗДХшўv&kЪj%}eЎ L7Шѓ8шv;š†Жн/uоqу;гgw§ЋЯC?іЇяV)эž еѕŠ`g$’ (г,ЋSщул_˜aБћWoЯЏЎ+iЕМщ+КПЩ U’4ЫчъJ’W’Т˜eZжWщЊЁьz‚8Lјнћ* eи[2Э Г<ёmг”яnяzѓ( –ЇПЩ)э jк*Quт )’Їei\œœОhƒ?]м\^OхЕВ U#иІЎdf w-ЩŠЂа-лу_ЅД ‹GYНнmыиЃw2щыaoІ3цem-\“iƒѓоMпŽљрфьрРЫыЇ-zmлmџ@~гЪ’}ћђффљТTmqsёх~!Љš:ЫFдИКК” Зˆt•ЖДzДЋкѓОfЙiс:^R5лЧЧ*rXІЪГсt­3GДЛœ[ܘŸŸџН+QnмHВќ–БНžй9lїИ/ЕD Gц‘цёИšмЎњнсАЛМ3\Еe–У7YЇЎC ˆDЏл7#щBп/ЄёЭшцav ieЙа,Ъ3I}ь˜АŽцtl]{9~XРхjЭŸ%Дт<М"тЌ^яЇЧЧгхўюx:tЮ) Hˆ>Й§MџэђsʘJубэLК“mG_h6 ŠЭiпD“d'кСеj.хЅ5СђY"œ р4uНИоœоП?nКfЕ;  @Ё-ъP[ŸEшW—ŸГ9 -нIКЩDšо5ОcЪ&ЏЧѓЎфЬЖ Uўј ћ,Ш {"СElцE œїЧJПnw:o А]е ј'2тбЧЛ”?--Qгу‡ЛЅeCRM›цћУО с~Н?л*іСšБщЙxЋк„S“ё‚ЈwяЯЛЂiЗ<фРЫ*f ЧБДйhђё \~омЭЈ<’$ЭFЁ—qђУщаWq˜Ж‡Ч}идPGz…—/?H2p]^ЪЊ}ЧѓО+ђВні3'3“bO$БДљЏ˜Ч‡Л§ъж(­бƒ47 ьДT,жx`ф№žr>vы:>ЛB-pЗЉ,—Ы… Й;,wЇu]эюpЌ]s&˜и6$ю §П(бb4ОŸ[Ђ[U,З=ь чѓуућг*Д<‰BPѕГ§pЄ;ЎЅЋЫ™$MdHƒйBvпДынўМD5зѕ@fВѕјЃј№rтіNZМнпЮ-гUЋŠtћнсt:ьі‡ѓћЧ])Рсљх0№ѓŸЅBI§ЦГ1ŠР8 Їƒљэр“Р"K№|‚`ў†zІгщшЭшнЋ9Gt]#Щд|XеPЛoЧЯH]иџ54 й*ЊJw7їŠэ"}S<Ÿёоnь>ƒ/ХШoQU›BšT ›)M“U2і]ТžoŽл„ЫЅAаxЎёЦиsLѕљƒ$[Ьї№'V›ѕцбпЗBйѕЁбQ_}7Ж№Є/#_‡ueІ—іЧ-аБЩxІЈКv•чзuШ}fjи[Ы<ŸЇр…рщM8lККШ#rЬЎ$оўpc8‹€КTћѓљXyвіx^‡дšннOf‹ч%№џ‚ю‡Q юSSе Ю‹ Š‚*+!Џƒиeћ)Сu1zxѓŠbл тЂ?œЅчи$щOчNP[ŽЧˆ}ЉY%i@He|ZЈYŒ7ћMFРYлUљФyЪРХh*нЬ c"ЉЛэўxоІРЧНњlƒ…-Ѕ‡™l˜WyЃ‹0L lƒ‚P™ŒяюnЇPбѕ@й9„’§~]ъ“.5™чдё“ЊУО—§ZJХњtо$ЎЫLy:WMЦьЋH ХKGъZ§ўЧ?ќ№jсэБOy–,]лxкI3iaл"+ЋЂ\эіm…PЖЎіЂœBat•ƒ›@є„ѓ№ШђцЛ?џћ_ОП5Yv8`ЮхІЯf?ёžЮГЅaРuƒ пB­БЃ:Нп'XхcЧ„i—]чх"vІC4ІЦRП{§ђх[`Р§Ё/CЯеК œЇv.Э N `+AЗ-<Ъxw~Пй%ч`;,wЏЃщ‘ъxA€ќT3!NшЫ‰ь№юД-#КQSs["3›kВŠэIjжlSIŸ:е!№_ЦY‹Ћ6•Mзšз.Е,‚ІѓAЯJNЌ' ­X*˜-Хч'kWŒAtчŸ>ЌёY|ЛйДIpЕ~UЈЪЖж І#№ќtБн7˜TK@ш'[Ё-ЋБž›vАъИчћQwњх—Чѓ~З‡bnп†ЯzрёOаxcTt§fнiVѕЧuъƒЪm%огiЛ3i&фVе"ёf…нйц§/?язw‡mdцz2tŠЇxћнўtФvянq“y”Эєтшs^h^vM&ѕЋM…C'ђнOПМobхUSgе9Ф‡\R7иЦ„ЧЎђˆi@тiєй!jbR­V‰яКМмŸЉ‹-a(МыОб5 ьгK‘хѕuz6ˆуЦёч]а™ыg+OW‡Уу–;ЖEqІТЕчЉіFiНnP404/Œ~Gћ PEQЖxt\Ўwыу^0C5‰ЫЎ?nЧ"ŒSЂ|ž7UфXPLџo‡o.ђ<єžЕ}WѕЛЬ#К2њrgАlЦмЈ(…m9„И~№{Œgta;ЂеыU‘•лѕUк=?“0žцxzŸBmє;/B/­ŸAж6E†э&ч_Vj2ьIweЯј”куI‰2‹Є­Ѓ№ЫЙ1№)u№м™އэуќ2 {ЊОАа8VHУГ/уƒМЮ”AО~ЙУгW8Т ^џ_‹2`Р€ 0`Р€ 0`Р€ 0`Р€ 0`Р€ 0`Р€ 0`Р€ 0`Р€ 0`Р€џ!ы–M]/ ЊЈЊВ,/—Ыљќ:3KЏ0—с8= n§ѓNЪgвЛ>ќ‚ћ/[…јihЖуPзЧ‰“”њžmўЯсyУЁ~дх<<№˜ёќщЯЧrЉФч‡Ц"№ХbџhВхтPv.Ѓ–nъšІ(†Ё>qІш—‚lтf?Qš…Ў%/џaєцr$S‘$ЁwТѓ<[™OЊЊпщ’Н­ЬчВЉLqЎє Фf<є<‘d54Эсџ9 ‹8KХMѓШc.5хщј~Љi:Уй\xз5їы€`aС}жфљ|2пOeƒxЃž/тк`.{Б\ъiŠ›ЧЃїS]<ŒЧу™I™Я…рјлWšqћл0ˆC)uKW3 ФИ—ЄЙGн J„KЈч}˜цNfђ*$ІЎ+KщіэЛw7wуЉf{"Œу-ћюU†dџ4цсX­Рsty*ЭfгЩјіццaЁсЦ€ Œ“аsю_ю<>ЫKЊІЎ.'ївtёZ3ъx"a’Сwtœп=РюЉ Ч›ŠРБ”™4Ы #MцB\ци$HВTјмУKЃ‘т3ЗЬ‰э{`“™b@x$n”C\\‚ЅИћЅўЂЛ?=x<Š|b(ВjX ОX@О›Ы6HС]WЄeтћіBEc}ЅшЄШAяжrv+) |ЅNIMв8MУуŽŠ/8т/р8G–3УДM‚!с2РWХD­л юИDe qoЊaђ{1VєTO УT'sˆa$ є100:™qA/\ЧЙ}!јE={†j3œ™чљОOuеДlC7@qEI{к\1)ѕы{­_r0 MSсџQ(|ЯƒПфвQ”фI’фn4xц —_…ƒ“–CœыM шz!иRu0йAўfОHђ,јRд5qЕˆm™aщаСхFŒњ8R>ИЬщaХYž^ЄNCяy ~>!3hV„ОJОЌ№у”3si0lмM#-2юРy4§nF]"ђ4їM“њ8—BЮ:!ц%—нЭИ9ЩŠXїKА) иЦ —‚a€Ю8c<бІB\м 3Е ƒ_9Ж>ndјQYІЬАq+d”ЄРЁЭИ~А,В7t•U ‡|ў(кп!ƒABG у( (a@8=мЕф:” ЩFE!<п%d>^.TJ ы6ѓСe1А4eЙъзыw”ЏЛКљА:НmВ8MТ(ИКYc€ŽРїыИd1 CvpЭФК‹ІЉІYQІ"6$IвІЁщnжT:UЖыОяњнЎпьіл~Гнр–ђКjWЋ&Iѓ$Ў­jLч ЃЙШp#H BpЇ0Ц$шCJqќЌЈъ< ˜oмH&ЅЖeш4ЊЛ4)›nНнЎЛеўеуВЙ~Ппэw›ЎiVЋЎ€˜ХтКЉ‘уЯфХ` ѓшB В"ƒ!.Г>сЅU]„Р›ѕХ;\AjИ>ѓ“ЖkК~ГйЌ;\s[”]пцyгtИ*`пЗ шЛ‰CзƒyЭ‘й&”JPx„IЬ§Œ?ЭВз5Жmе4ežEтЂѕМЉ3зЖi2](ŠЊ@„yvБYзDхByœУнHšЊщ7‡у~ї krсЙРmУыYˆ |Y\ЊG`С!pэy Уm^сЧІХ%ЬiYжmBLTІŠ2_Ъ IR]Ÿ—…ѕЋ2УKxЙѓTdiRЕлУЎЧВM•x8>JТk MW№7ЕУ'B|-pЯr‡†Йъ/і .еїы‹ј@\WWдХt6_LЄ…ЊЈ^ПЖY5U{d№(цqsOdqЕою›,‡ ’CЄDЧўЌaчŸš€2ШКНp--n†оє=8Tз­.вЏ.a ЂA•q[3M`кГХI‰t7wЂzгoњU&>$RsiœFЎ›„qйьЖhОJюмщxЅ™НюDJЉтjw‘ФХVИНЉ[Œ ыvеЎъиžч@ћцKi•"н/ьЈСрмЗUƒup\jхBШ П'IЕo…ыCР‹‡9šЎуŒ”y p‚Ыя Д§n˜Фuтy_%Џ.ЖвvmWЧцXвMУіdУ'в\ЭzsЙ-r ,B}‘…žЯ €СщгžЗ1t rзUF ЋЬKBd+/лй7лэfн М)0Ы8IгМ,jT|‹[АAг Y+длдБЁš4,_ŒgзЗEФу{€_ј`v^Вю ŒжšKЕ \Chг&\ЄYZ\Жw"ъ2-Њ$ŽС;#ф—ј?ІgдuтЈqёi’KmB(pWSДИИtНйtU&\ UђХ JCњ<(ъОŸЫЃиSUімСжїЭpWj .иР'ge@ђŒai^_" ќгuЇPmhо%г‰W§  8cWBZоТфе$@нИ,}b2ЎО WY"ƒУCЎ СсК*oћи/Я№%ѓIœй\DТнЕLRЄ‚ШG Ду"jГХћ]Џ*HKLгаІЁHcпЕYœ–‘Љ)@qCkjэ}Оа !M‡1Ф”‡M—Х"Hb№!W$Р;тДъ0с!љщpџkё<<ђФ]isлШ’дЏиїa,Щ:mнЂ$’Ђ(ё&Aмї}ƒ xъђЬяп,h^ФлѕФЮ!ЇІa.ВГ2ЋбˆVЦ„л€X+:В ёŒ j0 nЪ€ДBˆЎt§#Žь ќnкІ;M(щђœ:}V‰ *9јM"b@А@gхСЧХ Єr_хtbœjкšЈлnш№’iEK•Ц–чщFћ“KдщК>Њ ЪGЎeкОeЪК‡љdyq:Ѕ<­t=J[ъЋc:LВ›њwІчˆ9'•й^-sм=%š’~ЌѓŠ јKŒ IнjіШj0ˆК CСœ!Iэ{Ж*й6‰~?-С p”1УФЮБ’ЊiдфUTХ‚ЌšL J№-мtєуд'Сxъ_фЊ’юDБ-`ђxі`h`Л4АІ,QькšZ† Јšщќ­ˆ9Ѕеї- \Ї•ЭEб=Шћъъ-еХŒЮ CРŽя–jQv:мxЩ6G#3ќ‡‹BсирˆР$#lUqS5е ›˜е‘hšNRјО(rсEдBjЩPЯГиДс ІtЈ7iЊхjН†•е™*эыYхШьˆГL†Б?B|ЈКТ‹<_4'†Ла|з1=QŽНИX–“NъNQЮ#GeЛїœsf”іQcCСгœTжŒ”ќJ:К!уюLл -Sдќ41иіШВGŒЅŽоjQUA`;‘M0™dжр)ŸФH:_ЃB–1ч“4N]ЎпИ:ЎI:ъJЙvд­жЋMЩЇ3—Ы\гЋЧUЋЃ*Џ[`"KSœ$4иVW3Gc•оЏ>U1 ІMCр4(`C6лр5АJ[ [a?LВ$1{­AЛvќЕ-аyЊТЕЊ7Wч•‹Ї@vA‚v |јР%qЊm‚Ъ5С =ыw$“Хє~ѕСJ"&y`JМLЧ№* д‚ЩiЁч:nСž.ЪбСxi’Y?lœ\ДYQ%ЎUЛmTЮOявTtx:ѕzНLрОнР–ef`щМ†2ЄŽ:’-|L—‘Э6}•‹Z8x”(vЂ ОvќИXЏIЈвєSD=ё™ЁЪпŸWл є)лkїj—'ЗNіfЮрo`gзЋ 7ŒВi mˆŠљ 2m в‡ъИ!Ššmx\ЛЯŠn`ЩŠe™ŠМ˜^ЭP+–KШŒiЇ‘4RЅћгJЃ3Фƒ–DYсњэЫУF0™PQ,‚TЏ "РrQuLЯQ]щc+ЪЧ-H*˜‰m12еYХ‚ fEпA‘іт9AzQъŽY1СФ4‡‚ђPЉvxY–Ре†Ц [Їћэ(Э0W‹‚\YйІIРђ`žGхrU / еў=o*:ѓ!A32dЛЫv9н }ј|ЯR‡Ђ‰Zю9UИХ’Њ8-Я’4рћЃFН5Єгд5Эа…^ЋКџUˆ“|^bz^žFНZЎNЪuдWAік˜Гќ№5х$^9Dн4|i8ЦDД Х QщќР‰ІаxоЫR. №Ч}хъЎЧ№Š*ЃОHЃ‡жйц'3№bЉѕ3ОПœИdщ ЧЋV 1#еђ МёqЭuйT]ƒщuп‚)‘јўZЖHЏmЪL!1вИПzON\РНVЇ}јЙŸРESи›Ђ41wbЛ–Фr ЎjŠЌьDЖ0ѕ?tтщC:)‡э 3S  )f7Ѕn"AšК p5FYЎ5z§^Џ7ь^UNЗŽ”ЌД—3њвlEbw@Zе~tЯЖЩѓFh‹ƒБјЫŠ#I˜!ЃЛ(4LГечPoшt2JrЉ’ЉЉ0}k(˜ЇћgЧ'WѕЋ‹‹JeosчѓЇ+tGнб’cзєнIROšЙm1Њ%2JрIуџЛ…снЃ?BбхyЉsлсЪХй‰&/В VЬђМ@O'юхжЮіч§ННннЭЭэ­­Лњt:+RаL‹œкщY8ЖцPх†FыП{„яŸcYзК­о}s ˜ЖэщuйeFq4щ$N§кжцOŸЖ6З№цЇ-}’ФM!г‚`=Ы/№“ID‹\BЃй{СgиpZгwCRх‡ЋкC_ДЩЇˆzA=ђшгЗ у эo~њДЙљ ПЖhьєЂ( УŒ€г,/шЙdЁ GAaаk6*L kpu4ЧѕъѕОЈpiИ`J%МШЩц“<‹‚ ЬЌѓOл3вМЕyШ'>Г"ј*уМˆtL?/ рZс˜ъРS8л§›–@‡›ЎяЁmИ‘L‹‚‚F(PyY‚ “шўѓцpAyооўМuыРРŠeн’=Ÿњ lЗуУ9№эŽ ђw-л5Q%‰cыvш™VJK˜ƒ”B<j•wЖЛ L#bфњгn'Hp+HsgФ|9v‘9šЦrІbx–к§Іъ|ЬљЦП9Fšх@5щZЈК›‘W—Эњ5Ё†dр0ѕѓ““§­­]0ШоDMЪ ‰Іs,sBv E0ї\Ÿa%ЯT jУ?~pш_p.*:dŽ`ЧQЖZќЛВdHvJk™O]ѕцёбѕннm[ђ"D‡8EЉЇ [фJS„Ј[ЗлUЄПїœAS…vrxЦ'X,~э‰QЊ4-Ф& _яЖESз]šœQIy-LЉЃ“ћшfZ“g§љCCџЪ`$ЄЇ=†'еМВч1ГЖˆ:ІQb лДТ8JPŠ•­Œ4UйyЭIЁ~uЧШЃF7jйTzšчЪZ'хвUAЬІІ{˜$Qš„ўЎф Zќž@NхЄЈЉѓ>CGвMјSј№Ъ§џ ^сKdШеRВoФ7A„Q—S& *IЇe‚ЩЙL!5оДŒ є~ 6ў=†PЋ #ЋйVѓ”j"ј 5}Ÿ~І…Ш dгŠэl[ŠшИ‚ъhЊk+?vG$3щŽfŽoЭљbJ‰.H|PМˆ0A–ЫIHuдQvЏg‹b>QО/z2Мgџ jуїgХСљ­Л(HžЇД(š&I ƒ“<Ј3IЈFе_,gЦ]Kі [фYщ#—•џьˆдBШ!/Ј?J;:q’˜3|$ДC‚‚ž/gЋ s=4йzпјэЫ?nЈФ `ЗpIeeЦпŠ7§YJ<€c6cЯkьи?јF2Ѕf?)д9ЭHee$лHД=-ЫвGLaO‹€9ййо=?Ѓйо=8<>ЛМОkЎїZf ЛJА˜ЂiЩM)ЃH&гЉ;ЈŸэяœlm~оџrttzYmіЦ<ЯБнfЗзkзЯЖк:Н>яEЎhNчФрЖtR уБ$„f*2ˆ&+цnыW‡;‡Ч{л;ћ‡GЧ'—эє•xюGШІжˆсEI=\§ќiїєКF"-ЇЅЛEОg:єТ_ЉE†\@nn\нWП~>јКПГwptzvrг№ВfвЧ;­!ЯŽЦь]Ѓо8лќяџњзO;ЧЗC^ 7EDЖ[?ћВ\i;Ёо5VTЇdИёGњ!9Y*‹IFHtoуІг8њ|pttx№хЂVЛЊѕyYїh%‘0Њ!Ж>.hA7Mн”e ЏrvvYЉTл,/**эцр†ї•Г‹Ыз7FљrRѓв BЄЦYЉDP‘щiЎ]lдлЭ“Я;_OЮŽЯъюнэHжЌdъ)"Н‘a™мэѕEЕЧŽ‡НwО|дW,/ <зЕun0f˜AЛ5р…6чjВФѕnЏЎЎюнРiе­љЄєкД§†S2)ЃFьI8™E/Эжнљоіз‹ѓг›ю˜uЦ’ъф…Ѓˆ,Џ–! ћэ‘"#ЊЮП ц‚щјёd’DОM]rCу‡Œ j^и†Іˆ§zЕ^kъžн?ыІЄєi3BFк)ЁyX ЄШ”‹ЃцнэхсюёељM›сz'FЖѓ‰Ѕ№ДЗке^рDYе,лё ѕ&Œ—tЫOЇЫљ4rmг0,KŒeйLЇ9,Ђ,ЎЋЭњНj™ЬЩ‰”C4б:ЦДЌ1Щ›рCЂЃЩдОл;оЈ6Њg_Џn*-NDtL—“ьyІЩу‘ И*ˆ’ЄhІщК~Xя˜œšnX^˜ЎžжEт9лdћœ"й.u4EUnZЭІЈJƒГэЊžƒьPЩ‹7s^юJ nYRDУУэ}}zVЙЙМ’,ЫLg,{‹P–ЧŒЈЧqЙ@З§( `x‚Пt—Жo9n<{z^NBз6tЙпdTХHыЉ‹џf|[oї]fд:о>Ј‰)ЙYйТ™бвfЖ* c–оЧRию]ђфћ €3шѓ`яЫёFЋu{7’T•cY–OO…ЅŒ‚=?%7rЂjиЖЎЉяZ! №fрља™Гў“еЛ$№‚щzYЊ*ŒUAz­ц§§o]NЮЏ7W7еVЃбЃ ќˆ“ўјј˜щb 9ГoO‘Цw[ 'Ћ*фСћTЃYжлЛи`љќэлыЫгr>_=?ЏSѓс*P ЃVЇuї§Kœ_7щРF­9’ .H Љў|§є˜шт`ЌEЯO™ЁВ}†Ez№]1o4%zёFт8AœУХыЯ?{~AшЏЏыP•!Ёh |Эu[Fућ TЎЪЫtкЭЦнЦm­УŠ({23щѕѓуФ’y5˜=ПМ,K“žvо1ЦUѕVb‡Н!–0уеЗ_^Ÿ1^П}[ARŽњэРCІ…ўCЗењў—eаnЇQиЈжМ(+ŠТіYй_>=?ЯCлє‹Їpъ,ДСћт4$!mx –aЦ`š>!е/˜•OЏžТЕњrДІ№§‡Nћ7 ъЩ}жЛ­лfgЃкdaЏnФ+!0ёИ.В|‰ЧїњђМЮ}PcуЮџфhŽEЊ(Ј)<ЂъўќѕчзчЧЇ——o™ІбжLHЏеj ОПРe>oюю›нЮF­ƒЋРђШZMжtѓИжџАw%=ЕФ|ВаЇ–}lьё .КІHЉlёЌх|ЎЛ2?Мy:gO‡mWDТuЬбhЊ§Ж–./Я7t§§+BЇeесЗŸіUe›Чч‡’ЛД#dƒцy}<Чd•дЋЎ†ВЙkL._МšzЈ3žŽлlћaпЅяаƒ<гйoлєтн§мМz1w˜LQвАБ}ЉT‰zHAG4ŸчЯљrЁG,BЕЙІCв7oП§ы7—KOЇэz{zDЙs*ЉyЦo Эп}u{ѕrl{2kQГЏЗЧ‡MЊвюсљyR5aиtNЖ‡'7M&EUIrуњпќэХ’*Ф#}'О84 Ј‚ЧHћˆађнгХЗз/omW$ˆ8q№бхIО{~ћм TrІэsкWМэHy~f)U фёњХ‹‹ы…'Ћ‡Ч#жккmA9ЦG„~ћЛЋ1э%…p]б<œК‚Є">юЋPˆООsdв1лЂЊЊ"ЭВњјциеЙBщX%ўЛоK‹Ћя>ucЉ9Јбшt™nЗmнп<П}ћ ДщЭу6НDМ3,ъ”›=8№a‡§ќМGš”x­‰пї&Z\|њ:АgњPSЄ€ˆ(c"ŠУЏmд}A†яу2i§џZ˜ 0`Р€ 0`Р€ 0`Р€ 0`Р€ 0`Р€ 0`Р€ 0`Р€ 0`Р€ јџˆ…aYІщ2ё=ччКi†ўЧЮКћ8K‹aЛŽФџоКJг5нrxQѓd[џ#Ї!~ƒ+Ё$g<`ϘUМ№,ЫЇ^{’yЮrО4tЭАн>Кy)І CЁŠ#!|ычRkBќW ГЕщxFн~yљžѓЧЬЬќЕАѓщ˜FнŽч†ЫCЅтL n. ћЇnЊѓЉdqР]Ÿsf/І“Щ\З<.у„Zї6§s1г–Жk.—ѓЩhtqq3ЖdРЉ+ЪЌХ‚ПŸ‰iуeRDŒy V3ЛЙОЬ ‡ЕL x В?šуsIЭnmk~3Кxѕњ^s}ц3fЪЗt[(jП9іЇœ ю›Г›Ћ‹WWЗ3оЊBˆ ЙгTОяљеax J $—ЬжчsЌљ§ѕхе§м0].У$ђ]—П›0нŠf,чЗ/_\BЯsm ЧŒb•І*ŠТ8QВ—.ШŸ€NM€9GЎ6]ш–ЉkГлЋзїSM7-јXњž „„;К‘ЧђаZъѓЛлћЉюxдйаѓА"2Ё~{JEp^јшWq<™ЎяУ(…ОkРЉsls9НŸ.MOHЧцQу~gz"Ѕ,…с9гёd25dtЧ52ŠЩё WъK&Ю|Жэq_HФ‚sї[ШјXпХlК0+п•IS15чрŠ*dЁy7уІ b Ь™aд*IЃ@%*Œ"ќјŠKёŠє†p;!Д.\лuiЬ†юJr_ГЇSВдo_ЭНuјni.РіАG”ЊЋВ­2x–gј[”эън$ьŒ[ЦДЕО\м_OАмюжkм сAъ Є0“I‡Г@Щb[pУ~”‡ŽЖаьЈŸРgPM‚tR@б]Г:"К6mD†5*NѓВ9OЙюЊ@ƒ[›–х‚ўн]\Э,Vž] -‹”~љIzљ^ТцРcл.vm” Јпtљы.Рџ€‚в)‚k[–›}W•y˜)<‰м œBЉДl:К-хфѕд ‘ЃЎЕœпнŒuгЫ7лВЩІJ)„{"Œ™+eЖHDм”Š;–ЭT,ЬХмыЇг0ЃrP(˜C]ЇЭЎЫВ < ^Ё@а!jдЌІiС№ЫRЬQk&„ЖMлЖлігѓанЎM•№} H~ œ4–Ўƒ(oŠШгu7(Rw|oѕbд&ъRлYн”UЗ]Ž ) Y€ЬАPjbп@Ыч˜]E&БgŸс +ИЄ-2ŒэzГн4…ШЊИ_WїЁыDИhGQЦ4ШЯK36™кН_ 0ѓU]скЂ€ЬрF mfР§‰›‚qцЭjMЃнёЇЭ|›Сhф9La-QG1кmšoF<ЅБpE˜ЅoŠPU…o/ЖJх|jє’‘Ž™+RфBх‰К #щБ ]н;3Ѕ()ытn(z€wжJ„g‹Шф™ЖєdН!FŠPyм х#ˆФ№,лї"и‹І” )sCЦСbВь#zш(˜фШпЬы$ŒPRAйІZ-,К^aхЁHИ!ЅšБ•@HЫzš%“nнЖ0žѕцАпmЛ8H’Рч“UYф˜>K"НљТWj‰ЂН‡Tn†”’*QТ‘Y„ˆЎQЂ" ЬЬЁХъУ4V4ŒйМЅ"ўрБоQniŽb8‚Є Aэg1ъ$Eiš,*@ЉчSOХЮЬшcџЦ )dYйКgAррк`6nр XG˜TšL |ІИ‡y(˜Љ )*Ї 1“–вхfиэ›\ЅДэ‚Ё+кГeR+o:1‚”M>ЖЪ`;оГC‘(95BчєrЮљНЮ ‘”џ{пzр СёЬžYЁ!йЧ]”D5ˆЋыUнКU_(­YЕЊEев ­TїuMYГlCnђЙsи^o:Ѓ Q„в„xIЂ]\4.+mм”Hž|НП§vГ=%ЪŠyƒAfы^Ї&*vhѓM єжhVјEuЊ;ŠЉ:*тУ ]S0]K–šв7ЈJу•ЇфгT  Е[9К<;ОьШyЬдйтСЮЪ{>IЛ9Ф<ц3TY/0uІЦrz`s5беnЗuQK^ВЉиjƒгPЁ(,Ѕ”Šb†žLi†ќЅ9тŒB1ті?}:КЌВŠ fЂK0ћжь€<јЦфж“Ј7HLгP9†ki‘+ж;Ўk"lEmQ§ЇaЗ›D|Х +rЖЎГРcJ)БOхPЯ8zЛuR­U:ДТ"5+•ѓ•k?я•yЅH$ZК№YT…†h{&W7QZH-I^иbЎlŠЌb:BНеЈЕ…V ;žЬц0і(O.§<‘‡е•еУJ­tUn0|ујјърэ&ХнAяЉH ЦЭ0CъfmшЖ\m"NД† ЫЗЙ­ђ ЧЃP1˜fЇ#ЂЪГœЈлNІc*Z‰Рспn7‹љ§›ї'Х“нНуы“эw;›+Л:ЊБn†<оя‹у ђгxŠэ(еZЋ­hMЩwT‘_фЂyЃYц$йєеJЕUo -„q–ірЁ@i*†§.ЕŸ’ФоѓvmыУ‡­Эїk+ЋЋЋAЗ7Ш(Йє‰^ї№]з€ž­plЙиh—UrъE/Мд%еєјГЋzЅЅYдДЫВ0ю‘(šЉЁG8ІIтОљУЪлеЕееЗoпЎЌЌО]ЋЦ=*ЈЩГaъADўEIшТжхугГkZYА…o­Pl­Жw Bcи™9rуўІЮs8ЕNQДФq\ЏЎЌЌМY!Wот7 4X ВKюѕ PоЌY4@–w/ˆ+Ј‹_ шhьљ^Б Т†qЙ “Р[Žz4yч7Э‹bvѓЭЪ›7Йт++XyГй‰уаЧс@Hц4•5ЕC•mЧKCлwфжёБhŠКє ыћliї”8Ÿве7uф9шNPіѓ|˜ei„ajэ“•п’оЋј§яХ8№ёhВ4ЅOж'VE–Ђђ2ЪЭР "ЯЎЖ,­= В&щA КdЧžЁћTkхНO}окЅсхъJюфдPћа€ЁC:oУЃњ№#г[mŽw}У мі~yQЌу/H“‡{ш4С/ 4еŠIъt!i—№7Š˜а–^][yГКВYіЕKJЮбEРіGУ4@iыЊ­ZЕЊЈЛ{ўš;m Єc€JЫЂ…њz№ 1ЫКIY=иокZ[yЛЖКВК~$"8Š№Ј<Ьл”БуX(ьuсъЈІ{"gМњfоgњžЬj^фиН \$#œ†WЈЩ„FЕrМЕљёhџш’sЃ ˆВnОDC™Ў”š–c:~`–>TMGZШёџ\:Мц:RUРVF§ƒQЮMЁuB=ы0СŽљbБ%+д='ŸIiM 6F:‡oЧ–Њ›†ћьеёa]_рlвП. ЭrИ+йsd- 6q DX7ыucTЛq’RЙ(Ы-лчУ} 3J…Qи(0EУRЌШT~НMc СрXъ~˜аo4ЅЎ8> Ўnфг"LBщФŽЇ№ф8ЂСТ]ZАEЖЇ%иВcƒ7,хЌљ+Nыc:š/3ъ#MŸ8Ё^L+ЙQХ0u`‹Hmдт@ED`^%ЛОЬ:6Ы9šd;іыN ќ3с|Ёmљ`њbLєЃџ•}@]8Хг4dи8€ЄЈjiЙ4ož ЦУ%Ќ( Хl)ўЏД[ьТЖзU­ТuЇy9оЯ)HО‡фб0z” лSZcB2‡ЊeUыЖнщHзлPѓз…SUMП>гЇ“5ѓКа7ЃЬЩwЂ$ё>ZЭЫБС•xЦ5 —Нц<“ЉЖ^uУе_—VыjЏЉЎEŠ!}Žр!ЙђY‚/б6@4vkWM”•Њё›Rў+"PЁтЖKP Ы&iО Mkвд-KsЅaыaWлК*WЮП­ЪŸЊDrZ €KЁ3т#”q(WіЇ‹aoЏ.НўžЧПE”~//^њ„{ф$dѓŒh]ЇOъw‰ мтЮ^щWШк‹p(З‡У^w0"ššцp‘Ѕф"”SјШ4aтџлНџ$œ› л КyИeO>ƒЇь|ћ QМБПОіюј`…˜іЛOхjЕZo§z›юk•ЋѓНwл'ЕЋн#ЩђѓОX/wcтDiњЄw–Єљ˜в`Vо­Џ8џЅзп:,V[­vЇУё_%*Ћ Fр;ѕЫУŸЖk•Ѓsн2Г|M.G^^}хоLО’gš.B5c>mЎo–vQэюь_З:,Ы вkZx„з‡;{?mќћ?§У?ќу?џ~уЈЦQ#Wт[ЅЃOЛWеѓЂюj)ћ§Ї—&awІuж($є0OоomlŸTіV7vіŽŽЫ/ЩŠЎЫ|ЇВ`eY‘%ЖRm6WўчП§~ѕУоy[ёUEтZЅ“§“ыЫsйWДю˜zLНр_"Я' І]š >@к&хwоЏm–Зvv‹'eN”UЫw5‘Џ—кS;кY]лЋЖл/і–†eљчhŠfДŽ~њtpvyQсD‰vнAыNљј№ђЊ(КRЧvvi—§C„)CžЁZ№iкGЄ||АНЖКWКјД{tеl–Ы‚"щQ/вdЎУ*†)WЏŽЯš‚†ŸќТ% ЩВУn†‚кu5ЖЭH|ЛоDХ |[SЎy~t~Yт4Љ"і'§М.Щz(сЩ A6б'ј6 \Ў<ўАЖВ}qБЗwбцЙNƒSTЇ?ђeЁн‘PЪЈ ль(ŠщК–ЉНh‰\Жl/ {‰O{R ‹ŽWˆ’ЁІВTIhœ_тc\U‚Iџi—’L/&дШЩSО‡З;ъБояэnЏНн<=ўщИЮ‰ЂША’ь GŽТЕXEЗuYV%‘і7EДИnўrжZЃ]БQ:eјќ R­—6Г~зЇѕƒУтщyЅЭ]p§aяIэœY?1ЪјџўР9йјАНГНОњюpwЏЪёˆ ОЭKV`’в’‰Œж 7LhIвЕЙвŒ(г†РоќfœјДgлTкQrуAhшŠX>Й,_œ^_•ЮЗLк<1ШwPtЉšшЄuж„еѕЭѕэ­еЭ‡ћ'ј šЎŽh 2U5WќЬQUEЗќ.Њ›Az/ЈУ$‚ е 'їwѓ~кІ%УБeo8EК"ёЅЋгК>?к?иоИpˆЩ}­ЬŸpф+яfќOЋ›Ћk[ЋŸŽЮIБ El0В3ŠdЉнеx{ŽэЧУљЭн|д ќ_^‡Ue•V1 t?feъ|Q${Ѕ5Yь”›М ЕŠŸоПлZп.б0пa3ЄІ$u%Aš_™tАКБЙЖООљёш№јф‚A$лЊаaф`ф*b qи›њдёОЙПЛŽSЫќхKFŒjшКaкщ?ѕS—ХІ"[Нщ$в%ЁUcё ФксЛѕM<§3жMњy{Н—oІ€оv‰xМЙБОйЪЅR™U7ДA0ћ}CскЂцЯцГљd2™пЬЇубРзѕ_о\Hc'HЦwїГ^`[†*дNЪЂjfГihЈлМЊЊrЇt№гO[ыы[x‹(ѓ<ЌoјqŽ}а?Žса›[Ћk;ћЧчЖИгМ,um'‡ŠацЃw;ŸаЮlˆЊ-В^ВщT^xa6Й}МЧЖЎШ"з*^ВВ‘LчБЉŠ,#щˆОu ƒ5ѓ7œюœеEУѕCGЊћ›Т ŽгГkяB*ДRZ‡™є ™A>ёцїГAоюvcŸ_А6ЇAщА7Й{јќ0ЦЉŠЬ3•Ы†ЈEГyœf ДІ!ўkW'пmфoк>;ннy‡\}tV(œŸоЏЏЏ­onЌ­я_‹uYSyVPŒИ?Эf‘ –Эо§61НДзK<ЫЖє—, hДy4ННџђхaо ш”…ЬЗ[œЮf ЬбщH‚Z•ђхёOяѓ7mž|кйимки‚ЛМл*llЎЏЎ­­Ў}ИЌ\”Yš…Ѓщt>ueЎЩjсь&жžЖъ%Ёƒ|ЈПЄ[|шЧдЃЯnoцуn чюЈImFжˆ+H Д>мЭпДЙНћv]}ЛЖV(Ќm6зVпЎќaѕУY­tйю:зф5o0оLЅгŒьnъImФ‡NG[џ/ъА ІmчЇCl/юŽongУэ“З“щэ(€;‚ tф2 Ах‹ѓќMляр аz|ŠoТфяоя]”Kчe^€{Шl­#;ДЛpь@Wе›>L]kДш0+э›|й ySпаДќ<8ШќссŒцЗwO‘˜ŽЄjІiЊW/WkхRўІƒ§Єід†ЏМ+lин?.–+х‹bKрUђІ)=пŽС–DЛ{; t…m!ЏƒІ3/Ќ|O@ФhOq‹хEE3Г›‡ЧЯŸюяя'ŽФ7;2mћ7TЪеFЕœПЉxyКїqgћ§і{јјЮnсшшьђђъњњњќ’ЁQPКй’lšљ81u;›пооі5пвЈНLcШqCyЖнlѓ"mрРЯџќхёёёсўсaъˆlUuкYЌˆS*WЎŸ,}quyvzv|АПћ ?ЁXИИ,]]ž+ЅГk^P,СŒФэ &”АЛщ`~Ь#ЖЉSЭ,ЂЖH€{ˆФЛлЛлhъ[РqБ]iЖф'Ѕ/Џ9О]>пнXЩ_KчХVуќЊбbЈЯсјО— (Уот‡ &ЖŒŸР№мB”n›Ък~фGЂjИ§ŠE<елйxаMРЃd…Ћ^з›_ЋКвyg˜fЕИЛ•ПцŒV­ЭжЪ `IЕУ(Лƒ{мт?wХ‘kР§dYC_€жŠхФуй˜ŠqЧЖ€џћшѓЯїxЌ€й~–И,тuЕўЕЛUmУђ<гЊїђзF(3‚иiДыUкi…й`<ПщПуŸS(і›*щж‘у_оь˜ yГлщˆ2XHЕІdІwŸ№`!“AŠЌѕувU§ЋЅVр™šfЁ^xњ‚,АЌР4;Е‹ _‡Sк7ЛAіžоJЧtжUЅЃџ`KъЫDEнFpпI?„‹ШM”†‡2шwœcZ’™Г§ъEэ+7уТnфxid+_=”•љ&гnД+'WŒЄYС€voNgЗPњўѓ—џuу3eкЩ”вБ7Яpмdrw?ФGЉVМцtЃ‹gњ­og=п€+ …OЭRэЋЅE?‰}ZKtП~ 6щv8ІаЊžœЂю6ƒ,‰’Ш.§„‡/_>O…ЮѓаAtDМВ€ЕrЭДQЛЬЇ§Фs Ё^k‹КпфJƒХї}]EЎ№ёŒЉ4џИ^eqœівиљу_o<з)4kgGuAб]ЯD8їfЗ`ŒЗ?џќyBgхu:УЕ(ЭЁт z€‰ШЁаВтLRt:†$ |срšk0lП :ЕЖœgхЧeЃг)дЋgЄtNА”„фђјхчŸЇ[ѓƒЄз‹]s!ЛPr9aEž…вM…чvvѓЪpw;їCS%.œж–џ.ю•‹o/Nj…JЁ^П.Vx/шЬЫсЭуун§чЯŸП|ОэХQ H™ЭІд|[Ф~гФЅЫ,'ПTРqpНћЊ&ƒиRUQ*лВ(|GvоmЎ{q^)\эвE‰i”N€‹WDr§ђхЫ§t2›пLc{Ag?Y:ыЛОчгQŠ0ŒК“ћЧ; ,mRЯDАt‘At§ќ]џњЏџђэХоiЁXhsхЫ2 чN4ћЈ'‘ ˆ_~ў‹џќхёn˜њ‚і%ІхњЎьщХdœžгщр1”Ж$ИtсJДЄТЩѓ7§јуп^lЮ МTПЊђ"SЏ6xЩУ/ТAђ`€ В U]gQ:чМЩ‹R7sЂfxŒ Рt^k8ьЧќЌj\срљ{~јс‡o/6 Ѕ‚(wЊeZ])Ујcќ$ЈљэчЧaDЧ0‡гщхЫТ”VмСА—ЅYОП,?1>Єž!г]œ &ќвПћн3Ѕ?œЊџ’ОЇЁ(Z8ЧЛ™{ƒЛЛЎWБќ(Ž\mq[7EъŽu{‘c!У юvмыгФЁЄŸ%•ЉПWњяОНјT,œžБ{AVЌhЅч‰mиƒ™ЏЕjнШЂ/р`Ю7ЉЛjˆ-TЩЬРђНxPњщЙvў} ўюwЯ”^§јќС;Ќh0™ЭF>?œFІT.uшhюU.а•Q†i*”=Z’ц 4ˆœ?v7•BщЈ№сљ;~јћџіэХ›…НoЏ нА"Кž CЎЙуkНвHAxЪвuA2Л“ мЃZЪИjсєcaч;ЅŸЃЧязŸ+­гlъF&]ы”ЁЌЕ_yƒ+ы mYJУяŽв\ŸЖПWњяПНјчџ(MN`љ8є=‡юјWt]L˜H œ(‹ Њš›„š`Ц}hœ†Рœ ё!§а‹Шю™g"СБcЈТ‹f ўe5E5§8ŸGЃтђpє§б˜fСЦ!В…‰ˆ„ЁcU„ўžЙфG.]ЩоOЮˆ‚за~2˜"—n6вР”XqсБ%Q™Œgѓйd#:ІФ­Ё„ДЭVEuќЎg1ХЊьZкB,Э#шЋЁzuРзQТЛс)@: ДA3A'PšІ2їВn–R…р“Ъ&ь­IЊнEІьaэбtv3›Oz>`нБ,WeѕРЖ„2gл‰ЇЕOЎЧбˆЌ Ѕ­ІЖHNjЇј`’aБАM+ |ИК]š.GОoїа”eЖOФJЃ”MЇѓљ|&biЊa+-Юз5сh‘ЇБ'Ї-УQвPэh/YО!rœЦІ%I†mJœAЕœ:ˆћ€…1™К—%рOaрSkдЄ"ЬіP'd~x=с^nъй0@MŒ*Mh3:А‡-ѓј>O+Ÿ•eWiФ—з0m д“;`В jWCT€’Ђ ECЋs&JтћР[agˆnјqŒTˆB‚Кa2™MhpM@cоhЦ:<Ь‘ыŒхeСUЋЂ/ЕX§хJ750лэ”кВл–,яD>›ˆђаяТ„@ GЗзM"eСн§0LBпvТ4‰3АщiQzPїs;Є,ёУ ќcэ­Šo'IŸbИч‘ЃkвjH8ЁЭv\…o^^ж8U_ъ”sБпјZABSZf˜ЦО gХј4Rx?OiJ3QпЌђт‡ж№џ‹wZ#њјHЏ7šЬЧY’Y h ИРqaёфЪWх:ƒh\FЫЯЏ…uTУ BšВDYъœЁаЂйшKЧH”ЉЛзX{љтХ‹жсн?М3П(н'ЅИХд#Ч;эІКщ{кщ‘д=ПИlђŠКєЙђЖ"ЎЇбyКѕ‰RяzEI›ХQ”…чыk/HŽ№э‡vE18>3шSъ%>5W7ИЮEн‰-бєфУїѕкйe­-№пЂžŒe љP“с’I2ЄB0ЂPSцЭк‹uXzm}cc§ХF%HТ8УГM# њ“> ЯRпвЎкf Hювg[ў“ˆŠС*^„ъYга‰F4( UІѓ$B•hUпnmn7€{ы{BœФIF3L}P=ќ7ШeМХNћш jЛЫ–ўGТІчЌ„Оi„@ъ'Фїz№^пЗиЪйЩЛЭWяоя2NI{zPwжQž…КюЛ†Y\ћќˆ§>йРЌNMАНЌА4dPЬ+R(FiьшjчpџŠaAЎТ ŽМњŽž*…I?ŠBЉJЕCлQkіћ,С ГХК` VœЅН ЕГ€дт ŒiР&Ё3№&Ыр0QœhoL™|вМ8дeз’0№НяЖм­#svd*Вv>ЂК"‘2˜•в%Н|?I‘2{„оI^ŒЊтЬ&УдеЕауOцЯrОутТЖхѓpWЯ д~2[?СGЅA+ТЄРЙJЃР`j–“лџЦ­>џГtQmИВшЩŒR=.RLNІЭ їHhJ4ЇfD˜ФІ‘ђ'™eEОШkО%ЖкжwжвP-њB^гђ“aђbŸЊfХrJ№ЈХћƒЂr™ŒtAёBЇЫрЫЏДЬЗЭ(S>Гчфб@jК_ЅuвпЃis|гЈнQuЫч:Že|Wwў?e8ƒ‹‚ЋGГДR^ƒbЄ}P$CвЈ'œЗйВхѓЋ/ЇvgCт ƒb*€ц0”=ЗH”xŸї‹™с8Н8э0ВЩ3GћЛo>”Ћ?­ ў.вЈе.Ž?М{їўшђьэцvЋівВ В6дЃ'˜—ќNЯi rЊяэзлS>кYп~sPnv9Ži}'ЕЁлn\žО{Н{й8zЕujїУУ>BўdTRИ<Щ)4ѓі~фW›л‡ЕцщюіціыНѓ– Kишwё”:'Ы"п­—оН9n]НyuЬњHyУ^ah`ЬJ8јў’f Ќќ0їЗЖп–OпМZп~П_ЎгJzsпƒ}а’bC‘јцйўоIЋўўѕyGыG4œGJП Юфм9”&"ХT‹укюЮћЃѓƒ­эїЧ'дƒІЎЪВ*,љs’ЄŠЕѓг7kџќЇ?ўщП§ѓЏ+МDыfTElŸ–›ѕЛUNH‘Ÿсв$№чМР>АJ2=ZтоПy}XmBчг““+AЃЉгдDnЩnн”5Ыв…Чдvџэ_ўѕ‡НУ*/ЋЄЕ& нЫѓъеўЛ:ЧD“1сZŸPн{ђ’^ˆШ1ДМЬ;|НЗѓЎк9ио;­T/ЮyMг-W[тл—g‡ЛлoЮ;з}ю=ˆ-.ёлwляпОПhWы4@“пЊ(Ж/Я.пUЙІ5ЂšЄШ,Дž)Я0ŠaфFЄЦсdий~ћ~cыЄqњюјЂСvъЌЂъ^>HmYь6Pв*эъYET-ЧuЕч9Œjйё` в:лexEщtdUЂаЕtYd/ŽЯNЋlMшO€ж ŠйЙБŸЅ ­т…ƒŒЦЮоЦоюЦкюeљ \уDБл– гŒS]ц^7mKN7м˜F(Эga-ХАуЩЭѕlsгњSeYIБГ~9†"wOЪЇЇg•J# :€І^hкІљ WH?z§IVлxѕіѕЦкЋгу§sVўpЂЊ;УiЄˆАƒaсзiŠЂYрсБяzŽў_kї„Ё.ьљѕ§нu/thUКЅёЌЄТ@CšуWкЧgU˜њфќTLН"зPš’JŸш4Š€с@н}ЙЕЕЕўђѕс‡§Њ "Ž}8ёUЁЭЊ†яšЎV€Яц ‰ў/_о5гівЩну<ѓlЧїlCтdЭOЁm\4лЕ““уУwюt˜цУ"wz„@Ш e^nlМ\пии~№сЈ#щИcЉХЪіplCi^5гФF`кбфіюv6ЮНgЌЏ2€ е &їг%‰oы"'+сt>№uEfЋmId/OоОољБ–Lњ4‹…$CЬ”† ИхФaЦП^п|љr§Ч§Ѓу“2Ѓшž ЅЛ’=4dЏК#З{Г‡ћ‡ћХ$qН_>RэАУЋV~ћp‹ТЃч[ЧЉj<[ PЖЭ†lш:{В§bsѓM+ЪГ!-W)Вaž­}J:ЦсцжЦњ‹­НrљтъJЈШFё‡*г•ЕxБ˜ zУХн-гPЈџbKM–gКМцІфжѓQьZ ЅЃщЂчh Sщр9jыЧџxБЕѕЖC# ЃЇ‰rb!Ф"<І7X—лл;[ыыЛ'хJЗгd$ЭO\]Дtьщr—S­СэѕЭѕќцюzвЇ"ЭГ~y–Р2dEЗТС ”Т­MQЃЦѓ›ЃЪн*gXH3вХЮЦ;л{U5&ЖGK•‹Ѕєа>Ы%цХЋЭWл›ы?ž]rŠТ3Ђъх™ЃсldЊ+ысьіююfБX п Bз~Цz{ m­№ѓљУУЭ$]Sуj-MчЗC(ЭЕE%—ЁuЫћЛлл?”šЮЁАЂœjРо VЮ ѓЋэ—яOЮ:ХfAuѓQžцуyЂI,Ъ№ўіzAC‰G‹ЌчЬПАmй ‹ЧOзУ4А ]Ќ^Iš7НЛ№iиШВS—л•ЫАх6]tvU>:8Ош(N˜$Ё#з>МкикмммxwrVУІ! Њ•N&“ХЭФеxF6тылIGњl`Ѓ~Йв‚a[^4Xмњќщa ЈЖ ЅyСЊофvш*ўžnбіBoUOwЁ]єњјф§ыW[ЛN.*еЪљСы/_Омим|]ОМ‚ЁmKyХHЦДаІЇЫ,ЏК“Л!Дѕг~?44C7Ьчь{‘lЯ‹ВёЭнЧЯŸ?пЯz‘kЈ|QёндзUЖ B[зХNЋВїjЋPzћрф§›ЭѕЭЭ­э­W;›шݗ뇕ЋвЕk™2‡HСƒ‰&t$3Й™‡*/щn{ДхЧ0Ÿ3В.:žы`ƒёќюсёf˜уДp~7ё5™у4Є0$/јGЛ}іvч]Дљzџ§іz!АяЦ"p}э‡—{•FЕїiнёbq=O5ŽQНбна–`q“ЖŸЫžЁs‰Ѕel4Wiл№’›ЧћХ(ё]ЫооM_ЬrC’Ќьцy‘gй §ИŠєМJц‚зLЃXКЁщІ—-ЎчусєісaЮаOГЃо-ГЕzЇyvDНо§q›тncsks}c ўёуЋнуjЋqYуi\”cT4™поŒ\УJІїїsWUјnGeMъжŸЅsщ ЩЫЂРГЌ €.ИљЭУЧ‡‡{ШУУдЃ?m:^”јИ)Ў~Uoз/шЂ‡‡яvvЖr[[›Џ~|НћnяУQЅ^­\Д%йГРT!ъ/АЧ^’OЏ‘SSиFЃею<ЛЬm элST‡eZnОјјёёу#”ОŸ‡­›rУ$ѕСQљfхќЂQ”ЇЇчхУЃ§їяvпьО§ptr|||tR­\жЊ`ЄvжƒЅeQ‹‡Ѓй5-ЬYмн=опiЫзЈдZLЇѕЌБЇЎU, ;ДNздэќюгЇOЁљ§MЯж xzš'€YhVЋ—ѕBщѓ Ј}vrАџ~џ`џшќъътќєьъќЌRчeХЮћ‰#+šFѓыkфAшќщюvцЋ+lГ О*=kЖцбšЏиЉрЙІœ~„вф!7уШ’аœXˆ(ДšГѓ ]UЉŸьžТЦхг“уђХщёбщUЕ|zUч%йЮ{™ošv:ИИЙНПЋ{xМ›fР CхZ ЋЊЂ<ЇкЂЭЇОвтŸаwL‘‘Œdёщгууу§Унѕ(OrЃŒ6kЩBЛгМИ,BˆЉю–/ЯіоžžŸ—ЯŽпюžŸ”Ћ Tі6x_ш‚ƒNІ3иљу5”RЅЬ6[]A’ечXZЅ )эР XBlsК;И‡ƒ|B8>мЭhЧ hНЁиnVыOЮи)wУ4ВИу7oO[<{ЖїієВќvЏжьˆ `ЅLІМљ œуО0@‡І€o\\дК‚јЌх„‚уњй Јј ДEDЧ Їё‡юnˆњNaiŸђиЊ^uŸц[[чон|”†ъХ›нŠЮžю_]НнoЗСH‘уД—eУйтzБИННЙоw‹@E(wЛкљёёeЃћМyЫВщѕlд+іЖ ‡(‹ˆУGЈ Y€& EЁ@”дЂкЈ]yУ(Œђиhэд+Їхкхсўё^Ѓг•T47єЗ7‹ыЛћлл;z!ЋЈ’(rK˜ы:д=?#Zц(U#bХДќЩ#ќƒДОFЂєc‹ŠEІVЉˆOeЅчФXњZй;(ŸЫЉzUЎWЛ,-<аНД?Уаsш ЇFTпЭѓтWУЋЕgХрOb ІwЗГQNГ~–ЎYё T~ИЛЙЙНžOњ‰ц!ёЕ+Р№г6„–;›г|Х06иЫЫЫJі— нцu†іe(К“ fгйb6CNŸyќєьмbЛ ­P}ўњXХђН?~ўt=Ю"п3UЭђG?Т9ЎЏяnPЪ1U„NЙвЊАOЕЈ2КЛƒNЗз}[цXОi ДzSц[нn—вД“ŽЏёc€нG@шу8СqiїƒyўєОтИСшсѓ_>?.њIр’l:љ§' 5ŠКХ ЁлУ9пoБuцщб:SфЙылћЧ‡­IеYЁtеPužiбёАtПий0Yр Šњђ—бx"Gі?‹М’]њЫчOЗУ,B‚Q-7™Уnцг~hi’,ВчЛœаl?бo4™ŒgxќЗѓJTЊPЛŒlъ|уЊ-ЋšФЁыG§)ШnЁѓЧЛžgлA1ыŸGže=–Џžм~ќєГЂмЂ#hЂйу#2йѕБfЁЊПu*)нNущ ”Еусx ъ9є-В›$К)5Ъ%I5LЧ6TЭHчзШпŸё›я6!m№™_ORпЖžП H+†PюnІЄ4Tvќ|8|xИВ€ж‹Š­“ЗU„ј‰шHqП(Щi ! ŠgЭ58гVлЇ%Aеi$]”еhvъѕёЁјq> ЪИОћј0Я|kk Ч ˆі!ЖятM:†{ЬU!€1съАЃ}uj™гЁ-ћ_~GЗкГ[.•dMC"$-š=РЦХЧЧЯˆkxЪчП|š!H–qšgКn2гfuJшIo8П{ќќp˘ šD–$сђ˜3LЉ§5{?-М§ђІС‹ЌщчHВŠ*rœ Y žонЭѕЭ§ЧOљ_Ÿ?СЙёх~™ц3†iў&‚эHцД”m4šNц7єDяцаЙ<gј‹Вd›ЅњеWW§kщпџэ~yƒŠІ)™j­Tт%:'Hэотю~1ŒЏ?~ўј€T~GЮr3№є%­85Р›В!jg№_ќі№iŠТaЏŸјS*WT„Oїы$ќOЅ?§гŸОМAэX Ш[чВt цфnnoІН$?|КfД_NНHС–ЃД рOGH`з“ёxvїˆФ˘ŒŠ•xОZ*•ЮкВ"–ъ—_]єЛвў№ћ/oо”JuQzкК[:-нм-ЦЉяЅз}„=|ЯFбR<š„Ся ‡‹ыI‚œ ёзцгAЦ CWGX‰Ѕ F`ЙвљСW§Жєћп§юЫ›ОаyJuлЅ*Ъ7o0ПžѕЧі&7!_cXДњЩ5–тб$№'ц@#PwА˜LЇdц8ђ Y’ KЕлЉwKхЃŸ)§лпўіЫР_ПxZнБSjЩši%€Х„іїчЪrrБ3оБ–wŒl!/†miЋјущdœ%IvqЈeМVЅZ:?ћъšп•~їћПZzЏгГЇzфMЉEчюЬ‡!QЛl™lЅИs)§Et:^:‹f>{iјŽ&?UзО8.џ\щПЙЧ^хѓЇмГWъв;!UИtzCДшйZѕД„тP_šoˆ4zjjЬгПCкD:›Њ"+‡9-я•vќъ’п—ў№Ч?~yѓЏѓђИРU Д<ЩB[Ї#ІSїўЂ†ќ”№DХ;PЪ цWžxЧ7>М-}x§е(§ёџєхЭŸё:§JWw<ЧвEN1~~voЊnа™…-VTtS_zЧз_"O&Ќw%Уr[’lџЋskYQWeЭ4uБгш№Њэ8tШДђkънMW$ЎU*7eЫu}G1эЏ§Э0ŠCЩt™щt9е-ŽС7uUрОС'дЇ~šа)•ŽNЎЭё|:јTUОœ„Хj~Ў*|Їqyй`$г=лЖlKS§оz3<+šд@Рїl˜­SЋVj]йАh _ђЖр–aЉЪйщE“)=љОk[nM–Фх7 ћЧ+E/ЧіBп6dYQdЎлjжЋ]Э4пЃSЬEr[ЖблЋgWCiZ–уtВo—dё;єн%Q <_Xйѓ}zЬ’ЌiК&3Ы“rз4;p•.ЇаБ[г‚Ѕ•ЫЃЫOTЈm’C S‹*л4мЎЊ(пўX!С0ш$3X+ ё‡uъ`{žЮ1LГбlЩКюј:/+tў$kˆžЇuЮ.;Šх"5YЕТ LђQŸZКЛ&\ ќжgє(Кa8žФqОsС‘зЂ37%YYY7OQ,:$ј\бWjU|ŸN–U3LВ4GУ, пжш\хл6gІV+NFq =ЯС#'Ѕ0К&гqЭ’†ŽЁл2 ЅІ%пЌ7d? \<ЫГ^б,Н7eaHЮ ќTэjMюlћq’FaHmЂ ПœЂ7ХЅЅВk+VћOR­А‘'vЁtqXgœФй`2™NЇУ<‰ѓ^шљQшgт+KmAџ3СЃї\/ŽЩвI’@ы №\зІО.РNxГщ%Ўд F‡mлОЦж8Т”ИшXT4†ЭЦ§$JSзvqяcHТ7K’ŒЊ"щ…IЅ§5хтѕІу^–!ПЄјB}Хг,о‹РY†šq?ƒхe+\oЉhЭ€h:‡;tэdHЧЕ§€к‰šTPу>8OмЃ>Ж™O1hPŸ2J—>O„[šс8ŒШ$Хaж–*ЈЄu/ђmEd ЃЛLЏцX <hЙš›gAр˜айѓ`eз#Хр!д46щQOf ЎI!iн€ЭА?оZй€E”Ž.‚єIдx”)эЧžЃ5[‚ЙKh ёWЈѕ˜[Pw#щ!ukP\7\ш˜‚Е?Œ]?v 92ЯЕЌfЙйd:H–(yQ0, :єqŠ­:Н<ŒєfЕ#љ`UЫЫŒМЈ›№ œпЫCл3‡zЖšИkйКŠїЩ2€[?XŽяд.ЎjеsŽšŒgъЅ‚ €x Ы№œъ€pЉ’"›a–F–ШёЌ…ювŽьэ0ЂсF0ƒ,ЊiтšІЌyŽeб‰з№R”‰(Ѓt7 т#(-6Њ•ЪхE­нiБŠЎiСp2›ŒЇУeuI,I;<Д…Ž|зtќ<q ж lыљ-hž„щHfС5н+š€ШŽM5}шьКрдЎŸчф§мчЛЧБ’,ёQ(o8ЯІѓщЈйx!<Ъu™.+:ёJіŒя2е†Š8_RгЅgIMyŽшІЊƒNЌ\фm@Bˆк%Э‘б w9†“)ŽщДлЂщ І3ЂбГщ MуР\QбEеѓЎЗ=‹‚лсjUeч’B‘уEг-Udф-[њyŠ(6ЕРЖ :Q–Rпіqб%RК XН(|Л~~%:@jpшЩtΘO'ј>hˆЁћ‘)€@ЁІ;Lm‰­ZлB6_Žв]FЕёgxоАгРPDХ ^TyнCpZф†ЪCЗ|›Я‰’ HbЗzTцаЅсd:ЯЈ‰уДД nъa 6bЃйВ,?ї-Й]k)~ИK3<n`ЫmжSS‘d#№Tбvіƒ§(Эfj` и|ЄH Иlš*лшЈA$2Ѕ@‹Хb>ŽЈЩ›m{rGvGМqл‘Ѓ5.[Мх-ЇZфEаOeК’F†&ТПMA‚‹и6ЈЇg89ъЇЩ6Е †к ѕžЃЦЎˆ*YQ=jЦ;MŒГщdv=› С­$ЖвhОkЗZ–“фžQ-WYг[Ю`YWD&№дfGAЂеTЩp]•хЗЎKдЇАѓЅ5РІоз Ќ1Ќпw +‚Яє†(І“љ„аo2ЩмЂˆзЙc{ОP•м0ЌЮљeлД;Ѕeд0]fu„Їy‰cЊВ–•jfrїЇѓЩl:эшЇA”PƒŸР[/ŽМЦ'ЅЧЈТЩ‹њйAјъpSь*NЄзZv%ЎТ5Њ–У(ЫШ/,’–mЖ*’‚­I2шo—Г,”&№vžУYg(b№ tм”F нtPЗgƒAў7ŽЧEu†ТЕZŸ ЂЌЯ ІЊњi(ъVm‹1Ќ%˜šQ5г’ЎъЂ†І)ЈЖТƒHšЫ™~:M ї@ѕzЈ WS‘к5]ЗУЊGЧCјХd4D] Ц#И~XŠЈњЁ|еХ3AЈд/lЃ%-ЃЦee оWэh~D Ц0%NДŠPъ O}o…в(гHпдi(ЖFХ0шS яAсеХ€GdЃA vэи*гНVkU=Ь‚HoUѕ%/^В”V‹mА-ž15‰lеЫsƒц›’ЅЉШ…ФЁЭЗшšу€TјqŠъŒzїRѓtxбx.jє^bуОLЙе`Ыь^ШAЯRль’&”кЏŠ•КшјЅЗкЈЁ:|1AЌѕ-JЃо дкЩICЕЭТP{;2бИ a8ЂL­Љях у`€L‡c5WЙbёд\ пrT†tC8o+J:ЅжA•ФЫAр›Ц0`Џ?ІЎ“Ÿ”іЅЫoїЊВЊPП^Э4лхšрFQ> QРЬРЂћЖn‚ФЗeЧщДmvзZоФ]—1ј2kPЗkсŠ‘QS‰ѓ€Š˜Гў˜rtюуВ@>{ГНёЖ)ђВL#џќў›“`свЃ^xw‚~…cw›Мх u нЕ—7бi)мЅd™žc0g]™Wl4жD:ЧIŸВЦИPКŸЇ‘vОГЖЖўгh˜_з+ыыя›nPƒžѕF‰ иw"_В,зьЖ:z зGе}g™s0нv™E ыЕ“ІЄш„ЯВHNc‘ƒйДрJЃa9ѕ?џЧŸ_–eEб4џ№УЫw/IћCЂШтѓIъ іhТњпь}їїЕ%~tѓіНф%ЛБ$’ъ"%ŠDІїоgаЌ’нџ}ЯЩочlb‘’6ŸХ•-AZ{АЖ%„(xс‡И3|z>‰ gЭqН Ц…8Ч6J•v…ЮХ;ЌХ—ТЋВf1еК QХаih™!вѓˆ0“ƒ#ІqшVзўr}эћћыљўНѕm5‰–УЌЃбxD-wGžakšc‡рƒ‘ЏЋRugї йі]O‡v‘ѕv‡|„„m[К—e u\BЦ)нJчсџИwя>§wџС§ћжіlщHх§Ÿ@Яf\šЭdyпс*ЛЛЌ­є*G…BЋ{‡ЮиlїtЉACzЈ9Т0DнlКqфЧщЅіx>p Б ЯОПџ§§ћїя}џ€dэаKcН„ŸCUоG—”Ъ ‘ зJ{]Klђљ:/Ћw5CзlдыmБS]vЇGіFyЋъnZV8 7"eVЗ2Дќ€д}џAоБƒаh6ђ=ТG”КФ  7ЯђН 0{х–Щi‚нДœ;‡lЗЕfЏŠ‚юˆjЈВъЄ(sˆф<Уž‰/EaшGњіНzэў і@GaœЁш€^M&Yр% 5~mіTп]V™fН*ДЪЅB[&7ЗяШ!ЛнV§јр3EšxKawђ2"œKа4Ќю`U;ї<ИG€я‘м/z№Nъd‰<˜к[fЙ–аЌѕьаU nю7jхвБЈeйњЭПtкvэ0пЄ3ЉЭрК†њpаЇІЕˆбTЦОяEжо h†мПW 8\LЅ:љтxњž ЪшщbЛЪлž*šŽPx•/UŽš ёUѕЎ™š­z­vtдlѓ nнЎЎЏŠК'~tcЯ(iг4?ђЪkK7${&Г.в$^”в4эp<„)AбЎЁz‘ojЧ•ŽзГНЙSlдлЊihw8чмЌWЊеЃЃЃЎЄ*]8kуБFЁmEЃ …;bi’€тнЇdпУ2Ќ­н[;і|Чvc`†}ŒІpGOб=ЫАСЌљъ~ЫqeІіj{ЗдjtЮeэJГ+Ђhб%й }]1djЛŠК–ь#№=Нќ|эћ{п“/"„lq'3Ђz5\Ž€єQУ*šcЉNшrЅ,™тбўы§нbЋ^wgoз §я y8зж‚РTеЙтqКŸХР л.МzёјСН'O_ьЖ з“ъ#ІьƒъvœAh‰ŠЃ р§Žжmїц/…S,Н)ИО%j^Œ%–б€&|O“l_c( ѓ#ЙнпЎ%ИЖŒ"]3ћЈm)—e\№жхК тI-•H3ђРщl2LBпђBЦaUЁеR?нЗП oXbЯДd>˜Я–Яž†Ц(Z/ƒ@гА е,3јl6JP_šО-іDpЅVОўЩ1ƒGЩЂтъ\лœQ№ Ќи‡ЊГ4Ё4† НЂ11ЊдЧјс QY5ЋйГяИ"ќчЅйQ фp~c§>1'Šи”дУŒr% ZЃrЁѕпщвЂ6ЋзвЅNyћ ZџЪюvл…—ћюt‰‰І\hдŽ26Ъ\ъPŽhAЫpGd!#­дКВnЈЕцёСюAЕ#Jь'ŠЭN‡щчwї*евіуgЬ2˜н€І– œжоŒщјbFoS>ьэєјš`HRa{{ћрЈ'iЊ$|šс=‰чй^ЃДП žSикXЯ‡У,–FtС0њ7ф—ДЏЋFЁNA/Ћ<;bКšж(Омм)дКВІЊВШ}дœLMЦ{­ЃƒэW…вЋ‡ыЏ„šUРѓ` K†zS’l яMœн'ћuNщь?пк=ЌЖi=%­“§(ЈыЕНgўїяО§цляОћїя_5%…f$ЎWЫяюМzДБYЕЩzћУх"6ќ"cRѕјfMYšіa-УюЫзћљFcѓХ^Љм4•ІРh-ѕn‹ВЂkbgїсŸўэлoџэOyV`”Ÿ–ЎШbя(_8м~ђhЛ(h.€В!мб€Іх{ЫД8HЂСh8ЕїЖ‹‡Хƒ›{•ђaSЁЁwЫаkю?ќУўј‡?ўчНЃк­=ГЩы( -Sъ;їџ№ЇЕg[‡ЧŒЄ˜ŽK‹„nЕ”ѕфёюa'Ѕ81\ЦЛeA-C]’.Q#5"Јє›л;ИЫ­gЛ•ziЗІЈй~з.МоzЙљєЩгэЫ‰ъ0эjЕR%ЖЇмЊшbtгЫPQeIф№­.УJJЏХЫ(‘oiВ(ч‹;ЯJоdДŒЧШ+dйq%§•Qz3)7щз7ž?{pящіnў)†kuEХ№“дФыЋъДzSTU“ІыLS“?ИРMгŸ__ cT Кe™ г$#.‡R)”їЗw^яЊ“ё2%’7"кEžOЁй ћ€އцЋOоћўбNОXя‰ВЬДXEwгHйVGЦwУ/Хђ‘hFџPаHг–—L/п\ŸЄЎ.+–g*l——œёbM–:ЅjНАЗ§rЛ“Rф ЈAУ`ж1Y :EPїGIуёњЦк§Ечљr‡—UюЕyЩЮ=Il79еД UQT3ЭчГЌOџ@кZTZП f—Гижu/А4ž@'OEЁй`™z~їхѓCkИŒЬDщFу, –ўGУ{ХбаиY[poэйюСAБ'ЊєјыAN-‰o1ВlŽЎN2ЛОО8ŸЧј@EWVжLгvƒбљхЌ$ЁЅѓ]QrЇГЬ–8irŠФзЪ‡/^ДЂ›1ФЖў% Й"a^šGCбk<}/–J]ЩpMIЌЗEs41dЎ ЭGЃŒ&NЮ/ЯРЮ3Явџ1ОП#Ч­.'JЊсO/Яё]ЃРдИž(љѓ“TІеU MgЋ/ŸюˆR5бjЊЖЂx™bтИгdiлыжžьЪѕfГ'щЎЌ-Сї Ў­8“гљx49НXLPХcш<шці^ЁT­Ее]\žŸ<Ž(Щб|i2пЌ Кпlю>іќPIi2yМЬ*ч5Э‹їГсР,=мX_{јКTi№ВРђЊуI1В? 4ЙтŸž-NЮЯч§аЅ0ЦnНкУгЌТЕнбйехХbHKIŽOfЁ*1•КЌСы ЙДљтљг‚/™ нќDјTj!pЛЙч766ѓхšЈвž#=ФˆѓVъ(b—SЬўтlм“ФЅЕ{ІЉ№ащіNЙжh3GсјьђњbžЙ†Ц2Њ– Ru+mEЗ=GзZЛЏЖ?Э3N:ј 2ј)б<ђХ~f7r6жэ”YMЅ-€Ђ3FЎ›Œt‰щŠjprqq~z2MAZђЉ|pЩЛ}иъq’‚3цЫХ$ѕ Йл–Дьт,Іk "--,fЫћ;Я>}YьЊ­T$н‹АƒФхsЯs7Ы-T[–&А‚•в”иќ4”љ#[уЫгS8риWI xјсqЇдЭ@Ь;Н~ѓцђtœ"NїZЂ–œї Yh™јibыRЋtАљшёУ'tUЕQкл?,ЕeЫ ТРсЫЏrы9˜єЃнТЇЈŽe)Мh$Д@шdfIHVFrv2HВбt`3ЧŠЪ-†Ј_WXЭДœp0ПxѓУo/цпRй:ЇFЇчCсл‚уь{šЪзJ;>zDW=;8|љтйЃЏKеуЃђоѓGЙмƒѕ…RCPЭ~С z2g'C]ьВŠ7ЛHLе№њ™ЅH ъЂx‹~ЏыВiлn2>9ПzѓіЭѕх<ЕUЉG /G  Q3Тб(Йn”ѓЯж7жщ*hєе‹Gkы=~ђфё“ЇOŸєкњГbЅ#Љ~;Š (A?Š'Їg$Г>ГxZ,˜Š‚ЌУнf gыH2,ЫђСzњ“Хел.g1i=;Л["ƒPeУafЪRЛ\@5АAWm<лyѕdmmmc}}ƒњ_Ы­=|yPЌ2’В@—ЩucАМ`ЦЇ}]`X‘Ю№оnё‹Ѓ!Ђб’ЫіGчАы“Ьwœhvy9Б%ЖЇ–Ÿъjљ`ѓёУЅІaмPњƒЕ@ŽШ<6žю–ŠЧЌ gгGе"Ÿх‚љдз`|~>  ТŠ п9О цмГэ*И(m8”dŒььФрt2<ЙёTŽWM/N —[+ї7ŸвU?BL^__цјcƒ@oюч‹…:д:˜|[“@o4Ьљй0N'‹ѓѓБ‰ћnЖy^рЛЗ yБ_ыёœ ˆ‚€јoћУѓЋыЋЫЫѓ‹‹ЫЫyhˆВn‡ЈЌbhšo–vwшЊЇЯр†Ыkы„x§суЇН_.Ы]ItFгQшаОfюЈaЭГйќtчцЈ№ыfЇЧАlЏзЙ}”x ѓЈѓ! Mž?\hшљтт$s У RZЏfˆп>.О>\і€нййлло~љќёЃ'Ÿ>л|ѕђeюiЎR‰eбCœљЎч™нjЧ?Y,јЎЋЋЙЃi2зыВ‚"гƒНEєi[Њe›ЫБДйТ\ОЙ‚™Їa&уAтщ(ы:кюA‰Ў:,ђ…Rўѕ‹ч[[[(П ЙrЎR8ЎЗ9^ hv& уФaкњрtAOэъъbъъšŠАЂщЊ&xјhбІj—Ф т$ЁUго ruЬg‹)’ѕt:D <пi6їvo@WѓћХЪсж^Б|˜/q+Емсa„‘“œхи ­БььфlCƒ™mшЊ&%)рпbWe›V„Х Šj?‚%*Šž\__^œ/gчgѓй|VYДяІгiьюшВrЙ""ŠѕNЇyT>икЩ•rЏ–‡"HNВмa7@э>fhњъъњbыPDЎгъI* †|8ѓШхPkХД†m2EйJёЭCезgччч‹“9U†Д3uГВwc…’1L“PЉWU`Њ/7sљмЫНn—$…жЁаN'уЩщйщй9™є"TeYшжQГЂŒќr›Mšэјуг3(іdL;Ÿ E1’SВipВѓГгйˆ–ˆ…xВВд=Ю—›ЫhUЊNl-˜ЮТ^Н­t{ХмЬЃаВŒ™PCKrNNёР..‹_‘ОзЂIсУKђmfxЫіњ'Woп\ЬЁj›КхЎ~xC&rБ˜ЯF ЭшЊ Жp|Ь KЇ/wbѕЈiLЯ.ЇrўЈм8<шfОжc”uZf{›œЬч}?М8; ъ”ПјsНuЋ™˜cУv‚ўЩе?ОНZLTйлNrібХU3 ˆ&м^р іЇ9т2яБЭž§Поž†­RхЈкЬrlэЈйуDд5ЬШƒy†"dЁcлДJН§ў-ЈкѕњГЫќсЭеЩ(‹Я &зoїЇЇЇгq?FLкЧЌ(о<еc%А—]џx1ЖTыЉа4ЫзАiВЈ?ІХВ„њьтъњ ‚бb>аїхІз[Ѓ–tлђg?ќичSZыУ‹7oЏ.PЭ‘&№STИaЗrЌIнкђ&˜œœžЬNЏЏГЩ|HsВЏsЌкmtxY5?в|њd6‡І/ €ыЋ‹“)-5гЁяі[ЁPЙ:щЩѕ_џч_|ГЅОы†H‹?МЙМ<›3пддхXuљuг‘›GЫKZЌMТіЯЯЎЏxk7ЧrЋ OT4u:Šѕўєєќ‚4ђтj6„Нœ/f}п6ѕ[[cиv4П&UП9ŸЄаgзoсˆ'“~ц#<лЪПxЩ8RГКМDNi‡8‚/AПЪЕ4“Ћw/Уumд№бpF^ѓИО†хMцˆ#—gГ,АЭ[O=wlзН~ћДtœž Ящ‰žЭњ‘gQ.dыћЯžь –мЊ,/‘г>а dqљуY€ЗJЙcй’5Vз U’дp4_Р ‘[Ўо^Ÿ#5Оyћі‡ыѓIUпt„:ž^ЮХ$‹уd8;'ІwŠjпвeš}hl>+J†и(п\bњ-EMЁэ*њp/Ko—r"јЂŠHоp OЄ8}љУаіxЭ_п^N#ѓŽЁшi–ЯH!—‹9m:9‡У_žЮћž‰*ЌU`Ћ/ŸзeЉyx№г5`(гLl6Z"аr…Žf№х\KQ%QdAц\€ž a#—ЈˆШG.Ю/оО9Цэ Ћ6oxазхNЮёCЎ/ЯgC$:iBфYЎБНнс;љ›Лfk'_>ЊѓяПЅгu бE”EfE,? ‚x†ЏЛК:›M'S|їЂokwВ5˜žьљ%RСЄ–Ћѓ“!h•BЧёЕзљfыxїщѓП]ђџљчяiѕећ/hK6@Ѓf=Ъ5EеŠ‡0-+=ћсj>ёKВсt1K№јюtЯДl~†Ф}‰ vuy}}>&T3Щ —УsеНRЅRи+Н›*љњыoїЛя~џнћ/a…nЋuЃљ­\ц‚iЙ†ЁЙг7ѓˆіrИ^<˜ŽюЦ: ŠcЃљ9rE?NЧЇЄчаЕ4 …# SНвA1Ÿ/6пЯ~ѕх—_}§ѕ7_ПџŽІаЌдї—/цЎM/I|:IХ^єAдщЌФЙЋЕІ­Q›Ьч\Ouњ‹ГIтСЧ‘“e™„r…ќў^ўXJЛтЫ/—ЈПzџmЙВW9\О|œC:зZrƒHЂОЪ ŠЁ™VљЗ–ўЅє ЧqВaМмѕ-луХˆN€9‹Ъ^žям~НЄv‹яAAЈZ`wЖђЫ#2а№}:ќJQуг@эдpšќЛ+ыШхTd˜€hŸЋђj8‡ЖІ@Ы2r‹€Ъш№poПаыОГщ/Щ> яПЂАЛ{pјДЊш– SТEЌ3…bGFХryх№(lзЂ#JŒd 'ЈАФЅuШЫc”*…RёрхNЁњє_@Я_ў єЃЇљЪСюђхЫœаІуК&‰Њ2ахЃ}Z:Їмйтi:еVмЮхj=YЧ‰­‰СV–cпкquящУ­УП}іL~јЭћoxіјхўўrX}Оџ.™|љЭ7_Sјxџ…эч[{7ГšcTУЁ“WDнЭыCЇВў9aЁ]/‹L:ьEV~ЂО­кСѓG›ћхТ;аdа_џмІ[Е§Џnўї)У2`ТЊФˆ†•ЮлОЋѕЧП*ŒЂш^;šJhzГy\м|qXkНг_SєјъgqК'ї ЏпЇuuy,….3”n‘}ЇNќщ"OW~ц3­уЪnБ'Kяжm|љхMЄ~џбїЙbљ§п•х‘n2в-Pћ–}‡aуWDV‘м_ЦІNНRц]я§„д_мР~џ.EьЯGшрŒK–ћ -hѓRўOVk5Й qоЏ.AШћтЋ_˜GЮžЬМ_­YENљ@ўтd^їЩїј‚фЋŸ"њдўЖўћЛз”‘ЪZ‰вOŽщЫ§Я `%+YI.їъOя^~ћ ‘Мяў№бќvљнЗп|ѓэ7ПџѓчЦё%џЧw/џля‡jќ?ў@Џd%+YЩџŸТДŠЙќёg:ю§…уЋtСчЦё›„E:ŸќsујMТL%ы-жЧ|сЄоючЦ№›…“{лŸУoNfџ5­№џјSџ‰Ј‰џz yMиџм~ЛќkЛ•Ќd%+YЩJVВ’•Ќd%+YЩJVВ’•Ќd%+YЩJVВ’•Ќd%+YЩJVВ’•Ќd%+YЩJVВ’•Ќd%+YЩJVВ’•ќš0В"ўњіУіOэз:,џБzc~ЈPWK:м/‘KL‡уihSP,ЧPёїЯƒяНДИхС•ЄЪbKІ–эџѓі]UъrŠ*vZЭЎЌлдBŠgйоЇiiіы"(Њf–.гљћ•ЎfZЖ.ыЦЛЏYSUC[ЧЧ jстX–ЉkŠ$rŸKнœf™&юf(\З™;<Ќr†e;&оўл‘[’-ыІЬж …Z‡Ї<žkY†ртЇ7†is†укŽыКtОА$ѕjGе–l™Žƒ;~r=7`Ш­вСaЙЩбС\–ыћžc{ЎmЊЊє)ѕ-HŠІЪІчy@@EY–yЖ]Ю7TЫА\G—I#чk ž­qХƒJ•хСƒѕж |:Tож …џD{ДЁ1гёМРТ( гEб S—zЧљƒЊ *Іo‰]fy8)#КŽки+Б’ajЊЂлЎ„Yэ9~@WЫ–хЦЫжexТ,9ъFBфEEХфe>аl ыЌnјqњS7ПД?œ CC‚#[К [ =ФюЇkQCА2 Уі“l%QD}jЃШЉ †cšШРOu7ак wˆ„йГzЅ); ŽњiQsZІ{АpЯVшЄа0Д4эЃ\IЂZЎЅЖ%дИ,%хQе,#hлЄю”|OБ47š=Ў”kJМхДЋmеŽFѕOїBсЦpl7JbGГ_—$Хˆbћ#ЗI‡##љ™єѓBъa х—=TйВ)Г—’јGчн3m^nфxKХЫo‡§~ш›№DЫѕlSVСAЌЈ˜0›:4ЧxVмьџ*‚ц™’АБыјn|гSЋгЃ–4ћtЇРj0ržеu-# DŽZО 2šjе-Jb}ЧОЎ;Ž„фъХСG9ЙRв[6ќ ‰lлѕЉDD™њt'ј-CьѕuёМсЌЊd[Šb8ž ъ†{@Ь@а@œУУNћYтšЖя[ŠФ1œ №œlХƒивTУЖ‰ЄLНЮл *v;2RS™F`Š|GLћNS/И:К* Z˜zTЉ{ˆŠ ^QRБŸfˆкЁЃ ЂФSџ(УђвAьш&Ш j9Ў ^зт4bˆЎЩw5W7ЂфЯкMсњN13†Mэд QтЄ u,S– —RИШ‚тС8:aп0(ыєcL'ёт6рvIјОЃ+К9оVŠџpe^5d=pk&sмёМЛM1ŠЁ)N` ЌРЛЉg8’ˆиѓ–‘К™Јцђ‰ƒLG§a?ѕЩащapmеN†рtЖчzКЌ(eD\цxЋё`тAьYž+wЂЇѓwШјMК ђ bahМБь",r"uiжЈ+*В;”dC$ ˜ŒФ‹’РВ’n†Ѓё€"žhhА“сЄ^CА`#з“\/іОк•ёлнЁF…,†EеcŸNКVъп*Ъ‚@9йж$Yж-Ђšq6HБгiеŽэfƒ‘UСьOІHšЉo(Кb‚†лМфШ.'лˆ‹­ЎePИѓ\Ѓйа-хЮЬКЇ™:RИ,!ЙФОЂd{š$Т2Dсў…Bъ'ды:БDЖгnдК,Ч#в‰f2žЭІГi?ІО]!bЇС№L—:r ЭВА\Om– Й#аœN#2ЯШ^тZ*м'0%ETЈ„n[(<ЫДн”zt1юNX†уZ!>4šLЉНЫ”x"™Г%ЫЪ–kЖXл@-„КŒЉ6][М+_`ЏžкыіШгQЖm_5^ ,Kг‹jrлусxLн2#ЅзюѕкЭvЋеjw8Y‹ЦШ|)гОo9 …†…FЏ‹Š^h˜Јa™tЅQQ<ёЎr9œЭv˜ZOqПTVГ-ЕЩЉ" „†jŸ8šLФUЉзŽŽz9_ьЪF:Чуљќєtqʘ Г4@$DўЗйЖьјF“ЗQ6јHSьQЧ”юЈ>яP#9ЃVюahj kXjЇпд){Ѓк%’.ЧУeьЬ•{ЭVЗЧrLГTBHШ†#маdvrrBџЯG`Б0Ук=йѕЙІl‚6ТюиЦБpћўD7Тй–H•ЇyH‰Œb\Ѓ‡"ЦЁa.[7Т˜ЁЫQ8ЂЈ uUBЕ{fк^ ЉЧєˆZVQS3€Ÿ3p BэЃЎZMЪ|•яT;|ћnT-ТеЬN‰Ahi ьЯt$дЎуPoп`/›NFдŽžњњHЮЫ~2Я#‹ФЫЦА§щЩвгl0žŽB‚&пiJŽЧЕd Њі Ё]i‹Ќt'Ў(†#U9н MTлІжCv0 “ŽBwгСxЖд!Ъь5C‡DдщЯYцDIЖ”6й`8Э&дЫ dВˆTыXзЊoдкШЏШ/sд•Eхі}ЗP‚Џ›L хЉящJЋЋё +4ќ‰\mg“"УŒ M“,CЊаAJtХ№Љqz–Œшq В8pЌя Ј„№=CтDлmU%“в TУ€Ф~pуŸ @ЋЭу@Лštм`›ŒЄ8ШтH(І?\XъtDŠюЇ5RLФд(ІуBЏTDІ5› Г:E xUˆ@щXрџЊ'V:(`ƒlЅЧ#Оп…}HЊ%7D"K*‡*jf тйOћат†‹`–†ndi:žm БS§›-ЇУєсžэй–gžhИдЌumГvlК`MˆyэЛšпрU@5*№єNЙгks6Йт`@kDЎ5Aь Би,TMЃFАhУpСEFt3€MaqиЈ+HRЈ\UОйЎ vЗ(A Вw7ˆкU­њ‘@ш†R/З‘ž ŸкS9„йтўˆz>އ0д8ђш)„iџ›Няўnф:вХV№ЎпzНЖg†9 sˆмЮнЗsШ3g$ПП§U”Ќ}Яoms@Щ>% %єAsЊЋы~ѕUнPˆ–%иr2Žс…tњƒбАИ† єђcп‚,Aфј c‘ кЖh;3œGтЫМЪX›/6D™з=лs%Э86š`уЯ.^Л ЮЌr5šи0 5ž+CЌŸAђ0ні]зЦŽЃШе-]QхFƒи•ВЃЋГеgЇt\€ыВжЯkМ "nLk[1V=§іА?Фvюэ6№!G­]dJВA П‚яYD6CP Ѕƒ}њ:рд–ж‚8№}G‡1.4‹+іЂœх {ž'f/Ѕl;_РИ~в!юDнQ]†[+ \R>ймЪЫ<*7r—UтЁвN™оА XЏлЖnbав!Ы”j5"• R ЁњЗuљЛЅ’Щ@Ђ)b>ЫBЖŠ™_9lф›šх5С9 ˆOыMБяЊ•§•…ѕ’" ‚ЄqЇЛ9С “m= UƒhъЖfšћŽghrЙ(Љ@Q ~іujХ S(qр%–э…lЁy•Ъ Ѕ!Tc!№ЭкСЪћw[AD&ГК‘сА‡6<„Ьzш ZКD8ˆщКXAZ\cжGUЄVсpоеёќИеФкnEнжёz}T;CŸ9^ў№ў§FіВX8Y]X>™* 1оFЏ€о‚„‘LлХЛNшљО.UЯ %й%TeІ“Ђхт%Хq’\ЃБ§Иэ Вc(Ф ўЕ1$ЩC<ƒP]!Tўќ"_Єg4лUi`3эj]ЈVUrAЊй€enšКДq„MaК•D^hž/ЂК№gqaaiyGˆAiрTzаГ7} И‚Шз3ЯsLЫљJ.{vСС™ФE†cйUgЫ%ЩЦ !У…є[їт ЉI{Ѕ"™N ŽћБsБ */,€Ъ‹‹KЫл|еˆ#Hдб?РЅ]‹:‘ЌсуќmЙfѕЂ^Ьхrнo&mt(–ч˜Fƒ)Ш7L oЊ„э)}рyVиюЂЁ!ИДт8ŠНаЙ\^Xјџ,‚к ‹љќ#Š"=ї№-тaa›)KЎб‚ЋЧцŠ…ќeСJЅeЮЂzJa“;0vЉHѓœl[6сРфЏrуfы9 oЗТ0\п.,}Xќ€–Ц‹›\ЦОC.€™@7†яhXТ6$ŠRРAbЉz#s]СеУЭЄsУё<Явеr­JЉ680ысМЁФЂљУЅqю$pŠ+ ше яоУ6@iШSЇ;и`Зх/'ЊX`ыЊцР[гI=wrrV,в|\|&uъј˜šЊU eEЗј†n9‘&щd|ЫoN“@LЊSœШ-Џ<ЛЧРѕћЋLˆгшр 4ŒзVbЭУНчЊеš.,Š…Ѓ“Ѓl­жPQi}& АS–уРЉЕ|…t‘рТ QЖУи3ьещLё.vM№šъ ЈќсХЇ–ЉЎњ Р9„–^+IBY (‰kЩ•Вbыt%wrzœЃk,ЙMШтgЂtЊСђ У4ЈТeЙЮШжt5’с@МжbІS]qhШ†p›яо#‚€жжшРaiе šH™zрIфСY0K­в’P9OŸœ‚Ѕы,XœnVхМ ЭRuЊV+.ВyQ3lОЁ:О!#€РС3ли•0“дsk шa@ю О‘?Њ <~;АpŠV цДЊэыtŘЯЇЯNв5†т™žФ^Ў•KЙьљa–цtЃЮCњ, f„Qђаэифiш”R8кZ_YјАММВЖW5<-Гvв0< №ЭІЅЎЇђšЦГб&1FaюьЄHžёЎдžВ 7g%7єЌЄ‹-Ќ1зЖEА щ„_/ЏЏьЄs%мŸфvŽ*Ф ›HЙ[рCšЈ‚ЎдO—˜ѓггєyОTЮЄЯіЗŽ U№ФЗYНW.в†ЉPЌюљКЬЂ7Aів†Иa"ŒBп.ЮъВfЧEъЕ‹bMЖ|ˆ2 ,[Q4Яj№Э[Єž?=ЭdѓEŠЪll,П[мЭQŠѕf=8‹­ъ€Жхyqo8 ћm pNqœ T$Д„l†“p ‘‡ЫSМаSеЖxJa8/e3Й‹‹|Й^>ј№ўџё‡Ег:™UђЏˆTc 2(8Нлb‘Љзmњ~‡@6€X;N% >hюšnФЁ7-XкОХŠЊeˆBЅ&”Я2yм…ZљtэПўѓ?~ћЛЅ§ЫЗэ=!šiШОp0№uл0,ЇJ‡aфКa‚JЩƒ,11†”’лSX‹мoЊмџOjЂЎАІу(Œеšчъh‚++€…Јt<•ц4йъv›Ў&ˆœ­TDSџй•.sщуtžчЧTЙšйфЎгЊz‚ X;№# Њ0№Z8ƒ“-—4DUб!Г-5 Бz‘)VgXщјRЉгЕR>“>>ЏЈК&SЙгЧе*ИJЉ ФЈ§ЌzЛ;ХИVЇ§Ќvл‘Њ ELbrхFpŽцХŸЋIсЖ^ЪgŽвuFd Њѕ\lЖБьпk7СшИ2 єoЖБ”YMЏп „‹šH1ІlХlюЂBБВJо,~"4'JЧ”ѓЙЬсIіђтp7чwAЇЉЅСІЉCєCНЇѕ\)ёЧЎRеU‰Я_”—ѓЉoИTь'RчАШдђgщЃуУН­ЭCЕїlUt„VW6u;Sšuожє'а“„пM3 бRJgЇЙJ2rlРKЊєіJW9ХІ.ётYцxgs}mЛ’LчЖ:8“ ЛщјKP@apШ#уко)ХR?=)д(ž л3UY˜љ:YpZYцЋч›ќэПџц§iq§Ииkm\НЭ^fNїз—зwвVjWЌ#4уi=}W‘Ehъv‚юaьf/‹l-Ю•ы ˆЈщaW{­-§ю7Пљэяп­І)†џBžWуdЂуr)BЇWџ№ЛwЇU†W47MШu~–н[нмн“бл8ьšЭЉqЇ  1ž ™`ЭƒћИ}|z|vДŸ+• —ДЌnœ„„Ffkmyeuћ лqя€№j3ФgКЖЪ“K›'%ŠQVНf{JK|5{žнкмлbСэxŠtЭVђ<Э…PчЉДкН№lcskg{{']Ўз йјДƒѓPшгЃмeс4_І`Ș'jDр_7їRц .eMа7cW­_жeЂi+(nЇпru\|–-oяmVлЌ!`дnЖ[fъЃО№œнJ0G”Сš‹‹Ћ['…:УГЅ"Ї=юt›:И_цœ'R`‰hІуzЎукЏlL_aaФЙЭсѕэu/і€ch^шъ,$6DO#’РrEРМЭ‹d€1єkЖ№"dM-ргш/qЇŸW!3јАЖ^f'uA!^Џ‘)^PŠaRИвоW.yЋ šэxЭбЭ§гэ(ДTХ№#OeъМdw{@—їЪ•z9{ИulbХuFфшtbœQlБTƒZwzЦўтђтТъ~6WсeE‘„*-Ћ3№eБQЎŠ€$:  o'W§fрЙЏ[ЩIЉ@‚]?щєЧїw}пдє ЖхF—œ^ЏщFУst!sАЫЖЛmŒ‰гBtЇ\Џ5-”сRZјЖ[дњђЪТтN&—Ћ ’ ,UlШFgр€Kзy— [–› СBзWРБ^7 Zэщ П3ОюЧ~иŽu™Ў В3$†$ђ4K4EЈ]œn_ј=№[€g\u<ЅЈш+SрŽтЖ}ВИДДМ˜WЂEYstIИЌ ZghШ\›У‹IZНёd<‚,9ёlћu‘ВЃ№nZ%ьммŽ‡ЃQЈKtEНс CГuQхЫљУ yZjB‡nNi:4‚HГеX_Y^кЪ* Ч Šюл"_Ћ‹VПЇJ№юd5ъ_ЧWззƒЄ7n6x•ЮЉУR­СА<ЯђФˆЧїїw7“HWшЊHЂQп…˜PЅd wAhм;7ЛSŠ„Ѕ&,‘%SШЁоNzqiaѕфВТ  f 1’3H™ІDХŒ'wЗЗЃvАгyк+Уфvц$›9Эžъ’ юяюЎ]iа’šŒЖФз‹ИšбЗ5БtvМWђ1"bеїХТИ —)ЗРшnyuyeeїЂD+šІЪФŽ[* Z2 ˆD5Ра“›ЩЭЭИэš„,)тkї ьВй“ƒУГ2Їйб№юсў~+)zћzрHBЙ iVˆћЈѓЬў.хЃЅЇ Џ‹stm„№u—к^Z[н<.Tм%ЫFды…† 6ъБКз7уыqз‹ЩЊ"О>$юrљмyЁ&УIFwPšceН{{х)BЉDtЗгKL/œnl•Д(ъ4яBК1хЄШАЃМГИКЖЖsZb%LER§оАзn &]lаЂŒon&“+ˆŽ2Ыˆ’јњфQЁP.Wfа›<~zКŸ4M‰ЁE­s=UЉNЉ†зvUЎeЖ—73 Эё|ˆћКЂш.І(‘Сœm-/--­с;“­0†яЋ^Їп^MЎТЁЁwуёd2N4™oаЌ(НОžw’/жъИэЪєку‡OŸžю&-‹А” ю1ŽU‰ЂUУяŒF0:й‹Ѓm <[гћ*ЇgЙѓŠ)ЌуL*ЕБВВККМ~tV‰зnG&б}ШsЃбѕ•'Б йLnЏZqЋ7lЉЂШ4с VКd HеqНС№ігчЯп=нѕ=UhHFчцІ цЅˆі†Ѓ–IјRzwmmumz_њє№№hw?ЫЫхќQ*ЕКККОБВ•.0’оєcS3ќІ^чтёаYN ЏЦЎš~kP†e_?ЅxšЮU‘ѕ:akpѓјщѓЇO“Ф ЂdіooZšHБ]нСАg)b%}ИБКК2Няј"v__пмй?8инKonЌЏЎюœ\rЂйПЕм@ЅгBwф)Ђъ n;šˆoШЕ$№LНќjSщУгŠ@pCљфсщщгУ(Ж5Эннt ‘T‰{§^пf9ўИВЖ<Нoујx |bЎ­­­­ЌlЄЫРZWЃnqVЮmmцТqlТАИЙMXз5+Б^Џ1Zь№0OЫ€єbиnH§єє0юФQџцюvhЫМh†- }_–˜\vwzпкњDьЅU„цеPzyyyueч4W$gJуZ&юpeљPПю%Iїп›ТQ0|ў+Ѓьь\в‚ŒЅnU3Т+АѕгУнѕјіюцњ*дTзћэt%‘ЛЬ€AЇї-Ѓ€ж№cўр…ЅхЕƒь-Šўh4ъЕ[­l//юJубшъ~[И9i>пЈ—JеЪы•оƒ‘XcМ:3шoяQрчнѕАх9ИА*‰ Я“EЁZLЏП(  l3/-ƒŸ/XXћ˜ЮцPКп6dъ\vceyO]]пм€ кОp,/Jб’$ЩЏЏBž”е00ѓV$RЃnot}r{4dƒ€KЗ ‘сišЧэѓ№Z5ѕѕО:ХшњісhЧЭЄЙŽ“Lюсѓ§э №ШAWЕв†*ёT1›.фЇї‡#п†и)лžШ`YДТUN+/‰Њ‹Ыj!m š`аќ=З7ІV.з9YСђљЅSšхDУЩн„№Ow“A+phєpџєxN=С•аXѕї-АŒа(h.7НэЂп—Ju-lJ-„+чœ\Јв<МмAрaэКлЧcˆрз%–m`Ц Kљ‚9 \им‚ЌіЛ?џљ; x§VшЧУћЧЯSЏB\ІК&JБQЁ4хYщМMюe-lYЅ‹*Ў)ШБ&UЃ8‘їr=H [\4Кšмсѓп_љшЧЁs,C3’ќ%kdС? ЖFЈѕЇ‡ы!№ћофсгуd^уaПƒ[m}K%В„ ŸЪdІЗ]ђGЧEХ ›‰X,сJЁnHT“Хp]?NšгЕcУЋё €оуИy№№Иі/П БЗg?ƒМоОmKФSM4г‹|}F;V‰хэСdс ВЎЮdhИЛSъ/СџЄВGляVЖwђRљ9"ІОўъWПšъ§ЭзЯ 5ЎzИЗџœBІы@фTГ8Aб[зО*ж)IбuгV0“E›0ЗƒЗХ–*qЂт ћ BсN”А‚uКЗМАПП[’Љ—eл_}=Е4ШWЯъ,utxvќœBІJ"юЮP!э-ћ*{–Ѕs:c9#S нvМ0Д BWxеъєав"`‡ЌЪЄcyћј`+§уŠmаєў‰вTхpёЈtўђ"Ъ"бЮц‹8pЊBv7ХЊXMŸЩ:фЉрОcл6u>EIФhіB аfњŠ„Lr{§уq&ГЖ’ЉНЬЬЃЖ`ыoРMž/”Я6?ьхѓйчOћЅЉ ƒc‹ Yї'-M)Cњ›Т ЫЬt†FЧНzr ‚Б“n q….PАЉджжQ:wДИpPz)ВLѕE—ўъХвеђщіњaюEщ“‚ФIг…Ї%нѕ 3žЁВ?Œ„RUе ;Ё.ѓ<YЊBф†И‘Ю|\й=/еџЂєЏІу№e В"UмпLП bсЌЁ {(И„кєЃРдпf];MлDE5ќю АЩЯћЃLіxguЏФp/5–Љ{ Ъ_Н(­Bђ]пк=ўT?Kё*C‹Е”b;­A`Zov

Ћ ќуп~§у—”$Јžџ•пЧЫŠњЅЛз пИ`<ы/ŸПњњё~§яQњ”›ё‘4_,t‰ћe–ŽЮe.s™Ы/!фт'~џЧџњ§ўјЇЕ§эЏэџќ:§M1ђ?љ№nё§ЛwяоЏяюl§xэрчзщ“їKЫЫЋЫ ы[?ўxэјдg.џTВПГДДПЕИМ™ОќЅUљћ%{ИМtјqqѕ ?Ы#оXЪ—[kЧл Йъ/y|њ?(,Ÿљx’Z9Ђоvжl…S*ћ'Љѓ_ў|§@UШžІR—_А@цч—™Щ P?ГШъ?YУˆПGѕ-я~#с•AЅйEЅyљ_PiцKі1§bђЏЈѓ\цђ? nћ™:ŸЬVь_ZзШП"mšЫ\ц2—ЙЬe.s™Ы\ц2—ЙЬe.s™Ы\ц2—ЙЬe.s™Ы\ц2—ЙЬe.s™Ы\ц2—ЙЬe.s™Ы\ц2—ЙќГHUPўЇЃЎыœ$Ы_x\њЬЄ^ЋQ <-ЯhІЁqЉџgW-›ƒž&ќ3lЅ9Oќ4_IeŠМЂš† ќФš —ЂEЎŠ:c“ьœЪВПш– Ze™Ј†i„ЋЇВg5ХВlUўKЇQNcDS­Ÿ?7ВmKХ5"ВϘНI5mЧБmЧ64™ЇKg9JХ4Uћa‡œipЖNŸNћwa;3зs@LC˜ŸнЛiК–ЂУёƒ0№LC%Š" t ћž€нС]^Œ ^lВ‡GЉ ЇрБуNдŒпї|Ч2dЎёsк›ё8UЭ Ѓ(| оЗBtUUиђEQвuЧ"*‘ІЇ^ šЃеO 4МУВ?Š}&š:oЗšи21‰lY‰эYВlxv“пVmA…—ЊЩиФdк№ЛПbtKU5ЂˆHtЕ!ыЎ.NЯл-Зqt!й№|~Œњ†A7[‰G8^w]M”4L@Ш[ž№ЧЉhSI1,l§ Nэ‡г&wIфYКnX–* €dз}>KЏ$xЃ<мa‹Ъ$pLг†ƒMn‰(›ОN­иО­ЉГi‹ўз„0`bИAрZІnи~‚cл'bиRLž%=Ж Wd].});Aƒ9Ояш8d-У #[ зГžзCoFшџšЈЎЏеё]л 28H„}“8Ц>бaшZ 5aY$ЎNг,†LоVr5#Šžп„ ояшЂ„=гм д%ХЯf:ЇіF~ЭІ Z^`ШФСжК>зА_fЇ{–Ё МBWЅi™K‰qеŠХг5•Ј&„qзбy ƒКmc@x>›0,ёBыmі™3Š&ˆЖg"'3ˆ#bИeк^р9ž6лэФ7!ž ЊfЋ,Ѓъ~КЇѓ8Гo[НсEЈІiСАр јˆщGjНayЊDѓŽЏОjЈšШ;AРmU;Ž\PXW5МB7„ИРœSfd€3№]3ˆиN”@HdЂ™šФЫ@іlгTAЕLЭё”*уy&_|Wy‘M™гсerЌ {вЉЁЯКЦЮ~DК$q Uф­ ААyЎš^„ЁMDQрhšfXZа-єledр:<žІФЊОЃЬўY…№šЇ+<„D?ђ*TEwІalŠcБ4Фf;М(„зЖУ(0EˆсšЊˆ:гЈ7dЭТ€(3Ќa*ZХВ-БABcц;rEU’=Sh4xј{\Sз$‹ч^ƒj’ˆATЭђ!Fz`sdћ/{~ г5!LКЮGеYIuaш4‹я"ђeј–ХRЖ;ыƒ-yФ OЌ5Х‹Е;-Hр-иLDЌh4H КЌђ’]:д1aЩЌnp BuьМ:М pОЮDє !эиГбХ‹†Уh€=‘ цˆ­nыˆВЅii&OыdЫД _јpЮ–ЪЩЖDW;ВЊ9ЖГ7„9Г_ЕУ ц;Ь‡§~ќS“AђƒU5нB–^ѓЮє’а0t еt Юm4 CЖC|љѓDЛ]ˆшnН-iЖ`yЮЦЎсԘ^ІбnрJDЕ%ишЩђьѕу“тx љg8yи3И.Ј3b Ш€H5лQ>УБО”.Pн6$Cг†ыD=P ў6$Хў'”Ю ‘-4rЛEhЉ"“MЮ†˜щХс›сЅиьд„фcИ™a`CZщ”ЪA_јXпVЅTЇСgфГjaѕгЧТƒцѕBЏ7žЮY)8xЁУ•wзR ‚ш”Вћ--ьCˆ s я…€$ЎnЪTWЖЫr=~ЋTD‘yб№ HВн$КT‡ЄeрЖ г,!‹†@vГТ!ђRШжCШ*Ыхг+KoзЗЗгЩ•­’F˜|и™t<ъљAh­1-Z…œqцZ–о-SЯoѕљзжцŽ&H‚ Z”Ђу="МMхшиYЭяC2vzвГ LЖaњA œЎ-§јувлЗKKKЋ9.ˆАЧчЉ'ЃаЖм(і€•’ЌюB šdй[(uъЅrЅжf^ІфKѓ‚Ш7&ˆZK˜—kM B’llХ…шзŸ€Ы Аo(&ёьztњЧ•нЎ|ЕWzн њ• Щ’лRn4OЊЅ|Ѕжт`šМЅІYAyŽЁЛЕ-ъ:$tЯUb#4YЕ‚ є"иСщу•З?.-Н]^^ZZоl{Чя !@ 'ъ† Ш2ЄЎь:ЏTлFћЄT(V”Ќы†ђтЅ #- <Я2ZƒбdМЩ­АавРa^0AeGQDRneљЧхх••eАt+e№mцЄъlЉ;„•бЅМ–Y›ЇшЋ™ ю_рVіл–A] ,нЊДhј›Ъr@—‡+€›Ѓёœ˜ічY<W–!6Рk№{НюѕЂ|H0“бtь™0Ъšƒ|OЅ/:К`Ј$Y/ђеfв­ЉєtХРPKи(“Њ—ёіЗЮАЊщЯIVдwmD1&—ФHJ‡oqœп.уPЏ–сŠ@Ь€г ЦЃОmиО!ЂА]“ш(ЖЇp|Ћ\*W$\Ц^_чf#…э‰ч­:љ#h­ZЖo ’nzЁ­;§1ЪVЌј,ЁДЗ у4„И^9БёЮL1 2rа‹њЬSQ`(RTm­K4ѓЧљЃУrН+с=І—\+iиуžэЋmRрdаz–ФъЄЭ†ЃЙЁхсь3Ы+K0Ъ"Ыo ,~/юcn‘ЅЈЖ-kˆХ+"YЋ— …мAЁNЫК ”U“љP/MŠзu&#UЊ6ЊmІИЮ3"]гƒ>І;ФŽ~Ќ3КˆлKItї-„tr9ЃєIwБA,Lж.ŽoIВeJŠb^g™nЋRЋUJЧ‡…­ъ№ЅUс_­)VžїйzЅzRюŠЊСDМ(й:#v€hoщœ]J.CnYNB”,eфОб$нюћƒqьHИtХдN…Ь$4kЕFЋY­ŽђѕЎ Т”єN7IFT>XЖUЋšm^nГ ] ˜эЬО>Jё~h‰еЬ‘фыхЕy:\N‚зosj(в’ц‚‹‡=KRмШUKю‚зјFЉж&ZЕVЋPhRЂуojЂ№lЈ&л$ТБ ЫД+Е“bЕF‘M+p 3\˜ь–!ƒыфIіXt,ЉИЕЖК “0Й’Ьtь€пйЎГЂцѕ/ ]f[рˆ‚Сtu“'ыеfш?й­фы-Še BN{nL“4Щp]ЂнjdЗS.žфKеzЅaX&з.я(VЂ*DžI—‹ ИцAеN2Щхtf?Oƒ^`Ж7ѓmVБ<РХЗБчИ/‘ŠТЈZЗйld‡ 9Ё™Џ– -š“ Чзž9в­.зЅСщfЕ\ЎwZХќЩёiсєИФBKє1<Рёz}_c(бѕнАч[*uИ[cDНзsх4{R…‰`zŽaљОЪIКcВŒLбLГVo]šтЙЫe,о:ŸЙМЉеЄHЂгjд+…“гbхєфtџ№poП&uкІojŠс9 œАуuZВ…aЉ1ДЛ Ioа B­T$Зe r ЯTыG]Э +•6-€œ7]Я2dсeKsIВ ˆЗўуџ№ЧЅНЃгRƒdеЈgЪ@k*‡GХУ­ЭЭ­ck6ТвЦp.бёЙПу!>ФE1<Дї:]офk•ЈeE7ь(Mр™ђюкпїэ$7іЋ]љ™ы™HFТ5н:нzћчЅэb­о!i^ы ЊKSкЯwгл[y†ѕ „Ÿэg AV2_Л7OzеЭэbНУ5ђu‚Fjd8НсDР6sйЭЗ?,mž68нtL•ђргВa—J5ЗwЫ$Ч #jёЌg*р5yД_(dЖв[ќt<GC\ЋЯg$жAb<є>Lfоёњњюa._Ј6жЋT3Œa‚Š|чxџј(wPn ’уyDђYЮj†ЎИЈ4p@mvGыŽЅђœЈѕЯРж +{Чѕ“tК : YGдЧU†8ф fњ}фRXїO”ЕT*•о+,CƒШтХŠЇгž& мA ˜`щ|+dVпЕь'8нULгv‚Сєђъ|{ИvQѓт@чa…gcO!ЌлљrЛžлZЋ ІЃљ‚в—Ÿ‚}шyM P{:$жSЋЫ+[Ч0 EI$+Є(Њ=pZ˜ЦI‰T наTаљƒ JрРБŸ o9гбŸ\^_пмнŒ}аF8єš:щІ˜6E0ŽУ–Ц&цѕ/˜ŽƒAr#fqќQ<ѕѓи3q§ мbс"ЩИœЙ’H4Ќ€КšDVŠіlќ)СЬ)в<1џ@ЏaдGюi2ЕЖ[iq Hbpz4tEŽSЂЫОЬЏИgзїЗГPз$Žцћžšы4Aд‹љ|ОJЋVtN_гДl ЏgŽР5к€'“IЃR=кoFsЦ1ЏыP `yАёnм'гЋЋ‡URТRБi‡Уйя}Я\™ыа’жŒКПŒ!eБ LpŽyЊцjƒЖыд+•ZGаьойнууmOЛЌlNo/ЉQš_œ -UЌŸьярѕh<LpёЬ‡8Ц‰‰ыm&›ZOэеР=?4 †ГщЈOЮg–DЗ9Хš\помžјƒјчEсщх 25нi4+орђснЛћЁЅ€јЗfї—žЬЖXн]^Эy xW9PsИѓЩЯяСщ‡ _уК’=ЛЙШЃE3_L•Џхv2й“Z ’ЈNђ…:пеv &БЗ >ЇзЖvЫŒhNЮЯgx/д­ь”йu$ГЌdnЮњa8щ[’ЌРЊіф5…ѕАЎ ш–NЎ?М+кчЗ7CMРjафlvvцЉbыфds3ГwK$Ž Ч‡ћЧЧЧ…r­VЏs‰­дњVzmч ЦЫЮйѕѕљ ]Ь$зJўUOс%spsхыЊnО ФR‘eEyrн”$)h >ЭэMЎюпП; EЎюn'–„jz6ŸћЊк==йZ]Koo'щЃzawgk{g?—;инйLlnЌolІ6ws-Q ЯЏ.ЯЇЃAX_[^кdЮІžiЧ—їcMхЉkŠ$тm‡gTе;-дљ’fZЖз_> зwg‘ыУTП;4Э†шt> ‰*œnЏЎ­ЏЏ%Ћ[…Ѓ­Tjuu}#НБЖЖšXM­­ІR™У%*ёѕхХљtм—іW–п&‹§‹с`|qw7а€Щ09šІЊёdŸz)_ls(цLЫ‹1Л<>>\ŸЛНyЎ;БЂў и%].e’ЉѕЕT"‘JmЌ'WWбее$Є”Dre%ЙžкЭW)Q]_ЮЮЯ†f=НœL.gЫѓы[ЛЁЎтђe‘яЖжs4cЉttt\jбМ +šnюпН{џxћps6ХнИšMГ#Rz­”7зpЄ?9œ„БoSЋ‰ЕЕјН_”ж‡Гё(і•Ц^ъm2ЙВЅ]^омп]пNt wi$Э=#ь{ЖаЪяЏ//­,ЏdєЋ››л;˜ж:L?з[р4TхЇwВ<ЈбРMSWAЂwѓpwsџюўсўўюц,ЦЕв}ЯPAxш2Ч“хL2Йž^OРРЎСФƒиX]›ybЗpВЙœ<,ЗAЈѕ|Вg&Н‚ЗdRљbуюююІ7ŸИЗш”њфЁ5ыгJX`ŠNџъўцц\~ИЛППЙšM'Ѓ8ВH—x*dSщ§ƒ-@­ЭЭЭэЭдZzkk+ШЕКХTъИJp‚иTЅp|MCШЌхјєннuЄТ‡nXЖыššўффТ8№^ˆeцСpvћx{qqsџp‹C}{u1EИь{ОУд"UмYЯе р4фОьСnv#•ZпоЯэfURїз4ЧЉЎŠЫ};rюрЈІŒnpNпнЮQфыКiћЁgjк“цъњуГkјр{˜€7Г‹ЛЧ{tњўіцtм|?‚NgВЖN'WrЌ)Б­НЭнЃќq&“ЈЕDЇЖuмdxбА€œKpѕAЊXбьъъњњъцюЖЏK еххO›Ы]ѓзНчџАДѕGWЗ ?|ќщућwЗчgЗяРЅnІУjБљ†fE ‹ћ;кH$–6љЋћЩ [э.гj5'Uв wѓbнRШўќбєт Фее|TOˆf„Ў,ЯЗќыO_ IЊЖ7ММЄћј—џѓгOяnр/М{dІЮе–ўЃРїpћ$Хт1ЉжwРщїН›ŠЊЫ #њНDіЄLгЧ%‚%nlЕx<9ЛьИЦ‰8‚ЉЬђг‚ koк3іq †(6?ќєгЧ=юоxПoЏЯЯІу!њŠ,vKЇuАNodiЈН“r‡'ŠecШфŽkэB­ƒNуbBРїЈњfr~yu yУ77@jцЃЊ*ЯX+KыИ~оэMЏяоќŒ  руbМЙ…И+d•гR!НВšHlя–сНћGЧE’iD"›л?(ыШWХРe‘Нўp<™LІрє :§№x;ХЁ­ЋŠЬсN‚g­яuІ™н›\\\оНƒаўјёУћяащѓ)ˆЉРГ5U%‘i”KG™дjœЮС[‹ŽE7Pл'‰§У§LЎдТR)nьУУp5Юt†)ќf5Аšћ›ыЫ)ю}§и NhУэ&ГЫыЧsŸ!LюoЏ/ІУ8ttмЬ—•k*•У Шл‰ФжіМГ™вNGv3БППŸ9ЈЕšŒ(IВnћQмыуBНГѓЫ90Н{x„O…АЛ™ХЎёНЈE€4М#;œ^>|ќщ=тШ#њ<Ž#‹д G7Ž*ХƒЕфJ 3тОЯ‚|4œœЅФсо.`й xАУ0ЯБќh0™ззЗsіюУO>|xwsоƒ+їќе2@?—|ч?}Фљјўў.eр2ЧсоВnГМЗQlŽ6“ЋЦWS0JGНСtЌЃгGе6Yot!РЅƒШ`^є›^ммі|€€ZѓюўvšЦѓHЙA„х­щУЧїњ>>о]ЭОЅAJ8*Q8мнIЏW;хтn*Н‰#НŽ#эіGмDЩ%іВйуZƒj—H™Бк*ŠЊлCИьOЏ0Уо^ŸG“3 |W#з4žНšЗ,/ьѕ€вЭюпџє—П||џx{ћІ*al€jЮЄг››; ВQЯ­oAdl ?MЊzЖcJ­D6ГЙЙмъœwp_œ(ѓаЧ­Хсфђіўю(†сХЭѕи}JџlѓPqo0ЛЙ‡,ѓ@М‹Оch@~yqйЯf2лGU<ЩmmСHo­C.OVЛ<ШjЌ'vіSЉЕНbЙF1Р•Й. нД Iekp P=і чш†н;ПžРУgћœP,+Фћ&уѓ[ ЩoG.ˆ9мWMръђB.Г-6ЊйєСAœоХсNМ]ло;)5л-2БZн’š>ю0 жл№Ÿ<Џ›J'ЉСйээЬRЇœСlшМ@L Xўp:ž]о§ИЛЙЦ:‚ ‘С3d•Qљ`sуАt|Nіaїгaп~ї‡?§љ‡Е\Jlюw*[ЉхЅєiЂ/8Ф ЃЎЪ fegz{*\7<‹ЧХігjМџеX ^§9І>м__\]\оŽMY сRzœЮgв™ЃнЕѕ“г @єюЪї№Жзo^Пљъ›?Ќфі­Щ\zѕэrбкСЛЕ"/JжфіТSDŽaE\п‹^": >l'žпм]Ѓ`8ЛМьЦЭ­ZЃ зћh{ы`#^]н­фrШˆўоѕХЋW_Мzѓѕ3 лŠdak=ЙМœ8˜‡G‹ ЋDs|3ЖКwџА’хh/Вн…6,З79ПЙР]@v|vжг%QтiВYo0влЛыЫkЫ+ЧЕ|\кјуWшє_Мz§цЫя T А;…єN&НœHЭ?1O+Ÿœщioњ†BTšнљ=\л0^Тgˆjƒй,Тйbј“ѓ„ЇШбDГA’pБЗ\кLЏ$Ъ-аdхЛ7Ÿœ~§цЭыЏŠ $(Зœ==XKќ0џРSBRU’ŠSЬс \Йі).c +}Ÿ]A} aЎ>ЮBMa ‰v›ЦВЪСов™фвV­‹+Эџуыз№ІWџіХыWЏ^}ѕ'\ЭЬvv~и<љуќ Є„Q­pxO+ОŽMЙuШ.hъЫФЦм$УЖqџЧ(€JгH—dЎг&‚D,и_]Jяf3oџ}ЋУгЬў}юєџіъеызЏПљwq|:•ЩeЋѓЯ;jёŠЊЊ2зІ5Гw=ДдЮ>ЯМфqЬ|1Ж.,ѕpж7d™эEAx&›KЩЬNfу‡Е ѓ3‘јгWsЇП@ЇПќњ€pЊЃЫЕtњ(—иš^ЎDKXхш&hU/ІюгХїп1Q1 U"ШхhвЗ‰#Љљa:Ч€hoгЛћ{ыUI6pњЯп~ џ0шWoО‚‘ІAПgфSйУŸ?Ўtк№ФљpDgчў34сп3V@šЫ)ЊNb ()CЯЋБУЉэl.“>Q|7ђсЩ?|ƒёќœў“Нiї˜ѕѕƒŸ?Œ(UМŒЫ` е F3пј,C§Гё@тƒФДШsПpѕЕЬўсбЦ6с‡О‹ќьЋЏ=^НўђЫ7oо|‰ЃЮњНСР8Xн§љtЋšш~:M…|{†љт'’ќЕзЂbљЎ*!ўЯчВ‡Xš9‘OŸ/Gњђѕ+јљХыЏОњќ=V5Е§ѓ;$щ—КЈŒ+9mгј<Ї}2V–TodвП:DВŸЫfЋT—"?УЦћ—Гъ/Š‡8ъ'{;e‚Ђ_~AїKZ§зG3‰гƒєqЋЫўЎчzџіыzEВY„Ÿљ§дnЙMўsЯФ_я9Д •\vu3џйЗ‚Мœ‘Ч{‰dњшїіф1”ŠЛ‰е­Уџё•џD†0XЮўоŽќЃЃŒwўЕьœN§оN,la [иoc™плЇиПяј—6ўљSв3ožb/yдрТЖА…-la [иТЖА…-la [иТЖА…-la [иТЖА…-la [иТЖА…-la [иТЖА…-ьџ;kѓ"џп6ayсѓї‹ћ_[‡ТУ(:‘(ДxЭTџЖлœЌ(Š@Еџ 6‘“`]^Ф3М46Q(гŠЌџЯŽ‹љСŒfКІЪЯv?ЏЛПg$‹Ї@ŠЊЌš–mˆDЅXUkі—]з<=ŸRLЭРcйпЂwмc” СИxz9іхйvщД­Z–ЁpџЙ›:N$ZирЧАќ0№=S“июяq!(šхyAИ–ЎтA–LЇ^эъІiišљЉгЙ—!П“h Вf˜–…О-4žхЙпxVR4У2ŒЈыКхИОчљЎe˜šЂiнhp_Ѕk' ш&•лKаі–mС515]7l'ЪBї7œ•Œˆ БE˜Vи .ТŸЎ‰ s5•o–:‚ЊлІЏР—v;W`d—M7ŒzОgi+ъNшЈ’$Ы/бљeœ(Ы"ЯЩšІ›Жє |зБlЯВ”ИVUгеX AЄ*ЕНВ BxИНС`<Ц=Я”рнІчhВ"‹П vѓЊ"a39гv=ˆ з…0 ‚РГT  XZUR‚йШHxњX‘U+„Ў™ЎЮ[˜њA? :8Щєl…Ч€XћМ. ћь*ВљXЧЁcУ}/H3ДйŽќИjŽђщly3DѕЛš$)V':s?IгlХНeщзd­ШЉWЗdЛSбв<›_' QkšjКAр…IhШЊІ({ЮЇчјЛІŠюЦIЈ‹М€hRлУШf鈆ŽDŽmrЗc„2ƒKЮ(ЊгkКЃЂsпmš‚О„єbфЛыщœ  ўF_–D^6\ >^šИ^œxЊцФ‰­Ÿ:ЅяtZЖУ@}Ж“<\.б|~„"ЪŠЂЈ–;ŸХ’ЧŽю†qфћИ aXh €vфО)ѓ†-ѕ{]бАlSэЗ%Ф8 Щ б#ЕЧ —EЛеv_1Т УT / CъѕzŒ(ЫЊІ™r>ˆВ, Ђ€В]7,?ёmGCюSбlHфР!№†ЎQ1РЙb_•(2…Gяж,ožоэШЈ”.)ІЏhJ‡гmš~ю GбТ uшкѓŒ‰ђ(ˆ[†ЦžхX.ZЕІY Ч#=„ЦCУ[RпдœШч]г№Ђы‰н&oњyц{ЊlDц%ЅЧЈКчЛ–IGЯ{­щ pХ@јЎ‹n'~ššХHqУ“ФвУHe…эЕы-Э ALМиаyьœfD#в[.тœ‡Ў%[№гP У­F@—hВСЗьY–!ш&qWУЅ9(ŒЪ‰м€†’р…ћВnˆLЇеdЬаЖКtvєШ­šхP3BЃ!8Q4#АQ „твdа{[Q]:ћWЛH}CХUPР†‚4Oiя(‹Ѓ,ŒSЯDPSOѕfГn$Ж`2ІѓШД , ньы>љlЊБ(%3IЉQИІšДiк• lЂ#IUЏЪ$ ЧГйХххеХlv6р{ТиV}рзmд%q ЛoYі# YВ]Жв”є_ЫtKŽ;F@#zќЭ”Ті@кађŠa –dЭ4 ™чЏ  (——ГйхѕХХyРц@ЙлlіYuЎ`€{^/KЏжЮX'„ЎВTAчyPќhж A=Ђ„&t рЭ“ё00h№2^GїіГ М>ŸMЦч“MB ДТ8t]•яtњ,кЖуЁ ыQѓCPLЇжQЃ8tlahš X1рƒаЬ)/Ц4кIИ‡ТбIяЈОСј|6Ѓ™Э$N6<Ϙ&i`кК"є:r—‚КflћtDљcЕ=Иl4jвСЕЎкщvEy~I!_hюkQLgчГщєЃЯУЬyQRTšшЁjў€ІM1iЩ0гЩ9ќЮBR>†.t ­ЧYA ћ "ѕcE[”$C8m™O|Й^nѕ%ЭЭtн$I†#Э=™]\\ЬЮЇ4)xT*ЫаAŠ"ev0Є)Б“!b ­…ЌвЩьм_p]CрЖЅњЁ,'ОN§H‚‘U@л:5UшsXя Ђ.МіЃ4Ѕqб4Akix4Цš(РaYЃQі žLЦс(Кц'C|_–x"Gj™zЛяЦ&уљђCWc8zБвЁQE–хVњ†ъїа6@:3Šь Ki$ељЧёЦЃafI3Б(Э№всh2ЅqЧ9$­ Jb(нЩdаŒа ћВ-ДŒахM( ОD‹*сuП/єkЂвЌ9Ъ^Y§їШO№љb\Єј Nѓбн„9^кhЅДf4ЂЙ]œc‚žРБC `|>ЁхVОЅ-С 5ˆе-ѕX^{hьёэ(3œЖл/k2ЈhFœЄhЪуœж‘'Х„КZAKф5‘‹,š(yn`є;uоБигуГ“RНѓxGЮvиЎjs+ЅQЂQ’ваL"Y‘ЧžЧqŠ№І)Р0Фi §<жчE’އ­шЅ1ZѓW­t%ОU>)WJ} р‘&Žt;=EьHЊ†РТ­œŽЈƒi‚фЅIRŒ-hxHг8Ы№WPQ–щ'4НqŒ2уEMЇУ4JŠ ˆт›М%ѓ˜CЅ[RыЌвnз*ЇgЕR—7A˜їЂ[h7eЫБAьвШЁiH еaЬH†РУѓ)€%Ы Ж.“Ю˜ЭЊfКq˜N–z н† РфBЏЯ+ѓэ рPѕVGPЭƒPwэ-4ѕ€!=%tQ$ІQmБpКzЦŽ(КQьvœФ! е™ГНc=RЇ]олX\Xйи:тм(х6Ž№нq;†—Ц&Ък Q–щ1ВЊб|RпbЋеjГЧIF+Ÿеъ•3pхZЯPЪК‹§0ЄFŽ‚…ж* `NГ"{ANаДwЗ["ЈЈЋZБяH=М\oBeбMгv‘|b§Є||ТYюќЧкG*лЂлkІЬГ§vЃбЌž5ЛНN§Дkш/+H}Э D5K"К!—ЯйžЉDјh}žлђYНЃ€…› (Эѕl4§ЮёiƒЅ]*†эo…цёЩiEЂ=s–*?@о"у ‚лж%ИL’Ј\9н;юЫŠ,іъMVѕT=L2OтD;Fлв,…xЩƒ,єщ}ANgЎдэtz’уƒиB=Х‘иNНбъА2Œmšп8:>9 œ ўAŠœбtе4$К…gЛэvуьјД|мІѕP EYg5“%Дg@ЫУ<ЯгNGј?‚ž“<uЖ]oЂ%-t-W—DІгуdQрEQ5,УВtБszxtвGŠ?”/БЊŽ\цEAwЎ7ъ•У“Г*э}$ІЪЖ[ŒфЛŽcё5ЦвZ/pqTфY№с (ƒlУ"Oь~Нж–™uУѕеN›‘TКгЈАH$ЁиЋьnoПjiцпиcћSLФъrП‰к;=9==8iЕQёш&Š$qэ–lъЎm uоCrуТ=_аƒb:ЇёъДœ'jЛVхc­Ѕ†fЩ ИЊNyAqEU“ицбквкVEЖь‡ГЅ–ЌiКдЉ•їіvїOъНЏ˜Д Aљ^ЛЧ`Н ŒР™Р@ЦДІN7š/ІуЭ|Љ}R М~Нв0•КиЂРБМfў№‚ БLa[G›п§ўљ‹ё1œ.uyQ‘њЪсЋэлћ•NŸсe; Uц:zЕжЙіЩiзимiZL _Ї3ђО#gŠTЊŸœp\]є,ОЫJ z№”6нШlЋ^9йZјњwпmžpбУ ‘Ќн@ЦnЏ­южк}–dw”бЬржЩосййёСЋЭnL+ъФѕрхЧˆŸг)о­˜ Н~Илf›Š-Б I|тоХ і,EюНкл]yў‡члЧmш;з|Рўй6Я3PВВ„н:лоиЉМРs`в“ЁЅЉBїье^ЅvАЕЕўЂ•€NўtзeLJ†-–бЦёp0‡­­Е2‹і@ ІщРСdpњьi _9ЊVЗ—ЗN*эОъ$€XCс…OИg$ŠŠжрвТЈRuoяДf'qœlO'р˜Šа­Ukћ›kЋѕNOЮуб|{сќ–ж„В{XŒЧгa>š$Ы‡`\‚o/_Ь†@ЁYэі›gЧЕ^‘,/ŠВ ДРѓ2CэЛaљA”Ф\SЌеХєlM@NOЇ Х!AЪъюњj5ЂлDД^C n8/?И\@тзt ЕззV_ž@ ђ,+ˆ’ЄN:Й<MUъ6ћ<зыH:Ае гbLCџ' ХѓvƒбьђъrœХ‘ЏHЊО.š5ОˆMEU…^хЄЭvЫл+'>хнР@‹ЮщУ1вx>ЄѕЅЩt8<ЫЫЫ+ы-џR™&Ћnqq‘˜Квk1јžэZ–ІWWгQ‘D?}6‚‘?˜œ_Пyћў§§Э,ДЈt RЩkж№*ЗTU˜Ѓ*B{ouЯžЬ3Mšъ‘фзpˆпђƒRІO§ххЅеГО iпь гЫЋXSХ# Ÿ8.’1сGо]OIфќdЇХ0JŠщХнлЗoю^пПН.Bз †#_ч9е^сЊ"?њ]н1UЖВН#І9нa™Ьћ_AMc8˜їьb<бЖVV7Oj]а 2PdDнŠgW‘Ў№œD›…]п“ЩэЛww7—Ѓ,Œ:?эЙQ’Rv\œУ‘ЋћыQ—…CN[ХееРV$Б/8žm(ЃЮ€юЫNў'tŸkH/асУ‚ ВПВКМКWяpКaгв‡&0Њс_њš"*PКу%Хљэ§нЭ9нЛ ]яЇ/œ ^2ПУ™„žују›лЋ‹ылЬR8QwŠЋыТМ0zёhrЕ§Jxwч+шSкеAЋw#Z’фJIZZZ[йЎєDЭ0 gb8+шољ /^R5ф3\ОЙППexОї)sг;ŠO› #l]г§ЩыЗїonb[a%но\eђ.o‡yцлRћшHЅ&W чˆHKеХ>шnш`~‡Ы.­ЎoЗxPQHјс(2T^д‚‹ЉЅМ Й^œ_пнпŽЧPiі“іЬдYкјOt]EщXЩелЗппF–к ov{•‚ ЕT”&~ŒЮэЕ3КЯ<˜п3šsв4$ј.h›z1.˜вкњnUMк@8˜ЬЦОЎ*Fz=ЖV@žLЎ_ПЙ›ež%saІa| (VњИЊ* \ПлЮї'oоИчN—w‰ЁДћІ_\^ž)6Яєн•ЃЕШщNЇ\ЅVьЦGюQ эЎIлkЁШ†г‹ ќ3+˜м L…KЏn^п]Є&šLDўSjKдlT ˆBЏеьЋ–7Кџ§›q‘Œртю2бЅžlGчЏЏЇїДм ЮЇЃ1<žMqъ‚ЖЖQ† Љ“жZimћК5ШёJh{Э^з№ђ:жХ>ЏиЃзЏяп\„†"ё`ЊШ{ѕSД@WжьРs,p "iХыЗяпl€]опЄКЬ~vq{}™[&S>;ыЅч“сdv>;џИяc@ Л ^=ђ[[+ЅЛeFЕsПщфтътттђътц*а9Hб№ъ^ЯРC(<@‚Ѓ}JЄл‚с ˆdt€ъ†УћїяоO}CЌјцў:Зdй ‹Ћлл›sЯ–j`<Н`0&fw>5aژђzXx­ЭЕЕвЮ~Mаќё5љ{qy>ˆвёхэЬS8NuŠлћ7Џ__%&is0(ХO№Й"€HЛЎ>пhxёфэ‡Зя/#KЭфіўvˆмwИКОЙЙŠl­]ЎэеE'Щг8lЉлеКН<Ž­БГООVzyаєxvMЛєІГBiЖХєjъЉˆBz§њіцъђj<ПБшe‚OZDшЫmGБ5‰Wtг ђйляОП+E2(є‹иF^\ЮЮЏnRKяŸAкж: S*UOvw[’IэVщяОX_]/эЖe3НОО†8@–7w6v…й9šˆЭюfЪztр;э|џЄНLЌŒ хšˆТ ›ЫХх›їпјЈЋ9УЛЗї7y€ш_]ŒFГ›Ѓ3еЃЭ­ннН§УЃRiїхЫэЭэ}ЈрГ“§нннЭѕЕхвСI щщ1ƒќ2WŽгЋмѓгй§ыœ–*HЩИ6эВ?mн”UmшlUфx•žSHŠ‹7яо}џсн4є˜з—Г"I Дл<+.GЎСзŽ7Vжж^МxБ4нБЖМКЖŽЯжWз6Ж^ЌЎЌ,•ŽЊœсNoЏЮЇчуaдйZZxіBЛЙœLЏюп^И”…†a™ц|C№'>iЩЪ–kšbП'шР?HЇЗ№љ‡o.Ї—їw@ч, 'У4hqTЁvИОrБВМŠМБМДД*ŠwЫ‹KK+K‹KЅ“&ъ№ђі‚xI.э-/,<[nMoаъоМКДзSU5eОgыSŸхdнвф~ЃоВаќtњцУїп#CоН}џfd›ЈкдтQсЊbуhci•lЅTzБОДВ "Кˆ?K+k+єVJetщшњz иIфУхХч‹‹K'Хн›Зр3пЂ.ЅШЧё‚(ъѓ\Ђ( §vЃZmєb“^~ћП‡}3N’иf•жЦ’дбджС ахЭ58Mё^ІпіъњоЩЋuМ†R_ŽsА{іхТsќZxОŸппН{X‰‘‹ й*(ƒъŸњ$nЇгnv^ЄU^ХДЃЋwпП}ѓюэлwяя“юiЅйю4jЭ.KЫ šкнпX^о:и_‡гЫЫ ‹‹ѓX#ТЋ{=іdmiЕTхT#œСU6ŸЗИ№laiБ<О'Цўfк– Іc™ˆИхXІёЉЗхЮК>fzр Iб_Y’ІvZniУзwwwя€TІ‚Дк>§0`Јы~ђ§ ; гСјт њн‡ўћс‡>МЇXП}ѓњjQт˜єє"wИљJ4+ˆpЉДUюїкх—ыы;ћ[+л‡ћћg­НеR‡v&лЊFw†LгђТСхыЛћћлћћЛ‰ЃITьЎгГиv>9вІ lб-Оџс?ќёGђљ>z}џњv:LгиEЪЛД wД}ФіvVV.G"ныэюloяьМ:8<нл„гŠюЭŸХ…0БЃбШжызЏяэ™ЋƘЭЂаўDD„)n^мП“я?ќјб~ј€ yK>п\‚Ь ѓxОфš:{ВГ_=\[Z„г'КO‡ ШѕУЃ*гй~lпй,uAМР ,‹L гйŒˆџUтuъІ1ПЁH,…јщ7šЭ0žOg—7wї`Ля)CШm4жћЛЋЫѓЩhЇєЅo[:wВѓђхњвТђKЄGЋS.7њLчxчHVі7^юЯ†~…иђц[—Ф/Џсѕ§›Зяо@DО…ђPUOГ?йч’рDД;4Œ!UЇ7я~јё?џуD~РщыЋѓёPž„>I•=ннє-ЌэЃ{М|љђеоЋƒђёоnЙОЗЕГЕГБUъŠаю|3•лбИОЙ…зшЃяюЎ/'ƒШЕMU’tгzШ}DХѕ]зrУ$K’|ђњнЄjќўКде-љ#;Ы6 MFћнXZZ\ии+•–Vж_5Owї*њсўЋнmєР]Dš2ЂZггч3шя{jzЈ›О}=ЦЎЉŽ?РgФаjZ~HЯЎоЃќЭњўѕх9дIиsZ]Э•Nіз›ЛЅвТТЪFЫфOO[ЂвЋVŽ6——з№Ÿст7ЄТэщ‘8 *ќЭЭ4qMљсgiа]v6§yёХ‡?ќ№#Ѕ|І]л/0U“ЙNЙДНГŒ^мк)•ž/,­З ЙCw’јЦб6xъN™ž‰Pi…зЁЧšсїh<9ПИ~§†:(5$ЪэлId[ƒ3i+?eAxё…ˆJDDЮ‡БoS„eZbh–ббvvЖачо(‹2п­7›“Е•У:ЩNE%р# Ѕ%йlŽїoюяя__@Z^О~ѓцrрЙпФ$Й­3yЖ ЇQ‰џ‰œ~}1J|zТTх'{ЏЖ_Ќo”_э,Џl-Sz,-,ЎДyЖYЉ”^nmoЌmЖKЅгŽ$kД< HКФ n<КМEџИаCЯщpvѓz–zЖѕPЇЯЃэхјбьэќџј№§›KкWOЉСзїЗ€›РъRхрекђЫјЈДИМДВyRЏCyээnmя–ЋЅвqCРАtMщ9}[Cп†4FЇž!•MрJ6НН) Іъt MŠБpнxіі§ї?ќ№ўЭыБoКЊ+|уxo{уХюўЫнWЅжоЋЭЕ§н}ъ,ы[/wїїїNkЏv+ћ/_”J-NhwYŽыvhqнMбL0ЛНЛјЖJ'yщХUс9о [ВiG|ј~zITdщ"вЩІtИЗПППЗЗѓтХЫRџхњж&IђRi Рјэзп.Ќэ—;нНўбЪ"moуЏ[е6аІ ЊсdГЛ7WБ­‹}N1lП8ЯН‡КЄУщ$ЃdtћћњіЖ ЛšТдJл[/їіЗ_Ќ­m–њЏ6їЮŽЁ\–ПћУя~ѓ›п}НВsмшзЖ7ћЕЕчŽЭњёЫ—ЅNНI€­*iцфтў~ъ™ пmєџd”x?§Р3…vЈбю‹;пл›ыiŒl–Ёt К§rgc}cћэеѓ­ƒJЃvR*=ћіп~ѓеW_|љы_мk6kG/›Э•oKЅНJЃzx‚Hз“ј3EкŠfїЗ… HщдкВaбг•їЙФЙ>qj4ЄлѓсheъkКBga—v^ээmЏolЃЮ^,ОBТtКЗ:Оz}3 =ПИК™ј†.гђрIщьєhg{џјш˜zЦвцЉ`)-8§Ћ_ўт_ўх_~љХWП]<Њє­,ƒіНњъЌR+•Ћ-Иg™ +˜N4{= ]CъwК=qОї>Ѓ}?)fзC|7ОМyІЉаёOЕRЋyvДwR9Dп@R,lvЬа•JЅџЭ—П€}ёхWПўіˆ‘EmЏУщgЯV_а?jvX№/tXг .вŽ9пK#ЮЕэу8-8~˜ :АРІW…o Ое„^ЏWOбЋ!gПY*лљ0У§§ЏОјХ/ўх—_~ѕхЏО>}пv”ƒgИЯž­Н:+uЛэn—GЛfK=Ы &їГРв>‚ ќрm„џЏЉ э№DV-r9 РъZјrЋдlœž4kлЋЫ+Kф+ГNr8§o”б№љзПњзg{|8H’Э^]|ЖАКWb{ЕjНЫŠbŒн FwчžљHЖќЙ‰!Оk+МnћуЫЁџ'Ї+ШщГVыевтв":к&7NЯSЄЧП}љ•с_ўъ7ЯwКюp:.‚0gyqqy$ЗNЪ­Geaxўші"ј,Ї{аAЖЮ2†Я ŸnтЋGЅ“гNooсйѓErКт&йИ {УП§Š" ЏПњЭяWЮєl4H#Œueyёљ.œж8­uч›:4з+ЎЎBыѓџЂF,5KŸŸAИW:jА'‹п~ЗМB€ЧаУ•6љђЋ/ ћтЋ_}ѕы§Уъ1OїѕpО^^[^„г5CnœV›єп*Ж›N/тЧ Ѓг,У Г„і sЇOлеoО]\Y[ћŽ.‘Фgќzž_}ѕыпўіЗПћУтV•щЌОМД„‚м)rыь„О“…&Œћ‘ŸЯџ SДžoыъ|[і^ЉЭ–зО#ŸWс лЏќЖп§њЋ/бЃџѕЗп~§‡oРВы=Ш‘ož-,.уЁзuБu6џVгѓу8t?хіьџwЏIф[Р`ЊœЃ’$œЎ,ЌЎЂРОЃПн\њј]пќBќЏП_XZ^ƒhyЙ§тх!`}њљТ"Е>ќ?&п˜ЋрzОч;Zы2 jEз”љеь•ивСккцђw_ѓ5}сйТЧoZјцыяОћУwЋллЛЛЏі+ЧЏ!KЯЩ№~ЙDНюO7ULZхјМ>Я§ў?P^яяМк]yўнѓяўмщхчЯAЉзwOOOЋ­ о‘г‹jМ_™гџ…ыЧyцњЩўЗYЏї3œЊљlmžЭЋk?;iЗkG{ ‰яuлћxЯњ>Ўm-влŸе9ЎW=j*ŠРqLЗпяўsF|чйќэЋŸЕxQь”ЛŠJ+#NЇџOыўс"Нл?ќјi[”іЌGKWЊ7њCPВИїѓyјWЌПЗHяЪЇ?э!ФLЙ Їu/48a~ђъвўЯчс_БюЮ*НЋUўє)dIџАЉЊpž+э7ya~&фђ?WЄKлыєЖё‘OанЙuаЄcKUІtаd%…ЈчкЮЯшс_БƒMzлiќЌ#Š\eЗNOeЉвq‡SцgїЎo§ŒўMы§щА FzЇл™Ж”"ixyN KЋџdщQzѕчŸєІtИsЪыѓj-QQц› Жћ‡Zљ/>у?м=`Tјg‡ч?опР=ЋЯbЭџњ…ЃНн&ї—Л6Ъљ?ЬџлЛMВ[Zл;љЫ/=в‚зgД—ЅеЭWљЅфчёф'иNieuѓ/ПєЯŸвЛЅхХеŸл‰ŸjЛЅеЙьў_e;Ѕ ZрјпeЄМn'žьЩžьЉ=ђQƒŸпˆ•ўУЦˆ<–љјѓяI|;џЙјKnžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžьЩžŒŒD~~Bƒ$џ­i{вЇ7ў™ЌЫЩ†ЉkєЬB­'щэшЊžŠярџINq`ИЧŠщzЖм-ЕэЏ %шžяи†І)џsŸ™б—dч8E‘u:йв’:•–Ќйж_$Œе“lпѓƒ(№]Sъ§Lо~ДžЈЊŠbИяykjšЬ6k}гѕEњгC9L‰ЇЌad“NІСšq`)ьЯјШ;+ЪšiКQУš’­ЋbЇЪл^рйІ9ТEu8ШЎчљaфл†9?ђVч{НŸ!рНn‡aEM‡aœхtœГуаљˆн–рxЎЃZ6[Pѕ::‡сЬЯ'C“Q6ЯVxцы6ЫєК4жЄYq–&IžчYЖcЭЖьИžnфt[QЫЅЎЊZAJcИiyЖЎЪКы"гћЧu–eњ,'^ХQDЮв”CФбЗtE•{MжА=з0Ј‰u…ƒЇщtrž ЃчXC:ЇпД4сkQdY4ƒ0Ž“nj’?Шѓ,ŽGзMЅSуl7в JъуFЏЄњA>,ВиsaxЉQ˜DЎ&HšЁ§cBЭ‹KcЦг$і]U47$—3x5ЬSп2uSЊз'44rКбoя•м,рЮgУгФЬэ&Šl™ “ћG4žge7‰УР5 Ѕ№Ÿj — ыX†ir•Žщ[!cYьѕќ,Ѓ#-—ц™*‘ыћp[тU#мџМЯё’$Б) Ќ лA’„"n;ЮЧƒq‰k[ІдЊˆž;?ЌЕЁБ'LЅЁiйЎ‚\ —Ч BЧђуа’x№о0,ѓяЏИQ(н.ЇкЈУEˆkўёИё8IВA ”Q™3ЦГxrZЖ…!I‘ьШ~“R:B^щ2gтћмx˜Ђ Ѓє~ˆњп6 Щш+}Nw<Иьгс|"К†щxŽэEЈGЯ`+-зІЯ›ОXбДрŽРіY5€kc1}-єm;L›щЊЖі9-ИˆЄЪЋС`шбМ_ œЮ[ю|№TeБoJн†цЫ]x№}ЯnЪlЇеюt›mNХЫѓєN]ђЧёуHm1–k}ъь–ПoМ™јš$сЇFt\Й­ШVпmšаH“! 9“d)weP AmOTlM5И~ПпЊ59Qьƒ†Ь5kФЂм0 ,A2нЯv@(Ѓ‘и57HcxЈ+КугmQц9Q–УВPnAšІЈає,ЫŽ|Uс8Љл– ЫћЌXlЇЫвXО~­в”mg(’fйЪУ2џуT7дкЌfЁ~<”–ЂyžЁp >­/ё,їqž.McEтh„№ШЗИЕI%ыšŽ!)œ,ђŠдm•+ œ8дйё>ЫЁ(B“eA#ВиъP[И>лябQhлšкч!q?au§аfyг4u щфZ–eaИЎ!ы*'єŽ/rм848Щ§ЇБ†ЇВМBЭ !ыjž Y2uУshf€mЊК&iѓ92)H‰>…ŠюљІbг„пt’ЙуцОЊœФЪQ]EIˆъЖ?УƒёМ!wЩє’4є\]CГS9А5ЭNxЄІ,]2lз6 j‡hЧn=ЇПuСU<лŠQxа.ŠаšЎiЈzНЋ†єUG“ ыёŸЌѕк‚ pЂhŠaы~˜^ƒBсу’ЛшfЖсб Pаk‡І фI˜'I>3Iђи‡p1m ЃeњŽ‡lkUXпГдЕІЊNњX…ЇХУиGœVзTг˜PЏВќ(4tќh‡ІєХiˆРа Ъѓ|z>=ПМȘMЯЧХ0ѓ8‡АЂ(іdЉ{ж6L#ДсЗ§јOѓЃцYYї +зdЫq.p тЁ?‡–Kѓ•ИŸфс5ї;ЪЯ/Шуйљљехьb2HŠ"ŽAЌЃие4ІнhёrЦ ќ‡Oaј/ж“x†Uн˜ц%Ъ­Я9!Ќi{H„0ЫќdGYŒG11U[•Q”EQ2ТСlvq>i:g№§bœЇƒQNЂAуЙЦA]q|[ѓНGядМаc$#ŽgЃ[kїE$&№л“,%†?(†ХЧЩЦ4‹9wuEVш,EУ‰ š˜^dП!ФY1>Ϙбьу$ђЧT”nљ„аLO}\ в/ёlW4­аum“9Љ3М•чј Ht1фx—хЃЩ9 †пУдЃЩH6ў(ЁБАъ/0@2…ЩЙ2 П ›ИЫT:h0ЖьZt їXa! {Š:4XЏrиULІ+C­sŽіgХ—~>›y8LlЊ>ЇSQ<Ѓ!Эёќ8­$ЂщуУЭ<†zPyІЮЃe*zрьЧu’Ч0–-Ећ,Єž…fЫенƒž hhL“ЅYVP ЯЯgѓљЦ™gЈŠЂЭ‰v4 ™єЃ иŽтюЎбdл$€\Œc“zMR^<]ИJу6л-ек4ПмtLНВЯˆСѓ&В0JвM8Щ†у)Ez: 4гќЈUš>Žp6Œ<ќKšžhБ‰fФ„Š&6uhЛD’љё0Уг*5ћ†чЊTЦ~EїзЩiр Ј(0ƒЎ}Hcђг Њ,v-лЂUМ Ђ@~ зхНT` Ш+MчCiR№C­Ч1}#ВлbЗзe8љ“ЇШ§W]Oз]нaŽY?_шp!Ќг<іаЊеh€є˜ŒЧЃA^dд5&дX&/гФЖ=Я1$=kВ4kЛШзњBOџЪ&Б§uУџj@K›&.;<Іѕtш"Ѕ€ЈЂМhОёИ ѓ˜г*Ž‘гѓiє“Ы‹iŠ„ВuI0Pвf\­rd‰щr}оu|I~”МјsЇ е5%GЌˆ№‰ьzaœ1c @ь†йсDWбXєС Ѓ…dє€цIGљф§96yОЎкЪ2Юрu–въrœkЙHŽGvК/ЈЖЄ™mЦ ‚AфЯз bŸ.7м‹ˆц=šЛœg žDДЎ@“Ьг дшȘ“?зђ h<ѕЈŽo4[LЧЖѕЯ ]zeOh™hXBИЇЈ@]ЁqБqQ р&0@M’аѓљТ]šBJ4ФЩ0ЭЧCіИ†—%VˆJДУР5лЕNЫђЄfЙRЏ6лНGtОйoОMbЯAœgшužЇ –k8ДJфЃyнEžSJ Ѕ%QœЬgЦQFЃЉLH‡AxІуЊJ€f‚Њ@ѓt4І~zЊ8BѕДоыsр_~,Xьї8•щы–F‹Щ ђс3DД`ЂмВЭz0&4,В$ wD:Ё‰Тƒ!9MH™AЭ„ƒЄ#D bзД Фб{ћ=О]­Ж8ZЇЗ,г|№ ”nЋZъёLч!Њ УэI};L|Ы аƒ„Ѕ$ЯG4}„n‡С›ђ9RТi4ndМЄЁыХ4œ0€цВТШ6‚~Ј2Ѓ§ГъqЕгн4-А…G˜„AГyŽяЕDЭЭа]t+…ƒRDvК6<„ŒAёŠ<ŠŠёЦКЦШz2JqŒќ@{є’aLі8йašcк Ч4їЋ}]B є№Б<х™$єzМЌ› џІnЂ М„–ІЬMЧч34<8ІЭM„ 0§8Gr вѓ ™IIКQFCy@lь™~hiŠЁБЧ;‡gѕnŸyVа@>ŠQщоЅ"іQ&‚ьFЖjzђRмЫR\gћƒ)ˆ)Xi‘e9т"гhfЩІпРђщ(І†`P8"Dr`г FУ2ФњюСY­йlѓŠШ‰КэЛоCЦs<[Й~Џп›j14Цђi­I…6 ‡“сt6AЄЉлYh2Е“нн*Ѓ&ЈDИ\ ЕgФš@Д} Ёћ†jЎЂyОЉ*\у№јЌRЋw ˜iq№рyaЌj€ЏyІ*ѕ[Е:Ѓ‰:XХѕ Й’и’dУ P€#Є!K–ƒФfOv^ЌЎэьеŒЙЈСoєМщ( ’њ!Ls™ЕBKЕД§жщбiЕбj12ё]wЬ.юu ‰Ќ)ЬщAЕлы`yB_Б€‹Ў&Z(ЎŽBUDДJЙw€Œ„Ш)x3Ј‘=їЂQф™šбxЖ({ЁЮб2ŒˆX3uЖиFаŒЎц­ІІ|žЏЭfЇЫiб<2TБYЎЮ:lЛеiд4hSе‰фйІнGx KЌI§А›yЗЖЖ†јњЛ]eдSёќƒQ`ƒž)‹*Пa#E;ОкjДXh ’Rm †f/—гШзЭЯTЗэzНЩЪўХаVЖYЏдyžmз MЧs Q†Кю™šŒhЮFГфГNВЉЕѕo(ЌЏ“ц†aЇС+nšZ8 Щpќž!™#ш +Qџ„ІŽчЉY@€н7?ѓђАзe˜ЎLFŽ"vлрщЂ$А *‚МwЏЫЖ@ЊСЎЛ­ZНка=гCYД!Н гв™ѓќY С}Љu’NэŸ7TќњHЪeNЛЊпtQ PYРЕlЫhŸзК›–ёzHs"ШlЕм’œ‹ћЫAиsо: вYЮС(ЯШЊКˆ№†ряv™NЋY+V˜Ž*;НОaЇqЭR•Еˆk !`еѓey‚o§Rц”—­АgЫ’иžкж‘mœWЛ Ц :ь#™Ш|ѕМXa5oΘі§0xыLU+{ЫЦ*ЫТасx0…*д€ˆИn2’m+FlCсYŽEЭ cдѓPтМˆШuдгFв](ZpCš—сuБY)V[œЄ[фъ^`щšP-TšŠщCNвмЊ§ЖЁIDыРDг|ЏЊJB—э6ђЅЎЂ*š*sm о ƒа“›•ŽюƒXѕЃ(Œ†ƒH†Mг$РF}ЁTn!Qи&'8a92Ч5ib‰у%  •е6t U ЉBQLzд"Пm(ВЊGГа§4ЉAыВШэJ[–dYMb; ЃњДњ&дЊœ; ‡б`@­Ž4е4Ц;|Йи@Й6љ6ўОющэF““5]‘dITщrKВа2$\hJЫtоTYЎ+YHFHЂдП†f€€uЛmл$азdMTБS+Wы•rљ,З™м)гёtбKw/ёЮ/+ЄФЧsǘNЂ q^R)?бdq5эYЊЪ[Њmi„Ÿ ѕg—“ўjЙнLЈ4PSkBЋ- @шr—“нЋ1\Юvк S)жъ‡щФve9‹0_Ў~"xNГьZ РЗгЫ~u+‘уФz<ЉУSG0tкєъfъТЧ NwSBr^ ЂбеэЭе4ъ}_а­оp<_\ЬЏЎ./gа~ЎТ№:x“)ƒŒЙзS•%eНоb˜R.ЙUэг<єyЃfС0&!Р–Щƒ|?Јo%З‹чGчQРК tЛwqsхЋJ—„-уQR5;н<==,Fџ};jрШ“љѕнѓыыћї‹ ш™nњУ‘ЕНИч“EžeXќіv~;]0њ>9ќятПAЧЫU—љєbаH'“™ну:"сЊЭ2Шшц6TЈХС0 eыІ?Н{}џr7‹яћЮјэЈM/oŸпјіЛЏрИ`{ƒљРP8^u/ЏzMйwеЖMОКŸ!а—4Џ‹ЁїWј“ЅgуљЈ–J%Rч ASuгP•VMаЬСэM (]љSЅЮ-ЧыЭ^Ўgдђ=1Чђbићу‹ЛЇчз—чччЇ+dоХMETНљэЬ7Є<оє\[a йЂGгЙгe8ЯЈѓ`JУ(ŽЇбyb3Й}ViIд2dkŠдfTГwsэЪ'ЃРЊ4 сђјts9„oяЩБkbі“љт cъъўщюњњё.4d0q3ЖˆVЋ4щЂ‹ЕƒSmB!Н\Ћ ДЗt4J!Š8JЭ|: зSщЃ*##zУбІ (ўеТ…4R MгэЯnяЎf§0pAŠПЏM‘Wl ІЕя(є=otѓђсхѕж7$N†юng6|е6ЃщДoЊэгv@!1Ёбx9_і~аЊтh€?˜“ЉЕЛ‘к>gdгDЎM&ЦДЯѕЅЃ МЂл§сpzѕpП† :ойњЧ* КФЊЃŒgEзЏЏю€VЭўэУ§иTЙКрŒЎ.GЖЦŽъюŒж]#ДDNЭыЃOъ№5ЙœK'’Й*WэСѕГ‹ШDIеЃћT>@ћѓыыЛЛЋqhЉ".и”ў§Й)‘iзТћ…™`К3yZ‚Ё7њwcŽжƒ‹Л›Ыа’+Їeq гќђѓ|)~ ёp„$и+mІR йpG—WѓО­ўХумЄЬЏїnЎЖŽ˜ы@яъoЙЯ›ЗI#УХr%)3К}џё!ФЏЭСУгэ[ДWїw7[k‹Э`>гь9 ,К?M(Шё%-тЪЛщLц”Q­ўХbqE†šMЏя&†мхs|ї№x?w‰Ву-P{œї§oRŠ /kHЊд_^НМ> L ‡=Aљ5ƒ)хnцш|ЙT’gЃйbI˜hЕ™‚`:[.кY:“н;чg|y}{ssj‚~y{;4(у9—ї3 Пjй"L}ŸпџrЮР{ѕ1лВMYR­р…fjЋЃЧЇћЙgXў№ђіўююв7хZЉPrчГe‡ хМщє СŽІneow{џИ*Њўтю SМЋљYh€Q"бэУУуг•G rŽ ?Ю&8$SќSR˜KК'лстљѕ§U q’=шEпѕЂ‹ЋЋ››л›ШжлЅѓƒŠ3!Ш‹|=N.>•–ёxтЖŽВщН|[ећ7wW‹K…РqУбѕuЄ‹‚ЬяŸnЧPв^HћќЗЬ!€#RяЕ"АAѓ7ЯЏю‡–(;S€ОѕњуХѕххтъfЩZ<йЯžq„aпГuhu!XЪЏщ$2ыЧGЙTzЏа‘­ён§неХ0є}GулlяfdiЊ7У(МЛ^\K Љ/*pов\(XєЈy[—E0+ш—ЫПcёtwy9EЭИКFѓ›‰kЅ§l&“;­6ыхќбб^&Гwоa ]НsvxАЗ™HяКЊ3C^›Fžm.W:<oчЮюЏgƒe#дx@ЛPЈЬОДH8№lS—љЎЈv0X<ПџсqŠBsїtс‡бјтz1 Кчѓа+{›)ќIgЖЖRщ­Lr#‘мо?)–ŠЧй­l6Е‘J”нПцžCLп*lo&Jї‹љиЦиY.ЕCљгюыmsНрЮЕwЁpIЫхЯ ?{ќ№суЧЧљtёpхtрЕhqI+уюшЂoˆe83I–Hdz#ОББ‘HЄRєPЅфжaSв{з7S нё™эѕѕwЛўйѓ- ‘?а< Ьао4Ры&ѕФ#йѓМ BућСшŒялзќŽqћфЌжснA€aj‡“H—ЋH$7З6™ЃУ О&мёѕЭфњF2БžШ3 ВФ~Ж,зцуkыkiљсхљхххЎ‚ŸV ЛђЖЉУЄbІТЗMVвtлы-^?|ј€з—оY&Г{tRт ъ ѓG}CЉхЖ’‰dцрpk#лн\К!’Hэх№v6™“Ўj/д^цэНЕѕјF’Й{yz~yО:4Јˆ"DП iЦлZ“eнFш)лЊзiНL7НйЫ‡їЏАїЏс1ž9ТwП*Ж ]­чВ[‰tОYШЄ67“ЩT‚тЎOДЛч[Щlžгœё˜ц4Ѕšн …Цѕdї~~~ОŸ….*`ƒ‰ШЄ пжšŒјRUŽ—d…ˆЛwљсУ rѕЫыћ‹њцz"=,6XQ1НЇЩ­ƒНlњ˜ЯвщєfŠ‘LсМ•ч˜ЃD<Й{.hіhтAWq…ЬЦ­ФwЌG"ыOwГ~@m•pSЗэя_Щ–fZУћFКУћоПџB!ш–sћЅЮr‚AДІ‰§уƒмn]яьnЄ3Œ%jrv2•>ЎЖЉ\QаŒ02dЁSкЯl!НФ7Жл ~zxМ"ѓ ІЈ“Q@Ћкі›—єiސf}к39˜оDH#@"Яз‘ЁЈi$ мD#m^ШwјгЭФN6ЇAф Ъ%‰фСёNbkЗ)иl—mЗ[ЕТоvfчˆ==уЯуУœ*гХеѕ<Хъmކ™ЮrГJ4ЛКЛЙ}xљіЯп~ћО&д/7cїгиf€йbсЄP?п‚Ь%7щєйцЮV&—лкиЪеUѓuбІЊЊЬ6[’7{zyz„ ЛŸ@Иx§бьњv5zћiЎз^@Гь‡?УО…lфНћЫОgQЗЈІ&JPЗ\<=>ййHnn'6wrћйэьnn3ЕЛЛwВŸйЬфHe6этУGvЦзїшЇGШэа^6дСБ яЮ›=m  LЏюž?’}xџнwПћО&OП<=мнЬ"ъЁў.’ |­”?иF8фR‰­ƒГвЩAvk{{-Žт~’Knfї[ШТІ,C"Q:~tqswjїјˆYhДјaић–љЦГ“‚уї&З/„ŽННzдпQš~}~И%ž z>•НфT|ГtМD`dу№іщYЁИŸJЄж67[ћЛ›щУ6тЯD5,ЧїC’ЬзxQ€Fў@;ѓiaVy№Šoєt |gpЊ~q1Ÿ уљУ‡oПћѓЧЏЯpєэ‚цњ№ЕC”йБUЪСЯыЉУ­wkvЙƒТЩv<žинM%wВйЬЮI™SG.ІU§e3ХеЭэмŒтђђќp=ŸбbKG‰Ÿzћ’œц"oа#ЃoЏљ W@PПТёз4DгЄLднf~ d#žЮ%зжт‰Tfеяb{;ЙБЙНЛГ{жЇQ6hнА?ЂљїЫЋы›{ щ0БзчЇЛХЄGЃ„тэ3к u<1зBВ_юРš>~DL\‚†і˜LGДГŒ6ьшЦсц2+omЌtbПLВЙ“Эlo%S№4БiŒDHe/Œ–ZЖИО#аOЏ0|О›љ–ŽЗfМ9у‘)–ЁЋ4?эXІ;yўіуЗп}ћёѕёўz~1г♉фaшК*Ф YpЂЇ(а`HgJk'™HчŽвIдШН|KVš,u§h0ЄYЪёштъ QЦ_ŸюЎяž^^юЧОЅ‰ТgЖШЖъгЁ-M†3~љŽP|ENЦ-МшМš"‹нj,›IыŸi A:hœmЁ$"љ!QoІЖіOЂŠLMsŒрŒ§сx:‚$ЛМYжё‡Ћщp<П}~ЙИŸл7Aж%yŒє Z“фМяО{џL“mp22ШЖ™vЃR8ЬЦв›Щtђ›јВB'66AE’)|Й‘оЫnnэц+1i‰ZG921Z Oњу‹+JжрKPрсјњёсдѕѓћcUkЙйTв(<€њу3i#ЧаQМЛХ§l.›ноокŽmmІ’™l*ЙаЈпЉ-s2_яцw3лЛЇ…BЌЋiдхˆ€3‘с§бхЭУѓѓmпЄUPw8ППb}6hpOЯqtQuЧO?Ђ6>нЬ#ФCзКPL›[щэнУьnl;NnьevЖ‰Gƒœ‚Rƒ‚ФЗђ…Н§Н“r­јЎ ЪптЉOZЇ]GўфњўщqX /ƒТїїѓРўьўX€vZ—uw•!~ПZDVХіљоііv6wœ?иJЧv2€],фРCРЛњxrПœпЫŸЊfLhЊЭS;cнаQ1tgИИzИ№lЉб Д†з 0ыЯ­бо Яв ozџјDe`hДv];нл|ЩŸю!4bЛ[ЉЬy§ќm5J9$wњf-Й•омЭзjgеУјvБЋіŽыlЙ –ЊIЕ dяђсщ&rM/Хdг §ЯwtŒЗhОзї§бЭуэ=ˆвиеiƒU>ЗП—=8Kк=ЪђБђI|};пэж‰7Нћуя~§ыпќa-Е{\j1ѕjn}ѓЈk5Ы'…bЅQiv*..žžЎњTS[Ч1бАiЏычƒŽбFzЏЎюЎцрЛ‹­Љ\,vxX8/е›ѕгƒГZЃQ‰UЮЗтЙВЄђlc?ўЛ_§ђg?ћљЏ~—<.7к|ЇМ›оЮхcm†ƒhqлfeЉ[‰Щ†\>=^і TЖ г§aЖk4mг/Ў/zС`q;яQлi,vTю@?ђRЙУv:ЕXЅИ›8тМ^шЫ'я~ѕГŸўф'?§хoeAlss˜нй9ˆ5AyYCtЕ;Lы,&[Vxљx? РЙtБc4ыHKCЂіћГ[№Ыо_†HА]feEСCf9‘э4KБГ“\ІъM/fceяїПќйO~BžŽ—ьОaxn}?йыŒHRлвHrЕObFЪтщnL-ь†м^vЇ§0˜c’^:ЅfXorсЃЄ#<:ъMєqнfЅ˜эчіѓъ`:ПvвП§@џќWПљCЂр\Lƒ‘•O$Зb'gѕЎgZJЗгi5ObЌуГЧЛUW]љaЯ&Яі0ўVo&рМM—–њuYЂ5ђТЩ>ђєaзіњ“Б™O§і—ПX†єŸв'ђмjTв‰иQОXm‹Іm"гЈфГБєРєёЖWдўсpŸce=‹Њя№zъ›šO3ДЫš—„жљщбўnмуD1uл7›'™?ўъч?§щЯ~љы?$fдwLЅО›XэŸˆЃР6‹'Лyо№цІg’(ќрч ˜Ўeыœ` €<Д]Ккl6лМмЩяюьd6жbЉl‘U$Уг§фoљѓŸќу№›д~БЃŠˆ…кqz#–н?9=ЪЗUкUdЦeЙЎю–ёEŽ€Qu…‰ІгGЎО гќY‰UXЊ-™фЛѕXцАXnёl,Ж—YџнЏ~ёГŸџЧўq#s?)фѓ•zу|/лмй?:<*ЗDSыw7c1 Џxq3АўС1{?”ЩІсіPбс‘л?g4юќ>•кxeOЯЯŠѕ"јСіњяџѓ?~§ћo’;‡GGћЇGЧ•г*ЧhE?wxVщЈŽк. ЄbгіГЁѕ™mМџ›‰Д’ ­PќюIG“KщtсЛwп$bЙГТiОR‰ХЮ ЧйјŸ~џЧэ§гRЉpоЊZœаE§ўJяьЫ13t…ТEъЙч|Aа1™Д˜<5ъе$ЕГ›\џfm уБ}€.аžгR­zšнNmь/эF­Ы4yE‘иzl*2Е;Е9еPš'гэї]‹o „Щ4УЖKјд–ЯтЪœсє"пхj"БхзЙЗcМШ–ё‰:‰\Љм5m:9­]’h9ђЫzіyЦЪЊTЇЯvњJЅЋд}н((tъэMФoБвv|#vк” SЅОVЦ|Whнw]Л|ІљШХъ—<Щя-ж>Юd d(+гxcLзs” Ѓд№y^0`з~lёбЩяьХšВэК5™ГКm›bЉ­™Оmj…ВE-ц—уqoВzчp3c5j|&аŒ ёФ—€ЖL)пєњ}lkїkC§kцRлБЖтНe{hKжuНSlk6<Эžr§~XTГS;_щпXi+žІY0ър4]S'mні,ЃsІЂШ3h6ёЕў­5ВP­1кщв'^,вжŒи^KЗ0ўbE' g™нšmЩКФhЖЁ—m"BP|lг}Sѕ|'txБSхёrШ™?єШŸЌгЁk“-"iŽЩweEГuЛЙ(*Ўo8`І:]-oJœ В$0[šу‚уљ§бh0@™ЇыI=hЯбƒ~кЂЪ•ŠВŽщћт—‹ЬђХmзF0ВЈoP"a@Dкїщм Ѓл=l[U}пZFž7ž\\-.А‹йХЈMЧ§tCха–ъХІ`xЊбГх/КЅ9Fа…@™ЎЃЪјрH (в^~ˆ,шЖ ’AЧZAяџАїЬqЄЩ•ј 'і$эЮ№ Мэ]yяНщЊЖ№†vV?ў^6gЅ=…6NШQ28 bˆЌЌќ^ОїЙє€С~\Šйl2ЗmОМКМО—“AšхƒqyŽgˆэjЧH#я?€ЊхФ№йгкUEї‚0ŠAи W“Вє3ƒяŽE§Ѓ@сГpšд№0+GЃйхЭеuI ъ‡1]‰яКтiU @#ГлџюБюы–H&sб5 UўЦYQ”e‘L—ЃсЈЬФ2/2ь%2Ђ–тvŽ‘@-ЫЃx€xOFež„ dCФFэ\єPЉ\Ѕѓ§5РE‰Іx^—l—Ф* кД€ЫјсШjІ:ЉЯnі@ ’|0œN‹$ƒ0YЖсІѕ-ВЏœ0N]юМє0UUќО4•ЁћСZЯ@в6щZJ’. aNOACм0.F“йhоjQD\‘Лљp6FО;ШpШ$<.Š,Ы“ ‚$Nуаlеe7Д%@(6№Н|цРТн Cгі=ЅжSЁС‰ё“иѓсўz›zЫSпЈЩhXфxѕј5яœŽgУІPЪ)z0ˆl?ХћЪВШг‰ЏVETЅЮїіyЁ/rŠ+ЋlU‰шg“'Б”Чан&X‡чЇ#Tщ *I р R‡ш) M1žŽЈ7иpЙšˆ”ЮAHØXn iЩUk=]љ—ЊwК’Ь(ŽEГ-(бnЅjc%cŒZn Зб†дHz0Єс]@щЦY Ц‘ŽЧYVфjЦkFƒаТYZнj­Ѓѓ?F0Pг=Эwej‘›%@YзPx…&1В,IУЕG‘ЬrrІРтД@ќ‡щhœE!ŠeЖmЩZ”{N’јЖ ЖЅ7+-oœTк ЫŠPпгыžдх\Т[Я ћnЙ’hй |„ПA ШCБцdЈ“Hh@DQЂр ‹ЂРџ&(пЎnkŒ&xWQ`ИО)4Ю*Œ\Yq’Шp"з№UЖ{МЕsRЛшi:d189ЦІћ‚Xѓг[hЗ[ŒЂЉŠЬї–кLћЎЉš(сЖЌћрГKК* С]!7ArКŽЈYz‘Tу"ѓмШуЕ0№ŠMCш6+5ИO]™A РЖ^iЖз]Ј5К‚a˜КЬs<ЫЋІяВŽВh+2„w6d 3 лxюt\ЬQЏЬРё$Уёx<“ž#ЫЂ9Ы ХШfћ*‹ЛJЏнЎ]яWк‚nкѓЮЛаХ^№Ї Иf€%hŠ,В=NїlнТ 7 %ŽЁык‹І:’ІЪ`2бxьЋ2ЫійfSR$ЎзjЪ`@ˆОуid›V€h&ОЏЉ~цu–пќќfqёэлЗB^„ЖЊУдіВиQ4/Œ<]Б|LЉuбСєGюAƒf—7c0+{Осхљ&jВ ’=œЊФёМиыЋК*єj p2G‘t`aЊ–—Š]У9?Г+oоМyћ–ў[юФЙ+ёЊ“'† 0š1от@ц=зWъrъМщuˆъˆєАГЋЛыq…` /Щъ6/В,+hщeїEYAt™mД$У3XйtЂЌœ%БЃЙ|пЯЭЃŸпМ]|CС>ї ЋХXvšXšБ­*$–lZ Я2‚Ђ“Я`ŽЁ!ёhzu5CMz/™Hh ВШq‚ЯrœZR5N+RПЯ*'лZУЂ<hfЗьуŸШŽХЅЗЧNсдzHЁA`A{J_к…žŠqAН­љ0ѓ3 … яЫЫћлY†/ЈуМІkŠ(Hz4)lEръЎlYК* ,/Ъ ОЁƒqу‚м{р•*{кO2ПГFa^ЂnиU5ЮDнЯшƒ$Д…žъ!!фV›UЈЩ;|BGшІнЧЗї7У, Ÿ]^x—6Hавf2)MтсЕaRƒbыuк"t(“тсГмižэKiœxЭеExМД~ЌЁжtvЊЌ†ЏЊ‚E+А6’AhAYд{>-' ИiCI5КОПП‚ЊŸ9ЫЮCћбvЧ&І,ђœH ŠuР_ЛzбзСЉUЩI NKяэЖ‚<‰‘Pн_YzwX7В4ЩЅ#Ђ„!Ш>0бDЩбцДљђ]<O заtаH‰\?>о ИІЯЄVH3qBbЏ,sW…г,ЇhŠР O•AХŠ3ъ*1еНŠFœ)/"[8оkЉN1LЁ{ЯїDашšв!nъ`8ЗыѕŽ ZЄ}Zއ cšУHf|G]ЖСiНчИмEЪF)$8ќАШѓAhШˆuЗгчIб MdXеRU|WXbВЉЉЄEŒg(QRDжKSš‹ЮJaяB6hAY”пбCŸяѕiW‚(УUЧŠВЫБф~›бœС#F"MV=+д JM•O :Fо3EхъM GŒFВ!ЗiY>дћ­Fh?X]–б ЄяІєФФK§к~CДщ›z2˜х mVU]гd_гŽЫ2‹[щTн)‘в3h†a™<Уi !j3zЇiаКЌЎtњ3:>—™ОB3v^ їZ}ИA–Ірј˜>фљŸrэфЈK№,іeлGAdQU лВ-д[ИэDiљЎвК` ЏМКCэрБ“o5ч Ы4qQв4эaє}лВ4^Ru7 @д ]фƒбq…F@™hі–в(LДш™dљ fOЋМх™pY,ѕ‰ёэРmQ6ЉЭ;>jUЦJјœв~’0јvЌVпCJчщ|эŠІ1ЧБbŽ bšјД§KŠ”mvЮ4<пd.dItAц$sh­Aђе‹–l еDъё2‰Ћ„xŸЉR?Ш[ыV/zf4œвœМяљxƒпЪ@8›я-’ц%k™Жg+ЇX A’бд…>/1’&^ьT}hзy2!кE‰tЪŠ‚&k k‹ТуkGUYэ0–%‰{ 8‚вё-‹я Њ†Љ‹zпŠK(MЄHЗэыD“e)ј|_A7ёѓг€і+љ– Ьp‡CЩЁ}Ю6НЦіf7ƒЯчЈЇЃ­аДЧ|оc8ХReї ЅѓМЉs јœŽ.Џ.gЙkj<лGŽƒЁЪ o„ШУСьњіfCа}Ѓгj’•ГI йLгk ihfJЬА’;Њ*­йnГг<=к_н†ѓH“пГй”І•†cZƒСgјzЉЏН;SбPњ,QŽ…pvy5tTхцњ’zК ъљ8yќх—ЇiљЭPmЄХфюсz\ЄД/ њ9ђIzЦІТёŠ?MT™ы"7U5ц|k}eWџК€œž/ЮMiyŽМЭП2 ЊЋkGВбcњэV_С(tќ0+ЇГqтшZЗ5пkкдЉЫѕЂё‡ћЗ/ЗЃќ[6‹b|sџxw}5)1Њ€…RPJQЏcMFљвPzЛ‡+GюьзiiŽжЩq$јА,Ц—гAwcmЇ'еЋЭ^Џ‡б‹В Š8œ^]MeQЅ0€|ЏРіќСѕч?yК*вogRГСшъісс§ЇOo'bКщ(1%^†гЉЎŠє“uн4uБОГV рщdиBЯ&Cš_Т&уRи\Y?Њžз{В5’ЩєfъЉxyš  WяП|~5ЪОЙ&rN2ŽgГыћЧOўђсn”a2КJ,‘Wєшzˆњ8ƒ\SWСЮбV=œ"=І#šm!A.ёЧй.гd/вЃTv–WжіЮšЌЂЮ;Т‹PЧІWо]ЊЅˆrnгZЧм~јєўРћп*;m‚ЩђбхЭгч_рѕЌ,ЧЗЗ1"­šщнubРEБУР5јкœбИ+ЫЙлSФ|<Э'Pсєd<”ЗWVжjm ˜Ёіk}ЭЪяЏ<м@sбўаoєyЁСЮ'§ Cю?|њќс§гннУ‡k_ЁEГЛ‡qтСg№ A˜JчЄjOhe––ИhЉ‰2Ÿ1-i5Žc isucћЌСЈ–эЧ‘zлы*F|{ ž8ИЁOыПхеТ“б^ Чўfи•-?№§(ІXпнпн?}јјёг•Ї Ђю юn'xžш DЄŽСžWTD—цеUФQІiд1"rўчЬкђњ~Ѕ :AЁІIŒl$З3DZдЌˆ6:•WїГ<№\‡’[ћцйбЅJъљД˜2ё).1$?]КІ$ю№сёё22VєŠЋ›1ZѓBЬcZ_ЁЊ8$+чгьƒ‚–0вжъъЦa]В!(ц‹ЄЁЉJЊ•нЬ\]DJЇWЗз7ЗЗS*ЕHzEw\§›чЌ(іМЩР CёътЋ?]ћsЇGpzэДxzww;FПкёЉ Уё7а+Н§јљ6u0мёћЧЇЋаPwp§№pƒ%4ЊJ9…‡УЩœ€IП uzPŽ2х`}kЛ"[n~‰€^Эf—“"NFз3Wƒ†ГЪ‡ћ‡ЧЉgh ЯШКrEп:IЭК1‘Q‡oцЫ{вгŸR[uoќјєtcЌ'T€Ї‘ЃЕO;Щ”rbTEЙšхДЉi>‹aЦŸmяŸvu;™ноо\M‡а ќю~ьЈЂbF7ˆєгдХјГ!* р@ОІYЫ‹Ђl~RˆzИД€SОџєqцk’цNžЎ/‡ƒrz нопd6№cїмGљК)hN“J”=DІU=:Zп>чLЗИНПCf€fXNч—їcW“ѕ`twЇП„>эШIѓ4єНožљ`L/2bХ  LВ ЛХгЇOw‰Љшсѕгѕ`0šЭЎЎgхpr}SzѕzУšсЭ=9­в чpWиЕН§Э•ЭŠ`xУ›л›I н4еp­№f™К“п<<<мнн  hQЉL‚o†Јт†чћщМ}зжyЮŒЪЧЯŸ?L|УЮюяsг*nЎfу<Žгђrш›ruge§\єˆy{ЯДлrLхЅ(FЕВЙѕnyuЛ&›ЊъeZš9чу ;М~/nžPМ№Мззз——зS0bпљі)HС ВГ$X4‰c ІсєЇЯe”NЏѕf'ИЙх”=Щpлj}{memћДбiзNіЖо­”YЭ уРъЎoМ[]YлС8Œf7ГaђЕb[*{qтоЮІWЗOO—@k’CI х<џ М ШаVE„YdX^БНьюгЇЯяf—їOƒцЮ‘XŒЫШ…yq™9zskue}mu}cПo­/.­­oюWы•ЃeќХЪъЛ§ЎfХ“q ж|­zИЕЮ^?=<Нџ0‹к6A›Т0pьg-щ›~˜–E–Ћ5IdШЁшђг—ЯŸ?ПњpЏэ.oœKIщ[Ўя:N’ЛFgwsmmuu}^oьП[\Z^Іе€•еЕхХ•••Ѕ•Э#Ќe”4зf›Ўг|‡яИ|џєўУгиГhV…XЖБєМžъКІљ€6ЃиšЌH<ъ ?B%џќљгЧ—э•Х•ЭУ.,Ѓ­qюнУ§эѕхЕУ‹ЃЭ­ƒMИЛМИјfqщнёў:œ~ЛМu*Yо`рYP'ˆЈел~ѓцэтAўў ‘ў0 - MткЊJГЩЯZСН€іт†ОcЃFѕћB]МG ?"БgеЅЗoп.o6гБ-ЧгашŸ_TvVyЙВЕЛППЖМВДИДИјvqЗ/\lтж7ЯdќШq<ХCom/П}ЛДИ—|Ÿ?мДZЋjЊШёѓIѓл‚8зbњtЄWX/Юі‡OШщїŸ?~Мэ­ТщЅенŽfг4 ОбnŸэ6 ~ћpkЩБBn//oд$іh}um{чBЖЂЬ3-МW9пXЂП^ЊŒ?МGТНППž bѕW“eктщ;Я™ ЖНќž&UšЃ‰ТЫdФ­§$щЮE[TeеtМ4rtЙЫ0Г{ЖЖsМ‡пRR///cVзWQФ`KЙoBыЬсъ zљz‡ьxќ№єpGZ$Фв Ѓ}Я~Юoй4ЁŽ[m‚ гёг—Я ЇоќtkWNЛt–HVu Ч2d†уZччЧ‹л'яр4\^ЯKk+o7ЖжжwOкpzBBѕ`wДЖлŸ<=Т(вWwїїPбYJ;Анg­œАŠiB!ARL/Џю>ќђЫ/_>ќ„`МГУ3Сid—i‘*:ЧлЋЫ;‡Ћ”ЮxћK+РюЕ•-T–0г‹LE•%Y{Їћ'cј№єˆфј№p}}ѓxsuu5ŠžН Ar\VoвЩнз—_ўќч_ўќЫч9‚|x‚лŽch(m:ir]ц%ОЕ‡ЗОКЗ=;J оњЮХЩъЪійyЬоSeкШf™†ЊXщєіс‰œўјєx5™Ьnёщ‡ЧЧЇЛk?woЏаомdtѓёѓч/@ш?џлП}љђЫ—OѓyКЧ-S‚ИтX:œ›wЛы‹‹‹HŒеwяжжзЖЮЮЖV7ЯЊŒLЧIdМ:S„хЭЁ§їјx юѕјЊ f=зщРвbv§Ÿ?ОППЙр}љхѓЈ?}xИя š&№ЩЄ TU.ж–)а8„ЙБўnЁ^лмгЧ5A–u]’Tѕ>Чх Міё§уђущўrvuц1›N//sˆФg:AœЯ№То?о_i>КџHщё…т|{5цФЅhS ­Ѕс}3'zыЛ_зХ—WоОYЂU.ђћэЦqƒW `DчŠƒ0JГсєъљ|&=нAЬgГшДЎя>kХ&€Р3Q™gt9Пџ…в‘~€`9БЅ-ОpкжЉБ…$^[G%Є•ЯеЕЅŸўѕЇ7oW‘ш?Џ48O€ЈсA”фхp|usƒX?~ј№%ыуЇїЗS0j?ЄS2ЯtšјGœшDЪќЈЗ›?|љB)MОžХ|У`рЁЦTБwВКИМББ}ЁъђxwIЇ,rКKдL‡ьWФ~egme}х_ў^Язђw/—ёлтђвњббђъжжI_OВ"•Рš)A2 ЦЩх§ућуˆЖeч—“џшЫ3tXQфEЭrЫЧO€iт6_‘Уs-Љлщvе‹ГУwЈйkЈкыksЂДКJфЖИy~Иіng{џ‚е`а‘ŽчК>IЫЧгЋ{tЈ |5›=мцўѓQњ?LT5E;?}ќђ…=)SJ [gЮvЗЗЗ6ЗŽwЗW Ѓ Ksœ[YЅ_ЫoW/vЖїы ЫT>eQеч“)Іэ (AопХЖЦЩјc2Л›DоKЖ"џjŠh`E;š€*!аСдбQ •жсцЦЦЦњЛ}z% Лq|Д…jЇ—ЩkјўюМrx|Иszrа6љ/ЪbъбЂФBMђГы‡ЇлФбz-к{•]]ЅОїВ dЊej|ŸГТб#јњ=!^ІЎJ§ЪўЮўЮжіжісСцЪк2„еj…эжvр0ѓЪ 8ШЪъNЕQ9G˜/ЮZНњбyЕЩ0еЖ„@А}БNІ7wOw‰­sе†hbр\цўГAњЏ"mY–*0†Wо ЃЉшFІqМНЕ_Љж*G;;{{[›ˆKЫЛ}ЉБЛЕnŠЬX%ЉЛОптzЛћЕZЕzzИxxЦ‰ #+BыИ‰XУЋл‡k”ЃsT—M'Ѕю їє~4ёeХ№'Ј^tЃЌ1•§­н“'tЗjЭъ1ттвz“kеšЃЕЅ9Хлилл9юhЪХЦЛѓzЃй8??;Ў0|уМоућЕЃŠl[~qywEуZН8ъЖŸ†ю їє’Щ eѓЭИГћЛ:CuTG;ћчѕОЈщмХy_љNѕ`mqiѕœUР?ЋыoџєЇŸоЎь5КFO•Nжї@Nžчztы‘аЏ]4k'{КvP\нпЯђЉŒAі>Пў‡ Жябєzqu}u3ЃioЫфі›œЂ›ŽХїT:UdЊ{ыЋ›uk0›xЕ•љУўх?я0ŽЋ№švБWыr-™@;пГиFхdћ˜7э`p}w7Ѕ“ЖR],ї…лџb ГiYNhхЁЕsкгL:vрh*ЦЅа9лн<бЂ—іс›њ_џћџчыl–›n,_4:Ќ„<УУGэtч*;[ы{ˆШръіfœОч˜…ЭўЙA&йрьйх$Іš5KУвkћУЁ# Ш‹ДЄ$ђНњљIз-&—ewх_џщ§у?§ыЯўеUžгjЬїK@ЛХЭУšНУƒНCоu§ќъžі=ЂдипѕDГсzб`” вЦ——1Š‚вlъДBрQ€h#–ШѓlЏYo0Š›цжЩлўЧј‡?ќqiыTNЇу<0ЅV­г“u:„HGяЈ­Ъй1]‘]>\t–ч|пƒњЎf‰‡"цOІ‘MhtЫЄГgЅFŸс˜NНгяіEУdЯоНљУ?Тщ•нJпŒbKФVНйhSо]ЯуќХоN*&žоLb2эyxг4:ŒŠbћуI€л,б5‡–ЮtEфЙfЋпkе€c­6‡<9XњчјЧњiуИХ В*Д9Ёпj^ДeьЪ№@аCЯRš{[-кž2Мњm0ВОЫљкџ0гЕ]SвX†4%йюiѓ-H %BПзkŸжЛНfГ/ЪнVaћKќчљуъQKP…žШдi;zЗZe$лшиœnnVuлЪывЗёОЗћOІš:‹ЁэRЌAnж8š–фњНnЇнnWы чyэ0<зНи]~ѓѓъ~гMЙЫ3-NвPіkMF”щњ&КjBc+ћяN$лђВI8Я›&§яhX ДhbэјМй—dОUm6лэЦщA‹чžуQ7риѕюЦъ~Е'ъІТH к5MЕs^Э%ž–Џqыя:&mЮј–ѕУœІэТР MхЮїŽлВЅѕЮЮыѕvГВас%….—cёT]monUКМf›ƒтb“ўЕфцY•‚ ~JЛЕЄЦокЉ ЄŽѓРўtуozMjаа•…ууЖ8rэИRЋжЋG[A5išЉЫЪШvoюэїUг <›я‰€tBtSlWNыŒ$KТ‚тцЙйкйY˜oњvэяSџ†Эїj,,7пъЧЇgч•гУэwG]^6$\ЛGsжІж?>Н(Ч@R[™kRѓшЄУ tš=H”ѓЭ:UE›ƒЄгџnŽЫUіЖоmŸїxhУ›mХ0…ЪgУqц*>;bьйўiНГ0?o­Gw‚пЁџ>./hZџtw{wwks}eqeЇвЃљ{№юzUœg‚б9dУlrUјjGtщъЫВ …8^,Дцџ†ќЋЩџЯ!‡›ыя6рёOzГК[Ђ‰lГuЦ'С{8ъњйьv]й‹ˆ‚ы8~З}ИPџѕŸб_tмщхЦозю,ш(њ'uнhv7JЌЎь' mRфяzМњ{ЋaO@ УAтЋ};˜о SНЉiъл†*K/;оєŒUэ0єХуоЅ‡j…ЕНёe U#Hђа1хs­е‹Œг§(Žф“P—ТiNУАWЕ#rкxс‰Ќa}Х ’$RŽ:P‰Їœї w”{n“œЮъo{yьe-ИхЉ~МаŠщкf˜ЙvНъЦi™аћoэу_йЦіСqUM/+™}В€ДH[<эv™КVЕцЇљЪеќ УуУ­У:ž‘Šм=zw"ЯфOz†S$Ўvк‰ѓr”ЯZ‚§qЖїnѓŒ1œ …ЇMКх€;ыъNЙт1—ц#К сїхєщЛ•Н^>,П:mC>Бч=УЭЛndШ›РБ~_•ЅКЕјŽ6ЅУВ Ю$Ыё-Гк7§Ь7; 7N€&жя+а [?/§‰ŠВŒ›ѓi4№ЖcЮђЁрл=ZЪЂ|љ­НќOvјцЇ…ођbtxZWRŽг mЅС‡Fњб—Ў~Г5WџД@ћZшђоBBХŽDЫё,О*Q 4љн•Cwџ->2vGQЖšYГpФ[Žkv.Ь8N~ox7Зі*}”iЏ}Т=ъi–ЅTЊVFОѕ{Њ†Б њач9цыEинЩHIз˜уКхCЗќ˜ы4П‹uџњююУSFт›Іч{Ця+§зvВ_ХЧƒ–Ёћ;єџkGлћјИзVщК”пк™џЎmП[УЧ#FwОїlшДЕu|ЈHŽgўЁуoи AJSƒdљm0<пњКЁќvЭ.žiœњ{сџХџy>/ќ +Ќ§ЫчW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{ЕW{Е™хОДйђппўyЕWћj}Že™опјKN7GŠі/^v8QPtУRџKЗUЫ4tE’хпСqц>гЇ›gњ<Я‹ВЎ9tћГfџг!Ху4MBлў7xЏпYш ’j:ЎFaЙІЦб-0†њзrt/ˆcŸ.Mц™~їoўkkё,+ЈІЇt1rR'лшk}щgљžя;–f˜І&K\чЗѓxZОЫІ%‘kШШWU7-7№=щђ†у*џ~;$щ фišЭлУИ†Фt#Я{МЈXqт™ЊШIЊ>oGа5…г]Яњї~ Z˜хIриЖ7OЁ8IщZ‰§[PѓЃЌЯKђќўkЧPЈщ/ТMwЇ” †ЮЕ:Кg:qкТ( lКxкішU Уг4r Uќ{žъъѓtѓ™a rТё=D0IВљыЧ€уš•Жщ˜ПтDЯЫВ9яЛ–Ё)&^‡K—fL02џnш8™к{‘вQшгѕфŽeZŽO=R]KюœŸ‰žўkкіЃдЗ4“:Бљє]–в-c0агџ^^KЊJL лrЃ0 Љ›ЈeЬЛїй.už сuуЈg§хˆ*яZ’JЏEŸ_8mkВ,[H# с,Ђ€џ>ЫЊ*‹`У ƒоК7яn@]Їl|ёо=ЃwX—х_oЦр8†n+ь4›э.ЊШ3­j[t|Ч ш S§ёзЋ№š"ѓЂI­ ЈЭЅядлЫІYё‹Ўы‹сЕzVAQЧЗ;§…~ЇЫіКэ‹ZЃV­е[эгэumQЕ‚ЯшЛДЯЊ"Jšэгe™‚Ћ МЄЈ/K’8Ё‹щщR[Г^•MW^CЉл­зj•ЎШr‚ЄilГХ –KRЇбъkР' ]§ЧZ’;ˆpTƒR{Элыt–Ў]GФ§8dы"pТАS•:Џ^49zЛqЄ2ВeŠm ,зяk‘m…i`ўаЫxЁгд]з|Ы =БгLMтz§~%Iт{,uЎѓƒHя№Š ŒХњљq…QюЙїQ‹d#№]нЂFюrЏ-љŽ›фОљ гoЖZžЇђКЂRUQнs€Т‡hK*ЦЃ# ‚œ7[Ч‡Їm ХМ+<,TѕаГУаq|…ыы…ВќИa™v[u­xыљRГЩЂaтЕЛЎ<Ч1ЩkŽGв[ІмGX\хјЂ/ЊH("Ў!ЕУ2œQ’Р‹A X3АС†зLбг \`„СvyUU–…"чt­Д4dzœР œ #UЙUЛ`,Ч№сІЄižљHј8 Љ ХЙcyчИvрG?n~унєцАЁ1@ ЯЁžнКћ Ў†&аУрЛ=І_­ђ"‡‘жюwE7ц]ШЃa1фEQ”Yš@фZL_д€йўЛДD"ІFїBiЭ.8]шрuР8$(рЯ'˜v\"ЗЊœЎлз4-”“yc™йt8ІжхЃс  ~оБcЎ ЂbћКћЭ­џ›ЦSЁЖ п’кuzWј&Еe‰гA–$Q”„БG§sQВ- €Ё /€q &_zЯІ—W—jѕž`eср;ТљЙшfhp?B‰Б`Ёc`аwъ’N51 ˜ХМA7ѕO ’ФЗ У6,SuВРBчУбВ!уb@-›ЧуQ–Фa˜ czXЋ[у|Wsэ~ћаYhЎяђЕЎЪˆYœ—y>( ЪUjУœЬW†IЇbМƒбtV†а.ј˜t’ѓЦЋ‰ тХiИSЛн ušЂ№НA„Q EадFЧ ЙQœђŒ„TТЋД:#Ччн˜‹œў2/GуЩ8ЁŒЫVQ=HЏ<\pPЂ€#Aр№mСГeЁйцўГŽБёš Й[Q"@E’$Єœ0 ЉБaИxŽx0яw=Є†Л ўdIVŒ#SЧKŠ"Я65У’<ЦЛ=в0!т/wћ6HJЏзэ|яДє vTЯW;Ќс‡IŒHЃЪбѕэ6ђмALЫr2яы>Т(Є §a–["Нu0/ou,<~ѓ P2!ЫD"Њ—–#ъƒ]d } ErЬr‹бx:ЪЂаsёf,?%BšDІ‹|O,•гљ‹&+j?Bwu9Np\­б#:Mв”Z$ь@щQƒ+T: Д‡У ƒ˜њдDUЗKъЁ=ЮU‡u›qN§аSP(бTъ­nџЧЬoeh/]Vт$БПpQ_ЈžŸ7MХІ™‚`~ЋЃ›:TЗaZQЛд>0Щ jхŽв(дЉвЅўн’Z8!ЫђVƒ™Gžюр_еЃCФф‚С0Ё€Р—`Е(Ы’ШvЛ…:рЈVЏtšWтyiЌГ’;/пu‰Зfh8 @q M‘$нMЈН{CГPOФЌxЖgВ‚—x:J,†зЎŸяUЊѕЎFзлќ!‚^вщ@УYІ+Ш"лЌtyeоžв6MšD—%ЄJ’Х†у…Ј‰Ш А№‹РPЈY@ ƒшgѓZy3@!mСJBУBЯдкЦљбљyНЩЃИzx2ТIїљ­Dƒ:ЕpLОjЊІВЭf_PL~pSxЊЪ^шЦƒШЅNъŽдcМЬpƒAъг$Ѕ›%‘Јбh:ъП bЫ‹51H\н ™­еšеFЅб•-‡š=btг$§ГцЉ#˜РvК}мбTEІйfXХБdХ CC Нˆz- Юљh:t€(ƒтƒЪyѓч€ѕF“Щ6 пЗУŒКцѕФ(0єРсš•zГоъдhˆOС(чч:Š* ,Е8FёѓL]“ћ­vGаTХ \K”п‹ѓУ+!•‰ђƒ’” Eš!QrШ€вe4bpкšƒя,SзQzVhkЖ-v[LЏгcjuсk›`p|4xN‡єП8мрX–хEPхZэVŸЇiOGЄ›x!ГEGEŒђЧжЛ*јЋBo8qQKŸыєh9УђД€ъIГќ|ЛUЏЭ!Фmз+vEеУ,bзЯр\‘ях$ (A ЫбNFЃ а’Ц KК$xТ@з\šЧCTњЂ"t%ЫrР]™wсНЈ›\ЇЧ+he’QЁйМ8nѓ’aЩ–я'дІjЁшхЁз>ЄфР8Ьц"dАјŠЈэУ"  SЈq‹ *›€hЫZ›\QQ5–™ЏCЦДўaис ѓНбъРZЗќ|@ы \Н^;nѕ™WCˆiЏ ђ!ЙAщЂ|<ƒ4E9Lѓ PЦП.k‘ lfЁЁй>ј”%к‘ЭuGšЦАЄ:У, СБ,а0џeћCXšЦЕЃ23žeлЭVЅСˆ, Ет;r_v§8Ѓіцn2б0LI†% $ Э_G ~IŒф• a™к4 •BХŽA QQј&ЄпЁ(/x RУYжL/›Є–ЬєЙ~Ÿm6xŽQmЫї4N@Љ…аT#д•c„„Ћ&ЁДКцq” _†ЃдзмУДвШ’4эЎЬ3=V”фўYлЦ ЬІ‘C­ЙP_дIG eM7.ЇБЎpœ(bЗ'2}YбƒW,”G(ЭFИ§tXŽ PNаdэ‰ЂЂ)j­QzŒG‰c!‘?M …\Ёнъ№дбВоžїPЛœ&Ў&Щ*uєВžЯX{’l:Ю“ibh'+ВA$ФЯƒ№ЃаІbIРТщЁNcЃVщ0пgнAК!Дc1$IfƒюљiЁyЁ)vъ-Vs )dN1]?NRWуYN{СНёŒЄ^”O&“N3’Њ ŒЂСsNbX'ЄІёО!‹L#ˆhŽ1ѕ]„S<и;­6• CB2)P †BjKS}Ww|Гw~СŒ’НЉЪфТlZУˆВЂМ`ITU^ 'ГL“X™*pКЉЩ\Пеб\'АUЈО ‰€TБ§yqЮќжњњЮўСёў—fmЈ ћ–—&Ў 8A˜Xœь8щq…гPь!\Kц5'™NђРJ‰’№мI8nRКbVшЯSыmо€v‘и6ЋЈ‹’MНZ еtшдr\фqjœ,Н]Z]__]Љ†ƒ€Цi–щZ˜'Ж*Џб?бЊЖiпEdд;“EЈЇЗ3h5Ы}xІЯLЗ^Ѓ“КІ™сtl’гšЁH†mы2Чˆ’юHјI>j%Šяџeя;›Л’,љ'&VН- шНAТлчН7МаUЉЛїУЮўя=‰ъQkІ]Њ’JЬP@Ќ ™/_šsюЭ{гEqё% ‰СХ§ЋЋkkЋkЋЇZнЪЂюз5Щ7%IqCGУ+гШ”іkM8ОТЊ†л›N†-”CCпИЎWЩХOг‚, ‚ ­О%ВАДJЮgс1N–hЫ•\(tDUg•Њ_кќ№сУъ‡еѕЛ\-ЈddЯјQXRБbzР[b1WBб2 zкND+КсwЧ“щИЖlђлš‡ŠЙЋУ›2WХ J}рJl…—UEDQ7ЉO†e+8Ÿcˆ Ї™ЕКc94ЄWЏ{љЋ?Ќ­ўАККY ыТcZ0ВІкЁЅђEб‹‘ŠВГъuhєЉ/Dўщ Ц“мўђ6ЅГ7З%dMž S8Ј)lБ SjД'ТWђеE%S+ŒŽ\Œ„ x—wъЗїa9r|mm‡ jњѕ5+С'$V Њ–ЅTG—˜"e9ЊЇЭNП_;г@=зЋїІƒf=єч-І.SN%š%‡У<ИЬвˆDp;M“˜м]šSuЧт90[АmTШlт𭆁—л[_[mЌm]S7'4ЬУSXЮЎ;ЖЋrКšПЭ Њa!15:§A/аY7]ЯmЖgуN˜ЅіЂXЬ%ЫАJЊ,+fcд 9*ŒпSe 4&u—Љ№КЏВ 0“ЪgЯŽRv=єЃZхъ`c}ћ№VЃ5пвI шЩ3С№с%žЦ0й›K“4С‘УfПЉšp •єц|>ьAЎО!SВ9•ТsiЛоk њ K‘!P&"2(щ,Уk/!Р<з…эoіYкЩЊЕ<Ѕprdѕˆ`ŸuPi~ъЌЉъž@Ћб%Ф‘hy~ЫІ0NА:г~|Їў†йАРЈРЦ„›нў  \&-Щ УpД/Q‡ Уžэ€кJl.~‘qеАZkдЊN%Џ{A JWЃќIyЦ–‹%ЏNVB$д<Ј ZQ/Kх8еэ-gVw; УohP(=W[ƒсpаŒњ§~Їсбнr*ЭJTswаЙФг„Uг6јмM"/зъU5DjY0r†šњйqСДuЅR]ЫV˜JСBЛН јІЌы~ЇлЊ#нѓ8а˜ЦнњН^ЗыП^iжє‚zo<G“щpиo6jŽІjbЖ !ЉкžCэT<'ърMІgpщ;Ц№iЃsЩ^h˜_uЄЎ%†,)ЎeH%Zˆ0)\4 IL"ŒB"-LEЖj“ЇЇћdиm…ЏжЙ Wm†уйtдŽњ§п /)VPЏљи–HУ2mлаљLю5‘iЃ&… ёkOJŒhЕ;poа9Y(мeKЉ\%О}&5лPšіфZ4iеfЙƒзТžяd4•K ї xдщЦуQШЅ’Яч9xh­щЗƒСфсЯџљџђ8ъе^ehšїДЧ‹ЇљЈлˆр›ЭVЖ‹:ОТCiЇirђ–PЪ—3WћwNЏгFЂъt{§nЛйXn~вnF“ХОнйИДbЖЭ9…ZДшEއ‘vq—A`ЉFН9˜§хџ§чŸFmяUJЏрСУц`ёќИИ{ЈЋDўТV–.sJаu-—AŒ9ІpЕПYiєЛ]ЈзjL@RПлEтъРkzQqoэ  Їу™Ьm2ЧвJДх„­СИ_5T1[Rt'Dє"vУА1|ќѓџљЫгА]х’lƒљЗ‡“ћ‡ччЇGиЛUѕќzПчЉЈkFcьƒ|IK6ЧfЮŽЏХnЏGЖ†жН^П?шw;јЃЄ+ŸЌo]fonВљb… `i{8h˜ŠPГ№р†Ёяљ^Е;ћјЇ—Чq;ЊО’’ Ђ‰АЇЯ?}zО4ъQ{мw5ž•ѕц4P@ШiЗy@—*7чwЉиэТТэ.J2ќЄпІўО6/6b›ЧIИ4*Š)P˜ІгPPSт‹ЌbЕЊЎДІOŸžю‡ˆ!ћ•@- ЖИя#єяŸќДw{ЃY‚—Дж} l%ЬУѕL…K]ннvЗG˜ќтГв”KЈЋЂ 7qуыБѕНЫ xБЂбТ7“Gm7[ј‘2“уuЗдЭ\ыLŸ>>єЃЊчšЏ-уйЛMMЖPТЈ;}ўјќ8Ÿ?,:д|Ђš­љЈFууuEsЂ†o*ЅxТPщmвўмxy†o5"к§ьћ‰Xь8‘eTХ4}-ЅŠВ^Ÿі,Й‚/МN;Є>о§у}?Йаu§ЕЃ>n3,|Ю4lQн?<=?ПнЯЦuK/Ї§Ѕ;ш3  bЛ ­]ъЄhEѕ†pquxtУъVm8™Žћ]ќТЎзЯњH–ц чїѓEЯRЉOпrЉqЫѓ^Л‡Ё8AНеІeI„FЏыFѓсN ќŒŸњAЃ?Œ'ЃС`4™4“Л>eлНvw‡…вQ)ЈБйš№’‡@Lw‚ю4†“йЈSsш|€WѓгA ˆВй˜Юfˆ“ъВ—œ–BъОkПv‹KІM@Є] ?o5СYjѓ—чI ЉFu:uН;ŒћЭZНбЕ]CHьiоAК№“&Ви\9мйл:ИuЗ5œM;Ё…–oFoйpєёœ”ž:@aoдoާъuuХАќЈ;хyŽЪKVmіђМшzЖзžЕЫW…ПЂюY–[ыЖ=SNl^Њ ђЖbЇ%#ЈGU‹M&тW=ˆPТлM7ИОБОЕ’—ЗлkGѕДВ)g™ўdин?,юGрH“щt2щжыеОб›Ѓщdиmа‰6“bMєђђђ8ŸM#fwћЮkљѕR›†S­йjсt7л9MЄ2Зg{БXlcї2УщŽkђ‰НЭэƒѓВjјЭШЅmšДz^з€ШбгNЭGЏEєbСТоа­Ђ˜^Н3…“8†ФfВ‚сєžžžŸ‰ѕЭ”а:ŽeЊШcUGЋмœюФ мюоЮжСўЦъZlkїштъъtsc}c3;Œѓ еeЁэш’сЙЛƒ=}ў№№јА˜ѕкCдMj;Г х-УXEИjg2єЈLзФb^а­цL§ ­нЃЕX\А}KЕlњ|.sБП;ИI^ьœньбњєъЦVlsяhg}m}}}ї4Сыђ˜EK˜ІЂ:ъЭоіњ†АxZРѓЖЃRЋ0 АЃ*Jo˜_Al 'Ѓ.˜!ъ­P.‰šQ[lz|zаvж ]Aw–k6†E`b…)œяdюzы4q5зWaрНD1БГ†pq•Vш n”іM[Ллќamm'K/žћОЅ+Јр<‘8Хсѕ§5iИfoиiдh1O•Dт(Е№о“sИЖБОЙ—рU0r:Pф–Ш‰bюјœ‘R'Gч0сЦкZl{{ч†Ћœ-ну*’@[­ˆМzыТp=ф,&D”Њы–г†ЅŸЄvя6ззV7іг 4ДM%oVцЏё§ЃыГhŒŒБОЕЗsŸlnЇЫЙ‚тљ6HOЯnЌгї\5 фŽЧЧХЄл№m:ѓљ<цvšyз ЋдIЕаЄуЈеЦњТ=Ÿчv|g#všaМеZЎ­jВЌˆЩ§Нисх&?^ликмлймлмК*0%Ц№ъ5Е][МYОŠѕиБ:™ппУ;ž`ŽЧљИKјп ъ(oŒlx>2<ЂFЃ&‰ЈеЮ_>~zСЯ†ЬќJђЖBkB‚ЈRЁ7L$0YLуYb;[H04Y{kырt{ћЊHыТ­Kв™rђypчјF.цРwЯфvф{“‘ˆvˆЄїz)ы†Ёв^HаЯž^~ќёгЇO/ˆtќŠљАnуч‚ЂТ­ЉV'š+мm!іЖЖcБuђЈОКОw›>иО(pРrvш€МуQ…Ы%гŒюч№Œ‡Ѕ%žAъžіfƒЊЅKo›ЋЈ ЮaDЛк_<П|њёЧџєЇQЩкї-Z€TiЭWEeSёЉHмЭflsйzЉ№й{m};~{Д}Vр*œЄƒЙ+Д*M}Ÿfа™p<,цpŽЧЅкpОO/xMћ­е+wЎыэlZ;€wМ|њєќђ„€Ÿ,+›E‡> И ”Vd‘ЛŠХЖQbb”ёж(XсЗЛћ;›Ч†P6UZ+Ё“Я ЬеЮь€є~u^>• ?Лnъoм§ф=˜К3\GѕЈsџќёуёј]Ѓv#\і9Bi:КЊ“­ЫЧkБнНЅвШ pыЅoЃЦv%МOH’TМ>ЧШњ“й|AB)щхуЫ ВпШЉŽ’ѕ6ЅWHчстсс~иЉ#W™^ї†Цы{ZмOG]ЄppuрЧ е"]•…єюњжі™ycЙ'G)dcF•emuэJтŽaq ННƒЕЖїт,ReuнXЖg‚QЗug8E0і}*М^kі0ЎЛДтіKњзUхV.ЯoЫ ^џёху­Wїњj§ЇAK<)Jb)uЖЕЙ§сЋылБ%Тл:=о\[†ужбоккЮюqŽ6ёRTuй—Œєж 0Тћ‡YЩP№jOg-xœёцЖЭџfsеtТсУѓг§шѓЦdрRcЈЦцГЩd"‘.Ц676Жїїі—І†ƒ ЂЧ6ckы{ч‡‡ћ[;W LMџQ'™NыІщз[Сd1­ УBыjж є—а9WQАЧO(пДM]н(j*—Й8::ипл;Oœ€lmФЮ2ЩЫгmqшлмZfьищЭy<БПЙНŸh3 ’ЕŠ*Њ€бцЫтОf*Ѕ,‡dX#$Є/ЂtQџ??Эhу€5EхГзЇ{'Ї'ЧG;Pus}7UЬ^эФvіw7IщMШЦжU6SИммк=Ip\ђ6•ЏTž—E:е dу7Х‘ЉrЉЇщNsађЌ7l‹џНdsХЉžЃNеbЅ;$˜лЃ“Ы‹ЫЛфнљСўRKx?™Пм?ЧOїЖЗ6ЗіŽ7woX­Cо$ювчЧYN`ѓЉB1us‘еB™Э›HQХыŒl˜еvгyТћR,хЫМ ѓaЋZ­ЎЅЩХыЃНѓLБТVђёЃгЋЫуЭ ЄшујeJЙє јэЮЩM6}qžфѕфіюбy*O\\ф$!syuw{yД{\qынщb@W•ЄЎ ŠсVУ7–Уџ! W*sЊ;xXŒZ5Ф jЗxspxr+е(Ь]ЂР2…јс&rХжiбow‚ђљЮжжюk™lЉЬ3g;ЇwyŽaЪ™›dES ‰ЫГГУн§§$ Žv&‹qф:sKюћ%”.в1 ^uzѓљЄзЈЙtЈЈpvtж,ƒ/ѓ„ЉйЛу­ѕеи­3ъљCTѓ­3БйOMЅЪЂЂ[ІФ š œ<мпFўО]vТжh6nћ†Ёч.VTгў2aИТ‰@ЬFиŸŒЧНˆЮєiьѕљЋ6\_v›шJљюbѓ­ї=уИc-Ж—kŒЧƒn­raDuйˆb™ь’’ЧлЛ‡qьЋкLЧНЊm˜B|…еб‘Ÿ нge­AПлядhCDМ=ЫЋЖI:гRuШhЊXЬмœмˆ^д гЛпїЧеисйmЃ„DЁR“>­;CщР“SH2з"ЪzаXЎUxЦ/jх§;)+Іхuz жэ ЉRё"ЉвЅ9ЌРЅрeЫŽЩ'нqФѓЭ?~їЧЕнЫ4яжšэ†ЮуM”dЛtj”ŽXЊwћЧq Ь(hŽ&§6Мžі%Е6LЇжЉ:ІгшзЩаЉ8oY.юЄ3.€ ЪŠ$А|!]U„цўїџыЛѕ“ЛOMми/Š Ќак_žЯ_КЛЛМсс_:udН~uї_ <БV5jн:,Э&Г†K›Д’CŒK•hVт%ОPdeE._lўяяbg)^Q…bEІ >T™W–ŒJ‡Дфm•oЯуE;lДЃ: Еса6ёЕоЅ—“Њ4PпџJЇЖ~KE.Ц9}VрЛZ‘5Ѕ•3NЗ--Ÿ6УАQso)п§LdгЋеkЄœЈiмЪ9 2ЃeВ–_m„ЖўMСŽП G7лЄ\QРчYJKЩ’ы‡uя[5єЪŠDМš’q‚nпНHJšVКсЈУжжО)ЈєsЩWЪХх•ˆзј8ЛШsхлт0єО1Јєхф”>Ÿч)ЫBK§F=њчrrBŸлЛјЊ`{Ёo(пRџ'rrFŸЋ;№СщПњlаo!GЫФНЕНВr%"yИкЏ9Шр м#Ѕ;tИыЗжфuТXŽџъ“AПЕ(– |ї{pщŸЩВїэwІ3”ж…пAК#Љќ”-DхлZыјТ§дЯЯ№пиВСЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛМЫЛ|c"щПљ%ЏлўнЕPЏ№П;П])Ќ~k^)ХBёwІrЁА’ЫІS+й•|ЉђOю›/]ўф3й•\.WЄak‚ЄќУAЎТrЊWљЏзQ.џvч‹ Хќ .–ˆ(Јкђb№П;ЕPд\пЕщ2Ѓ|ўѓпdsХЪoЃwqЅTЮРjt§ŸЂHŠсxAрš4ў№3•ф0Д‰чйR1ŸЃЋ€V‰ЛlёŸњвW“™ЙœKКšYžуEw=га(Э§эljЩЄkгК/Ъѓ\KУCЅnoЉ4єў•Е&ЩчXЭReA`ЈЬБЂЌ–eЋ,^ТпF+‹І„ПœNO)њЎ)sх|6Lч§ј,sœЄ*’HЃ4-лsшў<ЧЖ[­@щŸЎLQМjрtЧ=нНшиnzŽ&ё•|6—§ѕд.Q "іЪEVЂBЖуyнGљљКA]сWвтOЗыU.ягtКФй <‹ІЙ–*q•мЏЅ1)]bxŽaX–U лѕ›Ц5 ?ЫXєL•[Й.џ4œL_о`ОМмXžs,|ЃяЊШќzN„ЬsхŠЈбФ6К’жdeyO—KгЙ…•Г[>ѓзo7ЂT”tКN _Ш&y‰эвМцWЊЄх2У” ЌNУ0lг„#y,Ч$Z–Ec‹=G/_^Іo>{A.пЦгйLђ.S(• …|&]р$УЃm™Њ№Ћ€2ЪY‰QзЁщD†iгЄ—В@7xHm4^вsфЛГ›дч*“ЪœŸнІг™dт6žHІr…B.W(Wxx–g™š.В_џм•ВВфxxУŽЉ›žЮШ€Хb™хEЪy4цЯs*зЗ%НМR4V.уWёLŽЅщп"ЧV*œ$№В!sжp]УЄ€ќкJWђVЕ]гqiXˆЦф eІ˜ТЋЧУѓEš6­™Ž/ЇюЧфE7}ПЫцdš№ƒt­IЊeыŠ˜S( –gšКЬхx,“EйВMiЬГихМcБ”-S6сјJ!_b8Qв\Ћ”,RZЖ —gЗyŽ&д"•‡Ё#щn`›z5t“ЋKSп0Œшu’WtК‚о+•ѓКQцD•цЇšТСм%ХQbгiYЮHŸ\цEУ^^мъ„HЯjo5дG„Ё`аUЎВ№•kŒlС3lУSs™ pДQлtmšЁ‚”VЮІRЙr)ЯфуYUKчGЗœсP) }/ЊRЊЋFе0ЌзPЯu[‘M‡n§К‡CeгФ+EЌ 9ј‰кmЉtiяr*­чщSJ'тЩD:s}‹DпП,щrЗчUkЕV'єЊQдl乇Њя^ ЩєTщ+ІO—7Ђ8˜ЂŠъFEИŽ^Нf-Џuж5…Џфт—Їч7ЗYІPJ_eаЏЗ gГлnЖ[NЗеjжыuKюљ5[BБб‰ћj’чTй6ЖH;КуТ†!нО чвќmKщbјГЋЌ TЖ":aЃCЃVGЃ^ЛE4и›ц5GѕzеїЅи;о•ёЋ9H™зЁ‡м, "а‚ СfеzЃ UЊЁm/GёIхd†‘xсс3ѕБэашвfMiHP­F šчj"ЎY‚№ЕЎџ(”%;а OLц%SV,ПжУz–ЋEM˜АйŒ‚РЂЋ)5‰‘`sCЗЋѕzГщ!CpуfЇгjдлГdmw R]›НЊxЊrљU<ЄXбPЇtЫ"™с“qыЫЩэaPЋ…Є`TѕrУъ@ЋѕvЏРѓuy‰Uќ оlЕТZЭ^К }ЫrнJоЖ@}`”/ЏsО X6Ј ^Ќ˜АV5 З<иШг!аay4ЙйЌG5˜ОWPkЖК]_Г\ jEV$dH8Fр‡5аIлбMS‘ пЪ‰ЎюHТ|щУќљВ†Dl9|FDјЁяrD‘,iŠЌ ]}\к­vЃжh5ъaшг=ф‘ЇаL3$lЙUr dAпTB4Њ|I—ooVrљB…чПЌsчEЫW+0@:d+МnІR Y#"р84­ОоюvZџŸНїаŽcЩ’ёГ3Легя‚ ­U"ufhэЁudFъDBSTїўћкMОъщ­ю=ГЩЊъsрѕŠIˆзэšyx\+0й1™TzЖ*9S%•й6ˆ?ЁQƒ оŽ  FNЛЭŸŸЏTЏЏ›ЂІўд6B]“Љ‚эѓ<y)ЌyšЉ)–K-ЧБвв,dfDШЅvуLэдф,ѓ!Ч™dс>$>№Wgkv є№LDэњГJхrхъќЊж‚юќ™ L:ВФЫžе”)y—ќУ‚Є5@лќˆж#эШИd@л/{ЎЎ[&YЗˆ"9NчИ)Ž˜Њcˆйu“РБlhЪ$А˜iЋГ‹ЪљЪЩ1bЏwФŸйљД gX­КEЊаЖuд2siэˆ*Фё ŽAF}МUE5l0цSК jL у@зqЋ<ХТКM[ѓm+ AЯkNС­ШŠІZŒ%ђ’ю3•8ЄI?ЦzЃ^г„}zKCўgy/bhЅ­ З D3УІцћ‘ўвЎcnЗvвbдd\€ЎЕ‚Р'x[7- + б“лo/5TЦ,ќ5ІVlYYфк^Qц zL”DH/AB›.RФ ~EЏюwэyqнИО<8hšШеЄ]РVЎСLб№l?Ј`„IП—{Ш E‘ЩЄCRТjЙIYЦЎХ@К(ЖЬ(MЛ жфw/NіііWNNš‚ЌHвO !ВЌ|g—еГƒН3„‰a)’ї1BєL…3}`Ѕ9\Z_чЁcY:йœЛ†ц$Н8ŠШ<яJ;Ž"XI„ѕ‡+6BБqvzx|ДrеPСаqƒЌЬzJЃ +‡—WЧGuйt<д_к‚qќиE(–э%dN Ž кЁАЄОC Ж!Š,J™mр> sЪ$QхyЈCёЂФз!фыгГ‹‹г•šHоЧЫvы?дkЪ0MЫT„vГе\988П:Пќ;Д§‰щFь!. KœЂpИ6™рєШ_Мˆ№UЂиmѓV˜УОO>э‘ч†€аCaБЇZ!’л4„њххuНVYщЈФˆўˆ'лŠЙ4ЗPхNНжhtкѕЋ‹ыk|kЫMзь0 -E…ЬJГќ‰<+У$ыгшЅŽмnЗ;‚щSКєSЯc$y˜Wє)*Ь<˜D‹! ЕѓГJ[ь6VDЫ†bi%РWЯЕЖl2ЏKbЃRыЊКЁtЊеJSuЉj‡>”)єЁ—.MMƒЫЫ’ќчAё@­,(њ§СвўiŽВюd§ЅQг#)oЋнкљEЕ-ЊbГN4p0,ѓўkƒV c,(Љ]mЋЈ†вКОІј™&cžY‚аŽВФЇ‚эиy^ї@яEA*Іхe }х`0Шc*й sнЫцЈ#†4ЗФцейuWжtЉе6\/Ц—gГрјкКЈSmЈNIф%2r2uБv}yQ—eQЧЂS94ї’щЄp—іе›ц9ЯЁQ@š*$&oа/?p0ЙVXОЩ”ŽK-ЧКЭыj[R K‰tЁ&‹^9šOzСЋѓC! УаU”?кЄu™й­_žTКœ€{`sXџрzД;vиЯТ(ЧМBSeY–T‚яaтћeЇфKˆЫУ7Ъв8ё5нƒ@lЗ‚ЊдЪœЪмпУŠщbљЏ4Ђ”6 УBёB “[WЇ•Ž "н ˜8ІВG›1Y0'F*аDC€хДЛ‘bТ‘)Hы^ь%ƒВgЊэЧжjD‰оjw+зQDЫ ђ2vL'ьOЧiМrІEд5ВУбTYжнрkaсœ]v%AЦѕ„^йК!шрšXё(0)mЬ…N'“ї‚$xŸ.Ц­ШњžЂZXЛјRМЏUGB[xЗъ ™ЪШЕL;LrЯ­ш ’ЖtRd#шeY‘ЖЏ/КЂ(Щ:xFhЋВх8ЬO­v„ВB‡YŒ’R,тlЙUц§шœ“ЦžХРЭ №Х–bнЇX@gCІƒaтšИƒйЈќHхŽ@NкšjЦЅЏ+К* |ЂˆяˆеQ9H—d![ЊѓЂ?ьSЬa‚uˆ Ѓ„68 zУЗЩKS|QyЊŒ•’šэt$VMpG‘ЋЗ ц“~в#Fй ‡s”p‘\О_eбж•;зЃЧЋ ‹ЃyІK‚n1ІЁšxŽa€(ƒЕgY:ЬAЃ5№o3 ъ›Ћя?~мкќиЭRГЭБ TjФя]VЇЮщєфбuгбx˜КL,ППИ]L (eШ}U{9бUIh_œtШgоДм|6‚И“AЅ‘~рЅdfFюUŒLАm| ;ДUfЩH'ЗOо}З ^Н ЋвЕн8ЕuХŠЄABLiwБ]к­MЇЉЭ4•љƒ›Л‡Л8ДГђŠ6‚"rъб%ЇвщMчОТёŠхКІ­Ђk2Ч“Зkp"xeьƒ{…0З{їЯППУџŽэ,hžu /іtA SрЏj€ќs]Щ$Ё&Нёјl:ЙРLg‹ЛХ0"‹?C}9ћрdЁеjTЏлтв˜и.22DєР{ЬЏЉђЭЖl0Ÿё]#ˆ"@ЋЩєFUЯчє7DќюїепŽь,юю"ЫвPуU›Жд™ЂBƒ0š‘Xџтv"ϘbU ІЗу”/‚П8jа_ovx1 ЂТњ‹вQКœ‚›ЧHbЫ”:­ZSPН@Tтc2ЅЦe'BšˆлЋП/§ЏыA–W6„!-ƒоYЎж$цаўNЇУХ$ВнM@`БzгQ€ x9цuЛЭzЋ+.рIЕћјЮ(фK›IFТ@lЕша‡ТLY%Ž‰ЖДњў™‚—dТёЧЕеЭэ+ЏЊP}ЎЪ)@_fњFЋйН3Щл< gЙ ьЅЎeАl>Фtђ%Ž^Lє8H№ŽТђ!e†х•‹Edƒ!фх!…ЈЖЊJф‘I[ž%žэtв"Iт2в;/КіЪГŽiЎкт-ˆD|dДЊH`ваЈбt’јqЏ@…зэонн0‹ш‰YтПfГI`Ы зO‡ГлЊэоŠBFшtЖЮЧH€2ИШЄЦў™SІ14 IЛnњQ5Я(}XЄœШШžkѓв2^нРw!‚TЬЇƒ~ ДЧт<>Œћ хйk„ЂLлі§сЈь•“йќюf:wj 2Ќ2п В3NOUlп‘+GGэЌЬСŸ!fb’AUгД4vŽUпcВh‚Es-к:G^рNuеВуёЄˆ*ВЪТёгУtTц$3ГWН†ъ‚ЮfїЗѓХУУУнdвїmCуЎлP3рB99Ѕc*# Z›;:lшE/[ъr'|:K‹рtћ Œй‚оБКЕ6Џšt,d ёŒ)`yљ Эђ‹ХччлI } бѓвнЎYыZ~X”Ѓ›‡Ї‡лХтсv<™ИНJ[†NI{ˆ(пЖА&yкВИ“§Šm‹0h и&Užг5злŸN;v%W+<Г ОкыхKВё`“%†пОоЯЩ=7ј…љб‘К-Ш‹Д7šн?<>?.цw‹щt6Ъ=ІBБl4ьl"C1г\Гk2ўpыR‰HкцЫ{›’с =ЇчЙТХоЧƒ.„БоЙЊ)† B8ž/цSм;ІѓВaY†КмІ(&џђУ›M7“ђeј!Њ~8хЁ k•ЎNы§Щьіv>ŸхрК]^QHЄCІ•ѓЇ?}КПН|zК›О0hаеС<ЯїwЗїїїїѓёp4z(„ВюG!™1ЋЊиЁЦыzeПЦzCИЏyоЫc(]кЗСВьЅњйж‡O•жѕХХuW‚.„lHЫщ|NuХзMйєhŽІЗЯŸ???мпуюоNz/гšЎ~† яŸП|љќќќєјp7ХЗyL+ѕlMSЅЅ!,ј`§фршTшMёp4(_Qы0ЧEПз–}Пyќa§ЈvqxV­7ШвbN˜–“›ХР7ЬЮyKc^Bдусёс aп/nчЃaі2vЊ ш +“ХУгзo_џќѕЫгнl<ПB š]о$КЬ“NЇoHГУу {:™ŒhІЧјmдЪћ%э™†XTцеЧнЫгУKƒvЛ+/}е§l̘%І)е㉆‹›љbqsѓ№љыŸПмM†EОЌКhр†аЇHВбєюёыП|ћњ|ЛИП/]S oМˆЁ T§OwMЌžVв9V*ТЅЈЧуaYтGєƒбtžuw6ЗЖїŽ+ѕЎ МсHКйЖWLg9ђƒїw7гљtzѓ€ї0+ћEњBœЖ,ЎЅЛTŒГr†яѓѕёсўщЉДQз z—CЁX˜eл !ШѕЮхqЋœMЇу1f–Жkіx8™L'~0žм •ƒO6і.ЊЈ,–eO\ЬАТЩЂ`&п”­`r ܘMfї_О}Ла“Gџ…2РRЎЏш<)…хЩ№юЫ7ЄічЇО „вœЩ§8 ес.7d"зЏЙr‚М JЬьxYя fS4мс]a–jХ‹{LєЭтсЫЗЯѓ^B/ЕлQ;зmd,€ =>ФѕEbїCаЬUrВЌzN˜'§абыgђp6Ххpˆ 1эSќyи+њх`4™hпo\t4УЩћ‘ш‘:Мц яJKячГћ%в=yОe!=8@•йT С‡€€ЬvМdА}љњTB€Ј,ОyxИŸM†Йя@=.&‰mt*кp:ћНr@‹‘2cŒe9шгѕ`<’іЖЗіO/9нŠЪбeл04№ЃёгШ6HwOЯŸƒ4№ЁЭhџ…–*6‹"h5›Н’м О! ЈДф Θв0Ь'ww7=п–r™FаЃвc:eЏШћ€юЇнЃ“гkеђ{ИЂб qТšо“LЛФŠyzМAaeŠФŠCпy‘xir™cЎщИq:˜нм><ўђyшщпƒ~˜Œ‹$ЁbоŽЯl7Єё!iŠ‘бz4 ‡]H2ЎНп=?Пh1?q“АLA=ђст~шМhиƒGŒ›ž‡ )ŠВс,•їЂЌЎ‹!h1MИ—“Щ`ќ€ 'О!iN~їјxЗИ›@ЇююяnЇЉЧј u<—хpo‚{І7Ј#„=OцЗw7PD‚nžrЧPИ nˆB/xбћuu9ˆв~тBй“jNЪ2M†˜ыEЬTе.юуйтf:]мп-nяor—I'зЩx@ЙАiуЄX^ву‹О}rВЗsЉ0/Ÿом/Ц`pфd<ПНI Y6‚й#Š!UUhЧ:ШСШcџeмДЁq>ЦX:P/,@уљ—/=GзС§McЮ‰ƒ@uœЊ˜XЊ+eN‡Г šщ~бЫ{=cowїbОМAfžУ,в,›/Р Ї‡Œ{xœ† ЙьY9dXT/{r['џэёb˜‚ЫслdeшиЮрљЫчilлбєБЇъ Э(Š@Z ЦНРбЏЖ/`k3™аП Чƒ>–bЯЋnМп:h š”3dGц™ІЁ+Кушљb;n6#NЖИссЫ&гA>{йљ•–с)€aжЯ“4+ЫЬw˜]<|ўќ0NутцЮ:Ћ3м}:ЇыљPkдЖ>жCрѓd6ENїР<@•†tјБ,ТіжкЦЧƒ(sќ6Х<гж+ˆЙЈЯnEozw*y{wюqs{7[nП/€йƒžнмлX_џxЬ[Шi(АаP›К%еђ‡Х?шўa#Ež№С,ЧgМмє–Jѓ‡ћчЏ_ЁЃ ’о|§ђѕѓ#ЄLtДvl’VЂ №ž(rMё„шBŽВ$4[‡[[[G -СBЬхќуЦккњЧsе2=`=кз мAŸа ќPЁЗ77Гљтf6Ю<›щЏи?pмЈwѓœ2ГSьJЬŸ –AмwђцъшїШнtУШГДЦСўбЮіIхњ|osmmmumsвJх/Зжз76оЏoе@ь\\Ÿу 3 ф! unЗ њќј№№ИіRЫ,Kшœ­,Мќ'fЏ?}ќќэыгэ8=[ъЪ–;|њђх•qV_]ЛЖ]HpІiІЎљŽ%7O//?mœo}м\Ї]БЕћ;л›kѓЦћЃЎA‹хCП,yŽвНиЈLŸQСяяІYрP•$nаa4§ЅчШP‘ВСЭ§чЯ(!Н8№ …Еџќщёє<Нњ}§\ЃѕЄUIЖБ Q};ЕцљYWыœœ}XЃШнНуЋ‹нї>nЗe†ѕч0Sl)d=Ю<ёdч§o•йч{ЄђгУYaщ:бх[ާвmuгѓ“ўфющсv6ЬQа™iк^љ™’њљыЂОЖКUT:oвёзЇS<ЖоЎV;šxОwyБЕŽ џym{ћ”—+Л[;{’ЂЛ>эnрЮcZŒ‰‡П§ОњЎuћыhz;Lзв5кvВP]ітHЧ‹zР,&§и#mЅHЩ—ЛfГ0ЮУ~‘сЫУ$я &Є8)шЯЯ_ ўјгЇГŽŽКІ›  `*Б‹xКћkЖ6п.ћ“ЇЏ43JС$ƒŽ‹0ˆЖiђѕћ­ЭїыTi–W‘йЋы˜ѕэЊЈj:Гh ,ЏаЁї’вщн-єVїзoпО`ТЁЙfЉУ^yф”љa b{ѓ}мKі1 o™  #:№ƒ|eЂ4гК.Џn|иммX[ЇФFиПCpkяЛ2=-Ч,гщ:ekNGГЛРнг#E§ KцI;ЏѕcUТ0ЬQ`'EDйtѓšщ/Oˆ7“ВHBџћ  ЫЬF5гŸ>`)RJгŠќ§їп~Ѓ‡ kЋŸЊВЂЈрHДХjDqї'cШ5 ЧУУѓ3Вћ™’яё~q;@•y]а+^#@g YЬЩpГ{фє—Яа‡ѓЩ _ЄI'(<Шд7-mМп§D3 о<:оќэїw”нППля( (>б2˜Ољ`<š-(?€ ѓВЬю?љі 2<ˆ^}HЂЄ ГrЎcЪЂb{=кВyКGШKiBYMми<цЊњKЁBъ€m…Д§1ПЛыy–кэЖOюЦёћўЗ uцњй”Ѓ "zؘЉtЎŽŽŽOїїw>m›п6[чз7vіw>nb|јАѕquМоЎoЏnnДdIDIъЫ7a ц†Y9ННЖб­ёрЄљl{оOшеQщэЅщгӘNKwЄ7[ИЋУНƒЫF‡Џ_~кў€’ВКО{yісУI›kWЮNŽO..ЏЯЗзЗыАБО{|TщЖЈI­Љ+fуъМ!ƒF…љ`і8‹l&UЊ2ўX01?ѓJ[6??= Cp9Ж<™ЎwNOЮj—X?нйzdЧокк<5г$4ИfƒУЕš­ƒНЊ|9~purry~VхVНU9кплнмЊЊЫЈ‡w а:ЋuжФ-MŠ№Ауп-)мƒћЛaткtтL‰?й9Јt5`˜Ѓ6ЏЮЯЗ?Н‡Y_не&ѓљ8’jU!N†‰tqv‰JyxеИОК<Ў^]HPAаы?!цф"І Л}˜ц5К rЕНsЉx†Ž-ЗEЊ';оoЌОЏeѓ›Л‘uЙЛwХЦѓљ4WNЗ?ьTXЈ^ †cѓИ3›япПпиn{ђђщУЂІл>Ўг&яŽ§ЗС‹Šn'7а (МŒюьяUD'ф:†,1&Ѕ]=?к~Р‡Yр\|мќАSF“љ4nэьT ДуXИzњOКмнDдŸъєЈСK‡XŠЁуhWgЪO‰QЫ†],nЇ“мГ—хф ІЛрЎ.mcђhEф;ч;чЈВyоДЙs!‡iЏŒхЫ+Qџ^Q<™ФQлО|иЊht#.ю&Ш<Ћsџг|рEАысb6хDъtюќДЫˆnG!јКIцМЂщЭS ‚ХКGяWз?wгё\Sч!Э\"чHWyj&2‡›яЗvЋ:Ѓ G‹лYюл?зЗ^Фj)Їу^9Ъ]ˆnюєАы†Јhi;І‰‡tшMgbW€'ъеж*фАQENзщЅр є“Ъ“о4ЯŸЕіЖwїjј”eаwГ>єМ§3[ы˜eЃ~ …”cтфыНЊ ˜`MЗьцF‡gbBЗ{АЖv*™ Ёг@Є6ž‹Z jG4ђ(АZ;еЄзa&‹›1ЈэќФЖ‹ЁK]Tн’‚цЯЯTˆ%z„^ZІ—ЯCС1‰—ЉŒыЈ•ŸЎ$†вivЊ&хБяаk§q’гЫ:e/і}ЃyИuЅрг1г 8Е_u*іџcˆЫЦ,У ћЉmj|ЅХМN§€ƒD$шu!п5 ОE5№рtі[`‰osД"шщ^’ал0%) O>п:сAFМTЗˆЈлбЯ‹в ЄЬбUгЯлPщбЈыХq 6 ЄІXtœнЗ,Ё)уnƒƒтй…› ЛР]9ІЊcСbв[FШ?dЭƒЃ6€7$RѓѓРюћ-лфDцЦОehкpА< H‡О4YЕ<Ф%7%ƒЮxЛ~н вЌŸvиЫЂЬГdйЄљS:-д‹qaNчјЈAн’A?ЈL§д˜ПЮb(%КкОюЈЦђGzљЯЁМD•^Ћ0ЕІЈYQЁйрт8dОQ;™”1ЃsJЫS)Н+B_№G{U хHh*ГП шЈ%šекЩеїг1ДWCmУLYаЌ ,Ѓ#шVмO< š$ХИч#ЩѕђQA{}*5R’=OЛ>ЉMm?ŽР_+Рџ7CyзЅц9и˜E}—ˆЦ/Е– šNT$Ž)№š (Ч6Y<Œ?—\Ϙ€%лІЊа2MВtйіж пQqєzр/Šy…АЏЌœžЖXт+ŠN]Ў,zS_шШHї^с•”}€vГfб`š:ZAїцѓ~B'ч5\Рdhїl?ы‡Џб={ёfє‹‡М|CЏaаЃ…kQGЗБ2ЃХ›nJп:l'™ C&№ЖŸчЃyKˆ|zљ…ŽАІ›fftУќ%йќџГЄvK46•љfг—T~ЛVГІЙљ$wў№”7œо$ГeŽy ЪG/ЁŠUЩXЖЂZ"ЏљьWЕ~љЋ!K+ЕZK€ФSјVНжр5Mwуb4Ъ|Лy.9ёДя9ТюVУАГYсЈн†(y€Bз1yЮєЃ(У{ењuƒ„іещEЕMŠЫђуb0H=ЛuТ9сd8ТоБтƒYтЊmе :`LEO­ѓDЖ"”иП}аŒЎ k ђAœ—eъ9эУ& ЦЃР•Я:@К›q`s ruRІGJЭтj2syўЫŸ$џЌСQ4ИШžдЗ[Ж?žDžRU]ќаїдЋ:вЃœ–”в6шГZЉpІŸйф…cй№AчуQиSоёF“ШW)шщmтtŽЊ†Дoг3гh^t$эя„ќФᕉ?Ф§щ(ѕYхXpУЩШwЄ А{2 эЮ~EУBЄ“)$™І§Šо/МЦl0Ељ8q­ы Х‹ЇcпЮ9Утƒіо•цЦЃХ0u,^%§™ ^~`(Дk6Y cЯЌ7,?<&ЖM{€Л5гM&7ЃЬuџAт]z?8Ÿо@0iѕ–хІГЁkIG5У*ЎU=р젘с’|їязФљ?&(б|QЎоh3?›–Ў)э_ifоsѕГ%ˆ†w‹^рџ\ŽџЃCѕщЭ єєfЫєВqп1ХН+нЮs&^YA:НŸхїwХ‹џ08PЗсt˜ј&Д7ˆFn3nПi9Н”uі›Hјљэ0~ѕ[Г?y4g[kњєа7-›ЏЪNXfŒ5Žeц—Бн:т=Пwƒ‰~uЋ€_0>ќѓЇgJa>™в@Ћ4­ HЋ],„Vѕ\ѕAAёЯи(џico§Oјеrуr:эХn§Dђви6k5гNћО~ymј Нзуўн˜Ц6v[Ё­‘ #њuїZ.ѕkжt;Щ=љ\$Ÿ “Ј‰ЦиЄ_PѕњЃ2OЄ “њу5/e;ŠmўBt§ўЄчџхiїъЇПgЈџkа/< 2гXл=T\ЯЕWŽц‡ЌsЅxQ9гўуœнЦп3в7–AЏX~”хa юэrЬuŒ•ƒЎэњЌU3§t< ю.юOВgYь+л5\і[Žуше6sѓQюYПЖУмkGл §|хфг)G Щ*†ыˆСі‹Alџвs?0djKЧфГ­НZЇ(џЫGЇЭ —{GЭЅ РЛ••§уЎeє#Э\~љhДЉz|ж^Ж9ўЇ••­3й‰ћНшe/ЌќGGжѕцйeч/вwЊš›єѓШћ‡*с5гc­гКјЅ}иe~кЫBчзwж§€Ј КЧMMћЃfWM/ЬВшGZA§њ!9Он:lжл]л‹Јiк?rJSg@ЃuкbA йёпўХо|Ш GMŸџZЕ§РUџЁ4ј:КМbyСХDaŽkў­нˆ^5dѓп:ƒqњЏvјyC§_Џжќ—˜цЗё6оЦлxoуmМЗё6оЦлxoуmМЗё6оЦлxoуmМЗё6оЦлxoуmМЗё6оЦлxoуmМџ0’ьЕ?џnƒ%џхB^Y1џ1обоŽШўœбўп}ТѕїБќИгљхёќџ­жПћИг]Y9ћыЯ8Ћеkfcљq‡у9ю$№цJЃехyQTЎђзџZџ-/юКХё’єw ћ{^`[эVЋI-~,2yќoсшІ"э6НЬЕry]otšэЮпсх†nЛЭcюš­' žыˆšIЮŸЎc§е+-Ўƒ ю‘яv;­zЅкhS’рППmШэŽыrWdgк%‘$ŽDйА§аwДяЗр§їOэШ ў:JШ~•LКEЎеЈелЂўлb!пюЦещŠ(ёМ$Ћ:5EfKsЧї­яя0ќёўoзpC‡ЬзЃj–ЁŠ\ЇеюtшУї2К\ЗƒНЎ ŠBžЙ~P}Ч Ј'я›Ыt§уEkн#Гvj†ьИaф;ŽMЖЮ"‡•€›%ќоэRfv8ЎŸЊЙдKбw–VьыRc6Чw–G>~џlщдЈаЁжX”=dР,Sх;ЭfЋйщОТх1wЕ €.е&Я]$*ЕOЕmjzэјдiiљbЮђјС^vлдUEеdAP-з j ЄЫ\{™мТп Ељ.ж()Ис>™0П"Тq\В №Ур{џ€яAѓІкЉUЏЋW•jНоР-Щrѕ3ДdОлЎ7:ќ/O€FЉ!™.ТљK{ЉрыbU)*YНв’ЃvДќ‚jѕpчрЂRЋж.ЯЏjMЎйшJКЊ"Ÿ\‹рЛоь`Вэ\ѓ\ЋHfdŒDэœ™Юе+зudg5œ—ЉЫ ј4еЫbВВ{АZь)H^T,['чnIрёMLE–;јв6џKQЄ‹yцe3ŒђЧХ|ГбjЗf›Х&uFLЁ Ј–ЙN]йЛhtq)6ўыЙф1;L}K:’Х4]щЂЂЂ8§К˜Q}kmХЩ'!VЙ“[d яјqЊœte”ѓ(Ÿє+„ЧZgNћ˜§Дъ] јŠ#jR“1WVtѕ‹Га3ђO \Ÿ™`ЅфL‰;Ч9>зQEХ4uгKМЫК.Pа‚ џŠ eЫ”-§Њb#rП№ђћ“qs1їР…<Ыу(LВШ‹о 0эШ552‡#€ФŒGHЉ, ўF—u'ЊВTЋ4[$~~~ЬœjJ’С]+O~Б!љЂИфOЄ›†f, <ъ˜^И i  pЮЫСФЛ†дхIРФБы‡HЉ, Ag Y6YГСеŽ.ЋM2јщА'irWU-`ž‰–"ГuC5,mщЦX!gЄ@Ÿ’DЕгrrХг 7E2чШЂ52@оPSs™ѓдыыЫУ“ЫЋы&ЏjкЯэ]и•ФgrM“њЈBІИL“5ƒ\мШР^šЇ) ИŸ’gœХ˜Цеъvъъ`!’`‡(š†j‘›&"ЫƒUбэHJѕpwярш№јЂоTѕЇFню4’\яхЙˆъ-Bѓ]ЫŽю7—m{qЏчМ Š’аЊзыjZ ў„nˆдd‹RDзє Юќƒжэ\ьэюmoяьŸŸWИŸž MО~%8^ф[†ЎЈљBЌQоШЪe1Ї8э%LК’2˜w4,€3nф ]Хєл0аЁ)Хр—Зўh5Ž.uL]б4tšAZSдТЌŠl;@Й№3OГ]SеtЫ Гв5Ј№БPu^r“а4ь(Ђœё”СЏiIўWC"f†$%юі–$`> +Œ  сCрF^‹sт€:Ž3љђTѓЉ_‘ЃˆћЭoh!м8r.Б–л<9:;98;л;oќЌ]UTWк2ЊЌTk•ѓГ“KNЇzц†aDž^:– eиИзЎEЖЯ]u‚†* еЃК’§‹_”ЙkГ 2 ?v €HшšvьІP9>ЋTŽЏ./м>]ћqАІгфŸзЈ­TЎ/O/ЎъЂЕGє(№§Ѕє–Ds†КA"ŽчЦYl4ы`m’$w*—…lЁОW(…ЁЫD5HlZ”‰ox"w./ЎЭЫЋЋІN.Ž§B?їП2$CнъtЛѕ•“ыЋѓJS@Ў:Р iг QьNФjDQїV(*GоKiф,hЪоBVд?н Г"пPU…LДМ8ГMOjUЮ!Щ№лOnАdњhџШCщЛs„4зОZйОЈ\VкPƒhПc€?ЧрўK/Я,ѕ$фXъњY?#;yY–Л†hКY/6;ђMгУѕ бSvcUvƒаVtЎzYiH†Ю]з–fюФhМёql”й„dmVOWЮ.ЎЎъд! eЋZ!]_ђLђqm‹ь†rАН4ptžч:‚‰ +ћ‰­˜а5sЂA М‰шИЩ nЛэzЅвр лЋmРQ”Ъ^ў€”AіъБghэ+ф2Ч5ЏЏ*еŽЄ*ЊЩ4їбб—ћ)˜TЊН8)zeЏпKhŸli-ѕ†e0f˜ 6‹{ЉеЈ[ -xЬељE•SЁ:е†`;A>šGdЮ№Z?  \Э6ДЦЩYS'УЯИЊwEк"Нї™"™љкЬThЖц§r0шe €нИOaQ–УєЅаp˜сфН Ѕpvр|НVЙЈД вAэ(žfѓщИЉ_;бРЕ\ŒRН.YЬ6еNхЌвFюŠ "VTmЯƒ€rt‘йЄKBе{DЋЯW‹~Ъ*і——ІЛ ŒiKbvЇrU­Жe)п‘yнŠйьцf6)Г№ЕrM(јЛW‹*kЬ lKiŸзК(бЂn{š`GI:!˜гЅ%w˜іKш*ъ*dь ŸЄЄ5КJ”# cW6GМКlvdƒv"\Y0Нx<Of7‹й |Ѕ‰•QDІžžkšІБ ШЩ TIрWbЃˆћжв^еFЬЉЇЂЭІЄ@ …рѓЌпO\7ї#‡IЕУ”ьѓ ШдъE RхШgВФќо|в/њгХэ8qќзm0а7 ІK3:‹ЫšUЌ\‹:”ЋbЈ.Њ’Єбој #Шњ%m ъ ZфšЂFr lF(-i›’jљ‘GІЂЩ­ZGŘG%JTн 3РПєg‹)ˆсЋ]BL3€Ає‡,ЪEˆ„тЅЈ‘‹–вхTАdX HiYB$4Pp$еt/†LЁЕн8t QCдЁ'sпІXкхГ№ЂбЌ№чѓС+ћkЫˆL#cQђa—5ЗOfMрќ‚€RЇЪd…щ[bSvm?и–m‰фШ‘М з$І\IбCъz†eЎŽЈ#MВш‚Xkё‚j’-%д˜ЮМьfл†хЃљ0ђМзНBOВљЅT24Eѓњ1ЃšnЊШBІ+ ’žЫ^ВЪ1шЇ ŽњБЦДИ‡)L{eŽџJп6+-\|ГР—e;DB41ЯЦвXмsTг‹Ъл‰ ьD=ъОэў@?bN’u]гьЌgЩЊEE]СТЃв.šh€k@€Ќ‚—z–“PучЈХфœdН<+оyшhЊ'ОЃВШЬƒhЗЛВNцА˜uU2нxr?pt2_J%YsО:ц:'JšЎA?VxІK;QЪQъ6yzXс€я{A@†є‘ШKЌ<Ш1мъ‚ˆв/3д|У›5гs Я7кѕ–ќ}Ђ]тг‰ЇwЅFkЙAJіЊЏŸjIгT їЎ? T^РЊaа,˜K•ЙЫŠшй ёЂŠљj8Aх0&Ž0‹~ОK СХD`QКДcœЪЧдцuЕ­§„Z­aКбфЖ„žQдЅf [ЏŒY$#eio6ёД.ЏYX‹ЊH-MЙ>Йц ?PКHS2]sвA+ˆA‘@EЉ‘ўвћ,,bˆ|$ж@i+ЖІЫѕѓЃ Хr#Ш[ЛгЦ7-oF%‰є\к[юНЎлeCz`І†7‹хLc‰#hz„ХtБVkw5OчЉ5vР шЇmфid)’МдSXf’ZЊ_$.ƒ…Б‡[ HТџУоw(З‘%[ђ'6f#оМНї „7…ђоWЈ‚ї–ЄLїМoп“PwПy3;ГCЄжF0йбЂ(JdЅ9чоМ7KЙЛ;a ќB[dе {у†B&№’fСвЏŸЁYe*K, €лŽиКХg*0heїнжЛЭЭІwЗЊSЋ[,ŸыXŽ!”ЩypѕВu&ѓ0ŸdдG§оp2ЁAcЊЊяккыДѕ:.pУА ˆнѕ]ЉRшпЏ™В Гsж<ё\Q4\”'Д6•бP@Д‹ЭŸЖЖ77„F”oЊ^руoƒšлр”r./№Uq] -ЈVB kЏ;ИъŽ`‘4’І%ОnсFGцQeдcФВhФ“qMуD5*хШХ /•‚oD5wt)uУ€Wuіj{sї0э6j §!‡ZБЈ3иjЕP’t\гж-DF<ъИІw(=эб AQОžIўЪBn’ЄhыЩ€&Э54уйДe+\™“4Ђ_ #аn ŸŒc$tфЬб з9/Њз‚І/dŽїoK&Шbмр’Щ ŒBQ-ЭђeDЁ! "AHмоюŒ;-2Gгміdк,SЇЎ'їuJ †FuIГЈЧєZуйИ˜І% ,ЫSЄЌG#Ъ+YІk!ЫьэЅв&тз|3џЈИaDуTыщя"UdЯЯq4юŒŒO ЈЋёЄЛеы­цнцUуС9ЏЛˆJѓ[zж,Qg8œЭ{žІp•bЁЬбАsЫ]OWQvUд8јkљіфоkеiR,x­Ёе€LёЂЎxšVёVœ`\*U–Ј‰šЕ№aEѓћНš­УpјМш†4№уытб5ЎТ№4,ŒћубdОœ/ц“ЖЃ+\>UІ1[~Глmж}№F‰c-”KК?=/дš5Цf фжЃVЄ оЖ.NSоySLпІy Œ–ЂZˆO­hšзC"Вgsё~е‘P-|&§u­ Œ"UQhi™Ћо,–Ћљьщi1б{W АГuћайГЉ0">EЫюЯ•Ј *ŽЏzшљuкщ+oYзЧgI–aјТ]В$у]уюp4њ+Тa4рйЋVžD!лŽђКжNNтЪЙЂLЛUЭўtѕєќ4_Ќ–ЫYз7tБ*ЫF<Жjюz %Š9№МШ%OЮяEјCЃ2Kл^ƒ -?uzzppyŸКMфxbэнСp<ЭІУ†І šШI†Sя/?|zžДы4ѕЩуuс*љlEЇзЮxѕђсуЇЯOЋХ|ЁоVEХэ ЛlЌ("ЧUrљb6—К:ЛЋ]<єЕІQJу{b7јлЋ‹Ѓ§гГѓ‹;Я–Ы‰ЋЫЫМлщwЛнvEqй:j‚|еРШ›vюіюdї№№ш"YЌ yшДРJCёІЃ:Rv6]Br…ЮЯŸ~љхуbмk7жM ЏЫйB!WМАuЧ‹ЇŸ єЯ_ž^žš&€jwf][8–ЇЦMEЙlттфFыњН^ЗлŠзJћ5ZhjаЂd“K&OЗйB‘сX š–нH{ŽЎцSbГ;zљљП~љљy1юФQP мзaLЉ˜ЩыHjvG‹чПќхgh§Мj Ы+ЮpбT~4< фЋќpz˜)ыїЁvЏ7у:‘<%nuКнAX~8п9>9Ќ0UA(сbдpF#ЬkКVЩ šнœ=?Нџјёг/ŸgјмФ^—=В•JцОby~„ЕFkАј№щгЧїя_MSсDе/›Я Ј &MwЗt>{yЦ F#шмэіћ6ЙG=†ДЛ^o04Г—{Їg79'E–Йr…rНfду:%$`šсг)§Ы_реЈЖњКьQЈVЏг,0/ѕŠКasќBJП_ФЄДЮ–=—†Якыо5зV‹wЗкˆV—ЛэvЇлыwы‹!vЗлG•ыУгы‡"tе № &ge=Lš\Ъ‹F8}~~yџсУЯ?˜bкЯC…|Uл У•S)œK‚гвlЬЦјљф)6D =(=k^HmЭЮ :z9™Ж‡ƒс€ wШЗi™КлыіZДРдu˜Ћ“ѓ›‡ЂžКШЪze^ †ГH“ѓ`абъ§Ы{(§ўiжiј.jЅi:ЏА)ђ`ZЖЉивJUkўўУћїЋ†!2ВQŸЎ–“ЕŠQЋ7cзЌІ юpаыQUЇз zVЛ7єлДРдєйЫыЋЫлМЈкQІ![ Ђ †е6Х|Y1šЫЇ˜хyжЃ%FOлСЋ “Ю1ђчnS:Ut7žНрс=E`’Э–ЫХt:u[нбt2BЭѓYНЗжобя‡=ј ”FтnЖ t?ПМНJ”=ш †н˜ЖРутСМo+хЊbuO//ЋE?Zшх$o‹з.“жИ}Z{АˆEVаž?=Пџ№м„{HfsљМ˜Ьцгб 7˜,цгAУж˜”дєЛkЅ‹АzяїZ6М„?9IммTtЛб‚ЂєкUQ{8]…aЛЗX(t} $”gEніBпs^Г ЇђЂMИ’”FРYAkђђсЅяЪЌъvЋЩˆДЧГХl6Š@V*(-piЈ eћ„п пЁ—GьещEтž7§іh<ІЬ8€{&S ^•уTwАz^-ОЎЂ^q’RPЃё$ЏPZцD"ЪБU@лh4ŸNWШyc зщЭg§vg0žNfг ўЅmщўЮEјЉТЁћ§nЄ wюД"фъFхсђ,Yеьz2кВNЛ7$­›4ђ=œЌžž–mCсЫUIЃЉИІ~в\™Зюvj`PДюf“ё–žЗlMGє ыОпh!џBЛўАпp,5uЦ€~Р5zн>љДmТ3кнVдlЕуђе9@ сЕFгљЄзphO+ЈƒЮћДVмšЏžVЫtнЭL 2ђНWmreѓЌужњc`sMбM ЕЎлю-?§W­ж\”T<Лођ§rŒXъMg§ИDящщх§г|Кœ)Х’ЮЎ€ћ}>РbV.ŽЏИ=DќеVА(р=dЛYгS‡ЛзЌa8ЕVГсгОДA%@гВ&8бrEВ\џТоЫi њь}Ю',ЂЏ$§ђŒшƒSФОiИj~є4*ЅM$Zъ>С ЖšХФйе-лш F§vPН>;ќN–юФЖЛмлнOŠКцzs,‰5zЭŒdqќќєќќМ„тOЯ‹iлEЊЎОЖЫц@Д)5ПМ |zПЗC№*;^М@g;ОнМж|УСЃ•SСfдќu*yW=Ь§біжЛгДтSЃ$џx{qМЛ{˜е5P*db]f‰VДUEПЛщ<-€•VHyаw>G˜†СізjН+йNиЭŸ?Н,FЭР:jЬШвЯ/OощO—ŠЌbЪœ$U+ВутЯхЧt œ+™~И:иок|ЗЙЙqŸЫ>оžžK_Б4лВUED‘6ЪёŸt}?!qРФЯЫ)<љІn љКЎПВэCАЉŸЕ3X<њє2ЖB0MЏ1…ЅŸŸ^žэƒŸЎ%bQуЄ_Zст3…bтјКPJэюяlН{ЗНsxИ<м?НМИМК)ЊЄД­ƒЁЩШIЊlњ:—=Мl=/Ё1ў[Œк”ŽрwКІQИМn+`gƒ*П_‹‡+`zГРuƒh аЅ_jg?]№xgдJ]Ё­PЭ6m0ъj6_HeX6{qxИЛЙЙЙЕup_Ў$OЏявeъЬGЮEžWiбM1ЭќѕсfВџМ\‘W?6HoэЇ8й№-hƒљPŽЉU3…ьУн§эЩСЮцжцціўE2ћx•Ш” Х ІKВЄ˜–ІЊКЎfv6ЗwЋ‹И4Аєѓjіyњ;,m9шИѕ*KџЧF щ#lДG(TЫљhиoѕL?}и[йWлЛw9•Ю™й.’pЄC /Хы›фѕеCrN Coяю’>dГe‚]6аЎoEвБЙ’мЗН}.—pъgDјѓr1щХ5ъПqЭ{Ѕв‹tLчKР"  BF/?~јHЌыeЂнюoяІ4Чжй% ыkЈьЭбщйХеЩжжщМННЕsršЬЄВђкKзЧС\,KLоœтnЕ13ќяњšЏ&Р…M0‹зoкZ^­йGУсtЙzў№ёгЇOD_?^fѕъ]"ЫщЦzЙж@эЅŽjSnwіЗ7З7?Ћ cŸe€ЃA<КЎ–=йло>J”НсbЙ lњaЭ\Vѓщ&oћіыВ"пœЕˆр FЫїџђЫЯDnIщЕŽъkиJ'UСhыХД (НЕГНГeЗ>ћ4?Iž_UhЁЎVѓ]{}tб’+љdтQњ3T@( к J:S~zzžїBћѕћˆЎ†ЕZЃнЮР’†[|јљ8|ВъДв1"ш Н}HqUсnЖvїv?ЛЅdы­уУЫВЈvzŽA5Eг‰Љ~О\ЌHщхк/ФшЈт>ЭлОaО~фцŸ64zŒ~жђ@Y–Ѓ~њќam ћr>h„>ъ1~ВhУ\•Q•хЪйібд…ЮАє&žЛs’hœЮ€вЧSim›š%Gѓœƒ 8qR†~~Zє]кЇ|НЁСЙЈН;юЭž(ƒ6ёhkƒ'zgМыr>щдCH@'t@ізћЊ,ІwwwжBB‚ЄЖГГSEзњtt|€љљЎПоЯB’вяё?ЪOЋYгдПАuгіќz{<zšѕšn7—Ÿраy6ѕЂР_ŸОXS2д–%іfgw ZюRт€‡МУ}„Ѓ'б“PжkRšЖоВїъэСящ‰bёГН‘­WЫyыяЮЬџЋЂК~Ѓ7[N{ Ш@МцЦK2є k<шЕШ?м ж‡Ÿ(")wА{КПЕN[л‡;››яЖ(2wЗ3М••ЕЪДm­ƒfЗ7šСЋW@Їc@рётљ…–9чї‹gШЂМрm›!lЉKZns K,g &нV3Ў…t$бeSX&МЃzГwxЖПЕГ‹єБsќ:о$ЮћЛ;чQ’ЈЗAˆ‚N§VVЋ;œNзizQЯYgJ`oAЙуKk8'ЈзыыS "'n0x~џ„šОкЂ§ T.чsG‡Ž„­(ь€вСyrЦUіё” Pм;мљiѓВ*СCшЅt,˜њƒzЃе F3h=є ъghŽQёp‘№ОДYrщT›cШ,ЏтпРxъ4щА^ЏугиР~6ТŠШ—>§ЯџѕЇŸіwЗзцM”ѓЇ”Fрћ‡џљЇ?Н{фEдХuѓ2З`йѕR_ЇЧю{†$:ФЃеѓrміОАr­ЕэЙЖЮЊšхбѓћхАUkѕJЗ#r xAyЫрЪ'{›џћЯ›05iњгIц~яUTО“w[?§ч +H”<!іzkМІнlvРjћО!WВѕdЕЦHІ_ЌєЦ†,#Œ‹*тІж[4§ЕO„tб3ЩТ"Ч‹,ŸК:BИŸœžяoэ cьb‚Wяœпžо]юŸi•wdkˆчЏ;[нЩb:O'`Ніtж­9_RџЇ№€žЈ—&<˜њзз„–Ž2ЙtъўцњццьhчшЁ˜Омн>~ШЇЎїNЯAМvЏ2йвУёaЂТ ДQ+­дuъѓ3=:эеьЮЦuЫTЪeе0kƒQхўпеyCМѕуЩгЂGOер†Фdn.“љ SЮ%Џ.Я€GOяяOwїю4Я ™ЧlЁ\ЭŸяьœgJїћл'зљRБ\,K’) 25SRУ2ЪюxnВЮаИлќвІЋП™VPšуеД юП~К6В—N\œ?Ад’*UГзgGШ;ћ;›G|@Șš Ѓ9н9Nоюь^&Ž/ю‹еRъъК,Ѕ3ЩdŽеTТ}ЕСЂи–ЪHК4jџ–GџЎД‡B3XLcЄ IЄЃр†&І.Џ/’‚NрCчswчWЧ{Ј„[[‰p:MFƒўx†:хі@dvї.nЮЏ.n ‚Ф$Џ’Щгу“3ќ6/Оvšѓi(šЛ­ юјЎѕхэП‹d:…щД…lJ‹mјsчч7‰ŠI.n(l1“ИОK^œяюъўhйnk<цѕжЮЌ+фв‰[hЉrЇћћ{ЛGgЧЛчe‚Зf0Zt‘‹јлŒbбAС_ч ŽЮ0#…Юњ5ћW -/nВд6:3.ˆ’ШцВЅBњцшфžC~tХєхuVЏзБ›98>ЛШ1Щ|ЅРЊHBтZяюф”Hнэ­аСя˜ѕ% _Aщ’Є#^jƒй8&. ­VoO.6tщ‹Ѕ‰]ц$:Pћѕ5у7aЉЪ|&‘ЇЏHkа1‡NЎ Uбlv=]ЂnдvЧ7,)[vь`аvЕJJЗ&GЃЃŒtВ™6б ˆнRтЁРТдЖы‚|m;^гTОpŸЊˆВ$ыŸЕvр :Я)vЛRи"D@єй‚ixН^hŠЉЊa5ЦЈКLШnиєл­fуJeа•$тб}ЭrјїŒЏˆЂJтвНW†T• З3l˜*S’С=:Žeѓ№ЁhŸ)u`€E?DўЁѓNnды5ЃЈК–Шћ1"B#ЌћMUо[bUtt’ю‘SФ*ЏY IMSчВЌсѕ‡`|…{dЁ=Ј|^2Нж|б :bwZzЎRЖЁЗљцЗЬъ_(‹Ф№ЈWT‘Њ iO&Mл2Њг…–QИLe=ДmЕФшNcВЗkД[ † ДТаž™ЌРўКзcќп…grF! Eри*+ЉŠUЇ;л”ю’ВеM5Š'‡ Nѕ=GgŠВ#і›> aъЙdI6ДЏаП&UДЊВvЇ3јДœЛe­`8MƒЙcTГ7­YZю2%#х­!@—„’ф|чoџV*L)Л!XnиLлЎ!х‹šлM†Ц\х-AщЧЋœюDГЇ^рЪœ‰š§ю`§чЂиAg:mzŸc 'ъPњ8!(ѕAhKww<цrбђ\vЃjњ—nM|]Љ˜^<™Ж<Н’­т[€#г`.yЕжѓЇгЊ]ЏІѕѕ$}Ч+zџЉ~c2o{(#UУ­ЦБ­ГЇWМошиZц"ЏЛЭйѓР_wqџ8Уы~4œFѓ…’тжzЃ†aTЮвЊоhZђнEХtлЋUгЕЈСЇњУ(mюdPw”2ќУo К™Пт Ћ™b"СY~9 НУ—н уёЄXb!'šaдћ1Љъ^Џnp‰GйЊцmџЮt+‚д{“^Уе+їyеm6,# яК^J žЧ“IУџЦ0џ_6qИ§gњFqƒжxдD&~Иaэ(ВbV5k]_MпV-З3ы§8†.=\эМЃo*КWяЛuЯHŸцLПюеМl†-|ˆ”тд†гј+lЃ|%)цЏжпIРLУa+Д‹'i !зЂ]:0~›б‘Ф‡с+к|CсEцсb§]Yw§aЛцВч)нqЋ’t эъMо№Z(ёц0р ›јќЋъ†Э^+єИЋЄL§nЅDйt\Г|W1ќўИf}б}.пJЬьч_Ћ–їКQ(^]–4ЫвŠзYеЖѕв#oж†`b?ЦШ‹пфЗizїњ­†~s”’-[лИМу S)ЇбэЪаџ-эаЧ5ћё,ЋZІДq~ЖС+|бмfяЧјдХuЏœ(ЖЩoьяб’8mЇи?Lюј[‘МFмЈБtЙЅЩnќЧO‰‡М`G§vјeї*}aœЈнŽљGСѕЬТЦŸЁєiВ,У;P)ПЧ§”_$e/ює:r^ё|'ГБqЅ3’Ukїтр•gРПЇИPК­•Mпsѓы$Xг:Эа5Кђїb6š­H-›Ёч|žъ’Wœ0ŠBЧўaНccƒ уИaё†якŸљ Џ;ЕZр™кСПџЈѕV3Дп1?/ФЈІWѓ-эZ•љWE ъt-§чЁ№ 1Љ§(@њ OWžѕYQ:ПљЭЏў"бЭУПv{ Кљƒ,Эќ?EдoЪ§FщПЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩ›МЩџGbЖЮzŒс‰Wћ{ЇџЈц7ПуыЫs јЏЄRe*Ѕњ‚b>Ÿ/цџъp75УВеjЅ”џgЏЩg2ЙlЎ@п–Ъ$–§ЯЫ•+Ѕ2SЉrЙПўщучЃ\П/ЛЛH=fжJ3МРq,Ы lѕRЛLЯНX,ф3й<§О@vЌ0хЬУњЈ_ўЗз]ЅГщLЎHп+ЌЅYžуўЅ™R)›zLЇ3йl6M?( *]OШГХЛѓфлИЫfвЙтZiќZЉ0/rUц9шW*мп=@х\6“Yџžшж?CasчWљФХoЏ{ШЋ’ІЪtЛMЅ\,”˜ Чё, ЧњЮ—+хJ6™HСŠљb…Ё"H4ЁЫІѓ!ЗЇщФсo/-VXЋљ–ЕžJX]‡b™ЉђљЎJГ\Еx›|„E™юЌQUЪ`*ŠщКzщ2q{ђы++Кcщ4v”Ў3UYx–•Ё5ЫrЬwГ6 Х1ХдMтБРJšNС+‚Є&M\P5з–N—ПΘ&“‹ Ќl8>]ВjъЄx•оƒЋ"(ПSщЁ‡[-Іooг•ѕdfг Ћkaa9ŽnyVѕъьјѓ‹N#а’хDnGuLCU$˜ЛЙяt8ƒaЊ_ЩЅѓM}ЇK™ѕМwК[ЇQ–­gw>П:Ч-fВШ2јzЬ1‚fъ&]b€dЋШпоГ)gБхВ2ЋаЮU(ЇS9Є…ѕхЅ& юЈžm~~љ}ъс6™ЮчгщЛT‘Љ–se^$Iщжъ\›.A§жwg@чjЕ\DК`x2[ЬхВHиАd–fkІы;мщжчз_\^нхЊ4q†c%‘Š˜Дя@ѕЎЭc­™ |OФ Šaiе|ЦbіXВ?> шЖ/]§šђЎвЅ*Э–|K7шЂ:ЧЁƒ] S(qеrЉ\Dzчљo• ’(pЈi%N‘9†Cњ@X ŠЌЈS(‹% EJЏ‹KiЃ@w%Z†щ!|нѕ=ЧrŸЎb…W0х„EЅљІІЎTJ%Nd™ЩчЖXе=?p(yиHw”/?о=d3Ймџaя=”уШ’,QќФЎэьОн.Ih ЄжZk‘‘:‘ šЌлoЧе3ж;ѓж,ЂКŸМКК@0 zxИ?чЦыg‡[ВЄp[Мюј>ьI„‡i…QњбЈtp•f>ѓo"шg дМl№ЭZЙЩЪŽKїнВш№JД]зeІ|~zrrКЗЛpщn)^ЧI’в0лЄзыѕН$Ыт0є=пWи6hWhШНaŠt;ЖФ ЊмiдліяxHS€ЏGчœЁЭи [/œээьoYЖДeХYšіћCšLеых4Ї2K’8MhœƒЇЖ›LЇбшМЅгнfГ†›‰лоhЯЎчљ4ўРG‰9€9ЂrZщ№рdыјтєИэEI?Ыњ§^вЫhPkЧ4V7 Ђ$Ff3х:лЊ6|oцuГVoДYNфъЅЖхвфдn>ˆ“žа0nCю4љЪбщVщъВЌ„Ž“$ #%I(Ѓ!б І NBOkU: @О e МIZзЋ•JuУT uйЄ‘,qšсFУщ,ЃAЋY–€ UвјJ Eл‘lCPBJh:Zг3-ššЃПŒЋQM7Œ|­]nжЏ еф{ Ÿ+хR­йшВхГ–aыКэ#5!Z‡QкCD!€ФЃбkВfјЎШ;YЏ‡BLт,‹таѓlЧU%UХT3\Ѕ~Y)]*-^_9ЅяяДfЗУJЭ“+Eœ<—Юxt–,Hы@ЊФ!M}wbOЗ#п‹№[ОKЃшfрvІeнR 5Р_”Џ“ +ПЭљy,п…ТqЧ…4Fд№^Ц™:˜М™L㘃$ti4”dНФн№i*ЎEПCGЗlIeЯNJхk(З– Hoрu›чкLхМЌ˜вq3§Т]VARЇШD<ŠмЭм3Ч z Ј4 6FЂЃ5Кc@ЃkhТQр( хѓЋ2ђЃTъŠњѓзќ:lЃQ/”8 ьbƒЊ$C‰шЊ„0ыХt№Ѓ4сGuУ ГH`‘НјЌ ˜–с$Ёу†уQж ]ƒ­дЛЕBБpQ(ЫMс'ћмьДЋнjЕЃ‰ ./ ДрН$@rЧшбQšЁ„žЉУSлАSGЦ-PDгг%EVИ—иЊЌбйЭЁяшL­гЉ^]\ТёBЁТH?нщДїuU4‡І}Щшc*+ B‰“ ‚ошYdj4ўGьЖj - /4QгжС‚Ь xЂ‘f:fѓ';њŸ˜`К–ЂiВ(›’Э €–"C]šИ vл\‡i7Ћ…rГЫaЎnХrKpCЯашpPЯQDф7M*—кѕzу­}nBžЈБШ^$v€^иK#а8Ч2Х–ыЧ=O–džдhњŽьхyЃA9С@яІбA))v@Sк "/k9oщt›ЃAT&xGгЙвре–O“кЬРЌЕэ€ЦљxžкЈ!В=щјZ—EZиш:‘XКуйŠ,ГФС;WЅыуЋzћ'-ЭBUѓУ>уіGљ 1ОVЎж›­VНжмpЈ’ЈAb™"ЇПH-Cцоƒ5їЁ_CP<Ы4 еˆˆRŒcuм2Ђмг5Sь€™vъeрЏXRТДЅсr’†ЎэZ?z™e{4F#вUО\lђЊ.Cf5E !ѓD‘ВNhvŽЉЃеAfƒB%афMъћ4‰Є—ЦЙ™‡,š„ŒЅъ"gšнBS2hšЌo‰ ёt9FџD МѓYAY$ƒq?„FтЛ‚NZ‰-•А ™cЩkB[Дbл%нЧ‡LDЭeyZM’t`’хтiжЯSš v%з №{Ё#ijЗXjK тЅЁoЊыч‹еЌOr(ємrѕЃAъЁe“Ђѓ@ыЛЅКhhВР0ˆИŽ4ES6pг№’, Eг8Ыѓ%яЅp>яѕ§ ‹{yьyž! б@‡СдJ•6ЭЂ€дё}зœpВ^ЭЧќЁФѕШiнt“A?ф‰gщšfqdыаЁИЏ(FQтХЭˆR№iЊўœІIWtЁyаяgˆx–$DА„Z`Д‘hP–Ры^џv1Œoц‹YџЧЦібк~@‹G1тYфУ\Ќ–Ѓиs~р8bДис`ш"ЧPУB™шзЉ5АSдЉЊƒ{BІ44,O+FЌiіj„„СUdƒдЗTеHk’hHЙ…ь ‡И@pp -fДЪAЕн8ŸЬІ}пБ_Пž 2ЕrЉt]e0QлЫ'™!ЩV˜p]̘Џ^ж“>`L@ўGn švП™ђFа”d@nвK%Ј,Uі x ž5!ФFЙ)4В(‹‡c4;š/3маз^<Œ~$?јn§њЂи"8жu'Ю"•5Яп,`lXsu^4ЯслœцИ‘Џ+H€^нFPЦ›хšTя„€–4ѕЙkx^šh]йеxБyqE Pрh;ѕІn‡ЋeЊK’jи~дC{pЌз–"/2ѕBБ&7ЧOЧ‹Y wxЭ џС$№ИvЉPыЈ–Ш šХ`Вцgƒи2 MБ-ЦЇ››сЧfœXсŠм0ќгкl§ъъЊmƒn FзАќ›uпV%hfЫіSPдWOЃW$!І+A‡&7 DКУjNтjВj†=пPY–эv:ЌЂCiЧž&ЉVоP”*и”e( n†‘м,•8O\™UZљsШBО[­ЋЖ?Z <dЫњЫ(%qніШЭWNД’7CСN-ŠPГ››Xa9еN\•—MПЃњIфZ4—[Љђ’х€х; Ћ2ъгЁŽ„№Y€F'MTЩ CWmu-МЪф9ТLу%гЌfБHV4[ "”ЕТѓР’ p_9ъX76МeAC‡ˆ‡“›љВg€[I  `єy?бhFpdtH;LЂиF|ЄйЂ9›^h)œцE‘!Њш‰Жд‘]ZЯ№!Щрє7рЎ:8Ё;DGDвNPMz.тМjtŠХŠ?Є‹Гљbш(Ђf…‘!ёš?ЅШ9CŽіІxJ—WРRAи@ŸЮˆасhw‚ЙbЗЌизЮЩр<˜ŠУvX Ќбѕ мuv3BзRDйЌязфЕТ |,tƒзУ zž@Я MДУ›е,аeYѓ2W•Ьt6ъe4ьšй58Ns§РqGW˜–њlЅF›…ЄРу MQШX;Ц=GШ ЎУiєL,IтИ?ЛY,2п–9еЏoяfХ ДHюПѕDзѕб’‘_#биЄ`0ŸЇ&.СŒ3ЧŽ9ЏCC&лЭg9R›ІdЛv &$wКVтUOOъ^Ј”+<ЈП#1 B‡ЌТuBj";М|ю;™по\CфpЖ\о-rŸ6ГЈ&Pоw_“<MхыXrЇХ)№bМк(KS›ІТŠРЖЛ,ЊМвA3wУRыM5LœЫээvvЎœЬяК^њZ‡Qhж'7л"фБno‹њ~6Нњš(ЛНљbЕоLжСаi58xеp9ѓ aрЕƒ L—ѓPу!Ž@хbДdР3РCЄЕ%nЃ‘˜ZRхЂуЅБSкў…†в_XIЂWы4зъ4№oЫ]еBcХUгdzЭ &‹дB›Э&ѓХ|Y4ижёТ\ё5N{IšЦhЙР\щv!Тƒљ MЙkйPИ.KЅІы№Кл””•eЖЩ^зЌ$ŽсєѓЧлŸыa’lЉЋ˜ЯзЅ0РэiЗh8šŽ?-ЋЊ*ЃгiJŒЃŸg‹ кк’MOћ^i>Ь┆5Qƒ0еwcGЛЂЖ™6ицd…p#M$Žеl№5QѕmОP3SќбЬчŠЛŸЯjf/‰SП}е6[irЖgЪL“ЅёQ и ќеAаЌ|Б˜Mњ‘d“х,u ЭбВ^ƒ cаО Цo“ЈВhтѓУ:ФeyYUDЉAа"#0Dаг!iЄЪ1Q Їб"ЋоŠ№‹4w/.5›pQЕ4Ім(Ž>ђ›4Љ В/ ТЁ0ьdvЗЄ‰h€Џиz бГщљўЌЬj.ЭзM’ўЭті~тщ*зЁŒŽi†YЇ0Dd70MWИо?БI†ЬL”4‡єЪћн§*D‚бT,вѓ9^6РХAОov˜Сd’г[<Ќ ,PVTЉѓЊgИNœ2Ы(дЧшfy{ЗОXаЙКх2Ѓ"…гбd†lс ШіzџЫ•›ЧIœ‘И М8%–fCmїьЌЪU8ЙZhC[К=hЊхќf:щзЅ‡šПŒяžжƒа†кu=я•ЇєiВс ‘N?нопп=>>мM#гPšШ€ ŸNrbк5RМ%ЪэЫн/‡ЭЈХi/'ьЁщХизїПю_œ‹Ї%^Гнx0/—ЫѕњvžЁnкИ]’сцЫЧЇ5Ј*Rв…0x•Я[6њ —ˆ’GљЭэггУУУу§rф‚х№„ѓdкsiŒX™ЬvкѕZљђdџ  gД~@7#\- Wѕнг§ѓƒЯŸПьэU$<SвŒІѓеjh)2иЈ&‰Њ“ЬППІуЋ!^ЕеP2MMb щёёpё№эћїЇ'„{™ŠаHnfш:YxQфлЕvѓђшјpїŒCхxв$CЖц8ЩВ,Ќœ|ноўД{бh\оцўћaџf= СXN@ FП§њ§n”љИƒЊФ‹ŠјЊmBŠ,#7oQЩ`ёјэз_ПџњјјИ‚гЛV5OСёКm4`ŸШvЎvПs!Tl/ыeYЏŸE1-' "ёkёьшxwчгЮIЉБСw№^sнЭЋОЅѓе*Ћо`§эЗпОпM{!М†PезЉD†и'бvЕ(ЭЧЋЧяПRАŸз‰Ё№ŠсOжSOZMŽіh†&qеу/Лѕx:Шmx“гў“ї§ъбсоЇЯЛзm>'ВhЇшšLngž.—kаИЩтсљћoП=.њ)ŠХд-§ЋœЎ4кЭzGP,к:ЅЃљУїяПўњќ|›špZwrœˆnуo0„ЦхоБ=™Œ‡љІўЂ8{Щ”Сp82‹‡{л_O*@ytОлЪG*›љъ&44Ј-г›м>>ћѕџz7ЩiFЖcМve§ЊT/_јd˜NюО=ћіm єх%-YнO|ˆEШ)hgш([э–Ž б|2›lЦъТщи’MUв*цd$žья\5тЭУ <д Š#0”z[3Тх§угЗпўѕлэ,ТР7„N—ј Ї/Šх‹гB­+SŸІMбјўљљљiXш`fяі~9@Ш€|<q7ЙъeЛ?ч У<яг")В9ЭР?‡УёMZ9><)ДКNwгУEB7›Я#MЊд№3зOЯп~ћўАe4эY$(њзŒЬ(•‹зM” ЉEQ*šЭП==!=$V1ѓлЛлхl<šMЧЃбЭlж lБQ‘ЧГщt<эщG§иucкжру٘==ПИlIMKO@ !`бЬ—ЋЬЊ-еШящчлY? РўХ йЯб+ж!›еjЧ№lЦkЂ ъNџўљсё!3EFЕЗЗpћvɘO!Ф‹qт(Ђ4žŒFHŽўh4їC2m< бь‡ЃбL;НИf‹QzЏY:…Tэ ПЁu6Z MwwOрLy”Nз#тn#>С @ц@ЬдТa'C2)рѕh%ьё<ЭѓСФ;л;Њ;SК3.aЉYффѓХ$ЯF ПїгЩh9!-j!аўЋVkxЖ#[^:[”мŸо,ˆы=>,ЇГ%„(­ІnіФКЎяF‘ыj…н3=$&г›Щ03hЛв&9rzšЋG_їъЊюїFГqЯЗHИЈ›§eУѕz~ƒфИЛ]пнЭrшГўly3€ ё<ї5n›mЮРн_<Ў›q:~xКН™-б^РЊяяћЊJ•-тНОk[>­я–Ою7|$Ы56ющЕ*c&T#g/ѓ›Л;{MнєRD I‡{ЈЈЇ/юn‘Я@<мЭ‚ЅЛћYьйєФ|M+/Дз ЗпО=п­VwOЯї7Уўєўшџєєtg]3ж&;hяЉhрtѕ№ЄЬFфѓl’ыз{ћЇ-‡"фЮѓD=џВsа6 7JhAMтDE•5Uv[Ѕў#n ВЭ јяPф2/JЏл2{к5\/žvQBo]MѓофHзТЇ‹ЭnS4У;ЌN;“ZчWеR7MgуPМњє—П|8Ј[9ˆђ#ды_?Ÿ0šюxО ІиesШ0йЉ№cг\(БязCм ‘}эk‹GЂуEљb}їјє§_ћз_я—“М7;јіŒ>я|јЪ{Іъ8šiЮ69@%•Ю*ХЫІъzjљ№ѓЧ_ўз/П^ .ˆ'З+gЛћ%•g‘цДšЌjNѕЋsП‚žC˜ŸяawЗг*EЃНŽOяIЎѕF§сфцўзп~ћѕa9 Цы'ЄЫУУѓВ§qЇcыl2•iЪ(,Ѓs~r~v|VЈVKЧŸ>}ќЫ/љАsбшr\§њьфєќМаQр0ЎRо<Q!У EDњіwЇП=пп­W‹ОgZІ ™hПюbбі‚0є}„ћёљћѓУђf<™п=#Ѕ!qo…эO-€‡ЕYWВ єХ”k'{‡Gћ'u=џєyћ—_ўђёуYЋQ:=8<О(еjєf>#ЪPЭ˜FhѓЕ§ѓќaS†`гЯЯїыХlвѓ7ћіНз> и-ЄM^aovїєэћѓнbvГ~ќівуё!:кЎа"‘nЁЩћЎІЊцЦљкёюссўEхzягWrњУ_іъэвўЮсEЙеъˆ:IOY$х Ш*ёИюХюN{љtџŠ‡>ЇW‹щАz]}гŒШ‚РщGRZwыл‡яПЂ.ŸаcцмоIGбаГt3 AЉш~кІм<й=8и;9й§Дѓё—_h rџш№ЫЇЃBЃбІut0 EЃ@CЅAИДП~јpфнпQ*r|ћіxЛšфZ1‰ІЏqљПlUXZ‹ї“Сќўђр`A|~МvЏЪ ™žЫ ’я;НФ…m~=<8>ќњёУЧ>ќђсу‡O_>эžjХ4qыЈПвlгUІМџaч"9nяЁž‘‰пVЫ9Ид|9І'Џ‹є–l!ЮIКz€G-ў†сќїoНЇ‡‰vНПwPІ­ц’DWGЛе=C/>§њeg.џЏсњЮЮЮсщ#Ћд<“ЖNкИ)мХщсчƒ’2XЏю(жьxxТЯY@ВЌ‡сыŸ4ЃЭ%Нўxyїќ+@oѓ?xPЃ,ёc1ПЙу5MЁyž="_ooя|zqњУ&кйй;(•iџn8=эuЙИfS–г›ѕэšhьіvНОЅФFdžяч=п}eJom™Рю)&‹~fnоZA2Ћа|шЪмй‡Я;7Щё’!(ЧэOŸЏ6Џ}:є:ЋЂвЇЁЫš?˜поЏжЋ5i7ЄШ‚$&ˆю ц&ўЭ5jє—љ§ЗяПЂ:FiчЫM‡гИ‚QEєŠ…MЋ:њќVЄЦоЇнЯ№їг&аПPЄ?~кљtм’…>B+ [І…ЩdхsKŠ7 јљЭэУЊФЗ^НђПmidВ~њўtП Йi™ю№ўPщўсnu3Фaсщњєуk [Ўр!Вcћг6EњУ_>>}ўќх‚AR6oхP.iДH8^ozГX­я‰rЌIkЮ ЈЃYDO‹^h„кesгi<'[Н;j‰ИЃѓ›ЎЅ‡Жиm€„)rчшысіђzSƒ/_ь|ўђщЫU—–”6Z“€Ѓ*Н8пЌШщћ‡ѕњђ (=YЌЇОѕƒ[7u7ЬІЋY?tЈot;HТ‡чЧЛю"щР<‰B?ˆ“ H‹@  _іŽ>}идтЧO‡ MјъУ6ЂџaчŠez‹ˆžб3lРd˜є7Kф4РMB;іђ~ієf9ёxЄуЛgYКаaРšЇO№yHK_Y‚ь‚j‘+ЊŠЬWОь}нp =>‹›AИ№ЯeA”_ђm†hK˜dДСВe}ї0…€Г<43|cОœ$?Вhc‚Cяб€(lW4Н0_=оЭY’бВQіЉ:г›ˆЂ,0еЃm@Х—MFј\(•Ž>@Ж7і?џћN…Ї‡eН CO,л‹т-фLцЋћЉЋJ2zfВyH0>›Gt!т]SшВЊэНzЪ ђщхИt'€до<єдdYQ™VщєгПќЫџ__w6љ№ёЊYо%ўA™§љУџѓ/џuЗНйbl`’дeєЁ!ћ}ДАл_—9йАнxДX-Fрy?шѓж–dЛЖС7YДГ0›==пŽ#zїЩѕгб(Iqу:mA(_ 5vvwOП|и;??ќrX<йF˜q ш.;Л_ўЧNSоь#!uiYэШMFНi~Гœ'Ж.БФPGѓ! х‡окт˜­­6=ЧNЧЗЯѓдЁžД1)ŽЉe™šа­^Ÿ^_ЬmoзZѕычœм­^\ŸœŸE~œWjћ_ŠНс…ŠеHЦƒцћQšЅєюpОИ†С3šm§щ”–Uў€гdД)!Ь—‹м5h1=6qLрВH/^ЏЏЏ/ЯЯЮv>|-2ѕƒээrк=ЎГ,5!Htм‘p‹6gбЛ“ѕM ѕжцLг‰ђaє‡Н1•&зOwCЯ4%†j$2S+žžзQ^Њ"АњеСі‡Я{xcŒN1ф`уˆљќсуЮб—_ЖЯNŽ‹ЕFЕRЏUkœ!Дš-FдhэD7œ|ЕЪ‘‰ЭЊD­2ѕ­WэЉљЯLsбg†ЗѓФ2uІвр@Uh]ь=щЊ›]ѕЖІАKф4вјУЇі0vЛF‡^-—жбИ?ьœьž—*ЕzЋz~ViW G{—U:‡@з3МY1LЖиT!ўыиџjЅЧpu; 9˜b‰ЮoсЛхУНнУ*(›§rŠгmOOП|ўrдvSzыК?ЧCЏјљгчTфСбIБотeMi_CбьB˜]зœФЄчež­” Д(ŒЬ–ЦЕ=ЁЕYjW0ЭшfомlщОЪ•adг Ы‡‡лхЄGЁкa8ФЩыіЅПЮКšg‹ явКзO6ЯХ6ЏE7cWыеюнєPЖМdYnО{&_ƒ–ЌgЁ­ŠЂbЁWwЋХЌОTяшqвbЯ›ž3+zДZЂC’иЇƒчTхTgА#ЗыeбŠцcЧвлmЭЂЗzzŽжhiNММбЊр!4!p/і=юК"Fэ^/{)†X+uєюЭMцYАd3š­†ЎЎ5Ў3˜O]K)ž–›Šщ ЇО-дЫпЏЁMЇхщvиŸ/Ї§(№ИЫ2Ѓ{Џоэјzу;•:эEЂ іŠ$№œŽфooРB”њcyГБmЊ…/cšе_$Ž^oщno}ЗЄе}[с5x=юEЁЏЕšŒєgцЋ@‚Б) #аЙagЋ[кš ”Ў8Ы›Ь|S+Й`чуeтXэКтЄЫЛѕ bэXo@({qМrь2†V. ›X:Ц.;бhЙШЁn[eЩ &7‘mдNt—оbИzЋ*йщъсv1ЮBзе9•i1а3Ф?х<Хб6WKc;*-qй^”ЫRКSlър КЌYUQ‡ѓEЯГхZYВЃХУнЌЗй3-‹–&iЦЁѕGkxA=)эKŸJВ7Y.GОmt+]гMWKеNлВ§Щэџ§&9є"Кc:]пŽ]АаЫŽхV7`бэ-Уі&З7‰ct.+›Bœрл.ёЧw ЊЫџМмјw)Ещ]‰`r‹B4хвkљ“хаГЬњДЭ№v:zуДjИƒ‡ЛОЋЋVКŽВUюќУŽЁ А'ъІ;Xп \ƒ/5шѕяy№+oе53[ G­œwэ`іДˆY0=(€7рEП1(D…лjivМЄ•>ІЬ9~9O,rК$ыё|р9|Ё$#Ѕ'Эrє*›ѓ6Ьшя5AеЮ[Сє~ф­gћ§Х2GЏn]‹Z4ыЙVћКEлаяrЯшАІукџ`ЇQœuгпOГYр!ЋчЋq`ъ 8­'ГФVЪWЌЭžч­t6‡0Оjи[X—N!ъzСјў&4:Ц№ГiеЗЪŠ‘MC“ПИdѕjТѓhГmП1=њћLђУён2Г…F[vТСў›х­ŽaіЇОй=-щnvЛJ‰‘i+Т[чW˜„єN‚Ћ1Жъ†Ѓ›ид [ЂхŽFŽй>Џо№aїЛ:ТlыџtўЦCХŒз“а–[ХІъ$“ФдK БюИoiе‹шШ-Фz‹ЇЭbњ›@јfxQБшљІPЙьшў0ЗЌц–lИЃž-]_KМEфp5=џ­љўпoЂƒњ[cGm]‹nЏяк,њ%ФЎе9Џ™ўрnьЭš hЏмlїІІЙTy`ѓ—Їœѕ WЖx#Хz§%; k-^рпњАщзoљщt1Š}хњЈkљ‰g р^Я—K—ЌЮ‘Х68щЭШў;Ќ|}ђхї/MB`–ЧfљЄM•iЮєW*] vКЂ щmN‰}Ѕ эвљя_*v/–УдЉU5к ,luuMАT–о<Г„– ‹џр #Ы}Ў№ћ—љБšх{x)9pšЇmrЮцl0 ŽспјHяПпўmШ…тF§хrЩ— aЯnЖQrГЋ…c)Yфи†@џ­щъifUЪ†я;&ЁЩЊКицŒx:€“ў„Уѕ_mmЭяЯgЙ[ЋYAрН< dјvЕѓ›AрЏмxў'g'“i/ьДН(№^4Ъf[r‡ѓAМњ4—?Щœh0щG‚Сщ—T8Џ2ЂЭцyфџГ:m%ƒq*ВџoNŸ5%еэЯЧ)вуŸ:ўSт|GšфХЁџ’Р—]ЭŠGу,є?sUц5жівЧіЯ0СЄ“‚^ОцŒмRќч› џЖТЯ§3—рЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлЛНлџпЬ$џДлџП,Žџљ=ў?ЧNйо?б f5AQџц=Ёfѓo~›ћчy‘яЏЦ(t.ЁЦЗў§[Эіп|ЂгmЗкэж_ЏЄгйкъОђјџŸkŒbX4шm7ў§›uКѓђŸR­бluZ]†щvК ЯтПџPЇ9Q%AрЛzэпП[Ће7ПљЛgхbБT*з›,Чr‚Ќ‰№šо…ъќ#†сogйNЃбl4ъепПзnmеK…k|еa^М.ŸŸ_]]JFЋЫгр*ŽсDІ§ vЛƒ\-_kеrѕХщ6ЇШv$oсттђКXCьКМШ!cUЫqUдlSЎ^—Žv6,jОg[ŽыzТRD‘gК< Ї‘^n—eџ$Џл[VeыєјќAцxI–DЖЫ+ЊN'ЉВn›ЬХещчЭgiЮЪŠ(г86{3Т…e:Ш u‡AeђFŠPЏЈЖNЎ+u ‚$ЫŠЎ‹Е˜ahšЉ—іw_œ.7JхrЙV,–QќfшЄ*Б-КYЏ7;  оОбЃђ[•ыЫ­ѓBe…†tГеjГУвєiMЇaќоіKzьŸ]•[­rЅXЈЖ[F@р9єšœn д]V”о<дˆ S/\^mkЌŒ›­ъКТЕ*•rЁP*зZ‚,ыŽe)GЖ7?8+4xУRdQ<зб4šAŒ —k ИнeXA|ыЗJ№—tхbЉВUirŠnˆ /ˆ€ŽPЛQ+зpЩtдѓ/N_TлМюјОыšЖяžуЎЅ‹­JЉ\ЉеЊњМ№жБюВэZ!œn0ЂиmёHe›†_†"p GЕj­-ѕЏ_7ŸgšJW=лvЃиw=‡ЦјbЛVЉUауЫ дАіЖЏпv:ѕjЅ\ЉVЖ єяЎцб(Tš@C'[ъКд­.Ю.ъХ/Л›ЯлA…ADQњqo~AwRЗ^)‹ХJ“х-k‘iW‹еJЕYЏl]–jM‘&ЂИ–Aуe^ŽpTљкХЩЩўоюзУ­6ЛХг я4K’^?ЯhЬjЏ—f4Zр­1ѕЎОTmБЂ*Пa‚4ЫWЅJБжф[’A'СЃe.5=‡Ю5uЁ^И8м;:?кЊ7лF%Y/Яѓбџз z1BoЦYjЇT(КдZРBљэФBљђЂxUЈTЎЏk"5щ:"ь{ŽKЃЃiЫ44Љ[8КЌ_o]^ЕьШr3šA†Qфo2Щѕ<Є!4„ѕJБ–х­b]М:=НО.•ŠWEоІЃч}‹аХШМЛtђЉRЕмmo]]t]_]]5lpKЕ UTHВj:^ш[ WНМЎVб}b§Fy}yrvq]„ыW ™NЩs§ §0 щЌџ,Ыв$є8mJ]–члmУъ]нt}п3Mзp-YVš2 П iM3QK•Ж€Vџ6Nџ›еEнДЧмo™сУ§8Fіf`ЭwMЅЃЛBЙЁ&T~Н$F§E>>ыъЄ,iвњLЇRИ.]_+”зoмЮAœ)1}зBѕy›I†jб7RИGѓ:}ŸmЈa’†ИŒ Юiќ1~? Уp<{3!Hh–. EЂ&mёНnЉЦцž“ЫhШ›‰Gџ 'IEŽAЇjЂNёЅу‡OЇётJЂ8Щ’8РЏ§Р!3љц5дa_›†щНЁгХ@SvX*‚q‚ Љ "tф.МtdФM3Н8K,EаЈѕаiМ 5r§E€ФђLBЗг(ˆ–KM^}У&гшˆк‰m("бaA•A?$IпЬфж4УѓЮўfвЙ›э:+№ј€oјidЁэ{4XзГСhлvЗ].РщFБTчeёЇЧКйЌBd]зРш€wUe:‚ЊЉ†CэZІcЃУl—Жч›P)šсDЁРJ<Ы`PizqYŠn‡‘яш2ШJЋУ ]тлšc›ћщЁnрNž_РgŽпЬ~PY‘fрИС;Юiš€^QoFDбlM;AЯіuІKhDVАтЭ4q;Ž•Z*ШвŸ№2<єF—‘ Q „MGIЏ%t$%Шžц‡–ъ'ГfН­Ц)zЅЌЙ\—Ž1T kь[Њ@‡FцШКіЖЋ ­zЙмс: т„Ё‡№чв­) єU ЫtОгešХbН™тєгаЖOyxЂ*:˜ЊCѓf№qQ’QдoyИiН™дЈДdЈAАŒаиibШ/cЫРїƒдЊV8YтyMSWœН%яYšoГŒ ІЈXo+Ђfj›l4пыкœ(rЭB™QuEлŒщsь ЇЗtр‡Ёš~y:ošЅУІЛсћzћКшљQžDž&з5QP­‘Ј"ЄМF3цкЇ—-ћx Й-§О,GњJ…АjЕ8pЭіmцH„. lТўК†.wE‡?9ji*štёфZЂIsаZ жшјОХqК"ъЏш€—бЮqЫ|щъЊЋвAЫќ@AЃyS/вЪŒВ™ŠЊI,#išщš4ё}Гx$KІы…ё†U =кFу`дъlџАfјИ Ш['ˆћy/„О —˜ЊЦ3(ьЙp гŒь]ъџшкRыІrsгэ0чXн zЃa§і=i)Sї"EНе№6W"и„уy–ЅCБЂњžЅ‰‚NwзЗ &@ˆЉЂъ!ЫФvЃй~xQи"#Ž R#Hd&Nб„v­оhёКіRЯеёћ‹aŒкњ='‚NњдфTс›[— ЪРІ55 8ЬЇh˜ŽыmSЁHLК1IЏ,B,Jсхюй:ЪŒdo”VЧІhИRЋнjЕл]AІўЅЩ |ЁЃкўhгЈШќŽ\ЄF§ЩH%АнnЋЩpЭ –Ё—ŠˆXнƒœe%UEрFY љZІ6*‰$Šz”хУ^КК  тШ6Q< "ЁYЏз[œBY”ƒžяђ-й 'ЫЬЁyђЗ`h˜Жї'}0ЖУ‰’$‰L‹3jаЎВШ!ЊMв[.Е“иŒу(єМ˜єKтh2ЊЃŸ§2‡f‰<з3DN‚ШŠcЯ }žY„ŸЃ|4Ъ|Uоfѓhљ­• МкЭ‡ЎŽjЋRЛNUlДTDІMОgeUGyёlЬsœЄ‡Дu;Bљƒ^Є."i^і‡eD§HzI ‘eнF ГиуЉŸ>#L‹с(ёmŽЗќlЕШ}иь=Л+ѓп‡eiП?šNjin&tЎж5!Гlд_APmjUdY0 šФф!РГВ„Ќ*J+ˆУўЈ№‘ZQ™у6PН €WОиш@нѓсИСhЩђњЗЫRыиo9жо.ЧЃЩtZ†ОŒbŒКбmЈŽ†є /AOљ Kф:Ь{є]г ВД ж“^б”‘ Nт3Б'sИA(ќlЃ‹Д№У^9šрfœъ†“лѕИ™І‘џ-№lй`0„йxKтF1Ъ‚eЉŒ„HЇ ЫСфxє?Œъ3ЅфуЂШГђ Ь5ЪњУ~P—^”Ks’Ш/іtОйтщ^иLЦ=8–зНtqЗžЪЂьБя=Ќщ§„DuRŒЦeШ2”“@Ю’€h% Œ. i1Еby Ѕ:5Bъ„аcTܘ,Р5B„Ѕt(Ј&ŽмЊ1Uд8  ИŽ(š~Й^NЇИЗуЩ A<лhъRxtЧэЙџ †E™8–ЉЈvv#§$AЗ ;ˆ|нTяШГнЌпяїpQ$ЮQPќЌ?(B\ЂayilIŠчiВmpѕЏлд™Ј?ц(8ЂъDгѕt4žЮГљј›š ЂђyЖЉд|6*ћy1œŒр3№ U†ЯQ&ЕИcЭLЏЁ€єЅ€н&G)< њF=_ќ$яEъј‘0ёYv|мЎ.(7R! сh_“-?]-E9š-—ЋYё нuТJMк({\ƒЩДŒуЂGЎM/ЭЧD•lђ4(A А MЕSРF ^§uж)!№ Мјg+Ђ…ПжYЗ…gnЎjЪ‰dЁяШŠ–ыqЇХhОZ.)ћŸKі4ъ/‹lZЗ§|0ž chІ"6СнИЬ€Я­J“ѕак]п аL7‰Ѕ:!5nŽRфAв M3ŽQ[ТЦЗ€яšаНљt#Faє8ї\‘еœxК,=дšоp2]љЯe D‹žыBП‚F†хt>/MsВXЇиa™йІxsViёІЅr‚цЃфY†Єћ)АТ;2 Р6Š,КЁa& Ÿ|ф* !рUЎss|Rƒе~9›ѕ<ЃС˜nЖ^duрвP 1žщjъŸЌЪ/jРxОœч–$QцhVaY8:пjД€[ВxNгааtъ‹\DЎ!Бœlа”д7rТO<Ф3ф–Т `ЎSЋ|КЈдeЧыЭчЉЃ4ё*[Ў KQtђR>‚\>Sяi1 MІŽGA6ž/ГмфyеЯ}Аiн/Kъ/ˆTl4jГкYа’ДX„ђƒJ &на­\GіЂФžУЗСѕœаRи6+вкфЫlvХjЖ›Lя&ОЁЊ ­–Ÿ &Ё’>чрHй"‰bл*>EЧl:І$Њn‘@<ђаЋЉвоб"pјЌ(Lр,™5п"ЫёЂмi*Aš9ЂnЫužxШРt”$\Јjљ#:?^Ё‰ПrНъљШž“LTЖ"|^^КєЬLYэpЃўtБ:ВЄйYЯ’yе+ЦyB ŠPЬс-ЫіХuoQwtEj_>хБ "оє{‘Љ‹*АCэŠЎ/Зq}6„Мƒ7…y€ryХrг1HqMNа+вР}Ю–ыФyїJUCnDУљjipLœЛ Ї†У)j Y­ŠЌ Инэj]ЧЭ\UцЊз:`жІњчˆ7MйDЩT;с ЪЋYЕJѓ0ž—Ž“^рЊ’feѓ5ЕQ64žЌ†IјЯi<Ј;nвdАJCMаЩзѓy†rBјa+f6)PM ЭЖеЗјЖ`XqьИFЛЦлŽЎыKзeЮnTˆ@_g%пs|7ЊЫ(є/юњE9œЮ–p—ЃсjЄ’ЌAІѕJ(Чg0TР>оЌ XЏu+-KW$=ь'aZІ.M-шšТЕZŒl[pДэ–jхЪmЦ ЕNЋеъ f __ .щDО-Л–kЛzЛ)~}і‘ЂФ§сьўЎe•мb Ѓ{Ј—MzТљЗ-A2d6CЄU^†Ю'ш‘fхдџбЌъ:аA(tPjп7еКU„ƒxvђў№УЙ‡ќ ‘хкќUЧЃgКb“бi.ЗСЇGІ~6Н›Х–ЌХгеŠŒ67Г№^кЧчјЯ! pCHWъBЋоцнЎrРšф@1а$ЇаJ]с[Mбе $Њ"sY‘Ђ,тvvоlПm‰еiЉ&t™Rщ‚5+R‡ ’НЙjƒH3УёrzёpЙ\п-ЪРддM…єСžAѕx?ъ ЦCА[“йV›ƒœм<Š6 eN:<Эњ ЭІ.Е=ЩP5пжкU|*гOwЖЗЗїй8Kv[ ;эІэЛjЗй–L” 0ŽЪЃЪP`бt1ьOгщbН€е@ѓCЉ Khцg”0фьЄ •Т4 DoИxXФа†ДъбPX^7QwhMЭPпCGу­@Ў7Є ЫRИњloћјЦЮГ^b6/„ГTс Si58\k˜ЖЛd˜І&(N1_.f`‘ухšZЎљiYfQјŒf–SCш4X vЉн}§pлЗЫ nЉРBbQПЏ"O\ƒ5т™ІЃЕ?Ет4a”WЗwpЕЅq ЫѓЌb‚ёQяLp:дm™—}ќ!]П?J8:)В$’97щхјЊHЏп~<ЛтЛ]KЊ6‘Ы^:1˜CЄLњБ ЧјУAъ:^2О}XЄЎ‰[˜lњŸ=ЇŠ{авE‘†Žвj#ёыћ;Œл> АsSчЉ ц`6‚/’(„g$ VЊ]lПз‹4KрІ,qЭhЃЩсjінсбощХлЈ0Њщ'єЩђv 5TƒЄ#’5›?>Э3(Q№ь$ŠмgѕіАгŒ&X\Ѓ›щйd}џ№p;M-CЌ3Dы†Гq†Ј$%ЈЋ"пm7*'Goї.§‚“УСYˆ„,њєЊ'Ÿююžž^KЦf"ju†РРtЫЅ@ ЪѕчЧyюбѓм(­’TэЗЯГђ<,ЉгH^ЄУѕУу§У§§jшЇиHFГiЯT”Э“CUьД™ъёСћї{Иц;\р|Н/ГB?|{ДПЛПЗџЁ&ъ ўIPВeБžКЊYШwнNfO?^єшйПOБŽZю?Cxq >ЄБ]AЇ&ЛЩpѕјє№pwПŒM…S Џœ/†žЂ KГeдBэјэлЗч*œHA’ЪJѓМШШrяќэўоЮюЮЛ‹*uМ†,км"ЫЌз™ ‚(JЊ ~ўхЫ2ї7waГуб3*ЂFд Фуfz .хьсЫчЧћћЇлЬRмШёjQZŠаЈ3„ЖŠ&qэ‹§эн+ дKРŸшыќОЪуіћНН“F—Ѓѕє+U—dv;А цКƒI—O?§ќгК ˆџсcPd=ямŠ™XцСН|з )>>?=><ЌaДЈёќv‘2ЫШ:сИiш;м§ єЧƒ2пL‡‘З7F#?ŠмМинон98яЪд~\’Q%QжмСzтъ|•5AЌяО|љr; ЇŽ!‰T0Эчєт• лвea#›h-J6\====>ТгšЄ™йъnб3i‰ AjšИЖв­<ь”ГЩpXДРƒАšžХm] ћЪ‡нн“*OЄQ5tx#н­b9 ЁЮvЖК|њщЇЛ!M‰9(L‡•­рфЃСƒнw7ŽAѓБƒлЇ/?}YgЖ&ЈVy{П†`АИз2Яфjча;є šщшЅ›РІH)УЩ€џю№ДЪ)Кўu=*еo^ВћЫY`rU†њћСш/ŸWУ4$uШ7ыMб #џЗ§щІVЉ5›ЭюЦ5H'ољђyнs5^Ењwїwѓ2l0ъїgГI?rфц5W.&“ё ОWвВ0$eСњ9šЕЃŸъЂj т ЩIyМсr›Bгœёэн§уУzDO]Kъ6Y’q№л>>§tйQхдйoјI–OЗ.аBУЛЛѕrЕ\,Ї“ёd9ŸsOя^K“љd<y™хe{>MKSъ'ГЙњўєгЄa9ƒЊC•—ђ)$И­pВщOяяюЁ\<šRWA"MzfFПншгг+†V˜г AHQSUѕ`њј№xзw$С№ЧЗыХd<š ЦЋiю›м9;™Œ†}8КŸ—4›уDEПшA FУб"xєсJT­l<ЯЇдд9/“љr=AyQЩ'їїwcj™Ќг= ka”ёo7њтЌЎx!=}Ј$*щшё0A-аЃйэb„В‘&3XА\ЭЎТЧF:–y^Р\zžz2(‹j_ПьЯвO''ч‚fчг9юЭњЅ|>[ЎgЉ­щVОКЛН]•Ж! ’КyђnŠХ3bКzйвQTЙBЊOQЧЉcЛХj f3Нœє|W<­—“ё!<‚"–‘эF9.’Њш†“фќшјoxƒ9~љ:G Lх|9Š'!тюV'HoR )ˆМпntНвбНЈœLM‹К^oz ??>м’TdœоМ?РЭ/Ёі…гF1%Ѓёuа/}ЩЮњdтЅІН‹§Ѓ3Aї†“щl6Ьh-ЄFіѓa‹лЛ; *Ш9-^№Ђ|8›‘ xFuщT;šЫхˆІš-'ž‚1=вkDёr™ƒкA9ZИœ ŠЉm„ЭžTтЩpая‡у1pOЋKщ/eYтяFƒЦўЛsб№RГQyBРgиn:[.&Уљэ-о§nшЁРуЅУХj1Ъhѕяo7ZьЖтХэВЙŽ юЈДрпЧ‡[PЪ‰ЏƒCЋЉ7и„Ог~wЈ –П>ёгЮYУЮ‡ƒЗ˜лЛ‡{чёџс0ѓhŠ˜fоtнkZƒ­пТеїЫ>- эHє!tЕч6XдD`Б„K&z +.s`‚Љ2СЭ}~˜ožшЯ\Хy.!Лr€? Р§гЯПўђѓ—ЧЧ/?љуŸžЪѓПлЖЎ#•L ЩФ ВЎ2 њ‡яkV’EFћгўіЋПН~ѓњƒŽМєS›Ћ~:П:ЋДЛхЮ0-л†Ѓё[?єю‘ƒ”2 7xћЯŸя&ZфŠѓМ'dЈ†о уʀKџќѓO0јчŸ~њщЫу§гДёњXГ4УЁ‡Я ›ЕŽjчxg{ћ№КУv:lѓhћЭ+ŒCоAšњJ§УqЅнЈЖ™vЃK3ѕ@<кЩEOvЮ?іw KO{ЃgeJЕи}^;фCжЊE 5>~ћјг/0ћчŸщŸ‘4цлб@ЖgлЅЊВ†oяОyГtrоh_ьНй~§њеЋw ™o7ычGяNkZGрš &t%и˜fDž\?lN6иБIРРuЎXіžпУйч 'ё^\LW?џлЯ0љWјћЇЯПQу}ЧЄљ!2:‹ 1€%–Ц\mяьnяьюМн&OП9ИМ:~їvяэбЧЋјXhЖdзЇŠˆеtКgGЇ.Мp{OM њхЭнrБ˜ѓш9E|3TšЌЗmдЩэ—_ўп_§Ј{ИЫW,p:иlПа-—–( К‘;o^Нонй~Г‡№x§ъѕ›НwЛЏ^эО;Йl‹e'5Žќ“ Cеѕцўю17y МЛ{ќќ€ШFкУшBюU?єžA—ОZЪrRЕ?џњo@_гpЧrђ.у*7ѕkИЎЩt,ZърКФМлЏ_Пyѓ&гŸ;лЏпьзyŠdЯVUУсiеVYІvДw! Jdѕ§эr>ŸЏя ісјЇЛ2№žыij4„ž•“е,†ЩHФЯdїуниЈžžTDзuр2ИšЄГoтщ›эmXLџО&ЃЗщыНŠ„єАл†щG>РCЉŸœДќбђvEyx˘єihE!„]іžпт›žћDaRŒ–ПќлЏПnђ3UХЧћѕн:•yкƒhSIЄ™UЫrm]К|+ww^o,~CџСюƒ–ъfm66ю Э_œд­ЧэzЕОЛ[M‹8ŠhЖvВ\Ѓ– !pŸЛpжєУ$‡RZрЁŒпп­V_ѓьkHч%=]0Qlэ Xkъ…"\lяьl|x|ˆРшІ„ ‹[BjSѕжU‘эhљ$šl^Ує)оŽ6ња|>bіћœYЏCТ rh§ј!н§|PіЪхgѕУ=Фж|Й€4ХeаОIш_™м>xНПKоЅР УпМz№Ј•@zІ дБyšцфЃљzŘЏрf?щ…Д:иЕНdо7ЩAёžП2вў…ˆq7їpџ6п­жPА}аш8іŸв™ІЖТеююЛнm ‘7wуПэНЗ;я›$Ђ$#‘;›ЖД‚4ƒ6CЌ@voязуœBек~:^Я‹Ш}ЮSЂ + {Ј+ŸŸюfа=Ў)Kv~ћљщ:|5њi„ WєШ˜Nїє`{“|лш7л;л{ЛЛ'MNкьЦЅр@кDg?Nч›шИ_•А™6ЙЖ–ѓ!-œњ–ЕWž— ых&{ЖЦ4%7ПћќАœA;AСіѓиЃН1ЭН”iDЪЊGяШвњпл=‚?„јЮююо‡Їщ(BЈ!Н ”є§$/G‹Х‰x?lчы:r—žkї<лќІЇ дY9(bSЊW˜‡‡еЈ@zB^4вЦ7кdfjєHМњ~gооATPN’сo^я|TУh‹vŠКє(. bњўt6™-VЗ[7-ZЪqцы‚dPъ( щQ[НfЌ [=н"Љ#Z–Dq •с.кЯG›™vхd‘А§j{oчЭіaхМђ љјњkЌьМ=Љ 4ŸaвГ-~„Нээ‹š2№hŠк!Ћ“^œ}уjBъlіF ЭZKЖƒdњ№8ы.48w jBйю"ГT‘iзo>‚ўэѕоіўЩбооЧvЅvО)‰;pє›П§Џџyа$W› ‰р,&’&mF‹Лih("­–Ѕе|§Aф]}8ОъJ”[ RЇrМЗs№0wЊ“йx0^@dŽЈ˜џ§7HЏГїЇѕ~Ћ^ПЉ4ЙnЃбцCп<ж7МСj їъMкыRіЏбЂlr{; mЬ‡wЯ/ы п­W.?Wк{jг(]с›gŸ.>ьяlПЋi№&ХcП}ђnДяеўљU•$ž“ИцхEхъь№№ьЊоІ'[ШЯdЖ,}ЫьVФвє;mоЋЩшnžуMеійЛwЇч•jѕђг‡гъ4\zђ ­ё,SљјщуёЧ›VЋv}]‡\бјfхтђуЛУг›&Ѓи&nП­4>П?опп?>?ћxеьŠЊцТеБcK7U^Ѓ  я5šq7иБШ‘…†Ъ\~јјсјфјфS•ƒќ4Й‡"W р”иhђ\ЋђPВЗtЭЃPJн: E[oввt*‡ŽЮ_Н=8ићЁYyћіьЊ)щv6ŸeЎ­uЎЖhоїкМЕР(Э‡iАвиЪёбёћї'чЕf‡“5+N<›VSГЌ„я -AS$ўц§.ЊїfSNФ–ьшL›•iЩmuВdшoсъЫЋwoON.Э Gѓ>=ќ~sПхЄ7šOћ)•Ў1P‡Чѕf‹•5'ЅЅОŠІ pЄІ№Ьf’NК>иойЏвњ'нP8ЭгYŽЖёы<д'Й]П8мУ8x№ю№рю˜“M&nйЗюЛјOŒŽвСt>щЧ.DŠж:ЏпџPiДе Ва‚9d‡RWL[Зи“нƒŽ‰ˆ1!S4zД9d…6 x†дiUineџш№рB“ †ѓ2pОkcЮџi4j+Šж”&–сkўуюЮюл“kИжАг2дU$МЉ t ЯˆЊх†|ЖЛћžГЭ0ЖЩh]Ђ-ŒДЯмM ЯРЯЖ.оНE­м>89<ЌHДТ4›Œ"ї[7‹ќ'Fƒ'‹љdT„43Э}|їnџ№œfk Ї т8ibiR—ХNGR ˜+p&ЩЗуЬжDFUD„sT–Iћžeh2пјxИЗГГїю`џ}CеtЫ‰GЄтsfЄџoУ€бQ1Fyрšк<===ЛЁЊbZ~1ъЙЅ),nњ5ЃшaF§ршJtМ,stЖЦK`n:šMЁ њ‘CS$b§єdюйiћыЮэbTіw–я fєєИ"DЅ›ГJQ€Zf8йp6Іэ0§Ш†їЎŽpЇrџщДeX~™YzчД.*€ЦўdБ„PД:Т1ј:т~{{їнKщjЙЩ ˆœя-…џІПй]„ Й.мTi;iT;(Цгщd2тѓ UmžЁ %CŒ-_]Ы–SSoŸЖTУя•§ўtБ"™†Д“@—Ўръзл—ДЯй2нЈ—њП[xlI–ЛYšlћ>А [gˆЫ#Їh:x6ŸGƒ^ж&Јья]vUZВBhСж/ЃЉC;„"БнlH–эбNц$ЯPКД‚/вCюЖЌ…ЏШ|ѓŽЖ`ЏiБ]нŒЦгФЅѕvУхr1Ѕ­3oЪ гЉœœ\въS ‘f<?›сlZ cаЊсцFNВ^>šЮч‹Aу•}G:Д„6а%Оyй‡ˆчгР4ЛœeЅ‹ihЪšэ%уеzЕœ– ш8ргj•Oчfй4ё{кќuШ4‹д9?яъ2Г?˜ЬWѓщ№^oЃ@лЂюzŽio˜vЖœGІбъXV̘Чзб€4cšП›IŒ›х6W­аЁ=Д™чwKТџcŠ,ѓ­Z•CИF%9zT1`P”Ь|ƒ2šгѕЏ2nЙW,nŽЩЗ@ЋЦЋТ[ЌюЭ}И_Яњy…0šmlhža˜ЯY;јЌС‚‰*:”‹пЮf§дЃ#>DVВЪYj™КhуIJ'2Ё&…љlž9F‡7моj"'ъvип>>Ќgƒ4@йVб‰S_ћн˜в2D/pЄfCDйMћƒдЅ%u пс48яй&УXС`U:ŽжфЁхd6 mБ%ксјЅадTј:Џяo—“^ш2пэЄш§€`ўїЁДуVарщЅVн Вš.f‰m •Žс–Зл’ЮЮЊљМWwuЇwЗ.BФЊ~:"фЫ#ЯxQ1€Eп6 і[ГеšLГШLpЋИчбt :ЌwЏ9г-жЧ’Nп~lЃдЌ&О#Е$'^>­њ†ЦЈ.0d1Ї­,4bЋт?PЂ9/BЩЅХпtж­e\ФІЮндЧыЏGЎЅ\ь~h*–“­f‘ЃЕ9;˜<м-ШjЃл1ƒоlО%t6šчYФФДMХЯЎ tжŽхХ§љzьыbэЌЉЛсp ч7'ƒі ­GdtЧєFwЗSкRЁ#›гбt<*шЄш9kшПЧjšА%m$Дš5LЫЩb5B…Ћ_ВИ‚ЩэиЗкЕсxЩфn•-зq1Ѓ‡Члй L|WRќЄ 9-Lн?ъ˜Pкѕa*з^DiЖ\[kн`Ѓ‹Л!Ш|НiЛбЖЎxЖxгBIПП•YQ„%9YšЅi–хiфў^ы7Œ.гйjгyWчњљьюaйJѕ’З§bНјi7[Іэяo'БkГm+œ?Ьђ L‹8r%L“$|ю#ћпglB›,/WѓФ‘*W’ŽзрwЖЅ˜ЮріvљVыœГГЛЛAhџ <­л•~ьŠџ—Ёƒž‚ЋV8О_Ф6е0§l6OlCim‰@щхro*Њ?|ZХ&M“єpoў€CŒўЫ ы{ЎЬЊv~ЗJlцŠёТўj1+еоƒ†лйbТ_еЭhў4ёuIїТ$ViѓŠi`xьŸœU№Ч%@ysДcD‹лЬf*œБ{ЈзЬЇ-`K:Ÿ&ОеЙсќс.CЁнЁчIuьмw}ї‡БЄџrHФ'MeЋc†‹ћмщ\ ^д_п"л.ЖРЊzЫQрЊѕš‚шXD6•dчˆЌБyT†юyšѓfІЪ$nЩ^4Л/]іŠsЂ|БžчЎЉ\mёК•/ћО#Tjz8ЙяЛКjЛ>РУ3ЖZЄdAјœН ПЯрuУЖ4vЫ№“Хуа—kmЕnЙњ–VЕ‹EщлнѓІ-зБ!kД`A!o КŠkЖмo;^тћшžц ЩќqщэgGНбbZњхkZљ<їЌЦ9ыіn'ОЪtjя‘BйD…b=g]ця6DY|Љ^4О_eŽXЏБfи›ЮSлЌlŒžЅЎZЙ’§СfщЕ0кљ'B Šіч5?œ \п C‹ЙЎrvXЬrлnnu@ЂЧБЭ]дxыдф%ЧЇ=fПУьѓя1лKЇї‹дS›—UlЙяи]Ё“CЃyХкщэ,дY•Ч}Ю†Š;tАглuZlхŠЕТўаГЙ-4Ляkеkй- pi;М dўУ1юП‚d3тFЪѕЇІсхP1T?,—wАcЕeаьр^:ьYЅeˆЪNћ!ОсT—7КNNжг<”ЏЮЛєLЁ‹z ЪЬЗЬtVzДЁЯqЌПLDгPќИ\,БY;…JIˆЈŽjКŽХUКvo^в"]Ч§KDєХППд‚dДЇNѓДуFЉчАTхmлdЎЗNkZ\ыдVџхЈќћKжF)œімю'жatkkЋЃ˜–бЎ№Сh5H"иlџёDуПВ— ЇeЈ4”0IО Ікn(ё|5Шbъ№gлјџаЎХl›Мј•М1В*sœYЎ%ЄўWBŽ 3ЬІ`’™ПA Z"Љсt5ƒџJ§ЯСћщ`:T=*RУо.єЙXNЪ8žГпўz” †Љы$EќuБзY[1ьlд'§ьУ ўЈaХYПHтМŒН`­ШІC'<КЮЪ§ОсDДжnиМMщšv›Ѕѓп§тŸ:ШъЂ_DўЦгœщЄEј'Lж;МЂџb’кš™–K-6‚0 жt$[’„ŽcRS7лP4пiž7V6 Y–-Ы”DIE•ex8н`uНYC€0’іЬ†fп0:’aX€ГиЇГ=etФ}šіŠœzz›І^Р]Ыnˆ{A%tВ€M'ь˜ŸФ4‘7зе‘BFж”!ŒB‡жгйј:ѕДЃF>ѕщЄ IЉ§yБзЎЩaЏ—ЦдіКGгSВпѕBЯPQQg€{еFуІжЈR§H“QZd ч™–ЁШдX‰zЧТсd6№БкgŠюЅЁяSsސў>Š№ъ|шЛ–"‹’"qнж5hI€Їц:?аhVeЭ0†ўЏdYЛPЩ|Ё.6Л,#шAy5wЉŸe{дЩ+ŒшфG‡zЋƒЊRчъЂоn\(ўPрƒ–w6m]ѕ—с1Q YŽ\гmН5m?H"Б%1щ6Б(ёMЭpуˆкgЂьЫxЫT›„|•ЫjЃѓуXj} мљЏ) УdЁщPч` } SGбƒажq LпфИn­RЇŽ†%oЋNH=ьe$•N§CјtЕ7WвеєМњ Q/vџkФІН<=S"Іšvрy&G:х^s‚^lвŒ–ТuЛрЋІhџСS7fЃбhБј8YЁѓсНd‚jsLMЧax›ž'ŽaСчИnšEЎ‰0ыDБd#"„ЖЁJ.Jб-?ќсgцБ\Г ІдщђšIPєТЧ!AœчиЈЯ‚ь„ОЎ!рЙvНйUТиь†Ж$ДšЌŒ vaЇмl’„PU јэ;RѕђьуEЕЭuџ{~ѓшЖкMИŸЉВЕkšFb!]PRjьх zн bрЪ<лю4ЋеZ1bfEЇсљУВРЩ‹­vЁr4ЭF§}Г{qњюрДвтП)…6гiUщЬ5P:БyUEы(д ж5ъTqьS$7;№BуђЄ*(МjъŠцRпё" ЩЫ6a—†>Ў6š7ŸNo$ЧвDQУѕd=jсŒRh ВЈЕ:АУvBh„<ё=ЅвФe#р<ы{йj‚cъšиОќ№Ёc9>)S0x&hЊFн‘›Су6Ji:alбiJŽЮЗYžU@Ѕ]S•xСФХ„>Е[†DvЂќuЎЮ.n3 lъyш›К 'bв ƒШHГэzƒш™~д+RЯЈ—IVаЉЩпuђ‘bтmр—Jэуи>5Ђsn5ХТr=ъ-В9 Nы6u’5T‘Wё –д4u'tPдЃ0pM~ 4,Sїg8Х ѓ~ъ™ЊaI9ЅЂяqЕъИЩ`8Ш@‚5ЁкІNoH|0.ЂеQ—Ж&Q':Cф@=4ˆ/Э‰ Э№јŽсК-™i0јУ„bˆH.лa/apЇЫђаNмяGŽ zт%ЃЏЭяHFУђђщd˜ТЗ†мjhtЂ™ŸdИх6ТZR‰є›8ЗtО%($X О{eљњІE_9qЯбUWŽAољIтdsзg•ИT—фуaьšВbКбt‘Žmп^зн№ѓЩ4sЉ#1Мё ^фЇ`$КYфŸчЁ дх‡иtuЃћEъ[д—сT 2J.зxQ5ЫЄЭlЕ^ќ ОбдЂФ5yu8›ЧЖi˜к7—^/NЧctNQ‰aР;x&M|Р  єmjNЎрцFakXAV–y/щбWй/ЁVzр%рЬR%•ŽЎљZœjAЁЧљp6Щ1LWuЃХиеЈф|ЋеВNѕвй,ёеa8ИГФБў. hQЅмЄйrcг.€ХІсFYПьх§ЂW”§ў є!игЂ@м„ž'Зeтї†ЇQмNчЃžюtu?Y}SІ>)њ7ЉЩЄЗLzгyЯв|ФŸU]hvQУŠ^Ws(mšчЋOؘЦОЕilRп–<Ї‰™$ЭћƒОЧ! ќ*іљЖтстTŽЉЩTкŸЬчЃ<№ŒfGs{ЗCЈ„ЭФ„ѓ-ТЫЂіЇEїХдž›цО Cэм№vP–)‘KЎ#ш6Ъ› 4‹#њРEBн%ЫЂGЭСІr0LЁ!ЭbH3;ˆlNtг@cСЁ6&RБc2lЫ95+RиЎь ‚EAzЙqЙКс;bd№‘j)`;p€с№ЄЇ ‚щZBЗu}RеlŽžЬfг0oЮюжЫџН7эŽуHЖё+цœ93=E‚и €иЙяБяћ‘‘ћž‰…”ъMџїЙ–ЊъWoКњД ‘’>Р)QD€цзюu7w†Ус8Н9-nїzCEVЌlОšЉ3gžGŽЅHІ›ŽHۘ‹д>ЮВ4—a4rxмяїcK‘ЁЭШp гЙ—yЖ*А*Вx †ХUЋеыG /Э—ЫiA#nКоЎWx†йb1I}К‚іmƒ)€–ЬАЊюŽ–ѓщl<шчУм7TAГтёШЊŠ<ј›сBЇ­"H<™d'юЅДФDїL{|Yт&и"/"!’dШЭZЋvwпEШ'УХjNЭO%Хі0/зЋе"ёп~1ЕЃCз—цaNo>Ÿ,ІУ4юbM FгФztX†7•cxЂкІаUь$OЯRPКнђ]’E–jЅБm –ь!р<lЋvYЕMXL<Ћ;б|3ычљИ^є№ oМ‘L&Мѓ ЈTгщЭ“щДч{б 3AдНў4ЈYЉжšнВ#^UIі"шС|йІЅjId4rTьаkMлw0YЎ]О>НЈЫЖMWSЄЊgx§Эj“Ќя gд&з2о†0:ˆќнжu;Э'Гљ p<АI‡8НI`ˆ,Чu[  Д}AMh9Qq,,ю.цuС8­0є ЮLcп“ыZЌ6Ўў№pWhЊЖл_ЯKшG›ЭФгAвм0ЬaЕыМiGЕм(ZPtšwSфZ_•Дp`В)vojа­k†•РЉ§ЧPqPкŠ,pЩ=M;UФNчdbмjЃeUщ6Žч9є&^Э“aБУѕгЬƒ^œ—Їу ї-У 3Rj€Kр=тхГхjЈЂь 2йJ'=—юЬз4БУ*6д­РtxУ‹Ќ TйnЕ%В,лэvКе‡ЖцЦЩо tЕz ъАгюЪЛžnІ$Ћ>ˆ.№Њсі–ЯЋX—СЪУЫІѓ)ђЬ[4ŒNM>ЧЉ+УcІ?XЌf‘!Kzœл2'ajŽp0H)ЫЋn`ДЛАСВ",іОЎRйA‡хкЕЖЈћ‰­KЌžмL•a Ё‰эыбb•L ŠЭ6›L ˆ„YйŸЎЦб›ф"=^@˜H*„j4Z.z†,(^?|ју9('E=„х МрІ жД(„џл7UъЈ љjШЕЊdˆДnЫŠљ’•u<ыї’ Ьыo+МЄћгэг4ЂѕnъM–ѓЬїоfдp5ЇnOšЌ‚сšбx5r4Q2’мЁF†ЉГыи­Љ’Рё’Љ4К дІcњћrЕPбРULЫu„л[†Ўаv„&™хzЛХб^ јнx:ŸLчЫЭЊчЂЄгѕf–@ќЫ˜ХqОY#ї šis8CDф>иХЕnЦЫylˆМтŽњ=„ЛЅб 5CкЄa,йr!Ск%P8yїŽ юўЎK\пжjнг,Kn#^ гЂЄз В—/ЋЬе+Yn6ГдV%^ЩpО^ @Нб{:јзd1"Ќ ™ьuwМШ-‰“Œt2щй№> I”d№UЎSmУvE‚AjзККaS)7YУb[Ž­ОQЙ“#ъ…мdРgieЗяшЙAn—к–Шлт8ZEr/—ЃФ№ F+дЙv6CTл†иЎ5xеlІО* є†ЙЋ‚•JПИњFуj5Ыжl‡е[i>VE7T.>ўR”ЛнR Эѓм>qєVЅƒte‡1uI7‰ v4нЬ{йhЙй>“ЯeЬCъ@;Э@о€Дžgг

&иsаŸL :,ЬBU3)І_Ж}Kоš–.22ОgљА!ы‰]^s,IєЕVЃЋ'YšEн/Ÿі?—4MЁT’Јщт'’—“<‰vU :xdОкЌ–Гхцi3 щ,ЭЧ=(њ7Н$Žуt<'G›Dф!ZBjj8 Y@“%JРЯcLўI?ВU…ыЪHй4яЪ&д7†У\Ÿз5к:LЃючлrEkŠеІЮyn<^==­—‹љyЯ”%-^Ў@7fЋчэ$y Ѓ'§4tоВў“IQŒh…EЈxa6н>?=Џ{–ТГ<’4RfoЩ1фihРY@‚ТеЎOi/JRdЏ[3Т Fg}чЫСљЩMЃицЋM™w4™#6лэггD І“,щV/Я35<ш:sPі_яjˆгb а!7лЊEЫUыэѓѓѓfьJГoYn>ŸMzЁчЫфEЁ~їхр„Ѓуt˜ЅБЅ†IПŸїzYєxr}vpёљЊXюЊДdƒћхƒёb§є4їUйpГдs“ёіы В‹ІAъѕDŽыyП=‚(MYфh;8>>К‚б ўю­АEУѕv"}! ™v<{§і<‰lMsIјŽ …чџjЃэ8ыѓФЇvКвЎЧqљќД}y^O|oCћїfЋEпR5ъ~ДЫ€W?œ–ƒ^š%IжыA $Н^ПOчТЩЇУƒƒУЃыRЙЃѕљУя­ЌMRLФ’ЫЫзч ’0HD!­yxуПоh%LГ^Йд‡yзъЮO'OЏˆЇehH`СtЕ™…ЊЬ4Л`TH1"Чз>|њtЦТф”jВ,№“.Oѓ47/?ю~~Ќ<жXˆ]А0v‰ЬdЙЅйёX{А§њэeŒ‚˜Еp4~иЏ6šѕ!’(p,jф‹7I/6ПМn(•ЋzМXoІЁ*ЕžKХљжѕССEУЯЉЏ]FF‡aFO2П|vx№щфЖжfDQ’№/ВЉ[Щ3(MЛ-СыгчзŸ^&pŸЪЁLУЃК—ќзгМнюMyІJИL[oщќљѕѕхe“92/ыЩъ F#0Tz(ІЬ5юO.˜оlдƒ‘ЬЭ*НOSњ7‘nOŽO -NЁ€RЈ'ЎЪ-Лу-ˆЗЋ˜ю`ѓќњѕi’xT@% TCgоЏ6к№ƒ ’•v-ф§ўцыыыыДƒ“Э|НEцu№,/ЪhЫС›7L1bцѕ0`iЇ№4Eј0ЏЯЯЮкдЖва№ЈІƒ$jўd3tŽSЭ`іЗl'Ш”H аLјџеš§ън\Ž6ˆ,]юд+е&#сЉ`Д}§њњ4pUVЖ†j УЊl8žNЇУШ–[еpЕ€Ї{dtžQM[В[ˆŒђбlЄ@Щоw ƒмИ`™˜/Ц./b-#КŸhЮPPЄЊ^irTpјыuњч!ЁК,їIt šСшч‘Ћ Њ;кЌчsZвšRѓєЬг:Эсf1УЧY/Я1‘#„ >‹$“ХИ{њхQ4;Œ€LПžІУљrнг АЌl|ZbѓМ^kђš›§_ПљљЎв рTиhœъ ŸдS_“`КYŒњchє9hќr>Ÿі‹ЛэN—ГЩ(hъ!ЙDTDЈ ž9]Ќнѓ‹BWбМсhК\.&Ѓс/iЙ^SЏPMwлз—э’Z ЋР"†Їъ†цџњ >ЙjƒА[Tk›iKu†„zspbЋЗZCRП™>›Э“<АХ›юl6їГИз‹$” CЩ`2]їЏяj2DеlО\Ўh яiŠtОЬ]л‰fЯ/OO‹@гъ2еД З$YтПQЉЊ.В(Ў…ЛЖ­ЖЮw№1 <М™Х&`Њh0й-НѕCWИf&dtч„t ЬN˜тП=а“| zмМЙ~” ~†ЇR#šЌНбb3Ы“tДFТ}^јŠDЭx ќеQк‡/<џзЏим7•н†Dœ!#ЅQ:}y}§іѕu5ЮGыU? ‰d^šGуQПv/…Щ|:ъЇщp8 R““§ д#G*Nё<‹г{ЩђЧ‹9L‚[и–ŒЪж›љ„hщЫѓѓ*ReQ†›AбFгХ$ѕœ_Ÿї UСёЃС~QКшЭж/АЈїВС‹…x&xQЉ„ ШЎ]JуŒЮћуёh4юq7;‡љ}нŸLgSсќ№šƒЯN{ОEMЉрЬ‚№"Pxъл$-œЈ2Е^тЩм_в{EЦp‚Xиb„,‘ЯŸПТdŒo__^^—-OtЅ][s‡Њз"OО9ъє'Ѓб`€™6ŽƒЧƒsОOѓm4 'АдК:8я˜N6іЉЧЛMsNU #šmžРQг/Я‹бїІ‹эѓv=ыƒМa Ё\j‰†/Ÿ^aѕ`0}њіѓЯ?Н~§ігO_ёГG.ќЬBUяfЊK тŒЮХўC0Dd@Ѕб–Я?~zŒ€&ˆžўОŸиwGg5ЭŽ09] Є баЇюž†елч—чэ ТŒ4в%є|ї FЗЊ ы–њіМ^ЎŸО§§gићѕ Ѓ#™v& luг@* ЭWП|ЉZљцALЧ^ёрУпЮдщd4С i­@П?9yрСƒЈVkr*-BШЂЂчHU0ёWљњђњѕхѕe=ЪЈёЛџ–оbBТШtzлЏdыO?§ќ0џљ љхѕХЈЄбоЗ.сЏVTY’К…ГЋЎ FS@кl‘ЗЯ>}јА_я#љLсlМ€LМ?=ОЎsЛ^\bЇ)зDIe§Ї-2 ё1rЫ7В|3Т4ЕЉосзлМ'ѓЂdИўрљыы72іяџ§ПџП;Г1_Пjч CЇ:@S‘HNX…ЪЩб}лЖ!:ц яц№рУЧП]КsЬх)нїšї—gз•6„‚HМ“тŠЉ<Њ[@Ч№”Lў‰Œ~^б2‘Ё[oъ-†|єШ–/OK$­Ї—oџёџёїП#Ўw?38;l…Œ6Am ž–™ыƒЃЯЕ‡)ЗXєЅЋУ§џчу‡c №]6ЄWkЪ ž–ˆЉE1MrКW @}}}Іщ_?ЏvФpэ7UйPЅL6]Яi’хЃљњљыO0ћчŸ&W ŸЊ6‹–Э *ЎBТ—ы—`ЬїZибїЅЧУћ№сЈлЧCLfумцЫЂвЌWМ€0ІjZZ(ї/оѕ ŠршзWP—йjєыз'(дРuМЗэЫ)0:г  ыFщ0§гпaєЗŸ~ў† žоƒ\š6№КFЇS7ВдКќДTRмРRdііуGН_„=ЇyyYe†Љ78A„ОЂГ­№HW­љіщeћJ€7І<Д\o‘y—“>ˆЧл*ƒ$`ЕЉЖ,ZУъЯЗ/п~њћЯџщлЯпz•{йТ;6,ЯВ_#ГЕ}}ДrѓXyИЙЛ<мџєсу‡ŸлрђОЏ6О]VYQ`ыm8Z‘vA ]npх;{†ЇŸWгс ЯAЃf$ЃŸVƒрFCје@™D!Г Э˜п!Ы7A‡ƒЋu1mFžaбОИЎёЅѓOŸ ?~<>њјёУЧЇїЅbЉђp~xVf%EhJр,+ЊІšrёК NŸ(З@5O‡HњƒбxЈо€2Ьcп{уЈAm—M]Г§Ј7Y>Н|…— iрЧSЊ€gSЅЗep ‰N_ R Љўљ#bFјДџсУЧO?\жШЛКЄД]ЊAv ЦхтчqА&М{кЎЦ;на# †iА~~]&Ўїж,:DЋЈ†уEp4єл7d˜Џ„xџŸ^FRЕT,ГІgБmйЂeл€JW*GћјFяЄёiџУўСбСЇ/mЊƒSщ4€&ЎТtлХыš—Я7+`ЦгjS§gчР -[?Э“ЗЌЉџcppŽ™–MжO _)З|#єпсгT~МКышTbJqBqф*{IЁќё#ŒнџИџ‰ІWh?єŠZHлTƒиЙ:>НМчѓЭRaє,Х ƒэЯЇCpЌХ(vоВЛЕ2е{ЎУхіѕ'XŠœљ pJмїuщгкФих6Z#бUюњу>Т™Œо'ЏУлЇMф*p+ЬмQ$Eз;…ылŽpоlР<6Длbьќ+AZEцQ ж[mvvЧWЂlDєг.О"НМRЪЙY*vГzщU ŸЗЯ? ž$ћ#€Н§OћЇuAаqT1bэˆ’" zЬцЎ!ЙЖлi= ŠŽDiЧChЭa{oю-,C<ФYжгВёr’Ч>ЅѕoЏЏ` ыдь K#ЊРs€!ј e-uїOŽіЩVИП>"ІюYHВЂiЛ…<šр ˜пrБ\СеА}и„@Д+ЋЁђШwоъшН=з‹{ я‹ѕfA,б55+н|}оЌ‹х|<Юƒ(Ђ0ŸжL*–UdОzuztzHŽ&“Щгpє!‚КШ `‘DkАЯш4L>‚fйlсьёЎЏLV ;ЭGhщл+иЉл§‚{6Юˆˆ-ЮLЖ_З‹Щ`4›"Яe1^еR!i?жUЉuћљСБПУŽOG‡„дŸш“§ЯЅeB:№`›6”,U­zA6/рэѕv3ЂMЧкMУT~{™ †э„рšyL5T:[nnіє2яAŽЇ#†ИqњОGFЋ2ѓxq|Миџtџ~ОЛ=йЇ(Ё'8Н~ьˆД&Ё›tt‘sFižх“ЩxВиnr‹Жpшˆ ŒЖ{УиЖ~SуiХvЩ—`ЕКмО/In0}]хm|AE Ј\а#ЅNgUСцЛu$>€мўЂњгЩmљБR8оХ5`фгЩyЁK[жЛњ5Дa$p@FaКкфДQ‚Б,ZІЭzѕЋdZОC”šЅ‡ŠhћƒЇ—IhV˜#:rЊГЃгžєFЅNхёіЫйЩ!%ёГТухйUЋsYl^ььюDШŸм3ДФЋлtИuwšР‹RZСЮ{ƒљv Љ,RŽЅ(ёгФћЭmzU‡мЬ–+Œf{йъe™`™^2˜ŒS1щгОˆв­=^_]}>9NРГgmCh6Љжi}9љ|}uŒ џtєсџќo‘6ђ,:L›аŽBЎН4э/‰Ѕ™™Ё„Рy•ўз!ЄИR•‡&zѓч'Ьq]’M7›LВРЃ#ЖЮUЏЯOЯОмпм|ЙИО:јo;jІƒ”Šs ІRiЫЯ?~89џє§G -;;gZ;л(ЂћIшFуѕа35І#лЛƒЏоУя<ЦЅP}n›g‰cЉЭ&UvQб[&w ˜}phЉpsq[+н9Л7gЫй8q: 06Я?|јpQi^§пћM ЃаQbлЁƒ=Q>šSздt1ЧKT:,хŠѓїеия .-л-ž_§Р6јrЁд‘] lф˜_ЛЛќ|ўхіўБp}uyz|зх+7WoК{Њ•Rё—qКПџЗУБ~|RтЈRjn {G4bpv‡ж}Мбjи–иfднF€mќЮцТz:к.aГЅUЎЏЮn*,emыдшИzЋЫђ<]ьq}rxuw~qqйpђˆoђбd4LšGŸH™ŸОœ\зЛнnЋйщtD‘Dйиб> ТLч‹єi№Д_тў6МћWЃm7Ќa3’–Щ_Ÿ~>Н.веvЇеlвA_ROt8Ї]ИОПћ|t|zUW”ZЁ"šЫы“уЃ§onП”Жлn4ъЅB­ZЉ—ЋŽ ^€ЋЧы1X\oШ„ŠЦяэˆЌ9Ž?zкє=SWйТщёЩЩUБжЈUщД;CЇнэ]Х АаОћxyztrqџpѕљтцсБ\.V+7ŸOnk]№ZT’ЙкнuссьђюЖX*•ЋЕŽЂлљz•!‰uЊh§{ ОчњУЭ"6 UhмœС‘g—ч7еOЫПœАЕh!>љvГr{qr||€~њатрJЖл(ТdZ\Єк` ГљцѕљєќњЫйљѕ#Ћhў”ъ‚LЉQgdэїwЫ‘Я'›)вŠЁ)HеgЇ'чч'wх6]ЁYИЛоQnYВ†O^C)юQ†фE*;Х ЄŒGЯgъЭыsќЃЫrёєрфЂ.ыNΘЦ`eпщФoйўh=‰lsZсŠ@х‹ЋЋЛ:ЗSЇz’ћІ. ЫIš& ‚„'‘j_NЁ oy*rWeAвCф|Щ |И&WЮŽOŽ/JХѓ“гЃшv0šї§ЗееџЯC4-ПϘBH`‚hwrz~yyлQ:Phє2ь_‘:фxšX:тˆ{М8<8Љkšх™ЊФуkУJ:­№„!ца…Т fшЩљХйљйбЋшf<tОџЛ-лЖŸƒІсЎFя\СGG-Iт1я­^b(;ЅеЂE zиq4Е{}tˆ|Ў:‘KЇ–uэЪ DšfЧ‰gгцХщ ђўёч/'‡7,bЧьі&ПOїwйБl̘2фˆ%ёёєј№рЌис9†WН~BGЬ,Mъt№Дт„†.пV У]UdUюВрџŽmИНиPфxcWЇ§““OЧAoE“o˜пЧhХЖœЈ?[@л7ФтхчГууЫЧ&ЫŠZ8HAыW“Z Р.aeЇŽЎŽNЮюuзMU`i™Fа­ §lOKД9^ЙЙОюa."Ј™ћЧJљёњњЁЩ ŠIі=јВоh5ыŒЄx_3J‡'чїЂщ$ОЦз9‘у$нюMЦЃ)эŒЉќ›ѓЫ‹ГЃƒƒУѓ ŒІѓуоя;mі/ƒж+в<я%‘j)ЗJmA`›Е:šfЇ“щt<žФTЎuПоЮЧОaЗЮЏЊœe=Oчn e8zИ\/W‹ОOЋhЊд~8=Bœ}::ОЌђ;>ч=Я|Лš§ЗƒN+а?]# iBЋ%ƒЫ+<' ƒЛ9-§OfЃив•‹œf&јXЗиB“ŠŠћ}GяK€4АчйfЛйlц™C5yрМЯcфЊЯзUNетJїпЧhтІ;IˆVUЖ-ащSЃRg+Sбзl ‚mЋjЇЋшС0ЁBcЖEѕт§yп2ф:Џ~v‹KhяеTYКи(Wы…/_ю ЅC—XУНЗlg§o†DЫ,d hQ|šјАeшŽ W+pчa0„šвeГ7Дe‘k—YЫtтщ"3uО…72XЬsШТСr‰]лГО-…iu[ѕzG6vъ№{Ч/‰cW{Є‰х"ќц„q†i>^mсщ<ђЃў45ДnG2z XQ)№–сdЋuЂkн–n†ГѕаDšкnч§8№,ЭpМ_n ъ6ZˆBќ{šќУщМMчцЊ*B'ІУёx<[­сgЬУJ&ЙЅuš’žŒ]гХ7б#™­wыHвѓэШQ% ИЖz~žbЯЄЛcZ8зиz а0ЬѕtЩUэюЎ† ѓеrɘігР&эL†аРuбGƒя™Yz‹Ї™oЪ-йp›БЃtY йuѕМѕbŸtБяЖІˆTСѓуюМ’МШbЪхЎЂкНљj5Ё$I1#ЈўddыRƒеўb:d@?]lŽЩГЊ/зБЮwxЭцo7Гб Ÿгztp›.DјafpЂъКPYœHFOgУШBРШ"г`Еh6ђtЅйЅ@^!GшŒHЋЩ|•:&вlFž% ЂfКщtН]/чУаЁЊ`›ŠћбїIпџf0&­/ЋК?˜/s Я‹чk‰Œц^Ÿц=пЕфƒЌГ}~^{)UœЅoпZyѓ`uлІk$РDžЖš-/­жЙ%o: |“нJ”еЙЊв‘УсіyшйRSt__Зг ’^т˜3dЅщdиЇО?тZБŽfйЎ!ЃJ’b’ф“љfнГФ‡;ЮТд{йРЗfЛ,[слzиRsђзЏOKЄpЧ’t?ŒЉЂe0ШѓЭ)‚уЧ.ЩМ}t­ žo‡Ё$Кй0qе/tOaфd§ВžєBп§‹я…ƒѕ,VвЃиіHŽ™І*;учЭ4ТПDџч0‚xКьЛ†лЧŽДkШ ЊКfєжЫAў[§=ƒwƒt:э…ё`:тОТШši%ГiьћћƒЏў­Cu§l2І}пfwFгbєxD—ЯШэ?лКџеш:‘ХrбGn9Чч‚iE“qфhY‹ih~˜ ЇѓahKдэGДœlјћKлМЧлTu=шЧŽN}fXгŽВавОчЕв?`Шv’о/lŽюyЄ•НПЕћwƒUм]}ђ/lЎЛkPcыЕLј? IГ}їŸ$ƒЇвуяVNѕ‡ еа”ПМЃпЧћxяу}Мїё>оЧћxяу}Мїё>оЧћxяу}Мїё>оЧћxяу}Мїё>оЧћxяуOUXюпU…™ЅГ џŒЂS]4#ѓŽЂ§џлШ™ћЧЮњпй ‡йлЋw[5FSEўПЏЅеЈ§ЫXўЯLС&ЋY–. е‹ЛЧ/t:чѓх}­ ЌЎVMЭfљўQИл+>VZŒf:pіЛWь_G‹•Tэ—;ђ)œ `YЙХrœ ъsqёxћюЊE wзz:ЕEфš•bёFпп–-Žч0˜=цАš“Ј{‚iRlUеvцЈК&ё\ЛVЊДdЕ|z_ Ѓ›КcYЎчxžчRƒRMZзыХлН›ы2ЂЋеьВнц^—џсќЕЮгНtyД"ЪŠ$Љ]lj;0ЫREІv_hŽ.nшФ™фи~†>]›тлн*ЯДkњУое—BБ\Џе…MxZљСgшъЌЈ(tw%ШГЈQ .}w"нБЋБѕхќќшш˜NQЊ~…qHПЅIфћžmш:эъон—›BЙZЁМOsвvu›џйk”:;щšNН№Ј'‰C—:kВ\КМП=ўЃЛv;†))šщКt'НыRtОUн{МКМyм%Ыj…—ЈЋ^y–њИюB„кYPc8›ю‘ƒQšЌђ-QМ?:ІўL–!ѓіbW—љvЃ^.юЕ9ё{€5В HзЎTU пељFсюсЁXч$ ‰j D`O‚4'йI [пšЛЈa’Q_пnэўžГн$ЯcК-_ю€зZМез ‘A:ŠЎ(ІFQ(7ЯPTъ\&‰vˆ<т…qрGЎиЎя•ZЈЅ§ёЈ"A \jхИ‡Э2ЕЎђA‚t™}Мх'Ю͘(ІкЉ>>4UsзѓГУ*d‘аЦаHvйY„UЄSќоpxЖж,ЕкœВгOКЬqhјŠˆ>шEЏŸ˜QH„nкйGA`IКZ(Q76ЯR%†1шО}њ{і|šТКэgЋYJзйџ†”џУгВfИУYюДќ%wлвN}Лљ(G p…r“'і“лx а‡@3ъцiњ)rsL"%Ъ‡)"ыХДШфШ<#B пKо_‰zгѕjaвЈ‚l:ёjтcЦšњo6šWjd9ЯLшВЧ‚3kV2ЇЎ!U uфJЧWvŠм(1%]ƒF ћ§<яїћƒС(ј‚6gxW“ИЎцy:”NCДМ’ёr;Я1%рЬ‡d3ДTQHўF"SћQг,GІ‹†ЯАН`+N‡PЎ"Ћ:цn• nі,P$Є‘ Фф  в‘ЅcшЭrcOзЉй"'ЛБ#rѕЂhйnмŸ­Зг Fb­%лНufRП+RDПeсZ№ƒE§х2F@T ISoъ^>Cк&_Ћ"@Є+€іqЂ фъЇОe@Бt˜#ўјNшBЧњxћШ6[М€ˆщpБнŒГп-TZК7кЄІ‘O№џ."M7€іЯњ“хfг’жЎД"дK’УДNl@нB„{Оor“e Яёв~тRыУvЂ|BХ †щЦБЇJЄ– zTМщРшоdЙ]OњpЕ#6E7šУhYоЅWјфЭFƒ5&}jШIMDg1uЃvа†Ъз9гЭІ“]GЖк 9iъЫєТ жњ)5у…ц%5 dU"BAэЈахыw-г Гѕj9єBл‘9=oWГщl6_ŽчЭЗйK–CН‚SdX1мŒžNFУСh”Zрз‚КящŽЫаЦ'4ЎТ!u1cd9фŸњЇ"{$ЁmHVJЭB =Ж0ge—DЎй”ћњѓх,БLІЃЙЩ 6/f‹хb…dш~уцTSJ-]M‘TУJчЫЩЮюfCфlPЮxжГФ.5УlЖК’уСМ@E`œGРИVю’ИКhв%НJƒ Mге9<лm”Њ’cE“хиЗ”ƒшX?mчдg|˜ xVѓmЭЮvFz!,ЄжеСh1Ÿ/&yв›N|Cd#œdІФ ’ШУjСё1Љй–L0ќн#аЮЃѕЎ“"­0DP-ЃSUA;ЎлЈеšP„uЩtЋ!X­`:бlЛArФЛIћљt9ŒщћпbЕю2žіЃџНїю+ЛЕљ5fоЬX‰AЄ(fВŠХЪ'чœSхдэїхgЁdпчїюяњŠjЉэ?„–н”š*тр`kэ аФ$$n7ŸрЅѕc/шN Чe3ЁбO4а д• `{рМ:‡xч(x4ощE•м4qy€$ђЕzU 5–­нQQ‚(pœjЋQ`Д$зЫы eH7Ÿ,c т№5•f\рЄ  нАТсb ‹f8u(Ає˜ЂВр„ ыV`0m0оЖ‘BdІ&бО8Ÿ‚'Š2GеeZЁзжUЎYoз R"ЮљrhDмВљvЛL •Q:˜с7Rо+Юa 'H‡ѓi7B(в(ЦЃхrшkВ™"]RœЮ|LНwc—F}ё"ђЬ№Іэ‡І— j07MIЅ—DџЭCЪБ“hZЖЏ3ЯКN3ѕ‚аЕœЮr<ЏйбxћИJ u˜vиnЖЫnќš.ёВэ…нљb 0ЇulВЯ)^/З5#NС‘БЧвUФc[cJЫ!j­qлЂЭ:I•˜†шІ€пв]є1Œ}ЖЭŠxАTЗ[ЄнЩjоё4aДПо,SbМ  3лzо%q:XmЖЋЎ‡a8щdГхqНЦЇi: Pбl1щ€ЊLƒQ­|ГюXŠd†Уž‡Х‡яи,ЛДЙ+6:бW%?pХZщžејвхљeЅЩ ѕЊbЦ§ƒщЙB•5<šеʘ h:z–ЅqжŸЏ“щrЛйЎщЃUЫЫf›eЄмЗОŸ" 'Нp’„!—{УЧэаCќ№ѓ„2 Iбщv7ОЭ›ž#ЈˆЮьђsьTŽ>п(Х3Ќ@Ѓызb` mйtТЮю; ƒ^D6шЬзлэvН^-ЛмУ†выEAУ_Б 4Gœs4#RыTаaЙљъi;‹ А Є6UFњЩК#`›йЈ!IЖыŠo+І#4jœƒь0ЧoпнЛyЈѕЛ&лжд‡v Д8ЭђђўxБZЬРвГi?Д№ђ`цењqГРН ЫыЬцУ4ёL§л•V№жђb0_Я@Њ4{ЫA’}ФчцPWЗ YдьА82Ÿ ћ=@xCкЂIћНх+6ЮŠ<ЯьњЇЃ’”бўQ9ўєљ–o”%Ђ‹E0O—u›э,Б ых|Й}|Є1RX@g2э%PЮЗO[2ГМ;š#jіЯАm?юЏщ'ŒцEYф№ЃГщ|>цЁOАШc#Y|­ђщкщІYб+ЛV’ƒNЏ“Й|ttrt~uzWmЉ&эЄChЏjБy|ІаleѓйAюy;Œ(‡]dcфO/JЂoUZKR„œѕb”…ЖЄLДyИ‚Ю›ybЊэJ:GcМкM Чz45 ЊŸŸ|ˆ‹ЌшєŠпЄ]pŸМp?Ÿ|>јpИRj:ш.B9•P ЈЎЖ‹Ь:шКУхгЫ#”6С1:CЧ г,§жm_1AД[­f}ќEGЂГœЈЫ? Й_сL+ЌVгžKLˆиWЏђьѕЩўёЩЉPфYŽхYa˜”ѕВ<КўАџJОЏTЉњ ј{ЖaЖЋ_ИqšѕЁєvЏ;!ЭђB\Jѓ<џfў‚w7ZЬЧ˜vQtгv?›ЌЗO›YdЩHi~ CЖŠШЎБ|ћърнћЗN'+v0: Š-dъЌv№ўУўСбuэюъОЮItЪЋjHLVБZuLEw|?юЎžПli–ЉхјyKН(ђoЇ~œ gГI'=šfO 1ЌŸЗ‹дбDЭLf‹ѕВя*b›•е]Ž‘%Жќё§ЛУf’ч RdaдAђ( vO9љpx№с”rNГЩ`Y(§-I‹›О#K ёpћќВщІ Q.ŒВ>)ќVЅ­(LІЃ.СO nwЖ}zzZTt`KЁыkmц™TЄЩLхєрSХ.hАY:ХёUŽЅшо~ќИVЎ6%В?ЭQ)е`К{*жК›Ящу)šVтƒз•Fпъдz”"Я"„ˆ ЖЁH†ХdѓќєИэ‘)vwНйЌ'Ј-‰8Ы^ЙъеXLћљN:еЩWѕ‘їbўтјєшsЙ!ъдЮK–"Щt=ёЁMПЗ~|$ЅЫ0ЖN“p7Єђ[ЙшУЋщg…Ž! М ™XНtоŽ]”нсfГY-ЧДџuњУб uMссVъ/ƒ,лЉšхЛВ”нН\Н>>ў\tƒ žМнќaЧqТў|5‹спV*N:УCzй!CЪЪY|ЋшAЧtj!ГЭZНЩШ†х$˜тq#ЯЂЭ;ˆ6œŒЧ€kнаKЗоb9Р<9­П‚ДІgI1œЬѓ§“ œ)*Д”eєњћ U‹Ž­ыћ[˜dF3ЙdŽayQ”dšљ–ёЗ*Н'9№-ФЃЭ№2еD(HS›ччЇE‚<•ЭУ^ImAyqвK=щВм[/—#ђFК‚Žп2Ф<ауt<]LЙУUЄг|2žЮ&“Щ`:[,Wыqфи~‰цqкlR eЅкlq’цD`ХпЎєEƒЎрР‰žkcѕ.Ÿ_^6Нž2ŸцT–їF„угQ?ѓ…гіb9›b?Li’wфєEт€шЬVЩѕqYд 4‘dl<У[Тыgi>^У;6#—ˆ’Lwa4УітЂ›јп>іNы qi:ŒЄj$шnхы—//г"щЬ–ЛМ‚Œœє@@ѓ!~ћ“М€ ‡ЉŸdIFА з)!шРІ3сь‚AЦžЦѓщdмЫAЗ#˜x9Rа9PZпеRzxv:rx…в Ы#ъЙ>{Ыb|Lž_№ЯfЈ3(PЛЃёtLлeЕkhdЕЗ\Њ: @ЖјА\oњєђќхЫЫѓуfЛьбЩˆƒ№ єCс!Iљц.žЬІ#Qјq'O|а(MГH;ƒЩxВˆЎяE7ЦЛСSрbј,мyK‰ ПV]№sh\є‡sЈE?ђ‚oпЏЄВ. Zw#-–А4ўђђђ yъYЁ ИFљнq‚ ЂћЕƒГp4 yJЇнXЎБ.ЂНt ‰Ю;•ЃЋ†f§б š:В€#уŽ6k OЉѓ^–ІСlCПнL‹а О}В!;aЃљd˜ПY?Т›_Оќілo_žŸž=С14M&ZэяЊbСЏп:cПAЏ7œ ;}П|rЦх§оАУCi фжЩё5O0(іmЊ‡{шЊnШ5ьfѓ„OоЎJД_žЖ›5Тgфzп^Ћwп’m?ШчЫЭЮ%~ћыoПџџђ {ЌuСЂZC3MЫlKZ:=)йнсpиŒ&фNъЧwoob Ю' УQ‡;пџј кєЖТI  ‚ОІfЋ€я/ѓ™ћщхЗ/_žW@la|ћ:м+Uš‚]oЕ…џ§Џџѓ’вp/ЯлЇЅШYX…:œRQ,@Snн~bвўp8‚Iчгё0ЋН{їі“эћ§СФЛ?ШИЋЧЗDmCi7%ќЫ2IгSRz Ÿ~z~ІwњZ?-‡" №"П]щ*/јSЖм=6є§ы_џњћп”~йАUT˜иІкiлBюi~оП6;У–ЂУbd]М}ћю нУФУёІюЅRѕюЊвbщіљ№mK”u9оЌс;•ЁњѓЫoP{=,т(BаzХ)yЋйlТ­;kМ1Pћэѓ—Џ*љэ ^ЂvоЄк@“*w]ILгеъёQIя‘ћ Ћpv№і§ћлdŠЅ‰˜HФлСyQRA^`"›жБf)ЭxЛZУ9скJxІ$6QЭ!†„зцFщxћ8ы#dѕ†3|ќфwxѕѓS~yЬлњ.ёаiЁAѕвэСЧВžOІгXjСŸПѓўЭe„TДхйO™VрŠЂЂkЊA•,.э+€[еК[Иє#2@П“ІY‰6_‚7љ^№šщЖ Г`Э§Х)Щu}:z-ŸреП!ŒlgЬс=]ИpЉОеrLЊО2љыуг[Б3ЯцH ьЧџяЭЛ7g6Рс$жюлE8FЩAѕ(ЙиЪД|§ЄpўЃГч d>ШЉjљлuолЃ№›Ц,t‹Ž7‚Ц‹'hќМz›=TАˆЈ†ач‘7=иКt|pmu‡у~bДЮп§х/oоьз‹йd„Ь2ŒйЛВ`*;šГ+ћ„‹ ГиFЃ’P”FЦІKoљЛПx|y\ŽвШ{•вzс‘Aеl\О g[Zи/еыXA и§ЫN*ЦєLK~8=.ЫІ%U/?ьН§ЫлЗлЩСЃ‹зЗ<е­44Р!М(|W{0fФѓ7€ЅейTЫУѕгѓКƒ”ќЅїЈ–5ЉЄ Р‹ђ^Џ?йўўћЫ ”~|к‡V?VЁ­69нєуРЕ”кйсщеЭХё‡їяŽо!~М=*ёšу›ЬэhаўМa)†Ћ!ФЛ@FѓђоЏз0ѕf=Œ<ЂX&.$9ьEЏs=оƒƒP!Мa‚Ed”!ІлпC"ЇЄјлѓизdYеЌыЗ AБТ4rLЅўiџр№№УЛЗіпО}ѓю§ћ'ч7ЅыѓєF…†„HІКќ$>ДМ18ьМš&€’?По№Ё-ъU7 _Y‚ХXрД1‚.Ь?{м$Х—пŸћRщќќžГMYйс=ŠЈХлƒїћяпП}ћЙх )§nџ§ўбс JмHfДmрOБvWzhШљlЙK‡ыoЭВvW||ЧqЃўЄјЏ>Ж•Аh t-ІŠП№:X>Ђ”F$}ъI•RSѓvГД=мfшЃwPљЭлwoоО%епгoпоKъЎі†ъ eЉZ99Нљ|ИxИџ~ѓ—ПвHця>ьЊ‰ВЊЈДнуСgНˆ^qлХjЛ^.zŽЎŠлЌжxHBМ8|е1бWБ|šQМJd.№,MЗуХгzвяЇ“САŸ&ЩЎzŸ8EЗ)Ећ'Gяїaj(§юршVфRћрВ*PYОnьшl‘!‹;CаƒХџtбYрлTїтФ`ѓлЏП‚І ЦФЉЪЎzЋeИщъq’'€“с€ќS*wщ>Бƒ?п?ј№qунЛїGЇWЗ7ЇћvKrџєЂ*ЊДfкіЎ‚5JЩпz`ЌбxО^АДЊHВР2’iњiЛЏ;Яџ›иЊЉ$NЈзKЂчЖ‹мsƒl4%†R$t €˜ЄяZКЁŠЅЃƒяо}ўt№ўфЎZ/зjWŸїп“жG' NM ›jPiЧ+I:НЂKдfИ\ТвXˆ_Ё Јm{іїшL#аIxЌ)5+МфЫMп‡WF§1( ˜6нpђБmSкW‡Ёп6ЙћЯWM­}R–Ÿїї?МEг\Д‘ŒшМол]^Ѕ;QE‘ƒA7ыL—=Я9IннзЂгря+HцЉlFT‘Nч)"Вхˆ€˜ЪgJ)з(_ŸŸ|<:‚ЁпѓY6e1ЇЙ<ЙИ9пCrџ’QшЈ”ЎPЬq\?щEП_Єiw6Ilo ;T‚ c}o$‡№crЕ#šЎ7ыОgjЂюЅƒЩ0 vW\[nоŸžžŸ_žŸРопEгa::'›B“б­ж1œќhџџ§Nй]дsКALA$ь`UїSРФўМч;ZЋ%шЛ‹Єtaт;u&cs{7ŸяЧƒЭу,s,Йвжн|8ШBк;€щЎN?_•ЋVЃz§щубћЃz2‰Ѕ „bмчпО9Ињќўџўї;PJзщ€ч@^Тb2uл0Ѓщ,ѓlЉбV-‚щBО_i™TЮЦ›Їe/p цтІЅ9т ььB§ітЊ\oэЎC–ЯŽ.ЋЅГOUo0єю/Kro9_dЅwяомГеУџы’Ї’i:щЅћq ћh2HiЯю-GБc FГ\ZљпSљBхЗДCИ$žЋUNŽЯjAeWWЈЭDЕъЧЗkїхыЃїз\Г|~Z6Rіdџc-эчAѓ#”~ћБк>ћpVayž.Y€BXФˆА Тўб&qс‹<]ќџУJЗa’tМоЎЧ Тxіцн1н D†9^9†—uК4зИ:9ЛЛКЙжRљ`џрFQић“ћя‘з?•.O>_–+•›ЋлЛзl‰рŠ;ИЅА‚n8нљ4GИo5@#Р/ў€K“АXэљ t(оХы“У“{ІYЅ^# 'JФ(S*ЗuОйfЮ?_С‡?ьŸ\]œ}њєљќС№ьюђІЦђ^MхцњіЎХеєа_Л­ˆš•NУШБЄzCYЗўшЭUгŠХfй~gЧЧGgхћђ§}Ѕжls’NhЗьљC—Њ—ˆrћ‡H*я?~О…ІЬУЭХ]“Ѓ#IЊеR„ЦЭзММКНКЙОК<;ОhЊ†?XбZ4љjS5џxЫ#Э Š9‡ЁВїчŸNŽ>ž}ОkpЂFQ;ЂK .Q;п6Сg$ІY>yp№іЭћ7-ИTˆЇТЗwkŒ6iš­вљхХЇУУЯ—ˆ7w’nЄѓy/АmуЧ\9SПЛ…ЖЁˆlуютќѓЩбё‡W-‰:M˜NвЩ<ТџpEЯгw:*Ь5Ьўћƒ;Юпш e›Л}ƒ}AагъчŸ>|ќpTЎŸœЖ ˜z1IЮL/Уѕ:ѓ!QКЪ?œŸCя§ƒ8г0MЏшEІЁHМ(ыЖk*”Ћ5љсРњрŒЃЪ|Ъжр[šb+‹У­йЋуУƒЃЃOweсc +/ „тGєњ ђ)5ь:хђёёщЇї›tТmР=:=ЯаMfXY3ЉŽЯё,ƒЙ<к?:Оё #кЕу‹Д‹Є нж€ІіN>}ќќщу­hN1H˜?Ђ“ƒф;nA@ŽE[Ъu€7вФŠЂу|ЋгqhO_чZЂBѕpЊ$UN+P.ŽtRк”9^лqћ<Уууљ…Ъ-qї§ƒЃ“Ѓ§ѓЖЌ›ўpš!и§ пŽяЅ“qtФ4ЅђЩбс‡e ZІулŽ‹зn™b LJkFъ:{vpptЩ›VKЫ€AbKguьЈ—štЏУ4иFљьфˆмшУўEз 3б‘эщ™A5ƒЩ €­ЉC\:ЛИ8;=ЏДйХэє"7Œ]ƒПoЫš*KŠюgŽ)_QнС­lx‰)KКЉ M@˜$IЃаPщь HЋVЙН:йљpx^ч`џ>%ƒ?ˆ:О ђV0к‰ йX:WЊАп*]^зY–з§ЮЈŸїAІ…ЪC GвŒ я›кѕ‡ЇgЗœсЧ–ТЋКиЈ+V0œŒ—уЎВPбGЛDнБ.ї>^еYХВмiпљƒЩ№oтвH 5Т>з’h–Џ^(ёfи›-ЦгБЏk2W%0eиХ$Дє›Ѓ[FPt'в•Žg9еNІрёTКKХ™Кв8ћ|qwuzњљѓMƒзlг‹ь`в њŽаЖŒЅp‚A9л”[хrC2ус|1ŸЮ ЯP5сЎ&N6ъИ–QЛщ  щХ–^Йхv%Є§еfНYТн•\Љ<јљЊts[­=sэbџЙџCд]вдаVлbфžуU;›.ѓљjкёХлШlЩ0wБ0™рZа™ŒBЫhЖ‘\‚|ИX­7›е$ \ЫдйZ­еlдmРѓ<ЅзœuўїZя:@б–ŒиjHДsчQћMsтсrŘЭц‹iЧ3UVенСРбWМmyйd1€УЁœИ7гyђzЕФˆ":Ы>ѕ В\Яж%–‘iqZ?Ш9ОŠ ЙSКvзћ к—p§lМ\ЎцЃAМ†кV oд7uEjнѓ–сГUпГФšj‡§Хr˜ХIwЖкЬ{iD…МА+>$Ч“л Ћѓ'єкEh–.Ъ<ѕНш щДmКZNРу(ŸN"Ck К?Л†Ў UЮ4нdЖ{І\UmППYuAБ§lДоЮzБдDTїOЗŸйІKVХfЙT—АfŠнAж|вЫштЌЇ‰Љ58гыЭsЪ‚hXn6н,Щ=ВѕКp Эђ“бf3Э§нљ1њ]$чV“VЭ ъƒ4нJ'‹х|”эŠ LUѓњГ‘ЗmКщbžћ№YЩpЈ~w=‹ 6š= M-/юЯW“N–ї]*jЅэ@*ТKN&ЩБUЊm€sn1[.њ6ВŠ7˜g–СЖu'šЌ'ЄЕ"c‰…АѕoŸ7ќюу,ДUQ2G& *T™іЉ5HХ‘Ћiq/љ9КxnЧёЉ‰X:˜ЭћОША­:Ћ“9hBЛm8ёtЛъŽЇ4xеДэxОЮ=SdљHl^цyКСМ}м`гБlšЅIР7Œјл ^-2TЦLc„€&0СQЛXM[k‰Ж›ЮЖрfŽЋ\Оi*К=xФ7ЊЂŒ_VРГЅJУ№ѓ%”^-†EQt‹$q5Eџ™|щр(ЮћЃiЯsиŠИЛƒу%ГGxlЃЁƒхЌžЖcр$ђы–bzЃЇE SЋСш™ЪС@ИЋЊ7›ѕz=ŸŒƒn‘*5^ћЙ]‡5Њђˆѓ^X цDYВYчVыМщИёфёi3mWПЛтMлЭ–OЋ"Абэ=эž†ЊUщFЪr>ЧRž>vCŽ3 cљORу%™П?ПиЬ]a”ћiŽ—ѕ†Ѓ 4Kѕъ9уxеѓу №ТVЊHоn<к>-;-Bщч—чyцZšЄxQFЧ8=ЊQшЉ*8a№.‹џсz ЉIM49•jlM1щnѓl<[=o2ЃyЭкAo§ќИшаќІцКQoўјДъњЖЂју——Їе v-UВу4ћZ#йщфБк2Јvё‡f№П‹J•–ІJ­Ѕk,/*Ња–-'ъOfгхцiгu„о {›gкѓГ,ЁaЕ —‹"ДT3žПvЇƒиU›еЏГйxс_>џюџЭКЧ3CюГhсїЛФЮџЅ#”ўЉ№№8Ё­а, v&5]?яб­§п*а§я"[дЄ/Ѓ.n;лŠЎчtNj§+FЧ}Г&нъ‰џžЋu/ˆ"jkљЏеъПејЧZ@ЭЇsТXї:QMуп,Ь§’_ђK~Щ/љ%Пф—ќ’_ђK~Щ/љ%Пф—ќ’_ђK~Щ/љ%Пф—ќ’_ђK~Щ/љ%Пф—ќ’_ђ'Š iЪПuuеЮмЕќћѓЏ|Ÿ№–ч№{R”eдzгљOZ{о˜.џ“Dв,Vіи0‹l;J\эз:‹UЖ§ПуЉЫиkЧІўxс§ДгЭŒНŠXЊ•e!‹ЬџњЯžеЊWЫџё[йё§0јƒл€№ЖцнA/wї.юд-"Cф…џuwEnеjЅПџŽSmЯOВ<ѕџuЎo'yЇ?žSCPцтЎкат<їЖб`„П[›Љ?мпбўН6нwP ЫуЂ—џЋм\№ГоhLsŠ'нФjм\”ѕ4 ЁQ.зкмп‚_ЃњP)‘Ѕл 'ЫЂ(kvхнмџзT$ЋAв ;EЗ? ŠФf./•0ђTЖZК{ЈЗ˜ЏІnеkеJe<У1™Z‘uЫв@cўљЇџ‘§Є;ъЇЎ$y4ьЄ{здKjУЖЕz‹леГ гj6ahСPЙZљОжтEеv”IaВрD4ѓ)2йЫКƒс ъе›ЖЂ­fН^Ћ5ъmВe[9†eк,Ч‹эFэсўЖTiˆ/ѕ:ЋšђхV2§8ЩпV8йM шльн=C-@ЋU(нl@k†mЗѕFЃйjAяv ў}W~Ј7ъѕ:c†qјsњ§Та,iEеMКТђFˆ(™bН\oГLЕ\Дšј&ЎN­DЋЕVЛХpЧ4*х[ШеMЕ%љYžЧfUu›у™VЛЭŠ’Шq­j]ёЃ80DІVm4ыїwЅ›лћF‹ƒgTЮЯЏnяБ,yžи&ХПыЫГWѕ†ЄE‘јцŸБšѕ*ЄжhРВэњm™ХTЎQi‰г(_ž]VjmЁUЋœб#РE5„ьRЙtsQj5јW–Ц‘џч–V7jаK5t•Ћ–Ъ-Yтл‡rMPuЅ]>џTЊ5љvЉќщр№ущEЉr_yРЏђѕеХuЉ|_Љ”ъЂISХтаљ—c“uУŽ№]KхеfЛљpsuз@бUО|tбh>м_^Ÿ•acYFФh5ѕъ§ѕѕэ]Ѕ|}~з`5'LГаЗД?)б№ЛЩ‹aœ&4ёСдax‘AўfMNTфЋЅ‡Ыѓ‹ЋЛІf›Іы:.ОKтKъUXќцќђцŽбm?~њ“Д– q”$YJНрiцИЊ‚nšnЈ№флRЋєёЂtіљцЊЊzЎсЎЁМ.K!Z?Tn>_\пдYйАl7pё4?]eFwƒюрKњдŸеа5хk@КЎ6>Н;-}ўt{ЭИQгXI„ЧtSскЋwgЇз•ZK зqt™чі~ъ‚lђtu%‰“4KЃаГ ƒЂЕJ-„ПЮНёCуішгсёХЩЇЛВDОЉkЊNc|‡ЊщКЬеoЯ>ŸпTЌ Y4PGљЂв<1ŽуП’РqЉ›%љХЎЃЙk:ИЬћ№щшрЄDhDl0:Р*ЭK6LќЃ)bысіъќтК\‡­%^Јwіn9§_ ѕК‚C‡ОП 6u8ЖMkз3›nсРк4R+P*gЧчUYg48NdEd9I’4›FОѓˆлѕк§УУb}НЩ ЂР§<­ yžO:Ќ]зnђgъG ћюfNа艈ZLž ВЅўŸЌKУn ƒFЋыКЎ№ьЎ59ђќнэMЙСВмO\‹Ќn˜ зІ*Сv2єсЭюЮфЛ‰ЉAœDДv\ќ2 цъ^3\,з8№2Тапzзњ[ЂЩnrћўът‰Е§пџьяби SXB@‚Є*Šn;_gY4ДЦёМобuUБ›зbR%ZЗVAm"кˆЭв— х‹J›ŽЁaŠ&5E#Qљњ}” €žMшPТЂ.Їdbšœбм3 уАєdаMHiЫ6д][;ўь…0Шs4кNц€џN—vЭ[їWчUA‘9рQф<™cDјJ….loъЬнЇ“ЋђнѕнCf(QђУkBwdA˜Ъ­р†љ`2іВаЅ `?"Ч0ђюQLLЄHЂР2МэG=šMe)LљцЎЪђmrjЊˆ‚„зMч$žјДLціъъКЬ2Œ1Н8єќІвЉј#цсЊ gыЇгQ7CждБъЛhpbЭД0vГжйZU№ƒД?fˆб–мИЛ}hдгРR•cTЯїр#Xš– &ЃЪЖЏ‰X ЩˆКсz†$"kЧЖІ;ox4JŸяuђъўx<ь ЂШ26 *Рлњ:›ЮnP:Ђ˜,7KЌя%§щ|T€лrѕЊФб  гDњV( кВ ЪјVx‰+kЊ–8.ŠќаУлd7Aвq|[lЗ›їWŸ.YгЇёэcjbz9@W„`“РўўеЈл€;ђ ђ'е›šєЭЇу>,cДёю‰Єъš†gCbЗDŽч9 Хђо‹hXІй–3МyюО.4›ˆvдоVoUjЭfѕЎд9wМt4„ фЖGйІлјпяжx­ё`иЭБ|(ЅёІv‡уЩlм‡-„Л ЃаМp€А-лZЂiЏ‰E AїАц\Бeg4аiЕ-йЁ†Ў ІШЂJsЅM;Я:Ў ,ТWFpёN ћН:KGбp6ѕG=ВNб™P36W­мЕ%ъKО#.*›LЖЄљЪ‘Fcщ#%]šачъ‚ІвШЪЈЖз7єяyQ1Є@U^єЧдCЛ“Ф‘їн9]Г7™ЌІƒN‘€Ъ  Rag:ЦžеКІ~ЮЊŠїЁГmЮЄюЌаяФі‹^†\-KВѕњнnОюЦЖ$ˆ–яэ6ЂQ}ъ[ —ѓl7с–ю Wѓ~–„aф~7ЖІЯі‹i'IЈ’ЬiЛёЈAw2)|WК-е[Ќ€'1%–SмЏ( ЉЊєК) в~?@ŒШСAm-е§иQ$ј•‚™іFѓхŠF„щФ4УЄПšd5ŒўўгQVчvІг@ЁOeJКŽцC$ѓFљЁVgUр&pD0’ЫIaИIX zНnЇгэѕ]zѕnцЎхE–$л‘ЏгЈU8[XŒч4“й5РЯЩіA=№iЫЪјю-‘9щdƒ&X`5Љ@Iд-v9/<[iм—яМ$РиЄrЛаЄн>uJЖ?эvCЪл6`’Ž њЛ‘k€к Э ;“ХvƒчЇ): 'hўpнq |Mn} 0SУpт1MЖЄqЎ п–ˆ ŠV4]сGйrНt{_Ѓѕ Œm["ШcSPKК=Ќ-•2cмЫ\‘•гŽW‘м 4TM‘UЎ*ЛA>]m—§иЃЉ+|1ТЩ*ЕUIвб™яйў%^…ехЃХ"З5šЋђЂ"Ж+-Уэ,#ЙzsW“M6ЕtђИAш9Vи+@o<‡žІш…šH3ўх žm˜hFЌГ4sЙ^cкВ˜ЊшІЫyhJ"žеA}Нжо2EЏЂ;Ymh'VЎѕѓ•ŠbУќ# (RГ6ЋQ&geЭ т$4eеЩК>ЕЇ&Zцњ§nZB›Гќи‹GdEеаYЦ ’ЩzГžаšulŽЗЂСv‚ŒэFмxЦЋЃђS˜nЗз.ж›ibб^mщьXSg1ыХЎc8‹Мц[BНЉYЖК–ЈјIЉ‚LУ%рЉJœХ9:ЏЏm[cGW5ЧыЎЖ›.јšюgЫЇYЇtCjlНкЉkтЂгыї{Д^Žs„W‡z’›ZГЁКљ|6І#Q2 RQ-dmQх4А^Gb8ŽeXЎ]цcšЯР mA…ŽШЩDmИZЏЃЅXсšѓƒШYмїzЅM†юwsЄ“сr͘t#ђ@%KЦRŒ'Г~xФ%™;*Д“Ї‹ŒjDА& СŸ@Щ4bЫЃ.кL­Љ…H!К ю8Н!уя$ѓѕz9рСЊ“Ь7ЋQžuЧЕ^п €‹fŒ#ЅbiЇУеj>vЩєE`œhУiцгfЏFЌ˜ТƒAiy+L\dd$nЂhdYАqйrѓ•у† d4л‘RПqћ‹е,‡G75ЏX=nжѓЩd6C.OmкІ•одpВл СSl]wђйj>[Ь'уЩd”8–,щP:ЄЁH\ЃжBVє,Я“yAЖђсЛXСE `Eh+'Dyр9мј"(жЖMЙевАЄiˆЁЪ‰№ŽэvГ^-fѓх|4ХЛIŠЏQZЁaОуЩА;:ˆ ?˜ЭgЫхl</К")”žјšŒџЄ‚РV9ДжVји9Hѓv QœчE˜э–G7еж=чЋm^•ˆЩbГТZўpбsM^u§|чЃ>hуtК^ „Тр5щJЧё|в‹hsCГЫљАз-FžЅz4œЦ4я ˜Ž%PEЉqрЕ–x,Ы.эщ:t8GОJгSу$ЖЄ– t7М JtžЁЛУUз“[Шщƒ5тп0 ЃД3˜­З›х(BяЬKЃQзНйJ#9)Њ?XЎV‹^гId7Dуй H!4 =€’ ?ё/Тыf$ў<зЁ);јQ нЅШm6˜v­ICцhF"Рјpйѕ„–ю„ЃЭџЯо›hЗ‘$й‚њ™s^eJI‰їФŽ@ьћО/@`п’Ъь3?з žžž7нo$Ѕ”UgŽМВ2)‰-<ЬЏныnnЖ^/r/ю—›—чеЄПЉ{7Eм›Э‡‰ЅЋ‚š_.ГЎo:љ8ЗA" 88АЅ›јФЄD ™оЎw№Ѓ #HрХЭš‚0iYК‰wЙЖњpЏЙК†lЅQoэbЛДU•ЯР‘ЄЏЗмЌцБw˜iLѕДŒƒoёj Ф,ЯЇ]€BИ И˜ЯKOгМВRwˆq7‹#r[:Œ!aХ ЃСЃ ]хщЁbфhCПуе;ХгЬРdmF&*E;5§ўpО\NCV П‡ 6 tUЗ‚|Во.ЧЛnїпдZNЕЈЬb‹#˜ЎЦ‘*бh@„Бд’nКдЫNVDЌЈ3Uv,x:wy\Dž“ЄZгr ЯqФ‡ІaЊX†ŒdBмFНб7ЁЮr‹qlУвrЙоL|CгLќрЭz’GОяЛпT%4ШK†№уF!€ЈfЙœe`hv6e˜bPВЂZДGЇђеЖa!ЬЋэЛtю?мГ2є@§ьVwБЪlхі^AeлАб‡^СВƒЯ–+|5ЪBъЯЕzž"–ˆfрQјЦo‹dЖISНe=яzК\v-U1Вщ8wЈ3-fЎщЇБgЈ\…3-УUпQссјјУЩc‹šgNyOГ *ЗВяkѕЖъИдЮ~НСXbЬg‹ѕj2шZЖ„ж њ‹9dЈѓ ћП"5г5ЌА;]ŒŠЬXшˆFВкŽ|Uж§~щщВЄлa‚і]€ƒиhЪ`ХарО)T/ЮяЎOO.Ўю//ЮP.ЎхБWŒk -.ž–“Ь]=oўP\ЫХrН}оnЧ`лŠѓABЈпв * Vl[aɘvcв}tРYЎŸч1ѕLЁdd|t9NfГйt•ЂtjmУе8дЄёTeeўсєјфќšЕ&ЋŠeTыЖбbЌ№b0•‡ыэzГ]Œњ§Щj§Мнlзk2ZЖУСrQtPѓ еfХ4ЁТЈ˜.АймэЧФ‹эvU MV ѕ;\Ў–гФv™Њаl*ŽІИbуЉТƒ"zЬщћНU;ідіуугSS•*mЁЮ@yљy‘ІIœ”“ѕѓѓѓrTЄ§Хцy ЛŸAЇiуЌœяŠ‚Cш§Жž‘€z,зS0RPЭАУсs1А%pa1ŒzЕXŒrDDhHЁйв-еЎžW­$MВTЛ;м?ы„IЙГƒуOїѓгЇ#tЮAЧzN”—€уIF‹pГ\ПММN#ƒшtŽЅdЋš P§кЙЖтœ"рf3я‡6э#ъˆR“ЭzН2ЯQО€WыљXЅƒŒaц%Ё]a™JћќLЪRАк"RюЯY7/В$ ž/?ю\5;‚a™д=‘6нVУ%lˆаЕ}}y‡†ЭVNћ‘giNd_ўkЇйpѓљѓЫzвЅо€‚‚јŒ–ыѕfU˜rd!&t55ЈЕыЎй`›ž.>}М8Йs МЈnћBЫІFВIš ŽоПџpпaXESшњ<›vЏtё }ђŠŒF †LHЛПl8_ŒфOŸ:xI§ЩtN3ё'У^ЏvЮ†Ѓй†Œ^іР7DžэД pQГГQсЦ_mєU[P)5Ђ]kэvвIСњ“šъё`4‡ђ"`ЙЩ`2Ÿ/&дЎv"@ќOzIУ`4Ђy’т%q9_,њЕ’юСшхїщLŒ9›€šЎˆ…€'ьZQ›РXmЗі“с8Б“Џ6њN@мRЎУIЖK'{ŽiІЋззЯЏлх|ЕКXёдLг‚™Œ‡н4дoЏуе|> ŠЧp‹Ž ЇEŽ;[9g'5ХыТ7fxЖШ5(Мhf>[Џ@kž =Цщ˜нѕvЇ№*НЏŸi•zN‚§SтрЖ›DA6{…{МlСAІЉЎš€oЫAиЪz=Р›Эœ7˜шQGK0Mi%цФшzEo˜/ЛЕOW,ТШx:ї|s—жшug‹ЭП[Н*=x‡EQіЁЧА@МЏF7oŸR|<Рl/з‹ЩxёђђќŠPћќВJl 14СƒИђќ8єMцђА s&ЃF|Єq ъPAE9šLцcіќМЂGфl/Ж лЦ4явS„њˆЗфеУnЏєnЖ//лѕ0№ОA%:a”t{ˆФ~мЌ_^џјќќђљќМрљ@CEpwlлѓCWi^эџуО„Эƒ2ЫЫВ,ђд‡ШЄxH†—УцзМ9Н`(;Pъ|y`O6ŸlI(nЗДd СV[ќЌ?>џё‚…IщЌ_m4хНрEЪrДz§уЯ?џќуѕ?>ПќљКнl^&-Я0ЉoeёЁ+5Џ>~8apŽў [”ƒ>ЂИXiYYЗ`їш'уYк8:Мць]эЎ-<P‰ѓVЫХjН3ўї3›__7ЫIИюззНчMъЧзџ\уЉџэџј72ћѕѕЯ?^р|У'oзЕ ’dюfџр)}рXЗW8ЗGэДьЛ]Ф‘Щ$чOЯ*’Ѕ t М(]\qŠЁWаЙ_цfуТ7ЫqxСзoŒUXеtlЏчzљќчП§њќ'8яцyк`(“Эt!уtj{oiэѓН3s4 Уёp8шuSўУлЗ<ЃWtћУ~++*З-A3hџAw(с‰Ш‹™ЏWА‹|ЕysТLПЌч“2Т џj›п›єН'АўУёМbrЯщ6ф%uXЇДeгВ- тШъxƒјВйЬњ1а9Lzу^яv5ючДѕњѕW+•–юxНэvZfQHЧє ƒз?^КЦЬуQњПcэъБ’ж-Dѕљ|кГо=%№рнxT–}O-@œ%D>eSтИjjukFMМзѓ.a7мЭŠё:†і\3п2Яœhёh9L)GsЇžƒ|Žе gйnвzБSE?<Šќ$ї5ЁіаR’ёўБЧGя.,ј Рn:ьїSЙ-tOC‡Pwx‡n˜ЖП^aЂW§ав%ˆh11,_^Ÿ№щo7МD[Ўйh˜d/м36Ÿw‘|ЛJt€\ƒв#[еА<БѕX3Jи<њЭѓЧіjХ|2šЮ1е‰Ц‰*ќAЁF№Њiщ$ЧI;ФI–ыyюњЌ•Х[ТEЖЃФїО%ŸIAВ~7ФR#нlQ zo,z}йl^ŸЧ™GwЖхЇj­у$.(aЅЁЅ§2ЗЇGŽ?ОПїБSLБ4ЧЃ\e%­QZBЁiА]•‘’ХўМ\ŒBЫP$XЭгnЇу#ІmyСЗ$МInфGiћОЃSлxХъ3С?юgPT0иЌЫїŸ.ЎZAтЈS{jK2_Йјt№юрУолwя>6=ФУ^d№`šaтƒzZО.ЋКэЂwФ ŽБYіМIІНXУђAж п`3нћ ‚R8,ВЭѕ=Чѓs’$КА"_&[ЏЖ9HУћjЃ)р!-•o]Ÿ]]]œ~иџ§їЗПџіляяіŽюe'~$3L ЃŽ8Јr­ŽЂъхr Ал,!КLU‘e‘ &њg8~6шХпvОѕх2НKЙ№ŠIyg>јVќ ЃМ^^7w§щЂ&яŒўeYКЬ]эьПџ§эЛЗя~ћ}џpя§СžуЖ%ЋvƒџИ–E.TNŽoфАЛ- M х<5U‘8AІ< ЈR:~Х‚њцvоŠЁЩ’(Њ6хC.†йh‹р6Ж‡к.ЛІ(XK[\ф)˜!•Ло{{ЧDП‡oœŸМЗПЗї~џМfDљь”ЇиуяЯЎи|oІ3­еrЕ„б’ бm(јmбІMyпДП ŽgN6)љ˜RЂ§АЗЭЃБXј&EDЛРл/ЗttMЊŸН}+пўілоЛќvxrќў-yіоyG‚l#jhк5YKЦsђ М%фmсшн†D…В<К3у;поь]”)`# DnааxО8… fZ-f%˜t@wіvw‹`UчцшноћНїo'‡~ЛЗПїі-ЭќоIUTvCž9”.ФНс ?›Тъе|бsˆ‘Htc[Ѓ,b‹№ъxщПžЂ­эњ4vќз0‚щѓfкы '#ќ2—Dt ’Bлюšњ№ёу;˜z€йн;јxєс=lо{ џpQTY…ГBaPжiЯ˜LF€q„ЃEЯжi[o==АЛьM—.|ѓD xT,E?„s`§ШРйdБgARŽЧ`6PYt&яя UИи;уиїnџшфъсўсъш№€ {x|в”шXšЮrАD‚ "™ѕћнўx4O]KJsцУU6!ё3эящ•‡'Є шJˆЩж$з-жѓЬ1§b4AŒ”tEƒ0tˆRћ€5wіpyјюу}ƒiмжкзG{ф)я?^ГРD)}ЯЇ~уqoPф§AйыOf…Ѕ`5›е‡‹[б љrОн90DгСпtvїѕјЇ–уХГMпEЈ‰IгєЪ^aЦШф/аШ\"ю]HFћђМ)kѕї’PџДG+ёнћї‡ДWЉсW„ЁAœї{YwаЯг|8+QлѕZэёўц^ {ЖљЭpЗўЊM ,uкœщ‡УЭ<Бщ€Ћ7єћE“vаЋ*†їG‡япН§ ”ЅЫ‹КљјіR1ZЇЧ—ЗgРННcZŒt-ЭЅK&№й0Ю‹МW–ДП:'ŽСUnяяљн]*ѓ;“ѓdqZъ0 Ћй^а[­ћО-vt7 !NHЏ{ЋqѕЧЛлыгOGЧЇіо§~эL§Ш4™ЋКi№ŒhYƒЗoїіOWЛЫt KЎŸ‘ ь–х—гžkЋ­ћЫ›ЇjЅ|HыЛгьoзлЂЩ‹ѕ$БMцьЁ?мytkвSЗ—7З7gWЧ{ћяппъ§љ8Ж„f,Fфu пСЧƒwЧ5 "€іK)#еЕЈ^ХpXИˆкбxœzЖєxvSЉЕьПкШM<ђУю|3/\SЋžд;є(А„#TnЎAйц§ѕэбя‡'GŸЎ˜`u.N/Њжp:.ФOoпО=Н=}їП7xврЛ›‹”RЃЩ(З5Eu{ГQьXЬељ##ю*CќЕ{Т-л sѓэКX&љщЊЎGE‡QьыlхБж–mЯж%цсђцрG7wї7WЭКh|Л‰е>…ЯМЛjЕ/џЗпo Ы0‰Bm&хЃI?4QжC žkiѕѓыц.бў/N4ыz~ВЫЮУ 4jя;Мjшq†ž…ѕоdvy›b пx=ŠКЭ”УWjoўrMЌHbЙшyžѕлгЃуЋлЋГг‹ы УЕQ'єњq'ДЊІpzГzuДzКxrSeXЖEe5Р;LкSdЎжRЄЇгыЪрєьУћГЅeЏЦ˜jѓ‡м–у /ЬІљюјущйбЧOЧ>œ?uш Иnьj9Da…q‘ƒЕkр†эZѕъг‡wo>\T!UE:3–іnwGeіършцўњhџМrЖ\гtЇЗX”Ёј#jP šGЃYjbуёіќг ЦЧУƒkVІГ\*Њ”ЅX“&хЧfщЎ№"і|њpИЗоP(z[ЎMw}B-SeЎ/+їGяo›WGюd]†Ы!ф­ё#ZmjŒž„†ЪГ|Їyr|~‚@qЇ~йuqТЌэŠ0аэ‘ыЪ€XтЎO?}<ЊI е0 w—ыDЧVј,1 Бr}|t~ўщшъњгбЧ FSэ|:+<ЫјBСCпЂNUсю№#ћwcКfB_]s 0‘hlЫА}KQ/ONYUЕCj.‹’nшv\$žэ˜˜ъЇЫу“уcМЕУ“OЧwМbхlHiљ? jЈ^0tЇн€jl]мпџ§нŒiЦЋ4нFгѕu‘—hПK7,ѕть§oяŽ™`wјs‰W0йVдMl’ІXЛЛ:ћtэЛџс№№ф‘еЬpоєнLщ?иPЃн[&эzwt€ЩЙdѕн/5;/унЦœиiЦuЭЅŒЧ‡ѓНМ;М5+4e…ф!+аЮД›ѕ[леan.>|8€BћpQ#иžmўЇЖ=ŸђhWWзeюaэђќЂBЉ—pk'vЃ4q4цЉCўЃЈfZћrяя>мvŒа’щNЂвMŽгb4Œ-Ъ1-ЕгlTЎOO/Ž~OoZ:и^7Ф2§FcУЂЛцNpw*–.НЕъ-ЁDuŠёкЫV™ћG*д!Ћzœ[ўnџєъђКeDЖ rЇЖяг)gгљ00‚И5зЌ›ЭГ” .0ыcЮUБбTuЪРœЇЂхЄcJ{Œ—›E?єMЖM7HшО?нэ=шПј3jэАрЂФьL+€єяyw0гЎљh<_ф0šгЬd> [цмSU1LЗ\-bKЋё–“/6ѓ~Іƒ9$v А Чc"ZaоO+ ФšАліжM/Ѕ3!X<.Г(Š’|М,ЉФ&w2ш*WЛЁи–з[ЌJзшАКЯ_f™‚UL7ѓЎOniЗHAEЈЦ'3ќOБ[ŠАиT…Яігб|:_ w™Ъ€/ЏЛш;КШ(–?X ЊНХB КХd9mƒ“Ь`ќКHLEБ§d̘іт(эŽщbAš&I9МT ’ŸбJн7кЌN[ь^uЇ‹ХЂєmкУ–eе.CЯZ’щѕёњ#Ќ1‰r|§ЄП…ŽдQмюѓ:ЕUAдьЈ7YЬІ”^3*‹n—2ѕ&›єК?Ѓ&ЄШнW5КVšuћуйb9є,…kГ‚ iNo9ђ-ЁЉиСшy=-Р>е&Oо`]z&/иЩтeX*%ЋнХѓѓf>ƒw У~šDZ[ВуЏЯGљ†СГЗЗœхzQQ–ущ|[J­.€сС“ЧЬ4лЎЬЖЯЋ~dлЦгхc“Wd5]UаУщ+0 хщŽЇыC”ЂГ^xfƒ4іd"ѓgxЧYn\н q‹гоxX'iwё0l6]GnŠЖз]НcWG9 fўЃYЪЪДMЊ†цjВ_ж™Љ9qoМZdЖ]%}–є'e *офѓчч—5МCkЄЃ8&юlКADuWЬП­1KѕYщПTгГ5У-6ЏtQ%, Ь4ŒќfУqFG‹ЯPaГмudж ]М "œћ[Ў†џР!йв ЭЇŸWЙcј rЫТЖыodЫN†Ѓ<0ьоіѕuЛшQUCн‹ВП †lўˆCЁя РРЗ5;(_ўn”жЋмvoЫŠƒ,pЂЩЫЫѓЂpT4кvи3ЋќM+№П†я–lњйъЯU7Š‹ёj–’{ДM+*Ыд€в›IqE‘Ёoыђ/rћ­Ѓ ЭkФООL{y9L8Ц@Эђ‹ШіdЛьг­]ТDGž Т§O7šP[­7­ _ОnЦ§СbUњЎvОЋA•tГ|Иš0йвеРЙŠ(џsњ§ќ?ЂˆR{#јб`Cбz9I\W8„Яв=jшТжЇЎЫЂlQЁ- ’є/а*Oжеі›ІdTп`=/|W­ОУӘЄЦЫвUљvуMSнUEЈЫџ§§DL]Х ЂbК§уy–иj§ Fw,ЫяNW“аыW`,ŽOHcЊџ"Н§Иі›šЦYўњy‘Qнг=m[A9›—Ў!Жыз;ЇLь‘f№Ѓув…Рсђy3J•СBь86XпЌчS3—кидK@ћчCЧ ж‹у$Эгх*ЪЂКЬРТt4ƒ’q,,5№ЌNGЖџnADХzƒбАˆ v UОЫˆї/тЧџѓшшЎ&t#8K‚/ћEќъ—8їП^ќ—CPЭ€rнЂШїО8ЎтјašЧпt ыяЅ„9џwЧR аŒˆђSvb~ощфёoэїkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќџv№В,§k%‚§Џ‡ ЊІŸфYџЅІьушXtЫЯ{§aйЭтџuбWEг~Ц]ИoІ8їЕ ьЪМьсџtЫѕэџ+QLаwН)~†ž•єЪЎ'XEй‹§Ќ_жžJ+V™f}їeч gбuЯn§И/п7ЄИ;NKN‹иuЈfД% џ‘K*лZН^й}§јFpѓМ(ћežFџФ,=еr‚юh:ю9ѕКскЖ_ К‘)0МќХ:\Ї^ЋUžvПИ}ЃxY–їЉљA‘ўД‹|џCє“Ђ7˜.“^Р?5бNz§мWZ•/эюРдлЭЪуУ§§юлk‚ЎIVŽЧ“Qйuџ9шЈGљp2™Ьц‹љ0ѓјъ]УJКнФЊїеFЛCIНfущVуKNPTзНЄŒЦ“Aўэ­—Фpгюp6ЬгМœЬЇƒ<аъj–ЁС7kЕZНнЦїTЭjЕR!ŸцTЕ]kq*Ќ.Xџё’юh6юњt7|4Ÿ ŠЬЊЗ§4ѕu‘ЇBСѕVчЭ››FЇнh4šošM†kоп>Tfw _mџl6тЌ7 КЁЁ˜a1˜Э†E$ѕз3˜ПЭjaWуЎЮPћ4Mщ4YƒH“Ъ>=a~™ЪэнC­%*L­rq|t|q_ku˜VѕёёюђќцБVorЂьЄн~йЫѓь;Z|яhд›0К#щ4еRЇХ(І&БЭЪCЕХŠЬУхщ]••˜j§ъшуЩхCЛйш0ѕFНv~z[kĘ&ЃљYЗз/‹,IўЎЖ5–ЃЦ†Px[WZ5†c›еZѕЉRkvšŸЮк<ѓ№x}q_oŠ:ЯŠлiЗ*7WЕfЋнxxъ(v”НВШГиSџ–№(X–x~˜PЙˆШЕ ўёБЭБ ЧwZДо*ч‡чOе‡ыЛ‡Š ЊКЊЈКЁЩ\ѓщБкœ4nМхeYEИъЯ_ЌlњaœюšвLљЎ.T*mVe*%лЙ===zwќpuv}WgMъa[Ž­I|@ˆ0У1елл #9qB=“ АВ‡Д8КЭ’LwЛн"OCпstЁйЉŽ0Œ6-щц№§лул‹‹ЛkFІFчР‡dЖЩ4[Ђnш*_ЙМi Њхƒ_Їixпв…љлGGЖН№Kd”Н.5 th T_VеЈЏkЗ.Я>]œ?оЕY“$хУвežmт‘Љт}ћъќЎС+6<,ІыђЮOНЯ%вЯ!›Ы™LMЉ‹Д+TК+oiz><сўьђјМRЉзкL*хx‘%м-лBOejOЕFGЄў6ŽуЛ€ Ÿ7зэo0˜\# }ŸnЁђ‚fZT9лѓ\K3ЈFLыщстЊк|ИkŠTž“ ˆЪВЬе8гЃШЗmъ.rє0РMЫq5юЇ1ž&:н5"ЭЈŽЉS;^бЉ …Л+0эYЖiшš,№кУyУІі1}ЏуzІЄ˜NА+V‰;Ж!Д*wЌŽењ˜тzaЇРOЅЗŠШÂЉTQб0,иjX­;]Ueo/e2‘:€СwЪ"SГ/У(ЦvЕжхEЧАMљЇxXfћMнєМ8O"OЃZТ№RМ^IІZодVвFXѕщВdПЏкэš‰Z–Ёй˜nˆmэš_„aИc[Q`ею іУmцt@Ф›VQœ„Ў%Д:,гn‚|Š2г†П ,Т0tлДl`ˆmyž%jpŒ$ЉхЙbЁc(ЊщИTФЈGeJS4\ЯQйЮSE ‡{У8A”Ѕ‘ч(mШ(PоAеY ]j7šЕFЛньP{SЭЯoЖ'tIs\РšЉТ^X LЄn;vuЫA/l –А!ќhЃнЁрPСЁ 4<[ыT+-QЂКС6uЙб%žЇЩoBЃH6S­мнп5е€ъqЊКnz!РШЂяzv˜Кjlу>^›Ђр)<[ўб$UЁЎR лR№j3jMфКІТw…аРАЈѕ’KEˆ-jљD§яяxE6У8rфŽ"‚"ђћ!=,УJ’Р1ƒД?вРQpђу “PYdVОŸьш•CxhЛvrT"˜Кн’YQQ•АŽžR‹р_ћђсщсюцОЅb>1ё"8*X•рG9ŒЁ…ХI јcЏ,Šr›зЈэ˜@оAНЙ‹$ЂЮE&бзmQ&ЯЇz[^Й‡@)CНдjэ&ЇHWНЋIj|ЇP}ЊVY;IЫё|1щСhp*|ѓCFЈаПСАN€^W‡ЛйАйВtj-Пk.C!УqЈп•!ВBЇещT[І‹o„w)рд&ЕTиfНm€рѕa4fкСЫђй?јrh[аЈSІмтм(ы‚qФд< ыJW j€чэЊЙ†*УcEнT;œLGE@ #m@И шЦB 1Ю Cпб ђ~/[рL t–j= D”xъ}рШ#Њ№‚ЪгѕYгP,7ЮюAŸїdаЮД'L‹љЈ Д&ˆI{ѕЧ-jŽэ eˆГš•Ѓ2vuўёIuР–А6Сяl(/SdшF=ёЃvuzv{{y~ђщуЉр:д…ŽВ Ю9шЩ№vPLчг>…б jKцКЖТPEрПjsGЄ&,€žhyIXF–Тнпpњ—$кЂіЈk#ЛыПфй*ќ\Ќ=\Ÿ:НМКayбpЈчпЎIuшš+!кѓUСK‡Гй( ]Cп5ъУђЅВЌђЙ+‚SKд/Еі§|0мu9`k<”•Ф ’f9 aНGхFЈўЃя0Xкd:еfН%рСБ-8{и№"ЌЅоqЂr>Ÿh)š_лъ˜<б_bЉМN@,)Њ"‰TkпЂЙwЉт&_iHЊ*ѓ@H7‚Лж8‘Ъ№yлta'ВЅi$&ќП$sЁŒ€˜;E–ИF[ЗœtДXŒЉƒб~‚]Л~ЈœМk pнj5%нА12ƒжn ^zѓБжЌ0@SЅV‹SБvSSБЛƒйМŸ`Ipx_кOƒ§ў}иLužl,‘vCГЩшеbЪ\C”1УЉaкыІ‘ћн<.f}ЊЛKEl ‘Q/юњPv}›Џr№fC…ЈХУPГ_VЄЎщЛHžјB­оiзюЙ8ЌЩ"” Т ’e ˜дќмЂ–F8^ "KЅ^uаŽtLPfQ }/‚PpэŽ'tE[_˜ лKћУўd>ы‡ЖаbuАtDДUaк*…o”)KЮээнэ#уP™wjѕЁћŽ(и‰€Ck–vB€Ўз]L3(ФDШхArмЯЃ№Л§ƒ ,юMжГёfM%@W >ž BGх:@„@LД!uЩЂ†мФ“лƒ<їјV“QММ‹џХдП •,пбљŽ ХaV§љЂє b]QбŒg :‰Bы{у9kТхЂсz=–EьYКЌлn˜FqoŒЩБ$†EždCCTшЯWtI”xйЩJIЬxQІаŒKтXО'ё$/сљр yГеj›д{ЌІ7š-—ЃЌлћўЭvєЭJЇЋq‘,ДЊHИnX.F‘ЃАœРЗ[ sМA јРЁ,Mх[œLz(lоыїc•мO"“WAБ№шЛІЏpi/-ж›EA]m›:SRЩІ ? ќ{m~УH‡~9ќїYн!ъoІЫeMЧёlЋZЉ5d8Еj‡КЅŽf‹‰b‰—іrGшЈmvЈЩ b›эPУh›mИ\o†Ё%SяHK3lКъГБ>П=8–№жѓХЌG}Ѕ€imб4 Yанў|9@Лf§щІJьƒњЩiŽbжbп №@<ƒfy$еQRмШS8QЗЬVK$ю-у Ъхrйs^Б 0йЮ‹œж„Ђ~ou)Eйu0ѓђщz”иЄќф6‹ ШВšOg9ˆЉиЊзЋu–—-ш\VR,* ыš•fЖAMpЫN `GЇо2‰ЯъPє•КHШЈsЊ“.зЫ~Є“˜WZMй-жchvY’БFО‹ю‰ ырЄ~XLVѓ> 9Eс:ˆЭVї‡ЋqтRЛ\№бv[vLіЉ.aўBпVD#ЬСŽЈ)˜`0№ ЎЎ8~шJе&эў‚‚ШV8ZЏ‡ЉG‚XntЬ`ј<њI uЇўžŽrœNгХiж›Ќжѓ2 Œeк2ПЊ*fЖX",BК`юрЄКкЈtHž:КЬыA~ рXРњќл‘Aэђ Њ8^н­gM6œbЙ™• ‚€­АŠ›­ŸŽІШр1јяЈР)р;ёnzJН“ЛЎO_WхЇ{Юˆ&Ыщ0М]%ЖУ ,NьvrМƒЕЄ4žЊ•ЧjНЭcбБЇjэЧšц›ІЏ ЂJ]ˆ]+,з‹a8Ž"šсhЛzРlЂžš}ЋЭ`ХЈr0 чыѕjжЃ"гдЁйЊ?X rQгsУPЙЃ;д•OS;,иœЃйУА<О*ѓšЎ{ оIћОnДр@ЏН(є@t+žmЖ‹2№єЖшІГ-@лƒы$§nЏ}#й“tˆшЌ7Ъn9šcЎ§$ŒЂ1Й­šdw—} \OWРž‰;9ŽЉШ-Щ…˜дЈВНН;h1!<я&ЬmE ”#QAy" КюVыYjлBSіzЋЭjZИЧЃд!хўm.Bэ'нСЈьІ1ДмjNv8‚Bt,Б):]8 5ы†8ш Т(ЖЁ;JЛнV}п”ЌЄ)ђ wmH-‹ЋiY`kBэЎЊJTˆбњEt:[ /ВbE“-цf9›Юцд-йu џ&МžКI1!Н= оb>™ЏW‹йlZњdСю­ Фl  "uъ5@ЏaЩЭ'жє#“:†`=PWoФё"ДЙ'бu#bЁёT'B bdВUŽ7ТЩМkЋ‚n‡4бд(eБ\,жXћџ'{пЕG’d‰п臙г$­ЕH‘ЁЕж*###ЕXѓѕk–ьо93g{–dећ@g=€,iсa~э^wsГaJўˆбИk5Ј2BOцгй ;ЦЬ+ЯiЮъЯ!ќс›ЁРm›kЕA‰МтЙ*/ьк:[?ў0dл8›нg јЩиPСгS2K Ž6­pМ^ЏVSXBЃёbНоО­f@C~Ј[Š"Щя&UР„ЊNŠMу‡Убl’к2'9еt<,В№CУЮUД^ашЊЖ/№V`ЂЉ‡8 žэљ.Zƒ54р'|ЌUvнu3™/Rх 'ŸбЫ2 Вr<_ЏбOЊЬћЁ6щ6;Э'9`\ГЃЧ§4LJ>>OЉЊёЈЬ№Иж"Їђ&PNCTќаQХЃ€„ипбМь˜9нюѕSdЯ М N‡‹ea ’цГеr=KЫЯЊљjZуŠАˆјј#ыVTЭgƒф–S.WSˆёpRDQ1›VƒЌ=ЧAœ2O \‡1iСr4KэеšЌКГYU4ЧеˆлŽiЪšLД:4vАбwЋ|8™-Ыqпш‹ѕ|=ѕuнMЋХВJl0g;?d4Щ*І›чcxEЬЕцMV€rІ•ŒL&А@Б–nШзƒ>ше›‚Ёй+У3РЬž_О0’hHQ“ W—_žXгR€auёаХMЪЩ|Й\aoЅХbœњ~R­6ыmej%#Eш˜xVf§GЅ9рђŠ цѓ2Ѕ%Т ЬfѓQЈЋv9›ŽsT"a†qŠ]щ-EьОPЊ*Рц рYєнСсХ+I3ѕ+л|ъZуšА<ЃгQю`ІжlЙйn7ЋљbЖOЫr8п€бCKVэЄZcЇьИЇџHXФуw€N/ŸB(„*sЌL–“X“еu-PžOm! њšдkР%LZЖ5‘mнž~й?:ПМ9оПч$ХЕ\юЁ­RЗЫ‚ŒLсgЊёlБЋзыхjГš-V№ыЭаQU3ЎfUŒч}’ЈќEе=ЧŠЋ:8ЛДšЬёr0]/2]еМСРƒuяцуёh4@•‰#sD‹Ra1§оеСщбСсЩХѕйбсiˆ+DљFMжЩ6% &Y–Цq^ЭV0Л+4zѓОY/зА Œ†зЋу1ƒўY7XŠжМV№cфѓŠ‘Я7k aŠІ,ЋСyдАŸ'i2FЄл„jpђЎѓеЭгуУэѕнуѓЫѓн}GVЩ;Ќ­šЦюјФx00‡cЕ3zUйŠ Ÿ ёадШМћнЅ#х NP—ЦУХBR;№Ыёњm;В@ƒтБ…bЄГѕj6ˆрЭžkЈИщЬk’ЩcЃw‚“%ђёќєšeЎSЋП>™Б„•Ин ,I6ТbVо(€хi~oпRУ‹†ыЏ_џјc3+ $‹€~š–ЫЭІДЅњc)йmLV%sЏЫаи‹ќф–KРц,ёЕцЃьaЖO7Рц/7„ƒcY–у`eЫ’ЄЅР’ЪĘ,–ыїїэ:7е№ћ€­ШЈмЄШОлhе ЫХбh2 c‹Њк§xоФзЩZO…0ЋАђхЩXЗ[т(’Љ<;LošFЎФ:>ХмЩСс—Я7]^–„\–„З%rЂ/з‹A”lп€#сS 7›MK7œИЌ’р{ˆq~TŒ†€Рѓљ( pЗW–#­ж›en =AѓЋХj>*YФcIке:fWЧŸOШ8ГXLн“8I“мЙљrvОtпХ sU Кƒ§ЂX^‰ц›eсaпМПmо— D&ЭIЦг ЂŸOЦiшЇб{ngiš•ѓх^‡˜-kАlЂ@дщM­†ƒаRVЂnёНкѕ—/З*08Э˜j'NwFgiѓЫёщўб#п Ф”eхЇUрЭAa>йМНПНЏMT ;,ЦeЦ§HSЯ§^ЭeЙ!‹dИ€йLABь’Oь "эb’˜ŠтT‹щ Ž@’bP˜fЛЧѓу{&Ь"<вMБ'&xIšТпrўьррјfZRё$DP€њ9nч(šGIœOз›Зэћ*FYkЛQ>€шMЇ}п§о^m&qG@Ї‡yМKСm#ž![(\ M3si^ЧE–цхx2††L]ž4ЌМŸФ1ш•,KNэvєтОгМ98:НэвЎ'‰r§>pл №МI‘—3РЛэћ2R!bг&LњKГb<Œї;оu‹st w—РFQЪ0…U Š9‰бЁб|ˆ4iкЏFуБ§АкЕрп#7qгD7&F+”] Ж6[єьЗЗЗїЏ_ПОУSŒ А}ЗД?Hђ4АqПЅXl=НУ№иР{ьпѕleЗћЏ R]Џ]œ^iЃё№о.˜ жzшмр(0ѕI7aєЩўuЯЄЧ5UL?Ф}Ю]a#^0zЛ‹пџјњў0ўxлЎ*ьiўНF3ІяЇУQеOрWлї?рйСhˆЕя@е7-pI>X8Х2•^§єЫƒ6ž Ы*№†~ЛЂГмЯЂДШp+ йО;8}ёчd†^Ў‚Ž“ С[,@$ЎбшЗЏјAлЏРTнЬ мє{оSAmЧ§%rs`ЉјЛоОўЧз7јхЃч€Ј…~ЯƒP… “j‡gв"EYdЈг< йћšq/‹гAŽ—ЫёШымп7<йЄ1ЏEЃuЃПœ/=v"7Фопџ€Yр^є1}чЛцMОпЁђмО-G{лМС›лРЊЁлА† h™ž@kšЂБw'­;ZњYж/В<Е^Oˆ0ЯrEQЛ,=БGуЪГLгиu:е Ш~FЏ€ŒM к Њщb‰Кžц(|Олш=QУЋxŽ БjѕM|‚хkpjЇ#ТЧšКсу5|Ÿ! (†eгЩ"љђѓч[= 1Œїa}–Y1”+ ГЯЦ_€JQеТ)‚Чr1LYm7HуйюSББЂчўР$ 1 DФpc1›TрЋy‚Fƒеы’n .†Ь‰ ф9КиmёaYUУсhˆЗW|црoŸŽAХDI”ЊjPє™…ЧЉ€€ЂИ!fk–"І мВ™ƒрФtf€$7ЬF‹елћŒv~Ќ‹p‡WhКž!рИ nЃЭі§ыvНZ%…0 ѓІ bУиWYЂЋхC ‰§ФxБВ_ї<њƒ `ЅŸ9€юF›юbўžЁ[М>šЯq?:жEŽeаКiGхИъ<ѓья•[ВхdгiОч@Є‘=YlЗЛ UпqLЬК‘5л3^ѕl‰!(щаЎ]ЛKм^]žŸоŠА* XЁЉЏIКуh@Ј%еФ­ј­Іmєч§ЫЪ•шnЋЙ;Z‚g њ“еvž‚€љ!›IХvђё0vjcKcVжќщ щxгv’yАˆ0Ёз$ЎЎ dXЛ+™.2‰ЉлыыKјЏсAќЋp[xш’тDЎ"b.Нщ`2"ЌŠ`‘т„8нn6ы/MŠW!ињи[;qн:  8еѕв2 :<8<{’sŒрУФEУеauKŠmъКDth ПхŒ^ЭE`щE}Л ‹y nœ†?Иe a<зTy–b••-!вюіhNіеінѕc­оЄž KSЙFэѕЕг­п~ўrq{vtqs}љФ{q–x2'*–УДI@EСжЮЯ›ŽŸ Э+dGS_x@"HВнb5гіМрћщвnрOaVД!Г=N œкJч;nКYЏЊHjПvˆЪ:2n`"й~<<>>јђiџВEм_u9ђёьЎIіКѕ ’е8^{]‚jмœмp@Hp{zЙо:TIФФ-JЌРЖ;МLЬ5Дw -;}H№к.в†MaІёфlБо.geшX>&VэžH‡uIЕя?яяўђщЫ}~КguЅqtrqqv|іТ ˜s&у+uТuжћ лVsДx2Ч]dEР1М, 4-cJГ§у'фMwm˜ss!Ž7ыХd„Gs@JЦрёa„xИ‹ Њ*u_Ю?ь†?зѕњеeWт_ОРCьяŸ<іxёлfо,Ž(њr Вx>OCїш ж<овРpџУ6яF‹бv шЏЌ9ЃЭЂъїGуВ>Bиё]”П*ЬOысьрргч/ћ_NЏnЎoŸЏWћŸ?}њлч“ЫNтqfw{“NЃ|8›ЯЇУjМSцЃШдЈb”@`(2^ˆљ‰ЋЌœ  '~лP–DIїЦыQъ‡е0+Š$Тˆ3ј!ЂЬН^__}љ6?дъ№чіќhџгЇOŸЯЮOК"от‘1%УТ†ƒQП Њ2/Чх`4žU*№AЙзfu„CќллмУ„о]тАHЎЧkf:Ÿ&ŽaЅUtlc-oeСgш Bˆл“гWКuёхрОEБэЧлyНВџљ№pџ‰сyМFŒ/ЮuTd˜ГdRn0œ”юc5‰ oЩдOu’Tˆ&кЄPЏ„nЛеВА5ˆŒEUdХМ# aЂ-lŸШ5ЎOыv$>_ОrВєtpЯѓє#ЌЪ# !ћgmМc 1дчк ”%ф ђ8Œ‹Qщ;ѓ˜ˆл~i ИŒ`~ЦhNГvkPЈF[vœ|9 ё,ФЮ†Eо/‹$Р&ЧрбИ€xЖy{uќљRV.л“љюпЏ9Ix=Й|Њ?‚йЇDАЬйQiаiQ>HуH ЄС0ЦlJ@щNущ дчO–с1І(<нщ2Њщ%˜hЅ;_,ђ№я—6w…ъ/—чwgŸїoUьЗ z§ёг­ $Ёx.yќщѓчУGжЈpˆс`“ŽЧ\)аЉФyбВмщн_<бJ8Ќ ЗsєЗ§§г‹ггћfxA1-D}ЭŒ;†xœdЦеР34ђъјьцщЅFrђzГ‚з9§tК^ŽЊ2зWmбŽћ)fОј0ЯЕ‡Zт:/зЇЧћ‡‡Чз]SКњМpFјОк{ієЗучЇ‹O_n^jѕzPEa§йŒж%šSэСxу‡нпRmлУ.ѓЫ _ргСщMS2tбOtЮv ‰e`й?]_^žО6џЖџiџ‰m\Ÿ TŸзшюбџ:МК}ИЛКяrЂЗНМt8.oR’ŽЊФ䘞ワцŸП8"XЖпŸ,БДnPGџvt{пБ#д:^vЂ(Сpm<п0u‘jОмž?6^ЯOЏіїїЎЎСїNn;ьѕП}9ЙџПyi5(йr§ щgžІ’ї-QВђ)„rЅћгМ‡;7vPЭгVЁк:>nђЯзЩАv7l) ѓгwrРСфBЎзmЕ ВqyИПџхѓ—ƒ§ƒЃ“ГѓГѓ‹ЋлЧЦнљхѕЭЭѕЭCи~ГЇЙ^y Юž љЃyсўLсџmАІщѓaˆ9yЯЇwu{іию1 в_^мнŸЦlўPWm)’jяџ œтЫЩХЭУгѓѓн]­ік% ’и9jБ:ї|г€ НњэХбйЋ кХˆў1x”мtЮ!SЯ—''——'їЯMš9  “%Г4а K—xІг"kЇŸ?э№вЅzНn›ь‰xХGХi†с5ўс№Єо#šWg—O—ЧїŒЌG“yМьCЌ–-;ЌЦЙЃЋФѕЩщЩсС—у‹‹Ы'Мч‚ќбѓƒ0Œ’,УГ>ЈtY€йkїžчo^IŽч%L Р+хИеФ™Bxл€tqxзy:Лъ)šSрIОў!}о!тžVГgЇGАОNOŽЎлЌ–@œмUЫ№p7;’FиуZкu|pxйšДЃ0Ж‡7міAm dэіЎoсщшІy{tвХЌјР№І?o5mСL3Cлїїw‡ŸOП? `ВŒB.§iЊШ№U3,ВиГUA Ўj4ёtvќDё‚†[Ат€Ti|x˜fЏЪLыЕо!КЯ—GЧЇ/,аѕl2Š1WыOݘІ“”ЁІєš­Nћѕ Eрў—$l˜­ьi 8€()fŒх\PKWW]ъщ№р™dHЇс8КЂѓаь8Х›3Ј({NЗљrszєхрєђІњп+І…ЋџЛћЏИi\FК тcК>?џћ%r“юёI‚)… ^акнGtО9j4Юў§пЏAЯКn)!пoV­Єс§\C•ŠfzЭћ“/GG‡gчЗ ^гУ xЕўX!"ƒu " дЫэщшэѓПг{šщgрЩЛф`C@тс_,QЈ?п|ўtмрUЧТу5EЦ tЫђ‹A„Х MYVрˆчѓуЫ“O‡GЇwQ5Г!*˜?oД€ /Бv{‡bЏўpq~ ДюОЭЫxiТ€хWњ‘!s‡>"ЪЎЏ)єѓ§љчУЃ}`4ЁЎЧЋК—–ЃAˆгИAЁ фѓХЭыэёЩС—Г'NS§"њc–џah†>шоeh4К=†х ђ,^зНЌmš2ѕZ#yDЗy›ФЭЇП]оп]>‰ž…Щ ]g4Ћ?™MЫmўЖ9-RѕЛ›&ЈВЇћ‹ГћžЂкqє{џџУ  ІИtd‘э’ќN4У41$L­ЂКYjК0ežxЙoТТ“Э>ЈўњпЮ)N`9#Дda™fеœjF‡пЎf€б|ћюъЖ! љњеjCџЃ DЪОNœшP кЈ<`šš]Qvђбl6›FАвzЯ-iЗЙЉЊЏ'-–ЊfІТ7Z$IЫZ<[.wy”И(Бћt}ёHJ&офЗи‡{B…§cЛwџУмУz:ŒˆЉAxЎЉIн­ИХ.ЭЕ 4М/8UБЉъLбTЫKЧЅ­Š-дЁс|Ы‘ŽuоХzНЩbѕрŽкМoKњ‡@Ч?Ќ–П‰Eš“tШ;^}У„šзУё|Б^/g} ІšUŒd:M,Cбx`Eš•Œч}CiрFNT.7ЋХjбЗu,MбDбБНuѓЪ@јљ0›qа,нiv0-к0Мя::рцІ_ЬцѓХІкQ$ZPўbhУЛW™WRU-rРJбlаыХtЖ\#[&j4Ю0LАС=н/:ёŸƒU Œ(a^Ћ~'}мгš‚нЫБ+ƒбŠ F[š*ВЭл&Рs4[ѕMЕлULO%GƒсdО,}Ѓ5DXџ%ЮŠAќXіџ УеXaЗ№-?пЎр‡"‰в~9СmqfкЪчcb4лx “йrфLG4мjН'ž—3 ћ˜aigXч4 Ёйе>ьўЫ ’ˆ#‘@cmƒСhŠѓ;Ю=wAЃСbk"Ф+›ЭРD…i’ эс|™*EƒrнnxУЧЯСъаХ$ЉqUUУj8ˆ}‹#еЄ,~№,ы;†Ёеjx!?Œѓ&8ЬцУEwГщ,Уk8гЋ!^F”)Bбu'H'cзрAI&›m QGPt<ŽFуЩx4žЯ&гQћ†(nœ||С?In<B9qжV“щt0‡5`YwѓХВoЩ=NwЋѕПbЕhёuEЊv4\nжѓйxЇDѓ*Uw,лћ0Œў?ƒьm4EАДJ€eASSю4ˆgR-aСЩДhј#РП!r"ўљБеюВŠ;™'Ж"hсє}U8Fя…6ьdК^с‘чzНYЭŠ$PЧїlыу}Zв }ЎэˆzРќ†.Ж{0Gq1YlV}C0eyГYM2€CљѕђцЎЮ(Юx3ђ KГїЭ8АиW ‚uЙXЬ`Іч!‡IbѓšЮЧ—ƒфБј„СМ€шУ=[н sп(Q3ЂсlЙy[х:№iПZmз0yрJэфъЕЎS-}зВЃљv; mЅнгlП?žTeб/№Ш<‰DЮТШћ‘Лп7dc—ђ 208Ћ9€с{’nטџМYLz6пОmзѓЄАyњ@‰Въ зыI„ХrГ]dЎж#БЦP–cMBЬЭŠR“§bЌџ“G,џ|ˆ ­ОЉRM2Я"ї3iB=ОЛ Д‡|‰ЙŒ`4n’4/j (Ќнв,гlМкО-ћЎЮwXЃпЖ‹двЩgЦt“fš2ќ/ DО|p}а2”]ЭqS$8<+ €к+vБ}ŸЛKЪЋ јы^O–G`єpIу“аP; б№PЅ№шGшОЉЬ…бЂЕЫ&жщЖhYAьлВ G љƒЈоjF є;ФФl.=ЦиЪQ—ж_z>ћЪ:~„ЫPе•ПІCc|;Ъ:„bћqфЂъVяяѓбp af™FcSU;ьЫЂZР2œx:Їйa–јОC>ьџТF]Д†F›†DќМ$Z§эlЇуйњ§ ŸйТnnм/‡Ущцm„“Ю4зOXyЛЛ™тў•t0ЯФСR“Dƒ3qгbчџёЧz>[Н­†i4їHMs1ЗЩzŠEh˜V€ч8Т ФЈЙђFяЊОcХБЦžŒЧ“YеЋ ‚€Вк`’ŒVŒбьЌšЬыu‰u@–зэKЫyОЋ40эWХюџћьRыŠHьІчy)л)дѕfU†–Љ<ьZ\EУй|ЕyЊ$АЌdир^Вrѕ6VЇўвІP<цѓ˜ЛJЗ0ЃОчЪЪУjћЧя›IьиyŠ-2Œ`0ЙЊбlГ@Yb@;ЫРˆїє_лŠжLЌњЊ+|Ўтњžб%ђ-пОўБ)]ю>ЦЈ†F/Ждkм=ё&NtР#zžўЏшa%h6жИU /ЈОEv­ ›nоџиф–иО:;иЭД_LгФ”Yђщ1-?ЦD ЌŒ&§•§‰ўsЈЖkЋпЊ/Ћ№SЮёГёrѓѕ­ђђёzџ[&Q>^LлPdђ‰Дl,ХzА‚џDщв?7Xщыˆе,MP=0zБZПЏњž.tЏР‡ мКЦ_Ўi№Е=mз лsќыЛ Т yŽзЕ•“щtЙЦ3лЉІіЋ1Hm Hщž`|KџџЁЏуЗСШ@€АcЪp lдw1Љ‡вt;ШŠс0ul•м#q/ь_вDюŸZХІ”ЩЗ+њоЗŽ”˜œя†Y™yПDЖ~РЋБв‘ёЮsнoщSœašn”ЧЮџП-LУссМiYж?іšu—šю|ќоѓGњП……$œПАлЧ ZRўeђ{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{|яtH}G§WЅл§шь ˆ’ћсЅёџ\EхЊxі'‡ чiXЦЃjXЄо?MќQ№>№їwЅњ…УГС ‹вr<FГ*wљКџŠeќНK*Џ9qšхƒ"§јъ?8('.G§РŠУ*ёѓЩ0ѓ4с?s_-™ьДЛ/ХХГУjџвЩІХяOЧЙ#и^ж‹*0ZэѕИПЛЯwZэV}ї5Ё„y1Ркe‡ПЊЩџs№иR>ЭЋЬbЅ ;*ЉЇДŒ$2ш$НnГёњќКћnв“b8šЮцГQ?KўвЫџ9T/ЮŠr„­‘<ЌќЂNRБ-дk/PXЭБгЈНО<ПьО]А=/-Ћщ л‡–Љ§ЏHдƒ‰ЫGгvtšБC"I)~6шGЖ@г=,FИGэ5ы//ЯЏшг$-ˆŠ…5Н†уљД*‚Eъ)уDљx6)т(+ЦГQц;2С‡YЗТБ.A{э=№чFЃййы’еnі$/^їЇУ~№ЏШ.фНИ-`Šmе№њ“ХЄŸјigY8Ржмм{кыRбэТPнцунK“рУMЫ€ЮЗ‘ЅIр*]VЗУае>>№ђВЉё4ЌœМЬWУŽCPХPmJВ"ˆ#" a ŽGe†r"ЯУ‚џLOдwЭ4wUŽс)Lўc^^^ыDыЅkТ;Gёг(Q–!xг=J:=˜­edУ:аЭ(ёœяПlИўЉA2’цІБ%ГŒ ёpTЁ˜†фжO0кЎŽхXиЦfXVTјn‹b$]ёvЅйБu—Шта”hљq5ŸOБƒ-xЭ(і QТк_c5'ЩšaЧБ#3”„%h&У40АŒ0L]—{]e жѕCщBQ№t1 ьОA‘ЈzaИидR8D$ЯЋ^ѓalI‚ЂšAьЊ@њ\зў|Ќг€}+тд7D’дэh0і‹ fЧ@щ’ітРНАN„ЗbXYF”ЂўњpY—ЩА\@НGц€‘ы2†цЫqтH<,`–Йbb в@k@3 XoлšHбК‡M…bW! 8%(Љзх5p +дГр•d4сѕюђќъюђј№№№ЌgЖЁ€]и‡ ПУІG†"QŘі} {hиXєАлж?‚€p7А&—Ё4щИœ`§fВ-;ЎчЊФтіœЁА$Е3l–eњщњњњќшєќќњю…Ђ˜]y MбStEВ‰ ш$йэOС?4;XєУЕ`fZ{Dz"ЖЧЂў†"ypЃbЦ™ŸЕYЧњђy„МНƒR RNѓYсЈ 1Ќ;CeыmN7eВехU8яc%}“КПИИzц`9š(ƒПlWrMЂжfбqЇЧ4M;.‡Ѕq"вD,ƒ$IшY?-rMФŠq•Х@РLM‘YЫ›Uуёl^К УЊШŽTК€ ihAТцГОяX@P |т…2"e˜@эˆœІu$ Œу#Ф9Žd“ynщ@]-з§ JИх§ѓ"[&хlL žэКАлQ9Žч•Їё€tІН‹л$бВ)ƒ tСoзj]IGfjH,-`7c№рШІŠHœ%R›Ж=Ќг@<ŠHUР‘\,[= Њ':V'KG‹хљ.ёгFяQиlЁ\ЮF@FСhN"bЉ†;˜ЖŠ@%Іѕиьа %VрXЩ‚ŠЫђ‰&:нžlЧ w›аБjЈ†Л5Є ai1S3УсjUљAƒвeYрЅл€8іГл =ŠътIƒ•LчуAт;ІТ`чc˜j4УТ’EI’иNЇнMЕѓкЅБeЅч€’tM‚№C Bл‘;/hGьŒЮЕ Aш[Вjчѓuх ШV ЋеЯЦx(wяgцš“р/‚DЃхМj <л4‹,ЄŸ#КЂг+KЌ.Зj]FAЏpЂ |ТСОэXH4 с+ІёЯ…XыTБН0‰ЫПЅ.%ˆ8ЅХŠiUeНXЎ‹ѕzQ—ylЂ#еd=УŽо"@›ƒЇKЃFGвц,l—шОplзᘯа)\‰Jнw№ŠЎП 1R–дh>O5ИЅ7йlAзХbЙ\уt.Љk|ЫKн˜—з›QQ~I“tdЙмЌГyкerЙЌ"lŽ-тХ.K h]5ЦšЉ1—jBЈq ЈPН1ХЉ2oЁнfn 5Gh%ЋvЖ\D2ЫivК\ЏAзеjЕйnЖЫz:™"Їљ Bу\I;*Ѕы„%˜Шr 1/\ржю ~VMpŒЂV EОзfWІT€аР=(8ЫВЎ˜ЖЁђУЛІ"d&sуЕ;Р+]„eЧгѕ:S‚СцyГй,чГХzЛ™ч‘ятМjѕ›’Ъ„˜A9ŸзЙoъ&РІхj5ЏKз™ягŽ[Ьf“,ДsAњМnЈЌqO$rHб$Э`пВ4<ЙU –—№IЊЎдё‚(I PqUZѓХf‹эЖ‹IНZ/2ЯTqА@пoаy8ТžЄHђaa ФТQЌЪщ|1›NъХЌžЭр-j` Ž&вд№БХššЩUC”UŠhŽхˆ)ш†Тон3š.Ž;   ЬЦЯ&3€xИ}›EъyбtЕнЎ7ЫIš–€šBќЋ„}Пс$2,=А;Њ5Fp7яЯaяІi2нYI=йe‰UгrRБ-1dч~(+ЂСгš˜nxwз$гmц7Љwйц mаМїOыП74сЭjV‚ЮЯлчЭ,уjвсё‚$}CONœЋЮ)Qs‹еЊNaЏIЫVыUyIН';[ж8р=-Š(AЏ9€А МЎВŒа:><ЙКovяЎG€T`/юE•щuњ#Мw-v#Зj`Е‚уЗ]ЮзЛŽќ›yъЧ“хxГ˜†ІПхи2@ р0А ŒVєлU`2РcМЄы˜Сyё‚$K0Н6­™<а]`мЗgћ{ћ‡G'F,ј НyЯJН60wˆX8ž(№У0™т4ЈЭѓѓrН}­З`)МЮъDЌЧIтзk­й@OФ[0€ё/xѓэІL8ehy\3” йѓY`‡ЭьЌŒМ98њ№ыЏ{ћ{яїі>>'у'RьtКW#MРэ”Сѓљљ|…уkрЧЫЫ N‘Ѕѓй,2€zxз,Cћj­ з‡ˆejV2_Э _Чt%ы›*„.@8F0s™ЛšŒ#ИEРRw‡џ˜юЭйщщЇ'ŸЮЏoЮOŽЯAJТ`DЖнЛБЊтЈc^ зЈ4шМуи‚в‰dѓUjЋ@-HЛѓЕ'‘5нtZfqRЬзѓЬˆЬ1‚^ТWŸ@?АВэЎ? QФЇeјEe†="фУЩщuЋзщ4n/.якнfусюцєьБнМПy$FmBТћ<,р?ХЮрP&PeЈœmJGXі;œЏѕyВу–р„lзUbуЕ /;5ќТ*’y_СBф<’ЙншZјܘЄyFFƒЗоЅ снЛЄ% Э†]тŸQїYd;ёt9ѓь‰:rїkпМ;(6ЏŸA^зрЅсL0Ш2VрЄJƒЈ-іЧWћ"ќЫ А—ЬˆфэЮнХЩДФ1Хцсо=Їs ˜ГГЃ§НН“&цёЯв$1б№хhБZўnЯИмЕoЂвыp Р•$ Оz~˜ JЯfѕb§ќВœDЖ&уˆn3]РвЯ\ ШГl€hf Д@гpFy–уЦе??;§xої#8 ЩмœгІэy^ьмэю}јдЄ%ˆ%‹ЏМ#’c^ Р%mPх—g<‰…cи8КЋv! ZбЄ ОzЅyЫjFY‘#*|'QЦq|›eЌ1Џxѓѕr^U!˜2‡a€у9w{—'‡ЎхиїСŸ9ъЈЇšžџŽNії.;Œˆщ*`ўIsKѓZ Єhƒњхu›{‹х3xjЭ ЊEюѕа3‹$гєђИцФ3№Fа82› М›hІЄЪЩ4ОKu“q^ЭІY„ї4рэ)ИRМrѓљ,ЕНl2ŸQ$HhˆдхСбYпƒ ˆу(ђ-;ˆ@ч cђфррјКЧ‹šув /‚П2с a№ 89хe\РФьЇЬЎЁњжW;j@ь №ќb^0юнн9+€х4ьWС:К1h ˆу9zЦёёaCŒГ єƒ(ŠcпЖw ŸшЫг“Ћ>'ZI–Ѕq’•ˆ> @.yќЌѕѓ:oЊ›Bœа9Ÿ—xGєЕK=тѓ_X]С'Œ>!ш Ž>DЏ1ŸDЋ4ЃщlƘDХъ–ібН1ЉГ0ЈUȘзэЈУ8жЈ‡гs‚œЪZVšaєŠЃ8rSdkœEЗнф:&(V№FВЈЇЉkЕ}\`sШœJ @•ш85†УВ_лD$Е’Nс#' ђюVšжАf?Л€z€уРдю8Ъ‹Xm~l3‚у„Sд9 AL#ѓfУ .О€ЃЎ\MС!а2в;Њg™kл_Ћєс“ нƒ5І{- аAIР-R_ЏІqОА,ЩЄоб.БqGх€ГqуаїƒП­4hбdQWCСLЫzœ ‡Р#q_ЌbЛ„ОТшВL˜–Ž7jNlMlуЋWzџ'  бОЛjqЪnРИjMWz3ЗUг\‰’IрX:yзƒMcДша‡UіPѓp—рˆ 3љсrЈЊsЮ\ЬМ 2ЌР+ўтVz…ŽояљXfСW,§Ћ НnЦ9ЂћxћD)*И'ЧЫ5ЮF5хЧSЉŠ&‰ЊэI•ЊшРЭ€3FК9Я…( Ÿ єМhЮ„ўxIшŽ5оIЈЧГœŒъyО  зЙ'яѕѓыв3єЏvд}œж‚^doШBТYmр|ƒїXoг‘ ‰8п]Ф-–Ѓ нгНЛtQ NА<Жƒ‡•ЦŸСЊEЁNцеЬК9МЄаЅ@W —Z 8IJёЋBрZož__>ПОМюџћђљeюъW›c˜89HWŽWО€a|Цi_/0ОЈСтЙŒO.˜№ˆkопХрХЪдuAе9Meїѓ(*Іe K§сšГ~‹гdВг&FЄ—ычlB…П|љ‚ГЃ^_ЖагЏ6oc3LЦ†8А?ѕхѕѓ——н Фе6ЙъiрШ{Ј…г1™дЫетлW+ЭЊ&fРZљ–њёзЂžжЋgФbЋѕѓ”'$аžjЃw(ГЃ‚c/ŠГu/ŒэжўбРKCLІї\rpш%pјє №Ћz8ъЊ].w7ВЙƒgƒ8&ЃІљdО\–kОўтTТ;MEї+ыХ4мd'‹gјИy1ЫшФќі˜ mЩу>mЦ`y†iЪ ЙгЮyсX ?ЭсзГЬXрХІaК№QСʘyvч_Й ЯБPG@ч ŸМZЌJ€І_o ЌS$Э@дžсдdCŠoР‹т@ЩMmvг•€‚ZТЈЧхt €3ƒсkOB7ЭŸщУЌ,a"•“  šц€uxhЏ€‹j8sЫх*зЙёpаiЕ‡,8еДЃ|Zч`0_­3ؘјсV+€‡АЪ†*А‚ъ-_б›"{^NBЫРЫZO}8>яЪ7ыщtZЭ*p9Љг?н;8<КЂАP§зПьЗ%h@OгЊТzс шїбйEK‹Lф8†Ь‘xп4т‹LSфЭx qŒ|*ьx ЌОw{лqШm,? ПСyќ.ЄЊћг Hˆ!4…яsЮжœ(xдэЫЊpD`ЈФ§оЏПўы ЁЫќ˜аЂўДpš{я§pјщђ–MР Т'ЉђHсdэ49ZФгc_4ЃzН[цеzсЯр!BRЭ›ыFЦ{^гƒ-ўЦt•БbxрL…Q‚ŒI…щЏЏž Ќб‰ВэЛ›ЋOЇчWWЗ"•NW 1еяžœ^_Еьщt2[uAдИћѓЧжУ]kдП>ќиїТО ­V3#:8OxМ{zшаX†ЙЋпИаЛкаY&ћ hАƒот­|Їд3ˆЛћюh—MІшš$ Ў›Œю9rчфрцЛзvє4ђђIYцЁЪs’Ь<^н?^Ÿ]мнэ_JE6YуЛйbЖ\Эƒп§"r›ЇЧыЧБоIзПЭ:H^€(?dВ3р$kтdЇF}—ШŽ63ˆ–Ј€РчcU/;КЙiДz­›“§ЩЕEp‹s?T0'$рgЊHQ`Ы§nуі‘Впп;I ф‡ј€:~xь<^З8Рcъ7Vьрjм7Ч 3h >ЯšЌчyœLЊЩtО\еiс_ББ(Жwtww}ДЗїaџшQ4 f$лЖіtxpјёр№фzˆз2@ м†!Ў–‹96и˜NыхЂРзrФ<бPуv‹RuѕgѓТ[!šцq­Kпq3pj“щd>мƒŽЗŠ ;1ИhЕЮпП?ќє8 щі§H”ЈћУ>ќz№щЌ' wwїQ˜(–ѓЊšхq^ЄјќОЈbGп•ШtoШ№Ь‚}љcwћ$ƒЬ‹!F€ќyэухt9Mѓi–O&XЖ ^ЭˆjџсžАјлƒЃћ!A.?о“ЬИuњс—_§pt№Hгœˆ"Ј™aйAQMЃ"0+j6№Š „bFРёАŠuDсwЖиn€tђUnШЂbчг––(KBТ2кJнyМ%вЉбЙ|$9~єё/'c‘^С:ю_ ёVIМŽГй\пsМ8ѓу<і]'šЬ&Ёќ.1тUpFќЬƒ$сЬcIuѓЎ-hfĘЙ2ЫˆZ<ЭТЌЎsрQСяJ‹ГЦУйЃYе;Єx‘ќјПNЦJЌ‡ђ; X{§NѓЉAˆъMх(в 'jQЈ-ѕq‹m[g:OЗзз7ћ{ЧЧ{Ю†fšЙ@OЮџrХ‹œhЅе4ОџА3bЌ>DўжkyxН—>iI•лр5Šсщб`@апW–н1‚Ђ›Сd= VЗКЂь•Y”$–#% њсфффјєьфршєєhяУС a‡–BžўrХЪВ“хЁоћ.dяшЊMјjG y,?LЇЅ'яоtŠi Щ9Rдїз2@<Хн Ѕ&І$ЏйJsФЈДiНЛЋЋЫѓO€@./Ю?}<ј№с№‘7…›їП<А†Ћг­ €жяїO>}<ОМ{|zьё"†Uж§ЄЌKм+I•™ВDvКƒёї—`ђЎe‡еf‘РeOЎк‚Є^т)7ьНnЋ;b;ŒЋГЃН_?\К‡П|јeПХЎё§rxнlтЇчg—э!X/аЃЂ*™э‘’т”гHWИNЃеџ~­yXf/ЎV‹ЬQeОy№ўјЂg&09‹>срiК„жи|М>ў№~џќњр§оћзwGрЄAщ§гХ>ќњыёйЭѕеѕэ§@Boэй$5%њс‰UП,YЗЛ#ђЛK0(`l1DЌ И$™ЙњЫс§ѕ уРДvT,–ƒ˜ЈXЖ˜J эЛгуƒ=А’§їїс_‡G'Ÿ.Ў›В}јў№фќъўссњІЧщЖƒЌЖТ Ў/:ЌdЄ58'žŽЧп]O9”t3ž-ыФО?О8э‹ЭГ@QC…4}W)Ђй.№sLФbЧнЇыяay§х—‡ЯЎяюЭцcущцттђњЎбэ6nЎHЏVmы\}:К2И=k|FoPT$iFXеehЪŠиўxжlžЕёqMоЙ\ˆoXc;!p#€Е"‹ й…8ј+ъ}tўаюv:ЭfЗг')† Б1hœоАЖkыТшщьгеЧу'щqc=Э[дчыŽЊIъщŠ8МЧ…НHŠEфЏbї(Ќ–ѓт4Я#ЯxМjgЉўнё{0ц§“›ж€Є) ўa№zG E€зt|rэ‹уу›жэ)ј$е…Ѕжс|)iF\,zxsМџ~яршќОеЇАцxœрu@ LјI`‚ЕшKїn.ё8~Кяж5Ђ0qЊ&оЮ@Ќјб§љUиqћщюјЂ{sx›gІUa$јўТUо0ЌЈЬ,YЁ/>М‡шёёєКЯрЭˆfК>о у-—Nw’XLЮ0§ѓЋЛO‡ЧwН!0AеMќpa“=tE’˜б€dyŽЂ%ъьфђуўхX’єpZутШљ_EЋЫ@Q0Чgяз_ яоаАЮXŒх…ЛКw ыU5Ќr#QhІrкhн^Еz–“lпѓЃ$tLУ00І™усs3МBпžьэŸЖyIБRЬ!œїНJsр%ЂЬкzuzQтёСЧG ŸŠTУіёО1Ѕё!Vѕђ2Я"az'їDїюёЎЯБjр9A˜€,Aub,Э75YТG=рCtћгzХыV=мфх{•І "FЉЅ ƒ‡лЋ‹уННУУƒї—Ђ ЭcзЗ/ёtœ уdlёlчdяВзКњtаdAiKw|CТќ/QuГ<]Ы„­A' LџтуЩсˆ:IжЂ22”oJ1§П Xd€хн5‚SОwxt№ў_O#NРЕЈ–РђІŽ,pX+ІhІяŠtџbџЂљјiџ_ЮЯЛ X5>МZt’IЙ{BФB%ј№ЯјцьўАШГ;R”­"Е€м|ЗвXр˜ЛфЬонЇOчŸЮ.oюnю;–yQwТГhEфYЌРЦ?:Я6OЯя/O~љpGыЖФ‹˜ш!ШКже$ n`‘ fхˆСюїч'Чg—AP‚и~пНSАжJ…/Я žюлC‚Ѓ! Єфaч‹i]%КШ‘#ŠeY^v=Q$.?п^ž>0І'NЦЃXйlOвDR 4б~"xrиoм]5`ЇЌР~“І…вMФtП3dwБP–БЌa œOЄ6›з%,'нkaБE7ж%aјщ_:$CБВЃ3ЦК#IqЇ‹ХЌ uˆ3X#ёу^ЗOАЊХuDы‘„(k}уMи?^–0їS$ЛЏZ№QMйЅеS‚dЧ|дO4‘'к’xъƒ>їяЏаŠ5/5DРі§>%ыёbЕœ)с§’aѓяdњ0Фqc„5Loенˆсa#E~иуIГ]ьоОVЩЩkPeYy2ьИ8­*La_ЗРУYсtъ(ђЈ;ц$ХЋз›ѕВTьeТАTћё~Јšx3єиR˜N—џ§F:ƒАMлvеvƒ8‰#Я‹aеŸЮWлЭzKM9йЪѓ ић'^’ь|9s™"Es&М œEЊHuZXŽ•MЫ г"ѓaЅIАnёtсфёrШ ’Ђ,pЗВЫ|^-15Ё4ЌпєІ‹Ъ‡Н—…ЧkBєl]л ?8фOзЯk,/( ™|lёˆhuЭє’Щ 3щP;7Ђну4нР2ђb‚ №9Ыx/>ЅIAЋE… GпнEQ/VS[azЌjцЋэvЙXЌ6‹ар‡,OЧС$јеЊ ьЏO*§!ƒH#1odг& д˜p2)ŠЩlЕоT–ˆI‡aНЌ,EцЧ­ шЮЋ–3Oућ (Нйnъ"-fЫY``•—ei:]ЎзѓФ1Ep–šуМ‘ыј7qмў=Ѓb ,І˜%1‡­žч L=ŸЏЗ3аЈ5кƒ"вНVљА….cЩШ_^W0ЫpŠй[А]yUUѓхj‹i–*vџА’ђЋѓhОRdЕ{=TU3Ь0;‹;VГи†#Ї˜XоUћЧŠZ4_ЯŒб4A‰XжsOх)AKŸ_—‰Ё`?…љЂЦ†ЈхdŽЇa–Иš„ѕхšэПБЮ#@Œƒ>‡7C~%EЕX.ѓ6U+š.ЗЋTПlfЋЭ2З!Бƒ>НЋYѓы‰­[O6/лЬP ЮЛљbЛ^BDB7‹,АрMлў№ЦJћSхaŸђЕ]&h5/…ъS’ьs 4t'лЭjтi`еЃЮ"Ї—ЋдT”~ž8*9VM Юo1_ю^oЊ(RF‚eћЖѕжmk Иаlށo0/ыб$1db((ІV?o&Ж vЖKЬТќTЊ3 К!Їeлyl›NОyоЮ<•ШК[,жјRUuUЅaФŽT;Œ]ч­ћ*Т4m]ЅРF†НVŸUЬ8‡;ъЯ‹/лЪ‡а6нlз МjЃnЗКн!ЩЋ|Ѕѕѓf цЭ v`oQI‚љN‰ивіЫ2А­76ZзШ7TЌж˜Qw(ЈІЅЫc‚SЌdŽ+ ЖЋ—эК.BKQdцщцБOQЌфжXі5[?o_`Ѕй‘h`'З # яРї˜ЖшХГ*uО:Gѓ+eЄšN’zfЛiВТЄ Sьѕ@Ў˜иŽх*ХlѓК]M3,‘˜ЧГћEбЂ5ХTtLл}ћš8D­+њžNvF’Ў3w-Э+жГШЖп:Т+ї‹ЩС>dііуUkD‑­0 3ŠЖЕЇ+=ъ45z8ЂeU&Ю.y'\nВ7‡ „Јi]‚…ШšукиŒBЄO„ЌЇKLъпe Нlf“<‰lEІ/ŽњУШfКz§ђхЫчЯЯЏЏыв75•nv9QЂ†иCЦRžЯnб[Сџџ$ЄЄ…SЌЋЂEн=ьС*S=8‘ј LMћќлoЏлЭ$ ТТ yyгЃ€iЉfВ|љђл.qыuЛ,Cг”Ц‚e/Ті–єиUэђeй? 'ые@в‚*З5І1‚е›ЄРf‚ЕЯЗЛTВпўњлыѓЬ7А­ЌЊŒя€}a:˜“/ŸП|y­?П<ЏІЁaЪŒfЙч…EfФmКГэ"sћэћпВЊLsKЅЎМV„3’‘.Р4@щ/П фš„y‘ŠLДрЈ"aїСЂIяVКсL№ЌсdеД^Ь"SшŒtLz‘ћЮлpкџ(ЄЎšxЉЇВз Aa›vмЧ.€Мз—/Л|Ыu œ\[т}Ÿp*ЎЗhэ˜DњК MdiбєыѕrWAŠr5ЫBчwШјGЈУŽ’ШR…ЇŽh„™ЅГЭFURзp_С>~ћМt%–P*г}’Їš^Бz~Ay~§ђZл*нчlgЫY>YLlР‰гКDПєmўв@Н А4Љ3ѕ0бео 8еЮЪ,Ю—˜м цБ№dvLq"зG–‹ОВй.‰Ыы3ВIъVXOCлŸL=™цё3ЭЃРЕп~(ƒЌХХŽњƒБl‘ЎtœЂЙй4і,oВy§ŒЇqh!^ ]‰вœlГ,KƒG–џNXL4„gX!Иi’б 'ЧN}”рЮ^vYё8a@\иFj‚шlГУ$рђV‘Ъѕл№wќдwDжpГхЂїlъ?vДЇъšЮОЃ гƒ%т N5Т2qT†‚фљхy‹ЇŠƒСА,+XРкЯЏhдK_І[^wввЗ%оp .€T€бЋп§Ьђп #]cојDlЬФ^xiqН9D,аУr@MЁо ’сє|—0‰Їtю)дc›з§iс˜˜G<)БF$p­Зц,џYА’z7а,лЕ“”фКpžзѓ@ЯЏл>:Њт§Л.IГМ/VkЬЇї=бˆым19Bu‚Ж=Ч1пМь Їƒtw]ƒ-УFМaFElЩœЌўњзЯߘn…€_япu(ŽП^m0 Ў+PT“жМВN]‹ы‰ЖУvЁ#е~єt—сјнЛŽŠЯљxпK &'…Ї ЂS}љыoŸŸWpИBK“пѕ№в]ѕІkЌFнN}]FДjЅГ)0oЎAZnшл*ёŽў“цvьšїт-Е<$Сd‘)ђzіђзпО|оbb;pЩцЛц<ъСd:ЏБ3$+ЎА­“%Еz*Ж§CЉ8%РEGМnGБ­JИў Е^McЧPф'№ыЂПW­ƒaшї’сOы<=зvЇ}ќi:4Ь<Р./Р "@ Oх$wіњл_П|J…>яqw+ezЩlћМЦОgƒоXаrV`I™gГ}Юt~[љGB`8‰˜Њ"ї)0ЮРр3л|ЈИvЃЊє Z€~‰Ийц‰f‹’С5ЯfeЧЁkŠ$‡чOœžЃ€ЪžШЬ6еazЁoёŒ.>џяП~^'†"ROŸ0o`ЦtБYЧ*еОnˆX >Ÿcб@ŒSDГГџ<Ѕгqм OЬXѓЃШ5˜!X:эпžю.`ВРм8ŽxjcCіzV•EEšНfШ?~˜ЫйФ6O>ЌДСЂ„ž*ш 4hНTъщфр=(­`ЩХК+:‚aХгЊЬв$ФД}MџьP јg8§Р†HФ7M'ЊЖ@Л^JS?œОЧЛ4Ew3XщЬеtОGkfœЇиГа… R~§я…2р(bm>œK ЖуЇѓн­ѓ"ЖuО}њ_4#РŠРЋт€дэK“ ў+ќ?Cу˜d…љh”jšІЄѕbZ–ѕVж”pƒU6^\V„–бXГKЧЖQoN`џ0Xьэ…йЄH“8›Ю2ЧиMЖŒ™њ MS–zѓ1X(QйЭyС<Ќ Ы\ћїЈСЋип*™$Бнџ…Z6с„ЙˆHЗў§ЖˆХˆ2ї[ šў,Ёxгsq^„ЄœњћI1ВюzІўЯ˜-јu2І™]ˆЄџр@*џSњ‹Ј~SgГŸђS~ЪOљ)?хЇќ”ŸђS~ЪOљ)?хЇќ”ŸђS~ЪOљ)?хЇќ”ŸђS~ЪOљ)?хЇќ”џЯ„•4UVОa"й?[XЭС п$IcпќŸ›@ѓ…Г§(Щ lЉ:›i`ўЃм*жФьTџэkО]Є0ЩЇPv/цU™šџ9ѓяiшœсЧIšgБџнm–ОWFV\дU‘—ѕ|1ЋfЫКЬ#ѓп-›3dГšЦ$Ѓz8їbZM2їGж‡ќПe@№n^Я&INЊ*ѓYХžС“kyGJDЇлiМ{зъQЖ)ŸЮ‹2vОeюс[ Ѓhf0YЬ‹РŽРЈcз/БRаВТP41ІэvЛ J?>Д8пMj].'yЙџ$Е‡ŠхafQИšeБkкi•ћqпЂАAж гoЗšOяо5#-Щ‹ЩlЖ\oз8 =њЇф†›LЊzБ˜Я'ЁйЎЁbЎЬU‰nŸ`Цƒ.йъ<=>><>‚y4ЧNХХ&а8žiV&џаЫќ@~RЏ–u]ЭvYМІЦqК—‰ojšЬгФ Cн5žžžšwНaФШnœцqMжЋКHоКяСзcXj8УvЛгљЌ›ыa^&ЁяZš@zЭжeЋзnwzУСhиmwFœЌ[–i%‹iцK4љ§)ПM;ЬЊеz^†Іjх\‚ЏŽбgЇQри*;ьЖžnoњФd8КЭЇfЋ=рuлЭІЉ'Œ9Uџ\сн(Џ—8С$ЖdAqГйМŒ,wƒ(‰}G—щ^ЛеИ}шG#аyD кЇfoDH^…/3ЊИЖўg&3vœW3љlкš(лq5+“@ыШСтЁ6v2mFфЈ?$ЈqящўсОб'8+L"[цсT&q`џ‰k=0Ђ ѓМœVyтЂdЦXj‘–пЗUtкЭfЋ;#ŠЁG­Чжh<ьєFЌЂJВj†IQ—‘Ѓ0ƒ?KщБ%y`jЖаŒ’РжбŒЫФжШž`˜†ТнVмF њƒ1Ы3ƒі€тU]"›!Щin˜B˜™–І|УазяВџЎoј8\!qК„n;p№8ЩaЩщ‡'‰ ПNЃбь‚з Ч ;Ђj8Ўc“їmСДН(-ІЫ:vL >№7–&пнбЖыЙІЬ NQа Ч”2ЄЌ.ИŠvЗнhwСo њ 4EPЂ†#эOp8к*ЪђЂ‚јžeЊќƒ НЮЛы­a=Ђ&kи+”~WMSцК­NѓёЎбnѕPсQЇOaEће:Mщ~`'ЕĘе“r7Шї~|Єщ[mFбqVDХ4MваVкOcIйсSŽрнЭCГ3ш ШqГ=„“ШЉ+“БnSp?*ъХМžbїMпwhБХђЛо@N\жЌИЊЋ2ѓuцщіБ1 Xzдi‚5?м\н?tК­Срс~0І)JTqF;ьIQœyфZРыЊЊч5ь,ј§jўM8l“bh/bБОщ€.bWу‡š%!’ЃaПгnммœ_^н==<bУюѕI†ТЧyhaœчihJМю†€ ъ$ђоОЩП‹jƒ#vРŽБшгё’Њ."[c‡фЎё47ъHŠяЏ?^_пЖюZэfЇещƒacXП:{2‚x2ЩBƒЅ \fR–eQфБчМ}oХvЃŽg=McНБŒsПDРv'а лЛП8ЙНИ>^6кšcqt-У‘ны9ˆ&ѕ$Цiр/эц{F@Cї4aњЛHЖ•e^dy^”хdZfЎ!ЖZœŒMl%`+МЊ‰ MїnЯo.>оп]ДIZрлhjлyтМА˜AШw,M^Т6kи9Уu~Hg^тКя 2Ф8e7аunР34ъЁЫА<кKг‚ЂъŠЂ17ЭцѕещХcXfЂЗЄЪT‹В}@WГ" \№є"ЯŒ VБPњћ8џW‘aIј!Ї[бЄšТZ—Eћ‡КпREГд˜ HAо ѓІš8{эГ^— MVeEс:CУ' ѕ4oэZ*лn2v-ГЕЗ0’iš†LбŠщ•u™з|Я–ь>Е‰5€Ы§! [–2$D];зCУХЂgјl+kš8ьщ^XЮjq‡ОвVIRБќ4љН_$œВnЊ<礼–‰c&іcЦНэСpDВ<9&Ы6[#’ЕЦ’ ŒoŸDU„Јщ˜†ЎьКMб ѓЊšегj>ЏbWчУŽђд5пќ GРŽя8[R,XЈ*sЕнР7 ™nУ*3иѕ+})`ƒн>љx§‘МУъмXРЁ3YЪ’0n-?)ђЌРл„м%/~:Щ„вšэGЎŽѓImмн2 dиz Œ`&Э ’Њ†3MY•?о АŽfКCœЛЈЋ DГЏИ>N1ЇѓEY*'oОuЉўHеэ(qUQuЭ3Ÿd ЫѓlCz}N”РЅЩиPо |"юž8УT5SЈ‹лF4bзЭэfS)š"kn9[Ю€ФаœъЄpHЌЗіг”aИijЋ’Ј˜n2СЖЄp!.ŽЁёНБШ1,У0кЋК, уБŠaЈ пh3‚& КIs=lптьV6ГѕVZb9Х‰Сн[RїнїЯDљ7ЁпQрџѓ Ј&‘тМЉ)јш,Oлдl0‡НМБЇ˜дДM@Љ<–діZн!ќvзЦ‚"КЧ!У‹N \Џ&ОJЋVPІŽЮг’ёvuдЇ;-cS БS^VЭЋМ( –™gRПЯсм7uЬdзЇžn>siЕFВkƒћыWPѕкєnі„эФГеЊ„cТ‰КфK№Po›Zдќ2svЬШvXTФ3 Ж“"РGЗ‡С`ё ћ ЧРxj<18вIХ†еDuгRё‚P |>гёГљrYx Д ™a€(–эОQч vзq7-|а™‚“žVuYјр4šћ€“ЫXdvдяі†љu•eФнЌIŽ!x^О рd?‰#9РД–Ёщр„цЫihШ,^7 ŽжpCоЄу. сЦАЈйЃ%3И“:84™‚uЈtoŒžtC˜AЇK0"ЮЉN‡ДЎ/Џ/X‚Т€@в%Ž*сЩбeœЙЌb[ЂIГуФСОLОg›opŽйАТ4Я=`Э=Z†аROB“ge@{‰cЪD—ЇЋ€фHš„ ў{дhо|<899<јx|м”РE+ZŽ%‘cŠЅЯв#™/K_ч',С‘v‚Ю5џнW|А †iсXk[i<‡AYO#K yЫCиuЊGВœ$ѓ#№c‚ЁўиУйййЩёёйе}gаvЮЉІJ‘МЊЪCNєБћ‹aеj–и Чђ’щG@v}[Wјядc%ЮmѕЦёc 80Wу8Э Ан!X’fYVT5EyЊїиlїњ§NысЎбЃ$]bћЭЏЉ'с$4l‘х% 6uХfЪгаRy–пЭFЧRУюnЪс8B’€ъьŽ™‚sAEтљБV0<ь 6~ъг$Ћь†‰40ФЦ}‹жLqиКЛјЇКš4zИ~ш1pJьУЇк CАpt‹ЭТ3т(Ш[ЃFЃяИu’СяJMьn/ўOбdЖZцސСSg ‚•pžDїлCXNКOШ'яnоr˜^Їп}КНэ‹І­ђш€ЌM“У/ъхВtM ~ ћkcџxЦаŒЪйiѕЧœР+†xNUЈіc‡жРOр<zHŒXCЅК#NЧ!0ЮО2ƒ|Оœ%Ž.+№8G^аt§ё'MЗBœƒѓAiz8T|ЦbЕ,‰p <Он&xU"кm ‚!v#tЧ0uКг&$8 ЖЋ*Јˆ-SМL<іA-/J<œлV-ц‘Љ‰$L ЙЈŠlуw-б5а;jaгit€wpГzОXM,Р†…гtЉзш,Яс€еФёa vˆєd†•tл ЂpзЎ т‰Ю žю‡ Ц IЯu]рИЋъџАїЪq$I–ќ€ћƒЛнэІ‚аЅEVj­ЕU™Ѕ!Шžћјs/ЎэЭ™ЭиMАчЮŒ1œБ1U№Œєp/ТУ_G‚$ О(у?х)іžњ“k@ рh5Ы№p5’гM'_,›)JДшvˆЇ+@V{CйЌz8šТДЃ~3М—д3tШйрTСQяoEmkey^ЮV›yl+"L€RТМšЭŠШsŒ?ЩryK3§dЖ\Ќš* ]Ь"ЬєlО\зžд†iщ2; 0g–Ѕ+РЧюXž“ЦQ’І‘ШA7lpСяNяAУ^ЇUYNtmЗЙЅŠР‹ќ4ƒЧ(@ЮЇ v‹ўГ{{`—bDгеjЕœЯ2WW€›кQgї™!a{rœZnвЃсзB4ЮMQу-ЈNЦБяzAђ#Q$ЫжE’g:З}RPСђ,+PmрaюŠ$Ѓ@јЫ€-зыѕЂ›СпџєR$@AГГчГивDA6§"ЯІ‹Љ+ Š žЊАУЮЭѕЈ&)дЖ ё5№›—ИƒюА?б=Gр$nдщ“€Mм(Ят(‘ЅE9нВН8)цыЭj^&ˆ хиN€9TєpŽ їГЬбСhј…~ЮцЉ&+†‰=ЦЛwзї^U рT$РL Бšюy"быпX‘Ьг­[ЛMы:7ш‘№Б ЋŠСщv“› %j2‡pКк,ЇЈf јvєgЮbh†gЩnЋ Со,ж›ЭВЮСhїЦmлK›jzЉ&ž™Œ‡Н!Ћ ƒvРy6T–1 Žџт^†gа…Q›’!ш921Ь…AЉ Q(rГЩ0ч‘E^qЋbHхЩА’єнQ`НH~м' nс—/g Є[ŠC~ЂдY•РB’;O ŽžP4gк–(АЌцš‚ˆ`Ет;Јіw5T!mHуЋ:Щuц;Ј&1У8$ђєˆщО–;:&ѕянSQ”œ”†UezХњaUG†ЪЦ€F€nлХz5M|Ш"р ’ШƒёDЦgŠЃбXі-Y3M<и€@Їљ–Ш’7WД €˜РЛŠP^ЉŒ‚ mжљNElв&Е оЮCCІ ё0>№їesB eёœŸwвœ:1T~д#1‡Шјљr1-rH–аŒ@Чд MЄњCбЖeI‘PjKР}GвЂЪwюFŠ- Щ А^Џš<‰“jЕ]eР$tЎЧZйr[ћ Я…mї|gZдv:†jм‹Q)fR!41!hšтDЛ\/—ГњЙш‚›cјбXѕLži’Ђ'УAoФ_№\@Sл‘Ф'2Ж*\­ЗЫi‡щlЕ†wЈыќ„wІлmaЫ,R€ЛЎВпХЭŠ0K’ЈjІDyСa5Р! ЫŒ&‚‘ou™%1рvx@№j=ŠшЗHШ ЃFƒінmoвY’Fz4УŠ5QfpR F‡хzЛYЦ$#Zn7•Ћ):nЮaсІњ=НCyр…24HЗнЬц+ŒzF}Xx‚‡ˆ2ЏѓХЦQљŽЃђќ]‡”mu2fTpIE`Сr–ОП—305[uzМfЊЭv кйbЛžКА,TЇzxи,ѓ(ˆѓfЛ†IЄm}д1x"Š"‹ Ь1U-СюІЬ"wЄEГкРRŒP— Ф™озјў cи6 %Хѓ-<БTh+НkBVр…и?ђ(џ„%cU•Ea8wUš’ ™йњёaЛ™з5я ОЦВТ$ќђЋEі$ЯА›ІAЃW№єЮQАT•TЏŒ;ЏRпVQQц‰!У6ЏТфЦКWЌЖыЈ„‹­бauCШЦз KsГšХ јR€ЙЖ!žЉиD[Ђ™ссчлaЗ5"(IG•юі9 ИзCЖѓRрT2*š%ЊзЌз8Э0б9jWХМ™ rХ‹mІБьwY 2ЄЌh‹Um6‹qЌL˜їylРjУ­G€ј2OѕкŒЎё €‘ёљчяіO.Юno/"‹ЙЫФ§ИuKk†щфвwšЮ^oцb‹ѓќ.ђИAЉ9 ѕfЅ]ЫKуХщЫ|PyA,Н]Я €1’–Џ`ЊU>ХW[-жы&вa.РlР7РиQ‡КXuxЙїё§лпояјјёУЩ@–Mы DЂЭДЮК„Y”С&EVЭ Œо c ФФв $јMg PNь$љтъьа^ФМПzƒr—&,fЕ@Ф: уЂJ 9ЗILЬ†2*шШ2dПСXцQxшє№гсЛwћGчЇћ{ћћGэ^kЂ­^wЬЅE– JsnВeЖЈ2ёŒN юF?д;Uj^фЛ/.7§|Й^Ь1{oЈG%А’^Сйд‘ccЕU$cQ9˜Y€fСячЩ KŽeAИ;8ЛяtЏŽOЮЏкћVЏwwўyџѓЭѕчЯW#†eЧCš™Œњƒ1тVZКйbРžї›Аяіq“Y*№"T› =ћ…63`tА/O›eЋŒ‘Ьйf!4Фƒo;œazœљЊШВ,XЬPЬd"pУЩАwrмaU#ЗG‡wЇyu|МЎr>т€Ёь žGУ№JВ‡Р/ўцблх|sгРвœ .!X/4Z@uHLо№ьЋ9"Ž•Э пу:бёX.l ф-ъDhЯђy†Ѓ‘Л===;О`<з2UЎГїі^P,ЧwˆыЋ>\SдŒ:@>модxŽ™v+ёq'8ж@j|мЮ IњIЕ(\ыЅ)Q€фХa”гDS•рћУ€ƒMхРšД3вs[š Ё64ЯBPНк?88юЙБkйќN'*–[ХЦесёЧНЯmš‡хЇЉ€xt*Q”эєz‹Щіagє|ж@žљВ­Ђ0)VЋФzБКk9ЎcуЉEѕ№ДЉ3Й"ЧыЮШX—оБФkИDeЄ_ @jj48џўэ™œb ЖMyа‘ лѓМ0ьX<Йеu}ЇŒиТТsžЦvВЎЫй ежѕД^=5ОљтG#н1`)x3дўЊ„“ƒХНYфјE`ЯC}ёФУТ Я=•%ю!fМoyiџц[рGА–пѓ§ь`џУ ‰Еы!й|WЧFФИЩ“ф XъuЃ I~yШухлc @a”ъ‰з_аЭЊ­)$кѕЂЪŠљb[–MgY†‡ŠЉ!1ї?ќў‰#TC|ШЊпдШУ8jяяяŸLxAѕти‡ЧД>жЛ2—zБќ Ÿ“.ЫДZ€S?>ЁОЧ&ЕЭћєRт!№лa )МЪ’8•ŒўБг`\С  žЇ5,ЬГм›Й|џёsзNТ0Лpь Œу0УŒњtpt2фD3) gy9­›)И‘mEвЌШСшЇe™dГ:8ъ{lрѓпsb.Zn€uЗžcя* šSS˜ $BЋе,дА^w#чˆЗ›&wUтpя†ѓ\сF^жђАЊ*ЂЬИ>Н:яђ‚™U0ЕMГXЬRРсАL/^n:тќ>нJВjVЯSЖ› ЏGe“l|‹– )‘0jД…g=O ж”„ЇŠ0g№Ÿ2БљЛНKeZчIь1vЁ_ƒСќ8…Aћќ†ŒtZ/сѓѓ:…е­@4-9лT0ЗFY…рЁЂб:ЂyЉ§љэ'ЊY/–Г4Bџ@‰а7т$Ѓ#@‹йЂЂњЊ‡Ef№ ќ№ЬрзjОн`˜УЉF‘ХччЏЯ‚Э}Ыx16Ѕєш‰ƒ†ўtћMdЦг#р„‚ EСMr˜+оGчгЇ“Ж†з(Ktш8нMqˆо‘цY’&и…ПЊWохoЛ*|Ћ&Г$ЏјО€”[№{м)pю„ђЖЋY‘eеrЛ-ѓЅиє oКАцQg6ѓљузЏ(oјЕ$ŸЖАG]MзL]ЗёАpHPї—*Ўž2;уЄО ‰S` YОd@СsъшнЩ ,/В:Ў AovбY-:6x RHџQЙ\ФŽёRlњFЕмЄj -ŸЂ{е_Ощ_nЗм)‰Gw\‹лTЎuyЃЃˆw‘э<#-Š4 '‰ГЊЪaкСшДЌ›YH_пЧCRЖВZ‘0VOЗЩYQZЛ)^s/šШ5_ьYт$ЉgpБЏ_ПюlFQFШЕИ7сЗ† ШгЛU%)ЬpЈ˜(ђЂrSЄi I’—e‘лїТ4‡`—‹=ЯђтФ "И‹%JУЯ `E@‹p„(6ѓ6 ]ѓХ ’YTдѓхvg4ЌŒ/ЯИ-™XўЖЦ2–R9aPЩе:Š PЧ<Žt Мк’Ašх,ЭаЕƒўqqД(™ЈЖeйaьу9‚6И™ВYen+Љ–ƒ:Ј5іW‘eОXУШБнBlО„ˆВeЫiNЙ}к‘ЙЭ&Uлs]?ЋJˆК"5`ЩEЌЮѕјћˆ;ОPvЄЈƒтћq†гюЭб‚8HујЁяк€їJм”Eax‘ЃH,|ŽЇ ИчWжЫ…— МGЯZ аы#ф9№-нpgD mЊNсWКxc%ђсGuрƒ<ZP€+МNbэњн^GO2 дž$А4Г,ЖQvx.г4 к Š—”Ы9$іЭ&W9r4hЗG4ТWРl/ЮBX6/5š7<™7уВ‰ `ІЎŠŠoбГЗИЗВHx‘AрэЁЂ+,­fSЌ\Я jЇї>М}{8vуЮ В}Ч9й 7ш";щѕ&rдРњ["8Ž$iŠшH`М’ЊІэ‡Ўѕтр4–dК`љА@ЅVSW€иСъ :˜ xwžYМˆЅgћW”"ГЌSж€ЌЇ9&D›јќюэяяOiЧђЇЪСuLј€ЉАЈЯ@unЎ:|0]CF”З^…2 Yщё˜ИˆnК>Pф—§†кЉiоb‘іЎРЕ3C№qЬЈМЛ“^4ъŸНлЛbt™ќ)Z1.R/~ћ§?ояэп›шFA@АЪ=ј~иКа q§љЄ#ЧѓеŽЖ DсUbВ‘ШAЏпЇvЕ‰xШѕ]eГЩ*  MШDјZvTo0тэv(6ы”m]^\œ~|їсА+k"'њхЌi ™1Йџћ‡по}ќxТ"рKKneЈŠ{{xјщшВu§ё§9ŸуqF;t‘TWА\RS˜о}З=d˜3€iпЋF*І…юaр-&ˆЫj0CкїиЎVѓмхКwї­VЇлЃdM&”]ВћєыЯwН‹§“Л‹–iМt\,0тdяУўЇƒ§ЯƒpЙsfмœ_Юш4ŒКдПъt;CŠ—Б–ы{+f йD D]b9<Л‡hчxчвЬіІ‰ XшЕЃ†ЊJуЛ‘•7Э4гКЗЌх]кGjŠQe: %0И<Иoїю/ЯЯЮЛ&Дн.§ Зщ—гwRБ\uryнkпї',ќќwзЫŽYH{І!R”ˆїД`"ŒhЙY5гnVlч‘љŽњЖЖЋк”ХЩѕYOr\ымђж№&!˜qžЅNєHIвl‹~Г0JœE^з_.jрŒ‹9:Ђe`5{ћшІsoš—О_6‘N_1А№š ,AзќХК)тt6‡IкРѕLКŠHŠHнŸ^опп^Ÿwa§y†ЉЭЧœЂА§ыУsR„HІiРYЫГ]р;еrЙlfXd3гѓ)aЊЩ““vћЭ›@њяЕ™тщЩэіпб <ПѕЋ*ђќМž ЦЄ`4о„№d(}w3]эНћx:аз‘YнБЙuquwy|~t:С3UW%TіМ8bАld€-чH "ˆЫd„жЩM,˜pп_TјMiъВ3Ђ1~ XCЏšPW­ЈšeeSЯWѓ ї7tй“$аїї|`Дn€VъJћdN*Д?|<јtuyI‰ТюТ€И; іs8Мeœ46% ‡џvЪсщ†ЯІ)§љнЇ;ŠЧ[H{†ук–“&ŒЪТ“yARмjQТ;ƒРЊуб+XнuУЩзЫDW8aZXЯђВJpЃРw,qдООМЛПКМ8;=ќјщš2=CRЈƒџ~ТI‚тЄY`GПП}лъ"9CСт'HЗШдgЅ-qXŸ­fЄ( H˜Њ№?h4Сp$ЗX- ‹Т8U Њ2-Ыаё ™ йКО8Пkнvњнж5˜§љŽ‡Рж}џoŸЌU‰лЃНїя~Лtн њcњFMг т$ЏKWb†ŒЂѓydро[ќAЃ mч„^Бš'–&/ЮЧ’юdycР[v,™Т+ПНё„уЉёЈ{szА9™Гп~{{ХЪвшєУЛпћюн‡=М#pt|еM$ˆ8šъФ@wKWсњ„ЌZљМА ьЬ:5k јkXЎšR0s{№щ‚0МJ8в[uwЙRІЪ‚РMКћ{ЇƒСсяo?Ln?О}џўУлп>|>??јxјљшфтђj `”tK5ЅЃ э6#Љ^U‡xГ€’&ўXЈц лrš7БЅТД}ќїНЃ+ж…€ќЕUђbœ6lH2р;˜оЩћ‡g?ьНп??љ6у$>9яїNї?ž^AЂЙ@ХKly•˜2}}вІD=Ќ МЖл"ќБ Чi–эW‹:s4E:{ћ­іХHГС}МќщЙ^ еMыёS!w’­у [яёПяР/о<:НИЙЙiwnЮONЮЏЎ.ЮЮяIйr§АЅ нуƒЯїœjІUlЈЛm'љЧюcгџ§j^ѓ5ііИЇ’­ ї[‚8ІлgXBca'žХГЃі)Xќі-јђоЧЃѓ›vЏзmЗК#jиыД[ЗзЧŸЏЭАкLхF'ŸŽї?yйЮ б—і=WџpHКсXy>н?kЗЌˆКДFГ ОиЏРhЋ л‡0Щ0гћЇ7­оˆ њ}’š-тн‚Qыdяно5ыјЁgi1Ўzg‡mFдЂ*ЖБ`ѓGŠzwƒ‡ќžЁM‘ЛћяїNю1fЩx$hћюyЙЎŸхY†яVЂЌ2Ч NїоПћігu˜PМ$В‚iat8Єˆtџђшшš2ЯвЙжёщёэ№ќ м-ЋрАќУ7WExѕi™:КЊRяўуэЇЫіцwїG,м‚NЋFХiИoj€ф Cdщ>,Ц§7#яП›ŠŠGŠ@Ўm БЙ,0у1ЁZWЙёАzrѕiя–e#ЋS€чЪп ‡єххehj{№іїЗ>]ѕМ4Љ`/Й$ М0+№ЊoUЅaФ˜б?]v †сT р‰чР`тШл‰Pуuyl$ЩTя>ў№ю’–d#šОЁj?|SNпЭ3СршнoрІ{{{чЎ7Х„Ѕр#ЬЋŒёb~9<…Щ1tчј§‡O—З№ŽBRЄ%У4ta§ОГлБ—БDТ‘nїїоDYs‹ RиwЖ§“еKcKSˆѓ§їoп}јА№BДПэ\…1n™WГ"ДTЭdWylr, аџрЄеЛqœй:MГя’ш~Т“Тк*ŒlO †Gћћоэ_PVЂ"ХX§ЃF ІnЧxЅwДџўнЛНƒЃЯ‡7f Iр€ž,‡žEК,+№Nт,OL^˜\юПџxzп:О*'рњXP*Š›WЩ“%ПU 0T…М<:љјnoџ†—e+Э]Uљё‹Э€$=шдј#Т‡O`ћХу}.Q6§,ЫЋz†Ѕ<%УфgžРѕоcоОўpH№JZ.фj lŠ%^sЯ60‹SИћыіщў‡п>іaт§ ря­КeУЄ№“ЛЃOŸONЮNOonn{C’ІjУдЮM“щyРў’†27>~pzrxјПЗX-0wK№ЭгІžЭr№kw‰†Ња№m7Ї'ŸіЎ8EЖтРxлСИё‹Fbк7э1MУс`н]kЄJѓг|Ж\,*,јfЕ˜wјљьфјтш|Ф[ВЋБƒШЉuб`qm7Rd,Ру&=–.=МОIВцМNwп!рІлх Уˆ`p?jаŸM7ТДZ,—Mjaf"Y98<}ј~џ~ТpМ:XHTW5ђхjйTE€…ІHИi–Х;Іei|ЇЉV•‰x ,rрЄKь.Sbз@bGтнdмcНZNGDШ I˜џ№{5(]ђ†мoЯж›ѕ|šAPƒЏ‘иaыОGу]3liсинgсїМVO„]™/нkг”lз†7‹ЃŠЩ+nQcСь<5$žT7Ю+ итшѓ1 Ф%œЭМŽ8цU#YnЖ›Х41ААezз—N3mTWЯCп6Х!}GХєџ}L†эы(ЩЃ]{ ЫРЛЌЂ~ŠлЕK˜^ŽєИžз…oЊ2{<E=YЌ€Y2cDљЭЎяq0§ю˜х€/jІуccб/(ўœ&­МЎ;a^цxZˆw MwђfЙлЏ-MpQб(`Љ%$Ё{вхy5Y–IBTнjћјИйlW…ЉŽoВŽ-B 7­šЭf†ЩI}ѕЎWЄІŽ;ŒІ9Q>н7”ЖХе|‰›ПыедІ-йгХbъbЌa‡CFЕtЙH4qB+FŠлX;>їUЛУ`3– ˜ЏЗ[ ŸЊЄ§„­љTj5ЭЦЦХr1Ÿ7u3_,V‹љbЕмnж3жЁьЭ‹\WdnAиЏ—‹'›хЎ\XІЎŽeіaМЛFљ№АШ `ЖЉ*NžМЊбšCпwaЉћhє ЗяБ№{^ЅQVƒблЙ+ ВсЅY {грN-„’йb5ї4ž“Ьђљыгf–gгхЊŒ]›р6‹ЭугуІєUQСЂmеЩ_ЗטjˆЬˆR l20­чhєfY%ЖnНzXЏ—аXw›UjЊ*GЦ-kўМIqћдN‹З\t•'a%ІыЧЧ/шЯлT@™Š4<>ЛэŽFVPГэѓзЏЛBЙ‡%žЌ№ŒсиЖ"A9joЈ{3|œяИ?єтA)0Ѕѓи ZqЫКЪ"М,ХpЊ]b:FЃŸЖлѕ њlE™œžн 'cŠЈЗЦз€kа‡o<Џ;QIАЬ]“щѓvИzкж‘ыНrєxГ+Oїˆ БеŒx-Pt…Ѓxе™nŸОYѕєј0ѕБnкRUђьМ5І№цК‘бX'‡6‡и‹@4МЊžж˜рEJАќ k4ГРqЙуKcn>ЏC]энpzАћЇCЃГjV‰g‹oљeL&нќё?џx\dŽЬvrўцЭ$YfлmnФ€р+й<=nБ!g(І‡70ў2I„!йЌ™M р§$ I}кƒОќёЗЏOM`Ј"ЄФ7xZЃhN:XИеЫ†Ю!ŠЌPл(ААIЄЊПLшOCTQTгЊц)УЩІ‰kzГG˜ъЏЋP—щЮбЇ7иbTб§r§0ГevDkf8нШoHB2­ПлlІ€›?QЮчч {šўЋј5~_узј5~_узј5~_узј5~_узј5~_узј5~_узј5~_узј5~_узјIƒз? ќ0tџ)‘`­ Isт›NЫ4дџYХЋd{:MПтдЪ™LQ#хёцгдњЧмЖšBхуŸX§џвЁ'EГƒQƒ[3/ыЬњћй”oeŽ‚›Рл€ЧЫ“u5#ЙЈ}ГœЯw™—Ј1ЭэџъбЇiиь˜V EbщIЏ3шa‹у7c=.gKМwИ^Uyž†ЮЯНЛ№Я†ьFyUЭQŽЬ(Ћ"ВЌžF&лКэ1<ЯбЃў}Ћр‡‡jXЮѓfV/7ЋХВ.sџ_9?ž‚o`bЃс,ѓ-еŠЇUh‰,Kг$9цкНћћжэ==§Дœ–yfs”i­ЫФњыЫ!I;)Ј$Œэ_ъ" Є*wBг–B{ЬUЋuзКkїп о (ЭKваV5Пк.kшОі—‡lF 2”R@ߘbѓы,дIЮOЊЊŒCпГzиivКэNw0ŽУ#k†NГ<РцЯЕб‚…эЙpQEXzМ‰lžЖƒ Œ|ЯЦніхig0aŒFЃ!ќ™HŽчM“УЪ†Ў уПвfЩKŠiƒ’jГд’% ЕЮ2Oge7Hѓ(№l•v[WWиhs4žЃaЏлiїh=H‹й,ѕxRС–ўFlШneНЫлЋх4ДPДšЯbWf5/J#збx˜шЛ›і Цc’š яo:ЃюM‡5У4O™UМ8Я’Р1ФПъnхFмІœ0ќBсПh _уY#ˆъ “^ћўњnDN‚dYВwг-KЌ†ђdœ^ExчѓЏ |t—5р9зАлn: Џ…х4ЖХ!чО-3рз—’"'$'rdЏ'К€] ‘"(^ЕPЊeОžњš†НXў‹Ч§7C7JЋ"ЖU ћШњiъ["o…/ДЩXAн^bдk]žї9š"Y$#бvКa&5–рY!р,жu€=nея2ўГƒ&oюD7L3ШФЈІ™NЙ Х›~8ђhФpдh8шЖnЎЛ K‘œРŒ)Х ЂЌ(ѓиQ$'†ХX7ѓѕ<ѓPђх•~іzьѕG§‘€ BIшy>іЭŽcOv8УёƒiѕXxƒDшЮ„g#р5Ња”Ё~ dЖТ+тЏyсыЗ›ј?FТЪ5bPгw=МIY”Б-ЗЮ[Дjk [Ф„шЗћНі пЅ)–gйtьDХІ(ЁЮЊОф3@ѓКHБHє3.чџз uгА,•0ЈцaЙYØЯ2Wc ИN”Њ{wйЛлoї†­.Фh№jеАLU5LgslЃ†зрWЫEгЬЪrњЫЕˆОЈŽэzЎ%SCNU5УЋ‹*Б5–U]aˆбdBNК7чзAїўюђЌOŽGcJYj Щ|иYa ‰ЈlЫ !?-Q„НiЪјХ*Лb€пЦ{4•хdoч/fЁ%гДВ“цЧнХ3улуѓж§ѕщХнi—†MŽњУ EЎ:КЭ–и%RRmвjндГy=MМзщ њ€‡lZbГУ0МЄ^-r[”О5eє(Eф‰‹ЃЋГЫгуіЭ§Ал›№XХpluа‘§А\ЌрIQVMHq–U]Žљ3X%0§7ŒщФuВeA ѓ4o*пdяh •u4™ярА(лН>Л=н;ЙМэvzуqП-/ЯUFЬяlЙЈBGC=Х„шуgЭ4vŸpЯбMšVЛ^хt<$W!ћ’ЁЂЛšтнјьbи:>>:э‘4ЫгZ6пѓMšPнtА ­Ћ"Ыаœъd ѓѕi#‚CУ†“nк4u€wG–ЦHIт&ˆ3†їw!%Шšи:ыђФнХI[5dYU8šїpW"Д ­Жр БГ;щ’Њ[4ulНў•#Nй‰ž‰Ї[!Ќœrw+8‹=C!Л$Є€љvні}ЛOаƒ‹{оЫщЅрXЖЎЉ' ЊэњОFщЌ„ѕNEЛˆ\ƒ!$3ˆXъkƒkзLфa;"ќмaЧIт›*йc˜ IR49Ёžu!eЖЮЎњƒAяzdjМij‹FУЪѕuZўSЏ{Еj2п9УNj'цЋЛД ѓ[BpUeAqтjо = уŒ6„1Э’4‡Cдt€mЫВ7ћиy]вrqCз%нp<`§ЈjІГff—О%ё:xG“ЛцЋуьтQхр ŠЂZ!*JЇрKмО0%‚т(JРFоВНщ!ѕ WmV3-yDP7Зš2@Щ†eH#Ъ т4ŽгйzН„o”Dг/Mb[Џюв‚beюiŠЌh&И€‡4ŠвЂˆСш% €9ŠхXьpХбtыИЃjŠ(2ЌJ_\uЧƒNwDrŠЎён[FC%b+j6ЋЬSEйŠYGіk6јлЩЎslюЂВšnGѕbбwv‹Р2И!+ 4EO(ŽЁoЃќ CšЎ†$ХрoGЊ&`y&М,1їG]о xYН]&ŽoHOY*ахѕL&пpјФ45žЧfЭѕj9oPДЛLXˆcA‘PiЅРPpФД-EwtE‘™1˜ŽЉ‹ЂHёт˜С]_B§нpыmš’(фиаVyдxЕщ&Ц‚ёj"ЫŠКŸ7 Р№Эb1ХKЈТ„Сіп"АУ„PЎЈ"/аœDіuzCжВ,TR2~2w€pзїТrЙъ"№рщДє I\уYЏtcD0(•P'&D.˜шxʘ˜ТчЈг 1ЌЄH/ˆВvБ$ЩNH!жБC iЛƒ+(šЭ3ф ЫЛ;У(ƒ`=лmИЩДєtHDиЏВ:fIЈTgŽЪƒЫLtкA>_€Gk+ЉиоE%ВwпƒПj29&(–W&iQ–4lHЭгРh&š 01МЈ˜Џ›ФЇТюd…ЇбœсЇИв‡>nз›2oъ" F›a9ŸgЖЋUy–Ъ22 щQ„ `gN5Q+zpvvuqrАџљш’aсЙLЧ1vмЁM#ВКшЫТ…UМ&+#‹aнDЎ­џ/іоЛ?ŽьШхy3ЋІ' М)oг{я}VfЅ)CіМяОХ]Н}š]АЩюў‡W?‰….DEЦ8чfм8?;ЬШNX‚` K/œбЋ8yГАM™мЯ‰ЦBržs Њ5§єЭ›‡GG''g$'JАd]тІнЙЄ9qž%БчІЫ ИvƒЌЛzУKQЋSаш™„sк§$OгФA™ €BVW‰л&(s[WFиыJ!пЉ"7яžžŸŸœ^нt†sHмЃСˆ5™e8†šєІМю'8*<€$ЖPeи Њ˜ Œ€ОhВШќ б€з4нBœ Де§ф]еŽы€?+ТCѕїгЃ$œУё*(ut1ЌЈЇ{ђјњъn*hšЬ‘ЃЮ@0ќ8к2OВВХп _Ш}њ&№b†œШfYRPОH CјDд”ЭЈY/™У‘yЉ=Fаb| 7Ч“qЇЫjš!вЏ†8эFwww#Х’РэCСђ€жрщ8ЋЗл*Вр›ђЊtЭPxj<žNG/&|&Х^4S`H†п Ъ’шB2Ѓj‹sBaKтœ~4cЬиЩэe—т•#чЄUђ‚mВу!-sмфzŠC‡Gcбrу—эyГй†пС‰2&јiПOюšЯў№Љ$gшьŽЂP ещсТЃкTЁD)DA•žБ4Iq"няŽ (дœb€Oy ,K ЬQЫ“$Ž#Р&СшЖ-B ѕРЫ7A4…!P*wћ$ŠЅ@~ќЃЎ†Ge!ЮeС‘№og§`‚^—Ў$юЫˆ—І$MCqa№Є_вLD3uгжeœG/ˆЎЋс‘-O;C …@Зк в‡.кѕfщj7`3=N9UGMyѓЛѕkџЇбРa‹ІHрCYАдt/Ш-šЖА8!PЈЮГ)1Ÿ" Ј:Њ&‰ЂтxЦы†Sкs*іќђz"kVPд^ђ8YT@a2јŽЬЫC"‚пщ‡ќЦЄЂЎ;XlЋЬн‹3Г™ЌёšЖtач!МRef ЅŒ:ЋЪ‚ФЯ‡иˆVxž…АЯT аlI}vv9…ј‚ЏНg[uЛкm RЕ ЫФЃ+€шљb‘јЎёЩf(Ž,[œ$8&РcŠУкQXLTw4…,d Ш’щkжяM9 ">є|?Д!3"KAсиюЩ—(‡ЈзењО еНЊAЏ—х7mх?еДЄЪšŸу{њv™Ђт#ЈN^5+%FaŸ$АT‘юL np8Зœ™Ž'$ ЫБ€№Ќэй”!Xн6d†#/яH =T UR6ЅХЭмнyXО анШГ ууІ Э)рѓЗы&Чqз‚lІјВeшšщЇ‰ЇIЬрьšр(бl:œqъ^ѓ=TхЂ"­пПюr`ПbpзЇЗspjМ\oкІnЗ›ћmЊЙбŒ0/ыч№ЗЫї?R!PЃЛ>ЩЫŠYЌ№уš@G Z#BYё:ЗM3Hв@‰л““Aqм|аPMC„ "SѓХЫŽ+(ф]gЮІХuo{$НЏС uЙlwїыHрЈY~х5ъaз‰cЈ" љˆўюS2Ж•РЯКwSЈф^БкнoZ@IŒ0ЮБ%ВpФШ„}8ъоt'ф|63šІЋ2GpЎ2ŸЯ'‚“ ]BџЂЯk ;ю)ХŠэfЗmQМwЗUд[е5 ‘Žzё2…A єН‡П*ŠУЮєЁ^шaНйmšиY2–чЧ_pв,і4‘уйIЇз1Xуu‰šSЂa’šХЂ3сgggЄЁ™’ВAšFrЙкэJTщтУ‰ф”61aу№|Q*\џ>Ћe№КšЃf@VОоnj№4‰2,†сРnЋЊ,ЫEтBа№ьші–Р#<]œї{”i ЌŒ2ТРkЇŠЇ ќфтŽ54Њ? Л”5lЙuS—€=Ж bEŠоrЕŸ@FЭ~aGНЙякњЗгfp8NВвЂ-4ФyoТЃКН›Ѓ, &[Ш††,ђфp@ в“ёQ ‰Ј№Pmhˆ.ТØ‰мŒ6ТЂ(P‹iЕ\nжЛuсiŠТАJиn›X›0йђ\(ЋђїFAФЪоPЁ†‰Љ!бНЛ)Эђ’Е+H|mлр`R]–,С№”ЩqР1%˜QЗпыѕЧ Kа†ЃВP4ћУщhФ*F/’МBe HžАїЊшЃЈ'ЋmуNaыXФоїyZЧ АЂ ЂюD@V•ЇŠдЪЩЩnЕЎё ЯM=S–xЄ yтВ+щвјВ;щнн\^^^]КwЌmл*ЋђНЋЛ Џ˜сЂШŠf‹“ лѕnЗ]%šРHnЙйж№$ŠnYе№ эяЃзmлФ Ц PШ4 .щлЊ–>рв+{дГІ*p0ЁФ GHtїsлщёРЫЉ9Aѓ4й=ŸЈЊiЉІAм€бг‹rŸ”W-*Кьvm@]лнЖIЫёгВio#їRОуЈ ~‡ЁˆРЁ€>80ЏV-Єъ:ѕЋ RƒzГоn›2 Q!\‘Djк дuh­D y  е-Мь@!5€ЌS§1ь1HyEЙк@Њn›v’V>ь’pŸЅ›ХbйьЛфœ§T=MxvTsАuYL Ђx ` Ј™ЕaЖ<(ФPŠ[ДкЕёrdЇЯ2]€ЫтlЦ;Јлш:ЖcйšDі:=Ц’EH,3РуN\.СТo*4ї;ј#ЕYc§яЏ6їїы2@M\Hп†њь О<ФД&цљ{щЂX6(HŸЙї,х.ъћёtЌЬуШЗсЙєn'$.хІ |iSF–gШдЭсœF GU<риопЃ‘x^їЛ:тqљpџ№€ѓq‚q8№љFгћЏ•DTt'\T!лK9Š}aп Єь^jлхbПR\=ООЗeЇ€KШъ&F‡ЎАЫњ‡]ШћднЋ†f5ьПЭjп6ЙZCБ]oа\Дњёсa[:рzNƒ“ЅgŸэQ†a(;Ÿ2ˆ#14јќ ƒVˆŸрбBЎJQ0иFQyЈінY_uz,›‚(Ь$CYG‘^•ОИdŠј”WU;ШšЖЉіZх%HјдЧЇЧ{јt0zЋ"ъџA щчsE<2д5a: XйŽы}№‚wсAтКпAœРs]зЈЮ еL6<Я€ЄвПшА’D1:дmўfЂ˜ 'Сf”5Uш4Ў;˜ (№ОІ15…псоCЃСVtє‡k7(Їˆ •˜ЉžпU!Xј&SкJЫV`iл,KxЄ†ЈњДо7ТO2Q“‘aPоPEІ}}Ci<С*2=юœ E2T(ч’d0Ÿ{ лŸS}BФщ›˜p€цH’•uГУСрgАљщi іўШX3žџ"F‚§иА 8^ѕlжešфэ^ђ чьBЊТ юKPф)’Ђ^DЩЊiяŠ„ь.Jмќьны7‡З“ 5КР“UяwxvHВЃ)…Ї{‰HРc‚œ@њп`\пЃЩЛћЇЇЧ]И@R€сBь=џх3" iрšЊъ, rЕPЊ­А‚­О†-Иgы&Tx,fŠс -гщЭLфynо§ќіэ›—ПН§єщфшнчюtNiьнœвм|6&pД=ƒ2ЇћАAДѕ~ ‚Л PЖm ШOГ\/BпБži40Ў]UфЖ%јЕ-ШТРеђЊ ѓпnгц№+’ЋI@“ѓў”ъЮ Ъм}<}юMЏO/zˆ &НСx6AјТМaU„jОйЧЧУУ>ЖыМ(ЯѓРužš_1U@Џ–‘ ЮЉ0єv˜х*,ТњRM„2M’A1!Йс˜%Ў>~КЃЋ“ѓС|<с4ytєњѕЛУЃЗ;ћ$Б J;s, /%нg&HMћф&пcђkАѓгOыfћЯюЕ–-/YTэЇпoJЊ)oЂЇ!!)ž™ƒДЊCбЭР–eHVшŸп^|Мf,Wч‰qЗCКйГ“SАћѕa—єOnEеPQЭМСtН/]рkдцЛŸы4FХŒM:ЯюX–ЖžцЭwah Їхœюwы2іѓСc­Ћм“YšŽgН,Уqнзя>œбžяйВ0=9F „8qGчЧoп|Иœ2юQцTТНЈт€т€?lkXы}aA”…yXз@kЗ9 Зч†‡lтШbpm !љXхyЩoБКl–iАЛU.€єg‚%pš„ggдэoЏп~ш[G­Юh(Na’Јчя?|<ъ3јІBGХ- (FmИЈ Ќ ЌWлНкУ§узЏ_р_(дД ЭчS.с4$Хmрcж…IHаh4Є’hКІщиI`Y–cЛЖТ3ѓГМ~u"ЦР:,Uс{p'0Ъ0œ}ќx|ЙOамРїœ3ы(\зпііvŸA ЂQыъыяOOПџЧ}f~Ўбœ„ЛВlІ[иЭлUцšBм-@ЛЊfн.\EegQ-ђ,Ыyžи39xљњuЯ‹ќРёLАšƒgхИŽы'я>_AВу Ыwˆz) Ÿщ7гЖл‡oЩcЏн№ˆv]РШŸџb‘ФБтКЏжP —eтА+@3ЃЁМ,C]фdјE]зЫЊ.ЫмSјсћ7Џ˜ŒvQ•V–4№ЉDQчэч›>‹BМЫІZ!fЈvьи9Žh•užіТOрp€# j}ЯI5А2jVeŒmчЎ‹т%ZŽТ|œкЬ>9@їeрё[™НЛ~ѕіcзJ ќ0№m]У^Tп УŒњxxqРЯ+мСЭЊ.c€Гїе)З;ˆьэу^жoЗз~A­Д‡ЧЅ!nыe‹аФГРHMwрчэЊє!>9^МЂ$<‹д–gПMŒ(DЁи(гpН0 І§ъгщљˆн|Yу%‚&ЕеНF:Tr%Ц“ ёўqЛСlНiњњT ћЎжA7a•ХiŠWРkЈЙЋƒalLд /ŠФ•‰‹ЗGl\$QˆНށяІ„№Пр?"цњќ№œфѕcЛЎ3G•aЁаКТj›‡н7H !Н§† :О,mUќЎЗЮ xMƒэШRјjВАЈ/Рыѕю1gd|AЋЈ`6fb0ЬQЧg'БhŠœŒVћž™#ˆСеQ”† qўў|*9ОSЯlьЌšСѓŒФђ+|€(ЎЙЯгїћRV?ЕО&KєџедЖZBARv>!y žЄЌшс >nГО ;*d]“$р$КЅMNNЉИjы@ћ8ФиN†ФiZфЁp§сŒаМ4MWХ>NUфс1 МT?о]Фt‡:iЈ „a§єe—Šў|™—ѓЫЋСŒ†:GЭ)ЯШ,7ЬлЧ‡Ї‡-~ћŒE8Ќ€ŸRa3В4њt0Э БTYFшzАеsCl~Mbј#)šRН=КЄ-`МŽЊВ№œ$v"Џ/Ыт ШУ^жW\_О<ЕќъgGѕљ`FБ<>} ­РІ_oQ† вЧvы]1:T5I8a/K]М?зЏ-РB№5XAц‹“$NГџ"Ћъ…58К tл›Uа4жtQTьjЗmV{NДWТЬїˆС§А[ИКњьnЮkZRubžЂ‰zNc˜Кuf,ОЃА“ШRІчнСљЩй,k АЦXзгТ#LђE%eеc€сUBŸМ?њ|еBЯ‰#Ы„* HбfipтѕЛ’Б `ЌV [v‹2№3згѕ7žОўўћW„а!щa|є%qŠc? hB ћC1ЏŠ ћfЃ JГЂX`5‡М‘р§$ђь0)ЋЊJfчWЇw|”šz˜x.йЎV њКYР7AHl›ЊŒ]/’ъfЉm<[}аЖ/J-rћ/П}zи‹Њaњ|€ижd\јVОkЉ‹З>цZ\yћnx`ъ"Kћ~Г<Ѓ$t]№:XSf.zJ‘ц Ёёў$hƒ/№ МŠя-№OIжэ(4ПУhРК€WˆП~yР“”ЖХc1Д|еnrCw,гюh8ЁhЪzф‰$Ь‰‚)iGЂЁŒьJ@F`4dы…УаМnY =›ђXq-л/‘ЗЌЗKƒgˆ9Эсё$ЋTMїCыљ/œmЫУ{ЋћЧ/_Зл5Є_xrйjЯрр7ыM\Уp-` NˆˆŸђ иuЏНРE >ъNœpП|еcsw$SДˆчй@ац'jТ>tє6•™yПзx ћЪОеФ|ОˆzBГ\?<оЏЋ2qQu]жг=CЌЗ{к,|™Зр “Ў2Œ—яC!pСl(п=}wDЙ@HЛ1’x№6Wd8ššо\ŽxЏкЌ%Ў`Ÿ„GЮˆщdNQ6Ѕa„h`ДљlœЇлxXыХФк"і,`€$oћˆч@ˆovл…2ьЯhš“ŠЪЮ%j”,ђ]kИM|~љъœЏ#ьпg˜QLŽ–Єщљшњ№ŒBй0Œh@`4 3 јK“гс8ћпŸk3SѓДПXЗ$Mp3^ю‚Љœ rЗr‡б”ТюQ‘f-М`]І‘oћžчpЇя^Пzs%ј^Жd’yЉД oFФ||}x8‰€дяNзPKcеыe p7єf%(ќђ=ŠŠaъ†хц5іo›!4ЭЪЗXА6[д!‚'Z2——зw§ЫУ;Ђ”ЖV—иAЯHяНўэхлзя{v€gы^Д(! š-L?м†нЃ]w§€№>hнДЋ……-‡и "с ыёœХГ1ђЯ7š‚gЃ™n’с= ›OtнŒіј@o"l[ Є1?є:ЗgЗsQтчЌ‡2O‹8€Ы|~ѓіеЋWoN|#р†YфFbіюе;8;??КR*xXэzВодЋ*2ёF‡,ё U~>Ѓі=•пїў“ OКћєЯЁЭd _‘Ќ№ и@‘.ЊX•сЉb“ЬЯGŒ[6ѕ2“ФšwFуЫƒЯw™ƒъэѓ—ЙЫS‚LwOŽЯЯOoКTˆoружћгšЖЭ}ЧВ oѓСƒеd^њ^§A’U bCт8†эy~жТЦ"лќн-=8И}Кi1vHЗЌ—‹$‡МЩXœsІ.к!иŒ n9ЁDt$У2ŒРi‹<С k<“РЌзЄQрAЩбŒуj>#ўР„Š)ЃŠ›e04ŒDќŠ,N—иїАЪ vћџ$јV ?яѕ#Сњ­JІяb'’хй†X$_ФjяzЪ‹*<8€†КЉšБoхиѓQfQ’•u H)O”-мMXpѕыR™p№А(ŠзђсВМEл,тЄ^6лuДїнЧš.CЮ)ЯqiJqсYcЇуРЧт@Ѓ:—#@Щ )\МФЕЊ0ЗCrХv&§EVІoЮ‡$љЛмfЃбh8н; ЃnyE[њКb†eН( Uе`„‘ˆ1БдѕўЇу.%aUрц9m P(OvяnŽЏIivY)А]"иЖР ВЯHЌ €‡Џ9†"M;Ѓ?f3ЩŒЬExі:еАЃfЉ'Yй2OЋ%lЛES4д№žSZжжfяЌЯ№˜И.пїАœ™\Ÿ_]ї‡7’УcSpВ‚wЁš `Вˆ]d+­a3Т_љА@ў“РCжЫ Џ …%ЭtВue‹@žЄZD‹jQЖ{щyоhФuS:АKŽс&яўŸЯ$'ˆЬьђѓЙi†з3іhHЧЫЬЫ8\$ё"6Eј{Х-Vљ– l~з~ј"ЦOРi{jЊuЊ фTаb0!> ! ‰?э^о2оЂX*Ч247yџяŸI–хЈљTŒВиІ;’Ш,„КУYžјщ"ЉЮДƒЯlж+ YoMќ2љx4š2Вю,жЕ'‹ѓЙЈFР‰ВХВШ WPђ ]bgУЮmgЬюŽхјщ‡ћLaуЄ`-–еRЙ=ыLI(2šГ‰Š<gkx:&*~Еi!}xЖЅkЊ№cНп%Њvв6‰.ёД ЄЊxз}љOUЈН7ЇУnŸ”-Cт1џјяŸžуe+LC›ЛzћсМ?™NiTѓ6шBV.тЄLu‘&qJМ(Œ'ЧАCОя я_Џ)ађ ^ЅІ$’Є(ыQYтгx?Р„єСs"0QMb‰q@тФйћћD‰ЌЈ™5И>z§ђхЧ‹Ю]g0&БОкф yщТќzШKFод94 /?t™|.A“Сцe›™€0ю† q FЙЬ‘z6Žˆ]"…”xщe№њпf€6DђцуЛїєН=<ЛИККюMI”ћГ,;ЩГЂЪ žКОe$%Јкм…иаq№РѓгџХЫкўКMX5‰)sЃѓУѓ™Є9ižЄEтЭjr WOMT=4 ™#Їs’чЏћї7]Ш5уЫУ>|јpxpxxxz{г%)š/ђe•˜"ћЊЅ‘­ ьз@ FOSЭџО(xœу&uы2;Йxџюр’ж­jo^DЖхz@Л€‘Њ{“50шТДлЯN_Н|}IЬ:—Ї'ЇчŸ?Ÿ}>===:8:<<99я3*ќSz˜хE ОрoюА…Џ\F–ŠIм~РhjИэgMщ2OєŽўэЗЃу>@‹Hkš–х tЇІ`ŒЭ|‡ХљесЇˆ‰ЗGЇŸONO/:›л›ыЋ“уугѓГГугЮ”WСгA д д$ђѓ‡Г)(ёrx• М№#З]xl8‰+АJе9>шАУ1` ‚Q”$ОПЖm &dkгRDx)гџ|јіхЫWП§уелwяЯѕ†§ўЭХmШИ{}й!$УАCјт8КѓсјъЌG FXцо Ф+k?`4‹FgеТQСhцірJаiщчФYр›-\ СН<$^оCr #VW8’ рщОUщп\_^Мџp1ц%wY!8§сбx:•‡+ax№лЋУ;ФC`ИЌ­Y†G^~œчi V›ЁтЉ IOоНїЉ—пСС‚ЄOЦŸФ2T= Л!иŒнN,O_Мz{9% є1ЪQџ(bТ™gЉFІЏоН|ѕњУчы1+`f6}яќВT›8p—’5UЈшУOЏ_П;‘-:АЭ сЇгиЗ-ЧСз‘u oЊ9Ънс›—oЮQдТ"џќ№ Hі^ьС~ц'Ї№бo?~x>cqЛ)V”eq&‹eY`зИлчЪ`tџшхoяO4ЭЊЖcЊŠ“сяr,<A™clLїЉфЩЛЗo^ŽAvRМё€њл’TMˆ№хчЇ'ŸпН}}0„b%СO№є  lhіцјфУЧЃ“‹Г“kVУ sН}љл9‰ ž&§јTQХv4‘\^]\п\^œ|ю FѓЩœХ‰|пн,}ќ лSёВP`‰ЛуЗЏ^}<{0fф/Ё"7TЌn*Рс%œ­ЗcDa~q~u~qњёг@Ыб8:`AЭРчHt‡фўŽХеХеѕMчђr ŒCќ€3\ъдТЫRМ шIЊrtї€нлo/iо.eуE=ЦаВ(Rћ:†^dc‰aBA_^S@Оѓ*РБі ЅsAСЃ‚Щ ;Žћ! О6ЂЌZ­q0š…оD#-#n?ѕ&Р УXЦФŒЪ-WР^Сf0j•ˆнn$ERРої†Tg„gЅ?iф>aF}ZV`ˆ5šRžЗQЏйr…'r…ЗGKšѕAхЙљёoя:P†g8p“Єй)хОяA †НбŒтАЩЄgъ|ШHТЯDг“‹kFUMзТkД$'рM-ŠцpкjƒGržФБМ”РУ†!”{N ыеТТѓ;ЩYюv;lв7хйЭьл=ЫKГEЕj2бэЯ-њЬM_ипjЪ, q$Jаg8ŸpГйДKŒ–‚z?c v$;‡ИдИi+[8Q7їx(П^-™І$u’.лfН]eрfлЖдщ№ЇNлБ}мЅUнIqVl …YiUcћтЗ{zЎI-ЉЫX‡ IРVнgэЂiмЂЂQюћЏ7›н:БарxЂZaЗС6В7š—сO4Z0˜rІ1ŒЏ+ёЕTЛ^э[ЋWшСXUЏlЫ@ъц’кЩЪ%іi‰vsПя—ƒ]л,р!…YQoА шq[т)<оjUfBќm~!išЁ’S0_‚ѓ!Э­і/Д]/_у ‡MсшVкЎ*`Њ’8ь2"О ’ВнжО&+оzпЙZ%иКjыКnЗпšЋи рЪОЅБѓŸ9Й†“Uг4ФсlпŽmйxЇyЕZ-|]еУћ4ЖmF%Dl`@žhqŸ€ЈкЎŠРvВэ§уг§*Ђ|>ЧfЙlYК_ЅО8ть Lі|1^бБ­‘ъЮDиѕ’$ы~ˆ#ФГeЇк_Bи6ЫjsПZИјŠjFKx@jXЩjЛ.ГE‹™ре HЋ Фіz{ПoKйGі/i п~ўћйg7^Cщ_tqОй˜Р‘O8_“g вA|м?тенЖ tœї1щ€”ёpJїЊ-ОuМЧXИЏРчСbЕ§жЫ\.—UіhhxхЎMmчЧAщ?-J3НEсjLчЖзыоZ’-7‰mЇеЉА1фawџАk3РІР {3ќUUХ@ПЧlpЬ-нtТЂY5€š|| y.wK9СъОŽmычЮ5 +Z&†Кя}dцwз`KгD ˜kМB/Туп5ўO +!:ФлфnWYАkэijћI—1№з3xAw=KъwU/л­SпњЩ5|"ЊF\†Pѕ§љёИOi8"ŸOr№УОЯыa…зXŽЧЏbгЁ$ФЦ—§Z2Я)і"ЛЖ<:Лš№y{>ЕЃz—лцO \” ˜I™Ўы8ЖЁIѓў”у8jrћљŠRвэ=zђёa1‘гё„Сі)œ‰ч5Л‡пџђѕЫг&”yŠT<к˜\~<ъP"?=ПdьdЛ ЭŸ<]lNК”eЛl–иѕ“ЦЎ!Э†S’Тˆ FЭё^Э—/O;ьW№0ƒšєчјЂ№Џ—Л‡}wрг.Š,Р?I‘“лƒƒЁbкІ:шŠvvПђЭŸ4Юш?ЕE–e=iaE~МШ]МЯ Q+бНЉl–П|Ѓ+„kзьМ3Ф№q)й`[б—Џї!tРрјNWВ=Hsф P+–ЅўмI]ЖW Wы*Б г/Šv ьКЂeЗХ.бпСшU[eqршy†"цФtJ2Млоу§„/hЕЅ‹ДdHфy#Ш!б”ДOЛ…ї“ч‹Q3€k™ЩzSˆ“Д jА Я[^ зи`ўѕї'Ј2Ћ ’™A0ИžЭцФ0gVx?rоІtL…Сƒ@O7ƒbс ЏИйющЁIћчŽd%g˜?ь|Е.•ГzВк,#ЧчаМ’ьібёѕŒnўЅP)ЅйU<РаŸ Л0u’­ЈYцeл‰ 7YAюй”О§мKOЯ^PР™Ђбtg&ћMэЁш)Сk96lCд>By.kЧЁ)ЩГгыNo4LСXюя’СZХ&оо…ЏПП“YZ8Є$o~џђИ^јІљГчЯ1ВъуŒ’Р3ЩЏ2]˜ gЩJn]d_П>т&Ыt<ЯХЩ1X=žŒgЌьVЈСгK ˜ФЎі= ‰*nк ил,Яњщs†yU„};2A+^ЋФEo—˜‹o]Ф`єу}nAЩ3 K§O7ШŠ” …ЈП`ž~( bћqГйЦўнt-Ќ-"Ч|vЛуsЃш|~и*<_ нcеђѓ кќpсёД eЧсh2w5 ч EiЕя—zкЦ7f4'пЌ‹8ЎЗ€TTїŠЊЬ#Чњщ%qЎЊfTДmюh +лEjАј’*ЉpJi{џ„§k_dHFe‘МRдŒ‚o`x9 ХчёОДЂKjnЙ)\У-v+уЌClšвщўdМ„‹†/лТеYZ4Гд Nе}иœmЙм€бЖ+OЄІ#є KђxєЎрlž ЦќуcыJьd.jСjjВ•mw™!0 ”uяYЦjМћžVehВ„hФ G&I3Ђz]Eѓ€)эЫк—Љб„`˜ёеˆЧvwМрПМ§№fЁВ^‘.З•#KfК}\GПEIбpМжŸ0bјt*iАmŠШфчœ.™аXqкѕ2+6O˜‰зТЭЦ“йМћy,*№зЏ/nї улHСKџ. Ом’e3ЭаІиF‡ЃE%сЯ‘•˜Hšd‘%ŒцV™ЉШЯнr]/Š“кch"=ŸNЇЗŸ&’bрm8М}‰yЪG(с§До=фІ тнАћ‡-vѕlC—џ,ХRƒђх›ЩЈvYљ†DЬEУбйљrїѕыгу*0$Ž&fгЛ§a3 '_aу5š]ЛХщ:юСгoDэnгжKŽИћЯ›O>XJ@M+V8c6T;k›rЙ†’јДђїcѕhj|vMу{EIѓ–h4$Х]aђУ™т№ПRSцUПмд‘уњAш9цЯFгџДDгrS$н)к*1UfHс4иvЙlОўўх›б<ЯЗЇ/h` œˆc0vи-^љ н›+A§№ДЫl™Qќbƒ}Бъ~LјŸ7ќƒmKHКЛЌ›ЪзЅёXаHЕUНЃзіy "KїŽ^ŒР™ МЭє@чЦcбZь pŽТHnОN-~ŒspФяКЃѕН oР„Vѕ‡O,\С7№лvY­ПўЧз‡ТС1ГЯ^ŒюИaсаПа§Џэ˜Ÿy)ќ—ф„IV–EY–(8)џКLѕУиfШŸ|Sђ­ЉeEеДm]WUгр}х_5wH(8XўЗЕЗ§чЂŒЈhVэ^+БЎї(–‘ќПF|ЪЊЊBTЬ+Ь–UцЫ"ѕџоШчL;*PYюHqЗ№oдѓ“'пўBчцѓщ{Бм0Џ U“{kkъ…)ъ'Жи‹’ 8E#бŠХСфЄ?їю ˆ4хАZm € Gт§]1ЂyЪB\T5Ж€W‹ХВ.гШ“ ˆz6 њл/FЊŸ5ЈРйРw[ ф‹ћW\јџ/еУаXЏ›%Ќ VцћiY„–ˆBщ,JА{ЮэнЭ‹Щ‡эZiœ-7[д5ЪУПЖЃїлтнhбlPЕFAЈ<-UЫ2ДdAV$z6ЃЛнNЗw{ žю3fˆв *NБйmАг:Ÿ/\№ГжH уŒо‹Ќт,ѕдсh=(—™я8ЎcJ“сЌзЛЛыt:]јi’Чљ.2MЫaЕ]W%ЮЉ3ЄПизcођуМоlšЊФ,Н,s>ж}œ)ЂЄLŽn/яКнno0x1šГфtBJКщРуiё:­mщїугПg‘ЂщqйnPЦЯO–M]Цзчq NПАQ2ћђфІпŽЧ“С„€№юЮАЭВzЊ ЇjІ*ѓЅе‚уGI^ж(бВцCЮ=c> /}МѓЦŒ;—g=›MfгўнѕљkF‹ Оž:ž*ŽчЛрю}Gэ_Б†TŠRN jsGц+­–Б­ЮІ’ЅОЋ фА{}~йэFSrN 01И№f”/b›šHNЅQш{Оѕ}вZx1V7Шj_.cKax;­ЪРfŒD`Ш|дННК†pЯQ ‹Q–я№B0]з”(ЅЪ<=Я§ёaфЯZ”ЋІ)’(ŽГЂ,"[f%/-3WЅiн‹<… zWчёh8c$EЄц”Ga`ŠР^фд!28ўюЖ?!X‘!;ˆВ‰fЎЬkЮЭzеlзЙŠ<’ЄкާЇ?R6L]ЄYУ т4Np|Нp4њюnЯsг9C“qџЎ7шѕ&ЂФА: D%I’ЦhD+Z ˆ­кэz™ЎmZnр;іŸИч{Н“›`ЁЂvG…Ž&)IЄi^V5… ЧУС пэŽnЯGЯJдCGG1MCGу„НЊШ F№ПНуŸ- і§‹…њІ<яŒМ8ŠŠD1Њei"ƒ3ђјйнѕен`<щ\~: ЃЖ%1Фœ%jЮйQжЌл2ЃДlZјЮХb lЦЕџ<жЫ™^ВHl…ŸіAЕr№YA+8yR—ˆё”…йХЇЋСdt~єщИЧ”(I,tV5aд!œЅж@Ђ1Q gЂBЪЏrЧњйc П-’š (œсшS•ZдУЧЙ№Ѓ™HФЧiв4ф8ŽŸ\\ Gw''ч§щpLQ$ЩщЖяћ.п*†ŸеЭТ7P™СOВbY-Ћ “ў'Иz,(27šК_,Бkщ†mЛАUj иX% вЫr4COoю:§‹wяЮa;ކSVБН0 <‹щLУЭк&ЖQ*Wб0ŒВх 0РOћПйЬЋК.ЭЧŒf'uН,В(ЮЋІ*]"Ыv4TAт‰ёœ iŠž__Юп|ќxм›ŒFRPqъ{КЪ`ЂZnRЏЋШ1UUdAs i‘eќtЃ A1LCу&Sй№ŠН(`нЌZР*3“ ]cЦs†!FнЛыыЛСЌ{pи\žGЯц+BxФ€ћЭ9Й2ЋзЋх^p†Э$+…/šЦЯО:•Tгёm]І‡”j' 0ЌоЁЁPЮf'НбlJЂ(§ХХеб›уёќюєу%ЫO ‚ )B9JгШaEdУын…w\SQКWЌPпыЇ_ў6њб75‘"$+,См мЧк3,J ЬЌпГМРQ1Н;|w|quw;UИоx:›LN‚=%6/;AЙоьО]:WСŠъѕ24њ>‹ЊUюX EУ/›К@щИВФлДЌЊ‰‚Х}L№{)jNЎоœ (Жюъlаэ g№ГШbe/\TUНЦс„FЩŠ›Uсk?џ&6Ї(VШAGб ЧHзЫјКL,]Є$Ї8‘%ч”Р3 CЭищЩ)ГŸ2$&ЧGЗРnsСt‚ШцИџЮо{hЩ‘$йЁјђНnh]ZfЅЮаZk­#Rg€&џf—ф™% j–фЯ4ƒ.dZx˜›ныnnуЌhwћ&0Vsгn•y†4ўйFГЂЌћejЃьБ„–ЫUлt-,zg npНbESФœ"g‹ЫsЦррџ,X8:НЛ<ЛМ#xХё=›‰Ј"ЋЛйz_Л*/až7“?uВБ-Д•‰ныZР[švНЦюяЎЁ2`b~>LЌˆzŒšІqЂЉёМ,ыu3Ÿпœ^ŒцœЄлŽБȘKЯђjАмUŽФ*†W,›ШThШАњЯєk˜K',ЊаRPbЩNСЇЛеІKАGŽ@ŠКЁ A-EзMдНдnиЈšІ'Є@ЭIH8МЌ;ЃTБЬdН+mU­АьЊРR9^јђГъl257.ъ2Ч Š.-zkпTe№f Џ€“рДЄ)‘[,aHяюъb$hВЈѕmтE‘ž2ІыУ№’zЛЭL€–_ДE`ЪœlИž§-в‚џЋ1ГВ– ФdHгЂbХЊЋšnY8šШ№ Јv „G˜ŽцДРOoЦФh2Н;~w жrИ>ГЛ‘ц{Ќ lZНЮlž’M'mЊа)б№"пд”ŸБBxD•њІ$№эЂЊEЇU3Э2ЄCLЧ‚ ШТтюvLpЂ@_]œ]^|xљњjЮЋНц5ПЎЯч–‹Л<єf[:#hрB4`е Дс_fеР5M(Лъkиє*ёaКWБЅБ”b놂§€h’˜O&$kQƒ8§ђхл—OŸПzѕ~*JиF@cч“›+кЖу @xSuЋэ2‚а >Љ3G†р’С—`wўД™ы[їDiй5Љoˆ У‹КWД€MэА^ќ‘„}цxf1/Š“UсHjђсљыwGЇgWЗWЮfl$UцˆщpHVPЎw›UлnЖыТ‡ЈП•€—Рі"rQтэЧі8;УХљšтПм7/sђUЊ•/kДh_pГ@–МЕМИ8ЙКО$B2ѕФЛЃЋ#Ш OLРЫšфKь/МZяі]Јck=(Š AюЃ> Ёќа‘ Ѓ€7z!Њ2ЈЖЋAФу+ZvБ!ЉAнF†L3†ЅA2dPOG0<{ћa$ШиˆМBчЧWзƒб|!ьt<_Ь;Шъ юjЏVЛЄo\'К—fi‘boQA„eќ#FЋЊiЂЅ:!1 – ,Э_A§й)—‰ЅPSЩP9†ЄPаs<И€—Œ'4+b—jScnЏfЈ:?МЂy‚`ˆЙьјiЕТјеrsиЎ*0Ќd@D‘f:%ОC4ѓПšf8Ўe HВщИŽЁ*’Ш3МЕKј.е)АIЁ@@t@йz^Є—w3Šс…šLiйr,H”w3ЮА-[МКšŽє|&™aжl,еMГкnЛдеQš_Š&QƒЋ1Щ2ФфЛѓ9gшAИ0П ъ$ыHD ОРLКeцz(кв7žЃŠaцEвŠђЙ†щžU•'(№S—$bBMg‹ЩL6Ђ=жuYуЁ#№bЛAъЁfwЗSV@I с{Яu8De™…ЎЎЂ„‰"ƒѓ ’Œ` рЮЫЖ8-В‚Є)Ш-РИ rЙыš2ХУŸЋv€#ЂР‘25f*ЖЃёxiЙнэ Уh"–pЎЭ”EмV•K№ Ld]‹к<4&“!Ъ(, fŒЃ%VEbЁiЛІžЬqx=$TцЫн~ёхіk lЭАЛX0а-ліЧБОГГ"c f№j‹\ШPАe№”ƒirXB™ ьДmЋм‡ ЧK;› (Ќ ЉQЄwœТrNр9.x—ФC>]%УЫ[иDнa‹~`.(PТc†TUBŸ‰кьY–ТЂЗОѓ€l@ЧEyёдЗ!б0NмЌзЋ2є#,<€р­Ѓ0?›0(’$3гйdDJ2+ћНŽ­ЩKМdи*dЅХртŒЖ’Œ>ьћеjП 4А- &КЎŸuлu `ЇWЯ@ vвѕк @ЕkŠр’xZŒћщЌџТTК`DШ4ŠТУ›)-щ–e.*Хz6Бy”ŒUеЩЩљгЌэvї`єУІлj€иЪ2Ы Р#ЈеМnPћдПgІ9–šLА‘Р\ƒЖ}k^йР „ўиАl:ргšДИб<9&Uz4К”ЧNKќ48Œю‰гЛГ[ d†cŒŽЯ†’…:АQY`s8:Яб/ŸїввXBЎ|ю;РžвџНб‘;Њ_УwTj ^Й‚dЖЊ]v]сkТ№уљ˜$Ц3vz= Tь›)qZ`ЫЫGsdмІUч.ŽЮяDгMЋЊ]o{№§.ХОаn‚eНšGCЌfУ‰Вќ­‚п ŒOYIЕ`5тT‡К"СL—Ы 0€ёH[‡†8ПОм oof '†­ mКaрїЪбЊзЁ жю%lаПQrН—ц”ёlсё6?Q,p[Щљ‚QєАос"A§!єРЏ№ Ћ=ќЏM›ёPO’#ЧCEfgМ!RЬ`*™АўuE†в0эё Ец’dтЂЬNЧgрЛд\дeтќеЩ‚W 0ИћЇЯxu>’ +[„Їq№Р‚Г5 ЄЁБ( уў~ш}/{Ќ8Г­Gя6Ў—Ђд€ЉЉЊ]Р<ўкЂj*Uѕћ,ыѕ:з‚XР )šaX@“Ы3Qf8™[\НxњќУѕ”$ЎŽ‡ JдИСOЊРГ ю‹JP /ХЫхВŸlьп+‡vMшљa”ЄIxžћXеіr@e кИdШлшq№Йр)ЈmЖi‘ІАЄžЅIЦѕ 9<D ~їюеЫWўљъјфф§›OnGѓ›Ылы…"@ ЅгП,^^Ёеї‡О[<ђн.ЯВЂjpБЎѓHЃEл‰лн§~ŸЖщƒsЅЮєзIЧW Yњє ƒЩ~ѓMb:’`јЉ_!o^eЎi-€pэь]ЏлВh€&P0"„<ŽОќѓХг#9уаPи)`я Kѓ„xѓєљћKBDкЃ–1!4„x”X шппfЙBш„šA0‡OН— Ёƒ&чЎ2pк%рЖeр˜vОў8њбІžхЅM[ЇHCpЋЁЯ_Мx1ђ’8€LL]Ѓ “,зOŸО<Г(е ЩгїЃ4ЫЋКХемfљ№)|ь]|уУыѓћс~_ь<К6a1‡€j—§ЧєgoqсоcП3„SŠWb5Ož—y‘*K]<{ёчБ’€sиŠЬ_ЉЈігNОzy М^1ТМn!*д-66п9.\ЋкююQъŒОяхц6ЋыоaŽк`ьу),оКНЧŒВЎѓаžЮa–bуЫШ­$Їъз>*ˆ%OŸ<}і|ФaЏHƒ›{N$цбГу +ЪvZЕЋѕВэPШrYCh>oч@ф8 Rƒбm ЖоosВтЃm~B"К jрЧy%eSc7ь-dЦ^IЕM ‚"+nЊWXЪтЭѓgoЙ$ |зУнlфЇ.Š‹Чw/он‚ˆD~‹ЯНщЪ,А№ШZVнхўс8. i‚S?рыь№–ЦaКі gИДмгз:žІЊh;\‚їd;НжВІЩŠWр†Ж.C]ИќуХЫ+B? €ƒЃkG§–vеs†І9ЯHNвpшNК„•rиAh Ў% $TQ… г57 оœЭr‰F<УЃШsC0>IТ$Mѓи ЮоМ*ŽяЛŽ/ђ|М+wsпЏя=xЩўе™Pi|dРzњ†§œ^|М"НяЅa˜ІY .[“qZ”eUV)ќ$о1iЛЎ2O_О}sЪЖъ@Ўѕ]t№ &˜Нjђ$єPYќа9%V)|ѓбF Мнtл ЂХ=кї№H€ЯАК†(ЙЦ№zz;”c˜Ш< §V^^tШРAа=ЪЂШѓ,p‚й­тл'w”Ў2”dCК4Ѓ>Б†№QљИЉЩ_Uацž+И‰g=кhдŒЖ,'эU1aJ_.q‰чz Фq`)Ъx<Ь’нь*РCQЦЎŸnЬФ]ЈЂ€z %VIЊЏ„AŒ3%nІКzJF—ЙяBŠgO Š˜Э(Ž%‰Щ\0\”БYт.л.Wj<“0В h/рyз~ќб­mЛАP–ъЖЫ:‹l\щa‡№ пйv]љ’dpїEтФ /€йХzв8/NC^С№‘ЂБР‘ВLц‹`0XM/&CBѕђхfля|ЌЗЙЪQѓљdNUgx&eK|2`яЂ Д5˜ьєлŸ’žmћ\{шѕ–9SМШЩ O›0Е .Јƒt„Ёz>0…€“dYт1Іи8‘/(b< aЛA\НBbБЩ5^ПъŒQГСѕŒ†)WtCќ§яжЭj‡ZКž ˆ fUT! мї цА*Чмh0Ёy‚Sљ9уWU[Ѕ@ДйEaрыучЏgVD0йУЄ*Г4вžЇ(šœн ™p{Р=СЏћUЋШx’ѓфнёљ„тP•BќСОЁ?HѓnUГDе]Рz‚j=УфИя№Ш< ю†3!a:еKЌ_ЯBЯw}@wЦьуг?H fРDgсѓˆ'DnСВ‹ёеФYнoк%žг­…D™5ЋV%v|9XАМ<тёхыŒe;wŠ:uMрлјеYёЊпИGЪyќЃ[З6GГЬd&IЬtn6-DНkРpстйг?^\‹NHЯї‚ДЈ!Ÿ ‚ŸнЭ‰й|@—‡§ВYmqУ ИЬjU`Ц‚мЎŠФ”dX tпr('›V,чYрЭХ+КiЧ-вќ-?Ф‘ы,ЎVЅƒ'ЄМ$А‹смХ2№"іАй /_=§лѓsв№! A ,QТнb4w>œЯвhqЇ З№˜ я—к}qКf"McQ3їMЧŸЪј`”дEŽ7yi‡ЛМ›eY;ньwЙ…‡ёмДd†н’Aг50^шЃ63u{|Е4А'$–:SЩХIP}^‘=7xˆpуb VЗm[*,UРр<їЭ‚"АqЫНVЎiЙРI,ю–%фŠЊ]ЎыШbx*€жК*аф|!Gu№#ŒиГdХv!vb­YQ5‰<КCщ0„ЃрN8јsWAюїё–ю mfЋ"P0м6“B~ЃЭ(ѓ%iІŽЅ€™]@д дMб+,аЁw D ЯСгXёЯŠšц˜ЬпВжВэПѕУ8IЫ:тЏ/ЇŒˆЕ{œ€оцйnдМЬCT№ђвЂ5^OR!М`щ'|цїд1M)ЃyY5№ы8-W›.wХGЭЊkжл`ЄяРTp7Т &-@QIг сTGЉk€Ћ‰Э /G'ЩИS/Т<ИNPv+А9Lx/GС’,‹ѓhQ–Dщ{ы{Iеяv]З W›&а$YѕJpоvН^ЖEфaЩ=@IIq D–.Oтž;ПцaЊ-Эі#W Hf-JсрgёTе6]U‰#cZ1Уj йБ се‘ЗB”ПУ;ўы`p{гFЂbхf[сM'СШк*Ћ—uЗY剋G>š"ВJк-Лмќ&JŽ!rџˆ*xЖ*s ЇЙŽТ2 Џљ 3аfEхeЈ Ј PЕ_х.ЌЃйййˆјОy^ON"ЖmRЕЂvЛIt…šёzВlѓjеTЫѕЖ ]|ІЁrЌ‘д]ƒšŽМЄ‰ќьХЌЪlЫŠМ НоBЕ3 ШЃ&‹Ђ0}љџуЁ>'ъ€QS‡^] 2‡х!“L цqZЧŠ0Лžа№№XјOъZšњюqВj…ЫM;Ир–0s &’ЫЄмoC Qр 7tb‰8y3ЋNЌЏ “‹ЋЛлС„„h+31зGъXf'Зuьr‰yYКўƒ7р jzГP ПоДІЇ@bhк^d‰їмMХŒ#Ц№Бsƒ0fњљј@cq*–ЩNЧУСЭ`8ЮH/чњ˜&ЫdkyrЙрd+щ€йц7QЌљGjь'ВfhWbнјК"N/ВbF@ї€|W_KСБ РОЎу!шї€3~і?PE‘›Я$IЬЦ“йl6]o0`u{^XрэЏШиЫkМt›e“ЧIшš5Рhо4АтнЭзЕЏIєршэ9)).ПКТŸІˆЖнA”„†xиСA$^ќљ^ЭРhA„Ќ аž&‰Хlrwy;™Q€Ч\зђыКj*0ZМЙœтTWЋUЧЂ’Ц{ Ž–ЋкгФљХЋ?ў|}Ю(fšХyнеiAЂVb@ўю7ž№T[Є—/џ|5ФsN”Jяiёоўѕ9XMJКщЇm`-W‰)K—УЅ(aЗiВ(pІРшЙi[ ŠUaƒЭЇoўќ—7Їgdь8ˆЋІ)№Dи3UХ€PŽ6kXк (~vuњўе‹—ЧWЗУ9ЩŠвo Г‹щp4МЮ9М1Џ‡xJ‘‡ЊФ|8XЩЬ–K\Оmjъм]е-ЫЊЎД!ж ^~ИU …Њ б"+Ъ2uёъ5lЊ§†ЖфkЬFЧЏўјлпўхЯWяЎч,М РT@€yjС0cо†—yšЖЬ^Я.Žn)йЪ7]№iп\ГљпЌ§ˆšЦGц6:}ёzъ˜Š$ЊˆЁ’ВЊГаі‚~ѓb4X†g›№ nrіќчOŸН?ЙИ#q(’Œ;йFП%-Аs>зCЃёцшнћЧУЫЃ—ЄфwЋ"АШќl~"ш–7ЙЉШ3?{ўъ–WњгNЭЏЉp#ЬЦэуpїрAж%vўёйЫW‡Э М„ЃW}„їІђМщљq–ч‰+‹Фэщё‡я^Нx7Œr TќэЧnЫ)РЬЫ?†[?}yУ@ЖРъ’K™сAм‘с–5^B%ер)њђХгЗ7sŠэwћaЊМCљов-мбП№`TwВЊ.‹їЂРБє~aАЌЋ,EоОќунФ*(|LQФ UРё}ЧЮˆЛMM[ЦŽ*ŠВh˜уwOџіє˜F|[eŽ.џшeJ]wтL’ФЛзЯ_Оzv=fБЦDв§ДЌЊ4) $.šgг’ЄйxХшцХпоŽ(М{†с&КaЙ0ХЧvuњОЩ’ožўљь„чŠЬrѓƒFCмѕ\,dЏ^?ёњнЧ7чxy„ЋѓКЪpПЎп ‹]ORTУq№ŠбЭЫПН0 Ћ €kzЦVаuМюi%ЌоŸ$irєъЯ?žО_Р tГўєm~Мk%y~ќцљ‹ЗЧ—GЇКˆ€*ЧUž ™ wЯѓ8Jы†Ё-АuѕђчЇsР§R07‚Йm`zсЇzІ[Тrво/сіэ›g{ўrtЬˆ#№Х5ZРћ6* Эы7яоМўpr;ИZрi+P=Э‰Š;"ћok {ИsšчБ)А,qёђщгїЗ –е#јѓВЪЦзxЂ’…QX$ ю. ИК}{њёљѓgЂЌњјЬ§Dбu дёлг“ËÛЋГБ,Ёб‚ЄЙižї –mК@ сН—‰3Mœ=џѓйћѓ[’UЃВТ(уєmХzФ‚mHRп60меGяŽ^>{њќ†—d жс+єrjПA?{їqМXŒ/Nо_,HHl$'ˆFa?”ѕfйaЄ’ёni<Ы.ŽџјуХћwЧsNЭ*Ш{№ЖŒЗ VM ^‚з%ћS_ЌpЦ>œœŸНўА@ј­§ИOƒƒрQ—89Кa9’WGЧ7wуЩе%iФŠђf‰еcK I`„l&u†{ГЃчЯў|ёќŒЬ*БU эFвaхOWеMЂk`L‡Ќ/0уСœХТёЃМіcщ№яƒЧŠѕёЩЫGeњюќєєфєъђ|„lЪЭ+МНГN€Ю(e/qќќјнлWGWЄ њ• о$ˆЊSЎЗЛЭКƒЄтbiЄ„wœY–Ё‚Lnвш’Р#їŸa3 †š]}œНs4‘\_M(šЄтыQйЌpWu ‰‚ьMЂШ^М~}2e^Ы ‚(#3оьАрfчw6NИч/ШBЫ†CриO2њыРk4ЁLфъќŽЇс! )Aе­6ЛЭj™[’8­ъ‡ЊтУ—/nŽWќІа%Ш:ЊSЌА€yГЬ=qѓбрv<Ч# cjPБcXП ё• ZI›’ШЮg,n+ЋR‚В§zП0жDI ›ЎH .ШsvВŽmчЫЦз0W:u_М]цŽ"ŒЏ'ДlЂФЛPмё!0­ŸкAŠQщсЭ-)ы~нсе3ВВ‰ YЕГўІоvНL4ЌЏhJМу‹ŒЬ М(AГZfРY9\юіїX•л3Z(0 •№ˆЌэ„іЯ5њ‰уХYA3’%VqтUУа†…з,—§хd4 žЉ IF^HRxžЂ[ч@%=Чbц§aПц&p§m?LЄEГlsРЁc“gгŸшбœЇi2EI@;lVSз€№ 7Yњ*днІђM7k (,В1бxЧи{ИД%QqЛУзт™§2q ˜fАИљкЏgГЪ?*"лœ^jѕЃhџЗCВФЫ%+NЩЄЏ]vxж K ЫЊїћeСДW.„^~ttЮ€‡лРд№H%в5+УКDЌчИпЎЊигЊYaU6…ОЄMъšєHpšЭ  и–eВcFе‚ЂЯлОn`НФ›д;,ёкtuЗ]6ц ђќ†E@тxQcНЉЂ iБђЂ/pмэǘјз›§}_ЛЉBг№ѓe,ќg6:х4нђ=[›ŒDUЧумД^яpgЖNТИоbIн/ ьзЉЅШЂD_п34НЄјz€е6Ы–`|ТЪx/xifЛЧŠ6xGub‰zo›аў–кСџэ UА‘g0—Б?э3=МДnDуQнЁПŠџэ"аІH\ођрџюŽр-ЌИџєl†,„UЧ{ќ,$9l›Ф(=jы>ь'§DБ;˜оnуМџ–] /VVЭ|ѓеjpзЪB›…йща3Hs№%p‡˜‡ їћeU­Зxй}Нўк7Ћ‰kОА‚х§&wЌЧVг?j0†щU%LѕељЭнp4гЊэ%9&paЇйњ*–MІѓ,ЧГу“sJ /J“ДZm78­р Ÿ6U- Ф% Бzј%;фмdЗkbч{я0џƒS П„Д ёиЊh|uEh–этс– jсњўыLn•#$18:@Џ;XN˜beэ=Ь2јЧЁ lЫ…€%Ь–&щ]tъfbјХЁ эo)h{д`$=n3ЧР I]сЦз Ыot™eЃ<єuN›DШсht}||Ьр№ДШйт­ƒЎiкмЊ xSVфХD4J\gŸ?язАV ,qw=ц8с&Њц›}яї›иA(0 де ‹+=[UЌx žѕ“*‚бxЕССІq€втЄlkXъ–U<#л^AјќАпB.жћц%фшŽщЯ^ЄО §уѓ—>[:PЫu4NВуЖєlУ№ЊМ„Рб&žІ5гТ[bA IА4цeЋuS–ˆМьЏБАsЧКI0,(П‘иaCaз;єžЯX\CВ6‘ІžсФ-€'Я ђ М…uцZ?ЕЃЂЌЉ _,o{:„ц Rv љЫТхpƒfzЗ[Зрёž)Šмtжя4А4+h&ёO_>іл јЁЈЛ \H3eрћqЕОџђщ>и§ЉY)ž›ыZ @ЂвUiZ W›Ью=^vОЧрёљЁП 5fwœРrєbFp*@<,JXеЦЖІ(VИФDŸж‘$Э^вnUbщбЯ4Ч\в№ю5лвsбkZWЁH< юЁ2Lѕ—‡=VоT%ЬЕ)Kг‹9џ™ŒfМoябюзЉ‹х AЙУЂл‡6’zБpзхЁg§м,Žƒ”ёКїzЛŒLьКВјСDR5УЋё†сОŽ,Ž“$Д$yђўzx;œŒG„ЈЦыўNжУУв‡мфФѕoт|~hŒ†пlkHжOy§X(:^kоЌRKbEЋЊm~DA<ƒo=<є%Љїћ*t]7№€s пœп\\'SJд‚ю€їA>э [4'[[\oюлrz‰[]{Жљѓ:žs“fНЮl™єМqd’UАй`бЌ20њг.55 R–ЎHGWW3‚ф3YіHє~щ+4 ФqsиTy{xиІЎу†ИЯ]—Yш|УѕЁЧЏ6чэЊpe’QуЦзАЂ•Џ№ŠьC_ќ{ПєTonЈ2sCв“Ж!а=l"VobƒЇЭmMTЛOїmdci9ак$ чДW—Ръ ы_%)%hb[АŠ љюаc<4КзЁyмYмЬx‘gX ŠРwЗј`їЫРTн+wŸvЙяd[јMфрŒЁЯљљ.Cдt;Ќъ@!Вз––L` Sэёz ФщћCЅѓд‚bxм2RЯqL/Т}@ŸЎу„еісг&ѕмt™ПХНxп‡pЇџ›q‡н№ђ:дщ…фдЫа ‚•ѕhюёхЏПРшBуibБ Шбщ Ў„qб!WЗБЋ"†еаtˆ§лeSф‰o§hŸМsЬTШŠUh0„lWијIXЬВbў—Пz–Я1IЬn> Б]d'е +ўqџ`SИ„Лz7w‡}_QЙъЊ,Д~~WфПХpђ<0XZБЊm—и7%Иє_}y(4Ža Œ~{+)К‹eЋўњисўаE†ЄНбы$№€Ця–)а%Ёяи?=БќЋб–ІОЮђ:Уm*9Ђ$ГиїFџѕ ŒІIЌ5О}sТШŠaкNXbsЁ^{ЕxРѓЬ6Ућн›}эЈВj`IšѕГ;9џыM˜Ј +Zƒ•ЃswcоІSљ\9›“Фјтэ›'nM3§ /FяКЬU%ХЪwŸО|љМ/#/,6ї•Э/–ўЫL†•hYОg Ќbe˜R6™ЅwЄъv8гџљЏ/›@Ё'уЩxpђў%т,I„sAЎ­AzŠ—=ИяВ0Њ6ї+?д=ё1ƒ1LзбyЩ:lqX†Ж2 f‰0§Ѓvžš/оП}ћЏл14М•z{ФЂA˜К§з‹‡лЋz!r[ђ7u—јЎЁ˜6а<ЭЮ6›Жnж›Ъ5Ј1gІАПќЇџєз—ћˆЬNЯ^ПŸОŽЧ ЮЈї›Т3АЖ­оnкЊ(ћКвЖлэ;lЙ ўj .Џ)Ъ&$ц& ЃbНŽliFщб€Ч_НеЋЬ5Tiqђ~›з‚гVФ7mV-Ќ@7ˆвo,oЖu„ZEП\ІЧћ“І_T€йmр_ЙЃ„Ќ‘邇р͘ТР4Eї8НMiй_юзEhлnЖj‘ь60ЌВB|–oь!і]ƒфUг №АСаь|[ћ&M(~&6K ‡eтw?{5YЌтЗРВK7Ђ6ЗuМхl9~Їy Музл ƒзБ†ЬЊh%ы.В……шдŸя—™Aъxи•žЁ‰g№“З3ŠцЗоэe‰Њ_FR(XGŽї@П.>џЛМY ЭЈnожБЋа‚]окW`Ћ-ыE–ЮЁбУIqВ•ЎіЕ%2’—уa$‰ŠЁc+@`1пr‹і%ˆm'ЭгШ3бЪЗHД5ž7ЂfПЭlƒ=AЃgгщ‚‡0О/ ‘ммS8KБ16zњчkїЉА?lE6“nехОNMh=Tтщ|?г“Щрv&љ&еFvO^<™,цП\•шпЂaР;Ж][Ъ›EфYЬpЬQYХ†<|вЯєрjШjб2жFБWџс–и?:XYюo–ШŠ›КЎk‹г'3оŠъТъ{нbŠ#Aы"-b“ЃЧIўзAr‚РАX…яZVrIЭNrЇпMœP ‹§+Ѓ&2U’”ЌФјg‚џКЎЊхљ_Е,f6аЭАp5…xBВџGТўУ!ћп‌сMGџ'хяЌњїЊм9‡[дКЎk?ЋєфŸ2њ›Ї<ї‘hѓяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќП3Х0,ѓpAЧџ<јО!”ƒе5Ё#§[ЭjUл§EUџп1ФОaz‘ЁЬETT‰ёЫQd?‚­аќЏЌ”~ь˜kиЇЙmЊ"ЭВ<ЋЖЫфђA’Uyd›~ќ{Я7ЅЙ jД]“Х ˜]m>­"ыП•ЄШ–*+љ„В“ДYОUm§ћZ­ћЩW­ЄЖ­ѓ4ЭѓМюŸVЙ+џ=Џ‘“љl4|"xqжЎъЌЈ–Ћ*дy™їџb^в.—ищГЫЫВЌъnЕ\­JЕ™D– Їb1МЙz"јi…§Œж]Зn#KљŸйЊслlŽ”OуІКijЇъЪ4Ф›Я3Ф|Ƙоно\?ƒў^ўВы–› ^уs-щŸ_g CіЂ›eT`4JiеE’u;I,/ŠФdx уъц чdФ—аѓгnГщЊ"ЯbЯўчW‘F˜”ынvеEн,СРtВІMm‰г,]˜NуЛлСѕѕЭЭЭ„гМ8ru‰aєЌяЦДьъњчЊDьKъyЛмЌыа2ќЌХџ%oцŠфQшZ†ЪNn/nРцЩŒ5q|yrM9iйm–eТп‘šс86€чёZЄ?8”ХZђ•з]dˆ‚•Д]с›ф`ЁyYтл2Лп\\^п& VВ-nAБьœ2ТЌ,s:гМ Ai0 ЮUЪ Г#tЛByšмQ8бЦИсфH№’Фбщёрцц тЦ”цгwо CЂuЧ ,v.Сnk|iџœШGxQН^oзЫЖЌС№6ЖuќЕn"GZАn™q7И‚iООзА=G“V%-K"Mб”ф…,W5jл„їѓя0џƒqЇbWџ5шМЄ^ж%0Šзehp‚‹b Ьb|u1оЮ8нѕАБЖ7MгЊwЄт%ХrЗ_fл7Ўјѕ!dD2­шЃQР%*к:ВЅ1ŽЌŒ,5Я6$j|yv}7$eлЕtЋo§љ$‹v!ЛQЕоэkьЋЉЈЧ2ЬЏ]ŒS^35–WэЈBu0DIu3}yA)vœx+иŽ­‰‹›ѓЫлб„жl]еь(Ч<­щ5š3УЌA]ъmюAд“x^TMћёb3п1xl­sЌъiгB*l—mюhдŒbXб |KцDM—шЩхйЭh< 4]Tь Џ*6(2(p№lе РQ з6TQщE#с ‡ЉъА Ал‡эЦUРmYњКР*(Ђ"ЖcŠ‹У,†WЃ/ЎUфє ЮгР0н ёFrМЏ#ЖLћйjrХžѕ­:(#FЕ‚"ЫЦVwSМ‡№,БВ `SцXNУЌ2œNяю&УГwДHГfEŽЦ3Ša*фH ЃХЊЊ[­W]SЂs]јіЏ!sž!yЭЋ*ДTђђN6QЯЉ tф ?M1ЅаМŠ‚WУбdrwђўrС‘МщКŽiŠf(ЬрFёт 1uЧeГьХ‡М4Ё­џŠЉfdUfXЩ№ў {пй]E“ЄЩ™йЦ љы}yяНwїV]+ zќF=svЮіюнѓ<шМЏЂВ"#ž'32žrŸAM2`ІWБСЯ€)†(†ŸE‘Y Ўn“щрЫщчюtЮ‹МЄЎчЛŽ%ѕ?ЯUУЫ‘s™І"І]ЃFб2ВžЗaЭїСЈšІВsJЕте2quEЖ€K…­PФтР } ЂЯ§оэM1ЛљxђщЌ?'‰…hљ!  ЙwuIŠŠг^”WлЛ”@хСM*ˆ$ЯOw”Ъд`‘IІIVPVё|'xг-IСDСг‹ЩЈswq|>П<:>ОЯR4мИ‚ф™8њјr!ЉfиlŠа‚`(K†‰Њ.BSЊоѕгm CИ†Lє ЭH а%DД”йЪ‚€Ир*ФŒџa‰IчђЫ—O/пп]НzwvyзNц‚fqЖlЊРXŒEгДЃfлд‰ЃЪ,)ZqН.#Ч|vТag8Ж5n0 Џh–%„Z MБЦM ћНpУюœСЯѓAчт§џ|suuќёУyЗwйL8Йе:+ЋиІУёАwЦf OЌRsбЩжkдїŸy!N$ьћОЬ;њјђфтЖлŸSу“ѓЮhС№ВЊ;й2Ж9оF№НЃЗ•ЋГЄЉЕ„%Ь?їE§Й ‚бѕ215i>dѕ ТЛ‰)3Ц4CйёpСrи@]ІOпмxзŒœ]є N)”DNlArƒЌ\5 З+Oe-,›мбŸCaЬЩŠъVMюъ"3%eX§иu(ub(,­иdZв'ІубxvsжсŽЁц“YџшгеЭнМ›ф‘- ЖDiŽюUX"-ZЩj•€пMSтy/XRиБ/^ІЖ.qsBrŠM>Й^ЉВœnZ @Ещ?5'ˆХl@ЪтИ7Я9eўсгххэTаm7NGœёІЎщfPm7ЉЮё†›ж+6[‚ђЌB_0Ј˜БЅ Х*~Y/з›e`sŠКЈ“ЩА?ч%UСxi‘%уo?~љ|v=сTг псњЯqŒ`хлm,Г‚щц`Д.R„ ЊєŒ‹qŽЂ~^DІФвЌdEЋfY7‰N#Q 8ЊD`ЭРLЛJ`V+tРі/Ч›СkFЋŒЧбВ†н›]№АŒж§ж!$X€\,™gК7<{1цeУHœ:ФNq3Ф +Oц(№^е+‘ƒС ?УІдФ‚ЂS ђќl6Й9ЙЂDrЖ XABщlšV=”3 4­СhШK Э“ЌjљО ™рYŒžLYЕЃМЊЁN*БiэвS˜ЩнˆЬщh"KNa:‰wС—{Ÿ/ЦЃСн—o>Mјк<˜ЯF§ЉhњŠ­!RЧ*ЫjииЩгй­и рkѕY:n.€NЋf­ u[2Я ВЎšВЌ!FKd.ы–gбдlLCh>“‹гWЧ?О{љђѕЇ›J_pє^ХнѕD3Нbš™›У>зZ2‚М fAЋ.dзPН 6‘–АэкrUЅž.Вh4Љ DсЈТ‚’M*LЖ?š/ІsЇ’B~њЫ›з>zwA08IPфlМ€Ьš6[Th=jWтfGEцЃaЙ*#[Wе_$ŒGБЕpT­qcШnНCЖГz‡9`=‚4duO“шIЏ3І 5ЎyžКyџщђЖ7œВlч§л/§бxA-h†ЄhZвдЗоэі‡5€ь<ƒеІ”u…ЪКіk ѕШPeЁТќГ J”/ЋЋШ—u >Ю№šу)мbа3@­Eо\н\їHA’UFЇяN;НЛюh2/x‘хU RтjЛЧо5KWf9›hхqRЎŠ{gшšќ+й8УМЖjCБ­ ј‡žРLЛ~ОЊcCЂ)ХВUŽœŒg vˆя]ŸњИЂяj?›aцœ/3Ўwл5ŠZŠ€J+:YгТџК.#ВЎ/ иy%ћWWЗ#†]ˆРЕс UŽЃE—Di~лŒz„jzЁf˜^Р­я›Pу!Ћ~яшoIБ\"^№Lуgіі #ц`ЃjЅѕfГлSРЩТД%htг4ДfС_в<6ы3=u.nІœˆm9с+Вцшѓсен^К.Э“qа,П5z бc{ПД%ІХ6РжqУiэoСdCљ ДйZ$GCb=xШ–M“Умё‚Ђ…u+qL< }Kˆ1 Qeвg„сѕн”5УаtјOбŒ`0cру JrЯ:ЃiŸ‚Чё‘˜7?і‡ТЩpвх е(р–‘…:@<;џadЭ)ŠЊˆєp Б^Б’Вюnš ЯŠЛZcыьuFQ`)т№rJˆы&ƒ!Ђ+Ы41Ее%CхйѕXвЎ{1˜IгŽхХzЛйm7ћТEеУж–› ќŽ:СЌШв4р2хGDUZ‘Wn>!Xˆ)„еЊƒˆМЄљЭgКЩˆпЖ*ПŒ€Ž:7cХљtž$fЂBpйJ$y{=хљљчСt8—M”5“ѕvЛнmіM`Z>* lсenъЂO‘АЖ5гдЬj0–‹Љ*Н `U7‚™Ўџм#Quxи›\Ÿiж №5Ш—5Rђ]+гvђнеi$„яUтxјб”34+-3Яв–Dб{€ŠюВU’йЁќZНоэpЏІ*ђ$Š<;†ЌУMЎ/яf“ЙЈq@Q$[“Z1MŽ'.Ž.9јQ7нйещR*,^`фИ5Žіїћ‡‡{T\кЎ!,m›Ьг0аї#Х’(1›ХžС ћ_Уbѓ \чЂpК7 Pgqј0\hЯЭo/Пє‚J‰рУИЁg˜І! >žВКЬu‡№иЎIрЛžыFЫvџуОUАA9н; тhb>_д\УАЃV&’Ѕ)…/УqС'г9цУЌETœ9 ќžь\œїQжo8žчh’ЄhVњx}2“eК7ЁGTŠeЅ€h­8з;˜kєX8Й&rХP‹Щpєt›_q ,ƒef\oЗиAн5 у­P_šЧPŒб…шп^v!mLЛŒ–&мѓ%$M~Оš+dwС3<ъ4 "ИюQВМšзKpЗ}ЋЫДo•‹6‘‚Тs[~ЌAЄfкq–ИRQћrў0ДЩшwсЊІ),‰ЅŽmе?YŽafнЮЭZцFU%Fƒ1#ЁXЧЩ27ј2гЉ% 2ј8Z@™ArN+iј&ћћDЃќв.Зк("џРё€nЙйЊŠ}XL‚Є%ЭўўWјџРjAфЁУ‘hš H’ІшљЌwбœLtnFbљќі|Ž K,1c$‰ИЋф€WСm8ћ6%dc()Ь4 sДХЄ‡‡УІˆ€џG>ЪФњx*WЃ‹эЎ”ш:^ЖEБ)АКе^ƒщ€inЕдb…!Р\†c(0{1Кљ2˜іE†рисЭб›7ЇЗЛл/'чнй|p~9іРh‰:?#Z5o,ггГеРCP уaџ=Џ7XиŒх’Жёdнqнvгцў~ЉД$ж‚нИLк Fу+­\ }х/Б‹њЌs3ЇO:ьИ3юœŸН{ƒчЕчgп<љјўнЧOWДЬ‹œШM$И DЛ,YйюСшъЬн#й…_мЪѓdИka™O­‘”-€ИѕuQf&yГFАƒеˆг\#A\.ѓЁ‰( €ђH‚^Œ9љќjprtv5ЦЃцю{ФKФѕћWЏўђђѕ›ѓ№^˜рХx…‚Щ0ЧeИ…<о7BЁ ˆз{TцЉ–UžјЎы:Ю ЅЖэс^Гm•гvэћлmъzƒ"p№ЇJГ hршИ' >ЪТТb”Ыї_ПЛƒаГeмЖМ0жЛGчG/пthРœ˜&!Rы–Ќ;‡g‡ЗНоДГƒbsлU‘e+"ыcЛOэOЈIdXЖ—яZ‘8€ќ[˜o”щЬБЎD`u]%О Ўї ъ7y§ъ˜Ѓ0tє[=ŒтXЛњєіЭ—!LДd˜2ЄWTkЫЪЊjжАnЊѕцўц`пЗZsEšЄXє‹]эa=>]Ј Х1СэT|gz‰ьyў SFC@4œЈXV(8оnЫh`ѕфќЭЛWWfEЁ!Be7Šгxўц/G]’их БќЄ€5щКЉ–ЁтеЭюqп “а9j„7aT.“охўŽ8DХYaŠНпVХ ƒjЃBBD!Uд–tRм§ШѓŽžО§vф'qhK<еŠЂц8Q?Пња‡ˆЁиI^–eЕФТяMSeAш2TЖй>оo‘яCМл­ВШsлТnрIЙDоЇ=Х§eеЪPˆрёAЈЦ™ЏFHSЧ‹’I‚…Ѕ+ЬilаћјюхЙœ$ћ$цЊ#'т$˜П{зeD 2жІЂИ"4m0U`ХЙaœjgo.<)Яe,WЉgШ<фGžГчЁ{ SPѕЧBєUYU€w<qqJЗЌжЋ4DХ  uƒQЏHxX[( Юѓ2`mО l^Б-O?BpІЃXmvрзиNХ~яэ‡.-Hhз]V9Ь2 334+5žОрЩ@]ы<Ž@г‹"ДŒЇKлв //ЂvCN5}XьK\*ћЭюсб0Э/у)Њ—тŽЛЪ\Пyћюж§Рq\€€иЪлr? cюгЫ]ŠW\/m8Р&Š„'[Bўо|g‹0рb:Œ“lЙL]уЪmxН x-LVХpC ЂїА`юƒБˆИ  fјRxŽЅбяп_БОяVnQЖeЙ ю(Œœюл—GЗ„ш@к.ВиЮp №! '%o!),Dм‘<Дl•9л:4U|њцЉмz•†›ѓL›q5гЭ6їPЗћЧg„_ХD!i0и]—цGgЃЉь…Јг`Мыр>оиŠ„Ыwoо]bљt‚ˆвЁ О%Š')ёюаnыЕ€PЮУУсћGэiъќ}‹$‘š-јЖрJЗЃеўBіvs8#EУу64EQ И`‚(O#H-Vsћрp1Н@†dЏ?|М$tЧAэ8 ј;РjYQрщун}Лй„G‡vзБфvпŠхIOп<•uM`ШХlB€уZ>ФљМй?~EYQјщй„G~Џ9†ŠОy|1И8юhy…Ё/pAЄ’юТПƒGю&‘аНН>Нœ2ŠЉу+Фr^0ХЄѓ@$T˜=PЏЕ]зUQ…ЬLE}њ–Џ ЩмМw7ЖdКЩВ<гЊcbNпю—єм(у%I ,fѓщэщѕэUп\6Ц4Ѕ‡(Р4 Љ%““4 v|ісфrHRŒР‰€ +CtЇфˆqk™Х1a‘xŽ—ЫФжŸ^­GСBЃ&SNеэИl_PГ№LK]ЬБФ1<ЬЪ›^žŸМw;š™ˆ}–IŒзЮŠЫцQюьG;вЖЄз%oNо}ЙьŽЇJљЁeТZеьхnгž№oЗЋ тВaGХ­LнЫЪPWž,Ј3“‰Ї9YѓЫMЋЗїˆѓ yіі>_Р’Š’,_ІєѕчѓЫоŒ2—ˆџJp˜[ъ-Ж{"ЌSХŒ2[}:`т_s’jф,О~E“q LlН1ŒБXsBсцќЊлŸŠ РьU•x@•pVajСh|ЎВ(с“а KtеHМћјцѕёѕ\ц97}[ЄCМ;(ЌС :TЖxдfB.(VфjOЧрv `uЗnѕ”їјwфљмѓиц"…х$-БЗNЏ..о’[fОЅI†В}YOz‹"olШО^‹WŸ?~:П-МшЂЪі0:ž†,лzШZ9ю]_]Ё6БюЛъгfEМCM •мoВaMЁд4лЪ№Т.F j|}іљЫуŒ–БчЧ`bЋщХ•а~ј ІнёЂ,ЏЪЊб{WчŸoч0xQеН{б;šPE–Ž&‹сэ—Яgg–ѕtсу/ёN4 Х5<йѓ№žжОMЙ›%-[˜ zzwuu7гS`ъ|˜Я,Ю ДH’с4I њ!8{Q”Vџєќf‚§љyнK"oйД{zлЪ@ее9ESдb2шм]_vQЛBы“'Zn%rKРы*з3 •]qG|Ѕ•Џ#…^дјіz@ii \#IТ ЮВЄъ4СS60–d й щ$yЊє?ƒбрГМ•T›эj"ыАN*…'‡А:цГйd8ŽGУСŒ—uУxrХ ` Уtѓ-јF‘ЖЉAюe3oOс-Ўоь7™N4бПщ“’‡nЩ,[H0ПXЎЩ,[[Ќ'N]Њ{yй[3ЪHз‡{мC›i:$*Ёf>ИНюLцѓЩ”Т3мЇкќ И аtDP‘ >.ЈбіЛбћ}“fын:–ŽŸоv!–€Ч№|ŽFЈ‘УЁxШ.`<~@ЬN!юEЁ2КНюNib&Фx’ˆёky@Н\ x9€н“§‹ѓЛI.Nљcнzip] <Є‚ѕt RƒнwЁpрќЁ[ЌwЧѓ*}з“œ^]vœыM Ї 7=ХДy&‚ˆЄEЧ6йЛЛюЯ)‚vVЛ-e<‘DŠп4Љƒр’Š$Вг›ЫAгЭIOчЊaљщЊЉ3зDбh‰ЅHFRЬо"ЎО_FРBі…Ё˜RяК7œJQUUпїЄ№ђ›ckЃЇ3А)n{`}С;1†wЗW#šЁХtГЉтЄЦB[4 GЖ%Er8ЁЬўr7Ц0ь +SЯФKŽРPнЩ6x>ПСoХyГ лfЧƒNo&ЇЫВ,ФвЎяY{ћюн-oBЈѓНІ,ѓдgЎЏЎЏІ<`rН*т~дКЦллeН^UyћРUАLƒex”„|КЩ/кƒD€-4ЫЧЫqIЙ~yšГ‹TЫ Ы%А3HїЖ@”цxQua­TЉђГ ‰ZИ?[оK˜–хxАњСз‡maЃ“r1№qQn›‹пpи1юGxШ/kЁЭ.оџл-­јКЌ™ŽяХон€F™0Эіe]$Yb 4Й|Цˆ*XŠŽ*3гў„ц„Ÿ-IdС Ыrгѕ~“’0ьRJИZ•U]љzКkbлФ;рГШ5РYt_cGЏўѕ %И6D.Щ ђzU8ЬœЦcDxŠxе$1№8ЯmžœЮБ+lчЦўф'‹ gƒЫО€e\€ŸьxГ[СKgЧs^ ыиSђ\М^Іnи;ЎчBPіQ€жЊФ_§ыgšЗ-$ь@“иbІ&р˜NTж9Ємee…-0§ўdЪ ЦvR5›UdlјљЋььь§ иˆ,гЩwЛТ’$†=СЪšUY:ee„Q Ыl0СрЅ‰ОўзsJдTKV}пRQџXP зњ№щoHЂМpEІw=ш“‚ЈЛI‰7|CS~оjzvўіЄ3[ЬyMї—Л&PEŽрФvxЏV…EЮ• @"Яoo(РT›x‚Ы_џЫѕНЊ u qSш*nсq#zKp~r7ъЮ`.|МхЗЉsМ7јK—чМHOiХH7ы x'‰Uw&6}ЗZ%*1ч ‘ ѓP ‚œЉеc˜б›9%YX_эЁv=€Џш№Нm­…юЦHкЫЊp%шOz#NPƒМТ ь*Цˆє —Щ*v‡TПйх–,‘7— >УˆІZ6•‡МLЕ№xякУš„D •aЦoўѕ”DQAХРэSvлŽ,HнPr“8Џ›е2O\Sцdg€a: У2%fјсхщŒс% ПAбn Й0ъA№ЗЌt…gœ&ƒ››ѓ;№h‰ћзЋмƒ`џѓзИ№B7ћbX]‹›уЃГ~oФ КЄ # К0АdQCЊ лŽ­KXŽ,ы5И>~кЕѕ"*B ,$B‰tОI6‰ЏътфіќdЬKРБ-Dъјi›_№ћ фЏRCс‰лoЏ•xЁЈ™AтEјŸ‰{НР`Оея•Z‚$ пМz§ўфKwŽе’OЂЊ№Pƒ`ђСfУЫWEŽаƒш}И:yw6dDg‰Р/qщ:Q,4 Я^ Sф‰ЮЩл7—ЂЋ@ƒ\уи0*O“дЊЉmБ Ь"`8D}{єњЭЛ о˜ЙО(\лФwtЏ`TоcG—ЧŸЯŽŽŽŽЛŒж›І uщ—"žЂNZŠШŒЏ?ОzwKKэБ(Ф^?†еXdi–zxˆ†Е-Ÿц1OоМ{uм›QМŽуe !.Di,ЧрЈ<-€ПлŠШбгёќъшнЛїЇsбЬъІteс—t YWIсШ"=Й;yѕіŠ№\KD§ѓ0ЌFgЁc`I:ю•ЃoРLkC ^^ЬlHжBJ­kcьƒ +ж №ьЉ <Х`Ukvќ—WяО‚.W)Мз_ыSЎЦ&аzЂ{ќњэЩђ3‹ЦKЫЊнKОWJЊэU[ЄЪ45>zyН EкъЩŸn f„|я…xжМФ›ўXјсКу“з/п\С#кYыП6бпЕК}€@"л?z§ўгEЇ7œЗuЊсчшEJС“;Ш)оEŽW,…"Ц^^ЮчЄbЪXU‚Х0ЧAИnфFŠаT№ХЏЮпПy}I‰‚Р^~ЕѕР2Ќ—јоћ7яŽ/ЎЯ>\‘,ЄgH1 8eRЌђЂ3ЎCxгше’хH5ў№og’рMKFВ‚NN ЬгШ "œшUli2жWђєД{њюнЋH0Šл’№ЋUD<ЧRd‘Лyћіэ‡‹ўхћsт{5ъFYhВЪ|–І€J2аіЬфу_>є ’–m џ^Бќ(†2`sОк‚аЧВ тцтќнЋWG}NиdШП|WŸ’лГ(‘8?:=;=ЙИ:ЙXРLsxхХIŠД€tž~/п |HжјўužЁЧЧ/_ž$gaЛЧуQF^,ЫfЛ‚Мл:3РтŸмМyћњ‚тСЗ4щзЛЊ№Щр­їO>wFƒы“гOŸЇ,z5У ZиЁk™ЫЖ-И™Џђ FџлЛыё‚Vƒ2tˆ%r‡:z{2…D„OђЫFПРЙЉ‹“УA 9џxв'YŽЮЬ f˜X„e и7/L*М!ЊBР§хЭћГ›-9ж~Х жYдXВXЎL}Мc% ќќ9њз€3ƒOЧs<)у†g.@ :—Ž“œ8kїХлЊ“@uЖ‚9д8–эП§ЗWЏ.V2ю aЩк=р&ШдL\ЖXH„+—МюЬŽžŸЯ|ёl†l>\~8%Tе4%nxz|yљљѓЩёбЭM‹еzƒѕœ›&]/УnKЧвo!]ŒhVЯ1я)†›ЏwЛ>оЙ†IцАџУВ 51И…'Я/;:ЬГ§}Ьdн Щ ЮЯ>Н?Оъ4ЫkqОl6mйР*ѕНАX•АТ$žэ:щS -xUЄCоwтzЛлoзлЭЊєЗQЃЮ]g4›XРЫС{xуЋ1§ЬЪТМъЄЁ*ВгЮ—O—S№ыЩ(xёя7-ѓЋf }ьгfŒЌŽ!sЛxŒоьжeŒ(щюњn4!aЂi<1ФњW7žГЫ9НЛ› z„ЌGB0–LX№F†belЃ‰Хы:ѓ§ДЏтЋчgw F5ФvІžmЖобe–О,Ьn” й_‘ЈК›cѓШИ№„aЊУNЇМjч+МП \nс‘ЈEхЊйоvkМ+OФB_–[ŒhМсmгBMЕЪЭОНkЕfьd&ЊzЛ1‹€NXрХЫxжžЪЂЏ*К8'$МіYХ0q†е^—ЖЂjU7[<е€ЬX,›Lƒ Ю0 1%1е;€MъŒ6‚Kwћ§ІђTž„ТъВ9?^B0\'ІNнt)чЙŒІ UЗ nJ‰Š_cеmŽЭ„c€DшѕЎ5fНЊзuœ!Ц;ЌxT,@њЋU]8†WЖuє`їл8схnП­Т ТДj6 МЎиPЉбфљ F[цАБВ‘a$DлеjГМЦтйCћоБцwхё4УЮЏПZ 'xтЖJуVыы2ёШЗŒ0э#HЬŠbЙйo!toЖ‰­Ымœ|zйСe4n}:&зKиgOв0Ш­лнжІaЯ§aПДxpijxq1чбh ФРujЌ€Хњ ЌЋТъеЖ4 =№TЄЮГjГ/]SWžБ$bг‰ў-#kv№§.оЖMpuѓя XVWB^azvwН€ЬƒзЉЊѕп АО>>оcA)|пnГEурѓMћaож‰kќд-еџЧ t#ЈJWЇЎxПвДќИh“r]eйr{Иџ~SхАMSмЌwK6ЃУЊ­2ЦŒЧЏ‡П}'>ХУїzщћMРžз‡mццsЖV”œЌbMьžthAФЂm;Јд,SЯ‹WX‘ &іы@dIŠ&цЃ.€лvAa!z3Nє§у#жўC.кlлЫ5Ц"ƒ“ьdwXEЮѓ6($%Э)*GgoЮЎК#‚bDеtу++M;nіXўѕўPл<9™.ІгQШЄцxQ сyўsњˆ•PЛf‰eШKxEq&IшљНjИkBРзЯлќžЗЪC$ІУўpа‘ВiЙžПH1в-џ~}xXмМлŸŒЧƒ›ж*М пёэыОŠ§pwшУПд5 ћPnˆт‡ЬдxHБЯ=–&hN—РascKŒЮЭXФ3рЏl-С=О~}М/TnоЙын‹щw>Vр]˜iј*ќy\ћю䘲Ё‹‹~oJ3dџKGt’§кгy‚Е'W‡§c.*X„+;ЫMa6дu•F~+P3FЭіпЮŽžtЛ§оЭљˆчёиЂ@ЋaЊ[“ q  vrsvz=у%‰™вКЗќКВUrџЙк*ВЊk,ёjЗХуїФІ$,†“Mгд№–”’X›jGNgгўхiиЏ‰х{о?рC}§zПv$n6 CєЮO;,nZZŠb'›‡ЅЋ $ЃкЯж PУ}8ЯO–œл6н‰ЃЩп‡D/xНŸ“v9оL$ bzw|EђЂцјОF%$MЌюћњѕak2KpЊІ№“!%сОmйсђpиЄЖЦ‘‚ёlk‹л*Ь~xЏo ™[жКЖЉŠМdз`4,Ф}хРЇъёе5оgбaЅйn щЎ­HМПпЏ| K˜mЎюDЋ: ‚ИкC$\bџ J|Ж…(|4T фэ$нЂоЎW%рћ,Ф`ћˆЁсёаФ–Š;§РKКSN4ЯѓЌЈо~ї€г %нNв vКйзEž/w_x;ZЃ_PЯ–]xUзe†GЋ! VЁыЦ56H}п6TYKwп_ўЫА0gЩёŒск}GY’Эљу7H?и;їІ›ІЬW뇧  всыз§ЊH}л|NцВ5Ÿš6ё€ЁђuХˆ6ћeГCsЋцЛGА  x)Ь6ǘвHЖgy%j9Фj,њїС‰+Lф№/ЖuГ{јіэ€^•ž5ЗаВHт=uЭЩ›ЭвW8бYm" OчЪnxјSo‹8]MшЩLxžeШ#иX. ё€}в8)7їmМЙ_Џї§_ЋиЃџRІџ{ЬfЃ­бiГЏ#уЭЊ фљ\u7m=ЂЫ"ъмb‡gKјQŸYŠœMРOДŒF\К­т(.[ЗўєxиnіпўњАCг Ў<ЋЭэРB;ЎvMd№М–54[ˆš_ЎwxaŒЦшАn–ež`п•сѕ˜^ŒЧУС”тфdлzУ}ЙŽŸ5mВљЙС*ЎЏX…ljъoш!;ч”КYНŠu–•У:T(R‡Ц[пї­IвEQ ‹bџМ3vњƒў„b•р+ щMaЋК“4-mxГїѕВЦƒЫ,Ц[9ПAƒСЮ[nЖL—ё^X`eХ_эиЗF&Ц3}зе%БsкїЏnу9УХ/aГ[Э Ън§уaН>|§іэq‹Ќ­†збУ4~ƒєШ ›~Њ~™йьœЕыв’hhuАЦїm~˜эЁВ*qw_FФЌ{оСkс ‰Тa_у&T…Aу№элЗПbЅѓU%2ШVЯFџ“еy+ЯlžрЌе&LЗ`-о%AhzЈE† +uгЃ8–š.XIїŠ5FнЎСjX„фжЭНВ vэYЖіїtћžА‚bІЙ#QЌQэ [pЬHV „ЉЩ}["IŠ"ё“k,XБ`ЩЯёЪз˜З^е[p“ПС`VТз9§пЅ@‰Њ“ЎDѓж’›Ѕrг)Ї$xЩооe[™Ю ~ЏcЛ^”Џ№Žю§~ЛY–ѕп_Пюšfлn(|пЛЌ"л|іЎШџ>HIѕŠм•XбЉwиЗ@ЁЧфј§АЌОrЖ ‰эmз2‰ѓQьЗo{Мсўѕы64TZџћj]Я2HеˆВРр#лƒ7юRSЁћsйл|{РіX"ƒžп~њ0А˜-ˆА'6&hЪ$rоG@k_З ў$АдѓД3§ћƒв(vAёVИv_†4ѓц (р_џњѕaэФd2vOпН†‰чyІŸbQњч&eГйтВмšнЅŽ*‰Ья•ДЂ4УїMU6Вm“Ї@ *OgІŒQЖяќЏпюSьt1ыyїњ Ъ7`Sй^nБЅK'иllOqlwРн›*ДM§gЛу=qКсИ?‚КI\гI7›и’HZMюaЂ!Y<юRKSe~vљŒО[аРуНЕЪSьxЖŒQ(Я €б€ З€IэпщЯэPMЫ1M7o2GFZэ+OcRДGя€PіА+№–H_П{ёЂ7'ˆё„вЪнfл”хjГ Ўр-F`3хњpПкц™Цє[њ™Сa‰’хЅoЈxќО]G&GJСцёюxмЬЄPŸ_Мфb<ЁЕrЛEѕ–|нDšШtл•6ШVu]Dи}ѕ7O4XI^ t\e(й_oGцAЬ“l l/mјш@Ѕ!ŽЬ9#‡№~с—•#RгёtNsЂj:Q[›њгеЛ?2hk-грG Х_ƒ;ш‚ъ5ЛТ5tПBкdЖЂє[i6vБрєlНпц–jЅ‰ЪNGубh7‚uЫТ_Ј ћ‘СkІ~8рАЅ[™ВтеїРФ^АѓФрвUхЄ"Žg3V6‡кWD=Žr0€ˆ8]4о РЫЖџ“a,DY„l@jV А=ХЉіMl+Ь\АВэ§nщЊbkєn>" хJ`;z”hdїХhјтХ№ХhBВ?дiщ™ЌІ8IВ$А ЗЈЋШвш>$šЄй5ž*vСhрт‹сх>UXVѓуш№ЛŒжuгТЂiЧі”уаXМъj%Э:вЄќЋ9BJf‰­ШiХ Уя<т}‹_зœІcьbU'_чmЛЬБ€-ЦDн)€PrДdZ†њмТ ?1Zˆя–ыт>“ 7ЫLїPA7lП€u( `Йпšxр­#‘cџ†дxн CГЭrРпБpаOs[fVz–6яПc,pЛRг№82jђкПX{ўћЃkНАр<сhЋ ў)Ÿ?2ˆџШr viDюПƒN№ ‚І~›ЄжŸёgќЦŸёgќЦŸёgќЦŸёgќЦŸёgќЦŸёgќЦŸёgќЦŸёgќЧl1_Ьї;ЫsŸuДЭ2eQDн39тязшЊnКџєКЋДЄYЎе6 ‘T?ВџОššƒЭј“Ѓџ;джLгі|д–А …[юКљЗЎ9z˜UšІэ{? ;є[­Ж= § t[‰†ЋнвSџЃРУvšЁ/И N–Uф˜^\фБ§O­В‘э0Žд-Ž|S3lдqџА Б&lБXЬIf<œ ћБaш4ˆГЊ^%о?гЕU/Щгаб5гcз„IЧ^AлuŽWƒŽYL‡Ѓй|аЙ]XqYov(ЖjšЬUYтŸUm#Лq…~Њ Xj‘…QZ.ы:O"ы' ;ŸŒЦуaяюŽДлЎmEЙФF5J>Ёьр?СцЙцGUSЅЎnиaQbЧьВZ–БЩЯчфb2ЁиХdиыuonКЄщG(цkкa†в[иЩ>Š"їїм{њџŒ!)YAЙiŠФk•жЊ"єтМЊbƒЃEг’g§бtи“яюЌ(›ЎŠ: ЂWЕ6VUYцI№Ќ ž0& ZѕђЭІYиљ{UХšdGе*ХV@Že‰ƒ/~Џлщєњ n>žL'Є$FRc“§%і4ЭГШњ‡–І“ёLіВfПkeЯ6Ћ"рЇ’Uo[:ѕљМ7ьїƒ1ЫЭ‡Ы™EIZnЗЫ$№пѓMгRЙр‚A<›В_4лm](ASјB,ZAQ&Qрк–Jїnњ“б`8&4KЅњз\˜V(šбф:ЭЪšЎ‰М$‹є?,fS­ЌЊ„ЂlлІœЖ“wdнkYт9mЯ§~чЎ7ЯiХђ-~иЁАX.Зы2 F *0*ЊŽ§’ЅLuЄ`vл/ Џ7л&Е$A ЋІ LvаgьŸФ,fуЮэmoB2ŠЦ–ШI ЧЉ^”цЉNАп›кaфcЧс2šN”eyQЁž+„WaY=\жЙgГ1`&Wg†7З§;ˆ JДƒ4вyеї Žфtле Rѕ‚М*J ЊЈў#"пР№“%іѕC-Э5ЊЅЫg%х2qдЩPvGЧззНюээˆ‚И˜ІЎ"иi; /0гбw‚bГл (u‘GЁѕћГLџE—1‚rrV­рoщьBtў7{пй\G’\ЫђЄP,Н'Т_oЛo{яНЗзфЬОџў2›Г )ДвIЬЎ>А†1—йеY™чTeх Ы*4˜…тКЎЉ w7ЗsСЈфъЊъWm•EžЩіnКŸlі‡|†Аfљbўп+QЂ""Ѓv0Ўь3`0WбŒŠФHйС–Ю",У^oФš^кšщFY™0O|mEŠN„еыЬЗLгTvEќЙ^Нв ИВ”hzIƒZ,˜нJG[ѕF+яWъoкŽЅГ“ыЫўxЉи^`ЉК‡MШv[HпŽЬ š›Ќї№ШЙер,E ЊљgоЪ †уйПM'ЌЗ&ŠKЌXUd9= •_aЂ{ЇН!ЉЛРiL/ЋъХiSOdlсД=ьЖЛMbkВШАЂс:ЂеCB„i -]PЊдћ§fЗЭL…х ЫYСp=[цˆnГѓг›о-ЉлšЄ:ЈnoY^„:+шvЗЈЇ}<Ўc[—eй№уажџЄ+\xLPЂr u~1зьloЙђu–пГpвLDяѓЭ№њŠ%гM[+™ЖЩM9гЫзЛ;”== Ќу ЏВ?kЊYl!,ЉVкІ–Юїњ’1`зF&O"t*CSdYХаUf4™ѕn'Г~oЩЎІœ Ад7СmTU˜\s6@У§qЗЉ` ƒ›CЌЎж˜˜ДŸmаћwЦ”WtCцEIз`ЈB ЖuмфЎ ёР ѓ*l›)мt0ŒЦ“aoД\Юxг В8€дgъђєlЎтѕI@,YšцЭР, lIўpYА…€Ъ ЧКпюЊР%3„ПЛє4–р ?-†.ЖАсˆщЭЭэt6КНю 'K^TЭ"z†мЇ .(EГ"ˆ“)№с(ЩЊ5Р—ВШ<ѓБz]§ћXђ(Єkas нЮQoЪuЃzЗk•Ѓ8У‹]6ЧБ4‘žћчЇW‹Eя§Щээ’DВ~Нжъѓˆ$=CЂX(W ЌБп6ДЧОˆїжУиж„х\вќѕІŠ2qŽ!!Ф8ЖpSV“лЯ^L'/^Ÿ_\№r€їцyЙоД‰EпЮPGДиoЖ(8#ЉnжД%01ˆ>l3'kVXрфаqК[ч5bџ6VWcЮі]ЈЋсœCU#–Z OŸНИ8џєі§йхuБт ˆОзMта3IЗМДСfŒ\xдnc]•%vіИ6г’ЂG€˜3PŸгМv›У"ьkЬВcš‡†ИL(%ьj№ђљщчыСt9щ_оNA‘eE6Ы6v8mГйcАtUpМ­E \СхПјBFЏa§)To"лyзћМ4жšзн(‰LYЂЦS 4K‚\єоМŒ$Бу‹ГЯ§сtAвМhфmlrбRnБEgэJ‚ъ—ыв‘™IЏ?ž<ЊбАtdеЮ6mъЈт|@kЩ;m4M •cT'„ИЁЩЕц8ЯFзЗдU[M‡Ѓ!XН`Q6Ь/ыШ^gy’€…%ЁЬ B[zОdѕQqѕ’цБksгЂ&9Ѕ”hгй\fЁЉ2x 5€P'pфrХАœ МЬб“ўtЩ ТєУIoСЉІ$,8‘MxРг`ДЗ4 %—"€-ДЈ›ѕqЎЇ4УIК—Ѓ”Яа’SnлMуЁц,ПZrЊYќr6N %A` R@­TЎџъЭљчBа]пs\ЧPMЛ яŽћдаМ7•Џё4a>єt§бHЬ„…шМ0G5žzZoз›\gЩйtNђŠсљ†HMG“щ‚Dž"—‹йœСОyЋСлЗЗУЫЋ …ђ)ВЂА4?ˆŠfЗпf–jy FГ+FЖЂ2uLѕQЈљl6СІQЖВЏО)‹ЯBР ыPєЭч„ОЁ ФhFв"ПšGуў‡зч§СЭљ‡Я>нЎ/ѓ%ЙZЫй”жQбvZЬ(lЃ{YS‡€ХŽБнЮуt&$ˆ•Є™(ЯQcГMY%#YЗс ЂOЊУCЯPyr8Z’Фtб™žО§Ыѓ—oп<ётХЋ“срf8N+ŠœXлMZдМоЕ#ЫzPжЉЩ­XХЩкІРоІ?нƒbN1xP* шwcЗD^Вѓu]mжР;D‚VЭ0ƒ|,в‹AFƒ^=zўєеыЯЗWƒЫ7O_]їЎ{3€кŠЂ++ЦАРjдp?мэ"U”ь(/#Р#lЁЅЋ?щзD'bњ я5ЬƒЃI<+ЙхІ*жы*1ŽЕ ѕ`žЇУЩЂkы'rє№нГW(H"L><њстффj†кЊ&MРЦолУёxПР-pяСKˆGy‘‚Ї)?•iA3КцсU‹лEф‚{0<65`ГЖr‘†ї l•[ oFKZ„€8О:y§ъєv†„ю__žѕЇз?н АxJУ‰яіwwkOц Evњ%`Н$№зќvбџG ЫёB-6и-Сh@DЂSo”АjBMІIЩ}]dfУбœXM{зчgоО?ЙьС—‹СyŸТТм~њ<Ѕ(N3‚Ї яЎТЦгћФ” BеТМp€b™њOEkI”ци§iƒ2ёMtрм‚ СЃ.QлФP™ cј!0@РFУE’Фr1эŸž]\|ОМ™ЪК$ЪЋЫO7уgX Я‰Ђ F—РИwЕAPPЬ•Ya‰а4ЏЈЊЬўјю ЋAюQ-ІE ЏћЫ(ЭЩЬќІЉл:ЬП 5'Аef9М0xE\РЮІ9<§єљjТЩІ!РbžŸнЮ8&VЯ6ч­нпэx\ZФSЬЧr8ЅрЁ€Gќ0L вyР”[pŽ•SGСЩіnšu Ќ@f)еєm‰™нєHШšjšЊnЉКМMоФНETдСЩЭBдu‰А=‚TЈё|84р•€T…›\žIxBž'x)Ђ˜Ёd%тfx{ЁМ–ІhЩ(6iPœWцVВюй5Ž)Iвt˜Јmš†mЊŠaлЖg ^˜CœоR€p%ОгŸоЬл6‰…"FЂ$ єфЖ7^Rр~Ђ$0?JЭW’“˜ 8HS‰гeI@iѓ йlš5ФiЧlЧ’иaNЁf“)%rЬќj0Wy€HŽr’Ў ЅЇ7І$Рjјyйћя_Г4~ЙbYv9ž\Ї™^­)?JЭ—'0FЃV D}SBeIq*Шg›ѕЖ tEЗB™5…šC"„YтƒЫO~Ж”8Š hNЄV ”ЮNzJЌи†Т„ДИОЛЛП;l3[Ї†+˜lš‚5щzнnƒёƒao2‡,І9aЕУі|‰­Š'HjИ†МнСЉид–ЃХϘЌxž] /ЮnЦФb"щЯ+І&Ь+UWuт|ИŠ!ю[Іу& jл7 ‰% РvmкГЊЎЊ" qлѕ,†@Œ!У&и—wзцЖ" Тїбшн~(§+ѓ'ƒ0ГЫ.ззcFеT$–/Т3fWg#^“ееЭˆDj)&LЃуЇ56н?ЖžPW3`~)Ќ;)д!юКЧ|я@E*ay !KбБбћqП_gЖкЅ–лпm_C];‰'H^–E˜жЈзŸЌфЎВkђЋХ|֘ЬbtM‘ZоіIQb`Іu[гРЇлюA6ЎЬ!1†sqижЉgh0ыЎSМiзЈ>ГЎ;Ш@%ЄŠ oЯ“ BUЈщЈS˜ Vфbvѓс]SeitГьНўp3#)ьEˆкuc—лэП ъmћaЖ>оэк" |ѓ;dЅMнЮšuUФžЎj*yЊv ы>б$vЦM}з2UЪСбфt<ј|6ЂD]œаLpšЄ„ёыwKUTІ}Вїъне„`’SЂОjƒGыЛN8ЃпО‚hЖёMѕT|И{шК•­7U№]–АЭПюSжзёАEzРO]ѓ-€’аˆ"—“бХЧ9  fдcuQЕlјгP–п.4AšЭшСчбtЖd8~ А€яЯ4ж|‡јЩiАiБŒZ~8$юС‡‹&ѓЭ:=4в…! =trO0зрЮm[Ј"#ИsЧs^І“›“%Ьњш†TŠ,IxVисЧkZGfБ€ќNЌА+ѕ7VЩЎp7ьюŒ@иЯwЗ/tQррsсУцсНВsхыM‰Ђ˜ЈSaЦы§ЗЯ@Qj]WMS"KЃ@-|:KУ<ѓёttNˆлЋќŒт˜хxД РИЋ#Y†Gбƒ BњФ#q-o@J˜Хџ6зћL‡O%ё,НzИOыКSBP."п1 `Sвcїy;СЪƒК]G2Рv<Њ€щX-7§с`2;ŸШ"б'5Ўп#iŠ р[М,Ь/‡Š>Ёє8ЄФБ\Ю1ЬŠтѕjгјZяОй уюаФОc[:Ќ%€7ZгВ*ž“Й^qj`Ђw•Р ыzS˜"ƒ’{ь7ЩЊоехѕxuu!*Ф”EQгГ1#№ьЌ7чтќУŒК тRСщŒEe[дAtЊO_ ю:н.ќГoсяѕmгдС~^>]юПмЃІ]UЃд^ЇІжŽ-2ѓ pѓЖMLБЃ_’€‡CфшъЌЯѕ>ам’ф&W_ПўpqѕљьУЫїЗЃЫзOпž )4ZVУrW эКWUН>мmСAއoъKЧ}ЧОч‡0Ќ?иhЫŠЪm'ГpьzžКœ…ўБ]w@ ж%vшVQ ’3=љ|У^ѕз“щхљљеЇїяпН§јщу›WЏ_>ўќхћ›eЇAЪQs ИЊн ЬЪКn7Лћ#DКУі›бw›,ЖАЕa'1ћPє0иёвЌЈжћУн~‡z Ч.xьКЂ%4:4БИДHЯЖ:ЂСђЬрšž=ѓъЭе„ˆШt4Ѓ€d_Н~ёщ§ЛчC`[ІЫ–—г 3lЕОЉЫvГ9оc|юЧОмmQ9Х0P,[ыєе˜јбЎяЇЁдjЇ;ЏЭBдVN%гNZ4m]ЄX= Љ@фb0?{ієѕд !ёЈ@ pПнWњЏOЯЮn +H–Ћ Јў™ [ l ЙќюЫ~ГљІ‚ #@9uўQNиА$8е4vЧш/;ЈЛ‚ЫКsTъkQі.—№X'ЮСь2‹CЯsl…чˆбх‹чOЯд4ˆCќZu'ˆ"ёгЋГл%DsХ ЯДМЄj№Щзu‘i„Ейой­БП§н§хšеЮht(^PœДS€тГn2Ям.90K"HJІ‰{:"RfЅ{1N:§Эm'QрЭр{оw(bр2†vUф$rWTЖћЛЏ_юП@pНП цš YU&jКЋІJЮо~ўt.t5ш.ж›КaЃ,[ХљўљЋ“!gњяXЈ\ЋIDЈf5DШf—v2'F)M085L %€š’L/уМкQБцуў˜ |д2Ц10Zз%rpіцэЭu?„I <зCY”0 рOлƒW/^ПжAщ(RбyЊY5Фв-ž |лщаЄ^˜ћв7zЈЭ`4Vˆ=Сi^V–€›Pъў В—cУ Žу:~Њ …@ gу›гг!ЃƒЙ!–rG!8‰ыћ1N3ZЎ\Пўјщ|H0А€]UсEZ‡зЉЛэ~пm>"СРкЈЂ~ьQZзОўFƒ/j=Я!‹сЁ№цљЫ}Ї~‰GъЪ€L—ЕmЬ/Щй№іъj<ыX7)sвQ'I “э…a”$aF0ћтѕХехеѕuh- є2ч:ІiФi!’т.гЖ’šњБjjУГ†kqa‰ЋLM'œf%k№ X‚_1Х џ„ЯіЌФU2…˜н~zёК7’V 8ГHb@’8єН Šг,MКЩіUzr~zљщЭћЯ$xV‘…№ЃЁgщ)ІЌNeНM!у@:”№ЄЈV”Х€іj4O+3+Zвуэ—?цИУВaJ*–L\`žHN/пООšЭ9П`RБQšcŒHBЧ…h_ф)Ь{”Y ЯnЯпПјАаL3№u№РбŒCїВфїyрЈН#"љ5€|Юˆ,^рYAі6Ј<дЭ/Р@ЊИЙЙнy+щ№ІЬGgŸч$яЃs г—‚Y–с.ŒаY^ТД‡№_5Dш˜›п}š+2№DZuSсєБ.]уЪp8I‘ˆz{Žњ`Y+R( С_/а—wMYdEЛн#)шбюZGЦОє’8эOF—ЗsСЭ8еEј(ЭВ"ЯГ‚mˆ]фLˆe?u™ьХщ\ЄG+TјKфƒБмtы(ёЧ‰\ЬЧƒ~Ъ@~Бnє^‚ +*оцxиTИ'$Жr@ тSЛнФgj’ 7ƒСѕyЎмЏ„™NѓЮа4‚/РЛѓ,Яaњ=/Цы]ef.ЎЧЫЩTVDˆ{Кoq тђЎА$ Xдr<ЎЮO?žMХ0”‡MвXBedЧ}ьЧФTcњw‹ь7Л6­жEh){}е,Ќ јW^”qF'y Q+ЫК.аўoцDAбьЉ‡1И—ШаЂЃьќОc‹0?Ѓ/.Ш ‚qФрз№пYGŽg)О€\%@IА0LWЁ}к№№DuПщ”Ы‘РWVp;‚чщљ 7Ѕ8/’Ќ€ˆњŸЊ@4иЁ)Œ,ˆ<гvuѕњ”вQBтF™#ђƒяХ6ЄV7Г< ј›:ЯCЧ“Б%ЭђzвюR]b RD—геЋ['4ЫrНЄjQГ<勉%Кe]–uE­ Di№hq‰0рs +иє]aѕцй“mеіƒЄ,ѓВ$˜y*юhЈ–уСмЏл,)bЃЃ›Х0‚‘o_Љ <VтЪ.>Vо;и!ђєрv%y€žЋ:—ФР Єг‚ЙВИ^в2ЌФсІЯўэŠ–Ms!ЙЧ!6@jа^й/з[ЗI\Ф*Cކ}’e9С­7ЙЋ‰Ф”р 5ўhё&ЬШЖlЌънoK_yb0уф 1Bndюж‰kй6^€?HКŽn'Ž0њЫПžг9•ьР!БЃдд УєŠM.Л›*ŽЫDуˆ›ўљй”ЋЕЄmqw“œ-iўЧЬ УІWћ]юB‚™–1јєрцђlАb8AСЪl %НќЙЛ:+wTТ Kш‘%yI4<р"MVЛС=ФяFРЂ№§Пќы)№@fкѓсЯ2,…ЁМАhreЎYHГ*Г8fzs{vI`Ђ4€p.§x‹ryљq€Ъ{’ДЧ6б%qE№’jЧM‹-F*Ÿы ФИ_?JК=пГ4Xѕ№љПžа"8мЧя§Ш Ђ<ец+x –мXb48љLbXщtъs=ПУаCCѕњ€ipˆ`{Ј|EbЦsA)Ќ7 $A—fjRd/’аЧР БJhvњђ_NW4'€{X№(иeТГСdјЁР`(=.rˆ Uс #F'Ї/`9]вlП)sўАK“У%^ЕQd-йЏCCсFЏ(A№ЮAЛ.Ы6•ˆй`iіОэ…yА" MСшчџrF­†nт6šыz`3fA пЌ3+іg^-ЕУМ^7‘ЅџЬх"2"DДАнФ†*Œ^=}Гd3-Ћf]—mpzLФјЖбˆзolмеRnєьџ|ZQtм>…Œo{@ЌЎJ@ї2рaeYVgd‘zну8 Ї—˜jэ'дЅрfЫРбRSUШГ{vђyY NђfнM“tИH…Й—ХэtѓS@yёёх^аЭ.)[Жcй.D}€ЊцFдЫ 3‘чo_,yAУ8“6 ЊoўјНB‚L”ЦTИ›ї „jИ>в­ВlŠи–4"иew;Ф№š5vrёЉЗ‘6бLь`кŽЊ`~ „ATТЊb“чЈЋ7o^ПК„5nRIы&б8ГИƒE|JjAˆžМПЪS‰чˆМq\дyV–Љ…fK2 НЋ‡Х'їпПyћў|Ъ+2DцлBСw  ZˆщРЈ”™+sф№ф§ЧWЯп|^ђŠ yЕЎ ?nєb4И @3;{uFшКˆЅр№šqЇ Э‹Фtм'н^Я К2ў№ъхыГ1‹'l‚^єЯ€?–fxQ€nHБ)]`Щy8њќюХ‹ЯаАAnKТЯ\"WUнI+ТСштЭЫKwЫ$dV€;G`ИЋЉxОкU@ƒэŠ€E1КDѕп<=l%*ФУлюЇTќE л0зqUcО&СcбŠ9}ћєеыkFЖвЊŽuёЇЎB р€IjŠмьѓЧзЯ><€š‡ѕЅ№Я“xЁЃУc5Œ /ёуLѓєєэѓсj%Љ‹UCHTМRЄС’ѕCг"ЄедХŸчEЧŸП{іъэ +hA……–?uŠ€ЅјšФ/>М|њІOqx  /\С+hY<РTЅ;/ъNдсћ’xѓУЫЩŠ’TО+;AfCЗ`9Dиќ4Ed)Ие)(ђќтѕѓз7Д лyюШТƒїџџюр№Њ2ПМ}џђе‡о‚ –$УАМlxqYЦQV$.nBaэФ ‹VxRођуЫёŠф5љњЌoўЃ"ЇЭ#$@Н Е"еfмЊњтХ)ˆzпSліw–оЖЅњoŸНx{5О§|rM2,Ы+ІŸ• Џм3”Ўf З‡`™Šœь˜,ЬєѓH.Љѕ`бwN•EІx* <Ѓx=Р›хе‡—Я>Эщ,цŸГ{M(XG=zїђѕЫЗччo^^PX„$ЂеyšЗulЁSЫ ž—ˆ"Р|+49†јјєtIQМnAРщ”!З"6Е# ИIчб‰oЁs№{y>!i%Тs@+UЩ­кwЃђаж№œЙћWОyћщгЇoNц"TёЏѓЈЕ-Б§Oз †ЅЧ—c–“Н$oБљ]…Х+M]c Ћ _byт§_ž=џxГЄхха#š"У–X˜:€_1Ј@ЮчŸ^ rzu6шЪпЯц'xЮ‘ehЦptѕщэХŠч5ŒС]ёЎ†/8bЭж\ўђьtH0JŽ…NiоlїxVхˆMbТкЄ–Kd "й^UMa‡WS–яјїСщ~т(hѕЧo?]нL^Д’ЂлС’мv8Z—I(ˆ~zїюjIгЌUСc яwч5;јЗN УыЯ=pš&&C˜№№ŸНќ†ИМ93мфf!™YfЋ ?я]\ŽЩAвЌ Tcг0bХУ~ЗFЭtШhьш§ћ[œ_ŽзXIйbYž~рcW‰лѓлСpК$—ГйxL*ІљњcЪMKвt.ъТЈO+^™{АфE–тE™‡yTА2 яށw`?Ј –&ŒпСFЏЯБsZSЗЋBiъD™щ„”С­%ž!—рїІ—ж@УхGlЦфX‚jYLoТkq[…:f,pЈЌc‘ќюлI4жќV‡gФ=ъCтKк6mQЌїћЎ Tj%(ћ”oУbѕ\:КјˆFг–‚dо[IV.щ`6’Ѕa/мщ;bщ=ЬуЖMU†$)†нB`фe3.aŽ7mUoЛЪ™/`uƒаSьіЕ;$ЎcН  LШ7лoe0нлжУ&фrp6dёR> fНG^у,=юз•ЏЩ*юЗXЭdћQЙйяяŽЅPQ\=V;&МEш–69_ШFŠВˆeеUхvЕ<ш­‡ЛуЎБйIQФру @ZВ3,њ‡eкHcyіJАiSаэњIБ>t­• М_'gД!lXqю™ьљ­Ј{%ЦZpM,#мvѕtXЗ‡S}м•:ГBш:ПшбX-Ш+AннeСкOЌIьќhЛnxl<},лэoнЙ[ЧЎm<ќќўџ;ЋeuьшуsRбxу›нЗяБШ ]њюАЫŠ\бЋбР?–АYхvпЭф—Џ_О~эъ]Р0ДяёйБjТ^ иWЁѓр"о JгУЊ mюЊЌР bpх-кŒSŒї˜ОмwХ†ћPЄW+†fЈщ№+ю9kщі†нЋџьjŠюО=ч]WвvwмTyVэюіЛЪЗЧlЩIf\gŽ:>щcUУ ’ВЋvХr§Ё+2‡м8<6лhВXВШЫРшdлM4жйv> ›хaeŒ6O<лЯЖw`ГЅЫ §x]N NqЪ62…Сщх˜жЧG9ЌУфz‡W™Р_ЕЮ.цЫм’јƒаъQћ­ ћ^Шз/X,Afшs@RYфX№ЛџВёёUњ‰§Аџ4V<ЧаМД•oJЫоѕэpэr€WуС„ЄэёЫ}gt.г‹ šУL ]ЭWМщєWєЏw‡Ж,Škр<їтƒŸL$ЏМ;fxоЇеЬ  uб,7Ѕ €Y‹ЩdJxmЗ`Ьpћэ§b‘šТLГ;[АиеO7НђЦсюыo_П~§ђхX6RЫд`ZсБxz1$ЭАНпњ@pА оxœFЩТЗ§3нlы/„kJзЬŠРNQРђ$Ћщ–й—/ЌІ3єif2х8ЩА/Ъё^ън—nмRѕ8žY,ˆХ’Ц;'’ю0Pžщ8Ю#­EAз`\П€ФЕЎѓ4tm]8LЌ(†ƒdТИ+МџЕЭSѓAQ+r0юkyA„w•‡aІПоbM —У,ћ§%+уІ%0БtsМп…І&kжЃ=Nзм8)*Мђ‰n‹ЯР0ЌЪР Ђію+МџћЦb6_.чуЫ#ШvEI‰§‹і`ѕoПН?ІФuG‚3l7Ф‚–ЌХЋŸЙ­ Ђё%џѓ€(э'qœЄР•КыrЛ§oџУ:rOДƒ…‘Ёu%–Y-—‹Yя#nN›~9№6р@хЇЗБ@Щr№.ЃхпКо§vИЋ\C eC,В%kи4X1œЈТ Œэ=wxaНЦ–0–[ўqu  UžgŠ$Ч'W4аˆ.ižaбiхАN=зOы ž9A$ŽAќы§О­3Я’ Vг~zЯуoFМ;ZT4ћЈnъ ;)v ж:Fa†WxА’}“к*ФМБ|}ГтУ пї &‚ б]b)ою€/Жп–чo_Пзxй4Ф'д#ьyќ18Т'3#XAusМ)%ѕсn_А<ƒ8kvЅСшm шAУ*Wjк'9^EјЉuwФїGЌДEЄwЗ­Мz}МG0ђляПџvпЦюN*0Щ(чЁшКBЭІЂњ5‘ЙЩцXёRt'|.§л—уОЩc,Шй^M ,`ддŽ™xрV˜ё>ођDPk~ыїПўўћБєT‚ћ#ыВ*’ГХJ”ЈйobЫ№кCaK‚b„ bKHА˜л:K#'›%ЬЗ6txљPO:ЬŒо™,ШwПђѕw0њn“{:ТGяc?ЇVГ'$#Њ†_oлаRЭтPZ+ "ЯуБ‹w`YьYŠ(0Ггq_ и€С“!.ŠXoКnŒў­+ЪPEžљSzgOiAСVНmdШZМЏсdЛ@ФFџ†`hЗйTiрšŠРM†œ$‰+рœ/xУЇ)Ы С—пўњзпрпПў~Xw=СЋў„nНРY<(кD$ј ЪвœфдŠ1#bpи­Ћ4 \]F—S’ZŽ'гЩŒо ип#^ЊЖљpўўля§П_ЛВlŒЅіNcd‚ТŽ&5yЩпьKf)N 6ШІюПv—Zзe–$Q`ŠвшЄ7ŸЯ/њ“ЇЦб$7xЯ§§&њы—Уf]WEBžњSŒž“+ŠwЪд’UsWУњЁр&ћ?ˆЩ§нЎNуЎфC’њ'ƒхb|y>ЁР‡в  NдсІo6Ѓе№ч+ЖcZ7И_ќчЬє˜Ж`Й ‰}{П/ВдПщ X–зЉЅF 0NœЎЪjГ^%тF›ЄNžњЖ|љcРЫ:нf1CjtPС‹эxU—Б%є{œ›fО­ђ“щЄлюY^ ’Ќˆ-й š^@ѓEю’э“ZEЁџТю:џљ !,i‚їлufIМ—ыUф­Žх!Ќ?;НЙiї‡СІжфЖЄЦ95JSпт№чуљr^ЬэМ8ќo1ZђтbIMЫŠCхЎЮpNЖZчОйПd§4rLЁszеjѕњ3+JчдмжШWЫФQ8vмэJnИЄХЛ^Wхj™Цwз§ЮЭд№3ъ懔M2ЋРfлŒ/W‰Уw87Ч’ЦнVЛ;5ЃЄШ=SэЂ^/“Р”ЇWЊŸЌ{„‘ђЁi№kюВ*Э‚фЄiЕ#YУmщ[гЃ+йŽ—s_‹0кЕLuжkw'FчЉЇj–Ÿ’њуjcZЇfˆ?НYз‹ Освlќ] •{2 <ˆŒhzЩВщQŸ^:@а,VWКˆ-QД~mя]ЕЄC“–ю%ХЂ"ђeZŠjG $ѓu‰tфY*7хеПвићПн™fhТˆбэ`E3 ›ЇиКЋS_Жv}[ŸŸ\tшаЖм|QUˆбuYЈс&ЋЭfЗY/CлиЇЙH2пЫц#ifPdŽСwGŠ!ГlіЛ…ЋёŠэ{*'йqь*д\ч;ŸN.Gѕ,в­xБ„_DY‘…†ЌšN4ЏIхs[Їˆ oPsgч;нegе™з‰kŽ/'І[Аэж˜hо№’ит9Щ |KxI]L зQEнЫ–№‰Ьdг v‘X‰%ў&УВUс™OдЋцџ;Вi`}ЉVВЎ#[ŒuЗРtеsWa83\,#C’4Чw q8оЕZŒj*3Ю ‹ем3X^5uv Лд…pЗ9lhAm5Н†—ЩwЙ‚=UHvдT=ЊЗ˜nЊљЄА\Ц†ШЪn PšКЄеcкИеО8ЙщuЦЂ0j~\”eYFгjЃў^еn І7Ќm#М>ОBБіБƒ!ХœКЋо™лU3ЎwдЈWey ЛœвЧqИ†ЪЖ љк=ŽщNj ФQ$q8\_ІжИ$єЙ.‹’œ{Kт5Бk“цЬ?ЌЌ™~ћКШ+VКйЌbЧ —Л}•шВ$h~’yЄ{טh•Ÿv./n†§ГЫщЄ/Й^T”$‚XЏБЇоД9ATУЭэ~ГLЂˆ’дІЪГФц‰Џ&Ю$е ђEющТ„5‚ 7ЯынvсFMu–•mЯsLUbњЧч§qчУ‡vП/šрŽulЋv›Тз:зSjэ†ŒИ+#з дћЫЕ,л~ты;C…:яЏѓаTFШ/Ќ-Hn™\БНЂЬ~0 “6Ін“7ћ§ыwoЯ[]V–4є%ќДофž0Є&ІёbCŠ…‰mњsвЭдdYdŸј*šDК[$.žЪюDїЪн"Z>-Ž;\T˜CІгЃ§БйЈ{§щї7­Юѕщљѕхuw<дv[ЖцUlLgv”г>ТaЛЏSЫp ъ&#Ž:Ok1œƒ4CёzЗ5‰чŒћ’•mЗјо˜л '˜бМ\’žЧЈнєАOпџіћЭpЪ [ЧЇ7эvЛЯЩ*ѕ)Cm*љiЙо4ЗѕзЉisфE}жnfТ“ю…Ь #(ы2€ŠўD‹АшёеfSИКШш~6Я"Я2”iяцxДнК8sГIПsuеiЕЦ чОче*д8…:ж$Х|@’ТаЅ§щˆЃ&жюЉЈ“Л И №@W—ЧcЁšŒ^-лрЇВЮ#ЯЕu‰&Ќ Wр†г^kРШтД}жц4Кп7ЏжeьЪЌю:a^bЎЗUЅ‹5œDbxъ†Œ?z:ЋЧ3в 3R№Р@’QЃѕ–€%ѕђа&C@j…L2{“)'’šМ0щѕ›††§їo/ЧЂщFЊf(= ^V7зпГyЕЉ‰јЊхEtлќщuw2#ЃЃхЊ@Єf3#F_oьMD FЋЫ3“б„IяWѕ9j<ЮќђђИ5U-ГР WёКщ аююжE†•Ж&Ь’уСКxТЎFQ%j=ГЬ”З‡нэ.5eN4ёЄ'*ЬЁ‘iвХoNŒSA'ѕV@ИšdŸз@І˜ YЕц[тH L˜Ж9#Ю]‰uк#Qnšc`ТР€ы}Мp фв`;—7Ќъx ЦЊ&ГpЉŠК`э— ‚мAAcиp“јэx#T’)нQЯXЌqЂˆ’цWЭ&оКp№ЎЅёX1BЭO{н™Bк=2? ќAЧ<]Еmf&Т­/{ŠщиКHЂ &Зм“Ђv™В “ш’Ф њcъ‰ХoТЇОеhвмЃэ “В_—y`a*fЖ!Н-=ъ’ТO8ХŒЋ…YП;“xEšл]…ђ˜tыw&xЅ0ЙЙš"ЉZЊ ˆ$ч`КХžZFжБЅГQјЩ`Ш<ЉJQ—ЃotфdъўdE+’ˆ—E €б^}hєDrS$р:Мн(uРf‰ LzѕёCkдž‰гсp<šЬЎF@yЩ†c4‚V ЃVМЙ=мЖЉ­neNњ Hу;Ѓ~п‚AXЬЧxЪgšСœBЖ+„;щ1мюёfwыˆкVђ э†‰ЋŠ“сˆсЦWЧ'з§СU[X’HеХЋŽцш†xvСiІЅВб?ЌЈщц>5ХоМІ‘ *VѕІZЭIёљ[ZіђXOђЄ7`eнАc€2фмТ7$ŽW9ьVЎТrG@[ё"@’ЩАгщ\ž^OUTNSьаъ|œNр†Ш‰šЬH†эњsъАИЫ 8`X,1ЧXэыyŒд" !ѓЏ5ПkcA_ŸіБЖI?twи• ОЇј5mns№М0№˜)|PяфИ $G§ЂРu…ёdТ0рк№МХˆнg!XцyI`GќxЙ%н‘2pМДк‘ЬС~ПN=$/‘eXVдŒЏдIaMКиV~43)ї­сk№E6†|ЊТ`І‡эЉDќj|u~1•бейMW0R$IзDМ›бљљѕЧWЧcYЗA8f:ф“RвСтЈЈ-4ЉгР5RK“xŽaщe9іWnДЋІ/ЋджEтЦS‘ŽД /‘фЏ‘‘@Юv“i" ЫёЫ!'‰тфќфъb #hёэЃщї‰“Kк™&зыŸџіќюс!ўЃД'Д'Б"B~xLљ|Л^JL8?‰ЖэСWВ`/}PгTžхE„bАўЭв7 wЙ'ЃзЙ!ВЏГыЫсl6юП=ЛЙьу)ЦнЋk;99(Іmiъ№§Ћѓ‰Є i€ƒ“‹йєВ 4’*Dc МX™Ъі’ЂЌЊŠDxП‚Ф0"ˆД ЦŒŒZOКŒЊЛ‚зšІsD’нКЊ G˜aЗ7d@ ћ—знQяќJ[G-A3ЅЮљййёЇ“Ѓѓ‰JЂšьљЛЋ)сhМ9‰R—gЭpлнCЗSв–ЈЂЬ€hЭžћ€вБдЧݘ:Iz9Eњ‘*YЅMЁMYЎk:тЉV@Ѓ"лo8Ž=iїЦЬ№ь’яЕ)н‰7оНџён €UEъŸu‡Ќb‘Ќ8EЂD’зь|ЛньіDq1нK—zё[^VmvЗћэ2ЖёАЧедчЬѕР?ыzЙйє Uб“§mЃнВ;lЗ;А­"0UYї$A`€ЯиёХйєђJ1 …ыžžоДЮЯN>О{ѕq ЈВ:Кu.z,УАЬИз›p0’U› мтЎщ]G†ЂлбrG_жЙЋ)Р.6кВќ8ŽЃtЕ(RP ЫkjяI}>яі˜чЊL,’$eYAЦПD‘‘›]}гАТѕƒокƒIwnїЛЅЬЈ?akoЙЅˆj‘‡†0ў№ъљяL†ОEGфЂjP‘Љ;9э"ݘaО$ Lsh0XфЊ­хžМ&ЩТ]nbi`Ž%‘ЃnрЎякЕy’>ыFЄЇ13 ?\ыfSNТt+Š,Ж”й˜jq|єъЗ ; hU™I;˜ъФщœŽйРКn Цh‹˜а–*"^ЋЮ’6Ж”msG8ЪГœ а#щ^К.D7œˆ2Ь@o((ЉWPЎ9ФAIОZY0‚М˜ч)Щ эЏоВ&ЎmЋђєгЕЌйžФsэфxФ“ШЮ Џ–y`ъІЎщРyВbдЛF.qПˆFHaФ=#Ь#їб>­›ŽЏ0Љ›Њњ{ŠНkBŒў ЃeKЅ€gЩq<’ŠАUЖ§ўЭЫkос9ЖІqЇ7*5 ’Ќ˜НљаF$АуљЁн1ёз“œКЂ*Њ‹‘&o“ТWiфІ=&CS477кВм ЮAЕ@ёх“ЯБ7tR’MeоcpIрtуЁ8ixўіэ›ї,ŽcYъd ˜цљaaыеыуdФ0"1№mEІщ7ЌoмƒpaъІШI4.V…k?QЫї ‹jъeЦћFCfKЩН9Чu‚8RЙ™h*ІE™v.о<ѕКэЦ~ˆˆсЙЖ‰рa;DšъЇПП=Ы– €GФГъЖ†ˆfййŽЖdїф}ЛfЫšR.СВzЛYEжЃ5ќ˜„шL&kоˆц–ЄРю ръЕ1UН()ЊH}VŒЇнVћќэЋ7—hN„!ЊЛ,‰у ŠВ„=>њttоЭ8оє}гŽЃ0ёр<ŽUм:hф†1ЭЄ=хIBЯКZ/}гz,Ь›ЙNH‚NшRXп5"p0*iЏрЏEЩMђхК T]њW—ЇчэіщбYGіƒ0ТOињР!h‚GˆRŸЙЙМn:=П’Užхi‚иh•w‡щžьEТ7 b‡†юф п0[2ГэаЅDЬЋюђ–ЄZЃёЫaG+fЎJФ}ёоAхЄж›зG—­›іDv“˜іФ“ЖЦ‘Oš}i–—G‘+N†Нѓуo?q~œЭWБІYшшжšтџ†œzСе (б?€МzPЄŽѕи­ББeЄBХЫfvhT…ююЛ‘г7Ш^Е`ч_ЈNшнЗG—WэЉ•ц’$ЫѓЖЦћѓ‚fk3№u|qrzrЬє[|нtI?"мю :Rхifˆ< 2DtTNV­(ћ a[R„t …ЈХч?юяoжвь`бњоlчОeиŽ-№Њщe0T]­JpїЖ/–PЋя‘ ђ‚ž$|ќgю2­ж ЅФyŽoш*UR4'e|pшв?2”\h0PЗyІѓXЃ я0йšя1ЫћШ9EЊiДv‘Ы7л2ѕсБоddFž4сЇX-Wх*CЄJŠb>/rФiV,–sк:ЁћOU™ЊЌ8жв< ‚Ь•%У…І[2Ф7‰"Г1УнЭfГqЃ…jЙцЃг8oб•C6MQ†G NFœœ4ЃIR~ЩЬ kЊEЁe:ЩЊZЎЊВˆАъс$ѓbQфБGnЊv‡aœг]Ди5e-ЦSЋ€ђRMяЅч˜ŽЦЬ S=їo.ЛЌFќБF“ъЕeYўrП)Bла(џЉPэ}lI—љa?/—х(ђтМzZІЅ‰‰^KdБчЇd4~РЋЃ(]ЌV+МВа Г(Z,SL§–ŽЋŒоšШŒНЮp8Э1У›ГѓОbцу•^$кыtѓэ:Еuк ’nŒxMy‹ˆмfQXЈV6gХёЂ €ф˜Й(Юч€зsЌE:Р’%щ>fк-Ќ^Ў– јM@хb{B§еfНnJєЋ@ц—ЇЇg э<ШТЄпrWMЁЃK3кьrз>PšЄЙД7жьPьhпЖзЁd$EY—ѓцюS‚8гQ:шу< Т ю +›Љџ0яЋe™ћп†XмnA7GW}‰\}јдгЎ™к>QўЏ8x™ЪЊН8”>8?эVPTЬХЁI\”vё9HЗUf™ё’ЄŽsR’€бiŠ%Gfц™яЇн…С;ШТ˜y|]."—NЎщ6AYnЩйрж›*VD‰ѕЛн!#Ш0šўIPћё6џФЋFДлeЙ№Ч% МM6чЭЖиКЩЗЫВТЋ-<;]= 3‘SВ4Ъ№ Ь­ Ѓ К№‰%‹H˜ пP<\Ю]ЉŽaS—Ћѕ-"$Ш2Ђ“v’9eСѓ4К&~еEь.XЪˆє^ KЅ},ИЧŠ”ъъšЮ(7‹bБZoО…Шѕ•ч˜OXcВЩPD5Ы ЌІЧAєC ‰у 1<‹‚ЄоЌчV@ЅџVћН.— d‰чЉ4@ПъT_Гœ`Б[7 ` 0ЇO&`Vј€љ }[EQQmЪиvцˆsŠЧDв<‹›I I…еЂ4Ђu‘"7цQgKвЌ уr]SіnЗЋW9ТxQoЗ%BЁяС›щаŸфДЏ:нR-7^UЉ‡X­Jмx&Pm}ZбљИфАмЄFМЗœ‡vŽxЗ\ЌЪх.‘+`„ДЂ{a’%Рƒф-YNЏ!d™У=Р*C'XпсKL7ўЈзXв —аEEКщё5FsІэGБkыšТ`eЗxBѓ"Дtƒ зЛУТs˜“ксzMЧШБ“(УUВщ(Qktl“9iucКчјЅАJ,d#ЊNЪнЎЪCxеУ{[з$пFщд0‹ёkŒЦT}ЋЫу›жDд ;(ЖЊŽG2м€шЬ6Бl?NRGЯжЭ–фŠЌN Кя Аф‚oЋT‚ч |'ŸcŽчmU8šг7пахK˜^ VД\РЏќ(ƒУјkй_)!6eщ ?NDx3пH ДST 'Y”ыУЪ_ђ1ЭtГЋ7’sТ ‹xdЄ™л7-I]+6eQB@bХ/ц „ŽФѓ<ТітеІZр§—+D’Х<ё@вхгc”з‰ 3-dt‰‰Ž§vпsœЄZ—Ћ2…wєO__1МDK:а0SВfIdъпtc$YŽуЦѓ МbЛ№tи,Ау+ЙТE•а{Сђ]к‡Zащ№2nФ]ХщЋ}Љ-„OЏыхt^–Z –KЛйК.‰ ~м=џэmkЦ‹іr“[ гŸс{пZ);U-Чkю,э› U•„YЇЧ‰.\ЁЌќбX C‹.ˆ(8ЇД —E„5ц€:>џѕ™Э№S’ЙМCј˜'6ј7ЉЙ'‘m*МАXуFэГWЏ;S^ ъЪзХa›Q˜oЊƒЋЖуPs‹z{€›Њ"ВУю˜—dСeі{jю КуЭAJY„€Sьy‘)Д~ў—S^Ѕ*< K˜фiLкˆ.ŒŽW‘Ќ+„РHх&7чя~9`-]ЎЦЗ;t=^UОэ:шX2MгFМЋћUЃЅiТ‹jT’бsЉ',2IlЖC’œ„qDџ]?їф›Ÿџз1Џ–зЃIуРuшlбівjmВэ.CdW_П9ОВЂЕЈS]™uЦ‚Њ}ХСјП7[ 2Ў`NЗс,’=„Э’™‚К“Ў^VЁC1цsор9dC/ д›_ўvТ‰gx8Жэ‚ЧЙщz_Œ&!–AБˆM‘Ÿо\ž~8ОБМфгYАТLfмЃЯЕўƒ ˆ•ЌUDЕV”u'ЋъВ\-О}-Ю7uAАГA@ Йt`ЫWПќэ˜7CWwh6Ч3އ•—ћЅx=Њ%ŒN\™› †­Ѓ“. •єДžг>1ћWn wщє[1ќrЃU•№ВЄЛ@vpEюpНюЬЎїeо0ZBsЄ,iы­g;Fў7u'ˆшy@Йu7ˆчы…вmГ1``@ ббњѕ‡г‰РуУœbЛ&2ТЗоѓ кФuUїV@ЁК&ЕЯ' Е/С |C™ŸмДєrWЭкK„mз24‰х;Яўз џ'м%€ІqbžЩѕce<šЊ‹Њ@U%‘э|)ь…ДяhSеЖм}ё/'')в~aLлcДЧчй•§ФШJQсШєјхЧ )J­МZ†ј+Оѕ:р—fz9шg‰Ќ*ЕоНќиОqЂ“І№щ"/ч@?РІэ„XŒ0*єЮ†kЬёлŽ$Q-ГE ЃУёBbРDШžР"eсЉВШ\ОўэЗг™H'pрyЫE`hъ7#9EwdъджДЩЧ.АщtЧc€ўЩ;s5 юќk6'ЧA#ЬЌу;г“]й$бe”Є|/А%р  < Ъ‹ЌZІ†РЮ_П}їтэƒgд№џsял}њЇFсаŽцeюhšx§ю֘{ВŒ…ХСцЂ,еpЈbP'?@ І%ЫlюјХoя{*qI1Уа†ЕI5п:0^м@ЈВœTУ|sкю|zћћ 'QгЌ`ž"§…k#TsЭJy№ўh"*ŠЊ*КуњqБШ№б…‹iФфъŠЈвЮВi*ВШ‹š=;zўыЋ+^Ѕb!Qжhі;LФBAК‰&\Џ2|N`&Кйyћьѕ GѕšЩ2Oќv›RM—‘ЎJуѓ—яЧˆJTЦЃŽŸ- №бЙ‡1щXoжlдњdуuƒЛўэзГ‘ЄK<žЏ]Q<щLЫ4,к/Ы@Ъѕ2qшХHВяєоП|ѕa$iЖŸžѕ/-’бЉЃ*ГЋЃ_Ÿ]7u:mІиxСˆЭX‰4Н sйƒ˜Ngj‚!sƒзЏSо„б­г ^>f2ŒiЯ TfНщдdкCзфСЧп~ƒ\І‡ѓЬQўвLO№)`TЊи>њ№ђеG%1<'ˆŠфѓ"ŒшŽ:M4LnіW€^ЩhSbGя^&МˆMеYЭЅŒІFбrЂЩ4ЭЉЊд5‘ebqГѓз/^Еfƒ‚4Љџ‚Эфд†m”_|x§ђЭхгЦ3,Я€Dсœ4А кмдЋUЕ!dЖФŒпПЯнy‰€Іџнhгђ‹e‘QПšх*ЁгNъEіцѕЏ/ЮXYѕW§‹FџDkHSfчя_<{љцbаk_]Ox*P№AYуМЬ=xM#§Taž" †/1“/Л ЃкэМ(Д№pє[Э  МЊ—Ш, r7 y|ђтчŸпO$Х,хлaщУрT ,Уї/{љтеЇЏ_0M@0jEmЙh–iџЬlЖX%Х$vvђќlЪ№zГѕ"боБa4wV”г^ћj]“„Г,Hx{tWєїŸљлы(дЬюЏй †+Iл;}t~yіўѕЋчП]ѓ|ƒ+žЯЫzсc БТмабщ№XVьд—јйЩЏЏл3рzзРыЇ}5•vaСПKмnсн’0К:=y§ы/{еEV4Б˜џЊбР УющЛ]ЋЅuђђe‡МPАРЌ8_еeцв Ќ[Ьђ•6<‘cЮž=ћаgy- XFh‘ЃfбХ*.BЯ@[КŠаyћъѕoПќђ//.yQбЄЇkэЦRй›7<нКрЇ3^qвљjC›~–—з9%hнRmžcЯž!ЛLбMCЧ"кж”МšСbНбUS‘B2йЊІHуїЯ_М|љъХ‹OЌ слOfГЈƒ,ŠиЛ‘егЫKFTУ|Йо”ЉччѕІ @ƒЫejrТьшйГ——Ѓoгц€kT$Ўmу7юі›jлj7(ХЪ {ќцфІлНќ№\џЏ†Žџ3$ЊвrcЋ;žєЏ?|œHЂ™,Ћѕf•ЯЋ§јLlыМ8zѓьчgч#†ЗДЭ’RWЉdнˆX†&]шЉY'щјМЭЩš&OЯOњOвZ@|zw 2 Г‚‘ЅЫЃЫуггГгу+(]ќ[SНЦЖЂцлѕjо'УПџіОЯВЂЗZoжѕКЎhz^nw›z™Š0щ§~2І/3ОdЄеŸЊ™ŠdŽЮ{дMsвь|#ЮO[Уб ?fE#YжMђžЊŸї;Ьz SM]ї§ЛѓЧqZRRYе~ЛnК6эїыuYš4iЕЮŽ/К“йt6jїг BЯ1ŸLКYєХЉn96wнW‚ВŒMUтБ^DI`^‹—TJ|їљ–Њ•їлК№UКвХ^Оќ4Фr•=:}Ѓ”нўюўююАЎЈюJfЧ#†™'Ѓ^ћІеА~ГEт˜Ц“ЕвCBЃžв:cЌД.c‡ЪЬ_0г къЃИІ Љ„?3˜рўЧёмЩWыІTЊ(?поюhкUD†•ьn:ьvЦ"m€WыЬБl§ЩК+"{иo>ЖdpкІeжPЭ к4kЊЬЉє~ –Р1 7=}лЂ[œZДЂž ЭwЗx!ћЭfН№(mѓЖ#xŠšхRЯ:ulЧ’'O№dУі’аOŽ= aДУe D 2ѕŽюзаMЮuf rќфј]Џ)dї Њ6О{( >|ОПЃ’ФдFрљююіШŒ~ЧЙџуўpЈb›ъЋŸ&ъMfœЈЙљІŠЎ3’ 'NЊщŒ3ЖЃrmК@@“ЙК&@зv&УGЅHМSэoяяПСїе[ћ+ЅЪь-цQMы-нэЃ-“Їiї')’(›aЕЦЌ7р4ЫіЃ4G0Ѓ"‚эіpћ0‘wЗkWn.ьШВ0›Аt3ƒхѕ9ЁУXќ$гoЉ^ŠЁрйыu9ЯЂ ^ьяП ЯвЉТ“,Х‰жP{NїUM~8˜4W№м0Ђ№Б\bэя›ИЯЗK<:Ї[8юaІеtMџћ3<ŸцћŽтЪђЁк"KЉoЅь-‘wъФЅm?з~’t эØ1еy`k"„ВlлqЈoNЙНЃwџyŸ*<Є(p)їFШVТТь§ђПхP pЊ‡з”w*ЦхэчУ2§€кT?Ikж JŠ‹j‹№јŽiR•9БQEЂГw'л‘AїŸ7ž8›"тI‚РŽІm&ˆВ.74еMп§6uшЦFMЬ†›NДиСЗVlЮ@Сž&Rгж №0|xЖ„К6˜шЊD‰D5“Іё >зF}†Œ•љ!Kї†­эЄ–њм”Ћо^‡рј?'™Ž hЦщjG5У•OMъя‰ЂhZqIyvKЗЛёя55UѕЈЯmu™Ют€%іхўЖаЙA‡ 'В§™@WГ5PFDШ= ўƒмcK!Ђй г?СLŽпоS Є†:иБѕ4№tj˜сrЕ\R-ЭўсŽеЎ^a%eT†љFљђљыќx0šLЇ“й 3Ѓ}GЙ4ЏЖJ›MЅўm…aD•ЈАy…0rKО~{hЎ1H‚с{Ўќ/†b•:QŽ ‹p…идсюš  Ф”гZXf:™€ОŸ_2p–эй‰N}wO‹ѕюvW•xŠUx“?пџљчъ2–Ў!А†ѓјKџХ /Є&С0#XаEП‡ F‡УЎЉхЇІЪпmŠˆ'№,н•ќp ž`PїЖ|^Ѓ+эїаeАЯ„­шr~Х4џёeЗ -z)ъljкіSбZЮpЯрFЃ)Џ:s:*ЇJ№л}Е\Vјl2šжс:ЅB@dnв>:Ц‚4Н€Ž‰БovwtѕфЎYБєM;,ўѓЯћCђtЦѓьpЈ>б2Ф™–ыъТx8f%#Ўw;АTjX•†Щў|KэћЛ 5„QxАУЋѓЉ YОˆ–ЩЂ^гrЃ)&K1Œўу_џїŸwuj+ГіMЛлЙњIxВ-ђЫвФщ˜3ЊvЛВЈw;ЊнЩ7tчшѓч/~Йн•@<:5ЁфІƒжDR,:ъ2MЧ‹Афn ,aЊџ (вЬѕ—?џќз?я |]оc‡l ;sŠjЦеžКѓmяv…kXaI Д‰gwј~фиІFdЏš“5кNUщр hŒІћфФї˜oиўlўВ/ГР’™qяП6тЋЧŒtZн/ыT˜6OвњnПєužа=Lљ жJ›Š&јЊ(Юњ3IVU* BbзЭеН;2њ UН“С4ОlI@…У?§^§ОЧœlfЛн<ŠЋЛЛ:ЖTК]CўЩ~лmзДW•Й^ŸEBч8КЭЪлеw„МяB§ч—?џѕ?>з‚iQЧя$)бЯеЏ6Ы8­ююїsКафЏM]8н‚іњдЃw9B№іhOGАЪ}сЗ •јчŸјхЫŸ|о,шњ(Р“c>q йП)PтGБ)ГЂп#аgЛЩšfАЙщ@—‰‘угРT”Ю‡ЋAПsy|нŸ ВГ"ШџљпІљюё'ЭіїXдiгm Чў}ГЉЈZ8AMЗѕ|О™А:ємpЙЇFБсўў@"El)Jыck0м_cЂЕ Є^ $Ÿ-‡С4л_Њ_-ђф‰€єП э$ѓ,Џe№мЊЙKrЛЮ‚ѓэE†rбе‚ЖЮn.І@гГСШЩLыцv1Э48 ‚ ?ЪIћ-ьЮ€ЃП‡Ѓh2?›ёFймм‘O" ц1ќћі!№]н€ђРŸТU‡ювНVjџIлїMМп-Г“.В§+]HйmЪ<і­Џ(ЄџŠ1т%tUВ—ЛŒйQUЭrџ@Lˆ”ЏЉНF`ЈмyŸ*dm“ —kbэw_ˆЖя‘ыFUVвДЯ1ѕяb3тѕ@сToЕзЋжА•Eš-ЗєMжи-вцњžЦ|!vЈ>=Ю–€ДDnяПмнэ–Ы&8к>ћЉ/ЫІы8^AшЛI=‡Ѕ­АдюЈУjД/уаЮЗK4љЛЊљIІ/Њ…o(ƒГžbfФ v€pЛUчыЛ/їыШ І|ћ5­л–хd@K”Yюnы@“fН‹ЃЃу›Љl˜–Iў­›_]о§•ƒ5-:Д Ѕ{:TЭьіўЯ{К§ВŠ1kођ№хЖЄRIUfŽС-U“шЄj Fwtчt„ЬnЎOO~šбv– ьcЛ4|ѓ‰ХРхŸ.&К] Б6UЕЪ=]ІкЗн§~е„0щ F+t иŠзЭ',Ч˜К ЈтdдО@ ’U‚лџ-"gЕf3ДёO7ёЕ!сD*сњфџ|ШfІСP[Fъ0ч„iNѕ#ЊюјNђIyLu‹Ncщ?y*ђ4зеUŠџЄГм *0јЗУРiЃ*Ё+в?ыџЧƒЇгЎšхїcќ?Цёcќ?Цёcќ?Цёcќ?Цёcќ?Цёcќ?Цёcќ?ЦёџзёhёІ’1‘4Э№уШЕўyJ:ўЋ1щю[I’8жXэУkšђOѕ&њуЫАœdqDџпHVТ8ЭГдћŸЋ^њїc2ѕЛўА?еТаЕ]пљїе`rœfд1љџaя=у8’lQў’IIQЂ'|ЃэЋЫ{яНЏj”ўќ‹(hянЗ–мЙ˜š‘htTVdФ‰ЬШsbу{4бе DEXEdм}Sзў‘’jЉфVЈЇх ш˜цЗЈЭ?ШXjѕh!‚Кщ8nXU‘mH"Ює† žXЭч7IВІŽ=лqМ$qDюЛ\жњМБ&V%fХ(КŒŒ(ІXŽLaЧ‘ый|6ЙyЄfHqе"§—–Шѕ§Uвм2VМЌIx­LdEEр5$#n›К Ѕх&W‹Хt2™,МЌЈлnпiœ4Ј!КЧ>ђ…ƒ2<ЯRa†MYжI фJг€ММx4NMЇг›ё5сЅEЅЈ ‡ќњЛОJзTПD[їaЦ†c Ц€lbNЋ:І—w-`Iьz‰н7ЋйЭd6O)Эї YЧыЖmПC)”еD“а§_5›T CЅ7Z˜‘cЧ%jЭDYнжMjєšг‹~t1О™ŒЧу ASЂ*.`ЕzIбЁ В5MS'оїИњє_ NГK!WRXuM–HRR,xMыœ`yОomN.gГыбѕœо0К­-fЊ…ќоћ}пmw]ƒ‚Ouќ‡ˆўН-уUiqН”ƒb 6 шЦЖkbЧOŠ*їL/ Я•Ў/ч0ЄЄ8qь‚GaйУ7”Ј4ˆe$Бoџ/e›9Э#Цr%љіxиі(Lг•ž"[a$M"дV˜_ЮjГ,ˆ„™Ѓylv]hŠa›ЊЌъЖчXt%џ‹ УPЩ(АіvћОЮЫЕј†б‘§3BЊi[[ŽnV<ЫYAœef24эnлf/@œT8 Й7-Ч§NзЖўнX2Ђ‚ќЅzX€"=виf6GаZfž!1,ЯЬЧГХ†6Pё 27/PxЉЌ O– Чumdp oхЛ<›YХЖ`Њ ›дЛнћŒЈюлитч+5L=ƒ...'ЫйJ СЯСs”А,ЪX— Я–DЭ ђЁиUš$y|їШЩnЉўI9geС  ušдЂЊ/BsyЭКIhщu§~4ПѓБЋ"в9Ў0šЅшХ„sBшРелuu;пТbњ9ƒ$—“™ф…м`єЛd п$ЮZP7ЉЫЬX;„`[Тl:ŸвN”•™kЪМ6}›AŽсoNY/jPsжpWЇ‘+ЎZэWNИѕђwVoQдУoŸ­п_ѓzд”ОHNА•Э|С9qRdžІ"K[Ппw€M]…\з;4Й)’Р’™еwНэB!=ЉТŒю#AЪ ФИ­\…"L)8 'šƒЌŠЮ-fŽ4lе вВ†/ЧЋЫžЦ 6Ь4<ђЖЮBˆї +iп/ь-6ŠaљОcёkRu"”jиэїАўР`ЫE;O\Yа‘ЏЯQжЃЉфЧi#љ V”Vн5Yрj‚d‡5xєn[ІТ’œj{юƒбs§Л1'%УДƒ*W~N*О№~З/=™•mпзХO"ˆСд[w}rЃњq˜’ьЄЈ3—–e‘zШ`њ тюv…ЃаVs`|Kуh3/cd JˆЫ:НLЏ„xЗп%Ящn–{"o„‘ЇвЂn™ттєэXѓТ@'i)Ј№ŽОG—uЫ‹v‹ъLЛ:4№ЂВ Ќ‡Ђ}љџЕЌ0ƒЖ›іmhЉcИ%|ђЎі4†7УКN-Yѓ“и‘9ŠЩ‹ЗяЦ’эY<);IнФ–РЩ$й TЃCЁОУЎЮЂ8-РwRя{фE м9HЧ0Ђf_љ&ЗQМfЗ;tБ%г‚ЗM•…2RЧTжѓеЭлwg7МaДФEз•з%%ZuЃЂFit”пЃЎіА›ШЕ<„№PŸ„YXŠъ•рŽТ(A—::GЩ~V#0Ee0Ј шыёеЛѓыV•(ap†m)< |G$uу ЃхЎ|ˆІNl2џСЇšU 'Шы<4DбHwxнŠ™ЪЬMт83.ЫітЌШBЯаИЩххљt>!z%yQе‚QmЩ/іЬЭœ–UЭ­ЗЧ§ЖСх‡][цqрк\№P—2ЧЈaЛл7IœЕЈ ­pДЄћYxY ‚Щєфr<#WЃ1AЬЧAр7|љО№эЭеœSUЇB:ЇЎ,ъ2*Ио&}иXMЭQй6m<)Xй~_#Ы&фGІHнЋЪцШ54&^—]@Е:?™-ЧK okFмяsG& VqƒМ?СiеяЗ12Џ ЕxPЃUнŠЋћђШ–ZКCхH–Wy*ЫBEлжЪ-І$/Щ(xђі|Еž_ОЛИ™\^Я xQ"+ИMъ€ИQ]ЕG­ч}“&eП+]y=ž-—Л9Э№ђЊFiёТ7%FАђ§!ЯaхCб€Hз$Ж.PЫљl:НїЧЋ%ONNOЎnЎOO'y˜в ”Лу@ОйeYГэ›ŸN†Ч}Ш=UAбм ˆЪ-"XџœwАђaІЗЅЃKДlFuSŠаr~u9š,Ія^ЭЩщххѕx6нЖы†qRwЙ'Š•ні8№fuUЋУ7и%Ћ™–eQMAЮПЦЉшР*сі€эm™8†Ат4П(В8Аu‰]ЯУ’гЩЭхљlЕ^NЧSЮtƒЄФ]š2Ф$яE й№fК…рQк*е |здЎ4'xUиЕАп5y  МѕЛО+ Rи†ЖmdЗH}зCЃ‰%ЩŠweРрAQ$Š>”[ЯяЩ(U+B§ M­r‹FKЬxФъКd€–|KцbБ&Ib=yљгO}ђћяЯџќѓуззK‚ЄY…“XFБНДєДЂШ‹zЈ<™q—ЉkšЦWЈо§ЧЮŠФ,Ы‹ђЖЫ]…эPNŸ@ЬгЦДаR6Ћщ՘Xнм\ќі/џјљз'МјѕёЏПќєќd4чPGB–„ѕBіМЄщЛ-ВБvИш’„yТ)R'(п>з›ѕ†•U7  FЋ""Ѕнaй–B І“6А< E$ЇугїcОуъЩПќќЫ“пžџё;NігззЄlкјМ&Т7иnR Ќ]wЗ[€$PЬ;Ж›ѕ}Ѓœќ7Ј§ы€Ш+Ш4‰U^7ФiM‚05KZЫЈTсБ!ГЫГЋбеЭbrіійучП?}qzv1™п\œОyqN@x€‚РЛбh”{фЁыж(ч^0i ФžЉ~Ѓ‡œ$ЃЊ…aъiv€Ы O—ђАыg–.€џВ:жyb1ЛО8;=??;yѓіrОК|ѕњєj&h’И89ђ:xW’BСЋpВИѕэ‡ЛЛ.іќйэЗC9‚ШБgщпB^єL œЇЂлŠІъ4X*ЖЉЅIФ‚SœЂЇЙХшќr:ЧВŒРMЯON'В)0Фьj„1 џм3 ‰XSЌhd=>l|ƒ;cМоoл*ЯВ<јЊ~ƒеKZH>-лBЅЈaw Бf;ЄыоuЉ­Щ›ѓkШ55Рk‰™^WŒ„ђ8ЊРСя!Д›Ы)"1]АŠ % РЕ…ххˆ1тУ‡ЛћD—+ЌЖшmiфСлHтажДЏЯ1 „? уДl{ШтUzHы6їMdЩ2ўj!ћUbЉЂhЅ€р1MнД Ыv`ѕAVs‚Ђ#ЮМaŒЎоBp{( WЌщjdъв->+ќЖtЮrЂЌPf•y‰Ч-Ь†яCС2ˆN$ntF(AйŠH/ЦsADEсHЂ…&В еЙДКY.–ЌŽ[“†nЪГЙb%луŒ6EF‚к!єlSУлќІуЎe|Нб”бU+ШЉюmS$Ояњѕ@ФКp,ЃУ’’5ЉбlyГBСŽ™Џ$@šЈЎЬ3КОоpЫЩЭЭJВуиBaБV­АD}Ќ]•“р­шH)…кЦІэЁk|5J›бjВUППЛ=lЋФƒpЖмgщs[хIbE!+ru˜BЯЏW№j @œБдrУ0,5==%!:ыєЭhFыn`ПY’’юеwЧлЛЮзи '‰<žRkжН%нѕLо1gDдЙыСшcbrsBР™’lїЧnŸИАО"~ˆ’ЃаA‹xœ“vX<7‘!A:мяwФюдtК Au є^ŒFbУŠœiЎЉ9ž2~3be‰М:Їdнїt‘$Й5 ˆ‹^ ЕЫ>…yPїESq‘§FWфЏ8ђ"uЭ†ХAнŒŒVЛйд6їMЭˆЯљpЬui3ЙYRŒЄк)ЊЋQЃwЏG4r{У рL-–AхжЃkJaNOHx§˜шБ—ŒFкеt+„x:ЈІфH\‰ZЯg_\›+€7=Sчч3ЇАч—$чЭлЧмЉтњz  SдЌР_šŸНŸt@EϘNgГ%g*Ћѓ‹ѕќѕ Ѕaцj2Кaђщ^;hGд)дЙЈ;Алі™m(XrC2Šњ…k‘1-ПШ}M6‹љœ„аkEнсpижIд`3LJ“8žЎpjн2diq9Й>™ ŠЂ№ѓЃlVМ,K )ЩђцтќэѓSJ1cƒ*ЗИК PQ0шю51і8HeV’dxu ПCOPWmЁLVd‰ЇhŽ—t'п;їqотFжЎѕda3žФ‚џQФѕеd59[ŠP.ЮGŠШы†“. ЊМй,п=;єА^Un9^ eмЃdЪ-J9мBипїe~ГF™PдЩОА'D€Lь•ЛВю@rЬqnмі}Y§§*OЩбѕb.Ыѓьє|ВймœNXМ>QІЂЋ›хbЭы€ky‰zїл)!BJ #ЊГf 7ŠтькєфЖ*ѓ$) Бђј'ОЁIГк€Nq В$нLЩййХxО\“$~­ СC+a‹g;фуПнQ˜4лЪН@бd‘ Uюgы`hКŸчŠП5ЈeАЧF@‘ЧћЈКэjА:A!–„ь!ё Й!(–GЃЩ’Ў,OЏ,втЉ†Оњ§LдEe>eжKr>]^Œ–Ќ JШс+ЙmЛл#й0ФpkTсЙ§pлC­L3g}n Ћk~е7E–зЈГvиЩd;h1Р<їmSзm"s(|‚1œZРЇ8XˆфеязЂ"­'“•ЈcЁf*§ц/хњš%єАп˜ŽE+ГlЗGЈjЁˆСr7ˆ3Еи$išЖчкŽm}ІР‚(*P^ц€ЇPћAчщ8Ќ—}7žt™ЪбMS`їьътbLБœРQуWS^цЧз^иЮУЪ’хх›sF.ЮШ …2ЊГœЏ)†c)ŠЌсШ*S 6поэSРм" *šž~цL}7('м;ђ +4lМAѕ‚KЇojG`(ŠІ†^/NOf0х,П:Ypќцj)ё№D,/qрмХ{ŠZœ]R$|]’Ho№ђ,ЫЫЈЗП=ў=9Hч N’@.‡W!№иRљЙGЂЌib‹С Єqww/…~1Dг,wSр"Б!q0xŽci†[о,MнШђъr#Я07В#ИЭщ‹ѓїяпL8bЁЉ „0,auSэЌƒхrИнmбhПARK—X(‰–”јјsWЂa:A\Д‡ўЭr§ЩАё wCпЕyQg>$Hё"8‚H.i˜;юьFуsЯ_Nf—WWу‹—O_О9ЙZ14ЇкЉ№ƒbŠaЛЎ_єАœ#n< R‡]ыауzГІ8 жХgV0<\Ч‹ъ§пЬўEilаиЖйІ’e–x$8АwГ_соОпIўxіфйГЧПўњјщѓчП=-gрP™ЏЫШуФYйД]ƒ#?нmq#Ѕ§ пfš(… ХšјLЃ!PYІmyQБХХqќњўЇТDУjo­9фZNEz†РЭcТљoЏо^^Мzётщу_~yќѓ/}ќфЭ†ЇС AБR€2†х„Dњэ~[šk"8?оояŠсћЖі‘б+jq4ќмю&б@ zT$pУ ЅЉPe8ЩЃїЛšŸ0TРЏГя"0Уl˜›—Ož<s1ž^П§уйгпžП|љтйoWїТ?Š ЈH‚Јl`Qдu‘ќй‰М;|8і§с>2!яН‚J%PUГЬfУђŸ]пŠ*Ъщ P—кЭ ™5ШФсDt§ёЖяг Ёрдё’[ A=ЊPч(rŘМієѕ Фr~uђўєќъњђѕ‹kРВЌйaеЖ]лt0Ѕ}юл†ІШ‹SКƒЂ|‹ВЧ`А A‰\ЏжВ˜Я._†bi(Ae-ПŸъ;tьу"4,Цош NKJ ZЬ60CЁ.q›йшэгcVgbCв,НИxsХ<”єqYЗ}АnЛлЈЩŒy‘”:XˆШdПпчВ)ѓ›љl>ŸMЧЃЩšEІЯ5њICDPTЭnюYХ?Њ{L^PО(”Š‚N№9=эЖ0{M™E–HMOr.– UБ&+Іm2qvВтEЭ Р‘БЩ{% GA4>ТfЛЁі™&Аєf5Н™/ЁŠ›\Œ6ЂЊ>Љ=-;TNXQдтnаМщ;№ыŒЅU%ЕDE–эМыкЊ.Гд“™бЫ'žы„ВŠŠˆЋgWЄѕZ˜U˜dћЎЭl№?Ј !яqЗж7˜]ш<с™ YЮˆ9 еЇ§ЙНMю№Zб5PhЁзыхf$eXAš (LU’$Q…Ё-SЇOŸ]›‘‹QЦŒ пїLтd4Ь‚з€i йЊaЉ’ŒIоŒ‘|ИNчЉ"ЌПžŠgDаЧчіSˆ0EŠ(мzЗCФ”ќоr–Б4Ы(SjъMнqL™К|ўј­žы˜ TН+IЕ r нхћ‹5Ф0ХMѓйГрЧˆЊUU1ЁЪЧ5>dЎ:Д4Я,г‚R щ‰§ЯžiеБмЄщxmВїйЊЯ"w#3№ў л!e *бPp8єЏOч~Ўk*ђъеЅЌ.Иѓ/Я'+Сp<ъ p<|ŽŸLПvQ†jcз•iЧQЧqfk^ц[ŸkДцЁd|7Дн}њˆЂ8>bјЃЁопКœщљa–hТ” ‹J n&чЏ_ќzЊ'aј.Ьs>ЏЦ]а(1Ўџјуэ٘тєЯ˜е„ЏqУэŽ€=њУ`4vокœиš$iUЙЦчЪpЩЎ“ЂXIœѕёФŽ?QчЌ†р€;ЫЊэsSжсEC|ОЙЯGЇяоАQј(§kЭКщ…`tœ(“ѓЋ‹ГѓёtЖm;єу"ЭsЯѕ<У‡2юc"и~ЌЊ{ЁВrPnЖЈтКe{ŽыљE…ўDY‹ИЩ9ьЏ,Љ˜Aж4)Xф‰уГГгбr͘M(/ Яї]ь?з4Ыё§(єУ0‰už&7ЃЗяпНЃМАЌК]–Wiр{zˆP&м]_C5jb6†WaжlRыГЫEЧ…gУ‚ё‹=ъ‡мЋd!ОFцл­k\гНВ‚зШWяоМ›Ђ*ЉшAшx2”Фё˜ъШƒ‡ЎOOOШ Љ ŽˆЯб4C‹Зћ!Lƒ{Ўv/aе/ЩЊЄІўЙ'Ё‚eWUь я|їЅІ0R wЧЁќ: ЦЁ!‹NZцibЬ.NЯчМЊ™.іЂџ† ЯЖ‚8С_EqˆџHШŒ'S.ЭK(ч€‡ИKCўQ9P<08(†Z-iQuчГѕ%XЫЪ/[Ж›я?§…ђ2БІ…№БbuWЄQЏТ/Š4ѕшеŠрt?J#з…ЙM†Ћqр:aœb':„ёаѓТ8tЅХŠV†{%m•Ч)і~cЮйvдh’XЮадzОтгwŒЯнЏ!m+ЉГРq‚ц]З ŠМояcuHРp“CIгk”—%Š&xэАТ€J3`4,)ˆbэ†Qл5рЃ4ђЎЫmнp Р`§ ЛИ/u в8j#ЃCm˜AeрГ›ѕ 3ЬР QжђУнЁ-b№HУЏнpь8юpC|Wfy–fIœU]ƒW+ о…qі№‡`4иWТ$У$Џыъ†8MГЊ…@Qg№wнЎХ^йэvпљЃЁp‹ЈDрH‚StуГCо#йt|јФЂ`WХx#EфE€ УтОпэЖїˆЕЭР>АЊA|\V‚(ЏрЯ№ŠЇeG)Ьz…Пќ8Џ š™ЬŠКЊ6@ц X\єћ * <0‡гxјФЭlЮРЏ>ЛЏZ@ЁкДмоюrЅЧš E=моWDИkкsотХŠЊ…OЦ№šрZr_Юфid;xG ПЭPѓ') \€ЂЗЋъКУт w‹Рq‡jЩ™Ъ“+@ГдcCoГžЏс7Ÿ M7ju7Ч]b`ѕ K™`$Эпооп>8юыЊЧУё&IЁ@qiЈRрe^{nœwРФWY†~Г^75ЎŽІъŽ4Z№Иэmюw‰ТЎЦг5#ЁЩКЎ ВлzC~С‰Ч§13daГZУšgё˜ЏGhƒЗ}UowЎАOl›Вl'˜zгХ0 ЌxўВBџЙ&Q–ј;yиМЯ+Ьн=4нЖаz9[бТILА[•Оьиv%iV~hгщjCЃ Ацwˆ†MЭ}•-€“ЬЭa–ѕп8IСhwh48uъ8 ‰!0т5ЄСВgJ|мІjѓАРљюЃWБатDж$FУјвIЗЋCl‡cЭH’Ђh!z_‡зЏі‡&№ГКп–Ўпю›{KLdJRˆ `s‘&–€f=KS0;ŒрБrpу6і›ЖЏѓР)!ъЃт:j‡•О.CЌАdB ХЯ—нУu+йvОЁЪyH‚–БŽ)PyБWЛ=lзЪц,нЕE†ŒѓУЌ‚Х!2_ƒИ™ЃCрПaѕхр№qŒZЋU”Сћ)#ЧmїЈ–юкXpьšФ5U,ЈEYГ<&ў"ЃEЈДкmŠќfГZђ`sP€ЉLА1ЈЦQЫШTЇaПo!ŠUu[c\Јђ4Уu˜˜Ђ 1/У@[AdRѕ=8Uпз%мќHlу<ЋЛЖўлЕc<тс_ПЁm(ЬСССƒсxyRAЬА](lУЏwmSљ GЮNŸ^p‚ в†Я К“•и№№хыGsB2БЅ(ыћCыi"ž-ц†Г’МjKlѓбiq*3Tс†ЉъЁЂ]мBxілJV,;„ <iІ˜юAQ 8Yы”'3Ыы“'/ж‚ˆмj-i€ыЋ.№o УИ>И/VЪ…Ѕ0,оМ_ g&yо/ЉAvЌЏюСлp—Хжъpл /т™“ІЎчx`({DšоE#рЊуCІƒ<‚9ђ_љŽЃ‹—џјщPМю„ј"РУajuлrЃ@Tќ Œ.б‰Щѕ|ќђї ‚—ќОАЄЭhш_7ОЊy“]е +ivЛмT$E^Юqoаˆ |е]aЫZ`RВ=4[тTŒљaъˆ—?§tЪЊЮріIŠ8Ѕ4§ pM7ЎŽб!•Ed ФЄхйѓчч$Џфm ŠЋ)Ѓ€б_=юЧŠA `ЇЛCщjВШЭзP Љv сЋщ2ƒпp~†РЂЂћЫљaШ—?џ|Ъл‘Љ(D{сяBШм~руMfwБT …hирYzіњй›)У[Uщ(ТzУŠŠќеmд4І@нk Еш*фš5;nё 47UžЄ`псŽ`Ё ы\ЈН=/ідб/џxЯ;`Д _Р@tA^юсцrЬeBvkА Enёюхщ˜рЄА-+А4E5›!šЂЈvБЋолщЯсЭЈA"2ДlCaхюv[ЅXБfИдˆg&јвјёOЇМюXІ‹: з4CЃёдьГщX€STY`ЪLіќЭ›ыщŠцСi2rёœќћБЦў<јмrWККЬŽ_œ<„І ХЫzU(ІФŠ~ЗoS? qO&@e›<ўЧ'HУо|<ь…Ђ люs‘`)6 Б&t`6ўцећБй0€œšдж5MљjТ&BТ6[7jvФњѕлЧП]ЬiAr šэъ* ЂЄкn6мŠ<o1ЛЎmъВpo4Ыaсм:ŒBЈеБа56kF‹лFх­ЩМHМћэdЩ0xЮуфMъšПвц !†e v–jьшŸŸœ/yyy‹•. ѓ‡MлИ_ъXŽeшВМxіј’fк‚2/ИJ9Ў-‘ѓЕ’і€ŸšлѕE~sёћ“WАщ Х*axRWПR$vУm(UwŠлќT…8ɘв4(СЯѓЎЮС‰=Ыѕ\ ЁCо+бЁ}з†ЋшТХ;B‘T<оЋn@Ј‹"РЛ6„ЪvЙ­SЈН .‹,qёњэяПAzpCŠv1хыgš%AБb€n;„щї– JzF7i•E`Њ&”s`Šг˜%1,C˜$M5„ѓ7”Ёщ*6.й.ЬВ јлгxt8KTуЎ+3Єfв8z1;ПмЬпОИfEŽ!Y5*у"о_МЂIME%ЏfМщУ$ЉVœЦU“‡aYzšbт:^аАНРyзDAR,}ілу‘ЈЉPЋ**М”P„Ч“Yо- ž:‹ЋЎ TŽЂX‚іДёЫW3NdIV rW•Пс.)) WUЄ›“5JqC=g‚m)€L/д гhšŠp–ЅъК*ѓ/[вХЏПМнРуС Tй5РS†Ћ*NзPа&-о_УSe^‹ѕљ›'Ћ%x‘qnЫв7маa4MГ“X—ънГkd<Уm+xˆ‰Ё9\~дaх!\PQƒ”чXХGOŸŽhŠ.ьЂF‘]]…/УSwSЕcD#QоЗ™‡ЇXЂ(ы›ž§qї=Ќ81•oЙъТРЧИ‘Ћ(ТЭя?НЃE˜ xс’lzi™ŒС˜@(sЩш<ЧС Яžџ{\иЧ"Р аu<Уe гюЇ("wФŽ&rhЕР­оќёЧ›5 'ŽрЧ}ƒб„ЎЎЃЫёюљяgіЄ QиoR1дRP9#ЖбpЈИр„g5™[НxERЂ&АиЕЮЃп_Eic ‘ Уf )сPDQтљЭЛgO_,Ёкw#O•Пщ:ЖжPefєтщѓ—VРN@˜ўoEPžEIПЋ# —!8Мžйѓ_~ўu)ж0рПЭh ІIкœНzё ЦЋЋЩХЛ3‚ч“`љY–9Ь5 /5№˜j3Rhђфщ˜ІECНŸiєgіИэЌЦЗлЎ@ ћDn}іыЯ??ОтЁ†Sфo—LЇйѕљЋЗя/Ц7я^Нyў|<МqIRЄЌšЪfєgЭЮs т2Њ|БЬа_ЏVЕ5A№:•Ё!ј‚љЖУІƒ ОыЪШХwX‡єrrѕюзЧ?џќŽт!ЎKFqФ)Ј'яž§БpНУlЫP•зmюЂ?ы8У!тЩЊ›GC_ўњь‚d%Ъx‘ЧрŽЛЗѓ‚zзB.l2ЅЅaЯвђн/~ќѓO?С—”ЏЮрџa:6oч<‡§)є†эДь№HўЮ+ [У6ЭЭЫ@d˜‹_!Yаœ^ЪВ|Ямк+vЛІэŠHЋCЕLцэћЬе%œQИ[б}њ~Jrї1xyќъœ1,МЌ(№GмLfГЩЩ‹sJPќЊСѓ‹ V•яњШвМ‚P=ѕќ—W0гJŒ›<Я"YЃіЛ-”ЩšФ]НѓиЎ)ь /d€г?”cHъx$™–‹№!(ыШ„jљђфтњzt9eE+kњэіp8дИпYѕлЎJ,‘х˜ыЗoOf ЭšYC щГпVxxЛmьd[М}9Іy<Нgжkоp<ЯБПnЏу?ŽAЩиМyТHКкЧлжѓ5ХВ›9ЭЋ}МЛ=іU']}“л"Я0‹7ЯO ЧŠAеюіЛЎ*‹ЯyБС­ E W“Ы‹ЩbЕоlˆеї”bМЗѕ`МК ™^˜ь’w‹>wuUтБZтxбHjМ@qw‡мW`S_%ІРБ›‹__б'˜^sХž­Ÿэv‡œ1ЁИ™$‰хlzcОcЧucŸй‘HБЂnebs73jћ$ђ › Џћнё/‘:Ї-CbЫцфЩЋ^2єЋсpњx‹­н№pЛ 8HB"O.ІгХrУˆ‚‚э6|Ч‘—пžqH†—™Ћ,ц’“ї]щлІŠЋ^3ƒсpўˆДи"ОяыЪkQфЎŸОœ‰^ F‡^wќВ‡~€ u<5O4Шќ9ЪЛУЎJ=ыГ;­ўЇ!›VRрЇŒссТа–`@шХГЬ=6*уЭ ˜ю]Ce ёЧѓ I3œ‘vїюsfњУо/hЫCGnrЛх„iQѕЧЛCW†Pn>бЂn€ЧeОЮ0 xѕЖkЪ$|јЌІыЖ‡уаЭ?tбn‹РuKсЙЩЛ)vTЫјќ§žэ›ЮА oЫиž2Мvќ№сv[тНђ‡ {kNе§I5AБуfЗХVЭЯчЛ~ЛПЛХFВУ#орw †еxž-išх$Їм—сю№e`'д}ow_gИ…ŠЭп№P№#АЙМЯ=Њф1šUнЖNM5§йЙА}YС№ЬнЧwƒбЗ‡6umЧuu‘нмЦƒ№Ё%ніјw?ѓэнЧOaЪя†издПЇЛТ??‹аuн‡1яйш8СЛ*rЮљIйѕ;daліxm[№яАЧял№Ц=SтЩё‚aXXŠnƒЏцqш§ј ЦЛ8ЗCМЙo'Пћє ŒОkbiІО№ђф>Єag+ЌvрБЁ №Сƒ—Š ’h7ЖкБыцћюn—ћф!п’Ef…Аak№д№да]љсXС{Ћ Ђјьы|џэ #iїШЛЖƒ$p{ФŽѕІ*polОСЧТ$2ниo,ЫE@ЉР1и‚ъVˆN>мНЏрqя7и›дПлсЛШДPx•5УЋАUqИфyфўЄ˜~ИNqтя‡Л}$гЋ5о Ий0<ЯBау1П )ќv€‚‡сЭ‡Њ(МВпљщУЕcGe/іЌ*ХYнЮš"Азl{ŽЧћћ ИИpџќxЛѕ$zЕФ$+‚хСjNPŒ оbXќјсгŸŸю§ЏИ0M>A)Ф U"+C%№PTЁ„b'ьp3ЩU…7 РньnС`є‡лЮТж ˆЭ›ЭjqГСK ‚Ќк>rTp­§‰Fџљќч#^EЦеyЌBSСЃ8F…Ѕ§7˜џлБV$ lUРыA‹sИ“q7‡6ƒбЧЪрŠІЩЭfy}~‰<,ВlИ!Ж•еxњš§щЏЁSјУv џљщPЄЁ–+x\NЕэ‡c’еЌ FФЩq,ЏgЛƒбАр1Џ€“м7†JS@'І)rvііd ž‹!ЮЊІn‘оћš§з_їmфŸўќыЏc H…^N&ѓх†U усјГUУіјKютE=xуЧ!44њ#LYу+Я1ЙО9?yПфEHŽH[e"xѕ'0 c?}ОщЯcщk2KЮЦЃыщb#<БиџќРR$Г4У+fвѓ FЗEб!фцрpцрCм\M&чs( !C Ѓ л/†ЅгŒ.=И ќњЎ,EdжГљєсЌ§з!ЈК5јЭœUэlw‹H Є/вrw7рŠ??СŸ0ХSAђfМкLf Џb#Ѓi|Яўяwђ'L4оЦЇCюВ@­ r5xЋWыХфтќrЕ~z@Є†јиdyНПЯxЅdпdШ{Ьm†]N)^RећН_бnёКђ‡П}њў_hџ.u№œх’X=Ме8Ў­p pСŸwЛКЌњл!*рEКCWЅTьЅІ+~ИxЪ2€Ће#5R) БњУ`7xіЁpЁ4$MП0 !ЊPК]aР›arwЌE uЛ&ObМ-Ђ)"7yДЂš\-—kŠ““ЁКХˆј бюП>t‰­Ъ2ўXѕkШuўЇAтљІmыЊžвDФФАпіZ.Іэ[ф˜lYИ~t5_Ьo.ЮoV$'G{d_НУЫIw‡*/0юрTыФХcjШˆ•Пџэр‡“y]‘еј0§з_aq­Ftп—иI‡ž&‰ЃG“5Бž]œŽW4TŠЛу@сє‰їvђfїсЯOЧЎZ… ‘1^З,ЫPAїя]—гG,ёўОGwмЕxQ!БњъЩsНšЬHNqЋabRм'†,"}žŸЖЗŸpaДM™њЗ‹їo-s)3§7Т№ цИўАЇ_]i`ЈТХ#^V4‰лP‚ю#UШпЗ§k[aIгЁDіВэxъЎŠ}ыГo–}й4]“Šгг=&–<Žв*R(iёЮF„;ЄЅhбhS/ ’юXАL€L€щWAlžЄёюНІЈFPpЛ#p>—ЉсЫ­–E–сDЋКНл—ФУя>р\№,Ѕ jНл7PљЎЁ ЇxIМ Љс€CX3] W”ЈaEAСг 0кўь;Z_< xbxйщ>юхh-љ=угJРS>|8@щa@‘ЈQЏБВч€<КYсёрџН+SГ›Ж iŠФБЂTHЄe~OЭ№ьx,=]сЎ'œ‘пнgЗ9$К(Шš*MƒЏUТ0ою0l. +7$btŽ”ePЗK,ryiцлцїдѓЃ5+л5Љr7ЇKе*>"$Ц+imЛ=тњLUРдrJ7]љЎb9џх` ;ŒмЁW^ИИytђvФBlй—р-št_!™)n WТЛvЗKLм)Ц{жš№АRŸ;А“ЏyЖ'РфŸП?›‹nБma]jђH2ѓЖk[${дZls9X+џ,uФGŒЊUY–ЪŽбh<#еЈюЫШ5дmУЕЈЂkГР ЪмQЄY–џ,›aг KС Љ Z1šФšCЅƒФ34№YQqbзР”5n/ЁЅH’"ў?ЅЮK04AJNRчЁmaYЖЬKš“VЉ­(ицЂpФ?s–џуXPЌюЦЉЏ#…4ђуqЌЄС‚u ŠЂŠџœ ёпŒ xЪ†’L/ТяW‚Шб€ѕ ф+х—k(tџй&ў'c˜F›Jе+VТо™oш,ў_Œ№oЖ>зМєUдЛџьёѕэ~ŒуЧј1~ŒуЧј1~ŒуЧј1~ŒуЧј1~ŒуЧј1~ŒуЧј1~ŒуЧј1rА‚ЂЊїOk?љтAЪŽ„q’фqЙF*ђ]ƒНlIšЊДWЉљŸtЌUћъXŸфAџнEцєВЬї?t4jA„lћЩCн'ћц1—~a“T#Шв$Я’šГЌnЊЊˆєяqЩтkт€ІeYІ‰ЗXУ8јћо˜цCЧaG)ъЉoЉТƒн)ћЪБ 8/%Ыp!FHm™ŽяЋ$Ж"+дjqѓшбЦ УЄЌз2 л <ыAn,э˜1‚ц8 MЩ6ј3’„и ­YЎB>"љЭr1Ÿ]?zdЄEQдmŠ tnœЃœ„ћЯы "%YїЃ@gYYЗƒЄDўу4ВNф‰GЋЭrЙOЦж№7UYѕ]иІŸWmWФіЯh]Yё,єTЊdЁТŠВюe-2;ЄЉНš.“Gге|v3п<ЂТ, }TNmВ ШЊ~лЄЃ?IдgJ4a!•œf9^0 /Gвь"АЙй|ЙМztОœнŒЧз7sкŠ0Э oPhЛ-<]Ru]D§n…К†§рП4ЯЎЏЦQ‘E†­Аьw}•ЦYнѕ•/ђšŸцЙЏsДЄЫ‹ ˆw”™ЄeSиŠ•ђe]ј:RYŠlИŽi†yфg Оф%~s3ЇЏ^ЩV СЗЫ<нŠъЎMtŽ‘Н4ѕTrОZ^Ÿ]ЏI+JРииœЌъЊШБ}Wт5вНяХЎвЊNƒяМ)Ad–SRuпrl;Ьб›3‡ЃTX’ЅЏ5LBKц…ЭћwзWs5ˆ‹КH-‘ГхЅЖРp›ЩЦ ŠRlQ3ЃˆЃШћЯ-Šдќš4Р в"Cu–нО­ещJ к&ЖшьЇiшкЖОММšЈЅ]zІЬqvоvЙЋˆuБvтvрЎИнїmћЪїEЋKQИхhЅ{IеѕmПEБН>2цgkA‹šмуi‚EБХ`Ўg"ИA™y*bћyПяђ0єьЭЦ луёУёxмжЉoыЬтЛтNCрѕœАьlЧлл§Ўіе ЃЋВ‘—L‹Nˆ$rЖFм№^№.ЖУG.=б[”A7’_ŠОл"r-‰Ёх;:Љ™–i˜*ГсM/Cў­бИзZїїЙ–8]™AR$БЃh^ж \SћmU€DБNпЗ=ДЁ%Б,ЉђЛьхF1з |лр9Хr фкя›@a$7LlЂ[ .I qОA\‘nŽЂs”–m;шŒРЂ3‘TEm ›зЎ ж€JоsОO9Гb%УѓЈз€ˆl ’)л}n‹Єфud‚ЯФЗЂ5Ч5љЩ)щР”ЋФŠв’ЊI=K`ƒ{л>@Уn >пc!ПPкп%/.DЭђЃ(ŠѓКŽ\ч ПDЕц.4YRї‹&œ0ЯC( )н’WчoзVкЃй~ZзЁ*JšЁJЊэУЄбЗ‡C“EIbЭры‡З™А4A> ЂнV‘)l$ЏBкЊмS‰@ЉDuсY2A‹дшэЛЅсЙКh№˜]›ЊЌъЃzQоlQЦiЩА`РvзfЎћрy‘е,+ШŠ<  >йэrG%YЇоmЗ•oѓ 2cYмЫ'хžЭL—Г“ЗЇ еБХEъгОЋ†;€–І™. Юэяе|џжІƒUўCУ=ЕиБаK\;ЈvpFIЛ§Ў,•&D7+BдПCщЧ&WWoOЮЇЌЎKВ— МGr„Eь;"ЭIКщ–Уm?\DZЫКЪcЈб6Ч@]eЃј`]F†beнюа&aмР‹-,™eРM jЂЂ@шмѕќs=^KХЛЃГ(єRHž•я‰7“%ЇšЩР ‹qƒaрyЎc=hЮРŠQОЎEѕ&Щ­ЁZЊЊ•UP’уЅuЈp 'ы–у˜"q9šЮзѓёœу—sТ`&шљ~›{†А^m$;ЈhєМyзJb+Ъƒ^‘Z€-ˆю (І2W•ДЈлwY5гm›Ѓ;AеF*3ПYƒнGL.Fs’нLЦЋЭЭ›ЋХ†W4Uвѓ j™—PЈ< Яф—н~„H :џ Эkfˆk ВAqCSМjЗЯƒнqОmШќ №’YMl6P^œž]œ^ЎЉХхх|Н|їћЩJФœ6]jё”lBЪњлЛ§~0z[z9%EYU…‡єiYЗ#(ш TкяКЬ6T+ф_УLьŸ– шъjф>VDvqyrv}§ю=AOЏц‹ххћ…ъ"1gйї‰I-UР}eГ?\ЁX/&0б”fйЖmЊx{\†ZЮ@ѓЛя ЯдЬ ЉЁš­ЧтцДтыЏсuУХtБМ9{7žœТZМžŽчŠ`]q)­x№Л~рпм5`wbv…Œ#ћуУ]Шяu П†W†Іюф`ўЖˆцъъlСYy™iф› Л˜Ю—‹щјѕЇ'чЃбщйˆ2мЕгЌ.CWb /)Л[$нuєZ_ЧЭЉМЪ|ѓ!ЏоЎ8,рD-ьРв@зЌ};€ј$vГЁеуШеDfz5™›ыпžžœМ=9§уХЛ…‚т}О„О№0ЎїЗwЧЛЗGј_уы‚l%TbšЊHw“uУq,CГ‚‘ѕ]с›КUьЖЛТ”xzCB˜—GсзаBО€йtAP‹—?џђьЩг/?љуŠQ‘–JwХі\U0НДню)E!ьXш%оП%іС"ЯГ<д&нЖ 4еƒDОK5…МИ uеŽŠК.гаVEn5ЯoЦчПџу?=ўѕйы?~љхЩы БЁX–a Ma$m†ŠgрF@‚ЮP$#iM™чE‘{ ћфѓ ƒR(фвжаєАлэі•Љ ГЉ`XIн#3АЁ‰дььфтђєнГќЫПќуЩгч/Ÿ§ќЫучяЏ—ДЄшІ?ƒ^ВLKЈг кКEОм.БеN‘ZтXAVјI1+†GъsЭvУЂпеЁagлуўиƒŸ0kAЗ’ІЋM˜љейщщљщљйѓŸ~њљЩыз/_МxљћoМ3ЊeZ.„D™ЇX Щ\k0 aќ9іМАшšижDТЕЬkИ&ѓ# р€nішwл:ЖН Їу.u `UнЏЛЬdWѓ›ЫЫЋГ7o_ўўьзg/пœ-6‚Ђ—ГбЛ ЊД M‘N@—%Уq]7эТцvз– Ф}@дІŽ7с5щлЌ^“$ХЁdф^+‚ьrмеY˜lШk\К†ДYsš™ЖЙ-а ГYŒоМxѓіѕЋгIk’]SЩгїsQs0IшX/Ј†Ўљ-ВСt%VЁ./тy m№Ѓo4МYи` ™QЕ‡EП­Вц€bайL…О™qВ]6Б%KH”wr:^“'ўУЪ2KnІЃFAЎЈ ЕЉl#зkFMŸ ш5iœЕh4d€vрKє:А‡|ƒбє=KЉид‰*Ј Ї4ћ{1ьк7Tfђ~Ф(QSB”ЉѕјbF Ђˆъ-†…lК"YтjF wгЖƒ’СвщїЏзFr@ ЕкЗБR‡`„\Љe^”dF§›ђ9ЩАЪRRvТ)ј *М#Gpnk=}§zЮy  ржгŒт8Рq’ЎЋКnhЯЩ–DЮ–ЭUЇ€дфX–zsJ›б‰FGемЌн‚g7U–Ј>УŠ§†ѓ’A@3Уљq‡ЛјmЛ;"е№ŠE$oNЏH(a bY23П^ё#Ъє„еЄŠža‰ѕtBЁf‹‘ЕЙяZ–AN *о~Ѓk[Эp­Oдс,Ћ, ѓеFЏ9AрxVR 'ˆГЊEРоЗMЗGцшУО‚‰ffз3V†D‰щ*=ПZ@Єх‰хJDлUЂ8РPќjД (FД €‚ц4žрtЇО…‚ЋqFs=їB0КЊ*H­ЮWѓ_7K(эpЦ‰‹Ў‡ осЩJ‡рлБ.3Гб”S П„5B­89‰3}7І‰ы‹ёl>Лz§–4 SDPJіЋ*v S“eŽЕlОэ|‘ЄрЅhHBŠZирйYф˜ ѓUЛ{ШmŒм™<pВЪВA_$qБ=ьp6ЎЪЭ/ЧИГЂЎДЃЋЬѕщtssњњХХ|z}uyrr6^]sК&м\нl=,ЃAD|žfdЏЛ=міЁB-aЕ#6Eцe$Џ‹=ЫдљЏ!дPtШЛ ъЖ№’fA x@a‚" QŽlоW–B\Œf”ЌК)ЪэъŠАК:Л8srНЄhО‘ ` /оЭdЙ>Ÿ š•–>ЄlMМЧ,q 2зx—ЊхgHŒuшЫ<каѕЏй$ Y:МFžВŠТнЗЃ“•0JЇšДМš“№—^–!‰‘АОxїњнxСBФCI0K3=[˜МyПвФ‹гЂyUщщёeI˜ЮыV/­ЇЁАqбюЗ‡_*Л _ђHЭp!щўь}w\GŽЎ~Щк’•Г(f6Л›oпœsЮљv`“”=?ў—о=ћоЬьJ2ЕГч<•Цc™ь€[…>Tј„еl|5'БKpдAЌВ­ѓДhzўM(ёг!ИxQѕR€ Л8?=|wЮ`sKMQ- ь-шмќь˜фNIХ ъЦWEBXpБ<ЇчЇЗyрE >и(Ш’˜šЇ–п…єЭŠRў|8ѕ’YљvVS"ёЭЌЕ-qWУ9žМ8‘ЋЩ1OŽп_ Š( Ѓ гСХх`ШBмw|2јxИRЬАYЧКLOЇЫžгЬ,wиz ўpЛди•2jфьj4ž,9сЭЅ›^^ЇІ&rєrNа4'Aд‚эѕ7э§JзUІ‘е‚fХw..ЇГ%шЧь13=%фщpЕZLЯМ.NG/AhнЯ*РЕ29Э‘@ЬЎaЩіШŠ€М[#Ь“jq5ž+FвŒocЃ‡Hжpгѕ:uяЯQД ;ѕЖ?їяя+šЎдn>œТL+†.‰4ЌC^œ,x–И88с˜%ЖSбхха(љъ`ж ѓиk6‡Tн"c˜ь]šЗiWƒГšNZ€JЧў6ТqNб +щЖUтCф*JЕШvЕC \yгЅšШЯ/†$hnœщ˜ђтhЬsу'+™SEдъАŒ"KЏŽЎVЂЂлк`M"ч$˜$˜–ЖЇ(СwыЬ”%š/;№NУ Џ‹Б^ 2ты@Ђ1„ЄŠР+о%М[wMSш—gЧSNRР0Ю†+@UЬ№„ˆгƒ…ЂЁПxйp €ЇђхЋуЋGУK2Œ0:w^Жsи@Д"ЕЏˆ"KRиDUч А$п’YAPЫЋ85rЌб‹Љ’–l‘ГтіЫlфо–Ж"ђдхфЎfˆЋс цGDЁ‰гу! (ž­ˆ%‹LO№‹сЫЃщХХJT ?CCЂћЋ§­3žіnЗ0бO‚Ї˜ІiК~ZФЖё їЯВЊ№‹ЋыО1l—GŽwhз}УЬ-ž6g`pyzјњэХb5< ŸЮЦ' ,I\~ЖЬ ?~sДœžO8Y1,|‡ЎЪIpF јПЙ‡…)В№FУq=фЌ@’КцзяE=’DЌT;щ0МИйЖeйьnџЄєщ#ЄHфX–Мxљъєj</zвžœЇ5PГйХ‡їŸ?Н§јіэтрhЙZЬFOЂ€rЋВЬ­h9†чЧо‘зшЯ!šќ №ДЌJМљos№_=е`ЄmlДhИHQбnw}п^џfПэъTZрЉеќфх›ЫЩpB4l˜МСЋЗ„Ш+т№уЧУ!A,–ЋЫї‡ шќрpxq5я›Уƒ& ()0Э›Ў'и6Y‚чZo0ŠADжтЃѕЕсЂЊЙруРjЈDX_юzR›ўŠ<9|G[5mРsфr><њt>^-I–Џ)аЃзo–ВЌА—ч$ь?Р[фёћ%„ —'˜ IL—Ыљ т1 МхŠl‰m•{ъTяžоeн mB (Ь1П2\ЄСR•uц;–‹t3ћћЛ8z^-јŠuн4‘Фб=sж№ђьbМЄ9/&oо­d‘žRxШ,UWЮ(Кx=`љћкЫЫѓЫсd>‡˜™3‹zѓa-Ќ%ъ.хЎŠ§А5^№€VаœЊ:Хzл9€чВлэ3щ™#аuСьКЖЮ y-Hv5Л\Œ Ž4%>PМАќ|Вц‘ѓТш`,ЭAh№‚oŠ4Ьѕr…ќE‚ СаюfЗоТB^п LtшВЄ ?nћ_ЋдДЊлqн3emї€ЂБх$іЪм!sнpгЖmъ*P„ŸиЌ™ І“ЧƒяЄо/xqvДр@Э а–тЉуKђфЭ;dW—Њ ”`oДИh~Л_oюYt№n`ЗЩ-™!^эєгј:ŒJ!- _lnћЎуИ`}fаКы~%ACš4Ы"ЧPњУŽљхœb№›ƒOЄТ.љйЧЃ)‹$›Ыёрн‡гЯŸЯ)0з2іѓ–q(Š‚З’˜ ЦєL7гї ‰&2џAxсй_Kh…ЄО†ƒ6#eЩэ—Л^f\9€бКPPМ,O‘LGЪ/YЎXњт#!Pг%sєъебьj0|~їњХЛс|N!‹З™іЭБ-л BЄ m3CЭЏїwx3‡˜ Їzгј2ъr%k†k[_щ‘ЖUбuЏм f€фї4HИ ёоoНЎхЋ ‡g/ь•(№,•Їi6sёђѓхеt~њќХ“пž?yќьЩг/пГ"ЎЖl„EUЇqŒИ`ЛвчЦWюѕЭнОчhКзMщ€ея•IЗ,ћ+…ц1xPЭŒ`ВQnљІЇ}кBt{Ноd‹K0‡щgMSU„Я:ФOШ„ВќєќљыwяŸ§њлЏ§хё“ЧOž>?˜KЊa!gPW!#сЬf‘† РoЩЛ{FЌІЌ›{~tЄPTp ЦWwцћšH8œїd-ЗxBблŽЭСi<™ƒЩH&Ÿx\ж“ЃЩЋїOAЮ/ž§іHќлoOŸ>‡Р“зјmmРqИˆ@ˆЃSЉУ›9$ВйfЎуx`фул‚иѕ…ЦrЙXЬц$+9ЭЎяЯн ‘сzко+с)9lAЏKRз’,ƒѕ ч‡/žН|џщу‡7/ž>{іђљѓ—/INан0ƒiь6xЎжmЛи рY‘œj{nћЎкЕ#ѕ[v7,дh•oЊ|˜Ю@h^БыžЊп‘зh ззЛMgЯšч$™—‚ЊЉjXWШ№7УЗЯ^LgгЫУЯЮ>П~і~Цс!RQ%rЎk"Е–ЁсМѕѕЭІC.ŒžЊš!‰хО}‹чЙЏПƒ!ИГIтЖђџњqг' t8йк UTž‡PC В}uF" ?СaђсХ ЭЫ–ч…Iбткx№ёРЋf!зІbПЏMžZРЧ„!&Ѓ)ХCиў•2S2DJША]]пїП—цИƒ_ЃK і0е`я4Чu=№ЛЋ‹ѓЃчЯгБР*‚мГЪ-оПаxѓ­y`Š*ƒ0X5 ‰G:cХmƘњŸоК2K,!VhPbЇ7Ј_}ъЋ" ї’f{їћ—žфіЭš;А›вцБн.D,Мџ‹M† UX=vDŽВЊВЄbi`-?НПЄа‰ы~š'ž 2NРЭІћЭцzПыSЁЖЙбЯ>ђiCtсЭƒѕ§крХ0m7Ќфсф\СHрЖП@лovЋѕyгGЦ/чфžE\гUŽœž?љАВ|Й(%žсвa`Gя‡г9 &оeaР Ю\”%н2эќ ФЗ4M9<‘eћQ’EDKŠЄZіWГpЬIЛCzžž(Ћw‹ї„{Ш6zГM%>ЙЌ…Qа„Y ЮЮŽ>Оxqeњžя‡W—sI51qХ ^О;<>›‘ФŠQLнД lEEBзЂ7JлMŸ„„\Ms]ц‘kыVф}5[ЂnњJwїхюпяvkMHЩђ"“ъu­‹fЗл&0qN™щрь№ѓ`:_Њр }ј:EY}О”dvшлЋуЃГ‹Ѓƒуу“Ы• ŠчUQWщJ†G`ЇЏo7`S!дUзUž&iс~ЕаšщЗ iH…twh`гг(!онЎ1YЊ1Хp’Њ*ѓ"ѕѕхёбСбфЌjH0чИŽЁЊЬщH–uа0Š‘!Ље№№ршdfFШИЩТ<Д-U+aѕp€V„мя"Џž‡ьŽQ^f_ЏЊТэZАH> ІџіЫяш‘ѕ Xч@ш+i…)ЙБG]žЮEщiњДаiЧдххJе,7­ŽBМmгMz8М\КiЙоьжБуk` эі­tШДЉЃž ЙМ%итКЦ_ЯуЊBЗАN˜h„vюКчŠЛEˆ{&s=PЧЈ››„XžU,pСXРУoпѓС–ЌbЯіђ5A"Ч r“B$жпW&q’ФІN Б&шVдОi t–ЦQ!9ќW‚“ЇQ7;$†GПчlLRzz€Ї0–zEKšњеW”Љ'ы{ІVфЪmRПЇ&rJЄEХуiаѓm__ытВЊ3UeрW‚яеВ4 tфЯѓ,Ob0)^иCІ"…_—uYuЛžџsЗэok1ч%wтЊШЉТ*"CБђз §Ша§j‡lZwЛ“‡™Ѓ9йЊzcк њОiaЋV9ˆ’U оЪ>RчE‘Ьidšaš”ЪБ„Ф bЏРy”Ш˜Y‚‚ †­Ћ•ЙO6­]Аг4:Bia5]r_MЎvкСLьЛи sФœTЗУ“&Œow ,ъцЋ(ЊОvХЏbг :ЯВ,+gˆџрO‚ћ0/ЫтˆtЪ2Џ№"uSуЙщСcЗi\3 AdАвЎ…s§m)o,mЙЛноЪБЋщœU=оєц@šЯГРзBФUw`љjp4ЈqšС<цx3яи VqkК!Ш\aЄSVi˜7ржU оp‹‡ƒЭКuDP”ŠьVH‚fџлеiнАтэО0eˆцчЃЫ9 ЦоJб4+МЋгjНiЪ@ѕzЗ[”(W’& Х(4ŒФВ@шyЇ1U, ‚ў`mš&ВГФ,гњ“™јQз…*ˆё 7Js44АФп”а$jfМ[ЛŠИœ‚ыхfša…W.  ЈaјhujXe “ŒQ9Lr2cЊ$ˆ–'8г ˜tи˜`c0zHн6Б‹џŸzA{ Г\І!–ž@Ž&OћžРћC0пVЪhVОЫu•ž/D,0KКыm—…HMжюжОсЅ]SЇAZg(r7цЈЬ ў"tмˆYLоиGaœUйTI €(АMЏ]ЗuцЊю•н:ќ$bl`G№Єx=їm…FЂсU |†0;= Pdкьvmт v’Е›мщ5к"FF[дьBбOn‘ХБС+N”$(.d№Ы,чЯV1€Ь1ЬтХмз^ќzге=пЛЊйМ>ua'~‹Ь”fХm GXFДЊЙФсMbтсВцGiЗM-јь €Ш,УуІЏ€@5‰C…fЕ4"ˆ Г[,v'АђQнОэјхК)B]XЭ–ŒšДЈм`hМЄe:ЊђMiО”n…€95™›žœf’сdГ"KXF-?Ўw• RgebЄАЋа0|mŒ•Ў8]H€3’7gЊ^•рС њF\"Н“Т^L‰œHЩLыўXК+AХЊЎMŒo­УукЊ$аЃгѓ)ЇйЩzПŽёvŽ#–ЌЈ:AОюЫё`ЋЎЭКgmщ-7LЈM}<І Ž.2Чэ6КЬ3_жx t†:4EzєљУ˜—ЂAѓЌё |iпЪˆаЗ PИефbˆ™wA{ГC8#2‹сxХIјЗm!XЇиїўtvЈ(t ž$ Ш—('F}HбЂ‘Fcž„šhF`WјT˜UашееЩЫ3–W“џёи №SшђЗоъ‹рўййеГд јКЙi\nО Цgc‚ *к‰ЧXиfxzдтQSц-„jO_‘.жž]7z м†Q3(‡nЦm•ХЖФ.†ЧЯ>SœфнКŽлщлТ3дoЮ\g9j:ЁТPПм"§9{5<;<ОœQ,gЂSŽ-ЧСjˆїРxєRзXfQ$ŽхвьЩгЉц -yˆ‹€сYв#Р$В‘qЕЩВишљХСЫ ^PЃzлВ(›QYge|O3Zа‘Л 6нўК 4v<:yw4%–7ŽdлЖїX˜\"шb n~Ў у_Ÿ\ Ъ=­8ž†–е} 3xЁ8і-‚Ь<ЪbPщ%Dђ‡#Nœb]XA‚д˜фЋ~‡а ˜dЧOˆь­’гgЧГ‚_œ{В Ћр™^ŽqsVє—hЕ †3sўЫЏч‚lР'€eЎБи ЄЦœА(‚xн2-Жkšй˜ГXNgЌ ‡ык—WŒb%Ehшп‘IhxdŸ}ВDe)фˆcOЦ/ТFSрoWmгќ™ЦНh ŒВLзRј“_Ÿp’ŠžЅюГе“4ЖeлеU„„`…у8šЅ.OAAЬЂ 4n44Уќ>ь…jВЕмK*G&Џxi0!в=@4izNш1Ду„ЦRˆIСIч)@4SцŽ~}|Ф qwŒмЬНл‰Єz’рbоКл9Щc]РСёгOЧ/ymiIФˆVLшП‹PSФJEбм|Нk…™rв%!Оф%т6 ЎexЖŸ#—бРРѓ њзCOТашeYvЅˆЋлb<ь3|—‰рЫˆ_­x%m#M˜Я‘Аюыёџ<ˆ>W”Е Ою<Ћ)xТ‹ˆh-Э€'2|˜tDЬ0@,LdєќФ—O~§х3g{&†лі19xЧШЖ%ІРРv†§–x˜OУѓєрѕЫ РЗ\ Ві}c^щУ6'пѕрg“ЋСJЭ№‹‚Cп‚Ух40rY^$Љz„q СLѓnhY6b<сYSšyЂ^эj™' І р№бœ(1чЏ_|\ rPgІ"P`ЂФя,0"ѓslлчš_žM№жI kЏXg№с– ~&‡ˆ‹q.С}X–zёјЩ‰hЙАп яХ†йЦиэ7%Ш‹Ѕ“ЅФxШХKфСГ—я.бH–СSpьїжaЬБYщ†ѕЎu5qvђсѕс‚с8Р‘ЪцЁЁXЖ1kНiЋ(ˆЄ AfјRIМxќјгMu;РNX!LьЙiaOaЩ†Ž ї`1нSyvєіХ›Ї3FqВ:6еПBEЩ:6’XoK[“&Ÿ^=}ur>ЁEЗ‚ )‹д•шAю&Эvз–Б ўЯЗёt,‚pљфёоц‚дn<У‹–ОJёšЄј§‘vz№тщ›ЯЧќQйexїЅ|oЁlc3Ј:МћUљ‹ї№ЉЃс’“<˜щ:-šqзЖœ0oБn=OаqрAžЁЊЫЗ/G`UМЁ/.пvуЂ)сБ,T-.аUІ6h3;ќјюхлУГ‹ЭЋ t@ъwЇЋгВ:лжЎ"“ЇGd˜ˆ,ФžФ)O`э`^M0Pкbъ=@ аiЂ*ŽЯER№*Фv,ЌIt|МRЗL$ЊГ8+ыи‚OˆГOЮ‡sZЖ’ВрОS?VГ)+Ћ>Ь‡ЁHѓЫЅ”dЊ,4ШђКŒ§(qmќ&ШнЧcX:‡…E2ЈД!_№š„FxсѕЇЉAрhВKc*fж$AZе‘ЦQKzЕдць§чГ‹s№,n–`IдwЮ3Гš‚jee )Тh‘ВІЈšЭ*иїAю›Њl‚фxњŒО/ <зxNPMц§Ы<*€p ќ=žуѕ“ЦYl[ШY[†ЫА$Z0yћъhp~:“­Тх{Еƒ\ЮHаЪ(Б%™=ЙрEЯкuлЯЪдѕђШ24yG5 ўgaБŽЧ;МЁ]Н|>”5aXIЗ@Р Њ`>Uаa9YWyAбB.Р€ж„ЩыgЮЧЃЅdg‘.ў•fGЌЄОoHвтхл%от•™aиI–€йH,Še‚Ј ;^PKАЈЯ^ŽDГQЭ6UMбtx`CЗ EїЋ&іЂŒ>dяyйС‹oŽf+NЖ"LЪ_З’c)В0јэе&@H`VсgАЉB7IaжtƒМЂ?tM‚yу8UхF/о-Xл3цьГ“ё<_lšЊ™дUрee™˜x9&с}8uўњэыƒr@†–,§•6Аn09ВHBt1 AhLЅaˆIвдsЄ6СЈъ˜ъc…О*іїёЊЬЭ^П'(IfhŽУд ЯpѕОE‡JМ ЋЬdYФ[}њќХ‹O+Qв_—џRCКŸ%‰<њт§щQhpЗ†—ЦqтŠƒд:ІУ†yˆymрпt‰žПџHЎcyи (3ю]ы/А­ l2'jлТU0Gж>їшЗ'O>,1 Жї_ыb#с]“8џ№єщѓзCLDa’ЅАчЈu‘;*H/‡‹ЦUрЕ№§ЖBŸ?HЬ2<j6 Уndfв41еЄт4‹XDu№фЩуїsЌЋё—d~Д„yтgЏž>ёђгhБœ +–сU@K˜bщђ§ЩНЊКMе›hIP•!^OHZеaЂyPCЧ§k щ­žК­тМ[%ёјЌ 2ГЗŸ}vМї†8DuˆDzГˆъaЅыЎЌжы"ђl Жœ(Pфr|іfњХ№`-щ жоŸxѕnЮc6#8йN*˜…В8ZЃ‚J‚Х2MŸ§іцŠцtGХдGB`CУ—zЭІ­Л5РЫ4Аxмфш§ћї/žўтљoO~{ќђrХ>T7: \ OC3ЎъШЫ+ƒЧиБž[КЏ2гМЂАXfu№ьй Х№^h€m@„ъa Шœnv€Ќb М DU˜йёWїн?:@5/ЬK•V3”šхцŸ(AЋЖLнЯ@Л‡Е–u$3ььэГпNр…NЖ"MХєC”УNК-ЖT™iTМЧ’Ѕщ›gŠyАЖЬсћЁБФићZЩ%ЩаФхл7SAі‹КЋт .lћЃvTЕ™–ќтхг_i–ГћУ"ДˆЄ[їд1<НpyBіЗpЊ*Џ0€јдУС fЊю€ѓ‚ 4XсЩйh8œ||}DKVк7wA*qPX;Ъ›Ўђeš%Ž>Н{1 hС+Бь§`КYg1іŽщ ФŠї‡Ђа)z|ХСЛmSџЎМ$ѕŒ6Ь0‡ЯЊ&в%žœ_\ކчЧKАЗньi>ЬъnгЄ–Ш`УљС0J vЂŠ]Ы0“ѕЛ m1•PсoЯW N>яŠRt+ŒБ.єaЖ!Ер 3.Б]ƒ—4U Щ`ћfvœ‹+ЬЖЙНЉг4k№кИI &њйѓу9ЭpfбmЖ›а•“tи=eƒзMІ$чŸ‡ ’ЦDМй„” $Xцo=PЧ?BбЭQПщDe[z:ЖЦцб„Ї—ЏзwЗ7лІЯыZœi–<{ђјŒ—є˜›ЖŸПопм^ƒщhrG6<ЛœЮ—KbБXR€ВНЌ]W‰kZ#4 ž#-ы ђЎ-|ФРїефvRbQІ‚l1/o_ёьјщгЩА2jІњoлКХ’$М\_у>”Хеd8š’4•ФЎС БтнўKѕзџ1м]Y—‘cyIНю §Ъl†eГО—љz‡щёиљГ u'оН0,Џ†иQяЋ6кЭ}ЪџnЗmЋШдdnE`Љ‰ 8бХkёб*L{ЁБŒ6ЧK ШѓЃМлv^Їb<‚­ЖН,{,Скc‚. Kb™ё%ХqXЂкєѕfл­ћ,}LZнv˜q ˆћш™Жы‚1mћъФ: ы!ка-Aсќ/ ёњ2kР —Iшao4Јлнє]/v}ѕЮnгaЎЌЬВФœцАE иР-lдл§fЛПОЙЛУTЙlMМvA1C$Хfc˜<МЉŠиqОу\њя†ˆЕ АW]UЄ№н%ЫГМъS юKіл-ЬїѕvнTyЖœYЭi–—АTІлєѕukЌЏИэ“хPК"Ž"LЎЈъжрЫ—/Пп­›ВЬРл?€а*жп›30 kЗнaв_ЗЦŒ˜FЬ‘мЃ мр•љЖЪГЋщŠF m% +РЬw&%b–bžиЎЯEУєа&@Vбƒ=Э№№"ѓЗm™чиеxЛоочЅэњ>?0й(бЭЎЋы2ѓБS9Ц+%ŒbЙоС №з8nї˜GŽУ€œ{ЬУEНЙЦ™hbћ!:чЉF—UнbНуІ­ВяпPh”z{/5Ъ„ЙЈ-h 9Cє4Y2Х0МƒТо`оx/9жFмо?(ЪŒеˆwќёЧs!sТRЋр‡–„ою6ићДyн_c_Ч{Ѓ€%^ЛuТОBЁ9zЊятv9iз_ўж'iуC]oЊШyˆ™–6`в"–иb>іbюGг Ўћ2E\хлMх[и˜кбAшЩI‘$Бb•hfeКНћ§юfгЖ &уэћFлнэя_ў|?:Ьќa6"Ѕj6QA‘ћ’ФЂžО#GS7Наw}jјО E5]пЕDž™MAцФЌ6їѕ—0О|йуfХlГ>­~њі юа}П33ћk+уўы!jzд ‡Инѕ9œ˜zuныѓKŒіНаhЪJЬСЮЖlѕX‘ЋхŠ‘Ѓ5О4ˆwwн­1ыlЦяќоgпюЛдїтК ЌjP(Њv‰ѕUњk,@ючМ_еўŸЛ/АјлXfбЃ`‘]‘4ЕZ‚а‚S ЖИЗ_њзТМУ†Ч€‡ ž‡!;yю„ЈВ–Ў1Мїћ^QАКЁЯ7DЩћnжЎ@ѕ•ЋKЬ|J€J+ …^Ућnя `jqТПмЯ<шѓЭЎ-b<4e;Фіƒгтu—'IЧ9 т}яка|СwпЂ8лћRe“VВ‚Т,ц* F/ЈpУ.qA'ўРš|Pќ№н%Ј„жŸdЛ‘o> Шƒ!q[ЦиXгМ[Аѕ Ф§вЯќћЫэ.–ЈЩxн—HšУ0\Ah"^ж НьфьUпoќ§л H}‰’b8žѓ`нMšWYŒ­иD^ђК›{Ыќ…ўН/xи2=Mц‹хbz5Лš‘4CБ6žkћšЁ›?_‹’пѕ2Унн[fxT˜юЛ/ыPcБ&nЖ$–йдє?+‚УДИОэUтпя Р—{IіЛКoў# 2\<"x;HH0dЋРRљ^?р ˆUњ ЙЫ f:OfФjѕC:”У$Ћ$ХццЎwР`qџ6їюO›НЋ№ќK†Йц8–ClйW%€еfy9ио#XєŸ7€л-|Ш—›,Ю l;Чђьш?W5ЭДќ0 уœлПуŸО"­_p<вЈC‘dЌEDV{FбрШЇs№0œГюсœ}хлЖиХз•Џѓ4лW/ќ€ЖъДf`О >ПКщБЮНјуo y‰фБQтўDSL†‹хr:8:ЮIЮnБМx›ЗДeхdУЏw€љšФб лрёАpп }зжьт`1@пэЌѕяЛЏўƒмB|їче›,’фMЯ>~,i)шG иК[Л˜ѓ%lSlчн~]€}_ћ§Mаў‹‰ž  чћЛ/зmžФis}ѓ‘Ф]oЧіx‹bY}›<‰Тt"žЃЎЮ†KVВrєу€ВnЎ3_ЭfEƒХкл/7Тжƒ@џПЈДmiЏћлmНg`…ћиПЏFЛУpКHА СЗ5…ХJQц)€ІЊЎћ€дЈu% дœЄa€Э/Б< ›Ѕ?†B3uY­ъzкрбNOЏСш§эо€РloлЊФl6ьЫŠ}рoЬ ы0 ИCѕHufzEKР‚4‰члн5э˜?dЂa, kЂЈ8э&1‘ I%мнcтлп{l}q/ж:љєr’цћžысI8q0хww›@ЁЎЦ кKЏ–”`хv№њбŠцyI ЛТR$r№љ’г’рY`˜ѕчJ+@/њ.“ggу'ЪКW6"Jˆђ1iIbЩ кN”ЇI^c LѓЗUGўаA˜Цf…yцЈВŒј‡LdЈЁЭSˆв<ФІЅпŸњњаcJАŠnBы„y‚­YсgŒюy>!EpzОƒнK,dmx@о…П64'т-ІiXn‚<8›ДЈШєdЮŠрЬ>—PS~МMў†-2•О%Кю…ЎоЋР‚—ий”eУш}З џ:Nе8–$ХиЉJ(ЁўY-†fТŒYX=њ—цџ~,rёhХIџW1Ј‡Ф§KŒђЯёsќ?ЧЯёsќ?ЧЯёsќ?ЧЯёsќ?ЧЯёsќ?ЧЯёsќ?ЧЯёsќ?Чџƒ`‘ёRSe§ЛЈQџƒ5Н0Фж„ašdi`§˜dз‡6џ/АСwRжmSчў?ш9IЉир§Я*Hnш{.2шxIНйvu§]ђŒЅик2єџЗЄёn`iHIc'YгVu:I?\Ы”я йr™тэ0Ц uзЖБƒžƒlкŠ~؍0ёаФ‚Ј"r-l eЙ§Oп8цšbсЃl`џє 9ёLf;JBƒYв‹щt:Й|єH‹В4ЭЋвеDQЕМЄЬУДWџ!ЌM‘QЎH=E0‚$/Њ< Ч”DУѓ цjΘOF——VAVфЈЉ-1’‹myьќ+цšw#yKсSK-lп^ЄYyм”рea~9™NЎУGl˜f‘†Ѕ+|xМА^oъФељџasЮ*В„ЖвЗЩѓЫ&дUУI'ЂHBgu1^гГУсttq~1zФyIьaеl6ul™^бmзeфyŽѕ rўй Uгёƒ(4DеР—­Бa‰_`ћ24ЈГsR1фЩсљеpp1i'I]Аn жЗ!ЏGySFрQ˜)e„№wЄ:ыКЖ)ТъѕЯƒдx*и>р#{лwлmnЮ.(3ЌСпБЂ•d‰чиЖIL?,к*r ‰бтr]ЫRТ šы{R\0‘Їќиœj№„"П^ЩN@#ЫГЬA—Ју>ІJ †7УДˆБ(D8)n˜Eh N™IЛл–!ќ‚^aoљОwE pаR~pM/Ы’РЮGМT›uЛ^wи'чЌcš~‘й,ж8JcЯ2Щ!яIаHбдlфHnђ(аVЌ“#ЏдЎKБ-8жYўР­8GЦQYVДjGeЯѓЎ-ǘ•‚ІуЬgKйњG–"y Ќ1Š?!ЕЙ‰@Њ Э}‹_.gЧ‡sйvTСŽ{f”{Vга‚XGзM;н€)й`й8™Mƒ„]юЧ1ЌЂbYˆ‹4N[јО:ђ§ іaх(дb%иiŠЎkи_пƘЋёрррpRхM?BVGЖэКŠ|u9žЎD=кмюя9UЗ›  9`Uз~аRtљ ТМЊ“0*sАkКы§ѕ&7…)щ~™й2Яв ж–KW'УСбщё%Ѓ[ђBААЙ"иХf]LЂЧƒ™lg[ф0птLWe`‰дwёћќг1—UЄ†іќ0­л2Б•щІ.wћы›MbIs€˜iшЬељpЖD–нƒЯ—убt4$UžbCz]зќ&кГU‘Ѕ$'jїифнMЁ&ЯБ‚(  AХ№S$™ЄБЎѓ$.жM‡нѕюКнІсзU›ƒЕž3НМј№ъ„,ГЯпЭ0•AжvЉ ]ГН|wрe^'ІHЌAV$~і€B+К‹4‹EбGEgи1яі Кk‰ŒЌyьE вX7?xћљєtДЂ—Ѓ Ха—ЧsˆГтžN,вЈ%vЂіТђњлЮн\okк–"r шъMЮTУыy_БжbиS=Ex‡§YЉ+Nq 4x1 …_ NЮ.NOдјќb<_Ю-•Ш6н:ЗERДМ0ЮзиЃpЗОНX+ГD]8?мT/эмu=/ЎЖФVI„іС†јѓбс‚3вЙ>SпTшЩхщййч7Ї“ƒЗŸNЮ#оё’КЪт(ЉЫР’$лGVHьšБною7Љ Ё„7™Ѓ+§p…t=cуЬ F/s^ƒБZчОЁHє‚ СЬ*№…БgЊвътјt4њєл›ƒч№ЯЇЃ+˜Z$ˆR%5‚WЈЂху3cЃьЈ;YVLpMЁ €ИЫ +JЯё‚4TˆeзлЪгD{0kЊUMU†Ж?Й<:Э/~yіњЩ“зя^О?Ї4Ћ/Ш_ђFЙŠ`ИaтюАiшЭ~iМbњMэ) Isѓ`5€Slі‰-ЩѕdГЉвИРŽ…%­ЮO k<[Š]˜fn>8>9:].)–ЃБmžЌ;–Рn-7зXБswsГŽ5A6‚@*M4Ы?иfММZ2,'’vЛ&Ужил]m+дрbЅ‡Зe`Ј ЗšЧчŸоМxќoџіoП<}љђеoП€Š Ќ(HК†ф Т‚а,@#А'ЎћОL›Тб ФЕр;Љ%<ћ0S}5[Ьч ˜САЃzлцѕf іЊs5сjBЧuлD*C‘Гщ|>9yѓђй/џієеЇ“СхщЧЏпNxнrLлеСe‚`МnК Ж*ФЖћ]›AXtЙЇKмjEQ4ѕ—7уфбhFRБЂxEЗ}TŒvlЗз›P— YРH{мbЏ[NЯоПxђЫуWЧу/УЮbWW'RƒР!)BS–5Cfeг2­dнїОНоlж іv­рЗH>€НAўњ\/H–gШ%Jš“zћБй#6И2… С&M*H&Т­†ŸпП{ћўtЪ$+І$ЁgЧ3ЩvЃВнs[d% €U~}wп% вЛfHЛЃb*ѓUъAГ,K-ЊnілОb№Пнd–Ц O&Ќфж]€C“xzиnОтD„џ(Б$Й€гАEqUW@}_]]бj|}‹im^ƒЌЋьЂ рJWДПъЯЏ–4 š$)Qw№ Жя ŒчЕЛмжјЋѓЫ9oЄ•“Р’yђђtТr`АЁ#<†ЌК2<'Ddg‹ЪІŽ­sч'ЄэАЇѓЖ ]эaЎыВˆёшОчЩw БmцАК СJ›ћ†І(ђvъ ?ЛМœ2ravЁ ПМ$Аё#HЭбфj9›OXat6auЄ [ н51bє`‹ћp“‡Qо`?ZŒcк"KBМћ СђЧВМЄШ=}VXvЛžК{‹ёР‘ОNV‚žЎ›2 -…] ЏАoдх‡ма"/0ФbxvAЪ†ІjNЎ?ѓ-S˜RЊзa?сuц"яYзuС№fœ&јsљЛ-'+В$0`ы4ЭРcєМСў``_Б3№&5ЛœRЂцVM)БГѓ+V“І—sŠž“’ЊАsFт™еx!Ш’(YхІ-’жŸ&%ЋИЦУA*S0IипК+~џн‡{АЧлJђАЅ,?Т[D 3Мmу Н­D"€,tmSщббН}е oxV8 –Rp9<•хž&‹8qњь№рг‡/WSЗ %ШќFŸ:Њtut>ќ™еlГaт”†3JЃнІnћ!ёЉР)У2МоB œ QЬ6 8ЬЇг9ј\3(Wu1;oWЁHїGXЈ•&ЖТR‹љЈsyђёЫ( Р йќюьO”о—ЏъaгdЎЁBVoЈЧыŽF^—ДsМЃЛн4 сосѓщ9jEsќаз%Žž SиkнЫ–[Т`А!уВ[W˜fМЈъ^5@}ш№2,žƒx-Hр1иёйQџъ` ы.`џмQ%,АA&ЃФрВХЛБІ^Ћ20№­Ьt4 ћп/3„?/ bмt<žЮVZ)в Ђ\#›ye ‹с‚‡Ь Ь}UЄzCˆœ“ЃЯC‰˜ётУѕљљѕ€бДХщчћВю„ |Є ^D"sCŠ$уш]CъцxCMGгщlNў{нž.ЁХУ#Р<€Ѓ‘SC ёœЧфo@ц2SйХ”цELдVЄYjv|zОаsёy*/.Я/:g' ™і>Оя „&1M-d(ЁiFЭzН\ЂѕЁаxеЏ*р`AЧsaгї’ Вšцfы-|Ѕ’‰ З €аxnˆ<'€Ы%B2Ѓ;>рГбAнјєlЪrНп>/fW#šW4iдчXž;ќp=fDpї^дЉьД?€\ ZЕф ˜v‰ЄM<…3иXNвєя#Вedи—tЙ…@—њЎЏ”чЕlMx6›ІЌък—ј8_} =œ ВТЮŽg"uБ?фЧ3љ]s<“5ўрCчьj2c$+Ћ№ЄAœЪD„}ž$17kЬoYj2†,vž’4ѕћŽЩ”5ZЂ.ќђMMVќЇЈпBўŒ'њ…СГє|2ЁС5Ъ7q€Cйёё97яr2 .PjŠs^цпѕ{—УщŒW‚:їqюZС.;ч%oЗK_с˜Хh0уaaXQw\S§ЎћХљt>*нмJ.Фн-@„ІNpшй|вАВйШˆ’@иЩсйќђшjŒœyу qЃИШ|yг›FЃЉ лi–%ЎЎkЭ(q‡Р„D`щJ 8 )'=^Pэ tДя8ќ€ФРїЫFК%“—Зm‘зdь5Фp$ X6Ё‰Сlx~мЃрNiNаL‰uЯzџyŽяŸŸ|9ЙИœBŽХПКЄhаWVжЂТ}nС9оa(МY;gšЬrеL'*ЋаPl‹4R “ЉЈ˜Щ’LўМлр„O€вXІШfYћп†зGŸ/:§)УsВm‹рђ>\ЧЌ"ŒЛƒ‹ƒУїПAЌс–яМ9^phfœ СUУ[ Ub-kз7ы–јџТV№”OЧБXЎІEНjcSy0сl‡­kь№›Жd€;рuђП;@ЄL„wЏЮО|мџr>Х!нŠm дј№uGdыю\‡WЇ‡ŸІ ђнЗћ3Žљ<ž€С\ЕШвRT6›э’шЧІ†Рт$C†—f‰aЇ№ уЁї‹X7у2‡ЃFPтDо;’8ƒЩ€BЏ‘џФшщ пЛ>98юЬР•ѓЊm€аG/O!о№гЮY—цЉЩръшS‡ЈгWяЧIˆЬtFЭf3šІ8St‹З5І+\x1€Щ>l?lЕўаыŠь”UdpРhХ5сН!L €ЂсeЎ›ЊŠUŽІ(Š™:нбЩ&mGXŒ^_ ‚0>9с_Тšw/iюьхл>‹4‰ ы <ь`8ЇсI9Лn dЗvIб bWQдэz]ЙкCKAахfРж6Mгѓv…€pи‰ py„/%Yе Vw$jvњіŠсљы/§Х„–чsuO)zџХgPLД%2tрђn-ЊРЊяЗ{lvь.р­Jп„ ‰pлD†љ@§ЖЂƒH–ЦQR.џитюЭнІЩН(ѕ‘№oЪ9’іBрPhКїіˆ™ыЮЂs>gЇ“ХЌПіЎ>ю_ГcрR§!E7§,ЮсѓnZТ§AЈ5`Ћ›А–Ќщn\жЉc>№JC’ [$Ф‘эЊ-СŒ7;RЁј‡?ЌlJєв,‰ uVAl–^Ь)NSvєс˜сg§iя§Л#<фщ}ўєљнчSHщ!дX^’$Б‡/аВм јФђ|t‹Чн(7ђвЌ+x‰œ ЋІ—U…їа Я.%еЋРё†oН{oЛ„UАݘnwfуќџ"‹<œЬR4Ћ( е}ћЉ?Ÿ ‡Ÿ_Пz}|uvКџюхЋїчsŽс%н НЬѓ"/%VUf3W]їцюvН$щ2оСјЊ1;HN 5№(ˆšWmoяoў  "є-+‚Ъ–Ыhpб™Ј6d`5ђ(%К`ЛфГоѕўјќјѓ‹/ž?іфљгз/пžЭ 1'й+N“m ™ЫЊ…яsЦћ_zЮцўnг"k8њКІlЫа‘Ім #їС|gр xа;YоюFЮџСІ†N `Т*ъžS`„œтФАce]•8ŠPUz1јђъеычOџ§/yњфЩгчOž?y?рXAwсГДk4ъeлфУ4цxЎ љ^(ІŽ)љhЊПэ€I>8МL ‡І‹3dчи™aГoСCХ§H3ˆВ• Ч]WЉgCjЫSTї=J џ<{ BПxѕќуˆcU?ЩЋ™КШћjЪШB"X™О\Фы›Л51mKC‘ИTзwМТ`XІešпC†бLh^M0Г б)ЁрЗ[zМ–Іy“!‰ЊъІGкšР,Ўп?{њьх‹ЇOŸ=B?іЖ щ Wƒ"Зф†ЖХќEфСї)4ŸƒњЁЮЌзЁФв„]X@юVŸ№о*п‘—CЪ3ƒ‰'Bно"Онх*^2ф)р†^Ж#nxЙ•ј:Ož?{§щфќјгы/п|ќќсх‹Ѓ9ЇИžујR%n–mсШhЃГЊю6›ллЋlжОDO&R!0сe(Иyўс2Г„gќ^C 42}н чжЫ–mАI˜9IEjB,РЉљ“_?џиЅDHЯ?імтђЗзч*(X”bбoирЮђуQА tlWxP*мt4g T"ѓ1ƒќszёрš,E!Wс~Ж!tѓю‘Ч _"b›*ž"Q8@Єле,лд$nАџцхл.р-Чдљё‚”v~{{Е`!zŠV”ФЁ _ЇXІ z€tОЦкrЇ­s_й_и2cƒо‚eиђ0Е ЫёЂrЄBd^:сЧКйЖIдЅЉyžiЙH™ŸЂ*рЉчЃыЯ/_О?\—Ш_ЌС—ИОйџэнЩ`>гŠnй†iЊ№2'ЈВbZ‰Ыf‰œœѕЛs^аmУвDУvBЧ№l%ТЋDШ‰жH ZЎ!O'V:ЊІ@Ј7˜'ВІсW[ицПўѕўn]ФaRo :нb€м€Е;’с'5ЄІЛ–С N?ќxкя~8žъžчAƒ,LT! †Q@ўіёфlџ§чЯ‡WsЭƒ8цШАш‡Žшт&р`ъeкКˆ=м‡зхZњƒ eYсђі Вn7eфBТN‡W$ ~шФHЪЂЊš&vtzpy№љtB-Іcжt!ё€)ВрЂ„ЁC]^&Ну§“NВbЌЛXoš v,KДС1"р ТVfИЖo+@ ‡ =3ЌpНЃФйTЉoъ€љ№*wоЖѕu0'П,—ФdСRнЋ‰ЈЉВŒЄгроlM’˜ы)ќЩ1#С$q6Xp’“Vјм›Тё4rќ5вШЎoсrгDdTz BŒщљDЌ‡ НЇ™Сцўы7№+Ќ#7LПмю0г†ьѕ2 ’иFГЉyPS rgƒdxиyОEс.†  $мъаƒЗЌйˆЎКq9ђідЮ–e;GoDмlGуЫВзуТлеР3д ­ўIqюoжUћц„ХБюэf‡nXКНZ!v‚TоЗE3Ы2€лгwlзж4щrljш>АŽЯw,Уі}OQ\,:EЉсГУЈк@Же`u˜ј*г›/hš| R €„ђ`еpжпўу?т­`#?ЬjТЭ Y-lїВ!'ыCf^e yži>кOВй  WлР}D№Паs1”Жчc}r§ннbбеЊ­‘H“€UЂ „ЩœЙ™ioHЫрšйІГз0 LЙ{k[BSŒ&Он!uпІmъ2“в›4YСmЖ}€№єсР+и’…ќŠ“$…D )kd–г^З5žЃŸ&Žк„ЈЂ`є„€%ву™П{ Ь{МiЖ„ЪчP‹%@ШѓdюЪ‡aЫзШT  И4ЁБЦ4OCЯёl;ˆЃЫpkF;2цз сРЃ$ ‘9Щ‹4ф=4НZюhVл dМвБp €.Л ёСdДiЗHЖx‡хфmљ&+Ыює†8,ыuЛФє#MГsчlжEq„ƒѕŠї#ђDqфЛ>ЈG^y–&и.‡хkЌ{\BfДК-QУШђАAJБgУёƒoœ'І#Й ђГ4%„]с€*жУ/17Z!wkU;aEly]W jHƒЄIœЂ„џ ŠGЎZW-V2•ЌTe%TЂЋd№yБчсыШJи„‚Њ&зQЏЉЙѕЭ§§з›eŽх2ЊШВ,€а яiёД‰s—№ ъ4ЪKŒС№u:р(ЂŒ,ШСT„NВ4гМuЋАd Ќ$O0‘jёю‚0ž6Ћ*З@ЖАТsЗФƒН–Пч2Раьbs{ГLАUFхЇi&X-€?T“№гšдMр7ШВšƒkbих 5&‰M "иЗ4Х.ч4ѕЈvЋnr№ ЭjYзЋѕЎѓIZёкє"№Txу\%XОчfВЪhyгјD'žžS8тнŒ0№ІФ“ЖеM)&ЁaŒ.Вь$МzјJЊ*ш4yˆ<ЯгШP&xѕћЫ u* s№su‘К)сУЧ„Д0ЪrРRХЖё]d‰€н‚х6жdn>щvЇ"l'E†w“vц­лЫ`зIЩ4ЖŒƒХIsVy’ ЉјЙ"/rPђ0СЛ7АМЎѓœhт8 dU&Ѓ{9˜udуHXт‘2ыпGMЃšA[[В0<9>Q’І;Y hК‰MYЭ )–Ѕc…Щј‰GWcЂˆЛšч ЂЏQЌ‰ю##;E†Ё0†пдU^"џЛnЅЋІL ‘ЅXЩЋ– Їя:^œЃcYW) ъяКИ•ЭЈ‰4‰К>:2,C6p›oC9Щ гІ -дв:Чv—м%@Тэщ‡ыŽ№иЗˆ:ў,2Щkt6%€<Џ\—Љ+rГЮ€‘ƒš!Р—-ВфжЁЉJп偘Aюjв XIСƒ››Uу}к 2>ЋЅe:IQ` 3ќœ ;+Њ$Nc"ЕM]№nœ&№ I}AѕACаЅх‰яx)Xr`№toџp*) 1`еЛs†в}pжђ7ѕ0lWW„ХѕiwЖU3]пДœ‰щuІМdљq];№5 xъ(FЎуЭЬ ”УЕЏѕ_ОŸhAJМvŠЊ ЊЖ ъФнВ-b_хц‡я.8ЩЮыІZn7;ШзdЖђ}~zД;ќtЭŠZXЖuр м(ŽЃŸтšЬ(lL7]поЖž2јђљэ‹cМ”€a™ ™!*У-жЈеЦ2юф/O/DШ}ts Я9>|)1Ьа0Lн„х3эvz—]J,вУЏЈ6(\™:Кќ§ѕyЖ<К,Бј vДщбСЛ7WX(+šОяš Ю S , 5ЎE9Œ.2yzЬˆF ?УCJмч*Чcu№%‘ д m7ДD–ž/ЈiwТ jXжОТёŠ“7 Ні§ D'?%W“З7ЅЅO>эШm*Ю W‹ EŒ?Џз.›Ѓrћї‰­њ~Dь№и*~iћA`шH“gКБ+уЁ1УŽz AЪдŒгММŽ §„V и‹МYnё?7•ёСў—“…Ш‰Вс‹‰ ьЗ"Q@ісРѓвњЩгёсВЂ$ЎЅШуСˆ'кЁЉ`І ИŠБrѓЫlqвІ:7™KF IОіН:’nZ6П€Ъ i№хЫб9%№X'Bh@ЄюI˜Єˆ1RМЯРћЖ*1ŸŸ<йЇСђbмbМ7*x’X2|+ !<6K# Ћlњ^ŒСЉБйgBоЅўEdAвЅ&Xb.PшУ‹-ŠH§Ўtcb#Eb”]ХЫжћЄ|ЧPщ/OŸюS’bzaNмw‚ГƒV!^:ŽЙ:`/L14™чјЮ›}№еqыТŒ’t Bй4ЉH“d˜NToЗЙ. Пwz4о‡ZNCt0ќ–ъ"ЖР9FM‰|/єФCš1MЭіёЏ„ј˜І™Ї{Y„s‚ЁлМxz$GО~їТЂS”ЎB#§ iќ;Џр]ˆVЌЗЙ)і/ЏVŽy %И7№]!т, ЃRXŒ$YBvЋ?yњEp]ьŒЬkсŸ8ЭK _бmс@; l|ш(ачяп|ž‹jTЧрКXЩќCc„fЂ†ФmЈ“OїxY .Љ€иbšЎяB†„Yv‚g$уN!ƒqЯ8{њь”TєТCЧNР<+кђvЧлЫKь2‘xŽюПzљn(Ъ€@b‚c~АU˜иbћYНОн(zџюЭС`B1‚+ц=ХaЏ}?ЉwкGkъщ“ЇЇЊ&ЫxЦќ:ЙЗ ’jЙЊ#Я•Ж†ђUујщщлgЯ_Ÿ1‚т—MlЈŠ$ўh<+iVP‚ЇnUОїщѓQЇгЇDЛЯ†ч6иЃeћфќ_„ЧLHў+IrчеЫ Єк’С^тсeфЫ hSаMuьвn[ф)f~y№щѕЋяœЈzeƒщєїЬбВn'–,]П? Mб`.%DeЯ4Dе…-eЁСYчЛdxкфЪƒkJ•‘\Ќž мPZЏЗ­oкЖ)YЎЊЙ8ф(В„Хx:>Пžu?Нxq‚ФblIdi?ЩБ˜VU^щђxЄ”'ˆ"|,@Жа‚ž„†ШXb@\тщVЎeш­ ФјАMь’4P а ТПу€ЂЃа:фЁ jТzJчгЫпЎpG”ч1шиOuЪs“ФQъb ˆš&ШЊю†xЈЙgк;_юBœРкm<‡ќT‘EUю_ŠВ(+š ˜ЯХsjx I`BHчАT;ѓЩ<&œшРrЌфЊ‹Г—ЯпŸ@FbЉ‚pu"(†˜В2=Ÿс5š  Єн‘„ф>щј№.л‰\gЉ–aS:ў,b} Јрy/X)„1mi.Ђ š†—СN—рЖёВнxітљ“o&ŠсХtЃgгН>рSЧгEi|<yA6хKHваё#‚1/‡oЉФœ,t5ˆЪœЌЮ>ќ6гe,Б“tVLUUuC dа'У ВдЁSЩО5U•xfv№ќщѓзяЎСёe§шF/ц{CВS“ЅЫч‡ $цS5РТŽЅЁ$ЎaрХ;ШЌ(АхSSx†WЅюы7CYfАЌT’uE ‚>šƒzљ фЪv `.гїъѕЋw‡cИ.§јœ’щоTФћUц^|щR№"q[4 дfъщІ„о:фМВjч8B2#ЋќѕыNцhPXМчвvwРЊ‚эDЊbg…‡DЏ{Кp–EчнЛOo?_3 P–ђ№3оџbNЋXД2~џюѓёBр tƒ8" €зDOYVUЇn}UБшQтњo?C"/а4„AFJSZУёј=~‘ЛV\—8,ЇDžП‚˜*-H Ж§Љv}^ЦeO^Оxљ…ф!АXТ*;Ўƒ'Єh8’bБЌјЫЦ‘СZF™сћ§љ\’IБ+/#Э0Ш RУП@ьЈЮ\/Ћs›мпJ"Vi]П|њтеСLac„?з=eq#КožПxўi›ЬГ Є6№B"­c,ЯРв Z‹лt\ аtВџe>“4ŽЦoxси5МЋтЙ­ДЭќЄЎSфvЗY<Я?{ђьхЇ!+‚Ћќs ‹fцЯ_Мxўі‚т˜љА?ЇфлЁЋТE9T+KЬ$ГЌу9WЇg‡ЧSN—LЫ‡‚л OДЋ<Љš*2№=p№\ињЭ ]TМЙ›jЬќ№йС„’l Q”dг#Юœ˜ЯЗ žіуCˆ-пwќѕ"‹ V/†РGёXТЖ„uКšbDип„mЯ‚žЦ5ліЁПр-G"[­Z~hax' jМШlAЮc‘џ9Œ АЧ5‘О:›Ућ”ЮЮДц•5ф"hZQъшЈ’ЄFЅ'аЃїЯпї(F-ьА“U#РбF Kš[тЕofƒЙ)šiыђЯаa\ЊAцЖ9ŠDїЦ4H ЩFџh шk'& "ˆp@АŽS ЊTeщЮы&<#Ч‘&"С­.ФЪV›U›к јpTM%с1Ї Рт>\ВКIPRцЊт|8AЉЙХеoчœьfUлN\чсФ–ѕА*]žYН|іz*а9ж†AьёыeсA сЭaпq 7 `iєюsgЮƒуyЄ9RЦљ‡1–ХƒЬ%Fa>žр8еСёЋsСˆЫeSUЫe Лћщ$M“ 3ќ№схѓ!`ъЄ)\‹ЌlL'ЌЗыКp%‘9?šb•ЏЌ‚oя|И„ мРCРGZ3+zqZ”U“˜2Пѕ{§юебЛїC^ХRe;ƒЖjnTЎжиM_}К>ћ2e3oк ^ЭƒдЅ*ЊеfYЧš@]М?УyXf%Nр4АLEj[…7ТТїКu‰[ŒЛ—WзЧч3^‹Hйя§M@(Ј№ А Dš:}srн„чUэz‰ŽBU voHQb[B6;9јpIKЄжžŸ]ѕ8`tиЦ#лc7$tYV ^lggАзНы1+кYYЏАvЏ ƒtIк“Ы@bшѓq9cX-iёкЇЦжH3Yн`шКХ’qцърbЦcu5Н>э,ЧRea<Žзft [Јё&М^-бvŠ}+4hG‰-›З77тжXHл6Ѕ#2дљПНв4oXѕИнДyЦШРіЮ*1%~r~1І–žЧУ1(Д“68‰АзЃ-j—UYTЫu“:РОvЗHfJŽUБVЙ]a™гК]ц&Gб§пŽi–W26KЪЌhџVжм”Ё*БƒЮhО iŠ(#С>З›e[B^ё(ѓК(ќTšf5И‰вmœX‹НnиЋТS€nр/IKљrЙLРKгуГУHVTaЃЖn€ b™ўэзћлЭВЩИƒБœИЄШКŸЖлMSцidZ1Ž ЬаM2GЭЯ6Ћ Ш%М/сэуFУ[_ЖИ‹›еЊ %žeІН9ЫЉN„eЄGaY€nnяП}НЛY-[Мq#1G#goqБМЙ]тхoь<ИЮћ-ШlaЃг[%H…lTшс Ь‹M6Ј7лvy{^ЋЦƒЯЭ‡s†U У%,ќ\W8Mшіі+iлДdFЁaЙžыiгТћк”xЌЛіƒыМџпkЁ^Q€NТЧъ%иьІТы*Й‹-hˆ+lGУК›ЦЯ.F ДbЙQVЁ~м“ЊORЕz{OЌqнр ,ьcОЛЛџzл&,ЉќѓBSšю“ухДZmБG`W„хMX„J•†7їи,Е^Ўj[Фщ “ЭBŒsBьњНЙ#э 7ЄдіОПдОУчСяБrxS'Л2ы,qІъ^†žхЈЄѓ‡ ќ™л]}5ў+–A[—Ѕ-B–Р, ПxЇša ;;|sKdў ЛŠЕЭ(ўзЏП%ыїЏЗлUUY–x!єžЌ:IŒї%VфнюКbQ)ўј?ВгА_БУЄmKѓuv1Ѓ@vоFдЌoАgэ–Д`Гр§ЎИ™ШќэƒOAiъ2іьט‚ >Х:“Єh6[2гчvз•A”yїѓQ„пяЖЋК(s_“Ав|:gq6#Z)†l‡€_ЛН%*ёћзпџњэЏпPfxM$Z.!K7У{pŠ”xЛDWŒЕЛ.В}X{O6дуv]'A˜„ЖŽнЦ т šm+є7 ЙАЙЄˆѕўwи\љ?ўуЏпH < МЈ›u›ZюŒћGk Š™4Л^6Дћ]\У"_м?TPThдŽ6Бtpbрi–ц86‡ЂXб …ІŠвb…3ю2ЎoИЫXџw‹Mє-–ЖОё8SДИХЎъ+DёeЃZмwpKЌ„о–ŽвБ[9fддѓйt КХvнћпбп М“5>g~ЅaЋТжi$-щ8”ogџ7;сбuїЕ“јЕ#Ф AьpУщE“ЋбэGSŠwKќvђU щЗЏ(ён=1@јŒ;#iш˜€йЏ?ŽЬ{cAжЄ… +QЇёgТО*о“ ДЄлRч№vC S˜Щeo:MІрАЗкЕНоїі Нќ7(шдЭІЩтРCьъЅe`Э=Ч-ЛлеяDfxщїлкU%ž ЎNOКЃооB™ьў#у%ШNяšчбЏУo6‘ŠзD‚„Љ€ЂiЊќЈЃ‘YQ 'нЋЮ€ЕpIмЦ6тn‰nНлРЖ‰№f§ЃЯчнЫН1ъьxAЇЄЉр<ФФx;—sПžТЃAЏ Xцсэe_иЂЈш~{KЖщїПХŒ. є6зEl ЇGgЇ—W—Ч{šSБЇ5CDн­FŸƒ}>ќІ›мтЧНо`2Nч7ўёџZ8D яoјyФуbјF<4С 7Й)‚ГcЉqЗ7\hс%mзš š1&х$&Ф5Р§rsџэЎ Tzд9Пш Ч?EfNЧK­Y<ц—qГНлХ AшЪ‘XzБ˜Ѓ›M'рtXNp Ч‰.™№…™ТЭІА ын§MЈмДп›Ь(ъgїJ8С^й‚яј§~г’ю9‚%ОЈлv8УоGššœюэЈƒџ†гЋ—dd<о ШЬњДт–7_o›РygЬќ j+Y3ƒKг ГСu‚‰е§‘†TжMfЫьb‰eш}9ЭFзgЧЇн ­•Є№щ*дEъђЈKЩ ѕнЖJœ]N(Tнє˜%@†‹SsА“]јЩФq^#FжtФv\g)YЛА<†Ж|Š"Iб $Uџ:<ЧXО'рьЌЋТ/Œ˜K‘cTЬФў5 №?­N”У:dEўO­„#Fј—крП[“iщ~­_ызњЕ~­_ызњЕ~­_ызњЕ~­_ызњЕ~­_ызњЕ~­_ызњЕ~­_ызњЕў›EёЂЌщ 2‰шђџ АIЂ$єЃЂLЃРќзЈшј‡Ы ‹ВЈЋЌШЂМй,qМњпOЌх,лњо™С?qЭqNhˆsќ7Ў(їџЎЂQNВ4KВи§i•АпБЦУНžЅ)ЫŠЌJЊŸеЭzklЕфќ1лРЬ л2 џ)UbџїšHЖХцF{І*ŠЯkV˜зmцшђloІиЖТ"И=)@ІкWf3ўЇ—<ўЃ%ЛaфЉœьFY Е,ЫF˜Uuт{Ъ„хйљdдСъLV0ќД#Х‡гНРљgi l!я†iлЊюfEšШ+ Щ:ŽŒc1›ŒЦУўеоžъ…X­ŒуtU3УЌŒ}чŸ!ђXwеЩTuтКIUѕВ;ыwЏ.ЮNіLбKШgVЉ%.x;mзMт/{СŸZCIЗ<ЧIђР@LЭЪ7•Џ›I‰ƒгcGž^MXYž\wЏ./N6ltфљи-Ox9pfёІ-ѓ$rџЉЪBQsт$Œђ"4eнђ=7]ЗE•8ыЛ К?“4г4ЅЮчNПs~~>ѓ’2mУіSфЯЈЪК%3ъ—Ыe>^Sэ?\Ш›œеeUІžЪЋnR Л/ŠRV ­2МхћЁякЬёIчќшИ'ћi]ИП\#sФL$FA.0ШŸдсђŸЏšс]AMрpТ RЛЌšЂnЊЂ*л№у@“g‰—'ŸОLН0Ћ‘рAЗуЙNзЫ2ХљЩa’•m“њ0„фП•й0E^ЗdвIѓ‹хЊЉъІЎ› чfЇ1ŽЭЦ­ьйчуЋnŸ ЂBЄІЛ!NŽТy­Оaр”MЫOђК‰НŸhhЭt І7–p6ЕЁˆ’тІэВ)ŠVъКq–Х‘'3‚nhЃЯ‡cХPѕ ­šиRэ9~кІЪ\Y”e•œЖzYzџ&|Ь5Qtл1„ыГ™Hъ]%YuвfYF’z&†jGiкь`Т ГУwй |?ЎЊ"24dйiР_†$ЉX“ьdUŠнюЯѕ|"lДЅБЃюLR™чн A/c Вl3PH’'ŽТpŠ8ќ№[пЂфGЈњљr™{š@ЭгKВ0ШŸH“{жOХOcеА!ZŒ"Žљ‡3МЌ]Uю|,{i›лœp)\…+˜ZA\дE8:/€ыXцǘє9ˆ§›ЖХйЫТ‘єSCу[s$~:dqbяКNUЋeЎѕGŠU…Чг’!ћ‰iЪХ•ь…)lГ V'Љ!ИŽ6Б х№П7›еfSХОeˆЃŸ)ѓољЭEnвgL?k‘Џ lСE‡ќ"D:Б:›Ы&’o†ŽХ\sN€ЌE (зOJlh^р˜EС. kKЊФЮFц'tŒџm qЅ$БуЙцХхџЩjФпHЫд^tЧœ$kЎoыг)ŽлwOч%'/›%і3/‹$pdЮШ‘}]и"УpЌЌы6&яяз‚‘x[df’щ‘HБZ/ыPOе +Г*TŠЂч3о\eРИAьАЂLЭ•А\"=Rc:–ЉˆV‰1fU8Њ„ 0 gжЯ9wц<іу ѓ)Ч*І“М,fИ0ТЊЬЫ<ѓTEag‚эXт@„ДFЅx…cpш"’§„žaЈša‚o‡оlкФwБћ!NУGdєїkDqŽј,dш"Чk^НЁлд\ŒX3№Q”U:†ЬШЖЅЭњЊˆ[Ж<з‰ЊІѕ#–)47k ЗЌNЇ,‹дЗB\ь8dЌ іЦЗ nТšђV‰9sV"#ХV i щЎ4шk.ЈЏтEiйЌVU РkЂYнM*Ђ†і@tM }9жЃЋѕЩй:Лž'qтй*E›рЂС‰љ вЂ“з€њРmdЉo0‚iа]Х \Mvѓfй6mSј–eщ’Œё&Џзл%Rг­З77л›5Šлњ#ЯC˜А8іGСЮqB’{†";…sзXєчŠ_5 Я2›а3YAGчЌxšhХ%Ё&BкЪ"’SШPКY!5њіСVC`|\™ В$ЂsТач~\љA0ОTf0 ѕЈЪ}KœЭ Ю[&Eѓѓѓ/Gнw5VwќР1M+[.СЃ;;щ iХ_џAіМ^o–uNѕэGЄјЗ54]‘xQ'LlHAъXЗ€ЅХ ˆXyhќфъrТˆ }=\єіїЊeы3J%4ЖJаьN\G]вFДОЙСIы›5сЪ…_`МХР |sй.wќЯ+§yГЮ,Ё7 Џ*ЖощЧƒюс—ысесёQ_A—б‚W-7]mk,Їбƒ1›эЭ-’Уc–‚ГНEYсqd/'ыЎgщŠсg…eЛnВіВгPч €ЇmсpГ91ўшљЛѓы‹‹ыЋ.­л–xuвcM7Hые2qprЖР0р-Б‰ќоЖt~С`џЛШ Oц=IFвдРѓƒ;fз+œ“З-ъ›Э2sЕyUЂ- 8Ш^М~§лёew0vЧ‚ІВУ‡XœEъ<%bl2ƒхэн вЪЎ3[šЯ%tуQЧІг6dрУЃ dТБлхЖ™Ѕы#JГГВ@ЪAˆxЊp§ўгйе`Ƙt{3–/Є„МfНŒ nМPqˆMКСщyШлj<#Y^ˆlˆЃСЃщЧЇ љ8\dЕmњ€ЃZ-SGхЇ'‡3бHŠМ€<Ы7Tq™сХљљd~uxr=ш\‹Л—EЦYƒ“У8УЦi&л;2Ytл@F/›^^КšШа<ћXЧ }IУYН6дШ}в"СъР„-3§ы1%Hvб0№pжјтђЫсее—w—н/п]œŽ ;H5‹№duтh<ИРИ\саY’WЙЊ лQ›"MqŠ">–д'1kЄV8gЕЋM›:2=М‚МЫАГІПЅ);Сq/—ЧП=§Иџтљыw_ŽЇ’YŒЪNч’ХрЗUлIjКƒcNЗ…-@jŸ­b0G ЧQ …і4Ž/†%ЛfФаЦYо,,–8шXтij1ѕOі_?yђ'ш?Лб_ ц˜1‚Ј˜Ž­‚CZo ьтіn[8Ђs(Э їЪуluoиНИ,hNxA‹V8F о—рЋ&xЭВђ–™Э)†]tпНјЫ_žМ~ћў§›'Я>wІœ,3МOUfHыи!ю3ЂhBгАТЖѕ$РfxŽg ч ЄЂоw[дќЧm"Ћє*а…q!jQй4Љ2ŸЬf,ЮіЛјєђЩ“7Яѓigџу‡У>Џсp9ЧеYŠхЙщTд-—5с 1Š‹UэШ"Яв4MбєŸ?щЭA–šŽІ2§XAEьай:жХщ`.*AеV‘0Ї9Pvк9x§єЭсF2#n2э]RŠщњaVx"-ЈІЦsxє˜ 8c$чzЋкSE–apЌ3§ч­q‡Ш3ѓ9Э ’Ž йрмfШў7Љ!ЮcgPW™ExOЊwњљн‡Dч№Д zxt<M?.š6uM$YR˜-*n‹уС=2бз’зА 1rј§Yoнi9žЅцHkziН&л› /вуб‚SТOњЎ­‰‹‹Уг“г!9HГTйсХ%ФЋЂЬ#зКЧCС*nяяvГhAг–ЫТ7 7М;іОЗ‰!ді Š•t7ЧБш„й}НŽTHpч +ћ5`хќњНюеѓН‘dЊ{f-[’M1рттчи}Uз УPј‘ Вy‡–3 qОeœєЅ! ћœЌZQгІ…LВIљъ№|0<пЙoz‚,;Cyp|F^Юv\/ŸS(6БcЩЂNni'n– ŽqифэеМЭCз6T™~аY“‡йТЧ“ ‡Мk9Ё$щіŽМЯ"] С\Щ•XYшuz:кџєцЭЩхŸяоnэ|њѓэ‡žк?'ЕФЗГ9ЩмNЪРеeеаƒаEйЬи`ілХ$gу‘фqјcB‹ЄY“ZИбXвУ#wзВ ѕZШЕЖž<шQ†nЅ“:0dмеИ{А§ч‡7o>ьœѕњЛ;#ўтфъj€aBєUЌЪдЗuнЬV˜vПœ” L`S“mŠ) Š@Ўъ‡"ŒЄЎE6išcH˜f ›COлgŘ/GpЊfе,ГфбhЬћW'ћ;[л'7ѓQ=˜жп>vB '™зЋAЅК–iХsŒЯУ|oЬ‡DФšf>Ѕ“ ?ŒўT=60%ё MтЦCNЂРd˜3ЮŒc>- S Я­9IEЈZьt‡cŽпьяœ $ќ-ˆС4CюuŽЖŽ/o;,ш§LЫ$Š’8pПXА‰ь›%ЭNš˜ЄžЩЬёБсќ‡a:A^A7‘'iХђВЩ'+ДчГщ4бљБЌA1)\“?ПIВ$ііNDЦa5VкЦЖgqƒг­эНЃЁсDi^NšдwНуЫеSЁ"Ьj^‡єZYHрр­ОЁ‚1›Na„єEАбЭ+с‡Ќi;M&Тсœ,(кмжИ+BЏ:)і№ZЅбйP6єaчќrЌ™6Зїaыhd:ШВш“s]щEd”aЦ2И})C.}C—EŒa1SVћўЈhАЁѓѓ6ѓ“Э”DХЩ—€РДЁшЦ“9^ХŒј2В4Б;$gЃK7фŸEљфeGžюяžœœ№њxpБНХзд л%вž-Іѓљ яŽдPx(ŒЉ8™cѓ№ћ,dd‘0Г &CgQшСuRJеnзSЂ8ŸІФIф ƒcdГЖ‚‹вьlљ"­)Б]Ьb]шЛыn™†2&ѓvitБs% Gвй9Ž 4}|ибm~їшьшЌ7рe;kы„\‡&€ † щb>[‘пиLR3XС5 mаDУЕОЏ"DЄI6МЦєcВ7в7.БpФIYЫbЙœеŽШ HР ^‘РЖ8wњЉ?>нлъJй(Ђ˜Vџ’з„н§ЉY$l6г&K“%3нцrŽрŽYцCс ; љЎУ_ђ_šхЄ3 ЊНћLVХwf|Ÿ1j~к„IfIмАпыœьіШ u7-bSф._mQhзUхьУіЮўЧWoЗ.D•Пйz~LHQ“Й(ХБ‘І2 ›ЉšШ4СуKо<Ю20ІЬ&el[п:K3Ѓ<Дй8kŠnй’Р=БгOИн,fгвAЄззc ДЏIwљњуˆv??<љttqКППѓўгщHНyѓл.ЇQ„VфЎгeŠєaк)фvЙdгќIMн4М„ХУќл)%tУЋZВ' “Д_ВvAпђ–ХТY4AIe”rnF=Еƒˆё‘§Ућ/iЃSšсыž…bфКM&ЮЫ*#їФuї^={ўюгіжЋЇOџxњњн›oЮ0CX•Џ";"sЭ\е4)rбзк>ё#"ЎWЅ­ŽЮ†”"\ ћa|вГ‰Бн„}&ѕqВ“`ш-jА,пІ e™„4 4a]’МА –%EY—Ў€%HфEю[“—mлє C oЧо^1‚‡ѓT ,цЅщEA”8ч џиф№TЪ}7gО~љњDѓУаг;{ВуйЪхћЗG7Ѓё`@йw]зМFp…BЄщMV”л/РкрЎЇŒЬнd=ь7УofФP<кРY=ПeœG“"/&l^>;тФaсЂ0ьИh)щ—FЊ…ЄуЮсЮЮсХ Н#' яё4дб^В/_Пќѓфќ`чшМ/jŒЃ@ЅЇ ШПE†GzaYщЂ 8~˜Є‘Cy"јЛ)OќжГjеѓвvuџѕЏЏ_oЇeфиN2TНdїž™iКбкЬ Ы:OC“?љѓѕЛГСХŸЏо\бKH"Ÿ№™C(3IRcџхЧЃ§Џ?ю 47Љкi–P ™цIЈК„з8j—(ѕEipъ L”ъ”,›п˜qЉž›Џ)жfR6Rю–OАгRвѕ,0(ёHЩk  Й)#Kюoэv{лgj“І=2Rg”ЄY2ўєчёХо‡нK—jКFtЗ*PJщЯiЇ<5лс:ИŠШрЩяЈGA…§­<’ы•›Я”ЎЌк TЊЊсVи‘ЗŒУŠОћ”Œбд(0Ѓp{ZІIЈ]1Щ‚`I€тŒрЊТ$сшЂЫq§”E^Žaщq8(ЬЧО^уjЗœˆ~вdŠT†PгCТHy/ГЄЈЋ"ЯhдIРШр9млcЫ ёпI №OввgЅI žEЦEˆ(ЏnЭP—•o‚|]Ц+›ЅИљ­•Г†ЌўњВnС”LIщˆL8ђ§š%HхVlУ/б—eU$qFжšЃј&ТЮ#ˆљмЋ=+HR2ъ4Ы@›JЈ­.RB{EгЂКp …љCЦƒyPLHАжЃјFSљю Шo”љ‰тј‹/$4њ@AUЮЇtj іЦIKЖšЎЃЫ„ЕY"ЋЃаЛdyerа%8“Šь–v!l7Явдм;rRrNrЧQœХhGd=G$yS7Ь0˜mгљlŽР#!EЊG’Ѕ}ЯХ­k% `y‹ъwvЦIш:˜"Œу]Ў6ѓЊЅ€О˜Д(! /‹ з$%Ѕ’”C’д;:ѓвЌ(ЋЅЦЄщЄ ѕЮfsЪnq ƒmЬМнœ26ф†+0утnuMFRЁWЦВО‡ДСA•ёэr†ыjЫаpm:Qђгš^ђdF9иХq‘Ђ\’ЄEut^‚?—ЄЮу48Н`Bг‡ЊЊ‚)лЩЪž/йьЂЪZT™жєTe‹„’Џщ{NЊ Я‰†Ыя0ЧіыхВ DRpaКN6EЉ&%Є^XДЫE$5Y §јйG+h$"OB‹є\IјgV’Б584ШБЩšIлЌrkYј^…я:&4BYЭ‚§ *OЩufЬњ;Jѕt ф‹6 нЇˆch™`']xКЂš~о.І ŽЫАё'ЄПšхь3њя,‹єУcжђIЋШ ЃРЭ4ЭlZ7‹e{~Гœ–Ё) хОf*АtВч0 cє§}ѓљуPЙ{љ4Е4Опэ —АFБтЌ (;qXдЮѓєЎїЖ„Hф†'mџPAш4рЗYУїр“š2ЏR?JЇы–<%E%BАГy‹ЂЭЮщ•`ЄS\ъSЬн,Щ<(ф—Йoiпг”axiюjтХ)›`CЕМП[MЪРдјыОЈњ jK=?#qб}в‹Ч‘!,Ё /щt_М‡є шЉыМl Cф ‹fBћЌnШЇ—ф~B•ПйџЉ/™љ @jЕСmФІJО'ЋЅЅИadыƒ§ƒŽ„Сџбь–рSь[Кt}аe7NлЦw옺F^яg6mKџGz'щ"уј_ŸwœИxјџ’DХЁNЧ_—Д?SЯ‹ЇЫ2q%юz{ћ§‘Јљ59 b+к&mс›ЦwнЙ РЫв;ћ'рЁWЌ6Г”š.ппЂEe€ч‰$jp­H?ЄС"у ХVЉЏќљ/П)nŠˆ_ьфЙ‚НуW@лYКВpЕsєю]_1“ЩbЦъU(Љ#w”yжwм^атtЫ2еыЃ‹БNIs8ЁdYЛъђЃKz ћNЄH\cВзmњЦ22кxeцЫ[џђлЁd'%[ŽЫkиSšзuVїЊWЛ‡ляЯе)h[УѕmP™б$ЄЗя#з ЪŽЮOЏ9вД_ЌoЇсреынэ#Y”ЩxќЕ4A\OjŠр ;bb‘-д№гкіПќ~Ј0{lRі”&MM€ќœыzYтљ–"ЮOЯŽGЊЕС@pПЂпкиЖОЯІIзќЈsУс€РЫцw›&w>М}ёъuŠh п‡аSшИnбј‰C\јМЊˆУ@љєЏЈIžС*|”ьvOЉ кЖ›ђЖЩЉіњЃюYOвœœЕXж3hšЬУў~~и‘b:.mЖzqwЗn<§ђглчЏ/%м^;”ў'nydкˆ‘’Аl&SYD&хџѕї]б!ПxGР ‰€ @uКžхђ ЄфЂpC2тv>)ЂИ уnЊдХ ˆя\К†чfСъjЯnНyёсF”ЦIFš=CŠuU…ћ†)sze:†:~џлoŸЦЊš–фЭq%бV„Ÿr„›Ф#IљLшЪ…сu_B‚дDЖхRпў~ЖšЉ3Љf(УЃјнxŽАѕтхўPRt+ˆ(˜“ P6R’M§RЕ,@Я&uEˆХTЧoўј}kЌщA™aИEЁ(А›‘чћhДDUНЪJ;Q1ѓ9šŒ l(ЇўЦу‘чЂ–цvC h6Ћ|‹џѓљыNRL——nLа™’’ДnЫУеd“YшъъшеяП}ЉŠOЁўG h,щ ТQD{)Цuб"ˆнГЁЊХгIЈ Веe`§яЙсДšЦаЊ<{МѕќЭ9ыЂ8=›ˆч&‘’A$ …qštMpЧQЕ>iњ§@­г>аRNa1GИЏЪДШCкХŽчZQф‡œuYщmŸIŠлLƒч4'Ъѓ[Oў§bь^UћаxUyVыйы %кфь(ЛЖq])C€xфиpEбdБoъ=њmO•)Ol˜‡)dРЊUЁуQвщ8IХЁki’|ѓю§ЕЄЇГЦUЦЂс„(Uј~Ёd§%ќКЪk№ч‹зЇЋG"пЖН0Œ}?tŠxб$zЭ‚uxмћ?ўx7t,?J*цПAQ™cњDš–Б…"У2=њдРГ5ВъЫ7ЏvЧŠпЮb“GБЧb[ŽхечшѓЬ6‡л/ŸюŒ™МG˜&–щєGС+ЇW, Ј™вцГvўјcK&CJ3DBP n„‚O“{ЁЇѕ$гŽ(evtU’•со›wћВ•OK_— 7ь? ѓDjфщ—›е4ЖŒ›Џўxq&‡RМЂ№лёC˜wœБЙ”ЮR’˜їЫ|/Ўт“?ўиw22YЪhѓ( mKi}B†я[–“‘—0PН2<}џєХЛ—…ƒЊuсЧz8›Xƒ3ЭEšњхЛз/žўйщ xЩЋ'yHіб&ђ=?Эг,FKxnкдŒ М|іќ2 ,ЭІј’Х;@e)y…[Ѓ(ЙWRl”EŽŸя||љђе‰Є™i;+qјЇЋ?ЦЯЅЃЧ`‚tЙ 'vќvы№l0Q*узSмKzžо2/Ц‘dТщˆt-Ы ЅуC!ай№HйєJ’”пЂm‹4 \нp%@xЋ№Ѕq8М8э]zЖ5R57mІ5;%њБyMMЊа4Ф§нŽ’„В*ЋVLШП$—eСeQ˜3б€+.Эš–r€ŒŒtO:ѕiЯВCМљЂ@Kƒcxx27­›Т“GН?сеы'Ђa:q3irzЈœVв—MJ[в<ё ­и“ѕаХ,љo‚=qЙdvm?ƒИ0щЌšž“>ё ;P@ЙC\Ш-кєm~R<єММЎ2OPT.ћЁxђтэ•LRгі/cJwLш']бАШv}ЫаЛgЊП@"%єги01ђЎяЛИ@Сщ(I^Я€ ” К†aК>Gph–1С;’9ЂЏ‰C?oЪи3TME“Ѕ&їп>ћxЦыєйЦЯ…“_vУаЎ(*ІMŽŽоuЦъ&шЧz}Шb2№ЮОВЩ]–У8=0 EQL"nъ1yХ#Tчи ”ѕФAVєЊ:щ‹:ož=ЕO?б!iшc~†ˆJ(RУйСXТ#GFфМrВ†м6Ќж!ФNЩ0вз@Sp%}кR,U$‹nтЂ$DB›ЫVЫѓиŽ#Ъ{Ы4„<‡Ж,ЗћќйГ?Ш…ш&%кп™›&АŽ|]њєќp HŒ,з‡ф„{\ ЂV ЧГКеГE“zфxUУшП{?6A%P5Y’m‘Ь†ЄЙY\/Ъ)ѕIЫ”|=kЉ’xѕсХГЇO_žJ:%{Ѓ‡‹{‚Т\“„О{Л{и•HЫAЯŠ8.sвJіHпН П]LЯ4dzPхъЭ‡Ь ФTУУ}— Љ5ЩtаЏk'uю‡e{žIhал‘NоО|§ђХ‡Ž‚ }ѕЧЙšGONћЋЧ={§qыS_‘Uƒ” Z~RdqQSЊ‡SwМwЫВ‚vЫzUMКzѕБЯЉ2/Hєr(˜И˜H@яƒvˆы˜nN yваžuz`jљьѕг7япь 5к˜З/QРЕњ№угч/vmЧНr“^oœMrR4ю-0yZAнЦІN@Pв4Ёѓnk0Vд’)šŸЦž…3M|e,e•RZTF6к%Lкш’rѕъїo 4цZќн)6Ђ$іh<пс$‚62Я‹‚тх%€Ш~а2ЊЌ­Иˆm\nЋЂэˆ7~ ƒdQ ”FЖiБЧsX"о–iVЕ…ЋˆВЊ@HYНxўлгЏЖЎщ)хG$цэ kдѓ‚тG ‹’иЊ“іŠдCћ•ІˆО'v? †šKІ"ЋhƒЪC|Нэ:aГlcS‹оAџr{Oњьљы§Юј‘Ї[vКчЧдИ‡SžЄ(Y€mV–{dГd?В{тpя]w${&йДЊRК“чƒаЃƒЙQщ|9Ё`M†нf‰їЭ5пЙКзgляпэE8>DЦЂ™5!#o'5 9>2UЖKOnП8 .8‰Ќм№В†09)›єЬNПQ‹ƒњ“њOо:B§HџlыЭ y1JoI<УЫ'Гв5Бџэ ЉэazRYќруѓу!oХ–„*ЪQf“Р“ЉCˆuуŠ"Т‡у?k ЇaыЋBgя\‚юШIQТсцгiFrиNдLcЧ6t\zeЂ№зožюy=M4‰ѕ}Ѕ3Jи[qВ9Ѕј-yt“P I”GšїцЩЇ­Cо:ѓ(эœhчу“ЄaOёЋYš–е‹вAЂ‡qЪж“ј“ч/Ž%IM*ѓМL‹08Р=ЩM0ЧЌЁŽˆ•Д>ВЬтўЫзЛ=•l8HВибХn—g^т.Яy$uˆQІ”‘Yl&†SLr]э>qъъrŒ6д9йQZbи&йбrɘԺжЦ”Ји” †бyѓњ§ўѕЃёЅ+УwoN9|w?ЋъдбјЄІTqt|8дТzВРmФЄm@ќ’t/ нї/ўиQe%LЬz3 ЧK0)#(W‹љ,ГTю†гX§ŒCzёђнб@ЁgSGьсЧ­ОЈGaкD†2КъށuїЗЛВ[`Ђвf9!G.вГхЂЖсь§ол^4ђщМ ьЦDn_Эb5З”qwЏ$њЈТfп}{€>:t~>ŠаOай€.јŠyхJџФїНѓНƒžьл[mюoЇ˜hŠ^§ѕj–kwјёњфB’Ьm"š(_ХЌЭfA.ЧVЙ‹ЎŒёО:э\ёќУоP#†сБь[Ѕ MZЬкљb–вfњны‹гуKNѕЫšѕнЮ#ЁP 0‹$~Аѓbї| )^3G§Pц€л/їwї›йtZиšpнeэtКІ№Ÿіњвб,"Рј82ѓЦ7ИA6™cО•ЉŠ|џтј№фВ'jQSOQАВž”Хd…О’UыˆBянџиъqhЦAŸгz^E„`уvƒfŸ9Ѕ]ž&o8ЁHьŸяŸmХЄЭ"пqg“ЮŠ}”й/ГТ#Љ‡—‡‡gшЯ&г% RoMЛКeѕdЅСsнO ЁиQƒi З›eMЄ&љяюб7йвF}^ЎwvrХkІKЮГˆ§РsХЊЦЦэљ1к‚зЫiJVш_^“Ьšп Ѓ0sв8Кє–‹TсЦO:h );GЏфfB9Š—ю>О›ЗѓкCаˆчЦУ^o(jVX-g”CКў#йхд”›јaRLYЧС„т‚‚ю0J( Ѓ цŽЬЃ^ Иs=Ÿy–ƒУ!/Y^T-P‰s{З(‚tFцsџхЫ§jƘцќб'Kш8q“vЕЊŠ˜e?žДќПk@Ю%Ђ~\Nа+НYЕ9FІЈš‰™ІKжпЕY5“л{втz1qD~и=>sŠФеbЉ)їw‹,™ЂДэѓ—Яш˜і&’эХеl}7O\‰Гх<ТИdСВ)qЅP ' …іђ\хe_wЌysКМћђљю–vЊ%p§›ѓkžSь ЉІшbR7Sмо“д(І\жq𞘡VжГѕээВ 0*œ`юcѕ‡Љk†MюƒѕЩ­7+4Q4“йrХdО‡г k§|GT"зя]н№њ‘и( хњ}џхыgд@Ўч€дS4аа;КЄОI! jпмАѕЯWŸpС7UбИœЏXyлuAЌœ‰$Fёян-ŒsСрfЁ§мЋл{іdЗшЛџђљЫ—‡’}x|1§ћљЖЭCк9.эCя1Ц§щ№яu'Ъ'фШъ’БnсТ 6ЩD"“^-ЙЮ‡усˆd“Жo\Д3є~с“юй’дŸбt‡=љхЫ—Џ_Оўѕљž\fƒЖ0 іBkДЙуаu ц•Lш rw{ЧA™ЊЁЋЯ_юбм5/ tQFœР˜%МЈœ.жZўŒпОўѕ•„†шєч__П~§Ÿє/d=ГeC‰я=†ЃжuЏhJмђTpІf&6kr€“&Ÿ@‹Ќc>Ѓ–mЪњє”ЌЕœ  чz0щЏаяWHѕз__йS`?Ьа‚ы<Ц\ŠV ŠгPJG{цўіСюўЁf4SкZ›В*]•DžŽ2mЪjу ыj0iШќѕП§OXЧ8њ/єхшœ&юЃŒњ“)э(X/ањЁ9€Єў|ЫzAБ§Ш* hњsГЈra‰oQШфДqяM)ЅžВI702`&юWВ“ЏLХЌšќ–™жrНhќяЌ—ј'kЄ›(yƒ’щэвžЙCE.y{ь#в<Щ|Зj#‡5yІ&ёУ›ёCyno$˜хњАыОрзgдgІezUЄфХн“ЫЪћж‚њџЭт гo6›;˜-L“Y,”ЙЖ™ЦfБЅa‚O Gсз}Ž'иныx5!а‡ƒ9?ќЦЌšО*ЕЩ,цгКҘѓд1)ЫU Џюayт‡н1§’Ђ?Г}єљn•›ŠЅуtCW…бхѕ`ияu#NdЕ`wOї_™‰|Й‡q,g“йзаu;%ќёXI€lyѕb6ЉЭ$%ІЭ ў1wpЯ‰};ѓЃ$Uy8ЯуžœwoК7чъ0ё…љ:8ŒПД§љ? ” U(:ФUЫc а–mЗЌcхЃ›Ъmа>A†СŒƒ~23эћлж’Йс`$`šЈЁˆу''WноeнлйbƒH_EуOZЗ‹2F[ЊTKїQКe>жAžd9‡ntЬhFqЫ‚2ОgьўЖ2ЄqяњВ;ЄАbШТшЩIЗ?ФБŸŸтВzЭ=йХ—ПОАwєљѓ<Вq†ЈN”Sќ@‘Ч?Y#еу”e ˜zPУ:Yfћ№!п/rtУыгуГЫ^ФС“‹С˜cэаїО\BhЖ юяія}kkh@ФХQ€вL|,™q(І‹УЮUЇгч$=&ДOюѓX&<{лїѓ@!?з9ллўtдq\чIgФK”“ф5рр’В…QБ‡™Ђok[•5‹#œЄкє*m.сП­k6њJw’аідWйŽ"_8u("ѓ8кўИ{vгя>щёИ$JiŸЕЌs ъŽсНх|E_w?ѕUn,Ђ‡-хќ7w—}ѓъГЙL˜|Ш нSђМ_Щун?€ЅЉЇŒ;——ч‡Л;GнюѕС“БЄию ъa*ƒ„˜ђU†^дЌП|]ч–8Мщ\wКнGУњя–j™^˜Ао9LtXT„ŸfЗ@€ЧЬŠj0ЇCян§Ђ ,(^ŒЇѓ:ЅДмћбъŽџЭRQIMK•ЋkмХўA_V,RyЙnjr ЪВEцO_<щ0эwЮЯ’ц•ЋЛ‡tђvš…Ўm ЮŠсf“%ŠщЃРyŒУŽџе)У тЂ™у rxВwDo8cСчл ƒеЫ*а)ЬƒjBЙzѕd(Š"? ЭЭgЙ-нт”б•ЏЏ8’ ”ђеYhыt‰я_šэxI=MMexИs6$єж UDП0CиwKœ{њiЮ}|2Ф‰TFѓїNюђvVФЁgЃѓŽЄ[aRЖ ЧАПЇ9фћЅ‹в3И'Ÿ.yŒZlц-ЪUŠvA(ŠrІE‹n…Фwѕ“'=BЉl†#с˜‰эт< ,SО<щЫ†eUаŸHЏд7l7Ž-Ѕѓф˜Ѓ|7Й™г|ЫMлњp7ѓ=OЁуt(yP4TЌш~5Ч1№'4їJR0cppЦЉy’Їє ?“бe„ы(рt Гš–rgEbјСŽ›въeaDBƒiNХНЂfЇ ŽknFЯb.A“К–rqpCЊFeg?Qfд4Y–Щ=yвUL'ЬЯ”‡нE4^БгЩšіф*ЕСлРЊ[)їBЁVв`X2W _ACЯДŽ]stјdЄšJЄ~ХШ?'Г=#@4лщЭбщ9aVUЗї›м$ЭдPП(*ѓf јy;€#щI>вp‰я]МТ‹$сtVњІЕ 8 ]“ЭXeёнAаЛ<>юjЖg9^жL›" L•^LџEcR˜„Њш$ѕМЪ^9IЏeЈlДA хъцІ{yzx.aŽhYV“i`T“_Ь—UђэспЛЬДЌ<Зтf9Я+Њ1ЩewЊ0ф­(ЭbёфЊ{}~rpэ`њ_;™Ь/{=iW“ЬћщЕМџq)Ж)™y[Чњ@Дƒr6M,''s =Я!wrxt%9Ў~sxq}qzДл‰Šjк‚щbЕШЁ{#Эjй$ОЅџз™ШXwќРБѓiЛŠ йAНЌ#/mъ 5ъіјВгЛЊІ|Йszuz|АгЯЪvк4u;[ЌgЉkЙQ6[нЎ&ežњпУnёwgиq]Фa1ЉBкyŽчх‹Y[в.7NЈЧ†cšЉїЗїЏNјДlйРьzК^N@„@aŒЛѓi•?ЉWф?Ў‘юйlО*а+ЬЫ)F+MІh8*|IДС9уЛЖrАuАћiџLЭJњЫ<ђ# ђKR7и™иŒBŠў pЪnG ˜ф–Ыih’юQфІа§05}ZF6|G•Ї‘чєЗ?эю^˜i1™ЂRн+g`.ћ › 1Г"ј‰џXšФЖцХy NKSЭИEѕЌEЩџ„pEЪЪгЏ?p ?Ж’j:ЩBзKР^ЕЦˆЃ(ƒЄlР^5KУŸлЦПdЁ6ш^Ѓ GWŒЈ^.& ˜5 ИЎ)~Вюљжxя@ #зpв†ќ‹яњ%уŸ™T‰…{rэx„ex?WfЮєвЬгo:ВЁТпЩQЗM3ЭъМ"Eт№зCUчпv‚и~TNgmьИщtЕЄнZ„ŽaX„R*4VnMшџ\рg OФб…ЋK0D3RQ;%i“8Ѓи]ћІ_4uюkœbъЃЏF`РA]5‰SЬ–3BƒŠlљA”?нЇЭ"їЇЂlбі0И]ЧœlXІЂ™†E&=ЭL=,›yу“Б`а;йЏчYG… ЪлйdRЅž.лхr5Я ~8вCТNш$П]OЋ8p•Ÿ4ђaЉЖzЖЉ МьD‘gй–•‹eу ’Ÿ7Г&3JR0ЕžuvjPњ5Ѕ”Р'3вƒ–\]:АŒ†1ЅнЁeЮЕЄŸиeK‹7,л6u‚wКŸPR˜F)†Є'„ё'‰мщЩ†nЙIњъ•$EYNJGЁspЧБіУ УшДЭz’јІЦп\^§ЬBхЎТ†<*уБD нmСъ=INыйД-Сѕ@x'‰=nшФYцz1… cОзdСє%ezdS$єЊ -‘ ЗHЮфч…ѓБŠйFВТїЧO[А‘VОШЩё%ЕЭЎoь8Дњb˜фЏY*ЇF5ШžІЄfL€&=СЬБU9КfX(oЗNЋNїr$Ћ›P+†Šц‹($g™Ю fv‹ЖJƒР7F<ЉзшЉažjВы’‘"™ЁМ7x\д№и`йŽа Oіт?ЮЈšџД.ЧВЂЁ[Zгtm<”эc3‹6ЦВWMЕAНРІРљJпŠВH#dD]fш"dЭёb}`y˜ЮK7hР ъў”ЃžLђ2~`ЧБебHu F_WЙ’ЄћЉ)/ЬыIиЂJа•z 3§Y~щjŠ8TмCьСУ9Їв>'ZQVEр=~›-ШHХ&FчБ9‚d—ѓХ’RXGTЌЄNR‡ ržЧ– љžощnuќ љ›ežmT rqВкaq&ЉК‹М§Ш0WНЧ‰Lœ ŒЂ$‰}Ча}ажM яŒd'ŸЮ*OŠ–ыљ† {Жt~m†ylh~VƒЖ­žЯš< (_ЧъhbШ%Ьйl{ђ›mќиf=Džуdг 3Ц“T—YBоƒXјz ЛХlƒƒSN5luЌ{њррD ГXЌ Š|SїktmюлКдяINСwСчг ІьdžѓЈd,Ш2?J†KxjЦiˆЖсr™уы1[щŠзЧ'W7ЃёеfђЇŸіШ‡Dц€Їm+ŒE+v›F1юЫ^‰i˜ЗYM+Айaш:™2 ф2~8&ЁЃšŒсwНЁZOюмШf<™fЦˆlhдяl]ЋRwїЯНЁC@EwЎКœсЧеrØ5Eь›м@ š (ѕ№O‹жf дАмяgRњчkЄZ„7Є‘ `Ъит`iгf3ЯmёjЌЛЁ|KC7дЫwGУўЩіоСЕ Оѕцjdœo@}J€EюпЈб ƒщЁзги–EЦй­*ЙЭё=—b@EГРРМЭнf:лЌ—ЕЏіЮ# мQƒб8ЁTwќёущљёўббщШ Oуy Гc”ЃИІ )вhЌ‡‹/їŒЁo‘{к˜гби-=&жыЊVDИй]’5 4'Ёoч”RW‘!œёfHЄІ іPЛo_яž^^uЏЯzŠe)Šсљ”ќУf‘ЙкMW2uЭLзSБймЮ[hЋDž-vКœєX2ЄTЖb“рV›б$†dжmdˆН“sž’—ЩЄЮcLМPЧћЏоя^їЧ7Їзƒag`Й†ЖЈ&‹6qu^ѕ=Ч{+ІиmкPWL?ЎK і‚lі#;]ыІfuSMљ,ИfјАgЉ%є{#IГ–›˜ л]яўЙvzмž|к?=9ќ(Ї,АЬ ]6ЁЃъ~DэУЮлeхЉЊVЋЪQй4jчБ"Ь@! ЦqšUSц6Аn7‹:а…‘hи„їцГЪз FЧм№ќрјјЯ_Пл>8ЂЌ’ЬЪ‘%r1u“ИŠцNof1ЎKG$ в.R[га­o=Ю(‡ыыNO„cplл!W……IТЋiюВЄZa1™Я›PуƒБЄЉRџxoыѕыэїЯž=Н}t9DзЇ@•Ъr%о№МlЙaуn]ИЊф‹yФf?ь1f9№В2юvшFЦj­VЗw›–РАЂтw>Ÿ&Єє‘@сPoŽЖ^=}ГГ§iыеonx…08Џ8x/,cx-иn<[c*$эХ&v§ЈYM}н0Р“€Цсяa'§_.JКЩE{ню˜QЎ9§Д[ŠРЗ”vиLшj2›6ОФ ŠNɘ:Ои&™њwЕѓђеy—дчD ™ˆІы|wd8^ОРдaLжЈѓЂ^ЌAЫ(h0ўf4яH†A.J“†} ˆŠЊ[ЩтŽ ‘Н]З„~HhЗœЭ'Mh‚м‡"зйїnїJЄ'Н9плй>^ХyнFЊdиЎGƒaљЭ-†tn@œ<]ЌV•)KфСAFЏ›?Т|їяWWТФ3 МРK†у'гл;rxЄ'Аѓ"рЄ“y4I‡Ž6юœlНнЙФр­7МЙмнэ(nŒ q^GcЃ‘O/eЋXc ве„Ў’Wт”Псovяї8ѕbEXИ­€Пƒ‰T.š€5=Ј ?M0}КкшbџУ›НЋЋ}Ё*kJїшthxIг.‰7-IЎ]])V6Чш&Ь“к€sЗ щ­aАшˆe§я5j_ Ц‚Hщ†ЌqМЈшn>aDеаPщъhЛЖТz:CкTdЁ-ŽЗџмэгЇ*фЦcžП8М’э Bђw (;L;_@шЧGyљќa:Д$ёlh‚њ§Ф™џŸžIЛ2}0 МbХŒ,‘Рх™­aX Ў;'Љk9Оя˜ъ`okП+ˆНГ“у“ƒƒу‹Юёю GN­™LСqНYЖЁ…YХйьіўѓ3ƒШаШВ[м2ща6§ƒ$єE )ПЂН<цY‘cŽу‡qуых|‰a* T5хІ$*ІЉывХŸЛgWЧчч}Y“xA_lэ (ОD”=ў }Wљ–nи1ХD6‚ПшЭ-ъ$№РU$cќ7эяѓ{=NBЋJУ'ЩЂ2-7ЎСuП^Эч‹џ‡НїрЎ*IВ…ѕCІЛ€Т#@Ш! yщњ{їо›{ЬЕ2TЯБS§Оя­™з=@‰žYo‘х(И’тф‰Œи‘ЙwщШф~І›Lњх„Š1I;;ЗwоПкщѕ;зз—М|МE.lNT0їеŒ ЛИљ’}ƒ‰|5/bа3)тd‚яѕƒЪ aЋš bчyWЁpТ–сr9K]хн Ј+tЊxО{їwЈ‘?gЭМЮзжѕ'‚lбкY1є?›ЯšXЇХiFE•ЛšаˆЊсŽ?џвr“=ђЃў5ЦxgsџRBЭЋЛфL,сQСДfg pށpпб%тGф†„рЄяіiY3РЏГlѓ$іJ‚Јњѕњ ;xUЈ‚P,*Ї(nGЖЅёбўХHщП8жЧЇћЛЛЛл‡М4шюяяžє&ЈВE@.ЯrгЉоnЕЌ\њк№,|{ДОЛЬUAЏO‰іцvTй†Ђ8Х’1ж/”ШSєlEЈ^ЂмЫCдтћЛ]I<{u1<8<>9>мн<Ђ}u№љуЮI—B™Э›мЗhdАЩ=EЁs#pœ&п•ь˜PРw­шшѕЫнzб‰Oi…mЯЌgа”œх&EЭ2Њ“x0Ы:QЌѓ§эЯcютУ‡сЩ)E сlЛЋынЃгѓ>'‘=Nж4MP- й& Ÿ^а]І*? IIk[ ТxШЋпЩэ6UнMЈŠbdљєўц`T_2MkчfVЧ*M4•Œд{Ф‰z†šдл9ъ}йк: 6&Э6ЏŽ9ЕГ{6yX]Y:o!9 юЮzF3B!„b$г“SJ•А—Exgд)†e~иыŒhaYA}б9Вo@АKыЛKє“к’|pœ?ќh"ЪN–‡ŠалљДПuШ)§Ё+„ %S>ЛRњow('ъІЅб И7kђШПsЛКПƒЗ-Й.pуёh8ц&l ‡’щHљv“ћ?ьs„р,зЃ’cЖf\šaРсЮŠeK!%ЃЌЪјa‚D•vЈ\їѕюЩ%/ѕ8ЊBФ 'щŽx6’>mvЬQДМ‹Вфг$ˆ)ўЭAЏИЄЕнxи.trЧ"TšЛžё к(U&Šb4ШтВYооо3!ˆ^аЯYжЙo0щ:Ў{=€H›Ÿ‘бхЖ_IЂDбфђьјєтrРЫк№rДЛй‘4r$MЗ€їђЂšfH@)ЛТŽяЂАdН1šp™jh“yŽўЭћ cњж–Тѕ†,.X)зРыЗЌІЃšeж”Ё!‹мdмЛЄ\Hб0-иL?НО$a ŽЖоМйм|НЙ6Ч'Џ^_JКGйCaцј>гЭЇSz‰_зslY­šФЕ ўЇЖыzЎу‚E[зПЁŠš—–NѓˆHыСKІи!НН#пXЂЄАUdр2eJZ„Ггx04ШˆiY@Ыж4@E™…њdpјьCo4ьxњtѓ`ћ§ЛзЏžПќА1Bгиn›ZъфebtіїДх§§ *WЬЏQ1Б˜‘=иl~ыоЏ щ^C™:Цв‘™pі9иў?œU6мл?Zа—ЉjB‚!]г"1ЙўўГ—ћgнЃчП?yђьщяЯ^Нњ§УiЪG7А›QЖЂПs4eРŸюяЫЛЛеќсРˆІ…5c1›e[ЦPЩЕПѕpQ \š4Ы9@снIКVh№BŠ\<с"žB›uгTU‘чY‘'ž8Књ№ќећзOŸ?љэ/љэЏЯ_nžбЋ2УŒŠ•А DK`kЙ " pјуэн/ц’Ѕz‹Pє*2œžЮX@ыХ4tlУўжќ"‚мЖZPЙŸљ–эxiЫ^н‚­|sћь˜у!Ћ+ЙTŠ7m]ЗM•%‘!ŽЮ?>іьЗ'O~{ђзП>}њфљў€жi”…Яџќхj4ŒКC‰>AЅюЗnкp №њп`Š—‡ЫˆKi‰јVш{)Q$ЉŒЫVynxuјщэЫWЮ.OЗ_>{ЙЙГћщУы'§сЈ5!ШсЛЖСд…%<-ДœfcIеђэ"5Ф г$AšU5ЙsвS1љжJ‘З,ЫАа(@eЫbšЅш€eчYЇ™е3ŸђM5+(šKsЌёWЧЛ{Ÿ?НyЕ7а,KэМкКѓ\wяѕЋOG'_(+ŽЉœЂWтъ“‰jКC_WБSьKŽŠЅ‰ц &М3ЙИМю~‡И„f;ANQ'ƒХпЄ4žДыђє%J˜хд%ЈV–ЊвР1Й‹§wя.Яvо|КAрЛVoя\ѓќР^МћМПѕ~sчЄ'™9ЊLГЈЈЂPWІ0.НЌЯdњFaXšŒНSžЂъј[Q нЏїЫ:Уf„ˆЫŒ^|…J”fІ„ŠB<-ІmЛ„^OфšrїрѓйщчЭЗ'VDaрЩ=ЧqШoПџrВћщhЈщv˜N ЭР3›ЉІjдLК’aМЖ шš•е46q( “}ыžžbSс}O@fŠCcEtLЉц†u,а&SxT %UP6ЏІygЁдяї/іN$ШїћZЊAMЏЗ{pvн™e•eLФяŽžыšцUdэlљ€f3”4ЅЏ ЯШF!hпX’‹–SRvЁMнйlѕТh)R".У$+fиšŠЬВ4ЫbЯІ8ЦѓКЧšП@”ю…~'Qт “\VEQ–еqџюf^e!6Žч-і€:шПГм–XO—Щ 3?oихЭнВє-1цЫКхAЭ‰эw`—wбN!Ф‡iŸЗešФ„KГи54…mДњОGIл@‘чGQвѓXІщЦ9ZЋѓ‡/EёЖЊs‚eG№іO—‹вЂBќЁш’YPќц}Ш‰eчwЗM ЩsВНš“ЗиV!ш ЃД лІHт €В•oAсš­B ЦTBP=яњчіLŠŠv@Ю‘%Tр7 ™?ьFЌђЭIQ­fБ*pУ єD'Tџ_ЈhџсXV|sSSХЅЉєВ8^Љю`+}С(ЖвEfEQ^Є192SЩAiрPЦь‹ЈцбЅА’/Hђ*cBCи #CбФДФE’Џ q9ЯРcŽD.@‚ГЯQКјFЃ7 +YпTKЉtсдХM/№У) /sŠ%Жl(^7m•Хфy…nYДd†8NЄHg іЎ ]іF'Д ЈŠ c€O ­%œ|тNУ!„ђL…šYU•…ЋУГ1џЭл5К­nЊРж!"ГГ|Њ1uе_мЎй>€$ЭаМmыŠ]ј,І%Šв˜™aрhgПф]B`q’І)EГrЪк 3м-Ђ †ЕДє`0Vтј”цš'хKM8п;љі­SЭђЗuш0uyнВ]Ящm~ьˆf6{piLVЋиЃєў7sџЗ УіЦ‰okпsЌ/R§І '_zœ §Ї­ъЧ;Ърр 3ўЬr †Q>…6:#q€fџCоƒзџі—оє( –x"њУ‚ц:ЪŠ$-ВРБќiљdєёісіЛkA ™є#х­Љ*+Ёѕ]\Њi(зиьd­‚ЋлyjHTrіŽŽgLЯMRзuCJЩSТ4Ч5цœœ{JѓLљLяНјЫ_Ж'TJ&yžГHо<Ѕфљ KJ_mЙyсz?М<>§Вs:QЌИ&h€tОd!Ђ№ё] œ"OOF …Ы oЈТЗЎЖŽЮ>эББdЛnœРхuMKБЦJd:2ЌЬаХ˜ƒWљЗ­БbЇЅљМ,B ћ%ђ2Ж)Я&‰уыТxНМ“ОЄ:шJDKЖ UшXпyK{<К:щёŠA0˜ЊђyЌ=їюХлSHоу^p‘бARСhЖ1FџІyFЄFЌvЏџњ—­‰СvлщU#†plВOPЊuтиѕ-乓схЇшш†AХœ"ИeŸб-І–Ÿ6kHлщуУ/ŸНП"lƒ'7нРїbЬ3Œmpѓ“йC‘„А‡MF?љ4vXžLЈбйKЯлiжq‡Чb‚b ъž\$е†x§Œ]Щ(Ы‡пkѓВЇ!UD7 ЊїMщшхѓл}2ИЯ Bњ›"5™ŒpQQ&gт_Dk_э<џы“­1Ўу2ZњlЊOбЮLГ]ЅŽЗlGЧю•Вз]Aбуš ^еЮы„ЪзВОЗYЖoљАj*ˆШЌ” щНў§нсH”4гFеЁжІ„RТшIІЦ‚$Г|EQЅЋчO~{зW4лЃOхx!0E0гМJ яR IFлhЖ"У{#Y ЊY•&хЌIЈЊ4О_гVrќЈ˜бš˜тšRhYм‡злч#QЁињƒˆ@PAx:ЧTтњ5Лg[Ь+в%§Ж+KІg (с‘І@&Й§4ё]‡О/Њ`ыНуŽЈИх|ъ;AбцLчё{mо]bнЊE!A/йБ„OяŽњ<­q*]mн а‚™дШ‡`g EдbGл”Uхтїп~{лQ˜бьшEPaMѓ•Ј?p=Р0§Ќžз%е­ eа'[Я?vБIЏY>Ё[є"Jy%аНzZшiЩгьМzњфх…ІS\+ўžСуФ—TјЎяišЉ{g*"­Фёё›Wя{шbЩ ~ШЋP@ћ;№ьnчŒl—„gшуЯ_SBEAu#WQ]э8!Ізѓи"kъ2KB?5ЖŸ>йœЖ‡Š ,ёDE;*Јt*OТШІъ“чGчžО§а‘ €T*L8œ`ќШmrйАЎPHбЬЊнї/ž=лЧ>Нф$ЁM‚Й™)х,г#Є4Ћ‰CXЖшОx~ц ьiJ>†ЭŠxєOEђiK#c “СhtЖћсй‹w›Вzъ27џX7Вj{A^QŒFьа”ѓїЏ_НмНŒШш4 l(V…>6‘\ЙŽR—ЋІ uЩJJёэŽjc[вeЬ”аё9 к Ћ)дщz”g6?ьєg‡ч_о?пч$&ЊdGџ?Ц3Хс(NBl‘ы:Д}иeŽ FеЯЫq–*VмЈє“a'2-+єПZAц^_y™ЋaсІж2=•цЈЙ6=Чt Z|П;œŒ‡šyђ‚Лj6˜f‚їMЕl!ј“uиящ^qЊgˆ’DеV^ІОу6 ˜чЛv€I&Ы)KR]@%.…‹vZQј pw*†уD)’QЂѕmƒ"MЫА˜fЖˆ­;г§ЩЮѓНБЊщP&Ц=адЇ”и}ZJN†*œёВŒ}QЫђŠd …kz єT”}аuRЬІ-A‹2УFЪo\E%УvЖБЉXЖ™š7с%ЫŒ(ЈјКФЎHЫšдyћцxD„ъa*чMуoŒДКPMЎqЧšc“в!ЭU„ШАбђзЁaл^Œ]1?Hыš г]ŸŒ-ŠšI…vЩ)Ъ]Z„ЁONЄD.Msу)§–gЅбЧ—Ў*<?tєОМкх5MGƒю№ #‰И—юxиpЬї=**1ь€эŽRЙ™2…EM;?3сЁro*TЛYфZјЄ‹АуZ^LхZElа1ш‹Ў7ŸП|Лs>ІВжФЖжЭD2бЧ6иљ2ЦЙВЄ>|–^JЙиБщћS…BФe}EЈˆNа•ƒЯ†& œ Tа2B—|K‘M–С›DyЕщуr v^рцдe0^Ўњ'ndїpёZ“;o^ю_ yžцЮ† 'Q˜Іф˜6йKІу€ТЇ5tu5q4‘Ебж'rStЪ;QQ&qрy6­ ™-=Ÿ bЪ9фoŽF)‹МћьйЫзлWœЈщšђЇn‘ 8уŽп|јєсhDХ–AE‡O!LЈ "Я€Jz` ЭkfгШ“†ЈЪwFВ4rЂ§‘}БTШшёБLЪЖE$YLYЪ4uHњ vоМzўтелн+hќЩТцўЩQЇ7uНѕfы§‡K^”uvЫ‡Ч4cН/YadЗТІŽhEЉ ЧЫте›Э.' ЧМ ъ^NЁзЁаc(2}оЁtъgг(ЄDа2ДqW„ч_<ўnѓЭю/}ЧБХ?2|Тѕ^§ўтх.kШЦЉˆhQ$(˜АС2-7Ћs—ѕаT‰wяћc‰'ЃеNЊІp0ЅВbBC‘ж-e!ТтЉoa ѕX9љьйЛэї;—cAzDкEt'J"j:еѓдЯ2—™РŒ6§щ40u2ZцTKъОџ8iЪ„žPбУjVћьа[cF"™VYNЋжЄ„-)ЊJёєєљгЇЏЖ>~:щі“ьc(№ИоDuЈlG”)Š:uѕ9‡n&-ЙљПЂђІ/їЗ? GКЩу>’тГYj1[rlZИAQUyIyUC/Э…(§4† о`аЙшRЭ/ы”ЕŠВІЙХВТ&xPуЪ]Ѓы!V;РЄLё:kлм%­СUВMIёЪЪЦЇЏ?IŽтUЅC[AЄ Њ:&%зя:ањgƒ€%[ЅYн$феЇ'gW§сp4”А,[4ДЉяХ5ЃЃ˜Ч w§щ§СщHэGšѓœёњйЩќіnнb/;&М!g]У›;А[5Бk‚‰хqlцшх’j–—Q qЎsВЗ{t~еŸˆzZ7hрЛYеqX>єС5ž8:~ўтЈ‹Ющ|Gš'6\\aC;лЂmJМjИИ(tЯЦП"l‹*ЛЧ!О2qsš)“РчМЭLqв=ол;<ыsВ3mg+Да. /lаIЛ^L-aАїфей<пШkм­=šЪJыллy;Ћ2—ўW_Ј(дt:%ФЇК’e)ЂJ$џ#Tщe јЯt‘\ŸŸwЦ"%—Z•oh.НщњПZd:зљєќг-оШpе‹FхШzв2*’ћ›хr–лЊ<щї§ю@PщЯкЬжЎ?т'ъI ю)Lƒ{fБZЖ)њBЧу Џњѕ|uУL…ётюўўўv=ютулƒС„Ѓ–.pkˆж_хhACПЄнЂS$Б‘у$EV€KаA /.{УёЃЬ4OiV яѓаьЌцрж(^яязЃъtz{OцЏM Ю>lžŒЧ<%•dЦfhN§ЈYпрСш! |$o(ЪЙ~ Ж#‚ˆЪјтьќК?zЃ'В*q§Ю[5EЫzъцUХqŽx†w“ѓz…[i4бS[Ÿo}ИI…n‘џ<ам.ЇгјюяюПоЂGЅЬ/х`ОЙ[UЁ%їЏЎЛƒ1ї(AZувИs9$ЋcАЁ}sFˆxƘГk) XЌnяaѕjžымјrgЇУqЂЮˆцKњsX=_3J ћћЏїhиу&=є§В№Ly‚ыq\Уh™2€Ў }*ЫЭ€f—u€3&Гѕ BЅ[2љюž~ўržЊм№rЏ3™Ш–Кгіяr{sџѕF§уЏwwА_DЯ№kЦЅФЂcю{z€ўбВ~"ЊўйѕдДšџ§ў l…ГЂл•иWЖ —‹Y(N†WЧЅ'’щGiYжh?aŸ#ЃщщО’баl§њѕсзєЌ_6pm­K9Уpу$Р.Ž›9snпвДнБІг‡ѕEБlБhC*љКWН1љД2ѕЂ™§0Гd*™‰ўіЗП‘ХћЖп­pщ$}2ќЯлМ!ZfPдež&I>­g ‹И}pd6{Иы№Щюяа†еЦ*7z=Ъ-*vE/Ј‚б‡юю`'Э/ &{џ`BПw‡{Žu‘љіїŸтџч!шŒi‰в-)šсЛл‡ё`1Э&›ŒA  hJŠуFCœsPZ˜І"a…ЯХЃСhŽПТEА"ш}‘ѕаdг+kЇСЃ=б *ЇцŒ’яюіСdа[аЏяр–wlаџG7ш‘ˆ)mˆќdHHPј ˜єqці+[u_яџіЗџїЏД юиcуЗ№шж‹*0Eі@&ЋASЛfѓŠЗЬ"[R№Ц;f7YАЊдЊБo‚[d8ФЕфё`аЇмlUЫѕЭƒ…фЮџўЧп`ў§šт$ќГ~oК^фпqЏіŸAЇКзŸšЗV‘!˜мcёпп}}˜ялu8Ж2Яе@LЛ{йщ“Ѓhйœ&“l%љл§-=юЭ ц=B љnв4Tл?N•;аŒp6Ÿ&žыBCdЉ^п<,ОЏгMFЏчЁ&ГжEЯs ™uzУ~чтЂ7sМ‘6ѓ‡ўQŽ&ї K`*[Ё•­ТЅЇ?–(†fUъ‚VзєуИX0пРtп1‹ёу)ісЪЈ„PљY*?О8ОК:Пш 8) )`юХѓзћ‡ДИ^ 7v†&1ZчMSg‰Ѓ?‘,Ѓѓ ™Ю7шg2џИ˜n XЁ<щ\uИІЈЂzcћ№єєz8&ЈEAГ]2_јЫ+^бF^@)“5Ч•ЊH/Un‰иA‡CŽ—TУ‰АўyїАјяnZ[ž|>ЂДТЋѕ&[g—§1е–v˜7s ‡•ŒgЅЧО[':*CЌн(f –i=cЏHXїК;%Аэ”H„_с!№Š[івi!•њфњфhwчѓйB?ои9ю &‚b)Л>ЙzXЗы‡y3ѓIхЌ sСЧЇkЬзл“АЛх„хŠ…ŠY]iыўіžA‰лuЊŒЯOOOі>ŸvЧћ?ešlі“ЂХОYЕ8Њ—Д`†,‡XMA0Sљ|~yнŒ_o xйёYЃz˜TИJpУbќ,в$Nђъ›л6P'НГŸaэУ›TMуU)ѓ&ѓ)<ШO№–яО2L]Yт№тєђь’*І17ŸmŒ‘№1ј\L3BJeu]:ЪфЂЋEГлUщj|џчqзL#Ќб›и6е4-ЊœGЩЎюXЬХЪZ„Ъјъєф№ŒŒžLFНƒž€н3œЖёЂQЌР>ЬVЧ'’]рТЇЋQТt;?Чrн№В,ŠbДїЧиЎЛМžнВЈ‡Р}3uФўщўюIЇ? {g[н%ђ~чќВЯ)юЂа!Ѓ5сђ‚зƒz}гІЎ)‹@…?ХhбД\ єІ@DК*.OЦZ|ѓ`4ву"1ИЫНнГўp8\Ойи8КМК<нпйЛ ZЩ 8}lюЙсхHsГіfM-ф(фŸЄћЃуpТіhЊCGS&g{з‚–"fЃŠТО@ЈУуЃ‹ўx4^m?пи8НИ8?ињt2ЏeЅ§ЕЎ"[{=Щі‹%…Ё›ФкOR’Š8 №Ђ$ёt•;й?ˆš=}€{ЗЌ_M}eиы9‚бOЯ66Ў{НыгƒЃ/›й’е ˆ№MŠ”ўDЕ"*8šлдžЄЫ„ВnCeфlџŠWTŠ kFKqaoY…†"12iюœмЃ7Кgcш^ЌUnPБƒЮТTД"ибм4…ˆЦу3зџC2 ; ŸийЛР6Yи,[Т9yIЅу `лЊЩC—щ+в 9уёdpy=Ёˆоlм1@Лj rdюК#^­а5“ућ? е0 &№Gи=Š+zгnкћI9Пaл]PИKуа3­СjwЛcйJgЗЌоСЦУЭz–y–в?Њf˜O ЇлпN№#c тЌИПqђ§$ mJnМЈZ^T4+8ьšЪc/џf–ЧIкE^0Й‚ЛФЫлЖc"\sІчЋš*Де.Mхтж№c!џƒA›‘‚n MшnPІ•Ї;сtЮЂZ{И]Ї_cІ% ˜%oГ2аБ€Mcн‰ЪЬ#'л˜(Lц_ІЉyЩiкУљpg„[tVз+„ЕYˆс` ’„iйЮЇБ)OЦ`Cq.ш~т3ŠЅ@ўѓЏ2Ѓ7сXћР%˜юtУM+FМЬ(~XЌљљŠGзi]—‰CРшъКгяї{НNg ˜ДTОFи?зфКyxжЎиоBиŽХfњd"Йq ‰\]ўƒеныоDqmуПU6Жс]ЫM*\‡‹~L‰™‰žLdПЪKсЧНыыыNo@АdH ћšгЧиб§ё1’TšчЈ`зBъfЖ(ше3Жˆ NŽŠРЦнЮѕu€кZјЂЮOlLљ–1Ін\ РэпщЌІdЮ‚ихD]^]\їX5"˜џ~[ŒЎ€;8(Њ\чЪЊ&6ВС@rчЩеЦeчsМ( п~хў'Ўˆоœ8Ž„q[П<6>і5!?Y%џŸ1Яl БљЄЊ8Е7,г&\џ0Ё”]Ќяѓ’,ŽЊњкС„ SЁ…єџјЇнŸ#ЋѕHƒ ФбуКўПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёџЪ§O9ќўЏGOdpЈЈV2нЬcћзбљ1Xм‚pкndihџŸo)Ючs№}OЫ,kцEЅџщŠ o‡‘ЋOО[шѕg 1­VЫœЌe‘MыМЈЇщ<бПіВЌ,Г(№нŸл8ј ƒзmc4rђvVиКЦŒсtКlѕAuЄ;ЎŒ„kП€fM]хYєпы:C 4Ž љхЌДdХpМ(Щ‹fБ@ožDЯ$Kз;Ї ^’7ЫХЂ.#qƒћя[Љ#еK мš”Е iDwŸLыv^Yьі7†ƒСАsvDŸ§r16ЂЊНЉ#№~шлџ==6Кmš^25Йk˜йЌ m–ŸVM§ŠёFЇлщžlє&Т„S‚b6oђШЫa–GюЯыѓў'6IbHf8Э Oѓъ&‹‡І“ “Q7ЎЛWЧŸњф7ŽэФеВI7 ’WЗЭl9OŒIїbd—‹e•јцpџррщm{šфWuтЋЮpѓyІ-1PCqW‚аыЋŽ#l]žэm]Йq>­кЖ/n*[‚Дz 5еiXNfє†h9I•8фЭmцъМ ;18œ›ІˆƒРUћ}ХqMQPMiугёСўоюЕ—ц-Юi;_Яc;Ш‹љъ“ЫД.џ%бf6.Г2+[D;^vУК=5л3O+^’FжаЎ>~ко?ияzqђѕ4Ћ—Ї+ІьИ`ъЄѓ2rъ}€‡1 —›Їwѕъд•йK›%AFЉ^F6˜Ы"…”ИПѕЅ;ИиQ J,?š. ЮŠКYЎ‹ѕэj9?нъ+Э‰3пі)Ћ4M•љ†"ёl9›СfHЄЄižи‹таГЧћgЊыH‚•N›*эИžЭ™[”iэš­ѓвsvŸlyjѓcУШ h%)Њ™Ь–P)Њ(@ЪVDZ‡–x|ЌB2'Џђ'o Є4Ћ‹Р6 š/!Є4‹Ѓўц!š^VFv)™Ж‚xMГ‹ХЂ…ќE[ƒЃkk…Ћ Ђf…;0еаЊ" И!"pЬЧ^=N%‰1 &ИkCѓ+hb—Љk8уšТœ5УАе‰тКzЇo‰'ЋіpеЈ\,ІБoЉВЊЪFЯзLюЎ.ѓJ@Џа~dЗОœˆ<7ž2ѕƒrc•sšiЊš Х ЫКŽѕўЩio$*§ЎъYЪщЅЄЁ41Сь-Š^НЄ™MCзйNкеjM~ H‡Vг"БПOьП}Z{ СŠщEлEЊhЈЏЙoШЊOыi rуqџтђфЫФvŒСоХCi Њ2зНцЉ,„C`cЬ6!іМ‚йыеЭ „’“˜МЦљn!Ѕ6:§1$УCN5нˆ&ЕЁмРDзMlIЂюe5ур§S'§§/Вc'Ÿі/Š}гTFЁB•“з­’Ш3“ЯoРFEПCЯAЉ\Чhч1/5_‰2&ЃСp4‘ ?­цLJr ЖЛyсk OGP­ѕL­{ТщbgwkghHѕкА'{TВЏq=;r]u8Б’Хэ О~Еn*42}ЙG\‰гч9žDнЯj&ЎwKuЧzе&Ж0Qэ”‚4TЁ’$Єrќ№|а;окоыh.ХKOЬТRHїВ єЏ8+]1‰{ТLЉ-Ч СEyмэ\=оe)й Хч"Hkšсgэ’‰/ШŒ6ѓєЩXqŠ–жR…Ш~ђѕц‡Уг/{ч‚хZŠЄЈhз7ЋЉЇЯЎК о ~И]подЁ)L4Вкуыž >–WwгЯЇyBKˆGRЭW QЄєНІUhЪœdxЅлТ7)щˆмшЫ(вŸ_ž_ nШkn˜Ш—Ге,q~˜%шыюяязPtЇ’Х`ќV­я5ћу\вL i dе(h ќПyxЙ §(HЬSьРЎ)пŒFуIчh{чрДгЛ::Й<:W)[NЋ"МЄ]6EyQ7н)tАJ$ХЁА]И ЖЗ]ћ{ДIџёИИRm Œ ZBЌћ›ѕzV†„S-/Љ)OЎ2щ Ё1:=8<<ъv?эь_SБЅ1$ВДЊbOEУђы5c М]Є&Џ{QГ,}лv=ЯwL§VуHЂвŠcwЌУ(фђA/}Е$”ц;.…ђш:вљ ЄXL??8мн=>и|ёfћKdлРщ}X~’О>jvиЎoўЮОbQ}_,—Eiš0єэQЎњcнˆq$ШЊЎ›†щQ:ІyF:[T”)М mfdєдcуTЄЊмљчНїл{[яп<}8!РЂШЂЈxЁmy4сТй™hx”oПiщNТМнЁyіP§M6КИНњ§УЕ ХUЗѓ" ЬЂЪуГЮtjа&мн­зm‘$еr9ѕ &?щ§ЯЙM4Ц ЎЋGЩe"JВ‘1Йй%‰™фOжЮ C™TЫRO—''л[яі†Н‹УНэwoŽЦ†Fa\4mŠBЭ0ФыKбLŒ“‰‘UжTўфюш*šЊBBьЯ-Ц+Ž& iК*SјLDХŒц „(s бv?™ЖG„Тu˜ wЕѓснцqЗгщ&НэKб"иМп&1}Я/†šп2~Ѓ{  Ж} ”M‚0сШ MЭњ3Шi(ЪŠa3+hT”tЮxЏ˜’ћп. +NЮб=ќјvѓp(ЈŒhЛГw4 8Е„љ!]DОI NvУHLPћ,–Љ.ђЂ тт%е4~\T‰ЂнX„=уxзd*'–_0qwlф6ГjжTEhYЎы˜ЊpЖћё§~If4ш‡_іЮŠђEђvN_Иœ’5эhЦшgoзј-њv…Eг,ќPадlѓO@ы‘ =А|3э‘оNШћ,+ђcBвA˜`ЯЋ)=Y FŸ|ќјaїЌ{yttєyoяhgs``ѓ&-Jl/)!–›ЮЛ0Ѓ@­\ю!r'( ењžЧ 6˜К*Šф$ иgЦ”€у sƒ‰.ыВiгЮšXущХ ’Ф}њјюѕыЭЃ‹оDЦƒСеіЧ ЭqЉ ‹ГЂY,WTПxŽ—Ж,Cє—&œJ˜˜jёO5Šў<щ|С–7цešВ—5аВRaиbg&А?Ѓ%6+ZІPЃэяmmОzёћ‹}ТEЋ‹‹Одл§Ь›ѕ@›XЖdѕМ-Ѓ(oиљуЂЛ%HА(K‡bщИ?рРј]Rєџџшіh^ Б+Т-Д$LDHœадЌЈКnъдЕЄУvjXЃ"з?ќИНЛѕўѕѓ—яЗЖоoО}П§љєd{ћZR(ЃКбџbя;Ду:’,љ!-ZбУ–№ІМyо{яЊ^љ@Љ~у&4;Г=sv 6и3{SЂ$Š@!^ОШˆ™‘їЦљŒщЃ/FeЩцT•3ЌѕВN\d!qиiі(џšКј#(ЕлщЩT€RSAd-Ё\БУjСŒІXЅžу'иMMQЩƒdёŠЬм§ђх№јМеЙОnєDсfћнцсщщ…@ФSђ+šоХl:У6ЯœŠ P+г'N3кАBЏqнЉиЇЬ№FsTк9Mчƒо X.(§Vј)ынЫФѓ#pX…ЁгвUюыюСюёЭPQAЭFOСѕ^ил§r&BG5!Ї Ѓo™Н ˆТƒи‰q=Ѓ)НдnЃ9„RБѕ#iqHpСŠъiЙДWЈтU'›ЁXЬб“’G„;@Hšй’H^шьЏvЮZ}qиt{§nГ}іѕdѓэосASq(­„х|Й`Œл0BіSаєЃtЋcF№;шѕxэrъЪЃб^МЋ”&„ф|ˆб1‰ˆ’Є3Jг1еЃ~Šгјƒf9AD9МЙћѕЊ#tї›НО(qк№|иќА}|pMЫСВЬ † E><іt6ŸNчєт–єЅЖMŽ%Д_юбЩЊeЙљœrvQЅCЉwyp|Иsxо@>-hЈІњЋЦNMРr&ћRчy№E‚№+ˆCВYytv‘K†8)œЮ№юу,ІтQOвл]ЛS— ТS‹2ЅŒ]ѓТ—…‹/WЂаќxТ]lяьm:“-љђtяВЯ–Ё)Œ}GpJЭqR4_ЂЄHeN€RŠэ2БfZE\уБFЫ”ЏЉЮ`*Р`Q‡pЬтќ}5'7\LQi9qV]т‘tŠ*wEёьЫeћtыsѓњфтК+Jƒу/MCН:?ЃтиpќИЈ1у2K22GrKђ5B2 є3й.!%CзюњЂ§ШЙP„M;*€вrТt А^˜ ХYђ˜,tm/IЂР „@С1%`ъJТщ—УНлюбЕ Ъ2ФгcN>&|J1Шr83і}ЩCFTXЮ—wkvP>Я .]‚9šЊ)|ыЂ!Љ еЊРйp(DŒ–Œй ђіїї‹щˆVЇA†M•C‘Вћx\8ф7П4ецЉ0o™&wv%\}8!М$9ЁЋѓ9r‘ E&z‰ї+ь@.jGе)чђS†кA7Ч^J>:ВŠnищXƒfјf5[м[ЃW#№\LЋУО Xi•gЉ'q>_Д†вMSыФB…‹ыіжБ {e.!IOшШšR*ЅзЛ[—/f)Н1ЎпэДл”M<*NЫќўX­P::mAUdьЄƒ‚ ~““мпQРƒВЁN8jаЃšзŒЊ* B_тЮпя‹Š:Иь5.Л­v—zтртфѓW^*ХQyƒ#>N ГКНћЖZ ˜‚ѓ^рЯ=§щћьGШ,A;Э[ђјš`Ÿ&Џ— zЃгФЯ+lчЭАчОуyіёHР{јnыЫЮжўйaCчі^я U4ЪЁ*LПШќВž–пАVќБžQ†EчGHI 5"9–ŽcUƒJмяЎ`$tзYД€л zг„hВуš)‚ЌWДvnчй`‘Iјњ[`˜.):Ž"\|:ф…ўѕАїљљЋоО}ћцXхПќ~"hA5л4‰Т0Mђ“ToюЗЧп(|ЂxЃѕ2Cг7ŽЁ­4сф{ЯaЈВŒЋШвTОyе‚ЫŠRGM•ь‚~-Б nэ}U2J‰ДаhЉzQQ•™CЏSŸ>ЗХvKК|§ля›пМ}§jїђhѓKKБђтqU–YD…eVзЅЯя7J,YЂe›еRгqJ0FNпэВi†“ql’ем€BƒDEW4ƒF­ѓ9eЩ‰МЙ}!&UUBh<ƒ’Ь(ЧЦ…ЪЗ?Оm^kѓХыїŸпН|їћ‹ЗЛ—}™p еыує]а%ЏіZй§7ь/W{V8[фCЗœРCNь{З›††щЩХ,ШФsCŽe#]ТŸ'iR&ко—нЏBXŒ&ЃжWъZЖЦн|xspvzОёъхЫ—Џ^Нzџюї­гЖЈЁy! тrJиŽъ‡йДp‡g‡‡‡­мЮ(Wьрˆь^Œ,'0$ипitO3Нэ6ЖnЁ~Єyуме>Ѕ—Љ{Бx-щКWNf3єЇP +ЊFљціып?lmўўњљпўіл‹—Пмkp’ъФyъ›КSLp Ћдюн?ПŒюПнвD "'М€?šp“еЙg@.љ{aЇЁqŽа…2Њ ча4Sюbе-i{џFІX*ъ Э4„fгŠ\мњ›o^НyљњЭѓчП§іќХЋэХ{/MCS–T*:‹%‰Ё‰гЃЫЏƒ ˜У)'2w†fЂэQЊ`{щ›rП7)Š:Œ^ЏjVLPyGѓŽШAЅљєњv1ЋЄ+NFн(Њ!іЫЇрџ&ЏЖLЁwЕ§ъХsќѕлsђн>eЫ8АUуѕИ†јТrš;„4kєО ѓћoїL@‚&™Yђ"х3/Є‚Й БEє ЉМb}Њ1ЦБgй–OpЕd>=ЃВ˜еŽ Jи UХtSд\“ нјўб›—Я_Н~ўлпўFSОIŸы2?рДАšЮЇs› ље&Юœ|њAЉiBйEЄTШёмt3Ш ›п­ЌЉк–ууk RЧ1л5ћd*HчиФ›ХІС > ‘!е]ХЈ QфЙю—W/~{љŠМуo/ѕі;F’0Ј[у26gЊjZеˆ+ьТ.ъPЃU7ьQnшДЛCZќКŸA[ѓ{КƒL+ТЎЬП‰нсД>Ѓ€х<ЕhЈ,с>2(QрЈBПг8zћ’œƒ‚ЧѓчЏоО}§щ’G шьtT+ДЉ–KI{Ш^MŸЮІciЧuчgЇЇч6ЮLз1ПŸzИТЧЮfа.x}К§KТdЮVт<3§иql%zšTЖЯП|$O~ѕš~Н|ёъЭяoоn^є@ п6У$ =(йЖIЯЉ™ЎQаПЇzqЙ(L‰я6›Э›VГйюv{­ЋŽэŸ~wЅ(cLqЊ%ДВЈ„\‡F M;-$(…ЅŠч#ДЧEУѓ}WукзЇ{ЛляПБННёіе›7oпxџёнч§““ЃэНŽn[6r[йp§ 0c@tМНyЌIBT§’ШxњХцўq›#D№Нѓ,›–MЏ.'”БЈ‹ШЕйКdKœь1 ЉЪV<žж…ыFy‘DО)6ŽОlю]\эи:ы ЭƒїППл>:љКПёўг—­Я?Е†2ф`тPIЎl-!яРVяjиH–МЃ7ЁЊ-kMЧ‹Љ0ЂР‘%ђљ8дDžŒІRQRШ_ЄяxЂэеп–™-ѓ§!Ъ-гЁфQЯщЮс”дl?p2&Œ—S}ˆзjj t|Ÿё“Ћ†G4ыqшxОљiŽц–"~аюИEZaT Оžч†(№Ущ abс{Є`;ЃЛ‰oШУюмй0t–UטfјЁKˆїбитBSzR”eЙT@Œ–,і=€ЂЉŠ‚ГEK3 UШF=CV]=hв‡Эџz{l;6'ЄxзjtћпOыЪ[іјЖТ†`ˆOIЄљІ:1Ÿ/џ‚csњQЌїБЊсЃ1њщFN†2L—ќ„Њ'пvа3KaЎЦ~9О†0DЏ }Ÿ4зиlЃЉЏi!AUUЄцббХЭwяЌL{М.ЭКц†ъn—iGѓIdSbe ‚†ЮЂхrFn4Сu‘ѕУЖф Ї[l#4Iа2Г]ЛGРщ@Б}Н4A‹c–ТЉGW‹–Ќ`ЎСМeњаЬ5)’8pqВЯ–ГЉИСdšКІN84ифЈч§zЛmAmЇЌё+ˆнЏЭc8ДчRР шц9ƒOЯŸяЋd4œ#†Šfšf%ЙEeˆLХтмbZхi^т. ˜i8І­Ш­kп]а8юhQ…6Ж5pN†CDЖѕБ'Tt/ЋЇu–NX]АРTMЦIcŠУ8МŒц6žП8дl7ЂUHщ†в 6ŽkоБI]ЏчѕdБЈѓР2L')kl%/чЅЏ5a_KƒBі#ІкЖRЖУh›}† Ђl ЧЋѕ4Б5qРЋ~9Ё$Ÿріщ‹‘<;ѕвзАq“(}šщп~л—mлEИ‹X^) АђOЩъй”R`‘еГIс*awУЭбОDC5—ˆSxМвxФu\л Њ*ѕmЗ EI3 ˜2hU4ћ’™Œ&Йяч(љXQ[–ЉАUњЎйћјтЗ]ЩЄтf™<хE5Ђо№љЂ SŠ€БТѕл­.ЇК9^U”ˆнNg(Ѓѓу1=еšэЄY`†8ф!сБžЫYщщ*yжДАЈЫР‹АYƒ6BєŠ†ёчs”Щ…ГћюХo;ЂЁ#й$ЬцqEё%/+\LOG‘Ÿдuю‰\ћto{ЏЋКhжЇв(1шн4ЉŠЗ]ї1ЭœmљеяRЇ-ш†ѕѓ5-’Ш6фЦЮ~“ќ#(U'dуИF„NГ"…tOХ’L`›эз/~лшsќ0С}нЈШуˆBпxRуФѕм)†э“ЭП zPБР7‰-…kwyїЈ.= Х‹ЦwщНеŠЙN]ЧаG_ЎњМцEIUVL‘—!І›Ю”Б1šCЉTЛ~ёќЗ Ю4М †AњRТƒqJu;Ѕ}ZЋсЈŠ<‰ы7ПlоHThг,ЇЅЏ+TТЛ1уц#Œ–p-Єзф4шXЯюяoЇE@]юŸ6 „щЎ—dtBЁ  ачKZА I#_—ЯŸ“б}Ms|r eШЙUEFFуѕTЁg{ExTdpнжхўq_ЕЖk†>пˆМЊЈRJч0њ™ЈЪН“ЎIQЇ‡wгФQx‘k~=l Kжr§<їќ Ў` кq‹VWє yтЪљ‹лЈЊd85зьšCEH^MXпwмŒ>Cу9ТЂ|џтFаэ iI'ЃѓQт=ВСІн8П’ ‹ТЦœъЌТі>ьюll_bџGsн KрJ vcфИЩ……Њ(sTLW/aДЌљqGСu’бƒщ4Я“i gЎo М‰оюuWвм‚Ђ'™Эz„p4№јЛЌCнАМt‚†ЎФцwЗ6пО?штИйFЯDШШiщ‘­B5ЌЂЙІŠ KЉ2|ѕђ9ЭДFь4rHЏ„^D‰џШпs#2нWEIИсАефЭ/ёќb4чUфИ-ЪЛPiЩъХэВЎ нtєё§жљ@’4Ыsl‡А\аз Ш ЙІCV!‘JVh^Н~љ|{`†YD`ЉФ‚­а‘_1jŠjœ„Кƒ„RЁ~0пПщЪЊЬљъХgzYU‡);2  NH9ЇД˜чуЬ P+и–GХ™Cр@фЎ/) zЃ)<ƒRЏЂъзувн Ÿ­fEштfYно<с8™#ЯЂš№9ЋpH”y1ЦMбbKМ.Ÿ’Olг|9a’U[я“Šэ"FAƒН0Я0Н0Iз”…СйaWбнr:.Њщ4ЦЕ6ёбd Tї—‹EAЩM’t‹М˜л9“YЗЃ4ЅТЧцОG>’чфЧ9!ђkTйTŽ^О|ёюšŒіЃЮƒ>О‚Ђ_F–E`І]2š|^,іvšиѕœŒ kZ…)=nЈž_syєЭњl*ОЖx2b”cи>ŒІЪ•в!ЛT8Ё'ЯЦM[о{ўђХл M1ќ0У d›:Ьш2ЫŒ™ЎД Š\ТЭŠ(twо Њ‘LJзВТ,~ЄŸАoлx`ЧRн$dmђ[›-23:§<Уpь$ЙбЈ„KгРyРУХЮ,Д”ƒ/_М>U47JиНВм0фвєZђ8 щКОŒЃˆЉЙЫOoЖЛЊŽ  qaшY?Р“`Za=Sƒ&зЁъxИљvПУі$єВ‡юGиx`Љ)Q’гOцS‚"Ёу\ПyљђЭ™ЊdcЭn{f)Э3™f™oг2†бК цyЎпи}§юг-ѓjьЁNВ\їGn(Ъ–—Pќ‚ШГƒn іЇ7яwЎ‡/H.ф1*Љ0!SЪ’%мрвBXиЏ^nržАfд§)фТФƒ'гp4?БЎпы\|zёqчDPЭt’›2Ч ВЊўРХ}BНЧDг%е‹чя~§лЦEЋ;ruЧgїЮhеEА@ј4ЭЦѓЮі п‹Ÿо62BDИ3Y—i’ ЖЬRd”™п4ТирЛ7іезуНће№ ЖкŠ0ќAЭ џˆШ:k6б…у­н§ѓ6O%К›ј*’(Am•џж^bчyœ˜Š_Юќн-k\„К‰Л^•3lп4Mв"vatHХЄn'Љ%tлнaП#ЪћЏ?7eњЁ). ъTšўˆб‚a;Ич‹њжP[ЧчmЩеEђi3ЮbB–XŠШ~[Ж—›ŽчуШэx”м4В2Бd*ЄFPдLшЉRЪщYИ”k)d’чљYцˆЧ‹ЂhКOoކЉЬ-bЪ8?FXЂZыp#Р45ўь’—UJЙ”i xьКЅђаs“ŒmШƒ(œFІ$е(JІьrГ[”mу`г,N"зГml›Ж›Y`Rэ \Nп}От5]‡ruN!рЧxT2Зю ]щœve&FвOЅЂ"$ї}JЗф"А+ Т0ŸЯ"‹в>”ЮА№ђ…}ˆ?Т­дЎx>лYЕНŒ*ЪаХbЇЬ/wЗ?юŸwp9Х&Чћс /‚†­CWх›Џ} иG,кЁ`:оГCK–V Y5ЙЊ$JЊЦѓ&е=(ъ –†16Юио5Ю7М rМл—)Л_Ћ‰rїуіоёN”ЈЈЕПЛAхGKTUЭа5ёlЇ-уЪ І!]%”П‹Ь'\MѓфљЎmЂgлўЃInЏнЖI‰N1ТёYF‡žžѕ^чx‰ыEю˜А‡&‹‚икњ№х№ыбi“S5ѓŸКЬабS<јКqвЇЬ‚S>#Шp`Q”№ Z0ЎчXŽуХIšЁцŽДСС)§иЋKKК]СШЧЃоœFИzƒ[G„;р~ Z*>–чn>м;;?9Ош)ьЊї§ЌЯSФhюО}Пйъ(Еш6цтДŠ1Ы6Л ф8З“ЁЯЬ7ФуУО*iњ№фlЈ…хdLex;PLw\м+Ѓа‘”QЬvv ta ;чл;л‡Wзчgз]QU”юywШѕŽ?иоќtиЁQsу4Ї@•%:Ф, ЮaS rгšD,]Д8u№eOPЛ{gМтDUMЙ=%\npЁьMОсЙyI>Ѕњжж ›иўњщгZˆ7WW7эс?/@оhœnО§ИѓyГ!ЭМ=– 0dИь)з{бh1K({ъŠШ Jw“ъкіI[ЄяШIUn›о‰ŽŒЪ0-ГgJh№у^Пй<<;ЛИzж}B/ŽЂnDXЇЈœW„],230§бЊХƒмкишУЮrБбxОЁ‡EU м”L6)“МЄxOЯŒ&uљg1vсТ‹$Qѕ,h~œс`аЅЙfVгB/ІБeа3ЉЂbjЭЭžЈ‰йЏ:Х§ѓ6МЩhz9єе3*z лЃ‘AљyFуdOЂЪYрepЄф сбУ&(’gcѓЌj’ю›НoЉЬh#š,І9Н ›бД|€Ъ“оЕЯц•Ѓіw.Bг,чcЭЬКnК^R/ЦЁэWЋлХД iЪ)ГтvЛЌќ>ЃVѓъr 0FЃaГK Ч‹šЌžуPp–йlRašЯжѓмV:лŽЂчѓif qO3лKыY•Ž—Зыyи:Ћ(|ТџŠ:мй8К$<)=)#nГysйЁ :Кд<яЁГ’œ—о:ž-жЗwѓиЖQ,XqН\ЏъШЏЗŽ^ЯІ‹YŠыеT@˜N8Тљєэb>Ћ|ВZMКйЛрQ&Ё=ўщŒnДo.лUЯ‘ЅvNКЌœеЮA6x{ЗŒ- ЗЕ3ж7Tљ*ѓ…тДž‚ж#1акCTыћ;ŒM ša&@mTДsгзW(’OHн~ЇйU '-|Пм;„НBОъPђ^:c„иaGжт“:Jџzg(ьОі"•h АТ1њфцГ9x \›У-iОл—Y‘Kб‡<™еН7шUгIЦšЄwwЯ:<%hн/kfєнМ uЭЋoAGQцрјhч+'Ёіію~сїzЊeћхbMюБšЯЇ“œ*ˆjtЙзъ–&1?• žˆВ‰ўЯ^‡б ˆњ—{‡'M^вТz:[пноЎЇ‰!;ЃлЛлћѕjф*Їя7w.е)h§Мк–h'5ЙєŠ9ШtуJт q=дmЃRaЃvЏкOfєѕХљUЃCKХ‰Gг:в%О{}Дw1”Э|ŠŽYЕЋИЃ.'п.SsИѓњѓС Эt6ЧыћЛYаo№§n}‹6яљl™šдkомДEЭєAКэ›O єhž]vбЭЭk4mŠƒvOP§бtЩ.Q/ г(жрЁЙЛњjчу›гGh§lьMќ@ 'ы;4 Џ@ЊЊияіE№kTГХ8ВЕ'хnо\žœ\ѕUУСJ2ƒaF–5'ŸЭзwИк;OНt›ooЅ­Д>МлЛpЂцин:u=˜нн§ёЧЗoИU;‰ШЇu*-ƒЌ^Ь'™ї˜6‰я щ G3Hv}?љњюююл§М-@иAГ8K щцућЃж`Ш‹zJЏ7яn)н'є\пОaЎooWu8&˜рЮO:тѕ“Zлє›_їŽ; сž,]-qыєс^шЎЋS^Іџ kОн.ыP›Ÿ>wœ i~5]ЌXгјнj2Yс­РjААЂ…iХz)…КzяќшыщUы‰АЕ ReШЗї)b'v4_Г+KhaКeСЗўОБyО[ЭKGZяOz ^б]Ъ>‹ѕ_НюpџћoајЦ\щФ$ј/pQД,с№I<{Hщ™`ВœєyЊo]0<Ь0зєе˜х;Pеќљї? ўЙјєІЊШбeиъIN ?Ђ›P&0cжОЩо+.„оБйfОŠыйu,ѓУЦўцЩ€UlкŽыЩŒ15мн?Ь№§З?П1ЯўЦІFппЏgeфр‚­Љ=A!йœф„{]Ж7Ъш"XO/^ј§=#&zј‡ІД У~ыь№ДЧQr™:Ўгт"мУ“нџё'ЭюўёчŸЬOюО§IПЅƒ+™06хђЇ0кt34ŽFU=ЄCЛНcIƒM3ќ3G=ŸE4гнцѕuoШЩ–яy.СfP‹нБI…НєЯ?ё,Шеэ§џћŸв#пЏЇу" ћ JFЊяш‡Ђ+ŠBХЇЯ=s $ 2SLёуž<“нfЪ-PЯєкН!/`A•eеЮf+№ъ`nЩЃ1Чїј$ј ›ѓoЬo( Lћ)ЫJЩdЩю}ВЩeй„§Ф‡їЬ”l“ё˜“,№\ПKN-ƒЌ„@`цГ[<#жрЗПУAю(ХPNЇяg ЇUR>‰{<#|PЙБœ”Y>Yо2І{Ы8‰`ѓП…АХЇ›eю”gиыsМ КнNЇ3МёrЭо „f›О‹Э3VяЌЃЩ ы{^zж“аі5л­VгЬЇач#-3‡Иc?‘§`ѕнЊђ,лХѕ№РжDЎза$wЭ6-XьyБц№хьпpЉoйѕЈ*qњ<™MыФБžfD6 ы–.JЊ•~fK~Ь^8§tnkќŸш†}GњэvПпЙЙКщ †‚bЦѕъпœšM60Ёяѕz9›TиЄуЌ, пќ'N-ўур †ЩЌ ЭП§•Чю™/?L5eЕŠ 7\GИцЩХѕХЩХMщœјђС9B5YL0ЋЙаd\$QШЮшiŸLю€МкдАНЏ;Q6ZАpћ}ОСr,џћл‰+vfwˆЃFKуљЦЮЮсёeЋ›эА˜ЌўzК5–сn*,зpРR|і\FˆіD ЋMЅ}CužхЇе”љЦ-.>ФЛoYwЋBЖZнnЁNгUžПйи:mаяDеt#д’wЬ™nСјdx;qTЭBГх_;Џ–a~џ§УяGЄуХšтv^F^P,™б‰m)§VlLИўЌ*їlя’€žЌ;Ќ‹iњbсќыY=Х­СЉЋЂТ˜t MSdžуžxSзM›`)Иљn—#HPБєѓw,ЋЛЛe кЈРЩDиgјьŠDн‹ГЂhZ"цСБfZ6пО-B™яї:нСpаћ)[ъВ9b@џъ–2шrВ;Йƒo …п/}iаHŠЌтΘL%ыГŽ AЅ(ЫjЬШ#o)Т}[ЅІ"HvЖњcЉќА}ѕ3Ь}‚эDИ;ЗžpбЫ§./щщј‡НŠUЎг,nВђНg}Рke‹тб‚сS cO:]Хп1zAћi+–џ88ЫL <”рLйдUq0фХŸп#шо–ул} 0›мЃ ­6љЁKоА‚ МЂєЂ–™Љ№­‡B}UXЊаk]§4Ћ #`DЬЊ†+ЕъА;„ЊЯ˜А1 ПїпfЁЮЕ›„“Рж' B“неQтœЄЅиЁ˜1‹MYш7{TЩЏnЇБЉpЦЭЯ2ZЖпV$ЛЖ†&wЏZ=QujЪуˆ ўЙЪ№њф‚r‰Р:=yі \nзЇgm^NYХ№эnžЙšЬЕ;ЂЉІ2KtлOшђз0mKУ%PлDЯЪх9іAМPє§Ÿ˜юЛEj‰ЭƒуыNПпя5Ž7ž=ћєх№`ыуЦюyW0JFdJ№Г q…ЃЭщAЕКŸЅŽ* ЙСЯ:jИуЌуТ'MAеэlyO5мљfƒ‹‹ыFЋнi~§єъйГ­ƒу§Э›ЇNvjf2§c’К†ЬгT[бlПЖ.KOŸџушˆЊc!Ећѕ†ќ„‘ч­ю ZBcия4[^ћbя§Гgћgчg‡›_.{М,˜ыSn™ЮNъЕњŠ“ЮVу8p,§i7гџбjХgїьTаГ"СЪQЭЊmВшnQЇX~pž'Ÿ>ОИИ8ккНш zrћЧ6\/FЉ"ŸЦPwЫЛуm<цОгуxN-хњY[#м6 Єы)%Ме=CzГqћє2FєŸ=;ЙКЙ>оо9ыЪvёАй@Е%"=ЄE-йŠЦu Q†ŸЌаF3ŒЮDС4ƒ„РОЁHЊэД ЋQЇЎЉјР…–ФuЄgЯ.:НюЭзу&ЇњcиМšуд|Z&Ў.Д.Ј%РЌќфВџ0:Ќ3wlKW„AO4б"=ˆcФXЗ„ъGS…И№|ЗбцdZБwЫi{ЖуY5ЎbG^ЖT3`ћџџ"Х0RwДъ;Э>й8уйРž@м2DŽ5kЎ,‚ЫЩЩ&ЋYс“Л ќWНД*C[n>уT‡М?I`ф?~ПлєлЯЎz‚F•JчѕъюaУi>•Бu;2š];/АЉэ(УnЋ‰ђKВЃ"ѕuz*NбеяП…џdуКЧc/•Ъй$”иvZжUš*х‹kТTŽЅА<АхюѕххХ%%ЩъХiј#эбO40к„оЩ dиї_MЫд74Тш—‹jDѓjHНыГГ‹ЫB'ЩtаSџпftkvP/€X­ 2š"1ўP”НЂ*гае„^уђфєђКбщt vƒšіПOeЕ цT'*Ц4ЁkYŒГŒ(ТhI*єt(|J‰MšчшфкмуЏV<сRk…Y†іp ћn:Њ"Ч@к‘Д(ѓ  {­›ыыыvЇляџпэŠКnЙЧљŠЊh&hщLжFм“ п3p лэ4›fЇгiџlСЊяmAЭ *уќБ= 7ќI=š„т•0sЋѕf”Ÿ?:œD X1)—uCг`ХiiШ,m6[џ“,ўїб†ДŽ оЬя:љЉвvO8zџщЄџПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёЏџ"v8(IšŽхФiЄiЦOэГ{šЁјi–ey†ђЊLЭ8 џ‹6џ#z&ўїа“lЪDSЁPО“х‰§_гЖЃ$ LёI/џў№ +д|ТДN ˜Z$Бу—eђ=*Ф:РђьЙ?‡ЬућЧаrG =IУЄЈFyi]9ŠРš&1џ–гr ЏВЬГYо9Œ8MŠ"ЗZжЁх„YAnѕиж,W#›Ўзe}7Fœƒ”u>х&=э—Щ=аqжгIсHj4fЖ…ы!шІkˆJј§gэNЗлМРя]іЕ ŸЬчГ*бњ&Hљџ;lB#HЧѓiюшv>І ЂEHЈN'гIѓЯ­fѓтфйГVуњтzрSДBzм0 ‡ CђўTУIЪЪгэД&Ћ=#œLЫђќ у,ЭЊjTfЦГ›Vуць<[WNrGЫy]ФNЗчeГI§Ћ[ {Ж•ŽыФ–ЭlВXž_Эr$KP 7шYЊ< ћз›ЫгУk$Wv’бeь)—m'Ÿ-ЊФгў•Нyœщш‚Ž&e ˆvR.fyRЭ*мВTeЪwк8)‡gW—ч‡{—"„ТbзнIFee#YMŠРR4̘N'#Ј.—„іЪ<Ё6qљјкBWQмЄšPАƒКъtЖZ/ІѕtЪФбзЫYю?–ЃўБЃiибh›’ЄE]зUтšЃаkзLњ"K}S– зѓ­цЅ‡!ǘLЊ$Њ  5…+zš1Ё­y]†ўO†PŠэ—г*0-Щ ’Ь“Ž—Я—“I=Њ'З(ГФ•›з}Y•ћƒ0 Сaз5Xі'PЋšN*(Љ0Ѓ—ф`Iр§мм8ЄЅ_OЋиU—CУq™‚Y>Y,!Р žл’Єщ:ПЗ­Ф!cRMЦedХ`ЋЫIь^ыХ ЈаsюRдэЊ3Љgђ/J†эFХl9ŸAќœŠ€2NЉ~I#ЖkŸš!ї'ѕИ*bпЪVЗ+ђ’њхаа[ŒKђ.M“jПяЕх†EХШTQв  keгеrAЁƒ‰–х.Kф. ћъмŠЅњ8‹BЯѓЧа~–Y^Э -ИЈГТб?юQщš€Sк35Eї0aM3Жœ”PŠз…+ѓЯѕ/\§ВCи5'tEQт•@m1Ь˜Ž§oпбхЇ!ЉљП AЗC\ЈwайэFY5ž15Ьфж н[šЂ*н™žвУ,uСУЦe]Яџ’ќ[.™Lиl…Lџ˜ќLГ›Эє cцš*шИcŠPФ›M˜NмИЦ§Ї8єЕ+D‰/єœ$‹@дъљљŒЉFЯFŠЎ93О \ЯRщ“Tqаэќ$Пnѓ›CЃЕУ КщUа‰]-'гЊЄЂ–в4"H•&ЏDБУ ~’x~ь{^T1 Ж: Г4ž1јqшИŽnhК&ѓ<Я§”щцT‡“чŠ$K|З'›NЙC2)*[ЫЊЪ qЄїх0э Q&лMњКю& ъэЋх4Е-лаСх&ˆŠ"§ЋEнr™кЂ)NaиPЕdѕ,вЏ2§{8Ђ`GОЬ™a0z#Д‹‘Џ e?ƒ#эі–ќjDЙваTE’з5ѕЩяаt\D‚29eU*vв>6б§G с]лшs^фђЊЮеI!Ї4™ЬW“иV ш&K};+“ 1\иƒЕёдхWWЃ aEf4›†aщF0‚{TЪ™В]щqЭ– hкА!јЁгыКqPd„A‘+QMk вOЪ“0_Lђš$Cзzт ‘ža‰уХ љЖРЧаˆŽGdвkiaаяt:WMЪ€ы†e?ЄЏ‰C%Ђ„2УэZгЁ,Fа-цьЊkZ iф˜O Rћ №TN ‰N1€ ХhО|PeL’ћxe`™†в=?М‘]п•NЯє0‹eN3 БлVЦi9xЭѓ’бП­шнV) Ш”јOУfєяF‹*ŠVAЧH э8VR‚[LŠ$JЁ‹Y•qј–в?ы™žkі5Šoq†Ж,(.M."5І,I‹щ’‰ƒмi6Ђ9v\—мШњ1сˆџzє†ќ ёВ(Ъ†гBb:Чј{>N‚0\ 6Yjg`yЖxЕћUђCТOiЈѓ’–3&їO E€хnНФ}ьлyю + le(OxsЕ/щ*XЩEQxЊkFOЕZBИsZЊШ–§eqZЦрF4•юсі!чј”Э]Cь‹~RCa1MЂъ КiЗŒWmQјЧЫЊЎŠ\Пгъ=йNЄ((Ї(Œ^qђ^эz9%1­в0Ё3­&ВШ2tYКўrкю^эlяwMЊ^T•bŽ™PО^OС?льШN<НeŒ„wwudЫœjQШSИnG0žъ>шЕd8Q–xЎKn &PђХхœ–ўЈH“$­*_0š‡[_ŽїП6%CуEУЃB C~yYњ6г”­pж?№‰–žNБя›Д”Ÿ&Х48е№ Ќpz§I1eкЯgW…ŸЊЕr[шѕ Ух.6vŽЯЎ.Юn:žщB:‡.фoчE`Д[Šщ“{€ъn‘лЊцЩЈH<аї?ЄѕŸGkPgо Jвѓ%[ђЋ5-"€џ‚B_=…џўzуZq и`ЛйgžЉp—ЧCZˆ`ыЄœИž”š cZаYJO|ђЯ-€с?ДAў/ђ@Њ-;VЅPСІЉ† %Ѕтйьjџы—Н­гУƒЃУн§>%#JмД|ЉЄ…\ЊкoєС†‹ЅL>+іЧ‘ыБПh)КџЄеCЩ$д“ХО Љq8 5щŒv§`LБGC†CТ6}—’лхЮЦчOЧж€ућG›чі+ЇсKcеёV)ї[аŽ+h—.Ц _эИОЇ§3ь„+Ш€Р|ˆbЫT…Њv‰8ƒ6чt wžNЁ3V)ЫвфЮбЮцћэЏшTFЕvwлXhє%Ѓ)3|”њэЈЈAћНœЭС™[В ’v•‰7yІљућ ‚BOЄYE-‡Ќ–YsKЊ WГК&Л+Щ9Јhё5мWeўroчглН6' z§Asoыœ‡еусWє“ЬsМI}О—"БW‹Lqƒ—хЁшќ8tPЁl2‰Ќ0pMŠ"P5а=2иzжаždЌ“‘ЪqˆЎzg[яо~9Нn\Ÿьo}мщnH:№dЩш:OВб| џZмВ№I57ž€,ЩŠfS-lщ?­[ɘo0бL^Ђ гO^_`—œ…шбИ№єin[я>~ј|мD‘я6ЗЮD‡ЊnњЯ‘ЫС#JЕэ ŸСІŽ2ВA+Ъ$ƒŽwи?JcгЅjгŽb—щU‰#xЊЙЈмЇLГУЕG9ЊIХуръМйО>јМБёњї­Џ4нЋ/mе4С: >9іrEѕ Ж њН.ђыиХ”0%+IГƒР~ДFщ_ЃGH&/Sj8šІ+Тн&aе rГиF‡{Œ*Fcбьѓыцебж‡ппМџєсгжіўйЭщчЭ“›САл— к‘/hн{хУ|6›Чаr\MBя‘#ШХ+І‹эВƒ{Cеˆ'uN)™M ‚"nHs4ЅМBЈcF6; }‹ЌОК9џђёнЦзЋVЃбШšолxЗћѕќђЂ+㯘)ЅOŠЪ ё-иЮеДDbƒp/?$уЈ ѕ)VџHдk>ЃGЮЃBЧБ т#‚tВlМо9Э4,фNЯСЪЄѕЏ.7>l]Бm E’‡§СюЛBO= гЪfsJћKђ.ђ о  'ЃщC‘xF;+ф$tє АьtЛВŒWыe„РЁаЁ–НшХR„Ѕ2Vау&T ЅФбљ‹Ун­Н+ЁsгэЖЎЏЎЎПn|>ы ‡У4ŒoˆЂмkŽ]РйђŽѓEj€§Јu_ЇЎі<д„5 ЗТДBЬ•yЕ3e‹9Йхэ’ќЂ’ŽŠР&Ѓ‹*wtсrwkчJln\іЛџ‹Н/яo"iвєщц0`|рл–,[wIuпї}WЉtљ чЫoDš™пЮЮю ІMПћй эй eEFsе zё)Dљr}G‰ї0е…СO'œ(’ў7EтŠТ=y•цH'Џъ%№ рмqи0ї ЗwЦf(nx†a@RKbЏvПvxўшXV$њђфєr$pƒуЏaПпLeЭ­fА0ћcЯалАz.}ЛЮ xВ i!ˆъТ2žм­p Њ:`ь“™ГI{ќGнЬVЗKT~ 2№ши3Tв:НЬl~zЙwxEѕwЮxfpБћeowЗЭщуЫіUo*№s№5”љЦД4Ч&пыљъ2bЊ№‚ЊY!бУР7~bu"УRVЮяюБП5і МП]ЭQъž2žфEю2dƒOу9џВЛПџqЇ?<;и?ОМјКН}ЪMЮ.лcIеœИg&АQVYЭзпnШV™ &лИЗуXШщХŸЈъ Ÿв[dую N5LЭљUšУ" ˆ†ŸfQ”њ"sЙЛНЕѕБ;мнkѕ'гщИsАs~k“S 7У­?мћЋДT‘Ю€t-ЩЦ|їGGЕN”СтЉжХЭSEЯ†œˆў’ˆЂ{fPЎю}<ˆП_’3eь4HП‚х‘у„ОЬtїЗоя]p”qѓ™nйщЩšжs2 TтЁAjqtАzјыўР PLР7ЂШ1€і$ькЇш'сгСpаŸ  7ЁіЫ†_,!0a.ЃяяEшƒ?ЧŽ.ёь”•ŒИ№5еіUzАїюlТ —W,EБvг:ћŸv‡Вд@^аhXТхЌЮ\Ёw:­яяoч nUЁ~"ЄЏщx0‚C‡№ЦџЋiH%гюݘeF§бx„bЇ^AЮпЏп~Лk\VŠЪЬUE€eŒЩ ЕDШE`єюЇž N/ЈёХЛ›vћŠxёіу@в“й|1УЩЏ.ъТW†ЇpИюJ€еЉ- (Є јcJSc†уaо|чF$ЊrУVыКOakfшDHv”‰бы‚9Ѓь$БѓCІ3‚ДH Ž-ээŽ9vис[яі/[gg‡‡Sc№~{ й|Є ВсœlGймеюлmaЂИ+ИZУуГ т“ž"ЧЕ™е ;`ЮЯћЂрД‚тдxp ШРф2jяvФ0ѓ4EжPKЙ,ƒp†ЮQ_?_3tЇ;йћуѕЧэ­w[[—гЫїT…WИсЩ?R‡ЧŸ?ˆ L„ р‚Y@’ }зЦ(ЭŒG#ўИвЃЈNшЈws5bрс<ЫЩnГ&‡Р6юцоЩЇЃŽšћу8'ч‡Ў@1ЊЦMŽЖN˜ёљuын›оМњ№іѕЇƒ§“ ЧР"}мSCЩњYц0­УУ“–ЖzИ_џћžF&dŸЈнСГдpDБ?оя”2›G†,aЗfдƒј Ѕ+<Z4ЛН‡—{;WВOТВЎЊх -kќјыыУсхзнї›ўљњхц‡ЗРКŒЌћyŠI(j№4Ќ)}ўъ№ыЩљЅЖЦ~жФъхcКї^дБ@˜Ÿ?h€Yeсh*Я‘ЎЬЖIиHJБMЙ($oћ№Cыдd3§QиШ&iжГФl‡"лx^В"Хˆ›Чg,-q<ЫђЌlXaLNфed‘™Д>Мкмм|љт—o6?оpЂ Œ†ŸŽ'МWјTJ_%ˆ’мf(ƒLжJSFЖ ЩŠХўрš—Uр#š№Ѓ+Qа €cЫ:В™€'‹GA"р˜r‹/*S–ypv ‚‹ ЈІ%EтH ЙЁГ§ъхЋ­ќљтЭызG^KІН*Мз`rŒЇД№Сдњіўс1ќ7Eтg R Єr`IYXЪю rКiЂR|rдL›žАpч3OгE I2+,пГБ<е;ипxётЯ?џ|ѕfѓC‹с9†наV\”%˜l@lЗ ќгŒыћ;\(‹Yjan:M&cШсœъ„ѓу;M }нЋ№4ЖЌ›5й$]“},ј#ЃYЮе5$Ј(І“FŠšІ№§Г‹‹Н-p ?^Н~ѕъУљ`<wлЌЅIˆ™ЊˆЏn›щ Ё:юW%ЎžwЏnњУсpK@AелцфьVЋХK"ЩA&љQ њl6ы+KВќ ар ЇъІЩkpuАНwјyыецKќїD‘Эз[іO ›яwuЧЄŒыќІ›†c˜хf':7!qг Mї[чсxBњиќTўѓƒ6OeˆЂš,oQЏЌHУ Ъj<ш\ђПЃKƒх9+Cам0ŽРљИбЭйЮоeћр§жж›­7›ЏпМ†џМyѓюгЮчэŸOнvЧP%њzЈкa–јЊСџЋ\цбbz<H„F]]ѕЦР,tЂƒТ>Zрс@7эœјђ "rƒЖ&Яˆ~нр6А(єX TЛ}sБѓўѓўсўч­зЏ_П}ПН§юнЮсюізkJдQ#GЌdƒг5+y Pq4'qЬ”{ p ™kџЈЙCо‹л(+ŠлуvЈьФ­‘‘яЏ єc $;хф,б‡…Ј€‡ь}иmѕGНгЯяЗоlяŸ~~џeяkOrcР)YsbSЋЦрвЗXл„ЧE8PёV7]зRёъiFvXqЋїяP ТšЯяж=ˆйы%bbHŽ+МH”SїСУ=Ч”'W=NQ„обЮЧw;­!5nYЌ|?LPЭптa^6ЛEфљo^x:vХ7,лE!HklћЄе{Т9Јn…ѓлuŸ~2˜ iТђќг )CаŽ…—Г2ЃLі€–кК oьикД}ИћљА/ЊšФLEШурїa”ЄD"хž Œе [?ЏлjВ0Š’$ЫГ<†щЙОьMž Iьj~П4рwZR ЊY^Ё/,pš—‹я2|xњ‰Ј#OАT+a![.bлф;_wОœŽTЫёC”3Žт8ЮQ$eŽZgwЈсѕА^,ШQ@iЌZ“{КŒЅ}мѕEwТўјЮ˜`И‹‡Т”шN{"РЬY>М'VФ/HрїЙ~<ђє(~–с1FaУЦ(!Ю:Ќс8xЦ†*ЛIЩ сiЁtЁЪK`2`єЫпЪрT“цЃ"ЭрЄ5xBM‚`8Э*дјюEOP4ЅЙUEu’г-˜ 3ќ7"чИ=+жr@г Ыqл–†эЫЫЎhzžяъ Jш‘JYp&<­†oХНѕЮѓ|ё˜jчužСs(›Ћ }zи~‚&Џ;ѓЦ‘ЇW­1†`Й‰d<БФ‰&X‘PkмxСВFXОч9xД 3­3§ngЄ ’‹ЃЃ—чЁб@№„qзœдНСOРDKт^zaоћЈ},ѕOŸВѓi Љ-iвэP<Ц!žžBа#щyй ўО…1#\E^ф),5|Žут№< ЬГыЙЖe™Ж‡n—Фhм}DЂˆћ8Яј/9AŠ\7ШЪY•ЅXЬJwž"K96œКВaмв,ЧЇGYрф)4ЧХ8'u1Ÿ–šх` †DqшљрŽeЊнƒЏG7*ёo”SЂ…рБђw†№˜ЉС…M€уеWѓдГб’їЎ{5xТeQгЪJ[з&7}€[“)#PzNŽpS+‰€ЌЙРm2€Oѓ K<Š ђa–qЩѓGЏЖ^}šшЖыx­жaŒхZ9Ё•„Ђ5d]#Э­ПOyТъ!WЉР'Qхі) †•”!щбp XЁ=Vb—рwОЉЃї+sз+<Д%gEY &GїЯѕ0њХжЋmJЗ|2ШA/<,|TMSЅž+Ђ.БXЖBв"Иф5zњ”‚&ХєЫ2ИШqм”цy2МЄX9`VЅˆWЭ ШЭpЊfX8ІdD Ю……чСLЋтЩŸ/_|Є5ќ;ёfžъgfˆб3 oшhM#Пђ’/юЌ ЁсžАI|SŽљqМЬжtђд1P[žШкL}nОZ–@.и1+ )2?›Џˆ_уЁm–Ф)ІEпsг‚ќpітхŸMХФ O Lб=`ІЫšј0xpžеMXаЯqъ K 'Ѓбx<M€Ы1OЙm˜Q `  ŠbDˆжAЕZЭ"]т‰ …iYјЄджR@ыQ{ЯЕ€ю@">ёђЯ/Œ|uэ‚0IЩD#†‡гРDй ђŸФŒz§ЉЈК"Љ&бHxЇu=b8–{Ъ—bИБoроіx0хy!ч"ЄQœД.ЧЌ`ЧUиЌCМK‰<Ц›DišF(e‡љgрЛЌ"aВA=thј'‡ЩЦPНœХA6ч`ІƒГНЃ^ї rьхУГw['g7Ш.Ÿ"}Ь€uHЪг›А;Ф›xulst/ЧŒ`‡Eс:A‰ЧЭА г8$BfxUцZWeёќЯь2ŠЄ›Ж 4’8,ŠСvЌLЎЯŽы"аXzдо{їЁЭЋjФЏjW˜сХзУkVб-ы їG†a›Ј(;ІРf'“ђLлPИўЩ рбђŠŒIР`<ЧˆPFВТУ p,рSРш—юВšj˜`3"*@EO pnп6У2ѕ žЃЧ{{}б+<Э­|˜šоy›BХг~’`й3 jњ9Р„њИ.єП\б,+[nV8ЎЭцИгvg%˜9&tРЇХѓ›ь0XДьaN-U|Є8ЩГДЪлє‹дУuШŽлg_Ž&В™р…ХХ,sžBmтРГœ' я&ѓ# n8[п­JтНФѕЯvOižceУNt5‡$ŽOR№ƒ=XІJт%,Ф]ZFэЫ‚чCЮq9Y•|uВиЕe,Ѕ'Нг+VЕмГ#S…ЩJ!›?щ Ds, ълЛeх 3ъ^Ÿ]9–—-гI" 2vод0(Txвl$OпЃ[/_ўЙЯШ2j%Y T’œICxЧЅX…А<э(Жг-pУбХ ќм”ьAa Z…GаŸbєЫAђУТв„ mјљгЇ‡1>BІ›рЅ<І ~ гˆUX`RšО%ѓWЏ6_~e$ я`сcнo…Ес8чБ ˆаOl r цšщžїEХ+BЩХ‡:†UєDЃЭ0!€?Чž)_}>ќќЅ= Nв}0:чРH]cr,ыaB/СЇШ%†ˆF2ф“ и ѓ ~_рЙX5K\@нЊ;Ђl!.7Й<Ѓи)<М"ђƒД*Ђ'E2TгђгљэЂŒЫPЈгнЇxzУk^шZNУї„m%рi<…E‚с#JcKКzГЙyФЪvьц*ђиє №ucнРвm,2S№ЊKїАУf„Б uрm“lч‰—ўњКэхs"іІЊ†ЮЕЖ?]s|7Ž<Ы }7Ў ёЂ$),Цђ*‹B?№ љъѕЫЭZq’0€OQ’3|ќk˜ux}щ™жs™*OА ЧOЧœšƒ№-ђЄІњЉYЇрЗѓUƒJ™SVQљс—/cеZH – И(§0Џ†Є@X!!ЛИЖ.Е^mnюMU‹ММBпџ›yœ Iz`ыВ$ЁgkЯѕїŒ„;@АUX’Ў=ѕ‰hИХМ MU^ѕIfї( И9 84єЏўza уХ‰4­Ч4XЗ СY—Ю77_ю`‚ZœCЃЧЇQ’'@МBм*БC5УРв ЎsмеЇ§.#92„ЬUАJєЩ…В&з;?я2Š&žтLуђєu BGрт­Ї,ф Ѓ$0K,ЮІxђrѓХ‡ž,›.П?№‡kDђЕиTм‚bљІŒj›ьфјэЇ6#›щ[Вdž.џФuaйvуФехЩхIkШCjioЗёX@dž'`70кѕ|DX”3œьЁž)Ом|љЎ#sЊяGф8Љ)ю'1~Ф ВІм*аUЧ‘ЭA~Йњєъэ)%ja•@‚SпвŸ^Ф45—o_] РЇUёrkЇGn№ВуТкtqВl?ЯXZJ‰чж%И‹kˆ/_НмКD7т:Hђјј…tРG!fЫєTн3БІ|:щlН~Г?„YЄ–jX^р<9HУPuQ7žp2P6ю|ыЭЮ%ХА У[О†:РЁяyif„w˜aЦ‘@ЎIк^nnnО>‡X 3fљˆaЎЃ$qLђ№ЭЎj:GЃюёі‹7я?ѕxеЩsKрDЭЖ­ŸИ_ФЉx-N“y˜ZU‘Ї‡[oЗоД{ƒ)oЅС{‚б№o€3 ѓЧ)nЧTUЛa!эmn~ЄР:’ZРd„‚aB^йЄuLІl*Cѕ‡Уыу§/л-N6т"P№€J–т&зpт5ї aАћі§лЭOчН1Э›ЁЉyШ‘Г)<ё”pмЉУУ9-ЌSњулk?uЌœН.’$ФMS ]QDс‘JBЂЕCСТIw@ŸМ{ 9д‰БМ‰щгm† ЇЂЬ.)4%ЎНwxйgh Я<]#ЎчтMwј=FSRтк$5І:яѓ№єа*R[2аЅ‹8$›ІоЭё2Щ-АCS"+№Ќ œnНо’fЧ(ЄЈ*ЪЯдPO]зDTЯ%~t|1fд@хEAБ!ФЖƒˆ)№]$Ў0ЫјјaЦ›ekœTёu/Яb Р;вЇРЪ1rр&”cЛ†с‡ž*Р&w?По>q(€š&PЭŸjГТЁр"И4/№гжб@%``І„– №ќQs&"1nQу№Ѓzе„2ЌЃ ф”"ЉxГ&њqП9€oYDoЯ1mаiфйКЎуM[њтуЇ§ЫУУdiфќœб€Њ9oЇ—?>Ѕ%QљDЖoћшšL6Ю7nš‡˜$ЃrQ;$2О‰ї~НfžћИч($є№ФР5MtзГ<–№|Bч„JС_^їБxиёЌŸ­VяУЊ„ЮŽ;‡'S еБiCУє†)Єaг›;8>–рƒYЩl‘ы\ЏШчqГG”§ЏЕƒб№їЁ‡-Р›с19ЁoG "ырqСїїОЖonZчэ!ЄVџЗWЧг)=ЖvПє\” “цЙРW<мр5M'ЋЃЄ˜ЯBy№ё€d—ёx™Зk€0ˆхќїљHxwmЫД"пM2_@№X‹cЏїЮ†єДпОИЂD<ёЇm†бЛЇŸ? h–Ѓ†aUТЄBЧ†€ `|Hw˜&Y5_VŽxѓъ]WЇSEьŒД )Р#XД–mZxIWЁi'!јZфژФi–wŽО^бЂ@[чnn§Ѓ7КніСіЛї_Ю.л7У)ƒrэQф0|Аи0aЂMУђу ЫuSKaпžЫвu_;Џпu•{v…щ0 ™шЫx7Т x\№Tм1нœэю|m1Ј˜ољЦzЦ–i#Њ&1<к2†™Ж ш/ clhЕZ5Я‰њzЬ‹­ЖШŸМм‹V^уеђФб U†єь€w8Ž•˜ ж›ЁЈ›ЃээЯFМ$pЯмТpЪC№7]?Œ#ЧЯ ˆ^І…ѓ ўa@BYЯV@ž–;;хјЃэ6іŠТв:†Їi&|@<ф0ŒЌ‚|1Ч6С§9Кє~ыѕіљˆуžДэј?1Ияв.,ЛМN`‚СEа; +šЏVЅЋaЊРMyцјц:-JU+BКы:М 8СЃlгЋJHщx 5з%Оол~ћaяєњЙЕ*!oсхž4? “Њ Q ‹@(tёfSb+<фцыХ1/з™`u“š2<%xЉу иqЫ3‰E– i "ЯўЊО–бyRЛФШIQьеФч 3m†Э|оxdЂ%AаŒ4~ŠЮU'ЉšЬ$Ь6 'Ц>Rq у­nѓня~IЭђЬdBгŒ`APЮ!›YЦ;УАѓѕЂЮ,bГЬ‹n(эSŠЃВT:ЎbKТ† ш@QЊ<‹}ч€tћ§ўxJгПLЗВC,У•0Щ‹2‚uгgЭ-^ Х›G№Ќ•0VЯ'šЏУГeIв<IЃё2ОщЄГEФСSсб1T{wїь†Т{SПЊOPЯ5'№“WM $КщІ‹Eщa+ ьЅ!XiЌЕOi#Д9М Щ@ ‚<…аBЌ6‚rОЌБc“.УGф'Ї_.ЦcH\ПlЊY–#„НHj9[АЌL/­`ре4ь˜ ЊQ•7-жHb %W%МєцxЋЯдёхХ|›Mр–ЂJЂ08кп;О1’jњхтёjVАЃwЗ‹)kћГHс†;[o& vmЊ№nјЃчЌрїпОС oёъ5Y№Х2їtсYcЬущ3jюžw'и_Ё\`I/™/4+ŠяЇpЕšчВ§ЗŸЮийKѓБQ$& ;є№gјѕ№эm†йыёлeьЈм }н}&№!bщІ$А]‡,Вйтq}ннЃбš;вьg͘7ЃYъыжЇжfй‹ Т">АьНУ^Fје=ќў~Oќk9ISд”~–‡ЕчииьJ”Јyq1п EНшпF‡ЦЖ\Ь|‰ЅGGя?w№ВЛц’[tЄНФ§§З‡oпРрoФ|тMпПўvПžyт3 5 rхЧ­.№YпЎˆЕdё=к•Vдіощ—Ню„f%;Фѓ –ь_ѓ№эпўњізЗoФ­сх№ юсџqТпfОыи†њї[їВ†цх3,MУ‚P\9Зп}~Уw'жт/0оЙ DzвяœУ:Єйё,ЌїВ>+ЬэУ_=ќѕoh&^ш&ŸЋеIeсbЙЈЫK7џўT+šеИь№њХу‚{ Ш`šёэёAУƒ'xšTчшёЛаЌb9gY^4тf§ј!ЇњЏoЗkвЉы~UЅžм`?KШ9MlЯа$™U ']р…ОШѓВљ-Кяї4rGRХЃйН5ГYс‰ь”Ђ}t‘\*Ž5™c+ђrтЧї$n ЧЦK]ГмЈh•ї3ЕџuˆК4ЋЪ7€61X}џИіШѓўnК%,%<•+bSт ВЧ4ƒ5UЃ~їf0сь|Aќ>3q*ј П}Q8рj@R'цЯ6~љЯcЊh^Yиš@M%нЏp’7DqO& BТ_l3А?/р)f<Т§ГIџњІ?OY˜jѕ№СЕПсeXИ‹2ФVеXЙ,в=э™к~ЫšклыГŠ–ѓ[œхћЧ7‡)'їэлнoИтVуЛІ.2ŒЉбMыђzHAn”ƒйэ yDўBЙ“Б@l§˜а!RG:з9<ыtћРгЛ[[——g'чэЮUsФYЧgОЪбдhЬШnЙž'–L~Ѕе C3 КiџјœUU;ž‘ыфїфялн,PЧыNћђВuyВѓvcууёEыќш29ЋЯюэ21$n2R‚дѓмUЅщЏ6јї1ІYŽo & 5Р>lac–Й­lх8!Оol|9:П<=д(СОу*ФЦЎЋH^ръџЧkф0ŠЂРV~EЋ†';юЪQБКC5яz^‡Ж"™IHџслdzG~†=œгШѕмUэвПбu<‹cЭdЖžзиšОlIvѓX ЁiAфаъЎ•фUYcЯв<}Ў ј?5І6оRˆž1гхМ@Н–я1Z`Wж*е‡’яшџЛYЂ ‘Ю–udjFВЈ#/ЦЖНиzПЬГ,vш›^Зwyв—T~д:hq5›7ЉЫŽ­(IќŸh[њЗ‡UфљЩl9Ы|;nf)ЖšЦОЖyŠŽъFЇзэœŸб–eщtЛ#'Эb^Хжh`ХГ&ёитIwЈy•І•дMS€ŸЬ2в*IXКЂ…XЛ9КМЙnŸЕЫq-‰fЌ|ЙЊГ@ыQVмЌfiш<г5О3Y1TŽЗгВŒ-еŽKH™ЭK”cАu‰eй)%FiБ­Nћќш’тTлFёЬjЙЬ}SЂ$Џ\­с…ћ•Ar–э9 ЇyћЊ …еE—+ь@УЛC^7Ю уHюt.vОžЖЧ бфЭj™ZЊЂКqƒZО‹: }цŸБ™5œяЄЪnж”‘ЮqZи}7Рмž(Ц@„™|`ЛђљrНЌгШ14QќХQO5CьЌ_GŽ<КNYEї+ЂљQе8JА9AЅ3l†kœŸъžaи,ЃJcЃ›Ѓќ)~ЯbйЄОЅ№ЬфЯŽt0КžЁ‚!в“щTPœђQEDВ"Gэ>гДН ђlГнбН(IgM]–U™Ё№пrЕў.ТЖhWУжТПš„ѕeеŒб†и5e^1tЫ‰tNX^(Џ‘кеeEт8# Ѕ5Д‚$Я`–ЫВ(‰ц2^тЙ[у­ЃUЂ( ’єуJш?5ЎXI Р2М&FCФ&к[$*”§Щ!vў0„!рVGИцP(#LРзС!šі[пЁVaэ+Ђ"‹ŠЎЋт/\‰§ 6†•Ки~MГ‚bš{ЈеAdЮˆPbћЦ”q#›ъ>ЖQ'тФ'–s"u‡ЛVЋЦ—Dќ)КahмЏВК?с гСцЂцЄ$ЋКŸУ‚Z-Аw, IV5‘ѓЩƒхНРЄЇvЉE&Ъљšˆ)iR@мx‚MUQбh]иё/ЙўЩЉ†х8н\]C 3Nа4VсœШI6$zd1­ШГdNтb Њ1—Ь›Y‘AT.WЗx›nН*m‘—DfћŒ~СwN7m1О…З)DЎŒ„њЭDƒ/Ьtцjфak­ЎLЩnœqE'—‹f–yІЯаhМхЕšЇ†Рc–eh–?ћЅUJC8 /‹6сЙ)ЋzѕšD0’1ђ<'DЛ’ыРсЦšЇŽ— ГЃ(_“{КщAm–˜ЎЉТзxћЛŸ>{ь Ч=C”в›БW„IЄЯцфž„тТ“Цз=jBn&vшL‡†Х†FzdћQЕОЬbCЫЧЦHРŠавQГFЧЪsw • Ы <Ÿт='ь†Э%МХЅ"Њ‰zЅОЉ“›Vw4‘§РмшnŒ„n+]Ќ—‹2іМ0­fKЂ`“ ЉД@Н”( <ЧPŸZK–эРO9BЕaшКщxQЋ ў TU†}ЛЙіЋXž­u.7Œt'QљЏ—Рp*@„ѓGЭ`ьŠMВP›ЉШ C>/б…Ug[І!K<Ћ`Ÿ^?HЫіqУxWЃFbžƒЄЅQ7МсК†xv!Л~– ц…є|F„TБM88ЦъGеaРЇIрЂ„bрЯКaжŸаЖ_е$ž‡iŒ т–ј„WsŒhѕЃbЬXhЦАСіУKй в,OBђž шB:xCFХО‘їА-k\H1 >cBПІЧОUŠ"p‰тшјг1o9Ј. гЉЭЬ(ВЈкQѕЈo§r#K˜ђšЊЉ2;ьqšі =Кpt&’fЛ‘š$ХŠд‚ЧX`wТY3Ћfu@.ЉСpLбуЮeыњrїxЂл:St,?CTz;‹ф›№хЎЦ‹˜k-Cх9Э2єgq‘MЃќišЈIцDеœє$$tzљ(u\С*„ˆ'Ѓ`ЄШвшhї№ршјšhжp‚ДШbЄ(\“cT+^ЎIПŠЛefТ4Иn Ь6ЭxЦsœз Y`ХrтЛФф5Nz5Щ†шб€–ЪФХ;žЃЫєХюiыњЊеюL4лK™b&‡Й.=“‹VВФvŒЗwї‹H їˆ?xŽŸE†ќїнК+лc)ZRБ):ъI“'‹эy‰тј|NKљHqQЧжЙойбEwи;ўzЦ™Ж†qœ#№†€WЃэolcгЌ@ЕсЇШ‹Q+ɘхŽ"ўmўХЋКЁ “сTTŸє пlMтеbE$У›'уаZписХсёYћњтѓnв?jфИq…{ѓ"і zŒMTp_ З†šъ l2ŠЭЁ.vVј›6гВц‡Ж*pЬ”EЈ™ІW“Ў ˆw JƒбШ‰h#DаRКuq|rАЛЗГѕю„ж\<ж ѓI@“QŸPфt˜ї@дU8ў%Pпзt‰ЭiџІ[sŠ•ULŸФ‚DuеoH&›“m"Шpе щQ†4r5‚mЇ}~x№egџpџѓ^O2§  6ф"DЇN%т Žv‡ *.Рн"Q‰ъМъvџ­ЎhЌЌЛ5 ќ„Дл”P"KдВ%Дjs.pуЅFІUЭpЭŽoкчћ_ОДК7“ЯЧ46~C BTж%S­@MЄ№№Єю%йA­3”0ђCy‹§П­СЌW_S'иf^•И)Ї„ѓ[мяDЕbxЌ˜ aŠPP`˜)5Мn}о9:аєtxИгЬ0‡дэI ЁzQЅiMCЧf–пŸWй(X‚Z€Ižlџщ NС&й№h!B”ъгЪ@XdwЖDњ(mоDГШ\™Ѕёъј„ъž~љ№хш’b'“сСЛ#JuТажEvrBЬъ,0єиьсwBРз™­ЉŠn;ђЂ<ŒŸžъОЄ(f„фЁPтЃЈЎ€ЂlxtzГЈ є…`-ъucšЁћЧпяэяu†ƒохЮЛйВmN(ССˆ{3 пgФblП9Х&4DY™šє“'v@/7%тДy–FОЁЪ(”ЋЦ/’ю8е`ЗЃƒіѕ„чИўсЧ/‡?wB/П~<šшІЪOЈёpЊ„ЈлDЯЄQЗrIШъіЎа"м тўOУ3§ЙlоСЅˆ x6˜DО…˜‰dЇКНЯГд5€ŽGї(bKW#Aф{_?nПл|§х№фььќd{ћœBY7jиѓVŽqVТl+ГFВI"i”PŽDЗќ$wтŠ1ŽEYѓP‰#AљѓР.RvЪ5ЄЂТ€лŠUŽ[0BSaћ” в/o^НyџсУчЏЇ­ў`џэўewЪP0FS%Њ X^AEТ9йФ­ˆЅ W„75г “РжЄŸJ1c˜ш&ІЦЭђyІ"д|~{П^т^UцE™Г]ЂЇ7>{їъгYo4‡б­ћ~чЂЯaЌУЅ2PƒкАрKвoT`4p‹Ћ0K|ˆŒ?ƒAЂleš‚pŠюЁ(zи ЖУFЫ†(|e‰:у€ [MЛ[Ÿњ"v˜>лпоΘЪ,azHЩрдхЌA‹>8ЄI˜fˆ!•%єЬeн‰Ы*udљgJ,F’ъУXуЎl•СT[Ж№№Цќіa='›в%~ T Ўым™ЩdмкљмтGg­іХY вљЩ—э#J6t™ŸєІŠп‚JЋик|uћэсvЖ}™зЎШQ4кЌ™€'ЋиQ”ЇћЧ ЯШFм,Б№нzY‡„iЙ  {‘Џš' f˜ЄC0Кpf2ьžьЕhњјуQ—šа“›ѓ!uМ?– Cс‡JВ+”јFЃkЄ‰wЋ9МќР™Œƒsр‘ЊЉЩвO(Тв"џbОТЮЉЈЁPVs’М`ЌсСт2$Кшй|їіzмk ЙўI—т ]QEсБї]лq$I–ќэ" P€A ДFjZk­##R#кsvігзЬQ=ггГ;MАСъ} ST‘H"-=ЬЭЎЙ›пЋВЇ_ZМЂ+tЋЩТ*—Ё!z +ђ=жЦГхjlђФ5l`{aƒЩ"ѓьЭН>,#Ѕ–f“%!^ъ|bѓ kб3*’С‰Ќ5d HbњЫЃгі№тZVe™ŒhA‚‚р†–PaŒЬихВЇU•ѓѕуУkфхЂ0eY6LqЪ8ТН7њљлЈ”Ј@jQP™€Т§ѕ9fЌАы9юкцcВ) и}\Єq–щьрњlїшdїŽЇ‡‡ЧчžОИІˆФЋюerfk{’ЂVЌПGzvдƒБ­gЈџ=.#зѓwQY(XTШЌQ;ъц5ў]—ї€(У„-gY’Bб8^ьдэщюЛїяОŽК‡ŸЖv>ooќtм89ъI5ќїВ'd1феnЪг‡п‘:Yt“$ЫЋ*‹Pџъvє|BžЁЌh`23 IЧШ›Иœ?•…ѓеz‘™@NpgЄ™‹ђ,ДTЭёКyіyуэ‡›бўібuЋныоюјДѕщВ^ŒчфБBЭc›iœь]ып_BzY eФ|ЄLƒ'Ќ*Њ ѕЯѓЗ~‚ЬC>шЕn›CQsг ŠєРBшА€‰БŒ™€C'žmЬЯ\Utп`ћ—Ÿоя]і/vo(NNPч;PР е)&(Е•—Xт$RїьЫЧ-jіјxа9ї‘+Шe.ˆH+K7ЯЏ[CšЁz­цэeй@QФЗ[цXйЮ3њІЇЦ8…;ШRЄа”l‹^nщдЗ –ъ :Э%1чпŒd#“Aх[€з6uГПЕёлUўА^lBЦіХ$ї5žЅCŠЂG§^чІљ,zžЎ(pН›Ыц`и ћ­ж€ЁъТx‡[ш0бЕuu|УEи*ЁЊи_ќ УъK]|>eХЮбЙ:Пk4›]Zьэnž0Š•“FlЋЋLэoonМ9 Сщ№˜зтМJ`І†ІњэЦейekФ=‡RDљYњюЊйЃPЋ›бЌ %3 Љ<рjщјлIп+"KCFлё83Йіu_Еъђ!}sиНкњДwќэыощ џѕнЕЈКe•zŽ e9д<Љtѓѕ§лЭ­‹`ѕАžЭШўщ чЊ\§ЃжеЩe—ФgРQе4MІšЗ€td@ <Ы№r‚'ˆ;`RjіpoїJ‰‘D("]•ЎдПnёКHнь|эŒNvЗпМyїnѓуЧ­ƒ“ннŽ †" `уt1­"њdыэлЯ'эxѕ№АР}Ш%ЫАЋ,Д!ркі€т%ёћKpa[W„оM‚ЋЎˆ(=Љ—И>‡ˆPrТ|нњк’ЁњC,1­ЪФdšMžЯЭћ­ЛЦЮћїйикиињјсѓбUW0у"2dŽSм№hЉ|нќttоŠ!Н…ˆ…9nГУЄдЉ-ѓ4Esїдњљ] ‚XВ4ИЩŠn Z‡Ј"М#XiКК_Ю„У§­ЧC;ЩАв†r=їхAk(ЩєѕЧ‡Л››o^џЖЙНёvsћД1фT‘Г%Р€JёnтЮ>mlŸ6’‡Ч{вbCіиŸŽVѓвU$‘L•єнЅ" хlт*€щi”у140нŸ`‡Uˆ9|>5/іі.†Ђn8qёt^›КBo(Ш\{oѓнлwЏ_Поxћц#”-Šщ%y`ˆЃ#Кущt:іфсЭбсХХyЂжЖШS, TР=•,РRyхПЗъ’43) Р$-@Љ‰šq!р€; к˜пЏгИѓ­!А Y€Xi\•ЉХ@”FЗЛoпОп|ѓц/П§ііx$ШVŽТ‡ 8G ˆ6† ЂHУцХ9]6Рb`‰‰ w!ЧдЦ2EYЫя4Zе >e–"Б ­kК—ќq^8УЮt’Jjrƒd Aз.Ce4т%fx§iccsуэo ПтDнБё, Sюр“ТDQDЁuЃЬз ’Бp:f_|лЖ\@“i˜№цп{tЄiV9+Б1aЁвдœlNN+чЄГу ŸњјЎ<+bYщХЛS ЧвН§w›`5§nѓлPT‰ч7w]ч9ƒ”$щ{Ћ"ѓ{№Ых†E(pU+Ў&удЗUѕ;§CжБЉ#Е5‘eсљž|вЩY,ё;ЯА:ZЄrхЃ{Ј‡ЁЋRСˆj~й|ћvу-xDkšeЈСрі’ƒ" Šї<В$Iз‘QOгЭQяAд.HiТ'„<Юѓ’юЦE™zšўёC2M;‚\р r щS’ОxМ‚`š ъLVq‰3œЌ"Ф‘ ф0LЕ{ru{ЕџaуЭoП§іX‰›ЛWvГе8khA^цI`ЉЈ ЋьU-'œ,жЫЇmБ O4tb–Ÿ Р;ЛAр|ЗбЇУ-ёГCH›!ˆЦ#NтX0"РŒщыš ЫAЮэ 4% ~~tњq{яЫжЦлзЏћэЭ›зoпnОпњњэфњtяVёB$LЯѕM3|Ы‡’ыa…ЛzЅЏЋDA€Иˆ‡ юTTдеяХ#ќ Сєщт)h`OъЈСq!“†:&9ЕлHК…2!<д‡ллЇчЛ9оОy FПyЛБ‰; _Пьž4uЩe(nn‚ц†Ё'‡џ<ЛШТŽ dдhєЁ*GjnАЙХПзfYЦl2Ую†2 }зvУЌžц9і=оKMApъiсж[G№"]VиЋЃлЋнЭЗo66Рш7o6оН{ПwИГs|зсi“г ‡k qQ†Ќex0'э*<;Б Cw.фЛgЉnoРаєwo3ahжМjЕЈRXPЏСr34`™сЎL~цШZHі]Њ2O#nw§аоžом|џў§Л;`šсvіі›ВхzA”ІљИžM’jФ„eЌђEЏрЛХ2;ъ#??GЃсiф3ЗzGЬl:ЙŸ'6йrІ‘AUPэlњGdBoЉ  '~•S‡ЄAuЙл;_>ў|вєПЕѕснЛ­н3Ъ№А‹=I3”ыa#dюaЕЦэx8гМˆЉ~AесYпžо=CЖtd9QНXЭсАНLЯу€a#щ§Сm!ЂЫЖРž+ЈiУШї\Чq<ЯQћч'gЧћЗдрьгЇнЏЛлЛЇ”ѕ$€•ЄyF“ƒ1ЬzX O'0•#A=ЖњxЈ‘БРu,7Ш ІС>М?Ў',P§ЌЬbˆz–5Ѓс8:sЕwpђэЫQG†?@–0lз‹sвTSAЬ$РљiU?ЃйМŠM А“HnѕошЎ'Њп?г’Ю2CКл9CчАP37#Ќx‚XŒєион9Ё5bŠ П…QšЇ†Љ&н‡5йCС^N<]ЎБQ.Е$”љVu˜'Yњ]Ny†D›щfОЁv/њ<Ч0# PGSМьNц|o2оƒйr6ЦЛ"узa’реNˆѕmЕПѓінл­Жг|‚t’eИWI6MŸNИАн/m Ÿ84Дќ=Љ$†МњЃ’л бgиAЗЧHет!љ|šКšРp: єЩИ$‡/Єp\ўˆaЂ]ЧѕСHS}ўmуЭ‡д‡uрyIœdi†ЇJ%xіфEXЖF9ўЭЌrecШ<@Ї 9тћл с­[хPх‹ъhz€ŠЯV:GэYnаeE;и‘WOиz‚-н0еb‚@ЈБLEfї~л|Н3„Ъ ж D№0‰у$Су;Јпбц5DьIыРЁњGњљ,З%žіК€ш!Ц?ЃE™Г\ЪJСVЏнjEЗгщЂє5itлфx-Ъ'г<­žжnЮсX .эžcAy)ўeуЗ=FQM–aИlNЫж"ЙЬ0ІQ џЮй^{(hvs=dІФ!3ћh42 5zN[Еf"ТќТ лЋрхJ|цe›хёч,ѕГ)9-†ш :ЭDu\лTёфЗ7Џx˜iЫёс€GЃž+‘Гіyzх$Olы_паPдUи’˜PуЕ§^Џлщ>ыќSдmЅŠ,єЏ#вE\/чeh(ТшЖ1т ЎѓiтEѕ’єN€oрEе4Љv]с“јГзЏ_ŸŠЊ3эnсSAЭ^цИз ošЙNZЇЁЩГtчxћx„зw0ЌDnцQНЛЋлЮ}NЧ,­c4рвVƒ$у ЪаTЄбнMŸУн-?ЏBL’ИOS`kfŽЗEqtВ№љызo. rдСе|‚№2’‚вМ,ё&RhAѕ 5#Ь+лкй:…Й&ˆlšbлн89эp’f<Ї[EУ7–YŠ•PŒЙ\,ът‰DнпQЯ*Ž›ЎыE€І!p@Ќ єduр{PCЈhєл3X АЬ,№№d^™Сjg6­ЄN|G„…и;мп=cTїљг"4dЎyбцP.бyЦ\ѓ€!D–7qМtВ\ŒБЯYЁ›—'M€з<И|š:ЎV“’\2l?A/ХSТђчЏпО9МA:БI6СжН<‰HшЋШ”б8v<]„тИysА{У*^ERњ%Ђ(A1ay8ЯЕ…в :”љХl5‡АЙ|xwнИыAL‘Р^xВО–Sn0w%іь!жУCt‘х”ˆЇ‡mгЋcLтxЯВ}ŠjМ${'IlЯХН†\6ЁЮ НиГ щгwЂ8Аьghч)ФVжвгeІsѕэИIQЯKf`ЛЉoCPЮ'м0ŽсYР$]0ZМлxНy€е4qrмb?YŽN]W!$J;Œїкš$G_vd#ЎЇr—ƒДrхёЬ tЌІYN\-ж‹Б6_|ўМ}ŽЕ'/щA_<сy9vСїЧЭЩ„t`Ѕ TŠиzџњн•ˆ Jˆ$Уџ1iб"=|г:Тью%Ž`#ВјІx8’œrђЧЅˆч“ЬГўžт Щ2ažчЋUлйџrДпх9HАF‡Іуuk?ŸU%Ќ@ФœѕSџ&xx8PA|ј O-tЬ-INB"olХ)!Ц.Єw/v 7є!ыcЫЮнюЋxѕ(LэEЯь™FлvPL—Ы „:zдЛ8ќњБ 2HŠиД!"‡Q˜%MБc‚чšГ$ MЙ§сѕћkIЗрEaŒ0 ПŠыТu9ћHPBж)L6ъіО|nђzRЯ!‰ЩЂЌCЙщXЯl+dС&˜RLiиъѕ/wпŸВ‚ ТК ГиД"$КВL ьзOІи2­ D{%З?Оyw!.ЌІ0ЪЦшЉ3м{Чˆ—•e WћŽъ@ЭыЁ`;:xwFЩўяЫ,-h†љьОdк…uЌЋƒѓуЋыг/ЮxQ‚hйAh˜Ј Ђк”šœaE2С ˜:Ѕёўѕц)oB6Œ( hЎ+@АY™ЦyŽрЪЕGЖьœ$Ъі6КМаЉФHЭђžлшЦY^Z@н#єO>яЂRйЧF5]QT;0t˜Ÿ €5–чј3ЮВ’Р *‹\ЫѓmѕfуѕлoŒ %о (ёZ-ФЄJШc№/tŠРѕеіuX)ݘлO›_šЈб‹| А*x†~v››d9ИВЙлНээнУ›лу_КИaХ МёžjшAŠrМ)@ИЄ ЄŒ  ЂvѕіѕыЏCєЬ\К"6gиvЩь8^кŠэˆ Eс.оўцЛOWДшŒБТO]Ј3ŸЏb$`БgHэƒЏ_Ўz‹э'иЌ™@p<У{qk&јX)ХЋpИиъдcMTЮ7оМощШŠKУDOp' 2c …YA>ЏiF–ъZ<няЭУ›o7‚‘L*МГс,ЖбC q•Ки?8и?k Кл[CЛvLOзMєiˆ!1жДiFФжI)dФЃЗoп|И“4’aNјт†4Пwђvаа}ƒЇ;э~ѓxыЭцћЭ§6Роqр”@ЅљlЃQ.гP˜ЦйбЩщmoаЛјДЙљёыщ]o@q†o˜раxЕ I†Р4Ыsp‚2/3Яг^olМЛ”t>і"УbM!Ў$€O’аpqIРOЭ –ъі‡нѓН­Ÿ6?пВš[ЖFфpРhZСгZЊ}{лш `*>Н{џюэЮE{ШVЈ[1^‚ќX9ДŒз˜бC ƒŒ“ ђя>nМ§а„Zo1@~‡ Ž#МО/ѓMЌР`јѕMŽЂhšю6[G{л;WŒbФЅ‹z€в)sЩyvаjЕћƒЮеСЮЮСJB рњФXE…ј9‚ВЇлmœ~=j фPcEA6O3Jж#rОрvИvYCД.LЮЬ+яђмLSr0o—ша0бИДзЧЋх­ОwБ ž=§№ўУAƒЋЃ%ъечРвџАZz4ьїЛ­ЋУНФ:W BЁЉYі:‡Ё‡oЖБtœ”ГYh`ˆtР–yЌ ХqF„˜'Мщт…LЯєz оgОБЛНћэЂ9рeнKbKдсбё“ ]`†н!я€w$$m‡IŽцšL0ѕлŠ$јPR7.)AтGэ&Иˆ‚‡|?jєЋ^П}{~xАНлС>]Xч/ЛIшЦ%LЕm"–ї – pВW.&xёлЛ'ъšШ7Ю)k<Ї~6I№BH*6ќ„1vќШS9%ЇЁxЁЎюXQЬ1hмѕyхЧЈџЫŽЈсpФА‚цGnPf0б86˜nšЏr<-лќХ›ПRВ ёђ|ѓуšTxSƒКm`/р$7€S(#№5 Ајрš'лДLѓ›]_ФцЇбС.žw1іqїо6мЪЈеwЖшу7;№цђhя/oЮ%/Џы ,-јp0Э0РjПŸv=тнАyqИ№эл-ЫЊ(Н87]Ÿ*бпKЋиxВзЛ-;%›ПЙЏKтрЫцф ЉЛѕ?>5EлкЦ%i”_–i;xœx …"@ Uр™QыrзС~Kх‡КНџ›бaБбеіТ8ђТw\tг6ŸФм3<в(АGфя>QдPlОпМ`нKБ+|Рт№rTЋ‡ЉіЦuŒе*"Tїђло—у‘}QeЭ6'Hš…žФaTд1žф[ЖУєŠйlQEž єљй`ачoЗПѕмrХ}КБoрхmx,–с8–7™ЄP‹йШЋ №гo5ЎП}9nбМРО(З ‰ іIВsеуР2 Є‰СЁgоёТДмnRн&п>i2<ќе- B M“,YШаркщt 1HGx,EqlчpїЈЭp/+0ЭђМH.6ГTЌI5УДА%Тt‹хrVP‹ЊЬмˆ‘КЗ0e#вЦ"qѕЊЊ›xZ†біЋy‘D&іЃрЁCбDЛюб—ГMНшLCЈ†ЕNh†г§8.ъ<ВС ЫДТ)кlŒŸ$]щtGбEˆ‚$KЊ—WeЌЊКŽоЮQЬІYъ+<юљЗяюкVFўЮЩЗЋоKsv{эЮ€aС(? уЊЪ h‚„mтeВТбUMУвZре ’)Уг90ZЃMHFcы 56žIBQхAІщоеСў--bcМШ§$щеgЬt˜еUц›švTaсЏ)ЊІрMmбЮ KtbOfёД я79љ4‹q%B-! %БЏw5.л’"a?№bœL0Еtћќыічннэ­г8ЖЄ">‹0чŽaУгЎ‘цHGЃ%0Z‹ъЪ7ƒ,в8€З"и­YбИ‡LЕ“NциP"Н<˜Qуn„wŽX–y)зрБCьŸь|9<>ќr1IV € PЋшŸІ–хІPcсЖДŠЁЌtЪй$ёу"3U№x%ЫАтКˆ \…Tp^AйсУТЅ?vЙьПCY‡Ё §Ѓ›Vуќb„зє‘ЃЊЇ|<™O"7,А_'Нќ’ШвRBіšВj ФrћЭpГВЬ#з2Уj2›ёТ юАТГyйl‚ƒR‰FW™Ыгцюпмбx?и„Ќˆ20g5^Ђ„BР$!ЭЁЅ ќЊЊš,jg8DpWO_тjV%~XЭ[AВрёШв`џгююЗгыFЗ?x‘ач Ф‹ФЮufmpгЦp­X^˜фЖ$!EGфšhВ)™е BjЕИ_ЮWЋ‰5ФŽ9Мi"oMcЋHEЎцЦОЅK З;;{№{Ј_Ўk/ТђбfTCз%ЊCУ”‰УvC‚bК бёt6_-ЋаЖL€Š8Ђ­1щр^<ўлjЖXЌjcаўщ.*€ЄхšаMЬ№žy‰&Ш5д;иЛИэhЈsTXЇ?Xў§ +(LŸ‘ t™~‡X­Ѓ/уЁіr5K tЈ2лЙmы`3о›Zўўo+М _)Н nbјcМЏfOСf(!MьXхЛ'Э!•5 Œ.ж‹рмZeДЌйxўмя!`ЇŒ~КЦZ*нјіѕR.чЫеz}чЄЏі~U№—Ї-VТ.П&Ÿh‰”*ЉgрЮеМnгHЅТSЭЫ>Џ?А‹ї}TрІКn(Ки­71­Б‹{ЖРЊХиnяќx"–HлБО_џЏ(Ья‘€`ЕŒFпvoА'™биї8Щ] 3>7hД({ХTЁqB! 4Ьъ†ў_G[\аЛы ВeѓCћЬєd‚FУдхНOoп a“XЏюџїDOg+rНnЕHшƒwяZRзѓхњсa5Ÿж!І~иМˆЊf9рШмЭЗ+‘ WѓE8й‚$Rг[@5N‚w€%ыu(AjМ Й^NэЃ'вћhaтчѕмЁьŠ4…сыB>yПБu­љщ>вz>›Wž"PэлыЛ‘lX„кFщюw\†Ъ‹˜wYY‘˜цйќзŠ Є/Х6!fz<ЋжЫZ§ЖsЃеЄнЙ$›nHХт‰ЕFmнэО? ŒdЙОx˜ЯuЈKtГEA‰рfрCƒПкЛdaСK/LGљ§šмYЌcюьђtПэ”Є+•ДЎзгP“Э/cЎя‘‡Еˆ\лrс{A5ьJџјАЩ*šЊОTJя )–ч˜AЋйЁёф8( Ii_$ёmYЅе’\…=Mьбооўі•фgH ‚—ЌWшјuOHєИЧіwˆеH<БœФІЪw.ЏкЌ€ы…і;z<щѕZЗчЗ}N‚ХX“fK$t|ŠjS0œў…ЂЅ >o}ўpbXXBQKіьУж—“ЦˆдЯу&„ЯЬcяX?>}€4э'9в7 €$џiЃEУ@ [H‘‡ц{!h=ŒoИўУшœшIЈР’=џєёлM‡цмтCъ Œ28нПџўј?ЩLп“Щ'wвБŠьІеЕф P'exь–"р'oMюi’%Hц ~Рx„№ХХФ_jžь|шдP„ $дx†Ђн^gbшQПлэє(оЬ$Џ†јHўљ<%_b=:ъУ§ќ'$вО&r 5РЂ˜мƒSЯяб7Ÿь&Ћ’!Ry4МКгЅxЭдДЂ…‡яŽv{ЫШЊщИСјгѕђ‰јуўсwђРС9Ъ\ЌЦЮЊлюї{эf FHsh4 ФhќЌkд @&1‰Ѕ§nЛGIпеѓQз„жЭPч№Т|OyQ%A2љы4ƒ“Ў—U`уf5ЬuЖШБ­Г›FГ ‹C\ЂSЬзФhœpєЊe™ЦО‰5=ьД‘ЯЃЫМ ‰,5jніЁўv‚И˜4ЌШjИxФЁыqоЉnbЏAтЩ {wд GCŠІh VJЈSžhBƒ€бѓФѕЈЧ™^ыюхl§лбTJ€5Ё˜‚Ђ”rВ3ХMѕУzтb_šкTљхЗђў]A1<˜f(јJпP`UђŠ3!йхЩAЧЯIЊЅqЇiЈБtkriФCŽ(!f<,S5‚tЯgщIВi†ЮП8‹ѓг TЭЭ№Fї8Д$К>щ)š7KжФE~Џ4–т ?ФыКОЇrT{Р j/aЗђ>Tk"|/Ÿп?Ў" Ђœn˜ъOЂ'яЋzPЯЇEh№ЖNЮ$р„Z`…0йЬфF4^$іKG #ІнCжY Џ›ЃO$žHЁ€[8[Ј MДћ?E-@аœr92;„@v{|ƒЌЁi5СT?мƒ_Џ"@w0q`BMЦцQ№)X„А yIБЃёyызs›эt8QE"œѕФт†7Ѓћ?ХЏ‡š&–Ьt­nћќА­ЈV.вaТX­ S F ršуЉWЏŽнn Ђо‘Ќ cЙžйТАCсІOЙz\„вЈй’aF?щЌEв-з@цVыішлPEЪ]$ŸD№ƒа~*є 7ФНIА™^НzЕльвюv†‚‘<ћ0dКнCNкhЖ^& нЙНmu’ЩPТh–Ё TЇеЙ{ѕѕˆ% “ь @~$`ЂА…ўеyЃБЙпМ>к~ѕъЈ‹Н,3Ђyc pж2еиvk@ѓВ/–ЉСџ\…‘WŒЊKмЈ‡гВ.­‡E3œЛ$7CzanЮЎ›эVЃqsОїщеЋ“.Х2ЯŒXоЌŸjрћБ)є›-щn9MMiє“ТнПЄъыvЏ^Hq5!СН'% њѕ41иЭq€ŸЊ}3ншуе fкžbн /њ* .NымV…ŸхЮџu№HˆЗЮъЩs˜aяЇЙoB5Љс)—XтрМбiuЉбˆтнХйш[.2 –bЋ3`3Э=]|БSИ4:ŠъЄ)іPЇз‡rѕЄшщяžExў3zѕjgџьђтЖзP‚џД_ГZЎІБ)RT:Мцe.?Wdф?Ц ЖЅГfу9Lєяc‹еlœ'ž†tЊ[ЛG‡GзСˆVRм>MЊёdVХŽLuяЎВј–.§iFуM2U” K'&Em#ЏцдпŽЊбОžдcЇО_ЭЊ<ŠЂЄРУ…щ\79ќ&ъ ё‘Ч ]xHб~RLЁі#•ъŠlˆžeBpФнЯЯЇзWЗн#й9LsћŽу†lАšю6z€гў'Ћ§ќЭhѓђiшІчxчўёa…EиjБЈc[зt]“!”Жzн!ЭЋn1_NђаuА;ФЋ5„v4§тgЕџ§<в,žїPХУ’еШœgъ@№Љ_ŽАїФЪйМЮCј0šnсUП(Š=SћзФ2’fКA’—Ш>9ЩcЯ!sišxLŽ› BW•3$CЅjžmšІэZІёЇХчџИAГy{ёЪ ƒРзл"jfT‰3ь8`~Йr$Ёњ=б‹ЧЈ1FБ"GYŽ‘ >MжA‘†vяUЃy}Iљ~љЎд–гё|ZDF—ВЃЩbRФўpФўИЩ†mŠЌцguСњЊgГЙаЧ0уq`i*ŠХiь3ЏšwЇ—ЌЉщ~рЊŒ5ž/ыдз(йCYТВјЇM6c9žЋГЌз“2є№цЭ”0Њч‘oŠ 'ЊКІИYЊЏn/іO:НfGv\C ыхrкŠlGйd>_-ІyќIMzЌщDyj ”ж‹:qM7›дуКЊ*ˆќˆQэ0Ан ѓесССЭ suЫр=юДО_І–Ў;фЂ:zЮŸc3вNдul jXЭЦБЃ[щДF5Ž2 tAВCЄЗ ЫsэЦоqKВM™хTл Ч“Х4PiДЧѕtБšфiш›‚ЭœŽ—rР‹г ШЇГ*&*“"Cй“ђeФ t„ƒ:]ъвВaкzї‚%ЬќЎЎ™бx2/І™ЅH”… iU„§жЦO~OmчгмW%+Œ3TСЉ‘аaЎ VЧЁЇ ЯГЃЎэљaˆд„Ї1A§Ї:E=("Ф9Ei)EфЉŸм)ъNŠТЦe PŒb:~TN‰иИЪтЉ"”‚S5U}н—/3tœpgѕ|ŽђЛ8ЭЫy бЅžЏ:џЬб‡ЮЧ^U1Йn{ШЪF2#Њ ‚х"Я‘>A%ЧВДѓK М#ЬЫёђ7*!Ђ^ш§=rV,Ј/ШŽ†#Њёs†L—HVƒу2НЮ@PЃщj9G6чRBЩІ]CПm9`зEЋfO‚Уѓљr§ИО_-ц‹‰/б4’Лўф†ъŒМЊ(;›њКШAВvѓЇKЈеRЂ@ŽР6T;ђ,ѕzрњЁтЏQЫЊ›Щ|Й$400еЕУxY3 •љ™хююhQёQ  š&№Кщ3Ђ‹ѓLˆ`КSШ‹Œрњ–pУy^„yЄš€бЮƒ—п“ЛRЋљиxY5<Ч|КЊё“FЋC zˆDwё4Q2,k№Ф V" 1'ПЧ6ЭиЁЭД5/ШЪ1Rсг˜Ьˆд2fЌжїЫ‰‡:УІялІe ?iВ‰ь‡эg(+ћ0=ŠjЦ“9б8CШˆ(„ 5Xо -j`!_ ъ^рзЈCBиkGЭlš бЅA˜‘M]ј)qя);~œ—HъСA•$ˆф™Cn„™ЮсK‘ЃkšІKДЦ€ВC (з ?P4o‰ЩaŽЁdМФЁ$PПЋЎвePЩšЈЁj%є1д9HйEИuˆ"ГnІa |+џђЗИг†є[&dЂ9ЋЋ<^~#ки“šhГБЩtz ЧГ­ЎИb‡ЃгїqЃ^XІPчLO\@(™bW9‰йб п—kkVoЙOQ,Ч!iАШЋ~1|… ђ2ж™ж]–7‡iŠn˜…n€D%љѕ†kX€• Ўрh/Ш j)K/DFК q l™Y˜ТB"АžшцИ)P&>*-`\Мћњэ№єфЎ?тT;HсŸMQЈy’ЈC@;%)ц~Љ`Гƒ"KЎЉj^‘Zк?Ÿb†ЊiщтpРk&ЄXM„` F˜ Q1Ѓ,ъЬЃœmJЧЙЦСёeуцєД!›.>„ъ/Ѓ]ЫєђЪ­#M`эIј,TЯ‡вЌЌKO§ЇyП[ŠюFЎЪѕњPd@ZLЧD—–yЈПјThЁк ,ДUY•‡WЧчЭ^ыhџVЕ}”ЎХxБИ‡˜>Ž]УpГ)‘t‡oRЛ’ˆ7‹QхЙЌgudЊђ?yЃ\PЭЄЪ@Gƒf 7Њї„ŒЗJЁ&ЉБfС8VWelЋ<Ы‰ќрђєјќюrїѓЅhyM5КЧ‚№ŸAE?[bЊС‘КуЦv=™’Ъ­№ YљЇРu[„*ёŽ,ƒUЈЊеiƒЇ5 к‹Рџё8ѕРdˆpл=?кн;:ињtژNR=uТƒ:/CXtn 3]уfоrYХa…ЊЦ“l5­рл(џLмkqЊЃъ}Y* qp,Џш1Rg.`’ЇˆъъЩЅѓШ”9šЂšŽnOіЖЖПюmo}i*1ŽЇ)>ќХЌ ]/,БD› еї3"л _@ЅSHS(ЂшЪ?&Йѕ4dЭŽ ŽBюк2r^dйУššт61 ф№ ІпRЂ@5OїЗ?\^Ÿ|>Ёu7I‘КAГВ)Сyрџ5j:ӘЏ5Њлƒб*!дW№ІedЈђ'tIеQhЃ('ЫћљДHЬт4oф‚БЮšУL#q>ўL ŽєŒ ŠН“§НOЏЏЯї?ю6%Ыs ‰Їz”‘Сыkм[ЬБ˜™уОњќ ЂB}€"•%1:Д4љGЇzЄ*f2Ў AO0љAф#0М™C’ЈС!ŸŒFхѓll}љВ|н0эЏ;Чј[ž/ЙE…’ЗфЎž.!мO'ргИ0LТ™р†(Z:А(ь‰€м3ШПЫ?rv{–хB›! іУ=јe•h4Nv]њ2=фdEh}їЅХ В,Шќщібн2Ч™Є" ˜їїАМV/їГ@'К:6”“(ЇX?ЖWѕiX…HЯЛ‚o\ J b˜-з‹Y]„ИЄiŒUeЄ1#V’ЈыэO ‰t{§~‡тov†ИЭc#В52@„Фп $# фjŠ{嘌BM–eе@jН PXцыъp…ђЊеPxPў7Х­"ВиgгМd@їPБаR•ъ48§Гo#іђpџр№ј№фњєЫзІЄ9Ў­s#жHЁŸЭ‰kX-Wы€F,`f1,>YEэ’МžхЛ~РhYќЦШ;NxЅ8‚ƒOg‹ jXj@мy,в тЙЭŽžыœю]2ЭНЏ‡7Л‹ЃЦрцлрSЧвŠ7qІI"­BеЎ—ы‡хdvŒжdE1œOrJџ№#фъm eA$–ЪšШlр^ў‹ѕj–йВтЄ(рEuK_ hŽiэпєoz#”"(QnэŸб’aЊШЩNQЃ\іД.J{8pЗŽјЧ|9KH™ЊйМђ%Ž~d›ЌгTUбTЭ‰ЪџУо{ЎЧ‘,лb|34 ‚„ї„Зэ]yя}ЕЉі €#}їЛ’^\БВyЮеq ИЗ~А†УЭ=„ dEFЌШŒXkЪˆщŸйБ!\[}wо{ўћy:СЁЭ _7^}Њж#Dлђу‡FНеlжЪ7—ЅЖbx Й6“) ИC!і18нљђ …8-†ƒФ’љVG lБ]=Y}ћёАєeggџтіссЫЦЧѕw-WЌ”Lx~мќы+я^oиdєlДмт ЄЋnш˜Lgœœ‰жњ‡Зb™‘і—ЎOЏСЌіЇГх•%§ў4—ЉиО“‚>ЋYњБ!Ж+UЩёЅVщ№§ЧУУЯы‡7 A–$ўўргЛ­П`PФЎm™ŽпvЙеwяоО_Ÿ(~РhА2Nzž&ŠТR5ŒotЄO/Зе=кэuЅ%Њ&Ѕo*ˆppG›}д:9мЛЁ•юQ>ЄпИОщhžв.~<И;]?iŠ|ЋбфЮѕжЪЦMK6г"Гe‘Bqа/ќЫ+oоЎМЏ в0™ЮiЇ/pWюШ<HєOЇQ~hK?A*•вхйUq’Ш5ыѕ6Aџ>Хч.OpФR;нлОрBмwBfвчGUйR:Ѕ§ЭлЪбfЙYОПОy(—o/vоnоsšзяљ xOmJ0тюълзя?m6‡ЯЯѓbЪє˜:Ib)зЉо^]œо6EUњ‘>A’кеRS‰Јмлm^vДТ3vzǘ%•/[ыG-ПмJ99TкwЧ7ЂЁrЅ§­+ '{Ÿ6ЗЖЗ6Зwv7VіъшMОжДАЅЅї++ŸЮфбгѓbФ@@VN@ЌыыВм)_ž]зŠ9?pšа’UEс›MєѕрРJyAŽFь0z2Ц‰Žзпmнˆaoˆл‹AюŠѕыЋІЂqхнї[{ŸWпПїіЭ›їыыŸ>яо№zд‹MЙYnJvw2vNзоЎЌožI#r‹1CLOKщљ(s5БSЏаŽPПи}чB+:еUJGОkŠV­GB;†„ofбЭСцлїЛJа+аЖ6ШЁvWeОМ§f§гкћП^П~џсэЪ‡ЕѓJ[$<›єђЊm%ћэе•Я‡G{ЭбѓзGœ5AЃф‘щ&PдKm,2UД +‡і•*4ЏяR‡Iь;–хЅУ)@фxБHюЖ?ь\З5‡ $šE7Ж…ZЅ# еНЗ+oVVпМўыуцћЗk'5^6œ„ЪKБQ­ЖЄ€>:|8ијД}rqyЬOО~]рўyіMЎdЖМџ -№Œ2]Ея]j^5wП™ЬNvGsАЮЛWœШKЊТ+AšхHчБжhrBЇvў‘‚yє_oпЌ—eХ\\mV*mЩNТ ‡ТА,зo/ЊёœVл{:}dцШ]((!ŒЛБ fљяѕХюхŽ*дяыВfћIwД`х'0)ZMOгI.uTп+&Ш>Њ%леqХУЕjuЦ@ЎЈќѕіцціvс›зЏ)NП]§МЛЗЕqИЗ[Г ыю›Њ(ІBYKs}З7]|}\kŒ‹n–DQz–Qм—›Lе0П4uKwВс€ЂF>@5„ —УQўХ…Бt.DiЈJЭЫ““ыzGP КwКѓсуоюњ йћз›wЏпƒЌ}\[ппмИ“ЉИЕt!ОнlЫЖћvБМ™є|S7(щ8х”h—3QœІмf|яY5O№з.PІРRјO–Wй8‚c`cЏХНa?“JœюОя{јцщснХчЗdєkZьЗ++ЖЖзоo_ЗTлC;–бЙџrодƒ^ц˜ю)іЫ(TDк $KTg’_выUѕ{уt›Ъе=вўЅ}сОчGlG/˜Ќ'уЬ T|)ю7Љк"?ДР(_\юОC!я§кЪлk+Ћл';[WœF&“‹Іy7.,†CЛЅxхцО)№T^BьИ~}SmЖкэV­кштћютўе–aТ9U№z&4пfьl|„І“" s*QiэЩу’єЖышќУЖс‡‡7ЇŸiKЎnlьW Чq}жуTgHoаutЧ+poK‰ЅА„ЦmЕнщДлЭ‡лЧё|ЇVЊДИіwГ<З, ЛХlоѓ Њљкmˆт2ЙнŒнЙВf$іRGьv‹эЁ0}‡ОeŠчkё>l}ЉЖюЖжVоЏmžѓІmУhІЭ€ІЩЩdїђt  rЖБ/6Ћ”MQЂЪPdТ‰э&Їа’}ЏGwHњЬК=*ЇWUАNR ]ŸŒ†Ы–%жоУєˆpoœХИ› зqлЖљУЕяз/mIЗЛŸVW?ьжЩf‡\,˜Ч`Шбю1%hЧОа$U;mђa зиh„сM˜іїшЕm'ŸMћTљTО|ЉP­ЁA\!ЯNђсc&kЧкcP‰& ЛQѓh3šКо:оX]Л"0Ћ”і>XнМU29“4Э–=6LХя]c3жн4-\ЕЅ2Ы6MŠxКТе;КeЙжї6В›f2-"]ii0= шЧI‹МЌђЇьЯQфN†]2&OЩj2'ЂЂжП|ўpК›­ылїP8v2ЪИК›А‰GX>ХЕ=ЙI>kЪ,>ОŽ\ПЎщŽэип=L'gŽ.мь? fˆ вЏИм™  aТnNŠМ7єКiD;б@7’ЌдŽ?oœно]S)О}s^г$—NВы9Ф™&РЂ(О$Rз˜%`QTu;#пV•цMн№<яЛХau+†Іж8:уp}ŸїQНvћУщВчk‚ђvФZэЦCєk0:‹<мБSЅrvtz|xzКЗ{Э+T˜шpС6Dзщpˆz6&bэXшfхЖDQgєuLŠЯmСФЂяJы„7|CМ<Јбы тёŒ@L6f‰fЬњ ‡Уe•‹уqж§ˆ# ЧЕM4­2Ч—ЖN*эІъf‚%ж9ЭМ$ж ЩР3ћЊуЬ1ЅBнАЈT;,i9п =^AŠб1{ЧМF>Fe‹у8–эrУВљhШайЈ 49шa7†ДFєбєЏЁЕWW?^ЊљЖMџЩ "2з@TžсВ р№цe‡ЎPƒ’ ФЦЎ,[-й&їјо•M7ЖеЛфZ7пыš`|ЁH\ЫСYћx8Р$B1bнМPШЫ"z#f§lKЙћ№њэ_›mзw<Яaё.M)тЁYvР‚ŠЌ1F§Ќ­†‰.rшБ!ДKёКеVlпsПwЅ›фЎ~XжСЫ­ЉT_вў2ЪуƒЪ0Y‹h™@ЃL1ьuсв8ь)VV:ЖЉ>ЌН}џvНbИєЅB&0:bсЃ€[#вУŸ М„Aœє :."CФ]6%3žk78Ъ™žћн':Х8­|нTP]Њ„—ENPЌ”ђX  •ћŽ‹шЅтD—kЌ“7%hCžШїlK—ЋыЏпНљXQ Чs )yaJ+MБ‘В ЛъN†4х'&tІ}\HGƒHЧ!oЃB€—ыˆ}Ўѓн‰\!7T[ Nџ9гнT3ЭŠHЫGчШKŽЇELFhBшeА =ъy‡ІtvоЌМйl"pxA1љ<™мыuбфKŸ1юb†ЊчЩ|Ѓ.š^Žђb< фкЋVTУ <§Н6ПjЃ ІИ)AКGЂЗ%ivTLG8o9н-Ъ‹й 0МЧf\Кi–aaˆ BF‹'oVоёŠnй{J‡=И‘.`5NЈƒСТwЅ‹›сїрз r –щ;#zЊ?pn >qEЂ=!2mCEГгбt”X*wstлD=ŠЛ“A”ŽЗ‡hBшfД”pыаїЁЎ,_Н[y­PјБ8тŒ>€-4f‰ѓaаd‰-ђэЛУуšj'ДЇуы їЋЩ|ЇУџШYЏ@[ъH­2ЎЛUгЭGг"Жdўсш‚a4Eэ^єй‘г G˜ЩœœкїбyЎЫвнълД‡-J†dušгBчш ЁДˆm—ћQoФ•2лЯЛ5ХNй4+С)ГJэzНбљЁЮ1к~š,жoЏЋЂЎ[~oŠў9ЕS>;­ITd˜ABарp@6mТ|9˜0ђб],пxГ^†К0л‡фг)B”Ђ3&>­tљ*СЙъцЇуŠd'ьzx<€шŸPЙ)ЕxUџ‘>N(оЫR‰e•оtкЇ2Z(]\•Аа’CFчžOљІшЁS4"tпЯ“˜–šќУ†еїя_.SфБЩ;X32BGП‡§H–sBВ)ЙHdJМX=<им+ЫNw4bѕgюЈэлћ6ŽХЌ8ь­JŠŒ№A !Ь†Г с'‰Ћ|ЙnЖqwЄŸХ”dƒ#[ф­9Л џ@IMкPюW_Ўj†…цD˜<%фљYжЦЎчxyьЇ*ЭлыЃЯ‡ ЭяГйˆ’cK œJмм€6лЭК@шж‹ЛЃХ,ЕОљpBH•жYдЌаїВаЃѕЫiтОŠЕiгТ­Љ|uLЕєсѕFŒv]2ЭИiDЦЧ‹‚<ЦsтЬ‹"5FЛ~О}Юё!Шё0u УІHd7`Z>L*гOњуХ,ЗdЎzГП}е@QЖ‚иѓвР'crЪD2м7ч)H]]џ—э:` Zє:иTI/ЇP3аŽ%яЪМ0Б]ѓœ€А•ŽЧЫs к)CЫќБЛ"cЅ9lюК2W9нпрt…–КqАsзVТ~?u4Ой5гВєа($ {БchмнюЧЕЕїЎ0)‚“]%№Ь‚-5}џCˆ=ШASf€а›wДкчПжn$‹’Mˆ$Ž JyšR9™ zIL;ТKBнУИZОЖѓщМ.Zй ŸР_8щХўѕiй\SWZWЛоќјёУqK%‘АЃшСh2†jАn?OY+pт7ъб R,ДєђЧзЋ—’саЕЭz #Н„вPžф§˜Ё(? Д ;-hћ5Яз?ьнѓŠпsŒ мћсF„†AE–NUёёцЧеѕэннOWMN:Žр{Фaту™r с—,Pб$ЎЌоЏОY9цu/ђ фчј+v~у Пп Љш$№љšя‰­ZЕ^+]l­ОћxкMТжCŒ.?3]ЉX–!–777Жv/.Ž6зЖЮjЭFЃ-X> …- !]‚B9JD*JSГ(ЫŒІxѕўэЪ^Su(˜р5 nауCѓ~цЛ„X)‘{Fш эzЕі№хѓЪЛ••Э›Ž†UЬb:жOЬfK†.UŽwNNЮЎя+їЧ>|к9Йk49о$Ѓк‰Дм~XJa˜EˆёА›іrC’ПМ{їnЃLA2K†@ЮNЂRІЖžR5IˆФ3зŠ=H{ЗЋч[яVжVVъВћIићўВхпžЖЊt.ЎnююKЕzŒ^[[]нНoЖ9б Э ЅUŽ"піY”Ыa9Ћџ( чaЈМ{ПВv­š~šЇ8; \™ВФHП\лёќд2c_)HwъЗg;з>lнг>шwЩ9(Ф›?б$Ш|ГAЈЖйъДk7[[лл—ѕO›%а§,РZ‡ˆЗ(Дsx ыќ.€їф}zлЋ.@ТGН‚№>a%6ЁчА8MёSЈTч:“O[?ЗT;яљ:іќЯШљ5* =‹8м>пй=Лoв–ЩŠ<ЭeиЧЅє–3@З”]8ЊV ХwЎзWїJn@ˆЋзэD%@ПЅи 0:Œ =ˆ]ƒЊ3A[ћЗ>}>*‹š›QЈ–Єя==јїOЕІS гщ”OwЎкЂkМЄXaьhnфв7E†№)"ЗТь$GёбГ9*‚›+ЭБUХяЂЧveЕ/}Н„oЯ‰BУ1ГeRrZЧыЛGW YwiГ€љЙ~ѕЊHІЁЪ\ѓўˆЂДЌшln+‰-Э й^Ф‘Yui cЧ$CJцЉЦ qбU­^Ш‚MТАШ@сEBПBHрб&і w˜Nœу№ве)Умьнпп\н7yЩ 2ЪК?93WWu\ђ‡ƒ33g.ЋЋзє PЃ єЩь8eшР"ˆžмЎQ„є–EA‹hBЄЁr=N#лўіyNZA’›$4ežЏžнЖ)Ё<<дZ‚юрАћчŒ~ХЃ@съ7лЂ ˜N€єf‘эц„+=S5фЁ>Ю5(5cиЉopЗ(Џ)'‡„“е‘ћу*1 l2Ч‡РŸŸyNBгuM™у[зU*@ЎYЋ5нW?itgbRЛrОyЪ‹2SбћAЫшЄнР%ЃiЩ№[”bі:I•›ЕїзœdйbчцшЗ{CйP|ЄeІ%v\лТћЁк“ ["и! ’дскї-м!*2пЊ5EUU–Ю НЯRЛ|qИЕѓРЃnЁшФKКљщ€ъ<д„V]/Ъ(cтЏ…НyГ_4]l­l—Д y2„ф{ьЙрUqшн{TЫ“б˜ыƒц4† k7mIP“хыЏЊэ:єјwOƒ F§іф№јhsяЊкhвCпA4"?t]ЧCшЙKћ=жaбs„/oџхУ•ЈЋrхѓыwЧBXŒF}˜<Д,œPтS(пх9aƒчšUШк6ЊЇЧMI6MЙ_›|ЏR†Н9кн?"D§iы№№№тЎвьp М~AqРЖлvp ѕYЏк83хжСл7; CхЯVўz{РйљmNн^ъYьўЦХЛБ*€ма’Оѕ№eяјфшјATM6ЊёK6џччЎбъPHЂšЊ;Jmл%“›l6§ўl6žŒСђ'U6ўZН”ѕцЮыљx-h˜яЁЌгѓqТN•дrЉ“aтV„амљўбйщёYCжl[‘^Ž<ЃtБН{]чXзC˜Х~Rє|л^*ыь~.АMEЮWоtЬЪЇзo[‚ъf8іL‰  э„`0Nа€(˜ъЏ?<”яЯ/[ВfъђЯД{џчЇмhVюЮoZМˆ#g,ю R\wв*Sбm'8(ЯtT–њэvУ(ЏџЕY(AA{z:эk’išюCШГ“ё" gC)T@g‚Р7Џ.л’Њ)/btЙХušхѓг,0 MеЪ$9…_\ѕйфІзŸNЉцGП†"JЭНенКYџќўœу%MбМеѕпВШhKз,‡ аI?]ŠЇ"VКгтdIn_нCЧRy хуrЕV­озEžѕЎ’%6EАbмѓ`Дc‚)…6ы=”ЅжсЇЮц6яІEiФХd:Ь}8§\є{XŒЛБЏс8“‚hЋIEЁЯЛОЌR}Q’’;\P ФUе“ўx“w‡˜•НˆѕХhЊ$ЕNіЫfhмœTxжЄЋy§}@У–\Фvќ.(ГLЪ,­њУХEЉ)**>Г]*w(УМ,MЃUЏеъ-2Х!РVрjКN2 впЕи%,H/bв Z75JE2e гЫpЂсБMKё#MЉV šЛY/_WdM7LwъMAј д;ЕjйŽГД;Т+ЇХђ^R‡Щ.$A,ŸUœbдSю*`Ј єЏaoмG>жйђСі—ћ O‡е`­%*!ыŸј/NІЏ&ЖnЗЗ677Jzкt'"и?РШ#СЈз[>iя‹ДЁnU0Rx—M™>XЦЧЧ§ў !Ћ)9йd6ЪгШФ‘Фv­J{E…S6|rа5š&зЮvЗwvЖО4qB­л>ъЇюp<Ъ?Эp7N%к,d™П>угё|О(јгkhтЧ§љ$o’ёl: &ђpЃЌˆ­rЅнЉпно—Ъ/Cгв _AJыbяр`яД!‚=Щ й‘>Ш6ЉpЭ ]л&Х6Њ’ўіKЭ+ІѓХу<Љ—–=UšI№d˜і"зŠ†гйlѕHS\ЇMРнПˆЉџысpDЖ&>ьmŸо‘ 4Л—чЗИ{ bкaфК"+ќУe+Ђe~Θхг*ŒF+‚Iбš\9єњшФ}BЮЦEИйй=:Н­њХСЏGщU\І–&м|ЙЋзoЏњIlж бВц7ЪІKiUnпнЫ9ро#§8Ъ QЂѕ'cєsУМЮ‰aћ9ЫА~ВypUх$ќd4ЭяяšўožК(ѓВn”М:•† ЭzƒЇ_1м(ыѕР@ѓј8 AD-–ЯяД>k˜ёРќqъWЎ0Z%ГэЄO›`Fx6UтŠмОм>И,Еtж Ы[Пnu­v]&ФшAHОVыАћ"*Л VЂM)–iŠP?лНд1ьМxzќњ•MЈMэ›гOё~MK=a3 LоfФ@RѓlgџКTяtxN4З)ТќЊбxђkS”К5U\‡Fїs2нќƒР–Њз'[ŸNеС’ъщќЭІ~…zОwZуDЊ‘ѕp4їЫb>ѕќЅЩ|хьрЫC, ЅлВb9!И\_Тh•2‚Љё5АOИЮъ„DI ™бДž]љфгъЛЕsЖЮД–ЯџћџљїœЬ §rcѓјcgбhй“>›‘СPLЃt}Wяр$Й9к/І„žћF—i+кІоОЋ Њсz6a3ЎнЈ“кН1›œ˜њЧяоН]ПВ' FЄѓє?џ'Œ^0Т”‰wџљнкЮEгNшGzzz"Ѓћy[­r_ІЦ GчЎЖœ/Э/СeIEЊeщRэє–'p ЉЋХЫn8%#ўУлwыў!ƒžПџЏџёП=Ё}м6‹iкоyїю§nЫIЇЬ;цГОЃtnNЮ8YЗ‚Мо:оКзlЯwаЭѓы6ѓ8gЂ-нКФ(‹Aл/Lмcz4(ІиYƒъЪЛzЦfƒ`жпџLƒsАОyЁ|Y{ЛzЃјЃЇG6HZјšPЙ­‰šAx mC.э ”ЦНU—~Н hc–’Р™ЁдяЊ‚ЂYQ^єSЯдTƒЊй1мaоыœŠнљœб•<-цOчЪlЩ ВxœЕЃЃВьŽП.­žф(0Ъ•Eт™jѓђМЉлžїŸyяъснаƒ Љ^iRэbК`HЃ(-иDхугЌkђюcШцiNQ8rЦ\ФF‹ic> =EбЃщ3FvйtYфQ5žT {ЖкyИЉk€^†МM…!рЎЁЋBЃ\уЈВ%ЋGЃm˜а~zšф! іоб]ZbСWIž€ЃїС~>Zт%-+њ;9кД   ›0šЂ?КуоˆЁфхр пмџ’1dє2`ЊёэкХчеO—•Ж`Хн>c;ЯƒyЧзЅ??=Яћ5\/ˆђ>Хѕq‘gdј/SЙq†•`?#gsц…ЯlїУ-™Уbќсљ%Бмiн|ZлИЈ49й"ж-жЭ&жј ќѕoЌ:~рсSаWцЇУљlмѓ­р'T4'ЭІєђКIœS ,#Хг’mрщяoF?БёПTук•/[Ÿђ8ІеŠ‹щ#^§ˆџНєlњ}RА(]]>4кTyzнQZц pц5UнЭ'гaьр‹ŒЃhЗДЛ žACтdиЕxЎywКZkЃ€љ'ЧsМ Б[џ~~ўћoxЦвЕ‡–Ђpѕы“у“ГћКЈ;yЯ3^„’рh<ј†иъа~дН›/Х2/–{№‰…gp^L'Ѓž'tкећЋ›FЇЭcp…ыД[&ЏF„иНм„Ш-C§З•ыГУ§ƒГ*ЇКОёгW-џўQ4?ѓuЁVmKTYЋбЦ.`2*”х.Љ4›  SŒе‡ZЛн!‹щЯЭzЕоц­сЗѕeћ‘|Š э}М<хйЋгН§ГВDИњeЇ_ITobхЁNЅ/ЈС <Чм4 Ю‰Ƙ2Z7Т$1ИЉ;ЕjНеj7kѕzН†ѓ?Ю~K@џ Ÿ ьЅЖ.ЖыwЗ7gћЏŠіR„›феК\П-Е(_qЂг^œѓ0БіќэЯ‡шuУ a Eр[їз”F+јUЎдšmб#~ ыlС„Pm•Џоом^П8Iy[Ћзї SR3,'н@—Еhђ„]HŠW=Юб<6СМQ‘к"пЙјђPУW*еF‹“œИMрX@,Аz10жйЦељщщэoa nуРfЄElЫ-AБЛ8є 5F ™хЎЄУёmЛ§Hс:з7mєŸД[MЗšз2hŘвы˜“Щ},в,‘XыюЫбeхЉ§ўЋ‡Ї*УqЃоdŽ,Љ^х5'NГ^1џJРѓљiьЋ„X{ШJxqdprgз’ ‚tъь\ЧN†slоЇ~руойвјЪEъ'snЉ8мэ Ё"у’Эї Iw|з ѓ1`огѓШйrђYбmƒo•›ДРњh“М`ш04Ђ"ЫM‹ХW*њЖNя3\bМИб†сї)žѕзTЅжн]з\ŽуSŽЇ•~|™|GPЌаЧ… #њVк/ЉxŠЈЦaГч‹ЩЗУЯG”ЦŸЖ,–cуOџс&Мяx(v‹~Z”•;•Ы{^1\ЧqƒЄЯXвŸІžиЁ h;šЯE‘ч_Н*5›­Ž ЁЦВшРh•л`СЁЊсylѓhGЧќІЪ/qЅѕž–Aq# l…вrуіДBІИЎыSe:uеу"’л фm lPоЦХЩmЃбj4ЈњГќŒљQ 4;еІЂКЩ`іє<ѕјjЅZZ]ў!’я~dгIc[(нU.NыД/(г%|Ѓ„бЗјZГW†MЕЋWЏкЬPВюрfЅЪШ*їmйЂ@C‘гJзЅЖЈ(В№жљ–WїЊасšї'ЇMа$„ДХhoЮ3Ÿ&‘ж*нW[зЊ—ЎNї7Ј$сА$/tQЙ,žfОвМ* Кэe“љШЫЇ—•OИ№ЗиLРЩЂRYquzСі у$ы†@O8 +|Ѕqyz[­R |И<и€:&gUEб­t‚Єє№№ъUЉ#a’ї‡ущ|”ЇџЬЅ Г= ѓРёѓбpXєгаUdнMb‡—МР"уnюЎ_•ЌРж$еЯzущt”gмЋŠіыl?ѕtќ(ыGгљЄšЭёh4шІ‘e8Q‡Ж‡рCПЛО:Ѓ†Окф=ш~гАѕJ‡фк pќ№#њq1M&ѓф]F М-zY&]kvћI@Vнн^^”§L ФЊ’'уAдьД?Швр[­RЫі1Q4œ&лaPБvЛи<зOРЖ[!ЃЯЎЅ8Lу(s[R>œЭzБ]Њ;PрЄбїЊОФгА( ѓЕ”ђƒhXžf)(•ю"ИW^еL/Œ’и3@5šбтђВn˜^кЇ@’CђHЙўПеЂжOњ‘ФгМŸ0љОбTшДЮЁч(Z“у;ѕ‹Неѓ ШкNR€†l”ƒ 4Hz„АŠШ:ъoŸЮ‘L№Ѕ§QЯ7еіуOFХ`0o:hД=hŒjc{‡‡ЂUхН,+Ц›Ž{ŒjЇ][цлъo™­§<%г+2Нш^h№ѕІ Й}а$бH‡ˆ†eщRСЯrЬѓsъPA’S<@™h8]@ATXГqЂ <s~с-Ьm”MŠдUZЅКdvgL{шIєz€qиЖqU‚чGJ!Ћ81™A6 C?hЌJВfYŽі{Є­[aoСОaющRЋЃљ#m€6JЕ–>,O#—luеЫ&цwb‚P}&$8™БAyр•XWMл#дкўrwл–x8žM'EцšВ(;ФE˜s  ЮжэВШVКт%Тuђ™ŸAz2]щ=ЮF‰M;$ŠMQЅпіюKїu^‹Fа6€†HЂ|Х BЩЎ‹йВтOEЖдh€JЁmМ)B“$›ъ‹ЯЫЉНhŠtyьY64™vš™JШGАџzyЈux$ьœљкmХ’> бKФDԘЄf ї9j(‡Fоrк§ХX2О=-‹jСxёDc#‹ѕ,ШhВЙп”fSа1?ьЎp^6ќ”0JЗW|гѕOXeкхXЯщГsе ъ4ЬЎаyZмИKи‚Ђ3 eЦCщ‚‚kЭЮ!BGZЧ+†‡ълnнщAкMЁ‡м‚Ѕ†”,ќуGнŒХxН„PKqО[ јЛž*ЅПЫXђž kS.‹њЫ Q– §иV–кє‘k—іnu?эwЁ]ХјЃF0}ЪШЃv›ЭЇ,š@iЇ&Д"/ТБѓog:ъіГа1D(?ЫV˜f2zkШfˆRЙх›bGВтШ1ЏъЖŸG $Qѕ=Fј˜1™јщ„M/b_>NЉxШ!BтYкЫž)4UˆДХYьш’Аdqƒ€5$ƒqЎИ\iXлrЕix+Ÿ^(~иЇТ+ђЧЫi1рГ(gчlвЉPŒ)v8.‘„ЦK&єPзЪL W—%еы‚C‚IеQf†w*1нq[—oя4ЧЖЙ/%ЫOR[“dQPн…`SњDаˆЭ–pŸЈвEhš+|НЮ‰Ъ aОћJз4ЅгTЦЌFтF•8r;ХƒB\/аEђїЦљgZz§ИfЛ‘пОП}(з%ЇG9yGТŒdqК`ЂвЃФфmYЅNЙвQѕЂј{i•A* Ђюazs„З;С:3й\<рŽаjДZЪC]жљЋНг ЬЪ]НCХщЯІаЊбЦеilˆ|о дF­Coƒkж8Аыš/’c]•Х (­8ИAќИXаJум€!%HyRь)п@pƒЋеjЗG[чВK [Д }œ,хc™t[ŽE*bАаг.}HSRш›а^!dYк >ЩА Jq•,ШђшbЁR‚GCpиO#І”Ўё_ŽwwkД€В@†~4[ О‘•У~kд(_ Ÿ‰њ?АїЛю P^ёІyG˜Tїв.уЁ|œ3њ™1“ъЃ2|Ша?аb)ьšJioџрфјђО"˜€,(iY}ƒ\вы.Ch}1 NЭК‰AєЄ€ўю/ЋTUУяІЖмЊƒйвbТVšРdЉ `Жд”C 6ƒЩUЙД{xq}МwЁњŒ›S@иЩpЇ§1Фб‡#њ"У@ъЈЎуЛT/Б™ЇџъЁэРЈG‰Nх›m^RTнЭ†3–ƒgHVj ”Rті3пP ЫжХЛН“›кУсж…ц'рЦ”Й1;дЩГ>гEgѓqЌ‰f.)Y(югзŠLѕзВyI4Рђ9 p+C š‘о‚:…`ёˆ%7Т—Ё‘УнаV‰€Ънœо_яl]Kv4 G@qˆCaZ_ИLё#-ѕеzк.ŸMЁ>Lх…Ё§’ƒpŠхњ„фGНРФ-tŠЌŒОлѓŒmЄ)^ЊЉT„TˆŠnъb§bуужжкЇГЖсчЄђЄ‡ф‰ ƒ!Х`дё%AС. ‘%™”w0H,Eў…i\EgШ[у<А™™Ј8DМџДљёуA™@JК&U NЮ”ш™Œ"Мœоеd1ХЩЅšЧХ2"EжЋ9ўЏGвЬ(єЈDŒ fєA^,vx->›кИ—@3яvѓ>UКДLлв:ї_vжо­|оZПqодlЧR(удD@%ћ)ОR}ћјќ4Ус|КЌ NР{9ъy'ћй)тEЙ Їфn,Јv}C-Э'“Хѓb:Lќ r˜9Mћ|ЩО­ДЎїЗVпЌээЌ~иЛn)ŠиЌЕТн!ХХсЎŒчTsбWDvB,š ›ђLыgљUАщЈ  щ:˜вW(<(’ƒK фГqЊы1tљR[QhзF–T?нииўАОzАЖђёштКдьШКiZ~Fи’№РMєCƒQ” (VРСš x&Б$№e§\иkгBчPK…Њђˆvњlд‡ТEа›вB?>Q 6šBвыЦИј.2G‘T'MБ|ИЖК§љуіЩ—Ѓ§эƒГ .dѓ>-5$x‡#Изѓз9ущбSЊ$!4ІHХУфŸrkY5Ђ.€2mш№ф `ИЂ 1§њ48Э{!Ѓ<Š3 *ˆFрщмЭжъчЃѓы ЙDыtѓ№AВ\&ЪpPяV ВњiЉtNЄ)ъ5D—‚v4%HM§Zћ8S^–Ђ8ШbGИЃuš§ЮЭ•”uГаGQгO ‘P ЃЖ.>}:o ‚Q|инП“mТе8’‰zИ›AC~фѓЇЏ Ћ н†рiЏПМеЫЛ1эљŸР 5Œq=v zёЏsVh о#DeТэ—s1эц„’Š"™#ŠUcеу{žfНХ)мёЮ•hљTЈХєQ9шС'CZЁл2)€,Иf'{l?уP$ё х'Nj`‰rœіЯПБђ‚‹‹‘8у–ЖPoЮЅЌ—сTЫ'|ц)Вf*\iw§†/Ÿью_нlžД47яч!Хћ dE/я]юДœЬžŸd/Xu>юХqТn(JхОљsЄїŠnи к„„щРіЬHba3§opАГЉц*В\гtГ~ЌЋ†)ЗЎ7?пнэя^qхƒЃКjу}8Tц2•UˆЇх­~єLў1С!*НФ~šeгH‡dkФŸ еЂF€~I“Mhј™Б{’ты>>ŽИ§ЭэУ5є"з&џїГЬС}уьгњёeoЗкUэ/ћй z'pнА?І’г ‚ѓЕЕг˜ЬdМ дгЛ+УšфŠŸЪфeN€8‘І;Q>D`!)e‚ђ.Н\џД}RБђС ВЉBЇŒ'ЎEыsњщ§NЕгЁЂЏ‰p{Кu'ъAшЛ~˜SБECЛАіп­ЌЫ_Ÿ'У%9$ж‚Љ!ЬЈjщЧ„њ&˜вЋ“Ы‡r­%HŒР%А|Є/ xњвђцъЧ­ГF@ЅVb‚NT$ДdОrєqeЃдфЅцхё—лІxћщАыN7JњУnьhšKРYкxГђГїZqeK–њщ) #@оCB’о\яНП™7НЉК{м—Oьƒ^OНž~=2д{kЭвQB‘чЦ w"і^)O>?.Ш~0 јG ‡/p{г,]юЪїЦzеЇЅЪ}Й|Wiб~›nTŒq#„'I№сaXZ_пќpЦ%dЄrK…NЃЃ‰#sїћ›Џwк|ыvџЭЦЦлнуН­5]7Ќ­ЎЅВћеѕ•ѕW‡йч/Sаe,ШЭіРeJЯа5S§NЦ€Ъ‹ЋZЛнnUK—Wх.РёВ1‹ф™а‹‡єx}§ѕћS‘ŽжИя("з,W%'vЅюэЧ•ѕwЧ{оПп988м}ЛЙёцŽ’]3 :ъr*хібЋЕѕWмGђQ”ˆ-YБŒьщИŸјžC%0еtэћЫ pq њѕE•B{ ЗH8ш=PчrwыѕЛS)Ѓш}i\ЛQ.szрˆэ›ї+k›;g`ЭукW7жЯEUq(ЄвљVГ-Ј~‘7оЌЌ­ЏОбП<ЬrРрœАрєKрѓнЩ@›CYšvGєеЁлюХЬМ;н~Г}!Іp}[h5Ъw-йВХжх›Е7›ы‡ї^И[ПмоX?эЂ(•;Т§}Г+йШїCoUЊ‚,6Яж[]_[СzEВП;ИЊёz˜QвЫЕZ]СЬІ§лзkЏ7ЗONœху—Хф ЂШ—ДнГqfЋ ˆt!}Л~№*Мš]Yг§оэ2Ч )rgЙч˜Tš„о]]нќp\q)Ad–XbЋкјжљњo/Wз^О|ЕКњje}чІ%v”G–вnЏ‘ŒЧЪікклуГЫучbъ' †„OA:Y'Š–,У0mЯЕ4э›+4У4”жѕuKзыFA=gQ)%J‹ЁVкЗwгшjЩ§VN'ЖиlrнvщнЫ—ДЩ/_mН_[н­JЊ%БoJњWеЮFу~ышшгюХХййUВЄхtYл,6™Їa/Žу(Ž=у›/:šarчђ№šƒz-Ib;JY(НЃpiœtOЮБ.ЊnмыГœ<6ЛNЗS?~§jхеЋ•—ыoзом ЊP2Ўtф# Gщva ’аИ=;:ыєѓlо|BЩСјыБЁєv2Qžфшпк&IQq@!цЭсI]R ж1ˆ zŠјхЛХчХh`Uл*љxЪц0фxК :Bх+k+$єЫѕЕэ†$А>ѕЛšhxИŸ›LњКLЖXЎ У‡п?/џRѓщeйI mњœўЪ7О•KRндSЙъэ}[R Џ7eеoFЗ€4%X9UЁЃР†уE:БaœЦNЗв$ƒНC~ceэеЋзkяюЩ=q­ђещ oQю†ДЅ№8YуЛВrwnNŸvWеИуЪpЙŽ 온A Жьo іdныEКиiv$UЗу!уЅb.*§ІrŠ$‰gœЈ"J8КэZќѕе]щфнцњъкњЪod‹*­fљh{џДfFžx?ѓ5п"›<‡„ыЪ‘ˆГБps“Ї”wFигњЦ›~Хp‹Т–Ш6Ћ‘*Z'кkh.‹IЕSЭђСNгц@ŽIџгvЋѕУOћЛя6жзШrМzIFdsћ№h{§нсEзћ WЕtzЊЛІOYл—%rŠй —рKЇ•$Iф;m %!њЗв,I–ЁфHжzёTNy`tTшэ@n;š„œњŽиъ6oOŽ.юp›їg{ЗЖоНY[Y]! ђrхеъызЋЋo?Жp[cыŠ,kЧŠКсV2бР &`џЯї1’-Ъ‹)МдŒoДyœiбp˜GIoŒ•jчjVЂЂ&KЂѕCGНо?КiђЂLъTЙЋпю|Кип\…љ Э^Y{ѓіѕызo>зЫCCЁШЕѕІhЧ‘­&а]бN"]Ёч8IŠ•Iv XлВўэ)ЙЄЊvБd}>”ŸйЭJЄiдaO)ЅsЄЎCYuФKd<"Ÿ(9NOЙ-•6˜афпlьМyН}RMлу8№ДіѕYеL=U4sD1ИйЫ №ЊJOZЦhиyЎ‹п8с›c.Jі` зxф ƒ0 ЃавСSы у|щfŠЖV„ щЉ’šЖв*яS|ПОЖЕ§юѕж›ЕяwЋ‚бVЏшХІOЮ5Ђ1 ”L•ЏW:нnЗгЁИ‹&ZЭNWХo‡З,ЧЫцѓК‹@Цž›І^>…qzвъ +ЁRюЮ§w69_MЌэЎ’*oН?НОин\ЅЯšШ…д1™ѓы&˜€@­ ЗЈ=П=ОЉ‘ЙЌWoЯ.ЪM ѕK€VжО5#яиvTЬч=OЇ @&РizxYїКi&0€xJB:CЎm›€ћчNЖжVоОпЋхэѕЕѕ%QG/žXŒžгl0˜ŒуљЊЖкbэтЎещp<зЉW[ЄœЈ`~ѓo;йlбwuЅsёщ№ЖIо9ЧЫnђдЈ†яЩ‚йэёx%qР^з%;EСфэћѕењэYKчЯ7ж7>е§Ј„A˜Ђ^‡д‡хѓ .DщшL"ЙSЎЖyђАЂШ#aт:›ƒХYџЦтiЧrђYшJїђрКЦг)yќ<+c7%lЋЧcЦО…лž п„žчй†ЎHэУѕЕvэМЉ‰Wo^ot5ДшЋЮqs‡‡Ф`ПgуЇюIђь&WЏSХšIјZЅЋ’N9жЗо™v2Š-Elммu(94 zPŽѕЦ3v7ƒшЃЏ“щ ‡ЮЛ,ЁЃЪˆŸDёюэк‡RхьЎнИzПБ]%g‰ўЁ э“Я#{Cёт‡тlФNФръЂьˆLГ,гzэЛ†lЁч|ыЈƒщ$}O—:Е&E І5К —ТЦBъ =вЂ?bЗj(Эі§~žBh‹LЌ$vNЗЖіJWgw•ГЗ[]эz~œeЌ*њФіGЮŠѕГ TSšРwЛ#МЅ%ё-Aw“ЬwПuf]А–&5š‚Ђ~2€‰{њсьR[ \Ыbдf)šF?Z64№6ЯNЏw.юЯЖšt†5“м]˜$Y€Њ(ЫЇG™§єё(1eЎе=.шy(%– 7ыљЮЗ†ІКщљІжНkЂJ“ˆђщЁŽYd‡А—$ХVSR;@УzьЦц1%Тџф›ЕпvrЗ+ўмВm—lš™FЌ ‹9е “zЬZPЧЃЬ’љvЛг%(‰ац)жьљіЗ&Šщ8К\ОlЁќ˜БЇкяѕиizЭ^eƒбtТ(”а.3`9iСУ8–E–Яr…Oџє_VK–oЉ†‘Yы7)­!.хш[‘аЮЦ(дГІЮQю(<зю ЏK”„vGv’<јцV,ЄЄэ“+‘#ПТ ЂEЁmt8гFLОJ2Ѕ§P$‰Іi›йГАMЫlМyЕіъP"c{фXH;HЇщШіYL0f­nИ…ЃшюiR‘і:wРЦKFš$GйУ‰ђа§VЁІn›х§;є6{ш…pЩq;œG}OšmAp№ёp'ИАq8 (A№'ЃЊЕ­—k/wШGР6J›=3Ёбd3$ЎiЙQ]хŽћHмјvЕй&hИaљп|MЎkІ\:o…‰№ЯЄІšл›ЭЧ™ЋuЏяxЩ!ћ7уќO'ƒ‚m5йъо!TлTхЦл—Ћ/З) ЁЩ­—йдЅVSРГC"d8MЬvŽмНкоЏ‰’нЭЦХё5щQЎ‘І(5аИšтї^­Ўpє6šRы(Х .Y 'I<‰.4oяE::#4bŒћЉoрД‡Crщ9ЛпоЂЌВ‡ёљщUpуэГХ(4ИыэOї<шœŠщ$ЫI-ПvцpцiBР@Ж*]Ў­l”Pлv| r‡i&•b€Ћf:xINaK ‰нЪe‰7НtШ:•ЧyL'УВёщl8цЗї dux Y€ЁЏŠœЌЛ=r‘)WііЪœ Ѓs2Œ‚С: {hNЦ^“ ё)QфЪжЪvCЁг!н ЁщЈ"ьї`@Щvi1Ђ}е)иЈž]uM7Ž™(0uт"y!›Џ|O/8Й%A —*ё!н|2–к:=МЇ8Du(Љfž—т‘qHRгQDИh ”jo_r*kAЄh<"}&‹з#з™xЁwœћQь(’а-эœsфJ0˜Ф:Гz OЇ€‡ьяљ *uлелRЕ+Њ–л›Я‡БЁr7g^$ŽU^dШ є/‘ИљгVSл›NnѓУъH1mŸУ(ݘдДс}ђ “ЬЇoDИ№„Л7ŸЎЛК—Тђ#t%–в­””Н|OчX“ИћѓуЋ GС‡—гŒ]МПS’ЌиdМћ=Яї}вKФгIFZ"D #фДQэk‚ Ђ ’ ‚ЛM2ŽqœцY>J|пMq’8$ti{oїЊKчq ,inЩЛ:шАОыжЖR/Ÿп4РЕыјДЯфStЅyUCСB5ќа zЉGЇ.eMШdp3„zPjЧЁ(`gэœWuјQЬДn%…cЄФлѕЩЙІ6ХFЗЇ'{{%ВiŠРа2 TQPLrЅжwВq5 УЩЪ’>їpq#”яЄ_r§0#ЛKVŒ<ЎВ‹' ’AAЂBsЛы—‚Ђ,c!ƒG›JGoнЇЕєCв<ŒL‘ыДšЭЪйiMБ3!А-є`ЩTЄhп'4OЪЉ$ыЫMZyžњ!Œc˜%‚aГл­^о†WLXG3šB`§ѓ[3—Їеbў—Lеx1-CэжNЏШžшЎO–#ѓƒ„ў-‰в!ыЛ Ї“Ь”уRтE†VчіVЯŠўŸvš‚%4]ŒY'm^L2ГAB!‚NiYŠNхКЉZ Ц1’СЇzСwr Жубƒ,&‹1xњj'чћзрMv\з‹3ЯO`ЧтЄyР:ьGјe0іIСŠСэ­œ№:f<J“Фшы|jёЬЃд'щЛq@й f"dАJw’сѕGНШoёЂŒЭв|—а’уХИЌžSп5:Чяі>”@kЈ2™МРCŒЄТ­ѕб^СJ!vGYь9FgoхгЁF—§˜=ђфУ$D O?Фє#\Шз-_rš z>YyAРXНїяkёmлNXP˜@q˜k зя7пl^"Щ•EЎ+КЁБгїF˜ЩщŸFFhќŽѓФwѕюоЪ~m Š4а Щ 1(5іb:ВŸF†Йшчх9юўЈ"+Noˆv›“tŠЫПOЅ_МP7ЁаЁ„\онмxГyмAџлэђVфb,‘,sŽ`‰ƒ›Ў mь‡коЅ vš фиgZPћ,Cџя“аЁю*зis<Ян|8ыЪДеа M(ЗдО›пЊMQ)%УВuK{я?~:о?ИiuЁwy;r)|&Џe=f ЩŠБіЦ!йИ@KknП|WQ)q›4ХљЌїБˆ" bГЂH#Дyh&eY?7nї6ЗoyеŠ)Œ=ŠЩeОѓ§дЂeЊ*ЖяЯЮnяkзŸ>]”ЪЭN‡ЌBSќL‰eZ)cLb†ЊOYy{{МџmуZ6œ€<; =d*ŸI/M{§4Єь<ђН<0уPюЖšћѓЕнŠЈищнС>em?в/Fњ[П9?9:ЙЎwОsЗћцуоIДCrлїТ˜­ ЬTœe•=иjGяЖV^Ÿ šEЇо…v !нЮ]Cц'іН,0ЃH%ерчяWж67+‚ъцИ-Ы#вЫКvy||uWУэЉ*uKлo67ъœ$H~р`ЇQXђ}2С)Є!KFNMœ™kЈoоЎяД() b”žњ€иXyЙь0Ь}+ІsЇЁЎŸэ~мZнкЏJТ0Lšі5оЕЩ` ‹A[gЗ?~Мю’ Fž™Є~ХєН”BЗфпЖzDЩeцЪўцлѕ7wЊ$Hч™T)Ќ bеу wЭ8 lUЂѓнjПомкz8)„SS(Ъ lJщФњЇНлвщЇЃКbxYXж ]‘qСФUЙu^$йгЅдЩеУ 7dЖ|Ъ%є!KzHez6/тzВVQбz?ВCš‘Ж†,-ќ$ГЌG"4%^hžтђМд–@ L.ў;CМЏ‹Ѓ(Эѕ(}RхњUG–)Iі"Ъ?RЯ CФю5|LїТz wM2dч‘вИ2)iћЉдl–иewˆ/ЩcB[шGшІ™щБc‚iЖ}}е•$Б^.79Щ№уа1ОГ‡щыIjЄХš|Э‰В#8Еа ‰нЄ­v=ф­d$вЄOYоШ‘юїКtщр‰5NЩo“Уm&ЮkШŠеИЬqѓФЩх“ЖП‰+—8”ЙfНй5ЪЉtаO1M”5сњš%ЦЗ‹€5ѕМд §ю’љKрGуi_Ћ~ZП7ІЋ]зEљw#к(…O2Лј6Ъ~B/4Ea˜!ё\Ѕ,(ЈN‹|ЇйС"ќƒBгVƒ§MmŸЕŸˆtI1ь(іВ"Ђ,{ сA—dЌžѓЋЏv)UгХЦЮы“–б й(“кИ4 <'С”ЙNGx‰„ЎWxQГДЊ ­6Eg?(sK511+ЗЏKIфPE‹ЂFЇhzЎ‡ь–"ytьіѓ>к. ЏѕўхЋз”k)BiѓЗ )…ЇdLƒ‘ыЬЖ…ˆ• ќcќfЕоюpДю+’Єб2uMщќØЈ›”ŠЕѓ§У§НГr•A„y<9aпs|—m(ž‘ѓт2ež™мщкЫ—ЊЊм=XyљjЇ ў>ьб ,$ЈКžэѕr7ђdЁ[ЛЙ,UкХэF”X =ЯŸ™)Т€ Цпјxpt|ИЛГxzuФ#ŠУаІќчŠЮЊъіљr6ŠtЙНЗњjѕPPЫ›П§іrЇmхЈПћEюQ~эа^вђ,ПˆаW)”Ўžюю_^_ДeеKIьўS3'ˆэвёосuЙвiПyЛsr[o#dJЂо8ГN9O%щxŒipВ)”єнПyѕjы^=љэхo›зМі1@дзi“IЉ]'%Ѕ.`ЮЋ]œ•[еГO чЪГАxп5y‘ВкЪббmГ‹гюФIћЎžFмNЦГХ,=Jјсx§хъЙќщПО|uдU;.а PИJ‹L›n]Hža нЅ›пVЯЕгп^—а0DЦзя'}Вp6.Мщ=ЛЩxˆ@ зЪVНо%ыя˜JЗоРMО"џ˜џуЊЕ№ƒ+з'—”СаУьRšHR'§ё(vŸъп) Ы+*ЋdВЎ7_nмyхе;žŽ€Ќб“Ш(!IPQХiгДH…œ_эњјЌвUгЁдRєm‹є,Gё/ЋЭSFзЄWP(ВN.Анx4fУa`]ФзЏ_ОmФэЗ›ДгЄQšЊлf8їJM+™LћБЪsЭћ›уНг6}п1Tљщ‚ќч%-WkzЅtv№qћјќьќž mmХG§€6:ЬІd8Lр] х“?Y}} ѕ•OЏЯ8 hДC!йj˜Hэ fЃe‡нNЇ]ПНЉcєRc-ѕш$ћїlЇ?А86V­ЪBыіdog{їЌAЛ‡aJŠH“1y П?[ C‡ќ/e є•rхэкі?ђЏжо!žB…nEљ`ъiЄе.юїІƒрЇшqшT+m…ž:яЯыF}UцЊ7g;ћїю`vO“оp2ЪМ”ќwюрЊ Šв=X{_2њЃBм];шP~&ыІFЯ?$фCmзI' RЯ"\2ДЪUN’:ззхjƒБнџєв ”BЪуšwWЇ{‡5ejгЃш8ЩŠсd\ŒУvT“„рЮЖо^ˆљxRЪБХѕв]­Z:Й(•+ЯТѓо`BgНР›ŸЖwЗwяш1ЂФвЋІшюY,ц}п$­iК"qчію”s“ЈБ§ЁŠ'#k†ЎН<№#/ЭчГ1ЛЅ ОЈ(ЭгЃ‹Лz]Яb:Zч™–›хdŸjGŸNЯЯ›ZЇЗŠєСhК\<,z„6Lž~8nЛХНk‹iмкоoIИ‰дUнIњо,аo<Р@ШТPY(]5Ym’уЂњOŠнPlCЁ07‹)ДЉ^о5хJƒ™VЛjxѓхуу"Gзi4wЛћўDHё0У€а4Ўэœдd@TУpв$юfЫхЌ Ќ

щ™2_-]^мЕ`iЫлзŸ>Uш˜є’ˆ‚ђŸКN‚†БgЈѕгGŸ;.Ъ7"зnѓz‚СахrT]]]Y?’‹FX<ќўћП.D FŠ'С§лWЋЋoЪV4Y28ДiN&єьєЖ%ЁУ %Ќц1`+Ш‘оX?жU Ы Ѓ@з:— :P6ЅIЎЉHdљœоxŠa ўэЋ•skМ`i|ў—ўьL8бБьq{”ЬœŠЮSРЫYпV:Е&:ќ(ьР§СaгtвЬUЛм7Oќэ}\H@ЉŠejэR™SI5ЩБФЯ^NО…”tžзЖо—œ'§†ќы'ЁŸPižц•'Юэюіd iŸ??.fуШФѕЏх%yъл–к)]6 ;Шc[О-ё?HІaЛMнj'гdyбOгCф˜ хЪ]+œ>S“Ь_ўзџ—џљИ`јaР-‚џ)A2ќщчGкjR Jk]/Є8`’эу5ЮВ]фшЯAІ.”#ЁnчS0ЌЁ)TХ№Й0ККxјšКœсАї‚9Їй`є№Иd_ђ4a‡>Cn@Ѓi(I’рYЄЎЃ›™<ƒЩZбm[—)эг§І0 ПKf fŸ12fHbPє€Й>yR &#m№—G6[ієGЬtГйIє№Н}pыи?Ÿ!ОhЕЭŽMЖањƒОe(rOSЮєкёЫYЯЗдкeщюњЖƒЂk6a$ІЪ~g*Mgё>Хgј{дІЁ–wэgEІф^h7›œЌл>Jш`Ф.УЯро€DIлїљ ‰ђАœФ†ФнМџАћюэiЃЫ)!FбИ љО|aƒўь8>АMЇэЦч˜'Ф>n\ЭŸЦЕW1ћ)Š `ъЦŒ/5zк>Ш‚—~ќђх ЬТ$бОњvээыеƒzWДsмyaў‹сѓі@ ѕgМCи‘ @2f j>ЬIЋ§ŸWjе№Hб‚Д?fцьЩЄ-—_У‹%гуЯLZфљВа­юЌonН=ku•Јƒx`а$ѕ—пё.щћ&™ \г э1ы9БѓгЎх…HQЮ€uФ?тeП$В™‰KOџ=’уžі,JЇov66?•лœ‘ріМ_ ˜д_П_KВSx’™šТuе0нИ7ZPPBI§O §Bж­А7“!›‡ 3 БX<с^=@ц/Пџўћ—/ПC†й„B!яоnoМ;КЃ аp‡юq>š,-њvŸ}ў<‹ШFЗJ7ЕЎЈ™Nи#гxŽJ Њєьшє‰в# шЋŸ5c$6 §GxgУмИnekчЖесu‡эш”D”ВР*~љчпйУС_&>ЦjWЇg7UNЕн4u~ј~шЏVCв§С8P"0m`GАёcœ$§0Л­Ц˜Oћf—k—O>ХAгY%„ВDA hЋщНб„~`=<Ž]WО~{~ИVЧэ…ўspWџЖнЃˆбPїRч l‹иЮс`1)™Эž<ЁлЊ•ЯN*ki€sђ\—з œbh}€6}ЁsшЁИ#vлвЩоqMFЛбГШќBЂјб1$ОЫуВŒ7zѓ‡ЏG‘АG&ТgцšI№in‘кuЕгэrфNiuлЭvGЮqйЛ]>~aЇрѓ"жОе&п%ДoЋт3TyŸVK3 ]hжъЭњ]ЉмЕ 8БQ/-йž}~РF?~EX(ŠЏ |чўњОqЌf‹|SГошъХ3‘xktp WсЊх& ТќѓbgѓšЦUяnЫхлRЅЃХг‡х8ЇуѕЇ@“ўLŽŽљoŒiOњmіCђ/“гћzНZЉ”Ыї5€юD3цŸžіGbž˜jчўОк‘PьoЎjНбІ—Ж’ЩУ|лЂ@Žaa=бцёa Œqjы†›фФw.nкэvГQЏT›mN4Тб’сDݘ{\2н^ЬцЃижЅfЅ.Кђь”‘Ёj†§љ’bGэt0UЋNТЪ5”qyNа†ВР‰šЈ|ћЎAЧŽ`ЇЫSєŸ3МžХr8a1NŸџВФUy†L[`пй…їџ^ E5]?І—Іј7vuОбe лf:…—œ‡є‚^ w”%аhWZzSлAЁJNОЂaЏёѓ/‹A–@ј ОЯ’ўеъшdїнћ)EЫRЃЩЫŠˆ:П О<~™9ю4™MY8Кк­WX;uIЎeю№юг ™kж[˜)$ГгхДЙe  B?іѕfC6§ДM—ŸgБ‰feŒ™аF+ЯO’Т›F8S6W&Vo[’‚ЩAŠ\Н|NоmЭЖЄНkT›фщёpМ$Ъšbc‘*>> ŒN•W(+Ш?Ю#t‰œaЈ?Ёј7—jЙy?УŸA џM[VYFБмя“а_s­гшЪфп$Ё~}yЃ‹ЋЪxl?)˜ч'G42…ћšЂйQ>^-‰:lрbdѓї7еŽЂЪЯzoјWK4 ~9ƒZЉNV<36А8)z#G>K ЁzYЂtRQTБЪ„F”ьћa”YмJЖС_Vю‹‘Хн—ю›М№мЖю XކЎKJЅ%ЊКEY(mcoђЕ0I,Љ+(Кm[:kh‰ЂЂЁёРKЦЌіA9№и•jGЇ5I'Џ4А…ъэн}ѕ9jJџЩЊ6кнБ† aXmkQoі5Є^N{Ъ<ƒ’йMВuW*Э6e3d‚]6|ЈhNo'ПGКињƒšюžоPVb%Ѓ‡n;№УЈш…Ж шŽŸы ћ%oРЖ S‹z8šƒ^=е?ьєqЉЮЫ&иx№Нд КЂИюй™PОi5 i™$4й?/іѓ^b+­вПцКJЖнёSРz  КZnM§O‰5ОaёšNО†b$ 0“^EОЉVўј•Ж YшХ€bRфБчPtЄыŠјчГБ§­UЇEUXOBЃщUWk‡ќ‚Њ{ ŒП1ЈЁёџЈ]ўКZР:0qяГ=­[њу?увРBзuŸMм˜КёѓˆњЯБHGpI€n ]74ёЏ}šшВ`ќЪNјПЩчОкš‰ž`ПhЊќяPˆpƒ‡aЙР1 MњЋХ_­z•ЏFЕжh6џ/г[Aг9z џМ˜љЯX<а‰ОkšњзњЕ~­_ызњЕ~­_ызњЕ~­_ызњЕ~­_ызњЕ~­_ызњЕ~­_ызњЕ~­џ?ШqїрfўN‹гlЫђт$я%_iЪŽgўћ eЮt§Р~А‘чZrb‹b0ї"Ѓгеœ0rџКЁЊхЦ9О“а§Ч4дќЛеiWх КЅщАZ\[ДЂ4а8ё/hwИрЗт$`У~žЇў?RZЖЫї5йЪ& lЫНUс4?ЫlŽгžЯ[эі‹ї†йбp8йЯС§д’?Ў Œгщ0ЖјjCB…кр,лŒ{љюŽОЮuНЈW€гdю?RфІ&Y1™Y>˜ЮЇу^hŠo†ЉЏ4E/АбBsSКzб таБ§Є7˜ЬЦYŠNљЧшvХ6eјDЈCBG.аЎ\к{CЕ#ŸйŠ›ЋГzб 4эȘШЄƒр†ЄїџЁkNи›LŸ&Г FТРЗьАŸЇ$eтКъіъЂФY/‰нэЯцЃ,ЄПVТДŸeўпyЗ›ђьgгЇAіхг/)шO’Ќ_фIšцyф›UкщГ’’ФYžцЁaѕfЫ щЮ‹ВФНс0 џЎgRЗЕ^7уц Nѕ3’ œ”§$ Т(Ыcп'Уq}жђCЧ$э g0›SŸба N†t†џn"з'lЁ*њљ Mг  €;ШбАŸОЖ8ш$]Ш‘еnЙєgУ-–уФlV˘Ž!нDпN}ђ“Ћ­лQ‘ћFЋЁЧ#рЯ€K’мFо'BК‘ФyšЦЁ'ПxБ{ЋЛК ћiю+бxБЦrЄiМ•Mg=пќ;Е" ІЃqю)œ &0LOІCМЯpїГгYтЛЦ‹ћu ш9a[j>[Юr‡LMщvь|6уoџю%КhwOЦ=п2ќўƒmh4IЁћ§<є<Р<ЧЎЇПxqоЕ]“žn‚|'т[ф+%N ŠYс*ЂјќГOџїjТІСœ8ѕ’CYŒ/v2РЗ%ЁЅ№’‰жj—ТдВрњ(iM#ЬчЋжбU‘уРCйsAќ3ЇEўВ“ўh6›шfТˆПfŒHxv.вхае[Wз QSUщŒ€dћqЖєGѓYOkK@„SУb>ЫmUфЛў$ƒ0- DŽ{€і&я=eDТГ ‚Ё!І1\SlЗК|Зq{єёECTtЬwф‡Нсx6/ Єf@&{ŠЬsКRs†ЁJ’&‚Ѓ85уlщА{ч9@X4•кіЧšЊЉ2#y/ы ž˜М(№уbВX|$ŸтГЗ§эU6mа šЄеƒиеTУІЬ#ce4#AФ m§ьHђiпUŸм8ИHЦЃс Ш)@*!/ZјЖ…I0љЯUŽщЦ)pЄћLд)аFРjc”‰0с$2‚%пvЬЋ’ућЎ,9Де§САљї#:Р z˜ O Щ0ўЙнЩ]У‰G“QП?Єh-ДDQOІф'рqТH@”П KL’ШёДѓFрƒњAОфU GiђУr9€Э-KlЙ§gŽB•n9нЩ' +sп’$ д[sВ$ГIбg\O ФюхaћЎpЮљ> ь( iBи%H0?.№х‘!IВ№gщѕmГQnао2ЂбщЄчЂь ˜ž‘Ž‚_†v:Ч‡4Дl:ќтqрщЌ§ђ!БЬ–@MXЬ—SВыУadЊКe>њъД:˜™$#‰+ нїuI ‡`š€ЯeРT#7›gJFК’цтOвЌ p˜њж9И3AѕLцf8Ю\;|ћOe&u6]ЧkЮhњDБZ„†l$#FM9ƒ‹Ќ'0гЊЬuLr'+кщ g3Э0.˜^‚,Ѕ WХљэ'I"BЯ1žН+МA2[рА1#™фаTMlћt4с`ПшQH€ј^цx;vŒђ%Šdь аН0nЊ уCЇ_ І3uє­E’ л0ŸлŠш”рРS:`Є`y‘x@cH]EŸфN}Ц†шXf@ве™фљ`ЃAоr2glЁŒvAцzС wA€­ыyЃшIк9’ž$#xХKѓщpŽФ^>(™ЋЊІGсљW>:Шg‚)Š1Nљ+М>iШє+|с‚A+в#ŠЂˆбГ -ћ8ш“N€…iYŒj™NЅзRІЌ…Ф•x‰JtмЇ#С s“Nf˜›~ А`{І Ф‰Aa-цdW#2:Я§јVј`њRŒ Rpн‰ѓўxђФєNћŸІ=2`EbŠМ “]Žѓ~ћRіЂ>Ѓ~3пЭдcЪH‚–жuіc4вїhЯ‚БѓoЋЁ[^<˜M‡™obРЬЂ№ƒD 369`?ЫŠЂ ѕM}KюJfDч№fПiљcWLЬS$Ыh‚Ї Дz вVŠZbŠjžvњХНfкNTLF`S 7QњdJ†vŠ1C№І’а УѓДFMђBW;?Ѓ;ИSњŒъ4KЪ!Й3Ћ>LсŸo™*пn=ЋЙх$™"у^‘G€€Ч€Ю>шЗG ˆыP<№]K)_v<Я•Oюl?IMIP4+ю}ѕс№л?Б~/АЪrœyЖэZШœЂыЯT”oђЭІF/йŒ P˜Q№є Щ9Ь—3xŠ;ƒдV$k\ž5шБДыžŸј­ыЫr[ ?“yŠуЬКйd†‰лхМяЊР'P„FS§,2зEƒіBsЂТаЛур“g˜=,І,9„а‘Ъu[к§хНlkwŸъ”бš•ыRЙIJ>5 ЮЊQ њЎ'јлх0ЖdI–„ж§=Н7/ђžХ‚”J/(uЩќц”p0Ř=Mљв Crr’ˆё‹ЬбY–јЪMSю\lпžЇ4š<Ч)V ƒ‡,‡ =_>.I?>?Ь—ƒРК\ЇUЋs’ц&§ивП‹шѓ?^’юкп– 7-Ц Œp_ FlВ36hА(>{БяЙІЮ—яъхуэsС1ИЖlšІ сАq‘Й;oAŸ=<ЬІЙЃpЧoђŠnE՘‚ЧŸD:E‘%ЗКВfщф'sfЌшЇ :…Cђп`…ЅјФŽБkЉ­›ГгНн§2зjJ@їШGŒЅ›=y"ыІSˆШi1Ž ЁгŽœ’ѕ'У<ВєŸ­:UTRф40љv[TuV.СгыЖФˆyЙРTЊeˆЅэнНуƒУѓ’рP*ч Геу'vјь3=БIЌrœЌ€;6Ш‡уaЎЁ§Єсуtнrг^hˆm@ўhЄ$c§є8Їуџ0G–КЇ>Ѓ?ь' тђ щўуољэхоюDpuc2{dlhЯБIIЬb’ъМЈcFyТ і\з1ŒЛъџ,AгMгЭњ‘Ѕp ОST+!M^<.gГЧпІЄIŒБ_Џ В0тигЅЪўсUНzДє]ИMиы!§Іq N?/Їd/… р$Ч`98БС>eЈ?u[’ЁгЃѓ‹aJ–AтIѕT“Є~x\LчŸgЄЩYRвGTœF` m•Л=м;ИКмоk’ЂєОBЯKЩ&xнiЬ€™-f}ЪkžЪ'г‚œПхzЖіSŒ ’ЊЊи•Ќh8-@§)ѓœ ЙЃљуУЂgИ”К>8ыARƒQ‹ДЃu}ј~унћЭe•Ж1tu™яЊёpФMС”8™я рЃŸ=ЉњаЪ"ш5\ЋЭ4UEъђЊаY’и пŒvkљхaц5Є< 7b)8шнГ4ВUОzКНЕіzcmуЈ­XЎ­ЖkMNёњ#FEЯL)ияŸgУ'tTfŽІ )OВЃ+ђѓ§Д(ЅŸ ’ЊЛ9r№AbƒЇ4_,&вwоNГРД=TР(цНиRZч;›ЋЋ›oЗ^Иnё’аmƒ–Ђдa™ЩTRюЕ$§ЭПl<z№ubc?œ/JЊсћєЌ€mGЃ~pŸrЙ`Hц™"‡БyГWЯ@ˆт$B№/їЩа№їяоmЌЎПйZпиНИМm‰:Y‡˜,ЖšUv(›.І,жFіУђє8Ž:єNЅ3жMе№B0 ›ЖeЙQŠ;ЁщАзЭШw/–ГЄКћОšч‘ЉвiQD‚оЮзКЅїЛ;g'{п:ih(іRф:ffvз§ўфѓч9`“ЦРŽфвї›"№ŒЕЛ%;.AЯyS”3†•?cснxђ№067Ћ§,4ћzа§иVšЇoзwЎы]žk^~иОL/eїту9ЫЧу~NУШn’sd˜c€GfuЬdx ‰І"џHšK9*8зТ„ЦY>ќЗєuOŠ‹УЋ7k кCв(Єф#Œв^dŠ•§ЭwЇ5NDБqєёИЅЛqС8lЇЬ™OiХ‘Ь –“щќ   u2ВрCвjЯO{™ЇџШVЗ4 td6hт€…Ь˜Ÿ˜&$ѓД§~muГ™ЧЖ.Š”@У^ЅЙЏђх­гЖ(‚M,Нл)+v˜#cŒЇ mДББ]9sС8eц€%KBю’ь=и~ьђhu„ІeX^єъНdxD,2Ѕис!9Y}љъu=ЃXRhKІ—!q‰Kъ\Нћx[-о\Нџp)Z~BI№Н”'žэЦ‰tќЖ1џђ8c).АŠ n‘њlX Яќ„ёNfxgšсxaœбЃe2Яёт›—ЏV^WђЬ&WP—­ /zIщ|§xѓэюўеэеХUЙлНм=—(ш Yž—žŒщчQэнъq Џј5ќzшђ30€—#Yв•$[ЂТ!УtќИ7By яШggувъЋеЕззiпWХfЉЎвqыѕzЁЦWіW_VI™ч'Мцѕћ#2w(ŸХ–Њ:AЯПкXyk>|І­fhёЈкк•<э4‘;-NќAМjЋCYi єЪPнчЈ{’Žі_­аWб 1„vхžзt'юѕ|…Лп}ѕцЎ]­q|—k4š‡ŸŠ““Gи1ˆM‰“ь 0їWз_ tч&№*4=@ Ў2S–TE–:?RД.зъѕ& Э‘Fщ‘† ё cИЗVзVжЖnМAЯКнZ­#Ј^š9RЛєёхжmГЭuыїе'œНН‘­ЄRђAц[bН&ЙqŸГђzЕ2ЭС‚э3РЩp=JїдЗLCSО›NњP'Лf­ZkДЛ€pёгЂ~VЕxx˜VжVV^ЎНЛsŠA@б зИЏђІOYjчъэЋwхњэХол­­Ÿў7{пЁW’dЧпІ G ‚я хЭѓо{oЪТ=’ЮъЯ‘ХйнеŽH€н+щ0ЛщЊЈ|‘72#я§ќ~ѓœг\Рž3Јж5ОлшЉN–ЖзVзW.Š/_gd— г rѕЃP|]—iшрг~иъˆКUеmооxIб|,Щю!ЌУВёюЭкЪњNл)ъDсxŽщЕјdК8<}ѓњЭіћЭЭ­нээ­ЭѕѕЯ#е Гz;вшюЖЫЋvхžЌЌoЎ&0ЛИJъrмў],ІЈ›ЎeBфњсэV jIмА;dQДВщ2;` ‰[G{я7пlЗмr\Л<mfDK:LeяhэЗЕЕЗЛWн~ПuКНБњБ )3ƒ%(un[}(ЭгŠ§№zusm?D|:_n=>ћХ8AlŠŠYЊѕУ”В Nз РЊЎK,ЫY4ѓщlYLCVtWчћ7З›”,™Ю2,CгМЌIlgџѕыеѕ­Ѓлnчюbkc}Ї'i~ž8гюAёЃ'џrэЗѕн­ЃшЫяOјrЄК'ЙkQ‡К hI„аcйњЖ9БTPFXjк3œфжГЅS/ .97gћяЖ.UTхN4TfЄhAцщжЇПЌЌЌmОл>К89иймX_пЇ'Ў a4.щ+k;—'Э‹.b0ЦjL]їГЬжDdІ0њG7Щ]Ә‘Ц! MСKф3В]‹J‹Йw{tјщуцл*Х“ќ ѕЗЉ!'rtѓу_~ƒДГКЖЙЕљіэЦціAC0ЃљPvMѓЊZ>мX{p~p—=‚{,Ы"yР%9I\J<?$ЦЈЛzƒNЃ/ыH[‡%Yшagиty*Dvl§ЦчЯŸовП БZ­3(XиўHр™Ц‡п^УЋзз66пЗ(ЩŠПrЌ Љ†ŸMМѓwАJ.v.bpcв{ё@ЖA–{*Г*ђlгА§8r~€}(IlЗIAGЬ‰ћЯ†Щaкg*ЛYакп§АЕГwDгz2Љт˜тАЫРLяЃ!Хo­Џmп˜*SO…ЅЪIЊуМѕV№ёЩѕўM xOщРдI‘fХrk1ъ}џ™petqйeq{ЦЯgKQœ мj™?нO3ўфгЇѓЇzQˆтмUUD‹‚\§уез+`ѓкЮоњц%Ї˜€o-iдgx \=žИчЧЛ;‡ЧŸwк9ЪКx4Щ™ЂЋ)Ў€эxV‡ЦwKї5]WщѓOЧMF”dнCВњ%њЧє 6NЧўнс+ђЈЇЉКI†вшОŠ2bЃыЗрбЋkЋлЛ;=Q‚!ѓ§f_дНwЮЦ!TєЃЦхљоGaђєхž„бIцA ƒ•;o32н0ІЙ­ЏvgиЎЮ_5†4УWA8КXnЧЭюЇу\LФё,ЪiŠ6В…fБЭwлноЭ‡Еu’.п­owLяцКЭ™рlЧI‰цп98ЖчOOxв5›cГ>Ь2В!‘у>ЌџнF š\а„€œЦAIxХя—;[№г9 Щ[“ейPЌYвьРwЅцљѕэЩжњњиНЖБњіМOQН‹нН[Z_к ѕЩЋš$ЊЬ5ƒбфќ€”lj*€%цЯюП<‘…•ƒєф ЏкиИ‚2sАД{чf‚ЄЛe$qЈуŽЛЏ€4H)4Уm8т,цбEAb  n жГ­НэЯ7пН][[[AЃWWqЫf§нё@CЂП8АTEдAД­DёRЌŒ3пдБшЗlЩ50‹CL‡Ч,чy(­˜V:4ЊЄrBDж№8 рйЧCxьo $-L,ыьœ]пн5›зЇЧ'ћяЖЗ7жqЎWVW6 #йОтPВН S,7АЬётёq1УfмBQbТn*фDъ‰ћоь"š]Ь#B%JЊўіKa=Уb‡™d^Ысy Ї'7=ыu&юŽ.яі7VWСbЈlЖС7оМ§tбхdЫЕM]цЉaoШYilЉ`є§уyN ЩйqШЫ2FuрЬї“RЊjЦX%ЯС Kвz…И§$zL„дž"*QYUejшQGEWйAыє§:X џЏПл=јјёјv(ЃxГFОЩuЮoЄx:еi3YГ9xˆ@"QjfYŠЈЮђьїз.‚Ў;ицS&žeYŽчю+Њ[‘yŸ†дX`ч.| В]ЂЛQKјцGpщ7іїw6пlОн:І0’сњђС­гФѕЫz\šf\=xЃPЄZ­…њдpˆ:‰`ВˆъїфІхІгYщHQ%ŠКЊ, ’]‘є5ŸpћЅЦ–XьLїНo HКk+[і›нг­ѕї— D2Ы@UŸ“.кЊЪ*№шйAЭS…Дz`56З;PжJ2D?]ћюЪВЂЩ-ъхћСПVU•'и‹ња „™бещХнхaЃ{Ош@‰‹о‘иБыTXфlh‰ЯёE3GwЅAФfiAwГ:q­я5Zв №ш! зMJlx$‡сфsŠЊ€U=%аi†]ІPf”%фKtA&ЫВЁv7NHlHщЄх))РъК"/ˆн5ˆdHќРШ7ЉBCц™!”љ(šеœlœzіїЪЌВиыHї nБТg‚t,H}•ј. ur8_дPCbvI#l AЉJž’jvsу/Yp3I5QЁа pЧ@2Йю№Э)fЄЋ&фШkB)yАœ–ЄъfумГПћt\™oЗЭpвš т6 ?—Ё ЛОёќоtŒС#СўуhАKвP5[=\]пlZ†,ŽmЛиsšЄi–PКcУцU<СХИƒ—ўА‡ЋЮ}X"?(ЯЂFqUxЮwWЖЊІДNлВaљi…Me–cРгqс[rП9ЬlJ6ШйсŽRМисиCБX…п[Y_Л†˜ Ъѓ|bt†MЪxї feО–ZыœыВ:Аў–ИJHB= •‹ѓнл5ЌЬ^žSШаїU uИ~\ccZющRџьфŽVќœy ѕљ ІђxѓˆZsОяУLK{ИВК~%АМBŒі-’=bj>rO.Х>ИOІѓ<›N‹XјaЛ1Rэѕ*ЩEнY A?‚йђ\ь"ўўгЂdCй„ˆSХNЬhz?Џ#SЗ9(+Œ ‡вжЫЧшє8еи+Ÿ„и2 Щ\–ЙУ+Ыќь˜РЩ2ФQжИŠЃЈЊГФ†LТt[ŒfљљЗ‹3X>зeьZ:Ž!цяфPАA |ŽтЗФ;yŽ)оB ‚АбВ*4WЯъЊH3›L`%‚3б˜cdюxЋƒчгА2’яШАу/џAєШ=/Љ‹8В‘ЇoЮ оУ<эšc'T/,M§аyrЫє›­Ю€“эVaО=jєtwТ(-#зѕ (™ІЫuœчЋ‘‹?люЫВйC4L5]р5)Hцy9 сЩ—UœxšРsчn(riЏ!ЭO"]6[НюѓЎ thQ5’йbR@<с а– 3—ЅИъRl3Mт7от{тРC "ŠЛYбЛР_уJk pWьTЈъРqРi  }Д}|coN˜VhcыvhAzЮК. q {=&yри:5ф% QFy ы+L&“ЂЬДHPмl Ј‚ољю@’u]PFЈaŒYaХbЉ2ƒnPDЇpLћpoя ‰чЇ5ф[мƒ8ЅAЄ6M§GЛ™z4‡ШTї&SlИГTbƒ%!7ˆВау Ќ'x}т$F щ1‚XDВxўiяЋ/б?:Hš•xлНЄ$Сб‡i‹ нэt›Wз#Э ЊqО у*ѕСћмUДхЁNеЁRђЊХ ,t,e8Б9/†˜ 5*,Џ$ŠŠq€‚м HIfA`-žэісЉ˜ТбdXŠy=` ЩС™}д\bп‘p;jЕнI х:Ž ЅEъџ р1e§)л/яeф;ІвkВЈ,ˆНU D1 Iœ#^‚КУ5fМт4X€Жgл=ECЭoЬ‡QУ БгŒЎjпХH$И ,=ТawыЛЊB J/2фўЮ4I)№уъN˜Ёswx ъž`Yю fƒбАЎpWbЦ8‚КЫuРшw-Y3ьeuˆНY‰эbиj]зaŽф{№ТUМ*pLПУЃЬojЫXъ8N@n4~ЬЇEЧ‰s”1„d:Zугў‡SN$Л),oТ›’ї3bю‡ŽЧ$1Іa˜Хž юБй€EьРМC€Ѕ6ЊŒЇ5ЬєИŠCє#? ь B@хшЛОnU бŽeјМІc[?x&Ч8N„иІЮ d5щЯ[;я?їЁІрhшzL,†)všfхPрЅ`№ аƒ&o^KА УР…0 БР ‹иM3Q“цєРKcгLŠp†Ѓ/Џ$УF ­‹, ŽЎ@EЁџ`W!иorрЮwѕiяфќьv@бдˆц3 gрђЪёjMšеˆК'ф†ЄCxTљ“ѕsмHф@ЬŒ—S Ў јxfЊh"УtvћP—хu xс юеэSal”+З,л”Љл‹лЮjŸžнм  Fœ8€)Eй’щ %bСћ[№Ь}мЙQйУеЯ ,DРв(6 ~ˆ(ѓ!йЇ№hМ+ьћYdEЁEVП}}ИѕіŒСVВH<Г•иgh’pIu]•˜nГCaм§МГw6‚ТSr#?ЦЗ…ЈёяfхyM:ЉЁ№‚LюЈвhomЗЇрОЃяфCMІuтAМL Ј(]XŽŸ…všЧŽ[Ћkл—Ќ†іU™„€žе’мЇшQПзщі(ЈEl|јpХ‰’Ј…ј*РG0жžРgY…ўQуHcG‘;{{ћЗИM„С#Щ КрExјЧ$/"›ЙР‘RпЮr_ƒеM5>mmНћpХ(šƒ+UiрXЯЅwшSЌDЄ‰Н<ићмEEВ’РЭМИ FЛ~ў!­Т#М:žDЎЎ4NЎїYРƒ0ЇQJ6*Rс€ƒЁ`‡1Є’,‡ b5гМ;}ЛўсД/с‰ R*xЖћЌŽ Ё„ћ5БчДwxкbT~ rзЬ •„фz€:ЕуlŒ6уJѓ@<к;йпяi&ЎBL?u§ tЇYр†$Ш{!Tлi‘@е ђќЈwўщ`gП…hЇЌ‹Ш5žХ€DfСbкВ-UсnЏЊ'ё"”Щ­ѓ‚р Ь0mЄ5v9Ÿ5v­Gƒ§їяЗ?žыHэ‘Єёж_ a2+x`w8ЫŒsˆP LушКзПи9шIx§ ]ѓYьfT ЎЉЪƒЭ+К(и3]Т3ёj3dэ ХžЦ$!Бx\DжА9jяяBƒ’%'FЃуV‰ Z…ќ ŸsKn›–РRС­яЮМ0К>М€чы$9<ѓ93-@ФѓТ,‹<]к]kTџ-2ЯD–МсчT€Њ§ЕРНОDя1EЊ*fџtЄћYїI †ФИ+ЌC|FIц 4GrŽуZW4ЖФєonG]Ья.ХџntlMв‹Ÿжж sŠ!‘jyˆ4pюёЖx‚‹q2іФыmSNо^ВF\тО1вyьКPр{!оO(№E’Iч–’%ЊЏNgШJš •вѓКE7Ђ,vT™kRЂЄ8рПАтЪд ъROvxС‡Ш№”ДWT}МкpBсѕсH №L‰ЄИЫф[Ўa0€ˆ—'nhЪl…ч†Ы)2O†Œ ъЯО+ЬF˜ЖІвфРз€6›F~‘У{CРHЉ3|—цPsŒЧ‰pўіѕ>НзќюлжТа&Ф“РЃСgп АР‡н6ŠFг№,гЦW˜wlQ{цu†‘Є[йЋъ^Дф ф {Р§ЌŽVvё|3Cь‰§ў№§ы•77(zои\љиRМ™Qр*L<ѕ†'…чІUh,5В<"1ІK ’…лмPЮKє№Йз†Ј7‰ЗeЄоХщU—сaА,Яs<0uNІ gЮqm !sHЬоћзЋЏ?‰к_yНњ™ѕpsЌ†ЅЎ„Єžƒ>Ra ‚­зЭ! &žЙЃdй0nсЩИ№l14жж-X‹Ња=о=8:ПmЕфИІ%;Ф’кѓ˜e0СЖВяМЈЁ€Киx§лк‰ 6оќіњ/лC=ЦјjZЯ”ŒЇs0йЖР(ВР‡‡ЗНсАsазЪsK†/?ГеЦШФг<•i~>ПkwюNііNЏ[Н#Кa1M Œ[PКX—esн8H&•O6бaиІ—ckVUЛ. дЇ•п^є6џђњѕ! XоŒ№‹M&кЦя ыVЅ&r?ъєXмдk^vXеOlEz1 EŸУіo VЃHїБ5МЎK—&;–a…еt>‡Ј’( тљњoЏ?ЕоќхѕVKр1кdуй,‰h-нУЖн| QаVАoщ xl>рћэ!ро@•_ЪAјEQёY–ef@NUE-Tе0ЩТ,ЭD˜q т,НђzЗѓюПЎS<6ш~^—К‘(ўш@9dѕ$‰|1ЭЃО 1O™ЮХсхХ~# РuŒ”™UѓЧБgт BKЉЛНђњЭЉ\ъА?аjлРь86,ШхŽ›‘“‰ь ЯB"`ЏOнў№gа!pЊц1иЊ„kёъИСbГЂ›n%%nђVГћћЛј5mюяЏ­ОйЇЃ:cіV7ЮАC&šє5L(d -СjJ@І†‚ћн.Х0НЋ 7нŸ!Œ-ТКЧЌиXpПыГУk‚ŠЇ“PQчфhgБ€eHZ˜РЅ‡‡ы[ЧЏOТўЇЕЭ[ьTMVмРБгqQ‘ƒЗ,Э 8д1~вwWэMг<6Bd^*w+ъ˜=‚"hгПў|pИв8QбL9–R(eБGaь$DЫBџhc}їZБт іжvz3EEE5lЯK'е ЏёUK&!МЃ% ЬККqEЧžтцA‡ѕЉ$O2R—‡''ЧЗ:ˆЌр7i…mї…ГьК^ьllt|:'№§ўЧЕЯ=\‹xjdX~6/№І| Ў‹эCЛ›-Ž,#ЁсВƒЫ|™еЂnът€3Ђ2†€ЦЖяšwіЂzЊюФxљЌ.-XЈxЋomѕн1эж„лmP5bіпьоAэ,ѓŠЩlЩD’Цž‰ Q]]єјHxoТƒ‡—Ф>Ьг‹ŒцС Z  ы23 zа У!Э В!хХуcэi\ѓ|яэкъЮšN—7Бэz^ъoпwiVТszПž#сиAo™ољчЋ>ХрОІŠt E™УЧyOаHz—wМ”…~ТR' ,=ьо5э!Ћ„фЎz˜…нн7ыЋ+oщ;ћяП5›cгOао^ПwкddУJg ь{ŸO W• ‰ 'M˜„б`аpиT—Йo~oлє0†Нѓѓ‘bDuс[?а5eА›‚XвЂDЇ^Ѓхн•ее•­+­ TИїЫ.qьћY,Rіp}e}ѓгЅd“іЯ'™.Щ­лFw0b9Žю7.ЯšЂTu'С_f4ŒžЂ;9К‡2jм ьфФўfŽЦВkLQ*М€ЖЖг?. tdq=љѓ‡ћБеиZ]_{s­‡у‡'0z15™щv‡ „ КЧ;Ÿ†“е1дНюХ§oоЩ ‹Њ-•i^wN&Ф7л9е`ŒД}їйэъкЦn?˜’лAKЎЂљќayС ў*Ѓї7VWЇzФ{‡PД2C‰xНл=Ўљљ ЅXб$Г$AЗ_l4MИ7Ц“*q •mЕX0€Qѕ\гIiјјИHлo6і†бєžЬёУу—ЇЇЏп~Oў|?Б›Л[—’U=‘ыХ#l#Уzо€@7ХіЪiЄ3Ц0^Jс‹6ЧХxRч!L зыгиЕfCщQ*чvЮчЫыВxЅњЏП?§uљ{(wФњвфDн|yzРЛКs<›ѕЩFЏЅЩЯу§t†П,П ™ я›ћQ’UИY9?i‡pЦZЎAБ„ЇШчЈ/ЊNZO YyГй§гrЯ‹пџКј§ ЙC†ЫM…ќђ„їiёїФtђЉц„’ŽАЛЫ4tЭSŒATg@†%Ч–xn(1юs  Kыё МD§ј€\QфјЁi:яgиЗ•б№Џ_№Bи@юЮуx|\ђ $™Teьš/xE%Aдœ0УЧ‡ѓ2'ЭKJ&тЕ‹ЧЏO`єзЏ`ѓгУ,Б  i]5лgЇ]–ьч‘И>Nє~44џЧёeљ„pљ>нЯЦUцY/Ь‡`ДfтЖa˜gпfey'ъžp\,џтс ,›ПЂ‹T‡|yєfчѓЛї ŠU#Є4`Ÿ7иŒ?.Џˆ“ёхщЖыš%ГIцќhkЪП žfсUСЧЇЅ3’‡љэўэAЃЭПуЃЧ˜у§љњлЗŸКŒр„х™pрмЂб_ПM8ьqhРАќЄBTS]‡/DK8е RЬеЫ9њBь›1mР]К28ЦяПУTcЈРV/†КиzЗѕёr@ЫQQВ{@ц„ŒГќДЭУЏуsœЈ8OЫщ§|šXЦЫ7= |шVSqœmТІ„sG\}уїп‡ШЃіŽe.пoюо iСŽ3ьR(Ъ1’РЇ{ФOƒ|фS‘ИAУtGџ)є•#Ъ(#‚ЧШјџ’эiЏО‰Ѓџњ•јє#rКUŽЬsЬЭ‡w'}šVАЇ ;АŸeABЬWтиј]№ѓ"‡eЇpƒv{Р`~˜п}йѓJжу٘œš`у.nŸ{МР№gœъЏxyVЧ .З>4–зlВЁЅŸЊћ _О’E№ћя$r,RЄЊжaиМBЫв~’$ЅqВБL,;ЭќўqщЧ_П’ХI>>lŒ,‹Ъц™aћjwчЏП“НU–Ež“т9љjЄŸўВt’ЇE‚зљ4j\ћъf$ЋЊђ“$`-"ЈгќѓєˆSЂ Бd’I 3MІ N•ЪцњsƒeXМC†GW,C3‚?џ–WШRРяљњС4д…ЊPІW]AўY2F#€НP ЬЈssv9P3|k гћoInщ*ёюЇеxœУєЯЯzУв Ы045ъi1‚˜іЗ(§ыŸж$а$HИШ№Њџ\й%^34aдКО89:яˆўRз$іl7*ЦШ‹‘ŒФ1№Ži„ЗLRWц˜ЛЯсpаыtКноpФ V+ёqIŒ4нc*њђз/•V Pg†іsIЈћдЈзjм6Z}VёkШШ7)ШивГ'т':ц М)AъђlџјВ?ѕ;эV/8ЩvNе!S“ў›rЖLIOЅkЈ<“ ељO5эІyd;™y“ФVXŠБЩз№'Фшy‘”г\ciˆЙЎ/ѓЃ@”яи_І˜a1%uLхЁІ˜хFх=IŠ_юЫШ"Ь8Іёs †a ,7Ќ/sœК31,ЫђЂЈ$№о…cyeЉѓT{РK†.вэЧЫИэЄ6ІЄd|œ{иdkYЖ›LП,йеkp5лѕЌgЕJќЃ1дHg<Р?$ž!КXa Т›Уƒ~ UIѕsKdZ>#Jеr„a ТS’ї+ˆт2nкСчП‡Ѕ1†U1­вˆАVџtbuЈRТc ’oЊЃfImXžeќуыƒ#№’X"7МЛэБиUачyеђЃ o>’lЈ uдqЯеёГй§4G0VцP[8?;zр У/&HЏ‰ЊO\Ћ б—хб‚ЅљхСh^1t‰g{——]šМъёМbК!Йџ…Єx jбВbЙnмŒciР,уў›_Н’L3ШЋЊ*ВРT‡WЗ}ŠFЇfYбЊЦEK „/npіщѓUуеЋЯЫDn СвЗ2 2илЖ ОэvЌjЎ{О?ЪOѓ}cˆь i–g‰oЈ§‹Л ЫТ';“Џ0j“ЃIцЉЮѕбЇлр[8^ВЁтA0ЎiўЫФ[Ќ‚мPdfЖ*bПВЎi?—zњŸЃСГŽ‘ЮPКЗ]š#ч‰,ЏbЬь)ьАгМКИКыt;З{јМфЄ%9,@~^„сs_п‰ 8{Zcу`жMUљУRв Р:W%ёh P…Ј…SA&žЬДŽOюFœ(Hќ|‹zgфтгŒрq,ВR==шЫDЁЄ dŠцU§ЇБNџя#cг `=aи2xъЬxApђSхЊlЇЫˆЊiЉ †/ŽW,/ФЋDИ‘CЖ:žЦЖдўt pЦŒъЪF#§AОёm 9ЊsvаыQž#щ‚‘DўхЫC˜юиhG Р=№<RI4]––PBF*wБ}JWфЅ…WЏGдЋђЯЃ9d$М[e`їЌ],pЂ!ьMђ H’ШV%•eFiе’DйЊ–6УcGьП?Ijкт№”EљЗƒ9Dі EDеЋŸОmz,&uьF#Ђ†гЂЉ`в!Хkхв9аЏSKМннЙddxўD›_с-:bДШТœ‡Гo5ИHl ЃП јДк­ыЫF› џLКИzг8>Мх№јЅG†?4Xpехv8KR –H,ŠLa№wќцьЌ1рoBЖbЊЂFFWW7'ЏXXЩІЭ(Р…}еšТzнa†B„ЖяўхЫ..›CVжHQћ0Ž\?Ÿ,Іy`Ћє52k§Й6“SsЈXEЊзiЕœ–тйЫ<биnЃёwFŸоіёжŠ[ArЙ/<“№Жц‰gjŠˆмП=AAДNыюЖII^ЦШpvx~ѓ/_tоЂ№ТЛ ќУ,ї-ЗИцOићzЎй Ча(ДьфгzR‚бЇћ'—џђ%раx$m&ГХ|’:иФ[њœOўёРм@3œdx)6аЛпОМќЛ™юsxбвпx>Щ< H7Чў'K8Шеtл%%}K…tљw’e#ЈИРї '.tt§SУм0†МЂ/ д#&ю џўE ЙTB$ѕUўџƒЩЩx,ХДІ!щ„јЏšLАЏЯ0Јuэ?е‘џн X/§q”.<§o‚ј;а_мŒљЇ0•џЇLЦA§Yшѓзј5~_узј5~_узј5~_узј5~_узј5~_узј5~_узј5ўџ=^Бэ—о­џGW2t3ˆ“, ”nW0lыпЕљ0Кэиъџ5'уЏ^ё~„<HэБ#бє|япЈЧАN˜"Гm(џЩ=ЫAб”фЈЊ0+b—ыБz˜–@ЩЛ йЯёу )‘зBы?з^ДцИ†дїїгYZєUOГ“ТWFŒІ+8л§-ЈSRчQ”iђгЏ+ќ Щ&L]ёЏœцžt{>вн8uХ.g[фuЛyїЊэR*Ыщ8‰ўFщяzФХd>)ыљУ|V'зh1jF:7JB“0^7Ў/z>бOL“rzПШ}?gt7J“ч1Ф>ДЉWЏFnT/›цчѓyјІ(›Ш#UU„[пsё’оэХ†u•„щ/цЋУжPP­Ј(џхф?08н6†-йO& lzЯgy`IЂ~л,‰\льbл&ФОхeЦућiъыЬл†ьt\Хо‹я-џt?p”юШ2$MAEдаQD+“Ч%^vШтав-H€GM;жLЪ"HЇѓмSPЃ—jq=Щ}ћЯЪ5еђђ<Д…>oE5Й„oohnœ#ХpYdЃШЕ,њеЋcЦu,Yёв" ŠљУ4ueеБ”ASŠ*’Ят˜~Ц€руyщ<'{JEЭЇuь‡y5&Ђ#yLXѕЩ.yнВ0Nђ(ЈуPWп„bЦуibkтŸGFиŒjVeh*ZPL‰J^žeТ,FNBjCtИЅuТ˜f~0ОŸ—Ў љО-vi/›ObР"JЋžb8a9_Š^A:Y,ˆ(ъ;Ё†NŠФЛЌ€–vFїd‡шцDxƒhžJД i‡щHњСW,]zKхwОЌ™nRA+ЂnˆкEDкi\#їtфh|ѓќЊCё<но‡8нaЭl†Ш]Сч eХѕйХќ~œ†žѕG]%њЛбаЋ:ёt1НGaF""6Љkј‹{аЙAЗ?єюN?О‡oш 44:ŠГj2ŸЧЖ Юn(f‰ИZК–ІjxХoюьМъєzmоG оє'E†ЊQ>ф™Х’$ЬЕљGй@]^r‹щ8OЂ(/5‰'Ј€(‡eh– aЮЖ•у§ШбэžI„‘мЅœM_ ~E‰Ш3ѕ?6›Xі#TQіЫљЪ7ЈPнА*DРBt]7ЯrЭЫKй6фaGєЂб8а’>p*<нCА)ђи5_ЮQѓЦHЗƒЊN/™Р<%О nВXвЗLЩх ѓw@$D,WЛh9ОkђgQ^V-'“йђ(’ж<Ь-9БUъМUдИЁ ЏœVy^/чebš.Kƒk‚щ$MS"шYмvФ :p}Oч8нђŠШТЃдп7z&dЭƒИщы/џauAŸЕВ“У‚›т]л2rН”MЧ(ё•„HЏOшxв8I|‡oH`Дя’ъDY9#ВZѓОИњD0mэЉ’jЯЇ›ў‡ƒU5MтE+‡ЗЦwUБKиŽ–жр`3‰`pxQтЛlSCўђа1tЈСJ”џCвu$зЁ–R.Dnp"UjџŸmјбСЃкcлI n9ЧїЎг(ЉчaцЧˆРЅ‘Ћ тА еЕЉІцљQz–Ё^@йzFš4Є~{|z@0р.AТŒŸžYниY$šегљѓі §38„Л œm.P uœ"˜пЮDєЋBз sˆD}щшЅ9шъ,+вњЩVї 'ЉШЅг*Њ=Шйcд;†g>›ЃЌЈˆь™эJФ› Сі‰Р‘њ™Ь№ћцHkƒTQ„№UHPЄОm§\Ч-дЩŠый|6ЉPтѕ 'уЅlчl†7ь#”Ovc€M3lщє\tЁŸЉ&уzЉ]9AF&H/ш „ щЙ* Œ,YЃ~ЊбŠešV3x?дзЪСpTЮC|žЬ'р“vX@Ю‹MYРѓ"tlішZvУ”(ƒН(s…К ыч Ф%GВ:еEье”Ђ™Џq#Aб,дџ#Оˆє~гЩтqEWKА€ П. Рє\яЎ5ъŸь1†DгШпЕТ$фРE€'єјхы=:їЂ€ъъЕњЂцЄUI JЬŸёŠnЧЉЋА#ZR‘еЎ ХвёЭР№2 Т0-бbВ‡PžЦ3ƒ›г“OŸіo†#FБ +жHJ‰Jу“ЅМјьўщЫяf™)б§.­˜^6™ЄЎ‰2_ђ Уu –­$uU~DѓШТъх3BзˆyŽBdŽх`.J‰зdЎt•oюююŸь 4хRЁŒ]@m5%FЃw/Рш/ѓљуу<ЏЇн‰Š ј†ЦУлi/х+(^‘9ЊРP /ЊF€\_‹/e”Džaј)б .ˆxpЙš4ипПьоœ ЎŸaюџ†ёцјq8Ш—'Јˆ Х€ЌЛA†jЭХї9YгeљEg}VЄ:оˆЊвг$c^6Ђ)Ь4BЫЙЋ…Ё+Ыv„jrD‚Ѕз<]_ѕКЧ’•ЦЧqЁ ЈЧ„Сt:ЉЧ`ѕзG”к™хЈ#[ТчЈbGЅ:Ќ„,Щ/ёjF”јQыf YщЄJlMAеcТ  Ћ%нГ#Wє QPuг4rtОwљљшњjџ„3}Ј\t‘fdЏœ@YіMKЫ'еѓЇ5њ ќJ6ЇpсЈЊќ‚­2J‚•<ъмЖХNgѓ:RŽЇxН€=^<-œЫK=ђdРhтy!jЗC˜*swђё§ііЛmХvm•юДЭ-а™ЩfхЗ@pI@ќ„ПРŠК*„’Х„{ЕјFGR Cb:ЭvŸQЬоn БA‘эЖa™N˜/ўЦг ‘k1ЇпЎn\јБЅŠQ/ЯˆЂЃ07;oЖO;E .>ю^вšх&ѕKnчеИLрsЩОХћЊчKJэ‡TєЈ%ЋЋВjЧГєчмŽяЂЭВџЉ:ъ_Иa1[вvpzŸ­ЎoœКPЪяFІэAБ›fYштшьэіuЛлыї{ЗŸ>4ˆ+Јg(TŠbвP№ДцщwєуВьB<Оƒ’ Ъx…]CyЮ_“SI&ЮЁ™–уњq9]В!ўиGsgecmпШl™ООфlлЯЃ™ЏђНЯowŽŽŽOOЯЎіоя^0ЊЂ[бdJф›с+,…UOќ|1y‚ХAЈљ—ŠcXЁIQAŒвq%>чˆ‘"МO`6jVX’С“ XOНyНОЖEWОТuNЏ%ї ZД%ЎѕqusћЄ9DAћЛЃЯ7Ђ>фSмл€ВиVxЩёэож^(oŠMпъr,рц‹Yi‰<ЧёЯкojSЈ#"eЖVЛPЗ­Ш‹‡Їњvme}mх*GтціYKвёxБNuОоZнk3,ЧЂЪ_ѓшN1PѕLКК(иPЯж>˜dї§ѕгмLdRЦ ЧАМР=gGВ= (фІ$z"ЊiyI…Ч‡05-уУ•Е•}wЊзoєI4ТоpxЖБv2мо6[не<8t/4F ЉсP0Т`јamK„™^Ь ‹ѕуђ'4zZCф@=ёЧѓb‡хxІ?@NMЈ= N6ƒ 7/ЇжЗWззжW?ˆejТѓ4ю:бŒ|™ы­Ќžщсp8ЂFtgя€8[зѕ РЗok\ Z‘yЖЖОAЭѓe„Fc@…\3ђ0ŒќјJф!дЩ3 ћ­%Ш дду!—O є-˜ЗkkkЋя†YщЫМФoЮяDЭВdЖЕЗКqвjœю|ўМПГБгSЌUВ‹Шю$н‹™ї++ хїdы•HH}€?NЊ,„rїGС^—№ѓъŠР нрEеЭˆбр €њЖwоО]пlјujђ"ЧгЭoшšDньЌЌМyЛЖЖёюУж›•••w№abЈkbЯ‘™СpФ)Vю]ЎЌ§/іОƒ;ŠdY“_БчьШ"М2ШЛnЕяђо{_ее^swџћFd3sолч1sпйC^.nЄ&*+Ь™ёmЏ7ъЧ‡•“ЦщЁd7&љшг8pяъмSLТ{ЈЩЊ"i†ƒT ФКМ ],GOЧ'‡_ОМДЋ*Fвюєс!yъђеѓѕЕk[ЏїOоm­Џя\r tлКмk9Q1“Š}ѓ|s{ѓЖ†ќvFШ Щ|>Ћ‘эРuМа7ОwЋ{`zn`˜Œ—!бт ЙтйPйљ|zzКПН}je@Д‡ aРkšHm=‡§][п~Дїjs}ухЅ Ї Г!3V’$'­ƒѓЭ—і_неї3]dЛQЏuСЋf˜љпЫњгˆ@ЦšЇЁcтNЬ›тт)–Uwџ№ѓйўцЦ'>+ы2t-№!ЭЫBяtћљкњ‹/6о~|ГГБОёК!ЙydСKрСыkn^—Ьыw'—‡t“нШIѕЊ’ЯRSАWгАЌ(ѕяœ“мЧф$GЧrB<ЋЩќ(†ћЛŸ>яnn| R@є№F!aЇqф№нўцsy}mээћЭэ­зЏh#N Ђ0Дj„FћМБН{rњ‰Ў—ї‹щ’lѕ8GўяIKІu‡a\Œ2ћ{Я@h@I’j%гК,OW5$ЭЫЉ§OGw67wљ/№H€0MSНчkП=__поПО§ЉЩˆf˜zЪАУˆЂфБ;W;/їOŽпS5ŽЂF?‡3†AƒЩвряРСш @ƒп!0uwвT@JHх2!tTр˜Vмx95­„УНЃЗЏv{A Р­ЊЊ<2љС зjm§ітљ‹ѕЗŸ_­ъIЊЖдktyйŒM7oЖп~zЧO№RŽsG–ІЉš y§xі)ЬМђu§›Џ(ТЭQƒ$YR 7§Z|G*SІфЮu:іnїііЏs&ђ\УЪ}•щ7ЏЇ; гkk[Чл//9јCњwmVБ’™ч„=X‡‡oоjS\рK$ЄiіёB ЯcСrЦбЊЖя›h­їсУI‹ц8AвмrХ%‚w,3@“ ЁTКЇЛ››Hgѕr{ccѓеўёйсю€д.&ZЛdž,"ХЃиhј3rЅzW‡Š„lЂЋ)Ј’„JЂ,+КЁ}kЕЁЈ:БЩёHˆœ9ёЖx<Т#Ц qwrЉ•*ŠЇ h(‰И$съ§ўсы-Є:{ББёbm}kgчѕлїћMќЦЈ†мб4’(j#" ШœƒQЈBHEєN~ ‘&ўvL§fЁu7хдіё@tŠg‡eљHщ‚>5dќјъѕХйћmpbЖоийкXлњдTBљˆrЩ<ЏyЁ#Чxx0™, ;tрЏ Ё#‘~fгдїрiаЮpyЕ ЦИЖОўъhџныWЛg-FTщЃФєлJ‰sCд’љъкf1MTžхW@О\а2vаc8€уЗ -jfИ:ч›фЦ}тF%#ХZ<,R•Љ"[wГВ*Bз "п3Db<žяŸН†ьrБэїЛ{gЭЁ :`FЯЗTъцДя–“„ќ1FМXœј"еэ!уЧБ,8†ТЯ’"sп.5(s2™иђmSзр_Г ЄZgy= >EыW“Ј’eIњЖяŸl6п|ЛОЙѓсшhџежЫЗ}U† у!§(С’ЖrŠGA,ЄˆуH1‘Я'‡У~x}бtэ;ЪgMгЏ!ю›x~ юIEЮqY„dб,аU“ЋЕљ Џ~ъVЕ!@X‡рЂдНOЏvїЎ›Ÿ_oОКdokl:Œё реЈ,&KHdЩюlš› ЧљЇ’‚ЎМ‹Іщ&|т7Ћ5 ТqnCŠЦЖЯЎД0ešтDЏF™QEЦГЩhBmG)–і])aq.OŸmяпюМxћnwoѓuKТЖV8ˆтy[ѓ‡/Ш’8& 5Dтю .ШЯђ№-6†ы›OЪњšLwюЮOOдpияP +(V9#N=оИ*БааhшM˜QСuёЬйічўћѕЭOgлo{Шši Ь>жіЃ1~Ва`јЦ#95О!ѕЁ %гь0K,ћ›Oз†Тv{ ИžCыХЪ?Ќp[]№аf‚Ry ъс>W$9І?oнэ~и=ь6Ж? D<Е@fищЯЅ‰ЄH7‚—Јsr@3‰M™ЅН^xŠі†’b…bП}Їuнu4iH‰шXEАШКР-šрЙ8о:Lр5ЯIщЩ(СЊЖђPЧЖ ЄІO_}КўИГuаНкљ4DшoNВЂ(€nuwŠFИЪпрS#ЏzЛnЏ‹?(YГЃКrнo>fєнчСQбЛ.о‰зЄ6oK@ы Vˆa™–Dр=^щ{Ш№ŽбŒo}и98{§тcуѓыcй6 ЫіМ Х*Шњ+Ѓл 4šдo‘ћчЩ(Т|(ˆЎƒ!#kN6ЮlWjЃа8q^Ђ(ˆ1–—`ЦEhу№ѓAм)с+ЯHAy†2€, |о C4зј|tёaэУЩЇO7 VEv:‡}“уudЮA6[A™ ђ$z†"q4ф> #ЌЈyYZ–і­њAУо№CNеL,\бЛ.Hq–єŒ*аЄр€ч$Z9Вє…фK КЛ­™внцџиОhї€ЖHь 2ƒУЫ+p’ЄxFj!бiŽк…ŸЊФXzиыQЌЄ{Y€апœЙHЊ‚гн +ЏˆюШ§Ш‹vˆY.V3‘ cЛ-’8Š|Яsm АА!KšчuЖ{5№YPM ‡ te%ж1реч”Ta!@€еуr,#[“AЗ‡рЊ РпЉчXпœŽSеХЫ Мv˜’ћŠ%‘мtКXаj&#МЫФї:*В4EЉWМЪ ишжф.§а gЮs`Л-@йЂzЙБёВk#e%Шћ>–4ЫPъЊТг5t?uюЈјZВџФH*l„РѓpМ\Њ3зљЎ›ZЗ‘ЛЏГыљH1Aсйж№ђЄ)q5ЉРЎ&ЋK МєФ{"ЯГULї[/^wd’UЫEнˆ‰Ш9)г[н5УЗFђv9нZ*ЃтLЧeТ“ћ1$ uxп%Дh9ЯРьАzoއ†2М9>НхД š– :М“ШaЏёš„w z)JдокGFBJw зƒ8KсsРh ЂТуЊ†Эі%Оwнt;*kВА&d сЊ@vBМ ёОч В…–IšD НЩи'uтšђАyльQœтUуФЫHVbS\Šwr!шЕчшф…Гэ rѕaРFGaЯže]ЪѓЖ:ЮІумG|sл“M7.АjНЌЦиН†goЃ2 <пqОыˆIыё0Ш Р)ю№AЙч(ƒЦнSt‚lшDрЈЊKПоЧ‹Р†ШфлїcЁЗЁЬј|№гx\њ~рзЇоЛЈЄ nšUЋа>NР_†a|зЙ)Ё— QTЬ уa8&нlб 26цђР @БЫо:Р$ p|КbTЙy@AќW5Ы#тqŸyРгСWзxЇœ!!Ѓe;з]йpSxˆœyŽ”д“дlыŸОGцg-iuЂЮrЂцз F™kIНљфвA^ЦAрgxћ‡в€Џх@ё|з†ЃHwЇЌJцжƒJ‡6BЁя(Бm5­F њ~•ЧО&ё\џ3ЃšрћЫШБ,Мo˜•iGВѕчъ№,М›уuk:ЪА`›]aщ|ŠM)Rg д!шtРNCЂ#З/x“УA;$XЭ0‹у,хЎчКiљ€чюл Jw‚Ђ Ј„›ŽчгHe‘э§ъ>КxўЏY)fЬX\Ьѕ eœ8‰ђ№qЧих Q­€ћŒсм1LM–ZW 4&ш<0ˆ'№eрiR ц‘О1L#„І/?|јx-˜N\ц‘ЅШК_Œ1qвAЃѕяЎMО№‚Ќс /DGR‚ЄР–ФYТ.Ё„yMЄ€ ЋjАœЕmіi^А Ht&IP—9си˜c‚аGCDџЎ‹QбR™H Я№; „dh@ŒЁл=еŠFehp4’&i .џЛ„fп5С*oзьŸ}иПУcHy4"Г в“‚Є19^Ф#пq,MОо C€ *€ЧK <щrШ+Вb-DЂ,tРниX˜Тvo9гЩъ"дE–d3јя%Хиn˜becО#^ь]^Зњ§noШђx‚4NаЩхsЄx‹Œe3)љЋ4іlMЙоэЪˆРАkiFКFЊНtŠеC№•elGБ-Б<Ч0w‡-Ш:*,)TI *ЂіЅ`B!Ђd№–м>Пю3Уы“sј•ѕ@—~”5AђžK“ С>цР]лгхЫ7 IЕQССI#ИCмž1NЋ2&BGqС'iч5H‹]ФЅZсxœ…ЌВ"<тGUѓиyІsКћfcчZабяAj`iЊ,вняЅFв ”Ќ„G Bѓућk$ТБ@4H сgьrЪˆль Р^>и„…=zsFЃbB"ў‡ыЈQ—“Ђ}ЧЗщ„E(ƒgnі^mn}ИРн$Ћ&лў^н Ћx…Ђ(<ЊбtrЬЭёљ@’T3,"?MPŠ’В‹ЬHЂ7Ъ,tє18НМэI2:Hx2Єю уVy€х’ §QN‚”)ђТ№rџфшеЛ[NеБ-Щu~ŒЅуИ„ЩЕчCцз9П“Dђф$н"1”„`tIПIаёajžУ^;†жМИЛiСwЖэE8ќeŒ­t vЅЅ№\!VёХhŽ‹Umп?Пkья]єEW 8мйjяцLˆaь›*su-И’ и№‚}^2Ц‡Т{ˆfиЏЁ5И_:9МНkQRц@€Œѓ8ў,3RсzQю‰ 8EфxЎyбшєюЮŽ.)4;ЫcзњОqЕ†рfН {^ЄЖ*tкŒЄJ’юѕЌМ€pжP08№j+тyˆ6ЙЫ\~:8;ПTБЕ2‡'!5y˜Гtˆ` 1Э/ LU­њ-Ž™ѓGmAг=јpЫўіЌO”!ЃJ-…юаF@хЮћVVBь!›эcљ[‚§ЕxSrчЁмh‹\ѓіzяЦУY5eY‚cAm/—#e:ЂпЯ@шЁž, uнYfЎ>tАЁo[?АгнВя}G‘. z/xё#EВДЉ‡юІЃQЈ‰Н/Щf@N/ЪмЋOœгaŸgšЃлNЪ DН‘ЫьєSАШТйпhQ{ˆUP‡|лLEїѓФ <л‹c[8ъІЩЩ-I"3@žo@ˆ?:f…V;Џ зкpбšiйЦї8,Sј n5Ф7ЬHЋKюЙкxЛvЂ…р*ŒЏoЗТU &ŒГи4@hьШžC,ђЂfлКШГ­Їш€кБއPxД^ж4ПЊ"C—ююDŠЂ„ЗПІ…yjк7H ёnG>§qk§M[wl­ЕГqаQSœЏ )‰AglРЊ.~ЃяЦeh в‰xЌнЙу%-LH!T™Їћ?кЬР"skV%ŽЎ2з7€”rЭ ’deьсІAД‡Ч№М|6›S§юх‹ѕHk™УЕ3ВеxN‰:рkV ,!/#_f‡>ЧтbЏ1"$$DЎЁJЬ–и+–aљihЁЬX•0 Žм‹p‚“T‚ Е#“љl1іЄіћ/Ж.eБёђљ‹я;ZZ#*4˜јxB‰~АпAU„žЬ2w'З}јXЉwЫI:ф‰žiZH:їЃ-\š…щ’ЉЪєЭСбuѓЎu{{зR4 0#(Ч)nъјЎegи…6›W&Ч\o=_ёŽ^МxёќM[єИ’ир$‡GiфЋ?8ўpzзэwЯNhQ Њ\‰„ЇцЪКŸжуекђaŸ‹аВL]Eь0ќ€;нй§mэ3-№Ш‚-‚ ‰!Ю<Уы Њq(<;h|8щТЫpBC’ ѕ<ЌЧ}jŸmЛгnоu4M {wЗwэ›ЋfЛгƒќQА’jR…шyCLX<Ы+ФwвкyБіл.СeЗ+pЄ: № Єщ4Ебыe“:ѓы”ZЗ]VTO!Ни„еOœH† й(aБРЦ^ѓјшЊн™N Р“Ёд^JzAL№ъ|н№§єЁxКі|ћ’ч ШУp!ёšLSx5~5ЁD€I‡`'К –аЃр­Р?ѓd V^Q ,sб Р^Ајюе- Ђц%еxRф7eтš†Ўыёqg[kkk/oЬжЋчk{},4„t^? xу /UG 6у*рйс“атойщMЛ;ь?}ŠƒЄ†sЈŠ0lѕФЈАї`Љ2Єрi^рFkиj*нюЌ­Ни8ф!ЛнxОu8Ф’$ьчдРЦтйrœ—KШа|лPРІщn—ц8і'NcRtяЊвз% )лП Ж@B`ya˜`§ЦЌ.Ви5УќLwm}mуcпъуцкі)‹(žF1L—и2ЮЊ$E ш@Ђ›7 5KУ-OеŽ'хŒ}иkCЖzйYE'XŸ–dаH…•eр: ЏюlОXy0№ђМ№Ÿ6з^78R!(`­‹ŸOЩфЗIуБ„‚E„TЛ/bЁЊ­кђР=­н}саГ<”Й-qУЛгO{ŸЮ‡ Д‚GёЊˆbОEхаTЁ}єvуХцЛs6 %М1їyыХћДIHфHБMu>˜…ЋAEІ?Iё оQcU‘љ#w-џjЇUгЖ4›>м˜схСЧЃ(5юj§QY>ЯmЌэюПСТƒŽ–дЄЄ}V7Џ^М>э ’@зœt„§_Гёj јЎнтœрЕ?&єxnэ™њ“F‡і!•е„юPі SДРЁ1wWззwC†м Hš—сdгх§84ш›ЃЗлk[{ 'вMIечЌ‡{ы[oњŒˆqб/&8 m:.S6AUјЛГ[ыXL :Q^–XЎl>mо3рЁwG+nN&BЈ|ПеjЗкЄЌ 0ЋжиёБœFэлXЉљъ„ GЋТЕ)ЉКžцвйЫѕ—яі/’с‚ГУYгК№ #дхч3АlьЦCч ­аyOф}‡мЖwецЗ‡l нщі!Аа5шїћЌфTd*[-юЎƒгимmх”Œ+šЏdщG~џуЦњцілЯ\˜O–ИгЃдH# n/нЭ0TПлы І—уЕ~йOœ,KQЭ›ЁhD5 ­УЎїiєx§ С‘оšМГЕОБО}аїЦЈ8Бhі8ЭцЅ~§f}s}ѓ\Gиэʏ#]˜сoљDм}Ош*N<­?HтЇ §Ќ5 EЭMЧгQфв йaŒщВ$ђ,':5™ЧЭ­эЯL8Џ&к`л,6ƒjЖХ,хЖзз$ЇX.pг$T%†!XCQ$ЎutмфqHЄ+Эž,t`Пc=Ц(Едoі8Д)Œ}ЂЄFь4•оZп9UА%є'/ОЖО­Кrс]LНЮС‡е)qЮlufšг21iшо6†Вѓк‘(ZЗŸ<ИFPt7ЪБ€p”Ъ—њ­ >—АИ›А7 Эюнš5Лљ=iw{x M6Є“˜<ЦШјдKв43Ÿ&*uАh’ЁAwТbК,ЉпчПЙQф?Z,Р3@Тїfу4p-•nЕ†ˆ"1КЋБ*№VE-нпcЇŽ ћђј№ИXѕrЎŠфР-тmuƒjюячГх|Tрˆ$К‰#> ь”žh§ЩЃ’!% ОЏšЄ‹іFє(yўnЙœхA\ƒД(ф…ўЧ—ћпЩ@žљЊ/œLl[.ЧвM‹_HЦ aЅ-^єbЕя •НŽ'Ry†эEЖ’%ѓ@ьа1dQФYнЋArјЯO+№e_;|юџїџyјп+ејCj'ємУ—сsф_Ug>_Э }|X"зРw7|ў;BCˆuCœYK^ёCARЎ&_сžсPІћЧGф$ЧЂЬх?Р Ы$Т T­ЏПЫ{ќ"2ўџ€ Ÿ ?ьћy\АƒКŒѓЩуРzl'Ш€ѓј№пКGk[ецто‘^^јЛћЧ/_О€ ЃO6DFž]Q ofXи7[)Шз=~РВ„x€GEёYPo–8ЦzВ~(š‡МSœЧїАjя†§0бfм6ђjWB?>.SMфИюЇЇЏњŒVXŽ8Уw‚2y€Ч{€/Ф‡Џž­Њ„QA№сЇUh=}Ї%ЭIЪщj`h%x ѕЋG ‚ПD‘AfмЯ gяwпlОџюrРиxл_pк‚єс?р’j1Џ|DJ.R`Џъl’Л?c&šЂ[=п“7љЛК›ŒR],ˆ&?рџўхїпПрˆГYсШ,лп{НћщДMI!N№-А‚!ю0§Ќ1ЁŠФ9ЈУсQjКHњ€;LvœЈю:6ЏŒc…eOЏ/hRлШ8р7oOПzjT)мkа”Yzр&SЭл+§4f&G6Nsщжљ Ѓч_с%З{џИrЯh_ЫХ8Њѕ0ХaX–…_‡#Иг•Ф`ЯгёlI<ћrX–ућЄЙ?0ау?YŒ X$О:9<яЫў3&<ЙРЁ?ї8EnЕхЫћYЄJЊ—&–Рв—Ÿ.zCЄ3М$ŽРuŽл§^ЇеКƒ,хE-œраЧ$$M3‚ lјї<Ю @щ–ы‡ЎіѓGТїiЂ€сW€npоЄ‚Чхx&d•3РŒЇГDсЉ!Џ8ИБЋ&EбCа ›Œ-p•/kOЧx‚Œ.у•дXШъEIьшЦЯ ЯфШЯ‚‚Э{ЄХ;бЁrܐȘ”†Шіœlh<нъcЃГ ’jКХцхХ§<IТьRu‹9zјHs‹,Яcч{'cќзKХІ(h{гЪЁrQNїiЃF7Vz–—WЖ$ ZXeС3э!/hx‡эq-Р!оM–тEcxХ$г1:Ю'у$ ?ŸQB5э('Ш BhŠzёžœыЖh­8ЕŒ5IuSvБгР л” .–ѓ–€˜ШЌ§љ}ЉгwQ8^жУбb5Ћl>хОeќ\;ФХ&^hU“Хr’9*нщг,DО~ЛЧi9јнE(ВЂюъТooњ з}6фxе&Эq>ч+ьYьu;8Щ№sМ|ЎЦ8{Щ5вРлНx]УЙWуVЁ-ƒАрЦшю]kР)N~ŠD†• Г`‚G—зЯžѕ8NВќЄFиЙJTFwu6рaЏ%УIъКЪp\KhыС>Љ!iЦjЦ*їMyи )ЊпИj85CДYъЭI7h7Ю>М{§ьй hНцFXqC2 ЄcKh~nБxъŠ=9eFxR­k —ˆэnAœ&ОЉ0иV:ьооДњŒš‚|œK ћwWзЭжнЭщћgЯЎXPj?}&љхŠ:Т“{ŸNиvbxq–к C§њ?XŠnb+ЕчZ*BSУnЋеpZЖ|„иRй4O.:`ЂьртйГ;Ъё†cuDƒ(0б™ЃЗзЌ(kЖcˆ…Ы%}‡С]2; iЊзбШ—_0 ЯРЇмœ6h^бЉџьY[uH0KBjА #]–Ы‘-6пэЕ8v#GзqФќЯЅўoХI DAaиэ†ЂYмь4ЎyjItw(ŽЅЪœ™+Јж’…q9Cэ@НžFwКѓЉЭЫЊŸ„^ў„г™oXNЛнюс="8Qpі.DХy˜ВюИЖ.!ˆ*pES4wDЮ9Pь‘Ѓtояѕ%Х=MXђї‘Sv(œiG {­ьŒ–˜ЇB|Ÿ)оЊ<)PcEQ`qЮ №pœЧ§<6…ГзŒЌКŽЪў@eїЏ.Юаa‡лgM^g$_Фt}RDž)sDш!FЊнhBќ)№№ЗŠ“rОљърј§о3ыў^тО>@7Я5йŒ'E ” CYrйЕя5š!ИrищQ`т­Ы<З%ъц^„ЂI?™рПZ Т’ktЩˆЇ$йчЎ†“lИ•пmѕ{wЭV—д єб”тфГIb+^*їў~Šи!ЧRD#я:”`Є3 •Џr4УёмŸСтъІ ёGЦЙ)ђЉn^‘§7p„§ МљЕбІ$Ї‚НœeЖ8шXžџSшГл;p4b0]Ю3Kf „ ѕЕkўЏWЋгчЕ™!2Pз! сO;oЖк]ZpЧЫYnk ^аВLѕ‡Z+~ъ˜Ъ+X—žŽS™$ёO™nкнnЌb>Ц‹jЌOUџХџЇ-@ЯВLЦЃЯG U‘ўT6EгCаљ|’y†ІRэCSџ8šЛ +І\Р™ЁkуьЂ?Хъа $-ZiX?яјшgЌ>-†Іс8Kjџ%ПdŸaБюЮїŒџ^2?У‰3иTд^§kй: 'iІmЊтпЬ[ћЋЧ№<ћomŒЦoвЯ%˜љыWbЈѓЏѕk§ZПжЏѕk§ZПжЏѕk§ZПжЏѕk§ZПжЏѕk§ZПжЏѕk§ZПжЏѕk§ГhQ“ўљїєпО(Y1м(MqnЛ`šжПe9ЇpТЇлOжrƒ0Т9zЁиc­ №эџчB™ГУ$O#“ЂўОrЖџl xбВбИžдiЄw‡Њ—Wž: є?ШК 8AœUЃмзгГџщ%5ЯzКcл~Ž<БуЬ7лWœ•…Ыїг mд}|aХiYзЙЇ[Iјџd%щсxХМ,'и-[Х6{кPœt›l_vL‡mn7Я†XОRUYрЅu=mbР“—фQ1™ЯАќy+ДіqWѕЫQЄ УЗА$њюЖyћŒУ‰ОдO3їЏ+:ў–E“ЮGьŸ#iEшЩ‹Ош•уTчeлбqДШѕmут™ЅЃQžcwЋwW-аZ”џ)6‰BIЇђ|:.Bз^о %Џ—GžЎЃа›ГЖ›HА3š-f™/і†8ѓFA‚ЪП[ьМz3Фщ@Шa7EЎЩ5юњœ‘ ЏD™ŽІ€"€ЬM5)rœ€QOГм—^3eN0ƒ4 ~Vп7­Žb™L“Б§ЄЈЊЬА -Жеu',ыЊ*ѓ'ЌBxМ:ПЂ,іуёKПЇ™ЇŠ ЈŽ@)~^FпХЧёФХh8’ъ№† ЮЃ^,Чр0кCзUBЧž)aфч“ЎЧ–dц“z4™OђРT­ t…ч&ЃТwџЖъMбtРпкеЅ$‹Y,FqAjdJЩгРГ ‹ѕћk= \UАРA=&™kš~’xBW№Г1вrќM2Ы8 ћЛ–ŒМєlщ8-ЙFЂ”‡С{žcсї=кѕ\KЗ‚ЄЌЊщВNtйI3šЖтj ёЦњ{DBFЭ)xЙдQ%еЩ&‹Х|RІY>FBМ" мЏ#5№чŽаqТ4х|Q‡ЂшgYlгЌŸMцu9цпсBК’щD5!/BЧЯЧШЎF8yЇ5NЗѕLUрEн45Ў§ьй-У‰šвœj:ЋZфф‹m!*gѓq™~7iє­ЛЁdибhŽˆG˜OПr9‘™йЁЩ6ЮOЯnюZЭ‹}pyУс@tУ8EFЅЩЂvd0‡ихV6]ЮЧ#ЄЋўАШэMœGТТюЎцwrЕ1сыЩƒОООКМЙО8ў№ ОКгnаHь†ВЃИкй3йдиЛы[Ъ№у ;V‘TjNЯА-^И{S§K-Бq џњhлр=–8€b„M{ѓ92у•р г’(€mCпvЄ‹Оч8zџІёЧР sэlFšхШЏхbZ8šШќбЗ-Jт}йMѓ иq@иhJІq!ГcЙКj!І$Id[Т­Иž-їooкМB№кo2‡ЬТŽ~[цЫ`о,ХЙ˜R‘ищЊР™w`O5ёвГщh‚Z&ЖО#)X‘ІQк6лдqNМ#Е.л’—VШѓ7^<,аrW=•АбЁ%”Б4ўЏ(— Ыѕ=Ч/ s7й*tд8ѕ <_•ІŽьК„ц.ƒ$Д-Кƒ”lžЋі{ŠƒУCB—92юЎA–удзеO|K7~zЇћ3)ШZdœЎf‡сф"ќN`œ…Žf… –%!•№mЋзж=4I]601УфЅЦЩ5K2&mБ|МŸРйX~Q'Оіћ“Ї(гM !AЦ4АњЩГЮ/|;_br…C„p:Э™)‘‡уЎ n$p-У 3Т}‘—Ѓz>_|y˜‘AYї„ЂoYq™Сnџф€ЎX^ш;N8лŸ§Ё“ш0.Юъ4А$#Рј‘Џ.Ъ<эЏ;ІЖpтb„1О@90EYоzБšЗг ;Uy№фsџzЉd"‰ссЉЬ Ѓрœ ЏТрѕЊд+Ь 5ŒнєР'ЃJ_PЖEЎ#ЄQЌr=:Щмj2# !CЫЊ8№ЬŸлечDфъˆ Тm<†xВФёWАгЃ1htd ‡^Œ кЧ’‹lН}!Ии$Є`$Ž-qЇЫ Дl„]’щt‹Y]Bj?SшgЗœa{qJ=#tяи1{“І“2 ŒуЦШ&R‚уœКъѕЙьњqœ€Џ#єКхŠaLДy‘eNт9D™2ё ] НжOњЃ^:уВБ/Ш@3yО€Иты}…FЮЫШU‡]бs”Ћ+еѕS2T`2wW"g‰Рs+П‡ ˜ p˜rЗ5`…'DўsЕZччД†ѓ Ї-ОN\’3šФ‡4єtŠѓЬТ““8dmGОИе§(GЧ /YКы ќ&ЮVC[\M›G™ЋыTk(–Ё§$ЉUІ{’‰ЇцyNЮ”алнƒнOІїГтŸgАЂ~ЗФоg!ЃGцjƒF›bј'ЯhмЖ8б*ыH—q/ЋFŒcў–`†uргUь Dђ–ЬЪTХўчч‡Ÿn ЇLŠы'$%db8!ѕКŸƒг›—Ž"(V@ЊєtюњфЖCKOбhu[ЗQ ыIЩЯ2 ЏКЃљ§УpO,šУп‰ЖыZ:*иˆ• Ј+ќѕбEыіsSЗc@ЄIрXСh6СCBхœgхhzПФЃd~<Пњє™1з”эОˆFc9GFф4ФЉ]]fdДіqyЂK7lїžэwžц‚ НfГе T|ˆj“Ž—`VЫ{{џ@K|ЛG[ŽeЊ2шXЯр›Gя^эМкy#j2нщ0šзSШˆ!MЯђ4Ž<;ШСcтѓеqр|i„НDрЈ^—bљеž$+"нiЖКНСg ќeљ”ІЫioчРШ}‡юiЎуHz!№ЇЛŽ2<ЛНЕЙЙЕНпl6:”тйЇЇIт€z_хЄš/qдп‚xОEърыYdЉ!'#Р ЭЩВ, УnoH :CAЯІЋЄ5z:ˆзЭм5Ј–ши8eKŠU-л”Лћл/w^О|Н§zџг­hКq9Z]eRP"ƒ-леЃ|/lОК˜ч”рdŠ…la?"s[5U’xša9Ізхw„ЮSТ3єџj§ФH mxKл6RштVi *`†oзп||Лїvgяph *€‹Ц)а–уE1@•жЕю"ъ”@мљМŽmUVП*(fрЪ…фvDEрHˆВ’•Яу1њВОнм82RCщ7$D%ЖcьŽЃ НЯ;›Џ?п\œ~~їюА#ш–эŒ=KGЇ:Ўxz!fYцТmЦC*œ; BsЫ(vV„І"џШDШО ]HKј3ЊЩДhLСЇЫ№pcуН”šЪ№тД­"šяЙ Q™kюnОzЛ{|rxјagяМУ№œb'UX€Й<€ŠNчЄc 7УqAxь:ŸуxТ цy&"ўˆуыђАУN89ETфЁ‘qњxо9[hoзжЗКЙЇ ‹ГŽjкЎDaоvxўfskgчЭюЧННw‡—†a+)bЧ0 №]хІ-:^яj„Љтœ|к|:Ъ З‘ЏГNсC$ё‡œњ,Уђ,‹3IEQ$єŽй˜„иšщ˜~љbcуГ—›л;?юnuƒ(і Yш~~ЙёђУчЫfЗqёiї№ЂЏJP<Р%ОыћОkГХrєѓƒє~A>kuŽŸ<е№Ћ–Ф3ЬБіQ /|3Я!У +"ЫPˆє1€иІ‹eеиXлк|йЋR]ЈЫ“ЁІk&$сšФ5іЗ^]‘Ё LяърИ‰д]ВlfВЈр;Ќсxќю^‘]5Ю†$ѓиё(uR—6`.^њї1”pdМYŽe!Av+Ќ`›AС ггѕѕ­ѕВЬ]œѕ8šз][‘шЫнзЗ§VЃбъ5/>ю7eЭ4A1в ‰ŒђїлŠхкЭэї.™­LЮёД GžЂбЬ ед‘VъЛЅn‰ШEлЬpьА{зGj%нЋ№ќ`ЉДЛПNˆ#($•ъє№тЊ-# ZџьэкыГц]Зпян]ьНПUл ЛˆœtЎpŸ6оixіБ:d#‡ејGqO‘эХжЕяŽŠ”Šї— О(Рэ!иЃ –ˆddŸёqыхжіжњЉWчОЎHНгƒ“;N„ж:~ГЖГЗ№љьќdџнжж)ЏЙxњwЙЖЁpД ъqёrы•ИxМG#œЏИШ‰#^uRИКєНЖШЉ:2FZHn#ѓ%Ї8љd†~Oўєсpїењ{Ё‡’ъъѓ5вw27л/@u67^яэlЎ­m§_іОD;Š$йRПёNЃБI hпЅTю™БяћОGdDnPячЧЬ“žг=Џп<TзЬ984EW)% sГkюцї2xl^&PќЊЧрБœ '''GЇo_^иИc˜jн XЊ}ЖЗББё ~П9мyFПhA™ лНяBЈ:ёФ9п;:кп“–ШgОb6сй)DМљ*„L№LкЊЬ ѕh1% 8ФWШгё„ЂA4mрпJŸіі?Нѕќ@ЬJxЖм•иQЋ5]ŸМ[‡iоммx{№jћљжі'кBy]xЄ>'СК(šЂЗѓсттјHјђ№MЋfVЦ(рХYƒ€хУ,вѕЇyѕ@У§—щJИg’gЎСUЉhЉЉеC„p@?I9 IWЉЅ/”gчоЌУTomlО{ПЕѕbџjЄzЁ­@Q2рEХЩрЕH_8Й89ЕŸˆЮэу)”jzQйZY˜ёYf=qфN0 г ёЌ GЗРЎ’u!zЬ*ѓќѕЛOoЗЖ^пИ“ъp–щп^Ÿ~и}Жўl}c}ћныgлI1ЁxЗЎzЂЄƒIЭФ=п§xtru~n/??ЂxРr–ЃPАDфФ’МљІК3-<§ }Нокб="ЫАЅcБкћчXріJMм{pМЛѓщоœ@х‡[ЯYЈrул“гƒwы066^ьnoьнsŠЊЋТЈнАВж“Кє[;яЮ/ŽO?‡ЫЯxfєа*dzдAЇŒs< ™”U™Кўн{dCIbЯ>ЕYЈхQoЯLPІjI[И)kЇЉє“їЧ'mV1m/[й:2swvЖџzkccssћнлэ­§.У‹HИ=d-€ЗVзйhwчнбХёЇн›b‰[>АКk%Ф'Р8 ЧQјЈXяыЦwsdAŠPzяпwš€ІP"ЗЬІPМк„ќВБљbџреж›з ИшЊфARЌ@UQжf‰›Ыiˆ"^QЧЗЦRƒ5ИџNsП­™qCфiІdЃГ}Ъ7№nПž’ 9мЧj`zф(ГEЖsuyvrqsuuuyqќсЭ‹ƒћУ—ѕЖžя@(по=А’ЂЩЈч 6CХљ’Y“Sj„JxМ,ƒG4 б†fш'qЫЪ†ЅeсqŽu9ЧЫA§mЊqUЯћUUЅbыІKЋЈЬ!ŒН;њ№с5˜ш­wŸіі^я^vQ-YQU‰Ѕ3 AщqR0Х ‹œяЇ*?Kп`шёx„Ž!+\ЗџнaZеэЄ†J2F…xdЌk’…‰ыР›bгФДм8/Q9М @пЈПЪг7;А761—Пxѕю№ž•UвЋƒ;"НлЎ‘5CД ьcТ#ЩЧEЂ@iю ­†џq+qXс_pя§7C7НbZуж  R(X- чЖ‘`нй`kйlj дмЭВЊpoЦНxПєёѓч/о|иЛНљ|ї|,ЂИЊiйЈч _ејюЂbёх3ўЂ&фCЂ} ‘ŽќVёuцОћЈЫ4CHЖКJTM4d–˜Xw%FФI0j—9ЖЕЅQљ(6Ѓ) Фіюѕіо‡ƒЛ‹=H‰#˜}˜hмa№Ѓf№ДЈP€р˜ХЌNLШ 2J8Ѓь3”К QЫЕuуЛ5(цdЅЬQр7tьМЬ#[с!Я@,™”3ђVЁjIЂ(Цt‡Чš(№šз~Оўzh+‚ЎАbЕƒ0€"‡`ѕ~ЗХŽЊ&јГOŒЮ  Б*/‚tZF†Шn;Ђi‡Y9)#p§Є":д`v“GQшКOщфьYž‡‹ ~Хi5'gZ“*nдmї‡”hхuьDUS•ОС]ЩbФЮ єбЧc џfрxLtFк Iћ^ьEU™ZВФія{‚aFyUЦ”ГХ0^Чf№2їŒ^гёxЭ…•хКб„œ`зh3ля )€}Š_хО–ГЊ@_Ћг|€ЕKаžІŒox f@кё1…чdЊсЯВЈ'ЁущюmЏцE˜рMNкр‹ T“žv=”Сч„hхz^в~є*tац •œb%eьћЋ|e4.E!Жы* 'ЊЭƒЭPВи`3ќ—dхY‰БЎ|He@xd—}еtРCR–АтрЯЋ|™ѕO• сIЙгциD…Ќ‡RСDЗ[uЃЂ„Ed№Џ“›Ў0z€SУR„ь6ЋTO‹uRВЈžDЎBaFg?ёцЇш{tќњ‚б,lа†џЯqЊ“N—Mdxњ€yƒWNЦ…ЎLQИ‘"iN””Є‹ ,Шт Рф,п—X›,AЊ/š Mг|ЯЋyшќyUЧ.6Хх‘ ЕgчУ›Н“Бсј,*Яˆ†_Юgehуг?™ю~,# Ž=/gM+ŒЦŽd"TEтТ‹'E’снЩ㠘 OЩUeмaІЁžuсQ|гАЂ!АСrœT!Ь~•™+ёєнUыњЂХš^2Љ І^1ƒ bm{`ї;Њ;‹[˜x3lZІxoЅ7FoЭуHУЏЩЛЂ'u ЙžЪrМpao„FУ<ƒ@р]’S*Ж#GШ†yЈьxЬpЬЈзАcЌ№5‰”}žЯ”j{кY"(!b yѕ’ Ѕ{=&ъ‚Šт%qG`6$1@гyE:зr{ƒРЕ-Uvф€”Рт Тл/еР7<Р‹Иfу,ВEŽЧ}%Њ?TьАšРZdСAlTыjJџ‰Rm АXБ~фЊЬ№юшЄЧВ№#8V “ WDŒД* 3OШЕ>€ ЁK№‡Ё(У6‡šЊPаzИy4нрзMJМž‘DAR€у4дeŽЃюЧК“€уXУРd‘ъЬ5ŸvR4r˜3HPSlˆ1‡чЇЇW—wcšFй*9Ф}btЁРI0:GёрЧСSzwЌŒћАтœQЖг)Cм !NЇ“У7(КБЬБ RКкыŠЊ‘№‰бPПДJу<ѕ/ФіД„, NЬqУуз/žНМсVћ9T]†ЬўHУ­с-OŽРХaЊ"{гчRТ”‘+&р>I&cM†7ћp[OчЯКœl@ФsАyѕь!Є˜=в,ід&јˆk*р7яvїоИтTМЪS)ЌOCњБХаEs‚Њ.іlŽzxЃ:I™yЧ$lСR„Њ&†ђhJЌ^эEšЬэ]—Хю1pщB4F˜ДШУrоYLђФзвщалпыіNO[cYw|GОcZ?DCсёˆ 8-ЪЫP•ЈлОEЋюAі‹2D€ХžcOcœсі@$ a%шы›Л!/ˆlџШ­(^еpѓz люВиЭeтrŠћЌЂ$іmЊЈˆl+€б€ЎaоCэўђКеЇ ЧЗORвPOрѕЙ4v^ƒбЁŸЏs Э2усэ'”€dЗї4„J”mџ€аŽbрё^IеО,і:а~œч]TАОP’ШsнД„йKШF]…wšГШр­ЋлЛkа јsŽ”5%^žKŠ *o№­<ƒедhх†—7АкE™НќpxЯJ`6@˜№@.ќ˜ ЌЎ]…эR"ј†…ђђEф@ст№1у…јuQBJmМj3<яŽ"ŽЮtВqP’gСв&­b/ лы‹мёуˆь† LЋk\QTњтуб=-Љ6 Хш’ Ј4нЫiх(t—EЭ&ДeХ\ŒH лъaВW)c=­CіуЋ~†{eWЇЂ‹00iŠљ*E’lрCРЫ”\Uрйж%Њ&<нoнѕhQгžršџVЫЯ В[N KУ7‚$х`zOР‰ЫдУ(€`ђT[h4žmfgwћ>ќ”Ы;oКR…aEŒŽу,o"V‡!kБя™˜4M‘уzзCQѕЭФw\(ИсћхtV&8,МyМГОБўўъХњњN&Яœђщl9Џ|М<ХыDuG:‚Žы‹/Њ6д•рЬЂ‘VОђsђ~ИgЋceŒpгT$o"о‰ЫТL›cY1д-yъущПІШдлѕgяЎ^­ЏsМЂ€—љi2YLqc i{љДˆ]ЈY˜сѕеX”5?Я#,у›є~†Ж“Ц– г04<е—e &Z^2дНЁ'h5LД[N2РЄЎ оЁ)вxw}уoяЎ_§mу˜… ZFВœO ~рE 7žLWx~x{нц$ЩPŽн €КŽa;фOL5S­Јx` K…wFЋF–DIwaЊЋ Єх$№(ФВѕˆюёl§oяЎ^ўmуђЌHxЄoЇxЩТCШ АЃ)|MИЮбс§\к‹=љAВ<ЫbпUеŸ#ЅƒuG‡нnЏпkп\ЖhŽ4A*'›РкїЪI#v-cћЅдЕ3}ѓъoЯ>ŽРЇE€сКсФеtжФ0ЯЖ Ы!†‚–œэŽEQ2"_†dя љїGунпGЏ{ e0ScHˆЃAыЎеŽi†Sќ п2Ж@BUNŒ–љЫ-Xˆ{ї;ЯžНЙАсGѕZ<8˜V Ќˆ žeшAЋ5–й};љ}БББ}B“ЙЦ%ШпеЛг4‚АŒ"RwЗ=@Ž 5і:Ю§§OKГЊ”XM7ЙЋ№,6VŽ$юi–эCЭWVˆЪGаЄcRИ~З ЮБ§Б _СCyuЩт™јЕo*]]єЌSЈZ0Њ М8.А_ @ЖQџ\Ѓ ]фЋѕUіZW=зŽ‰мЭiŽЇгя#jђ№ъУЋ­ЭЭ­“$О$бюv7жп\ŒБЛQТuaЧфтТ|‚з‡!т§C{ДёЬД 8žzэтŸЇ™A`Љ’™4…€фўћKšt&™ЖgHЎ8:а!Т,oo=ми–ƒ3‹юп<пккк|ўіJŠkR !о|VљдбЋЭэзЛ0н&’>#їУДЪ †“%Ў‹Дq<иMpsZ—АЈЦшф_yдrzм4d?м7юопCЙˆЈšми!dlТдƒ[[лћЗ"CЎё !•ећ№|s}ыхGЪыbtŠ"ГїЇ—=фƒя ЛБšвЗ~Žя™зцю–СhьœЯ%ЌcШˆфDЩ™`›г,юОЃ7_ѓ)6/WFЯW=V‹Boэ=пки:ŒзГцГI`hвИuлЁљhаы8<`‹ѓ)†~Ъшў˜Ѕ:=VБ’щМN‘T­eqЋ‚ЃiVА№ДџavЖС7о\Њ“UKє‚pФ|›ёхb^ЈзoЗ7?ёfŠWД`6}UЂ#†ƒЅHл7W­‘dхЂ2вO‚кх§Ч1` B„%iЌФC2v<І"Шф–‡ф4xН­ Џ6ЗvяЌz7ЛVw WƒPjУSdТесНd—„tЊv]œАWDvŸUl?Ÿ-3Ј‹5Я§iВSŠaљХOёДСє‹и*IF:CЈi(я §йiќяивi.W 'Ш#іАШг B†4ŸжЁ‰Mе€іyzЬxVN—ГPa†Мa§,ƒя)0АSŒДL—Бч˜тЈнЌА&мhѓШр(5_bŸжъ$RY­fћ{CжуЂN Brѕљa>ЏЩЉ’‹ч3€џBdЫxxЌ=•0ЂєГTЇ§0IГ яЅ?Ьы<l…‡@э’Nц„Œ­ємЈ&gЋЫ›_ШНТUSщœИ Йˆ:~Лн‰Фu3B“VЎA=Ҝ焆РА?ORЈh^’цљЊ%ъ™‹O Fу %wіaiш>?ЎЎA>>~§ђјm^`,іQ>ЗX’)‡'Bї!Ыџ‰Tnфƒ ސ&кhШbИ[ŽsAnяb g]ІQœ–Sr;ve віСT}љњЬ}xјњu C ы…%iдDЗ _‚3 у‘\ј|ќќхЫgx'№)ќ63ЄfW^ў@а\6SpЫЧесНщrЯoE€О ~ў?џыW˜ХiQт@UrљёžхtфЫnэ#КвД™Ь5>#Б}зЦ$ ь_Р“Œw5I|ч/їWт–$А­ў†і•ќ‚џ˜kEЕўўЧ‹§wFєKМˆ:% Ц}Aїјђ…‹ѓ>'н$#СC5иЪњѓ…і2c~XНЪGВШЯћќАќћЅiœ<œчЏ0i•-s ЗЯпН?12Cт9тŠjgšXќHЎЗЯsЯВpЯе1ІѓхЌ -уpЂ ЊfF€0qnц ђРТЯ%^ >Cц 'юЏh3DЗEъУ_Нкљtбgф }л‰r\Ш№„_Ш{"ЯŒІ4ЁжСГУА\(“Ї…їфжƒ9 DжтЦЌ€Їф&ш™­U$РžёŸ`і#^ъЪ=…gшЋїЇэ!-X­‰œ .G|Xђ 0ћ О—Т’Œ‡4в5тжHbыПH†d : ЂГ:В4Eѓ‹ЊYЌІ—ЌЃЏ`Т|§ЯЏ`Ыrоф6pАзЎЧcVГU0Šbx#AОЈЧе;Zy~v†лšТИгjЕG№J­агѕ_Ф%;”l„*А†U;'эЇŸПЂK(‡юќЧ_0 N ›ƒ2u|іБE9EцX€„„Y=š<’ ѓ-€рGО~^T‘ƒM)ѓЃkZЦk“ПJЅг>ёч‡Y]х‘kHlяюІ5ўЉŠіŸ†•ЂЉj`ђ}›Qм†L†-4”ЬК 0M\/ЮC @ђэю‡^ЖЁЩg6+"$Žђйg 8_UQx…AўщэАcмжRјСЭйy_ауAЫY3%‘ †еП—…ЮѓВ“$Ž@Юі.z5єћ=мsвRД ˆ ТзeеЮ–_№=6Єя>rецj ‘щЗЎop‰ћ YN‹IžІ9онjpЦРS!рe:іyщ~ь№lчгСuЛs{}зщЦ,/йBcкЄ/XNvŠх#Ў…‡К, мyЕЖv9цxŠv<М›Žm№,OžЗzНNЇ.№Њq™Кё_…ў~б 8r­)$5‘"2гућёˆ‘Ђх—ЯЬ]cyž†§Юх‡—kkWcЄлRq–㇇o4\‘2>§tоъtG ЏљYедel§hsЧw‘ рЅŒРw` 2нЕу+ХД,0–†@ ZзїнСЈwАЖv‹}Еиu^!ёћ#Љм—…С]П}бъС awTѕOеќ\“5лБt™ъ€t†У>%‡KФі‹DчGWћ‡з=šчhєiџ–&хЊдZz№ЦSћo>]і‘Џ ФЎЎўщ:4kcе0 ™С“ГVаЙЇœiеГФG7—mZReЙЛЖжDУѕ‘ƒ2ћІвў‘тѕЮЮq‡“TЉ‰]§хIх_ŒЎЈˆЁНЛo]]єeA0§зyцj^и6”•б‚сИ^ФЩІИЩœu0еъјрѕо5˜)№mMгЄП@1Б#Л5 YbYЧыzžЅŠ}јМ уqЙx|‚;’ERNaЊхюэыO^†Р1шпo2–ЫРЉ 8~\|л6“Бaƒ1˜ѓ +šеУr–й† йМ tю|gПІ§ВBх‰ƒ’tЁйРНОиЗucТBkDЉrБ5XдУf‘YіvqCV§йnƒ}Nб­А\~&{Г*ƒХF#qЂиЈ7bд|БЈq<„bжФ–2<СЯўUђŸ=Š—TУЋqУl^&‘чК–FŒ^ГуaПFN—‹Ъ•њw#йЬъТгП›™сЯ>_x1СЇyNЄфLU^-Џ•iwДЭWхюкЂъФ‰gjЉ mD‘ѓ}=‚Дї€Жчй˜фџ1&мŽЅ`ЖœxŠ8XЃUщ)ў rџ—б’Ўе).ЙЮУРwаџЃб­БьT`4Ю‡Дs+НтёЂxuƒЇгКЪтаГџyЯЅ=тѕlVžХ| …Ы_oђrе1Šn:* &x9XџЇыmэ1Џ%ediПМr§ЩН†…Нѓx5Xљчf@ ]`ыъ/[јЕcФŠi34џыеXZжmЄПќЉЮз?kаPК(вє#ЄU’~Œ3јЏcŽcџŸX}ПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяёџяшQЬА6ўuƒAVКРS;kcУ2єбЬ1fџ’ЋџvАЪт$Yь+J’Ш“зжўЉ9‰вН0 ŒџgNl’сFY5™дYhг”+=О'˜ЦЗ3§<ђ$6ftGћы-яiЎы'5^ZЎ"Ol u/o2‡+ЦŠXpLУ”лq6Љ’@W8іŸЈ.љы‡Œк‘Hа5ЋЊЬЗзМUЅЏRœхяЁsпYcЂl‚њH!UxQSлпЧШ т|J5sTф6юnd/›–.;’пDЖЮн§§šІ“"№DШ­6Џ VГєџ<ь0ž‹)Њƒ8{|-ищДrбBMk˜глЛіхš—“"pQv8јxxt|Дџ9Ќ5І/ЂЎRQе>В0kf…c8№)Š„Uс№y?mt9kŸпKnEDќGЕЏ*ЯѓШQК—xЃЌssАГжRue|3vф\Џg‹JА-Ї)ЌйiUVЭ|ўёg/ХžЄыšдЙМ aЂAЮdqC…5Рyaœ&ЎСЕ‡’ЊЪЬнлЕЖЊJу›;Щ'*zЈє‡’XЫљуЌЬPћiZХжї‹FџашpКИ:?’<фЊ!K(6Šт{u™њ††ž)Œ$лЖMо_kKŠ@ЕЮ;*2zУRDiГЧх’\ТАпЂŸѓ'нbuЏЪaii!ќьG"CŽыU)ЫЬW9н \S-зqlW:\)*пЛЛИшK2Њ !k“§№ј0Э‚Т`9–вўMюŒцз•ЃJvЖxXЂHё™?PрцYЅFВкЖ‡,†ЖpЖ&šаО›D^XЬVїєаЉч€kФЂCZq<д‰C”)ВЦЗ’m˜:{Нд‘]ДРїьV.ђР,›Ihа–iбДmi№gВaћЈќ0]ЮЊЂФдђˆœVѓ•ШjZ%ъŽeE‘†ЎeZІ1ш(_*ДюFšdЂЈ дрEьЁа…> ˜h?ptAR~y’…”c2E6я‘ !тBѕ)^nQ†’ѓœЁ4r`ы†eщэЎхКЎХDЫ+ЂV˜5Њ“ЮVДBг2r IqГТЗlлјеQ„5‘,Ж(šo„PфJ$В@*œЯВШЄG6ж19Tqр8Ўm+З(HчЌ`I>F­Rpkdq#МB„?+ŒЋf‚:ОЅџкЋQЬЬŸ‘лВ‹ХŠбЕќ tЦѓј6ј1‘@DA€vЖp=ЖРxU0ТЄDК)ЯД1Ь5№ІsђqdЮ#жLŠ4vŒ_šлКe[Њ(iр#гoЬ›oзrAЄ' ŠїšКњг”Іџ8XI–Dфї†uN(ЦБ ~&’SVI мuœ Ћ*, Iu№Žі№NvНР\ ш&2—ёУ0) ‚V3““ кОcZЊчћ&TfЈ–ЅaфйŽЇg№m„A ’ЃoTщ (цWчCЈWќ0JфЌЈЙ0qy&кёј+ЦP4ЌпuVrЃпRн(vƒД@E єu№j'Jг Ц#Ќ_ТіјИ(Ё V„.TЩЊёыЖBњЃыГ!*Jњ~@и2№ЕB:ža1ўшкуѓБEUхi{ЖШ[ЎжОзPN0/*Ќ F‡№a˜„*„ЌEŒB @!ŽЎБэБdКPYў"›)*XV7lpJл вšЂнSФЦ!Dˆў%хEхЄ ЁЂѕ=O“,WЙ…м(—‰тРP!ф‘ЇjЈ›“цѕ#`Я+і•К4uњВс%Ё­џš§Щ‘Ђ*'РŸ†ІjК…RЎСђ‡L3;-•япбn”ORKрEХp нtЄыЎщХEОœЁеM“ЧžІ˜(œдЫЯ‹цё О2€`4sЯ™~^ТпžЂlќпŽ{Yu\]@-ME§-”ЗD аH(№Ћ+Š*вМчufp ЫђŠnYЎpоБМ8ѕ]wгЃq™&‘jBr„ЯA095ФBЙ7ж}јМgПфN6-QdŠє˜c‘kYQЭe.`эУDƒCМŠЪmК’.‘ЉŠЬˆзLгцЮ:с|Ї(Щo`ЩжPЋ8ЈmрКaQbZ`Z€sтˆвмДЉ|Sцyю`JбтТгЂtFшi=ф_§ќ0›?ЮѓаRІC(я жАфЉ|ЛЭЋ–1џјўS›уY^Г‘ yЈЛFq3€З(Š—M`Ѓб™ЩїzŠ  І№5њцтђъЎ§гKБ7d$еŸЬЋШDъ>šfeЛX~ ?DъдсЙфи–ЁЪВЂjІ;*TрдѕћwпvЭpЛl6EНlœъ˜АкQ5УšќaY9ŠЄЙЩdжФ†8ИОИКОя§Ќбї#ŒЖ ЛАЋŠOAЁ‘/>^Ьgы›мХ9gІияєњУБdЁтšЅЩУуƒЫУ§Žf#Š„d(ŽЊђx›э—3pВY рДh Шt~дККИjѕ~–sПK!Л­Ѕ?ЁЄeYбDŸ^.ОTЂкRћ†x6ИКэє}ZA[пzGg§іё=Єэ"і,M”§z6Щ ѓ#”эАZQN\"Ÿ‘Y˜•О&В *л№МdФ(Њіƒ‚?#д_cj< ;7mZЖв)nJ“=щЯбЇgЯяbOсяŽŽЏк#^QUEPЁHшПмxіboће›н“‘ЌiрНШфzї­і@6tэюн ыКіьqJNжq—ке5Y’ МЊv†Ю"џXСиgy€\ ’{rLЗеЇЭЋцRq§,Ьwыћfn(lїіъВЫО] ~Д8КмББОЕЛїтеЮЮўэОЈzq`анЮ€ЏЮnEOcšЏрgИ#ϘMїм1uфєšg†(мјt‡ jРЯ8€н.8й„Ьˆ[ЬИ.М^пкюf”wУЛ“‹€ь ІЁJєЭё‡ЭWяŽ/їоОй;ЙьвДtцšГЂЂ)§“{Fѓ˜Лъ вXC§3'РКЉ'e ѓ1 СћюGNНh"яƒ CЋшšЎЫ\џќшнжл“ЛнЛќИѓюш<^фy#N ъuъьŠ‘mЗu’=@:\M6%V[|Ыy)S_{њ† R(Š$ЁФ ?h—Њn QощќaвzОЙЕ§ќ4š&І"1—‡—ИTРJ­гУWЛЇW­лгo^\Г2Ъ‰(~FŽmљњx(щžњщSњ№ˆ‡x@Жкў!П =єѓЧВ–Ў)  Лё„ЧЉJq Xx(.Жžomom'гд’фёЩСЩЩ%ЃШмрцфуѓg/^П§x~ёё§ычћїЂЊСт3ˆдЃеоE‡W]ЛѓъcА|Ф3ШUш_ЌЖї№ gОœCЕ АыЉF šeIˆДЎАЌˆ~4#h  €МИˆЮ^ююьОкјdЮšDЅющёёq‹˜охё{дUк~}tњцѕѓѕj#`9 ˜д6„џХо{hЧ‘[ЂјŽсHасmљЪЌєо{o*Ы`Kwў§EdЕюhо•юЛ5ГЯЂš-4€Š<fЧ9БGwc^Д\њгЮ'чЁMш[Wно;сй hvнРWЇО.яйЌий`{Xж‘чЯkЮєжЮЩлƒ/_і_эѕгYр\аохбё€uЮПМймњЫцЮЮћЃННн­—З(ДэЙІaЊTП7˜’с _іžpюзBпЏ)№Tb9k |kH‹r[ўо[ IsRdx­K<#7PЙЕ iI‘HKdŸ}ЕН<кћ,еM“ъ"ЯзGЇwГю§хйГээЭН{/v6Ÿ_*т"EUчђŽрdйŠѕЫ7Џіі}<ЄZЎzй^ІЮqŸЫ"/ЋљВ э;3sвыМЦєbVхБя@~зY@0яњ№фрєњје›ЛАš6в.:Ÿ^œžьТNom=л}ЙЛЛНЕ{)i%t‘К=>GВ*Э-ЬыŸо{Ѓ6ЃЦеE–њx‚•dRрІ,\ѓ;ЫсX›ЭZ2ШўsШY1ЅЦ—8Ч0ц_Н§№щј№эѓНcЕЌ›КФщяФеёЩЩёўжцц_6A­_lmэьОЈ&М)yrsz5f!Oы№іѓСсё—л“DHчЫvшА^F1№:!M’АlјOы?џ›E(КэEѕёz6џ;ЮudньО88}џbїе™šШНj;М::8:мyЖљlsыйіюжцюЇ.D№^дАл#йŒЫ:~<:9>;gЋЧѕ Ш,1$Й Ъdl ВХYh~чPйО`˜ь5В`ЏЩd–­ тRђЄф›Ÿ`Ѓˆ ы*ї* NїNžџgyЖЙЙГ‹єU”^šЃ G фMS‰ћЮЮNЏ/Щ>№ЬИv%žЦeЂ(ЋАYШ)ŒНпЭ 5UзЃ3Ь‘EЂНЙGљ-ЎЬГ7ЧGoоžаШR[UU&6о)љАПїPPчл;яHє–џА8M{ŠЌIчЏїЏЮNЎЎЙщпyHJKBВ7†—1ЗУбО–a@jцшпAЮРqЬЭёƒѓbСkЈv”З<э-ЩjZЇфлƒУ/=РoU#;w™y:ЄyЗћЏžommoюМинн|~tsy&H,ЉNŒиUд{ЕїюьђєјL?мЯёroYšЂ„ѓтq\}<ёИ‹eІK"„] зН!t!jњ7зР!ёKŽz]†[OжmзумŽikI˜ы2^В’РЖ|ЂЈ€…@ЉЧЗ_оО@zуwЧo@ђУУГ>#Љ†›TUгдѕДŠ ]aКgЧ‡TНњzПhRЂŠН`‡&“ё„Љё,Х)*rџVЁ!ш"т;ECОaxbљ„LП@кВ)жmЬЇUТ‘:NэF ‰Ш JwЯо=пнннй~ўrwkч§чЯзј5v˜UшЋм&ЊђшЊ.~{hщ`VБ"А4‹љ91`Mњ‡ aўF™yеє]UСЅЋ:`dжЖƒ=j~ЋаВj™Њ@ j8‘,)bZКнЧrо*і’#иы"Mу`-ДŠ\чмxяУ‡7oпО§тrЭМЋ›ЎчGiŽР `ЅВсЏBСЫиГ1ЊтВƒЌСМ pО9Й•БЪ‘2’"k$A‚h“”MЛБёФІ!xОRч€~cHZБ~З%ВeGћ{_.ояНљ№bїZФ‘ћšn!ˆ3l˜-[’БE{вЛhїм>$šž‰ЎU”$EЧRд)и•­Ћ!В№й,СтHы– еД=$уœOл*ЄВiЅn]Hk2/ТbДD]ƒхЙЩ—НЯ_^Нм?и{qл"dPTЧ уЄ(Ы)Vœ‚j Оkб9ŠŒ˜fVэ#„W•i]'ОkXп~ )J<Х!Ѓ”Ф)Єk5( <ђмvсж\!ЇI9]Œ,ШfK,№ЬхЫ§/;;ћ‡Џпv9^†G7mз…„RLmRИœжmUЭкЌБЂk^ЇРW5нЄЮсTѓлЯЦЦфˆF‚pРь˜d­Zља ъX5У’уК=?ХЂщiUфYЯу е!ьД, УOvЖ>|yћy" “†пхzГр‚З3oЉБи OPxђ`жМшЕkтЋѕѓ:1ёмт›en7x4mIљ№lА†]6%Бeœх‘п^bt[шe Z"zVєЗ№YЃ‹OЛлЏК‚аn4}„!fHџз–]T3ШБшл{Ъ,ХкІVчУ/ђуКЩl№ИпwrЊXЖ_ Й n-‚'02DЪi“;8;љ ы—2ѕ$ŽAjЯ…$ЩдЯsŠ|ЖНЕwAђ/!Њ7нІЋEйле§rŽІJЃГа:}?.@нч5(ŽГ  8эЛޘdлХ ‰еЌЬ!ЁokŒЙ‚ ЭыA os:oUBbд^cƒŽTЂ3zОѕ–4ZCоeЗ=а@Ё!@сЁ#ЈмДŠ,MЕТоWтТ.eШэ7Чˆ….TмqŒя9Cр/CG4-рЃкpхИXl‚Ь^&пŸ(vб4yйVдхq’%XчЙЎƒR+Џ’Џ6$МДЄчp0ВфИ*ьxРЃtˆсЉ)SЄlХSј%€%uьMZоЗѕ‰А_sј,яЛ:JhЧEЁё˜jZYУТ6ј=ІЩмŒ$-ЁыVшіlў‡Фѓ t{‚Ф|м:œсЦА]Ќ;ШPф4.@РkHн*_хюЎYLХъ: ,MЗуjЖfС]л* њясJ;n:oЏC`O№eK›\І>€ЕЮ—Ž Ц he”а1ФсР?hˆz.Ÿ_€гmƒЁя(4xЯ \u…%ЋxІТUјЛѓЁ eъiŠЃ•ЇuK,КqОGhТі"ь3Р>lТ@ћсZв№шУ%Ѓ„Г*Ц–НВ,БЖ…, о Ф‰]P OŽ` JпVBL‡‘IƒаТјњ–еL В‰Šїk'л`uЊ§=Ї5ЄуyиІ`nаІUz–B\žžнвJм$NP6HщZ`_*uˆgаxк^ŽЙ˜Xxqd˜М ,ј6АEoЛжDт!АƒNƒdиœидЁEdHxшprЧjЋ24ez"ЖхhЫYlŠсОГЄZХd#JЫѕЫZ,gyшшLП;$Yмt9mтКNЎƒџ… ˆJэ‡Оi€аКСMЄVњЖ­?Ÿ‡ggЈ$Mю{рє вхСЩ›ї7œf9lƒ.Q”Є;ХbЕь!‹плc9€T№лša oz3Ђкs=LЪЗТyŽ;]Vm}шtр;ІeCЬф( rиv'ˆKGaЇ 4XММє5Ьs_сйочзя>Г†№šШpŠж"В ъїVqŽ4.q[œОhЫj ЊKA„SLФЂE;›„1@$WЎKє!ШцћШ}ЁЉьDЖ0uВм^@BЬ„зVb|™цm‹FZЅ–ШѕŽЏЛWg]аыЄЊBCQ5у+ocћ?лќПyqВс‚Бi™€qчwМ ` РQ`Ыƒhжю ъњ^рй–SJЫ6Ј#ФЏFI тVEP7є№„yЈмiШсуљДє •gнiЋAЊажПShZT;(ёК=@;хЮчтВ,ЩfYBЦQZWy8­FWCТн ЗЭ`ˆПAЃёxђ–“@Еy3pпУ0Я"[‚_) ежVШ7ЈpЌ WZTHŒњ}2Ы-ЮŠЭѕŽLяNЯ†р8xŽ•Мvƒ`РяЦ‡ФŒH ЪъBV­Ш“1ђWсЩЦIШЕ’cxКz–ƒ…ƒ"yЦmšКШВdЉБk^a(ь ~юЛЛ@ ќ Љыp­vП\ШсхY IŠ“ƒ е#ХНЭЪЌ@Цh€ЈX @v;ѕˆ!Іlьх€Р<@dP*іaЃСљ$ЛqhЉ"ЧONЏeгЫЪ"v-•ЁсgM4шяМiж/ђlЏ†‡gAфяо~8эMxбˆГЊѕИ№ЩIžBF2…€o;B‰3пRЅaВL0 kХ#x+y)C О"'’„…ŸрuКРГtїУћj@.!СеŠ ЗhпыіNЎ O.И%pАжё%’4ЭP4‹ї‘~Zјр‹ˆ1Щ‹ЂЂћ€‹Ћl€ФQ’CТиО-‘ŽPJ,tFЌˆЧш:RМиjš2“"ХЈс‰2ЫБрŽ˜ы7ЧВJ {CTєвСn )ƒхUлA>%КФ{c\VсFEG]Ђаu2LИкз†IУ$К7wЦ` Ў#СфАТМtДB ˜lXф8 †AШзŸ•чшaыŠА@€в~`Ћ]Ч|Є`ZB:зn ‚Ј˜aI(РЅА}“fRФ(W5m^†9Œ>ъ\žнєuЯђZ,шЪaЃSУMињ™" mо&5М9yџ™”EA`‡WCFR5<вћ2?САЃ|ЭoПX$Š0ш2< Йіт"qГ&P;BH™Ѓ*Oк –Vс›Ѓ)žюu.&!^хexБ4:I!FЈАЊ$€ШЗwYЇ_Ц x‰ЫƒЃы'ыцєŸБ†‰НВЎ—L—s_сz/Ш`н Тeц'MŠŸ јШs=№чiЛ™8о N”‹O'M#љф€СЂіАДDЬ YЂ ›ZƒЈNН$ё <(a{ЇCQ4-U‘Јлу/}JTОЛF—j˜ЃjŠMg єh‚B;эЧeqTeјбa›‚ˆВu4ksњЏw{) ЙЄїbbЦф†Пcіcѓ@и§x;ш|SDтЌ+ШfшрЕУdаХЛщђIіzAOfЏ $% 0U$ф`‹!ё@ЌЕд`ŽG^xф1’Юžяœ;˜Nііn8 ВВТ'УПEЊ›@hA ьљ:(ѓэ-#€hЂЧадšЯFЌт–‹кеeŠЌ$€Б№М([AVХи1к…Ь R<@3cќngћЭШBчюХЮЇчCК^–МёФћћŠ„Юc0П€uЧ‚0М&5m›-- O1йь^Ѕ%Aеt6ƒ”B}р…;ˆЮ fRЅ€N СN[˜vдэu]ЊЗЛл;;рюш§нЧ€ žvРsљшЬрЁ3 Ј,ELкJK‘И!E-K†Ь-ђLMћAіRœ ™‚Ь*u~м%Ј ФtЌ^gЕИЬ}l ТщЇгІН?ЩMёюхжЮж‹+EКклйнyл—}l:УЁA™c`GшЌД)"cК—C†…фbtM j пх;~”„ŽЁ)?4Я†Гt$U.CCг˜›у‹>1!лоАOАJX䉇Bƒ­ыі,{)"БПЕННѕžІ?рНэо ЏЇxœ‹}т><r‚ЂдХ4 MžіšœžаЂ5•Џ`Ё…™ПіCЃƒXАb:Јў`ТŠ’ШГгЋЫ!Bъi€д^лК BукМђРŒЎ_lэl>яoЗЖЗЖ_w!ЈзЗbЉ‹эсrƒ…њђŠІHВГџБ/(n5ѕeŽbРжя.p[/qф?iJ‚П0тьУЇу1Їi5K@мfАЎЈY,Vuкš,6ЗЗvЮћЏрЏчЇУл€Kыj6KО{}7Љ…(„Юѓgyіщjї/Яhј9 й5ЏlцKРH(s:Х6O4њx€<ъV ТaЯTОчрПЌ1УPDяњђцЎ?їЯЯ,Vt`G d€8М/Vї‹Ф4mЌrS…;лк|Жљщъ9Ј!ТУŠ/43,Ї uˆ!Бœ•Т3фЭў^Ђцe.hі•jXеўФ™t§лЫуЃу „$9&HŠ"‡Н> Щ‰f ИсќqUЙ$жКŠЯ“OЯ6З6їЏ_<{Ж{)`1…„•WV˜5Ы/5Й'q 9МЛpVНФ“щM(^Œ(JТгц €ŽXrDв\[™ˆu(§В;$)Vtлjіъўы<ВАЎНЏ^<лкммПл{Жљь§ˆom[^;м€{ŽІ‹iъ 7F"ЪŠщиЈVdЏ?&(š~bk№DEzm+№Š[WUцЦw7н9!iЗ0ЧУC…U0XwЈJвјн&lєцAя5НsЮa]Šх>Ке€ѕ ˆј ЄэІ†ЅŽ4ЭacЗ†Іў“ц7pКюњŽŽph{“lj3!ыq,ЫыgЛ\Њ+„GR$њxЇњЫјѓќѕvаVCрVЋ:М™ 4{1ŸтЬi&}€_rŸВ?i “іƒ•qšЇQЮ[€YHћЙЖŒ [Ђ–Бї+ш'Ї/6amНИЄЏ_C4пљL бb•.М,Пj0QЁ#єЦ<Я onњ€ђк&ТЛŸ#4ЏQYсљs№ ”ё рчœЊX48Ђh‚Jƒs”˜ючр:žmюtIњњ рМн/DЋж :Кaѓ9VyT‰ –'€,zЬmŠ$ˆбˆрЄ'њVе#ШЃ HK2WхБЎr2Ф~RQV-/H Ÿ/VїЫФ8ЅаЗЏwЗБЫххсˆш(jїрч‡}pъNе^ /ЊШТТ9pGњ93ј‚а€€„њIs>8ЭŒŠШw‚rVGКШёє|@dˆЭŽч9ЮоZоChБtЖ{№  вНOwМЅPVdON^эlэО=бŒ €vЫЖ@П),БРvо˜хBVАЎЛ‚Dої–еџяK†,<)іЛ;Аu‰Нїиkƒдe;Oю~šw_эю@ЮВНЗЭИэн,ш”>8|ЙЕѕтнбELрmХ{Sњm5 KбзšX*”ЅqœДїКeсO ˆ<$\.Ю‚аиfІЁВЗЧЇ=,T ћд—їЫх,К}БЛ ћ лzЩК%^K/аїYf^юlя>s2дУИэ9_Ьrk<9bЬтi!э%xH‰їкѓixр)BГŠсй*=a$ ЎђаЉЙбэe‡жЕhѓVŠœ{З…ЊБ§ќѓи)fЫЖsЋЪрп kt№bДцнШ j*4Ћ3ZсћW=FhЃe‹‹uїй4ГŸ6‘i"ƒp§>%XХ‹бiKьЄз% *ШZи`{л<СnТzy.eыnпVьЖѓa1Џœ!ŠН}Ш[Х#VNKWWйЛ/чC Ї˜`f™]бІЦ˜›?pіј‹W5a|гЁDГX,š*Ё ,ˆє!#•vиЧ§<юэьlяМэкѕj=яlнux{ZкƒЯ/wXГИoЇ0N}MъŸwŠ ‡#š—-/ЊQo@ЛГр{ћŸўџ‹bYЂ7 $+УС3lSpќЖл№Š[/Б20 ^om?п'ЃV[кЂy,ŽЦОЗvл‹в^egŠЅb+№г†€№‹ІFНNo"B ѓхМpWХў“‡’ЌР_™Iƒ‘ Oу ф р-Јс [6чЁtњън•\тHКјJ[лvGЖ-л8ДiUЖЬ—и+9Ÿж~[ИЬ1д„тБу*УЧЉ‰—БyѓЉcC9ФŠЊnЇX^Дœqр"EЧѓŠ],qjз"БJŒšvд§z§оƒКZ7vЖџ6Э*œяuџp•€,bБ§ѕ˜4@‘Ц“ŒЌ=U;6h№Šf8qkrЫy]$О%\dUлј№АЌЃ0o@Ў‡ЧЧv<–ЁЏWлˆtп>ЮЙСЁSїX;Н\Дећ9–мЮсe=>Т №5v8ЈўD™7D}q{q=[ЌPSБ„3А§xщzNЎ)ˆ Ÿћ>КныЖ'Аu{ѓж‰ y>рˆЋхZРіiPƒА;чсїŸš iЦ㇧Љ^F^OWЋП7I7miЮmБZ НФM~|ќњ?K=ѓ:ЗhоРћu ѕЋі €}Тї}ХвZыўTћuД ^сOФЄhnZdq%ењтХvыb-J+Щ§я"у?œјžЮƒг7ч Ћ'eніЎжуwсoY=ЖђЎћ([‡I[€ЕOŸд%hNZI$(ЧУ?ЎћџѕqNиoАОТfК(pћх§сбч.#zeUb№яz‹ОЎ‚јї8C#п p4ež‡љі&ГЙHШ’тЄNkW Л‚š т]Пиѕ&Ѓ_ћыo_AU Kт…џИ§юјŠdЬ4OТ0Ља жJАўўŽЏПФ#B,ЁХœЫ&uЬ'ЅПK-+F˜gi‰ХИ5`БЌžУчџ]fј|и_”љыo_! BД‹M‰сщ§ŸoGД QE#ЦqШи аŽ|lЕ є!n‹€ЕBЖŽѕ›щЗї.ќї‹ŒЄž‚'Х–†и.Ъ›хzЧюA/P7кmў [WцMЈxHwpиЇhйvdžЁ(ж*з ‚BЃШј№э 43юїcšфjњиWћ“fр2JˆЅЕЏKX.o˜N˜5їјС­–ЂП}§ы_БЏi>Ћ|™gЎwpMQМЉCШ'ЦZ *Шк[k•хТЇ||„Р(qдрцќєєjРCцы< џџУbІ ЎА$C@ъ4ђ7диhјѕљkлoSZ<ЧафљA—‚TŠЃАГАœтТsтлљ­ѕ`Ж…wsпВ oп}юАијё4€їП– yu•љІ&NHnы:A:ћн[ДћмŠ ОЇQW$$уыћ] `–ѕGxНФ‰ZМvlш<`СVџ 6ћ~ŽѕU‹}аwŒЌў,™7$ЭХЋUЁGX4кЌОўжJ л†BУТйˆ $1$Рdїш§Ц ‰сˆœ@.IЂ=CЫmg(ж˜ХзпўіWјЩћYXTdЧЫЫŸЧаШбЦщTЇ/hV:›ЭЈ”Јk•FэЛ*㉋ԧшМншP4M5!ЧНю˜ЗqЪ7ФТ‡‡Ъбt7[ЁёўЧ_AЋšЌэЬљC џsЏVU™э_œ$нЋа €М шWєmŒk…Fd Ш/I‘ЅN6nGуСэѕmV yˆmРрчVЏŠ‚dП§э?ўчќ~ЩЂN\и—Ÿ:•$fxwн Њ™Эз2?ЖeQWГ‡ЏmhўэТ GбМюЧЎРі7>ŸРКшєюѓF‰hяaUсмHžb xќэoћ+š№W<”7žvмёЯж€т%pЅсћLAШіќЂŠl+hZsQћрЁ)’Sœ@у&_Ю/oю:Нсд„bЄpоNК-.}ШяАŒЌlв;xўjуш„Іиg/[{Ф9Kї•%’АЫW 4јd†§pš*ўБ:r‚<ДtiАqЮ€М,@ш‡Bч&бt<іЯ^яmœŽк[IsВІ=”їОq,bћВБqгЅd€znkЪNРEщn8(ѓF— JобЧ"TЂsјщЫљнhмйпнИa№К ЛAšѕHŒz™BяшгЧЮˆемЈЌ‚?РAџзЅ˜Ўm*xйG0,й Юѕу<„€и;=Й3 yёrЃЯѓЊiЗМ~эЩУњьБrTњќУxeДdxЮwў3јй,Љlu˜‹шЮл„ыБ‰-,{ YIф6МЈЛAŒеБиuНlŠOJSюМниqВхљ8гтOag›pЬz–нppwv:’нљomЮїuQ†  ЊЎЋ2};->vЁI1XNЇ@Ц ){ъбуdЌБдХ?™wАзНКъ К?C y`Ь4Ž|K‘ј‹>dсm“Гщ&Ге,5Ё\ЬSK#ŽёйEХаžPйёƒЋ?’МjјеђсёўS<-b@Qв4QkрU+žп7ЁBMТIхшќ ў8#J§ЬП^8Ъ’sI›ќ=bќ˜Ui`Ш2(V("ЧI8АідЩэPвƒfžXЪПŠrƒ,ГёЃМšcЎкцуг2 MEЁi‡FŒьMA•5і {’iс}oЫЯ\ДЄiXтц…IЙX-кЉхи*ЎыyњЌ.qуn"Л 4щўб† Xqтъян?_гВ@l7ЌpшG;Ё.тп‹F“agcуŠэr‰.щЫБЂh†ўozƒ–5P’aиq]OыВЌђМЬ[§ЉйIг$€ОћNГјЗЪ kБZ’УХ^JьЦЦцJѓGэvIAѓЫ)н†б§”ВЛŸЖFt|Ж`K‘яy6Мџ_еоdl„Iž–ТўБeоџr‰š‰5@~’6пКc9Ј›:Ы“ш ЧаŽлГ+.Шfгд›хМ0Iо ‹iВ(§арв',ZћG]Vфhбєѓ"А˜Q;d7mІužztuлПниИОИb§ДЌЊВ,чЋyЊг:rje&JК§]tO]CеВ]ur}=Ч<М§Т“Ц,вЮH‘ oпКЗ]њт’єв,ёЃjкЌЉЪq9ŸƒƒЁEЫ BѓO“™6,?Ž\ Ћ‡ѕ,5Щ‘ IЭД(sјoŽBє;зG#;/2[0Б+їqžШМ™4їѓд–Yйєтаџ9]Рџч51 Ћq %'j^1ob•фqШРВm=ЯЕхЩќЦЦ• ЎТх'zBЇ2cЁ=†j‡—dЁї'•OЫІ›UЭ|ŠЬоЎŸрМЬвМЄžЯАuнХ)c MCP6Ž"OaќЏ ‰Т˜Х|›Ђтри§4qŒ?GhХВзŒ\8YОf‹i–•ѕb>­ЫШ'ФЈлŽG ДцћОЮАNUH?T™Š[ЮKW  $Hђ2АПwB§-R7Н{ззФ:8Ё%„›crdQЧћŸо}КƒЫ œїШj&э`Y„…іЙ!*AжС”Йї'йт€7‚Къ‚ŒьироŠндCGъ}xѓщЂ7ьnŒaЃ-r ЦQŠs яWuб,W…mрR_ЋЬ|ызjNтћЇ]Щ­лpЙКџФi@‘“!‹]“=џtxкіЎ?o0 }Ч"ƒU…Ž`ЛWїѓ<Ÿ№N˜fБg§бЈ=^г ЙзНGџ`WфšuIьЪv.Нk Wч#’fЧя7ИРwmюЎ+yqšU№MH=ƒIцБ% К'ОЃџбJMЪŽчшЅxU;eXЖД{ЭДLlYw=лd{”ЁЩ2s§nƒЖ]з:'о ЃrбrЯпу,•EЂsМс‡8§јщ“1ўЛевЊŸХКШыAГТQ08Мe‰68›UЉ' )ь5Ђчёw 4’np§Уƒ‹oГљ t щК–Й-p†чЛ–&‘?iИп?[Ќ$ŠZTЧ:/š!іу АФŽ<.2_ю_UУTeУA.MБѓ~ƒ1t]пиП ŒyРVѓ9ŠYеО,ŽmM0Ђ:јƒdFњ=еЪЇЁЦv<[O/ТŽНE=E•ИОeMљВ,њvƒг4ir}xtrЫQKЌ і ёT+Гtœ>Ћ cZгŸѕxЫKbчgMq ‘‘^˜р8†Ь)xОR?ЌАUБЏ1нЫУ§;œ<™‡Шбы!Щ‹-пt /FЧj:CЦ-pдмˆŽт@Хюgїр3›v~'рCЭЫZЦЉŸ"sWVРqЩ5™0,УŠЂЈу4œЃЙИo2_w:§Юe_wУЂ№a9R’Р‘/;КŸциь—MчOB‡эуd–Tуњыз<іjQFžeЩФPДт*ГnђS`*ЏшajЫ<9@ Є6Pтй‰}!л*C“Иь1ВШrр у<Б‘ІУuAш>|%†чUœ в„ЊНо"ЋЫћљъчr>ЬrЯ6dВЯZaY‡КHrъƒЇ‹ыиRј уЮiŽ“УN&jцЋYцёgЇG[ъ:ђАGјZоГиpjШшйšOж7h‚˜ˆšЬ™IКиv–:јNпЮ-‘!Ч?ЃЭ’фU5Јыиб$PŽЅXgсиЭеВŽсЧлі$x–ыЇБ%ЯЛœ$ЧЗКgIdo(z%Є6uЎ*1$ЃЊМ•їѓеу§<3юА–WЬЇžL тgь4/ЊК_6гЬ7[віЩ„U"єV‹ХjVxТхлУБЄрА9†“uл4Žшvњ}ШVN]т(Vѓr]Q<<`o5 –СнP`ЋvbІ HЁ\њК~Ї™MEр9fBOVZ1,/Ьл‰Зy`k2Я№FŽГ —MФйi—”DІ{3œLˆ~71qшіс№УЧ.р#@аШ^е ’s ˆ-`Э“ЁжЋд&-ъ=W”“Oоъ.Џ9!Q]„EйmСOЇЖoГЗзCŠc‡ч7$ьєЈKBVц#Ђ>;М:ў€:.I›šUЖЌп F"ЧёD‡ ЪхУЂŒЛ˜Эт.P ћƒЮS7z((šTђэшєvшМхdKњс^Ђ=[w†cšИ9эR,ЯNFC’уUpМу/ЧУС)Є.QтPть‰rfM9Йƒх=Ўf-Ъ…ь `ylЉ2з999=Нш“Ї\~УSqаUFХ Ч7eQЯVB`щGcУбИws= !єафэщiGsы~јдžœq†cAР ”Ј* ‰Шё`ФŠвфєжˆkаN„A—_ЇŽЉа§“§ƒѓюŠђ„p~І$+:’уxщGДSw1Ё}ŒŽЁЅ2ƒб`4оuH†ІЩСХб9Ёš{ўњеЇƒwЛ‚ё‚в XЦЎ)3“aЬвфјB‘ИYѓЁЯЫажeЖwyzоЃGk?>цЖKђ<€+Жc$^[ Pњ(Ню†Lмє@?ЈюMw8tЎ.o‡‚ЎЉфСѓнНУЋ[’]”ршСѕPУ! №trzТљ5(ѕ|йŽ2ЂˆdЏЁ€ЄfкІњЃУwzЃўЭmЇOR dŠiOЁ8P>mИ}сИИЁщЮхХљљХхu‡`$rwoЖwwwЖŸПћxЦ#’Њs—ŸP,3 Hаiцт˜q‹х};эwЕš%Т„‹Œ‘šy$<ЂњcлCšЅIЂ{ssзO(AѕІ+”џЬюЋЋgG6БыЋю"oЎoЏAъ›>…5ЃУч[ЯїžoяМўpЇ@†ФF€ˆЮнЩ#Ю&NкмЏš)О6БЉ4XЈ,ЋЊюФгid(?6ЫІ‡gw2ВЙ :g‡_pшhи`њм§?ФЧЯоrБ.S§ю`дПэ†нЛЛ>…CAчw7wоНно~љўFВ§0JЃРф‰1МН&QЄO?‘NœЏю›fбК;ˆŠЊЌ›NЭšH“Dю‡b лrЧРг‹™HњwWWWw}ШJњцнљЧнm№зŸї^ю89ОытЄeH[MUфЦэы“ыgкѕћљ#fH'А\vь†ИПš†€…Ÿ}C!ћ „$kGњdD` ЏNgdowў0ы ЧўKЊ(=@AНЫѓ‹ѓ‹цИпjЕъЏЖ_lo|ўМsАїњєЂ‹40ЌbCкnЈBїтјЊЯiwx[а›/6gdЄЧљ< гД§8ŸЭR[~vE@qY”y‘%SЧдMˆуeЇ$ч&№IYурЭл7яіŽхyщiлЋзn/.k­FЋн8ппљH§ў(аЫ“ЛБРq’j:ђ-ЗЮOыЋ8ъЭСMњИїБоарtИбƒ,o~\Юэй]єDЗГђžhN]їdБ1 иg?ЉПzїёшЫёл+gY$к зWїvЛіyo‰ЗоюНмлћTЇРЂaY:пИ8ЛьВЌтщЗћ7љiкŒ_цs@ЏИгŽŒzQ™˜тsSsIЕ КƒžргАТ c a†Xg­w‡ŸП\пПoN!i5РIБTѓђЊоnп}мо~g ѓЛл4‡3­ЈbџютЊ>т=ДZGo_оOфЈiЕ!œXЬђШ™ lyЃйAь)Ян%мѓ3мMZ-po:СќWr9GвЩсЇ/g_n.?Оў4ЩŠВ1РЪT§ьІбМyї$~ётХююЮЮЮћ6Ы3,6gэмо6їьдъОљјЁž? Ђз€ ЖAИ БƒšЊ™~hъЯ ! ТГмqCGJf™`Дјbќёштьќг›—ЏЏэМЊŠигxntw]o\Н}ёПЦюЫ/]†УоІЬxаRЌЈ•^Л8њp|FaТ‚9бbYњрЂEАIгˆдЖїl.ђeтЦ.щrKЖqџЭp €zY0яNЮЯ?П}ѕіZ&5i  \яіОqћюХЮпўЖ ЖИ{№њ№ІGГ€mгKAѓВЙ{}|v|tz#ЭWЫY9ƒw-]Вух@jœk˜jЫвžЛK6Мe8˜iцЄЧЭ)і‡ЏыEeяМ§tђщнлг‘ŸЅВЖЛ dД€œо§л/ўj§ђЭЛУЫfo4Ь›mРДšљwoO?]мksаfdj@:zиыvћ„!q‡aОgГwїX уЁˆ œдŽ5т,П~sєўэ‡+к/ЋЂ(qЊ HЫ[ї—‡{;ЛШrіъУс)„џN№tЉ–Ÿ”Г2М}ѓљтфјВуЏŸжФmЌR0ˆQ^9ц|qC—ЇbgзgT ѕА=цe iщdАI/Lѓ O“—э^”ЅyђђуЛ“ячEћвiŒ|А<е:§јjwowя`яе‡у›fНo$ШH†FžLџМџђ№тђќvœB>Од… IшЯxЬp„P"Њšђ ЁyАЄ!иvžFЎEIУљ.gs `ШЗЊЪЈ§цфМУƒЕ†8ЄУ6‘g{зŸ^эnяМ=~ЙџіK з<‘ххЌ*ѓ,7nO>}9П`Ћ‡GТДZކqЙй(ьпЪƒўOФkпo‰Ќ" ezЗ­ђуЊV•ЄŸЯѓY…щs.|О‰вcк„Д]•dІЋ}yˆЬOoO^эО<Ў`юTІeFЖуЉЬ jч_Юы’з,ШсKf"гœŒЄндhТаTПQПG§”Пџd@ЦZXЂ Ћ>Хџ№;9Ю@ц9ІŠ‹*Sk}EX–Бˆѕ ;ъж/оПy…YЫЫ§ЗЇ]p†э…r3—eъ™№l|ћъNœ­ž№ф0U@ў]аDpч,3щ7.OhM˜яЮhХp<фр“dтX]wІQNЇОяZРRа4оJ@дК@дЫе B dYrэюpЩѓ“Ц—/іхэ о>8и;xs|ysпeB7Ь‰VœЉc9^=}} эkœiž™LЈaЗƒн]Ђ†ЬІцwŸ<Г ƒ)9bЗБЭ 8dVt№ЄŸ&Ђя,ёМ8K“иб4УСЦƒHfнП€љElHnwїі?\Ж(Т…Њ№уA(Eх~Н:nБ’б 4 @ЙЄGр|в HWŠЋ%R$,ч9к$ЃXT-+€•‚8=з4u§;…–4ЫБм=(оq /NDL;—n„5Љђ4‹‘‹1p$R$є}їЏAмtжЛG=b2„&ЧѕА€"E]DpЬpЇ FѓЊ€7ђ,|]03ь6šФžc|o}ЄЄІ&rдh\?ЏCˆ­‚ЌЙqQU fsФ!Єфi$rјЌщ4 <ЧЖtdБъээМzџцхЋWз"@:‘:Jв8-№iWШЛ…ЧcЫiсКйЕ*‘В/Nв<‡˜‡–n~Їа XHѕ{ƒQDOpч@ЦъŒ*Eš #С“ШХ ;ˆA?ˆаІІСђpьшфрУбыї_эПЎ‹<@$Mr§0Щr’СЃ{ќŠefИгЛœуЦН2BпuУ8›­V3@4Ё§нBUUžєqџД<ˆьg ЋF`э1˜Њж—цг†yы† šgЦgЏŽN^О9|ЛџК!"ЊзuШUУ0h…fБЉCФдpН!ѕCЉз˜жE`ќ–уХвњ>ВЅ|Їа[,Oѕ' +xВЌгДDMЦз ;BGg0Г%jwU†žяZТк/Р‡шЋ7‡GћЏŽŽоОo 8г:ž€ъgИ№исЖ б‰ЉŸ$\Ÿ‹2‹з“–Гд3АQЊњœНS DЖƒiAіл %$Є Џ ‚>+ДЩЊЪ0D˜Ыи№IГl§§ЇЯЛЛN>}юžBwkoьkЃ­kr IАљ~о:‚м‡Xc<ХХŒgHG&l<+sсTВxфлУънyUІО­ƒQЉN RfЈ™ЄZsyиb>4Eцnžœ}йл~њхŽ„_ 4H Plи‘ƒ–к Ь0Vѕ…0ЛHDП\ЪрО Міѓ )dьrLRA(BЫlШ,-B|/с3lлOgX 9ХžТMІ•šcкЇvwоŸ] xR>щы=?ˆЌ&D^m TсНС™€—0Yw“ IѕJ$L\. _“њYлН~IyёдlЊ"3 8ћ3d(†œКXЬsЌ.€Й‰#Œ/МLGv^№дlїxяеЧЫц„#vh˜Іу…q’$ёё&“ТіШuМЈ€ЬQDIБЇ(-И%дЧy†ХXкГі˜tЫЏ– bИџNI>yеђРsР'h4%™ёl–‹Š'1Иœž‰ОšgyЅїіеQIcEeЖ@9RšHјЅŒ гQHЂРъNЖ‚™žqgд™\­gUкЈNPUY@œ †IrœљЖ6ъ jPЭѓœ”дg0ƒЃЉ~ЃЂ(ШьЇƒKVфDф$ь ТИ [јб2qЖ7QэЂ_X‘MH} ?5ЌeXіsvNy7(ЊdŠеѓ\ ”xїf–GЖ­ѕ;Мт 1dPр т€§OI„q4GхХгН;UС<‹ыG1VeЅi[U‹<W‘.і/ћŠсЇy™…ИC%Уај 0)cл|NUфРё#ЄШ$Р"ˆър}Ё9ЊЁe17 Ars№PHЎ„‰xУDуT#*Bœ%ЉЕ7M”™—‰ЛЇf z=xT@Вjw/:КB”к7$†1›аО ž|–{ЯЛЃЛ>А"'-гOСьЪиЕLўі№šэЂ ВЁЧCiОщќ3nj)Њ9њвS%мОаШN&иjЇ <`ы“UhвјОN+К‚/L}MЄ)Рeг ˆШЛЮГ„VlwŠБ›р/џфГyžјЖ)дп_RЂ Ю ПMаОў}E|тЌAR“­Q№Іj†„‘^Y †€ЗG_…ЊШЖoЛЌХ4+ŠФбЄЅXЖї•жHфлЯЛG'лњb ДёћюPR@ш9Dгd kЎ‚л8Ix*+(L,7ˆAДЧ Q“.L €КФ0р5а?,€Ym žЃ~ a„ЦjЮ8tžЧ{4RЖ‚g6tnФЈИ!†ЖѕЬѓ‹ОlNЁ pЉЃБƒNЃйИИgq;–Р‹i’"ЫE^х%ъјОщˆ|Яѓ K&”d9˜ї™іУˆфД3Dд1h fУ t‚™ €йn1LxВЉ­ЋLŸ”ыe<їЄˆ5х йаFчŸы#ŽkŸœЗz}Š•<аbƒ`\f€ од‡Ш‰BNБ‚_n˜ў}t*!B6 ˜+^- Ы4ŒВ Ї"л>Оцqz#@ЄкЄйСlы™*ЭСч}[j…К9ЎƒVуу—ЧЕ!'h JЙуО `0Рј]`ё`ІEј&@ЅЩЭЋзuIƒЕE@ЊГнfw"=П0y Yцk?vКЌ ™9л9ЛІXAvг4ЯCє`w!  $aqт5bф >E#аѓ€L4h ™,™№Q§#@2`Њ†ТѓlїѓЋƒЯ^5№5р{ФQэЖ6|~Ёл0šЬгус˜ц%Iж=KVЅf(;4?Хpvц…ƒJР(EŽа* !ќZКмНУ !w$jю#щxIЮ/9HЛLѓи ЛлЧмПџвИЛlГ*( .№>?XуF3“Щp0Єy”гOІК$г!zjХ— )VƒРMH˜Ц =КН)Frяжz…’CЯ…H‚zЏˆAЩбyјaiHŸШ24uuдБХ.’SjІ…ћ>ЦбУBRЪѓйТмUК,RЛ>ж}‹ж4AoL к%E‚фэоfžbpЄGЗыЕЎdъŽчРTGИ2Gр*QЅA‡‚0uЉ9Іwq52T–uњМfa*?RsЪ+’тЉіJYL‘‡ИлP“ ФqbU c„`В~є ˜™'Sˆ‰žйПЏне)гАцўНDpžDщ,dЦРT$6?Љqїќ№М/JXаiSІТњ3NўгP М(–WXXД* aмьбКi^д^W ~v‚Л0TЂЁaAЦb›нAЃж‘= р СпB ŸкІ‹– BGрG4ŽЅЉqуф§a“%Y„OЙkі(дœњ‘r1Uїё*€ВjБNЎU›рiЊЂуВ`:KЩ„ЇАм]FNmsЬt|цОУЛž2Њ ьЃМЯfѓ6M<З@HРK№w2 бЋЃ{<Є*ёє y}~~ль~Є’Ќл^–е‘$8’йn‡…9Жќёs8хшЩ&23тLcюW™7јјЊсЄГюN:JЧ$ Я1iЩRЯrH–!Ў№ =,ЧУкбѕ-#ЪN`реОНЙo§а=.J5 CfY^ВђeЊCЧё‚Ђуe(V7+ђƒОB ю8ad_Є‹§Н;ј›|кyѕБ%КˆBаїmЧУO›•рA`|„жѕH’,ВЩ§УЕШ”Р4Џk}FіfЫ–‘AП!<ЫёŠФED”3РЈ P3›cг‰ВJLъhяXЃ4hМѓD+- <чpФ(Ў—чЋNи–,ЃЛ./куатЩ+їУwЯњ}ŒёbKMР пˆiЭЈHШ%`јxлrМ}‹gЅ+5^юяПМW=O9п?xs=VЂ р 2Ё Ё ќ”xZchЯjyžЎЕXбЎц№l1о€WUё™YШІM;*—ЙЋШtГ‹Фа§ўЈ? )Ш3мШ!BVŒлFи\ ж„›НН§ї}]эОл?и=ьrшwЪ“Y€ТРoS€ЄЧщ~s€х)<гъА‚…%:nHИфXсGdцuе4нlЖ€ŒBс['эСЈпl4яn;Д™(ИмoћOіДкд Э<‘oМойлл;йгƒННнз5|mŽзЮЪЬ61Эutћy™И7О9mR4'Rw]NВчКF;8д~DhЩP(_T @MО_Џ @3&ƒњѕеe‡•мДH!NlіЭм ­№ eQ8Ђ0:ойнлy7}илнйЁYЇ Бg^јю‘Ш†Ÿ(ŠШCoœмt‡усеЇЧй,5x–•MЫА~HhAзУВLKyjˆuя’ А§ћыЋ'B>Tр Тv‚Є˜ЏжU[€ю_эьmя7ћow@шУЭ№Z<дЪ=мѓѕШњ$Г| 3ЭіZ G3уЛ/w^‹f™žz"ЉІeш?ЄЌn†•M#`юˆвїЧ'–wуlŽSЯЖМДЌЋиrБ w|єbяХюM}{gћх5„}їg‹yъ`>тт№ђyGїуp’Рє[cN†%БeЎпш#ўБvМn ИнT"@ZсHЊ!Е>|ш2‚ЅАм  ž8–›B 爋<{ОНЛГ{yЗЛГГ§БУ0МdOёДw–y†щрХUxXаGс˜~­/№x@*а€iŒЌšjТфњЫm"ќ˜ѓр5 2S0˜˜0Nѓав$,!ПОѕp ЇEЛъКэ€ъ—Ыeb›4Ш~:f!k€ЄALй†э& j№ЩГLуД>OGм_ЭtV8џ3ЁXъ љ|žЧŽ" єЮ^ѕУ0Ÿч`TŽiYNR-–…KЊ­QhьƒМЇ— в74Ысщž UСT#Zva2H[–ЁnOš€Р  + ˜/S<јёў…# +Ь!3LdY`Э`†cФПВmHЄ“Њ‚дХ1MгKЋеbЊHЉˆbыхюЮіщЬїЋK_UЕœ^гrт* MTЃZcŒ%; vї‚h1_ЮO—ЂWЇ@*­\D  "7шM8ЄB7ё4sšЭ‹эа‰Šе:5БаSSqІvv^|Омйо~Ž ыћEСŽS;ИБ0-gБ%CHщЕhRтœe˜Gшx'>H§УBoq"ЁpŠ`–мЕž'RВfћQQхnУЊЮV•ЋЊКJšЙkpалЧ;/^Мэёœ(Ш*L ˆѓЙBћй,ї№шЎsн4#ыaРaE?ЉmiЪOЕ ŒћэлГГЫыыллZэтєf€МчcРЂ’*ЬФ…$`БZЅ6*49HœП€IўtОН§тUSрVPUŒ2@1xа9›Ї`…ЃЦЩqЋуЬ(sŽaабˆ2–Ъ=ЛtњVŸ‚tw2M Йр?ŸU‘;­*01rЂЏШRћѕпЖЗЗЯwЗ_ьœ exЌžPu/)Ыйл‘UЉ-АЃжнuc"Š&ž ОzмыS˜ё?ЩџHткzЋ;œау‹чmьЈy{[яŒhNƒ%ЏвtЖ‚ 4MRC кqЖѓb{ћo‡зћ/Ж_МОgАМ‡іZb9zЅ>˜5OїЛ/—:ŽЅЩ"ћkкY2 ш#МG>–MЉыhКЋѕЩ…Єw^ЭWUˆeDfЁ§v{{gчoGї %ЛŸ‚@L~aF*mW‹ ’E -{ №7%pдg_јћCТ­ C#–0š ]`F§ўА?˜9—Y.S—1zч;G;X,іЗЯнwлЛл;/oАVUоИ=gša•7FЎЁр͘zc@mŒoНўЁ‘ВW7pуЭsPh,`ГaE+й Gф4‚ЯЄіq PЧ}Ж _wп5Y дфtNї2r…hQФЎ†EZLЏж УМсИswўљшг—ЋzччдDа,№ћ˜e—9йбА Ћєаџt—нoB‡9‰у:ЇovwˆЬoыLяЬєіЮЧ&фiD­aЊsRƒА€ЄEФњЬо€DAф™ 5ъЕnЏЎ.ЏZXЯћЃЗЩРKfE9Ÿ‘’p2ˆР…@T”UЭ гoЊЌbZњяіwwwQЅпмwЬрѓ>~џўzЁЏэщЖЌ[/чЉ-ЁїhѕP~•tЎзЃD 'рg\оD1BЬ§Я _9†ІКWgbАДЩІфЦ№њ!ЗLЉ{ўDоС;{;аlЎіaowїрг]Њ!=^™%&Ьѓ 7ЦЂ=еТƒгƒ$IЕ8<ыHќПБЄћиŽ(HЄ.ЬˆРєЎ?п y|{…ЦJЕ‡y"ПљАюqgџнљШIБT­јЦчзћ;Лo?нRЂЊћоg\Э"rй1X ЬГхЧX}bтшгЄШуЇ„žШІлuК-Г,ђ,М“йkЖЧV* нуеовй=yw{їнљРˆбГЭ@ЏЪФ_Мнлйл}љЉ& vpZ.!џ… GЊч6ЯIЂ@‚пL­ŸkУ(†:К$Ш>DВЪЇxыNсzЭ.м„@N 1упmƒЬX4}вз“Љћ§VцTњм ˆНЛѓЊaE3М}ВѕдпяLАHЏJРќ’š PЕEцџXvјŸ„жзЦH:Б№яйЃіqнzѕбŒ+TщeїЂй#цœ“ЮW( жщ$О Щ’ЈXФA†yšрНu”'Ѕ]сеHв/вYIE>иІтЛ*rR0‹M!П>=>ЎR S~№vўŒ1‡WU™ Џ@&ЋŽхgEˆЬ6_’Й…'mЗŸАŠŒ;ђ(AŒ…xdіЩ­œвЇ'ђ6ЄМќ „ў ЋtГоў|ƒ1Nж4]Ш>Ћ5щЭ‡wx—р§`’ ‚ЌЩ_=‰Aњq……К#&w-ШћТё ™ў‡Ч'Ÿ _т7јнцG2ћ5iЏЊ–mЊ+йхzѓ1›.›dЂОЭ‘ч џq‘…ŽЉ1э­ГЯяNЧД‘ъбІ?~}zMx€™~ќŠп,Бм6IрЙVOЅЇ 4ѕ фžЈиŒMqїx§€эРp.сГ7пРЗdХПТЏ?рП‡ѕ2V я&[ЮЎ{1Рz№ЋѕцШb<ЌёѕOslWэCl?ЉVЋ2ƒ_в^‚`эY +:Њ%–З>}[Xli†+ ЯГіѕЯ?О>.Б• *СllНКhŒhїŽL?C{П>‘zм,йCЄуж@ЂЙб?ѕŒлKџ/c8,№ME цЫ,єМ .САˆі>mЌу˜ч'ьFЗ(ЇІФВJkыД7fTпеšќ› ЃV аD9ц€vi№жу фdЊфEh<Зиъџ ЕˆwЙ\@•…‡з‹dХАCˆКkдї+ўёчП§ёѕ+ =K‰ЃъlЋ=™(Ж†5ЦТўгkœ_\•'T&tr€і˜aЏнjдъ‰ЌйSOS~Э–Ѓšq#е‚Dї'"$’ЊЛЌѕŸ_7sѓќчŸ Хz9,DnѓДŽЖРЙ› 3vњV KвЄwуbШЪр˜‡ЄкcиК>9КŠ ‚Б_"ѓж@жЂВЈbKІ›5Z–H%3{€%†‰|§З?П>’ ЉЦАоœnQŒ ауNНCб Џљљrу”П-азЏТ3/БOйQэјУi_„мјWѕ •Е З hђЖ+Ђз†\ЫŸУ{$ Rƒм-2Сf*>mQ4HпЙЋ“юoœdeыЭ4?ЮX>3гЭ|KSDІsurйƒФ§ЩМ%+vф›Њ8ИэˆŠnлXх–?€œЈЮФ;у\ƒ(sXв—Бтќxk4ЁЉ~­жC™Љ Ѓ„+3aEfSЧM R T<­ђРTAь_K<Т+Кe(2usЫЊЊƒѕнqБzЁПn\Jк]љІюDйTуXІ{Мuнщї[Еі€ЂЦCпеэоp4ъ(!X|К,№Цз‹fёИЎВЄX”Юн>taXПСwКJz8ЊђзsД1š ЦЎQ[Ÿ{2ЂNі—€Ž!ирН„Сн—ГлVћўгЫ­:'aВ–-HЇz$B™кЪЄu…ядЂeУsŒ_ 9ўўh†iшА w,ЖУ™аВП&ЩЫcш2йЎŒ:—oЖ№0_ЗƒД$lыyьЙx^%ŒnёњБЌќЏ—“ЦЭ1хHVСнNxuŠB“Фе%žІXnв>мъђМŠЗВŠj;ЋSM”єАœ/Р№Є(s(`ћЂдПZVёдU6’‡а=U‘ƒхC’H_luAУ—”аtфG1Ђ6­e`ЪD‹ћœсќŸ*3šєХ*жИ#€Шящa^DƒX“4?ФPщlЕœjtНЩЩf<›GцЗ:є!§зzКП3&ŠAšл%Љ‰дјђuљœ­ЪѕЎ )[[Е­;ЦђY•Щb5ŸŠМ“ЬзыeъжЪŸП!ўŒ!шšТЛНёxаЁU?lž6‚˜№—•Єэ@ЏЫЊJgыzkшR”"ЋжЋYР v<X—‘%!!щГШž~nєTЧї]ƒ0ВœE є(+,№1'UЎ(еz‰Эђœ`кюї2˜§ь€p—€”!*ч‹х,T№„ЂŠТšѕБЈI-~ЦЁмЅнxЖX?-#MѓЫе<2ŽзtеШђ—н#њп‡dКqIИxЄ]ЪbЕ,@ЖjC mѓэкещE‡Wtк ƒаД”iT-зx5д‰ч‹ЬцЧЂ4LІgџcЊІ›aБєІ‹Ф 9 ЛкЌBFuюўглwзДЂыЬMЫ _nєм`Z`ŠU‘€=&К 9>щэ8ц?iЊћЂ1Х%ыхІљШŠ0Y#W‘EŽN_О{_у4]œAМkYс4­•”"Хyš|§ьєЌЅ™ЖNУ0Špd)Ж;Кя[Њ7Mтi€\mšŠ­LІ1ВЃйгz‰Эп Ф€ауfƒб xљъЏz(ыК*ѓ45Ёь5ТЈг9izБ^ЌХдЁoŽЯЏЯЎyгAТDМQ;MваV-9jbd AжP_YA7Meи‚В\Мўž{š$IlŸRЌ HM‘џ5qБ-Ы6Ь’ФNџW8F –Єлмjљ0K}ёіфВ~y1яGЖФБЂюFBы8ЫI’!ЗYьнёšiЩƒ‰›,П"В^eЖцЧR‚юфUЈpьѓш˜џOCдє LYРўЭМBѓг˜Р‚ЖП\u†эЛ›ъЧдгDzЬШ@hЭ‹’0p‘bgLѕ.Šщбьа'€еvЧgU'‚`ЮГ,KЗ^цБІйЩ,ѓMEyw”XСЉVЬЊШІЯя‡ЃNНоЃ‘‰ М›Lї)е0ЅZТŠЇ œ Ѓ3Є]BчцКУBТЦaўёщЁ$ …рIІГEЄ"3ї ІZR Rв*†xЁШВШСLЛ30DPŽUЈ­угzЗнj6лш5rКYЃ$•НnCюЅŒ;c5DЁ!*jЃ›ѓЋ.Ћй*kХKlaГЎыU9uНiŠнсcSб лпџlЦˆэМ#lГ аЛ€ГХ8О‚,яažxBэO'њ€a8vд('Cъ‡ŸышЩВy™eY•†О-Q§њUƒЁ97[> "_ЮЪвHгЧ2AhPŸмщ+:2…gіB|РюТ€>“і4[­›ЩэšчЙIЛ>№ІъАкl8ŽЪ7>НЏ‰ж3ЧŽЊиЕГŽл7Q•Цc7›?@Ой$ŒЊ<ъл 4шЧ iмС@цEь[Š8юї{ноh4ј™­ŽЂn˜dЄ 7ЂIlKњ“.ŸвЁрJУ#ё“^Г5сyXXn\џrкSUetzкъ]з%Ыs nЬш1$ˆŠk1ЊЗYIъ7”ЈBvС fhх 7ИЛЎѕIЃuљg"Ѓ ЊІу‡1’аn„ЦўбиD§ЩЙч]aа eЅ†э!Ы‚žАуЮ}}ЂЉbчгс]чђŒR5‰ю е0 ! %xmЏBъBP€г›ЃZЭ"u™ЕюZc^Vь.ѕBЗlvЁъ†ЎtŽцHD†/_љcжсwCœрIЛ9Ђ1œQУо“іъэЋЗоОП…ЕžАШlА Ж\Щ(˜ШQƒѓ~€зPžр† 0 ЉЊšaY?.uoы>dўSSu7­є“уYї^Sž0ЎwY˜AЎsSkA’0†№њIћш`woяхбё=‹{Љ'tG‚,)KБЂЈLЌ›‚FЯБю(`ЁУ Ю1’еј1ІЃђykŠЫš€Q4юk]F_—ЭQъ%šќКЊя5]•ыw&HњFЃйщ ƒ~ЛzѕMUa4b %ЁGƒ^ з]Ћнi^}ЛГГћzwч§бёВ$pT 4‰dUQлG#;]€ћ ЕO„` ƒqЅ9bEšШ?ЯYЗСІuIйZЗэЁ jюjёЌнуWя:™Їˆу+Š3ІvѓіІйnеk‡{л;ћя_яМ>W4ŽОяЈ,zG”@сOОєЭв.xqxЛToGHСŠNj5ѕUgžSPШBХq™’ЂРЇ(NTНŠ,f+ѓpчѕЙpHyРђШЧХoГбіяnОМкоys№n{џУiW€2Ыt Lт“1 МЉ{xF™AО~Nи`ТcFˆ^–Ый›/ 7“Ÿqy.)N щ;rЖ‡Žъ(€} ZŠІˆ?]ћДНП{ъ—ŽФгƒ!ДEуqПеRЃіХлW;Џо|џАНћі№шьЎ7фЫqL™Ѕш1ИaътЂ'кКБ~Рчп ъ|5/bзѕ7 ,ЯсббŒ +ŽЂ,вЄV   9%Eг•^IŸvпья7ђв†Џ]oЕ!;эЖn;4CЕїЗЗ_эСNяю;<Иэvк-жА]]Sдp4МНъёІзgю$?ŠM@ZWSˆ@BzfRљЩМ Х ЁЎЮђЩl:IH  ‰’]тa>8М%ї~wяѕћqUиВ0j6šЗWччWѕЭа­Џ; єЮЛЗ;{ЛG‡mpAmJw\SЁнЛЦm}ФЋžtD‘ћМ%qЂŸПBJ(аIГЂ<ї•'п{бВ5ФТМšV“4pMMU4№SфкpЙžпэНyѓсЭwqZ@l;іgЧwCЈйыЗ_Нк†mойлљx~жХШ!–m)н›Ы‹ы.#jžqѕfДDФјоФСg Fz‚-щ^§ъryТB{лДн0"R{ŽэFМф„$uЙžбяп|ўtp|rЉ- _џ 1ЅWэ`†зя^Нњ{owяе›ГZ‡GН,ї/NNo†Ш2fЗ?МЅ—їПHˆ^/ЁмЁŒœадЖњд&-V5РwІŸ!}СљCгЩйH—$.јƒЧGG——чіМBі7„Ъюvi–œ#сјфбй?jіY†f$Ufю..jэБ YЉ38ћќŽZ#ј3ž5кЂљФC+œЃўіЩBгЂ‚н:ФnRыу‘?ОЦM Ѓ~?И:>=?zџю&˜WEyшЭŽ{Ч;рА=†пжЈ]7с!ёHУUj|щ й@№2LтМœ-ч$‚cшН_Я*ыhћэзoоŸм˜ф„BCтXІ{ёщэоФё‹ўь’юїРјє_P.~п?М<=њz4šм?"J2ђЃHšжo7nярЭ6‰Эeэ)ІиоЊ5лэ!’Љ! xh‹ђљяИый4mяНћђљЫуcАGNwЄд‘ bЌŸ|кло{ѓЁ6Є$AgеNŠbZUхФkМyst}qvv!Эˆа гUˆe8”5TЏещ!іѓpD )H Ÿа˜Eѓр:ѕЫжœЧWe…20c——Њ”>~§іэ–w3ШN0s 3BŽК§і~wчУсћ“ЭЫ)d#„QЭРoN‚ЛЯŽЮnМхУ#Qд.О…ЩЉ"ѓ*Жюѕ›лf›хўыЇ #и]EЂЛWwn@Q,с|–ДˆєЯ@fZ9‡GѕŽ€Щ(+žЈJ`ў7Иј№zwїУїЗŸ.ЛЌЂh†$ ђxI:цjїњјћёЗ#fКќёѓ~s3Яяu q {wЕгoGЇ5№яOˆуŠюGйNg v…Ц Bs,/:S”ѓYхз.G"’э‚ЭР?xZC㹆.П|њєvwВщЇ}xE†у…д#H)]$ž.Rѕу“Fˆєї+/ š= хMуллзHЮіўќфЭ˜тїУwŸОзк§1ќQYqaIT]‹9иJД"~Й,, r;Єl…Ё\•˜Сjџ:РžІšTђ№В4ЄeFЪ]фT­iжАДн^ЬfžШ0fY ляєzэЦЩСgдцз>ОFКСнїяї_яНў№љысiоZГ,+Š)”œmИaˆа‹ТъQDq7 ѕ>U3эПN*7Ё-а0S'‚CАтЈБ€ДєH‘D”w{ОШ]v?/&зhЂ“ъї[—ЏwпМоОПППЗџfяЭћO_NЛšQpХŠJЛO#:јуzБiƒZ" Л„пХЛEг-H0uФˆЖџ2AлъbdY6д S'п…4$œЮIќ w{КXDqХ.Яhž‰ь№њЈШюЮ.ўrП;МИыї4њрV_IЪХдр z\“TiMZ„ЊФГёX‰Ч3е p.Тu]dрў‹B4Т‰ЌЃЖ›gcз‹jЬ‘—ўЙ Њb2Щ?ŒUк$Xщ]­ин†Њewooџ§Х€GPHгвj$Ч№ŠрQУЩђ~C#Ж\мqVN’аГ@-Рž"dЌђ,ѕѓЏіЂR№*њ‰щŒЧŒ‡фХŠ <:Ј*ф ' BЯЇe^фIХ‘я!o7љcЃя•юН}ѓњэЛ§wW ЁЭ4ђ4’|RM‹|2Ч{&ВЯ$џ_^ТЄЇIšцIлГi8–ѓ…оТи$2ƒnчъєцЎ3de$BФЖši•Ї Ђм‚ѓБсCЯЂ(„ПМн@L‘П}цїўЭ‡/яПdBšdƒЋŽR ВиjЖ ќ]ш;–фaУЃИТуƒ К(2оуyц_Zenиыѕњ}Ш0mб7…жuё„бчиФ yt‘%IGЁяи&!…хјЮ—зŸППнџєщѓЇ+AR?IГ“ ВяЎШ)%V›ŒЄ3k<ИСА П(гъгиЕМП*єˆє)N3!tЫѕУC!X‹e(Њ•LaC– в ŸQф)Ъ fcbЙ$rЬрћ›Я‡Л{П|љr+сDИЊЭ,Я'јю о†ЭЯгgШзY;Ё&Ц2mбћгўЋBoс89[У Ърs0NB[—yVВ|УdГ—˜=!cЂяy`‡ gŠЎоююО?8џzєzџ№ћс-‡НЊМГ‰лgˆЏОоrЯЇАЊмW!?Фуo0AЙ ‚›M §(Ы‰і.П*XцIZTU[2d‰*Ё~_.Б- ЉРСыѓOЊЖ†КЭgрЭ•ЏЁ+<ныаŠщЦЪgЎ*ШV\AŸ\YšЂ‚€†LdТн8ќxtrкА:6tУv=/JHC6$b™ GdkКŸ•е$0РXXХВ)і§b =/"Ч2ЬЇœ!ŒL'Ў@dлШJЉn§ЊХЖ—TшђmiФшA1Ћ*(а‹<Ї—@„ё$ОФsAфы_ŽN.†"Љ„nйрА{Ѕ+!Q)ЏцгЬzV­@Љ!0АВI6єЫ§2ёч)Г=УёИUEЂ$ŽЅ{эbЙ6A‚ЧЗљЅкPИЋ ‘:M0[vrч* *vxб#Љ:^Ѓ€ЦIJtїzБзW††мэт˜ HЧЅ,-ъN˜ЂѕЯˆї МЇАЊŽК„Bœœ™ 3xŸ…nŒ4Špl„@ ж`г&jˆ Љ7ŸЎ)|=xiЧsQ9аKWшy0€Фз…ы†ЈЛ  х$І2’У`(_BхиOšq<ПўнЖIžъј дЕUЙЖмИсd˘љlЮ*HЧя;№ВЄЕПмIъ†юx>DЗ,…7вxш~>wњєVвЌ8ЏPЏM]шTјAˆСaОZЭrЯ1ž є–тйž‡=`‰ с%NŽuiшZЪнз NВЫiЯ@= вAЁ#фБЖАМ„РhŒЮЊЈ‘Ч…М#k…п–NрХ€†Tхl9БeњђjЌ#РsфЁ‰}Є№Kc$ЋїƒаBg eХ4ЧnД‰­k!ш+СЇƒ}ˆЎkщzџzЈшv"ЉЬЅIE ъ†јNВ‰УCЖЮёG]ЕХбн]ŸStœ6Фg"ШP№жx<ыTTгѕSdУ‘…akРђЂ Лi•ЧhˆO0СS(ЫбŸ„80bIЭЋ[“ЅЧH цA %žЅzнјЧVач mУЯШйЩr=ЕФСэсkA6[pДеФїaЏСа<+ЁШxDa|ŠЭQрПИnkl†xІCЊTN1UЉ‹…LˆоЃ(“PEžоžнP‚b™PЩћэцsфнmк z1иЫl~_ъ|ћj т‰7д{Y‡ 0А… СрЖ"”yŠJ‚ЕWЊн|яКy ЗuжУЬъЌб™{№чёдЃ,СЉлК лк=?ˆВщ;иФЯŽZЯ–ђCO4еЪWЅ!ЛД Њ63ЧGЊiˆ[†шКсoP?`ЋS§ђЭыf )‰[џvЫZ1$T$=AЙ3ЧrБDGXVa–KШpлQдуIhj`GЪГњлp Іe }АnбH—S{ге aб*+&Ш=…ШDh0EМ‰­ІЉ=њВЗwц@"5пдi=„Z ђbЋ)–žAOГBhљš 0З NжуY;І RKЯў`EЊy}ЧˆЊWЎg>ђ%AњnсxAѓ’r‚ћ 5$$TбtŠ. olЙѕvwяуШїjяЭЗ;VO!uХ@Q(‚bЌВXpяYhЫЂjр§)пЉS‚ 5чДР,й™Xёy„W=ˆ~Ісd‹e€ањvŸс” ("xaЈW‚ \5^!`ZWЛ{ћ{ЇЂыА{ћћЧоHrШ№рeT)8фCƒ‡u“2ѕ$vЬЄ šЏDHВѕ}йќЉЯš™J$yЮч›FЎўec0ъпœŸ_ДС”‰‡Џ-бMsь`œO ФОиллн~лдЄкыН§wЗ я`зФ)(]r, Ÿœ@‘ШЛЭ88tXA‰РWхрI Ђ=Й‡ —ЌЉЖс]юhU;Й1у^ѓъф[m,:Y™“}v_'_‘ЇY ЕHдcwїЛ@€є{oЎЧŒFRМйВp-ЈЭ!ѕQ;ŠарљоЩЗл>=е[œ ХPЬšВ )C‹њsP]ѓГ6Иy†ТєЛ#A‚Щєъ]AДГђЕиŽ_р•зr–††( wwww>Œ†яс?{я› Ѓ {™NГOSАђР&ђаъњКеюїnЏQ?ЉќЊK/Щ еy†аY7уr^MR/@IоЎCЉ‡ГѕљЃr№y2?l4лƒ1ЫŒ‡њеUЄ  Yn<СФŽг<ѓ 0x іTЂПяьэl;ло~Е{ ѕšBc”a[ ЩG<e&Югжлиф­“*„-б$uѕ~F8ХС/PиТ6E~Po GУон]g0є;ЭкщёбE—SŸмЃўŸ—ЌCР-ёМ ёr<‚™ЁьЇ–cЧœ”„j>"-ЮоagЈTbы=ЈЩіЋ7g}N }::"eaЫуЖуЁю_іЛуњˆ‰Л;ЏПжIwш­?Ч‘тх<lpиКђ 1ЈЉ~З]Џпо EУВm§YiщЏ5PT''жГZЬЋШT%№ІыЋ.ИS оOЁАYЎюЇžХ\~yƒ% &Єлo/Uђбљ‡}ќТЛУЋ‹ўŒ4ЭCE5я(AЦ><МХгUœ††7ЂYAš@тѕBoёЊ™b/оb Єyx–rўъ-2d• vпъў~™ПюcsьvlО>И3R<5ШypёyОЖїі[ƒ7­˜4<.fЁЬ: ГЊ™^Œ‡RиP„їЄA )Jђ›№FМfA.е4N?M!ƒяЦНVŸŽ—œє­зЋ№œД<юBYјњkSŽ+2ЕˆЭ9‰жљŽЏ`яЭ‰MрЧрРZЌtŸР8э0лш_…УmxЌ:‰lэї€ЄнNАСЦŸЌЎmVЦЎшCЃ!iBї32RОšЉŸ ФкйллпџвЂћЫФЙСпЙ=<~‹-Г7F8{ЁчЫLщ.оPИбМš‘Йtx™ш‰ЌпЄјІPБШ5@МjMцgP2‚ФO4fTсЬЊтоэ лићr+'Sl0[Ж.Ў‰zЖїњн1Ю7#œ›Е$пУ–вхzUј†i'ЫFЭІЙ­pЃўˆoсњ 8{‘Nfѓiцў{Bo ]aSFМšbЛ%6\ЉU™PМ ”ЫЬїмЧЭ""“љ#2J@ Іy\-Xц‘Л:TісrLWќъa‘aлPh™П)єжpLюъ]Zђїї›О,QЏeЮіdIPЦІБчFSl™п =Ќжџмыхfм‹|e іЖ РB№2ƒR>ЪЪщ|ѕ№јуёОМŒ-г BзќаВYН~ЗYЋEиG|‡ОašуА7ЄѕЄЁЄž•ГК~и`oмP2ИHцНVЄ…ПЗ‘agq`~ёѓчX№ЇsЈueн2Œп‡И†нњMЗЪ{REфZbOMQ‘т‚кЕ~x| њГЄCАaOжќ0ТЯхf&p:ѕ€№‘k"ќуиу?@jx‡Ы@ѕ†cAў}p{(d9ЊUыђF№ЏDА‡ddЄїžР=>Ќ7трw@о8а!мœŽ99Ф^о%й~„ш$ЯFоќЮчqUD[јѕBЇљ$aXkrzNФz$ыa#тўx$†п§Цˆ&аЕ­O_nЦœ‘–E1E-z@›РпB„~РВ,blю‚*s2X':GП f„Z]aюю8=]ЁёгˆмИUфЃЩkўёtѓё~ЙHQ3nЗозGc`Rьи]џњУ›—Г†?ЙŠMlАЖŠХ4афg\ˆџ/™/’zMFO—##NЅEq=ТЧDfxйТ<#Зоžw)ЮMcЧP­„им/эњѕЦцЖ"PƒСp„@|nŠ-…Њє"…8&њИЫZ№uY'Y‰Гd†еƒ<СЯ?џёѓ1CedЩ#r[§1kј–Ьб4gЈжПžЅ'JЖє5iмkпеoFЕТ<Ÿє"р№‚nКŽЬЉQU†6žшЄŸ3…pGdоx€ŸФkAж=MLчжЖZЋZ ЯR#†3ЩT4XќцŸ›Wџ[и8С8ю7ЯŽkCХrCWћГЅџМ џ(3WуЦ8ШUЎ$;SќTђс?~ќу'ˆе|š›<‹2n  tН+9љlОМйixоџx(LFњ—‡Ї=Ф%Q_œгlHг'Шаw–у_†XЛћјЫ аФл-чБФАTЏv№y‹bд›4 ЅD!|ыУЦбнЛ€-џљИШ“UWЦ“г6/+Ъ QŒ#ЮѓФR™њMя]ис`Ќ%ыŸ?7ўУУ?~lа–ЉТБ§Цљ‡O[ УБTѓvШrPVщv<_ЏрВШ‹хБнїs(-LM7W!ѓbЈЮ8у›w{5РЊN=•Нђёр2~љmјxДТyUЭ ,oи:ѕ ЧƒVГЧp<*Ѕљхъ—Я|Ј,UІ TЇГœ„Ийђ‹рёH&Ђђг.†ІcšцLж?H4y ј>њaU@˜ˆђI ђмИ}ВЕuSЏ7СƒрД+/*nyПq5їЉ&‰Њ?§Aт ˆ}?#•…њЂŒLдљ|ѓЈЦ)šaЇ^Џ@иѕВifРІ~@О#K%Ђ,џСдЗЖОœжћc†хЩИтVЋ_Rпg:(О.яUQ,ю‚ТDОў›Ѕс],7Ќ_5ЦЊюІxбL?—Љыј9|&ъЧ?—,АcNP(4yvэыMgHбxД ъ-ћГ5ёœ\уiСHгФГ§Щђё~^ЦЮK k€˜]q§е ќм"1Сѓщ!И>ЂЫPсЦ4УА’сzdFхdF\бpHqjJRozНЈKeЧ‚•OSGSp vqT{y6 #Ђg#юќXO\EDФ‚` ц„гЇЙ%!ДбˆbeSУIфло`и‡ПЛ.ХлУd^-ЊIlыђhЈxyш‚`ЦUшъпР[еЂ•ЄZ…—ќуОєu ”uЬ[1ЎЧ‡Yba,Єњ§Б$Ѓа7эnЗнiп5нБ“DbјjV0qO0“*5љБhЇЙѓ7ь3ЈЕІ“&{<Ђxјy_A(“aиЧ<У"ФpPxfдbккКnД[wЭfЃошГfЕIЈ!ФОeШŒ„vOrГТWXAs<ѓ/.?iсЩ›iћ)”ВАЋБЅk 4”Ќђ‘$ wЬHšЦ)jŒ0зЗЦэЭЭэMs$†X`$КŸхIј–&Жыc-(2'щР‹ў]LKcARнЄ‚В9u Mщf“U§хњqž%љd’€‰мЈ]?пкКЊ]^_^жjЕжX›mmп\œ_ž_еЛИб’-x9xЬ-в-HьЬ$GT —I§џЛEЩІWф‰ЈBѓДЮ*ІŸN–X<ЮlaI@МžЎ}нк:Й­еnэ>-‡‹ЂвX‡C ‰Hиуxв“(xfуЯVW6œ *(CО;КЁсAЯ0ЁџyŸ(ь 7ъwЛƒс u ;}нjuzCŠ‘нbMЂ ЉК— Фтєr[`jПSљ—gX>ђЧuПŸSpzžу=@HœЙ;ъЗЎЯЏыЭыУŠт7цwЫ,ГI’W‹ѕjтAъбoТЯК+G№/`У“q$г ЗОї!уѓ=ЫєЪЌJG!“+ч7ЗW__om YHю /ЎШTm К Ъ4[Э#S)њŽ•дчuВ=y ІЅУ Н• ‚qkBfќEРŒ’8Тйm4[Э“w[[ /kМс‰Aщˆc^1ƒ|AHйX<–щ@Љђ0п_#гАGі—›cЈlЇБ ўŽŽњЗ I‚ь$х|з3OнtйNЊE9Oюfiž§зВšr8,DQ>#Lh‹?ч)Йh˜о1Мт“сѓхz™j|ћ+"кЙЩt њёobud ЫE&JФЬ@ž"Ј~ќ|˜чxT+KЬш”'8˜_.ж3H1юсIUУЯ'р1џMДБ=ьИJsв]с˜\2™AVВ(bЯвО†ђšућ^”M[f;Pu$е зx2TтK­Бa;іяL&EКp€х§ВŒ@(Љ‰;­˜Іiћ˜eŽТс9НвЖ_тњЙkЄл–эЧ8љ™%!6ЧЫVPЬц8Q-ї@Ї7#и6vв#Niц`1;њћТў7K0lлv§ NтШU„1ЭAˆKВФгеbW`Ы—Љk*ПPaЧЂђќс›Y}^EDJС™Aкгqm(mЯi4+Hвимяг1Юг€ъ"УЃ!ai+jІёOОœSгq\]ЪПŸ-ј?/JдMЫбu™Ї†дј?Б$ aЏtТ;§Зqзў7Ћ; Ž<'џх;+€5"8њ/ иyQдџЪТДHУўG0`?eqТџu"џYжŸѕg§YжŸѕg§YжŸѕg§YжŸѕg§YжŸѕg§YжŸѕg§YжŸѕ2kЬАђs€Њў ‹рcKƒ­‘Š€4iўok›љыKД„e3и‘€уіYž”№џmяч uмЧIѓџ!Э RЄШ5OЄЦ˜e"ћЁ§kЛуб$ŽРAњТVџХЦožЛгвиЗ MЗкœГ2дX5J\sГз^{рц™/ЉaVІ<ж|їЉPи/ЛЦШ˜3hодNNFV8™чіxьЄЉk™Є#ЁеjqžXМ—ˆО$yiyжПQlFж ]сЦcКq|z~мд’jžkŒž&ОcлЄ'Ѕ]kXY•‚3YЬ OвЃjQхiјї5ІџŸVw4QcN1mЁбЄ‡С/цлˆ2SД=змкjn5Юл^:ЭtСЉV‹LtК\ЬЫ8ј-пY§A„[єTš3,Mѓт(›Dєъ9 }}Х„љ,7Do~?d9˜ ЪBXў{і™vщЮHДГм—XУ‹Ђqѓfe1uбqœожэж5х€Ю”О/V3_дУч\ЇiьўЋ ‘xЬ"IЛŒа|el1œUШкV•Eт{lSt=н:пъ;I^VUЋѕдЭЁvVeфйІє/u~Ђm#^›…`ŽЎŸЯ —Пc|BDX•YИzї–5mwМѕ}`ЅyЧХЌš­*Gs'SЅžЎЊ’Рќыš ‡@з†q^љЄ\,r›jaБD€˜,єLqPЛa-ЧЃЖnэtGжт Ч‚g‘”я1ё5Yю_ЕйœэФI^m(№Oqщ‰Ќ•Э–ѓY•…–8К9Йьы…ŒЗИ|ДдцЃёxVEOWїЫмЧcA–$U–^f"џџИ$гЩІѓѕмБ1юЙяХг%reЇ_?ў|и’Vsд4г$vњзR‚ј\ e1ПП{ьhVBЈbщ_dЇ оу`ћъсАoOKФзЎŠ"u•ЛЏяЮ8Ыu=Ггѕв44šW*h5ТТрь№УCiЫ8Ц('љЙЈЭO\ŒюMргgEQЭl!FНhV“ЬЗФыї—’у:Ўд‡IйSЪ3l"“PS$вУQD"”џіФЯ5{В•,W3Є ›L‘ЧЩбй!•U`™§/Ч`†–;ОТxКтMMD2P9БЊbG–@K Ÿ§HЖLf йЩbƒиQє{‹Ђ“ЇžфQfџлQO6-Ѓ)‡Aypr+ћqБXсxпJ]с В(АЬx№B˜џЭj8УГT^Бтйj5/S?Ф§CТРђ9)Дh;WЏ5лcYSš'œя%гё' 9ШцHдGРbV3H]eY`Ц4УёвпйбЩHВюЧЎ.*fоу~žGiŘLТ`ЬнмRTПеЄ#ЪBэLім$ ўфнс#Jнa>жѓийQП?bБлњяЋ*yУ0§"sЄЁ`xдВЬб' Ў’ŒzцИ~нъ s2№ єEУѕиhuxђ­6ду GŠ—_у~kLПгЇЦМЄƒF§-ЃЊ[8ck!dslP5pzЪДžџ‚›MAfpнf—W yX(VžЖLЊG“iжFš•(>’ PЦ23Јf‹цQ3\(ў"hІ—–ѓiЈбОlјšд/rF9ђ ЖзhГ:в?YRЇЯ НЃ<€c ƒчњб9ЗŠj‰L”А ‹QEтј(rЬПЅ\0Ќ -!‹ЫF„•dŽсpCЁ9-Oд›]ZБ,гВЄњхPрћЇ Eз~ЬjnхYь)V2Љц`я~HЌс@ SІЖСО6шYЂхDњ2ѕyІ"aІИ$,ЋH?h Џj=F6Žr|}xMёlћМ-Њ5,?$шќRG‰ВrЮaІ–№vќ8ЩђйВД5a_ZChгЯЪi™ч%2Њ–БcXa…(gЫ5 =‰lњњЊOІ0,ƒЛ=:ЙЃ˜~эВ+*T›Жwнї,сцŒAxпеAНТїDјkярЖ Sз^XjФ@@шгŸ Fм, ‚dЖњХQ<+рХ7ЮК’fСџеiмu‡ЃЦy}(KЖ‚рЭЎЅвЭгяuЮŽ&S№;+HYpЌŸАЛуO№ѓ…m‡ІFЎЦRcЩNg ‹6lEИ•clъЄЦ)„„ЭВu…ЅFUПьђ2лbbk%{§ќjh@ъі{џ Аы|P5I|лT_8 lЫаФaЃоe$+Ch"‚€Gіy9ЭЁFНњк‘5$U7С] Kп^вš:Оa<зw5S-xœqэb`Х“Х#AQћ‘7‰ўZScіE}ШˆeFэZ­9`$Х*Ђи§ •*Ќ ”*нЏ—МЊЋP‹€›ЖФ›ЗЂiёw"m@E)9ШtІ4Џh'ž‚ПпО­‰­ЋŠ0ь Јрў†ГОzWЭ_муFрШ•[Хž18ЛHŠЊ№,ЦЧsЈЌзжlGюk Я|Ї=-ЄХ ѕЛ:ях‹‡‡ежm8і~sе•L4ыХdра,MгУЛ.Сšх?ц зœežоЛМ _=RHЎЎТВ]гБе‘ŽDнЮ /Œƒ@ЛkЪqБ~œ\ХEl*ьАqq5RM/ ѕЅŽЫ(ЄX’DШ$A…ЊNЫ : Ž 8Мei­яЗрd1ёБ‘Jо(t-Ѓл3OgL|гP0‡ ‰§@ЊЗЭl/ q›&ŽТію-J{фс’љ—)dВŠЈу2Ђuƒ7•E%^H”ћХjQФVџш‚Цэž`Bx <зE "№НžсвХ!|С•YХё“0№И:M–˜ƒ,B…—84D\Я)™{ ъ–ЊкO8muœ=U%5\ Й{PŽдчЮ/)žы]ВHvЙКЊ–иЦ GF0eЈ|WбŠщХЁяв+‚?!д8VVT>™MMTžЩ]ѕ_–Є›Qм™$r˜ІЎ(!BЁ!лВЕЦY_р‡W‡W4и ћˆfФhОgККŸNв4%XаЁ# њЌЄКQšc%™>Ќ—ЋD%LAМdК(ёО_ ФP†сч3<›ѕ 9ЌЉЋzD№Жp€=u™ѓУŽnN/юz4Џй!JЭ yУ6К]г‹ жВУб]і;=|H JAБ^Языв‘EYЗ YІЊ›КёЉЕfи˜™Э+§E oK7“9К;<Є Ежхp<Ј_е;Н^П7V02%ЊеMЙоЕ<<ДшNІ9ВM УлЃяMЩіB_Жј!E]ЭBP ЫƒЂЖљжџЂёЉ‹6Ь Ъ&еlއЁP…@‚яM]rynЎкгktИhЊлhЎЏBjіЉЮICsLЖCыЩДЪ"ЯБЅоХЗЏЧ]Э YKчšРхMЧ в ќђІиъўю^ЫКјШцŠ”кГ^ГчЦеbљАЁЇБвМfD‘ЅiЈšxžщ6iУ1Id†7пОœS пЇuМ†™$ЁчjуnЛuYуlа%‚ЈИ„5‡š)зЫYŽд Вќ›Iц№@ЉWТOžƒи ЈЁ__-&žToŠВ$€щIŠ$)м +˜ ј–ІєПžм X-,сOyъyІШБуnƒ1НР§b‰1‚*ђУ# ёМ@В‚ў{9jG… J&Я‡НЦZ >—Ш ХlЙќMќ72@H МW™"ЁхЪшћс—OЗМцe‘„qžaІ'Kгу,згy'G§ј…ш‹еO‰Љ/a —Ип;”ь Ёа1BъX:ЦОМŸƒВЕŽ$k lЁЈиŽ&‰\Џvе–MCnєtЩЖЁzyьY вЃ!šуhœ•ƒ ZnqсUЄ к–ІŠѕp<ќ­г‚bФ в ,ы т-fxˆŠ8($УІЏ:ФK 2% ДYХq§є†г5сієіњДЋКqh ŒІRЫРл8ШЉ,…ж'Ге§{x9O‘Ѕ\“ъЎйщг,' тяˆЭišх'“сvзтŸ$gЙпћ}œG’QC‘ЕДR§AЛЧЉ*urможEЫRЦ}ЮIC[`АjSе4Ф‘’” t›ˆ3œ2Bъqуюu‹†wІшЮCшюџЫо{hЧu$йЂќŽ{EZ‘ €№ОМ9о{яMђЈўњ‘%ЭšyгoЎ’ня­ХTї’DPqђDFьШŒм[аАюsP[ћOї ј}ЙИзЮemTШg0еJuŠfYњњу‡глуУ@CVіВ,Fрі6ŠЕъ†eˆCH/Ы{BL=Я•Œ9^вљьёоМn9пољ 4О&вДHъЅлќzxДГѕrћеЮжы'^†PюŽ!B­ІЊ&,ХсiOДГщ§Хpw›L9ЎJЈэѓ5Йtѕ9^-iNRСЃCmrJEцY^ І "АŽŽЗvЗ|Р–тА‡"Ў",УўэТз§Мѕ~Й§aџЫхж(dw[CљMHїЊpг5ЯЯШL/jЗ2ЩЁЈ%Йy PрщЂшрeI’ерУ‹:іQ€ Т>НТрОмйнНЩ*Gz­>О4Mѕ{ ˜Я\ПнzљлжюЮжoя?žCXa<д<Š%ž}ичзЅМЧ5yiK’ Ї/Qр]1-RGy:ˆЌCxvL'ЬрMЋєф|н§№снчЏЇb3‰QЖH%vШHВШvі^‚б;Џ^эюnянQ‚.хЁ4ъvZнфщ(5Ўо~‚™^ЎўCКaо„Dсв)5ІHљЯHЏч(јaд.™ (СrFL4ˆЏƒГ7‡G>§x MЇ“2'I,‹ОyїrыхЮызЛ;;[яЎixr‰1tчђъЎjQЎїЮ?~rя|)TИёлЪ’ˆЊи#ЈК­=9СŒYШcй`Z`eё€щ ]Є–е*Нzwrіѕыс‡7_ѕйlкTElI<-азя^О|ЙѓіЭіжЋ7{-т3лiij4Є8ЂfЮ_юxпюЯмCŠё3iš“”gЄђСxиpКщХYђ'ї8Ш›XbUоzѕхшшјЫяЏ_Ÿ( _Ћ ЌCціЭЫ­пЖww_:k рOепѕy м€ž_Єƒƒƒ§§УлфўЯЉ^.šз9фn˜cЫ2œЄыOэb9э FEЃѓfN˜—DР‡œЯТZ,иwЛ_ŽОюџўњеЛ!Њ\OЊТ•Y#оkдлкzuдgQ^•Љоц[гM7*&ЩрѓЇ/ŸїКюB>€Эы‰љ]S$ІsнP4„z–Ђ!шˆOюЙЛCб.гёт5.H@­ZРГхzжxЇ/?їxћБ‹J”MUЅPJ"}‰к>ллК<ъЊшЂQрйOЁ˜hš Нїх№ЫЇНƒqѓ№ЅЌж),‘ЕЏNŽЎ;§! S\Ъ€Ÿj4TˆМ‚рЫ‚€@™ЗY‡ЈЂ:ƒbkšЖ_œ|zѓіѓYT%д‚UX(з:xЗ‹:JЙ –J рЊ”ЪvoоэŸ=јќEšп?т‘Ир.Bё{sz|~}  і‡Ѓgд/З€Ѕ‘бŒєe˜PЃт+[м/ІЕіqїѓсЧw‡ГЊkbВыЃЦІ0О9|ЛЕћю˜Av~T_гМДš §$Оsps}r|rь-ˆOЃ†C€|ДЊ.Rэыѓѓ‹›vЏ?t{ћ$ЃGƒўххѕх]З7€lљ&Kжн 5ž0TЯVыižОџђyяhфф@9iф №TzsЙџfў[O4j:ŽƒЩdЉжqџї7ŸЮ/?vЋе7В_ƒ1ДТmVР7*’ќ^]œ_З{Šв^$rРвНЛЃ“лі”š#ЯфA ?Ё@їtЖЇЮn?ŸžнPv’ІTмšŒDs ‰сўћзлoїоQКjљМDэnx“BЙќќёыљСЛЏЮzљјxПыХЄЦUI TK­ыЋЋЮ€…,ћ„QAEuu~x~міњPУв‡ /)^3УiЦаЉІД:”ц"ЫЉE€Ьwћ€š:'_ОюэnooН=lЃHъ§…IY#яb“jЃ›гГЃУсtНi%К'bMu™gIЙJеБУVyŠЎ=!z№:™ѕ!ЉВ€ЭИ3‚ЕĘЁv4ЂрZ‡Ѕ"л&ЊЪ" "™:ўбьн›“жсыэ—ЛŸ>~эЂ_ыPЇkA™Ц Šўй:гЙщКвя%9a_6iˆ:гaрaИ†C8ЈђуяWŒЉ"Ў‡" ы>lpаt+Ќy`yfЯgБHEЯХђecEІѕх T†[;Ÿіпnoџіъ`я§оўйеѕm—UžPˆ#Q!Œc!Уƒl8#‚K“дї”Kі=тлКЪа ВІš{ЎQЃSвHХXWУ%Њš@є@яи &јЧв€pfчЁ!r4УвƒлƒЗЈ'Зѕъ§kЌ\^Пк}ЁяэћŸЮЦ(„Žх–Ў{ЉNQ&61lN"IПl —.nл{(КnBБЋ;Ўч§§нjпŠъžКbіу! Е]ЃЅгiг  5Ц‘&4u^‹"…vЋлКЛ<9ќєьмнокzЙћfА)ќЫЋп?}Й xВЃ иA‡j„zLы0ЦЃ:‹|зБMгДНKSј˜wзўлw"$ G {””EžСђпЫ&Јj‡jзdВqГsК№V§(/% S?­б!fP“;:‰Ъ­9‘klš фВ4…Фz(‚­cМ|їънЇзЏоПџ§эЇ1,hгvн0N20ЛœLg( ѓ@ŒFчXNзNЄT\™?ˆ€‰k–$ќmЃЩlЃЬ/МзЦщДXЃŒGВWBŽAї@ЩеЪОg˜ШСhм=‚ТВ§сѕлНнЗяоН§Тh*юyyhtV@:‡]19t lBЬC? ­MФhTM[N|чУђМПя0hDЄ№MyвЊ ьaK\SWшg…u3И“љДЉѓ +uЧЖ-дВ…"ёфїНƒ7ЏоОџ§н  SгЬDId‚Ц‘Ц<м6Ц"V›Љ„тl^`,(FХР§§>йrЂЌ&бmZзЦй€СŠ7§МiŠТ‚јДР;(eFуA4@Iл_іоН§јёУЇЖЌш–у:Ў&ШžмЗ X“nЯy“љК(@-J–: (Ћeс2УŠ)=A–Оg8!jž6јъШ„љ ‰ :ЌЩЯ2БЩ'ЊјšAќ@Ѓ-„;и5Я\|љњёнчяЯy”4Т™і‚(-QoœXFt83Ќ0'‰ @@VЭ,pl]Ю3eш'Е$0–—ЮІUŽЧ†Ј№дIvyQб€s›:€Ї91Sœh0:$>mіQŸ|9ќx8R —3Š‹QVX  Ђ"nїЖ ‚оfйP9ˆ*ОCмZЬ—ї‹2pѓi‡ћМхчШP€_LМ#1uЎo)У%Н—ulJœъ•0ݘKX_x 8 Л+P~wOŽї;Б›тa$јt–8 P\ЭЋХr–;КjBќœVБe(<'›nc X­Э т‘ћ”§^СіЈъС%ш~Ї}{}}qrХX€Šы)NДС T7ЃgxŠ›Cн’сZФw‚АЏТ(ЧЩзa– бќРnpdЎЫУŒ8iQgјЉ&Л AЄ)ЊY(Т№ќ’1’|йq6”uл€$–ЯЕя>эƒ"чЫЎэТtKВхИЬ,ЎлsЧТЩ4OтИBр‘fФ="ь1ёIjИ!Ž%]ЧBШC€З™цчJx)E9Љ’tвdІ(єO.(Э„Ђ ]Kм\22„MУKšEИOЛт06 %Нƒbz(…F–РtюFxtЏZQ P4z@ЮВBmvдІСT\p$Z/ЬcшЈDS Щу иŒpЙœж* §ЋЋЛўэŠчRкЧmNUн'ѓђЉFПPm@:иi…‹“0`OіOЧ€XM;H3ˆи$8™ьQbЅУ:єНє”йЖЬˆˆоv8˜a%Bаƒ F7“  :ѓQ`зwчПŸАЈСƒ%9yEˆЊ;a1"р‰]zcЧ‚rоwСC|XJОб§ђёЅ EР[žеˆ§Ы9DСя%`я{ лu^Ц Й< $СКBz™W№МАЊI‘Кš$r K}эЊŽ‡)евGЇ-VЁТƒЅр9Oэ Т~9wOАд7Ч—GmB(Ь_œЅг DŒ‚^Ubь­rpp3лркЎ#sФhЯCb5z>&Ђж` ~ДLPz[=Ц—ЇДƒ-Ьиш~qи2ЂjиОя>™UABOіqm9–.лН~Ћ#Ш0D@ ˜Z0p”г NМl%v F№z<л8(hmД9„?†ь’u†Ќ8Ђ;Mр7D Ц}]ц…ос™€M 0Еозу›#@q­'їpъˆАXeКWЗCьeѕhžсxб‚ Е†n]A€IћШ№’EcZдeŽУtЌЭЃ$"Ќ&YŒ‰(ŸжˆVѓие‘>пПfа™ЫУглўˆ•Ї“nŒIw›kiТрєу^71Uі№Уё%%I caGЦћеДї=бyБЇзR$–qg+ˆˆЃЧižУ<ƒЭU ^„˜žBр‹§јњърЫ БN7Uapsy}лŽщЇЗКѕUxpT"w/OZІЅкOћŸЎyEБsŒЕy !#Шјс'pŒ 0ЋYц*рN‚Š}ош˜˜Р‘Рh<H $ЇišOJ_—![ §ЃНзЏ№œр87ю<йк?GOє8žlЇs"dлФ7lcpн$йˆЪм#OaеХгEcZчшжш IтњшrЌiNšТT‡и7мц№Н(MБU 7№8F’xžЙќМtrvгgРlEdŸm5 uЯу™šІугЄŽŠ№ƒ!‹} dˆ,Яаasœч^н•csНgZжрьNін(аЉŒб№БfЖZф!Й щx&, <лЛМЅdž‚•qC8ъ™n#lёзH]ъ‘y*АМщNтyA 8тц=тб O[цХ(Д _>ћzIyЖa>“@yHžlОhр1„„y;еэFю%ЫX'ВƒЛі˜хhъ™=‚C:‹Н—И]Х‘П–ЃЧ4ЯбЌ7S„u ж†Хw€СnШ^БАoИxбг@Ы`_šBў!ћ­‹yцyiрIВКUqt{uгюŽe…\7PФqЗн ‡ЯМ~&9PЏхАФШ^Ф"жj4цDI‡‘4O‚Р‰jмOтn$ЂИ<ёLqD1Ѓ>‡jQр98рQ4zљAFC^Ÿ”ЉЋŠмАs{гY3`07j_пДŸgѓ Щђ‘'ѓЯ:}ex~1АоВ=0w2MBˆ ю‰фduŠ7`u1кЬгP FH+–Z ˜=›—xї,BЃ3м‚utЌ2њ­іˆ—LL:Хмѓoљ‰–WжЄ;Э ыѕЬS™V›ƒИсA .›2Њf)Ц[№щРЇЋ9††)^бЯ‚ўочq\—•?ИМSру:1еcє@ѕfЬрчщД„$ƒgМ`цщ%+ыq™љ†*ЋтГ[‘i€ИОm˜К"Щbух*ѓ…чћA fЬ IФ’?,ёd AЅГIцп~}A=З>td/‚ŒЈ СЫ(=/ЩхФ(›ц1 Џ$0d‘Н9ЅеofU"7гКюБЯhrУKœм]‡тŒЮaFxlƒРЫо2ЖьM&1  Ьaˆw~gш!PcЋ­зл/Пh0СбЭы']С‚R!ЦhxPь G”FЇ˜ЮгиUq|б—g2Ÿ7yтc'6нЁ”чмѕ“ ОнѕDЭ ыеВru•'Ї=MёV\7йЦhщt>%л0…)ЫW;;лЏ;#ЬЃнїcќ Нжє4…ДэGФM˜˜ЗuU™Л Р1Иб–CЬ”xщy*БН‘ ыђˆЌцЅ­) „~zp§ѕ№†т%ЗhJ4"пУkИЪѓP”ФГэээЯŒcоmяnяu8[HšdPŽС:„…U“ФАЛW˜-I.€)A“)юbIўК/A5,+HЊХjYGš*ммѕлWGŸПьŸгМ‘Mъа']|f†GGЫ‰С+теЮжіжю•ЮНкйн~sС№Z‚лЃ3 їљE>fX•gz]ьђцЦAQx_uшРšUi№ђ3=€gѕТ| 6ЯRGћзз#ŽcЧНжЩ9#)8ЕПAЯ~2!Ї0ЫTЉћіхжііО@}РЃа7—,/“)†Ф:†X%цбЂ)<™ЇoО~=НэЖЏюDE ыљ4PDIsг їЃiнДуЂСƒдЈfЧДˆ "дp$ˆz\5yˆhВEд›'ŽnШ§{ђ>RнW№Зпл,'9е†—"ѕАD№Šи%PEЖ}=шЖК7‡'”Є†“yэ*мˆU,?Ћrї9Šh#нtГуя$quЊpМІЄ)ЊЬPœ EхД‰Ёƒз №tWол6TIИмнкй~пЛойоккў2 IБa>­",;ёід-ЙЏJмˆQ pсzЗCQБЁтє5Ё}3Ц[Fžm>Ї[]Зќ h…З9 УТ­ r0Ь$ћХtVD$xdZ‚e~шс ф№Уoл[ЏяЮЗЖСЛъ=ќ№ 7№p!‚еq=Ћ2^к Ђ"CsВ™MgБЁ ŽŽК‚aшЯRЋЄ 3„ѕ\Mчx*EмŸ›Ш"зъ Мьх“Y“рž#jЇ/—Г*p|Œ–ЙУ­э—ЛзEЖv/PmаtќЗx›V-Dv?jІYd@Eлedф'г%\ъ„ЬTИЛ‹ы6-ЊЯЂ Єt–ЦЌ!‡ЇШ •ћ6ј4uwљѕVїШ`іrxл€?Їx –\Rј“­­—лgЧр/пм 0•†mPзЮpЃ/(љщЌ‰-uoЦЂl† оѕГf1ob ѕтŸcяf† бBRкdo’К=о?H%Kxn и~Z„.nГъФшэ—л'Ч/_nП|з•H'6EOІx–uЃ”г2а‘iw№C„› x mЪаЅgУЩ4№Ž‡І)DƒйR‘А лъtGЂ‚№-ЉЮ vјйbйфxР…gЖЊFмcыыН7БS]W-?Снщ#u˜5“дqВПЋ„Х^BЎЧ.ИКЬGгŸ}Пћ=‰ЁpБрY {w{ 07КЕс‹€ЉаVЈˆƒ w—Иaя%ФC0zыЗ}ЈнБлEЧ;'EŽЙ и4Гв‘xŽБВŒБUSф:M€›†QфЊпЁЅ5,п?…„— а=9<<№P6*иmч$хtVAсTA, №ж7йOWћяашƒу—[[џћ …'\XДYn”“К,вИ^ЬRM`ћx ВnA•м„ ю4IDй7~! `=(7Gwg_їл,ќvј ŸжxЗ^l†ћp†ЛјšxОƒF!3§ЁХ­YЄv€"О,*XнБ* /ŽnDMбСл›Iˆ мxHQ,|есIыŒi†ewчgwCVxžЅ(Ќv3ˆ-“jR’[јгшуфё­OЧА_ОЙˆеcШ-АЩЇ'‰&qƒЫЫЏЈ–ІрЧ–.Ы= ОŸсhЬŒ{ЗчЗН!vоQШИŒѕFМ,{иT1ЉёІ)Ж{šTйГ0zыхчгэп^ўЖН?;ЂLЫtАr†]KMjЫ"?МОштБnи~Кр\и1ѕН& јЖ[н!Х0Уы[lєеБU—мvXЩШІЫеД.АпŽи,3шблл/їovС=^О:c(`ЄѕŒДMrˆЧ2п9;Уš"ЉŠзЬ @јnЃyнєјMŸlј‡ёd‰,3ЄЇЕ)B[W†“Е` ѓtПž™_ЖwЗ_}вцП1wљ—бЫѕВ4G=ЩЭHОДš5™ЭŽсБizƒ?ЧдId)пЫЖ##— 9ѓЮчЄпђIСІEф˜* !+"]˜ыixїіеЧЃZlnУЃ'a›1ЩйЫЭЫ€€™N7Ž@š_!9>жDѓўоЧЧЧo№пf…oЊпЩ+KаБ-@іКWЂ;фјМ_B№ЋеЬфњеЌ0}5УHВ&lGЄгxsa›\€^6 Шљ‹ћѕ§уЛ@у(ŠСЅч8ЯФшЧ5Є€Йіїв11*^]уb,сеzDŽ€i€G*xхІnйdYГ"Ж§ycv§Їo,6=›€tЂ№qМŒ7› L2L№З?ОСoНXеиЄњП?§џнl†Ч‚/р ШЄРџз Мw\ЭIoі.Ї‹ UиfЁaX›OЫЕцЫ?лб ѕУzѓ&–„ т~3СФlpI‘:ŸЗKѓџ§.r~ГТGˆС­ŠДШ/я7WUхциx!Ц’†g7‚j‘&вХbкљhяУУ_о Иˆtь/ГЬAc9tякЌц7kђ пџ2ўaCХіА&}Кї+юW ,SCю}ўДwF3JTNиЬ-ŒЧGј‘ћ??̘MБg•а№y=Sм wІ9Њ–ЌФx“фриdЭ“ћ№ Ÿ…<ЮjQиxіюулН‹1Ч{хdRƒѓn&YЇ6С Чz’’ІЯ‡:q9$цб г2Єэ^‹1ˆб›ЅHqmќWД§лЗЭЃЌцГмёЂь№ылЯ-†ггЊ,2B/LиLю‰бx žr˜€` zSt'ЌІ…)s?†šVuCЁ[Э-Iѓ;ёщК№#Ю1њž§˜ƒѕ_тшx>гњrIбRЦЎZxЙ~јЫЇ‰ё[уGНnЇ=`3Ш&ј“?†Б\б-SlЗdЇ@z€ж“щЌЮВzЙa { sўэ?О}{ qсЋ‘хФўљх˜K2--я‘Щ –цo‹ШPxzдН:;я –›фБћ}Pщ?†dZŽ>юŠ~=Ћг8и№PššUЌЩ›~DПx„˜ѕ ЏмOыи8ŽЗЏяСА–ЁРГ•Ј!Wш›ŸC‡šХPЮš*зП8Охt@џЮтљУ&E[ЌЌN›4Рbе-kЩОе7œДќёˆЬ™ѓIІ CѕЏOћМ ~2шŒXAБВ’АŸњkрыYтs*Ежй­С?ˆЖW6Ма в,rtЄёaeЛœY<ќёD‘œ4˜iЬ,ѓyŒчЦwgŸ?^аМ$rcё`sP@Д^“|OјсРцќqϘ•ytuб•чвОќЗСhvœс­_™eYžxКuеW‚љ7tdG`Юў) )CS…Ѓл—ЧПџ~УB9юb”}œWїyvzDЇњул=^’sL]|ТЅ…П1 B‰#з”FCъ8EbZ-Ю.яџ ЋУ6GЬ'*GтщсэчпO ^ђчАн[0ЬiMRсCЉ+КW­ё5сt?ЬЋ:(C(Ї›PўKНжˆ— Яj"EыЩr“ƒ‰_ ƒ<Ќge–ѕ$sŸ|~qyнЁ^„№c#з/оѓ'Ы№>еeQ jXЕѕtv?Ўfeш<fт‚ІыbчВ'р#([DХoзгЂšп“F?ЮCSЗА>4‘я_zБwC‹^Х –›ЬєPйŠ !В†xqЕ <Вed§@†P#z№BЉfyP7[Кс•ЋЧuхсQвzуя+WСzЫŠšGљІОƒ^БР&юіУAЈфЈ—Ќ‰EIlўуq=‹-…Ь0 Ц+u`ў`VфЭаL;*АУ5ЏїїЏёCZ’5''’ЋТЋY†a8бP%ЎƒFѓ CF'9М L@ ц ме%NvЂ4PJЖЂиў ОМУЫАv Ћoы=`D(У’хІўИ_Ў*ўF†ДX ўy4 юЉё|E|ЌFfbœYŽжН8ЕDŠгpsњч‰ёояhцPv-Ш4УоЬг"ќЯЫа”С‡Šх№$pLгдx4 iAЯWыЭLC„x>‰-]ш3†ŸEІРJ^єŸ$‚!шиў1‡ЪЉ„˜Eї:эЮ1z4ЮєЌЉпReClМЃЭ#jнП<8ъ№ 2;шQzиMОЃK„|В5шї§ngРъе=nг,I‰‰bIръђa€-Ќ?UciЈXvPM#€РУЋO{”lЦГ5)юзЙЉ*xKФТг5єаЋnЛгыu{cСŸпoф#АF[дyф9–ŠIа=2цOVѓг'ЋKх^|~w<”tПœ.АЎЉLЁ9 вЂ,ёи—{оnwaRМY’њ …_ˆшOИU˜ IКІќlMЪv‚ŠЂб‹w_GŠюІ“Щ 5„пEe0ѕћУб}њМƒDiœ`dЫpŽiAж,—M8†Ьр)'ЇiКђѓлsl Њћ€"YUеГ‡M)~_й"3іnЮ/ЏЏПТGo‡'РтЭPHe]ћšЌN\ЯвAn!Fг€tКЩ/А&АlќЂdы9]џјжтп–Й­№ЬАuvrvњ >1“5(ZИc^ЙвљeнД™е;TГџЂџ4Ы‰Ъf2УЭ„M№€V‹мЈuyqњљс'гмИDЖ†uэ@AѕЂЯЉЈъ0HїЭп14лKЪщ|AШ`…a=АЬ]вЮ ssŸр$ХŽ*т3ъc92нЄЎ ъў.’иgгёВК™LJМ*FI9ЛџіmQР‹—xfp ŸdХУЦОеУ*зХёэй <ЙЌљЮЯвЪљП їe“8ђ џЗiX0…Ћ‡яЊƒЭцP ;ЦtЙЊ]Ш m|Jе>џo™gŠCЎ№тЅ8М(%ŠƒM3E`щœ—іЂ4ˆŸhєyVф5џ}кАђлЎуyDnž|э$ѕ[TЌQ%‚” MVї[јC=Aе оџлƒЦзA2t[eћwmJ1K'FSUЫЧІдjBzєgГџшi?cоmCIыоДF‚сGЃ“cРˆфEXx_ђчJ™=iŒ$TА'АP‡иv™ѓ„8lЇG9ІЋфю4–&,?В“O‰ЊўзЅш:оŽФ.УЋ#џгAун1юПУ5šА4ыШ/і3%у~№ё2Вgiъџlо Š§џ˜CџПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёkќПЦЏёЏ#f8рj7уcŽƒЩ†xVe?ЖЕџЇ Ju<зр‡#й“i"э^н9y™кxedšYx›ršEIќ/щ0§чЃзэŽyйt-К/"Ї%гEjZYщ˜q‚Д_ДЮњq1I =YЌg‰ЊХгѕYьуя Jљž1Т!ЃБd…‘/ RЉчЭЌЮђ:сЦ^фй/^Д^œђq5K Žd#ŸЏЇ“йМNЃяЃ№xцр ›8i•Кœ$EU6SТDŒ:vрћƒЗ/ЮF^†Ž3}?ѓdЗ\оЯgыхМŠ‚љ\ЦЂс!ЖduыC),PбjŠ"Ћеm™aђ/Ю_ нЌšЭъФЭVЋ5 fЎ–г: iƒЅišщiY"Sиt^љм­WxЕЎ‡Лh0гм‹Џc;Cх“ІЮъѕCИщьU`ЇeњŽњcЏMўƒCљžИЈQWЉAЋТЅoхЄF…лI™Икјђt`РL‹/nМДЈB+€'›Џ–E^/ёrџ яєЙіНј?ŽЁуFiй IRw,VЫЪh;ŸЂв^•иќэ—ƒžъЦaЈМ:]›EƒЗjё"^”›ЅЖ,ЉКnhџВv,ЩВ@Й/дY…\ЭrЯ‰Ћљ':вn>ОНT? #БkfeєЏДЌDJ$бИП‡ ǽሑu]ўUТк^2/fШ5ZHЫж”ѕbНD™ЅPяьНИxqб ќЌLнЮW!N‘ƒlНсЅX$І0шЂtŠ*ўЋZe[КЭ–MљЎБЃ@ЅЕ9ъјЭ&“ЊL<эъУШƒ‰іе;&Ю&YШЗ,TDл˜}џАH] yе4ў_bє€юДx;hUZК“ŽFoXD›2ЯŠдuщЯw–БPМЃт„?8њy|^фnўzšК:’hеy>љп}б2hю›Uih›Јь]д3"Ќ‰ЊpžчУє3ћЇВњЁx)ХQYЇБvy*ХyГ\, OХz9ICЯїPTЃЫJкOЙ=љЃЧIІkЫ‚Tx‹/АeЭ 3фGDiЭ:їxџћнсйH‡ЈШіL;*ѓШщ}К”!Ž/џфсY­цг* lЁнbTгsєУёOcшVКŠ`јХŒАKЈV˜SBJ3­‹и_ЕлЗ7нVOs\wpB›@џа}ќм1!&Ў7BƒШЎ1Э\ЙwеЧЫ‚Ятlў›ƒ5!@—ЉУT;DюЧТG~D\‚ЋрЄ$А˜3Аz,HдHЕ<Ћгv‚ЈШc_m^ГnБбф[>“uє ’Ÿ;~р˜?ЫCнђ’К‰єС9e9iГZ4YRЯ )ЪЙFЁЇ1­.Ћ˜–Щ dЫ7кЃ‰”ƒКЈ~R5Эd99ЂV•'u;’Џ"-bЧњ9<Ѓ2Фy в­d ъвo˜фfг"іS ˆДЉіћšэi7CXQр}кFMЗ<ŽыПТоУФ“Щ‚мšWгмЕ~JBчLЫ KˆЙЅЊ"+™С„ ЕDъйџ8f4bУ2•б5m9žz3FўМ n‡Q’Ѕцф“9ЁШzx\eЖщi…Т…ѓC˜—ў›ЭŽуg5Jу"ж1IuђХъ~…>Кš7UьIНлVg$(šЮЗЮnЫі„+ВЅШš…”ѕ‘/ŽЌЄš"!г=xѕr’е щwЅgЫЬсЊљOchК1кЭ„hWЁЉЊvв`0X#ХwJыыщЭянHэУЏбДощиВMYв=ЯqSЅЯяlHEГеУiВs Yрч#Чд•=йК“L&ъ™ры]MBгАSЂ?‚Ф|г"ВћGGз^ж •Л=<ю№Њ!ЗЯ†ŠЪБ€|KДЯЏ8 sj4љАЊ|{€‚ Œ\VТЕyHtEЫtМДB:ЙIВ?ЂъЌŒ=ўј№nФ"QƒФіяЎл” s­ЫБФѕhУ \M$j)§­‡%Rfрђ{Т*єp!Э&ї€JХЄkУ‚яŒjЄd›V›BЊизnюxYdišсX†ѕ‡,7МКЅИсЭиі=IkЂž­?д 6GжHТOcНjШШ@–Sљ‡n>‰ЈЙеюqКх:QГQUоo/Uшѓ!z3=шіЧШкРв,s{1”„о%e;*УB:JQСWъѕЄš­6\n˜чHo*ь€‚ mќHЋ;НAЏuг‹Јд–BBY"‰!ƒ$жЙa‘бXДл}ŠDQ‘цђZ0ёc*HЄ –`šЪЖГzёэqcівЊOлыP*МSџaEСY;PЄ‰• ќКqƒж& Хr–ве%B›=)e4]—я:№„т Ѓђ§л[xЂ s†ђ˜uѓz§ˆФ`3@kžюЗћœŽ(хЧёeŒ4дУ4,ЧFЁ%ЯEџРМ†4‰ѓ*вoOЧs–$Y{MЫ@RиnпvНЫЃ0ЖР nnD?/в4PЦМ_ЮIи[-sGbЧC 5ЭуЊNущJlџt ЕНб„‚*џxB,1Г,'™=ИУѓШНЃСч№"Јч!г"5ДУРф ˆр_ѕбеІ:/WJY ѕЫ§Уzц+д“tТR3ЋS€?…шD?"у4AЅ›(AЈ СБчEШїLЧQюОор•О5šQвЧГ™‘R@qšЂ‚КЫЗ{:,Ц*‹ьaЯ.+yѓ@eхІЁ†„К"m§G8ˆhиP*5u*ЊEšЄQЈgIx—MЊпмшŽ­і/Ў‡œb &)Mе№C0кŠP еI#п#Эѕу,KBy цS№ЎћGpx‰€Pђщb1+т8r„Wu#3мk™T(D›g)дMША n=ЏцŠ…Zoм14M‹†O8Е%XАцм#ЫурF–"№šЅы~–EЎ DXША,І UІ9xмr^Т[ёэРŒ€дЪa\TS”4oъКB”ƒЬUШЗкЄFП А2—A‡2§д7T–’-НгƒР—;ŸфМu‰cЈ^‹ѕт8vdЗ@’’ћхМFЙг —PСC:кwƒ‘e C#Rъв`”yGŽ0(NWїѓЪcю8Mц^Q!FаЗз’:7P<}vgљŽ0’М ^]‘љaыціњVєa]ЈV>GNШŠ‘•5ŠѓР?7РмљdнWTг гМЌЂmфв`ѓЗћйjтЮјl ъ~фвВ‚ЌќёЭх@бЕСбёўm…I  ŠWЦŽЪŠšF‘ЈSXЇžЏ‘ІyИЋUa%\]З{іЛвт@гЌ EПј?ь}щzЩ’%яq Д!$! эJЅrЯШиї}п#rOIT?§˜yв=г=З{JъЮМЊј(”цfЧмЭЯСˆAо&VOЋйC ЕєшВ#+6ЪVшИMъh"Я3дшГуFуЂЋ9–<Љqцi ƒ"(БЙФЊЇHыŒs0Э=•эv†€УяО\tPѓM–^і:ƒЛ-kІmЃ$8Z B'~1{є[R №*B$sQ-(Qн•cшAыђУ—6еИъs #aкј™ц%0%ЬНж…`Ў lО#в‹ХЌНQSЕІ˜– БнV?NAmэtŒи‹ѕЦСќQ?ЦЊШ0P˜Gž2(MЋ–Ѕ{7_>|<Н<љєщšVь8‹=!ЬФЈGЖбПфќrAHЬЧРiŠUр€­k…tл1^z3ž‡GщAoH ŒЈvPЬЩT“ѓЉЅДwКŠ4beЭ ,ЁWƒђ,Ч2Уц—§w{яі>|hЂФLтBТs\”w„јГЅѓiеg67о|<К eхB9žƒRE‘ZЕPЦkб†љ…7СцIъBјaiNTн8v”чC‘Ј ›0Ь—O‰\škЭHPŸЊŒUv3НЙнЮ+W…рŒЪ_УдьЊ&вН7`єжЮіцСYŸXI<‹Т'ЈиЦЋzшммŸ–џ[oВж$дAї—!’{yђѓ§cРƒoіћ#ˆіVT/Qv*K’2 *Ь–Ycsskчэс(‡І*Щ9РЃyQWЙсХ[Аys{їэцо%XEЭ ˆl"’œЪšэНЋъQ<€P„˜w9ёOюnnћ!оЏЉЯІp<нОiіQоŽ”’}ЂŽ8ЯZ[;яо}ќј…Љfe DБШЂШЁТv6џx§f{їнюжж %)†ЁЩ#фњcYšсХ.цшэuѕчг’ "‚05™ЇZ№,KѕhA†G}6+жe­ы&…2=VOзйpN6Ф№dЈшяьюќИї™­чущИL\Ь’.гї‡ЏџиxїnggkуcOд  ныѓѓFˆ{9nЮї/ЋЇЧсД_K-ВхЉ>Ы^ чљNDћ­›6r[n”чшЪЈgi†т&Ѓн§“O‡пП;PVwR—ОТа‚.Sрв›;oЗЗіЮGч4™nЗњ§?-(ƒю—Ѓ/ЗѕуН"Ѕ Sˆ™, сЉ}Ёфф•gЗRіZ-Z’IgG9Y/‚чS№џ~чјшУћƒНcЋž Ьqa ЌFп}Ѓ7 Еœ5ЛДˆ;EБ"2 Ћv\­ЃЯ_ŽŽ†ге Н'ŠrKCjQ–и Cфx‰{nzЁ~ды$а€c–Aѕ"СЪ>{§с№н‡Ѓoп6гВšŒЁ€еQЉ›wЏбъ-p`ЈuYbi,и,fUхЖŽ?~ўrТЬЁŸуDЏ&„pSb:­+HШЂ,a1№lPЭptЏ‹G(XдЂкJ=@%‡NŒžфУэНуŸŽоПн9vŠМЃsNј4ъЊОН‚”#ІŽ.*ъ^†BЧ“ЪМњ№щУћŸ>K€ЪЇ3Ђ=’@QЬГНЫ“‹і)”!0J’Р<} ‡Ню~‚Œjj€ЈН(­1€o`XЭЧ•ёiћыХщслїWN™—u•%PщY;ИzПѕfѓ}[рeУф" Š“–у1B9{џљјѓчЃƒЗ™YqœЁ‡­››Voˆžžў\Юю}k@3Ьˆс]IˆЈ‘c‘зX.ъqxЕѕљќы‡нƒk)Џ‹"-rњ ИЉ{qАБЙпХђ|РxN\ŽQrК.ЕЏ;/.П~§њс<%‹ћVц @ Ил†ЙBЋ%I•žyfоОlŽHsИ…Лћ€ ЂN6Х0НœŽѓюЮўЇЯћbRœŒ4A!ЕД ЖЯ?lэ}e$й№PЬ-Џj”ЗЎЪlДПup~}ўх§!?Ч‘(в,Ц‰чИячщ~Ї?‚EˆzвЦГК…ЈЮА}бш§FXЭ"йQ‡#с#˜ъљЄф>ŸžмЩ Lay2/Ёdœ(ё—‡ћ[Ляп]1P‹y!`фДЈQ~Ђ.Ф“ннЃѓГƒЗзљуъq-d6Ўs”жPŠЌ7 YJ%гВž“]hЈL;­fЃ Йœ@ЌJdеJIЯвs"ЖЈЧ_onю9/пˆ= iЏеRНЋЯ—'ЛLпŸДŠр’0­ˆШЛзsyttzіщ‹В\>~Уѕ‡Еvдь.cђŒW {тŽў  БРB>yПћў§лЗћ{ћMСъ§ЯGŸЯяћ#ˆњ’жЕеЅэhњИwџuDє nІи2Ћ‹МC$tЌПю2-‰lыъЖCЕщчјс“’^œUФjLг2/ђ(ТР’xAЈпН:9мнк§ Pъ§бсіЦжЮўYЋеъЖяnniП†œh(v4~x$MŸkYJ”$œТщСЪгACјўЫFC у ­ЖЏЯЏ:И -?›@ўž@L‚Ѕ„Гяњ‡ГqUцiЖ‰ДАщжсціўёхсЛНЃOл›;‡зI…ЗЦ1М“С[JЃ4Ÿт‘јw™М9ёЙйњˆ*ьAЖЊІ“дГэПlє’iЛлЛяRP7ы$жA™Uч‘kjЂbљxŸ№AЊ"ЯуUщm j_Eb.пюО?К:ийћ№~kыг=/k†щ`Џu’хеЄOЈBГ\oE,&eŽRŽ8г9‘Ь[M‹аu=7*rзќы3 fXП jзъOЭ&YSЩДЂђH ъW|ЗТV:6ЎЋВ<8|џсрє`чноюілk`’€ЄѓЂ€Ч]эЋF №т4№Т„4’‘atђв‡Ђ\в,жЃћ ›Б‹ЕDюЃ€—ї5ОiŠfTMШ6ХlŽСК*bxОI4вe™П8ј№югћv[{8Ж?Œв,Эpƒc6јЎнЖ\ VІ…ЭŸс„^’†ЈYю*tЇЭЈІc[Я™iЮА\ %6vƒƒсIМmhзИф,ж5$Џgи› ЭОkлvѕШrїфгоСолнЗ;ŸU1_жœhјyГХъщ9;EYЫIbAx…YЭОwžaйY*?№: уFЋЌР’АЬ№”ХФ5U‚J1нl‚Аx:%ˆ!OЂ(ђІ™&юСIlујУћНЗяіпюнЪы“u7€™ЮŠJ|>…Ў О0˜j™eУŠpyЏkŒ{šDРjЊјŒB€L€—Z­6ЪVЁ6[—U?™Lrп2§uR‡Už$IxіТЫЋEъњгўўюўюлFUUЭr2г1ИЧ„”mи 9ч)џ ”;*Ћеrb4JАŠИКЮs•yЄЅ‹і*иqBгнЛы{о‚ЪЋšО.JFй|2ђRx:焉жU iAшŸО‡ѓex‰ŽЃнŸпонм5›]Кa–КЮ3w{Y,5АъbЛ—gMС#г, {дїэlZEQRa†OpakmЁzБЉšЃ‹Ц;E”эOт2ејˆя'E=+}щTбH‹™ыэlЙuєљЌбj6№myюZЯѕй\}>) ]ЉцѕейЊz)ЊъЄрxI /А‚ZД™НІ)Œ$˜hЫХžHŒyє№ЫЪЂЈЇ9L{ZC)”уЉ*”ФУгƒ J4 MWљжчgЭўpФˆњ „jZВZˆ’ШбУ^Ї3`…QŸ‘d@qЂAa—ЇэЦЋr\хы•@"`­Ћ­(…l`УJœро)ИG=РЗЅI5MCФZЄЯАsrt3рE‰l­}mt#”б{ўYРЋОUŸШџъы—Џ]<‰xРMэ>')(иLLBZЎ ~СјЂbDz†,1=AQ t‡ " 1…o|Ѕm ‘$‰-&`{иЊ P7Ї'ЗC†хXXї­n’04§‚+]4”ўВРєnŽю%(›tUЙппџмр%9XЯ4Мх| шsUAЙvpUQЂnM1 …WЧ4Ž9аЪЌ€u fWuрžД P\œ5 0 5в<М^–~ABч|rН+ZšИšiЮЏ{ЈQш'ј‡dь{ ‚EYъiZџЂЏЋ€WwѓRмщХнЉq !ОG:jIC йлƒэ­ї'7Сќ‚a8ШiмKФpЧ_Ÿ#HиЫ“еЉcZЪЈ?dвVQРл ]/™ЭБаEYН:‰ыuO’ec.Ф?Š1<ЃЊѓ jm{{“ВrEŽсDьzjŸ~>ОКООКnvёа„!M#/˜hqŠЇ&ИЖApЫpѓ˜ыД‡М(hщЄ‚…˜€3дГТфs4д]п\ЭбnNЎYА?f˜YА!)д•Eшc+vZзDwШ&еы …”suншѕћУAџey q(сa%СBч“†* ЃvjFЭІeš!F Ѓz1#0ѓLфCЖД4{xстЕ)СI‰лЯГХМBТ•XжБ. ЏЯ] |X’UY˜МЧ b_фч1оы\Ў&†~"А *‘ђŠWЮЪ$%~ЙZЬашЋ(ЪcЫnЎ[НŽцшnu,ТЂFЃЇЫYŒQ;†TTNrWс;чwCQСm(мщ‘^тџ‡бNHZГйtБZf:7ьєФ_ыцбЬЌŽ3xїг)Є;ШyЄpЦёŠЖ-7yF8 k€єl‚y№I\33ь Y<­0шшќˆје ‡b“х2nœГ‡eЂВ­‹&?РПaœq>ЫqЪ0yћХl>ХЕXуб\ž+—C2Ж Ь€Ј˜­Зi&ущ|Rž%ŽЫ1Ќлѕ)>еp’@ЂБ Рwg‡‡W­DiйђЫ"ТЃKЫUІILg(рљL\ ‹pZ…˜oфkЃ1<ŒsŸ?оzп !&дй—ЖЧр4GБЬšе)fzќОАю‹=R,л>m ’SŽKд˜SeЖ}q1р_ чЧ–яšиУ hбlUЛЊDЮoљкNzRC OћQЧ№њыqцHW›gv‘UQы§оiWѕpžыŠєV•$AЂЭaпOЮyAЄЮЎxAЯР{ЪћИns$цѓЅл “шєЭU—UЭxʘФ(‰чПи‰$›AZрє†—_‚ -ТЖКBЅйѓ7›ьбa’К7Л;ŸЎћЂŸba8†x7)bXЩAU ы1I#GEЖq9ЕїМЇuтZ*O1Ša>gїq=’ˆ=<Мfувah=AбHѕG‚ xЉ"ТlЁ9у и ьшЫ›7›šяђGл›;'ню#IЇ ^rw<ˆ’QЋШежAЈ…n“Е)чsx(’­йІёRŠ!У+ŠaхrŘbSbџКйЙ;?њrбч#›TбгЙ^:!“4›8GollМоokтЭлЭw7У‘сLзˆя|з 0ИћйИФЃ<мтso ШFКŽ@cX§žх‘ѕ’ ’oШ‰+ь*]˜шЋгЦ§эХйѕзЏ€є‚jћ!Њb{~Ž'ЂГйrl^Йм[ЗЮ%њѓ6˜Пs1 nQ@U]’ ‹1(&ЉЩ3УсАлЇщn‡UTЗœЂ0Ъ[‚йY˜/0zeЉэFеtЙ\Ž#Sbћ­.ƒ:зlЏ9фeВ’ж@ЉфыS“eŽ+ї~ї5ћ‰ьbчцю-ф; –mћ yфBШ C/ЊыФрщцхЭез‹‹гk€Л~5І†Ш š“тсПџЃGPrŸ@†™ќ4–— ~†…(@Z­М!Lt˜ЎЯLъа‚U58|жю o ŒlюЗV2м V9ЌCј–(ђГYы<гОrэЦЭщi—aІЇБ& ЛщŽO§нІ”Іn‚Уњ(|;Ш-є @­Ы :Рј,Рш†xb2ŸУЪВ!ь2_7СмэћkД}ѓc’Ою—5јjUХ8бшTѕЌйсH”рх Z=NВ2œiyxqЫ@ ƒЂЭxA5Ѓщ1’3Р›Œѓo‹хY@к{АЏT‹Ћi8зЩ”\ЂHHЕЬпО}НёЭлГз`ћц…ЭРNБ|Ј Рj?ŒВФ|šDв=СЬЇгЬвИЫЯW}ЪХ—xJFЂбп;ФЦИл˜јК‚‡*WDŒžцраОWрЁрМђm5(…Юћ?оМоМŽ ИщвгЃJ§`є›г#XЏЗ/ЗwLVыt6Ћ lа;ŠРјСm#ОJ­3<й’eU|1Dщ†yтj/…в5ГР1иўэщз6-ŠFeоPФЏёХТГЌѕцєру›зoNˆбooБЁ&г‚8Џm–€бA:$ŽФБ§6-AэVрБђO…чѓ1щ““_Ьu$išANіб)УШ–xњўъќьќŽцEоw’O `@>œЏ–UHNla™Њƒ§зЏ_9њlпНCЃUмсwR<(БЖЉЇU ђ‘Ÿ–u/Хž‘§мeHGг^L€ \яЎйpK_‘ИюљёЩe‡•б УёуrŠмwхlЙšB]hBУS€іЮ?6оМ9њђњЭ›ьоc3–ЊЈМЏЌšсŒ X :ЯњИџЊ:1 €в''ФИ5ц:ЎЉ>я`ы? zD5ŽПœЗ8ьQ$~иО=Пъa% тє{№iуЂšЭW‹мG’7 Ф‹ @oОџёњЭ?ооaxPIKЂ xЂўОaўМюУKPА'k2‰T "ŽIлІРў0EА/^U†jпоДзЧ‹Jˆw6ёfд4rPЎTг4UъюC€†™>…_ўиОтЁж‘зMcn\Cѕ†зњЧФЕ.ю9xf˜OЧ:йЩъіF#jє3фЧ;Œ„‡šВФГУю€bцp4јЃ 12" C‡o[ИgЈ*sВБуЭыЃ‹Эзoўxѓ…&НХ№8КeyH%„=Эу@™N‹Т{xf‰Зер=a>3њб[њƒaЏq}S-сѕ‰AЛбрЇ`з-;ь3’т”3М€… лEм5ЄŒ_Ў7_ПўуѕЛKЌFџРLWѓй86D‘bћ>„CŒ-№eЊєƒbо2Ќ,ъtкэў€ЂЉіХiWжt<НГ‡}Nдвx?я€uёŽЙ| F7ЗaІ_П9hсЕ ЏGšŽŸуё7 ”ЬWe™э7я†М"Ш№wф&MзЄAЃёщХFУєšР}яvgРђЃv›гmмЦHHпwXЩ­А{}B\к›ЯоЂЩ`є›Џƒwџ@Ѓ7[(UЊg'%Н(ШcЂЩ пmр ФvЛЈпx˜&Qїї ,м­™~кTШЄg”‰7У]l+шлѓЎ`цhє,sMУа•с @ш7`є›7—ЬЧ?№7o6яq3Ѓi:vt@Ъ (XИС€ъ\|њ№ёKcРсю‡*вэF—гMухД–ЊюuЛŽ‰{њˆ„гљЕp‚5aљЎФхФЗl•m~к&бnsssуУPИн‡К хЦСѕ€Бщн№ЦыОЖТ‘$žaXУЦљ—‡Чз­С пk5ю)IГнguЇќч!ЈH#6%'%5Жж‰Сѓ`™3,=шyЈF,=.BOО§ќn [дnэ|xЎоћђn‹Ьќюч HIА3rяd>Oёв -bЋЬњэЛлы›FЋ c ,M!•ПишWH5ђ0Dzѓљ4ѓC•`mvq \”­џђa‘i_w6ёц@шэwŸBߘYtуфVццціўIStъaнœ@ёЦ`ZЕ +x: %†Œ[z ѓвћ!тЎ‘ уѕ}”е`‘&2­ѓѓл~…їА,к;ы‹q[л{Ї=РкИЉ0@б$ЖOоЁ“lННДвjЕОܘВ„E…Ÿy.vm9ыf…  ^lџS+%ЉnM2о“XN3пRaнCXТ”`Œ ёaПо$јyїd`3rЏ‹ž^ЛэA1ѓf—Šѓљ уњМД!тНmмпУ `_|}<ЏсъŸ-ъ"Ђ‡х‚tЯЋѕBdЉУЫЊ‡wAWЋ…y№жрціЇ–=&}j roљi„ќѕўЮЦVЫOgы‹ЃP(x† хr…<=$ušfЕ Zџа}їЁЈ9ЯёВ4Rр9ьК…Ђ;› ­.=ЎfЦсЦжЦжўЅœ/HGєњђI$˜ЇЉдј|Ьјй –ѓIюœ‹‹ Е‡ЇoШВјИfпˆMUјQЪ.о€Е\B)MŸа;DgUdы*Fћ5и№ј0ѓ/ЗЖоv§щтћ•чХw‹зw—OУ‹ЦKв %JE16*"•ЬЖ>ЂхЫЪ7^^ќћL;Т3эrŒDfШі„Д`Ћљ8ѓME”Дy3žVгœ?;Йз roјaЕОм4џоmLЎm/ ф|lЊŸЯ—Sd Ѓп­-ўі &ќqQ‡ЖњВ;СџЧ`-Ј“№д*.‘|>ŸbKЖE&њсжlVЙOќsAк0IЮ&—$ёY№1№й Mзr†U3˜‹žV#чR™§у A&C(&ќl†wžžžО="Ячl\ЄY†№Y‹EUЏЉJўУhьЦNыйќ?f›\Р›-Фе№ёa‚aŠС3а­ІиЌ8ц > (ЧЫ†…є\„s_ф#ЁЋBУV„"ољtAј(”мб†`ы№=АJ5™ЮПН~QH~ЛZ?>ќяF?=ЬАС/і­Ÿ@ЇMAтS4;Ј—Ш’‰f?Ў~$ǘHДzXџm‚ш€zг8ћМ2dЅ œ’”КX3ŠЁw­9{Со?џќFМљq—™ƒmЉ?‡ЦВн­ њоWNќ№щЬШ'“;AпIйръгЯшюуюћГMЋ1^А&„ы№Ћа›ё‡JS`–S_0Ы>џрŸ FŠ–x/ЇЦјРoOk‘ё„ЋЇ'Тi˘% оєb{Їћ †ƒ75fпIђVп/х@œ|„d’CЗqћ&)'‹Љ#ŽНŸDЬкэ 3§lнy\ 9сУгк+ПЕЭр–ЫљЌРо$Ј"яOO ЖАЙ›`*ёЛ№kёfмЂѓCeу6рhMwЂjЉ?pИOгд€R œуѕ<˜jВы?_р$'+ 'SЯlРRсЖsйЂi%Т^Us ’FV$JЌзьгci‚™Н~ЗGK†фЅЇё?Ѓ…шCтzЁщfhыt РІˆ\Ч+VШ‡HЂ.)€OfШ3lCЉЭŒЎЯ‡Ќрx:^dRаh?жqd˜Ронm›еm7I]Mљ9Ќ›CUз˜›ІdgЧHЏЖX*В;[G’Ї?б10РDЮЪЬзIЫХ§з[†3,‘СЋћ,g–‹5+" ’Иq Ь3w‡йоЭЭ@1mЯ5ЕŽбыЁшІ:t†t…эЄTƒ 'ћѓo№С$€›сїр“DуY†6?юrЂ.В§ЛтAЗZџРАў=Џ~ƒ,Е"wžtiдМnqnBќ›_ €|u#HВ$pl›…n›бВЬfOФnЬlЃСЅc™ЃЉaчыо Эё"KЕZшU;р ^Ю Љo O№'zеjVс'пoмv8Qќiд№šх†IћŽIбyЊy7RМщ:5Xљ >МyЈЄdvдяоэг Ыт=N^вАпŽќѕ$=еЎхѓцppЊЧyи†Ъў\RxйАТˆ№gёPЪqTЛб“ЬђоєгЗ‡5о˜&Я‚wэ~ю@дщуЁцFH.„Ь ре$ŠЄXI ™ўяЯ{Zж)ЬШKЩuўљ 4ЛFй] ї;Œ.є? }эУЂJyЯ&‘ЦsLїxoџгзF†zе№ЃЃ;˜ˆa ъZAБЃФтrў№є'<ё8ёLучфТяƒХнPЊнЃзnУhЎЊ8­WпЬгCх"›tV•Ё.ђLуф#/ШК љЇЕ0КџcnЉ‚Ј;H+cљŒфѕ:БєЋ џљ@І-CSEŠ1’ХЗeb(šSЎH |Z†Š$ƒ…~’…†Фš_>5‘C‡:л bR "NЃ*п”Хt,X"Њж(1њцOсќ/ƒв Мf ЩМNŸЉЮ И+ђ@жтг2@’Eƒz5ФЎЦсUƒХНi]Ы ђёœP!?ўљoпVcШ?<ЏкŽЁH oИхЌТРї Је‡Ви/№i^§ИЪ,Ж5R П\џДЪtŽхзнеЎƒ›#}Y м6œtКD4јˆБq6Ю}CdгvLqа ПШl]џЉ§}АКсјф2œ“-J[j_УKgkмє4 М”Ы иЩЂI\w тэbМЉкP‹!ЦУ`ГBІ{[fY­цћ#еє|Cџ%Ђ\CнФNљР гЩjтI§‹KЙџ&k §ИћOS#" юК“™FR˜~е/чHГ‘тЯGдШШ`ВœІлŽЪYеВ §зpС‹–`ПZ1^ЭB…Кў|WвУ с§Чrf"‹m—4Ы ЃW0гxž‡ф(F4Ш3шr `1Жt‰т4ЫБvФУЮ–ч pж4ЏІ2S“n}ИAТ1З~$е?Z]‡|n4шт> /rШwс-ЏHiHŒF\ž{І>ъŠšщB aXщ—щб0ІхЇ5и\9RяеССѕH4wќHЊS4fJˆ55<‘Й…hУ#ѓЕ‰zŽ м[FІ.мїeрŒ&ќр1Ыџ8`НiНXФл|ѕсУE—‘4F -јoмИIzŽ!‰Jep`4dPVАjтбXƒбOЫn­Ъ§+pKзˆўo†dЙ~>ŸИЌšw{gV6в%ЁFя˜%žыљиkуЌЙш‡,УŒЄ—сЗ'Є2ј§Иœжiшшjїеyxд_Ќц'ZvXхЎ Еміо%*ўьё;ќxœG†LиmK—бŽ5Ž рŒjEю0ЯъЊžтVЂhKытяOТ§џ§-; l˜ЃW;'CYЗKD~#ќљ™KJTА%„pКпЖЛC @–Н|z\рЁП СNH№Об_VўэAАкВpЗэЈЏ˜~ ШэOЌДp)މ)(„GЄŸџ9Jh^ёЦP­|ХH’ l \-Ч$kšю_!X4lЧБДПMмь? Щ&ЖиЇ9*n'ЉW€ў№žkћђО‚—dЇ˜Рл*OQ4C5 ђ†mš?OХр™CГLмДЧ6EFqгщЂp$H(їчЏP}BѕВz˜Ч`sHГLыЮПЊЩПPџщџ1ш5Љ”ŒLПгъвЊŸзЉ-ѓ,…цёЄйg:Ы-™„Bf.њЃ_ 5ўв иЃ$‹ь uѓЊУaЙКЬЃ]œ*ы~:žФ†ˆ{˜ЃПK8ю/Œ‘ЈъXяђƒц+Дк"Ч$pЂc…иы)s`єПЪџљ eYO9b 9ъГП@.Bф€в Uўџeѓ+ФsПпbdbрњЯYЄqZ§“vžе`Хџ5БЅмў?7њ? VYїi§ €Цяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧŒy_ФГ†dЛЎ.[AђЋtцш1,еyе“н NЂ(M2ГO§пЭаœЊ‰џК~šџ2FŠІŠЃ^wЈzqQхљЄ dЩѕџƒ€aюТ Œ$iьАIћ5ЭнЯŒ$‰|ПuзИЇєАРvюTЅ4ёўнъAЏ#…Žс&uU:6о8CŸцџ<њ 3ъ\_ноЗ;ŒžŒЇ“Ьс97ЯBяЛgw[\X„ЖЮfЅozљИJс_мдgEIЄ{=ZС)&“PсЌ$Х›^ФВNуоЬ‹аВвљЂі 7_,2ЯtџКžжЯCьў5лwdVВ\KЗѓщ$дŒ4їМ$ђљWЏюяяЏaQ†ЊY,—•ЋЙхj‘њaЛџšfТ‘jйІЎšnњЇyQХ%rbЇU"‹Aф`tѓђJLЊБ/iљb9vdЗZЭS?Ћ‹и§с{ј/œщ"CЈЄUШ9ЪЇSЄЫœŒЫмcF^ф;нWЫГ—M&БЎ&‹em+сt5ЫгzОЌBяgн—ќЫЃУ^R”5R;LROh Q1GБЙqUЦк8aрQЏ..ЛvVЯЇЅЇ…Г‡ЪЕГХуЂЎgЫХ$ ќ_q…шПЏкЪЫ™ѓYцвWBœуUј1Оx­{=rпО:ЁЌДD"ждŽцO(ёБz˜O‹еЌD%ФП3уKš…ќМШuЕBБКмЅЎиЈ ЄЕEd‰э‹{б‰}uы&eРѓ‹rёИšЭ–DFn>!R^юпш šэE9вsжщЩbQ8\_AЊйЄJіщд=˜Iљ•ІuІ)AљДHA2ЏSЯѕ}пГўЖХШXn6ЯЦ%ЪЁЄ№лIlk^ŽЬШuыw‡ЇДэІEŠ]3ЭЋ€ъва.—x‰Ц4ѓ5%-Еѓ7 ХеИЮ#Яq5=›Ю'9иNЎd•бўјUђТ2 ьў‚[юS—\”Ђˆо’м}XŽ#G“4ьюд~ˆќуоp‘Д60QЏ^Сfу .ЧХy—ЪизЎŽ?Ь“Йbт тЖ~wЏ'Ъ”ЏoЪrœz†юМnѕ%ЃїЊ!кa™ЙІЬі:ŒlишАSЄ^Ц+ЯѕН ёњ\H’iEbcшƒƒЬП?ЌІу е0|Kn_ОўrдзІ$qРš~š ОуАM‰К .0Ю&“i^+lєщЦ№Ђ /щ0Ьъ2ёњ7rœO!ж­9Ms чЉЋбŽќЫ[эyE5-QДќ8†0lёэЁИvВЋHaлn?œђnьё€ТZi œоQЕXгe<="ŸЩj;bЛ+ЃѕЏєьОЊ[ЎgђœnуeЪР†ЂaК(Щ€|%eъ‹зїЭѓуЃ "Z@}эШšI vЌ‚Pю yУ /?—IЕyгя—] oV 3Шc“юH–ƒ4Ž!Ф4Ђ4:.‹иг[Ч'_/7gлѓМ~ЫƒДШC‡>НЄН’А‚‚oЋ‡Yтˆ]ж4@oSћe ]аmЏZџjˆа.OCЧ!( ЉеtReiфtЋйюѕg}л œ~?ŒHзЎмКW LТMQGяІ­&:тL'*ыЕў‹:Џ™.„фDcњ#T?OsдЭY“CЭІUYйRй!5Ђ†ЭЦёЋCЁœржa[ђ|МЏUsМќљєА\ЭUœXNцгм7ŒэПmАй‰ъi;š*сEѕ(GњЂ‡Š"Љ.’џё M3TЇеW!ˆh>ŒуаЗјоШ Т8qUЏъ<рХе‡EŽєЮHк3Щ=гјW;КхјАт Dd‘k(Ђ ЛШбKHЁ @gЁЮ Zї­оpаЙЛ@уzbK  >0%––№ЦЙУ2Мš%^ZEђІI9žC\”ЈФ, к?нhШЙqŽкuЊ%VБCx/ Œ.Bcxut№љМбКП>љ:аmЫЖ‡З*CЉDШFйі9ЂŒ/’MрДz@2‡IЖi(ТЯŽжŠ–˜ЪzŠ"ЪЕЇI’ЈB“—|щ‹У'зwwЭы“ƒOMбЃћ йqm]ф%Ђ†дАs=АƒЌD%|]„фщaŒ‚У–aш?ћв€UJš \MЋKЯT­А"П_.ЊФЏП6p3ЁпК>>и;ю)†eі[ЂnЊ<Уђ,'ЋІуˆ#AїГrВќN‡†фFOЋI™ХђdџфэЇЁщЂ˜ ѕ`1FфUљI‰д[ѓйВЗrMсF7ь4o.NŽЮŠЉЖŒ(sƒ!У КƒBЅОСГJqPю­ГHJІЁёХJ?†ШšЎJЂюv$мZЮ'SТŽЗ˜С<ЋІши(‘J НnчюьŽ•˜Ц-УQ­F щВм † ‰iЄEе„8Шw"Ле$ѓ-MЄzДjЦЯt‘>Э2#FBЅйЂš З!D–šIцr–ьxЎ­АУEƒ“ л­САqй…жщYЃнЉЖ‹tEЌ1œ•”“еуr]ЧЌцu„lƒ>Џ:>„ЅŸЗ)†EЦeYвНД('DјyЬ›MАПМ’ЯЗ$КпыXМюGSЃоХ­`hНуГлЦ]8NД’ЊTNѕгbђАZbДyюYŠФY’К?—D2P#еv-гёjгĘз‰бi№.иЬv[эЊHШи Г7-УБ˜ѓыђ)SЭЏ—<|3И’Њ{y=‡Љ~Z!gЏ"‰‚„jСщxRЦЮOсЪC›5УBдщ)Цеx:[гѕшXжЉ=lа–уšдхe“eфЧVд§єlпе#‰Цо}НтНЌ.(ДdПœ>ЎСr*Џ І`Аk>)BѓчИЕ˜#Ъ &!жH.HКB–Йх4ѓјлОщ:њ№цІ;’tx#&˜€‚ЖЬРђ=з„T‚ёtЏ'ˆ­!ЄЋŒV‹G$œ‡Њ р †в9 [ћЇРаК‰zєШN‹ZрВQeEH*&‰оюшžcв=Ša@$(RьЛЎяйма bЂPž) "в1•уwж­rіЯ§И(XЁHв„$€ѓ12ЋџŒВQж1@Ю 4Ž‹J !ЕйУrБZ”ЮБDŠW$aD –‹*}ЖiлцЈgЈы—зYшЊ4MЈХМИШ"ЅЭХ@”9šLH;“ ŒЅ2P­–эСRоЪ…/–P~@ј˜$F [КР€cъ лjJvYК&Ћ†оi›~ф™^VФЩ Š‚tщœd‰Kќjљ R9Цљ)юу OяЉJBKUx‡St•\œ€0maАУuˆ”“cЁУjšЬƒЭЎ% ­3Ъp1Ќ$о6MЯ‘x;+"G‚HШгЃ„B=N#yd•ѓ'Bз‰Б‰єHшЧЖЌўб„N xНš—Ш MЈ>‘И  к8Ч…uЊAu$Ж,nюDЫu@ШѕЧ+Х’Y5*В™ЂиіMiй5?MmF+чјаT$…AЮe,Цu…СNѕ`4bFнN—bpГ ­xmEШ–ub2ŒЌa чЉЋЩ"гщKІ‹ЬЄЃ“Ну$Q/ЏЪиЗ •Пk† ЩоO“в ’§Ё!€Yрє]ЯuC$љСЈ~љ iŠ`В!є ђ@цух$ Д-k>DУ цгTe™ыЗњœІ)7?w% 5…у8€?аЩЁA”ЦУ'уXќА ˜k:N юAе yїєўў§H@хOUз4дŠЯЋ9Љ:p AbqE˜YйAЉш S“%ўk]—.?žвf˜ХОы'№‹xGiPэЄ1*FаlXЯ!Ѓ. }ђМ5‘xžЁP*•M~ШшЖЄBxг4…зŒ;в$Т:œ/чyь џ‹НїаŽ#IВDљ[$*$Д$tъЬаZk-2#%ВїыŸ™'kоіœ™щШъоГ‡оUе,€Д№07Лцn~oЋ-ЊN‰šуež†žЉШ|Пн)}ВП{Т;ЁoЪВ[фЁЧіxMƒТВЊЪШІiПž# Р БЈCC У~їўќќІрьч.>ЗTУГ‚p™"т@ІoВnцc…ъ Э+fо УGYdБVф™о wzxzx4Д\ ФАL= 5 рGљц я– ,itЕy˜BяОнєnŽo[}"ЭЫƒѕHДiХ$вкАдЦ фBHq}Ћ.6Є%ыA=Ўђц:‹]X"Ou`ЖЛ—з4Ч †+ЯC7м ЊІгмглm3kVhєjžЛКШ )p$зn3Ќˆъ^њKїœzš!SЇ BЊљr Љ|bV‹Чєъ.ёT‘=Ѓ3TПжUY`ћgŸZЃлƒУЎbEiBr1LЫO <4*<ѕі^t‡eщЊ<УЁЬŠ“K ў %0^ИЇ "U†сyŽe№/Я‘z~‰Xщ1:кsrCу8Aіы:Яcж‹мэ—у‹Гƒ}Ъ ’иГeJ4t7oˆЮYnk­ŽŒ ˜Ч†Шˆф-r(‰К@‚]S{Yищv€єЊ‚šƒ=Jвюх3ОY-gЋwян ˆ-•ч$#†™ЮтЉјUU…*рfћніічННЎэ!снЩšьjІгШКŒюqЎц(€ЊЁh ejЧ­Э,rД—1JЩКPВL#bƒЬ‹2рt†ŒљKˆWжоЦО>ёtсUвz ЭœЊIsёўэ‡wяw>eE8vаЅeЭŠЫёИЪlЇa!Œ+XмѓФ"RЙaŒEdVЂDял4э%ћПВnC51 –CхЉ‚ЋrМЄлхь-кч7яЎђЪзxV€фрΘ$ ŠeKТ№`sѓнццћ/;Ÿ/iщaw”Ђ9qQgЎјJЕSˆxZš(}5dBЮ'А<тД.у%в“5Уp‚Єž(ljАшFЂ™­u0цђі›­t;`!{TdUТэ2Kфю?mlnmМйќДџљZP5C‘ЙGнЫ2ˆŠ‚ЄйiZAф@йЩХP]7H'Јцˆš?f’де^P.vy…(ж:€ЅЫљ8ЧжЏЦЭЩ цH„x€ІPЫMfЫ&(/1Уn & ]}~лEІѓѕќvШIАЮАpС=шr†XњЯ™~ћюУN;ž5Pј!/ЧrМZ<’9o6пикј|+шКУЂбYР—4'ЏФУm‰АP''РQjB<7веыГВaыЯїV–јоХщeЋ;тDУЏж›чKЂ­€uРTнйќ№щ`яp”Cѕ1. *<ЫщОСЯ?М~ѓf ~џœ"ЃЅю%)H*ЛљXЛиў$рТ} єm_S„Ak ЈcрЩВŸ[˜x“|яЎнЇЬ,aƒ2=sЂ•ИФR`nюmlяююJAuЬІ6Ўvv>~:>ЛHП}УњЬ^Ф&ј№шєшž†АЈ#гЉc[ШЁѕ<Ѓ%гЖmC( Е–eAn,Qч5‡P.iйLВл­ГЫгУЯя?|тQ—ЋJ?ф‰ЃШєљ‡­#V’Ё€Ш3п2œЄ‚͘5Ѕvs№љѓ—ЃГУ›њ‹6RlzЊЬ Кwї#A†ŸF†э>“О—G}x$№G iEFU5еLgD, ќdBБ5ѓ~їњzя§ћOЇ –[ЁЉ#†p5…Л?xЛЕ? Т e™eE=iPZu\igЛGGgGЛд З=№~5`Ђq‡˜уѕ !и6дЯдюI‚jaaЌkЅH]рewŒѓŒЊ Ј8:+ляР„O'tР АНЊn0utuќaчш+ +Lѓ_ъIWupѓё№єќђыС‡гpНГFЖ_ЧЈiъ"q uЯ ‚%Эчѕ8ѕћmV ‰Н3h:ЊєЉю˜є†Ё:ж•ъэ/яwOЯЈ`м@mш2y/Št{tјщуіЇkЪxЫёќ Ъ 6ЌыБyќaїЫёщо‡OєИVDЫцaбT9!єз4Ф€=LЧ ‚РГžUсvo.кXHС#r$ УЭІdžєэoŸ\\^uЌёt2ЉС=4žъw§ыН‹›нЗЯъвLpъ­ћнУэ{‡ћлчбуупpWŒh‘(:ХЌj›ЊЕ1$J"п~vџя}ЛC)€ѓаН<мDjPЏc:ƒЪœДLŠСщеUkРИTЖ5р&KулЇ;япCќи>::>ЙМНН Њ“ж`šЪЅЎЮЮЏЮ š“МЕxЩ‹sTмбШвн4ї9N=ьЖћэыЋ‹Ћ2РB’ђP~~эЯ0еГ9‘R›Й еэГœэYI]I8ъ№цdgыуЮћЗ[яоН{џсуііі1р ')ЊFШдА{~e­—р э^ќЧСЌ˜I€—ЈВfcs‹Ћ§ѓ=Ы}І? ;ww—gЇggчmVT^“И}xГІ!тvГYl@ЈЂф(V3ЪK(И,™j|кџ}мўјіэлŸїПєexл*}јqшќш–ЉŸVФ+PmЕvrўДh 0Ы(pїчŸŸh– КƒоэљййХU_аtПФs,†jВ§rо3@fф1Ц/‘з]Вaхи:пП:;м…•ИН§eї§лGчЗ”‘ШDљзЄŠљ>'‡x’И$J‰Єнf’c:сƒЬЊ, гfQEо3щ‡45шї‡Н›ѓыv@Œщ&и[5ЏГ$Šу ‹Й).ШYXKЩA>ƒ›-LџўітЫоехюЧЯgg;[o?\нмі!Ё ‚ ` 2[]=Ќжв\$S№HП@М%ЮЈ3ыћџМšUцЙлэм^_ƒ бТЕW“іA/H gЃ„рОq–>odпn№nРЭХюЧƒлл§їЛ­›Яяоo9ОщмƒЃ]sРЊ\*~Ој†lФ‰gFgД<.жаfE”бV‹:rНgJpuћнƒВпvуйсl’ТыG]ѕПцS2IгёИ†%kP—”юяМћxtг>|Л{їѕЌФУЫЮˆънмPvQзUЈq:Gдё€е8К@TСпEІЁњr^eY^VSь|qŸeѓJl”БЕ§ЄšТ ЬЪФwC 8ЈО*єk"yЁ,сi™aв4цrчэ‡/—эЃ­НЛѓїяЗїяiQ1-ФA!€Lš99`~ ѓ\ЅaС| У(šО˜чъєbKVр<Ыh›lT .вП[%љMўњ‚вœ5та;H7ЬtSx.”џ†LНћА}в>yЛњіэю=”=P[‡q’ЄхxжUД"“8'юд€УсЫŒ€›&2D†•tЧŸgєPЗ &Š&Јl9ЎВа…RZК=hV\СззSьуХх CтYЕГѓюУQћhcяцxыэ ъшк.јюіUzˆК щЛFщПШR‰Z0B_‘ "ˆ Ѕ„U@юsni(–—V“ jƒY‚Ч™PZЈbяьRѕќw‚АЧЯг fI‡qф{PqЊ.\ю|<ИйпиЛкпњtЏ ЭP“ nАX}C™?мЅš5…o*‚ЈЙ>М=J3œявƒ’€2ќф3 ЏлQ p"S\фR5 ]Fw—-б[ŸМЃ@ ю=сЉв8ЦnOˆ Ј=˜ЫЯ{_ї6ї/>ќЪЃ$Г ^–В.ˆЊйWƒ ‘MкЧjЖdе …љr^Ўc+и ?уhКq‡Оƒ$ў(Lsгљz5Pќ8›ЬЦБЅлz!vLg M\кA(ЋЊвшtчшѓлƒ“O‡bcЧtщД(ыЕц*ќп|ZЄy ?'‡"PgБTœеYш!QќГЪqоtУ,Ц !A8Šт˜ўэ cљQZMыи–y5l№ЬyZWeEV€ћД()tдRїPгўў—{„и€pп+NЁ €М„'ї“љrZњ–aA1Т”8 7Іƒ$/БЙ –QŽПЯBІж `лбˆхЁ‚—ѕ ёЄЩ<jСdyŒЦs №€ш`у~ОЊ№w_оНпй;чt•(vћЈд]”Экm—ѓ1дш’ƒ'Fђ,™eзfqЅВїМ‹CЈЕƒщм_п…№ж ,oТ'—у:ѓЉЫ˜ўxј\П.sє~T&БZUЄбЩЧлg#< FKзѓУ$+Њj СoГ\ŒC[сt\DPŠюv9пBwпЧŽ /xжvž KOъ]^\їi ŒжD^УoˆЃ ЛВ@FЈјЋ. Xdq9VЂm#ƒЖpГГ§љF†ruр?Рєe…о0CЛѓIтЈŒт%L5Р9зжшћл>юX *Н ыaQ=ЇДJ"лЛЙК<>8ЛМHЊ*ѓ84>НmL—г ,crˆXфiСjєaЊLіюэtwљ!Й…0ЯYYk‚kŠЃ$ЈЃє(лЫ ЂЩЁHЋЙжщзЛvoаo]]м1T\ю3%KЛwЗwэnЇев~Рђ,%:A†x\1ьгŠдXУŒЋ1ЄёКЪ‰еXж9$™ЫУ‹Нуже(TЉ'†я( ЗL јƒCЬІуФVкwŠCЂ!Є@:{ёщЫСЩйХйщiK„2pУsЛ}Л#šцQdК­vы›ЪH1|Џе Њ РoZ7PaWjMЎGє Аж5žОк9уP—~*DмЊr˜j,с§4Јtm№иќ†я!Bчr,НПЛНЗp uZK†ѕы=wІ_uhTH‚И!Œю/ЯЯк’у;?ш hAVT гuQMЦeNњ›PЬ5†АЛFJ†oэ\Ъі:>ЫЬ­‹b­З>‡А€уUŒ-изх{Ž+мяюьŸžŸŸо№ррlЯЌl; ‹‚ЃLuыlџ [Ђебх%ЪЊІQ‰КвI5†)Nsтд1šТтW‘Q†wŠ ‰иЖ|xШ,ХъI…OXgUN­kC‹Tќ‡jьХіЮщ]ыђффއœфиЯн9ВXXŽч†7Ч'-VгйжЩQїP-Ш—ѕ|\РLƒcdX’CќˆЃ8ёЯDY6йГюЈ9М`ЂxфXДУгUуёИ,&“*Ж4Ud)F„Ќ‹ZE0…ГO{w7_OŽЮPWкЯЅяѓїa^$њўьр№јІGГ4ќеГ!ЯPƒz’Ђ(вз‡ћЛ‚nXрЇa™—ѓ Ќ­ё sK‰$‰!Ас_!D*гтn(]Ќ!ТЦl<рg`’гz^'9B`^‚!С&уЗА5N#пж4ОУ‚“8PgE!њ<сxк@ў„ŠЋЪaUBq?_@МQEщ\]ѕhpХQПг‰ŠЎсуKlњTП ѕјјєЌХ+ИбщёхеPUl˜Љ „4Ѓ/фЙІц–cš–Ђ.GЄ,†Ч Аыd (ўWЄXmƒcч!ЖŠCИщлыЛ!L-E иdЋЂеЯŸшќќАзiн]_BН•žч[†|Н{v=”U+ќŽ])i5›УќMš ˜нІ5q4ЃwкеMlŽЩз vРDƒХЭМ" Вjj ди˜Љ {ИбЅX6ж`ЫŠa<_x‰ж`eѓМ ‹/ђ2“J{пхš•Э+Іг 2JгІBT Ѕ"b@4(аж>Н“]&9!С‰р›wЄˆž`5TxƒКmз?љАЕп2Аф%lf6pwўљFЫЖm" 7?(v’щМIт),фqY‹'Фш ,Ёа€rЏЉ1юг#'дЏOo7XƒйЋ|2,ъ0L!hMe‰Ь`HГ GнŸ_њ^ШЁ"; ПрZƒаЊ>* ˜-ЫЋY•`Л8hїaЖнЩ4X„M6qs"Ѕžp'Їw#Ѕ ”Ф ќkp?~’D$ўЭ*W^э2лxŽ5‘eюˆ—PП’g_в›gКXŒf5)qГ"вЯВРRCšcФ}КШ! цФjX‹RСБг2Ж,хўМ5ь›ŽхЇ$‰cФъ›lbЂЭY9›Dšа9Л ŠŒnЌ)р‰LПпŒ†/Нуl:1‘žХKš0цЉ)aБNŽqФ№rˆyN„у‡х {Њ ЃzЭ-FЌ n•fkTŠЮ1]Ь3ts№МУzenЏ(žYШs-M–yІѓBƒз3-№ д“ХУCуЩtї~РC>Ч’L›5р И‘0S\eуЊТ2ЦЅ{їF]OЕЖЊлрZˆ7с5ИН4Ы1.тnДЁЅА+F1-/)Šoг№‹ЃspСч­;щ|1ЩГ(№ЃЩъЁqUЎ}=„АoGkт†й4!™.‰2М›‘a‚ј-wn?ŸЃq9§di‰‰ŒO8FiJfАGhB9( ьˆ–uПРЋшfА›§“žЈЉЯПЃЈ:Q].ž€Щќq™ЊHѓрN”ЃЇГ4фy0ЧKЖгщm.эцнЦ‡ПЎšœЙк=9!dNШоИ}Гј5Х{$—7jР•щл JбclЫ<РЋь§-g˜цѓЏƒJŽј–8Б’Э–ијЂpМŒ …P љ{VТ Kc<їš’бŒыЬфЉЃз*dРЈєnћk_ђSР&XЮfc˜mвf:-ъ"quYтюЮ†’ьOp‡eWUv ˜–c?˜Bmђ7gЈ,Вљb5M,ЌŽп`R ?ЋЇ5x'сQ6!FЯ'…'бЃƒзЏпЕœ46n>m|<Н(n ј„<жЄJќЁ4.&Иё€б’,ірбdwLтдЌ№’соѓiEfкэeJГzx˜eŽk‘ТК&\ѕВI“A&hцrƒŠЉЊD}yГёfуuЭў—­Э­/-†Uм’$У)дˆ1ЩьiTMЋ•ѓ У#ЋС„Q.ч~d#H\ћ}і€>D€Фx›wЕjb[—Лч—з_П^п Г‡у&‡4E!оНХ}УiлšТьНом|ѓўжрOпonnl}eiЮ,Мј.!є`їxVиЙ…4>Є$ХH№ЉЪЂ†D‹)Шsз|a”xІnљХ O(+ЯP`СмДкНaчЎЯЫvsEŠ?У9‚ЯЊRW“ХѓЭ ˜ъ•њимК€"BMъ€Ј‡a:ЦМо4‘Ъуn,KК]FR]РMj0K'ГЩИЇ/Ј_бфˆя/VЫ&шDq#|eIO`­Чxѕ7DŸž`еšИ†"нН{§цЭыOBцycуэ-дЙКŸз!юX&€G•Г:PјоUЋ?И9>ОЂ‚еѓљиSNЖМ RQЙ/0šг-RHзгХr9‰MU!RwЈЁ%Sќ MHт Ь!жALƒlЊ:иFџx7И~НёцЭЦЧ.Я+†‡ЇXЗP€н) O†mZTщ›ѓ‹ОЌ:хtVy*гюI$ф/К1Чыf o—ЦПgY6ЉCЈЁ9N”]мЛˆБЦЪ№ЗiђаEНDjїЭ›ЭзwЏпРLя I#=њ5|ЫИФƒŽ8С]0šІ!УЪ<= Х.чs№AсњфžG XІ/шл” Ї˜ЭWO+lёhЊїˆђШХvlo@'Џ†ь‚јsЈљ>˜КЪŸnќёц7—'o667оьRЂЄA–NKРЪ=ЎФгp7›ЇЌ„§5–– ц5ЄФЌ†’"пОc$ Šdт€рwLЫавuMЂћmъE08xЉ0uPEшvИКіР—‡wз_oF”."НeƒЛb<1Ў<їІЁи№K№ф№0zыЏїѕxВ€їQхI‚к2 g ^ƒ[4XІ“#ОХ/КІђbК4ъ,  Ь•$Ed Œјщщљ.гЬйЬgu–MАЃ`;žЙhЊ|§іѕцызЧ‡џы5ІFZ’5МЇрxйlЙФЋэiНXд>”4Ё С–h=,ыГ4r_абћVЫ2{}rотdеіШˆИэ{лІ РQ7.›љ$ЏСпЙ‡ZЋPŽjќщЮєёЬєыcAй>uKФн€ИgЫyЎKLŸl7,Ц3lТ€b^ік/щўћбЅ$мГХ M•˜С€Цƒ†л)`œ @РљjšКыFMэmCFЃO^П~§ЧЦЃ=јV4СЏxirЩ|ыŽWPQИЦВ85АџЏцрYк‹Ж–ўnpxУЧАLƒ”ШеыŒxЈEy^RНbК\їgдЁНu†ЎѓЇoацзGчилЛ;ЃМШbYPЃa{:€‚&Ш-UГќЌЌ]8š$p(†Ы1д/рнщaO3Оw˜F™Чэ_ыg†g1їЌVгмwШžƒ.пНџ\љЭ'зФшїЗxяM…ВвДь œЏj&ЁŠ @жаЫ€ИeкјšT пцЯ<uЎ.к^І‚!IЬХ} UQ‘х$Х!НM‹eCИ#m^эА|њѕщ§†ыЭНž$ЃЭфp;?ё"Р$1e‘Ѓ ‚RuУŠ"У„ /ФДTœяХ6Cн ЕЯз;šуŽgЛ7_л‚ŠЇŠфœхe-Y=‰HЎ&w>olТњџ8ыОћуѕџ‚H}4eь?Gеi№jМmНl цЋ2е&INИЅPку–МЁѓ<ЦKYlxјз”њїNЋ3`иоѕЋ[9ф„йІ‚ьNАw§Ё `б›КpџyKH+›—ЃЏпќВy4Іj0YbбrZК*ЏZд лiї(^Сm<Р0MМЪ ўвЉЁjЩKс8№cpM/кўhРг…ОIfEhЌцv.Sn цј8ŽШ‚ЋїлЫaЎm;B6CHEMbрнж'1w'{{GW}oе–ўˆžѓbQЪ–I<'x,я8PыЦхЄ.S=AœпёzŽї1žV‰яАз{яіЖлzЗsoyьёћЗ[oРУ7?w9r.G }Р+ы†.єЎOŽЮлP(Б4о…R+}FoлPF`URсЖ &WH‡"3э‹{СР4З|ZІСрЫ;RВ€ЩnИ ЎrsxЕП§І}уэЮi›7`ŠЗˆ№В… YOЗl]шAЏuзPєАпЇ нй3КџѓёT6]Зћ­–srW:v …gFнvЛЫ(VŽ­2ЋJњВБ‰“МЙѕёЄ#:BіМ*6˜лƒїш&›щ ›= w<,ЧžЖОбІ­C<’ЩbUЭr“rкDЯьїўЛ!ЊŠa…тжзhcфЁЉ §ыѓГ›>€З^f„КЕБяї;:ОЄ?Т^ЊІpЈѓэ-pѓ#Ѓš,VјЛІ0•‹aЗxŠ}9>žQЧи;МXL3зzЙЭЏ^СZQЬdВјб0ќј˜з5Taps~йrд›,ё Хcv‚шhsыЫ­VЬ—ИЭJ08О›E2чŸ6Зо|`‹fЙюз\дI€”игƘ“]ь Я –АŠ^ювdŒDЭЋVфŠ;ЙЭ П4‚Š Zџгi4WСС›-˜ц.]<’ІQ⑉k7`šˆПјќю3W4 lM‡hЏЌЇkЖ‰_ZФ$ |пu~ю’ў„—Э ‘ЙšЂuъ‘ЂKPduxzœћ0Э2šѕЗЌы†nМHx*fЉмЇмЉч uЖш!=2Є!y(к<0˜Њ?Щ† iЖгdœ|"4D„дb ЁYŽ2ФOOГŒоћtB%фЮ=y%kE:ЂI­ЉЛ,ЧHСђАц˜Xрг"wоЗoHЁ‡зўŸц‘)Г? ё(€aQ>ž-‘ДYЊО­чd1…‚бЕУћŸ єDоЌ{Ю‰я/ЩE”з-єHz€ЗžШе0ЛO`5N4Ьє7bѕ$€ёgm~EYЖŸ–xˆБ"lфeТ‡= -дŽ r'hŽ сsМЯ@ууbŠ/iю^ўh _р7€OЌ О}Gƒ УzпууВŽ}ыхЅж н†Ф'—ЫGœь?~Zп=@мawё№0_Ў}ž№u yГIjJNR т++ТБЌsHˆFьЛЩ@Усз.a"тчєдџ7ƒ6'Š’Мš=I|DОИod^Щ aМ1ЖBкќ"ЙОПš5edвэГ§kМŽˆѓM"§šфaMтіHœљЧLћлwpЛеl:ЎВРљЉ НЖšм’‹sˆ ‹)іMMdІм\=ўiЪz1’cЫх§юічcмчАэ/+<Ќ &BДЇѕyњёђVгOмМџc dщyГœUY…Q”•уХггњу‰Й?<?ћq5/ ЪІВ§Й-p‚“у퇄SфћОсB^{їO‘–‘dxXЈkэ_BzеDe<­’РХ›:A”ŽкќDшwП§ЙB–ѓТ’EQр™іљq›gѕДЧмФ|X{а ШјЧЇiт†Ц–№ЌjfгаEIќE ё=^‡RфqрйиО‚Г,ж ѓ‰МиЇО ЏK/`1Я;ї#N№Аƒ%/Цг, ђЄ*p#Arfъ2^Њ'WыIЌѓПR@€езЧю9вŽ†[щi9ќг'џ\OпёN9ђV!!aчfШsz’GžmФEЖ›G\~OФЉаMr%†CрЄ–…ЋўR"ўi€ЕћPYЩ#жуza臆а<!s{uХђJšВ pœ`WЫ?љ‘'ќсi™*ЂмЛж@‚п‡жѓ;ўЛС2эг{Х АџУ=мбUн)ЮяјэoД $тUlWУ ‘эѓ˜ъ*"CбУЉxМ>ВFРё^<цМLMс‡­ы{FГmз2~#5-+|gˆkиWЋб4$ŠгТIHŠРTRzš$№ќ№№p$JК,в­rџA]Жњѓ ЇŸs†ЮЄpныЏ-^7Эє‡§7C3LЭpу ћЄМЌ R”ьдOп1r`ЂСŒќ нbyi‘юіою1#Š"Яt[]šUЏ^,IF‚хј§qZMЋuz}€йv ‰ОПМъвќЏЃЎФЎЏ0%=вШv&2Д Zймј!Є'FЏЏ,—ЕЮ!pэн#šч8j8БЂЊЛЧЧuŸx†SРЉпџі§i йШ1eцзВPѓІх!UXЌHеpЊЮH>џ3Ї}џлюˆŽ›ХдУмBп~љвІЉaШ’jљљС* ’р#‰†ДЁš‡яћпџћлj’c7ЩЏeVpOЫТЋЄє л1Ђю–+ТnќH€ќёoп&‰я…љd–ъ.†;Ÿvn4'ШКA\GЃзЌ п—Ё.аВaš†›рёИhŠиu~-yЖЌk v{CLв,Эы^ѓє§qœт%ЉGbії'Шšф“кЇІ/wwwі{œ h6Є[ 4ЬFГР„•Ќš я€ šхЌЉsЄПдшѕшШЭnjШ[щУїeщъPЊ—Xе€б+_’UА:ЋrG•јЮљёU“гШm*@еЋеš—ЌtMIn#†bcbљЮ_BS.рr˜ш7пJW’4н ‹ж2OЫ@Dšr­)$:зQR Lњ)Бњ`,3г"4ЂмшYСђ3ЄSГЌœаўУСЪx^+ёmцOu XMЗбhŒ|™Ц!†fњq„мK=F–ursцКžЏЙдp–c›*нƒŸж5БпUŽ…Іaў"JгП’nZRљ рбгPынБ„~Й†LSOЦ|­р.‘Ѓ+Т€–eУAЅ ЧOсw˜ПЯbМЦЃ ƒОVЫУ{ж4]зќi>ТџzШ&9GU3].SƒКМaЂГ†дџ€)ЦŽ*аиХЈЈš"ѓ=Z’urLgћќЂє,и&іпZКаHЊЎѓНОЉањe„З?XЫvЯБpВ,,ўц y˜§@д№оСjj0dqЇ\ІЛœЌ6оВМ йPжрћг, чРT˜ БTхи1ќRД8 ШБ‡О^Œ=с~od^\.HuŠёzY8Hш…ээTџђыZИйnyщьa сбцeŠфЎ!№JКЁёЃў€њЫ”Иxл АUl>ѕСЩ‡prT­#оwBЬ\–*^bGзŸ_AB( гЩц‡`5TЏиZ ЄлuндџZХ3XbiEKэ‹Џ>П;4У ыЧu2Gb”ХДDjMЈGФбХ+F’TrkNurРЅыЭ Єq]ЮЇH5Œйе0_Ш:§_Œ‘`5‹-це‡їчЌЌйQѓД†ЦOпђЂФІъРƒŒџj@xыpFЙ$<Щ.ј‡хlœG–н0е/c™{Ц€–5 {Џоn_ёнВ%†Ля$RcOf‚ї@CGGšOA‘B“)Џп–ЄП~РЏt{Hp;„8ѓлLЌNBDкњмQ +j`ŽЁj!0už8ђjИаTxхC3PЗprМФђцqV†3НЈ˜Ьgг2ё‰NЧш_!†Ї9žmС}ќ*˜рk› L]х–Žјƒє"є^НjїћЃбˆ•н†l>ЭsWa‘@RYІ‘ћ‹Бшџ4Р ё…3Ж7ыm2€ђИЙѕдИЊРвPЈˆ–е—н!УpдД<–MсыLыU—‘-/†Јч™Я`яјUУpУšьйAv=r]ЄЛ­VDтС%RiЫVŽ5s(.-uј•ьЂ8˜]~5шџgэ:ЩЏŽcлtUЎ†вv(LћіцО{‡пrЫ a2Efў 9{tњ ЫСЦЁƒ ыаuQ'#їž\XžебФњЗЗwї—ј-ѓt?C.…Idcї…Ю_ЃvžnY/тќC%З]$"’Ež“эЈžЃƒPwЗЗзЇјœЂи щeх#($GЉ _ІDEљї˜ќ к…bC‘D‘ЅGН>Ї8iѓАL”aЇ}CŒцUЭ/›љМr6R$Ў+юПVГъДШгƒХp4^˜ш yЭ/fMЈАTїŠ­Јn>™зЎЬSŒ„7nЕŸу;ў…c@сE1ќгHЖуК (Ж№_Ё pгq“ш<3‚аЇjџ‚фїЯ§Ѓяh$[QYТЊ#ЛŸ#U5ќЂ№ G4ЧŽўUrwџфќАg$AО‹НТT9Оoj7ъџЋD_4$г‚яGчВ`ЩЪ§›еvџс@ЦЬџ(Ќ)AVС—Eюџ-щjŒDlИћw[ё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяёџє TЧ59Fsќ[лЬsЧHuУ$Mlџё_ќwJ„џлNѕ‡2’дВLЧК`Кџџu&ь§IAžЅЁјŠ•щ=ИŸ]VвьЈœNЪj\К’gсŸнђЬшkшN†ŒТІЅiјWмWxЩ)†І[бx6m*_­ЌHТuыOиeќФwуf9Nm7Љ›*§+n†w9№ѓ)ђLд™ЇВДьDEф1Џ^ЙИOбЬЧa:'Дѓ12Ј,f“2rџ…~Э™^\N—Г:GКњВYŒCЅЯy9в[Žs_R ЕgќJЪђfхtб4Ы$ y\Ёј8~№_hЕ†г:PгЫ Šй4s4+žНГдм1NWUˆ}&:3еАnцKМpі§ёaIІЙШŠ"}ч_ејн3 n`ВmH<Чk~=ŸфD0ЅУЛвУ+цQ` Ј ‡ЧаY=ЋPzюсёћš…g:.PЛ&ім•бггШЕ5ОwпINжЌЕыfШѕ‡кХЅfЙЅЮЈЈ\4…/pn>Y­fиOШzц“ Х]"Яјѕ~Д_]KЎ8ŠЬоŸ_uњœDQrŠМЖYшw?Ю}ЃsФЇљммцхИlPФў!ЌAХђj6ъУ6%§хНЫˆB6]ЯRe~xuоІFŒффDLЋ#§gфУ/їv˜Ч‘pЮ„ШСRE (Ÿ ‡’‚,ъР†Мсињ_л‡ЪЁT’Р`ДirяŽ’Iu3фŸ†ЌбNslљњгW5@є|r-ыК“—‘оЂнdМР;њ„/0ЮWІ%Ы Ма?cHК„–@)ŽчИžЃQ”jYІзШБEќ`tлi_ья‹AšьEOеЭА.#эє„іk$эzX_Т~|\M"“тL7)BчЙТтЯ”febq-ZЗ=Яїt^vт4NЧ0Эѓйx\ІОxuАЛw№y т4 :Vdѕ8 ФГ+1ЃаыъсЧўU­ЙQ]GHёWйм•0Ч:лђЬДяhF8&zЅ€9HI` Н›ыЏЧgŒ'ю ыqRЁZ2?X{‹хŠ\~z˜Ї†Ј:0§cдгўЂ>іЖ`8Q=K ‰(™л^8XˆJ1d‹ЊJC"Gѕ;э‘ъЧ‰=`УЄ*’и•ющ Щы2Щf8г„Ъd1б ѓХЂ ‘=ђЏA|]бДдŒ,Т8oКaœTSТIЗШvЈшС34-ъvEњPIВ2 НЭ…ЈЩeеЏQ~УШз$€—Ы’p^ў%Fsšу'ѕ|:nЦEф˜*Џ"OкŒp^­рОЅђ4Э0ЃўА‰ХдзЂoВЗ—}Э -VŽЋй‚Љ<> їќслЗEц9Жi§СZВМЈ$тИрТM‚кЂЊс–s"ЉМ˜еЉЇі/іO.О^ЕXЫѓBpфЖЦihK§Џg7=jp{Ѓ&№;–„ЎfaШnB0ІmаПќ:‰`€;Šа.—OOѓа”Щ№ысœA|;Ї'—ЗзGŸwіnDлїC—‚“$О<ИНИюГ<лiыQ6iц„/ыћšшълЊ№"њ‰­0,Ÿд'ыO|,]]R\XVфVKФ­ЋЎЈщ ?И>ўВwХЁxЫ8~Ѓы[JEUXW†—ЇфŽ№wАњъwчОKЈих_GvfqœHЧМq‹ЬЗНДп€и1Щ#НЯлЎук†ЬS§лГkбёmzdљžУ__ѓЖЦY–…†f…e5]ѓЁ­ Г–UAЧ2хaŸф_yГk`9Žkй~’ЋС#уrВ@ьГ\Lђ@эо >ЪЏy–Ё+Š8ИщыЎбяiЖ%]ѕ ?ŠPhЄˆ,еŠр љ2(<=,ЇEЯЪњ<оцџ•Л}0 Ši0Ъ›9!›|X“o"Ы\ з7"ЬeтЃИЊeыšL …ПяЈšа9М u7$тLU sm'<.ZНІO› ы‹HГЊэОmќКхиъг’$ЉŠъЄXў MФy^-ЦЉжК`.C[•ёв†qnDZз}U^пŽЫѕ, &JЏЏЁЫї‡45БDЁEжMЧЁnX’jЙŽЃPМj@FŽsOзьx<{xBІ %НКa} Щ—gыПф*ЋРп“ЂЊP3сOЂвхг фЌђшžтОD PЪ0 иУk з(+ˆB€ЈqЙШB]Ѓ п}]Бђfљmѕ€\W‘‡rїDd’Ežm*Пb)%]3LдЬЌ›Едa‡]=Ў ф5Љ:рќШз9A7M‰(Ž„(Ты:ќРЩыєЇJv•WЧEЙя”sЈp UхxŒМRЋ‡х Jt”.§єbŒЄЪPИ~˜1,?7хфч•Яп5%Щ C@eY(UŠЄ/tз “(.Ы4ЖeЩ jА5еЮыDЉйdѕ„ЄД„#yEx;—И!;ІІ§tEаdI <.`6HEэдKY@bШLšR]S•Œ ѓeЉwx8лг8^2єn е­Ќˆ=™ "›$*Њ_юˆ Ч‹okfaŒž:БžGЋРжѕŸM14M†'k– šWSB ЕGЫщЖkYIC˜œœ26Н"Kг­Ѓ[У1ЗШC“ЃEMa,вю„EАw2џіјƒ§–ХЯ”Јд$ЮЯ’БіxЂ3ъu{цл `Ѕо^№ыiх+ 9Ў(›:€x pщž3(TюbћŒ‡ŒлчЎ …НЛ“P<8Ћ!JЖѕЊy|\Т_?qd‚RšЎ$Y˜?ЙУЧ YО,Ы"Я2В1„љ„Tд№A‹:uЄ#щt:-Ђ„ЩіnюhBОдўrмW П€"+DхўйНnxхd2Ћcё^.šе#ds‚ЁђЩ=S‘‘,ЦА=H‘?З9еТEE( LЫ ›- Э0ъљ•БЩhйLЇ‹yхЂdЄОЛƒгЎЌ[кэоQ[sг<&…–ЃммЩџ{янEВl‹ђ=о€Аƒ‘@Ш{Е7ехНїОККЋ$ц}њ‘ЭМ{Ў9їl ˜}ў йl~3hКЃВ"#VdFЎЅъ~… ;BWЮцы{Тљ+z› TžЯ0DG^њБтk б.F hмš-qcyГ•`zХ:3‹F:_4•„fšЂАЃaЗ;GЛ_Ўe'АeЩŽ“аZm rМ-—™УvФhК@оТ”<M™Ѓщ =Ž'M…c7mPє7.*”'#uїпмЏрˆ‘Ѕдd$hIГDmTлTс%Kь uВїљѓЇCк4ENrв$0yVб4UеНй"ЕЙ.чU :5,ТE`yIб CЕ;€Дh–cŸ^ЦŒdžЁ%УВa‰@>Ћˆ”ф’оYi/PJTQfЁ)PU.t‰Т&7мѓљьфыхжЉЂ$Х0P#Тoж…Уї8ЗhфAИ›'™ЎŽќ2ЄВ}zЌV Ђ)ЙћЭ„/g b<$О[mъиШ •х‘HsɘUUU”YшйšФГ­нƒж№њѓ6ыХЊДdz,š”Z6Šѓ@ШьšъгXx01G OpTUтўfЌШю  јєjчm;+CGгН„ш–iп…†ШЗ?Н§єсуоЧн‹о„…ЗЯвЌЈ‡гz†gHщsB Ÿ2/jЖm˜(Й#LQђбгŸ6еМЂ[`ЭСЙoAXрY†‘єЩ§ToтГч/>JsЈ—,k@”вD%*0чoпМ{ћюуоћOŒЊЉВТє'Њ‰о5]˜W7Ћp!ЎšдТПе4Eер?Ms”ЕwН0pД'љгАсщЗbŠ0ˆєˆгТљ aщj§БГsъЯ ”PpёнšИ•š$ŽШОМz {_.F’n˜š*ŽЦ’ъ–u 6›žŸХСќžШIxІТD2 RA Е *ПxЪVћ˜уј8н Гzɘ—ЁЉЪ‚ЈЇSCіѕўxљтm?o№lЮУ”Ює“HИыї`єыW/?|НfPr8PœЄAUQ(Э€пsфэМ~љцЭЁ†J!u…ё–ay'5yІЕїzчеЋ7ov^}Й…нЪPЦоƒ†КкVTЬŒг7‡!вєЃ рВ™Ёіj˜Ш?Ъ 7ь ўсБ6гКeщТxаыuлн‰Ќ‡ѕ’ ЈSpП ЯvоМ{џсг•лЬбьЬз Ф‘ЦŽN?Оzљъхы7;/п_1ЂфВ’y> Я@-^Пs„FЏPc€ˆMЬ3€†Fф@џш-РЉCВB†оБ  ЉД№€jƒ_ГZ$з/п|кŒбŽg˜ЧчUЄrЌjLяј‘аy.rЩŠj\zпoO\к~бЃOО;ŽюˆtРVй-bCšє†вP'USђG{ЛяŽЈ\V[]Œ|›:ЈќM pMpљбV;Žял(џЅ Ф=$C?нуkЂLаєЛ‡ћЛŸ>}јЊЂю28&@Н01Xцъѕ‹чЯ_~КP4/CШpd|nУBє2ЋДѓƒ“УЇйQюР пž&гзWЌЊ^ŒХМ‹л‚ъ#§ƒq ?!9-д#ƒ4TG1Г­NЫвBmМолн§єaїуm66ЭlNФнmAИ}FџyPKVнМє5lŠj†’EЦЭзƒУУНЋђўлнЏ–u ЫвЭчK€Џ3Г‰$=ЧЖYvAZё<лFCЖ2н\ Yb/fпеf1Ko_~њ№ч‡їЎеЊЊбdдїeaєѕѕ‹—4@)/*kРЫІ“р&1Ф‰Bo}ўєёѓз/§Х§З{RжЎ—БЁJЬХщDRt#Ыв$KCЯѓЬЧ•]№*}ЯAЊ*šсdХ0-',›m^.Щn/D9zчУСчн?Оюg(Q{P­Ї&‰н—ЏŽ9ˆiQег"IKlRhъЊаoїw?юхШщ>юPЏWЉоu‡•QунŠ‰§УРЗє†&ЦH­/ j!"AЉbxP„ѓ…чCЫљмxџієlянл?пДт"/30€4јК‡oо EбгАдЫ‡vгзћЛО=uзwпШо:|Rё™йХ#IКФ€Ab№mяQ™|Є"гЇmЃ^ЊЎ)|”т˜ F7и‚„g‡ю—W{‡G‡_>~Іe^"ИFIaYeЎN?}:<˜l8~рЧYYу2-ЇоЭощсўббЧ§њюЈЁlTщ!щЗЄРЂGвYл ’4CЅЧmЁ №}ˆр+Сv #ЇjeИ „r`{pєъЯg_/ДjŠдБ.М^ЪэСщў‡wя/) Х Јж’ЂРЪ†ўДw~|АїўЭЁЕЙћыk— Ќћн"ёЗРЫКщј `'п1?†ЃБЈъЈ‚B\РС=<КРŒнleНЭ,Йzѕnї№фјœNpГ4РУ“~їђг—жљЛ—ŽO[ Љ]…4˜ЁИ{>ќщшЫЧ7oКГЛћo˜І6ШмЛРLŽkТжU‰|mЙaQчЁk?~є,ь ФvНž{J–в‚є8’?šy-|§zнiŸ]ЋХl>ЋЪ" <[œПЗїѕѓ›з>љђх+ Au’М@ХiхъѓћЯЇ_п}’ж›ПО­О‹]a1ДФ†‘iћ†,‰№Н~1+зz4fjwu`^1 ЦNчD> Mž‘ЉFгcЊ3bЈыЖEх‚h\чYhБ_?~ўМћў§ŸяоНћєyя”CЂлВœТHф›УЋюй‡ѓ7ЉPТkЙњ~ЖР€ЦC .ЁdтžvКx;TУЏа1цВ`Цj JЙ7•ЭУэХЊф—„пДШ2ЋuttzђщЯ_>ПћtбЪnˆ[ђ%J”Lw8О:•`3ТДx+&Жмкп40нч&ЬДфcэm]œ]wa5с_`…JЭ^˜ЂїvЖ“ЙО0V–љ†цOg˜_r›m_\_}§ђѕттЫое€Uь0%]xn'2CScБ ДЮK‚bP?`ЕAУ„ ‹|+ XzЮуњ{§о˜€gћ9v”VIр"ыБdˆ5 ђAV48z<ь|6 XJ‹б4ы\ЗnOŽnoЮNл" EeЩЬыHѕ8нŸ-)\еА6 жE [o5бАЈ™Т„?.Нршв№…Кa‡ХЌY-Q† IёмhлiеР“ЄAшЊŠ•eЂм\єIцИIЏгК:?:НН:ЛЁxEсYvtsMћгEн‰$‹o8НKд*в,Ч@>‡зЗ…jІSTpЈуРuЙUнХН @ AŠUЫЂN|ЧV9ŠfЭŒqolнЯЇ~C/„Ђ_a{эў№іМеым^]œ~=Й9?О–м\]\ŒмВ*S‡aЁx[lЯаРtdРŠЂ†пѕxVтJtwЪjЈюьр9квпЪdЫЛЇ­‰j'5Рm8ЋГШлŠК‹uОїљшфрфь`яфіьрєњъŠŸ^,:€7]лƒ…МКџ~к / Рœ9b*Ь8`”йj™;9uР—Чртž˜@!>Уљœ•‰‹Н>ЬХЇЃ‘bљyэƒ РЭl:-вх/сM˜š8<§ѓнЧћЇћяoN?~к?†ŠOŸ!OСžЮ`Ннн?L*5d~ rnбЄiQ>[фЖJchљИa3o9~ Ё0r•Р мeл_v;К Rз@`rЋђ$HцaЦ‡rzМUж—ѓ/ЏО^Н~љў†S лѓёЖQR€чЎШў6JфСdLcKХƒq‹шcсgЄгІ‚ЪžъѕhŠ'їš…ŸOЋ"‚лвЁЂgћЇ‡7’уИoWЮp!Ј‡%тб!ќv]ЈфіюЋз­ƒз'­ƒWЏ>SP@ИJ"ФINvхI?,Т999${n2*С№ƒ>7ƒ—*Ai+ ~„ ЇйAš НHд,cSЧ1УЫУkбѕ“йЌŒ]7…8щБ(!јЮR€ьнšЦЕі^ Nо^tо|КE\я‡1V#1Dјf pGCDgМJVBiXŠоИŸ­Pч€=ЎnŽ:TjјтЁЖСцМФАhБ^dŽ"ш~ K} г*Sƒ! xС‚„тИIэЛжуjDAзЅсщўq‹AЭm$ўЧUnУj‹_Т5ƒВ™C:€_%˜ АФs(в+š48~ѓсьІ#шŠžC ф{qБќa†ЉtЕШ}/œ‘љЎ)QћGбH7№јЯД!=ЛИООККы)АнвдГPˆ“^TЁŒ(ќ з(БbМ!ЉВТы[€ЂS ‘dkШ04Yюю~9ым2 BЌBx.T–Хw3›жрзЉ­S]оРBдƒrЮ2фIыф№шєьќђъъќфšжE<жш>'УлEYm˜\єhеP˜67YбнЕЙ!ЩР:Ф–Л,УУЃu‰~9Ÿ wXрQB 5рУŽця\]žŒyы~ŒёЎ)ЮOO/n:іщС ЇYіЃ›ЧPжf˜ЌB‘jžvв:И сY4мd†,œ—5”#0з@qйјѓќhrОЫAмTlћјWрИTх%ж8ѓy€бCŠW™СTCjdZgGЧ7C†Ё;чзиыi=ЖS4šхO 9щ ЈбхйD–Б‰Ў,чЫ:KЫ  Yfg)кœ`k&Иџd"v;"<6˜hмЦШrМкяЅЌрСЄ`Кзѓ0Ї(2ЁR­у‡ЈЧ$ ЯЮл{Да*%)И§ˆvlыфќІs{~~|<‚WnARЈŠХВ‚Љ+sФgyIмрEрш2$"^Ѕ/њŠLv=‚MсбЪ~НiЮ=Ÿ™‹`vt{=`в=hэП?Ѕ$I'н›ѓЁю<^‹k"Hdя^U8jL3tћtџs[’5МуYх%D­j6GoЦ%V€б0"? н‚Ъ_YЗРЇ}xI’ЅY‰ЮVзГ žгеdIпžœ]|н?kїћ—{ŽКиX"ˆь жуыкgCм\ƒщж”Š Ў?юSВbКРЕЂ€ЪГФН LК0})zGИЩr\C“tюj ЪК]ˆј4 МЂ#ж'€WЊzЙШгПэЉёАw{};"тmŸ|Q еяGƒ^+sSЃ{ƒag (ZXЮš"/ВЂ†P=ХИŒ†H ;А й`Ю;},Ьќˆ• x`˜›kl ƒgž)ŠСИxˆШŒ(§Jм0-€цТЃ[8ЉЩЈ{uvvvеъєћc›ŒmC8ћxxотХ/f „Л(Љр Ясe3RŸ€gћ†ІwOЛ€КlH7№$1Нмi^KŠŒі є<<еЕ(QGЦgHК‰з3ЧКPТЂХбЬв0†˜=Ÿ'šEЫBItўщЭзў„ -DдŽЅыЪ#хЦtH_›mC"†вМ^,uŒxHхЦ ЬЂ™L ЁЈШ†ЅnЏ&1‹\ЫЇЯЎЛ&€ Ђх Ѕж-0­ЂЇ9o•mпєi–Œ:gЧCn+ЩФj„хАтё&К…]И`Ђр9^ТvX62?ъ Ч=_Lёhх<›z5Ј) ЃРВєжyoд7Ч‰Rp|Ь™P0д3мMЫсS“lж$:пЙ @Ќu…GсiHh€ 1АдуwyЧRH4DnOsжЋ)uИ‘Р МaЯBœ.r˜йэ`№Xм2M’кhйvг77”b†‹ѕj]AyФs‚,bƒпю‘DT^x|91Yšк{ОГГGћyЊмНнљ|бC+p<ИN ”:“lк”I^ 8ЙСѕPM€`ЋхМNlMѓЊљйШл bМС^ЗEУ)№\aŽнŽ,У“Ѕa5›хžС?в^бЌrШШяŸПxўъL ЬСбћЯ?^07uд`t‚N]a6|[ˆЁcQ2Вf{ œ{ b7‹нЧыK3’H]Ж9гŽxL9OРWЦоЛ%YыІŠ HJІHMв4‹мeЉћцљ‹/ої-ўфнЫзЇ,Ы)Іp< Ј!рХе“йЌ4­V€,>b8цdЯЌ.CK7ТiъXO€yУё KЉ–W,№№ЌŽ-MьœпЂт8/™љЂЦД +qŠGЂЭМt(u†яС=^М:зЉ`ѓЫЏŒ(Јк р6…gDЃ‘ЊТсс%g'€кh†šš№75юЅТ›ˆŸtЛHР]^Gqеl6Kь~a;з}дё1‚Ьg)nрqgЁ5,+K“eўрХ p=ЉџњхK0њ‘АЕ”„iЈ)!v ЊšЮЇОФRŽcЧ}l]rrˆ›… еŽ‰жdѓ§x›ШS: гMыеfžк2L У‰Pw №ЪЛjІрžQюAv|ёрEUЄЫЯwžПмО€™оyuЩ‘cу rЦ„"А fѓв'эжhмП8iГŠцсЮqЄ n3g5в;8э1€„“шQ‡DEЧWС№юЮ.‘Р#}Ъ †ђ+„Њ І0ЋR(Мт€ЈЪdŒ~Оsv№<њХЧ‘ €б–С;'Ч,X4ЫYсŠхМ:e6qчи}yбjуЬ?ŒBб§‚l­4Ћ%ЙБЕЌЯР’HаЗѕЄ^­*XXрЇE‘CaFkЊxєќ0њxџХKlFЅ$I сb9^у! 9-\”9=A‰Я2НЂ„hH`"7@^ЗЬЇpЪ№N]Ы‚:"Ъ­жг@'ніь„ЦPэ@&_ЯГЄ,нJжмGї04M8xбcчhмcgчгНЎ[~’‘&ЗК(ІАцђииСD-\ЂгšєќЭЫџ И'ёr†a TqВQжPЄK€t{ьРUJъеЋCHРu•zXжРLГŸСш;‡ћЯ1ф}шЁ|Лnš. ˆ`uНР—fI<>І8dџ_–иПYŸ9†ђd*@YSфёѕuOO9ЎŠ;ЃСm@Q2…/šххbНФƒlмš64•BŸFЃџx VПmIрЗnС“%юN/WАцфmb„E9#;н9n3PjbcќгЏo1є№т№ЊGKŠ@•эЈ x,x‹WR%Х џO‹žrgЎmmO\кoС;ž??<Ф?^ОmС"Р+ЖхцИБSV ЬhfˆxtŸ‘UX…•>žŒx›їiЄуVщJ*nЎ{]<$T5AfСc: ТЫb5Џ›eSЧx ‡<мбЮš{t1фon^aŒ0 +С6–щT‘ТXQд\Ќц!7eф&ЭB-'№мgPšЁтQ™я{Žm( TDw!§r,/2ћоЧY‡ИЛ“ЅДп§ёќџD~rБƒљќе)'Cљnm˜A1лњюК $v4H‡ЭИU6 PС—a8МѕУїєћД•Ї Q„\(ƒТ–›Pр <ЧА‚ьM +ЩrQљ6ІЉЪ№ѓЮs y/NopТ_ьь %вcˆН#ёM†_uЈ№“ *ТxкЄu9P`iфФЊѓaEК>Ы–žkŠ :Д kK†`ЭPЦЖ#АšИ4d–ё>qX‰gнW`§ѓ?^г^ б1‚ёБaЉNt‘›LDВ /JФЊHBЯЖ!жУЪ0єЇРвэ€'чG7 $DŽбmkРтЎJdа9V”ƒmи,#у4иИcСщХр-§ќљЛsz{ьk˜NF:ЧзЋYс(ляs’„3+е%‡ЃiфйА˜ лxlђџ?МйІ0зG—нnLЎ[,`&<СvЯёcNДgиP}Fюрow_!HzётхЫw}nƒФьwgnС@.7у†tГ­›вQdіъЄMMЦCШИGc:лfoEUл~2Ѓ”jК(ЄЫњ#ŠцEž*n фГ!”ŠУБh”XŠmVБc)УЃЗF1ЅМўpeИН/_ќ^Нѓfџ–Ц‡5­Œ˜МZ5ЙЅ*TЋЯ№<нПОИМqŠN†ЬŽiЩŠFєїP Л'- ]gXЋzZe!ў;ЖецД їФѓ/(нoП\PnYњЬезїX @yўЕЫЉІсЭюжЄнqAE1f%Мс*ГУЮэMk@Г,Нс–Œ8їžёШpНC‘тх7€ƒЪwžže 6ЎxQdН%#YBЦж$Њ{utx9‘­ ЏОм?LЏЩе–WŸЎхЮœДXу՘eЊ­=№’чћжlЖОЧ[2GёšsV‘v3‹"ђХІY?€с„T‘0":$e"l…›EъYИ“ќƒд5#ЄА‚)Xі€ћыјіёзxqйŽj$АЙП[ЭНё@-злыzыП=dK—FЎ”aS[НМ[.З,HТD(ЏО}ƒпјШ””Z uбВГŠЅR<%„/h3 bГіr^EMјIА sšфxезъfжйђooХшМX#с"є FЋб|4{hмЯ`Ю“БKQbВ7>|{Ил.'reŒЦ‹c сgCї! HЁ—й€Q2лп˜ќО/ќI$V|ИGЃПыa.ц‘Ѕ2?ДFДll№›/ЗэУФђ-љ^B3€LыяtRфЌ™/lit~иЬhњйmp{"rOмую? ާА%ињO`52-Ј.0RЏWи [MБ‰qЛцЗ+ѓn{˜Д}|ВІ m…iямнП3JTЯч‹э­Р5љсћэсИ2uнЏП{9~м ВЈgџ8%gX^R уq‘HЧфGiйlПƒМ№{dЁР%JžуnUК$АTkџ§~—Ё-!T7лы—л ABqŽИжxЁяƒ­Ш!АkџЦ?V'ЗЭц9"дMn\­ОПыЛ ‰їп™?С™sУbŒю^œyFі‹)6k6K\Ф“ёщpљоп/3яЗGI^ЁеГ4  ˜ј)tы<^]+ є6ЈgE@є†VЄњююЛХл?6w"ІОFЊпQЏ;fx3šТd‹?ќЭJјpŸ™6 @ЩІеМ)АƒRћID]Œf9HЉwЯ№Jv „х йу6пЃ,Љ{МAeŽMбPжєлc†–&Я2№qфшйއo+_‘hZРЛШ(Y“(§sL~FD" l5u,ЗudИHy‡Й„m D†3lц.B o\tnh–3у$rХйщ1:’GмщћoїЉ.Mzю‘ЁрїВжяOГЦXP„{Iq@]Ўњ ˆS[—†‰ўыЁG\рО*ђќфКЭВr2TюЏЅЫmЬ!^tЗeь]DІТл—чЗ#AЗМРбВ@ ј^m€2{* Žѓšћ;Ш3d ’МvG№цUd€ЭЬѕЩˆчM[цaMŽЦœфЯqэ}ЇкќіА] (Qdvtsr|M)Іe>ОЇэ?ЃоэYBcЄjЖHчЂ`$ыoшЩлЗЙxCЎ&C ‰<;9>ЂсЩDžщЗ[зN›mDЧpsGBф=оЃDj‰ю]œœмLdU§‰ќІ‚ŒЌvQšFkщЊШБ‚6˜ЪюЖ. жпmY—ГФRazЙѓ;˜оЭmЋУzNа оa€јбLkМ‡‹bU…І*в?ŸЌW1LЧ œfdFс%Э fwпH#9fЂнХВ‰ ыхњ;(z?J •эip3УЈбЇ9і|>ђІжП>:Cš…Rз™‚Ѕѓи1!x“ЊцўлЪyQ’u?ЯMfњЫзі!kр§Х)a– njGUХQ{ФСAeЅ;Q‚tЮ–§ЄЃЁџrє‡у F –пšФ$ћхFŒЊпж>ЖMЫŠх‘.АуЋKtМКŽ‘ф-ёЅ‡UЌЋŠHu:4Й"pšœ7H~є+lв M {mJKюП-2Gd˜[-jаW7ЉЪQ Rxq  мЈFы.о'gcІ $œ;xцЮ[МdS.т%BMtПуП6K€бэы‘Q}[gОJгЌЈЊVК$hoюJмзjКŽ*3=˜w;,Њ<ЏцKRn‘ux—ЉА4EžЖЧМ(rн3 бtѕЉЛАип;щuigЖ:ё’bl}ƒueJќЈ‹НтЊ&‹LŸ–d;.+ј5[’тrЫ§Зe.% ‚DЗлЈ 68ПтpЫ§W 3Ал‹Œ/ч‘IЗђЄЅ‹{RJпЏsCf:7н Ў­P=NЦі%lзЋ—лp‡ЩЛxъЎ[4'эГgYљeR4’•КсUMfq7чvд%г5fFмYB^Ёћ5)šœ?лq3ЛШѓщ‚ i’†šЗ‰бnІ}йАЬЏkУ:Ј‹fъЩнУsВyR- „@d§Аˆt‰Ї'5ъŸ~|Ц фЪ8i<Цz}Л‹ДšFЙM'‹“›гDа_,АФPХP/&sЖ{ ц !'[.ы" ;[EŽюІ ЕтїрдЋг4$Wˆ%цъ-Ы†mAВ’ХїŠ–lšтЭ№"Р‹ЗP^L~ɘŸfЛI= MњйћЏ4”ŠqГ!œнжЏuЛžH6|6’%Eƒ<"iщŠВфS˜bї&6~јњЏб4јп‡юxqˆw2?\ˆКе‚KЖkо<2аО­aЃ(Ж;ё `щjЛЫБn цЕ-—АзUlъџ”ђ–bЙЎI={іe^­жИ#z‡›[нo–ED8‘=GУ„fiz<ЂEIjВЭЫУЌ*#MѕSяяšB>кАЌЇЉЁ8I=Rбт— к‘oкL‹)2nъQ;лПъЛ}еЖНb1Ы,3Шfѓ<ќ7їа‚Ђъв„ЗТ$“YИ “ЬИЪТ­‡єЛ]9m;з`›AБйLГОѓё? жіPŒа7EХŠ2GНЩyЌ№ŠyфaSЇ{3 ŠФ1‚љrъЈnБОŸE2oлџ.›QižШsКЅЩtЋ—{nГ^fЁќьYЗ}гRГ*ї oКœЊ;НлŽтdЉћ#LKOœ&%*oЬ_эRvˆЂє‹І&ЋaPf‘‰rtg”_жe`XХj‘{ё|нФšYєtЂЅ'ЁŽ,zHe;orп^ˆq"•ѓйМ†Iіќф‚8uG-#№ГЊЮBѕќZ‰ъ%Yƒ„ЦшЩъи‘юЄГддф_Р„№ї˜(v<ЯM™ ‘rRсy=DЂtфkCСвiy–8ћCЩKcГпwУДЇёЙk!HыљЌ!7ќрЄѓд”$;jцОЎЉм/ЛУХЉ№ЊЅЋi 7ЂU—e;CЦOдямjƒžƒwQЭ№“PВ~\ЂцЃбoЛI’ЇIЙНЖњ№pwЗžњІM7SзPdўW-ъЈђŒЪdНщ>ЋК pcЙТџ5г­nŸmл&ђ({Iт+”йМˆ|[ИИЕЂ8ВЭdЖх€С@Н(‘и МD—dсз=,Rђ\ LeMw d2Ц‰&аNЧ)жuгFэмШ{b—™яjуƒ#ˆ;ТXAЃПпЦьИК{XчЖЬ‰т/‰Дс†љМ!"аыydЊT‡`VЏ–Ћ;ТАЙвјіќтК;ЂёТ"@sд’§Иˆ=‹ПљВйО98Y§-‹pфm‘Сг<Яџ‚•8BК(H{+фИПЏ=ƒэв*ёh$FП5™лЫ›NЏuyzоЂu(j"kBYAš…з>o1ŠLwXTЉрБ%šzи ЕXэ(/"ЙРO7жU…YЩяР!—Б-SЌЮЖd~Г"4FWmЮАmCšєnЎК‚…Я9A9|ЛЫлA†т†ды`єђ !/д1x…\ЉŸ>е=ЫЯJ”‘A†Ad4ЈSеƒ Й\VKˆУкшfЈЁ<Ѓы8ІТ†Šиы‘/wКяGi–EŽэY5]опoY­ђ—XaКэDџŸi4…В‹žŸЈВ$VЇqJ"Сj=/"­w3БfDъй:ЖŠšІ6УЙ~hКJ№z ѕnтлN˜Wѓ5*ЄуMapьYьйІЦї:Q3ŸJJТ&-X‹Ш,ŽJ„ y+e=Mєо5уФx‹йѓC”rЕ MЗёФrmЉЧЁ`p'1д”ЄеД!|h„@mнdО Р|"Ў‡bg?бhЄ‡UХ№Ћх–ЋН5aFœe.нfqЋУГLл!ЪС(бЌа7Э”'”b{A†Ж$u†Q^еKг[–ПЭ<Ж5I”MЧ‹ Д[цЯГEEdY– П^Ћз„,Y=›вћДФBF!зж ]fGзЇ}YštœЩЦфiVічѓ,є#\„…цz™й†"jŽgE РдVФfetSЗќМAХmЌї6[&(ЈЉЕСШ"—яvк—эяј˜ЩИurХђрЊ5ф…эУѓxiГЌ"з™Џю ЉЪ2 ЩH2YYHшo’бcIе-Ыv?Св‰х™jШnѓм™є$?t%š…бM›FM™СˆUФNпєl\DфК#3№у)ввљЎŸMgKpgLцЅ)Ыfчu•ЎБOј9[яVR 5{Aе2ЮjIHŠЋPаNш+4ЏЊ7h–х$Уvzdљ PhYц4жaƒћ“ЉяyнЌяV˜gО ХкRпF:О"SџƒТŒ…ть>Йq]фEе Ч ЌЅMSИмDё|‹чTзV˜Ю %HŠэx€œXˆЯАу(ђС T€ГК†pс—Гzыi–OфЋ+уШwPYCќ ћN78Auф€ @”PЖД•ЋЭjk n(ш’D†8:9(ІуBšqІЋЃŒC‡Ж a;ICKWuПЊBSOf ј€‡{  €\w›Х”аUрRќё{ИcA–xžуD"aлžpвУУуВ ŠЦкм[т;_ކx/•ŒјД$i`IМЩЩеЄ‚+ъдUrЖК‡—Е!Э€? –”гВ{Iі>q‡шО‚5i@g—P:І:ЊK@NFњќЮбюћOŸїЮ@Њ—DОСPџ{пйU’lЩџиF†Ц#$М-•7з{я}]SVѓя7"‹žЗцЭю“€žїl53аЂ7odФ‰ЬШs8€*ЯщгEj’“зЫЧеђJЬ:јŒъ%oxAфyю‡ЄQњ2†;Щy млŸ6DOь­VIŸN]M”–SщBqnm‘g‡'o?юк;ПЃe;Š}SцОXЖ&ъхj–˜ЊBЬ[,жЋEыNW ЁЙƒж˜a–чž_žЫ:Т5Іч—ял в ЋoBмОКЗЏ“Ф2ŒЊе%рbˆХЄrQENœžљt$кNр"')šp*ЎЅkКI9'T№ЕЋ C)AОwбcP“ои3m†и8:Rаp(ˆ"JќbNˆё!),”{к4ђ1й,цГЊ@щё0Р4QтЮОД'­§r#рeUŽђФ1єKx^Š№ŠЕЬКч­>% ;Ым˜G=д0yfZ”4'+b’Џ*204ъ}z9 X.чТЛW­ИЪВŒžЁš\™ЃќVшZŠРœОпюКв‚qYжь$ѓ,ЇX,gг8ђjŽмWГ@уюЎ{ejРЕPьJG7SžЧ^в“5ЫЯыЊˆ}ЈD$žeY^Pt†‹Šђ9їv{+сІDžЖ.1 УtC"Ц'Оž~§ќёѓ—#Tr†BFTМ< c|)ežfг’Ш`”ЖLЦMD™Qђ!ŽeŸх }rЖЁDG• €Ј 0#FБ+pgДКЂ^mН:ѓq“%ЈJ"™Ž:2 ЮСЛЯћ{Ÿ>\оLP P`DeYЃ@&JBХљЋb0Е:&4QЩ3-‰Їt tљ9iБЧ У с„x4ефž~6KvЕDjьеz:инйy3ЬцˆPiаbdeJ}…ŸНџѓеŸoоэ]Ž)^3‡Ј<Л%~oUBИ'жЙу+_“ еŽ†œ$d}u”QH‘žs№…›U:pD „7Y”Дw "П/к;Л;[R=Чух*vрхКI^ФЯЖіпОкyѕъеЇ[ŠСэГиТФagDЏЌъ)ѓ…žЏQлЈ№Сѕ$є;')Ёт‚п‰ЌˆœЯ8cф%EтzЧ”„г IЏ)CЫА‚E №­‹;д›yu Јg–ћš ШVœy;:yџjŒољpCб Џј…3ЇXYU(У[['o ‚лѕ’o01%”АшyUУ >ўtЃHь-Žякc–e”\Фe_”Э“ ЊBd8гЛЛяY;OГмS9VƒЇ[ЏёvЗ_ŸЃ@—шВТb>LsT№ЎЂЛwіъ"мА\Ю›В€ѕœИHГ‡RЙLыќvШpOЯх2ф/Й<9ЈSЧ’цN Šœ/Qu оБ,ЛЛЛлoпюѓг)<бВ)™ƒTc'{nэьlПкй=p<'‡…ƒo]БСъ мŸй{ѕК[m–М6м–€z†АЧCъдІзёd›_D:еЖHхWЂя*‰ИлБ@ЙœRov^§љљр§ЉUЁ:ѓЌž†КЇKп|~ЕM|чеч>a#KвЂl†`ѓЌ6_џљКWп?ЂQRYdЖ Щ€b †€‹HМ—gЬДЁћ€Fa)Ѓz Њл[SЂ…Cф7ц рК)џnч§‡Ÿ>~lc•І*“8Я ШэьэlmяьОџzŠ"ѓz\И"=fƒh з~ын›зo3Т Iі|ц…ЋЬjQ€P\І\ч4ЭЇ&ХБe… rdCэмФШ Z’џІYcюю|xћёрPЎЫїPQ:ЗyЎћсхжЫУ.ЭЁ"aZ&КШЫf–ГE=Ÿ>юН7\’~мёY”О!QgћwxИF†ЊDOўЉы@š –Еi™ЈeЦ‰ЂБ9KЦИqтѓ&mяОћєщѕлу/зЩtњ—еЙ+ђЃO[[/?іТ/›у13nЪзPB8OONі?вKЂr€0f#eф—S Тk8M]гДН0ѓDE(Р7YžxPЌИСKВ™`х9#ТИп !{§њ§ћЗЏ>jX LЋ"KsXŽwёzgїgЂEžфvац"‘nOО|=йлSюWD ц~нИŠ(ŽЛМЁ"Р/ŒВ ъђ'їІŸ Œ™&ѓ<ЯвШЩыNqoއYє–ГкxП >§ўгЇн~Ze‘:†уPу…ЮЇнЏŒ$YQŽmN5ъЊЮыfZdкхЇ§OћчЧС§§ЦшеКВ0—3ŠаУ‹ ЄИ?ьЇuƒLL$№KC[GЩкЩž†Чі‹ПДЦ?мн;мџ№ініЉ‡Ш#w]3mMтяпМ9ьBўtqЛU UfоэН{џёры^ЇО'[ыїїЫѕЬGu „‚кЃщ!нЧОѕ$ЇtЧ т4\xpjй™Шї˜уўњG|ўъУсЩбсЧн/f‘!ьАd€Џ’2Й<§МїѕxŒЩдЖ,?LІБњppјхpяѓўћyБўіАDmЈљbU"/Ћ FKjƒ@‰4oš2ђь' рŽ‹эњ!)u‰ЉnE5ін›бЗgMzГћъУ—ГжЩы3ЇТ=О"4%NрйЋƒЫгН7oЯ{XЋ)*ЊдNсE9vvyяцЭm†Š#и „лн‹fšРЂ7 mdЗМРюМŒ\чIFPўФDжTKг8ŽSTŸsВ_Х№ѕю‡§ЃлЋ§v€я>ЫђдWщіЩЇOз_іЮЯnКНоUPA5/ВвНм;§ђљќ-nБФ3 Т‹L€ЃŠ4 ЗLЕИ™—уъO"~œ#‘ТFКWHx5™_TѕБs4МвŽо_]^_ Нi3Эp™ЧŸо?:ўќіzТбѕHsƒJš"ŸкчАjПОпљъЎ—ы‡ћ.ъoж іN‚Cк–щ†YнdЎэcЦ xN^$†П\пьНюL7ВcЈЯѓLВ,q“КЬС#‘ЗŒћщbEm–Ѕƒ%ЊzЉlgЩЁяya ЂBiПwz~лmїT›ЃršЁzю4З™^Џs~tryy9T-Йра–+Љtўљєюц№DЧЂ–(ЪЭёkЃЯ…Ё~GФдыEхCеѕdtкцД(amХєgeтBN‡щDPссgгфњ№ьr4Љ‰/0ZRBvЩŠ,4љ 5њ§‘oК€аQNыТёr{pнэпоШГGВС 0œŒКV5QŒB I”ЃжxРh=НН‰EрЫ20Ьыыra< $нv#ь”†љЉBmвGДžf.7ж!€dIšxšaƒMx3Цї‚5Ё#№aЎŽЦдd"Ѕ+Bљ hEьƒР#ё5ƒе‡o”И’Шq­џєJФџkŒ%%•}ьllJД™онмt]ЗS(wБ‡7 ]“8J ІUЪЖiЂа„ŽaиЖ2a4/E1ци’ n"‰Ѓ)Ј+4z…Y>жAecлѕ\XЏ%Жц1іj1Я|зБŸvг№a˜п% PБЬ4Жsq~q|УШVВ‰&5Ьaž%žnРЯLьСEk@[LЕm9ЎJѓ:GˆэЋБр$а&wЌT›3pрЪ]#‚­ІMг…@UЊZ>žЮ8Ж§ЄMп4$у-šђч…2рН‹уЏ‡-AїВ їѕ`б к{*bР ЎuyvмцLGEXnФ[ЎчhќртИgРЃDЖ0–‚Є"›щDз1sL• Є<ЕHˆР”y†Ф*– 8"АŸ„Љ‡2@І)k!*Iшл`ГРЎŽю$У‰ S#užЦчИŽЁpуощС—›~Џ‡эWэMЛWзЗwм‹С{уЊ&Њ?Pб.с‘c[ъw)H™:‘QVeTѕс•Nx<t-ћ [6=бД}єЦ"‹C[“LUтXЊ}|-:TЮ­Qў7– d„Ояa€GjдХ›?пўrvtprИфѓбEŸ“TЫrТ(†']§œMЭ攉ЃŠм„‘HЁbсއфчКЬŽ'‚fšњS"u_Ем€ŠЄсСL CѕnюЏžц›Д^ЃWЇxVшxОќџђјѓЮюыїŸпПњx№ўе.ду2јDј0N`ыялџ$ >ƒПЃё#<ФBэo х~QчLЄ'Ќњ”BQБ]‡ДЋ!ƒ0CMFcVрЖ{KУгTртЖщх=*’{Cr4ыСђ3рo\|ѕъгзЏ>~~ЛГћyЄ€њ0ˆт8GХПхВn`šы ЪђЖ6ю0xњЎУ!{rdътdШ№O:)—СХt…g92X–aQј™Ž/ШЋj:бL {EгHWярy'jAЋ*лњєърbџѕў—ЛŸnqКноюЈsvоюO8A†JO•ш'ѓЃ!5PЂfљ€ т•№~!P'ш >n‰cЬ‘%ўњ§ЩнэeЎ1IИ€& ЪЪzFŒ†RЂєLЕз…(EžевDv2шCBКУmМіэѕхХэpђдЉюСу!‘€eLЏТu:Њ{qєѕb$)КK ƒІ™BI‚ў‘ _cZФkЊ$З?œu )ш.€8ЌŠЏ: -‚UБeА­1Tuр<ŽcШGMhџ…„аЙ:;я0ќSOцhIСS. №щr vЄ8‡8с`XDzкlCхоЭХМŒЫ0ŒСCpWqJмЗ цЫ€" Щ"ЯєonoNП|њ№сѓ5…‡џb4U~NЏJ%fЩ– ЖbЪTїъД-nZIќ"Џ– ”ЂИГБЌHаЉСЅ]Р“ЉШjїjРЃJЏэњ>vњD1Ю4>eYWy 91Kђ2‹. гЙМИИМКО>?9ЛCz‚ќЌєМŠ. $'/ЬxТВд„хYˆрD“ЛСx€WEJмђˆq!ba B‘мКьги`X q[-E_Fщˆy^ЯqІГ8€- lЏ3ІiЂŽ<ŽyIGt HѕЩЇњ^чцььЊ3црCiŠх<Jяьќтz$ЪFRA˜ЮГ|гqƒОDэ/ИК!žv!.Љi"XˆАыšhAUe–Uѓ b;vB!r# @‡‚Їњx U64›ЦЗХPlCdКзWЗ`}gˆд–khƒЯЗэ/‘ЋOEЇљщU(2[Ё@Г\і№ыmЪг Т?‰сПцT А›:‹ЂД^дydЉˆŽŽї( ї…ЩЉ8"Д0w`YкгќcЌъUвёd2Ё xЉІeŽnРуQBвEјйBn ’hWСРцяРѕЧћ_/[№–Нpѓ‡АXС1*‚˜rј]=Џ"Я:Y–їЏNяPЂbу !іc“ЏљDЃ9†}P(_Ё;~† OCY.ВЂЌЇГіIDPC•PќЇЄ&"(-}Ј;юЮnZЖхcv#p\Ѓi№ё2ж•'2Ѓб„ЂF­гЯяПv)ёЄщ юШH1Ÿи.NcІ,эyЈ€‰‡ВгШs!HQ!+Gѓр$мŽЌIЉ5ЊEdЗVК<Q]Ъ/Š–b/k2ЯгТ_V-jWшпєNрЉAыj р:ч%”фђАуTL§д<0Кhj|Ÿx‡ї[ж‹i:І&Aыh)ŸЮP]Е‚ <Е‚|‡-|iˆЅwСњ6%YІхЦIІ˜№СhмꆕЄЩtV9b‹ ‰ˆ$,,У ‘єЈZАрЉНдœiOзфbQІZЏWГАž"q<ЌnпvОœ.…Л&wqл•Х!УъшxœV…Lcu3m6FБgЈ(s”-f•ЏLzOрmbK­"K"„Tš`ю‡cNњSgzЄлНZр•œкЌBрc ђaБƒЄ„ъl Ѓ жтМТjгt–‡ђшшиЊІЕес4#РчШСhмнlq˜ЉЮ{P:Ѓkš`…"ђЪOŸŸїDl"~jФ{Ёййœ8<7pДš2;nwT'гi q–%Јt˜€1 @m%оeIB{x|~vэС7ЗЗCк€u•dП—Ьє4‹Œ$љl–Й*3ІС)Pй4ЬЊ*quE`zЇ>^CСуЩFЋvВЈ# €žыХzAОЅH: yNгrе$8Ca j\­#Sю|>Л5‹М я.Ž?2Њf$рсAt‰YjЏbжф‰ЇŠЧPЃ!-Њ^9Џ‹ a|љЕЋшNh›OюНRьЈŒ,™LDнkР?ЪV4Ч!ƒyЩ“b1KЩkM№<ЬК$RfИїrчэ)ф™~}ОЗ§цЂЫCЎ@яЈБ|‡„Dг7гЫєл€­ЌЌС8šЬtЧŠ IС|2`’ЬйJџыщD5‚МzY8€ЛРЇqЉ[gЫ"†Ъ0ЮJR–CНZX"Чї^omoППQ#gxєљЯ—ЏO;ŒЂ{yI|  жeqRд ІдгDђ!Э ZRзxžQЧ–ЬsЊ оe=ЙѕŠ2l[›œ}mЩ†SbПФЊ TE &иW ХЎ ЁЖŠћcќ˜ун,г$‰Никоккљž2:К4E5БЎHЃЛж€aYѓјМС+ŠrмъBMЬЊ;цјхіЫ­­?oЬЩ‡ээ­—†˜”V›фRєЃШˆY€ЂІ’РŒ№Ъ† s?ŸAžšЯ+ŒьГви“<нkŸ_В€д’b†ЗДbS‡—ЇW§ёxТ№JPЯ0фТJФfBˆд…‹§,ЗЛ[/_nя|QКЛлллЛ[РЖWbYЯЊЃd’ћFКˆњš(M ё#“чeшпї&šдyzєx,a2?Ф;˜ЮWЫвзE~вBљŠхŒbVЦ€ќ{ад…о{ЙѕrћwЬЭжЮіжі/(š@н‚ЖH’[`&Ev<ІF.…э dов•б№MЭge№ŒcDьR‡šG`9A† з,SOХ- Зк–сфв ж$SHє€)"3›$П|љЧЫџёЊўxЧжж9ОЄй^†ўQ10OgMaѓЬxLк-(qtЛIb(ћ{Ќ†ї;цЅgщЯИЧХC&w|T+œЮ–sˆ€ЄСЖtР +†xК†iГР К&фCNРш­­WэcјœЛMZ lŠ+ƒHi†АшЊЬ№ЎЄnь‡‡2ЏƒPщ F/Ь<G`3Жl(rџ ињrчт№%,Фэ7PыvˆЇ§иШQ`Ÿ~•xYЕ\№)Y*tc•ЗnZ­.#шЎc=g*КA—фx+Ž4.ЭrЯ„Ј…GУ’їKxŒ<Ю*˜эwymУаUuђBолg[Лѓ^З`ІСhгЋБrA"9 ФЬ“бЧьЄШ •xЌ_`ЎŒ›z#^1чь HрПКІ)КZЬSx№DjDR‘hQeeaGй†R/2hуї/1~œОмБ{-И—iиЎO1œЭБл j.[тР/LФ[ ’@р“\GТØƒо55Ц-_;œVCјyŽЃћ­.Хё’ ›"Сг‹,№OЙ!Rw_см>>јcgg{gч\РЫ$Ф'ШІ3фЫ€‚ЂL}•GС['УŽ—OђБ?ЊžІФ љй@9™Ÿv(ATШbгЬСі(Q ‡#„ЂцЅT`§dИ ]jJлД.!:oНм:љBfzыDРNlЙРэSЈс1П€4D^€8Mkl™еPЛс[у„ђў1EVtš—Йobэ"Iр‹Pк Њ›жршS(RР№фx[UЈ}pщ­?ЖЮN zlяО<ЦB;1M7Р5Ж^ЧQœ0'жPЧиІ‡ЭКІЋ?ФшачMҘщc R{x$++‚@=ч€WCбВhˆ)™hёі .У—[gчhќЮжГщИ3 ;„Y4X ЭБ§TT/#”j‹yЯа4‹G—,ѓcwV'А Щu"Xрxly7qЦЄт`y5Њqе/ы$Фf~XCвp‹§ђтfмdћхћž(Ч#Y/Э3BбЕœХ Ч@”vЂДРSНК с)xЗЦрЃЧ?v=˜цШ‚xaй6Шт„| џ  AЩ|YІ!ъЙужўзт/З.лЛ€<^nН:ЅeмявP>+›ЭzCЃYˆ…рщ^DгІŽЙ=ZU §/Тp8с%~&nі"=3уЖ *Жƒƒш)Йє2+BˆФбёЋ?Жхmm__џБ§ЧМ|sХрž:ˆ“ЭHXЮR@5cFVЩЭtу*Биї=lтСы}іѕ><яЗ[=A’HїюњЧ"У€jцi^gШЄВЌCмт;ЛФ‘)НАaЪ_BЬ~MCК&зж2ьg[ръЕ$~исu@ž|ž‹=Іг"ЧЖ <>ЕљŸC„%Ј “‹/—эоp<М=:ъq6я€“cбў7H–ыyh™}ёag †шќюBГnп#Д†dўўМЯЋ‚˜ 5Е%Ёwr9 (j83иџgy> Ч‚јhGўГV лwMэЕЛ ВЪpŒрЩ:В<4Ty2‘Ь)іЎпЯ_ы}y6№џѓгщР, {|qјюO,О^яHхСlНТ+зЋynЪBїzРB‚сЈёp9 ЃnшŠШ‰jКњsяЩЉ: риE„WзРбРb,QЋ,raе‡‚žУМ-яYиyЗГM&љЭ—чfЬW'з‡oё‚Ры§Жh9 о\ ‹ 5РЛ8тъ№щQ‚"GгМъА*Ÿiѓ XмPЬеEфmŽSl舕Э1U…ы-'зHжђё%™цз‡%i6Ms№нPœМпнокy{ЁЧщтљ&Vѓ:ГАOС…IмYLYP0Xa EэГS"/4У+’„iЇЏ@9;€šоэH4ђЏОм7§\;o”tFn)“`l"Эpіm,  ˜Фжtl|lьХ‰ёH {€,и-aЛxчj‘кцsmFџ€мЅи.Eюiтu+d]ŠL™ѕn[”ьќЃЪы­ннн7_Љ`FњtБ=bО  Ј§Ј“7ЛлЇў|NКb‘ВЖ#Э››Йz10ŸмњјCФc&ЭpГљ‰=pВз0SMцЈмАзёjи€Yы‡ћђj{їећ+Ѕ\вAь‰^ћ Ђѓвœ~щEШТє@Ўур5fм?^уЅ€ћѕw‚r_>Ÿ>ЏџkШ08NдЃšЌr[тЌN]БƒbцСжЭфуЛУžSЏ љN6КЦŠMІ{ъоt–>ЎЩ'‘;б№яу§_є„)m†W8гњЁыю4O†”Ј5~ђjУ*+ЉJБ§ЭŽ‘5cью +Ї‹5БxЕЙхEў!=ЦЄЫx^еЋѕ|I–"щžFК 22ЁбЋ:мєЙ<7HУёh0т;[’‹4ї„Uп?DД4o6g`gч‹{2‰x†,й Ќ_niХƒE1'ФsфїУуЗЧoп “ўњА.(?ЁЄќ14sЭ2юt†t/ј ЩE bнrIZзї‹е§lFШ‚ШяWofelђlнТ/єdœдѕЦшGbє#~(<Ру2†Dvзџ8ЇU[n€ыЋе?ЙЬюџZ@Ћ гzБјОЌРДьY|џќ|(;{ЫMГ&ZН"<ВkЄ(ЏјЖ™сЎЬ‡ЧeцHtџgЈж+`Вeˆ1О7-5ѓЭ-§ Ÿ#щ*^nІyѓMцitїђруоўEŸV“jYђlkBсFтЕ­ѕfz‘ћћ@І5|S дO`••CНNijВУщ.Оц{фCЂв‡ћM+wЁsxЋzx{~EsogЩ"xЎGоЬ§Уц!ћђ2С4рЁ”ТЃСФјЮ$–Žмё)CKCPMіqЧlqПqm4I1t‘Fџв†Š]`ЈQПKбŒc“ItЯўn4qч`žgCЉD dФ oц§EбД $rtЄйьѕ ŒЌ9’уdo–‰К„эyƒM‘…ъaDг’‡FАХbcє§†рП~ U‰eъд’ЄЬЇž-џЋ!иЉ@žщuК§с„№Ћy5.)Ду‘иБыГpSD–ЪгtћОQ А++ЦmJ\ОјЯy5ыV‘*’+xИ1bљй40еч27ќпƒRtТ> ]<§аKd=^";и&м>’™УkMarGТъЗе‚яЕQ>ъеЮ7o…,€M„ОŸZ2?юДлCNЋƒиQˆDхџн!’G€Џ’{ƒ€K9Х›? r ѓіˆ3ЮŠ0жy–І:Ї]–Qа> …Ѕш7]рЗ’dˆ>НЪm]šєZ—xf;ЦOЇэХъK|ЈЪ…QŸзB˜щoпˆGЋ‘Xi#RЁ4Ž9XУ2‡C˜sdB"Žџ@ћл7 вe`Р ДOПœѕxјшЮпџЧ $Асщš"LњХžтt}{м$іяЫ/‚”Б ю1>9Ђx*>f2МЛш0СЏ7!Ш‡MЈœЇЖ*Г§ыуЏч=–џ™ЮcВŽнkPаДЈкХšРoЄOАпїЦcGс9ююbТ2<ЫєяЎNЏ)^MыMФCАФvѕMJ\hUХ_СжЫтО`Q "ЫŠсхKˆДпўёия{5K€H5%Eр…ўyŸЁйqїцњъzФKnН"№СэуВР†ъЂ^уcЏgЉoA‘Ш§lЪoїєtlLd(FвMПDEПќFцWу:3$QЖвiŒ{я|їфќЎ}wsнъєFœh›’РŽћ*|<щ+$Ї/š2Х[ŸЯЃ|љзƒУэ8‰vњ ю†dsщўш}MМусqцт9фdБ!qмфтpяноёeТ:'ZfЈсЏ4ž.1ЧЋn>ЋЇeƒЗ3‹,vЈШњЯЦ5†ЮoКДŒ7чŠ%ЎСћE=-вtЖqDXF”Э8Е$ž~йлџtвв Ы+VО$Ё_ШУz‘˜ŠР S™ц%ујдтфмчяќ?G—т%М;[Э€AQntАы@с&и0щЅžЬёЃЃЃўxТр…WУ/X­,Шк{X–оŠ ižЦЕpXWe№ЉwDўkЃ3fŽ—4ЛчXз‰k"O“šBR !1У‰SјКРг7W z Riж„' sWпf‘g‡ -ЉИА%]Чƒ}ёБиї'“Щx<­), Шw=™()‰Р™*LŒ HІчjЂ0l1Ђ у.ю„`yƒ•„F(UЬ’ ЖД)*пe4lxі‘џпŒНю]›6K˜Адб‘$oФXSR„Э]x‚’z)І!‹T‡–d;)–і•ѕ†/ћл*ж%ВМ aЬYљUўejKНAЏswнЂЭ ъ9WE€ЭŒ6DѕЄ„8jY^Фƒџ -бЭbЕ)oЪУCiЩЂ"Вhє|э#х“ ў:­€ўx<ъЖКœгмОЮв<?ЩЮ–пpЊWЈйоѕmтQшП`Dб гiMфж›Кхё>з‘№ † щЩИ<ў…JVи %…Г&0ијХ^РА~иCм/"E {ЗW7эўЈ}є‚‘и0FТѕwЎ—ѕ<™ў ‘йЛНgмzъР#ЋN1Я,ўюŽ‘4 вкъћ.бУCљ… лЗзћЏ_Р‹P /* B\=lЖАыЬWyІ™Ђ&“Ф‹GЏ^Z•к?щHšсЦŠ r"г=5ёќˆілЇ_P<”fИ;@цšь-ЭђРЦМфј7iтAfqгВŒ,цьpЄыN\.ШІж?ОtКL-–'ЧQнЏ/ЦМЈ‘УхlЖўk“Ћ„ЊШАšб”gнTxЦ``Ђѓ2ѕд‡gМi"kЉаpЌЩ›Ф%ћsћb"IЊa˜†Э6лиКŠ-ЉHQС„k??џЫ!Y€<‹yqаеmЏX^ѕІR§ИЂDR! rошХP’HŸБЬзпыЌY‘ž‡зbd†џлф $жв‹'Ќэ`ѓe…ЩtШјˆB%qрзТЋЧ€ЭQДуSa€YL#W(’8Я|rГёГ-Љи?rgИa]ž4LлЋИ5 Юљ/'†Оп3Іhj4fе‚P‘УkЈRWхЦ§NwФX4ДПW-ьj":)Ёˆ$dЕ€OџѕР|еї\Xg0‰7эбx0цэй=йlX/ŠР’йб ѓЂƒ7JaќWƒГэ0ђ№жЊ}І5РŠo€,2iВL]‚5vк™а­fDтBЧŒ№LFЈОаџлt ўз1АrA/„'IVЮСj˜аЪ7UМЄ†оzKѓ<Џ3м—Df20к’yічKFќзgтх дРЋ,q^ЭБ”ZЦЖп 9%ХŠЪеЂЉ‘љБЎ3щCџ-sќз`4d"ЗШYrїЗ\@<Ў№ц›@€&#ЩVR4ѓ2Kв,Э’<ƒз ќ›?_0ШїJ:6№юЂцHасU’ YYБуižOЎЛИ^рšO& јEc8O(†—t}yГžЇ–І‘НZ–h‡k– QY7ŒП/2џзFŸ5'ˆ‹‰ŽЩ|BJд§H9VP SУ‹ŒЗњфџ 9ЭД]Й`6P) E'и`A№Пд1ŽБЈ’KлщnHŠ,K*њ‘СIђўщЙ4GџЗœнпуїј=~пуїј=~пуїј=~пуїј=~пуїј=~пуїј=~пуїј=~пуп>&4щ=јUЭл?ŒUTк№Ѕ+pџіЮЕч еCVь<ѕx#‰ћџъ; Œ ар=P?сўьЯ*ъZдГYсщ^1-IїџIu1wщ[qžG-iьў7щ­щйQB.w6Б—U…ЇЉnџХбяМШ^TVЉЁ:iYЉѓo5yšTMMŒ )№"эlšUU p’›f‘Liz6­™–7­2KЖвЖаўДЫЯ’ућžЋsœхЭЌA‚ТІАV В"rG/:/КНжаN=гNx#=ЌЫH2џЖnZїэ3peTл*бЃiU`YЈє—zТ‹›NЛег"ЖŒ ™Ў-ю—Й-*Оїяёьžb9aœMЇ‰gohљ бъІ,В"ЫЪФ“_\tЏ/FN^dЎf•ЋEO—ыY(АnЙџŽ8Тъ(‚„YYХОкКф$нDЭ=$ЇЬrˆ!м‹у›ЋО™”ukJКzXдѓѕ2з()šсгЉщxHІфTІхЇMyќХ–‹9сWЧъМL,хХСЩРHѓz^gŽтЯШ=†&`'F\.rпVўо–ЌЎlКОkŠ(šСtQzї”rSт* Ш1Hš^….}xc…Eе,чUЄЙ Йэ\кcкЯšuіпкYи ЧУЛє,JНЧuXЬЭШJf ”юŒг%<ЊихnИ8­ЊjО\n8ЧЫё‹ЬрДАX йy`ЪcЁTЫБ Ud­›ЎшГТз9бNСJu­Weт0]#Ю›ВjЕZмп?Ў $0бШ”…жЏЙјŸ6‡Ќš3ъо]ЭЈžЁmХlVUгH—­(Џъи7њ='­PЙeКЙнЗzXзI˜еъ~Й^6­Пo52(dоmЕZіеёцхѓй+›9DŽ"2(жŠІ™ЉŒЏЧ~†nžтЅ"ф‹Yп/р цЋћћoЋХ4|Гэ3ЧчЧзЧ Чб[ж ЋХ yК0:­Aвxj‰зЧ|”е$№$F]‘љђў~eEиVuhЉ<'§њkEA{—эёшюјЄ5‘u]cлСMQKЋ™еTзьžŽŒАˆЬс9яЛŽсyшGEГDц(xК%!Ÿx˜gЖ4aлRqrЊІe wзЛЫ‹›‘ЈЃцншqй eця&ЛТХЧ3о-b‡9э*ВЂгмEЕгйbЙ~\-ƒџ§§К фСPБ|Hџ•6wE~†2ИЙКО)AЕ=пQYЮ ZІ€ёB‹н||s@ЙYbOЮћЊъ„г:ГhЦL ђ­жШvДD†ЪeяXл+bCс!аПЌццЉЅБѓж˜Œ(Щє‹<А\˜ш‘WŽБ~zqy+јIЈїяT/Ш›EiwЭB‰єpПF]ц‡ћЉЭєe;ŠќЫюЃ„АbЦГвбфЩM›ЂЉ^щ џ9Q7Ј@–5EжРhхnрјШЗ—њТ@“jоЬ г†EЊДD–p… 7дЏšъžЌ™AЕh"лP&.Lѕ52Т ЗZЂдBїѕ<ѕ ]'NCЕOyaQWyфŽ/д „є^жШ,ы‡ћYЁ}К*tu9Э]ЭДущ`DlђАCIВˆ0ЩЋеёhŠЗЖ<зі\7 ги‘њ,2Ћ{ЪкAh[YC˜ОШ ђе̘ЮжЋLgGєЏъfєLАчjY…ІЮPрJёi*ПиЗ нtлu‘кв7Й›БучExкэсѕD˜ фДYlИМю7eыЧeЄл#ъ—8uWЕМ Зž­зЫвеeŠ‘5нЏ–ѓХ§jŽСЮЗ„с]ЋG‰*JmAб­ nЎiшймхёеЭйх ^Ч&D1ф—o3OьЖ`ЊХЅfеђ Є@œN!ЬcCЅЧ’f†ПхjQБ+ [ЗэNЇгэO8нгРЄ†š›ЄIhŠ4Ѓ™3жУжэђўћ%aДљБВйngФLю~ОЭ’"AхEЖыћкеи‘`D с“[6ylГэжXЬЃЩмdHInйmziYЯP_tš•KХЖЬka…СkЙЌbRЗб PSвЬ*F<яDP(В’ =ЌST*­ъ%Ёй!&?<І„Š}­ŸosЯvBГƘWyоЌюQV;BОЧѕb1‡jОэkЈ™'jp[Кщ…ЧУ›Œш„!Њ "p˜@0Ÿч#ЬSЙЅЫгОl)^–~jБ+ъ}Н…}Іiо WсР[“‰vЙјk’ Gu–ЦфКЊэY sркг"Aэ­КF­вКY=оЏОгЂн—ЎЁёƒі€CО$M§ЉVyEе /›-Ћ4Ю„$Щ$с.T ЫqhЃжwŠ˜‰HУЪЦrУђќхУ EчPѕ"Бїъž№"э­R#дМF Mў™ЬFэ 'Ъš Q"ERaX/VHMZg&M™aтKƒ /pPЯЙюе@б ЌёBWch^‹‹jŠђ8Эw:Х‡ћEjы-›wfZќyFw‡/№’счЭ•рђљ†S lnr‡ЃЕ іФAЗ?KxлLbЉIїђыY_ф'cFPt]˜АЊ УO]Wѓя\ІїЕ.­кŽKъdс'2^u&Ќ Њ $UU5€Ьdtœ—‘<‘М(дXF–ЙA—S$ЖwyбъмœДxяwGzмŸH–ŸІъf:-›Щ3у_э*йŽGІ7дXњIIІ=fYe лу•%Ђ)2нЎ0б…УЂJ•СёЊЎШуГ›!”Л=XBЛg Ќ…ЂШєH†9лаЩ6eŽељс ]Я|е№Т8іQY”Dž~тыГђHšn‚{кІmYN0нpьЎeb№ЂљЏИЎ&ŽŽŽnл=FF5шIЯ№\Яѓ]Sф lFЁо KQTГљњa…Tы2ŠГЂH#ЯБˆрžЊќ Ў‚ЈЪ’Рr’Є–h х]jјЋх=LtЈёВzšсІ8Й§zzЁРDZtІЇyЈ}[дъ(УАТjЙ(sд шF#m1VХEО‘gu,pФЕ™UQŽцšЁ5 N2Тf§јНl2Wb$;IТ$6xК{}yе…Z#ž1ъу‹=ч47ЪR_хT;Њ`Њѓt:›'о!дОsдeЊˆr‘ИЊіƒžЛŠbт žѕ{TxЄe'["сюу§ЂŠMŽmHЮЅ'LЦ§NЇнЇСhSзИ›>j"Ж8IЎњ&KЋNж,WM–ц%ЄеП(œ’Ѓx~5€,ѕїје№QнTPТeBS  З—їп–MсЉ#љѕМ) –ћНnЇKы0гњ`џЮ€КвИлhŽ>™(v$№EŠєсыnЃЮgB ЃAЩЈаа~ьПЄšašч("bЊŠ(IPsE вЂ@ќ4сH№ ЮXх™Щxая\Ÿ]іUзкяЏT+€єm‹“ЇІдяCЄŸсъЭ‹zŽРќž.фгmPJ(ЫPљ4‹~t'„SL/JІMU!Jѓ}/ЪІ˜О=BьhЪЬQ$й. v< Ц­ƒЯ‡ч=ftєўсЂ*є„fиЩэEWаSРˆŠWЮжї„н—P{7E!ЅB!5є-хYњ3џДЄ˜ЎŸeЅжlilЕ–Эћ*Я<]%2_M(Q§!E3н‹лЋЏ{ћG‡я?ŸБЎch–я[вЈuзіяЎЛМ›еєšfљ@Изѓiž†.8”ZnЧўкы ‡‚р‘~œqЖR„­=щ:”‚ъX@іѓY$Тt ЂРБЬ ‘пОпџr юЄк8еƒю„e™ъ1vЕ‚™†…X­ОaбГšХЈ"…б%™5ˆгВјTmєџm@Ш’TVdн4н‰Н /6т†Ч…|-хIˆje‹EШŸd тсИ}њюУчO‡ч-бtCЯ’PЅЁ'ЫoŒЮŠRсЯ"CUUФhЪ ,`ŽуибѓЗн†Ь@‘%NBEQУЯfТnРJпЪо^/.ђ)Q2­=д ‘e0ю№ЫоСчOяПpЖуY№'Ј,эšК(иЭ щ СЉ7Ы0Г”ўнh2ь†Oлч]šFuїg#ЇБfDЉЇKШb0a1Ћ`шЈ ћ$рŽћфrїHЋjx‚Є–{ŠаЈ2RИ‰ьљ—‹ыуНН[Ni^<n( ЅpО$‡IuГРw6ѓ5сЎеОB7Жйх0DСЇN…мAрRrМєyџ§~SшueЭХ‘PЅˆ>kG*‘Т— ФЗdсюД5™<тЭ)†<ЧціP5•щ„хt1'’еaOВЊ{ŒяЮюціцэSЭфЯЫЂРюЬѕо‡wМys8PENбН$v 3 Б |MеKж8Ач™IЌЪнŽL†& Н(ЌfВџ9ўб‡ОVћтFв-VuЬЋТwz8%ЃчѓхjІМйио|uцзѕŒ]R"†\КЇ ­ЃїПooНњѕpanХNѓ‘cpфПТЉVaююњ@Jиƒ5-CЭЄђвw @˜&Ÿ !єЌЋнƒЯЖŒАk7-C‡ =0Р ^Mхп!5љІ›kЊŸ–Г2 (•‘ЮЎw^ПккмкоЃG9йJЪШu( ЭMЧexїлkЩЪљйТА†хХY9kзЙЙn†Я8aьQџБ(ˆТ` ё„‚-ћ5 %мcІОймкко>АPbЯ мЇњ‹м—Йющ›-Ш nОm(ЊФ FZŒlЫЭ(7-Р–'юlНгf G#/Џђ"Žф2Я‰2wѕt{йа wф™šNЅс@жм Т!p Œ9}тЬјАљjѓзэпnГs͘еYœ…#№§з/йиккz}&ШВ(Zš‰ ‹юЩыэЈя™$ТbƘЄаЉ“xД№Я>|ЖŒ }„*iг#€o‰ tf4єsœЏ^НyїћŽ:Љ CxŠJэд„жоы ЈпНz} ё+5ЌFДМЌhB^iяїзП~А)<ЫŠ‹љ$5uI6m2~и#ьѕфєв0­ИdЊю‚$#}"}зVnZЬќOЏџ њю<­ЋЕ^ ™›’айлоЄpјсшЂCИХ ЋТеu+,ЈBЁхj|кz§jЧi(˜ЪБUL6 7ЇwAЯЇBTСмћдјAеGZO™*cї64+_ 0fU*j—ГєvћЗнннНІz2ƒŽё82$ОЛGўќъS›—TУ ѓzZkЦоХ$OНЋп^џіjзљSƒ,ŸeTн|јдQщЩђ@…€‚AГѕT‘3Щ Р FFXnV$5™1}'РišѓћХd,§ёлЮЮЛЧŸ.ѓ ‚б5d†RCњЏ67w:ВB…{Aа™ŠmШH-ЉдI#nяУўћзŸ|F:ۘи'&ёЗи,БУВє5ЏЧQ|šбшНе”С žc1Šъˆ–кZ bЁОХtтэМzћўэћУ§їдЦЋКˆGiюЩ"wњzѓеЏШFIB&xр)ЊжTЛќtxќљЭI v_&Еr?qќP%ИхЅу:В˜A>p­Їэл0Ѓg“"ЂкУаСГЅzуѕgЏ%qШшiђyыїїЛ>МлъTŒŒЉ6ЗнQ@етйo›л;mYбМizг ѓЎЪЬКкћјўшьУ]Meэr­р1vYТЖŠЄеЄЫ ’Њ ]ћIјc`ИЙKJXёъїйЪ&d3“рb2\ГYqЕѕњЭЮћЗя6OCЊћB1-MœэўўЧЇKŽŒŽ )œЃвЎЋЊ(ќцоЮЛ7‡Ÿvr „МЧGŠ‚‰Ѕ1U?л  UY’бТЎЉ{ўMŸœ‘Ќ."—Р-gђВlЪМњOЅ,њЁjlПzГw№ёніОЩчы …ЎЊ6ONїvіnZYДŠiоJ`h Gмсўўћн=ц_QБC›, кџmGЊЦdu]fЁ- ;ŸwЯЮ?Н{s|Ыс„”"HR’kфeЎ_žМyћл§9hь‘зђckХwBˆЃЄ„Щ„ r [OъišЖ ОZœ6€ q\R=ќI“МXф)9јvыУўощљ‡wНЌ&З†ffЗ?юœоНй9;;ЛИkЭ6E>Ў?ŸюќўjkЯŸљZl k’W3њ 2OГВbЂЙуаv­'ЅЦ.- L‰^хe _ ‹ ОCъ| 5l)дСЩЋЧGЇ;oя‚šо~Qфиp~xvіљнЮчƒOЧ*YђВ*Ы‚ОЩ{>}ќ§еENFЏе™˜"зZФRгЩ”}эyт˜жГ‹ЈQи!˜Ge€ƒюшТMФ‡Ѓ8+ыЩx ЁЧТЛзŸŽŽ?эпjЩИШѓМ љЎbюІе8нл?=Й‘ƒŒ^lќAЦ}|wtqОїл›4ŽXf]2нвљь/EБхbНnЦОЁHOмIИуxеВLlF˜дэ—г*ѕЧВi­$yБv–iвxїўшрѓйhЈv’gYСЦHeq8є3LyV$nбю№нoG.6хРАџCХопьOe@ИЫъ~B‘ѓщ =ХВ!ІKhЏ‚jКІЪѕњМfЛ~\M1ІЕ}їщшъьВЅFvoрф9”НiКЉшЂќošQ†H˜‘a NЮюЎ?Н=Tцш…\a‰Œѓš™AHыfЮЪфхjЃž~jи‚bљЕOQ–* *=tЉs~ttrгз>QЫ<ВкЧWP-ВSwабšXУЬШѕгМ  Rт1tСѕЎкНіх•2љТœ™<ИN|Ч45вT%аB.ђ4IŠйrœјžїфjA6ˆВr‚]а5ФіЭхѕЭщСс!ƒ’œy>swAЗЃDUЌЖ:TXбЬцJ‚aJO@ЏОJЌAЯ.œFSєyГИМџS.Ѓф%іw=IW!že8ЄuTЭшyмЇ іШf—^/дбчеШЕЁˆиъѕ›ЧЛЇœgєJSž‹Jœh$UЎœ]+#и›#lgqЪТрИ јŽз‰:ьо5e'[>ЌeЃцГ2pДaѓцК9”ЉќVt›вC`i’тŒђzLц? 2ѕu€Ъч9UCБg[š0rЂа>ЛшiNTтфuЮ\„ьЕdлu|P’c_šщP’ЯMiлЊ&оžнr iUЄAkЈ™WMmMпJЮ§”™– dzіИ4l„ђНVO$ЗSЙV—м ЈŠ—Df3hкВž+š?№,M\М†њюўЧŸїwоО~sxлupERQ0Fjgrh Ϙ†ж=ЙрйЧˆ}NwПлД:9NдщуŸ`ѓ шŒ\Bй^ПлЇњMгФVKqCВ9Д ' јЏ`tL(ЭѕЩ)И TЖlНњ}{sk{‹ŠЎуЎD%W„@L—B№bR/Vs ŠЫЖ-е;z5L1C fД…†ђN{јДˆ7аШ`І† |Ў ‚ДяАЩ9A\Є#K–ЌИ&Ь”NЈЩЈРёpzHžЉынНэ­ппОоњѕЗэ­WЛXб~рТб:{PЁ–ЭЂdЈк щюќnЅQЛВэ@$ўщНMЎwuнцВЪb]ƒи›ІIZd~LБDс'Ё™. ў$Н}-“ЎZїрз?vўиz§ліі‡&MЧ|'Š3В*БЅЏ+˜ЈЋtфЊэ›VЗпku9|і-,ч>ЋЗК'Ѓœ№€r}мZP†­ОэЛК9$г/БП[Ѓ Iу8ŠЛ kuї§їЧ{ЏџјузїЗ*Шэ]АGqNqo†њаrсЊ}оХy‘аRрКCnаКОi1Еf№Y“ёЦГЋCЈУP.’,r Mю6‡™Ѕ#—и! ˜BO“PpЁыŠ/›фY7ŸoЯоО§у3Q7M&^ тuJ9cоЁЦ‹hЧу*&Ѓe^’ФaЏнh5;§СGxмѓoJЕЁbЎЃ<ЄдПКnv_-žТ)­CД АEiŠŽ№lлаѕсuуjgч§ЧіКwСcс.#P‹§vм1MЅq)КP”іl Ь2}ŽФZЭVГнi=ѓ ЈEыЙu|оЄА!ыAB.(\ž\нœ_ •Фу)л ЇфGq:СсeрyLгZз”nуbwчP0 ZV €џ IIk0t–;w~Щ„Щ"HМЄЈT^*O‹_фЯ:пjIЊnhМ ГМ( №w{xruq~q|вR +ЦNщ|Jeљ@т$ђ'›b;п:Їі†* —ЊŸQLЋ€o<ЁGЄxSNgеШTzWwIHі!ЛЈA{ЇъѓdyВ•О™pЩ BуKыфєђђтюі ŒAI1';ЎЫг(BS/šRtUGŸлSЭЃyFѓсН/ІbћM“Ьб”Юе5сZђрnГй^`шиM ”ўœ™Ц&”Ч№jGЁ™ЮееЭељљљeOT5;ЉЋЩ[Э„–Ј(:ŠB˜M>та[‘šT і4‚0LS$^+ЌOаd]`пŠЗаа„цхеѕЭmГлымœ_C=“s[ѕ9œlg*ЫГ4KQВˆCZд§ЦљсAгPUŸ ‘`Т3Ь5с#lЫPфƒSK2сНЯЇCUwм \ЫТЇiQO*\ #ЁŠsœЛ*S7з7NЏqzprзуhЮšh‡z†б ЮXCм‘Р• x†*4Oњ†ЊЛ1E `М :R*З‹Œ f4’Й&ЩНУƒЯ'CUCк3 ё™ЊРm\м‰)›@ДФї7WзЗ7ч?7А+ф:TœrЯшH%%„ЊШЃШЋс(аP{7-I7ь ­ъbВ\ЮЦєВЁї‹/”ID’{(§Я‡G'CФёzЂ‘ZиVEklдeЙљПаЛ;љ||~yМїі§щ@бАЫKJђOЯ.™^”у`iЙоzšЛ>яЋ„" jWe5_тЖuT„ьЦнИ В є‰В28::Лт)51ЃS2К`xЖ‚бДˆ)№блI Ž+KНЫ“OЛЧч'Ÿї?]іUе№FT…щ†љœfJу&дZќ€V—e*\ѓьЄ%В­B/Ю+ь7#Г= ЫIJexHѕ€Ўі.ёV(F^A’Rє Ѓщ9i%`#ЕH(О“яЉŠи>98КЂdиНЛmєEЭŽbФ|ЮщЫMО рEN& њCkпДћCICќР~PtHcЊЩ?bD *8ЬісСЩХаІ4 CЌBђЊЦ&$фF(єЬ&yJ/ЏE{ЭOщ…ђ UО‚bАЎ|ЯqŒ'"НŽ$ юЮ/oл^„ІkgР+ДЎ‡{яŽ/[œЄјхœ|К(Y@u,‹ѓ" -›ЛЛŸ>u}Вaи‘С‡№„3SшЁк2y6А?Р?u–АEЋ™aUхyL эi7џxBюœ^м\_пu†P'uLхњА9ьїEйЩЇЫjзšmPІY‘'iRР ˆК­нїŸ>ѓCЮЌ›Kt™R†CŒ’тe>ТоЗB5 MДЂ™ЋТеДеpeBkњiFЋUГ–ЦЕ[э2T ?.BУ‘OЫ/[щtQгъЂjRlo ŠJhœЂ5`З>\^Hє†J:IŒ€GоП{в:UuњыI1.Љš6Бe>m!BЏu\ …7ЂљУ5†%AїqN№tѓЖ'гхњvdYOkl$Tу~K› >ЪU‰Ъ=7LCšшH‰в7ЪJr№jО(lюЖM…Ё*tmNш’§ш‚бэ ЂЩЂrQŸ*LЏ9ўxХЖ—иЄРщсrL•ф:EОG€u4Yд9і}йŽ2л{/с#ХŒюЇV<ј6YcšzщШƒvИ>-в$ŸЬЩшOЅ'х,EЁzXЄР1ЂH7T‰ƒфщSїzл3ётЧѕх§§Ђєt•@Ѓ€йQ '™.з]ЃА @ЄЪh!ZмСЎBи9*фІT РѕqƒaŠ}]TТi6™•žBaŽ’vЂ+‘r#U.C‘ЬЇeO.ўд‚Ћk8Жмшђ1Юв лъў5l/Hвr†ўмožP=všр"ЩШšЗ{ЧюИšІ… F ‡б3ЖїЧРUVЯыФ АЯЩ†Kа$ЃЅртђHыьшффЌ!ш&U–O–šгн|ЕЈЊb-/›ЬWїЕЇ§FO&М‘WфхbYс–S”OqУК|ŠШ’~?НИ"Ѓ'iƒЪœs*рG1ЬУhЖ1‰;3ѓ:їqy€†jљ1Vsьœь_ьќ~ШAx‘žтЉF~6Џ|]щEљхt‰Ж?UFѓЗjвjœ‹E™рnKAЉœ9ШdщУЮйіЫїћЇ х’А{ўqsћSS4н ЅиH%;™б4гyъЁПЃп‚ИQPЮu‘8š,uЮЎЉж/ъ‘g>u{к№гqhђg=ХешцЏЉИ•xЊŠн‹ э`ІЉ sL!;<*=™уЎЖ7Ж~нi:I(_НyЙЙsйVt;­ёTЬЉЫ8ЮŠЩ‚DЦdпЛЭrеlFм8ѕ,uиWЌx>}ЦMxЭѕCG!я ;™.pSВђ шД“еšс'Шˆyу2>л—›ЮцЉЉЪмбЦццЫ­}!аЮпМоzЙёЁХ‹Вс"TЭђa…Xy(Ц–" §}I3›ЭЇ8ЎSOЇY)VЕo?. mзбЛћ†T34y,&ЁI%hЗr_s’ёbNaи3ˆИŠд~џo›/7_Оn:ƒїdўцЦы;”ANСчфc(&-r-т'зэR|vKvАŠ3Г:ѕ§dК*НЇ#Вб“Хцчпvњ&9 НЭЪ-‰m(УЦ 0”ЈИљt^ІЌŠТEw$˜eв‡_6_nll~ЖкЏ6ЖШшэkIR /ЩЋI…§(lyЇеl6Ю"W“eЎпуШсF5лЁЏq†8EiSЧпР9аж ЊFеrЙœІЖІPўjДКНЁ ње|‚bЋdСŒ>0…єЙtОНЙёrscGЙ|ЙЕЕЙЕёGSТIs”0гшєsTtї†dГ›fœŽ‚уhН'/‰ •?Чо>ЦN‹цrkT/W“иf­:ы§_СШШг;Ю sNЃЄ|iшjяэЫ—ПlќђGяшхіЦЦжЫCЕ^D…8;Д&`•Oh…„š@ЁуЎAЯ ЉТVЛlEdQЌЇчџ9Р,ЊШS TŒŽ ­ІЉ:YюШhЖЈRBLSœшв4!Бi*ЗC.НёЫЋл§#—окЫЏš5*p,Iљ.РŽ%Iр 2Qм г њЉj&и3t~чпрлW{ПKomŸуMNєйІК(ІшfŠаВI+Q$FзО*Ж›"‰Y]љжs.щшєЂЪЂ z„•Lчї+x€w‘Šёb1ІZqΘRЙЎ;Дtё№х}лКи‰žБWз fкr<3бЃŠ’i™Z=‹Ѕ!]Хpђ@ћяЏКЂfEeјqњ92€ћ§Ћu›УrVikYЊ$‘gђхe5бШэ4UтЌT6š|КЕЩŒ>и„{l*юІэЦьХ-йС'TЎІ2Ь–љœ~o’…€L]•НОќЌ^ѕ.­’оU“—‘Њœ2ošВ(№УЮm=*Ч3lъ'eс€JaCзИ§ /7O?mlSœ~ЙЫQАamUv@ fэ„В‘eZ^Ў39dДІмО!рБA˜щтђ%‘—Џoe=ВˆЂЈо˜бuф˜kъœБ3˜вQ„!jDpф№›ю4Sеƒн*Ї з8ТЂ‰ЇЕ&Q‚ч‡‚ЄХhS т0№iІЩЃеЮюйJЩeѓђіеЦц/Д"їЁС‹YdFЯаГДšG”\YSђ •БE! зŠx^ єў-VcчЧ6щEЎбrFЕ-Ў;qВ;†L+мqБШ;лd3Ыˆ7п^nQФоx}:Tp GБбdСЌž•ЎBЁађ‚Ек№l1Ы}ђ.њн0Шбєoagъ(biы#IжнHЖ)мQДVјОhц tШL’m=тнюЏбПlnНэIЛ›p•7Cћ˜єьЩќЯ&МБЋ№œˆ€ФƒžЃљЄРбяhŒІрй^‚ лЭ;мhVЄaћњІЫ^”^\aхЕxЮњЛЪŒцЮпomАБљъэ•у5>МbfoО9щH:KŠхКŒЊ7`)б{У—ѓЃœќ„Š1C4<чYР”†B‘C—‡ћЧ—ЗЦХсоi›8 HJ <'3Xq_‡#ЋџљЗ-˜ИБљыЮIЧ- ЇwОџю5~уЗн‹fZn<`—ЧчѓЩH‘ћ7Лo,ŠИOPС‹ѓHЪъyИЯ5š`M Юшэ ИAЏ'ЧйшŠDЃЃNАUёj§0ЫЂіЮЏ›Ь[ЏwЏ8'G}žzџњрэ+z”з{mгѓђХ§=Л :ЋCbOšV)Ў ЂM—ё(цо“ї<ўнh;Ь‹Фgш”ђ0yЅPёMБo2ЮЈЪ•йЉР)їИšYaёццo{ЗJX­ћhЇhž1zЇяЗ_nlэpiœЯяю—dј”а‘†ьŽœcЃ­\&| hP\uh[џНyџzh–ŸЃ?‚b]Ў7Šxpg, бП.‘б‹хbѕ№0яПbюћюJc$BЌбsŠ„IЂєцежж‘SgИшzϘL3 B„>'ŠІЮЁа{€EYJuž} [Ж\ЪЫѕ —9ƒgьхRЮХ™—$ШT(RЄО|ЌЏЗhІ_яѕУZHб::Чі%3Пp:‡o^ф3\Лžѓ7Mp1ŠЪGЦи]ЅМNДcџїж§WУА}P#Юkъƒ{vщWХ‡‹’lФРлd٘Œо~seTИЦš‹йcўљ§ЌАZЇЇ"ъ№,йц {ЖХr}/ТnЃм>љУ? -~@/ зj U/жз>чuтшВLpE(юыOoџјдЌБ-™ ›­›vјyюкqM?e„˜€GЦХђ{ЭуУš~чсž%wžx№ƒШЊnВЃ!СЇа ^RЙшЃ)"тJхУ§|t›ZŽЋ; XYЯ0Œ™б+VћPцЄяб Ž'‡‘ы9‘~ѕѕЫууŠѕhьo№Ъ.И(%н 'kІ™‡5NЖВЌœсЎл}жr’ƒч`§кWыE0Ÿ­ЛХY_єr}‹‘БzрЏ=|yќТHА ў…Mіу§ŒѕјЎ§mФC‚1нЛ&Ї9й|Э3ѓјРцœ^ђ;|Ииќ€Ш;gп/‘Ф‚P~љI єќЇЭ {ЛЧѕv\3Су&їызЧ/_™щГаRєШ?7Бќћє;wЗ}еIІ \Э_Лn/=АўxќьtЬ5ЩE—*rсэЩ­`ŒŠ dЕ>yXћ3Yќ“LЦЎpе€ОиФSЛз-Nњ6VŒж№Ђfй”-(‚T„УOгжкlЖіиЭ[„3пфюЮ>ќёnяЂХГK_ыbžq?ВWХў%™K?рЮhETнЯBcищ|хФzДзчi Ы):йўБќзTlXXl’йTоЏъ‘Ъї[зŸпО=iЖzC5eнšŒ:эЏФž^§e9ЮЈМТ)XNp%жаО ?+%VJоѕ„mm o™І›NяйEЦХіРюŽ1;Р…UCмhŸŸмŠмPpŠIM уOяYЏ;œ?ўхЫ2sM SЊL*њ)”Ž\ћ{Д*–;JЫ*іqil2=F8}јђgШњВvfжри!O˜ЖУs‚™жЌ“fБs>ь1ёЏ‰Хn.уB/MM>Хbј.TИ}ЭQ‡c):‡§ž ™сŒ}јъ/J66Р̘&žcЩќ y7р8%(*„Ъ3 ЖzзцІ" ЈDІТЦv]?+ѓцц{иŒ+•TЕ*§›ЫылV—Іo8р%ЭЉўši–$˜%ЋћХ|’ир шПИ%'JГ,rM;ЯЇ2СџHFSЎ]MД8PБ>ЪВр™[щџjtD‰RЬеѕ]Г; ‚kиыtE#YБЯЧTХ7–w€KB0 q­w<Їњhџа%Q"hЕX1ЦJн)ЁPVYЄžЅIƒNГ5TШ?ќР6ЕяЭH}зюі(jsНЦѕ-oФЫ‡Џ_X@ Vт|оƒpЧVЎ,ќљ‹Ў H͘AћЖУKо_,yїїфЭ nр_ЎЦ…mxwvJ‹ќ{л<ж-і|ЗMэРцЧЏџјЪд:Х,ЋаѓSЊy#SФЮ‹YL ВyEЩ\2вХŸш™"ћW–ŒОЌѓЬ$GS­<јдІ}ЪцІЎЋ\ЇЫЉІŸЯ™O|eпбtƒмЌіЈTЕ’1n‚ˆrџХ ErЅЃулЁ “5єЧ_Єъ=юѓA<ђЏU}i]•О;+ќPVUUv]YГЃjIŸNЖтЪўУ—Еб™Ž‚кЩЊШR$Йћbџьќќфѓчp1КК]ж€єёЫb\Єq’Uѓ‡/KV-дE:ђlуЛЛtЇпяЖn›œbКсxѕ…KšАЊЊ—Ќ\њВi|ElЪwётУЏПНџtq‡^ Œ+v)ŸќљОNУQр`”Эж=ПyQЄОe~oЃ1юњ’a;a6ЁШПЈѓиwуљWЬсФUw}Yv’„аЧршХСўсљmЛжВœ1l€,Џe–ЃЋнqНЈЬ<гД œ Gф"?BмЈ#Ќ›}гzХжпjR€ЇШLQш=VЖЬнu%YbW‘јыэСЌJ’ъ—ЬfFf €2Ц iЯw,?){RLш+[Oflј ЛœЖыGхЉсž]+—Т<ƒїc[цяZ‚Є˜žЋ+rчХ§Nšщ%ЈТџЌ Q$€мББц­tЛ8ЕцХяHЕљOЧ/{–—ЬiЂWS4№(†.'ЈX’ZЗ‘ЌvL…RлP’и§­X Ю Гi†іWtА6;§юExцЛЧш?GЧЁА ЃEЊi{Ж:Июй iy•h пnЏЛыŠ_‰ќНKЫП CЗЭqЖkakЕ ВЫэюїdާOc@ЏO”7cЋЩ5tБq'yеzŸe2зяvŒОЊїb KІЦйxЦъ1№ІP|+)HXŒl‰нв~И У‹САпnДEЇў2ЯGЖ*‹НЛОЮО2t_9В$ Zw­'з0ьmn2aŽbйbыTЋЈВ$ƒF•ФПA‰f0шм6Џ^)ѓиГV1Яц^KўЈЌЫdфс)Њљу?Оќƒj‚yуоЊFxК)ЫšЁ)šW?`+qz1)гаЗ)>SыЃкhшУ/nэ СЪЭMg_ўё•Мd5­вh„vvТ*єG -Жџ„†й8=Cшu{Ђf˜п?џwЃk{qфhт!Wж§rѕ_Рj›„ОЅSzn @DvЈqЯ”:&єgЎ!іЩ—[нСп<ўcєpKйyєэЩš‹/Ањ †#lgМxqzзt9cŒNš|7ЏCз”ˆдХџhЈL}5EрPД\"†РЉгюAюzоЃТVЫ)nP2Ÿ“ыбЯ$Ѕќ.CМ$`ьyў(Ю Ї…АЗ(vп<€bžRУХДЪS4ф“бя[ЄћWЃ'ут/‹j1КvЩlŠШг|dьЖЏ*6:ЋІуЌщ^:.CЪ†џ‡Ѓџ' Џ7ТMIш˜­амКо*Tђ!j’˜МBwЂФЗўўё/GOР‘•aaZ`џ|XыЬЉЊWЉяyAX8ЋwЌчнЛџ!Ѓеr кЂ8ЭRяЯћKм“xёsќ?ЧЯёsќ?ЧЯёsќ?ЧЯёsќ?ЧЯёsќ?ЧЯёsќ?ЧЯёsќ?ЧЯёsќ?t`qр"0ў?9з‚єыБнЃ8јыџєчcЭіџP+BлOВВyЗЇ˜х8 хŸˆ”:є_•‰6М4ёў_щЌ‘тД%дb22ќzœк†Ц]ДщД^МЃbZzК“TєЇўЗшЖ—б„і i”еsh,ђ ™О(šqkЬZЭFГЏљ|22!3ЋѓшЙПFq}зтzJ€;ĘъВžФ:7Дršбо‹ЙЮm[sLgT- ЯŽ&Ћћe•ќˆ‹Cџу1ан Œ"Г}+ŽrpЌƒМjž9šсх“,^\7nЏЏЄ8qM'/Њ(н?.+_hџ[vЗEмЭNвШWЎ/Ѕ eЬ№[*@:\ЇОјтМyyжrг,4Е ~XNбГ>O4NFпР:ђ cРˆэ]?)#_ККRТtТ4jFє8'Д?_ž6ЬЄЈђ@ЗsHЩоп/ЦЧ{iќ/Ь5ЎDAсZДFUвщЙ!nьКO&Йg6іŽ›d8‹Ш6#FnИЊGBWeUьщп§Юф3К‚ЊЉ"зm4/ЉѓРiэпЙйŒ5лƒƒR бhИ{nŒ(NъbЄ3мf˜чfуN‹YњO&=ўЖбШр>етЩdšеxœƒс9‰'н Ъ J;уиєЇрЃ™„R‹ѓтёЂЮ"яяm;m ВЬїлэжэљYп Ћ2ДћM-Ўat™х%T^Š„ВЙЇ4ѓPb)r<мЯKWTќИ\,feпHѓђДбЛwЗэзП=nZ#eCv3šбКЃY^еu:нІ юdІ x‡cŒВrОZЬЊ4 нчsЕ=} њэ›ГыО…Л;…оv‡~2žMШ5’аsЃ|œЛ3eˆо3Z0в’EсћY hЊŽ|ыoLщ~ѓтЌ-CфEъ Э -ѓ<ЏШКjR%Љ9a‘YђЭ‰guš‚-d*Иe[EA:…xц§jšњ 6И‹4T]iОxбьм]4гё<з‘:М2Х5tбЩШ•2AЃаюž‰ч™v6.ђu?јУC„4г4ы4щъ€гРЖџcmn›Žэ(з/.fOЖ?ЙzЏЩЛ Kgu‘E#OЙ;М”У:uИуІЊ–_Ž3rѓЄ5‹"IЋЩђссqынЖbbяЧ\ўk4ugкzїХQЃ?J†3Ъѓа–yб %№<Жфохў‡>ЈbЇt'i~\M‹аЖЃrbНеЄLгr~џјe*­ЁэчЙo}о†џ йђЋТ3ФG]Qф8њe>ЅэxqЙГК‰bЛбh є0iw—ŠH2MЁDрtЕX=оC0#/ІЁмнЄN!тђУюpЕUЫЫf‹ЕжЭ@’јN_ѕЊ%E1љшуЦu•њ6Ў‘"ЩGЪUгѓТt:/BхFŠСvOЖоЯЋ<ЅŸпЯSSвGхdЄЉКіЃšю{рЁ›yRo H2?”мёъ/њLЈгT'PџХqYŒДц №ЂŒ"v0<’Т(/Ы)КfUžбTпO’QXKmт?‡4L—ВТd’rSтeЭд=ЈзœwsˆљZ/,N’,+"OkіРыNсxФP Ј˜уЊм$“кУУъŸ•%@иLњ!їut;HЁNЖ\•ОЉЪЖмb9ŸƒhцdXŽm{Э3ЄЌ“?Пжь /ГШьмtл]Ћ јЉІ‹F ВЪєA_R)K§›5ЧOёђгщjžкЛ9ЪЩ•AFš†%vюк<гFN’РюNлЊfy22;Їgg'—RH5й§—GrЊž3Л‡щ}АшОџaЩ ВzœŽ›ЬяыРвx й dŽ”( T` э›ыыа)V˜FЎбmў(ЭЩ‚цXš1J'Ый’цwQе|M3)/AУіЛпя“Э“щЄ9Ж_ЎVxЗ”сЋхДЬ#sРВšnA2У,rEЮŽђŒтКfИ!dц Ї=ж{XŒЧ”`Р:7vФ!-sпџ>—ЖVrГУњ~йЂ`g(E–Œв=Pћ=й†j0ФУm‹тLl ‚›фЁ.ы^”цLMЌЌg“Zуї„Ђ@wљјPй"фжо“њісј„.O2пv’йУ4rœxКb‹1Y6шьцV +ˆ#GБ#J~YВсEyЭ„  <ЉgX‹їИћкœ"GеDѓіъЎ§}#ˆjЛAТх*qM7[!с™ž–‘-K•х>ЈУ0 FŽ ёХEН0J!>7›OъХšѕžQэхІЬїš­ю'зўЮ CеЄй.gѓrdinХИYФZ-ъмU47&Я1 n^ККсјžэъ%C%”tгƒkqZ3КбПBSKю7ZCBЈ–&Ып9юнq:9j=-cW3"ЦšУўЇhšчЁкИш^œК /›LK‘s К /7ЙЇћ5(M)Эџ*у [Ф–t %Ы‚Фћї{7=е%ЏЅrTWœr‰‰‚йГ:uM;Ьcиl н#`пmЖ;ЗgGmYЦ}аpёф?9EЛ‡ q˜?ycЇ>М󘀏, лпЯшл6•АэV›3|p;КbІlВР :Љ|“reц@ЅДжW-CИмлйлџјсИZnПзL ™г%Ѓ.aТъЫеšЛђqЈCнЊКsю{Ѕ˜О(K*Х‚€ЎHZ8_бчS~˜ŽsЧЄШ6R%ЭІ”s}гяпп]^ І& кV_%%р•Дdіђqu–ŠyЄkјЊ jTшЎHO•5ћWЃЇИпA!i*?ymŽPJТ+ь~™^F лєB[ЮwoњЂЪ_м˜ы;К(ШN”Я—Г)nC€0*Ѓ №‡P83 АPќаПCѕE^Iг+‰Œњdиm6ZN‹@rEsǘUЁeњyqhBяђ`џ№ИС–­7o ЯёA№ЇƒSt9ЫУЈœКpNЅ›jF 8™0]YТbиšЂВијfЋеt]ЊШ У.љvЋ+ZХГDvOsп0УёЄЊr_80к4šМAџФlмš4wŽ"Ъf”SЊ5;› ˆfzЃП0ж_FUНd<ЪИUd~3sЅF -‰ш§i?„Ќо` ъЃc2}DїL+†Д]ЌIЂ$Kќ г`Д|оА§бШ‘ЂI9БЄ!!И•—L6тсoыqN/‘ )тCИ<Э=у нžfŽв1t!AЁ(Pш4G5#ы}\N&eD.A *T@Ђ-‰\ЇЩФdЛ{7`ѕдо€jЩ0]UP§‘š&п?.WїkЮ_a(яИG–ёmk‘W1MЬт0p1‚tђ№хЫWйq]ЦAWГщДєQ Е* noћ iЉ1oтИцјоuC3}JtUъЊ=žЧE^ŒЈаЄ/2ѕUz}šТw{Н'H•0ŠЊЪВ"=3•w!нЈйЃœ^IщZздa‹зуй|СђXнНЙ§G+Љ˜и|œŽ Td@NWœьœмэмШК&№КщM}Њ†ЇU™™ЈЯЈP\M]E€2 Mљ zP S[ХчЭ‰2пКPдŠђщ‚lђM]Ђ5•ЌiџяŠлэ­э­CЛЪЩj€dšrhJ‡Ў&v>Пџюэл… тU#ЄМTMъЂ˜ЮЩ;ВТ?ЬБC чОКаэ§ЇSМ’БЂљчАёІЎ+­НƒЎl@ІgAШ€–’ЊљcЖлAпХЧЏЖ7п ŠŒ=[0оq›Зћz{ызп/%•рЁЌy%t™!“Б˜`„{лœ>@8`Й_5IbFє.u*Л8Z=ќГ sнtlƒЛМi ЉN>_y“^B"<миомк: зс…Ю=Ћд‘ФСщял[аЂЎr‚цфPV…FзД&›НгЭѓt!Œћy]”фьTBŒ<ШvЉт лИММ}ЛTO7пT‹VuЏ#Ј^ 9 ‚ Ь5Vѓх§">о|ЕESЭSдЋЁ|QeЎ* эMЏіД4yNq2ИрчdœgЩрнЦiВїXRѕ5ЋВЌL=,v‰ЇТн>Чb‘“иЃ G5ЁШбTџT•a: T щХцЏл[[[g1EНёlьVч. §“з/й ?{л"ЇuT1U/‹еМ.гм>моК(БЭєх: 8ОAN”ЂЧџaяKз›Ш–lySЖ10xР3žmYѓ˜ѓœЉLЅrNЭ’щЇяX[Tп{КOп• NноІŠТ(rgьˆЕbЧlЅr/ьтЅ+N”ЧЎЭ&bbќSŽ6о6y.UЦwoЗ6пmm~‰И''№6FxЏ}X_{ћnѓ§Ч{ВВhЅƒШї“Щb:Юу0ЌmНлМЪŸС}–3I&)ЦњжЊ-^”UтbЛVzXн)bфn:™dIаwЛŽнэИœš.…Яx$oV|ЛЙЕ{єѕѓm<Р`n6}/ oбЉlН]ЛѕѕђІЉ_эЅ„Зєd%:EњбцЧїW"ЂyєзЅЖ"WNN‹МB&{ŽсœђЪXЏЎлФB1В‘™1‚њ2uL= ˆ˜z<?ml|;?<дШјВiщ$œСuZЅƒwыыяŽЊDп-L’žaъŸ В8№Š[яЗо]gˆŒБY‹‘G†ёцќЎ-ыVїtfЈ5Ы0VЬ†ышЦŠвћ acздmdА{Аx“љ|еHЇiГгигYИ=Л<>:й9mЪЊNhРшFцаЇIФэя|оплЎbрбВ#5FЖ‚!”Фь&™чЌ6цЌi`Вх‰%кЂ ш˜ЯЦ  AЈќЇЭл{{?зШхxЅIh6oіП^\ћКsr]EŽSК!Щ”dqœш‡Ї_>Пп7пС$иШАхp.(пcй‘СG{Еnш†‹лnЏ №п, ?†lДшd”™ћoЗЗ?nПџцф1‚їYЄ>]п^_žЛЌf@мР?J{•“ѓг§Oя7/ЃЇЧчfВžВЬЯТŽВЗl2а$v-K[‰ Tt\Ніќ LXsqXh’уЭЃ$cЩ‚и—№ц§іююЩщож.ŸgKЁ‰•tkї•тѕз“ы‹›Њ2>Ц2БЂіёбйсСЮЛ­Ъ№ Qзш8b c6vщqAŒFЃм%НZ1yЃ.mлqЏŸВ€ЧЏЛЖe9]V™љПМПљёуюйљўЮC@„ЂбGе”њuЁбд‰ЎсYbZIжНо9ўvђuћнƒўир.&/tи…­ 6'‹ ЉН*ут $@иŽi{бFnœљlв'jDRq#ˆJляЖЗwNЏЎЪvЦqDТЅiєМОOЮП0‰= Ѓ,nэ~99?ўВЕuщЯчOOP^vЉоgУ 0vЪrlGƒ|”ќЪteYGMТ ˜5Hр,&SЏTЏОa&„b8ц>ѕ л{';ћ—ЅNЗ+š! Йщ'm;A#Жї1Y RЋДWо?К:?јєўHрТ!М!№}јКмЊм]}ћvUЈёЊrтє’йK‡БgлђŠjнR5тVЃ y’œtУ”kЅЏh1чЏWœоg'‘t2s[ї˜ЅD™UЎ˜1NщE$qDТ'I—ЋЪ‰[)o+ЕЖ‘АsУа1•ъ§еЗ“‹лЛћRGбu вˆŸyЩ !яВZЎa]%хГKctf64ЎкТ0Cх+ХŽж ‡Ž™ЃI}›иMНТйЩ [ОтЂєЇnDакчОTmйУЬlЗJWEХю ,†N2ЧŽЎдЯŽOЯюЋЕвѕm•—1ѓ@цеъі“žmЎ–dЭЉ–л'§ьɘ$nBЙ&Ђ—АNР‘ўв^‡8ь J:и’dИQЌžэTњ>2)L`їфЛK.DрYЏœ_rЎ—2m‘­Д?ю]•ЕтѕщЩuCТДRЁЩc|щЪjwFМЮ"т$/Uhмн4d6@Aш(NpBš!(0ЦИZЄ/ѕЛdТmG}иљАSс‰\ћЄбОЭньм~є БЭщ [%FЉЋ‰|љhwџЌP)юЎNO fЉ\›ЧѕЂiЌ”вYЩPŒsэF­tSHbЂжAА4ёЛН0……"м‰ш\Пч9ЖЁеѓ/››я?_^о< 7Ї;ЗO*Šхиыq˜й ƒCh:рЖ­жЯNЎŠхъУэ} ѓЩRеы KYЛД1u vjЗ1…CеUЙYlЈ„ДC"rК›в ТЛ$vУЎю:х‹эѕЭw›јgssћ№ІЉв;№Ш‘`ŠFУ)šhчI„˜“O`Нyw~ёP­cиCЁŽААЎЫjЉTnЎ;-•Њ˜CzLXZ–DYбLCуяoзѓ‰~ œFЄd< OЮ6ОšTЩ"ЉљЪљ' Т~їŽ jўprпMn*AŒ Щд3ТŽyЯюњQNNЫ6хђ]ЅЭsэfхОиЦЩ!ЙUўe™z SxШ- аMЋkkJэЂ њp ‘WЌ`/<€ЬЫ!ФpwтџЭЫы$3BLы›GхŽB†v:Hdš 1С~:ŽLAФшыияZJНNл#4Ў/ Œ ^ь-ršЎщЖзCr`і]] Чw"luЋ%™нј—U-„Aр{.b ьТПёэуЛэ˜ МЙC'ЫvМ|Дy&L>‚хŽCЃ]ЈщNЗGBЋэЖ(ЩbЇ|uzvSnpьFс… ‘x‡f˜Dо’!ЛЈ#mЗє@&ъА†Дг„Iб›єУuР щ™j‡їw67пn|КЈЫ= Ём>&ЯFУ€ўtœитѕqEЕЛžышrt„јV­xW(–*еjѕ…ЉеVНЪ‰Ђ$ŠFH AQZwW7wхвЭх]SЃAxЅ8yžаЫ№}г’pЙІ ЗЛЧ‡„ѕпUEbК]RhrH 2‡„ФГž^?=-#$kmR ЬЄ‘EЁгЦnn^ ЕŽ HЅѓлZ‹—e3Ъ$№•rГS{ИЛ*t$ЭХЦN#о‘БўуLш.:к‹•гѓ‹›Ÿ Ђjбя‘ХЧ mмД€і 2’”К|}$ њ‹jœФfОс€О"‰эЦъЙc=ИЦеšЄlКЄЅёе 'K\ЋіPU _9ЯрeШџEaпї=кRТ І*ЕnnnїЖоэЗЌv}2Ї9,"эCВ}уДЋ№ѕлыBЙбi• Зd6$EGмЇ~ЋG!ЩФгž)€0tћ–&7ЊYцЕ‡‡І([qžOP[g„Rtдябђ<Я†а\ёсўы‡­A…ЕѓКН>р^’ФОшЭŒg(зQ„ћ Hнj5KїЅ–ˆр‡AgM џ‚ШЉЎ;§0pbфю,UjЗDUц RпеЩЯ81:О–ф/њsЋIG0Q‹ r­ќpќёУ7‘„ІЃ•&Ёщ ]GmDh)щ*RёќђОдш№пЎс­тaRЭ•љ!VYзmb‡АhyжЗЫ!XЪG;AV /ЭYM9Cкф8a™8>FjЩBНxєёг5YsЧ#юCf"rјФЧrDThЋЅVЅR&/†aЁYЎДqŸцєBпRе”тVР[МQчaъъфuУ"(R;<ЊKŠц„ИЅe3‰і%[Ё1XRWћЖЏсЎž\§ЇаиiDіbW1fЇUЋoљц§MM‰ПФQWSХи<:СфН(#6пЗ1мТЕ щжNя%U5§l@BмŒ`L!„vl]Ћw—_?n_Ш†nyє›dЄAЧsм0џЩх ЉЛИeјFсŽЖ›чЋчќY”їiк qх‚ДFбёB№RкDТšTЛ<Ћm MйiЪˆ%Є 9Л„Є&]№LM)^_lя^ilGФЊA!tJogrгГAh—ЎOŽю[Тў"W8ЙЈ dŸ…f­б–Ќp˜і,У"ѓЕb6SЕY+–9† –гйjUЪ•fЇz|\€гЅэ€NуоbА|ч˜#ѕ=В{Žeiјњiї–<в/§;MдksIЯtQт…VЙNЮЉ,6­xCЬWщгЁ^ЙpьВ9ТZЏяяKM:&вйЧГb­бM$з3Г ЉGZžФ>‘лjЎіv/MЫ$HдG4& гi„БђГqаЕu:ŠЭzБ.бtрRurчF0šяЬТЎЕZљ0І‚Фоо*ЕjЙ\­6ˆ#…•ыMoЕ=MЇY2Ьs &2{) -љaаЌй(\œ—Џ –a€xˆ ЅШV"кJ^qL‡8АUкѕљyYVuЧ ШрЧ>9"ܘхIрZЋUа™&™ Ы@š&OАQ”EЭщЧБЅћŽЎ)"Ч+Нбt”цф› 7Ф]@„щЃ)Вй(оЗК\ƒhaлa[АЪpYR­ЬUИ6Ч5юŽvwЏZ@ „ТТ “p žФЊЙšN[f/N| сtгaи2!Ј3Ђ№\ђг–р oі“,%ю”Ё ˜LvћєЧZ‰ї2G4Hш^Ÿєƒtў˜0S2—гIBˆКит;ЭЛУУлjЃХ ˜рmѕШ9dИО%wnЌ˜ыfZСh6Щ$ƒ-ЇœЯd-в#†$тМ“г‡Д…)Q.T]ч9ы( ˆЌŠЗ/DdЕШжжрхЄиh" q<˜NbНYэ`BzѕВPЏ+ЭFЃlНышЩKrZIц7Кщ #=Чфй9юцѓqь!‰ЮR!AљЗ‡9Р=>:шjќеБfУ”№’щф}bœW\3Ž№КiDh+18AТЄЎPы№my\:QQDž№ ‚,Ћ -˜н|™7АAс‹љЈЏa$Чѓгв iЗђј‰v,mg]тЖХН3›м^\kЈИю „ЬС!В:‡)Rэўш§‡ЏЧї6)JЏy{іekћК-&yЙ‹Fх9А,"б ВЎˆ\‰„‚щ=Єє–ˆ剓W$УЫF§ЁCbŸRЕиR 'MIЅS•9dŠс%yœLf#€$Bжc8Цс(s5ЎQ>X[пммkїТž\9п^џcылmчечp§€гЧSЦ‘Їbи&‘ ж­„žРЋWкŠOЦ}Ч\ЕЖRыFЙЇ7N/кšй#DGњ1ьгЉ&vЯЫєDI2ž’a „?HUл„ЦСкЦњ›ВЇо~yЗОўсКвцE+F* в…HД0oDўЦг„NЅмU'a|w:Œ\SDнЭžНrqЖLкRюOЪšсDC&є4ытжЅ‰‰>fцГ&oyяO˘’5фЖз6жжўБ]Е[{o7жзз6Џ07и&ыLЎБжA&dB'„h=™яTk у^—‰лН|6sх SУД,­љuЏЎILq/GЩзYVa›dГŸOчCк-‚?Ыыа,В5…Пџ@BЏџёіЪ(НЇ=_ћcэBужiџг9A7EЁ]Си./ХН;ю§Ш}$утЎj;АъW>ћИSV0ЙOЖ‚Œ_l+ВаЎ–ЪM^Вc2д)A{”ŒУ№-#šPоўƒvzmэHНY'™зўx{IFГГLгжЎzšї‡ЌGНF$‹Ž)ЛIФ›`wяуШ3ѕ—'$пЕ ‡ЊКfѓIвеhVJЕ6'wГщЕїИsІЮ#ЬН“лЇДгыk;мЗ?˜zlDIV-Лgƒ єЖоy!™'vOцHѕ2hFNDкёpн:К:AГ—Ш[убЃmфn>#—шъ ђ7ђ0МŽІУ$ЩG#ьѕ(э;6™ЉАI2ЏЏ}ЊŸќБЙБОБіЅ&#фJ>&gŽ“`Сp<ŸвCк"пЉе9BЅ!gж#хCтBFШд7Є•eз @т;žМі`†.A?CgЙАŠ?šOВ(!G7"fŽ+\M•ЗH•Щв=ќƒvњэк^ЩзtBzpŠ,*Jпщ*4.ˆj7Ђ38№uЉS.ЖD­ ЦєN_ддFд-АS—eеєВё„х/юD=S&DуцГa’ГKhіn-фЃVЖўXЇГјюnџ›klЌsДг*Бd'f#8oИrЩb2–*“н'ƒG„‚ltљшрК!ЊdЏБcОЄ†fzh=“DЫъиŸ9,­Ч7Н‹.ЧVVƒfЌˆIi~!ЁЩRп|]лмиxЛq*(ФKhDЊ-(€Ц ^BЌШл!єъ–{ЊP>о?ўvW' f}ћБЎšnпPxСZŠ ?>k˜&}—Pљg0AЖ]‘щштЬP•і.йњњ`mѓ-cžЅћГQ„z2f Гбw‚йp’фUшЙ#SBТњУэ]Љ…‚]ч%5*!э0R2w,“wJlд5IЃeLzКФš;0"DxމqэŠTн†аk›з‡$єЦцЦA›@ВТ:$И}ИBж…lF†' и,rфKL‘џ"ДЧЗjЕК ›/ЊvсШpmQVэ>^TzкŠ@а”kжлœдK‡z˜QqBѕяIЇзс]‘?ЛЙОг„NЃ7p]1@ъжtYŸіMрЕHcHђqвЙ@T^hT›ЪЫ:ЌД[еѓГ /ЉNнв -В­\Лr_ъ’ЫЂLЫЫЂžcЁVES;g0Ю$єхЌШцњvM?‚АВжёaМ, ШX~2vdЦ‚ЄfГŠЉDИ&QюЦ`ўdЊFЉ‡ .БM€`M€TL’z4 иЕЎІjJљ э3YКЗз'@шЕ­Ђ,Iр­Кхz!&†І ІУЩ2ЏЗ0)2mщ{d…^8œeбgИf%Ф<™ “R†Ёг<Є†ає‰y лhюœ€™чѕлs8Ц Lњ=yВКNˆ 2‘БNК2f™Тиmм“Я1piЃ§•AЗ‚ІY]ЗOl‰lBЃAb„1YWžxЂdgШnSзБ-ЂЊ\к&Q7оО]{ћВЏ­эT$V›cXфctebhљЉ2:3OсѕVЃълПвэЃЃXrКЎлэ:јЧэѕ§.эН†œ ОнтT№—гў3ѕЋ‡И=|K№у}ЙМ§ ФtRCpЕYNŒ7ƒД‰<№zA:XІŸ‘дЉ…XЛеlбnpэП г žЮNњhАњ*UгШо)2ЎіIъFSьQЃЯв%уС=МЅгЗAМy ˆ‡›„ђш>žз%мLб Ї?SЧ'ЉK>ВзGЌ=NGЄA"U[СуAбўJЁ\ЃХ‹tђd•Лq&иAPS—Ѕvƒ7RVM˜ћ]зв:W_оўŒЗёnћАъКЕуOя6 рŸNы’‚Є(7cЮ,CЙ*Ыюrн)Ъt6DX M ќžлЕVІZџЕк­vЃњpw_эpЭк§еUЉйс8‚ЧВбыщ„Ќ95bљіГЈз7›gqООёўЫЩ}ЧЫb—/œэnсїЖю9’аіЧШЗB‰р4ВtЩK[hБ”Pм–УOBЧyiyАЈуШ5oOЎЎ/ЯOŽ.kŽЖ™(ЂŸЅЎF I рцДK­ƒїЄЫ$ѓЧгŠтч,МсЉЭ›Ѓф?}ыиn7œ<БT њžФжё$—CЖэИ~˜А`јё0юк/-ДХйБˆїеЪеZНQ‡†“j"СC€вЕЇ<Ї§ѓŽ7pўіУQI‹ЬИЌяЬzJуњыжккцЉ‘јбјёћЯІмEеиъv k4ёаК„PT>‘н)oQM?M&EH“А5ПL'ybƒ˜ЖZжћАКHvхЗ Н›Лw2=ЫwА_бчєvoыэg.OвЩгѓ‚eŠЭI.ЫВhƒЩ FQ@Šь}ѕСzswе,ѕџГнЭFˆsі{=рHXъ Kћ&РНжЬpФJ§'%ЈЦжз†,OFѓXЊ.ГЙзЙ>:ЎGd”ŸŸXыLІGЉ+rmfИ‘DЮˆєC–[™Ќ˜…ќ/‘% ВDaьмtЉŽ(%„tMMяЃ›ЃRxєАББЙ}Ѓфѓ%j#xС6yгљ$Е;•NŸœѕсA/P6ЭŸžОGљ8`гaУЧљtш[/оh(Е‹ВН)+R],;z0`=!No9§!Ж’™tЖ?VћSЂ LšeD€m4ГуФѓЂбd4yzzd Дџђжг3š9 і?qH_>јsЩКэG]MQ‘‚,@VR?DуЩЎG˜;.EНZEIfьЉ~6 XЕ3ћX;™РLPTМX–D/~Ж&y‚мь ši,І#п4ўB ыІ†Ѓэ8$^2šБЊих–ЯY§G6˜А ,МнВ9ЋыBE s|јёГђaЪЙёьсщO!EYŸ”ќ“МГ‡УaтЌZwёЯK41<\–Эєsв9+˜XАMgyё$йŽЧ9*+ЇГŸ pYGАЇrLшe:ЋŒУ>ЯiбN{ћФКСаЗ еCпЄПVЂл=БQ(ЖГŸ22С–ЂџЉт( ZLYфЕйS4 ВUЁQИiˆz/ўŠƒфtь2ыvEъЕ 1dQ…qh*Мl’)ќЋ|9o>\\57Ю9ЛщЬ'ЫV9PKжMiYЁШ‡t#яRГpМ§yїлC•Г’Ѓ…LCЫ'[ Л)14zС ]Н`0›:_*wЄ_а–ЄмЈ•J IЗ=Єщі‰ХйnaЗqМ kИАћО<їK5a6wСиWш˜пiKЭVGёYљмhйћЊŒW4ћй;j"€#њ‚4xХŽбню/™ЛџZmТяD8•VЉXitаcAR­`‚=FƒеŸ6 ЖkЮR2гž­ fЁдi V?IYЅй`<[n.Гqєп<ћКФсB„ЄnЕ%ЫOVОФџ_—@,YЪззЅБ=P"Ew’Ѕ/ЦЄп™, %гaпјNЛ~WnЗ$л#:E0Хђ’ кyќ<OЯЯє]Гi8Є­6"яЖћЖљЋ Њд.]_›`Ј`‹ŠЊ{ЃŸл ‰Y“3‚апnЗZЅ 6=ЎA Mэ дOЬ<гx&ЉŸŸrп1UЁY.5:"ыђрПИйњ} Š,ђPk+C˜яL њx2КЌeЮd”шDЊkхГУJ‡„&ƒЃ 9ƒшфшїДDdЅБгпЇ<Мзm—Д,џтОЌхzЋе!ъЅ$чєСxЩьmџё§ё'(ЩlВЕТЮ^•ыШ:1Огi4;zFћLv-z˜…ўўG2яw-]nо\yY„ПxЪDЁB”ЋV.нžЛЎЩ&Dк­чLAШ†Шš 5žkеOЋ\[ kFЯY/З8c№jРц=џ`Ю…Оk>Š{ЖЉЕn/ mIўхd+ЕF“ИљѕййM]6§!ЩќќлХpхъN‰5й uZ-_TауЈеjЗыѕ&/КЫŽSпПЯцPŒяЫ/є}“Бм/яЖЩVНйl4ЪЗW%NГzУ4^ЬƒU%O|M–47Щ"Gс…ЦеšЂtš•RLБ‘ЂЂv}F:@?{=ЄWЄ".’б~Чм”rЅZ~ИЙМoI„Ц8R‹ё§)ЬСbA›d%DнOCGхјцљEЕРўѕC›Еp вЮтт‰NТвZ.зWcІЎˆПОOшOб9ЭєВЖщqz‘(жР–~Ц*пф%ЩŽ"GцљкщўсбщљхmБЩ Њ?`аѕёЇMG:м‰r,я;ЧYп5~SїьрžŸ/ ЬOгДзЕ,ЫЫaH_•'8(ш~hK|ытыюЇЯGWЅЩ,usДd&uAKШ ‘,=›ХШmТћџ‘Ћmђн~>ћўуЧѓЇaшЁЊMuпIЗŸf}U,AvќЎ,6ЮО]п–Њ­6ЧЫн| ‡ЯP,14‚Ьi &у@—I”бр—ъohCнA<ˆЬУpЪ”q><ХfJЁЇО"–nлЂЈйŽ*q%:АшјУKК?@ld`8 MЉyiŒеžвFТ"A0ндЧ –‘эѕуtЫё8ЩбАTjœ‹ЊHьДTЛ*ѓЂЄšЊ(6юъt,eХъЇ(Ќ^6™›fa”!6ъц(JR•N•: ‡ј;†H5t’йёќ~ŒŸ~<ЯЧyрwM­ZрНЩ3РtЌKллК ’Ј$єCKvlщŸ}дцYп_Ї,15 ЂШeе{хzѓ7Љ!ё%ЮЎŸсERЬрюЋЊ?…8Šд**фeQЌПЁ_-ЏчyAОМ;]ЬЧ:jЧqєњ§žзыˆ§ЭS:В†Ы|еАƒй#i'ќЏ\,ˆfМ€ѕ}œЦЉFБ@РŠчо4EсXУ1иё8ЫЯˆ_Г&иЕ7o‰EHвљ qгЧŠy†ycю .ЫЕџј>ƒ|š)umЌз[‚<ўј?ОЯ‡QL8ВЊQр$+Ÿ Ђ0›\’дyLфJэдЋЕ_]u)Жc№еr­бhTЋK4%nN4{:Фн#bз%ЂТ|w<Šˆс$cђ.ƒ4%яп5хїHЖ?WERИЪCЙоhД:mACзєХуѓќЫњГIшЫRГнQSb8Сe<Ÿ ГQ@ЬсoјІŠЄN4ŒѓќѓњfOЯгЬ'ѕ t\ІџЇxУQ0ЇшНС yШžeЌкЗуW/дyp§ Nc$€/щ{t<ышM Нl2Š}ЧPdYї‡#Rh[—ўf™пАLУtиь™ОTыqdlъ'+vЃw5Р8В0 ёиПСfќЋе!œlЯE†gЛњ2їЙC;э'Iаѓ\Ч9QЕPћwЙZdЫ2mДjшZ†ЦbŸ5Iб]пГ-4e;mбАV­0ќнЋ& ЭбаMњђS4N’YGi5 џўлGиў‹еAїф\џљZцZmœёџпе„кЮЮo‰+ОЎзѕК^зыz]ЏыuНЎзѕК^зыz]ЏыuНЎзѕК^зыz]ЏыuНЎзѕК^зыz]УjђВТ.ђЙ_\~ѕлVSяњ§0Œ7oŒžчўЯЄAњЛђУўЗUЖћhИšЅqЗгщЇqџПBVў“Ня\“+ЙБЌзи–ЅїЎМOŸyѓzяНwiЋивОќ‘”ЦюьT‘lщЃ%іЇn‘…ŒDР9^š"o†ЁљЯб Ы@ВЊл&фЄЊSеџ./„еBT4Љm‡EUЅKњeЫˆђvV!чVjкE•ъ‚тЦ‘^џВпнкRЃj^…Kз™џs&`qŠLmбvDˆ‘лy“fMхKS1Hbok 6yиэŽ9еIf‹:ЭыхrйЄба§ј šИг›Ё– j&YТHдИHnЋлыvЎЇІЅj~‰њOГѕннМ№џЁF(о№|WžїЕ0'œ›ШKTЦЈ„™xмжeяњЂЋХЁЅъQ‹Фїwї‹мYЭјG5КѕЦг)XэЙњшЂЋ†)azC BщYєжщЭйЕФ‘oъ2C#7P(‚т…і?ЄЕЉ?šLЦ§o‘oŒO;zXЭ[ичY…DxU•xFїЫЩ ыР]г-–Фш:2XЮŒ’рaвЉ?g)z:wo(ЭCWэ­Д]Й$ Q~џuj:nІЁЅE Tл'&еЅэyzўєи7fйщ„Ђ'нcБoГ‡gJXЃBU“ЇОЅЉІњь—KЭ Ѓ4OKv[œžЌѕoїЋ*Д FТVпC q!xš&*‘§lЃ 7ШвРQV цѓgfЫе51цѓ*O|Mи1SS!biьcYуРЄFp<‰TФђўў~ž:„Œхюл=рk$5TљЇOiаŽŸ˜9Tž7РA\сLЉ!Д\u{КЂйШВ„aшћпCeЌ(MEЕРЭБZoА€œУіЎšљГ‘ДЋё3UU%zђГЁ“тИQо@ХъhШДП,<УŒШˆщИ.R8Lng(—!1ƒЦЩВV”zr.Ъ™д!ШД8%М(SШŠ8•]’,# wџіі'ЭYŽЄU[ЖФЩс| eqм@Пя@fЮR(ТѓаЈ9яYœр%YФy™к†œywGИЬQІi^—HoxПЮu›ў‚ rГ—EЋчHшGx—ЫхЌLE$Ž{?зшЮxмПНI&в2У()™Й'Šm‰Т uс §о`$zО)Lƒоѕб‡у‰Ќ")ЖЉЊŠю„хŒАьЬкz~GШcсзх,€zmФ0гЩ 7ЂFуЧIюў‹т%њj"щpЮEŽЂОсЉМ[Эъ"ATAшVфщXЖ i|uјёЭ‹—_Я8ыЬ№2Š}З‹5в­  Oƒ2щ„ѕn*T<Ѕ&Ѓ1•…"ѓ?DџїEKЈГЬ”QOt<ЄDЇEЪРуђJZ6D.УвЙл[–ŸоО}џёЭыуыёИsy;тѕ Ћ7l€x‘5 У;ЁG[ІКРАGГ"2~Ѓд€њтѕXж№ћEсŽEzдPЂнОЧЛЛySцIFGОyљё№ьшУЛ/—ЗGяЯЇšЎ ХН—H)Š$№е "RшцЭU› ƒМ*C”Orˆ—žЁў„:FRL_HEŽv3д.§9ќРХђ$RШˆI‹и™ўхщйёсyŸb:_/%Ч2N4!X"пЊќ@i‹$ћAюVkТќЅCšDQŠŠKU]чЁёу,6ŒЌњ)ŽPЃДъ0А +™€vю_Ј%‡B_(опэбЂ4:МQlлXъGфы­#?ž­Ws"„7_}Cч;B9Л Ф‹ u У$ўёŠ@QЌИ„БсaU№ХŒš%aD\Я ќCйдЊjЫаз%‘ЅƒЉ є>_ЋŽcs”Œ юЭММaчЋ:ъЃ|C&“Л 5сФeŽ nbЂNХJ?9l$ ЈЄ\SBY‰|САС9ЌŠЩЈЦ‚šзW§aџјэaлŽ4bL/Ъ‹І ~њэнe?9ю<$љ]пЏНьМ„šY”EУ5Е‹ =JX/DY”Ю\ŽˆЭ‚0ћсХ>~˜œ(cT‰ў#ARЁnŽЯК‹ї/Џ Чr,ŽVm/NgJUЌlЙDКŒйbЖКпP Џˆ†yCЈЉЈ’hў(1ЪПJЊс^kЁ.С’0nЁ;.б9QрљQ*_E№є№цЊгыwЯпН8…˜mЙІ(ЈжS†&ЩZа.Бўmч38Х+BёЛЈѓа!x3”jрjнј! ‰­.ФP†с€Шaбl8ГПsзТ5ЈЂ…ZАY5/-”гuЎ:н1 1ццуы#кТMgYQV `rМЄКеВ)ђЭ!~ЌБр‚RнFa д{1ШPМŠКн?bДЂШјг0Џ…iАБ!бjyЗ?Яђ4Я PЯ2…ю]\žœuЧу УВLїу‡У J4лфzЈl?ЁІSNБЋQр…ГxG8aкPч€*"Jl Ѓ8ќH‰ћШ'щК­JиРpЂЌBERс5І3HуЋ2а,ќN“Мš% s}xrеЧ#šІ™о‡_?|>c ›Ž.:S№'OГВUќ†­nfHЌ‚&sy6@ХLј)ЈЋСѓ ѕ#5.…­j"вЃ!Х Б“ЮЬенrXXъŒ,"ЈPЮrы_wуЩx<OЇг›я>~јќхvBЎК‚ЊЃЯˆfЙЌQ3Џ/xбИъД?dd8СМР24|SјR!EџЗ%jVX‘­ƒАрЇS^RŒS0’љп­уюл#6†€>]™"=F#иЃЇяпМy§љb0ЁЎ2ЊцXšHѓfНФ Хз2ъ йс;T0ўKP А`*ЭrЗuжƒМЪC ОdY`рk#AЧЦаКL.^œ›ŠЕЗЏђє”ЂЈaЏ7гУ“>Н§:фyЖFnœј†ТВŠъE5ЧЊЇv~ŠGеА…ёx Чr<їшH DеkCD(ОNqŠ[Ю—„Й~œэяП™BШƒи=Ыђ}Р2a8Йќ|v{x4…s%Œе€ЯžЙКШ›еmЮЈж V†РЪКЉЋШQЧrьрВЯАp"РђGоYS,3sŠnЫФСP`ЩЮСh„гsїpoџщ5x=ŸeВЃЃ((ќТн~МЄOПRŠЂЩHбUЧ]Uvъп6r'У”ŠF‹ŠiЋђЄ?хQR ••Р;ž{м-ˆ$Ћќэ— вvP. ЫЦ6ъЪ.TІЈ А^hяwv>щ5*йЖаrдHG.+иПЋзЯпПƒЏŠSйjЋYъyй ЮaVЦ|•зr=ї%Iї]YX c$D™{ФЧБXВ: aъфЄЫ)šnEЈр@гlRеb6kЙ—{ЛOGyEдwa!ѓgп‰ТOŸ?ёєэHжt™ЁйУмпbŸd§МвnmЈ!|жЁe`486фr™ TАc4xГ­‰,зLNжЃ9`„&O^}0Кa^ьюяяКu‰lАЈžвTeц›PцмОк?8иСЮT90кЎ–фьЮ[<ЖIяƒин@Њm›ZЊŽтy`4s{&SцQяЂcЭ!jh–ШN№нСOE55ЂщВомсЕьѓНН§Н,?GЃQЖВЯŽŸтПzzЦЪШ ЯЃl#ЪhЃ02lЕђљзbnНCН Ј~$HФХ<†јѓŸ–T+ЩC[з1Б’bуCыHи‡ЂЫ†qАПџєр*mˆФ5ЊŠT’ќQЏvvіії>гВcЩ‚dЦUн,i”EZјзO_№KТжOЈусЗ…&ъ4O‡Ѓ)/“‚”}LЅЈЈVTе)’ёъ№—жX}ЬП+nр%бВц_<}њ|џН>#’фDгефX–О~џbo{їрщС›‘тСїeЅј‰црu ЭМй}ЩЏОS žU{/:#‰ytТ їЃС1АЂ-sфу‹вК%ўDёgEРЧВ•пю={‰oXWƒ‡ЬfUх№SšКљ№|vњ§ёЃ‡EYяIРСц4Е^№X Ї!ŠƒG№uvOF€o 7€"@Sšbz‡Ј,CкZ}—0ЎI|˜-H•~НžЭƒ“Н—яОž}9vЁ$%ТэujЬ”ъ>лноyгlФЈ(LР8|7%БaџљГЇ/9/ rгДЎ-IЂF"!нOŠд542jъДšˆ0 В(њмЌ…bЛœ%CrѓП"1v^tі_ќtzўiŠЂЫиM“ХI CV<{БЛНџuТ‹Ђ NпbЃйXUE‘аяРЅоШыЛ?юQЮЮcЁД“L(GЃrVЋHЬ”WMћЁ’ПЭ$0Кс_Н~їъхћw_eЂЇ‘СЗ2$nјioяљс@5?GuьlЊ w…uљцгййЋ‹Ѕ]Gс,6 гrр'Р7’Y7 Б"ыaw cЩРКлrТМЦк5іƒрJ…Ё"№”e[5ђ+ Џ>}Нё1+BŽ,=июблw_ŽnИ.ИYˆtЮPАED}џсѓЇWЃŒFCЄ`fpJ OЋх,ГU‘ 7ЏCћREЈaЧQŒzcm…jЗЂ-ИvЛёюІ–žя<ѕцѓчRQ`ЇG^f.pƒ‹ѓуУУї_ћ<Й'рйРFƒsdмёЧwoо<{Їbи %2# E—рЅјф—‹Ъ{ЈНnzHŽ7…DЯsЖнсхаFМД1оэAєzџљнглИ€ŠпёWЧЧч'‡ŸПœv ƒ,­ёк UшЭѓ‡ŸоН>8‰Ib!eъу.6кXЋѕ‚ќ0<ѓмГ­‡mZ^Z І(‰Ъ№'ЁИ 58qшлИгГbоўюСЇЏЏїоIeоQЂу†ќеEЗз9=9;9эЪQ^")‘<ЗћЇ‡_оО|vаЋ‘п|ЃД$‚sDzx–sќ$UЅљУžqutЕш№A–ќЙ-@ЯMЂ)[4}Б˜хƒgћћћяПО}іє&Љ Аv;/#‰с…ўбљ`@Љ ї\'}}§ќХўKхЄї7fйЭ&ЬП+­тЭЭlој–ёаžХА]|…+јуaЃa›‹…K4РЉ~†7ŽшмжWиъз''ŸŸНSZЌЂxцY ŸMЇн‰ђƒ $EМk?>zїќрйў'sMЂDяКN иЅљ.>7я€ЏИАt‰`ѕ"ЖэEАs5ЩfЫ€'SйqоХwA"ЬПйнњцшъјэMж“S0:/сд% о—AЬРg~Єѓ/^љєтррщѓnNдPЈ­ŒЯЦf‹ЅШАЏ я­v›"е}˜Э[”bšvU$ЃBЕЇЋ*}~x|йЇы]мъf–ѕ %Мјz}~nІ>l'Ъ‘уэ^Жуй,ЩuNœdїё§—ЗЯžИ ЋХ‚(ЋŠ„:ЎУбOЃ ŒГzž[2џ`tЪыФJд`[AxъУюљЭ€тQu Gдw„Рэ]Оxљц§зыоœЊZ‚Ч-ЫаА‰"/ЫЭџŒу8wКч'Ÿ>Ми~ЄCAqRГ&A­ёЭuoŒ,ѓŽяC-kVT7и$єа+НО ^рf8ІЮw;‡bЈŠ8КAMNЄУ‹^М{y,ЯяП‡Y™š8u.ЯOЯ:rEBНХѓВuцкжC‰fYЭМT—иЦсX†<юв(Р­kЊд?щЩ~енджЭ›ЗWЃAїšЩ#–2ёФ•YЖйob{–Z эX›qџцтјF*1­@p†#ТnШќtpsuўх§ {‚—‡4Џ›AбdžћаЮ_ЩДќ$CпЕlЫдІн‰ЈRJ•%“кмЬK‹Кщ=WCЃЪхЁ˜ц Ж@цЄwu=C‰’тОžЩЈпgД A…LР0mB%L'уaЗw{єце—Ю˜цyЇ(€>nœ…Ўѕ0Ъ†‰Вf–ehІЎаWзœ‚-bP~tspŽЂр†ш.Рљ|a[ g=#!‡0%q$ •сдЎr•цщЫуСrв9†#јCMf;Ччн~ЗsјцЭћ_ЎFЌШO;б@Qhћ]dI7m|жCхшQчјУ… тѕ•Њp‚ютѓ}VB†\Rж ›ы<РЃЈ :oОє+L’69іЅўiЧkЊа5щЫЃsЦ‡п†F/fиДœкзљњё№єєфшгЧуЋЫ‹ыЮ„хИСuЮЅіА‹ъ>ЂбKг,=ИОКМЦїDќ ьDВМ0ђТоl–ћ^”иФ­ ‚fё_іŸНљz=ŽЁЌ^Мu$$yкЪdФЈq‹}П‹еЂС R—‘mHуѓУC0ќ|ƒž :}ŠисЭMэЁьЩŽМРacKКfг3СŸGЌхљ>„@ХЮ! Щs@ьЛŽŠzњtgwwџйѓАžь==чtЧЕрkrSDŠM‹atжdq AмVaКg'WCšޙކ ЅёИwq~yћ№ћœщ№цєjЊšj€ив4‰Bпƒ$d9І0Йњ№|џрv{{ящы3Цј›0wY“КЇХЫЬдž|љtAiІe)гБ(+І/`TПлэЃ\з№ЁhiГ(šЧЧ4YD3_VŽ.БSŽчКwнЅeн+aЫj,hЋ2‹Ђ('Вmлu irіjяљГ§нэнgoЧ&>ѓa„яў•gm ‡Ё№хСщч‹)/Jlїš–Јˆ5|;EБ дN釋y0№›…оEgЪrЂl—mЌЋ,#Њp*љё€‘U;У†|@ўTОўaЛЎ ЧѕнСызOwЗїопJjфaЁЂRCюЁJ8РБ! ЮЮћЭб“ЅвБy“hНуеј8ћPЗVА[Žю aЏ5+ЉKхЇфqE†=NеВmm‰яЕX…Cьc/*lЋЉв'/оxКГ}№љšБlTі*›†jr…Э-Tн\яzС”gЦƒ +H* Sз2БƒвАІ)мЏ{ЧКf;рХ’BтkbЋ" ИOWEarгe )оG—†BJŒcl"єРhлаФЮЛOŸŸяю>=*ЎуС? Ѓ8IЁЂР^k№(< P+ЈЧ  о“Ђ$ю~Ф8ВсБЃ‡n4­aдv‚ЄЌsW$зЅщ гsВBЅŽЅn =/Б|„Ј’ж,Hd_ŽNпью>?flЬD.{Hъy Yы|oSSfЏkкU№‘ѕD /Nѓ*ї ѕ3RЂР[O№РWО&ђ‚bX`tџѓЇž (hє oў‰‚”WєШYє0Zъ=ЙxЗЛїќP„ИР? q7Џёb k0œ,}UЂFъд(ёDzЪBёг ў•Ў>тy\Цў`/AiюхЌє Y5Р7TёъеЧ>д%%ЙЦRи›ŒЦSъ}9=ЗЗspjИ~@~п M!e‘Сёij G…hСБ,TBpєTјYYЕтj>‹MM]<№Žšз№ыюљrбц$Ф4ДU…9z{ЫЩšTЃгЂ$ЕJ]A&‡6лsmm№ёьќ Ф”qУ†Т‹\rнў‘•тСГ|K—qPƒ1-СЙ—оЪš“Юц™­ЩєD4”‡5IšШ АЃ~‚x7є!–1нOя’)~>ИGh ŸЋ r9œХbˆcZгwЧPЇПe<мiп"(dJ"{‡MД%о@`ёКdясеЩ—Ž™\Щ№ЋE D­‡^11šТŒе„t†JlPМ@ юнмП>*КnxI9[@НЙeГ…ш &FЧ4…O‡чя^}<ц Ž№№hзјЩ*rЫQVшг РЌШгТOn>IPiЉЕО™Ь–…ЋiІи€“ЈrFA=/ ї’Hz;§ђтx˜LsqЄiШХ#1<ЧR|C­zјѕјЫХѕсђ„ŒX44› Šмlдižљ†$А“оеЭЮ ж Є\5ЈWѓ" т<4vC­c—‹4а.–™Ž‡иXЉiƒГы 5™pz FcЏ*иn2,†€MK=ћђѕJaJы`tХ8–Qж˜\pіЏAРWgЉrF“ЫУSFQЬ ЮвР54нЮf8`Ь7д765LЯC­(W €аEpeЯ‚œƒЙ`DЋш58оОšЇxџžЧPљ[ђйз Жєƒ,<†`р;Љ‰60ŸЯ›Ф&Э ЯoŽ9lмуQ{‹–фZВСžЗ‡ЭZf˜%.Ж4Ј8f€rŽaZжlœeЈxяэЗфRПьІNcиG0М`“%] A›0ЊYNgœUи„Я3|ApZЙ2ѕрфњќшl$jиЧdиaVЭ№­Хƒ ?щA‘6ЭЄ—P жIёjТ^„aqt@ЉМ[/3МЋŠ іяЁшJЈtъdM v<=) wVxЭиTќjrхjБ§>ЭѓЬрђђЖO АD чbš^СёwЭ‡i’L,#ž­ж№A‰ДZ/Щх:Рœ ѕЁњ’8ХGkešтb`€Ф˜bйз;‘=gŒ`˜Vтѕ ltMžŒ€—ДцЙС3xe%OЮŽNoЧЃAH1Njр`16у˜|П0tПYЁ&№§§FR ЛвЋМ Ъ]9zд,5ь žЌŒЦ­.СOсOЏlјGй„"7%!|2pњяv№ћ‚_С=JWС<ыZТртК?™ ћЫѓЋ!U•ёIб†pђА&бpKьЫ^4ре;ё–Ѕ О<Ѕ9Aбt7ЬšФОlРУЛp‡ъv:нЮљФ ‘oјщръBЦaŒ Р,ˆoџxЩГX.Њав H˜‰ЏГ€ѕD м\8H7‚Є{iф>Tз–вЌіЖ№mл€*{Ф–™eK•ЫЧvЋŒF QКЦwёЬїХЮХљееххІe Џ;Ÿ_>{?F™ПФ‹_о.АIR‹Њш^D D‡ДcDЉКW`СўаІdЭJWѓд–VдДnССKOш *Џe•–рь €вЌФ[_МСu…_О{ѕђйѓЯl†ќеёћЇл;ŸoGВЂz5~)Є;Е,[М}Ьђr ЫiNT Jl‰Cђ"ƒ`lž/rЧzh{Џb%ѓмoЯaŸмœМёЕЙеPRq`cLLf…fx§бЖІ bяљЮЮ“'{чZ ^М~ЖЛГНwмщёЂh%1а)‰гГъSрh€fвlоЪи’0#XЙкиy№UЏbЧ…oPg]бДHпОLІ&Xh] ‹bО^ЕxoОбтs~хiŠ(\ь@О§fbOп<й~ВННsHMyoAŠнš(Л ЧзЁ,-E„#ЈaEќ т№Ћa…эj–{іƒ[’yЈ9l§івM7ЉpЇ1|ВY”<зуМЦj0ЂТ,л”ЙК"ГЧЛАглOіЏо>˜М§фЩš5цJkрj `Cв[ЮГ4їdžsЂTјЮЗyш“WpN!Е<ИчcЄAMЯ~}?P>DyE: f(и)pSš—ЬИ$ƘфZRf'8б"\ь“о>RЏ`—бъЌ(Aдuqьы+b8Š€G,8z9ŒИнtPЃеј4пЉo<№Ъ”Ќ!Я Џ>ОПтUн0 VDў–EВ"ƒ В›7+œjЊH/Pƒ­ш&6›<џп;шХгйГwЖПАщлмЗф‚  Ћ$ 5PЄz%y†М XjI6@цcЇ*;ЗЗ1#B „т­^­– >s)<Э Ђ•исŠoѕИO5 %РмЪєуџк~ВГЛ§–=zВ‡Fяђ’ŒZдa–B1PVфrn›Яёalл™—ЁcYnXс…NЌIœfшР“–Ђ†уЛ€?Йй b(Вћ“Я№ОPќв+пЦ…=|‚зЅлЏІ‡џ‚їлзЂ5 iКЙи >,”=EŒШTТ.\l(ЌН$еNЪт–ђИnгЁŒŠe: #јE-l—3|()bЈNlCеНŒє­&ТЖ-<ЧBсfўh{wчЩЮЮ‹ў'4zч_žu щЋЈjЗ›ж"ь„‚Я_ШGЩc/ЌО˜ETs7A6мЄmс№<ŠhE4Ќ(}ЧвU@цQНDиД"d) VнM›яНzs„žm!”тOёєэl?Л§№doggїЩЋЁ Fkќjsд–фЗa›}ћОf№G/Zp№ў—w‡˜qa?ъиy`_ЭfAчІСV?Р–-6 дУ'ї2ДuУ№К$Ѓ5ѓ`)•щс”^яЃŸ^Пџ—НннНэ7# "Ђrиjв2‚‰ !3vХAQЭ–ио›тјњьшьv0T+ЭCћ1“Šn:Pз ќIK"TŒуm™'P!ЮЋц+вф§CZ/w!h +|ВПЗЛЗѓj €Oу4/АщŸЎё)Пйl;ўБp0|UрЁВv;=FБƒРyŒЦІ ъ;*IлщыBœ“y^Pр_ oЮHCoh“ї:™§К/OіЏ>=йлл;и}~ƒuАFЪH"ˆS№hVуэIД в87/›dEŽ™ Ч‡­GХ<‰ЇКiт'ПЭ= ћр ФХ-О"u„Ў#МйЦїdяъѓ6ИЧўЮSˆ2>›фж– т G!ЯšП‚ТnЎ>:^їЊŠ0Г?0wжe ŽЦ%dФђч™Ћ №энRМшф >pcH(Щ~tUМ8ийнфёУ]№щ§s(ЃpЮХ*lыX`{-vD-6У>ФblOСšГРвG~€\eШ›Њb@@nZф3ƒ?’5 "~кБ‚дШ9{‡Џя&ь‘Jм!ZлЗG;{Л;@>Q€лPнrb4ђ6р›-1zЕйi№щ4†Œ™&aЕсLїI’iCњ-№|FЇЯр€•,sнŸŒБгk†58’6ˆWOбшННэчУѓнмщ—з˜ЧСhдiЎ7m”Ф“чп ќЯљМТŽЫ3јRфЧOКPІfyAœf)оGОА,Гj[‰ЇЇŒшTј#чЋyьр9T…ў{ђНa‡Я ˆрGxзa%UСї /Ќ{lкЂHС6ІyUрмъ”Х›!†Ёd:§а"Џ њfЇ!СŒh*В8ГZJКH—ѓиТŽIЁћё`BЦюію‹ S=yОAL_њ‚ЂhјЈ2œ/ЩNЯIћі7ЯЋйЂqdЬŒGcŠa˜рЩc­ 1“Œс’^IX›&S9˜‘ІъYшИЖЮ_ПнGwойіўRJ"съу+Њ;;ЯПy… шфHŸ@іw“‚x}Іcd:2Ѕ Pљ!жВЕM)–eahЂХ УєCG•8№$H\ЌgЎ:4ь,ИЦоўЫЯW”‘еebLoп=‡уx№Е/тœ3Л_}p‹ o†‘й3#іЭ0Ћ{ЎUnчњб&OЇгQяђфєќЖзЙ<=эŒ“ ЬЂ"ГСЏЋ\^ћ"Щј/ьР›_|ю№PbePЇž2ЙјјbїЩСЛk О `~›Lzl‹РqбФ0ИZЯI$l=pьЋдyTЧ%`ѓDwЮŽЯ/Ю/Ўћœ„У(ŠюDeSЧрз€W1?Ќяз‹шBќчѕ9ы–ˆYg˜щЬѕЇћћ/;aždsœЭ]b7ѓМŒ`;mзвЂЌА|„c‰ћx4лиЖKbŒ—Ц2GуД'ыЄeиЧжHЈecѓ2&“U_nЃ|˜.,TIЉ XХЛ_пМР~іjqїэŽФ90, =bђїЪм›Д@’šР4i36of9lˆI†0x$Y…0гY[ ГHCšqячѕф`oїХ1ЃЁЎžлܘЬыP^\„вШФDzЦзЫКШ2€›ЉUB7@N%"Щ‚ўcV 'kkв‘$YНЇ#› 6ЏГ8ЮёЇ€б‹fСюХЅZa%ЙмФ`ђ+fh$3ЕэИ—]‘OœеП#H чFўј‹L6“Е^ЭыСW_‚a„њкт;lоЬŠ,Щ2ођ!™щЧg-џіХчa0У ВгX?Ж$‘Yvˆ 8н,pюšLСяКППџіЧФfђ ўœuФжщЧкŒNэfШ8>вWŽНЩ№wМqlHї0žУy8ъ%љwЋM Fd3E€љcНl D ŸљГ№Ш­яяяРdbљ_`Џяяpvі'Е­гМn8цˆŒ4e“)цЭ6Ї›цjиŒВхr3ЕNŠ)„>€ьѓœрцќdzѓЁбАХїdЧябhlA]B9`§РFcKВ—`тМG#ц›–ђхfЇШьЪŠ4ЪЏзЙ-7@*н"/cŒСјFŠЎВм$t”я#юH:qПо Ќ6џhОy”џџ!оА}л0Ш§nBšёp7ПџЌЭxйщХcd˜A0г%~|u9с4?kIў!s& rЛЖК_ŸЮ'Л[Е$'.ыШFf(вЅ!“.Oo:,*Зc.HвМ]nFОoйпwk3n4ЫќъцуЋзяЮz#С. тGxўЋЭ ќї‘FtЛuК^6mъ( ЃЙоУЏxџУт№ЭšОўrFIx=F œЮ9|Еw›џnжЦп ПJnqгёјінСЧl)T3ŒЯюo>сzГVїпˆ#Џ O i†EцЈ“ЮTжMэGЙ2hф7шмŽE ›ЄАП^–d+›Џю7уnн“ льїj™*є”žRЗЧч4?exЋ€ЄБT#б~љў[бъЛYŠнQДЈYAйCM ‘ќp8Ф fРЄЄзTцxQёjђэЂgН;BјƒпўbYкPБ4еябьT4bђ\ё§№т>УˆП#Ч<4T‘іњSХђт?РOт ›JxA„х”,№ЫУЉЬI”НЧё йиюяШD .‚Qу™IoxХˆlk7qgIЂсOпўЧЗЛEbтф65ь\і8У‹cЈх~Э=Їс.C5Х2,'т…‘уак‹Ž ŽЙ‰^+rySEЎЮГ“юˆf?ЏJlJjФЋЭ“9ГћoЙПk}Me‘ЃЧЗч7ŒюFСуснXS0Z“yj2EМТАЃОпxшпіœР‰YЯ€c–е#l^qnyхrНЁœКЛлxеЗП|Лo#ЧФGŽžєnВјЖљГш{UfЦCŠлеVЈй ЙХШqњ~7ыŒЬІЇн­ Ф‘kЪ<ЯKAћ=<жЈ ијЖ(№ъXF–Їб`"[žћ™Y§о€ёюJDЧq Ў@рР/шnSi­gЖ’<Аw№Кn'3KtцUю(’Ќ99И*&ѕћBуG”Ш+nфH7мњјњЭбЭˆfyQu‹љІоСЬЙœmтXwxtБnrпа™§TгзјуЏБšРё9ХЪa›1šхš8 ЂlИЖ$0'[Ÿ>ŸєiфвTьlЖиминЏЁТM (%HiИ.—Ьє5MZП€b$7›нџѕЏљЫАбš„НRŠSп“aћвЇ=FР—pY ŽЗ.& ђ/ЩЊ›у+-VУыezaœ–ЄŽИПŸљ|&Э тиw:‘џ?Yј*я„љќюџѓW8|3 ЏŠ qBWXљпU–Ьv†МјDјСж@№Eж‰Щ+с%\ф’іІy5хн `ьЄ3ц%o„~Ч№–jXARž‡x_,дЬиL'RЩ_lŒЖeЁw9фёТOF[cј<†#)ЉZюАЊAтM(6qмАjaI“Ћ.ƒНШ†њ+fХХlƒKз#Ы€šЃ‡ччѓ6^fКШ‚јk"‡€#-А‘xЖўёЮЧЁКЄєpљ ™:–Й!KЃгSШlЯнn1ЂЈ™У‘ѕ™`щeЂIЊхAˆє­и…•кŠалOFПL*@Гœ(MpPl†ЕЮWšъЭ%oФ>№В3lLнœžнЦƒ#Шќ:x–S’љЫ…Ц–Т6эКгВ,ћ1}єYДnЙAр9N/жѓ<ђmУ Ž:Š™‘ —Ъг$‘]_^ОкъђАсЬh4Uв%ЅѕЋŽЃДАlМGиќ“сЦZŒJ rEїZ0:p-ezњyЌ9еїђОз‰5М=|p–wnGМгл…EЌ*ВтП ;рижНXŽE‰Ќ`Uы G—'зМЬч‘*`žК&іАlч§жжбMЏпБ*zвdЊf:і7O)FR‘ фЧILџ' :Ё Y$PМoК#^їВ%dфM=АЪь Rd~|ИЕѕљz0І9-™m.§fŽЂYJ‹А§Ћ›!‹ЏNвŸЄЏ4dЏF‰ao >ъЇ-ђЊ"ЙџcыŠKdFG[[Ї†ДяŠ‘Ѓu „IаˆwћSŽуш_Р•§_/NŠШVЕ wДЋеж#DMUžАlMКАгyЃf„SyН\ЭpтВHАeA‚‚†љХЗDЫ ]yиc57&t ›{gR T?Ž&гёЭgјt‚т$ШгЛ&ївЕЋNTaЇAŒTкŠ№' +бd•ЩжTwтчњ2lвbфeЌ2УўˆštОnm Ђц%EГК›7hyЌ№qɘзeЧT+І`%c§)A‚РЩЯСMєhŽuы,дЙщ”Ё‡Ї[[<Т䣘ЭR?nWwMhƒбEг–Š‘˜ЦЃƒПdЯн`&EтІУ‰hчˆ‘я›иС,ю>WФЅЙ­Јa‹ёаЃK|NЖ х‘фƒ?Ж(]ЧP™CЂžЛ#С ђvхп  ”ЉЩ`вэaЛЌЭzX/ЊаѓЂ"O"ЯњейћџГњŠš ДbC R.П§БnГРбvkыВKБ‚лхQ›6 У8OяWд(\УёtЪ*x]†т!DБŒГzSNдг66dvBУ^уXЦЅ=ўЋ?хq@жs-УtВљzY‡–ЊpшгАПe" Ы„•ЌЄЎ’Р6єŸ/(ђˆ5DЮ5ЧuœМŠЋ:uu}š•Ђbфш ЯBuв #ўI”Jrimaлnћ86FЎ0XY†ќ“.N1œЄ;ШŠє‹4”О(|р0А X#`Y#ѕv™ЎKииEќ^7ДМ7џл5ЄE VсЏПнКАиd‘Fм…тўiЄwџЭЂqкMз$і_џіl!w№?›ЪёП_“o%<ŠэѓїњН~ЏпыїњН~ЏпыїњН~ЏпыїњН~ЏпыїњН~ЏпыїњН~ЏпыїњН~ЏпыїњНў)зŸијSжDBAЎ@нктзў/кЊў:€ў§т0 м0I=zрцiфќЧŽ;N"ЯБ=эŸЧv-HГ4вВŠd6ЈъиRи5›кк’тЛ;гВLЬъЛQб”БWѓT“уІ TIsня}§ож–A:LQCЂЮМ_0‚ѓа5шoн*>ъѕEq=o’АšeЧЁt/9™УюэжФ ‘EƒШAжEьўЃ}d,ЪLg(Йi]ч r96эЌpeйЫ"МейъѕЏz”d8и­ОXЏюзШбћоы‘ ЋдmuВЊЉJdЏmч Вjж‰Gm]mн\^08tюU„њьgM|}2ў‡Е4ѕ†Ѓўеmщм0NZЭё@m dщˆjыlыќt y6]ЮБa§л§ЊIm™W§?e€с?­СxЪ№T"›ЖСмty7!ДrГ*‚(ЩѓаUЗЗNnDУv,УNš J›z2+9žѓ#<\]УђЂЬ†Ќf;њфЖ'љHфBЃКЄXЎыЛошЭж OеtнЭЩ<тВ№еЩHё"џql‰?Вˆш”ЌК0№–kI§Ы‰™~ІмеИ ƒ’‡ЮєУ–ш †ЋГЂп"Ÿ@Ј<-XQXт/ўяжhЪ‰Ђb8ЎkАН‰ю8ієМЃ„ЭbбЮъРжEIEіъ‚ѓЂч\YђZŒ™Ю‰†e‰џ'EўƒЭ!?О’\Ж<Š–cs7C-n9Wъš3п1F#7AжцЖЬbˆдыѕЊіYж“ВJlEЧЖўД(BЃ†ЌЂдmьшХыІЮEЏhQЊ­Г$IГФбйцГv†yЅ•ЪЃ… ­ц(~$‰o§imЩ,ј2Nл(B[уyI“yбNф“BTДMmx!†QтfЙџЫоwhЗЕ[ђ7цYbPЮIЬˆŒ“sЮ9р “КžљјЉjа~ylR’§жЕyy)ЂаЇКjWwѕо>Њ€НИZТфC\-уДŸЩи№_^ЂzŒfйб"ЎJ˜2KГМlGѕt!КЬ“$ŽуВ СЯ9Ядd5šёоХъn5IСŽвf9_Ќч™-sЂiџ(ап$8bGЈn›ерС™op}H1a9CŠ>РЅcУC€iЄіЯ^6МжgCшкn!Х *8F=[­'ЁСзї~„єoБaЛЎ)`Њп2ШкKXw†РЫVкЬ`ЂЋ<&7ќЌ ЕўЇƒЁhхb>Щѓ ‰Ож‹:1йђтЃŸЮ2†ŸхŽёhžЙП=zрЧEbjƒЖ`иaУ‚šЁAЁm:Q…”СЁqєМ(.Š@Лйo Њ б{’…a6EюДлyh˜šNз3А_РЫ ‘§sY=ўнL7™–жЙр ;Ž“ЄмЃGКB9и4ЮВ2їеыƒ‘Іš 2?[n<hŠ$u™Эt9+ЌZњІœMѓgБыќЇСi–—Ь&Ўжo‰ІЃFи|…ЄІ„€}ЃЦшQфiEЮєжбXQпMђ@еQn}Šl‘u Ž)ЭЧЋ%р5Бjx:дѕљЛ4cN9uЖЫhf„њH(ЮЛЁФk$L/ѓЂТ0Јc’”ЏОДQе ƒЂFтэ(ЮъљzЕ^фŽHAА™Ђ єІОШђшЁ’Єч ёB‚ЌMak,1ЕЯРMa}­ѓ•ЌВ$єрe„)C†GŸЮњŒъчyфёнЇјeƒгШтE+Њk$оYжYšЃъХ/ИIвEŠ™Œlš9ŠРƒЏЮ 70І (ЂЪ В­JHBb5г;9ъp"оЮIC“КnгjPM\`žћ ЏB ФћяwKЈdЂ%я~ОбЊCŒЗžE†Тpš7]jqB{[цYфš:ђдЃеYhЊBяFЖ0„n мŒфЌСЉ—ГЬ3ЌчЫллеЂJЂ8QPіgл,@TLu5žUО PУžЌ—ЇзHкъD>| †;EŠиƒЬЁ)xИЅшЖgEйЬЇ НЈ}•UИœw т8‚WS%Јњџšх†gЩЃЁ`ГТбXбЉ‘љ\cк :Ъ:Ђž`УгN‹žЂŽБc" – 0–№аBВŸ4+BОHш:…%pЏЅ„Y>—Ј&WM&€DIЗЫ25‘юž|xspвЅЦ+AР#зєяюжЫ)*vУšьDDШ–•-в Cѕ;}Aе %~†Э(]h‚лЩЁ§w`™EШ’“ MдЦѓЊQДžЛ:gd‰щœьПўђргСЗуd(—„|RICdlспVХѕЊ‰tЪdNT-7JBЧTеŸEzВjyrъ И#JЗТ ФN^˜npв’(ІІ№’:sp|н>љќўУћ—oО}kЕЏGЊ1їв[<Т пfNў‹ј ЊЌ˜ІсDDŸКHlѕ'lO**ŠMmЬф˜‘5+ХЉ[-52 i"dUфЁЦбНЮ`иО89ўњю§y‡cŒю@f! ?H}Лš]Чй’pмР›ž-f(ў] ”X‰ZЗЉ­§№†йHƒЬE4ЃC$•‡…ešvTЭ&ќcŠjІ+„Є&ЪРСВъ]œМwкWЄсHE2 Ђш€<пЋe‚ƒг%"<ТЯI˜rо6Љkh(ХY?Lc#в‰О\ЮЂа„1€dІdБбпMѓ&< <•$xЊux№ѕн›Sк4шжвЊ†вм•мˆфг2ВgтЎ%‘”ЈMyN]ї‡‹/QжM'ШpэрЎъаVS$%Н]ЬooЁ^! ЖЈ€PЉ!juNПО{{&˜†ищin˜ЁюuЈЄœ­І%ъCNА( Ш››Qын…ХБЌbšњЦ=VVн‚К•P "6 ј!ыА‰ЈS sЙ!›yzpгє[NЫ0иžh{ $&Оы&“ES*љљэzЖЁр^т‡2вНokЧЉКіƒcŸсx^R ?Ÿ­юi‹§+ВХЂ*ŠA Sи$Cэ3I ЧŠсXf|ёё2tCЃiе"ZЧ.,П\Eжf6ЛН[nјo' ъ/ •?ЪЩ*-(ЪЭђ<„~•UУbКИ'(_&иеr:EД3]M+_FкиAD HtХ^}јмB6=a8V с cfий|^aвŸM—ЗШНØЃ№Г(K(р­Ј*ъXpљЁЭTIC)KŽсрх5ЈFb3ДќймgИ> pѓМœц:OѕnкЙЭ$A Я>§zжr\яЌEюЄAVЬx >]сТžnт|хЊLчІ?гq!{СZdXіGЪ"cЈ2В=БЬvрa6ЛоKЂ*e$3'ŸЯњ,В‚ "/впОНпџv=ІzG_[УEГМuёfuўІsђsfЁСu.лCtBc‘р„ƒЇћ‚.7šсd(W% ЬhаЇDжžЎюyСш‹(Tя.fБ2опяŒG  'Pп>~8nѕ)Њq:Bj& )\}0:#S=EЬД,M…†7 HJYE ~‰Š$бnЂ—Э$вp QЃс˜E.ЋЮсЇOя/xUC p"\nыPЈљ 5š Ющ•:'˜ kPфз]j4 x0њqQЏУ‹Ѓг3Z5ˆЄрeи5V‰ž#Еџ|y;Џ„їЯОщХ„h1NRxi EЖdip|ж=8aPfž ŠюЉkЪ‚QLaжuV/1рW†(ialHtgЎ=О9ПB&`A–фЧРкЎЎ81љl1­гРŒ.[5xЧ Рц"ыОк}нOP(ѕRЋ,ŠP6*ˆl‰я|>Ѓ(ШЩ 3рЭЏfЅoсdE{]†5Vы™ЏЪf(ТрzР№ z}3ШЇЇ=Šз†&ќ—ƒ›!к &Jъ<АL`щ‚ˆ‹№dїйЮWЙбh€DˆMваеxњтнЇЃзŸ)йruЁ?ТА(eВёŽШš —9˜qXдђŒnž ёNРЉTљ1POUЯP5Бгю`БГѕ ЗQ>IБЉ јЖ§lчE;"‚АШ] ˆ їРDыyётхГO#ILq4ь6!В ѓ@UILIu[ЫYц Л%rЄBњexЬŽъуЪ.UѓbжМШ ZmZЖKф#ЈD UO‚унg{;D"зоЬP)7%ЄЊdЮ_ю>{ёьMGTCWцQT šOАZЈМѓ‹3+"0D%Ъ0Ы3 †дЙœ ЈЪ#fšСЕ“Ё†6Ц A3Гйf”}AСБšЯƒЃнНgЯž_'Ј0д Oщ4UX ­ѓЛл;ЛЛЯЮy%N и1B”kЧт ыЩtјт(!К.˜р MBР&уіеХUo3-B`е”GФ<ˆž^бдYрBQЋЉ†[  4„Ь+{г Ф ъw&рК§МуљaŸ=Ei*TЁ™ЯъКЪГЄџъљоО7‡Šk‰zE‹ei@‰Цš*jІGY™њŽ.3Œdjdшщёn53j–ЌNFчЈиГ$*D(Œ8п<їљш№+Wб(L–‡aф(‚0јАННћі| LK‡тšЃі{QІм{pЉoбrEшЩQ2ЃаE Ef›&ї M Yь}y`­иcU‰g!“5‘Jš7E*}#‚ŒѓѕЂnє{o?~>њrщЁќ9ФыЬ6нРQDfw{яK№І@№Ч­9єУo_?oxм‚А[эPвm|2Џ­+\ ъЖћPСАЏAЄЂ8еСbр>бъФУШ…Њ[ыe3uОьН|љњыСЃd;ЗЉ–*‰ч/v^Q’Є‡iфPЋO7eqхп|ќДџўн бd?oЧA„ьп№ЮJO“щ›Ї;a`лlЂeЈ‰%–S "Б sМ@™R"Л‘AY-їѓю‹ч/пћ б­ƒUk!Аž~њxpвa5л:8YEtдЫМŒЉЃУУO/>ЈXŠoФЗˆВ*ЊЁaQА(]UЄFœjЅЈŠёА"РгСCnЫВ†hюЂ,ЎGфŸ&"ЃрЃіЇн—Џ^Пў|| TЈRY•u•zТЈuz|tєѕЄ'`Ђ3У\чЙHљo_ПОн§Џq‡ъ^"ˆPˆ’эLНyљЌ[C˜&J4daI$@чD\5›Ыdщй–њ Ј'N‚ЛB5ЦКЭ~ :e…тѓЈYJФэšДЕ Iфеч§wohіP‘”И?fŽz§^ћьєтьb€cрІ|=ЯжссxЏјбмкФщПЪТ’\‹Вoјѕ&uћaЂ"јrйЬяŸмѕuЫ4 }ЯБнЈjšv|ХНЋŸјђюйЁРJЏЊЮЫЬ3 u|v9fDЗœр#Рт&Яныу“Я/wŸя}4юЉьIџщќ^вsТ‹ ‰€пЪo1И™UЯу<ЂƒІЪ .GЎ>Q1Нl#ей4бХоѓНчяО>о/k@P.тбPžч‘І81ћ Nr<”#ћ šq]м і<-”Яя>П†єўь5;[oDщцгТC]Vг…ХCTKёPНЂˆєPp:TMлKQвw #OZЫНƒЃы’ @ШрgьЯG/vіžОм?џќќ*JЋrГЅ€ ОчААЊpїОЫ№ьхЧw{0`Ђяж|7-Pя”exХА6zГQ„ DШЪз^ШІхFѕ 2‘:ДнŒyР`Pыkи№ŠŠžџ|ggчй‡ГЋƒйrмm"юсy(њnЋцёшЫўзWр{Ÿ4dX_ёЩдT$zмkЃpЕІ6>OЗВ&Йk% Щ†эgUžDnЄыв Mёю_@Fux+C!RxšкСюЮоћгNчМњzЃФв<gЭ№3TїЄOЏлo_Нxў™›.я‘єЄN!K3hЗzCKCм–—4'*&Eри=Щ Qю! ]Ы&‡to,Ё~Ў№ZК>чœu&xŽвб‹g_oњƒЋ.39=нD bєfфЉ#ъкщљАw§эЭЫЎОн@џщДЛLCУ#МсЭйq—‡"qа‡ъNЗќДЬ|Чz бхXЗ\T‰F…cUu№љŸ#Я;?`L?ЋQbF"]|иПщw[п.ЬТ „ИLaЖ tnД;/BUДМо—ыё`д9>r\‚sьiЏBЈ.4мW’eapўюэЗЫЋ‹г‹Vw$b]8ЮуЧHƒџBЉЬєЯЮЦŠb8~`Cду%ј ЌiІЁг@эŸЖ:з­&Ўœ~ЯLб›7.’ЅБNIЁ?<К‚ф~нЇфА!ВИ"*_БЇOdI_„9ўzxry}qвтBрwЧК’Œˆ~ nџx(kNˆ6"УЎчAZеuGЇŒњTПзЋEmЭ(УŘЇ‰'w[RГPќ]ьŸГ^щА‰ЏЎcSя_)Јv:W7OuЏ.[7—пЏЦ‚ŒœЎ- ЌцŠfQ|ьцКKKFѕЇ* ћЁх5|РAг:M+Ш‘mkќИOYeЩО{sp9`9A–Eњђг'Іœиъhž_ГВ$в=Jw H_“ FџEfwa4 Еб;Ttпл#Тюoaт™*;bѕ ЈIОC5cx#šщИ aаЃxlEРgIXм˜руУї`Ђxw>–`БЩ,f ЪŽcЧнжххUыцІ; Yz№рѓA"ЄЬ(wжѓif)И=(A\їQ— <C Ѓ"[FлІiЩWћ_^Т4яэб;oїКЂn™^ŠМЭЗЁъ ŒNЬСЗ§гЁ( уоЯE|GХ 5j4б *Ѓq(’іРбeyуDЈ—Щ.•­Щ ‰kbПЫ)"eФЪ9§DuƒJ Ыqщo_^яЁђ8xЧолw‡4ф$7ŠУИ€‰лPU sGюŸ]Ž8ž\_ Es|зPQž(]тОЉЂ>t—‰—‰oŸ_8VВ‰Tє=Р4К*tЊSDР7p@ц‹пїлБ=}pіiѕвС?^О}лV‰цw„ZшtiˆэЕBƒЛiУš– Rі)З–"д– ђАW~[}XщуЩŽFЕZcAФNЏ \‘t›{И.%ЋpУЌAЊЦv `ŠяЙ[ъ>пyљlЅщ_rраPoFq–“І_T&‚:ГI-iиaЩс@’ю&yG гиЗQтќa%тЇžcШМ Ј†O’ ],зТнnРN`4Ў*гq ]fЩ\ЃsіfяѕЋg;л{/^w4РИžD1ёъ з# –fZzлЪІ HТгGХŠC`LРE|ВyKR­ЌLШqv\РZ7$Єqї\(ЗИ1$/ХЬШўK]Фˆ4ЪТ"šэтr”Џп>{ѓцљЮЮѓ_ммаш,ŸrІ*бш&6Фqс.ЎuX9 јЁщИc8єЧьЉkК“VЄњžL‹вQP/+ -™ыœЕЦœ XII6`rˆIVU?bє*Н§ђљћї/v_МyqйгuQД*ЩHНŽhЛФ>XŠЊˆ1B’TнВVsPРшP\,MЄ=цtЫDыњЩ„TїГ*Д/Ю +уƒЗЇ,ЌЧ 'Ы з`šТьmRА=жqС›НїŸУŸзд№}’ЄР›KвП)ыд…Є#aˆ’PАI—9š“pВ\Юb]•oŽЎ(L‰ЄџЊŠ{bSві‚хS ЭЗ?Нo‹PкfU3‡мet8ДЦLI1 |лrЄ§gяо?uИџ‰!JЌшвPхnv Ёа­АxmЪд <1<Ф]fЌb&р$ВбHБЭyЕo]Сc-?ЦЋ6˜Ш]SЈжЩСб§‹КFQVdЛЋР­ О)†` hхтХ›зЏŽ:g'^т‰†bЛ"ћзИЁ@’#>ЅибР1g‡‡—Œeœ8ёЊWЭ РQ5]чAwI†(Џ rPA`%`рЕ'д§›жеёчKAеu”тƒтУБЄ„ЯрэE>УьП{ћђ ­Ж9”(Ч‰Nrˆdw ЗШ^A–8ˆ88zїўš“uЛiоШfЋyŠЯйннoшУL[Gсо:v"дхh€ИмЭС1ъ%)v3=Љ6лји!ю%a„›,&stјљ*ˆлЧ"фШf:Щб=Њ'qV=7СLФм_кИ=›D.ЬЏlФгХjЛ^R%жƒŒІMЌСjл5Бёч‰К‚&0#†ui-™ЮgИГH5кƒЗЖРЉЫ4йЋNGЈŠ^uу Ућ˜qkА&›dия1 хB%.іOі[Ќ’~Bx(bДX.ЇU5ЉЁшxˆбМiG№є4sБA~›nћc!ќёPYХЭwЌыЭЬAЌЦгкjp,ІЃИсЄQ–nИqЅY^aG*Рi<3РЦЋљ$wГRW­ѓОЊЂєcќЎ7ѕИЗмЄЮУ0УЮšI €CрCXˆЂ &(‡нŸ%Вb@ŒpЇˆ“4)яЅyŒFњaUд9Эšщ'YВёhrАлр„Ѓ#?гo:МP‘!^‡й}”…d[Dд,;ŸуЙИbƒwo&xДu?иE|ќfŽзЕ&фИvJvэ0‚zФ‹nи(eK.Њe–ш<0PcФ›A-.б( Ъб—ЧW#–Ѓ#VPуТZ> ­‡Э4ebЯ?ф Ю5ЖJlі 'Yѕ `}…’р˜”'9йFE-є––ФѕОі2<'ЇЛЊЁђc!€j лррнејРhˆ§О™Хт{Ÿ?~ЛИ<;>Ль(ѓѓ2‡и‰—ИMѓaд†ю“ы?w+,јч+Вc?- H и9f˜AVc?Y\eŸO=щцІзэ\ьs)LlF] ьЭбЧs5]ђ.WЌЙHХiƒиЊxsv~qйjпмм еЎчкVMЪа4–EЭЮА­ВСт/Hjм}›•žТŽ(r= Mq7Ћ'З![ЙыХwlЊCГ‚™–5žЂA•X`QŽ)ЖЅ*ƒЗOЖaІŸюœЈчOpЪŸ<}н$еАL+"Єy…W[a%жiт-@ЃSвГ3_GOœ—Є!v%AэЦžМПшYT'иJ ІЪНŒl&Ђ3т `<rЪьoУ<ƒБћђЩП€б№щл!'&”+jвƒGЇѓyхЁ.KВюш`0Zэіѓ&ЕЁ.Ь5 šюьыKxdр`AJ*#Q”­Є‚<>ЧN\‰uл`ДТŸю=нy sќ‰?њќdћщ;VBЊЯJИћ*АиїЭЫо§њ)тТЋe6R.!ˆdЉ…2ЬЊвMŒ~њŽкџг.8ЧŸЖП026ЉИe“KЯ ГЭ№Uш:`х—xщ*P.ТS%хEbŠœhE#wЬР‰‡ђ>УЦlXСžz(g МЭŒё3МхсІЊhЃ7BЏо~гџј/;№й“э}}ђъц§џяиyКs Љ…lt[aЙi№œ‘Г Шќр3 s{ќхЫйОл ’<Ќ>ќЫ ;tц3ˆ­)ZHzЫё@{.I`Žцф8OP2ЯБАйR|Š^ёфEћZFCЃXЬ&LaГitСf( Ы вŒ 1+,‰л—эот4+Юћ1Н" xУђѓйrsЯк cCBрBšЬыM DнIф9ІˆUъП}ВCŒОљќ'№’эЏ=T†ІT3вхРq:'ƒєx`їФ,6%QтY–t:ДbО§˜жМ1@]ž•_ЂlL†˜WƒХŽkЫNkєFЈFf‹вGAkМ>pљьЩ6њЧ‹і—'ИЙН§ЖKкtu*ѓ RЧ#rCRьќОagЄЩ ˜Т#‘fиуІіЃZЈћ“гО(ЋA‰wйёЩ"ьmEHхj‘zArй<ї šЊа_№`gчщ‹жчЇЛЛ`4xЗ€N йrr€xпќЙXl:Щi(В)@щ;ІЁЩм`РъОwжLЇЄгЄ!щjV:<ФqoШŠN1%ўnŸbЧ“ЎЈrяѕ6БzћufzowoћщЋKЦ3j+žЮЩЯY’M ^nњАлВ9d˜jаЧпЮ0œѓчЅ5Ж™nЎXЈ†Т_`Н1Lѕf%N’ИЎ ЮЁ0ЧЛрЧИЁўњіtgwхо~ŸџаMЫВ3Єм™mЬХ.вфЖibšI Ћ;}[гЏ%,k*йъ…D]”hј‚№KфЉШТxH f6ХТЪЎи|ЃЉмеrЌЕГГїMщCб‚KqїЭЩ@€№k:Ж•.p ’ЎŸ%i[Џ6 ]ѓil!\0ШYќшK†с…iЃйЖФA;€3W•EzФЪ>-ЖSзљЋwxzИНГїњы(аЏОМХгЂэн7ЇCМѓj;FМ^lцysIћ˜­ЫYmKˆёŽE§Р]}Ц€иŠњЃЊ‚WUЁ ђ6[ѕUВ@QЈ№Ощ‰L-Ш@`ѓ.Ц={ѓљœіыТfZ‡^й}>RL0кЬ ЎGЃ›VЅ%ЙѕŠKe5 tс•“~Œ—k5эФ / ’Є8уyVЁ!ѓoф~ЋUЈ{њz–оіоЇ+кЬЈ ‹яНОГНїюdŒJєюфvAšeIє Э›Л`x%4ВP^Dў/@У?‡ярu%г ЃlREќ|=E`МXнfNІь?C›ŸН;ЁduСnЩ:ѓЄўщЇ;ЛЏO7ŒМ;I“‘Є™‘&с ЌпBдCсzlЪиsБ­вкэїед|ПНЛГїіŒЧ88ћWЋgГ:вњЧя_Е2ьЮЧ)%ОМ"wШЁš…ЯnqЌёЏЛ[lфœзоуV  ЉЎсA*nnNјЋ СбЭЄШЪ)qЮѕzж/ ИНПвЪ !|nГћO'‰6jѓКЦИћœВ^`GшЌНƒqЛО#ЖуЇ‹м}pЯе_‡fкqž„р /xA‚5щІyг|ŠзвїѕДІžoяНяИЭтОFЇЄDРp1Щx>ˆЧ7} ЁЩmw0ёюћwwпПпотЫ*ДЌG'qЩАHI.Я6Б _š$bHН`РнЊЉх/ЏПt§щ}ї/и‡i t^[x5inџХљн8XМљ§4мЏ–гдЕЯ&Eщ†eƒ—$ЌHŒКџˆю‡3};Ÿ41н aЉ  hL &“ьП ™“\c$­ЛїŽМq˜lќ І—фЂŽь‡[ќћ!VPB9GЎz’ .›6э6>у4aп0D,мЙ.ŠЩЬЫ #LтњиѕКСњs$Ќ!w‘–иšОЙZLœƒИ38ЦБ›м–žAєCrѕЊщто<оž.V‹ЭэZђŒ†з#їšзKЄ‘к$ftїY]`M ы ФKаёš wїO }Э]“&&“vћiтќШDc›НOАRqМ0С.‰МeШM[ŒшмиѕМ"ˆI™BGWЊsr1тT7ХёХ}oєт?Џ§Уj3и<†Es7а›yYоФћwƒжЭ }Kц3;ќ\ьЧC?&Дqˆ{Ф†=‚рЅ'ѓ,sѓх§›ЯзЛ­ŠА-HDч&EсцSђю!XxAZфY`щКd…џ#щ‡Ђ9cHН“Ћ ^Фs9МИ&дk2k№Ш$nћg‰Lгs§roџf0Sj}Cџ@AЏ^a $ЩЅ+МЌЋ9а„1oтAѕR"НŽЉвgЛ4vžЅј“N5FZ’Т№ГхНLC‘fYnxќхZфh†ЗKRЇmbЮ,9УЙЇКЛ]NЁЂЅ@Ў3dlќ1›1€ш 7М:я0‚„[ љмL /и omR№zЕaыф™[†vМDВpЫ `єМ)GŒ&Ћcмzšи:пkEBэ*А+Щ?.ZЯђьАзsPЧ с;ІЭ№’†З5ЙЂЗ"—Oз›(нdЎЉpє ;b/ž“}ї9ЁРXCкдёA\Э3[—иQЏлчMзs …џiФW}|ІYd‘V*Ї йЄссЯ!:›Ыˆ”ъФг9fдЎGФžШ?ОЧMа№ћэB…†їTщ~wЌК.МнŸЦізч$јЩьhХЙ eЕ5›”F Y’kb 6sCBS–мP,oЇeA„’žmО‹„K˜шяZзТОo…э]v!—™>њяЕЙЧЮс5EМrM оќОЇ'Bв„t‘Т1?nЖ(†wЂие%Žсx%Z риј>Щ%•ю%ф! ЌЦ­+Z5Mѓg’œіFxмpкtšззжшdŠбr@–€§|‘cЉQчлЫŠ–c*иƒЭ0Ќн,ю3!ў‹лн­g%іГiŠШєoЦЊљc ќ?JRUвєžЄY5X} pЩU6 gsЗpQ$2Ь№цќ-Ј”’,ЫR4Ћ—$'т"џўѕ0ngEфкКˆwh(YџЉ=FL‘ц $Щ'€зўјNа;С Xs,bO Іvи9мb8N„i†yІ:cN-IP'ыїшїяќПaЎ#лщ^ЛCKкуvЅџ›м-Ž _ЂmлЎ— qyэЛЛѕн=Аœf—uЂ ре7[#Ьfса7чC^Ћ6Xуіg4иLМ{^јІЪорyўЯ x8$вЃ 8WS ЧnЖ„—ќN%.ќЅiaЪВъe%Tъ/`Ћ›†MОhѓн<Е%†•4ПBžФ<щ‰)Ž{Ќ Њ– >нлњєюЫеyмдйT†€ЊиwƒЌY“РГ"хќj>­БђЇSпВ2оТ€ђkі§ЯўуnUa{2@ФЋVwи6t;Б$ЎG|UёйёжAя#В†\,sro)…]г /_рЖСВЮ’ oРbЫяџ=ƒж4гДУrљ§ЯџћЯпС ЁœЁ8№#žсTЏюfž,ŒЁVРg"б'[-^СdМzŽ<ИОžњD6M+X MhЖте?Hц?Ÿž6 ;Ь&Ћ?ўјѓџљО"j Хѓ#9еэ&Žy`V‹P(№э­ђ/Za>Й?Ц‚Љž†ќ?0{!X–№Юyђlˆ7КЭ[ŒiХtЕ&Ћ}GЊХŠ"3ф­ xзЗЫL“ЙnkС‚чйЋ-J ?Хžaš^пЮ]D№3н г‚Hn Р$ЫўЩHщ/clZaН Ё/юF– БDЉ.k$+В АЎLIœžCРрИбЩќo+@‚;ЧM;ЅХ„КA2™-–ЉСiћ+ѕ_ТšНХ'’ьOgXщUЉ -иn‹7в[BЬt; U‰Но?Къ G7_З(яc‰р€‚Ђ[Stтc$эУ>™XЩp№Zеџ Uи!ђй`ћ"€ШРJОŠgK:iџb†FPЂќqПŒ!'Š"Ч x…ёОm ІIƒ0z ћќўAюc0ŒYўпиЦЃев/,Ї~Э шjљ=~пуїј=~пуїј=~пуїј=~пуїј=~пуїј=~пуїј=~пуїј=~џпo!ГжPћ7~Хр Cф0іF[zјжlьрœ0ђє+i§Ъ12ƒа7Е /‰qВ"vџэMŠсжƒ}љe–ІўЏИbёЈбГУ4‹ф'Э4ЩЏ'БЅˆWєЗКf’##yU‰§?ЁЛ ЦР‰ŠЊ4;›7‘WNЋ@с$7Щ$ou[[tдD0g6)’рЁjIПhHиЉ›ЙF8™7ШEЊ’E<АљђlKђ“zжlєyЫ, ў9]ІџvtoЎzМхUюrУOъ" SpьоV{Ћuљэ|€ŠeS˜х)Ћ›8АMgѕуƒ•$е›zэkЂZѓ9­В$ЮЫfZ§­‹ійсI{$^2]/&%JЕЮ‹арFџ$4Уvmq<ЄЉоuOr’jк €wlš+3tи­УгуKŠЇ)бєђ9Ў,W‹:Е%^2ЭТlShr:73ь KЋЪАЮгPх†”Štнъж›-ЩЖtnФЈAЙ" вгФ“ЦœюИњ/Прђ‡ЈY.ъ,DŽ40"щaEЇ3[Жzœ(ђвжЛSеЯ`ћ}9Fі†хЌ@šХЗє6z ыІут]§игщюхGэŽшHj<Ћ=ѕ)Q–еі‰&UІФЊёЏœUžЊЈШчfЩЌЄ<ž5ёСcЌ™ŽуЙШœ–аэ3ќшђ‚Ѓ‰>UЈ‹,ЇЛŽ­мє\аЫy•„Aм ЇЮ4V`U†qшЈŠсўƒиCЧ@wv\?)&гIцj,Э2Н‹–T(s;™ЎІ™~`дd›‰VСo2.kŸцм8+SЯtЂ<ѕўHљUcŒ<~˜фЭ|к”Ё­ |X‹vв‚t o$ Ѓ(I}›Орƒ ‚’иЯЋѕЂђF <ЂЩЄH!*ІЎЮВџЁ˜ўX5lФyд‚EХ–КŽірL@›ŠHPІIЊ95rHа.лs~ЩэкПŽn;ŽЮ DгЩTpЙЁї->Мх-ˆLiQзЁ1>Кб?Р7M‘'kОXC:”Дb{aŘх6?”н$Е_hѕnzЉgp­Ёf'HпИ^/ ђNђа…ЉGцdB,‰hQUЦрŒГИžСу(ŠЩцzЕžfЎ0 š›Ю`UЪЌеШXљыnА†7‘ЩŸ^ЪV4#фUoЂФH…”Еъˆ”€= ‚ЇОбН',ц‹ІH’rŠ3}ЗžЦ;Ђ$;jжГТ7Щe п0~UMгau3˜d–pr"лAкы%aлЈІLЪ’DМаж Чї=Н}.ш† {’! #јj_—ž!В’сзыхМЎp™*ёŒ&ЙњЏGŸуDХ*jGю^Б†]šL$mŒž №Юt 2Џщ†tyихDYъ2ђН0+KBK2K]уUЗ@F7dƒ˜™њЯфзљзСЫќ˜5Ђ&Е–Qэ%ВWBfB˜_§>ˆuЉЋђ4=Ж?ŸѕŒBUcЋšЄф­\5„vйŽЇkBn„фoАR~*YЭ_'Ы|o ;%^(Э.­ђ%огэ(8†Y‘"Љжўс Э‹Њ—‰Ћ0œюC6BўБyщ‚hћ с,G•ОЫNўЭAišЦw:œЯšаPVё.8ђWЮчЫЅУ A‘ЖибХnKt=ЏŠ\Sƒт%›LgЋл;X‰Ed”жsЄмƒЗ\%Ољx’ьџv(†eˆЃі@ВŠEщhьPіf„y bо|Ž‚ѓЈАšІЊHCРK<“ЊAq;v/J‹ЊYЭ' ф [V1ЪЖŸ! !Bї№Ц`&~ВЭ Ъj›ђИGЋСtžšŠ xs0ЕІрEQ•­$*“"€ Ц ””жЉОr9kц„Їkš8уіXВ’)’РC…їˆd?йh^3ДzиЬt>‹MУЮ Ф WaUЩ0ГЬфёњЏэ˜ЬHQ—žBšСп‚#4„LqކQм|Б^Ь›/Я™`Г№“НК/*& nБCZёъеМ,+9ћ u ш!@м(›мфGн1УIlчџВїZq,ЩЖ|ЧŒ$@о„їэ]yяНЏЎjšћѕ/" ЙС™Йk=Ѕа :;+2bGfФо VвнаеTПB&ВEAЋeсjŠn'р? №$qрŠФ1н‰жЇЩУ…Щˆ7Ђб8@^3Є", ЇC]ЅЖЊyiI˜ЃXjxz ШЙD^w•e$ЏТўe^оlК^”у6\LБ!лTЊгj=ъ”Ч,KS,с4tiХ)PfŽщРnBXыдfкmСIbŸ(СOС,"Ч`ћјIБo/‘ vФBp?ѓ,ѕ dЕX7ФМ7Ј’[ З?ИОЧa’УCЧѓН >ПИ8:ю Ј2/Ћ(РЖšЃ„&јlˆŽHU8udfиЛОМю&,Ч ,5a8ю!Б|Жьйš‚ф#dЌtГ9Ц6Т G5ф<м`Y{тшьbФ 0?˜Ш1_їо}ow†уaыфєК7aёmл9‚Bаœ5ьŠЕЇВƒбd<žР>`QЪ„‡=$Ipе‚fxˆк4Xь^{"ЪŠsфkCм!•/а}L+—ПќжС—Qqохљоўчk†сžmŸ\ (9чŒxБ,‰$ј<њMuф‘DЎBYFV*˜My@nNЫА6u™xК*1Уў„“ Щ—+’Г€УЫЃ …tPж“zз,‘С_œ@}њђЉGоз>Š„Nвьr‰g”„ о|х*<'У~q\зFxcшКЎ*(JїЫ“юL$еЭ!Y†ф9M))+ВVЗ?V™ъ7‡bгYЂВ,РWеj`вьшрУћжOтG}TFЪrAO–S-:Б.гJTнВJТЈ˜CrXMгbе$2UšTs @jиm]x”ƒ8dќв‘ЕЈXЦз№РPš­Z.fDВ–XєbЏШНлййгkі/`Х W ubG‡o?}ЙG‰Vц*мp"ЈAM„Rfш: 7†•^.Шљвr‘Т6WTiвэ9№ђШЕhўЫ)И‰80u™їЎ[cЩLя‰Јк Œf§fwїљU4Џ11!?БЬPЃўˆКxѓќеынЯ#AЫАX^ЖВ Zд!m`'œtђъ"ЬЕ/zHлљЂ ZњЏЌє@вœЌ">C cQ PqЯЁчиЯђјеЮѓьtFВ)Xэ:с)___|кййй}ўЎ#Ъq‰‡ьЩ—јLІUСьБЫѕЮE…V0!™яžДЧ<ЯaL4Р<~!UdDнIч3dtDrE+Ђ7t'?“^ЮѓСЫнЯ_œ†(ЂTmЇBgшб`ињИГГНћќх/йY‘fY…„yXьQХTџў’Ц#цxч5s g™Œн1РNk,Cќа45гЯgЋКЬЧЖ:uFКQ3Y.oжѓrђњљ‹7Џ?JD@k†jЧe AŠШ ПlУBПќдDйЧ”•p"/цU]Sяте‹16ЌВыUЁƒƒІ™Dщ­“œ&3Ію}pгЅQyС/QВSЊВž§Umsб91iŸv_ОyїЖ`†Юcš'žЉ ѕmwgчХЇsŠgy—h^ЃL xH2Ѓю›ч/{Њ…-‰fп*W9ˆЃ(ћhЛX 9рq8ˆ0їžu›‚ЌXЩ AџjƒЋќSŽ(9BО8їv^М~џ~O"‡№о2Я Gщя;ЯЖпž ŽЫ^ѓCЪ‚QЈ*Š”zџќхЋфЖ7 ЂД\•&dДšnћ ЦїЬwGб’aщїŽŠэ^Џ?сQ {†’>wЊ8D‰d§Ыe]GЇл/п~ўјю*ЌЩ9o•9šщzКШя<н= pK…y гљц’Qўіќѕ‹Зв’\Bn№ˆ{Q'#xЪеЉkj зя‹šэшїаi‡‹гkмuTyˆFЌ …ЩEЫj5_dчлЯ_НџєёЛˆžэ#Жс!C^}љfче 'JлKёШƒм6цъЩл7oŸЕоЂMЏQ{А†Ф`ŠZ ѓв`6nwе‰юЛ8’$Жwq1`ХŽkL™‰ТшŒЌ5y‹й,Йи}љънЧƒУN2УIуˆЏ‹"?:љњхлйB)рЭŽЇр1_/ѓwŸОМн=‰зK"Е"*mHЊ.•xо3žpŠчОy_ЦEб0 E,к‰ыFџ “шQ­цDr­ŠЮwžПxћсрєLЎˆ n{ЌZ—'G‡Ч‡g=А›цчd“ЂqИн/Ÿі>НzбЏQјŠ№нЩj{x ™ЋЃ*ˆРЪГюyw4” Ыq,ЫР“šœЄGsтŒэ\Ђ6:ЏЂіюЮГчЏо|?sq%ab†bЉuquqzќ§рфŠВтЌ"—цxУП~?ќќъљ…яyЖFхуЮ/Ё {‘с§l>ѕю[ž0QmŸмpgрˆѓ4‹у4ЯВ’ltcu>~ЙЛН§ќхчoEMSЉXІ!RœŸ^_^ 9бvDs(ю~}љbч“Й^5 =™t“–7ЎiEб№ Ч1яg”n Dс:˜п4 ]ˆ1–iиJлЁ&пМвПььnя<ЛїіГ2'…;Ы4іtЎнІ9FNМF‘чњсчƒЯ/v^ь…hDеjAфYїпh)72iѓilйЦ§J)ЭЏ9'GМ"žў@6ЁЊ2/щ(Ц[,šі^>пно}ѕхэsцхђE”І‡ЄqšћŽф(V_‘UЮЫрђнзЏЏž?ёЂ[Ќй?ив(пЁЂћœ(—пљTH0\У”юЧџF‡@‘%Aљ•ш*лыёмЦŒВђ"Yћ;0ыŸ>>=ЬVќœ4оэу~/П`вйфУчЏї_ь|P–Dw–ЂTНхЧЩwыŠьњљ,6яЭb8д,ЫKр•`ОІeaŽ,Г{'Z‚Нб–јхКdп>л}ВѓўЫыэЏRfѓЮ rRSЧщ—АБЪ 6‡Кїілћч0vЯг 9ЧuОsq2,’ФqDqJЬ/Е4љОчВiйAyŽeЂ†ЏІв§С`Ф@ВЎза 7#Ј_ЂD№ыННїoŽmŒdжЄ"!KГ—8OГ$Ы4єаЏя|TАОe‰rFua ЃёLMGrш‹аВД{—Ф~Чѕ˜j:^MZ9)1}гјmD`г€кjхггэ{Ї_оіГ$ЦеЭ›9уTгя5В8БNїП u| gВыШ~ !‡,|вЧфїŒ(ЁРFO-rэћжі}l>Hэ9j0тdШ]?t mt<4Т)Nz:ЫЈЯЛлЏ;эгWŸѕ@БaЮ9šЬVšЌu˜FяЫUћќ№§‹ŸйŠ№ГЬї|ЧдP(†;­!=tF<$ЅИмБg[їЭ Ф<ОС„‡Ÿd‡iь›Њ4шЫvˆ:“`е•3љОѓъАгыюПНђ\QKІyŽRШшpЙѓй?=ПъŽ9E 7яЙв] =Ё9–уzЬˆВ„Я–щŽUX;,ЩЄ!0?]§Ѓ}ЎHЦч;)ˆkчЃ G–пћ№щЊ{vx< е‚Tу0RСw/h@ƒxzЦ МШ У!j§v!]”юЭCL <Яr(у(ЩЯpЂъfЉ C_\LTRQqr5-2Ш\G'з€eЯЯкz^ОпП!3Н(2­oчvЦю}Н\|пϘ(IѕPp8“ШQ'{зCђY‘œF„|ИН{sњND_ёмrdЈ€Р$Іuв™pLПЫ™)H=ЂаWyAu{]6šЊ_w^М|ѓіќz§т›^›WЧнQћффrЄZЉ.[дuюЙЖуƒ'ž_ТЄY"€ŠЇНЊ)+В0ОїuоЭ0m№z*[ш„CaGЃсˆЁgћ-й)"О-t-0іоP/ГЮsдЁ‡,qwтd*vЛнЫ“Ы.Ѓ{^ŒQv†zЭ:ЫxОЧu()‘<є#^ТЋрRDЖЯѓ›†ъИuоЅ9ІwеEї’иРIЃФMŽlРчн7Œo šEY-Ee{КЊ}MdxxїК,Qн‰ЈлшІоу8xу(ђ=B–-ДЛнЗл;ЯvЗŸОМ2$˜/aYЄh+t$:7у­‡jGDБьЃЁЌ&ЊЙїЌ§р%‰Ї.ЮњŠ—ьj‘шУbг…)‹ЃЏ 1€yР2ШH#Яs=Hа4•?=КўВНѓt{ћщЧпШТš,kъЩjМ\Џ!/' иР+qŠУKгР6aїVCˆсїxœ j‰м;?яУжVп;2ЫJЈyЁЪL Š‘Eƒ…X”РRУB;ŽыšК>88нН§lї˜ы_OYЗ§K I.6%7њѓ:дИ…LХЛi<žюх˜тре9рC<4ю—n‰р;ЧŸЅA=u‘57єp‹cс€ /.Њ"FšХЁS†хжMсќ№јЭЮююіл{оf%еЗ%)жќ’kВГ3м x7 C—EˆчЈюбQЬ2 рžЈоѓЖH…‡&ў РšrV"H#<ПШє‡ЈФQ“л@ЫiVfI€}ИŽ РАЛќ §є7fєНУЫ№ўfMЪ+P…ЋФci  ˜<зEБ/Š•дxJX‡ЊЬ\_ яy–ЇЉ^ qšфеRŒв7M;,R%MOF”ЈЌзДЬ*x.ЯwЩНšA}?<иyОѓъJщ|ыЫКхaпH„+ 8 Ѓб-;wž—,ШšэЃтЫВу9v(т/дКщšЎ7ЏыFAœ`cмо\Т1'iNŠEIU?›b 8BГЖTS9?КxЕЛѓU0Юї'КmcT PќŠL={…m‹1ьiМrDGjyž!04/лйŠТvЙћ•щišэ™Ж'щжdz†"2Нуw#QБLŸчuž–$з.АD‹\G7ѕўiїыЮЋ~`\^АІm{€ѕЃ<NбпГ›b ˆzНޘuЧUxzТk! Ї†*єр§ZїROб ‘ ’M,‹v-^ uВїfЌ(f\сJз%I`Щ@óчвgЎ'/їŒм8;ЂM"oъGYEŽЦАdЁ 'Уe Љ–" дхЗН“Ёhр1x('ŸЃ|›*rЊэоO[ ъЮи›І)ф–~>C3уСѕоAƒ,&я.?y№рA Ррaƒ!v%ю UњоЁ{!єќ0Ъˆ!W$Q/№PЇТm-‰ќјьЫЧ“Б EЉЋ,Е2и‰ЅЋЁо_|П$qЂ;6фбxСИš#`ЃФєЎ;Cp…VŽЇф№ДЩ§<9žЅBЯЌнз\F(+х Ї›N _FшUWe‰нфьЙ% г=>М„\мJЋ<ДuУЫ›х,ЕQё2БюuBЭъVœyКШ‚ЄŒpђZУ2UМў†<—б“Рbp_№МЩYжFa„“V‡:фЌy!]Аx †ряЈрМ3\hr’9MMЬУ[эЃhvUXт—Mx’3є8Ћƒћ™`‹ v М>цр6„T eЄГШTЂЃ#LЏZ Ž—ˆAР_yœ&О­ыJп˜•Y‘ЩПрEиb„0рЯ)iЦЎ OWDКu—с№v•Ьфр ыщцuцмЏ§EаэrБЊг( ЂЌqАјJГifы[€lєdNN+ ЈјiˆСqРІ[ж ГGО#„E3С–Ђyрt…ELТ™QЏuнpВDШBнЄœЃц4žч5Uoї™4gXљoˆАHbMџbжД,DЎЎй)Й ­ъ)йaГ*Ж-@&€Z9apЈУWЫЛ–TІsvIЛАES‚<ŠтЮ:цUЌ Ь„Aaђv4іz^6},Z^сѕШb™їыDFМ@ё@Ц‚јЛ3фy‡XeчлA8oqвERжЉЅjђЄ}yеК>ј"х`уој‚Ÿ~|ѕіRѓ Їw'иАёxЛL,tKЈм9=::8ЙьOР_{9жЭеАFUhм1iК[’&ЅVѕч9Ѕ_Э3п@ЕН$‹сAт^Ф•$j„†ЊзG—чЇп>ќЌL•ЫЫюўЫэ??П№$#7ў^ятЉ| ^ХЧ^gCFNoH‹тE5АЉЇ‹`нИ_РЉf<пмЌŠаw нpсЇРz—.фD‚ŠпЧrAЎДІd0`*rїшќњтјыћяЌŸ{­O€Qџќєйзѕ€>№lВ„ЧГўYž•d`“”РЁв&dr‚l…€gЊеjCNqЏ9o=Xl‰­ЈHSрqїЂєpВ[TeZтf™a„ѓШРCP–ЉГуѓгяvŸ јqчнЫЇOžМ8nEе0-ЫЫ’\н`™јJФ4ВЅАш!ИsШ2ђ^ЌцЅo™ї-Ÿ$:_&п:JК”X,БЌ#Sd9вј–VЭЭm=-А&ЉШC,Лс_Пz§rgћщ›Ўбн~В s~ђќx@C&`шA^6W`xїБ˜WрВcЯ ‹6;“xS&Оу„i‰ˆ'”{пђ AѓЋЉЃєNZМeЛx+‡~Ј@Qnbn +lLhf ц+Э<}њ >žь^(ч~іфЩгЇOž}ѓXKezGмрІс x5;*f?/Vq 2ЮаюKзюлРin ыz|0RMЧ-цф*vЂˆDЬ8/ыхz>%9lАР‚pЉ‰ЧлЯЖŸтLOЄу?=§3LњйіgШ`Uќ^g`EПCŠж‹и1РЁлž5зСЭEі \k‘эžs&нс–>ќДOу•H ž˜мЌЮs,U?ЏцЄ  ЃФ {пВPЉјђХ“g0ž>ћ.ўщйŸС:žэ0ЂDNј3  XіNќ0іš$ЎхDФЭ№J?С9ЯРn ]ПЄЈъ*sќўkrfHM§0%гžхcЈК‡Ј­)JТV> п†ЁЉrя-Ќ-ЬљЩnџЯл0х'ЯvЯ№œN5mЯYЇ5ођ-šжК, М ­ˆqЬЩсNтфЧŠђ+:Њ{КЗПвe$ЈКj&иeГŽ№ьO_№Тr†Ј#/с­XВхбGАiДфOьї?mуgOw/СAЖiY6ЦrмƒXЎ‚QeУЧЛU[D†eœ—ѓH‚œюІLF{@КнС„^P|Ви›$Јињ1G€‹^ЖЅiВLC‹†п&_›•~њМї(и&cњˆPб‚k,“˜h‹Эш,UєсФрФ—й/XЦншГЄ‰HфЈ E3МcLРV>т1уC&шЇN]˜ДЎЊьбіВвяFџ„оуЩгmAn&mЙZV0дXХ@і/mчS_ЦЫ•УOE„_\iŒЖcbЕ&6`AстЎ}ъtVЭI73аExl џ’;й~>ящгЗ§&цёфeœtс-  дЂЊšbЈ†‹bЙn~`щHЬљоa——%,.ЏS§ЅЪяБЎY^Œк‚UrУbN4tWфFu1+Ыйœ5Тф2ДС­jŠФn?нFW§Ў+§єщіГЇЏz(jЌbЊ&YаЈaвxЫŒО‘шВveІsytx5d%7iн/Љ§9h]ж,ŒWі9СЎoJ2`…цЄЉФ @ iŸLZЧпqв0ызн7‚alŒ'эХМE|`ф›s9йх<жxŽЃН^Ф№*фMОљ+­gCEBgг&ІМ\ннТ/Аа;ЧkЭjујR‡м9ЪђргГgлјёf№ѕЩ6zьЇ;G,юD№іЖ“TфxzNъUЩРЦ$l]Ћ|<3…””ъЗ[ДbyŽёK§яуaoЬЫ*JЃЃI,Hiј\СRЃЌІ™o–3tЭЫхjљг<šdn ј: Уаw]SљѕіЯБЎЖчг  ‹=pгЯŠа”ŽІEШgHЙаj™рJЋ“ЃWhЮлЛoОЖєФ_|&ѓ~ёЕЭb%З­ЇЗ+ђШHyЉИB?4‡ПШ\lНцЬcЊnzX8тZ&KЌТ ьPџ,EфNЯц„мcНNLЧвЈ“7ЯЖwЖŸПљvIY•І8Км{їтйГŸ/EЧr|ЇјБFPКlі4)D†Ar54nLaC§ EoASёЖ—D[\№F"Kцi`зjмјмѕMЂК}ђfЦѓOgHmШR™єео›ЇЛя;Ж$щќ–F4ўwaSNf™"5є;нnoЬrќ/оцГ C ;зF*Д,А\Ь H э"UЦЫЭmbЄвў+XцэЗћKЖ%г џFgŸ_<лў&a1щЙА8Ÿtp“а‚mЭи##a$ЖмИФ$ЃЦN^ФBo~Ќючэн_{vA }šЪНЂzШЋ…Юўчё‹ђo6и$ГjњGon67DХўІ›ySЦ7-‚0J‰и"Шcб;ФdчђHC ?Ц‘ЮІrsЛZЊЏŸэОкЇ‚-cК7kКАш`–{ТX/1—ТbоЉ,ХЎqь%НН…щў€?nЩМз臛кїNФџ:xM3aI 7L‹i5kЪОW? [q'n60щЗЯ^ђщ|I *оІ“кTђHф–к_Ьџ…xiœt3_˜љœё-љ/ž.2ЯњuІ4бАТ,‹ƒРїќ„dі$,тЄїР+ь_Е?œŠХВ€Ф-fwЇ2sRDКРэKр щDDы +MЖ"Ў01[˜4И&H(~uЮ[HМ”“f!xEђRы;/Ео4§Сh'ЋЭ L%уFZБ\мБ2UЙЯЫ ђн}…диЮcFНFƒ&ƒ|vƒS'›r]#–љ€.l/a . ™/iQ%ЦˆРЌaРхОЙAюЧ<Џ›ŠpHСŠШрк}Щ№ г^’Г RЃ9П оФе‘љ’…о4ІЖџYO!o6яYЯћcˆ%šЦcœ№ЭнœЩSm›М›В3мБ2е‰ЃБГ‹Юеё$fб@$єt‹;TŽЎЃљ doм4SОН]U о€ќњœЗЖXMws\ љЯe"B‚ОfГV$І5мирKЕОї(ЩŒ!я&ЧFw(ЯVwЋ гХНИnЊОHЉЗFЦБћнќ‡JэŽуpЄљt~‡)ЪbхЭЧŠѕTc!}я~}џњ;цNFIZ‘ю№Fћ‘CjI6Ьx5ЯЃ+sЖћlYrzWЋЄлI–xКШ“Ц]LіXѕЮBoю&ŒПБрz№MгэзЏ{уё˜вŠЊAЃkт)IЏ$$=А{D7ЈRнi:†Ф_љчм•eнёЃЌh Lˆ7вэ-ЪнaŸѕЊŽ§0)K_тh†nЗh˜21•QЏMсЄI("Oч†$ыy…pye-]ПКѕЈ=бUR7•Єi9[уѓ…)уРЃп[$†$k^–ћšРq“Юˆ'ISуaїќrЬ›с0"рч†Ј№!‘}tКЭ‘Њљ1Ж‚ЄkМА˜пќх/шАˆЗ%і} РЧУкgйNѓfЭtСч1,3ДЯЯКДрNбŸщJу1ы,Ю !BЎS]§е ‹џz(К' ’:ŽŸжkЮfј>˜6z?Xщ™#0VPœ48СіNЎ №Л—ч­Уk)iик`‹БгС›ugг9ЁxЦKШЧ Bћ‡IN@˜Ћ\Є[џјЫэЭ*w4еЋ`h нfŽDѕQT]@+з§xЅнКю )VаSˆ‡€4ШwОjвк%žусWJАъЧ Bћ‡Ср:|Чvќ Ÿo *ќXeщD=\lHN§& <#/ІЬѓьжЗŸ[Cц‚l!WIgз7›~\ЁЋ†дя&7ЭŠрБN•ўnHв;9^\.oќхЧfžš ;4'_Mѓ^x2в4 ‚( <знњvxбЇБлФ№ 2g2щyцЊ’ЄКх -dнфцЫ:ѕєћї‰џOc‚НŽŸLW?ўэп~Ќ`Ш!=ёaжАЕ№Y‡‹GŒ ѕтф`ыxФsœ щnFNKšР2 ёt{ЬщaжMN№ZЏ€<ОЖ„ 8)г ЫœћH69dЭАУŠє№У"ц†$Rh0iъtЋЫ‹dфx fsшs9f2Є%;]\šІшHБAзџ• Є2^!Iј*ќh$ЈЊfИ9@>фІ–ŒLptмјhkЬѓ2’э‘ЛrnАš%–Ф"срнд›M:ЖygтjЊђиЮoкЩl‰%БYњЖЎ0НЉfДИsН3W‘„aЇ;Є)Кїm‹ƒиЦхЂ9(Yц0g€| XпЭ—›ТRЫ cпјcИœЧxpSФa„н!!Lzв0л —ьљ—‘& ЃvЇ?Ё ‡• ‡Т|и­жrT>z3 E Šюе2ж8NГѕ#s ›nz^Їi;š0hсхЧЌъNбM#ф,m oуЩИї}k(pXеMSЌ^’$оnM{ АъОЈ#L›T•G‡wCГА›#СІпФ5ј~ал ?‘ьC2!GL0a(j28кКТ!ЊпВ€;0†з6і+X&,HŠсeX{РKКњшaхoƒеБwkћ‰ЂюИuй FŽшcЫ=KL kCx†КмњоРƒM&В(›uЊТ: ,ƒ ;X$‘”>)™“ўBѕŸГ6э AВЯ20U нУУг.od˜iшz‘!г 3lНћоcЮ"959e˜Й"ИC~дюі{cvp’šzъq3Ќ?(Єо Ѓ(ŸЦx4:ќВwдхѕdsл MЂи;#§|8ЃАSѕJrDЙššьИойббС)фƒАmUxРѕлџvHXŠф„Eцъ*іёЫсYŸ32œt“Ќgш]K•™­Џ=Мє0ЃŠдЉЎз™20’@ ЎЯО9Ѕи‹Цџ“1тeеp‹Ь1хж—Џgрі$ЇxњЬжыyŠ<АŽ!KєжСD„žЬШ!ЭjГ ХAХњv|}tx1ѕдјwcЂYqdiуƒЃ6D6нI–Mі„і1uuЌ8P$qДuС‹ŠтНЁ`\bЛЭ)ЊЁ‰3l_ |(Wь=†аЩ`ЖŽjB…BњЁтќQ[ќ„—1э­ЂкRULы›Ѕ+ДЎнКiъ;ў'ѓ? ™”cw%н†м+­Бd1 "п.\nаъ GУюёV_Д ЈІ™gZётvс ­ œ†хКŽeШЬ?[Уj€/Hы6d2(C4M<]мЖјq“ЪуыѓЋжѕщЗ­Ў“ЮЫиVDо,63OjгPtьmРГК№ŽО щ†эF6 А§1Џ5ЌЇ8юuЛэ“Я[[иtœљЊРPr8_„jяЄ#Z&л0…ћзFW„ №I^wFœъз›в1VЖїС­ ЂЄІЬt{‚S.}pr5Эb‡цПdяF@š­LКjїGЌъЯ!пUD‘›\nmuh^і"MЕ ЪmКu=bEЌЋќ i2HdC :р FЫЬЗ4U„и|M‰šяЉТрьИ#˜Iцkи.Аїчg{є1{н^4wЯ{’™!ЗЛЁсq~‡…œж—}qМХb‡ЃoиўXЈqŸ1 XftОХhv:MЖ ђ@ф7 ;[”bEiф™†ёOћŸЦсŠnxЄПШIЗЗ&’ц8иV§ЏзЮќЛ1f8$Лž Уˆz'ЌрCAњLў‚’ lуБU9gŒщo"ЛtУИб@Й §GхT=hA~H™няё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќџ_žTsї#џ,XгМ@пкв‘Ђќ?јГЂШ§пЉ]"ƒбLuHqђЌч‘ћяšд I#зљuКАЧšEШКYkЊ—зЉћїR`2b€Yњкџ•т–ИШL^fUdu•™+[wлom1~šЅ)ќNваџuхš?FN”MЫP‘ьbIx’sKR,ьЌИз:квуЌЬзP'УЗHЯ№рAєx.x+ЬЇ…ЇЩŒЈKq&НЕеокК>њМeљМЮ [ЁЇEр™џТ’1…RрaПb­0­ ЯŽЋyј.JžЙЕuЙЕuДџ}‹ВуrЙ,"ЯMЪй<œYmž„­:ž)ЖZЂU‘фГyщШЏиaш€йG=\І{ЭС_/VГ,-ъхМ ~Lџ1]Oџ§ tгё"pcлН8:Ѓt?FЧХВv~8`uТ•ѓzЋgžвНšЈnОй ;гrлиXљ‡ѕ=§зCдLEљтР­‹гRИзDž7sMеЛЧ­­­W[FЧОияŒ•x…4&Ы Ѕ59еPџй“юЫ&Ь|ђиQЉжХб%-лЩ”Ј7Я"KІ‡§сАзкњ.Dщl–Лš,сЊБйZƒч ГМњuЦ§ЇcB”‹iž—Eъ›м syxAQExЃцБСOPGъnuœxК\.Ір Г6гЮ3Ойѕ4AXоUћ_ Jгm/ЩЋ*ЯЪКŠmЇпGV‚ UUНH4vBI†etЗЈ0Љ Я,вј-–›upДФa`NЩњgХu”†HЪiтЊz^јЖ.б—gœ›!…єД^N}п–ы0[ДчnXТихbЕ…юДЕжnъФеЧcсэv—г,/C"МбЖNGчzm%(‘YЖЌГ)Ъp%+lЕdEUЬbЕ& tЋЭ"їz‚я…ЄПЙєt–вЌ_g™ћ_AЉЇ[ёlЙо,st•љ–ЪŒuˆ†Ј[Х”ВœF6ЗuнЮбь†ˆЁcлYKэОhи^:…IЛRБ3§CF-ЌоP5jƒZсШ28ЏRпRDЋ@.ъiŒ„„=?0щ-жCюnьњ$ŒFы›eъ ЃБ ъN2_W№Й`GЁuo–њћ Ew\SэŸSЊ•Ў {ЪŠtd1ш†К{:+ѓ,EЪРœtMиˆ ђоˆ_­7UтjШ#Ќњеz‘МN Wџ5Ўщџе˜hF˜йњјћ…`Dы?Зђ‰Эf`Аа(т3‹]МYzЦАB!йF!`d=Xз‰gŠ rН™Ї^T-ыибд? B $#(ƒнпчMwNhиж„АщЦСu4кCОЦЂ.—щЈэОх†Q2]Ь‰ БъЭ BЂktM–›ђЖ­e`Ј@w~3:Œb—™%uЮн*HЯ§КЁЎ%jЪe‘ЃLJЌsУўˆaХЩiKвMУŒъХƒ Y іГNcп–#˜ІјТ,ЕЕ{jGџoGыњЊЯ[љ,2–‘ЬpŽT?D!|A”t+ЂЧŒк3–"АуіхСЗУ.Ыq’SL!šqQуЄQy,є4^ё2АЅх …nr[—™щnєлз]жˆfu1Uэђvгф5‹]‘рЪЋizЖF_~ўv=‘$ЩˆŠ"pА/wFX–ЋYт[Мр`ŒЉаЬ—Ѕ­iКќ4UщaЛKЫnɘКК4fѕ •V aше$r”х+‰ " q­sЮt|ЂВь!R џxMШ< пЄ†ЊmћQœЁы:De„ЧoxА<5Œ9=ž-SOд`uЇДD=ЁŒh™"џkžФY–G {’Cˆ†sXRФ­ыХЂЁЉ›њіЈХШG–KвЧchc&ЂШ1д„•мr5їU‘WЂѕ-YjЂ‚Вб%њщYсi2 Рб˜‰цЁvЭЖч йЎVЫй !ОЌBkв0ьб2Р@јOKUЛEq$ №"Ыr:МPхšCЈHж„ФЖ&ЂАшец‹ЬbК0!I“c=@=№IОиќРэ%ЁЈЋ|“ЅEY JTœBTOІvoUуџi ' Ч УШHЫ1/ђzƒ‘иЧМ,ˆhъКЯ+_aGуёptu:Б‚G$ЅwŠ5ЊJ-ч„mЖtAlŠ=ЮD,їАЉџ‘ODzc†ЂрVZТgJ k&тф ЅQ`ЮыМДЪ#GWdarv8Бƒ4ђtА+б.‘рcГš&иШu3_ТN№№HxХRєCОџУ`‘™8j4І9еЮ‘„h9'N"т m#ЮІ)ф†ЌхE@Є–—#гіl”’ЌtОnч„$ЈJќhŠVŽЎО.W‹у.ьuёёкМ(QEХAY8sˆ+Bl nzНYVH“–eЈВНЎ`ЙргPиV[6TE’u'Шц№—ѕrY#1Ќn=k46Ћй4m•GY4n„‰Јш–e*ЛAuІы|а’—ЗыХJуД,"Kсћ}NFIhžЅЧз‡Н‰ЄY!f №!ЇЌ‘œœtn~В*nцe†’ *сдшє(0ЕЏЈ–…Шч Ј+Šцц+м„›0ш›Š%ЅqR”Yl+TыЊлыѕњ­ѓГЫѓЏОŒLиnВъO‹8ŒK0ІzysCxО ™ѓЭэ ЕŠт(ŒѓщЌ.ќ *—+ЉФƒм‘##у%ъЁˆN–BюшоOєю?,ŠД'\Ј@iWфAЖЈ†Фl2OSK`›В " Ў|xњхлїKБЁч T,{TЂц)˜ѓ-Zaњ%ў Щл2t@т­<ІjЊщ'а`ГЯВ(!ё^=оцЧЕ Pjѓ0„e(‚Шіо~;нЛl]ЭаTR”[Ћ-AJЖ@GВИS‡СTЧŠ4ГHdщЦC3‚БЎЈёœдШ„БpБИуSwwћcM”Ž!ПBžи"‹‰ 23щ^юјzzиіДР 2?fTТxЙZЯP‡ЭzоЬYЅ–D”ƒKБšірŒ`Ќ(Њ,Ы ІHФE$cVDјѓіv‰šŽТQ’В€ШГЬЄпRр;OzЃ!|>fe‘Uь0­f№Э3L›л5Оy’cК­Sв’jбВј`ћв,Ы рB§rн8ЋЭњЏTАk"ыˆсќCšHТдэh–чЧЇ{gНAџъјlФJКnyQ^ЯqвDР8mšl %г$AixЁu5fьѕЎЛNa­ƒŠpћу†‡nыцfЇ5АЫЊ.cМ8еяhxЬ<79љvвК>нћrаceзьŒ“†ЈTЃšЭ‘xГ3fyд0-јЅЫ|яЌ5|`3dQэЈгЇ‘6)ЌV7З›†=оэ эжЈ^—О*  $‡‚ЂCьь}:<;=мћњiЈ8–щреХbН"Ђ"ГšpиЃЫœК"!~„ .IеœУ<(aьK*DAYЄ'Hf†љ|гю#НD3ЬQО{Z…М;zBѓЂhzŽЬ3W?}?iu:­ѓуKькGЌg2ЁU5Пi&=uUЖСЈпыvЃ …Bђ0r. жhYЈНЮбcЂ>O‘srMN—noзTYЬJ“ыЗOл=GтЈЃ_О^MPk˜nœїйџЧоwАЧ‘YтgмICXz$„wінхНїОКЊ-Рй_YрщnW{+€ЄДї}ЌH УŽЮŠŒx‘ёžЈЈІ“д@UzBpОœ€ЭУMxf‡У!EШ?P]щљ6п1’сЁ­+ДкЈщ„Т"ѓGvё‡{TušUАыLŒxфŠ2LльqОџхhР!ГЂD~:nуwжнtNŽtj0zХЬ,вФ1Хѕ7QP4JЕ –zўqћ %aQ•‘Ѕ)ТЈ;dxЭa§H`ѕА*‹ §cRTЙA_u@V‘ЫіbџЫХG‘Н;ЙlCHХ6јy<яƒшAЛД$Ž“TнrТVДзsсUЩ?Ыћ‚leг9ŠЗ("=ь ^дгбqКXNЂ eй Ч•ž€ФlК*+šŽ ЁЬХчнЯ}2€>К7`8@Е№Ѕн f„E9‡–&ФQш(hoAF5,?аžЭ­иОНЃ"nАœЇ6ТвQЇУ(ўДсsПŸOCЗœс oYхъл 4lX3‘ЅЯпН§ахeъ\йс§О•ѓЊъl>E–ƒњ-ХŠ ^’,C сDеmѕy ІЂ?†w‡gЩ„œ >žЅ8Х“ o§l+d„5"Я$єќ–ЭUЙбйл7wМтG†"PТ[ЪЈ/x№VЊŠРЈ#YДЄpe~<DžъaG>2W~1+#Љ№йc$Ъі’Š(WYXОшY#MАZNKЋЧL(˜Р:2Ѓо†ФіOПьПП”Хi№gЭѕМ ^MMŽ—SOSН*…ЯЙЙhЕoOOФц0‰Ÿ)ЪбN“Ц­ kdТvœЭЇeтЙ^Jш>ёф`šŽіO]ј x‹ Ѕ-<~fйіўeчг%/y…Џ‰Ьˆ5?tšИFсёrJєTPW<ЎСГyК{uyМитPS,HтФ~j‚Zа5e~аjP…6˜”$Ђ[(ёгˆЩдёнЋW еŽ‰Њ$КDcЈлщбљюUы§-иe(ŠfE=™ ОqиEV/‰{Ћ„yfJ"$гѓЃ е™i№Žžg4#aЈЫ Щ Vлˆ“Q„8ф*Ђ .Ж7>(я‹"‰htР{w­ўръУЛƒЯлGД feh@б‚К9G­яЙ Wњѓ9dE‘eњ77c bЊЈV˜Я"фaРЮ<2UY` Џ№В]Э><л%Š.jїыжЮжY8Ч;OxэА’‘H НaяјхыwЏ6? С-ЪиuPŽ u.р‹•e&Œ,Xц…BСћсL†зŸQ ДEJМЙьС!sNDˆТ=Q_XЮ*ѓ`ѓхж›aEєŸˆ"Qiё4 1љєхЮЮЫэз-—Рjд5žнMєч\=>–ЮџƒЋ†РвŒ(ЃœЉ‚м˜‘Ї+Pm>cЅ!BЇхŒ CS ””FЗ6'МЮfЕ +НГuфЮ‰ќSK8*„Zњd{ccћхлk†хє”ЈУ6 rЊ“R=йљьЎ 7ЭVфиu™ы–Ыoї rŠСU№ ЛТѕOg$щŽ­O6zэЖuзт{s“ ё єi\k|ефuOЈ—›[р ŸхFЭжмPwёfѓѕ% M7 ]„брг(5^†эw№%Зn‹х§ЗхœМCTЏ™Жяй,ГЩyaЏЯBёюшкSяD;НіэљљuoЬŠŠVЭIб€ўЉЭэ—Џ?~КK‰фьФ"2aWѕО~ўќхr$ЪšЁЩЊKЄ•P‹&у>mП|Еѓš‚Œјаhp5qяQ”ЉD v–чХЮr(sŸИG(ЪLЉGњbШDŽј&‘ЬœЮ!В СшwGЧ".3L/Scxuqzr|zvкf`Б­x2ЋЩБW‘K‡Џ_ПyЕ§^™ЯˆgU&bš’]eш:”aVІЖёTТrQ7кjšІлЎŸM№нчiж‚F&І_mlnПўpИfOQJ| …T‘ЙУЋл›ЫГЃуГЫ‘ƒa‡„чI^ичї?П{ЙЕяЂ@Ъу:Ѓrp#мFМ„рЎbСн5ЇЕіQгмq]?ˆгb‚њхyф˜ЖAДЈIЮЦ  B~ПБЙЙГ§ё`ї6$‚ЃxН5Щ}…ъЗЯ/кЗЗjАыА$щю|н…Ш~ЏЋЧ…~\bE‰bиœьwp'ЯвŸVП 5гђ!fYšФq’RЦK);"k‡ pтnЁўфжоўюЪ2”dФ~›IшBПOгZV‘АвНраЛі^mНмЙЭ—‹еїЃ<ьє$Џ`IхœЅŽѕФдdS/Nу0єlЫВR€и’˜xBBzЬјJРnМ=xПЇЊKФCGqDyй| Пкй†-p“‘дœИXyRЂЊТЇ!w˜Є)ќ|ZN"ѓЩ$Гœ†ьДu№„ веnнѕ)щКРБАOЖNЎ6ЖPІvяэЋ#1/aMЦЋЩУпhsšЇЬўЛOX6ЗЗ>iЌ1фoЈтПŸ‰ЩšЊ@Аг Šѓ$›T™g?Y%‘–UјtY”е}puzАНШЗфюP 'XьM*ёУ‹Э­OЇћЏо^йQL[(Шa*DIА9Я’D<јxp№ёе.‡7 ЄGБЕЏc х*оƒBЊY* ХЎ§d™Dr№#rуQПзюіz x‰fИa[wк’н жyRTqћЭццжюХХоЫOCгЋЩzcПXЛ/+Ъ<Я|юфУбљзТ?ёгF›ЌN=(ЌBЯRd(ѓЉqЏ3ŽNTpЙlзЕmѓЉчЇ§ёp8 Лx0HсйЙЧШSWUGg}(™ еФh}\п|sx{ГџўˆqэЗ#Z›`6ЌѓuяјЊuЕџњх.[­PЃpTNwБqђ/з=јДЗwxйlˆG>Кn<1uGƒ^ЋеA!ТУšЋšfУ+Ы‘бVh]Q€~у žOНѓacыУeЛuњnŸёCгЪK\х;@В"u§hєљУ—ЫЛNчьг3]зx ‘ЂЈˆ,к–ЉЋр%эѓЫУ/g7wю€т%QybrYыё"Р­!|i ЃКF€ЗѓЎІ ЗG—#"ИС ’кони9jwovwЄТю єoї1h$кX№ЈннГ›Vыњцњš› ды. &RЉлы>vыЌdEрxаKКр‘}Šъ<ЭhNVШA&i рК“”Y`iЊи9њzusнцэН ,sGш~к~wжЙ<ўќњЋ]ћ{1Чs№­['ЃPњќъЄ7РЃ˜у„„2ЩYш;–Юою}КшŒX<“&Ы#aЁ(Ѓћh№D“QrF3/aДіPoмђ! ћК"ѓ4ЌBчьѓWЪH*< /ЪФњGОмuZ—Ÿ?мХiћѕЮЫWoоМ~ѕњѕлvlm}МzwЧч”тMИ­ы в–ek uДwйQЈV‚ ёPCЈx‚  xч‰fK*ЪЌDx‹aI–—UhШTЊМРЏП^pfŠI/KђТЗMііЂ(щjџH*/ЈсННЙОЙ}ьХїяО‚?їnОоI†ŸNšJЇ+(’иПъr’$`OЄх‘хбаhx`И'&иN”тažL'ѕЌN4™ƒє‚ЉFЖЇјЙ€рPІAрЊ<+ВУюЩ—Q’іЖззџ@Pђ†žЈ'{Чз7w­Ы[Ю†€HŠЩiюБћОоt:—c№ˆq–8&Š'ЇPœdйŸXŒeНQНŽ c“#ЅЬ”8ŠUM%ЖлЬЁ yХ€Ќ …ЃкчwЂэ­УГББuЅуЫыЋ‹‹VЗ3нЈ‚РQ 6*=Ёw}|бю\_ŽdEУƒƒФSQ’ UйYrвxўЉGc}žЧцg№0гЫqhТUЙ1‡qU™~Q§iХУn 4jPсЦ­–\јр[›ыo˜Ъѕn/.[Py™Q†€Ѕ"‚я•/q8ƒСS§ :a–‡*Ытх …WЗ„+S{тДCЛ7 # ЈЈxеlыҘ–5*WЎлЁЁˆCРаrTги§рш27lѕ§t№Œои8ђk›ъ^_wУѓcМЊ%’xљЩ,/с]0оˆЮgЬBOр1#"qLѕim^р™Сщ—уі`Ф‰N5/‰E‹(TeЎ7 ПФУ;lP!Чq„‘‡Зљ§[9“>‚CПищ…IƒcАzEфKNxПЮtŽC!_STША •hVDžmк^”`„№@яI ЭЉиНеЙИшb5ЭЇ‘юЂ{1xž,в4€jМТlТG‚v#–‡‚жК3єc№шŸєIЄ№4?MЂ „I…нЈѕ+G`(№6G x–ІЊvШ+ˆ.y€ЕЧVг34ЪTгЏ–•Ї ВЄxё.Iьˆ‘Vэ€]˜‚WЧžэbЬ?МUТЮжжжіe\Zу!#ЈHР‰Š&ЌУЮХЃЪTgGc^6\ьД!Œ‚е^AŠ[иєDCHOлˆŠь$i ЃLDM‹IhšNRф‰вєє]O43lx$*IŠНОуњОkЪрŠ‰…З››я˜I&оє;Ш Џј^rкX„•ОФŽБЅЫpp<Ёц5›!Э{ŠDнvщЇѕqvUе+!mEa\БёКРnСФ3АŽF]JСѓjl—ШАЏ&-а=­жЉЫNhэlИuи=ЧЎ(Oc*U‘ іУ5O-М‚MHюф< 2ЗN‡’їЅ- э§ЃыЇЕqіt=Ръ“ЖнуЕ š,ŠMУGЩF U"јFУ.Lб?’аїМРЗ юъвŽЛoпPА [C№€(‰Т М‹/Ф~E‰ч ‘!1Уў`H ’ъDОЪqŒ`Ф(я7Бipx1žдйзu?Т0хbьљAљ8Аxp™‚‘tПЈёpћbaёXЧŒ,uрrяB)ЕЃ#ЛŠеѓуОbњЈ.FЮDёPlЦЁž*Я jŒюхYkФˆvфЫ<ЫЫŽŽ*г- ОЇœ›і Э+u `J^<”>zѕЎOŽ.YE JЬ‡ФРќЄ$L ьрž{У–IЏ•ПwЪ(dUШЋ"снdЉХцХž"АЬ№њєђЊMI^цCЊ•э|Жœс<ЧЊ–kшOёіYџЊfB^R! ("зtd0УЮm_єp‚‡]р >ШйНЧQф†в••.&Й?:ь €ŒЮ‹št,ро%ЧyЈeші:CNДrь8емrОœЅЖ.ёŠХц“ŠФ‘ъ–ee-<М p,Яa‹ ‰^)Šxкх|Z‘2‚ЮурЏС (B†ƒДŠэ$sлч4ЄTиŠ!і}O&фt c І Už†Ќ Ир™_N+ьЏЋyщЊjFUl<ЩhZБ&Ы‰Їуƒ"ЫU‡@ БI†r—ЁyЋ˜Юjь7)’Є@їЦк; ОїЂ2вTПИсЅ 9ƒeщaod8>‚ ЄŒ4@1н‘$A.№Ђ/)kь&YЬЪ8ѓiх=э.@TСшEyŽ х|’F>Ќ@ъ"ДАчT– }‘V ]Qey]^ш[ЏщŠ4Мs!ц!wв–иЫƒЃKкЖэ Р#W\dlrУ ЊвшњЂEР0ЫіуЂбЧ>ќUf=MВиde3цеХЭSтХђЌ.вŠ~У ЪТ8†[ >СвЙЮеРeћLѓIfїzЬэЇWЏv;*xk†N„geє `ц.Єќ‹‹л>#Ш€@ я:А Ž\zЭ—uЈOЊl]чЋUЃљLд”qјg1mЎ9KpОьёьЫФ емQ˜q|ѕѕьњіњ№гає#]Дnv7_ЌПКXo'XНWENВ88JцЪDж›fЦУс qOЕ‚|F.ŸБ-;ѕєЇ]лі52ёsZЦ tЕЧЫ†)D9№ЩIšUЭХ!КuU=TE]œ_^œюПy}*Ц™ллл?§МёЧМm#„ ‚(ѓxܘЧ6рˆL;шД;CVP4+,Іфnu9ЫщўGіŠџч#jV\“vС" =[[1СBfwб;ы,тС2ж.%й$86+Б-ЈгЯ>эlПЛu2ѕ№хю‡э/жЗћŒЈ|й&а І†Џ›A> пе Oр#PК)iо_Ю‹ уяфFВцWЋе<* @Њъan\Ь&ЁЁhnŽКžc+{BV.aƒb]яђці|wk}уŽ^ўе ‰рГBHЪгEs#Z!ж,bД,ї?ЌЃGМјc§D8ќŸы`ѓ_ёзxbЇЖ—|їiМІ˜“;МЂ$Ч7э/г]№ S[}КVѓXБтР/П\Œ$MъцbМ:ёЧOсГШЄйdBšSŠќC“5jї XfАњлџыќёзПЌПиКр  Zе‹тя˜’15 Ÿ6ЙLI/%™xFїаž<цмU и[УЃН‹›пъ”dЋ*ƒє˜–rћ‡§шŒЉg™КЎШь!ићЧ xі™ƒП@Иƒп§хѕ%=6rЄ€ЎЊКYXА’ДЪNЩСoMnWёNqПЭ}Ч†щщ,CŒЂIуГ§‡wP…[ЎcйqMљjЄ№qsМ:УŠЇ Œж!цђч›Иѕ^ЌПјDэџe~ётуЯ5У№Єд:џl‡Š|<ЌЎЁBЮpйСБ WA5Ычєіv‡­Г/G_Юz‚ЊЂP™Žщ /…k’ИёТV Ц’ˆЬ!€б—[швАОGŸџВN§Н1ЉКЁcRФЕ’oOќп{f ;(H+tv‡ѕŸMц„уж]ŸцyгjJZ`›`ЏLE:OщСFЬ}–љыбњ!zРJoМјB " E]3ќМ"]фВ&эŸЄўœjCС *С“й,Vщ'Ÿѓ~†фdŒЇ†У1д…’]ќ­KЅёIМЊЌHЏЉЋ:рWЁѕf=њХя{џКŽqzc§ћ]dœ‡pуЛ%Щm9~e2 OUDš0МИсН€ŸU“ШŸйl:Uд ‡R€уx^Ж3B#амЇ‘Ц IMЖ,|ŽљK•%ЁѕzНйŠza‘_ЌУZb˜FŸ6rdƒ ]еЭў^CBг=>8Ц)*'cSоМˆЇ~сЕИЈ ~lЯ@Ѓчшш•xЙ_з1ЩЬf/_тжПў4и§Ыzуп{#K №jРC5‰ф|„^e6Я4їooZV'ЎѓyнІ‚ 0и‰Šj?ЄШY<M’Еž6] X-| J(sЈЃM4ycc§гјЫ_ѓџx?Ѓeв •HUёнЫцdnœб Њ\AрщAчЎ3b$#I§Y=ін'@*ЬЎ‹fтŠДс4iTGL]g.4 і?ƒЦ7жїй‹Э?Рьѕ/o0‹уА›ЯШХ}3='і8”НZ,&.ЙјИбнХѕP2K{ю`@‹D=BьйtИ5 Љ;M ьJСМa V2‘"3—Џq!'nŸ+нїлhўЦ‹ЭЃБ€ЭрІiч+œ‹'€`1oFЮp„kЫЧa3кз=YгžMŒеюs’т}OНшa№OЯѕгIVТ>ТЅ.ќB˜•њ›h2иМ;rХГOoЗ71˜|Их$Lг,йШxbcђџvyMО…ьЩЋћЬСDއzG”ѕG†ЅХу3Џ3п‚ ыЄeЙ"vШƒ*ќьэЦ&˜Йљњѓ­‘Иtыxїѕ&xШЮaђ“n™Zњm9mbfЉХу˜мъБ_{=Rя>#Hг ›ш`]K8‰p‘rЯ„*I…ЌL:Ш ФЖmьљћMи‚ылОvдДH=e|{єagsc§Эщˆ[йУrжєnЭ›Ж3b6ЖЙ-ц\пЃЪђГ'„YMЗН(УъЙР“ЮйcХ9GЄgШЂdЅИaЙŒ Ч”o>lс&|uатœ OTS_gюNv_nlО?Ё 2‰“њлВйMЛм”јJГЛ'Ё…­08Э+>`„R5Ы"<ћАLЫsБƒnZAЅЌШf\7­œїїОX§ЯрСАЬчc3&ч2œМЗХібЛЭЭзчv—ГеЗ{<Яœ/А•Вщlk@—‹ТЁ,ЦЃСЬnсцСHФs8^сi–ТнŠ›ŽЉХУ}dІђ—ЭWm9(ЇdZp]l}~Йё^ЏЫЧє1Е cW3ЬLєрqЅWЕ#ВУNЏƒЗљ,'<›црahzиОЙЃpР -Hя6Кcy~B€х|qџ­Юѓі68єыЏ)rjв:6!gмunєОююЉˆ—VsR->2mЛ|m.(ЫŽƒœfъ“ћSўЮгЂХђШ№&BjЌNKфF!TEїї‹eАПБЕёъ„KˆЩuн4K“T2Э-цюFŸЮ'8 ‘„щЧС`АYVЫiЎhс9\ь>Йеуџ|z§ЮЭugЬ№8ЗРJ6l+nЮнАМЃч ы§њж› 5ohUš2§qЏЭgдУ!іШЮ—пё q 4š„<<ЫzxИ‡‡mfUс˜ЯŸўФV YА] ŠлЏЪИ8 ђЉЭ(дЂЋщмолйН1&фо ЫxŽDЊnl`ƒ'№ПЭWЋySIрxИѓъq†‡Jяё4kОФ ѓДгєџћС0m`—х† Ќђђo‡ќŠL#ЬW‹jvЮ†v5ьYžN 'Њ›JНФ)їf˜tjЎˆЉАМ8Ў{O~‡_ўрi™ињ“oХџі u=Ш3$BСюA2ћє8Ц@ ўоy‰$ гвжтщЂiСŸжЉ/]=€†Uc7‚чщ|іНэИYшUУ,–у@)|4П† џаРЛЂЛKЬ8жЌѓ#‘С}Гѓ—dN^}U“SUФ}№z™л/ЧJtљŒ4Й“1LрЫеЃk5ўŒ §€ ў№№ ЌžЇ"ЏЁqрt259єишdqЧ“DЊ ˆ[$Щa?]%ЖЬѕЯі?яовzX`# йЕ$’я‰З|Ћцmс:“Еўі чКЇБЅB єCѓЬ)!я5 ИfйP |џUу!јџ”œ™<5ъпМнўxйЫAoЁЁ—ТЏF&.цЫЦ?р}AЌ{X5—b^и:іcœ;В€M bozЫПG)XВё— Hk€6Ц’iРЧдИwєzћ[ОŒ’œЯaфƒƒмMЪЋ%iFFЃс•Э+lР@~2ЂjИ–ТzCŠf9–ДкДЈИ5йњ№щп7&ё%9{*#›ЇGWCŠ5ЃіCртXвт{ѕЙm~јW{шNцF№чуИДќуЮБ†зф иaПOб4=ъw:иgъзЉ:ЃIОMвYо‹‚–Ъгднݘт(ЫBSфx-™5F7%сcJљ†.2 ё6ЇЦуAЗ?г?ƒVv,тˆу люtяZ­ЮтнТ­xџ­!Ю dHт‚Гiщ)УPЃлжx,zЁoу7 ГzŒіЫ†ƒs6^ј=мOГШ…JKт(X™ŸЦš7ѕк7Wч'g—­ю˜“А'Ÿ(yџу‡ц,3ЇJTšЂЈqїЌEб’Ё#MЩxD1JкP~п‡> {Ћч“,OVљAя‡*­ПїДК#йI 7ЪІ+ђjОУ‡еу ТRЇЪx<ѕ.Оt Ю;†вЌMIщ͘7LFqŽћслŸP6жE )EІ{нŸktDТxaћЩ9й0-X‰8ЌX>"Мвс0\э04і`Žњэю˜fЄ€д—d:w‰Шў LГ$ђЭ'9вDќl7ZTuЫёМ0ЩpшћсIР„Л†@Оћ%@Œ8J'UЂƒG€Ow`у2ЬИwзвАв^еdDВgё-=Ь‹4› џ0д9МUё'ѓ„іF0С›–“рD+тдА ф#ƒЁ&Ћv\$–Ф2ьА;Ђ јzНСr‡шM НцЊџЋeлІуGYŽЭAО.џlЮоБЂ:~Œ)‚œZР"ўqџ'nЈх#œŸ˜Ч‹Њ—%ŽТstЗгяGƒ^Їлыhо=F<ВqЬќЭі№ш?СђŸl4Ѕh81—!'д0~#ћўїбСиВ+S`ЦЌ 8QhЩл=ПОы К­ЫЋлЮˆ§яF{ј^N< ЇZТМЦгљЙ7џй3Ru?Œb<#ЋІѓ{bъ§,ЂЩcХ^Zл"u7рxХёL‰уКGћ'—7'_/Бš7іVќžЄ|…ŸџЖ(`}5'. Є LYњЩ4В=MsЊџчјл@ЊРTЗjj„ 3Oцкš…ьЃˆзљђсгсљљe OŒŒ „rRЁ,ыВšЃgCqeb]͘‚ќ}Ъп}$ЭŒp l~јЗ?!ЖоWО&pВž-š’’D( ƒр5IСїЕƒ/_Юœ…эv$оayu?ESУ V-гФїCЁѓ:q ЪњЩFSHN’CАќічП§љmЌђ” Y)8ЫЗJ,U`њCь3чyњzэрЌ3цА5кŠЪ&Б -0K,Ћ8%DыХо^ %{юъЊњг |,/,ыФеeЖOЉ–—U№ЪЩ_їЫмФqТљ ОџeэЌУpœЈиuІd•1ЂЯ O—˜^Rќ)|O$4С“A_WzєЂшn>]рч$vHM›г-?-fMЉ]Yфњ!фІ{МжЁ9A6ƒg[HŒD цi7ьДzрцЋћЙ8šЯKQ„_РA-шр Ћy™„иэ,№дmGд­ ЮЋЧ<ўэažшЂШt‘Кjи:\ Мь&и8]V, Ћ€*5Jo,:Ќ{†=†ЅЏЪПDщ€2ЬpRT‰xuЦЏћ"N№Фљьž'xй…-K<=`5~ŠTЙЊч;–х$гц€6Tnћ†ƒ%šйВŽ§ -ђиR•_У№.pq|FUYњ—]^FЊˆЈ$Јƒ^hШŽЫrPтмЎ  ^ХѓKžSђцœƒ8ДРŽGУбˆц%ПЪ=г уРQ~еЗ€мp2ЙдќоЗфЅpќ D +lц‡2EAшЎuxBB7PRв= YКпб ЏиyjщІ8њ3i—ўGб!,6uЧд„вы&Г{BI‡!0ЮжAvЌєišДлCV+ШYк,ВTОеы!„’Э,2UB9ѕ 50D$ТpPњЩв…жUJhG‘ЙЕcŠ4/)ЩeXыLЗ7ъѕz­ы“O-žЅJџ сЙ‘ЌkІиК lяфтŒ.VЄŒAЄМBс,Да=ЮQ4ТЩЌщЧY-betнъ ьэžя}>ь!1ќOt q,ƒдёдВW“’ќgžњЎы‚ЫKєЖy˜~Zт бy wOЎьЈQчъф`эŽјžRoКŠЏЕ3ГЂЯ1к-Бм§Ж 5pcь№ЎЕ€P№^дЋћ™Їt/G,†qњщSП?ќŒ‰РШ+Ш…!Ÿ^2Y>|[ Gs"ЄНЕЕ.`dй€Ё' 0Zn\ŒЅ…Ѓ§‘ЇO ЊсWЫщjYАЩъ!SЈNТsоmЛ&V‚[ЏjWiя}ВЊcпсЏSCљЏЭ o2+OЃњcбЬяgзowКэ3ј?™кšШS} "ЬдSЛ{{З4КўK€ш?ќА†ƒ›žДtXЋXц*ня юNжОNдm•gлk#-˜ЭхюгюI›тeUў'юРПѓа–ŽЉr8‡wЫл“y$1уqї~л… F.РНЂ •юсў1ќfH§‹UAЛКmAа~œKя*ўlъУoi2KШ€ЫЫ\џ~eDel2џќ˜ёїŸЎ ‰мЈџиuФAœ˜І*<С ър Цœ4ѕPшрПЁєj_1Г:РDЊTN%Q n№0аDАoъџЪЈёŸ>"$yOШё7#ž‡Т…FDФ!‡“aъПF!чGQJс{%ђx#Ж†mЭ вџbњь‡ИПж=0›k@бџ+cѓгžбџ?Іў~~?ПŸпЯячїѓћљ§ќ~~?ПŸпЯячїѓћљ§ќ~~?ПŸпЯячїѓћљ§ќ~~?ПŸпЯячїѓћљoѕќф Ќ_ќШ–ХЌѕMзЖ”Rлы=}ЎП6УШЄ%/ŒCЧјїЫЭЫšФўЗzCнё!$ЅЏA^ЅОѕLžізжzЊЎКёѓRŸџаАИiЈpf4)уЄDњ<•§[Прнка =UНMѓчЯg=ѓсќ(-[B’ШFX0дeе|œЖЙ;[гЂ4ѓ M’tеІџеэAmlXы™^Rц‘!(a‰ оDщРѓ‚ŸжЩч5;LыIьщ’bљAшйПlЈхx’Ўbgэpl…YYЊш”ГI`™ЖЄБл}~ќeї’b:+S1УДL}їgOKўУЅ™–уиІдо?цlи~`”_Ю2CфЦДт|ЇjБвЈЫй^T-ъиq2vдMGaW1зѓЂШей‹ЯзŠOъ‡KGЧ§Б ЩЄЖm`pВ/–užMцг2д…скП U–гL/Ž\7Œ[щ|Ёm?GŽЋщМЮз€мЙйУУ$ ‘ЕxО"м/el шГiќžћмIШ`›љ–&‘Ѓ1W_юPX˜hмЮfeшш2нОи‡ŸЄМЄž•ы{aAХцeh)<УPЇПtњщп=ХЎS[7C0н”Љыsк„ЅF zVјКРГє№~дŒСжВcзSЄ›˜8аЈj/{ЙіЯŸP§OZGЎŒщ415'šLBЧдиЫ…ЎfГЊžЇ;0‚јЃяcœŠТЭU2Э›žы–—"хв?i­{šaEY=­лђгщ4KмЪ(бyWZeYˆ†zw­kZЎ—N—ШйМ\,юg‰йЙš†) ЈкZЇ§OI‘CйАќЅЋ}UцЋ"rMО'љh4ђКзEф{Ўgйьк+*Њ_ЃE=ŸЯV`єэ—[оvУЈ˜Ю'ЎJeCћеэЩf8f%ЭŽg‹y•рrЅyшЈŒфWsdP„”ˆЊ-iт™єZGеm/#$yЈНœІзjQВn9qНЌОЧЂfмЏ ўлУЉЊDѕXнє&ЋХl’фWЊвРвЬt:ЋЙt‰КOeъYє­ФEНИGŽ(4zЕЊWхY7_Ю<­агŸ*§њ4›uУPй›Їй)R„еB42Џђ(L'„@Л*CЯqƒ „h=юšaбp/5ьX8‚јF5–5’љЊt#.3[SžІћє”g žЋЩ­ƒ[о№Ї8/9ЋgјO8Јf8l?™dOгœlкŽж8ёd:#4ь3œi‡ј_0 SѕhŠcЂХlQ‡ц/ЮџўŒ+Šmƒ:<ыfIјg`ѕ–Шр7­Яt’jьИзюбМJ] œн ѕs]7мQШb‰JyzP-ШќЪЏKь №2]юœє4=™/iм §”шNPЏ’эп\піЮzІХQŽ)Ї,isN&C kЎjЧ(ИƒFзž*џВщ—6Ћ“ХЈЧыш+BызhЯЊЂШPЦc’њ†HЗояžS(\ьMц“"ЫЫя$й ˆф–Ш*1—VE|Њъ?ќtXЭ/‘дBƒЇ*ЁПž"ѕ~šЈPAрv ipђўѓхHQ$е-Їe–х$л\‡˜л-Ы4!Ѕ‚ŸЧЊР‹ПІ|М№Š )0ЖІУщrеPз6ФбЈЗ]ŸЂ(гРдЈгу‘fй.ЄŒ‚хє‘$ЬžxжИЭЂв”UЫ‡ej*ђ3”.ў‘чn$ЪZXЭ'žЦ-^м/W‹GEЁY‘ІD…М†IзКs+;aŽQБ!в#4;hїМ€Ф3рš•‘гф~5 L”ƒљwcоu6Ѕ,’ž7\›„au:ЩтDІuj 2MC;=ќiШЃw_pѕ€N yQчEр$”КG^‡8 MћЛёnФ ŠKЊ6f4GЮ^”:‡ЌQ“­(Q1ЄАйnЋ7QэѓцSTі‹т r<,‡оK4<:ЎяЩќЌЪcЯxК~Ыѕ\Џ]їhNв§–ЎЪв)’д@д›AЄЎ ”чE]ЈЩ ]žcЈqџєhЈ{iBОSєxкаИ. iThŠ‚цbшРпcа…jФ?Еœ2еяЖћŒ XЩЩBС)ƒIwъ~“"і§PGшаЛгѕ]ЃYбHбIРSцHЕ3O,Iд‚r:ЄЂ]L"цъ„3-AшљqЇ—lі~’№™.SpŽ$›СU'Ют єmCшмIъ† GPfgVф пцЂєя—ѓ†f й+3јn ЭђТЯ›V‹2$ UЙёвГ7A‚л9I†sєj‚Dг"tn0TУ4u(ЉЄўi‡с$EwуbŠ œyЎ5'б”8Ы=a ЋSTIцEкћIрz6ЛОoыŠ"24'j;"й„‚+Шпy’цeл2гыŽYf<1‚и;јtJыV—SЄЂ†bR У6ao]ЮК6‘Xо2l',хчœпA №’eЛщ$ЯЂ˜ˆ +^MшХ+РТwyOY‘е?/ œ™џ0UU ЪгYšЊ$HК“T‹†”0,tdФцВL™CљzQ9zx§хј| :~р;КkВbчжю‘i W‹РƘЄч8ЎЬ ?nѓXQЭ0ЏЊљЊі Y’эДnјКнŠћх)E‘ї"ЯBSг4U…c{7ч}ЈЪeUхС]hŽWLУЮiЊ–Ў†тЂp>N[з~<3ЪраqŽbiKxŠЋ>ППoи˜‘;bG‰ PDа.A[xЬрђ№рьŽхšw//ЏЮ.ћ‚щи~ОX@1А$Ѕсe'”ГЎ*‰ьxиє‡’Њќ0л~G…*д4M0ѕaUE–nњђ0с‘Мй)ЮDхВ |з‚OчЈaЗuёeяЂЯ‰"Я /OoNіЮhнБ=<КЉЁ0ИŸЯ–‚6ЋE›QYŽcFw]AT4ї) хДxі№m^ІqZЮ чЈEАFyЅ,PyŽюwк§1MuЮЎЦR„v/oZЧ_Л*О ЖR.я„žHаЬЇЙяX€˜t]Їw4ћУ9fЬВ,:фvЌniAVVѓў…7P?E#Рf–м\оXžcЉы‹1ЧёtџіЎнКnѓ†х Л4˜[AН‚nEЖ „ќ9ŠкdiGž.S'‡7w?jѓккmћюJ>APмВсеФ-tоЛp†`™ш3ЄЎЦГНЫыDдО:sє uu}{{7фUг&`О'д№г9Dњс]Ю&iшЛŽƒRнЊ8<>ъ єЌьЖз=Л ЂЄzХЌ‘ !ЕAЋ•<ыIЈI7юрзг ‡sЃ“Ѓ!KuЏNОŸЕн@RЁtЁyŽ"гi‹T‘ЉЉВˆФ€ЂРQ7']žаАќРгgРŽъ\п‘оK+Ty” xИ'єю5JjDёNGd™ЛНƒ.ЭауСнљсща05UJї€П–XШ/—ЅЋСfSУAПн‚Я‘ bўШ™S‡’5d˜~Qў"Ь*Фjрк‹ћoK"Юˆ"ѓ‰Ъ }XTL?ђ5–ю}їљŠb9žчЉЛуЏ=I•5/DX;CЉєЩт=Є#j ?Ч0,=с™›Ђ!_ж=тuЫЖK"3Єx ‚Ж“L1–Х§УМFmУ Р$їO‡МЄЙqћФЎЃћ— Р6RgџЫ-%+Њс&ГХЌF…š:єЂTn pF–сЇD‰hћЙAръъ Zдм,‹=SC•mDAЂdf •;j`ЬEо:”zg=^д§uшШ{ўљрœeгTE‘Н=:<ыbrдУšШŒU sC h^ Kдy *ШђШў‘ЅІ%е)fг2ѓ UF<=ЄЩ›-ІТЌ(j’ ѓА`z&У—є5‘Лкп;‹ŠЅ•$QЗз­VйeOЃЊzСs1ŠBЩ]Фcq…я{~\І<ЗˆщіыA5›-І`ЖФбЃЮнPВ+r ao^$(фяЛ o›qAЄ№š“Йи§И7е ё4Yf‘žщœƒ“„ШTYO!\ТоDš“­ЄШ"пБQКK‘U%Eb>W“…xР)šф–TЉЃI<=Ђd5}ч5FЌ:IPЮрђ$тŒ€&фKQxъьнЫQPE\сЧ ?lЗЯЉ1QtЋчhє"Fи Х]# ,•€lЧEj+Я“П_“yŠз VEP0BfPI2ѓR{"h˜N'Gх"у‰HПaФ4<ћАѓО'(бJw…аВћB2‚ Š-žгЪоiрхWfЧн^Знй)О8ѕy[р†&RC5нIœaЕ#Ј\ёœы­ћEHЌ‡ЧDў1I]E@ЎlЖ}јeяф oRBrцFŒИЫЦ :эFam"Є1ЭВz^˜R/OЯ/ЛœlЂхМŒєgЉœ?КІЬ{#д3‚jAxоQeД"š‹еДњ|Е :ЋD‡З ezxwлЇЧŸZ­н'њ•ШqЇ#тЕ“)ђЩb%GO`4^–оvhХТИ.§YGжŒЈGЁŽWЦƒ-ШVЯј(ADBюWue]О?1}ЂюXмЈлюGwŸ?Ж.о\БœфцUь˜:јTQф Ъ Cj$Z*(k˜&œЁ„Ћ1Эѓ|ь9I‘“a‡јК;Пsзу$="њOzо@T {/_]%‹щœh€B\HzLг,гљєfяЭцW@‡ЊWЂ„,ФFЁˆ`'ЙР6~ rј”ЯR4Џ ьe’Di† ЩќsJEј3ЂКŠ GђTFPЂ^§ЈИФ€UЃ7;[яшG9%T‡ЋM uЗ?Оzћzћ}›ey-&ђБ№ЏM‰DpUш=|]Dи‘`4;PЗ§(Ыœ'2y–yЦRѓЊц5n-Da–’š(а’EТЋ>›дл—;Чц/‘`л†*А­7[[;;o/F4ЃФЈrVиLды•ѓOƒ Я"gDY|9/-ШѕЊ*Іш<™ЋЫ<ьѕщY‘г4ШTрˆSˆc ^VЮOBœRxЙ„л/З_ЗВ cАŒI'Б+ВзЏ6жw>ŸѕЁ4ЗР’йw•ЈЂШхУWЏn“йђлŠЄrT№KlУtЃДРј“GŽЊp,1ыщЂŸCЂ,ъЊk„ЇІs"щд_bДXдeЅ}окyЙН+С:)ЖТ3-ЧweютхжЦ‡6K„d‰є&|Ys›^юМnхЫеЗџХоw.Ж%щъ5fЌь ЙmЩЪ9‘b‰œ3ˆ ‚Є(Йg_ўVаГГ3wv—нћCЇЛе–X,дЉњ*?‘и6юJ,т H@„&` txЎ`xYƒ'М,бuNРYТИpл_ќiБlBюR8-ВБ~ДЕЕЕН}хMЫEР™ XзинииОВœцЁяЇdљnŸKe љ§‡.ќB z‘@vOа\Ѕ р а]\\чпБѕр‹ѓ,юHI2hŒыHКW;!цёЦіцжж.EД4Вк’X–cщ›нэїЗрW[Ж­+fLОŒD›ЗoЗоmя _Ÿ§'б$2)"УЭ<4Э№Њ?2фхu•FЛSЋ6Л§ЫУ-\lл& }ІSВq-ЫЕƒЭЗллoЗO­)Š4Кц>фєЫ—ƒ›6Ž“ЩL֘MSџёуіжл­уxDOЯЫнАх>Љ|6П‚ ЃnєвыЗpчLtpZЬ˜ьс#„гrЗ1‘ˆŸ7ЗЗЖпяьж#ЂЭpQsьВWWWg— р$#ЬqYv|ŽК;[Hєe0› бф&т%Yьk{šФО рд ’@ЕЖьоJ”eIDN)ИY*Я’Рuрџхю\ВБHcy‰~Зџy˜•&­GР?Vюo.Я.ЏЏЛ.qР/р-ЖоП}s— }"ЋЌЫп6щŽŒГ4В–^V$(И­ўбMл @чYрЙIКŸ$*]ЄЎШRыtckcsыубчSm’ЂРр€є46ЈzхъцБZзЩвоХ*uѓт§юю[8ѕœфŠХжфIQюZ,Џ$@Х$ЭŠIъhЪ’ћw%YџG3t]еp—Шr.aZИ4Г(wMИ3ssksяtяa”gd“cŽ\uDКеъ2f OЄЄ9ŽнъЮоСаќО7&1звŠ—{VЩЖ9„6 ъ-ЫrЃ"uuuIЂEYEZUUХ*[EъЁС‚™т0ЭШОnpi…O››яŽ(L1УWаъ!‘чFйт= ŸCњ№ршгіііж'…фёЇхіaп!ŽHq му4™*(Z'Ц%еЫ тЁТO "Ясbe‘>еzУ!Ћњq’-ЎншnssDdчфєFMш”P<&4Mr4мЈ6аЊ\яО‘о:їq FЙk=2E–eєy„ИP.7ZŸИЦВSЫ‡И…  –ас№іъщсЩuц+ŒТ(Aљ‚ИпжЗзABіOO­1вŒe5Y–—ЫU3ц>ЧъэсёЮі;”Žv†иœlТ{KѕМ$Ѓ/nг]з6A0­ vMeIL] 8В‘ЅК­FЃоЈ=м^п4|A5ƒР1-ŒГƒK˜ї[[ы›лŸ@@~‚сSЄ1E’“c“№Y'vѕјфѓілЗ[oЗЯmВ lzћ2В…Ц=АЈЉШЊNИHК= ќkсFw‰e@— КзЌзjЫё8ЅЬ к@Ч6-,)2Tќ\ПruvtpХJ/Иt:}љn}ыАrђqgї Э“лzТэjоЗ-НњёухCЕrОџёЫЃNœy\’‚•VйЪ—пЮ§УKИцR"V SzXL7–tngИОчy#pЄ“("ЋШђxі fоЉЧлк|’œhWюoЎЎTЮіv?|$ЪёіЛннŽ%ЗњщуоyЅнКољxЧ[1ŠE™@žампНщƒ;ВЂщOKіuРšђЙdšK’­ ю]Ÿ’РOpэ œнژ рєBcџэ‡гъ§ХйoяЯ4@ k`о7vЛaџуЮсйMЃз9ћЅgИiеЩ|ЙvUiдЎО\РмrЬ€‘м(ŸРМИŽcšЂHKІ18М†rI†MAЈђtwРё2иgпуn=n ЦŠ]YАdФ‰G–ЛЊЬv;C7ЯЏnŽјѓƒы‹эwŸYAЖIie$›ŽЄaѓ‘Bknxa™q х‰Eт[Ю({JЭхЂ5EqsqŽХ[+\ЎЬЂ‘cДУbЃУЪщ1ц€Хеу§FПUН8ЙWудя~ко?ћВЙКБўЁ:р;‹——ёЌiO|‰kн>іyhЄ,kBђfOГ'@ТOO…ПdЌ—QДpVnЈ}.7хт/š‘м[ŽЖЄў”–рф3ВpqKхpчІYН9о=†™ѕ№nыЗOoзжжоьд‡Мb…ШTбсљіUЎ[Ћ6ШR+^1У<žbнi5Ш}SYЎТ+Y:ћBЈЦі’‹#ыЪPCУЫNЦЅТГœ4\№д8џ|ёxwуН“'ы›ЖWWззVПtСw0GЅD#єРŠБ,0q‰бћ>EХВжˆДzM'Б N—Мœy@Ю2мџѕќT`Аh\&ІeŽ +Фаг+†Р\\KХvяЯnЏvWWWхњјfckэЭкњњі зЭХ‹Ф_ŽОР8 НYмUЩ€Onј1YŠЁідVeU^кs‘ЋA—ПІйЩД uци'‰Ё/„ђ$œ”х'l №4G=\=<œО}Гњзї]ЇБљfmmuummcW„Щš—bШ’D&I}Е с–k*HЕO"›Šсй4PСs—­DРэ…“щm7KƒѓщOІ‰'GpЯЧiZ”™—ыRЂ,Џ*pК~uИѕW єNЙa~TЏn|М<‡5nIV“д –l%pЛЇЦQој).Дœ?Я№ТВС`5ЬQ™њн8WDХ!pLС`є+ЎJfЋqщЊ@­§iы§ЧыyГКvЮ_МY6џum}уЗ ЭaxЮФыЉQуaФ“ шШРСєVО”Kq'ЁЦ3ьвЙЎЈGХHу*Wчї4Иц13Јўe§Э*Ме7шLЈ Ж!Qw$)Y”љЁo,Hњ|Rv(NŠдВ4бQЕ-exw]ыPМdg@!І˜Б]}sђ‚˜&)cў wIи‡ЗЋыРi ѕhxєЕе7§д#жЈLзŒI–НЬ`” Й1y'$ŸџгШћЎ#AVЎvѓаІсцЛiаsLь,цЭ Тv"бщs_У•‰<_лЂ7вC8НZžУ.CbЮšщ„x 1СЕ#‹<м›јё­чeЁУt<2 CVПЃ АЫ Уцхљ]‹ЦђOzpIнбМl™%Ы A{€ўŠДргД?ƒƒ|ЌОљв'тБЖЖОКq5фБ|Kбн(#Т0FџeaJl,|GЉdЯбьЦ—ЈHЎ6‚$I€M9#Ÿ•<ЄюcZ–p k xDџЄpomШ^][ныќo$ќѓюvDHєм I&~ЄвeJ„;д%ŽEћ№`šhУnѓћIЎдZv‡`Б№€5sŠ&-J&Є/‹СДЩ юЬlэg‰EйkэƒК•ЗКК}3р8Q–eЭN'DС•ђLюѕ /I–к<гЎЁ ВlZS†пMsЕPЋz]мZ­†ˆy‘KФ+хyФnjГЭ}g‰ѕ§Нђfы kие<)гыEЙrЕьw-вHуњ7GMЭ}ч#эЛћЁh,Œ‘bд€Qќт[{qЦпЪ<В‘(Bфйкgф.аМyFŸ€œ |ГuuюВЊjVŒ ЇTuгE7(щ*OužЊUЏoъfZM6ЄgЙњ@EU7 мз-ш)—^nў-…mкЎЛЎЊ’0М§ЗэЫћ;ўс§&JїњкцI‹aYIу’ЮАqBЎQnsв0;"7`НVЕжА‚ъ=}йджтД†рVhn8ŽЄбwгiйщPlBJlАВЭЧV"‘яm­mlЭ[Ÿл:}МГНўШЦa;(Э?“КдЩBM— Нё—Іі!q МЏїy5™ъїжиУе€_•9щЂ hЖ+”>NЊЩќ‚L>oбЋk›;МЇК~Gx§Љ2рD‹MЧ_‰Ў›,$ьЉlЦ›‘ИXJЧшЊноЗytLП{ЌC›a;%FЁ91_eЅ*R4FЂБЦBjm#›зЗ;kйБ/vюŽ?ОнX_{wкbDU5 -{СоœВцьЉЌМ"Эv€аqFЉ fћѕ‡мЅ%СєтєiОпr‚•вЧEI yЕqщцЅh(аяar‡ЙХяњцћ§ы–ŒгЄІy}АГЕЖўёВ+ЪЊe›)і Щ}&kгIуЩѓЉUŸ- ]kФk75ъћ:0њ‚ IшЫ`@;АedЭЄ,-2lЭ­]КЎ Е=Рx›лЛЧ”`„ФАvўлжкцoЗœЂ9ў('Т@ФЃќuЄOю иА [Ÿ‘ьяoZх$ Д”щЦ9ћCbЄmŽ-грr`U‘Ї™+:fŸЧічЋЖh'Єv4ИЏPw_оЎoя5Бžr<›ЯЪ’Ф GH.ёšI“ьй–eшšє“3Xxbз="Гё•vќ;-.Љ˜Ря бЩГoC3ˆ’~*эЫмBЖћXЋе[ў€aОЇКОф5У’ЄYЏнЁyЭУТэ'RHФЭ ‚Нщгѓѓt]­mО;hY9 cuYYu…Ч†Мh%“↕ќ!œy!Mњ 5;_xaФЊ.Я№<нНнЛшє{НОNf)sџєЭ…@њ№§ЃLуh•,є-ќMГиV)HX_ Џ„њюЛmјтtxеIЧQ0ђ1Qј˜у ЧdžШ J'2žhз…tL'Ј§ъЇ/§a—ЛS'гђžЮIs Бќ/Я_П!K aа…>‡цibЫъЪЧ@RGIфКaжГM\Xl™CВ‰ГDєёjЪрbWЄЛ;‡~_ДCДцшЎсdТrЮD)f№Ј~§<‹5žТ QphYй№FњВY‹=ŒЂ"WW$,]'aFŽсp$ 6шOŸ ы‰АдЧOѓШЉ^хЫiЛKk)ъѕибDнC2g_‰†.\Eтщж§еUЕЫЩІЅЪ?|ВbЙ–І`ёVлMГœг@d’(”вжL Тh•ЇЉі9мУЁФёsнZHТц Œ4/ѓfЈ9@ЪG•І§pqYщВŠЊў„!c‚ЄъРhЫ›15 iF‚Їgфе™ЦD# вFх‘ит€Іњн›л~ohxXюCї)жЃgXок9Й†ГЩBѓ‘F ‰Ёš7+-šљ#ЦКЂ‚‘1Ža†єp@“KAіV…c^Юs™“ю b$вН~ПзИЊP}NзdЇЉP-C›Iš(ЮЇ"[1GfЯRпf/ŸcљїЇЩ"ƒЉvГQowКрTpМЄGЈ_чј„K{CL2vлŽ=PwнnыцЌоЇx~\юw:є@‰1uEвШиYŒUQЎ;JЇѓпA‰еыДkї•=`ЕИ(;]gф‚=ЭУЅF—АQгХє“Ї­ЗС` Њкёу|:_Htiжžžі'ИOЊап‘рЖRѕzЏпiжЊw•6=d#.C4ГПыімЦ&+Чѓ\{ž!џИЊћЇУbU†‹х€ФŒЃGSўt-Њ1бB‰aXЩcOхУn­бЊTЋЕ652М‘| …Сsљ ?=;")…UеђFžёгGn6э›шЅ„ЧhJ-ћѕх+C4u –SНаеи]ЛМИМ­5š>(NˆŽиџЅ„]гHƒ'‚EFЂсGО!ўЌahпN<[Q4'™С_С2|Eš†Џ%›ёН$ лoі‡œbЛ:OGŸ/ыѕfЛK X#%‘јоЏ/пЎb qtЗCsЂ‰CФЅѓїџУiђЂЂ*ВЂ{щѓп~‡4Я‹аe g /WaptЕJˆ("7ЖŽ?юмн?<6Лє@є œ…я\^R”1іU~аЃyХ ги–~ЦTБџr€ЫЖc™NЯџлп@ЗОD”—еSBє4тАеdфљyЛЈјЂј 6bДEХŠq–c‘`'ЯRЕЎЈYAšO‰pрЌЯЇXКQkЖ;­‡ѓ• А\0ƒ$'ipLБ №g wѓЁЭ[мХЫ>cГН?Ÿhжš›OѓРвd?UЛ'œb…Ўт`ЕРQV‡ъЗ++MBsFиx‚Ќ= *лPЙ~хž’FOsБO}UЭ{Y5ƒ‘)ѓ„ž§іЭ Р)N22і‚˜t№ЅБ †С9Wl3cRщžЙуYЉюžЇ№œА0dPЛm އШСmА‰pрсUЭ0pŒMЗKQнЪЩj;Lђ1Б’Ѕ‡‹хЁиH ЄS+-7т№Ё–аџy–јy–tjЂІYœІБЋ‰т/š`п•СМ€ УQ`Њz\сdнEI>™—р Yли{UjЅ NУpаo6{Œ7Ecј‚УM Uсišю=VђhF#O“Ѕ_Ж+`(ЩЈ€Y@ ]9Љ %еД}2я›G№\ŽЁ&жХ­ЌqшЯ№зЭо€њe :ўWg :й8\я6Z p=‘шvЋгМ…Џб #LџёЁ+˜ЩllKнs$zЅжљ“їё†9 |лPw=2f6ЕйnЋY=‡Џ5Œ 2=LмЈЃЩиќг— ~;У4A[Шe’Е)Xу\gz­Ч ќ”fy3WiйIsKќs…тN_”IЗHљ­Œf‘Ц:їј8ƒFщІpЈЃБ?s{СЯ; Q2__ ь‚аGэжс ;pЙ_Нcыћ†^lUKžЖ{Нђ4рAЫ№ЋнwN”4ѕ_ллЌcџЏЌ)§—3`исџЧуkїџdхќz^Яыy=ЏчѕМžзѓz^Яыy=ЏчѕМžзѓz^Яыy=ЏчѕМžзѓz^Яыy=ЏчѕМžзѓzўщєИСЪ Ѕ›K/ЎћOЯr-†V\ЯwLѕЯ&цqz‚B­аŽ˜Њ9Š“абџЙwЌY_YљS+5џљ4uзqvhiфу$п,0„џЌ1riIdњ­fЃљЇФГ§ №u†ЗгrЗg9ъпчƒеяWЫ9šФєАВџƒс}Ыга“‡Ђ›yф“=†FЪТЋWG+Кя'IртpРЋ†ёУѓ~шдŽ‰Л“м0ЭcƒaЬdŠЂ™ŽkЊЄЪ­rwuYхm?Ю&cNuрžПОuспNфDн45ътQqЃё8P9=*BiияіXE)›„nю)Ed€ПN2ƒ7$Ш^œŽ§O’эЁjш’`јž.7ЮZš—™Џ[б$3…AЏƒ Ъ.ёл*М=r‘чd—клИ7/Де?ЅМЗ+Њ–c ŒъЖЪ]ž А˜фQт|K—љaыю~#эFqфй†bDd§ИШbWeЋ [t_РP’эРS‡Дb'#]яœ7-7™рTъЩdšЧžЉ‰єу|c'’Y’Ци8Bf’ХŽЪtюW(YWџШТг:Ўo c[Є)еЯbл”кЂрœBбVD†,‰ƒ6ЇфХ‹йЧЄyk OУUИ!еШ†e™ђж1BIИЂ3ŽmЖ74Т< lSює М>œ˜LЗMC №LBt‘хdXьг,™\]3Н(Д–нDњнЇЇj†e@4гх­`œg#лd["ЎbС)zгЬz=z@†И гЯЇY0 ’b>›O#­{wл‘ л ђIjk`эџf3’n2ИO6O V8)Š,АЅ>ыdг)™wœ6ЁЭ?Ў\єQOp]‰ЇгљФчЮЎыЌfYЃb–šBП/*Т/П‘еЦPT;žLrOхd;,Gышях8dМРХaр;–І4ў{яСоЖ’Ѕ ћoЬ\[йQVАЌ,QЬDЮD$%но_џS яє|3Л=Вхю}žuЕ-пЖEъАprzпWУpТr9Я“$_ЬЋ‡*ВибhЬ‹ŠсL—%ш‘`˜Яу|zўъѓ45f$ݘЫEъ‚HqЙD”г‰i%ЖЗШу №ƒаw ЃЇq1У;љeQ-m% q[Юˆц‹P'p4хWЦšЁЂILП5’T3Ў–ѓЬЕэ0Gєь2Mвœн4ЯcKQtљ‘ЕnЧ ГйЌЦзDxВ‡ЧE™„СФЕDZЬч‘dEjџ ,яџh5eндЄёѕY‡SœBХ4š„9ЯD.‹y‰ьTa4ЧœЈ0ЗЧ'4GxY•%b‰"нNъ;*ЏxљУУЁKџйDˆЯX`‚žЅIНЃуЖ E‰RfYI€ЎыbHч!в~ л­vїђИ ъ“eyYЇЯYЙР s5eХFŠrаš‡ХдzqМ‰ПZsпRХцб%Їzs‚гUЭ{„Фч ЩЪ#мe9вEk(ќнўзЖЄ›–#ф\ fJоЊ<№ŒёЧ§>ЃКйrщKЬXzi˜яBn8ЭГ‰.3#^Яj`q‚щВ5ŽЇ‰e;ЖЁЪН“sкšФY1XAЮ­ ВЋДž‡š‡22ИїЧ‡XЈ~EвG‰Њфe"/ ьЬJBl"F(Rў Чdыьh,srЫC>5Ћ5cYƒL!*jЯJб{BhIQc Яtм_€вЋЧ+†—”е4Аtеžтѕѕš ЙLw4BTf.зkѕњЦз/mйIІY2q§<лУы\>ЬSцUг†аЫ'фЦ‚'Љ<›ЉћЏ{ZTЌАDЦЈЎˆа…šA`A1уЈЩжР ‘t^žЖЧŸи2 %GИ9„&O№KœŠˆ@9~Ђ_U!Ух‹f|}†Їћп6dHА­3„&yј <4вїMЇqСŸёФГ eмh№Іe#J2DFЭу„јМ*1Eb (MФ R†Ж* м ц6ЫŠ,qдˆ+&х O$›‹хJш,Eд*нѕ'>Ж фўљ=ЫK’ ИAŽ4AmУ‡Ь=]5Ув^<5$ŸœЈь ˆ/Іж#YTЇFcVА2ˆФГ%‚Б"§мсрЭІYhАд˜—QTLC|9ИІTСJ9ВdЩŸ‘Oš“ўЋ*—xG…ž††,KŠњbˆ*=иgdudnхdПЊazkX0-Œпя–'Ž4ъtƒnРчМџ:7 иa;:У9yэ§*B:€…x ВШ‡чƒlц/“І ’fMТаUEfй›Ю–+8`ŒЩЫ1Ў%ВИC]@SдxLЎцwON.†:T“K[ъЁŠAгЋ%'ИНѕ[Щув№РR~тћя#Щ:д„EdJмЙс€Z4AЎG2CмRUAJMyЖеGœjЛ&[ЯГНћЬЊ:е#‘5ЬоS(бT3vЬ—HžКЂЄ"](ЅЮ)0ћsЭ9A­цШƒAић`Ї“РE dfКw=GђІѕэјфтюЎCб’[ЗC7 $кyИ&Мbиh‚вѕч„5;ШаЃЮ]`xIsТщМFЎ]VO(4ђ"Е_MLЅ†цlп_RШФ ЏїПœ|ўrор4UпSсўbуfŽ%ф# Ђpє№ўцІбъsрo~VцІ$Ж3ё’bё8'DВсMx•<пЇ?—He€ЄŸyZуйё з†usrЧ‚КyyіёЈ1” PэRTТ+P'-ˆЖК Вp,KSУ^‡њq^ƒяЋ+Ы Ѕšn:бьёqЛ&ђ”^‰ Fd& !™ЅЛзWо˜aFЗї 'ЪЂШ$пі/К4ђВYa1ŸUјВЊц9.ckУ4L”jўЌФИhžь—(kN†@фЄ@ „ž~$†„œP9сjЯѓ@aщіщikЬ :nЛ/…Св§ГЏ-FP Ыvу”‰ DЎj:ŠєзHІ&‘oˆЬ§K§ЊйPС*Ш&Тс/ъ” сКИЧ„Щ3š(лЙИpТј­[šУЎЭPН‹sJFZ6xJхb‰Ь#:<м ѕ0’ћHhq|{еОP4oєN@ х9С_‘v@<Ћ0IЌ"SЃkЕЧМhzЖШТOЇtzƒAћцŽ…˜ЊAhTLљHх3KВ>K"7юДЦ’$§.rЛO :їWgЇЇ7}H$4;.0~\дм  Тћ‰tPј7ЊOБ‚ъ–ШаУГГ1еhаm^_69de3]DŒEО.јМ"y>шЯЂ1№š~ЏG“`ў3щ^{ФIВФŽ­ы‹Л‘ ЩЊх%H‹]ѓ`$#eЄ‚›ыAьQL?rDšъ]э}щБ$AеН8МЩЊЂЁаиш(f‹Ї',гцSdщY†пуё˜цEЄgџЉ­ѓ˜)Ё5qд`Ш{ДBЇАD4iь Ш!с Ѓ›ы>+BдŽC[_о4 љбКЇG7ќсІX1SŸачЭРZ$0Р№Kж /Ž!Yќ‰іќP;œ˜Шp& ,=f‘КеЉ–ЄЇПФ* Ѕžк|чЂ 2YOtаŽСщЇУвRШQЁvrбшу“rRЌ'ЫйУ#жЙ‰NhARuC7cУіт,GфMщ'|5ЋРO)RпБˆeЈAФyM’—9rЛѓФёdГсkdŽgЎЯQ тРeО}іэь[ƒтDХ+‘„ЄX"—MхЫЃ BНœж ё –?eшвЗœКэTЩ~9GJ,п†Э {Cо˜жР’Dp, ЪYцЈ’dЦ„dО ћФб—ћћЧ”Ј…P#B*N5nяС,:#оЬ*$І!eVх‰ ‹@^ež@ чЙšyhЪђК=H ХQ!ˆЁ6Tˆ›ЭˆnQѓЃаHпI\ІС$Dкёд7@X†Кјќс =MЁz—ЧнСxа"t^AјХH{ЌђEN2Т­eR6Q†|, lѕ!pА!-ЙРсi"ТoYH*QѓU/ oЭgGxDђtЂ‰,Ф“qяєУцСPPƒМШ\Mb†ŒШƒr˜“щŒPœ-HKmъh˜BСw(<ЫаVЮХb–љІ"џ&Vђb•DUбm?#œ7e–DбЗ„2 Я2Œ№Xі™iЈѓую}w8Иљњiso&.ђР9иc*№„аC!‰ЌЫY>А uЅF>>)р}‹РQ~H? ˜Е-™яїьЧщЖ‘2 љЋч5чќјH3bBGIш|ŠЉ/лїwAялсщўЇЧKf„Ї"'‚ЯайЁЋЊfq Ћ˜ШШ БЫХ}Q$ЮТoв№hxжƒСˆ еЫtБ$|fі/0žAžczrђ}Ÿa}aдŒЦє№лAћњc\Аbg чјђd‰Ыв—š рDтXNRM/% жДEfЄ!ЩJрР|HЯщ^ЛгА‚ŽЭ‹ŠіЌњweгпoЬйЌжиыд€ДёeЯ>^mAІІWVd4,рГцГљгг_L3™)01СЖB{`9ТјGŽЯI л4U‰cЦ§!+!3ЁS&}вf.НЦ‡эmeˆиWЁ СfУщлнї›MФјvrrМЏšЎЬуCоЋя ‘Г^ƒ€э­VP-"Ў./HТГїК)Шš?-Ћiш@Y/ …y\жM0D FъСy9ѓnЖЖЖї<ЋE ю’­N\…nmяlД Ћ}B)7Џ%ЏЈіz1fть‘А/8N˜"r UІЎ€ŸUMvkЏ+)5{ФЈ§|іa^ГЂ.j&ЪjžЯТћэ­S{N ъФаУю’Фvї77Ж?]б,Ы›гšЈ<МˆЙГнcўџ#9+'Ч^ 0P….Њ"A–VxЖc0JHeŸ›€єDM3Iœр‰вз"љ ’ˆдь‚DˆЌL:;[[[яюу9ксЌHmUзM]d[Л›ŸnЦPИIžBqЄŸ†:’§ђvћP?§є1ѓїž{ю„vLAќЗ§йmі&ЃЉ:d“šiкЦ+šВjEŒќNАгYw{sckѓГHtќДУБ‚$ђBыУЦцЩUCE”#ЯЇвёЮЮіБǘcBMXУэ2”Ь№чЄ‡4xЪЩD~—Н/ЩШЧŒм‚ zSф`. ќѕŠyЏЌђ2ыmmmlll]…sЊ,3GЂcv|§i{ы8ь•knFˆ&‘чH9yЛНЕu•,*в'&4A+ЎХћІ9 Ј~oФ@M+A“Mг$rЩyM~]ЙЕБЙЙ ‚|5Qa BхЉЭoWWпNOЮя‡cNqRДZих,їСй€аяЦЋщ—W-:!ŠЬвT№ъе,БѕgsBIШs ЁdSЁŠі=лЖ,?ЋЙфЁ^)Б}ч_ЌСFolmo7cBi‹\WEfvяnЏЯЯ//ЏG6RС ˜чqџн~Фї,<ЌGТэBђ.rB\6Жoj’{а4№}ЯLѕњ(RЫЁм6-IЎ%pнyŽ›ŒЎВˆЈ  rМпйPdЂ@рŠ]К}wyгКNVY ВжgТо:|Фэ­bEІ‹њ(aЙXљRдЛiш{юdyЪ40ЕgzjZ&4J 6,…ќbћc鹂 EЩІи )3ю§J§vїУхЄBЕ/ёC…'Žz=ŠФ•’ьѓtš[п рlmnoющЄ 1Џй| ?,ъ6ц“‰ЅIь“@Ў?“%‘’4№xЂ$‘S„'eюЂŽp’р‘‰ЙѕѕЭЦ›Еѕ{͘шРŒgBе…aVѓh"ѕg6ѕš?МлЁЗОAм˜з”в‹"Цnz’FќщOlЯ^ ЯrтШy.vC—ЧГуaЇй1KuŽп 8žЬ(Э№ …Nк›kыk[ЛћЧt†‡\y‘nUи9ШŽrBГŠœЖawягЮііжЮлVŠдauZ:… AV5 -О@qk Д9ЇиQеЬѓ„~5žЃЧУіЭёЩuЛлnœо;Кь2œш$  DІЙzКЖЖБЖГїљH­Щ эїЏЈј!в,|ўМНЕ §Y*Ћя„єѓH Ш‡2KReEзU(ЬUТ@kNМчv–cGУ^ѓцєыбйљљщбIkа В&Ё? R”*ЫУn5Ф—ннэkšел ВЂŠdг,…?@_2юыСС[6КЯЩд’—‘ЪcиF7…‚уRР_)ši;Іёмшвc!ЂŽћыГуЃу№ АЂhV”F ƒчЖ#эз[пиxћqчэ2ƒф9›тoдDЙўђх§цжіжлэc­ЌгМІ)ƒkРЅ 9ЗH3 hКЎЯšЦ.>еОЛО8ћvqлЂXx3<1ŠЇБЇі›ЂтЉE2 яЗжqmxџnЗщЃoƒmЎW†1№ЩR§ўєшрУл­эЗoљlV—?ѓYњK|S—ЙQЪДFГйъŒиšИМ—іЬр2@ГиQыюЖбюSnВjиA<B1$м~эыn В%YЁ][__{Гѕўг‡ћ Њ2ь5~ЭWf˜JЗЇЧ‡ћŸvЖvЖ?3Шg[ЇŠ™ЃaбœЄx\Ы{7'_>~> ъ#\ЎР0Ь3ЋќАВШŒ†#F$Ыt‰ƒ.)’ўЖ{Х›<<ЬђtєiќЧњлOwїŽzЊDJTcJвXјvpxИџqДcw0}@*ж/…ŽEйœЁgщ№гЈСХщщбљЭѕmуОеz~A’ ,Y$Qd˜HМ€UїєYaZ'ћЧ=mВкOЏЕІјf{їнЮю—oT”Mќ$ЩˆиI%цфгСсИŽЭѕЗї1ц „Ч=q4qtuйAК*S‘%LM)šSУ^Џ?lмю~=z zџMЧ– ‘‰­ŠTуxяД3f9Qw<l’$Ѓ^Т‚ ;џ,™;Єи*Š•yMЎZЅЎ&ВЬђ|— }­…д/Ж…ЛїkkŸЎЏП~о;јrmeдоћЯ‡_і?њТФмСооћwŸ.Ў?ЎoМЂ"…O GН›гНїc# Є{PдЙŽэИk.t}Яь}єTеK‹YMWWГ/цЉ-уУ#Ѓ;Њ,yшŒг4\m|ДБЖ}p}ёх`џыa3vЯ6жз`mЛіёжўсЇ‡ЗWзопIA=­<+cc|sќeџУзЁЈ("Я іЃ'ЈVрoЂ‰Nяy.ЏсЩіќ8ЭЪ’PЯ"-ІЇАФp DЕЈvЦYкrћјъУ›ыѓ“ЃЯb:~Npssš;Ž/NП^]яn­eЌ(ЧL ž_ЌŒЗпО@:ЃbјГ&Щ8І,~?[ЦЯ­ЧiЂЩ А7„ЭТYЌёcJPэвžэt:Х98Š}ƒЛ|ЗёцУMыцњrч6vоЌЏol]ЪюЛ“ЫЛллЮйжњћІюExŒŽщrbh:8чю“UУ‹№НЊYzŽeшЄЂЦЉUэЙ“ь"ƒœЌ˜)Ю”Œ"фxО&Ži^™$ф@|šЦIьЈдй‡wWны›іљл=эoПйXџ$ФwoOwїэNѓhkѓTР* YдЁ`LA"ЬШ Šр=*“‰ХДŽ5ƒzSWŸЇдэKїюю:#АKМ8;HsГи”ЧэБl%P{Ёі%a€cƒoћЛч№ŠоѕчУTл{ГЙ~с'_юšїќхцл†тBтGbKсcД bЫЫcР„JЄwq& XrB(?ыlП‡ Ьјbїѓй§€—&еr^&Ўi‚G™††Фt) $;ЦNWIbїтшМзoмпКѓУЋѕЗЃ”ЛjДЛїэAяќнж—Ёсc–JH‡Ы|щ‘>‰&†LJp ўUљ ObQ€WТ `ЯR2-U4nк4/)ag(РCЬ[†lRВaŸI^‰jф)МЬ5Я/ZуnГuЖ{fфуїoŒЈu Y@ГнП=xџёZ0ƒiVчЊ`rТѓЂ1‰уР ‚_sBћ8_.Šа”УЖєчQс!<:ШЛре!97œЁсƒ”1к!У[9йi: 1yQЅn/ЏZУNыrї›Z_жя"ћєгще]ЃлќќюУ~O5Cјn ”9f-–Р2‚jAб@н-):Ж„Ш№йдUрпD jЇчtж{Š2™ЦЖŠЉЈ—V„tЧ шlЯŠж‚Јг1fЭ&*|чђєЌгk\эюітєі;w7їЯЏ­oл;Ю9УСd$ЫъtuЈ ЌЄ[єуŠ}Д>Ќ rOъЎёыY”ЖEёЪyцЛ„ЂjFFЌр‘ jгuEЦДф;  р;В44%A\5їчЛŸяМjtdІНЭУЫFыњУЦЮ‡&<М„јп„Dв)ФDaмђ‚lzIž'О‹М/ѓyшpлg­Сѓz5EѕЪхУМ,krk(žчЈh6n$Ж?фД;8aХ8=†AПшпк=•fт\­o__lnn(šжEИуŠЖ;2%ІuгХу!'*№ЃМТУ#UЙћ§Г>+qЯё=EЖђч<2От)ЖЏѓЬ˜шўх5­8$€СFcНЦбЙсьэkчўdoїЫ(7ѓыњЦоЩС‡­ѕЭ#F5bь€и иyъШм йУУеЭJЈпу Ъ™Фvt3”Uгxж UБІЫz<‘ДН QФŒгУы;^ѓI`C Хр!CП}ЗПѕЙйО8инП=)” Gкў№vуЭ›ѕ­cFбЃЂ г(` v9@*CсФ{NІŠ@ЇSCфщao,щЖk<Ћ‡ (z†ЌœиќС§‰qЂJЦ†$Ь–м Т.Fё5‹ б5Џїжїкo_wOШ ›oЖЗ6оќёЧЏ7ЮйŒБ~Ч,;%=ˆёе<ЛШ]UЄЉ‰яТFуШ‡ xpдuЗџfћВqsvИГqэNХOџўњЭкјНіцЫЧ‰ѕN1)!LI‡vœКaZT‹šъ‡—Ы"|nDЄ4 маМІи§N)NЂ,ŽЅ`љ…ѕ4)Исi—E …ЕРДOо­^žО]{} eЃTŒзo@ш VTt ъ3ŒHЄЃ%Wты"KгcB`Ž'ŸГYUЯ‘@к€soЯьšŽUХpЃтс‰„•yн% іcБЩˆч^9yмЈІБЅЋ’аПилќtєхУ›7oЖЧQ 6ља ћ]‹TУUю‚Яfги3‘=y+%еFњаХъT`‘ъx&№ЬО‡(ЋК“Ђ†•YЩgRŸЖ,ъIтњx{†эšЗ=MBТшц`ы§о‡Э7o^ЏЗм;6„^лХ‰UУF>jŒ,9TydPUй–Г„˜›Ъw2L2›@T…gžЩс”•™Ьeўs#œеМлјu^рЩќЌ*IЃMЪCЮD‰ЛyПѕўУц§њBЙ‰ОYћдСMѕјоV…Z›А/6Х<1N;щІ‰YЮЄн|і гHTь|>ѕL‰ъЖ{ЌhsSп’Ÿ їЊ/™A ‹Нћ!M1ВxШ\B‘ЃqrPВ:H'ІЊiАгїяа3уџ@шу_{к§zm§t,bЛпА‚ ЭџыО:ёЁs2uQ2ЌšэEъы?pій5гRG­Ё$ƒ>ʘЯр%{rЛŒŒ{Ћ“8MSффСFЊВалэxН†’Ѕ^ЏЃ†^;e$I…УšL‰тNWѕЁ9I%‡дфНОкšЧсФ4~р‚Їj u? XдЌ|Њeњ8БMœѕъЇсэх"дж*ЙŽŽ6P‹QшУббФ$с/ЖЎpy*И67ЏO ёLoN.u‘7Тк3г‚\ђŸЁšљы†ы_п A5ЭplCx5^M˜WЕ2т%еU46!z)В8>н\[ёf}эppђzисы?онуH0јM#qgЈDђ99‘Уy"‚0#k^‚ѓЗГЬh§љ2ЏV‹bEAи1+$’§›зz]’ LC‡#ŽŽзQ=рзксшŒxмъїфm˜‚Ц+$ѕьЮиW‰.p# *FHФЊyn‹дЯмЉь G˜№ьh@ fJМщlОš™ZŽ7АMеc№„ўe];ІЏЗ1[BOђі–ƒdžИ•ЛхФqAbŠb\‘ы}kCхeр[cKњ‰›E]˜Ѕšі‡ЌЮjŸД$В 2бDœHHЎMJbwЏVу7l\ЩнM(`г_ožЁ:б гЩШЁ?ь5ЙG^K “Лп>?9iб‚(›~^F–іУ#В­1‡•ЌРБ,ЫЉ~Iђнх|5ч5ЏЯ‡СюcзЦцюоƒЛXGЅј4є„‹нЗ›kрёоl~iГ2ŽюКх‚xЗy}ў}ќ*p…эV{@ƒ6кQYцГњЗšјšЎсЙОеїыЉф†АљŒ43l†Ј2uЖНЖОББЖЖљёF‹ьсЭщСћM0Ц§Л1јMCuqlВ"aЂ_Ь›ISьgн;ЭіˆУ’б^ЉѕїЋ;­{ОыMЂiYЋсЊЭNR'и0ДФХ,4UEк №књцлНK6Ш 0м|о~ѓzуѓ Ѕ(ЊЅГ2nF†UѕSэC3OƒT˜QуЊAAiXњпg@в_7ЭjлЉ• 2^BŠHŒ ДЅы*ѕmgЄоxм`\lЫј–иЛќ ™ъЛгžЂjžm•OUY'Gп'<ШˆЧQВ\[ЧY Іss3’,лzцiўїm’Ж„`&гВž\dg:Чб?ЦfЫejщ†дРу€ЕЭOчe’AyЏQз{;ы›ŸЏн тИzšїudфуqYOл.ШEЬаЕ@…QГбƒzї‡ЎЫѕРvxŠ 'Уvеьћі<дkYз^˜І=fСC}їuЄp%ІлhДћУ1/ˆ?Х %1ЮЊа‚l%uY‹stx›щХ—u’њјє…@ћуAC›ЎаvІdrЉЎЧPxœ2.WШЄJY}|rsЄоиjG—EМДЄbџ ŠdЋyyq‹…mB/Ћ‚CЋёјЧЇy^fєeKЫъњВжŒz(А e †Юj5}Gœю4^9#F§XЋu™†зѓ|?t уЧeаДFМbХj?ъћqu*§XГм‘н|u§ З7 Г)bьЬШ=‡:…ЎШЉТbUд/ШћујŽ.АЌS“2Бž?ё§з№ž‚'O)9"'.КоьюwВ\жЗЇ9ЉPБg–'Ў2hаЂтaoВ(ЌЊе˜# ­Ы,љ“ь7йђпsDkб~<ŸжTУЖ]w‘ŽйrІAІЬЩф%j ™*.Ћ:}šсpm~=јrt5Н0›еЦхЁЮХЋош’4QА5[л ^Шv уGoAсR4;ž;"ївсmБэKbы[?[ЬzVeTЅ:KѕяOП}м>МjsJP{ВZ5ецuНВќKЭъ›ѓјж˜yЉŠєЃЉ4YŒfјIЃAЖ'lј>’ŠŸ{жјŸ‘ЅЊъHSUЙХ †ЃQѓdgч[Ѓе[Е%ЎъX’рЉl§yЩ‡ZЕae–"ќ4ВЈъv€mнхJэ–uюБЈO‘HЮАЌ8$ЛFеuhŠaЈсљц‡цp0щhŽЄј^ќѕе* o†pмвс5ўчё!9YRнЌZ=ж–Hжгу_ћГ\U4Dц2„"FЂЉЛНГСˆ16ЊЙOPЋХМ†"jUы6ьIЃpЙ,}C~LІюXPCD@д™?QвЇњgћБЩt}‚8й4А ‰н]1Ьх”ЂKI‚wэи‰–%yx5NЇx“бЏ№:№ѓ(0m^ рљжєЛЗУ^I]Ѓ“ЌкrdKcKeЦуыKža#c:ЭIoБЎ{V7eШ™j-t…АŠЂёЫGпјЏdхЯ^PАEЄ#ƒ*qІ§O>­œ,6ы“ ьЌ–‘СQЃлН“EЉˆcŠЮƒ„Юљїю%кё>3Tцв–ЦэFЃ5рU+Ьсе/€ )hnŠsщДž0Ют(L0Щ||Њoй“PW{ѓКкгщQїыЛЏНmDSШЋЇ ЖщV*hе+›x";]К2гoœŸ\еє_з~Ъу‘%Cщ2MЃЏEрACѕЉЭk@ЃUhќЛƒђ"qez4ИљŒB[Q’%ЃЉVL6Л>ў Їюпыг"ЦсGІuqохUУљ™ўз’4;J‚Щdј№Хs f–3Cћ#~„Ђ$ѕЭ‰Ь‘XšЗП GŒ„ЁЃ№ ЭлХЊy‰f[c!Tњўy …Ё" Џ/С~4UџМаœІлžы€Д8>‡ёJр9$aWжC'ҘЉц—jФу ^І5УюѓЊe‚7Ю“Ш’Бvž™эЎ}е‹?гХћ%ЉпъІs”’(ёxм.ИФiеБ}AРgЪТeЈб`аЛќвЂF‚,r = )ZKkk\дU‚№6†›-а&—eфРћП@\љОњ"~ЪB=8СРsв„€эр4‰8$c“oТН^ыьЈCQ 'E aЭЌ$О$$B‚˜:Њ(Hš^ jшЊMэ%QGј]jDСž@l–Œ ~вŸѕ!tѕСюaСR&ŽюЯк &Ѓ~Ппit)šЧSыUW‰A›"+Ј^†gЊEšDžmЊђ #§ѕЦ,Х—и ї[k•8Aў>ѕЪMЁ "6GЃaчцђтЊ5bX%РЪxG@ЎђЇуE№qй4žи–ЁcWўЅQ)ФYаuM7L/šЮыФсщЯ?W‘Е#”yA1УiьЊ,Э ю;§Л‹ГЫћў˜a$ я—зКБ\=œPтс=5 ’QЈ 5E~9`БеъА"l№$DŒ…"IBўФ…,0c­\žUМ8™ЈCнŸ^6zЊJЬY4Ћ8јАL4ŽЂ8AТ&ЏЄA№^HЖCСVЬIV‘ZЃg˜œмїё ™'ј„ѓEіуЏY вЃa@Ы ЧT^™А ‰onE3Ьѕаџќ“T0P#>сй№ђ!QљQg›­КШ0н/Лgэс˜KdМт‡сž иB“ Nшпмv(QГ]ый“џpVВcбˆ—]~|Њ’ šF?§I*ЇЇ™OИ9`ѕ…c™ющЗ›ЮёбhNёrФб?ўљ№=ŒЯB]f;їНЭ‰яЈђKCВ2`*)8й JиуПС6ž&Ћ~Šђ'ь7ъi;зi akОъўыeГ;Qр$y3Aœс‡КЫYK™˜rЭ\(-H`наЗдwcЈЛ№мݘЄегџњлпžpкžtNjвС‹‰tѓ~[Э яoŽ/cšЗ.Y ы‹:ћ~x\dЎnAЮѕА№UОзa$#№mѕe@чўг‚Тм}?Lg Uцi,Х*ЦdКxDЧ‡ё|i"?Мo ЧубеСщй=MЃљZ!Тk`~„Y4ИtјМ<Џ'рs"эУF; ЯёхП9е№ЈATl–EлiV27Ь—ўэ‰tq [˜^ЇзыwЮO/zАЫВNП?>’gВЌRKfœ•<>fЖШ‚N\Cr6Ив Ÿ-х4t Ќ†‹šх@ФНўIBц!ТёŒ†Cpeэ‹ЂЄЩD„†&УgЫЊHl…яДy3ЌBЫА\п3eщ%‘6џZCPЄ,œ№‚p Œz di`;ўtIм иbюрјЫ OпЕNДТ8Šcт:@9Р~чE!S\vEoБœЦ~NlхW9ѓšсEž)=Фevиш š„Pјq…хжш3:'L`л=4ˆѓЎ(NС{IBi|yКJ_МbЭВЛ$\§Й—‡ўЧkЈъ†Ѓ‹ьpˆщ^уU_E<ъ$ТД"5 IŒcанP%žiu0ё†,‹aЯ)0$-чfRr7№ьФpK|†/WўZАеšТBЖ9Є†№‚рџb6ЭJв™Dy˜—)”ež)ё4|L†fшQЏеgмjе0˜—yИІ.ѓЭW- ўКЬ№тн/№п+Аєp0„œYP—oЛZЅўлŸА) ]p} єyЛ?шЖšІƒUzЪ№дšФu^5DЋ€я]љxШПz(4!Ж`ЭѕёMѕ€~М5ь4ЈAЂ­ђр Ю;}ŒˆЌфє "аVОƒ/­WMбšци2P ^іп­оохш&ЙФoкAœ• Ьїp#‰žЇž­ЫѕоЁчD@9Сkx˜чёФЫu`ЇйжЋžь$`/ОџЫЂёФKцЛ8Ё€R{^)љѓѓdLXKпTёRh=ТN–Єa>ђ BЖлдEКѕŠRа…rљZџhёЊІыі‡<^ЫsƒДљ‰”X1цˆH$q,< №гFguу~M]M`xYƒR…’юЗЃ§0єйѓЇhšˆ?ЉУxХЭM—ЕJїёPјЂо2 фPІŠї{4Ч‡НіH№р{Б§MмX=Jд'3„:ЫBзvУт=чNQ<а^Žю7я‡‚•.Pш&iеџvѕн qV" НƒP<Ю Џ‡$ SњTт8o>„rИZЬ&?uІљ‚K0l?Nт8Аu‘а ь@EЎЫ†gpШAѓѓyiЋџ:тЛџД†ŠщиŽeAо­EkўМдЙQћŽќыˆЅ‘БЫin2ЫЬ_SќШb{|Е@-СˆЊPх!н&‹ї›Dhs2MЌч]њЕЋл ОчУCМ›эiнP!ЙK‹zpі/aыћЧ‹QЬpЂЋџйMєYХБ№чоЖљЇ-AбЁXџџ›а&/оЫ}ЙEs’ќпјуў№џжmўН~ЏпыїњН~ЏпыїњН~ЏпыїњН~ЏпыїњН~ЏпыїњН~ЏпыїњН~ЏпыїњН~Џпыїњz1ЊўпM{ќпК:š)9лѓ№тщПZ˜џЩъSЏ^QЎ3qЕ;ђ]ыч‘~ѕbtл1”х%q”"UXdkџ1Э†PPCjј+n9§Фт,Я&:#Л–#Ъq`§… аОеMгЖTqќТ—•f1ЎŸхБ+вZPTљФv'~р~ЧpoпžМт'“(KBЯ–эџKn–=gѕhvјЊmzIQF:ХXYЋ‚Јиb=vwuг,/šЮЊд7xF2]ч_Ј№УaЋ'ъІAпЌ ­r_ЩaЩTПпЇXiОzuћъеѕP7№†П•.Й'qЦ$ 'цПhrЄеW\збWc'ЬЋЬтe–;;іћНЛЃWЏСЇОяšВЈ…ѓ‡*s /ЮГа§зLЪТлл—=dИЛ`НЄЊЧ Ыrx–Ё№TћєеЋWCxyњnP< твŽeОхŸЎйCфBђЭqWpГЬЖщГЖфѓ2‹ЇШf;}ЧPDpяЭ0#ш]ЙгOVOЇo_Cy™ЯЯ.^бь0ёTЊ':IИzя^šЄ5dїЌЊRЯДLE?FцнйwЈXZqІгц лKЂLќŸз@ярЇ‰#єК’—V™яj#кŠЫВЛТˆф Мв&q5/т ЮТa>/п`=J2hк?сY”Њ›nфЉЫu†š—•ГЬwФ‘2ЩЋ}3БљNB`ыеЋsођІѓ|bІ‰РYUЂгнЦM‹З,?ŸgŽіO2ШЎDHиЫYjБнтф fъiŒ8!—U•Gx…’ Рх]вЊ–E`’ЯЫ*р[ЭvЋЯы–›Э3KQвѓЙЎŸП(ЄQ‹‹ !Ч”ь eй*DC†Ÿјl- ъ16l0аYтN4[.—UЄ ТмsЊЭg6ЯЩ†ёcPБЯXэ>Ќ1vX<.#C`3F€Ф"™јi‰ `gК Ъ`Јx'ME Ћe•ХA˜ф’"†?Б5–R‚ržк`­§кЩq4EyYеƒъЖMU/#ИЬˆЃ_вi †М$J"ЄїV')!Ыfpž:Ь"GUэЈDP1Ф,ЇгtъrУ Ÿ­пО|uЋXxЫвїС#І/adžснsPr;Ъk,й2аф_чEhUзa|wtxAЉ>Ђ›ЅžхЦЂ IБ‘}Ј ‘ERdњwЇћЏЎР1ч ЇеЂ*€… mЯІО-Бš„aЫEf=—ЃћKбm„Л_эщЋЮЁ.’ ЪBbЅƒLgyљЖТ6/Ž?ОКС7"Г:Сџ+ ЩfйФ‘‡,ИN IЋТ§uB _ВЎ)Ѓ‹ЃОц,žЫyžfЖf ЬT3PRqxyИїюе gћa\ †)!BЉ№въ|–G6Иђ>Э ь€5§Ђš<э9‹Wэ p-U‘КХЊБ,1bвЭrBЂS”yl+ЃЋƒw;Џ.ВЊщ~QУKМMTъдГ5ЊGБcЊпьЪnZПLЇ{ВюE`јІІа‘lЯШХYЄAцТГLИ|bШDuБЙћюU[а нŒч5`uMБXi‚Г”ev4ЂXХЭ—1фрcіWЄOC…АКЖІ№CVv*BF„AЩ ЏC‘xЊБџс ЏHІГˆ€\тЗO=MтDУ„Џ‚Є9№™"™сљч€Aџћ5P47Iгаеdј™jИ@x‘H)ј-BВ”ƒ;3™nЋлЙ?ћќщ‡Ь5ˆn_Ѓтэq„BГ^P Ч1uг ВСи„GЂШ/­)Шf„Јч–*IЊ["м\§XœГ‚ht^L}‰ъvЛ­ГнН;оŽР—8^\œІ’3ЭS„шmQІШKД€ђ!ŒBпЄŸžўя#Ћn:MCТpЄEMЧvИBoFFЭЙ$1Эѓкvm•c%;G„4L+DqЫlžVLdœUM—hLCS’^tЋ;cnиКIž#оТы<ж”\„mЄЬАGSLWФƒЁgiBыЌ)ˆќxФ!(ШъC{І˜Л<ЈT Мг7›ЦЉМоецQфhјŠRgЁчyЬU•"šj4фи–щxуРR_їЏ‚ І†™tъМ L)‚цf шГBТ, ё†М$͘дmQ@ŠxŽfY4‰?УœјƒХ :vVУОOKbŠ‘сZJчыиtь7­ВЅя!ццВєm/%ФzЫуeъ#!р‹с5Adќ˜0ІXAвƒ<ЃД|X.VМx‘Cущ4rхё`$]—К_ПЌ 2czЎmLWp2ф‚™Wи‰EЌ@Ќ1Л-‹,Ž<§Ѕ КxIжuУаdnH‰ЊсчyЇ3‚*NшѕРЦ`ŸCЯOВ40HKU‡|К{гэAš-А4ЧЖю8#"H5СхrNvр!іgбФѕ&ыe`‚A:М ’šїIѕт8NВjEE†XR бEцjЦФ‡"лСЛЭ"зMё†Ѓ/ЮЏз_O†’3#Э’`˜”хЧ/ШЎ9нЂР3D„шяі†­oWc‘<шЮuЃ}qysгŽбLцШ%Кb9šзlёв 5.Џ-HЃ8ёчCŒ( tR"8tlŠ<Я ’‰„hі‹%AVš•E9Œ\•ЇКїwwЭоА}qЧ№ј^‰ЇЙбэmГE! .nѕУгТВжёПˆL‰#~+C( FƒŸoNо#+ƒa{qŠtE`iš ўЊЊjФљGv‹}Ѓ0Jу‰Цг­ууыЫВtГС‰:В.K’8jм6{4>HwЁŠyzZжlP„ Š/џE'Ьnу—€ў 8QF&'›@и/ёdўјD@‚‘ЅN”gх4MГPу™ољi‹f!1н{FPОF’Ѕсѕѕ=В (HG9ЋЙOЋeаУ_œBёљ†"a‡јЇWЃ7d8єbšq›kрvќС D#A !-O}*‘џНяZŒ#9Жфoь ‚$€№Ібо”їОК\—o pіы7"Ћ9WWЋНЋІ‘єР”†CrtVVdФ‰ШШsююˆкВ!p­{Š“ežуEQh}ЙnДbG3Ќ ˜КYŒ, тљВ$ЃQшс­>ћЃѕPцУcЋGѓ‚ !uъx)…„/,с?сއšРš pІvТ>оа‚,В4УУЄЯяЛ}е(MЫK'DybIК?Ы}ЫЉЪВ,TДѕ‡цм@NTЛНG[я0№ЉN”Яа7“@8џК@‰„Ь‘! Ь гЃž–Ь2дѕ9L}Шцљ}›’Y5L‹<їгзyЅ˜Gр$^рXŽуhŠъГЂЊЫђ@& ;žязЎO?}ОlУŸнЫ‘њQщdёuV tNа_т(ШžPxdr 5h‚ЕеdЅњэЛѓЫ ,ZгЌa˜•“ё œZFъЊ"OˆТА Э0(.эx?vц ŸЊk8nЋёPkіHдс˜˜Q !т—Шп,q­л6ш-9/№`§ВnxЩШ~ Є№ B % №ЂШ$M‹f6ЏhЄЯ3T:Dѕ$ƒo_нвЂ$ЩPfЉnчсуў‡{^2}п–DЎ{ѓсшфІЏ^Ев –аPЌz65ЂƒO!J•C€bљШ”~„uŸ’T'AЕh0f LПнсдИ’sСIaHСmЎлЂfYhI,иfчь№У-'Y8€Ёz_>œ^>t)VдGHq3yz‚яŸzbЗ 6lЙAEЃ8NСкf…ЏЫќї:еmБВюe“qžV BhŠггi% €€‰D–ёdЄ МhŒђ,Њ<У0 №h8|„2иiш:Ž_ЎRьРRiЅ)I„fˆ77hд;нЛ{Ÿ)QqF[ёXМАжДƒЌ›˜’Мr/™Ь&фј†aко(G`‹#ж“CЉ6ЏТ–wBд‡iUЇй‚hТb($šЈх7Qл<ѓeКзИЏЕ[ЗŸоn~ъƒ‹ДЂb ю€CЉR;Ъ№ыАь;}Њ”3Г\тSCУm?|’ИVХяb*o‹ВkK\ЃNCЈBЬрgDН`\N—*a˜Я№e%>ƒa&uљnНнщњЇяЖі,ј]#*ђР$rb"RJЄfODSЅ’,Њuі“РyЙ„sю{0%Ъ^ ёƒzі-ѓТ‚нкйўdЯ№Яјцm­Y?ЛЛ§‰%Ы15u˜!99:ЛŒyПЛЛѓ^F—GDhPюДRв˜0№ЭяjzР&uUЃОКыўg1ЏЏЫ+&Вђц•каt)ЁTфЙњ~kеI[ХИrТElіoŽ?_|~џюsk$ЂlЧc C(‹'~икGtfxЄX иNЇKAлВЬ"6!fn’й}їО‹ikœци$ц ЫёL&О}этQѓRyrьёНf‡–CJ0pчe.oтюь\‡S‚LЇпьЖ4/и–Љ+€xј8РWЅЏкмf`™Y<}wi2 Югw7Ђj9о(Ы‰Ў'Ь# Ў7Жa*›лЛokс„Ьœф_IшQВTІ$ к—0%XъWЭДœ,"Gм˜ТРк˜а)DгыyђvЫZYјГиŽЁzэ‡[Рєнv§ц`ї`ЊљWN4HaтiмЖKНЛѓЖ•L—КЄ№bDЋўЦК€ УЄwЗїЙŽІDsА’Ђ†Йт0У•Фзк0iР+kJSзЃ6QћіІжl7.Юj ЯЩ^‚ХћЂQ5ŽзЗ67З7ЗЗЗо r€ЫYчХЗѓЮВс ИЦMp5{Л_HЋа>'ияФIВ„BS0Шцa:IеMsхИКy”%Ђ[ЭVуўтьцЁо'šи žМeА%!љЎяlmolnn€|TавЩœсWВшфсрaуѕюnТ7}TТЈdщ ™5Ђ}Vƒх8AР‰C|`eMгWя€cPHOДkЕкуъpTEY)(Єй˜G"m€ћимXпмм9з‹ъˆœ“_ˆў\RЧЏїvаЂwwЮ]" ЛLvЪШ@11\˜5€Œ˜†fЏjх[;"˜XЧ1§Ц=d}}"лЃк!Ќ.фјfт”’ЬЏсBonl€eoŸлрє`Ж9Ю›иIVРГиЫїЏЖЄ€Eё•oАт$‹=CƒЈ]_]нм\ЙМ{ь0рiež^uЁВf`^,<>J0*ЕюЫ‘мИЧ[ыІ)DѕуЦжЦЦњњкцЮЦЮЕMќЪrЪјЛlƒЛќјЌh{їеЮў ›,{кH ЭŠ}CцЈv§ъѓёбл§§ƒчwѕNПл\9udsш_т Љw1&‡Ж&3­ž6Ѕ „"nя‚iЌЏolПклyuят!h‚;ЕВ‘$ шЫћЛ[ФХМ~Э+№=†,E“D^дЌ`:šФвнzуўьфјУёХеu­еь4яVœЖЂ8ёШЇЃj† РУlйVт›ŠФSэЎ`Fйs™uЕЛpcsїѕ›зрЎ,NSиІјO–&щАsіqџѕ.М­эW7n…ХQнЯеDЌsЂbљQ`+" гЄ^ˆЧО<:ь•цмRT?E“%№ссc,(GCCbp*<І8ы4…гнЭэ7ћяоНй}зŠрСT'<ЧvЂ,h|ќ№nwgя5FУвd:ЦƒƒВˆяw;н2AsУ0АUт9dt†eEП6NКФЂФRЈ›єy•ЁЅpTETЉЗBьџIу8ЖКŸрхяПїюэоA? ћ7ЭN§њ†IF­УУЃзЛЛћ‡`дЏЎ†ЄƒГ[T'zИПkCмx^vЂtфЛ€Lmgш:6ТMзVCy]UuЃДœ=-žѓЅ€-$D&xPЌЅпм8… –хЧЗ`жoОœМнћњЃИyoџрэоG9ЇоНћ “~ѓ~{kяCz"WYІC™Ў_пєƒЗfE€Еpч*XаееВФ6И гv§Х:+AєЩ8u№zВ„ЎЉщ-И‰4 цЫіњЦцћ‹ЫO‡я^]‡ўП‡H?кћ|ўљрнЇw[[ћв0^I2Wшf­ЩЈњОх“ Єт›Рє}œљ†КЂ&Ћ Uщ†nи^J”юgeda‘г‹ЃЁТЄaAВ$ ]ЙuŽzћЌyѕсуёў[.Ї^ƒл>ућ­ƒ‹/Ÿ?ŸŸТŸw/|"ч]dhТ<_ЕYDр• ЂЭ‹§ 9ж{љ,MYэ є‘B[P*‹(0Ь_DŽeЙQŽEPQuу8ƒи‘bїk`А7{k›ыGѕлѓГOGЏnтсgА—ЋPнп=Йќrz~ўn{kуАЋУ>)‹ЊЪћˆdАgIsBˆTи“ЮАc›I ОuЕјиTzsuпhC>ЬАхЧI@DЩBSфD=$Mx`€,СyЕ?lЌЏННЛПЛћxјюXЫj[›ЏЈјёеЧЫыы›ы“W4ЯE;ЦФІвNС_јОЃЫgЈж0Jqy'• ќ˜”ƒ2wE›nёрy˜Ыƒw.šœфOБЃІ[wM`-B“Nуаw м\ПZ_п9­=<|~sx쇔fуЃх}ИОМЛППљќjs}їAЕG++%я<€IBU’d `Сx Бd'б(јЎЎфѓx№iŠдООyшrВWBлЄ3ЌЬc0mQ Ъ1њib‘-ѓЭ[ыыћWѕ›7o>мGоЩж§HоіёЊVЛxЗЕБvа/I6/6ЄR2Q~,Хž9H@-лн*фIьЈВfЙЎЙZя‡Ќ:XHХEY–•N.ЊЇт‘0dœšЮЋ aRа80eъboэхњ›ѓж§ЛНУ=ЛЭЄээз‡gз7Ч[|NYгOв„Lsѓ‘)‰2^ъЪгШїƒQVЉэйl(Œcпж5нŒ0!СГHŸгиUЙлƒЭ—Ќ}xИ9z}єї>шбхЦюЋЃгГг§ЕЭЭНйDыРo!˜5ueXнЩШ>$№/PvPЄDy5 L2!єlь ˆŒDх+і]Ы4БZGDІбw€uŒFiьH\§гюк/помяжJўbшМ_пz{rђщ§жњжњa_е=0BФ$yЧ… +ЉVbбЕJПІ“‘&ptѓь3j…Ў2gŒтvБ˜щщ&bŒѓIцY*цDWYйNАТ”IGIтЪbчlѓхЫНЫ›OoпŸŽДf mЏmО>zЗЗГРѕ„Umи]Ё*)RO“8F€Yћи’Zi‚N ёиЭћуZ—V›Е,›)іHT}lЄ­4ѕt*MїъMVB>HBKLz5†ŠФ€}Ќ­эœн|~}xјЮr9ПГЖОЖБЈцМq%j^еЭŽі„Л1йш8dpxЃ+)ФqЄЧДoO??BЦЕтmYUЃ бJB1Оg0ъёгŸЈжјќДјŠ­wАХНЁm`—Ђ ТžТb Оьхф№М’КоћуWgŸ>Нzљшєџks}mэ%цbkЏšЊfЧ$…L"4kмŠ€.TУђТ(!jфЈU8NРЁВ4'Ё ЎoЌ>$нNpЉQ •ШGN*…є;ТтAdƒ­˜ЇDˆШикўLњтђќую'N.ОўcухЫЕ5Ш6зоЩ‘К>(ЖZгШжq™Б›Э№ъ TšVM/›фŽЖZg!ЇA>EuИХŸDNЋъJG–GО‡G‚X8Њ”ДЫi‚Qяœ>6oŽvўxЇц§э52iР›[œŠ!эЪф›А5v г†Xњ.+М„./‹єMЩЩэjЉ-„DpvГЏўљLTvŸЊorо3Ю‰И$жe`№Ў“t„їꇛы7ѕѓ7›ьВQ}c XШцЦ›:&NŠ+ k9:Їѓ9УЖpuІJК*Ї˜ RНO]$РЅжАЌDХЩЏ~`Ј%‡їBђŠ‰`е ј„юАсУ“УЭ—›mяюхкKœ2,ѕњћЎЈЈš‹7C1у%јˆŠžСUгL€!фg’r5†п=‹Иbз‡ё|ѕщй…p5&=‹3r€”Д0>’Š VwГЁЎAF`nmc{g{ œмНuѕЧњкЗIS" ?#UULL`KLKАa•by$9“FД‰/ё НjЇ @кЬP 5p]wшЅеЯЌЦђрЇЌъ1yлКЈ№цнЬџПЖvЁ]§Б†& “^пњТˆŠЎ{9љŽЂЬzЦВ5lKєєi>&•jr•œHсH"Нњ Ы>фюxžЖŒтЪŠ›ЯHЁ“д”ЇеQт˜T`СР hВШЖ^Оќ' †q"\Н„G БЖyХcSР0!Y ЉЙ’н1­J bUђœшЈOMцПуЦ-ё$qtњсъЖжŒmyZUСgгЊYЂ‚:%Bю$ЫbџнкYйЕѕ?>ѓW/7з_т6жvYеzUхН‚”€IѓиоЗw7%ђ~XšЧ;ЏŽ*~GŸ Ё:uДСУC­бpл“ъs*у& %)HЇI`amYьяƒљЂAМ\ћуsЙЖ‰Пћ~Йw'H`N”UU`’'ŽI‹:94ŸTЭDDќмаЎКњнЪІh„‰ЃВ-”§U3ЬЋх˜Ž—Їи/Aц ћ АЗЌрJуayaqщѓ—§_‚ПлXs'ШŠa˜ŒgdвеnuNFЎЂ-{6ЏZЃРт,}Х\'-C”_ІUUufЄћЁ:ЮЦ$†/ $2жXћяС6аŽ77>гч№+qoxR ДRŽ/IЏчЄ:B%UQВZќ‹"‹]S[НR€ї) PСТV˜g Ђђ/y™е… RЪGи„Т€’С',ŸЎoTўт=пy†З€›СёыC№Ur[н2'MRs"ЭфnR9ЩCпГ-}uїAЩ*пЇБ"oкЩ2%е'ѓЭЋСл+ХіaX )ЉћyЛZлѕ—[єхњЫ—ТёoожxI…Е6Т ІѕEеBЬš8RŽсаЦ%ОЧл‡T@пг{еhекЭUL_ˆђ,ЭYухЙ_хњpя“s а„„F‘:ЧлыАѓ67`взьниі&Nzу TVM+ž’&`ва2&S&gЃуШаЫcoўч 21†§о;ŠuЏх(ВІЪ"еЃE—ьТъpщ@ШЇG–eBя|D,Š“^пЛWzGл›KЏЏ48у†щdГqA?ОMyBlfrLыОяu8ТT ё?@JбъЁx4+рћ ЧшIЋjв\2ЉЦ4ВБ§FhЁIУ<7w> хёѓс,4nФ;Аi№~‰­ Є“oйэ1%щ2фпƒ‹у“[ZР.РЌL†ЋЗеќЭhіАM˜ 4Ї…•Л›’и5­:о№ |Л8iіa КНƒ[-ђхЮнщ&ˆ{ЇіЕЭцxƒ'M М6H0MЂюoЎЎ№єLFЧџ#E‡с№Ќ™хQѓЧ3вS‚MœUпinƒ5ƒœWWъЫ. ~Аˆнїз,8ЗШ{7_Ѓо>ЈAЦgЪУХbR AUWŸШІЦ–ї‘FЬP§NЋеe%ХŠ 4ПџjQ—'F-AЦ†ФёVЁКŒHšЉ&ѓ2ДUYiН'Ч‰лoŽk‚љTь[ќуЩлэ7WМnЛЊ3Тš:9VW^!jН“cžщ<>4iR-ЯZ=Ж|-^PLзq=€ТЫ›ЉUсwV5i џš.І‰Ѓhтх+Ац­УЫЎтa kЃCЅwyИНО{LйNш…`ЄI‚ьтйД’ЉG„žјш3ёЪШуЭ]_6Bп^љŒЙк]—aE;NRтј‰п€ДЂZnh0*ЮžЙЅX}\шЭнwЌЅ˜г Яb‡Й9иZг…и„wєЇы/­ƒм‡X^wMFфT_b;ЗwйЖЬя[iA•ё˜IДгbљJЋюЊ%Д/’ЃˆљѓSЁ*і§+œѓЧG)Ьх“ttguЙПНзŽуtJnL’—щвЮžўК!rM<Л<мueХњЎHЃм5 N#$‡ђфPaZЙ:Ш—w0OŸž3й0>AжНѓЁЁЦ–qЁЋЋяуqbQ—ћэ јтiFpRОЩ|1$Зt0šCŠь€•Pw ъћМ‡‘T7lЎ“ ЏЏJмдbŽyуœД2•x+З|iockћшёлœ1?ШЋЊnjї/OњФgьf&MЇK‡†Ц=_’№фићmШТї_пURЗЌЈоfe•a,–Ѕпiі.чOЯ?ІЗ6vkђЈ/я/л+РDВЁHiхоЩМъ7|{ќ*ЃЈBуl{€Uќ–бкЋŽю11DrеЊ: УыfГУ#Ъш)НЛ}xЏЦx і­”9`жГIŒй6вœфЉйвBЊ~/XЂХѓ"ѕsсгЧš–c˜&љ d–­*euЛсЦ|КlЭЏcчп‚" ŒТѕš­NЇ§# uА џКi9АP•ЎђNRnZ<-гЎХзiхZНЅЄxыWК$…$,їaЭ Вcb“YYVwЭI}ƒ8Ёyх‘&‰) Z0ыТДяюq–ša%УЫH.7§ЖЬXМyZОзХ"…+)жBHО[ѕMиZTЌAеЈЈšH6HMЋ-Rэ”9dГvщžџРjWГ4/]fџ…sfпРоѓ"K'у4L'ЄпѓЏQтhDі"™љrџ-ƒ‰я,ёULАVњЭицуФї§ ЃЁљ“ю §jŠ'Xb"v1џцBўўiZѓ‡ЙИZ`_ЗЮuz"Фв N RFЋђЋ*ЈTi&œœоїEгБUя[Щ€œЭ№єДL?LŠщr?ЂчЊœRЛк,ДЊBІхс%в=Јб}Aг‡шгRLpэМКЋ5 Mџ‚’ЕЇY‘x>жoДYщ'Ќѓ ’СXŽ;t,Ы2ЩmU’dwŠБёyЙdю3$ŸШ,КЙЧнёQƒpH€@БЯШ1f>ЄH f54A’EYЕBœѕЬХГŸI.&j8TТд!‰ЂРбЌшNч<Х I,1Ш„м і„AПпm\?‚Q@|щѕкHшgdг%КчYbI‹Зѓ­hŒ<ЮcR€ŸHёЬˆ"ЯqТp4ЌMгЌaŒy&sвз Л,\”%Ў„ЋлКЊQjаЈннм5)VђБl2'gcЧ Dь^‡ХВнИL#МхbЩ+5Z§џGНE#гCQ0uAѕЧфА1ЋУиWDIїHx†Іšэ~ћсќфьК9`+Y q|Хя˜%†ФєxEwHžoP–ХŸcЯ3kH4]У›(І;Cdљ є=UаЉxЧсѕі$В$–м]]ž_пЗћ4ЧщA6!еžЩЌ/g‡" EV Мя‰MЂьOЄC[NV,dѕФшF1ŽЏU[z‘Bg)d$2МQ`Р;ЉНп?Ћw)†…7у%˜%’кЩA‹`%‘Тжk=V”А3ŠƒIџ„ш§їЃУ 2ОУ$­MUN r!ѓ‰ХSЭЧђВe›"Ы4Ž><‚1Б‚ЄкxЙgLH_*ѕ4Ъ4јЦFГнъRœЄЪт/`фябHїуФгЏ_—гEoї\•pщBяч3<'JиqзМЌС#АШвcy€=HiОЖzNxа|ЈIгИКИяpHЙІў|ЮMЄЏщ XA'•Г{ЇШ16›3ъм–8œ5о фXІ~е…fXž—u$Ÿ&Eв'ВЮѓ БL _Јћы6+ыІЁ(?}в}ящДћœlч‹?џ„I—ЁšфK$& BљAЃ1р`кtясKƒЂаOђ2v"Ђ,p–Гq–у-лвSХ~­N‹ЊiЪЯЇtц$Y‘8š‘Œ |њпр;ІЁЮГ"Ќсќщыs…'r‚дкƒAћцьђЊЭ2x!KvтъИWyДSљаАЂйѓb2”йЦ}“U‘йюmђ€tMЗšЭ΢ɘA*((Aжќ}IUGЭ‡ВРїЏ?žн№юЈjH“њхbNКхžІ|™>š˜…*aШч8~psGГœІ9IЖ0%D'‰A rЁпсэr6Rи%КЎќ,ХПЂ) ђ]МƒРїКМŠ( <кhњ\­ѕž<4[кэ}‡їfи:>+АЫt‚}њ†ТМИЬ|–šЂўr}ƒV кBMб,/$­арŸЩRУb/J—0Ц ю^|ОЈwš€цl1ЧЛ2иS[xЦi‚‹ЛцЭ$mY§EžуoGЇпУ™ pўћ-I4œ“IУVŒdˆсд ѓхХU—x№’O+ОШiнжy2 lXнGСl@wџNП“ЎKšщFШ%ююыѓliWdƒAЗ~ќтх™/rBР ц^&a„Флр‚іEG6=[Q~р|v…1ЈкmМ(^DbrpB/к’‘№_3gœ6љEЬ`Й€-Ъ$№‚dМ 6ЙšФГƒі)|‰ЛЄЙIЅœ3M]iШ3F ’=–љ—*ўррeМgъХeŽWіЃlŽ‘НcшВРмОxё8 ню€Зт І-elЩН\ЉўП|ЎvГ›^<.#фМMIйyсТЕ!xуfэ zZН/s,ћр*ў=кU;(^бm/–q8"ю>DfЯH‚Жкьѕš]СJ‘Ш)ƒw№Ыє"ўљСЈІф“4ЯБц>А—‡оаTeДћЧnЗq_ы‹цˆ–ў їи— 7Ь`уЯq†€Q!Œ[l5ђ­V§сq ƒQ#GЕk*џ>cўЏСЊ–‹'№ЃQˆФ–šMŸ і!_суfЋљиdd#Ь ьВ^э‚с/ЈЪbYY!›f,фАѓ™ЋˆдЗ(їјјЂI К—фEdЊП 5Џ8zœ9ЄМ8†­кЩ<бџ!sc hŽХЎњѓ п?Кƒ„@ђлЏКYK§З'˜]œŒƒ-wџ~‡їGG$DЙџнx{Ш<­ШŠј/ й+ŽЖЄІіweЙ6Хaоўd?А˜ј/€ѕПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧяё{ќПЧOšњOhcћЇЧ€щuЧБm§?Є•эŸ†m™Ž„Ьћ?Ѕ™эŒЊ‹ѕ–сЃQš‰Ÿ2Z/:ц0чкeьt2’ћ}^Tеo!Е›‡­;УQ1+FОЩtЂќov/mQSћ5ж г2В=йЫceаы6›эіRš§І­йІЎШzђДЧЖФЫŽ7\UЌёЇ Aы/xлrєця†rёN^xШбЋ/kiУРw4еJц‹i92u;Щbџпc&œa6WœЁgЩЗ7т0™NFКdчуUtE ‰ІZ]ѓ“Mlюз/o8гIЧ‘Ѕ4_|‡~ћъЃ/Ћ–?JЧГвUњ Ц Чг ђуЩ~IбІБЅRѕ‡‡zЛyљт^4ƒЂ,ЎA~6›=ЁGёtЇ ž{4NM‘сѕзƒЋ†Є"Б5оyнЂ‘RšЈ&ZQIјьsOхІ_ПНП9†Xф“"j”DшISmзж„.ЋУCšfXњŠњ'п1њ‚Ђ›ЎŸŽŸžF†8 7CFї<ЁjјlЗлtoЯоƒях9ЪrЈцhŠзфЪ8ŠЂа5Йž8ЬgcдП Œ_}ПЁKs(ІЉсєы,а†бд—˜*Ў™щ&„Р9Б|ЉпcyЖ{їщэЛ}UGŠIsЩ ЇАжшcRЯxc@6)'ѓrЈЏ&ПЖвxфžtюЮO/:’ПXЬsO—s4&є~ШdšЄEŒŒ9†*tЏ>ОhЩКІЋšщ'ущИЈ( Ї3˜Д#ѕ8МibиСx–к+kИџѓƒW‘eЈЧѓї›В;[ЬЇ#ла‡)ЁZEіцž}Кь0ЮJBDˆгžжФbфZнюP гННgЌd­ЊыѓOš Y–.KзОК5_Ь пvТ‚№”ЕТ“ЧC•}МИОњќщš–Ст%Ы6~‚І‘И74ЧsЭ›ІL“_ц?(Мk Р6]{р5 ДŒТ(GІAЂќCД‡Š<В~pwqёљУyO†mh„“й’{‚кшуШV%V€-Њ*Š@1Z8I•СcЃћ+b#ЋYxЯPQdОбдЉ в$ŸžMDD“9/S[ДъзчŸіялРATдрг1a|œ—Ю 2в*XІЉ)Њ5šХ2M В№ XIh$ssaжВиыKF†œ‚E6&*2D†>ЏФx]іёъЫйЧЗЛћЊ“–ЙЧтiVfi‰VRњ:УЉ†"-рAАЏд%dнјљ7ŽzŠ>LBe0X^Б ЄB#3žjщ2SЄZЬCƒtысьр}]qТ0№†^v/у`#+!„rJBБ•JП&-‘dsш ‘љЇOњQ„7{˜я‰Ђb•Oх’Ћтœ3ˆШ2•Іба‚Џс[чWУTNД3М~э[ЊЁ~>tŠ7м-НЬ И>ЂH{6њ=й?W„„еB—Eт{aBx"3д.ЕtБўљМMб4Џ‡уrЊЌсHM†У™==A№G2I˜3ьTеtУа”:ЧoПАжpTŒСžЫД$Џў(†І›&H$Ž,‰ &‚кШўvŸј' V№‚ы3’b‡Ihi€ЉЧУ.„‡ч[‡#œДYЏ74Єіѕ}в|'>јwaPk+nN”=‹ЖцтyЁ2 †C?Jv;…А$§Єт#JЂ IŠL#'п0єL˜Д;}Z?ЂмЊћ"Ч[Gў9a†Ж.ЖлC ЦаuMІQЛ??щш(їc1Ћ8:с rР)КхњQшЛЮаs~в…чО$"ч˜„а@N‹КнšцЯžА~тЌcKтeн 20jз6u№цl‡$žˆšдОМКЙ>9МT'›-љ§t›2јh”ю“‘V\гdљ'аејЁ&ЎМК> ?uСЬ”Ј—ЂIАGЧIЊ5 С‘чС5iA‘И@ЇлzЇнjмœзy}XЬ—"„РuЊ<њRыAќєЪCmђИѓТ‘y†",РИЮ‚ ’LCћ!в^0:№цбc14еkwx5\ŠР &LЖE1R…ўѕyOPpлТ зЎпя>№Š‡(В@З.N.с™YXjevчHТΘХ*ею3АYd6ŒЂЖeHйџ“~dEйŽв,‚mi8RFwY5Јpб+B|\– ЄXѕžЈЈёЎqїх§ўћš 9) U€xєуUШшqŠSР7Ьžч(Ђ3ћAшsшљA’гТ7с1ПїDІ oŽ…зу<‚I'шIЅнGXн'% гI9” ИыAžњ Cuї‡‡GwЌ`ЁFwdЩbџЎЩуCГr€šЛВ‘ЧC‘Cшp”фЈŸ‚Њ ѓи!0~o,e‰э Q‹'jЂy„ЈдЇcа= ь@ХЮiЙxО™Lžюжjѕ‹wGGWHTEщ"SoёєР:2јіЂ$EНYЌC№wQ2vЪcЬц_ƒGcПГ"Iwт{=ˆІ@0У’fqgШзMџŸ8eд3@ё,іLѕЭіЭббл3V”4;ЪЫі[ЏЯk–чЧE•ЛFјХ$Т8ЭQ.•„qЅ "Œ( п7kQ6 ‘zь@ЮЂjІэ ЂЧŒШi^Љ”ЮaвcX г@-‘Тс{fЛны7Oпю~ъёјŸh\††ФCœ„љWЧrЈщ€ћxŽ™ъiL‰>ќЇ|фъ F™я‚ MQК2WПn ШўшпM*u‹JІh‚4ЧФ +йб‚=ЖлъS `ЕѓНЭww=šт+ƒ7-/г„‚фхiF”ІDр€ЬН„ХЧЎc<§]сЂi0вјС§m‹_GгœdЂмгƒw%M̘–Ko,ф%dА4€) г§ђnwџЖля hu„ж“eDXiLЖ!жЩHЖHp5В$#‘яb1yК‚™C§{ІŒМršŸЊФ@Єє;ЭЭЉЙ&D› sd.5‹+™е2ѓ4YвŽmŸОпDiJŠ*}ГЪќЧЄAѓ оЉЕЯ!ЙŸФ.€SЖпКПМО­‡з%№`yhУЎyžюSМhDdп!ыюŒh#‹ЬSˆЌЊу€dЁяy:Ч>нŸuСPŒžzaЂ™3!њ8щХ_њwK‘ёЇY9š$PЛЋыru5Y6М8G7чкЩТf4‚ЌЌфU‰ШNКLхыЫŽ‡ЂJ%б_Cљр(а9њvџђУбyŒdŒBh3В!А&<ђSД­JСwЉU E#•,Gwj—Wm №ъ*иm`G˜Ђz+Ќ' є8ЛНвЗ—Œк`г\њєъэ7ЧљŒ‹Мн!<ЃЬб7oіŽЂlŸ|“ЮF#ImŽїР{Нк~sЭj~yŽ—N&KЕЈ”ўДїъqTiшђTЕў“IюAвLгШЯIšWўЫU'нсwi8DшЂbђJю› йЮoЖЖЗЖ/УљЛШЌ~Неы<œМк>hI’ašцхD<О=ЁпяьМjfгЩR:nў—D<ђ*H*Љ ct>/Нщd№Ј—)‹fŒXі™L—:жy>ЊяmommНЁ‰24xмS˜ЮЭЩщч‡ыњ!“!ЇЃЈ(—rЖaв’LzЉхHœ ўƒZAˆ%W‘ЯS[ЕDvy~rзюuZю[)XK%Aєз0цјѓЏЖvaв'ў@Q, ŒжщЩехйщеc—t" av†ђiЦ^ц™б‡š.ЋХDžВУ-žЧHчЋ|g5ђО9р$Т8вЇ+v„?—( ЂаZžЙg›Лл›[›Лэ‚TšШбwъДojw—WwзWLЃ(–ћђrxЙН+§Кќє—vцМRєХЏ'…dцIЙџ‡НярŠ#Kжфgь› +/фх}zяmЅЯrаЛП~#n–ІgfOял’ gЮЂЕDˆК7т oЖЅi?YФrл џ\9š7жћAq ŽKГко^ И> тУTћ>QѓњђЊеGеgb9§іqэ`яxЃбžџиЌŠg]$`,vŽеwЩАРAџ‰SnЖЛЮfX†єЛWg NѕВвзoУOУыН=рcoџрм˜“ˆџœ.еОiŽФщœЌj+Q Ѓс+xћ{Я&yI6Њўио=/мЂ-‚WЮЁЫШŠ 6yХадЭ7ЗБЄgмя(РнV§§Г3Fv0ЮTѓGšФ]<Л§Hъ•;Ћ“%МbjЊFVzd)ƒKјvwяpфpzБF‡№GbD–Gз— єЛнсА7dUн\<:4шšЁGИ‰ž ZgЎh ”HJ湑ѕЃiТНЌэз€іkЧЭИХ]bеBUќВЮжйЩ„їЛ№Њ§Нƒƒ/vYЎї~cЩ“^X{В”‡є?щж/О|H’ЊЊ›цшŒРoCKИ |мИjŒyA4cмq†ŒуŽ]ч[mogo4Ш‹aŠј4# asT9Щ>—ИnIћВWлнQ:?ЩdЏ1ў{uоШrЕзЛЊЁк+;ˆкьMц ьАyгф=ЧЕДыѕ'ŠќЦ1=FVuŒАaоїBP“AЄœS‚М 눑Ѕ$ЩдїpдЕкюNmярT!lІyFхШ0|РKН4pМЗwxXO*уЎ%nG7xf„ыszУё#&ѕoЇgW7рyŒ†›z/mа9ž‹Ћ р”щё`Lж@БМюg•хŠЩVр$…3щЈеvрsя‹šƒФcn?ЉИ'• ™з;9ЌЁŠй?Ÿ}ЛnїZ—%LРq‰CK“С7…SуЖtNв„иSРPV@ iРфŠяjРєюіЮю^mяL' 0І’zŠдEžA6@ їŸї\yK˜Юу?c%Ž€+§ЮэЗїЏžПx§цУїаэ†lѓ’хБgЂЫЦaQ”ƒYZКЊщN„›г8 š г5”iИŒћпLRDDžАŸ$VџЫ34@@—о‚€EМƒ`ї4 оi25§Нnчцќьєѓзoѕ>œ5мА_ФD%Њч`ˆe;^@жPf‘›юР*оЦ$Nе/{Ј@ ьяд(N“˜,%žЃФlžО;"VГЖєI!P7~gЅс6Рэ^92сx<ьu†“Ш!(uS@н“dПФ,90тДЂѕž д‰ЌNHJ–в8‰ЦЏQSзіŽŽїjЏкv<ТО‘ФРМsѓіу+ x€‰УcЩShJ"Xk‘рюХI`)ФО2†MУ0ћf€i Ы^ЂЗZўБ8yIj  dсф#”`:NЭыч(В{Яžьз^ЖьЉЋ(ЖcЉZz7Џо}8>8Ёўh.Њ5иїщ~†30ƒ4ВаД,Ы…‹ю{ЖКсЊФБЂXОЦюˆ \у9ч‰gЈЊсјс4˜ЂМІY\{уЯ ж;ЛЯ^>;8млyб КбŸtoЙ8lП>wxxD№ЩёMŒИЙ@T[р˜цUTЫЦНyцЮёўТsE`S$žЖ!г Xъ‡…ˆnЊ­|№Hm8†žz<ћ?#еJу5Шєюсыw/рЌп џљуЗгoj6~~№щєебб!jХƒOт–œрёФ…ƒДЋšX&’UcЋUЪЄŠЄЬ|uгr=-Ё(тњ/]м“кŸy>ХХеpМЁЎu0ШG4ЕЈѓcаzЛ/>zV;:оЛ нГузoSыУюЫг“ууgћЈ\N:vUљ‹йю!XХ‚SЊьѓЊкL|ЗšСЦLoР4Щ’Xй)іZ”(тЎ!V–ЂLGpѕХіЛкіЮібћг“УУ—/„М вqЛіьу‡ч‡ЧЛ;Л;G—B€МДkуаГ з5%dc=ЦчыЕ­И{ЊЋ›zЖ}zмЛќњэІGёrP-ОЦIP7АtгG3 5‰Ѓ(а%ътx{{{џЭщ——{ЯžмdќЋƒІѓqџ§Ї7o^?#ПП§КЇG%YT2Б›q—ЯvУ(++яv'[Ђ#–˜›ж‚+ЫГ7оО§мbEW™Яжˆœ §e,Kщ0А$Ў}В6‘ѕобСGЯљrTŸrЧЧяоМ§є˜онл§HQое]#аnD~eеnЭ*E9t“ц‰Ѓm6ЁŸ‘Tp}F7ѕЫы ;ЩŒd„1юX’ЃЦєx‰ЁаеБЇIєХСЮюіюѓw^ƒјОв›чЃiЋvјќшѕЧЗ Ѓk‡W˜T"RШї о<­p?\hа\TСІx:ш(GпЌ=W;шЦЌЈКы-2 бХЅ" T@ Шь€љЏіKдz{Яоьƒ0Д‹ў‰шžю>ѕ|owwїuWwI9Yuих,ѕ-л‹RФzФYD“€ЁШТ•pсŽцEйшЄEХI}•ЃШU4ƒЌК%Ј_$MqJNb3xЮpиИмщ=РгнксЫ—‡{{;ЇѓеP_nзіŸ]йEнё•V]P‘ y6 :ežЎЊ–$ўSеС/Щg 5'JVАKŠ3›y §YAб=p5АШ#Ц%А[v„ёF,Ї'О&ВчЈЋkG/_ьМtф‡кпнокŽ~ч№VTА0€a‚{’„€bTгЏ‚)Xж€зІє…єѕ›ц€к0o+JFКšƒ*е 7HЋ•РpЪcєDХŠ0^ЧžЫгазЁё дкЮюёлwЯkћ‚5všл;л­mУнЎэМъ+К‹5’xдqJn!РHЭі)'k>8ё1–Ѓ€Л†(#aЏЩЂЊсŽ5vвўњщj$Њ:VDmТtW”ѕщŒЌЛI[­–k@@2З†}˜:Іq;ідVekНмннйXtXлљЏХџЖГL#зЛ— œb–Gp ы$…Ї˜„г/ †™ЊBЌPх™qoРЊ%Ю†[МiIвƒd~П$1oВ\е>ц-ЃeЌ|Db=\Юз{ B];~ћўйЮЮпŽйАЛП§лo(1;П o Ђlg˜qAхњ:ЧxКѕ$№=ЧКІеbYВЄ˜гЂ˜ъfўx< УŽWЄЮqEжИ"дЋЪx‹ЂZтŽ"Š9”—(Œоƒя<џvљнИ –8l8щкюЩP-ЦИ*< М‰ФГШАѕЄˆІFФю€jљ<ѓŒMWƒ7ў‰Лј§ЎЊ6ЊИ“\ Qуя@0CёDљъуіoллŸЮ_схЛ5ъ;xвРѓ6и–3SM!9лЪ&–UА˜Иfљ‰D_Я2Й|Бˆt№N7є{ИпYАЪЊм˜ьЙВ(чUœ|ЩAРЏ@=рЈ"O}йAŸэvкў&_ІQЂkЛ‡užфЧВВB$ЉL\b#QDHЮŒ‘Ё1O5Ž™lšIьАЧрVёе d8%5[gH†ys R‰t n"}yˆТ1#ячтw8aТ6јДЯлрЅЉfˆ…ФK4UяМ$Qc‚<№Ї“Т€Bœё yЁžPŒЌЉok*р/'™–ut#хUмŽ@‰@SРі6оШX3Н§•џ&eе8-o;`•ьk иЉ$щќ‰ыLтВ:ф*ѕџLžИІy+›M]ъtzA‹IЎdNlŠ4 мE ЎИвнO;(Шєo_и+фyЕоюЮЛ>ўpBl )ВШ J"<ЯжЉ'ђќШЃ,џ*вц•*}^‹ђРзпЏCN’ЈmЕEЇ№›0ВЅуЪ№Сз}рЌызMNUе)—Г‚ШUеOˆ4ѕ|4œˆЄћРJN-lбOЅ>CAUT]7mЫ%n4Є•ЌRв$ЂPеBыдТъЮў[єШС,юьПЙе<Еёюљ>17xв,ж7NчР4IњЎ‰­Bщˆt\;^БТЪUTњйŠѕ8YЦ7-‰ќЄ?сЬœ–  Е2ы:ЊEjš$t_ЂКиž_œэЉЧжПО{~@˜~uУHšb&ЋeYНCJИ0ГŒЮgj€Зrqе *FŠ266УŒ;;YЌСO(Ќ3…“˜.–ЄЈ*1Џ$юЯ]n›pVЭчЛ$N}єњsSуиWщЮХ№ХwvŸ]аŠ%ЫйнЂЪЊ“tјŒрКйМd–К:љr~3ЩžІEцkП0мЁйnЕ{§ў`8Зk˜цkРŽ]‘ѓЪ$ ЯX`#М†ћ/>|я‰.юyLB[ъ_МйџmgџУї:ЧШєЌВ&$ЮA4~юЪлНЎ_пДћ” щN”ЅŽ.n^Тєwj†Іi#…yхЎOzVрfXэ•:2=јPЋZ>ўxKщ!zb˜%MЖў ЩГОcYкХЃ’ ’y!Ђ6K\вУв“~ЇеЇ8ЩœцБmќBХёшJШІŸфЈЅЋДЄАŽјIpжЫпW…Ыг­g(я›МЎT‚: :{ѓіЈvаš~ЏЄPЄB$Б\Эп51•/ˆ<=hж[I2яџхєџNM†tЃЄыŠМE…xС5*зѓQrpЦf']Ђ!9ња’DЭ$’D6}КbуУёA=IІЈ—ыrЈuˆfŽ'vnр§ˆ`š—ѕБdОЕqнЁ6KСУт+JˆODŽgО.№Z- С‹~ЭLфw;{{G[Ъt7iІЌ”"діЇ7ЂІ1В6#}цГЕъ\Ю‹iLF4J №\яSRМЌ BИKUfBsXПЏ8љ'%žЉ=фpБ1@H™=V†b,'Иs`љїће§§jQ.IЋЭ<›таЋЉ‡;5OыШ0ифіѕEkBkY•>˜“‹;ї%ИНў„сјX*>рдс!/’Щ ЫL&іrIс xО#ѕŠ‹Џж ‡–т,8аyšЂ†ѕыўh8ш4.NЯcFˆW<ЫчЖ%}јƒFgТ)ж4McпГmCљ‰$мџšэ6нQш~бЌф–?`ъ§я+œLЇУ0œт„­№дЄї§ЊQџ~ёѕьВ5І9{м1'/ОПƒыXFšРєzД ›.€QтfI> r‚ фXЄ-ШFP‚e!&Бт НHЂс1pВ†ŽТPЃЋЗ'_О7Zэў˜aЕА х>eБ@tKТлОФvZњЮš"ђGS?(”%нv]Я ЂbW№‘uхќДLІзЁV6GcЉЩэЩЇжpŒгcD}ZА0ўCQ.№њЮїЦˆD^Mбу_ˆЂџIЧЊайr-ЭУї•ѓ…qэ_5FиqЉШpnЫ.Eƒ,С“™а@p–О…„ƒКfЎШ ћ§NЇнjuРѕC 3њъs"Nsƒ[М‰зE*Г№+кХемЈЦХѕLaO]Ѓ3›8A5м„TЁЄ)aš„]W…ЇXаняпЎЛcŠйМчПЇ.У Сж‚й–ћЛ9Кю–ЋЕЫИŒU–ъ\е{8_ааЭл1§—„щ*иƒ–пdU№x7-ЌШiжл'Š5РэЉG3єdивМ­€чћEтйNT’К‚?f‚WW7=ьщoеo†иЮ#Њf@Ђ&Є8Їн€j/RЬм/B]тЉNgЬЁcј№s+ЗАYn<ш ЩŠ—p‘…­ŽAN\тУ€у!pTыќьћїoŸ>œ5ЦиаЃZ~Vон‘БsЉcўрgј ?ъДq˜,=Ц@Vš' М ‡#SQї‹y%Ј8ш4Pyž!=ћђщ§iy6\Ќш&^ ШњfЫЛ™-АМЭюц7И­wрŽKтЃ ‘ЅРа4Уђ0ИВXdŽ<ъ,HГЇ№Ђо+СЬ€ЊЦyS ^РЩ2§T{nITГЭ™YЊq‡нƒ` +р:МЫь;h x‘ћ1а№Є‰}DKƒ5ŒkЃaс“ ч!NZD†Ђ9 и& ™іЎGR˜Л8.Rфq5УћРTE–I5:Ќ‚H‡‚W.юзAОЛеljЩ g†[IуaуВEйр оЯ]Q@їРuL ™ОlђFšиК,<Œ‡ѕgдg2gD`F[7Q5tUEYїѓ;т ЭC…gz|НѕўУїvЇy}vжЄ]LОЉЊX™^Ю ИЏзWЌgО!=кœя?Ј;œP8\ВЩЫ:‘Ч гњ0Ўя—Б>Щxpѓ~ыгз›nЏлnw'JŒc—Š)^Jp’AЃјЊдМцŒ(ВTEњKV‘й==I1зЩЏй;—ЎўўћТсшёАSџ|МuбЃXИЊ ЏЄУЉФЩЩ№_рS_—К-^}EўщœаOаHQ,Lє`ЙКћJ: NzцхЛ§­ЌQUнMfUVЉФ„WЎ ЎŠаЧщУšјуOiЈЈИšhјg† QГхняџѓ~UhьИлОН8йУН, : MdizрJ\Л/(Њ$ўЅЫа:2@Ёы\ѓ[K№­Р9(Mnдmн~џxИеФ.25 =Ќ,ђ]пїАё—0`с/^рЪ'ёiІ€”Э@<–žˆQг›ГчWXРпŠƒSЩШЬчŽћжLгддjУе№/_fХЉšŠ K\ZVвƒ‚ФaLЋ‘n?Р]ХБc\4Бд‘ЄyhЪ ю1џoлuж—ь]MГЉ! жІ$Љ€єЈСМdˆы=&’“ЬŠаuТ$4%ЊпvvиаDж-7Ъ‹Ш1TЭєТŒ ќeтР5XЌйhњнЮXДт"DЅ>DNх—ˆзuь[ ЩbтЂПZІ&ёdњBЛгˆoN“аЇЮњы@§‰pРqтŠьзKуtqw7‹S‘ФъD­>-YДЯжХŸ`ќx ЃUѓХ7Ш–ї‹и5ёžhYй гtЎБaWфc š@РЛшќм ѕУ;#N6=8ъа34љ?eAт„SpЇЊ№ЮCН—лъ?иŒ!И‘NњЎ)+ A7ЃmЂя1фІf ћ?иЗUж  №Ё†у1ЉЫ^ \эЋЬ{рbRк|”м_EДЌъЦПdЈКc–хЙŸАњWаˆЏя?dЗч=б=б=б=б=б=б=б=б=б=б=б=б=б=б=б=б§џHVг5хбњ?hIPM7p-uѓЃџЂ8jkKРMFqь™Šjќk'VћзFB=M ЧЕ…mzIY„†,ЉКђЯeƒќ“Њќв–љІaQhГCбNgБЮ БЁюG5a‹Ki뛆якЪJ фVЧfГPLДi1•z­сh8Xї5ЕšW[эЁ`XA†K]uДѕSЋЂ”Yшм 6.wиБшЄ‰6Л­Ц5|ѓ|kыІо,—ЃgЋЛeZќˆQ”›˜ Yzkkl–мjŠn’‘С2F |Љ"3сХћАЕѕ ОјŽЁљ%oШ=UqУРћї(ХžЌЉзл3˜ЫІтЇѓ"huZiшYš,€>yЙЕuЭЛq>+т‡Ях3œ*Ÿ&qјsG6&ZеLЫ”ЧœФ–оњ2А#\*ЉšqAжМ„ž! ЗЏ@|мiAњ>‹$єpcЮ<ŠОУше7љ'дІ%н }KLŒ`65…ЋйOfeLs\є~рщrїѕжРђЬѓТ(№,н№В9Ў ѓtn0R-лzќFГ?ˆ!уЕЯ:}н›ОMпŽLœPр–щ,P9I35uє~KpЃТS$—“ШVTЮВЉkЪУњ ЋћS{У}П@MQеuЫK WК=ЭХ–}в—ТМКž‡њшЖM‰’<ўК…3Q=•jwYIЕcвNЬГу›Яз’13$ ЛжђљдeнvOуЛ]ЭЩ—eь+‚ LујЯ26љЮХYНGq§ѓŽŽг,О~Щиv6V”%ІuMы~‰гeUzœ6цЄ,8MАœЯCCє$;™Я‹дwС‚ушЯ"ѕ”qыъєєЂйПН ьgGiНбЫpЦUdЁХ7„n_vВEцйЖ­Ы]Wнр%lшKŠrБJ-…щSdэю УЙЄИФЯd;7пЯ>ќrўљtє4№ e<‚йj“mу8БцњЌтЖя*з 'O0Šг’х"sБ}SАcВ.#3zГЉСG“QчъфшХч‡3яiF4žљzЕж<ЖmЎ-2†‚XŠ№ˆИЕ9 ЈЩxаku&тtjУRЉŽˆRЊчУGшкІЁJ\яќнY_вD–сДŠ8§eE–бeЁe1Э> ?Œ‘э|žXђу™uœЕ3Лэzc"љ№ЈcьiзМŒŒƒ/ШќŒCь!п>Н•вhеж9jŽsЪTЊ7š ћэЦ@tВ™'=ZwT“СOЦ§лЫЋ„Ћeш"]’MШ4Ю=ШвЉ­ /є’8!n#"уpьމЪ@& 2Яs“ЦeWђ‰"=^H  дdи§ўхVP“ЛеЬ—9бLЊБюыэCHЕ)Ž[]Šэ]\3ВІƒj›Я—w8xŒ ЋЩ<]di^QqdSПYeІ>–x4yUYŠІWŸoщЛ™ЏJz˜W+0puY‚ЫІ–8i^ЕFУf}(IВhФ8A—•xgБЋpŒ ы–ešЦtЦzž*“ы­GЎ‡Уб4=iœƒ)Яю–ѓ@S­„ЬX-й…ИЋЫэйyГзМl)и<‡CёpD}рЦи‰НH‰4г cьAS8о*bi2 xіŒL_T4Mb'лЏw5_-W™cт ъŽ$tАw5Я|ex§љЫљХч-ЭNpJЧ,В5+Цсs…+QdЊѕ@WД`žjИ[T^]wр‘ъЊHQьЈечећРгpšц•ТaћIžхS[ЂБл§§IGÂпЇХч ’ьтќФТ“)йєrВ$2v,АMхдslC|Jюе-ѕюИнчЄ˜Œъ%#…QЈcKUt'Ю@чХЃ+"з:­3ИѓU6cНъhьDЧљЙe ‚БёŠхннн"pУfИй0пУŒ§'bї2X/n‚#‚bВlХ+tјšˆ3Ч2§=A_ЮкЏ˜~ ОсдбЦ]1РЉ‰ЮqЊƒэкЋЈK6{E1(PюA_ГпњоТ}уŽЉ Ј1К#“~Њ іyj‹,'*ИЯ;&;2=]ш~xqХ^œ•ѓ807ш‰.юЛ(]‘WИеЦЗиPмCœ$žТџoіОC;Ž#й’п! ‰"Eб;Ик—їо›.ле ія7"ГЉ7ЛowчgойУЄ%D#*+2тFdцНwњ†œ №Уc8aў15й.П~%lE‹ЎіQж­ЈjЋYг–C…№ёэЅfMзVxщVrvŽ„Зы&t‚|‰1{}ЕэђРEyžМвбљ.fсџe08žщѕdліЯЖYv*фкRY(H(”0'(šВ˜ЭРюФеЧ}–Ќ0ЭВиU&§/чŠ—ЃBЛ’jЬ|jЩьМ8Ћ §‡ж]uЮxUEц™ЙBбф{Žc‚б-FTŠE„З*,~ЬЉјjЏ&Qфлъ„гUE1М p˜“Я_^}вМИл‰šmЎЈ†у<ЖI7tл Т }ZЗзј‡15ѓщйСT5LфђQ5ЏЃќqЂJЖЪ-nШЋК“”EЎ`ІЩї‘ЋHšLeqt1Nг%9ъЋ*дкW'}VТЕ ђmњЛКЎ#ŸšOЮЭMEЄГ,KD']EHBЛЙ^Є6’ЧžŸї.г)ƒD†wс"ў<Ђ•ОъЪдGВ"н л-ЁPМЦФ#Г$(C<фћŸ?ŒDIŸ3ЊaУТWE`DўЂ'К9б$. “jUšШ3 /kрšЊоХLsЈіEašZXЬЫ bjй,)2кŒђdБ+ЮДl[WЅўЇ+ƒqМfчEЙЎчи†Ю_5П†яZQAtВаЕ- Щж|{€wї†вЁXЈnert/‘lž*КlЗ9mщ№7\l–Їч}QбlS™іЭ) зAФƒeЌi†ІЉмˆ5Г5&ТЭŽ™аА!иMзdEtЁ0ЌŽкВнъŠаIe†0hюи–уCyХ.dза5uљЖ} ;фС ѓЊCq1Ып24У­V;№ПFжi”;n"]Q 7kЊHу‡ŸпП{ћђщЏП_шІ_@йиЄ M9шfVК\-ц+"=ПЮсЯБЅ ЯBoЙ‚КF–•[ЇE0XD@AnˆйЋЊ& ќАBkW;х,*<к5yЅеМMMatv|v~yќтХѓSЌЮкХЂN`9B( !чХР•љrƒ^Е&xШЗP*P№rР[ЗŽдcУД iТhэм .АUџ’ЊA@Gп кЖДЫ‹ЖG гŒIŒ?Мњ§“ЌЊр^ѕЂ+ITжeНРšrБМ"ŒВ(T„bŸEГЦј…r‰BšЂРпR. 1›!/X‚–a y#"ў5Q !й{] Ђ€I$xЛn9хщˆуaеё'ќічPРxVЯ‹РqЃjAdJ–шг˜V №­UeѕbCШ•7Ћ*Т%Џм-6Э8sдё—г ‡iQДвRUВ№‰Vтš(№A9”ЊZЭc™х%AQ$сЫ“Ч/Ю–e+ЄUWeKTŒЈарх[ЈЕUЛквЫ+вєе SсІЗВ™еЭЌ‰ ўђфМ?ž"E˜b%sЊќFѕoˆ<ѓjIFˆ6ьjQИВ Съ‡ЃЃwpNŽWЂвНSІ2Ѕ›ыэњ›ZzЦ_Фf,Udf&З›iйАЂК8›вУЉ zеŠЪ)oШoЈ6ˆ*ПD’МњхМLТ( eњцЩЃЯHDЄІЫѕNч“ Ѓ‹ЌА БUyЎQk•L q:š0;о ~ш–dиjЦj™ьA(КпАБкЩ#mзьЊvIќF‡ћ>u•gЁ*_П{ў pрzь+YRтLыхМ]!KљЎТ%дВˆdК<Œ7э\В€ЇРњ+ЉQЙ—ѕВЋJœљыэNќš*Ž­ЊФ7TE˜ #FPMЫ5…oФ ЕšvPfX?m]ЂКЦ #Њ$С‚"ъЬsыьDiзhЦ Pq‘&YXŠ<јѓѓŸŸdн›(ЊH!Аo?…% FSљMЂgЕйЖ‘Ѕ$Т2Мj:A№œjџхбWЋиЁ6$r=ыѕпЊ}DѕІ•ˆVвŸO^iK”вDɘRя*вх‹gO>ЩxhЅЉ 6яœcБl0qГЙоIэaЧѕІ E’0K їДЪ<лОq^dРjtы„пQIrIЉžrGd]хшзУУбеš(Нз™!*PŸЪмёѓgO?ЫV”%q7DИВd^>=M–D— Дmˆšхz1 L№нФЦŠAВ ћцT‚† ЖŽƒѕ7 +*ZВуCд.IƒХС‹обссуў‚<ЧЂёyј>™П|§ђХГžАЭЕ ї—иЯŸ=<ЪШ–ћЧ_Ž?Нћд zX‘;(]ЋН<8::јœoVЄЗM“тND”J]vЈ‘Ж\–Бяz”Аѕ&уЭЧп_Мћќсн‡'—Œ„•ДЂ*бОџ’ЈВЏ ІШП><:x2ЉiЌ†ЕйЬцјђтјјќѓgЕьPBvIЖНї?&kT€!ію$ЕСCцˆ~ѓFZз‘ ХЈчиЗошMxI„њmpйgЕ€ŠЏб{м†ЋХЇр_Ш 6„пРглˆєОœ.ФšІ_Ѓ“GЕШ.9ЭЎ№_]•†žƒк(PƒЙ€4ьЃмЊР †#e\ИбрјЭЫЩЮц ВЯВ bˆэ\§ L>xx№№‹щ…ЈгHјўйgеЋгРWŠбу}№џGпEЫхN†i'_'Ў‰ yСЇ Ъ)Œ лЮ-Ž ]‚+Ѓl7TгŠ,АУ“ВƒДџD%“инvі 0ј­9IIг…"/VЙ!j)ZL%Џч]#?пƒчƒXsšЏ–Жь„)ЛТƒШ.LGЃЩttqr|ЩˆbџtЂкŽwу˜7еА] Й"'ЖЕT‘•uЈЖ["†I5чmј~ј№№с“I A%`Сх[bCО=|Бу№ш}Емg’Gи)3žLЇЧВгбљћчO_!Їп8#rxР Y_“Р'ŒѕюjA™[#АИ‚_7ъo{їСЋ><:PЯzŽ›rЄњBјDїјчГщSxВУG‡GGŸSLO\HєЎ}M]Їœˆ­ЬѕугЉрЎ>y""L„ƒ3цO\ЎИŸВЈп‡ ”BБyfЊ2@%вг~~ѕњ§Ч'—7.њКVŸъ2 \ЧвбЉЁД7Уъ›gЉшІЩіЂ=ѕˆЬѕМЅщЈЮŒbщЭ<=ƒWБ1њш№]H№јš уI€,РЯ‡вЛЬє 9М}ѓс’ao|dO4ьДР^хdгššщ'5YUMƒbт`yUжњ‹НУ§§} ћG;Ћбpb3ўW“нУх AњшщД]"d$т”t`+Ш4MM'ЧЃІчпО~§Б/ЉК*нp!ъІ‹‡в ~Ї†ъ>еѓ†тќЊЎ*ю˜Я›ВЮ.Р4ЃУ“ГЈ%Ї>Ји8ъЛз џчCŒ‡ш!Ÿ’ѕN$<оcQ Šs‘CФ&§^ЏwvЩШ†эи7%Ж7ЬАY“нЋES—Г,E!(‚"КІ„EO>РTз­ћцІ,л{2ˆЊЛњ((MVj4yћчбсsuЕ&E.гІФДцх|бЄЖ*Cоє/‡М €)]Н&—БegнšъЎwy%dV8ЯEY”ЭcBќІ`~%9=`oяљ4ЉыšК5Ж ћќvЎq0lƒz•й.ъY(^˜WШ&е2АЫX1ЙИђФѓnVЛp–“ЗѓКЦЩ%’8dЛ‚aЌ*˜FpŽХ‚Иих>:РЉЦзПї№х4С ќZ]ебХГЇO!Ж<Lzt№‡Нн, ‡€^ЄQФiž5ЖЈOЎысcЬPExQ7<к$кn’F>6Ќ–DХщ”р68˜ƒZЫЄFч›f6§ œЬ>$Vџ>Œы^z1+ЊјђзУgСfј*ф№гrCыРUsXтžЃЦ’6}jЁ8ЉПЎ6•CїрlЫqLЫrќЗq/ћћIkњС<Є‰ ­ЊŒзd!Ђ<м№ŒЭsл МА(˜п>љѕpЭ~ИџLТ6Ѓг`І}Я‹ŠfљMw•J˜MKRГз[КeЁф ‘OžеиuМЂjП+R4h‘ь‘МЯžюгЉ>"+ђЕYjSA +ѓхосЏ№g{ј<?†вд!/jй–)”V%qИсДЁ‚ИWWTkvГ.\ы†бЃЯIЬd ЩДl/ž• ЎХЭЗнNќ™‰8бuЬМ>илА‡iqяСУНЃae]є™$?yxјлу§НН=’5_ŒfTћ"[№ќfX6ЄlбХѓxЏ`єMгXрІНONЧ’… Є\|гЪХ$†љгBгbpЋ"Нщƒ$˜‡0ЋМЫтў73л{ќ\цX Iќв.I&Eiд№#њѕKкˆB%ЃPRяыџјzНЉƒ›К‡Рд/?П}{&šЈ ŽнhкёРї‹њ_$‹CxЋЋФхп€е{`ѕўў§ћПќj“cy6AG>8:€wF?=u0КУеЛ\P§0bњ‘Ц6лšHWЃ~(ЌŸ*ђьй,BЌtLM‡Чч<|Љжd{uЕке"Є$Цзdž9|іlFыРшƒBњb&_РŸ@VЁйђХ8ЈИzzmI$НЉЬ)•J&нШЋэ‚шдБgп~Ј–—ІЎЉIмx"ŠNл5љp шhОi|ь BЙ”KВп‰-</ZzЁLРѕ_зЁc Ÿрr{pч{яўСХƒƒїс1ібЅоВVP6-dKx7QЩ™ ќ/—v­Эv р Ъ ~<тЄ дшvPуY4ŒЖе+€Є€^Ў›eиЗ"o~~UBЅи–№ŠЬ1иxtdъж‡_ЂЋ ‡@0ќЂкAƒ‘/IP$’ќИўжuпЌЫаT%fм?юM%хfˆZБНдљЫІ,ЊfA`Ф‡а ˆ/ЏАT‚ŸˆыjцXъё!.;˜йC№рћSњу—}œv’oіŸ\Z~ŠŠщ О)ЬJфСЄбN:ѕaз)ГНOgƒБЄCYz#Ћ9 Џќр;ЛОІЇЄЎQ“o –P-[ŒБ]KјhbYzџз}0yoяtˆ_ўPLій§Нd@№ићml915ПЅСўё’zЦЎ1†S> …Пќ№Ё/т!Ўр†ЈkгjqEФ[žтЦЩЎшKв/$рГKBй;§—моƒ_мППwџ)kŸмпGŸ†ЈVП`,3ФПп’„6ЧиuvMНu АšЛ<H(‘]7МH7&кѓщ ЃЩ ‰Э–*ИгfXхXy#ц]И–!М'њўУC№ˆћ‡—жшdєћдц‡яEл  ‚k4ЄАHЮCюv0№CW3[–WэАшšє†q\С№šЭпкмWWЛ“–ЛЅО$е" КMтй†ќхунўу'!ŠьыУG{€D`кбш'=Эv‚ПЉ#Х9 О"ЋЁcеDŽnHK›Eо\z|(‹’ъфЬnNlЎHкZ“УЅДGF’њЖЅ="ўq€Htoџ‹>:‚и‡сWтѓ фX/Y`Є$р–Є’Ѕ–$шбЯ]6Г4ЄГ\U. џнtpœЈк6‘—№*WЄО;|@ЎЌЄkƒ…РМ№-г<…Lђз"јЩсuјј>M7ТїўфP„9&5€i)ЄІ~†0iKbН^€ЉkлEцmŽ"L8Щ лЭМ€gO šЙ6tЛhЙћt˜02keр˜zџйў>Э‡м?<еЦO~СФOШу-o„К“ ЛЫˆŽ„gВZШЫЄЇ‹(vкtxмЭ/GeЭ+ж‹YьщŠfzYK7Зh€"›U˜аБжu3з6•СŸG{$CРјхшТ?НYœјЧс{ЗJвŒЄНеЎ[гі нЎУі )bШё<Ѕсо|џ“5œVp`ŒЯЮ†Ђдd3ь1“•HЇš4ѕКдu eќс)Yxhі/‡=“}Nр?ќ§Ѓу–| і$Б‡АЂяќNšЋшqи“,В4CIЃ›ЗЇU'iЪаг™Ыб”U СBК,TG— ъ],ѓ\зф>џŠ ётњЖ№њ€Ь2ў!ЮДэФ‹5˜EІ z.`MjZЊ+rЊЙ# ~šоO2M ПЌcKEХВ мqБ\ЏwIwƒЧEWЄКEЋ3ќƒџє˜bыyE,|љу1–,P…НМP?m7Д…@Жfh_’-kмЕ&mјyе}S•%n…о|sKЕ-U5/ЪKlЭ№ŠЁG6Œw[­$ЂЎШKЮ\зЕ™7‡D1HџўIHЊдœœќљdœ—"ЛœHцšFŠѕ’ЦN<§T7sВwАhЫВЌЫ$№ќлp0МbyhsU—9TŠ щ96@№x ‰иф~мrБоTчšcь#`‘јфх1ч—е,6иг?A№€Йў§RUѕd‰š${9&Ї'€AхњQ^у-nlNTЉkнђІЮXЧkэQ†ОcЪt*›ХzЗ3МЋIЌZ_-вШW/џи'ёэё›žш—ЈпйТ9X}ўќЗKЫ1gxЦtI†8ќЄ5і4ЫРдDNХkhй\­‚мђк-kлX\Zи”xNжƒ–$TЅ'zIџb}Е,—я=Ч.Т§ƒ—=б+БЊiк"PяЕџkЯœdѓuC:АрШ)"ёкHWи“у)ЏB]6№0ѓдЙэxж2Щ• vЪLРW (/wѕ=kКЁUљzѓuн ?‡о?zq&љ9д€€ф ЏхžpњђбўоЃž…ёъšFЖќпвќТVЅўŸ|Ȋ*Д\CуоіЪ/ˆгёx<Ol+XwЇЬщљјсW_З‹Tc>‚ї>zйS‚‚д‚dƒ вБ1|ѓtџс16$Wзыхš>)эБЁoЯcЊТ‹ГЫсhТH†сІ^sпљнеЁ ЈЊІiІVє6p9ЎщНRдЌSƒ{єшХЉ’TДЁNv\ TўфэгУ“2‰Ёи\гэCтифАЭrQx&žt–Ud‡§ ^HiXћпq;Qд МWЮж-)€ЦVжonmШT-Ж_Џ:XsПl~ќ‘чЄйG +мГ[-jwќюхъ›{м4V’Szˆ’к ЪМT‚4 yк;+vPwixГžи?F3-?J!aрЏŠTЕЫ]џ”ИіzеAёл„‘xДї№быiи‘цнNФ‚oщ2=eБШЋЭ–:СЌšо*Ы< }я ’ћvї#IR?Љђrtџ№ї ЛТ=;rЈ‡^#'лЮЫѕ[ŽГ№мц[ИЃ0кЖDьБ‚œО^nзeTрЕц99RЯf… IЙ‚™ЇPtѕ-.ШїьZшЛ. щGt‹&Œc˜њwмi–l7Щ`rI e?эxрќжQ FCјнЌZ<" ЁЂt•–YиŒЏš]mEКш rА\иЎpouБЋlщ#ЬCU`™яcжГ-ЫБ zфИkЖЋГ№ л~›нйoђkВ5ˆ АЋѓањcE•dг‰gФ?ф8ѕg‚БЖ›:ђќwфжWЄ „„ Љ Y‘сѕі]8Ux^дНД&EшnzЩ%iUаSФД&Xв6ШМksWЦŸоž]\В’Єу>KGЗXVєіw!hDфІЙŸdxZ˜ЂнM—љŽaкnрјпw{РjоЌ#,(Wd7•\Fм;yЄЇАІЇ.W zЖЉё$ž||ђђУй”a8-пНЂ‡Ѕщ2иЌчAЎšciTwkКYЛХXфYц|љ%'ˆŠсUkвЬЛ"TЛ‹„W4С|лр!#žѕ­-xСмљѓЏz8(Ÿ.9Б„жЂs™uMФk|-G …ѓ€WЛљЬѓn\ВlЬ0r tьYџ=6є,#ЂTRВ‚бЖ€ЖїсUoО‰ э,wgIП^OшЊ$*ša9AL  ”ъE^тЊЏCч;ИщРрlжЖHFtЕллšУТЙО&W<ШЭ`’Зы]УЉУsН† ЫiќёЭ$IЫauт^щюш5НnхŠЏ+"/jрСa:C:“ЭКђmЧг,ВнярŸ‡kЯiOуv Ю73ЎЖtвЗЄ1I"CYZХžЋВгГу)И_bФ#wE6єъЦš4IлаTx^6,/LŠЊЉ˜ўкзUЏХ~/Њцњy‹žHќ7ўЪoВoуTл NM; иr)Гииѓ (ј[ВэHkГ Б| ,…гEмˆнˆŠѓаPи /ŠпGƒG2Т:Г)Ь’8NвrО&ЗЦЏq‡€nь.шPš 2plUфNћ"ЏBy͘яwk‚ъ6$z€OЯ<ŒyЖŸтб"ZфЎfЎqФ5:РЄ)РшѕnлШ:k ЪюО:eŸиўн/‰уyŽ9>у85Ÿ“ЫM‡.‹@ѓ№Зy†qб’УфСЛЬбятВћ=FwѓLŸ…М :^З€кДCOСDГнˆхƒjуNŒrpяЈšІШЊжxKьњыпAя?"H“'ŒоМxuЪrо.ќБ-ъœХ‚G},ј,yўр[Oc.Ž?їxУg‰{ы6Э?нuсщM}њјъ§TRŒЏ Z…яZ›ЏЋШ„7Џžй ?р†ŸњcxЪyХ0Ёj/ЏWЙЏАМl‡y]ЦaоmЩ [Ь!/Лq—ЇЌ)КЂЇJiяrQЄГn{Н№UQБ“щ ХбpШ№Ъ`bХСкˆ—Р ‡y­|cд›Ššх‰cљШm‹ApY†–A З8š*Š‘”e‰$,шлUслAЕЙ^† ^ОZe–0O9€ƒ?Цf(a\l5-Tжл.qј“ГЉ Žчšš]О1{№œЁNЇБƒШƒG*–IwЁлљъ mхнo6…ЩЇ›яШрmЧO МЎКьfž~љЉЯB†жu‚D‰1ŒДo6ЫІЬb€CЬPR5ЫРšвkR­fPd™1xRуЉ"+кщВЖ‘кKф гЗ …Wœ—UUч-ŸL„PЬh*;5$ЩSщfYЇОЉ*“s/(#-›1ƒИqнњš$›A ў%:ЧЈ^еš ыћ‡ŠhЎыQš&‘Ѓ №^йщшт‚3“ЩŒЄ№Z–‘kшЊpяу9'ЫsўyЄІH'Ё‚хu'Ќз–LiФZi›кІЊ§` +.ЂмУž_ šЎŠ<3цtПкюЪХыЋuEJwБяе_њ§ѓЏ>Nд ВЪ"Б–U-; 2 кhЌGЭЬЗ §‡Ћ2L№’‘ЉqїЮсчCЕЋkШvДТ5`5фЩ6з™оН{oо|щѕЮŽO‡’гТ+˜G|EУ›Uq]ј3†(ž;жэЩn2†гЩŠеі?cЫЋЏ[rчъы_лвEvСЫзїю}pБyй™aj™gQ†Ш@kYaт[5l“XAEі WM1C‚ВаГ LLЧПdžП бqуrŽЛ(]=KГР”RP‘.ОПwЏЏъ–І№—ШоюиЕxђ,r№BЗ>™0чџ2ujДы$ШMоL! ЎЖ]o]Ц0ј 4UЕмЂЌMws№"zшZ:’JЦЈАўŸƒѕмЄюmYЊШL&МцФDыL“Xf:Ѓ> оћEІШ2AтуY ўFџKt\ўѓpмЈhц –огЫохDЖЃf}}]Y2ЯqУ/№7(WORAјЯ ВВЬТ(єуNўЗВччMл–БЇsPщ š“Ю//BєЩщ=J­лШЛдDЖЎ;P­Хx_•ў}ТrІЮъ9–Lš5ИŸB™~uНЩ Ѓ* Ё‡/ФЭ<Е4Yu’<‹<ћUї †B}ŽчP-У$[1ф€BMЪUвћ#ažWUFk^”Fљуе}ўЩА?ŒёЈн>Ђ:"ѓлйДY4сeнKЫYфZІЦQрпUWє;†‚MT@#€ўR€ћUГкB ŒзЂ­ё!”;^V)Вf!uжЭIЌ~Р`uDP`И„k<Є›рю§КЈ‚бГ"OPŸУuџ[иŒCа-д9№фxKЈЧкe V†‚ Аlx№FўЕщяŸŒ)ЫsЬx"Ng(вчќ}vŠSLt Й6ў{*ВšуњQўЃР*^˜7№МъауИ›'DчлПфБ/ќлcнџcШx:їПA`ћ9~ŽŸучј9~ŽŸучј9~ŽŸучј9~ŽŸучј9~ŽŸучј9~ŽŸучј9~ŽŸучј9~ŽŸучј9ўПSIЙЉВаПyАВDIь§KЯqЧ`az'–ЇГ,reёпЇИ“a…QdM/.КnцЋSўЯrуyXоr|зT~иНЁ[ 'ЮgyЂsjP.кH\ŽџуЈёdtviZЬВYцџЗ9N8 тjйž€ђ‰'ŒІЬГ/zƒяЦ,жyrSЯ1xCЙзГтbБl3SжТЊMM•шi˜у{})mгŸ-ёbРђ‘!L’(r!ъUШнVЉ'Вf~щйЭ#kІEdO'nОъђ€ШiГкЌцЈіЛhВ8Nђи•оМггЂ 5"СgиaБк.*ј‚6ЙрМ$‹ьнеd\p§x^њ3DХ&їeйЋV”ўЛkfžІYОяЪЧчўЌ.CЅw26<Œ‹лEъX†Ьœ|‚Мж!@јЯc€чб}А`Uљ7В“jЬїу†P"гlЄ2СА<х|šЮЊYЈ_Мя;iбЎЖы6д-ЯГ…гЉŸДЌWяющ1ўѓYNf`KЗiKœhaО$Ф/5jЪtdХЙ љD5…ž˜цH›19њхеДКПћ0Б<[•%M3XЂ›+J“‹wJиЁю†YQwЋ&њСs-X–уљЎуј9j>$žuљž…Еˆќ~ JглЁЅˆьјтУ‹go.%gEХєRтё„сrɘчQФŸOe i­лuнF §П>xнаMщƒnЛZdЎ9:‘НœJМЮщЈgIфй–.œО:‘O“4'))#NuW#СВЫ Ц Чs‚Е+C?0b$"–Ў*ќ,XU‰Ѓ ’7T7њrƒ—;зЯ&~Rфqї~˜Sї9A@К0О!cyЕ­=Ev’–NєМHЂЉ›!?ъ’ЌЪБЈќ циВŒ‚Є^]ЁбЁЪ.о—‚dшЛ™ћъšiFUx–“dq|64МюъЊ tеJšЅЋL\;ЬaЂыд‘9йА4–БЂ4›Э‘кЃŒgЇ‹-јGщ‚хЇ5ЪЭ[фмІudQQ- Џщš0…ЦѕGš;ПКZЎnF%сбncG3ЙЙm2KœВ<<кФEqrщy`ЪN‰д„mb+ЁцЈ6аЂТ^МьBЫ„q3хИџк5гRXFT„ёPvъЋыЋEю:A6GnавQ1Же`tYВРŽ?Пy!-ѕ‚аhІ ЅPr!fRСшХіњыК ;Ќ7Ыz–%­ с`uйšРKТh 95r-Š$™Е:RШшЂР_ЅkЊƒ—&2Šf]Џšи7&|HЭЬ7 7žoЏџкЮѓ4ЏБ*@ЖљШ4юО ›ЈЇ\]й~_0‹+BRг5DрБёЅAŸUМŠ*žс§TЕџyHє7 ЯѓРзŒ‡ўБi"KЕ.mП^Ѓ"нfнЄЁчї §Ю#чЌŠ„yš<:ПрѕсDОкšєЎАЙољTБГ†рЊЮ|sђњƒшХГщЪCз`G2 Ћr‘;:Ь—И—Mъ[†aBѓNл"чНѓ{Ч—ЂŽфђИ?’Ќ‚0/Q ЊХ<3˜ойX2bŒд(1”zцфј‚7|Мю‡Ž<<[^Н^­T'ŽwзDЮИƒЇг4EХЛќ‰ow—Я{—Нг{я? 1ќ7ЫNE™X нёr™jгољHд§Ђi`UeIрhЃ !§У;•цшјгчБы•T_`^э†<3„Md!B"E\y–yW2ž2ьt2<§№eOџ+N‹ Tэ ЂGfp0г‚тЄe‘žC№КЎ!ЉŒNOЯŽћ–“tT€jDBаNmixвуУ4ёіЅeшwД'‚"Љ€фйсEТˆВЬ9 2"a^QžуФфЮЯQЕ@€Ј йїЯнq”Щy4DжЂщ˜„ч5aЃќGW‹Ш˜|~sKХ­Ш!( џЙEџ|Œq<ќBX^E”Њ]ЂўХfЇЋЖncr>€З`ИžЉJ“ў`|ёёTвНаdП|ьѓ†mX–*)К“ЬЉ€о5Ё6_%–ФzУЩt2žrУ№wtЉU ;*‹й,A=A gQЗг™hBю.9вEC_0‘эѓљ„4?Бdf Aя–;ІФ+ш!XЖЃѓњъК‰јv2\YŽ$EМ“ŽЌ–ŸЬcЖ5дI*ЦфЫ+JЧЖ!’pu {Œ9ба5q№љ”“U•Л`4л&Є? WнM~*ЛЎм5aППКоtEшк:’1iJH@‚Й‹Ѕ(ш l§Br[•х6”Л^A‰эHƒЉ БBSU(Н/yХ04ОЧъvVхIœ„‚РЕe RAJй G_ЭŽќ•Рѓќ т‡iмE‡СIаuУАМ oЂŠBxяˆZ,2щw‰)ВŠЁy.Ў?UгЗUцœг­ХŠ г "…kлІ8žЩbK){ЏЈиЬ–;№ЋšХю]№•єyA_$аЃ ˆhЙнаw‹<пHО mbШ(S +ŠТ(Ц’ШT˜ž йy]•u eЎeщloъ–„И’2›Ѓvђ 5š‹,M ЃХяю:ЉКІ 6/ Я №ZnвЎQG‚ШФRІ§е"1ˆCъšФLxеђsРЬђшTЃ‹,›ЭC‘ ќ[єxAe>WнzQСїр-и&М*•_I Ž^\Uъ<>ч4нє ˆз”–œ*/гА0АЦ5;.ыТSхўIs‹ лФ3eQ‡Ч‚_*ЯjбyуЗШњvНЊbдКг#З$LF<ряC{SЫіЃ(tР(,ъX BqƒœБ”€’–‡Й ішђpžсЯъ*ѓ!œ~TtЗœ…ž­ЫКmщВ„дУfВ"’ИђЎ–x„,0гёh:eY†t; M§{6f4гŒfMЫл$Іw†‚™‘”ѕN zЕX€псьнH1тЊJ}C“dўУСpѓnQDЈљЇ{тd4fdk†\В„f{‘Cr™Œ†ƒсpЬK 2ЗЂф–ЃOЁ+ИіКE“Gžc№™Ѓ…KЂGЄбшЎruОwzrЉ@ХXFШ<Ю3/џkVTwm"ШсЕsgЧŒЬ‰œцвкW&ƒ) IВ‰вMхМЭня!vq.œ(o—‹f–Bz@PЩШ–Dш†Њ”w,цБЮ Ц’lЅMщkТdа?џєЧгпЊюЂP@‘јФ $Ќ|XЂ$RYn7Ѕ-M†ЌЂiyI^-ГоЬэ%DY%pF7DС’Ў­g)rљ-хƒ]pŒB8‹:0 аyљМђnpvжы}zёлГ UГ‚ЅN20\ž‰О‚ЦЪV% Е KA‹Ь'бел:Е ТтDјL  ѓ*OГ†(š/(S)цфnБlђЊНy›ш“‹осј X} AЧєfsxЈФwpVBzœ’SH)31†9ёvЖDэ1Г5 ’Тm'Кof8ФШl IœhVAX"Ю ХхN„ЙЛЎЄQа+ќдѓWЯ>p*4;У/$a˜Я—Š!_ќцšъu‘‰тЈs@Da`I+ќh8КИЅб’х„№іІc^< ^WЫѕпKи&…P‹ПЃdб юК&”dЋTБїњљчЧ‰В=ы‹ІЊ '›ФTЄ5Ё|]‡ъЗТлЎJЯP$nмЛЅЩю ф††<M&Уё”rц‘Ъ%Ђ"шдh4yл+ЂЖ ž"Ќ]ˆШтљѓgoЦЧpœvD=ŽЪЇ%Й%§\ЧeрEEГ"erƒДdЯ ћ—ЗГ–~XфЖЬћ§ўh2Œ9й)ˆЖUќD'*БJ•ЋбЕuъи~ Я*~yєє Љj$Qі ЫЭљЈМ dУ;mЃІn—ШНYV‘ЅђЃў˜ЁаЙU1РъьъФдdдI’јщxТыqЗІњнDУb{ЕЂВПФЂ6oЫйl2ћюсуKРЊрБfЖј[Ю™FH˜ь+ТЮ {ЕZQА‡4ПЊ0>=™JD­т6‡Šиy…ЊЛrjnRЬЁIм nВYсњ[ьДф‰Z1V EЄЩг7_шА€QŠz'+NџоРЫN–ШС—›ижa2Ž$*ЅЉоЂXфС75'­›І*0TEдcмDFœЭzз№€6Ћзд?‰ю6ъ"ОЂ0oпН8Х–$ЪoО #i”ŒІU9ІTЂ9 ЕЅ(J"/*ъU@Qz a$qwГŽ ŒS <:3TІlMКћ‹&‚Š_ЌP—~†СђѓіјэЉjХmѓJѕ#ЈbT[rgZЏvТFk(ЫeQ Ї†L“ІСmTЌV†ŒЗK<$ЁŽ.:ВzPЫ љ3‹JяѕЬ3И8гѕ|пTЕщыwЏzšМЏš%јC‡.]+›ЃШ№5•IYЏˆ\а265ЬŒPйAЦВџЩоwЖЗ‘фъъXбіиcg%+Gf6Лй9чfчФ yіп_ ŠкНї<{ЯЎœf>Ј[–lYЋQР €7O]CyИдg—7Œ ЋN”EОыz!’Њ"ы QЫ92†Sѕˆo^œ‡ЗШёдд\xY‰Ÿ\М}їvкізŠ%54u Лa,Ємc„Ž ЙiРћX(ТKyaVU‰k›њзјХ/ЫКab ЩšlуTs %сЛЌЊрьйЮ‹^Е$džMІСб—EЎј~џэЉ(HWєYCЈл‘ЖўђљѓcЭ5yŽВGЦвУD8Eе6‰oОњЊX` (€'%У­)rqT„ц0єRh8wцўгЇЛП‹-ЅofША#ђуЃw‡ЧѓF^IЯ`]Ч§ч;Oїmј!xЯЕ o…шU№–g,J,U3Œ‡_д§ёцрѓЩх€a†§ыыN0sЂ‡Э|Э5J6Љ5Їьээю8А{Ф'&Ў. \џшрєјшМЫHіЌ&ФБ Pžщ›н?Д9сVšгSВ\_ŠRv[ТВXх.œ нPLќѓсЭЛћŸONЯЯЏЎ/.oF‚‘Дф'ЗФЄ,кВˆЏŸяэюь§rЂ‚у^—БЇ/.ЏЯ/.їЄйXСј >1їwvіv^M›vNї•zЊЂРI‡О*Ё /(Кў`І”ЯŸоПп?8:=П„}ю^~јp2’rMBрлђ№xwoggwћЕ@Соь™еыоœ^і.ХŠЊATсег­эНН ˜<Ъ MˆУаЌрvТuœ с“!ФяњC“MћG$ЬЦO7g‡gАеiГ.9@юЮІ.ЃГ]ищнэЏEЄ‡т•ueЎЯ/jЕ oАmЫ:ч~л†ям}С‚O]нг…bQ'ŽFђ;ъї‘љA^e]h^ягбeoЭ€­##›Ш3œ(9>ш SЩ<ј*ЙмннЇО§МŸaНGIШJлкb:#Гž“И†0WњўЮіюіоюЙF&JТЅILa“˜пП:ƒ‡zu~rtr3циЫїŸћр’(3xV”5Эr|Яu-•ІšъфH†IЩ=ё2я>нC§xКѕ‡‚†И"урЯ?i—dѓБІЂЈќГЇ[ЛлЛOŸ~АЩ9\Ўяјл:sžщнмt‘1Ѓws}yq~№ћЛуЫѓ№ш–U4Б?KSœDiл†{юФЁЅ]ovU”г—pИр(юь„M‰›\Ь5aв„ЎY0€ПСЏ№@vїіžЦѓvqЯр ц9ЮŽ!X€‡9хЇьdм;ћєnџ№штсIпЎ„У)оM‚‡в43*(п$Њ/hBQZo7сБГ0ˆ›uѕ§]7e^QBьTўА2?н{1ЊH$AˆaсkяM‘eТ'ЁKчє`џјќтс)Н‘ЊYH"z‰LуЁY@Ё ЗrC•Ѓ*‹шd Жp?ќ6HрЏ­{E(вё+,Ж)sёр9<њ­Оh)Жn‰an*Gn+Шš Оi:М>њtд3ЃюCѕƒг /ŠѓЊžзE8д$^F‹[ЪГ‹ХХй№щіЮжі6ШДѓšIТA…kvdОп‚}йонн}Кw/hАГўбвEТ2LN(АНГ§ƒk^брь?LцБЂ[…*Ъур Р77ЬjbУšfЭ\dЅђfso{ЅооўƒKq‹Q5(Б{щщLнпТ'БЛѓєйKІ!h”њ'NДШ2n›†‰њЇЪгољчЯзhЅ5эЉjI5ƒМmW_яЄЬ"№Up&AЁЂ$&DЁг<И€M„­БЖw?Š) JъEYyЂž<п„mоƒойї Џ;ср%ЩK‚Ыд7vE–Іwuqо™-@LLщЉЊ“bљ“V‹І$<цѓ“Ћ!]ЁњfYЁўБНGDЩŸ*;И@+KgyЌžН„оУУКї‚kˆvЃ!U"-9 hњ O—Dу˜ёhg3щьѕjє.К№зт|IlNbЄTo0!ˆ–ЛЮgчzAЅМт—Лв{`ъдАЃРBž>p‰aR"IШŠDЭ‹uО 0ЁxЩ%‚Аz(їі‹~†кЅni$œќJо >‹Я…н˜§РЊB0ЈLяГыЧЈр эЋљŠ\–‘@‘фBP сСЏмRКtUY—†дtТ|БжŽ9‰ rQЉГ4Sл"тnoш[›лŸ”8N@фX§ќ }э|xЃЭ BЄЄиXЕŽщˆЕЪ­йР‘ћiѕnя2Sy`ТЗ7сGз'ЇF7eшКд4KБЄЙ МGCП*—ўёюжйhyk{ѓйMљa0sЮŸnmn’wƒ‚я„!Ю1uŠІˆrˆ­ўЩЕО@ŠЬЭx…Д‚˜ыЁxКЧ1§Ћг§ƒЫ+cЪЧЏ—„x.ЬШбMАpU2ў CЃТon>yЇFЖэEќы'јfшcийyv•7%APїЁIРЎhŽОЎт0J‘ѕйѕVЙѓађћБ€Ь ьАwzк \жЂХŠ(п'яHJэw^ФвёѓЭЭM=y>є-Эё:ЛO`ч‰Ъ џ•­Ќ­6s,ш-Щ”3пD6'vjQ>ДFyŒ…†ЊЊђИлeEI2гu–“Є$ќ'“кbuќ‘ю1ќк|[{lш‚­n=‰7Зшн}ЋBp žВ$Л%o~юІцДI/*m#ъ-3ЯzXd+шІИ†˜‹БМЈј5M1S#M^ Б=^igХL/žSEиЂrџ!ЊМХПй$€ Œєѓ#xQ’:k4n-ХLkšX,.ŒУИš/ъ M6`Д‡эДЂлY]ИК"ё,У ШыESAЋ{­FѕэШвШ7†yЕХ: ?orHІ&Ї,сКљ@і"YЗѓ%Љ5цyиg;]о‘лЪх?A% Qъ<-rOcп= 2ƒRяvTйИмAћЗЕEсѓ§I„G—8TљкO-юS„sŠЏA-tE'ќAžЈ›qЛZфŽ‚W"aЙИНчК&ьлшpЇ "?hќббн>•dх•7zчеЅaZ„@?4"kYыœ<€Ј 4Нœ‘ч;<Л>”ц‘МŸ6‹y•ЅiV-‘‹tIъ3АƒgЈар‘юЉвх а…MbЇqЗ?q’|HŒє&D№.ПїИiЋ‚ШLєšHНZ3z!]i`2f<шtQ}(‘JxуjšПЇї,KТ>O-™еh:{Р9WЅоЂЭїЧёэX?“f• гћMT*Ч›MЌок#Тg хulЉз;Нь2˜qЕиq9б№т7hn‰MZо› „{w”Ш…^khюkъјУQдjј§К/ ћЛлO№ѓ-ФS{ŸcFВ дЖУ^7дvаkђ™% “юбўхDБ‚,Бє‰QD$'‘oЩ ХЗk 2ohІgСkгУЇhлЈ†lmНъЊтў.UъMдŽчGœс—№Ÿˆ~qи,)y:|kТЄwuvХjЮЌ*‚тiX§бDсш, 1&)*Yб:% H1ЧЭ† 6аUсь9Ъ[Л eчЁ.ьТЇ№—јѕіo7Ђюfј1vФ}Ў[š8^Ў/‘їЅŽЦГ'ЈnкdЖўPРыš‘єxA`Э|БцG]нwЈ эЖЈ›*2Tёъ%њ•'xєžlю}`-љ№)˜iј’˜їCА§1щв( iHŒ|o?цфzЃЮB9gЃjQЛЪз”јІЊ[Ю[4 iQЏгX‹е§›˜з4‘€юmaiїе&ŠK”xћљoЋ'ПьmQsСуgN7­dОю<"=1uЛОЋ#)іuГ РЦ4o–‹мвОЂRЅ;•­lбф3п6-'(зVЏ,ЩF“KLоСžЭ ]э§‚а(іоЏЇВЋ_ПyF”§с/‡< ђ|‰0ХFЬ„ Ÿљђ>­G.КhŠs›eф|ЯЋšГІ‰=[ ІŠСkм;Dš!ZW Œˆ\ѕџиЅ˜щ hЧыKнЗЦћ/РрaАЕН§wкGЊ^’!‰Р†рQК шЋ06@=Џ2€ЈQш>МUБ+›aUХŽЦœŸwЦ’ъТ#%h‹bЄІ™$}šкК:ўєœ`аMzїѕЅyтйяЯiŒОЕѕlЂ[QЛЄЭR4Гжв$qѓ†цСc!/“ЊЎ§№‹"VШл2;шOUE7ЂК! lОNб’  ѕAfсЛџt“ZИЭэgo{v<гЛŸЉ‚Рzіž1эdБšW4пк …ЕV :“ћ…7zВa>М—гМ,qЄЩTвLгt’xœгXc]‚Lю0jLŒдОЁГћЛ›ёяўђі”ВдхЎ^эlЫНїћ~ЦъvN M`ЂBЯщЅmK’Уu™ХОЃ‹ьxЬы–m=xЇЧКИ ЫkŒЛARŽВ†TLЫ%MВр5Цbй†КЦ~кЃАcчх‡+ЮIŠ<Б„оС‹э'[˘^їА@‘Žо­+ЁжIXМ Щ’аGPеt=ЧyxЉЌfZŠ h–хЭRРПIbC–дb“ Йš/oчОaВябРС1м{{Ю:)Zуд—;^bxkчuЧŽ[ЌвD}"№PлЎ/Ц№ц)ЃаТРЕmѓС2oLd‘ХrgHYЅžЁˆ‚Еї0„юНzОm=ЧП†@qїеёиР~†ЂЎsП|ž"ё7]8ЫГр%Щ‰бh“!ЬД%Ч\JЭfži_е?2uЫKђо}ш‹MeЏ^ЌƒКѕ +VіgјzЗtяЗ#Цˆ•D‡=§ LсіоŒс4“#GЮ0‰[аU‰‡С{^“rЎц~mу+ЇLuУт,‹ТјІ/ТNЏHhyя 1/ЄЬќю+’8}КQеўJ,ЩsљГз;OŒˆГАІ[ѓ5tYД4Ќ/CCц™Љbњ1Іf—`b@шЏзЃ†c[RщN™сp"iNЙМКHж†81ŒH›вЛўѓu/>3^AB^LЈТІЁxљћоіжяjž–XсM‰ЖˆщlъийЫЃ.+ШКƒ5-€RзўЪю3ед-@љx0шіF р^NЁYw’hТыmьI(ьЮЋнн­НwЇœЯiјˆшt46К~й=ђЄ%eщмa2Ф„mщ*BџУЋV4Ьђ‚S ѓы 9M–yv<–іQ7 пIZ6‹u•ёх  кищџВНѓє}з,(’Ѓј[“лЃЃw]ˆ'ДФƒ„р-Щ­a›WЈK\їф№єІ?1SАv’Ж‰c}eoРЈпЙLxЌЋTt7*Њ|ИŽ?Ыiї­ž‹їхЎŠЂСюЮюoWjR[@Ў‹(šЋ›вчћJгф Mлб{ ЪqЎ€!‹мIРnиЙщM$Х)СЧ:_пxУ‰и –/ЭВиГФбЧ N’ч$р}БњђЅˆѓСжЮ/Ÿ9 ИЉn6“rВ2Аfm›fдЖkПЊ\‰$ђоgkЊШіЮŽ{Ђю•Ѕя|}пўXж Ы fШє ОJ…ŸmxГЂ%ИzE­Шќі6ЫЊбюГw#П"ЊAtš†'x-Ж/‡H Œ išЂЗDш61АЈEд Ќ}2tM__ †Ÿ…жз нч™ щЬ‰ЂY ю•T6ШКэ'ЄЪmAƒiуv™ЭєЗ?ЎЌЊ%зЕx‹X&ё:VU$—Nъё|вJ.B#ьhВ (ррU№VXКЇ]ЩђМЏTLMkќ8пqА{ $е ’’Ž5ИНРфСFЊ‡чbŠq е‰Њ0D?+*нTG}GKiА[’zš,)d–E6У†%]ь_м(Іa}•ѕ˜ъКi;rЇjЊ" ЯIrBАЄ$ZФ8—јs@N|FNHA2(C™Чq2эHa›\„ЂзžгЛšvЮ’DЭЂ- ^ШХ’і<™ŽЎKƒУыщз[Шœj…aшЛІ"+X €fn”•їєb§ЧђіЖ…ПЬќ Ю`НЎiЗ gp>вТЂЂвˆКIе5ЙЛhзџ•8˜*?ˆс;qрQhык74BIІ'iфšXMN#`—›9Žh%$}u7ЧГж,Ш€ІФуIЌpqмуŒYJЃAв\Ž>…†Tыиž/иэ SЦy]g‘Ї§:mУIСƒЂ!гЈэ‚}ЦЈŸ†ЂїЙ,ь Рюоf^бЫ#”т*suspи‹NXэ 7сT\R ŒQaUгOжyx"Y€ъ[Zѕ9У f3;У:•ЄРш9СМ!п@ЋЄ­ 7el5А§\ењ2xYљЊРŽG@h_НеŠШM8бš•ї&’9]нЇЊ)Ќ^џA5кЖLaFуёљЫg/O†€[И€„Бѓ5ц СМћX9NM3мЄІЁчjY†–І-1эoj№ыO$'Х8–Д’№pE2еыы’В^{gмбLf&{њЫ‹7з“ Уpйчu…#yd6œe9XЌ>dЭ‹ѕ{o1ЁЯ§[Fx 8^TнlNкž’ТoЩnг.J’’М%Ж„S І+MьЙўќaП?aЇœ4#љѓ–цН+RU Ÿ—Ў* <и~иnн‚`ЂЧb–T$Лš_оЏ јW;HБпГ†ѓ8 ƒ0рAЖњЏƒБ=я–ч4uЊˆС{Ч'Cš’•+§ЏzGдDЏ>xь)ЧТccjуŒ’ЬУ!№§™§-ClЫ‰rœ63Џвd†žЦ7Q`/2э ІSPs$!9D@V<3<ЛСjF%ЙщМЧ)ЫuR]иВ4Œv:•FZ^\dиCЈл^рšж7ЈДjйYƒB7eЯPfл2эЈ&šМ>ЗtЇIXMІ94E(“ёље˜НKАjzѓЖY$DlСz№Ѓо`4eЭДmлёу44%| $ПЅЕO0I!:+в$Фђ(]5мtОBеИ]ы4žШu –ЄОeŠ єх„Ѓ‚fIk uX= ЯeІЫ\џІ?ц5гД0‹‚YžЙmTТЗqPсŒЄbЩ2“TЮщіЌЁЕMысл%эn@мж3}:aЙ s~Ю0bL Ц R2ЇЙm4ѕѓв7[ђ%У тŒ<еЭЬќ.ЌЮ*Dфq…ѓР<0ЄŒ]x3WЋ;jяжњБю‚н. ˆ*Ч 3<О`9.‹<іl7.ж5"2œХФ…˜kU8шџЌLЎS§“~'‚юf тGE`F iTѕpq‡UёдrмЎ#ЉЩє 3tЛЇo/&ŒeЉЏ‰М`Цx•АК/эhSG7œыыљQкЌ–рK1+лц­ŠпAьjЮВРP„Iятьj0сИЉ$; э &H•{Sчmс€MшŸќўђе3QТШЏЪLDБНUFЙ€ЛКf9Dѓх<<а)XЛ<0~Їѕo†B €Ѓюљ9VGЌЄz-Љк! Оы22ък2T@ЪГ/о\0Э3ијбdЊЅ-M ћћЙ/‚™0œVtн-l,чгžхyh™пcќЮ|дdЖ{yйŽ',У№В™сА‹;2ЅcЙЎ=Тћg№/ Э^О}їсŠa5ч&ус€сЄ НЏРч‚щAшcСbу+lяттfЂ˜^zѓэs66‰ы]ї2]€5ЏО§‚ЕQ_ў„н^Oƒ­*˜а*=qТŒNпОљ§zТ‚NM&ЃAШ V……tJЦj™Bџš‘57їк*78?јtЪ€…6ПгPH@bК4єЧŒЙА/"ЈБrюЫ—ќуO2…м˜гё5Е/2ЃСљёЧ7з,\Ч\uXС$н.иё…p‰.Œ{C^qФг9КєСйЇу!8Чя4зMсАѓTЃ‡]n*§чŸ_ў„uG‡9 х(!јn4h0:§у‚Д‡Вs~x1с­’V›Q[“ш|П75іЃИœ/ыФЗЕiїфpcєнFu‰Š"sи…!JФтЩ›Ѓj|љ‰†ъ‡д1=№&‘ иmкл?ešŽ†нѓ§ч,ядє*k‰“&n C^ѕьWD8Н\”ЃЩпgєЫ§šђ4u8уOТь‡lз_P?n—+ЂжV–„muYmдгЩХA—aF§ЮХсСao*њўsˆЕ‚ѓPТЃ#?S6|ˆ2ъи}pёр^››NЇляwњAvчpџМ[Жѕ‚ЬЛ@“—ЉSѕВ“dЁ­їёущХхйбЩХе5ƒ&Ия†?яVЗMhрœъaЗ7ЦІАМЊROWР(Шы›ыЋЋЫЋўTЖ мg0uU/жAюmЎNCxv ^P˜Ž^Ољ|yuqеŒXбЋ‰+ФFDЖ{žСщ“иЮUoЊš^4 ё–хћъЎ1,v‚цŠхh˜ŒšŒб$1Ь]ЎђГБРЫvhcЮ>žіq Ы„л‘‘[!ŠQV8фvYEК*ЎКМЊ–eкиш6„ƒuУДНХ}&ЖyŽ>‘˜НЛRЛяЯQCT]сЇ“ЫNŒфy~Šаƒ„-$XhрM’ОGи?=№X… AєwяКTx–U bЂбЂ!ИћBЃ\PS[яяw9ž%ur=Ї6&›.v|бxbШjNƒ†eЪДwнP0ж™}+Ж“ SnpјˆФwD№х’HПš‡2s|всp ˜юHрUЫБ‰“K$+Œйы9ЉZ…ГPІя§q#Пеtќ0№]лЊ%JK4yQ$`gI5˜бЭйёхp2ey~pњ­ИIQ­тiE^ РxuћхЖСJMх˜дЉ™еd‚=Ъ;Ф8sЂŽu>сx3i:юя>ЙОщ^8^v3В]чќ–-FццЕ R#н‚SбeђЃ&„DœДФz=Fду%М†єВЬ sђхФ2р^јIчdџнћ§ЯŸ~џдc5(HїњjК.АЎшюЖƒЄ^СYnпХщ§я2ЛэпЌ>ЫOY№V6ЃљнЂŒУ() 2(Э)Ш€ДдQ%T‘№*?ѕр™yљЏВRLм \оЕОІXaѓ:CS•X8†?HfРЈS аxХ№“Х2‡SX#ЫWWѕ A2‡РCЇЬxЬВнѓ jфVЌІU”‹&аd=žпжЖ0Э˜СТХŒуp№УFѕnŒШ$>ю‚ЄZVО>хУe‰ЃЩŠзЌшєЭ™MЎ:$р#QT8ИVP` О\–ЖФKN}[[м€е1E˜лX §# †JmLЎgеr[рСЄшК6*Сќ–n5ŽХN"Ќv8QIŠбЊ1–l!ЌbD3Y,bm:с;[dІР œnЅшКEЎtЪШЮN˜ЊхЙс`Њ'+тзIUg[Фž. УГ!ŽЏ™т?ч8m.еХсHв§zUzЪtТk~]ƒНљў(щJm˜Ž7K’™ЃЮњp„†НѓгЁт”WЃgФ oзPeЁГд‡PќцєrЂЅ`–[G™^wxЬюВ ќ•ЬЄsѓ=тиџ}IКeZЛІм=Йъ{77W—]AŸ-ўё'ТdL…”Бg‚&6>М~јљѓСQwЊрИSCd.ЯЧ’Œsˆ]MѕYЊјˆ;н2-S™\_LŒX чСBм…€фЫэ< ,M@’ЗПП?8:НшБ’пbq–Ъ{НбSџГ™­ŒYнѕgP2РbpсЦ Уу@EЗмYЕ‚ Бш89KWИгї'7НСsˆCВjЌ)Š€EиlЧRйЉj9Књsd^ЏЎ€%{~gECoA1щ„CЉ5wНБq4`Щ=ЏMЊS*0…ІEюи!Мб •cБƒ^њЉ QCРЩQ\”8.bE›ƒN—О‰уk!FНрРN“Љки-”Žјчш iW{€v•oчї№51-/-Ъ4Р„ aл,pбЗ…‹зџhШnQЕУДСЋћyš†Ьт(t-б,z”оwšћпЏБiњ)CžNplЬЫNЙК+,YрE…% kLзЅhК;ƒgт;†&§liяжЭ" Yчќьфшјb(YщђKeI7уt0IжpД~Øз‘)KВъ Љ˜cjкO=}џїт-ˆЯвјюёсбЩe‡Qмl>Dšrьј|ч‹т\УДCЈKмDаь0r!TљГгџыЅиІыc…6{u~=œJК3ƒРkШ;žmрМ{œ˜дuЄђlЗЫ)rbHьBќџе’qТЎcщвh&%кЖ™&M'Cгзу1пŸ–‰%rуЋЮTГ Н]–f›ІЦ Ș ;M—H˜"ЌGз2HЂ’dH€ХчжУ ЙПџ‹†Е‘ЬВk•2п(‘дKw*ъ^œјІЬ#I‡i?Дъ]dъšnќsќY’чЁч9і§YУr0rt*2иѓПeпz 'М$)(Зэсј5л†а…n)#*Іу’!,Кnш?…>pсxЌФБqЙ~­6!|$Nёў[’j2ичa˜Ахџвн!‡зМрY$сяЪКЪˆ8r‰ЇІ(шГ*ѕlC—йu!^чњzЄВъ%8QЖЉГИєўтbф‘щкТЦаѓe[2'yy•Ї‘g8{ўЄЛq~Щк~„qžХq’/ц Еn™U1ЄЈщу )B›Н§И]6™СrN“К’™ЇЋ“п6N& sœ$Г8В Ы+mžfqшў%›ЭШІуЉйOЯш\kQБXдО(dж_UdЎlМ|ЕбЕУ`'qфуx=]мЮ›:нсЦфЇяіXа]Яᘊ•жЉЧ Д^Е‰уdt&vYЄЖ6zѓjC з2-Ч1TнА‚jБhŠ,vхkYъOш4ћзъѕ'ВDŽ6ГЖ‰эб@*$RЩ ™ˆœ•Щњ(xЏ;cчјщќvQDЎЅNnКЊx?Бžšœ—цЖ6ИжТzQФ–ЌуРБ™™_–YјБgIЇ'Fъеў czARЭo—ЉЉ*"wѓЙk)rЗќЄr{QSu]г§І0uЖЋщr^&~5„ВЙЪЪ ЛlMЯЕ„ЋЎŽм=:чнИФyлѓШаmЧ–on ?­ёеŸАл7ŠaXІazY“;пчмА\.›ЂЈ‘lКЪ3dПСУ0Із#і›і†и вТ•ЯfizRGtЃВГmщп0єП[UЗQ6oђР‡з‚эчѓEM&—6dюj>ѓ,MU4•9†8АЂl„„Ъe€JЋ?аэ БSчыО?`ЩКюEГ()кU[ЦЖ>=<цДАЄCƒщјџ: Аa˜Ћ' 7qВщ†9™• ›КŒ}Їw 0жђfE“Кп4я?/^зСWDб 8лN? $З\Ъ$н…‡' N†НЋЃwЏFЃ.ЃX~\Д Т4FІ2ЦgіOЏ‡,/щn>ЯlэGvьt%љ~”– 4Ы†иыђz†g№т<ПЊЉ‹$Д#§ЧKХд8б Š57Чђvž…рC=‹Oи Ч1œъцMbЊ?Аe`„dKЮР ЪщwтЇŠg ‡нІ'B|R sz5v‚8№gEKHI ™2и†6гPTMžNU'ЏќЙе#…€l‰†WЏnkONœIК$Ц.™‘йИШb–Х3зGS7Т д8{ЕH’rA&<˜К4aUЎc›Ъ„гgѓьЛL›ћџЌОЄЈŠЊJЂb•ЋлЦC'[.m$v У "2Р:РНЎo/Уi–EhйIЛZ.рмщlO0ь(Яq@#лхœЊЖ•зэwЭ 8ЄKœђjММmi<вь„0•ЭS[т${VTuLЮЎmJFе3нЈ"[–œ ЧцV‘Х5ЫOс•О%\tДМq$цЧ DИ™HЊ†ѓŠ”`~ЗL žѕ CKЫh(ЛГœ8D№>:шŽцТ‘­‹|ˆЬЋaГ‚Ѓ˜z Ћ~ЪRyІжы9„h‚(K?Ў^pdž :-M%ЇННm#]+Њ@шܘмtD'瘟іОЛП#й–пcE‘Вф(лЪb&‘гфœ&' Љ}пўUѕ@о{пЄЈнї{хŸзIдєTWЊю>'ДTYRФщмrЂW žьЊœшфBЊаe№šЭн6w4‰Нz й5пцХѓд™љ YPаш]Н4dYѓ+№шP_ѕD+A6пдS%žžŽ‰F Z]ŽNSzию6Л]ХpгЭ”"U;лnЊ4\К†ішVїЌ ŠЬx*ЊЊШЫоъ’rYКсЋІr…сщ%oDD’р›"NN'Ј›&YхОЅM‡2Šюк,0$ЭI7wЗђfšЭCдМwŒ{ъжўcД`8`чцœ$ѓЌlU_$€š•њmnprЦh>бaЈŠФЗЄб@Жнisѓа6ХўR'rWжБ-JVмоо59еБc`,ЕLѕс" џйшЯhš"Д™УБ#х]Ggк gб*гЙбщ)Ѕ99‘.ЭђибІ3ЭђуеФ et97ќŠ№ќŽ,™)2H5№ŽзP†•Uн2ЕG…зуйœЂfS0Z &УЅи5в‰нvZоы&еИщеЩT1#€Ј1фCш0ЂbКKTJтFч7Ќс­}|КWпС3Cx“Ef:Ё!˜†&?b>ЮfгЩd8D>лсХй ƒФ:w{еAdF"ЪыIucР&^ўфRch–ЉHєЭЩщHВ§Š0…яVi„яюЖ РљЉao8ч –ъШ\џX&f#ާбА?ИЙ:я1jаUпс*mз™)Гƒ“/™ОoЊ2отЈЧiš"аѓХ‚ZŒЧУ1g:Ые^јo"ЂЗЛЬ’Ї—'WSŠEzuHЗŠєXСz!"™C-ѓйd< ЇЂяVчvЛ&Э›Фщоi_ЁАб$v>ѕ?_ёЊcЫдљч1 ™CтQЗТšау"йюіn—[ьртjЪqШž- “5|›Ї‚n"ГRVђ<Ч2 ЏAФCbB"oeTхjвьъrЬѓВ*‹Lџj8щŸ^s’З4ИЫOs€ „Анr…,R›смМЋ=E@тH›іЏ{Убd6<Žб Х в4KCЯЖ еbь РOE gT;п4‘)Я.Ц V”E&oLБьДЯШNb‹ѓ ВzŽmAў”pЕEBЈ|ЛВХ„п ш{>]а иЯ?Ng,ЋІDi8‹УJгz{зq.mHšЮy№ўѓЁYxУlџl,ЪВТєЂ‘D&ІП%TГKЧ6UQЖ’эvН&l—лЛ/Л:OЂРAО ]SХъ!.ЉЂфJбvН–hконёjРCБЩœŸNX9q…ёХ€SР›˜>ЅшQ‡a‚;Kлв%EЇ?IH‘zU•)‘bУс›СМгOЦ Žx№H3^m‘(ГaПЛћ*zщTТrИ’јy"Ш–gJѓЫЙЌE‰ ^€Q юe"ЃѕЖ“T%єїЛmWЃЃЬsz–&ћUшБ №дЂ„ Vжмd…F‰3X§ћ(НTшЭё№\м|J Вš8˘‰В‹‚aинА]п\лR(ЦЪrгv|ьH?‹:l>ќЅAдyОШF‚№) Ø\_ gPињХцvCXыI'КjK™Іxx:‚2všћ2?О DйIЋеj•КЊjкЎƒЄЇF(ѓUЇdл‡œ)IВ,‹ЈŒ(Iпˆі$ˆvŽЫ[чус%Ќ0ХJ6]œ%ќЦШIйј2Ы"ПŒhРзaQЄЖФ.xYѓP'`•Л*ŠJY6ŠМ)B%JЛлMЛЈ(АПцxYзяЋЩќяЧддэešЁž f1^а<Šлџ Фш@A–§щщйBв§ДЌ’Ѕ. Нs4:.б=|Cб,ЧжuЖЈоtЊшM uЊЈ§сtNc6їэ›(5hMГЃr Ё.єL˜ožŠЗ!ДфD Šє–"M\@6љ0’ЬА(S0Q”˜гД Œ`; РVЫ5pYEЧfН——-\xољd4N Ш#MДЕЬ#ѓ›Š˜‰ЈъD–Jˆ|r ;[ˆюњЋюxЧВ_gІИш]Oц‚у€ K’Н}ЮЄЁ пЊˆлv\KWZв—‚HїfзFšРаTчШдhСCXеОkDs‚Ђъ^‚Хi]@Єе5QР…дЮЂ#ЙiъzЉђ-ЩPИdP вѓщјц§ЯПѕ`jqхФŽ8ААPГ‹ЖS№џZљ рsžЃцЌ‰жOЪuзхCmцEљkEЭ„п†CuЖt гЏБymO( щЋ5ˆUюѓЩt6>ўњЫЕ‚2`с Ѕ<у8.АjКщšЈ78НnA‰P/`ЧoZзЕ35б*a_eXІ‡дчлMSІyk~лЎ;эOТлЌыа ŠPžІ4?дѓЫ +ŠВjЅ(т\фЖљВЌъteБY}{л&К,Тwг‚jAaЖйжО* ’Ђˆн‘V5Qt…сгЫ"OА!Й—Pе}i’и‰а]г”.7›Cf8nќюз7зXXЪr"7Ћ5ъЊ7фЇy[ПЛ]уЩЬŠˆњтkЈк}•[LІгƒъ…fH“cЩ‘iž`NЌoѓ•~Зћm ЖХжуRbQ E—јсЛзЏO'ѓ#(~MDс!Жё-јГНл+KmrMф`F|TчйжKM ЌSЂf,Sр$КщxЉNs2b5–ЄDъw‹4•Ј‡‚ЛpDФ;ЕБš"7|ѓћ‡ Єv–AШm'ќВщTdЁnщ„ДлmъШ“VсWVЁ.Rƒѓ“ГЋСdђ0\Э+К—EЈ7ЬPдbNKЈчЙыŒюTТeЂР4іїQѕǘУ8UžЛўёЗk^BbSЩЉ;ТьMЛWќlж. .Цu’=$TТг%vx~6єЂ ёхdd3*–ЖŽ,ћ€эЙљ‚7ВUйбЂоѓнЉвvЏž]ѕž>=ўe$IЈ/‰]`_wТЦ`љnOгOx‡‰4B“{PЇњУ™ шHлЄ>ФБ‘ЭЬЭK,X‡(йŠ’‘4eйnїкеDHЗ!Ђ8DŸї.ЊВШBKтЉ‡ЏF’b-Ух- уЗўЬІћї–ФфЖD€ІmШ3ѓ/išоёТ?ЈйBs’њ+ж]КЖVр$p`mHлКоЫR’IŒі!Qя_§8UЗЌPьљШ[В‰Ф*ВYДn=CЩЖ 4‰G§ЄбЕ?€<іƒ!з 2š 9’­Ћj§5lрb‚ОЎ‰–ъšр-DД*‡ХS$iўсня}Yѕ№66кŽpЊз%ЊсЕЛ=о"$Я›6еE–%ЙыјaVDуNЛCŒ•ЕeГк кSaПъиa…ˆсK›ШLCiJdд ]YрЧN? eЭЯѓ"Џлн^К­Y—I†Й“БьФƒб_C–0Зў”WЋ уC’тХ5Є @є9ЊiGШчNє:‰LxлЮЦŒ&UglDЄД ЙјшHЯм{ћён@†2мёМЈB !ЙДЋPж3ЂŒL|ƒˆ%ж8эuш€O$yчoжxFР0"Бtq5fСЋMЂЕЖ@]лЩмЬN@ УE0ћ|ТfdїГib™А&Гє№н›?ЏD@šрЂPYЄвЎ—“K6щ\‚`&Ђ EіŸq[ЌiлНVсрмЪ§sљEЏ7 ‰2S№КYVPрг ЎћыЅЂˆ`m^ОўхГ\­Ÿuiёжgќјнћ'Sj(ЭЋZRKЎšlёЧя}wЕ7zгщžЁЯu"€лNžiгжЫIзюЊЏ'ƒ‹Я=šч™Хt8 Ц—з_Гv'GЛЊъ„њѓхёЫЫ%ЊгƒГžІ@\ч{NЮNЯ.ћcС/Л(IоEl"y]YDЂЈ пW›ŸŽŽŽžП8~-Q‰mлУvгdОЏ[Ш іГP~œюŸ]о а_ŸcЃ .2Џ*HŒq’7DњБ<М.ЫшђLтGв/к‡ ви [}+uSљpŽЃЃWЧ\"ZŠ^гЅ—u ю"6 $цдEсF§…Р/fїЮ.М†Oo:QI„ЫщХQR4˜;зРJЅЌŠЩG$~Н<1jЂ6Nфбб%ˆэ(8ОђПО8~nt|Џ›}‰шАA“ јuНРї‰ъЊДЮЂJїŽyTъб (ьWDXtUцI’зию$љЬ"@ўZјщТZ§уu€ц–`йКюЌ'ЊєU8§ž Œўс‡1 лЏ ћ Г*г8ŠуUE!+"3ž№šyТйББТё|(ьЗбZ|ыт§Жн C7шбeVйoŸНxўќшљббс/ѓˆ fГбњЂ(Ы„OпёУПˆ^ˆжц–єѓ}Ќёщг$Eiw]шё”SБёiоR №Є~’•ѕ…ˆА]“ŠtГ—:_ФЈWђ€ЏЃŸ=/euVт –0Э‹D9{yќј§бGЇсКйЋzюzмEщl–yz6eг‹CЧ6юgДЂкa‰bHDqGd=сCHЅзДВ­№l^Ъя‡№юСшчЯ^]ън>sAфIQCМШSыцgєŸЃЃ/~тVФшNОЛ“тТ%ЙлFySр"А"”iU[/-ћ^6Я4н/кjЇМ(k’uIЛ%.нС%rЦ ц5=?&V>џљк$V)aЮ‹"uo№/1H}ŽXЕнэ{T$бlqл‡mA}шyћхKs_БcZ7’КLъЧEњmЇДЛ‡ ыNђšV0е‡ЯбюУ{F  _Џај lІN~:<ъЦ i7Ћ7{ЙюЎѕŠх-x8SYBYpћхџќНYšїsЦА’Фе70Ц=ˆ!DД“E'аУCУъјќшИ3љш№№ѕСƒ”Uч&‰M}ў ‰d–ЃїСЎ ѓ0л]7ЊaСlї… ё@ЂG|ЛZZї3š6LпRЁс‰t­Њ[AН#3Ѕц‚˜J\kу#tjXŒЯŸ§ќ™ё |‹XŸ~ќsсбё‹Q…A‡8ѕšlчрПoГнaв‹РІрЯаяeєШє ˜ QНЄ˜йf/†NвфШжuгјWЯ:—&уе6Ъsд—(bхцЯž?‡П%‘ќ™,пЎьйtЊЌXvuBг;”В,Б§šCM_B=qп3†Š*\О>ЁY2’–vН–MЛo"`UЗ"^X;o1~Ѓ[ƒƒ§xЉgИГФИљэш:4Юѕбб[Е |mзћьіЏВЋ-Bй№Н Œ0Ѕžqп-Х1KS“›ѓ‹Ћо`ДР œЌs;‚Яv$IbЦ+1К$§ЯЛЅˆ“}xєfbџ# шЗ/žсWёqŽŸŸФЄq9Šш|ЃŠ7 mw5Ж9&rœЃtIщпїўб˜Qd мB]@2cйnnЛкХF‚˜OШ/9џ'њЦ!јьйссп^žЋQ е“ећу№йГчЯШRTP)ж(/Ч­‰СTsЛХА”ЂjЄ•œЃЊзu`ояLгXв-гв •+Г 8Q сї’їИл/Ф#+єшМЬЕѓ—‡ФКgƒY=|ё–ђТ8 Єг—јј,hє+jнœS­А[ЙвнlуrY…†,ЊNTTФ‡§ня*ЇъNтЉ3U“8N”Š4ял§*GЭ'`Иof~!ށўэ№ХяјщаYМyј ПŒџтшЉХW7ž›мkљmЛЎъІєtХ№ПИї< .V^у ?YQз˜lНwBХфt?)!Ќсš[Rbаы\ьќЅgЫЅ9zѓCчЮИŽо8›Њ$ЊB1№ѕФьћM(4–8vжdCЪD:љћ-Dо4Теn[-mSEM№Ќэк)]> сzMђ!о}+ЊXјx ц!ќ ю№ъ\ѕ‚Ѕоћѓ™щšМ<‹6Є бА„йvЭŽ}*'}у*‰гЊЮ`ЎTvСоїМ $ШџЗл*\7HWdœŒb/БытšТыz9„љЌ›гgd->џѕjoєЋ#єfp? 2XПФЉKЌЩКAфšБЇЗ‚ЇiЈŠи…:€энLюЋх7жtл№$?юZmШб8:чУР Q(б*6z?‡~†žџ№чD‘=љ№ѓѓП=Уhs}єUЂр4ЮuA ЩuяЖЄ­ОYWe‰z‰ВЬNzSAНяеЁлєmHk"Ц_[KuђВы*6'ПЁGуАћХы i‰FўѕИ‹м˜џфkЬHђˆеєіП‹ЄЙoB•E/ІŠWпЙ_Gък ћоdЇЂ›N нƒДj№МдиЂп>F ЦЕјтЗ3ЦY†њјѓoшъ$z§№^ЎPtq КОСЏFя“lсЈ€ІЧчg=F5§$КoppЙXа‚šlАЂ#'wК%Ил.!iќkX'Žx ЙФуУУуŸп]ѓnшkуO{Ѓq!ўxЊу}rg€dѕWYЭœB–Ь ‘›Я?_бP‚T€Œяœi@IfZЙњ'sMŽІРmЛБ PюJWЏКœстечS#Š—Цќфзрт|нЗѓViјЈ5VХЄ3Пщ&š”ЅЇŠ,CQœl'Ћв{Ш^Р\0–M[’EгmМt“BcKŒ&@m…ЇіЦ 6џэ№е›+ЦMГФхЏџxyј7DR‡ЯпR~R“тз66pV{П#НœщUAфаu{™Џ =ЊїПЏ8“u№aМє|/LыnћlзЁuTяћL ъ`УL‹7dЭ=;<ўщэ5cEˆMC}~ёЇЯŸПЃsЌKАHZ•+RтnШŽi­Iч7ЋёœИуXї>$ш^ЕЮ=КʘIŠa'XЩЂ.єО”[Џі­uјlм$a?уšУi§љCuг<ƒЊ6F`C(<:5Уr ѕщюu?мйLЖ)б7АG@iщкЖ. ’vyzбъjiВу)g8–”ы§ЅБnЃЕ%ŸйэvAHXjтч.К§z2’вњ(‹9џ§њЬббG;­ЖЛ5™cœPќ‡ь…кМF!б,ђS“йљl:]Ав§w?ys™E–@ёКэИxŸpПЃЕжBkі§€Md ŸHd;<ўхгH№ВŠdЪ<4f'ЪсQп:uƒ˜ќЏі6‰гйxрАTкšФЬЦƒСl–яoєЬp|KdeУvƒИ@џЋ3нх.;ЎIз†hrяb]јмЁап%7E„iЏŒєёлАџtММEіlVнYwrЋ%ГŽз/ёв†ТгдbСaнѕ€“ВŠЅ‹МbX(ПОŠтZЫЊ ИыаMw щ&6•Oˆ<žПОƒ ь%]&ˆ-‰z§ы1і‚пњэ[™kВmг’EHj­Џ рЅ,ђл&чсЌ‰ЁQœ XФљІmJ# Я+vJHwŽ7œ!I&žѕсњЧЫOsЋР~*€АтJўyчшј4jZЬJиі /‰Д їн*юqЏЃТЅ…ЈGј0z F3н|­H–žЉJ‹-ы1v-H™и5@а€эн.‹Нwƒ<ђУяC=щŽ}0)$ЕFo^РTпђиu‡žZrgЇ1ІЗI;oƒEY@ ѓ@J ХВЃЂ€2Р4L•ŸіЧ‚цТL“#пЄќ'….ЪяŠм}їьј№јїžcЦ#ЗЁШ–РЊЮє@Ј/)lyэОЖNА…Ащдг›:4UQP /Щы59IжdžћА“y”iћЁякІ"I5в‚fGi–СoюRlЛxВлнн6Mј "Фgb\’~XŒ' а­ыLЛљ§е{g[­ЖФNќ!?q+^KdHtШŠЊaйŠœ(п|а!&ЦРѕ€'^ nЮсwšnH6‚У’Є˜–єmZœљ]ГIOŸ(Z+ВљLА~їoм0ЗІWlе–фPNЗЇEzy›UEy Ѓїю§Х˜№дb ЈЛ]…ž§ ы3еа E gѓ9ЭƒЩDн@˜†WPПюЗюn7ееГў˜јЋ ю)сќ‚бˆч0[ЗUh/з_/oО:VГЎ#лr МЂ/о}МшgNUm“КжУюqбВРЭ!5‰’Ќщ–Oє=UE’#шSuчдлн—ЛvЛНќ§ZЯ 2у*lpЊЩoU5PŠџ…њїmЬ:4p/X˜н\)TЅЦ, ‘ЗЙћа•x€[ ’ЊыŠ{њ6Њ§Š'ivRЗћ&-zЩннfЛ>œs1IЯ5ТlвQ­W{єJvФšІы'uлcшaMlШЂ$Qш}ŠІŠмЌ~>MП*=ћсЧеЇšьИяЊ"‹<УА’jУмюіgMАЌiЗ3g— AЫЄo]a„з ЛM\‚dЩ AGdoЛ[~"ПЭEM7lKз$vru6Эe<дhz$$-(HИnˆБ юPtѕьІЛŒ„TBБoGћIQ#`‚ њ w/xУ—ŽЁHНРЕ‚4"ˆеЩйЙ}щПщBФsИъ"ђбр§ыw}ШIМ™­p[Ÿœzpежрј :twv‚TˆuВ Ч  oикЗмДM'Щc”i—ё*‡уE9žšiH)Нп2!mНЖУжћУЅ#2 5~џ# iIŠБг•;ќ˜ kМНбI ewзАСЭёEК–ё€Sb жДУ,OŠaЅEEЮ>Џ;ЪВпx gРгMбєќУF j1gƒІщpgїгшЦ№УыfTЗМeœ•MЛoЗЕымQЅœЗњ7‚оV/їŸЙ&щ—|4:Й…–яКНRќя*Эr ѕёјЭ„a ‚wCbwCЖ,іАЌSюфьNЗЃ`РЃY–у|)‘гdITЌЈожо|нAKЗ]Soл]k@dНŸбвNпНњcЪr<+Ц{ƒЛІЩ,АlбhžNUM3—eЗ•ГmѓЅ…тТїм`ўwcŽЦЩt^ШvxЊ€œ;ю:еЗћ…;Щ YЌW—†&бgПќўqТŠldћ6Ь?6яё"F иN‚@Ъ‚х‚fT€P uVy’јц§Жђџ§`$ј…%оФ)“0plЧё& 'šьgьі7 w{“ёD[юл еџєсjЦШ––˜ зы§NiЬр­‘:2!(Dг™ˆ7ЖжuРЗ№нЅo™З™з миЕeьc"W!ŒшЙднўФkиФvŒ`Иы еi•ХGOњ4ЃјQIњЃ_‹XrдЃГ< N@pœG”„X=СЋЊšхUjYп@х лN‚QЉ t0…фхсr=ŸмЄ&}дю`2&<<эˆЬќЌGгвВ š§ѕђmЗн‰ž—Аy1›ЭhAR4…ъЁўЗРfптšэІх Й‡g ёR IеŒз$xtSмѕіHW а:Gbщ‹k0:ЊHo†ЌBВ9н’ГБ[М­Bжš& š—№ˆ)^з4e†uј oЙg+@Ј.VШЋхс ˜mМQЈЙхWП §ІлЎхDЮюТ ъЂ‰ŸКъ1Œцф,ЂМюшЉосхдО&sГС徘Aѕt)‡мЅk “оDПэЖХOО^хШcуЕU€ь Lu{{wGЎЋw3оMz‹‹LУ›ЖC_і`жP№ФAVЗ_Я§эЌuЌ+;ŸммLЭrН2ф™Ѕ­?†Ќ3 :Xџф.ЂЁЋ–‹АmфAЙћrзКлoФ ъ[G ppN ?м0”Іi€ ЮЩ›э_{c0бЙЅЉВ ’ГнІчф]ЕЎœ>Veт‚?ѓгыГ›1… С^сНё/„‡с–ИЧОЭМNdзЭљлзрг в1!{‚7]УЕлGXљPЊšiŠ„„иZ c9ЬЕёЭWАdА:r Uœ_ўtz3FЄи5Ю0ёЏ[^ћ-Њм yпќіъїЭh |jО`$$ДьЮвЃнЕ% ЂЂл~˜d˜Ўš"ŽЂ$ЧWъъс§ПУ0mЈТЙсйщ2з№œЈбlўr{ћoэ`vаЄŽuže&џ|?І9M…ižІ oыЏ‡5Зx Q˜ Y]зУKŽ„?UЗL(…dxя­–џd№ЧTn№щЄПрE(Р$Э№ъ=)нqзьК{PuYGЯпЃŽfцУ­gфoKЎиэ6‘ЦЩЦџ›ФцуЩBдчйФ3&(Š4П>эуeI!DE'Рн—Пй§cЯœtіVБ€b|ѕщУˆсz>ю]їg/ЂfГП‡п]˜=шГšсчP $–8ПЙИёКXщ‘јNЌzУ9ЫѓЂ(€хњВ%. 6“ ф`1ђ"ЌWиКЇf žМўиgXŽžі.ЏЎGЌЈ…+тˆ ёІЇ 㛉ˆ7ккЖZš2Пш^-dU чР1ЅЃ! >ŽрХћІ [l?OA‚Ж< –iUХ€7nrzЭАрм7ч=JT#r.ЖУсЗЗЕЇђ“СTвM?.ЈЩ}[™[l<:˜ЂpЮВxkЦЪЖxжЗ­Гl2bщ(Šъ€е‘Wn.f0уƒы›ЋЋ!%hЩК+P6„јЅёn|=•VъŒѕК mSytўЙD[Пј”ИЩудб^мтСH<8›Јž\нє.оž.xA[тжрњkУ#і§0­RœэРш/HSь[ЦуА\§'ƒеtТй…—нšLєfƒ:ŠfvqЏvd_ž\єНOŸЇœ КиЫ&Е,|sслvX­oПЌв8[Dл–)FьяЦœ=$Yq№(†‘рž <*•“mяРЏsKшщ`0YАьр p’bzЫИшИЇЗыдRU#ймЕБe8~ŽчЬЪ8p ыGU ђЫъ?^Е’Ж-“4ЏЊ4ђ Њ‘э ѓb›Йр!4ЭAЈcC/”TqКcjH‚ьЌюjGф€J№уYшЪ#1З§ƒу1.ŠфЋ|щљЫДЬ“РR9бЬБЉАл”KS1PЫќt 5ƒЂЊФчЩвDhAOяj‹›r†dUlЂТ7ѕvџЧ!(ЊЌфnЅWО&NћЌnЦx&SЄXЭJKWWОЛб(d;nћІ0CюЁб =Œхњ цš-Nu ‹2ЌЎћtб›аМA*iСPЉ5;.3Oуhб Sї!ŒїЌfлЎ‹o2†ƒбt.ъ^yћ&|у ж.^“=98јхэХ`Ю@5“CE[š2;^hР0AВ„r\0ќЅўШќМџЕйЊЁЫЬl:Ѓ tшч.ЫЭ—Пџ§ :56*0Zш§vp№іjJAЏ…xЈ%б$vƘMцМ щŽcЉ,ЏŠVџiЂШ`#JРžВФx] v ёšшК E^М?8Иž#Ї‹BАk| Ъ+IфšС–˜ЁгsXЦпВgјСы‹У8Nг,Ы:^с ЉДWх ГїIт— ўC]nсAАU ЄD0?#~лžс§ЧDБ,ox2ЈО„‚O1уvЗ-ё|™*Oq› Š–МСƒюы@EY7лвёЦїу}џя‡†L>њx–ƒџсщЌ…ш–Л ž˜*Њo‰Въ$xLbЛЩЁд tk›PЎќ‹l>P-0кTЙйЈ? n.ЮЮ<Фыmъшš†oџ+Ъ„œьЎM\Р"ЃmSзЅеDЬuМЎђѓбХСЇO'g73g:Сƒ|F_IеœИl6ы–&}9рTљ6ѕя†љџƒ6–ИИ:xwвŸAm‹юv›šЧ2XЇђPфйš\4ф‡ŸЎ(ЗШД­ЦХЖF ЮFМЊYn\Ж€х ™gHšЃUѓ dдйљечk М&}џД§? NбuŒxні8Йнд>ђ0u+MTUЏ,…Ѓч“о !ЯўzЦ?Ц‚у™ @РQqŽžЅœЂњid+EaЋŸaџЩaљП€? л]†qфАаDЎГnЁЊnш[P ѓ<ЫђьПXљю? СА,T2УЩŠ,эћљ’b@‘ ‚BYќgрЙћ…ЈY&д:а(Ьз/Ъ№Ÿ2V]Ђ№џŸЭ8Xп‘§шчНI<ЫаџZLЦBeEўyqOуi<Їё4žЦгxOуi<Їё4žЦгxOуi<Їё4žЦгxOуi<Їё4žЦгxOуi<я5ц,џXїОџiCД\Яљ6Ђю˜J†)Œu7Lы?;MёпэІфC‡ь.Уа)ХЭъHчўЃy 'ˆЂЅg|џ›8џыС{Q^ЄЁЮ‰vRfЖўoЅЩК“šь2N“(‰У№ј(o ђ"ы-‹ѕЊ№^ В* =Чвіw“ЇЃƒšудeЧIšyшkџВГѕћ1з]‹=лaЖnW‘ЦАVBЄђлPz§›‰фИЎХK\ЄодБЃыїцЌAЩвС„*ЪLO№ЃfЛЮ-†AїfUdKS[|ъœ%л_†ЫРГdY5ТеІJ“РСу7V3qІјIцу‘U›Mх Ђ_"У\UfLѕoonDз1-ЫЦ%В$ СфБџ/9z:S\ЧжЂ›5ЉOŸгAбnъљ#ˆ„f]Ц–>{§ѓeXЫђШLiл–Wl6MU$Kcr ЊAЙtЏС›žoЈSЪŽзЋФœбvЖџˆГjUцHу\”О)~ќcЌYктњjШЈVЇХzЗ)"п5Фё чљЖіЯ;H;šš&Ж~БЌл2q ˜щ-LтЊЮ“Є@нФ|i+gяУPщ›‹Бф.‘єjЗ­<]UХщйЅь…‘oiџЄЄ?уx†т5ЗЬM*jiI^5(‹“ХЫ(+QЁ1 ,љъBв4…Ÿ/3Dв=0:їзѓЬљ5фЃЂ\КІ|‹ћFA1NЩLV™mУЙэЇЋЭКB5Rф1Т |#–Kз’zW ЯsМЈZ^Œ7ИvЗ-ŠњфIh №ЕЙЂєяя#œЊ›†ЊYсj;†2>Ѓu;Њ‰ЦуЊF§еЊiъ,\л2ј‹“сp8 7Œ+BЈyKјЊзљв] †$u ЎѕН$ЋШ‡ЄЭnKMŸН;›ђvŠ—$›NoЕYзUdЩЂ(+ѓOЮЯ‡МюХyЙ&є~[ЂG_Ф9<ŸВ’nщ*sŒo _§_ Zе-/ŒгjННн`4u5 D+EъB|Lє‹ЅЮQѓљшфѓpжŸЉ.^пъЈ1к: —Ы0pФљœЂ9^PэЄЩь‡hИџЏЧHRQНД( lюš*ЫШšDW(тидUŽщ0хzP4mЇуАksWгLЧ–YIUdUfеЭWБё=г:ЇщЮ2ЭГЌ\СЫNlgгП?ФЛŒ8н­ZGYМ t•НЙц D=yžprУ Ы,ІгщрќtЂкЫ†hœnђаЯ6_nwЕgш"KMЧƒСh<чe‰nЫf˜EFJS]є/ЮњЌц7З{КЪN$мCхЏOч‚ЄЊВФQ‹Х№г9Џšš8ЛМœ0Gѕћœ‰ThD™ЄЉ‘šјnэЉдЭеˆц9fквŸјЧJч Iб5ˆGо•хЉХœ–Ќ91ю“pIЗыТШvўaЪ ’, “ыСшњУЙ њЎJ_^В2xЋЬ1"рчŠ€дэщіnзK}1™Б*ФЅљѕхxЖ mЂ–“чКƒш/Ы!~$bCФ›@WИСћЗ}J”Da~й›гѓо #љБ#O†Ђj깓"Ы)fP#KюzгбЮІЖ,D7T‰œžп g‹щрqŒцA4Њ‚ї§ Lы-вМ !xoSšžНћюbЏlІIЂ‡”d'KcUгЧЈgh<+›QƒDт[Зmю;dXK—йщœbVїqъѓЉЂšŽы‡йЊ%"вЋN›žАЉюŽMх)уwПНљјў‚т„љљ RхЦДl&™‹4ТEUЦžх˜ВЈX  кэW‰EkЊžЩDPЇљ4eєБйmп4aзьФmБhЩli№љьццj0gЉ›Ы9„DSfGДЌ†EžФHз†ДлОg*’ълŽ—p uЂ ъƒ%i‚Qћ1ш‚†“ёh‰† Щ ыскa ŠЋDЂ%5$j2›NF“ЩdаŸIŠтќz!мЈVШђ‡ВVY~ pШМй’~,‹;Т' ЖCi“%ˆ5хлc5X qєЄw}е›ѓ $•,ЋСdТк†KБIƒІ&ƒСM AТ‰—*?> ЂЁ6iCф№№Эбсk)‘5Т7ExЗQр‡­!’ШыnA_EЬЁŠьbxu3\H8к[dQПХOлuZ8H) yЇqKPБТ4qd~№aФ‹PЗЂŽK™Di‘хEьй†Њ'Dш‚XяЌ­QaPxž[LІД(ы\KІхЁtЎШмbдŸAЎГ“Э]g№ŽЌDpъ?MЭ.>іIs#№cGцzŸfЂЌй(‡жфР‘,‰˜X†•К-В‘нn›T 1‘‹bЭлНf J@UОТQspg;­K˜eуиЩ‡?/!TЊ:ікU‘ч%д†aљEЛы4ЕqЂ#a‡R“D п рм:u5эс”+S†cдƒ…еЗлЕU ŸЊЪz ЎМзdпЂ:Q Œ†\^VОЪЮчгщ№ѓЏЏ?ЯPˆУФ ”Ÿ'ёl(fVы7{›вг€5м‚ЈЅ;ЫОБЪ|S№TSŠDДw$е№т•+ЪdщКёњ–№ю™5BўоTY…c˜ЏJ_DЕЋ5ЛњѓѕЛ1йЗ№Ыu'оХce5фpЄ5'yV~>І$ХђЁr_%‡ќR-ЭG8 тL^RM0ЛЁuЛыDзлЖгй VgY–ѕЊI”љdЮ<ЧN?§ўчЭŒт “&+”(EeЈ0о`xokГдUY`І3тLеnЊ%бSSх‡vAРRАТ-Ј9ўв иД—­ўK*ѕgЂ(иЌ–CУz’~ўёз?ЯњЃ+Ћ^…Mол;А;hƒЏW-‰™ ѕќˆюf№.ЋР`ApпGз5+бj‘Ÿ&ŒЌ[IKVPgєEЗыN}—ЈnСHLЈp,Я–…щћзŸz“щlСђFFє˜no7MЛm lУJмоЖ•%qЈфˆŽП.CCbчЃсpд ЭcY6–YHQx–^аМlDЈ5еaœc@ ыuЇxмM6DЦР!f‰м№эЛŠчŽe”dC"$тMЇїIЄ'ˆ‚CГTD‰ЄйэК УЭ`6= WїEѕЫ sQРcgџ—Н/ёnтJњѕџ1x!@ ™я–ЕЋ7ѕОя­Vян’,˜?џЋКWЮЬМ7п›БdЮyЎsX VѕэКЕW§&skQwЗи|ГјBA†Yue+‹,uр_§јfHі|+В]ь*$b Р[ŸHаƒœз1B5ЁЫ”КФ Џqб/Иу[+{ХЈjPWˆ’Ž]уЦœVЭч˜"ВmWZyВмT эk’Р=ћy,“’'"„RМ9?=НœВfМн M0€ЦщЋ?2ќ,2ƒ]ƒ•œ^Нљ8•м/šЬЖ oпГИшtMSђыpтŠЈЪ,‰Аc^EŽ.Oт~LMяпœє&ГщИпВ’f„5aЙн§ŒLgмЋУУЇoд†рg"tєТUчЃоѕљMяfy&рšm:{§нГГ AштўpТrќдŽr,RŒCМR– q7e9}vtt№єшшЬЧ@€Тяе F"аt„놈gмOGGпн,БВH{wHяЋ*ѕћuaМЅŠГ™РŽю?=ыЭxž‡шPХ†Аuˆ-ЇрЎDс!ЎИ№bџшр№шреh€Еиƒ@нЬ Іёьsљј;ИАO_L ‚€˜Ж„wєŠEсЌы"Љ‹›ЌсМУюФuжŸУхDYХ<8BМЅ—љ]Л>ЅўИR}pј‹”WђšќЎТd6§aН8<І_IDВnifШ@К;‹‹ВЪ!~H’аCЎ1‡h˜ї­а]ЬTU–0р!Hе' –Гй9ѓ„sьЅЩ+їз}iыч6И>Р/с€Ъ ИзEŒ‡?гпН6‰УuKLФЂ kMU"&„Г$€€C–qщГумзgšс‚ˆ<П§ќyћ Згc.yГZяtэWЊ’ ршр№е0Ў(гиєAЈ, `9_HяŸСƒ<;zPь>GOŠcЗ;ыˆЦЖ..Ѕ(Љv”%о}щ)ЫqСѓЊ:йњ D2рŠyMЯюW‘3пьƒ\ПS‹Šœ3ђL~Ež‹2Г.~uw'}•wф>Џа.ЎiРKSdрЙDфn‹AСЬ}Qeнr)@lЗћLDzЇЊˆзDnX LПю?‡п_92rKOМЦъ~‘GЬЯ(AпН›]Ф@’Nе|фŽгUБŒ}Ч2-oQ­?u‘}O8[’єяЪЈЈ;вЖ^э‚пХ,@|ƒтz€ђђИо 5ˆtIФЃ\ъЇЯРl‚tœ.а2Ё„u4Єпмют[tќа €Ы˜цѕzћi[‡і§кЌЧФЯXњXџ3L?ТvР ЕЙєУРG›­а^ю л?МœJ2r]”}•Kgќњ4ЬббгчXџ5‚М“s蕉юЬљ-с$WГћєЬДEт`ЭX–d4хAБKtоХЯДЏ,ђ*zПD˜ыёfццф&г(кež:гпžэ?ЏТ5м9.$6оaЃohэ†ОCт˜7хrЙ\їfкТ6$‰1,‡Й6Y VŸ(Ъ.y›„ijl:ЮzћDЄс6ю?{7Б3|ЪtY,Ьс›яі‘cŸ^ с{K64{@=ЇэЎ1•dЙLт8є=/Š=ы~Xи#PЖЉNN>^єНыоX§Ž*ЈEXƒИš0]dEЭWћxA…Мx3А Т4xUФъЭЯ№іQv_ˆЋUHЭ+ŠŠMYwпmЗ\ЯЕ ƒфj,?іяЋ=АЪ.1Ї?џѕэ‡“ГыўTT#њ9Лl:ˆ4||IФЃБ~zr|QЩ~і– sд йШѓ›gЈФсыћ?Лˆ Š№я-СiиvNђmсш3Ђ:BˆЧƒі}SУЙР3ƒЫСа`ЪЩњ’ о"‹M(!gu|zАOЮљ/xІ//єЌ@ГьNпИПOГџфpџmМFЋjаЋm;š~НН‹†"АSVРf ЇурошАcY+ВР1Jя5[z*4ƒАE]Ѓtф9и—щsфіЩ>HСў“ЇПВ1(JјJ+—?э?/рcхы…†uЛЂ7zMгe›ѕве%~4Чs%iшїу™SQйщAО?зТІ% D)šѕ™F‡‰XB~НOЎсў`ќщ/cwI˜Ю‚љщDpіёєСGEIт„v§{Ў›Bс6KW“YМтЛgщ}ez$Жbл …‰^ Гc›! `Хkъф;]XoPЅЁРБ>{;2S8fаZžpўŠ\Qp]О›Ђ~@gЄF—ЕЃhЭЗЛИ ЎIj)ТмpЂ%И+љ2vя :б 0ЅuM ˆT4wАбФŒoHžrdКŽwzњррЩ_О{гз’,Ы—Yъђч?[yˆwєЙИЊщ§$BЎ"ЦЕ›;,смVdУ‹Р<БŸ{Яі˜ё%)УхIЦyGћ;Ј‚Ђ№бЄГ˜F;Ÿ^СuЃ фЩГ7=9ЮрœГ…ХœОzz@ЕЧС“W ЪМФА E0я§fЄіеДehYи‹_$ЂЮЉїэWQM;,кЭ}Џќ<’A$?Ж$" Aq8ьВ)ІЯ€хЃ}<яƒއZ”!E&§Ы3|ђ8oBдxд1AІiъ•Ј§ZзЖЩXјЙ0•Щсю’‹:)Ўn(њ–ъ%LbrПТ€КЫрeШО bіŽ^АЮA‹В4аІяŸGЎ?.7]CяЦ4 w1&›жuЖkhщК<НKšzЯцjеЉhЌВdЇоЧэнIM€Ќ*urСX<9|љ‘БclТЯВФžОFХb­ыjгеФX4.kК'CмŽMЛФжlK—„й”сЧЛЏЪл0ГЙdxMHОКгNЗ$[MŠдй‡зj}и'hМзчМ: дw›“уяЩ…XkдЌз-Й‰(-†їдЫ[‘тЧ ёКE_ž_ѓšсCsџЮ >';)J sƒYCМŠD>р†bшBи sJў ^рЖ|џnЄ‡ й2[FкфУKЊV DрIвЕ!9rޘд[SO”ЙЋЬ9nvёс‚еЭЬЉyџЮБ™d&U‰ЃэЮGТž Ех иъїД­ЃоD4.GЏЯ9'ЅLg‰Х]М>‹жђрg­%GZǘCiъvї7кБЊcАПЂРВsе‰Ъ2~ь1hНЈ,"Я уeе­WЄо‰ѕЌ] ХНSxЄЎIиž KєфЩг7}5X{К+VћП<нЇќоMь‘4q?V$ BђЇ№‡*Х`гrЂчЃю—>ж,Пlс*šnzKЬtвч]Ия™Є”ргъDњљ *у'ћ/ŽgVZћ?/єбЛˆiйк rвВ@2~ј~кŽFі+’ьjDдћXvi–žuяЂoКЫЎ t‘™0’сeэЎ GƒЂ )Ж„pзš…іюЯљ/GЏ//У _‘КТх/ЯPpі_­ЭIK2Ћшш5н?$(IТ•8кЈ^Л*[јЮНІ%3lVp5њЯ'Ђj/’Dу‹еC|’&Ч№OhЁЁ/Зџьз9ШЪŠИІжЄ6{ђ’И?ВNБЁEhТч.ЇNŠ!-К2$J)‹=0уї>iИ…]йьёёP֘Ψщ”–4œ ЪЃ’ѕ]ЏS}јь њ пНsИDu8(ŠXэН>|ВјфЅ4оСSюHbEг‚ф Њ,‰РE ЃРЯTeѕўГQ’•Р]аWЌсИ^’“>‚ќKЕЧ]9/аf{ Идр˜ОјР8ЫЊЁ\Ѓ:Юœйлg˜ ~)/!6^яz,ZН`ˆKs™UБР U‘x„С•„‡$Љ93H|™HЖыE‹’јбЋЛ мvKo}П№<љbњœц_Об8GY’иЃлXЙxuИt№ƒ’Є“J0>№ŠVZRdЊ—ЁЅ ГqяђьђfФђмCц Я7xNБмР…ЏККШ–y{з2EkДє#сЅgЬ3№=р љАРr‰kб`ж…?{ћєЩссKНЎ0,&мв|1)ŸвД7ЖI†Ž6Ÿм\œŸї3ŽHw/ЏЩМ [N\4{ДjУYдЛрŸЄM[ЫAHЋ”ŽЩгз7цВохХH4Њ<3zЏ@ОvW†нЮ”Ќ6Д"Gt9ƒКJcЯХЙЈ`плУЊ3QsќЉV)ј^+Љ А5ёs0Ÿ‡ђˆЁИя љ{лчЧ|\5„]Ђа9jъXќ№тщбћХŠ4ЦЕДZCl!Bдг"*!`з(рМsркQL+ШкЎЮг8ptir54+ЪŠšЄ[Hƒт†пЎЗ›$R~8xz№cп­Ip€<“dšњЪ ѓУ ьˆSG*ЛЮZNп%‰YE 4M]BЛЮУ†§f†ƒ‰Йeфл†iЬ‡W}F‹Щ_ђn)у Ззлэ"б_>yњтTЫiеЕЄ™1’ІnšTыП;wZ"gk* кяV|сёRз2 ЫOŠš˜ЌEњўУк чІбФМ" мx@‚{г€ˆwйюzkжЄсdННMѓрз§ПВqMт]L>’j@EjtѕвdѕВ]–kкТ@кжdі+Š–ybЋ"7—5г —БэmЮƒš˜Dг ЧDиѓссчЊa˜ІЎ*ВŠ‹6­ГЕЋлnYgНоŽ|є’I™“г(!ЄF‡Xш< ) nШе[‘hЅ№р \KЧWWvЎ`^ з€Уч;‰тђZWиAo0цбmв,)n”it/›М­чЇ#ЗY5еЎ2DB”ѓ}№'"­Ф1К% A+*бЋЬрЋ2sёўуe<хX^фІM=ыA'=R UgЃ!Ђи‘ЩћЩй™ ЉAEкHZW4Е77Ы5хR‡ј4†(• 7WшeДDгьš'WДF–лВ() з?§x5OFУС`*hVвЌ–О§АЦосœ™ FœЌi:IeНБгб%{swљ ЬЄЏY”‚ЛG’Gи/:›Ъ8œіŽс]˜в’DєКТn8vzuv>`›ŽnЮOЯЧ’5y`СЌ№LС2ЊAъЈ7щїnњcAврЈ/ёг$ЯЕЂŽE ќлœžNХ^Лк3Б'TeЏы-Ћ!LgчП~ьsˆУ‰Гƒя? kБ ь/˜вal­!н58‚wrA$ьŽh„Ž;@cw5)iЁ-ЏЯНцХIJZЅM-$HЁн"Д…0[39ЛbЛ,SfЎ?ŽU7 ({;›qиЩ€У"78;ПL9a.`uš]ЯŠёSW+RЫЧЧTјСЧ7ЧуУ‰vОЛ‹Є N}чюwяПЋžЉpNС і=jвјќlЂлїNьHС’( I˜бАs3тeo тм(kiГЂѕ#2L‰…ЃКˆŒ9?|ѕ‘aй)Ѓ,Zrв˜#ќЂ­ж;s~R!&Ј6Р \ЧЖtizz2‘‰#1&Њe‰п\žž\ м'ЯУТ;xЋyGђ7wmдЄ“ K“YУ0Гг—ч,ЧЭІѓˆ†„Ш)иALZ.+’0]QЭзеi`Ш’Њлс"ŽHЧіЬНsІх;†Т‡{н%Ђк^€srраx~RвІmкRLz0 ЭTСг/ъqи+#„}ƒˆ ЄМ§‚<ж?ˆ›оT з0p ОoУoП`K o9 Xq tГЌhˆјšцљrОч‡iНSat˜-i…ьi€Нќщ†уEžc§ЖD йЖЮсъ%|Ÿ ^ц6Зеr‘шkeЁk_ВZХrв"[DЁчњaŒп{ќ‹0JЫп›ЇVдСD #ѓЖДY™ѓg?\1Ќ$Эе„t u ›4—]ли№gXn'yCКHы-Юc +‡xБЬ‹,+0їFумЮЦЖй[š“м1Mu4ќ›ІЪsgЏЮАKрЇД1ˆЈя№ЄбЈДKЇŒYATu їЂliСyU„–&ЫвУї"ˆТƒ ь CKћшбюHџК=ЗДмЕkФh&‹<•ќіО7у5Ч‰+кѕK{h Уz]ј†<чYIцšU4пБю œœsЭKŠnBа’щ<‹“МbЊЉкРф5jТ_тЦч‘ЦœНњ0fx#Š3Zь$!MъnZЩ—јiЏюFTmжUže зх2ѕьћеjџ™kYЗёКЂ T?6%QГПЗžпвФј.ђыpšAчFЧП X^П~—IЂУ%ф…•;e88œ*ѓ7Ї}ЩАЃ Љiт2™&w/џ”АˆNм‡ф Ќ JaPг]э’ЖЮ“,і;ќсЅ8?ќэŠуЄ РКs—оІBMКWM‡№mat~2†У @Q‰œlћi›юxKš ьЊЫєI9ŽЧ |џ‚4~Š-Хад{G'GŠ4qE~v|ЮВswYUДQЪдj}зЫМ*b4ˆ"2ЃЋГ\BKзцc\С8жНГxџ@Њэ$Eз$јўs nУ€ФX‹›™hŽdЌqR˜XEа.Б­)ђ\`O/Рѓ№2šxЏI OтTўл"АСKйQџf8ž2МЈ(ŠЊ Ѓ!бЦ§JиЉЂ-#лPЩJ12~І^q‹нйЄяawжф^‚йЋc•gС~s 0 'НРЖ+МŽTьQI“9ЎТеё^ŸžѕFр“Љ8^ Ьžƒ„ЯПpС‘„ЩšrEрˆШќlG­aC&VЗ›н4L…T.ЯL'3†П;Іэ8KMQ!>УkHJXиоQК"0усхЧг‡жЂQ04žѕ…“Њ”@ЊЃ|‰ћ3Сkфzч—  WзŸАSžѕvs7ІАъjggЃAяњјG`ZёCOM,`ч7ёЅI‘хvГ0@2аEŸdЫG![fy:–ђv|зqbъC‡№ѓјуЩE&kNН§D{о6wнG4QЧ Онѕ//~ьqœ†ˆ‹”tkК\ЦSEŽ›У;ƒшF˜8 Ž@йцЈшпЩД]ьШжЅбХљѕh2•uПљ„3пћМН+.’Pl—ђсhљЩЩOП 9AW1ђЯx9n7ЛжcТД3н0Вa{Q’т€D v%ЧZцйЮWи2;Уо]aЏЏЦsr2и7—ЏЗ;І‰о хPкј–*n"9§mФЭUс&7}f.‡iЦu oКP]EнФ’PЗYх`Л-Чг,vВќ3ёиJ“ГГ™ŒA‹mСёd+lсМ§МыхмUщˆЯTW‰К‘={7x‘ї/.ЧТ\ *Ўш@р:Зev85У]4Ћujьh*@ŒхЙжзкљЧ0У““‰‚Ёђэ&-j­лOћDJчw­1M•ЇЫМ\8„и;щsœ0Л<ўp=$еЏКЛZ6KД!DУс\3ќ3 ђфђЌЧЈ№Э­/šОў?h(k”@cƒžњДн4eГЙыд[ЏЫШq‚$ЯЇ=pтІзg—ƒ)LгC&уq›лUJ,fВюІѕКM‰п\ѕ9U§ЊЫКUЃц’ю,Qgl7EфЃ;EлжmЄЋx<9NŠ|яjЦБг›о`Т€УтWd …:*л-6,‰УkF10D†˜РХѕ6_“_Є1&чСв‚9U WжlЗMhjzPб™ІЭzЉK’ЄXсь‰,ŠУ“‹бd ,sЪtMBКДЄ:ГTap5S гЦ+№ž<чЋя'dq{жžА‹WАСgч`ы#!‘ Ј EР9q+Z.q@gєюL*В"Ф\’эК;А1'Д*\ЅСœЇЪЖJћkЏнФбwУg˜AЙ…;ИZ˜Њ(ЪvОлЉ’ЊТx:eУOBCЇяПљЎ7eчЂ$+жВЃэ|m‘.+рzк*Ўрp;†Ќ{i‘:із^>'anћVtєЁn?ўМm#`Z \ј‡Lg†8:‹†у™}|§ѓљ„ХУgЅъhsи6JдЇu8ІІŠгѓу‹)ќ—Р3эЏН*™й€XѓоqЕ ОНmbыЊІћ@>*GfпНуЩъš8Ÿ|2xД№œAбэ:vЫаPE‡ККKbшђшфјŠSСd=|џСџFc‡fp,=Ќрœб~709ЖэХИFї…Š88Оbp„,Ь™Ы!ШŠЊш ‹нТ‡M—кŠЄ…-nйр8C†—}VVДoА’u.+ВЌ€ZmoСПCІ[2сЭŠ-&Y‚Ч=Žgc‹s~rУHЁ)ž’&’А#$YЕЈ#j~Л&щЬцзч—Ўъ2НIв€t€|аlt‘AБ&ћ`O‘A–Чc№Ї™ёщ+тb•ЊщHŒ…-EK‚ЩBёи"лрtx(йпjПjј$1кТEТ•W`уЊавuЏТ)гЭ*Хњ;іУўй›VTЌИhшŒ;jђвХЋŒЛЊЩеEMй”‹РЕМупkXр…-т0ќ )СЊыёi›ЊЄ˜IПй䄇ќlдЋrѓсt6uˆ­Imf—шxoqѕэЎYюc[Р}ќVЫXчрс‘ ~dg D‰ CnЋР”XQГгЗчцV$’‰$ax1$мфЛЌq&uГнT№LЊНЈКэІ\.БƒЇ—л,ДПlGЭџ‹XFЉР§ ѓn!Іv4i‹кХ&дqџ j=™янphWt ФаKЗkЦЋOЗЅяк.\в2OC •‚Rэ1sіKВЎЁДхщЮ|~6}+ЏџпgЮJЬСы3!Т&з%h Є)гР2€iAQ”i-РЎь YЩ0 ]њSА~(M4гВ4~8Ф’Р zЇŠпlзе"tuьŸЫЊ›жXНЏюУ(8Ці˜“џ@‹€ЏtM~пЛ:=;ЛdєЈНэ0ŸЏщрP@ью&EЛjБѕ™žIюЇў–јџ–˜Й*3ђлгЋо`ЪknвnšФбUyфeеŽЋЎJРЊ+фтIИСя›ћџ†žЃрlТЭУƒPjћ†,‘5АЌЂQS…№ O:OxIњуР”ў=‰Кщ†iоb{јњфЎdYOЪФРКЫђнпiІ›ŽCр#%s;§ *ZДАa:™ ў\ўў5*q§ pPt~ЇгUї=ИxЃo‡|ђEФšЖeс2"Yј{cќXA‘™џRžїШюuœ%ўЇ%9МЂр"Ц?Їџ€p…’ќЯJxђА„GzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄGzЄџoHБn2ћ3h*њdБ§а7ў;4џt?ŠcЦYq–XњП˜ХUь[ўЏъvSќ8[.илы_]–•,ЯA4œДЌпјVsРџЭ@re‡н›КqЙYe71ИђЊ,ЧяюэŸ XA”e…,йНjг,"ЯќcfŸў/ЩŠ:йSУХ20ћWzRЎW…Ыѓ8ИP—y‘љpд?яэ}Иsf9^tл6dЛкЎq"ЦџSЮz [–ЃŒФ яRvТGРtщЩF\”EКР}*Ž9|ЕЗwкŸL'г+ш~œaж­Л*O#{ИЗїЧ№†уZъˆuгu›ъ39,КuЛ№ЂeŽ› YQжќзНН›С{e+X5nР/уР5фёйžbї…>љBkF”икhh„еІJ}?­кеЊЪВ4rL7ЮрМCG=олЮц8ПхDЫf…;ШКФ6 •?7ЖƒаГѕ?эОd8yf“kХO\V‹къ ”Ё9IkеCK>бTЭvМ(Ѓœы& У8є„}ЫOвШ{(ЧCh4Žчš•tЙmrCг‹Šnе"ЂBъй†Ž€LM[хЫаA{ŒDУ уХ’ЌіХ9лКЌъ,ЖЏЯЧOѓЅo~Щ–Йџ”@сАZхŽ%ž§6–u?ЧЭ?m“ž.Ы з"'pцтйоо%oњI^5ŒО&ˆЛ]зfБ{}<‘47Ъ‹ШбПљМ*')КnиQНY-mSОxп›Аz‚лdAJŠcQ”6№ЏС dЋѕК Le.ђ§Хі‰ч,Ћeщ~Ћ§HЂnEИyДХЭЉЙ)OЮЦЖЛ$ЛeWmŠ›4;ЩвSZъLkШ ЏммvЎ№—'SPмe›ћ '’•6р‚;O{ зS!фйЇЦUЙСD1Ѓ‚,Ф-нyџjЊК‹Ќ$рЁЉŒ†ЊЯДjГРžГFŠWБЮ"п–еŽыMZ:#шa]8†єЭfЛњp’~&КZњДY:Њ(ˆŠ•ИSpaNоŸ‹6ЂзЄ`п”GcYжуЖ+"k>˜™IНЖЛ<ъЙdѕЖ ,uШЈ~гF–~o№шџŒЎћЃ№%yYў{яйзql уwмGL –-3gd`ђЬЮ9чgя  ЮПЋzdћп{^€ эьGЖl‰$jz*ЌЊю^ЋлйѕЙЋI<Ь2sхыѓнN Ђ^†ЪЌєBѓмЈьРqфх„Х‡ЬІMи­{ЭMещjЅн>Ђ. ЁE‘™ЯХ№Б~ьnv›.MEфe'i Ыщѓ“…щ™8Ай1хХPJыdЎJЭ(•ЈбУЦл<ЅыmjѓЅheЄCГtѕслјЅљ‹ОМЄ;*ъ5ь4jЌ…†ФаzљТ嘎…сфУF‡HшО4М”†АзcЮˆˆИ`пDЖРЊAЗI NPЬАi€N(ља {"#ɘpѕўJ0Ёijі_n"ЏpŽб`?KЧІа|% щЊˆYn†DšрK™oKч'”†ЬФл~ЛŽlQ0Ђэ.6d@„`Цљ@QнБ yђі˜бЭАhonО =Xсk’ьV}WИ†ИX(ЪЧ8"[ž$г Т(ђЄŸАКSт ђ}лœ`eЛ}jhІ—фfefIqЂ >(P"7ЊёRч'А=IГG‚šu‰№йЦ+ї ™šqšaъŠШ/pѕхˆ‘dЭv UaЧŸ.гЉ6HЈИIM^ДЪ§О0сO…­а„ххще”т„‡єъ‘ЊA‡gЁвъъќ‚бЬ A›Qƒ1‰у г‘…Й^HŠІюP УЦ й}™Хl1Йј|%™nЙщ‘*ЗД‘њцІq9By1]&+Р_AЖџп—8(“зѕдh.jnsƒ[ЖЎkЂ§„НМb%U–Иљ’fЇЇЌІ+ќьќjN3Ы‹уЙnЧDаhзFŽWloі} ЪмŠlХqєlFsџp(UD0Šф – IІ ’,сЦшЗƒ2Dгь№љёŒd‰Й<ЛМ>yљYPKYž]ѓ’ЂВчЇœiХ-:ѕЖ­›-~ъЬЦ Л ;AЌЪ?XЎцt№TЧБ—Њдс+uвŽlS:бi†L .оПЛš3Ђ0ћt6YLNЮ8Х MnNA; HNhиЛ-вхюзLsВбЂѓѓё‚сИ‹DUЌž%Ў8є§0J[d{Є‡"Ш7и$Pe–ŸџќзгщŠ]^œ-8_ŒhЩЩJ6r%jђjJ+&єСHTНС6fЛ+mЄ‰cЯVЙХ›"њa0Ш:SЏ BZD)ъ4 юїЗJар ™%..?ўіЇ'з‹љйЩ 5ЁЙ9-›YцЈЊфP!-•Џd+nЖDf‘0tіUl]ЇОЃ‰€pѕ d‚ќЎ$:^^BMК?ажУNЗ‘Ж8yћюэЋззЧяG€GL•_rЊ‘VЉч†E“Že˜ Эj.€Н§Оп€!sф 8оеYш:auzКxEA'+ЋЊ}гvПGВ%Тя‡?sG”Зњ&дийd:9?ЛИјјю’фgЫЬ‚WДˆЈœA%C"Т@уbјм{фdмmїƒRnпШ,Дд˜ѓMW НZ.‘скpГ‰˜Б^A”wD~якG vu}~њёгˆ‘ѕ(6Фх5++.і и" ˆ†чЙ–ФЊa‹щzПл“ЭFЃ‘UЖ%Šl’ЪЅџЧЂˆ<5œЌМDšрЬW„Ћr ўGВPMцWЃгOЇSАjЪќєŠ‹цчD Ч"EРHeЋDЦjtБ бgј*дDš‘Уƒю=aH'к_…gXуU/oБ™сYž›~ёќгxОф3э†}Eэ“ ѕQыК ц§Љ‹EQф2+ѓавЕћŸMiОВ шPv[–Эœˆе RСЉБx1Ў*PйХ|Бœ?ѕђx4[pŠ6лAОoЊ–v7ј]эP@Ѓ…DiCрX^†ЗuљКzoЮБ1 is ЭВnG5:%ŠФхн~ай ђw§ Q“ХYеT‘BMЇKŠЁЎ^П|}1@!*р;Ђ‚АЧш ы> Т`Em‘Њч‚—0Ёb7ОЁмюAšEŒN/РzЈ,D_k}c'‚=бИіQ-ЌДй%‚y_}~ёqК„Mg%ГР xр‹'Ђ Do„r—8К,2+VвРЗњО„ уйї—оЂTйёlU*FW AГ’ѕAtfCДїˆФЯК;Ј*ЁЈѕК-l‘Ј?B‚ќєќ’Z-Іу%Џ%ƒLЮгˆм Qc" ы7=t<(ЛЂš№UюЛ“ŸЊЊї& edеNг3›Юh2IяџТU{"=шVрЊШб­КZ~ёіѕ‚c”‘‚[Ј5ˆЋp"IХд–E^PIа@]є I^йћЖ0cA1ђ&CVZh‹–8^ђHo€g„ИyƒDН&ЂkY‚LБ“—яiЌХбBи‰)‡JГн aгzВ(~†#‘uъ‚Ћ№єŠЂWг{’г]KЊ‘wm.РžNy=Zяvmwђw"(IЄьuk!OlРќй_>PВDˆњlь)’HЙIћAКЃ/C?Bт-ŽќТЕЂдќИЭЃ?<4Ў фUшёRpлн-іп туЪё§ЂяйЖЕ/ё<Гј№ѓ{Z– /ТВ'gD›н Їџ}3ˆ2щˆц0ŠZщН\в Х:МћшvŒQз<и4i]ФŽЎpМрДФd$&šTЛCD’TћjЧзЏ~xAIЊ—Uu;ш€э9ђеlџТЈ8hjЂД‘@Э—,б­Г\ЧИ†ЮkŠэЪeAzд-34(nЈ[KTw‰ˆwG”эКAсkqx–ž=џ?ПQ‚ь—(Ен§ЁЕtйv˜‡?„(О!Aд6нt‚8АЬ{HoЭ*Жe'aщ†lIquYe65^Хˆ„brI‚žš9љt|2b$ˆ‰j3H9Тo‰ З@E[€JЊ|e/тРХ‘ЁчШЙ}Ÿ>‘зt]•чя_Оœ­hŠ mWз ђZƒЦTСВŠщїПНІJ(‰э вnЋПœœ]]\x?ŒHfтяiќх9bfп |D” ŠWр@[`I‚&5•eю>C=rІ,,/Ў)NBhУуrM6ф‹СIкВ Џ~yњгЉA‘Z”ЏѓШбзWчWзsЏЌзx Eъeу^МИrыК^яHЯH,пэО"ё;CЎeEЙЇ6FK<ГтTд“жM;HЫ5Б#‰ ?ФTнИŸŸ>yђуGƒˆе•]h>ЬешќrхЖ‡"OlNVЯњѕЬ*›ѕц)‚6mЈ‰Ьr1žŒg‹йdЖdяЫfH)2 sŽ!}X^˜BўьСЮAф№БnЗіћ'OŸ<ўёЌRћјгПœyЭ­Ю*QL$обFІ*r‹ку-y ќkNЯюМн+РТИ8ѕг•:q~Е9(A“ Oюї§уЇOŸ=}!јOjшkI•Ѓy- Э[№чЭў Пю,hхОAфёабW8ЂB1Gд_Aе{]QЁЉПѓ aО`X–ePbHZьJQљyе`“њ4П[…ж›aЂй5EznЖ›мuюhє„’МfЇMGд}ƒЗUcиЬВ*еWŸ{<ўљдЊЋ’міЈбhb~EvК /ž>yњуг_йњ€6FУ gh}ІІЁцѕfWКжz)V…qV„п}љ}ыбˆЌI-[%w0Ь?~єє1xШ“_G~UŒ.аT4WЫŸЧџёщЋ=ш]їЗ‡Eлсшц6oC–O2ЈшЭЭ;і‰Ќf'Xт0Š№‡є›нa$M~nVmєtњ 5ЄЧПЭт uYАУИг[e,аЃŸќєєЊш!пінЮ}s‰Їi=ц•M[f€@ю(џ)шt0yŽэњAФе†Д*ƒ~.ъ2’–ЖД’ўќшё#4ћщ[.>M\Й,Џ2х6ВєŸ„&5usа“н“#ХЁbњ/Р"­;оФW!ў0х#vQхржCЧtЛ7XхšђTэНУ8| –џщ\KЪСXH е;ЊDПўэбctщЗўа`M”Bwи&юoKfІsќ`ЫОГбКЄ Z€]ГZЬYЩj†mF.xM“8O•WййчGxќќZM;\ЖЙŠЅГПРП|ќєйуЋ ‹фf@$З“Њ~3ŒЁsNГ,ё ЈоSРъЛЮ>tУ›ЅбЩХѕейёЩ5#;ыэ Э>дрЫ3цДЂ*ЉgI$>~єу‹‘–@’FŸ>xuЌ\ќП…GOŸќЬїˆ_ћAщ}pу‚ {la зh9D“`Џ­;ЭыІЎгwoпњ||1ЃE5vх5х(№ЅjєП<"о>№улЅSVƒЭŒeц,оўџъбуЇŸ›=)эУЬ<іCSfnЪЫё€›XдuлБю:EXˆ"OM.цѓхjХЪао6Лэајі†dМkЃЯАгФюЧOўr&%шбАЧ9ЄŽ"рOЩFƒO?~іdе"jY БнюЖйJ ™g–cдїezЯЖюZ'tMAˆY–Wвъца$uDГ–ьiM~|^ћш‡'O~јщ§Ъ+†PФ•Г7Я~Р†P§œnHj'УьnhшЗ‡ФбgЖ~vvНbP†~Єwз њa!рr№ЬbЈ.CVХXг5l'˜MџŒљўzєУГ7KЗ@ьSИbmђ?nѕЃѓЊ'•œѕАгУ‰>šОF!…™1’Њ›–уycобhV7 ЧДшyŽDљp[‚œ ˜К#0|ZњхШ˜A§ќžђŠЯовŸRоžj‡Iђп—-ІVђ“Сqж)џз'инОZИMи›чіт-B“gзnŽ_в№{жЄХФ­^Ю{17$нўКNьЛ-šёІ хѓc^е­Ј=м:РС9#Ч-kМ~€ч-Йў;лŸоЎм‚ДˆЄwХX>џ ќЫgГЌ>ф‰5yч…‘8 ЋV)є-жЉ—IшмyРt„ ЪЙЫxП€ЦЧKлУаўћ†s rzпёЎOНs„І`ДWzCьЩд#З'/  ј‘.ЋУёG7мГ@ї џ­,№)šэQœ„ažkп§Ѕ"kЦE`ЎNІ tуIqИAАА=›У~Ÿ§n†з-}уК­ !“|€VЋЗ?BђPВlИk}ш]жdцл Й.Š ‡uQ5-Ы4ЕЛ_Я›Ўo‹гиf 6ZCЮлYdо;œ1ЏЗ}™^auy1s+„љи‘WЯбM*ŸќщйучFšєфи;Д.УжЃkзЉЇ1Гщt:ЙОИž-Yс^з{Ы”)F&"шфьЉт\­IŸрЄ)ќЏЖя љжc@DЯ>№)ŽЪаTєlbzгVўќхГоxeIЮ„№ ТЫ!фvЫАЯшщtџЛ_ќ|zq5Йпхо%EГšхЦе!/^г5+Ќ№ž7y-‹цЂOoШйѕьЩг_ЯЕВХ^MfЖd ‰pЎROћљ"­› yRDrЦ!6H‘Ќn МD‡ы+†]оїг\вm/ЋЩƒЋ"АTu/нBh8D$^S‹нІjе_јщевЏHTеУNcхxВgŸј?eП=фИŽd Ў"“Ф4ќв<lSзMSНsц8,о„ю6ЊЮcЯжЄхhЬт­Э„Tѕ[…~ЗЭ+чѕг?Ÿ™і&’#GэКђ96$‡Влн–ЩМwН&cьf]CJo0—Д€ЬŽyП­ІuлЭ›$ ]gg3шаeХˆjђЗыУ p–КN;цв[3šaYуFcЁ/§ЈІЖN:МMƒ@ ˆќ JzЎ&yƒгvœЕeЁяняMo:qUЦx­YbЉщеˆ’Мп,ha;ЄrBGwоTмљЪmy’У"2\Ш „Эјьщx ŽDвєК%\аЩЊš'>ќ ŸТ’34ј ъиїюsˆ ІЏŠ‰ЫбѕѕxNё2Т]ч$#&MiП=Œѕњ&mжОф”0f–uю{aœ{4C}юqˆGЮ”1 tЊ}…Ёv ™)Љ†эІlР}ŠаПу˜їАУrhжFЧ'WKN†Ќy_рY№Мѓz"Іы:oћ /б мVYф‡ЎЌš&О]lH9.…є‡Є7'4š•TEтWЫщlЩp‚Є™€JЛMs_Т‚иTљЩХе‚“TM…?\ФЃEШћŠСWНnѓР–З9>Yн9*ФШ5$‰žsЂЌћiMЮ$t8ј8р˜ 2‘х‘ЦЃбh:E‚ QsГЎ‹Нћэ4tфŠ@ЯЦ3ZPРfEJус"+ˆŠwл?а*8!єxє€œG–&,GŸ>-i†WНcБ%ЩŒоt8œRї›кUEfqurrv=_L'W——Ѓ• uъZї3њŸ&œЯ(иg/|гГщlAsУ‰’4ИЧлс<Ѓ#Й„Ь$л:ЖсгMŽ{ЗX!Ir0š”ь!€Лл fMъhsёђЭй˜biŽš]Ÿ}xћyЉ8iьоsЇ‡5bD1Л„9Эѓй’—dhƒЩЕК5зˆэлТ•ЈхbzќтŠЅщеRЩ%В;w‡у§Žd=ЬгDК0>=Ÿт}<ј)дѕ‡Зg”ъњ_I"4Yв,Гš_~ћўlМDuх'Шfмэ“УН5™В7mІ3+ŠІЎ^yŽЇЌсЛиCжh‡ЋnШУOz ћY/ЕN?œA8н— aС3Ыы“OŸOЮЯŽ?њ№сtLC *Б%ІŽ3іCS€Ѓ_LЪmЂ€ч3ьєн„х%Žт|ьЏšУW†чљ/Ъ’_ь/QЛžЃёмпд„ех‡ Jжяy{Bжiuѕёэ›зЏп}>НœтP<_PTETЌlГП‡wфЂ,йИЖЭH]<7§8ЅyEdХˆзТМyеDAЙюШ…РŽ"4Ž‘Tгqл‚Тp?s‡…—Фр›ЛК8ПЏxhp-лБ№ ­"ЁК5^ч<\ ­ImаыYlxцњн”uU6ѓ№ЗщSњОŽ“Ќ„М8РVŒЪ5`iвЃ&qр;ЦнЛ№П[ІэћЎ!‹x9Q3mЧУA›ЅЫјNТŒзЛс%дсl!BА †Чгч/'Д`й&о6Хžp=€§uпB‰ЬЯСWqAœUЛй"qƒДЌš2ё;ŸZќ§вэ(O#О2л  О–eћ.X Еq5yЏr{Рп‘HФЋ|ЯфЈГWSšГУк/’тša(ˆёЗщR[Uz)ŠŽ$\ОDh?МfшШћ‘Ф`Љ‹Г%žаboв5]ПЙН†ичЖ 1КЂ№…’ЊŽŸE^xХŽnjїRФš™вІЪ0ЙРFЮъqžб‘yоэ8uht—{л:U˜б›sŠтŒЄ"ГŒnpчсŽ*„@зБ ,ŽciJPэИщЧЖeь;Кuџ`” П Fu‘Fdу4o*•л‘ф№,ЁџЃi›XЂЎ_МбЌTфј­ћлаЕ#ЅП!8 MХg9ГГ‘ Y)сqЪаSЪдў№9Р\€‡BЏiјšУpRМZК!ЏЗ0}j>М‡"З{л&е(ътѕMsVAPiwИќC†мФOжyњxЌЂытшѓ/wхИ…M›ЮWМ“гh ћuтш*Оb[-цKRS=ь№~И=œТl†vœЗЬ›cfяNhšжR‚UЩЁсp‘ˆрSAк*№AŠМ8>І!Iл†BO9нIrзќрЁaУеЖЪЮЇуѓгГЫбœUMЗ"wњwЗ'Gћ!_ї}ўŸШС$rЫїячЃЦ‹<Џˆб[rˆ 'œжeЁ6sѓгwзМЊыВ0=Нb4ЧЕь{?킉6j!jЄхеееХХѕœ”nљeПю§ё oml7UоёX†хъ#:Е™•%ј–5Ух…с‘ њRњаwЋН__œ\Ю(†|5=;[jІё5‰ЖкђŠк7d<ЎpСяЋ|KWDnvy~5ž-)€щє’Teu~:§кчЊœe‡ОcSDž^Ю єtšfE-ь2љщфuгp C.@CЭ'гщфєЏ'4+К!>Ћ )"‘Х~ИAи†АдbrіщУчы%ЏрK^ОDу•ПяЙЫ з Є‹K€гАн‚j%Л/ј~њf{{ijјЮЁ:”Ÿ‹ЩŠUMCRРЊ!gИUšї˜№ўЯXЯ2 ДЉбhЖ@хxЩLЗфЂ>Гп\šŒчрgŽ›Л:}5_Шбєr:g8%УqFп їЅљйщL„ЄяћQVуUJР|ыІJьЛ^ЇљЇke`S.ЬF” AЫДНtGИ{rMА9WCˆЭxfЩ,-пN8ŽЇцЃГ+ŠlўУГ@фRйdІHИ $Іл _ЁыBЕЭbЯКЧсс?YKE“щЋ LF|ъiГЙ!фжтžP"(Ћт LЪ2д†Ÿ}Cъ[~|sВр_Ў‘a+žžТo€@T _\лIгwЉ)Ќўxћkгн?ЎИ |—~€їПї$yьš"ЧёмЌЗ›&„,c„EfCє-Я/)–™|<ž‚—ЈnБю†Œr`SyPsNвмbг… .Ю*xsњ!‚dг†oа#пb…жЭЎŽгЏw‡іОsіTЖЂ<€ŠШŽЮgєj6‚,) уb7ŒX‘уv@?ЛЏЭIжАг"5†g%с!Y yУp­A„%ЉАг9НпqоnN-Бг-k†•u“Ž­<0§мТ0l4кЖЧ‹+ЄpиЄІЬгМъǘР№Tхh^ э04D~ѕљх њ†ˆЏ"УŠLс7ы"I М[дGšЬЯЎчœ‚/ƒЂ.CЫњ˜єOжЪд-М@тy~н—/_і}Œ,KДЄGн~‹Щ:г„хŒРƒmWИхчп^^ЎX–—т0ЋCјƒ№ЁюЎЖe‰‡ZIг ŽІ‘i>0лТїpп §—пПмьз&ГЃ ƒ•ЏmoKˆІГ3F+uUф—ЇЏ_]р RБ IWbћ6дdYСНЖU`‘gвѓЫг+VГы^ЏjџŸK3pц•ХMЛ/џѕћя_v5>S_-№i}K SыIќѕ› hћp %ЌЮNЎц УKы~xšпЏС+8СЎЪжyф"еђєУ%ЃТ}pтr ъ"є[К4{0љЫЭІєtUХq“nчфъJŸ‚П\]L)Т‘чччZї r­”\оmр“R„rпf ŽЌЉ"5:˘1мУѓ)RК нyЕEчјrГЦxw!m;Ж“Бф ђ2vu§ыYЎўЏ‹•ё,Q‚R-)n]„ўPREhАЖ loMЇGWВђЂ‘рQЧ&б8ŠU­rЗI- йVxp кџmyГi^Ф—•œЈјЎЁТЧЊР.y-иўŽЅ „^І"MNч #Ыл щfMi>сеxЗ фљtХr‚хЩОŽ,ъ]sšќЩЫHRJЌ<ЧPч—ЌтvП“Іqрc‹ GŸ&ЫЕœRМе`ЯPй лнtž49ВЂjz|ъo•:ўЖf€ф$ITлК,HSЇ\ž3Šл’[Ыx7Мos§тєъz„аоя€Џ=CšаšйЎ]iњщšSідееo”9ў~Aѓ„ˆyYЄqBю”ЌЎ–ВєЛСњ~‰Я15Єјхљ‡ѓЩŠ—ѕ|‡Фx8ЭbЅъy*ЋуsNбРПѓњ{-шф šчE†яК *ЫЫЅlИ9ј4yаzгЧˆофхббЯЏ.WьРыюІ+ц…іуb е:[я~Кѓ›ЦU!уБ'GG/G"Єе.;MъC:Є'‚ю–•ЏѓЃДZ€—љџ_­†ўХ=Sх˜еl<š‹†“Aбћ‚Я38РћљёoGGŸih"UdЬлэ{шбЁ[žЭT R†Љ,‘зЮќ–lъџИшЬCfГљ’С')tP_ўы ЙˆГMu™ŸŸ€б‚ЌшVŒЗњv-Џf+vіљ RЕя™†ˆЇЋ_wаyЧН Н„f›•u„МмЂ^WMЈ5ЖT‰]ёацЦЪJTц RЯтєу˜Фj`œQпXжрŸЌ%/Њ–dЈp­ mŒЧ/7Лuо+yф*т d9 ИйьтјbJsЬЫЂ<wќ(ЭЋ2K}Ъ†хІЏAі’,ё'ШbЧџілб›OcVTdIq“>MбяњХРў-6 šišЪœu“ЎЫLСL›uп†ІэG%‰ЊчОХМќгбЇ+ZЕ\‰nžuьXІŒс)Hџ‚з“П8н„ Ї.fFPnк"Nk$еЫЂj‹Рkn˜UО%О§ѓб9d№(NгЂAЕ›§ІpTMу/ŽлѕЌЅйSеrŠмв—чМTЭР [#žЉр6gU]‚бўz4SнE кŽЈ nћ* уШ‡ДЧ8О8їшОЇЭ’a']ajЫїЊхХ5aoЬ]UеŠ‘П ›…уWGЌхЇelƒжнЩ‹и|ЈиaйпђЩјпжhК”T#jЛддцЏоLX|Žђ?`ІaIQ#_}Л&F›^оl3н~ЌmЊ$‚|8ЅD <Ч5ўХfСтГАнTžЁŽ?Ž8Ž•ƒ5aјЋ‹Ќ@Ж^А9€05шуGKУ)[_я6ы*KР9\ƒšsЂРАВfо}tчяДЦМjX†WлMljмљЕl™І•тзOhœQЇA’a^и‹Гщx‰т)јЭОЫ<5ˆИёX$4sЌdDЙo|лчŸA7ЩSЗkO“fЇ+Ы“ŒЈt-Jа&i^Еmn 7ў4бUХŒжрP%Л››uЄѓМ(ђГ“…a‡cp+бТ:є-“ШHаm7iЁRыШєљЇ•щ„‚ЕYЗ €SгА‚ДnыФж4ц>R”д”ˆˆќДл­KХЧРм”7НЂ]eЩj^‘˜пђIѓRе‘ьЕGžМЮ—шбй\ЕЃeцлulHЬŠ I‹хŠsBф~i‹ШбЗ‚ЪRФaњ:Ыы^оЎСЎ;oBѓAХўq‘\>Шлн—/џЕ+LY )^ юб–?њtЩщ^‚Т"Mщщвl&knе5yh)œф›§~]žFŽИ’<€NЎ),e+YgЖЁ~Г—RSN”P\ЊЛљ§ЫЭ|yК?ЕmšФЄ?б†—DŸ9wTцj*Ъlh 1sж№ЫyPё3Ит”wЫme[дLБгЎОYКІyžИFтуп§~SХЎ&KЂb†АЙ‘Щ]ЊV˜—„Т>ЕЅљXёќДэ GŸГЖŸєЊ*ищxЫ.3Єѓ‰ъы_ћ“ТkК&3‹9ox%Є3ЙЋ),%кYн&–8ivZ•(}QF–МœƒЏ€УWžО8]шрќ!>ncGЂЕ нDњт kYEОƒ,Ro3ЅыІЁАг Ћк9§…ШD|ѕ‚]ЎС=феBГ#6kЊ2€_Лвœ(/с;вљ)ЅК‘CйЎ#G‘Œxг2x›T *‚ЈŠќрСDбLзж…)въфЛ›/П#cUš*ЕTТІkRKІцЊ‰BПaš‘Ѕ0SЩrќ ŒeT+н"ЧЖƒМЪлЈKSи =с4]Weн ’ижV—Д"ы–e[qFifмm-Ёі4QsЊ§&жD€[ОЃ+Ьb:Ї˜ХУОТЈКх'nTvК„Hьљ@fC‘elš:Гv4•MZ.$Ыul}9с$žЅ)šg'Ї—ЌaEыžАyyВьнlMT пеn9.V4§АЏ-ЁŽљqš„ЎЅв+IїкпПьv›ЬAv#/E-“&ЗTazОbv|zMѓ’B(E‘™ЩХѕ‚™_Ÿ-t+\АiiŠ™lОьKCдQF5 GсвЋ%]w‚8‰CЯБ4$GЌП€б}цТ?-Bя]Ў"Э?žOѓёч7ŸЏЇзO8нК^№’Ф]_аКuDdМtэАнп|щ\•НžАœЈ!3R%qWbиЯ0J|Њ ffаь OoЫ89hZДргž&O_П?Л]}xўi4Лњx&hОЏsЏBƒХžВК™єМї›К\я{*5љЩ Uп,Œ–‘LэЁl†dч„Х wžХqХХ‹ЫЎ…–d3`ЏKOS„‹чяNЮ/OоМŸ3<7Га‚УўK:fсЩЧ+zdo‚jNlо­CUTt7LbпPeEUeщЁDбЭ $"{(%КэQ‚§ Є$Тызф>G•™бЛWЇ—'ЏпLx|н>Ѓ#Эрwh›ќѕЩ˜UЭxM|щс]:nTДk| п‡Њ у KUuТЛйнќNИT!н!п-rСЂUп—žДИ>љјщ|<О|їќTu]f+Y‹ŠФї“ L—йё%„ІіШД#\†ћm ;€-MƒbЛ6ЄE~RE!А (™=џЏп Eд@“J?D'7ЙёХхdО\ЮЯ_Н[Љzр(<4fZXеE^!U^Ьас­F*!фРнtП}‰‚ЌЉŽєFЯxh Ё†;ЈТ1O„xoѕюvе>З$^QСhqќюZдМФ–й'Ъ0З›Ц‡–бP%ŽсЕ F*5фЏ=ўQ{є5BgЊашЮiAA†’шФ5Ё&쉄y;(`#Ўыš*a’q’•CБ[Ž9IѓвŠhчОчйЖmJcФŒQ8r ц{"1З.!;Ёƒ|ЕЭ4DЄšaxY5МЌ DNdтћƒŠжКN<ЄЂйХxЦ)f\Š0>ЁdEГƒёш:‹‚ №~ @)2ю(ькЊ,ВШ1 *#Яб_‹œDе  ?В`išFцњIЗКƒŒV‡: %jЦШъƒхŽЬ^>?-Qѕд@В,’(ŠТ0?А_ЉxAпфд’}ХѓВbХ%є(–.s+uтнц@ЃО4@‰ D`k3Ї;*›2 ‰П|ўс|4]ђFжœфэ –CфЪЗMэ NЪ"O<ЇЌЈЊКІ}%ќB”hUжuьaжbŒРоюosŽК ˆ ‘bT€єuŠ{&№з/^~>ПО-%ПдˆZо <Lt$y ј Ÿnт I&5эы:Ц+ )Ѕ­Є]ЁcЊ*OqjВtТт"De( ,UжќМЎ"]т8ž]žМz@фђjС[5‘a 2;ф;Т0(‚пьk%$:Ђ*ЄлЎялаз})фr9›Ю œ$#Ќћ5 ЄhŠjW;ђuД‰|.ќфШїcpPВЄчЏпžLГёxЮщ9“”М%E”№юЃЌ;tšръ‚*Яp‚A&yъ[Кx=ѕуfу) dшБ6ћОN?Bо-тHЛю7ƒ`Nл”eг6™СЬg+šЁЇoп^­hj>…V'F?о q€юБ'Й’ЌCrЁб„Ѓ1GЭаЬ7яŠ4R+ќr:КšCu‹QЖДtы#ZЧЈЕЕTxQХЈ‰d"'єЇЗ3^ршљh!ыAљЅƒ_NШcїл[Oia›5hpIГТ)rЫ< ,эоЩHn™рЂ‹ѓѓ+ъёњ@nŒё‡) Х”6ƒŽ7бђN-А!ѓЬё{ ћj4ќž(иЃаuл“LGTЄ№o%„’сЊІŸе(g›E8дЄћцъ•ЂЙkAж€§гВ6d0ШF УЖыБfфF“P7+ˆB[цWя?ё`ДР/gœGДEvЗrWр=!†ZYш’Р‹hrƒ"@eŒ<к*dПћBд•ЌD[R(=CšАн &AўL$4й@ЂщJФмM™cЇЯ?s‚$!#Е­Q!`O$м­фш'ЪLƒвЇ>4bабД)˜Ќ B'ЛК'ж›BжŒыК][‡Оš­D3ньЖ‡h"КЊБє†xТ4Tо UЅІўќ “aМѓЋЖнт UŠЖФj’BpЗћ2†>Г/‡N|њDjЙBЦ{YНф!ЛхпСТ˜P’По‘Йўі€ЭРB№Nt­QўЎij‹ЅзЧ§ŒVН4Я дъл фL GŽя~џЯл ŸoЛ*†Ђ Хk5[АЂЂнO2‡Ер(Йх™šЪ/hбЊ‰Фqџ‡DЩ ˜Ќ‰Д5ž]”&ЧЬЏ>?њZж "‘JаЪўfа0ыАWй‘п~pь-Ж.ž!У7DЏ(уN_”q•VEdюЦ=šEЦP§№ІMTбBКGёЂАіЗ$Ѕeиid.S~4ёь%%Ыš›cѓ>ЭŠ;U‡›!Ёє™.ВАХ@_€ьiнцЎЉоЃ(ђ†Ђ8Ђт”нA§ Ѕ:(в’HњџићЮіЈ’$kўЧ шюiK@ШЋTўzя]]яoUIЂg§‘Yš}Ÿнй‘нћAй@‚’ЂђFFœ0‡;d0У| zђМ(ы2л+]ўэЧˆaqZЖŠЌH5~пжТx†ЌyУ:ƒHMТСХ.Fа№8 €PаiЩ4#$pдЬ0+JM9с6;ѕ ИЌr"Ё0k,!ЕqВ<ўхчsN–5Ыuƒ|РgBић(uіЭŽнtC)žЏЛ•ŒPYEtx#5‚Іt;Щ№œCbMГƒ(Щ+Є(€}!ќHh46„l™в&т[ТsXx†э…H2"]Н§m,#љЁiњ 4сF$я)t‰йД}Јп-ВзS&B8љ%8Fу!B[^шшТљ СŠэQZѕD QК6Х‰]F†Л59ˆ]Н2‚3щќэл с5е єўJKh4‰˜ФбьxкюИЦжh3› ŽЮџ~€z№mM<ћўpž щ ђnM‘(rxnŒ зe™%ЇnЕ$i` щtџ`$†јЅZo)ч.Ф‰І,ЗФдя™-9Ђтъˆ№Х ЉѓА ь˜!ашЧ_Я—’X„eПЅ)BЭвWY’”иc•œž‹ю3ѓž\˜уЃуKF5 љ:№ЉУ9mвИFBь5=СфhяКnащ*МRгс}Тzа,_ЩР™ЖвlџpЬ`<нЌ#ƒЛ‹„,-2ЯзЋХСGБ:Ъ\gОЎЈЫЫЧgч У‹Š†э"ж.CЭHQЃzђPj#T6Ж)М™ЬHFІ*ЬёЛЃћ‹Ољ?.F0І—6„Q˜Œ‹uGњJћшo_ПJТА ънжIш)уг“‹‰‘ЁШдиС>gњ‚_еmKX ё8 wхЉ.\]œ_\ŽˆмќебщХтоЕgРKщ'1XлqNnз;ъm њЖ.ЕЗЏі^Н7lœ „у№ЕܘДВ(tO|Њ=>^ЌjЄЅЄ”;žu]m Iм|Ю‚ ‰"ьД*‰ `Ї{ PœаЯѓЂnpZє€Tpр­”Ÿ_Мxљ3 (л=PcрCЁ.ѕ’bПŽфЖ›Т™НG˜‡'aќfЧЌHЌgO&КlšІєo№œя?КœSuUЗ,C`tHІFrxBovм№Ь›JњёЏ/іОП№PшІFƒ‚…цЊшжDcHл ВX<~ћѓyаіd)ШлхЗзCЕВк9.иŽbŸа4п›љs4EВфжЬ|KгŒй'jFz, h?ПxЙїњ7Йj@рКAў=Bењ ђi[ЙЃ7пўBЃcмRP{‡ЬqПЛ2“4/›Ж'Ќ Y9о}§ЫЧ“9Ы"•n­™ѕЃD’*4eДо>п{љт›‹АЉPBє:Ап-q;№'"sгЄќo_НќцlEˆщ)q0Uj*4Rиєє!bžКХйuя\Ю$d;i ё†ђ‘RчE aЎН г{/SЪ†n+]е бn 1з”Юљ_Нz}пQМЏ)qщ?CiЎњ.Ї NsШнћ2K9ЮЁ,ЩVкЁu"ЭпБH–s€ЯetОЗїrяХз'nCіUTСЉарюл\zџѕЋ—ЏЯcЄxЇr‘™ІžHъ‡f~I$‰=q]ькїЬЏ/e€>ОЌŠПж,nohо~GBO4 tSL_юЁипO"”З™* "uzЭпРгx=ЎO"BЏa{їдvdы”Яс–RХїUŒБв§„цTќ@MЁѓv ЦmsГЋ]гьХ.Ћ2r_=Б_М|+$dё`бБnp—+"~aœ|ћђхЫЏ8Аю„зЄUJф‡Ч›ь5‚ОФƒ(QЛчAduЏXo0w\dtyŽфZдщ}DЁ1zљДяџњђХо‹НяЮьŠ˜ и]Њй%Ѓ &o^яНzёЙХZ)~Rу#"nз;њaт!"A=Vя+4oјeW­|пwmгДd^Ašž]иOУ$‚‘š*ЏЃмiњЇхЊЌЩщ#л oЈ&Ћ —ПМкл{Нї~…xMћzЛлщ Ыw fл‡zR‹МgПžhњYт;КJzљ™щRЖJњ,)o-Ф,=њК*šќђиМЯŸП|/Ќ*jђўЁд№ЇТ[М}§ќ9˜˜Ћ-сa]гтўvчсыeQœ„ЎЉЋЯЫ†ЅнГ]OВмР5Щщ\рйљx&j~G“q;ИF_G(г›š§ъХЫЯACўіQIЩI„=n‰хCK яПzާŒ p9=ZъѕN^bфЌPƒAƒ&Сэїх.тIОtўўр|2_2‚j:eоЃi"o  h‰*XožУFуVџ4ѕЫš(5J[‘уXИW?РпСПјйюIV‡ќЁ= •INoгИ2Чp˜CE‘[ЮцœlZїмщ V‘ХхХёŒьЁ™v6rnHў-КC€uY–mќDB§xёЭБ–юыЩ1DЉqџѕ ђ і#тZ’ЪFšfn!0Xч†ФШc&“љ‚YЮ&3оА{—^8Dx^ŽПЊ@HxКйQ_Џ1DЙKТ€-Рнjџљ+0xП,Bl+ўsЋ‘рк›џŠˆъ[…`$r„[М`MN5СЙ6Оjв з_u|/>бэИЏmЬјІUG2Д”›}з#6ьЊp№Р9f—{ єзя…Дэ€у‡j žЇ@‹˜*G ђЯq1QCRТ•{ шz—7Уl_BˆЖƒДhњ*pюЌсMПbЛ`I€˜Ј]5ГдЄЬвЂж79‹рѓЛSНhˆЄ(5Ъ Л[o^~ фЇ=)ЛР+hЖ3dДXгггњ/DЭщ пКwZ]Д’M W’эИAкmш '™p '1=†? 3Јў№ІУ•В {&œFЕѓыы—/GiAЪw$K Ж<< B0\‰sьсУ|=Muчо§i5;[—офHtзO›aMYЮџБˆCБI*Вп§]KА kЉiаuЉzќ§ыoиЏјQE пžі/Д-2‡Ž&ИЩ(1ˆ]ЅОsoя"иY›'‚хњ„šЄЄiмВЅmУ]Эsг$Щй__МўuюW$@СKоЙ+oќЫзoŒ-Q{Gв6˜<—ŽYmЭђЃ8+РњРkЪ4ИПХ[zЋ$Ю5@/Иб4њЄІš:А$F1ъ8М~ѕЗ)iI)ёџзФeжuДмџс$Љв–и6вAдгЃ}з P­,a>чUлї=/XХё*єр[lЯЗ–#Ю†Гм4˜[“ HaŽ}АaЌ—п~ѕfфBdXЭЈШ†cЩ §v,Ÿэ/ѓ"ЛЫАгDвcЭ_wy 1уё‚$‘ч%Э0tŸ‹зTv.šZ ˜Kk†dvДЗfЛЫШ‘т ИrёЇПНcвЎл‰ z]–$э‹ŽОє#РїfM—џє”Јё”…ІФ0‹љxtqy9žЬ˜‡5Œ]-$лE™‰/ЉваsмUйэbhR`C0лTїЮўOЧrAњбOг§оe!лЖpДt(+RD{?gEф'ŸV‡ЖЎŠьb6_.мЌї[†YЌCхІЧћqŸ%YV4У+№&зззХЃП Ю ЛTŠ8p$8N,/рмRЉыњЛГGNjIWЏleЩЊ`С†Кх^+†яж&~ј ІgВхF‘cJЫ‹УУЃ“Ы9УpијЂІ;гGА*…OX&щ{Pш<Д|їрbЩВ‚ъxЩ‹$š -уmюы<#iЊ oDaю ˆѓv=”a№0ЁСFћžЅГ—?ž_ЭXA`IU@fліV­ъlHm‘q{rуГmЫHчйхєУЧ,˜^O;rЬH+гšДхРr іKŠМˆ1ИФ#™/ЫC0юФѕКY=pЇ—:„ХК0=;Оœ/9AXVвtфšЗ-+ШЩH’'Ѓ5ЉžТЗЎpD†eц'пРр1ъюlЩnv>Љ„бе‘ЅI‹ЫГЩrОXL.ЯN/ЦsF2§ВН‡ §Œ3M…Й:;>†oХђЫА’Š]'–Ёk”кšfЈR4"щ3•exŒQ!РŒpћЬѕЄC[ЅyY7EшТХЛгљtt~ќсрУёЏEь?tиУЭOпПлџxrv5N'г%/)Њ&K>-ьvЕэыЭ]ЕМCЇ’H +ˆтђlбЉТ‰aKќ MЄ‡HZДŠ$ кV+GчІгГ“бlЩ,fWЇ‡яо_Vш{5зaxF–уёt!ЈnKc,ёяЊЮрќ<+,hЉА8Г’ЉЫjLѓ#=JLєšИэ6ЧA%`UвШ›Ъ\^LYœ8Р\ўђы)rq>ж…90z<ЯЮЇѓхRPміцf3ЌwХyF‹œ;`$vіaФЪŽcњEGГб$Š%VИХ$5fŸАiЁЊђ•cщмx!’b>œЁƒїчœђа^JьтђpџэЯo~њuџуХxŠЧ‘”qNвWЭпаЫ dЇ[šЇЎчJьфэ%Ї‘Ÿ4Д“}Р^ "њВСQyAЂ+Ђп™o)ѓ…Œ%}ЫP?oSБ,]˜OFчччcАv:,CW†РЋ:Хцz—йо•ДЩ(‡ОNвPb/~ѓJ˜%uORЂУ.šпlкКoВ6 •шт1aгч)ŠЊхјЄšf|Ю Уі№VŽЂШВfкЎчЙ№.$f6]АВuлн•ГыkФAhЈiчP•ОРœЮ8ЩЯпiЖ‰с{[o*п$)ш бkgz8–эЧ€Xьj§ }жэ0^.&з§0JГ4\G—јХ’Wн|Нkџоq\FG‚oЧ\ž/yбNIŠŠбє•Ж‚—S1GŠО;E…Щг УёІАcщ—ZЕя”yšЂIХFŽ2_!nД УIк-э‡о­ІIлбжо\c—GЧ †з‚r'єf –ƒjШ Еl>[r gY9^L4M:hгРБ>уJ‚ŒГHщFˆ5Я1ЫŸФъв(Й@уGвoŠЦ6Ÿє§Я3€fжбг†з)ЧїX†$`у1Я "Пфг'y>ђ?xЫyј”еВ‘уМ'и<ŽТ”0Ї>d§ЦХэЎzt—YїuЊ.gя8g8NA+MOшzwг‹жЋа6Q;tLњјdІ[QеЕEšU§ІobЧљŒћ}†Tнаі@$€†дrWиЎNhЯЕ 4{ƒ—Яв•С “7ћ†‘cь*ёr9 †зФУ€s)ГUуГMC<;т w•‚sдьUй–ў§Л—ўiY^Pw`FMMЙХl††ZХKыЄƒ‡–‰щН,ќ}n3аH0ZТќ—Я—ŒœxН*њ]Р.OJв&mƒ­€haqxЅc@[ŒyгKзљœљ…ЊчgMсйъфьєуС1іB‚ёѓЋ ѕ†*Ц5­zaаUїЅ$Q`о~wВ`ЕоЄ$)ьШл…сє#>B]^ЮC“–GяŽц:ЋЯйшgЯ7,лd?ќіўнЧ1Џ[Жу…Y"пвЛЖФяКШРo4—XвмќэOW,geYd+ЂЈ%УцЎ=ŽіЕuљ.^Эсчу'WГёљљЩ‡§ЃЅсиŸ7,HuМUР Н1ЋрТ8o†ыOф:сѕЎsŠfRA?@hv9›Ючѓѓ7ћKVt#№аx‰1юzщ7Є‹ЗЭ`“ •_\bЏцl6ЭX@ТЃїЙзєСјф•—“1`j т8$B‹5іКнвУИй]у$ЛЙЮБГбХЩўOпqМтк:^МфxЏЧm­Їџv{†",'gоН;<›0ЂЊЉрwЩ§ЖЯ”–„CElC!š-E™t [~E*uД‹6 б; ]*˘žўјѕwч€ЊLE€˜‹хEП#-љ]‡ХН j‰F———gЃ)Ћш6Им jлџљB?S]'Ъ(мјьlМ\Lч,'(V~}‹dd6 mхЙЛZ8<Зяџ4тUfYf6^ rМІMb<xAaKѓѓgSVRР“ћ+Д§и…QDЎџ3Л4ˆЏ@шйёйŒљйœ—dнknqКШ§щUmўv%˜*…“ЧiгпЎxAт–”LxЩ(wЙэѕ–ДƒUŽЦ_ž3šmЛаШ€Жр>Ъ 1кTggКoб5ˆбуšќhД^XЬЅ› lи*Ћъи‘8yі~ФУŽŸН{?b%йo†vyгћэ] БсxФтMєДYXьU’ІЁы>в NAb/?\Щ† g0Œ“ЂлPнdiб“"єюЮJnkšEЈ втјœхиёћw—œ(1ЩŒ‘n€нk#гP˜ ,iЖЭЪ$Уq№*ѓcЮF“,;HIsG§•`К№u<аё}и%дyрWD@vЙЇJќ|бbt:%Њ.ЮЕ(^Ё!ќК l]žOxнЊuсГё\F˜№˜2ГрW9I‚[ьЄИоРЋиаиBЬ€#(Hz˜­LIš-–Kˆ„%й —†5Н]F@ŸсѕјёL0мЌЏ}•ЙКMyўQg1i–&4Sо­o>mЗ78ЛE”Дp зgAєж—@‹y”1ё |ѓ€'ШЌлQ=а&u<мk"ДЪM!œuˆЩ}Sy”i$џМ8З&%хA"4цкгd†SнЫЁшш* 7Z”$ХA?˜у#ˆ]р3 0ЮдCя]ЅYнуPАдІ :СрXИгzЎѕиƒмXЫ вœTЌкѕЭяПпЂvhтd&Ц0шœ+KтРJВ ˜„>=šŠЃЬЋМ%mгы:Вp0іъЗЎ*.Ц—Sб0-oUдy`й<щ1Aш{zљя`З™Ѕ‰—#QГтю† ък–й1іёœ†,ЬпœёАзцЊ еY00e +xХДkЊ2Я,эJ  н0-ћ‘‡‹zјйшсњїџјœё—˜*wv†F 3 `Љ;_сЏ>\ђdŠ•,.ЮіНд!IЛЫ>nкФVeбёсрˆQMG|0“qtеѓ_/ˆ>ьXЋзЗџПџўщІ с№_]Mы˜Н‘kвќр§5%q~vќqФp‚lІ$ёр(}@Dœ™nnoЗm‚sђtUZœO$§3'MќwKЕœ(IвМо|њ§їПџ§гuхъŠ$hб4 у*GggчSРG‚ШMрб‹’jч­ЁO euM[E~tТШ*УЫŠdЃћPчlЛє8Qmг“Ы8€§KMVDb:‘yЪ,С›ЗmюйУk~cА ѕyhсUEQИщRtФeGю/o7Љ!.Сы^  _hЯѕЃU‡їюп§З—ю8dМ#–aq Э&4uцlix5НР$d6\*gL0ј№М'зAњ@]ЬРжР[6CЇ‘…ГS|пs,ѓ )5FЙЖъЭв4+qви:uti|МsиloI6”)Ž6УI гgŽ ЂЌ;i‡Yя)“1\œуб`сZ—ЩpЯ6Пф„aЬ…эyОПR€l]ˆCC/ЭpWэ-щэМY7e–g+p"“gяЯЇK†e+Edзъt$щN=~Ж0ч'™ьѓž›-ЈКŽCYUЭЉЗзнЪ5$ыBК•lЩ|Зп‡t]НВ4њчƒГЋЩdКБ>ƒюˆЭ53йl2G^ЮР[Jš ЁŠЁЦ, kA"#о4ГЭMOЎJЫЫёLRн! ™ё†УE U™>ћсэСёЩббTАУ”Xђl$ўzмxМфD€x`2?€Ÿќœ$ЊxЃЏb„Ж8<чЋ‰ПХYzMт[†&]=ћцћй?От”`@LU9К0ZшN3„{qБрёŽЙm~Nоџп^S^VU+ѓл” žЅLDЭ.n>‘{iзрb найуgЏОљѕhТ‚TЄвБЅ™O=э"•Л:ŸK*„і§[ДDˆЁƒЌЦœ.8Dmњq"kVPS‘onJЧ#ўіьЛфR‚•Ќoёњo[&rиf†8?с…iыЙOшМ0ЭAdз5Ѕщ и1'ЬЂа`лr{ёцЇg9EVu7і7)ИOyЬ^™л {Šн№ІўЩŒЮбёЃ8KЋАуЫ‰lyqйlA?н@PR; xщ›Ÿ]С6л>о’№Q†66ш\Nu{•DМТGІў4L*Ю,А5№м‚џž@Ds ›\)\'‹˜бo?<›+ŠцЉ$5Ё%ŠЊ&^@`ясД4sЫ/mыўЫZЪрЇ™щh fУѓvшчеЮ-GщКК8|6“3‚@3Љ%Œ'Kk)‚Ž…й‡<ћМ5™ѓІчG)ј8\XЃЙўtЛ­BгаЦЯІ(tqьцЌмтєйеŒ„МЊiЯе„ПK іCзЄС№Ц ƒ’ЁpumJvк[e8EЁqдљ МфъЯ’ѕ?зRЫёViЖФЗХЫЉц•k€p1дgЈгКЎВvГ-­ЧŸ>ў vл ЂШЗ uv2бœДял<0а–-dХpЂURѕыТж„бŸ-ъ?­‰dXЖ­KмттtЎ9I‹ лІ.Ђа`ЅЃ8Х+лPўPSёПЎveЭf“Ћ І‰аN$šсјШ8ХЛg1DT_ шЦš-Y€pqй6ХЪ5 ЪБUšЌbPxSљbLŸБIЗ0Ž­2 њHГЇЊ^ Ч~>~VєЃ˜DFЋ( \k)8Muрнџ›ќƒŒ†CE\ŒRЕЛйшsMCЂœхтџжќЇХk艕ӟЬ~*š~пыєdEњџ\ˆ }ўdцЇѕДžжгzZOыi=­ЇѕДžжгzZOыi=­ЇѕДžжгzZOыi=­ЇѕДžжгzZOыi=­ЇѕДžжгzZOыѓiд\ч!’Юš+6Ює™YAфЛи5Я\‚ЛZEЎАдЂ4 lљъzdўOЕЪnRfО4ТМЪяћПJ7уdY˜=›ћIdџљmдЂa( пDѕЪЁ ф1fM]ц‘gl(jњBжUш›Ы…—Ѕ+яK]M§w—ф!Ъ73ЂvSњвT rфНШ"$ЏЏŽ †х&YЖвXГшЫШгџМžYмC-Hђ•Ч?cНlX—žТЋ4 }x+ЎЭ<;МУ™ПžuUDЖ_m7U9џљ™‹QUuђLѕ“ЖŒѕ…ВЊ‡MэЩŠЎBSuпwЭgПќіінЙфЋx— Юk6зC•bџ)2K–mйъ˜sуЎ/W^TД§аЌ,нђ=m1Yj>X>цЇя~>цн(-ЪЂъШшЙэvH=УP‰Mф!џЛЬІ–6ПвТ ™I›~ш›ЙhM•gнKђР~ћaiGi…„ЛфІјэЭІ M/с{А†Ѕџ‘rГІэ•Йc1G зO m3ŽAє][ХKDQZжU` япŒŒ AvAихœСtНЊ$‰#Ф+‚І{œb л/‡Ь6чП~ф5+,њэfh]г4Q”WmWО-М›лAк’‹„:Ot}›Х.|—…„‘k=ђј”џaMyнrГuйкх SуgЅЎmћQVЖ-Ш\хОХО›AвSVVЪы<ДŽMЧ;RKVѓТа{ДљЖџbyœqšіыд6иƒœ‹О"BS‚ЪЋ•ƒЩ3—‡`;’a{sCч/іUЏр„ќhЁл†ФHNИђПфѕ|Кœ&ю'нЖёuсьнФ Ђp•w”щjЫйUQљГЃЋ яЄ8Н­эжзЗл2ДTа ™99–]пГЅЅh‡БїЈCЎў;™Aф0­ћЭЖДљЫwo?*ЫВЃTš8> ќИh*O‘„ЋУЉЉBЫОЮгbИЙ.=и\гдХЋ+ЭKRпфgŠ“ФŽѕE/])ЖнцњіКДи‹§ƒ…хe5™о7БчтxDеMkœ˜ЂВч 'LЫ~гIрxщАmcлrЂарLѕђ&q•oih™_вє-4Ы’z}ssгњ23Ÿ,œѓWЛФрg“щœз§ДAoKsЮЊ^oК|хjВЖ8h'KВ< Д)o'}щ™ Цђг"xYеП/ДЄш&HВЭCWEQ2‚U (|ѕўp*[aRтјЛа”ЎЦŠї}˜ВЄЛ`bр@трѕ40FŒ›5р“%Юw mѓ‹Э˜ЬvЩ‹Š•с‘ЁŒ=[—ёОjTж- ЅЋƒ‰щYЧ1uдљё•bFmъ‹8ѓМ%Dк›uŸ†кˆїЪuсšSЦєГ)О^4U!ЄрZДў?h œљ*ёВ4CшГ3бї“ Щ/šФ’FчВ–=љ8wЃЌ#уэЉŒцзлдцY;Ьcœm}s-šІeЊЬ„•еp}‹[Ж@ ,юbЁGmWњ:7‘м™AшЬб–SЭOъЎ-ўtЄ9Шѓгq7]тЉŠ›є›•~y$žТ C†.ILsгt}PFPДhИОљ?ПЦ™‹kf}W?№qŽЅgВФIЙцфdЉйiOfrn[€гІW^ЏCљ|fИбЪ64E–„ЧПўwЅт]Яа$Y5S€kЗз8нЧ2”9Гэ:­s—ŒˆеrУ$Op{ŒN„;ЦфxЎк1ЮcЉk_Wэ §Д•Љ`9oj<Ž}єиёJз­Ј(#,†ю”7ŸO ЉЃAИЪЪn9t]fjЫЃ ОАL? l“9› ЫIšЦ_œq–ГjжрЏ7…-ЫVд§~Ќhи8›йlСŠТckЭД‚Ž—kiВсзdњdh8љ ЩНAшФди“уљђђрhЎ€ЋgSIІЇЇsГЖƒу ч•–([1œхм†7ЈщšШ0œЈ(ŠєИŽQ6СДC_Ц№,uПСсТ›вQdн0ƒЂEЪ›ФжфщўсщХс?ьŸЭXn|Сщ†Ю.’,ЬІ њD2МѕнЫСjЖЎ<ЛZJВ„ь†ЎЉъcZС0мјџБїмqIЖ0ШвHЃбЪP#Š„G{Wо{лхЋкаьїчПˆШ†fп;Гч=€ fо9H‘ бq#2ѓ^(˜6]™њ>TaGjBн‰sвw…ф їёэёщ‡ŸПћсУеxp|.žЇ ]]|z§нЏCNX ‚І’М9–ЩŸ\Ш–_’нІЎж$XXЪ‚зm?NГ@RЋ=ЦШДœЄ!хЈёPђ ЙрщFns‡Т[ЋЎJl]žѕ'У“Ÿџѓ\вt•Ÿ š›/=фCѕLхфуLзн|Kк(]ОПоmJЯА‚МB-9$їwLуБљ§*vПН§hЯlžюЖŠIoHRЙ3Хљ`Ш ѓѓŸоpАn5q2WѕАЪЃ$/C[=Х+К_1ўјk˜НоTYо Яlš*ЧРбЅЧсв˜&дЎHuћћпџўћяП#qбžqЊЗUMЂ}л.бјI0“T…ПјэRз}xћбHвмЌЎыЎlщќгљм;ЌwDзЛcš­ŒпiQТ# EzђSa˜Vы#%Ћ‘@іzGRиФюПmm1šŠ*Ќ%ўь3gиЫ@ЇœFЃ$њ:БФСE4уˆжŒŽ}ߘТIаwCRo‹Р4яЭЭ@4ьЧРƒ$ЮiІЬxр‘F•˜Š‚ЄЩ†>?яЫfRИ*?53ЎP› w•_Ьa№V‰вh†QЬїцzг–yN‚д№ОљО'HШ4Ъ‘i_hѕDF€A-#SfHЛoеЗД)ExыQћЪW \Ѓ-<JGёђЗЫљb1щEПcї‰[Ьˆ;Ј$ О‡z1@з$ЋЋЧI*F ѕ Хzœ Ё#Шл&Х2V˜СdVзŸdтT™СhхИHXе!Ёr#Ж?D(#СиOŸy$’•f9^уTп`guEэгiТ+ДъвЩ‚ˆš+PЇ ,"yюƒIН8”кRЅХt 58рJІ:N ’Е›)l@qoАЙ­Р‡\пг%юшX„х @ш–"TЕGdэ%MІRИпuІH/"$&˜ŽЄibXЪѕъОŒpBSEa>_ еХњњqР5йHŽ5ы,M#[цŸNE еУ%AIPЬ…“,‡МДa0ыTG9wдD/2Z•)IŒ>xІКс@ШGrlžƒвЌоюw ФєЈPBа0*і‘в`лдUсc$О9“тZE9Й $Q%r&ЄГнЕ‘ № .j}ьŠг"< ‡vA Џиqт{–™ŸЯВце№v{Ъ Dо}xШLЇ™ф›ІŽ4я:•=ZІЈ;бЕиhe‚›Lh§юзM›/бb|ЉЛƒљ…Јˆs™%xY'МŽŽ=L#~НЛshZMAV‡бЁбžШЮ?ќќŸЇ"DJpx›n}}Žкн)nф$˜Z2Ъдiѓ#sг LЯЉ UмZ­ы,Є $sУўB :ђaв!)iШp eЄЏŒ‰u(т|м{џзO’nUЧf‘ЖбBeЪyЈяШ>в}`В0э€рс-bДЎ; DВ ЊяњЄ‰—ДЈCХ@š#ІВ†нSдƒEvь=зUш’$,N^ОƒJЦЩH=‚Ug;Rgƒ IIёр^шoћmГd&ЯGW05І Pф!F,3,ЛІFmпЖ.Гаw]7nVы=гю„З<ˆ„­rщЈЏ‹]омV!N_<ГPT#ьH@b‡„кц;дџfЊ]Єеq€Ћ u‚FЈ9€ Œ,Х…e$5ФŸeCHlkPŒ ž-ЩЋэ]„Љ6ЂДr[сHM‘{Џ~ ’цWd5МItoPзž|ƒ„tи‹ЕЁ&/ц3ˆЋ 7m:(LљўН=СЖђ:u ;Њб‹wй8eЦ=6tХ-ХНЖ=и iЁ&­ё<dкћцuŸиЗ,kDЃX“,|JŒбLNv‡P‚NЈI<1е@ЦНЂmJШ/Юђ‹`йYс€•тjMHgsБ#mF*Ф1Ћ т@5G”J/Ъ 'teЉїн›ЉЄ.рЮДФфB’[[вJd3€2)фыMXЈЏAxЌR$ДŒћo@‹– oЎ‰МюeЛопА№Œ>ŒёЉУN)і–вS"=нЎЭ/JВ,ѓ%iјњexSИc%2K-›Cƒ рлпoH­–cюg3ЦXЈV”]ЃжюѕээaЧ•‡:k…`Дv>}ћъљ_Oœдš,eЮЎAПУЯPЙггЯгИћУшY‹ … šrjзc”КоЎŠРОяJ4лё\ЫŽ*вoDСЩ›kЮHC{д"аћ№ъеЋoџ6Kk6*RыЋВ,ё8щЅйћ№ЎŸИ4ЕKЖзwИƒ&бы 5rЈ’k3ЯВю N1 u;qщЖ­Лы•B,3]WM№ю?^МxѕУЙ[§a5ћZЂб(…3Э?ќќгХ’ВщŽ оAI–Mјў =ŒгОпЌЊШж!Eн3НЈ:њЎpм2q-'lХ CЈk„>4…uєё?^Н|ёЭ›yrgtYбWј~ zvГ>ў№нwчљ–љМьš: ДїЫf|ЯZБ0щ+RІянћ4З‚g‡QЈЫ–ц’‘ЌЗџmPwУtйцчЯПљцхЫПМ3šb№ РPф4с№42ёуїп~ѓђВТ:Ї\‹yІю!|^мрNЖo)Ђ м{ѓ…зќ<<]!AXi8’ŒxuРЌ“NyЃGWM`ЂŸПxёэ‰™aшhШЋi‚бБЋКJхЃя_‚п/К-yEŸЛЛfВ&AэЃ0Mвš‚ч)ю[pК‹H|xОe™ŸN%УŠjжСињ`-tМДVўѓљspы—ПŒ§ у]UUндŒвЛњёх‹—/~4VxЦ ›–дI`M_\wЛ}2”gОм/чУбќОF4ШръєнЛо kdе„Ф˜БТz{Xџ0p6с?џ-ЬѓѓчЯП;в šц"‡ЈёЧ&WпѓќхЫяТ5+*ёє!]ЛCnй_Џ"]O9QV№ш6˜сОMШГЙЊJГ‹Я}ї†LЫq\?Ц&ШŽiHoз‡мRe›žОx3љќе.СЯQТ_тb, u0ќщхѓЏ^~NзLзbхЊэ.‘ˆх5žZЬK а$Yтf“ёќо;Š'Ї“9~ЃlhrQ9й…wУ TTEU”u[ѕС&0њХыIˆкp`lI“L1Џ.ЌгПО|љђеЫѓrƒN…ћОXШАоAдUjs˜@сЫѓ фbn1”ћB“ОЈ@EžDiž'xnЃ\zј6ыЩ.XnгopІ_Мјyoа(qžсWьƒЧЃ!x4›ŽЮWSˆЧУ‡R`З)Bл"пТC#W3^EIQя M{Вeй0|H1жŠиsœЈb0ŠЌG ѓYУTѓпСDѓъХУАРЛ9№LЮс78–њщ__М|ѕЭЫ~Л†дŽ>KquиN nЪКЮВ*УM_n<PБaмзшЙaЙбЅљА™з@хPОє дkQ"’ЅёуѓАа^ў<№‹МШРhА•lЦ/K§ь{˜шo^MБYBЪбT{fw6РдŠ0_ˆ,{<Щyп=а…auпp КK—EKћ„pід™[ШЋ›.|ѓBѕ‹ПМ’ВШ2,дЫ2c~FŸџтх_eЬћ V^X“šР;вДGл3C‘xШ) =у(ЬЭАŽnжЬЗ˜JЈй‰uЅЈБKрА\ђљ8ЧЫЎ\pхƒWTЬb№y\ˆhєk;R 5вZЌфз‡ŽЭєšmIŠЌ[†ЉЫ!Ьу‘m†GoЈ7Лнн9јtЧ:Л№ыДџЭЫWЯ_ў2‹!’G“с%Х‘Њє?НzѕЭ‹п<2'Л–№§XОАnјMi+ШT ОЊЪД?yШС1Сд~д:›‡жєнBl[t›’џўљЫч™b(sŠhsUQјЋЂщ/Ф_'˜§ЉžaГЭz˜[j[wыТVY•enаN{ЂІ<`‡K1Мf АЇ=hВ:џДПCЩeEшƒъ*ћѕМ€„(/1Грє%3ЃuГф…4џjT­ЗД]JЕ$Цœ„5ыяЕ]n)ќx<}~ћБ?™Љžя>р8“jЦ]x!Š{вчfУУЉSoЕЦe…UhЂ~нГŠК<Ијй ЃЭЄп}ѓђeEл6AРШmЊГzd[Х†8щzНёLжu' { :MЏьB<ŸFƒ~f)Œ’Їъу$РЉпНќіЭ4Ја;˜{PA.›мюџэЛ—яНjЕЃІњŠ5№ѓВЪœš>m•€WЋŠŽ+^Д ь{_‹›nЖ. ХёвН—uеYЫy]GКЩ—ђ/љўн"Ў1н`Р€’хш%0ѕu•№Pє“ЄнбдЎX_w=АУFыГ)РюžЊїEюнџФ=чFыu,+Ў—0/XВv4/ЛУёњАб‚ѓ”gЮч~>Q3Bве!+f˜6Ѕqёып„eвтRІ`yиЉЙkŸдYœц˜+›ОqЧЫ2ѓю/х-ЙйЎі8)№|Мœ‡AyEБi{ил:œТ‹MЕ ‡ПОx`ЬmEК‚АЧŠE(lƒљЩЙ]зь3bІЯЬNŠlHЈ ;у~>6SЪ%|˜щ{w E'[ezO№]?ЉюvА˜ЈќіnoъаHXoЋ8“>Я  КbХ*‹mЛдЦ\к!RZakš^ѕЙЏ‹ŠУdуМуGorпКЏЭЯn\„Г#оs№$Н>NVКьЈ|ЁYЂм…{yЮ…5В”сєћƒИЊ[зY…SНakpУ.|­<еБЩx'LѓЊЉАВЈыЅoолшgњНС‰ьС:nяЖuЖLƒћ_иЎ'жИU^ЃОœЂ”0Ъ*єnЌ J˜ъ шŠМлRЏ•Хxzrt(ОfО6ОIv˜,—9<КwS †ц8Robyђ(.бК'oоюYа[oипЎa™v‰Ш9e‹ БCaˆО&MфКъVоxi6Д;Ж>ДеюškјЃM=erбч4лѓ\7у(pr’› ЇЬМ=єьi’№w,~P2cЋ–Xa™)5{йLdeнЅ›cP0дэŠ@зa%Ќ)Ћм­ˆ&MъjГј“`ˆ’5оЪЮ4з ‹–э'wO“$Ћ;6с Ьц­ƒЕ–„хЊm­%ŒгIŠнjФudIB{Ук‡н„m=уNjтjЂ(,fГ9Ϙ<є~бHGв//­л OщшІэ/йХБ=Mўž­ШU^uUб@Q@9ЂЪ—)˜рСКbIЃnЉƒ†mЧнЁUC1иеiWДеAЖL"пTEŽО‹0Ўщ`.Ž *|ЭMЛC;œ*%2Ѓ­аЊѕšЕMЋešЊBЭф.+ЖЋŽлЌЖ‡}-ђчЖ\Ў‹-[n|Dg™цƒе5'†aZЉ–‘kЉТx0ѓ"Toxж л†tvƒ•LtьjНЦЂ"\:ъx0Zp<Џи1”„бp„Же7и§Š "”qяalxVEž`#юVs–›6 N˜<:§t:œ €бqO‘Юх‘WГТ`ГEдF[`ГgЊТхЧ“Щ|БрdЇ`[ў‡Д}8qѓœњ†ЬЯн —iš.Q~НЅ‚З.RпП:Є!˜оВЪcЯв„ЩхЇЗЏІdГхEеЄ‡$УZПtЄПХ†zю)ЂРѕпНŸp7чДœNОQѕНf‡<К^ЦP{ уЉЌއ ц!огhаьЎ†Й~ийoЩі’,ђLe18ћјўxАdM7L7HђšрћюpЪŽN?`иBRШиѓљ‚›|x3ЁЮ›‹щŠКЁ fаv –тu…Š aЪСЋЂrnУсШМ‚Я‚{oБ!Z^yŽ.ŒЮŽ>œ YЦЛ N€9ЋЄл)[ж"лГ]№k„нБ0™ѓwўњ\PM…—SrЊRАьfЇУКбIo!иžххш6TЏm(дRь+Њ,‹]}q~:gгсещбЇуЋёBЕ’"rzsDRTaк?љєсУе”ёўa кЖŒќЯ”рy]Јrq…aC\Єє ЫVИбћгgFоtС*‡&gšэюƒб†/‹"rL‘ч†———WWчјVŽFВћ@фСЦdpњщэ›_;щO‚((љщ`vЯT‘—аб ьf4YјъbєцdЮ;IœЕъZђц!˜і‹аВ?ЮђjщžcJЃуgН!Lіћ_^ПЈІu0§ЯFмПъѕ‡Убx4DEѓк§›ˆh4]BЃqлlЩѓсoчœшхys( …7|ЦЛФГ Ъ ]оЧыЬjџгеB”ХЩхё‡wЧ#^}* 0њFo2TXюVКfЕУZo|шеU$Юћ бЭыюP№Ау-ыžЊяЧТўfAЫHЃрZќхя‘Ъм|њewБe\њъфшј|0$UИй ?СKи†щW›УўпсоЕЙWДu Юћg#Ш,1‘hlXЋ‡%АR:А<ьpYT˜ЙI€кQч‚a;Ўm;цнџ-Џ%'ЋўQыUš^] жrНЛЙЁ=чнсЌУ kИКК<љлїŸf йБ5ЈН&у…н‘бЋУо˜œBЙlШуоppuyvz~ѕХ—Tџ1 ђЊи;Йœ№ФS?ˆšСToЉзWі,qt•#rѓqяјѕw?ž-еPDŽ›ЇœнQsgНХГUxCd хВИ~ћщјєЊ?šёЂˆчхGЁЫАђЋsРv3‘ŽSR‚$&:Љ|{ЈЬб&Іј№|tўўo=)Jx№ЪBpК K1t­oЗЩ[™WЧGчН /ЉІућИркAFЗ “5%Kˆ"Х€(›QЗПЁAЗѕ)LcAЮвЁЏ‰тBОэ МРƒ‡Ÿc}Ає oцтE3[[\ž_і' IƒCx~yž-з} ЭCˆ–g—?^ЭxnŒpOГ—[ДxЗZяЎ'ІЖtЊ\rƒ ‰~њёŠу!ˆœќtЙЭ’ЪHј7ћы[\РЙgJУ“ѓЉd˜N˜ž0УsЬЎЃ?†бЯІВ8я}xwСЉКЎЪši9оФкЏѓ(І‹Јь„!vЯ\]ЗуВˆ?Эy~rђцУе\в‚цА‘…'F№С4БmHНГ‰ !)AК)˜цх2†,іЈ|LЂс.ˆ’eБТ]чн:ї,гЋщ€2nз вvщСrщЋвќќs>ы_œ9Ivr<­Ž7ѓ›рЁњm‰Rіч $иї\ ўлІe>*;1oи^и *йпoёШz@…Ћ‡ыkb(Сеељ2Пр%н[&І(Ž>}OЇ еВ‘рquЄXс>c‡-“uBЉ?ъЯT;Јъ ж\жuуQ9!Ч*]owзЗџЏпoсчЖ"ЊYАГцјЬ+GтЦsQжМФ•хљЇЃ9Ч‹‚ шR[*­Вe–Зtp•y†ЦѕЂсMlp#(/fХўТ†ˆвtУPEn:ьDЄЃ'nєNF W/ФЧГЇљ‘љъ`<љ.KCлЄзLQ f…9жз…Э#^5=00…™f=ЎБŠЧ]Єн7 ѕЯVњПsеЦCцaфЙ–Щ’‡Њ˜€ ЄўЗ’ОћЧр4ЈЋЁЖvlР$ьЏ№ДдИ"їo9Ы4 J5‘—шГК€№ёoЖќўЩјї‰ФOуi<Їё4žЦгxOуi<Їё4žЦгxOуi<Їё4žЦгxOуi<Їё4žЦгxOуi<Їё4žЦџ2ІЪŸuйцQ† ™ъГgs7№­џgчЩ(ŸЂ ^љк?‘љ7;З9[Ь†Я&FTфЁ6š8q‚wv№p=ГЯKІэЙ<нw‡Ня‹ЦTГlЧf’›ЖMЂ&nœхIИ`5‘ѕMЏž 8Yљвхn’„жзОЩї ЧУШUD#,7MЄЯ8/J—`™ч ЯNС%F'c ™щЛUНДTЏj–ЁЇџkЯЬJA”чЉЋjAоn›ирх ТЋЈћьЈ7ьœ$+ЊnƒBзQЖоvU9т•­џe2МГ$5 ЃњYнт%UEs}‹9ЭrдГїЧŸоЌxY6MGђsH‹М­ГаџзмЭYиЎeЫЯІvX­КЊ@†џЎŽmMVељееDЖ\зўєуЏчzˆєkЦиŠЊkU`щ_щ–јџaІхzŽ9ОPHi№к2 ]}:чyAБРГgўысQ”+д н32тнjщ†Ь8Йj@ЧЋ-ЫЬЕцŸњК ЁЫЩ‚lK™‹КуХYQцО=ѓzhо dьzx“rл"-#]їœщ–ўЇ…яh:А№ 瘝ђvЬKVв pЄ)+šfњDџожЙkN{ЧЛ~БХыф7ЛнѕAЮж@@Ьƒ# |шOJњ Мv.Д•гПs/‡ѕvЗ*#зE’Зš‰Љцž9~їajљHЎ‡\‘ћ›=гˆЯbпž=Iќdaz_?хŸŒЁl:Ž›­ёк[џЗ3х*“v і ,iеP|KМџаSНхjЗ]е јѕЖJЂеЂхёёVЊ:›ЎыZ_§ЮЮD3P{Е/,ёђз73?\fy<АDяYCт[цu›˜ЊЦŸїЇ*ИЧЎ+тДйнЌb[сEMWХў‰рћЁЋŒfІыYУ&і?Ёa9с•ЮR}јўѕoS'(ъ†є+жM‘-#п1ЬАl"Uф{Ÿ'†nƒПуMU?эіЋдтfВуЙŽд_8iZм@Д№Іюз5znYn 1lГ_j“ЫГ“ЁfЧEУ4"Чv |L7Ћ3[UІч 7ШкU›…ŽnВоЕБii–DЦhсФMц*§ЉщЂnѕW5zЄ"ЋxЩЂёUIцЂŠдз„ъЬрњ—Н~oЊE[/=S €ЂЖ]ц›ŠЈXёzПkQœІЭC{8ЕЂЎtЭсШrƒаўКVxEUЭЈлl7eKJ‘$нq!RЗuЄMоПЙ хUзV!ѕFZP­Ы@Ю57*6LУa‡ќБ§Й“ЎkЧšŒ Я1П™p‹љœХk1ˆЕyиš$HЊЋ62цЧЇВыЧYгжевRЦŸš[Ў3‡;9QоЌ‘8ђzЛлЃFFчбЬРЋ^†Ё}Ѕћ•œnш'‚ъЗШлЖ]зЫРдf€4œbнХІиBўЮIX56ФЋ3Щ‹ъ.Ељ“žцšю6лUъ)ЂuЛЅ-œѓЈЯ‡D_чн‡kъŠЄhб‘ЯYЃMsr6’‘ћ8ЕЄбФ„иВЬЪЊLleмW§8Я#[і$t‰0oъШ– oЙн%њеgбs]SEYш›І e‡яš†nТюoЗ›&%ЅБ`.Wm›вp #gI˜B„pL~Pа|Яœ]q№Ээfјt[њ†jљеѕ.QЯNЧu ™уDщоzUџC6-Рћ1$4'ЈažЏЗЋФ65i6ЭИнtЙЃ gЧв0iŽ„`єEODE‡0F; *ЩЁбЙ-+vдо@ЈП:—-ЧQЙ)jК žˆАYƒŠ^А\пмШ,UXЬЂV]WљšићэЗ‹aђ  с]Яйхˆ[ .?Мš[^BЪШ0eђшвзT'—ИP„щ\P]“yВEp(@P‰,ˆJ’и^Aq5CП€žYЊ4ќјњэйљ‡Ÿпœ рГЬћ3E•&gч ‰dл/‚‚Giqнx|oŽСs"Њю†њeМѕџлX йVе­P5>I›kda]Х:'†Ёj[›йš&оОЛИ<њщћ_?ї&ГЫKA7-e|”ЪlЊЛaЄz;АUVэИЛОо$ъt8QTж8T–Ъ0еLДШ…МпЖeЕк!9Э:RЭN*&J[ЅОЉ чgущеoпПЙœ м`(щAdыšaƒэЃ‰jELVj“yЄwйЅ+q<.Тв]Т"зБLŸ '"дгзПп‚3cИнпомlb]6ТšЧзH3W†sYš~ўљђІТƒЃ†Pѓ:^йжь]J"вћu БМл]яWKл0эўДъšjк†ёhЂУ<7А†Hн zw0зА-Eїr’њ‚ЉЮ|KхцЊЁq'oЦрЂЊ ЮcЇeШЕplюxЈVЦЌ&‘DЄиыВ4Эл5ЪуЎWU™6еВe…E‡ѕрЋoЏ7ш)Аu'Ў‘'Љд!кЮ%г4ФудQА'ŠюUoэZ‹ЃЂ^Жк ’З"9ФЭѕ†iЖЂlQцъфеcгpЁЖ ІПп"Яп–XО›ъЋb…яWz*?žˆКešђљЅj&&{‚ЌЙљjГk}{ђс CDšЭюfЯНЎYйxНяPR 0X}™„Ф?FQ‚ тhљIЇђfжO—Ž<›PЃ[5гƒТUХЩ\еP"cНщBЈOHЋ•k&р НЧŸ№л4ŠтЕ`TіQцz(kše[iEur'Uхfг1I‚кзВКОoЋ“О`ЄЙ%/ЦЂf†jl–ргЧШDЇлaНПEšp˜ш=кМпT=ГРЌ‰cшб  ВЈъHЦчQiKtѕћkЦINR8›UЂњcфЈќpЊyeЌKЃKA5P>oЗнеЎ::,$I­d…4Ъд AяXemШ |р8I“абƒus!ЋH>Š*Яиdv/п<#&хЁ ˆЈЩœИ†8JvZ~4CЦ#B6фЬ‘ЇЃϘrzиюыіК%[ЊСмё}пs U§r ЌЁЦT‰цШЉAЫ4ŒА#ІА 6iGєy™yКȘ‰vкTОЪ_О˘/Јщ˜Ѓ]:šШ-f3йNзь)э)zdˆvе„wБLд}Š‡‡ эЙЖ­rЃС˜Scгы` эWuе44з$їд"-Й ШN Ощ*врэљl>рjзœaYвŒгмИ9PšЃCяъРDі4Э‚_4]WEntљхFC-&IшйК8щѕ†3NPœ }БЭѓŠzG;&W ЈФеeЭŽŠКЮcK•‡Ÿ&’‚yQGкwЫаR5ЉЄ0vьPEъz—Yh+` ž&ъє ЦЃщє ы)šХiЎ‹ѓq0šInƒsдцЫВл2s™2Цv"(ЁnEYТЫ#NEЙIMI8bU/Уy֘,Ки~“ŠJxCƒpгыfРнщ—ЙѕTв‘^>ЋЪC(Ч-x5\]яT3ЏW(€‰ЂлѕjГЊ2ь-5™%ё'LO:ИШТ“nXЁ@"MzЗоЎ"MС‰чцWчƒ™€фФ2”__bєL”сёA­TжPИ†ІAхQ,ЈЛЭnн­0TЏI[‹dЂ+™АЇуГ7g"ŠќС2s[jѓ^“$гŸcB#ЛM^пPИQяjД0ЖТMћЋчPНЁВˆBўEBр%d в``2оk&uŒДВŠ vma ‹Lѕш§…Ќ (š*лѕžuЈЗЈеБ'}’žИй&Pž)Њ*ЭњWУ…(ЁЄЯ4О S6т…) ъHFknГНгx'9%RшsзЌŸзжРсSЪwt&Щд#ЊъдwСИ‘wзєНшкЙ& ‚0ЧsžАН4‡ЂЮеž2цљСъeG™№ 9УьfтЊL%5tQˆ2  пЇYбБ1ќ†ўэ~ЯмbCЁоўКu‘›Яш…ІуТтUвdЁe>д?f<ј—.ѓsm"ZD SєpЏIV%јPєpƒ"ЅАБ йеeкЊ4џt&)V бв‰Zœеі}Ь№=‹{XхjЊŒ Т€њёЋеІЭр[lєžФOMсІ`6@4+щ˜3n™щ[’ў:ШЅ’ђoK™бS%ЈРпœI*Užеи; ЩнЄ “†'UYlћ~˜d%д2€ЕЛ&X‡šќРЭUн=ˆ вb2ž ЁІ)™, Mц0Йb&Им4uЂ ѓбеЧŸ.$еЪpq’%ƒ*DŒ‹rwXћ OdrAЁц)"ф™‡…ъ)QgЎЁ*тlxuy5фЇР"cEъЄL/xC"$лсZЃ#E˜Япўx!*жž7ырAА#СЯƒb .Ш§Aђ OнеТL щж=ШhъŒeлežЉƒй‹IяЂЗ№Г'Сё;]ьdO„Ё› в!‰Тттѕ)D0Џ\1цƒ2ђКл ‹%е[ЄгЦќіМRРЈ†К@б)$ЁzP ЃъV”УC‡‚кB§_Iф ќcЕfb[w*о;мnщH‹хпыЊ tUVFпПчХˆPэ'xЯЌHЏ”2 [ј€[RОЊЬzAŒfлZ‰PЕ&х•Нк2_&cлnRЏйѓdЪˆ[*юL‡*Ьuг,}C–пў2фEХm:&ЌŠqrCJrŒі›ъќПЌЇЉФЖиыOE№Ъ<ѕœ‡ц]wу eIp З›n}PЇYF\–ЦЛ-mn‘ vS,mEюПњљj.Љ^гb<$О}0š>KOЬhRЋЮLU\Ьg0ц‚by‘ЇcъїGжcCї—M•‹PjђNiѕОюж!. mз К<ЪoЗMC уeсЋrяелЉЈ˜Q]уџн’j6гіл0ьA>Ю$+GA6j@JšщЅUц9†ъћ=ГŒ Ќbз‹ЊЭў DD٘ќsC‚сєIКv…A 6u…Ѓ.r_–ЏоCi –UГоnўФ2шCЏж[’ю…кR§iйv…‹ФдѕћGН™iFU РŠ+lx0ЂwкноmP[œМЕЦi ЂсЈ–ЫFюKRџ[0к№cдЙKЛƒЖiКЃЅ,tž|:ўƒЯо–BбEžў€•8гЭЄJMYдМeГaŠU”с=VБщ•E…k‹aХ/М(Yц™ ёЇOP PЄлvPoIrwCjвл™mшњнаЖыъФ1ˆаўщeЎ[I2ЏкAоЎБ Н!ЧФ[EaоДkRkQԘ”ЙЛ:uMл тФ–ЅЫ_PФБ1 5$Mјl,fяXQМa;§(ддеyЧI@ѕ хтC`ЇqBJ• /.;zeіPqŽЈщˆ†tЄ7гŒЪнШv `Э3%щєн‰€5‰ЅщA…‚>"Њѕ!d2!PtnЈэ7<%Ч6Yэeтшbpџg:вЗ3ГЩ\пeoі‹-дbЏ!>cеС#6Qнла%ёєєrЁBMbъNFњЅДM‘†Iї‘’лŽЙЧfнЄ€ В”рА8?~ћёъFkf’GІ&‚‹ѕ5щ‹АјКa ъв„ЎrђMSz@u‘?НМЁœГэЅ-=њdЈђО>@ЛY-бю&§Ћо`М@mѕёљХCJrUЗ“ed*ел[ж.нГУ‚ЪRQЬ2<цбb6,тРT…Ÿ\^ісi91:FkщqЌ˜њчц ЉXWI,ytrєљ|@] юVЪїGPЭF1РqCгQ„‰ннрЪЪSЂ8dС*ё3єm4КІdf*‹Ы‹О`КС=|2HЇрЪQу§№ДЖ Мн&Г•йeТA‰f–eуИџ O”Щt]? М mЖ{2šD[Xл‘RъЭЉЫШt ˜ъ†вa™Ap=•зCк:1VœхUSaЗ“љš$І™Ъ Umm еŽЌA G*ƒ CЯНЗЦ*Џ›6&Љe^"ўИННО!я@єOsDю‹Ћ-|E‰jђœв №UZYYW0ѓшы}YЗEVЕ”ѓQЛ~УЪRСEся"pm7LЫКЂѕW"ЧОяR<ф€ŠіIГЦ%ƒaлр…>Œд9OmЋ€k9јvƒў?Ъ" +dўіОC;Ўуи?"’В-й’%‘"H‚ƒСфprЮ9ч HнЏU}’ŸЏŸЏв]oЁСЬдєЉЎкЛКB…FЅщШ)-В’ оєqД]Яo {У0&Вdќ›ЖDђе$ЖuпћљŒсyNжУ1ћЇOН>тЛЛ]?ђМлxЉO VA”šш5ќжo/JмЏ†ф‰!щ}9ќпіщ€=ЁнїжЃё6•З^1^EідЖ†}†PЃш‡у‰bзYжncУ6$ŽаГФы",ЙŽ>6їэћЮрхЩpOУŽЛ[0uŸ?О=МЧО‡8Ѓр~8ZЅqurЖД иЦ„,ЩЎї;8ЛiРїзф‘M=\Н&со…ЎяЈ}“ŠїЬ4”u3Ш яnЩhˆІ,›_яјxŒ N‹ЎЄ7пў§TH"(~%Ъ ЅGЈкЛ•ЬтФ„А‡я6d—oіПAІўAWа$/я™ЎыvЙПƒС*q Lz$Б­ы'm ОC}ЈИПО|ѕз3)G‘‰{$ŠQRЭ д L/Ьдщйиэˆч'Y|ф(Й?№E„Мћ^p ™ЋрЅя§d>{YэК,ђЃ$ KZ2Њ[оy]wˆашSкŠћцхЋ—п~”{!{м›‹ьYuІ\ќ№э;“фnћйф6‘@a;0ysжЛ&ќdцО@я) п’­.Я‡Дb„эю€№(Сlб4ƒaVОћъе‹п\К%йъВФЭ…Э’,ы7О0/џіѕЫŸ­ќLƒƒ4{кеЯ Уэнu№nАpЮ{žDЎ.‹Ј—Ž tпХоЗ‰ЃŠшУuгѕЯЬУsїš’ гаЈуЗW+še8РkŠЂ‡эМЛоѕ!оо4‡/_ОzёЇfКё‚ŒЄjфА цЄ,­С_^М|qQ ы“вСу§ЄrВбmdШьGobxоZЁХћц V SєхёХšpКšЎтНVеƒіЁЖ„”ш§ВйŸ^О|ёѕЗ3GЁq%^”І9~мьœћљы—/^N‹Ў;Иtф•ЛCЬŽzf)ь’ц€’s№~80WтЙ{GЦЮЮІЋХbКРьPˆІЪ‚be;2(ГG xbаКSЁџќђхW/П9гspCš†N u‰b—ёњишWTƒ? Кб5]ПHКи(FбƒKєtД„ 8цо„ыь’|ˆЗmЫВMMŠkDˆC[кіARтHšVњЫ‹W_НјЫЉBцYŽ—ЗaКQ–ушЙВ —пПxљъЯ<ШJ в—Ж“PгЖє4М“SЧ „їŸюqХjђ гіТ0єC–DQЕ’MOœw CПе Н1ў'ёЋ?}аˆyžei”Ф^˜тЗY–‡ыз_ПzљqГETїI$юАН šюЖU$Ц Ui9œЮi^юпІ­–сœ;œ‰ƒј$dе‡X'sŽp ŒрєИЊ;мЖ№вІїŸ­‰!„W(cЬRD–ЂYъСщ„Ђэ„IЦšpЧ‚›˜[М;DЏ$њо‹„Сu^Я..—xAЯ[9tˆс!снkкњ`ъ:V76СƒЬуЉ*‰ьC37šщФa`3h*\PЎЖЩЕ1с‹лУ-тЗ2ж9–^_ž жCSДœ"“$€>зuПг№}ю™оRЊ†ŸЂЮїˆЄ.‰ƒмкƒ“Х Х‘ :J3˜ч†ФSLћkэ;‹§kА]_(ЎiŠ}аœ$pŒœаН}&ёЛўЁ+|ЏЉ5ЏтР!РŽd‰%/жSПБHЌ‚—№-]tN‹$=бOЫC!8I§иѕ|з'$cДдчж@š–ч4ЏщŠ чфЮ“VЉ%иšЬRUM“˜ХRT5+@> ИWTFЯ}`+k8)œ*df ГŠХJARa”х`Ћ‰]ЙЙоїw-^ИЕ>O‹Ђ@OоMХЕ57GwŠ7aлУ]/њР&д% ЏКТ,V^ЄyžыњA'ˆЩк2№Ќ‡хИБІeЁmъ*Ϙ2М…х†iIтц5žЯўvŽ„›а€ЃF‚6ХŠ щРЉ_Є;@ас'xˆqn|EQлР{Я9§˜п0 лѕ|p ›иЗ–БЮhІ8†=_+pаMЧюІЯѓќИd АПR$ˆ, t2w лцщхщХšбТ$oфоТИЯ№kWтEеФЛntIс8SM‘DN`зƒ|SxцгьeУrLCSФѕJаMŒ6љОяйИ'Ксхвd„˜>BгaЋ[мяд\^}|?Їх ЏW›эсNЄ‡”Ж$№ <:P fЖТ,\SЏІ4'›n‘>XhJУh)Z{VAkgЂИ†ЎI‚ 4ИiwЗ0кзДИDjyќvAЫqC87‰&ѕb“hk˜2ЯcaŒяYІ* єb>ŸŽ‡Їя>œ_Ю8 ‡Ъ>Lf`/@и8z ЇC‘˜ћСs }ЎњhП6фўDkЛ>&[]•‘@-оŸQŒš6$КБiм(ќŸмQE^в-ЧѕЃфЖTzєёУЧ‹яŽпМ~wХišѕхЭ(FK†ev1ЙšЌ8d ›Щцp•iВ$Д$›\6MШQГг1ѕДсЮх"wmЈa*/ЉCL_†Ў­3ЇЧч“щшќчŸо],ўQJіGГљb6<;Ђ…вuнєЋэ—ЃРwё‹]ЗшГдl0ЅhСЬл/#i‰Л>AЎВIіЛԘJ†i"ОЉЮ/Ї Я+7ˆѓВЉIHЬ7Й5Ѓрyсњ‹Š/$МiцŠƒsGP“ЉХt оРЋШEыю.3—$Ž&€ BЧЬоžЏжkЦРјбоЁ•м‚)чРJ›N/6>Ÿ2дDœXСпЪ>hЩGdgкЎC Ћ Y К-WœтTфІc|}Д–„йР2‹ЅЦ?L­фbIlA&АЫM‰YaU•Žо™Jге@џ0КуЛж—LqVР4{.МT˜fƒоГЉWЌт6зПšш_щZН<ЂHcщб›уЫ9Ekyƒѕ/M/єОПdnC]dhдGб,Ї-Zr%‰”2,ы Š/нŽ’$M“kњ\ЌЮЧyРšЂcйиюІOЂоšрЗ€bw[ Фw?žЮA=Š2ВLЗм’Ћ 4|ј ЋучЬjAГ<( /j€ЭКž>ЗUb}‘СD$HŒ-t,Нs1бКb%Ц“фЗ};Щя‡ЭюRSEYdъјЛ ŠsђШy5nIuВDЇ›и7њm-?№ЅlРЋддлњЂўtКэХq€ЏЏ`вјeк1Pпєъq}—жCЂљЁШ›—Д|§§хšНШ”8šГj ‘Ђ“9\WtUКИ,xqfxЮ‚Хч$yъšv‡ИDЫіKWиХ|6_ЂƒАгvF Јћдг}Ÿ,<МЁЧ‚І‚'b&?ќ4Ѓiеw$Р+9нѕд}ГЛГ‘иŒЌШвЃFŸO$яi% яŒšџЖеЖЋыќбЧѓГ Х‰XіІvдєЋ7‡‚ђ Ше"Xh†ZЂ/ПЗbEгб8v=Го]ЖжўЮFbаЗ!Љe–&ON'Ќ$2№“jрЩ|$&kъьшУh%^X ЯARt$ЋџњWrW‹Eр}№j>™MЎо~{Š€M~=ИЂ­nзЧџ€1tФф`)9ЬпQИщЧ“Сh4 .чМЎiыB„uТебЅX˜Џ‹QфnKdОСбОlНODкўzлГœо|ѓэoсHr‹ѓ1cVЕЗ=пT)^Or4Ывєђъ ХќП—€šЭТ19:GОE”ƒ(Ц Ънчa„НŽ œш|№ѓпЏР”i ЉсЧ)g7Dd,‡ъя"ыФgХO/'ГХr:SР,љ‡†hўiёšЪЭŽ–и\Ќ!+?mїН‚`ŸRќ92Л>+Ж$xoaёvФБ,ЧаЋёЩЧяД$rа'џ Ш*+DЮп€bY^6ЧvѓQЪЦžžM—'ИІhРџš_“ДХЎн”{<‘„™wU–dsd•ЙГ+0"НИќ№aD‹1 ;"& ыz“9Њ@ЭFУбlЭЩрЮНРЂа5ŒGjс€ ыl0œ­Јхl&D‹:T‹:tƒšмuнbПэІіMУKЫдU@CƒЫЌЧЇЧяЏW$T *ДЉ*ь-Д+}M\]]ŽW<ТНлfи”юўЗCџv-YLЪЦŠŠ;FtЁœЋЛЋѓE‡‘ЊОЙОнzЊBkvкnћZьэ…цVгЩ‚$A .'œ )ІŸе‚KЗ›XцХ№J’Ы”ž0ЊсFАыeЁ[ цј†ЗŸў ;u<Я Ћ~Bb ШL*WЙХhВdУ ЋЫб’ь дЕ}Р#еБЛžж PЗЙЪ/W,5НšrРh о}ŽЦrLЌbыnљх—ЯЗ‹i]k ЙyзГЦ0БРЌ@vry5œТw‚ŒЙ.™V№xр/tПдй"ЭˆXЛ\sРяѕ'hр‹н_ЂЌ$ еŸ?нДŽІЬЮŽжМ Й›_Ш^я#UцзѓѓП}єЭ›Гё@M1Ш Ў_І‡YѓЊ*sŽ-„hіwœо1чuЏh2Œптэёт8Сj>‘О–з‰*Ў†~јњяG?žЯ 8ѕ;2" sБ0КЕJš*ВыХ5pўз‹вl?I€A›ќХ1ˆЦВМY}ўxщтњђчoПўюш(šЊY>–Ў‘Њ!№JУЉjD™ЋkOB џэb л <рќьеЧ!ЈД,ƒŽп`жлыжз$vvњЗoцЂЊ;AZ’†šзœ ­ŽXг С$>MУщЛ$р–&,/S[шv+БЎw5–›sУ–ЂЌћiНХFsз]‘Ї2ХЃ1@/KљC†ЃАВ‚-ЃKQЗА~ЧЛ}›GqZaџ'WW…иGрˆnBz|oЋаї= лы/Буия­џИцРЗ\ЯЕ]p/]ъЉ $8щ(ŠyаT1ќЂлэКмГБBЃ9Я?љ†ЗšnИ.f­д›ТSз<{PwРЭиrfЪ['Ч’ЁОа;щчАdCw@ъ0ЏЪа’&cL !З`ШSЇиš“ќnWEшапрI–dšф&&1Еg„ЩNјq Ёь4ЫRŒ`– в6ввхioZ†aƒ^вђrФ*/ю!X€Я ьЊ­"Ч4ў˜1?џz‰:і?‘zv5уU@TњfБO‘ЌйQ‘ч~@gЅ']Н5˜-1Fю8@ћDbГяЭКОg?<ѓi-ЈІу`’…о ЭЩŠо7ы€GёG лњЏСЁ„щ5„жАН!X“‡Жэ{ђХj$ЋŽтСЏE "ШћПyњ &Сњ-ŠБІŸœ>ЏчѕМžзѓz^Яыy=ЏчѕМžзѓz^Яыy=ЏчѕМžзѓz^Яыy=ЏчѕМžзѓz^Яыy=ЏчѕМžзѓz^џЏпБpхжJРŽМІў/Iьў­йЎЋЉОgPџ"хxёј]Оd­xчxЭп\)иЮЫљ‡Тu–З§8rИ­нw”жг,JЕ0aкvќВ‰ѕTuнЧ“оIНšЭ8+Ъ"ѕ4Уѓ/eБ5 М0.Ж]drKеїьœvшУЖš чz”енvзd›”Љя˜Ц›IMY^œWEeUЛkqhт ЅkдŒљјbЁУџиьЏoї›Кlw›ЊHBы31 МѓЪ ђЖkŠЇLbЭШŠЉщhJёŠF'ЭЯšCзx2•oзфЁћ№КЊ‰GcУKШ(ФнЎ-cЯ–Fуе|ŽYі–Ѕ§№ѓл&э5ж8cЧфэўцf“ИмMч?]3YЗlKŸŸ18f'ЈtiшƒбИœsП cіУwяY/ЊАеЪчЇ—иqЖХБм„Ьkе0Cи1њн)%*и>o[{ŠЄˆ%[>кŠ2vєХ›Ÿ&fPlpдd?M…Д}Љва;lѕђwЬКgг‰ЪЬ1–ЏпNV”феЛmх‰œ$+VаOU(C[§є–q§ЄlƒбonnqœK•ўЁJg->v; џзЂdЭp’ЖђMip<%QёынОЫ _V6dTzYђ№ЭЛЅю€дUŠ Њ<‰Cз’FG+UaKAљ} Eь6]ЄёУу‘сјžŸ6ию[eт ƒ<‡п3пV@шБфјy•Ч!VŽo‹ШїK“ЅхЧ‘юК:=]ЋКў;œJ[а%Э.зшСЏ—ŽŸ•™gG&+дe‚˜uюh?81*ЮхM\ЭЩЗзЕЇr /iКСOV–ЙЪтJА уЩЅ–L0yГн%ЪќьнЛ @ŽВСжТ›M•FиQЂхЈŒŽŸ,р&m—:ЃFЭО 5–Q,?zeФEhrƒЅnшO-ѕX6m/ЎЛn›ъ,Еž/(Ei^та…@“U]Ё†)ЌrC—žCлЄŽСЮЗиэЋаВУДЬ#—Zщa[ИЪhŒ§ЉQ­hКЛ‡нGuEтyСАl?Ьъ:5™б`tu>фьИЉ[чœw›м—Ј5ЇЛљюvњ^З›:ВW”vЕЇЯЎdн4uх)KЄЦрŸyQЖы=ЮЩŠуGAw’§Mfв3еTšХGэё§ыRTнЫРM„aкb3Sи1S•ХеJT ‡kвъtŠ“ГuА0ЎЉ,3ŒІЎЏгы~ќэnW8g8ХЭuІЯOAх$žaEEž šŽзtгЫъ*/ЪёЈІ%ѓьzСinоtu`Hєрѕщt1Ÿ/X‹ƒБq,͘SЬьŠ2АюOс~—š,gyѕЭ.7—gcšхА 5xЦЧgёVК N“йьI_ажзDzMБ’•4]›швђьЇя—рrА[ЖРMg№л|0fщљBЖМВŸr“чFwЫ§uуАЃс|Нт 8Vє‘ЅІ5Эt]/F8ДщгзЎL­IsЂ LЏ#ђЋсёgгљш§oЮЧѓеш‚RUXЌ$EZЏПvЛэл1Є,лоlCi=_Б,+jАa]}мnL Х4§4SœъДЙ§Œ§­JGX‰†Є5РŽЪ•AЖйЩ”уЉСoЏ5Йb€ЈkЂЄ†МZЋ. 2й>­ X1иэЪB3ЏЉ†Тiq4ѕ1ћ^M%нp“ ќ ™ё{§щ3ьtх№АHЖp*J VBхfŒЂŠ“Зч ,ЬЗћІa{–ЩM9TlbОпdЎsізРМ,нrqDXЛЉb[Q;NРеТaльooАец'иА[ь›#P’“‚[&ЃР k<%†В:™’S%†“мЂЪ’Ќ ,uО’­Ађмkl1l|ЇQRFУV‘Ё<ž‚Ј†хчŽ'ИСV)Ÿn6иViЋЏ{iнЯГ+}]b9 pФњb­šŽ&бœfЮ.HMmБЈ7dіѕѕnSDaж—Сж№Є]'Жл+ŽVOe0ЂЎcуrТ0.`ЗїрѓŒ\ЫKpPDЉЬ‚жьШ7Фљ\ё/1Г5ИˆZрЙК` аtЙСOМыgа™З™Ћƒ5m?ЭBSy$cЭ+8Œ;ІЅыn§‰t|ФqJm™Ѕ%™–š2Ж”K=ŸSZœhќr*ЈЪСЮЋБЭ_Ю‰;AOjЇу–t}ЛюR[K^F3‚§ ЇЦ ›šСІсЈ U–є˜€Е~0Nv"ƒQЊРБќ,L‰^‹N( <6аOСЇ€#:HсL+jHSs"4l4ieЙОКЂА=6йЅG@NЃ5ЫГд’bEкд$AёpЦOW‚m=ŒбФ^ћu†s [хiоJ+OfиЏZАЉijёУ!вOBЌіРКНнФN—’$Љ@Ї~ЙЬGі_рзГщ‚Ц‰9’ й hby!˜ю~цgзЯпУy’/YqUк2wљі`Хщ9 Є&вW“5 Љ СЮœЄе6Xќ@3›LЦ3ŠfElЩ>`ШьUfцуЩŒєU­„.|гђгšЈF?6АkЫЛKЛiU–РO>.xŽa89ТaFUІpФ€3пaчg4@7ЗŸЖ FыеlЖ\ЮgsxuŽЅ:љюжDгсж—с`І8ОPђZ8ђ…oшv@іК‚S!абЅРзи„Щ%'I8ж'шАЯsЬJВГЭѕaЁjЗЎАZЌVMЏ'—Ѓ)ьјd:}ЉмМЊZa‡ŽЎ№4E­Б#v Vk_њ8Ж•LЉмі=о7]'YQзE`iЂР /EIЊm-AџUъв[l^П#mwЕ+R‹еšЂзыщрєє|8[ЌГѕefЮ†х€ PlE%јs#РЂ§j7d&йkœMлдMсˆ,ЧrыгKQЦў5nˆ}gБЙјН(4m„dЛk}‰љ?ь}g›зюќ_YkЫІ­ФLNьЊЛrЮБ+WчЪџ~œyїоНо&)э‡9z$ŠфЬ4ъ№РЫ!Э|6КЛК…sУУodUћЌє Z}?ЪЪІЋ‹Ua˜UЪжІŸ”Ънnїь,"УъК[i‹Щt6П§љNQэ(‰BРIˆ яйp~тЬ ZјeЉ’€\*ѓq”oСKВ„Ѓе ыsr cЋќG SŽŽэдІL“ щŸˆR‹ˆK7Фжо&*ПфEaќКЇЈN’ЅIжьхЫ‘Hp1“wџАOux-"gy$QVUќЏm~ЮћЫЛ1Ц­fGь>xsв4Ldђ0HЕ&zГ*ѓ еyЇ(NV@фаMЧёЙ&H7Сpн=икЦ­цІSbEœ&kIYчОy.•мХМцб`МD_хЇ5Я0ъ„2їŒБŒˆ­‘-nƒќ™€­S>^+š[4U3мˆ+уИCЂBуИл8­p˜:уЂ„єt:g€dк"Вэsg6‰H‹ЩˆHЭќИмп№§щ5#сЮS'6]bП#ЊвабўУ-˜є !ТЙу‰K€6йQˆ b—: \йЧ JЬ `ЖmŽ<’ж™‘з‚Y .o‡KЄtєЂKШЭСP;ЃаdЄ(ŒЯzCз‘.KтьЭЌКеюєхLі8u“8UіФ“rDВЂ2Gjу†@ NЃv- к™З1’a…!˜мХнЧЫСBж- Cшћ§zЧxТyP2ƒ8Я‘™YЇЛв–nrѕї;YБ L0: ”™и6qœяўзуx$т1Тldэ6uYVЯЭмh†›U™­Hѓўѕен`ВXQШaСHАO>HЇХL^‡ЌђmaJ"7ЙDЁЭRї2n F&А;рyобзщO{FДде+0КŠZ•3Џt‡„Ђm›š,ђ`ў'“Й`ЄЛУ†HЖ'2ib6и2ю Щм”ОЎШвјчkIU]`S2’ ХhљюјHCЯaq–ЦžeЊЦŽЄu^ž}iш8эИƒЧ‡ЈЪаUЄaЬщCŽДiИ?lбц­™ЁюКІЃЇ(ГППœ‚ №ж€TYаР0NРtЧШЏШd6H‡JЃХй\РHЩѕ,ёœЫ: ЩЊЪэ rЙJ“=rЪ`Z $ Ѓ)š Š„>ˆhšЄ^ЙЊ2ћЫ‹ЋЉ 8 уоіџМџЄ“X;Ijbт›xк88;AВŠ}Ч<'„A;4`К ёЙњ~ЫјTїŒ*•>yۘuзјTЃ‚š2љіЇбRж\К9GвJдŠGЮAдŽУŽFd'б‘—DQ$UївœЦМž%ДЂZnЖ9Ч/њЦЏEџ‘кgЧА{ YгЕgг6UЄЩЃ?ОС%Їk$/оž˜ліŒŠ`г— ђb—Ž№Ÿ":7.с=йх9–Zз 4‚#Н&+ѕРB:fсNfƒmе†xj‰EЎмiUѓ^,]oˆЕ›(:ˆƒuwbsF%Ч‚ T2Ё ?bоtU I]Ъ9VЯан DVn0šћ„Ж•|Ъ~S—хš эIŒ иБт?Ѕ')ЃoоJšЗmY”ˆRfgЄЩLЙHсeџС#”.ЁоyДІюѕвўёЫУЎkё~Жyз•YБ~dwEJfРKDМн”E2VЙ#*Ѓoп€FežЦaкюж[MТ3юїЬf’еF-Й?0…ЧЃыrGƒ W>јг€xЎK"љєpшЪЂF8cгv$2ZЃ"wŒЃОkђ8ЮВМHMQю}ћVжœUvР‰jЖЧШ)L% |дˆ[ЈЎ‚Дg o%ЯcЧРPzкŸ>=—0V5Џjc@Ѕ)lѕ§ЅBЁ,пqb6&Bvєн-ВКWЋР Т8 MQМњœ‹љ`Лˆ]чvНAJёѕŽn^ЖЇBі,шОХі\L !Д\_ЭžtЭкVm з`ŸКj•wxоїЬ“!„u>džсц2[{ž%)ƒЩ\T-Я}ѓKD& Ўd7'ŽPfDŒ^qЗЋЯдиRФEяЩђвZhfTw+ЯBўљ‡уКЉšк7ЄьflЬФŒмсЈm‡vЃŒt]7aЉкp:C nЊ‘Ў7Ф#Œе  яЛњМ;aЅЬжФХ|ЮqKž?ћzN2ьДnЫФтдд§уH%Vвну1ЃбАџЖx™Јы2)тнp8’р$ч-ђЄwdжДХdЏ$a^Б ўюђЊ?]№ВЂI8SщщшTГМЌjШ$љцтсD9IіŠz‡ž[дчІщNBз о#ГћmП7ФЄЛIђ’тЏ{№щЛwЇЩтMlУ'“AЧA (ї“­(g5–xэ~СL%fйТ=BгцЕA ЊкaкНFFЕВп/ Zеџ::‚-на[Z3цуУ#UђЖ ИэЇЭЋсг‰a%xZ7Lы=JћЫ/ і=ХZTн;FЙLлЬ| ВчB„`КV!:6 ‰ІбИЫ`ъ‘ж§$4К&vЋ@$ЇUAД*Š4+щЧiфИOњ‡ПZ~ОС`уг/џР‹†У§‰8n>ŒЅgZќЇЊZва‘< \"ЛЂ(Ž#dIЇ=nщЙX2Šђ;T@F„‘RoзDю ЖоГ-;*ЊдѕžЊе—УЅ Ћfд"Zњ.ёФ|r<…ћpЋз$t‰е ˆ№В(№м(-*\uг‘BЃЬЈк;BzЛЧ№љCRИ§ЩСv<ЕуЅm—ЙюSS6Kќ’b"™ ќƒхэїzмаfСЗы„ƒ_Q?Њ< |/JБdЌFЩ›GЁ)К9Ržјlь|OtыШŸ;A\ЌСмzOЬŽЩx"\7Њ ˆ№(ЮИЇ)p9АєDА1Щ $'ˆWWE‚ŸšзmгŽуУрћиаЕСfЫшЧOАуžј’эc|–€`VXUЦXЎњЄeйNœƒ?9мгЕйdл§šь ъЮ aќ‹ЖД—bиvѕiЏ‹,ђЃЌ("MGžWxDiЗщLВМ!B!њёјHY~ФЗzQйКрхЩЬСЖэWФlЯПk‹иЕ}b’9х;Р=œТBмХеќѕЋ]ЂЉFY ‚cп81n]IУŒщ4ѓЄ€AXˆIZН?Х№bяя‘Ÿ)іН'ГЫЙnиьж€кR@š‘Ћ-8еЮv,‰HN|З&hGf:|їэ‹Ѓ"SЦ xiЮ š vƒ‡їљ…[S]Ќ cЯ:j5@_РщeнaRv˜иumѓ‰ =vКŽmUБK]іЭ­,yGG‰РOWƒЪЖйшOјцяЃDFЉqSЭачу…юјYC`*\\] ЦРШ;Ш2—'{‡mГ‚РаЖН ЪыRe™OФдІх%ЁkŒ‡”ытш§ћоBЕВ=CyŒ…н2h+XВ‚ћЫџљУŸo=аŒЭ\;*/,†sнЯ`я№ –ЦэЯoЬ-eX7”_]“6`ѓИ_WYpP‘d YЏ’|ЙЖы<ѕz_дqЪИ№іUoЦЭGƒўhЪIqаS€Зg‘5KЯtЕіУОљЫG­jJˆЕЊjšќ`:VИЊ0ƒЧ˜ПyёЪЦ&‚a% –v+п44PЗФzfг>џЉїƒ™сCяхЛ!ЗX.xŸOyЭЪ6Œ§•ђwјСdхКЮ{ѕЭ7~#Ўjt(a9ЪјcПп­0ЇJ€Іt{пїЦ?љrИ›vCИ5ЎI-UšŒЮ3ЪвЂ#Юь;Г5РЮ>Ф‚ЂИѕ'жГЎАПŠ Vn­тШ?sЏg–—ukј  2SЅ_б`ю|ХšЫа…ѓ‘fJаNcЇNщ;%ŒоўpОb…—1№k*йВŠ pо­ЋH‚Ј(ТИШY3НУјЂlшjІYEб™m:sгM›2}зЦЫ=ЧOJ„ryEЌa‹Ан—„ЈЋCї–Ї™'L/_}œђJHm3ЖЇТФ‡ћЮУZEбфйннRW '€нѕБ 6fзФс™ХІžlб}Жlo$9с3@HДEoй=їqЛЦ-DƒЉ0!рј/oчK8†dYКЭіф>0эvЇJМЄj†Ў.^бMгВ-4Х‹Vхz›чVШъ6Рј  V/ˆве*…pР2АtпJ|ућуЉ ъ`a2˜>0{у?ї ‹a€“зІЏУк‹mщъ"' G6Ж.№Kl“PUщc‘sИ‰Нs…цmзїˆ{оq n Ы!Ў˜KŠъ–ћS Yk2Y›э ^‡"7КК™ёЂW­OЦŽr‡У+mdќLР АШЩЛX№ќb6Ию=1§$№ЯnwQLTУаt“БZš"KŠ0_ЪšŽ TvУ|ЬŽхШ^7ЁР zм‚Wќ“z Ec–МчЪвeЖ 2cюЭ6фYџцђђнЫзЏ/Ч‚с8ољі ,<џ&*ф јщdЉhЈpF;V—{dХL,Ќf8…žю/‰FNi]К?žюёwл6а$Ž‘,жѓЂ4tфЈу7/пО}ѓђћЗ§/i_bаРh>Ÿћ7wSIЧ /ЬšэЩ)іc+kJ€‰фХфr0_,Ѕ Ѕ‚pДб&3|Sхh<Ш кЦpT lћДх›їзчЇiўKЁЇѓљЄ}7Wt’9­ЉЈpП;АњЬmajЌe~vy=œЬ„}фэv,/E‚ЖКœЫІƒ5г+ЕБnWžБœЬEa6™|nлћr1›Œ&у)/ЫЊЁ‰ГбL5АKvXnЉтuЯіг[TђнJ‰’Ф•xюц§eЖPsЪнБBVnБл—ЎКР>mgЏ`9j—Й:>SУ†Я‘YАСƒ>˜xidл–ВфИЅ$.EеN6G–j"aЈ(гtmъZІэтr~ѓњmoОд‹ќгЊЃr”гNяq:Щh,€ˆ !A› ABРџcŽХsЯщ”@Xз +GАŒK“–K~9‰zД9ьYm!е}Qv@}M–dMјХЭOяЧœ`ЙoЈvБнВДќ ^њ†Шq އї†йћ!JSRV-и№єššџАрbo‹Ч„Ц2,MрyеЪр@}:Vь(“ЛИйж‚x ЭьэїЗѓ…fž* jВйbЕріtуЙ-|K•…щxЮK’$+Ќ dЁDТ&}†Ьр€9v!?ЗMОж/NВT;ЪŠе(лжЖ’ЁGпџ4с%3ыЦ/DП[SМ=‚ „)6kžМЪtІXxЕ A“Лжч-R%‘e(Юѕ[­ wбэАоГ"Ќ§–Р%1жЋ]№mШA/^МYВЂ0ŸђvMnkХNЗ›&=pБфXЧзcиь8Щв K нЯbcТ 4ŒeПws3œp<нN:XэN=AЇЎVu‰ržИфf ~СнОxˆТqdaбЛk9ГшиМЭц8Pюb•%lЌ2МТ!ZЎчbLы|–v\\Ш6 щтЭmoА@Зh˜xpВ5Uкtі-/`ЮКX—гщ|м{їЗ+^T ‹ыЫ™œюwЇŒ Ћ5c7Ј[L.ЅЁm+Н[NЅ’>и&чsнЁ š7Нј€ЛX‰­вyН=ѕ{ьwдХљЂѓuсШ|ЦW/џітL#Ш vфr.ЧTzp`v’El;АiF.pMe|u=˜SqъчР‹6VŒ&Ђ#Рl-Ъљ@ѕTР~8•"m3K9‡яПqЧc+'œВл[NILю АаOи­Б>BЧ*IM§Тг_ddŸ#Nx^”(ѕіp*tлSџе‘КШNcяЈФЅ0ќсє_ŸкП,•˜ЉRcЖЙіDSчћ§ЩbСЭF§сŽ№—ўЗд-Ыѓ1ЙFIVnАїўaПйŸњ IKw;ЬuэЪUeб?^ѓЙІыл‰ e”їxЌQЧWгр>‹УЗЏ?ІиSŠPЬЖПр`’‰‘ЮNRuУŽ,f:tYВк`u<ў†"Љ.ѕќЌm0П,Щ§Ыщr>]МН.™пoкВьЈчЄ ]Sц——7cьѕд-м“'зZ§ЫХ-ц3pМ ^дw`йщ:2 ;УЭЃ/ьW),E1ЃМЬ\MoЏ&ГбЭхuo&*A‡щвyЧI;|7 D/шќЕŠнљIсЈы~ЩЙ$АsЎf…ЭёгЇ‡]ŽКУ‡OЌ’3UQвнd‚ьН|3˜OЇгЩœ—ЭrЗgјПєt4ѓ`}v+ЧЇзWc} @“8tЌ/;NЃ z&yB>мЗ>Ъ№ъ+2ЄvDцБжг Р.њo/ч^А ’Џw,Wй%–"ыёOB[šаћа /NГ `„/=†SВнЧ—bЯЫ§>wфЅl€аGVЖЉШd]Š"јySЇ7#AЉV‚їx˜ы@NœdисснUЁЅёЗяGЊfiш˜†Ў~ёбЁВaЧ€9~Сс@ли”ІЂщ7•ышрJG—KkОT™ыMEN˜сЎ:vеБƒcиE6у–ћ6y`мхdЋФ9Лё_.I3œА><ќђ Јєкг—cКbщ1rЯЛвSq6хqњ€<ПI`Ц<аЇгШ„эЪTzсtN|;ы:‹\Kї%3(RGћучЦx  ОџхŒGхшѓЁdzи:ўиЖ­|ИС`› gl*KК—эц”л 3—в @wX=hъвt,›A–x_l\Э\SA’DйJ6ŸРЕЌLm6MgЕІў>*ћкЁађbдrЂ$Ž/Ч’Ђй~ZaFПdэI‹œц'#нЏ}lKUрyУёCчГbЌџŸЬKI‘$0rеёс№pШ,m6р-“’Ќ€ DЏ<œk6ŽfKЄWcPИюDЫ‡ь6‘Жф$гI[l=я\e:сљйрr Yи№…-4.ч ЦЕАЅщўўг!Г5юnnX^˜иL‚aдЖpс.Ц єb9ќp5žr`ЗСнДЌКjЗr5€уи{*м„Ххd8фѓЋLЏф4“ЪWWнёгУУ~eќЭ@бtSяkїЅЋЩ"7ьѕG€yяn.яІ/ШVЮЂt‚Њ&бŽкћO-(Ѕнрхє_e\о…†crвМE;}ПMlKИО]J"љ„5ЋQnТYџъу‡ЗџюеЛзњSœmЉŸх~_EЖ&ƒе1ТюссX'иыК–Ё~­™Н2l4ЮNС{Ёvх[:wл_тƒ…тцЌƒ}jŠАрІƒля~|ёг›7—ƒzЇЃ†qАry`щТхЮѓ`*6œдЖ[_kмІi;Aо5е*†XУ2Є€ EœћK3>‚Ч3жzи} љdдћ№њнеpЖDЧюД4буА­2p'ќЛKЭmр}эpЧ*K?3бёЏ–`Т1L !ш њgЭд ]˜šў'ŠдБK­д <ЭЭѕЏ1EIu[ŠЯp|›ЉЫ‹›оBѕ+t/ў4ЧulѓЋ 6UmЫu1_zЙu‚g№УWcУюNГ иUшЛи %‚ЊbГЏP#уОpTž—$nВTИйїЙЏ-ч Q5ЬЏ8б{С ,V%йpЃ8plKН|95мѕ"?\ћMWх‰ojђlЄшXCФE•›@_єЧМ$ˆ№НљŒIh‹У‹бxђugPkІЁъŽ‹ЧЩЊ\yЖmL~~/Ќ>>|BЉ1ЁB*KSІЂІУсЭиŒћЪTzя‚Ђ[.NяТDЉ)}qІџyё’j{! іМlЛЬsьхлПощfДЦi…ŸP?PU‹s•wS…„Ў:Lбs]zїгX5l?^еыЎ+cЧ’ Ё‘ЭР R Ы7]ъкђэпў>6­АhŸ~y8о:юїыDжфёы‹AXЮУЬСЪ^џ0ƒЃ€§ыКШчѓSџГ57]P›Грѕ./|5Q иЮц€ƒ!LmV–*^zљЗ‹зSsЙ4єx,,щђЧОn:дЎSхЉo™ПЩ€SaM7ЉЫР–'WЏoеtмЈЙџхгЄо'К<оНњі/?€l(›}Љuњюƒ€ƒМА-…РіKLlћ/nЁўobп9о —1ѕxЧњџіЉЅŽоўјн^\ќѕ]oВDйЌPшMh(УЗИеY2ћюW˜ћЏ—lћЩБљ7п_NpФ•на(Ю‡CakГї/ўэ›пr/iў ž2Ѕлw ЫŠЋњьa:ч эњIs™МќёУx>› FСˆоw!ЯЏјіЏяІ8 Ъ№ђЌСКќpбњ зњ­Nс?ят\HзZ|ќљ][LЇМža:„о—рZЄСНH˜ѓ Ы§mJп2fЇІэЃ?џ˜FtoЁІoЎ&МЂ№œhf‡OїЌ3ЙmŽ_сhp@лф[pу‡lыЗp’зR~њŸЅLЃoч xvUVЌ|Ш#Ыr,JNmSэСћа4;ЬзЌ3•*m  ‘hœ_юѓEж"%ЫвUˆгwmъ–ƒehам],u7Љpxх'–…уїfY‚8ЂRгєВѕ6ї”9Ѓ§МР3t|у„[†Ÿov‡M…EЖљл8юџfaЩN9Юл P[А`wAcиХЩh:›ёЊWo1ёК_2џќ9‹3-лv№š”ƒПН›-xАкт !пі‡ƒ‰`d8з[“~'žŸџgMU€йކ­Ю@h^—мЃвіЃўpЉ… ыМџ_Фй6—4P–ЃЛСBVT…z0žNСёxIКqіМЏЕј%Ч/У5@*Њ Ъ"ˆ *РоgЮ ћњ‹“pbŸѕ+™Nь0pК jП?ЕйНІЂ5іЏј“5fe@ ћ5™D>oIU*ќSyyYVЄхoШњtЮд/ўoеƒчѕМžзѓz^Яыy=ЏчѕМžзѓz^Яыy=ЏчѕМžзѓz^Яыy=ЏчѕМžзѓz^Яыy=ЏчѕМžзѓz^Яыy}нХIX§ПМиё?-^Е"“ПZ—я]S^а/ˆуР.ІЖcщњџUИЙ0§8vTIепЎ‹_—dЛADqZеЉ'^Ь~kџ*57ЙИавМРЉхa˜ФžіћWи/œ JГ|UVЭvКђХФtlSЅaЛ8%x>\hќэzЛЉ‹U™'g}fќЇ,3Hpьq‹Ѓ)›ФS.n—мl6™ay}o~1›&ZT68О ‰мілІ\%‘ћћЊНЅѕ–p­ЋUшJяНўлFј‹§щ№њNѓv‡„В-’іілЖˆƒпKhе48Р<Т9Ећ§ЖNBЯс..' бp=зuo_|%…YЕ;tyQ’злуЎIќsЧЅцZŽыкГ‹ОjyqБояъ›KЭт4ƒ]WЎјс Єѕўў~пdQшёЊйnлиџЌyxg/ХЖќиwХ‹ŸѓЅžt‡]aЭчќ’S=ф#щš*v•лŸъ;IAмю8 YSъЭІЩгшwш™aыwQјwёfВX*Asи—Ж iІ‹<ж8%Л ]ёъЧWstœ—ѕšЫлum$єБЏыЗьЏЅf'ЉыШRю.Жmy8MЖ[Љ.€˜–ъШ?ўјj_ъa€S›ЖЪв8rMёњbfкЦo'њ'9Gѕ:3ХЛ—r‰Р;ЧёѓDaа–1ЭuЙђеOoюDЧOi[ёњўиЎвлT C\ЈAшk`'П…Џ‘Ч ’jгzђјѕ=+ЬЛn}тhAВу<дхАibлЎоE+HР.k Ги GS%YГ]п•&ZИJpA3^њъ›Нp’ПнŽФ Ў{’›” RаЌ7mХIфЉЃЉWхІ$єпl?ЪЋUфs=-[я*пTeУKWЋHыq•ћ і})_нAr†у% bWФ–ІHЫЅъ†Qeuз$†ЄX–иПсЃЊrax%јaQ—Б)ŽFZМ НŠЃЌlл<–чfкUhЏ‡’І~эХ‰bшNВо6MFŽЉ+‚„~бЁ<Кюп~МY8iнeŽ)єЅ ыЊФœнЯж‡ћrMьі€QИ…oКа_ M“ОjїъœYбƒѕ'Аm*_›\.‘}ЧR6ŒЭ [ДЗ+O^кauПэљEEEсЯчјo–bЙОяљAђяь}‡–[Щ‘e}Ъь™YLГЛйєeP<яНїя=ХžПпˆ|`kД;š‹EI{NЅдR6+ˆŒИ722n5 У™h‹š:ћАbE-jš:2ЅйGСvp`_–8кnЦ{qтлмœwуEшD:К MNtТімњіj[eљ)Ъ`Ы5гфœц юиљXFŽЁŠыЕ ЖлЪ7фћїŒfКŽу іњŽТ‡Ю§Р8aб G2ЗPŠЇ2xЧчЦS—Ws@„JЕяѓZ‘U4;,P`'ŒœЮ‡иVv3g5;*лЖt•ћ№гУŽс0Ÿ›†МќxЧsSТ)„ВTmWћ ГМ~ѕУнfЗО{ћіLЙџД…лгЂ@3К†:ЯлёFѓ”fУNЉЮЭЁ$еєbщ™S#Ѓщ†‰#•ќЌ@4>žЦЬ”рš.ЄєCŸм~Гxџ%q{ѓiОкююoUЇ—uSe9УЏ†6Kр<•+Тз4ЇSэщŠ$ЩŠFЅЎЉ=oj\ЋрgпијЈьpОfn шЮ9ЮСэK[–deЗрћ`WkŽEj џ8p `чЖBёVмбЊ†гБ 4žзœl<Eb$ИM;ЊђЌёZ6a3 јц9жZœv;–Фj^RФ6F 8‘VсK€h€фhNѕŠ"IђФЖJѓRT›;р”MO…„[}‚žхmCŽmѕ9‡ŠКухm?žгu‡?i=‰-?­QbІяъ<0DNslCиГЊeы+ЈNrkђ”‚Š6‡і€s}ЋадtЗЮ'"ˆ€Сh€o бЬГй,fV9 фсќљё|ЇyЬЈYб„Н&"\ml(œ`О)ь8нї5тTH<Œљ$JЎƒ#,'Бнивє€“їpр#—pT2Gеž‹Ія4УТстˆПЗjб№Б 5Д ‡>t™ЋАДьdЁЮmy3 T~НeY*vЬuЧ›.Ив‘ЬS>ŽmhY€ћNŸ}<UzЎ ‰+0Дч"<œn@F:ŽњvqJдљ8ЉИ@”DйŠ‘жЁС­8#PЧэ$7їюa†ѓєѕьxЌ=AЊєс4Qь№oWЖЇŽu-д‘!ЩNRCfЈ†ш’nxРu[№_ЃyNmQOZc8BŸСfMxјxЗЄ%…шЯ4ЙыqГ’*‹Ђ,rœ ЇS_&x.е—9`!ˆyр ќcd*ЂЎЬонђŠn‡eл ч.6JЖl?.pъZ ?~ў<цŽ"2їЏW4‹ђшА5Я32aБZ>ЬwŽй•–UТўxlB2Х’(с•™О)G58˜RѓВмVилw+@ЇStpќJOлmtг ГvšotЦ‘MŸ[Wxz5Л]ГЛ-'J’(>‡б†cїыХf8C$^PТс4жЎ*E­ˆ4уaв—‡(\%žrNРЛ…љЛ%CƒЋЦ№KN‡ФЂЎЗšэ'гЄРъ#`–ня7‹эjMa"х™oŸФC Hћ9ŽeX€œŠПХ€ёOЁ)ЩŠР5Ц‹ $ќA†g‚пжЅ%ђыЏ  Lи1wGк§'Ц Ъёb@8ŽŸћ@fi†ЂЉхl6_Q№Э№,|ˆoNKaP5 5/р?М(ЋVб}^3Š7УЄ–JФРPЩЅ‹Ф”8ˆрг™YКŒф-oЧŽъŸ†ЧŸ€А…2УаC­fззїы~›М$pпFО$ˆY>Ž1UР6 ЧХž–wМj†еoj˜DžkLuтBќц— 8x^4=є›ФБТ•Ž­qxќа…Š€Eјэъ~6:^Ч]љFСЭˆŠІЎвРЕ A вšР8„зэp{"тZ“КЌO oч’ъ—MCТв3€K:~8‰dByЂKEBК"ЫŠВ,2p;­xд@б—ѓф!г1<]>Ъiк2O‚Рїˆ4'ŠсЦaрZњSg-.M ШПјхЭœUQh*Њ†ѓуL~ Љ}JзHdМQеЕŒ‚ N’Ф‘^ о?ˆŠ œмc’"Йpr,‰Д*ЋХаыё(‰[ЇЈїЉAx•žШ8ˆЅPŸ~|}НсeNвџzьDM‰ьг$ђ ?W“@Xє‚86D–кЭ~ZШЊSі#МШb)Нbш BН2Gk9Љo[КТГдvПxšЭр†ŸХ†@=м=Ќw{œЙlf№›_О`"1iЩ $rTЁmZn˜ЦК$АћЛWsI1ГIq$Š@г ы™ˆсЙЂгxР4ъ;†Ђ№є~ж~љDЃyеАВ:аdA@},"‹ШЕЮЧЩŸG"ТGйР?šШq<8JЙеŒэы;ARœтЂMЄ”аЁІум“„C> )ўFШ TPлQЈJЉ?u  щzIйЗmг0 wмq$YјxQУ&ж‘f8CiЧiYТс7‰њљэ ВйeŠяDLnїР0y"ЊyЈЭџДА5ˆ{Š,FеАЫвžFa8AQНЊС(VхI„!ъ?LЂYФђ‰ }h ЌaРЏЎЈHдК]г‚YЁч\~‘8РrС0iцЇєъЩ|€•X‰CŽchO*Hr€–RАeв&JHфЏЧ‹fж$ЫŒчq˜юЖPЁЈnjxœ:ВИџУ›=+ШNеД‡ЎŸŒњ‹?ѕУХlBtWрfЋF%ph]y @]Р‡vZ”—СмѕƒжUЋN“Јй$P:ЉѕI`T9†с+LI\џлЕЄЈVzбƒŸD_ˆ† #УT<9і0„в‹Ё“Y’~R&&јФ'95ЄxТЩˆїѓЄNжvйЇq+&ибNzвФ™ROЄеП|ш“6=Q'ŽП}=#žУ‘шш N!з6 У(†,ИЫ]”хžVJр3l‰)Em‹4­Чс8Tyu ѓ"І‹юмЖ=j№ŽЊ‚ƒ‚ИўзO’lUјЯъ§шtQ… а_>є‰д#Pу”ш­UID§у'-+fм'ЩљC•EžeGэЉ‡,вЖ=ёK"[‹h%аё†хшЫМ,зПћ((NКщEг}8Ц57#ЂŠџЦ)Чњи\љ€Жx‘[/ŸтгŠb%Уёаb ЌMG—П;ЉЁЈ†їЄ7ОƒІ%2аи0Qe^фБЪ ѓп_ Š]жUGов?‚/ЄП(п^ .ќ.Ч Л‚ƒЗMezK/WO)€HЊ™ ь*Р‡&vLEдМОDŽIќшAгХy№ƒOіКП1]ОЕщ…#эDэ’уЙЭѕѕњ)уžeг ЫnDЅИЯЧ:†oН„Ÿ7˜‰ігwЁ#t‹;]…Jtрэ%œ$IVaщ~еЁиоn‘Л$ђй0žc˜žBіDІ№L _[ФФ EЭeIГ§рыхlhи3#8 {œР%QДёBЧ'ї@%їў@ŒnШBфQЙjЧЊтf6›яаh#H1А@LьpЛ!LOrgkЂxœ6Љ­фБ6kЂdИQh9_kєн†у%еЪМТl‹Єуё<9ЩтSпX‹>†уVG№eYRи§žBй-Yївцr&VаOХ2I&нrм дфf.s’fБe}-QфeОgГ—ЙоWіЕІ“їЇ)њ*ˆCТ4luWZМ–ešхyŠэѓЋПџз?оPЂЊйaЋ(3Ч.SVi/” ПTHЕŒ\й4%ж{!†АO#ЖІх&U˜жВ”Kx%$ЦNз,HZR Aџˆ-П€Ф‚+ђ ™}јщ?оэQ–-$6WE@шэ„VаdLY#OяHeЂЭ›:Vѕи'ёDнђвіPf1Сх–eDŠОП|ЇSBМTТрOЪl.Р=Р?lUb~y}НоSp |АЙТЅМ!=Uš З`bЂn3иКАJ ђгЪb ИQeаЂn{виEЊЖ“OO? ы4dч0ЧрC–<QŒєсэлћнvНџ^КЊ№"X=СЇŽ^^е›ŒЈJkŠ(ŠЬгќƒЦ–bнTЌ Й‹ ‚"ф ^”œ,М™*sиъШб$њс§ллѕfЕЭŽaYbEЏ@ЇHЌDB@ŠeрЯ|V|иебІN$#њЉ3Р‰РмТЄ ў0СЌ1уNУоЗSYї i@…ЛšИŠР.?ќђўn~ПRœ^U“K™ їv Э‡тژЯлoђ*‚X^бe‘ЇжOэљXI†]Ж@uУ0ь - ЩУшJвяа~ыNС2ЖЈ`љ1/G!|ќќњгээVŠКРВHз_ŽŠЉ9]"uu‘&yAkю Яю—їЗwЋЭS WL?я 21 zРи€ŽbŽm?™нйzљH)’ јG‚y|ѕсЭ›їŸfМcЪя€”АЩMљtљ?•n№/л:Ѓ(ЩK№эаР^}zwЗчљ'Иˆхц]эЋЊэКЖЦГ€< p‡qVM{?Пgќй>ЃШ ВгьђRшнVѕ0!тšшЙžю•ІЊ ИHW'žPc (ІЏGo?НžБЊњ„т„н!3UЧї|пQy ЉDЎ3ЋЛщЖ…pъЁ'f“|орNУJLže–її7wQwbДнŒFБ|кNu›ЫЁ€ o*ТžжќЄ4yœПћљŽзЕ'm‡mщ)К‡њЩРM^БwДh‡щn€0фxБќирF—EЋ C/ююЏoЗœdХM№+Љ@NЗџЄ’0Хj0xЅ˜}Џћ ъ,ДЕ§‡ ˆЇЄ‘ШšA%I…žуиŽe5сУ”{ЩmьˆzРфX!4Э}™ЁЉХээћЛУa‰Ш‰‘фіr"ЛŽЇИJ<РtœdњqŸ=ЖхѕFЕžв=Ё9žКЄьтFA)Kт…`/­4_УTVЏл)Їc№Ш‰ЃїЫя>.)†U1Л!Бё@šа­щ!щ‰еyшЙІІ^˜€c{:/šіSоДnum}ЧzA„ 01dˆКЙќPЌы]фвž‚ŽŠ'‘\ИА §aОЇFД‹‹8S’0ущЊє@Њ6$јрѓК"ђ‡ѓ’dUYКi;OэcкšР&BŽІT0].їфОсЫэх>џ@cU… юБљt‹ и4ЃX{ЊI=kХЄсoЊŽ‘ ;ЄeИЕ1ˆQр{юS{эUЧ ѓz‚`—ѓG.ХЇJТxЉ$Ž$ЙuфvЋЎ–Т†РO3†Уf&9яІ‚ЦЧ#Й—CƒW‡Љфƒž]ЎБП^ъnфYx_]2Н,бuƒМ9|йтЉхЫыёr/8E1тг mP`-Зћ„ QтyНDTB`\OЊŽух†ЉNCь"Пмl`kœЋГw7Сp ^yЮЇ&ь зKjrХљЅJJYгЅЩp‰$§Їnk“fE‘-ъи-[zђ‚Ÿtяaї6ZŒ}э›xЎ$jУО!Q›ЭŽQЩэЉ“л‰ъžДёїИYМGЛ0rANJ‡~Ву@ЪM]mѓ‚Њ№›Р1эРѕг–м%uS*"ЁSSуЉиƒЇщ&š–єЊж‰ohxGSпаlЊXNB*n@­jШЦѕa$ѕЧуeПЇћqЄг— r ЦuЈЊ–Ц­п<А‚›b—uGМчR™:^zžRMтЖЫ,вž\Аяƒ„Aћ НЊхf-љ™uQ:+дžЮS'ЉƒB€~3БПЎo зіMvљъуž3вп L•™aК ŸnгЛ›hжїї[YxTЖш=XКцšџф.jЭђK~Ы$є§0ХkЃѓи–yб ЧЉxOny.~=нЕi”XмђOЏД`&ЭфАнд:Ї6ёЖЬ Щ~Ø-YYбL?›іЇЬBјiOž–`и~Fо <—tЦŸŽ]yЖ–=йэ?oодєAт`Q‹]ќщO8ЪСШк ]к~ \Пj|UР CjywПУз[nкВ‹љЬмЇ>єУї@)Wтu>аЄNwб§ъ џџC0C&;^{ќ№њ—[JыKяьсKЈЧXƒF‹Ъ™ВЋ›ыЕЄзOђ$Iѓl—_[х§maХђ?qќДъM:†*ёЂЂ‡э—У8\0_Owшp-v§уЯ?иQ,~WгОt ї6!аWžлЯяж,žG~ŒуGi]ъаyjлІbИi‘'L]/"Cg<`ЫНЅE8яHюџО„kМHГлЁЏMfїўѕэšІХ˜<Ђ;LЭyгЅ)Љ+O—ЂCў‘EvЗоьEdušІ Z= 4Я~ЊбPУ,vp™cС•пoі‚ЌGrП3N”Ї";ёМ\tЙ§эл5ЫrZLXiГž2џˆ>дФ–Ъюї4'aџЛ"2ЄUQинŽUM/ lыЩЯ]4ЫD­kУД,ђџЊ$№ј0@T4+~Л~ЛЁ›њPк6рщ‡З †хеЈiIйnъœ‚ѕачЖЦmж{†—dU3MK—ЙнzЕ^м~ќxГУЗOггкc'ЖІ+Š‚wєЗпqјg†~гŽЧѓхТyЂг‹єЪHЄзяЎw,#:% *А|irКP7‹5-ЈшЖуКŽЅPГЗПќјуыwѓ#+њЗ<Їмв xп­чГћНB^СhЇgиS№Р–5‚н]…QК2Ч\џ2лRŒ–wЭ”Їq‚МjWV+VB%V ˆsGО­=Пњъb~s§РЈ†…ЛEK ѕщ Ђ&F#ЩЭ=“HжŠ,sџњнУ–’ёњЈl&ЈEZЕ Ц@jс–k+ч6@К(jщ›віaўд–šџj­їЕ[с*ыx“ 0›жШAќ-^јjеA”$ef?П_юh5ЋRп›Љ'‰-жg"]X=а№{Y8&-2•x‡С‹Сwпј6‡ДEŒР7v4œ<нЩћщiюѕqj„Dџˆ$|yФ KпќtЗЃ'MEвsŒЇг@HтиgІМП_2јRv ЪJ`GMшeп8KФfJьшХbІ&sћэjЮkЩp1š4Ћ“ЎFЬ+БШРb9†оОЗa= јRxiЦЧLџRY рЅ ;L.ЧЗЮyЧIр:_пђŸО`ЁК>ѕјpдjёp_Ќ‘MСcъыХN#FМ.•ˆб,CЭњФrВэ"Я0‚‹еxвiMpжиЦŽЎpлѕ†трЋTэ92v|ф?гNЫ@ЅeKWHЛ $fЗš?ьфЉЁѓˆ/!ЩыБŸKM…ЦВдž:~џУ5ЫЉЖ ^Кй N;љХХцqhsп15Yрш=а3†–p6Њ6Y`=9NK5 CW™ЭrБZgЌз›еj'^y$M6фfjчЦЛ~h\Nвžо­f?‚бВ!ѓќюf!иѕ`ЅaŠэФь"іlЫ„|(№дb)шV%Y–„Žѕе—žЙг4”§ЭѕЭћыљb ќ @ŽЄ9Х0ѕPLЭ^x?5aЇО–йэЉѕэ‡WзЌ )Я-?,xЃ†Љ“wzЙE>,xqАу†ЦЬц‚љ1ƒi}ы;[еPйЋww[|)з0 ЫѕёŽ|jц9Žч‹_S3iсШu ШNM(єќ—џї–HБiЩŠZ8‰№†ѓyъGбqL˜ЎьfЗѓ-… DЯ4q‘F9y/JЫК%э§Є ќ„Žt.Н юуГfпп§єЛk–ч8†ZЏ(A4ЫK{ЧХ“Шk€ОIЧаMS‡њьє )^Œ еS йъ3iХ.ЯkКЋК‰%‹<ЗјёЖ^AДYГЂьT—`BЙ.wОMк:ЗЧq+ь~ѕфгПВ8ЭФašЎ'р.ДњqlЊfќmЋЩpТЧH•‰Ѓ€3пО[яїЛѕУbLЧk&LкцIZЕS•Њ+cзжŸ>м-7лнvGq{ŸošЪVж!\7bazI{zU/c`ФЇ›ЖБD†%ХєMр—ПМпС€З€›ЕY‡КорЃФБp €Ј7wpR5|~ FkЯ=lg'jxыёёѓуy„цdг60*ђжvь!ГP№СdMWцсУ’уD ЂдУTдк­`цxЮЕgjТђуэVд,АяХŸ{^зNжm€јnѕ3xДЏq6s`JЄс&tDƒеЂŒOАяіфЙf†г$8{@hŒИ'AЇpu…њєn ИјГѕфWfum9EGfxzќќљзЯчвжЮАу/Ог(эœ№SБЂˆЯъ6w{ATMЧOš/Хї60рhа‚ѕˆѕRG—7xУ‡dў\Ѓ=ўгЂy27ЄьqєТЏчдЗ`t‚э]BУ!3АФА‡рХѓЋы­[—5>ЂФd>Ыё‚ кY]g]™–.,чœюB љгХЖŒ‚­яv|їјuФŽAжДГК.ђ2OJђЦЈ/]U–™е|C3Ь§‡ /h^:eQєŽжw[^VнGžъниЖ+8‡рпchо†Gхe3ЯŸŽЮ>PК7y0Щ†ТгU™п/6ді­иAVOудŒr|Љ?Т™T4Ufs^Њa~—I H‰ :еёќ+MЯЖŽoы.„@%ЖJ<  pѕўг–—dˆ )",Ф&•%Ќ–œn…ФЩЧС“Ж‹=MяюЏчМnшпgф9†‰Ђџќkчhьl.n’WнDG№us; VГ KЯпнЌРІЊсЅФшуЉѕt~Ч|9ЯчDо=Ќ(†н=\пmич™њђџ,šGьЈО.>мrКсИ~RѕЧ \™­+уišкнџђўjMБІЭђrя˜:йGsтцјљsы),+с "њЉЯ€џч…CгёИ?’къу$ЮЫ OЌЯч1З|-†˜эуЋŸЏnч;šd=юЩХСЉE„ФѓЌdјељѓЉєm€МЎmjO}%ў7эј6ЉАЪт§œу™=%˜QK ъщмX*rš^пНљуЋЋЗЗрŠфvфпљXGŽ.ТiфUП9LЬёyZкцwmJi†фE‘ЧQLZXнЏYvП|иJv~ўŒѓЛЮcЌуŠй/>НўщъѕЭ†хРjГB(њx›дЗtёцнFа"|q‘:Mb [њї2њJі}[ГYцpєП{xЧтьэ?ФІJ<„ймИњИиshДQ’РcјŽЎђwoXХƒ(9TБя’"ђwjЏš† œ_бЖЁrѓŸпБšзЃЩш"]п|*UdцWKŠ#(Я!ідр{rIи?мяD=hŽCй*J’П­Юёп/ `:аТГ‚bйз5ёсе[Vїиhђ~юtь_CRVЅЭ%HPl3:рЛ>вХэ†тЈ  ;ыŽ]$р[G§ ‹Ѓї<˜Ёџђ,XАWИ` ЮAоuAфk3œ,АНbd`:ЖctOЕршfЫђМ ІЦ*РЋняn3.ЩР‘Тa’ЦžmˆГЋ6š§f›T€Б3@ГиMозAіЩtщц‡O{В$Ю9ЛЬЕдя”SўяЅй–ЇYU'ŽЅo~Кz\o>ЃIп9yлїцj-cЋVp}:еИ7ПћФ@ ђ‚Д>ъи1хПЯF_ё–eћQRдЙk)?\}Mўѕѓg|ЩпЊ@э7з?ќ'іутp&œъќЛпНУa2^œЗ=’\у{qўmэ2nШЛWяh№ .њЧ_=Ÿ‡@хюоќјЛљ=АNжр _) iўъе №­›–]‡ЅOН€-RкЈH]ќzY№X`v‹гќVAŽБ!/~њЗџѕ/џŽB8>XВZгК{§ъ :7)Ћ Cуw™Яћз—lћIт9wѕъуN2”њзЧ# ЗЪ6ђњwџђЛЋЋл Х2‚тЖdIbЉд‡W bG–…рeЯ9єoYД рЩЕ-юъПЬfGёzqњѕ3N{R ИићƒžSŒРу#y2џЌ LАњ-Ф1€ШѓЌ5ŽПmЉр3[НКњ§ы{Š^-‚ѕ™œњи6TњЭяq’2zNитпи8КЦ|8`BjЕўЊ WŠiY~ќАиэ—Гтї>Ш УCjiъіY­;~\гcѓkJЦъj)iКёвЂ™HнЭŠЂщеУN ћ3ьЂЊ!œe–.пЃp‘jћ9Й‘ЦkЦЎL'|‡aг_ЕXQd7KЦH†ОJ\ЫЖОЁяЎЎVМЈ~VGlPЊŠФ3ЭПП'џk+*Š@гŠSŽmтЪЧ‰Ку‚їтfЎhˆ+6™mЋЂœeXџш=ž– Њ"/™A}Ш}Sи.kZRѕ/#‰Ж{šWн’ „Шќџхкђ’(ъЫђабйХУlЖРоипўљb'h!6MЈ№Ÿeэбўш9ІВПzИПŸџХUФЇ9ЇXIy–aќsјЦeэUN !3›+Аyё№Ÿџйћ­˜ЎƒSГўЮiћ\4ЯГЄGє~ЙйўEлхЭlЇр˜%SџgГљЯkГЃ™П№‚Э–pМЈјOхЙрвQ{йю)šуљb“q§ЁкїВ^жЫzY/ыeНЌ—ѕВ^жЫzY/ыeНЌ—ѕВ^жЫzY/ыeНЌ—ѕВ^жЫzY/ыeНЌ—ѕВ^жЫzY/ыeНЌ—ѕџщкёŠљwmѓmKАЯї=ћЏ5ЂSЂa)Ђ$§г4Њ‹:Юа ЃМ Лэ9ў?Н2ЄvWWЌЅE‘ХqКO~цХ[n&•uл5Ю_žowЛ?П2мQЋ+>LтМЌjШŸјЎ­ўƒохќЖ8'LРbСTe>КЧЭ§|1Н X]]эЉѕ‚ѕВ$Šqііaк"BџыХ‡žuё~”W8 ЛЏ“РбСЮХšцEU№мnѓ0ЃНДСWЂЮqъ†О­RџЉSМПyQŠ^АГм0Ў‡ižЬо^QВюјAрZЪеллХэѕоNЪaШ'P8A5 ]ъ}ПЗэџ§’mЫ0жWoЗœlХэё:мf3Ÿ1vdpш"лиО}§цэкŠЫсёмЁВЕІkzPѕ]ьYЇЇЕЙгД\ЧbЏўxНиЩA3Ж‘tџ@QМ“VDў'uєнЛ_нjрЬЈ‹vhыКˆ}7,сџћљЧўЯK2M'Щ<“НzO‹ŽА:$*й%ШQЏыашЭл_o]ˆ…QRДъIЗe'1КЮќ&дwђзNэђВ:6Ф9„`Ч ѓЧDIV6mWgiY7…kPя~3W-У4,;Ќ‡гЉoЪ4єqЮПDХчя˜@ё1Ї—ЕЅ#Џп\A\тD"б|8@АŽ--ЈК:Аи?О1†n˜*ЏЦэiЬЃ(pL]е-SXвЎч:ЏЧŸн2l?kыШряЎ$7Ў'uœг[Tuц‰;=oRЧ`оП™ГЊ й]Оп8еЉР^Eдl?ŠЌ=чЧ‰+§ЄfY^ž[ФІЬoчДъХYŽRŒ‡&v=јіѕЭЪШ GтюпЬ5/€мэёчfої)ЮЃАМДЎbƒ’ќМє•oSџ5‹3mПш‡ЖЉЩd–гlЧ1ияФрйPїД[TŽРЬо3ЖЧЁЩoWМSŒЇC‘Ч ъ”TЁДSƒЊі•хеŠfОџм‰НЂлi?ЦОЪ#зЉ5Э1Ќт•uЄlgГћ›йоŒЪ6Б ъŽƒo!Вї+V'ТЂ";аХ6Е7ƒцЈЋЋ5# пї в‡iF№|UdьЭ§jЙ“НКŽLўўЇoyУЋЖєMъŽuУШS3Hъ‘p ттuЈЎy':єЁNŒVdс;n6o˜– юQBД8Ÿ†& Lƒ}XSŒhЇ]“Xђъѕ{Юv‚ДЌrOпн2фsqОwЃbšЖ+Я}ц ЭMЧ>‚”КbYWхяЖйŒр№ZuшЛё<–8^йmxE5c@g+ы7з‚t mšQ–уXмУЮ‹nœzyއиdhЫЯ}lюЎД †ёНо*Ўeд ЌqyнŽч.ВTIЄVЌjљYн5UdЊызяжЮШ3,Sлн>p’Ф/oWzЕУp(в ЅwКШиspšСhcwЕb$Эtlгњ>Є†’5L*‡CчэёT8*KSыНdE`У3TёюЇї‹‡љrУH23ЛžQН]ЬX7*‡ОŠ=?kЦБ єшХqШ,nНc%н "~Б[№=Eƒ(‹М)iЯcb№л=Ы š—7-Юа™ћЗзЋЭzіщ§Э|Г™}˜S’Ь3 Г]+~мB ГœЄ9ŽuЈэ%8ЇcщЉ8INnшњѓ'uJQ5E’!ољ@тюЗuFДќЊNЃ ŽА­‘!№š_“С^Ап(tгдyhhЯ7Џ |грF)Є•г4Й>тa Бщ$R™[2УQцŠц$.R<Ž$ЩКОL–енEƒ 2YБі5Ivђ#’5дY~œЅŽњ|Е€Р8cN %хсH6zD.ЋKpЄ"и1ЃD+ЭСˆ‚А“Ѕ$Ы’‘ № %ZБНМ;’Љъ•Ї+f:œ?>…oЊЂшphДg№АS5гачEј­нЌ?`У‘г]цj‚ и jЖ”ŽАЁ Ь}В:аvvУ/ћ4‘P№8/ZЂ>1іЉЅ[йјŸ ђ4ЂўЬыџ\ўAП9zПлгМРKv‰šDф ь‘ђKCaё{ЩЭ›м3tЏ_Ёц{‚ДuЧ.uA5н$/Лу4Мі,ЏŸ>жСоо.ж+ZFqQљ™†­žоlіЭ0GГZ ёЎMPGs8”!И“ЃtЊЏЪVвДЉkA Ua5Ч]Q)Ы$8ДAZaœI˜„щсєјињКДŸЭЗ{jš?кsХъљfЛXь`“Q ‰tШ cц XVзъ,„ˆЂЙАшP%žf˜ŸчЗ ј)ЪђpъС‘x%ŸˆЬЧПЊЇ‘ ‰.p б7XуH@Qxž^atЫT—I$ ѓФ,Щјƒв™EZO}ƒТвm•%1 ;*Тќнœ$#mыz<ж‘Эюt;jpXшq @Ÿ??ж–Рт eј7ѓ+ЩxŽR№чцГ`3dCIUdеkN@Ќ fБ“]vAеЯў"Н‡!GщOG‘ж7Žе …0~ Лн™~zіШ^ЮŸЯчЯЇBрwVQWŽЅXQ’о|ЛйЌ †тPDT№pЃ[бс4вaonwМ§8iй&хQTZ-ЫТХнRT&-*ѕлX{˜Љ~i=$TЬ+ч>е%Lљ(~СIЦсНрзпj5Š0( ˜XX+.UŽ№эfŽx?лly3юЦў№ESiRK…NMIмmpTlб`’žМ—еДœDПgѕ‡в%Ђ+ЊШБh3nШ№л(#ЏPђл&w*ЈДZіАCЧЬз;žƒЬRQX"сIЄ0лЎ)BШ•тv#Ћ~^5Drb„’И^>œЯ(єуниDЖЮ!‹ЊTЈкlщњЗ%FMГЂ p0Ѕ,Я дх!й!Е%Šƒ/СŽ›žЈvЂ„‘ЌьZЂ(rЫЕЄy^Е=Jц€єm‹dЬиЕ!tfž -_t5pPšaкп8­Iз `XќдIvшЇ}&–@ФKАŽ;|бе<РŸк*R9šІз—’фEгѕˆцpёљˆшётvЃё=аЂpƒДвВlШОКц7‰Ѓ№›Й8А€’]Т?;ѕЉ#ѓјњ? ї“+Иtb,Е{x=—• B›'.Ђ0ђˆЃі‡#бq@„w:d>˜ˆЫvPЫЕƒ4 §[J“‹Н  ЃšІє=тxRœo<@ВPЬdИHœM[н<-Ћ1Њ*ђЛїsIёk”Ъ8MqšdШop‘Dx<ѕuћ.Q~ѓУ(ŠгЌьšЬжžNsЗ›эfЧŠ*NЉя")BфЖN +Ј'хВЭlsљ~”сb€ЇќЭьtMTе1qŸ‰O\ŒХiеЉ‰o[хi…я‹ЊюPšОЬ<н|jѕf[м/—{Qˆ–W@eЧ~@7š Ъ]дсzЂ‹иАє}зВ4‰Лž+Š_]јj]‹Б26‰NРGИhТAЈ+tЄО+"п?БД'Ы(œ y§ёцa Hжв<ЪpъNУЄw|œ$Ф3S!йA•Xє‡…ЊxU•F>xiƒЦs W!'њDћL>‘^эpП"ЁЬ—*?•.*Dh•п|ќ„š,šn…нё0ŽjŠрщ.к,(жuО,Ђjфa~ZJŠWБчК~˜Ždъ>Q€!J*x@ˆ‡Oz}tЫд0mЫхњIZєИVЊтІ‰)ё4&pn†“А^z~$GkЪ“А Еƒв’ЂЄЁЂЂУѓЇOлТЗ<НЖ‡!>DwЗаО˜ЦЪŽ"ŽR№%СЏQ№ХpsгАGTгAЮѕЗTЧїУюОУёg”м5@ыььюъv4š3Ї@&ЦТU‡Ÿ>ѕyриpЕЌWnЁЃ7˜пa7јпƒt ьОФ i\M].– гёЫІхVУtК…EЂЧкћЃ д'ИRbЩrЫщd2ККŸТДlйAбn1о–6QсU#ќ^ц Ђ›aM0rм€№жMю™Ж^ k@†рЉYЈwьЈXІЋщщЊуеŒA:іћ>СфЂŒШ–yИКgDёЫХДбЃw'4: Z„РG |\@OCJнpAsд™G.Ь64m6šЩh–MBœ”rŒnл ЕЊдHkpВпе‰Бbšš0Э%bљ8bўОt$7EшиФЉ DO/=нХL—аw”mTб(юAЖu•Пћp'ЈИ?›˜~ŽафГtє›=‚йNe 4ТАыr№Е0   їw8тољbяіžќїгS_D€уГЯъ>ШН‡ƒ‚FB%Ћ’N,p™бХэB–EAУZр›N›FH0ZЙ;†BшЯЛa/Sрна~v9MЧwœ/ezМТ}{ Oл*тЌ–пьіŠЇ‹К‘kфЖAЉFЉжDв ЄIŸ_м-^5г/С`6 ‹Py1…MUнЖJЏ#ZкMŒІe9>ПWрnи_Ь4|9–DРхл*Л!М‚бъ‰юаЕЅСjV(Я`X@йЩx:Њј№юЭЏ7+“Ѕn†ЏЂЅЬіŸChXŸJ ]Хy щpЈ}ЂŠь|Т^’июEжХ1єйиИМй=б-3O4Оt\й=и њтщelРц‘!a[яљѓwцzчvŠ…ЪTMS…ƒxKS€„;u— жїEY`bL/ЪsзћBЌЇ9vœ7§АVЅnGУoƒУ?„•6Ча.BМЁ)ˆG™AвUMсnјг#FдL]ГвЏс`i‰ nЎG”Hƒ{ЛЅуEџˆ/Mв4+квѕП3лЩћУЎг:ьš"]WоєmzZ§лaџ]YUЭ Ar›уY‘п§ч ЏбELvCXЕЁ~YO§Г~иPOCL5]‘;e; #74œYx_zврTћm`ЇэЪиСEЖшQгФ№ђ]‡&уCy5и—:”VЋЫЭЮПˆмВ-Г_G|В$ГˆŸЉ;пxЎЌЈDI9Иь]цy_ЈЈ‰э•экСMЬЁk€—mZ!ќk–Žkм)КGлMбg^ЖMYС‰Їъb2]В‹ЫŸЎ$абРД–mM‹:;дьZЖъ]E8я6 Р9X)р:˜К5}ИJowн/уљLГ4v ΘЈ’ЄУЄЫіP<ЈЃ'жQэ ?Ешb„Ѕ(дЯ‹ьшз‘Ќ\ їUлЊъ;ЌЭq3rйC >m(<Ўg&QГпU‘ћЅэМiЛЖ%ŽюYžYА€"шђuЌDи~KУбдzу=ЬѓДG‘чИЊQзuљсЗБ œ€%їђ ДІx‘ЈŠФЃniL pџквQ$E™Щѕљен„еƒьАћХЁuо„+єјг›Ћёјa!зІэ€Ј$И(…‘ŠЧбG(дрЕyˆЇFˆrџ~ŠPќьАЈЊš  дƒЦnšaяvп†DтVгЧЩt>Ÿ=Œn./n9ЫOзС ЅЪ žgЎњхќz4~\АМЌh˜ЧБЃfXбОAYn0œŒњcг”Р8ИEDa.оМ]†iMJФR”бnC/AKЙя†ŒЖиšЬ/W/ЪрБЌnІŠхxЎuBjŽФхнh2}МЦуЧљrОd#ЈЉђэб ОХŠК)‹sЗE† "wџЫO3UЗLЂœєpдрх6TнД(”gъ=veтšйЖЯЩЮ–’qвjN7m"ѓ‚РLoЯп]Œg‹щŒг\Мйдѕ 8Ђ­™uE›oђ NЭ0Tnќѓїw(S€‚МаафWOУ D(HЅА‹ц—ъ,‰ЂxНЦРЁcЪЬrСž MЧёЂ)ŠШLЧŒЄкЈlкі ­тЃоl5еРђ:K\д*w§у{FбРMEІСsЌ7tЅ)v: А0В@џСпХЃЧ[R$уи†pвFMаI‘8№zuЎ6qНА^§Yy AЌ Š(5x РtъУMд5iђў†Ї): А -e„ ”а†Њ“u|j*=t yпb‹hmыЄ‰КхЄu—…tщЂэХ`=:Њ8†­ђЛAPЌд PЏAщШз!+Њ"Эnuž LЯиGвRm–Г n Н“eYQсЃoК:O#ќFјЪSфУИ"teйЏЬ†1фz0.(šд\PИTг™ЏЊЂH“‘€xO‘ѕДШ ЬС“Ёя,‹ЯМнгEХIКЮKЗІXG>’cЖњeЅ‚хni:WўnЉзfaГlQЄŠ б) дT92-*В,ŒЎp‰79ЩJАюX RгнцЎ‡uг•!.mMрMгXљч`*”œи.Ад‰пlл"’ЌІїЯГm64ЊO#д йl† Bƒѕy†љ"IbЯп.АцD•LД-(ХдЯ1ЕјЋЭаГб•.|œaч К‰6шIBфгЂi%mл:(P/.Ц•]иб >Хkн1ьqМ"IХХ/ПЬш:XйСVDщЁzк%ЗЁјeІpдєрQЊиУ’VMbNЋљэpнЖ‘)‹’РŠFЌг8 ‚0­Z|БЛс›Љ7BЭK…ЌK€љ"qўѓЯуљ’ІНЂІЦыohN`зг: |u›nЛЃЯЃЄЈЛ:Ї˜љљќД’ P]ЛЦs[Б<†еќ‘а Ъn(ЈщЈp6GwМЬAЛ… $auўыеxЦ‰Ђь—5е ѕg?ЧK(мЇюW_''б ;ЬЊ&wu‰eNюйБќЊ/=иЎяЊЋХ‚„ЈnЁл~ШсгЃюi=2U–јХѕлwИzWPТК.(ЪУгг`їЙф‰ц6КмгСŸ.Эp]еkЯOГ,HzPд1бьRЖUYЎKNЕЃВ?f—i$F[j™быBƒЪ,ЧsЫ›7яюжJˆ. ЦЈЉТтМЧЂ­nъд5 •_ŠІJ$-]xјчќ§]R§8жyЂРГ x‡ФБ#Žк—]?„аШЕдGE]ЎШђGo.–МР rDf(xОФЉЁaВcQ“E yКЂш№я7UŠ;Ч&'‰чyЦtn†Ж_E€f0ѓчmД.ЧTХ@6RЎРјй< 2ЭоŽ& œœргP'`ˆ™і7QМп’НAФсћЖ&Њ–ПЎЫШ–Сћ9эЈељ˜ѕТ0Yƒ[ЇыЬVе YЬžъМ-•ы~81*йpх,–эСŽЏчVMj9gtжQІ‡\:<,Н }Зн“M•EЁo) 8-Y[ИJљ$ІцFрGh„сњSаР€?іЧ ѕР5fЙкцСaйЩ„РˆV‰‘!ŠЙ‹!шqŒmrNu}“…ОKиЉ8-lC=™iЛ ЪŠIkЁ9Љэ€ѓvƒSNп8UрŽз]e‚3lьbС)Ф2ЭАѕB…ŸC—˜кЋыВ” Е—€Є юЕР:&ОkžЪДь:>и’С1Ђ:cKskƒ—H‹Ўh “ъ>ъЦгŽЂZІР.—œтAT`=мR ™7лcfnЛл`~СЃІЊЅ2вІО­swшbWŠybюќ€;Bњ!Н DSљ4x:”/э†6ВЁx‚Fdъ˜žюЮœSУ,ЫСcAѕвгЌвЯыбЦфЖЎЊЈŽВA‡ƒКіM•ŸмŒW*К]ЇVѓŽучє•Сz›нХjC*~Oя"ІP€3М‰`вГ ˆa5ž В_дэ ГЧWu|=№щЪзИхl%щРіКBeиUsd~5ŸNС/?й&JИ­КЅЏ”fф?GїC<ќ0`=,л@5FЙрYЅыЕ#,.ю8СLЯ№ГvФ‡пПЭ,•Ÿ=мЯU'NпG]D.VM‰ЈвTЖьЎ UЦ|ЕOXЩГ ДJеі4ћIoНŒT:ЛЊЬmquў~С‰fZЅл <уcR|˜šЕAђAСUй):š] ˜, =ƒgNoOTm7Ѕјypѕ1GВkЫ4№ќЄУ`ј1N=дИ КЇpAІ/Й[8 ыnЈЅБt|+њЗ)XXCU%vСШј§a Žўb™ЃяrњЪJЭrёrгФ†ж@юќ‚лggл!™Mы’ЈZAм4<^лU6(я§Эœх{z№Ul?Pъ=dVFiŠИœЮxиŽЪ!Ш њ1‹Нг‡ih6МЖПЌCV9†"ˆŠюзлcцvаДmМйPAjлЪт–я~y{>e9l7Чтƒ§`ЉqъrЧ$ШДЬMoяhmhTbхъЊКˆv*г`Z’f0Р8F‰o ;g$еЪњ§ ћЈxP}ˆˆž–3Е•ЭБ?м.XŽSЂЯe*лПrŒё‡м5БnP–Dісђђ‘зˆgВр FOeZ1э˜†а&:БN‚Ы6ЈД‡ТМэgHё9я\y<{ћуDƒю–д˜Rqобвќб7€ф4Yрx€'ьфђrЬЈ&Xt2ЂЌnяфZdUŽ@ јіŽЉСЩˆоїАЁ‰тнбžг]„>р+†7љѕ^ф$-Ќб{ьŽeVh^t™GT‘_-UќтaќА”hХ' S?YощЕъ†Mћ<]ШЕA4aM3 ‹ц2Аїь(Дlt[НŽ‚0NBnтhк+1nw,БЧ'ЃтT…–*,fГйќ G­ц“9ЧЮ'KЩp|л;)РD‰3БС"XїN@=­pёМi9ићFЭљўГЁЃтТšŒжЩk"ѓы=Ч‰VŽXiГй 6t;TхŽ!­І“љ’/GRtЫ&втсіђнoзpGgЬѓййJV5о#/ Ћ‡ЛŽоХР МяEє4ˆx,)†ƒіdьє•dYрoП?ŸГ‚‘Ё^ЕДЂfПЅaЊ]ЛvРНbёM(4;ъњgpЗПў№ѓћЫѓлщъg5MDb9AŒйЙЭP‘ЗРѕ~юЭp)ЧaЪEфјбЯзѓ•`сЦf7Њ†в+€§дхh!€:ЁU ОЇБg}•~ї žаш)MЦuЧс(дШ4Ул,У\§6у=H€?йHѕБM‡•a[Ь&/–Вnš6ЮŠжE™ИИФЋ—šŠ0/цгЧ‡Чщ’eUзсМ“f(ˆ9^ФЁ>”LcЭшbњ№юŠ—T;t4Pr€ŸС,jKž*іў~!aІбёBœ бЎ}tžeШјФ ‹АŠ{ўxє8@ЉљЭсXлKkюitlК@ф™Х‚aІїWПм ЂюИ†$rœьїУEмРhUЁ­‹‹‡ЧЙ—аv}pАЦ2яйsь?и,!иЕ\ЬЦзо§іюќ^4ќ†— КІц™б­5SxьќўђЭ=vЮ™[г:Pг‰И­#лд„хd‚іе@…”`јЌФѕяЮъrAЅGˆ.,ЇwЗЗwу›ыЫ‹ѓѓЋёRГгž!ю ЇЦшTŽŒэ…ьтўтЭ/€цјЩ+‡МэP>MoB›….j~4+H*œE™‡'TдќЄš№xsћюЭлЗП§vqї8МЉйq3ˆh?hŽžжCгЮ­”Ш"Lп]МЙцDYт%цъ–W‚ hХ)эК@Е^g‘чX†ŠВЗœa;ЇiфкЮmДeeўьттўюf|џ0Сžb:~‚эНCж э†2cl Ј]НОИ{џУ%h>чgcQёыž:ѓCоPŒХфyь{XЖ$/Ц Dhyэ—™<6Eз1Љ /ЪЪvЈrЅЅ‡Ёxѕ‘ Эd‘yxїн9Ы "ЫLG I лc‰јаЛА;VAbгEЙŽБ&n1z@mƒ1ќ#ж№џаR3m,АМБЦѓahОи•ИGм4T4іљЩлџ§л Ø/Y‹1‚NУRлсх LЛ x*й: lSЎA”OGџёІхЈџыnxС‡cMсўs[гчvšwN]UўуЭ„aРЗžѓŠjц=ѕ}лŠ>ZGˆ/Љ+гаАtТ2^Јїњ3‰˜­ДЂеpч†R&jOА”‚2MSG`žЃ8ЏЪФR%nќгЗГХ|2]ArKєИЖ]EыšЮkРЊГУЖŠ]ЂЊ:™сёh ˜РAuЖЮ №ЛАфєуѓО)ђЊЇНsC`dЛ­]ŒчЇы("sљуЛёlЙX ŠbD ѕлБЯгtтŠњ^OOЛЎm•СЂиљIхЅПK Dс-‚~2m/*6OЯРіЎ№MЫKqЦРУ]XœИ 7Ž]№ІПўzЗфxA’U;эh€ЄСpЈЂ{}]8“ФГєеэеѕшqОX‚GРНр€Ѕa:`РdQ” gнУ1??•Ž&ШК•hs:БhЗ[k1ижDyљўbЩaJQбƒrˆжttЊЂЌЧнЏХќdS]..GїГv`ы/9KE"Qxn(g<гO›ˆ+I7м|ЛЭ=?ЇЙ#`šыЎ XяЧЫ @kDжIлнP˜ZХŽЎ’UрЫ‚“ŽmCYoFsAУZZуE'ЊšЁ3–WДГўЉv Žеьјe“˜€EP{Dd€knтЭJІ &аУЌ ХMуŒЈЧЪФ}YX•z=Fo„яф№юп'жРBh'.7;М…O‡Тжy Dм!AЭ*СPьjWgЕ2ЭЪЂjX“И;ХкЬyXjnEЫšћЕkъм#І  єхцЈ DРМРНЧЮчO?юзЖ*h–9†х‚к22Lгm2C•ф Ю]1’Lps†8ТшФ#šЬ,Ћ8|Dрд$QfW<јqЖњт3!лrАх”œєЧ> HG‚-3mS'kДбл6)bЧ“љ|zўa)Jf˜cм‰vВьћ|pQт9ЭХN§ЇmSхЁmJїœn;ф+ЬБд №Œ€яЄ:|њєБuŒе\ГУИ†CВьlCГt™Ѓi ѓpwџxџўb^€Ÿг&ŠЊGY-xQжэЈІЛuрОc*‹‰`жъoџ=ТёмqП~ўЫsa“Gе Ъ*OiЪМьЉQ,CЂЉ Ϙ3гЫы9ќ7-ЛЁlaШхŽ9еphKї>3U,'гЅХ ‡^иŒ Iy…D›OЯбЧ#йr Ьхc=^лгЂћ*ЖˆІЉ’(sws8T'‚єCц`mHЗŒaК AMЇѓ8ыГКЛЭOLў 4Ÿ/W" ЊЇчЬдЏXЫNЊц˜ЯЄЕа=š CзБ‚z>Ц“&^œU:i›YкђžбqZФ‚pЃЛй’§Ъгdч+м–Јмƒ=4VWSУєуuйlџš’щ ь !‚Уžмœ `уАкГЇєћ&0х%fuуЉЋ9ЫƒГў5йfeœ=чѕnWИІp}Ї–э„IIУMД•=ѓLMеt№§ц—яЯ`ЦuтDѕазПЭ}K—РП‡?Њійƒ–FП,€ђѕf@‚1Д—зэІ]лЖt}Э*Š,Љ  vC_ЦaŸЛVЩтђічŸЯюf<Кtв BшЇУSБЂЇmxХсy“ЧQœ$qр|р%оk’хEžЅЁe 77 Qd—Œla‚‰УS€yс8~ѕxўгOgяюX ‰ъA‹џёiпe8ѕьёL п<^ЧNбиЗOЉаќWЩРkxЖE •}xXВЬlќРъn}`нŸїЅЈT’…љэљogoF+Q‚пйею€е— ж yјх|ЎXk,pЋВдЧЮ…ЏЧѓK'`џ, '№,XБѓ™j­їEЁ;гD€|ˆЁАг›ГwЗ ^ЗЯЊЉ‡ЖYћрyЋтј§е\ЖR0ћ9FъсУ_uЈ3іNУ†ЕтˆГГ_5;й}ќєЛбЖ іъ<ё-CІg—KЌ.VН=сmюш"Уђ jpтхлОŽР ј&ЛVЂ‚c!рRšDYН™Vzu8|zІGhFEpЧрМPгЩ0љдљ:{wѓИdцKу=8\н&ЪЗњCJ\ЯY$ђнййЕd ЈџјщЩсl˜*ftёўь‘B№l žtiЉїo~-8<?л`’h_wNя_ ”sХi L яЮЮРФИ5ˆь_>}ќє юуt8qђўlЊъ–—ф К„ћЇŒˆџёУѕJШсFEп&Ўљbѓёў‰€RƒdНŽ,ТО’X.x[pЬсДŸ?эcCZЭЇЃ_П?›€ѕCcДЁЦ'%т‡џѕ§5Ћъ:ТLЭ Л*џˆ\v‘dрJ 7gg3Ад8и ;[q`и.вљЛw?џчŸў цH%ŽЦ%D–2њўЯя8 5ЬJ[_aўъ?b[Зн8 tеШД&yїќ—П|м?}|їУЈА§qфђњ3iŽ W‘e9PБф і>Р4vб…бїџѓЛГГ1 Nду-Ио‡>2еХ‡~[(˜h eОДOјOЩtзvUјеTвtEAч|GœU{рЃŽОћ3nПрD^дS:­ђЉі‰Цоќ|&с1ЫњZг›џБФq,B#BK чsXыШЦьѕЎСЙќфŒЂ{ЭўщАнЖ…K ёњlЊш:!џžХ.’њйќ2ьb)˜QOуьhА+з0иhA +`Кp ƒ [5Uѕ›‹Цпаєь#сЮ…ћ§.З uŒuуФђ|„n$Y™'ŽЅўЛ™§ПHД’э~л•иQ˜7 тbtніSpЗhGДя{p§ў1=еь5sЛ†Ђcэ‚i М Šhv]ŘДТР—a~Џћ$тL/п4№,2Œ ‚v ЧŠ“У‰Ъ<ђh‡‚ёэlр?'ХvЃ4=Ђ№Ыщ ан_G]LМbХЉKkО2rўRRСѓ\звХП…šsQ5=мђBI —"Ї–вќЛЃ"а|~|•Шз"–јпУ2і_ъџФљ_!IгфoŒŽ^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•^щ•ў1ЪЉыEџ]ЄZЎы§ЃyИwєпвйђ;$ˆŠщ…QЙюя”H3’%a˜DžѕпЃˆZѓЯвМЊRЧњ›іB˜Б}ЫIs ,|ч›ѕ ў>~М^892LŸ§UJVмђlщfЉOмДРu5и:/8Oч$ВТгo;•Я|8›№Šaи.Ю‚К?;[LяffRБЪы^ ЗщЊ, _fzи)4ЌЇ‰dл}Ÿѓxѓўб№Ђ$NbпœŸ]LчуЋ‰m—–ubzыІ+уг'ёўAbMB7/ЇМ5Л62ЏoFS-ШpО~итйлѓыѓ;-)ZLl[ЖMбNЫ,џрПSIЗlЧБ@.g<ЮР-=іњQtКuВэъШ–ЯоОљхBѓКЧЉе8v0v&qрџ[Nš1L;J=ьУ’‰хgнЖ бєУДьК"/›&ІпПљљоŽ’,Ы*км—Љч„‘kiД}rіm:Ц?g+*жЎ1=уМpci€Ё$ЧЗ›"А‚ЂЮ\}~ёлЛ{Уw]л віщщi“%Оэк8wZz<узќvНŸ+Э0нЄ,#SЩAваНЃКHЋыъиHжжЁ%\Оy3W5C;ыŸ7ЉыйКЂЖИтм№|џ›uйJ–e{qQW!‘сЄqј<. УЩщUQTЙ/Я•ДЮ}[<џuДtУюЎ„И=4ЎfX†fzIЖЄ•IћџО зЌcЛи`и6Љk)Ћ•dћQ КьšФЕ§РЗЙ™žЁ&Œ~IŽИDИЛуvпХŽч{ARtmъrœ‰ЁщђЗYsУі3К$ЕN}SЧEг89УJ›м–Yо0„)уЌЋPхoпЯM/ Пb%gН9КЊТED8‚NŸ‹nZХКЌDљњlOUУ)ћЎпњ& mВК,чSFыЕ%ЭnяяF35ШšЕM–W+еXyлВєЏ7hчl…ѓЇ]œcАИб­зд– YWugнДe`H7?^ tмsъюvfЙЖx?бУЌжриъУО ф{Ю J0ю0m:ЖEОзSЭВс5 ЕrпЏ‹шм\дM'ЬšІЩ}"_ЕRАŸвГ іv,jЪbє †ыЃЪжы 7iфЎ4U\0Ѓq•sИ–qђВ‹BKPW8[> œЈ}Њ\UИЃYўЌJ•…ІЮ}јљrZˆŠШ1ГЉЄM_ЏХvз­=~ЁУsя[мЕiЙб: ЩзщeeDEСIPžkщfВяmњ(ыФFžЛ* ВШŽ.ц’Ф/Fу‡Щфњ§T1LУ Ы0kЋШd$/пэКФтV†“є‡]xŽы%e:†іђЮ8Z‡Y)ЊnhšS6ЖX–Nsм’a1Ÿ\мЊбсtyže'7sнrpеЁС N\UБ#ё`Юw]j œс&§гО+жqœfu˜кWА2‚JL И–$EU4Џ}юcТВІ—6tЧY$ЏVЂД\щІчЂуƒ‰‹ЅцDqЮЌТh^о‚JфѕДпosG ;lO‡ОЋр>l[КоT|бaЌ8>‚t‚ŽЊЉ^эvmŠМ†ћcpWGЌЪšiШ‚jЧЁm ЛвьЌЪЪЕkВ’*Б5ьл:0•Иыўљ—gр№э*ЖСШЈ/ЊBDwШ†ˆCЯѓќg…Ж*IКd-.Н м Д5AqзkЯvќи'Яыnб5јD|В<А Юњиѕ9(йєщpЏчЇ'ФSˆё’—‘3@шzn4uC‡іuБ‰вЪ7.дxTŠ љEИ~’…DхEтсЕkOcu7LC0}^‡лЅ–ЬЋ.XІAВЫ2Ыrмaђrr§Ј@rОы–kЖOјBЗ`”›€F‰_а=q•Џѓ<‰РЉ j„Db$Ї)з]NДм0ДтвБїM  №йі№ќёљЉ= гѕ#[ЙqA"ДC_хxICз#сPє2tˆШЋVмрЭд—€цъ2 ЂЌpсZMСРЫZаnжЖЪЉИИи6НЧІѕ…Ћ jа<}ќјм…8d›ƒ›юXКіb]7‰.Ь'+Qжмњ§ЁУMм]…[dтчИР8ж™•€‘OЃЄчoЏ9IDГмUО%/ žАwt%Т&БT#ь@<њШdGw“ЩR&†ЁП˜|ˆ`1˜GАг%ЫKv‰р2JqM,šfU%qOъ‚фfmSfO2SeЦKUхgч;РЂІGэ8ўzћDч.tЕсзOћмV&з–]-XYгД ™Бьb6.8^E^6ѓ§SbˆІйlpЩuУЏСОф.Б’КmЊрIL”йНlZЎч‡%ЎА5IЧЕ8Ю(|~о­-гЏ8ЈXс—ŒЌЉ ;уОт™сq]„ч4]гНњpЈ=МЭа“m…јДMІ З$u[š<ЛYЉФO‹ /@Yќ/іОC9Ў#йŸВБћ&v$$zОбОo_яНїО @iП~3Ћš‰˜‰™e“”^l 4 шМuГ2OšЪcк~1 y`ё*є‹нЏŸі1ˆ^ ]aюжЧoЮІЮќЧвТqBд9УIћуоfЃ€o†Жˆ$2{fEBЙКђUiљq*ЈvJжІЯ=i!Z~E(!€ЈШоy’Ј‚щ0-•[ГЈšќІSH†A~ЈcлЖ qxд@h_{јИ /ЎКЎ*a ЅwD’3Z“WwYsтig‡&’/ ПТ‰X„вA„Ўс˜Qјс†"kА'КЁЋ_Ќ"ЌŒ?„g6 ?L g{ащХеtУЊvP- СŸ# bзTž"o–јKДFdrc:г§і ]ї‡v}‚ПMьЙšBœ- ПрГLCџRМ‡ІAі L‘!уl’UUеy^•Јѕ—-ъК8I|њ2ДВЙЋs’“Д„’ŠђK"™K™ТG7ubH<ЛќeЎЊn†HќMи_рЛ?O„`Dсщ ЦkJипЌЈ “6Јa—9ЦЭ*Ч Šщ&ѕH”М[œ]† й)йВgŠФЁ+|лђтМ€И\жяgЊъЅYTѓЛgіMB•AшIžž> ƒкРыizТ_ŽЧЂ §ќЄг œїVKъ"i|т˜\|У]ьhКW‚Х&лŒр=EРз“иЗ4юуLAЁA…RœЗIЉB)ygЈgDE„ШwЄ Г]]дe[}Жа*Ž8оlYЧЁ E3>‡ёyоЊŸіћЉ-йъ]ЎrЌ )Шм†ќа—SП‡фђ87Й1ˆй „5№ИGœ Iх&œ%ШU%Ўт§Гѕc ŸnЈлйlБр5?ЛA†‹~DfвЇрQ6[Є ƒЬz+ ­ŸQћіуTб\ˆАШmЗ„(‹2Сж<ЊеxNPG(!M_Ч–Б(ЋšІž[л лwt@aГыл9')КдЛууn$Ч ™GJ‰B„nLv кФд,ЌЩЋ…Ђљ>7’Œшu<бз€'дŠDGNž~І`Uc€ЌY‘?ћ ЁбдU™™о=,A6‘ыgS>RV6Тjwт№.дэrБBЎˆC8юючZОƒбVУнуёDГCў‚чђщё„žі nqq{юЏюц^рЯЮ&ЌdнЋъиХЁб,УK’jdv>ЅFzІўЂBЙК]­œёŒIviљvЁЈN˜€мYЦг9D Ћ‘ВжІ#d‘BnwYм.&зЏЇœЂ›švіАфЅbx5U9NЖ6Llѓ•ё‘š‚=Ѕ?&ƒнnQfГLвцнН(kAр@BнЮЈ„’щІ‚XЂŠсћТ4Юъсњъњ~ЖєРtчcXнŠ;” ТО‚еК)жЁ;v<‘}‘‡ОжY–сд!‘›,1o>ТЉ4т" ŽрS‰ЄЌ;brЇ7vь…[LюVЌ„Д€QьYІrІ#4ЫЧая0{5PљaћПЃЄl;Bœй7Ў$нбHыззМ,[9сг-*‚]N:q8БSSž†нBЎ-F:KРl q4;=Ohг№В"ђу y'!ЮЋЋ\л0ЉЬЯ,ƒ(4>S—XШХ Ы’РsgЋEЭLк6ѕ,Д`В1пR№њЧщѕмш ќGj3DiUUТ~ыЯO~И“ЭЫiьHШQа Qvфg>{rІсHvM7RVД$2И1SзЮ1zœaEУОЭc0ћЛžнЭE#л?ˆ#џ„Yн{”МAън"дўсе=М"0?=%FЃTsDџƒа@y=‚(ђўЦТгž‡шA?‹р…1LП=вЌТмƒезТŽ№юQЛёD~> я5*Ч2ШЌы:RјээЛ›­Є iџrc:ф{BЊxziC‡zЇˆ Mмr8ъй8ЇЏlЃš~oПŽC^нм2В]~ї'Т5JШЃG*IKЄю#ŒoR]І7FRНдІщ•™пOр Њ#r DИMт[†Ё ѓ…hјNDЬрADцŸК­ЋТWЅЭb €+-ђ4Iђžl3IŽ­8б я)$иЛкSиеj>ЙОœЌ6МШГgфЧxгєђv8ьKœ*ГД”ІŽ”uOIъ1mSSнШГм_юЊЪfОT“ЄB&G’^шPA№(а№ЈйIWіЇђ ВИЮРo6лэ&‡tC”Ф–.1ŒфtTюШ›н6šd `A=№ЦA”EЄ+ъњn%ЋІуy­ њz<‰” oП;Y< бGŽ…Ћ)В$ лх|>oyіѓ“z[]7tиАгš$z~ЄPЙьc'Е#n ˜h*tшњQšyŠШO/g6˜„ЌЫЏGђ>d+ЩT;цЃь›‡Ч]‰ф$ВР.gw—ЬF~vYрv €Э­Сr‚аŠЂ…#2у<žh3їФюЂШ'ЫбǘђЈ|ЫіЃФ“E…Ц|"ˆэ@Рƒ‰IŒЕбF’Дu’Ф#ю'’и62aГИПљ№ўз,ыГ+0 рDЇмУѓc­иm0n>œr,m}Fн4Ф˜ЋКЪƒѕ#оѓњvВ• €A–уxЊ3ѕ@АЭЛ‘дŸRVиBйmїћЪU…љѕ‡їЏп/UлЕэЯiЕ­Ј;ŽЙoлЖ_гpŽdФ1sБˆЇШ6ƒЕУ\iн”ži‚ŒžЏіўђ†е 9ЂI9БЇ‹˜ЩОЇќу їупI Р?”ЎТLnЏ?оl1>u>SцЙ‹хДўxhГРѓ“і€щNZЋ$~xЮ›œCTgиъОѓQћa[аU…Й~§vЉРQtл-рЉ№,Т~XŽ9xтp‡ОЪ‹z89ЌБ tIXNu‚аі>ShСГуj€иsЈГД}~"Šу)оЇDю$Gкu'Д„Ф&rєъp6я_нlE‚4"˜r’œˆе!пКЃ'zЌ"?LbqЏ!*ї‘47LуЯZqьl8>~z €ИыGš["љYŠJQ?ˆНы[К@ЙS[…D#Аx§QPБqD;ЊЯуГ[НоSњь}:–ц”~• ‚нSQ•‰у~ІаВэцЛcбжnЈђœ;hˆЙ‰mЦУз4ЅЦЎЬдврk-]поЌ гCЮ5+эА–`ЅсЄнhл‚B((ØN&“‡Щ§d6Лћ№‘1ќ,u­Я]Пњ№—япоvOc™ШLЏ(КпR"н|6ч–ZRUцшрЗ MSг=фєtrxžЗі–рA"6QrД|^лEfЙ\,ж[–нм~˜†у;чфЈ7ьцсн?Пћpur‹’ФoVРЌA—huOъšM…ЎБBю8ЊАў№ѓFQёх˜nйU5ъP”†d=bВг#nxWeФt2h6R7ШЬl%Тy8ЃА’1 xѕў§›WЏоо­8QрЗЌdјIЋEL н#јЈŠ2/ пАQMœ&ќДz=bРEа№6!јH RУ?УжчIКоyѕOьl…Щннˆ№™HмtApCр&ЦЖгŽbj€GM™]!ѕ.zS=юQ=тюАt7žЂb‡:2ј5Ћи^\дx:š*KpѓНГ*‰янЪёЌ•|$AУ5&Ъv<хЉ'')ОрQЌRj-Sкммёœ фšЦBЭЇСјHѓc}O’=C—иТ’QРЂU;РC СџYYSЌ эЪм —T5U€Ў9~BZ8NuИяЗt4о*KxМLS“VooD№IšЎ™9m,фIއ(еIEР]ЋpвчСV]{œуМоupЅI5”Ё q„d!!bxЖІ:ЩЉ)ЅЃEсžЂ<а[€e]˜ ЁšИњxЧ#wІІ˜ЊiО'JvšDb сWј,лѓЂьb0MэМNй‹šО‰-yЛй0Ђ‰ 0и_bЇ“Щњ“‚tЄК]#vЏsƒ—tU`юNь&[u_ЃN#ЖCRкІ OGŠq; ђN‰В}—:š$0Ыg†iнЄD˜ќ™МŸЖШyсЕ›НY>\}Мcu?ыNХpэсОЁF“мtUЕЕ B+{џnЬЬЊ–`Ш‹ Ÿ’фxifІд‰GˆЄXAѕ’ВЮ :–Я,nmМ uyб‚АЛЁ‰[ЏxнOыёTпST?ўŽRб'6Е)Nѓл›7р] X4ВaьPhЂK˜К#oiGqvЇі28с>(ŸИЌЈl сЬ;$Жc3" ЫРRР:ЄIї9Ž&vš&цHPŽVЏЎкЦ’ кЖWoзЌdZК[!Оh‰ьhФCa Кд.< -V=|зрч+-Јъд3Ю*^\`чуrВ0|?ƒ8 qEIжŒЇd'бЈ@тžІ!С7ŽЂЙ–АљхяХїbxJдžd—hkЧ)™G&I-€кч`N ц~ЅЧEцщЪљЗuцВ–(ŽСЅ$i’ц`Ёw$7„.}џŒDкДЕ­юЦ.2ЭРжo9бIтИРo!АŸж.ˆJcN 6šЄœh’ЏыъQ[Ю%?ЭCѓь手 ХѕА‰+Ч&ЃМD‘IіŸ„бј'IбМ :sнджWV ЋМjаuЯ№єЅeM‘&yƒИšU@!gё о‰ŠФ7ЮnЄоB<чрŠ<+Њnј=Џ|8œ:jh…dЉIЦЗк*IŠ@м@”&AD‹пDџ{bšb–ЁO=@ш`š)N…GЎ#€”тdЁƒBњчyq\Њэј9 4tuxЗѓдОŽ:НЖ(+Ÿп@ˆ&њЭ яGK4Єb_Y82Ыšэ†eOв“Cƒэѕм§хƒh:юљ=LчЃDѓл Ї{y˜ю=eУїЇF1ƒИL†b(R9мцfВх „)јЌЈhœїGRЬ‚НnB_мЯ8MЗ§ЄРahc@ДьќцУхнъќ†ѕ5иh0ЈЮэ№œ? €ф•i}kw BСд3˜фксж?nЖ‚йcкУА{F‡цР[ѓ,ГџA\ŒЂћ2Рn€эУйукZЎfœ е •8@эE–ЄЭžЖяЉž’ЊтаŸrПC_YsѕvЖeyеЩксљјюhё†uИШа%ž0нšиі*8Р%fё­„МхјQСaбэIoзaзfѕщf€RЉ!ZB2’ФЯБиээыЗ“-Ыс}ŒўwuЦфљПЁI\l>6@!Ж"ЖІфИЏЧp/˜І!‚аЁФyЛ'-ІћЁŠUрEЭЮv‡чV„S;bTдишЖЖЖЬэЯ?Н}иlЗjи ї:вк2йєЁЭЧ†mП^q€ымМ'э Г%kŸнЎ.` gѕiŸї-оРcg+:ў.єŽњЙ=ЩЛ`Hжд.ЛќєЫdСАЌЖ#ZН#­Љ}ТЈИ=фgЦБљt-*К_ѕ­vиЉxіРоt§‚+zь†*СŠтfБ• +юіДЂv gё@O#˜ bš€ч–яюyŽDЋ о~џмwH~яAhѓMАЋАМќ0T+‚“$QњвѓЯОХХшvP4ЄЯќWŽщYрDU3˜м+Ђ%Рнп… €­Ѕe6јцgyХLаy`-ыTŸ Н]Л Š,KВШмОz3• xЏAЅeг–ўYYК№Z'рw YSx›І"`–пД,?эh+ЉЮ ЖќH С’iћЁЮoяЇфВ&љЃ‘VjFbCЬІЙщрXžчЖ‹ЋwПЬ–AšZSЯ=џ$*ЖVŠ"DІ.q‚Њ8 !mvДПЇљ&вё Є U‰dˆlEvzЛс8Щ+[Ьђ;Z4EBќQЖ!3‹щtБ^Џ7ыеУоrс)рРмћмbм?. vЭuёЖˆЅ › ЏšhPАПїї“aПnˆЧЪРі%„%›О›А[СЋšЊ,ъ~ulvˆOсxˆый§§t:_mр;ИЭєюіюцvW:LчK.&rXы1TI‚Л›rјцу‚7Кo#–Љh‹ nѕPЈь–й0 kђњžйJ~‘љЖEЬЙhжЃэћЬГu™gVЫеjНођВŽэƒwoП{s}uГтФ/жФЌf“лыЫїЏYЩ`‘cTвчEB‘Дб­‡JcYˆн7›5ГНўАцx#mEѕ!@згjaщ™ЊШ‚ЫlЙ„ф{чфЃџГјрИlФзyеЄ{jGыЌД m_cqk5}И}}Ы ЊыYВ'кHзfлRƒSљ–КžЬћчLѓK‰яЈЬцk_дŸТkT5ьTŒђŽžCЂ";в=Fр}ˆ€‚fywѓс‡{^аБы‚F|ЌнОышQшb[уfЗїKVж лѕУ0-ђ8РZќЪЬТїГХrЕх+ЈNЂˆ3iŸџ$`2АФ–]OяЏ~zcЃ`§`УЫ!Й–‹ЖлІсЛАр&.яяж"–H]?уš'!РѓpПЯЩ№Њ=iг §­$ Ё;ˆ_–нЎgЗo8^б Џy5v‡“>бѕ]{`ї7ѓйlЩAА~QB„ћЮU­ЛІЫ ЇрIц€Бu”€э}uЗмб4b5ywŽCр˜ЩЭZ4r’гоN ъЈ"8‹ ћУжгй‚№ЦTЄY:юgЗyќлЕр№gг+BXиGO=миѕ‹9|„œЉk€ЙрйХЛžчйљх5'щљЉ>ЛЇї](ЮТюJ0u№`ых|)ZeшšЮз@БСлЦ€5”8LрвŠ=iЕ9ю)і Ия2пTIXН{Г`!4™^=ˆ’‘wуs @|ш‘v#" ƒУgш"3ЙнрmiЌ№~™%Ќ3уЫоеѓјмhƒ-аЄi–F%€кЬз5YоМљё~Эlж‹#JVI’Аxї4Р$§ГшЖ!LЏчx д2ПŠF#г<МЗ(N3‚љhНьqЄЗ›NdзcIЈŒ,Uц?ўѕrЙOУ‰’6ш;Ч6KВ–Xrѓ‚рD„п9)АИОžoЙЏ4˜‰5ёFV…ЕKˆWO}AДW Ƙ\хЄBU БY™КоLПџЫћР <ž] фю_щй^бэˆ­$}E{аы,Kb,x~х9R&VчzLbt згЇOOd—щеТч kпGІnљIш’0§с/oЇ€„Iжƒ–іwІ†jxiK[дQЗv- tЃYФ…_хѓѓm;Ш’іщзO 3˜@йЭњ9жuO”c_™’(ыN˜ВИzїнћD.рЇэДЃ;ш2РжАI'огЇЇ]Ё§ƒ`YцыŽї0'NЫ, А њ€нЦžэYЗ›ўРЋћB@JЭv-Eфя__oA5dЄьIЮcHMY’dеЋёЖО2LСMg ўыЏ+Др8~љР„Ј:ќњыЏŸ[O—XIГЂn_ћ†™єhУ # CЄХ‡Љ$т…s/kiBx,=№—Џ…dм:ruaљ№0C0№•g1щЎ  РаСvGPЇ]b(ы•-юWSуеЦp Œ(Ы лфr3М0Уy Ф.З‰Cв3V~РЋЏOG 4i ‘РlњіыB% ФЕЖ‡ї‘…-ъC^2Š RЇ f=ЧИ ѓ~Нц@GDa}}ГEЭƒpžd=H:‡ЁpЌtŸˆеь3x}ђ Ђ.0цџ•ёŽSуМЈь№ZŸ>;8kбаEЖ1T@ЩЫхj~ugRёВЂjGВе­Џ‹ЯБœюІУггОŽpР‚cЊKащo2Р—б‚и˜SШwПSSЌ +ТП‹]М^K’ Л:0E‚%Ў–ЂЌКqFЈ™.mц /(NXэžž:_S№ъЎЁ,ЎnОђмЈпзAЫы–ЧШЏц†жu™cЁL!Т §ОУ{ЇЄ™‘_`Ч(U^гLЭ*Тьz˜бЫА_И6Хљ’easћѓЋo$3,Р? +ёюYђх­faўЈыš§ілџљ u"є]“рдФЩ‰и›яз{МnвљњъъУЧћ@~йp‹ЁŽѓ[ЋЦяKВ]ƒЁ//.ІŠiЇишп~%:ђxЈ}'0,п]мђŠn‡i‰EG№€–|џъ‡Ÿ>NцA3ЃКŠlѓь‘ŸНлћъй†tЎ]5l8 РO "œГУЌю^1W5ЫOЋvG’hЙ!оќјПП{?]уГD)NИќЩDTфƒЃxИИXkІ“@xDхЩ?RM˜|ѕ§џњ mњр3є—Чв”юўізя^]0’nCјf”>гХЈ6!йр€H|^гг€eЋlxѕ_џуПpЊf‚ЯЌЩ„ŒЮUVјыŒlр”VSћЃЩ;dАзЉЋВX1эьщ§ЙЇO`%РtМљŸ єœРа˜8‚pcSan_}wБФ’…m~‹ŒџX"ŽtФrпЂз т kn]wx: 8Ьхп@шЋГхDН8рмЂ„№Xп †ѓc~уљоџrБЯѓј6 ^|r’ўё0ЖmcH,CО§ўттfЙнr’] цmьL1UФЁ 6ЪŸЬВГoЃ~8аpъšРаЗoA=‡ЊVв§љdhЙI7јЂКџзJ шnБ?Аu“’•Ѓ+їx%БlГл5ЁЁ›N”&Ючпі§v‹3œ|GгъиtиF†О$C м(mwcсЈ‚„LіЮТћЊKАœ ‰M™aЩ энрvнтЌn2GчE%aZ6kЮ?,Д№еEŽSŽёЙёъFч1ё-U§VЮЫ№Э–фиОХqф;˜О1Ь“З[lyI3 ‘&лў­‹—кЩIMтРЮqG я ыКЉ|ƒЬз—-œѓfšІ.ѓџЌ n=8–?AЌџИ6›ѕъ_рЕjЖ79c1џ(й^жЫzY/ыeНЌ—ѕВ^жЫzY/ыeНЌ—ѕВ^жЫzY/ыeНЌ—ѕВ^жЫzY/ыeНЌ—ѕВ^жЫzY/ыeНЌ—ѕВ^жЫњџsё*ŽSњГЅјœХˆІу‡џ–GM0 ЫuŒ?убПZŠІс]…, œVЕХОiо€ЇIŠwЬџдkЫЂДjк2v-r“сёwСи5Ъk ЦNђЂ(ѓ$ ь?№тП^KУ‹a?жБЃnЏёюˆч{Ї]ЛN›ѕУ…fYШOжšЄe]хaрўщЗ0ЖКŸя]т№ї—я/X'ЪЪ, =љттітbq{'јYгd&Г5UЕЃ,CџOг^гQоN;ыw…Ч_]N—‚“THм’yЦттнэфъ’ѕГ ž)ѕ§(ДF @?œ?щ†ЮFГm2B№ŽгММяcsyУ8>hhЪК­#8ooоО~ЛђђяmлTЉЕц]пГд?чТ‹h‚СpqJjj=•ЇШn’Wmп$~Xе‘С^МѓгЅ'eгŽ„ёЏЭ|vЋ›:RЈџё"Яe0ЫIюУNoМˆвUYV6ШТ‘лЂšдЙЃЮ?М}{ЃQ†y9>=ъих78юзtq†Љlър#ЏцMщСn2HЙ@“гaџ]›ŒеM`rПМzїЫ=ЈОnXasvLSХpЃ4Жж[Ђѕ‡љPаf2ЙНіMiБжќЇdVШnQЅYY„#EUхYќ/Џ/oячЫХlВ1ГёPВnй–—”m•шkб уР5•/˜Ÿў92уч6=r/˜ђv­иЎg›NRЗЙЋ![ІМ’у:б…Л7—sNd“)gƒUl#чiVн~,B~&љiљž­џзЃf X†ЌdЛ]›К8CiЫsыяuЈsСP–K=ЉНz{'˜†ИXё:Nі;z$ВТYЁ]b-чЊ—8"ї;БаLПЊгЄояћ*АЌѕѕ|Гœ-EдXgяЏяЏoX7Љ W[|˜Њ–Ж™l8Ћql ЁcРBe нoЌ (|л|ЧжО­ШV6œДLМ№џВїк‘G–ј“=gчЬьH”DВ=<Ъзѓо{яM94чя7"_вЌДZ5€ІДч )v7е@!^ОШ7"3ужћБJ\K[-xE’T+m›ФV—?џсч™ъCр,іъAб…Х-ЄM?ьАk2‘q<‰ННœ Њ\гѕƒРvОЋе’a9^ZDЖДиьЧдљ• [–fM[gЖЖљг~\ƒ—Уќьех–[ноr^\ѕЛ§ажEйtус0ІцђAvТІё:ƒ8pОЇ‡0:иœБЅщби‡К$ђ[>*œДР„,uўћ>нЏЂ]ЕОњ8л.ЎЏ6vT c_EЎу іыЁ upi7nл[ІЉo[пgгиa$Ž]U1ђ]aё+šcE›aєи4Ъа…Ыї77зW—їЫ-НИО}и ьj>}№2ВJА“fЗomН5ќlŠР€БbCКяХЁ–6ƒr]RНnŒДѕЏъІW ќnъš*Ьn(‘Yм~О~XЬЏ>-PU^SYZђЎLъšv“юАЏcУZ~Йлui’х5іїеОЯTSЂ$‹"Мx•єh?кrЉa/)ьN_8*ЯP7ŸiUSEŽЂšš]n ˆзЖЃsœер ТѕжI†УXљкз!v$z~ЙghпЅ Џj0’$HќšЗЫИ4MйН}Ј2ŠКŸ)†mk8T_ЌuˆЈokŒфgulыЫ ъOŒMЄг’@d?aўqyѕ^Š88 €У6TQVђку<ЋЛQ…"C­ЧaOQЬ(ё ЂЕЉQk аБH=KdЌАH]‹Y(!ИGY’dyХјј_DМO-E_§V9ЋР‘+рЛFК;ьrKbEнŽ* Km ŠЈ?Щ‰€KЁgЈєVЕѓЖwзе‹!яUзМпфхŽ&gћ__O‚ј†ЎОЎ_У<Лi=tM•gqeнёАo|CB№ЫaзžЧžЦ‰&C Peh( ­9хЈvhђМD!$Оœ]ЁЌg  ЂюDнёёёыуq‚(YшъЏЪљЖ€ и„%WКIБpu”R6Ѓfшz #ЉЃpВS кqSƒбœ`њ%Њ*ЅЖDыžKє ЌU]2[сepну/_Oc•&(D;кѓ…Ћўz(š ѓ„=ГгВЧVШ;bшSЧPXFvВIВ4ж9VїkЂгмјКЬŠ–bЃŒ64xС„ьL•DГФ.tре2+Л) ХfdЊŠВ‚WГyЋŽeШМЈHчѓьˆ№S›Ж&№š_bP{тŠГ’u)›ЪUХѕFХn­~ПЫ…tŒVЌ ЛœU`pМaУТТЖj _ЖПDѓтПlР №ЫЛй†D5‡юГ(­!S)#G%+jјГ-PВ_tЬsSnп^ГВФђzvш"[тdУвTнЉБйіnH-Qv+№щЮS>н.з[š“UѕѕаzM1ЛYЌЖ4ЫТ;Џ[:e?іeёQq+№ѕЪ•%;CаnлЎАUцf!(Њ$iСА+}KАBi„D’сиGІbрB<Є:sїіЪ79Jr SьКм7U#щЦaьjёюaЎл:дфэ №+? Уl<кФSжй„иMЧC ьієѕ˜A”еMхD7ѓ5ЭС+} ›‰ММm{Оя{žці‚Ељ›™ё!mЊШ1ьД%ZжDЧхnЋ@•ЉыЕb†Yž—иUЊ Дћ[бŒ{ь2v:Дi˜v‡уу>54в—ае$^PPёGyиƒWч DbžчE–фAмS‡ћ| c{Iћn˜OŠ#q˜ё2€Ÿ=c53HгŒєЋяS§ц P<ћ‰P”цt:ю M т,O}#іе…ШјтИУpтЄЌ;ЂNмЖ#Ж‘л—ЎД €.Ш†Фa4D\j"ƒѓ*3kБзCШ^к­Є/чс@zаўО.ЊК)ѓиsБ[h@p^jДj8IEкжЃJќ8ВŽ W4”FbtЋгD†{$R_@5›Њ„иВ]bу%cC.ާ§|їH„HTьјSŽКЮU•ЇY^”UU‘ѕвЮsУ@ш­ыКi‡нщ+iu}кeМXžgѓŒ‚в\(mFЄRœTu ?\t5eWАiљйБЛ-Ћйш“ЪІсdяFT† 'JйmjыЦЫЊeЌa‡ `p ЬЃэ€* УОMEЖ‚82ВŽˆœIь2Žb (EСoЙ’шЗŒm[TU‰€ФгI4АујˆfЈJtQ—ОL§eйЙdйaœX kC08~}‹Р–+(ъ,IJ"{‡6иѕпёгКЪ|]ч@u H… F7#њ1Ю3‘…|œ:Ю’ЎXЮЪ)Ј<3Ђj/BЩВ kоM БqНяс—јМР™Ay–ВфaЧБђ€јXa†т2ЛT%ЭФL†“v;Tљ9bcмIбхDt&я&‚~ЧIЋ>Ј№€ZПФш…+1ЮIљ‘ј#|њXј6Oi~Б;++й“Ё АХЗ†ЂhО&ГзKш† YŒу'uˆќvПЃПN:јЙфWђљ@гa)'ŽЎП ФЬV dQPЬIНя€Э№N8е€~u8žexб№Ёа9’_нrпд„ЋЙЂ˜Ж@ГX‰`5бРwиCtƒIз§IЕфDDGŽЧБЋЪЊˆS>лц­Њˆ<УЩšfšŽхэŽќшЧБN=WзЏК} iГ y0C7T…ЛœЋЙc4IVнrœ4чР:ќ§єЄЏ‚Š%“2 ЪЕ9 бћc<_ђG1LSхЖы5Q>‚єЅЧБпЃQž7gm‘ГŽgя Ы‡хvЫ•$™ўВM‘DzНaеяQ х€иŒЯ‰Л8ЧdВDNjззБk4^ Ќ5Ыё,E з_n6ИярЕИrpхQŽj7i5“п.ч dЦ Ы1w?ЏaЪ5‰?l^Ж;"jt$+ћ‚ObA'BEŽр\0Щ6'žІAVЄgћєJ6ќ,45UЂюЏ4'*vНлСЯ{ФхtBѕИнўЩъ]eђ ЕYЏi†сX–КќгFQБ?кш8фŽ=Ÿ›y’"жюIИй5™gHK­чЫ ЭН@ŒЊ:ё,Cхh^бt ЋЄ…-ЮЯ4Ыh:QK/ ЃЖ‹*#ЂШ?М[+šcЋ"УВ`Д;ЯпHєйˆŽеqŠŽр.]diТњсіюіaMфр…g“&8gПƒVЋ&*AuћIM‰ќ2с3G9н’(ВM-Ывън2B^ЙШsМь“yшПФ­&YЗ [ШcићOŸnзДˆJђЮѓ%ЁVЊсх-f‚Ёыi…ЕeЂќt8‹*MРЈ‹ˆЛ[ЅЮЃŒjчHЂ(,џtУ‰šћ–ЁЩВžьЮqхDЄBŸ„Gашу.Гісъ~#ш(ИŽЁ=зЇ3QˆђЪ@hPИС$„ˆ+ EEЮв™шдЛЁЖИЭšХq8цўЧ{AR§ВЬbАТGё9"Lt:‹)NЊydEїЪoW”ЄЃViœ—ЁЅKЫљѓФ6 `:aЏoŠ$’nзŽЧIЩbOќƒˆ`#uЛPfh–ч8œ˜к\Н_JВ™@vlЈЊ‘  O?&%ъIŸэDМv$2~гC•ЫЎkKW9цYВВ-ˆlЊqЭтШЗT5Š]7'яœ”tqѓgвЇъQм—Ѕ6Н]_\KЊ“Ђд&zб$ќ8aJQžхMЩGuž$€ћу;%2ё%dpжžc4kлQљІ((*MX-hŘЧЇ8H •ћIЃяЃ•"rгєь#тДе‘УУ$Mо<-Ш=СщУ.3с}fэžˆCњњXtzŽб‚aDi`ы*6œga;ЇП%1ЅЅ DDѕ~Pд2, ј‰уWя—2jHдwИЋ5)"OzЖHхˆх“{ЃvMžBNFSšŠbњsњљrКеі—W˜еrУВМFДq§Ё†71јЬ• gъШ/]лЩŸХ…‰Муўp6U{QJ8ћXE†ёгѓ-ѓ9IЃ[AнчО 9лvЙс!<ы9œіg…wДƒHщТьњсЅ%ТЬukЗxџyЭѓ‚‘uhѓє…8ˆДую,y<пиcSbбЎЪ}S† oИбža4 ёЄюЪШе!Г^RŠщf§ю,Л'Рѕ$> `ТќJrq0š_|Оeды›ŒFЙnђfШ4OZ)гzžј- ЩОIСT™кШКnк–љЃyніыОŠ]KЅчsV5УГооиЕ§ў4ЉК#@СыؘlnqT’6З >ЈЧн?yљ Ї™шpэ&QE‚žD/Бl]цЗKYGН”gQjЭtТКЋ"лPЖзїœjІ$ юл2Ыы]{GJ‘Uэ‰Е-Nt]О*mg+ Г)n§ї“GЃрє@ІcџŒЮŠИЛЁАnsyЕфБїЌvќгђвІ+ЫвЉл9+[бsˆ’eЗ›`z `7 g€Нuн ‘Ud) =лŠ™е<Сj‚хDyOВ№‡Г"ю~Ь-‰^нпм-i+ЯaЇ”a:1ИGhрk^ tУ}“A\WŽѕЛн0•Ia>;ЌZр6@nCВBнm%ХLŠВ$ЛЈ48є“–ѓŽЈJ“<цєЋњаІP—шљ§Уš‘tEрИg)[Љ&юšе‘k(ь†SПcDQRћ) Ч яˆОRліuYеMЊѓ7џВVT+РкY‰ZѕјFv0чћa˜ќ…О?kфMM ‹єjЕІ™ЅŽљvіqЙТ”яКФж†–ѕ˜”XPј$ЫЫnПŸьЮѕшК%ва‡дfіy )БыƒеiжШzЦŽ$юнЧ ;F"GŽЪЭ.Бл-Х0 №ёл№B5ѓш9 Ї Й˜.!EРЖ~OєЃЧ_]Ѓi;`Кѓ$-Ш:”ЈЛ•ЈЖЅY’ДG,M’;ЩЌŽdЂ1иuUvжля*O“˜ыеѕ=*Ч|ѓfЪŸ-М2KШІБєH’УУД|&Рбlbю{YЅy›ŠH/Ж* *fiБg ЏfZ‰уЂргК,є”ЙТX;Vр!леќсѓ ­йЮ7#ЕkтіЅkjВцу–)U`оBd% 8жяˆcLыpВ ё›Њp‹Ћ[^QЌЄ€‰ьР=Љћ9-™BЎщХ@їЭQH{Й!ƒљVН%Ъ#‚o‡вЗEЂy",Œ+z$2мъ j s}сЃ(UhЋ2ЛИq"йСЭЋ]РŸtbГЉлУЄ–ІNeЬ=!Й-†ECгLзљfэ` ІqіЕiœдЛузЧжv]SugnВYqц8г}П”‹УReƒ‹ЂљE]  Дy9і0щ<рOБ!ђВюЦe{vдŽ}п \ћ[fpGш@ˆђH2Q,NMњq3џ"Љ@Ѓœh00ohBзЕmлTњ~Ѓ`EОР"1|q?! )чю№S‘ŽCЄ1I%}љ‹Њ,‹Ÿ­Џ‹4ђЌo-3бщачqZ—Uгb™ЗЩ|ЧДR%vh–бл3яРј=є‰чzNы*ПиЊšчE‘—У0Ї# 7LKІгž=$Е3пЂ+юœс№“ЊvC•ИпL™Ж6žds!Р„QХР6і{фЉІn„ йЫ@‡$MіТбKъВывР|зб5qCЋF˜цežCl!„›Ьсy=іјншeЕ-­g+•=А–Š‰ЖŸtћ>БПQЖя;О8”QТ”Г."л4u=Ј‡sV~JШ€CдЃ‚ш|v‰kZгЂ,M“ДФM&ВУˆ`‡БМGR[f3TJ‡,с%H{=lћФБО9sКmєэJ4LгFIЁ('гUUКs=4P$мx Ц9ъы$ у88џАQЄШг8mh:тDм›L2.Kѕc—ККШnцwwwїї‹5MSГЮPbю[mОИX‹"}љћяXEГ-œdВ­ЈЧУŽ0тСj˜ъІoв(Щ"CUзŠ‘еeч§Žpэxт:>%ю—Mб9ЛЉЪЕКЧCР›ѕЭч…d=GoЙ]нќё§сѓ§†сDI‘IрЖ”ьжЄ8€ n19tх фq’…ВШ|yG+ZR•YŠЁ…Є6=:t7юAЊкDВ.’(ЕZ™љl+i†ѕœ"ЋŠмьчџѕЛ?нЬдaS^Ї iЧHˆ4bЯ„eйNF+;Л\KВ[еYR U ‚yGŠ Фfxdj2ё-њK‹‚`ѕ ЪыУёЯ:‡%šžmЩЫЋЋлљ†• ЫDђУДіЄТЛ#pжѓЃažЋЂhл"JŠиDцц’тѕМBb:Яi›~њЖžф г]лž%Ц&ƒС=Ш<<дjWр†‹Бщš,KЛЯкРX;^о UdА[NuBxzWƒЬ^ЖqЃ{ЪG’|рщGBL› ˜|:^т‹ьvУђF˜ФqFЃOcЦа#|v8Бq„њмзСЋяя6№Sв –fTэo\"§‡†@&ъќzўА‘,Ч”ЖГЃиQEЖ I™kЊŠСhЩ@ЃpЧ$щх‚уЕ ŽSЫс x}?е†!Іћ^@_ Ѕщ2п6fН^ѓІŸжhxЎe?sЫжj˜g‘уЈйœјэн‡O X-YГлOеR’M‡€6Дшгx4"рxчBЫДуIf}OR/Ќ15ЭАыЛ*o"‘њ|ЭŠQз ЩZŠЅшЉFНƒ5иL,!8БZ^­Д0ˆyS:Абчйѓ‚/є чЕ4_к=Q’4.:HСBњxЭ!^r˜\‚Ьѓ8э9gюЛ2ђџЛ)џBUћШїL~-zIXЯ?ЄкnFhЖя1В+EvІІйо“нСЉШ 7X‡™ЯoпбnгчcYфiбžрВЯ\MR  ш›<”—Д?я™0 ƒц ­я#§БќOvДŸ6ї“Ћœ3FЮHАщ—Їо_2МпCŠџП.йУ“k m в Z1mK+˜BЖ‰kYІxwЙбїљ‡ e<щр"„”Ѕъё кSб=ьЯ{)\яDї€ ФfщP^ :љ?ЩЂУЃ{В-‡wX@*nтЇ5нeJ(^џјгеKŽШЊЖm;^eиІ­d§Д…9Ѓ#бbŠ#)УР‹ЖXъу <иc™ЩDя‡Ї§]tВ!wMCс!Qа <зIЎшzа№љ ЦЁй`Аm›ЖЭxіaЈrp—А GNЮ‡&Ю{mу0-2№щв`˜Ы?М{ X|0ХB ЄC"G^cЊлыkZб§Ќ!fwuш>+Ÿ,Фw.QмЭ"u+У"7eЩQ•i-єоу5Ѓ&4YжнШиеŠуyйŒЊ–ьyžЮWm“†ЎeЂЏЉёГw‚aКq’–XчŸкМm/СћГ]•Т 1dŽ“ёдiˆзРЯЧ{ћЇЃАLЧЪXšf%У”йѕŠхЭЧr!љš#ёМq6цЏЉŠ џ“ЙхЇ‚ичxARVсKŒfMрќyžрm3`е Ї–эсЩфѓф’sSчƒ'щ…ЪбЋх№YфVїф.ЅkLhЮЇ ШWCr‹ ŽЉŠ,Ыr0˜еЭЇ/žjW 7Œчц-dшр шxЖi›5„/+A=.ЋЩау8ž&‘љЫU0рaОf8_\oYVOВи#{Nx€wХё{GX!!Ъбг›еrc1ЛЛЙКY,7 ЏšЖёwZ#§#V›гUn}П`5ЫђвВ›6‡ЇјО›.e §А$KƒчЖ‹љ|НeиЛ[†Ш3dI2JНнѕŒєeр˜КТ3лѕj1_nрЅ0‹ыOяnfї[AQ_игƒ<ыўцђУћkмBѕЂЉФ90r€€рЬtы ~§JЎеќz=рзЕx~ц†I;š,^џpЕ%фTбУšTКXзЬИъШ5rП…№ЌЁЏВМ„ёЯП TRќ?‘у@ЇЧЏЇ'ЃIХш@тт~ˆMUЗќ(Д‰љ№‡HeYбœШ)ФЫк‘UЈјё@nЗ‹9Xp'{‡і+w„hзO6}ќЏRžSьFЈ†Љnг9’$уSзќуœ—EQ­И.зЖ ЗЄ|ВŸ>mпiј>І0ЏзSfdЄZz8>~§ўљŠgнpSјZXNкЃk$E3,4њЇŸV‚ IА”щАЋ‘—4+Њёаъю€nvЋШsmг2>Н&>ую‹Є–ля›=ь€T ЯZivсГ+G‡€е$KЬе‡ ЬЛсY;UїЕ+ГЌ(ia‹В‡ ј ‰gрšК†Ч^7€у),?oъ"ЫыŒўх—Ч>25xз&цuБЎШn‹HнXУ@№–1”поJdžю!ќЄ tž‚П7Т/Qžр•э›ˆЕ*AМч^Л‘ŠЗPЫ4ЩšуWx†Ђ#ЋCч;Йf1ј2ПЅx4ZЄ/ПlEIK4™”аv ”э|‹?sOHŠ a^Л›€=ЃŠМhЦ#LЯуЉ •YВ’(*v IRЂгПЬщљ Ь˜ЛOW`4"4с(X{ыШГT‘ П9Mз'wu‚7Ѕ8šЂ_П/ЄсFYUwg›m`ъьœUdQRˆОфHO;O———Гхђц§;4Z‡lО'ˆИЧѓUт@>E#к‘ћЬЇ= ;М(vГZН&JOC€|OБ"D?>КФ6Й% NRu]ayЇ#a17ўсг—›ЛыO?{ШšЇY'ћ№fЫОЭ<У`яЭЉ_ПbЦƒѕ]CyЦЉуd˜ 5ј' оуqШLƒнтZE%™]ёvMBM,V›эъfZT Чѕ’nЪмї=Ќ:]ЅЏ6š•‚W“#e`O}›/hlЏ СМj†§щ Qпт)ЯTD‰п,xЃ ‰уЎђK?iћАпuгДќŠџcч%ž†—тБЯЃ(N#@чoАќ§AщŽуј0Ђ|8эKžГ†щ…ЎиЧуСŸ=anCс›SЫ+aЕбtШtЊщэ—лКФБhNX~беЅWыEђWƒзЂъšюeћCh‰7”a†y‚ENK–Ь|wDЗŽ'ЖLMкЌћ Е>Й#wшU fKСЛŽ_;[ЁА^ ˆєеw3ћѓ%ъIKќВДЬАЊы2‹<ЧђKМ=Іu–`УfM\.€zрQФЈ%EБЮ•љехЏY~оѕЈMљўѓэš~о)gрiн)v‘%]о–[Д}п”If§tе~?6y–„ЎЎбзвБOJ6ікyЊИЙКс-ЫЫЛ§узЦяПмЏЈяnєŠ5\X‰Ѕо|‘L;УC^x4 ›`МHI€ЕEсцЧ VХгШQ5•LwњfСрЅ HПvОЪN= љзk є7ЦFTёBE5$–1ћH›ІщW‡ nиРы@rІЪЋї?^ЌА‘•ƒЌŽаў> \"6OT?}Ч†Œ~OЃ9“4mЌkШоЭБЗdэoјІkmhBV+l>§ю‡‹kрІњфСфD<дVEzIKКW{М†˜ЧОm}—Oƒ6]R KКњщž‡(žTІ|RєдTd‰[}љ§яfМЊ‚S—#ёгaЋ-ЙјtOЋўpТsƒ‘ћЪьџЏ‡IЎчy6Ÿоп@рЃa]Цэ‰P6ТъmlA`З—я.ўt ‘ЬŽzАјыуahŠ$АLётwя–В]№N:руwЖ;AjеЊШ.oono/.Х$J~љJH+vш(c"Юцът‡3F”$ХэHJ8ŽЖAћ‡Яаы`ѓoд…ŸbJnЗы‡/WДfxѕ ьЋдпКм3uс&єfЭђЂbџѕTџЉ9јbM—УJ|ж­дgYЭq7„ѕхХХ€H'—щщr‡&ƒuЊѓ7ќ<ЇIЕВёюОKёюоl1ћŠвьј?dГпu ўх eЏ“ВзмŠaЇуём[рDœ:В мЋЫŸ/>­yьѕi/ЂxящЬьњ Мž‹Й`Иqю§›Э3wЄ@юА!Мсdо?ыл’Ѕ‰mфюњЯ мБr“bŠтЇжVжЗŸў>`Ѓ˜иоxж!щчШ™mЉKьZh{IMNє Z}:UІМН~џУџќї‹…bšиіX{?>ЖЖJн}љ№'ј~V2 эЗэbЯi6PJј™ йrCrŽsЗяыВСŽGО!Ў.џ?ў ўRз Љ,8{_зз~М@Тhй–Ёў&Щџblesj ЬзKМЃxЫ8.ЧЧCх[ѓџ_0­™A3э7fРЇЉЛwјЬ*Амз­јџcƒ“D2SВэx^{<юЪа Ћ§i_њІЮќwР–-KГ’нёцчЎOlMхм/жœЂўvK№o Hјl/JђіИo"ЧЋУуЎpL}љ‡‹‹ЯsŠfEЇ9ŒU ВIнЇ џ$!‰?[-•–†~ДЧу˜:ї№xIб<жD*за ?Џ’ч]МџƒWCтў0ЖEAy8дЎЎо!+šх–cщЂд:„,і{ѕЏ;Ж@ЄА8:vešZк€tE\i†хЅнЎrUzNЫšiЏМуі’Б†Д:.ъ/ЁlGšК­nZЈ<“:{?cБАѓЏcѓХ…d#бЮ!ЯЭГ,ЫЯ2Б˜!ЈИ…ŽЎА pњЗ†цП;hлВШ~]–bџi Bг•ћ)кHFЄAЅџsHИ›f;ЎxЁ?‡h–—5lЇќ–<уXуŽПijи}сПUч˜n§_Eqыo ŠЂўVм`љпŒ7ПЗё6оЦлxoуmМЗё6оЦлxoуmМЗё6оЦлxoуmМЗё6оЦлxoуmМЗё6оЦлxoуmМЗё6ўџџ/x§я F1ЯўћтФД § Бg5ьјŽћїšq†„­~Їп66ŠDiQІО­-.№2™Ў+ПЮ(кќКV§$MBпћ /Nўп‡eЭаf%Ю~КИP=2щO†1Ћ‹Е•ІЁpqKЉІЧqфНN›Ж— 5(Ц]˜лыЫЫ %@Еš4АЇЙо.nжFZЙ+ђВ&qЙєђO4š—Ш•…цWc™лЋV2ќМnЊКŠБE№ЭХњюrЁуў.‹“$tЈбѓ]§ŸvC‡ХЛ›`ѕж№’vЌ|iЙT< lСОЊŒѕХчЋяєИьіGTž)2хj&ыŠ@џ“.)Жы9(2e…i=юšдбЬ0УVєЅo˜iъдХЧ|ЯIйиGь—c™hзз[МЌcў3ЎqІу†Љo) 7Тžиc_f%ю3‹хќ"uф‹w?џ|ЩљQ’Эpќzъг@œЏhVЖТ8tвyѕЗ4]5Аco8кjeЦEзнwIЉл6ЕЦЏЋРЄ?ќєёѓ k:~Є§уБДI’нKЊ*„…шЙŽѕ[™MЖz1и<€[ NЇ1і,ьК:в,4yС+ пb?ј|љёѓн’Е >2MЖP"ЁъwmъАkАб}Iџуo[гrPЇЅькибЙ%ЃщІЎЈnоVЎ˜ЎЋбМ—Ї–xџўѓчлы_X Sœк(ˆ‹ІУn—mЌ/—zБя~Л6п3АŒ(Ž‚ ЦвЗДљЭšЂзk5nr[мR’В}ќ<1Ј/яП\нп}y]pЅнёtдv9œŽcсѓwK=,Аu†ѓ:*џю` ;L#зђЊ§PzЖ>ПЅАodmюЈыЋ›ыw7 D>W™ўr;ЛЛZY1 & dБэтiпЦЦђ–1ƒВ)*ˆўпнjFЕМ$v4-ь†<А,~ЮЈЄEwв4…orŸјсЧХђ№щЋ—w7з@4м' ƒэpи•|/9Qнpч%:(џяБ5л"G–­bШC—kеrУ(/лІЪ]CјјПџpЛaUУащЋŸ?^~ў|oЦЈї:VY’ФQŠЩЅ'оЮ4/mЛВЈЊФГяll_ь;ЊЄ]ы+4EoP‡ЋnАэzьYњцчŸ?]~Й™oŽzИў|Пœн\3aZЁhœЉkЂlЧЭnЬ<ёncљY?VBeh}ЯыТ3F5LлжЩ*ЦЬЄoQлKQлЄŽCз…››-ЕИЙО_Ќ—з—3JжaЛ”ЃЌыSGœпоёvм†ЬхgМжћc_uрсЖЎ|7й0М$*šЬpЊ?ьb}}/™64CšŠ аwї<Ж лаGн_­TxBл`h;)лФ–.џp­‡еxR‡_Ћ^вЛ~w3Gџ^ЭчVВЊЪВ(Šдœ3в§ы›с$u5ьЧ>1ezГЙћТh†eh2|ЉBпЏu'L6hJї2Ђ/йyвvЫŠлЅ ЛЁэиІmЪzЃС3ЁЋP*Ў^Gј0sТюА‡ЉхiУ ыёјИCR™Њј=Zцб†aтэjCг%NђКу.3…­`GїЛБqИ­dX +шaЁ'Œ=SЇ7Њ›ѕ}ц™ 14№Œ›k-@ЉБЬ‘iнѕГfwм?~=эЊа”eўеЊ3Хa‰`„†›„ŠЪб8šзнИ—v%Щє=cєЈШQaйз•ЭJБѓaпЧ`ЂъC І/>•‚om|“€Heэn^ЏЧВtхuo<3ІсФ5‘Sэ*0i8юї№RvMёv}юЛI,œПjлЊ№Ршj{%ОNг–k›ъњгЪ.!,‘ЅВaЧеюFcп‡<†‡zнО;šю+.ЪŠрь&Ј:0UŽb7'ТЈ]с*Œ`eu6ЇЎЁ2Ќс•уў„оА M——+x x` ЎŠ„ZzЧџњzlIџw?pm§5{№:јГ‹ЭBд'ŠeуЂ1DŽ7`E!N zЃјМ4Ež8† OрBŽ]h2 V‘ИљхЪ,Аs—z†(Xa{ќњи…DЙжЙЅkЏXЬСЖ8†&FІWŽЛ:M‹nьЊ’^ДВq€џ •e&5аъ<,]Xби3в ‡Cщ*ы%'rWv…jіcл"вЉЮ.з4У ŠЂ*ЏИ9Q•$nНФЮнŠ?œЦФF%CШXђР”X-l†~l…“Шк2MBKуoo8Yтy=л‰+гŒШой8 інБ%бNwЇЦЎП,iŽч8Ž}ЭОLkF€qEф8йэO=иЇЁ>Mп%ЎЦKv†mы3л€L GMща7Uцъ  бГ=РФТagwœпA&ˆ ‚ьUЧЏ‡TЇg[Y3tEЂ_ГS(„ IAJ:„FУiˆTЃCZѕUdЋЂŠкIЛ6ƒh S&ЁыО^(и—^Б‹уО €Lzlп%Ж&я| РнД\фэ§ый,jрЪ&iФъКžг.б™;J7НЈl`I ’п ‘nDъ”'>$sCщGг)AŠаboяXЛ$š$ЕAЪ+їЇкVн ВРд„э†rѓ*,DТюЖQ’—"tjМcb2ŸgvвЬ іЉ:б‰ЬkSg!jТЋє F;ЖхЄУёа'.}ЕTТžД­ЏrЃЕJšаВќМ­MIƒзЉНТbфMгЯЊх/QЯь€ђ‡иЂЎ( "†њŽ Qb\… АЋ!YEЃ0Б1кі F•У.x[Жb#тО‚ ь?Њ.ЋвsOCџГˆТЫЦFюэ$б<ѕЇ<cтpю 2ЧБL'ы'•ˆ]WхIшЙž­)$ р=(9kЖR”s;’GСщАы)МЧё?ЪЂWшЏ(N†КУI’feќх+*є‘%‰LЂИauд>hPh •mЫиї|oі€ФЎШВЂ[€`ЕU–ЕDaфDzГтˆъР5GЊ8 Ѓ$Ћкв}y\nW– „YліМ|Ф™Ц~“–,;aфi ­кDю‘Ш4ЄжЖэњЁЋ)ы/ †йЎлEеЮїЇ§€šЅDtтHl?žЮуё/ЂH"X8 Ф(X’/ГyфЎ* Бў вщ4EжYЩM*@Э ”›$оl–’х`ДДМЃ9f§0[lЩ{œ_ЂМ(‹‘4‚'І?тЫћ< b шFъЫж"gкqямД Ђe+киБ„Ѕш&}W$qж м!Д…TWDE/ 0z!‰ЂРP#(Ф”Гд™hтФЉO(I‡vяЛ,Œ‹юАЫС?^&(!ЂB@ Ѓ!:Цiи sСЭ/ъˆ -б‡#sk<Ч ъ†ЁЉJГЅ*›DYе­Ј&t7ЙYƒ@Ѕ‰ќХ‘8їща•Ј?TЅНЌЯтZ5-?­PЙ“шlawл}4iГЕЂъI‡я,0у 4Ф{Q\7Tёv дMSс№ЌgšДЮЦ€#ї?Ё€Жճ˜ф"uь0\i/Z‹lKъўМиўј@ФEvEh‹Ќъ“’ЬЄг8 ЅF/7<‰јІЊ зsэVUнЋіЧI­ x 6B%m”‰ј?ьЫ?Ђо}цщц 8Њ Ѓ_кaЁX_ЗшкКВ~#Јіgљ@дькTЅцЫK’Є(2ћyющ;xЦ€ПŸ u/а3“сЧIцИп Ж ƒ—`5c $3Л]Џж[žhFь§ТСPФqжЕАУa’Бэc™YЏЗы5Э!!м~˜CKьz6_RМlЕЇIЕˆX‰ђbљmRУš"r D)ЫPŸo4j!šŠТмњ|ЗС[Уa’М9P–K ћIчм’‘ч˜ЭrЙNПНњiЅ*ŠD=м.Зœ(;ндr}’›Z™“ЮрDг ,nKьZЈЁМjg<ПЂ шn:–ЮЮ[NМ%†•Bоф“(ЅE:iB4p&ŽZЏWMЯњгœDbw+Ѕ•P/ч,;7)o‘yFy Œу(JпЮSЈї’d` Ј(#`К,ŠЧxaм&§F‹GЂЩ6щТТПmlЂpIˆ$ д‡?md&Žя`E-Р‡%бћH*еЇгщIпчЙє ™н€o;•ёF+@ј<Ьœ5')›aOєВІ reрг“‚эа…Ќ:†aaн <ѓљOkT P–кЌ!eг=Iућ!RL$8лv i}}ГaБŸ9фвѓCЂeиaйu…oъN”ЗЈЧx$AxђCЂ&MT€{”‹ю|Y€5K1(-Io>ќ0“dгutŽ`eЇGєg8эIЛсGт&{BњЇ‰‹л‡Œ0ecУeъю™<eлъшYеu]SWѕ€œч0НTZЮ2Ч[\сaЙЅXšЂЈеЇ?ЮEйŒгРЕLрЪ!Аёщ-MK}у„§у‘€ХКL=Ќx<'YьšКИсŸЗ  FˆM4лGј9Y7ь РТкŸ$€Qй cљаТvБмlЗ›Eбл›їkHI'Ы4ŠHє@jь[†ё,~КА Я‡оfф+мzХN:‡Dr”ш2iТ—x™gШ,Ц@ъj#AiКљ0 fФанSшŸ&{dњАЫ YГ§ЄFСr˜јКЩУЇnп86–Yѕџfя;Иу8’4ё[noяV73”шсінхНїЖЫ›nšПYЭйН7Ѓ9ЉЙї)’бQY‘_|† jb9œ/)YqƒЂ 3ћП эЦИX]f‘gbH]ъz%J‚ Њa= юШ”МсЫи92Чr:‰#Ц/ЩХ(œчЎ§$ yж№О­ЉQЮПYюXQQ 7ЋЩn2џƒœТЉЫwCФn:њК 077;ŽСIЖUпІЉЃАG4ћУ8 П=ІYкрУWuƒоШoЂ“˜ЯтL[]ѓгG™Г;œl…ѓIЈшxДм“сЛ$рбaЖ@&бy~syНх8^t 2eА'Ў<ЁІ№Аг˜с™-‹§иєšсiРЧД€w/ŒgѕЕ_ƒ=Lb€‰cx!Л%Cр†zŸUšќЁ1„Цљˆе>ЁWї,а=+kњ/JD†Бއщeл8NcC#™_:€IаeQв 7 Lы9œ‰Q€ўЧ@bfEЩ:ш3š,фКA\†СNІЖDFЙ‹и…э5Ю qђЖ#ЪG`ЁI№š§eЮщY^ьъ"УЩКnћОe='?AХџ‘Ѕkтђf-NкЃХ2Мv1НМ'š‚њŒД/›Ж† 4јВDпЏDY‹+b-Що’ Юэ&?Ё•: ŒSCq*eю0Cq@Ь,ЫЖŸ%4ию CЁхх5x]qjqL˜$jІњMдЃ;‰Œ‰*8"Є.|CEjЖт$=УиЬжнјА-Ђр„ігРBмщОML™лэxVжГХы Zšиš&яДbј5~Юл€ Њіu$жMЈыєЋ:3EрФ›йŽ—Ќш№_BDьЁХŸNМcТO"іоQxjЧЛІiр}<ЧКHиМvM“™Џ:й€#щˆ9.r A†IhD„N5–bЈ›OkQЖГЊ![=ayGцА’ИНщXРЁ 'ѓаІІЬГxпОАђЌKмЕЂћUššL/Р`8r›дГ4нŽЛ#™Ѕ:щ3FњNR#Zя-žх˜ћї IБб‘ЧyѕЧ‘ˆк'ИMh-МЎКШ’(Ю[2s^,xС Г ўР3шщ‚гє ІЛ•x$†`Ќ’РsЃ ~.V]Ѓа$:9Сь4шubJ‚ДЛ\*ИiЎYBЛ ”tЖ‰З8TБ‡‘U29№gЊ(рПГлНљњ| й4н§Xy–О]0ЊзЇБЪc]ф{DiрЮ™o 67ф,’пжu›’.š i†_сюNjаO!o€Ÿх ЙЋƒc(knж"ђЗ{\ †Y]пЌшЏw ‘9ЧЩДт–“пŒ>žВmpобЃEаРcˆЊвЗ$*Мї5™[мЌdE2їС @9xHbfІ­&:žлЊФБ’fсVЂ^у šй=%k_ЭN-АИO,Eє>=вЂк"Ќ’OEА@1‰%$3Ž; MeБпћЊШЎnfр,ъъZAќЫнпјUТТVИхVдlU‚oЃI]‘Ep§ЏиQCюc0Џ=ўŠqЗОLпЊИyDмn2*е”MH˜^™gЙЏIь†8№Ющ&ђ ђfzBО'ѓx8жŽМНZ2Ѓа’ї€YЭЮNБП:iXQw8v%ј-#‰|?†№xЇV;A:e:‡Ў)іYšа4xГЊf'8~ФБРh;лšЦЉЪДзрYЎ?ЬEUЧщОЙЯРMВŸ1ŽKЗСKщЊ‡_"Sxzьђ‰‚ь”b AцџСqБ№„ЎіY–šФl„<4уШ<&Гйј˜pўЬcЉьх%ЉЈƒу…IЖ/№юR№•Оžœ’Рtьљ1psxќууЁФKl^аьbš=?e—ЂРm"ƒŠдј вyd(ќŽ‘е`_Mf| BуSт/@UЂяS:*5›Џ)`Б ьЗiЛ№™EлdОm|­ЬgКхGОeр …(ЭыІ*bє79AuЪЩЭ"*LpдRдЕUUюKх7”(ƒ_D‚PDЅbіЩXђЩЬ€д™Ї дz>Ÿoфж0<ьЄM ЧеBГЦ8Ш ‚№}T'ГVuЊ‘ ЁќMK6МFз…йЊЂЪЮ6‚уCяаDVZ’ЙŒLpЛk‹Ш3РЗмmзЫеz žEЩV˜zц3hоV”иХљхN†3‚S4UЈЛJ кбL28atS.экž˜—DWЄћO tDЁfzИOяtёРФ6ЕfAЊ"вый|БZ^^Aѓlѓ9^Рb;;ѓчїГ'Ъ*І>‹=[ђFJ˜n^атDаCЅ&BƒјЯSч)IђKvиhђtѕd2ЛІ›‚ ™{…Я Ъ—Ž…yfOн]ояDM–“Итщѕѕл7o[ZШ…oЃIŠ•4ф*k$ШAv‘К$ е4ХхXfvБрy-™HS_у$Хa2Ѓ“Іƒ›Ueqœр‡УЗЩЂРum вмŽїџ9Љœ XІ.ЌgkŠpЈ…уљ~&р)™qћP?№ ѕИ,@шЯ[SG*М”лѓ5+ј%шљpшМрьр)ON#ёVіmЛa’УзЁЩЌЫ<Т‰Кa<ы† Œ^|kЈбN%^q!шmNv­%:йры%;]уяЋzяiЛКпб‚W"уnˆёiб=#Pй˜{ЬrDpѕ=„жщzНЦ тРЗž#4`^^Тѓƒ,НŒаšP7“Ћз2=!>QяФƒMOMо2М Ч№шˆзK˜597рћ@б›ќI‘ІщЋБЛSZ@ћіs„ц ;Ш‰нР„щТ''ЁЖ'‘ тcс67Їё—‰ЪR[†SЃ}…л;bH,ї ѓВз&]]&ЦвЖJ0ќ(+jтс4{п}^2ТМйЄС˜DлbјЎыj$izСi6§ф8ЁЬ“'P—’SкхщхŠєaКІРl6 Vі„NTЏkrH†Ъг›5­иШ>эж‰ы>3;|pw? Ф, §-bп‰ ˜GwaрDюš/B“4•вb—.)VэРкŠј5˜~ƒŒіdN'‰=Р:№hзNsу ЯNsŸyПЕгЌ РWПНС.7Вц5Ёѓфк‚МщCюф "ž”{‹[]м0Œ| vz<в]їДУјЗ&U„ž­ёЛх’ гЂА\&vмчхpВ:јMГPз*,”0xš-/™XЦвЩ‡йhА1…Z бЬjФщqlЩSуЎwЅю'УˆЛL|[ЅgЗЗ+NГ}84Eф:ЯЫeвНp™wВhzq–†žЮГ’юȘ’‚пЁ›^ѓ$5H\œRњCmYСйЃЬр ЖSg‚М™Ў–gy%Ја‡Ÿю˜л)gв i`ЃдWwœbФэˆѕP F?О=РД8 C Ÿйbж˜ЪЏя—’Ž}SЂђЫэ№и“А ќ жС”DQ/Rчиљ=VХЈvTMЦў0$y'$Б-sаЉхЭЭJвЌД!$БHмчr<"Дс`v,аGp/,]Ђ7+›–&qR’ \r3wЪ.€CJ%Nв5‘]ЏX^амlВx$Љц‹1Т({[яуа'yэ†*-oiMwг Эz•yЮ7Є}гІуц[Ь|ЫаХн–и…чHГlп SZаHPгm@ќ€gWГ'ˆ<З^PœhЦ%†DšŽ<зH dКADSbс№[ ‹њЈ›;Fб0ЧЬЖПЅ† 4!Щг\OЗYдЩ6чlj‰Ј8ќ|šФ#ирЋЫй†ц8vqOѓЂf‘g;IKЫЇKq<y`šЎkКІЉТњъѓЭNT4УtУФ7Пy`ЮЗэ‡р П^QŠeЛaZ`Ј Awѕ”D5œ.ЊР‚d*ЧЌюя5Xњnјю†Ž jnьЩeбp8Ѕacх{ц‘НВPН[м|ў№љvН…skЛ–ѕmЅ @LmSцЈе§‚SMд№zЊС>< MOЎЇCйї•-`BсrЙоЭ>-9^wMЬšeЅГSЛюс0Ф:ѕlKЧ„XzЗ^-fїwЯofГЈ*пZ~С мцюњУЛ[V‡]ђгM vSЪy]‘+m $Džш"ЯГдfK]П[p‚Њ‚rг[FŠКсј@Мс”-ж$fѓр-,WЫхjЫPпj џnm€??н—“‹8ёМОюQSё˜Ё№ШЄ#]Тќ2†]žЯ9Žч8Ž^яx5™ўЩ_šXK*оЕмпно-VАхЊФПpC,FM!Y•{ 3OI#6РР=&`жccX:цЇ‹Ь§ŒхŠЂs$cџ…гvэ8хЗ‘!sыЛЋ‹‹ѓ‹›-Њ:VЪЉм vEиp’Gн@ЙгЊ?<­rNЇ<Ь‚/Ж)SЏ!DauЕк­‹хˆœлє'>=`~ I.=]bщэj[ >ГІл!žyэлЪEўkС –eIV№ЂЯёь0BBПђп‡ЧtcЦЖ,‰I# Лqїёb>ЛЛ™­yIк‰DƒvдE^і˜ь>`Џ ;­kзЛЎІцeКxё’Ќšj€ЂЖы'EKу1šT œ2^С\T5‰љ‚д†$юоО_Ќ—Гˆ—uЇTБ&}?Ў’ЊорхЁi2Л]-vxƒoлРп_dЦЗd.ƒPщдж`y/ЩS{ Ќ =nМЕ*РZцidЫѕю|CQDЩЮIPjшЋПMXa 2рyБo™† 6i>[sЄсУЫtо1 pmзѓ‚(-лёјєDŠл‘ ЩSФ&’ZЈ60iqh+віу= №СK’ъФAъРжш€Г‰o‡ф‰ЕUи6ŠНКОYуEмЫМ[†'YšмЁb<§њ+ЉЈ9žrъŽЇ|hќp „ч{†,­>oEA%r‹‡Q?Lю–БZ4Ћ’…|bp|АштюўњlЫОPA3Кp@‰БўЄ}њѕ k€HQ сЃho&gwЬ@—eTS“Фљ-ВЌЈріL‘ЄвЇЧђс›!Vcй9€•EDфY9mПЕлђ“ Lйет slŽX"F4ЃIс`•“z:_ФžVЊЎ+wyСŠр§iVИoЇo˜ЂZqеOЕ}XТе}xXaвСѓђМcЉ@”"рЂ(*ю5ъzФЃeЊКW*‡жтсиЩВЊˆТњЭgN”HXЃІZЉDxYы”§ѕщзП>Сqь€НfЁk[/кЙF3MьK4 Ј№9OOXh3MыиReй-IІqer ‡Z B/џђ‘Р ѓК'Єћ0ФK‰р дЄМx€Чџы_ŸBВ,wРzб>c4г R,sy„cЇpьыЛP”m“ЛР.ЕыИЕ%2 жеbП•Ÿ)QжƒМ"б\Œї&:ЛЅ%йN[<РУОйуqЈЫ4 |АNњ&/ќя(H ѕюѓгC—ККnЙ^–UfУОšХ<—Ц—yšтIХнчѓжŒ[|фI‡1ЗЄэ’Аn Я9‡ОœЎРC{ЩNАDлао`o>†дREŽW5МŠ.]тфИЧЖ ™&qы%Py–Й}ћi+ˆ:zŠ5ŒР6иеN5Зьј•@§Ё+гШЪЁ<+ырŸ.‘ЊщСА€~+LЄiPIѓга”Xоk?jWЗЗ7`ОoпП=_ `W€Э6Dj0$xЅ,ъЉХ&HпXПЃьЫwкQlлšЁzіv.XaЙЄЄЛрPМг71ўГИКЭo>~ОZё‚оp RуuыиГu№ƒdУoрx 8€ƒ‹дюЛєa Іew@xЋ яњŽЌње@ЛТZНБі‰йlvєnyw Bc&•fe$о њ ЛjЈьЅЩ№ј8Е(@W§>m˜x$Ск­в3GзVин œVAЖ+Щ*БШї0фK@=Iмо-9ђ+I :R8‡.ѕt>Ÿ‰Њлк№оъ‹4mјGKТ\?ьCіlРќГЭJ:,‹,ЛЙ zv$ жMliX Ќ*ЬbСŠ№PАн~Ob$} œN•ЉЫЏИ5МБ2СЮ­СЗХюўщŸКA˜ЄХpl#SYь0Tз$Y.9%œJТСЫlг4Vg(ДРѓbа“_ЂV‰мnI+Fи>2 љїZ6ќцbЩE—mћy?†І|G5aMпбВп=LЅ•@ЉгФ35i B‹XЭ,Хј@Чž”п­v‡й УcчЊ,vнTФябЃыЫbd|ёš] Ё%^n R1^Ѓi"Ї†-‚bP L'fg4 Эђz>nиПнlxХŽінёБ0ХћЋйšцОwsч5ЭpŠuЁ!^, гп—Ua& ™єТШыЅѕЇГ€њЁx q'kKц6зWКi'ѕјјщЬХчлХfћЬ"ЯЏX;F6У6ЖфЫ[Эp‹ЖЋіЉяya9Ўy<іXœЃЪЬчŸЯf< >Љ,kСt2ѓЫ…jРќŽ‡др–[АљрД|g™)^6œИŽ,ѕњB4œДФKЫ<ЭРƒТŽ@9СwЕMUYОљЫй98ЕŠц’+&‹=ИптnУ'€‰.ehБн—‹ќжRРгїјxхђд#&z›vx˜86€xdkšФп§љOgoW{;dXK3>NјCЁЯЮц”tXЩyрŒg™Я8нrlлвхљ›_РтIz&Ч'tuЇf.‡*РZiёщьн-ž,Ș 4њТ˜ёЯ Іфэ\В‹‡ЎˆЫа@kxAеU…[žП}Жо2X7б 6uщx8N=QLMЅ.Ю~>R%ЩZˆv ;rg {НYJf6”$XѓƒкйoЮю./Ю?ТЏж‚n…5Fq1 ьˆ|ЂыFRЯ^ž§єіjEs‚ z дiMvtЮщv^E˜Gј#њ YЋљ5 -“* €Й8ŽСРУ~u{@@ЈOg?§rЙ xQOа“xЈ#PhžЃggwВщІ€2пuќƒЕуyЧciгaц”чК>і<:6!МsEИ}sіЫХ’#ЈаЙ|8фŽюи‡ ЌUУŽђB1АпЙXY№Н2РГї$•'РB@KŽЧЦQj{їчџ}vБUЫ‹0,оӘZŠ@o‰%Ё4нД~ь>Ÿm‘ ;ЂЕ€]qzЖ… u:Gan>§хпў§l!kXУŽq|xьcS˜1к;E7ŒяnTўnБxžЮ–2FDъЖ* $ЦК‰•ŠБ!яnљџѓlЅhІ‡Й-Фнsƒб“а’І)/ь}џž5њцјбžTŽTШџ­ЌЅOpёЇT—U“шЬcъuhiŠ89нџGЮ’ M№yIЋє>wTIvЫ˜]—ЎџуьlСђр‘‡эЁЏђМюŠР(ќ…§лтР вМMdŠМŠХuИ‚ЛЗ№?;LRiЧвЧpO•ћ?њ№§жbI…Œ~ш‚Ј‡ ufщќgј@—Y9ьл@“:…id?х~{QЊоcж`мзTT+iЦв5lCЙЄ8Хк…%m–<^љкпŸ§о%–f%Цн№ђОіF„$|дml*32žFзєяп`џї.Ыв€\чiф9Р№ЫРаб[•uУMЊНg ар~ЩџBSŠH:Ыqƒ$K#п2№‰аЂЎй~шcGф?ZТД$гДlšEa`šfJВaрЇњВНЅ_jёВŠ­о\пюф˜жIJZ”TЌ_џз#щь7/JџMH,ˆњ—•™, Г%ўh!^зыz]ЏыuНЎзѕК^зыz]ЏыuНЎзѕК^зыz]ЏыuНЎзѕК^зыz]ЏыuНЎзѕК^зыz]ЏыuНЎзѕК^зыz]Џыћ-GАў•7-ŽыЙџЯQ7[Q~щ/Я^н Ђ8ђ,•H$жЏйУ кЭTFЛБ™ТїЎЗў}K№т}Еy}Пг}?№Пе:блГ3Ц<|ŒеЧ[ЪЊўЇKїMЛђќъіlЇјQEЁw*vЂЖЗgДЇЉЇ(šТЬ7’iШ?ВјяжTo#yIн€PЫ[J1L'л'~жДѓ‹KЦГКЪ“4 е‡{†џ#ы УРŽКМ]лќ†1ƒ(Ъ›Тз4Цq,чgзŸЯ)7йз‡#™Ч—А?Xl)šWЄ?dЗЗšэ˜HmiлcЛће]—YМІК:{їсЭл™чѕ€}киЇ>_Џ(AЕќРљj)%УВ}Яб–gV˜у4ˆЊФvz8 ;1Љ›F&wіЫЛїŸf”ьБЋагИїUŠтй в, P/іGю7Ѕ†э%‰gВ Щ œх‚Ѓ кzПпЇGлyъЊЋwoЯЯ/Ж†…Q1<БТH–у†iйЖedlЯЕ&6?еhХћШ–з '€qAчE]†–†–Ш˜iц™ЛЯŸ..?|˜qКщЄУqˆ5Э‡ЏТЖЈн>P–[гsыеGС ДлДг6їlюfЮ’РАЊ—з‰)H†cr;3ŽmщўучŸо/DЫ‹ŠёсЁŽ“Ч>uЙлщЧЁы|CьпПxн"“Ќ}Пї,љђrНлmюМ—ОFЏv"u=7У@ЇЮ?œџќюУЙˆ#;lызсPЪn<<ŒudЌ.('ЊЪиЕ@б-Ћ™Р3TQ к6ЖMсvц^‹Ъ20љлO—яоЬ ЯГХЛЯџєѓЧ5Юšn$fБЛf кбgŽtwЩXqзW‘cїЊлb8€’dMdjЪz!™6MЪВMљіЯoўђѓ- fF[_ўђг›ЯЗRœboТЧ•hc*œ Ь^о+Nв]ю?oІрWЌЏш‚hцmlШмfN^œgћЂ*ђФ5хЫ?Пџјст~УrьтъэЯ>шХyлї8“/єLг‹ЊБŠЌэљЦєіуaЌSЯјњЕ_Еж‚fZК(ъQ[:т+ЌэЄъКІЪАSŸЖљ|ЛZооЬ–›энѕэ§†км]nƒ”иLYЉ`%ЭЁ Эе­фјѕёaшЋр;ЗšS‚ЌHЇzхšдЅVX6]WХŽЁ€Pз QЈУ0д§Э‚7,Kйо,3ЯX}zџnЁzћЛкЌ;’юсi‡дљžŠтXч…ѕ\Д’aŒЭНl{1NДj3KшнъќVа ]UTU•wзKХr=[пnь8}kѕЇџѕQ№’цx˜YsŽŸЕууp<–ЎљBџСтuMQeY˜п N~ь#ƒZыN\ди8изйЭ–Z\m5,†эИ–.м/5'йћŽВцRKо­Ž]bв+ищДТ–”–ИІDMи2 т1ЌШбЅљJБ3œЊЮ,eпs сђ/sг‡gїЎ8œСжД€к -Њє]+€˜ХЁяиš yЭqЬLaН•L/k‡Б0XFБpŽьх9N:v iБ€'шлиUV[єв}Јя@ЪКHї,i-њEG†вжm['8;DUфнХљšу†зуўXcaсіNŽуjlPШ*nqx"U5Ы}л^А$ЏыІщ†qІХY;№ЕЏVВjи!Ѓ,);я;DCpЫ‹@[ЏШ2}uDDSЭЏŽc“x=Ї­ћAжЎЎˆ@ЇСŸщ#МŠДL€51›5Эё/Вн,™fГп— € gl#‹ЙмЊ 8Оk+жNqф9ЮПЋА]Гˆ;Mп,dœŒЃifвЧв79-і’…c'9mЃЛ}ФєО&А +щњ‹єiк€)Lб2ч{œў>гУБ ЭнН„j ‘=2еvшБНBEQ$њzNz"kšlџц\зУzФЖгЧЁкУwУ–‘dАлxhl™чE2‘сyуЏџяЅ˜n’Dqрсtуёёˆ“}€Зг;гЕ/№РŸ-Њq  wтщ АŒlp{>уx­ŽбъуPІq\ЄЁ/ŽžА+4ˆMZїG–dе4Р5дoVэ lkіZau|ЎБМFюВїЅ]nЙ–ќ/3яѕМnлВ­’TЊ•;™ћОЏЬ…Йo$ЋфўїˆЄ<=sњnГJЖ?lщЈЄZ‘рР5ј5i DЄXэ[pб№У‘D–жW Ы14ЄВ™@6 9-с%9ŽœЈ1aЄ \#0И^=Б_bdг ЩЖ“Ќ]ћхљ‡Ўc*ьžШVXоДB$еDJŽвUрГD’EZўјyMбыѕr:л*ЛsqB)9,-™ЮI]9@\д4№"9рАWBt3mM‚,KSeЭЩOА MƒнjоО‡$ ^’‘ќ.V8"›ЂК"-опЏЗ›х|њp;œ ­‚Pt‘с›Я8™?А|3фА4Њжu`Њ/Фж`aф˜ЮXВСHі‡Їvghв|Іћ ЁАУЉs#Нk_;Eƒ#ސїqN1 ЕY-ц[ЩЬNO#ѕ вt€ЎXМ9’ˆ>В~œкТ ФШ62_j8QœЃ‰%‚“‰В„Qnф<УyыЁ €Іn2зxсаІ™jйaš!55!aFжˆЩІЬpf6#цYщ6”ЖГ%+ˆВ БEИНa‰`0ŠjЅdЂ6я6|ФљыHJпц"œžЧЛ {S„ІЁО(‰™ Њa{Ш@у‡ VO§pЌГЋђЊдHЌ‹ДT„5ИvјЭtNѓ8^RјOhP™ч9Ž—T#њJс2.4ќЙЋм­?ТЊЮТšP m]ь,э%•В5LА*`Кiї|jл#`ЃдеTн.с $TЧ]aѓдjБFЃїMџєaУrMm)Šœб}CеЮКцЎЬ Шv8Ѕ—ў ™Я#Œ0ruуСаЙІИ€%Ф)‘с'gBєѕЃ’М[$H!\А…+qKУюc–}їiЫВЬvKСяœl7Я„@ŠапТ Њ,+[œпO†ёв ЖЮB‰ќ,у…2А$›ћ›л l0Щ. Ь‰аС6эШј‰:#›O[šŒlvш›чw?їШ#%Э‚пVєАG+ cФх MIRžFvйуЁ+гаЗ ЈQ_т?d‘!n7чŸ~9%Я*УVЌw:R|ƒS›хнw?l!йQD†fЖVёaƒЊ]$‘‘PH‘гчu™йŠх‘+HгЅ@&M‡•.RШ–С'W`’і„VyОRЛŽћp KїБкl)p‹ї?Ќ$РгАіGбЂYЃ) #у&БВ/G~Дт 3НлHhƒŽ…l єЅ`—щЦEЧЈЌEy ?ю‰иШWо;тЃq3ІЗ^Ќ(№4ќџ”Ж№ 8ЄЗхqќЂг@шаN8ўx fо†КЪ,ІХ„Д+N#зФфч2)яьhœЊЌv‚6_ Т№WпьЛ‘Tg‰ЧAжєaЃѕƒpnЬ0C|ZBѓG˜ЁЦFŒ`‡/гг5Џ:Ю*юš їЄ~йfTрyEРЮХЗMMмlФА{ње]7ВуZCpё ћŸ—ЈыЕ$уЋ їYВ‹r4Bmњ+ёїШщпЇ fХт(т8+tž;Рf—U›лСЮСВ‘[т9VВs ч§OЈŠЯtмИвM::ј<‡€ЉщыІ-ЂbEEYЭсМЩъјаИ!эѕЙЃ@ZiЛ^АK H€К<0/ЬКlУЕ5№a,@`dMy7Тђ‚‘––Е#E@ŸŽ ќvрЭZлвз\8–W§ ЩX{Т6ї•eјp@vSBЄ / +|г€=ˆJguUwUd™—U#-гslижЫ5 9€љmsІŒƒ&dщ=тR$ћьZЄslСјЫ|Ÿ$Б#‰дѕХГXіи•-FŒ…'’#›†Џ{Ÿ Ю^J–Eьш—a&У№ wеEŠUР6§Є"Tж` e–хMwзkaї€тј(^•Й#ŠдЭ”…ї#ъaAtЦqпЇУH˜MœšКiД—Ў)рЛУЮhЊ}IžИІqбNд4ШV MрDЄЖD№ŒvифБk! іpf;GjшД…,vbKтцvIhуy‚#ё#@b‡qžЩeб^d?…L ђ<фжH}лО$щкh:*­ђ€бt+(šвBРѕšѕЧaф—ьZтѓˆЦАцuљІ,RїрЇ5?&c#“4*?žUт'ТkuŸ+=И `‘€В в˜KŒšзLЧЕ4•_-yЭо•ˆ”ф^#ч+эŽЄд? ­ЂE­Щ‚ж%f JqMи>Щ’’]KшВПšє‘аh’?р.щŠg‚ЋВ‚$йСvК@i@9ЖkыК0ђ†ГЋа ћЪ7Ийl+›^6Fk=YуMuЯ6AюBO*н#!ёЬУШАz$K-OgWMа4n ЬЭ]Ь‚ќ)П]4л‰ŠНЋKѓЙРђ qЌxКZWU3њ,mёє­ЄЎŠP•Йй#yЎ‘Тчˆ{RS‚GEfјОi2ЯаИ‡OKQ7ќj$B†є˜уxfљ8§эeи†ћ*5Uv:WЇ_ OjЪ"/АtGŠJ„žlBX\ьЪ#WК*TњfС‹М!нч˜т З!™N;VЋ”>БPщЕŒIR‹ бчž.аЂщэo‰šххmц*ьІіщ—/ЯЧ:іСк,/iq`hаА!rз КjЋБU)T%vБ` VКЮ —ЗM y‡вQЙЛk37H ецPХ€TEA‘{ђЂZA}hОg’З>?u <„<Ѓ9aА%auFЅЫЊFШ4šG]э4‰^1’ЊZXЅ$Ўb š6-U52у“_хnohQеMLЖђІЧJoш†}wƒ†JšК#%{јUШПdU;ыИrЃ›­ыŽИ=јЈŠtоЎЈИћђkpСw@\:94€7гauјаЇ†L­h ‘UУ ’}яp“s kЂnяŠКкѕˆоOУо№ДнH†п<љlK4']7иmZЃНрйKSЦ†Œ4МjX[GdDVњьЛЎЦ Ћ?tH9, є–bрѓ‘qбтМЊВаН ЫBK’„ЎыяВ–БLРCKєš†ќЅ;…Р§Ќ1.4xш@кКLMY`9I Ћ†иСсlФЈтЮGOжЉoiKoЖЌ@D У №+іo_i В:YP евиљуF6v§‰œW/ыLЄBs%ZеeоƒпвЂьЄшNТ!ё3ИЪ КѓІk­h\Х~чр™nдz|ѕMhŠ0{иђ’aЩ™шŒ­еgЃ&ŸDОh\‘ Л?CТbёєŽАЈ8жE•ѕеќўъћы-O(REgжїŸ7Š•‘’йZФCуbcƒ ёyЙХђы7‚Јя* ~Щ!@A№MRј эМЉ.ЅEaЕHwэ …~М^А’v!ёЫzГИyїѓ§rЫ€БЉ`kšФ)nвЦsPнWƒJУж+Р№+ФАžЙЩpєуѕ##ˆVŽfŽБД"žЄ'јuДєžЄ ЮА<|ž)3[š•‹ЊНkVƒЌv ­j` `й”- quФ"СEƒѓBьQV%vЋ,в•ž,днЇЫЉ Q­JВъча2юЪ& L‰•m?DžХл,ђl€Lі%xкСЋM–уИA'Y1œД§ƒЊ§сзmЫ кћOPЄЉSOйхŒц@щfŒ›рхрыHБ’Єэш/{ЌяX ЫЩŠ XЛ}AЬЋ-їIš„}‰вВуХ{lХMрхu§qDРьƒђЭ˜б"^kЦџаYЃu ЙТ[6EnK ЂъgG‡[*ЯNьЁLGзtU`DУёгМ"`ЗыЊШЗ.QzkЎЖПЯ‘œUžm™FЁяяіѕX№ іIжHM|EH,ГeyХлcb‹ўЎ#р{LvFшA"~S%ОчљR‹ŠщG№јѓаПЌlК•-7ЮAЁn ‰gп•I`ЉŠn{Q‰ˆŒlEЮSGBJ6uaВєlЮ№Ђ№7ŒV3тэs’6>@зqр7tˆЖŒlyqn0ё/О#(Аyр€.ЕоІАY1КыХHб| o|”s4'7uІБ‹Ÿ?lYNKŒТ—“Нз‘К0Ќ3VŠЦƒr A0іXч?`,ь‡1а`ОuїнеЊЭq‚etД‰Ž<—=„юйŒг,Ч !MзS'!ЄГ/ый’(2ые tЮ;bТ=цЯ=щд Н*ПžЦВ)Xt•™,ћ№_§щ~M14и(=œЦOщЦš:ќ*}Уš•tЌЉcжвDHЮћђ{4ЕоЌцAї3зл7Цйещ.ŒіEЉ<ѓqУ‹чE+kI]w@wјЕ!чxФ‹§ŽЅ ›љ’‘ЭАькlgщЊђТkQЕ\/ЪЛуЁйћ–.m>z $UеЭ]ю­OНёњ:6dY1М 4yўс–п!ыог№б‚†vьЋ!Б_Л–ЁpЫGZ3Т?ољЎmНш‚ГlЛў.­:Бс|Јˆ .mžD(`ІNMЗрCрЕeц^tXћЋШ–fIˆ@ЁІ3J2ё&*ŠФељЬѕ\&&ЪіІ/)–ЅІk^а‚]`iВтTуъЯ=ј}•юп‡oцКІJ?мmБЦлЅ‘mНЌСоАНаsmCZNз‚™ dћaьЂДьЮal dsS8vЛоаЬьѓš ЧTEдЄ#O…]пЄн OТЋ8ФK}оS7З?Ў8;OЉе–WуŽtР—ŒёєtlRпСE†=ЫЌЗї7їЗя?мЏ^э~ƒ[/ЮKRa4ъ\у)юЁi‰Ic—,феЊ*ЩтzЮptmж^БŠѓYтy'ŸžOuhъ2ЖІn–гћћћЧљfuЩўџ,[ЭТОЅ}Ž-№(H#њ вJ<П&0˜4Ѕ;зв$i{3]ЭЇѓе–•Д &ЧМhB№\ еSэы2OoV‹ЧыЋїзKlЦЭy0[aЕТўЫpдщ7{ъˆG Э№ŠQЏžљt‰ ФtY›ŽmšA[OЯ_NC“Ч!z8CхчїsFб5гв_EiЮЖ ˜ {ŽГЂ•ё’и3Ж—ЕIя9iІ 7Эр•CВъЃyмmАйTQ5ч{ EwЉЃЂвœь№„—.Tћ‹ч•ЩŒР^^Cч чZЛt_de)тг—/Пќђѕ>ѕ§itџ,v;№ vдЪтvЦ‚‚263cŸлАЗ5YeУK;М№DœєЉ1Л5!РЬЇ<,Њх†Y{ЛліКШIšщEi…ш /ЩЁЫ<К "ЁНцL&РЁ8ІъыћЫ—/Я`Oју№кHh`ЂћŽ4Нњ„7pВ"ŠдЇ;^TСЙgЄѓ]4Ж‘Љ†ƒ#Aа{€пи7$ŸАиЏx›їсјЛдў‚§*d™Щъ+_…Нfя{в=кљ"Чp`Е`Гяn@i'Юj‚•рпл@cYЭ№rМ\Œžšv ™,f- їНс%е%‡w$Ў[_ЃЗŠ Оф@Ўœy:Тe=Хtёu&нІэEњш/фЎ )ќЗX0$‘\p€Еьv`:дZтюИeEХЦОMRd€G 5fЭщf˜уЙ$ьфЁ)В,/J"|л~х9‹` [мЗ П|9ѕeьЛAŒЯ* ™eЭlР ˜ŠH­З Чlo~ИЁDХмeчѕёдя ~Б‘ ёХњУѓiЈѓ}К”[цYŠ^яЕgHaRЙ^ћўђм‘KЫš !'Щѓиб8JLkO•йх|Й^м§ќУЧіFIйVXђzEKЊ”˜чЖХ>Ыsl йэ+…•yыњ ;чАуЂˆŸ&ž)ЎyЏFДзэ-UЄWЋЭђіъуЭbИ›СЯHQьXІ[V;KлВ( <+SЬчОСЄУЦЩUьъx '˜nрšђ†w r#Ё pЎ ЧsєrvПрEQV Žћуэ˜.ѕLM†ЬFЗw-^КЈЩ!р>збОХL#жrl<^>€)І>6Р,W<8–RЖВ[’fш!sp|<D?L(Мo+ Ђн<[aŠЪ­xеŒЛЇ'’w†*ёlулŒ„”ъatƒ=сlЈ‡Уh(ЌiнЉžЩ§ф6БёjЋЊЉТbВрQ`оnI$:і%и’СнЭеЩ2aІЕБ /ЕќkQбЌ…tmy–іxЯт!‘ƒД—V­ќDђ‚ЁŠ=ˆE$иЫЩА)оŠrZБЇC[$ža№зŸiХHOЇЖШѓЂˆ]гќfC1мКЩ}KŸM€CЊ,Pѓ)#ыQ1ЫЁ Y…–ЎЌ' (M3Ђ7ЫЂm–„€MЉл)|xЎwxO:№mгxХq$џŸH&ЄиЦдЖЁ­ЯV`Юx)VЄ7ЇИ blr5ЋЋ3PZ^L№и…ЅiG 2п†T–Z-9os –+ШъкЗ*KiІaZxѓ"ВЕЧ Чu;caм*ЖNЃO„ќDx˜мR,ЯneOF ДО с|БхБ,й?чЖВ^n(^ф^sVЭ?VФ‹g;€ъdm™~уmC™ЁeЗ8!†:‘™%ІЂ№?O>Ќh–a лŸžjSцшйеzММ{>BTПЛ}\lОБЪ(kH@§2БхЩм4§МШ"@ТВЈеqеž-0UyљуЛЩЛ)ЭА‚ѕф:{ „š]нH–СBЗВžmршogаПЪVВќo1вќ€Z€аЄА—&“•т№N|CПЫPg^еЦФ™Gтй€NуD€ФXЛp“ЮнM>, hЊК“a +<‡t-k3™ЬU+mS,›ўЮƒЈœ‚З+ЛcWюSМ0Xw}фйыЩЛOsŠуE-!uвчSWхЩ;(M™v’№њ§ЇТЏ%ЫuXлcмoљЮ5 uёгфПон,iAжї 4ЄФ№4xћ bхDАЌаЗ-эїч XŠ–ц%vЧ+XJ—ѕА}zbьkgЎў6љю§§ŠUoчCфŠ8ФљƒДq4иЦ1^4н8ЧњЉI8ЇU6Р|ЛP—Јљѕ_ў2yџ@сЌЗ=фЕ єSŸэ<јL-‚7‡ПИср"a gЗ/IпЅ‰ѓD$mз>"]œ}јюџчф‘гL;<— “ьС8t•LТи*Кіэ§ѓ?ЩrwY3 phЂььO…cЋџёП&kеАpZ+žz”№:ЊЉcёЖРјњЏЂи^эs№I`ы"ЏЭг€б…љ№“Ѕ5ку%lв^G`Чъ7›Ыћя‹l9v!•хо3eŠ5ЃьР1ДепРБApБМЌЯН г‡lšЏS5Ё№„86Н‰^іЎ9ДЁaсзˆ3’Ё‹,]ЗТ<‡бќSАЃ№–je ыЈЌзЂ7CюšъќлЭl+ћ!ЗUAРЦАаб_xћZB›6iБШС;ШдFvг Е>‡К]sВSі1ТВxѓФ|•q‰Џ"Ас,фZˆ}Wн2š—•с˜Ќ.yЩˆъв#k+ЉКёЇбy2С^–уƒуѓ4NВbШlMLЃXgG_ЇІoЈ?…AЄУРТˆяЙ:иnфлФv9чж8ŸўhџЉlEХА-Чѕ\ЂКe]лŽSгѕ?ХЯ? ВЫБ/йŸхlxЇч§Qћп‘­Є&R>§П#џPRЂGЖ,/ўЁ4Doђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&oђ&пZш?е…Cg6ќ!ѕ.й =ЯuєБ‹^P4хO{mсW‘§(Žз ?уG*уДџяЅ2|^џНЏџў+йИЛt{u3ЁY5 <ДўКжєt2н( mзеџ<Œ(ЭSOgfKЩі\/Ž<гђМѓmЇэУЧ‰Fћ,Mіћшы`XњЛшР‰Иѓ„ *ЊФеAѓ"šZЂ„иУэdrїсQн%Y‹“іЋ$@вCJ л”_wHхП)ŒюX–<™шaмv8”'#1Jf1ДЗCˆї“їяo?нз„нИŒŒљ„•4лЃ]x)уТKDТGŽЙžЈ!>uШ%з ‹_9ьжŠ‹ќxѕўУ$iйžŸ‡ФdрI} ^gщюwпšЌfрШPп'Д&yQe ы\%Qšx2ЋGЁЃNо§ќщуЧХ ЂЌ==ЕОФ[Лdф‚ЉгPХ‰˜ПуеUIƒPb8ћде–xЭкr]/мзUdш^рЈЌ№Ў>^јёjЃ;A\O]lкQ>в6кНЫ/лq7+QMЫ6dХЋ зf?оoŽЅ(СˆыТ•8Щ2љ…њЖ4§јљу‡їzтЌУ™5ћМ&д•нсЗž+>ИЧпGk€`’ЈЧuъиь5ŽxЁ жHрca1ЃЗ7YЯГшЯŸ>П{KљiоіЧЇЇчВJѕeQ6‡CШ =H‘Р№w№оеt]SЦ ЋЅoъ›™ ы†І(fXд ˜ЫЯWОџЧvKwпџѕУуЦO dЁGr6yВKъCЙмЭв В2іlѓл{?ZYw‹*аvF!)Ф- œ=ПќюнеOWї^І7?ўŸї7w2!B*9ѕр[vXЊаX\ГvPuEр\@ојЬР2TEwѓ&6‘ѕRvтм]UfрLtљцчћљєсqЙн.nя>~ИЛћ43Т(Џ dlї]]”ьЄщ2_ОTн]= yрпќЮ>-IЂЌ;ћОpХщќШЎшzœтYš*ЭЏзЂФ1 Ув3фv’иХЭв†ї‡І Iєl%ћYпя=ўžЖqžЩаэ]S§ЖP|ЖЂшхZБуЎOmњ–s\№b}пь=SYfіiЉъ8пдњq[жPззl Ўzѕ(yiuь—š*žПoŽнCЧПн(ІЙ„ЄИЬуLѓГгXд\sТљPrЯЗыЭтг­h82кY†<_Р?‡ЖrЏяBЯbЏўѓЏ7МЛЋ8/{О0М A>umCX~#зšЎšЊlŠ—= ‘IЯЧ' яЉЅl–ДШ-–рEђ4M"GS–KЭN пbяжЖgыьэпО_ŽкЌ<љna"j>›ЬЂxsФџ(Дjр@gЫiбЩaЅMnF›NP‚ж{‹[ђКi[бLš2qаў|Љс з\|fLMцf?§›В>O…џпь} —Ч‘fџ—}3іJВnВЩfŸ8ЋPї}п…*д] ›ђќњШ5žБН^Ѓ[ПЗHROЂШn2#Пј"32>хцQУI‡:щD\Uќ \lђтМШc№ЭoћЪ•—sNsСІЭsFzъZr‹ОЮBз2ЅћGеЩЦ.ёЅOQ–™›oЕ{v5‘ОfISuП9NгPхОŸђЭёZЦ†НЛЅзЭЇуSfVЩJњCъzАЭ\i!zuв†!моŠvмяwЁЭќxРНМ~'јЖ%.Щvвэ‡мзя~|’ ]И{/і™j3ФЙ…ьЄиŠПоna=ы­{§ 1 WбEЇЕ•˜[чXbФаЖC(OŒЕKGC˜YпГ–_єгЁK\сцQ1-mq# v6пЃ– Яš№АYŒч:lѓmлБ‚s8ŽcccеэјrьŠˆqп5yрЈœъяЦОэ‡+,хЈщSS‘4M]=ŠvА­ЛУ‚6ЫшŽыp7Bа>‘ ]ь№Ђ—t/ЧЪƒЯЈkиЂѓmu8‘,HВю•Ч§жUT/кVФjYvѓ~ъЧiчЩ’Sє;O—С ev'Р>’jGšх‹ЗbмЂ{@RZœфуч}fЎ?ЂА˜ЂОiЋoвELSeY/–j2MЉСЮdтфUтыЂюЦaм7‰ыem›ZЊ$ЉКќx=“ ]7§ršЪФѓ!цШ39юžS.ьЋœV‡—>”?Ь‰мИўЖ>Н’ г‚Щ–6=лЖЖј4‡œBZъ;Ђрfэаи0ИщwО.sœЂIOяИ]Г,ЏљеqмA*њъFKGь?‡пYж„iЎaЩЎя{Ж%Пa\œIšхјœ}ЯБBXпЪ77ЗkU‡р{Ў0SТ‚ъxЭmHˆЌŠѓпПЛТЧšQї<6Eћ†ъ”€x} ^/ёŠ“ЧУЮV…YЙцѓЅšу žЩd ИшqпЧŽtЧъšХѕИы…vе­CC–^RфљѕЛћЛz\‚qгaj 5;nїћукКjX.ач=Фy7ШЊ:Eее’}ЃSLя(‰ЃИ|зcЛе.v…'Х55нvMc}=З’ŽvAˆМЌJ‹7+žчжKСРˆ2TiрХ5jHэ!ХёТИшрп]]–№sG6ьF1Ь7!з€UažІ ‚є6RфА 3№-6œАšKn> vчичЎЎ*2/*š<џјШ‹Ч,ЩN†gШДЖxaыdјmг Ж‚G™Ѓ=xLЈ ,се!-_;DlVф:šЌZ^к аP_o‹у8v ЇЂq…:k§PИи7OрР”йЧЅ J<Лœ3Š[:аblлћL:Y’јфW]рФЫКхЙЏжЭЙBчp|G•A‘ћПк<ДI2‚ЌLlCтDеІТ‰Уа /J"/ШЊЊ<~кШЈXДY-6F†кDD~Л?ЃH iuљLд$`"RKW$EЗуФy}џlЦr\&AQ$^PмђхXz–e‰ФЦЎ‚Џ[>‘—Цžћ;“[ЎYNРmдЇ[дОа‘/•h "*Ф7ЈбиИѕHеJjјA$аdыП>šЋрeІЊЈ@лTY6тёАЕ`Ћ­8aЎЪ#ЬZiњiH•хнŒalЅ­>b#xŠАœK^ƒОpK~еЎAбЎОk‰V[VsЂюћеlOw<ЧАl? #HЁ ПЎ`швŠ3ƒЄЦО&2вTэЇ ЄХэъВ)АяО}АЅК TДЫ#щPNцѕ@z‚QBsЗ-ŠВDбЯ&ё Npђ:В_э@ќ С#ЦК.c7l} _–4  JOЕc"Ђ[9ќ ŒцQВC•nО{ф$ МšлlD3ЃFЌ8žФ>ъ2“4ЩѓМЈЪ,ђ ’Я&}=лS]/LѓэЌюЇЎЊ€џіл8№Lе€(оўЊR:юЧО0ХхнУb#сTѓяП{XГ–YЭg оˆa'>яOђ•hѓд–(ъždY–g9 2иІ–}‰§k„‡атљиУ*$СpћІ†шІ+:Ф ЊSJѕIћ­ЉpГ‡ЧRrЋОЛŸЯgЗ7oWZ8ОPн>˜kм‚#ФˆІH[XФ]‘FaR@ ›Ь3ЭW^CŠ­ы†ЎЂЖчБ‡Љž†2vt3@­Ч“d*ъ3o-Ud‹5Уn6ЬнџўюnО\Ь—Гйь~­јBЦД?{>эйЎfЭ@„ћОoыnФжјЛm ›ч6sКЊЉ<Л~јyЈlfT–%ЗРЂ›ідhЂЗ<”@№$@fŽ]/~ќїŸж,@6Ъi‰jаcPСЌ‡ uŸљ8Эu@НBдE@’ню2р‚Оo›Џ9ог- ЄТ|1[j@xэˆЭORp]GЕАQ:Œ]'РD4мzЬьузИfxŽ—t ЕЖуbбEФ=ф6”GN@&>ћаlRДbшWЄшаЖ­2‚j VXŽЉ3n""@]ˆz ЇК2‚РЎ*’Р<ќ№o_нАFe”Ш€@4F96ђoЬ„Ћм› aAў… -"/Šый+&ZГƒиЕД žumr4Ž‚lD#ьp’ЬЄ"б'Їі0‰ГИ§ю}uЛ€…(kъ  B4QЎz&#`ѓ~џLZЫюётШе!Ÿуˆ\я+LОZXАзB ЙŠУЦ2ТЄpK„+ˆФ+щq,]]СЃf9ПџўO3иН`\D2“‘jНи­œЈ‚Г•‚ШrDˆџЂqOOмЙчM+У№ВЬ75+DЇлUфF№$†YѕIbЪŽFКˆ‡М<'РlнџА„И|BVž•мšp T@нOМЮxEЄƒ†Ф4,mqЛTŸ{žыЊЄœKPWŠa‡€ћQZЕььРѕгhE gуЄQяP—{’CA! ТXўДRq깇"ˆfљLœ wQ-=RZŠuŒt…_?<Жэ'й6 БaђЙ>Вт!ЁŠѓЊnР~Hсx5pAїЇM8RAдvŸnрвŠ*+hДТ\ЏБ5Йic;m]ЗJє]dЇDx—t3'ЫŸdL q1g%{КюкЎN}з9ЉEићDТ$‰|”zfX-Щ†:žќy"Fщkдu Р7E(aХ~\9д4УDQOлЏŸ W"ŠпФTЊэŒž6–žОaБзЙуњбЖ;­3ЭnL<’SіD (Л@єhЉИђЩlєъОы 6IћЈёgЋћси’(Hšaƒ-љ№LЕnQ[˜Z$А‰№йх„%U‡рkЙбnBQыМЬ\2Q‘Sр$ШњDQ1иŽ•ЁGK)ы@сCp“ЎщЈ‚рWБ&sзwjŒ№Вfчj/-д?Ј\яa„ь‹ЏѕT0=йMуж5Ю,‘G[:)žЊщ&QиSЉѓЎi‰єчIј|К‡йюaК›К*"MaЏ!E”€Ї^R6у—‰ЅўAХе)чУо7л,у$IГШѕ(пy;QA‰E]X Іэ Цмч ŠCКFDёnЂд+Шшъ"K|E^X`kx@Бp‹щёc\" OЊwLЕ7ћ•qg xk@Кt–б№ї9І&p*žІдЈ4ˆўЗ‰oс xL$1;&"BfїxЦдdЁ‹ђˆы›…‚Ї9iбєDмэFЂ[?в№§EAж Ђ@GТзиum76‰kŸwiЎщ№ЗвFFюа#ЄvyпL^?Avђ‘†Уa ?Сl]џаU…Й[*К‹z›T’œŠDР{:œ˜ѕ ФЂюї4 Fx$p^ё9g].Ђа—Љ‹+VЕќэˆ;„Gіўіюiƒ"T”м Ч%Ц,uч`”юq-ЋЮЖ…пЂюK‘Ач=Сxtщ_ŒFЖиB:P‚Ѓ@&рœун"Ђ’ххfM˜ђЇkHЈHЇtRНRЪАˆьйў‹6„А ЭцасёѓѓѓО/C[јщ“ ™^\Ж”л‘pˆўLЄw!ЋdŽ…qџi-knй‘у…Q’&@s Й0ЊєЂм;|аІоUXr neQьъЖ­2 жgЭау§оZАм ˜=‡*ДVп?Ш&ЖMŸЈKOд•ЉP-NvІ @є–ЗŸYїЫ‡"ъ2У OЁ їuгЖu‘bёЄe@T‘VѕЎЌРGВа;+Џ Яф‘YЩrУ4ˆЗОБК~’­ žК~ юŒ6У†'k‰@пЦ:ц\ЋFеƒњIјЉ ]t‡~ЗЭВ8p˜@ єЗ$w›2wх6 \з:g#*–љВ%N;aEЯмЊРR8 зщp21€PІјЊивШЫYU‡АBЕœiр'jЗж€ћ ELM‘и9#NвLDДЋFЭ#Я=KЫƒУCШ[ЄЛЕaЧУSЛуP Ъ…эН&FТцУA<cЄЇЉЋЊм*Е[ўŽ ‘r'35р|CjŒFы{ћѓ‡ЅЄйiG6)дбЮЩdЯ“Рбцзг-іGџ№О+0[2y#оW†'™ъ`7ЛŒО€nxмŽтҘnŸ ‘ИШ‘5QјEXм\Ѓž *8–ьs“тzIъ™Тг\uг“Уz›m‹]гtфœyBђŠ€Э(џI0+ Q*P•ЭЭѕR’D%юFr_J”п{К_q]`M< slM|М…Mk{Y[cпE$iЬY™‹ъљYА,щ^ж?ўнm 7n>i!ЂЭ­‡žBо6n*ё`BJRВ)Ю;aOЮZсOУзЖ Ÿ™ј5'j$Hœ# МV,У0ХBкDfЎ?Ўt;jЇ/ЙžпЕˆ0Й8зФh@_ŸоАмѕщ=К/ќЮ@c&ZN>t‡ї%,%ўGz–.mwŒbКž{^>ОZЏžоп2" Н$n˜хУннRs0„$c‰є:XMАšИu_шМ0')ЂlfIи‘+S@ФЈ–„gфqр‡iQЕИ@Už„Ў)оОЛ]Ššay‰Б˜п|ћг#‹ЗЦ:d#’Р zPƒЉ#Œ Н­Ўkœlbђахк†[=<Ю—р Q;Ž$• ЪIЩ—uCЅ5A‚Ь7/Lё€кS7AжД3˜xMх—Ќ‚ЬЎыzDˆ#ЉzǘбЇHаƒќз@lкypГ‡љF|H]шaC‡%DDŠЭЩhyЕФл+.*т`5ьJд*qЮвјXkX ƒbЄQœŠЄYО~~ЂH„ЩŒ†Ÿш“xћ@CyзфО!ѓK˜hœi0z"ОабЃwœfjєˆк:dь*ЧЊ^˜•x%йе%јyžхв+Ч гmч`ikп xaиэ€ЇзHюGВљ а№B, 7ML™_БЂЄy$uШВt'z‚=œўh•B „Ф‹ЛђХЮš<п8cшnƒЋіxž б sИ+ŠУ ˆГ]G‰=Ёд qДЄ­=I`—р™fоУщвАƒ&.§pЪс ЈфŒ(Д I2УМЦUЫ#џ<Ÿ^Ы^р'uтItW&ИšŠnћqйгрTгˆ\ЕаИѕнЇьУИEчЧГТ­FbъHэ&i Ќ\žя%Id+Ь|.8Yн5Ež]ПЮk–—v„8CƒdSЪШЪІуЇ0гг@B2Ў>Mx5A0š_Мћў‘xs7в0N`ƒЄtži"ŒЛ kvEžaнЏКyКЙƒВэЪ(pЮ.ћ 7ЁYwřсщХiйРоъOЇФC0вQвдuЅ)lfžXAДK8\pƒє„•Є7дЉ1ЇЯ*ѓ,ђ=K^?ммЌ-˜]œ­)&ZNT’Ј;4лШ–^sЃЋ™кЯ„шФ $зBŽŠ›Ы>jRлž3IТŠ8ƒЌ”Oущ ‡дkUлrrSZо^XЈqй”‘юMГъУ”ТЎиUuS$Ž“тСfбЫ!Bšњ/?њ§ИwЌ№ЬBЏшАb+Xp p;ŸЎ–шa=ыкђrpѕэЛыЛ›зEш[qяiь'‰ЗЛmъŠ‚рЋВЊ%+K˜§DjФ"б‘žDЖMЌpЋ/шI3›ЩeСHљ 1žќђ4чј4c—ЧЁ;ёіњ§ТˆЗРŸЮ6:мvн6Аь N<~Ѕ!оЙŸвAќ;їtg‘e&;ёDЈыPцж ^4 нHёhM…9Šx$МOу))ЈЖ)>/юD?Ф;З|Bи†Ќш–ОКeœ0ŒВК?Y<бsхщWШ§’отAWIрД]6X§Kc>Й: „”  EBВCGТЫwY˜Ё­–z˜„gћєьКРрfНИљўgжђТЈhЉ…уDыІщ”@сплŸРЃЎB™gVœhЊъКюjƒЧЮ4qгW“х‚Џ }W[?БІxg_лJЖЅ ЋйнћОњУkнХ‰&ф„љtё2Й:Œ”N“;#ˆˆ`4/Ј–D№J„ŒщфгtЂЫьGихxсGё~ФЩі]uНм№5eѓљггУЧŸОњї?~їdxЧ‘fOєJœ„г4Ž„›rQZ‚Аxф€P+лb=Эnїєœw"_з1>/‰RrslЉˆ-­§Еoач‹‡пўё›wK,J j‘L„œeр/щПЇѓ@Ф. ^ИџР<y8ПЩ9џž, =OŽКѕtrpрЇx9DЮyŠиs nСОВєjО^Э?ќє~І—>]Гш ЪўTяA5(ŽPШ+ ŽПљсi 6/H’l Ї<уЉц бВp•ѕFƒDж‹ВВХ‹БЎл%kНњ9ш|Э,žяжŠKhН4y>DjЂqzьњ‘ЦѓТиЗпќt}Змp<Ч‹v…gЇєЖv:хЙћ>5„‡{AC§ђhлz‹Œ}чѕoXчГЇй|Хы^Кыщ==т‚П–Њ}™k …$œCвTXџ№езпXn6†=ЄŠoH’Л>Ж”еЇ™€ўf€#иœBVnНE•§|‰,)­)Щ$GЅ#Йњ!ŠшЫШŽЄХ\vЎР/ўєюс‘йp–Wp,^@Ќ!.‚=žЁБOsVA)РшЎN!ОМ‰`ѓšu;ШjLѕЦ:І]јр…ToЄШь”x`œ№Ea§уƒАсмŒ'rб‰1№”XЗlщтњiЮŽmыЎobЧптзF‡41Ъ‘ŠеC‰sлё‚Д&јqјr7EЏЬс3х@wEЄˆмЭ^3УO3ip9N%ЇTЭŠр˜*ћtЯ‚c№ЩКдVЙ7(ŸцLHЎђЊУŠЙ4ttQрЩбUXMД\э@ŽDiЉ[ПuMгіЃ$6%сqЦ‹2ЉЂЧздц#ѓїнCкІЦЏ–kбАƒВЊаўЕf‹Ž';ЬMЋЬ7U‘Э–МЊЉšЗ_@ыїdхkWEY3lŒž-Рf RlXwLШžэ‡§ЉHі@Ž5 „8MФ—kfАzЌ1ДЮМџ26vфЛ~Пo2пжјху§нУJд4ШнэDoхЇ/…гXќ|СнЊ& Ы•ЄрЊфHmЅ—ЈуMbёSŒC ќпs5vСыVp^Yє тCђУxЙi`^ёщњуУг|ЃhšыtЄflOq—мИэtіуѕƒё[Œ$›IuЄX*‰e„HFїДв kŠp7Ж$О­2 K= їкЅў™™јinWMU$žХнН{џiС >ДR$Х RБЇDˆ”›WЎИ˜Эы Ч ь+Iv’f‘ фЃЃ7 фЄs{rЛзNXЛ]W]ЬЫЗU]%Žї:ЄЖБЫHљ6{ћёn-jІЉ†ЁщКсf=Љv=L_pіjЂIЊ„ЗЬ sџ‘ЃЧвUYвЫгХ=­™8еy@2YUeЙЭРCLцnІІЇyр8ЏВљJѕмЋЮ~КcUлu=—”QЙєАpъ8 =€: uЈ“ы4"тѕZ’ ƒМeЕt О‡щpЊžШšЊмІq…АЄЛwwœЂ;Јлћкњzгu-iu7,зњž\xђЖ‰–’тŒ-]Л†Ўa™ћА"uъЄЙƒ™QŽїЇЪј‚ЖL‘›zЎkттцЇяqtЫzƒžЬьц§GF‡Щ!f)–U=IhѕУaРл§==kЖX‚‰‡њы%ЇкЬŠTЇqЇв›[и@[ZМї\лТjУѕнЛŸЏoќёіŠ}Ћn%+Уѕ|@міMѓхюgп5Єюќ@ыЦЛЕАoC/–‹љlЩ!ђuЇ‹qLлv хЛРд ‚&Я.пШаПДйє\?.š/L‰Ewxy9 `‡е] {џў§эœхљЗjх`\ ЩMѓќљ—ЯŸбюђ‚щх™”ŸŠЇњК)<э„u—и'R@M3ё](ЁўШbŸ'ѕсОј€ xр^”W7яёaЯ=Гх\'ЯРW’GАљЯўќђђ,?а:jRpOЮrСЩћLƒ.KШвz&Х–х%ЄЛБ9ѓLM%ќƒ”{ё=bŽьУycСzЧЧŒ{љќђ 0ћсШ‰ ‰$#Y$EVYXЬp њAКkzЅ?lmM–Ek›&Zб ;c‘†о™e)ožžС1p’љ?џђЫЫ~РЪэЌ7Аzрvѕž,nx™§є()zцe;žhUэjы‰P И} ;ahlни†њ† їи‡yеяŸq†aКбCАРЫы 4+Ё7Xр$-ёЬFTYaопya^сAЭф[9YЗм ­№‰Ћу\ПрЋU,'9Ћжъя /LKиё`6™ь_№б&ж4Ѕ†Ђn>акЊ}aЪмzCщoПў$+FИ%•І$g"ƒ_+ЂФ`3)ЏљŒE45Цš?я-`!pмЈшŽŸ?џИё™ fw‘)‹Šс‘еГs]кЌжь†чW?ўс“ ш>–@вTrпњ:ЫDVR„GарЃ(ŠmЙЋы"Ан7m–!ъ&р€wЧВЊ/ЯдћЬU‚Š–_Аˆљšх6ГяОЙуЭM1"M#G5žЖb +,м~йњv`€EгYžЧŽћš[c0AщЖЗN/&ОTV‰ЋJј"Д#H vЩьbСlVwп~sЫШјe%о ѓ4ОЖ^ЊлрЯЯŸŸћ2†ha˜,KbяЕ4њЏ‡F[Nм"y‡5нbEyлѕm9КФ‰vБЧ`оХ–.­чЋхгѕ7_dеА= Бјќml“}tгO0чйwXNЊЖ'K–ћцэ˜г6-'Ќёеz>йAЖ-ЋІЮА(’QЃЯЦЋЋЛ^Э?~џн‡ЕБб4рШ‘eŸиТЃъ–—ї№љЖ!щ}фFyQРwДь7xz§пь ,oЋSиЄ‰‚‚§њ’Ќ,bfObааЌ/Гu]…ДЏ"О[еt#0“sGeo+,ћЁ+"Ш'Ї$бwЬГЊўСёˆЦ/ Ќљ–&oжœjbЃ’0 G|§P„ˆШвёЃЩће ›vШ’ьДфЭaZфсŽъЦe7uЛ_з–е.}зўmТКК~оїEф™ЊШЌX п†Y+™м ћaЩ1P{УР&Туе Ы ЗэiЦЁЫАE†" Кlћ>^ЈлЖХvжo1ЯWфЂXH‹РNqљАТh­ыКЦ-$лЏItУЮ?!S ˆбђъ{ Шь†“МюHоЗ@. Ёc! •И2CлaIћЅєчьЛхП;$и5~щІ&wuЯЫКŠќъ~Ўйрэ/4Я†šФОmhЫЋЏя§xQ ђфi?Tyh[ђ§= ЌЄ{yйwUUY`џ†m~5лѕЂЂnы2Сg9пЯ2їŸVХ byе4і№\4њ›GˆМЈЇОт;b‹?0Zј№‰•5Џћ_3П]ЏМ_ЫЉVPІЎF;a0m)<ЫЪVОџŒLŠАšЕЕo(јœ|оІ]т[ ћ‰8N86џЄИЩ6ДЩqРЈйyГuЈЉœЂ(џBђ:ŒŠ}^<пqЌЭcњјЖџџL7М4 ,ѓ_SK‡•Щ1™э˜ЬFї€мїX›КыˆџklОП5xнq5Хp~­0uг0Mу_LэчП САбn_Ю_{†ўZѕ‡ РФZц›wэОŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒЫИŒџЯЦF’џ…о‚ќ? УsнПКљy2єВ2{_^Вltг0ўтy]ЖyГ–ro4?Ž#Oл<РЋŠъ„žnўч;Tn†Э§(ђ§рlсЗVš%ЮЏ—М„žХОЊxП6Ўџіоs=’dЧŒgй3}eЅЄЁУУЕжZkїdеО§цЬл=ГЊ›dfѕкW‚™ЩdРс0рУЙœ16NМLГ,~ДФ§щWHИ ЩвРTqОR’ІEлc:/з\——”›Є%RLд‰9›­Y+фНїpЋџьк*К “УЄnŠ.qXїиe6Ле=GžЭ.gГЋ‹ЙЅо >”>?c‘Ї9+В(zїёVџ™ХЪ–уXЛ$UлŽ"$ i›мWеuЌ§ьЗйьтъ^‰гњpFўve'КQVУЃ5yџњыз{NPmЯЕфйJsУ4+ђ,/лОNќ0ђMQt=G™§4§х;‹TдЧЇчЮ•$œ Mјчъ,u‘…§ŠМс–S­$uŒѕх†—‘нp‚ВЫ,EwƒЃmзRfŸОЯ>џэЕлžžŸЧЬ ђі€CЃ@йudб3Щ~%Aї+ж^RD|EYижюћУfOгЛеNq‹:в˜НЄё+Уж™йХЭЗП|fƒДЈ{7жэpšRњ‰PŠQdYс—ЭЏŸ‡ФкнInдcхщ НZэvз{УOpJљfЉиQdK—Пmu]Іч—П§уFАУr|Bуё‚Е]•‡>uЧš…†aкІ!ю%'?ƒІщ;Їѕ‡к㘞ЏЈм†бНК­`Уа+ХЮKW_џѓbЧrєvuћљобpzj}љю й"­xŠи< §Є‹ћ"2uрŽ7гг!Г…ЧЙ лiwъccПLлж(Z њ&!4iБRЌДK,щњ—+№9"гoNЧs(›%EэЭoM•CaЊ?Cъbрˆђ*-EЖЫгЉёд§bKK^q<”6ЯщAфЊ;ZOћдRСŒіЗї‚іo1_ўvЛ—СDЎе ~:ŸЛи–~sЛ”ц4є€DЫќУ`tгђc№nC F˜ dz,nО6Ч.д5ЏШqУZ<Ш мќђjЇ{Э!їДљпЎ9нЖ­Э…д8ч­ŽSЃ/UЗЦщУ]]Žёў7тгђтЌТYгHMІа'ЎЅs+ЦЭG@iн‚•ЏЅ ЭM‘ояW—пя9глIёі^4Рc”ЈA‰ќУпэЌhРЉ‘QGާюwЭ9чМјa†ајдWeUw=ђќъ ­G=2 Žmжaц`АьzЙzјzEkvмСЉй,Ѕ8~шK[-щžРЈCЛтJєђѓя#Юq2-гдеwv|šf mАnћй№4І’˜–5ŽЏRxХ­зZШЌД•)nыЧ/ЗЂс$uжšхE‘'o•txидuUdё{=ЈŸŸ+WЁYQ’ѕДзџŸKqо#ЧЫŠ]œ:№pЌaсьрЬЕ Oz$PэрjЊьУ§jћ№л ЏШVx@ю?Jт@лЋАЮc•ч‘Ћяy'jŸO‰A_\­i^RЄwЎ3lE ЖkаеЉїeъ~-щ’фЁЃŠІ_ бќP%IйІМНКYэю?]/E \Б—Žmžцeш‚QŸOuшКЖСЏx;žЧPй\ЯСЧC№—о5œ/9н@Ѓ“XЮ(Ю№НЫЋЕ Z>Кэ=o‡5слj!M UqёэjЕЙ§њ§ЫнzЗƒ|1ƒЗPAіы[І ЮуY’ %9Щpю™к+Žыzюћz=Fд-ЌhјŽm…нљXКsЛ Mt[]>Nк„фx(-™}ќ~9_^НјэћѕЭххќкљˆДт‘ч! Ь!5eŽ“dе№ЋгSh2D€˜[~љn2 г(сД,г4kqш.фЎ;ЩР‘дІ./П=J^=ƒ.жEњўтъa~§хђfО\ЮЏnh#ъO‡уXчIŠу O•ojh!ЌOЇ.sm?)!ŒкšМ_ОзK‡8лК‰˜‡ўј„ГЁl5S![Љћƒк&f Uкн^м<>^~Ойа,Н_н-3QЧЎЉZ’veфIŽхљљt›rЧ62‰лгмћИ=r`›рй,ПŽH_лdžEээРЗ@dQрxQ[Bзzрbж7пЏoОоs’$АєzБ“МЇЫЦУщщe2ю€t dЂ(!u8ЖŽ2ЫЦ4ыц­K5MCSіыНlИXdDОЋmy'Ф`Ш’,щVPNмђБyљ§ѕеУruЕ’E‘xfЗЌъЧCт|Y"#NŠ$T%dА<|qШmM8Р_я2ј3MgjЗЃнoŸЦ'5ѓДюЅMКІaйвK#…Hыpѓ{љ~БймпьЭ4TEЩШžШ V#ѓ|ЩИ§Їч‰ЌˆКAђІЩЂЌЛОљцЬ—Ѕш†ДчxIYZH:xš,‹ oy)ж?„гO|-ЅЙПЛЙПЛ[Ќ7лЧЋ­ Л №ЗЎШzršfqОЈšа^м=Ќ)š^|О`TнВqGЈšзЂn їЫёˆLшD С і9љ(\œ[xoЄ’CЁuлБмЉмћм5Ьє0’БѓІnК^Tє#-скHсіЋљ§УŠbшљoW,NмWU$qГJАgд/л‹џ?"ЗС4Ѕ^&Ф­hЅЕЏП™ж‘=И~œІyер8Šё4”8з_'„ƒ5ЁKhƒ{РJ"ГОПЙ{\яЖїŸXž8lГуѕєˆZ&ъFV‘гиІžЉ‚ЕCТŽєc№:dQq’ЎO,CyЃдйФmІa;QƒlЙЧчcгЕрэ‰А$žOл<’WEКЬяюЏяЫХХпh†йowыХЭѕVG4ш'd‘{чб`Т`6К›dYBишMгŽЪўˆгgЕЗњjŠ$nKa‰†'.чуx:vЙoъvѕƒрDзоЈ9 Ї…Ўюџљ—ЫqТPЛхуN q4ђ ;аљщA`R Ы Ыn< ovUђkїHРkМm0<ЧВдšооm^дќŽ0?fЂЁЬ’ЌAњТѓ4Qx—Д<ЛпЭџљo A’ М(хЪzv@Z1B|wў§Й†{Hj?qžš9РT)F.ћmOy№ТfЯб’‰#!C|šыѕ~JО… m9hЈЯn>§лB’!uа 2=ОЬђt: sдљR,Щ3кёБ†ач‡#І`dG†ІН €h&ŽLgUУb8ј •3rю‘q&z"єл„tМа5~ѓщ/<р)ђ4'ШеёLf#zБSкNˆ™ј™ќ~ Љ†$ЮиКќ›rЮt\[х8 Щ*Шфы3ђŒ“и@Œdтi>Lоcь3W%№`ЫѓќлеŽїЩ(ыJˆМЌ!їƒl Ru#/ŒAd`ѓОёtWжп|PuрCЯяњУ‰Œн…— :#ПАŽуŒивY˜cq'\§ѕŠЧ‚јщќ@Bс™ЙъъВAV’ЩV3№њІЦб +HH0ЦlйзŸ}Љ€_\[–Ј4”EAXL;cM8€H2ˆ„тC,3;” KWŸy\9†fСmЩ\uфQ"“{ŸЩіDдѓ‚Є* Ѓ~[—•з -jBќ‹ЊІЮ‘ЯBЦ'Т?љєD6Яiц !3кu$qМ  a,Снїо>^šжђЂQt$ ыг МНВšT—nћА Ы Ђљ™еWoХЂŽ8I œиnh4­ј§ унyВuќВ†мDњpЁЋ"юЎwŠ$kХa‰œœ!(=pWYђcNGЧ~Ј=Uр–%ѓQЃЂ‚`iН5-%ЭpН №p}Oq&!Џ=т~"|ЛG2Jшkга‡gŒУа‘yъj)Š’(‚кU pbqprЩ„@–јЭЇ‰л ` $иРф{ЄЉBѓе5Вэœ–Šn#!u Ђ9žЇ E„&сp€З жй#Уk•ч™ЇдХЫ  i7ъкi‘'o"Є'Š>M$И„dьaЩT‘H–$Ш4Ш|_kд‘0бїC 1QS%iЛ…W­kКfњq9LФ‚H1vФэ{8M„№S&ƒAjl/A.S5УЁOœз|оШ†б2­ь‚0fIŒ &<ЕЬЈ_аZKџВКьЩ‹ЈЛ­Ќкa ЙT„И P12 у‘з’pПhџиwуeсƒJз|хёѓ^—Сq’fG dHч>0KUxjq{Г’Ьв– љ%ˆїhm(@№ПБGЁнМ!ŒЗ„э‡игD›Œci=‘gOф‰`uУy#IŠа&Žљ: „†œW­ :џё4€#вTqПZmЖл -ъ ЂЄАРіSˆA` ИємmEХЮ[Т&|žœмё…]Ійе“Ѕ аЧ‰ЊЌЇ-Ы~lБјЪЎЗ$(GШї›иЕuqyЛ—pšnF Мl0ŠсХwД-Фr№,}B›q5Џ|z!О&|• њБєM§b<’Ж#r—"Џ§аЄ єЋьв)KуWRA@fGЬžmuq'Ж‹гШB™:NMє ЩK_Yмђ•эеї­Єš„Є† I:ЪIђAv[цi…1Є#К’пŸЯxИбf0^G+-cIZмвК4$# п’ooEЫ‹Іэ‘Ї}˜dЦО’л‚$`;–žпlйЏ3„„дгЧ‰”$”MшИ^(В фШKšёє4Qižuъ;жыšDœ-AьЖCШ;p'UОХ_^бšwјŠёˆ‹HосFЂюБ $лЯ)YЕ@㇉" ‰њфѕАJŠ\RšЂJ"G :!j›ŠOHЗълЏ#ёуuЯБMqGkv€цё|>6%SZ6‚і8&=™ђp [’xН&uIаЫНЌšnдLaФ9L9љЩ>Е4DSН^\}ЙЅeЭŠћЩ1vuš~[Ђa{Ўc ѓЕj"р А№в)ЫаР^:тЙˆEяL”< жћЎ­s[–Ph,К'ј&ъ‘<уЁђtRВФэwї7—WKVЕ3|ЄгљžчМ’Я4]л6vŸoeв№ЃТиЕU™'!ь{B|§"0lУvТ:еefIћјШ 53–л‰’&МСјЈ€ТЛТ7aЯ ЃДШ.Ўюi№Ќy Я3$&rо+Џ1щi€‡“–WеЪŽЯGpCa”•дu‡@XЏЛЅю№џyRЙШ YfЎ/6n‰vfAм3:єЉЌпw@g:u]K—ЈХГg/LŠa,l@џš,€Жmп5TV4t/С/$H |y‰аДA\Gз‚3/ZЂьЎ+MYо]?€І%ХoШ‘№Щ)Gg№HЁ*Ы*lSхЗЫ=фэ:$юеаЦH ЯОцј–Б!ѓёгЫёщљXћ†LЏ6ŒЄ@т˜ gЬeЩс!j Ф… 6‚gr ъB…ХѕN– ЫЏ†)э%Аyx1тзЄx)<o)rZHмƒzьа@фзР<Цr“К*Šf8џўє4цŽ.ЏО_oPˆЇ)Y!qш=є}РƒDT|[˜ЛМнˆВ›еЄЎJТєH’ИEЬF‚Щ“fОЅ‹ьžfxIVu;,Л ДW4Gв–›6xžƒЅЌ#і:Ј[€I†iЙQ=х‡УЫЮCѓшњ@ЌЛі‘^эй­zRНF9ћ@t<•УЁы&^$.žЋю6v€‚›Ьы:qэWDФ-ЖEYдАѕ ,ЅHЛЕdй~R“ў Ђj4`м‹ iтF:”„Ž ‰пmxIХ4бІРSЌGЉXјWбg79ќ|EBmsЂj -`кЏсвTm/№]зѕƒіИ&Нй+ЖV#ё˜Ђ4Ж!пAT6гФЖ ЉЫ†•D#юАт~8ˆ7N†$ ЭqяЖф[$<†\T`іŒ(kА“"Ч~…аЏ›†­*H 0šп-W э AЛь“O%‹шЙC#я S„ˆHэі‚ y1 D„7LAhїc“'Ш ЇЧЏCЯV…н§У^1lч•Эь[Ž–sв<–о-Є1A3‚-і#Шd +ЄС#ŠОЌ‹%–[пoЉ'№VE№žЛMq“”v&п‡{а6@­ART-†в2ѕmy}џH ЊЎПВFН\<|§ЖDВQ–йSЕgd+ˆОЦ„„vЏ…~1>if=ЇшЭёFIl]dьшAˆш][Ђ-…ZюhЩpCьЮ+ЋbW%"тkЫŒ7;rL<в7j'э„žQЈfјВkTuлO>ЛяrSФ‚ЯА,o€ІIuфHў1 Ё=&Mтh<|ЫБ‚сЧyБДяz€жзЕМб’…˜Ž‡дZЎcЛ~˜VŠкжUг h=jчХЊ'ФJlbGXš^єš‘˜џс@Ьyк}фYСk€^=‚ЈUQРEћQVu=XIY%сыЮ]$ ™ЉтД€X›Qœ–іšКЬГ4NБqlкўЈltŠсЈџІŽt§ Š“wгaюё@њAІќЗŸРиJ™DОр$PE6#№љЏЋ!ААCђsФ@EнA8ЈсS9Ž—vX1%ЊрЏЕІm†PафЙ=6=ЊшЇЇІ аыtЦёт‡ ‹7eš&q…иД.яЗJ5M•EžўЪуСВƒЄOиљ-К…" “Љ?,?m œŸ|s‡V1єS™ЉыR‰йн]o@еFBD&D:N,Sь‰m жЇЄŠžС<>ˆaб”z^}lЛS@КŠёжDhЈŠˆsй ‡ЕУ8љА~‚z№VЛЉXЪЬњъгнвrЇHEx*FK!Hk˜Юz  эšЊЬ’(ђmiљѕСˆŠ:ёНзї"€ПДГЉДXчП%еDнrРБv$/з„Ћ' шћRcщэѕнjЗчфœё~œЪУгАq|1qАКLФГ”эїoŒ—UiрНў€œ“‘…DЊѓитЉНl"%XСž$'ZУЪСвS%ОЛё–Ыђjд“Ау]џы?“Бд–Yњž%o.?ЯЭ8=ыЕ`ЖВ^ЗXuЮB[`$л#Л5тєП˜OX7фKVа6ЁФб ŠуUЏˆOŸ’,Rђ@cy1“щˆ пX[d)hZнн~њЮћIќzыр,PbSWШе-аŠыћx‘Ђl04`EшєЏ6с‰—њXз"Гyяaчљ­‘рТуCtјsищќc$Ї-ваw a}uБ1С•Мњы‚џsЫГ$(бѕFФ—B„˜JsDŽУ; ОяъЪ…oХђŠƒ‘# ЬQЦЉ<:tS4?’ZњTЙ!љf‹| ЎЃБыl9ЏПЏhi–јCPЗ74Ры8GЫЇB)Ш1ᄇІњЧˆЬц™Эš…ЌOДfš~CВR` №˜0Ш%Њ&NЛ- 8e6”є†f{кђ!#—v7Ÿ?пв–ч'™ЄжЄЭc<“ю‡УЫ†'шк\уXРД3у—‘ІŠ 1в“w G7CWa[eйќxGЉяš*ЛоОхђмŽуі›‡/џќєэ‘1М k‰Z&DЯгa~=…&нФЧо\QˆЭёѕф˜ъЉЪ„ЧЅ(?Dи2 Б1 ВТr ёC Œѕ^wuц[C:~ЉЫ‘cžщ$‘”ё'З0ЉЋk#ШšОўіИYCL„ХJёHЮоŽSmј0 Йo(Є‰ЩtТz ЎMЛŽў.}д[pЙ[м'ТТ=OЧ‚/х[д5lл&2MџычЋ›љRš•“ЉђётђSщІ Ь—kкnжР땉ч˜я!є^вёЬƒшїќв7J:8“‘‰:Е\R•aюџњЗЫЛЕЇv4Їчу‘œTLЕщ‘œYŒЅЋ0ѓљ–• Ыr@#U№ р­псn%›Ž$Й‰|фАvвД#Mv2i `_Wmзф&ЫЎўі 24†ояYСm^Ž ЇўђuщЊТњсq'ш6DоДnЛЎЪbH7оЁo“V1zЧ%fuGвD№уHў47ПxRŽi2Lš 6№—vМТfєЌы/ЇДЄќ3Йш.вUvѕ№А•Р<ќ-`_пБѕЗ+šб!лТDeJe;ыMгЄДO”ŽјchЛдїТ8Я=HрoжЂ(Ъ’(iA= /oш8 сЙяиWО!Глљ§J1!€Њћ2pTщэwЯh RУ$GTŒS$иgиц5ŽЄ‰ш}2й!w lYŠ}…ч–{ITtјeTѕSUє'у>яз—ЎЁдунZ4m'†єАpuўvЁюa№&‡Bu‡иjYЖуgнd#ЄЗ`ВєуЉsп;šРoі6щ&Б‘АџвXv"G]“ƒrЌгЋХZ0 ;n†&0ЄWеxџ—%†~Tt№‘^G5 M$E§Йi{|i+OB •g0 ЪŠ"ђы­ ›Z*Vј^ОcЇЎšѓєыБ№рg$мБŠIp_–ІМЕы[‚ЖўPaяšШ ЛžЏЫнžeі4Џљё|"}IЧ—УЋБВр#7EсеNШЮ<%aeш^`ZШT2: -„Э0Š,YdnюіxЅSQЭЄ})qœ№bМІYЩˆёЅ@ЁyžЃїлїЛїc ѓВКЧnчпё:iьCкNOdw 2Ї6^'14Ьƒ’АџQ31-Їn8p0†$Щv…MMКиxЅп‚jй~кт1МЫє;,”њiъKziє?НXHщЪЂ„}БO-8Uб№4ГР’+б‡Ё 0I<œсgš,є‹Њїоцј(mFrDўуPіяфОiќЦОs‚„Žx7#гЇВЊ$ ›GVFЬф uJfЋА#A{†ѓt< Іq№vЧ;ЯpаЏ^ŠУ Єўуї—oис{&"LюћTи^ZИЧG^Tн0=ШСвxш3пжž ЏТЖ—gјћ9ŠsочvмП/…ЄЄмU•5ˆ§ўёЧѓё8]дыѓлІ~єB&*Ц–уйЭе/i>јs<'ъQ™­laiœ Ё‰м•;cuЇЬBлдпѓ 6‡сн ъ4Э›˜Чq8ЂœкШв№5уtь6D*OSћ=УPїŸяxYƒ м ЄŠ/Ѓv†с!ЊKštА!žQзЄgЖ/МљвжXŠey Оєm™e{xzЦюmz€m%kf\S#и("Г]ЏЗ›ХЗПпВ’цтЅ4lOЧ6„Ф7ЛЉе ШБaщ™мH$§д€|гzЯщ5˜ЌxЙќЁЃЩхBи‹ЇвRXN5УvЪШ­рdЛ\,цWџЫ #)6ЉЄ T<•Yв2^$Šђмйm ЏяіeОiПыmwœCc9a1žHGюгяo}H yЛ П"mўЇcыЋ"Г[/W‹ЫПџѓ†QУ'еr;ІsЕнN-Gq™1ЧyРЫ-ІaBРѕ}ћ}Ўзўћк %м?|ъљУ5fŽJя8ХŒšЉ кGš"влѕv}їхћ%Щšс&`;xњTйђŠвM7)ІЦAШ‡"GSpЄŒf3ЌїŸШДeЄЗр˜ŸБяіLpY ь+ХŒ{вpШ-Uці4C-ЏО\эDr3'ЌёŠзщ\XЪb­ъ.фoи9” ВˆЧб"X ШlќŒЙn[ЩАKlTзyМсC—шХЩЮ$Чnя‹ˆміњЗKШl ѕЗвQ—ЂnFEA%ВU™ЧHRMlЯаЪмПhfhваC€`ГdtО{Vqк&ЎeМyЭ<|͘эЩнYХ{}ЧcхщЛяЙVC›yžŸc'nтф#]ћ)Г-1(РŒ R*ŒЕЈъ/CJЛЙ8ЅЙЧc!RU‘КПšЭ9Р!}йFЂ.0иХМ˜y“G$а€ПД=/НїD’кЦi?šy+рбIšFŽЁ­o›\ЋЎcзд4UЉлйз5фИ`V‹1dˆ-qG~6ќДjp цrОяc#ТO› )šVмdЎЉА˜‘ˆ:$шЉLu9—AггuБ‰Сz EWГџёэ~БйsВлa(:Ž* <`@А­ВыЋ<Х9S MC§isOгђђл 8@ЧNАЯхщљ”a™_ІСАTл/њвЗtА/IќйѓМчыХy`iГ‚‚ЎёлЛM<уэ=€zš$В‹я_ Ћам<сљщїбг!‰нмЭi rАЁё–няїПbъ0^жёcпVfK<ѓ‚=ЩЌW;FTНсyВщЦ7UqћїПЯ`ЋЊšaЛ5$Х­%3ЛхХ?чВсœ. fГй§ь™„?ЅЛШХйJ7М$ptqЗмPМЯП?cтw(№НяoОЬXtŠnIЪчЇж–˜нъђяwВх&нЁАтмЏL-`1‹šm 3,Ва1e№XžŸIЮ{†ќbw7‹6œt8‘O‡mxџp Ц‰›:іАяO§%sM9™˜єŒ6ЬЈnы4ђН HЪў k ќЄЫ\]з6Јiœ†uœюŒŸ†"]CЂжЋНjEuh "јЏkŠ‹“ё>оЙ=^QrА3Žгy†изФЋv3|цФXт%зВPN[чр%Аm ‚ПІЕћ-KАpІ)щн&] фPтG+ОЗ u=лAцbI}Р‰$П7оЗ4й‹ 9№з]аzУт;(кІˆƒ0Š№eYVі8[ я№˜8.ч~/Іsв)F‘ эиІЎЅ?Bœ2\ПXf4m?/3O—ёТ2NaЕV`Пј<…Й›ЭОмn9AжШ yв—Й@WіЏЩ&иѓ/—+“n„LЙ=Eэ(†eіŽЎn›ЭyЭpЃŠДM…гО„hўњ№џыRp.ЮЪ •vWїŠ“NCnъъЇђУж,:l_ШS<иЧг p:3­ЂВЩ2хѕЭЮpJ"хцЕЈ™^жbK…išn˜цЈп~Жљ‹УFЧѓ\лчМщ•#фАК†НR# P Цё|з|)mяАhЭТСИ%їЗsСєѓЎєІjтNTЬД/MZЯе0ёофŸn/K1pЎ™m[Ъцц5м$’?сU3kQяКіцmяЗ8ЕhйІДИИчMзЗŒIhQЕв"4Д_16§ПОY7Б^ЫнХiФжЫ,ђ0•?!^џч%ш8t…ОаjџРo 4Dh~ХкIКІђы`|ы…’DMUџђџУЂŽЅfЏќk| Эуя|ЌѕБ>жЧњXыc}ЌѕБ>жЧњXыc}ЌѕБ>жЧњXыc}ЌѕБ>жЧњXыc}ЌѕБ>жЧњXыc}ЌѕБ>жЧњXыПхbјїћєK–l™џ‘љэџхњњюПЫѕ'Вdлж2€WUAФћ!џлNF5-ЫyУ§w_By:Я0œd бЗэZєLљз "TЏр„I’ei4нA“dсЯОCВq“$rpЮVƒ`iь;ќLД~м9Мƒ7с#ћNгdЈšе,/=ѓЯꔈt€LU‘eUMxzк&ѓФ-gšг ГЛ‹х%iйŸЦЬeзВfe‘'‘їчмцЂ4л67ГˆQ7mƒ\Kmз–e™Ђ т•№пfГЋ‹Іхp<ŸkOЂЕ ЋКЖ)ђ4ў”ћŸМх:Ж<ЛqВ}‡A„г]'єm…• m;ћЧlv§y&РC!CmыЉz˜Ж‡ЁЪ’$MSїOИэЗ•8ДЬйзхž—dE–d#jKWцuл– Mњr“Ђ=тhЭ2JЊсиf$U•…вџЭЫќьЕuПH,}vГІhzПпь8=j2›[m8цсb'2‹йїйЗџљEЭђІЙј0Nmъыz]b [щѕДтЏY”`ИEсмlЏhЊЂHœheZќЭзЋы/ŸчћЭньццЫп.„(- Љ NB8ѕHњn'ЭX…Цnk"ЫЏy-Ј†—WЁ)Ў7ЊэaрћA’™mp_ўђхццfБ[_Яn.Оп=lUзЂ8I dЩЫcт§ь0$?ЧЩјŽѕЋBoиaе&ЖИYqV„УмЊКBЪ]Y§уѓbЯа4ЛП›]_\nщнž“4 Ÿ+ уа76RXk_пK`мЁћЋt-[A5”žК^ЫІ_"KXSХm(Тцыи‹ЎЋЊИ™]^Џˆ~‹ЋЛЎ)У;q”ѕЭЦŠћ1ЕЈы-rЧс˜_"ѕJЗ㸘[є чxyУlcпЦE‹oŸЖ8мsLM˜]­dг2и›ЫЕЈЪєтqCэцї[нЯЧ6nЎфŽ(#з2~і м5Еž­uЏ8bcs%ЙH-нFЖЁЋЬzЙž_мJІ—цi`iђњG@[тэoз›§vљxsёљbЭaк2{їхZ„нP6‰k™ђO ъЌЄш*Н“нќ<Фжц’s‚цphMdц[Vbц ЩŒРV]—ЊЇЖzћ—O7Ы Э.О\Ix}џ4Fъќл%^бФ–nСў4Б7ЮХА4–Г’ДЕПZЊNмŒ}jЪ‹‹bšГ‘œМMЄСОнjv^{кќЏ§|GAdЎШXІsЊМ–ЅЮ/qlЫЦYv?GfFЧ!х‘o‰œЖЧЬ–Vї[СŠлc›…шž…Ј)-YфйљхR6Г>6Й‹џљЙh8ЎБZРО=Я}dЊ?џN™D~№ Že(?Ў †eЙqнцžЎ˜ЩxjSм­Ќ“ЅУѓFTњ~ЋFЕ/Q[z{ѕ§ž1‚ЖrнoПэ5Р$ѓ „ NАЏ"иЊдЗЕщЗ‡ОЋ‹иџ9—јi‰wЋ0ѓžŒљБ aЕTТњAйєkРqк*rsџИи<|§vБRœjH]§ёJ€ПEќƒv8ЩuЈГа“ЏWІ_GdEUз$†Zяѕђ\Л*usЗИЎХᆛД›uнѕ‰NћђАн=^оЌ8€­š•Žчщ›Шв§іщyˆ ^–nЙгНђ|J ъъž‘5У|otН”Рy˜КЪ V}"[]|ŸяE Y+ш9gљEџBIYлвќЗ‹љnwyu9пRJДS$a:> YрЇ`­/SЌЎ\s>$:З xžmНыР^Zаt'@&'NЧТЕи' ЂЂk2ГиИН‰):бИЫ^/ЖлћЋылеnЛx\Kv†SщžŽmQіЧгЉѕUф6СэЇуг!3œ*Y”)`ыw4QV5ЭŽЊ:Я+œŽнx†(XD5Q–fЛЂЭ‚№ъZWЁО}К^ЌWЗ_n)^xjЕWНю|zў§™а*N}т˜€•Ђ8*њѓљаЅ>RыѕUhщђћЭБtMМеIлaш‘ш3w Qv:‘чEU“іД^ŒG$ЫuўёѓЗлхzyћe.*Њ,ЫЬž72GNfттbи—I V>žШа№фMŒx|ЛZПЬŒ"ЫТv'›NŠ„Лu–ЎN‰n’ MŽnš–Іz5Ё\h\aѕ§ѓх§bѕxёeЃ˜ (‚ њ‡чg2‰“Lћƒ8NЯ< m_†&ёхМЫf\‹,Эq+фЮqГуЙ lЧ6йЙш"GЎkй,?'dЦCЂЌ/?Н~\­П}нуoЫ@ZdЇџ§wчЂЈ8џєщлж?T‘ЉЫМlYц{ ']ь8Ѓї{Nѓъse*Š"ю6š—t]™D„$ЩІAъЮу–7Зw›нnљэrR‘mш^‡-Ÿ_‹Ѕ2\ёŒ\еMMШьыЬEЁСƒПrЂфнš•5œшž3тББI”D`[3 -V&Z[ААjГ]ЏЉ=‚МНІЛQ#Ї 0ŽЩ<&BЂфЁЪЃ Ѓ$ЭЫ2ƒнЭЋ ЇЗЛQЂнД}'VtЋ.24Э0Hn‘Ї JXœр™giŠЂšКћКР)Ю р$’2sтЙxš” ’pHЁЈ, Щ }“Ї7іŒЗWљ`j–ЛНŒ-I4гЁ !xІЊй^Tt#aYІ9~•Ї*"ГлR KЯ?нёŠюЦiz^XбšŸI2 œGе.ЄiЌ€є\–эzЖFгZPјкл…VMIQѕрPmM њS›% ЈHEМЌ›D&Fи:пШюж[še_WВЂуА9Шаœє0YaНB‹>ehkЫ‰X‘O@сPJ 9Ц›нž‚дёƒИь‡ТГƒц|ЈxБŒЪВд?иGб{@кš^=Ў(†^\ь5Єо5 љ :$B!"Ѓ5{Р§Ж†м†aš,Щ2XеŽZШЯє7ШкЫрВ4]УйзЧ&Ы‡Ї€Ÿ.sС ы€|Тъx˜ІR4–™ѕ|ЕЅЈћo4ќE‰xNБ+d ‚PŽ3ŸЮ]‚5Ћ‡{q’ '3NPГ!АЯ=уэВІЉ5ХѓМlVGф'#TЧ6…œ/ˆђсtšИЁ1 і…oЈK№n>гЊЊЪ Д„*ЌO“kUC<Ях Ыёc0;D‡UQ S ђ~ѕvF‰Ч ГЅERнj"T"BйGгŽЇN]фмњ&…Šœwї№™†Є—.§ФХŠ^•;Єi^Ru„—r"ћ€š"‰Cћ›$–dŽк+ŠfйNѕHkFœьiтYFьvzЁ &єнm™6( Ф~ќDы*2дzA˜–-!ь›ўћЈ}‘БdBx„ЇЁѓ%ЛІfЇ0o‘™3 ‰РtШ<шГFœ|Œфu}O8GЯџQ^98Œ§С§o”†ѓ{а…Ew ля<9шЇчcaЫš"Ma0*с>ƒь^•QЄoRДjšЊ "‡(’жzBчNї09*JТŒHшк†ЬVv Щ3ї›оFњеєтњHо™А}ТЋ‚eКyпцYй•­›ŽkщŠ„œьъњv§њl€Сш-pЉШП/г(эи bли!];Ил‰љ|$QМЖљХВ Уq,}ћ—я{xށ№!ыa{žжщ8ЂТ‡u›^XЉ&уІewЛ=RРˆ §bXŒп№јЊ]њ9*Œ”о=šУ#!Р_HёРЈs•^mСЯ№"јмнoпw,Ы1дv9ЋžŒOd#y7ЂвБЋЊО/#ЯЯКБ0u{{Г‘ТR•зуV5] ~JŒe Kч%<€І‘]-{œЖуKpЁ5Шћˆmђп}ЛaX^рPёаrУаГо0БuƒtSЎ&f ЉнАZ<"янD7Б–у˜BbэC 2Рm`лЛЏЗ,'ˆМ Bxai­žТ8q<'BL‡tУ}ŠгЫ‡в‡DBхСTЭ вд5о@АŠРh ?R‘8№єiВЬѓљ…Pu@kF>сёаї5Рыџ‹Н/mŽ$ЙБЬПВfkk6-ѕMВx'ѓŽШŒћОяћЮƒ,ЭП_Р#[3šUk5$Ћ5-UГЊВIТx€Уё’В)С ѓ›Ћ›ѕnGoЖМ(rл­R‘џnмЗ„жОУыыP&)RЏWБcŒС\ЭУэђђфл81žŠСІAОн‘ѕx8ЛžŒhnћЂKƒьн‰gˆ}} Н&f­Ž№I#ыpIѕЁ-ВR“Ишр5iЫqюЪтН*?М,)VФU*ЩШьо"Yч~O`6;{h€„˜ оc–x‘О#I/> жЖ’œ§#ВАжјћ}SW‡ђЯЖTV0щ}€ЮjБнтФa Й„3ТKзa5 Мd v„‘|бІ, ї ю7"ž‹Š умPCоЎZQ‘Хžч:^˜“Ю ’ѕрВu Pѕћ”ц%q;Ї’YЬ-њм3ѕѕЃ™aй–EM(3б<р3:RУНи.рŽ_?Q€JUЇЮq‰X‰вј~К@U€–ћDIƒЃ9МŽГCŽ]yŸћX)€76Ќn‡58ЗW<9TІW NЕБLNœ4a'ХЅvF†|€щЄEfAKртнjdж$€p\NDR€_keŽ^ЮžІ4%П$„­Шч]F€єоWв-гыJX†0Чja/в‹ †AŽОбШрЇ@p3Veƒ6‡ќ%6YnEIUMpŒHцŒ‘pO"><,ђМ 2с)™mBі“oЇвеDъeС€STгЭ†ї#JjNwЙg%ЈЫCш/_vВh8q…бѓТqvИ ась С0ђвtyф З^R ЯqВ4иЄ`!/р;”Ж`‰ХˆьПО ™­IЫЋ[0ž €гЪЩђь‰б0ˆ:(@Aq_ЕmaˆЬє?oа›`1:ш=цёИЈї#Є…?•чш З]-–Ыbšaб5@ыї@jHі‚х@иСq*єœТнtЂіˆ јVp=уњКЊ,Щšn+Owр=$ЃfGŠO#Mіў TFіё8€щЁ!”оЬzўМdХt“ЊЭы=8O‡ЭœWиˆl‘&,oрЖ&yн‘2:СбИ ыІnpm7Dex‚"4dnЕIїыЁ #ћŽ$6ј ќ‚ззр q…ДeтYКФ1дz yсЅ™ћ.вcvbр{Оx„‡hЧЉ–ƒG=YЭh+єЮИ тEˆA Я‚Ќr9d+hЩP`MїhtиЕЈs‡\пШт[V%ўЄJБMNхijЫ)ты]рƒз,ЫжUиЩК.1k žТђгю8„„ЋПзб ХH'z7"Š5{|к0ЌЃaIwdуž}РаTЅК~g5>|№Щжv/+~ЊѕОХШЋЛХ–у™эrњ4п‰*dN-š7Fˆбп5hыQgH^vЛхугѓн”ŽЃQК%ŠЈЛ%AБN} JШXtˆPaOњћQPфї,ЎgдvГš?>/№Н™‰&-‰мрs‰žM[зш5ˆїƒ]щqєvљ<]­i–‘cPuO@гОCWBђіŽ­:БfГYг ЃfiрЅЭ Л( љн-++jЙ`СхKMCfЮknAо.и<3FT~C”& ~›‚Рnз4И]NЫёсШЎEДM2ќф@,э™ЄЊ"ёXW-У&‡ХЧQ`НГН–tнРЮQТ™+ЩК•јn›*OaЅ\ŒhlЂ0ўПmЋи†D`ЛуxQёъОЧZlоv КŽЋw3„ЮіЙя н5Ш ЬИФе G№ЮЪ‡lЛAB„ БBoЙzŽЖBц8aA"[7Ђшv\0ј юЈ@хHЩEХСOШQR‡ {оН$Ќ CSЄ16WƒтОч˜ З3ТДЊЪ~Т;Ш L лЃЮзqБž?р|GWu7эF:тœСфП)нѕ…Ц!љ9'(Nо’O ˜G‘дŒ Д4ў0ЯГ,MрЛzЎ­а[34тЙц{ИР1C|PзфI’Wш“Ђ}ЖШIfP`p!‘‚(Bьн4dŸЦC=ЯйЫЫn‰N}Œќ§0F№sіŽяЗD•СЗі=“ŸQV”F ўЛ +Л€Ьqэ‚)!pLщ˜YbV;к6‰,`iє"шŒй<=­›эМGG2№уИHHb9ŒобGM^Dў""пUцЗŒ› !ѕЮŠhо€Рw-ёh\’E^„'БaхЋcЬgћqєM…егЎдyќЮгœоI^†) XFП‹ьВ†Н 9ОN™ъaњц: 7МеАd‘ЭSДЈAэИ~e5ИхУžИ3|пэш:šЊТŒЋіEŽY­64Ущ)’ёŒЖ€Œ…0rIРhLЭ:џpГs=п}Ыгn†Ј>0vЋ­тbsFEIйŽэМѕqе‘ІС@.qлй ‡b„gIВ…аы‡Бœ@žbN…gРІДИ›+nрМпаŒюxiЋйм-wК€Т1.ЌЛ фgž дc3UиАОШЌз,ЏњY™=VЄvџтЏЩй ЩЯ Ь ФжјѕŒж\ѓ§=A’РкэЪдч№М0+jД$”ЧL-5&$Ф‹‰nS:"ЛО_ƒЁ‘йЦ,RЮУК))Ѓѕc1д?ЗЗрћЊ‹>mHєrЇО+m9+эFy]—iЂЏжВыYгŽИœGECџЩ$BЯБGЙВ8v§DqЂ,‹‚ ЪVЋš_œЫЋћпД&*cЭИ-Р ж+ъAДСырЕyaLЯ‹Š*aэ‹ГXИ=юЧp1њАq;Ж…Ю2Ы'šТp,ЫЩ1.'’Ž“"k?ž`Œэ чŽнYшкК№БцMЭчi№д|#ZЎЫ›DпуиеCJtGлЮ‚ј?Xд‰ФАЯ7АzГЅЗœТц#of<С#…=bуО.’Р`:n“В\Яб>vЉaХЋвn1лpВf{AоМFР ѓ!цЌаё$‘МќЖ јнцњЇЇхjі<]Ў)VЯz\cужGЫ,А 7iтYъ4t?хŠбFяьqM’,4гЙ NzŽи 2vзtX‹„|~ЛќёO?нм}Й}šЏiFŠzвм‚Jџ‡ЩђЏ&2MйЊž•фП€ љИЮ”†№1Œ єTHУ=–dч„ѓ™>šКУЖHA"iGп§љЯЗ/гйŠЂ!ЙЬ†сќ9|фKxЦТ3jЕ\бЛXA9ж}А­ђуJƒЮ!VФР;cЁЄШТ<—ій@>•9N–‰ЦВ‹йІfЂ v‰5ІбKЃвуЙi—:*П™Яцрfšaž5ƒE§сn …ьF€x3ФвЄK:\їcyT›ыXtuЄыVe6ЯQ7ЯЄБ|žе~Ыъ$aїBŸZЊФЌfK†GV€О айў№(бШ Рt+rф” 5ьЧ’юcHЗRK“…нzFIиэW}9я,—ў(О7'z’›ю1DWU…–;FMіПѕNaКэK‚‰ЁiCК…ћK"xр~DЄƒo}<:Ÿ}Wњ†*БєlJЫ† \л„–Ъ}ќцˆ†Иœї${†є :di‰НЧуQлhfВ5+cБЏFзЮЎ6Мl&V:r ‡аь4vрbZ№ЊШ.ŸŸж Е›Д]b}Ї) {АF$6МЩ€upˆaU?жœ‰ЧЭxЬfIБ<‡'њь|ЭЫFeUŸW4YШПER‚Ÿ†Л_иЭlJЩ†с—`{ыуєМRЅ№zБйШ2tУд4ЩŠMь[ЮНT‰ёxуpˆхѕе—%q,§Д$Эё}‡-‰'и4AРъ|$-‰}Й–Ў д’uђ<А­z<Щ‡@иT‰oЩ фзЂV”elmФ3/в–wЄ@——Љ›Їћ9……zzЛa™ІЊЊzд8{@ycЃY,“@Mз6UnНтuќLцšя<Ћ§ЋАОг Ќ!,ююžgЋ5ФЏн/kёўtz#/ћ 1‡ЦСnXŽc™-uГDUU0цѕr?ТЅѓ‘ѓёјJŽ_ёо~•%€@ФеRд­ЄLcuў€Xž‹–рŸЎЎnюŸІЯOЯ šуyYO†гqtеhDrp„>L–DYтјеу’уE-<Гe•„Є)ћБч`l*[Ё№Yк*ѓрG@@ьз’YN”4ПЦh:фXЛћыЩr\алЪё’ *}џИ6Њ0чєёцGЏзx …Јo4eLдэЊл†,С–VьЉжežgy#ьn:`ы3ЖЗ*є§ефvГƒ—“УЏleІ2{рtУK‹дзБё№іzCmYиœв+щП+АЈ‹ 5фЖŠс%5I[—˜хZЖЋгXщ Ÿ6 Uff7“яЫХœœ;‘+[]нmЭŽМCЉГл‚Ц^Uљ›Ms“ ;K0q^УЎднЄЌЋEќfѓCyг cG6ѓхf'Њ !yо]? fqОšZУs@йф}їeFCоbaчдGЗZэ№bv‘Лˆ!Ѕ№А-їЗПIІƒW/фэjЙкЩи тГг­т4шКпN$ыnѓРTхефЛGZTе.H­уPИА&`oJКэЧеиИcLygЏє?'Вiј‘яXЊ@/– ^€С+]ѓ9Ї›А‰ы&жЦЖmUYMyXЎБ{\:Їз>ѓ]la YY5ќvnWecш85ќ'CCњЖ)гг#Jx‰pzЗбLТ ЈŒЈyX6-ЧDfq“лфк§Bэ‚с/8 уpŒ!ёЛ—ЋŸ&ЂЂл8ЪѓЩзЗ}œњѓR0нж*Cм~оФ—пFд лГLnђ$ъmˆ›щœb8QБЪq€Ч\ЙШЌюўќ§DТюCœ‘9Ул[g‰ЬvѓјгЋ9QНЯДЕ§ь!WП+kХ†PОЬUгзН{y|Y­З’UbцˆзЋёnЗЙћ,­90Œї%OХoГ/џі3cкa3Є*CoџР)ВЊнЋq€ЖЬЌWХ*n KрпaUЗ)€!Mg'Nэфєщ4bbwѓ›Ћ…dРГ”шaОa(ќDa%ВиŸMК”5і[О}ћњ”оƒ#ѓ ќ4–Юqєв‰œ8ТгИІВ}yœ3šy<œѕў+|яСДт`q HЋoш=О~}=эЩM}pdЌЂкqйтMёЂ†* aВQ­ v nВм1,ГлэXAїЋв—чїГхУ?]УgЎ'_ўє‹Х9^Пn ЕуО uŠЖ’ЊŽ]m=aўа ф;н ГШVжkХВLУд Ы ѓ*Веч?џxssu{К›м|Н5=М›Ѕyй}YдL ŠЁqЭiЦЛ8Tп'‚хFeц*дœ'C|Sј'/ви1љЋџѓѓtЕЂ7DщЛч%#J’$*ШšEь‰Я ;юŽЙЏoŠmлŸ>Ž№ї„A2Ъ&4ЖГ”Ш%зЖeкКТ?}ї32ŽЪ"шr;yd$‰пЎ–ЫˆЄžчЉ/wЌ— M mž(јЧ6ў +–ЊДЧТЇ+нЭкЎ.ђ ЇВ‰Лх§ŸоhКi!ЫыфjBЋ†ЅаГч—еzЙЄDM–_^tœВcв7їЂэјо5ffиЩОMъ–wУvhзu,Ce–Г—›ІŠщЦ‰ojЪъjœбЦюхщљљщq:›OŸžц”тІ}J?=ЪŽ"!ј7Г/%'њ@›_I^мкH“Сх-fыэvvЗRЬЄ‚Ј(‹/їœaŽЖ›>онN)ŽY^џМ’ /nі…Eп]=АІ†№Дмgžў/"(š.RŒ4} ЏЏ(Ы/ћDшщ—'Zв4vЖжм23ežЃюfЊцЎК>м<аŠmIOЗ’эfнqHuv=Л›k^кšІ‰пвѕmDpmІЦoЗ‹ЛрЌ кзОЦо§КQ,з—ДWАwєєjЉZYъЬєцzЅи~`mfК›@DRœœї|/ТBr49Пйnф5зX +йХлъіyЖ5ТіPъj.XQdqsЦЮbyЛЁЉЇы…dЄ]jˆ‹ыСђ“аeWFPbpФщШ§ШлQ™xžƒ\щпhŒЄІ›5uфЈiš*Зšюœl(]IаУ2вш…6§В 7гћЇъж•Ї3 PUфs35ЌOЧуыО-у@œrNаtuSрTИПУ?A8U3эЄэ†6KВњpьЊиЖфеR ›C›ћNX5ОДк˜Y"?п.vдьёv%™е>s”ѕжђГ:И™voЇуыЁo3_]€вѕў0” СжпіQ/N ѓиеH$м4uь™%9й0ДUйѕЕ'аМ—љмн§†л-І Vq+dѕe'ЊћЬчi#^O`чќЄJ‡§ыБє@рУ?_iYзtVfћz(#Ҙ h"roF-Rnэї€˜3Я-њЫ УГ›2Ш6hэ мО№dбЭЧ}EQф9ќ *§ж‡†,HŠ,}> й2NЧ6ьє0†$h& ‰4r-ž5œ”0їэли†W)ГЛ /№›Ѕ СC–,ž8­†CсШ’пœ^ћд5pљђЗУўT;ђтўyЙйQŸяЎYEaw/ЛЭ@8˜гЌЈyрЄ`њUзтДї:+ЛЪb^XРHд| NнДЃцаWЭp<–žЎнёXћ*+HВА˜ђVиJ‡НўсvЖхГsА…ЌыЯlГ>fЖLпоЮзœnл&џВTЌА$ЌЫC7є!ZР9‹ЯЯД ђМ6GЇјк%Ž…Ь$…У­9I–YšгУс-Зилл ИSЫ2>yЄЩ•Ѕ)Ђd7Ї.4•—GœH­ЈЛœsGЕ„О п—жіцa'ШG=о/щэzЩhA‡sуПš,mЏGаr+уHTIВВуkf ы-@WЯw-§Sз5ŒbпuМlЭжЗ;]“xфЃaYŽœˆњHўј†–ЙхѓŠ„EБzz|{ћЫзW$:žЙ-K&Ž7ВЌА=+OSt'ЮKVќЉЮz%шfwŒ}цjœт€—оQŒ$2Е–Sd эРаьЭ/K^%ўe.тe†‘Н•Ц€H•Sњd@{Ufy‹cєЪ8JŠЎяrтчЉМ\ЬзЂfХ5rБ4U (GаЁ)ЂЈЖ%lЅd8`YЧЪђ—ћ5/ ћВ–Vшї$ЃxЧт$іcŸG„<Ї,т мђ5сŸ8–u>ѕ)шvXї]xШЭCЋnZрl3Чs]KsJ2TПЖЙщЭ‚AЅ™щZV-к`m=AжŒЏd˜/Юќ†eСЧЭŽФ]„ ІŽlMaЈЯГѕ|1[Pр,тУ>6Р‘ёЫЙф&u™Хa”Єif=!ьШj:лтьХ о„ХэVРŸy'ѕёѕѕызПМC# ~ёњvlŠ$Ž‚ гМ(`ЂeП›JњoхEФ\Ѓy=щ KцxUW$ iіеbфёDVœ>бСЦЩПз[U$[д`Щщ=pY#УО"Ћy(#паGNs?ŒJрOš(`ѕ ZкіQ/wФ3Q…šкxfЃыяж ЕГ a=бb|&jŒ]™эѓЊm‰jСс€Т‡D—О.іјИНN_бšqлАШыУ(Їˆёёz,C“ЂэА@}uиЧ6лml‹ВДЁЋТђ].3ЛlкkдПСќ†N†*ђP`zR/>9X”У.О+Ще‹Ÿ(EЕ=пbЬц(xwЇ…~}3›ЁАlђМhрށМсЃј№Iђ{Лd;”žдА&oњя“b'=Д™g;Ј 6ЉŽNЂJ}_јj…ё/pЗџЙ’E зЭpгzœф<&Б^јu(rFгё ъ*[Q4ЈЙŠШв;†zИПЇОŠ*qŠ NїЈњiЙе3б7lЯKЊaњЬImA}лжW˜эŽоб@ шлп]OШIDyЅњpЊ*/“Въ˜;@эЧдЭЈQјJt3Пкус МУiщ‰j&M‹r3‚Ђ%$ѕ>ЮСбIЄy$Е–Л4ИЭО! PJы?ќЧХrАюЂЂ@Qˆн б„`ђ8FHУpГЎш( <5{\ К…Ъ*яI2$Эtїф!uєe?ЉэЖˆŽ(‹HdЦбiШвЅ)pЌˆ>B­л}џћыХ–aX”˜Q!Щ“rј2Щ$ЂМ)$К|Л”ЁŠQyQfwЌЄ“УjуѕE@ ЛЩЕ4Yмn(т'EcмМІe†П5 uYЗУШ–ъЧяngѓеzЧ P›єukŸ_&ЅoдЫ›dmKп€рыQж‚](Š"P!?Вєw№ђЅl˜–*Ј№Є8)Jр)‘/’ЎУдЇ ЕXФ 7ЮВајЭппЭчГЧЇХfЛc•hœїФЄ‚Mі%Щi{лe™QБз=zЛгДЌЊ€й , ѓіјr8НŸХр”9p™є(bюѓиR$AXџxCБьnНx|М{мЪёˆ9яxЪ јy=™ѕЪ7! !oі‘е}G@ыї”FTU Ѕ%M/Ъл)Уан‘Ф бiьЇrПКІ,ЋP щ‰ыЫ„…,qЛэbЭх„ЂЩчƒтА“КќnяЁј0ў‹ЖвЉБЌа~‡г4ь УА7HЋ~вrАъeyйt_DЦбэОы‰h{лf*‹ЭauM)ŠV– 5o‰Ы‡g лІыˆ $дж ~эу0MTdЭI‹р=NCŠuœ8+"ЪˆБлaмЖLлOTЦю†Ж? оЁЫm‰4Š33WрД аУuМЈ к9АЖ(о1ѕ>‰уДьIЁЊВA№—gи––izqUІіfy‰•Ђл^XЁ‚ЬѓPEMcгдэЇХаЮZќ”pѓ’э@єLKзPy^sі§ё”ќˆш_Л~œеMЕЗглЙ ъІWџtЌB ŸN‡]Хaџ[и>нmЏ"2uG~ƒ;Б-,р ріуеZФ44иРУLIr ‘ˆrЌбkЩ ›‘шŸтž„ˆяз “= SЧ~Ч ї4'ущьsŸy&`7‰]> іOMiKЋ~=ЅМЎƒе'Dнж&Ђ&ѓъfr яHЊ)$@карVЂх—m[•@-ў`ЏЯE€†ВEА§п^Щ—Œj†-9Ы |ЧRЈЅˆмbEзнŠYпЎХžzзТoКЖ€в" тюѓVZ’”Кv<)ЛcЦь‡мцзœхэГ8№]з S  ЏЏ§$7LŠ їV‘иЯї3 Z‹MкІЬлинo5Ул7mЃ$ФTСй~ьЋ<Џбэ&І.ˆє§ |е”`ntzœ‰Єк“6ДaЛPњD‡э„%дЬЁЉЊ2ѕА{ђцГЎхQWа‰нБ,u§щ–тUшlпOР7ьињ~Z5-RЎи–Dюi-ЩŠЄgФiЬ$1У/Ш6cщдœ7t…™п^п.рkюОCl€Zя  `ѕ^ГьvХh–ЂЄж ln[уO+*Јє…EМЧ-8@ЉР>žiКI‰}НІєРщљJD]ЬА=ID2цšТfgjuљѓѕ§bёИ4+n Јuѕо6тDЩ"5_Щ&*Ј![cй†`L3Тk &КUEwіd>ЏђА?§ШЪЂ$[Х@dJЈз6ž*(dїXgf7Зw;rы‡' QQѕј}№нzгRѓšИОНY‹š]Qvrш!Ў“8ByzLбињo;т3u)ЈH™7рtaђ}9chV4 BHгІЂOdЩ‡БŽLa§Д e'ZЄЭУRP­щРqЈ3ЄIo9YЫšВ§|3cЇ~щЋ}% fiб;К‚…АыšЋј^йN+p:г`ЁЏfNŠ[“L>`ђ€фи“‹ъ›эоееp|р/6x=лЁ4ъР&hА]oМEEŒV!Wв dъфpЬ= Њхњ!ц$^‘o;зьњвxЩJЊІЉ3UЂ~Оb$I…Њ‡*Чm^ttzвУPczФ…ЃЌ(їЁgЊмbNЕ П:teфкц[VšƒФс§RPє7 ‰ё(ŠaЈŠGb&йǘeСН 9т0хЛІ……šrўЊ,vЗ[онЭfѓ/Xк2ЏIЯЭ`н,:жћРVX–ehN…MяaСы"іTUМФЗŸэЏц—w€ ююžhA†JДФб*'Мq$ŽbЃšf?ЅьЦhzuџАхXžS їКъЗYnˆ‘n<Uъ*,ђI(ŽЄ I‚=TяЋ:ŽљŽЦиv§D ГzZюxAlA:К~QRДш†Ќ4ФiЊ7И3GЙнzУ Ђdч$5€TиФ >тzŸв3Ъф™ЖчAˆиVQЙРC,ёЭЗКМƒЂ з1%z‹“4”7\LˆEзKš—Œ@LЄU–зАыЬWŽкrЂbЇ-6мСpFNрЃХ_EŠ7I№2‰ЋkСжa4( РгРyЃЯДцyAEОЃѓ4'™A  м5‹} DQƒˆ СІБѓsUS]њ ЯRА ѕЕХБоC(ѕЄ­ƒ'Ѕ|Р?uU‘э<\ПСsKЂУ“8Ž‚Зп3ІfU]э}S+шгдePAчdШіыІТиЗ{Я‹ ј$іЯб[ŠИ?Irp7uўШТŸўжonYGžk+ётК–ђVбет@Œu€n ЩYн6EœВЭщ>"Ё –vS-GЇ7…MK5{кбђђj"9Е›ќюЇопH@Ш@~V 1œh}зтV‚ЮПC„p#CIЏ2wЫї(ЧЎЋ2ФŠс%Ў†‰’Бagй7Rœ^ю–УJQ‹qјв#&1=Nи Y A0&Ё2…аVцs=№НЗU–“m3ЊIч(ѓQXХ3€ЭА]:ђё’…@Жcъ(,лмy†й~žSŒрЗ™%ёK[oZirЈаOXDуO7NоМЮvT$ „ћЙьИA’х%Вž|фЉ‡уoœnбы2лeюBњ˜ЫFб-Q”Ь >ЂгdИ-ЧiрДкфыє]S{чХ5€шЭo§Ф[žП%@dеІІў)ŠŽC"Џ›вцЙн‚цE‰g9ŽхЄУт€х‰4!‘2NОNОж4мwwК)АИYфHkЦє§И@HI^ Ую і2ZЇoKhL[э žлмoY^ —Ы”ѓ`РА˜>–~Ъ~уѓё-ЖЅ:вʘя:ЛЃШBšФKx‹)oI!>РФ&>9щ9 uG–ь„)UЧ<žЎž6лЭуеѕгNP"ј—‡чgBШћ% Ht ююtb@еpќх]N_PЧ­w`ІFЃ!’bФoђ)dT4EQVe$3лы.?ЯžюЎ>Џ9AM1ŒЇЎiџх7dдYшш>bсМын“іk \сkт< УЕТГLЇ­D–­k2Я‹3pšнн~ї§ЭŠZ>­A0А5Fўєq:мђ_п‘c№дz lРМCšјіЛ@HY{r>Œ'>Я“їгмх‘0эЪWнKcƒч?^ЎE‰Ѕ9QRМz˜ŽŽSdьУq(#KvЫйАB3€L NYрYяѕ™qТ8NsXg\,’ИШOSDГœПСЏОАAдМи•ъzЦЋ8„%)vж$пLиc uМюsЯўН|2Ї[^ZумaАщЭр‹iAcг€dŒifƒpЇzRйШчk˜›рДl†&0Г5/)ЊЊЉVLЈfi фУД`К №—"адvMIІ ,uфџН#L[7Œn#N=OГЂЄуRЇ§Ha1FћLуyNTэРиѕVTюоW˜)ЧщGюёЬDжсy,№x’Гн :@­nhxяžлHеЈ>OC—.-г>$ўNЂiЊbЬлnyYЧ Y`ЖdяIЂСУYœю=ŽЄseтШНл šщЦUW†@Ло=–ЇEaж pёc$'C$њ ЦS#Еž$pМ HaЙ „‡цЖТ‚D>Я_†№KфиЅWyjЕfeг lЖњўQS7‰J мU;’i‹{Ѕ!Ј­?œІŽЯ‡гЙUerдšxи}З\А’l…рu{:’= {C”сЯŠ“AноƒЈfзwР7œ яЪР–пzЌѕg вИ&}/laeYšр“˜š~8ўšѕаgŒяТфn;‡€ий‚—ЭДНТІЬs ­„Т!йC›КРСЗГлЛb:Iƒ“пяžЅcЧЙашК>\М‡@K,˜†!Ž'˜ыЬЭwзРWX–]\сЈИІйq{œ&il"ƒЯЯЏфюSЧд$fё0Ѓ5Ы8oъІџsТЈвZ*N2 гА2Е§ђ8…™їFю1V6П}˜­ё@ŸК§iAeёиV‹zВЬxb„zњiŸIцnЯБt™]=э4 ЄulПЇЙ4™i:|KXЯ—‹г'|5U–d3_Ha!+8’6hЄ)ЮŠ‰<ЗИž Аа’ШГ o”‡г3IїdŒтЇ qˆ+Ocп1•н­ї ьїЯз‹žы{ЎЩ=^]^}~˜Эžц Jeєd8Na}$Ї›ˆЉЋ/[h8AХЭf,Nх:нzNІh†i шW№ђŠЃ иŒG[=А†х:цМ‘€"сђюўђіўўўюњђгЭŒ–4]“UЇ˜B”@&в№BNžуЭЯбEqѕyЩqЬnЛй0ВYNШpšЌ9Оœђ§@кzC“Ž%<мѓšiq‹оЎ?п/9YфЉХУуZаl }ž› HљЦ)чОœM4 @Е,Жeq{§щсiОТ^ЭoIzЧP]wу‘”ЊОРl”— 9lP?\lEѕуюR КщLЮ з’$Š’цHюжМтPс4вa›ЌЮ’8іLY n~zXЃЫЊц{=’™0ЧЉИšФбУђТ8№CќИыDh`/ УЇ­зe9ЭBТ>L{ц]ю[NХJ"u7уШщИсfHБШhY“†"ыA‰Ѓ›Яmd*PH2GЫSыДjћэ9/ЉIДO` C“Ь%MS­{PТЙX H"фiнАƒ=™Б Иоћ†B3Њзр|о˜{ІЩnЭА§О™щџfŠх&x6GІЃщ‘эз/гмЩщЈžД* 8РžyМc ˜œ1тЉe0 MmЛdР™їБ ,љcј‹^„EnКgЂ з(У”N„k NЅ% ЬŽІж‹ЧЫЯЌЄšx9Фсдфкд2И'ЖцЫ+l‡Cщk"ØЯюДх~р8аYwФk6/˜aЩа)ђ,`ЃiР ]хЩ"Зл­Ў~јю†‚’h%vЏ ‰D№кцЎ.Я)ХЪЦМЂи…ж<ФОФО(§ж№ž‹iъЊ"IКŸ5у3Й……+2`+ЬO*2jас ВРQ—п§ўzУCщЗ’ЇgIJЧ†A iЙuПyyЇ{ЧР‰EЧ2}AДL–™ѕN0У}=лcx­щаfcш:`%яRŠМФЎюЏўxЕсDx@йw'ТP%,]XЮXХк/ПМО<7I ’ЈkНtќжtгД :l•FДn!Љ_№ІлБ‰mUVdеоwЄ(Ж{WS‘лЮя~МІ GaЭ:в#=ЛџАЂpЋ?Lзх^њІ" "Ж>Ђ€џй8МЌфoK4ХИzXЄзч*ДdgК§МУЦ9цiP’@Џf—з,xэ' xШmyGCШ0[ZTqЎGютљiЕ,ѓ.m§ЦdгВм0Nbп„ЂЈоОG€й††ИЅDМ_бє$‰єe`hЧl>_odY1§ДъFТ‹;Я`Ÿж,оP œO8рФ:ЧЃ-@ыŽi~№г$PЦ-Јљ>ŽУ вВЧіAj(днBбэЄ!-I№ЛŽ,UС+‰ТђѓJ”!pтКЧVЧx, }uЗMГБЎ-y+tuР_ЊІ}еŒ`Гy’DŒЧ!дфѕеЃb8РзЇЎзЁнc[7uwБƒтЈ:йi&†ќљAдM7ˆ!эзxќY@.‘x†cёЄљЋ<ІТш†_Ÿ:јЄШє‰ЉбwЂfЦ5RVьуŒŽсe=ъѓХgŠй-pах8†џщQгэ(‡­‡хx;ЇЉэnGНѕи№яlžК+ѓ %™в зTЉЏЈ@I‡уд„щђ8ђ]]‘жзп=l(–S<|ђхyŒ ўърSZUYфт‰ИЉђєnЗY-?wќж4иё9ЄS;мnŸu`™ Aq ыN-ыcWњ4T~~yё~~Zo)^K1O!…?мŠІэ#H}АIEHE­ПЂЫXЮƒТз%ŽWM/ЪъaЈSЯ6e|юБФФU_Ž}•‡КТ-Ў.ўзя>ноУ'!ш?–БИЄ4У є™khђќтп|и№Šц”вvОNп?P’†“˜ЄЁ›xPјЊ/+ъЖ5@eжЫ #™AšЅЁmєѕ %леѓZЬueKНОјДСВьДGћ2ь-™оi0ЧO‹ЏE„О…№Ћ:Э[@ЛKхж‹ЃB‰№aEйЇЃQ?сьзg|‹!mtšR н€Ьr˜.NЕ‘mhЫ0ЌЁ т yŽНuTњ4йБ]€‘PМчk^3N*ЬУ#EЙРš‚Иd~7ПКa IоП’ыГ€šCщјњђBб,јi 8†вОH#ВЭуэ’WƒЊФзЙ v~§Ч+wЊeЖЖд‹‹ы5ЫmŸ>у“sІ йpќ…0š.Ž#ВылŸ.dІѓ:f!ЄH›ы DкxљтHšвcЂѓдъсЇ?м№І›жЙЇЫќ7}Œ1­ СЩx ЏGф|Пќђzlѓиs!. хACf-HЏDытцігXЏL|и_ЇSѓЗMД­Ј@ВЇy9[ Я}НјgPРwtЏРжyQ`„”ЗS\м–ў&лv˜EžчxeЌ?р}T|{фѕ2Е­ыл ZЖUтЩ!NxVu<0Ддээ…`иЎmНuмјэ&AM‰ќ Œв;fо–ы˜Њ; kP5,V•ŠRT #№uл\“ЧЭЏёсп3ъŒmт%dъРzјкчзcЄчŸoж’ЂљХау™•Ў"kЏZоУбхУ_šћ‡LФчЇNрЈЁЂ#УЫП~ИИјўf+ЊVвЗ)”uE–p 2ЫSїНЃ3я2ŸцСАЂѕEжбФ_К:їјгХХ~?уєMтлЖyP7-ЯїчлП—§[c8’Г(–eyvЗТёх }њЂЌОИјсrХKVјzЧ1^lv›™пфIсПk+ zыХімђxШ!Cxм­xеˆšБoЊ|ŸІQш#џjЏўПлjН|М‚•6э§јвЄщ‹р/o‡&‹C‡‘џюi>Ь€T/Ÿnс7šжc›иЗ]Щ†–MAюа г"}юo_PўІэ8p*ќ†7CW‰eЁoМY.m]хwDўrѓЧwьоl[^’yкDУђCЯЖЩ‚JPШcпPЩј(#Bnўцщ4V<z ­јj‰мЕІлОѓ-иЩ[:TТз<= ‡=HаџКNџj[хзДЦ)и}ўŠуџСш_g e ‚_сэрЏl,ѓџЫg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlgћb;^б•Пёh-Х)вПдеNTУqlлq\зжўŠл”lyс$†Cћ[љХ6f„QДпЃ‚V‡О­ќхЕ{СЂ4‰‚ ОЃрzО§Oї[@Е‹ EЯPc­)їЁ§›{ПŸёб?IŠІŒЌе…Фi…ъ?Я]–мUЇ-|5Ї,г8Щ|“-tџќЎёУЭя'Yй Ч6дE3иWe9<ѓOКМг&­йGќplY0уЊ№ Эќуч› %ЂЦуБM§ Э›Ў5š5Kћ'јЭъŽkЋ‹‹љ†aYA`wМ•TЉ)Ўw}ѕхO]кF{TщЦCп ЄJШ+Ъ’8јі7о9УіaЕ–(нІруЭ2ъŒЁЙљщгнн_ўиЇ+к Ѓ$NˆвРxђPЯ(-і‘ћŸЩ DУbЯ`ж‚хЁцЏу…aZ”‘­/~џЛŸюЩŸ‚ѕОžѓ(Єjђ ф›"vЈ1м7]†bД№эbd)л^ YBXаfИ/ёЙŒў–ЖЮўќя?, qуг[рєZдT‰Їцѓ­Ј;AœDОјyс$ѕXEŽАкiж‡<мќйЮr#|ОeГPќЌAiтЊ*RпRљэѕяит#вКJ]\ту‘І!ѓы‡››йšеmЯ‘fWŒПћФц<ОŸѕ­Ў‘ЫŽWt‰%Ю'nP:ŠЯQщегнїпЭ5|pж6ФеO Ъ/›*ЛМ§tsџ;v3џќ e_xтьfЉиОчшп(B'ъšаЄюd?КФб№-fq§ДиЎooУJ јџдэOKJ!>Д}М_PЛхнЯЗVrвЎK њёfeИXіПў~мŠТvЩYQн„њтRђгЁO-ІvЋЧ#*тђž5§"ѕtUYнrІ›&(ЪСnYе4Ѕй+нѕ“fЌ}ˆЄ‡'еѓMцV_йgF7LgT7ыb“КмXA1дЁЦ.n~Иg ЧжЖїЌцЖ*Kм%Ј№-^…4|зcїЈњAб=?WьРХƒтAt(šЪ}ебPјгБV4’noЫГЯ;3Ќ†*дй‡ЫюEО‰дA™йЦА“ЖђtEё1§иу—zЧ—c[$ОC=*~рй(=№/У/еt“ФГeЩHњ:АХХlgХ-ф/“й*NšћђrЅЧЉЮ@вуk|њЅіLM,?oRœіЫч——Уа•Б/­7Œ§0‚ЂI_ыё+A3Јjѓиu‚rь3Я’7 б+‡&жU3mі6їФx™ЫэТћ7‚Ж‡јd'iњФЃŸДИD­аы<ЯЫ2/ЋФГDFs3дYE­иHхх Й%‹яоюvВЕуX'ž›4Ч!uбЫЯ}@Mї]q.8А№ђрН.•їUvŒЈ™^6М4!>ѓчњAВ•‘ьАžžЎя Sјeс0”dšЬHКW§qlђ}5М Љ)Q§r(C РЌЁoяytzˆm™gYіЋ<$Еоь$УrВCiЉ‚ Ы $4Ьq[Ы"ЊŠѕ>-лTйвŠЁkтNд 7LлgˆЄсˆNЫF2МЁвјуђ–‚ŸїиxЪќђцaЭвŸј–,Ло ЂД•Ћюц+ŠтMЫR—ŸQŽ”hЈ6M_Ль–WёЭС%%C”шaѓќLєrЧАѓУыaoSkAХП7L^OИќуУVвєїЫЯќ…­eCGй&ЮiћФ”ж—›еюџВїlrЙvѓgоњ­ЕoEQ$'‡Ю}sЮ9чаa†кo nS+{зіѓЬPкчЏAQŠ==шК(р…Т‘TM\нЏDгЯ'2Э~7ЄЪšR4ЄKz|иТCgЕЈСщn/C$нў€Q‰бL№Ю"-yѕKуŠїwЌjиŽЅПГЛ–mЖИ&ЋAПЏaџЭЖ8˜І†fxХjҘ:Œ•CЭYE7™šmfГсєdџђђЫзЏЯcгއ>вХЦбЗ†Ќ…УsЈ -/‰]S{пљЗŠу'iрyQЕ[eЧЖФЭ’•5]ц8+#єиc+ѓ…жЁШд‚УЩЧ2dгƒ$,ѓэ ‚•Ян вЊ)ЧxпБRМcGUгTШ‘дЇЎ&Aш<#™Жk2+)ю #GэВO”Ђъš"­РЂР@}==РRџэ+NЅ;О Бe:рUЦЁ)[Е=жEі#вWНѓМЃ'бpЂfьЧБШSЯжгЯrп2-?єm™•уIdњvС*`Gг ‹aтL…#Ѕk[рАRа@Sљћ'N€pYТ с+бћHь˜ 9н ЗdР8Ёœ—DYY ољ}*OІс—6B]”И­"7Шs`,dPЅЩюДкw ?№)К*>КHкDwmEХФЁ* ъ GmЖыйеэцMkНeDе„в&gHЊUn‹&€Јw?Б-—‡Л)wŽa)Š…ьњіп>nDи &䉇ЧуФ ЛЯLQГ-S4ЗH0Сr"ЗМП}XГ,CГoЩqwРjхuMqУ€вЈe“xІV§С'>o’!F*Omi†$QX§№яЗ RmjШ;гN>oкЯЧ!ѓlлДmHЙќbhBX‘ЃжЋ ЧPоRГ^ ЂЈaњЖЉВ€5ƒЖЏ 6„Э~ЂМŒ›шDbЄНV5IЂќгO3`Йƒъp$œ™ЯB№AДЏ”†ŽІ:i;Д F*U@eŽkО 4q’Ÿм‚є @Дьф„<Nџп“ѕv§0"'|šP'A’jЩтіУќt5лPœ !—иФК ж1NБhOр_yš ЈxN z€€y”6оbд”,.Rсq‹ŠO™0Aф‹'rа“ъ(=$КРЫVИš(,ўуунгb ВІy-Іф s€iз"ъ}™ЊъІ`Ž8єоБ4ƒŽepџwнўwђР)В")рdнЫмўФŒzœ јH4†ТV5'ђaw ќэwЌ pЬvљјИ‘‚ў8‘Њ’oš ›№*ЎІш^5"o[„–NcиГпšXн0‘бŽф Œ'цп‰м˜PЅ’"оHaЧБMƒ(U†bщѕх‡Ѕ(ЋЊ,‹Ь–гвнѓ„Ђ Ш6и#SУRлi‹tфЛ&Др›5?іп@ЖT ь~Ѕyе{ђSVцY^6FСbѕЎeйРэ iX FЮ]BЧМ›пЏ›Blp ж!Зu в? оАyУ†”ЊIдыы4tРРNTЭ0ЖэиDщ)ŒЗMІ14MбЋOцF9єт$ЛšXь4ТГ/ˆвz@M›‚=Ђ“ч!дŒGqqреЇGЂe"Т Д- XbРuК"Вœ шІзЌwкŠ№R{чЖШq ННљpЛ$рї0ЊСчч=2Oƒu•ŽЎЋ С`№QЦ№ВЏj№6„iиЏO_$л Гўј‚ЩБM ObБ„ЗYЮ” лЫt шѓˆАzЁAчиљЧЫ90јр. м˜8=ŒA#„ЇРЄ>=ЊАЬ–u7 к€›в$ЊR_]6Haля0q!%”Ww ДŸyрЈЂ”уѓ0хaшŠ(ЬIАžЏ‹"{uНк0` f8Vазqz4™Ун>ЉNTdБяК^п:їЕoАU‘Мс q)vPіђЖNн.%н ‹І‚Є%. ИИ=lЖ&0ЮUхR[’и›Л ў#ƒЯЫ‰сХпш…Ч}ыЫѓ{йv}‚'ђow5v›ЙІЉвыЯžзЊe{ХйX…Ав——” иqˆ‰Z&ї J#WАЌй1dБ][…ВФннQЌ(9Кя<Ž‹ё„bїИњHпог†ЁKЬrЕІРŽTŒ ,ЉiАVцXЪЋљBд №†ї]jkќvўАЄСˆ‡у)Ж ѓРЂw%’bGE ?7‚={ж!ka‡<вU Бфˆ,щ'oSЙтzБЅЖ‹‡Л‡љr1_Ар‹ž„Yи`OЏ/4mdнrВ=fK„cвжE№ф4тсыЅytMjА%_’ј№Д 8еŸ?жŽ4љ А3[f–7ŸЏVЌt=[K†ЅђЮuьZцЋ•Ои štHfŒдo˜ДњЎЅЋVE`Ча‘lЖƒЕn|Џ"ВrЗme {§До0Ђ]“зЁжАzёЊt™kHлxkЧС"гцn –mXq оМ‰пВв`ж"@ˆ.i’цe]ч„qЫР•ЦЅFоeь|Х•ЃYAqKАJCр7KЩ_‘YЉЋ’ЙLG4$мјН};†ЊYn aвт~U4"HЯЄ`z•К/P[Š–Œlз|t CјжН~BvАвЄaГЯMaKёВWBNЎ‹ьЭ%-+†VЈžo˜^Й;€ЮЈ/б|@/cЫ'<™ФГta~wџpЗШя]јЏ$ЊQLBвnG§щ2НZ# ‚6ШŸвS6;LJƒЮCщH-jсДв`”ЄiCМЁ.ƒmУіd#ŒУx‚ДИрыžє!‹›ЯŸdШ5`‡ŽѓЊf 9ˆМАРƒCCœ}ОžгМ (fаьІŸNLТ СЦ•XVВГ\ž#Iл9#ЉAZbгЃ-‰Šп‘xИ#ž}<Ёj’ї`Й›V ‰Z\пq€™вЖ mћU+ ~#L‹jиЗБc*‹ћ'ЋŠЂAЂ aиˆё•n[XЯкWСЂўOъПa!fшv1Ž…%‰*š**ŒGY=Љ§ „>ЊC иїV<[ЉХ’S HНПЮ{шШ БЂBџЃ0ЂхAИ% A‹›x/дЙkˆвM‚dБ%,{И†Ьoжр&9шћТQd=!Ю’иР9yž+c nхе6jЕх5гї_ЉД цЦ!pUDЩr§@ћІnћЩчЂmРюњЖМ:7О"Ы’АО_n)NєКОpuЭЪб2zdМnЊL{Ё*ЂУB$,ьШ0tvі@Ћцk‰ФжШqbЋаe–•MКXп:`qГ.АМ‡jŒ№x[ДX*,іН:„~ћps7ov]юК[‘’Yл“ЫkŠ4ђIOlxЄsМnР˜ќ Mфе<я4фсєzЕœ=n5зѓУИ№Бт“ФиE81тЊлЖфбv•ХQдќъj €IPгЎ…0Ђ3:4c4 м}XЊРВ CQА[LЫѕЂМ†Зv`пшяСЉIiЖыњaжЁqДExF Dxqнх№‚‘† K/я@eQЖЫОЭл‰;TLj ћK—К*Kбœ(ЫWРђ ™˜›U%ВFљі ‹љŠ^пп­%Ж™Ÿ#jш›<є,Аndэа}t№uјAk]žцш-ЭKѓˆ!Ё–ФйчŒŸWœГaиА<рКejKЋјљ ъыЃ8‡]–Ц-з!ттАJ#3OŸ%нФv&пw=ЧuоКаF„ІA эp$"6Tћ ƒИвІBКжњр/ШnЈ‹Ь|‹чтx™ЕЄCђxœ0гсд™wъ‰еUa}{Kƒ}Ф`д1–япкДvу0kЦгž)ЫуїДдИr‡ЉБЁяШ c9AwL‘нP"љŽб§Hк Б#ЁЫЌѓтнПЅhИiƒж›q5ŠsЬЕїЯЄIєљ›ЯиDЩя" AНћPцжKаZEa=ƒ| –Кl›юNЈю@z NЮЂy“zЈДА~œs†7Hќўf'}ЁGaбж5v!‘Ї;’~ Œƒ;вŽ@BфЉ rпЙтіюfЮ№xќљtПCбœ0o R9LJя5+ДМf*"ѕtћФшNP7БѓІVIŒ$Ъd›яАтП[,rл&Ж29ОIщ]уJЫŸ?^-ŽуVзЗNРL.ЛЩ7ю‰}ю­щ›лРд$~yїхj-›^бЄЮвУoЂEQZ7m™Хa”ЄiŠc Ш“Мй‘4 мŠј@iњѓŸVыЭњђУ-Jѓ З‰•šгF${›еŸЯЈљ8К"nЏ~Оу +.3Я~{џД†QYцЁcb[Жыљ~јАYL+j'г${‘дѕі}ЈШыЇХ–aњсу-Э "ЯБЌ`dSм'iтˆН*шп_№#ЅojКDЏož$pеЉkПэЛA<€Lm№ @Cn№Q’ лљЩ<‡)СьЖАu B ќ’˜Л›едZГeeЏ?ѕюсv$s‡`Йwd+ЎmшђіnІ@ndН­щj"”mŠѓ›ылЇхšЂ^%Ёpља*Щ^Ф"?fЏрТlлТЮbI\нмУЫЉѕlЩ*^wкЊSNТјѓaj[щ*<4sa>Ќг4оС{€U+*DЌO_ЎО|љrysїHсБ0ЯЩvEі?1 'cцTcЙ(іMIм^}ИМ|xœmЩљyбyJlџЖАпЂŒ[ЇoVŠўЎїs6ЬfqћИ dУrУ0#ь;нK &mzєu™Ї‘ЅHлЋўzѕ0лВ‚bfЛaj?шI%Ќл‘&ЌуОЋђ,+*pKehлђŽ’y?•y Iй%A5lзЯБ§š•Оэ1k"y6„ыОN.dis§щ~Уp’Ђa;%TC цcйŽ—ѕh/Ч.qaKЛAœ$Ё§Юc6Š n#ашc§ HЌнЂ ы+lŸŸ ђЎ]ъ2IXоЮ8ьhб­А"gти@ы>YбJсЛС}єЉЋK<< л6Uё}Џ#bOyŽƒ%ЊКСгŠ2M*lЁ‚]TФqZtЛёTУm,pr!‘КНоH v§'iQBЬŸЖЁБГЙш–ћуЫЫa_ІТ­V /Šдт]oa ЄщЛšк лЊќЎЏВ!6)†ТЪW–Ь34Еš=н~МІ%й№ІУЅгeœWЃ‹‹ЫЕцуuЎуqW@Вѕ]Ц H–•РюŠvЪZˆ5(=іЪ–Eб SiЋёYфшљечџrЕ nЧ“љь^к" pѕОчхы/Р ŒŸ{юМibя*D'СыAф’ n,Œи„чКф*T—šXjі№ѓ_>?P‚€ннx8UіCWиXмђF4л\kŠыљšсйїž‡Ѕы:l†оаЊ—њyљJ:Иёв˜uZК4ФёѕuhЈВ,0єгЯŸЎфЈ(ЧђєЄ5ИМ2ВtњzЋ9Хўљ—Џ_ћРiNжMЫzѕ!м?IзT‘cзГGМœ`W§З …›xPdЛ$u„ОMMU! вЗ_nW dŒŠW…aЁћ“@Cч.dУo_ПОьsˆсx%ТчїОюCбM'*Зœ­XYГ§И:рѕМ—cŸћžЯЪV9•>њТ7@kIbŸnfŒHDЕѓЉ|ps„xъњ–QЭxФюѕЁ*r№JUцяJ+€MЫдШmж#ШКWсН•C“€Ÿ•Œш^MJцЛБŽ00ђэгqнp2ФоАв•gˆ`0Зž-hYѓМArФмВorШЫпX ћ‘ШИZlM N1: „kžХL^кђ—&ѓLXjr˜%ЌГnyQ .ЌПѓ ~ЙІYŽЅQеMПЩх3ьГїzМџ  I7m7L"ЁЃЖ— ћч]dШєb%(†Ÿ6ЛЉfГыШ5p~ћpСaзІ[фкQnjѓы9ЩŒщBLХЪі$pЩ•ѕ; 7крј† 0MвЌ,@ЩчЮUјљхLбэЄ>еЋaЕБMтž*м_<‚%~A|ј~uўчOДl8V lжьЪ$tЈ<Г§>#`DгŠ[М6дbˆ'нИš№јѓ#€(ЬIЮJЎCnfыЈєs„xQK’ёСгЖљ,т=$ШиЪ ђЭ* =[љ§1ЄX]‘эў@šИ№›л'I3ClО#Шў™DIœЎC_^ќљžт$еЩ:Rmˆ ючKoнfQ!И9s vћЮ—Х+ №ZhІŸc‡Ъса„І&nц nD€*)УїC“Тњ­П\ќљjЭpЂžsяФаo$г B<ˆС[Яђy†љЎЃ.L+H,…Ѕ;Шы~Зo"лPљЭ|И5,ц˜s›ФTљй—‹џіiЖЂс/kR|/,k§yЃ›˜*’(`њKo7пkТЮItлѓ-i=чTдnЧ6ѕ№ЦвrЖtПУ[еМыtЋШ2фЭЭХП}z\ёŠŽЗ€mаŸяEУд!=†L–Ѓ6H"пwаФ?ˆ`уT-fЕхDя›Еyh›?Л|ba5!NLУGіЄЗQgО^а’jІ1œоз…ЛЋ9ЇщšхzgB’РЄПЏy\ЈЖуX*ЌХсХŽ2ХrˆpѓёяюУ"уmv<„Љ,`yёeСг Zp5 ѕ>Гzў8ЇУ— 4.]‹пYkЭБm[с6‹5ЃXac"ВњrG)H<%зœіиJlЂвqЏ–“jі‘”РИэr+‚aGU D0I§оcмLQЉ‹ыХšзœяZm Фbћуt‡ ќиЕЄKѓ Q…ЬЅкŠЛ/ћ:!:>мS’fчe!еПїdYХк†k-рМ9ys§ B˜і“в`рёђиƒд§ё=x9ьЩYЧѓзчУиb}MŸ}ИоJzВБХє§ЧыќЃˆгZsЫ‹%+ˆќњ˜dUГ;fиТЖ-]en.dіђэПОтпЕьC^|ОнЪn а qЬћN|љчТh–эX 8ЊЧ5Еyјљr+ыЖыa>тЌШEBD2ћє ”6м(kHA–ѓЫsЃkђцaЦaƒVŽу{ћŽ_еVР0AщЋѕтіzЦтpнЩсœрQZxŠЯ.>§s2d“$h_Б.адцщЫ‡g…ЇIПч^n‡"МЃ­Џ/$гмђ]ЦЭ§Ÿ|ЄNр*\MвМ6ьŽ/_CCЄ[_Ьeфљ|XWл‰šОЫњƒяєЗ]i­ˆЖmсљ‘ge…АUžfЭўыsŸy–AуzЃn> ћUЫ2urЌђ;EўUkЧЭ(x]3Hенp‹§ѓ˜:К:}МgU3щкр8Š%Ž;t^yёцН}ж†/Іb™2Ы)nyиeЖ&Ь..ўњq­hQзF *’Ра8ѓlљ ЌпOЖи‰Ѓ9А b&уЁttщщттУч­ЂFУЧ>-CСЄхœџ[йBPфHї’tЧ№4ќсwb6 5ЅРї–@џЃЕ§ЛЌHAЁ`9t“ Œfњ5о!ƒЅ˜€Ѕф?œ$рE6ё&Tlc›к\„ФЅ,ёrZ…aІЉ§ ­ѓЏВ…0Ю|Ѓнoшx ]iFUА{щ_p/Fс@6‹ЭЗ+Y3ЧдФя\'xЛрA)и|u{БVёv њ§3Њ7ЫFжuЭр кјЏ 4Шп-WФыі &ЏNјзм{g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,gљџUX^’хџ—‡.№ЖЙЙgу€YзўgwQ7œj™dŠРpыњŸ cHА›ЇI–чq„,ІџЫ+жВэХIтт‹uлжПї’џ„hQœцuздUгїM•…Žљ?нЎо(ІЅeйœ%Ёџ/pЧ–Зќ$ЩŠиѕ’™F]лњ­aгv”ЄE3ДБ­š^ ЪЛрe.ŠŸѓœW№"ЗНЂє-Eб”_яL^_\(Q–M7єu ЪзUъ‰OŒЄќTўA$CЧY‹е–СЉ‰<Эъa™zкђi9ћtzЭ—KД$ˆ(ъ–Ь‘oђPzœЋHa№#›џ…‚ eщ› ZЧП†хiкмЧ>|љІєеэЅY8Ик“В†.ѓеймт, нп{‚ЈлžчШ кєТ)ЪТ0NГ$pŒйŸџєгуšž<лѕBвtEтhŠ•-?*Ъѓ Xiцїл“Kнё“аV—”›ЖьЏ4УЧmдьѓ?.qHЉЉЁл[*ŽялІМНљёуЭŒ–t}јiуЇУЎ M~v!§Žзo)лѓасЅ h3зВlМ~/ЌfГљнЯз‚эD‘­сУgаžЃЎongѓљќёіюўA№Š]Ÿк23_ЋŽѓЛЭr =ЏЌ}c}Џѕ˜šУI’А}zм№"uџ лa#Y7†–eьЛ–ЬrВЬ<ќˆ#вьИлUЉа3ЪpўiаwсDfЙеНВ еЅш—ЛЦ“щѕтёњђ‰гLCš=ЉnQ'В”RiS"БЕcлžko?­-зKл§PјŽ%ЬЖ’`гля<ždЁ†!l3iѓАї]эqЩ–ј3ћА’FŠЂmЊКЫл,яНoшўћШ‚цЮwwЏY6(Эђ“! •qNdfœнз%‰ыЁt5auљѓЕ`КžAXї‹дЕt –)ёЪЅ’\Я га“ю%?ЎЧУqhвРU[Ы1ƒђw#ŒiСŒQд§Кpєе5k'нXFŽКОeM?‹Ы:IъЂЋ,c‚'єU 6ћрќЉ/.4П@=†i„пЉ СЅllы<эИџzl5гŽŠи'КД]фшыбK‡}—yЊ КEjы9ЬlРЎГŒa%C_х(=”ѕCъя ­дЧуЁ‡ЄžћкR‚7р'Yр3Хуў‹Бдˆ”]ƒ>ЫaЌGc3ЌБЋKœМЏ=yНЕѓФ2,Ыаз ХŒ†Б­“ HлC‘‡#ьN‡.KЫ:Ѓe'HЋЎG!f§{ЅGбДƒМпOиV[ЋчОЃВВQwŠМі•-эєДrU мCй<ЩfдC_ІY=›HПg­l:t‰э‘яŠ е šУд&(Q}І@и6`:Iw8ДY’Ѕi :єLž3§­F šк7ŒАЮ йА‰ІьxнJzьUз#v#V6zXіЅ-`œ1VЗ’э7Ч)uz}З†n’aх4Сл7mВ^xЖАRœ Єrpћ}—ЧYгЊl8–*яTтФЊн усtjCMДвсyL,f)ЊŠ№pЭП<є!йеwicЃшФ­ЦH—З[ŽунВЬэѕ“ в (ˆ9ЂHsiЩŠщEиШФДМl ]+OЯCL П9<БЙ\ˆ(ыћДPќќаyЪнЇ›%ГхОG[жЇѕ–—ДИЫl…ЙўђИ\2’ЊАwЗkХСNЈж6РК‹4IЕ€ Kњ&qРіы/$”Дл?ї‘ОоbџS\ђ^vh\щњ++р0on5bLžeDПыBЂ<^nvЕЦА ГгьИЅ}рСГ "ЪКš*sЛйqœDвёљєђћЫqЌ‹vП?ЕЦЉ0w€yМ•zOaЗКi{Ўпиf‰Ш*šdФу!wЩnЅZ†МЙ[*фЉnNeh†Љ dQ5<ЯPvїkA’P[Љ9žА§п3њ9дО&ЯГиеTЏ>Mбt`ыi@оКзЗŒ2оAрЧЭсиE–Фпs•еFƒ„ІВ=ъPнxyQ#О qЅКЁУІуёјђoиж;љVžЊY~о`*Њ§щи&~T€Q\bОmƒХхEUU§~ьЊаVE3Ъb[tјЗ”cTl†!бDVІЃЪ›f u“ў€ўё‚ЭъO‡ ЛІe@ІЁАзњahкОG g‡М1oфt@і‚T…а”uT$ЮWд˜ъ=ŽЕ++ЊnУ:T6єНMZ€m0ЭППаФMфњyzAЏЪpэQ‡ТN S­Нqш[]*Ц>0Б^ ю €˜]]UпЦŽхUГФYсh0ПЎoЊвzЋšaй Аїt8вžЇ0ЯЇгT—эˆн"щМ}[eYeUEŽ%МaгяЭnswЕ­hhl•c9Y$УЯк‰jї4eYб7 e`тЎЁJ+˜щ ЋБ'ј Cо Э€Љz7>m№†RГAЙФ`оЌЭ+J^нГІWwЮмЌ4bJ"DЕЗіhљD;Sж‘k;~фъ*wПеБћ_ZсДО<ПќяхЌЦN‘'Њібц@пžА€kqЫoФбw№сžkpЌbЅMbKk•j•ИQ=ЭъDћ#еšхУпаиыЕЎiŠbzyw“џ OœцqЄ СCЂJ<Лкl6л­hКŸрXo‚BЊхц%‰(шA^Л3€‹YFtнPЬщЕ(еВЮВ4€DtuУЫ"Зх'Сшћ}юšќL;>ckў*4љYзfѕФJЛЕ`xў(œСXšФЏ>‡š$“rq2ррѓuнN{T§љwбvˆU‘EАon9 Л‚ЈšAsЃС7а1Р=іjfзБЃ№ЊmS&žyМZяt'Ю›4ˆЃэ0ыІ:0ШОМ‡ŒриІ t[эSСЁR›ВHLhЋЊ™Ы qГџcRЃЧ*‰’4rТК> ьЄ­ RФЇ2ЕЩ[d˜+С0 4SлКNМтю;cCоSЌьUВoЄВZ§0дЈF4;ОЛa%9 i№Ў$†wќЧ%№ѕ ЪЋ˜cŠ ™ l3ч-tй€Ю мN4’§q€еюFNћОoJpsеHgyФ=Ntзд-8u^ФІЖ{ U-xТHнтхUЋ0|tž)@дTLлOЊmЇqbџфЎ№ЩЙкЬ06œРmwŠ•C\нїuеaы фi`щ$R2 T1Н-ђЂЊ›К,#l-шРЯыžЪdi—ч9и €W$0’эaO\Њ?NЫРЈЃ Yж2ЯюњЦЈЈЉDќЌЃњЏ{”ГнЉ ей‚=zж'ЪЃ8+ыЖЉЪPW™лЊЁЦЮЋ6а‰z†i€H1DPIѓТМf…tx;MззEbПШГлDЪл—m?vuгЯšcюш’Œ•i€ЄГд+ќ Ј-L!iфШћЪPщёМХЉ~ЭѓTŸ}ю”zIQIтOэ+ˆ“РЏŸпBЋD) ™ОЩBЯMFTСj€ШЫ:§œ žЃш~(C/LR˜D†ŠВњu!)CЈкмйžŠпЉdi^Ж}Ав ŠqŸ›ŠjŒ}’И;~,5тУаd чѕ'ж-ШЖхЈЪ‹Sя(Ђ(Ž\SE]tQИ§с+ СŽŠvšхG0#ЮТІ‡У˜š,gк@$D3lІвRAVevysћхгУ™IqЉ[NVWЄИЏЙ-U‰€аЇžЇY›}x}•fБЃI"ЧЫтЎџз/<ОŒЪъМТКY]–rхЖЪžуfCТŽvых§х§т‰=7|(–%‘c(Ь“@"№†ОРžњ†_ігещQ9ѓtqЗлВœ JЫџ§у=Џъ(Ч”T#•A­ЯYгэp з„шo[КjEЭXDWeQVј L§ll@K. ђМцW{€ ‘m4Бs"DэЛi„Е_f@и-/ЊргьO?\mQ$д XтЁJЌGъ\рр!c“;ХО N—ЗH}‹˜І!ГЩДЯЅ]№3LК@Аџѕˆћ~˜6ћу~|ЭƒрјOWE†Дe8Хк(3?џєu~ЊiКiѓDхIKOџX›л6Ж4ЭKЌ™`Š%†АLћ<кЕA%nА˜—TеРѕSWзm‡тсћWЁїк=N}хkтŽSmзЯ^ќєё{%Z–To@wЖ…–ЪЪMЏšЮP`ЭAКМŸ:д™V<8y†ЭЌj(#Ё^{EЅ7P_э4џo–=ЦFУJєuYд=_DКўєуН(‰’$№;Nv{*эќ|ЂтшЋшz<І ВЊ 2тЯылфqџУюњџп@i:пЕ-ЫŠЅgЇ§щUњuІ†з…ˆ–З‰cZ!Dрѕrqѕг рИ†ІЊВjЦ#]ˆTH{п—ИU>‹tMCсЂk'Є_/%Ы=ЧЉїш+ €U7б$Іђ,бCzдRв:ŒЏVcWB‚‹vГ^нџњѓ#$rНу%-Fj^BXеcѓЊщi€o}Cф!MW2Ђl7<ЄQч В№HuТЇ9[&h;. ЂІišВ@—І> ˜KЄЃGloўvЕ“5'ЉЊX*Ыu@IфЦ€ы8~ ˜ќ 0!pъCыЫрk`єЗУSХЧѓqhA€ы мG†мDа=№ЦАЄBу#эљHлф.„GA\џђЫ§NPZфыЋМшЉД:,о.4q™(†ЂЉ}Яо€OO•ЅŠЂf9И)љэєEs‚rDƒnЊС‹6u]цw[†…"Z№k=pžQчБeWЧTЗŒ§ѕ‡/+N4 јŽ&іЏ<œ&ЂGx,aѓјАС‚f›‰BЧ1'Њ(AXЗБВђЭUнAїиЁЌЂВЬNЄЙ—лм^нmPMЫŽ`/КF=ыХve‚*ЧьoЛЃlлШв5’LЧ=ѕДЉKaёнўєqg Hхaz•Ш>ІЬ‹Дa51ОR+. †д pFXнnрэљОgщлЛЫGh-Ю4ŽБЯB@АjЈ7Љ'‹л/П\­x™cŸ:КЌ ъэbюœі@OЌэЧOœсцЈО^7m‡№ЄѓdŽY‘Ѕ3Р k"я‡;(NLЄХх’zО D_ьЄЅH \y+ыa)€љ’„*q_?мтžr5ЕЁЅЩ’žЯYЄђф™-о^rи}=7цŠў”@”„ ЉœГГP/n€_WŠEъыЫI'~\ЖP?…еOЅЏ;˜№Т€LЏЃюdзUБ*ѓ_НлЪš[uьЈВl˜ŠfЩвqпкцš%Ж‡RІЊ"†mї}т†4 jHпž]4ˆmYЇЏB[Y]]R%n7kФЖУ4ЋŒƒйуTY•TЭtR`‰ §сa'Љn3vE„Ф. џ sІ;ГЄЭо^ЗнlXNГ‚jЉ,vфйіЊ Ђm9a=^žmтZ?\/ж[„>вw=tшЯ]Yш ћeгФЊ$\§§žЯЪ0ч$UБІ|ƒэ€”T€4ЛЭђёaБ\-ŸЖБГžj'XЉ>ЃњЁтФэсє;jДx.d*žrsЏйЯєдhZюpФёЂъб‘" ЗО.РъА…'kЊ<ЧЭ9DГ4Dюї bєэ§еэ#B@к­V<’ЦrРvьZжЗЧ аWЗ!Фˆ—!`{Q8б*iЄы)эі?љˆЧlyй)š:P$ўюjБb8йkkWYІfњ9кРК…lžЖ.А$лЖ‰pЫUЖТz@1#rFѕtЭ+$fБыЊЎrЊ^&IvНЇоŒ>MюЛм’wЋdguэ)2sЗ'›)эФЇіjZыƒбuЊєeтй„И!PK`Уллл%ƒJ‹ dњаЖОйшХrУkN=фРА‰хQшaKвМn?gСЁЇйfМrцaЭIn^WŽ$­oЗHЖ’vш2KW†Рsід7РЇшџ‡ЎЬѓМФУž(Щ?\~љИPLX]ќЭI@$}эjмfўjЈGeˆО%[oРФбЙЎli§И'.ЊŒомoUЈ8ѕvYѕh<нŒНћaЂ+bъщЛ‚XУЄл sћЫЧ†{;Йkyй™МЭ‰ћ!6•ХЇ+xї"Яё"‚ЄХАЇў‰БmлŠЎС:,]XнЩКЄэPк2ЯC–91BHГњзз4Џ d=MјŽ!?]о4 Ыя7Э™ФѕШдЅkЪW –—UEбPгЗаЦз prwпЇК,IЊ6]“G†"Є‚дod`Д*)ю 3˜†i^шV]‹џQžІ—{Z šхЧо7жжЗІхњYUч>бvkHЎaœUMзеЈЁ…є~*~n— Б$Љк&Сƒвf-Т‹‘‚.М%Ј‚и—lƒrW{jl‡ЇOK№ьЊ…Ÿ1ЦЕ”енZИэ|cv1ёТVИЪБР‚%ж№дI[хi^гщТЯэ(LЊ|ƒЏnл‚H0чТтњ‰нёrа`сOдt]\-`Сn0ziИЖСЯ/Ћ! *Ћ[АšXпxЪтІ…С‚_Џ$л гЊєƒ `Х3b?[ ўб$x$ xXЎфцV—`4/™)Šк*’‘cЭТ]Д№CSаcd.б„-ЏxЋ:vu–СЪЩЗй|qБ>Н[?онn йQGeаQRй@зЭX h‹Хх& <РRM[иТ–Y|њИтIёъ&2Ж™31o^ZnЧ+nšDОejšUЬЩш-Ѕ=Ђа"Kт8I№T0|_#тk"Vxп|FyybОЩоЌ Рќ-]џuxњ ІGS9zGпИЧ‰€ћу"3ПV€Б;р : [z2‹ŒN…ZњЖ.ЫВЦ]š `M™СЂђ$ p­ožhц7MW[.d;nАДбеEьл›GйЎEё,+š:H/;ш-"ѓЫbю„€Kн†х€)Ќ=Ю)7LБJвїЏ;Dn—хЁЇ?}yиЊФјіУрŒщЄ/BWуuј\м"Ь№}ox;*њзrX?Ь(ЈЏl‘нŠЂbj‚Р>>'PУўЯЈZ=ъеЃНш$3™Amџъc–п‘Ў?пoЮZ…‚хBфE БЌЩ!<ЛЎЅ2[@Х8Пl\W3!hBл"аDy\nЗ‚Є:MH{j5e.XmЂrštaЮ\b P`h‹а3Я/-8PWфy–Ж ЌZф6+(F3МюєЏѕi@N™ХГ[7OdaдŒсxАN'жбћЙ2ƒ–‰ї3|YcёlЄ'”ѕѓКщNщТ5MZё…LРэ8Э‹вz ‘`x­іRTнђn VRXˆ‹[pk+-ГМІpЋ3Г…џщМУхXСBldw%ўѓŒA<Ў2ѓщіaУ+є‚‚iyQ’U§>M§LЩСш.7љэ!RжХš—Э8Њ6s +LЏejrп–9МE0 юSW1DГї€I!ћсЗ%№Ђo—•M7бRѓ\Х@Ю йЎd0rВФ3ї; V=ТИ9л:щЦyу•ш№уŽ#ЂZБчІж‚86o}Tl@i–g€єZЮ•uјшуi)€ЃaЋєєi]и‡ХNR4Eи.YйЎбhД™~#№ЈЧЈq’ёшзК:ОxюБd3lюn 6Cръ(BЃ€юмвљТђмМСE_whhІeЋќvѕИDaїєщЗ•dU`вq>2Dну|Бхk4?Ž4лŒ)ТXgF™ш"УnLJњбцi>бmЖЙІ8аЈ‹єЃ.’(Œ<пnюnжьfuџхž“Нv.чт*Чн˜'џцЗ‚œЉ<рбР>у­WЌbЛž&БFDп$fq#Іћљ@Kt zcћa nъЉќŽЙП^1,ЄFAжc|^њ^pKх0Gt №cЯ8 ЋXDШ‹g}СhЯ!\ьчEWн'šш‘„чгыzDф™хЖ“z2П[-зЄGEV4bн‡ПдЃа;}lЙa-&ž! ŠfІŽ €ЧйFЏ!jХEKOeb}ЋЌšwЂі8eѓЁš?bпд‡Њ(ЊјšА[m€йЪнU'яЧЙrŽи~љГ!‘—БkŠOї,Ќ^bhxЭuœsƒž ŽVЖЦІJљFхxФyzЌmЧѓОўиХИ7.ЪФ'8NRTOУЖxђ†Z9Ню:б€y8 є4*x/П>J:Бmл0tXЦgŸsЂИРL2ЖяЫВœ я_ƒ№ЖюЇWHVчІЬГœ XDфY@|ЊщљaжМ†4ќ. {tAЬ…ЇˆЁђЗзœaнwЩšњЙqzыEq…yŒn]лŽ ДЋС{ sФыыЂ™цƒ5JKY†uSv,t+Ъ р;єфнo9№јёМЫrЄ;эXчSжWO žїŒPЁїl~ШћQм`Ѓ-в(ŽqїЌŸшђGЋё^=ю_с=`W[™ѕт…Œљ\RItБ вto25Уv_ЇвщўzgZN ‘УБЯNу –Rў‰ѕ0QЯgi Ѓ)№мѓЖ-ЬДА˜")ЗešjnRvу&g‡˜!=„AЛрфP[y”‰“ PsmОбЕ§+6Ѓ1ЯЧр~NжžЫ~;cъЬЙЛЫN~§Q1ƒЌъКзu8Џ>0›ю9Sœз—Р8‰ЁАW7qг*vЯŸш PRVЃ…4<гMюУдбХHг8=ЃF7@‡T—6зПн0;Ž[нм-vR‰Ÿ4јз,с|Пe жяћ мУд$цъŠ5н }ўQB>ˆ“ІЃE;Z'Є4 HJƒЩ†fЦУыж&ђФW_~ўpѓИX|ўx}ЯђМф1|=cMŸёѕ/тcЃžКІтхмOKЭ ѓФБЮП+МѓТЈь`НЅIV”eе6/вђMПџУтЅ0И;—2ѓхяŸяŸНМлpЯ \Цз( љЉ…їFљE}‡!СŠ;їtћсo7ŠхDmНСљX; в"=лjFIЧу˜†ƒчfЃ_K`ti)тjБсpCџц ŒІУ‹ЊзўHѕ#ЫvšoFсН0Z“$~љxѕї“РЂ|ƒ™@Ёv5Qв ‚›њЎ.Ш иФЙњƒZcШkc§tзU‘зW_С?`Ўe’Яg/&КбUwtEгѓ…Ї}ZКЎˆ]нмp†э|c1§? ЫuЂЌŸАаXB\ёФсE!КўЛašях`Й#оm1‰Нўћзх†aЗBrФќДм€ЅКtiбљ›,Ž№”ovѕпцN ЫЇлЯ0О\о?==mо2С№К#оЏЉ!yLЏ+ ї2ъВ(вoінќ№ух§уf)І˜шWБш‡[KуєЧ9=МбaY=ѕ"^]0ђлjЈ?=^_?nЖМJˆЉˆ = 1TiR —™sЅ.€хCŸЈ2{їѓO—+Ь‹nƒЧс†ЖHвМШŠЊ›№l2MЉmнT –&ѓˆёЦЊфЌŒЧ<№\ŠуzЎЅЋК[CфэR7нцSTЌ‡ТРЃiЊ,nn>]ЏwМ$+fфжр|šСЖ-/ыpЊOxЌ&‰augxАС"o{ЇY&иCЧs§ LВФЗMгЮ xLM`К7<‹ш‡ЮS$ ШŠЛЛЫ›­цыXA wшJ˜LxоFдa–:œІ2tmBАPiыЪ›ЮДlЙШЂŠo5е9|Ž›txГ - xХ™§ЦЪ9–Y=>,n~§ќ$ЊКIмЈfФнFР|žYс6И.сII™}лkЖ6l е \8АмCHr˜ŒЛ 7Љ=пˆ(зкЊФБЫЫŸўіУч•Єшо„šц+<L+„Dсщгƒъ–{<ўи?LЯ}lт> ШпўіљX€–tЩЪОЫSHyІpѕU0Ѓ oU[4лХ[ŒƒзuMQTе№ВokQD|ФƒђћОЮqТpkјгX‡`Е" вњыokI1œД4 #hЊ"В wЭ~s|y9r›ˆїЗ+†yуа„пЎWf+Aё ѕПоУš—ћ†Њ’Œ7ђ˜šІЩЊДќtqдVУKG3ѕЦ{“}йDЛ_шv2œ^^Ž•­ѓ Vж!ŽЊпЇжг†Sэ8пѓ—ƒРf<ŠЋЫ’ шǘ1F(ЊВЛКИ\эx“8}30н]]‰KєЧ+тЯ?b”Їл~ј?ч(яџk0F1fГйJxЌ2Юћ=^k:Nuту&QћЙоŒ§$€‰( {qЯ№‚$Љс0зёЦ6‹ЯЖ хўуB3!в?Пœ†*ЫђВЪc ol4‹'Ю‰.эv'@PАЃsкPХЖЁ*"/›ЩxР`|@.‚VЋт§ ™EQ4ЗEш|из!|Г №…{vЃYQG39ц‹и3пuќгM,KиX"`Ж,ЏубЋcŸy,I60„Q6…wуР64щў‚WT,c„-…u]Dd–йё<Пнl{™nьrОPeѓ;tS€,CVt`В$A1эЄ=2[“vЌЈh’љЬ1Зe‚—l.XE5№fIчї™Ѕ..яpвЄMlШ:гP—ybЏŒя╉3,'Ь’( ќ уВлwž&ЌoŸ`щ{I=цM7МRнхОЉЫїw"^*:,:z_g~љљќbˆ“$Џћ=-з|“/0™[a 0w,kDђЅ­эn><ъ&НЇBрс„F{0sЗW№ЌЈњ \w№єѕ?уaUА8…ЕWеuйЦ…м.Оyўcь,+Јa­WШsБr›™ъюђУРоП5uЂWQ!А%ЖЎr—ЗxRќˆЗІˆH_>юL{СHpoйУ‹.вїьГC,/оyy‡UЂу>%:їљA6-?яч7Ф›4hђњѓХ5‡N”#­ЄФ\~†'’bAЕ`˜о7ИЌѕ_ ˜$п’9йŽ‹ЫЬ™mHы›;VџЈбРф—ч}›љ8бїП]|aDXs@щ+(-Т]3Хщ”@е}O“ёF”mY"#шvэ~Ъ€ љ_ђЊсd#dм8эыиs MxќrёaЩWлМ‚гЫБѓˆіtХштШємnЛнэЮп §o†a"l8YЅwЦТƒЮм^- lGущ0п;Єw†MCло\ќќ€ёаkї”{ЇљЛ› аУІ"K@жПsЗ+к*“H,т '  ЧдИыOw;Ф#ТcФQћО€ѕE ёютѓЏ<ФXіУЇ)\Sл>ом2*НРwmx6хЛї нjаŒнŽ5'*Рw‰Ц|НйH†]PxЦˆ7тЮ€qБ’Tz,šVIOЇ>ХЖ&ЬУнЂd–Y8ЖЉ|џ†Ёо—лnyYw#ь""онn!BФУ БЮєaъЊGКЃЧЭ‚Bј3~сtРj#О‚ЏkШћ9ТГїwїjр@ѓИ-ЫЩІЏW~Ик–еH pюјršК"†ШЈо_ˆDC˜hZ/јНяРs,В§ѕужаD@jЭ?ЃЫпVRU~Г\2"6ёщгjlКaO}мЃХ;ЩФ„Œ(hŽ#lліŒ-'іm™†x-ќЗпž+kР[ Lџ 6Уи ƒ[s оїрaE’ПЃ žoc>ўx!i€›mпRМd{l|]ммљлЗЊхЁeўm9Ї,/*ˆд”%^N{ щ.nƒФMW†ЎуКŽcЛqйsL *ЌјНж3“IїЃДЈ<[ˆћЭ„еTМйТ\|e43l: †ЉkŠY4LГРvўЄŒђŸ ђ9q‚&ЛnЊ вЗ›іЧc;иYфЗЩpёд7hI˜­ яўЕFурёZ,нЌ CVЌЈ?v‘mР*ћ№Uа­ЊЦˆWЯyfƒ§5€e§+t‚пžБ _;^ГЫ§”ZxѓћЗ+­ѕXЖ3ё9Я Vџ§?kр‚$ož]эАХц˜йfњre˜n=4Н>eЦ ўеЦўги0ЬЋРnЂКƒ™/.ЎЗи Љ)№rИ2!Аџ•lўЧX–ŸAŽЦЃї2мЂ†(аI“… ЯјП††аІ—kюy`Жej 6ХяЯbПul№ j`QзŠib‹ЂябБєmЋ&бqЛј†vЦўW›є?Ќ8яpƒб2 ОПыŸ5ЖЛЩ€ё>оЧћxяу}Мїё>оЧћxяу}Мїё>оЧћxяу}Мїё>оЧћxяу}Мїё>оЧћxяу}Мїё>ў{gкE’Єa~ЭZїюt3€:KU•Y•їyFоїu~ўИЇшЛ6ЛfЄщљ@2$$ЯHїзГЈїљЙ~ЎŸычњЙ~ЎŸычњЙў­– Щел}`‰"З— лЧw’ўnpNўїz3”@| ‡UžЇQќ“А9еі#ŠF\{Y{?Ў?На“?-б~Иmъ2ёџЗэЕ`xQšЅБЧМat? ЯЅDМШ‰FyьЙaQ/&;ЮџxЇфFq’зu8Ф г$ќып€‹•tнЖ‚gБkШћЧg.сУ “t!Х–E „Ž^КMЈтR(X–х8^$^а§8іЩУЇЫ‹пПЩЧ‹фг(ЮЪЭzЋ4ЎЗ&ЅўѓMъџќтtгмПyЃЃ –Mˆeл "ъђПџђЗŸё+оCаїМbЂЗЂŸMЊQRкjc‡qSџ_m:!ЈФv-і„!ТЩh€ѕ#єˆtѕЫЏŸ6‚,эо|xѓцГhћО­K›л;FВќšЌЎ4Ф4•qє V„џпкъTd}Нїв<‰у(†аPІюnо§ђ~Ї[–m`аЗŠ&ЃГ—яоYѓКыъь‡ћ ЎцБŽќqаМсRп‘жzTхыaњžЅюЗылooКaЛxq4-ваǘя/oV,s§q$н<”сѓYDj­uRСсHXgЎ&Љ&!†В[­wЂАњДЕ(ёLљ.Ю+цyЦžсxццяя/WЩ/чЙMщK8Оџ™eћiю“ЭЕ­Џьж Ыln>ЏDг2ї_v6-rjPйL?юцЉЩ#пЖЧd~Лр тfгajbп‘бŒОлыћtmiЛжмЌ‰Ќэg5(ЇвQvЬъѓoязЊM=KИснЄ)bьпьаэу0ѕMžлОќyчв(NЧЙ‡Д‚ъБM}u бВ}Я›qКт—tcиКИњx‹№Я`яdZ6y@LсAsН|œ†Ў­ЪЂЊ“@НWƒЄ цi(BouS3]з6_wЏЧѕ}G“uЏj(aoy?чЖˆ\u'кQ]xкУ†$M•QЂsЌх†ˆ6ъ;t‡вP|0‚ъx>н0V‘Л~ЃйŽGЉcПˆЭўџЕ$гЁyЖN7CтvcFеN›kЊiВ,ёhRгКхљ!u­—žf6а.QU+?ЬЉЋ3<ўqГƒGіkшм ЈjBЯ}”ћБЉэюн0m?iбmѓqБZ||„sш‚Ў ѓЎGŸ{З:rъq–'ОM^ИŸs6ьзЌ?ЊР%'ˆ"kNxњУJ ЛyНіЙ‡0ŒРаи­Nl?Œ3фСžП}ћЖ=f*‚|Oˆ(Љx@Y6C›!Zјeƒf ш+uеLsзЃJVX Ѕi^@n>Ј1ДkФЖБчЧ№wКТь`›ГВnњУq>}§њэлљtz9ЂEнА1/бaXISD4$2ЋЦЖA№dŸGhKЯPЌb>-мдум”[o8дiі3GЭQєи‘Тєѕ-ЪЁ:)u]K–LƒШhƒГ {Dъ:Œѕ|QVG:€ŸЕˆИCœф l5Э@к’v Йл™ ђйЁA%ОЁГ RЗм:аbЙDЃxtБ<ex*fTЖь|ž2ШЁВ$€ь&Я bРД’Тїюъ4Iš'*jq/)p,§bAArћPWрi…дб юг­ЈР•9q`вХ ў„рЈбѓмeОЉY I“$mцSчС№†М7˜фtѕй•Е,ф—uEBсц‡гТм­ЈGX^XєOЌFјhМ…gШ:Q5цЗыЄЎ“€Ъ[P XЄOпЙЛSA5йіЁ*›h]UVMbЫО@э@JеUЉo)Ќhаc2j`ŸЩ*E?ёЦчЙBrˆј–ЉЩ’,нќњюz#j]#чХ$ўќј ƒ_•/oe ёŠ›]h*М ЫмъњѓЇЬ3ŸЇrŽKг4t ‰]‹V2AШЅдж57щPуќa;–.шgъMтy^Ўўуэн^3œЌХœ>}]F€Чгё‰СubƒK‚ў$“ЈAвШ‚$‹"ПЙЙИfŸ;›ŽPшй"'šAл\PЧаt+nž:ЪгЧ #‹kЛОkЊ"П$IYџђћNжL?ƒBіx9O сyЎ#ЧВ=ЯwtнMћЉ сBЙ1enЛaŸKx‘lЧЕ­Х>(aТЈ *$њѓF&ŽрШnvп'ЯюЭёѓпяyh‰ŽЗЬV‹тРG6Ь/Pс‡Љ­ђq EsŸjЕЂЖ)q !ЯypУ{^р!“xI3bН…ж…@*Ј]№Sa‹ё$.Я;І )Шcе …п?ќіы(dU…УЅXЭ/Тhшз < ёШАеŽ*ta˜…GфexŽв3§И.Г$ŒвЊћŽЎFПџуB Ÿ†К€бŸв,AwЙO BГX}џіПXфКУ$Žr\хѓˆ#e9ќВocWegЙ}LфэoиіsXx.tМ6ЗыŠ+ўШОЊ`r^Є~Q У–#y>•eEU…АЛ^pВjФ§PGDк‹њ4F=5‰k*ї{Л6мЄ_JпТ?ЕО)э8­(ЯzšGГqHЁ„ё‚ЂIЬэVГН =Ыи]}И` и)<№qh\O…aЅЫ …ћtЩЋК•}liћB’…ƒѓТ MФ•.џО1 ЩТDйЖm?NЇЧžъмъa/Iќs”žьQи |ѕ‰ЫRю?mLФz]ФдбxЈЎхˆAШˆ.LIжЁТ@]wHЫ/‚n8љиz† уš•/twHЈЮCс›ьхЬЕq^$pЅ4ЮЛг”Z2ЂœсV>C1э?Ќ ”Тм‚hb.PИGyгсUђ“ Jєтa€QЉ "'C3Q­АhsKЏО€і€ъјI„#‰ЉБˆаЇSjЋИoЫkЉ–‰Вƒ4ЏeХuлќq’пЦёiчFУ"rЭэхЭŽчDн- УbЁNУ}œjv кЖЌгЂЩ‰&~љЬУїMь"q^ЇУђЄс№дCыаж$Yƒ;HрTnVuh9M- ˜Ь}›ќјkІчE0œœ]ьYЫьЖw+PDДšAC+_VшŠ€JZѓЫ6‡єИњФ* ЈэЁя@кдK>у‚бaiJtUц˜ѕjНfиэ~ArЂŽк wџ‡ƒоУAƒ… КJаwpМ™ #xX^a11–ЄКdв~–_6Д|§ўU8‰Ш лЩрŽaБPАЬј$л5dvЕкŠГЪˆ0`Іе)_#Qѓ‡ƒ~ѓіОГ;Ž,Ч2Ъ~йооžЊ–')zІЯ№о{я#в‘ѕѓxСъ=;г=3­$K§!!IGЂ˜ˆxРЎЈ›V„XfhЫ<dAхkйkВОm‡6еАЖpUqqПрD++MфяoVC”јїКдQiќЊЩ!RDфД[œо­ “1‚r{ЈН“ЮјчМЂ{ѕацYžcH г”7”‚JEв~ЌпЕmjтгх”ЅЋX™'АIvЫЎ MUdэw˜Nn‰‹tŠvn|$@ЌЇOoчKAГГЁO1ьdгCаоЎхzA€‚"ЭqћК^=*ŒjwЕЏq7W+P:-#YЄ)Yq№рьF$' ц€xеЛka?з№ФЅo›вњсъѓЏXI›л†њЃ,K Э-ыRP.РlБ“%№jр>КžАЃО |jлІДњ>чxеЯЫHш)-iaZСУHцА`CKьљ5леэЅ‡xу˜ЪњђЫ ЇДєMуOЫз‚‚Œ|€дљЧЏwГ%Х1ЌЈnTx‚jДЈtзЧ 7ŸђЂъeUы"ГdDЄ-+Gц`ы:хvLАˆЧwQ_‚АгMav=“u7 ѓ•ц4BVгF–|їсћtXo8Q^ХrX(|,ќЙЄфHb%дЙŒ<№$+Jр9^ [6Ќѕ$Дt->(A†ЈnЯм‚ЧЧXрЙкцq…ЬЖ~0К`"юeeь(››Gžэz~R‚Še–`ЪKн‚sЅлЎё$I$'Ћ*OAТХŒf)Z№2KVЗЬлбœj$ТрaбšлІ( ї2ZƒyœIІm[?Ив"RЯuдѕгRv}ЄљХtќnъл^к@ŠжAŒ:RDї‘ф УБѓp3ЇNS–@щO 0фwИи№Ч*ЯВ,GffGз,ЯвЂiЋФгiј4§ЧoC7u]^=Ќ5D$„•Э#_“ _$ЩzU:6Єє.ZPš^Џ.юVœ Y €<‘хД ,$xм6ƒLЬѓ|ЧPиѕ†ц! VМЌiГа9^8Ё0FфпЬюцЊ$5РГ§€MvЁЇm8'Ў{’bm yє™TЏnR•ЎШlž>Z1Ђд%‡ŽV5*Mœ‚д&€ЋЊ˜РSШZ €b”АЊ1ъ;ЦщЇEДэХyгcЦп7ИЫЅ%чЦ –zb–ш= SБј‰-qЋ‡Л Gx‰-K+КнюїРВ%шДM,Щў$U,щyŽmЪУлyгРВјЇSгo 7ЬБхЭ1*ђKб‡Ѕ'ЏCЅС‹UЖ€…Х bиК<‹9ˆэћЎž]P" '§ЋЋУ}Љ$`9Œ9ŒЂ0J"DП2EkqеЕАgNPwСЪ=т?Ту-lyЬшЙт' Оюзˆр#”8†H­aНWфhšƒUTP™уЕœ„XCЖBђђ$Mq;e‘eQрЈдZ В2ѕз™С#k“z?щ‡-фFYшг™+§Š"№'žz–ЖА™S€ї%т6ГЁ!хЦ* Р\%Е?RѕFŸWW ,8ОŠDЇb’яЋЫ™ш„О{Bч‡ьИaш™ьу\qSrъжbхƒОІgwё&Ѓт`мulp‹% ™€РГ,ЕBЅeQиЄXvVЌ8hОЧF tку›‚§ xЌ‚=Шн=А†yJЗ ЄуiњЖВ<7‹|‡ПŸj~TvЏшИD!•'Гд†­9vuџъKКnшКxт*ЬШaV›@ыa пGтвјР3OІЛb-/ЉЊ< §ИЈсїРEk™N%/Ъ[bЄˆ0  РњRbˆ,ЭА 5ЛИR /j~œd5BТ=)˜ŽЙ Ў9жѕaЯH[$€QуЂiВР=НYVТЃОЎ8ЅЁЃSу7гЙьGYѓš:hќ№Ь•aџвœР"ЕУЫAYb№щЦкБщ-9ќ'І‚ЅЊHcX –Їm!?rNюt[DЊиЖ 2BоGQдjЙлШGЩYтНXWБЦгЂ7X5ЕXАМ€‹ˆв{+іca‹ЅSЬ0ћо]ђJŽН€LЙNР@NnЛWмЈŒљЧЧщŠˆ‡Ђ9qœ5ГmЧЊdOv$v"UžШ@LF t‘тe ;и싇Eр}КБІ‹Б5 ёК‰mР г3ИŽЄЂЇ*-јabн}Иšq†э!‚4-сГЧj")пc]Ќюњ&бЙЭšт8–]N)NаLЄD„dІм‘ъ4žШaƒ'–!с%ОmЇ€Џ"ЗcŸУ9?єј‹ЋЕъA”€`ЇЦ€ŸOъЭ 6:i<Ш@tпTЁЦPрыxŽZn8QDБИz`•xKЬcOš;ЩF„Ž>#ГРуxP&–zоЉ1|iКЪr&.ЌFе"кGGpxUaЛ;кne#TЛƒxш€ЊU€єzУѓ,=ПљtЯjё–$ƒ&Ъ#иыЪfˆ-јФUU• аГOЕъ%‚/л Ѕї$˜anˆЧ臄ыНэwЄдЋЋ“8§яИ:(={Ђ9–ZЏ˜ыТ—ьq‰Ч†Їз5Чхnб[65$њžkуvЌг“тс( л_ŠnЌЩюШЂтчЂЪћIЌIЕkHГv/Х-žЁžfŒYИ бЏб,ілёџтY"ЪA Ыж5U%еє“ШїNіеЂу‡Y=цоУkЙнё}]дcqЯ+ 3.Э CC`ж+@xriи,ьƒзђd‘™Ю MѓX2МdаъpВћˆƒ~нˆd#я‡6Ч F~КZHјЭ-ШsOVzC”юš4pLгvƒ‚K‡з@0Ф‘•ЦЦЄƒm]dрЛРyaU вO7,ЧnЗжHс—д}EXп^?ЭWЋЛ‹ы) щИЌXQM№ОŒt4ƒj„Јtš$яєњсУЏOŠnYі[\ `=а:M<аt Р4ХЋжЊЂљЭˆєЦJ( 5S]b7/";Л0,ЕЌ:йия:W8!Џа4АQяа†Ь2›щєігЏWЌj˜oгєmИžч9Кп<’я9ІŽќэvFVРGYецI‰Н -M!w›…ѕ§d…•E5ЃvЬУСйx:[ +йcЋЭqHmY`ЉЕž]ЛусПО ПАЂЊш2EUEQDаЉZ)X5жяБыfєв`м€ыётЛgJ4Ј, C\xќй ˜bRтYZ^.)wЯАL‡6Цж]–5Ї" Ј,ШOEHјІп>OXI\ЋлŽ pзЁ‹0ƒŸ}_kN—рыM_/fЇіёўA-JQ‰ѓАјБ']м{Ќwњ–*ЩZмАкІАјoaўuВ–dяwЉ Є 5ЖSZ†p7“­dGЎ8ы ѕa§>з™з*ыnBЮгРYс дч#dE„7ЂиmшAzШSMt ї}ђРŠŠ>Ж‘’ъюГїФ1еƒhК-ѕ66d“Ix]я3/hЭ№ВЄшсvdЅG—[šРЪN=ЛК*APЌ*т§фr yЊlЅ5^ЛН[pШ–Aп­5М1ќќмaŸЁ H6у{Ьёš/!ŠŠ…зxГzK”>р9<€сьTc­$PАх'пXж“іјšhеy–€ЫдЈЫ;IЗ’œuWцiVf(ъo?цƒt=вХ№иWhњš$Žžc64Ќєa7&a€хR0\ЏYNНФ{"‡]“Р M”qБu'УDЯіЋФѓ[СDilV†ЂQsAuЋУѓ€­хxLШŠ!IЄБр +тгф‘n/'9aс4,œNG/WД№–4Ž7рU@чї˜L"жЕ- ћжaЙ+оJпPё тЛCЎCНaued MЯАJb:a…зіЙ%Ююю— ЧВ,')‚ЄуmЛвLЯдЕ7ОЧќЛЈІхњ>ивM O?D†ФЬW<о#JъэXC…8ЉЛˆщ~2nAtiЗ oCuѕхУх Ж…ŠгБ\{‘Л‚Xи{M т P KcЌЌGa\•­0—s€Q^Z фш@fш„žЉ)мЭd7єуВыЗX.Tцы_Оop~'9Й~AzЗIkАoQеH?Є†<ћђР’ЁёКТОТžВљ6aT’ŒwииЗпFК6§јРkиы™[’‚€/X(МyџЂтT›,]зAhŒ љёУ‡™Њ[цb=„рњрўўг„!Г*дљИлчІI_мK†eСцАёЈХѓАћьЂЪЋˆІe’dіw!=}љє$‚yd=оƒ#XГt1 rГЫЯ“Е k8сcOnŒдŽ!>о0šІ ”*c#Ё,žвСћ?н2U†S­ +ЛсаљК0§ўх–ХSКvOюVУŠЅ%n~ѓuђШˆŠbFfWЧcя›џxПo#AF!Š€эінЌљw ƒ[PФ#эЎ LiѕxqЕ‚(щW`лу v˜ˆŽЙйЗЩw<|дЃqЅŸї)„юёц~F‹h!]р˜wзgЉЌ'K’&<„у•™љеїЅ ~ƒшч№щШ€КAZ}›\,8јЗdМлw<жрPіщтr 1мЊЊв[?јЏ„СЊ€UhыќєћЋјщяŸ_іЛуО&ЈYЅ/'ЗQ1Мr„WЧч]a\чWїМfxAшуm%св Є^№‚ЩппГŠazѕсхххp|СВѓЖ Б•˜ПžЬ9EЧœ†\л‚:”‘kYъќлЇYQžјxИ№Чш<™,hAж]€kњњj~7Р8щ5Ўє€M]М›,%UГвЧ†wVл’.yTŒАŒaнпojдпQ›%§Iќэ%ƒ]’иdwŸAщфЁ­сПЉ +š—6[јвц)bmсъуTЕ3М !§БГpW,ЯаїЏx‚^…Н\V>Eј–І07“МћЉ˜рižŸЗDlАтщеk„EъœtюШъјлМdРэvЈ1"Bt™~™<­i^RЭЭ!?8[_ужЋх§чKЪ№ђЌыНЇћ§#Ybдƒ "ev|‹ЦoˆЫЫ_&рёx/Wѓ%Ж*ФІXХпО€Г№n0Нyќј'оaбŒЈ=ьл'rо~ќЫ%g8cўaŽуџоНШБ ‡—аx-ш!Œ‘ХБЫыП"`вMг4Аї{ZуфE]œ}љы`/лј)3—XЏHX:d4<П<я ЯаtРnєїЩ’Iьev?ыvx1ОŠS^^^l№K~ŽEk§;ЎчИ8ѓ6LШЄЂCŸуe,иГЩкCЯБl?ЋŠМlБЃЬвVФŸ4љ›бА{нѕ‚(†LЄС‘K3њЊHCЧ4ЈЩЏAЛИє_й.жд!Єќcў]жМŠ=BlbЧ3ŒЎoъ~Пы›Œ—”'ыA[8Ж$  ?рЉЗ9WљqaБпЃДjъК€ф1iі? K\OО=BЦ ™Й,ˆŠ$ #ЃA™'нU~#uУrёвrš„`АКWюі•giЫЩч[PКЮl…g9ŽЃ—ѓ  я7ZѓŸ  ярКрxЌльjзP&“ЫЉЂ{ ` M MYOŸ†Іџрџ?‘Е„ h€йВx%'i CЧ mASЧшMtEцVдў‡BБ,ЧlV“…ЩyžиQZ3§" Б!,YтўEжј? ЃYЕ!ђM&wЌŽp­‘ЊТПЌЮ“zAЫ0Р­нm4У„5†Шў!9ь ‹ TИа“Л сњ§Š^o(§ЧБDwdВЈјГCЩШћO?ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮђ3„сЮћNвmЫддŸr…§G„bЭ }УuЌП7Вƒт5 žў…юžm$У "B7j›цœЦ(Ж…ЁЕšЬ7МќЏbBЂюžmyQyжnЖQq.’ *ВщЙя4њьŸ— Ч­”ŒЊЫьъщoП№‰dEš’ ІdќјЯЗ“љr9_ЬŒfл–ќ№љУЧпџстыЙFp.ІE‘сЌД)ŽБГє7ўЯЫЇ˜mћГƒ*Эtl]™§њЇћBОрУdђљI2№ŠэzIСNѕЃ(-ъbbјaф;Цnм+VрЪt]лВЩF ™™ћгŸЏ‚ n&Ÿ&“Kоr}ЯR–W_ЏчЌЂ[ЎЩ]]HA˜цIрНЯфџB8EW–ХЧqљІ…3<\[жѓЧЋ_>­UМјОњ:™м‚•ƒ%Лт§‡_>пЬ–4Гzќ|ч„R(Н_м?'ДjZЪla%ЙЇ ‚‚SkTPyБfз’a;†ЮТ&\ШnXеEф№зїГщнезoW—s7ЎwC{і{Ы™бЧбf+')}e3]Q2о-yYуoя5;Šm•ћ>™ЌU7Ўк&MYTTiёљпЎ—Дшл*§Ѓ ™?(ЂэЎ6}Дт:З„еtњpsёщb‰ќЄ‡еЩK“РKАІ‡ ЁШŒѓV…Ыя‚хИIЗ?n›и5ШЄМѕ1!f L˜љктFђ dсц™хЭ‡/KХ [К{дќЊpte1Y˜ŽŸфeГъ<Я#WЙ_;^\’q‘Mшъw“‰ щo;vњяŠjšЧШA[ќu3БgЊєУ\БУ"0˜ы••Ж…ЃЩ‹‰hйA’fеHA’јвƒр…э‰єpёЙЫ‰`иЎeМЗж И7[х%'/|c§ йАCzQK­АЊ*нэއ—gфoС)§ЎIWкv…Џs’зnSЫt0Гоо…0šЁK’lлЦЗ…9g’c7ŠуxЦт;ьЈ љ‹‘­Њ­ЋІіyёФЉ†—6Л]?Р:ПМ ЫѓО tбt`oКд3эlЛ­Г(kqfИўж„hаžчњйАяТ1œ@ЂУ mёіNr!Ц@xо!ЇpгVЎ,Юзšюd„бyивП=Ѓв}цJЊуƒ?yоѕU^ѕ8LЋЯ}KWпкѓ‰Іfi5 Рc“ЃL?+узШеWSбoF>JXшКirKцеdМЦ‘t/ЯП§†YћФ”-?jї8Л•pCЂЈэЖЫЫапиѕ nœїлмХ:5—ЈnЊІлі‰-ёZ2уЖCњё*1d~КVєАE:6œ]џ‚‚cЈ ОOЕ#$8љžВ,ЫЂЌŠФkГ^PŒ лq_;ЊРKНфtQР(КФuуіUgЇн”ОІАї+FП‡ ЃuММ<П<їyœдћУё…LиоЗњ:ЖуЁg›oXS› ŠЩkИefШѓ^Q$ŽUьˆФ”УPU#)GOШŠк2Еe‰КЅРc€9і5УОI,žb!Џ„Ќ‚yКННЙ™‰aМУ$…Вng„…хd]W8СHjЩŒрU„› YW)e)ЄWeюЪ2}ёљ‰с^Ю|0ќ†L*89єnbп‹В2ѓUš•Mзїќ†`щ€ЦёМЭlYT™ЅeлKЄsoйvџ@QІёѕдЕЈрМю’PBoaЃѕЛ–№“Ф.FіQТPdВfйЊМОxфDYем b$уGZф5z>єЄЕ–Ц †уgшСљe)R4з™o›ъ„EUЗXЎ-ВMЂYуiRžqМvЏьП‡жW+љРР,yљэvОцxIї ?иƒЊ{ пWьYВbКAšUuшCw‚Ћ™`кЇ‡EоДЄшШ#[wв‘5ЗЅ%-IИрj;Rяї…СЎ(‘XЕІŠвњѓ—ы›й тf‰lw8|Œ/#/kXВŒ )И Лђ`Ха оРQ#yE]Ѕž­qœтvШ=†k†хIMШ@ЩLeiAЦМ Љ%ЅљЏП~ЛМЅнš2 ч q0gюъ@чx0yЉЙšЮW WААz<]cwІхЦIрhЛсДАG Ђ 49x]wHlfY‰D ІІ›š" Я\џщЏзїKˆ)СLˆ4J‚РPјЅЕѕ’CРшц]nЫЬzCm щМИМ?•$qЫsMg^q‹-qЖ&Шnоzуэі•>”б$&Ща,ЫмќŸo+Š—ЭИйбžс5ЁiрЖэ3Kр$ cЋE –1^EI\?оžLwЦ /™Тœ2ŒТ3РC(‚QЄыFŠуmыK‚DЦжSkŠуФљ/w"lЕ -РнжZ\энўHxw;§žчљОЃБ‚“u]юYŽ27NІ“ў_“k |рPN11еJР †Tф$ЄЛ„.8Ф!хВФ.6Д Jвъу=ёгЖэ&У‘ап"}Юю@ 6uUжЙgˆЌъŸђ4Р}hђ‰ЦёП' ј™ЇyХђГ0{h*8>=mЗШ`л“…&Z‰"JВDOЇДdZ’Ијѕ‚C’ˆ"FВЙ2qЅ!cЏбbF6њЁK•ує Fg?Д‰kAўpЊў,РRщš$8-†#ёTІeјЦAOТKRHУKCz>ЇлR9ііЯ_7/№№’ф`w|ЅјЅЛ4LkТ{LўgZв†З‘!Ь=TN 7Їk8NDPU@ї]›E)Вц‚п Mžeрѓzb!АfКШгЇxЎЪQЋO~т~p‚š [ЧЗ!шnПЭ IЕу–|пбW3б№ђn7фЖТo6/Вˆ† ш„ДшH^ЙsеДНБЋЫzи /3ЄГ яРŠŠ**рМQf>ут<є|{В0Jђ"‹У8+SMЂ?<ŠВ Dі (ЋYžpа~пDГZNч€Їгќ^‡ѓІAРrt‰І8œаoWšвЈLa:чay5‰чyXgYр˜ѕфцУеЇ…ЖЛѓ|є}mуH[јš(}3S$#n:<ˆ^,8Ьу bw daёёуЏ{‚ О‡яS“ЧщjілUFрс'mхЋд†хx~ѓ4Б_zрZКДОПО™‰N‰ГЏб]яsЧ3`>Š›ЅšHпЭdйЮк&2•е#Ѕ˜ЩКяp/V1 щљэ-Ѓƒћя†LЏŸ_ežючЋщџЎкџ,гяЙ8z]ц'І* EnŠЇq|7&aілmІВN|Ч+vŠJ—Šlmх)ќу#ЃZЁyЖƒЖЃ[Œ)Рz’DžќЖ>lSƒ_o8ŒЋЏPzЅуёS_ЄАКŽОК™Љ№&рУк:}ЧЫAX лвh†хX–( aэ\ž“ЗЕЇ Ы5'ЈaOђЊ˜СЉgH#у€mh@ё о)qР­лNўЭJ/pИ` adЕеэ3МU6‚МлЃПnћ-Nsп/нњЊФб›Тб4бeіiЅ*Vм46#’YюЯ1C8Ќ„oi"р@xˆќj>[a,†ОЪbpІоЋЦxŽV˜гР`Ы/— G-чеЫР0П.rOЮ‡ЁЫCс–8нлHRSцŸЇ ’uEр8€fe5мтaвy†3N\ОЩl–гщrЕмШ:+<§шšžыoЯщБ6еТёХEф’сДєlЇkV9H+АсЊ,Ш)z;РлАа­Я/&Œ$џЭ| Ъ†BВЅ8ŽІpœШŠœискТ&Ф@ŠйвѓЎШајОьЪы%Џлюo?ч€!Цx†§4^r2ь?Ъ4№г§ДЅліWЅ‡ЃС6єЈ(l DXЭhŽa%лRdзœ‘zс~‹>d7ДeYV№вКЬгТlн  vш*Ћg˜жoFдŒnйžgЫ‹gоє#@žUыœХз исq'p<8„НT;˜ж’ьЌЪU–e8z|Зф8^ы”NБ+ †ПЦ"јеfIŒ&ŸQ:™лі}ЙЪf-(ЏЈWtУ2Ѕе\pУ a7ьбіbGкNRc2 ы$:ж.€'›‡’VЁXQi7НњАEнёьs=K€и -нК‘вWEEз5YŒЅjК"0 o&%<Ш8єЭз(Mdaa…Ч›№^ Ф^e§D;!(=ь‰Їm‰ЃNU РЂt?ђ/ М uВHŽЁ‰ƒУЃјєx'ˆ"ЮФіЂ( Љ+Xвmћ"^ {AZ“-пUБHјI№ЂМАR‚0ZЁrD‰˜Јр1DМ‡‚уŒAiAЖsŒDјЯI" H1Џ\г b3 !”.k`йC—Џ:-ZГ/TпsРЈл6!Р„GPКш’т§ењ.QЙе’Сх–UEфiРK "|ЕЌъ+—$J?взY’fyšцy…lИЬЃаЗdеMЫ*ѕ_“CрtлŠ1с МјЉ: <}ў$ *MbУ9bz =_ 3gжk hЧrE‹>ŽєлэgзО=лJKЊУƒѓnАh.M‰гЃ8p^qкLы^р;ъњy!:IЎЃmпхцV”дˆJQb№G›й OЏ)аšcщхV]8œVЏZ9xцsqЧ–и4|ЬŽМ?{‹Ф–ЏoV’cНІњ”ЖМ(СњxЩ€>ДM]„Ў:‹~œЁIФІбLрЯЖN,P=.zљp3о@азё(б <28sD,˜юХщљ)aЕEW†ŽщF9&ьХщј•ЕІW>ИМЌл2KЂРгcквš@xw,Ж:g `–aЈХУЧ1Х Š%iO˜А4hKR6hеhVOК6Š­)fЗ%рW—КЉ^PСO­ЫК4mК&,7N„‘…<цУўЬЖм]сш`šЂWуёŠeЇФЩѕˆіПЪn>Си6Ežy6ФK†XДMцћцkOlлЫš:іl$Э@\ij1йи`S’Си“в”сl%mпеяD–ZN?п/hЁuшћQљ“ Jі-ЌvA/›Žде–UƒеœžѓъЂТХ[Ž—-йpЛsТхp$‡фњВЊ'љ9ф}MтКaŒГv-ў‹9ЧГАрАтz4œKёЅdv=кЎlS7ЭйэСŽu№VZћѓеpiЅ9a˜7Ш§Я^kд№ќжl(B?>W!cБXf‚‰ZXNЫ VBN`ЎbсХž &д›нlЯN„T 5˜ЗЅУч”ЮYYчеuZрg5$[NЛ"Ђhд]тXN>ь‰WиmUрX@y6€*1œ4Ж~uгЄD„фЊёm“zgЙfХt\ћеюCєУ+'ђМ(Š<BЯsУb8рbяыРаЬ§YЗмйѕšс%У‚РШ‰Р*=ЯЇ‰бsјЊьёьВџš‹Ь\О{œЮ–ы Џ}§xl#ŒвЊ‚@@Њ+MpЊ˜ЛjЄ†"wTХˆЛsФиюл@•˜ХdЦШš‚НeнOсЃ6$CВ;|-‡%%|g“"t I]М§ёfКмPые†yƒz3zXтЕEQ<8ж№jИ‚УaHLIвУ†( ‹ЖЭmYтŸoˆЂEIЊWд-f„З_}$9ё<œU>œЃњЖŽS}ўг‡ЩšхњMЎРJчXVЃђ4 FjиNKПХRн}‡Q[s <щ!HЙMtI^нOд4ƒ ДИъЮ9%эцŽЛЎF&+рw]цйѓён3ЭKВТПE‘Н„iзГ€‡Т&СƒˆX,Г?єЉЋЫŠyFžˆQ;,œІ&“8Лљš%=Шw“=H|$šФар“ЉІ EŸUьZътУэRд-ыян:џ—E‚HXWyјXьŠеXЇ‹рёЊШе! G5’ ‰•ЋJ,Xѕr9Й›nIЃbBL­y‹ЅЊШkєšЇтэЗMй–4Оž{ЗэЗЈ%!Ш6}SdY^”xbБ'A  4щЊФs'ШЛЏHЏpP/Ÿюяо_M€йъnRTX)AИgpCРАРfЮ5BјЭЎЦLЏОМ~” Pњ-n9ѓ^7˜W:ѓСЩЙД§ў„mЗm!‡aRaВ”Ю-Ybчу‡ћO?ќ4хDеpТЌю Д"tHс#ІЉ`‘БžbD Ј(Mнмѓ†mлoaДFe7є9R ЃyдœИ] Šh;II$њОr‰™OІГЩЧwS,&4§ЄъПЂМqjšсх[RC jК,pАШPз)ЭВ_Eџ"fЄјD+ТšР˜NJДF‹B!5'i˜кUfC_ЇœЂшІуgЭ™г"Џ< wnžф„P`_рKUUщ‡Ÿ™)І§6ѕг’:4–ц-Ы4pmMVќ+QmЪ +[ћsІХЬДT–SJ–Qkt.ЄŽЁŠЉJ’цт‹ЩUCсb%Эr>ŸмќјУ-ЋОеХ}"БчXІу .а.šU­xРЊ•шЉЛAˆЙК"…iК$RГŒХІ` н Йk`…$`‘э‘\О8šР6 ˆрѓЩэе/#њЭnЎЪ:аUPВnšК$0Г)Ћ;I!n[z†n`­Љ%и"#/гыСa?. XdВЂf L6ЗuУДн ЪZXy\шгq[FŽЎ@PQUё›м“›­rдbіМп„ukћЦG7ц˜?"Є U*0[•ЙщhЭcŒг§s9\ыЉКщKъs Uz/рѓ’ƒёE§oЁ5(-ˆРЃж”„ЕВЇушŠFtоŸБђ<}з1‰{MhгЂNMœGeЁ3I‹КCn~њђљkйоЋkъ&)Њ,о!АЊлœq\_FЎkАžубR–uK8g>Л єФže3Œi№CКŒ 3cКђmюЛ/ѓYA†‰щ-^ЅxСЫcЉCг6В]~ЭєЗV†РЖz=‚цSЮ,|r;–<™Уj_^њдw]?№€ƒ~›о †—UЌD пЮ7*іmZНPœъАџšоыл24Tq2К‚Ч#Щšп’ткУ NЋ,vЧоs„w@xМВ€х7пќZ№YжУžCŒц=˜$)эu mГVЮ+MXљ€JЫТdєb(јf#C>O&6­ђWбpуŽ”'“К.ѓUKџ@ho4њ,єZŠn?ћ*rLM7ДъUЊТŠn; OК"<Ў @UK‘žЖE€РМ П~К{\‰šяБHІў&—уўFDУ„7хXЬє3X†yrp’$ŠœlFэёзЄ$цХ56"к4†Рl‡п•ЏlГХѓ,M­7F6т‚(јјСпЈ…oaхŸiРЪ Ї8хЖtu™Хl…Šэ(ОfRћзMUИћб ‹ ,B">‚Ьž?|xXRМ,‚зrЖ=f=єЗ рџY Ы №ТЎm˜~톆Иz\ŠšdЕ= S;"Š2t]SфѕЇЅщІ$%ЩЉЁЬпПЛ_ Њic§AFYнdјПaŸ1йДƒ8IвpfMщЊы›KЭАЂKУ[!ЙW.dющ [џиш#ї$-“[†0ў4Сr вf,ЭёGР Оe3CоЪхХe<]2Kxўх=ešnTМ=ћr<э]Хk“їПŒdLћalAs?еЎ)>пЬ$PкъЦ(ОeЊпАa ˆŽT@г5MеїБ)м§xХ{Œ›^_GЌЙ`ЊычяЏG‚Šeѓн™ŸZз–їЌ›ПY–mЪЏКД№OЏkЇкaйvm єЩ`ЎОІ`сА‰^Э‚ХоЇš@oV“››#JV1УŠл№x8pтејaI>А цјoпЊ пAВœЈЈл~_;ЦцгЛЖпЉїhЮЇЯ \iЫЧnžoЏFsNVuЇкŸ•>”ОmщьјуЇёF_(c>јлЅПк€x˜•эЎtєЭне˜че‡—Я_Ч/ЇуЉ4ЌKYпў<S оw>7kРЛ9їјю#pНщ7ь#№…Gš–mсZТУе[їх[МИЗ=МœіЧ]цъš*ѓO?nWЂЊy HrUѕиЅžуXќуеD2mЯsMMќnнч8Хt€цЅ€жяУ№тŽ„ясŠя€Ёи9фХ‡бx-ыF<РпН ѕ>э[,Ю4ЙO6КхЃчјŽ­[7"Ќnк–|џЄZNвАМлёю2ЧаеѕѕшŽъs9ОЄ™G“'BŸxdšxUОgЫ<,шДu“КžAtЫЩ nЗ—уўtмѕ€Vu˜ЫеRбАїђВ?РZoц…`?=ЋN фKў ўlDEшл_цгЊmКЎУ./GРд]]$РйЛбћ'VV ;.w/Œ˜M„#въг'Мз|ыюmџГ(<В4‰ˆŠРЏ}xx“К]Wœ(ЯM{LHяё"-Ř\џќ$;~р˜пНнцЏТЉК…нA гЭ№‚ч>wА€CЂЧяFЗ“5EѓЂЌYЩіxРМЎ!oюо§№гТpрƒ}яn›• HШ’Р Њзтэћ@фЪRгЋGЯр <ќр5РУN]d›uїуиЮБ~/у (š№њЫА’Y_^†@сŠ^?ƒвspгЄМ]1"l^rhЯ1˜ЛŸFœaНeSI8EUHm^Eг€л~ўМtO?ПЭ%Э0.ыšю–ћэА;`(}ѓ^)§nр%№Ÿ<\_вь_>№жi,7M ZлЎ\H]eлwљuy…H№˜mЧv]з‹А1ТFGAрZЦztЯЊАуРЭЉšс†ы…I†q№% ўiatdŽžчx,‡—ЖфаЮ3€^пЏУ 0c ZCЬЦэч:іo/3РРRћqйЖMS’ŒљPBˆІFзO’юGЖ*0иAFx›и|гоšџЌаАˆЖэјQ’eYф:aБнЗ`дшУD2ќд7јPpl%БфАѕР@g^3ёС{ОякšžbhЫ›Іt3ШˆˆєњЭZYНpšЮЭд5ьYух…oЋб˜3Э СŽяСЋўuЁБРŸgш5-NyЖ>=ВКщ'кTХяб§ј7‹`8ŽkЁ‹x u,ўВ ,ћcOjXkІeщ|ѕ+`EdКПЗZџ‹P’Ђ’u}‚шЃЈп•\ф"ЙШE.r‘‹\ф"ЙШE.r‘‹\ф"ЙШE.r‘‹\ф"ЙШE.r‘‹\ф"ЙШE.r‘‹\ф"ЙШE.r‘‹\ф"ЙШE~waDн44х}ƒяП -™nxЎejП…#џўw˜џ›ЌE+У0 =ћяvtЧѓєѕшu+qƒђ-М?юXњпоeч / ‚а‘XVјЃнZЅT‡>>ўїяЏxУёс1`УHчf%kQжїяџє—oмрTHUцh2Ь'‰ДVzХЬзW - 4ХђГ\Ќ(še7‹л?§ПўђзяG2˜Œ­вOїSFС‰0žt?i^рлЦяЅЖрљщУ,‹М rыХ|zїУмm$‘#[юšБНVW|~џюvКІy™ОIAœрЌОяЏ5ЮЙ_Йo‰№ь%cЈеєiКЂ–ŸЎhЭа5вуNtќЄ("ƒОїqH“ЯзЋеb6ЙП{ЂeMž>(&ьG2гuJЧEћНиАьтцO?п>Г^в mЮїUy!ъ–ЭŽј0/i5™>oЏЏЎiеrŒе“jЧ‘­sфпa_‡В.|ЫД[џpGЫ8xЗmЯћО6–уКђhххMj+А§ž>§ђЫЋy‘ЋЯЗHMв[bЎ:Ўч…U_%1иƒ9y]2яьИяRЯХž›яЃ9ГбЖxњђY‹ы.]CсOŒюцЙЋ>=Њaœћ иcХqѓ~пu]цщгЄи?V:іэЇбBЗ^3zўŸ•jhЏјyтO”—uC[fЁЋp‚щЅmюуЙ™Ж‰ЉyАІы`лћ[ШnЧ!tнсˆ}ВГасoСљљЏ˜ўњOыЌYЖkˆ’[ЁЕšhQ1ьqтA`;QбЉЩЬ„АюSScG3Эv=ЧЖlП:œN]фЮЦjŽCт!ЖвžЧЂІЁѓ&3:ўЌTЫK3œМŒФУЪv/Їв“ячVTw…ЭK†ЉЏЎg†—д)іvў–:гŠсfeш™VЁkбs9€юvdTёv7Ўюф§аФЈ4mКQф{Žaхлг>Еш…шЛ—.TчkvsћneЙgиБфъLсLь:qл ]Чо=KЖчe7 ЄЗp›DeПпv‰Ў0#жђВмБi&У Ш*nкN•/ЏчєњёfЎћљ6З4ў["VУВТІv4О0tгдшыїЌсњaжі;2ўАТйaC—™*3M 8#>ƒЎ&l[pvlШЉЌЋвfТ8A—ћ6“‰ўЎ(–”лв”9œImjzwџјЬьЇzwlзсLЪ6"=УmЛЖі/ŸЗEŒCтOлдх–ВыћОЙši~SY/ЩќЗiŠ рLЅ‡ТвшчёbГž=~zX мbЪ’(™Щб ЛОkлX—зо€}‡эмЈџќхИэzœ!еЦ6У:A’GŽАрМВѕp(–e|#ЧЧШиZЕ Li|УЩВ8ЙšШ†)MhEГqј*™•Иэ›Ж‰tyuЗTЬЈщŠ(№"Xщ—вžКЯƒаYBT2@ћb›9Ў€;џ&ь`AKЊю5ћм6–ЯЊkйќŒ2 р177KбLЛэ' юћКjъP“ЗруЊ)т0ˆaЅПМЮёeьˆВуfзОІzѕЎЭв<‹Cџл‘S5U3ТnWЙ6П’н 2% #БЏO~yь чqу”МЖ(ЛЦSЄйиlZзY…щ№љ3QzW&ЎШЎ—Д;lЯdлЮОjзњ зАнАиv[ћŽМсмЈH|?ШšТёНшUиДпяЛКj‡кQФщZяQсќЙИм•>O uNq§(oС x2kWbчІЗž22"эSѓfш a:ЕЖќМ­ŠЂйUЁОZЩAGЦюњЖэћОДdqŠ=КJж’фэёЫчЯиЁHUЖœ{†=ЉБењ'”lћ: lѓ­уљАВ6Л–aЊ‹‰d‡UGЂ`щiš[’СЅCƒ“;З]Ќ+ќ3Ѕ™Q‰R5лhќђљєrЈCЫOГ'cЗPч]WeYžЁ|ЫzSГ^­hР vаTž!ђ’@mXѓ9ЦяУGq1рЎm‹:ї]хШ2uЗQєАЌлОыїЇ†r€mWєЇЖЊ>jY6ќђ‚аГ­ЗєжВЎЩм6P[кќ‰Wu•gxЭKЛніp|рHXb -]л~ЄaЅЋІ'SуNG4Tќnё<ЌcW'ЎЪв ЭpŠiйoJu‘є™ 5уmdпѕ\ЇxлєbHСAЏЛЏcšЛЖŠ Exј@i†„8рt8Оœ^О|СVри™Œ:РAr}X 5™,fwZ”ХљkЧ2џUвТир&ЊcлќэЬp“Ф1!єŠnЖ#3q* z}зД5˜4їщj­ъ†Ёi€O“Д§ѓb  ў‘4оX•‘Ё[ŒЄŠЫ›ЗO“%#Оеbы†“4…ЇNoWŠІЌ>-ЭЈыпг™udЄ5ЋДыЩШЖЄH-…ПП_ёGЏ7ŒhЅ;.ŸqZNљ№WuSgО.0œd8@^шАу‰hYoдЂucnО2O‚эШб‹ БwзdЁЇЌyœ›z$3Gї{ˆvžФ&J]U^ОџщfБІzØlЌњ5іЗ9іЉg;Aœ&‘-sМL@7vф”ЩіmчmšсвАвq‹У ьK FмэРœОЙ^й9Юя{†}˜{šŒ-оэШзUюуЯу5'yHы9ŸОќљЯ_ЮCЭі•Ї1Œb:@И™PYƒ7|зОфMвЊKЩАœdћВяŠР#lдз,Ћ/—FВ;с[ЅЋ 1Вюx†Цп^Ячэ8К(чˆ=pBиЫщPћЪfЭ+š.ВЂAЇoі-h %БпІW2-kšnaзя€xЇ)№з2t,л2х5+}$ГЯїЛDн=,(^skшъNрІq$"™gЕ-KЅЧ г~4QT ш№bіъeўЗ‘dЙIžјЖ)бœъu8zЃOž1]XЃfиŸНMnАЗk2Y‘Eўсџўђ0]Г’4{В‰mЯІ„ иU(0ј|š›ї9Žqр8цЎfЙ>tYpл€…п%'n2јџ‡/жщё3ƒУтT‘eVWџўq KuŠ'ЉžэуHцљА•#Ќ)A–ŠвТЖKLE )jŘ>‹‰Т›a5іa @шч+ lVу!рКqН=юšФеEƒш‹У')Wйfлn3]TSуЇ+^Бt€(œe`ћ^ЧЇs•p­щькн0Œt(vЋКАЉhGЭpm]ц1аЂ37ЩўзbкЖЁˆ:‰ы dрибьХ[ 8нЁ(†ы]’ JЬУЇ:РЉцІД­=<ЂзƒIЃE#мЕiЏ '}гб]BFrSмЕЦyщбй=Еџ7чxaш;ЖŸ4лчУy–iYгŽРaлgгпЖ8Яq=›3Њ8В|їЇk^Ќ"ŠŠлChоср№Уmс’ квH‰3КК*ВxЮєѓ~‹S™2п9— |А ye–UэRY_Dž—ЖtЦёnзхqe~ xШ‰& МЄi IтЗџšJ ЌГЂYёаh ™|‡›5‰ЁиaCG5ЖM‘eБЇЌeА~А§]'?ЗS5Dуnњw> -’д§iŽ{7L/Ч=^ј5n:œпgЛI]Њ,нМч XP€vЛЋЃ лRЖ0ЦЪZ—@NМл”ЁыЎєИPщ Ѓ>nqn_:NГЬЧѕpPmLЕ ч‘Щq“GяТ›ЎЋкиЄ+ІІ‘lлБ lУыштnR})@ьЯр ї‡.ЖMKчц+бА“n\н™ЧХќЅYйф8AжP7›< ёd>ІMѕЭхƒьWtќ5ю. =v‚ялОЋC]]}x€Ь‚АТЄgˆ‚…Г!U„[Щ€С‚(‡бDt8%œ~;†ТЬVgЅr2 1%`eпьwM п8ŽХiLp“ДояšМЈлЖ*’4+SSc?=*ЊпР“”ЁmpsЦШїtЌпшk€Šn{xD_fI’хИ/(ЄJЯўЎŽс_Оg1KУУ ткšРВД9?fњэŠ#Х–f—ЭЎ !БчІЇІЪЁдЃЎЋbЯ2„%ЋMlЗпжЁzЭVМhЈСЖxŽ€бЄ‰]KaЯEL2 уˆpїkЭА,M$V@сХУзїО­ЬЈпб|xЩ’G›К*ЩК*{Гжѕ˜91Ua-hv„оЪМHЫzёxЫк8•‹~?ЮнйФŽ)žeЮTT?*sOчX@`@KxУёёрЯж…Хѕ—{в/ФК-uУ\ч)ŠРŠЊу›*wЧfозЁip3^Зcв‡нр@DSY|}`“T}_;пь›ШрЯжyЂxaн%Оc*ї№ёї•ЫЊ*В$ŽЋ€гАN›qwлТ–g™ХJ‚” Љџе­МЋS}ИЦы—щю{Я%ЦЖеŒ77Hп%^ _yНd%]eЯйГсI˜#‰Ц,П>x<_жЗ4 щ„Кв&ЖoШ3zbUЭP%Ь8нЮЛ6ВфЧ'^V­љ,5…Yc—.„ХrŸ˜ЊЌй~БУ!8ш ­3Hк‘~‚ЕўіСВŽwкнpд}5rЯвФеУ=Ћ(6ўя”еЭИщRЌ\–•T[Њ4т+ C§eаИМ~z˜KЧM_Ea„SДЯШ0Pќ4kcз–цsГ”'ьhBйQШDѓ!x"ю~zрUеіl]šтлИm#k UEGjШ№ПєCˆ5*З||š/—+Щ$Q qЈрwжV$уИ~Йм[иЕqTуќіыЪŽъ-]фгJЃЦ ќPУ“ЉгЉ PЅхЧGI‘­lhГШЕ Mе§гoDЄ”БЋrˆ‡вj-[Ž-­EёзŒ›]’Г œlзЫ€bmщ&]ф;К8ЛZZ€wT] Є7# d(]N,щсQU•~zeйЬ†Мж8)}JїhOр№П8Л>ђl@’ VїKЩААшЛи9 SЫ.IЦУижU=€зЩЭ %њZ'.ђ8і€F†.qŒез[p:'Ѕ—k]нЦ8йTUd-СЄёAбДGxLP}к*/ЪІ =щўўq)jІ“6•gŸƒЉW–8 ‹СдРС$ зїnpэF*УPКК№tѕ$ШК˜р“œfЧEй8%ќTtЯ…ОЇБ‡oЂ†…›кEhKмќсaЪ›ICћœЂЌ…nЧ}й8юIEЂъvЁр:тЭsDЕ‡M-[2‚ЄиQdЊтŠU(Ž=]ХВУюЗФўEiД)–d]cŸ‡№•ѕ§=h‚QŸqњ?ЁhWКНННК}b$еФтАJцАюё?Ђ;XЕТbgŒOf‡IhjвšзL ВПЎKрbXt8yиђє'hКј§№УЦЎL“ШU—sбrсўћL€З€хОНјpu§хj.[рIјsylлX†…UыcхщžW5УЯд5yЭ*Рp‹LVL'Таqz/л-ˆ€oуiaН{фИфtћXZs&№сЁUт†‰o‰г'^EнO‹4ьŠ,ЂбімpгвУLжt?+\U–Uy1eDžWtM…pтФdhЇИОХƒнЁЬђ4Ћ[ˆ  є ХЪœБЩb".н:cПWВ!P[2+X”ЂгЯwlY!I{Ђ,ќС6ЛPZВЊbya‰"Ч.ЏЎц8yZЃJ“tCЯћЧё|љЪ ТИ(Ы<‰ˆТ2МъхМФ"&'œ3MeЅкЖ!№ВчUƒЬ{HФU8б РёУЉq` Aб€ЦFЙЎїєёУ”•5аš‚žSжŽю‡‘д/ё\?jиЊШ.gГЇиvћЉчэзЬ—OSЩ€рo)с‚iqгЕ‹4аPj }ŒCЌŠеє#ЂIЫoW,Ќ0ј!„hУіЊПЌ3юбыкTОФ)І… \VyеЯ[ъ‘сљgћZœV neЕ 3s}#EIVƒ{p!z˜ВРƒAЈКƒ ‘[1 HƒAЌџХwЇНљэи EХp‚4Ы€є˜Кщfнf?–‰{†КЋЏŸ?ОцРѓЂh6ЭbW[~Лб’4oщКб7N#uыЋТ8”БЇ{ГœЂЈ Г*ђЙЧнˆкœА)nXжyxОЇyYфYŸГHк ›њ5jgгѓќ эСх!–№їЗj `IP“ё)l•Юзœ JЊŠХд‚,саAfСщс@9 n—юNgлM!/Ыs\ŽЎыъ,BRd‘ЄЈЫјŒˆ7С’cu}{ѕШHІŸЖ›"‡'?>шaVRШГЃ@г#`гФQихbЕ^Г<ЯsГ'FA”%^6bД КЧK|{‚{=ЮгЎКSK Bbш~žgг"ё}GZхw Ž]SDžp;ГСЪ„Lє•SцВAlJs№мšYЭюoІЂH7™uїдJ(DЧ_ПАЏkЛQћІ(оyхрКF1ж‹њi3bюЪ#kz%`в=ЅсЛ=хˆˆ› M$РpV=ѓЎА’eнІхoeGK ёgF„{œђ: !seiV”Un*lw#Vz ПьaСfзUž&2 '‰ `E˜ЇЏІŠUьXЭЖйсліmDi‘ЧЁ­ э A0’tyœ_‡Р +ЎDYе5хє,ngkx…"щш+‡„>Д"рЌ§|Ѕ­ ЩmшБђюфGИšР2АќŸdЗя}РЁ`Ÿ`і!‹Ќ Њ:f6LПиаtИЇJoщšbi dЄ˜-^Цp,,iŽ#п;Ѕ5?ЬР0кnD?Œ­њљИпUОЉamТћ1€ШАрВЎgHМ єа€И1Ти-Э„XЄy 0ШЉ7Р+ЪC[•x^Т тКgfё M/QšЦqœUдs:dєЈУ&suЋ‰Oin“Y ?x\Kš…еьЊn‡i–cБТŽњ.V  ђ'Я=eIˆšCюБ˜-V,Р+ЭДЯЏ8Uƒ СљЈXЁе4U KМ7xlмEŽФЋ=}ќnл†ЪЯЏo–ЂЎСJCє БМe [ЅДсT0Д”Нь~ёŽ>&ЦтЫѕнl Вxъ OГ"Я’y@їhВ@?ёŒыОXгЋ6'оЗпVXѕќц‘•e‰…8 xЖj{<ДлЌƒJїe†UЊћvпbYzџэnі *T,НL‹}xXоІ И/-ЛЯƒIГ+УMšсwc `MXЬWЂШЯœДŽODkpЩЧ*є‚ `-=цз ŸШw?ОЛ~ZМRе&чЦI–FžЪ2’сЬ\mТJћ’ЋZИЏL‹’!дЦ€#„ѕ’Yн}[ R˜TXxOqš4@ђ80eјƒSьЖ‹‰Хћщлt фсUДvтЄ(в‚/_NhЇ`ŒЉG `„Nд fqл‚Н˜хУЧSАžВь)/D7С—уЫЁ+ђ€ЊБјx Ё§uz)H`ЦuфИ &р4‰’rЃFппѕUцл–WnщцXzРр%KЋ›ЙЌщvчЄ0Э#g€cD-`ЯcъC4up›T›~јЪШЏ5Œм‹Рљш&8№Œаƒ•­6Ј жЛu…gnA%Ж›:Њ€%5ђ|!щИ™][’1(BtБTХєА@ЋЧ}Dlг0 ЫWW?МŸЏu_Ю TCb+ЋиЄDSжI<`<8Ц*‡д`xѕцTЩ„U_Ј…ІrKAзь §•еюw]цƒv‚юјЭюT‰ЕM•]-WЬъќухПЫЯѓ‚(I`™‰Юq tOCШX„.,•єiбG™Ц.u]\ šjzЄ|ŠБР с-€›Š№(еіH ѕіиЙйУуlіJiхЏЂРлVU .Ф1оЛх%кЦћжM№Cмл*ГСšdзІ.1МІa+ДнR"ўРА§$Ї•ХЗeH Eб *orПoЭIЛИЛg тe#|ъЎpuUЗм§’ЦnАNЅ.ЯаЅеJєaPР ІДЏPйёЃ4ЧућУѓЉВpn’Фqр•Ÿ7PzСŠЛžЭyШх9Оп>2eЭСВm,Бпшс$іК8ŸTеЮЖёvЙ шХ`фР&Чя/Ј3^kРлс?yѕ Т ~lJcЪ<Џ’ „…о—žТ^ŠЅdДV>?ЧXQ]ую',№wеЪ(пdpo'Ьqл”Ц:пS–ТcХЖЪƒГЮс~CжЊхњРК€ ™2'й~ѕ ™!'вJ'AVдуюH Г:_ƒ$О`e‰{њ6Йc$0WЇЄˆn“[Ћ 9IђвгѓїяпŸwdЌЖЉ‹,ћ•/œщЇЯ*RЪšГќцxx9D˜‰† Щ!iv'DэЊќђюfЮЬo?~œL%l:jwˆ˜v•ЋЬчйq+"ЬК>vљАяЙ№_ћjŸc{aVЗM TN…•ŽF@‡*P—ŒЈ(Ђb…єŽэ~ 4`ЖZЯnоПŸЌtУђ", GйGПр№z†*ыNмŸПяЫ0ЧЖ,]~§KЖАœˆ"КЎ„зЈ$нСЫ=v‰Ї‹МШЏЭЩ6уЖEр˜РExњ<с0%buЅU›ОUЯ”љ%Ѓ‘lїќ}[ P,Qф^сђТп‹jкn˜З~Pi{Ф MЛ:ф)ЬLАТі~(C`ефDс”6\јтѓЖQ‰иoдпk)i–@Xю† ЌШqпзБCјGЭ-pSbŒБMJ“oжъЙйt~9YШиWEф8ыЏK˜>ЪЖkЮWПЊњЋж=%єѕеуГXXvЊ‘y =ЯhЋw7љё‘U0‘њH/дbБK‘%јуќгЕh9 НЭИrДє7ВШ1 zcЦ3рЄ EŒсb9зфШцХ]ŸpDЙžќщjСРз)ЦdјbЌшЖёB џјхЫTв!фР#V‰ њ­к p2x:оЌрБўмЩїGX#[Zq†_Sv8nsˆ‰†Ё.ПM~К_qМ(›)^ €/&*Ч0 ќfv{ћИ” ЏЎІao•Ј(MuEXfНddОoЋ"р “@$$НЇуЛŸОLЎX,B€РBБwZђќњњnКZ3,FAвIоƒ-СЋz“0MEsіq‡ЬдUž3вЁ luБ6ŠЖД№џxЌPЉЊЬ\}šЬРX$ШБq< иђњњѓѕ”‹x>fчMц9op5џЏТк.в—(Žп1нВЫm ќе$aRBB|Ц!‡мT$Ibnп}˜&рЃИшqSцјћt%9Ф/†dН—яАž‡Ь™хьњЧŸ>N4P:m№~іёˆ•ЦЖ.ЭО\Џ9нvоZˆ[=o7ў"/.ТН*Яš.#ТфЇ[оSў0љКTMo=ƒ‚}ь‡: =ЯИ›мЉ№‚?љ0г-’4@е!яМр9V“ЇОcЯ&пTіSўџтш„ЗKa&г9ЇЖcќтЉЬФ…ї$Ђ„Ћ-Џ>_Яжœ(аЛЋМƒXџ(•§ЏГ›О~ћђѕnЮЎО§8с”_ЏлA˜ц‘->|њ|ѓ8}ИО†?§$ =ы l‘_Л}§ќхn-њьZТ>ФЇц™KУВК№MіiЖ\/o~ј3О')v‚|Ѓўšџƒ`Ї3MТ_л}љtГвˆk3sƒ`їoj3е&AбфОЉX?ў0сь(­ъ"‰CћwVy-aїT3ЩsW—yŸр+ъіzazi`YД“Р\4L;Јњ"ЃШ#ЬЧ•„iну˜Х0ј 0‡ˆIйх‘я˜?›<1š›UЁ9Ÿaл&]щ9 "“alъІˆќѕНьGyЗйяЦ& œtё{ЅX '№<}2їrl+V$­‰’щgchOS3icћ4ЧzЩqы•рж8tЗŠЌЇЕ‹=™ћ Ќt`оN–КѕVMXџF8лжFХЎ№ ЧeO‡,ЇЁчFEЗmyЖ&e™*vlрU™_MзfО=>NkщhLœЗ4ЄЖ™д]—X єв"žkЋыЙ/Я•'\ЯэЄ;юkOY,˜езŸА/Yрoм§CtМ$]lљž~w#@0Шk:–яАляЧ*Iъ~шSЫ`q№7 >K˜Kбј§X:"oFѕсe›9ьчЯwwŸо=9~бЧф [БЂРћЫ”XКућЎcJзяЎ!Юљq’Wѕ@'rѕEгЗ}—; Д@\УЄЎЅpx9TžхІ,љеЧ[–[?<(^:dЮoуТзСЖнВё Y6L]‘ј)dюыЉdз’zЄѓ†ZrеDg'Ма%&/zУП e’wл§ёаDіbЊyФUч +lk[ѓvјiaЙ^24ЎЮ.жьzёpѕљ~ХЬnŸd€o–[ŒЇб}žцm\`ІXАС>$быПџМпє#і›ВPK~ЧОД‚В‹l@сoжaXuœАзdЏя9‘›~З4“Й}`eUsВ‘Žьи5A4Й­1OŠхFБяM"эѓЯ/Їa(C9,cq]&6Ч’|(ТР'oжˆNs(н…Жxѕh8Ž1ћЦЯ3цЏfŒBŠЭч_ ЙчХUj)‹[”NРЊMЭЉПџŒэЬлЎˆy!ЙAкіU  f:іUY`cі7бy.[Ž_n6‰Ѓ=.pвЪi^ўу_чŠ_гЁЖ›*tнЄNLezХbчсg/9е еz‰агW+œЗкŒЙяxЮxЌbз~w\ъ&˜$ф”иЬТŠВ"pмА,§сЇ/Œ™ 8ЛlгІОэцmlШгХvУ‡cЊЄљў§чŸ_cY№&2@JЪЫ ŽдьSŸ˜Ъ4ЗQˆчGЕћмwхЙяЗЪ’ЂS"мOe\ш-6кL\жa”щвДiШ3UёхћїчуCфdлEЅ;œб|xйлУЎFлƒVУ2ёbh]žЂ=Э!`ї}7ьuhŠ И!Юѓмoл<u ŒЩŒ мu‰m8йі;mAН+\K3qsVVэИЧљ{œмл78VуŒєџ@8ЫђВЖЫРБ,хщp1ЃyиTQd=frpУЖЉЋЖЯЌоqІхОяy.ŽtФЩ`п_6yшшq\0&ЃчуnЈђ,/ъКL}їuт2/iNчР’xQd^жƒЌХйjc]е§iRєЖяqjzЈъъ<%и4ЮkЧ§ѓї—g0ы]WЗ§іјrЄђ|ид1,!@!Н*рƒE3TV0н0tЬйT6mKс9•DЭўpиŽtМ]<рї6wщў#g9aQ6]?рАьM 6ђBG вікАі‡ЁŒ‰ДZЌXЩФnдЏ@ vЙž%­LИDО[™Ў8Я‰Vдс˜Ё ŽоArлЧwІ–*н|`qh ЏОLxФ‡ЬщШ;ьл Нm‹ˆШѓЛЛЧ‡›)ЫВЏ œVКMтсЃdлЦђZtBHО-ЬY7пбЩХ8ЂmГƒV­4€”ћO ѓГЈ)mŽђpu_0ˆьС„p„шІIKхXр‘вєііцыЗ‡хЋ­ЕŽЭH„ЗЗ+fyuЅКљБ-tж33ъOУ0qј~Јгаw§4ѓ mіёj!ьŠсEХŽ‡“вG\ъ „Jœ_BЂБŽг ­ЄЧ‹…јГ3Oи.we`,nnяяЎfFдA˜ШУ@™ЩaE'цlœх’љ–‚s#пP—я~њ|ћ№4gXfО4ђ#8!—уЎєmРуAGQ^Бqж%vсДqyFАл,Ж‡mY"Г^3ZXC™Х~ *Г,Etє€ЅЉ)2ЋХ’UьШ•ХёЗJ^qЂ•qЭђўЌъв8,EI‘њ‘жw/;5R/й@аЏaёЁц§єyЌљ%dтxнУЧCrЏ#CуfKVS„ё˜eПЎcєEфдh8ГBpџ~rSч‰чљ!ЌХѕУЕ§ДЎ И_В*9ИЗЉЊ"K`Н[тtЬкРžœarš…3НйРќрі!-юЇМЈ g+YЕВ*‚@hOв3LœјЄHпёџАщаZ<с­CO|М{\ Ša…9МБKvOЧŠ7\}?@O ^М”рн јКaФ0лMdШЬјnœ˜_0Њ•ф€№eЅL­ =рї’L‚~cnъІХШџ‡Итj6рђѕ#ї2}+ "@ю›Р yvНІY xзцМі$E€йуіџvƒћNдrХJŠhƒ_БŠ @‘EŠCYаУёgрUР\њЎ)ВМBЩdмШЫзБf6ЅUгu.yЇ,;-KœЬцwŸО.$X*@•Р›ІУџŽ„щЎƒaзž …бЭrLYт)NбTмY.у$нŽ„œ-ђœОн@6яЪ$ŒгjCŽ<њMƒх6žЮЎY"ѕ%1OДН$rфйзЧёЭчЙъF9Ш-E€я6-ЬvПэкnгчцњ™F 6Чƒ*Т a-ЪЂ ;Zˆ'ї8ПЄЎ€Єх'5<0 к еЕ7UЛЫˆЩŸ-UЯ‡ФТР;Яд,љ)IKЕpЪaРŸсcсWЂLŸ к^ьШЂ(qгЩ 0!ЊdЪІуW;Вја;p!ьЖ]љЎeUг`Юѕ€yžŸФ‡c.кY—lЫжDxF№*СљЪФЗTQФAДдр !цТ Жъ~b‹G=нм=3МАP|§люq§n1иСгжО*[~’f€ж‹фхx^“цЅšF№žy&Є,slw} D`Dн‰1{січІ'^й%њzЪтДzž&ВгІ+^‚`'ћУИ‰eNАhЩlУГц63ь ЖЩьj1™вrXƒЏwEь]ОEЭ:Рє‚yбШЋ1mG1p%\SИДЮKЉАЄе’EY5MMZяW"{ЂЈY^Й=уnммAяњТ(FTTU„MЊРВj3БяСE.>xсќИF‹ЁMёљгgYйсі„юbœоЖ№’!ђ8U–ЙХZBф$ёœjš& М'Пvфё3œT'NQM5Џ€Ox1#ŸЉ^”І!–[VБўњуƒ ЎXСPЩўГ<`*OMi5ž,(FК-—‚ˆkY&%ћP$шсy:'"Шpƒ8žD‘ƒ‹yГi3я ~IU$ЭЫК*А„ЩЭƒ'iMќѓg№A№GътђщёёyЙBІ3}Zё0l “kI‹З;‚ю0№:H*€г&ižeг4Р€m„ІŸVeъ_xКZŽžч+^w’ЖЪТ|}аЂ$o–’=<ВМъmJ_—˜хd2yžЬ—ГћЧnVЫK5+і?ŸЭ \к# <ОiлЖЊЬMuт;Р‹ё,1H"ыВ1 †­rдšSlh“Es31спLф `G ЄM=Sз$Ёц“щуЭЕ‚•QжЁтєaмoœjє*’dtчэВаQ47№mYє іY+РŽXцˆ›1Eь.ОАA”еИƒЗC ГGЄG>pf„Ъ`€SшегэXЙэЦy]7§y‚aилэžœ+!`С5I WпеUyЭhЩWQШl+—Ч л‚чщf1pKp1ЩЭHbˆmк:C5X]“…ёЭZRммЕm;є$rhБ'‡aИhЉ€м ЫЙЋЋ,t –vŸФЁwЙ|ЂІ0С№Й$ѓ, ­еЇU˜d5.ТLв‚ч‘~uuЃ65UИџ з…Ч$ž•2еф№WсЎ/{– YgzIž†СхAкsX,Y s ѓp/GIEќl \lГ%јЦь*ѕMˆП‹ uИ№S.ЊСЇ"Ѓ~Рƒ-\‚Ѕo›š"Ћо(q-M•9VvУМ*Г№ђ -Є)|ШZЊІ ­Ѕ—Ќх=9:мяћ*ЏъžаHŒ-zH%Зпќвv,–‚ЌЛхЋR№QOxЈуЩ,ЯБЌ ›XЖ ‰TУЫm“G~щ WN’zмlВф!уbЩŽэEИ‡JЪ ЋaЖСc‚,ЃЖMjЉ2=yИ§КдOЪЮ–Š{2hœэ§Pz†І“§Žеšц8†“t'ˆёxМ)ТрђЂ1СЖИй| 3ˆ Ї@.,ёРeсkиdže‡ ЦфчлђDлВШЌz@„Ї—O7x-ктLCЌС}ю&"Ч8qшытzЖdDЭвМFЙаКџ Žєз Џ[D‚О,ЋКю№"ТžD‚>uuHб§юœ/Киq§8M”Ж•Xр{CЏцГщJ0г=ёYˆКLп)фюа3ЭŠ,j OŸ*€йoP]Cn%ŸК-™SЮƒNlUд‚–ь§6ЗUM7]›ЖЉJќdЪсVЄ$AJєj4й оcщ’PКьАn3ŽАdВbГ Q0}ї 4cеРO*˜`2тsЭ §Y%uTVqыС@CfЪxšХї`™AU5 6L< ? U8т C=`ZunQт… ?‚№чй—пEуmп‹бу A„ЈЋj‹CzK…–ь’И§ѕz6б‚f˜šШq"F40/Ўzђ\чВ%МИн ?Ÿ{Ф“gexwдyƒ’Bн4ю8HNшгЗ§ДƒA6Ё#QВSфЕяЛPЈЩуx‰‚Э<юvрщ`]ƒЛbT?`9жЗЕ№…э9вЃ<&Pwp.MƒwѓEы–ыЙ–eh&МtЧ„ І(ЊсСjпbWКSСуqO“yъyВ`EРбkQе!І#JˆT=# Гфa˜7Рї'<9B-јоУgЉЗ‘МЕ1!вЃIœЈ ›Z~ЙƒdŽОœNq^ Л§РЉ,с[ѓ<3ЅDМыI|ƒLє`iR.byi_ТrS\%M`ŠЋE­пррlFžЩŽЇkŽaU`Ао‹ Lл>БфйDГ‚ЯMH~ЉBШЮ"|ѕx3чLk†ешН0Яј#Лm‡‡G† Ќё@ŠdБ.!upoiњVCЦр‚#kдЗCUл ‚5с‡ЗDDЭєв†l–b*<€ЯЬ?~˜РЛјЁ;EOŽ=б;№Ђ™k`•P†ЈфДЄ№LљMkЇy/ŠЂРЕ0ƒ#ЃУД•Єrк5ˆХšl~FЈ]шGUъычч5І:CЈBІu_с]з рчxР6x аЅЎ)НЅ€3ƒЉ%‰ЃЦzЎ—BТR5,8m‚€_яАFV™ЃуіЛ0П3’ІЁџcн?žЧ#$XЯg№ƒ}Ъxƒ7„П?–мЬ0LђўЩвXL o`œЦ4сл€ŠtЌ CмДСm|hџ8хeRy•6Л гћУjВbи^RЖњФR?LJtс9Ы_š…Р™HUљќЄн‘8#`І* mUж‚3жtяS3ž0DМшIЊ•‘lх–&)–›v˜œЇS‰мЖзqЌ7Нн,ј~˜5аІКH#рžšj%=аG†M“РTkсfw>onbр[†ІЉє‚SU38зZœб РB[чЭ[xЌhЊ\Cт№@Rшл”З§Щl?Œ“<ЫEрФ*'AMn!SQ#љг 7fMXм А‡тŽ№€ўПёŒЦ-гŽЛ–€Ÿ6‘!,ŸЇ šyы‹М"№ќcŸ%ГŒb5Омгa“(‹Ў:љі\Sиwчb MсжМЊY!dD`‘G<ŽЋ|v2Г`5xhHN//''КDЭчЫ7(жќ [  TЋх%fЖ” ЭСћ…uYAWaйQƒ0bит­ф”ОŽgž0h8pqH|Ч.а!аHЂˆењЭзсщДЏ#зTUУ0tщ=юRЮз4Н~~x tзO7e‡ЬQАlлЄw PoшлК.!ЇhЌЕ\<ЙРфRš€­UУ‚ uш з C<Х›rЦЛм#‡—јtџЬjf{tŽ:а8QsТ!>Ў4yАVŒкКЪЯF<ƒъ~CBЧ6вA1М()ыfƒ/ъ„З§ŽdуЕmЪјƒБЕXIaVKFБМЄ9тD kеЗэИ?€D  Щ“"ѓ4šu‘5Ї&oщьZ7=МO4 NХŠйsљгЖп4yшМљrZ2W{0QŠзнxx=НєБM/TРKp[В­1l|EрЈ5"гё—бЭ‚$еСSщ§ЁuњYФ ЄЦЛ=Љ™эђ4ђYiˆWˆпxаšэ… №PKeІ йЖЇуЫ66WS €ЖуaжCЌмК2=љ:yџу‡б-ШЊЖXћЛ2›{˜‹К…7/вЊЇ>ѕб лr!Йbы1г–uU0?›‰–юё2Є67g%YцУ€ƒt&.Ч3ŠšпС 'Іаc8рžP•ZЌёФ‘‹IѕЅѕTžЗз5Yz‡ЫуЊх1pe`џ'YсіЇзз}щ<Уђмz%™QO 1@•ьIГг›бRСђ›ючmМMъ™ Я ѕ :љp:AфV+zН~Ї›уЊ 0рG DўmРћL]‚GS"GзК[Ÿы_3п6 яŒŒGДЊ9 Ќ>vmŠ H$AJsЋ§iWњІ"0ЋЗЭрџЭ№ђiо`dєіјњњђКo№…Ѕ‹ЯSЭ)0У‘МG0tq:buyЫ„ф#о Эq/зVз_e+оBЄ/"džКє^їн9XrIƒЪ]8Нќєњr›zЖE=)NЖ{9‘ЫrmSСњвјчбJV“д[R]$vЗmАBкжg7Œэ6Аv{мq„ЈєnlжВnСКoIэпёхFїSCлс%;ŽчC•ЁЭ<]•VїЃ'@дІЉ&ЌvKŽ <ёійrˆ ‡}пbх˜§ЛJн–"€M7ŒгВЊК-КФ‹<Д-њQ„ACЄо“Л;рш2;О§8ХыNКпŽ}СэШ|р!ј…лOŒaЇ^СФн;лxПЦ'ž0LМ—“6Ч—^ЂК|’Ќd‡їW`ВkO‘eauћyєџ>=S,/љнcЗЋгk№`-RŸџ№Фkvкяњ‚ПЉНcjЭА,‡чТYHо<3q6•э ЏТИ‡DE~§ќёѓшwю&ГЏЅ„е]тъВA’Ёžo??.yшmи–ЎМcЫVХкX†ІжєŠRМvпСŠ“%Y0FP‚ƒB‚9m|Y™йчo?ŽО˜.—kбЎрOЛ:ttn>ž,І‹љlО xеLкrс›RкП4б6mлд$їtТЛѕ6ї ~MУмы~\}h<_|јнЃЛаDнNzred_…Ž%MnЧŠƒќЎHŠW`єїѓˆЗ]зУH]a(бoкШ–gs0В—Д˜B№`R3LўђЫяџ0ZHЊn9aГ'Л2ћ:Ръя‡ЇЇ• Жур  к;Дјяfр% 7ї4YOквбЉ‡Ѕl,mМ1„јИ œ дУ‡яG<Œ-H[ВQszй˜‡wŒjZя‡Ржо-и§l_ ц)6Œrђ*1Ѕё#X*kЯiuЁSЭLoA qШ…ј#Йќ”Z†ТNОооЎdˆ@Жуљ<ЦХgYџРАMз‹г$tнЄ*my3P7;rІ1 AeЊТЭ>ŒdУєв– ~мMmSхІ_ќюгh%(xTfъъХ…щџˆ ŽNWдБ)ŒО h- ю6M™—нžюёtџe$Р|Fќхy;Н№m]ІЇОљ§h4Ѓ9Œ}пЦ@6c…QYz5К“l'ньЗuy U7ьБЛИ§јqФЈXVпCІXrку'ЧжчŸОžKjљnрюџ7 xFDUюѓбDs‚[‘иІyv ƒицъѓяПЭEpjМ €нNЛM•т%auёi4š2xї№—єHАlзги1—#жvS<Ф7uM7ЯwЛвб$њюїПРPЅР“АзМ]†%}0jm2Эe]W~бFk<< эЃ‹;qъYАІШtНС& kњЫЗЃ{VЗH/мєл’уѓ2ѕѓЂžў З”mл%ѕфМcћы€ПЫ.šѓхГF­­>Œюёž|“<юH%ўиЗoлАњV<ой§ulMКЫ1–х@шŽS.–Е}‰рЂwn[z‰З2№:ЋcZl 'Ž`ІeШ9–Цџ”ъ_5Š МФGŠ,о“+'–љо-bпТ(ХТ&MЃбУhm.ќПZџєЦ8YЦ’ЏМN МЧiЪеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjWTќЕёЯ'Ыђoх~ѕ?cыПseљЗsџњяйŸњўџію`џMУ ЗтoЂ“РпВ§—гi K§тq4њxў"#ОWЫЧСXYSaRўЯJЂы&yтл*НZ-GЃoЩuЯЗЕ_ы†ѓZљ§љ–œю83’,S§Ssкі“ВN]…-ЄбwјSFEcО[[аџнŒ tUže†^­ЉЋК‘oвŒсXњŸ:ї-dЫIл& ”)ЮЭЋаЯMх+JДЫ§щД+|m21Pџъ0tEф;И…_Јƒ‹LrзXŽе0Ћд kыЂЈћ~ПM4NђЋ:2дsЎћёtСиЇ­хЭТ‰šуБЯБKБ6--Я1‰1 –mА’ы9Žј03ЮХњ~ЛщwЈЈ•Л†••el’І ыѕ|:™ВFМ{}i<ёю\gxAuIbЧŸFvВљцZБQёAFсэщуBs§0ЮЊnг“хЛ6 “Њ(KсQЇPзЯkєOЧЪцч”Е‡cыЋЋЏ_П|ћ ь(ђєw}’щњЎ)(Žc›вгw'Мn{A„§аz”™кЂ*ђ*ГaЁЮ лд„љУRƒ™>жžІйqsz=žђ№нЧЏЗGšОѕЎНXЯcŽ#G] и6gqїсгЭуRд,д^ŠЫХOКІŒТ’ЂйžN}ъѓ_яhr'c…uтшялLCа­0-~От˜Хгэ—ЇХфсыѓZв ]wВэ~ПпlъРvгЬж„gYЖe(ѓЉnџјКяQ`ПƒUшPO$sН§ВE!ШwєkСДмЂєLњ~JЏІЗп}сT…yј|?g8VВ2ьyжoRC1“ТејgZи”žš‰ўц?ћу œ>їmсyeС Žд5эf]‰эЇпZ"рЯЖТ>ЕMхYєЭLVЄхЧ; %wїУ—ЇЩJvЊэpњ&E#Щ™ђdІ5v)ИэыOиpѓАmѓаdyЧ+šв“i=ю6Uиж{QХЖТrSЛ&}K;ЎgR+У…Иœ"вфљ­†*ѓ%иЭыщххА‰MMXšсDеrЃКпЖЭюИнv1рBю=š5-LлЊЎЭЧІŸј щККъілмQ$й”Šшb[—X9ЈBєЏЊШ3KJіКзущхАMl %1ьІjЛЎriђ‰6Q)I•QР‚оЫыы5џ‹Ня~ŽфJвыB!…є“юітVKrШqА  muyяНщђОЛPџН2 Г{kЅЛf†Šшф08„Эz•/ѓћђхЫœ†aррšБкzZЌIпЪлъ,Т&Дz'Г"г |лфзй+А:6a‡Њ‡:MЪІM-UœПЇ,ьг J—§щёљƒТшЋqЪиё0Mс=с˜п`яЏчwš\НЉЮŒІ;Бg ы ЯSїќO™У^bnЗгд8ИМ"Ž@Ыде”ѕчЅЌbПwЖi~„…~zўч=š 6нахЁgŠіИgЖo=УJжЭ клyw7ПОeqtm“ћОО\a‹ЩЧЭњJXœа7 цѓХšс^”$QѓЊчgXхЇЩ…Рѓт<Ю0Щ`ящ"E Ічр@:Žсј7s œfИћО …˜__-$7як<ѕsѓ ѕ4r­ЏњуиD§)ŠW-GWщnЩ"Gl`O8j`Sh’4иЯ‡:“аŸ(ђa[–aМеD(ХДЃњ0 сv„рЄm“bц@YЏд Fsкv<ЕЁB­яЏЎАПЗЎ‘яЏз;Š“UMaWДS?=?тЈЇcхЫф–сyьd(ё,'ш^\Ы,ђ4НЗОЕбM?УЙЂ]Й\'Ъл:Сi’Р(#jqЄСа‚ŸNЕЭчŸњУWŒЊkЪцУЫ‹*6X4$ЩЦ‚>язЇЇ!ЕQoWDjMЋіХpъœќљІё6ТFX€Щ6@`лКюА“ЗТ‹ВФёЊ—г і|рuнл—M?’~1œq†i*a_Ф8fжЗ%VЖЃВ­ЧЦ!/šњZO§/џsЖсD•L Ђтђ~‡Ј*šЗя8ф‡Њтx‘БOtaёёъњУХЩ ттJ0Ќ(‰уДЌh†ы<–{) (Ћo›КЦ XŠ :Q1ДešDФХзёјЇїЄb˜:МчМ;р%Ї8ЭFS\йu]л4NрЦмЃ),>]_ОПЃ%Mз7@SCUa#БЖЇЇi+тk>р˜6AуœM‰“ьИХё›-ИjчЕ6§ЛЕц€ћ ЂВ?EhJ4%hn\Д€ыzˆ4ežЄЮ|Ц>ГИеэ§§|—ЇKыKJ‘acВrаРуfšЖ;ц6ۘQ; kŠ,-Ыд7$^їг илБKчЕ.фGz АЇ!ѓta$+Рˆ?>ƒ(xŽ3p^{*<И’5?RЅхЯw,ЯsЌ F§˜XКЕяqєэ˜лЅъ•8ЛJ|ЧvУ$ДГЏћ~pюиЏFŠ…a'жЁЩВŽуˆає{ЯT4Yв-zьћ6s №4†›,/~|р%YVдŽ­ЏŠВзNгz k7WРѕрАtˆ­ъЎkK[VЗ –7цoР-`њгtрДуИСфyпе™o‰Ћх–гќ GqРRЗ8r-JіESК’ДќАSeЭrq"lю(k–8ŠцT{Ь\rУЊkЊ,M<G•ˆл№tš[є}ъЏGЏ˜N08<4eY5аRЄмˆŒнЧ‹­lЇн8ЙМЎvXW EюЫђцУZ™эЦ™Т;JЯŽhUЁДЄL'ЪВ,ЏС;›ВРsЛЭ ŠНoЧvяЏ.;Aб№ар‡‡Ў.В§>Ibœьcќѕћ•dLѓ1,ц18хКмœMй~кЊj€\ˆЦЏi#?рДС!Ø-УF‘kjя-'ШРеє^­оR$­и~Rудпї?MљR†\|О-ПžŒуpЌ]}ihЋРKlM!чŒЊy‰E–†–нrЂРcыдšUM пa^7Užюїщ>ЏкУиdь‹зšЧV’снЩЖТŠїр|Ч—ѓkњХ№2В{ЬTARMxЪŽWTYІю9UЬ,ё‚0MГqўzy‹9Ћ†ы12DrqЕгŽRИsрZv˜Vг ŸЂy?дО"А БИљљ#ЫИОe;уІю6’jхx|A…Об;юCз’q­MGжшNд Uh!К%_9кJsМ(Рћ/>,tŒYuSЗИЖ<ЫJЬЪс\єgѕЙ tVт7Ÿ/ –z{ЧЊі>аdfўРŠŠд†…>ŒSЎВ†ѕ6v‚Ўђ;рMб5y`[ІЁМЮщ‰xдФЕєэхН$bGжтЎщЛЖ…5ўЂ5ФЗЁЫOXююvИYЉV3RРі5m:#EЧˆІ{˜“УЃ"э4žЅ‰хн‚RM'э†:‹=лV_Ѕ4kYAYйт– RDz­šI‹ЛЉŸiM;џЫ_К2q M$жЄ I З dХЯSі€Sѓєвг*{„XЃ‹фI’DЪрKЊ~hSз~]P$с­!ЋѕlK­з+оЏЧiŠVлКˆўQœVЄR%rMё‚Јpѓ•(i“:&h-В‚YрГN#&…qД-ќ[т<{Уv~ВсР>щЊР|нT[Ъt} Yш{Ў­KлЫO7‚_Ž/+…иnФLo‡Jcт‘пЎ)dіњŽЅ‹Ш2dIо(ІМ;ъ щp†oлGА‡ОKо,XеАМЄˆэз†R]ЫІLqjЗуЈлЫ ТˆšC?Йцq˜&œcRЌХ•Ћ#g`oAdцŽЕ t *+Ns@*9 8чЂ7€eЪдаREЎ8џ<'8йАќа5_eд;лЋ`3.ДHоЯ ƒрd‘@Г‡iЕрMJgЖ&юno)ƒ Н #р Д5_bп€,В$I‹КCSы3OЃ‰ЭfЕЂУјЅgŽВMEЄѓZX3иФ0Жz]аџ”.вл5‰~$‰Y1Šnъ2„!ZП“ѕGфdP9T€€FОeM‹ГйћNh&V”dЖyЮ[Ы€rФzy{Лс€wЎ*@Љ]есG›nк&Б0tB(ЧC-‰]гИрВШsѕL€в=Ў+MЅ}FЖfЧ9jнM‘ЇQмœЁxUеQ9 ёЪ3љХнќnО`ŒˆВЯ4 @Ч№†ійіIЬY10A.2Ы‡t‹axню~x9ўТc]` {[Фž&[Q V]У"ДE’–H‘ТЋВcАmL|‹0U`!Э0РqЬ†` ЁN[6“ћ*~E№’Є9Ж(№ьњњюи;Š“ лЫК "ОФІ4€ЏйPлlGA\vр Ћ}ф(ЏХ’Њ8acё 8Š ШГ ян№'Д{=Wлt•Э/ЗBьI ѓЇї——ЫэŽf%ЭtТ ­hђшшлбLЊPc(СТFq`#ДAяА§udЛ“ь Эt гЊГШ`)|сqZу– AНaVžИ|Ш СбњгЧЋ9СpрБ ЫMкЩo`ТЄ&Д3OZоэTзѓ]CцhrН ”ЄЫяѓ$x§йœ%ewРŒ!–[мбVЧйфЋІм (иKMЄэn—4Ш–:ЌЎo0jžTЫнуъОќ—ј2vEhАAСSq,b‘м2zXРгСZ›ЏVкŒ’ 7 ‚f›МњхV[RŠЛpЂŽM?9ъдVЗ[šурФ|ОУ}H’œn{%јŒЩЅУsNLш|.NfI’‘t7 [ey3ШћБЫ#ыеJГ6žРЛ~Zж @дw =ŒїEлЕ§aкV8Bўi+_с–з7wkŠe8vusНdXРЦk _fвO№nzJLNCLmђ/Ауш}фIpЁЂnђшu†ЛХХЧ{ZŽьЄŒхэЭ‡{-т=б•/„Ад™Ѕ‚U\Э›C?\\<аœ ‚‰ˆ’сqРхEщОЉŠaуУP…Жi…Эјю†‰єАt…О§УЯ”(˜вH^5т№€Ђa6}Ј Hњ–`EйВ €с4УK†‹З"Я}§)L|yЗX’р1оа–@tчЎВORєnCBАїС)хyтЛoрЅ…]oI@ђЎ€ЭEСиIЧ ‰’бn|ёМe8*+(жnГX^тЈЭ§ХЇ9J?>‚e №}u:–ТJ–я{ІТТn!:ў6l лЗ^UйБ€yТ(IїћЌєŒЇ™˜съ3Ч”ХkŽ“t‰ЁЈS`WEЂчЗ;ы--Qџ8ЙМУЁнћ8œ’7ќмЈcH,АYжЖ1(yоысвl:wmžПxм/№Ђuщ™ТVr‹)4?іОЬs’j8Оk`ї,”ЊHВЂЙљˆСOы3QАIЃМB фyR`oрŠР“žћWIXз Аъ_bЩ„еЇёPћ–Дœ >|:žњ@ІжУЫ8ГVЙ- O€iVУђвv:FЧX&1І9РS€ГŸЭђ O>Ъ=^™ё\ч lšT<зOВ šТ ,ѓžpOЕo+[СJaSЇqЏГЋ‡5A‚OPd!yEsТ( !”vSlС я]БOѓ,УxеJ‘(@Йр+=ЯqЬ7(Ÿ 5Ыvэ!ИA”Цул‹J№]ЧкГЄdТњšу”э%зЫ5L@иэUЕ‚=.#ФЌ—˜JёА8Ю‘BŒSqмЫЖR0eЉЎ ях-J>8MзTUv€Бj˜(Тћ>хžХю4;ІкšУXИК"sфzCБН\sВЂ›^RMц„ƒЧ*ВuУЭpэ'‚@ЄсcІ…—5оТs`%ЁЁŠ, [Lз–—dxЭђk@@t6kУоwУЇW@p–?a™_,™щk­И™Ъ…Ž_ p >š‹ХоИђXжзч8|]зЄЗКђBщЎЅ‚БЎv Г"dЫёёžVжNoJЋ•†9Уў8ЁООˆMA‹І.опяDDБВ~Ж{Я…— БД`Фг9тљ4АuU’йХ| фžHѕkФЄXzмzКdvЕŸдXйT9&ў=Џ2Я2Ѕ7ЌљftD q@Јƒ€ЗЏGŒmЧОLїxЮЅАŒъV_cWЦ/œkЛиВВ$kXЦpxљиЊР:“Ї|:$К,@Œ’4pэ7НО Шјw–Ѓ†&z&?Чгз#Іѓы"vM‰Sltж`УXяёpWUшеUЧвЇ)юЃПыP‡щy;bй)7eŽ• ЖЃПн6œс (@ѕ}†1 `ƒТЃ уЪс?c[–Т+Nё…0MБЬMJуљDзMИЃ ‰јСЪš”,Фz:ХE8cНU9я_ЫzНœ_оRšћRњu:ѕ‰…Ч+Ђъ$ &~vežэ#GUy‚С|‘хШФСЂsА}ОZw—І ЎЉОpsУѓћЋ]я,+Ўб"ЙЋrЂ‚G–Эс 7РьВчЃћ€№&М`Ћ7с#И72АЇѓІ? Цј ИUEŽњ+\Ж%†оомюdр^еёщщiˆ,ŽTL7ЮXф [РsаST сфlЖAd­ЙеЄthєƒ„Ё$ЋdхOЯO=І™pd‰g˜oо„”tг2Є-ЫY^~|~:ЬйmСЄШQыгЁ 4&y„дэlіyIС›pЪ#вvОF^R€pcјњў8е€Š$ПДO€ЫиЏ;вњ{‚EA ayГфu;Ÿ…Ї-зиCpуфЖkGйЭЏБО~7›Н_увН 9ТБtццзБ–иТЅG€\ˆЙm k_о~#в†iћИЬтž”-ПУ;_пЎ@bRЌМgЗ єЭ‡йь —i'§aРьвоRˆ%)сE№?yЎ#З$М&Уіфо§џЅhІусs ‘кq†[=§њд†ŽD€ђА4>h\L—я9^–Dz1›=(X1SM №ёP’аЧЪ!eУгБtфнfГоОВ”ц ­л@ БЬЭвTгCЅ™oЫœ pЛХN1їS„lљ7De6Ђ‚u@ХёS}†СIžЃ Jѕ Ьx†ЬюО–ЮЬ7.Ъ<Ѓ(LћчччЧvx€žeъf.™с€wпmŸФђШ‰53Њp™'zи јc€€"u7œx„епc>[ОZу ЫІЉrМЌ‡Wо œ=wmuuЭ›A;нR8tu‰•Џ и(ЅЈf7SЩ:хЁЋѓ8 Ь.?ŽеWљоЗ-C~S„їчBЉ`ЁyсƒŸСыlцxX{ †‚;PЇХlЖФ#/Aј}|ТЯA0 GМК7ьЈ=–Ђ:ouшя !AXУ.ЇCDŒТ€мАР‹НdЌ иѕx2GихЇйь#СKŠbF €аЇц‡Ж)“Шuд›ŒсІэqЈГРрёKэxEз‘i„a’7X"п•ЉoЛKж№ёn2^ѓЋC 'Ћџk6ћзO$Э‰f~šн АvšФX€*^џД”t7эz`‡`х_Уп§IV€сЊšЊйqћˆ Я*Ў9#ьЇЃ‰УлЂ@н§ј/Гйя~џсцa'h)^yЧ&Хkp’ШsфѕЯsF6§ЂMёОІЪАд Ы2 ,CKv~:ф>fgШћ­b'р 0;6Є–,ВЫwџ<›§ўЇ‹{ %VyТ;.` иEŠЧLWѓОЅŒЭЏнкˆ’dYтhrЗ]>pцўа†Ж њяАVƘ„‡ й8}ћ‡йьчы-'щVм=Cи `Џ*yw§@›е–тУл‡Іёі№џ/„е­ЫЪ;_‹’ц%‰v86Ё ФМџј#И№йэŠ X†ќVнџ@kЧЖэ0‹-q6/kл2ёсн+ŠюуXbZa{3›q:Фj,uѓКЏ™hтwjRЈ; О0ё`-5XhМЩЂ—ЌH?Д‘­Щыї@б€ж„ѕ[Œ˜x }иХпЉумLЖ`л{`ЙЛйXXфРЪВ1о`K)ј1ътi( јюЧS›ХqЧa›TМƒŸБ ОFч”џ›p†cƒe›XЋ –Ђы/:у”§8т™Й.o%›–пŒуууPІIВŸђ=0šЌЉoп˜œš'‘†9нПQРёy@Ќ3 Wc›Оє(ZЩXшоѕGРџY–чEUЅ‰gлщЖЬwшІHЫSŸЖ™АЯ†Цћ4ЭЫЫиЛГЋГ—nS жк –д6mХ@з^~Рwl*щоgŠSdнTœ9UЃNJяdн№ЂЌь`wЖXzS&РФО?_ЦДdМXtоAXZ 3ˆ@'еY_…,}žUьйк[wђјOˆhЂq„Оь 3xoбд •Ÿn`-N”5№щ тЗ]НwoвŠ№џ%МfІЁ*Њ•ŸРO$–*‰"uџЫєЩ  В‚эНњЖЪ3 МіЗюWљїKН9’’ѕxx|l=…#‰ѕэ‡?LŸЛy №Т™•Xц{xт;ЋћчТhV:ž[W&—‹ХќтЇщЃwЫэŽd$@ћФеWџ Ещн*–W Уiˆ  j6зг‡язФfˆжТ*Аѕјї[;LdYwРNƒІѕG`єА!V О”ЧЖTžц;ыљЂли]oпѕе>ТrМ—KAлнnљўЫЉкЗ€ћџAQmЫv`ЕгЊЪAkЫzqПБЅ§kAўd#,G§EiQг]ЩiAрTлёlћвV”пВ т+‰ЂiŠЌСІћrћ[PUљћcЂЊ~йu;QV~CŽљ,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,g9ЫYЮr–Гœх,џџ љzІќЛeGQѓ7ЎЇ~doи—ў-;œЩВі7НЏ'|Ябeю{і{љЛТHЊЎищШf3ъпz4аŽІY‚]9uэOзšўmлzџ‡ф‹ЕRВfЂи^ )_дћ4›qиЇОЋваѓ}зžT%DгuLщ{н&чlзвБ=6cВ-ЧKŠHeEœa=??}˜:6yпзyšІСдDqќ ŒBчЕBћ1§$№У №\Я тВ eVё|ЧРЧ`ЅyнДЃzЛЖm"WžЭд0ˆС^ЂшMЦ§'D Т<ЯŠ<п' 6хЏњ.RxеKSЩйћ[ь‰fšn6>>†кЗwГЅuз8Qь›wvрd0лцuУ3ыЊЌšЖЧНЁšA9šJЯ~Й-ЇъІ“ OЯCъШЗ3!Lšса‰gkи\ь›ЖU1,ž]IрвЂjКЧкЧӘ{Ž–Y€Нzпџ‚НpžGѓєќд†њіѓLіГё8фЁп…/т ‹И&ЮоЭ9Уѕ#Аб—њ4yьХy™Њ4{їѓlЖaDеђЊЧчЧЦ•зї;#ЊO‡Т7%zѕљpˆžѓлПџ›Ш–Ѕm6ŠЛџЧŸЎ п?vBЫЫКЧСIХ>Mі{”ўљfЕ^ovЂэзи­кзxQЋуc[Т§ћџћ™рљžљ КТ(иjnН$n3ћх—O—ЗkŠWLлёќ(ыŽЧО.B7mMž]ЌiŠXмэtЏ<==і{пѕ“ђp:”EОwy{1c\?іŒЏоЌPСоDђнБ[^Ю.–ѓЯoW;^’$еIКуiьЋHWьШеЄй ЩБфђъ^vŠгЏПžpФ_?њ2ђ”ћ BжИaјйоЕоd–в?йАCптЎoWЋљ/Г/q‹П|ОYn6;йЭњУЁы2SЭ•ОgEYпмrVz|~~œк›іeyqЕ6нРх оMъФЕэЏЉЕЄ›AфZдХ’ІзŸg  ёўнП\\Я 5Јњqш OІy3tTaіРђKЬяX+9ќњќєјќtЪФгљѕе­рIbr”еUь:o0ё kn9жцŠг m7clзƒeџсуеѕŠ3S|їEhђЄфDЖЪЮцЯRФrХёсз_Б[u—…žJо_~О“ь(+"ƒ“§Њ+BлњzžOЗм$‹,}uЃИ^h0ЂЧЎОНМ_oh5hЦОЫS!wjX9›“MkBаУёљљзЇБN=SхˆеУ§’жмИЎ"Cs›CЛІёЕЂŒeЉЏЏ/LcЧіђ*Ж%’сХ+‡БЫ\U ю -L a;›M›d„§угЏЇvяыЂ p<@k‚3ƒЌЎ’ИББ—.}Ѕо›„azIžљЖE^vTTYš5џ‡Н/koф8ВХЙ/ѓљ^{,Kньfs_Аз‚кї}пW‚=џ~"ŠВЧ3іŒ}‡ Є„%A‚ЌШˆs2#ѓєu8ЮТ&аИЭђnЅ!zqПfшеjI№FД}9МЛШRQЂ ѓZ4ТВякнЁЩCKWиA"н№т$r SИЛ—НЈв=рmфŠУЕУА+ЁЄ›ЉЦ*/'їdМй’ѕx8О_wЅgЊšхzxџ0/(vTіћуОЉ пФ;Ъ?"]“šсgКtwБ‚)YЁо`п—YVдЃb;”gгTVO}™œ<б 1}z^ fО{9BQЊФїТ$Mуоeд™C аЎ­r6у#&уZвLлБtxЖЯ7O”l‡Š,лЅQr­L“4qT-„ицn'K–gЩх‚œz.П|?юTGйё"ЅbQЭНtd9ЄыSУ‚&7 ЏІ%б$ЧГbЭЈ^жАrЂZPXPœЅI§ЈH ™Йт(ЃАŽdЄЛУёћы+Єъ#*юьaмЄдE^6HЧ€бp]чдCM(š.m(Щ0rЮ(†eJдl!и DШЫ0ъSэЛ№tWфUSљŠДў6“5 -€.В~TBЗG,1(*Б‡АиŽ—ДFЖ†‘T]9ёњd;л‚6KЁ |GЇяŸEЏ‚ЁEзіCгlyФIUŽ,Ю.цš9оšнўѕћwj{=М‰9cHэЛ*vUђссљiIœZЗƒ:ld3›Юgkйєѓ2ё]cvMУPЃšюnпірЩАm2?xэЊЪъы=ЋЊO€И‹§wузУё№ВoŠ,…рGmјаЗЦkšc6фz~RŸQ(+*CZ=мCQvѓЖЩлнм‘fˆrК9ђf7КŒьмє\MуЎОNQVPwPѕ‹уїl`]‡pЎи~’x2x‚LЧ2uU‘N)О%Њ†…oЩд‚VмЌmRЯЕtъžњ7*[ЗeЗƒЪfЪТ†иšЁ*ьеэ’DI™5!нёqi/6„ #ЃЌБkс8ГІF*ЎZђЩqHУАТ€0кЬUтйŠд˜_S‹_p&8f5„ЦЈiАлѕ1Œ(/№ЬђщсёљюЧE7]?.кЎJг EhŽcy9v}x# ‰SЌсй0DЧЊx[ЇtŸ':т,Жužр­т№r2(№X |Л1IjДCщъ0xъOЗзW?о!5‹ђ%ћPdы8–D эУоuy`ŠKRƒЯ^я2 ” ШТЉюІVс x—6ДьжЈ6šЛ:Х9Q;lїceC-Ч=$МФЕ œІ—їWŸџп58ІxХњў0–oœ†шє(ЗУ“ИЃ ‹„Mj<ЙІNOUMгT‰GЪ|8 $}БЖЂerА€oQc*r>ЫЧаыщѕŸўхRд1<кюv(Я‡2lG,.уЃ9њиЭу§‚ %3ЌъаЙ Г||\фіVN’9–3ЈpE+є[˜RVМ}= ‡kKл&‚”Р3$Й^No~њнЅ #ŠоDF0Јбqд?jfЋ"$rІ%'Љ›Ф1!?ђЌ Ÿ‚Ќ‘!ЩAЈж™Ћ+’Ш@‰)G`‚EUUјК U^/g`‹ХѓчoPcЂ#jэЗPбхУЎ­ЪІЧЉлfQEХQYFpоцdSзо} ъќЫШŠЌxю‡ЎŒl•ЅQaвЯЖc~юы ИбљжWИљЭЭеэ”т8~і(v…ЈлQжXХй"зEžƒJЌ]г6E Ф‘SьАйЂфИo[тУ;ў§(c`л^вЦ]Є N…дZци˜Џт0‡qУ‘k<•Йћ|ёэ‰eQZ> КaiŠцзCZ62.Ш!9оєQr?є€Пћ&u5v#[Iф +^3ŠћšЬЏ VTєQœwФв˜жёзЗm•ƒл2Л^.fЯ N3ТЊ@ъ;яђ[… BˆОйуš“TУ†šиюіcDŒ6М9=H Ше0дЭjНкШ‹oДЌ…‰‡№[xбH‡Qћ}D„€R€ˆ}[ч@8˜/1Ѕ`–”эШ|'Н•MyžcˆŠЄiŠСЭ`отШ1kр“оТ@З]лV‰kшЪfБ‚ъОјВ–eЏШ\M…BБЊпŽЩcRъ€ЄыІ†ЌбCjі-€JЎО|ІЫ‹Š&sŒwŠыЈшtUлPјЭтёiЮ9љœЦŒ1 г№њбщœv ]$цЋЩ/.–ЂьЇPldHnFёz”ЋGЭcЈ‹}]`иП€Тюixмн)М "їН БВeЁ€ іщђr*SФоŽђNoX б;:{К&Г<nqIЪFш"#FДЊъбHЬ,1;`Чu–@&BЉrАmŸКђУх§‚тиІіОu&ХuЂаulSзeђсл#чQƒ7!Z Qч;>ЊаTјеуб7ПоШъJеЙЂz>}ŸЛ\Ч‹?x_јCгфђy%ы†ЁПoRuМаСeXž^/f+бIЛt~ж]ПЧЙя2GхШХœ†2$ђP%p'ГЂБq- <ю;DWMRCXФžЉ˜и„Я-ѓ!ЗкГ†С6дїЅjХvFэйщ§Э3)шAбтЌ Z–ЭЖЦ tКטЎC Ш а^I…Х-%Ђі9IСu“ЖЧЯЗEŸЁŠvP—њ*mžЗЂВѓ_™gqь;:O‘Ь;W!%Ы0rі<›ЮYУ №5ЁЃР3,-ˆЏёc€г…%:T!KO—sjУlH’е, мОЧш;dј Uш,ЋiЄ’Oƒл nžПЯe”Šг%vмЦ1Н(кW9Šи)Њ“Д№ З3к1yє™!$РPP=Gн\м]пNkЈ‹Ž—ЖјљvcбЧ/ бwUъ›В B|”e‘eq‚бн7EьяоиpЌЈшHВ 7Мi 0ЊюІ§Зс0gуf:Н&8FZ`™чЏ—_МxXГ’nЙуBгјTЖ§ИкC]gОЪŒь„ˆd\K„;M}љяпO\+РTс тюЫШdH^Е=?Bž#НƒМю2SXЬ7и'+ђЬгзЋ‹Oзѓ€,;ЊF2fЧaЃК/c‡_мO7КЅ брlЅeј–IЬwo8Snœ5cUКЪуf”ТИ#Ц{=Ш|ЃŽ0П›Ў7 Яqќђълч/O‹Хa`Ѕ˜wcСЧbŽЋйuъ)єbЖXУДШ$В‹gЪJx@šпНѓB{рt‡SЅЏCціѓНХQ^7нЅ8аcОƒЩ(›щ§§tE14Kо\~ўђјќє<ЃDUwFŒЗћ3EЏћЖŒ>j"^‹šmY Нф€e2мїЋIž~e r?=€ЊsЈoЕpР MŸ™2ЛИПZPрєуѕЇO€ЋГ5+Z„11ЎceK[e)DГ‡КЩa’„ОЙžJNR5EdПQгЗп‚`^ж§ЌД_.UˆŽВ{УK§[€Ž}CE$цsbУ ьђіђŽ`$•ŠlЄлЎЅC1DЩњqї L Шв$JRд0M"М!4;ўќоŽІѕухЭŒ (TzXјдечœЦ|=ТŽ§G3дqK…Т"Š’"3ЯЯДЌЈ†щКžзИJŠa!Н‹n‡o]ЊUе s?‡Lхx'ˆŽЩbЙФrŠŸЧтгЇ+GњчYИл Ч3HЕС6-ЫаuiЙZ^VP<їoZѕИс82Eœ HтqCЄueX›Эа ћЗЧ ўП– нАlS•д ЬэѕХ­%:p€‡З’ёgrлЕu]т~іOKыЄкQZ”U§ЦvРыУaћVїЛўА!vQЧTaU]хOб_ЃИAЇiњn ‰ЅWГ9ЩЫІФIьћі)ЖšIrЙІЊ˜–97Є4`њJшš Eы~‹‰Wž EЕќ8 t™ЃІЗЯmVO—пІ”hцc8C`71вd‘мбЗ Mb–гч9№ WUw8ЖxЇ3Vs§№išеH>і№+пRЉ•d•oЅЙuD^ /Š\M‘9тц–€wQ+ зjЦ№Зћи44ukовs-@у.юe%Ш!EЧ1Fл5%;ЄМ“N:РА ЃЗˆъ<ЫВМТ„nъЂ• zƒbk,EвAsЂ$rФ|#kVˆЋPѕїoЛџћЁtL&\‚[8Э[…—+ШЋPK>рѕn4˜иiY5РхF…eлѕ3ьA(=KЂ r№ƒj_NЛY/‰ ЧQГgR”5'†PиŠ4–•ЪƒZуЧU[у)“§ЯјЉaЊРхK1‚‰шјA„н]юR@–И'ш™,ЅййАrРЎ]Yф64Ÿ‡+РlВЌйQ…qœЛ€Ўі]lЊЊf#ю;ьGB0ЮщЯ€ЯЪЩN[Ў ›aрcЈoр‹•B–K}Нв­ИEДМл"…t4W=xњцЫаZN’ dˆу8FxWz:д+ъахУј}ЈшВувЩк‘рrѓ5У єW‹\зБ,/пZп”fsЭrbьЪCФЖ­S[ЧЇWЗ—@8˜Јэі0fi,†m;†ШjnѓрxDЬЗпЕ@Z \кщњеy™_><ЬWФг#gЙќрYs8”ЖЦЯ‚Њ^ж[@PБя‰uw{q5ОEJn…С1ж–а"žkYB!эŒŒЭзmхЩкЎ&8 ‰& ь.—Ў э‡—Cс@щcYŽМЦхgе%ќ}]Vищэ—Ћ‡ЇщѓŠг3$ршtчјф !ћк3!™ $ сљНwптЏMФжPг4 ц фX_^^ід 0M0ъ8šЛaьчNS‘…ен—лй’ XЩ*pО@tT6 9F”`~ТУ9_ Sp Њ 6нŸ№\€ Уѓ|пГtаž—6Лі@зБяa–‰•`$л6 [Шф дq|И|‚Œ­шvмюЦЖВ——ЦS7г•Є[~”ЕУсИOLqУ(†С‡P?ЯxЧ ‚7™uY” _58БoЫМШга2ј5ЇG[$%иуƒ- Ьг=)`Oъ+щ<GлPЪ8uїЧˆ0OуBа- ІЁzв“ :T`M•L‰!!’†mg^ƒ•тЭd8ќМo<Р‡ј`K^VL?kњŸqёд6DJ0,Hƒћуawш"[HHЈxŽфД‡FXтУ‡Ёіt~Ни_э^АЙчхАпVјgбLпШ t ТB˜Чxr3\жС">чЖ nFfLл=М8СYСs<{ђ#EЌ иаД)’KZЖМЄGђИžЃKєлDФЦЦнЖ­ и[ЊЪQМЂcцлПМ6ѕ-M!яŸYХpг~џr„Ф]НubHќGœƒЂX^`ШљœV-7,ыгmŠ…›Ё3ФЦ~шt™GрKr€ђќИlš‘щ 4ЯЎgЫЄ™иk‹GрsGч8Іі‡і7рqНУŽз0[Ю"'~9Vdз`rкš сЁ(šхХ.е`ОsT–цXШxB$ЇБЉ .ц›ШЕѓšRўрЫ+”рФQ8^д= ˆ1@њx+•›/9ьUЧхƒ§ `“Ф+NF„q ПqФ*Ž(jл”YшXЇXёјћ6 '(lCЙžЫКэc)ыOFНlЏДu7<'Mг?СI"ГИП[mŽкhK[ЌЁи$žƒц6дDаД Pї—“ЏЯ+ШfЖCЇ{_eЎž(,qQЕј)_^wEф#џњœХ&`HM•›н>m`*f№'‡Шя–рtœцEНQ\уˆфуУlЕ^о~ʘќpПf%ХЬЦ>ыm q77,“ŸVM7^__*W“DьPзu]њ€Г} ;МTfіДdгƒ4ЛKщq&щ:WKl’озЎDмп>­ж‹лЯ“‹5Љк+ЗX ЗБ.<п.9 Л@iS˜Ы№Ќ ЂШK<ї1WФhІe|”шѕšQ­|тbPSZ–eRšWA:yщCCfhhљјmrУЪ[ТcbЩ  KЦ^б 3Јvу™bНZаЉO0ЉahXaYе.^ОЛиQ)’х8zE‹zиczи†fКІв0.yY7"—]йІ!Б ЧѓЧЉ%‡мгE†8е9€ПgŠe%ŽХлAsќ~TMт~Е›ўЏ\BАнЪ7€ВФ§_П ЙOзЕп@кјЯЖ1Mм tѓ&У3­†њŸsЩK'ЙMтФІ‚зІa9юУ|ћЭ ып5^–ётезmгји4Oi„Ÿ6v#џЋ'3Ј*.BiПЉЬvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэЭhQеTдј›ѓтТ›XЏјБ—т§/Œ o^GБ“ПњіьэBbЯs]лВєпжE’a;xѕO–LOўrdќ …pёnо,Ц{ТKgЩ)TqBэЖ0Э"Cф•?пї§e"9NXтEќyžŽ<љУEЊю#ЎШў'MаЧћьm/ˆЂ$ЭѓКKtIƒ~ „/_ гѕ’nlЊШж&џ:a зu]јЕмf=Ч7ˆвЂ(ЋІЎ‡!бл3uEФЋОо ЖЄ-^–Злu!ŒєƒЗлФ‘oП_%ѓgŒуу(2нЁОєnШm3-]яСЛ[Ъ–&х№њ§ѕИЏ}‹š<(џWЦОkџZ7LЈRŽзЕ:ЮЏр4оd|AЈ„sg(щнVE=te™&iрш ёqЃ[ЈvќЗзcєэ„Вуі0фk)S|›_,FЦ[и№Ђ”?~›mDU7L7ˆ’$K“ВGu”МH|S… ђУ ЉР‹Q§ђ§јВ uvM(AЕл7ЉqOxЉ '}РфЯФёТWМ|ђгзЋл‡йŠddУЖmз Ъa? š]р[шєї„ шvPТHПюsGз Пі]ћлёЮ#Уве_ фълЅžxљфу|zsёљлЭ3Щ ’ AНпЃЎ„І™КN_Nз4ЭыnЖ{}}=дyчѕvш a‹7?|Х›xtЧqоЋ.ўOјЌ[жxЭнЋ„Hмќ№УwГљ’ЬЈE­WOf%CУћ–nцЋе‚­вЧwЩAyє2…tїќх™зdr)Кaјё7Є)†eЂЬьr9™,dУвШЋ?ў№љъюў™TќrЛыыXчhЩа~2ЙŸ/чЯ3жњ—ззуёx8lЋФwtnzyУ;Џ3ŒІсЛ•мџ‰šхXкlТH;YЋЖу(Ы/wгщѓRАѓ~Л­KЁhХoЖzœЯŸЇ,о\™њѕ8tEфШдъљцпйћЮюFВ#Kќ—]iдъюr$‹,€ \zяНCz CVџћ‰HЖF{fЅГ;"иЅˆгЇЊNг ђeМˆ{у™ћu&9aЈДфeЙїОWw‰†щиІz?ббq”ьХЩЯf$У0МwC[ЅŸX '“щђq6[№†_?ƒЫЧ5SDbіИXЬžD;ШrW–нЂF™Хїѓ™Ÿ]ЫОN Ч YЊЬ78FV5нЋ]›КЊШ<Ь$ЫЗdРѓЭbО$%+h0<†"t4‘")^рЉ%Ѕ:л:s-Пdbiя—B4гt]SчПNT(qfMWјІnЙŽЗ-Л>ЗešX]Я$;4%Ј> bГІе ЧЛœЛФRyއhщ2НbАЈѓЌRяw—hšd(]М™0VЪЧCП ƒ0B-ЛЁ U–Єˆћ'Щ tfъšЁIFд(‚ЧчяћЬжdХА}HКМYВ^ўЗrпв|Ї‹Cy Х.MMМ›<Њ^Œ:ЏУphr€xˆ=њЪ‘x^‰ЕшљЊе‡тŠ“Рщњћs“ŒnfyЛ:On`ЌгjПЋa"XЖЎНOmЄМwІи§фbЃЛQЙФЙяыn”ыиэJв1J Ux˜Ьipšс3ъqТLЌ @АmзрЭ–*K f6Л]Wл8АNЃ‹јпm%`8J,1›|RВУеыЧQg(=Ы‰2OЬФWјЛЩŒbˆхŠєxxўэЗчуї—УОЧюїЛ‡W“u/.КЎDх$АNЯ"Э’Щ)Њ@$ЫбЋХ‚TQ№ oi>ЂрТnWЖnкдЖтд’ЙыЩŒ`hјfХЮїђ^pДЧя­їЯ‡ОЩc IUчБgYЖчž~ЈyMг‚ hbCЫЌv~ПVмќ№ŒJTxџј~@.0ДY’‘&гW“9”yIеНД‡iјђ 5Š9јŽ2:ЃкUU–EC.Q4+k тk8IТдйхУlЩhІ‡њТьЕn”@љbдэxзiYИŠМњ„zšŽг{ ЈбЫoЧуЫq@™Ћ ЧазX#Wїгйrsrh-hvкЪціT,/+ЗОc37sе/!@ї§n_UЃ–эЈВМM=UY}œмг"Š и^TюЙ@LПC™„Р,ƒэ›,ruv1пIžx 7’fCб5јѕF4œmSmЫПнKNŽумяњЂ†aFhaъКх9КJ]LюжМ I’Œз_PxђоККІ†jИр7Ъ№rBœ §Є—• *р‡.ёLЦ9mъФЕu‰ј6`w@ ьЁCц*Д‘g 3ЊЦ\N(^–%‘‡Ѓ…-j_~{n|о ЙІnY†ЬЌж‚…Єої<ы„Йšз { шНHBЈ M;КШQЫЁ*сэQћМo…!Г5:ЋmО’0 Іl€! †‚њћїC"Ыђ БІ8žˆ hб Г ,дzКЂVXuU]я†Т: MБ№ЩŠ=ЪIю_ѕm3š}ЛЙЙў6[B„~ЛMu‘][9-5№дaѓPсM‘yz3X †A‰ТЕqВсtЫ/j`аў% каЄчœІ›n˜TЈ`‹е|Зb…Z.жыхуУ§З›Ћ_рQЃ$+№V{ЭЉQHŠ"џ:еL'ЩЁЦCTХ9Њ!ТHуЈыв5uО ‹_p–U]ЌВ€ЌtѕdRK Цд7UjСъЩс№мF&ЛРѕUеЦс&иЊСЫьњсіуЌ;IVЖ˜У‡УУъ ў…JАP[ъдЕй9Щ&ms[тŽ%NІ ECЬгЌъ–рc {Хиa3Ъ Чр \†оШЋЪмњс—[^PМE…cдŸ9р@У0cˆ f688кђы=Љ‚зu ќ€ІžNх3€;дЅхDеB„д”[Я‘g еЏQ-ЁЧЈ` Ун@š64№Yц™ЧŸoащ$кV§ЈR:†Чѓ3Ъ•Ђ8шѕ5~~sїDš›V(Œ!ѓњ“ЄН9ЫГ4'LУЁ‰БQЧЮ HН(IВCŠT5ЉgЈј„KоџхЋЄ[Iš˜ošn@О˜‡€”šQБ|зФ†Ш0,KSj‘”ЁчиК Y№NOi‘U3Єпe!р7ТOї‹aд€-ГВUGDј™‚Шѓ,5ћp-щ6ЄпЖыЛfbw'сЎJЃh 3ИNP7РЕ$šгнЄ…ТМЇЉ/ŒbЈлїeьщьŠрeЭ ‹~…ЛŒмИyˆяМђdž\­Йђ<ѓp/^ˆЏn;щю… ЈšŠюЁЌцІ*!/Щ,Ї:iнTyяё>Ѓ\ аЂ~ЈЗЎ!O„™5o №1‰Ѓкљ(`;є…-RГ›л ˆT^ЭЭДuнЩћЪг$б­Q$єX8ТbЮЁкїqпЗuU5Moц4/-Ы<‹ыKК 5b~7Ь“9Љ8@Т!Y ўZЛЊdeЏБЏLž˜оЭ ŠkВДМgY‚Њu…ЅP”–эQЊђее ibъщВШ‡ŠчЉoА4€/№ЃФЗOД…ђœЯ‡вЙ 8ЭнжТ}b3%J€БDd €Щ“’b%й€GY^ЬXŽхE=щ2Sй,ЅhЦr‹Н% ЏйЗБ­ЪнР1Й%ЋЭаН$r­З/8J–‹šIm ѓ +›00=$ŒЖlaёDБы”§ЋгRdеАн0PфХЏпA’5ПhЗКВyф§юљЉТezѕ(tЅ("`BCSжЗг ApŠ—ЦЇаўT 7iћТ@™‚vъ"M|Kл\]N7”hCt@ўкЊЉЗМу$ЭSYъАMЗžІsСo(Рк†I›^Оu z:Ўm(ВШmІгЇЇљZ0гІpЗ\qT™JЂЬRМž Јd …0дXQGбдИ-‹,єŠЫНa\TuЙuOбJXТА$9dЃmG;’ЭќлхзЃлси[BшБUЁйo(<ЭУЈ-ОR* Я2,'AрњењцŽHR№%Э2э`[6M]рYгtm@­9IЗšV-Ч<Ч!МKrГœпн=ё–b5p™ЮsИ"В‹ћ5ЧёгKB!ZW$ Э@]ŒнЈtЛыЖНfxVTА!ТkьЧеaЗš.ъ-)Aжt”Ÿ‚BGг4ЮA-—LDЇ˜Ÿ}є}a 4 žš_~Кž/—_?­xA WkхфТrunёЅR‚йРQ2œ ЭѓЂj€o5 CмтэУ LnV+‚DQќ& ”Мя{.d’jLа]л€гM 3ыЭzѕxѓљз_ЎЏ~њ„КЋЕaQ 2я^ХнRp§+„щЌђХЉІ‹П-мVCщпоIрuS“шщХoи|RDвJ˜?Eouш†BUXš&їWŸ~§ђёO_PJQтжkй@3Jw;tМPэ0MdPёР!PКВ­bпВѕ7/хђИ0ЄЎ.;Т‡ђ8шb №?мЦuёБЎЊЊЬЎЎ.?ўљ‚— C‰T~нйvˆМїЏBъ8 рwдE8O3,НYбЊюd]ЬБоКУ[у–˜лЎr'zЂ~pмmСzЅЇ[˜ћ(• б/w_ПќtСЪ–Щ‘ZoxIuѓaЬ;df№ƒ+:јГˆ\SЂ7ЫХуl\ яАЛЮ[гg:Žm*Ћй оВхGP_РщvtЗƒсю_FA„–Р›Џ/~љЬHfшъ*L`Р Њ7ниmшё{лPb[CнVDYЩ‡…hњIйфо›з9гfo›хrMёŠ‰ыAњˆрОiЦ FaшС bИN_}јHIj” ŠКФnHСHwxE§nY­sА,ЏP'* `bћ&1]ЪІэЧq№цe#H­­tf§8}ЂDеЩqже%Фіа‚ги)—[ Rz3ЛЙўє‘”ЕРƒјETцвЈ,И%d‡ЭП2IТ ŠSмuбTрhOКЛZ0mзzkOCЇ x!ПјvЗ UЏ„hЈЁЂз-R?\kСќN7uъТї‘ыѕќўл—ЯŒЌј)FP ЫpЪ=ЬРнШiœ':ЧЖ9цЫa('е`л‘›С7i8ŠdYЄŠ= 1ŽЬ§VEТ„€fгыЏ_ч"`:рА4QgYнU-њмŽA Џ˜нЌ  +‚@о\ЌXИ ф{ьFсLЯcЊFЗЋ4 u†З"@Уi‚˜,pNБџC5dzz{ї№D*Рoј4˜7(flлБKг—ш0 p‰XQ€8РШы‹щуtУI€‰\ юУјN0^GўYЇIdвЄъAžЋ›q2з%<ˆѕvЏ –X>‘œlxqVuрrŽКзК,лQ ŸŸTр„bᄆА\ВЂ( <§xuq}uЕ5Ш#{…VЃг# юъ,Ž<…bЬP8р‚@*LŒ<ЭЗѕ„р5'ˆЗХ‹Š2‚ЌjРGЗЭИ8дЗc–nЛ:аЙХ0 Р3‹ЫO_/>%5 RD‚ВйПТj\‘ƒŒ k›&БgКмliшО}ixQZжуЊK Qчз "\СУЃЋЧqnšирOŠaYfsѓётУЏ7мщь^3#МЉ~їк™‚Tc‰›щнB†”ък:П&э^eŸ‡олY€†9R*д:Qžю)3ŒуmšуЪајІбŽYКйšБZ.—ХВ‹Ћ/Пќхb†н(˜ˆђvX…А§‡Вг{˜Э™oФуУlIБРкEjzKљYЗыŠШћю9ŒЋq~зцЦьѓ7)ŽT<GЙ­,=&яРЉ)яqIsѓx§ѓŸ>\нЮ–Є Љv:ьЧфБй v.ЛrФ)Š@#ЈŠА™=ЪQ‰)іф7;Н6ќ$MS uЊ\џђ 'Щ6ХО"Му1H_CЕDхeж+8ЂФLљЫх§уrЕaE €Чш* ЅУИ0 N7eЖMЗ1Ъ5ф<‹yXaVfБћж5Œѕє–T]пuн0ЋrѕњЇ[)ŒЁіŽоvcƒЬ c єЅ+CБ†Œ,\^|љЖсP}й0 Іc%Pˆї0"T˜‹eОMгd›Р dIbЯ.6*ŠтОНХДўzѓФJЂЄšРхœ‡П|&НJяX‘1НтМvфmm DX€ѕˆBв  fa п~bУcєў•є `ЊRфyФЧo+САOбЬ[l Д z˜…фЯџ1ГqЄ;,ˆJћзR!^Є€Бђ,]#Wœt2HвЂB}ц§иЦNіўWP|‡хrOG!S`Б^Ÿdн…СКЬ1ŒфЅ‘tёЇ; цa7тЕОЪѓВ{­П{ ‘ c†+F$!ЊР ?Фьˆ%eєwџъє~зеrЖWїы< }њqУžh+ИˆoиЗu fIlнџeъnГКGT<”‘cћY;&atR_•EЎrkТ’dн„›–щчуьwуЭЁG•F!Ўm …Р9:IJš&ŸФms$ДYКMВ4Жю~ZјIЃ 4‘Ѕ*FP5ЎN€|+АuI’%aq‡NЇHEѕын8М8дуo™Иšт„q^VИžFoР)Юлѓ:g В,,уђ7ŸшЛНУaзЅŽ.АŠSŽkUРШлrћˆKDžš~јМ0`ч'лg"D\VlЋФ3И5kИ~i?Ф^Ep† бdŸbЈЕ йЦža:ІІА‹л{)ˆFя‡:šО‘ьД_<Ь'TvwQ…Rм\ўЧЇ9 щZdзїзOуЃП]сБы1Ыиё0чtгђ\ЧRвnXХrƒРwO1д”aЉТцiS‘Ё)‚5ЃДУЩдхОЉбOœŒЄ ІSj*Рё\№Gс?}ОГп.7ЂОнсВ-ђдƒ,/!v4(FФтqК $УУ|р;њ‰œІQЌ7:Ц0)›зФШЦ2ЅхF5ГWDQYФt-тnKSej~}K В,l–Ќ"Ћn56˜Ž‡веUIи !›NxІЪ‘B4`0ђЊL}п>ЩLœLxчXМ‹ВnЦ:л%іUц[:ЕQЬэ0VКв$ю(qдЁT~5нHŠŒЦгpГAЧсИлšЊ"+"G‘’ …'ёРyU7yф9'к=рC iЦ~#ђяaмЯ6ER1“Б/АЏ]xФqИ HbsFQMpЩВœ0Чe§§юxь"C3пЕ pzVU˜Ё,›Р"ђФƒ/œfƒ/™(.ZlЬt Ш5nЅrз–IйJzмLxшC‘xwюq<ЗžЮHРЄA!•—§+ …Ž ЭТЇQ<ШAпчФ'm]rБ­SэZ—чeuU—EћŒžl›УaWxЖЬhV2М–Й:4T\№$IŠZн\н?qђИ …ПЧz?l ˆ;ЬKlŒ‹Э#пmЊВH}л4Ov>`sˆд- 'Nz<=”ž-в№Яn?ЎІ UтЌ—€$rФхЇoЗP ?Уўшўеi№Бђuˆz+.nacЏљA[fiyх”[ж9Ш уBt[в=(Ь™kRнŠЊaŒи]пЄ€Јq}HІ—7SŠGмПЂhв]†щC2ƒj{WFfјЃ*RЌІ'ЪП)ЊЊЬфaл`†эО meљЄvвК&VЗвxV+ =?э`Ї/+ІŸЖcVш‰яšЊL?\џќгХн’dфз~ФM5е6 \ЫрцДюЈŸ0ЩЋІoРiрф'іyД•†5 а—Е‡]j)Е2-(vм­ЖбЉ­Щьєцч?џrёАЄcЌ†xЬЅір%Ј*`JsРщ}сЈЂf…iUУГ:ЇušрAГфR…?і;КfjiŠІŠ,8.›щИб ^4АШ"*7џіыЇлЧ УKf6ьqWјh*ьšТэ КVЛчcnIЃšn”хЬ™Sю5ЅdюŽЛцЅ,T–UёФG… lŒ{Ž!QR€pЌqkЯHB€FлПцѕpЌ0;Јm90ˆzЭіђёp’,ЈсU щrЕ” $УЫ3Lн6ѕ=лP€8ŸxЫ7ƒ›Ђй"Уё’w1B”юк,v ™"e€zX`№ь^…?uнpВjЧиЦ"пн•Бgjќу=)–_pћиБ/ ЮТЃяt8l!šž"ЮФЭŒћ&ѕ!8Šг§jdкc—Б†бзTvУJ@Fp№C№o_ј`Rђё~Щ)šїЧу ќ’]SnC"њ]ŽЙ ­лѓуzN?к- Г$АМц@­СБv}]˜Ј5nCCfГ\\ЉЧЕќCEФ†рhу†Бg.)€8AГ?6I_ЮU^7 ?<2щФ“жЗ7Ыхќъз/“_š*0IqŸuCx\>АИ38}ЛЯПУ,n.pяuЭŠfЖ%ГФšрT+нћФ–gSFе€шІ_@.8tЁЦуiOž_п~мRPѕн-r„уОKL•š>ЌXЌ“8/vЧЪQ9’ Nгм§Ч&™€џmKсIRВЖЧпŽ…g2Г SŽц%нožріxсКІ’wBR5'С’ˆu'stWћQ’$ХйЖ‡кЧођ§\S-ЬUЎ­сЁЈчяЧв4Г!ijљ8Ї$3ХS =€ ЯѕlнрgAеL€x:}иЗ‰‡ЧFŠaišQмлЎ: лw(р7 ВдCШУAв>ПЧv'аяеЭ—'Щˆ<—и—i–ЦžЁБ^г\GЄ}<ю*dЦЮx&b1чьЈ­Зžm#ЖzOЏYsdхiž7‡—пž]>тЈйЏ’vxіцuМŒ,UомL6ŠjИШЛGьxЉHЗјІДИ^^о@GРя:жЂiТЬЏк‰*И; bз2ЩЯSœ> ”Ђ˜њ@Зю?OюБki)і<оВыšКЬpI†Л(V”gqрXІё>eхПLТы:2@бUгєЧчёb œў4WьЈлП@!pлЊДўђqђз;ІЈр‰˜чё)q_[ ФJ[т–Ў N"*ў{пЙƒ„Ы ‚0Š“ЂƒyWg@љЇ•ъl;<ыt€сŒ,EZќ8љ_?п.iIu;р-/Gt{зUИЅЦ6СO@SABЖyЯ‹^У;tна 7щїm„gюnнЫœn-„ДЪCxќяуM+А3<у‚_gБЇќ <єƒ;NлTњgFёюш`l2•‘ЃKЬъ‘R­ѕGzш3паTњvђa …Фp ,.xи ž'qИ"`r&e№к4о б*ТœVЂO]C$WkяxйЁУcыЋM!х‰O“;^3l?ы‡§ѓў№§љˆзЌD>0Шп“Ћ†ёG єйZsЫ&АrE№xђЅ?ОћКъvр\Л…єЛžЌT(яYз7xВќхаWy#ЗR˜з“e+Aге?цr7šоЬ&ŸЎ3Ќ2ЯdWЄdОvЭї]Кx€YЗЎ­'ЄІ[qНЋ*ІЛC єФСesMќ$сКгˆх7“ЋЉdGо‹BсЁ’В]UжCˆэ&Бue1!ё№gг-.Ж№{ђѓсџПFNМщE-.(нѕГВРћdžaеЩкОђ •КХs§І_тrKŸћ&ілyfѕєіэѓџЊВ…нbТX@љG“xRЪFbоєЅЇЫыkР–е6’\SУЅ ‘{GьќџvZБ]WЯ(гplИСтсілэ(рЖюJHддЭd­˜VTяіc‹W&2?№~?VГ^k™Ќу1гХьсa6_1Њх&eWG€‚І“jкQ3ьњ­ЉŠ9ИтkСуќ8Џiюї&'IЋХrаHбTь’MНu m1Y*=ъn‡LK„јЖlзuœ/Ќќ‹Ж\ЬИ?8‹ылВ.q™ *Е N—эЎА[Нёtъ NСРA5н ŒqУ^‚—ч•Y`хY€ьБ-Л’ оХD`щSов№/ЅсѕУ$ЫpсЕ*J<6kŒ85іЯ›ШBтнG>Lпwы4ўŒ2Lь^I†›w\сї№ЌЌлсЖЈ› KрИu№Д‹џЊб v‰L'ТuŠЁW/ЈЛзЏ‚bњqV•лH,оŽwВХяЗЩёзY‹‡$]]d‰ЛŸџвšУЃpл$pm<ƒhОгQџЂ)†чe7l-•^оњѓпўџ LКИЃд0tљ‡€Ѕn іє‚ЌMmœо^ќњїЏ"Іi†ђ‹с?6МШБмМ nЕxќі~р€ЅџVёj2nu4Ќ …‰ЈHџ0zПu 7™ЈiЂ“;›o=єG‰э>їшд„qCьЉяzoЃ5уfБэЧйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮі'pџЗ`ќŒ5PдВўСйk^г e5€[џФЦСeUлСkЕQoњПню"шŽ‹"зОџfЉз“…в3aВЭђ4q ѕячЏя№’pЧ ’4K“РБџ““0–xœu•љІЎыПТэх„ŸуЅФъ2tў-Ўи™,C †lѓ•ыЎ \чwuдO“Ћ[Ъpмmня‡ІnкдU'џёy"›І!џРk>xгБmзгzдОЬ›ОNТи5$Мєьѓѕз'ЭvЂя~lšЁ]yђaiЈ€mўИH!–ƒЏ оuM™ІeлyцjŠ,‹“‹ЋoЄi{yx9uЛo"—\ѓxŠЭќАk)6ВэaSА,ѓmЦеаЕ…kшšІlЎЎfŒaљEwx9tнn(хPХŽТRЂдCWYZжPyŽ#Ы5I$ЫвЋйlЭa u‰P lWљ†щMfЈnьШм§=Щq4ЩЩZ4Р>ФЂˆЪЧAхЏгеCWзЬАlђЋ эє3дd]—™ХdОсŒъмђi&Xqї§vшЗЧуЖŒƒЄlЛ* ѓH“шыы9ESŒЌ{хюхдиŒ/ЛІC‰ЖэаЁˆ}™ХaVц‘ЉРQO??[TaKiфtЩЉГ|з’wА§‹УхЗћэАEŽи(‚ќч)ёсннŠЄ$нBm1 ‡C_wРы"GЭrTЯЎЪЊфz:›Ÿ~*5Ё^XA)д„ФГLююžЕтa7ьсŸ}л Œ\`:‹ђœ^НџщуУ|#ы†эЧеўыБ?ТSщЊТТѓ<Чё#œƒкф‘Ї’гщ’ зЋO/\+Fд€+'Ьы:q-НљD!ŠБm!KЃЧлЎL}˜n`ЉђњухнdIŒ“шtžЮн?єMYВЄШ"Џк^˜ІiфЈд’Ф `™ЪiЇяГš•mћ" ќЈьЋи5fq{CšŠ-ŒZ’;XЕибБp+Р•ехŒD Cr&ьХУ~їrЖюШA‹щš‡zn;†H4PЭ0В{RqA3§j‹jЂUГэbGc)jCP*љ 2Р…;ћФ@йС УЁЪЬф kр\P]H‚wъ#jl}=ЖЉЋ ЂЄˆдzЕс$Ѓ7$ЇК)$НфДк[ЌfzySцyеэv‡кгШ9 ЫiЙq3ъšэF+M~љпЮ•QБЈъИOŠіЈAю9Ц)рm:aГлЗ‰ЇlVЋЃЁN ЄФ3]пБ9ZOznФ™БТГ‡ ‰GyЋ'NSe^ВЋЦеФчЕYqVžЮмOUЗисЄЁтХyh+$kX6l[Ч9‰lАudћ2D–И˜Z0CЈ‰ЃPЌЊrKжЩ1OуJgP+’TK•V7 ^р9ЩЉjG–zКGAЈ>vЕйГт”Cи_’^6)ЩѓП Глк Ш€b{љю›<дh ŠEгЃ‚|ьъ››лхfIШAIzш›ЎіeNuxЊДјpGЪгУ*ЗtaК1В—эЁђmz.;eВ$ЫЂР‹В"­ІЯ“dљоЈ]ђЖТ\ЗлЦ:TжЯРљˆ,“КМYаМ H“ЧPFI™ћ–iљqШтђУН ЋуqŸфŒEQПуn{RO"T7‰Eж,д.—†XЌ6›љ‚3bHз'PЄ_XЯvлдб#})S1ЯNО< ъKЗЃўuыipš"E9rbњгГ _ЖLSWr#ZˆЕА 7ОJЩ6ф6QЖќ(|H“ЂЄУгьЄiSћCТ9ЫjШЁQœUPЇq%xr9ЙП~b№вЯˆ &я C”Сы2ѓLдЃ—Ї’Ќ(В,‰ЛсTЈEb‡]ŸšЋЫ‰ђВЬBпCЮ$-ы“њ)ъ‹цТЯS,‘РB$гЇл›gрi6ˆСџіЙ†'ЄЎ9™fA|~?*)›e9^Pь|ЛЧSјЃ/“$Я‘4D?dЯ _нД€Ј%yTНŠƒД—dI’eРžBМxНэSC WЫетљњг‡Ÿпџђп­EЃUнŠ~7*ŽЃŽ:lЖH37пЗYAѕO]XqHнЊ"|,НМПМЁДQГХƒј.ъЖУ':є§ИЮрzъЯ2 ГYЭО|њгџЙф:q$Щ‰КѓЪ%G…ђ›і]пwM‘†Ž!АЌ ЈВЌv\7Yрx'ˆiVVХхѕ“„Г(ЪЊСгЗ-ьРЁCЅnШрHhaл„Ё*тъс§П\AšVљЭrE№† ˜хЈJПЧтйѕmп6%PЇQpЩсбJWEЎѕ§їFМnjєгDe3С7\ЉЎoъ6{ƒСМПё Іыы%ˆLŠЩтъ—œЌщ2…cƒТŸеЈо У†ы;xP№OзлО!ѓдzўј@ЪV\їU8ЪT~—=‰ІeЪы)jƒлђяЁmЋЂjк€it­­J”њСлХе—?}bdУж№ˆ FцWсwDЄ€ђ~BнРЧЯBр7†ЦN&$Ђ„jзїЦЧT0,`б|MСFї“xъа“ЮJУрєЗ!,]ЫW#uШƒг—р4"YЈх†—KЫАER‹ЧМPNвЕъ›*‹ЃРГЙЧGrЃыкЦїтМ…„R НœNД‚ХoВ0LЫТcdДр/x ЛЋ IX]vvљЧKVж-]XШЧ(^Гw-юХ-,Џkj–geнє]зVЉЏЭngЄ8дяхKХЦ3n3ЛX ь№э„Y ^ O…ч NњЋbЧдРЯЭуЛ?|bЗaU@Щ^6’м‡р|‹;Pзtд*/лsOsН^“œЄЗгkZЈљУ—лЕbxХАƒ H‚(‡Р.Ч|K NCHmт”bЈЭтю—?}І%Qт’’кy?.є€Ї~№xTК€ІL?-р_є‘ХѓдjIВп}!CHГЫЇЯЏžЫM[<Њѓ8…вRзУXћўѕ`e%jЙ\­чЯWП\­†Ё<Р*U;Ќљx4Œ ВЬт8Д5йŽrиxL‡ЁoDђ˜еdvr}љюу‡мАЧ|['NВjKл1GcTw+Uj6_“4MмМ|ЬA\л~Ru=:=цЛУq?‘ДM‘%Nrшѕ˜ѕkји7OQЧIbzћхюq%:Qб7ЌЋ2 =ь„_э0БИДрtšмьyEЇ?}yšвŠaЛxгїЛзшиaіx§oŽЭѕRі’ НЦ‹˜Жˆcч4ї kŠSlиz m‘@z2Ж[H0eЗ€-tКЏ=(CS’aj~ѓёђъ‰RMЫёбчЪИPhН6—k-€XkР:ќAiт”н$y œЛ+WЊ ь%л_У№цЫ[[И*=_’(Ы‹ћЋOŸyгё|(ЄM?Вu\щ~ћыAlŒ,ёuђaЅAцЫГШ +„еEžрdіТQ­лb€tPœlBlбЈњбщmп`l@ЪЋ|ЇШЭŠЄ†xКzwMТJлaѓыцИмУ+ЮƒGYЯбийѕ3Ћ{ОяШT№бЁ<Рi=Žё№pN_ѓ›…1ТпМЊЗПžKї№‰JtmгTMВ’"бПќђDгFќсqnCј1GtžO {NІ3Rdq§< РJ{'hДQ"–Эњ&хЏ>s№Ў’д€|ѓ.f0Іm€Š0@Mœ§ќ‡їїѓ5Б"XЩЬquЗ#‘,<”rЧ6t…#7†cцws#)БVž`Ѕ +ШФѕPя˜_„џ#>н§ZZ№ФtDmјЈ Ќ›€€дхЯјp7]Ф†•ЭќѕZfПё)Ђз'фlM3 ‰~ОЅм8K#яђmœщХ1№”ЖNХЫ+>HвЂГзHGŠˆ№q=@ЧFDXBтух„`€ъІ…ч9лџЃпШЛЖј9ыВ(В4Чcpцц†СЋ%чћ/іЩчgRБlš,2эцнТ„КвŒ„vЄ‡#дмО‚S;NЃ(ŠCK7Ј›)‹ёlЛaZ #џ…зJx‡7f@yu•чd:sіЫѕ‚Wщф-YQб­ ЭœщŸЎXpПХH^н&ыWŸqЉ;МїЮВž8љМСU†LР“См >! _qг+‹‡CtŠч)qpкцšХВМЈY@џќгкЇЗуЩ“x^TН†6ЃC\Ѓ :ъОš*1gА…IгMь­йПюC ь)мэaРFiЧ;&Ш>АžS6pв*0(UQŒ ‹ЅџК’CHulkЊu#ЕEФ>vtМ–гv6gБ )`**вУЇ|ѕјˆ Љ“w4љqЅ!–ЇK’<ЭEЉ…iO/ “4–?§ЬDЩxŒПэSWчyн6ЄƒmфРв$P?ЯLяцŒЄŒвМЄ‡эИМ‡—§ЈЁNхh№tHDTљІАйpђ‰”i;Їѓ<…фd‘?IQŠnюёjN^m4ЛиН&оЁ‡пбuAєќюнЇ )‚ЧБ\г’•сЗ ь€eЦ\†ЖJг*–VH{Ёg*P”Do>MA{Іi›КD=~z2тlМЎh"лІKеЮwc лю[_S ŒtUbчз?}И}ІXj5yМ›œД№Щ†v8ŒзЕMЎК~DХiзѓCe‰%СiЖчЙЇщ†Є%Y чK`Хz>ЁЌЈРэrрнќѓ\3c$ǘУR…чЋъ†&гЯя>^_>ЮІO_>MVЄlУ7АgпWjч˜ 5[p№šЬ“Ый’ з}яЛЙј_и‚f96•сЅBЫ6ѓ,]\ЬEУЧ Eˆг>ра pшьњѓехћЛй8ЬЇљЪЦ;i№9u Ј€nEžуЄАфjі<%xp9J"Я3N•љ–Œ Л‡rAОOИЖUшГјYŽecзиЬгЭJ”5 b„}њђхDžЮ9ITнњ0vТэrGyARx‚5ЧwL™#–+Z1€еxБxЊІТ•bƒУP ѓВЊGФ}ŸрQ)кАвa< mm‰ИŸ2"€mIтgwOŠ‹.ЫКnŽн,x­?ыfБ‹…'ЩіЃаГ-Ьх№у‹*]Ч8е•­X>ЩЋЙўxD46yteшXЉZЩ€•fп†Lm(ŠІ9žј3чUЭBЅ`Ы ГaФў№MЁЪaЗИmЊ’ц„АИ1žjњђ‘‹qЊ–B "J7трфU‡бЇž-‘ЊЕr ЃЉЊФ‘ы Е™]]Aqбм8Ž!ЂЊ~lcйНћPUxnQф{.j‘oЛЊ€'X”5YЇkb€f5”iр§uќ9ьО}щл …+=n1H(Ўё,В Нy~ї~В‘4+Ь‘Dѕc@!0…#ЫšщЅ%€ЄДьё@9MздUф[ц лП%OАђШђCU2ві•gЫДf‡-уŠР6Еёж€ОљјМШцD%РЈa<›FјП­]UžBЌнa7Œ(OлPOйoЊр>О'ё<ЫrРMАžХmўеиŠ|Рв^ЅЁƒ73ВВКН$EНpђкC Ÿ ЉІH’фУHА_ЁVгdPdNћЪMъ"9\’€ŒC!м:кЬdУJЊn$Ќ[фЋ@=C‘Љ‡лы9УIš‰я5Gcyщъв-й^Е?Оz“|kьRбOмIаЬfБр…QKЫ{h\C^<ВЊfћiЛ{=Р>„MЈoп}žЌ(щ^ЕУdDU СБЄљZБтBHе†* љјLH-{ZFšЅ?БuіyЉ;n˜5Аќ/лаrЭiІejЇhєј+C„'рUІщi;ц/|›zdšт3aИэшзЖЯL ?›ѓŠjz ž7є˜Ђё˜ІФ БвmˆФсr^љ.А†—Ф7xC‘`CœŠЧ эјДЁЖxh›м”1|(6у!Lк†ЁЉвjСCbŒёй!vеяКЪ7 rЪAђ)†у TWіА4~;ЙњЅЈ;€~КУиЩEА+`J›•hDУжRu›Ež­Њ ЙфeDqє[TкЄА—o;Ь_$ЏшvуљQ—љЮХP%brё@0P[4ЏQ`хšтф ’Д м тсИ™aЁMэ _Єф5Ы…СлЙћАVLлЯъзЬ}D Ј 8m*фэѕR5,Ї'РОшbK•Ul4bпlY(хдfC3"+НєХо<БН гvу Ђуиљ*5Ÿ­–žп|ɘёšЊЛI Щv\jШєгѕ#‰УXŸЄ„X‚?zЂCЧПm4іЫЫЕ$ –ьОэSG›п-ёЃˆ‘}Ј“€с_бTy}п`Ž/< ГйfxФ1yœб"vF^l+ѓдfљ†.ƒI†aїg)ЩHпu`‹ѓAб›5AKzd{пЅ.^УСЦтž/DMЗуЏ БяЊ„Є.БфrE ‚([qЛMLlay[Ÿ/(raѓoy9іБP“!зГћ› Ћz-ФЧJuGžІђ“ QзЧ+Rlа:ћ Щ"Ї7o(ъ§†ic4йВРс(Э ’}9дуk КD\џtЕQmьFPTV8@].HhwZїPŒЖћуОЩЂ №ЋIєbЦйa9]—…7ГбБ‡0ЧЃБЂс*‹ёх%љщчKBuЧЫ8ю kK—W_.Q6œИЦЋe БŽђ,MЂРQˆ iйQ8€ќХЗž8ХІтн'fц=э…Œљ/_УƒŒ2оL:еUaђљтчG‚;J3—ућ#Rђz.УCУVPCyыјИ`4УЦј€ŠV@Tš\P'žУ+П:]јЃІŸ/ўх§3”y#оэЗ{фЕ>{ нБыXьХZУЮGл<=m4œ.BS—АO=ЖлвбDjНfYўЗMrџ­-WФz dЈ+щАA“Ш'BIЄМнZ2oPJ4C?QЛЯwлrƒ CІm>6 Ž(у… dBAњИ  Ѓ…?`›Ъщ‡bќ3Жk$4žяћž%иц‡/<ФJотЙЃ‰ƒА СoZИџ;#$гЖ/ŒS€јieАаІ†‰ јЖьVYф9шРiXь7’№/mЃ‚+ŽыЧeгДmc=д^ ЕˆMfEY$сxInсЅјяd$+­јvЌŸUPыlьЉx§ЪJT-GБ†.Р}pћЭ&§FвЂЏј– оh"ѓјыVМfКAс›$ІiшкВљ7MБl№.kKЯ”Vяўѓї9IЊƒ/ршЊќ{›š,л˜МЌpMсљѓћџї…+k8›NiуЏŒ7№љ[aъ™ТфцњЏОFrЂФџў\ОРёR†"ыbќ8‰ї5жgLAб“~cKџ~c!F,Ыќ­8і‰LРыr]=эЈЗ7š§ O?лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйЮvЖГэlg;лйоаAф™плм€џй(Хp\л2MхПњЭJ(Jљжџacd“ Яulѓџ{§Zаmзї<зЕ~?/“уњщx†iŽѓм-§?НžСџ5ЫёТ(Š№§žо&7|t9 3д“ѓ-уЯ^&з8ŒТ вКLЂ8інп`спik uЌ“8№УЂm‹д3џ,Ќp}!šn˜wCњI•ј№i./hE§СЃA@UљМЬa!Јъл*0^‡]^_Џ5л ЫэБK|?k‚zТЛAи?rЭIЩА=?Š“,‰|лА“~пEКЬщ—_xл ŠэЫЁ мАj#G€яА‚8 \ћGЮbtѕ] qјЎ.Ъ^}шCХwqyљ(иnвПю2ЯOЛ>txШ%n\зЉыœHŽєŸГ +Ќ€POВV>ДЉm˜šЊRз—sоrв~wиІATlЗБ)Ќ=ЌЗMъй'V_јglEв ɘ3v94уTwUeo?<БК“ДлУХyЗыsпдŒЈК,pŒ5 †j~љс§‡ЯїЯгЇ'Bё›…Y U‘Љы ХrуВпїE^mлЎŒгВPЏR#o~~§!ПхLЗхŠ4У4Єѕ§ее—ћ‡ЛЛћЧЕьжлОШ|]8vћаДм(kіћЖjFЙ~шл"ttq}§юУјsуЗй‘HhД k†эИЎ)­ŸІЙ™?O йЭњ]—К@rўИQ,ЫёЃbwšf7 пЁЎ.l&зяппSŠDЊ§›D7Х-/ЈQ ж гие9‚‘!YАœъfm[ežЁ0‹E/ІœnXЃъюњЁmЪдгb:y~МЛ^hžЇё№Џп ћQ<7ЙPl%кВІŠMER-@IКVЈ7nШ<=Ÿ3?Ÿˆ8qЬ ’цИпu™ушXq5›­hž'Ї„сЧžЊ9опКвАВDмІуgYšU§Ў\з т8@5в.аyr§|ћH)š8{p@Мцэ–КJC[WИХdЭk–m+ФJёгЬГœљіЖsNQvp~KP!КЖэЖЧ]™Ѓ|pUС/Ж‰СLo.ŸM“&З4VЫџ`я;ДуИ’,ё-Лг==Ђ(’ H˜B(_щНїоЛ2ћя7"Сю™6гЖ iЯЉх@Ђљ2оёЬѕуВC‹:Д–ІH ЊnшЛ:3ЇŒ Я’М,ѕMK‡/KЬУ5їЛЉЯ‡ЖЎ›Ж†Уn_Zќl2'–г…Ј*тtТj– кёјќ<$ЖЬ‹2№ЇЄЈђР”W+ЩвКkBSyг  AШЛ/Х№ЫнёххјrDсЊнЈmБ Uђq%Шќ–5Y˜­P!J :^^^~џ\GЖ‰ЗгеУ~hs_Ї„bE7dР љvЩfЫ єђЫЇЏ9qƒъ(ЯЯ0Т}‡зМЃдрj)Z†LRŠ&‹KR3н0ŒгzїќэххyпЃrосљлѓОm™X‚сЇm;ŽЅЋoЦE–Й~Ињ0йŠ†5ћчч—ч]гV vьrƒп2zшЩ­™ŠАb г&ц=О“Усх}F­в—0[Іж‹ьІCŸGЃП§…NЕ‚хsњ2OтИмКPуЩЩC‰LKс%TУа [p_ЪЗчУБ+ЋўˆТАmтъ1пQ9Рg„Жѕ^oy†\Ь‚fШѕ|Б Џи=?яP)ѕЮ*W$3ЉcM2\Sfžh zВЄinсqќЎuТ+ДїЛІˆ]ЅА4є\ѓ-ђ9ЉшšФ” ы№љьb:у Џ„Xъ4 гІO,MuтК/7 +о­ЪнФ‘ўімУњФ fЗk”okŠШ0+SЯRdY:§d[Y‡мЅJŠfљ(Ы',ЏgМu0‡*MВКŽ ВЪš/ Я=E&>п,EПŠьŸПЕ-€uщZ^Zзyy^ˆp—'xЇЩЏпфоaA5ТФ3 Уђ2ТkіoЏVЊ_СФъЛК(Š< Ш0uYфijIтќ§х§bЙPs&Ўіпњў№|Шm P[ІЊЂšJпš†ЖД~|ZmЋSkwКƒRёЎWM:€k7яDЇ@1ƒёuзeе ФМ‹KІяЎюgЫ 'A`ЊУ$<ьЕч:.АЦ›исiВ, ,ž\“‚Ќщ2wZЏзЈ]04eЙВ„.PЫ‡ЩZrЫQ њ0 l'@—ЇЫjCB|ќ4c#жМя?ŽЯmфZŒHeЇГ-ѕЅkkьvЫЉЖ sQ;m p9экzTXMm^4Ы+VŒB-Ч§nTшsGсXšсI’јщ-Ї&ЬY‘ZoЇ:І?я›€F_UЙЭbОaё:ъ %˜AСLБŒSіC 2ƒ<| B™.EЕmk Ѓ„м(ОыˆФl>‡а$Љэќњ^аM/Рј•iVЫ —ЃЎcFQСпО)в$EЎgДbGi„]@ѓ”тl~Мk(В№ељъњ–p\рv(Ž4ъ№ЂькО2ybM2$КЧЛЋOїЂn…YYРМSeЋz~С s„\XƒU0№™Y,DЫЯ3G`RЄцrN3lSeW[СЎŸћШbIз-њ§Хћ`‚ѕ€ §ЎqUYV5]ryџщ–UU€šЎkŠ$Щ‡1)Q›є0JШndI`ыєZ4н2ЗD†"6ЇМз^„|"ГЋЉ $W]/u'юQ/‡црnш†!Ц[ГmSSDњюŽТ)щю{ T˜!Н к*БюњъvrСъvVEІЬŸVaI@ЕvštПњ*tєЭ„P9F=еКэPЖkЊЂ,‹,p4Y^LЁ`y”@(к)ѕЫѓ(Ћ8JУŽ OiIЋћ…ЌЛiфxп’:й­Щk\– /Љ‡6ё-]œп@:Ьvб]Цеu‡†ДПБЃЈЫ{NQ$ŽWtЫƒДГ{• T‡ ЎкерлФшљн=!nœE€2OoN…еkV4HЧ]ЩZсшэjЫ*)№’ ЯАГQ{џ7&8GUђю'Ђn xЎхfЈ>ЁдBцє§0CЭФ.3–оФ–еьSЛЉŸь№ˆЪDYлз0ЬТfЙaDгСzЋкирЕ&"ъЃРLр˜Pадњѓdи>Ц8|EэrдЎЇUтЌ@ez@mЧqL…ЅХіЊmѓЯз>ўeƒР№нДEdЋмjIIІ—PЧЖM›*Ѕ„Œ9Цu“yФ1KЏз‹Ы‰dxqЇБgЊдVРщ# Лž=rvŽщBЅ*ѓиЗ†–ˆ…ўЩєЦ9У‚Є‚­N"cУinRЕ}Œ42"Ў•Q…|юЊP—xj1лR,3} Ш-!Tл†ЖКчм1Џѕu~3ЙfэЄEUІQММ€ J4нЖЁь2Эгh†“яїPщѓЩ№Вх0`ŒMˆsлиЎЕАйНЮУЦ—XjqИ!/88ˆ—ОІ/o9Ї~~9‡мЗеЭ-kGЭЎAэrI oфœз5MеД 6(ІWkWЃf[^Е|ˆэОk3Чрц šлЮh+Eбз]Wе•/QЋеš’UI\нmE‘ч”0їUu>œr„Л> lўžБуІh• !гЯo4MБВЎыЇ№zЋYa7D5пˆЬe œ9ƒJIxММzXmhХЋFею2ŒВDgPƒдДUyљёŽцQ b№o)Л5АМawь_3v’ЧКР РY^јѕt:{z„oлІ~Їi(Ђњж•ЗЬ•jodЧT…љѕэœтe #t@Д~ АћР•ХХЛ+šG)Dђу’TМaП;юЋ@]qVиУЪ†iРosф†тš­ИЋy‚ƒн‚Ъ3eЭХСѕf†˜Н'ё–}(Бpœї•УцIрƒ™‚Иz#ШЃ Д,S+N ”9† л„&Х€Г EHаAшй№ЄЮA/+NБHАU?E1b”EЕy№a~?ЙЙ#Аы•VнSЫЁаX^В Bм?ЭIQEEEW™7†5 єz№ (ХвМРѓќ()ћЪQјv?V4*AQВM?-Ъ @*ЦЁаFХAјЏТUЈХbЙxš\OО~њсџўюnЕн c;d@5с§k| Є—№WŽ žgh&ЋДЪЫыH-{ВJ€T ЫA5CЫЄкt-PЊ№?X›кŠЬѓ,K>]ўіЇЏ†т%(фaG^ Zл” PB€:ЁЃhnоЈky*r*л^˜fy–•M?ђ tƒџ=:<Жšд5Gљ`ЄьуŸh ЈфzKбР уЊG9њъњ #еjЧЅЃрHсЈЭьў~СШnоц@зOP’ЏЖЋ)ŸnшжЕژѓ§pИСїUУРGML]!?b%EЈэjЖА ?Ч№JБ'UжшxSaˆєz:™бPСЁeœ “<ЛXБЊ ѓ ј(Њc6Ц}xlƒрлюZŒЈ`k šIф[ІЎБ7— ”Йэˆщн’•єkфЃ#Ь"дgЎ3њЙЉeˆ›ЩL4`ЇЦ Z6Ќ,l7'Ѓќuо`ычmмF3ЮТ~\#„\3 =tšљrЩ@a+Ы27ЛУw‡&{nј”Ѕз-?J ќvдL”чз A3!ТNс4 жfCбР№,“†Ў -ЭӘЦiеуkЇ[TUŠ +žЏ?~ЂEŠfГЂpхvЌ(q.B пч!0’ Љ%+kЌжл"0йљу‚рэќћЕ-д‡єzЙXЎHЩ„tвяЁ> tЭKЊ^n‹сё%кQ!ОћнJЄlyУvМЄ=Œ‘ПpБ9M"ЯPUTCЫрc€Œщ™ѕbФ :64Л™m|Z PV—Px7Edщ„tйa4c8ЗЏ@вU‘ЅЩрщfђю?~Z ,Ей2ЂыбЈ7јкьЋ,˜Щiѕ$˜?–nC…Ѓ–№Пя0кj§є№8мo'Ь{РЌЖˆ](C‹Іcœ…-tŠ‚<БZЮ'ћ›w“-фO^ЧœWХЧz}c  TЄqŽ,™0U№5UiюIѕЯМфР`” •йŽбн˜б №Оє Њ­‡щэхџљюђqIHр3<D8Н‡8‚дИњяЙ%ЈW”ŒФЋoы ˆ™}šz|‰НЩ ‹nDXK’@Љˆш\. п™-Џяюžѓщ—їя.—””Jx%Ія~LŒcNФ„O‡ђl!:1 HaЃ†Ц)|^‰šaЂЎgПЧќ@Њs+ˆp`nЛ%ЭЦ(СбK-iѓ4_­ ’X|}џ…вLЫqЂСЋF_@Ћї˜VЋ<‰=юqЁИЃ [‹lБыbј@џ3 t‡О ™чy,ьT7m_яЄ‘‹$iŠЄXNрч—_iŒ@­Ябk˜‰c2T‹э^_пмЬњнSИY„ъЩюBт~В‘`~ЧY–jЗŸжTД=Тэ[ˆnTНўєяІЉŠ,MCKU6_o—4уЊfјИw fе-јŒyx]ё€,  )§‚So™нpВnэqц?\K!дЭc/ K]dР§š™ы:їm\44iu3%АщcmЏIх№Zr!I=Рw4PБuиІОUФApв kš“Х€Дћф—рt…(Ая3OуXеЋFzпа9Њм_Qerњѕdh(ШyIѓ›ёеіЏ%љїх '”œ˜Нq›aшžRСtЃИA0ъгљуЕ8 h•О)oЖ0ŒcЇcƒ k,CУЏэнзыл E,цFдœ ЙBЧk+ў|кКсEI^еUŒјљ4[ЊР`$8U|Gz7ЕЃ ЇvU`Ь#a8Хш`іъ3БyКЛљ№щъђa9ЛXбЂfт ݘοуО2ШЂ‰kJДhћQ'}ЎЦoWV8•*шFЧЕj(~sѕa‰А иФPs/ю[‹уPяOfi†хтёыхЛ—яОLnЎЇГ­ B™нaўюŒЎЉ€ђЛ6?› І ‰оЖt JF4-ћ „бrѕєДX.ЗSЪK\ M=]oyгJqZТмкч:ЙXQМРѓФєгo>|ўЯ/Џnя'sNPtЗ‚Ё†‚”IСаКІА˜ЎyПћ<™>о]NiV­jlѕтєu58+P+vЛЁ8žg6ѓЇЧЃиЎzо‰j€бaŠ•tЯ EYƒщx(cЧPйѕFЖмr,G†ЮSшщѕ#ЩrЗe††ЁWY АPІk ѓštл A\§d[зЗ nu Ђ$+ЊЖэUИKF >ВaLЭ]Ј ыћЩ‚Єj;yїс‘”5]YQQ4+л!ч8†и`V/Ћ2Н蹆ы{№ьšfиžщмuьгЕ‚з)іёЮяFВж—)”Я ЅYq7n–эKЖOOГљbљєхw?-xU3ЫB%сЄGЈ;>КHЇ7МnY†ТPi–јŽ‘Ѕи2љ‹гjџ†.іФ:ЌЄne‹Ф}лІ@ШVаa~<ьъPWо, Fќє›Ÿ–М ЄX\чэШЃ!‹‘ЦR№опГ5нMjlВЅ1Єў,:ЅмДNуОЎФ c})6ШvЅkЩЄl…нсwзWЁiŠ$№ьісЇ NбœЄ(ЋВЦѕЏ§ћд”X<а•bз/DU8$˜Вˆ]Hў'ф<е9аБ’ ЄiYејіЕo*”lњЭИa’F9&№1ўсѓœ•5+ЬЋІю_+ќЕЋBC’UУм4`УЈG]Vи*;­дАцјqCцY†a8QвЌЈнUО%РѕЪў№Œ‰x_ŽчЮLM–‰Л‡Јъ0ЄР^wуо”#pМГП&K˜nр1 †5ј\–y`ŸјкF5p“3 !ЄšІ§zШ^H–Э0юлсжН8єLEІЇїЄ Љ†цн+MOКДMъъ Ууž9јb—E1№ д<Ї}ЇyЅёp‹уššШKFмЗЉЌяiUƒв_4QРз Š2%‰ОП"€DYїЪ§ИF>зY2юЅXЭгЏvЧ]nуюеЌ‚BЭ5Oœ П›lйЇ!nАŠ˜‡?П[BАШ†_ѕШ€ћuW“ЄѕзлїŸ с$#н?;‘M`ъдђъбœ|џв‡GЫ†Їи‹7пт@У\wнЫКъФ]CrлЎзE’ЂtЏ+nPа$‘|МЛКпRЧ‹z `7nХ/,€^8ŠuЏ:~ы“{кТМv]з8%о§ЗmM\Ч…­Ж?МДž.ё’*sфьŽT­f.M@ž–f}ѓсnЦрвИ6nГЦ§mGpZцˆљ’$ЎPwЧ—!ДЄљ”RLгЖStiўŠг"Q^уR8xPћ†ЂC63”еЧ'е(ЦnюаšР1лХ§ч{ІЁхТї€{мЃв†ЖСM'виJэ`ј‡иж‰щœTMUпF‡z­X~ужGf .юё2 іыB3Kфp‡]хр9.мЅ№ УЁŒяЧ:ќ€ˆW{–О}-+Ÿ!Ъ‡дГЦѓiMžzїєw[*Ие!ЧwxyЊ,+Š<‚љ3йjV5V­ЛЪг  ‘ž>rрt\aгGzмWSУLфžHгђВю№rмЕiрЙŽЅpowЬe щњлyžЁ)Фьт‘сёТс-єЙc›5БY.З$/vŸƒm@lЖžЌ §K“l?Фu Я]dЉ С!Н№гfџМУљжу&oEX<\\NцPАŠVTњ0$–Ю<ЭЗФКЊ—*0l І‘cioxrЃиЏ+? …­ї+Ђ0w7Фa_zК,ЂР­Ўя.оџєхaI‚гу–ои65™cеэИОФЭпТ‹йЉМхэЄ Y1Ьъ§Ы>жљЩЛ•fИИ%rиcšоїБСSЩ‹Џ?н\ќ№eЖeХыJ!Љ›/Op./ŒS( PTФБ?юCŸ!Ќ%@'jћЬ’ЇџЕ€š4LZvXjjG!яюgЗМОИкˆ ж01о :Ол†fDнтV{&ѕщŽSt Ji<оИ ёp;]n–ї—Ÿ/ю5@:=оЬRљх—Я3I3= WK ’(Аo{ZŸ ЖЋљlОѕ`ї­љіЫ˜)nўЗУшg›"ЕЅIfЏ/€j›A>f…)—™ ЛКЛК#€•уС§#№R™cш7Jп4H2OЎ7‚юОэsGпмNз4M’0њFиПve`ЊŠ”Y!'@ƒьЄnЛІХ€ЬRјэтaђHрО&?яkˆ†|гѓЕh[I3€Ц–›N7Ё%Sыхrёtџ0ƒЊМ„ШХ#€ ŽІpГ NEђбuU‹mt˜ˆиT%Wы-TfPЎ.2ыЧЗvњBOц‡qоCFмх0t‰йLњё№‰IQ_ІQAШ>]lUе№ВІ‡9зэŽCцš&О–иlХNRž‚>эA‘Пf”f‚ЯY…g‰€GУ=§фЇп§pCkСnDН:Џ2[WщщХ+ЩА№,улl$GžЅАы%gzchђЉvxќ-ƒ\тLу€,n#PEžfšeLЯKЩА’ёЄl ъžcxŽ>хЉдвTЈ8˜бyМГЦжРхЭгœ‘Аhъ z6t3ŠW'иїcišX.жoO6ў†вјš™Ÿ*p,ЕzМЙЅЁdЕМq^,DнŠ{ь№Њ|МКa,лъ}уЫ‚з‰Џ`ЅљQш9Ц/;и')ЊfhŠ0ПY(8­r$I]\ММУЛѕЋaW˜,oч]цА^œЇž}R9ГЭ–$I‹лOїbаVž&+’"Ь.Џž8УJЛ]—hМъ}ющœ`ЧU“Жѕ‹Х^p6Йўruyu{ѓ№xћљѓLл&ВtCUхѕееŒб|иЗ&Ѓk“њN˜зM:'AљmСЌ)<Б˜мооNn'“лЛoe}; Jьќђj%š^9ьКШ4нlРЋ[ЫІ­пў…nc"yI5!2Зн’БœЯжŒlЇm_ЅЁЁфќњѓ\4­ †>Еm?kQ"БЋ‹а’™ефуп?шgœcвіУ8іMUѕ.$УЯ›ЎN}Sс7ї_>н2Кс$ ŒpК~Rр5‘yфъьb2љњљ#ј+В[B~УkыџдгёЃЄЈš*ё,У„nш€[яоФ‹кРчOв^ZwћcŸњОDqф{&П~œ>ЎЩЭУЁЛЖІ˜ЖўѓPжАНДЊPюГ‰}/ˆЂ8 ЂЂэ O—8†œпнн~љј(jЈ^д^UьйцЖ.lžž–ДЈi2}AY>|еu­ShРў#..dгЫъЖы†aп—y–WMƒїзяJG"їз—з‹ЭєуХЋv‡зkЃ„Ѓ"вфъiХЁтАЋѓ‹юЧIњЖљцї6ѓ‹­fEЃВѕЋoпНъЕяк@^по><н}žвмъђ–гМВэ‡уЫѓ€я€^“Œ Z^Z‰%/y'*Ъ*uпNітЛm6wДс@žPлИG™A”&ТћƒSƒЙЛ^БќvКDты”г‚КпП}{y9ЙЋI‚Š7nЃІsэ›фt­9QйžѕЦИZ?|Їэ Dб]”SCyїІщv‡CчJ‹›•Ќ*ь’”њ~Ћш1~§Н~щ‹ШsУТ•†Ь‘VOЄjyлMМљхЁЈ–4xk7`XšчI2*мх&7}-ЯdзЌЂаOŒfeнp8~ћ§ЗoЯЯЧJРіЈq†ЗTУP л%!шnёў§žЫ75^3нДћЎЪЂа‡В$(іC “SТbmЛ™]rš• ж8ФЧяПНїЈZГЪ №0єфMfёDh~е$ОcioeжŒЄкQЕ; mк†ЊL Е#/ч@ц™aeMсМfІе№ђ †њe”кщSpwќь}g{#йq5џ‰­WZošД3УŒœsЮ9ЃШбПЋš+KВeЫ’Р™§€zјL$ТэКUчд … #[cЇЌЗuкКі*ЎRЂРRУPФjЙоЌHсaз‰kШ‚dФuЌskJ šXM‘Ш Џi–нуiщУсљщtьSАŠ7‚CŠOa Ю'.ЪяК|Ёf5]Cщ/У€ф5Я A^ыnЪ’цЧ–@3=ѕMЅ™XUoЖСiф]зёУгЌИlЊ,IђЊ-K’ь8†$ЎЪЏСENЬїžыѕ€в|ГCWЦ–fјЎЪё:$•Ж.“аRЄй5Љ >Žщчэю№М+ ІЉ&i^œФkТЇЩ›"і•рuсЏrUђJRQЅЮїpћ–Ёl>П}ф^~tWC B1–ьДnšхuIОбЂ(ЁЬŸUЇcs€яxдк•™­hИ€­‹4‰}§•)>рД"Ћšм7UnyћўŽжЃ=Šк,p†Д-Bпѓ_—Ис››Щ№Ђ$KЦЛ?>?AЪNuIж$”m›<.xђvš„ЎЮ,WŒ ђдЙ/Zu;ЊPrОЋ!йеl6лˆ3њћџ!ѕ€яweh*ŠЌq‘шСЇ1Щ Чыh%‡ч/0K[йе|El7Гщ‚’Q§˜љ† ЫВЮ}Й,Б™цYбю…­б“-i†`yпk}Ђ8§О+=•g/?6ЗЗ4^ЯЋJБ EЋzBЇw‰­ё#iЖЃP Р{<Чm—kNw}C;яd” ю6xЗO q|KСпуЌA§Оге>Сїж“Шљ|ОXofuџс†бС:ІЁrЋхЈŸžŸЛ,dDI:*Mдv>œВІњ–Ўъч•„bTМє]фeЋиg–0М=rЏТюЂnћўаимfО&IrKЌЦ7oЏi(.Г€=йЊžŸСчЇ#ѓКnv]EPJ-]ЂfKй cGюГŸгiI3u(К^ЯЅoliЯ/V|CMФІCk|…цЅЁъйvuѓq-CйЬъЊЬЂЈмCt  |ЦS/Флд/вшъv%A^ВeімYOEŽ^.hХЋіЅg “Йf‡ Іvb=AHщUђ0уt№xvEрШлkјI`ЉьфqД<уMГkxфtЏ+дAR6…бRpЄЋФR”9†йе9ф"‹|(tЋOwK’цdнN[cQПO=іоЁ€ ŠБBіДЄеpЃ@PЖЮoV${FŒКЅ8йђЅf>ОјxМЭ‡+s5-lqмvHeZgmaПЎЗA‹2jЭх*Гa0Uež&Yš‰ћ:Вezz7Ђ€Пљ€єўœ3окpуЊЮх‰ѕŠU;nРе&4XЩЏQѕ‰зА*TQ”ЅщУ–xBЋЙ™žцэ2HB–ЊЛ$Я}“X2G.ц ‚NcйІ.ŸяN~jqѕ.GОЭšт ?*v(Ћ\xђJ№€{Ё}з4Uъ™џ$Cп EM75@Yš*’‚]Ё&ь)wu!–Д `3аZ]хIлvmУ8л5П”fziНЋWЈ5Щ+€&[жЊЊcWœг}LwРЛ2пPz9YL?м šэћœММЙ_ЎW#ђчСЌnЅ€…6Ѓb{IU—i8†ДИННЭ—[й-`˜їЏ*vь л5-h€ЇgF4Ы‹КgkЪzЬ BэЉ@ž[Џ€џсa)šЧrЬz:]a~4lѓ<тŸ ѕд’—KбrФЈ**ѓЫлСŠbHUI_KS” 6N1K–f?М_BОУu iБ”ЬƒлУщаDцvЃ;Ž)n7(ў‚eŸ"Y(џРЈшgщ7 ІG–Ъ Кх@”\ЫйэУVж,Ч В‹a—k +˜qфкРtA˜ќ№nЩIp~;%Ї:Ёј;Єі6Ж™•Ј+тrПYn€ЌжРŸђТ"ьѓ\sЯ@EИл EXІјs2МxмШРДQЙ%RЛ}iа$'лQшйЊѓј§л)УБ K‹%Џ†;Г@xиž8›Ёzѓp)Ж%YEi‰:oM бt–ЖЭBРhŠІ)ќf6ƒњМЁ%Мэс?’€ЪсЖЄ ыЊФRЕПџ§w+rKв,CsšSіњЛЈоќдХкrJБKb#ТvCTЃo;,ы ^х<эj J›ў"mШoзkZ2€e l@KЁ€Ч Н$XŽЃfЃбнЧ?ќлїŸf[z~qьЏАшmсIРоlKуH’дыЂ0]VЖћ ѕdЯеb'h”c‡єДЭ(H{q5!+ъСынОkЛТт“еz=§ќцњњУOПџнїзsFBй0­:юF` е~pŠЪзJ, е ЦУДl7(Ћ@“Ю‡Mч$+[^/fА‘ЂЎЫКЉH7–arЕэО 5f1›/fЃбj9ј№но>`ћLGQ.xјЈЏz@ЪауЊvз6UЛІЬбН2ЌЊFcћl„Њ[6ЄPHХPУСеКBЋлКщЧ~…ъ‚šž№H$I‘˜щЛя?з[š—UР‡@ˆ1Є{а§Щэн8— й‚DuЃх–7Т2ѓ€ œЩiХqQє$KгЂї`в8ЭP7ЕЦЁ†‰ПИйУD 1UуоŒд[‚(—WЈюОGэ>H5Лўч№УWYПЊH.7KоŒђШўя›\ў9[Њ0ЧгrЗY­€š9ЊЪ‡ћјНл•YŒт9‘oђјн‚ebЕ^L H*AФљ/ОF‹КР>J[cЕвef1~Xƒ \уLыFKйr§(CЭюCЏцюК Љ†ЋУanѕЕ гЊ( д<7tpz ЁЪбыЧї7Kh<ФЧхв!>`&:†ФY^60ЈуQ1‚yІ‘žc:uƒИшP3АIWыШќЊ&c]е8›~Ѓ* 9WзЅсЛ• JЂ@>~И[б)АЇƒ1EБŒlUT РwqГЂ­Ва5Јщ””ѕСЎs8Эсf/ФŠ ЁŒшiнтР–”†Кщ§† Z"ІЗ Н}Л8ЃцУ1ъШFЛ#†ѓЉ-8§WCWT3Ш^žWЛ:Зœ\сЯ•єX`Џ‹Rш‡ЎЩ|•‚$‡К[ТфЬё!ЗuеЧw…x”0ћгŒc˜Э|ЖсЁU_!: ‚ЖY ™>єМі ь˜-UфЙъ9Ѕj–(іd{AкxhЪXЃ/)Ъp|žУWйр„u QSdžќюћ;ШЫ ЋшP7ђ—•Л~vm™g`  +Р2І“ЪSFО%œЏщЫ(:іхТrџ|мг– ;AŽгѓuQ`xд€dn ЬргOџё§ЛСzЫЪІmCIlі/>хсRќ`ž&I˜B‚еeоЯD7Љї‡Ж‚gKмЎ4рx 'ЩŠИњМ{рœ~УHZС“<ЯL§ЄьU•њЋ›•ъFqйЙD`œ[]“7ПbІЊ†‹  Љяt@ЫЈh+‹Š“э^g}ІЦ*ƒ=‡* KЁ†ŸnfœІqЌъІх}S1„3•им)Qš&˜у ѕn ќщaЦРˆШƒСu MYм.8Aр8rEЉa‹9>іц$фŠ"rLUЄжгёtГŒЖJEsшAш}šвщЫc'IвQ(–ЗЎя–ЂзЈНŒ*шI‡–І­> rЛ]O'„фжћ_хЄqпФ‹Кtз#ЧЖl&ЪьўnИQ]ЧЕЯ=h+Џw0вкdlDqZ"}‰џд'0ќ8Ы2ЯГШвеЭэШзb2YБjаіУ|@…їУЉ_УИ†D & Ч”щХ§э”г щ<]ѕkј€Ž ЗyЋ{Ц’МЦyoпц€ŸЋžˆ4˜Б`ИЁдA‘MM^пV›е|Ос3Х0‚Щ N#ыюњАюѓ^нcй(pmэЌyЋЋфBжЫѓˆЙ+€ў+|OЈŽЙoъVŒЫDЛžuAЅCNЖЎJЫлсjГьцNйяBнёчопЎŸ“]Пю)О€gѓрЬЪ~KЩtУ0 хЛ„$еОыЪЧ&˜SьўDћрy'že"ъTйёЭˆ зг9@&'ЧИД_#z!И PV‡tŸNшyчоъFЫ†iКО9њifњP снБ“Јm7В•bЄєƒнцž!‹@le‘_м|дf6пGLћ2~ь Ÿќв–iЈнF2TФчvš†oъšх›ƒ7+лOš§щtlS˜іKBБ2\ЏХЁЦž"ЖГ]/>~О_QФjУJЊU]я+rл~Є!ƒ&РM q/t'EъrVЇeзѓ<Ріs§t)эА…хшъzЪjVо—KЬЙ-QЫщl6Оћєљ—ї?Ž‹%%j†х"Ф‘FзŸРч]OнUŽеœ ‰p+ўmБt>Ї)žЁYžcЩс‡kЪ Я:r4…z˜H:8}ъљ ДЦЎЦУсунЧЗ?џ№ў—7зƒб’[-–B$Ж'œ{І=\Г U AиІ*0$СHЊђ*[?hžuЗK5ГгЯ3ХpГžЎТlЌ™š G“ЩшўУџян‡яооЋ (К7ШZаѓЎDдзшёdЫЃЂ3AВЈЯzінЋѕ†d/…4ЛKРifv7t+l •сXЇ&ќгh:›Яљюппњўн§hє№HrМ њM_ТqЁoуžЅёфrAа,PХlA šщиЎyNЇW[@›eл~ꈋЛ"є •_Э)еtЫ—ЉЃЏђГЧбx4ИyїняонмL6ыщэу†bD9ш0н=N•ЏБД kšЬў€‚№Ћ -пwlG?уš- єїiФи‘Хшм• LM…кpК•юzXбЖ&ЎGУбунЇŸїяo†k<бД‘С4„”sПљ§Л• ыЖ 8Ю Гї§ЧуiŸ˜ТšTLзs,™г§LЬQ“mžѕ€cЙ^ Lа$P ^LtWxІLІW{рЖoS•Dže˜ЭшУ‡$ЛляPіpлЮФгЁpРћІ&0Ф^П^]—EžФОgwгЦ№рѕYј6 .HиРЛЦ7pк-OOЏ‡&rрЙ+Š,qу›'ЭЩЪ Я]^–/Ц–*ЩP]ey$ЃЉЪ*}з%XШ†NTŸКШRfŸчМj@жyННВыGEРЙХtй L4˜>ь№Э@„сьлцЅ-Г1Йyџ~B И’‡јћxz:ЂлmhЉ з2nш­aќсєЭэн 7iН’H9(o:˜p0r‡ rВхAzежяВNуTKTафсу/SNвьћ€;L,Ї=фlўддЧмГ5v9{wџЪiLЪЇчCAВJpЅ‹Иž+z‚№„ћgy–cˆЩэ„AЂUд žгиwёћ&2MeЙвl7iПDи@“DіЅрeзKмНXуtьъŠRНХ=­9цbРЌОin“Јб„dИ;ЎфaПК-аЫЭ€бM/kOxцH0—зIНA]Ф§xЇњ@,t ž>T˜ёDа=ь+@ёи•qрš*,FsˆЙf%эсз >Ca‘ззS&bМ;6‰яћязg„wm+fUƒ­њУKлЬitmџТКpэФеa5Кšаœ HVўВзуД/BЧPxfq};#‘\žКŠM ШЩ4^яа-ыxЄ;ьеŸіxbRXš"рUмЁtькІJCМZ`1КњeИи[ѕЛcяmlыEѓСp2Ї$-ФІ+юH† Q^mЄ‚@вУнЧУгSхMмв/vPьŸ †-Иь‚3ЃЋwяЏЧѓ­`з{ ы} Zє u[рБrˆ Ђ0и$ љЇт`}˜@ˆ@тM i=œГВ0Еƒ\€Kuhi€Rv~їxѕіУуŠтЗ=tHZ ј0ЋсlQUеJOЛЊ*"H{Џ{Э‰KPЇ}ЄБw?e(ršюCb"ѓIгыїWo†$Џш&$C]  ev=c€~Ў&5ЪNcп1ДW>FI ИфЕO‡ФПЋI‰Ÿ`‚6ЎL-ЃЧыЗooЏn(/pш[ ЇS[Ÿ~Адф>нОLАЩkœћЌШЗљ–– YNЅclомѓ*FLЯвї‡Їж•6ƒыы‡суЭћOW3QеœИю фсXЯa'П|мТУŠВjЗяЊ КЊ_хь8РЃш№eч[ќЇ_–ИjЈ!–Р@я…ZŒ&+’Zо~КЈm†H&;ŒїТж„эшУЛ)Ї@оv'D"Ў-БЯV’ПьšŽ?>Ќh†fIБтнщtШ-HФј9јХ§ЃЊfRэv0MЛУ!3f1К§xПтpп{йхЖ&БЏGџ‹‘œ(ŠŠщцGм ­б“Сp:ŸNW3VŽЙ8‚BЁЮ‡œwEAŠЋЖЪwG`\…-1Ыљl2œЌЄ9IСЇxХLїgcUpƒŸюА*C“йЭlx§юг`С)>Ђ’ ˆž WищеZ–u/ВН?ДPГCШ,,ЫRЋХ†‚КŸxКєunB 4УДУЌЦnѓ>]лд$ђс‡япоЌE{їєR]"мЭMр#JВс—;р‚m{ь шЉТc>Ы9!™Ж­Kєљ.ќo&щ˜уЊ—=„eвА_МљсЧsбЊOOЯИ‹%Ян бŒК—6Рьиъ!аx€™uнnпyQTИяcп–‘mЉ§+­_§`ўŸ–E…J—yфќєzАЂ$р"89лВЌЊ*Е5q+ЊzаEoв8Šт/Јhъ"vьз9%ўПл†Є8еp“иЕхѕ`LšЄ5.<‡Žэњa`k*г'H+mqŸO'№•фШ3€uжWЛ?хЏ ЪЂњ–FOЇД ”&­qs­"v;4M†ZЧ)К]рžЊ*Kqэ-quя[нh$@юsLa9ЇYњ~п$ЎТ,Я‹ЂмS("r†}[—Eя4nŸХГпШч+бДK^O)ˆ“(Џq•ЇѓA2Ќ ˆ63ВjЦЎОlўё\ЧБMуl[Єџqc ЫT7WKХВАY‹TO)bK Ђ$ д|ЫЇъa ˆEŒ§gUg žm7щ?cœ,naNšКх‡1Tt цлpBEгU•Сw|о*šWpЛ’kЊ"Ч‘т[zќgS€Q™&аŽ^oš5Cг<™|CHšзњkv dš§В5 љBxfЛšм}МнˆР t]F‡4VёЦз<Ѓ3•[ўY[m($Г‹йxpџИ`eFZAЇ"фщ&5„эђЌGТЯd+‚Єh–c’  MЋJŸдж€Ўђ*Роћp</СОЕЃi[NТнšPTT//yїрАeщї[9V›э–ЄО§эЖ­ К†—nЪ‡ˆж_ЪєJбœЏZс€GВЧ мo#yєFH:8ыбђ\з25§зж-ќsљ–ЩC„Œ'œѕ`јПl[Eзё Y/@.Ѓ§i3ЉkЖлA<˜Н§ME6ёJзќ‹;/xХР#F№1ОiќŸŒї `Нxњт/А-Љ˜ЖеЏгFњ‡ADЊ›ЖeќеМkFPљлAЄПcMб^€ќъїпйЖФя7Огі7RRОТПиХ.vБ‹]ьbЛиХ.vБ‹]ьbЛиХ.vБ‹]ьbЛиХ.vБ‹]ьbЛиХ.vБ‹]ьbЛиХ.vБ‹]ьbЛиХ.vБ‹]ьbЛиХ.vБ‹§KЦѓмoъ&Œџ‹бZ‡ѓп8ъЮђ’tVБ…ѓ­л(l џзЛЮhеvlKЄEљЗsё^|РO,yгBМ$ъЏўŸгmЯu5V2§oПТ70cЪА,™,'­"KSџє_xщЅй~ьй<ЅЛŽѕяєћЛ&шЭЬш4ЂІёе?щюн}Ок№ŠхчE lhЧwmіъъц \ј LXZ$ž~ИgЬlщ/сёцучЯеДНМЫlj)Iш@Иo4зї,ѕ7рѕzГ^Эю~њy,…mњы$>}Оу лOк6gK=,SG' -LbпБЯ$Р|cн*7EšиЌЏnљ<т 3jіЅУL'ЊыаV +Sп2_§ђцџбh–ЁзГЋЋлћЛыћЛOП| n]{*о‰З~ќx;пЊVвэ ‹XHN ˆЃЂ*вРбП•ЯkVбMУPŠ жЫљUY=nwБЅЪВ8П§t7лЪvкu…E’š›uЈЉк”‘kˆп(aoE /] |лдdY‘ŽdЭŽЋ]›zК,QЗя?ЭXUїŠ§Ё4VЗуЂЊŠ< lщ]ШДтTг‚ќ[Y щзВM]еL',ъКH|SU˜СonIХpвіxj]™Чћ8Q‹Эж˜щ§э`жпDСuѕѕ.х л у4oкКˆУ8ŽТ^ДЇiѓРдTEfЧoџ№ѓˆзЌЈоŸОSSтDнЖ-]bƒСtУЩ2ЗИЂLздПкmЁT>.Ъ^šДBiцЂЌv]jЋE’Ћ‡wп§ўчЉЈКеўєєхЙL‰e8Žк,f“%#i†cЋ”}лё\Чј*XŠа /„“ДЈšн‹в**xц&ПFƒы7oўюЧБЌЛУщщщЫЉ ђЬx:'XХіЃ$і v#ЦЁcЊџ-џu“,'IУРї№ndTuG]иУсPЛтњў~A,юо}О}ѓу€CЁˆ§ёјєtЌCS$ ZD$RЁєДСŽg’ф™oЈgVЎњ[Ж0ьА€lы:ЖуњIVdiŠ2]Ќ3УGB”…хэујѓЛ ЏЧ(_кNOЇ6БUI1Н0CIг>З…љ`%лQ9кWШ€Kг^ђТuA/mтgЛCmKЫЧЕbш21ž­n(ХЬwЈћО;>=ŸК2 у^ŽnПыPJЃЇBЖТ$АЄзŸ‹KнєГ ХDPа6 CWЬАюш oњŽИ^lШб€зa6eUЗ‡ччЇгЅLOЧЖЬ’|wh3GузѓфDY€"dЏэЕЈ[~RяšЅх bsЃ8eуiы‡•ъІ:Й$v>ц5ЇB]BдХxўђмK:ъи6мЄйwm…˜.D'1дW“ЮYї7Р>ЎyТКьіMХgЖГ•lхЙ%ŽЧЌ‘d ЕeEa14;G}" щуёљљљЫщPЏиЩЎ—S ]•x\ъ^VDЖ~™ёПa‚,ЫЯЈ§)щnкvmРMdW С}•œŠзЄš )2?№šІYН:=?wѕёЫ—?Bъг(VѓrDn›*rЄй Tт;Кў:C 5СГt˜І”b%ЭБЋВРж9‚3m]m$7лхФИ,ŒЭєƒЈРЁ~ювіљщЇдт—МЅE†Qж@Ќ№ЄhОe(тЋP1@H^ЙТЕM•мЙ– &жОЩ#уU•лPŠ—ЃXvьh2?ИсtРTn9Ў{>VЭё№|Œuj­тЋ˜šЄЙq]"дЁ*Ьы\=LЉ†Љ(PЗQ˜МџљzЋ‡Э %“šPкGRjXЖMyлгdіёуZTUM7І$н Э=R‹^‹m4a3!T;.‹8@јзК!аŸЃ@xŠт<Й]+^7џїe`J2Sp9ђ7№4‰Мџ№ИdQ”DЈ‚йсЫѓгёљ”лмlЙeшэj|7иШfca5ЙХh  ќь>“ВuF*=NзДdХэЁзjў й'ƒj„ЊЗ(€ZVНвв%ЅŠуХЛ"Ž+›‡‡1Жwз‚•Ёoe ‚dГођКТKѓcъЃeЉ*ѕDСЧy‚“Кь”ЗУ УPфzЫT]­91ЗЬ ЕЎ ШoрхtШ‰"пжU™ƒ‘йt˜ЃŠvя ŽЌФ—9IЗuQšќљн„DLE$fЂЕP^N{п]ю SСВMq=[PœЌЊВШqSmз <лМЬТŒШЁаn:ЖЉѓлѕ|јјeЅРлИ~8k[aё4”љиГ(n"їєЇ?œСЃXrК‚аѕE0!PeК–$a§єeЮiP1#˜Я~ЅYQ ЄоEœЈPЎ,C’hYКИO&ЃчёJ0НРR…ZЭІkп2’@й†Шџє7œZ4ILЇŒюV•Pќ§tоGц•ШЉеlХЈ–diZ”5Œ&œ_-јў?e 740UЂсЖЂ$Š*ъ2юїиЇлЖŽUšќЅ‚aYтё/јqДe)4ЅХбу^f™"9gTЭP˜ѕЅƒУ4Э‹ЊкwUшккЅ0#ѕ&pдjAiёPœ8Ю ]JъАнеэлТтˆЭqдb4›?оќёп*pІэЅЈЫ >П e85‘Ў9ИђaAIР†QждЁЅ_чAу9z9Ž€љ№0ЁјU€хїш6ј~ЈC…œЬbzїсiќјсџы)Ѓhgхў№‹ §Бя-хy^UEъ[ Cт\кЌЕ)ЕЫСМ tOи.ЄъЇ(Ц]е5xньјгЖ№ФIсˆРb‰хlС№›чяџхУ’—v'(8оa—Кщ#vMБп6MAVтijKnHŠЂœЦха‡ŠjЙžу А *C–u]УXc…ЄS[“%ˆjн4TіЫŸ~бœ„BЛQtf €nLŽ€“рcюё“–Yи*П]ŽŸюЧ[еЯo]j‰Q№‚(ŒeEжˆ\?ЪŠ>Hр§‘Œяqђ{(Cу‡ЖЁЭўњюqЕex€zДiƒ"дЁБ?Нo*Аž|њи‡ŒAЯ'Д@Ъг/Dou?ˆ_ћс№TїЭ. uХBR—§;CєЃНпхНežЎЮПџ4ФŠI,—$#Zi‹]дJDлVYф‡i?вhЖЦЯSЩВ]лИPT>6ёQPѕиЖ(ŒЎВЁЯIЖƒшЎ{Ÿ‘•Wn] ЈєєЏїsb=нМЙ›ёZиѕ?|ФА>РoаDн 1гСCjњUœ‘Вn™—Z6в1!ч>ЁJjъ–Г!^ЦiрВz р~ dЯ4ЄЇяю—r5Оџјў3ЁXisАElмзxVRхј˜7бя]ьТ†`щR9OШ‘ЄEƒoИпEжvm`М4и ‚ƒОЦi…ЯКкхЈynАЗМ]n6‹с—ЇбB2QCЃыp‚Й/ RЁgCІsb€8wЁчH—T3Ё”ФI†ђ{Иь ­7‚ЬЗ/гРƒЉчћ)ŒpџЇ)ГА/фыїњ0šЭЦУёš 'оŸњIx<‚ƒuьуRbŒ™sbQї„ Žм ЎМNEТѕ{,ejmpКlpJЦq|!н@D'žT|ўўЛя?ц+’WАKCt`ошљo8ъWђРm]е!ѕCJьЊ,Жй‹ei:IPЗњ|ш cг˜фpкЅ№Ъœы:ѕt‰ЅЖЋЩ—џќУcяБуИ~\гXR ёu№42TZ­Ъ"Kc_йPИ€ј5н I~ЅI’CЊ…ВЪe–Мƒ9`н”ХЎЯзбћ*„ТМY“$ЙМџыVГlpJŒkpЧŸ•`ФUYтЃ ПзZбюа@Г+’(ИLЪцoлЖ0Y ЌMUШѕˆЫ8А.вЇоиI,АЋ‹X~ц­ Щrx€‘mпvl0{Ш‘]Ђ:w„u|Бж м2kNR#!o™{ЇФдy:кцЫЭнZ5u@,$yѓ2IЯ„gм!Цёш;ТMА‰оќЅ8|рћўЇ1#E‘гђr)ыКЁ)-:9рЄSъ  џ=ѓШ€З=<ЭWГ­bG‘я]ˆзЪPГx№ž6ПумЙдoІщ‹2dˆhнIфБ:­Ќ №J‰^Юi=Цn%ЦsNїhЏџщ2ŒЎЪ"Г=о *ЛЎ{Ёец­ІИазWO†^ЯSА$Ѓ7„Iћ3ыj†eТЏWВDx>\pzвяEРю™ <'œŒXЈb ›ОЃ лејсyIёЃˆŒсИ.Mж^  CоНЫЁ‚…eЯl!<рр1Р †.фkq;o$+§ЄˆЈFyНэй@[WP!9{ŽС_Tu3 DH{PАэХчa‡ї†‡\–*™Aйs>LcPkJ b1$M˜­d x%0tХ-ПЄŽSЗЏШƘ‘ЪУ‡ь§і=§’›'p[”р„€Ъ|ђгHЂ|п;нeЎСВ™Д§ђI‡)ЏˆC€}рГВ}\Hš*q -j: /ТжЧЁŸіІ!л янHЎ/^\8]€šсќЧOBfH@Ю‡2А5\ыещОЮд‰{ EЄІї3yЂЄ™aгѕХАч-˜'ёѕ дl МPI;Ь9‰ял—vzУБЌbnХ Ъі№ю]9&ПЂu %НЬЯТWŽч™эќљЫч1­рі#ŠIЏo!œњEЎ"ttн €еeUf€№.SРџЭ’^ЯзыЧ” *лУЉ-BЫ”V+IЗŠз>ќЉBC 7Фjўќщ§‡O„$їъЅnхЇУBйюєZЧыЬ7N2]рD`ЁЙ†иЏMіcd0™gjтbHA!+ћЬ‹€И№4aЛœ>?|ОyїУ‡ћЭKŠ #эЇX?POаil{ЬH\[ЅжœfG№\ З4ЏЗoД­PєБ‡^z†Т­ююУ ŠC?П`†%І*ттеУнэЛ?ПџјqJ14+ьsтKxЛЧшDŽƒглё|+ѕ;ЃŠb8AQ.>к‹хjCы>8y(ˆvб-Дf9^тўм1бюpџЃ)Ўз‚aЇјд\tЉЅ)0nЋщУЭ_ўјсyU™˜‘4Э+жЎOвИЙЦзЩщ†W4…_MIб„xЖ1Щ8њ—“Ѕ Я уž8§R#Њ4pmiM*fXї™ЗkKWYj=оНџыŸоЯhYеH 0у=ЖyO;O#žWdC~5$5$њžуКžя2/{КKД=sіv!Щми…žЭ-xЫл~ЎО&ЁгуЇЛwпН_‰*0[xш^4ˆ;Ї——УЮ3И%cXЎg)ДhyiYfnВuчТ'вз ђКчžY’ц€™БVј–КbLЗxнЪtь2[y†кlVУ70œVE ЎЫ ь,л"[ea&јqКЖ—дибЬzЬd_ј ‰фy~ZUyь놉н№!ВІ LƒdM;G:#ytMЙ%1Ул%:феqєс5Ђ!WљUеђ’"Ы2рDl%d‘яX—všД|?JаeY%I’5 ВFйк†ы“^П:qъ;r–р_н<ЮYEГŠ7H‹qіžбяc“р/‘­ @†lwy<ђ]гМє~dбqБnщ2Cn6k’bE#(ыаR L3Mt &cпЕЕMMЅŸF/Ћxx wТOЏ+.€эvЁm [йђђюќrШCЧp/“mъпЦФk2#‘Ѕ)b6_бВ“6…orCB7м8Џzв Ќ Ђ> €mQOOЯkШТŠfEеkЦdирfЋа1™б bЇ† ЂсњфKЙ|_mж .Ёц`YAївІ‰m}s?цUMЗƒнЁ'л‘405euџ‰fyQ63Œљ—ѓЫK Єа†RС3b П<ŸrWЅYEЪmуmрP/ЦV.Ь§bпцЎ!­—УЋ{шйэK€oВШŽ>=?ŒзУАЂ–є;П_^ЮЕЋIВ$ђьzО‘Эhџr.\m;…пkшцЅ‘щЯІКЩ8‚pшŽ• iC,“бp%9aiWЙэєућё’СХOЭpw˜8аэЦU†˜.ЗŒI/?ž;˜•фчRаєFЇ …d№Рj ХЬTŠžАКџсIаУіˆK;№‹нЮ>џхЧ9F“уњaК?ї; O/]l+ьєгєЭщX…ЖБ§|ѓ0]Неё[ТёУ’ю`ї‘`йumSš~ЯkЎ_Ž‰*Pфъщу_~˜ѓŠjb?Њъ<†ѓЉ m‹}œhŽ—РeЊШЖдЗ=4ЗЇЫЖ_WƒaЋХЛAКІОx7’ѕощѓ!VšкЎЦŸ>ЬXIЕТЂЊктVТS›С4\ЯлM*(4$G‰!ЩЗйЇўjІ§нC4އ*OГ<S›мЊ‘p')TrјЌЬЯяЦЬгAVwPu^wгšЬГ-~Lj=ФнGPg$црЗЖ§gн0AЬл36уъ2-•}~„Ќ•ƒг0ГъPfє!щъ›Ѕ*Ьh8xџўaNђZдuМЪОЪt™Ž&г%­њ nZnA‰|CЇzнљы1А0’‚fЙaж!Z іYиЃSn~ї4ј0$YRлv_aЈлЬ5dbВРIд–гЂ§ЉЋ*мQЈОйЩ­ожЊэz~TПcMўјФт>GмX ѓ rкЮђТ2›щэ‡‡СGёRиєœAЉЃ‹у{јœиФБ\ ѕm™с>‹ЗѕŒЧмqs>&†4ќюI1ˆ”M‹'#!l'ЇусУЇ|<ђЅТлЅИаT†–Ц?N8`Б^Ѕћ~ЙЬЕ/ЕAьС(0JЇsщфп>ѓИM)ЭK`Мћюхр+дќЫэээЇюSI5‚]л/Яи•RшЇwЯ‚n{€В›Ж)тjгЗ9HЮvvzi|‹џјa%*:@Ы ЬЮ.TЉЩУ§гxќјщnАR4#ЎБьŸ:<-БK<ўpKу™™М=дYЁЁМylМkXй їЫУw+№‚b8A)"3љѕ|БЁ9ђљЫ`ЋЂг])М9œŠдтщУЭL4,?ЉЁ:ъВ@Пe џЛЇZ~щЃАuђЫнуx>_R‚ЌУпNˆWAQUyѓ< UеŒЊЖиOћіTyПYL>?ЎEЭМш› ѓmюVg:>”’гЉ •^ŽОмнм<ŒdЦђКЬЕLшЦNpЄuПl2pКй›а”иэj5MHэAhТђ›ј< \Іпс)ЂЖSІяОћсiAЋ^ћCšњžыa›V’ІЛY]яO8вZ ™ЊЬ3‚еы›5ЩЖ•юЊЖлW P/_оўљoŸž йЎ_€ юѓ8Ž=ъ8žк€4]Au?5 P€ё(JГЋњЗшС€RqУтІf_&€шдээ_Иy$DЋњ DPP™І*.№v @sx8фАяk|UЄxšЫбЖ“СšЃ/З™ўŸЃ™–{ Сэ0šrѓДСѓ{§Q'xБ­Щ&ŒЄ9.n4eОУUS<БyŽі §}Е­‚^Лалbм$—ФР­<Ч6п”ЈќcSMл‚и$УітЂФMм˜)bMВ‚№к/Uh[эŠ,Kb/I–…зё\Š0вxЫЯQ›п‘Ыh[šІ)’˜ŸюoяЦЄ §r‹ЃYqY5П­‡џ•- ‚X-чxj˜ћeKБgчkќяlџnFƒу…П8пžЋ§m]ћ/ №œжзi”~ЉвŠaEЁ­ќ.Oќ?ЏЫz5pћ—}ŒЂiН.ф§.ђмЏMDdй`рєпл/ЄЎк™ћ.Щћg&Гу,CџЗ~" ж2оВkў?2Rж „йрєП[zХ§К"ўNŒцчтм™Kq<ћ;@џРHY7.ЛЇч›ЧџџчѓеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjWЛкеЎvЕЋ]эjпд$ст—цПЙБ†aЈЪЏЏ:T§ЗМуъmлОg§ъ>Xйv€зЭ}Г[џБ§лнf гŽRЯдџУ]в[Эі<Чм DЧЙЈZЫџШњБыo’Лч­ЈкЙњППоƒ”m7Ž=yЖЖ=Чи nрЏhцw2оЏІ8Х>д~аЯxћ‹щ&UъlGBЎ4˜аКы9ъя)Ф7zдd?‹…Мм hгrуК ДёXгФ7%Хэu\.Є‚xМКАФўROŸ>гЊгЮЁПvИkв ˆPqзЙИЪџ…б‚$ ођ?ЦoŸчЂ_Wž*а›СрііaАVЌА=fцтžq‚нО.Q€-xK-ГъВbZŽm[КŠ/YIн$І"K›СЧЛЇС‚7УЖ‹Ещ#gyйЎмEПY"yrƒ8Ц-Ы4Lb!Ћš:sTYнопM7ŒlХ‡CЊЭŸXг cМOб‘Г›‚ЭДmл‹ѓ]UфЈЩњaœф5ъ{–* “С_HеД§тxодx)j–уиКТЮОŒ Nю‡{Г§†—ђHЪЊ9~”юš^vЗЎŠ]нtmцщxнПњ0x7 ˜}эёЅ ДэlЙхŽй,ЧЯМ к6ЁёЖiпъВ4Те­…W{ЁСокд’шЭfC<јгрЧ…Ђћew<НМдЪ‹хt2™ЮV[йАƒ$r5r т]ЇжЗЙžœщ/>Cе'лѕу]YUx ќБыrS$ž‡“ЩѓЭw@Ї5Ž_Яe`дj4!(A‹z_јњvРк~ф;Ц7 еv<˜{€шtМ{7ŽЂ8-і‡ЎtђсyУ2ЋЛП}7јa"~‚zШэљ„z:Э)†хJ†–ЁЖ,'‰}ымИ?иZo ?ВхйŒ3’вd7ѓйd№,^еы5яђЂ>тuы/‡ТWiFqѓ†ѓРЇйRпz3Е‘PŠqГ$ЖŒ ћYнюwБkhВМntгвЖsJѕЋв8pТCwђ…i]SЖ/( КѓЕѕR0ƒМ*!Ты<0‰GЪr!єпJ*l eъ„ѕt8!e+ЌЧЖL!гЪФJвdš  8К]ŠYЁгvВЋЛsгОлЎŠLюiЎAIŠпŠ&їфЭVwЧxЃ[DзŠщН$ŸD|љp;cЭx†ёƒ9iѓ$EoжŒћЖмE–Ъƒ^7М0IwћУљЅыN]{Јƒ@~qSхDг/ЪФU%УБп јA€”‡–ЁQяПџ8SPnэt>ї‰СmVcЦESi–x№€Я$JЈBе вЅ PЧ6sсЁаВ&sФpЦ›~ŽйлВпH ŠjKZ}ўxџLШ 8”—9ж‘!В’5MЮі\№чЭ3Щ‹‚РёЊVGдьƒ|j‹чё‚ гсЬZ/ŠPUщЭ|Š ЕmWeŽС>}žвЂц о1ЊKžК2інАhыив$QRuMЂя>MIjЛ^.ЖВ”/?§~2}3|žmxQ•Љ9Ь[гvL…™ŽW4ЫМСн№ЊŽ‚Q]кЦцѓDPЩz…ЩуссŠЕЋ}­—+$Iм>ŒЖРeшѕbБuџЊЫOЇвU8V2м q5%(†йЬ‡cJVUўђWŸВЈЎйYхшЋOЯŽr@ рЎЌк}‹тж]Њб“бd<#hŽ^ >nTг +1$%X5Ъ#~}iwi†iQеЛизXŠІЉХ№q­Zц[AS$†ŒЄ Lъ‘pНЌiQтiŸ‡9JwG29YbCQЇя9Fдї!ТХm ИœЯ_сuРPєяPцБм”жcЪp•]мipd5'%Ли‡Ж0ЫŽŸЁ8эaXІ›wGдуNM˜ЃЊ*Š$rƒGAЗЂ]U"KwЇŸОіТ0#Я(•xBЕ+ђ4А…%ЉлЎХŒыЫwž–[ FщYђј~)щ^q<›а’с!мьъиѓahQOQOЇн0ЏZ>Bђ8aў€(†sшЕвсЋf;тpЕqАОtК^БЂюFyк:5ќ2ЅuZJЯ  ?wXЃa:Vе.OЂ( uuљ@k*P'ТђЄ GКзW-€ чЛК=žБЂF6?yІ№КэЫг.JAйЉ]ющ2=ŸnXАhwhSG™n­bњˆLq_ІОЁщ–gЊЫл9ЪrуШІ—‡—^ цА‹('КщЧЄЫЎЩ]•оiY7„ _МОсge;2З]“МцY}Тшpјpњ#ніЛ,vt‘8ЅiЫїO[–ƒЏE >cђ8•)ГIpP їЈN9 GŒŸGK’І/м№tв*l‰$H^wт]ЙoЋРЁя);AeЪЎЩпГ E ЗМ,оO№ž 0Ћ9ЅgЇЏчЏ?u‘ХЬ‡wЗ$ =$УрК"PЫщxЖо^v*Іч‰g›5ЋA”ТьЊwyVdГўТєNџ+{пй$Й‘$л?хнюR GДЅuЈ‚жZ‹*ШRнќљ!Йяоqп­UљЁТ(lЌgШ@"вУ=3‘Оп%Жa{>Д№ѕpМ&oЎI`ВВH9zЋСюh/Ѕ#ѓхЌsG%h%w№пIЁѕЫЬјe№~Цœ)ш(ptfIIІŸu]Є№K ˜Њ:xтм‹ЃpшьPфТъёf0јpУhэeі ?ў<д|h‰ПМUž"j–F>ш‹ч› чЅoi‹лЮќЌž Ђnz П0ЋЖФОк†ЖЪ Zр‰ћ'он@Ё„Š лilˆйO>пВЊоZ УЯ3=lо`ЄaтzAшŠн™цeUžŽm‚žGŒœм<Ю:УqLuй'4ЧKЖ[ДTU‰юKgĘvяz‚Wš}e Ќd%>ZMЎW4ѓrГRdшу u:,TаыллЉЩЃd“JoЊqъ9†" 4'H"G #ˆРUЮ”3Ѕ™ЖЉ=Ю2]єОБ u§є0Y’Б˜‘Rаw‡\giAЖ&O‚$A7q–]О|џ#Ы№”‹Еl„%цќ•рЙЧœn{ˆ@3QЫёќ0ŠЗuю[њљЙŠ<эїЛƒХZВќ(N’§Žыfзv$nЅ/ЏЇ‹5MŒ‹iчіпMє43 ЈЧЎ•Ж3вk“КЖcyК@NI^k­>,гажЮЈ_V,ОЬno!YAК)ŠЂЌJX˜-dн’Я]fђ‹ЩlжП˜“ЧяО›РћРЭ‚tSBУFЫq,УWђМм7%H{™^.з№j8^Vн  є|ŒbZІЪ’”ьХXU t[”eYƒжЊ1 %š‘œЂ".ЏПHЊfƒДктbщсаrџвш=>kU[м9tЛsNѓaьЯЖ[ЗВм ŒBЯБ§Ќlъљ‚яqŽ W жIГ ,€7T4ЁѓУ§J’Ёі=?J[—rШјˆ8ГпЗ{5UБ‰ЁДyjжЛ{œ№6`|ЎЁжУ ЩЋЊШ‹TU™gЁ ™AGn Л*@‹УРеužтЎ@ХžЉŒОџЙП].+ АчЌСAў:Ю№xuœcл>rЙI|зRйyџeІ€€9›ЅІF[Ды†q‚дŠ,а8^CŸp/Ю!cxžВl %yЛІ:њю‡ыоt6_.ц‹Е •b#Œ5.N›N оЉьxА†™{.wњЅЦy Д0Pu‘„кšб @НИQКІЖ-qАkШ@…яќ§ћOwЯЯOїwsЩЩaюъ}+Ыіyb +fio5сЎ%Q‹•ЈžЋPОEЋM Г@_‘Шw6i кƒРЖјІ!ыЂ,ђд3‰МўяО}zМПЛ§|KЊnЕБkwяš*ѕЄ5p є… ‡Fёћ* ]ƒ›ЮЖЬDxaќЋУ2ШчиZOEhay™'ЎЎшZ лЮH˜Ѓ9дЈЉЋ‹џчЛзїwїЯ]жˆœmчм5yl+ŠЎЉk ‚6%РцЁоОyFІ˜џ ŽŽGL:в—KЗ”ы p ~TеЩкњЈаКЌuqњщoџўуѕнcw2#DаыяОникзп4§,M[Щ")V„ ИG+й3nЮЩq” ƒzЦЄgНr ћВ(]hNZРohŠmЙ гаDЊїщџјљО;žЃWЂl&ћv by@%xа70в4vлy+м6Чc“х|‹V ЅоЃйk0K(i|ЉMБI“8ђ71(ѓ&ЁШвФ№іћЯИ€w–a€ЖЦС>Д–Нs 235b4ƒђpЌSЯ”ЮЕ I{qZэ=рхiф§Е ƒ˜ Ш'QnЪКэ[пEDgaќq(™№oЧѕќИlСГ†6˜ДяЉЇBїvbnъ]™ ?ђ™*D†ї€ЧCU6™ьрvЌј.xUPаб#Н…ЎzZшЂ D‰~" гѕƒ …U4ЧvlпbfОнUлўЋM’Fjџs_Я`FdЁњкy’VЁЂ8ЮƒА<о9рMXаTJшn9ЬJФ<˜І6Ј~@&ZОoЁџ<ДE Ј‡+x О— ž_“/У ˜0гAт‡ЁЏž'i-Jk$•uъˆkb6™.HF2AM7MK№ъm^b7G .7И”ћІ!Œ!щ`гvЫ7`ЈЁЗД™я‘-еи[ЁІ=ЁџHИРc ZТР=гжœ$%М]@*Бз]а’nћAcЮэrЫОљJ"яюСИg›а4Ѕ ­~ Џсkeь[&phыЪ~o–„ОA=?,l7AрœIЙH>Дь*>u7щЇйЖ=ЧУ…VЗSS…#^(& ѕZ7(ща €ЃŒбnДПРб.ГФw„Щн—аЮРпЗЮDM/оlбЛZюНˆaœ =ЋqЧЂiыуˆ+5˜5rЊmЉЇkтŒвкгdКfХИl‡щЖЪі€дMWwnožG„d#8з<М"ьа8АФљ§иЭ ЉШžё( $јыa ,de;вЉohв’Q9VqЗPЧ_љєЎо&iVДч>6‘Ћу<щ?м>–‚Ю™’О’} ЩќГч…“рrxлиŽtЇѓК=НдŠФ5‰ЃЉђbЅ™ІЁђфZВЗ№Œ_щє`:Ж)№?DР55‰Ї—ГQчБ39уКиRДЁ*"O™Mд8СAj;E“yИ:iZ›v]сЧMdщ:?Іu“^sŠSхРвyИ‰Я гmЕCжWќ„хГяn1šЇЉGH+„nЖk Œlc5;nZu€9зmoŽ\CWЉ^›Д&‹ВжПЂG{шз$аОн:’•ЅаSСHГsІ u6—žFrЗУƒЦ*ОNЋвЗ”хL4y,”ЊZ ›šЪO:+’6!s;з pь›_ы^~<фž.ѓЫўc—V ЪІ&­iŠ,ВЋё—›ћ{ј§KRЈћЎѓюv№O(–i{Ўык*Пш4Г&‰ХbAЌиГХH№ВM/ЉOGЈгTјхh!hv˜якў IG У1kžпмонінЇБZѓ’•#]:рљ­+1‚Ќ"Цpд‚\s"KЭІгХЩЪЙЯЙq:”€ѕІ[o€М;ЖЮ,H^ЗвцWТY'&d,ЫЗ~Й~ю-–Го VЖЫЏG Œ"ƒOYQUЅѕtJЩІ \ф9AVёЬч‚X€л˜:є6\ќlщ>%GЂю•ПъП]jР<ф9ššПќј З\$ŽЧѓAfмДKІЇзSшќ CА‚ШН!kКЁJвВLуь_ПШЎыƒ$”h„к~–љŽСŒжКНi—DaЌS№ŽЁѓб§їŸІœЂЖЋхЎŸTЇг+:ъ蔉­ш–ЅЌa ƒ,ˆv<збяЁК^х›4Hu И]зЊCЫ$IнJvmвћ}hВРб4Нžн]OYї ­Ј§m›h_F–Ц2Њэ#KOй–uˆ[ЗgџЬHpн Š˜4В$ЫŠЊЉš•‰­S+нŠыЏ›W‡}ц˜†Ёщš*яGЌЌ9ЩЇСЁ-gx.B,ч|lŒѕ~ы[*7ыїКно`Тauje)TбтўК?[‹Ђ,‹Šэё5DƒЛvФtМ AІљаIQg /w#’yЗo Я‹в g;рX…LЅ†шн}~d4З<рвWсС0sФѓG4  э8nдВ%DХ}b+ЬшцŽP,Зsоћ;(Ы2@U1(рлŠV(Fђљ‡ыЕцVэRЄ Ьšш_џуЧ1€фХˆ†уёээѕэTЦŽЮМ<ё@ВГz‡п2hќЛбшЏa€ЊЭЫ Uщ~б0\пГMБћУЋ:єыыЮWИЕ>~јiФKŠe›bGїЏЏиъЗ№ЇШ> 0Йm…gЈ}Ох? HSВЩr aу …ю[Ід§0UЏ~EэŠ(№,й§мЇXIsЂЌЦщЙУЙˆЧccЫ’Їs(Ќкo]MРЃCь{~нLщ.Ў(&јiL9Ј\Sзз YvЏ‡4‹{ЊN_-Y:yУŒŸˆД'З‘eшD‡T ашhwЭДL]~ЯяWбЙnЛђxpЈѓ,Д5~ід.‘сг#žм A@ъТАsе™Д …5ŒєБ]ЭkЖБgыuз]ЩFPь‹$єХ˜ъЛ~СJ#xAZэo‡* Cж“1­XQuРh№Е& ЛW_ž& GpЗіpТхнCћЖ. ф§]%›сn_n Т‹yWb„Є§И^‡ЫbGЏЉ•hX>dVсYюВШпT”5”Чu—`%эС\lр5*ЋџќљщjI‡хОнЈ…ЄыФ5ееѓэyW€_RтЙCћ6п3KІ“O•o їŸf’Š›œбЖй—@&bМмн?м]СЄ5=ЎлеьfкЃSyђхSOЕni7в5эл|Э<“M@р™–вџљ™`x|л~ZCbЧЬфfнчоxвЛ{И‚”о•эс”г>ЪЪЬŸveис&ЧO^1ПIЮWМaњ%pЃЬб‰Л/ЯУщŒd<Ї:Аpez6Ѕn5xКZШ $нlK\М>юшѕьхЫѕD1'ž)Гдћ,р§З л‰ cкђьщюіццi.Ш†ŸƒNмЇІЬq {%ЂsE(šTERЊ@яI№ѓжХАѓаХУš.”ЦЗЛ}B1m'Ф=њф–Lю?ў№ЁЗd3кНO5юСьR™Се’іђ|SMy8О.ёЬŠœєzs^ГLу§Ёюї€ўgЙ З€fDžЉЌз?|x ЋЙѕTuИ SuE˜`MыN†ћX ТїЇнЦЕЬіГИЩ`B+пžџ”к.uЅyUІОeHфуO'Ћие/ ^ї[рЋžЁЩѓі&;ЎpэПBхPoтФš­ѓГчЋй7Њц_cе^эсA‰l"(LЄеуhIЫv§†K6ћ2Я"K•ЁeаВbа(ы"‹ЃOУmВ?“њ3ю%uЄ a’„ŽЅГ?||šŒь6Џxvщ) ~ЋGIВећ&u Š^]§ЏŽњ-@‰тY LhbО Щ_3 >тЊ)71Іьyј)Ђ"~Уўe,5H:HpчŘ Gгп~6е hPЁУ ›К, ќ_ф.4 8Нэк: "K AДЦП§h hn^у &эOПЇћ_ФR@PeМfl>xјr§8œќіЃ№Q%ИіЫвкUWCг4Ř^юЏ?}yш~ћ^kT@oсVяМbwЮ T5H]•ћыІ<'VєzMЭЇуп?Жgu#№ЯП{ОXГЂфB•Иѕяtˆ7 ржв_w YQХУі†ЎHПwiЦѓWNz%(@?ƒjк?OnЋэ‰ouSлП‡YC’џзЪ-)AХШ&зјciCвџх€+ŠяКвŽ`%љ[ жsХљЏqЙФ%.q‰K\т—ИФ%.q‰K\т—ИФ%.q‰K\т—ИФ%.q‰K\т—ИФ%.q‰K\т—ИФ%.q‰K\т—ИФ%.q‰K\т—ИФ%.q‰K\т—јw‚„?Мc§WИ.ъ_…fйІ*џПдаВЎ§.цњWaXЎћп,,$ЫqlхъŠјуЗ№чћЯw/[~˜кЙпC0Рw`ЄUлќKŽ7exл­§ћ ~]ј›3ь ѕmъŠrЯЄЏ–ЌЌЩоmyœ™Tбя—=Р8ыЖПнzњшJ№ќа54Ы <зќK]МГP§bcЖSё“&tлЩі‡{КRН0у(NBЧ>›=їПД(KMTУ‚Љ—–‡SЛ†Ь’kN†СOѓzlRW&ЏлБолЯхз`uЫRYj9NH]tjЗихЖB<М,ЯOWп}rэ ЗІŸ5Чн6ђmУrєск5UsШ]eнzYњЗШ™Phjмrв}юNFDŽfwгDКа{ІeM•иС凛™ iŠАІ%;mNћ*ЯасЛ9›"Kђ}щым|ЬZЖeœб„ў_kЛAшЈєМџєищO)j9щ/+-zš)F`ЫєръКУ(КЎВ$T1zUЕf„ш U&žхЄu{=_H€”к7ЩіВmьъ<1ъМtG‹ХЄѓ0Qь41ФA‡1‚ФOWї#оНзЏrJPПО[sЅУ6аEЩˆЫ*O•%Hе‚9“Щјџ/iгJJМф[уЉйŒX­ШёЫHД|G'ЛsйоФ*;ИНz‹Z6­";ХылОй0џд!:iЕпЃ_;_Ж SфН“ІУŽЖ5Д>Я9AEz2цЁ]№у1k„…'Ў{ЗW#Iї‹rГнЄPљыЉмфх&vbNы>ZЬеeъщЋ)"С|ЙпbЩ‹ќђj@pш=”яvUц;hЧЈR#RQ$jNk^^2;ОКя‰ЊНišУqŸЧQёzШ‚$ёmeі2M7ŽcШ;ln0‘Lл|П!%У4TfвЬж‚цnv€h­XќdМ^Џжœюmы"1e~ruзU(Ѓf<та‘Эї]ƒэП,лq-2Я7NŽЭАєї’b Ч24fxїŸŒ—œjЧѕы/П -[эKЋљhЪHš.ЏІ3F1tх=Й ДnљYbЩ{ЦBJккYWyQе5гjпГœ‘у~ўќ2]­W3ДєxџЫы+$Žž.ŠЌЙQљ7Ÿ.Hb6xКы/пG­$U‘ YolЅџ,К­бZ•ј!в6ŒN;Но`BЌщщ—k/ђБ\RœгќђC§ЫБкІq”"JCw’Y–ІЩIчiСВя’ѕrН^Мžl]mњМvн$пAWоХЖЊ:iгКr'Ъj2ЃVЙЂщХнЏы Џ IK‚т~y{;оN­m7њУ›2‹пЕuaо'ЅїђЁDG%+Ыmx“K`G]Џд Fgцн"dMQtТюї%нŒ7›$ŠЃ )^imбЩf/š–u™oЗ‰Џ3B@ыђ=T -[С&1ЕхнуŒSнтpк%Ж2ž)~ ѓX2њј~ш{Ж*OGŠnЇлВЌtFEGXєgозMгЮ]ьwЛ<48€nE"ЏѓГпКN+h=й:7|юУџХ-€ѓ„ћ4г‚ Adз4РЃ’(Šт@—g#Д№У(+ыжЄ Šc‡&)QшaR`Q5п`Fƒ'ОУ0S<:J'‘ЅpK@1ХђвfПЫ=“ИYQƒЦЬЛЊШ"зTУƒž8yЁбЃWЙ@YCѓ„8™†п Ш<єЉЌBђдб™qЇ7!Ю?-AЮIьщТš Y †|‹ˆБqЬйэЪŒлщеdОЅЪГЂHlr=eyєщ@a+nо0ы]ьЈzЩM€І луGњН,$еє"љ/С*vАAЁЗƒш˜Ѓ›ЕЁћђ.wUY’EfEв№яў‡юŠсXјkEЌНy…Єп G]>|HvИ)шїUъйš№i/5ш+ЎЅЌцЄhњiQW@““$ l­{НЖcшЇк“aX5]сЩйŠfž~юS,$ЭЃч'вJo€y™ЕЭШхјІЏИ:3уєЭгШ}>ЭWкL )FЈЊ 4”TUˆъ§ЭкI@’ьR•уžLXv:НСЇ AТ~Nv?}†ЄаЧ™ЭбšmHнЎфDU]хhZ”ЅI`чŸ‡Ђfšš4E5х&›mкъz>ŸS,еПy`ььИл5О@ѓŠZ2?yИЛџсЧ…Њшш7гџє(ий ZтiыЈzћЮЌЫУУg‘чЙŽi9аaфГ›‘Р• a|пу, ˆ^Б~zшѕЧГсѓ§3b{wЈl~Х)vhђд’ &УO? %уšТuПLu7‡ЄOћ"А§Э6rЮіб\Q%уxŽ&Ї ,DўŒў ^ю>ўr3S,Pќ№Птз§ыХАMŒ‡ŒW@вЅЭQkЩ uvЕ–fљхяї+AV5yнщЖ_п^Лzoъ“fMЫйхd:С3’фšUаqI?п DryћУѕ”S4Р4rкЙ}Ђu4“ЮгRXяwћЪуЉЏЫч%Uтцџуc—`8†šєнNšУыєњ]]v‘Нxžq<Н>н=єg+€FYЗа.о9ЃЛ;#Щtџѓ‡›ўœ$“бАћјJšM„JЦЪv‡нО‰šbeЫЕсYdaќгпoЛГеz9Lгою­^€&th›z|™.Ir9щ> з"№*зѕТ8AГжѓЇ55yОЙyш§сdAR$ЩРœл”х6Ђ‰t  T3„nhš$0ƒПбœР-GЃ•j† wЃ7šNo<Ў? 9"9Ў“€АF,яAQ'Ї˜PишЪœЇЉŠМjсv_ђjFq<Ыа ГxљщЅ€€iєжі€tщ„Ћb0дUЂѓ’DЁkŠФИš˜[ЖŸ„Ж)“ЂЮЉ5ŘЭHAГ‚5л `з acг@…l n:Z,Чƒсb6ИћЧGЦаЯЕ,/мBУn лZДУОˆ‚(ЫЫД›HŒІ t$Сf{ц9#з№кUхU'ФХкКjU& ЩCъћТSў“Й+[nKВќ”‰ZКЪЖlйжb‰ЂФEХ $і};СEў§> жTЯдєФDLюО~БD%.2Ož“7/s>юЛГљфёнЃы^Џ“,п'ЛгdoJxuY–š™˜І8єњƒ~џy.XgIЇ+&А47мГMЫrќС2Gзi^bЧXА}[ŠР-чгЅЊ*‹›cнtW1lЮ7šмэіo;bА№І†ЙрWГабљйЫрщўЊ3‘‘eNwФШ L’ l#NŠ (ф+ѓУu^‘Э8J{ЖeКхBbu~я*pЬН^чЄšaЅєpфOyAŠxM9Fb'ЛЧ‰jYкЩвЙК жŒЂёшўВENRUнw‚“”јѓDћЈF…ЎЁk*OПо04Ы…цє9amІYиtZ0я „[ƒфI€ЩА/…nœь”ёе\EЭ]&”ЈЪdE[ЁќЅЛє‡СzшЯгSpœШs oџtё8ayž[0K‰цzяїTыm>†Š62Ї:!yэy‚/ЮћЯK‘?UŸ њЊ9%СcА??ŸN%NœеКnŒоVyьiГ‰ьЎТ8^Й рAє˜+Plј{ьŠИx|їг/ЗШ”ўHДblђ~Kѓ)ќ_˜.xš№QПІ8нU)ђЁ|Т:фtД&œнmK€дМЫxqœфХ~ВЉЃŠŒ@Т"K€ЖКи{їгЯП}Мjw{Ню‹`&4ŸO xЌ7YhpМ„+ЧЭГЈVE.З:Ё`М(§OЃ#W>*aДZчq AЋHмT RBMК&џє@жŸ~ўщ—п.Ўя:Но gF4 yзŒ†­ѓи•EsНІšˆЋ ,ЏЏRˆ˜:‚гбЅ–ˆ8м‘–осƒ}c2PУ0Ю*ЦчЛОч™‚ь%yGВЮSьŸІВ§/ПќzёљКнщFТ€w ф*]™Њ&i–ІыйeњВ4С_шиы„Ч\zд”АO43аšwљ ŠБгАB1\y:Є5Ue6M‚ЎH7ыМЛьMц‹УrœdЎ›LHРQтЉTнЧ›‚/њC—{jOнlЛЯWц ЇYQVS…ˆђюЪS‡ЗЏFЃkВ:Яг0pЌ@ ЄS§,0uEQ5uќЙ'k&хxžэš…­.гаБМу3Sи†љњѕ^ŽЋMъТтdu_(M]Q)“ћOmоY%yEi)=œ&Л7Щ1\šelь§ Юу:ю*ЉŽ0O|)O":К­›Tš­!Х—W_љЈи4ЃAO6vе]eШ лjэZ*MПn3ЄЂCnž†рlycѓІBК\‚bwa€‚ЦHіЭuSМУЯ_j~ЕЄїйЛ[19|8кЉP0 NVЇ.7ьwŸу)#YA\4 бW€ЈfДгUГwiВŽz\wЁ™qЊ‚,n’гЖсLUC˜Њ<]GЭДлВeф{юЩŽцьU\дu™§Ы‡1ЋтЅЏ`&e@твuIьГj’K]yаГuэBDњШяЁсf(=њ@бˆЇЅ=o 5ž>ЙЛe]P^dEчdюZœЪэ†:8ж€ЋYУъ2+iчъЃY–'pNeйŸы’yUї‡ЃЭћЦC(jтM ТрњcWВ=јUг*yš%ƒЫGЁoNoFvDЌОhh?Н`Xај)egђi8шD3аЛ Xљ4šЛ|[‡м>ЦЧ­‹M“Ol•щ]ППьЬЧѕ\ѓdtšУ&x–<НЛсЃ5ПБЕоm2lyAФЌnH=Жšœ:Д ]шO5гёhфЕ›@#б‡CОmšЖфН+АцЙsѓѕђЎ?ххџбќџ_cеw,•щ_пKР6ђ*€№зeƒ ѕnJм4Ё‰єlwхтй†ЊY1GгюБG:чЗё‹x5ш•хr2[џБ&’jЪтщa4X”‘­ЫЂjyC77Tюна1JC4eвatЫ€“$єbšфM•5УZп€Џ–*ЂА<§ђ™ [кИ3вIbе ї)V–.LцВ”ЛfЏbKVЖFеJF7ъR Ч‚бDЧKќ—FCсAИЊš ›Њ.Мй6N<ЁpвjН†Щ>Д`” mъл˜мSŸзн|лdhъqƒЎx2yбЙ›Љ:ŒЖэ Ё=%mЛЭ|Ч†ДŒ)Т^Тpdе|НŽ"пsЮа‰0žЏ??k>TLЃ­Ы•e.;}NѕŠэ1сQэTЭ2tEœонЭЭђе6S ‘œ„ИЄкЉЦtFЊПЇз_yŠ(№Ы3э_^і’ Юb˜ІU Оь›ЌшъBЏ;чMf™>фМdoЈ'+у§Йц† „nкшЫŠ8ѓФšDугЃd žt<Б+]‰[2“ззс§яЯѕФQЉ7)‰Oo›вZ]ЌLeі"h–ыZрQ^ЄЦЖeœАRѓЧšЖуEiЧЋ pUЂФЁiОі$sUяоОSЁ(3ПООt.>>S7aDUœцE4gD;вЧЖЦMy„UBЯVežE6vњ 8-лtO%А ЄhК*Ш’ЕeL_s…ФўН)›Х–,J№nіэSw)Љv„ФвлДA’Јsпд9FЖмzЂЎsАЅ]Є;PЯ,‡Tˆ* †YАМ€mL#CНB ІхŽNмvЛ"ФžК*‹Н/ЏМЌ#Igхі([Шяїа БkЫуЉbxйіАЫWVУ`Гt~3T7BЯ^zнсŒSL7NCьіeну‚МЈWФдІ)ђ№ЊнђЂЌjЧ0lZ‚5DТ:D( лХŒъУ†X“fRуэ9ŒІn.–]2учnя•з­`ЦŽБМНŸSуЌ—lЪЌІ0U^н}ыЭ—М (NО?ž b_r6\ŒКˆfИ9T%1ќэ|-і 'ЋŠ$ˆš%ЉŒО\ІЬRTЌ”N‚ˆНeЁЃС=Ўк`3И’ Чѕ1ОэbC†ЖтйIџ™еdЛ/ ЧGOГ3о Ј .ФQЎЫ*ѕm•ыпоо=Т_xеп4ŒГЮ"ЯTФљэЇЧСxЩёмRаз[Ъ…Љ‘.-FЯнСh.!+pYпвЯfoГ`Н‘ЯРзHЃ Гсsџсл—WSйЪ иУkяУћЧЙЈj†ЁB[‰Љ}ќљВЧŽхuљЮЙ/qЩŽ —чН›аREvС мЌwљЫХX13d—Cъ"ЧB™§ђл+Уй)'сnњUhjЫћЯcЭrТb“ƒœЊчО(Ѕ “ Yq[†Tˆ6№ЫщзŸ?N+лоОзžЬ.˜qяњЗп{œЄ˜PяХ–NЊВ9С(|CŸ=аan\ж‘ЉJьЙя”O‘{=п рHlОуxHІОМњѕzЎиaqЈ0f6Иў№8$нЃK]T‚Ъ:кm`§ы@€xЈ6‘!.ЇЏЭЅб3.FЕlК+ ЖlKА"OзІ_о?Бš_НдЖБmш mтЫз‡б\DvqЅВп~Eхœд5ЭхгHЖ‚|ƒ(Df•EіфTщП­Љ ІeћYEŠМЬ!d5q№љf,™ёйnПCvё\CQ–­чНЮЉ:]Ц+2z“S‰AюЖЇŠ›dх:ЖЉŸА„їOзDPС5НЄBfІТ…)ѓ“Ю=Я-HpA*–Х:АT•{ьДОX^ІnЁІx"16gў*џt§ˆ—ЖЦО‡№/S>З_ГŠNхўm{=f2zќpжˆ5j.3m*ЪєюБuіЁкщІ)~сvuXК*ЬŸЎo’щW[’яцљoЎŽyХАœUuxЫ]C˜_fKQЗМИ:lRКW%дИ+.Ÿ.л­>/+†_6u֘́Œ]fчЃNЛн]jn С’Яeѕ…зMЧ/поKо^ с/дЯ ^WpxЙ"rѓчЏяo[p,7AjРЉh ђіђLЂЅЈDњ‡\ц Щ‹Уїдв&/gšnњIБЁ;Cтj6?vЎоППnM$ХђцФГСŽ:ё,e1ш>ПL–pЅШWІЎž; kЄNЖ{+“§z9з›N‚Z*ЋілмQ™ЗŸ/о}Иn`tXТ•ЋlRУUфšЪМ§m0uЧ[Ѕ9E…ђƒОACЕмtїЖё љўCŸz§ ЪЖћ$йя3[œѕnЏ.//.nZ2šЮЖъ<Щš0ДuiќэjШЉІ&рА–?ЦцєjКЅ[ кѓ‡ыxЉŠmšюЙ-bЃonО}љtнъBrЏšЃ˜"G2Џ"[WЙ—Ћ]<(˜W ž­ъј—%†›жЛmц˜Ьз7§ё”<4оlъЗCхЫГnћБлoљкz§іЫ2Ћ6E Ї/|S˜чЋwЗŒйрвхЕѕэc•*EН…ђрђЂuгІїэЇлЗ7Єq ЇsfкЙj DEŠ,йдeEНЎ.sГСнх—bйВВgЛвїз5ƒЄГ§8ЏKЈXЎћЕѕћЧЧЅЂ[Ћђ№чЉм’Zд_яZЏВЊy’в!iI%@Cц™—~ЉeЉ@’§Ш/Б{шІхEт;ъЌгњлEдYwгУwА§ФвT Ќ•ыЕ& ди7|•€–д3ЈХ я€сќйIщ_Ќжš~жdНВ с;н[ˆŠjFћя`›$Шв4iˆVtŸъд‘*зkƒšђ?Ь+ўы‚7,Ј˜~Йl§~ё4eEф‘нžfС‚ЯRЅqk$ЋtwWЛ “”š<лдј3SшО*ЊэТ‡буЅ kшђлaў™„Ж ъі,ЪŠBЌeв­ЈРЅ"ЧПцKkц\ФД,CчZћx?bxYЈЯxG-yьjT}ЭЩ6Љ­J<Ч bs-J7tэь\є[ Y‡†:iНћм~žА‰ЛzSWy–BаИq7VвќВ№ž],`Е$’сŠtЦ›Рџчт4Кнj}њж›rВиЊ2пѕ\јє„nжiA™92;ЬKNxžчиХПєXEІІ’ЛF r"” uЯЗdЪЯsECrё4‘…sHЊЊH’Р-џ=Огд X™ч1тL8Žc›KГcYѓ‹"‚ЂBš†б|§бПєk˜ў\3d'LВuzЖ!ГГЩt|<Џ‚vД“2…дЅяLlќлимZЊ*}!гпйЛвюЖ­$ЫП2щФ‰cЫжJ‰"Х}ˆ…иї}пAхќћЉЧЬq{њє™юI“N>р}АVЊnнz п==P › П~‹ѕАЈђШCЯ'TE„яuЎЮПЎЈ*АЪe‘!ІƒЧ›ЏпZˆš›Uyшš*Œ(,yЉ†„ ЪВ,ё ЙšКŸоПџњPЮ6фд,^xKцџœ |йyщн_}xџЫ‡Џ_ ŠDŽ&ВФљџэХ *–g?­ wіjпacу?FP4фuџы–ВЊЗйѕ‚bQ`щo*N”UѕЏНаœDtпp1 щ{ мzvѕ­ИР(њЏЁ5ў/рєŸ+тZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДјwР§гкHіЏrbд?Ћ#‡Ђ›5ѕlЎ‡gУпJсMЫ1Еџ}‚ЉšЖmтш ˜?ё”МФњя>,”fОЁ|ktŽ)–эZЦЊгQ,ƒ_ujѓ—8“ џz хTДтЬUО= ˆгэ0ЖЕqЇЃ›ШрVЗЌ ЗќGиh~k2лщМРg=t,Їх—™% :„эК№сyіхLСўM`'№ЖшtцЫEgБQƒ2wыєnOA‹†•эczшр:„ьzЎ­§йЉM‰š‰ь…$Q’б9nВжЅЏ@Щн]wКнЮ’3œjяЋиЇЮ\0р'u™§Sb§$ЏЖу8ЖiЁ“-'ШŠ"ёuYРnЏю!hZѕš} ЗчН!)r1|ь0V”…?щ€BœTгё‚(ŠТ(‚8пV‘‹VWП\?ЬiVаќц˜ьЈгŒЦƒ~џёсiBHˆЕ?E–ЮlIЂCс§0Š“,+ЪВЉM`–Цz?ПЛъѓЊnХўИ n=ŸNЯ§С`ŒБЊ%‰g)№WОы9SЋ№\8YmаIВ–уЧi]…ЏБ‹—сhдЛњщ—OSЈ#ЮkdъшKaKŒd’ЈjЖЙЃЩPТП~­sauЦЮугcFАЈУЯ*ДЮглЧё|1ОћљУѕHPTЫvМИмoѓиГtEбаЉФХЩZИŠ-qнйЈђї:ттЈе‚ОПьWIb8ounШј]cxž™по|~&D/ъ~О{EўЕСЩНІ9дYWulCМ„Ќ)п'jRўнC­џд{|ŒЇ“ao@kNю+ќр—MЉўУнˆт9j9b‚›#П-Xпнўѕm_D–jЇUъъмr)hкwQSИХЏёФr:zщїњ@ OзїT—ЉЌя‚цyšDПt” Kє|</Ф`{ИN,a=yЙŠелн˜PO…­j†ЁrЫЇю˜5,фEЅЁ­ЌИЂ*\ъЕМащqNR­А‚Кк!ctШMќБ;^QˆнЖeтШ 6КэqŠЧћ* ‹CхЉK`“с”б ]SuJУ _†$Ы^ЎЅЏEе0drpлуЩˆšуёˆLSЋаи n&ŒbCy8†H/юŸсЪœ0-ЖШЉЏжptyП2ЫёrУ’kœе,Я5Є Ÿр iaš8ПЙКG Тпўn>zих.TЉКYU"ћУTКџїEѕШ”ээm—8а]S&†Н—ё їŒŸoЏяf"№ЖeЪи„q KM$б-ъ–‚Z`†?џpг_ЎБљhŒёКSюЧу~пфqVяR‡э=Ьˆѕr2@ц~ƒВx4LгВДЫnэЭ9(џцq™•#ф’Цb8/Ѓс\т™ЩћŸЭ2ыеšW­h{8О!УqфЕЫ\ёхцyКЂ6,5yшNi ’Ю4 Ѓѓяьaиr>_ЎсюгЌd@o(‹ШГ З„…ояJG $§NјЭш§ЏИ$Ћ2Ч№Šс—0•!ыwдЩw‡*д–Rд(hrигŠŽ`!Џ 3Mq’ШБМ у zоЄHш2 тМйo‘f‹Uf1Уˆ5I’ФМћѓgZU[W5УЭPr_Oи7$ŽЂи~”Цž%с/§9-H’Є˜Ж­‹guo $dшЃƒd т ЁэЈKДq џ„~l иp8MЋефўЧkNзУ(єƒ(пюQа'Kz4-ьkаxYнlЋЬгьЅ?œЮ–8‹,”Яъ>ШžЄБу кЌнжUyвœАиЯЇшwЛ*д цеЖa™љеgF7УМ,Ыэ Р0‘PкзѕnWW(ЁрЯЄО!ЌgЃ——чЇщFЕ,§ŒГ9k{Q–&qœU[Щс0ŒвtчЖЉ‘TirњЄѓ7д"ћtEjF‚КЌы“h‡фАCІЖ(hH'0ѕЩЛ^`  ^ІДfЂЇgТZ‚ †зj[ЃЫ"Wзtн„+Щ+ˆ]Dв ЏfзЖF(i№+І›$GœЄЌ+,3 Acй§N‘&Y БCU@cд%jж›№š|Ої+№P5хmq ЗИ<В’тQэXA9]dyО…‘Љ‰аїmMz~7Qt ^лЖншфT€кBј{H Ш ]ё`vпЩг$‚ˆц w>нЄ8Ar’‘ЛU 1Џ ^С JF“uтЁMd KžEŽLMпџ &[tC€ƒЈFѓ,$7к!ЃЪЬ“ёg…Ак[Ш’2 =S<ЏќPœ0CSг+ђk ,f5ЦAGхxРг4^ж^>qTcЉбЧџњ8чTYƒ)-€i№ѕАЭЩПEы,“)0’  )Жл–БыЈgх; =Yk Žš"r5jХ9A›9ЙA{’”ш$0ќДЋKЛюНџё}g‘ЃЊйaЕ‡u2K‡<ЊГPЁШ 2CЮСIQУX Г€ЇŸs‡L ‘џ<дџ6ЖeьyfDQyљНЄn=оиџtQЄ46Ÿпќєуеѓ’f9Q-Xщню№ …XСЩ#‹л(N‡Ž&J*Œ0%а|јўЅЧЪ“ ‘VS†:;О[ЊќКˆ|сd‰“V\n!ъ 8n†ЁŠјУЛ~њј4ЎOs*HЊ=(Иъ"C—%sŠŸЄ џ}Sц7Œh"Яј ‹pтt{@‡&?~ ƒ(ЭPнg!єр š6т‚оq^ech2й{їућЯЯУЩc$+;ойa'‚ф& мЋ$„OЈЩ\:GопUACчnаѓД&ёyvПrбJC6”0*F0,Њœў;}TE ŸЉkЊИќѕъeОТVH*‹FКпhКЮуРббŽг‘F ^_=MЭЌi2џœ9ЭљQv2ЈQgq/зCєD‰њL‘ц00†hA5ЁЭ2ђmdКJнŽDy8В Ї8кС;Б<\ЗІ:h™cЇqxbџ‹ЋmтHgмBхнMћ ,ЂХЯЎ{”э'rфК‚і еMЁРP?/‹9•šз_Ѓw€86Ш,;‚ЙBF;:pw чъДSrњiпœн‘A^'ŽBЊс ш]ш1ы?ЇЄсСRЃЧђамЯ4Н$FтFOМ`XзЙZЗ|”=c Щq8Х *i-DЇftђм\?р~\ЄОЅœя}7;L+`}љќE+ˆ ЪбwA1#ЂЮ2є\T!ћЭ ђЂЬбftГCКэ•žДh4ь ЅNТР"žЖŸІыШg[jТ„uЈВPИП™2šэњa’цˆс@H€т(#P' БдџЭо•6'’$YўЫюьv:‘ @тL ЩћˆМOђ$“S3?нSенГ}ьі˜ UYО/ЅB`r"=мпѓ№ˆШг4А4UšЖhbјеwAоzЈЪвGL1ШIёУŒыр,žОИяЊnЄХ{УgнУ я}њЊ/CЋКh€еэЋёТКcžП:G5tY˜`єЌ5'КŸ#џD_>V8ьO'œ@ёŒ?@!j*гцх„8Aр9oИJМ є]­Ыz^7›=ЃЈўХ8>В­Мнt“&б4КMУKГ<ЯЪзQ>b"?юй†`М>Б‰€rЃЛ/7cб†њ†Д‚эС_vtgdFШ"ря}+?#KЦŽb7а@Јt—RM?Mв$йРлї•еИd ^W%…рJ)эй=ъм|НюŽЋЗфySNff§цчg;ŠГCзh$>Pаdш§kЉЗ ›4ŽLЗдŒ[LЁЎIш­л9иЯіpйœ[>/Аёtк&ŽEЦ­1ЇЊ$рЕъв…g•ы4Сш KQќ‚Э(…K^oDc\чъaЇ@‡Š@]ZoМШЪэцњђучRЕZ ?”Љcъ“ж Wх;P%ї@oЙ&Q`Є—иїVйŒЁОч!З@@јЬѓЊъP@ZB>€4 fЏЃН­бП€З§ CЃЅк–4ž№ q2pj,”РБ! y0зTqв]ЈHзЊЈSƒtюъ№+їП(@фH’ кт|к69“бsа„ ­O%HE]™M8CwPѓV§лS\р˜ё”eo&kv%i^`-чu:Џ -/р.IMТ-$ x lпБЮЕœ8„Ф•ƒsТ,Ъм™ЄдЎтШ<{ˆУЖF3ƒБ аѓCШёUсiт:Юw К ›! M]M%н№<зЕЩлеi~ пwІ*ѓ‹жэў`\_Щас€dВhDЂАƒ>-Щ2ігIмVo“%hЙЩР#ђ4„‡ѕмЁDYеTE8пХБ3Щ№ЫC ЪŽЃЧїwS№ŒЗhѕkЬлФОkИЊдЛЬh†eIбнЭ }h)иМY;ŽыМQ“w}ŠaйХЙ:UfK^%І Ъi­ƒњ—Иyџ™QˆфлC‡Q™ф1.дЁ{єnoяЛOKfХZrЌт њі.ЖQ&šЎыD\6ЏEЦїїЇбhЩЎhF0ВгЋе0рЅoЯнЭrь|№ФhXэ3Tі,ьcЅлœА тdєHљŽЁЬže=jqЊUl(’$ˆ<З|ИъЭ9IЎЪb< №ХАрšdйэQœРЏfД йЪѓ рчрМi$‚ЌЛ­ЊЃ)hЛ АMЅ{Яin‰%sрїћPѕНЂ—дгз/b‡ Ao–Шюљм‡‘FIМ­швщTЉјЙˆmSZ2Фє“7`%оЖоNвў3V˜&,C“%ŽхШŠјІ6ŸіqФJнqПё!мѓрцЭЏ]J„›ЈhOU‰Јm|аU#VЗуbQл2pќLŒЊU™Хx8… 3tMЙз—uk фјT™”љXžQUОsб~ZЩ21,/йЊJ/ИЫ‡@ІJьры}o*Љš“nA:zDбМ|П/ЊŠ*;jнt8УMВРвоМoщБ‚pэ_6ŽЮїnŸYE7нC”@ЖИ›YXMZ_šO+Eбƒ LУФ”s R2‡l)ГTПнАКЧ.АЦїйG>гL  џ(k~žЎЦІту! Aг2пRљхИsёЉ9dеŒЪ§Ўя€Й=lS ГќtияЂщЎCHјgбYюБ}йz†дњB‘W6эTрГЛШTХХшёцгЧ›С˜U\юvхк XЧочЁmUП;˜0Њщє{§Д ž5*дСчО@tлr8%щЫqЗЎ6ін_|ќtн™HФЫ=Мhъкї0аhсжнpЅ˜ЖыЛІІwдЏ tгZћ]dѓЏзH!Ш$Жп;Р7бjаКЙњєщК5рeт0cЧС7kЫ№тbФc›І "\zЏShУ0§lЗKm‹Пћаб,Јю 8ЎH~БЮMћэfѓтуeГЫ*ЛЫr›јо:?R\НX=~њачqsЂЁ‘їgмdЋс’IЙёLхљS7fЈицXl€5чІH zэЫЫыK4/9ž…ыД8 ХSјYытУЭДЊ‹)яЁПaєУ]g›аж—З№Т§z]?@ѓVЃЩŒšДošCAеќ,ньŠ,Ы!ѕ$№iїютscТ+вНџ№šaђЧнФќ$ъЏћЂАD"Јu‘ŸЖ[”ЌъA–це2>L‚мУ>}n_5ЊУоŒ‚H<п1 U­СTŒv/иHК Lм%ЂrƒіІh€+oИ œW{Ь ф)g&HŠЅ\5iƒ№@З|цС:w]ОьK`›РХ.iв]*0вр›Xo™БЊЕиi˜щ_Œœj–‡Ї€Vc§њъ’XЎkу“4п’є#™^A6з‰ЋЪрз­Ц_˜K†“D6о_РІЉ–vОыЕў:f‹љьчSа’obS•—^ЃЏpКс—‰…GrЮEYUU™љN‡šў(VV Oф8^Tˆ—ЉЋˆLЃзКo5бАГcb№№жоtОXL‡НќМ\}Яsѓ–‚bрЇxX(б­ КЗL‘иFчЁu]я`4ŽєmчёёБ}зЦУ-ѓнЫў=&œЂІхиЖeYn\ЅJПh\]__Сsєp{,\Ј§иыvКо˜UРїœяшмРХгaƒ(-sˆ+Ššі?_м/ebxйўАOl…eV j2[,˜šё&BЧјŽчЄ- ŒГ§u–ч>a‡эNяБејtёЕ#i†ФiБпс§ƒКІР!’Џs<А5ѕЯvт_СpJ-YЩє“Ь'ќгХЭ`сфВyеZЉšYнжUюЪ4‰#џч{37I’mGчпнжщžїг§Ээ§CЋеЃd# uevu=aeYœЗo/яs–ч˜•h„%оˆу[нAY&Оi‡еХ(…оэdHš8^†ЁнvыюіыХPжKсл_FЂjj27МНъŸїžЪЮІЂW{Puеm=†chЉб§ћЮlН^Žћ§сt­Ф—П|ПрЯхtм—y э­чš ~щжП˜г-C= xЭАт#є„%Я[]ЮЪQkЧ:E9N˜ЫВ<Ы<}]HЊЊŠ[fЙиЊщїП\Юпѕ™оh@шёА/в$ |KЛ­‡‘tKWц_юћЋDЫщ\їЏkц—гсP—О&J4sYWQˆЄ=LЫБmлВУњЧх‚•ўёЦ•вР[TpY”еИFНa5N9Х05ўэўО;] 4Агг7їяоDЋ 0ua ЂЌ‡qšfYQд—Xнѓw zMК:зЖœf ! xПУ0VQхчН—йNTэЌЎ3[[}ўДTн§йQгрѓ,…+I-§**VRT4CњH4DзЁЬтРs\˜–'ШfUЋО!оЊЃАЃfЦЯЧ kл sJbSY|њКеќšœЩ&Є›Кfz‘#ѓ/=Q3М Jђ,-^P…чcŽ9A`g§бŠ•MŸЬWђ†m$ uХЮfј4ЏЄCCž}xиjЏAд ЗaV‚њэ­$у6u ЄnЇч?~\іo9x‡ЗЧ4U6FЬ{ ˆ.оF2Б’& Ћўгм(ЫQEYžxІєіWk9,8 –Хt<^ьTC‘^>Yž<€ l7ŠSЯЙ­­яZэіУчЮZЕ="ЈšЂvtс&As’ЬЭ;­@‡HLЧЖtыќѕМеc,єЁіEf6[.— †‡ŸyўзУлd:ž-fЃо@В Ч91•ў]gК\Ммѕ8УІЁк9юПЬ|KПE‚,ж›ѕјљKW4LЗЧb љнјЫћVK@ˆ‡вт–`mž]у§nѕѕЗї_ZЯн—чЧ/w/ВЛџћЧsh№O}САŒэг3kX Цѕќя ѕ– #6гŸEf№<OЦЏ­ЯwоHi}nА‹ХiїжŸŽ;я~§№щ[ЛнКџјюгLї`Фcdl^wЖяЛњшi­›–ij "КaЬpќ,јМїщОG#lŸО}ыsfv>N™Ж/9Iиaићєыo>Ж{XчžX#>ББ[k~’ћцфiЉЁFXfСl7Ьb~cщ4пzŸяпv’,nч/=о)ШРЄкvЖрdMb™хќэЫќqїј6 zн—ЙтфgЄt Е­КщО ŒЩcН…ЉьДZ­vЋнэ[jHм6іЗ™%ц№…s `Ч1ейљt'*Ва`:Пџбoй-д5ЉšyфА0aR+_н}э о†уЗюЗOя;#šYs} 3›е|<žŒ†ЏЏ3^ЕmS™OЅF І—У/Q“пі~џs"ШЊ"7О6€&ПŸ{рћЉŽ­щ}ыmСтuvмњв~У—)ЈKОі0 ЕЌЋŠ ˆвBT-‡fXGЖ! vN`[WОМ}}[ЎwьvЛžЗ~џИVЕІmm{љсD$Nі ўкMIw}зQйQЋ§:пqМЌКxeхФщ6›eйЎ~Hу™ыCЙ–›д'тˆ:1јЩѓЫh:Ÿ-чЏ_~§ŽЁЎHчЧ3 г ~ЊOЇ2Аt;ˆRw[нМ>wЁСч;ХдЅыn}IЭT Ђ8NsR•$+ї`ђ,Ѓя)цCсJЋогЫыhМXŽZПсu+Щ‰ЕЂЩ{R+Из2…ФcзЋхшe№Ж…†МbЬkнё3(Я§ёPюЋ<|пѓЃ8ЭЪ&›БшXѕcN#=UISјж_ wЖ'LвOUuI#јОMNO‹ІiCё Ь[ы•ЎЙвЂх‡фdсЇїUЙ*ЯKЊnР)–ˆЗGžDя~`ыRчнв0‚$A6Свз{шЌ О/‹аЭ”uUІQрЙ–ЖщuFЫkъjйђh&0=п2 -~:"ТEнOБђEф#zЄI…\Ятаu U|њзDг Єйѕ%ЅЊ_^рща§eОТpf˜U]Aq'Ѓ]›ЩeлЈSМHBOšŽС@Б‚Žе*"K5CJ” Q'.tЉШ-юэЩ†хИž‹;ЊP~ FЃp“Я& ЭewА1ƒfД=*’j_Зу;S€ЦыžUX"Г-7}GfYеё<[`u'*Ќ*їnЛfІїПЕYЎжv\_z$fСы Ќ 96љЩ`Ифu/LžШœ"pŒЋЂє<рЧещTЅŽКЏTЯТ8№]‰aDUцFs-ШБ^p‰Љ'ЮБЫюЧнЯ(9 Лс~Љщ‡ьˆЃ8ЏђШф6kAKбРѕИ$J-BOПfаk|у8­NЧдоMкOœ9ђ,єьнxБнLZc#( ЉQ_‰яX&ёёЗпџ|ZŠЈVгtƒь€Fдu…q‘EЖИхM€>ЌЫŠš—аxяиwЏЩ-;,тЉ фiчsG‹у$ЋЊ*ѓ=хD‘щMє Ч2уЙ' –†эўіыЇо|У‰ВЂ;1АA“ѓіƒ(єT–3ТИq@†РL7VВЇбЋю5aZpBкš:2ямѕŒ@ЖЇe =гq\{=•Н”вžeH{]“Fя~{џЕ7ž-ЗМbаTiФ а€Uq-Š9сг“•!Мv7^ОЏпОцІЂH-ЁЮR_п<пѕд0N(…їШа =_YЩAк 6эfLM]}ќ№<N&ущŠUн’ж ˜Ж фuдаНvwѓмW“ЊŒ<ѕŠ1CxIub ыЌšŽ в ГX%ЉЌœЄЁЃп(Бw(ИIP№ЃaАэЧ#шaн|MI>€ЖЋ@./+YЇЖ9u p;ЈФ}ƒ Y.my§tтБчу3Р§YтйііИlVyМ|?•‘k@‰ wМd$u ЇК U‰Ѓ)ЪvИ4‡‚>4э<‰ЪWЩЄM‹CcЭŠаRDКБМ ‘ueј_—рxёЌV%€Z~4ц н сг‰шŽ‡В  ѓШжU…ЭE•ŒkVTMЬ‡cщ)tpЙgќo_ЄЎ&Т’ƒЏj"\“џлЕ2нА<Kпд~јЬш†•ѕЯBlN RЋ ‚IV„Щ˜ƒg•R јЦG'лоˆTЂђив•х„зщ,Лm(7kNЯTл/tEкMО=ntњGЊВВўЇэ•FО!ЫТє”DжжљЯžIšІ—ж'0PйtHC_}К{ЭчK†гвFтU@—у)5ЄЭrУ ’$lІЃљVdз“џ§ЇџпЎ…‚є ’§х\€Тпs}7NЖŠ•ОŸЉЋдЇгbš$1нћћvoФЌ™еš7‹&ƒˆвЯЧдR7УС”йюЖ“сR0`uх[јр№<НЪР*…ОєАиќА5р5Є#3XЭТзЁ‡ЈЧ4zl ц;AV4U3ЃТДщКт­А5iм,VЬfЕMз‡^дo„бЌaZр/ј“В"ѓъКЖmщлізbяЯДЃ—"ЛлБ[fіxїМеА\VўDћЧF /ueѓ2b-@;?L#Љv№XkІхFдŒI“(tЁє‘зК:И[ЊVyЙ|oіS•[ЏЫљ[ћ§‡— уйd9ˆœ6/H†SиUlЊТl.šЖыбЫ”QЦDо\0-лƒ“s,]зщєДlр_ЃFГєхћ`шќfЕ\L^юџјапHВAdаFР…Є^cNu6нЮXƒZ@ћ ЊУа хFtШh–IЭEUт9AQЁmђAGа­ьpЂгIчcщ n3{ў№ЉЛe3ˆЉ“{ЂЃVЇ>ЄЃЉѓУЉBћ‹Ч205Є§ЭN#cхEXf>gxY5lлќ7{зйнF–\ёO|vmiH‚ ˆœsчœsЃ#€n$rізЛЄЯYЯzd[€єЁ/ytС ТыzUЗ^ЈЋѓѕЖ 0?G  yЃGхдєБмвPž№!З@99GGžЎ2э&­;ы§.ВаYц‚ѕж&<ОœM1І %‡†н7b8^И2ђxф9–&ЫD­мhЯND ‚Ы—>гаГ`:№ѓF‡†ђ!пzК|щ{scВ‚ i_ЮjX:пњXУР2^u“=}=CQЙFљхЅЗ$)šцѕєЫў!:лX2УвФt0„влlGWПїођ?ƒ54щЁ№@Д]gЋ#Œ pZvЖh{sŸoпRЎqWovІK[вJ„^Ябvbю)ьЌпiЖF„l9aЃж КТ\D7ž PŒзPйjтВѕєXi #Ѕ^ іG кы­ јгЇЦhAГ,CВzС9ŠЗШ­W*7Љо”ЛРМœDNШ+пs…цЯЉ <Ј7›аTDrмэv›ећЛrЙIЉўўS.ВuI`щсЭЧŽ’‹Іъ:-Ёih_џ˜˜ нО}˜‹†х­рYЩ"sйГѕbЕi;^К TЂIЂ[ыінћ›6%ћћд‰PRББh~ќаЃEEЗ]w•юїЉЮs’•ьOйJSˆFe БЧG{Є$vљcН%V’UЗТMт›КnЂѓLѓЧwя'œСT;e6М›Жo?іаЊH$PЊф‰Ю3Ќ‚PfYЖ&Вю+KaцWАЙTšЬ00A‹ˆОяB"ЧппvХоžђь˜ЏTу!–З:'Љ№LіСS" Щˆv`ПЉЫ‹>cXAшš‹_щњъІcˆŽ@аеUyZўд€ЈŽлѕёќX‘–Еж„€”‚ŸчћH“(ОШ $zšЪіЦˆ–@Е`(пћ`ЪПЇ™~v:dыРжEЌѕX_ˆ0аGШv0ЊЩЪГ5Y!_ън1+ТPЃЅv(аhVwTBBоMB3Мv­ ЌfœнseЉ<жoїq^5#Јбiƒ}–@5.+ЫъKІЂьІPmL‘e$ ї, \CF•Ф•‡6яЎt‘œЃ“=d7•w NQafюгф ѓLVІ*ђуG(l9Y[­ЁLT–тT7— Q9Ыž^(HЋЖЎ*ь•.6Г*Œє1wui\эрЂb@IžяТxŸх‡н"Е*RнЛч!0,=к‚K8, Б™_”ž›8ќšЉЩзrщFЇЧнОB tЫЫќ0п‚YБЇ+"‹Зo+#ˆfŒ t“ХЩŽђн6ЎСуƒRkHЊ1U‰НжхwAгнtПѓuЅ{3–!фFлlЗ ЂЭfГлјІ"qфДqї4 eХ@{ѕБЮрœцЎw9:ѕ-“УRiHЃ…*‹ПкuUVеl0&0ѕЩm "„щFktZ&ЮwћЕlšœwnš Aжƒ-:ЩвЂОкюГи15~RCwfdД”._яn0Ž/­ѓPз‰r н>ƒŠwЛ?…>Кх(<5яеnokCNT}ˆгБЮqŠэvыР2dМ~‹К~Ј†Ў)ќХ‰Чя€‘6ь8“ЮVбA_ˆpfзAШ'>nTn>=TкђlˆЭБ)A)юГ…ЛёУ/Ѕ5Њ*1WьцР Г'^кІи/qQерЬЋЊюЏАЫaЃRўtїP'!щ$лlуjšхЏ[ еОћP*ЭXAфЏ8Ю@'fЕДM-УЭEА)„јьщ1y1ьДjхђS›‚‘F7єCи3TW9ЂћpƒўШЛиbиŸTД† ! ?­ъ01їЧs(Шm ŸЮІƒњУѓЪ_'NГ]Кђ}ЈoГРEђb›oШ‚КuЗТ|18лfwк­бй•Рh†ЁЦ/ t•жOQvIаNtЖ]ДRzхўЮ~­WЧrm?Ю:.Л[Лš КM\”Д`Г‡ї’Fa„‡ФРТUс‡ ѓ_3ОУe$H‘0дл(ˆЗћ]ъCz–ИIs.HzИEG:а‡Ќ‚heыšј;РМ,ѓчђЩƒеўцХКB. фTЦрг1И‹ІШ(§С'Ьхвїџ ќKбМЄy›ИnŒМz9•—u0кJSCфšуХѓжŠ$ўssЉB”бНрM„IšІqF‹ГкHЭ4TYlОР)†х8–&ЏЦ5ўK ЇСm]„QЌ<mщ—Њ#N2у@e“Щl‰vЙ§ џ–hПƒі|ЯwmЈбQКЋ–X L+CdЩхb˜§И`ї' Эtл6 Ы2Qs–&TЃК+Ч@чƒР1~ЎЅœяъЊŠ–ЏЉхyyю ž€rnЂШ’Р_mЕр ВeY`щхoNPC\Б\ЈЮUEО.=њ&,ЧГIќёъиKЉ4%еВMдЯшчГљ_‚VT-о?KtўЬй—EіТkапP‘KќMмџ{,9žљ‘}ц (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P РЯŠŸЇGлЗƒХџоMš`џЋMьOдAъwSDUйЏ§‹~ыєШ*Кінзўџ ~S œЊКЁŠќЙ іђЋб<МІѓ?ЪДџ‹Џ ХцВюXŠРСШпwОИ7ЃъŽc|б/˜/ч?aу+ZвWHj+•Ÿћш•ЅЌ[ёъЋб§ёфgщђ7УI›#sHIѕ’аСJѕz}“зŒUтйиVo0:џ/0?Иq#)Њ$,IKЊХžЉќЂдыМ”Ж˜jІЛФ–Яэ§zЃЩt:ЇH‰Ёђ?tr’‚ЌЈЈХŸЊЛIтЉCу§RЏU},M9EѓЗyц+0АS 'HŠbDУ ъ…t!eСoҘрDEбtнrуФQXl:ъ=—/•%kVМйюRGbyIB ЭZХ›uшYњх$~ОЃ#Шšщ%QНкK\ЃRНЏ.СœГрц:pЄЩфyОЎЗ›xх9–.^ЏЭїo˜т8ТИTy|ЊugЄЄ;ž)бнлч1N,KеЇђг˜WTMV /нeыѕЩ^gH 9]й–у:зп FRQ—DВTЏмпнW:ЌЌ› ?КЛŸ0‚РcЭђэcm„А.СŒ‘Ј#jЉ}<Pr‘з]Я6”+‰1|ЕмСАLCW8l2шд??с’Ђˆјѓч>#ъЫ‡wЗЯЯѕNЗлiЗЌvыdНCђkаB6]пжхы%›sŸoxРЖЉыŠШ1фrXysЂ@vюjЄ`Ў,žУЊїНЩl4œ,ІэъD‹Ž[зtУє,'Luъ8LQп3uюjFѓЊщЎЂ(№\Ж*‰LПв!rX}žёz;O7^^фyI–ШVGї‰ЪHІчйК„еЫе…Є8ˆv-.‹ЋHыb‡ДфCд лstiйxL†Ю‚гЂ,EJ•эЏШŠ NЄЬл\”Чв“5UІЦѕ›лч ЃшЖm_oЈвS;эЯJЬHЊ=ЖUЖWЉЖSщ.dБЇŠlЗ/JЊiњI`0&и†вtИ$‰EПY{Њдњ+щІe^\ ъw(HMщŸŽgAю,вХYЅмЧЯЂД›$\щзэ ŠŠt6ЎА`§MЈ’ѓйИ яl:lзлŒ !]ЯhВZВ;NЏЏ'0њИ_л YЋ’Ќз‘чиЖ&qН6+)NДйяз/:ј‰ЗGЌ$RуцKН=˜вШ]ЎеYv,ъguвгы1ЯЖ`§ЦWЩЮ\Втн6ДР“5E`;5ZRь‰˜ІЎсfћШБdГЦиун}Ео'xYМќL\Ря?ЗXэЌХw8юв(DТа‘ЩсМхy ‹ йE`[•98ЕЄљё˜%№`В4АdеYљ–ЦtюnЪOЯ/­1~…шA ќŒf4XO–В•c]йfeЈVхЁЮс“бЃYЂё>.*šэЧR^}=э7‘m6БЋБАїZДqNQИв}_2\ЄАМ;Є–Ў€Фљ6 ’lkЬЌѓђвЮБQхцБЕ iV”57йПООН‘ЈRЯ4ef!&b2Д/n5ЏЊVыУ№%H›є ГР${ШГн~kУжъ­оhОшпПџPЎїЦ“ЮZpќŒ> Ы{‰Жэ‡qшjЯиЅGœж …ЊЗ9УіТэёt4a\k3&P‹,ЯS}йjЇK ЇШйгћЧі`4ь6ZУklпо вМBИAЎ’нCBН$&HЉТe)*eh2нЈMIдУн)їЊіЉЩЩщяvk‹ž-)$>)ђLуf@sjЏ>]ВцЬAVŸЮџœХЇГuGk+{œІJxˆшœнЭbяьѓЧ!o&Ч}VФІ‚$SLT&Жk”$k’"бЭpџv:ОСhП"r QI8GaœnЖљ6v-щ‚6/D(sхЉжY0jя"SъОР%k{мѕлзQPoЖќ]FqœnЏЏGфрњлЭfЦP$jВAhя6+KП\•;geE˜Е:S’‡НA(\§н3ЋИЛУьЩ}К^Ї*PЕЖ щHyщcŸНтэ‰б@ТДlSцШХЃEтј6њm5чРXAфІнЅи>’@ЩcGЃЊяМ эд,ƒ^AїуPущZK”Э0"k“ТP#W>Ў]<ЫВфМзjДdњiЖM ИаЪ$Ц9jŽ8уЌаœчлРTАЧ]^їH*пЎL ,’-OиzpoлЖtЭIС9~=„ІЦŽ{§nЋ^Ќі QЗ§Гj[фшІYRдЂ_msІ&I’&Q„~rћy„Œ>ьСЃa€‰йdFIІ!ёЭђœу$Є…ТSДтэ^Oo{Oу{їЕкѓуУS—RPрDJ*лФ5” ѕlа~.O‘pЕ є‚‚*“­ЯїKбHрYjёј’ј‚VT‘Џџђ2™-1›[0њзЗз­ЅbЗэjїQг-/аЬ ъѕся\жр?€ hcƒJuЉи`4DW GЧ ьbдoмўћT†ЫвфЌ?—ьЭылiПіdVvЃ|Ÿи\НќвэЖ[ЭњѓгуУ§УгKЗ4Ч.СA–4KсѓqЏ^}sВ)г§ъDіаќ>ѓb8GJф,ѕnџіОVХtФ]Э‚а“Фs<№`4[ћќишŒ—ЫљЈqџщцЉ1œS,ї§W$'<в™QD‘%–И [~yКВlЯЕpєgЗѕ%ЊпЧсПfXjxћoŸ1­РTsC”ЧO‡§ЊwЄ˜Оіў“И+mnйЎў'ЉTоdьБ,[ЖvQЛИˆ$Ф4і}Iљ§§œ Oe›ЊT%!ѕ№IЂ^4nŸхіmЖ<К|^Ў-ЯƒїК;;9Л,D]пћСƒSЫѓƒxƒ йuЅoЫЏЂ_бIт}ŸлђгхгœуЙхlєЧ?‹Ж“$Išфp\t\=ддHпІ/Yn”A{]нn ІЉђаЕ-cЭнўxтї›Šу'-РxзC|цqрyAˆTСxaЖЭ0ьt:ІЫЄ~ШЬѕщЇ…ЭЂ q‘IйНСCљчаІљtлфH<Ѓ:O“аwї(§Lї‚Єоа4j‹дзNTt“kžqZ6pOЖ,ЫГ4ѕ,ѕќїƒЏщQlЩ…SVUEz1~J%Бu“‰VC}ХСоkM3е‰тЂDрЭ<љхіa&ˆ’ЌкqQЗmЛnRQВЗ U Я6ЅП=Y,Р`"‹)hЄ2~\'ОUщ:qЙ'žХ~^—M[$žБчvfЊ„„›:Ьзћ‰ лЖЁHŠЄE™:kЭ/™m•њ&дЈєђљ_LцЅEUVˆzK ДЈcЯ,VцЏoOяVxVUнжTЄŠ‚=л—љкtМДлб1ХЦrЬYA”$‘oˆЂц'MT/k†ЁЬ=mХ Ы—ѓПпы€ &ННЅЙW†уM_gОЮ=<М,'ˆГŠVdк,vї› KХStл6cђфyх2в sJчk]“юю4:RЩгІL(НыЃ—2|K'YMFqCД‰{v#:>а1-tЫPeYБЃaf яіЋЉЂ7ыЛœНоœ=3Rю!A 'ЫХЫЩ=LХјХl[_œ§элЋnЛ.f0ХДнБДЉсŸЇЁ) &р' ­5ЯIN є.пиkаkFмВЉBсьшІYQ‚hЪ$t1T27z4ƒМ%Šlђ8 CЯЖ”‡п>Ž–ЊaXp:% nН&a,ˆуР\ z4x–ФзsЗht`эU{Шv”€љJoіѕЋu”№hл†Nž‡ёј5Ь›–ж6ы"Я’ШeжьгпОнЭWВЂYn\г‘яTЮ1ЯеЅ•Є99ъу[ІМˆBsЏЪZВТЄкі ›|;КUТAz`Ћ4M#‘ЕаЂ4ВщшеВH=fqЧœпчœА’t7ЃеŽ †Ѓ*šКVЌ8#АЄЅŽ(”Œ z$мяЊмIRяъи~8>k”ƒ^ЊрЫ‹"Ž˜€ [* iъВЬЧ^}П\JtШчb!ГДп јШ\d хuI,к@ФБЯVqUЦў~ѕвк“.IК<^Г0Dо“МŒ|SаУœ`I]ƒ$ѕъbj2ЧumyЅ89‘)єRW—Y <87§ƒЎ+г8вg~zйoAЂMлm№§%‰ Њƒ!ЪјeЦ Œ4ЦrLDгœŸ/ѓЃ( \—ЮGд[в[T2!­ˆ[Єtъъ,ЧљН%QАчєpЃДHнХеФŒ я†З…JЃБ­таYRд 15Д QЂ*о§€ЪKJR"аU›нєІо qФ’Р›8Ў–~ќй€ГЗ Н ЈŒдi\ !г;’jГˆo=Œ|ТДЕФ?|]˜$ј0ІнvЈ№юШап@+рJ‚ –цЂzћ`њoэU}.Гѕr%†exƒEZš*KH~RxрщЎŽl]QФёщЩЋi…t+р”ŽFšъ УhCVgБЬKšžдJXгЫ‰ЦЌПvOўП.Эqєљй# xл40КЄ–Ёьq+ѕ`R№Mь9–eЌюЮ^ ‚юЈкО…yЁ‘о > KІ+Вjљ%-ьm ~kКom:]rуГ>t?9˜2b–хХCš\ЁЅ+ `*/WHЈЄ—[ЄєА$Нл6TNw˜ЉЎ8St@5^9T§—šР’чƒvtYжl?%с‰` шN‰ %4ОфL8—š–ќРєлђКI}f™КО–+й uŒ|kЌЩF‹ЩB“ПЋcGyŠ5„ˆЃJ/^€И‚ƒGWŸЮyгŽdЉx4в}тšЊ(В$ЩаКqб’T„ž{ЈŒAuрqг:‰o+‹ч‰ЈNTpF0 TЈ›:™Ё<^"h7“4TйўФ4Ќk-ЌЭ0-­К_јW“ ѕьУбёШцЋ{ЊpЙLК?цжК•PPД‚AнPV;–6НCzИ~˜d˜Ѕя1ћдVWt Мч{aŒD#˜x”H40ї4]ТдudfЛЖўx| ѓaD2U™ˆn@ьЉgт˜гЉŸ§ђОЏёѕЕЈу5шЌŒжж!^`№шjќ‰oЈz*`F0ХлЖ ][}8$нLК?YК+KЈuю›†<[ъpЖiYUђу•ЋŠ цnYгЯfXЕ5&ЃяьзќЧѕЪ5)Ж&/o_›Йaѕg‘`зSv@}deЊГ…fAЗT!b)˜*щ„Y/Њ'„L%„Јvƒ-`ШN"†&омˆЬІŽŸЭ0е6У\$ •‡z:Q гƒy…RалMюЈkУЫ;њЭM_“ь6„™Ь<пЧh} —Р|$CZкš<О’‹ЩKЅ7Mї'ISЅЫ2”щУRе цТИSF‘“g ,PНл’фhСЉ•П{%41ŒЖINmšа’ХХdtrЭы6„tOІЕ+лA|bZСlЛ\нПђ’ЊщдЇEzКMУђ1аuХiQцБЧьхйЭœИљсњ'– ˜ЛйЎ&тfЗЃЉЄ9д\ѕ6<RqДі=-ЯПŸпЭVTˆ2Ѓžњ<2yШш>s5юЙLWЇч—Oу—ƒELNбёТrЛЏЉ:ГMqќ4уe+(њн–б —ApYфšЦњщћŸŽGуйb)Ј=…6§Єьw]dJМЈршkюхyВœpЇуЇ-F,№!~1Pъќёq"ZAйoЉИ е'cШNУoП\?OЉ\­=хtAu›‚&2/iЭMg+нЖuщ` \’эКaAѕщ <ЄE[эutё$[q74SfSЕз4tM{НјN}ŽДLh8љічлЖЋ‹Š8ІRєтqЖфy^К7эƒMC>u(oPM= ЈЇ—Љу“яœщЗ?ЉЋ)9ЊЩвz-rЗп/žVu,ƒ;ќ”šS+’N}8њєv,еЭЯЕЕc wэЧEYR=&€в‡ьБVЇŸgКSџ§чпROХdQxLвуЃЋ™œЈЉЧшЄ(Љ>‰ШЬеxa0‡ЖˆёЬЇЇцzaЧДОe™šЊš–Љ\Я З~‚оmJ& їњ2њђлбЭ0)†ђ4nЈя›Мl‰€€}Жўњj8^ :ЯYкСчL‡ЙШdCSВX1,s}v&к^Н~€ХО&uŸoŽ~џr=Wu7ЮЋvKЖ…80/›aБиgЮзЬЫк"Цв•юеYЊЊAsžузЊaкяХЗ[еrKЈИЗ uЊd~Cц'—GЧзSY3нЉКДщЊЂ„ъ‡П"…јrНАНДэRзRH-t 3ž_.здЭэ:ЖvwќЄ›.D3œVEЫ.)ЁŠОžœ|ЙzфePДэУŠ.„+-‡•i|QЙћб’кlЋШ1П% дЌh&ІьЈc-О}yQuЫС“nЈ˜зoHRиІБК8ОM…•$­ …кV6л*v/ќьсa"УpЅ4Ѓо…&w}?„Ž бVЃ?ŽяљЕЌШВ•to[’ЮTdД,љњыее§tЮёМЬъэІV^оv•g“Ч›Ыл‰D;w"іCЧ_ЈNёі5збjІЁЏЏŽn^xAX.%Fхx/&е„ u~єѕѓ'бt\?№lћ№ЛЁ€S.­{–eфыйэЭѕљщљеЭhє(ZщnWvл*ђL]•gŸGsЩ0ёЕbКYšс`ћ>Вд—oŸЎ8УСЌ@rЫяАAgE=nЉo)ќ|1{КљўљѓЗг‰eoo№щЉœљЇуOЗМг [юњH“DеIћЗmсZыЧ“‘ЊєSсоЅ­f.ˆ,V†Ёv є4izё˜ŒєЈЦo}ЈЏWїzwєё~Ѕ›’Уп&†Д€4J7omТ,щ~$РєњŽЦR•ў—kІ3'ЎЪ4"n4WWЎцЄ™n;ŒЉ)‹ЂШЯ?–Вn'дnАэKЯdЭ-aеBf Дзw-э§voсйBњWEN›ЦјГOgSАH‚nvл”мгЫЩе˜G"Ÿє›Шау•цЄэЎ/\лx§ 1LCз5ХїкvЛ€:З9`OyўqF;<“žє[Пы3j)0ŒХщХ§TбYFѕѓж7фхBБpЋ=DГљ3ЫѕД­Пзnл‰nУvmыдГейЭшU6ьА&ЁšL_ХžњтќzєМІќшњ]Щ4q)Z~RЕm“‡Œ­>\ЏyрTѕн>‰@ГЈоP ёјц‘HРrmЊjXœ #В8Л| ЛЁ 1[ЌЇ9qйѕu‘ј0с~МZЬslуніЌŽ5›Eн6ЅЮ’›•e{QI­AU&‡‚цЮЯŸx•:‚@эЎКœ ІG-МU oЃN>|СН2S~П-ЋрЃйЄЬzљ№Є™,ЊэЊИjЋ†: br\мљщ‹Ј[nA]ЛLžЯ%xЩсŽ0!љЏgŠe[ъ;ю§дmV]цВё‡Бn8КяŠДІіnj‹`–.У#>Ў(hфKbЎІK•%ЭІЯ!Ї *ъ>ѓŠiыƒ‰џП^ЊХќМЩ\W5m/ЋлЎ,ЉCІэъ- Ogпoyн`yПщBCx`oлОЊ3‡ѕ ЉmЎМч&[йВнИH]—ЇЖ ‹–Flх/9@KІз''—3шь5~БЖќЊя:іЏЯx]ЩУ'=Мп%6Е@ kcе ­~§ЖK ЊA6‘­IГЛя_N~мKКT›>вy€Дпl€ЄЩ_бϘ ќђsз/)јž:м uЛы2pЫnз„цzљtљхгёї(Бы2Ж^щNXoЪа6ДЩё№?fяў ˜b „ЦЈWŠг! t_75ШЅ iўpёху—З‚І;Tqє …жf6™иїŽѕ?Em0Ч§ЕЧ~І‘щп *ЂИЂ=‰ъќatz||ў(ъ†OћcЧЖ\€d1Cy7aїзK4lHгaи@5~оНН5Бы!ъвгЙЩјсќфjЎшVX4›Ž 2~\uMцлЦ{"ЦПз0\є•mœЕ›Mи6XЏIlEфOg MЗ@9uUeQХE]‘cџШZЌф_$,ЬЫ–ЖЋ0ъэЈ ˜5…П=е 'ЋЋ$NГ$ŠТ8IњˆŒфPџћ5QLлЯšЎŠ=цF%ШтЙ{ёЊnQ…ŽM[Ф‡Ыq,ынv]џЯЇšnв€9<Ч‹ŠЖk3п2д—ѓme…i‘eUзuА6-2яЙ?тџ~­!Ј+*гИ~”–u•Cдчг‰nz™ЏKЧQ?-|ШЊџџђ‚GїГКТ–уаБLхюпиЛю6ЮхЪПgЫВd6€`@DЧbvБНїŠm(Єђы3њ%'х%NBPЪЩоууcQЂ9;;п;ЉЙ!”‡Їѓдx4&ІфtђуŒ˜ЫВfй–ЎЊ@$†ЉЉ’РMѕVT,CZMп;РџЄ$CЋбToEE8zvrV?Y‚д‰gfє—Фџ[m,у:I–Dc8ј^Ђ рЇ §mУ„ЦП7Цѓ<Л‚УііБњn–‘ЂHЂФз§Eф‚šNўU ey^ЎГљNa§O@ "фYтРyџ ^EюџRž ”љИ&ЏB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *Tјџ‚џb/ѓБ“№пbЦёџ~‡пт_ л?lзєŸР‚ўУк“$žy QќУ’ŠтdEќ‘‚§ЈХлvЈ‰ЈЈ"ЧтJЎЮт-ш™Єшšz{џ&НФуvгЬXtџбU~ўx}їд=9yl_]PЂЂуŽо, \4ЁNаЫ9/пRм\џё!SшЋ$q‹СI§ђњaЬI2цt.nЧKш&wзч'$Ч <'h^ЖA“ЬВмьЖy‘bн‹ЊЎЩ5Е’5 •Ф-Ч›кХэ*D ŸЮыЃ•(АФнщщйIk(еpбњ3Я]Ш+Ї{Ic8Ef ѓСCѓЁ7žtъW3ЕGэvх:нlа, GeFЯrN|а№ЩŽћR7ƒlЛ+7™%Б“бRqѓMoќшсјЁ7Ж/ПžЕIzХK2дШnЗнэ7Р7hK_DЖДт$MIȘ},pфX@аIЄІЎЫXыm‘–лЬЄn:}єPœѕ.љtvї<œ#ЩыЗззнюѕлЗ$їФwМ ŠЧаYbІGš@™ EеАмtЗKt‰МўzKiёv“ejR§>д3ZЮoўњЅ~люtZЭч™рьПНМBМЏЏЏћн‰2G#ьuz hGОaœюG‹Ћјлm ёНЏ_Wj /Н,SWDOcY–y–i~ОЮ j:Ьx{ћКyyy}}љvˆ{R™gy–Ўз‘kщЧe‡ЄѓF{Д§"wTњюз:)шЩn‹ŽqkЯ4-P§ІР1ї5bХЫИЬ^R­ВЛƒ4CАл7лщ4ŽƒЄ(hGЧЌёbSЩmГ;уЌЄHlyrўљa%йљv‹Оž›о\жЧ@lа1р(Ц ;эOHЂї<$FЭп~:эЬnE>6ю#йПОфЎ2z ` ЫзЖњq~43šYУЇжЭmСJŠИм]<БЊПйbЋ Ѕеш‘ ЂћиnœўќskЅъ†&­&оL_^їEЈ/)й A:єfCM“yšNah2qщ5 4Џм u{(2§цdIгdПuњщ/ПUнv —(’l^іЛMцjš“Л}сЪ§гѓЛЮxБZ-ŽjE у”э8Жa@‡tЫ‹"†№fkЅG‡†X„2;И~-JŽ/>§tJi†фшЙNX@kA)Х)h”]сЫ“‡ўBабK[a&­Zэ:эћ‡?Q,зїЁпљžkл>"&Ž. zœ›m‹r[–k]пvЃAЗ A_вЊ {ƒ;šеяБˆPЂР„ЮГЊуG MS9žo g:Щ4ЫВ–чDэъЋ•СA eю гцUГOLЦУіљ_/—Rh;;ˆўСxAœdа†Šаѕуƒ—py–*qЧ1ГkЖЗF›ѓВифиХs ;іL Kќu39Ь~=bБ&Ї:ŸО’’ц&ХY lјw‰к$„`Ṅ<(ќПbЯ25™=†bZAЇ№eЫ"]ЧQХ Ја,!ZlKH_AЇqœЈ€†–ђєз!hFТx/ OCпuL >†9‡Щп[ž%чXІјў1OxУє`’.ёKXŠЂ&Žyщ!a­NzЭ›ІэzžЃŠЫк/Я‚bxIvH(ЄЙHCЯЖ!Љf щ‡к lЧ‹рСсгcпЕопьq AЛkЬVфjєpHP8O›~Œїiри^Œ&Лы(Šp$бКўK‹S 49†G…Јс7|Cвc8ЗYт+%йшЫZ€ї]ѓнещˆqЗ.ѓf#Ж{sлЭЈ%УЉN˜цYd‹‚ ZMA>‡x…$NЯ>ЕAeрGЁмa€z† €p шbГіmКеœˆvЏ Ъ$†зѓюBАђШ™ИяKП ОdDУ‹bWЊ˜ЅpЌ ‰чVѓ‡ЯП>ђКBЇJ!ДЩ‚ гРVЦ#Ѕёeэ Ия§ „ф-чжžХt{+huјІyŠbб jšŸР% Гѓ9ю\|њЕ-Ш_Їј "Dg5 ,mЅги‘—§Їчў˜тu'Ъ тcPQяє„wвMъєsuАгљžяŠ3`ИеМšы^ QekGœФ”ш6О|jKpxУ/Б.}]вЁ—†ЖD‘ AAхЮ Щ‚пЛ>Ц йM‹Ш˜Зю(&lЌOпЗbLŒŸ.n8УУъ§&ѓ‚$IЋa§—{x єЮ$пРAMUР‹RАЃ -еƒ#Ь[GЛЬ вƒj&G$#hІїіхA6—јƒЁgЊџx=%Eгtн3`Мз§~ŸyP№,Ы2ЫХ’Uѓэ BХ„Ў­хatвфƒЮЫ<0užшfœ šє№TfБяћЎЁ№НћЉЄШ’(Ъц?БwЅЭmIПe'Ц–Ф›IH‚q7шЛЋњ>бК)ћзo&фёЮьLФxЧфшЇ/’Ј% Y™яUfU.ynБ€˜и”g8ьтSp˜3юH8t€-й‡:Ёц\™–Y ьз3 ё­бžАМЂ й і`[AЖ *ћ2UBиqОЮзяЛ2аЅщTЄ82нvќhŸ №$мкЕЌU0&–ыAG ЋЇ7чэ7FTœеvћm­‹,d‚бŠиGЃAЖћЫ фžиЌ,•g@эК>Co™ЎPЦGШ­ќбяWЈФ6 К ›€^дяКP‹.oУžђїм^•‡C‘PєлVН0ш%ІЬЮ‰Z~€liq@Є![9TCфЬtќА„E]ŽЎМ6Ђ kЙм“ќ§9„4”5UЄс@$šщ%И рGXBMš‰Кс–- ЅЇ‚dИЫРБtэpЅ"йrА?H‘&OnŸУАP—"ЏXЏСГСс“$‰ˆy§ž@TЌоЅЋеПŠТ#ќLж=lЪ,{8L}>StœЊNиЭЮ™іВм)RљIѓЂЃшІћ=И)ђ=Ћи+_SЅ^k$Ъз тdkєžЬQцs НньOУЫ ђЄ3AQЉ,ё–›€вƒŒ6юд/_0t${Е]–i†`ћА{DЛЇ!УK*јѕwЗIl•Ž@>ѕќ„16є o'ьlzШ‚-Oэ (C]^LњнDЭ‚…љНƒƒ№dАгq CгфёSЖ››їэzвŸ-}6˜ЂLW—#VT”>PБД +,vялЬ6фIыБ;œ0 O ]ЇтсŠЬ Ђ›NŒKщX0вˆ0И?oВдЩwXOСГбШвˆ,KТтљњІ‰їрƒzбњ}З- ‰Zaq$,Mь>ОЭD™ZŽc›ЦѕІŠaи>dВРs-Ќ Ћ2лўr>TЌlЛћилЛЊ$№;э\пuy FЫДx‡žи:ј?PТ2†-8y™(и Ща2Шaj.{@.Б!{ЖЎkT8QZ<:бЛЄž)m™›Я&НЇЫПž4'’Њћ{.ЛЏЅŽRE˜Oч]‰^yE;SU7LЬ^В$‹;у$юхЫ-Kэlїўѕ+*змQИщ зО;§сДХ*Њщc…хс’‹ОпГы<і {Ј†%mCк\Ћx–чцьО‘MІwgЏu@nƒў[Ѓv4фХlќкМўtвbdY‚њѕAтB№YЁ&Ц*гz БŒоО‰s4™2Гй\ xяžп0„к б79t­RпЄDс†э““ж>!бm пŒі\Xї{MёвFћ Icа#Д#fœL€ФлІЎLo??АВ$Ћ4ЫW9аLЖТјцєёeТd=ФX^цqŠ2ё pћёkЛЮЁгда­>5г†эˆбxўtіЅ9ёZЩz‹Хб2\ауyуЁ3afьBqђM„+ SхvН4%vаi>Дћ"5іc‡ѕш=0•{^рУўzЗю”хЊ›|хW€7х^.š/cf2fD;ЯmJЌоОЏC]?^]4zsЊћМz„. Qў +mыђД}SovоУСT6гm’nWKзаiб>Пн+ ‚т—Љ.‹Ф‰ŠЭЧ.6Uіщќє‰‘їm@вQюј y”ЉšŸ,§юу§эЭЭУугD2WЛ4…dM№Œ`P?iLdŠ—YЌx›ъ"Ч+FI(їt•yМъpl–˜#ЕPзFsиzШёtƒgКw_>]мН‚чћЈќ‚оѓйЇFAшКЫт=Зžх sK‚щАѕЪƒwh‹cй\лг=аŠ>ž=“yыѓ—{АйXгƒЬžГу—‹яG‚Ђћ1Кrai<фeТН -]О eдЅ#оюыЋиЙˆч_:хš_ъН…Њy9ЈФbН‰Lи…В8o}ЙыЮbƒА)жk‡(У—Љ šЫrЛђtы UЭ4иŸђЯ€Ач„iту9ТэU—ƒќ’ЌKМnИ-Bc‚2ИjДGЂjтIM‘ƒVuІ5ƒlS,MCyЋёј9 )§п`ЉniьY:їtџ*рMкr…a’oжЋФs UenZoрK4:вUa4ˆх-Г2_кІњVЈд ъяaŒY‡dЙжшђА/—E™њЖc‹ў„Ь›wАвŠIeГіЈФ 8bzQВЪп61 r*=TаПФPе-0квfЕЏiі2/‹ШБмkVx8@ˆиЙ{С;EАвыЬTчУ‘ЌЛX)КdjHњЇxћxоQыЫ†хЇKKязњTCсˆ­ѕŽ‹ХФM{ЖFхюmgЁ@v/ЪuЌЩгС U-ЖЃ7йgС!'ќтХ?@а 7 НWRjњийяЛžІи'“xU…—›—Й‚Н?eюЋќАЯQ+ЪБ9Ьаф§њиХqя3C>ГЯ0Еоі–тѕълщWpOeўtнfbDeЙrдEw iNZЌ№ДUњЅ2;:кЙoX­„мbŒ№JЅс`}c‡!Ј)ЌQ(ќ qy6bБ-muіЪ`­ Орпы–ћL†ЅЖ }М_tМoЛТ"]•ŒЬг‰8}КЙЊwx…ИйŒžОВ„њЋ$-§уЛ~~+ј§кєл{ћS},Рb.u4iоЛ=ПКisВbХыТ# 0Q-Шѓ@Ѓфћ='0ЦK&™`NЇaІqрЛЫ|“йDЗN?_з›ЌЌ˜QБŽŒХxŽЯrп фˆQюŸЌсЁЫјЈ.–(ДHї‹ТЃТ yњуewЂ­ЪдV@%~Ф•Њэ=ўwXШвОgЁv˜ElYRЌД\ътЈ]??ЏwСЇ!sцY?‚я#Ю"Wџз>џ“ok6­ч%Yшx~Ѓ-‹дTц§v§Ђ>TъDYšЦОЅCИ ЂЅЇг?Ч[0"еЌe–&y‘‚šЬлWѕЁD4?Š‚ №-У0,ЧЕmC;@+ьтŸЛŒC[W$‰zY‘XTс‡w7QеУ"#ьYPБЈc!z|ї—_ОƒЬчЁбD%š­2_'„}Июƒођ-UЅ§)QTYОѓ*џ ЯПА№C>Eqh7}ИщKЊсъђ‚]p<Яsм‚eОkшјG,5 žG;xЌJЩєіІЦЋšЅ‰“~4ŽwЕх7BEm ў N щпVkg—@QЅЧTЏџ'р“”ТBƒбxMЦЕO—Е‰JˆІŠь‘щмo… €й\d ю‰ђЩ ^$Іš*KмŸёХЋ^‘тИљŒ™L~­d^пc[>Ф U•+Q~/цВЊ*Š|Ш*ђьT–)К~1tЦё‹џ_ы\ЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈ№GсЯњ г/oїyўoo[§:…„?xЈюnёЭъ…ЂЪт7Г•_ІC№DзшпѓўэёUжкP&‡DзjѕџэI^|з6Е#ŒŠјOСт›yŠыzZыь?‹caC[п? :œ бЈЊˆќŸфХMЇj:•EАшs­б„ПЋ:NX MeX›Щši9ЖmYІAеяї4ђпс­ж{›ЩTгdŽщеjŸjїЕЁ@ёНѕMъ…Ј›Ўч/qЄŸcRњtў›3ЗК#VdЂyоk?€{ДZwwЕ‰B57Lђ"ЖuЫ “$ХiСi`тјcщћФ”ЇoСтЎе_ШЊJTqмКkѕњЕЦыѓ}Н64н4m?-Г(IWх~аq{QUѕЛ< 9 XЄQiіVЛОzIЊЊЃ‡ыЇ)/БNћњДіФˆ>kс Ј<Усо8џеЂТ”‘aqlЋ'5,ЧЧ l;l]_6ЧМРОн_ЕІ2UљўуЭйчкeЋ;шП>d7п•KзЂ8єLM]є;3YцЧЭ•3œ/фGiЉ|љЊ5ш?п^5'Ђaaв<;ПЊ}ОlѕЛлЙ“nS’ лq,•Ÿ>]ž? j4Ѓъ†fEYЎRX;"1эЫЫFуОб zрЉТтѕќЂ^Л|‹пЏЌhQvФяGМоŸœмОN’xLџ˜ˆКaКQљўОлрєNG“F“глЇ>+i~ F Ѓ›ѓлкѓPЄš.Е;кrыLћaІНЧЛz§>bo2›ѓNކ…Fьіc‚c‹№Н“Г#R3L—6•$цўЌё6хл3еn›„ыФ`ююкЭЦЭнг`иkеЏя_У#О‘<‘ЉЏппзiš­ЗЙЏ+г›жBЕ‚8 MХйУХг„“‰{dј(yЂэлѓ{Ž2wќьŠsцУlћQЦžц›ulYcŒ/еЇ`П,‰тЂqљ2U-Ьб/f~kГЫМ6‡Вi\лhЮ4М0LзЛ5О oтИUKt#*3_Г… 0їѕЋP+ндŸXqЌKŠA3"ˆmШG<›7­ Yх.ЕфOмUЙrUfJќМє!з оFГyџіЎ3WЈ“mv…/ЮЕ ЖTУГ)БТиwtщшjFДьeБ)WыШ†cб\цEdˆŠmbЪ;Эfg0|МИ~d‰ц„ЋнЎpќg8Iтћq>Ѕ “ЗоСЦЂџK(–•ЛbU†šиЫVTKлЫЬ`{­fѓЉ;ш5ЮOы} ЧІР?н€БЫЅцлВмюЖЋац AyžcŽѕhЙ лэvhRяъa(ЙЋmЏрЯRЗй~Œ'гqчъ‡“ћСŒeеŠ ОрєуlїѓзŸО~ь6ЉЋk@ћ<4TžЧН%pdЕн•ОІtOOX+н­ГbWИ‹зЮxЖрDgnџђуIНнy1 Ъ§hяŸўщызЏ›<Žуd•ХKпЕЌЂќ#…š–ПкцЎ&Ж>}z˜ёvS”›<й9>PN‘kќзgwO/Я­цыœІ`ъO_п?~њ VњуGšТUљ*|Чў§џљћё_ЛoVŽЦоќp1”є}[ЎЗ8–W‡TщX`єн_Ў:v>gњУ9MvЛЏ?МПow`1XНŸЈОZEБJЧ:ŽdьsFRFІђњљѓГHЌЎнnWfIХqh+{ѓљe!ЊыT3ƒ~ўўѕc‹г*qк-С^ў~€х*ƒHx ›‡œЙЇЯыНšR=Ԙ_w‰“(Wщв”ФЗГ[VХ ŒЮЛЕ}џXЧЎэИ~њžчрŒMОА )bЯ:јСШЮ \ЎŠи!oЇ?< hР:‡E,СOГHч?6IМXopвєzrfYЁЇ`Ј?y§oоЎГЙlЙтŸићі­И)0 H9 f09чœ‘(йПочBЏ\vйDЉ СžО}OŸгЗЇКлы7fgЎ­žйц)/Ьы}ZќлпIїъусДцјЇ,ђ,6…uчKi;Ъв,KЂЈ€е?>›ЯЈAФЩ{ящцўЅ7YЫVAžŸ™YЫ–K†?•` ЫЧПЎ'dТFП%sГ8ЂиSИсхЋh?‡А*Њ[РшcЈбЏOэжгsыўіўюіўuВцеёЩœЖѓЦЧŒдЙМ 4/зЊ™MЦКo#Ча5Р@V7WA”№‡g@ъу_›п\}Л{юtZЭцCgД5Уt!С §ЬуtЬієјщђЊоŸьqv[ŠШnDн5%њіЯі|Б\.Іуn{­GŸџёŸ{W^^мПS,ЫLŸП6_ЦY!Гi,Ы8ыtfr†яНўћpиkп}Н(І[дrия2GРžЏE]“зЗџvеzє{‡ц=c&пќиyjїтv,Yp­<О§жBіdј@>Uв~у5‘LЏ‚—I†‹Už^Œо'4VbбќїЏё‚ZŽ;ЗЌ•!VЎмie—ŒWВ6/зЗЯ/Џoзў№ЬгJgыѕjђўкjПO—ЋйGЛйьѓ†GЦЊЧк•˜Щ{џ­7^бTџђћ%HžЁ0Н6ыŸ?ŽЙ'uЛ‚фЉbчЗdnrЭУ6 ‰ЅK^AЎ&­цЅ9еёHfs`Щ­vПпiwК/wўѕЁйŽяY;чНрQ†ЪŒ2§lи%лОќк|ю ЧgvѓJs}пїШ*еt=Я5…ёУн Iќ€р@HCљнfдz#Ш†—5^у–ЊŸ#PK`Љ5irљW{Ў^~кЃ$žcпв8ДЩE˜™њјссCє#IeњчA(9бvW†зОяЭ6Ђ(r У)v˜ЄОўбнД&[3 mM–Йљѓ?ПМБ†‘бЅЛ“ЇРyжЁ8'єmф—ЧзЙJDаЖFTgМзл,tц/ j~Yjpдšз-KЃžЊдн Ьrёёxљч—fy)б3dИ-œYVиŒО†яФПО њ йIАYЁЩѕ3”иy/йеБЧѕЧZ†q„ПЎИZБ<ЛziЮN€н…—ІRћћbhРшAONт~^yшЪЊ%I 1+ZTUa>^lєИФ;Оz†R“ъgЛдпRЧIšЦАлSщ5oоnœ @ дЉ-qМ$‰TПљЅЏЙШг)РзРы-Ls8ЩѕOл, З9ТjВ2ЂВDLџzЃ97Ўъ@Ж—Б9Я‰b }K•ИEЋ%И~N2Nц›–c†F?_ДнД]РИ%„Šф’<ач й4e†–<|JFЭ8/+cO§х1=1‚ЄЮ=ъОЋDQŠPЈЪ*6єI cйМ ЧžлжYˆ—<Ы”7пI5Щ‰RН'e06 cи_qТ†гТ(Э:AЭх(,ѕ—Ÿ;SN”Bіž(—ќ68YЌ-ŽЧWfœЇКG•!p"лд&_/G'JВцІлУёУБнєё€u26…ЂџyуЪtщDиˆПœ0n”e‘ащг”Laфy™Ѕ‰я™+1 ўФ-r@ƒmЉ“ЋfoЖf74Эj^y*šюweтˆВэaŒPЏ qЊђ0tщБОљЫЫ,<y‹ˆ…М|КiќH…0с\ЯўхFГnшщГЉ~Gx €gOУч=uКЖ‘2*R+ 0CЮTyrЁ5SПq~g%Ё@=jBˆы"єДљ ЬЎNt‰YŒ:OЯkУ ѓ’ь6rжA$ъ‘9јщФ75Ј\|Ш’Чw_чgШ-=iєЭ(†sіGАъ0ˆ У„&HААДю…$LЗUЄ ›ѕќН}їH#.J§РirЁ`NхUrЉЦmћtJ–‡žuОУађJŽи8ж‘Ѓ+OŸ !pbИи\lЉВ"ГуЛћЕfИ' Зy$‡џЈDРNžDžЅlf ЛˆvˆиsЮW€фШiВТЙЇГДdС™WІ а6=ЉЈ*uM29˜yМ[Љ†€gdф›>Ёl! ’E‘ŽT^LМщCW@C`/ŸЭеl FocGЅЦ4„+шє–€_НJє-4ˆOЋ А+U3lЫv\ЂЩa2‚Ѓ№mƒЬцYzЕ\ ЊžА=|ї<%'h8FWdџ'Ў йAЫ&4X^’љ—Hн–xЫ0t]ш>LЮАU4+,OёёY†ТёЂШ3ыѕ†ДщмœЖрЙч†,њA R\#WЃыњQVeхО K™ПМГ9йˆЄNu*В5U7-Maћ9Mo6МЌ9РФєqšЪlЬРџxiд#Л6#!9–|&Ѓ—І†E оœШёoппчŒ 8Щ rыž.Ÿ:псЃБрD…8”DvтБp aОQ-‡є_йФби xбскЦйъЈ’ ъ мžmˆoз­с‚с7‡б„Z Љšэ:†*kRZЕ+ѕюј§˜€}.%УћˆЧЖн №@їђ Ј+gkˆ„ЋƒЈкZЦцљiŠид­Ј&LТКNв’хƒ~РhFUMУЊ:ёщOrўПЄU+ ЈГSФд шA№,C=cяЉтИШMЖ! япEгt(МŸШЉ“y~EОЁHуЦŠMЮdkBђŽЅЇВsNs’гљLъ™ЊЊJ–mщКtЦ39‘Ин­q㇛‰f:QўЏЂщЖм’ф% и€6aи ŠfкXbєaŸZ Н‘кIВ*bG“%~1cU‘јsŽQ-7й•ЁЅђуіѕэTбЈи‘-Hи?xjQ"Sцы 7lМŽi^BZєг-Н 5‘fT+&њ–dЪ‰FЕњsz}жцБnће6Вdvб{yxќ`$””xњдKЎ l(vU…}o|ЛЬiф(]Й ЯŠК_юЋ@W‰цЕu§\8ї?.JГœА.]•[ЏцгїNwЪšGŠЉЇb1p1bЋ*pњЏ‹‡—бŠ†Ѕ)#3ENд‰^Ќ\IxРЁ"§†Ѓ8ЮДэИD^xEшqЗ;\БЊM№фxDœšW“ђ‘Љh›ЗЦХMћљm4Ѕx=ƒrЩLYP­ <+O™љŒЂ7єьcМ\žЗsŒCкБјШдЖЎI›qЇеndrГ$QГbˆ˜]dЊТфЅ;œЮц˜€ТžsЎUЫєгаЕ‘б,SсV§ЇЛж„#§HвЛOБgk р пh iЩnћ9b_иВЈQе•Л†ЮМvЦKFдаMљ\d‰\sЩВШБœы:–ЉrЫЩ §эњmЃЛѕёћwH8:Б!Рљ 3yh6†0<sЏ.†D‘лЌѓЩx<ъ=|}ІD=Ј‰/KЂЌS\OпЛO7џќJŒ6фCЂТЁi|MѕА"6CРУE+А љ7є%чЄЁ‡bYv=щ4oGЂjBсюyXVUИ“8jўбОИl`8aЖнIV"MjNZŸNŒTqе{Ѕ-эs7еќыšЌ9Qг Cf>Ў[”lX~”фUхYY•Eh›šШNЎ'ЇЮоmžхbŽ—”PОК,0‹Цы`Ѓъ`оПОТћџ\3ТЫlЧЖTЊ}}еЁD ЛгС†лOйЅˆ=їоlДGP.Ќ …`ВЖŸCДgѕq™вf5ъ6о&фѓї<іўaЛаt†4{hоД'Œˆє ЋvВћў}[юы!kHђєОёдRЋеFіЗ‰&k>жawќЌкЅ jŠЬ3Бќї…H„Рs,§xzz|юOС.p ЙЉ‘|t‰нС— Яn6JД %^дI+№чgЯ я‹ rєяъXЇАЌ&JX VЛ럘N—‚тяПЏтBP•E~ѕњ­1тUMзU+пЧ ЛБ5™z}jЌyўЗ>Я@\ЬќНu{ѓиP’ž­оЅКРБ›хћэEcJšО7мr@ +(КзЧ:Дuqж!]g›3ЗеќяK„1фqH]ЂЛW—їЏsIїЪ]Y”ћCЊnжыѕєэъЏЦ˜GFŒRАЪVEjГЁ'їЅoм БFtќж'ЮЭАнSg4МОщ-EЭNwUфGх.Зdžч˜щУИFZю€г‰YoБЩaЄc*гЦ\”„Эo}оE2!pTБл|ElРƒuljvvиF$ЊТš„`Љ ­Лj[9š2{‘ъ]Pж…oщрuH­ќ9щнџЙРuь t }љдZШК–ЛЬ–U+йюЁГmCUVЯЦBRŒdЛЭЋмжФщ;%( ui™AТкЫГПѕqFћЁЃ iЖ B-DХJ@Љk0nMхЦJ’˜Д…ККЭyЭіу)iџ!q1Ї~ЋЃsХД}ЯЦ*ў‹Ны`j,[Юњ'іюЬ00€’ЪљцœsŽ0язЛvvЫЕіњйЎ'˜­КS$1аЗечыЏющfeХ ђ2Ry†зLEм В.„oИК# О№ТРв‰Яsˆџ ЈTвŒ%нMа ЊЄ˜ћ;С@ЯЩт><@’y‘"=ьMZA€ЖэиjCБт$ЈHЊ":„‡ˆ(г б}4Б ‚яУBфxХE„'O} x1єtIт?ршѕ@ЖSіD<шщ0 б§Ž Уск4]ДjЕ!+ˆfTф†€u†Д z‘Ї~шй|ЄЃїEЧž=BxѓлБнИШ#дdџ# >М<7xЌћŒŽВ†Ў"КŒ§БІ9=б˜%UF;@ Ђт$yќНИ‡ŒXлА > ir8 Eй‰|XМ€љzџч'PЖј.2ЫАВ—Gš@ŽЎПЁ cЩŒВ@жSˆ';є4I|пŒђрdEЗН}‘…o(^SЄ'?Œц%”ЗM™ХРhУA™џЇh\І DŽšжЌхЎЬЎZg№ЩѓŠ‰юn•Зз,Фмщјџъф [К,аГс’U‚,Pyzм@@GћhDЯ PТУЧЪ,ТœGv4YтБŠ“F†РoP'ЈЗ4MA›’$Q~–І;kž‡T^Є7И™;Д%Р/BвfY^РбкM§)–с`œ„мШSDЎуš@$шФ/‰ы08F$ u,Жzџ“љ)+Ъш† † 8QšWіm˜Vш$9Œ'гЩЛŸЩџЇиp’,Š<ƒб’Œ|Очˆ)!ёЕ/њpЗ…сЌ їћ+@$ЫВя[S§ŸАЦI[Nk+‚bˆ?њК,†Ѕ№ŸЕ#к_aCБ,‰§Lыяƒ5ISФпЭеЕХzѓЗГЙB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁТп ?mПЋХžgЫѕ­VŒ]’ M§]Aџ цПЕtŸуєяЭнљп=-Y4KEb>ЮД ŒуXіЗОЅд~ нŒ•Эдeq ŸЯW+ЩhАЮ‡љgр<Я1ЈoщekˆКmжh M“ѓt‰BCUE7t]•9ђ'2{:њ­žсГoNЛ‰šЫJŠf)jУЏ™–eлЎkjВШвhѕl‰ћ%xйxЈWАц№YяО>ЙnЗ FdYГ<АкGC{“8 ‚§46љА6Вhf–( pкѕukИТ |ёмъєЧукuчщсЁЖŸ(ЉК†dІI‘Ї‘oыЊ$qF'/)hH-kЭЫЦг|Еvn[cœaVOЃСmЃVыЭзы5NЋaБ-c/№}ЯFнqЉъ 9ЃEY5]ЯЕTžZіЇЭЇ~чЎй™ЂШ`УСухi­vѕ8ш?ЖЦМ™эK’5мЬ‘жљvI ВjxqšEŽ&2ЫохiуњњЖ;'yCe6ƒЮM§ Ђцy:э7яi=к† Б$y‘Ѓ?ЎYя†цDйиЯ™G“ЯEzењvм€ИfdгVhbіPПМЎењ/0ЃцRJ_Zwієa6ЗСД“нЎ@ѓ‚]M Їч' ‚гlЯHbеЙhм@†ф ’э‘ъ•ђбЙчAНbW„ЉЃјMRЖщЖЬAЮы7ъuдТWЗUіЉ+9Y aЭ‹›ЋГ‹ЧХ}у-дЗ[ K4Ж[uВ2‚i?1Ј=НЅp,EсЯWѕЋкЌаF-ж =eн~ь?6ЛИЈщЪaЇ ўЗ DYф;/}#X#*3KЂŸ‚‘ЄІH†Џы;И8ЩЫyбZšЎ+ofГ™Ќ%нДME ~“ƒяж|x*(Š"›ё.жљеSќВt$|BЈAюKєz:žNЇѕц]Дx—:єp,YЖLвš&А‚щyŽ­Ым;7K^r3œ0пК2жm/e'+|•\ГV–ЈєRao№|SПОѓ’ebQ Ц€иLWWр;Y` іˆУU§HU3н8-r“Ÿ5:Ђ"6^s›žvююл}Ш‡gѕЦˆT'*ЫФфhйдxЩIЂ -_ЪФБЪё,УряцnACгk‹Ђcz~кйHћyМNœG‧аЭ–ыХгхЗzgУp’юeлмUdM“”`З-_^пvЙoШŠЌЊ"ѓф;ЙTf˜ьЖЛXцŸыO”яŠ . —v‡k‚ЂIry{trйЌŠгУmс›КЉлйл?оо^^^ЖiАПыZ–.НSћrV3\4P5T„хХ—ульяЪъ‰›%С‚єуђўѓI§ўёi0^rИлІQЅЛяџјўііі|Ѕ9шО( l]y—Щ3NTаЈ2OцЇЇŸЯ 9xйeлmžXhўЙjh"KЕ>м ЇгQџiJхїW№яюѕѕЂуўэ^^@€bЭbGSп%е —Ї'Й­0нуЃ‡5ФVeQdЁыz~˜<7?]OI–cˆе†1ђзн|ќRfiQnЗpА$ђ-Ga%q`ЋєАq‡+N^юkЬєълљйљщщщз“ЯЧc –$Я’(J яvyфи^\юЪ-ЈoШш2ЂћРuѓpтt&ЖŸСŠƒЄ‰/ЯK!{ ЊђЂЃ3‹У:ЇчЗэюcЋqњыQUt'‡v/H{ьvEŠ8~xнЗн(†єŸУе{ЎСШh\кЯ;/rЁљoТШVёЩZёВ1^Y2;iЖчEсУЦЏŸю–М Х8іоРС _ѓ8‘—•E яЖ С‘V‰\ѓPVsКщ$№7R№W††ЈІЏš Zi‘%iB9ГDb†‰рКїхгeoCKVRHџ—eёBіQM7‚€џ/Ž їgЁчXЩ‰3AЗQˆ–i{ž% ШЃ8p}(qГ( "0"4%pЎщ˜’0§њыљэpЭQžУ:нЂ§tЧP%vГтЬЇБkдOсr"Яб16qЦщЖ—JmNP ЫёТ9œЛКхAєцЈr  ю“Ххё/чнoТ5mїfY*nEOК”ШгЁ%nцИРе&ОmQ0КЦъ–В™оЗРЏ,/iЖЇHrИ*Х›Фy @М"‹ѓЏŸЅРJм"7ЛІЬ1"”ф”w(ШЅyћ~(кPBф Де”n…EьrнѓzГ5ZЌ68ХЩVeЉo`=Lsб<у4K|фSІџхшЎOŠF˜ўnД"kŽяz)Йyь™DчтЂЫ:ЌюиЕЅCd|oД# ЮЏzуеУ–3Јo5Ыї щљzFЃЖЁc(“y6#uR`ДАр S№Ѕиш7№Ћ9ez‘gЫЈИжšІžБŽб њвЏmщKЮo›”aEгiМ&ЫŠH.Ž!ƒоїРьН4F„ѕf’OSF 1LА€с sdbЭ;эђТƒ5Н8tЩюBїн Jг8‰@wBE:mіHCХи#q PЏPЉnšG73FTT єiМŒ$w:кќўiE3Мц A.єS\Ч>РPо‰l{ЁЇ Ÿ9НЪ IT„aтZ†Хp0-няtС•ШtышлУчx(ЩM(зA{ˆŽЅщѓFд §’4Rї][X`šcЫџzі˜H№tКd3=фDB *эИІ)O7yВН„‹ьЌауГжhI’$нН+OЅУ†5Ѓ ДЌШВbŒ˜а№|§ыS"эикx"{(8Š mд‚LJ’а3-mЖ‚<6фћaєŽЎ›ЮY{Уr"Oa$o%Л-7hЇСF%bИзIhы žБШqхљ„гЅфqб2”ѕ€vМ IA!ŸІHнEЁm)уЉb8 ѓРhАK˜ѕ е˜ŠЊfš†"Љ^Ж…тЗўHЃ ŒЏ‘ZŒuчшЖ ›HцЏ?S"ЗъЮ4п‹ікdFДїlь[–ј<” +FŽЫKfШџ`яJ”лFЖ+ўe6oВ(‰&%Q)‘т €Фt7і…и\$љ}}nsц%™фНL^ЊH9U8.Л\ЫОhм>їœ^й‡цЗ6Š Ђe%T€ЂоSJ%)E•FЎЄ%-ёЁwЄqёtТtДe@Ѓ­в,ЫЏИШЯxzPН ЃЃЭUbъТД{љљЌ-˜PѓU–хбь žl p€gNссР2‚„wшЧ њКЊіЛ"tmкўїЂФѕt­’ˆ ™ŸtП}h b‚T8оžўІyM­Э0†3ЩєAЅVyрйЧЫу:РМьЊи5Dа+АLtј?Д5Хє@B€Цˆˆ&/ІƒцЏW6=JlрtРrAШр`РчBџЅ~€Ј“>_ЪЩcп;Ššў12а^§ЉŒleШbЈ‘дшQ @ Fli†Ўн—"v% ‘ІќњК/e$ kоnач XPYЉя‘у\(<CаQLkђ*АхЧ'ЛKJ]tiRu&ЇœWЦ6ьзFчЁ†‰eй–Eхс!ш*ѕзaCљй”ƒз“QлEОsДхcЂ-sшљEшУћБL€Љ"ЂЄPв ZбћЎљлK†U4Mз f[!T—зЗW`CU•x–4lЙбŠ:фlщЛкё‚У‚[ЧЎ-іК#AGІэЧ'2[WuˆZyn1сtЦёмB1ƒŽлчž&мb1ŸЯ%dƒІŒSЎ(ћЁcœђnBA\WXюЎеуDECVИоSG™Ё№ EV5 Є~У\tžЦь\вˆП,іooЏлиBЃ‡™ЈКІ#ЫОЁТЕэчZЧ#=&мXYзF§ГЏїУЙ$NмАЃ#zUlЊЂЄгыа…{І=œ+євw/† мQњІ6šЈФq=zнЛэ‡ ˆ—ЂL}Ч!Ч›Ж;AA%\'Ž…'_?пєЇsЩАѓ§ ;4vюŠЄФЭбeК"Іу/Ё№Cаo/ЙƒФбл>Јh—Рг8}siшиD?т"2*›h‹] ?ŸЕ&ВŽ0t37и^KWU:гŒС3'„žJGњ^^З‰­ѓSН(ђЅ§•оQNgфlг8цєЇь‚Ц€zиDМm 4Ыі jІЖшŸ–aXŽ ~Љ}f``тD ЁЃю^^Š€(ГЙa‡@@еji#Њb)bЄscс8сЊЪC‡ˆнѓH"/) общ‹M:кБcO>AЪг›ЛИQ п€тВmC˜Щ@ю%ЈA` лаU‘хd„4љЈ3rPkY€ф~ууЕhв…Ц=yžŽуљPѓ4Ф†јШДКМЂcЫЃœИYћXцц†yXEKКМ‰OwƒЩєИѓDSн99†8К>џrУiФKV‡1ѕЊЪзv и!Є>FB—љишMY3ьx9ŸššРЫиIЊ]цШєЯ4$9ўбtМ4ѕ,eідЙОjѕy€иЃzhS.]Чё*ŠФAhqЧ|З+ŸGWЂЛHˆvєeр2 ”;‰эЕ.О~m\о УZRўиnЈй^9†Ь>w[пО0ааnBчВшју&їˆ2зЬˆ––Ь7ЁЅЛ"МћД7[ˆ‹љlмы\З.Пž]v9аІ)хс"пЎ7EюqмЛНќќг'FBФ€ЧiёЁsXœыvЅDП‰8цA9nщ'л6x<=ДЯПЖF ЯД†ІЬВ]QЎВЅЅЭGƒ‡ж‡ џ‡G і{•GІОHPlЪ$Й%˜ћ…F,t’•b€Јhq>lŸ5юyУt‚$_­‹8нфt :Д1лqы 3\P?@ЇЁWQИ"T‘ŸЎзЉorЕбх5“ЈЇY";‘х˜X4?4К и.˜єЌ(6;Шп Ђw-dhУ цn$HВЌZyš Hу0ˆвѕЎ mџа#'ЇZSУ"`эуЫЉl@grЁ€SVивљз"@[АMІйƒPМv5•€ЙЂc Лм7 iк…h0eљ“-E–ЁћщкЭжuŸ$Uеtт­Ј{эМJ!e }вdкнЩbЮђF\:`Э пўВ[ OЛJbИаАI юЉ{ляЪёќ\УnБлT%ИоФ3‘Іˆ цžз УаЌUhВЄ› ЁЧЎ#ыTЫџ њ—eHмрюК}ћјдŸЉ8ЈЖ9А)Љ‡^кќШєeD`ДйХІ&вŠюЧ9ЖoПЯNPkд&)ьУљчцэ#˜Ј Š!HРMiЫsŽп}њєСnCоd6’yNJђ \™‰NŸtЯž ^Zlијм~фu3\WБ…HP•ž.ЭyіёьУagŸ—–лЭЖpMmrOmАщче*ДЭїШБfб -4<ПB5іW›двУ‡ищЮNuо9ƒ,вБ“–јхb/щњЎcC5=ўЪє ЦЖЅбхдІŸ•Yh Џ";ЁгЂYd!t9IБ^'&‡Я v‚аƒGХкЛ *фС6Z^œЧ>$„тiYв ЏаDшІ—ы"Рhў8жˆPQŠ:і?CP]WТЫ SКкЧФи>LhЌSЯ"њˆRВУМwЈn&qЯ6‰vœщ•џmд”l‡ˆ8РbOWЩ[t-MEхІ?ЈгѕІ>Q{-|ŒяZПл>їиУ€…Fl/ŒBпЛGL+ЬiабаnyŠIQГ<Ж8L‚Fяйа‡h[ЎBа(?нАЂu•zXЇy{5бо6–Оav<Ыћeє`JЮѕ#уК,ШШЮ7™‹хGјбХP†ІВиФТу”юј‚œЦяDw†Dˆ…†`Cš=гQŠŠКќфjЄасб8Ж‰6BщБ я6ѕ/a„!jш`X™нCЖ ЏШЄ=УOZЌj`г щFO•АiBŽ9wџ/€3 l:74ІЇc@Ьуh§hЯujЗкc!#њ-§TCAGЄr=™qрƒЁКЂ&N­1EGЉя"яў! C}д… ћБ‡гUmžщpжQ…“n`ў+(:ДЇN'‘dћ!Z\š#H $qќBлјCtРџŒ™MЊбгŒšрc:~{й tКБКSIQЇЬ ёуƒ`n\Яѕ:шПƒ§žЏsUгUљ sfБ8Цbн#рпїЕПР+ј! `5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jдЈQЃF5jќ?П8њх'џ7№ђ? l.ЉˆМЯћХсМ џЧёСЊёћљЅ"1mzеŽ6?œьЫŠŠєуœЗљ8ёг9§p>=,zќpрlЄбы}ˆіЃVШqПŸJxq7н0єШd“^‰–FaјžKЗо§<ж 'IН њѓYў|=?>џвМЛk3Ь™Ф ’UUфE™Х‘яXЖEа)ю5ћЇ`e бгw…ѓѕУ9|pпЙНcž'CцМ§p -н[(:НѓgНЁзfqркІi(я™е ^3щЙІО|ћј >i_wGЇ2Оy|lCапzЃ ЫkvRmЊ, <зЁ!ПчЉЌsžнНL“РTЙ^у7јшњ‰ubhмгшс ђхВг}ИН™˜^БЫ|b`Œеw ™сTz|’—Eъ!e~ї>ђ v=ЌЮž7ч_!=X~ідМбьlŸ:ъxТНїYНœfљЩЊШWe™К†:„'’n‘ЃЫгnЇйhРЫ00Qћп8'.cћG8J–GvTЎГe”–ХвD‹&3б Я-]ЌJг‡VуЊХ0 vмc8‹цХээmъkщѓw zІYЫ*ѓАШуxГ‰LНЧ(VZXќфОqvu 4M’"4†зЂч{6л№мlн ђ\K=Ді)ЯФЬXЙХк'bЏЏ‡›]bыУ‘–)gУ~Плў ЉРЬБ•o‹я<›ЎKи‰aЭАƒ4O|зЦ'Юёё\u'ЉKы_єє кeЎЮ.HZxЪфсііўЎљщА‡LМеОŠєчЎdЛ„—нРw]z%u‘влфN[Э(svД^ћ˜НњxЏЙЋ]Ђц— šнЕZюунх—/Ÿ@yxёzЗђфёTw…юЇY”›З§:O"п&Кt:Ё=1,г[f›•Ѓ>~њp-кЩv“К–›—žдћжyšАьфсќѓ'Fж‰ЛЌі…ЏВжн/wєRТЗзА­6QN•е’щxqYUБЅмўіKcl›}•@пыN’&ЫгoП0#ˆ;,їыЩš&бюћллНтН*Вeœ,CзF'КПCqм(пBВZJчЗŸ>о vўВЩЪн6З… Џж5сцг9sѓ4bEЭYНT@ф†aЏоўі§ћН.}ЗYЏKz[чXЇщЂeIЙ[DЙћѕчпZIілМмэŠШDиr]`mБsvХєћ§ч™тЌпЖљ2гЭлыыїПНН}џўњњВпmЋu‘ю‰юJQАщЅ›в7…ж/?Ÿ?‰fіВЋ@Ш­ѓeДL’8‚ oПЖŸaСŽFМ‘МОбKВї//лЭюхѕх’Ђо‚^-Rп9бХSй ЫмAуЏ?}юБ•{Швщџ:шžœєюЇМЊ ћЎЙ3ч$еPЅuџш ЯЈ†WДлЪз$#.P3Ё(bUZvпІGгЋЩг€ЕыП~6ž>9љёуштюёщёсњьИ{zжЛ^hюK˜z<П<œє&ЂsAЕc6M‘Ц ‡$жЅѕщїоЭыxєŠ sЧ‘Ђ?JO}9ќyвŸбЂ"sџмщsйtŽmqеЖeИ&Р˜2}ўŸЃЋЗй|>~ьнђЛЂ3GМ§yіЪ›^Ўњ…дMЭ'oЏУзЇћЋу‹‰DЄЪRфеІ-ЩaС"9$X•ЉГЭUUюѕuЊП>лРЄЮЯ†‚$YG7њЂ’—ЂхfœЄЊттщЌћДVьЈ CФл&а†Z­зЌ(ŠгУн }ЯЖИ‡‰јQЙъЈ7a[ЪІЩCKXŒG“хjяmFѓ pažчhЬѓйХ€…žoa#p•Ж0{М aэ–ѓ‡япШцYžz†ЌDэч{сЪ“gкХДяUd KN6Ѕ§f\ЪpHp‘C†Ги5жїч—sнЭЗял Ь}n0ЯчGчЇwїWЇпўшƒИГЊJ?Ќ?>n и0o6›эЖŽ\MsЦЄ)ЉюS%л`qЊч)cWšнžНHVмЂцЭіНr„щХЯУ“уюЩёЏУя^-Ёœф аК!:о Ќ„ 9Ч{гnл" Ђ4‡!xЮў|овpУЌ,ы‚‹Р'Зї”4Ј…l"•{9>FD|М==ќѓ[wАŒЈкО#ЊМуjЩнТосѓэЖ.ŠТ3"G„zкОŠц,—\pAM ѓl+ГчЅжЛon`šДѕнн”EъѕєппŽ.п–’WЂh\яЈЏн–žТС6лЭпї‰GЖЉђ8Є=-Y^T4jдŒ1Ћš*ђuNtђMS–yюБ%Ў(…œIЩїП§qpђ0œЂE”н˜j**":Цъ"‰€ёІˆBg?Ђ8Wg›*Т3БЊv‡{ЦpЫ›m“ХaR5-8A7М єteјчGЧїSqW4)8GСЖmШЫс^œАM]fž‚{ЦCKC?FoЁ9~VЇІ щЖэEqšх№Ъ%І`“КюЅxвxіq–хЁЎЮ~|?;Ppдэ{[˜„YизЋў+рQчБЧ^йЪ^šРsЭ Ывчž_чŒЈЈКi9AŠšёtC}AяМАЄУUGМ§Ѕb%uKJцiVж mљ"…цqS&ž2ОНœ9iнqЈэХЮ ?ЊrŸО<Н}™Ў(†a9йєГВЉЙ›„nДg‰ojќуЗяЗ ХіsРЗЮ"( /™AG&­’ЦX]&ОБz8?9˜(Eшi{ё"3гъ,ЏzуХb1›ŒчДh“8` ЯІІ_€SъƒЊЫьлщППdЫ‰Ы?dЁLƒˆEžd F–YшjЬлэyїQ г:ї=c/ТИ0§ИŽщІїЦШ†ІIмb4\КeЉЫЫ‹ЕЛšmU`VЯЇпџs0Гм џ›е1 “]ЈЩc_бУиRшЩыѓуUŸq‘*CпиKЃ‚“€Ѕ&Р ф7№mi>YвМАИ>Ш^Tж›&s$f9zО<ќљ§pэИ!єГ‚lДY*гШ'р\Ш'i5Y ^V&‘ЕЮу!-YlL&zс+ŒТ0А$ 8yьž,L/ъXcWЫйdp}zpДДнJ]ькmK$ „щЎЇ‚ЎKдZДƒ(–YZ “$tіb@?Jbg1ТˆфWр3DйŽ&вЃЫKЮѕAMЂ ъš8Л;<iŽчУ`” ‘–]е%фht7fXFРЌ?т‰Yœ!Љƒ–cАcќЮа„Ск#оа…6bј-}uѕѓјi%jšЊАzАKАI(кЂІЌщСсEIL Јѓ•ююх€њ•‰1]Ођ Ў‚x„n8ќ”и _.]˜0с`Еmmе?<ИЎXŽaXЊwи9Hg™œь1Х ­ЩM’Њ=іm.‹ћрщ…цкь`pфp0M.`с№ЭсФёАGл€-ђа1Ѕё}їzJq’ШPœŠ@<Ьiъ[A’daBќр}5Дƒбr/Й‹йСГ _‰к№E|1{yшyърХpaL6;EŒ]Ѕ—g#еДЧ1 'i`єЖэvлTYšЁфšИвдїТ^1|eяЎIчf$iEˆ€єdJтЌ1Ўž+нп‰ŽK@]UШЊФЏКWkУ}&iеОУTП“(ЙЉ B‚Mцky€ЊwŸн)J2ФŽMжˆs2В%4ЮЏццnи`и,E`fwG?n8В`€‘-ЩтаЧЧv‹йˆбо~`Ь[мЌХ1šU0ІћъЮи ЃПБŒlUЕc2д iаычЁЗ Tз‘&2гЇѓŸпЏYнєIз”4б‘ЖЖф‹Фi%r•љ\qТ2ъћжОNГЮЪFблЖI=†НŽ ‚Э‚, Kж ј€Мш=~КќѕЧЃ›n’eEf(†њ“ЌВTЛШ“'­QЏй"6+\g}„•ƒЂ фџХ3"cœoJ1џ=CЗ§”ДаcMd—уўЩї‹…j:DE!#Хfћљћѓc["zRп6efі2…ЗЭСžрШ§хёЕ†lOфЫўLЖМ„иб IЋQЎiSšТ3єєњшќ•гtУ4 ]ЗНbћёёћГA#Ї|›š$PЫХl­>TІˆGп[Creh™УfŸ+й„#‚п$\@HЗB§ЙЋI,У­WНЮ+Э‹’$pМlD-)КФ?вŒ Š͘ЎXAБ`K‹2Pєоњ‘№rA˜”eъЛкєnА1hv”›-igдdХ*1%zMГЬшОзщоПMWых’–vE~фЖB=–4ЕZLfœfZИi tВп…[еAЪJL}KxОИŸБ‚$ЉFXbhIх…ЋpЫ5У ЋЇ^чю§pAБ‚jyщцуї_лФжШІžчXŠQ =Фƒ”j6іИъВж]пO‹ј0ж—Ч7ШИxјf &%oЊPуWГн‘вгыЮсУœ—4HLvUoBS[Н­%УВ€jйАъ!)~˜Жcњ?—ш ъap|лтяЛgїЏѓ#iЛSЛЖN ™]QМЂЊЪњОs1—5У&ЋJH]Пп+O—f3бєќРƒl*Кan„J4~ŸЛШhР0ЪыŒДoO€YRupУЎл[‘€Hг9%]ež:œЎY~L$БEблмQљ9ЃйažЇ)‹(лД=ЯБLuЏэо™i“‹S›ї.g2С%DВmЖp@ЈYцX“гв5іЙѓТЊ йWopGŸŸuhЪдRдd— E’e…АЂЁэyuKЗМ(KV—wуѓ^МтD=нЖOЁоЦМfХ›ЖАež iќE Фз;0h7чч ^Eе№ел:ѕLv5HI26yvлщž]ѕпцŒЕлЯЦWf§…BbLKhd=[Ўч_Г*Ч–c[ 5 ЎЮnFДЈ~ ЬЖeьyОdUš]•ЦwюеуыhМфф}ћЛ Дѕ+­N†9 ісПj‘,pй–iТ}ЎпЎЛ=@V‚F'5TМFFЩѓšЌjИ™‡W`PƒЌrэч&6ХЃъ6iТч˜ЬcЇѓ№6[~СйД@ЌЊDПєКН'’З1+АУ–46 `8 M&зч)Џш–уEх;йС”;O‰КдD†,S’§ж,OяПъЕbY–Ёђ“›юсХ`КцDшG~oj›дFЩєєюјЄУ)ЊхGiй’Ђ›меХ%Ћ9iгnЪОЪ Jщ/иОU™_яOЮŸцД ыdѓkгЯTКТ­†ЗGvxU#y ^ ќR 3ZuГ Ь7@-Mр $х‹6%OgУЇЛЫѓгЃюнŒCЭGлѕ–4ЈC]bЦ§ѓƒ?;ЌЂ‘ŽП#Yш*5eUмaƒoвМ !s_ўŽРu!аЅя›ЌкЕ—RтІ§ЫУ_ds=RbJ0œFP~q6“ьИ8`FвpœѓьnZ_яЯŽ{CVгЭ ­ъzSчd'P€PѓььцЈ3c%Y!л… aЂ`—#Ь7ЂИЎ Л^|ЩцЖнЕ`9zўrўыє•гЁ6ЛEnё"ЫmЫФ… *г^g0c!|’SІŒ1wmhВpLY•ЙК0f4ђї_іЎД9,Ыъ—єŒл–eЫкBBBH і%“„м3_юћО’\ѓчћ>\еSене3Hžˆ<ЁE˜›їнхœ—фЛИKKВ08xd$dYўB ПКе‚ЈрMƒ=юќџ[аЂŒ Ц"0І0Д€uWВтЛ-sU‰ƒvy–z*,J{ЮIВ,ƒбшž]јgPœРOБ>WMЯЗpПшаrв џJEEърq%ШfчEЄуЭ›>#CdРŸ"НпCЖ‹KРBЃ=(bТМC№Н\G“РАівЮг,бKДwћQ !dё}žылaJтЖЖ@Шˆq5YВцяžЙб$ˆ€ћ•„4'ЩWUј^‹”№†™І№я2Т ˆaj ’PБВцсKžЛhЮ!эь0M,„Јfk бЁ(H|Џxў=$–\UЁЬЩВ„vїИ2O•љсСЭt Э‰AŠг Ј% Жљ}кЪ?€QАY…’€oaХpW ›7cAB@юРшбщ§JФЗФŸтќ†‰ŒwіёТƒЇAR§,uwфтњДЗс[Š<ПМ]ТšЈPFолр н іт ц–д’—э4s"їњф–рq€иЊТДšј~јдЯaє‡ЗўAa dџ`АЕ(uJxуфŽР-а€*.єяIї–їЌwПЧ bЩтŸ™Ь鉄oH4NЁ‰ #I&:cZEqџДќ/AђрBaйЧЏЇ@’|gїдoуЌГ%xC•ЬPiя_ЄAs<Змm6ƒбКcюŒnž=вp5вюЦA>#пCe§)ІН$w;#К ИЊGѓМMЇёm,QXНпг8Š Йјu'ЈD8ŽщVН5у–œN‰ХЯаџ~ѓ$Щ‹H”№Ях[Wзsђ'є№ПХ <ї“є?cLќП3ЙB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *TЈPЁB… *ќёїЃш~Кѓ џєLЪЫ Пњї“œiњw,˜?КёЗƒb)ЉЊІ#юЇ8ЃїAќaЫџH#M7,Ы25]eцгЕњ)џJк;GŠjК~р{Жmˆу$єГ:ў ГХjwdщIуюwя^=ЛSN )†$i’DЎЉЉHAтЛ cј=–4' $аУƒЏ_Ю~}o4:88ЛэД№ы'’цeЭŽГ<‹=KSe™[Оѓ™Ёsvw|АјХСйЇЯј­ё’хйеСUыЁ‰џѓцБ7"EеMvcІ‘Ш3я}№-ЩуХЗМаA,qwє сDEт˜IћЉ}ƒ?ђјиКЙ+fјбєrў&Ууў8IбuУ “ШЙсщбјnЊ"3ю[ јС0‹оU‹гмШQЙб{|€“L1mS78ї‘@дN‡ЌЄЙЎ)Гд`0hжw'$#•yЌЭ ‚˜кЛ' ЃžІЅњybHєѕ5%a`+<={|hзыx†€ъкˆЌп‹†iшФйЗzГе3<ПKЦЩ;dфTRНРBЩ9yс"Ўнb/s–œѕ›ЕЫ ЅЂХ‘Со7(Э0”сХэhN2’nкКєN';sЊјš8эЌЌ|у+|ЗУIЂ2“Їі]эшј Œ^ЉZV:тЈбяо‚,)šхњŽЉIє;˜=GfœђтњŒоFК8ђNцВЃћЛлцхз/п l3HЯЗ‰ОlпЙЫЮ JŽч>f‘cYїцœo"h~Aбљr՘щsfЫЋ…&*qwsџиi7NО@_ зЅ'OяЛ7ы3†сqі›2‹Cb„yлж)QЕВдgŸъ+-оЎC]Эдч‡7їУ)AŽяNŽ№YќЊ­s‹Ÿtњф 'ш>žьО}.‹,KCїЧЩыo…+ыV˜ћлўzxIЊоzSЖ›63xSР№иqэў/б&З…й`иЃг—зз—ЭК(r<ѕХЗtMxГЃЊ9E›SGЅ.>є93п–QTЌs“™ЯiVyaб€˜ng+СH^ WІЦн`џѕЫїзчu–ey№:ІБЧ™нРXжt7]Ч&šŸ~i’jМ-ƒdНЮ}EЮo˜Oп^м>ѕGў-'—jАy}§ўђВ-rАЙ\Ydiњ[MhЃ§Ќ 5irђё№А>CСv“Аъ‰яиРž=h0wчpuГЩp8чээы:ё ;(^žŸ_П‡)ёпІЬC[WоhF…ЇДdО*vП|ќ\ыб:dbžЇQGaм9@мЊy „Šч’`ДтѕeН.ё|я"/7//ыЭцљOмЬcпаї;ћП1‡†9Ъъњ№гхˆSмrЛЦд”8:NФ.nЮ‡ЌЌшšЂЈЮњe“=§e ѕй г"л\fјІЉБoTљx3JmixђёtШ+vКнрqбK–DYѓ’@bЩЋѓ1/[QЎЯЗЏ›bћ§ej+ КИуaјJ–э€ “оЦhJsуРЄ›‡Ч 2’ѕ&ГEb4хЕb%+ dŽИКœŠ((ёhлЭіeЛOg&зoAЪ€<зT<њG”`%o3 гн0rфСЩ—л…Ќыmщ!ВлŸ3Я Ш C…#ыЕ9/{Qš6L7лз—з—XeюЯъУ9ЕZ.)b>›Ьˆ- щ-Ц18r]eж8Оž‰ЊoЗЉЮєŸHA35Ќ "HФEу|Ь!bZ$HT0z(tыјшлyэцююіК~yеhдыЗ=ђMЦЅ0ЊnšЪВuRѓ ДцэкWˆЮL4ќ(|7ˆC…_дO{Д(pЬŠœ’SООМl<•yыў $У­f'Ї]VеlX{<–{Шš!0Š4Kт$в„EэkГO’ГСуэеgп_žK(7w_Пœ5Z^янŒ'dЭ ˆ‹ŸQjT”IЇxрИ*PЕЧѕnПзЙЛ<ЙчСшз—ЬBѓЋЃуыЇ9#+2ЯМгVТИ^Д~о&ІШ*>p(№\ЧƒxWѕЧЭ1Б fНыkПМnCыœžЖцМ†?bщѕVJ8мŠœMЧАьgѕ ЇXaБ-Я4ƒ|“КuE ЫЫПдHYQU$Œi+{}Э,yж8oSњKДЃx2Г п`іd%ыІaъЊ†иQуьn.^ўМ)ЁƒчeaKєŠf†ƒœžќgSаMч†HВV ŽV™N­ЕPэ ЪЪuXІ†њу№8еДзѓ  ~pyоЁЅиЌ[$=ъѕЇфœ\ЎGЎнёЮ‚RўМіЊѓ@";Hђѕv›ЖeкЖуXњž гJ6зїCрD‘ЋгїчзOŒъЯ›эІ,ЫHЅkЇWэvЋлiе>~ђьДLЁН[ƒd 8шЄYY‚xYЇ!tј8‰=лB{эˆ’n9рцqф љmэz"ъ!М.Ы-tщYѓЫз‹‹ѓкљёзŽo†+Њ8ќпg`ўј–$ Зр ИJ Mх8uоціg3ЉŽBџуЌH}SžпзлKХ…p.ЫbНTn\;ОКh7ЯПќѕузЫЮ\Ф§тўЪ4I€t‰NгпРЛЯ›uЙЖЩяЭhV5Н(>Di ыk)дунDВ“ЂРZЄЬ\•~МаCtЯ?|ќzб!+л>ѕЯnРоѕ&OBЧіS< ~НоЎw—A†ьMtёšхЅy=/NѓД€/3x‚RТЂHc<tкђ’рUM•Ww?_iфf Пз;уВ4ŠBGh $:]фEЙ~њХБі•@.ь8‹ТA„xРђ2Ќš4PКы2vtшВЉнOŸ/к AѓРш.3 =PБК&.žœaЪ РWW‚—‰cK{2š„к‘DТ/ƒ(Щђ,I цЁХQШI %‚š`ЫврѓбЭЧЂН,“РƒЂ,ђ<ЧвфУеXВu‰х™Ї/кC#.bЫVїД•АTM?vЙ Х#Кžaи>˜  uQЏ'коЮШ№††ЅШO—И)О&М™Д˜NŒ rУ6mу.šч‘g OJ'Ў‹іЄЩiЭB‡МО-Žчiš“tB9ї-Кё(AC/№šGОЃ!цю?>Ё#PTВРDx мR2\ЧE„рЕЪта1Ѕщѕз–шeЉkЃ=yšж]`Ы‹ѓo7Нщl6єг•dxT‘ўiOБ"Ш,œZ:’˜ўй‡cB3–ФзЫЊхњ!0%Ap‚8lS•нЋууGЉoЋ{’фЌю„ОK]œЕG PK“AЇн%xЄыйȘыN’ч9xUђЉіщЏч+Ыі3Ј„%іОч‚š№ Ф™žчXšШ,&НvуfnQшj{ЊyЂщЎ5nєYХ:‡„еЄл›R,єСo-оt30:ДDšЕkG‡Ÿkœei–у}ш'q'Y{ЎLpКЁ‰є’fX–!Сinюi+Rv<зх:}біСqЎkЊАœMЇЃжЩЩHБАW3-g“СУѕйЗуsкЖНŠcЙымЛ$ЃЁ; y†fDнt\ˆы%ЙžЛЇž8QРhuдх`ЁиpЧЖЯjЕ…щ Й'­–,ЧѕГГ™nйž•БРни DМядmkВdeг Ђ(}Ž”шиЦ~ŒžЋŽЃЯ;ЄщУзAГЋ§_IъУ%e;!DBЊŠ%8ѕxѕэQTнА?.7аЖЁ6–РщЄIgЬТК@=Ч’2 }9уue?їљЊЅ/юGО.о Чд ю{6й$,'BoФў7ta|stо[ю&зBŠ‚еE]0ё z Ы‡Ы†ИС”%+в цЭжhщљБ7ф‡ƒVГ'˜ Н1$Pћ-їŠ"/ќ7ФцЫ‹'^жt‘ё|НЄ‚/ ДЪ>7ыЇЧЬЇЃлVo(HЖƒщjѓКЪ\Ђ=оu8~4ь>uлq` cп"шMзѓxф§0кRяїЯmV$нIi№Ѕы/ГБЅКэNmпœ2пъ=ICрУ^4)–ыѕrFЗ:]6Х‘F0ќ ЬB‹шoКAое€юy6jзл,ЫЋd6У`/fБmˆь€КВ№Tc.;:&[q ™{ѓКžG6;#гѓъsЩФр]kCќ–6CNt}0"p,ых№јЎ+jšAќ| тbБ˜Ž-C !Cяе™{ž`˜КTaГѕfЩврњ  @lC‘u“Т!ј­7š!7ёиw,­qpУtcyœ3ƒЎ˜ED“ЙЏcz}Ѓ1ФКМДœC2!Івэыєљ€”ьілnyў<=гD<ШђeъcдˆpKœРї]‚пщIЪЮЇљќшюE21„ЬїT–ѓщŠа­Ÿ2O1н(Ѕ;F2sнц$нДmЧЦшНJф8jєYWцЁЅuXGѓEъiь-ѓ(›2тМБЪœдŸP~‹яvшДЯвсКЁњ“аFќƒ€СшВH!э…i*&іЁњЪ2/DцђЁнТ|$†іЮRЖ лђ|аCzЛFћyQ@щb™Я4$У„2ъ/H–˜e}AжTUзwužўЇєAчћ й Љq>DФMfy:M кЂ!ъФцщlтйфEа гдUён2ј?`!B8єL‚p_ыˆ0Аyь@gn“.жdйиБЈфgU„ dˆoИUёПЄ‡АeY Є—Fj'Щrњ@-˜њ–.IŠпЂB”з ­їў63Œ†1&б%„ЁЈ#Іг,2dЎ^T“ИС$q,,е( рcъ{?ЮМEРРрЋЊІгMЖБк”Љнё†ŠМq'PыІЁЗ h4)2‘I`Dќ,mЄ1Ьх/Шrќ§†i†Ў~€— P†&ЁF›P›hєщ'Ю"‹nHœ0ЌіldАЧрг|рƒMп† Md9^1IE ­І.ї™Њ’lZ\]Се)К*ЃюЛЁ§H,-СЁLmОcUњь8FЪ=чЎ*ТЛЧшПTUџ\N„ТŠЪ8щ‹oЬE"8:к.‚ѕјѕўvјз;IъбW‡U m}чуŒ№ПƒЇўАщы3z :ЬPщR~NІ"p№ыаЏЊ"‹’Ђ|№ќSР?Ls{Ью~}lЗј/FšЖуЧиџ/xїITTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTќП€6ЭІrяіVђŸ1ќЩЛ)9й ˜vqd˜чїњJ^ўчNeЖ/hЧзѓ<зќ/qўџ­A }ђі йŽчгнЎƒоџНфџ ?m‡јЂйќы{/šѕУЖ\/JтаЗ-$ ?Ц[89Y7MЬо;Нќы›Їз}щЧ+cВiЙу$ŽЧТ2џ\„5№YЉцѓ—}јFŸ%Ё_ПlЖюЖЈе:m8щЛ–!qЛъiі`%е€q Cл™НпN˜!m”ЂЉТC­q{M?бi5ЎЏЛШі}Ч6љнДЛћЯpДё &n’ЧD~mŠ&эщЃЉЃЧЛћ›[†щЊК.Н\е8фИ6я/NŽ~ќшрн^зЊaл"H'у"wєсб Їу`ьcMь6ŸюЏР=$ЫіlхљфN&Žƒ;Ч{Чч5јЙэнеГEкеыМъЯfž9:Л‘Q'Ž.єяыѕ‹:„jьMЬ_u4Bд‡Н#кŽU3‘6Мз› Чї,sиœщ<0…Ћ†Jв™ЇѓЯѕГГкхХ эKшУMPž.ЌЂБW'Я’БхyбјїБZБ§Б‡Ећы‘•Ё)55o61Ыгу§§“Г+H1иŸ/bЬпеš=ющЂЉкŽыqь{.RпЃ+лаvЧcЫ]InЖˆ-ЕлеТ"ЏЎыѕЫУУЃSкїРЩW3_ямд[7WCл Т(eлќHднП`ИсФУЪэ—еЭW™‰L2Фо7ЛЖwvpr[сl™ЙRЋ~s{vЇЛ~:+WЫ< М №СьнІšžФЖёrјљFvВѕ"ѕ+,&зa%EㄇУcЊA‚Y™XBЋqu|g8уђѕћы"іќ`л•кAЛьЏ4P7J"нќўхJАтеz•'YQЦІШC~Ašк?Ѓ,/›QЙLlБ{zЋл“ѕї?6ГШuƒ(Š“аuwиЪЊЏZn@{јєО|>щh^їœі žиІiнб5ўт„an;Н>гЭ"u4іЁЉЛљїяпзГˆіŽкыи&вЎŒц‰ыMІ!бї>оЋѓVЖZЄг’іИѓЁЉ WргэAяЅЇИХы"ˆ,№ŽззЭ2A_ё$Ёэ’ѕ]ѕ•йnOKЉљќљЫ%G&ыХl>ЫВ,$ižGŒоg8ES†§Ъ^7Ћb„“bН^­7kк–p'“4ЅнД•7яrќ'†dЙO†ЇŸ>}={’мщВœІ! _„уt–`UИмбЁJ.iC;N/VpiљlО\—yžЇ)\b€ілUфу,?KдкћэK­Ї„ЖGЗuт†nZa:!š\;фі#p—Єx}х›я›?9сd:+fSАz2Ѓ]gWёКkYbKЕп~ПшыіИXЬB,М<П€be+šиКT;"’ГYQ.зЏЫrГYЏS[|"з&)TQрћžу8ЦŽЊСOBєr№хЂЋШeLЄЇыњcЛнzсMoтътЭ…`Zщ|fƒеkАyГЃ~эІ+ФВ-‹аЦFІ‰Lm7Fь`5NjmћI>Эѓ$ NwА&96KŽ„ћуZOїЦ “ђФїiЋраFВЊ›*{ќЗsСvAzІ OЏb">_о€$'9$ѕ9mIGОїіmeУ‚ЁŒ ;[Ѓ›Ѓ:gИЩ|Й(Ігй|Nѓн#”лЂ ‹bыл/-Х‚”8іˆ“Ў6…ЏїюяІчгљrЕY–ѓ9фђdolГˆ\p€ NГI€К'ЧЭђг’v/Ы2w„ЧЫгкCЛеn?žџіЗНZOѕВВШ’lБІЅ"ЧЪ$LђrNлгЏ№seY$Q€пTчѕ лs]ЫњбьZižœ? иЫЉЩѓљмƒ8ќzTЛИ8;йћхзƒыбJ &мкXФЎхD“Fy1/—0вД<ЈУd9oОџЮо•(7r#йњ“ѕиžnЗZ­ћ (Q$%ŠwБю д}WБRЧ|ў&dkf#lЏwgƒRGlНuЈЉЖ•/пK ћ~8иђји]ѕўт|(’ИЋrГ…BШ]}9МЙэuŽ>џ№ѓЩ=ЏYщіqћјєєŠИB†d*Ъfћм@FСЖM™%ЁНCQ,pIYт:^TТyЦќК •ЃЂГj]oЈ„“Ы!ЏШ\џы|КXшФI70жлGzU§ы №™gGљœ@QmЖ›ІоTiфЊЛ Z‡t.Šu1ќЦ: ,aЪтДо–Iѕv“8 HSз!мљп>_ –Эуfлд5ФW—E–Х ?еЯ›Ђ(ыj…eГŽМн-mЌL/Юѓu]IšчрЏ zЧзM•:*Ž HыФЫЙФшџИз—р=ТhB^dДт„Р•–Сн8 • ј€jŠЏзБoюl.JФO2пMР)хY^RW˜g4-RO|P ЯСквŠXиМћibxaZ5uyˆgCSd‰Ÿпœн›!uю0 внн| еig#­;aiМщzQFд – ЭTАкƒ+бK @аќы,ѓ-4јёлŠ€’^Щ<,ГѓЩxВр%…v–~Z=Т4(ВШхЯК$+яЌёЋЛQт/nцВfыа „НЄ„K|љЌЃЙ ˜`^­Г8tˆrѕУЁт8фy г“ їs™ИPgBєп%0џ†_Ю H`wщЁћaф?\оЯž[NЇѓЅ„§ЄШђ№m@ќДю+ѓиГ:ўіУ™с{Л›R–(‚Є[aš'Ilˆ6tF›^~9ЈѕdgœЇyaфо=МyXВ‹ё wнН[iФu0w~АpТЂЎ!ЇЫT…‡гŸМB} FПЬтРЇd …4N]Aѓкй6юсњєxьDрнvжhвн0жЏo—ВІЫ<;НПНЮEUY^}Йд€КHЋТЌєщчПwPх`Ц›эІZН Л,‹8іиЉŠЎHŠ" ќb0’ќ$іvег›™ОяЬЮћВ§w-Єˆ+ъMЧнЏћc'Ь`TЋˆѓё№њшЫзЏz&ХК†ЄyЄEl9LО8ВЧр€I5hЗ:єДхB’м•жхa­ЎnФ ISУ№ЎgC.ŒЛ'|@opпT!тYž_=\žŸѓžeh:аTгAёЋйѕсхp~2іNг8q„ OЏŸоQа@Xз—K7Ёm8њћb˜Vq˜ЋІ%MiЧФЖmЁХэщўYtYˆ” ьXІЁХоMi П‹ВЊJ(;.лŸьn f1ыŸ0 yMГЈ ъ\FіУ)„YIЩ# с#Зm|єїГЙjš„ŒТг>‡Ч-”eК2Ѓ4ЭЉj‚ЪN8&Л ј zœdeIk№ыьЂ"> W'/H }ррЕШq{ќг^wТ‹ŠЂ 7Ї"До>FqХ‰Rxз@+еым„lЧ{WVA–бЙEƒ†™UB)‰|uмЗ|jqjt=ЧЯ?}Л/8Q4'ЃJЏ†д‰‡0$:dh’Ьї`ЊцI„wѓ%PЭ`J•NŒ№яŸ‰Pл3ZJЊ’j KКмЛсT“^ыэФPЕЗOPџ5ЄOFєџЖ:ˆь ефяtщ…ЕЃЌкPЦm.–YшYвэЗƒb{ёšОAИ6fЯŽчІ@ю€н<=о‡‘ vВ~жelЫеYшяд& ^$Q&>вФpXфšмА{vqЏX uSgЁ‘<:К3юЧi^ж0ЬOЯдО€QyЄЁ?>СП"с@|Eiјж.Лj.o…„]˜TŠRКћЅГ^‡іђжPBbЧTХщХ— о"­.ы–ЦM§Ы–ŽyCŒйл>дHпкЅЕ5шЇFО1h~ю….[ФчОпу­Haэc]˜^э}Ор`Є ]ђ|~yкVyr–Ю Км"Œцœ[шКц.[дttъЧ|ИсHЧŠђE™Cyєф GЂЂЊ Чд–§ЃЯ_Яц"Šiщ„ №єђђ—&ё7~O“jМўjyшЛ.оeŸIѕшд <ВьЉaЄьзPFžaИЩКj )гЮочУSFТ”<РВhи/щђEщbЎйЖM ‰НАШёCпwvєЪіASžЇоѕ–†хН– HйMв? „ReяЯП|њvФ€/зuMц9^% ѕKщš2Ч‹ВЊЉтb2Яь‚/№,sЇkEЊCзн<,КЬRС .h’ы‚жЯЉ],BKчЇ_?§rРоLYn5ŸL—’=§FкГдiДрx~оLW Ж]з…њЉэt›ЭLЗп<[ю3W3Aж2ЌЄy"kШя*uMey{vДїЫ!Гwд{X,YNAФŽ7ДЫицтЊ7š/—“о-нВs’Уиqы”GИЯ'њЕ3˜ђ’,ыNA‹ЧfњЪДЪOяzWЇћЧЬбѕBвЭa?Ш6@ykп2йЛЙЈƒka'Ќfgз!њŽm'šѓКќg ЬосioЪЎxеЪiСл>6Љ‹n1ŸЯЇwччLgЂcb;~&IўјђМЭ!{—c‘ИЄМ’LЫВЫТ;_дзl‚Ж }к›KŠf`НЁ­ЏM•8КДœЮyEUИлKІУlQB” кЭK\ЌЮYј?DqрbETMШ яz FЖ]‚FsfПЧ#ШЩ0)AIаNbьhтr2у5к`˜t˜у… eКЈЋІYW//л"А ~!š^”yш`№‰р6Hv3#ЈЮЎКЌУaЧЇšэёySEXšА˜-Eуuhжaю5ф@аьЭуЫvй†0gU Šћ:O|лвWу‡щјЏчџ=hJSŽпMлM ’ƒА(CШrS]Эg+…š,г+цќ†гLˆjxѓєRG–ЦMf" ~ еїыоk7ŒДэдвё„.}RйжФiЊЬŽЧ+ 1кСЦьš9?ЌdнŽ+JЯЉЅБƒ[VЇћФ@[яЕнž3Љ™ЂпIŽуЅѕу3XП)<;І2&^’Ѕжц]цлощpЦA5м‚РлHœѕdEлHEY|Џ…œi‘_WD4эJгЏСЯ†З#й^К^C…бч(.чзУ™lF›чЇ—M`ŠН“TQo]чVиёћmђ]ЈІёы.hйq]0†дe—Бo’ ƒ<ЕŽ,SŸž3УщtВIJ]6!жfнš>љІŠ\K~јNў­шŠ@~aœНЎЃTYф†П-†bЄо0cI` Ц…ю3•бЈ9ШšMс;ф]7@ОY#’_”в ЁD7E.ЦНL=‚ ЎsШˆD‡Bщy|~j ЃХH6m0uйіћmЩћ/р0н_—а˜ ЈЧцЕ‡Дi(3(ќнС>Ѓ" ?/С_б—cреJ7 Кˆ@QDаSѓ-hj›uQ”Д›‘XHF'ŸОв Н” зЇэ:  ХЩНьВ^W™oYЛ__ў#ШЬD№|лЈъ‹cуu„Їь{==єз4]з4Y€jЦФЖ PѓN˜™JP}єК—~іLCŠЉ š*KЧ‚|2‰у"‚|8лKFх6х_˜}7‡!V’ЂJh*РPл6ІЯYœ}cшŽkdbЌOбОaО\О5ЁNb4{рkЁшЁїzдщпХLЇA#є1|M wЁ}|хўя!!Lа+]tсkК’ažОлC‡џ.8Э Єпѕщ j_ОЛs_~КNјнЉѓ—Є|FЋE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбЂE‹-ZДhбтџ%xEQUхћъіп^ыЮMћmЄgє–M3VоыBГП„Јы†‰ѕУќ|HЯцe&кХ@жпЮЧюŽгВ !ъїrœѓJR‘iЙ6‚dјщьaЙ\ Ђ$0ЇїЃњѓХ”щ^мђ!ІОК=џшp)xMгT{iŒѕГ7’‘‰ M•˜ГЃ‹ЮМ%г4uЖwж[iІ)няџіпЭ—wЕd`SDф—Ѕƒ–Ь)ЌРУКЪ2чЇg—0вє*V-Кg§…ЌЬ/>џђkШЋљlљЧєИ{ЌшЙукtІyUcsцZ'Qb•0зНNg@я=№ŠиVЇЮp>П§іљŒсTz„ЖДњАУе5BNП(юКЂAїuЋ(]И;aЎ‡W!А5іЊ*@ТнUЗп;л;™iФq\пСњG Д4=КUэт5ш ђъ уыцЂsq ќЧoНЭ}9ш^ž|Л3ЧвЬЗуc{цˆы9XНљzЇЛеЦCм˜CQуЩ‹‡ё„щ@NO +оl[™ЛgћЧœы…yе”‘ML„Œї/ы3УuщХАП< ЏyLlЄщNQY"ЫIВ )rаa˜ОЄ[щv›Xђw]M$ЫšŸrvv™e№„B^jЙіОКЋНЗ2p§Эb_Юy8q_Ў43Ё P*;ѓ3•EеОlВ&Žыэ6Х /щ:вЅ#g{Ц›–m!юэє|ЄZй6ї-л‰ЋЬфYQ–%‘n_?œœ<—‚‘ю+ˆzёqїФšvОћкOCq†Ё G…>VУЖkЊгЦ)”‡™lы"ŽђЊNЄщ‚сGww''oУЩœsъЯм7Єeћe…œrџU{ъzЩЪ›иPХ# ж•b˜ŽeHячЇgЏkЭ+wл<напѓSч7РшдlКдуЯ}йђ|АBсіыkASkA5ОЏJ?тэlТїUJ§№ѓЏгл!Г]U‘Ѕi’Фqф(вњљќdЮ ьb)z›Џ]иКЈљХччч>Е$†…Њ6Mга…унƒ'cлw uvљчщ_П:,.vežЦОыaЦБ §ёз‰ЄЊšШ‰V§ЕЏъ<уjП­ЗŸ›„мQC. ЕL$Џ>xlЎ!uЯў:={˜HnЕ+#зPdѕћv0пг%цёbЊjІmcьзŸU\}юvћЏm†iЕ)"ЯБЁsmЃуUѕ;‘Ћ3Mˆљy*@#BбЊыЩhО\,9Эі ™}КYъШ‰г4Ћv_u\|юwћmŒEб№в<#Q;И…uўX2Г\пб&^>Яe3Ќъа—oЭчNЗгЁDф™2ї|GkF\VUНнэЖлнз~Л+qєБж,?< cAYыG3akЈi›{§ћЊН„˜ЫM†ЅХыuуЅгnНŒDЭ6dЎеdU#ЮГ8ЩЋэіѓОіћ]bђяіJж‰ЯUIіx5­ки–{—з=Z<я*_]ЗЎŸњѓѕzж0 † лOДыZH7мtѓѕЕп}юCC\]МŒ—Ћѕr19оеЬџ,ЩDтЈqѓСi†WьЖ$ƒз”ЈщšТ,Xе4юѕn)ЋКЬ­цДъdŸєЖLљ7ZЎЩzоП;os:vгЊ.\mйhLedЙ.VQ%&іхЂПfйеИѓ:рPД§њмm ЋПн'.uУ‹P"Ќ nКЂщЇyК@ЯTЙЇПю?&у~Лyћ8зƒэўsП)<,іЎўќuїжŸЬWєoЙ8LD8ˆCЈ[{}\шnĘЧОэљІЦ5œ7?Ц“aїЙ1д€їл2ВtњхзЏлЇЋ˜–уb…?hнŠ"Œˆ<ШnV—I'‘чћHeюџИь1ВЊˆ‹—ŽтзРфБmН›ЫцЧ\q€8Ѓ8pёбіЪЦгЩlшЭєаљQXеОѓаVНЉтƒЪѓ @™$–Иb ljЫћ?Ў({iЙЉ€33‚pUš/p”йDtВmfY!МрyIX‡Ќœa˜fr`РFЎЅШf\О MR&@ иёА&Д hнsвjЎуƒ <Ч2uiе{+^^ЇžPKJ˜„ЎvР e€ ›И‘@.ЏЊўMвЊ mІ5A€#U™„Q;HyџѓŽ6œ0‡ŸБ‘,ЩВ"В Н^NоюZœWл" *­ЩЬ #W;œ ™*`‘d6Žт4/J‚uЉƒ>SЭџ”@ ЂIюќй-'Њ6UŒЅхx< У Е˜М7{К—жЄРшз–Ў~Ш ]M1в1KиK ь"Дљ‡{iЖ,‰|ёЯr:Z4ЮнЩrIMяянбJ2, ­юЏчІCаєЈ&БЃцЯmфx ш"рlЛPU€<БЛšШ64]™qЋqгmЧ8 Л] lчњъМр’šєкЏЯ/sVрч­ЫЩђ2‚Ž&вгїЦйщiKГ W$§i'АВ №мgкCF9–ч™5юМ%S=`аГљ№ўђy*‘;_%f1цOч“—‹ЋБщ9ДЁиiПѓt§ ќЋъ8Dh”пЬR€?Ш uОГz|ьSkN1ˆ№ТТфc@s‡о›#/ пs0в4U Љ^ѓђžЩ=•ІЈйИѓ№иxрPG)H‘hЊЂL_очv‚*`Ш8‚ы„)`>YžmА§ЛжѕТЌЈЫРP„4~дОЙžщHп“фG]€а:ђ,К;`M03Э \=ЕђНХУћ!рцžkзi8п[tвртчлZе‘iŠЉ!h Ч:yJфbCъ\4ЧkAR ‡ХІоlЋz Z:rН(IЁО7UтjЌhК4>lU+@)р–eљ)Ik8†0zИКn-4Ы‹?ВjР@BЛ1 лZ@њƒUaНнTпˆ€w 2KZp†э7v#С№}JОЩ І—A g‘ЃВ“їЗЇцЅZ`E@|Dށдхгув‚cb]ъэŽNмзїЗ*ё,тЖ,Ч:шUНsВЕ іˆћ L'"–6R%nўўјКBv йO\Sзјоus К*Ьл‰qй”›ФN˜†DИ&=хQыэФ9і<пЕѕдзэ ЕEi#Ої8T­$Ж*ЯЯ›kл€l3yяїлz2_b Ї}6klg м oѕќ.йd7€Œс@PјŽ%є‡В+†ІІp§›Ћ&ЫїƒqmЧЯvŸћ§ЎђLdк>йрёрЃгн.Ћ™ъaGЗМщXыЋїЗ%ˆ8Ђ- ЛB Дъ‚NЮ]ЄЩЫжеЭн;g яYЁРKVЖƒLЇX•$ECи™Ї0Ѓvt#™Л6ш…FŽЋ™ђЄuТ 0_Рйі ќlZ~œш •ЇžЮЮoД@\жrF1ЊWCІ!haЕ 9IU$–ОПЯDdgJ>HСШ№аБAЗOњ№_„ЄXК ‹ШвUІњѓњцЁ;[ьї ЩЬ!шьтЌнбм<ЬUе РfIW ёSхЈМ6фљpLQG™w16 ёффќC@ІФДaJŒ“gЉмr:Yp*вtЁћєє<‰ЄхfS]šРpВ–M7IkЦA%ЧЌ•Œtвѓ@#УŽˆ•кфЎЁƒ_”Yj<^ Њ‘. __ž?8 ќиьъМ:4dz:Є8нђ“$7ШЊЃM)^њ>žлQ ƒlЪоŒt‘cz5эW"™ŒQ­ћЦыŒп?Sцѕ6СђВџж[IШŠRИQ–ФЃMфІ4ѓ­й€"~њэY} r<єк”ЈNрcЄЌп./KFд8ЪzWК0n6Œ‚œ$#(Г\xlёя‹њчН&а…Є5B[e&§іллˆе `гЋ нКЙяNцkAЦ`wŸЕФЩCsТ+К“цPоПхД§t™mе›2ѕmSсжЫЏn ж„оъѕБGѓ/Љ6q[$г г}šђ*Вг2v@ПќŽ !г^JМHьйфЫ•ƒ{еiќиYШšІVX‘ 7‰ЉAЁO[œ$OAЄ;ў=h{I> $–5B?Œу\€ ‰fлw=илqЃВ. ‚zЖЎ­Z№эБ‹бA-џmЉ&@„)јЈM †•lPWЙ5…Ÿ4ЎВЊ;QіІ.‰/st~ ?~Xџ-з ˜исїœ-›џхшВИxљћМ/Уыэm .ж$.ЌC)`]ТШЧК.ќпoёџПцпE§Яv@ ™гTќV•:šФŒ›?/<М@DіІŽ,А,’ШŽ†ф\KƒкгЕпѓ'F„ЦЩЋЈ2п”Žad“ У‘Ь/>W'ш%—LъrKeišЅg§…‚p˜ФBКrќГd-4ƒoЩ РIЂG­њcїѕЕ} ?\ЖŒNћ^чљj^щH B мU%kлХuуЫ+ЊaЈќДгl<>>|пhU&ГљI_АNђьгWOSU: ŠуЋ'џЁйl=V*ŒЄО)Гѓ—ЦУэхЇ ~У:њ!~'ТŠЙeЅ:Ќ,VјчЪ@PуXш^Ѕвym?v!DIГаDфЄпК§ќЉ2FšЎ›Іvš1ƒя1‹Hтg•ъB‚ eО]™‹F*<9€ Лѕ:Шп\дЂ"ѓt‘™їыŸ+œІлnшШсIЦJLE•™—J”ЌuЊ1н>#{…‡8š˜Нvъ7<йй6ѕ ™]ю/њ’nЧEюЉвЊ2!N!!ЄA/k•&-ЛлТф–ДlЅ…' <ЯвГіх ауyЩHўnŸІЬ-л7}Iu‹}с(TЏ2!b~ьlSЂЂЈТ№Кв ЇијšЂ:ё:‡5X‹єјю $яeКЂеьoŽzTяёЊЗочІ8nтyLMwеœ—UEІ?WЄleлФsНdГЩcЯѓm™чШжuxЛXМЛћЖNK%^њŒтmп2ƒыоWК3šъЈъЧIxтзьцcх~Ьk˜›<Ыв4 Meњїїpd,MrFіmП]Ч6Z.x+ля3“д*э1СЩˆ;ІŒ,DYWeЁwў{хЊKЫоfЗ)Š, ƒ№}иЄzZН­А’$  тпоŠѕ:В5ЭI7ћo_ЁF•юhХ"„˜#:BТЃe˜цЧп+_žHйпяŠ$АUEбLЫv-Uр—ЕыЁ *†Іййл.NіЛюšЁё„qOъї‘EdЊpXКТд{ u'1ЖIЕНР‡ hъа_ѕ:4ЯHтЬШw%й‡ Jj`‡щ„Aр™КхРŠРq‚ЌLтўI„МЎ‹8c8сщC1 tj‰Ф‚y–$–УЇ››‰цЇ У:ŸYЎ%TѕDCх%H[xP‡Aшв$ЫŠФ’{]шђЌxпCА4ЁѕсI2нxГM]yўмކУс`№:xnмTI3LГ4‚3ц(э:g›в!щ1сђu Ьv\Яѓ|?LђužuГдь$Ы‹,fХPик‡ JКофЁЩО>Е[VoВb8fжy\™^”ФQшлъђіjЌш‡Э4Aѕnš3ZdY‘$Щ†Х-uП<‰І›B‰ ГtE_ўіЂ[^#ё,™bжƒчYдЫйŽcлІ.Џк_ЯšЄt”Бs‚Ђˆе|6R`Ly~ѓuЂ9а%Ђ-qєЈњћџ<Ћ6^ˆј3ЯЖLЫV…Ёи‹Ч!'ЩŠ, dПq{qг'3]s4›ћ/эжг`IУќкфM'.жydƒщ›<пž}ќд‘MXЌЎ<1Ќ]8ОžЫжя_ІK‚dЈХјxCМч ЯгФd№вiwњущk§ЫХXЗ}умS™ЩsѓўЫйеХ“ %0O%жgІ.Э’аwљЦus0Џ­iК&i‹‰V,зХFoE/Цƒжѕљу:^™vЅешЕџвИ­]еx мдСт{]IsшkЯ1—ЭЧ м Ђ4пц3gН д pЩЃњEХz \№U 5Пь6П\.uгvќ0NзИІt c НіLВ|А  6”ШƒЧL™яєŒј{Žм_/n(/}— Xs†Ў2нѓOЯ,Р0-pM[Ј: %myі<ЮP&Фн™qр§обыBіЃ8IpлG~ркИјЋ‹)я(Я™EчšВК§pе%8Єї‹эz—G№њ~4цЌ Фšž–Я–|и ЁkЇ  |‰#HЌ!O.Я;ШЖ}Шe‘giь[ЊЦЕ>~Кыу;=xХЭжљ6ѕRhБ[ЁРќ‡vP!є”šeYњЁЛњэ7w f o*нЙ8ЛKКхЧљї2nkКјђѕВ=&XŽ—MќЃлm$Щcп1lxžo6‰ЇгаD|SХТp№"ДUУ‹qZАаc]]6 ћГ§ЌР'>T…юЭ%с<К!юМ7аl i)RPЬoW]LEМi|р}кt\X|)š^К5pu‘ѕ_ъїѕЏлxg =CUщЧћ‘lXއэЩfЛлцл§n‡л8‚ww gIžOyЭаЕgš6Р6Ъф™‚ЖўtКІ*ЫќВї№ С UQUфщэ§B3ЁКЄИ(ЎзyAoЁЦЛьа2ТŠum4€ТЈшРfЉXЖЉбЭћЙiyИЪРШƒЪ)м кц4№LјВВЂ№/зЕ4ЖЎ„`b7лэллnЙЎџо}xЫУ`zC‚|t,h††еысћўХ{k ЮzЎпЁt2иš*3­ыњTŸ Р2 ;йьїoЛЬ’eUЗB8KC5ћЌЄЊVOH*b­л Ѓ_ёЙ‡Ž ЋœЮN2%Ж*‹ЋЦеCŸ…5UтŠ7“§лл&дDŽb%Э˜ ?oзŒЄ*мСMСђ<ѕZХ97]|н0С‹V•Žˆ[žEІŒ„љнчлц˜сD‘!Ц§СJrЧ~Њˆућ‡d ёдЄ]{œА’,xcJВ ОзgЪIŠnš†хЇ›э&\ О+ж‰ЋЫˆю_žнм5Sb1ьЕŸ&œс‹[Ж&Œ_РсёГшея}BЄЃ\K„\Sрqъ‚с‘чU7птэ ЈЭ@•аV7mœ}КЏ]нД_{Яƒёd4Ї%дcїьysкм’‡љ0“ФБу}ЦfG Ё]:кї]œмO?}№;UѓnїЮš@ІJџС”ЋеєщўЕtЄЕ:У9{kž_wчŒ(fŸ xG„ўшЌй›,h†Y‹FКХB'ЈгšФ-_oОž€бwЏSbБDуdЛ|пmRШ‹NŒžлwї}’сиПо6љ )ЊђЊб8НМl fsb%˜IЕйŸўТЛ TžЁЦэыoЇЗWпzp|Hз‘&C_ьvUb*йг‚ ђфKыyИX-s™ _rƒ0<НjН’ /)šŸугuјЄ‡g(мb6zэЕoЯяonІ‚ЂштЋ2š_ю6E`ъТlDJК o­‡O№Чb2фj:W0К9сшe7„Ж0>ГHwмЗІŽ*ђјBнюx!ЈHUиСгC{)*Івy“ХљІŠL…]ŒоfЌjњPŒЌv7fЄш†—ТђЫ}]\’‹хrAŒњЃ…€t )бОmМˆ,?­6iВ…$­АФлsŸ…’жЬс/5S†a…аЋцPNDтm0Ки$еp\]‘—н›6С Вb№4(Іи˜З‡жлJBvš їѓћй?Гвu+кZš@ ћніSgЪ#У }S‘h ЯKЊ0нНo#Cfw­ёZRэ80бQі€гšžо€бБoыŠРSbЩ+†'>іtЇЗ”LД8yЙн€&ЉVsТШШ†№аф#ьCh,Сh/Эѓ к'h AЊ†УтеђЁНй”ЁЅ№GHЩ0@x U>в$о,'JаvHdir>eT;+"[йYѓВБ–qјFPР-•],šЭ@wиЖ‰хч_\ўkHY3-Чbпвe–іžІ" АпU™о6(,Lэ(/B$.fsŠhХt  ж`ЅЧfМ‡Z‘щŠГ4яFTЂ%аeѕдааLщ^^њŠ@'ѓљ”VtЫql ЉЧrtcП…Ўу‹ИŽЉƒеWAЖaiFІЊp§FcМZѓЂoBU оFдšЙbСG5ш"f3ЈTQE†aЛО‡KЧы '[Y‘RљзFуqМ`Xйп$šВIеLЏBЄGН?‡€ZЁAО†,, o}N1ГMъ™ŠТtЋЮ„b%ЇЪtU˜ОB§6]WUщˆ7`(№Еnљ‘ѕЎ1ЋиF–*АГЧFуЁ;$ж`tщ eё:— !hўИ7AКљi8ЋЉыЦDRЂ t™_єюW‚ц%=Њ _GТИAIВЊi ЕљЃУпБА–ƒ0ž7(yxЏ >ѓq - ПВв2Ѓ]ьŠ“№Vо_с&ПЕ‚4CS!ѓв`tV& Ї—/7`ЄЈЈ†—б‘іЦу9IC§џ п>Ђ№ %xYuвЊєФOјжфGx”эу‡Фя xЈЪ,юа%Єšaž‡8џ pj‘ ;$fE9ўMˆПcNsЬЧ>№4x6  Ž  Цœ}ШPршлyџё_Œ#5лХ›MEќ#JяšЊ*вБ“мп3ф ]шИфI^n$Ој‰љЈЗ ўKц„5Т;жїсаЇМџ_•љУэ‘ј_РьOѓƒЃїmын25ƒє‹ЅŽ?0с!7+*tј—@фуu)џc"ол$}HЯfЃБф$‰;Ъmžџ+ЄПјјцwŠf~…В§/XqтoбёСdv”ОћпdСќ№э!~Ѕчдддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддддќ3ЈХт—}02ёwЯЦ^2єЏћє^ъožЋO,Пкƒр §1Џ=њmиТhХ№џ}bK8|=М]џ’ЅпЁў:§эyяO” 2јAўšЯžІeiЪ~Ј<Э2Qp=‘tpў?_§ УSџ]hI6MEФЏdUсїžОxЁ…AЃС(šihˆ›ї[зWћїГљЏр{VбaЃ%d›2гФUg0щТQЈ†‡.ЩыщѓЭўУ+^Q%с˜Ядўx ЗЈZY„8<ЗйHUТБмъwКmlДчYф№МрЯJ:žІ)ЧГ™йOщ˜JШЏ"<Њx%[yЄŠЬЈбшžŸž3VБтrSЦž‰іГЇn‡Ё­ЉЧ3šнЯ+%$=кЦќ+h~™ш'м{}jwуЕЄљљv[ЄОЁтY d†eцjТбl^­\JВo3­T'+ вХštn^#š“Ьф§ЧЎЋHŠsеJvЙ…Ž6Нc%pЋ§ьйЃM‰“­И*ГРжe%КWЗ§БцDепўиmЊЬгљQcє=3”cхB%ІгјЊ нŽЊMžgБ‹ž™мпєgД(Kxfїnѓўžyкj4Ќъ{fЪGВЙСJŠИlТ‹‰ˆМrWЦxфdž$i@к[SOЗЏ$‡.yљvWm~ьrёЂoпsK>’YёВ"L.се€CNЖнTE‘ŽэКОoЉЗюпН<в7,vяUіўmљaZюо7Ц~HђАc‹цk(а\я+Мьу™ˆЛ-Ќ5KсXx[CЊШsЃћіLPЭ(Ю 6ЪtїуЧћЖкюЖUЕ) Б8[’‹CЮ9ЦѓŸКxј/‡Ќ сQХ–ЪЯ_ѓ%УŠЂ$№гЛцTFNQэоСшlћуЧїяяяЛ2єтOЫ–зБЄѕ5‹Ti|ё№j)1иlJє№юќЊеЮз‚ШѓФ§нTЦѓКПУ:Ь7яЛэі§ћ{ЈkС‰гРТƒoщеaы9њљыg\ ЈB]\іoONЮ.ЎnлГЕ ф§эTD~БйlЖлЭRuZlЖ‰ЩŽЧ‚цx–Іђя (‘^~Йa6Б!PнЫгѓл‡цУнэЫJСш;Bвм( ‚ЄЇЎфлФтоšCFT‘М>Т№0rxїљє…Qt/ЋR[^uЮOя^f9э=€ЋYvvwGЩЊЎ#C^ўОKlнŠ ђхйѕUgBЧ›Х У гдгХЗѓЏ­ЩZVi5ш —ьzr}=–†_Ž+фmо3 tG‘˜ъБ[‚1xвё\GWWїЇ-BдMлдef6ЅжыёХi{J-ІНлЋd–?r Дu™ъAГм_@"MExЊл?Л…rюХiŒѕмТc|ёхМйэїкїчЌ‘|Џ<нp\[‡чŸ>Йj)NфŽqZ’@Б,Г^ŸПёК›–EљŽІШЂ0Л:9oНЭдєёz†‚нЦз5УаeтўфЫзЛƒlпsLх№f/Ё _/Щщ yіИдмДШЧѕ$ПH]}К›ђŠЁЋду›тow_ ?<ћњэv X~Ч‘u№бА+U74…'‡3Щ‰AоЋМˆ А‘$—'=YрNm6`%ЦR˜AѓъКйБf˜WиhАњpО&WdџђrІшŽяЛ:ПXŠvRLЯHТЊ"ђ“Г‹™lљY;тJŽоwЁ.-zї­ю„bd+L7ЙƒчQ;–t0›%Cc{—Fq“ %ъ–E9G…ц5л1дC x_hЖgгэ›­Ръл”y^YБ‰ДUїъњљm4їЎ>їUЭ‰ tWYVlЁЩт1kј!ѕ^m7?&УЖ ё@Ip"йЖ‡цЭћзЅbХІк”žъю*Ыч“г›VчстфdЌ~Z‚№EКлЎ0ЇD;ЪЪ->Шjp§gXŽc`с”YB~шЉГцm—ŒАЌ6ЉчF9ЎчФЭЗfЇзќіхlbXибeŽ•вt f@ˆƒчЧ№ВM$МŒE<дйбzsNЋšМ|вVЛ ёќаМ‘Uy€D;ЬЫPgњ=‚ІЧЭЏg#ЈлДД |q’bЭЅW(Ќ"a@iž†ўЯ_‹’nй=˜‚*Ž]~mЗЈR‹šЪnZхЎЬpHGтєђьMЖСш"Вю%хІ*ёOЙђьy(e*MhУѓƒ:žŸ|•`'ГћC0ШпHR ЫнMxічїŒjкЖыљQ’dyV@Q MњсrІ;ё>_Їoъ|ѓѓHЗ‚ЌкdЙu;/н—С„Єirј|л“=PЉЁчXъфќks|ˆDMёŠfXЖm;­у4lёхьIАНДGƒ-&’чŸF†фАіRпвxfН\|‚ц-;-‚ЬВ,S=dcKЎёiQрX™Ž­L./fšтp lIмќёѓЇц@qуHТРu]јvќ [ф}kJ‹’ЂJ‡Њр g Š ІубlХ ќМyк/-Ы"ДǘєяЯО|}Ѓ“ЂЌ№ЙЇ8Œ0ЊЁб•ПнїЦ$ЭаН :$Ј%5^ЛнЗй|д:=Ÿ™^cЭЄѓ“^ѓцєфђЂ%†їpz†HOS|Ђ/ }uЯoŸG+у™ЭьЮ#Œ–’n‚и5͘zЭ‹Џœч…А&sбЃзогЭе§ECВн СVCa)sШ,№“BО;o Qw‚0€6$FHС€ш <ŸmыТЌ}yжтЁ E™‡†Ш =~n6V–уљАPїЮ.рпЏJW'Ÿ_тMр{ю!Vу\ВУ(ŒтW`№›#Mя?пЎ]7ШŠВ„…hCKЎ,КЇ7hЯAХ ѕРьт~я›ь Паќ ФJмsЯОбŒФ1,Љ$Ž"œƒ~њt>7?ЮaЭep4ЎiЈФMуv?и]mЗС”EеnSФЎО|›Щ^€П8Bœ;Ÿ гџdяLxлV’<ЮГя=;ЖŸXО$й–dн"uёf“lої­#ћэЗZЮ,о В3˜"eў€ Žd(ХfuеПК›*=Cˆёaj“˜ктсЗѓ7Щ‚^H‘Fm˜м uvџAГМ€ьмzћpMyиЭaD’gьcNЖlМўйF/э€ˆў,і\ЬмžŸп %І]Yх)ŒЕcR‡њђд›ЎXAu№ R €ќ‡+24(_"№%№oyМдАЪџlЃyJYзТ6”M0Ќ +—‡Цз›ЇЁ`‚жЈВЌv ]ъRЉ ыКс‚јeКйя €š&ќNNVЉšŠъŒЖ=з6EЛaЖ)ваСв|6щЗzPё}yžE6жЙ6LD4 џfГнUх~ЛйСO‡јWиЙ6G8хч—[ е25–*Щ€yК&ЦКЬžFš ~ С-ЃдЬ0н&$ХЭ&ЫwЛэЖ„&ые›Mjм1`ДИњљљe§yЖCАœRNЂШ5M›mС„ЪЋ$Еж&їдТАМ(Ывь† Зпя піТ†yS•bkC0š;ТrЭ„9(†ЙaљqFnsžЅ•9i/L'b WюЈЙnйd!л„ђqЛпя7‘Ў(“фзъZњŠЂ†МХпО% Ж!;‡Ž%В™CUˆ5epK EВфЈ!~ХЊNОџЖпјšИœ :шВњЈs№9УХ17‹цЊiy @DЫBзрXнЯŠ<їM]•zWT‹цe™_бƒюp­%јt€efЬ№2вu]W}ј˜1}д—…Ќ’Ъ й|"M;DФ54eнМ [“йшуЕљќЪШfКлэ ЬdgEI’As3ˆYш€ќЈЪ$ДtФoЮЈЧы›—іKѓ­зыLyфoіћ*4БКzmіЧГЩЧЫ5й;=ўŽѓtБ\,YЩHЩтЄHдЇU‰?9ЇžnюкН\ЏцєJ6Вн~›yЫн‡зоGяЕqѕ>bttЃЁ‚™а+Щ†‘оЄQœ0ПœН]Ÿ}Ёюš“ЕЌщš†И•„ЃФМРФbПеЇ™9н?ОЙF B˜ц1‚oьвšwžn.ЎЈчцˆзАi[0КЌˆCHˆ™ojЫA‘ŠŽАp№#hЊj7L!фePд‚>vTq9|t;­ћ;ъЙЧЉКхыXYqЕЭC ‹гб„г ШЋт)NPаш3С‰g[Ф8Я›GƒбtЙšѕšдгHA:фЭ$ \Ы rˆ0Ж*в§сЪ5Ыдббї[й0ATedі`%)" AyDдHѓѕ2пqуМЕO*„<А0яї&œjAjQ„ьƒŽul ЊcG•–ЃЩ|Й^2уюћptЌЊв˜jвВЂ™A *ŽЋУщ žМuIw ётђВїжŒVѓc%ыІ cNН-B˜laqZm _WиaыЅУШи… љгUє`Рh?&%Ё…бzм}mЕ^^: EЗ<ЯPф%ечЄ‚:-Њ<ЩЗ›ЬеU~јмќXЪКыšЇ9œЧЈиtЈЬСjHмќТ$ _пPЪ2вL7ЬЁVHrrЪMGђєБ=aсКlŸфЬи A ЋЇP•Cј0АŽTн0УБЄLЈ‘Dі№Ёж‚•@ъb$гЏЄсзŒгœнœџлq<(N@щ“RРѕ<Јд“44U…ЅЦ’b’@сAњX•go ­c]=кЎчпЁ`ВуG1хIѕ*д2№# ДФ4`ЄA№“UGќy–DШьсSo%#U…д~Š(MQЌF†š,&$Y!Г=јЌNM‡R}AB${[y Х "DъƒwРєTUE:Э!j№гД}?„1T‘[s2CH6’…б 9ŽАэIUB‰ тЂ7\ƒХЊ†dю$6SЏыІeлŽc‚]ЮЦуб\6т „ Y^Ж>Ÿ0Н8Ћ ˜ƒ"ЯЏЃў\в4([щdЧ‚H€@ГJZMzЏ/T—CNE жФT $цA/bSSиљ|6ъЯDЬBM>GЦМrй€šdЧЄѓD5зŠ™ф‰oЊфЬЬSШІ~^„X•цубh0х5c(v…гшв ŽTИлК [˜ЖЉіZЦažЪаˆЯN8Qжl“Hœu{#šW1†]•~њšу?eVЋф–kЊ0ЂZЌЌ‡E™š&wЇ+^ЦЩ654kЖХ0 б wтЧЯhДфeHw ец•YюqpкїЋhб6ГU…~ІжR5p™;ѕ97j%“{eЖBSя‚ŠЃ2‡№!ЦВ9ZKZTхŽІ­š0вЂ5EцOљœЫ'#^U!†шЉž„ rKS„yЏGѓŠ‘–)-vрЎpЂ$ёьЏ№”yBKгTДцsDNи(мykЮ+КБSѕАX0ІgгЌќFV Ы‘ГHД ТЎ(iђdХBЬscЈбUE9aћ!sQE‡В–2hЄ$A1ц'ƒќplЅS­sќŸЬ–‹УzIмŽњ$’Гв Ю0аЇвџš… VbJmхPвМЌ’ФЃЪТЏ№@пBаV лhŠrH.=Э -k ќ?4вљS=Žy™œњ"ѓ?т80’?W5ЎaŽ‚ф{Ау”я)P ЌDY\џjсюГ’ЂˆпоkТŸХъИ‡Qў#&Ќє (Ђ—Щџ>‰]SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSѓџљЏ§яaйП}гћш{c‹Х’џuЛж‚$}ЖТaєЇбн‡Ш+фћеOбQ№_В”ЄzЌ$|љыB1ˆЃ(ЊЎkHZ Ojс`ЭРˆєрUу{K€‡‘Є‚ЁŒЂ‘NЗЋьg‰Ю\TеП}Е§ ™Щšщ;ˆЇЈ‰‚}IЄ'@Ѓ7ŸЗЉ) oaрyЖЎœd­ZпЎеw8Єy™ЏrЄ[‡™xЊL†њЅпя>Р=РN'Yš…6&=­(йА= k'iјWDd&U@OаМ<а$вчтmђо| xЄЛI–еІŒ]LкŽШІŸњ†zjЃ‡’цлH_RSХŒѓШTe–Іоњя// iNœEY’†Ÿˆ†ывУ*ТъiЛnKK:ьŒз§"O| ёыYЗѕђќ6—v“ЂHтИк–bI.S?]њьщ4ЩHчŽ,ЊnZхYъiВАЖ5R-?)ђаѓГнОєѕ\Вѓ]nЊ'kEўЯ#Qwѓн&rœf\Чž. ,§vџ0`edЧЄхЎя%Лoћ2ДА—ЛТQOѓІŸ]щIћv7лlЫ<ЫЯа гв‘_}4§•ЌљМ•ФaJКбWyZ›н&Же%IšљLиCA#MАЗUтђjСŠВ,K;yКџX‚бщDžІхІЌіџ§mЗпР eь`щ^f4§™š!ЗxХn“‡ІТZ­оdОт‘Ї›оBСсvПлlŠrПЩвbџmџ­J"№˜Ф1а)zМŒЇУп+ХˆЊ*vtiбН;?ПylL–,K7oпIЊэ†vЛ/B7Ш6Л]j*В$Оi'0њ; 2МќаuyкОў§їГ/—~m ц‹iѓ–4ЌѕЫВкnСЁs›^R•ЖCrЗ §tЪu(c7Ћ[хњ—|ЙЛo4ОооЕ‡гсѓMBИGaћ}f!Т Нx}gxEсO'ќ$l†yъщт№ўќьЖ=Ђ™IїљыУлGїёК9•Tlъ’ {хЗм–9йŒЫPукзOНё ЕъJ7,?p •y8?o ж2B2;y{zi7Пўљи[IЂИѕW8мm|e)šAъŸІє_‘4е0MŒИїЫ/Я[6„щЖРшЫлЧУŒпЗеЉv!Z иЕw’Žн…Ёв…eџіќiІ^œ$Ё­IЋiџНqyyѕЕн}oн_ОfОOtŽзс•щнoП§qљмŸѓ"w >ЬаГqчўьn*›i<ћFТzкКИИkцЋљјљnІ‡Лв”x kвєљќПўИz]ЊЖч:јro6‡JіуѕёъЊї>+SЌЩдљrж^)и4дљЫђЗ[‰"Пш?]œ]ЕVf”„Žmž №dUƒŠoќўєОЦnZ$ŽТ  EпЛИa4ьžƒ'эщ<нo5Ўoюл ‹"0TЄЩGя*6Dјp“х5Й*NМŒdq§vб” '.‹иSV „W]ДяюžогƒЌЪLnОЄ# ОБ вЯT‹еœ$OураŸ’ЙЖюПМчыѕjќpбз АmSЅžхчЛТњћwZФŽ%љf—ЈГюxЩБЧы…Ж2 Ёюzkф‚‚Ћrвr>‡С“ЦїWзAїёЫхлщfЗ…wГrї-3—ЭЇgњqšхлwšД:4ЫoЈ—0сДIуОЗDV”Uе&O’$Џ"c§~q~§ѕЉqёћc8 Д7eYnі;Шуы‰dI/eTh˜iwцМ,ГG |Шё<4||xgD+*Р3lУKЫТз˜Цеsѓѕљтїk0 ,тЎjЛЏЊI№‹§&Б‘W™5 P5Ѓ/§l=#Ы^fzЪЄйhЯWl2W\b?-c“яuыХ№ыя73ьdл*uuЭKЪн6‚8+Зл*6–#бЭСшо\s\Ч8Bb_“чЭhЧ‘Ћ1э‡Ўт-2†-Ю‰Ъ"аx=я^оŽU”6„СЕт&%8EQ”U‘ъЌљЪЙynLћЌс:ю1Œ–MѓƒZі“ШХыо@Њ"Pл7Œ@8ЖKъ’Л?Л’”UїcЊи0џв, =GFOЗ]фgІ'šчEšЋф'‚\€цОLL'€7aЈ…бћ{чЕгNzќіx}7Сn.VŽ'ѓЦЌ %‰чQHJы"В…і—GЮѕQфiшй–ЎЬЎЯF–P#&О Š[,9AС†.NžЏл+еДЧ8ЊЖžЌнм Љ–чйhpu9дэМ# , ЩЙяJД`KљчzьBeб>џлноqТЯ]Т‡бUА‚дP2LЧ]W№CH OJZ]Н жšыДmтя=AаМэу˜У0|ЯБMЖ{ўЫкrXдЂЬ"ХаХб ѕ8ч$Є <*аIщ]$ЁЃа§…трx–Ф ќ Ю}WКчy~Z"Ž"Яu4VњЌЫ›Ў‚(в8єLCнејŽ$œЎsВƒНѕv3ІV†о)ЧЋeтЧмМг#УФ…/кšКjQ+еАУлXи‡iёѓЮPsQ7ЁyHЛnёуу˜;Ъ~БTŠ4(X]8ЕbЂ6 ь2t`xкЉ­i{лwŠ—‡и6јѕ‚^эї<ЯžРў єŽDу‘•AдЁkшNXѓиVeq§xN5яnю›эіsЇ;XѓZXŽGШ"Ађ№afѕНu™ЏVЫхV0Rшј( ЬWЛ:6яsъЉyћ№мŸ.шёˆоB‚@а` TЧkЯ?2žгKVqђУсxШRьQ"АЋмЊwѓ§’j=uњ+AћЕЅМцЧ#~jО=6cxіc2Zю+­№ЛХрщЧХ5е|я%U74$1sFЖрyрзт§њ:[mж'/_lD7 шЩi’eј‚gШћеДџвКЛЛЃžЇ<‚oА-У™d&јЌкRйIo~^bkyMДU ,›Виm‚йu'ячУоћ`јўвЄоЖщnBЇзхѓŒg"a %PBH=бњgd,ы2ЈpHf™/AіђЬЌз›ЎїЛѕИM YЄšAœФ!|*зOrмuxf2˜ВHгNуXўе4]№†ЬogЃйrГлA#yэ-8I‘х}Ÿѓ 2№ЧЪbЯO№S™yЏП№™I-ЏnЇЊa‚И0U$эІн—оp<ОQинžуEЭKСБъŠ v кМ •к+љy‚‰щwG hnWлЭM К‡Њт єЂРЬ'гЩ к†W$О­Ђ]—Ђ–‚$!;HŠм7рsIа п‡+_Цgj’KР Р1KТvњўвІ№]{=ЭBWWХДђWъдХoЖvЋioИ„DWФzюдќЦt/* Rdˆbм}„/Ќ$5€ќ55W4VхYbЋ№ЙЃо`Щ)_з.ќ5+@"ЯюцдRRм ŠлWУЃy z–Ч†*sАѓzsјŠ$дЖ gЮpК ‘і8Mз"ђВФзбз+l8IГГ*†fƒџ=нA/”љ}=}хŒз{Q>+/Ш 7Mqљј”#FPЬь˜_џІЁbgSoРŸЌ@‹т‡ŽЏ~AщЖг<аeщ3Вю ]Ф&’ёGšэ8ž]зЂЃџ™)Є*‹Х+Cw‘>kкл’WЬпG_ЗйцѓКгљwЂŠЌ AљЩШJr”бџЯˆЖІHЙŸ?[Вјѕъ„UАУђ шЯӘ‡­­ЉСіЋћЧDў•йцЗL…•жmЄб—ѓwxЇ?lќїfƒtЪВј%.v ?Y’ИšлЩџШ–—$и–HПŒ ЭJ2hКZліџЪœDA”@ќVŒ—,ЯГЬ_ЂЪ§їЌ№хd^рўa[лэњ?ЫмВіŸъћS6œШq<ђЂu“ўЌї;ц/ТЪ|yšK@ @ @ @ @ @ @ @ @ @ @ Ё^ѕMLњ?Вfў1cmјћЏSџаБоn~џнѕ•ё"_lXQфph ^м/>Ї‹Pыˆ'0’$rœ№WсDIљ ‘SФ~_шЏyэsВ|!ЫП_QЯ7чOГ-Чnыџ…ќ V”’!fЂЂЩТч(†i}jБ“4MCš‰NѓгцїЋЉ€t ЕO;иIŠnщx€чFв\]dq.tІ<лЅxˆАƒ(№LФЎюvКnhšRѓPXxnMїPЙтh$Ј&ЛaЭASєzЫЌщў§ЗЫgZд(MCзP8њхіъъіњсmия>4кЌ™„ЪbШ*Њ*,ŸО§эзѓж`Бле–зУAЏsћ§ћѓJдœ$OA9Cд<ьЫЦѕcСь6гі§B ЙЦєП›=_ќђыY{­XŽ­е#œЦГйшѕщцВЕL/-[УЃМ‘И=\\9еt,•щє%џXќшm8ш>^ž5Z4TpзTj™“ŽЇJЬЌџО ?-3KdЖЂЌ!‘›5/лу^ш;:=рМCeЩ“Чл›ыыыл‡gZёвмзы™э.сиЖ& Š еИLѕ§|D3,ЧmwЁfai—јh+‡в’?Ю~До‡гх^ѓ’В№Є“ЧћйаvШŽ’4 ƒ Щѓ,OMnђмL—ЫqћъjЎ;YYЊ,АНь˜\чђъu!hЖDI~,м“ дНТN(jАC^RTe^Y–Й‡6нЋ›жЫ ЄљэкХ_•eYфхЧGj0ЭћўNїЃО1Џ>rяфAK–!MЈ‡ЃXD Iр…I‘ктьютњюсёњќnkxy‘'AœUЧдиМXгѓЊ*Т Ћ O9uаœmквјБљЖpд™Џ F‚чо>]w^:Oяї;УMsАˆК›‡#Є№Na]СКpЂ›—>7ЉsТ ІДn{Ž8mпuШЩЊФк Y;ШsOš 7ћUџњлУЦАaэ}уA™чАЬ‡227=Zѓ:3NOXC; meё|ћ&XiъЃл™ссшEЩ0бІ}~?E№ ВРмг< HŠЌ(Ћ2 ДuћaІХE є_fМ,žЄУЌ№ыgZітШQW/яМ ЌОžѕU')ѓШu|G?Ў{`ЯЫ"tЄщT0=Ј2)ипчэMЦŠ ŸыНŒW'Ъ№ќ†zьЬ0]й 0Ёy6вœИ(`ыЅXЪн6оxм$cзкМAZk†aшŠРŒ/Ю^8;NмSКл9+ƒЗšЌ—WЉo™^–КъЌq…sИ,ѓ,M|Cл>ў#лЯ \yвщBэ^3ЬT_ѓђьт]vТФ?ЉHя%Є№ќg[KСЇц‘ОiПЪc^dq@аЛ‡Ы™ayP’SЯgяНўћ`4OЇƒчћmжrпќ:}"& ЏъКщХ 4Т,тОs~З1ъrьY†ЁJєMcЂлPьŠ"і]S8†йэXAфVАжЗCNГ,?aЬб.ЉрYlP§AрˆƒЦхg2ј@Iи§ђљьbЈZt^хqшћОыzО„aр*гћЫћїХfЯœ|pьb'ˆЂ №рАФйэЗ6яxqYБ­ќ{gТœИ’фq}—ЗгОmŒclŒЙo@BЗJї}qй§ё7 їл‰™7/v'6НЈ_ДЛ ююHЅГ2џYUŽ\є{­к§ѕ}$sВччy–ФQЧау&Qž_(§УУ,цszAїЊWЗc+sˆ…Ш–ѕ t[хЅXn’ Ъ$Ы3L„ЮЌt[ЊМupˆЮdэdащMhHА4=ѕЛэзвхђкт-ˆ{њуЅ\Ў>PЌЖ ЪЪрnЛƒ oѕtпшЯYA”Dі\dLoУ4tЄт вvѕњъВЪ{~œCСЫDЕe[šH7ŸO%–"mшГgj­л^œте 9:џќy„J3œЭСnЈ2žуœy‹I†tцƒЛ’Шїз2UыeiЦ†ВyК>ЏSМiyqкЛ+??ѓРв-?:u0xНкцЙ т/Xлv@ЇPŸСЕ фєEЃƒ@\яРŸ.,ФХPёrƒТИ?ќќyL,•ч$УOр9RŽ3†є7#еЖm/С{xз#q,Йѓ.}9Їь1Sa›šШIІŸ~~бђjЮˆš&qшиŽzv™G+†хј л’чпавЇ]шБМl„Я$Qз“с\аНьјѕ5žŸŽвi™КXРБЫ\а њ>њйУ>qLv.йdтФ1:(S/Эўhј?фЁeиЙ`fЌЄVюБјБЩЯ7~йЏпн”ЈЪ;єdBЊА —2<лїпAр@y‚ЖУўM3шЈrPPКШб§ЗђCљ‘jЮeЄ[ІeшЪr8нhnЖпТCilяЕ7Ѕ :N\ы–‹wЛbа  ќ ђ-$2уnЋйxЉWЈЇAC5Ф4д ‹WщщN‚МшЕщ Яsž([ -’ШГTaЭА”$qєАлLfУї*t8ЊюF#0лВЈžБ і;УЕ$ѓХ­š–ыy&’7єА?І™5Ч.Цс‚%~ўJЭEUХ”&Qр8 dЁЋqM$-К^U…Г—УВaк–ЉA˜Жпо{Ѓ1>Ÿ{э.Eе@šаЅŠjFxГкrШ†Сn윘 y{щw щHSTЊлЄлzoОПЗŒЌP]”)­™Q–ЅiсЎїЄI4‰ўxk/DU)*[o @`:’…ѕl8ЭW™ŽЃЋЪmQЦ1Єш_rшh?xyщ.yQ(ъŒy&(*вБС‰ )В‚_9$>UPSQЕЧQ –Cœ$ЎЎi\Ћђ:bxΘƒO +*"ІэžА@bC“%ЉЏkB‹n ъСN Є ОMкКІаѕRcА`Йтn}ЌD Шfид8ёoYйТвTЖяЮ"pПfQ”сO tЫO“9]рЅ• "M7@C"q\ЯCHЦI`"mѕтUжIв%И›ххыScPX9<1чa)"MUeqГйЂЈшnЭ—…tЖ rJD|щ*aшй7xЎw&3КаЋы+IгE•…е|:OfKyyBчВљ€/ЏQ1Н*Ёgƒїevвl|ŒщEС7‚ж’F‹Ьру§ПfU=Ъ#шЦOЗ~V2И>‚ъBзЈ‚ЭTЃ Ѕ“)ђњ#fЩѓЂШ/†эз*~I+Z'ОŽNїюVЊ…<Ы 9дU‰fЅ5Y2Ћт&`2_Бьb>щ<=ST'KCSSёю2З›фyŠЛFŸe v]єхњУ)M/г6ўŒЖг,ТщПфTdEЛ-ЮТщќmМXячCМЛЗ:e„™Ќ™IšzК]€яЛм‡ВўklVt<џЮ„й№RЌ _ЎE‘ч!ЄŠЫv ?—" EЯ„= “UIїб’f*ƒnuiЈЕЌh|˜ŽыйšВlPsе0uѕМSЦџ3QUё˜;0šUtз8<Г5‘Х>%#]W Y^”Ѕ№Ѕ ХІiЂТGџЌЄ›–&CxЊ; '*5GмЂЯр!:ІІШŠnwЉ‡и…bћМSє+Aе]пе• 5S(ѕu‘…•иьЭzНЕЊ{ž…ф5ЋZAЖЯ]U6‚OI<ѓ@ї?ФБ­1s,K"K–еhO:§l„„љŒ“u/?фЁ&YlыhѓпџПџ—ЬРбq–…BŽEŽ Kq5ЄЊЏуvOTŒцW ‡gfЧУBі,C*жш…ЂљnЗMУ0 \$‰В(nІдcmFk†1-Ш24EѓЖ??ПілгиСb­^#3Ф#щѓ,ru‘O™еšSхvЋЧ#нu UVЌР3$бˆ__Ч*эиR1ЃwПсU+йmу(p ™щП<=Пw{WъЎдhєxHvŽЉуЧ -a­:щёѓѓˆчећІQdЎ–4'=M\ищћУххе]щёёžКМ­жкМІ›Жm;СюgbpSNwЗŸŸ[пu=пд•V‘‡6’жГ^ѕъЗПн>”JЗз—дххcЕЭЫШ ‚ Ю_‰БъŽdфя‰)СћqХйМаuЧwtyйЎн§јэЊєђўб|~МЅ.~мU[+ЙaЧщсgю№НC)аИЩxБ*r†Ћ›TИeѓст?~мд‡ ЗYM?žЉЫ‹›ъћHRtЫ2 'ў<„h^k‰КuБpхСЉH‡иh—./ЎЫ­ЅЌы$SК§qU~oвAиЌV‚™~х6п|^kІg]Y(jФl6,нКМИЋ9ЭіАJ^S•Ћ›RЃњ>_в“n{ІИ‡c j3E7‘TДZ†ƒЮkљђВђA‹КХIŒ…ШЊѕpџє\Њu‡ƒv§ёucх_БJз{ЌEўэњЧпЎ+“"G3р@ƒЄЛ$№\пVХiѕсБм3k–7*S=њЪѕuуЙ?і7П]\зІМn›EщІсАз|~zѓКnї‰%KšeЋђъхОT›Њ–тŸyяJўao‹э‡rѕщсцъњЎ6жМиwŠщ`QQdn>š †o;O^Lњ˜e§ОдV?N"пZ8яИЗеўЭхѕЭ§CЉкœ)~šV1ё!™Жыy&вэ0Ыwћ+Œ[нйšeе‡ђФђГУсEЦF?їŽвНњqSivGsN‡Hк†f1њcЅ9qž%q’dЪїћ@[ДjoнaПёєX]:сnЗ;ђШЗŸЙ)М^пПŽ9EЗ§8Э!u›giЛРnъБШOЗћнўАK“8п'Ж0Ўо—k•rЙT[9a–ЅiЖлю_?Sc]-З NA3эއШ9wY+2,Ѓj—QэhЛпяbЧtу|"і§ЎTy|Њ<д9г‹уаЕƒь№љuLMІйaЁнкB/zЩю˜xчжSdš"U­Д–’чЛЬiЩv™#єŸп?^kЅлжp!kлšlЇЛЯЏ/-;ЪіŸ‡mР/xŸњgЏЮlqTjЮU/нХцЌ>6Мlщы9ЫЭ›ЗWЯKгŽгаSзœ“ьОЉч€р›SwѓёЮ{yцŸ=хmь Д•Yуёmc%ћШш_Н*nКп:В-uVОЎN 7ЪтР\O6^В?ю`ЉюGˆ{Ў]~ум,vЮ>wЄIшjГzuѓ]Јw.jМCч‡Бƒ6ЭыћŽтyИъdФМЫЗKВФзW­вmWіГи<џžфк ѓФWg#бЯW|љё&ZPЁпЮCопЗлЯі‰яЌ;НtцЖуи†ЦЯпЎюЧШC§ь6SЭЯw‰Ї+аo…ЦьўfЌЛигyšxZ<оѕU’DQ=zm—KvГйЌЃзЛЫ‹Gкє`ДbуЭЎ(ЪђиZ7Ўъ+Шp„gъЫЇлВМ*ЂoЫ“vЇзŒ€~Ћіp{}пW,зGgv;c5(P&ђmт№Зх)Пђа6 C“Gїw}фИ ЄpP~–*ђ+†Y.™Хl№^ЙН~žIjнРˆUM'Уъ‡и}€Ѕх„)оf4аГЦѕ=ЅИnvияЗI„яћžчЙЎ­oњOзѕоДˆf`ВMƒvK—‡Ѕ‹:ыј HІФVцэfѕсі’‚|У<ЙE№„Iz…l/сLѕќќж›3№-_­–§ЪхеР CаtЛижшfхёцЎ\Ђл…t‚ЅйщW†юŸ%‡САпщ~4J—?^oїЧCъ[ђr№ітƒlHдћнa8@iС:oŸХa ЖnяkяНёєЌ2oЪp"nДOЫъюттЂТA’ƒбyшZџЩоyш6’$iИохvdZІe(oшDoŠІŠх3ГМЗ$%ЭлoЄІsил]мpЄ€Ын@Ћй D%#џј#+ ЦМysqЦ-]/Ь  n ь5D\РяЊH‚Рь^нЕЇKY•vЙц и„žчк&RЇO'GЧз‹ Lѓ5дМ4 </?OЙ†ќH‹jћ ’ЇišханЄЁ‡­Љ‚‰‰v( K§J@ѕРЕеЗ“пЯ†ЖOуВаs@ЇяЮИWXАжеvЛЉђ„ўСz‡Ў1n@SщР3яаœЪhW†!,*œ?Џ/g]UEy–ЉЖ.ЙыF/. 9J(9Q’U %yьЃхhlЯЕvљђeE\Я"_п%ЃыГѓѓŸЕЗ•щњi^­ѓ(m‚њ7мUWA–бѕ/ЉшС:oЖл2 LE”MШ/Gнak; лѓC(žkЮ^ŸŸoo[ bУZoВ(‰] oЙо0AНЉЛ+Ыœ6]ялэКHОZaxlGлщkЎ‘jЛе>ЄЏ&,Гёл§M}i:1tйY–8мr#н†–ЪЧzЛЮ7Ÿ2эM ­nAє№nЋт”СЃ•йЁЏ3mЂёЏwMеёXе"ql<ИуD~ЮKКzЏЪЯmIBs0KДг˜9NДРћ№!U‡Ь_j#гЁoŠ |ѓј‘Sl7HђТЎ6yёёЙN\лaBЋ$ˆLрйЪŽƒлАA@A{m<НyбРŒBy&ž=вчђaWњ>ФYABW>бVЂf…є˜$v—ьќh}E,ŠиiXЩ<e{Оm—Zъи#жђ™›hІe[†Ќbэ'4фІТOf ё`ЏТ—cэо›іlZЎFqVn6…oЁЮ§ТtaѓШ!&џРЕЧ’ЌШГсt…нИм~lрaV“сL6рyAW;o8zы›&СиM7я›и!“–`њАьрЉ ънp/Н^Џѓњи˜(ШM 0БkkѓЩt&Ъš&яЩыёKI‘DЩpЋэІ LiЎ:1(ZфМzКфю/kЕыкээCgЁzŠА)пЦвИЭѕЧ“§Н§ЯјЉ ;дŒжзІЇЁ)}ЕмџyТн]^нм<д_ыƒ…‚Њиаœ[ћS4š š­Ёp€} ЃЌ( 7VуЧуюъъЉбюFнЗvЖвL?Ћh—`юИЄќ#SйЙўjYЈ+У ЪaщТрљќјŒЛ}/DYUVГ^ЛЯЫШЄ-ANхpŸ1/XЛ(Щѓ2‡п]циХкrдИ<;џЩ5&*Т!Hw›з8ШОvЉСя1ц—цiLkЙкM+ШђМзxИО­]pЩР–cлбE~ВT­ž,vА:тпz{ zEL/ŒA+Деr)iиВLC^NњэfЃYП§ЩM5D\Јђа`ŒM'ЪJ№Ѕ ]Ў1мзћ8аѓ9b(?Œј…Аг~Лн/–“VуuD‚4M"Ј~ŽыУ:WiрšЄtgo—8ЧДВMYMћЭ—fg0њoѕЦPаЎђ/мLC}ЁŸ&>|#Дƒъ-ТўxoЗ8—† M^-љAЛY~~­Пжп&ВNˆф7ŽзАэ зJShХ@mЄ|ьёb ЉšЎk:D.Ь†Ю`:_ЉШtlЈnЌ"bлАGщ-1К гШ1Нžд|С‹Š1"а ЄыќбВ§Р%HiqН•A0вt3 Т’€…ТЂ}ƒлНМdВи6э ТФУHjp4ЉНGу'qBo“A яџr,НЅ‹~ZъіЃ(Э@И=l/Ан$UYRГ”ФiLЅ#ѕ,4З„Ђ‡ў Ъ#НтЉы"BамTXЬDdЧалФ!=/гї}aѓ‹™Ќ#zkZe€^tŒ hc‘_сгXgЭєhе ]ЫDкЊЛя€)ƒЅЌЊŠ8 GЃбxВPА›•‰g"ЉŸЖРм!7Ъ2шmŒ щ;$e&ˆѓ?c,ЇgPXi ъKКЙЯКє n§b0шќљУa/ѕР§ЫN/§ІА3-ШgiпзІџ}ЭАу$ XЇ5ЏЋщКъ’0tћю_бQu$>љu…~…Р~dр8А!яѓJьПЇшЧО‰є/7еt+ˆ}ч/ТџBvоУј К'Фѕm№гњ>9ўЇЌ ƒ€ыGкA.ulлP{vyцџз!hВсз9СDЅ†Ъ0”пWњ+L!єuYˆв“tУ0TiяЗџ=ЫЏЕU~txESЅх7™Ьaq5с—Рu{ќbі­Sу“… ќgёћОтќпј.ОˆС`0 ƒС`0 ƒС`0 ƒС`0 ƒС`0 ƒС`0 ƒС`0 ƒС`0 ƒС`0 ƒС`0 ƒС`0 ƒС`0ŒџŸЬћœфјПcЬзљDЗўљ0АйR˜ЗќbёвBе5‘уў)ђч усRе Cћc ЭLї:Їє3A–ПщЫ:вžы~Ѕ‚Ж€•ŸЯљсXаБхкKnЄ"Уї0 ШŠЊЊtцЬ\7ˆЁ,Й-"шSnЁ)ВРЯ$lzqX†ШЋ–…ПСфО‰Єщвh2H†щšкjдЂу$mШ)Шаea<‘ '.‹и6tт8&6v?§њXаЉŽиP8nЊ“ В yіF'В‰‹.Џ!:‹­_CдIUЅ„!Dнwа+Ы":?V,?‰Cћtін˜kЭudb]юо5ІЂFТjSц3‡і:}˜hГч;&"N‡6$Е<ЅЃЛ\K00DИъ4њГ…ИBёцѓcЛ–‰ї=RzІ#Ы шtЬ( C–ЄеjњєИІ`iЫЏ›ЦjКД’ЯužmšћZ0ˆуQ’%Ё‹Ѕйh0š [5ј У5—"XY,4лsбxЈyхял2ЃУxmkЏВGЧЎyžчИRчНЇыЫкн]э >hsЏ щК,Ъ$L}sвэhћёў•иŽeюsДœŽM—NŒ–W‹сЫХбёбё‡№A{ZBv`dЏм†dќ02Ќdћљ^$aрлц>ЧД!lвСqТИїzѕуЗУѓ‹ЋЋ‹є#wП4 bЙ~œoп#2Ў=‰ШЫп+щђ>FФ$Xх[ЧП§ЧбѕkЋгm?^Р7мнд@–%iЙ§ШсљВ#cПШ\c9Mі:УOСPєfuљЗƒ“ћюRVqв„~rwoŠN,ЧuќєcЂI­Ц#; -}я3к&Ђ$NZ—‡;ќqёТЋІe[КB7й1wѓ0ZЩŠ,ŠŠ“П—Žкњй”‰…~п1џWоШѕУ0А‘2ІA__дЧПou:э—›GЄŸЎлSAи{rќЩLХN”–‰kYŽЅЫ=њъi*ˆKОї\ыЃ`ЛЖхњyэЙўr"stефWкžъp…ь )ж™)-D4eщёШCБєМЌ7$ГѕŒўљёЩщйЩбёщmoe:.оOАŠž$ИќМZoƒяр?кмзЦ№—yкѓЮТ{ї№№єрр№фќђіyЈzGц~‚VЁvРb:^˜U ё—іp2Мч.ИЁччыЭІHmI о7ъž§|hМE _K:ћ)0 ьЧi‘чyЙЉђЂмЎ<|yxxО?чЎИЉчЇyБ^—iŸ yЏ?Nяоf+нв<ЏЪал“џАŸ–ы DaRV1{wч'Ї\›9ЎARЎЗ›ЯпsSМ=*N˜fEUТJ‚н[=Z‰Џлр;ЃbЛ)cSEцщгч›кЯKš7-ЧЦђѓэЧч{n._x=H‹u"цы,FЛŽyfhsЎv§:QЬЈ\gюВ="AVЦdйmЗžn =fІх:DЏXППО2š›aZlЖUЊOхАЬ"Вы рюVНћЫ‡От‚>[НѓGйЫв7 tѓ/м)72m/ ,qКђвђ}КфxЕй”‘о{kоШђ<з=\мЭьЄˆШлсљдЫmИЎ‰Ц гli˜ѓСЪKжяыЖ*Ф\њ№юъM Тpї.Ф№Уи7†Зз'+"ЃўЗ“Б™КЮгЬХ"]W\?I‚РtE2ЇQЌŠд“їЇW}# §~№їЩм‰ђигКuLВ/?ўэr+НЉЪМРЩrЏ’у%yКBыmІ`ЫёЉІ#БїpvxЫ?Аw3,uP”ЉЇЎЬ Rz|qд€2W­Ы"K} ~r-её“22zzщ/ЂЂЊВ0iпœ?Ю,ппЙx+'ё ARgёpT››AZ‚&„ЁgЁбзP/­Њ,ђЕqГйyы†УAїѕюЩыaлЛЯШ;LKи]EъŠѕгѓ‚:ВЩB hРоЮИWХѓ’ $<є-UfгЩx4Оея/Oœ=MХ͘М†Џ?ЫГи]5ўЈ+д3U‰mHKa{{’пœŸqЯВ@’Џз4ь$ŽО Э~}єxЖaўvuxдТa\€ЩШ|Gъ>^B!б’љkЪuуѕљёЉоl6ž.ŽЮ&>]шэІˆ\KдkззмГф5ЇрЇРъe)„œfIFіžzЦ“ё лz}К>9><<Мœ‡дЮmжUИ6›WgмУТ `ЋnОЂ.b(лaž4‚`?чшЊЁ­цƒ—ГпŽ\M!Гg‘žc ЯЇмЭРG †šnЦ\*|№#=гЕч?пm =ЁхКОkЙyppt|б#A”цeY•Y:AЇЏЊыХиu Љюи 6EЙсŒўtтnЯж'šщz~шг5Н?:::>yZк^HзК* p[–єР]ОЌ”rЛнфЁMxО vх:2яŒEUнёqТŠxа”xОoKЯЇgчWѕ%і‚$‡ #(&І^чju ‚N!шнёс‘жя[АyI`kKAж4qЗ’=Rmпs]ЯГ•Зл‡ЇЧћыZcХd/Oта1ѕ&ї00 hX\š<ЯzћёОнn!СЁЮыаЧ “нОЦB@€ciќh:›лwWЯїІИ.=,( XэЌњќЌ"‡XДАиyHSkчAЯe[–уEIš&Ёgы§Ы{йёВЊ*2зФcюяьgs#Че…ћПМоeС— rЮРф<=9I­Нo“’-—lНv•‹У§,ЋФеВЄ3НwЮ=ЗбUXx тЉчќјѓ-}џєKСфIbпЖqэ\аM˜ЗЁЇРш—E`~5˜]ьdПЫcЧ4—фm5 ljš Вћљš;*З^ЎУёCxJЋˆъ ЇCu€]'d lЌ}ЛФ0фцy„MVК3хx]ЏYе Гулл!А4~6^ *T жхB6}ЧœЊЉšЂ;ёёИl}\Ÿы6$,€ѕэ#TџбŸ Кэю˜зэ0NС4феdЖfYbŠ:ЕВd8ž5џђ’ћжЖПвЯ4Й:Bззї•лJѕyITg{h†БgьЄƒаЈРOŠ†Гљ’}НUTь`G*E—aАEеыЋJ­іPЋ`\ G> \Gф•тє~0лPЄехЁ уChщвъщЁыыzЃ ‰Лб.ЖМb’й&O\Œ7ХJT у ЩDаі’(Iг$ttqеК;CЈђ8ZЌ7ыљЈльL–МІ[~ЖЯ}lŠEjžЫи!ГэlЌ8ƒeN[чЛыK„žШЁ&]ƒ\дo5{sV2РХ!№™…RсMЫгŒ|иэzLЏqшš27я=\Wo р9]7 У4df1ЭЖђ}ъсb Hы}ЂšШs‚ќaОќfк}~Ј=‚ш‰Јы˜Є*–[V Ч'аxжT™/єJX#+фrDC7-зsШeЋ,ЊЕб`‰:ˆбфО­оx<_+осuТS)[Дџ‘›ŒЩЛОчyXИЭfŽnQ{„P"3Ah$ЊмЄП1У——и5uЭ0ЅbяЃœJЊІиё|звјеtаi7аe =wб#ZВЬzІbЛ6зьЫVђvH|ЯБlS.ДBŠЊйфrеUяБR.•ЮбйzjЃ:ZБлеdТšAрj‡•сэ_yŽ…•"EЏT]UTI`7ЫўCљьєффь^Ѓ‡'TƒђD^ЦnОsДСu[2ќнлы> <л,TєZж4™[MњЯЕђЩ_NЫ7їЕ**•а§#Њ’z‡Ъ гу1аЇзЗs‡ћу. wњšњ‚,1учћЋѓ“o9ЋДF‹еr№X*н< {$*:іТxїђšZьгх­fGihЉLбFНX/зЇпО};)еЧ,4jE˜нŸ_V@4 -’\ƒ эы‹ЪeO4п6И‚%џ3KйДmЋBЗtvnб„уI’T;}ЭlЉ_ЎЬ›Jб.§{Ц[нёЃ(t5yq{VFeє8Z,WѓЩBv/О­^4VтGЛљ –œŒ§$MCh‹ђІvZFWЈкъz­ЧЇЕПe–мЙИm ПЮ ЋУ­Є[^˜юb \[“˜Їѓ+tІ Ы,JGvGGљR—$W’aћq–яwЎИZБЂАљQКC \aЋo[O[ї№ыл“ггѓГггвнѓ”“ХЂz9iIзЯ‹в§aиYЬЈ?Y,FwUдTН(Щтаaњїј˜ЋыяпOЮЯ/oGŒцКИ \НЕзТ4пСЏ}ю “NЗгЎ—ЮkЈнdw|й%Ў(ћ//Ў>-}?ЙИЋ7G ^иР•‹=џ(‹|wмeqœфћиVуfхт2Sпt‚8=v‰ячЏ;[nžн> цœюFy–D>.Ј>н Ё0я нwЙЏ‰ыо§щйmu%ЭАl/о^ŽПќL1W-U{+й’<ЯГ, нЂцЎЕ„ƒьpЬ}e6WНdŸи*3kн”+Uдк@g%нЫ_~љы/ЉЙЊеŽRRFQ˜ЄQЈ}Км 8юэ]cТh^~ЬœEѕЧyю<Гhп—oP›#cГцньјѓ-s˜СLДЃlмчž(ZAшŸ.š•јYћўњОЙ6“}Œ‡g—CЭЫіЉГ+л зр!xXђbЬКЩўѕXžˆfјŽ 9лO-Y–ЮіяЯЏFœGFїћїˆ>ьвСхЭњотљž<ГN|€Љ6MГќpиЇз{ј1UА#|КhцBGшп\ЬtЉЯљобмtПпх™krѕЊ/0Щ"ž8ъ3F˜эˆ‘Y„сQЫЕ‰dрЫ "—oз—NžњќУџ•gиЯіћ}–yXjA\ZЯ gгю,$гёЂ8 [cFѕвE}.вЇkFHuIЂчVZ’…цјђћЮ ѓн.OЧR{0qmсБв$№iЃ9^Г‚ЌЉЊЬ.:ЕђщљУœW‹Жve‘k…ybmъ'З гKvyzОm)§[tПбй.ѕ}uжnїЃщl>ї•вщЩYЅЛ,&Ђъ^’g)Д gћ\КьAдиэЩ’Ўшќ3г%Пн>C‹›Хd8њ…§= іт,Ыbа|yў,:xClIьvГъп•Qenyi№р'LYВРУ-‹ЈЌlXŽmВЭвїЪкѓсxˆmi9jзo.aЅWv+ &—'I# йЇБ,C,xмšmYŽ]ЗЫпО7Е0ЬˆЃЖВlUJЗwЈОЧ7Шљ(‰Av„ н,jрšЂцS­ђ№ЃбxЊ•OО]LШVСсxмEЎm0нJ…ˆO„Дєr<ђ$&~Q‡ЁѕEfЎЙ@‹†њШBз6љЮmš ”Gvx}=ї)kЯѕр‡ (”~eБ^Э‡ЭкещїяччWЧ“нaѕA™oъчшa„ƒ н,ђ\c в7TJКХьжLж‚ЂЊТЊђэфќтЊ­~ ѓ Б8пЦJЏŒюЛКчЇ{аМKЌЪ’ŠЁСcХWD3Dh)™Жm™ђВqўэєЂTЎЮL†˜=Јб–ЙМCеОц~ˆЮ[тDrЉ }Иz!2—Аыи–СїЏN/Ъ77WKеŠ…6г6™{(нбPчWU ,‘јЫ ŒЎ-Ž‹PЭЖэ€щŽюoыеыЋЧЙj{a~€шй0[ЁЦЪ†сeŸ†Le`$ЏoЏр%ћ,єАА*`БgМaЅ…YЛ7[-Ц0ЋдчКу'Pд ˆоVarБнl№х*Щo јхўG,ЦГ4qљљЊчВM•пl!›;Ў]=В– U љУБи'д7Ьп›ЫnŸНќќх:#МЋрмфS зфџџџЩџFе5E"›Й.ј™4О/ &+ЈYлляЂ}аѓ]ІїњзЗ]€M iўИЙcБяБ Іgк^&qр`Б[ЎёЖOГ-ђмкpм ŽуVїђѓ%ДQ’л‡i p-ќљгQЭЩ№6z™ѓ$АСхЎ–иŠ`оŠ,Ќ Кaal“T}јхч1ТУ0dЏвѕ\kХьеlTlYŽэyьйBуrЌу пe Zƒ•~myAрE Iўњі’ЙXcxV•ь­ѕБЫV”eUЗcтbŽ:ИЈ&„б,ДАђŒаУCs0HћЩўјrˆ|п’ƒс|Уr\qŸЮжFвƒ§Ы!uёЊ9VЁ<і‰‡ЭэBЕЋвU­V}ž *і"№i˜Х\[љ''І+‡WвŽЪАиKРё,C—Њ^•ЪЕ‡Лћ6ЌЕЃWђОgс"ЌюŸ˜qŠхЦЧЗзcЋhyQО‹]й>Ÿ"t{y_mДžъѕжhЭIŠNB^@- ЋќždК!д+щsх8Mc+lЏBDпЕгщИпxќб™lXA5ь Ž| “ё~ƒїg8}%јJГ4\,oеыsЈщцŠ—dq;ы>еН)„YУ!к…ЭяHl:†Љ&Љ&Њ$ lM\ Ўю.СђцфX…ЁЫьЂпюЇŒbzqфYX-TДlйЎ}ТPdE‡ќ„Б&qГюуЭ]­ŒPgЋы&ЖАiш"Чq‚jBƒ ]lћ&Ввd‘c6 ЫђМР3‹Qы№p…P—зЩYЫvlŒIg„П•ШЕŒ‚ZспaxXТЭ^ЗЩt>_ЌЃnГеЯ'н*Ќ4ЋišaZžяyЊKзЩQњЮcc,‘Ш †V5Йцвџgа*„А4ИТ§Sc(jлƒЈš"д\%§QSСВФЎƒAЃСЋ: ЯЊАЩћoa —ыŠH‘ї2ЦL&юМ'ъЮ”взЃ™ј‡*эFСёfœ(В_=xФёЛуv&ŒfГo3Елю ьXžFAAAAAAAAAAAAAAAAAAAAAAAAўгaw` ъџV‚РюъЋщќ/•ѕYЭД UиЩyPsžчўЪ}ŠiлŽcщВ$ ь/—ѕS&‚ЂHќзб>LЩьJ–†Оk[І& Л1ЏhFгd`ЮHд4EПZђыlЅFk&ыAšХОkщ ЛИ 'pЫйJв C–%њ§њ§а™ё†Ÿ•БkъЕMьўsN”T€ЬЁ4dQ`?žМл?<<ќуоxК`d+Ш2Wыžмs†чiКŽЅеlъщtиo?м^8мџзСЩхЭнэз[+Њ†Ѕ›чPЇNNžDУ‹,pLћЩјы™,Y29ю‹_ЯeеА§ЄxyM-ііш‚’M/ sЗцhNнД4Х'—ф#%Hšх…IљZкьъА5ƒ|ю˜2ѕOџЯЏ„–aЭŽ&6NЮЩчЮ‚xЈщ^ўœyЪ№єшŽ&ІwШЮЃЙ`8A’DЎЊŒOЗўqйЁЫХ‚нr™мчƒгЮ|5п™!~у•Јšn˜цd™)Ъфь”\НИы Нv{І†ЏЅЋэжD?Š'#wуД€”ЇЯЮOШѕЇХj5}КПМчœЭKhьDеё;ЃY~”feQmm9™NІг­Ѕ%л =ƒišYх[bьШь֘•4гі‚Ќ(ŠuБ^GЪ|№єдЛ:$ЂWvdiф §™Й~K,юуўЛээП?ПщMООКZ2?Œ“ЌЌЪ4…ПR›ŸO†эГН&мфмАиМЌГ@’Н—за˜ŸэНпќаъЮDЫѓlЅЎВ‰Д$iБЎЊ"Бt/.ŠиV%fp~@,Нд(ЏžЋ" ѓчЕЏtї›—ŸЛбŽRШцЖX“шЙbљйКкTЉНœˆnZ•Dйuѓм|bdн ГЭѓѓцѕ-Г–—Ї7sСŒђ"Я’изъК 9аKз›"ряo(#*Њ,А ЎsI2тЇ!$еŠЪ—Зп^crq~G‰vœfрўI е^}{8sХЭ7ЉM5›mСK+R2+ѓ;’\юЦѓН\I^^НОdіЌн[ШnЫЕЬђЙЭд&К17“*ЕžЎWNZUyт[ъˆјєУJTšЂXp›зuЄѓЂсЇEU•‰#ТwQы˜‹Нт–ЃлГƒуОЏSГЗїю#уФА&Ыд5™kxр–еm[ЅжI6/e†_жеBЬЈнЁш:V5ЄЩэйЩР„>[Лџзў­шЦ Šќј<)Њoг kй{dŒ‚b žБwvjЬ2<[}qћiхЙЯ_џїёРвѕКЪ3пк№@›З§(Žмљ}w.[`ц<Ыђ$ДФK&оѕƒ@›RFZЦњрxя†…А ‹,M\[щТй Ђ$ -ъЎ MЛjXЖЅЋ"=ЌOsc GZTЄ}ѕю|bйК„Дэ;ЖLіT/Hѓ4 TъссBЩbIЯЈЗE~)2dУ8JA3sдь+ARnђР4 UЁoрўНтFyYЄq`ВTПџиы?ж+˜0W(Iгд]н5nrі&Г%ž]NHœ~PШЅЊ€ь9 OSУš­Мe.ъЖk[ьCsяl _ zЉRGœ:­mаеђ=ж :xчhЧВмВю^`DГ<;Э{З*дzDДo+tїтф#м˜AXЌ7FaxЩƒЎБ3ћn’”ец9}ЯцњзWpmdњ!4ЯШ7qžmA8‰Cшqы–ћ…BUОC%dГ И64‰{МŸ7ЏЇ†€Љ №­{Ќ?*Ыj •јћцхB64ŒЯ›2 ‡Ћ'ЩЬVєИ?˜CљІЫ‹юхЩ'ж†М]–ЉяšDч)ЁЁ"MгЭл+ˆЭ bzј1р‘zrЬh6/dгv=з1ИўљёЃexuш:d'†u|Xz№- јѓђіœљP›КQšfIшЛV];ОдJЩa^l2ЗяЏYл/Ю#л&ЭЩDs}?ˆвК–ѕы[щВЂЈšхE`hЏ&Kƒƒ(Žыљ1IŽ6:=šN!-ВlВЮzŒЎ[$sgрћŸТгљУВ‚j:ЎcЪuѕ/”l˜І .=›iі53ШKqлнЃ›ю’ИЈ;~ZЎ_^ЫШ1dv:/8YUјКvj ЊБ‚Є91Tњ+їNЛŠщч[K“пОuuгЯiВJ’­ЩіSТИнyOы}ƒ1Y)Є2rMњЖ+YA^С‚ГˆЏЯ›WїНЏ™n˜фФйAЕ\Ÿ‰џ`ЅZqЕЉђРQч3е ‹2В ФщЋГЃцљХЇюˆtb6йї…ЂZ­џЫJГн rѕ:ё]Cs ЛЄžЉ1ЄGќа<=ЛМКЙЛэPKVRuЫё‚Рw,uTЏф‰ ;аЯЎЗKQ„`ЭажиGВkzqкК{шіЛЗ­Яс‚с$žч@VЏhŽќьiQєQB+Э ?~xEzФЫжу„^-&ƒЮ ,ЩЇ СЮvAtНя1&ВmCЎ†f$Žгl[оCX[ Z'Єou—ф„‚Ш,ЦэЛЛ‡оˆ!g™lЫЌйв9Pх8–iР/яЛHцŸNNIЛеˆЊfКQyЙ яі bh]Ћљ˜ ­(ŠІ РѓЂ$IMuoЎ./ШлO#Eгtн$[б ]3,Вс`ъ5UЅп0[а‹щt2Ю4M/ЈЧ6D‹о] nЕžDU­ІуИЎ Љ~Ывk{Aє3ž&‹ХИџИКgž‡L~Оk› Yп0§ƒЩ‚œУ’YR ]\6ЈбгмтГчз0 mgЫRгщ *ЁљJTu‚*’]ўЧЪ/ в (Ж@Гnдѕю&PЬ•„Дэ9Gђшт б8Е‡ЂФОЅюЬJЄ№ ќyдўtўУнЁ`˜|П5”0v-!мNП1ЭАЬ‚ъп^Ппџў&%к^р0ззdyрYD4qTџ=у…dyiьЉЭлЅюz_Цй*ЛCОc!ЈрЪU˜“гцУ ТЕяyію Гн2 yQd‹/gЌj9aОyIlіі№ДУj–уZ–ВSёВaYКЦ6NО|І@Ѕ$ХkъГжсYwЉšЖЁьЬоFуqЪkЖчŽ.5šзлK +)КщхЯ™ЇŽЯіЮ{KQvFѓ˜ц$ Œš'Ё­ˆЃлЋ­.Е\1Œф”Ulёэї‡ž†5+§ ииtМ N‹Тз%žљ*њЎгяїz9иTž1ЋYхŸсtл “,_oж‘Ц.&УЦў—C-“ЇћЋЯ+k§[lе?б§&’ыEi^–Хњeэ ГqџюwбSещQI|и–‡лтутnHsЂ›ЗчдЗnК3йKђѕ~з’ъœ#Ь;йsfіŽѕАмЌЫФЕWWфNЋ3OцДшІЯЯ…ЯO&+еOзИЇеИ 3;KпП;AОЉжЙo‹ЗфЮ ХЌцуХЛйf“ЖaАhзyьˆѕеѓЦУеё‡Ѕ“ЏЃНџюуЪ Šj]•О)wШ§;Z5unд~тЌx]yšeф ФЋ172Ђ@w?мЫсК№ЙЋџ:ьЋл5YцЎ!oћлОhzЁЏŒю{KнO‹В( of‘Ћд80]€к˜yœXRŒAѓн5c‡d‘х‰kЩ]ђРи№ƒ0 џ—НѓPn#Iв0^fDJЄ(Pєо€іо{o’{OйMQCэH3Лwqл=qљIUQŒŸХЌ?3Ћ;Ђ”‡Г[BGwЁmёlkГ6lл1D5•фбцюH‡]–ЧЁч9YСЬ„2* =сётz8#Y–у8–jї^zЪА§РВФaЏЗ6ЏE?.VЉ‹"Œї˜е]K–ФFмЕЊє=<„lœФwлџpHЙXGl‰9hzФно‚ЕmКшЊвъIоПШ”б`v`†Ёы п‘–хЇБœм4=тV§1–ДZ4˜]mw{Х­fLА‚ћŽŸеџќT\p憑 +­t ўЮp2жюк ийU=蘾54ќQыw—ЈqЛ2 Nxœ )ЊQ‡Ў&Qїѕhѓ0ё”Яадњu2Ж#g4п™.@Е Fm ?ЊЧšCъ BЌпйS$Žьв2П1žЌT/ЋІpОІдЛZHj=$Pzsщ=” Ђ›#є&АЄЄ"еaцъ=ї­МИЈ?†Œ\Ч3гE~c ѕ…ЂАПLQ–Й–§sN„wЏСЮhžяœmќ‚сшwы:Ё˜.‡ѓsт‘ѓnG‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ џ+кМ‹љШRyvљз_з)ъы(UEъдэˆoќђВ*B1-KзФЮЉž-iцW—cож—Љ[zћWиўРtArЯ§JєёЃPЋжјџЈЈП`FёŒ0.WE`pГ‡ѓ/;Но-Ьq’чy‡ОN=Ж-іw5Пщo|ш“a˜ЎVe v7Понч€Р†ўЋЬјЃ@ывиRЅхЊJCпеЩЋуFєм“Ќ„ц Csy}ИЗwz7],:гйід(„Кc]х‘g+уЫfŒ‚:ЃGЭ>žœ цœ( mЇУяHaЋеЊH|Я$Џš1Ц‡1аx?МКИИ~  Go=!~caQV@Oзтoš1ЦAtњ67МЙŸRЂfЙ~B‰зе,tф)TжYфYвk“Шzaœч14УлЉhyAФQИuіщ<Єь8ЏEлђЗ•і @JТРІю ˆ’Њв$СБeБп\м"‹\[Иn8Я‡ŒљM›lЩЊ*Рa[zнщЬ$2 єу–pп ˆžяCёс™2hЮЁв.KhЮсЇ№­х“гщ’˜ЎЖ6цVэq‰яhM…ё(Й^-кwljжUGPхEXЙеюcŒ Ћш†&‘ƒƒлWВы†Фюk3ѕ иЎ‹эћ!4хЯy`щ–уxžык†иjсФCЙiлІNпє?ь‘–эУbBzЉЇnКщКNmqљВ-E”YеMЫPZ=ЃžŠ† цыXqКЙ=д-Шм!иG=wй#eј‰\№l§T…а$’ Cб|ыЩ)ХДМаЗLёЁПy*˜vюыЁЦqяf§– žR€шиеEj6jWю7XнєЂаБ ђl{Ÿ2,/ šЦЖю]іzЗ„dдgyYхЁышB7 kКЖ%чф=џѕ0VњkЏC D:dЫ,ЖЛ‘ 9гіт4†ЮИYjІыЙ–й(;эѕ{›_ЏG”Є™–э`uЖеі)MУDБ/j,Уhбp\зВŒІM9юmѕvvїn †DUеtУаД. †сqлœ|иЖ ѕЕˆЋE=:шя]gѓIбЌ Ћ2п'rАA)XqрC\и йR™‡fъИЗг;>9=>::ЙММИ †sšч˜5[WѕŽ i/№§zБuq98lІjїИ{xИм\^\œŸž^=Юi–iџj;0LГYeSЈёYнŒїъ•оя чKŠІ—ѓЩуэѕЭУdA3нhp)–уx^dE‘jruАГѕњё,Џ7ЇEQ‘#gу)A1dwккоh:[фr~ЖЗгяя6cЇНЯ№IŠ ј†ЎЋ’Фqню™иПЪˆWjЭ†ЎщЊ"tъ„?”aЅk6tЙхУЧ_0™/Щхшѕиу+јtЏ~Ђ[‹ЎџŠpŽfJТ†„нјznЗћэeNб™я‚Cџ‘1%жњўuAzЏіiЦКCЖёsN­EлnW{єzдR'#у•1+ЋŠ,4хХdмлngЌ(0ѓVu§KA…&ыЬ繓,нвюЯXамыВ~з9&–нoL—DгўОёЦ­iAAAAAAAAAAAAAAAAAAAAAAAAAAAџ"лЖ„BT‘i[ХП‹ ыъпN5!kš*uђ.Ъ?aЉІњїYj‚%{ћЛзЄjъвпхJXFw\љЁџхj)Ћ џїBsƒахЮЗњ—s^іo {&X^’ЦtwsїlDѓOuэ*Э#Hтї\УўѓЫ*rХлЯwNю4л­АRЂnйŽЅНПЛдЬ _—Ёб-­п˜sšэљA˜К№nx&ЊVX|ьŸм †Ѕўь{ўпЃ8~\”‰MќќЈGхz•ў7{wТд6ђ%\fУїa0цђ}H–mн­ОuјТ|њm™Р™џ$™­нXйzПЉ Еq=šзЏ_ЫЉw_JђŠЦ_ž“ ЙЗБЖБ]ЌшCзs†њRƒ6Oч3д?­ОПCb4ПOy№ВћшK'ѓЧ/Љ_й)>7:эяОщџЙFѓЉєЎ +ЁЯяG4|ЉдŠ;`ЩTZЧлŸ‹ sN)^іЂ h<БўёъЛ}“ШЩL•jєrЌzПs^ыZHLTЫф5ЫW ›ER0т}їФЦгЉьиМr˜JяYL‚— ?KW•ŽУgї“лC—Fq,ZzЫ‡љ$U'“Еѕ“‰ЧѓщHррЅ8\дZЕЋ‹‹к€eЛ|Ы$"†–~пІKуqT6Ww›H&ЊcŠі^іОіаwŒл“гkЉКЈт%‚zK^„ЊЛАYœ0уpх}йQ+NmˆЃaщыЈ… VѕьфВйї™”œщЭžayXFТ)VŽzDщ‰РОлЏь=пљ"Š%sХУ“Ыš>њњђЯ†GcЮнЮЪf-ŒFї3ЕкŒцею‡чс–qEмЭз \З=ЗЗЗКrтШdz?цYНи/l>šjЂг8ŽИ—ЏЈыJq{§нћ*‹’й|Е№7?kкЕДЂ$UbI­›eњŸtЃ8™нЋuШЉ[й?zОшЋьPд~тх2hCЪxr?ŸЄ’‘оEqqэ:Qš&Б”ЌwЖНЕЙѕyяєІ^ЯЫYрПЖZŒGЃщ|6ŠTЛ9Y\­„2%Ња1ыjwї№Дxy]ыіL#?Е+ЂDlGg^§pqЉ‚дLЧЊзАoЎže{!п^n_њF •Р“qܘпи]\Њ„*бUЋ4N‹u 3&…”‚d/}O|бEBDЉкХЉзи^\Љ…Bэ<œЫХ6тQ’dх/ /W|еХ\FЊ(ЏЖГИP x–аЁyгB"ЅуqG’S,Л~У$BM­d~ѓxё}нgBp†њOиЇЃTЭUЪ3ђЭнО%Л IФpџrё}Ы%\eGшzTЄгIЌв';pљŸНДЬбМ>и\]=4 ЊфaЏВЉй˜ЊqHX<›% ЙAˆеYЫ,{!ЊF/№‡ЦЭюњЛ­J€)‚Ммы8й)–R&ЧїS:fh9Ž=Xz'2№ }з(mП[;Е0aRеД—ЈZ6 х2=ŒY`жjFЕV§юћ§Іч‡#Зuњўнv ЉЉV эЕiЎЛ!f”ЧгљHЗ[YfЄot§3ƒЪчЕЗЎšX‚ƒ?ƒkй>a\&ЃlжВ“љЋ–Ї™’ая•>n^Ё!ђпєt-гЭ=л еt—|?ьЋŽЏв–q‚нжйсuп‰Ъ•З/Иеm_-Чь/@BoщХnЁууPЭ$Ы:ŠJгђ†пlx;ЅІ9АlзuЧЪС1гUы2–eВkYЎ кЗo_Pи>ОЊ6лКоэЖђвJwВC§ѕ1 Q ЪŸg›љ˜Эяz*#0С8 ЙЦorіЉЇэЉVЉŒ‚Р^њfїГno`YЖc™ег…ТЗЃ7MншЖъyњ<юEЅVo6*кбжЦЦц_FєСаЖ‡zЛ‘—§№gшC•?ž=а[9ш:~Vg`ЙЎЋ‚ў-–шWеžхк–‘›"§7wЕFэњЏлf?gџ4х[ ]яќmF+эvЎ3ЃвщvО[одŠJын[жзYЭIыќяфцозПёлlш№џXяw|"^зќЃжs§ Эвњ}‚Ў[^Nўѓj&§>sМаѕ —дЫёУ‚Ћ-Нћ—”šMЧ’–ае ;УРћцaєZ?Рщt$P.гК3 BpoЏwн@ŽR4ўщ'—Цp12JвQBыэHЕoуx>—дЮйxыVШDœŒЦуЩtЬїэищ]{€’‡‰РљJыКMx<ЇI2šЭЦ"єо>љјДмщ—”Ђ\= yˆY<%!й—˜ЂоыPЕнМ>=oћЩгœу<­EУЇb4GHясt6MXјg~˜˜:еbЭKПмsœЃg7­Ц“YBєГВ%ГЧўыVb )§V'˜šЯSцоМŒ:бшсЫ—/OOю,3ЪП ˜Z† ГЯжзNm‘Lg w^ƒжi4=<~yœаўYa=ЛдъvлK€КЧфd"IwgeуЪ“щtSїѕQє%гЇЊ>>NйАДѕAеєоp80—оЉfAЇ"И.Ќь4‘NЦ‚ИЏеуSЉ=X2}˜ЧЈyzЄ5^р:§eЦЛр9’ИЛЗЖq>Єбx’0bНVŸKucˆЂ™**ошк!#оpщйЁ…,ŽщрЂА~а e2 ў9“GgХвuUїUŠЈŒЉˆ˜Нќ˜›XD"Ј~Zћtч‹h4Ž9 џмЏoЕы‹ГЫІC“Щl’&ЉzэђcжL*9щ­ЌŸ[Bѕy‰ иy]‡з=з6kХЃгЊщѓ$M#Iœц2Ѓ}жі9Їіeснn›DуйHѕxУцщыhРvкЅ§ƒЫzп Cпщ}чН~™^@Б}Л§nукЩlaЧЈž||В(–Ьы”vЖі.*Эzэ{oѕ ѕ†НлнеwŸuчcюы7'Ÿ>|Лѕe’ФѓrДƒ#ˆЂщ\eЧ Qк[ЬtIѕ%8NЂ(Žй№G?Н$*&ѓIФi`–vГ EuиЅqE‘ЬWпёUMшd’HN§ъQvсLuъ7Q3-АЙьшў/cuFL)p{Q=Tф=*5Я,GєЗ *cv,%эgŽžЏ NНЪўЧƒ‹лFЛлбѕN+Oч[‹IЉ’Ћ­І˜}И:тщЧ;'Uг 1‘Џv›l‰/юlЎ„’Qм;ЩОWЋQ'œГаЙй>nК*ўH †‘яф)УЋ*Xh,rz+л)%Ј_>Ўy<Ю Iuр-П3}ЃИPџ!у2ћNэ0MєЎ+6в8’R§N*ш<ЭtЖk3•ФYьжŸГлeЦў 5 <Хœ1FдЬ;yКiЃQЮ(ёQЉ:}cИ(DЎ№h<’ФЗ\/\уGoѓ дЛ†б(lЎ­lœ ЃŒЁХпџBЫn™fwЌ*’IЪQПйnЕ–ЈЭ–у;хнїЋ+лMDT„‹VЃ”§Џс!ТŒЇ“˜Ё\„ћЌяzОoЗ/Ж7оm”,„){ОЉЛXšю˜PžŒ"іђs_lшAр[ЭгЭЕеНЎIˆA—ž‡;У@§\;тѕsѓiРР дj њw{…нКЃvН`q<Йј:оАC•чj}ьѕђђ!WЯCXёѕђўіAu r8Xм‹9yA­яЉёPqrѓщxW§ВЖТю\]дMЧѕЌХ§Ч‹зWмuћCЧБЌAnbжZ6B!СЁoыЭFЗ?0ѕч6юЯ Етеm­бШЫqЁчљ*'я9УA_Џпўј'r бЗВjžcї*?~}Ntњ–уeuЯј=ІљЋZЋлы9ИyєПЇžЏEјsšнvnіТŸVkЗђВ№?їћ-=%ЏЗwПыЗ КІхщІ~k-НГьўЕЎыжВƒјЗŒ Ж—ХПгђ04ь/;Žв6-ЫіО}дg'РQS”ЫМЎ™.І” ПЙ^w‘ЯbъхяAиОG(чBHNќол‘+гЅЃйXвмЅuЧ!\Š(J’4си};tX1}>Й1”ГДn{TЦБPa&“˜oŸ№О{Z1ƒшў1ЁAОdˆEœF<єиh:MihМ+k6›~™2Ќ/-Рџ эS™ІбŽMGŒ|нKЊšV8ђULžцœt—цЗLФтQ,­“УKfAœчы*шVШУ^sРцЬi~џm~ЉКЪŽ$цa­PЈрx:‰В™ЮЌhšЮeТљc*Уeњ–юGм9Y)м!‘Њъ6Ь'­ieMыХЩt2ž>ќё8yj@šУЩ˜ГЮЇw› Ц‚˜кт иG*sтt:{xzzКO…ёУЗњuZ>‘ЄшjceЛCe’2j,RCлQƒLŽЇїO1ЩгШлˆŠHАўўккQŸI•нYmЛV#5эbŠt2xzHH{й‘ОбˆрU6з7Ы6‹RЩ яRlЋИЫІOуЩьсa$њХьхЭЦ’у]ш"&YhЌmvˆcJUыЮЕEаЋ/;6ЂЩќq–bUЇы†™‹,щ‡œыВАЖSѓTvіUnœЉ‘‚ІНпќ\ЌшJцїЃ„йцаusбЃК”RПђq}ывсYB}]хF– +Њѓ8<ил?Џѕ1™NF'(ЭžK1ъьЏЌїЈъђЄк›ЇЯщБЊОмм\э_vЇI,Љ“‹”Vg@ЄŸОїБЪtЌSЇuyјєz–УНnх|чЄbz‡Ў™“NЏ7шžVжЯ,Ч’Ј˜AяЊ MљУцхюцNБвъцb ОUW{љ8ЈsqИЇfZeШ~AЋ{ъ8ƒ‡9™оПЪHe‡ КзЇћ‡й~sМЅu—’Ѓ)нVЋЫŽёoъ^жЂJNЋEѕЈм]jІ‡Uн>*l”›Ц`а7єМUНКЯЄъX[озДэњЎЄщŽя™зŸ UгЧ„„7Ш[и0[vИ_оЫJоХMIkѕ­AЋИЕs3$BJ rЙh˜оPF 6ЏuњфъRЛы њ­ѓНѓйгафщ,Љ„QlзВ їЪъ`[яэы‹f˜•k"ИƒœЅ‡ъ­1c$0ЮГ~њфКЄiwmCo䇋ЖККоЭгЭgЈх6P‡€ эЂœѕд-Cяі‰Є^§‡?џ е•ЫНЭї+šрPцЌЫЛ,_ЈБJ[яЉЎIHžЏ0ZКiдЯwЗ>ЌЎhwV~=œ”Ычй—JsДЪŽ\нVяєmЋW+ю}*ЈѓUз ќч./O_oЛ.aYU zп{—_LКŽmVŠћŸTз_8іsЏQ.?­UUB(!h˜ЃEиБlзuК7Хƒ-ѕ]г0žмЗwчЭQ[щ€ѕeС№BB`оzпїEнR/^Т6™ЙŸўЊMCР„ХSS‘њочЉj#ЕЉ_^ѓЖјЃп…ŽкуqR5ƒ,ЭtPoїњƒvсЩЏwWgыбпžоїŽr-щ;ВЕўА_Яв}іЪЭNПпЉenЏћМbНеi7Jйы—?/W,6-3РЭ†m5odЈЅћz™}€Рџ)хF-э—Vэ ‡нRк).Љ3OТA†Sх>ыІГx:јћУ|\­нэv;­ъ…ё$єr9›ДS ѕѕо( УQ84>МаMgЫ8ЌЇ“ы3Šэбd2Ђ(Ž&ƒП+јА;™џўћ|:ЬкїЛ“h:LтХb›A№о}ї 8ˆN_žЦгnzљўR{ЯЂhа g‹Є|{|1ѓНЇёЩЋ‹8Ьжч{“xђћ­x~Мˆ“Bx“ЏœGўЩ“Ъ№фѕЫ“Y”­њЈ &ГљЌљУw‡“љё2•‚7K_’В=h”›сщызgГ([3нFГ8мЛ~хAЖ\FуRpДОrЮfгЩтеПџ8‹ЇЉ†МЈ1JŽЮOWЎоя$Зb4,Йц›+Хйђфьљы?ўч_gё8н”;у( ѓ7ОљіA:)У П^ЌKЫхйЫ$ђПў8їгMyAs˜,бН_Џ^ЙЖ;ˆgГh˜Ќы}q?œŸНx•d~}2Яж’зGгqхЮ•ЋЗіё<ž&Sš[ЏПж'‹“чЏ^§ѓГe/н”*uТhв}В}эњOЅQOУЄ4ззўБл чЇ/^Мўуьx˜fШ‹JН0ьчяn]ЛНзž$‹Erћыk[;ЛЕ0ZœНњчѓ“L­гЅоxXўхњЕ[a<ŸM[ЩигѕЕэoo=Ш7‡ЩdП<]Œ2дTзњƒњЃ[лїЊЩ“„^ЕsOжзЖЗЎпМѓЈд›џ~v<з3Л’Да;WЗюŽ‹х<Џ6ОнѕЕлЗwЖw~оoŽцЧЩ^йЭR…œыЎrЭ&ЧЩёЃеРѕ ИћЫУћпЗsчqБ=кйкШхЩђx9кOя&'ПЎFЖ“?їvяуцOOŠёY,mНЄэXЮ‡Йw’“ћЋ‘фрYЉ^Ямєўщh:Ofzж;М'9ћ9xVxњ}2ZыtjG_ќхД“Š>>YŒ?Ћ™о/энK:эFЇ]ЯnшУщтxyМˆFеЪё08(>:нЊЄэ3њѓхbɘEƒd Я= ŽЊ…нUуTЏ~љwS“яGчЁ‡I5žѕRВУфKх \oЧQиMњŽR>8h’аЙ$ѓіяю=о?ЬepЩKюХ^8 ‡ѕЄ*’Џžџ-[}ФккљщiЁVoдЫ…/§)(ѕУqПЖъ;’)ціжУ7o?*ЖњУaЗ•оу=ѕСА_[wxћЯжЃпнЯЏNњй }и šынЛGo›ъїšу(ŽFЭJцњЅsеў Л.мнЃЗхёЈ8˜ЮЂ0“ЯMWіл§Юz:ŸэП-§fЯт0Лџ‰‘oЕзu{tјvІѓ§еSГq9ЕP_TЌ­Ыушн˜TGЯТ‹OлГфhНmя?{ћA1п›DгЩ0{Oе?vИџллУњ0ЛYnœо:књюИжь4ВЗDџE_‘эFщВЙ‘|A›#ўT 2м‹~J)ШnзќџP­ІрђZ~З’vˆKЊїТpИiЉы§Iћйќњр|ЙVЏUj…+ТxMКidњ’RНнэїzнv§Т…gНq|ВˆFЭTb}VЙеє{ƒбhиЛPО?WЧёщI<”вIіiХfЏпЋ”:у0З?Мt77ŒN_,gaцІКвkЩ ЂxкџpJ“СљѓWЇГI/ЅlŸTы {ЯnmџкŠ’•"йKo/*…Цhётхй"Є№Џ4Уђп~sЛ&Ё“Ђ~s7Ao:‰цgЏ^ўОˆ‡щFќHЁ=ьюнКђЭЭ§сdВ §І~wƒ`<›/Я^О|q6ŸRyQБйЉопКњЭЭg§p2N–ъЦyЛёS„‹хщѓW/ž'ЁћiЇМ кlџИzх›Нn‹IшѓuяvtgЫгГчЯŸŸ/ВЖНдšх`ћкЗ[wzуQ7—дєљLп ‚\?^žœ=qvœБ™.ж’Œл[зvЛЃСъ&ЌœяцЩL…Сlyrњќхщr˜jЦWХА}mћоAs8ъ’“Rq5žЬtp?з‹Wu}v<9J5ф'5уaыЯгфuу‡ >œŸžO/v%йаEгб{бЖ“зе­ф_Ђ7™ЧƒBjЩ>­FQ4Шџ9p=y]ћ6ю6Цq ŠЉEћЄмp6'яЗK7“з­dКo|П[jwZ™kѓ­x9Ÿ 3zЗ}B~МXЬЇiчИ”ЦtОXNŠїоžgѓCс­hКњt}šЫтRё‘rЯfгЮлЌЙќgпЭбd:ъжV‡Щн˜+mФTЕvЇйо;8ЪЅшЋrЋœз’фб^ЎTЋgАѓјXiЕˆз’ўєIЎкщЕ6b |ѓxьцн xVjFэ/М=о,yЗ“fфА> _x{6М)‡{ЛЩQ{4fѓsЫEoBя>KцМ;ї7уџоЌв{‡ЩFЏЛеБЎщѓьGхXя‚wЁ7ЫF†оˆЭрПЃбЈІсв*э^ЛYN;Х%ећсЈпN;Х%5Fгh2jІуг ХЧЊa4УAvыКPЋ.ŽUТйr1ЕвШѓuњХЁVД<]Fa78_Їмn$?kяёёщ" ћQ9‘oЕ’pяеow-N“агA†WНJх№§™.уљёщЩ|6fwІ“ѕcя§а…б|О<>^Цгq)ХT_?zњAMЗуEbGa†CŸ{ЏІs§h6[Ьgq˜сšОшaО&Б“ЂЎ}љЭYёнƒЃіd6ŸЯЂЬnфЙB№јс#зwюэЗТx> Гк3kерС§†ЖЗoўдсtœб™Ў4ZЕроЯŒниКv=YSf6зщbЗп­ЗL;ЧЅt†ЋVюЦДs\FЁ7%ЫкжwiЙŒЪ`м/mZшBЛПZ 6Ћ<‚b}Е}яќА>ЫючЋЯЈn`ъbeƒšЕrЉДyЁЋЅBжшеЪймЖ?o3П•tІ=ОЩМячгŽ№и;Џ“ +–м†х=WмМ’р3jЕД\^НлkVгqYэСАзL;Фeѕ'“qЏ’vŠЫЉŒЂ8ьoXYїЂY<щmVшvЯЃIПžvŽKФѓйdинЌанpŽ6mЭЋѕ§^ЇБYЁƒRЃеn66ыFLT[­цfеєJЃНЁƒrЅœvў6­Дќ':ЭД\^ЋгH;Тх5703ГџКГэ‚q{lmricron-0.20120505.1~dfsg.1.orig/templates/brodmann.nii.lut0000664000175000017500000000140007463150464022756 0ustar michaelmichaelџЫЫЫ=ЂЂЫЂЂЫЦИЫ Ы6•Œ˜^&QL^^^zHЫ€ЫПl†f €Ј‡яў ўZ˜vvv_e/vОЏКCўўцјўЫЪўЫЫLўўўўџmQ•=Ы6^ЫQЫЦ”ЫАŽ˜6Ы$EE/‡ ЫHfЫf5ШШ5f €BњњBўZўЉ;VV-ўCОБмўЙјўeўuCўLКeˆˆџl^•Ы6 \8Ыl'CЫ@ЫЫ*/6SАЫL CШЫЫЂf €ЫўўњT!_ўŸмhD;5ўўPўT1‡ўFsCўКv‡‡mricron-0.20120505.1~dfsg.1.orig/templates/brodmann.nii.gz0000664000175000017500000052501610403130564022573 0ustar michaelmichael‹c„ Dbrodmann.niiь§Ыq#Ыл€љхhДPЌš:‚б ,ˆЫF‡”ZШ ­Ц€Бa,[f1r`М 2A uЯЫ›зЪЌњ<Яџ;н$P•љC2Qћ[рџљ?Ј„ў'ѕ?Њџ—њ?ўћЦџщ§ўЧџ“њПє_§/џwѓ?Лџэџ!п>єџKЁTэџИOwўяџ‡yлџїџ0ћ_Ея‡ўчџыџ­‚ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆhзŽЧН_Q zЃŽЧTП$К†z‡‡НV}мх‡•=ЇqєёИ‡:{ЪЧбкЧ­еЧЂЭГЪЦ(яX4сб8MћzѕБ&zЋ71ыЭG§iИбўX>юˆ.:Що]›]?*™ЗEчwѕЂЗЙzu•дУ]ЯŒvеу]OЖй{“тЙш§(щGкш†Њ%уаыяьdIЦЁЧЖ-ђ’h""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""њл:їt|E5шm:і­Ѕ†%gОѕш;ЦUSжљam0Ї~ТquС”гуЉЧIŽЧЂЭг6C›3ЏBŽQZ)њшAЋЭзњZvžѕk‡gП&ЋZj…щ_}­ƒођЙxНІЂћ#wFЋСŽVЯ~АЏ™ш€К­дdlБgPЇщŠеј2гищRвtЭC/…nЌ QвдаaQJк‘УС=Ie\ђž spCJFЯтШъЭDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDєшxм[PаёеЏˆ>О њx\ЏЎ0DъLк„5а›ЈедЧ-бGmЦм)ћ3Цѓ ‡ШŸбЉtэ›FZaвЉыЕьєэаЪu—Ђ‹ZEйцtЕЯМЙКzcu:`оГаз—C_Уш-йзkЂz8p_єРО^“бЃzпВ0ђаxkЏхШ:иЫnЭЕ 9Чња­­$чXGМхЏК$уPг<нЙ:уанX•Єj^ЋУ‚’tДва-IЉŒМЃŸwєЮ{crd§f•!žпнLDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD™{ :ОЂњбЧ шcA’цYІ[;a•A'в&\1Ъq;є4ЫqЭ„уЉЫэмGБkё :Ксj‹шЕќИ_ђ%sZ6ЗFЛѓж@ Че'Оі­4wъкшад•а]ѕђа§зgBЋФ•Ё›Гэ…NB?ŽЙюЈv6GЪžм -“žˆз(Л)кDфЂєіhѕ’hЕН§гP`$œчEoїы‹хШ:јъ.яшДыДeюo\АлЃ“6Џе§m[n‹’Vєцъ"єё)аy‡їFЋ|єё9аY‡ыЛ-^Ujd_Ё_СЌ6ќGЅКНЂYНш?Цet<ю-(шјŠъшуq‹‡ОЬQcКу&шy–уЪљњ“kGIžЪhе0[ qщ|ю рЂvъZaЌhclЧ|ЭQЫЛСегм1g =?Ќ†hqк*шњлУ0;_ЏlŸЙWЗ@{fЎ„nѓ4єЬ|MDїG\Џu‹•–ЭZ%Ўt]UmŽ(nŽtїгИnИдю#0їFвžžн^эrГб:hЧ|ДЏ€vЏ‚Vkа&ЕщŽ6_ѓаJDыуЖ2jœ‹ž vƒп^LFв‰зх„yˆЖ›yЉНœpм­џHЫаЧ=анd:"­A_ыBŠє_\Œ‹љkм†х™НшvРщЏ*яшН$к[ПжыUVзъ%бѓuўЕzI4MЧ-чЈ1лБo§8ё9Žѓзы‡jЏ>кеhИ­д?SБZІъzKдuъЊƒ•˜зkНёj™I„Џз,ЕOлэNšЙаОn‡–fЭC{z\щjfmiоМнqѕЁk/њДЉОfЉ§шn‡д3+mX}‹sћ?Ўuе—kPwфФЕОnІ6Ч4gЩ@w?а9m{,mЁж‡”М‰OEы„Э–њ•а3U[єчGnѓЕёаГ|}к”6+ћ­S-єЈ3PХ—ЄkйuGл]y Ж@з^‚шТŒзšфZODkLЇ~ є5НYйcvPУœЃОъЇnˆVЧЋNW‡бЕШZŸљzMTї‡є‡nŽїє<нlN\kCнr{Ия7ІyЏзtЗжусгщЁ}‘К?ьуЅeЎЉN1Gею mбiъ\tу•еЯп§ЎмдЭЭ‚z-кЋYRѓЬЖК7jж&hзmWЁч/ -vо:/..КйVѓаЪ~Eм эSЇžn> ЗBlѕ2hНьбдSЭЋнОшфSCш-ФУ4yцсxн ЌЄ_c2гЗДкЦМ~љyXщД~awTєч\?Тfы\Ї…њ2ф.э_МwuэпБыUІ8U2:Qї]ЅЁfu=ќМі4ЋHЉт’›CVbћkГѕЊЬRyИsў,Ез ]yРц8њZwМMазkžztџ§УЉ›ГаЦ™­Ьюы–‹ЮP_wB+}Кы5OmžкЪ,НCXІЛ.E†Й\†s[™э'ŽБЇqтbыъ–лCxКOг]Ган!WMнэЊЛщЎvQВ•нnЉGœХ-—кV— =цzП Ф—ККšYR;Šи[/tТRЁеm`Nй h]ZŸ,ЊЭ=НнboxмYыЌŒ— бv&ZЗB{еЉчяaЖйЏ‚Vб§У˜Н4™шkН•Ye.thЅ[™]єРШaлЋ]_…yф…Ўь4ЋБ6G]“šqХDn kЦѕcЈ­ШJћ'іuctV‹ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆhьx<іџЕŸІ›ЃТŸ9:Щѕ бޘ̓z]Ьyh§ФЋ=x3Д2цЛіe˜37Bї7-ѓ]Џ™jѓдFfёТ<пU+2Юх2žЈŸл -=qtЧI,ŽnІчгW9=6Гї@[;#ŠЖЯбжМZМВкъД4l=t\]‚і˜ы§]ъыk ЅЃnnNZъ:шŠцut„sUВЈ6ШЙhY]-АsжY9/.л іk §ъдЖЛtl†оТМ­60ЏG_CшmЬпУ3:Д=к˜]ДЪFЋ­ЭZešѕ_З +ё—мѕЃ46зњЇћmЭЦ„ЋЧP‘ЕWЁ§k=Qz/ј1щ/љйю[~"}•ЙŽF5XжиђTыЧЕЋЅз}і–mЭЬ{Fg "Ѓ[‘•Ѓ ™џю!­sэT•™663Vbђ2хњ!–П‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆhŸ^№ЧЗћlwUo}ŽЫ‡Мз.eЎеѕjРьЁХЙj lVѕ'8&LДr`ЇŠшЃ8OsUtеZŒ™Ž>^ЏзъƒnЮeGЧlmЮ\щkЪ/‰^iN˜сrIыве~sxfИ^us2К‡+y˜Šф$tжГ№)ай—ѓм6jaL}ЖьынеД6лCвi’а§Ѓ“‡ЉGNCЋWA_—ЏOТФЇa˜ynЕЯЌOќxІВwF_—Џkн—ŒОZЃдF‹ь‘zПPqє№ИЎЪ:sGtїъ_шў8К‚YP_н’а§‹Н}цžшшЫKџТrMAWQ'˜S^ШЧзpчЬmаВњЯ”И=к ‡З ТI@[мэžˆžЯDћ†­bіП“\…nkN]ъsd/з4ћи&9-Ћ+šЧB ЂJигuбГ§…а‚йTЇŽйг5бЙНzд67AƒояеЭъ^m_<”aЎ~ŒRЇЁЛуоb'ЂU€мd{Hъм‹GOwбїVшРZчу[ч&hџZчˆєН%Z‰OЧќA6\чЉyŽђЉюFЕ_ЈтЕН1Кв@› ‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆш +јэн+њья+ўЬђтЩ* Г•Кв\Ћ?#>2ДgЎ #7QЛcjг\+ =OPЩю.†Ž^ЅЖбе–м;№ˆюдє№А•З€О^ѓб‘aWЊcƒ_‡j›7A'ЋЏiцUшшрyшёРЦшФ•V—K*њЁО>њš†О$ЃW™eєѕЊн‘б—K‡–ЊgіЁЏІ8Q=ЇŸ^_ьлзi6 2кp qіЖшЋŽАћCњ?є“ХэбF=N7]ю’6Шtаtвtњ^шдЂ››ЂEі8нК•Оn‹О]’Ьšл<Н‰9Šžэб‘ФѓЖнfбђa‰]x“э‘ИаёwУkј6Kˆю6HlЈў}ЧSэ„wЇКЩю№ПЯ[іŒ[УxwК н”ьW[цЯИ9Ж1ЊЊ/цѓ2'ќТ•€ЎG–б™{C%эщжшуJtѓ•Опk x}ПзEпw6:xѕшчЈŽvдUбїъhYі? я аЃњОэлвї{KДWˆVaseДЌЮўїЧб-nшY-А3FqџUь~oˆіЌѕ=mаlТW-8H3В [oЯЫ^zИXяц.BЯ:^уЬИщUац\hѓ#о+Ы­ѓlы.GЛUЃy†voYyЉ“аuьюРšЙP}НW ouЭнx:_CЏSЦез’ѕЛRКѓ уцЦш‚•О>:Y}}=єєФн=›/—TєЕџГЅ9}IC_.;ЂчIs"њ2žaTгьE_ѓe.=Йqъš§ш~Кєr˜qvuq}=^W ЇГыЏГO}е+DO=5zqЗGKъk zЫ•Ю@G‡JDЏ7GбйWuЅЈуцшЮшчЊVIш„ћиml8Q­тЛC™ODisЋЁъћ§ЎЌ$tB1єc–zhuП›ъBєїЂћY*‰'ДыЮFы+-‰ЋЂ=ъŠш{CДЩЮG{ЎЫ№5бВК`ЅEєН:ЊNDЯ;Фcо]№яг#кГ9*ЃEѕуыћ§zЭ™ъкt4i‡Vї@•Њ,ŽLИУ Ћ'Ќ2HCД;Ё*˜mkД=a•AšЃч еЊ‰Ж5Oѓеe3ДЊ4Ч}Ћ9˜ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆHЎћ”ЫН йшmz=1§>ЎsѕkG)šsэљ›š—YWžОЉyžyՊ˘ћЩKЯлбМЂз=y9ŸнэДз32ѓ3ЧѕіЛђЃ7}Бf*EoњbnЯ•ћ™єЮ8еху€Gћ–ЎбYˆ>ке"K?УХє5О;дч5і W5Г:нЛ"›:хwФkнЯSЧЌд}. NЫc^ІИз1ыъћ*єеƒОплЂя аї&hЯRgяЯХЃ=њЎЭ•^лЇ ZTпGѕНmГњnLдвџЩДCћ†ЊlЖдNщу\ы Е–]iœКриŒ; В~Т=Y;a•AЖDзЅ1ZUšhSГ1]Ѕa6@ѓUfk3б+5}шйоŽœzяK‰UV ЗЈб†ЎўL9кUйЄіxm/5пd•Е™*ЕЩ•Й.Ке“OœЋж@ЧŠ‹0лКЩЖйЫž)WА™yЕzВ>ёšsЗGЏИњэhЇ/;kGsfчОЧ_§ЛЙW+ }~ oп`VнЏг`~єЈ);lЏЭ}MF;ЗэwIќpwНщЅЯšЊню‚- hOuMT{ЧЉюvG]nЁзѕќ €ЭЎЁwзB7аДž&ЈВюђшаюКW7шYœƒО> ZЅЃЏMбсa_}5ЪЕ;|з•.D7\щШАEтTtЉ9ЌюЗўkЁ—'nд|к_ŽmgЮyІЈѕc›™}шЋО Хбѓq кg_aі ЇI sЇI1OjmœЪhYmю‰ЫЂN!/kи&ЋЬЛ з‰}j:8а†шS}ID+{SћЗЧjДЄ.BkЧ]іF_RбКЛѕі8ЙlпB—Ё]u{tЩіИюŽžдŸŸŸ‘Б>EsДИЉЏvŸCaђsЎ;ќšїКSлrA­" =<ЌЙŸыДZ}š .w*њ3$>Юs­E+ ­–IC­т[к^iw_дFЋ У›љX ­lДoƒФЦ‰mŽкшћ§.LaЉу#}^Е_^ЄѓTBЋћX0а5ˆžІЉ‹vфЙhхC3T'ЋW я-аЪƒОЏ@п7E/юўыѓ"ЖGiег79шсŸƒЅQкЃэЪаžЖBп3ў9}3s\]oЌŠшШT•Њ žfѓN™;аVфрŒ†и]e–h{Т*ƒ4GЋ:3mkжчЋ3ЪІшеуд,aК*Гl%"""""""""""""""""""""""""""""""""""""""""""""""JщІЗѓ(eгNXcŒ5–ЬXaˆuж@7W7FU„эGъђM˜Эіp>шВznєБzњЄOul‚>Ю$Z­ŽуЏzФЮ№Къ~шъшcCД?Ж1К*y„]ї*ДЖ—лˆU}ДšзЗYъJшуђФMЌZUбуЦh5Ве™Ї;ћy ГВ_a2ЯvŸ„л4MЗнъКшЈЋ3ЯЕЬM|Оvц‰ц2o‹^д™ч™цбjpŸЯЩ‡ŸЧі$OœcЛУuCWЕГъзzОёйх zЙэщз{0+ЭМэ6Бf:'mmч mŸіTч$Е}LЫЋˆ;Ђ=зѕ|NљœtџBWWЛc.Sѕа‡їœє‘є!tхп нqsНN•ŽkNPу!иƒъпвk‰Z2—пdжС=ƒ/шkњw-;Š.[щWD_“аЅцє,NG_wDлKœƒNQ7Fч]эЎбСA‹аг~кiЁutЮs0]lNG'Њ—уŸЄО&ЃOЇWD—›sа ъk*zЭ:{ауŒгє—ЁИz:NS{№ЋЬ>t7зеAGд—‹­іЎј:є)О-.—ЄЅО\lД›Ќл шsљ єyёЈнсWфG{ W.ДЈ.Aw%ЂЛIŸ}ivйstД$t^П=ДДаŸЂЃ}~ h[н[ЃuuннŸrЭ[^дС=}§\ 54ЏНFkh ~ѕАѓЩW Мўi8ЋѕіЈаѓ2UДхюСi›#Д›ЈэЭw4д* |CнэЬaЎЕŠ^ђњuўОЕкќХ6z™Ж6‡0^=єC}яZV§#„ючЉ„ОOб бѓ,5ЬJнŒyђаjљзJkН bW}з'+D[Ѓl€О›Г …QЊЃѕн˜-=( ВњnЬ–Евњp’ЙZP[•ЁХЖC'є’ш{lДjцe"ЯŒујЩ5ЙšZчЃН+нНLћ— kŒБ)КЪ ЭбЊЮLлšUЅ‰ц!6AЋZksз‡[;X|Ж:ГД‡Нx7ГнЦX3aС”ыGˆЗ|™8cєЭœцИњCƒї@Џ&ыУЩ3цЊ=#М0КџЊZmŠЎДвГz t­эCчЉ}TНxъуБ z\сЪъ-ЉзЂNбУпебЫа/Ўbю†\ь5бjме_\LМ ^ƒЖЎЯ ШЛціЈxeUнlCйъЌ“t#f`тѕшFHwfcБѓNн m^EВЮмc?ЭS>І?w%еy3_ЗCІ9Яc Їœчv2Ћ‰Н нм(4Ђ{NТсzы'bџзyBЧ–ћl4QЗ\pgЎtє№•aоˆэЬ•ƒ^6гЖЯGwЎTє№Ѕ5JЕ;ц2еФL^щўKС\-ŒЊЁЯyh}Œ–+- МмrЖщ5}гюЉe6ЬCJѕХбЫЗWY-<ˆеh;н}DkцНбЊџПОЫs УƒŽцyЉhГНбѓЖxєuЉ—\RбнэЬaЕiV* =ВњzuдшuГ€Ю1ЧбЅцdtВ:]lN~"ІВгЭЇЇA_“бЇзCŸж˜е)йœЂ6ofбг„гь—ЁИz>pAЫјufuду”–ЙГ|І˜/ЫR{V|хB‹KmэŠЩђљ(0ачЇіn“ЕшЧљ[6GаŸ њFŸњж‘hЫннЯVm/vК+ }к})@_šЂU2:.VкsёЏC“Ў0' ЏŸZ1ѓXxOїгV@iъ4tР<ь5bMmС акQ^s mЂ§[$6SmЕ oЩьnŒJhЯqи* эпЬmаі$ж/ЖIOУР3АціЏzŽ:ЖаЃ:dжеkбѕН/ˆОЦб§#„ІЉ„ОOЙГшK„žдв`їEН­юfЦЯш —{œjBЋBДвV|#s?щˆЏѕќу˜ањ@[ЈнЙrбч&oы‚ sЅЂЕ#mбі Ы\Г3­$seЕ0ъб‹О\<Ѓ\.к:[ƒУW2/#щ7ѕ›tF_ш‹љЃ8кП:3VBŽ‹$ =>&UmwН^—Ÿyњќ8ГЁ:†юыьўŽЁЇяњ“v2ЯшIDkw>њš„6ЬO€юе—4єѕiаз8к4Ї ЫЬaЖi6d~єrJCt€}д~Дmn‰N\щыhѓЂU>К…йD_“†Лf ‹Эш$u:њtНњДЦЌgЇЂдз$єщДЮмЁѕ8с4љ№ОтrН~Ц›\д~ЕYT3^-єхѓ3ЂОXшq ЩМR}rежЎааAѕЇƒ–ЖЩщДZ=B_WњsF_кЂчжЃ?гаЇЇBw= zоЮБ-­њеўtеЭа'/њs):м|Є}элŸfifC]{wшjпZЁЎГ‰NRЇˆЬkШѕQDбž­QS}е38yCŠf]O}Mjи‚“еfѓfГ§]нєv!k†nŽъhk† Убщ Fќ;аб9^9I{pЛт`еЬyТS=%Кћ”ѕmауЧЙЏјTїХ|Чйѓ1Ио.NOГiф4tЧж.Dm7БežІ;ŸГбчѓбi#ѓР>ЁѕvцnЎDъ…EЋY]џНF:к0].žS.—љQэДдк\ѓвцЂU[Е;Јfž7ФhіЃ/ЦіPЅ^§ Єaѕ…ю—nVЧбУЁнб6кОє_ЧмqЭ†EЫE+ эО;-\og5ьДkЦ`іЈћ{ Г№њ"е}еЎt9шю”ыnшЉn—^/є|пpЮюшыЕЃдG˜Ѓъ"єtЦ ;u ­ž}5JD/'42GдZEа–Й)кOЗб*ˆV[ЂSWzTћаŽ9ŽnaаЪ‹VљшBs>:V:њt*EŸvCŸV ƒъ†шfuzАН№Ћ]&њz”ї_7e9yp;ьi•ІЙЧзшычglЌщШ­œ%?U0{а™Ўњ3­ќш•nњjЁ?аŸ9ш›њE/ S~šK=škЃOqєЅ}1К2z ˆўœ‹Œ7ЄmЋƒ>UDћеuбЇѕш”ЅўL&OшG) ]}ђ ?‹аŸt sТўј4K4Ъц:h]-ЏѕjД‡МцЕхS'ЃЭуšэ G}4’а$Д9ршЃ…VЩ{cB§ш*я˜Мjm‘sбЧMаі,ЧћŒюYсq,є§О к5%\Ёuѕtš3^EtЇ–gЙЯ%§ЊеБеu9IЎZ›GŸЋ­$є0№]WЏEkѓ˜“eЃЭС„qfѕjГžч+ECŠтћp єнš.­юѓsДЄОгх ЕErKєКyЊVˆЎ1Ђ*­H]eРхЦJшъ?NЯ05Щat­бъi­i%j-њндuбЧеш~„:ƒ0P%tмН=о1T[tDНm™з?дuаЧъш К њиbW@/ЎЇn‹Vmа~ѕzєQUE›ƒЩђUшIYuЈ—D[?ИЪшyм–+­„Е^>zЊI–wH9кgЎєюу…ађˆідчЎШH§1!Г9_eєp‡cГЇCым­п!˜SаgЏйDЏ1+Q<~?n“sњЌq•cЦ^%іќДєЉЮzIшGТž[fЈt‰і>’&шЙУyЭЩhA]“Ќм—1е9U}ŽЈ+ЃU}|ZtРЕD=шќSFз^hњИ§)˜kЁуъBѓgCГяЉ8ЛгЭвJ›ж"‡аЧтkЧ„>њб+ео7{Чу]G?Tyшћqєё~ПkЫœƒ~œFWл ‚ЙoREвС­бНZœцnЉЃibпh•Ьj";seЃеч5<аТ^‹VwГшi(%ЃЉkЃЛљК)—oГSуЃяGrZ –б#Мh–NЌьъЃ=ътY&tЅсіDЋвсЪаљУ‰hU:^‰К`8­ŠЬWk‡њмг­ят€у<ЕШAД…“Ь6ZЎž6ŽvVКнH]"КЛgth6ц=б‡Vв0ЕЋГ>њЩ ѕŠAЌ+"=Ў›Ш8y tƒ]и?Хk ˜ЅѕЪ=iўW›'ЮїЊўЬљоЊ>u З єfН,zoCvЏŠо›@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDџ‘nfыG(bѓ)эjЃёoІt­њ0Єс6AЏa' Ÿ9A|Є шyet^sз2пЦj˜ЃшєYТЃT[rkД–шЂЅIŽЧЊSЄ жMYј щCн‡yе[™РщКЙk-КоZЇ ЋбЫчНЕF+ ќВшMдkбЖy§ІNPW@W3ŸК`ЏFѕаЪ@7[щлkЂЭj=tHН}Даеў}Н =(kЂ­СŽЕбGЙЊцзDK[ћмf8$й\яBэU—Ѓ}ц:/у!єљUO‡$ЃWЈ=zаЕэ7—ЃН#VA;ЏнЦХКЊй}uŽЃ—CДv.ІUVкѓsГVќœ…>ћw…ЊБа шуй(§HWW“EДuлЙэQ/SЎ0Kь†hmТuhнЈЬMW­OИ­ЌA=h•‡–дц|•аGѓЛСмsех"Žqy4<&к7п ю<ˆ}SЯPКГyб— К{ЎH“Ў5;П[є›C[щKкЏхЕбnгтihI}ббЃ;aєvшѓŒОDа—щyњшщЊ‘€жЬћЁЏњњE_tєu7єѕšШз4tЎ9 } —Tєdо=•€юПžOhbNP_%u}mŒЮ3gЃSдЭббэЁ6@Ч‡ЬCлцЇB~ŠhU€Ю6—lŽї)Ѓе6шSW.ZyагW&:А2нфљцT_-uТ ZљбЇUшкBЛ+4_Х7§šyкЯЖЭqДy‚ђЁOХцmЛЧчсэ‹йAkГЎT‡Vx"ЇЂGі|уеМŽДA{ЭЩшOЫl^ќжЁ•Œvїr>ZЛЭo.C/ькшЄ….DЇьЯєчєLЏ}Вy5кЏ^žђ˜зnг]-‹‹Э шЯ"єчfhQНэ3зFЫањБТ†ЎdіэM§™Ё–аО'a єфў\…6ЌeЊяJwЧgwђ1€^cVўїM:>PzЅ:ˆОЇŠѓ6hk’A}ЯъSЭ`з\=ЈЅyJаw-aАzшћ]ž*зќHЩИЕњnЕТl(šGіJГƒюІџ+2+gЛЕb:4њс`аnЮѓЙкр`ЃMѕўha s]—›ЉУUBчЌЫсiађЙ–њxМнКџъЈУ'Я_“–|Ќћ„юл=}юY1ZџŒъ аЦ'т=?zИГ:<ё“ -udтbДrwЧДёЩыMWњxl…ЕэЌs=єq\”hлќšшJЯФСнэŠыЂН;ћќ(0NwwЙ2ZbŸЧ‚fйэ!WмдЏ–Чѓ™уhGэ5—Ћ=УљЬ^ЕvФnшc.ZљаsЉк?^.кГ?‚ц2txШХ^€Žн}ДЬ {њœl.RЇ {ЖJ@w%ЂѓеIЃІЁэЃž -ЋSбЮЄMа6ŽV1Е;i ѓ‚žWѓ" uБJFчЊ3аЫj^."њr‰ЁеH”H[єхтEїnЕЈ“FoƒжŸ}ЃYPЗ_ttЃыGКч\Rаjz:>њEїdЁѓЬЙWМdtоіxtцІnŠ>' ѕ…ncNA_ѕ‚k'JBЧ?к}э: =ŸБ+z,}m†Ю4_ч-эE+ЄnМаiшы‹Ёэ…NAgš‹а=яѓSD_эŽ6Жєu€uf­œ…NPчšещQњ:ТdДђ ‹ѓ˜Пf_mЕoЈх­МшS‰yD‡и6кYa7 нпц#ЏAћхЖ9­$Д6k>:ІОj†ЯЁј˜нQ–YyЭЋ—ZWSЊ™œ€ГИzЬ+—ZкгœŸйшOнlЂMv=єQCk{#э3ЏEЋ0ккаЙ+}Э^t‰йЇі™уъOCН\њ*.ДѕT<ЩъЯ umЭЗzЅНшѓ‚ў”Ь …эA'oM-oчhя Ьъ•NAšcЏŠЅЯC эЙpЌAо€ЌлŸюХЮF›§ъћPщюјЯoБаћRЧG š+.ДЉбЩу„КТ;<}аїŒ,q{Д3IОY™`qМzhqЂ|ѓ€~ќэkЊ њnЕЬS2–9Ђ`е•бн\Сu>ип/7є' #Љ‚Ÿ_Кz{ј[Ÿчp0е‡Уr‹o(aр6шљŽ>ЎшADžmо.ѕ[dЕѓ\ї‘hч54ЫћУНЊJfсБhФvфipw›syЬг]жhwэЫ6hc6mам—УщŸzДЋS†ќ gd йЪь,Œ`>h/ф;s$sФvш№гнт9цƒ9’1bCГ юB 4k?ІцфyёfЋlѕ&А‚Œ~-єДдСЭё4i4їIјhуJђЬjMf.ёk Э=§Ьш…vx}Дч}іszГlу liэтŸ3ќ5ь šlцжЖзzЖДФёЏЇ_h'sС_ЅхЗЎН%йН$кћЏ!DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDsяz;P:YёЄuFY7]ю|UйzОч@gЭXaˆЬ|3ІOЙ~„zшФIзž_2ыЪгAƒ zєmЌО њ1x]ь‚ОЕZщ~šqВ:hНwО= fЮQлЌѓ­љуЃ‰b_Ћб^}1кo­„V%зёСbцbh@RgЁ§ц:юуW”tДwœѕ;cž(ŽжW*2T№lуы•цnџSБ ZИs-:ЙrД{яVцbДx7шшЊћc;Д№T,Ew?vЛuџmˆІ<|ЎЛІžj‹НzOVбКћ%б ъhх˜W ЭqšЁ]ђ єQ@{ЇŒЕ:kЅWЁs5tP}~фЇЛ3Я\ŠFђГЯQД_-MTˆюЮKg—ЃEreДФ>O…ЬВлC.UїЇ%ЁЯЩhW]}єЎДЃ^і›‹дбМц8кVo‡>zаўС|ша$%ърpY›Cy—:lЎжэШЫЖб)ƒЗBwьѓ9Ў>›ъДЁKдiУžЯih]}n†N6 нн^„ЮTg›UmЖ+њœƒVЭеЙшIvЦʘ‡< z\ЮЫED_.уЯр™аj…аглm\3zВЄО\ц;ђїGCtЗ_/N2_TЩRЗE_’а3Л :I­_ёб™+gnNTз7ышK:wO7@_GСѕrIDЯgьˆОvˆЧŸщшщŒЄёOЇ6шk'0еєhЯи }]ЪA%ЁѓЬ)hЫЌа—‡тƒvGйfх5ЏWkl}Ц…œр2Эк3вžВтRыSZцˆњSSЯ7ъ—‘еhх1—…вїFŠZB›зОЕцZ{–ЌєРžЏ}Еао HРœ†ў4FЈї4tб'§™жбыwєп†>њбСёdtЭkGš:gЁuєg‚Й6њXВа"к{х(F{еїЙBє2@uГїZэAG Ѓ+miПZFЧЦкjЅMu0Vz…йp‹шœ‘\s+tpOч х{К꘨Шь‚!+Ђ‰rЭ‹Кћ;0оB_gіЯ1п+Ѕ–s4Є>тЌn„^ю›0}‡G†јё§с ŽхŒ=И:ЏYћюазЃчЏдђmwCїЇМВтz4BыпЭдƒ}pаСiЃЬгzJшБбFэ МмцюahUЩœ ЎˆЎWІйГ=”ЛЋšа*­ž­?-ДuЋЙдюШ5ЭzЙэ  ’й^kgфЊfЩ>П -ЂЅНn-ukВ1ХђўјЁ‹@ЩTo€Ж'JF[ъіhћ švO"њ0ŽЂНйjmžмЪ1Kћз‹ж@ CЕФ›пІЂmѕ†b7зš€џоGЌ$tЬќ -Њ—Dд{#э’VzoЄе!Н7въzЋќhѕŠшч5 Wщ=дГхlсї–чЫB{~{В^­fšˆо[чiІщhѕфhЅџ{‡zДОIіЖЄї’шЎW4П0zoDnЏˆ~Eѓxн{Е^MDDDDDDDDDDDDDDDDDDDDDDDDDDDХН;э9LщdЕа еТd%Г9ClŽЮŸNсблoьљЊ ВzОМ =c4rћgЫ™ЎЮ(5ІKБТUб)SЎtвœЋ њ?ŽОuН КУNш{К›ч6ЮV­з mLR}{їтKаг`Ю4ШоugЃ…1—™VЂ ОШ=Мтъ “љб71л‡;цZtы‡цSчЁ]№ЭиƒыХКеЛт‰hя‰§џвFJEпnž'c%ДpwsRO€Ю6—ЃѓЦztцXUЭ ЫаЧ}бeъс3оvAї3ЁGіэhщѓЏDO3з Oео=UUн }Ќ„жйЏƒ6‡i‰ЖЩuЖG}>ŸН=юЫFЊэQbfЏКПosX]€^6`.CKљйчГ_=о—ГЬ…hy$ћ|N@Ыlя<ъсДDѕ9-Ј§цBtъ9'Ѓ]uuД/П9ŠЖеЁiђеСб2бўЅЮR}є˜}ƒљ–:.шnV{o” ЇЫHДЋžіžpй(@лзО [кE/OТ"ГŽў”Ь.;ŸPЬ‰шOН~џ6ДЮNG{дѕ^YDДЄЮ0Ыш€Й э_ъћ\ZW/TG{е>txД0к1o„ŽŒЖzVЋttД>ŒouВ6œ;ДšхkЭ>єrЯ№Qш‹xA|Ьпv‡ич‹ш{CД~ЧAћќv }?с§`œ. ­ФŸ\EДіѕAS шЧ=}пmмz8Ьlн?7g§Јќ?Ф&jйЌсeДНдђР­аFehћЁW\хЕkžдТ%Кš:lбљYаЂYЛдТ5Џ^f/кМ€Д3 іљkŸљр3‡д ЬJ˜Ь+   ucВЎЖ: Ѓ5u#ѓђV4ХœЖдГК™йДkяю2бцЛН-Э=uИA„љаю;ы ЩKœяэˆЧяkэбnВеVЫ;ЊKZ` §Н>:Ќо›К$Ђхырѓ$ngGы>­žдќšhѕЗЁŸж,=щмліF:Н$Z9XНЗPhЁ™?5Z-2НЗOl‘НzљEFН*Zйш=eЁl™q й‡Tж+š_Н7#/а[ѕŠцзDЋW4П*zoAA/‰&""""""""""""""""""""""Šі>Зz€вVЬXНњ§}ѕ”яЦX3c…!ЖPПкžЎК-Лвl›ЂнЩJцЋ3ЪКщrчЋ2ШжѓЩƒДSџ=шЗЉШЩѓqЋƒцdєЦъП]m{4@ћfвд‰шРHЂпГаЁЖDюtd”бяIши  ая шш _}‹Nr§ЙцG Лijqћ?тюUш›V ѓтn‡юЅемгщѓbћзМ= ЖЬЃj˜ЇŒ—нЙhca‡iЊьшхqЛh^ ї`aWйб3ељТVGwЂtИhŽŽ”hжŠс’GrЯK(Ям}л­nЮО+W;шheшЌ‘rЬ+Їк ]`Ўˆ.TП"КФќДшрќ5— }|AєєЙtЛ ћ™ а‹кЇЏЖf,QлŸ^оmЭW†Жр+:0PКTЙCЮgЯ8чs>Йm#а1Ж`ЎѓT ЃЯД ж6M-Д4LФьQїeЎsОк7LФD{еОЩђаоQ<№ѓ9 -Бƒ3ЕDŸЯAЕ~wCєЄ–ѕ!s эЈыЃг–:†-uxЂџ<к`›dq{x7HlšКшŽ}LFŸє1NЎрЮЅCFЛ$m‚šз<-k?{Ўжj'ОКЇНњ,Ѓu::K]`]2њЌ vtђ˜IшѓsЁ]Гї’WЈЎжЩ шх tuctїзхrF{м:ЋwGы„Žsщ“ЬлDЇЊ›ЂЯЃЭU7gяъъh]}ЩD'Юає’wбJ@'Ÿƒ>eЊ/yшфбOЇ'@_šЂOЉlз@зОdєCб }Н^3аЃЂезѓdVaєєх}M7чЂ“дзыМа/„~”lЮAЇЊЏњ’NPч›бW­шљЫkЂКZ-ц­МшхЫkЂ:п< nеНjКшыѓS@k_&Ё –9 эЎє@sаЫ  -Оe˜І/CћдУлC§щpэФ…–аЇvшЋжчT`ЬЧНњ)У0т›ГЕш“Ьт‚УшщM­ Д0gZRŸLєФўLC/‡ЬjЅЃЅ k і8ŸrЬ^Д~ŒNVW?ЙњД<ћFs1zyи~sёEЯYщЋйЊ•žŸ‘ буоЈƒ6.#UЖДЈ> шЯєЇkЎqэбG§U„ўаЎКРь к&'\ІЕі^ЇKаЖњ%бњkKZоевkї*ДwЉї9sЋп1щG.ДFŸ\Гўњ 'Ђя^s!Z^ъћн‡ŽŒ&Ѓ'v5ДДжw/::š}їМЖ”Ђ{і‚wЬїГ-ЋЫЭ §~?9фЎœaDёШю&Јjаё=i•Е8P_eДg–љЏњууУD/c‰ЗGkЗлвхЋхЛУсs+8rГŒжn6>ъњCD‡8вsR7B;цI-ЂЇCьŸg9j6ЯшУсc†шх[ц л­}}аRЮJыwлы)Žл mмtpыOn7XКZйцA-нn ›ЁнunˆЎЅаQsЇ–o ДЧьE›ъfш кgDз2н H{Щ bCГWžВВЮ>ё/u}ГІJA;yl ЬГzЅйЇnBй Од,Ћ›™gyкwЩ“б[‘# эНP{–zГКЋˆ,ˆ>(ѓщбRlдПСp5Юž‡Дc~tИgG‹ЗьŠvDIhЕ3кfЛ{ZBяŸƒђЃћƒїіх їпcAДqяоRНTєоNЃПН7г*€~ж…NDяt яхзEяMвlЏ‡VЏ„V‹ЬX№Ї6khљБyžtЕvУS›чmЁцwrЏ€VкІжozjГšИ ђљZН&zЙ@ы7М*zWUЄ—DЋљUeљўщЭєЎЄ”ЬЕ} sз+šѕŽy3‘елаоŒМо–іІhEPoЯІ~Г+VCз3чЉ-В€ЖU†Й.Z“[цTtкеЭGщв!Ѓ… ВКЫо)шsњ№ •­ŒЧ•1~sє@Ц;є‚•n‚vЭђ%OMlеlЌ1{ЎЦ7ъЖhZшхцм RmšƒшщŽмm]э^9dєхr9kл:Kн}щ“Ь{tнD_.ЂZП9лœЁNqA\–RаЩ34@OьЫ% {СЫAŸNyшK+єщtЪ@ЇГ афLtЊ; н_ћваЃ!­вЭЧѓѕzIB_†/ЏзФ•.BЇ }]Ь*ŒžО|œ‘ЁN7Ћєэб Нащ›њЊЃU=yMRчoщєЅ6бЊ::ЧEOЏ?ЩшхЋt–yк^ієЊЉЃ'˜5дччtS:КdsDбjD_ єхѓГC:шщЋ}е‡  KЖGњ:‰Лc~.цЖшг бW5=ъРJgЂ=ъЃЃ.@š#lў*@ЅЂsЭЋ^ШНNъЏ$tО9§ѕ(бlЃuЖ]`–е:њ+­lє—fn‹Џвї!ЮBc^‹а‚к0їjSЮ8tcє]ЯD‡‡г5ЦЈ‹vдŽйDGFѓЁ}ъBД О{бС mЊ-єНъJь…~wњЙ фњQMѓ—Р}ъё_Ъ*Oь/,ТWš•пќИs@{>ŽєЃЫTO4І^‹і­Ьr_§сІ†“ХЁлЂ—ЛЌOЋ]Єz8h9W[MьЕfzЙcўxюСїaЃ?&r—…Џ–еЫЭM§сALДwЉэЧT­нzаењъN_hGи0gм†h§ЦƒЁжа‚љ !Ђ7е0 hуЖУСaїЯЫљk}—ЧЎ"Ž­ГžвіБ­?™kЃЅ…Ž›}hCН):Сья а J{Щ a+tHВДЮ> .u-tРНэ.uEГ ї\Ѓ‹аЭ‹Z|1ЬЩїsk`v7IЁйЇnAюйзТ•шVфСhіМИxе€япппtH§8{Ы•^Ь2zІЦап›‘ЧОПаЁУ0РR[q…л­zѓ єatŸ`IНMў7‡нбвWк-ЛЁƒл#tйO<ЈНєаed_tŸ=нЎпЏž-Ћ%єxлооОріPzoюPmЌўѓ$Ђmќ“™/}ЯŒі?‚Н•v/‰V шН‰n.кСяMвlzo дKЂЗЯже{ožœ…6nzZДЕьліЕљНU.њљЭТяЬЏ‰v~IyѓkЂ-цkеќЦCјцЉг”/c&""""""""""""""""""zоооі&фї6Д7#ЏЗЅН)Zoaжл[ф€m{“ŠЕƒдё˜Rи6љФ–шЭwшфї€YїtпЩНППoL~ф[+эщНoSq­2аБп—МъИYeЖ>—w­5wК9[Ÿ)eЉ“ЬеЦ<б-е–йЇ.@ЗSЛSеCЗR 3EбВZЉZšIT›Ї%šЗDKъ"sД:КЮzГ§БfЁw[jп<я)f[§ŠhяX-бц#ШF{Э-бюВGмaБ6\KД;q2Z\о а‘їMйшїшл4›ШЁ§Ї№qЎZhИ~˜ъ:`VšЙ†њсюџH\k?:pюЫъs-MWQŸЯ^tŒ-OзmюдѓЧьВГ+ }црJŸ}ъГŒNXщ,ЕPŸЃш€к;_[є9эWЗE{дчsкЧЬW-КЯЩhAžЌкQŸ3аŽ:2W+є9 mЋЗB+ЂcSеChwД::SEєбkŽЏє9Ч\­СKбi“T6jK,ЂЅ Hтебл^eyЅuђ аGз,>•ЕI2fhVД:ЮK^п\Š—г‹W}wД}ббњЙћ#ЌN3ышь]]-lhяЏ[6:UН+zљQДZъѓ|aИ8Ѓ]DtѕЅ>Њюр<їE]Цlѓrsў:gўn›Жм3YЫVљцvъЫ%}ЙфšгбЇSžz@%Ѓг?NшОTє%}IE†6шуkЂgT=№шыuAEWzјтzm‚žд ьыЂžP5аЇг+ЃгЭ-аЫ—{Ё——ŸѕhёЅЌРМЈ=ьхEѓj???­Ё>?? sКdGg Џz@КhsЭЏІ:ˆЮR ?5жФАоZzЇS mщ єч’oИO=­›ЕйжЁ­ьЙ,ДOэCwїYJЋДOmЎае6ћд6zdOf?:Ы[ъыЕ;Ш5Ї ѕuИ'lЎ„>M›bЊ=ћEї›+ЎєЕzЉоJ6Е>сззW6њqN*:г\­ž§еW‚6м~tЎйЇжа_к;šƒўŠЃѓЭ!єНяЫTбъѓЫ4 ƒєWьjfњ1Х}Ъ@ї_„†г\ЬќзщjjЭ<ЉJx8§Ш/m”Њ+-Ѓя2њ3jžіЕƒОWE jcЁm7+gC‡—КэЊяw:a4њ~ЏŠюи §ю&oх=C-›EwЙy„ЫтGJupћ“=?МjXpЏ4+ŸЙЛЏћлљмW/ZОІ‡:§щSЏE{fОЫљXрЏњp˜OѕмНм5ЃGр‡ŒŽбNі^У,ЃЕлuєЧlVкWџІcаїVh§іƒЁжWwўv9Dџ9IЃ+ы1UFЛf mэ“ƒ_эŒм ­пZ†і>ЗД7ыh>›­ћQDtDДзЌ]џiEZЈ›LЉя!ˆшЛgє6hŸ9­0КŽЙ!ZRWBћ^Ч Э‘ЅЎ…іЋ‹Ь–КкЄ'\:’бN•ЭТ‚š§ъъdA]нТlЙПП‹бпп’•&ўŽ C/4§й=ДНкXfНP•ї…\CoБаќћ;Yщ™­кŠ‡О§f‘яWЗЧZъА9віhѕ’h5L˜*м=фЩ_šъЇ0Ы~сШДЙhсЮНе|№Aэ–uѓЭвн;Ђе8ПŒvОxѓƒ;л_=”‡о[;&ЂНэ­иУ“dМшљjѓ…аЯКаІ:И;і†ъН$:ђ–ю9Э::є–doІUzoЄ|zГ{y–ozЖ$сГ›_­Тш}mо\єг“ƒшeЁ^эlс—@[›ј%ШЪvО†ytпМzњg…сЫW1бДЗG{В{лл!цsНimLг$~ж›йЦDЦ’yлŸэPвб{Б§ф$є.ьїDє›Яќ&~t}SђЃФ•~|ч1wmKађn5ђžіўО%{šЭЛдцсѓ6lm*ЏZsћŽyпPmЬфi‹bnЭ6f <cшwЛ-Ья*|ЩFЗS;fZ?)нJ­M0}GЇšЉЅ‰ЪЬлЁХ‰^-ЉГвЭ-ађDк<-н@ŒЖпrю~ќmђ#bйэAWWЯЃОZhн§шх; э9;Эмn{Xц”§^hѓЭAє{єЛљжБКйўЉfЁН{Ѓ%ZКb‡еЩцŠш[_ШlВCш љ§6V‡­vТKЃзZcЭ\=ШУЋД=-t-ьј—ЖEZ чIЊ˜oгhѕJt?OЅэ1q‹ВWЁ‡i*эщy˜лЂіјѓбжЫыдЗHВк‡Хr•ЬоGр.И‹і,qsє-КьЗ:N­ЁЖ†‰ЯDg™‹бі0›ЂKе™Гмц§с ѓwG):п<>'tъГoНКР<ЊЁŠЬEъWDХj]2XКHН+КџФфлэ8йЧДGс0смЃ1[їg к-:ёљ,w>Ї‘­ъ ЃъbД8[s }юШчЈК%:Ј>Ÿh‡mnsyЖhsоsmЉ'ЇoКж+}ŽЂMu:G]€>' §л?aKєљьUыwэƒ–ечs"кУЬ—Ў вšЎZ`Ÿ3аЎ:gЁmudЎFhCŸїA+ЂcSеCь5шјDЭšл1Eбчdq:Э<ВmАˆ–Ў ‰sl€V2њl­їžшубн>Д2нщS4FB­Уk›sдЮгO@wЗ>к^gZXщdu{ДМЮк>/идЕбвГ0НлRлшГ]~§hŒўК8Ѓ]Œэгj$ЇЙ/uГЭЫЭљтуё”МдЙЋ}бѓЃ/—ls:uLзD_ВКњ8›ЖЧЈЮŸвбЇЁTuєiЊ њ’…О$.єs /у—OЖLQє%jVѓЃLќzЭE_3Ш9hѕ7ЁХЋk9†ж/уЯ‡іИ=шŽѕљљiѕИeК;­Э^­Ћgєe"КшЯ‹і|l†ЮXъэО)е†6ЏB[ќ}Н^Лџg_`Рс€ўРЋЎžGВцZ‰6rжЇG/Eа}ZfпtyhЏко-ІйЋўбЃйOЮDGзz˜б6{ац1НКП]иФЭа§ЌзЁ$ДВаГџЇškіŽЄfю*єа№л­tђззW6њqŽ>ФжшЏОLєpR:гœ€ўšŠ›5ѕ|V:зьjFY…бJуšъmаї1ё|ITібг0Ёj-ѕ‚vесёdseД8˜fvдБёDs@] }П{ббё<шћН&ZRпEuї4‹Ї?аefA}аТyњ?КП—dЂц&“ађ ЇoVк>РС‰Kв=c›&Кѕ™щ.њю™ zљкн-н*ЉХduДžэПецЕXщ кГТYР&шz%ZxRЩpћaОЇЁ ne6мЫWпE }8|{r•ЭЪ]юяbДO]пlЉППW ev ГЁў^‰vе5оs„ФЃ9„=П=ъ&Yф0Zy_Шгщw‚љ0 ъ†тЁяsфJ=б\›‡Ж9ZН$zdЏ0/ъ бC.%И%ѕццА0|wўыЁ_pЅуўиєK–№Јі)ŒŠ№AзGЫїэ…мwЫяЈбЪГтOŒюЫл{kЧ’ЌЯ†жЁњIЗД ^ќ^й{KѕўєsНxЫЙhIНЗвЮхН$кUяmt‹Ѓї @§ћЇ4‡б;лќЖЧоД@/‰V>єоЎp2zoU,ёyИГ)žЁ|єCЊ§*h""""""""""""""""""Zн›ћ1ф{ї6џэЃНmFŠ4kоВ7Н­…^ўЕРzГкм)[ЬoюЌv шНи$Нћн5Шу9jц~žzcѓЃД•іѓў.~|[sњЭЋ~п–=N7њќшРж˜ЭлА—Щ&ŸWˆnЏžЇе2k><Хм\mLтпж1єћћvj“x2ъ'Ѕ ЊЕёѕmDЇ­t;ѕ2Мљ\  wG;ѕ2њ{*кwЗ„nЂ^з&ŠlŽZйшjqqж ЗXkaoxекi!sѓЕжFЂC эќќš mђJtу ВŒC 'g ЋЊѕ!ƒз<ёlаЙfу<]aЎˆ^†tgЉŒЎІNWЧЭЦ › mv-/яђх­Žљv‹ЉпCъЄбЋЛ‰nuаЗБdЖэ?}DWZцVЏDї[y˜ІЊ9Ќію”Э1ЂЋЉc$ЉзЂoб7ЋFшž:ORЯЌfЕш/@пьыЈqь‘mw-‰=е1ЫhмEgxWЊ­a‚“$ЂSМ5ббЂшœС62kj-˜cУodОЭФFgnMбЗ :wАЬѓR[ш’….S—Ѓп-tю…Ѓ\}<–Ћ­ЁJЭйшюCq_§PЯіёу˜+Ђэ§ЇЯ0M^‚j†gЋcŽЉЯgњ|~ZєљмЋ]tw‡6еЛЁЯCzМ=Ѕі›Cшѓ”=мYR+Cэ›Ў1њ|іЁЕ{Вбъє9 э<Ѓшtu>њœˆіЉ36CŸ“бu[ДШ>g %upО*hН™­њœ…vд•аuФьCЫзы­аЧ2ДgЉ#sекЧА9Š>ч k-ДСvIqє9™\oЁ wкsБN™І.zp;^Z9/ч‰sTGюЫлCћr(}ŠЦhc]EДzДЛ“…=m?€Lu":]-.Д‹Vњ™ађ:?‡нбіў№l>EѕMm];Ю~Дsел}tЭч‹3мEп=йцSuєЌО\.ъ2f›—›/Л#уžЭIшKЖ9ЇО$Ѓ/™{уQКљqp:њ’„О _ІЃOCYшTіљ’ŒдYф єщoG3б—g@;vtЛ њ”oў+бЦU<­іDыj‹фq™XhtКY-4=Љ??­Б>??/FqєЉdЁ5ДG- GЕ­m“sЩіHYъ‹ЁVКП­9ZWŸДqџuњщ:м=ќ5vН;UОY|Ih-я€к1WЧь-ЎўњLQы‡|e˜ѓа^ЕОL9ПООа†љыk<{кЮ[ЂћuNC+§5>тёСЗG?цКN}9цЄэбеŸ?ўРЊ™§hЅ ГхŽЁчsњТSЕ@щEЎ–xRЧа™ц8њЫ*zЩГOh€і хE…ЬЕs|mіЃяcЎ:8ž}є4L№‡ZIН mul<й\-І™ uЪxЂ9 Ў†Опtъ€2њ~Џ‰–дwW>^КЬмГMњнAчŒцCЫъbДšЭ‘ч=ЈЁ'JкЇ zЬНлЂЏ!h§iЃѕЯајy“‘ЁЧt‡KfgХлЁGјaVИ№љ†ўЧбуOЫЇ*кжНнFьљЖƒŽОћgИзG;ъ­ЙчІC~$ЕР^gv~„~Г†ўАЬ3Zл 9жšяЦэкVKцјQу†ЏŠОзAпНsЌ‹h§ b˜Ÿ­Дю^ац3ZИэ…ж/|y#ДЄžГЭЦЇ`KЗŠjqMšЁПyбт—К“šЃjв‚О я ъ§ья"ѓ ў–‡ЌhіР[ ыšе2ьЊЭ1Љ71/ьщ‹в…-u}ДЙEОWЂ%u ГrЬkа‚К-y•йЏn€6Ÿ‚QДRЪwз|~sёТN2ќfQнЮмѕ§эE+я7>єїw[l.:дцш…J ЊЗBl—’Мвšz;Дъg Њ"`Ÿ•VЋаj{єА;‚ЌШCZ–zStt-#шУш)сIЙљ1у:сX›—Д–Я†св+ЂЃъ}ЬхK­іDЋаоіЂwдЮhхYё'Fїљ7ТЃѓд{cЇ^б~ыєъшЊяM]вMa§оRН„mёtf -Њїvš КЇ7;Dї–'4 шчНи-Eб{Ѕ‚шНqо^­МшНaС,5ш†™ЬA+љ*ш‡дјцEаDDDDDDDDDDDDDDDDDєк ŸDџЬѕжЗ)џ!Яд@}{ БпоТїoм ЊоЌЖwJ–ШbкшеІТ6Н§’мUm+RН[@X ЗРСћАпƒ-›пœЯžnmаіNш7?zSuџЙчЅžАУпђх]ќHѕЦцаbЧНЩцўжїЙ-ЩZ^Ъ эЙяMCoДиQЕšбВк0oИGТФ8T@ППoЇ^Flk?yИAлd­еѓ№жЖ їoЂ^FOF‡юпd­э}˜€інm=єvjЩьAЯчјбЉ3абнсlГVj-ЋЕГќhAН'к8ЭkюЭ—Ккm7ДuоŽhсgщA;Їц ЋЊН“ФЭ‚zєкъсУ}гаЦPihiјt7„ѓ‘збЦLУЧ7чЂ…ъЁ­Фйъ˜#ъWDŸЛDtOcДпBŸЇ,є|{6:‹]„žmgkДs‚к;_SєYЯcА§О$:Y>Ÿб>ішsZVџWб™j›FKъР|UаЎкQEаЎ:4]ДЭvQ1є9ƒ\eOП,њX†V2z#ѓ1bŽЎєљйаJBлі tЊ:Šж№’YD›‹ž€m…>нmBыЫЛhУЏž-Yэ…NG'ЊгЧsдђ2 шŒ9Њ/ѕбD{і†БwrЭ ажѕУ‹žЏ,йцSтGг—ЁGгХюЂmžЇB_.uГЭѓЭ—KCДRЇ<є€J@ь ё)­ЧfЈ“аƒ:У|Ы0ŸRнЃ9}I4Ÿ–ђЬ‰ш‹U}ЩEg.tЂк ау!™цЌ-§_@Ћ$ДкЂЖ:†NQŸžО?Z зЬ‹­іЃ‡ђаЩf -ВWzѓg_}Z‰іЌЕ€^джXŸŸйшЂнQ„ОŒЫњ)Ѓ•-М=k„жГЏ.њг|ЂnАв=;єєŸО4жgЇжЬŸњ2+Ki“sаъфK@ыyдŽ‰,m9:Y§ѕѕ•‚жyœбШьW›?мЏЏ$Еiюдн­лЁ•~‘ўњВеžбLГЙжўŸjMД2ФІ:‚жЮ™.v­X §3ї%Ј}ЃЙцЏe jцLєїŽf7Fџјб_~ѓCэ§“ Ю4ћдЅhЅ айцtdР-аЂКŸу>–#vаг uYTш{Lќб'Вя­а‚к0пSз8„ОзF ьŸЛК›ъE{аЛЊйq?ІPЪDЉёYчCщъЛЁnƒю†юџИw7YћЃwŸ'иoпп8нЧ ўˆцћF=гOУ1KЈ„ЧЕaY2Ѕќ4ЖJW˜І7я;Г-Іўѕы б"Н [0xбЂyіЛ2kтhыЃЇл›уhѕk|:Ољб[ЊЛуЮ@ћr?œМБ9тЂћ›оХTonNDK?Н;ЊžŸŠЮнІyыХŽЈЇы‡q{џХЛU[lP­lЕђМi?­цъyєф И{#ѕ4И6U!њ}3Е§ѕЃ—s2аmдщшиB/р[Ј3а“ћ—Не‘а~uШь\ёкЉѓбэЁSŸg h™m-oЛЅіќD}мЅшюh‡і˜Дsj mЌњцgFЛ?Шщ›ЊшцwiСЃъњц%AaЎЉО…бЎZDЋЈљqp=u эЈEє›чэП‰ЎЅОeА%stkМпњЉЊšsд^tаѕ*ѓ4ј№…жŸL‡aџZлxщ№Г|­›ЛQцбЛ/жЏГК›ЗjтО9 §h8ижžd=каИ9 =м0 ]/яув$uбцЭYGЯъщћщEX™ћJrmЏГДд^єw’ЛљxVЃЕ“аt@]=?rа}їЯв-mщДЖЉя~uuєЌаЖк5/jч9ВzaЋEmмo ­KhKєјїЗdžй3кО{<ылђ5FO}?ВЬjQ+q™Guwъˆ‘вГћћ[u“ЛшсK%п~8|н­ї1С~ї8ЗNъ{Q е3KjаЃГЭњІ6ДѕбМмьSђ†фђЭЁЁEuэѓ:ДЋЎnV‚y%кйзЭапп‰fхНGЂНY™цкЋў–е аCщцРJ›ъяfиЩЌвб6FgЌ4шjшРІЭPЗ&Ћ:;кTЋMVZU0oЛж аЭЭЩшш~п1ХŸЄЂGxts$\Y65їХMб6д‚]=dt˜ѕ„hЕНƒЙGЏйй{˜;АZЃо=л_I;цЧЎмKЂ=8яЃй›;цГ==кЊ'G‹/4Ъџx’RаъйаЪAї7š7<Z%ЂїFкЙ›з§voЃS§”9hѕќfSmпВЏ,œM|Гъ.~ё%ЬB/‰&"""""""""""""""њЛ“>§Љ{3л›“д›]єШ qIPќИЖI0 ІєŸЦ‰d•єуи&/Й7§њ>ђщЬ*Н‡:ДЬoъWz{vаќXщ7э?ю‰ЬЯ‰ю?t>ˆюЗЧ€zг^фЃœOЬnmЃћ5œбОмЯљnlŽЙЃшљcъЗaПGбПњ§ќK§ВаКџ§йдПЦ'сјT4жп5oФŽЊЧуєлєЭћћ†ъї4ѕЏm?бмV§nš#hя…УEЗTПdz9о‹V[Љ…ѕ)GoІvgђ ІУ=:qЅпІ]эGKm…Ћ}fК…Zњ‘F–њ-њо-Nу5;o№МhmфmЬВк8/ОаЭаrtГэ‘cŽЃЗйго…~т•і›Eu эЋІљB jнГ=oџлЉoЗLЕ‰N^чю2RбgЁ‡ZЃЯ]^toSДпьGŸЧDєtg6:ƒ]€>щhуŽЇBŸНhыž\sCє9эQfl„Ж]AДЬЎ€ЮЛzИ,­Тjа hСо’К:0D1:МдmбЎ:‚NкЭ:fNкЁ k mu tpО*шcЬЌЂODKžЎ>ZZхГƒРшё+9}ОйƒЕEы [йодкїкБsTG›lЩЌo—ђNhsб[ЁOЇuh[ŽN§\њRДю{!ДgoLЗ–ЁгдЇu"zоя™шS:ƒm™ЯgМЫДyВЭН$yфАgtO~d›i*н|:х ѓи3њD?nЯBŸNeшЧёiшžz™ау?œŒ^NHA/ЂzXѕLsєQХан7)Cn‚6p^єeOДЕгч5L@Ћ|tЂЙњВ#кЪкв!єЅ`{4A+ытCЇ\F7B_vGgЉ K.::ЎЎ>mvл->V‚ЖЇ)1ыш“9LДoВrД™=пWпЇ–;švчpxџX}лС*ЈVъЫB‹ƒ9шЏюЧГ%њчЧZeУэOO№БŸŸJfПћgЬ6ък:ўЋѓеC‹ъŸ%лаЙ§ƒ9фGЫXmW:Œў 2ћб™ц(ZP/'|,zа? ш\ѓZєЧќЇGэEk3gЃc{кEkчжAч›%єO­Ÿ+ mѕЈ6&.@ j/к8яЃoўb†' yKЬ[›цўHЯnCяЊЛг=ш•fЧ§^ЉQ<ЁеИlкИ|˜ъq„z…9ˆО?ч№@УнгЎђ OMа§Фw=џˆ?ьuЕаЫЯbAKъгуцuшћвЉ›ТИеx.>Д„‘кZ~V§ ня4}пОnЁяVЦЭ:љQ§б0jlАЧ і4§ЗkЬЖкМй4{–zМсАЈ‡‹Я8†0Ы:А=œuЛeбѓ [=Œ!ЎMUuиЌЋ=fKэCЏWЫƒ9ZDаƒzД>‰€>xб§c­B;єrљЬ hуЙшUзFЯOї кVЕхл­DДцждЦ§^Дч_=ѕ§§-˜gіŒЖяNzœ=љ&dMД§§=ВвдjмЖљ0’є2К>MГЬўžrTу?Œўб|Іn~|]ьQЧаў4Д‘Н ZНњлBЋЪhЧ]nіяп§]-ЉЋš ѕw%ДЃЎLжбыЬu3ѓїїZГЁ6мmЬЪ4‡б /Š­е}п*cЁ§hK§нФК 3њр7ƒЎ‹d’7E‡ж2]­6E‹MЕкt{TBoЛЇ_­ЦŸчjГЕЋлЋU ГІnnžбЋЭ‹К=z|)ŠRЎ†›‘ЧжЏsїР64шП  ŽВЙљ5бЋwШфrћЎк1?tн@o•зќšhЯ]{ƒЛ^-лњЛЬž­ФuoŸОнйК”ВвуOdoъ’gƒHпюMеKEяэД’6ˆН_ž/wOыЗэk $ЌыѓЃ•pY{Га+š‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆђВ>*јщ3>О§5мovБ#7ДљrЬ>е§0Г€Jўal’hvUЉ?-ђ‘;дЏ_ПТ>Й#ХаЛЈƒцєъАљW zsvФќkшафiЬ§R;hсЄїРе>t>†ў5,фЌuдж‡OЗ6Gе§žбѓM‚y3ѕєЙчўeюЗЦcБ ДЙдтчРЗ7'ЁНЧМ?›:€žnx7кШTO/с~Д5NSѕ8CL=]эКЕŽэMдџєѕv~юoк+ЦуЂ—hnЊЖЇr7ЋЎіЁ7VћбТю№Г7E;3yVrZыœ•nІNFGо,‰шVjw"Џњ—§rИ њнИжЕ@зWЫгxМ}§uZ~&n„іLу[хё…мcоэ™%Єа/cж‰’иэ5{д1є&+@‹ък;VEђэBKj-ўf(›+ЊЛЯЙ_N_шлћ­Іy(YDћФC[Ё]vэ_цŠъл-mГНшРЗzълZДЪFЏWпе‰ћ#ХМš}ГЦЯXъ˜yђVMэ˜K.ЃуfБf}yDЕˆЖЄѓ uР,ЎКнџ[н*ъDГОW+нUаЩfЭGЇй=БНш\ђ6hSmЃѓЭл  Е….0oŠ~айћЙŽzј˜м$єЛƒNЛl8Sˆ•3^LНmЯбж/sT­_Ў5tкZœ#гМœl}шѕhmъlsЊ§Aнiшw §^‚žц.@KљЇ=Ÿ#шѓ9=VХьGŸћFŸ6ж,юЪFgЈ ач$Д_эА:bžвбц=O„>ћбі]OƒЖa!ДGэŸВкqбВzkДЫrбўUаччB фZbЏFћX6дшѕ -Јбч0:0c"њДmŒ&№„hkИчC‹d{{Ф_лЂ-Зd>;{ZXђDёЃФЃѕ_чфuNAŸoв€ЭаFТfЖwѕђН~hњѕб&{Ђ™У шœ RбЇЖ…ЖкZѓ\ѓУВ Zа>/ZѓНкГ7ДS€NSЗ@Џ0-а:н­Ёћ?/Юp§юєi( =ВнgЃЫХV?n1—:Kœ^дС7ЊКZMfmЈsЭ™+нŸ0ў€эqzК#}:хЃ—Rf<—tїЭг  œ}йmэЫDЋчA_lšнЋwB[ѕš4єe“э‘ЂЮB']JЬyhg)#ш5шWAЧеЮSm5њT„ЮRл0gА\єЉ&кѓlX ZZšmthнYкА{gЫB[ж‹Vъkъѓ‘ъўњњњъќq4ќЧ;[%єЯfўвe~Д~Аaонх’GДw@ §hwе1{е?K_n!Дpј2V%є$ЗєaєW`Ќ2t‘9oЅѓа?-а‘э!ЉЇS?>>ЦП>МъŸtЖ9Ва2њc)эSчЃu=Ÿ(ЂmuКРœ‰жNЌ„.1 lmŸelЭ‰.4;юЧ№jšч~ПЫцe…MГС~œ-Ђѕ(Њcюбj6пЕE{мЌыFЊIжщwS­/яjѓchнн8’Gѕ<БНЌVцюЮЖG?ч}YИIо›uДў#ўpvƒaўј™ОьžZMьюЖaЮ5шYнУЦy'Гё\:˜зhЧ|˜ЯўYѕ`юn;нѕV™•1д§ЧМб0<ъё–Ч§њсїq”ŸёЁT${FsЭ§ч ~ъљ†ўэŒi˜Р4uджm–YB˜шCКІкКЭ6ыjYW›Уо+Ћ=h{sфЂЬaыЂХŠбЎкžІ.кмд‚YSOЧ9f/КюSQЌ"ZT7AЋћЗ„іЉЕ#ѕЗћуkƒ^њ~ф˜5љtКsя(~4њffEДЧ§§=БНhw•'єpВ5тЅ9†оC2'­єъИ9ŽоZ'khџ‘[’пУыlЋНЧумкќžЄVƒњЭ‹Ж>|КЕ9І^–кO~s?3Л5:фюW9‚ж>ђ}Ksнџ/КЬлЈSФдП4єЏskЕ9W@нэ_щwЛцfS/hЯB;ц–jwЎйЁЏщtЕ{рSЭ[Ђˆ†ž_V~=…:€6КнL†~А'ДyѓќМмQлW К‰њ==ЉхЛet}ЕgЩЋПУwЕgЌъhп<т*Oь_юЖоr{d˜'Еъ_\2ЎЕб>sр%БGЇНѓxєxѕШ3WFћЭ>єxтŽшл*Д@п} Ё=j эмуНтUdп†ђдгЩ›у§Н›І.кяЁu@\M}‹Ђіrzж2зRпRа6[;?‘ЌЁзЋokб*НV}ЛЙjянQєJц$єЛёлжx›ЪAЯsчšgкт њМ пЯѓPЦ­щшyіlД”—ќ(‚юЩ@5DŸЧ:[Ч3ачQRЏF—›чДнг YэQoŽva!ДЌіOЙjvаОЩRчЁ%s-ЊwBЋзA‹ эЂЃъ•ц ш?ѓXR—zэJŸ2д‘…/’к?хVhc4ѓžЇ@‡^XќkБ;މŸ<~:yйIцѓŸeOЋсAœ-}2:љ#оЃh /™ѕ'Ђв–^B/CЎFћXІ^мњЌ}iБуUXi;a7ллzўж84u‚л#Ь6‘ЖК€м }ДаіBKшŒбЁкN8Йц,tбR2aРrєiДЛ7ІЕnŽЮd'ЁѕЗLYфLu*л4Ÿ/Ю`—ГЉЮ#gЂйgГ‹­О\ЮІ:œŽžдIlЫьЂMu&9{Ѕгбгѓь"ЂЇ ЂZЂЕ3ваЃmH@ЯїЄЁOшSZ]L[§8Ж=:a†}IAїwЅ йmNЌ:LњђЕќXкВCЋ2ГГAцЏ~~В МŠ{ ѓ1ЙЊ ѕ~њєзRtЬсЈщРEЌЃfєШў2K1/id н-ѕ,Ш0Gб?Ў9§Ѕ™mД:Jа>ѕЯ’ˆАнЃЕБ„™TОy<хdыЗC,Д‰—Ь:ФЂ}ъ2sэЊАЙюфљ I§GW1‡б3sV›пm†юй‹=ŠVнџ єХоВ:†ЎDюбjšч~_цWн­ аx"~XCŽчмяat5ѓ­дlžдгФњК.zaдСV—›•КMшюЖй|7Ьіn03nяб‹Zшћ<_ є}^шQ}З—jAЫъŸёЋюoѓ|5ўLяKUа[лбw}0ЏЪ&јбaф *m€ў]МmЈ­m™ѕxЫуўхрiфХЌ*š-uЫЯђ tВžеѓ §КкГ2Z9C fZЛСDЯ;ЬЕZЙCЩ €>Hш{SДy“cжеЪFO‡$.u5ДuSZRo‡Ьšz:а1ћбЊ киЮГPFЋњЧЗэёqгїw!zQo„žПќюВЭ}AлїNтя=^lВ—ОgЖˆžпN;їЮd]SD цнœДˆ>ЬцнаппЎjШћёщѓ™птР бп5аMWzPЋ<єЁ­*šнЅўN@ћњЈkЂmіw%ДИAZЉз˜#K]‘l ѕЅZ‰vиЯjЊ› П­жЃ-їГšъŠфЅqUнФjЃзЎД­о]j~eє0оуЯ-б‡РлЂр]Нzm{ДїmQНгіoчD‡Эaєa'tФи8ŽzДZwхд гњyаЪ0G6@ВКБyVЏ^gMнм5КЃЩ:%ЋїцЮyє‰ЭJdЫЗяьДђрž•;цYЯЇ6ћ{EsЏо›@DDDDDDDDDDDDDDєпЬќлшЭ(pи†ІHoNсУ6цIЙdй•єГи(бьА’~[х!;ЌФДI~ѓЃ_oсŸаќыQьШg4Gб;ЈCцД•о^7' ЗU‡ЩƒyQћмвќž„Ž?Фїї ЭяIj5АпМшс“Ш73GиП–§!oЦ~ЉЅ ЕOпЮPтэ=ц§}Cѕc†ї{^хЧПШ­еж\еа-еЮ\~tGюvHšЙЅкkv,Лїз‚юJ37Tg­ДRѓЦъDДRгЫсSЂ=OEЅ&Дu{нDm\ьbh%Ђƒ+н-Oфl эХP Лкн"ђPѕеОyмU4пс‰OХЭвіаб—М}б{К|d\<ЊЃНfп љˆЮzVFћЭОwzулOOŠ~{EДZа‚н;ZMє­тJЋКšzјД{ЏЛ`{ј†ъІЉ‹іЛ3бё­ћE‹j/:ДЬЕдЗ[‚Z`ЇЇ’пѕiЊšGДdїЁ-ЗЄ­ŽО hqЭ§ц кЕŠњц-ИжБАЮОс›˜C;Є—І™НшruР<Бoкћ;щheоѕшѓSЂ]X-Ћ§SЎEЇ’tЪAыRџіHPЏ3џ§hioќљѓgыёЕ€–дОIбЇешeЌmї„hc4щˆtт‡xŸN>v’ZБмœќqщ§GЃћ-Ё{y*:у3о#hSяšMBЃ6C[k.ь sWџ™евўpЦ]…ЧrбжЖю.Žљœ:|ДЎсвBыƒѕ—<4rД‡/єCэЂS‡n‡>ZhgИёžроЈƒ–дО‘uДч2­Ѓ3ж#у‰шyyQ1Дr6ДŽV1Д0vZT'  =ЁЯк{Іtє)~с3Ь~Д  нNsЙш4ЖiК\ЌБ.—щQЅЃOЇєЂŸ‘.zйВ~єЈЮ#ч=гбЦес"  uш—§UшSm?†о|™sбЫ=Яƒ6etW#єЉњВ :пCgЋ V:ЪЎŽЖє+ЃeXS™ѓЎЅш€Нuљ(D‡|=:ЄVЧє!дЪ2—ЁOкX???тJ—ЩЇЃZѓ˜-ѕяпѓ@?cыб‹Зo^ пП‹бšњїomœS§Ѕг8њЫ0џШгх™Е9ЦЎўВЪ2їънЭЈџ ‹а'уqџh­FыƒлQ›=Ыl=%ДСЛ;œc}шŽк§‘юсŽН­ђа§Ф ­ъ ХcƒшUљбŽњaћXъN^О‹˜mtMѕO­){ЕіЛ?~ZЊ5x§ѕѕЁDДОЫBЏWЧб§їFКf3ДKџиѓxбsюI-аЮѓPЙшщ{ЧЌ,ђPsєЩF+ЕЈяжфxВ цЩ}зЩЪE—ЋяS#КПq2пћХў‘а‘КГюšz^mОbѓ‚юЧ1кXЉКПuоZу ЫЊWпЪб†кмбN{G›фƒБВЦцшњЙWC+ эWВzКсqП-ЌЯ:ГЉVЪЋ>Xш“мЃђЉ аЪi˜Шоб§aЂmѕ8ЪнEЏ4ыЃ п шC"њ  ЇqыЂ•3’qНZƒжnО[шщc=#[кQ›7AпKf]­Lѕrˆm?{ъЂэ•Ьѓ%ЯQo„vGz|§§\щљPgЅѕїЗ=pХ…ЖЎ Cпšкњи]kЅ­{5ѓЗ5ІЊ&іЃПGјСЮИx8їŽрo]гA;ЊyЉэБЈїE?rUCо_Nm6эOюйЪXёя8кѓбщ:кUЋzfg‡|Ї }}‡д5бОНБ-э6шяŠha‡4AЏ4Gд[˜зЃлЉ}фГЃўncV>sєw ђи<Чђe‘YPwcЖj™Ђ2КYCЏ3[jѕ"шƒЖЫдЖшnvяћЂ(ZncєŠ•оgO‡]ССnшШb†їЭNшˆ9‚>l†VYшєЅnjVцшue3Д2ЬaUєZИ•Y­|§еЭЭЛz ђXє†о4tЪУ]C€омќwЂкН~Љw0'˜@o…ŽК=pч~м:t'hаЏˆЉїF—,ѕоdU омB wюЌ] ь‚Ї5+эЙgGЂиь2mOы ѕвшНDDDDDDDDDDDDDDDџНмe~іоЌ‡mъ d“=ЖЇњYHfС•ђЃи*™ќіі+|и>XFSџ З—8@юеП"G>Ѕ9†оC5GблГƒf§ц?ј‰бž‡<˜gv№аэЬучЗЧаБG8|ЊїfцˆZ\h?}>іfцАz4wjџГpљXѕэаѕЏeO ь˜ЗPПЧа“ИCџђЕ%њ1У2Y­BшwЛЖdЃzш†jgЊаішžˆПdДknЈvЇ ˜;ђ/Q-™wFЯлУЛв"К™:g{є'dlFшїд•žƒЙшjy"q‘ihi_ЫC5@{&’бЫ›ЅtuЕožрŽаЉЛЃ:к7яъ1Ÿ˜qѕиЬ,Ёе[ФМ кoіН'ЪїюіЈzЕќjPяжЬвzoОeЋ‡ѓ|hџp5б~u`Љ§ПбzGЛнЊ‰ћ2йt€|ЋЅОЭ5EЯГд5gЉtњ“P›ЅЎйЛE|hхЂƒ[Ѓ’њvsд"п‹6й"е6ЏUпJбГx{Дmэя*+/љн;zs@н[5ty…:hиТіˆnкъ˜йqч Ѓ#7D{е.:Я\ЈN2ш[њішйž‚жЮйQНр ЕƒNоЂoIшЌ1KШ%шn ЇЛ2bэ2ŸjœЄvб* эNQХьS‡Џ\iiŠ5fэ#Џ+eю=п“`6чШB=уакoьg}юЙБk‡g’Г~ъБzP'ЂѕЉ3бGgЌњ|>ЯцѓYC›wЄЁЇ‰rаѓyіH^єЙoІ=дZЛgј2=MŸ‹– ™ћдјз‚VgГTєиш?іДhС<ЁЕХЋзЂц"ДнЦшdВ…ЖёYьЦhімhълkЖucєй^БдiшгZєŸ?ftїЕЛд а^uФЌЁЇБЮj@лe г>ћфUЧаcЬёжЁS?УЛџфя’э1m`5oЕ,К*0g|Xzкод=t‘ъ[%KчЂ%ѕ8z=рLєє}єЂs>–>ИвКџho gЂџXц^}МYЃЕкJИˆ;шoЂу’Fnˆ>Zfe˜{Дѓт’8rДJA› ­†ыДЕвЉCЗC-Д3мpOа\=А“G>ъшГ‹o ™=Cg™eДŠЁ•НЁЕЕжд>Д;іhхnh­6@л/1*‚^оёKhm­Нhm№“V>кџ>U›бxЊљаѓO"aФSк8GzFКшeЫzбуAqєЩЊ’кFkАКWGбЖЙZwбњ‰а5BŸrа*coЎm]Эќ лЃ9:qаП §г­[§SmЪѕ бЪkўqйehУl[f6аПЛŽЧпнз?SеЖЧ}0Ж‡}ч"vбѕж9€и6kF[CSOЇKъЊhУўНфЈƒДџи]}аЮm6ќ;ˆђ~Іw­ЊЁ•Гв)hoAtХЌЁПЋЁ…§бH§]нRэ7Ыhяgд;шv;$`^Лвэд5Э1u-Гђ‰ы  w5ГЊjЉы‘ћЦС•9W‘YTwcWOžЧЇ ]=ЖCч™ѓ–zќаюЈлЁНoŒbjwаMаХ эйе[ W˜e5шПНЪ,ЊлЃЃЊиUЅ=кUЧбй/‹ЭбQstЅ]uutwJauctбЋ Sы—ё аѕЩ–њeаfQP‚yѓЂ DПфJП(:Ў~FtЪ!Я‡Ž?YŸ9шIбсЃЖGGэЛwгŽоЊПz<{VАв;‹}Ќ№RяMV‘Ѕ~Nђ‹ЂЛМЖ'6w-&іЬb3Эі"bЋW4wН ™ˆˆˆˆˆˆˆˆˆˆˆˆˆˆШIћ<уЗјбЯа›]рЈiОВl{Њ…h~ћ>jЉГ …л‰+Z4є/нДі6ъШ‘OiŽЁї`GЭqєць9uЅЗV‡ЭІ:xрѓ §в7HјиэШя+=смƒоп†|п$эsчУKD/ŸPО™9Ќžбт [цMдяQѕЏ8њ§йаПttТB7W?&XцŠ˜ш_)фЦjkЊ Zх ЊЉb+§KFЛц†jwЊ Й/бМЅ:МвВySД0Qp{џ˜Œ~wбЫu#:Š9Я:єєљЯeшiЁU-NБТЌ}вЖ8Ÿ2аяz2‡аž9ŠбЧњf ЯчГ~|пƒ“б…jуМcz~™бб=э›%=Ÿy<&ЁЯч}>шqЄ=АUїEZ›<ЯмxtђšъѓŒ>kшГ‰іЉЅЉњП2бR~ѓcЉњјЭаxЋ^*zЌ-њl№&Дus3tЁй‹жnlыаg­ГŸm­cи!Эа‘u66‚†NлжыдЅ mр‚шK]Дд{Ё{мŸ?Дыєј}sєщT­$s:эƒЅO^uЬ<ЁХacjŸ9эqЇЌt7‚цжAСJg|XКW-Эe>GВŽžОŽ˜%tЮчвGаŽнB;d~~Вќ&8­Bh}СіROKКь‰ эlhm”yрUhпsQ‰зC =уНшф‘[ЂЕ‘ўŒWРmа‚ZЅ Э…VjКlGбТаYцRД<иpЯ6hWэA#hеџжЅBfyшьчЁ€V>ДŠ™ Е<„4vСB;ъZЉ {~ŸšŠЮ[ш mТU­"цy­§hэMЗ=,uэ^6lє|LњД}2׳ߘœ<„ўнщT >yеbаFЇ ш;“eл“—эњш КнzЅ_ЎКыw=ЕwЄпВК§ћЗOmіЊЧ9ЊЁўќ4Bї“”™-єяБnшvшŸнеAWЂЇЁ~џє5ACџ^дКЁкqЏFЯуjшќ…6е.кp˜uЕ>h=є2вЯР.2ЯjsШ“ЄЮT0wUC+-Ь–iVВйXьуёЫ,:ЈuМЙат|YцYmaќ4mDLэўуЂэ ѓаЪC2џќЌD[ЃЄ3бƒ;„Ж!ИxloVѓЇ бЇu эМCmLДМ=є ЬљшНnэл\t X”б>lЕў­tBhЅ+Љь,РG§!вHэ_ш…0~—‚ЖЯi‚ьŽ0}—†ўiŽvЬЪx3gODлЇљд+аїЉг`6еFЩhOк\ЋаїЛVh•ЖЈwз@пћБC+х˜•sб ЂяF+žˆњ0Сe^ƒ–&І[ЯŽ ‘эq=`НЦЌ 1[hч‰xЉ[Ђъƒ­Жа‡zМžйD{е‡ДO=]­ьq|ц8ZT/cЗDЛъщУ&шщ€йPWBkпЇЂU}бkЩz~ОxЬ)h[m"k‘є<рwŸ€>иhх˜5t?Š€ЎaVкB_|[jыУjuДвН&zХ|іЕBwъсџ&w§сA/нэš Пћ[—е>иWчоКŠyоh“љћ{6w9ЊУ э?РV@О­ q-ДRњ:пэ9]еїуБƒhU mўјь9НъDГ…ЎІVлЁЋmъ0:гоѕž‰hџчНo†ь hлН:}[д-w‡АFuаЛ–ЙSOƒ+kВГЌфѕШњыŸВдUбппmа‰ ­BЯФ€њeањш[ НЊњ0їXi?*†>Шц}бСW—iЉ…кЃ#Ў5шПНЪьQЗFЏ4Ыъџъ9Н‡;`юžˆIш­й!ГЃљ<цAvьг%ДяЄїЬяЉаПо:АџО ОZћмљrєђa№›™Уь_г3б‹~з{ є/ ]чmдя1ѕЏgCыS­@ППoЇЖІŠ˜Лѓ4sKЕ=SEt3Е;SРЌЦПЭЭдТLEhбм-ЭфнJЭ_:nнB-Oф3h[Нк3Q.ZаееОyВWZm‡іMу>'qšА9ЖC{ЭђеC;3уъQэ7Ы//‹Z~mй-šFѕА3ФwэЩй §ж§т7эfё=гK}ЫGOШбŸŽЎЈю>x=_=YДoАЧ<›ЈSаŽкoЎЈ.Zъщ_”ѓ\ ,t%ѕMЋКЃЕY*Ѓѕє•ђАЧѕэo’Й‚њvджЊ‹ш%ПйАžњц4Oм#>ДД#lђZДk–іŠ‹^РуžuіеЬь_km„ ­Мы\[1[W‰Ќ?1Э‹FdфvfzыЗd™Ые+а#лј>]ЈN0[Џ6!є[Z›ДкПдatТШэЬњ–‰ОЅЁ‹д‰ш‰n\?hэЌњш4ѓlзаг%%Нц киМьma{шџf5цZѓ1[mЌtВйœgzњ эИyVыш”Ћ†8Х ѓђщрЋа* mNВ~гачГ…>Ÿп‡пВ аъЃќе5už{ОNCkГчЁЮ@~є=ЛhнT s3аЮщQєy‚ЮцeЅSеž3:}–аКzј2 нlЅЯњь 5ѕЁuiи о9зЂ# ­/Е†>ЇэънатіpдO€6Ј2кюљаўќ1анї)Kэ5 н}lv zИ(џщбкpў8KžN§яс#ЪKбZЖўЙу™hsєKЋЙ—/Kžˆ–>}|%єŸЄ…vбyŸKя3hЧnЁ2ЁцiXЏ:gЉeДОрG н§ЕьъqйнЇЁ6Ъ<№*tЯƘЎ‡КПФEаI#Яъ ДР–‡>:hэђ1]ЕcЄ!Є‘ѓіДoЈ(к1 Ÿ„v†о-6мSŽЮ2зBЋўЗ.ЕZљаѓ›9уЕА?Ш‡Жяи­†пcъжhЎшЌќCИр2єТоmЬпiЮFgОcvШzГя/пœ* ХЎАвД=y)њф]yЉ—]sбІюаП{б5ЬгШig єЯЯ4aОй3Ъc|­жЁї5GгдйгПЇ~КХhƒю†žчЉАЅ‡б%jw§{5к4зYjбьUW@льГ­ž–бЉc†б&|%ZTоеЩƒJf§S §#Ѓ˜EєщGR™gЕ9фI@ч *,Д…ў)фъ§xбПW ЭAlє—YtPчxЫьL˜gžдж–њ+OэюšѓаЪт$ЁVЂ­б,uzpкEйюСЖк@li[Н9КфyИ ћQфнБ-omО"Г§5‚ўљљаыаПŽбЇUdnЯђc >lЕ‰ЮЁ‹ХaєOШlЃ?„3к ƒлc"LпЅ “ЊЃЇгяїћ„Ж^Œщб?ВљG›izпћБzГѓ†A+-еЋЭЕnЉяsЃ9 ^‡~ŒЛLЖ}ПлшаФњ#­,tч.4ъЈйНт з<Пй\ЂGХhC­кЁ\uЙYIхЁѓіДЋо}ˆьщC\] ­Ж@УoŽ>AєуўйFЏ3лhŸ<эSпыЃ•>Ь]‰шсƒƒOФсyО–Yйу|{Ь)hWmŒ]‹<4ќнЃППEГХVКz9Ф<ѕћ[@W0ш~Фс3ТSа*„?k\wVF+эgїmЉ­ЊЕбцНЖyT[?Э*ьХ|џдк6 ЃZџXїЛU-єHяЭг‡ЧЯЋ}№Ђ?м…дпп~u%ѓНŒ9}ц§<ЅъднŸ§gиКцУслЎХ2›9SКЊ!ячco6йЮŒ~uЊйR7Xьцш;D˜Бњ{sД( }тћFK]АаyшviВќн!Ѓ5w%Гђ‹ Ь^ѕрЎeж^IО•=QMєєb[mЊ ШAvєњu§ŸAћYыєЈнPEаОЕnЁbhz_t4аkаџx‰ю=Эбџ&.tZVWDЋv-p;фПџжDKk§ќhхюk/0Е-аЖ:ŠЪ}i€NTџѓЯ?Z§ул3ЎЙ ZЅ џБ”іїС…оЛ!€n`Ўѓ[Ып†nb6_dъЁџjcЮA‡ўIF72›/ŒѕаЎSЩшюрttCq.:Ќ~Bt|ЉŸ}xДJGЧžŠЂ­ бл"Aƒn‹VЛЃm—~ƒН/‰VЭјіЉб#ЮјЦџоc7d8лџќbГзїН yшѕФDDDDDDDDDDDDDDЏеЏЙН%ЉНЭтЗЗ7™=мЗ5ЬлєqЕkјТ{а“Апœ„=bмП гЋбаП‚эЅ•5šњWшАЇ#їOХz7Жзм_?bш}и!szЗпќf?>йV|ВqЉŽњ4цaЅп’Ž~пН|ђ|§XHŸѕ}јsќ4ђц™т^Œ^zєќ&е‹~пV§Eџва н§>Ѓ§ъltcЕ>SЬќx’hn‹6ЇZЦ’ЦбЖЙЅкž)ВаПцпeтшfjwІYље‚Й•Zš)j–дЂЙ ZžЪk^ўM!ЭмDэ™ЩЗѕБй›Ё}ЫS][э›ц5бЮ“,aOo„N]ш™­†п<—МMа~Гќђ2џžхymйkюƒ НnqЁО•Ђп|яІ7Xъ›_эAПiџ„šƒЎЈю>xН@=­zКљ1OUtОzФJПјЭЉуhG2WRпдm.G­&Г­€+ЉofЫaД9ˆmŒWS}діЂGбJ"kуи“T6Л‹.ВэaФ­Л•9ДжšжRЇ™WЁƒfяZы#LЗd­ѓ*uФl_LФ•^дўЫEMtдьEЯnёЂ‘‚.VЧбЗњЭ‹ŽнЬXъ'Fћ—кAgš еЏˆN2пŒWtэRсGO'Е@Ї™oя“}V+љ’БФIш|uЂyСлdFOџo%•К-ŠбЙf{‡и+н§•ЮT;ЇwYE+]m ч{ƒcИ“ЌBOF[ЯЦн›#hyŠrѓђ9ь шѓyјECŸЯ§oйihk’Rє1 =ЈЮ]жJїЗe iвбЦižбЌ4ѓаѓїн§ПкЁ3IшE{VrШМйЏ–цЩљМћхЬЃU­4КЃ>‡еТTЧ Д}zк^ч}vдЉшЉfhlЃЛЏДеїЋлЁeЕО)ЮZл4!ЕwЪF+эnДAšЁcЛCFŸгvu%є)­o”Ешiі\Д­.D[ЅЁOeшюƒЈsбъќчЯŸХмЃџќ1ёIhmђ$єi<сфЈа†ДсЦoђаК!=•‹дЫšgЂs>+Н­†ma ћЏўdящlДђ™cшбjЁџLЋŸНЇЫ–њx”аŽ}AON=Љ}шiиЃ…Ж‡9Žcћ—к1пzиЃNB/+хО\ігя8ЬЇс€жŸЊтВ #/ъ ГР‡ю~Лаа\ДѕF[zХF.}&К#‹oLД>ж€жп”ШC8Зo…VУЛ~ЋсžrtšЙэPSoŒV~tVо!ўУhУ™БZЛG і†ш“Yњ$Žл}кiŒQ}кm›ЫаƒњччЇ)њ1Оl.DŸ~џў§уCg›=ƒt<цбЈyhe‹ѓЯДѕбг№§\e+­,ёvшю^л<ЌНа Л Z_ggЉѓЩГyKєя•шп6кV˜ѕўoЃ-їjД6юoW>ІdжбšЛШМЈЭAWЁU§S§Г1њЇкrZЙцп'k†BЎž5Ђ9] єЩFџЈ/Гш іёі€ж|йheЃЛя"ш˜к9м1лцЂ•‰> шŸ•hcFД5cІyt#TFIшгš…6еэбЪD—›—-’€ў‰^O„34ДваѓЗm§6Cџ|шuчып‹gИhЃ"ДЩЖб?6рУVлhїmWW#‡б“сG2лшщmЉыЁЧюsGXОNC['Yшћjє(юаЮKяO§сC ОGOS­}оЧNу‚8ъ‚•–Ь§•zžlњО4šsаО•бЕйVьщЛ‰‰]єGКŸMGwьBДВаAГ{ХKпюняЅf} шBЏAюJш{1:я‰8.vѕ•VйшŒ'ЂАд+аJcKєs:њAчN3дB+}9ŠіЋч j™ ДК{ф§ч6б§ѓнЌКы[&Лhх іЗ1|ђ„жЦћўўЭ[щъх‹ќ§m8kЁћ‘”Жтуg„ fC­ЃѕCtp_є2мЃх“Э%ДW“кКл6їъ‰[}wЭjbGаін6yк!еЎєxуИкДАа‡…<яД&dэњiMїШFЦ]ЌдСйЯ}пNѕЭЦ2И шсЏёƒwSапебю:ЧдсФ1ЎЕ'”mо}ЂЋ]ЇГбўЊЧЈПдЫце2:oЅыoы0кЛЄЅK]ХЌќЯСГw­ПkšU€\=О зЪ?M]єwœR]`Љ7A™jаКаьWo€.6{е ГЭў7LAѕшМшvЯˆŽог§oтюШAЫъ+ЂџиЭЇяжљпЦjб&ЋхлнeЎ(дIл#-ьЪшОЈzРщDїПљо@-Ђџљg"Њс–сЖЄ…naŽЂуь/еJщ7mNидЦVPг тqO…Ж‘ОЫр6шћтшФ,n_uГ Ў…nhV™+yŸчЎt ѓ Ў†v–КљЁVщhхџз<нЪЌЬї{‘…Н:№НКЁйИь•Ѓ•fnxЙ3еIш№хcЋ­БЈЧљTxюдоl@Ж+EяšѕЯˆі§ЮјThу†WYщз@+уyњcй™мg-`§$˜ їЯ“ЃЭиЫ•ОgŸp3ЇєєK,і‚d"""""""""""""њoїkhoFFПŒіж$ѕЫЩ{Ьі8O§g{ŽЈщ+ысžюЮ7qˆ­›>­ізќ…Ћжю}{лŸ§ццnчнИЂFCџ і\цDє^jйœŠо…э‘,ю„CŸGќf_@BG> 9Н™:j6ЖGьиg1—ъјб˜ЛЯA7>zоЋ~ыФ>є8Фћ№ъ­ЭУ'ЫGд кзЛ^sГ§Щѓ^sЗ=вЬ ƒц€zg лЊ“аЫЏП|‡МoˆЖІZЦ’ЦбЖЙЅк™*МаПцпWЂцfjiЊ˜YTKЕR‹SљбъађT~Гђ-Еџиj -МЁ,пG+хО›ъЇ/вŽ6VЙ?Ь^VпШх›::tЧVЫ ЂНаъЯtЅ[ސоб9#Џy&к#Kя[]Д>жpљ6аТЮа­бЧн}сŽfМiђБ:0рђыСhg`яŒy‡№Ј‡•WzStіB›Џ.&­%кzSМ}Чm‰>JдіY›ЂэЩл 3Э1ЖCg›§ƒTGwŸЧонMP§ћбЯ&шŸnЊBД2С3z\‹ЕfA= ?MW`V^ГЫЎжFдйш“‹ўЉŽўqбUVZg7D/гх›%ДБиš|кєЗ‹NS2oŒўн§ГЦ<ЋќшпЙh%˜mєЯѓЈЖ‡tб9CІ ŠСSЮˆыVZ шSsєi є—YtPћx§ё{аyЋрЈOQtLэnќа:єЩ6gЂЖ1†ГWЂ\єi-КgыCдF;ъ“5a)њ”Ž=3љcЉ­љЪбу0qєOєr"œaЊй ЭкхњBџЬ„НЧљЦїѓ?"њgœЎш]ЉЄ>ЩшQБ|їRћNšб?'Л"s§ЃЯўaЃЭя=gЭ э з˜я]#к}щ-B шiЎ•Лу>6ЂCъѕшeВUшi˜ћ8rHН§ѓs7еeшћнF‡ц]ƒ–C›Џ}ЗаAВƒўШ@?Фж|їтgЂ2б‘Vm~7е…fYhї2эОКфЈKЭњ(‘ Н~Ѕэ R ЗЇŸ­bhчyhЁ6Е3сZѕжшrГВЦ№Nx8ЂшЧ1žГ—)*нQ|ЯЧƒЋЖб/Z›ЁYц[ЛjeЊЇƒь“ППяѕб§HѓpнW§ч@Лd›m ѕƒtpŸЮЌ†^FЛпПеђ ж.ZgЋEmb€GuєДЕП\ГЦžбЮЖyPп—h;tЗфњ`ЁнѓД­;oНЭqї П бг.К>yFkл§Tzы‰шмo>l]G}wЭf.КћS aыЂХ1ЊЋUэЎѕ€o–ЭКжuz,э§ЄzyˆяfшoЕаIъzhЯdtіRзНZhя\Д7џ@еŸˆеЬQuГ ‘ѓЭ!ѕwХ7KžЋFt=r]`ЉAƒо]dЈЗ@š§ъ аХfЏК=к‘ќу5Кї€–њ7­Мїбџў[-Њ…ѕ\lц;г„ŸlЎ‰и.уa“tО›эб‘_ =ЌsEДЌіє [Œѓї){КЊxVл§Я?zМ%mыЂ‡bK§ЯTр–аB7@Чї‡)TюM›Ѓ6Е„VћЂџužŽЮF=шЯ:e~@џ;ЕZТшзї;К™yDџE,ДчЈMЬщш1яП‹ља ЬТўX…>иш&цQŽN^ъІhыеЃX)ѕЬKшЩDDDDDDDDDDDDDєю—жо–Д~йэ JШ1Kьg{8ПоЂшсЦЗ'bїЂ:ЈІ/&лєзxпpџ~вБ7'aБ­ІŒн)—œ€ж>щіYЬЉшд"%Нл‘аоCЗeћ \§J9њiШуj'џ,fэZ§?|;ѓ{аБ˜§hые››ЯCЎДНŒб}&|лопOqЃН ­ї"шї бЦT1s§ўОњ=нПХ{5Дўvє‰аšкXRэwDsKЕ3UxНjзмL-M3‹ji FjyЊД<аs U&К…к3“Ё•oЉ}шъjяDў…оэЧA/цљпp’бuещцхmGў3Б.кoі_ђМыМ?ZНMП!^7@пrбoњЭѓ;РhПкƒ~S=КџJzЇчЏЂљцgKрљ—ОщлTѓ­џ№zшмХžЭЫ|ЋŽЮYkпЎˆЎs=u!кkЃ+Ћ}rпю˜J0пєЊЃoгaЕqКпЌXS§т&цQ+›lЉНы[QэзPы+œŽŒнЪ,/Ж„]дIЫМ6Kъ™ЋЁч——dѓ*uz`/PzFбхъиРНZшЗ$tТаэVКG+/ZљаGкLНvЅ§шИЙзкдuбEъГ№Lœž#ZОмЕB'™эЗ"г"K+‹nfОН›oDfВ†Ж.вкYее‰шХ>^ЪД—A­в—x#ѓЄVк†˜бo:oиІцлМвДк}<дQtp aŽ5шщгу#шѓ#ы’7tVъCЫSЌ7Ї ЉўЎѓT:кš#cЅтpzy|ч%н0{V&§яsЧzRлfR гt_g™ЇSIшГ“2дѓWIh}ъLДP­3•юЮCы­5{бЮ6XРк ЊНsfЂOЇDєйE/{Z+эUлSЭ“gЃmЕgB}^‹жцЮBїœbжЗЧќчŒˆŠ˜-Е>wZћря8њНвуXгc˜nџѓ'ŠvцЭ@›ŸW>ор›№ЯŸ‰­Ў. ­њ о“hmKŽЖ?e}ИСю›Vs6ЋaЩч›џ„б'wкtД}ъ\§`+=Џї|D-•†іžž€ў# јGЯоDwk­OЗ=уEO_§D/'ѓqњ™ЦО^&+FЯПР УИш1іЁз 8oRЯs•›gє§~ї ЬЙ?lЕ§#šЛ‡ЙжЃяї~Єad‘юCxбB“YS˜Gѕ}ш4 м=ЭЕ=ŽsŸn…ю†ž'[‡ОпuДjŒўYІ[О[шШФ–:­zѕнTЁ•…ŽЕ=,інT—ЁеtцбFп_mЉ Щ&:rНsw‡‰ŽЋЭ џcheŒ‘evаIъfkЖhcОцeAQєср;y™ЂйХ{щ>1‚ю ™як|+бЪфћлцŽйhe›ЧєгЛgЎжэУp§ч@Khг­ЃЭƒ ё ЖцЉ‹ўўб3ќрSЋE}апzwkЂЊцћЗ™‹^и3к9Т&OKН<Ћš Д’б э ЂчэW{C› н?%…OJЂП–‡=ЋЋ\ Ѓh5эn?ZмцЃvа•З†ЛЅПEѕ>РжE[?*][-›]єaљяZя^™3 лкўшё8КіZЧЬ"кћщоQZ Н“ЩfџчКћЊЙЉУdњй5Ь*bіЊѓЭНКŠЙcW#G—КYiзгжшŠfаЯ€Ю6е kšCjаUебЖ@[šМNћžб1ZрžішгЬ‡|jсyШџ§Зњ_‰-йdЕxЛLЎŠvе2nд)§эє?ђƒ‘ЭmбђJїМд?§лщё;эYшЊш”Еxџд?цї){њпКцdѕ?Kтї1s=№Ф.|^tр–-бЛ9КСRЛ$ŒVшъZC[l[bе№НŠ?џmdžаџ†Ь3лZiщ@СМњ`˜Н/,ЁЕˆ9LяŽ”іuнŽќЂhїЉAЋg@лЏ‹>Nњ`Ѓл˜mЖ—sааўк? uФЄ"шm6‡Žэ5\ЇŸ­ZЁ[štш‡пП *љѕ[ЋлиTk&=Э–[zmzћФ‚HнБ:xqїGш]Ь+бЛУьz7ђR6zo№˜ іў$іЖЮ9hщЦч"+јЯ$;ИяђіEК-;CКѕаП"=eвR>х бf§ке/ЃН5I§rк[Я5Лъg{8’йЦ=йOсзє6ƒоdлrялЈŠБgќТUkїvїЯtЛOoB"Zш™ЬЩш]дВ$ННкG~žŠўcŸCЌЛ“ѓЈN<ќYЬЫR/ŸGПЏz˜щ§}%Z`sџ9мqєЏаOEуНЕљ}š/ЈNEOЃ56kEбqѓдfц€ZлвIцЖъWDПЇЁчНМ|Д­НсO#7UЇЁѕпRdЕ€nЅ–ІŠ™EЕ4P#ЕЊеМДф9Ѓ eж–Z{œзќЭ@ч лд<Ћ=шюЋsІК}VѓТ+­дЙЅvЯ>ачѓy2ž єлу†Д0Щ tїY–Чу1І>Љѓˆžo˜ауwгlŒ>ыf=мT‚NWMр№љЌaє‚ЉЮJїХбћq[ŽYžшљ‡ЂЏЈ‹>ч OњM™шyŒ0ZщцГОИcцƒIA/ІЋ^ДЃюбxTЧї‡yјдћ fI= О§[;яїdn‹ўqfЭDџюOюкmOZ„^њљёЉk чб­Y3ЬњчЧЇ.0;jmt>Іƒў1ЊŒ6/^iFыє"ѓЄ–†ЕбщcjK­д~шЌ…VЫѓзkеkађАІ9­яŸКамЋ#ф\ѓє’Q‹‡Œ‘Vo -ЉkЂ•hЮBЛћcVЋ†hћЪQ mOѕTh%ЁэЉОЬЂcZЧзG;j}ыUGOйц\Д§ZююŽgEŸ,єЯfшМ_LєЩ4›-3ˆШ€?_ц іpJSŸ бцХZBџX3Чаў3Чг'єђЫK)z`‹шkцНn§ћр™#њn’ѓЭ њўhњљћАе~ДаујnІћ*ДZШƒZХд6њ#­&єТ.0+н|‡m‹Жд%hЕgtPН­tєФ.Bп-tdтшЧињ^Мвw 1[hЋиЩ?ЎК­LtД•hS]j^‡Ю|"ўићњ•аѓŒ…fЛЅ-tіІЎVБ‹‡Н‰mtжыKє=†>Dб‡mаілЁЫХКZEа‡tLНЬЗЮl>rщ*В|ШdНшŒЁЭQ­ŒAњ/ОeДзбцAњщнXпжТЌGkCЃ Ÿ^-Ѓ:ZЩц=ЖЛЮl€ўўVгL2њ  эClѓCmLU‡<ЃП­єСA;G˜`G]йlЁUЇ.Bлц]qcшfнэюсун-Д{РЗ„Ў№Ђ"ЃПt—з,ЏДё“Zд5^ ]БГЃ•ЌŽ ннTэќLЇ\є№Йюѓ7"Z™шяб§_гћWњл‡ЎЁŽ™-uЅ>:0™pбаvЁъnаLДЏ№P5_У7Dз!w…gЪQGFЊGŽЂгеБЖDЇЊЃу€ЎBN`o†Ю Gй[Ё3Эa5шП§Њпѓ’шКЂљпбџШlыvџXџ>Њ‡іГ-œРvn ‘лЃНМсЏхїЁlƒ–д"њŸУ?JMшюЛTєП а[F?Ьъ§ћ$єПџVFЋ<є?kаеЬ>Енћпгб#ИІyrg YшъЋМ˜гбџєшєэб=mЙTє?‡ю’ˆnАŸНj"Ѓ‡Пcs;єПєA_X5юй|иТМ џ  gїA{"Ї\sДАдВfzѕVкзIшцtџ—Rк7{ЁЕч_Ї7Я#кwаС6ЗA[WЏЙнШlМsRўпKоўh•„>Lo>Тhеі…E@ћ7Чaму;ІРa§яžэЭгЋ\ x%4аѓK}SѓђкlЋѕЦ#RаAъ'Gп§Ѓ§вѕLшиЎŽЂї0OnбCяжЬУž~bs.zoю`і_=іЦЮIdљЭЧЮP3gotйЏB{Нhсж]8DDDDDDDDDDDDDє§ъл[‘к/ЋН= йdњЉ‹`v}ЯіCбПќЧьЃєiМъ_ЪwЯН=§‡ОўzО{‰еCеЃ2е’tѓр,BЃF1ш.rtc<П4e^4єйm&к„ЃЧ;ДКечsЃыџшач!кmW“ХŽ?\шСЋ‚а?Ž‘ъГOЛЏнѓz2юи"ДЦўёУУќЃcЭиаoќЂE+нDˆр-УЫќБЂЯ4ZAДEMєћ!WsfнПfєьŒ>І@[.нWz9Ohїњ њyŒšGГъ—6ZikzFwGy˜§бTVM ћ•бnWуХ†ІлyЂщ" њeH‡юПjѕ_ПLsfеLПшЋ›uz0ZЄцЩ"Д‚dгь‡юи24[С†`d6аѓОЅЭ`д/6ѕ‹эt КН НЅ@ДЕЃјОу–длЂm[C~dGџРьр5н“ибБd7КWъbче#?њ‡„&kЬ™ОN›…l-ej9њЧ№:Rš еpэž ЬyбъЁюh“­ы~ыє•"Ь ж‡эlиЭучЁ9d‘,hKП$hо]б…аВš]бошўђ™а}ёtЋ>ѕЮ; dB`ЦъЉњqъ8ѕ—жœЮ™rПsъh­:l,Џ‰бКњž}ǘOтAkЫƒ2›ђ(4. Э^шЃУ<ЊƒЬЃš* Ь>kZ€ОGЃЩЊ-Џ дdѕ^fЊZŽ$їl­’J…>:бф6F% эѓж‚бŒ:%zztŠC›/Fт;™=Ž^9|ЬЃкМ‚Д…с|Ё‡G№Ъс‰6HWю;ЅœєД4fy,zУNџgЦYOЂЃ&M]іВЃбЋазLЃя€жи4ZџZ‚&Я%аž?0шЛ=ьЗХzюНП˜ЦЂЭ‹5…ОƒО>hxюНПœšфptЯ&б0ЯzкњcћЉ=њIі7ш?]Š UпыO,z(3Ђэъg ~іAЋ=В§ЭzЊђg(kUЇCџ‰@џAш|“NЄhзŠ†h'Кэ`ЂC&­•шu~ДЁ2ъh ^эЛІяУK}ьhV~цhДй4к§:\њџХ jГgt[УЫŒаВ+uвI+zыDo}аЁdєМэz:N€Ž"OьўKЋвg4<ФjNƒ6ž@єэ6МдtBя8ёё6ђбшлš =ЌьлЭ­Фш[*'О)НW0њ’vC3FoЭ§ЈгОџашnшZёhLnбБo* 7Кaі3B?ЛЩ::•кŽОyЁС7 ›ЉЙэ@O_вhe ћku:4ћ*œ‚ан‚ЕGЮХбў‘Tэ"#tћ—яЩ,BIŒЖі".!šиц0ъfх6'CпR^Љаt\…’‰џUДTэЌSбН ДP,qC{™ъtфЫЅњrY'кЊN‰ЖЊgЮ†…ъ{ЌцBhЦЉ7хбзЋН!мpЋ }Н^“Ё›ˆбP6В•К>ЉаŠGSОIЙ]юЄш+7jr!LЪ &йзє“Іи45y+њz]­T:•™U[бЪ о<Йэhs+Ÿ5Ќ˜YлаЪcЪ3кtЇA' ZбЬ’бЪ†VkAoiД"Ьeа”ЁuіVŸ4qd ГНЅадqeаXMџтkњ€Є§  ЏYб@нќрHkЖƒГћЕ)kžд™бJGЗ?ьrѓš'Eч1Яъ[џkp;zуBЋ2шљ}б2g€цыейЭгсІ,˜a!+e]внгЕ&Їy~У`.=КћЃ?ФŽžдYЭCЅЃ•"žТ†мŠ)AжТ›7эКшž sвЅcД6ЬгєЏФаŠ1юm[K˜Е  НАЗ e—ЧcЁ‡KУZЭHmМWJV@ Ўjф6д ;ЕОoQ!№2D;–Qедддддддддддддддддддддддддд,œ]—ЅТь`–ЙƒШЄz]O…2#ркО єš–э%p+Z№ћНTmlЧїЪ.jояД;Šw_“hтИ…д{:š9r=fti5Ч0еюЃWBі™tIЖ<Ё­ЯБ[:чнќБлYЯ(ЂюuЗDЉcж*1їq—šGOE2›Z$ш=оЦО”™ЕццЧl˜›”C;е–зрЁњ B‹убаЫ#ЇZ„о™™3Ђa'RНƒ‘˜—VKаиœK}РfŠэFSe2Љ™VЮQЫцœI-EO:ƒškф4c5‹N­fћИЭH] -5‹&]H-7#7yD 4?’дЋ…KsЁп=бн/ž”’ЦЫ‚ЖЈ)vїЅэKNˆююЕmi„рнЯdŠў иZgИЅv2ДUа*§>оО<кc‰ hпЅёž-~9jЇњ Ч6iдS5m<b 2Е^PKJВZ;н†цJg3ыj‹Ћнцh5_иЂЖЁ%цHЕ­0xaвцН"С.t”кZ^NtДі BЬ1jGa^}бŽКЬIbV;ы’hі—юžш0ЕЛ,žV ˜ќŠб§ЙЦЋ1ЂTj ­%xy”Afѓ№Х^›јЁZdnбрq4NSЦKњ]fіWЫЬ3}ѕєђ›анп>#D{™gЕv›аУЌЬСшсŽЁ‘h%F›§ЬG=єљ<_ф^”ЮЂaЧXДе=Ѓ‡e|~iб/чѓќЊtЂЉvёhлДєy@ПєшQнь8ЛцLw‹GЛfнЂлџкAїш—sхF3Э<а?кspКчЉVбЃкн ~ШЭ?~5ьыу]убш&–гщ†?Фш?85п№hєЫ‹'К…ˆбєгЖ _FпФ›ЫM[лƒ<'-^мщ.є‹†жы[_‚аТ{№ZаœњхeTїhшmџŽё6ЧЃiѕ‹}ПxБЉm-“ЁЭOT/sTћђƒ_єфAГзŽ@єЫ V.Дєњa!ЗOлВ“Ё…їЗј‹&Юџ‘§Г­hыеЃ#џАЃЃЭN4#ѕшs(єшдч и†vŒ­ЅHm-№УШј:š~М"ЪЭ—юсY!qatЯi/Ф[ЫАaЗаАLFД~@0д’’ ШќУе6няDэф?ФЭсŠ„›эчVtEџKшюvь ЬXнUN‚>єSяc2 ЇкzУБНАdŠ‘ћНњ~}ЅфN}тб€6jУЦтI+d6б:=Ш<Њ‰ЊЈГmŸДЎŽASE#& еTљ^І‹Bs0š.Ÿ}EУыSў…ж )эqХ“ЃХ}Ь:Щб@šMЊ§бZй}'б>oˆšкnN†О“Ћкы]|BM4n•­G7ћ •eЖЈ­єзЂ4бџЇЧY=ЉЭЩшџ‹@џŸc}Ќ€юџцћџ§ŸўЕMŸЌkMДЇyz-ЪаwСЗ а~?Е@єбXf ижЧŒЯюЎz}ЗљG&_4ОьсЦ1hтtp‰Gџщ#AпяЯsКкcЙ/?t{t{ќ€і6+<ЁъTш‘„ž‹ќЙSяуtЫ~і@+§'­tsvu~цуœtзЈубNrrt€й(ёGв4}7WuйPBk-ЭZ QЯшЙч"hПЋЧdNŠv_;V‰іМт™h‰:5К/сAFhс›b)єx#Az<,;z*"0CЙ†6‘ ЃФC•с+ЗYSЯhxˆ­R˜u~VtJ)ЬxљhєMK&kЗдnzpЂofђ‘џм†[Кыъ0є &ujеAh\Ј љ†яJ/@SeІ.ЩЎ,hзЬфuš+ЁНЋ4oже4[A{їMˆЖ™убнE)ЉкiО‘fэ‘ =\’Ѓэf8щmwKcуБkyЄVЛmЂЛПчлHћЃ˜ƒЦО-qыtЗЙSЇ w)†N&CSц‚шЫхтІуЌгє*‡–ЉнeRЂъD“ОTtГS]-&;йmE{™эъДh›zіlXЉЖЧa.nB‰ЭЭ+Dc5мZ­ЎWЋкдA6оh3_Џзdш6ТAsqЃћ6iбŒšЊЭЈЏYаД:њšЭЋ‰W\sИ MЙЏЩбь!аœZŠNfVм‹1:ЙWCі–BЛз4Rч!ЯhƒMЁЇ9+):ЧТ€ш+g†heCo‘9/њjGOf:УeƒBл'Н™бJŸј“&ддЏ6ДЩъ“&Ž,1iŒVфЇMИ-†ХўШ^ˆЬQХЌЉ­цiиы@kя0ŠxЎнЈ;Ч­§УHбz<2ЋYЗc-ѓЂЖ›KdNѓЈnўЖYњ?еќР‰ЮjюинŸcg~}>NwгяА [ї,“‘BЁ7л^Вa~>Ÿаг Še4УwЦy|ŽWbYюЄžё<š5o—0ЯvR= юТf­,шEЙ}МбKƒЛpЋƒYгKs‡ибjф64Z ЏQ<-iИo•(eп—kjjjjjjjjjjjjjjjjjjjjjjjjjў[й Yк!Ъei‘;иLЉзѕT(3Ўы›@‹nEK‡Cмzќ~/V›;Шћe"7й їл0$zо­Г˜‡B3‡ЎЦьƒ.Ќц@э>|}fКлF—“цшцПѕŒ"l9ЙE7џiзХд}#ѓ–ш4y˜ДqЙ›ЃU(aЦїqчбЦћ DOU2›ZмыCqтнЅœ™Bгяы.sfѕСЉжн–зрЁњр…VˆЖ^эŠЁ=Э–]p䉙TЃJе б™дD#б; ћОR@Mw"†эœ3S)‡ZŠt5з(`yАшдjЖлŒдЅаRГьГGЕиŒсф%аќdHRЏVМya4Ѕ~ё$џД”E§ўnщBУћŸД„я…ZBnѕЬ˜пlJ­шŸТэфсžкЉаV5\ЊћƒќЙнeNЅяФюVэ‚ŸВ09•њнЉЦш.^шїЄшЙкћPН§У†žнєћXN7ЇPП3БЋЧГэf.ЙЬІš3#ЕШЋЖ~чбZm+ЅЖf_ŒF nm,„цдU™cдŽТZ­˜_{ЁƒеЎКєЈ9Г':TnОšŠ eЩkuЎўВ œtк]•B'ыЏFzдYа3&KQhAѕшƒ>шiвГкwаjIQъ…8'ь4ьќшсДў†BЙБ€-h{9­ezКaЈŒMЂћ пl–‡Ž!цу1­Ђб]OoєбŒ}бЭ/JcЗn іŒ4лн­дЫЫ€ž†}všЉŽ>ш#UСЦІбЭŸчqжg‡™iшƒцbUŸлЈцџеyFЯчsРншУаMЮщаr5[Сіr< ОбНкrv4š7ѓш—иёHt{ˆ?ZЊ@П є\NGГъа//“К_ zЙaуpL&ДХЬЈ_І hЃоx9БЉm-“ЁЭ/Zє7–1њў%б†Ђmf­Ъ ЩQ›h+YGЯ5Ќ •m3Н>ь-гЁй5 е…а?ь<бXM ­ъјIЛбАма?bбФљ?тбVЖњAЈmfЄ&Ь)аіIjЋйvЬ аЖБg/q™†vL.„2НŽzајC­žž™ЎЭ“ЃЗ6Fђ]\[ j@ƒ*y'­ њGаЏ aћk?няХ§BЩ€ЖіK‚f:ЫJВчЖЗмЮ‚n‘^б:ЊS я Кп…n"Ÿ нА‰Aљ}є8iiпчD›MЕV5n0rє ф’ УЦПbr™gx šЌŠдв’№D}DгEQяФш{АЙU35џ[hјJdъпƒЩmИЂцŠіќЕлœ m>2Шџ`C+ЃY*Ді0 štЪхAŽк­ŠЃѕD GЖ> а*њ>“Наšк–C{}0едцкРrЁ;vZv:ЪьPп§~аЬ&Ўш"hП’єџљ>Ыйiа„к1?3щ5f~і1UQjИ=bDš uvєtˆіCbњO кЪvкЃ‡nIбЎж1ші ?эmVyB‡/‰yBьє-Йб§йLv ДЄmњž­WшзGn4T˜—F‡КZkˆжй‚н6}ІуVбшЉ„фe6[F е„НЉPO4˜StїѕƒЁџиауяЌшщ Ї:ZiьціЎ|,zОн pвQцЎŠЭ<Ѓ›0h§йЄcЭSш-‰оŠак”’‘9ѕжЭЊSJѕмnmѕсNс‘шЙJ{ЯѕLљѓч6Рo†:}3’ЭќЇЏ~ъ0є­z0УЂqЁ:rRtoДђBmв '5Щ&–я„V$šTO=Gг“.ƒЖ.еЂgЗЭ,}!ъє^ илmА3pњЪš}алf }MŒЮА– є•1ДqСУŸIа+pAєLUŠЛzCSы:ŒQЋ=ќ…Ž] ZgшюjMЙ-ЦjJbЊ™•Q­р;#mйjj›ЙКUw‹YŒюднyЭъ:zxЪЌаю;v>Дš9nŠkвњХ&ЇyМ АhѓЂ7}щ<8ЋyЖл§нЏЦDш"ф.}cј;Л9Lкažо~ fK§Ђ‘XДЙ9Д,з”3lч q13VИ [FЫcYЕpЬНКџoqЕœ<Ѓgw}ЦЛЯлЭэњПФ‡Я5J˜ЕЙ;аЛљ2OЗƒЯœУ zчDw)fЦj/єЁњ`E#ЕтЭ&:ЋкоУ7DіEX}№Cѓcўа*ЇњрVKб‡ХаЂ7*хbRЂГЈЉ>Вw9‹ši$PKЭщеlЃЃй>’їr1:Б:bа>ЃNЊ–›1›:d}hƒMPbд|‹кђS–Ѕ^2ѓћЛЅ -а^о6!ЗzцаjEўъРe~OЅюnюƒю~іUфЯэNs*ѕtv1КѕвПЃq€“ЉпM4Щ‡ЖўLдMЅжoxЏеЖЃЧ_ 8аDн$шw.’Q#4З"@ВЁпmшщtš/ЉЖЖЈчѓУЬqjka­WDGЈэuЙe­[Gv˜#д^ш…жеeаЎКs8:Pэ,ЫЃњrh№2tŽкY=HэЎjCЯnfдKЁпэh€їFЈEщQЮAЋЉ=зtz8яш•кпошcКП!Є >™Ђ­ѕД–Aцщ~Ё2і„žЊŒ|У, -аG=тYhѓj-ž3шщk>‚HGнƒї//3zЏЄƒ== Щv9FПєhE\яdо;~2hЂЛ?ЭIЫЩўn_tЏ>7щNщўПE7Янgык`ћeE7ьѓyDПЬш—~cїЇe9Г§фjО„}>Зи§2l[#z*‹nфC[ЬњeєMшЙм€ю1Юš?рX:&@гъ——}Њ:yD‡h[УцщSenе а4+УlЈ%ц4hеЃ‰юЎ­^Œ`ДЃcВI›j ђђТ E+:1š™4TC3u)…6ђТЋ‘™RgGS?†Yа„Ÿoo&vŒF[{–@ƒjЋ@џ№DK^‰?тбі v4UЮiNvLšPkd’mи s4fЯƒІgmЬ“mh‘X„ю3ЕеIЬДѕнЗЅgbєф6UдА5Хvt‚хЁLtЫŽB 7h[гHtЛїъЊHДъo7ž=мm<ЊS я6ДА$‡nnž=ниЕL‡6хqhѓnє '}:ѕ'›7М1OjГЄвлљ‘{єЩЬёxG‰Fу’ИЏњƒєъ4Uѕѕ@‹Ь­:амЊщ’Сh%4ч@‡Ћз„Ћ…ц{0Й WєQаЦЃрѕ.zІ4 z~ЈѕЙRsц”ЫƒuЌˆъГBKЌ,:аЌ•p^Єє31њOєTХ№…бj^`!шс+Z›Qє№РоQVг=кхжКEЃЛBŽІѓMљŒ%a ‡cфъ8єЛ™B?CДE=(%й5ш6 Z;Т5ъдЩN7^::сЊ@ъсіц.єГ=WЙнккЗЄKф6% }3в•ЭžŠCuњбM’џ Wъ•БП­ŸBЈЂ‡шл(@f3ГљFšЫЂЧ`ДbаtЦNiбvГЧЄѓ­{!ІrїkкaŽFw&§ис6ЏDЋйЖRЃЏзk1tг+z`лЭB4­ЩЉдз)v3B+EЂIѕм$хЈ mUлаєђ ащЭ67uusЌiЄЮРш+k–ЃЗаœœ бWЮьоšцш+ƒЖšйQgZ}%чь…žийжs кИт-‚Іж…VšЙMї—д4кЕУ еYЬФѕ1ЖнџMšЫ gї†AУ%­ДПИIoВЃ[ѕАrsž_ˆ#ššѕp`nєfzЕIб=š=Я=ЦzBVѓLOŠ.an9и€ЇЧ{ЭcۘщQЯэ€окау;Q!ђћЈЇIГƒ.Ьхб3›Пl YФЬЈзŽЖ-ХЃл—гшН —SЛаK‹лXV^Z;…4P/Ьф]SSSSSSSSSSSSSSSSSSSSSSSSSSSЃv}–fГУYšф AЦъ•=кМcZFI[ььѕ,НеlрVƒnіКлuауСєнВKš'КНSƒйШтцqцzЗЧрeдЄbЯ ЙЌA е.sQЖŒ<Ё™ХQT-sЏюџ[\эaа+P{˜wк›ЪЂъљЮсnѓnЇНТУч2‡мцУ zчFЗ)fFj?єЁњ№ЯЁЩ žhudEьh~кФ‘ыA‹_…_‡й&‘}€‰@УRХЬ„ZŠ&j•2 ˆsqdSSmd+DFЮЁfњHVˆдœ\Эі‘|ЃгЊхfђЅИŒZnЦlъѕЁїN3ЙБ7кЉі3'DПППѓmhљЎџЁХЧл™ ЂЩ—#‰vдoЊФ<ФgдŠќ-•;пП<%њ}ЌюFящп,‘Vгœ§n ™Ё#qЇ—MЄ†їМЇеxЮ4W:›Y‚Цl:VЭжЕЋЧгУЬБjKaЕиЇЖЖ ЇЁшЕНюSЯXC}№AЋeйQkG‡ЊНацк˜ПцдЎтhgY Z!~ДГЊM­j?t:= ћБа> Ѕбƒsа.>ЁѕaњˆюOю"œ6ИЪЭh…ЬжŠsSєQˆmЌhэrЇ€й-МхЇyЖZ3hsа§‚ЅlнŸўђђвўщ‰Ž#f›œC+ъ"-ђ&EлйдEК[)3ZNіgћЂ{ѕЙI?шiоУWЭлв`ЛхEПцNнR_єЫy@ŸБyzул%1ѓЏЧ—ѓˆ>П #юбч}~fZЎЖдрдƒЏ3гшюižоv ­цё–0П€Akб/ ЁјжЮцQШГYSЯf{УЄh…ЭУˆЁйи§‚ЬEбŠE[Ш:њ=!кn>Ђžm5ЯшљќRhу•јТЋ‘^їœh™Z†І^‡"4ЁЮŽ&~ {Б EЃNАЈr ­=+šRSѕŠ э~иа–Ђ6єм“ЖЂ_чЖ™эшјA7ш˜mYвШŒбMEВЇ’“§б&Ъan-‚ўЬцЋЭaъVtŠЯKїћ§‡žї пmд)MUۘ"б§MА~?ЬJ§€цћЗU аЇёЦнyаwЅNIа†BпЃя :ly(pВ~іDhН$ѓ=–” 'v к,˜нГNS€y`™{5ЊЇцfšР}‚A-:u ЙUSQW/ДШ|&З!+bЕД&гц hЌзšs ‘њП…fъ'CRЉsЃ ѕh}єќєіњ5C†Нв ЩYŸњїyE ŠgB FI3Oє]3ћ§Ћ Dж†gm3ЇFƒeэї)oDЁ07ки`– ЃЬ„: :щ ГЃ­6ћ2ehП9шfzњ˜щѓкм ѕb"ДKэ8›И>љЋЕb&>š:&§Ї =‰єш?c3YIЖЩmm‡юЯ7еоf5“ћ:йбї=Бƒа ГdR‰ал­Zв3­Ђб4ДpMFЁсЈЬZІ„pPБhЃe`І вяn$Zћцў 5Olї;Ы€~ю2ў=Ѕ0ZХЁ‡Џdh•нW№@+twL"tЧПДєыcZ'§|€еœэю8п•­хyMїй'=ЊSƒањ б…жеЬ‰аїљ=Бz аЪ@oшN›xu8–G4:ѕj†ъючєГmTh*пnщ_ƒSnsтбSКВ)бf­ЁžаŒЙUєHBє|Бo'b o3@„6O1G6& хASпO-b40Ÿ4h‡ЙSЛаvѓmМ~$@ЫюўL‡юрNѓ­П80ц~ЇЛHJДКHбДz+E_.—t—=К[Дйѕ:œб ;Y†жя‡mŽxxBю"ЊE'2‹аЦ=МŸћЯK[]M]ч9%КЉ$˜єж@+€оКбН9њ"A›їJoO3ЭЭЖЂhбЄ1zЛѕCц’“о:бЎbRt_*?КПрЅA_.Z1Ё™F[еЃO:ЕxЮ›­ъДfыД… ЭЊ Џ ЭЉ œ'њВ 4—аДzmК ЇЙйe.„:&жYЇG_ЏзbшІW2єШЖš…h‹Кы”F}avЉч&)G€VЋ@SюhНA"Г gЭђхеЉ­}хЬш-2ч K$1:љЂ бWкьƒоBs~є•4{ЁЗРœ‡MЁЗvДтЎК:#Y‘ыУ‰nй}KЊWV:Y€Юљ:4е§Џ“­ƒVm]ЙаГzг§T'G­КWo2Ѓ{їИ\fДІљS2Ѓ{JŒnиyб]Œž7№Ї”0ShтCž§BН Дч›‹~B3ЃrўКaZˆмБiЩ–@ГG6GwqЉG4s\џЋетyH4­FU‘Е͘—UЛб ›d›яф5zip—й‚ац…zY&Œ!Тo=Кј9:'ЎЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉYcv}–fГУYšф AFъЕ=кlњVѕ=рРPЗЂЅГoћ§ЎНЉCн?юlў9БqџsZ=9›ћN/m&еѓBndРnЭLН€šTь4}pa6‹ амœ ЋyЕ>ЌшbjБyзŠљ%]PmщO]>vЬЅЃЌкУМго —Twїчжo?o3ыhЄž‹ВЃчаzht—rц„шМъУСЂ&V‡}X)Z­}АЂ­ [lIgB—\ща9йšWуCeдаь3j—9““=дns6i–ЙEтhж,y_Ђ“Г#͘:Ю,^ iеlтВнФ|ЙХа{—й‚Йqєоa.„~члђ€ем›ƒюѕL“ћxЊЩ_иСкmЕSЁ-юh4Оx23Ћ'жmѓ€{5SЅ“ ЩТ.uwf˜9…š)ќžЭ•ŽVГ…эЃЮt4š­ыЕmЉ mU“hщ #еЖКж24ЧЈэufsд>ш`ЕЃь;‹žИЖQчAЛЬя63…оћ еqш1eбNГhвсш u$šЕ:DŒ†… Ђн5ЙЋЧрџ,Ž>ƒаиюgк cxДЧцŽMЁ‡s9ёдзз|4"7XвгТP”й)Иѕ.0{Љ'2xƒё7ЧЂ­ЋФTЗЇПММДъhЗЗŒGѓr­fДъзД‰zаœйЮ&Џв&z>EЭWUОYVtЏ>ЗбЊМŒoЗУ1ЋYmщ–H=іФъѓˆ~џечA ЬiбЭСОш——ГŽ~™а/#Кљ˜“Ђ-EfДц—а/=КћRŽiаjъ Ьё<\ъ`С~Ўжбж~IЬ$њE жwћЂЅj)ZQf4eƒ<ЊеКб/0‹ ‰т ЏFfэ 2Х1Ѕx3ѕцђˆш/4ЁЮŽ&~ ‹F'XдŽ 9аёWъ4Ў6l_1š/Кb4Я^,\;љ…*`ы)2Ла?h‡™@џАѕ”™Нб€eGЗ‹ЃяїћlvЈс>`njZЧŠ>&sЃЃЁНв[Чt5Э6Љаm9ѓжнmУqŸI;н{ъ‰жОlърэЦ#б š:‘f_Д9єКGzbДЂШўhcајОюiб­:~yЬ_N$њ…Fе:4f P5yOдŠюдсhЂšš› OtЋ<щ!šДУ Yяу…Fg“=’Ѓ)ЕNeЬщбX}’”š3 Бz­h§AЈЁ9sВIыSЉ  чЧ‰аЌ9%šUЫKŠШ)_ˆŠ[зПVЯnЦ—ZэїMєI‰О/FЗё.„97Ћ}бGЗ91/ŸOy=њh.чhs›ПЙ§дTmlєњ8=Ђ‘Ў0њ€ЦИвшЛ7šЂхE}џЗJЏе<ЪŽІЖ†ЂЧTЭ”hыVяЂJ§сЊІDеўќ‰ЫxтюFтЉи\јO_†m•Œ<ЁџDдХ}ЖUєфЊ§g1єŸакSmы”н4б[†О`І іёЄBп t yT[VGbДЎŽE[[™g†ј •=k‰ъ­ЭMЊ“M—wsfєšSOЁ vш-iЮ‹ОПЧкЃЗ%Ь$zы@sWNmЊ•нœdAoKЃ%ЋЃ;IО>TžЫžч ]hsв9РКIV4DъvkFђФю8˜€ЬhMѓЇdEЯoZRДuд`)emЛ€TtšpВхјrhЌђйь8ВŒЙугb37G3ЗI€.ŸXєv 4­–.щEФŒšzbѕbbšM^№жe†jѓ‚Ї]ІзDnC’ёлсŠФ]№єиМє.№&"ДRВ+'ЎЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉљчГыВДBšЮв$W2TЏюЩаfƒЗЎяК5­œ}KшokWЧC$›wmЇм†Y;Rбwa]Рь6oˆМЄ™`kfтшдЄbЯ щƒ ГY…цц\X-4їjfA—VѓŒ6.v ЊхцvвЋP[К“зМн д]§юѓ6ѓNЧ'ŒeВЃЇДc5жCšћ3cЕ'њP }№CЋѕЁЁкКЂz!Гm]‡RъmW[–tVіСЖЉбБ‡2jhNŠЮУFM(ЙЬЬT*g–,lч3ЉYsJtb5oNŠNЋ–Ѓ%ЏBKЕBhZnNЊЖісˆђ]MBn@ЬхнУ<ЉЙimцЄшwліbє™sшНžYsљД2o†ЗеNEЖС 4ѕK8™н‰Єc5ёл07™šЎыV7?ЖšубL]Ќ†d…E"4ЧЋйТPэцKGЊ-…нhШ.„ЖдЭŠŽRлъZекУЃЖзLкІЖV;ЪОЛЭЖѕ‘э2ѓh­H0:P§ˆhЇ™Ee‚бAъDhэ‡PЛk бС“.ŠюЁЭЧМљAQєё(4ыъЙыџ™єиж}УЃu8Н:ІЇ€Ь,Zыы>ъЬлmБž(Г• е=v ыыУ4SЏи4вLАЧЎp…sžбp](ЄЦ-уб@Ў7Eш——‰­Д0е–†2а\Л$fm4e&­,gЅЉљf‰бцЄоєљešБ–—ѓy@П{ЂSЉitЋ>71а//УУvЯ›SЃyіи  žŽюў2бЭзРЌ†Џ-hu{АКѓ'хŒGояЃаяiаЖ"GЅѕ5ЭCp=m'a^ -6ъq-U[kh…Э§Г4š4P#ѓ 8З0М }аf\ НЬt1тsŽЋ“Ђэ“цЬkDŸ(нhтЊЇЃ,jW/41qЅŽAГEз†6D‚†ЫCєžИ8Z9Ь`З'Zd^ZfіE#—нmШМ<њЇгiм нœYGKеJGkЕЦђZЇ`ДšJ ХЬ{VПЯŸзIбїФhnа‰бДZXЏ‡Ч—Цм%1њ~злuГђFЋгЩeNОŸ@ќа№lкœд'1i˜ѕvЩбX}’ДšѓЂБ:кь– ­= FC5Г8Ђ-ъ@4їL‰цеAhžœ­oC+™9с ‘WЏmОZТа;—YЎіGsEs  bљлјŒ6ШйбЦІбь…>š+ƒl“нК}>šіhЬЫŽ†л|Э ж[}B3m’Ѓ‰Q‡?і'EНџW*ЈЎ™Mn +Њ•СU3 ЉзRDбмhђе]•и–дœd*Ј$зfMhј"к„ЋЉbx.Щ*чD')_ЈКe ‹ŽЏ›Э72Oy~~ўъПћ‚г˜…ъgˆ†jБ9xэСгeшI=nqЂЛэ‰~сІц c!—Z_&оіД{1њd,жVлЁЎz’ЧOZаШ~іAЯъќf­Х3@kЅХвЈmyшч@єŸ4шЎnyЛйбн_LєPbјКщ’ }гУЂс}ЃrIІжа7=юSа<}9=_њ’=Йѕ  ­Lє6ї;гЁ/г o 5ЛM MDКЌЙѕ%1к9š:љЖzЛеЎfКћ[ЮMVu‡VЄЙЛВ=юИ$CЋ‹’Ђлl™1ЗџЙKtшцЮ-EЗЗ–&ЬУЭЏ%. бЂE=š![Пe7:‡tДь•ЈД;csЏ : њ"Eo­hСЂNvЙѕг3h‰x9є–2/„ЖЊ є–0лб—lh›кD7ь-Œ }IŒЊА T4ЫаhЌ^ъeаx-PhVЭЈ‘nKš9ѕe ДиЬЈsЃI5Жmšѓ6› }Y=K7г›ЮМбЗ№ьš}Н^­ƒžЭ=mcFлУЭњ2Б›^Ща3л:hk,+d˜№Ѕы”F­Ѓ-ƒЃyu1є6zP'1шWм5zЊžШЋЋ‡pf9z‹Эз„+ƒd3fє–1W4Л@Жш-mNŒ6еWЪь…оRфдfНu •НЭ?gЈЁ•':НйFd€vЎ h]НйИW4FъЭ&ЏYiф6ЮW!FCuП1#yb3Œ†kš?%#ЙS$ Ьš9''Y‹muaГ н‚&~дЖ љƒK™‰QcЗFfŽT…б­G€fЧмЃˆ­ж‰Ідфъ е‹ˆiЕ͘™P3зЛѕˆЛаc&.в+2Ћ–Н1ЭJ{‰!ѕ2Џ>œлоE|\ЌЄu’нydCgT'EУbeШи-7SЅŠ™Хl'9‹š3K‰u5gT‹Э„Сж*eNŠNЋЖ 2fлŠ•BГ‹šљќo­•RmoФЈщŸДьЅBoALх§нН7ађнƒя›ЬЈmnFэg6nP@ЌнlлS-3у{Ч›ЭHед/iмфDjt'vZ.@ЛНЉдt]ЌFЃЦПТšубL]ЗКљY+аЏDwчЃ#е|]ЄЦhР–›уа–КYбQj[]ЈіE[kGЈэu-fН/‚Ж—5е{zяUЛЬєTу@я=аajЇ™GkU‚'І– •mА§аj‘™FsцU оЇ‹OКНљ­Ѓ&ƒої?ьбCуєqLz fП—s_єQћЭ{'дzm ™F]#б”ЛGПгшљГЉІ6†Тjи2Ре€жЎжhв§CjЮя  ‰n!jВ žнєђ0бњщ.В?šЋVЧЛЦ&аН|BЃХe%{Њ­e,ш—&ИZГ‘GЛКeDwъѓйDšПЮч=6ЋсKK7Е?К…НМАш~яЪа/spЕyѕ*~O„ЖVЁњОиањN§\ZЌ?5џч@+d†ш3њЙŠEkЅшSоёдF0щ§‚‚Ь=єэRѓi<Б?ћФЁ‰>щ­НбJ?ЃЕјЂЧgMЃO&ZЈޘОH‹~ё@Йй|Т6є‹M\@ДЄCУWХdіCЧhudКyЁ ѓeGs5hEtšм"4<Э\§Ђ™$hЄvєЬ‚ЄИI—BУ5нц^OДШ;iзћ8U јЄ)–MTHŽ6.Bэ­QaGГЁћMF…Ж$н,н>в.роЯ3к3ЃUЫlŽFЯ•šZwœ rЂжд'%šш“}Я€ІкЄEпSЂEбЈ{ њШ™Ѓя”9ќ’WxѕP#ејl[=ШGО>Š—FOCФbУЌ7LŒЦjщˆд\†3#šPЃ9sz4V'@ƒv+BC5л!Z˜Э›“Ё-jyЭтhmCZ9ЩщжДтgэUж=цГх•еўfkщ|hэvTЮˆОЂ‘А(zr{ЁБЏ4КS{§K"С+ŽОћ^<]n4БЭoаЖЗЌLhjЃяПшKF‘MnЎJЌыфhъЅ_6šœu|]М):іѓ:Q73:С9Эфkf”?:M‡Хб9 ЏэЈќшм˜ђU†ЕŸŸŸ‡П†ЏТŠІ@[Лѓ3њ"ШFжє_s-!кФJаьg‘pђєёŽk бУ™6ИЬ MԘ…ŸгYДђFгНйТ6§<ЁсыQˆŽЛœz^›žZ{ш‡.љ&№јшg:љЯŸSŸKіDЁЕн"Й}.}n7ЃчэvубУ—6Д~~џАыђчObєmrпњ Д6hэ/]­!ч §зCŸєшF}›УЁЇ/h=…бУї@'N_ihxJFєEC­MѕИpfсѓ§э-}Iˆž`fЇЉџŒжЭу#§Lš<ЋЃmбЪ47 šMzДKнКе>џ›ГокаУž ЫУЅnЭŠ2Зъў.в2sat›-6їcоК–GZДlUц-VO7ыv ЧљЄ@ G=š‘ZЛЧИЃ@ŽхсF7A'Ь[ы+qAєtчvНu,ъЙMZДU­п˜ž4o…цдh›[Go)ГmЖЈhєР67•D+њmыЪ› Ф,5@wg б-Co)ДЉ~лЎ з6wYšXР šTЏНiOмlVŒЦфЭІ3ov!єѕzЁGb‡бѓ6КNг+њjCkѓе2Ё7:žT_&uл*к@[ЧЦЫ™ЊЇEъ+oЃБzЊЎ’-^}&‘ еsёD`M=„3Ѓѕт)еŠCoƒал2hN}-‚ОвfєЖˆй\жWЪь…оRф"шmzKЁ›Щ+ˆ­|бЩЭzу\н)‚ѕБЩjже РНЂ1šP7s’55IРkЃЇS”~JVѓЈ&ч†ЭhMkчшMVsЋцОй~ш^m|WrFћЦЛбќњшдeФРюF[^ŠЊИ™јё4C6yF14^Hn>Aўрrf7к$ѓ4+њ—~шВо!4НœD#ѕШЅаHН Ћ5єx‡^ŒŒд–% аKš•ЮІ.wЦez5ц&лŽЃыtмrP3FьоЙhlЎuŠч0ДU›kjjjjjjjjjjjjjjjjjjjjjjjjўЋiяЈКДС#;˜ЅAю 2RЏюйPdР[й7Мu-нx f!К?pIqзд]яTZ3їg,m6bA›їnІoЛˆЉgДyиxюŠбpацаsыУ†.Јf zgESѓН[ZnžбKЋ=Ь;t^HэcжбKОл.№ўѓшЉLnѓAЛ­МзъРъЙNvД'ZЩа‡C9ГН[њ`CSKњб;!:Їњ O}€hї0gчgC3žЖ|ЮTЉRdР–Ђ™JхЬRЕkЮ9д"3#GGАЕJ™Eз):­к‚>АhюcЉ­X!3aажZ бajхoNЊ~їPяZО6‡Р{=sъ.2ДљbОс}ЕуХЦЭЖ=f-›3О§x 3ŒLMќ’F@NЄЦUi7TЃ_с‰Фiдt]Z…šуе\]‚` !zЗ[šPУ_BП"ЁаlэH5_ЋutwВmЉ] чŒиш(Е­.TяhјJДжЮe~ǘIєоЎЖ—}ǘGѕоЂ^šœД:TэЈњо~ŽДЏЋкU>‹Y„ЖЌjg§ŽБЮCйёhі{9uŽ@st} Э!+єєGC5rЛбч&{­ ѕK0jшюzзоб {Д"ч аTГ5]ЂЛЦКu+ˆжNwš}б\™#и­ьЅ ,еlšаЦsv‘НеЖ2нБ3…~щбpu _ЄB[ЫАш=ЈјзHУ—Дк^…BПLСеІ]Ф ЃO]„ш ZлG šBk­ƒаNЂ_,h}п‹mЖ=Фці„г‰VЯНІЮ  _`а6бfл“}BсбpЮДі|!З6Shэ-Э‚FцэУ[zД'бгЅР ­НEhЁš@Ÿє{,њЃ Г MhEѓ šДУггЂѕ"шŠч…&'=ЃFk_Ыбp™ifˆі4R+MMѕЂ|(єЌbkJб\K7кUЁсK-|вЁfoє;4;о^ˆ5?i[ŒІXV4Y!9кxiДїMnj2нЂаS!юўЦЖM>XˆшхcVцЧљТ‰ШIoР>™с‡Joє\ш„лDЈщbјэ7MЗI‹Ош€хё hЛ91šRћЃэ :=šXжТŠК№ЄCб'3Ѕб3]Ž>С,ƒюиТ’ЭС№ч—Ѕа [ŽšГНчHKЪЭЩбX-Ўљ/ љщбH-/šй еЦУPГЩЮŽVДŸzr[ЬЩаЦ†ЃЖ™SўРЉЬжтсf‡њƒЖWЮˆжиžhWнЌш‰э‡FОТшЛ?šтFwь˜Ђt—Єhj[zЈ›MїŒ­JдMˆfŸIЌ:'šV'(œЂ&‹І†а€Њ›^€юKfFG˜…ъŠ^/кY7;:GхuЂqв’КЈєѓѓѓјїsLеh[3`žеЦпМ™ЋmžЪx Ї-єP=ЩgH†gW?Ojz™а35&AіY|$ZyЃуЩ>l њ9 ueђэ№LЂŸ} ЦЉcбЯџ(:сѕtЙДсъGЁЭ Рc—ЫЏIїI—‡б"ЁљvЛщпЮў‘йф™A?ѕрщнЃ›ІN€‡аЊјmў’B_Я›њ‹5ѕUє žУ ч/ш)s“kZ]xєMR}цѓ6pƒО$0CДТь›жЭ“zBпHВN`6бSяY=ќ=Z ђЄVꉔ9+ЧDtЈоЎ =І9rK{uiюЬEбДyX[­–tKлцё^нЖгѓЁmюСLЈч[ŒлФsЇєhV=š!лИ1КeЪsЃ hN=›iє–]дАAQєЬ#Э[nu@ГЫcІъŠ–ЃЗ”Й(ZЈ~лnлмєVа,Ec50Џ­о€К;е0ПЩ.yхаЪ…оnW…юUmЎŽіЯЕЁЗ:zГiNмltєveш-@o6-К§sа”: њzНкб&Ћ#Oш‰=юЕЃ›^eбНp ЮшqЃFmЂ9ђЬерёtœM нЊ'і5zЊ~MgюаНћЊzЫЁЁzЫЊ‡к ХšК k–ЃЁZЋžmА93BsЫЊЏЙаœ:њZ} 2sъŒfн йнЋл­бxа!ш@'6jrаК};Tь…кuNГ2ЬєpŠНЩhжд›AЭz€sыCъŽЮažефрє…П‚ъсЇƒacNђЈ&ПлˆGЃЧ“”yRVДвШcџ с а§сНZлšбЌЬсБ3ЖLz8Г] цБ%2OЭ‚fеэВ. Цh ?e`ЇуЇхЬк­гІ{>Jk‡/V3ƒЙ†hOnCмьъі–4w heE/йA]H zЃЙџНkqєЬЅб›U •љЫ:sа zfЅхeаš|QrЋ™ўаД$weцб›в—9&Vз:Щ]lЎ•’‡pВ“kjjjjjjjjjjjjjjjjjjjjjjjjj&;#KkйaŽXˆC‘MпкО œирYП Хc%O:ћЪ)н~Ппѕ7|Ё‡C—$яQ,hуоЭј~З ЂЁzFЧ.ТІ$z16c жЧЮ†.ЉцzgGSѓŒо­-7ЯшЅе|ћ0t Еy‡оX–DЈциМгпСЉSeд]Ћƒm~ь а]ЅмцУЗЙ=оŠžj•2 аѓUzQєСН{<є|’fб9е‡ƒMM ЅцŒъD›rєxznѕŒЧЈЙ!gdгfY;Ш9дЌYWGЂSЋEfnyfTЫб”кvйدƘ%Ѓ›“Њ­шƒ'кZЋњрB;Џvyдяru”yИ­v*ѕџY жКxJ1яцеN3uЇїфf?ЕЗ9WЅнP~&ЇQгuЉ™эL5јНуN6ц$hК,Љ6кНдЏіCяєnhЬЏ;Ѕџ^‡DѓЅ#е–ТжAїgл—‡Ѕvœкm\м šКzфBлъО[Ь$z/7Ч ­uп-цA 7Ъбсj{йmљ-™{дŽъyЬš6[Gэ*Ÿ ­XєT#Єv• л Ђ–д\ZT“x!v№д№ Seўs­ёBЬБ>опmь%ЩЋ‡‰VЬ mшЁГ?њ8Х ўgОшЙq šС+CЭЌh Ў@м0њhCєЙЂЬ§љГПšЊaИ‡уцwѓAж: єљ Ьгљvq€š+ƒбяЃ{4ŸЭJчA ВŽцšЅB)tЇnжСK›WXЊл: ч<ЎЖ—ЇкZFGуъ&нё^x4xEŒ_,†nдƒ™FПь‘Y‚іRŸN'?єЫнЦэ{7њ“њE„~1ЬZoŠn-4j§T€>С„š 5…~сб/ 4ъ,FwЧКакЗјХ§ПIља'_„Ь/к‡7ŒЦf)z<и~ŸЎv–бѓ‹ё]„Њ)є‰@Sц84eіBƒбdA§žMžyвЬŠ7Kа/­’ЁAЭЬЃЙ’.ДТшљЁ­]…Žpао“&п`(єЖVKњcAЃзškа/Ъ‚ЦЅhtІід1_!ЌфtОВ~Ю“.nЬGц“ЂšЌРt GЫ…МѕЉ]хD75™nhЌ_=lї і .DЕуПЗ(pЬcм(%КuSцє\†lЊцŠjaErв\›Дш;žtкiNŒNЂvšSЃяБhї‚Ю‡ŸvФшгТш“?њdЄкlыЅ†?!.…юмТš№G­%бПјаuЂ•Эœsв„њбeЅцфhЄD'7CЕљ0­dцDh›кЋnQДБ!­2šэЋњŒЭ9њ‡Жз7ЛдїpДЃpNєЬіCcaQєШŽ)JvIŠ&6љ^<˜gonO‰&{І@Уэ бLЯШЊ}‰Ј’.t‚ 9ыlшvс1O%Б:%:M‡ %џYДЙ+]нfЉњQаq-V€ЮPw•hWсUЂsЬС ]—ocžєќќ<ў§Ќ G ЭfэччYm> жЬЄŒEk…RЃЧЯЛpWˆYŽжЫ?Ojz™0CeZ%BЛЪ?kЃŽ@§иєsшЄ ЂŸIєГЩˆYGЃŸџMtЪышqщтv.q‹й BzГiЮмlVюUГxгЂЛП63К§Гк§9OW ф=ВЧнЫ щ9wЌИAшnу‹†ъkєUdžИmLмЁО^SЁ›ИЭе[ЇњšŒмЃ6~иrш ‡ЦъkrђЄюУ‘‘™GCЖV=!šWлаЬšFшk&ДСю:5ˆHєPС0чC_Џ˜НаЃzГЙ^Ы CДЩNkЦhhіCгъФf]=ЁЗ,НБ єЖZє eа]8Д2ЮШHІб3†@OЋљl У<Љ €бо\К?zјщ`м–г<ЈўЫŽw'ч4Зl05–eGwj§qNГ2!1hч +AƒEЬ{4s§€[ДУє'^Š< Gwбcалў ЅЩ}Ыщm…МT#Дўn4е(jжб[ђJЂ zОЌш"@+§SШ*аѓЏНШE=–єђш6Ь#žітhіrЬэ]…™SГ;WaІе–}KRЕи`+%ЗБШжJУажLЎЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉyьњЬЗ‚]{v8є‹шШd Д=EТ‘užѕ›P>ђЬs,Ту}ЄшљРЭ{м[Kg ‚ј ‰›8/„†Ћз….Ќn '=­цЅй@яьшrjVА^4 .yЛUЈхцзшхд^шн:аfНR5XнС;‰:;љ Дкшн*ан=хiИѕeШЂЛz%Ь$ЏшќPК њpреaшCvєA‹Hэ2ЯхŠ˜{ЕaїAЇчV`КІ"4ўЄ7žž™ЬxXдІ™ЉTЮ,SЃ9—P‹ЬV5§њЫЊЂiЙхЂ‘Sm1cЕm+V }p˜ЁкZЋњрBЫtjД:Ъ|ю?ž&ѓMЭ§gэ4їЇO)fнДУ ‹'BЃВ5–˜гЈ‰В”›™Е}Юtэ\fbи:™лЏes.†jуЁ­fЪrhЉрSXйpИ Ž](N іFT5§†dWm) {ѓbбm^Nреƒд&P[ЬН7Ўo&Кп)Ÿt кVіšЭ@4qЁЮƒЖšп­fНЃУй.ДrЁэЃЖ—T;Šкаг?nF Уд.Д"аЛсU7W™З–@ЛjRшўЂgќ+ђДе@+:D-F+нE+cМуLцLшцЄуёh/9 цuРЌЦmЦ›Ђr,ОГ?њh„™Уєэж>‹žЯgНЮљМЧhnQ›Mcб„\GЋљ“0wjвќЎ,о04QА•Ё]g нйќ‰а};9@MW9BєћјЮ8|z>“шsї"ЋBЉ3н|е\™ЃNVCуюеИШxyєlИŽg4л+5zTПЯjЕyyy}}•š-Эіm|ЃЦТЃ§дж2xднQ//ЁЛэ{džъ,…nе/} Z л‘Y‚іМ§щдœr:ž84PПЬaаM„шгБoю{7њ“ћЄ [Ь3[{Ж}2hlкj~Afˆ>СЃOZП|X§ђ‚еѓ‰Ьr4:“GCГ §Џ–Ља§СŒк˜| "527ъqЦfO4ѓbдаяшТ!BиЄhтLM­єЯ N4х6ŸВŽІ—@уrмЈ…h™š<ѓЄ™•—Y€Vё“ЖЂћC4SаŠюЁбХ ЪhlRVИ}бшљЁЬЌŒ<—ВЃ}V5‹Џž~S0њhCуEыћЄ4єLŠ>ТЇZф§8НајєІ&žŽчЈѓЦˆЧЩ}7_ }зWтQџ<,FУх<ЊЉћц3apЛ C)є‰j”н_aЙ—Š—9э=у)ЕЌ"…цК$Пб}(šј(Р7IЦjOД{mфD[оƒ-hС‚ЮŠЖМБj™99ЉхUСЎe&нЋхUO ХаАё)тwџZыК^4šn64ЁN„6ŸР:б–.yэQЖ(к|ŽVBs 4|ŽV2t(суДЪhіYе!hkѕLш{(:п‚іTћЃБњŠv”Э‹žсE‡ шb•M=пз!7к\hКgtЖIг=cЋ’Я!-:С Н4:IƒŠvWHДVєбКњqа1 -(\бџa4, Ћќќќ<~!ф*ЖОПY8 PћљyTЯјg{UЮLьŠDKfЏЖ•Gшg-7gјх•=pЭ'сU4ьЇNg4x&бЯQ5+Z‚~vЁ­WЉhіЅ7к9iEW'ыM.‹:ЭTOaОLщ+rhc5ЭЂфЖсfG б2SиL$]L-5ышЅеl{ Н[Znоo†‹Њ“ЃUы+ЙсvЌ-4^n}nsЃ&V‡E}ШmfеxEKб‡МшУЂЁhх@чcЦш§Ќj5ыС‡+ЃЦ!Ÿњ`fш'Bїf}аМљд.жЂЏ8[”rf‰.hЎвfЋОђ Ј…h–mФ+dЦ—@‡иfNЊЖЂнГ–›ЫЁ^hG­ЕЈ}ЬIWЕvз{R­„hъфw# ХКšb+–lАфdjT–P+›yRKЬiдDYьV‡§єы.нq4][Ÿ)œё№ЕЏfъўhА|ЉXЭЯ…žдЪ4яІWЄвОІеlэ\ц­Lєрю>љЃыЩвшQ '=Ал“ё%PfŽT[ъBєМŒ'ДОїˆбйmОwрЕ7кxU бљЬ$zўЁ4є~мщFЯM  Gзєкы ŒЏЪёЙ'=їЬa~?шXЧWкјъS:П•у…Ўvд$б3~RSWю:ЙZДŠ@‡Ј]%‡З•~sбџ Й,К9щиЦV’šєЙЭ\І}ф‹ћњЃfв[аzMН0бh#Д1ыMЏˆLhні>ОЩЈQŒаУFlVВПš­3ƒGѕ{џвк)+z|ŸАэЙЪnN††і‚–sVЏ}Ьњmч3XЦнЉŽ^žhy§ђЊxєы‹‰V"ДŸкЃЬЄ~yyQ//ам _К srєI‹§2Dёшv'4‰> E›l|Ќf~i,К‰>ш)<9}hГБfюдѓ Э,fПлбЫбяњ _@ГэЁ†gRшїЩl _ЬJ§2™пЉ5ŽЦgž8є;2Еšшœ=ОЕA–§Ђ}Hˆ&ЮдмTє‹і| 4н65Z0h§žݘOкešGуrД"б%Zйаt=Zё“–™g5ЈЃЁy”ФM€аѓC/4ZhнCтŽœі5Maюь*R­Ц ўf­‡Ж›œO ЃAk9šx“šЬшŽœ^hИћ>Љ1њш…жЮ:…4ДQIЊЇы5ИF1šx‡ЂЩajВЙЊлM24Б4N'ВQJt-§сХЫœMЉ…51йbN‹ждЇ ДЬœе^шгтш“‡ЙwKЭЉбPŠЖіHކ D^іddБIЗ E/ЕІ=е‰іX‚6кЎ‡›еahdЯ -Њ=ъкGЌЈсsG+ж ŸB<Ž>­2šM%zїhtГЯВіЋ‹бИекаФ QЋ`Г‡:в\}ES`а+z†GUЃ2šzОKš~ђљаtOп‹­ЦЂМfJЃ“д/ŒNR_`NˆfVtrДОІ/гЋЂ5Јш0t–КЙбYд+DЃ ˆfћDrљЉ7Y:ч&У^eЩOЋщадл~јРYФЊ­!Ÿ єГ ((˜mЩГІ6Ÿ„gб r`o4џCвŠб‚šЙбЯ$њ9ЊцZ\„h%FaхpђдЄ§ћв'1z ЃвёцЉ,ЇЖ с+‘7ЕS /Ћ ЧЏ…hНxwD”xъqёBO_учсBЧrYєЄОбhє%ОцЉ|Д^ђжІяJЃuџЌ&аc•&@GV ŽЁGЗ g==у%‰аzˆŽ^&ŒyЪD ЩрBЂєŒфEwъЎЛ†ОAєГmЛq†Хœ G бЯ эtU#е&’›Œ7зŽЗš Јoš0?OЗrŸяOтЬЙа`mЧo)ѓѓtzcUБзŽ ш†­Н™шЦЦ™[ЕAЮ';Є~%ЖaаŽ&3hкœ}AцлD†ъ-ОЙЬ™а№хш‡žь%бА{ š~F›хш7'њmY4nо поАZЭцf?ЮrёCЗТЗюєэ"hRM˜[єФ~аh‹k~LДфуƒЦ[ŠЁŸOoЗе7mтл[їеdnvт“Ф @П ц&jќBлg1k}В  ђ4ЭЗЩ<Ё7oѓwГѕЇD_}аo§&DЙ&1C4IFшYm 1;§rюбmАyЃ“)Д"б{ƒеM—tш^­Їщ9ОШІl`TЧž—і|ЛЁЪеЁ5/ƒоl2š‘[†)ІЭбшMNstbГЁІ!>hmkVДЂЬКmVВУВЂ'ЖsЄИшШMVѓР–Iа™Ь[—йбжч„аљЬ†„d­hP(3YяЦЈfЕuвЦоьfEїeёtvГh’Ю§ ,Дj ЯЛЄшdЭ…жжйЁUqёˆц?spшmљёšjл%ъ[бnъЮy$єf8g9sЃВЃщQoЧ [LmIЗБЬЋЦjЦ,I5cEЋ•Ђсfі-Д„Б­кЌzЙqНфššššššššššššššššššššššššššGŠyл5о0˜`ЏьЉ 1†лžЭсШ;юЭ Z)ЇЖ~жfцбKВ'‚~#t к8lys4RэИсхе:€№ЄёqЭГ\Hm3їj№э˜ŽьП934м‘ЃЕ6ЃаhИ№—R‹ЭzйQ3#Ѓб;КŒšщMЃwntЕzЗД[н$t ѕ^АІI4ЏЮM>œsж^р}}!t{KyЗyФЂЯwєЉ‡Cv3ЃІ^y3ZYаmЩмф04њаdЂГЉ_ѕМ:ЬЇиœK}8xЋ%ЏУЉfnГцжž€­­'Л™Лxа\ЅЬHЭОЕАЕ–@гWkМžљb…ЬшUI Ї}Ъa.‡>phzЬ6sRЕm["э*•\§ЮЃ•Х,BOЕЊе|п{R-E“о6Sƒє`Ž=џd@˜ЗšЌ'™POhв<Љ%ц4h\КлЃИпAъ№[œHMжбнЫд!юS ݘпCЬHНZ­Э™пп Да е\эќhnафПZˆЬ‘hоќЎ› t{v0:N‡&ды˜єA3ЃN:ŠН:†€VГ9­Е\`вŠVЫ' ­,hSлKŠаˆэ(Щ ЯІYЭл ДЪ†>іy7^zM нeЎв=ФƒЖ ЇЎцЃuДЁžшюTFЋѕŒEOC7О{}†hSЭЂЩnоjКЪбЦцmЂбbcК%BuВъ–њЌ>ŸYtЯі4{ЋЅuFukV6єyDП-PгSg{хBї‚Nг`_ћє›Ючсв<^ˆдтшŽ}~ЅЬу9фw%B{Њл›Њ›џkўt”™а//єЫ‹qНPєдйїщ'#ічо"^КXбmмшH8њdEЋ<ЉYѓФ6Яǘ:žПњн‚_›:HЕ<<аšypыф <ЈНаr5:г‚~ш&г>ИЃCуvIашD§N˜gДPm3G 5јgуhЬВЃЭв–cСhњфгDvЁэЯШмЏњ‚=;тбŸ4.&CтIЁ™CŸмhЊšЭtЭцKF …j щ9i^ю‹жћ ёEЈyан+  jыўЯЯЎ&lЄЕі@WЮСŒаQаw } EŸє]Oд8Ÿ@ŸТаглп\чtЇ‹žs:"ѕQŽІоU™FiotOЌЃэeNŠ&е^hmYЬiбwНЉyP Э‰бX-/ оžBЗlВGБ95њŽ–›“ЃСЌ=~H\:№‡Ф‡D—]гџБI+;Zoћ(hѕ€hГы:бШ ŸBšx ЁfMmKˆ}ЇЌjЏТЭФњтеБhќ 4ћ,kПКѕЪ„ОЧЁ1•йcдўцєя†Yбєу/w,šЙˆDЋш7tЧŽЌJŒ:!šnщivНО“ЃгT_PО№Єг”/Šfк­Mі[7]–ІСCЂ _ђR5xHДЛ№ бИBДЭmNUЮлНЭrДYћЙЩ№…WYМуЩпЌžxd46‡ yЕѕgEˆ~6ё2АjЭahNmC??ЯjѓI0hцi<Љ є‹&ž…žЁƒ"7GЁЙ„ЊrЅ~&бЯQ5йjЎ$B+~<19yшЂ?КјЂсњ ЯПtI††…/Єš&>Ѓ- —NcОЬёD+'кЈХ5[\|агзўшKBєхbWшљKт‰hНєtHМк пn7šђ[бM=<“(ГКРмКАhУЌЉ9t_uIkаНњfA?ЃЗ}гЬЧІеЊUЯx‹ГgЌЭœ­…D?›AhP#?šP7ЃЗлLwEŽwšГ Ей§m%7шсfюꀘ+”@НqZvs‹оhэъЃˆ ^.єEПт™шэ–5wjУмŸO›гЃїD нбXѓŒжOgЬЉЏд&zžєv Mf&]}fOєЭiЮ†з=_ДѕjmfаАyƒ~sЂп0:УЅУ§іеэљ“ЙйПjє[—іlsc14sЅ&бЃ№mTƒMkFПшЗ%ам;9‰юˆІйиR эўxЊЃпцAу-}гЁ Э"єМ(РтаГнZаšКZ[Щo›&ЭŸ=К0/ыњPщЬJ]]h§хзC7 Кџ{6w/IзЂО^г˜š2ƒQkjУьR'Зш.mХ~зыfЬlFшF­tЇžЮя CО&›ѓЄж25нЮ™цЊЁ•О; ЄC#5орЈi]Гg4#З Лб‰ЭEаЉЭŠ4GЃ7K gŽ ŽЩ‹жи„Š‚h2yЭ#\LV2ѕ&;ZЅD+Э,оfzk 7йЭbЕЧѓлф&kNеowЁ§ЙЭZŽrэЯmžz9_fђ§љЭC3•]Тlиm*Z•7‡ ѕM}‰Ђт@tб_ˆšкП~Дeд ‰нj zAГƒMэюЯYжlUSЛ—цЮсЭhчЂNо і-hД„В­н<},ХWlЎЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉyЄшwБ]wИЏ7ш&ЧОЖЇB‹MфкО 3/ьeсVВН$B<аЫБ'Р~Пo9аЭAћЈ5Гщaб+POНгŸщБ>љiuОшQ§ЂЬї+}2>йаmѓ—.жIї‡€ЫBŸJЁе`žе˜ќ:Ђ]4Іƒ,h?ѕ‰SSsшзW OO†f5q(7щWЮзЋ—BOfH4щ“ЧšžЭPM˜_^ˆniашT њ]Gєaз+кCЋ“ Їїgѓpо%@wѕxFјš‰q~JаЖчCЂ;6н4§9…EЃZRtІkv4Uэ!бˆю‰ЊУбw9ДљтраNЕm?ƒ6Џ$r4КnЗЪjъыЗ(“е4ЂŸ>W3ЬZo4ОкЯmю бZ9`›ЫбуЛп™яІ9­еCшЃšxWЅšЄFГ>ŠЏyV3L4ZЅ—e^ƒйбјешёЙмœеђВ'3 Ё[ЗGYЙ95ЊCбжЩбсjlf;%GЋХsЮОЧЃ]ъєш“ЮŠ&§ 5 ЭŠ]Гšn*ДDэvЭ9эVЇAУБЧ u˜YŒ0 дh%C™Sax(Za4J йчR€6д‰F 6{|h @лkЇD[Т_ˆ†Ž*m^SFxDећnhAЃm‘h& бh[ЛС“,SЇD')^xвiЊKайЎг&Л­hI—^ ^џЄ5xHtоk^.tжw—вh}Я чOM бж'р]їщ)Я4˜"pУSгпл,G›ЕŸ› _x˜qДПY=…:ZuцДEпО(єєині4ƒЦŸwLГЁ%ц{?шДhтY˜шgА!@іYгаї@tихƒ2—D‹hhrањ†€šAьЙз傆Ѓч _\в‘ћ.cЋЫЅ§ •'аЦљжIї/}’Ёчк]]j[бЯh BыцЉrиhqЙРк,zњoЂаЈr2єEŽžП&Жaщю шЫEŽЦ_Ъ'ня‰AїТ‹­/К?Ђџ"rk"Aуы‰nЫ]2 Ёš3jТLЂгЋ‰пЪвf.tўѕa%CіJбlЛP/‡nз‹•ќќМні{ёЉщ—4…ОР—сэ6ЋircюеФ‹8§ I4МPkшэ–5wjM›гЃ/Ш|ШєMbŽB;G}Лшэ†<Ѓ v9є%š3ч@_n ЊЗ=%™Scє…n/'гі79:вLЃaѓ§іfЊпкГgsГЃг_Ѓƒбo}мИJє |›а`лJб ё gН IЭЃmБЂЕ>ёц`4БХ:щЙS4ћу‹M= ћђ˜:-†Vўш”ƒVъъ4kз ЫЄ›Ѓ\juMC З&zгEЉю/дYІмЋЛ /№іЫЭ˜ЩŒб›іL„юегљ]нЫTїšlа#КЋпџНбдУ;оЬлЬh}д›ЭpЄfо˜e“Ђ[і,7алЩ к1iъхw0‹'EПOЁЧnП„XЩfщdшw3єЌ= jПg2SjЩbw›SЉq]Рn—- 'R“…пCЬHM—Юf†K„ўЄЭ•Юf~1ѕВhст€jЖv.s к|\šў-ЛЉG3џPЭ›hR-CGЉуа”zQє!/:FН:B-CsfчЂЖЁCеЖ‚"ДkджMZsЗѓ §МФš)Е‰Ж&щœZWŸ›шa0ЋlшуMŒњkhјZc{љЊЅu4ѕ™DOлFѓ^н-Щўђu>Пбv›к'bLYe@ŸєXыєъц‹ЩЌЃgЕjея.єЩLњd}ђгтДЂЇC­шS)tг§Ѕ‹нЂПsЃOvє ‡~ЃЃћГІЃA+§њŠа/д‡ оьЇ†чІDЃгѕтyжєч7њ•FЯЇЅ,ЫУOЭЁ?1њeŠЉІЬ//ZOЌŽ@wG _ 4~цDу—УьЖЃMоaGSmуаЇгЇšfш.tгhК`ZЌG3—C†Ѓ™oЦgJѕ#ЂEЋуг]Ч™шЛбaКsVv:獘byДNэ шŒЋ…›a9:_Ж=а№jЏЕwА‹CѕLєа_ŒЦoQ‹ ;И.BпљФЂѕ єбч#ј$`щ“ —uїК’І9CjN‹6е-\^їdf!ДЧЫЃ­]ЃЁ:mo’Ўі0'Gп ]-вЃCеЫЂяБhw‡4ѓтжчŒ1ыjvъз9Э'­dk#=ZХЂ%ъдш^f–ЂЬ’Q‡™ёJ$К™qxI 45jЊY*Ељ0mЈ3ЂЭЋhиFуNсСЅєЏƒе‚WbB47jЯВšxnbЖKŠлТамpѓ ‰mhкŒ;%CSег ::Iq‰9х%яп@чЉZбTс€ъЫЂЧїšЧB‡5ЈшRhОАЖчаjЌЋ–šНы?==e˜B3OЁяю]X„€г5єSРHžњЄV ъ ŸќЭ#кw<7ОD?Н—@гeхƒŽ@Л›ъч Ÿ„дœ`yФЬш{(йgаыA+Й99њŒnйIчAпУбъ:/В-oДЃЧG— ЌјJF.m“ЃљКIМcišmЇ/бMд"“fBm ч/EhЊЎŠZTiiE+EVŽ0OU.bДf†ы„DїЅ'њМ1MѕхадЇ|ђ †нвЂo7]АєэF&MЊeшч!4­GSъm6чЩ„[:щДjHє›ŽюŒ3њMŽŽ7{ЁAр6!:›Z„FOтŸCk} ™ŸœhbKЙIгOhъi 4ЉNaCOЃ(Z]C–‡ мЁЁњКТЃ7МMC6АrJѕu†З_oLusШЦЗiЗš›'ѕtўNˆюе]§ўяЉюxЈцўiѓЦ(›­УMєfи;5Vк—ЋT“шrŒ 5ƒVЫšlњ•ИŠXЬыEГljзвT:Шїh5Ожц ы7yDsMMMMMMMMMMMMMMMMMMMMMMMMMMMВ Џ9ќmŽWLF№Е=ŽМГмUzI/ "pіяТЪЬє’lЛйŠ^Šэ ;аћ§ц}“Ўyџ7‹6 к9 Јї `Šћi–€ldY2Fяw= Юy15б}OтšCз‚ІЬ{вІИХеЄйА)nЧrj'Zљ  ЉщоГЃO^ К]Цeй2ч"ъУСeцаЌКЛ-|^Г ­_ЏншЌъC‡Й{#ьПRгЫЊюjц6гънNWясWŠU5s›Iјf>в)rш ˜‘šЖ‚XЬyа”Бїp”‘ч+&,WФ|Щžш‘ъ•0k]<б\ХЂf5rїѓ•вбйеЄ ЛПz3ž^| ЃЕ§fZ# Ћї:ЗК)ї>ej 5s^јˆKЦtОQ:%њ§ЉI9_…=§@ Aщdшwј}eцJЇсТяљЬH-›4DS…ЉЩвтQ{:‘šЎœoв)аtaS-$C6WКкУlЈГЁЙТ9бБjЖnVtЄњŸE3:юwюkF+ю_$ш(ЕЅЌ{вŒz•шёwQшRЃЇ2B4й-Љс  ѕAŽіWгeŽр›fЂЯЊѕыдLЏdhPшНЛbЛЭ“кИ<;ZхBыъЮіњŠVGПщ<šёEE{ЋOу‰'{їїёw,-oШМ{мв=cЪZoьkюяі=мЊміф{u‹&ЬњЕGkCž_КиLњ$@Я#ЃаЪмІ-ŒљНZйаЏ$Z•@ŸЌhХЁ_Ешh§$}ŠBУГƒаЏ žО " Г†FчЭЅa[?5‹ўcCПкаѓёS-vв^ht22лбЏ,Z?ўЉQ_Е~жп&нŸІY€ІжД‘OS=6њ„ЦЯw˜іЇэ›OCM7DšIŒn‡ІеЫ Хj‰9:nдЋBKеstдЈџY4u#9iІssЃЭЬэя<ЭЈdєиЦМ\кЌƒV§OˆЄЙщb6Eѕє–Ѓ@^|zЙ[‹6bЂ^ш“мœ д~шЗ8 ЂO~f№RДvIŒ†/FКцдшћ?€\ŽЩбСЃжNqЕHUgGпУа“КНuДЃKRtП7юЅшJДСі)Э,YšкЋВŽЖѕIV`…ј•6дЅбaЋƒ\DПГkUЗћЭšhd&Ыhюqш(ШL2ПEKЎЩаККљ2tIKаСfJ­?МLїшЩ–ЭЈ“˜сƒdhА-№ŠG7зЄ‰ўh91šjр9h:се#Iu:С›KЪзx1tВšЫЂЇWхcЁЧзхЪб\П,ъTшDѕ+КšЏœргG>єSPУј+XэЂЮƒЬP? mn™;{W~’Љ“МXŒOSgoГzЪЃvV›њ>љ›CбЯM"бъб &эьbЈŸ!<T‹@{˜ЃяСsfЏxTуФш{0Кgcб$5њ;­žОППэПчЅбF‘ єїw0ZЉoачrЩ‚†et0ѕЙ\hЕiœОD[4*ћ­bапА6ЭŽBSecF§§M'дzўo"аdйєїŒОшБЁ)О­UŽ@_Fєх…жC ћ^Fэяяasš‰MЉЩI“нбДњ†њ’hє.У я7f4хбЯSŠЃIЕ§ RMЉ]hH6н Ёэo.Дй†NnіFгфt„йЭ™ŸЗл­:ЦL_?8єvkCoitњA3я/ЄЙuЙбPM7(0ъл„цдл Џ=хаКњжdF7љ5ІеЖ;zt“мfччўеnЅа79ЭЙozкЃоК'ЯшЗ =&ŸYŠ~{ГЂ›§btМYŽЂЉл?чBt2ГЊ-h6џ2:ŸZ€F›7 б)ЬhzS14љ“€э^гЄ:Y]УаюIct"qЇьыfŒ ЗЭшщќ (|Э„О6й˜ъц ЙЬ-›=ŸОЙ‚кщаъ:Є'ышЭ0шц+ЧЊnŽPНzcЂчВзЄhCnЂ‡нзhкй‹„5ыЗТ^л‚ойYЇи^Jэ ;аћ%Шћ.Лс/ Z‡ъчьЫГї $Э4УSŠЋQвжhCUэIZwф:аDѓ‰L–}eеmЏЇЖєwW/‚о;атm™І\~ёЁ_ьђGнНчСzŸкєŒ Дў.cЙxєђЌъi5Г‹УD+Д‚їйWіaŽн}та˜У6ўЅ˜U}0Т™ћcwdXr6ѕС‚VцЧ<ўгhaєe+ЅИЇ`а§Ё9›3й =ВѓЃ ГбЦ ЭU,lюоMК/к-B5@їЏОQNš‹ЂfЎytюв”{зƒ:ўчtŒ†uSЂпAЌh>жQteгЁaэЎОўэЕ ]ЦR@ф.9ЭяцbДЬ–Cу9ЇTгЕefИОш$jІДЬŒВД‡йPчC3•пЭКš+Эœ­^Љцы’hЩ›Ь*аŽ}tœ:­иїімhKYїЄ =`у&IwyD %ƒfанљ4Vk-г›ѕ;xГmKRsП“FŸћьцBœЗhgѓQ Fr}>EЮ>hа. }Dб'`Ej+zžйъ€ЦuZєЁ)Е н$зL56Oj~uРu˜}+-=ҘдТ::šXгђ8[а\Џlш.šљѕ Кп4Ј}zyЋOЇгёдœulП•iyCцу§‰XбCуг1ьщs„шW њUˆ6њFЁO"Д"Ьф6 њєŸCƒ“OaшW-"4l‡> __}бЈЋŸ:§„V‘шёœПzкТŸSЌшWz.ж–6z…ЈБИGfBBєфŽEI‹n‹&ж†э›шY}ТцєшЯЉ“ОЊ=Ъ5kьSAєЩ ћЈёЅ™3 ?uk8Zћ6Шў$ЬrЕ~cЮ‚ІдтjјT\мнЬ'уЉ"ДџЄy4К'›П™PЧ 1œ%GЁ; ЮМjmЬЋEЁzŸї844ЯФ;0ЧЂЭz1hоlНйxкL4nГRДеœдђКšJ^ДG]sjє=дЌ<ЬЩбСjsztЈz>Сй!њ†іQЇD;ЧŸAз‡{*i'н TК?M@ЮVСhсœc>OѓЃО'™єи)СGZХЃ's tџw0Ў4fR­ДzwэЂч[Ё‰vAfњЙъ`4TЇ3“jЃM24ѕMM†ОkЃжпз6Œžо jўnw.Œ6дЗлŒnђK‹Rн_УžўАлM`ŽD;пЫoЗAаэF„nw’cЭЎOMЗ§іF iшЗЗ}s™ЃбћІЅGб—GїчДgBЩhfд,ZWf):й§6K ГЦьц"CЇQї•э?iМЉ$:py„Ђг˜Iє-šP'7Йтт›>СшсќŒhuьыfŠ 7NшљtРО^3ЁЏMцІзН 7Z;}sЕгЁеЕЯ@жазБMѓЕcy4GLХ ДV7)к ƒІFCozNFГЁžа6wП{ЈSаЬ Q0мf)А­Gnr›2+7лN.€†/DХЃХЩnVаlGЫžR^БЎаvЮКаƒЩЙ:„Ћ'ГyPg@ч4ыo ‰аjЈ•5rГьъв”лK…DяјНKZi‘НЈк"жhжgДyПл7AЂ=‹юяvя1яЕь l?Грž)Ы’M7`1т%дX@бњYtY5б?]RMЕп“Ћ–пUZннтœF“0nИUz~3Fяy3Гор} Дw Ђ–IУз!ЛGW`4Дё’дЎуf…ішмъУсРM 5ЅU}p›;›*Д‡AgTdшіP}ї~;:Ÿњ`QO1њCЇйjŸ–v№MЩЈWТlЂ•ѓЃѕ№|JЃ0šXŒжм ZѓA'{ G6,WФ киЙš)XоЌz;b„Ц%K˜ єc]m5Уы4;яно| ‚iнmЩї>н„џDЮЂї ЌV;Ѕz*Ћ f4j\4ЅWŸаƒFЃІЪОs†UЃSЉmЕгЃгЈ­Ѕ ВћmБк^Z цG;ыДІЖ|qS{Ђѕ,†v—х_†–{ыC+eў&П<šЇuГz„ZTдs ГЈe#аVШxіёxО kщžѓ”aчјCOŽ W8њˆ“Mѕ S•\ш3‹>ћЂЉNYаgŒІf-D%аg+њ\-.$Д ЭѕђWЫыxЂхНrЂGvG{э2яъjhŸ^ошгБљПгQЕ ыŒbŒюм–3ѕЇуаКљ?oДње‚~•ЁЭЖаЪŠЖШЁ=е'˜@4ѕЙЩњ…5555555555555555555555555555lЌ7^ev Ь Шј@Г „wІ_ЮЉ‡2k8ЫѓY(ЛЄНЌКь1joиЈ]ЫЙBd6шљ„eШ{=Шеš3іK“56t1{ac3Lnзj@СЦ#9tQѕс@Ѓ‘ЩЖsП?%Э4ššЅmяЁ КэEЉ-frяЁ њ ЃЉе-ЭЁœњ`Ђуеи­…ИxXіiшмъУEkc8}ю:}(Ђ>№h§­zxёєЛИŽЮЉ>аЛю C;a>zшцŒъƒ=,jФJћИЁ}’‚ЋІњp еCЯ;р o–+bšO-хhѓЬЌhd-}аt…вцўщpл?бt3ЃfZYбщеnГCнКЌкMЂmьІMjѓ{“ОјјЗi–Ђz.к}•§ŽШn5~SЁŠІCуъяяУ.)й`[ЪОs†$ъ\шTj[эЕЂ­Еy4~\Z0gM—6аBђФЖWNРvTЮŽVЛ ДѓУžЉvж5бюOЈЋA{ЌŽс_Wё8ušz~ДЛ,2+єV/†žўЁ“_ юъ1jIUjeЈНc|Z9бЂЂМыь@gYАа‘,i‘ЙаZ‹#li>э}p1snгџ9ьœ3шОб\Н§/J}Є‚ƒш3@ŸhКSšЌ$FŸЃбDЋ шѓЃ5З7:D‡т•ЂЭ9ш‰-/d[ZоЫ[=ž&Њ3Ѓ_ћLшёё„Ж5‹FЗЗЭ>Nw§е™ШЏЏгЖi‹іЪДЁчŽїЂW'3SеЯЯO§Šбšš;­ЉˆЭўїЧц“ffбЪŠfЯњддЇ(5DŸfГњ•zњ“4ћЊ“ __}аЭвN‹ўћїяŒfе@ј*BЮ“nКDЉ'Ћ– ЭСбžЫѕd-hЪќїгHДYtћ††U–@ћЈнƒv Бꉆъшл_›ЙWєšаj§™§‰žо\8rєЬ|{1пqљOtЯ-эЂj’їDMм)ЬзLЉ“Ё‰!qл­4vџEъqПЌGlћМGYz`пgєпxtџТшKШФhЭ~ПЃзa8šn“=ЄЂmэ’}O€v:њЏПЂэMRЃЭQ{ЋUЏvєHŽОыЫУнЧе"=њДЂ'xѓŸГCДЎј”'hА:4mЬжнОhQѕLш{šx2§МЭ2ѕpёJД<ЪЁU"4б/киqѕШ2hJ wХМНф13Гжw…ОНPъшЫU­%ј-Q2ъмц  ˜+FŸXД2=>…4hА%тЃGЙЋкŠv‚УеВвўЫCV7+К/ЯQ7зg тэY{>таї‡D‡GOњаъўдŸЕњ) јSЩњЫ‚юКяеs‰ЇЬh­Щг˜0tWцЩ†Nі+и. =…ћVІ1пQП$шDЃv U2єw“ьшО‰б8§н…ыцЇfЋєM’-‡9šRЧš-hЕЅЪ7Rћš•.ОлЭ‰аїЁгрVўf5•cШ)бцИ§Щ]Он #9zT‡Ђ•hЬ‰б;˜Œб—KДYі;R а— ­ŽDƒВп‘j}Й0ъ84,‰6Ь—1‰бИnz4З­КВJбъPД2аsс8єPчbF€~bGХ‡Mсш їђxжу‡жR§ŒВz4&ььhFmEгцt йЭ­hNŠІе‰бЉЭ‰&еEаfšmGџ3>АЃs˜НбПpќб‘fЩ™6Ьэ†Q=Rbа‚зЂv0DџТh%0чAыlѓpbuє3ЇдLэlш DП !Ьу.ˆfЭбhN {cеoэœGМ™+Ю™‘Zл#DЇ0геyєлh…f!:™,oAГЁS™ЉN4БЭRR="zќЁ9ЁЙиђHGІЊ_‡ЁЧ“ѓ.hXўj„AгЫУ<жЭˆО^‘š+мO……3ЉлV›!ГšAУMу zЃtJДъЫQ=y4Б‰+аа—HRЙšˆ =П<2™ЏАЅRнc‹ЗлŸvn2о˜xЖv„eвyЭWƒАсМФ)Н5Ÿ™4›?…Бt4~YЃDGeдДD­Dшќf/Е’ЈЛЅQэ@‰айХКкmЅ ZЭk#К[E2uKb.„VcГ‡BЗмo­Ш<б Е‘ Ы“Ec\•WЄЖБœйЁЖАЄйЮцw/lžтƒ^к "B/DAИ•{‡@съСCrѕо!ТЌЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЉЁ2ЛБчњbЛiєtDy–5аlКС§в—cЁЬнф}Aъ тo<ЏВ*ѕnЗпя1joиЬ]нё ’їCЙлИпшё”НЕp3€яŒиБ˜zCӘ=ЫАБ&Гk ѕ аГДьнЪš1Z‘hыSкJЊ:$‡‚ъCBt1Е&^‘^шeдБшьЖG‡ŽБ‰Ю­>L]Ј;EдГ.УA{ЏOhиCœSB=ї0‡Ўџќ C™я—Л }шŽЅаљд}€ЭE№Ыm|“ts6єС lL~е7ZЮЭІ>8‚?Qƒкіг1›hхDчP;Эбшєj'ЎДŠsЃнsЦK‘з…І.ДкЯa~oвWoџњ№5“ъЁк\>)њфу™ЅшY§ёЫогЁaэyъњЛВ=БЉВyеУБџ>„œEB4Q?:™кR›GЃп;Дu $šў]ЊpвIиівщ—G ЕЃ2 sП`7йŽвбjWa8f+z'DGЊu…KУTџ›ш8ЕMћ˜…В4ЃхVwvДЛ,2w[wЖыˆЃ–T%ЦАуLЃ%е#аЂЂМЫ…ЮВ>`Ё#Y’„-jВХ6‹D Ѓtъœaчє˜Aw1Œ]УЬG2єй‚>‹бlЃќшѓ„Vш ЕДmžбhдkGŸcаjq%’Œ=ГГЃqA|$@ПОшўЁ†Ž˜ЬмЃOЎJ“љuШxёPг†Qmщu„НМб'3SЁЯЯOю”йќњ бЏгEЅЉ8“ƒnB/AsjТ<Ѓ_9є'…“ŸhєчЇ­ЌhюЄО$…іfCєI3ЫбЏЏRєgїњA]@ПzЁt њЏ–O-"єЋ­е›ЉйDгl@tЃЭ’f;4ž3DSj_єЇ §7 §їП†Цъ0ДZ€Й§Е™{qtа=Лњž Э)аVЕїEЃстШўФhŸzжw–|hќўтUp|GbЬŸм}•Фм>ЈЎЙ4‚о]АКЛNqwнђ%c72{П™QУЎ‘hƒбО/DŒ•iбš< zЈв%Л%B bж0џЅћ$Bыў"u0кfN5iS§_CKЬ‰бPэSx%hПТ:ко$5њnL:эш‘}žtя^э]Z ЃvЕHОkцLю9аїћИ8Ў‚ъ™а[= Z…ЁEjoГL}Jˆ&>ю$CлOЁЫƒštFД1‘№ЗqСњ0ѓЃžї|^RтEdІдУЖqOZxI‡6ЭŸLC>3C› CЇPЬxЕЫ‹v5X%к•$hД%lIч|C gЗZ"N…f’ ыГGZ\8'кЛxЖТЮвњƒжеƒЏ§шЇЇЇўДХарЩЗtДXzn1N>vAЗ Є=k8§‰U'BkMžІ„Ёл*OEбZПє“шК„л=кь‡ўўўЮŽюz˜cЬп]˜nЉоЖњ&Щ–‡нœьН–PЧšyДŸš/ѓдОfe€­f/Е­Ьм,амБПeцThM§Fn#4'CыъPГ’‘Ђ5v,ZЋyЩ‚жЋFЋЁљв$к,›dдfqR‡†eLд&еQh\7 =™U_Z)F=ŽCu.F’ЂЉв—KƒО„Ё/LВMкLR4ю[бqfN]бщбДК :и„ўSMЊ‹ #ЬЄкŠFdРЂЃЬ25žка9Ь”кЖ: 3Е@$шhГ{YGЛ–P“sЮ2iSmэF+З9њ‚аoCѓИ ЁГ™ЙO №А7V§аЎЪ)аLqЮŒдк!:…™ЎЮЃпF+4—ESѕ-шQHl’ S™‰йаЭnє[:'Y‚І†я@'%Ѓњз1AшщьЌjж<СI"…6O…uSЂ(НB6;Ws <UM‹Оr`ШZ‡Ы-ZбGЕlM[*ŒЯ>uђЃ‹šг г“qУЭќеF;@œ}UйЬ†кl@/uЮ Эf6FНЙŽ-! ЈЉнуiзбœ3ФЄ)г юЎwЬ~cвyбJŒоlкУй:ГyVѓ]-8*?yV 8›ѕ еƒЃІѕ е8f7I‚о”A”ЧBЗl ‡.fžшNаКРёш%ФЕэˆЅЬ‰vА-ћ$ёG/-CЫжm&|фЦu™Л`лЊЙS pxА^№0де{‡<ГІІІІІІІІІІІІІІІІІІІІІІІІІІІ†sKЯѕЦrгшЕЦ~Ћkѓ€E€DАйаС;г/(C›gœылP<Л§~Й§Ц§x кЕ(yп‡07їz8co-[ТlТЕmРМ7В$DSЉ‡BьЖ…v? |ЪЁŒzъsР§ceаyе‡­6Qя{mšэдS=Q0киDО[їoтЎSۘЉ‹ѓЮyюRцѕinиЖкmбГ{ор>y!ѓъа2ёcз”цг^yЕ€МЇ~X4F_Z-2[дФE.;–џј ШN4dƒ29бm(Вky 6Њ”кќ>Чь….Щѕо4kuгЊпa45~qЁїšUNЉFеGЕдŒељ#)ZЁMЫnGz(IдL‡FпCўобNИ>ЈЪєpf:‰›)ќю@K&Э•.Žю6 з4W:ZЭюЭxвœџ6•GЧЊ]u…—гэЊ‰vжхбФРХш8Еmhеќ'­^šž1ћяGЋ@cГНЫ–”ЅeэŽ3ЛЫY=B-*JТЮчfЯ™VKъЇ3э{ ЌiXёЙCЗьГЖЁћmЩЖtu_щhфcќаAЁЯZдЈюУ Л f‹ОiА™ˆ Э3њ,GY=-ѓ _)њLЃбЈ…ш 5]iнhК>Ÿш‰ё­њѕеИxє548›5 Чў.д§_ZЉЯOђјСлGCk›ІKŠ™ЯO­Кжгп<нp|ˆfІб†№ѕuмі:ЃЙг>5Ео2њѓ“WkfŒ~ха]Х4ш‰ўќДЁ6S›(єШ]#бЇ Д6z7КyЁЎёшЯ)BєЋ=ХƒCџеђЉG„~ ЊzЛ5$C5ЩD7њ“5l_3T:еОшЯ hЋY€vЎiX2?šИ- 2ђшюlкG†іШ"hђ4ОhШN€Ж: šPћдDhrq$GBДWMы;KF4xё,ЪЁ•‰tO';аўЃц&} 'rєJєDK„%'@ЗlЬa™њnЌфдшІb_? &н}‰fIаѓ[Э§Žаоя.к -‰EЯ[š/ЂFm^ѓlц“žйГ:рЕ|а)жДЖ-ТlЂ­ц$/D-ŽV!?#ŠЬЉбwmв*€M˜Щ™­&ѕZб ?}’ЌŽ˜Iгъљuш‰^Л.p$šЯ)-)Ÿ}џьБ4:лЄНЭтѕб9’ ЉЯ;=ЃC?OшxГDѓCVƒ†AfB 6Э?јЋ‰štФЈЉj хšаќЖЬcz%ŠпZR щЇ„–™ ‰ЇЁЉWŠf&}ї5+Б9лšдyа™>0… ПООG7†/ПЪbsЦIћš-/э]љщi8q9єгг“7њiaДПyѕмb|ЙаЈ~њiB? ЩŒ6ZtеКЙкь‚†Ёл%1п‰vўцэЇfjLы!Nmœ§§§ЭšSЁЛfпѓwЎ]єНoЙ> Й њ; -7'Bj_ѓРўžТ7K…ОЯЭ‚Эњ[dN†ждпaт&Bs:ДЎŽG[;%DпгЁэ}’Ђ5vœz.xiЇ&ЮU“ЈAuJ…FU#бЄ9Ћ#ЭmЏЫE)N­еM‚ж+ЇFS•;ѓ% }Ё“iy Tt!t˜™S?"ЗMёц’ЬLЋMt5бП`\hZŽЊуаЉЭўhгŠйBtŒ™R{ ‰YЫаqfŠm]hqРRФь^!ЦбN4TЇ_Œš7 аЪiЮƒ6иуao}ѓА‡@“фlh\јэSO{d… Ђпо8ЕЖGˆN`fЊѓш‘­YŠNc&;ибpјтAаƒи$@'4+НЊMD€NI˜t:-uИ B'V_ѕ0hМYSъy9дW­Рx"šD65ьміЂЬxq&˜Dj3бqŽdIПY+d1—@—5GЁЧвЩЩvєfГiL›ў/œЭДп‚Ю@ЖЊ7fX ‰Ю™xRїWboI3ToXsЇVšмkœŸ­ЋЧюЄЊeЗhnЇv~~Д2ШVєІ9šнgTШm†hk,hŸн<К%fzSФќ˜h%47žЁE–еЁUп* ʘyЂ;AЋђІ@/bvЋ­G,dvВmћ—3;и–Н‹šћАА›лаАU“лˆбKCAАmем1И~ђгЗvэ˜aждддддддддддддддддддддддддддќ+™юїJмAuЅйСpћб‘AdшГ=Ÿ…B›5улP>ћ=о7iўЛ–Vяћ`r—с bз Ь\лdšїFж@юд`У^;ˆоЙИ™ˆ§ЈU’{—ыI­ЮьBV„hћюУЁ$Й‰Lэ0ЪБЛfёъОL)ѕR;Ÿ>сPŒнє8 Е`іє)Eдz+ `_ ЫЈѕFмЊсЃO,e&cОYWщћФЭѓ#Цh sЉEfќСЈћјЗZ`> ЯЭуcСЙK™zчЮЁtеУšж/ˆї№Ч.јcViЕY§уƒ6;аX х3є!ШМš|Ф•rЁ?>4ИОёfSjЅGПwљРj™cЯЅњвЉбsхйЩМй|Ы1бZнŒш‘ЬRє^3U“›ѕђ=Лл„І1Œ")Инh№kGzn’Ф§‚юі…Ёпп ?а*bдяфЄп9tKэР’х^лC“x3ч бfkЧЊyДŠDЋlhО.Fƒ‹ќtœZŽоA3ўW5ЁŽCOєХаjD36ўНІп№fBKЪвВŸЭžŸмгqWPуZгХu>ˆ„ЯЭžѓйŽV frѓё§и„zЯв5ч9нОщžпnлтMъ#ŽН;ГшГMtJgЖЃЯєйЈŽGŸз>[бg_tš,ф‡ІG=œHЋ єљь@OlŒ&Эсш&'Ќ6шзззбЌЦG:к<›Ї~ўц“™Йц'§ЃХ~Eшз NœзTћдРzвЁ???ЙS&ac7Э[(q—Іb^єg§:gміŠžažйqшŒffеиLmЂЬƒ6MўќДЋ‘P=ƒžKRhOѕpвп9ŸFшWdІбfQ­[8њяпХа#л§з‚&еошO њЏ7Ђ)Е/–ЬЦ7ЏЛWК=}4P#$О б>jзыp0ћпл@лещбф hМбPЗ>œЋcЅh‰9э\ >5e‹#к:kџwD­ rЈл,Ш!jTСВ<<зНІQУш™_‰^•Mu_–ш–н—i@sšO"єНл…>Gїћ"'mš-7‚ŽEїЦэщ^ˆЖAЇ˜ДЖ5кjNЖІБ:ъuИZEМ˘ФмшY}R?$ŠцІѕг$№чёмhfцсшS~47kньџCтЩхE[ђ;ІЕ Н ЏэWXŽі6Ыдоb+і\њДtая=HuГD} @ѓЃƒЬXЖœBд9W1ibS š2[г!WjщE: šyЋFsЃ_5š‹?њыkqєзWcўђЈћUM?ЦрenбйдТК_]ўyД›НетКоцŠўЁ=K?==ѕЂХаР­zєиущi|ЙаЈCѓазЌњ}Ї!йбs‹ю7zZ 9+6 3Ћ'œ"ш99б~jІ…[BДš+1)удњЩпMxs є}l…†ц&YбCШѕЬEапQhDцЭIа“њ;ммЛППфDh=РCЬJjN…6дAт&Rs2ДІЮnN‡ŽW‹Э бщдzбЫ%9к,™H­—o“ ‹І@Уъ™а;жЌДт„: Љcб:9зЄЕЪmуЫ% }Ё“mІЂ ЁУЬŒЗОNџ3шP3Љ&КЦОЏ§ &n&дTS=}эDSъh%E&f-DטёЈхш_ъзRhЈv­ДЂс‘ #ЩСƒhЈ&жs 4q aЭДr‘sЁ/њ­aіhкœeyuпо8ѕДGV9Э ЩъЌВѕeбD} њmXШа бЙЭОшN8|с‰NgіCs)ŒvжN„N'&<vИБЁбЦёрёфТшЋ7ы`Z­XsЧІбh <"1њЪ››^”oТ'‚Ђ‰ЭDC=ФЄqь%к\мlGo6jУh‡Н›Вb‡zГiе›!ІwкиўIsГ‘9ДКnPZЌъЏxgЉлд Г:uІv5“jJеГ›уЙEбЪДка›теF…мцI=6чЩšп9U(`м6Ћ†–UШќxh%4Ыа…ЬŠК0г 5Ё›v$@4ђhtqђ ЖйЯk ВNA/iЖШЌшeЭ<лњ|–/ziяRЖnВТ@jлкЬm0mЭк)И~ђ\;ЗІІІІІІІІІІІІІІІІІІІІІІІІІІІІfЁ wNEwP]mц[ыR7~v/bcВУсі/$D!Ш&Яђt ію›ьіфэЎ­}B„Ќ>У!xпЂтж<’GБcIЕсизHcvЎ‚LХ~и*ЩНЫѕœVgv  Ћ‡ƒ mнлT)k–В­ф’ъУ!z,RиЌЋнO1W)Jž ФГ`цŠO)Р6zp—™<)ГњрŠiUšЬ’ц`t>ЕЛ5P+Б9›Zв|ЪыџкэCKЬѓ#ЈЬtѕXќУn6>ыO?XЮ™ъe4[аѓO0ƒyў™ХВЎ3ЂЇ}(ёА44xL€jЙЬcЄ—БЙ>РOŒ9зЌa ж^|ZлKš3кlаШ9:љ" AOПЮ]§€d_tД”sЁu6GvЃcеc]ŒV4zајmяЈzєћœщЅоWfаѓњpLzš*о$•й BУЗnт_5š­ž §>ЃnP3лg4_<ZhRіѓчOЅ~ўdдЮтQh4ољ[:уFе?№BIf6.|ѓA”ымЄнwЖЂ,šDн~<Л?ŽЬ…Tгtи1Кџъ|ІбЦЛРqlЇ>ТибІљ<™ЛИаЈW2єбŠFf}ЖЃqЋPѕ#Ђ‰BVєљ еgR-DЉЛѓ8ub4eA“u,ш36ѕ9?КНѕБљП.H­ бЏЏК ЃѕS‘yhзї 2k™Њ~"ГxИЭhVк†щ‰щЊ}sРш­шЯ&м)“Ѓ_IqŸЖdєi"[дЏЏqzг6›ydŸ2 ??эъW,$6‘ц^‰6Яўлфгˆ§ЪnaШ]к61ьЩ:%§ъžˆў‹~AЈ]hRэўLŠЦЋЂ)50ОКаАdv4u‡tКUэ§RtНнш–ЙZ0hп{IC4TЧ­GEл_†yа„кЇЈЭмъЧmŸЕџuк‚цяPфKFj€і+KЃЊa‰L“ІЇЊF%xДпš6§—‡ Щ*д бдЦй}QВ["єН[|їЈI#4ŸDшЎP,њTн3ЭžзЉ9m>NЗ<ВЂЭD]=NRsbєн@ћ^ кћЇЁ95њn˜Нt‘™ƒбЌ^7‡ўd› ЏёшS ДuвПЎ™~ЕфънВƒ~Ч4œтЎŸ}П?4:Р,A{›EъsжA‹Gн2RЁAЯ|ш п01fЎFmY9аєгHˆЮА<ˆM!hUM6 @sfbLбhІtCўњђA}•C3љњђD}Iейа_}V‹&ŸF:—š*‘Ть1щ<˜&u&ДЏZZж­*њ?†і+=Ђ=*кD{–VOOO3њЉOF4ъа>ђ5ЋОDзущЉzъdеz=эЇfj€&ц^mІzЮCЂдDІЁš+1*#ењЩп]ВЂ‡qhlўцІ@пП)Е/ZArДЩіF+Б9 šRћ›[ѕїЗ€œ­Б[ИЪlN…6д!т&пRs2ДІ4+Б9:^-6'Dы+$эj”jжFЭЫх’ +&AІОќ% кЌ‡sО\8u 4V‡Ё/:њТ›г чТmлцa šN64ШЭЈ ЁЭ4ЗМNџCшP3Љ&КЦО#fGSMMєЏ!гзN4Ѕ7j/єЏ…бУ—dO§ызŒўЅн†Цъ3ЕњзЏUЃѕу]hбњˆ#c5!7wЂЁ:ёzЖРYГ­фlш a~ыC˜‡=„š4'BjxФлšlАйВ)бИО=Ј2 бйЬЈєR+d†швƒv ‰ЏФшdfO4 :Й:Ё86:‹ІUЃъз!V4м<<ž\xдW=^hуЬЬheAЗlЙнЮCEЃWjвx4уЉбjn‚Z7Ё– u"љ I‹fŒ6О_эDo6кЪ5ўвВй&ле›MЇоєаjnДН…ЩZѕф†Е™ЂЁЕ§_eЭДКйКСщбJ7OЁžv62Љn6ЎIMюƒьœbJMЯyˆл<БЇц<ЙEГЛєаъъ jhЩAEЬZ„БZ?ЈЂ-I‡.gкэ~!–'ЛщŽЇЕйІЖЃ5ѓ4+za3ЫЖ~ж?євк1Єlнф6mѕf@Ф›–ХБ!€k'здддддддддддддддддддддддддддддќу™o+nќ:ь^BeЫ‡йПa6xќГY.МoВл“4{ЄЮйw1Ф}Црі5АїšzПG6~Я’кН‡бл‘Л&SБЖNrяr<Ѕ’9тбЅе‡6Еe_[ЂИY6lЋЙ$ћp дЮч/Ћ>`Д`ђфХиZЛИqJіСšЬ’fˆVRtNЕЋ5;jї‰ šЕфФМш›о§ёё‘нuh“н%“zn0GjЖЈѕ’™ЭŒROKsS2њУFу…Ÿ№ш jаЉ™uagУ’ЩЭ У‡?БQХФш” ГЉЦEЫЁ=Ш&{AДЇYSчEуъГкл<ЉЩЊЩмtѕPѓ fЊ&RsеhќЛ:кZœ7яxЕЕlЕНЖеХэЮŽvдцІ<œMOлQ8^€ж~wNЏ:VнTxoУЖšёЏxѕЕƒKN"бяs„hcЮДšD’ЁпэшhќлЪєoфПАц&ЩаCm„&ў‘шgеќ7§ё.3ЋгЂЇъjDцнЈwФ?#MзCЊlДQШќVNЧpшvпЯq€Q=Уњp­h§SGЗ8ДmUЧ™c$шГ–fзќ@‚ž:umƒбG#.Д2Ь&њьF›ЭRЁє. }„I„>:аg њь@#s з9Zбg+њlEН‚дTc&4й+Р|:МаglV`“кыNуZ TыGBєЋ~…h§Th6›ІB~~BsŸIмdB+}УИЭH[ЌЉ™}:‘ъЯNMŸ2š_gо‚еŸ3њ”§9„=щѕu$ЮЯcиЦž3Эўд“mд…MЃЬџў§ќА_'ѕ„~ЕЂAеІOŒzДЮёAЦWИСŽ6њЂџЦЂ_cаjšVЄWG Џˆ&е&ђе…†%ГOšКУˆК?нЊі):^‡ŸфmQ г2ш;Љ^-N.ДРvЋ§аЖЭм5'}З џzЃџZам­~BаЕWQкИ/R$Њ3 $‡Љa‰LhjЦсjЊ ЗЈ#аyГ?š.C˜}бJgг}’ЂЛ ѓ AчЧ@7Ѓжћb’šгЂїŽ˜m>ŽyhЋ9ёЄя&:|в$u•ш“еœ`вœо0‡~žv˜У'эP‡§pЪŒцvuШ€юйПЎЕфn}Ÿбф”ЯƒОпацLш{VДЗйkд>eWюОhQэlhџQлЬfЯs.ЕЭlіLцž…'њЋ ЇFO"вЬ ПњЄAЃŽбh:џ!ДL §ѕп@{Ј3ЁПВЂ3}і0g}%ЪЪцEћЊ…UаЊЂџchПв‰Vƒyшёд&+u0ЋЁDзфiHF4jб|эmV}…ЎЩSAє“іилмЋЛOДŸšЉa4щП0j#йаDЏ0ЕэЃЖіŒEГцшћа!vж€м&#zш‰ЦфhРіEЯьяЂшя8Д’šS Iu˜љћ[@Nƒжй-\….Ё9кPћƒ{єЗдœ }F+19:[lNˆŽV‹Э)бїиQьЛГ[Jє=­є\ёв$1–L2iГ<ЉŽFEуа—ід‹Y;ЯЄТ—84lh3aцЧDгjм6ђъёЁCЭДzѕhЄ&zbєЏ.УWn4щŽ0‡ §бПf}E‹бУ—NєЏ9ѓзўш3ЕњW8:Ю,BыЧЛаД:1šКъYЬn4TѕcЩДњТšhх Ї0гrтЗ!ˆ<ю”-Ќ~›.кž…Э6є›~[–Цh>й2dФЖ‘y4v~ГЁfQкКЗЄЙQn;й…о”4Ћqи.Г нЈ7ХШ#кeт—є<ъ‚ш!БшMЩA еnєf—мЁ^ŽŽ^вl‘йŸавa.nѓ„въDƒg`CƒSŠБ|ИХ”( ’УбyеіжЕыФьцЄшЬъЎGoЕХ<дЫˆюZ|xП-Чї?ђЉЧайдs~}ј.ЬшЙ‡REНЗpшІfєЧ‡]Ц ?yиЭYд65Г,ЫдќHmF BЬ@ K&WЃњ!dРЮЦѕЭКMЋЖ =Эš:/šЈž ŽMџ5OjКl"5Sќ#д<ЈЙВiдшћ›:…к^›7wПеЅїйы&@;jsрсWб№W’"tМ:§sD7џ§ AЧЊ]…йAПJgбG§>DŽўйdBЗфшЙY ДЧЄ;gЅ†/№А9єЬЮŽџођsRhєя1‹Ёеˆ†џHdЂўwЄщ7гЙаьŠžЫjZгЌ~jjmрsqЃ*Gfа:zз-ˆ7ю0Кщ>ъЁЯg =ЊЛnДбэ˜}t ›/оЅєЏwNєq t­ЉЯош`ѕ‘W“шsšбЈЬб>[аg7 RŸN65>[бg+ЗђКН†žBЈњ б›@ыж)qfЭЃš0гh§T­ŽfгXєЈўќDц>“ьѕ Ч У63]ЕЯO<ц є‰Bvс>8Фзй‡ЗъОhєЇўЌзW“8 __љSєТ9бМк§iA{ЋЛ“ўЮљќ”А}б Њж/Hm’‘к†~5жєkКg{ЂUzTОšаўЃЖЁЕЁ|uЂ? ЃiЕ–ŒEŸkњ“КУHыќнЇ}№{ FїЇЛб^j„&Э§›ƒ†ъМhњ^.JŸЎtмTЧЃцxДSэ‡ЖЌhюЎ9ЙKе^шП+@џM‡ЖмUЩŸ йQшПКЛВоябjX"šrАšЊ’MЉIršЉƒЭоhSЭєIŠnƒЬ€6ћјš“ЂЭYЧНЙ ч ЧМ 45‘ЙU$њ'B[ПЉ—‡ЎŽј”чшŒfљК9єѓt.Дkжa?œDцЂ r ;vР/™њ3р+Лњ~јЭи`%њ†–еЮ†и~шlf?ѕƒЁћяїƒЁН'§ѕѕ•Я,V7Š/ѕ—X§€ЮЇі0}§а2v&єзз -agA} =F2ш-ЈžыГЧёЂ'+Zб…б~Ѕѓ-jГ'zњЬфn’6щёгщафЉKF4jb6аOO…аZ‹ ДъJŒ_ид)аАGћ…?йАкб~jћ ѕ˜IvQtZкƒJ›mъН™ЂЉЕVt.3ЏоРLhДЇИ™U#кf@у#ВœЊ‡Ч˜fЩЄ,EъюЁ—xvk•В› ЕRтIЎЪ™5vˆY;Ѕ$yVЛЬд~}[AёЄv šмП zŠ?Z_ۘ­j'z)ГMэB/gVŒˆUЏ€lUѓшeХ] ŒН4xrЊ@ЋcаVNnbЂxДNѓCЖn*—‡DздддддддддддддддддддддддддддддќKiяїŠяћКъьŒ НKЌйса,У#гyіћYМoіЛїl‘Тй™С}І˜Э‹fFяЭЬЛЭ]Ыsg4ŠvНg!В5–Ѓ–4€ПyісрVлб‡ШMгьф. ˜5Е/zЊPо<Љg Љ‘š‹ЉS ЧnC›g”Cи`5Е p–4cЕЂЬT…хШдЌsЮ­юъ|$EїхrЂ?њxЋmцОb>ѓаТЖH|Ч4†lшЁƒзD†Ю6ъЙП>Œk‡rЋЕŠyаєо$гя- :зЌ?ьjД(р'ЛЙ[vYЭˆЭ\5ь‹ћІ,Zhj„NЏцбb2`/‰і2ыjŒNЊ&ЪЛЭмO…аDuк9jЊl26Y<:•š.jžдtйDjЎИгЌИl­ц$hЖИН E'P;jг^ѓ—ОдЗРV8^€ўЉЁ.vU&бКћ­єЯ­р5лU:VнTxїCџЂЦ/ішŸ §žbдяM|а?њЇњНы—Р,@З Ё]ћнOœн~7ь— л–‘hvвjDЏИŽGчэгEёъї>Qфc zњз6†kаС?ЫQeCЂЭЄЂ‘Z)кlAЯэв ЁЁZG+ЭЬЂF’˜Ёк†>Ÿ[ГъПŸ€ }\нЛЯc”Пj6ўд“ЁƒеG‹šDŸЕЈYнdчBCs њ„ъИачp4ъхsOwЭ<чxТj„>ƒ˜hЭMЁGщQы‰nнP баŒбg=šD›G5"OjТLЃѕSMє)њѓ™ћLВзйЌŒ-уF#]ЕЯOэЏ†NИ їЩБs§ўаУ&њЄ–м%њS‹хДпПuт`ў§лr†^8 њяУlS›hхF›…ЕŽ!jУмфSЦіDƒЊzУ50‡ЁЫУ‚ў[§лИт§ŽA{Њ!ZЈў=FџšEF3j/4,V4q'm<нŸюFћЉэkšМ§ €ўvЃ!;mПтбїЬ A[дAh~аЬ~‚аwэПЈ­+к‚–†AЧ]Љљ/mNЖŒњЏ'њ/…VашxєнѓъA ›­Pœ­ЛSЂбКˆQгeвЃmwEM„юсQkZнgoѓј>Iбї;4{О#п& Эƒnw‡ЃOЫ ЭQЧ]Ї‰”@ћЎi;кu>N†ЖŽ&muФšЖ›cбЈ^Ь ё$4G Z†:ќѓД‹œњ…8ГУ~8‰Ь9аїЩьTЯ„nŽ–tX Z<ц|шСэ…WЮˆОgC{›§F§`hх‹ўњЪhЊ›ЃОООМаRv>tKіR‰еља_љаљжtZЯ‚ўšуQWЎЮўЊшђhŸКЋYгhwљLŸ=ў;шŒWjYбpt–7Х|цЧDчћјёЯЃ=K›шЇ>б Cєг“M ;„™;uџЋЖЇЇ‚шЁGѓwˆY=Еџапкxѓ6j`V„93іKcfа>jІ5щ0ѕ|іїlшБABєw1tЕ’™ iuYф2h@cцЭ)аЄ: §§-1'Aп^O§ћ„Зљ„o—mЊФMФтdhнf6діN бњИ#еЎF)бБъ‡DЋ‡DlgŸЄшшЃpаyацEбЁfu™S­ѕЛЄ@[йiа—$fmQу3§њЅ§%B_ЁЅj§kќS†О$C !ЭK eъшKJДђFџњe ЛZДЊубљЭЊ)ѓ/э+'š Ѓп~сМyЃуЬЂѕ1лPш6Vub35!7Ь,šSуђбdZ}СтбLЈЧѓЁйГ]MіЦЈп0кR:šЌЮ’y4fч5{Ёп8ѓтhXўэd››Ыš}бoЄyэшбИ2єuŒ­єtц‚шž-FkчсЂ™_ˆWšxWЋ:)ЊЏ"45њЋMжlEЗlСœлMрММf ОТ“Цht^ntзуЪ Џ"4>m(зOnžПГЄ9­WЫ`ж.ЏC$ш+МрчRшЭF`оl(uVГ НйдэAЅЭHM MКšЙNt.ГEНщд›)ZлДБЁѓ™yѕFšЬœZlfдyЭІz|рažеZЉмfeіъ ^цёŒыTЉYSh?ђtJЏ.#žйЊCл}ЖН“Z=zŠЭLЃз­&їiЇЌбЬЃеТff>ЄŸв’ж9фЗ~эherDыcmaПf4ИЂ=š\.j:{€N_)‹™jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj0№ЖЏ+~—цЅ-Ђьк;гяIН3€ЛЏЕ§УsуТйышљС|€Оu-ю=vџ’иоУЃїѓA+RГZ‡y9ЖC<ТьOЈlMDƒ^ња'xа‡ЎТdš3YТ|˜ 4[ʘњРФfЮZжLЉнц2nKѓPtnЕ­Еѕei?1Зљуу#@ЭŸвзЫiўшу9mлсcХ|цБ…MˆЮІ;Џ ѓЯЮ6ъЙжЩкeкiЮ†ў˜уœ2@ГюЙdv3Љ†+YСwqЋ9“ћУІ&^~д4VsѕЏІШцћ!Щ†ц jM›iє~%hЮЬ|˜ЖЁгЊ›rОh.VtB5U=дЌЉЉВщд%бЉдdmšYеEаtэї •]ЭдMЂцj„-ŽIЭжM цkГшŸzаёjGiч(vUцЭjR+јš”•.ˆў‰ГїEчSгhТ< {…“ž€Šd+уEщ*M­tєnGRaЦ{q”іМ7:ЪщиЦ:ŒўД„hуыЈВ]П8ѕqJємю˜иNДвVЗ’ F’˜Ё ‘Zщш^ џ-зf.ƒ†jнЊб?@—@эш~>ŸЛ?›=УWчnЪjЇЌhа+єЅиМ†'VMЁЯzZєъŸњYѓ)јњqqЂЯg€6дg'6L`>QЯGВf}†fešГЁ˜<Њ'лO€ўiЊ3Х‘ §љ‰ЭjђuF„žејДЎкчg"4Ќ№9‡ћ<гВ~џўаЭ6ZмЋЕЪБъўДП]LѓчЇхДпƒPCЗ›,g•ѕ–шПs>…j­мhГАж1D а@ЭВџ6У`fбŸЌ9hжРь…ў­ њw(:dдQшљлx‚іT;аœк ‹цF3jљл…F53ЃёнgќаУљNДЗк‚&n™а­дОЇE[ЏxФн\Д`в6uš4qгœpДЩŽ\дІYŒ–F‚іПRџ%а šƒеF §7КНFнQbЩ†tНпƒбэƒ–KЖKƒщэWо@ЋЭ5KfŽG7Чklj]ЄG›ъvƒчš6а|›ДhНчпЮќшn0њЄЃЉъ™&mvѕEџNЇG’ ­ѕѕНN7oˆVДюASOaьы§цrњ+$ЧЁ=їБЙ/њ$ёFЂсS€rпЯэ'гьhzuLhяOy'Й:mIРчщю„EбП“›sЁя!шСГКgћ˜Х…sЂ=?0yдЭŠіњ! Їйoд…юћЪ‚0ЫЪїљ Пš,ŒnР]ќа2u>єWZЯbўš€vГ3 ПО‚аЊЂcа>uэjх…‰vжЯѓйу?„VbГЗZT3„<z!tаœUЦwrQЭŠ~$єгlhи њЉzьfюдJ=iѕŠ Л&н_ф!OfШ†оџ˜у@IdЮ†§тЭпMшŽ>jІB[<бЌMqn4vЁ•IЮь0Д™ iu(X#—AыьцBшя8єїЗ„œmВППUитј–’ЁMv€И‰Xœ­ЙУЬ†кб)!Z›v$ке(%:™њ‘аъ!б#ћБа9щяяKsђхR}щ:ЦЌŽ‹–hН](йDлдiаiЬш_MЦ?аfБšAџђBНЂдВeMˆGГ}ЙфQDЧ™EЃ&ША‹ ZДЌ)Дё•н:sЁѕ|єллл<рс‹f› цkіAПuAЫЃпМ6єxЈMЋ›Ёš›цI­ 3Ћ†оd ­ГчуошЗљP~]$3ъыэА7Јf ­ІѓГЁ 6FПН9бЛЛ­ш7ЦŒбEЭєmvЃ“šйТ 'Ѓwа–U=Рi4~кz^}ѕB_зŽ&ж‹W}M‚ЮќB @S›шФf+Кe брМЬheE_Щхб№ДЬfњ*BЃГ2›ЕжuDыеВ ЕFИy(њJ|"ШЃІ€6 ц1ЕљhГ!Œ <оl,Я:кpBДЎоLhcЋ ЭlА єІЭлFOЏдw.aжд Ѓˆm‹˜щQ“fMЋ3›ЩQгfН!ЮЯnžеэW›@єf8ПybЗїЦЬ UJo-%йэ_нр83‡V§)%ЙЃZ hK8Дџ^(шхдўшщМХЬV5Нw:q•hfя‚ж9ьlсЮ5Ё•Щ/U…5ќnЌ0$oэhEыжm^ќ ЏІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІf‘ьіФНŒWžўОєCіюу—NыэўшенWкюV=ЕЧ,Щ4УЁ™§ Jч0цIg{>Ћђ:а‹Љvё(Г?Ёвц&’AЏ}шу5ГчаUXФьž5gГydsx„?WШhfОхеД™T+ЗЙŒ›mйЦъАœ—]mы еRsfuSџууУІжхj~ѕёЇєѕrš?њЇ­S+ц3-ljbI/‹:иVЖnžжДM=w]їД‹‡гœ =5рарzgО:аЙЭфЂ—;„&нFЭьhЈ†ф=§ЯfЮТўре™ћˆgEЇWѓhЦL.ЕЂ“ЋY4iу?L—C№hЦЬЧbNЊ&ЊgBЇSSХhзЊЮŠ&‹‹аі Y7‘šЎ-Aг›ш$jІєoўЉ‡Ws…SЈэh—YSУO}бli§†5[9^эЈь$SlGхhДЋВ€Œй+AwАоЇЭжьŽвБfД ТI{нeœШЩ1/ѓЈv Фѓоши|lc§ЖџЂ%FЗџђ5I•эњEЊcxtћophэпEiqЯNa>a'š|AкаG=сjЃЬб‚Іи&К{ўкbŽ@ŸфhЄV­~Т6З :нМ’ЁЊŸшS№KёrДЂ‘]GЗTќ?P0ЭА]ѓЩœ5>7Тs—fOџEЗE?†D“ ‘љdЎљШ <Д2Жрџ%ˆЙ6PПTш#&™ЦJ ЕMfєѕœ §љљЩ˜еш…гњ˜7guеšЊyаŸsиa?uєјDЮѓе„JGЋnOњ;чSwNCћн лM"Б™K Ёš SŸЂxs&јЏІШЬG<+:НšGSр6фsБЂ“ЋY4iу?LЏݘљиа)еDuкЕ@ˆЊ еTqлŠžафЯтeаdq­Ц їПѓD'RгЕZiVћёџЕ­Bt5SЁўўBщЗуOЊLхjz6Л‚FЭUў0аnђ<ѓНУœэe6е-3Ѕ ДrЂЅ—@Л'э*эu—q"'Ч8"аЌкѓоши|lc§њ˜;ѕt&UЖыЉюб”[Cя$кaЅяlшБYњ4ЁЖЂбЛƒVд#§_sr$њЄЃСАhх‰>шpѕЩPѓhJ­uщлIаЇєЉO[ЦЦjEЂwєi$ЃO 64R“ш л%15@#9@kG­=БgсЙIГН§ БЕѓЌц 46ŸєeOјiЂ5X1fєлЅB~~2ф єРnЊ&DџrњœУ| УfА>ШГ:ђНaˆк 7бJ2ЇєДпПшцБХЌ”^јSя ЖЁѕ„ў­Ё;аŸХаія>zx$$#ДЏ:­Fs“ісє@Д6’Ѓя2Дbамс ъ=/šSгf ‹"ДЇК9сО(њr­ЖЃС]Qк|=œŸнNGѕб­\0zјЯІЪŽMУаƒзЧїŸAhMT{О•У›м@s 4.ЊХMхkѓfџDјЂ\эDhЊBŠYˆФгAщKЊ%5УŠ‹ЭYаХ—DkG<к<ф‘агAџѓ)ќПХаzўїПŠЎшџ6ZЎЮ‡ўп-ЎМЂх!/œїГGZв"+:щюэmіЊўUбfŸђ>шЏЏ…б§1__~ш/Ё;К=Є3xЃEъ<шћhPKьЩЭ_fбvujtИЙЂџshЏК+y!z–š3|` GЋ‡FЛZdјulE? zЊєє”­5H~“mєˆDѕžžО3ЁПЕКк=}І~*Œ~šбоц&O(п”:5zHЁППIГЇšЌа–ЦCJ ўЮŒ&ІІV&™AЧџFeЈž­ rn4dЧ ПцПЛњ&йЁ`У\§…Цф2h„ўa:Іје&lИ: ™k— мэЬЂЭ–^ЩаК;мЦУœ№7п‘h%&Ї§u}мА—FGЊ ­=Б ЂПЃбвQ›g§ъ2}Š4шK_є/]/Cїbб-Ха=д‡ў…6h›šFџђD'#u9tЌZ‰д$ZyЂг,Ш пкtЗmХшЗЗY=N|иц‡NИ@„hѓŠїKˆNj–ЌъшK64Ч6ЬєђеrМY‚ЮAлб”њ’м би ЭНz@Яuz0ЉО‚ ѓ 6Э“žž еєлЏ_П Й0ZYЭWLІбŸ mРEшaY+_tZГ}ЅаН‘˜4>=ŸY_"R4ё,K:#ЊcаЙ^†}I†ОTДњJЁЉчЬ™W‡/šz.trГ§ FМ<р‰™бЖЫGЃ–Ёбy™ЭЖ uš8/ЏYWч@ч1+†‡žш™аЪbŽD_Г™Љ;6ДBзЫљљаК<З™Ь!:ЃYƒƒБo63oгGЉўo}ћRц^ЋLєРлhQ#киЗ”Y ]0zcAo,шц–›]Фмxш=”(dфv3ошц%т@лGН yFгdnд›ХГš33/Хnћ’aН6єТf7š8biГYXмЦi^#ZYмфўEЉL(оъбŠт­=Љ ‘YЛЏІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІ&_Р vWŸў^ѓшЦРЋЮ~ШЎћsi;{"њn…З-ЪЌїŠ|*Ы†4ЯОНЂЗ/˜=4aДuщ,֎٘чД їаФFaЬОУRf'›5ї'/CvЉэцТьŠЮ[ЬЉ!š:qAѓav‹С†.ТІ7А†vиC7w.ТfЃ™[EQuгруC‚nЁћrYЭ]„h‰z(˜пlUk—ŽQэFчT аЦOАЊЇ‚йЬ.4ОRЛ^Йбs<ХМ{.™нLЈd’§Q­ ZDЦьЌh8kБЈ!:НšG3>њsщJаœйѕaš@'WЫаЪx/ьПf? btZѕ‹жgЋ>,Ž&ЊcДЃFUЊЉтэЌ"CЇR“ЕГЁгЈщвнїsŒBv_юhІ4@џ”D6щjЎВ‰™ѕ а>f .ўааbsЏv˜ѓЃ§mŒš­ЏvTB;*œ"Э'Ч4"аЌњtŠSŸNGзЗа=ЩT>FЂ›г}lhsЋцбCЏSœКCŸьhЕcxŠмЊ§Г(‰>ХЂO}ШQ;бЪ=9J=ЂOХаЇhєIН#иэŠМГ ~)Ьˆm wXLЂw4ш–Ц д6єB‡ЉХhеџ%tмЙ‰RЭPlќo*Ќц 46j|07h ЦЇиЬЉаŸmrz`wu“ЈOЇПz>ч0ŸТаъhЭ.ДШCєŽiбŸЬд 55sж'‹іWŸ,hFнл~7баэCњ“EЈ­h†=šЛ4ЇЏY3Ј бОj€ОKаJ3шпВ9о“Ђя2Дю„DшЛiі_s…іО№™ ‹ЖцІъЙР=ž­5 5И… Ў~'ю|'E[ЋŽ yƒсбшV.нJhКьЬіFГУžЗXбП%hЂЈž4rУђ аЈf$h;$,Э›§А•те’в!ѕ3••TжЪ„Юё E‹ЭyаaХ—DЯ‡ќПGB§??ѕТш{њKЂЇќяџЋшUЂхъ|шџUtEџЧбтТYЏї@ДЛGNєнэSїбоfЏъ_YЪ˜}Ъћ ПV‚ўђB‹еYб_žш.‹Ёе}ј GЕž§Ѕ% эrЇ6™ F[е‰б_hљЈз„Vы@{V^кЗђЃЃmM’`JЕ<ўAtт_Ч&B;КЄўrДЋIђ_|'@ї…žКdDы ЂЏS=^mіFъ'=п™апF—№Iъ'MЉубп&њ)Tмф цћ;њ5{zJ‚ўfа~jru4!†ФЦфŒhjк!h…ШЄйKMјІйAшЩ§]§§ЄLr~ДЩƒ•Q­Гƒбs<šQЁПA˜Ž аwи*pIC2з. Ил™Хš-­вЁuxИ‹мœ}O†v5J‰žЩ­FGЊ =Б ЂПЃбaW_}Ц/Bбц}щRн7ŠE_ДxЃ§ CєPѓ’ш`ѓBшpЏ—: :С”‘Z€~ы2b‡Пћ>шxЖ’ЃпtД2бЃК0кЂ6бoУЂ0Ьntš—a0њMCП= кX!шhГqaшэ;щ Lr4С|3е†yDc5ЊŸРŒез>sЏ6Ь„zЈ“lAO!ЬУКžИКžž еОшqWYДЩ†M{ѕLЛ@р6Ъ д бК[ˆ~ћѕ†ЖКбiЭŠ73h"4њšЭ,Dлё.tjГtвVЕ НаЄWК<Ф/D1:ŸYЛъ‘jˆ{ЃžGiГU бНP†ЮwН3б”ZИ< ›­шЋ]xq(ћЊОŠаФyЮcюдDл8єHЯeVs$њъnО)‰?ќ/‹ЖАMюІI{јF8щЌfоНфжм§­o_ЬмУ!^їm ДБuIs‡f3кШТцdш’fe73шЁ-nvЁ7.tY-B“fНYд<Ћi3‡о,IžдŒ™[дz9ёˆцЬ§;"ЗcI5+mы3sп+zaqoєТо>4мП,– Х[ЛйRлж‰жˆФж…H’ЌXSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS3ЅНзќnЗлЛ\Mі}v{§žѓ+ЮХиЋаІхƒЩ@Шl^2”Œš}: eЯ gœ§ЛP>Œз 9OСvШšŒйwXˆмХ…ІХ}–2;еsaіСŒmUˆh& 7g.gž\ФрСоEиtуƒFbж‹ЮЏfњCЗ,‰ТъІУЧ‡—йЅюЪe6ДЂЧ‹‡нмеЫo6дќѕO‰бYеЃй2j}]LWi—9ЇњуУŽFЋйНВч’‹ ­bж§ёaQ Ь„њЃ(њУ_LИ?Ьф6šMѕLE[бЮГЈ:ЙZ€Жœ-DЇUУткQЁ<GfAЄ&а еDq€•hЪœLMж^9šЎб?ЧД_vgі_N[•’ “Ј™в§SEЎiиЁZDnShвLхŒшj Zlюды@{˜[ЕЏvЂžhј:Ь€>9 {Oк9гщg>qъ|шгЃЂcдЇ!6ДіІ'‰vŽCO%5V@чž†ЋO5†:oє)њƒЖlЯ‰>lj§HД~šЭЊ>САh†ч0+9•й‚F№ѓљмl:ѓ`„Nb&а'›Ys‡>[бŠ7'єщГ gAъЎ.n†ўЋхsѓ˜Я­йP“g ф!ZУ ЕiжбŸЬФ u4sж'ƒў„ўЫЂuoћнф|ў§ЛйаёћЗ §ЩЂџњЃСъИ›ХIіdювЁ‡АhPѕnЂНеЇгннВ“шпВ9›ш{РЊжбїЛ ­;сњ~CпЛ гн5JЁћ ƒаz  ё^ќ_‹4М+Š7кZ5нЪ…@сkлбОwиЖР-5еЦ5cаwPМ{ыShєqдŽF5Ѓа’рг™~_UЯ„ЦEehAсŒhTW€–еЌш"шayќПџ—ЩœнєXшс˜ЧBпGД—њЁшЄѓјпџўч…–ЋѓЁџWб]б]=Š–Dћ^Їх…sЂя‰Оћ sš§FЅl€йЇќ—GеЏЏU П|Ь ZЊЮ‰nОj<њkˆ?Z@Oў2ŠЖГ›ПОТбruZ44ћЁеCЂЅЫ:+кЛtEB ЭЉ?0Ut:ЕНX2tWэщ)3zhнжы“=ЗH‚žъqъhНGє“žяя,шяoЃK8ZбhBэmюдOOаœ § :’еЪwFє7б/š1{ЊЉ­™šR4њћ;+њ/‘ Q+LІб>jђќЉzДzR€œ ишяя‚hƒ †+#šSЃцФшя8єЗDœмпKZ4уthгнЮ,жlk•­ЙР]фц„ш{œYЩЭ)б‘Г^]mМЃд„žйХа Э~ш_fB_šAЗbЭЊуі)†юО,†О›uuAt„ ­ъDшSjњ­ЯˆўЖz ВХшЗaО†Y€NГЂMЕ§ІЁп*:ЅЂп&є›}Q Эњ%„Б#tЇ6Ьє&ЂБz<а@џЂбXЬYаз!s7jэЪAЉЧ2ЩН”њ C™пŒKД1kt~ Е­~™› Ѓ 8jzХфсЅЗ’цœhх‰ž—…ʘYG“xњš‹ќOЃэЉh4б3}ЭeЖЁЏн= ъ‰0ц|h%GBOtѓ &›^ХЫƒ>=Ÿй†О бЬйЙб\„ц—F.sЏnлЄEї№\fХ.ŽtŸlfюeФЂ•бlS“шюЂЂ]Y–Aѓj“Лiв/›t^3Яоr‡nџвЗ/†ІсЭЗбДuA3–oˆŒh# ›•УLЃ7ЖИ9не(*6аЄ™Aotsљ8ЬzГЄyV‡ —2+ЛyМNъХФ“š3ѓшEЭš5wЖšЙQZбK“ЛXбxяТк9ш…Ѕ8$oхц6„oѕf5—vxцЭ55555555555555555555555555555555џньїћнвПьЧ, foюьі/тВdПЗЂWљ=€fBЃЕ,YлйеsЌv’IіG~Дbб"2Сў( цF-6ѕ‡™мц@ГЉўШЎ6ы[ЭкYV5D'WˆаЬЩRtb5ЌN DшЄjTЁE Ѓqqˆ• гЉ‰кAhUMеўH€&ы&RгЕё’Ія>ol5зЧтшŸ XsяKšЎlЂ!™ЭZа [lnдкy :ЃЂЕе+E3ц2hAџќ)@ЧЋЙТkFГ…sЂ#еЇ“ ЎZ0гщ‰цдљаЇSœњ4D†щэшБa 4Ё&ач>ЈcаЬімh­VЛа–э,ZoЊ>йдњ“жOГšб'Mвс|‚œШь‡>Ÿс?t˜ЃOvГ2Э-њlG+о|RalŒўlУš•iюаg;zPwuqЛ0ѓ_-Ÿs3FŸh5’ћш ƒдІYG2g˜цпњь@+ѕЩ џЁ їЛ[нл~797џ5†Џ~лаzйћ=R}:нy4ЭžЬ]ztm5бї€Qпѕw Кeџ&бП%snбfЫPє|_ ZwТ2єэ­†7)Šђhпл>лбlQ)кZ5š/Њ9Kаtй8єX}и€ŠSh§MpМ ZFТ‚CдZя`­Љ“чиаИh,к|‰Љ>N-=•Ё%…ЬB4*,@KЋ>КЫџћНNДМr>єџ{PД—њk@пџїПџyЁхъ|шџUДMЉСбbЕOйŠўWашб’Ќ-Ўœэћц"/œ}їBg$ћ•џчб__Ћ@}y•§њКѓЁ[‚?ZФЮ…ўтўrл“ЃПЬЃSЋ=Ь~ыC<ыДhhіDKеIбБц‡DKWuE—B'§Р”§д$;КmgVаœLm3Cu<šc'A-RЁŸцdCk=’ ŸžъhЃGZQцяя,шяoZэmІапп”:њ›Bћ›sgЮюъš­BбO(бН<§Э˜=еTІЎR;§=&šwњлŠіQ“чЯхcб3ћћЛкd‡ е“‚цќшя$“ўЮцдЁцo91zf™EтhшVСƒŠЁ w7ВXГ­U:Дцw‘›ЂяЩаЎF)б‘Г^tв д„–ЋгЁПЃбъБбЕyж/3>шяtшK“"шЖQЌYuм>Ха}"а—Ха—`ГЎ.ˆŽ№ДU=ўжeФї%шc6еєл›І'>n,ˆlІЇiюдj@Яш$ Ј“N‡N7jХГ є/_є%Ѕйx52#‡ш–нЁѕMџŸНЛ[RWжF­ C]}0ƒ3шU1юџъ–џ’2%YJIІ;пНц`KЉЧ‰0Œок,Ÿ§|† ПУаЯgГЉ~vAЬњкЃЏ6ZфЇІVlfC§œb˜Mє7ŽVи@sMѕг fFа“к. ишы№љНYє!wъЋu7WG#ј5h^ѓЂЮ‰ц6Ђнё йЭ9бЯўЭOžбиšш,цшё r[B?•yCІбшќlhŽvmtў3Z‘цNˆ&цg3їjbбg ššžЯЌhѓѓ„Ў`Ю‡ЮhnеЏˆ&ї$ŽЖоžuаЄњ|6Хнxш|ЎƒІдg]§ёš tn3Х>CѕЧlnџ‚цzh”}ъ =ќ Ь8Кˆ‘LЙ~,QШбКf…šЕ(ь І-m†jмŒЃ?rЄЁы˜4+e ‘C@] ­@Ÿ1 …ўЈižдЭ…ЎGе”™FW%їjвŒюѓ-˜йЭљc|{ф>kаЕ­zˆžnmљ7ФЗqqŸэ ёМžX"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰DђJљR›œЮњљRшO#д€ 42ІйцЙ.ЈNГŽѓНЅѓ їВaћ\†xїO90ЁеdФ :тЫХ-žбЎ“ХЭClЭEƒiЯч!c*™m8<0DСХе— ‰ОшшO|@yіХЬМ).ІQMW֘ЉcЦЎn­ зЃГГЛ%nсhхWпВЋл5њ€&9эEOхЪЂіяшл”0m€}ЎXЈ=dœНЬІОбш2Ц.€І;hЖдЗjЊеСfC}г“л|‹4ыъ[vЕ^ŸF[Убьъ‰vИ ЭЌžЋ’ho‰тш›P$ЭЉЖ‹›ш 2EбHё(Дљ§ ЉЫІЦjп6ŽFЭњыK!?е­§€їЦаƒЫ…юN yдИYGOX€ƒ Yд^єe6ДўЈ/^4‡кkО\`{Ё<šrй zйГ_ў геTa ’s2š,œЈўыЏ€К?аПўњ+ЭLЊ1ДЮŒEw‹ІЈџ†6”1шiA4ЂFащлуЏПд)hтxv4ЈсCлxуHЁџњ+]§W Z}-x'z™­•АдШ„Д–ьf‹эCџo-кX §—ЧЌџзЂџчA+‡9RнЮЛпa•њаfЈў_ўŸл<Љ‡ТpЉ~с8єџќГ$ЬмЃCд 2\0J­›џяЈMЬјrЂ ЕuџќŸЎ^ўЃ•јб„zФ§§їпџћппЗ†;бАЌБd„њЯ\тЯџu? №Я?>іDвЃЧhНhЗЬџЭЋўљžІТюиЃшПCњ< ћЄ ѕ Ёг|тG[+–GџŽ^џSїNs4Ђf@џБЪЛбŠF[­ј“ — ‹.7‹щЛЈm—d@xГ>‚жОoLwnWKfДљ"кш/,N4О1ЂЬў_ХЋЂшШъ™аvй0tXх\hЫ€ЎќчЯ§ѕаїЛ Ы џЌE‡WЮ‡^нщm wЛUшнаЛн:єNа‚vЁƒеkЪЎBяНutРлCdKшавПєцCЏ6Џkѕ*tFѓ*uŽВyбж}_њљљЉŽn ?kбCЊ че#б>vєL$кэцFџYU7Їz…yZgWCЏ- чКdFїk06Zа‚ŽDГ}ЫУаkKЯѓ^н›CXдx‘q…њxtЉ9аѓ If… 5.С‚†,шЧWЏF+Ь|| ъdєCGуЭ ыsvt_QG˜жц|hЌйшЃ™GVєУZя˜Ž~<(є:5ЖЅ v*њёШŒV; §x8бkдШl­:њQЊVЁцDt;ŸPЧЃ§цd4еыXѓ#РœŒ6дxtЈ˜mКUtЃХLhЭ­д#jCЋP1ИЃФ:кГ#њO"Z›9бЉНЎйщhѕKЂУењДя>гппЋаџ&:XЁПcа цEџЖўXў^ыE›еяœ‚ш>ёfЈ^Žй dЈB_ћшс`šЃЯЪj5ѕ/@еjъј|дfйКњїйsнмЋ'48JЁЕъ,hЈ&w ‚žЖ‡m/ŽFдлD_gєе‡FЊs mѕѓщC_ППЭ>ушч3йb?ЛА ћJ™ЬКћ9Ц0ышЋmаЪ ыj•Щ<ЃgЖТаWЫ<Ђ•AжбЌСЬS(ДyhgШЅŽCы7…~"фN}ЕŽтцg&s0СoЌЉuкЉ&аЯ<цEэCЧtњ™‡ьn5 šŸƒЦсшL}^дсл#­г.єEулŸ ­ђЂѓ˜GѕЋЁ;6КfЧCSг3ši~>ƒафьŒfтХ}Yєн цs 3Љ>ŸmѕЧUяЯvT 3Ѕ>ŸuіGнЉƒЦеgC=’е‡aЎ…FеgЈў˜ћЌКПЁE0Ѓь3TЬъ}ІбeЬ|2}Ьт=?К~ hUиЌГ?ТЃwИ0ЂW˜guim(ZЁG7‚ІzjЁеЂЎdžе§н-= Њižдк:6ЈiиЈ<8œЈкЇЈЃ› Ўл4YО­ЃэћypKAyл&A|›іŽyЂD"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰DR<ŸmjжЄг~NЉ ЪЇt@ Ыl—S+ˆйР9_…тщ(њёlžЂСЕšИЄJр‹G<Тœ'‹›/„ЦQшK ѓ‹ NуА1§™JfУt1афˆ)хФЪXЙГtлТ"Њх2КџцЅD!Г'Ÿкl­ uД @чW[ zбѕеэ З6іяБX s8Й_XшЬъЖўэFЉ-l~ЊvЛхDпДWŒЛ—‚йд7hЖдЗЂъHГЉ.€†K`fп7U[}Лefы 8­І/žШuац ъ[Z)ќk2ќwК ЭЎіЃ=unДYоF{K yеKUTЅ,кЎn6š ЭЈFŠoдŽC+?šK•v ъжžoн§ЎИ§ыт ўшxšGV6б“Ыю‚fQ{б—ЫвJ€žёкМkѓ№въPДъџo2УŸЁп0l]њi:YMеu™M4Љ.ОQш/;šЌЈІыњб 9†ўыЏ$є_§хoв\Њщк ‘$џ•ІўkH1є_SаˆкDлx§€вoƒ8њЏПд…ЂG#3ЂA zўє3їжfЙЬбъћ==й}h=є=§знЅіЂПЬ-эEsЛr<њОРГЃ№ §—зЌ)џgн<<ъП8агьY§O‡*џзЂџчCъЁАnŽT/гџЏMџџLўЬ&І@ѓџTћ?ZЭфО~ЗhU„љЏџћПЁШђsC}rŠnVAjЅКЯаЄџћПєxсџісŸœьAїїіљјШ‰žJТeІuЃа ѓŒІи Ђ{Ж›ЌЃЇuзЗњZ-f §ЗЏЯzL!4pў ŸPУншеf §OF4ІўяЂ6YVЛ],7ВКkw№Ђeg2ј:эBл%9а†оXAйqЂЭ’Yаю˜ЙUЛаVбtД;і4U]EЈƒаvй0t˜љž mЙаС•лЏz+бwбЬшћZySлc#шuънЎ:zзх_о Zаашџ?—ЭЃ§4†Xc{ш€М"zЕyњ?€ЮgVЏEџќl§ѓГюћвЯ”*шyѕŸ8Д жŽFЛйьhmхuh]э`3Ѓ~Rа:›ЗеС}^†ъCŸЌшa ЮNП к6—@›jABЏ­ŠцњjЪ‰V‹ЙњРž}ьУЁFk хyбЧ)™аs}Нж аG˜,hm…ѓЂж*>vt[UG˜fюа–:§0бЧdДEЮ‚F{ƒ>šy<2ЂЭnwtє#3кV'ЃНNmЭ•yбGДСNC?мш5j{ђƒT'Ёб&Дзœ†nеJњ`хЕъЇ˜бfЏ“бGН(9Mm‘8Гб|AД нгsЛ=fDCvЗЩ#Шк{пЩьh­лQfL6апc–сhРŽCЋ*ш?ЏˆЎлi•ˆЮОЉљаЩяФp5†Žкtt№ЩŽ5Зš Эбш4єw:кЌдя”BžзK0/шп"ш?щbM„ОЅy<„fh3ІЦљyPOшх ‰†Х™[§ћx` ЏzкWCM4W+Яиj}Нje˜5eж’ŒFеЯєиhхB?3™іГ}§ў67†ю хB№чгTGЂ‡BЭ­lє1їheuЕт4ЃшIЎ0єе6hНš5”Й ŽО~_ЭcУ@ЛР†аrЛш'aЖаWмœЌЉЁQН§ЌvЦ‡ц5/ъ|hnq;ф@g0;їG*:WЃguЖэQ§\FчgCЋ—DЋЌшLц.кВQЃu€˜нВёUЯч єљLЁsšЉVhSMЁŸYЭ4ZWєџS†њLЁѓš ѕЙDїббУ f\}6дГљуУ0WBcъГЁžЬ}ІбܘњЌЉ?@Ѓ?Fі™F1#ь3T|ЬъI}ІбЅЬ ?@дєGїU šuјЧЧњpЅ=ЏК!5ZŒЃУвwО"ЂFэРЌtŒZY87њЃЊydТаjњ{AЬжСкF+шкD;˜YmмŒэ_э`eДЋл&wСККusŸэ %‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$ЩП8Ÿcj;ѓЉЇ6'$ŸVШU|XlГЉлжЋ0(œъOыtM0ЕpозЁЈиƒFƒЊ/— Ў'†лA_.ИњOLБqн™цоЃЃ.&њrБє gЊ˜ћ'|fЂэ1ѓ™zf§РЦ]šof)RœŒљ 4Ё3Ы’СЋМ­W)iЦBмP*ЊW‹н9ЭЗЫхvЛ­сzщ}Нл-ЃyJ eЯѓЉo”:аlЉoбЩї­ЯRпВЋс 7НКеЗмъ‰жYЪј7‹rЈo™е7?к9?ЭЏІЭ—2`;амjGЃ/aцI]mVЗаAUМhVЕU<ЪЌЌяO9бVэlh>Е]:šKTЖяx/ЖЉ[Ÿя@ѓЈБТ(К“йd5џy šEэE_.Ž_Dш>њDД6‡/LЁЁS—AуuyаDэd5U—@›JK]}CЭ_Іб>`NUгuЩF/OАƒaшП’а…4Cы*МьxPGб}ац@є6@џ5&БuД%жаp€§з’мhЃббyаїПаHЃз cеїЛC=Џж­ОЯ№ˆэБ=ƒяёшiњ=mМнf}OCп]hПY­Vkш{"zPwџЯфџѓOxŸЭ[‰C§Я?]qнзъeўђsџќ3А‰)фћBЋ< ‡$Ё—љtє?є€ќ[ЉПџіЃлќЃЃСЊQh;џќТўЛ‹ъдpYCыПNС‡ІйЂ{И‡L зo8єп5|ƒfњ§ѕWDџ“ ЭДЉёkAяХщі‚ЦуBџбз брFЂ‰zбŽЊ‹yљtqЂџp6z.kшѕ4ђuЩ‰6Kђ uѕ?ю˜ɟxt џPшѕп™ІOoчЉйгP4нWэˆ/zwYL†ЊёѕTџІь@‡•њN}UчAЧ§K`Зл…Е$њOЛўjєnшн‹ЂзЉ7nѓЏGя^V<њO:Аv6єŸrhLmŒи кAcш€Ж‡Ш+ЂW›WнѓVе§wЃ#Ьk>зЁкTEw€ŸuшŸ9аЫт?ыъ†Њ3 ЃЭэvsЃєЄЈmВЃЛE~ваЪDn&ѓИТ˜  Mu<њP}H1П:њP}(fњjЪŒ>F8бЧ. jЌD_›}œ’=W7аkЭ}„Щ€жъ'ЁgЕVђјhУŠю ъKD‹gЕMЖдIшБ"ТцB?˜:=WDzc>šy<2ЂЭfwIG?Nциг;§€љ“Ђ6'k•YбBш#њсFЏQ[sД: §(ˆ~0ЁЭВќhŠЋ$єШV*?ZЫвЎ(Дš&:МЩh[>ЋуЬ}п‚hУ­њ­ežЎлГкьїУ_‹4;З3ВЃШКкН”ŽўГ<GџaD{VbD'Ћ_НjOЯдtђqХІўз ЃЖGК9­Њ ƒеЩh5™UВYщžПгюдПс^ПЇѓz fѕ;e=:єю=†ХRФš:}э3IGѓpDУќђ M5~МЈЁyfуPЭЬЉ~<~KаазЋЁжЭЃm­Yž V@азЋЁVƒYщj ъ'›цщF_ч§Ќ\ш'Z›нЛuњГKЦ@їUВ™ЗN†jЕ­t3ТЮjžе A_ѓ€V†YSѓIє W(њj›GДњcT(€~ZСбWЫ<ЂэBkwЛКh{ЩA˜ЏжQм д•аЈ>ЭkŽыєZ4ГyQ‡ЃБC4Лјеб˜G‡o<{Њ_ ­мћ#MэŽLhEšSбйієЄF=ŸЯЈб<аŽЃаЙЬНzкTгш|цŽM˜QЕ‰юЧU@Ѓ›CДщЧ‡ Ÿ™Э˜њ|6иCtѓ8ЊŠ™lЕ…nЧ~|˜ш:fКг {1}ЦдЬˆњlЈчНё1ЋЯЕб–ZG|€н1Б1Д*iЖиgЈўјXд“ŒxЮ“ћ2ХШІЮ њуL kd-ZЉ~{ЈŠф=Љ:Žр-К}PЋЉЁЖzоггAеЉV@CkVжўPeѓ˜5hЕ4СЖзfZ эєІ‚˜_mЋ Ф‚vuгт.XSЗ-‚7o–H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$’ЪљьS[žO˜к˜ |šЉ ђЦ[ь­].жp[{hђbѓН ›0_І?.н‹яu(šЫх‚Ђ/}&и…P_*‘'š-žNЬ‘qнѕT1їšюЯЫИ%.zz> шGŒцўT 3•yп’#цS[1ƒ7лВa,ѕТ/MЦќ№ї9.ТІ–FЬ.ДVЅ$йзh§ŽRMm.цА"їцJjsЉ5f‡њvЫhО Б "ЃьБbFєmN,њ'чTSшIфўвчFgRУœV_йзAЃГЈo!h…|чдх4:‡šFO`wj ot@ š]}уB:аЬj—љhh5Ћк!NC›ю\f К;Bа|jѓ5dEчк f]ћ}\ЪЗЇйаvamўLЗyдцQ#u­ЛЧЌ#аѓqччxfДЉ^~B'§f5ZзPгПтЎЃл дыаDMдЮe&аd™Uшd5UїцDѕ6šЌ]mїйB/ьtЂ:Јnўвž\§RО”Бƒштiъ@ДвžЭ6{Ѓ‡ЂџJAџеfe/œh-„wH"W;Реwћv™аїћ_л‰VрЋаУr§ВёfZэDA№ єdюжM0ю@Дѕ™qєМh"Uч@ѓ§žhюйAцuhS ЩшVн§П“ПЦьпг@нзЭqъyђŸ?їљ ўљЧeжorшA§Я?s§n1ДіkџДqM"аЎ)]Imѕ4џќуfШПџў[ЉіПНшЁ О/кеlЄеŽбџ@џуEЯЭ§mїЂЙдqшПQ4­.іnъ84Бж§.тFЙаX93ыяywЂ\ƒ­дЭhJ ‚ЁП,4zћ№љtБ> Уа_њ+ї‘h„ЉПАЌ7wћ9кV‡Ё§цИoah‹‚ЈšmЈа!E#ПшэvЛЊш]Xо…”ЯƒўГыѓ_@я6оэ^НЪќ’шps&єŸ8tXэlш]ЉDлjs€ 1tРЋъfEЋрNЏ6Ћ3nmЁЃnгUб­њ'—9P§ГОг?mЊЂ;РкNџЬ)Žў‰EЗйяїEаэ:кК+Э:њЇњч'E­M= ЩŠзHBkь­цBZEЃ‘N—BГlъCAє!ХЌ3зІЦЪPЕ 7>ИбLпЇЈ: ЊЧLшЖ2ЊŽDkф#ЦNG•uњ’Ј&ШаkžдйvЇ ­Ъ\hЋАЁN@cЅєzѓЈ6Ш>Чњ1дйбdЅь&<`’бZ5{1&є##šKэѓЃw*њЁ‰^ЇўCЃM6П9 њСˆ~=Љ4џ>ŸOzь38c лА$+Z u~ єгО~›{УF? 4Ћy‘kd€V+аJCcl>ГВЭ ›@+zЎQЦќYЬњŠ4z@+нЌБСt›iФеV›‡ІЁF…ЯmPЃўМ†ЮЯ‰Vњ|ЦеJWУpt>sЇ&ЭˆZiъi†ЮiюˆўhЃ4ЕлŒАЯ–њуƒ6#шfZ­ЃЛ‘›GŸmѓЌЎmІбg}s t3@Ћ’fK}жд“њcVŸQtWЈйRkш;:ZtсшѓAœ5tсmAШзЂћ‰ЕЬ“ZSЙбЕs4р' 9Xл;š?4ГВжЦЮС6„ŽоžYQьЃћ kэ ТЭ›бЖnœŒЗuлт>HW7.ђD‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"йZ>?k VхsImJ`>діxc‚mіth+—ƒ‹5мж^|щтГ5ѓeЪч…TMнівEўьбгckX%2ТЙ@ѓаNb\Eѓe€,4.у–-3Юjд “™7.=dЌRУŒЊРЛэг~fєЂ/JKcцЯсЮA aЯ‹šБN†ЁЕ+Џk6nЦі]ЅŠкXŒаЉЄОK­2“ъл-ЋЙНj S%sЊЧ,v0кTпцd7›ъIфјЂŠЃoЗмjИ‚Ћб-НџЇтќh#h|w(њ 'uїЫ­і5к[Р‡Ю ОхGГЋцK˜ЙМкeF+їM[э'vкp—E•ёЃеЮЭО;tž r3bЃƒKљі4к,‹ЈW =f&Е]жКOЏЈцМухEъеМf5ZиRЃП,ђЅњѓоЭСЄA?‡бCBЬ hЂ0†vжYNVSuo6кSЩFч2‡ЁCЬˆšD'ВI3ЌF‡вХгд™ЪzбIхkЁџњ+Љю_Fw ў•‚ОпяjbЖНЉ-O˜џVMAwж чР‡сшžмЏšdюŒўТŒО/I5cъ,ш{2VАдФœUhK}gFџЏћћЬ­ќшE=”П'ЋѓЬ&'AgZAВЉN@їЅ–_Ќјчї,эžђЯ?€zЁЧ џ љЇK:р–7ˆџh-\цЄ^њЬЙбџdAГЉ‰:сћ#M-Х‡ўуD§ џІйNs!є&ехаtбp4VЮЬњ›ќD юФзп=?њйокQwъ{€:#:юух Жg-(žя!цњЅа‡ТшњрBGš-ѕPGЂaБcvєPUЇЃSXбsUНОЎF>aB›e vš"kэŽлd‹Н­”ƒ|<>‰шЧ/М cЬGЗ9эTcШ-“v™ўNBЕьХXа+hЕ‡ЬŽ6йЩhl‰ШM§‡F?Xбш zњ Ў5ЧЁдЬ zњ§HC+™BYЌB?XаTq§НX1Е­PЧ UЈ™@ЛбІКѓіЉѓXХoЦбп>4БA†eубjИђсС:‘h#І=šМ\Кc5&єВО9\‹EющмjчR|hШўЂ=jэЙOЛЭџ-tАš ЭaжюаGЧ›uї(­œцаODДЛеZЅ SШњЗgƒ шрNыџўъK$Зљ]дSѕч“B_ћ˜.§A §œЋMf~uї№9EC_—|У€уzЎв•дЬ|шпЅц ЇаWЭМœВб "ЈŸŽиjоо§ЄаWЌЯ:њiЂYЭ€n˜iє3#hMЭoVˆyRЋh…ьшlhЌбzpEдW=АI4#YC?—€W[mЃA\bh~‰@›%ВЃЭgЖ)D‚“ѓЉ_Ќ8ЊCбh…<лC…Ѓ_­Cs›НhЌЏ&њъDГ“#аФБmУѓ˜'ѕŠN#бhЇ3ЂQu2:гюPЎVoэV‡Ђ)s.Д"бч6цnXсFjЄЭНS+лLЉѓ™;5‚>OБwƒEЦеYЭ­šи†Кж?лf зЌАw’­6‚Жй6њЃK?і#]РlБ•2аРќёсG—1›hЃеšyTŸit!Г>ышY§1ЋQtWЈйЃўј˜й3š0…>/цV=ў Эчzц‰­,єAшhU шЯUшaZ=ђЄ^ЎœЮЌЙ€Y™цљ^X=њiДйщэ˜Z‡ћ@бЫ‰кV4и‰кR+ˆoѓf“hйОAзЂA„лБліJ$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰фП’Я1ЕСљдS›уЯ'j@%ЂL|iCЉF%<“Ђ}/CёацV}!ЧTe“рЅйУ#{`pЏъ=Тh№ьГЗ_*šЂžŽцЗAѓМqщ!C•*dTоmж67ахиквsІдЫФТd4ŸšьuA5б.„мЂё;aqЕБФZ7c§ЮьТч5п№E\§CЫэ–н…}’mГƒбІњvЫŽž—ИfќЫ^ fSSfЋбЊгЋёяАNчR“цэ˜\I}ѓЁ=ѓНш ъ2Ojš]э0ЏCTЛЬ—03бъŒj<ЁƒЊ h žУœЭЈvэfђ›jާq3bЃƒKyоˆ|jГ,Ђ^і˜ѓЁMѕšj3“ЉkЊ9Э8абfC} дџ%ДQяи†н•$дЋЋ"шу6єR’›'u2–DдыЫjтЃД]дpGдu‘u­ еQ…]фууёHBЗѓёТ ;‡љ‘`VъсUG•*˜дХœТчU'uїGdaЄЗУJѓЃdДVЭX§@У€†aPћЭмш+šXуѓгЯЁ 2Ђц(t6u yЅzš NASх єї”щб:єƒMVŸбšњлfІбѓ Іkч@їC&vZ9ЩьшўFЈцјH3y;ЭжiЃч hФўgЧЂ{8IO$Я]%Кœ„~Kp ­%аjZ?Р€Ж—сE#—‘Ž~аЫhfшДБЉГЃсrзlcЊ є7Cє\aЎЙдчBwьХМЈС–ОZje˜{Двб &Пyк%шыˆОЎ@џf@+ФќЇЏЖк0_Сh{{d1Bg'ЛаWлŒЂ56ЋЂŸzЮ]04’nX?оЈ‘§4sйAш3f^дХаЯеhЛDfДН њ™Ќ7Ј4rDцQЭmесшnŠщvЂљХыбzUЇ7FіGyДЂЬ$zЭž~fB+Ње*х]8Ѓ1ѕј‘с5Ÿ‰–œfЊеЃyQk~xИ{E№Fg#+|[Ћ}ж;:=аЬ8:ЇЙSЛаg }ЯРƒнЁтhэ;ЅнЖbшмfLНОѓЃmЖЙЉsЏіЂK˜-Зйъ`ўј0Ь&КYW››њЃЫ€>їш‚b @ч нІѕ1ЁЯ8КЌYл:њуcQLj]˜ЌЋЯšњУVkцs=ѓРёš AшцaRѓBзе!шкYЎ-юBЃе„жЖOmя§A˜эNджŽiЭ‹ыCGъщшђ=UYŠФЎ DѓђhћШ&Щ Э#5UоМQ"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$џб|~~ж&ЌШЇ–кš,X=ŸЌЂCђiчв†Q КC4rQНшВdг>о{бvџwб2“Л РЕеёіЎ‹ЅЋэЦыPмьЩжаH_Q™ћŠъ˜qxЗ}~"чКœ.э2їhB­ц?‹›Б|h\mМ_Kš‘ аnЦжЭП€’dАЃGђсЗИi~nє ]uў€ЁеŽІпn™ЭmHt@ь&_К’yе§ 6;mЉocr“mєbТОвЁГЉ)Г…nou§„OчзР"ъ›э˜ьouѕЭ‹vN'а lЕУœ‚†­fWЇšgЕ==›šЇЃ/Йn|ho4ЋкБ7t`/šQэка[EпєФ›QЕQ=йfЏBЛЩбІzM5™Iд5ебf ЭЂ@7СХП9ZW7MЛч7ГЈ_MОщшРb:š*Ь&ы2МЫЃы:k'VЯжŒ#:Ѕ|Ў^xЋџѕW|йћН њ~OCwY…^~ЯнёЫює}J"U{ШОЄЇаїTєRagAƒа–š˜В mЉящшevћЧ№C о дЪkъЁ<#КSЯПhт1Џz#ЮъЙ:#њО˜§П:Й=ф›КЅZ@ЮŽWызŽQџAГ­Ђа€Я†іКWЃЩuЪЁПД[ЭŒжп‚ЋбЗ<=,ƒЖяш/эTЃфилrПѓъП4ЂІwEТMЛI{есhКшMWїьїžv•MFЛŠ{ZзшQ­Rо‡ЛƒzyЗПYЦvzзЇ zX0v,dœ —‹CяŒFyIєZЕ  Ё 1uaEЗЋА ‰ъ™аvЯ#аОкйа3;‡9№+SњOIДЅЬ!ш?‚v›•mЦўБ•эЉNЃП* ;ѕЯOЇЊ„ўљ‰EwьHДс_‰ю–ŽњџљБећLhЃюАtњчЧVяГЁЕТгв+ЩJ§€єU‡ЃзэiPў'šЌЃіћBш§ў‡ НCХ їЬшC/ZYhl^ІЏЬ€VИ9эјК„Ѓ9дИйP;бєW=•Nпж„љр3[ћ„Ёг{M˜^Гљяb†^д*­ƒГЃ'xњЧ4чG’;§c<G:,s•ЖЂЙHъžЖЭЧйЭ€ыёЂ1ёЌNGƒŠ˜z}U—yP'ЃЕŠˆ:M‚'v"ЉЉЛу ;ШCЂЩdEЈN1“ ф@C6ПљёHDї\ъиТm]Ка [ї^FЛЗiЁёс#§А‹ЋEFЩz’бZ8д^27к`ЇЂ‰5ибF4ЕŠўЂ= F?иаф аЉjПй…ў^ЌB?X:эЈЁПэЌC?аЎђќшўTЪ-OyФьhp*э|ћ џ‚ёЁ‡)D:8й6њoE`u )Жоt~3ёЏrи`кЭЮd@;;эщѕm­сCƒGеаЋ;] Нюxэƒ ‡Ћа f­ЏC Џњ€6/­f&ОЮ™Ж„nžи(кь{ŠйhЕ^њ™ˆ~fCы7Xњљ|Кап>t;ŸЈœ(дj)§ћ ЬnєЗ=ЋšС<ИGєяяЌ~5ŽўvЂŸ3ZЉЎьŒўeBЋбњћ;ЋŸO жЭFЋс‰=Юшe‡G|шпЙця$&бpW_шЮ§;ЃYЭЃњwЮМт2тjЋ;єеB™+,EЇњlhѕЋХ‹ОZћйf7ъyЩѓ }ХЬ-zš@Ђ9Э 5ЯшГ…О"цыl^аЯŒfх6#шЋmhTЭ+†шч3E/lvДТаЎэсF?1tЖV?3 Ÿ™;§ДBЂБC˜xQП"šпЌѓЈЖ…ЪОwhЌHђЈІб–АŸcЊЦ–ЃазUшg&ДZ‰FЖt 4КкГЇЈЕrЁ3™СW3нЅ—-ЎЦsтйLЈ—O f<^žXшŒр>ШQр …ŽУ+лЌьf+­э›хPщF#jhжї„‚шљ`F{д`єБбъ\УlЋ1Д"ачZhУmljwЇMuAГІ6іивЪ:иЇ–ЈжоˆКАYсц8ќѕбFЉэи|5ЕЬ“КћћlхcHЋўАO>U5sЧё”ЙGлъчpХUШ3нR,hD]™;ФBш@kfDНГЉ6ЬЖКЊфщ1CuUЈлЌЃ?6hžђAЂѕƒ‹]•FЦіmžмn™+‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰„3ŸKjS‚Д§_dHy•+ŸZ‹?/]ШлАЄЫХPZЉ‡еE—сЫ„CкgгщmА/f–CдыЂ ‹“2`„Йкш+лкк +бд`iФгПщз№`[ц eюя=šPЯћЋ8іICЖКlЧЕ%)b?г‘1Z‰Тf j‘[єДSŒAЅЛ}ЛQшO“ќ >РС+Зл­њг0k™†ршМъ[LœW}ѓšБяtNtvѕ-Ншz$:“š4/hr.ЮЌ&Фэ˜ьPOюВцdt.5Й5ТЬрŸ84š[Mячэ)€fVBГЊoho‘Тш›\Щ‡цSпДАЃѕђyаЖ{ЭХ0бVэ\fнЬC›­7>4“кЎkЈnЧ›ЦgЮ‡Оh kс 4VšG‚S7Хаhс /Э & 7::А˜ŽnˆкЩjЊnКloФ~>UWOWcfН,š(ŸˆўCЂэY!hSMдEџ1уE+ эь‡‰†ЋdB;Ь_*\ЭŒЖы§q›УЖё†1–ˆ5c%Г‚nyZшЖФЃmvftв‘мuaц/эq кџ6GлЏ ЅG5ГЃmѕЖеTI64Евъ/<і@В&‹yз&\Š&+vЫё IИ=-ЅбгRЩшнЮЅfE/KEЋ rQєЬ^‹юfюЊЁ‡ЕcаЛ$Дѓб‹SжщџкžПz{ИОPgEcХУбєdђдMB{jѓvSЏ7ћ*;бЦу•ш‰]­‚€ўУ‰оЛЭ@ъhДІо›KФЂU2кѓлЂш}4ЎŽCџќt,гœЈ~т>кш}&ДЁюVŽCџ 1ЊЃWМЭВуЪшŸ%o?'z* ж]ўйУoз}GЗY] 6бћ8єњNЇЊCэF…ЂѓДzUЇm5:Šьєž=;tЩ„žjЇЂf^vП1ДЉN@я5t[и7/ jЇі7З•љбKэд^цƒwтB DЋƒ­VЉшƒ–PєW z‚џ ыЧЃѕ’Ч.ŒшОžЅNћx9ГлН=W3—IBb_ГC "ъˆŠN3лЈgЋcŠ:Р9а&<НА‘ђ‰pВ"TЇ˜Щr ;ЎВзœ}LCї№ТЧ#=ж@д AЉэA*ZЏЦё"крЧX~~FЋqЈQВžtДV4БŠў2?ј^NWћЭnєєp њQгi>4Й‚ §‡~№ щњ(њлBcjWбє{žЋz&єШŽFЛkЛбЮ§A—›и‘f_?ђ Ч“бfН6Ж3zЌ™DЊЛVpЁїМѕЏрђъвaoФЈвhs№Е‚N$еNCƒЃЈ™F›ъ-tњz5дЪ0›ъќhl§7кзЂŸйаЮv<5ѕеPЯoЩ+Š~:бIfњЉЁЏWC=Ёс эRЇЁiѕ3MЋЭДлVkбЩр8њїšЁкB;бУtЛ,ЈлъПаьDћбЯЩмVцVOдп>сh†eЛŒъпЉx_~\ѓyžЂЁсўаŽЋyќsQ/e‡П9бПsѕпчгƒ^>ЫЏєѓ9We6j}ІаWд аgЭm^Оbц4ЃйP‡ Џˆйf5+AchTЭkV™ НА™Э‹њŒЦсшg.єШ&ЬFд%аlлЃ§dЭdV–КWЂ­:YФњIЃ•}LQцgž>їh{Б­cŠFgl5Виг…V8њЉь2йа˜™F_WЁ3™ВTПк€ЦджEЛ#U+эц;ЇgЂg0t>2Ў&а›8aЂГŠQ7iюі rHе0Џ@#Ї”.a6дŠFcЇКcmЋ)1z=КйTЏB›ъbfMmB]­рВ5zМ–yQВ3ўFьSЭ<Ћ•KMЏfдЪa&еуW МЭњјјhџhuнпжюЎИЊY=MѕЧ”mБks‡˜ш€Fд›Dhh[Н ГЁжЩ]tuMЈ OCu-"—іКЯ=А?ˆ9еCЁЭƒлŠЭлКX"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$Щ:ŸŸЕыђ9ІЖcE>?=hя€вY@Ÿ— rўвцІИа&ѕж9У1Э~FW‘ЂžЃё‘њй*!Эsг7…—ІT[D#Х`žKЊb&аŸГы;]йŒgМћѕhZ]я&O7хKwCІб…[Ž;ајд"_>чO˜A;}єЯЬAХй7'ZџИяєэ–ньDшO8ШFgVЗ `ъYі‰AЬyе„ Е/}6К‚њцlt'њ„џ€шO:›š2:ЏQNtV5E/=>БQЪЕ=rюк<ЗБ6ЖЙ;фъt>5Й76ŒО9аРм іtР­ЮВ­oшEЉ›ЧGh^іmZ›Z }Л9е@LoЩэ43Њo7Ї*-ГyЈiœц<ш. #К1‹gC7zF!f§`cЭЭ„6ЫоŒ•j†‡{ЊU=К1аЭdB+€ѓжLЋ:E7кlЂцP#UѕХƒЭЦі Ь hЌj3&=•РЪ'ЋбЂMйсцљюБ@ыЇЊшћ}…ЪЛ‰љаxЭћœhє|4u-t’њбDХ;PЧ я~t‚šЈыFЉё‡™чЧЋау‰DД],j“~ŽоvT^gЖj;аˆйV“шЛЃђjГ^мUz-š,Ью8о*œО=&w_Ÿm™ЭВnД Fух“б Ё9еH42ЫBЛћA/fЎ„ŽROѕ@IM A›jИТМHМжГа.ГkO[j|‘xДQаЗщОДOM­€6ыКgЃ—Ќz!з яEаwfДѕ"њpДUЯ\0FэEcъ/ЉэrќшнnЗ§ЕнЎРgоMЩТ€оэвеЋЬ;•Œо•G/НŽCяvUа3;э1ГЂQѕZєЮJQєИН_ =/џBh‰F^Ћ лЃПТб~™ЧАZZ чrc}ї‹И§РFЋqЈНdz~ŠжйЩhb цNsЈ§f~є#бМЈЩœhчнУЊcЋгаД™ ѕ:э(ŸMпMбЮк>ДZžO$|КјЬмhp"кЌеFзaFw‹t'Фcyз:pрurЫЯ глМ Ф:ˆй.ІЏ|5еЪ4_УKЇЉA‘‡Й”ўЫсkбЯьhѓ\шЋОF “ЬS=Ќ.oчљддWS­LГ†ngчC“юЇŽОкheЂЁњщRЇ›ЫЃЬ8њЩ€ЖдZ/Ј1ДЂбЯ’шп_hNE?ѕЂЌюБшoћїя№x\ѓyž‚ П‘э15ЈћјeDї5Чxб№žwѕЂ—ВнŸlhѕЋчi™ єђ­щJ gѕгЈ}&бWд бgЭg6ешžmѓЂ9Э1ш+vШƒf5ыjdK' ŸйЬ 3{аHPє3ZйdhŽ@ѕ3“yRц4TЋ<ц‘M˜Ѓа@<Њ)sюы|шЇк>FэщœН6а ЁuHсwМhcЇнMи"њщB#ън>0KeC;д#№<ђњcrz>^Х<КœS+ѓŽ этDI2ІŽB—КsnхDSзQмlЂз5КПШђц`ДЂаЬКšB#:]ШЌГЉNhГехЬPMnZ] ­РЊ.5~М’yY˜=Хз2OlƒVЕШ={ќ{ЅzИт:dUшž[пЌШ–’шMФЂ}|œ?Ауч lŒ)Жy@лъэ˜дN™Я|h[f;БбрфVб Ђ­“[$ћ2Њk3V}$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$џ™|ЖЉmX•Я>—ЫХ3b;W5‹qt{Ќ?ѕЙ!їEЫx„@\Yй˜fЃЋГ ŒхК шjъai”w }В йЃvЂkЈ—Ѕi–S]бLlиёўзќt\RaМЃЛЃzjЇ]ЖхЅ…vŽ*ЈFЭŸКgB:G•cЃЫ.уŸ гїOs‘[vє}ЛхVпV ?ƒбYе]} НмцpєЇ Qэ4ЂvT3}эџn>›ЦSTM'PїЈiЭM3}iюЬ}єAEwˆ=ЕIГк…ЮІІі|щmѓЈvn|ш›§щ@њбќъ[8РччAhnѕ-§IЂ?ƒаМъ›=“Ѕ^nоЭЉОнъЅ‘ЪVЫKс0sЊoZŒuДЎœgъЯmtћT/žЩŒЁ Ѓ…ж8бljнhd; dnєM_ЈЬ›‡yЄAfіа jншшСмЦ>­O4‹g2пєХЭMkЭ7ЗМ~БVuЖ]Ебдfo]1ЇЁh5RДYbм=‚д@ŒЃ“еXЭFSЏ1їjЭ\Н рntЂ-yŸ^J +ЄЉНЄv›;u–`GЃUяšššъје]ЭL•OD›uнhыЇ™mМ =N5ы•ЕэкhЅ— jЇЃяEаюЪЋЭїўчю 0К‡їѕГ ѕЊДуїшэ2Hљ’шŸюBGЊаШЌпЯ‡іV}Q46-mЉЙаўЊ™б1jЌjРћ;фюa•ЧЊg@“гBбк™аwPе5ы Aгъy™рЭЗ}ЯŽ6ф@›ЏЅЧќЅ=Ц‚я‰4Е>зц.є˜n>єn‰і… AƒUаˆYW›)5ajє.zЧ‹оU@ява;3eа{5кЊS=FаEUњ%і{6єPŠDЏTу5іS˜аs=VД懧>zaы@џйУPтkа-[Џ ІЭ{zт ГR{ŸњбыЬz_Нg@П§TDџМEЁпо~~jЁ~~ооЂаэL5~nэЭ ў5nЂGіOŸє[зшImеЮ†оЯцЖеo+ЭњgT#Ѕ3m.??щш.kЬыаˆ W›•УьœЗАЕ нз™yб*вМэPG •n>єЩ„^ŠC5“Й+ь›З­`qM‹6Эma~4(еf…›оyЋбъ€Ћ#б697zfЧ™єтmџwьТˆюы!ъєСШq zЎf.гяH5%vЁПП ѓїЗmЛЃб3ЭўЖ@ЦдQhп"G+ДZ‹6нБhZLУУаdХf&Ш^иIhG§,шcКЏр*ŸнvыmvVіЃU,К­ъўјŠD?^єwz*жŽ8єМФ#=?v VэTЕол>ЫЃ>бhXDЋžЌЖШVœhзі  2ЂЉ%œhчнƒЌШ†&WрC/˜і4mfD[ъ4ДУœa{<7І@ЕЋv6t6{KГЃ•Ћђz5О {‚ Ч3aэшЮ%ˆЇђŽelѓ‚V&њЊU]їњEуЭш?Т}5еЪ4CДz>KЈ3ŽОш+ЎЂіЁ­F—Eу…З&ЭZпWMЋгЭ/‰& шkЊ]шtsњ:~šц@4ƒ™P?аЖšХKЂŸOCН=ЮЏ‚> FOВЃеяяя\vxј4аg§ ЯњЙ”Ь€ўэ‹AЬzљ|Йh ^Ъ>~бCЋчицѕшYН”хGУјбWдьCџВЂеjt'D9бЬf…šItџDЂŸЙЬКк‹^ещg63Tcf Ђ-5ПYYdЭƒ^дЯ,b ЦЭQhаыLцMє9НЈѓЁчЏ99НА  ­ЕQД}ЬFPыhH@юЪі!U=ШншnМ­U+„~њбŠ@wž…ЬІZCї@}ŸƒЮŽ—AЁsšj, лФ#К йкжЫ>ыЮm6мNѓйuЖА9žTубТцPДТN*eΠۘЁšF+EЂUёНaАзЂЯК yQЏн§ёJцyaЧІV~uaѓД0 juqsЯў^‹е5Ш ДšК˜-ф%бЄю_ƒЎM!xіСкo@ЊЅэп[ьr—йѕ1e>Е]єЬ6ФкЙ*ЎјМ Y"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"yЕ|~^Кx•Б„х2'`L9–+—‹†ž\ДъreХrббЖьbЇž1!;х‚Ё+В‡ЅQгьrŸ­@[ј5аШ~и<šІ.ЧйТђ В]ИуШвŸ„'lT%3Ъv€wX%sЋС8цP|T 6Къчтљв[Рc}žл-ГљvѓЂе$§ Cпn™еИz”<ѓ:UM˜Їеti4УЃІё /Yб”yО-4š ГXcѓ3ЊIѓ|†NпЈГЊoЋаJ) ­ŠЃozn_ћаFїSltƒMЯ‡Ойшf~ˆО|‚9&:ƒћfЁ—u#а†yD3Ћoz|…‡ћ[КН 6г$Нд-ƒzЊiЉ›С9~є)н дг'њpfŸg3ЇњІnц)ƒйV‹ю—і‘^<#КɘlнhЁѓpњ-њfЃQЕe6Ёц’шiщxєє$гіИсj{Xf§Š.dжZѕV›ѕn4мЎ ;fїжk†fP#E+СеьЉеа+Ъ… “еXЭX0 ЧHUc%яc’аS‘ hДфЊ#бw':Mэ4їъ84ЈQ}gFГЋБ‚w]MMuќъЎnFбї4RѕЎЋqЏѓї‚u3Q>­іЁ§?sLЃСбtѓRљnФž№лЬfД8њўчЯs-7Z…Ѓбњ цЎ(ІцBлхk еvби4ЃгоЪTљtѓПА=ъЂБioDDЭ„FЊНU‚аXKђЃщy.і:Fэ|§V˜УеќшРzˆйЁvЎQ šiufє.ИоŠнс^#Н›Z/мЌЁ‘uаЁхЂаЋWqзлэ‚ЬhtxєnWЖЪПНУsў`і|Œшс#…XkЧ…оэКЯ.? ]ьЎЙвz5Qf?$ВCЦj™бћ,hRЭjцFSъtє„MИуа§їміOMœнЙћЕР{3 §gЪ>НюћДYv^/§чO5єШ^~{Ћˆ~{‹BПНН§Pц\шY§ѓжЋзЂ;sЬœ нЉ‡e{ѕJДšб?ˆ9z?š;єлZГЬЊћzP§ўС+gDяаmV™зЁ1ѕ‚^mvЁѓжЁvšnt^єЂ.‡^ѕп=Иб*вМэPG •Ž>є GЋ5шЅ8 Z#ї…}гжvZiеЁ:вМ7Эm]~4ЌйihPѕрЗ­Ж:aw цмh ŽC#фУБ #КЏw@иqhѕc“ГлН=W;иьhє";апњлЖи‡XДƒь`лё“1vZs­pЃMwЌY‘b†&+ІЃ}ц ш#šЎŸ=БcЭЮв>4рЏЌмŽ&ћЭйа IB/з—~It[Ћђx ш€эMcыц!ѓƒ>.ДѓюЁUYŠГЂDxааŸМ?|ф ш…ˆІШvМ]ўЭhGm}эƒ ‡ЁшAkV^3D_ЏДЦ^еЕ™kЃgЕ2ЭAшўTy(яX…ЭAІ1QўjЉM3Dї?HŸU§Р“ЭЂF oІб“Zц’hЂА}шk:нќoF_аPэ@3˜[:mЋЛ;KhГmОmДЅцSъaЭѓ mн<:є<Gчќ4Э$КWїпRЏnДЉf3+ѕћћЛд§]Ь њŒ эF_ѓ„~ŽљбPн?ДЬыбKЋAqNѓ€ўc7Cл7 §\Ъ2ЃеЏ?Кew[к<шAѓšjvЂЏц{“B/jfГЎCcqЂйЭЪcŽ@›j~3P?йбЯ\цY’ЃаzЏѓ •Ы‡ъLц^Mcб ;zњj†˜єљ‚>чGЋp4z!њ\m ЛCц1ЕNЋзBїlхBї‡Ьƒ6КРћЊЛ…4Д­кБљё`VЫЉ3ќtЩŒV =Т@g6CЕЯЌЕКЊК­єЃ ›—›ˆэ4ŸK›еВ^ŒYG—2;>Ю!9ЈбХЬ лбi7К†yRЛі‡­ |у еЄkй8К’Й[Йџ3Ўе•ШsЂаеуPoжЌмїуЭЂ]7фЭšЩ–nMё,ю–ЬdOЛП?Жзу1“єЃ0n­FїЧћL%UB^б,‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘МZ.mjVх2Ц?І”Ш›Ы’щ™9ŽЊ ДrAЬmz~й[G#А ’z\кДИмgЋhЊбeЋЋЖіCКІšІКбFз7gHAWЖ!Г{Чf’/ў RNНв0Оšљ“ТxЦQSыЮ ѕЉдєЄџй|6^є-ЏљF­;ЅщF5M3Ё›fzтШ-Џ:нŒЙ4Эh@чTћЬ Ш'|RБеЗ5шЦB+ђ-‘Џеmх›ю›ch… ѕ‘Z­›/рU_ж‡fЅLєEС):KГo$КY…nŒйЭЎОЁш&нрhfѕ@ы(/Za“šU=еМQш1лъ†BпВЂлL ъшЯ.†Њ‡ѓЦeјgTkeoгš–кlДжъўМжћ1чFб‰6КІЬYхбњg 4Ю3г ™›ЩLЂЭwžMЭƒО™СZ­1СdќЈFГСэЊРZШЬzшрb!h5R4оŒЈ‘њЩjЌц=ŒСяХаmXа]!lT5aОЯ№Xє\…э2ь84,ТЎ~I4R53z<˜ŒОSцNMЯ%*X7х“бwЪмЊI2§ћЦY+ŸlžЫšЋбЕћŸvї–uдO7їeэЅШкѓяб‡ЂэXаї?ЁшЏБЫ#<§Ч[xНy%Z%ЂUЌ:ЮeмёkуŽэѕ+Ђ}EЉТ_UWEЃѓ&ЌызшKЁЩ3њЫ…ЈžMNћ2Й@:ВЄe^ѓС˜ЌŽЋˆ˜ЃwH1ДэŽ^Ё(ZšГЂwCВЃ­uа†š,У€жемhlt`ј7тк5МwhEV4ОФzє8{ggею№яj…іЏ4•}ŸPГC=ЂкёЁїntјтˆvЈ™аћ9сfRНcRћЬМhJŽоkсEю4єо ;ƒЇ џихпˆ0Rбoo† ХsЁ[іЗЗ(єллЈFkgCяGsЏ^‹юІН§TBџМ ъ•hе›ћF‹іъЕfН,ДUt;W)Ђбља@‰ў!JгѓV ‰к3zЕY9wДcо*Д[ЭŠvЮ[‡Fйџ1Дњ‰CЏјG€§^m^‹vЈ#а={)tшŽVkаKqЈŽDытЁАoжкN+НќЂŽ4џXцУс8†=•‚хгбˆ97Јуа.3'šP' MЊƒбG=ВSаK)Ѕ›9б˜:­uY)LЂП-єЗmБ[wZtєё„Ж‚ЖЛ‰†ъЃЙ;кtGšЖ]Ÿ„‡ЁЉ‚ h9zfгЗT_њ"t§,шŽ­№всhg\h‹Žї2 чЧ/…~ХNGo4w:њ˜Ј†U|<$=W@ы'Б6SO:ZGЋ=d}эƒ ‡!hРNE“+hшЋ­Љщ’L{š^Cлъы*єƒэЈЮŒжоёfх!kшЋ еx5МЋc—ѓЂMѕ5НД;Щм—Чy&ЃŸО>$Ыmt8dZuгіВВё’Ѓйkб“zјtМVAгfњлƒІдUаWtsЃЬџ"єгD_аP§DеŠЩ\Эv—v ЯчљwцЏИњjЁЧ9™бд'Ы‚юи6кМсѕшyЦ“иљдІ9ЋљЬЖкBŸбч‚ш_Pїїw2;аз}ѕЂŸ]С,h5ўэѓ @_ћqѓ †~EљЭъ&}5ЗЙн…зЌЉ13‚ОZ}жбЖšлƒFтDГ›Ё::ƒyV?Qs zQ?s™MєљœŒ^ийаŠмњьG/ЭЮdюдЄAc-є9;zњ>‰˜mпйўB2 ІЮhžиЖйBїfeюЛгEд$Zahу ЊVŒшЌfіД =3і†.БЇк@Ћ‹e0ЋexIѓ|9ЃЏЕzШx&џ§NWwќhjШpЂœyІ›w\ЬLЂ+™ŸжчD\Ѓ‹šНhк бхЬЃкЕЋћQ~tIѓ vОƒаeЭНкС:ћЗGyђЇкё"ЈzdЇšs30;iГЄЎш0ICЛ 3ЊoSЃЧ6Юы‡Ёл њШyт-ŸњvЛЊƒбЫ Ѓ§йд7 ѕ Eƒ9:Л/kЂГхшNжаьjгlьћ RЪ:ЏаI šY}KCЯŸ6ѕа {whVю‰šU}СVnРNЭЪмеФLXМ0КљќtЂѕгаЗ[€Z7лУ:›+ •ўЬ|‚fT‡ uф8‘:MЃйдFYTНŒжžйЇ|h&ЕYC– AГЈ­Ђ:ИX€™C7#ъBшћ§Fрm­ jЄф§й)шОRє}J"zЎУЏv v$TaG#яК:}wЃяihЋь•g@п sЇŽBUђ ш;Nюд1hЛŒ]?н§жхfEє~ёешЗ!•ауъkбЃњЇ њчП‡ўљ!ебэЊihВђfбэlЂ4=ošbџŒъец^MюЧДUhZІЬЮiыа{PЧ ЊЂJЂWќ# њGCњ˜зЂ•Y~BџD˜{ЕNЫ†Ё}ZЋ?ЉЃа-лBЗUC|ш€N•єђ‰hЄбmŽG:=W‚х: }@ЭŒhM}HD;Эœh\>ŠЃv$1Bъ(Д‚dЅ 3ЅўЖап^Г­>xяЌT Й}v4B э w$ZiЬEИб&;=ГёEPzšЈЄЛуЭjzїб+‘hƒ^и шЎˆs vtЗ`и_пžЏ.ZзщdsDW’ЗGUtднƒ…НО> :EM}єI@/ИйІrY A_‡ шё ‚~шeyбД2ЛIГ=|:Ка е`•\f7њŠ7к‰fо"џє5Ђ9ЬEбУН*њiЁЏhЈ~Rъџ0SK‚_žЗбц oDsЪЃusЯD/Sp5кT?-3†Ж>Z єЄ~fB+/њl Џ#к8 Э(šбЌЋŸ!шk6Ђшg.єяя\ї—§›ЧмЉЇ<Уаhpєs*Эl.‚ц65jŽAŸ 4ПyQЏ@[kЁq36ъhC­\ц84Tg!jЪlЃћƒ>єЂЮenейFŸУа3;zњBi/ЂUњœн<ЊУа GЃ[$/Zсfs'ŒVgнŒuК,Z шsg Cg6ЁЯpФаjBлРЕbœгџ1нмЊ)Дz„іяЎfе-8ўхC“Cр™2цХю3“cР‰ВfŸк5d9QкьF;GЬgŠ›нjчљщTГWэ;WХьл ЎWЁf^эToэPS'k‹ЛЌEзі BOOjcЇ„Ђе†ЬŠb+ћ{б–афцнкN6ƒсбК8GlsЭoFСй~c%‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰$5—Ыeњ{zИэ\€є‚ЉЗw—‹ННо_њЂ_€9bzZƒЉхB1?Џ„EH˜к:ˆН…ЙkбјkQ”м­ьA9ахе.L(КА;€| и %еaфАV—b‡šOрЕе7ƒХаkЋk†ƒкMгl@эYПQЊ™ЁУуv3ii–hЉ‘у“[13biЈ#GtNѕЭАMOgŠBРjЈњ-ŽVИхSЗЅ‘%a#ё6ЋqРИХt>ѕmFCнE{љqє|73є]sЫЄОсh}uЂеЪ3­GgPkfjuмŠfWпa!(јžЄа x'ђЋЧЂ7ВЎFЛЯs&tšЅ?WюгK@э\fmЛeћаЌъД‰є=h•MЉ•вYЪyšѓДњ€юBЏЦ„gh6ЕQUkц#иqšImVЕаІNšEmE:\,Рœ }6лъЛ]žA˜лDmxW*‡GпYаїLhТМАубS!~5йБшЅ ЂN3л%СbїєFЗG’бzећнPЧЁѕ2v}ѕ7wъ(ДYЦ.ЯО#рAƒF+щ+p˜я89В8Q‹ MTЯ„NЎћКш\ХъЦГГUЮˆЎZYа…kі#šЦЮR7Щ ЮR•˜іѕхzКQєHэ“RО8њыЫЏ4VuWН ] ЉљбЛdД^ Q˜]jЬЬю юДВlшЅ8?zŒПцзWˆк]<Нгоч€^cЕуе;2ћ. шОНЬŽнLЋПЬ8ЭНšXŒНп3ЃщfЧЃ~Џ…MЩубȘmЛз›•œmСзЃпœф\ш…§~ыBsЂ{xПњ[њ­њMа‚ўWЂW›Gѕž.j&еЙаkЛМ э‚ѓЃгжЁ)vz}ŸЙаћ8sЋўE‡C:ќh с ћ§O$њчь`^‹Vі=њ'}8РЂhЕН, fєOz~щ ћуклщЙ\ ˜Ч ш#DЯ›<ЮЌœfNДІ>0 Хб‡Tє4Sшo §эGuа1­F›хŒе,hsBŠЖЫё (€˜ Д@є‘MЌУCаTБ#ƒЙg{–Бд‹”DгХ8Ш“œ^Х…Vыб;UьZС…ъЕ%щЯ€ш˜NзFGьщBfMп=r›Ћ SеоњYаIjGйG›$є\€лM{6њ:Aglєƒ–G›њEлъЋmUфBwлчикT_Q4j^дёfШфqhgЩt4]~ш~ZйЏY_lq'˜;Ег бз+ЎЧ}шE„ЦЋћаWм€O$šеRIЯѓ™ŒJР0hЕ,s8hZ ŒзŒН’O&єSC3m §dCыНЮкiњŠš=hЎ&F3ВџХшkЊq4›к?сnЃ‰юІeFлjhžмWSнџsрjЃЇI™ї‡Љ6Э=; ц j>ДBЭNєЕG›QtЎЛžЦЦаg н-ѓšQ4ЋЈQ3ŠЖщhL § E_УбЯLfѕћxќv G#Ёа}e~Гњƒ›qДuPGŸu4;yQЏB›G‹ЃеыЂ sZWgA+њmˆЂЯ+аЯLфNMš-єp№ьA/ъlцхћЄЙ6ŽV~єФЮhžдівZЁЯйЭƒYйDŸGєйF+dcgFwl­,єЙгщf5.VZ[\Ck& ьъh„хCч7O+#TŒžвў1PТ<юLМm“Ы˜ЁнM 9UжьEЛ†(0hKhч˜jhЇк3BiУЖ‚>ЛЬяцэЉWЄъ˜Нj7КZ^эdгїŽъYпъкт.ЎM€ѕНЖwHzzRЛ$ НЙМ$akkышXfUя;ЦŠ`лaуф.ЏаZ‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"љхrЙLїЉЬ €тш ^Ъ"К,СFŒ7`ПрС‡LOЋHAєфКш#”yО‚зО,ЃќЏEArП2‰жo'л`[ЏїztiЕгЂ‘BЦ''ЕК ; Щ‹Ш?v fе\РЮЅ ИФњfЅšк>lќъшŽн ждXRѓЙІбЦiƒЕ3љХнK—„ЈІQ 0Ђш2ъ D7гђVŸ)4œNмnЩ7­KЫ&€&;jiш2G-:t>ѕЭBЗ‹ТNh5ЁС Q}бюY­|ѓn™д]]/šj5zzЙ7іЕ3Јo aaЈх=IЃ—=MwгFi7ЧыQ}ЛM­FWnF+їypj*ЮЌžЫо№…›щІ0‚ћc† ЗЙeGгj`Цацђhe<4бфEtж,ъ›_Ньa…ЁЉxиh^Е^˜0ЋЩ…јРYЇ™Q}ѓЃЕёЭвiћx!ДYзgІ€fR[eЃЭ˜кЊЮЂЖЋоЃЭЖњn—чPлц6Q`о•ЪF­ЉSаwЎЦЭ‹:=VтGSцй‹uиеfЩћнPGЂЕ:жЩшЙшнN4ЉЅ-Т€ю+"ыtъ(4Z ЎС‚ОуцVƒ&jС5XаTВMDч)žЉxVtЎтuуейJ zCшhuЭvфBG“ƒи‚о8:W/Н-tdљ„Њ___§џŠЃSЊ~ IBGЉŠ~}yеХаЛ6!EЏ[M—хDяІ„™НН&ы2Ёл‚;5fЏZ+ЌЫ#Ьs=эё}zb(ZѕuЬњЫšёh$ћН[ŠыД} жbDя™бXЏcбѓD›ЫŒ&щбhBЬFмihЋ|Д _~{ЃНб‹ќээ-§іf2KЁлtЫГ ‹u: эTgEП§‡ао§‘НоќпB™‰EG˜hЧ4ЫьќG7Z‘цƒkж:Д:аъ8Д=,хГVЂКBЏNEњdEыKDЃMѓTг=k-Z!+ ъ(ДВЬ}ЭcєPJ_aщUz`ДŒfšŽž+iKЬoЭXГВЬЧcєёˆЉуЩЏ‰&ЭЌшЃОL"šsЃ wšlВ‹§§mППCШvЛ#бЪmІап†9}ф0+ЗWOљš…š5u4Zyа˜{‘вhВИ…ФЃU?Ÿ&#j ЅаЎrЩ}—ˆCЧЃ_BЭž0ЃёЂхафžЮŽ^]џлЮл,hДŸЌ-pэ‚ ћуI`P?Ž>z§ы`Гез1zеБФƒŸMqiДныЋ MбЬ§Р’€&ыБЁЛ‚ŠX%š;M.а^ ШW_mtМš§ђEЊd }НЂjxи‹'ѕРЫчA?Ц3ЩцЖ КФѓщ@_QГ‰J `PЃц.pд:Д d3[шчœd4€ѓš ЁyйФжрGsЊЫЁйдЛа…юдЪ4уhНt65кщЋ‘ўпЕцA §,?сn›эNOшnZnДЉжЬ“i*ощiRnДr›{Жщk–љК)5#Zafњj› tž›žцЦЬ­"‡Д9а#7GЁm5ПY‘›G#j §ЬfVпп_ТŒЂmЕ^дmх3nžмeигЕ‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"љ—ф2Є6#0#єBЈЗx13шrСйФсšЙ`СGŒЯj(Е фХuбFа;ЈlєХ7 "—F_рАЭАЧ•=&ђtіМЎGД%ДГƒ§ 8p+тЁџсc š›†B4MwЎйЈ†Ж/ІnJЃ4 žЯ”1kMе4Жйа,цщI~1@7гђИY!ъe’*зы‹†nŒЂA14˜бЗЬf№в.*Э„ejЈ}Iњ–‘}!аЭјбH™UC^е%ГК­L/­Ќ3Ы%ЭwkЪœ}бX+1@гІvЅГЈo#[xRучˆ‹чn™дЗэR‘fїљ ЭЏыо\*š:7•fGп|шЦEvŸЯІеБYJsЋoйд=6њvѓБбoJог7#йЬ(КжлLнpXсjЭЈОyбк№€уљбfa™NšKmŽ4лjЛ4šб\NmНЗ‰$›ьЎTѕMйfMJePп є§nЊЃбSЉhд дБшЅ;њŽŠЁ; m–вWIFO%Эefu +aAЗБeu/жрAaEƒ$Ђнъѕц^эE'ЊНокW{‹hoэlшxuЖв‚ўO ѓUЮW:КpMЕ џгшlЭє–аЙ>ЖˆN(ћ5d ш]—ц0ЕQ5QšA}П9DmVeEяцї9Dm–MDїAб>Њ§пОK йЅюыД%•БЦ}М€ѓŽЪ~яV‡ЂЇ2фBŒш=/КыuNє^‹­б$=НGтE‡všЄЇ БтўwЂџѓ…Ј›„~ЃНYб“ќэ-§іц*zЯ‹CяпКԘkЃW›ЗаiAПњ†ŽКOыЕЃбъMuъБісp0ЪsЁчК5k­>4Еkк—з`ЭlЈ#б{Н?8Ї­BЋКBк0/­^evЋш Н:}аK:g­D+|‰e^оо‡ƒVв=i-ZaKј—ёЁ­фБ z(e/‘Ž>h9ЮIF/Ѕє%ваН›2sЂQu3+S3™ЧlhƒвhZЬ6мhk’§§§­‰лчadƒŽFWШ€>&“5ОЮўž…’uN4Тв‰NfAlЧ"–к@cv•Л”†vЎрBЧЁ‰ЊХафžЮŽ^]ўлЮztšљ%быыs гЬ/‰і›_}эƒ ‡›DO4Т дЋZС„~LСаKЏ•a6аz•|ш‡'кlДŽFkБ˜а*e­гЏdЃЏИYC#Е  ‹ъt86­а`Џ^Мš^ЂЏWT {бjP'šћњŽОшыќVМЎCїgЬъЎ№|њбпnєP‚шAВкЃжЁе\ЃњЩŠ~fЧЁЏ˜йƒfUгfњjП )4и ЕбJE ѓЉ;НY4јїЋ™›rЦбйдРм…B_БCЃИKnДТбч)8Щ,ждаOнБб`Nол‡ЦFЭQhLЭ‹žнЈЙU‡ЁѕIšн<Њq3ŽЖшГЮ`V3ŠVі'Ž9MSч0Зшпп5h[MЂ3™еяяzД Eџц1;а*Нг™ЬњL4к@ŸNЇ=ќMЃчzљдєюАб­іЄNЁшgОNЋPtЧ>ŸMВ ЯЌШнaЁЧУрГ›ЛOaмŒЂ‰6{емw˜Ьš@!feЕCŸсЗђ|ъDД-ЯŽ^–дбЪ Я YЭS”МАF6РајкgŠь;W НаuСrŸЋŒŽJYszž\иьGЛFЬoчЁ]CЦSХЭД{LЎ<)гхОЄ:С_tєйvа–:]еlК•Ђžl ­CЩОoЬЌ}_%kWP›;†RcOj[—`jѓxџМ&‰е^ppK§5bP—c[FwФљў9^M—$K$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰Dђ_ЫЅ‹ъў?фD PH.—‰Ÿиќb…1<+.Дb“-5<ОžЃhMpYeН$њGmˆ=Ўь6Qф:ьyagKъy]Ÿf;hЗЄi–‘Mу[оЎе4Ї—іi(rи\ ”yDMе,цІQк8m4,Qнhh Ѕ›UcЉСЌВъfЩECiаЅб fЉrjа$‹dЕбЊБгПх6šљђ#Є@tNѕэ‚Ѓ›с†эESgnеЗ›ke—кq~DчRпzєкNzЯш<ъО2х кгдЙ[6єP9х=ЫЅОЙбль>ŸMЋу3•цWЯ•Ййƒ6‹њvЫЄАyz}3діg›Т>юМЇoFВ™o8J _џQюxЖ,кЋж'ЬЌъ›mЯ D{:\ЦЮзъXГЅFа\jЃъ§KЖиї{.ЕIюТ‚JхGпяьh›ЭkО/a@ƒj™аw$ hЌммt_[dTЧ ёrѓ*њz EkeђЕњaФ‰ўvЂБRLh—x\ЪF_qГ†&Šq6К­ЈњКЪXŽНЂъ+‚nƒЁэ/V=Зх|F–РЭЃК=ј­uЃлКущцe‰ѓztїV\…f§=ф‡~>Ÿ~єЗ=жШƒžKžё8ъъ>зdюFUЯš™§ЬAžїп„~†Ё‘ЫРбЯhmгГ Ї~фP;šБгШнˆWˆОn ЖЁ%ФВ ?ушlj`oŸ5ш~^%єyЪ*є<+ѓіадЖЙgЂс$DЭŠVДYEЃm5Џyq[m(кК=Гs‘{ѕВŒБ8ŠVСhюЯpmš)Дqи4ƒr9б„йBŸNXЋейbOГЁчE<шг˜vNїЂѓ™еяяjєЩDућ##ZQhEЁOСш|ъyOЇgЕaІа9=Јƒбч Ч^лK#wі A^аŸuoЕЮEбуImе(Іж 1+KЃs“ZЛ ­(ДNW%аѓОд;­ ђ<š6БPєЌгzˆžR•дУKjmNь8U ­PtT^]иЬ‚.mіЃ]#ІwѓжаЮ!§ЩђfЏк9Є†7DНMѓр&mžнQ=ЈsГƒnˆ­Ѓ ѕІЩuydwZmЮŒЖки+уЈЊJ+VЏсуYБшН}ДВаu9ЋѓŠf‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$›ЯeNmЩŠаш-^ЪХ 9 †EЖqрј6ь˜й`У[iЙ ЄЮ-TŽыGу/D5іДp4КЛiњe}Zм(Ln—lшіЕ'›љкЈqУ™rфІЯИЖi™ЯЗеиъiтXЄ,zашЈ˜8pо'эu,ф‚ъЌzо?ЇсШiw7šЇ•T7vРы Ёі˜KcЇ€[ЖС=6Лрц’§§ˆіŠR‡hп2›Љ…ЩSРLЃ3ЊoЗs –гФљжœOнеОЙTЄйsQЗŒj‡9 MМхSЛmм{WШІеёЙнђЉo™дЗ[Fѕ\›ŸЌ2Љo мц\­ж‹g23Ћo^t?lўЫw˜BчTц)ЧK }Ж&8Ž:бе^sD–DЛ;НЂЭІЖ G›M5‚fRы5я]˜а}­,j›Ь‹Жи|шЛ^ДigBпяа#ћ~g@›•-yšЌк%#њažдNs2кUћuбЋ+ SеЏˆvзŽFзktЏŽЈщ5ЇВѓдЮ‹ЮT[аkЫg*›ІЮзAЏЊ,ш:Кј+Ђ‘JЛ,hНЊ лт;F4ЈoжхDяњ„ж§ђЁЩВаЛ В___^6^•UН›Dюа_N6^6НCГятœ„V}|‰ДУьVЁЧ:ј"œQНїЃПfДKНїЉ#бКzЏХ‹ў D“є(№„оЃaFt€‹BкœhИgЂаoNs&є|єэm­‘Н„]ІгЬшC—іЯ шОю”цBІdA›Е{tŒYНН!цЅ2Љнhˆ>РŒ{ФcV^5м–:}АтGћ[MNйc]}8š]ъ#R7mяŽc—сњЈе4іG"њ ЃЛ5ИаsA[†>иш#њhЃCюN~ѕЁ0њР€>G’ЬіMщЂE)Дћ†ъЯЁ њdV”˜mИ“Ьj.rДТ†rє[€žДў}ШЊFї…—„ІŠ2ЉЉђњ[CЏDгбdiš§m&ЂnтЎіTЗй–QћŠэ`C[еац—D'™_НО< :Щ,ш№ЂifAM4ЏA_ЧLю™ПœpUXЭмшЋž{~НšjЂNfєљ|ІбWcs8аАк tї“ДЧcј‹D_ Г‰ž ѕ1š•!†ш.8zR+н бУtP{ёб§/oЋѓcZф1дЧа GЗeЇZƒЇЂјќЫгRгš`деVЗш+ŽVЃвќЮ<ф~‰ГŽ~„ЁнЁ&š-§|>]h<zЌ‘ ­ЋŸSр ›шBЋЙ43ЂЕВ€ьFc—Ё;v†п$з^Рѓ“§ЬёCъњЖ E#jZАЊƒбЖк~dA?VЂ­ЗЂmоBЙдlCФŒѕ~ЪGчPwpѓU@›ћlЙ§sšєйBю`є< Ъ‚Ф"ь@Д6 ”ЪaŸ0™B[•ЁХ26j8кЏAл­ћ=sІUь•qД Aw3šш3вшЁгPЮЬ‹VЙаљv4V†zAŸt4j цVуkc­iє9чНcQЂЯшЌmіЈMt{ˆDe2›mє|Ф6[ъZш…­HєѕNlќцI §– Г6Џ­R=`ш…CЫ€ ЛЩжšHœбfVG‡ІfЋЃбњМКДйvŒї зAŸч[аждŽ5ИaъmЂнtзUе6+ЪЖmГТy›GїРё//К6еŽ][ˆФ‡ЎэУƒЃkЋ|б˜/bV ~DПцЭ‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$’!ћT’33Фљ*8<йоŒACз Pіщ:СЬz;ћФ‰F/щRя­9-ЎеяІЙЬя,гв€a$ЙiКz&rCqЦГo\SZнЋšiщFЃLg›y\cP—‰ЊЄ{ТTГ4ЯBїO.ЃUС™Лн™;7voц€1ЪfW17 Ў1іяQlr 2еCe B'PЃЫRMє_XцvЫJОQыв$џˆSнV_oZЮnYбЗ<шЌj‡™ИŽИeTЛаЯьqЫЇJ{mыsЫŽцWпnеsqNї &#ЙCћ>IтамjН8й0sЋ§h0и{”DѓЊ}hcИѓh)єЭƒ6ЧЛ;ае>ѓрУC[ЅНf*^4—к.m6еšIэ1Ї ГЕz*voгџqgDпчЊМъ Т†6ъђЁяvrЁЧфBCyz*S ­З;M&›љe^д9бŽвIh—9'њcеNs*к]<э.›}њ/Е^s*;OmwЭЬц,шфFзшtК:SщЌшl•3ЂЋUNЉ§Šш|нДЇђnЗЫ€6ЊђЂwЛlh„§_B›exбK§ќо…ж§ђ•VTйД~`fPо=йVtYІNяцЪ М[<$ К^9јut”нЁйwqЯьХДъырK$ f:=жСi‰Fећ}€:=зЩŠоё˜}›к,ЧŒ6Ы{б__jДцnŸŠІДбѓбню-ЪќіV=ЋпоаШ"ŽЉ1{ZO4кюР!ZЋ;Љгб‡)аHmєс`WцBcЕЃбX/`iY…Нбв ш7м<е>:бЪƒ>:*'˜gДUЙ­}ьу@ЛїЧ0­œˆVуkˆ”>Ка__^ѕ8ŸFяcбію˜V:2Ё ІЙЋ#б 5У$ЃчиъWDЧš•ЙЁ‹ УК)hьэ—}ш—ŽF+уЦQ}ˆw9дAГЉ­exб:œ/’ќ‰HТаGr ЏyUЇaЛSбє9а НюŠЌ$+ѕ уЈL Еƒй+;§§эW;ЋfFcХПЭDбЋЋ[f[л,шptšЙ:ЗYа‚\ркЅCшўјŠЂ‰ц5шы˜ЎБ}{53d…2ЊЯэџЕБИЮСњЌЉ—Z}ЁѓT(zљнb}%ЬZ/– ­§24ОтfUcAуо>‡­\шЧУ.Щдh5М?Апр~ДѕЏЖК}/^1t[Е›ŒдьSщш1ИљFЌBЋЎцт"цЧd&б#в|n c­,hЄЩі"кКЋЄйnFєУ?ћјаі!=”бмŒfXv"nНŒ Њ€ђ|h]§ D#j§Ьё.деСhы}шC3Гс§)эК{ hэnФУFаpФ:ДBа hD :˜ћУF?В Zл‡kацХg2/Ÿ`Ыbњне&ŸЋP№“JC›АljИжY‹Ž>Qн:ZŸfьnsЇžW:[ FлпМrнІGѕДŠсўŒFŸѕїF&Дйу5ш3‚ЮHVѓ›>­4–gF3б$t>2…ƒэŽ е…ЗЦѕщDДš˜™Ј^аzЇ]“kЋOњф5чћдњDЁ2Йбj­+ЫЂM5|ЎЃЯ4Zou~Гй$Кеч‘]{GOъЁ' BŽ™“ЪˆuН…7Ÿ7З†кzќ'ЖfЖnlлPћа!yEtqГэ1Ь.oNku o˜šPЯь…oЕKj“ЛМЂYьтџН`}рї(К2 дНŠYћ^Б}ьœEљ2d5§ѓ<~Гž—DK$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H^7—!ъRœ‹ьl‹b@їА‹ОИдaъљЏ 7w™‘+КT|go,O—›SwišІДИ]Вщ:жєЫCЫxВ™‡igћёЃЙДКС2uo| ‡]№ѕЭ3AУkЉ„v™!ЩqEрRЖŽ6ЇЕj‘/–C_№љo~xSЛ~&н쌘Ч;ЧZѓ˜л-Џњv#б>5=т–W}s =fзЌjкLОєAcrЂЛкЄ:!ЗŒшлM­НŸЧКyи7F5bЮЃ^Њg!gQп :є“М2њІЁйrЫЉж‹Ѓы/ƒ})3Зк‡жGћ“hVѕmZсGmuVДOMшжЃеViЙЂЫЁcЬDМh.ЕЯœ€ЮІJнAбА,ЇкчCOnєнJМйRлХяї<ш;3ГЈёТ hМ0 š,e^дd]ЕЃtкeЮ‰ОטGЕгœ}FЛЭЉhOѕЈџzш5ЇЊѓЯ‹ЮT\:НЖ|ІВ‰ъl•3ЂЋUt1tОЗЫ+ w]2 ­КŒш]VДЉfEя8 kЅэКйанщ$є\EЇTЖЭsqХмщЏ­­Œт •Aэ†NЈn–еЊћ&…UЧ‹' Э‚cі}’бCb nє> эЭоЉоБЂї{ѕ\'ЋzoФ3зЗ=ЬrЬhГ|є _ьoБhМrњkШъвѓбЗЗHє›‹ьD}љеют,hdmЂ5р~и‡,шЎ.Ќ<Ј“б]н!аHmєA +-нЁуЬ 'ЯЅ=h„&jЧЃёfЬ•nГrЗњш*„VDхУqˆKэ4ѓ‘ЪЩhе7›6“lz™NЋгЖjuЃПОмjЄŽ­fB#kБЁ&:жЌќf>ДЉŽF+пцШƒV‰hќн—}ˆwёšбЧGГЉё…8бЬ­>RЫ№Ђ!<эX‚=БSаЮђyа<э]›ђ …ІПŠ1 бпп^uф+ШbЦ‹ћбU–џ6a.ЖЬЖ/ѓ‚hэЃ \ЭhєП]pOЗЏmze/бнacdљNŸЯg{…^<Љ5єtтhзд+хъєђРцзЋЁ6ЭзЋYS/ЖO5+‚ьB_ Гн—›OpЂЭпГ&бTєšH9ХcVc!ьGИЯIhДЂb1ЋўECшйЫРшЖ$Q у]C’ш"?TOuzУhrwИбжБЃf.Š~ш…ŸCМіЃa%іN+ н/цB[[к@У:ьт6bюVsЃ{ZЋ“‰ЁŸ wg4и"`5x~Zaц;њ AkѓеБ?АнёШ€~˜hэ%еpЇ6qјЫBїгЌ7тƒ§0бЦЪ4wQ'C=‰бJ ЖЧйN0™›ы–зYo=кQ&‡й‰>Ѓш“…>—љ~чS‡1ДТа…Э,швf\=EЬЪкЬNєй4Oъ dJ=?ВаzЋkД™T/qЂбы,їЊqДcVnБO}6nв“кdG{дкnnqД“ аJЁ ™ёѕ№—ѓ•)‰ž>шю$ŽГJŠ ;еBВГ5ЭО—н{bcф3КпЭ3хб>Еы 5sJЋU-ГПеŽSJU2' k‰§ьвџŠea§џAи{Лhњ? рмMЛЌAo)ЃЩЎЄ€ЏBV3Uщ]пzfхЫˆћцы %‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$Ip.K“х=ў\ŒPчk裘fSчЙЄJY‡оЊкyВ;Л 845 <г`›ЇrПeœЌєS§“ёeв-к€\њџы)Эјї2`:йŸXц'kЋ7DіQmVy3€ЖЊzh—Аcжšhф(2Ь84LЊf6{HBGTЄал!‡чvЫkОнВ ГЊoЌшљeЫЊОхCчS3ЃЁ9К/ЎЋ9о™CйLъБјЭЋˆ2gRЯе9й72hОН‘K}Гб ЙeUпhѓгžBŽбhfѕЭ…жtК?ZЈѕбўуИ™Wmжv›•їx єJѓDња|jЋr€™ˆЭЅюJня+†žеj^‚Ы|Щ€юыЊЙ<њn†mеfR[uГЂЛІgAпЃЭІ3ГЈёТ hМ0 š,‡V^rVє=ЪЌќцtДЋxкU6]э,aдns*кS=ъ?iyіFvtžЊЏ‰NTWAЇ‘}х3•Экшl…гдЏˆЮWкSy›§ДЋєЎK†ЪVнЄв69к`ГVжjѓ ѓU^JяцВ<ЅЭТн7І„ТN4[?АТ|ЏЁ2k'TЕwЈ:љТЮШ§Оo“DювСŠ'ЂЭ‚cі{6є~OЌЏv™ЙаЄšНпѓЈч:„:К0feGуњЗDД]>Z“ЧЃЉЪбcотбЮКEЛыnн?<ЁшЏ!ЁhЃ2WЇS‚а__~ЕГvЋNFДАЂбв шƒ™є ї'j'МcˆКcщуёш@Л;нЮu•NBїb•Ч9ЋбЫTДВџu q;Щ8лжЇf@Џр‘2“n4UФTGЃ•†І–Гб__tЋЩ*Œш3ZWЧ›UШцРб“< }HB™ёNЏG/ъёЋЂUˆ™@ЋеhіVЏBЋЙгіЉRhз:$:ьУ…‚'Њ}‹pЃw:` §=%Ў §MŒM›ut№ЫJппˆŒЫŽЏ??ќўFдњРкh}$FFn}DбшHЋ›y5њhš[51’B'ŠcаG MŽ$дЏ„>ђЕ:Ньэ5šO]j6W8ŸЛџЛПŒњ'з.ЃuўЛ‹=tЈv цDƒŸ-іЁGє\/ЯэCћqh}ѓ}]2?FаFНщ ›йўюљ5sѕGЏ‰ўЎ7‹yX#OьH4^м‡2Зъeа tЫ&ъ1Ђi98П MѕЁй‡6Eглу4G[ЧКaуŒ­ЂэCл@ŸЂб„š­ЋŸCМhkK[hP‰[L ЛХмhєИ A,hЭ=/і<€: НLyZш jѕ’h[MЂЛC=ВџЫƒЮѓ6$арxВЭУб“Љ^fXяУМh-њЄЁO­TЮ<К є CSer˜]Œч`є™Ќ’ЧьBŸ1єИ њLЂ3™зЂŠ.lЦеŠBЋ5ш|fњ|Ж=нпц3њŒЊС1/КŽQУCцНcў$1ЭfЬhЫ­?7аАеєЄђjsy€>Д‰,+6еі†Aаж­FДЖbN+d†j7šќ~T=ГБЛ еjФ[AфЭХˆыt –5шэА5Tг8On=ftiЧмє—ДЁ~ǘЦlsЯlсЭ(Ьгƒђi&в"-GР€eЄ1Љ$™Œ$xUІОМУ*ѓЙ=Ь8TлlФ†‡TПЩЊ™­>cGєН1]WE4vоq§ˆЭ€gQшхmФМ"ЗW4пђЊoœиЙyбmOНњ–Ее]ѕ›Нx,˜ѓЉo|h˜[VѕX§цeDsЉo&šх^rЫЋОYъ Яc.ŒNPпђЊo$zjѕД‰7Зq ЛнШ‰оsњръѕzo…Ћг œhЛz&є{‹WуuГЂ‡М$zжыO_mЖ§а‡1YаvqєA+­НOљŽ€жKГ ёв‰h…е<Щ™_]ШГЧ#ežйёш>VеюШ„2Ѓj85jfДвЩ h‚МЇA­#l&Й=Ш*†šMЎ–вi\Ж;‚Ь\hM€V!f64PЇ˜Sа*DFбіВИYс­ъ4кЕ~їшаи gЅЪhUm}Ќ@уё—KWћз`GwьDЏ,ЕЬ<Ь]Є :xчZњА  Еэƒяяяyі№—еК9ц=tRё5бжР^њ=›П9’,Y}ќžдУЧHgНшхШЗзPНŸ:=5zšO]}4пБхбпhЖVGЃWяiЦ]m—ю~OзƒОNё ЭRLfˆ†?ДLHщuЩ№˜@•чЛРjДѕзњъ ‚Ц$›­0ђТžЦ9ХCtД]AЛ%OьH4^АМ”+а-›ЈЧŠІмЇ!+ауŒ"hb‘гЂЦ6њT MmŽйМMЈбоFЃhћXYДЯL ‘Ы89еœfJэF#лХц%ушг) mГЙбћф@w‡–П(t5`?Лјаc\шОN^Дбlz>jЈ!Z•щДK­ЁСQ]­ЁUГЕЏq4<Јя]Ч мkбHЅЁhДJ&Гы#цŒ чЖєЙИ™FŸДBбчŸпшqе@tс>ЛечГЕ;ц[Хxf–5cjpˆxNh`,‹Fж3›Mtк@–Ejњ‹”rќлЊ8кXЯ…&?J`‘bSэјЪ†.dждqшЪjз?f5‚†ўвlь&е„yA$Oj…~оhЬМ\t• Є‰­:4vZm=РЩГѓ‰JfЧзЧйёЬіЬtЭ8аш­ejЙ‰oэVoЧЎmŽQзїy!*Ь+šqЕљЏœ­FGО†y†Ўmђ(_D,‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$О\Ц gЪcBrбC­bs†4ЋюШVсЃЊAŽO'›Ц:[?ˆЊщвяХгщ-й•~†W0Јp|idЅ=)meДЅжQ§X%В+кКА’d/Л4у@isЛЂэ04ОЈ9@6d;т†x'’ЗaЦі1yCцр‹КнŠšу/о~rЃo7}щh5œxЫЋnЫkj–нвЭЈюЫ5ЫŠfSхgѕєэƒУœMН um’њ–W}3;=%igпђЊItRЋѓЂo4№Лxސш l/zъ;X }ѓ сXџaЭЌжJ{Ь€GІЬМш›LAљаœъћ§юDrЂян2œц;tч@ї+Д+1›7;ЌРЅ†%янŒшБ"Пњn%жlЉэвLhЌ№VЮˆОЧ™55^˜GMеNDSeYаtё$4]6/њažдŽЊ/ˆVjWKюцAэЌšЎvWњOZ^sft–ЂџMtІтбЙъ&ЂГеє&аifЃіЎMДY–ЏгЛ)ьhЄ2zЧ\Cя˜Э(šЛгЬшнЮЊœјm EХгЬ(z(Мя’PЙŸOдfzaн§’Tє<шОœ*‚^v_zg'3z”'”FъЭшC›шТнdzїіЦІц4ДKЭƒžw4'ЂgЕ­OG›ЕЙ;mУпRаhйМш!/‰о њЕау Я‰6kГ zXбXэ}в‡­ТъЅyаhщTєTЉнўq‚ЯћТsІxmvєpрГ­Э+Œ>zб__ЈњЈNOъYxДІЎ m˜БрfTэ*ЃНžhзb\ш#Й:‰М kБЁ•бTJ Э[ЧЫ ныАЂ'x"кП7Кs'ЂƒVсFQїУќ…ТбЉц€uцQž"aе8аЁKИ–CЦеFуш С]ШЖЦ‘‚лP}ЄцЃSЭо%qп`њЗ{hp4‹Й0šЧ…^дпыб,№4Ш*ДzAДЪˆ>Ÿ=’ыЯѕiЅ2ЁчŸZfBѕ˜б]]§‡И Щ 6 ђў„ГQ]wŸкЌ@wУq†п&ач а(yfOшŽ,С>MiGо%ГЙM єьжјGGuк<Ж єЩЖB4ЎЎŽЖyбљЩ[GћБЇm5Џ˜PŸhtlќ“DŸr›і)mі:Пњф@kЇДЊбыДr Km‡ZCƒƒКZCЋ2f‡ЂС1C бі›ЄšИхifЅmkЅuК Йяља' ]ЊЭ.єGŸLє™@ч3#j­m™“Ў&б9ЭфчтyFkяЮхсŒ>#л93н ѓC‹š14xlЈn>›…2›QЖm7Ж(кМНк­_оˆФ­ЖК}PРlЈЃаgPЅйTЛаjChm?вш>W@У%гаЩ О\jЪ\ =ИU$zšWмМа)ЗRж}]ЫьњfєйсL=3y<9ЮVфŽ!аЎ“uС}\ъ­ЂЉ§a}›лкЉ~EДљ`3ц.^tн"„zkЭ5т6ПŽКєПЉтѓ’ш>€љ*ф. ѓeШ‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"љ/чrЉ-ј/Ѕišк„ЕiњдVЌI3‡8 ЮдН6h ЊСдU_‘iщ‰BЯhЋЁщPhlПlХ<ˆьƒШЫQ€і (o6›ƒn†‹/$пџ>’]ЌпAœQуОŒrGс­єп^њПoЗьцл •‡<žПeWЗ+иНŠШ2ѓvЫ­ОAtилб—[nѕА€оЌјnsFѕ CЇl€ЮЅжЭKжЃс„JшДфmѕ-3:‹: ЖŠВЙбдцa ж–U/•am2ІйЗ|hXкеfˆ$ЭЬjНД‡<‘C>3/њ~П;бeœш{^3dЧšЕAfTпЇdCЯ+d@aD›ЅйдvсXГЅЖKчCюH4Z—I—Ž3kъђhРŽCSeѓЂяIhВ*‹кQ=Т<ЉU_­XдЎžD˜ЕЋ(‡кY=ъПiyЭ™б9j2 ГTЏŠЮS5ЋЖ ] ­•кѕЕї‘eї{WYЖNя–3­Ь‚оaЅї ш=†оё ‘Тcщі )ЁбSх§> =Бб~p aйН–єfЕнш}єоDЇББBЭLh­зщЭо)юнŒhs1.ДЅ~уCУemаУtRЭƒ6:sžц§~KBПщтљ…ЭƒžмooIjs ­ŽЎK™ЧАЂЭ§‘ НOAгU$о еЦьh§iŠйИYРї<š*Šž>Ь0Ёёв jЌp[Кћу8fEЕiЪ\ƒpѓЂччGецЩMВYбуѓЃž(ДгHVzcЭu“аф%$šЭНŠўњњZ‹ь$Д2ЭИš }dDћ–тCгХ•аЩъh4žrhяJŒh–§dnб!юcšEА /Кs—B=›dTЏ{sшА5мЋYуъЃѕQށ=(6Gбѓ›P`KлЃмшР—Ў*к=ДEЭЉ˜.ц1џ›б„к?4‹9 їtышыЕh.sњzХдеауяCЛ%з+ЊЖ‡еиЬj,>Џ`,tъb^йщ~ДAž ђ™•U]sŸLєеމ>йтП•MЈOS&4"юн/ШЬЦм'ˆ&НK WsЃїібЏиil Нlьё v`ГшуLT№y:?˜бэaгаˆšзьйбК;дћП(є)ЏEŸ<шгј'>e6#jZ;ˆ.вkmu­Ÿ:сheЉ3˜ Жƒш“Вг6ˆбl/ZMF­Š4кЅhh6д:ћŽFд8њЄЃ5ЕŽ.DІ[=ЃOZлжŠњpЩIІя jRы2'3ё1ž­(єAŸqBУ)E/ншМfjSЯ‘{єЂ†sTY4zџРпœ0њЃNv3жkbЫ€эaŒа 0“џ2Зе 5›Ь2hz1“шѓTЅŒ7@ащ^[ дЎяйsЋЗo"њД1є„uџ;lsшnеяDлCFtyѓL'еуžЦЭuCЋЛГ%ўЃLL(5yv hBMŸм—9Nm­0u|гшѓ|м<[™К„hЈіїјЈВФƒЎѕ ш Ўои~0ƒящ­эb+`яОКyx є˜Хљ:f‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$гєЉ­X—fУшІСu uЂ~š†Р5и™Њў‰в4†mіYgІЃЕШІˆрYGыюКСGh‡Ж‡np4іrl эPкLєб !ЧъЂq”CˆЂ ЪЧЕcZœ/CnfДїўrњVЦмЈЉCёžk5Зьълэ6ЉН;лmžЕ3ЋoZeЛУшљб-ЛzDУuЃард-Зњб3€Тљn‰O}Cб!эєЃsЉWšб™[Ѕб™[}[аAЗ9…sЁГЈAЃЉлE ­-ЋОСNЃх@;дЗ[6ѕR™XŒhыЈЫЬОп“ 2™УаDЋ§CЗƒЦпsЙЬnєЉ 2ъкЛ~ќFбз!kбlf}6ЬН3ъЩ еgsDєђ#з hГЙх`?к>,uТбз+Њ^аЇ#V”нEŸNњjAŸNXAn5†gGgR{бˆyV—GћЖЊеуEs›ƒбKЗ‡ƒ ћ[@Ÿ0єВEдŒ>bhDŸ Э њˆЂкRs›=žаo:кўnš_ŒЁOzŒvŠz#ъъ,fK­­‰66HvЕОИŽ6Ю9аЇмf]mЃa^дЪ‰ЮcvЉДvLgлшf‡š@OF ­Jl“„Vшœd­з(њ„ЂOZ•2ћаfћчЧ[Aп=zЕ†>тhЦП{d6+Ааы ё§1Бяб3к˜п†йЭш§ƒишhWЯѓ+SаŒЈ‰}N ЯгnK1[ъГЙQШIЉ‘,VE ‹u7\НY4Иѓ9адіЈІVгт/…žпљћc;hˆwЃ_Рќ hGЋе№UУ6omЉsЏо&џЏ гЩ­Ђ•щfєƒЈ"T {%4ЄСc"ЛбЫhћЈЯ†7—DїЛѕѕа]^бЌ џ{U"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰Єbb~ВОPš1ф фTэ4ЄmГшF yІOЯ@iЬЌUѕ–жцa‡Ћ6нa<уhэЭтE#GБ—c;шЦЎaіЂЗhі ‘ЛŠ…Ў!_жЯїŠQУдюгѓќBцˆrџ}МtЛe'пnКtYмv9==ИнВЋoкhйzєrю–_= ѕѕ}o8Ь\}Cа‰ЙхVg0gWпnі–ІКkђЂ's0g•:;ђ]у-Ѓz6“Š~XрQDЫWgDƒЊмъЛ•žšŠЖЫ2Ђ‘тZЗW”ђ˜еhѕd4Z• W2C5^–K-h/šGMдЮ†fQћа+ЫUEO№еѕœ`.ЕQА2:Ж|Uѓ+ЂѓTхPП"кU|п&Ђd7Э‰NVџаЛнn)€оЃљбЛ1ZЃYаzY6єD3GЃї&–NE+ГpNєŽНлY•їSЂбЃЉО;tєоJ zŽŽN5›У^ŽНчmѕ€VŠ23ЁїмhgЃ-єЁіlšcƒјЬnє!ЭЊ~лEЁжуpєюээ-§…ЦžИб{hцCƒL”Ш€юиfWѓ’жC‰Ё•VСhїл[2К+€М”‡iMdЁDЬ­њ@ лЄЃсоEашœƒуйr)$КwГ •ўіqЂCтFяїєh&іG*š0Ч|Ькh+™бЉjЗCЛ ј“­UW‘Ž>9іYUn˜B—dAгх'ѓі<УU– Ÿ h7;бL zbа.8zжБФЂЭ2ЌhP7+šњ2Л­єК9бЧaЧЄš•БГЂ|hƒ—}d0П(кфсhПœœœCm№аuXбGv4ža”ЗL zн—™hѕ8ШWЄ :`ЉyˆЛР&;ЏˆЋ6бгƒ[m rЂдhяЗœuшА&dV#CЈЉEбЎuhyМš^Ч…#o}$цЁљЬф:kxў0Ђ]KЬ?=ЎmъЧ0ћб'dаѕzE<'š‹ьDŸ(єѕjЋg4Љ.iЖбз+Ђ^а„šЯlЋћ_Йf@/uјЭнЏŸ‹ѕŸnŸЭ&њК„@ŸЬRgnєL7~sў”€>й?_Ÿы7Ъ)ДОKЏW\­Џ„>%Ё1uqє 7ѕЉкZ‚BЯjЅДNї›п…ц7уh€€mэЩ-ZСЫ№Ё3˜-є AƒfїsДцуMu13ЬbЦvЭˆ&wurzкЭцЕ\‡StВЅЖЇщэ~Ти йецђjСQhл\bƒЈ 4B @gЛеjТСcѓ­ТпшŒhхFŸ 3Tcц"vЈ єЄFаЊ˜ЈБЮщ6Z•CЛе–ЫuВЬŽжеhїЉђцu :ПYM AtаEшƒРѕ@+MпОЩKЉd…lъxt!1dл"œm(‰5еXМшr[‚TћПgoНМѓ_ ­це#аѕдг{ŸnЕк ZЂ7hІбjУhR­Еmоšx+іЇЖкh…џз…ёдvбЪўя ш‰MЋ5—ybCfЛЃиЙўI% їижЎXВныЪKЂЛМЂЙьЬ`Ьы‰%‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘HўmiІ ЇЪkТв4Єš>S7ђT%šЦ yЎQ‹х5pј‰Њz‚М№АЃ•Лю27јч;ЖО?НїЅЇеЮг[н›4ћдштtЗЩ‡žjTбв~џБqЛпх=-ЧЭгУъ›…މfЮЎц1kЩЏЮ„ЮЊОН :ЬМі}™}а7 /:{l47:ЋњцGупь|WyЫЇ*Ла§АРЃЖ9њ6ЃfЫ‡ХаќъЙВ[lљЈуˆ™}П;бяяp0nVяяNє§~ч6п—к˜љн_ЃE#jX˜Y}дї!cЉF;дˆљkГЃѕhшр:XKVГЖIVTђ˜9еЏˆЦЫטЁК:ЊбхаžFѓЂЙдeбLjzeЕЊшљ3fmмd.5]>ЦмЋdtd}зG{vГk…5YдyЊџыа jGё}›ˆŠнДМhgэxДSЭ‹оu}ŽQѓаšьшн˜hнЭƒоСшЕъ=Е3 wК9НGЬ\шŽ­о‰EAдh˜mРyЖ‡Rn3zЯn=Кбхtєсp˜џьŸkЯh4`sЈСŽCбž•FПНyЬњі€NдLЁgѕлллKЂп’ЭД9aтf’Э‹~Гб­ФV>4ЈВ п˜аof“' bVJ •^Bkїк~%чЙG‡ Ј`…Нь ЭаŽЛшŽЭ…F;N1адНчBућƒђрO4^>цŸC^Зo{Я,4Ёц1ЯKДDеЫ€њ<шН …9YQnœ/мМ4MžЬ+дѓ GUДБ0rИNqАуЗ}4bщќh<е<ЃGœЙ,‚^рЇшаЁ1шЅЌН!Я‘hХˆ†uѓЂеќ]‰жы†ЁЭ‡Aш.щт^mш2ЃyдІ.7zЭGU(šXhYЬX'пЦќjЃжэZЅ*€Z rЬ/‰po­^ДЮЫЁAєєАp˜C>|ѕ1NtXrЃэ1фф№”G“Ÿ%бЮuhyМš^Ч…#B“ырч‰i!hF3Йаќ+юшвіС~| єєТрѓoЯc‹л‡N>4—йѕхуDЂЏъŠ€N>uєЩО:аД:?њDЃЏW[ аИšM< Qѕ‰F_ЏˆЂ15Їшл,?(~в€ж',…ђЂп›'бз%$кЈuЬі#хГІЦбЦјГ•ŸЪюcнНїЯ4й%яqЄZЙў бщЪj єœDг›Zц-Ѓе†бд[Б;Г]3ўVЮlН‡л|Ю1дгсM› 4~b[т.4nГdыb­‚ђfУ{з—Doyџ:ђŠf‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰$&Э’Ї*І1BŸ­уCcЂђ\5Ђ‘VbЁx9QosG[C ˜UD“ъ†8 НкВ!ђ@ТŽV5ЛМЪwОŽйщкк\<=ЊcŽьєRiCdє3G7oЏb†ї–[u 9<Зќъ`KјШьъ[wхЋ‘b^ŸМъоЬПЋѓЊ;t†Зb‡ЮІОхDgRw•нh…Гѓ]чэ–M}аŽ(эVчC•ёeпћ(”з8ЭдSсћ4ћб˜њ~ŸKs›Ївї;І†шI=џэFwчвьшћ вшЗk =§š єRp,Юm6Т€Ж‹цFУMЂ:яћm&<мўЯmfUЃѕ:<›AЏ*U Эзh/šO]ЭІ~E4^<:Џњю її=уцЇГ)2š,я0cЗlЈІЭЙбф—F;+2ЁГ”џЗЁYдtѕ}›˜ŠэДjш}$КŸ—W­•лэ€YХЉї{C ‹ВЃwCДFЇЃЊœшˆf^­žчQ…ЙаЛU{ŸŒо[ш‰Э‚ж яіzЂб}vˆ:­LєžНЯƒV0к€sЁ•‹lЃ]ŒG4`ГЁ•ƒЌЃsЬ'єТцэtњ‡ЊіЁпоаoюЭ‘§–n~{s›ЩэС!dйœ­&:­ђЂ“еo“жo8ZЁhc ReFПБЁ–Ьл„VF ГВШ`Сƒ§С$ZСf8а{{ в-œЅжз† [vєо…6?ƒsм?сLvZПх•G[bїіXЌAшЖZ4ш­Ж™:=їі} 2ўвќWЃцi МpƒЯж[‹™MѕЌЗ-SЈFtюd4YћƒС}ЪУЮ„>AбЖкœ– ­h)ŽЧМhняКБG ‹qЁ‡‘ŒhPv кqЮQ…но`нœhт.НьП б'ГЫѕ‚ФBšrZXƒаWœCŠFжѕŒЪˆYŠ@+їЈœшЗЉѓ9ЊВљhь!bjItШB/ˆжЦаГУЎПкCNjA4a#бA=(&?ИУЫeFг8ђxДkщЏƒбняzBSъљїа‰•эУ'ЗšгLЉO„нОГЙ…ŸNГY94Mи€GcЂ“G}ZаЖтЊЎєxR§zh~Б>hХuH№јlf€юR<нзШVГз‡О^5††ђLш3ЬЩŒn>šjkМVэ˜эзрW +бУ>}ьБWЅНw7ф+бyШКК[|Ф™шЌп$-ДЉЮ†VšЙџTЁбzNжŒвd }КjФіU€{хфF4ыћу„юу œ_ŒЂ_рQ€ЮjЖvД•ыuЭсQйЌ(ГвЗIxŠю&t駆і^I4ЁЦбоі2jЂбNД*ˆVј‰@Ћrцi­Дч’T9ѓДX€кcюK•2ptсјбž-]і1i~гЊ‹_ЃЮЇ3‚>ыC*šЧM­Ьh­ЖЏЊQ‹мпBNрn‹}шршzфA=ўAШqKш)єіРблPSџeaУh“ф{nнл,ZЛК;Бe4і_&‡6+ћП.Œ‡Зљ6œcЈЇУ›МI/баисЭ‰•бjьD-˜3люЉ#/Щ~Itйџ.И—K$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‘iЦ„ЏF}ВMc†€шO‚бooo|цЕhfQ{аЈyAЧдлBЖ:'њpшўwАЩ*h{іa(ЅЁЙЬъMяШB1Эњ ƒ2їj­HKцAя)єСКEkL­ДІšЇе4к‹Ђщa6Кsѓ›ЁnmЧ дѕO8Ÿ9 }ињуі„Ъ†> фУЁћљѓешn’v~bиЬ БBГэvšЇ)кЃщ h Ь†z>‰ —)zЋaИбрЩQ ѓœЂšСŒ&Ш:>eЭ*ƒЖ– 9Nсx64Й zЩcVAцEЖђœ=’­UЭц‰^5­чђЃ•V5/šЯ­W I б5™AЎЖ8z!XŸv9дМфѕыжDЧЎ[гМzё”ы-ˆ6nцФмKр2{жВm$: eаШjjp M/ВR.'zљiё`є№ъа”ћДќђ<БД}јфTГšѕi r›Ь”›mNКк^мh~ѓ:4ўE|ѓ.‚Жњ†\ЦŒоDЇmƒ>ЩЖа'­#ЎWuН:ЭІ:;њ|>{ ­и‹nЋ”BOП7яiœЬм'Џˆƒає~R=ЛѓЈЯчuhэm@vzNДZV@+кRЛmЁs™MДуsЙЃhEЊГЁ•fж:Zuhь}H ѓ‰!AŸfАѕ.\v‡Bе™ЭЃ!LhЃЇ!шќ^эmhЕњdG? g”ми­#*Ev†ТЭJп%ыдб‘ъ2oC^u™;ЧЄЖбЩ!ЅаЈ:н,fЦ6ЅsЃUЁЯ Х9аm%UШЌєЯФиУъ№DЋ'ZЙюuЬ šњ:bЂсИJцQnіpV/Юг?yъЉЛ?g і™ЃЁ }г‰Ž[B-чяЫž jkƒЈ =nŽ 5ККЋёН ѕйˆѕ>4дwyItнЦа•Ѕ0–z8МхF+ыП.ŒGMtU"]==mXЌ 4rИžЬЈЖŽзB…dг]Ѕђ’ш]л ‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$uг4нџ†XЇАЃѕ3 \н€дсЁ<­iЖЉ6бyN?S=жXЇЙvЫ5…6Э№ЪъƒƒбFз+™ч‡9ЂЗgЦ^hУД9ГГ‹ъхЬкпкOіuzй?2{mъЗbF—Q:‚б%дЁŠptѕПНr{P2ж˜oЗ[Eє;Š~ЗZш|ъ›§о&ќpt[йБ№ћUg :К+|ПпiŽsžьвжЬ†Э;=”Ь„žЩ}є§ўNЪЇ&№ШVдw-JSЃ2хEпЭф5ЗхяtSФqкœ­omїўЎаЃ.3ЛZЏ€VѕбFmђД*ЈvюŽe‰^†ИбЌj—YџŠ†6ФљNЌ…žй #{бœъРэБ šеhѕгМмђpѕЎŠљОB˜С}Z0NлкЗ=|h6ѕ:Д'…аDufєД ?Ў5šзЊmє№x^†­ЏЕяВКеЛqQ• ­Зv~ЖŸВВм<ЈЫŠоэР лRїћі^‹Y–O­‹ЛьDЃЛнУŠv›Sа˜šН+†оБн=|ц$Д­цA+‡7mШЙбФ‚ш™Эїщт&kшУ№8­і[ѓ[8њ€ЂкQ%кБк‚>шNDэ*Sgє|"@нЎb>L|€ЈAНlшem эизf­n™v5Гz3:ƒуАэ˜{ЕQfY7ЫiПтю}#ЮЃIsЋцйі&œs4а:гjѓ2œFѓ4лЌ‰ЃЕУl 5ђ gVz:U}E[ІажўрFДЩfB#У<Ѓmѕ|цHЈС&Г‚d]tDбJ;oаGB­](: Ык2ЂсzyбGjљLh“eеќhеѕw EЏ/|жПкЈяYК::fщКшШЅЋšуа1фЂhk:ЋькПОvРШ:hšGнкЕіъy/‰f4S‹wПбІЇeG?;яR“dj"ЇŒK+’MмсJЂMїщфZ§Hо”]ѓ2˜I4Њіm0mš ?)eЙЭk„ѓ”ЁžЧE њdGž)kаііpЂѓБ—Юg/кz#"шѓЙњ<Фн7$˜ЙO^u'žЬ!hzC)ˆnkfTŸa<[tTxv‡–­с3]F я†: &:Зйьѓи:Е^>Ћѓ“QtŠКˆ™TGšЫlQmЁ1ЕџJЪЂƒvЕГџн”Rd…Е7{бЭˆ:fG…Š™бm….ž—D‡мхC*™НhчКhцМАZцAфqm­œ.ъŠj{‡шЗПкŸл$ИЯ‚ю?тp>К93h5lzwmŸе†.№пa]цЃчсIбЯmg€šDƒнГЁœЇ–ž-є|t[т.ЫB+€оZ›ћLш3МQœцџЖБЁw!Ьќ_‹рЭmљЏHeŽ шљp5–/gb+lWЖœмОAдUГ@ЃЖЩј*ЪhиК`р€r™kЁс>ЕŽ˜ЖFІ ŸН„ЙбG(ћфіШNєђy_Дч~s4Ј)ЈЃЂ Љ!Ёш"ъPG0К„кН~ :П:˜Б]ЊXcnnбяяяsчЃtfЕKќ>љр8xœШ§–O}Лпяњ}ЮxРBгюЖj>tgnу/4х:i3ЊG3ТvКмшЙfєmAп§ўnЫ}Ъї%sЈѕднюhУuagpВъџШjж7‰Ekq;N˜GyNєн‹~W ;ŠЃ—~g3ЁqsEДa^ƒ.Њv™ЇЏ;NєTˆx'fQ‡ MЗ-іЂyеzeНу|ц]A4RGcjxzч2sŠQѓ}7Ійсh…Ѓ—T@ЯkЋX4ЂЮН;(ДВакйaŠЂаŒlзюАаJcf5ЯБа§2ld€ бhgаэб?Ь…†+s*ZяzѓДРєЇ wfб hыяеОЯдяUфij~4швbнСЅfёЖЖНУйаЫ}ЪXv`‡Ѓ'-Мdc—3ЁЧ@ЂїсЕь о™lД^ж&'ЁM6пmяЅб8­Уйаooo1К-бЎаЎѓЦ…юjН9Ш}˜ лМ )> є€АЗ‡>LD] }8„˜ц ЪeCwыыkPѓa9ІtЕ]р зы€Ÿb>`hЛз§ МиОѓ Е§ЌСі№ЄƒагЃŽЕгвбЦ\bќŒЛE4.'ЬcЗгcОqh]ю z_mЉf­/‘Н=tЂ­BЃїљбА‡<шьж1G[MЃ$киеlшƒбcФLЗZ!hM­Fј­W'Ь#ZщgfГ‰†jpЉ\wjЃ#yF?ЂъХHGл‚ ЗцФ+ЭІИбhоЏФCVј]™В­<ЃгйФ%бœъу+ЂЛ hчЪNWtПЈђ/Н(ƒGj—–#1’WBG^`vД{‹oН~ѕкцˆО зЙvЇy}"пДЏˆf4Ч^їњњ_ƒ>EЃ‰™Ќfd§ёмi7m&Їђš-їii#O,sM6?Zc4еыѕшfMmrK#SUyє }г‘oоюЗъMєPНZяИ}'lfЦ{аcы<>!б.2+њмЦЖоˆК+UD}>[jm†0gW/f]­Ь{yRчBŸAœ;tbhбCrЁ!;}ЄбZЇ3›к‹6оˆtNГ‰VЄšќВ‚ЋГЂ'6м›ZбhU­44ЊЦQЦаЙЭƒGъг0 ё Ы˜ЯЖРŒy=и‰bfиhN ДqПы­T/‹tйFьеэ†—\}ŠG—2у­Ž№v”yNjt7Ћ”xTяХ8tБ6#ъA+Но\tg,ъeљrs—kuДzСFhКуЪyЊr\Ў­šq˜ымаЪ‘шŠH3и7еёдVЩк=лфmTЌtєY#ŽЧкUhlДvѓи&КЯыЂ—џєДўѕ^еFgњЧЕёN,і_ тў3ŸuАžЪŸmЊх Ы %‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘ЌO3;QšUSWВ‘4Јz>дўБA{ƒЈ—#ѓЃmѕн@7к‘FO}Јі ]OнLвщЙfrЁЋ‘•Хp 7гgWŒѓ[iДгlЁ‘с[##ЛSVю3›&эw€'dа4r;цPt!Е›А]DmѓšэQD­-цr„ЃѓЋѕХЦПч§h jtЭсЏwћPcŸСrЋ€ю]c,ДqЫ§~ЯюŠЛЩ3N‘g0rFt_§юЯ6х8g“ѓЉяsмшw€ЦN!тlhPо`wЮN†ю;:нб†w,v† gqfЈЖhя#;1Н І9KЗWЁЛ§ЂАЃDЃ3mИ†љf 7улCЭј|ш3…&6uДyѓqїШЄ†›ZWя†ѓэ0hч2ѓЋяZMhЗZљбмbkKпчееn žЬ]ІЈИљО›В=Ѕ|Ѓ1ДЦV6й@яВ’m40khРV6yFЋъХjš-ДВа№фЮ(› =/уBьIЏŸBбУƒLшсUEv‡Љ&cšA1і]Э№§эqhkЇ0ЃwкšJэїћ4œœGнП†pMе›!{yПŸІk`F*sЭyщ}`Ё§LТаo•а§IєjГѕ4Pн –uЦgЖйDf4Z .rа–lŸ"цvњ€TXдэbЙаѓ:рчЃ ѓСОŽюР4+жЗš‰мЃї&К[Jћ™kУ<6V;Єз*-лš п,$ТT{ЬкpPŸk{ьУа&R{ж BN­DߘЃЅжаFпДЪ‹оƒ-ѕŠe†ш}n4Н=ЌV;]r{h6є!'кy;pэлЌЃе­цk&‹бЉЛуњ™CЧГЭ:{КZF4hˆлмЕг!же`&ГBЬ(ЂEЏ<ŽЈsЁ AњЈЗ› аєвёh`чЕwх4ПzB{зND3їК‡7ždAДWDч1+cЭЃзjГ#жz!ЊЃcRљъTEЧ]Ј #юџ4Гљ_ƒ>Nбht.ЗйœЦ6=MЭŽжф'ВЃ$Ю†№<цUhz{ишЁx^ГЕЌB„ДRеб']Ч<Eg nюЗˆ2пW6кšUT}> ээ›ЯчмъмХDЯ=ъєP,ЏzAыj^i*Д9;њ|Цакў 2+ˆю’нЦЉ^VК9/ZЃ• ­mьцY :†ЂеІа 6ZGŸ YSЃцS9ѓ Цб'hV>ѓЉ ЂOzPŸ†qЫs=ѓœТ^аІz:Њ№3њ…жiДУц8ЁЗКИйЉ&;­ЗКZ7iEГЩЬŠ€ДkїњдХЬXЋWЃЧзЇ Z…юjZE‡о@Ж…V<швyIДŸ‰/c^Ј/eйъеаc(й–ЭФї<ЧЗМ-„Rm˜lтЇЖBВЖKVєwЖэ’dЛdћ-gЈhѓQoом ЯHЋ §306Їё‹ЖyЈ(,Zmп<|бЎmH$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"yе4CАУ58i06<ДE<†^5фkQ5 Ђž40еˆOOэHгlH­15”нPЃ F(z#f+цiьЩЦШVчёб3#лiљЦЬжіР•uЌDsсn{]сшbjЇaІЂ ЉѕQ3uПЈІFWMA—PЃЋšfыЫFe5КjїЧЛudЩ{уL sЯ‚ 3Ш‹pПg%пqє;ˆ!ГNYз}я’‘мUПп]ф™ц8g‚ГЂЧђw“нi.{wЂчzљаsOюлDП“цw‹мЋs‰Д­FiЪVШЮШ$_:sзеэ}„Ё'№нœgƒмя+ан~QибЪhЏEcъqПхPпѕИЖ4нhэXBНм>›GpАлЧ ЮBжюЫЪЊй)Њ­VїеGgO/ц‚оЕ RЋ~ш3чGw™WЋбуЬіямhл<&='Гš2ш]?ШНЁYYъьшжиЪ$O#—I™еAя А—‡ѓ9ЛгЛЅp&tЗБ;v`ь,5Ші–žаУƒ,шIˆэ ­щшЅћ&щЭкВѓC­fjкh:/zЇ-л=кяЕŽk;m…ФНqёќjЋЭj?„TcтНšfk—ТŠо)уЕн Ќ&ЬзЌfFгр(єccѓЁ[7 mАљХ9эzGЇЃЉ5“б€Э†~ыB/ˆ рЯ t›~•З:шӘхСжб‡%куJhtжбЭy8иl}ІЮ‚ю №qїЬ6ч=zžГ”hХ†ЖЬњpДЭzPЇgXЙ=cŸ!њ -Њ§~єС6ZG– HЕNЭŠž)РмХ@лj}јžЪаj№.„шCZ;5зg3У•mВdЭЦоkъc:Žњ=O{bеЬ№;k4й<{‹Э•ЌAяГЂWHж Э‰V> Є(їPН”Ъ‚qL”сЁВŽ8иjn8:фѕ!ЁuіtKbМQ[/8h+ŽjьinєŒ' 1бКЭGАУпЌ^KЮiž_ЙLф™ЭŽюўЪfVєыЃћd1чV—@s_Bv0Ж!^5Ћ_cшЕѓъЃ#R3Ѕ6:ъ:ЁŽКЮзCѓ›1Т)Ь-~wžОI8аудќh~Cv”FOS5n.ГВ–эФ}-њ’ЕЧ$zXв{КЛа ш“–Ѓv=ш“2.ЙњdЄ;…М­HГ~ЩЙб GЏЗmЭ*дъns НьЯE‚юЋхeOfC=ПЏЈ]LіyЌvЮкыЖ%ˆкИ„ЃЯsrЂЛ ­FбЪ‰V:ЗйЅ~Д"еш‡>О=ђ›ѕdжб@­нђps-є‰BwуBб%Ь.єi4шхЙžiRсF/hS=VФmNF;б”ZG1+§~ч œ)eюдa6т8œSŠмjG&u9ГеъѕшiЯ—Dkъtсм@Ж‡V№N§2h•„ЎdžЉЫЃW0VР ѓї‚hъDmю’Жa3‚ЃŽo‡lтЈу[w!]л%+њ;л–Э~tqQHF˜ мДyŠE|ѓј= hŸћw D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"йXš>иСщqiQ@D­ВЎhi582<кМYдqœDЖPё э›j&ЈмŽXпКЋЭнК!cžFЦnŒЁЗЁv™ƒахе[юНЊъЦ3fЛЋаењЊЖy‹jdQы‚б…диКцьЦ\SЎkќ­?м€_Зiоп.эЄUЂŽЙE q\ˆ…{}Gбя0ОsЦ…Ћћ§žйм.pПcfЅpѕћЛЅ†щР™бї}7м=—НЛа}ЅNл|WЖк”Н{ЯЈn‹м‹Ѓя>Дr Ё9ѓ†Еу_wњ}DЃ'ДНQрMб.sЅаУЕдAшnB:Г%“hќАя™еЫў++j{јбEдЫ= ˜UГл@ћBvЛВhАмЊ…Д 2ї#w˜9ZŽЋЗЌGЯSwЛмjлŒYl н‘ єaЁ&лžf 3š0Ы›d=ГЭiІ:Ќ8“FєAgŒч=Ь1Њ ­fE#нн" ‰Ј—ЇvЙОе9а‡щ ж=?xmэVДŸ˜>/еЈfE/^,G=6кP;ЦчhuкT›hз№†7 mАuГ{№\?:аqpї™@3Њ!кхАіuшXA›ш5Я–ж/0#кл= ёНW%:р%УCeqЉ•ў%†mНр(c€ј!ьс…aНч™/8шAЧ(6ЃY E+ббеœfhч›юfхЄЩЫ љ.#_ЋџhОМфІЮgЮŒ>–@s_C27К„8ˆQ—ƒ^7k3ш•УЫЁзŸиš8ёк”TsЁ3˜WЂ š)y\аlшю‡ч#бУдќf ~ъq/œІ–шS2zQBŸN3z§-ЏЄГ‹ O0G§rVЁvГŽ>спŒHtџњ@t^ѓlгбнСю˜жJ~tПіљ|AлoD}ю’}ƒœ•2ецћŠк”љ|ЮŒюў0{=яаеш"ц!g{‡ hхD+`.†Fе[G[[УR#Ÿљw‡ е№ž‡›_]ФьBїьўЏvм<з2н# ›ЯцњŒ:&3ыїiŠжє^O9Гў‰Hа‚SЪ: цE/8ЎўC([unNД2^p qФЮyЦУ§Фjџт5ЏОExб3UlЙѓ йХК;:yaAѓ]FЦэСf,g~MДБїјKЂ…ШLшЉHѓzЮŠ9YФ‘шъъєЪKмzх№‚hњФ:sѕJєъ—&‡y%ŽОЪЂf M^Нz{dB›ŠгщфzКбн\86—йtŸ:5msЁћЉ5ЦТ'…nчiъRшг)нЭ:f2Ÿ–DмЇOЃyb—1CtпmHЂћ)з<уNбш“™Jцq‡ -q›s›jЅЮg пU‹:дœ=DWЋх!ЦФЃЙњŒ#VЂЯ…бИ{яfUИбАгJ“l}&бњ7 ŸЙфлp=1o }Bа”ЙШM ѕ—rЯ•3kїi’І­žЯ4Ћ3\=ZMч ’uM,К=[ж 9qІ8жV;њIЁЋЋ•ЃЁ$КЖкvЄКзўk˜чЖ ›щЗт–ЭkаЕЉ DG7,VЁшкJ#Фж}14vИ. Ѕл4К *лИйƒЎ! nл4™Ь ’%‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰фeг4ЕшІйє%4Э\˜ЫБІ™В ›­Ђ;фј`Щp@5[U/Ц…8§пІб=д@7АѕЫРm\EcЧ>aЊkFаф‰њьiхFoEэеxбХеккШ“ taЕЙДuж њj{mГщшАšjtmн ЗЕ=^ПЇз2л2W›•2/ЎZЉwЧUМЗЮ-4К%ЕhM­Œѓmю§*шЄt•†~ŸАеwuПcцwГ™ЪszPпя%ЬкdПЃ,їйЎXsŸR­Гппiі;qrЌV}ЧаІыьYєм˜›НЌтjfOS=cЈЗƒ~ябш‰*hƒЌFыnл ?е`ььhe б†іjЏЙњŽЃq5ў 48:Ѓz.Џ››нn‡4кЗу(t6ѕT§~пЭЫ+ЕыдшaшBон ЁЛ?wsTZKЕnx==ZІЛыY+Ѓh[=Эщ_ ifyДZg,ёnМ2шЖдp‚ŽоD+7ZСП єЂwЙбS}mЊыєRЕ)Ћй^0mМ1фи†œfmi\­|цЈИдЯlояї;§ѕ^VдОтQзЌдXažšm™‡ЈщXGЋeвГяЙЬіЪЃFЛwЬЁІюцз,šZз@ђwѓ9yz{0ЃпXAЭк•Эhmžв›m“—NъGјьlhх6 Г…юеЧуБЄкюГљгт†ё`Ђл#цOc#ъшУИuГI дЎ)б‹˜jэžaн7б‹1шlЅЉ}УѓЁїхTh Нгѕа>…Ž^5ZаыаРспeа/cqЛ’р+œдаўо—sJj ѕ]Š+ЧјPй‡œlu`6пшНф^1=TШ1OЗљбюЯ;жW Пš=РУЩСh§Ž“ JY‘Ьш bшЮV&Zo-ЁЙЬЧ|f Э—ŒhЃГ|.‡цлбƒК„™ =)CрMe"GЁУчlНђ7^9Мš–mТLЁ лкW&UЌО˜ТfMЖЦєюX…ЮgVњЗSПЭp3OeШ#|YЖMьЭЃZmšiš}ъS=Ќ‡юцiь2фбмБSаЇ }vv›| †IЇYл—PЗџ;ыhѓf0Њ§то\нх е <&бx4—BыjэщВ*m~uДв)Сцў­Pvshэ…Я\­ш‚Ц6R?ЏЄnщHєxŸ,h†7j } :ЅzuIВZІ ГЭЊ0rH™~mЖЙF^­fР+ЁU<КЖкAл&КC9ає‹P=цп„ІясЕС}жЁkkЇoкP˜tmЃblкŒЁ­у•‰HЈЭЛi4ј.‚нЈ™ЪKЂ‰W`ыyAВD"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$џю4ЊiS[сJгŒТ™йЬ‡Ж—Qе,7VF[Ј_У†ь`SjНѓўДv#дё-ЋёЃQ/ЋЃЇЙЌŽr|ш j}u фEW›ЋO4ЯЖдШъКйГCj|T x DяˆХ{MНв&ŒhДVЄ6кu Эћћ;Vˆ[’Rяє{?UГОЂЙйјy€ВF”Aпя$А!9=5ћо%?ЙE›ъw еї"ъmЈппmи„~ЧNNЙпЋЁMзћєкSч,tnЕ‰VЌЃѕhєЬа ЃНї7єD5Ді^ТhнMy:;ZС­ˆNїjЏyVчGыџ^ХоmСцeƒфПYknšнn‡ mq;Ўњ~п н?DOъўбnw/„ОЯцvнНУбШоиЭъЙBtћtz€žЇэšyn44яsШіЄKєV—BЋ(є4ЂЭыЩŠо чGк НЫŒVxЃ-ЕšЌѓу2ѕ.ЏYяАŽошщ=9LяX4ГxЇ­ы@л;кœZтЂŠЂНЛ#ьЊњA™РкЯY1eCш•—И єЪK,…vРЖaЦбm#fŒёŠhќJ\'ЪЃ-M[‡ЮiЖ$LяУЬfШ>œ27К\ зUNДумщTн-юІwёhюзŽ@Ÿ&єЉ|ŸЧЌFk“Г‹g6\Ж=„КŽ>)ƒVіВhЛQД9ЗЭЙкVcшjfЎР[JWЛ­ЊЂЁлХD‡"ч‚ш3ђBЛдШШ]вЌЮГкмтЁцўЎSяŽh5  šСІЖn&Ш;‘htёЄЂk˜шSаЉ:™WwЩ6f@+ђ\-ѓz1Д mн™<В-ЂЧа4тЬд/‰Іе6П&šРЧkcчЂk3ѕнЈv Б ^MmЎЋЃЂя §шfбD^­^бЌzvm‚D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$IБ4ЭђЈKM‹/ЭуPM•'ЖPЛˆ-йЁЪ@7DjQЕ$ЪМA5~t‹je{фšlИОЭё ЋЈ €ўД @WP[ы# 'З‚эšеХЁыx‡‹їo^`ЇaКfkW#удЗЄwњ]iМЌ5wq эSюEЬї;a†(дŒЈяmЪ MѕЛœдЭЅдАЃ&ы]ihуфћFбƒl@ЃЇ,tЕЖwmXGыЦ!цZшћн~wБбљекћЂѕŸ$~t9uЃЃБMаЋЬUдŠxЛ›ЫЁсh^}Пя†€Fяа;ЈюІ/фьшйМл юZhЛЫУ…6ѓ”.…дїн>›WC%ZєXЌ4zGЃ‘э1ЁчРVB+ˆ6е6zœЂцЩm_spГžдJGƒщГz—Нƒ‹юh5уЕ‚EШц–v ЕFлшОl1ГЉіьщ™œb“ŒюъyOЌ@чtkЋьїKЋїћюйЁ ПєМ?u˜ъ%ђЊ5ё5=ЖШ є\юq,,Ymp@є;ќ6­lДljYoє;TOнъ§ю-ћЭeЖvЧЈG<ш§лл[є›­ЄбУ§ˆ=СPчE@PєјФ8Є жІъ hм<ЎЋ™Ї+8XG­йъ=зž4šzсЭœe”†жЭ Њ3ЂКя˜2ЭJГ)…Nыfl5Б7h34’ъУиџМhмЌŽˆвjjїТNu&єМŽіƒбЧ@ZшђKяІКЄйLFГŸЎ9бN€СV†к3ЃкT{Э%а+ Ћб‡jhM`ў7 ЙЭшEЁДнсž­ŒB…ьh§…Щ„V^Хq:ЋІ’Ъ†Л”B,QШ Їза№Т CC5Пy„›CбЧ2ш0KЋXJ не‹:zE/ƒбЧЬш5Њpє1+z•*ммЋ3™-ДВДЮXёђoЭgnе…Ь>єЊWЂ кМ Ђюыf›†t€Z џ§Ё:Ќ‡kAГ}"fmѕ*еšз%Ѓйкд.зЊЭДДћŠŠЂ•ЙKБГyЇ~ Д‚я/'lЗ;рsyбѓ€’ш“э<{:Эш’цэОчбgOm šСЊ'еў/Њг§d5Р ˜GЩ d5z˜6 ‹E#“lE ЇI…бКX›GѓjБ‡ghs^9ВЎVдq7zЃhL­ЁUaД2ЬЇй„щp@—މžCЁ­T@ЯжXt Гšз65nє„uЁЎCІб@FŸЉ–•h№ЌžyўppДsƒhхEчЊЂ‡М$šRгЇjƒЛhцИœъљЁЩлamю Зe3­л09]i…иеNБі1<\—цЪ„г[WуyItёsK$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘H$‰D"‘HўciњдVЌLГ}Ехk оЈп25XъиЌŒ‹„š7І6E„y{lьиІдШлЌ}иќ{wЛІЈЎ `KаК”Оџ+E>’>ьн’xf­gNЗ—­ъ=?\ŽW˜TŒ›їХ‹ш"х™Й[мХж<—˜яьфхn"=2x‚вЭїfЙ^6Ї9КBЭїd_X–Ы-PНlюжЃ‡К•{-им5н"%> +ћ3=зќДpzєŸшšsRз?šKІошˆиŸ?NŠЋ›ЙЈ›ЫцшхXв\ њ™U5suІ9­ўsZuн,КЦъ\sR§чМъј]” ы†ЉЮ•˜ъdЂГбнкk>Ѓњ~ К[лŸ{+žQDgСыЙп/Кйo^]ЅЂ_WћљљЙЏ|W§чUќ0м@џј@tЪањsnєу ??cєд|0zxŽ{єt'TOЩ‚ŸРnєЯLТ So^n’шљќ9:{;ЈnіЂ‡ь&‰žЯŸ№ŒтxЮrеMК>rЏЮєЄЇ$gŽDЇЇLwVѓNu§:cйќщЅБМкftfuЌ:%њz Іњњді^oУ‡vдЗx’ЯV=vЦА№„iЮЃъ>u~Šс9/—Яt?ž9ИX"h?№ІМЉzѕьGѓЇЂ/—#ЭAѕœПW§ˆО|ЂљrДљ•8ќюкЉўLєВђЏЃsї№сш64я˜6ћњƒ›ХйŸŒЮ7їзЂЧ6ГwqvѓйшљЙлдЕ gu3:9ѓБџЃеСS/ЊŸбQ\Єбэ бmЖyŠ:Ус~ћvЫuЯеŸkžLЯ/DПЕarМ1эx}№тќЉњSбsrєЭтЭѓЩмЇ/HцыЧ“ъEч›oЏILгшмзcЧеŸ‰о HЊгшS>НА=е{ч|<њPuН{Ц‡ЂпIhліН‰~V—‰Mt§я›еo54ѕEЏFLQѓюбŒndм^ƒЭјѓяЖw№gЃУЗжzЦ`ŽоV$z~ХдќEѕ'Ђ›)њHЬбшл9бЧZŽWпNˆ>XвWП5йjnтцЄубЗGЧU{б›_еgEяTnО}АЙYў{хEп>gОЕ}Vѓ^є[7uNѓшwЊ?нФWйя8ћЩф0"Й…ЕžКЂЭє‘шл‰бџ`MOOјбцЗЂїЇy:тГбMю’л<&žнlWэ GбnnтЩљВшјВЭ‡Ѓ?омЬЙ;Y5EЩџр7гс ЮlўяSнŒ/иЩбПY§ћ№zЊS‹џQєi†‹іў]Я^oў=Пљ1ПГўёJs>z:Г\єoГ–O,—§кјŠш&ИікЩЎŽЂбM}ДњЗ’шп :ŽoТи*Ђ›hЂчІм”п~—бEš“шЩZtЊLt“ЮUзгм з^nжЃK5їН™ш lu ИЃбёЄвЖцSєПt0:)элЃ›шWЉ•шТЙƒ|gДQ_tšŸіњšУ_TїЂK—†ŽD—n\Ъ,уpw…ХOг\ЦѓZучTКОТ}T:ф їTщ Э5uЏеdЃЋЉ^ЩЮGЏž"о‰.[НWQarГIЃъ‹^†Ь[їЬ!ѓ`Йіхє…]с Є7WpЦбйщ .N,н| :{ЇEЃЛ$9z“ОŽШ-ёЂб]з%)itзeп–'gšчъЕЛътWуфш{њйаucгыЯАzкŸ­ўsbtќвwБhdЦЂшГЊџDЏюЂkЊЮ4/ЊџœUG7‹Ў>эyр2yQ§чЌъ?QѓwDџ9§hЫ'ЇеЮЊО‰^лŸYдЇTЧЭ™7лЋњPѓ+њдъfх#b}ІгцѓЂƒ_лжšы‹>0бkб‹п?ЮŠVЧ§эшєw’“ЂћOМŸ‡ЙљччPєуАЬгR§ѓ36џ<іб?;бЯCž'eГ?нмЗŽЭЁХ:ˆыЧГ‚ѓцgќ|єѓВбХWЂЧъ8::ч”шшjЧfz^аЙ—gxІSšћЋЅ—пŒ^kЮ/ѓЯEoNu>:гќщьХЕЦGзыуЖнˆnлёАГЋцШk0qзЇЖзЬŸSt;ъ Rƒ­ЫхSЭ—ЫX8jІэ1,:!‰n‡cгgщЃ?U§xцkЂбуDЯsžD/]>ižD§œнІoѓTŸнFбуЃdЯVѕЃгЪќDБ‹]Ы3ТъO7ЗЁ`GГнЬ7‹Г_>нІоˆNOm>==љЂљyэEпдW/Oќhѕ8Эйы7s]ќ>Lv/OlІ%rvtDOЅѓрАџvЛeУ?=_)њОыц–щŒя*ѓщIіЇЂѓЭЗ>(ЪLЃл\tR§Ёш|ђ}K#“E§~ьАњУб‹k7ЩФЕэbщg›чs>}4 ;е{ч”ŠŽЊ“шнS>єУх‚ПˆnwўЪFA“‹>В:ŠF/ЋMє‰бGжЧЛ].њ•Ю§mїшbЫcЁЩ§мЎўLє”}ЈљэъЯF(y#њvJєЁ’ПЈўdєБцэъO57QѓNгЛечDЈ>иќщшwЊ7пnl~TЧбл%ЕDПгќNєэƒЭqє~HuбћI‡Ђ‡ƒ>н,ЎЖ={GЂŸ‡}ДЙ /vЄЇЊш#AGљИ7‚qjє‘ЄёёЮOЌо>ЖžoчЬw8Iџ9zzЎ3ЂƒќЭYЌgІуўЏˆŽњ7‹ŽEŸМ}ьгумy>ђVмo>й+њw;juшїЁDtЭџ}vёsž†ъѕьf5њїЗPєxнпеьЕцрф’ейь&§[ЌљШ\W=fЏGg–GSMєякњX~N7As™ш&ŒЮ/ХQ2К‰Ѓз?џ~гш2Э}n§ЛёГf<ЄprXo•nNЂГйCi=Э‹ш(?šоzš7Ђг%QQєzu<і=бMИUSєZu:VWtv:зЃ ЧNВ™ёж|C%C#ЧЂ›š’›щ‘&‰^ЌёКЬU_=‹#ПЃЙКїл1_ РпК—ј;ї—сqс˜Ѓю‰в=Ё$шT]=нунеvŽ.“‰Bцёp]бIЪДмЦŠšяйэѕцb鋆`уоWюЌ|ѓ=йб,.NЋ:z~З.Ю)л|oтf1”[с…ЃЛd­.њКвїшгэYє‡Œ­уп]3QІ:§lшКБzx4Vћ›рОfNŒfj. oК`OгtйъЭ}єВЙжuИЋщВеЇMu4OЙцю5ƒ+CqєYеё‹›+ыVo'­ўsNѕŸ?Ђе+ЭeЂгп%ђikћ—ЫуьъзЦ[б‹7тщеЭЪ'^ЭбMјф/ЃO[ѓDпƒшИru­Žоj^N—:):nОg›ЗЂЮ›щІљљљyEџќ­[л_sєъЭЄЫуьъзЦŽ>ЗzxјVtњщqњT7б&ъЌ5К™V/šWЃП‚œ=Ntм|ly4‹_іš3ЃЃ‰^4Ў–24џбЫЖёAЖ9јј99§чY§гkџKутњŸсРщФўдгЃŸ AѓJtЗˆО'žS§3џљ“X‰NšгГNШЏ•n“ш6Ž^4ŸP^+Нx;ˆЂЧ™иГК‡k\ЏбT_ћэЈ9˜щЙњuмlкМœ}Ні—oцыuH[ЗqtлGЗ:n|4њrЙ†šљсT6YD‚ш1Н](} 9˜№eєFѕЃ7ЏDЏWŸа7DБё2‰ї-O™žёcбыѓ:…5SkаOzђ œkRњУSоф—JT§сшƒЭбLЏW?FNˆЮ_ПIуЂУ6ВŸћ?ZнЯsіђMнфЂŸ_i›НнGЯ5‹яNšу7пгтЋчёFЯ/{мм Е+бmнdЊ?нLЭЩз[їAm:Зщ2Ш}ЯtќZ|*:г<Ю\™.§\ѓ|в›WЎпdЊгш|ѓчЇz§њйшИz%њ6^&zkЊзšЫE7йѕqhЂEoeчЎћЉ>z(xeЬw1llrNtДaџˆЈњУбЧR2ПjlVW§оT6њ`Iѓ^ѕ›Ч_Š5Ў>/z;ЉyЇњубaжnєБцчoЕŸeэUз=…ь5Н§щц zЗфhsEбsЯhnТЋэŠnЮ‹nŽDЈў|я=зПю:Љљшн}g5Яяœнш§Л:бСwGжЯщО2z'ъа;ЕЖlб'5gtЅoФџZ]Іљ;ЃwџPcѓnUбYыcПO››цїїЭшппђбkеЭJtЭЋSНŒюїдНќШ{}ЋЂљ§›ЏЬFїЧ— "жжCЎЙctГˆ.єЏи#~‡ъf'КtgфїUн/дЄ2мЊ`!‡ІБфsЄ Ћ+kžЊЧu~їQУ'F"Ў| їQХЧ\j^ Пcѓя4RС/H+‚ШјuВYЉЏŒn’Ъ/Ž.tHZљ Э‹hнЃAЉ˜ЃТР{ЄXRV”tOіСEЯ)ѓƒh4uvрR2?XPQvœ1=МЃеЭuмЙК >ІћЮ t-:m>;z|077swЅбЫцўЏНх‘ўbrvtмœД­F'o‰“’Ї очъEуFtQї0zйЖž[,њчч'7ЏЭTэўљ nїўк:?њЇзќєэЙшБњg82>ёЬьўR+†Эkб‹цŸ)јЌърR?‰Ўk{бZwЇЅ'в\(НєЕ]nЏйиСх”цы5šДы`+zпхѕЄшЫ|љ&*~%?iŸЅП^§m›d_г[Н<|Дљ25?5сЦа6кІЎk>_nЎžв^ЕЙшѕьЯF_VЎКьЫFЏf4њhђjєZі›/iхZђГzeџc$}†ЯFoЭьсшф58)њиФnN‰о*iв{w№<ю„шќ;Ќi_ŸаkбЭкГyU6:љ&n2б§wУfO§hє ПитЛчЁхЬіc‹я?ž_ЅGЗ™цgE0Лaџ<ѓЫ/mžЋOhNП8њFІn9сm~Дyqљ&ГZ—е…Ђз.пdЊбйцѓЂWоd› $п<žTItZ],zeIOп,ОБ>жšOˆ^щ\єЁеQ.:)јЂшyВƒЭ`GБшёGKГ•оУчEя'е}0щР}Эеmž~эй-j*Œо­nіЋ›љНzVєNгышƒбnž.Д“t 9јTќxtT§Чшјр“ЂїBфž}Єg/zњЧхбЛЭ=ŸцŒшqrіƒEŸdї]x<њДцЙ§1КОdбѕDљэЕЖъ#яд"DWа\ыšўЏбEšџыЇ^•бЛ/5Vяџ+ЁТъэс‚б›џL\њ-лм4ПoGџ>•^­^‹ЎЁyuB—ЏcЋhžЇ:ЉЬE?Џ yŽNЇ6.нY‹^Ь|M~ЇЄЭшв™Бп9)кzЃo­Љ(ЉЌЗљaњ@H+kŽž=ћ~чŸПП_амLЭcєЋКŠЯцuqєыmZЧЯ“-qѓА]Ач˜$КљŠшХм~Cs_]:сo|e4ќКП”ЮXБRwЏКz'КЊі)e­ЊОъ dT“„,’Т5UпDїЛ*Šf:-ЪЬmбё.‹–есЫRktзХеёуBЭ‹ЅкыКс€ЎЗ]Єzюк^Ё]=5СУІШЪЎ=—M™qt88. {ъљк]VПЂѓТeѕeбЊя{бнft‘ЉОˆ^kо‹Їџ–\яОК>Ж›ƒП/Œ>ЛК >ІћЮ&ј˜[‹N›ЯЋ':jžГЯєŸГЃУ‰{›УбЏѓO‹nЭM“TЎF7бOУ2?‡ъДyЙcšщ“+зЃ—‰ЭИZ–w3Ÿ\,њчЇћЩ,†І‰зјЫуи№~я?eЂžšцљgvІЇъŸŸсащФЫхёП{ћk].QsЯ|аќsП?{_бЇЭѕѓz}єхчђ3Л^л^§кuНўЬЗї8Ћ?ѓ=мЩ)б—ўЏўТSѓVєu:nИеЫeˆО|~‰6БЃ_ЯљбшfЕ9m\]гЩэМžѓУб+1MšmF‡=ДŽ~]$?бсHzдsЛџšеЄњМшўš‹я3CЗ6E‡п<п№чsгфсћŒчŒц6ѓMгб„8:§ош1:zе—‹ш–Q*zxЕ“ТeuЎљŒшќх›ХLW^ИЩMu“Vg›Ч“ЯWŠ^Tзъ#ЭХЂoу‡X}ЈљДшlAцНxxЂ?Нјa$чі˜щWtгЌ6D3шЈsЂoџ<њУЭЏп{šе‡Ђ›“Ђ›ЃбG^з'хч››лБъCїеŒŸНг4Л}Ш9Эѓф|SєѓBaџп6w~Nss iПx:ъмш бЗЃЧєџюљ4п}ЎџЇб'/}>бЕDњ…ЉВшcПх‰ўяеG~уЎ.zM‰ўП1•i^VНѓ1XЈyYнll}KєЮПDџГш*›сёF=mџўnŽв’шЄzмЎ 9HkіЂ›џ;ЧžьD/зGщЬФ+xm9TџЯ7‹ЭJЅ•паМœкoˆ^Lэ74/Іі;ЂЧЬпhЋђцgцягkыїДџХѓj~TAѓcvуц/ёЭ№oм67†Я7ДЌWн'чEmš[Qгц§^Wі\’&•СTGaQб=šо~Ј–Й^/J‹Ѓƒ‹ 2„НKЋk‹О/ЃЛЎ‹ЃЃЧ5DЯКю5дНфnы|Ўœм;G?кцGIєммAb‰ц)z"_у]—dЯšžŸžКІФз]g§ЅЂчKw ЙшxвЫTЯWЮЇ­%ЯечєќышеAєJѕNѓјX>:\ЧЋS}/V=^-ŠюїdњзЂЯ~/=EOƒ‡ЃЫќ„I~ Œ6ЃЛЙЙHt0бЭ\ЙЕ–ŒnЂШ&йNЃKšEZ4іуѓМgЂЯџйF_КюВR6L{р2ў6,ье—ЫхЇi~въyБє~^ТŸЮn~\ђ>\їgQN~д| –;Fї†žŸыѕкЖЩќ>ЕэcdJО,œдќКT}эЃЧьfNюЃЏ}ѓЯЯВљЬшЫ} ДЏъЖmšщс}Н6§ŸAэАqFёуџњЋџ4ЙцWm3DТƒ†Wg~|Nts Ї.žцщИЖ]ЭŽœQ§˜йІY\Йzеegz_Љўxt<УM0ЧЁeєж|ŸбМœцЅ•ш|і9бЙЪƒбёаyб‡fv5К‰=!z%9гx0КЮGЏ•ьэШНžєУбOЧ&z=КMЃл ~Јzј1И§иьПg5ЎnЮ‹~Ѕ_F/o­ Oh†тіїFХk ‹—#ЙЩл|Ю)бЗД9ŽЮЭttZ№eШЇD/чyќŠюd9,Ћo9ЅЂЫcЉ'КЩ\}%:­ЮFпЪ-ЬњXLuОЙdєѕБо\dMп^ŸiєЁебœљШ‹gmMСеБ:еыœшІПШПjnnчDїў]єэДце‡юЋЉ-њ@uџ<ч5я'КЏГЃwšеˆоЮо:тЕ8тфцYм~%ЦьЪ&z?њV[єЁМ“ƒwš}NєщЩџ К@ѓџг™§ЂќJU]ѕ‘пEџ‹шнхQЄywЊЋl^TЧ;О#zy56/ЋуЭџ…шpЛ`ѓVжftЩцЭшзЁhsК6Ѓч…›{ЧЃћ]ЅscPНx!Њ’§яIЙэ*}etњQќЭ‹Ъoh^.œЕ#™кЏhN3‡’E‹ŽHЂЯџЯцхіћ0<ўн<В*П_д p–ћ§О>в;5чеЊћьфЄucЬ"jЬ r+ЉОGiїХH<ЫULіД|§ГЩЌ‘ћ"z*ъК.ЎcaпЗЃгъъЂяЙшИЛжшGх8жMюЉўдТбSXŸИŒFƒѕ]4zъ 3бСp]бнftЗŒ.•DЯВЭЩяЃ UчšwЂЛyU—‹^™щцсSЛ‚шЙЕцш{=ьэGZat:v КЬчЧмлххљрчa3њyРиy •iю=›Ўэ=їЖЯЧјђЌ“Ћ/схњшkн.Ђл>њкGџ,rO‹žEяjћъіqPл‡шыЕiž‹"–ЭзgюыУЃХ‡ЬЗњКя“Ђ›qъЎЉGсxLЛZ=iњ[8ЇxŠNЋчЪ$z5ћЌъчЋšTЗ ‹ш­јSЂƒЉ~V™iu>КЯnЮŽ^™куббаyб{%лбM44,ЗOGяOпёшз3~>њXѓіђh‚‡gЩ…ьоEvьФшeЯrW.КџЎиh№Ьш&ˆx}iэ"y5zќ’лјр“ƒ_ ЏŒ*ЖЃЇY?Ѕz‘<|Gї;3}›ОТљЄ™^iО%лбГѓ–Ч-SНˆ^VзН?еЙц“Ђ——_‹NЋГбЃŠE/зЧrЊ F/—G№JGбGšoч4ЏGПК3ояй8у”шGuГк№Ж3”џЋцц&њ”ъчѓ|cє‰ЭћеGnЋЉ.zїАзјЉб;н›œМ”Fo0ŒTиМѕ:DЗ&њя›ћ ›џ'ЃЋl§=еп=їбEšїЊW†›ЏŒ.лќwб…›wВП#:йоџuЛ‚ъх]TкМЈўњшєšВ?VBqѕЁшвЩIєvѓkOщрЇЗЂЯџ/ыцљ‹Ѓ›EtEц ЬrЈЖzВ]:mнb AѓъL—юк–d~EsњSЏшk|C§О2:є•бПЅј€{ЏtХЊ|к}vvаЎЕЊ:{‡Ђeк=жя*а—1эDO{ 4ІІЄtt]2гM-+%(JƒКЇИКŽЗу}/:ЎЎ.њѕзcMŒКIЅбУњ}Nc]—dЯѕ‹›fšоОче7u]’LzСф!zЌътъ4:\*%››Йy–KNWJбъешецђ фž‹юГwЃЫU'бClѓMбсШ—D'CuGЩнђqАvтъђЭMм™ЏЮ.ЃѓMЋ#ЬF{jјХ4ли,w=Ѓ/—iЂK.‘ћхђќы’[ЩZ~6?ЩхЂ‡цЫeН\cђГyz|~q,ŠŽƒЃЦёјšЏO™ш~џдœPAєuŠnлЧhл›ЂЏ}c|ЦљНSС5діБSѓЫ0ж4У”‰О ‹фGt;“‹ОŽs>œз?зiесЬ%Эш6nЧOp~єеiбIuŸ5.ЂѓёeЂеcfНV§ьnЪD/“’=бѓXS8:нГнDб…zпŒžЂВцкЂГсЛЫ%Щ.Н?ЏљшлэTŸм<$Э_iМО’цшЋšЯ›юeФЂ0=.i~UGŸняМ-Їz;њzjuј]ш‹ъЭш[йшќLgЇ:ќrњ“››фњЩlLѕmсМO\tn}ЄеЫцТбЭE]4КЩ]Q}ЄљvтWеgЏп SǘђзЮUЇU7o:ѓgљњ\ПчФф/ўG фмцT][єЁЛ:;z/ћаQчGoіlQ ѕPѕцxНЭћЏC}ЭлбЅТЗЃ|&ж};ђ‘WaєОoŒ.бќЊ›‚б[н|aєpbЁцПЌNќЊшсФbЭ{ПСmD—kо§§b­ЙАwЃKїі’˜ЄАвшБ3оZ.Š{ЖЃЫ–тЂЭшТЅЁУб…;#kбMz 5‰ўёє‹#G7_]oѕztщВ-бћАљŠф•швQЛ‚Ю[бп›п2-щўПи”Ў9lњEф›ЂG_ w_ь”ˆ9$wЏ;:wПWš§ъЩЄнгфjвЧЂ$КыџKЊk™№8(Š~ИGе•,“tгшИК’ХЮbї\/нЄВъфЅяЧБЎ[Я.йЈxє”мїtљшщLyљшa.Л8КKŒ‡ЯšgљцtyWнŠ.WD‡C_-ІПЊх'ЏЎŽ&Љ.&‡sОЌŽHЙц1К‰›ћЫХнSAQtД’5E?Вƒ5|IЊУтK_}ЙЬбЅеk^1љшfŽО<НЮ(ўУќГˆŽжЦsјyфы„ћ=ш/КЎМЏqуxxЭзk6њБn ŽЏ њк{FЖСіehюГчŒО†ЏС60Œ5Эu˜ѓBбЯ„f‘М}ч|<эффyцвц!ЛЭT/ˆžч.nюГл#еЇFЯеЭМ(ТШ4z%ОLєuЊKЃWЊћђщќsЃчЄ|єъTGwtrѓ")нUetк”юXN.Н{qtSІљяЃчъТб™ц5]юЫmЧ€л-пМ|Сє™Г$м…‹ЃТЃŸЗ<ЯщбѓїrЇuлбЗљ”Гšчžљ•~3њVрS/YЙТ|ѕќэєСq'6пў"њEпЮžщ[№Bї{цЙ›Њ7’чє2буЂЇеGšЯ^\}YFчšч7ђrWOоbЭ^n бЗьЮ='6чћўІZє_uџEѕ7FŸмМxшЮŽощо?Ќ@№^u•Н‡ЂМ •5oŒЌо‰њОшлFпЖЃЫ5я|‹>­КЮцПЎ.§wйЅ›З?з*mољ0ЎГyя'ШџHtщро›бЅsGaJRXmsl;КtнŠ8БоцЈhkI­LlD7Е6ЧoНoˆ^Џ.Ж!ˆМХЅЫ6ЌF—лВ]Кk[RљХMђјм,sи7,ШК'›Ѓ25G,ыюїЊГsmїкgzhЛ/vЭеѕДг8F]нг=Ѓdы œХ^7 tнZvЩмо=Ž~f#ЏцчпЕUЯcrнW/В‹6ЧяДn5КЊъ\s6КІъЙvnюЂцn~CFэUDЂцD5б™фешЊушp$]|l—JŽWG<Д]&И—&ЏЏщyOб™u>^Љ.Wм буFиЌ/ЎєOёGкє KЂгъј•Ј@sйˆОєS}yЈ%КO Ѓ—ыЃ~xЮyО/ыOљљтIЎхKœTКЗw]|RМ\уФщјЂЏзынЭзkœP>њzЃCэ`Œ~f/O)} =C› К7Œ5Эu˜ѓвбзы"КЭGПš‡ьўЯыЩНQEвМœыХqгмŸU7AѓГ:šъЕъЭ§Eч…FІб+ѕEЂŸWЭfЎFПЪ›"б 'uIцfєыиk{nѓ2)нw К­ z{;ОПзшЩЭ‹ЂХžм…гћeбSuЭ;ыу|;Эй+]єп}xЂoЗ[йъўялђ6кѕ%нEіxSEЂƒЫŒО|/новsѕFєm/}лˆЮTп&эДТNŒ~НŸкљ;м_л›3} лЇGпЂ/žП%еЫш[ЦЙы#ˆвчЬDч‚У[>;:ŽŸКŸбЗтђбЗмО=Ї6gџЂњмшЭRmsІ:?џ•GП=еч7яEч)мМ5ВіAS(yГz: ћ’”Д7г{/У75­оŽкИЅzєїEoџЄ)зМ7—_НљуёЃK6(ЏДykBП2:?V:јigTйМѓ!QgѓЮTWкќД]ыDGіЂKїх­Џ•z›УшяXO[бЅлж­G—.лА]:lKљЭQe8йЅЛ6Ѕ‘_МhnЪўЧЄƒОafОa РџЖ{щ€їнŸJGМы~Џ8{-ьћЂяІЊіWIЎЈыюQw-еcШѓяЎKŸл№кЊЧŽWѓЂКyFзVДt/Mа§zиЅй…ZGїLєЌ[‰.\НHžЃЧq5еipнєбXEб™т^ЗTCu~aє’к&Љ.мФŽUнgчо|Э2:Ў.ел‹~ЫU,Ž-оŽkеe3iпrпќ‘]4tvYі=-і^žŠ–Nž%]зџБ:гЯбўиљД’+ћˆЂ“цxŽ Юљ%Е}IЂгэЂЭзыммvэи|НFгсeЃћЊыSнЂЏЯ#тsЪF_#Яв њizьМ“^Аz™|}efЋ_ЭCіыЯг‹чˆЁ)ˆnГбз…г›_— Ў?'Їбѓ )=НтCf™FЏд‰ОЮmIфZєт­yrtмњVєѓшЧœœœЉx'њ5zrs.zћ&вСЂ{6ЂЯn§бХš—‰љPWііДfoЌ|ѕЮRиn.U=^{uVWЃoЅЋг›8в|+XМЬGЃ__Ё^6КM6wЊoЃBбЗЁb­:}ЛЎЏ>эиОХЪFнVЂoYхЊујЉћ}л*.RН,XЋ8:оuрNoоъo‰ŽvэGhЮD5QQ•бЫюfQTaѓVджХr7šтАъЊї_ќЪVЦ‘ц§зЁІшcуuEя$gtСцъЏ‹ољ‰X4z#|cЈ|ѓг›“]:ЗЗіMЭ•GП9г%KC[ыЖжц­шj›ŸF—L\Е]2mC’ї нЄе_‘=rCœџбЩЪюК\uWSr˜ю чКlч,эыВ{›юђ[§%Ÿѕ6oЬgНЭННшR]›vЂKeэљЪш№?ƒФ{*Nn–епаœDEђг"Кd №QївсўT:т]]їUйныЯЁњKВЇшoЊю’ъТ9GtУLWЙ@жRњшч,їT—зM‚e]{u§=енWT}бцTнTѕЅЛ^;k{/vi`vgПDЪEЦКn?Клz‚.—#бUU_fkбЏб’‘‰ЫїE_.]ђЎзЫх:7_WЂЏIєѕr-’;\}є,~ЪFGЬ'е§№кŠЂлЙЙ? 8ЅрњШEЗm;?ЖIє5О…"вшЖ7ŽОЖкЙ2:̘(ЂЃгŽЖЊшfœмЖЩDеa~ёш&гМ]L|)Aц2z%9МЋѓƒ›•‰о.иUdЂ*lN–Уё‰.˜œDчВ*lnЂŽ\VМЏ†фјcyЏЙxьЈ &owu4ёЮ"СЉмВнК‘bЁЁCбЕ­–НшiуvћžшЩэжg—­М§Ш.[;:}›TXНм?m ІIЋ_oyeƒч†4i%З’‰*О%:ЮјЎЄ9ЎЮ #eWtмЕˆЮf—ЌmGgЊ ЖŽvзlе{Э™C •ЎeЛО2zљ)SиnsИГошНŠd&оZ•4?m&UкМЃўшLиw4oќl)”Е)пVwsцїЅ`oЁІО9:S](ш•шB5GU?­№?ц~/]№ОЎыО/ЛыЋП-ћ§eен—U?r›ЏZ н љЂъЎ Њ›зЉ>ЛЫU—ŽJЭ}сvP]нTGyЩЎioUеЫМtoЗ~r]—Я[й]…ЫхPtUе—^зЭэуШ”ћ.™И’ъ њЉhfфz§ОшЫ#zЬО^WЂ‡›NК–i.џђьюdЃ_‡\ЎСI…rЇыOšЉКFлЙљ:—^ GGЭCtћ0 ?Юбб)Х’›ЈКпhЏбa#ьМV§Šxt=;лй0:m_ћš№ 37Ђ_ћ‚‰/йм,’ЂшИ:3^ЦцD7ЋеХzЃЈї&КltО9ЛЄ+)^{юD—,nVп…Ыцf1VЮЪDЇУс]ЌЋš|ѓЦЧЩљЉ‘! ЛhзoфќЮœм[mу>JeЦEчVKI;бщE['лббјэVKtn"ƒэЈљЁlыl#К‰‚kŠоћm:l.='ДЗ6nšч‘zЂ‡ˆEгmMЙк(,|МyМ o"XПя9UE"#Ÿї1ЯШј7ѓWџ sш‚§ЏьџХўпе?џKїџјў?џыџ‰§_š_§?ўoт?rџћџўzлџЯ…ЕџГс1ољџќ?ФЏ§џёКџћ}лЇџў_#јB!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„Bhaнм”јwГ@є Wi‹k7 Dп,}Г@єRi‘=е<4a:I@чъgA—&ЙЖD3[Ђ!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„тwssSšрпб7|Ѕ1Ў-}stŽnдJ“ь-MNаЙ:W‹DЗ-МP4B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!нp•ЖИvГ@єTiS?zьŸ=6ež3šєЮ­7ч@_7љ=Ч ZлˆООv§`Fg`аkgДЭœ -ІПњЎ h њчAЎvB'7 pћ•wwvvzo“Г™ЭЧьjœЗЗIыќЭl“U[Ђ!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!єoыІ­4УЏОвЗnЄJ{œ’б‹P+ш%ЈUєдzўj =c5Щкдu“зS р<шыeЃЏЏ]џXаще)аЩезTкЋяš‰ЖЊh "ДM-Р­WоЙЈ3ˆ™кiЄ‡tЇgЭm&н|eшaжЅž-B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„~КnšJ+ќКY њ†ЋДХЕ›Ђoˆ>4•–њiаГgG_Й?‡FЗьtвБыДЮœ}-хђ­8;m6—@лрq4e6ЁэцєhвЌЅпU•G›Ь*њnhЃљњЖK0;ВKЁoˆОеЂэьRшлЂoџ…ш„ц`Д єДЯк•Нt4wЕ3:ЉYЫ&ЭЬэ­<ЕиŽ–Ўv@g0kўbvn1уаLkfs3;G›KЋ,нQп*–F!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„Bш'эІ­4УЏЂoИJ[œЛYžњ†шCSi™! ={Е=_6‰Ю:ыы!чЇG_ЧCЗь„жЖkЉ)рaж™Э“б9д к7‹ч‰Жš3ьjвЌЇпнЭm2ЋшЛКтhЃљњЖM4G›Э=КWпѕЙАKЁoˆОеЂэьRшлЂo>ДM=OДuж%аЗкgдѓAћьj й4š§мш”f-›$ѓь‚b­кŠ6Љ3 I? йsз)ƒІ.2O:7й=Й4Ывљ niB!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„Lнp}*­ВДx4Яž5ќ'@/c“Јцмшї]зM.Я Ь™сЂy шїя%ѓ$єШЮkvAыЭ9аŠи‰m0ьмfкlN&ХVКХœzƒЁmцВhš~wgUЇн ц[Х<ДХмФ‰gv1їшЛ™ ЬћnШ]}Л@є­ЖГnѓ|аf mc №Ѕшa^Z1K7=З RЭаIЬшў>ш4ц”h–№ћ-_Ды›y:Б;š{†:ЉY зš9vIГ-]oEg0“tƒ™йОƒЩgжЃ‰kчbцъбЖыцdЎбЬСLЃ3јЂЕD3[Ђ™Еьвя–hF!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„BЈn<‚ўC[iC77Šzі№=oіЭЭйє|е7jyеяЛЎл\žB˜3o4e–мYФƒy :гQЭ“а79а*й…­7ъмfкdNџІЎ1[шfsъQ›ФсшФj ZЗ™ЫЃіннЋ:%кlО•Фѓ@[ЬM‚йŽОIv1wьЛЁТhGГ'њІ њіVPпљŽ: л‚ОНеwюъЄhwГ„ЖЈЂїvRчFЫц:н§УЧЌ ]F=ДзЌgfшftџtГI=ђ.oДы'T`“ZovC'5ымz3Ч.hv@KO˜šЂ›ЬЬіmW.В M\<єи Ж\7#r‹fvГNAЋ’ŠnйЅ о-бŒB!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„тїAЊДЧЅ› п7Й_УUŠўо}S§žыњкх7Rљ7Šh^ZwљЂsoЪlCSцœhвl“цŒlНyОhƒйРжЁyv)Г­7ч@[ЬДСœm3Яm5kиftbЖƒ™BлЬyаГФОk*‰v3п*ц’hGѓа`v€—Eп.};›эkžкл,ЁЭьДhwѓ|аfэЦЮ‹–ЭaшЈf+Z1Ёуš—‰nй~hџ—bi4›КfЛЃћчИВ—‹N`BЛО™Їћv‹˜нащОЏ­ѓ6 ь2f7Дє'tBГ†m4sl=:­йŽ&žc1Г,?UзГuЯ0šѓЄ˜™Х\Ѓu?ЩdnЬо•1ГIfVЦмфэ*efЬЌ”!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„BшчэƒXiŽ[фJƒКЙQдйнЏп79_УХГп$4ŠНюШuNЅпˆ ъ7yмЙBЛЈoф>фžЖdnš†NЏ~­ˆаywіkвlSfAxжzГ7Zd'$ЬzЕЮœ m2kеZєMєknа”Yƒж›9uВлЕeЮ!шфГЖЭYЃ6š…YЇ0лцЌQ[амЌ“ЂѕfU}wчŽN0ъз.fQ}зфЌŽŽvиаMЗЗЗ’йЪNˆv›ѓэgЖБ ЃoЇЁcЋ]аЗЗaшTФл,ЁнFэm–бFu1є­mR'EЛЯ™@ЛЈѓЂs:ін#:Ўй†VЭs@ГДї+1ў&O4SбuВOy^шю9ЎъYЁ]п`’}П„v|/OѕK­і7Л}lJgЎsC‹ЯqD'3ЛЁх'•FkиFГУЗ]ЩџУ‚&Ÿc&F“nГЙSыШщСДкbnдLїs›Lhйэ§ь"d&Јž]Эwј“ЫЋ&˜ЫЁB!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„Ќ}zѓІДШžlў№&УєSЬнДg=яY _7Нч2_#$УѓаUГхДє Eёѕu§љ`њЅмlй|н˜чŒwЦЕ”;:'лlž'кbіB№7oRВmfZgЮЖš5l­љFм Iиš6Я­1{Ђev3…6™SЃЬлhО_Œ)Э>шЛ‚h—;‡ЪОы*Фі0п*ц’hѓэgЖАs нЬѓB;‰Др ЦaаЗ3Dлvє­mbЇFЛšч„v6{ЃМНŠŽhfО;šBый‰~xуmžкУ є$іЯŽfAшШfOtџ,?tlГzx–:КЙaЛЁХgЙЃS˜™у<щYЮш$ц*Дњ,7t*Г šx–:™Y 7š™§Лђдf3ZѓœЮЌџ‘obГn4+Щш”ж!ХЬМЬ2:ЁTŠUТЬ&šY s”–'ЎZЂ!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„аOг‡Б7MЅA}Z‚Z6їуžЕ\EїюŒˆз]яћ,з“ш~к™р2йЊЮq/ГKГхЈє‹:“™ѓ6fГњF.яЌ•н\плІWЬyељZЪЭБSЋх9ЧDЇR[Ш~шбTm›ГN­3Ышj;YЃжЂ3ЈCбzѓMњm- iВ/ZžuZГ­ЊцФhЇ9Sj3Кg'AПEпљ #Ћ]^„*ћЎЫ@эИЁ›noo%sIДЫœo‡8Г…эfDЧT;Нo…DД‘ш]б};CДmGпZаvrДЋyNhgГ:б§#:ž™yяh ­gшˆfцНЃg„і0Я§zhЦўh„ŽkіEїOѓCG6{Ђ‡Ї•E7l7Дј4wt|r­ж™Џ fWtВŸх9ЁеЇЙЁ™ѕjЃй іЇъ4§$;:Љ™V[Ь=šщ~t“MЛf9T믘™YQ'”Šёт  ˜9uрѓK˜ЃДtН*-ВїaшBoо,‚> єkЎїMцы?(х‡ЋцљЃёюќ1юМЄyЎhZ\№юŠЮз›kДюdzйœM™Џ…œЬ<5лnžZ5_+ЙЃѓА]ЬsC;™IЖнГs Эf­7чC[Ь к`NЮ–­3Я -яh­й-Гг mf}7Де\u{;ˆЛььФЯмЃяŠЂнЭЗCœйТ.О]њVHD›иiб>цЙ НЬ ZЯ.‡–ЭK@+ftЭN…іє<а~;šB›6H Дjž?š0Яэ>шPt4ѓ€vпб4ZЧNђб4ЭŠЃkЖяНЃ­,кя†7<ЯеЬќ>пёљ уš}ав3=а‘Эм­>ЯТь†&žчˆNb6Аf­GЇ2ГїЬ‚жД-H§І7 ъ™УGГтЮЩx-eОњУН:[№Оo2^џA)?ћ56ЪUtіiг`“њƒpŠ;сЮHBгъЄn јњњк„О‘Ы:mн”Џ[Ец`zХLЂSЉIђЕšsЇV“sОDпф™5AОVrGg™55gMЉ5hbж б2ЉжЁo’ЃнцLЁЕцNpW;’UДСœzжЎsіD+ГNc~m&ћЂхYBKъ;?tLЕ;ЙъіvЗйй)6ˆЧœksОЛsQ'B{o‡8Г™]}Л8є­ˆ6АГ ]Ц<ДЯœUД–шžїГЂeВКaЇE;Ю™Bkеща~›ƒD6H Дjž?š0Яэn&бušy=к}shаДšCG#ЁYq4ѓFїO\zxbQДЯ O|Њ:&ЙaПvEKO,‰fЬ­>бŸlR›Э‚:;ZЋЖ˜yЕ†\Ћ™eдкgD7иІЇнн5џ)„&еV3ЛыўK‘3 UwР :КnЊyTч3GъцІД  %šB!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„BЫъRi‘=ецЙ НЬшЄl/ГˆО›кjООНФMeаъ Эц}W­юhЃИk0[р2;ке<'ДГYBый‰6ˆ3њvш[#ZЧVпЬcЃнЭѓA{˜ 4Э.‰–ЭK@+fgtЂ›^y.h/3‰жoќhЪŽŽbи:4iж )ЖˆŽeAГЂћg. =<гЭь‰Ÿы‡ŽgіCKЯ-†nсnhъЙхакo­ff4ѓшШц*ДюЙno.ёЭЬс QћмЮќQcўЪмDЊИщ™wwŒ}Ќ"ЭRšuшП­fV™kДђcВЬЌџнфО?ёЮл4й,LМ1ГLE^kѓі Еш˜*K™M2зh–гŒB!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„šT‚“л“їF­4Щ!žН[kЮЏ~-ЅПв€Юы–Щ&ucћаWJMˆЋоПз\ў7Ћш

hBЭ,ƒuшБœїћ”5ш­ЈГ yъѕђ4™œuжІ9_{Ђo2ЁiђЕ’:ЯЌ5sVб ›Fg™Е3йMЯ:Ѕй­3гГNh6‘нб7iбфœufm0'ЕЯœ=аIgэ5чыылё™wwwГ@лц\Ёѕ]SДпœ+ѓmЧОыѓйеЩаqЧОуrŸu Г};GD–бZvЂ]эŒОбwЮшЃvEпšб6ё $6кpыИ+к}Юšd—D+fW4БЉsЁUГ3:ЭкM˜ч‚ійъ}кИЋгНЛјlŽтhА9th‚-ЁуУаЌ4šМ л…žЙДј\?t4В'Zzn1tыvCSO.…fњOxV33™td3cNhн“но\Ђ›5eОv0їш?RцЩЬu$Къo3Йa3іёЃШЌQџнe{ђЧ1ЬLУЭCЛG'з‘Sž‚ЎО”щяѕk1ѓхJЕш˜*KзЭЯtЇЁ+6ЫiF!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„Bh>%8O/•ЦИЖH4:[ $ГQ]кB!„B!„B!„B!„B!„B!„B!„B!„B!„BЁНбTкeJg.ƒ~­D]Ѕ5ЋцЙЃ БnFчЄыЭsEФœ?KМмn~?3ДбЪХЃљŠАЭKAПwB—`Лšч„v ь–zУŸ=o€ЯУЬs~ДЛЙ>Љ~|оRFЖ3њZ@Ћц›7Г@_+ѕЯњіP7х`ћ™ч6m Т|§­ЪŒжэьrц§­ кSмЁлєhš­3_[ЭхаZѓЕеœ|ƒј›{є]1ДЏљЖъ{г]Wў bОЬљб~цл!ЮьЩN‡Ж™чˆЖˆ4ЭNЖAœ}+Ёяf…Іwє­в]0;>ке<'ДГYASь’hЪ›Gl2Ёc™™`6Ѓ‰g+ц<шš§^‹ў{ШДgи)б.fњЃ:ЂЙЪСlD3іQˆFЧ5ыаOD‹Ÿ="›9ИFь‰nйќІтЭЭšџлХDfЎ3СўјБEЇї6цptzю˜?ZeЇ6*˜etbЁ&O3W93 6ГrfVГЫ§йС-бŒB!„ђьДkъ:Ћ*ЦЮКbШєFBЏєYє)Wј*ЋЎ3ЎxFЅ(hЪœ Н7фГТjEšg^FьБ‚NШž„6›so(ц UsJєqгоžџKбbNˆ>FлЬщаЧКfћ ­цtlНˆж™SЃ[vZkN„>Ž€ж›г #  цйЂMцЙЂцЬh‡чCыю.ЯTяг'C%аNЯTа' :‘™c3цe–>у­V'BщМMƒ™y™ЫЂkvџ+3“йЙбУЏМЬeбЁ§lшв4s#šБЅ˜gfK175b6ЂЫjыЬlIf„B!„B!„B!„B!„B!„B!„B!„B!„B!„ат’ЯOyњkЌtц2шзJдUZsИjž;škрftNИо€ЮТ6ˆ И :=лnцбтљч…ифзяпѓhGu!ѓ{.ЭU„эjжЁъќшїяаfэJцд2:ћЌ=ЬВњІЭъž‡™ёцJ}s“wƒИ›ыЃъ‡Їн(НЩ7kїA_sшoпTДqибзJšRххЬз•ілLбм~№Fыvv9sƒnг o’Ѓ=Х.шWК;іаКAзъ2hyDkЭЕ:щёЙmј 5ъdfљііі{л][]э;чллAmDпМвЬ:‘YOОэЩоГЮО5к,VаvВ]эŒОН•дwVЕю{‚hzsмЪннйеšYчB+f'Дц#бб•јмaЮ*šbgDЛЬyўhЪьŒ&иБбец8—бЄљЛŠVеyафŽ&бŒ@пЩпœЇBŸл6cсш›DhfE“fG4§ўM}ЗЂєlафЗX$К~т<аябlzКyTПwFЯЕЂпЈшf&™эo-мs%єЧ&3:ŠЙgыаыРќЃЂVаБЬL0+ш1њй2YPЇCзьpє@џHЈ“Ђх@d3šБBtDs•}Ю1аqЭŒšєп{˜%tУЎ˜:В™ƒыЬ!hўS qf,ЬЌ ы8t"ѓXšbЗшфо6Т„ў˜ž*цVйЉJцђh&И=ŸYŒЬ8Еї3Ы™YЭ.їgЗD3B!„B%;mŠАаjЕŠАŠSЇ}зYеБГО(6]ЇЇQдЋЖ3ЎXBЂгъеЊzЏ*`‰iЮ‰nѓYAcNˆ>Œ^щащиЇЇ$;@МPДlЮНAШЊyhеœ}мДЗчџRĘSющЮьЖ™“ЉЛ97P?ДнœJнЃ5gіCыЬЉбнАƒаZstПЃ—…>>žŽж“Ž‰6‘sяi‡'Зш“ІAЩџ:Zwїpz*wЫ;щС}‰бФЌНбrIЭŒ›5аnO?уЩ№dо}: ›Y;ZVgE362нч\7єБћœYYtpЫDѓюЅ ыF4[ ЙЊ"ЖS^КbЏZф‚Ш\‹D#„B!„B!„B!„B!„B!„B!„B!„B!„B!єЏL9—;щQЊqв›K _ЉWЬр”yоhRLТmш|l“yžhЃXлб9р.цэfNv2lщќѓBl?ѓ<а.оїнQй-њƒ|к|vЖЛy>hЋ”‹Gхgћ˜ч‚і2ПяŸU˜эeюбп$ѓЭLа*И>Њў[UeЎК‘ЪЩvєѕ€ўVэОЃЏє7‘эiž3Zp ЭэkžклlDзНЊ*‡ІЭѓFkЬVtzЖПљкjN0_2Ёiv:ѓkЃЙ4Zc~M›o›\аŒщищає o;єhОгšѓЃщ};д‰ЛHsЧNВA<}+ЁяŠЁЯ‡Ь;њVŠ3№~ѕD„DЋƒ–ЭюшД“nйэЏdДbvDг?9Kƒ–'­šЭhn§lші[WЃй€зOцЭ84eжЃЅѕ“ЁЧW`ПЃХk\аwwєњЉаЏ%єћˆhђЧ7аЏ%єћˆhњЇNqбНйŽfŠY‡N=щNь€ЎПЊЈ 6§гНщhю}p0_[аЬФЬЦLтOdј+ўў›0puэTfІ˜eєпš{H0ЬˆnйФЯОЊўЂŸ=˜‡–ƒўH šv8КяЃTj3:Њ1ћЂ›Ћ(єћїSа?І6Sh?Г :ВY€™­шbэЕЃ­шDfOМ ­hŠнУS‹Ћо3Т<žмчІиЉ•RfиHфmf2;ЅNS€™•67yxчгЭ!„BшЇiЏ)ЦJЋЊыиkЭЇVZeCWоЎiѓ^uqХSJ цihЪ}*$ў>”НZ‘цxьшUqДџНde@GbKшгЩhГ9ZЮm1ЯХlaћЂs™cЂmцДшууібяЅh5'FяMDгцдлЃљдŒж˜Г ї†Ўwѕ^ttЂ7ђ шб|’MУ§бœЙjiш“LhоЃ›мб'C-Rцч@wh‡чKц“Ю|’в,Б…\ž-™…в™™жьŠж™Oв™9іqZ+JcfѓМбЧЧЄй mgЇDЋц8шDfFx=а†WbBГэјь•qжYаa+”EЎPОF9є„5r›Ѓе*—ef­rYfЎх‰Y?s„B!„B!„B!„B!„B!„B!„B!„B!„B!SЩЯ}uVmQњk9ѕƒЙZ“h“9;œ$№9Ё fOt>ЖЩ,КаYи6Б vBЇg˘ЖЃ9ЕкбмЁ?ЬBэjюбsPЛpлsВ{єgwy3.ЋЖJЙxєPЕ}МѓCћ{ДЌЮЮіCЋbе?їІn6h\UпЃП}ЛЫЪvŸѓuўFЁ-ъ&Ђ™;ZU3NMАSЁђ­G&мУђЩб<;":эіhанЏ$4ЛU’аw4šўбYtѓыHf>hщHfњН„VЩsB›CЬ­[?zx§M@ыдЙая€цnЯ§Ž–дсhњЇN1б§цˆŠN=щь‚ЎОјуNN]ќ§ƒВxшaЪ*ZeзhEM г˜й№сt7ŸЄ…+ўf ЙЭ†Nfnем”лџ"šёУцБьщ„h&Ь™џо§ЭЇyvўи—Э&ЁћTtRsЅІбзAшЖЋдfЦˆчж?(‚ОJmеQа?&7Ћшї’йК‚:ВY€‡ЬйŽN!fќДєп~h•УЬс•;GztЇW5пl§э&дWЙЬm!hU}•X)чOVбItўh‰аІЭŸ, “ЙЌy‰чвЭ!„B(mЋЊ<в^[„•Vйа{BZЕqECЪээЖMCЏV)бЇ| :LНZ‘цxьSQЭџ&X­5чBЈѕƒŽХЖЂНсЋмшгщhГ99zdЧ3Яm3Gz)FEg™Г]Kа™цЌA‹hGЖеœнr' isbєщ4ДЦœэћqЯjŽЧІбЧЧџ.єЩЩIr4эіGs>91АуЁ u‡>nsFŸєe@ЋюЉшŽ­№Ѓ…ма''"Zy\ГЬі6+hyшIЬlк ™NЬЉу›yіqdt[3г™gЎxЄй mWЇDЋцЙЃщмžО*@жЃ]Ÿ_ДТ"бu\ъиd23Ј#:Х" uъxШT5Ъ…™YЋ\–ylyтК%šB!„B!„B!„B!„B!„B!„B!„B!„BЁe—чhЯИЅ?CеЏзJђдQЕeщЊYF›Ьљб„—€Эйс&ѓ\бF3ЧЖЃѓСmцљЁ­bю†Nw5Я эlіDЇdћ™чv7ПЏof>”gћ˜ч‚vдvЕшЖrh?sўVэсmњжєaшцІ;Шќ3Я ]NЯ‹ЏЏП нpНЊЪЩ6ŽYB_Яmо<њК‰FлйЏ^хB_sшы‰шˆf-њМъšH‡ЎйЙ6ˆЏyшѓsOГнn§6‰ЕЋЯ5hНй„fFєЋHшѓ&/Г]Џјъ oП–}ю„V­GПJŽnПЪў>DЁyЖZ<3f3EŸЉhŒNЫ>з {3ўЎE ч1 ьNLВoЋth~mйэ F‹цЎ!Ь#њNk–бёоЯЯiЖx•$цаw]„Y€G}+з ЅЋѓ­dОг˜iŽюSЏЬћŽKї'$јафlf’Й$šfыЎ…ž|зѓ@G›tф;Е } =еLЁпGD“ŸЊ ћŸдХ@їЛТш;+š6ЇЙ{И Tйаs1єt2Г[KlѕњЋЋtf4#аФКš2ЧњЩЭІ7I[6­zU5GtAsЧnТШЃMl[щЭlPОЬсш+ :ЂЙJўћ‰ЖПЋBVћј‘FЧ5гшПб5шШц&вџHЂSˆ™‚ў;§‘D'2ЕцЫЫєЧЎЋЎзЂЧkdёээ­ZUG{W_r•ŠN!f z”_^NF №$тБЫ)ш]":™uьВэяшЦL*&˜нбЧsBЅ\§й#`вЊ:™Pг”эбЊ“бЬ…м9šЊ_—2{Ѓ[vHк–hF!„аЯбЊ‰•–ИЗбБйЇmуяіИІ,м™ЯФ"ˆ™‚о“ŠlŽТ>‹†^­–†^qe@Ÿ*шuyt€z‰hГyžh‹9ZeG6Яm5gAЯЯХLЁewTsBt кСœіQЯKэŽ>Љ3’“НeєБыZ'Йа:ѕqSКЎ њXШmbЧ@гъуѕб'b•тG1гюc9oГЭLЈ# ЩбЌЊcЂO™eЕbŽƒ>‰Œf бcБбЧЭeаm$йщ–WMцДР"б.ь|hч%f‚і]$/љgA‡-““ЬTuи*™бLpOZ'#™ёъiыdEGmdЦЋKKќZИi‰f„B!„B!„B!„B!„B!„B!„B!„B!„BўН–’Ї}ЭvŒЃ&й,ЃѕцRhEЌР цBpyDлЬЙбZ1ЗšпD:[<’йkкVqЧvAЗгN?o7ѓМаŽft ŸƒљЕ—9-кй\хЅNШі1ћЂgaіDЇzЋё3ЯэiіМЄйеОцoь›Ї9>клмЄѓ‘цшь03~E _%@ŸŸ›„ччззяЙЎЏП н НRМбйч^шk/єЋDшsGєѕ…ІйЏ ЁЯ;єuZ6ч@Ÿw]Kбш›Цe"іЙ­3ыа,њ|ШйЌAЗыeakбzѓœа<}ќ=c~h;;Ољ\1›а”9=Z1 ѕWщапПf+;-zИJƒўЮЁ…U ЂХ+yєw.ТœxƒИ›™Цќ0ЇE;‹98cп%4ue ДцњЪ|ЫnѓнЭнLаКыoЛ8sга6ѓ­džкjО•Ьоьšfлб={‰шЛЁul}єd4ЭіC_]Э}З8єЊЙЁ/-шš2ЇCгьЫ*њjЮЬБI3‡–Y§CBз ш?Јіc36˜шзМКjйдO‚c˜Уб†5;t23Щ6Ё]jб)Э*њ2šEўŒо[џ$њВ+|ЕЋ+ŠOл}EЂ#j‡jnєЧW ;І”ЋвВ=нЌЂcBе./#˜9tЭŽщ#‹bб1yК"˜tL›ЖцЙЭ“њ8Д1уаl9fжВKМ[Ђ!„аЂZU•6јЖЪ†оšКвЊыь,†Ыд^4єhŽ>Uк‹ФцЬ\iЬБаД9š0GbkЬ1рЩаЋЂшіŠ h §ЬsD[Э3D'7kаSnzщЭ.шицшууШf 5ьуcі<аЧ3Dл6ШБ'њЄ*љнУ‚>іDŸшќ“>ђ0sхFЯMГЃ iќМа:ѓI|3Щ–б.l­љ$…9':š™`ЇBŸœ,}Эиёq:4_\ѓёDs~ДЊєПхЭ эДЦЬаЎЋЬ эМJ^ГэГNNГ эЕNVДžэЛЮаоыф47M33:ЖЗ)‚й„ŽЌš(Ъ#f:ТZЙЬб[Ђ™-бŒB!„B!„B!„B!„B!„B!„B!„B!„Bх{-Є>ЎŸšх\AcЏ_›е„Й8]6ЫnНЙš jЙ\gмVsfЕ <Ја15žJnд.ц8g‹G"зj'tчN w4Я эjvGw№„цsgєызsAћ˜}а йччKDћ=б; йoЮўшjOВч§#ЩёžѓыoпОщyдзтЋНчќ­ЩU4g§JHѓхlшъбыѓї\ззп†n†œаёдчŽшыыЮь€юиђЃЁЯбзcZV—BŸїU3ООЖЁ•Y“хD_; oЫЅd2||Р ]/–iжчvДL6 3Эњ\Nžђ9[ šљЁиёЭrЭUZ4a.ŽюЏвЁПf;;Z†їцяп)Гuж)бт•œљ;aNНAмЭœћЛ„V/LŠіwъъппE5uсœаЗUьV0пнЭ­ЛўЖ‹7пQьЁoєн]:Zwѕ­‚ОЛ Sџћа4лŽюй3B[ЗtО›кpУубwѓBгj }gD_хG“j?є•]§Ѓ шшЫЫK#ћЧAMšгЁiіЅнГќдФu"Zў9e24­Ь?tфЦЬЉ%єd3ЭжЋЋГ~ЩЋ^M§Є:†9mZR‡Ž5g’mD;дЁ“ЭYE_іMFЫьън=šЙЉ'Пџ~КšFGдvХD_qЅ7UмHш*:&TnмаSvЎйtгЭ?Jш˜<Кs–аqњ&ЯЙ:јйeuDYЂ>і-FмT›џ.BЅiUWс[Fє^лфuV}ggTЦіЦ&Ў”}*ЗIНтЬ]ЩЬбдЊ9œ0 ш`51чXnЪgжѓTЕ:DНZ™Н3Щ 4аbЛ6ѓ бvsєщєnъAkбЇСшфsvB{Ёцœ}||ьcЖ“3Ё=дYаzѕ)‡vWЯ}ь‰ЎГЉ'Ѓ-фи}rr2ЂOВЃйоўё‡Й­&ŸфG Й-v"• ­SЧ@г№hR},ŽVс1а”:%:Š™R+hЕŽ,Ђ#™ u:t4ГЊN…Ў~NнБ›_EDГЪ•=•lЮe # нV™кu™9Ё—Щj6Ћ}жЩi6ЁНжЩŠжГ}з™к{œцІЩbfFЧі6E0›а‘ЕCХ|™ФŒCO_*›9vK4ъв „B!„B!„B!„B!„B!„B!„B!„B!„аПКзBъуЪQЄЮДѕк‚VЭхбЏ‰јЧ sq:eцбzs)4)црqWФƒv#˜чˆ6zЖї(цщцзЮцшѓs's•Ѓ9мнlGЧ<~>’йŠ~%”в§* К=лmfПRJgŽ…VЭ)ачб„8 ћ<эkŽ>@§ъсMР>@ћњЭл}.4КLџ#О5y‰уВ5hгфП)h7s*Д>Цо7]_КЪ‹v7_wцђhѓ…f,#;РМД`ж ѓБ]ЭsB;Їf Dзкб™иf3šЭЭ_kBїз\U•F зцяZsyєe•xugцФЮьœfІ˜П+цєhOs— ўЎ>ngчGп цЛйЃoЛ8s•?zлb–бЗ њnVшK}Ћ яКќй)а”y.h›4sшžНDє]0z’yњN‹ЎйщЬSаw3C›явu?ЊЬhh3šgџјСГч&ї4‡ў! ‰u“Ђi6§Bй?4uн啉]н›™ХЌCO6“l=Кn0kЛ2Ђc˜UєЅкАЂХЌА/‡BзЛКвГc™™ЦœЭмD˜/зыЉh‘WЬВ у‚ЧdtћJ*ЅИJ1ЧBЧ†ŠIц єХ…ˆŽmTŠ`–б‘…d“Э:ЎNS{‹Ž†Ž‹ГŽцй1EM0Г VЦЁ%šйЭ§„­šJ+ќZ-Н*-qo4ŸeјгіšІЎТ™›bШєэEAЏЂOЅі„Тз])шxlй M™cЁs$6iŽ„ЇЬ1аЋ„hвНВ 'Ба; ЬЉб;UбЭ@ь_іюniєŽ7zз=Сь€оёFя: Ї˜S w%ttГк•Н+Ёу›эшOєю а5іјиНћS Ѓп:и-Кe‡ ONђЃ{s(њ$њјX‡flП3{Ѓ[іI!єё€vZm0Ÿtцшу!Зе*­RNє1;цЬѓBгьcЅpД OƒVЭЎhк|лЬj’еьˆ>8АЃc˜уЂэ“ŽbvdЛ­Є1ьњWЉаС“Ж O"ЃmME§›б.ь%Ђз™zyhWГ :šйТv6;АcšMhs^ДžэeЖВѓ їЃЂ#›Iј~S§ЬЏ]ЬyбFюРЖЃvјљЙ“љѕkGrєЙ3кЎЮpTАЏй†NxŠtИй ђXцxшФ'v‹fД‘№@wеM€ЁЯ“ЃуГЯа_нЙIачшЏошИьsОAeўёѕЋЈЖ‚#ЃЯапъМбёичnЉf^эhЮ>?gь}ныыoC7CyбЮцV}]ŽŽЄvŸ_hЦrЊнЧlA;Њ3ЂyВoжЎц9ЁХKEлїtЖ]эN&бпDtІYGBзЬЭ_ы‚ОЊ*ОЏжьiюŠтшЫ* §}L6Зj+;­љR}Š€ў.›нfдL?ыЛђАУЌѓЃo†ОmуШwwwшIlпMЂƒдIа—њvˆ'ьФФlž)ZЃІШ<Кg/}ЇAляе“ЬSа?юДhfAO3‡Ђд™б&uДё†чŠ6Ј3Ђ™„ўЁ5Я Э$єYЁщ==Њhт:3zЂYУжЂ™`ўЁ3Зh-{:šP“я‡\НY{С•СLЈ-hй‚ŽbVд——ЖQлК2Ј#™%ѕххdѕ•^Э,А9ѓz=-Бc’ыTs…TkаqСmiа;.–OF‡БЏЎTvl)ŸlŽ…Žэ‹€ОИИбб‘r’9:К‘hъцб‘yt1а™Э}сhaжQMж&Ђ/J˜#ДDsЅ. @(zЋЊвпVmЅ^­ˆ^ ЅџУікІ.У™ыbШ ХAЏ$tDѕЉм_rŽЧ6ЃУе)бŠYBяD цГ8xеGm6OCSfIН ^Y=MЃ'ЯК8zgЧ{жцшS эЉv0­Вwv|йЛЛЛ…б;Ошннтш4ш фшн]{Ю>hGЖ‚ŽNЖЃw<бЛ3@7иу:ўŽЖЊ[єёq0њф$ња„оFяіц4шcЛzpП!‡ w;saДгrњфDЃNŒ>r[nwїD)КN7ЬcэИ…VрSЭŒžѕБвЬа5Щjމ>‰„>Ž…>8АЂc˜;ѕqZtЧn~э4kЧЅtфDшОi/D=z,Zгьа.ъљЁд Dяя/эЈЮ‰6ЋїЭ.ъhfГкУlWG4д>svPGEkйžf›:2šbяяћк‚ŽnVйћ‘б)ШLTя™ыrŠыІmЁМhХLЉ#‰‚юtJ™б,†YQG‘!„B!„B!„B!„B!„B!„B!„B!„B!„PHЏ•јGп•’ŽЉfM™ЫЃ 3Ч&Э]Љžє5їh“ЙZ#иFѓ›дЊњ›_;šsЁыЃlо!s&ИЛй„NzВёГ№фky::хqнѓd4aNШ>‚ІЭЉау‰у-ЪЮї0'bŸKh‡™{™S Я5ЙЃ оDlй„ўъiŽжš јЏU^цШlЛYE-Œv0+ьЏAшxl7ГˆўhŽ…v471іў}cюzѓцІ‰1guЖ'њК2_ш›E ЏЛZєЭ;;7š шo AЗW f]Ÿ‰ž‹b.іЫ;zщhЖ tЯюЯФі2/}YХ_oFзlxZєЅš{М8њВK|†ŠцНКraЇCгц§}0—ЬЅбsеw!љбЋ+;hДGпбVєN2єГ]]1{ЁGv|Г­: РЬitћ=зtєЩI|sjєI"t…ЎлпŸ†>iZњ$)Z†шК\џл}B”Н? ы;­g4ŸФ1shž}мЕЯхЖ^o>8 е ћф$њ8"њР€>™Œfь˜KFѓlЗе:Гн6GєArДШюссшОќш “v0ЧG‹…Ђц-кН$tŠIG1а)ЖGГ кqЅ|ƒ6А=Э;УŽv@{Ќ”oаZКЗЙaч4ЋhџAлабЭЌўм?mG›и)МM:дœЭГХM;ЎSh@O1чFїьIfFБу ‰іY3;`9ЭMХeZЂ!„B!„B!„B!„B!„B!„B!„B!„BЁхѕZ‰єZ)(—jцб„yjТЬБIs[ђЃ'}Э=к`.…>зˆЖЩќ&љЊ”ИЪ‚v gcлИcnшьѓшЄgHkЬndtZЖЧœЕh‚œ}ž Ž=œо혍|r2єЙ'šdkбiичtЮh7ZcŽˆŽЯж™MјЏ~фшhЋYE­ѓCЧeлЭ ћkiД“љœ0{ЃуБнЬœ7пTK8›cЁ=ЬчŒНoапкjr:лЭЎkєѕВаз]­њІЯƒЭє7Wэ!ап4ЛККЪЅіГ<шRhŸ)Ы;zйшюб+WvYє7mж6юх%gVіД„nfэO‹ОЌуЏ—апD4+Оьž@ ЙGЏмf}IЂ™‚-Œж˜kѕїСќ]2їЃЖИSЁЕfЦО I:ЉѓЃПOGOTћЂoooc ЇЉmdе,Љя‚а“ЬV4aдwu$;;к8h}ЇG'|%Ёі mR'EKWKшЁшif ZОz@џh#бі]=б†ўёш8hэЛ!‰VКc—F“lКi@3Fmїщd’mCГMV=ОГиаК‡ЏЎєь8d…э€Ж”}ЩЗ^OEЫюxf^}•Ш<Њ%s\t\raŽŠŽЬ’Эaь R;”}•жL НеU*:vLAћЊ/Tu(ŸbB_фEїь‰ш‹ЌфXш‹МhжИ'Ѓ/ђ’ЋТЭбсfЦГWбaІЂ WЋМшsЋеЇН@єЊЏ4ФЇ„шгОў {C“ж]UMv žŠьН4шˆьSЕННь•а™Ttє^ є*%к6шНf= nG‡Јes\4a>•Ь;ўl'ѓЬаnцИшSэЉо->Uа~ъŸM›cЃOЃЂ5цєhgѕnSєШоёTяЊъмш?єюЎ;:и\nі@;Љ)tєAћ ]д:њŽж™ЋTГz7џ ;єЮєnВЭuшц{ЎшјfvxHВуЁOXts>$рнЃгб'U™бlšœъЃ(hн™›Žšђ ы№О7њD->šg“h—ѕЬшnЇœœLC3}xмжЂлWЬ-šA;š9іW]ЏŸэnžкУ\е~gРЃon|а‘иžf}3{t}§ѕѕызззпЊjєMƒЮЮі6_wцoн чюЬзЙjD3vе•эg–б7EаnоЫЫЮ,ЁotЖ3š-]ЯИўwНЭГm№ДшЫ=šчОтŸСЃ[іјXy4mVбмcХбsУцбтcYиfv§}0—Ьeб3ћ.ЄC›й)а— D_jбЗЗK@Ыц[Ѓй=ЩlE+ц*о|w‚žfžŠО[ њЧ;‰=є@єDsњ— ­cO5Ч@ W,-ЏX mКM‹цєd3ЩжПЖЙЃ)v ГŠОє@3ХlCG1+ьK+zdгšиБЬЬ`^бšѕВ yЖdЎђ_эъJЯ^":Ђ92њтBЧŽifsLtTѓa`ыа)ФLBЏбtqaіD_4Љш4оІdш4мО8h™Ц:”†ЪЭГг8…ЂЃг0хжы˜ш4FЅ НŽ†NCЄZG@_\Ќšв‰Ђ W™б<лї™’9#{/иЬsєоа”UVBБlк ЯbйКN‡њЏьэХ` цЊжОSННJˆ>%к‹Р^)hЕtшцмшf :”M™ЇЃeГб,Ёы&šуn+z'эjN…оёFяVЅнбёбЛ3BЛВwЛ–ŽlЮ‚ŽmЖЁw<бЛ3@яy˜6а@ыббЭtџ}@ t.sоIˆ7žžжџЈшšН3 нГiѓббєЁ-›}б­™iЬSа}*šБiшЮ\EšgŒЎПxBšc Ezџј4t#ю:Rš'š7ЇDїєёŠpД`Ю€>Ь€6kй‡$л]ГOДM1ыаЧУћц\шcm•WШeЕђш§‰шƒyкФіGѓьƒЊЅЁ’Ђѕь)шƒЂˆ>(†1ЛЂ'›5ш Г„жБЇ›itР]z@d@Sь§@tЭ>PЪƒ–Э>hе,ЃЃ˜ЖтѕD3FЈx,3‹hЖЁЃ™‡"˜ьјbІA{ЏЂE'7E03š[ЪХœђ UIt№*yЭldЇўsЂЖD3B!„B!„B!„B!„B!„B!„B!„B!„BKьЕџшЅRN!#Z5Я}Ў’y6aЎKz*Љ•|nF›Ш%дэЁЖ4Йgч\€Ю/­eПЖƒГЁхУЧѕгvCч€ЋЧМkсЎффhв<–M›5lWpbДж<Ž­7гь9 fлЌ­ш4lГ™d{™S ­f§еЫœ€m7KьЏu~циh'ѓЙlюеЎшШl7єШўЪЃнЭ1бЎd]-P‚эŽюй<К‚фGћЯЯ™‚ОёBGb{Ђ™„ОЙa^ћ#?КОўКB_§іэ[ƒОiайgэ‰ООО~}§­ЉtƒfЏКбg‡f­ЙЊEуаЌ?{ол,ЂПеfmgч1_^^vf }s3Ј=а“й.мцпL‹f2кюЮ„юЏзЂ%v1є%зRаЙgћЦБЧ‡ЪЃЉ9wъo<š{Ф}ж‰а:r­цбтCyfэ=чЊяњЛpдўsЎаBZДQmšѓбЗ EЬЮшIf+Z"з цЛ є43жЯYE‹ъйЂ9ѕwЂzЖш?~ f#ZЫžhDн™і‡=е‚fZZo‘h—]ЭпЄ‰їCц&й“ЭлЭќб1Ь2њђвŠйФCWuГЬіAгеБЬLOО\ЏзоЫ™fЭЬГUѓtєU^є:}ЁWЧ4GF_(ьff0ћЋЕшИц!Ъь­.‰^‡Ё/š(t"3уй“а*:ИŽ0Ёu"oW$ДЄN„э‹…ОШhf{:њ"Ї™етЈшDNЉИшDHЙЕзS9єЊщj•ЉДнЉѓЁїі&ЃWC‰jЁш‘НЪЊо §”'ˆГЈGѓо„U’ЊOЧКЏьэХ`‹цГ8иО,шГЊ8мКSЂНън]­-ЊwТаЋ’шєюЎ:T-н:tш05i>Ь;оleЮqЭŽhOЖ2чИЛƒ6Ÿ*fwєюЎ:ч,ƒўYаЎънЎy ндЛ?:Ў9:ВйŠоёCяrCя t|tlГнѓЭ4фЃ`ѓЁЮЬsTєбtЅ>TхЭc2йнБiєб4єa›ŠfSб ЙŽ"OBъбŠкНJш‘амGj‰а2лн|хЄ-%КЃL@ГbhŒцЩ9а‡‡ббЊ:иьТоОх hЉIf3zПЭйьŽ>™„>жЕп“ћ\Vаь ZЋо—ѓETЅBfэцйs@;Ў&˜гЁ7ˆ'њ`шƒдhzњ :шeиЁЦR™  Ї›)tа]Кc3v —MЈ'Ёs43ƒ§аФ ewГ &ЭгббЭœzКй6ъhц>šьi6Э:КИ.ŠYN Ў‹af4;6u,Ž™BG†ŠХ03‚гЈХм”\EœЛ%šB!„B!„B!„B!„B!„B!„B!„B!„ZfЏЅФGпH•1ЪЩf-›ЫЃлWѕРVФUINЌѕ6ыб&s Дx0ЖЪЎсqЂs}Ь4њЕ“9š8щ] ЗŠ3СufкdNжšIЖЃ91лdž+кhž„NЧ6›ч‰Ж˜ Ж: лn–б_НЬ)аf§ЕЩУœ‚э‰ўК tЯў„ŽЭv5Shws\ДГ™@{˜ЃВнЭѓA{˜;v8:лЯЬfі4Гњ{н}sУX}њЋWэш™иоцk}5[t%nњжФЃХц„f њf†шЫЁњзLBћvг”ŸэfОьЬšeG;š/;3nПюЧN‡О\ њ’DЗ№oпFvџеŒь3уЬпѓа3ћ&4~Н4кdfsiДбЬОЭпПыб&vzДє§}Жhљ9п…€Юіy)ЦG›З4гšнб“Ь$к|я`ьЧ^ќЃЪ„жБЇ™]аЪsДlvEO4; ечќр’sAO5Shл чˆЖэh‘mCSьјhйlF+8 '›Жb&б=[§КУЬ,цЕM|нŠŽbи„ЙЪg­‹ 3;–й„^GFG3slвь‰6БcšuшudtTГНDыиqЭЬhž+К4{Б/.hіRб‰Ь{Zf'§?Ÿ Э1ащШu„9-Вгy›ѓtt:nŸbžŒNgRЬSбщЈ|qаЋІ\цН`3SЬЋЋU2'п^Wјл8gnJ%хŠ‚^BїlŸч’ц ь= эѕd9.њ”hO`ћЎX›wwUє™PlГˆі^В1Ыш3Щ<MšєоžяšЛ]‚YS*єЮб;Uahž=wєюбЛ3@яxЂwItTГНгdи9ЬѓFkЬк•НDДl^Z1/ёu ТlGяLB'ЙI[б;BОш4я,@џшсћЌИf-Кџоv КџЮАэЈЋзПŽ‹fzg2zxDBO0ГУУггCЁЮмДЃфƒЎйу#GJЁц}Ј ‡G'ЃЙGЂЂЉт _Мр)‡ЖЎW=ВEК}НЙ CяL0чE‡ођфGrЂї#ЁUs8кЦоošŽ>9ЩочЬћЮfњ„@O0wшcЉ}"—ејЛЧз‰в3#ЭsG3Іˆ' yіаŽЋ‘цRhзеHѓBа‰б;нВ”вЃУЗt‹VЭщбсїŽОŸ=йœ-ВЇ›e4eŽ‹Ž`–иЄ9*:Ž™E6›б‘Ьœ{›ItЫŽ)nб,’YŽlюŠbf4;Жu(’™BG–rE2wх1ЋшIЋх1wEчn‰f„B!„B!„B!„B!„B!„B!„B!„B!„–йk)ёб7beˆJчFДd~“јьF‡к#WeєШ–Х5:Щ‰Еоf‚­1'97:ФЋ™u зNЙ]=ю]EПЖ‚ѓЉUЏ~к.шn™T;‘гЋѕfJэŠNЫ6™чŠ6š'ЁгБЭf‚=Де< †m7ЫьЏ>ф$h'ѓˆўкцƒNРvCŸ‹ц… ЯГ':6леЌЂ=Ш‘бЮц‰ш˜lwsЫžкЫ<э‡>чбе?•уъъъUwz&ДŸИ~ОЙa-ж…эўЪЃЛRšš]^з}§VзЃНеiб—}у˜Eєзz{h3;КbWџ0]БoъHuкY;‘лєЗОжьЏNf–бэѕ К§rо т7чЮ§mЌC{ЊѓЃ…Ю:kW2ўЦ7g4џœoЄZegF›цЌ™Дч{L|Д‘ЬиwЮќн„6ЈѓЃGѕїйЂхч|ч:?кыўmйбŒ§Ф?Фмg=Щ†юе?ЊBагШЁш1с7tјЧюhѕ9ZДлЎžlVбж9 jљ—QB3ДЊžŽ>=5“i4г˜аNэцдAhF›]агЩЭљнFѓzНіXэ‚P_ХžsУЬЇЄй }AАcЯЙAГVбыше*іœЖН@ьUь9›аы0ДЂnGuЮ:єzŠІg•мьъ6вьУОаЈ МЦь–е)бмЌ'Ђ/tм-АЃЁ/dt*r=kЪНJgЎjЭ{гб+P\з˜уЂЯЙnOžѓttBmзž<чPt[5ч шŠP:Дз7 НтKЈэRаЯ-юйЯ%Щ9д)аQеЇD{{лgСжМЋЂЯФbЃѕzЧsХЦМЋЈуЁIВˆоёEГšЌЈЯЈ’ЁїМбЛЛЊš4ВэшК Г ^zw1шнЂwЫЃwњ‚ЬЃ:І99z7лœ)ДЃZ6FЛЉ—ˆVЬ@чBчЛwФC'0[б;BБЭYаv5i^&ZўєŸЭВ "ЃY tю"ШGббl2њХŠGГЃЎ‘Š>˜‡}™5юIшТO ŽˆбђPl43ЖЃфЎgmD‡‘4Qє‹ЊŒшA=Э?” ­Шmы•Dыдіч‚іЙ{0ž,˜#Ђд^З<-?’НˆоЕšУб–зт~лtєЩIєў~цдЋiа'IаЧRћjNЋqwОЙ)фэ`ŽŒ>™„fLOAГyЁ#ЩsGГЃRЃ іtУf2ZeЧFS/CtаСhЯUєAdsєA\3Г›gˆиЄ9.: ™Cгd_3‰>ˆlм‘Ь4њ ВИSГHf§Ј#›л"™iudыP,3…Ž+х‹dюЪc–бWЫcn‹eЮлЭ!„B!„B!„B!„B!„B!„B!„B!„B-Гњгз\тЃo†тœЇs#Z6—Gg6П~MБпМQЬХщчДо\ -ŸўњЕ 7˜ с•пєks>ДтеА_ПЖšГСuцљЂЕb’э†N 7›uhЛ9%кbVиЮц„lЛ™BЛ™SЁЬлУœˆэfцб_НЬ)аŽц§uШCŸэ…ўК0tнз@tlЖy.h/3‰ЎOшЮЬžŒОZКesЯ[щeЬ*њЊкг,ЁЏˆ2А'™ч†ОтПҘˆfŒb›рyЬ—‚yh3‹€ŽРі63Щ<ДСЬО БvДЩшЕ-|ЕКf“т&š-~этТФN…ІЧЌGK_3ЂЃ‘N OOнбT:tЭ–O‹^G@ЏsLДЪ^{Ђ)v}^КЂžТЖ заЋЬш5—+Z†Џ2ЃзаЋЌшЕT}ѕл*єШ^ ХCЫцS­ym5SшUДbиŠym2ПЋб-{Um˜sƒОPа+:иь…^Џѕ{у]“Œ^асf=z03§~&бЋЬшН*ъюaF‹ьU"4e>эЬSбfsм—сщщ—+К‡ыЭŒ•@[WГ ѓMzdЛЌЧГ-Лc–hйМДbŽі‰6гhЇДjŽ…ж˜%tЫv[БGцЬш/ДnаЉб"{ЇЪ]WЃw›lш ЖzЇA{Ќ:˜w­цTш.Ÿuw‡,цv"єюбЛBБбzѓЉbvGя&EЬЇŠй™НћЁuц9ЃЕцY eГ эiN‚VЬДЏйНГ@єŽдПЭтšГ ыЏщЭGGёбВйŽІЬLы@л>{lmљЂI3“о‘ ЭВ ЂЂыЧjДЬvE3ЖНЭЃiјQTtѓXcEo7hс1в‚><Ѕ‡\эЃсшЪМ§ЂŠьˆlњD?FПHˆІыохЪюб/†~Ft€Й8:ФьŠvое š{,КЭџЅH˜3Ѓю„9к…rг#ЬYбћ^fm7‡Ђuь§§ЪЫхhц>2‰_?9IЎ˜‚yпб<Ђ$3…6wшcЉ})Gs‡>P:сšnfNц}GГz‚ЙJцzЛDCї=­cЇGSf?4KŽ–йЄйнgg/=бœ-ГЇš]агЭљбЬ;.:е EєdГРNЕЃEt 3‹lЖЁЃ˜Y§щ9ЂYУŽ+Ўб,ЊYŽhюŠfж уjЛЂ™)4Kcf*{кj‚9]QЭ,Й)š9gK4#„B!„B!„B!„B!„B!„B!„B!„B!ДдъгБ_s‰ОщkO.CT:7ЂEђдчCЏ_Sь7oо(швђs>#њ•мФЪЌkИvЮХьВ™b[Эе„—DПv@чrыЬ*лЩœAmЃSУЭfYэnN‰Ж™%Е:кnецdjГ ўъNNЅv3шЏMюшjGѓ9/.ЎvE7№ЏAшјjєз@tlЕ9WэeІаWu™ебW\K@Н’аЖy2KhЊ hOѓ4t,Жw94~С m„'E_RшЫKіUDГ"h+YLBѕFЧPлч,йttЕчœ5гЉSnЯ9W}уkО2ДqЮюh-;'К†ŠЮ}ёо3@Ляшё9sD[ц,Њ™hWћЯYP_)‹ЖЯ™l‘hЯ]=oДРN„ˆnW€vй qб[CŽ‚цпЭŸѓcЬAMЁЇ™ЙУŽMƒ–žDЃ/Œhё˜уˆш=зЭAЃ/H6‰žІ>хе:єzНІбТ5шЋЄшSНn’ŸЇškДaжбтБнzMЃ‰Lhхьюxшг4шŠ­ЊзžhBНЊJŠ–еkoДЊ^‘ъ l3zЭхŒ–иЋUAД]}qAБѓЂзRѕхoпОuB_Hф\hйМnЭѕЁ^­Дьxц^НЗG ЕцwUњB"ЇEЗjеМ6Ьљ]ЃОPдIа”Y‹^ыїFƒ~'ЃWЋ зк§ќŽR›бЁd=zЏŽšДz%WmXчЁN…&ЭЇ{cЎhbдsBєž+Кwыб,хЫPDя9›%ДmаIб{ЎцŽНdДbŽійc‰hYBя… ]ЬIб{ŽфНЋšcЁufНГуŠf=КЮŽakбЇ"ЙЪбмдЃ%vFєNŸћВЛCVs€:šSякЬўъф“^zW,2Zo>UШюънYЁеKDЫц]‹9к,­˜mhOѓ,аОfя=эЂžzgЧW­˜ЗшЃ9 ђі63™ч‰ЎПh0'@Ыf+š˜sSDДхГЧжжжTtџѕшъЁiшjФл<š„ХFWь­-…эŠf б‡є№№АљїјшєvгЎјрUњ№Gqъpє‹/ьц04йˆ~оцЪца/^HъXhzxќy њХаЯˆ0G‡˜]бЮ/ХY ›|юšшпЖнєГZ|(к>ы§§}t ЗšCбuEmМCnяˆkа”:иЬ-пО”ЃЙW(pM7wj#ЙU;-ц>™‚fЧrzпq-tа$zгqБ‡Д::šйЩш6—YOCГˆшОŸ­Ј'šѓ тšэшЭM?4ЕЉѓЃ=ЄЬ;&:ЮцАЃ'›yv&t 3ЋЕzВчŽnюжFt3Ћ?=G›sУжЃc‰kt+1g3:ЂЙ+вœЕшШмЖHsж|Icf ;Œм' #ЉDѓФХјaGбŠeЮктР!„B!„B!„B!„B!„B!„B!„B!„B-ИієєзCђумqѓO™зЙ§ffшs!ЧІщеЋљРЯ­ш73CŸНЬК2ЯMz Ж—n2гhН9кh&бs&Мй=е‰зUќГ~tё_ЛИаЃеѓЄуЁїˆЎЯьž‚жБЫ зДА’­šуЂUіКЫЖвХ…ŽM˜'ЁO­шѕdє*2Z>!]eЏ=б*{U•НžŒ^%G‹ьЕ+ZdЏК"Вшuє*#КfЏ єл*u•wUцаўfFšѕш@ГР>nк'rsьЂ“Ёо|r2}ЌE3gГњdКfз№у!Хь‘ЭГћІЂѕцMoєCGєsЧжš…l+=ьrAO33gГ §Акb6Ђ хCлЬїœЭљаVs•n2hхэо№FO43нл …ІйMfДШžjfКЗBgє†7zВЙaf њзЎі™OšTДyƒФ03вь‚~„ŽbfтЇg7tЭ~" mьИтPє“tD3IЗЁŸ(h™-ТONь†Иш{“б,…Yb“fŽMЁ76єŸBвˆEДЮŠNfцрЕ”џЊ;К­GзПN-юбL2‡Ђ›_Ї7kђEЯ" sхˆ.ЭSб#{Ўf ГtЎœаЅ‘jvti!‘=уAkбГнбu zю/У>-ўдcош_Ешв8S:ti—БСЬ–cVZЂшlЋ%šйЭl‰f„B!„B!„B!„B!„B!„BЁx7НюS5V@GwоЇQПz5/ѕЙаkbиoъ^ЭЩ}~ЎQ—ш’jY,ЮКЅПyCЁЫЩ)ГЄ6ЂsЋiЏЊ6ЃѓЪMf ­'чSЭош==ѕt˜4w&ьdtРц *€цm1ЁЏ$r]$tУ%л7H\4зљљ^Јй:jљxцhшS3кВ’оМ"а“двaвѓš{жч>юk&Дzrw<єЉV\ХЃД ш {E˜cNzžѕZBГЭЉzo"ZУNVйы.ЫJZ5y}Zєк MЉ)ѓДє2ьOЂ'ЭŽhEНZEžєЉœ‚^{ЃeѕjEВЃЃіz€ОPШфЌуЁOє: }ЁЂcЊЕш=ем пV)ЋМ{їют‚Gье*+zO&7шЗ:є; нБsЃїієz­GПЛ аЋ9 па„z%T­3kаЋ•ЊVблеŒSSf§Ќ-hYMš D‡ІеЅа"[;i -“KЂщ…f†цйVє;_tˆšFŸъаІЅЕк_­1Ч@;’ІеKBяИ ЅЗХdhYAяь8˜9t}&НЃй[эŠюfm_АCяЖ9Ђ§дZѓщ8с1s‹онкmЭJНЛKВ3Ёwvќе‚y7Ойэ8kЖKБc™г wЅЌшЃИh™„оЕЂ§дГ@{šg‚і3{Ѓд Йк{жКe/ mšє‘я–Ю€ооон6n$шжКЕ†оnвЃŽR ;ылђGoхA‹ƒоЊsC“цmІЂ†<Эh ›4зЌ˜эkf‡‡№Аo 3жŠYГ)ЖЖBал"Кэˆ(š5dЖŒоNŠ>фыФC[|3F oQj[ГЃ#Ѓе‰цеƒїљѓч!hљс,шЊч}ƒйнš_TйЬўh’M›Ћќа/К,цФhПIПШ‹д„й§‚/;zd'B˜а5лљ3Е7:Фœ НK˜ѓЂйО3šџ˜wаЦЧRЂїEp“ЋY@EF3v|,šїћи>—›Yќn+њјxŸЪбЬЈ9w№“ЁЩцšЭ‰iД›˜c+ц*E]§jКњи‚vZЬ=ŽfЕЕ7lЏЕєhŠ=­#яoЙЌѕ№ae~ја =СмБ5шM1;КЭ=ЭЬ\ЩVєУ‡ѕ,б…rЁ ћЙыоН{ŽцbhЪЌColl”@ЋїgMЋ7а{ЂйMЉ7к|аSЭЕZ%kбПv5Я|вD -dКЙROC?ёDЧ 3ЦаПd­ВЃŠ5jњWm›ulsњ‰-ЛOъХDєДy‹œ$1›бїІЂг ZTгfNMЁ76єoш)Р’ZgF'3№FЪ}бн6 ыпЄ‰ц‰шLfЙ{ЊкˆžE@чŠ@џКHєЏ*К4S ш\ЋEЂ9Ж]šЈІGЯvЮє|7…ž§ŽnаlAш_Ешв:CZti˜1 Н„A+- tО€ЮеЭl‰цeЂB!„B!„B!„B!„B!„B!„тu.Є>ўj(ПM—h~­<ўjfшsЉз]ќ5ЏЄJYћdѓќбŠX`t]N›U4e.ƒжˆ%Жж\o2Яm+/G3:мnцбvsДƒ™C§ъ NЮv1їшЏ•yh'sЧўкф‚N ї@] њы+;ме|Ю™KЃЭU"њŠhюhЪ\})EЃIs&ЖнLЃuцhЋX€h­™„ЇEыЬ2кlЮ‹жš;ј—!‹њ*%кЧ|Щ™KЂНЬUюшtьps9є3аГEGcO0Яm73ц‡йэ9ЅqиЇ^hŒюW}х{žЛЄrG3 эКAФSaуЂ]‚>K€юй.;ZDўЬ˜-ŸqЧ|ъaf‚й­ЬЧмolЏЋъgVвЯƒЙB_T™ад‘вЙаk§й Mžƒ mcЏєX‹жГщУЛѓ GГZsLz4tnЗNм™5hš­;>zOƒ^аЬˆ^%Gя‘ш5Нвi&ЄO‰^G@Sц˜7=™НіD‹lƒ9!z={ДЪ^kаџ ™йбїДZ6ыаєЊZ1WН­бяЊ.HіЪˆŽ~џhа:3fГBяэiЭšiа-{Nhцˆ^@SьЮ<А{4ЕAV3AП•аЬ€^BЫьЗzŒFЏЁUГ§жНJ„&ЬFі[ šbЏœаь@4Бвьа#[kž=š\IAЫцдh=[kVиŠЙ(ZЛ–€VЭщбКЃС,  ГэЭvFяthУZ3Bя еhѓj#;%Zo>UЬ;VѓˆоMˆ6˜O%qƒЖЏиЂwЛц€vXБAяЮНГуВцЛwЛ\KAяjа^‡Сш]%›љш(ZОu,­оЅУб-{ЮhY>ђD йбvЖжЌE-}4ЭУЙOJ6ЭяiЦ$oBєж$є8iЦЁЂЁ{іˆflЋЉeћЂЗ›њ Тє‘Pltoоb!“оцаЌ}ч›j&бэP1WљЂЗЙ*sз‘’ŸYІЬ.h™ЬqаŒ‘ц-ћKQk"Ь‘бlz›DSцXшБPє6‰&Э3EgBЫw3;dGЯЭ=ž §МkDыйšaоw4чA3v|,™ЩЭZtЭ>šŽŽi6ЁOt ™ё[„f—еєьЂщhyпУœ ]яыzgыШŒmvЙ­цУžŠж™7ГњЁжЌЂ'˜›lSюЛwЯbюbŒPФ5ыаВй†~8 C+ц }яоЏ]ѕѓžT)bУДгЃiГ-›Щi'GkЬКf?щЊЯvWдU?zВ9 šbы7Шts(њI0:‚9§$}p`зќЬhŠэvcџлб*=­ВѓЂuцЉшшfM}ТsAлиёЭŒ3Ыш{Qа ЬBЄX@ь ЛўМ—ZЋЂяMFg2sн“ВЁev~ёttГТЖЃљя J™Ї ‹™а3Ш]šлц‡.­эђB—ЦŽЙЃKKЙ€Ю•=SГ=W3V]š)ЇЂе]кЈДHєШўаГ6kаѓ6/нГ&tiœ.КДMаЙZ$Кeџ<шв0sќ_4шв*Kќ_Ž/Х\5˜Ћ–bfœ™-ХŒB!„B!„B!„B!„B!„B. ЉПъЫOгvnAПz5/Еф=н&\ѓJЊuH6lўЂYЁ ё8kN.ЃKТi3Яж›Ы ЕbaжZsЛЩ,кˆЮЇ6‹yЕЭэŒv2gQлЩ<њЋ:ƒкнЊП~e_аЉеNфV§ЕЭIжэŽ>їCЇT;Ѓ{Г;™л}.ЂЏЈ2ЁнЩГF_J‘h’LА3Ёeѓ4tЖM,ИGДжЌКK™{Е›9љq4З№/CtтY{˜yДŸК љђrh?3ЏЖЁВƒЭха>/BЩќЏ@ЧSчDGS‡П ]а‚кїXt'єžЬ|бWИiњЌлѓv§а_BаќIвФ‚кŠЎžіХSН’ЬгиЇВzo/Z>Е;њдysHшЯŸ™­5Чмol5Џ™ЈўќљТŽ&NIcnеqUѕФЯuНЙB_дббдВЙ;IкbбŸаšщ#Ё-dНаCZЫЮжРзkњГНZ%Fl#YQїh’­™єzэˆVиЋ•ІvFЏДдХ…ŽmBЉ hНіC_PhЪїІ' зk;ZЏ6™уЃ{іZƒўдEЁ/ђNњд§ЯQ}OЛ es­~ћі­€~WuAЊW+#:жKQDяЉцѕњ-…Іељбuѓ[awЬ ­›3ftУžЫЄ=аЋU&єЉ Кy.wяxGБWХа ћ­;z5єлЭ•MUДР~ыŒ^Щбh6‰6Эњ­нЉпЭ=Вuц ЉЅfˆоубфRZ!kЭБањYkЭђ™ZЗVЩДЏZ‹жнAєfaƒјЁ=еюшmXlFшЁm^n`'DШzG@[ьбЛЛб;Bыћ’•yЗ2wЭНуˆцZКbяjдsFяJХОydAїlНљш(ZЙw$CECЋwщptЫŽ…>Ќt‡}.hЕЮЌCљЂХє–яЎжšSЁywюеlz[‡>ъ›†>”ЗG7ы­)шVн:SЩ а}AшэЖaдl@ХCїьЭ:4›Š^Ея"„92z‹ЯНЭU›YћЮwt4ЩLЃллЗ<ч‰шэеpХ‘’—й€&ць„жЗЧ+Ts4cдœЛ—ЂЃyзн нЖEЁЗœалƒіD“jс‚ШhŠœmP[wt4“яЦ]ДЃѓ ѕjЭ] §Мo‹ћФчƒц/˜3Z3g кгLЊuшчЯНа/њlhos"єю Ў,hI=ЭЋѓЃэпtйаqЖ4‰о—ЎQЭк›žхос†опw6Sшƒƒ#кпLЊEє~›“™л R:tˆYEягЙ™™ЮЭиБ'кМš]ГO†ѓI šYСк˜}pBŠfvtоtYMЯNж™mvy )5СFWћњјx_f^hПYO@w6ЊЭС\uяžњ!cдЈeі$ГVЭxqЋЖАvБ‡vєDГНЉЂЙ3Ž шna'BЫцMўь†](н­БёPŠšvz4iVб§Iи2КЮ€žjІбŠYBїGw/ §„GSl§™l.€žn&бЊYA? @зEkдЩа‘ШБадk1!š`‡ f§oG+ђ ДЪЮŠж™}б ;Ж™So*–:Г m›u|3чL}Т C Ÿї˜љHБˆйFuѕ=Ab,…Оч…V?Єшў=1+ZVAпПя‰~PмЬфY; Yysš7‡ Ыч‡~№`‰швм6ёіaFЯdЮuшвд1M}іzZЮшљьh šПu”† Qhъ†Wк)ц„.”[$zd:eЬŸМPєР:yFtiœ. ГЕH4:_К§лљ“kєhfу KГlцЊeYЇю~Н4B!„B!„B!„B!„B!„B9t.TZужљтачDтЏЄЪ8љ(ѓœбЄЗщѕkў:]Ў7‹hЪ\ m0Wш6­Йнdž'к(і@ч„лЬчœy.hЋЙc§ъ‚ЮУv1Ÿ7цЏNцh's…>?џкЄ"ЏЊ2УбчZєе,а—]ђзП~эйWšrБѕf§u@ыЬЙаZБBЬ_ЕцLlЛy~hЋ˜cЛЁyvДЮ,ЃЭцМh­ЙыЫE˜эcž кЫ„NРі2Яэ`і@Їм ~ƒžкoGћЁ“Б6 ЃВ=ЭсhПSбuе‡РЖьўЬнјhљXщfє/ДrіtqЧбfіКъ‹š:О;z/šь"ЬФ AЗl­8}hDoyЃuf}€Vб[U=д =JЧпooыаG а[ z‹3ЛЃлпn7fњ(zKШ]y…zv}$ŽŠоš€о–Ь=š6OEїьњНEАналJ-КОтшH1GCГшhжОѓ5шЃШшёџЮFFwєxХQ4г ЗœЬ*šЛ$КOEз9˜4Э\б ­aла&vђeаДяЩАЃƒбклž-\“ЭиѓЁСЌ}‹Ёбт5eа†O $кnN‰Ў3+0Ђ_pYЭ3AП№B{šЁww}аОf_Дх;Х‚ш§* эђэm)єО€оЬћ.п’шƒшh•НoЬі-зИAЄRЂЇ™™жмЂт˜ЖYь`иŠЙaзџ>Qš†Ж™7]ОзšГŠ2l“—БЭ.ћjѓP3ѓ0Я]чhоМwЯ…нўTЬ… НЩ™]бѕ: '™Еh~Ъ-Z8.ИыЩyН‡MэЏѕшif=zг§DA?,Šо4 [і“'тIи…ЈН-›Cањ]=бЌA+f ннmB?$_1Ьсш' Z6ыа“ЭСш'\3ЙЋьІ0ДjC'2“lТ„І6Hs^t$3СN‡Žg^&Z†‡Ё]юща:ѓttd3Чжš­h;О™YЭSб Ь]Њјў§{šgшTt†ѓќб<ћ~—ZfчFп€Юdиїб#ћС‘ЯЬ$ѓ2аmсш‘=gДl~PЪьVЬJ™ЇЃ ˜9Ж?КŒ—Gп#бІ-]амuD›юЅХЬН!ЁKƒыlш ]клф‰.ЭэЃи:tiы#zVfGєМЬюшвP1•MЁK+Ѕ шqK—FЪщбуНЃДQi‘ш‘§3 7ˆоX8К4ЮŒ.­гdD—ЦщбэпиЮн,ЂYƒžН™ЕьС\ЕsfК,Ъ-]Vу˜„.‹qmDзь’83[Š!„B!„B!„B!„B!„BЅшœЏ4ЦЕѓЅЉЯ‰Ф+^‰•a Qf3КЌšє6Ни2КЈл„цд„Й˜ZOЎаmzs)љта&А:/м†nйlNh;ЙEuAчb;ЁЋОжъЏ ђЊ*Зк…мЃыHє•єЕьшЫ: ўЕW_бGS№ЏНZƒЮШжˆUzoўЊ5ѓъ|dТ|щcЮ4k‹˜cЛЁ3Ьк6хєUVДжмѕЅЯ‚ОЪˆЖ™GДMНJ;kѓ\а>›#‚эeі@ЏRЮкЫьŽNКAќЬ^шaжщЬббщf W [н~Н]їЊ;п8іД?65š? yКИchі4q$}Гz]ѕe"z ›<Ян‚^{ЂWЄЙ0њттТЮиф!єFіКяѓч–ќљГНв :њдŽцЬњsЃnЪƒ>5ЁUіšы3з…^НZХFЫfЫY[бЊкˆaЋfгЈзkДТŽ&Ь2zOgfZP_ЄDSf=zэŽциЋ•эЋ&бš]Н–3ЃЖэЉvBя‘фН6™ Ѓї(r~ћіSзчЯя.Э.†оЃаoпrшwяоifэ€іSO@ГЗ<њг'R}сˆіR;ЂїЈIЋhrжNц\шЗZU‹ц(h9§ŽF_Ь§O]%Ўў§NЃ.‰Vиoє? њНZхCSjjsќУХ(uiєfДlжЃ=д^ш=…\5SwЕbŽЂжЂ-ъ™ЂЭъЭѕNQ'AЬhe9 M‹Ѓ‰ѕDuДI­1 h’l0ЧAые:Г і5GBkoжZѓа„zЇEы—д3@я UhуšГAя№™Эzїb7кmSяHYW­Ь]Iа.їйlWf…>c4л•‹Œ>LVдш#w4ЫƒоЕЂМа&uƒf,zз‚>ђGвєіцЁ˜уЃŽТаmzo+КeЬ~h>НUЗS§У†}lІбGб"G7;Ђ(їлэm њшШM™9ѓ–˜п Ћ_nз5цЭAžz[ЌRГГі]D!OFwjVн9Жф<алr КЙтH5OFvшъ‚pДbцбGŠy:КљPв\ ŒzЫ­šЗЧ+Žˆў•hюНЕˆцЎ˜†ІеД™­{ђзЬmмЄйMЊ­h[wыˆЖЃ u›#тŽжЈ…ЧIГіЂA зBыпbhДеЭиѓЁбЌS“hё’мш†mќ€* _Д9˜# %ѕs!ѓї/ЛƒњХиbа/МаžцDшн:u 3…оЏвЁ-пнZбQ­CsjUlњT€>‰€ояъ.иЬѕ­пмRЃЖ §'­АїЭйОO7ШXBД…l5шЅњбƒƒ8f=й<АUtХnў}Ђ4 m3onn:ўА†2їE1l“—БЭ.ћjfГЌ53ѓцНЩшƒ8ш:љ){К9ЂэъЧеy\џзE§Д‰37ЧСЪЯ~" ы>Ќбэ шIf-šŸr‡цŽ8юЭOžHЫ=lzfCO3&mC?~мœ)=œМБб‘+є3=А'šЕшЭM=КeЋв?ЪŽо”‹„nиSЩДb–бПRш‡rѓC?‘а Y7ыƒbш'|~шщf ­’ч†&д.ш_]адЎŽAІдK@+ь04ЉNFN‰–еб<MО3Ё)rkЖЁэ$ВydO@“Г~˜вЬєфЮˆ~˜амFˆяїf§+…оx Ђ3D˜япЇЬДЂЮиїЛ|аВzЖш'<њA єРОп§„G?(@^(Кэ~0šcЯ-™–Э ‘Е#њС аlКWTлоХt™ ђ{ошвdДђ:,MцбšІК4Иi‘hZ­C—Ці9Ђч4gWєЌШŒVЯMЉ)tiІ˜ НБ@єxя(TZ$š-НББdєьюm’z›ƒYаѓœ3ые=К§лЯ]кІM@Г… ‡n~П2kеš-нЄ ЫrмтаOƒf#š-…м ‡_/B!„B!„B!„B!„B!„аЂ;’}ХUBGwnDПšњ\лxЭ+Ѕrо:НyDЋцВhƒy@цЂp“yžhЃ˜cыа%иvѓќац§хЫQ И‹ЙE%Э%а<эВ‰Bэ"ейсЊyўhТ,фŠюсs0_z˜sЁ-то›щЛG^Ж›yD™кб\ѕeШŒNЯv7ЛЃW‰бfGt{ЖjR6а:%лЧ<Д—йŒэežК=п8КfЇAя-Эи^bєYwpp s<єJ@ŸEBv;Т]а‚Y8T:–й§Ѕš<нЪ^7MCO`ЁзГFSьѕачЯ5јsеХE:˜э^KшЯFєjшЕачЁ‹!Ѓ9њд НžњTЩ„^; EЖ ТVЭ&Дl.ƒ&Ь† Ђ˜5hnGћВ)Г­šK IГfƒb#Кg—Dгf4eNƒолг˜+єЇ& нВЬ~ьшO3FSьЗUŸ†оНЃйKDЛ™ЫЁiЖ“9њ­кmаЉа2ћ-–й.їш’шw BџSU›џљgкƒ==šџiЬZ6—@ѓьжЬи?Cя” Ђ˜уl`tofŠљбœmл ƒy`3&ЃIsДоь‚fš)hк<m0[6gцтйsa4БžZoށ6oв<АCvєййбQ*єЮLбузэ нУчоаЬ`nбЛйб§#„ИЩОђn—ЭXjДl.‹Жmй=Ж|4#аG3G3}Д@є‘Кц6щбŒиTш#OєЁНХЖЦGAыЬюшC!Н5Ф&Ё[Жб< Э8є–€žАЇwWZєбDtлˆо’ђCзПкЎЊННMЃИІ˜{єžэАь€оюал šufFš]бЄљАTEЛлН-5>NˆЃЁй$Дl–бВyzd3’э†VЬZёЮ­šчŽ&ФЩбмAh›yZwŸ6Ѓmlro№цЂщ qаh=›ОCGмбакЗE-šЛf2šb‹“fэЛЙэНА깄D˘уЂ{Ю5˜а/šœЬ‰бЦOењ…кЫLОїїuшчЯЭпоіŸљБ#кЯœ §Ђšg‡ _х@я; 5ЋYбQЬzПЫ„жЏgFЈт“ЊЉш} НяeC{šіО%лїЖд1Ѓ§w‡ŒžjІаœ™B˜ЖЭ\џФЦЖZ‹>0t"5 m3oВMGДЩ,ЃƒЬл<уЭЎGьlЃYb‡š™еќt0лбwgAзiН]=њоНGTјcM§уeбїєЏв“uцgVє$Г#Z>тИ?y"{>|жDЁGј4Г§д §DAїf3zЂYƒfЬ„nйY<(}c0?{јF˜=сшбlBЫвзцrшњюlG?аЛž=ЫР&Ь›ѕнYЙyШш'ГBЗLљ.-ЃŸp-§dzВ9§ыЏ:4џRЌй™^ˆzs2:ЭнC…їPЮь€жБѓ (gC?$б‘Ь|“,§DЧ4ЧG?$бQЭ;ЭГХR‰{4mŽƒN`fЏкЮnпhђЂUѓ\аћ~aж <(ОПДЬО€жБsЁя/ЭГяџфhо\=Внб‚YУž+њAAДЪvC?:˜НDДчž6Ђ3˜ЛDДэЃЉ ЯЬ$Г-па:ЕЪіGЏytпE“Ќ˜ѓ зB2ZЇAŸЪ™быyЂMїЕ…иVt[5F­˜5hŽM˜ѕЛZ5kблэЫІЬКQф"hкLюj’lBwьrшН=йˆ^­ьo-…аŸъHє…3к‹эŽжЉ[sЅ&ЬеЈWeб„њmеЇЁw${юhJэє2,ŠІgэdN…VиoДЌ–ч\§–@П[њн4Д‡z:њŸўiЬџМ#д>hwЕzO5зш4h…\Н'›й?Cя5ŽБЋufћщцЬ5“б$Й(К'зuhY m0[vЕ‚fZCŽ№–€объzœК к<ъhз3щhуЎІШ#;dGŸЙБiь!ЅоiЋўл ZЗfонЭŽПЌЂыЬш†]ЭdєŽ3˜Y=щн]#šБјшўкК№nŸ­ЊЇЁOeД:hgДЌ€жЋyДbAя.н\Ђ’]б–—т‚бŒГ&Bљ kнa“НХЖМбкWbєag>фщzkЈЙмбL ЗЗ;4SЬGGОшCWt­о Gяжhfšs0КГН%х‡Ў~Б]з šFёM@vhІ˜ЇЂWQаЄљАTE›л Н-7hГšPЫW<бЦяє‹&щŠDhй§\Шќээ€~1ф†і2“ш§‰шнZRЧ0гhAMЂ5Ћѕш%а<{*ZTЇBялбкхlш(fНп„ffєС*>ЉšЊо7Ђ­?Џ1Ђ4h_ГЌо7їШі§8БЋ-hяЭЁЈ-фGь?Cбќ#m'RAhц:ц§GьбЮ#7єЁЈjЫћ\д&ГЌ3wjуйЃЭ6ЛњёюcГYT‡šЋємЇm›#Zу~,Wщ†“ ЕъЇOEѕЃ{ЄZЗ=›КтоЃі6-Ў#бœ{Šйнaћˆ;XЕ?QШŸ=удК}=ЩЌC?•Ж‡€ўе„~іŒWk^ŽгЬ4cFєЏК92јёЦи0чgЯjбХ4уЬЮш‡mЯž‰ЃІиIдеW7ан)иy3ЏN8kеМЙЩ67EѓІt=gюN .оа›ZєxВ{Ѓ~RНщ€ў•77j §PƒžlжЁ7Эш_eєCuдПaS˜ЭшMg4БЉлп&A+юЪ™а:v*4#Э›œ9 MO:’™woв)ш_ ш‡Іэб<ЈMш_НауoІ2їь hž-–J\Нs›2ЃŸXа<Оyк:ыі&/Z5ЯMВя7ЉїњС аїНбZu*ДТО€жЉsЁя/-Ая‡Ё5ъљЁys4ЧvG fzЎшхал §рI Д‰НDДчž.n“аЖЯг&t.ђˆОЗ$tЧОgAKwщЊъ™…РОшš•C7p7ДH.uOЯЭи=jжsG“DB?X њСќадЎž;zмешвTЎEЂ™#К4SLѕ‚аїŒшвHЅEЂх]Эti •НБ@tџЩЃ4O“„fК4N› fК&—†#аГG7hжoŽв$‡3ыП=, ђmЙшв„B!„B!„B!„B!„ і[UiƒoП- §›”щкп›rЩєЩfњїY Б§ћP>Ёež;š4ЯM›чŒжˆюЅрaцВhНљќмімbpƒyyшѓ.ўкWB":'лfцбЏf‚юущŽчч‚™CПR*ФVЬ-њ|жhЦдЃJЯЅєшRlе|9s4u$ьe—ŒўђхŠ(?лd–б_4шЋЬhЃ™ƒ­њЂAзe}“Бš/ГН*ŠО$њђХ†nsЬƒv3Зш/ЮшUBёЫ—ŽцЫ/CfєX:ГŠІЭsAПlr4 SА_FFЧJЇ2GCцјlOѓœаЮцY }=ДяŽEЧdП\ њхбzs|єYzsdєx–єTѓщФAЛЃЯ"Ёљ#в}vєzэ>‹„> DЏ ЂOƒаыІЯŸП|љмtqсgŸJhЗ-НаŸ hѓ–GŸ*йяыЁЯCM>їŽ ьєzZ6чAЏ…dДw0gAЏ‡^+Qшю‚aЋf=Z5›б.[:M˜ ЖжЌEзl—{G›6гhЪlBSцh™€“b#њтh7ДћѓчOŸІЃНиаŸ:Д›97šbП}ћiШЩ<є[oДЮœ-Гп шwяТwДшw"{žшЗFДп–Ю…~K GЖпНУ‹=§жˆІЭeа#Л3П§ЇKDkЬQ6ˆПYFГ§n2кЭ|xшm–аѕ*-šБw;эИ9Œf4аl2кбВ;і`цrAыиЮgвO@SцН›=юєКгеГIѓЏv7БыыTД#лН# w цљ w”Дц†ЭЃwЛц€6ЌњŽGюhF &ЃћGєhѓКЛD’™цЈhе}фжН#іl­92њШ M›эhЫКžш#/ДmƒДhЦxЇƒ™D3ІC%@oБ-Щ†ож МбѕЎ>бŒmuЕзomЙ {6џ?`ЛЊЖˆ> BhжЁGѓVgоr2Ћшэ­7ЛЃеNOлЧъџn‘љ ЗЙЦЧIѓ$tїX§п@ѓˆо6ЂЂЁынhfмž йЄyhйМДb.ŒоƘiž†йaшкg43B< ДjбД9%кЮ&МZcžˆB‡š]б4›мŸMяgsAєю6yуˆ9hыMЯ—­ЛCGлбакzZєpEtЭ~.dњTMЃљ+rЁŸKhУї/$ZИ"к-ЂMпнішCђЙа”йŒ~сі2; IГ§BШэgІбћVДf5ТœMБїЋЬh§jŠ9zкlІбоfНп†fЬd>88‘ЊЭ''SбћFє#ћ™ ш`–ићZєЃ.лjzєA“Ь33в,ЃЁ…GЂЂ{іОџј#!WЖќѕƒЁxhНљЉњБЦЌCšЋії цЊGь№ЧRz4Я7›аOбВ9?Кg?км4СqеГ&=ВЫЁ)Гz‚й ­c“т=ВTіs є3є$Г#zsГ>СVf[ЬZєСС4s|єГ hл§Аы™ТЮ…–ЭZ4?)ŒЎ‘’yГ=З›G?yв{ыЃlыcšKЂ7=бO3~˜ЪЌ {&…юOРnбbъішПпlFojбВy#+ZfЮMЮ,Ё§U1WЉ{šfЧGorшMgє‰~HЂЃ˜јІ&-В78єШ•ТЬ,цMХlG?$бЭMZq‡ўUЪФVK!6›у 3›бfv ѓќа:э§.WtVЖХМ$є§Д‰}?]vвїƒаЬ­~јhЭsF?!аš–…~0ДљюЁЂ ЭMМ# #›5lС<пLЁя/}шц>ўGS№Tfж™§бЊYF'3ѓx/4a–JozЮштцюњйc.ццNтˆЖ :›ЙKПAмvtno tГФvG—в.нГѕ?VџYаЅЩuд1ЁK{›Œш™ЂыtшYЃ5{š@—Іђ‰/ХўяlћŸ‡16?1г 7$tiЄšˆЎйzІUfЦ™йЬ]Иi)fЦ™йRЬ!„B!„B!„B!„Bh §VUкрнo‹Rџ&fКєїІ\0CПЩЎ§}j…l@џ>–QЈDg&Э3GгцYЃ5d7tЗ–ьrїhњ#›ЕЯ`vFчVШчЖwХb[ФˆжЛqлиzr›pё+> qgцlEKхлй=q8“Вн=Y@ПR’ю}Йд*њ7ЭЉUєj%Э:[=\•‹j§jUbжЙюВJA_ЩЕЇн§ёGцY‡и6` §х‹ЂЎмеОў#яЌЉ9_ђqш/4z•yƒcоЭнДП~§њх nр;;Zšsл—/6tеУЮЮ&ЬnшŠMэнgD7гnK%~љђЅй=рS‰“ЂSЈ_вhš€юO§L`Ž…VЩ д/s cЋuц% ]Щs@{oŽ@tTu6t<ѕЫ—љабnжKDЬqбечіФрДцШшё€єiфггг Дэ]œšѓY$4wЌЛзŽ^Џ§бg‘аЇшѕz§Й%ўќй}vG}z*ЊнаыІЯŸkpнХE:X}*Ёе-MБз=њѓ€VидЫ№,ŠњTЩŽ^‰h‰э‚S зzДРv gBЏ…T4Чž zmGьY зj4Кc;ЁCдЊ™P7фН=?ДгЫ0HM™Uu‹&ЬZtХvFћВi3БAъќа”9 Zc&риŒ&еyб:vД—к„v›ѕчЯŸ|а1д>hЭžўєщ“ћ–žњэЇБ™ЂUЖ7ZgіQOCП­бяо…яh/5аяv2ДйlCП5Ё}Зt&є[=В§бЎlo4Ч~kDгf‹:9К3П§ЇMBыЬ6Шссd4c=њнdДл ЭhŠ,ЃыUZ5{їŽckЭlЊ9нГs‹Ўўы†f:і‘#кsˆhy=ДvжGqаZЖЮ<ЂwMш&еьЊ&Ѕ‡уІ˜;}=š4юн*›@ЛЉ]б;R ZГfgаЛ]Хб;;:rУц‘Л3B—нЅ’і4SЩб§#hR MоЇUДjŽ‹>:šŒци y‹0ЯMЈ-ыRhІCљЁ-ЛК§?ОкbЕzЋ†ƒ™BoГэhшjж‡b"zkˆ3ЁыSаGGббŒIш-'tЧЎl; ZэД6W2Ю<фdца|мy"šауN™‚Іц< н К)аЬЦ-AЋ)rJДгКє ^*Z!Я}”=Њб"ƒ&Ргбƒ:ь…И­AЬ0ш”h;л‚ж™юi;:дьŠІйќуўlЭ‹аК9&ЂyЕ7кvч˜М;tш ГжнЁэhwГ;њy[ zМ Т а5ћ9п–щ*‰ц/H‡еЂй§ЂOК кiж"њЙщл—§тХта/^јЃНЬh‚ь–иQЬ4zп†жЏЇ˜S )і~•mXM1gBяя j?43šџњ+ŽYFяїЂ™С|p№з‰Xc>™Šо7Ѓ=ВЎg2WЉъГШозЂѕMDЫъЊIш}!ўŠG\hщ‘ƒš„юићnhgЖђѕƒšˆfl_Ž№щ#9гR?ЎШаQЬ š'зЙЈKа1ЬzєгЇ$š€ЫцЧЯžщб)аћЙnгˆVФ КNƒ>ШОЗiRSf њ`Вй Нљ+­&Хzdъ)f7ДЂ6ЂŸйа{’йŽоlњЕ> Vf[Ьє4ГŠоD7'ё цMЈ7 є=;њa[)t•dоьŽ аТŒыђЁUѕ&ЏцаТЌ{2 766Lш‡а›єЏУДєqа"К§R|ГнГUt яю–ЭВŠžn–б›cЃ™@ЫцjшаВ:Zbѓшё—z<з?п]йutє& Н1 ЊdIХЬУ5f-В78єHЋу™™‘<мЇuшўАє‡њ˜ыєфV§ЋœiжЄ:2иСь‚6Њ>ЬkvFеЭїыЂ ЃГфVэ„6ЋчŠЮЙAЬdДI}?]xвїƒаfІоg‡Оg0wшu‹Dда›žшCѓ@ЋŸLч€&йЂy2::™BпzіhžнЛG\tђє†Š–јЉЬ"оm"З%7Н`tzѓw§ьQ~ЮЃкѕг 6ŸaƒИmŽМмЃ%Ж;К vбш-oeЃЩЯЅбл ]мdBoЬЭїђаLўŽ\D ьвTЎ{тKБџ;лЭц'f:є№3<Цfhf{D3оМQЇ‹G7_xђЫќбmНИю—eЋ~хѓЫ/Ы@#„B!„B!„B!„B§Ыњ­ЉДТЏп†ўMJхя]љlКdГ§ћlаŠYЫў](ЏRŒ2гшпg‚&ХіяJљНuzѓ|бѓlб&Г њy‰IЖbЎš›й†ў#;кСlй tЭ M<‹0Я M?O1ч„šižњќœПіjЈGЏV(•FŸkбWЙ К>ђ^V7QшЖіМЛќь= њr@лЬљб§ё™ЄЙЋПіЫвœНЇA_ш/Г@‹‡kФU_Оtf š‚чFЫц§e–шЎ˜/П щб2;Ÿy4Я§В‰PW…ЂEx*ѓВа/#ЁUv:єЫЂ_fAЧeП\ њeTДщЖWж\dDGcmEџёЧйY\sєYєЫЌшў„єiцSГ­šѕшГ(шў$zЃ™@ЏзŸ?ЗцЯŸmш‘}Ц5нь‹^шЯZ6Џs8њTШНnњЊJ‹n'­Ќ7 w Г}4-ВkуŽTЛ=Ј[іюАБ}НЇA3вЬѓЎb6ЁЂЂїHєЮŽyн]2=њhЖh&˜až†?IХCЫзIтhh9њ(Кfз№ZМU•}Э:ГŠЖЌK˜ЗIєQкДAкЖИкЏ8˜%єіŒ>š-z[‹–Э)а-мнВЗ•DДZ*є–“™‘fM™SЁЧmb‹0slвœэИђЌаŽ /M›{4m.ж˜ЗцТhГ9?к…m1/­3ЇDлйa;z*њЯIшаAЛЂiіŸUсьа]m3OовtЭЏшЁЯ›llЋyъНУ §|кnŽ‹ЎйЯЙЬьбљЂK|ќЏПвЁ…kѓsѓЈs ДŽЭ_ё\ЪО=^pЭ­]M1ЛЂНЬh™]яq=šБR.h?3о7ЂŸа, šbя7щаЯ hV НoEз3šiДЗ™‘bкЖžо|pPЉџ:с 53Y‡ЖЎЇПy4ш`цићBђUК|ат#]'RSаћFєЃДєHTtнО)vЄb-УуЁљŸzЂWцЧЮш`Г‚цФM*[Ѕ?VвЃGvИYFЫfДj~–-‰Ћюн3ЃUqenвЁ{v94evCO0; лS>iДˆ­[б}*КfO1OCЋц'Š™FO2kюуšlюеЮшuюЛИ0“єYdtыvCЏ›xДР&а5ћL)‚ЙV;Ёзšcгhе†>UВЃзC2z`“hТœ Н6Ё;ЖЋ9 z-FЁvnДN­’uше*?Z;kХЌA_$FSцhчзa›4OGгl к—M›ЕъY uf;к‹m@;ЊНіДAЧьЈіCטѕЁПZ‹ЖoŽМ%д~ЭJVел]2њHЮ mй ,z{ЌКeЛ [іЖ’ˆV‹ƒ–е[hе\ нok™C“ф„шIъžэИ0аЙаДyлh.ж˜Зц™ЂY!Д л8чeЂЕц”h;;lGOEџљЇQ=ХЬўšŒІеў9Emйб9аўjГй€v5ыеу=єyUm!аюftЧ~ўœW; _4m‹пБќѕW6єs.ЫЌ%s•№p>єѓчŠZЛžbvE{˜Еl=њЙњХ‹ЂѕЋ)fQ­Eћ™аъyЎGWџМxЁUыаžfJ§чŸŠлZB?зЃ™ŠцІVею7щаЯg‡n†lFлжг›ўтšdfд” hыzzѓAЃ> 6jnЪ"КэQ›Zx EШъ 4SЇ\ѕTƒЖЊuцнv"†ЎићJ2њ‘+Кƒ_=8 нЁhfA?Ršˆ>H‚~ЪЃŸ>ѕC?Ў3ЃGvАYAsфЇMъЌUњc%tИYFwsЎАй­šшŽ=-ЉЛ/>ЛwЯˆ&Р?Ћ›-š$wшZн§WFWьƒƒДші”Ot}иъˆюЃбSЬ6є=§Hg~Ђ˜›}ЂВ#Ђї є&w ЌЈцЌCйГшЇOŸ†Ѓ+€оппЌтдѕoyvЇбѕсŸЅа›NшЧ zƒB?|H '™UіцІРюбїєcНЁA?|лlA?ЕЁŸXа3ЂGЙŒnнъŽю VФЩб›bдЄ;4Й9ъCx ГЬžlй›d2Кb?‘g&Ф:†™YШњW+њЁ\dtеІ-ЋЅаLБІD#бѕЙю zCиБЬ.l§Ћ7К~›‰™}аQаqеђ§КXшЈъЉшЅ ]:šЭ }џО:ч§Уb^њўиOƒ~2Gє}}щЭ<šg?xА<єƒх №•CЗ>бLш˜f’§ ЅшХЃЄDЋъHшщШш{z4—VаЂЕ;zУŒЎн)Р”: Mš&]„Ї2ыа—ГCПД /•dДž tltЯЮ…~Й@єЫlшx№sit™DЗl: ;2кxŸŽ6ъ˜шЋ+ХЌ ЯЮr˜уЂЯ" ЬQбgMгЬЇ‘бЊyE˜Ї OЛќїєz§yштТhциg\љбы єYT4ЗЃзM<КЮ„ЎйgJ9бы ДjށющfєzHFЗpš0ВUѓЉх>НЖ §Ь!hТ|Jšї$Џ}qсeNŽ–Э>h9ZЧVЬh­9M›чж˜ГЂ}й:ѓœб‡‡~h•уюсЧж›ч‹6˜й>ш(ьЈш‹lш:8ўTU›?}ZњS‡ў”m‚лаoп~zїnшЗžh“й­‡›аo%єШж›ы?їшˆЧж‡3ЯЭєQ‡v=UZ=в]ЅЧDїnЫ <)}"њ­'zјstшёюZ†зуМг%Впшžm43ђ@њЈш=M К4ZќФ:Ђ[v§пЭо­тСѕяrЂgощЧоЁ‡fzWBзПуўмDш‘]џzGЉEЫыѕь]2ўЪrheНM›чІVЌбsF4гЂЩ цш–н_)ЃMЋЮ­L:Н]ГЗКІЃЗЋђ З4hуЊZsДН%фИ$оюZzЛ кнЗ-ЕДlбД9ZeЛТЏ€ж˜к"&6а@ыб:ѓœбZsqtШ гЁни!;К4š6л=§чŸSиsƒўыЏTш?“ YRєŸ:фХhкб ХEџ9эfVбŽf’§gUM}^хТю•/šFЏdVиюf§'~о™}а/4їX"єŸ\ƒ™Ы§‚+5њЯbhГРўSъщSнВуЃџњ+ -›Ї _шПДhOsЧVФZ†лnz/ЄњЏ?{ІCћ›™ЦЌG[жг˜уЂIqƒІйЖѕ4ц,шЇДu=­Y‡0kићћ"к'љйСєZќ+мLЃŸF@s_гЂТЬ$њЉ‚~діgДшО‘]џ.њЉ‚~”}Œfl_щЉФ~$‚fь€,њЉ„–ЭОшgt YA?хаэ5AЌ$˜5шPГ §д­šгЂeіSЅ{їєlBЋASьЙЂŸeAї;™GЗvЛ ыbл_=J‹f њžњЩ€~ц€ž`f’Ybїg“іЧРRш'BѕзŸ9 Ї˜UД:h4+‚ом$і‡pН нўIЁevLєfєCТ< -В7›ž>щгбЛRЃ7аt{6,m~гL ћyѓl§XAЗ‡№’b =еЬ4цMqд Zgfs\єШоTЊwЗŒЎfЎй­Й;п}43R,БуЁUsГЛш_Дhеќ0І™5w:C"ћ?]§iу2šаJш8fє,hНљa\Гњ?FєЦ†СмKНБ@єЦЬаїа3Cпг y6cѕ‹pYшj…њЦБ(єИŽ}O@џgжшћїлпПЯЃџCЂGvYє§}_BыЬѓ@пчъбѕuГ€цй”AпѓF?рЬeаїМб„цоX zc&ш{3FЫlТќ“Ђ7ВЃEvzƒDЫьyЁ7œа‘ЭVtЭжЁ7ИdєШŽ-އVЭв™6uŸvCцЁ2шџLB'1[бїюMAЇ13ТШ<Ая ХAЇ3‡Ђ‹КcпПЏcгш‚;z@Ыfwt!sS(КЄ9>:ƒйнГЫ‰cЃ3™іt>sщŸнЋZж™чŒжš'ЂџдЂеў›#!кMВЃ'ЃЇЊCvєtє$5Iюа§•§чŸ:d[›6Gt€кŒю‹‰ўѓO эџ•цJfэhІиўIГŸзЙЈ{ы‹&§—PЈYFџЩ7\єМЯ§bHgў+дь„~ЮхŠ~ё‚PЇ@џ)ѕєi>є_>hŽ-›ItУŽЎ~‚VШ#Z™ЕeEЩ< ŸiбОцŽM˜9ДФЖЌїBЊ7?{ІA˜™Ц\ЁG5gЖЎG›#ЃIq‹Іfэ‡П­Q?%б.ыщЬђІnс™iѕО„і‰07шƒє‡hˆnрвяiє_U_ ћмакџGДш>Ю\Иф~aŽŒцдBаBOŸJьGbџ#ЭвЂŸZбM~цgŒVšші?Ш„Eўчc9бЌA‡šeєS­ЬšSзКџYeGSъ`4гЂ{ћ=УЌь|аmh6|M4зhB ЭTєН{ьз_uB?yђЄC?JŠЎП ’›c3ЋџZ?Tн:(єџlzќЄЉ[жnднWЄ9пыf]GЂŸ№d=ХЌЂЅQЗш^]eD3-ZVЧBoВц`weOз§*Ћiє†Э"Ђ9ѕf›јJŒnдcЂ…YїъЭˆш‡]iб›<КлењБ‚оиPЭ4zЂ™@ ЛD‹~Ќ 74–бSЭŒ$j§Єє†В9>дЈ'ЃіІRНЛєўѓŸZ§KKўхqЮњЁZ|ДJЎее?эЌet{*ГM9t3knЯњФY?’Oю–бЄ—GЧ![а›дž=_B:6š[њ%W}Жž-ЃЫС_.§RAыйКћхб/б";/\6›бПЯ­˜;4Эўн€ЮЧж›)єяГ@Ьњw :лdўЭj.ƒ6š96)&бщй6ѓбЊyoя7’­Cз‡СцeЋf_є*;š0ПЌ8vGЏ4шtl™BГ™ ЕfbƒА™ нЭПiо ѓЃ=ЬПѕЯбЁsБѕцљЂЕb}yљх‹ уЖg2ЫшЫ­šsЂц=СлєЅЫ„VсeЬsB;›ДЪ.‡оГ к-šЯ’Ђї4шKOД юЪcŽƒ>‹ŒЖ˜-шЋ+єW4ЕЅyДгЄ3ЃЉ{‡џі8;‹Ы> 0ыбš›Gdєi•ЗYЛЇuwщГØьг‰ш+Нв eѓ4єiW(њѓgНRв˜'ЁO'Ђ?gGŸ љЁ?]\\ [DEЗlЬž€ў,Ё/ŒhЪнГЭя‡ы.нІCЏVЄ9-›OIѓˆ^sцRhХмАѓ€^ MG‡АIДjžК>:“b‡ЃkіЯƒж™чŒжšНй‡ DMУ‰Л^COіa з…бтЉнnшНН№ћt”-ђ УиŸ?њД<єЇ}QнУлGнаŸ†мбGGёбнЃЇЬ§‰@k?х цишУCў њэл§юЫGгzеўФюxhс њ­7š%AЋWщбoЕшн]ЛЛлўО_ёˆЬ‘ НлЁ‡5ш˜“оQъй2КeЗшšЙЫХ™5шЃЃДhjKЋhбœэЦюбŒщб’y6hЦЁY‡ІЬт ЫЂхыо5ц*ёЪєш- ZЙа`Ю‹оjЂадŠZѓюvU.є–MЎјŽкаН9%šgo ‰;[П&оž9ZoЮЎйу7­ЪП№Ж…ђ З$tПУЋrшэh{K“yMaGЬmYSk.‰ЖЏJŠ‹ЂVЕЂis4Хv\˜Є[ЬбУуЬЙбууЬГAћ˜Uє№HVД—YA,­3OCџљ'žЖЇ­ц §==эПЃЇЁџL€v1OAџ) CйĘБПўJў3 ZgNƒўSA‡АЕц н§g4o~Ё1ЋhGГТўSЊПъy—Кг‘f…эnfFѓє §—эafFѓŸOŸŠш–э‚~A Ÿ=ћKЉ7џѕWš2чBџх…йЄYAзь˜ш–§W Z5ыаж%s~ІE{›;6aца"лОт §Lƒnѓ53Y‡vXQ3ш˜hЦHГ€й.ыQїш<шЇ$кi=ТlF˜IєS эл ё МAФ3ЇAKП7 Cџˆ§ЊИhЙgЯZ6U,єг… љžбзџЎ%Ёџ‡7њ™hіDцџёшQ§ћЧћŸ]Fѓ3Цт™eєSoєџtDG4гšIЖŠ~ќи MmмшGŽшgйб*›3+hŠЭ™‰]Э&Ёmflи§Wќа=›Б'U3‹gVбњIџЪ™eє“ЦЬЃŸ%DьЭ.zƒќ:єHBзПzвEŠgŠ~"Ёes~˜ =ВѕшЧŸHhХќьaг<бLƒ~Ј 'š4НA\а§ЕЄX@O5‡Ѓб˜™ЦнГ7•Lші рі…(™™dŠ‹VЭ5zSA?ВЂMц‡БЬU„xHd?а5[FЭуxS ѕц\шžнЂлГЦMшъ}dfшю€єСќЫ№†шfЮfфЙюђч;Ѓ9"лlюбЬ€цЫ„Ж˜7Ч+)tЭцњпŠўЯбџб EіЯˆŽdжЂяwнЛЇЂѕdcуСƒєfњ~К6—BпчђA7f;%њ~ z#Zeп'бњ—"gюа}ЅаїˆОч€юйsAп›-Z†KцŸН1+4uгSбZfЯ Нс€Žlиўш!:Оy Zo~жLЂEЖm0s№fFšuhзAш$ц}_ŠBЛюшБTцщшfvџ>…йЖ=]ТмЂUsў]ФЬЏ№bќ†]вœ дЌeOCЇ6/MГџ}ш fŽЮ%E6+є{ї(Жˆ.kUбїHє/ZtAѓgŒBЫ™цcfyD>чЭЧLжЂ“бЅ]Ц:Гˆfѓ6 ѕшвЏ–hF!„B!„B!„B!„Фњ“Шџ;D]еž8^‰žлGѕREьпg…~щ„ў}ш?ЪУ_вh™=#4'~љлoПy ЫС_JhНњїй _*h­šD—`ПœŽЮЮ~ˆ.Щ–ЭњџЯоП§Фul пe56иЦП)6ЩoC Iл+Nnж#даь&ЩЙйЫЩОыџПњЭѓЌУЃЮ5'йѕеѓЦ˜ž]|оЁъйз–ЊW­˜п5ЧŽCъ# Žš!єб8аИ@Ыf†M˜E5DMš96L†аёйЊљЧбЃГ„>фv4„.‚MЫVЭ5bNЬ%TУшњ`ц”[3š]]=ahcѓˆаццУУц)(:7ŠєŸ‡џбЂSмі№1ƒ.аЅњ?џMЭ™GџYїŸ6 ­Кc›‘Э1"49gMЈ єяqЭaаИ)њЧaєŸ*hE­A‡Rгsƒў=6њЧmаџћПјžЬЁи4АЃ4ёB Н З‚Сўєщ>ДDУwМашOкdЮјž~o„іeЊsFKЏC­=бŸќаЗЗЗџ‹’;u`єЇ>kєmншїСбŸ„ьаЗ]ќёПнQбяД3ћг'ˆm„Охбe(њ=(Ž‹–о?ЗЩш?P4Іc.йХџУбECЃs–Щ=њГ‚ўУэТО†аŸЦ.Ю ‹ўуя„FЭіъQ -езw}}wб ;)кJ}mЃnфQаjўьhЦ Хвалљ>§ў=6f_“j -ЮzhДгЌooџњKBџ‘-ГаеqfйкЮшš]?j†ўЋЫ}н5DCЃƒооІењЫ‘ЁUѕgVа‹iдQаŠњŒ3+шSЭ›е]ݘњЫ~вeЈYE;›vѓ \=‡а­š-ўыПўK@‹dэcцбѕYє0њЌјДЧ›ѕшˆшž§єЉЂюйgџ_[mюб__œўW]‡о‘Š…~JЂ€ўђЫV­EъgЯRЁ{v‡~Ў ПќЏ6ŒМѓЌjŒшnEДЇYAУФ§Ќ+œЙU[ЂЫs`л=-’qtЧі7ГЇ2šЗSшšЭ@є3Є`h,шўё\ІЬЯТIv™€~.ЂKЖŒ&ЭЯ‰­аџŸd~YОЗ(hмœ нЊktuі”B—я#уA—џ_}дјtкŸй]Ѓље(s@6~кЃЁcнeДЦ­!їЛC‹н ДЌЮшџЋшЏ@ДЄњ+-ЈuцTшV§ІњAнг{U?ЛџьatВ§Р Эв Aѕ.є}іАlєO4Њ†Vе@4ЎюШї[єCФ-™Ч‰–е’Ynй ZQЇAп-ZrKцПНŒ Žz hFЁЁ›žŠО_EЫьРш)аЭМк}ПD7“ш{tGVЬЃšaД8k Я™‡G0ъРћ!†6м:ŠЙѕЙ^­нбАЙ*’ЙѕS4ЦaюрьЄ–?чЧ\Ђ‹џvfтУщУі—ЁЩ` š1=4ŒЌ1 шЁMVнeєаŒ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхЅа%2?# aІбOtw48hЪ§TAO›ZєюЎК"iУЖBO4Ата<{Њ ЁА3:Ѓя6ZНŒ §ˆЖ5ЇAЗьЏšDДИAДтб/яКь%ТšГ4Ез™ Mр1б"Ёƒ˜є!-ВхVХ4Ћhи<.ДЬЭїющб2ћaW*Дl‹ffЄљ^?:œ™Ёц1ЃЫ<Ьо fh™-›наQt`3SМЮш‡(:Д9њ!ŠnFа"GпП˜9јУ‡cECц‡БЬFl=47Х0‡@'7ЃшžMЁЫв›ѕhтГЧ`hнЙwя+”=^єWшhf” š-а1ХБа‘ЭлпР ТѕwŒJаЌаmб§gОсаї@єK= ЙƒпуBЭzhs‰fœ™iахЧ<6ДЈE3ІЂ‡ЖЁufЭЦlf5Л§К3=ЮЬюŠ9—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—Ыхr){їю]ѕч~pEufGZбЛІ}!щЂцD—ђ,їARя`ДЈюќљч(ия0Д >еГпёЁhй<$ћ” z(ЖlFеG zіL5#jўД0Qšm`6@ЇUfљюЃœЕј;є‰NЇ†ЬяaДl–бЉдАљT+fF ˆйЌ>]UU SЈЁ1Ѓhе  уЋВpАД€Ь:Жš3ІЬŒ$‹Gxг›Ѓь§ћЄlxЮ1нГmаёиfцC­9%3Уh|GЇD›šбї• ЉгštЩ.ŸA Э2ушC§>$ушC§ў=ЎƒйVmmўO-:Єš4‡Dџ§#ŠўѓOKєя}qЭ&h@M“UєŸіhU}ЗбяAsLє?bш?џбџ‹ЂпCцPl ˜ГйЄЃЂ?u™n­ЈѕшьO$ИsиЂГ?њ“ЩэNDkїДjіfбКAsш?4hаь‡ўЄdВЃ+єmнЄFЋfSєэ­§> 0›Ёoo9є’[TУhw6d–аŠњs•)њ=jvEƒf§#dце*Z`FУцO’y\hФќI2›Ёё ‚Ђи(š2‹.ќ„б?&C%=*є]œДэўhNоЕFЖFГ`ЃюfЖCŒЖкеIбХЯ ђJфюж Ж+e;šuш=Э(ДЙZ>ж]0ГРwюЇzЊ•Уш4c!б§O ІfЂџ*ыбB#nwєu3у2qж‡4њЏоьˆ6Ншk§Э7п”џХаuЉhnG‹шmxпƒађ5пtЂ5/УF] ЭЉПЁбџюап6сшк`вЂ[1їшoћ*pљ@V22Л ПбџУЃkѕЗпBhY ˜ я.ш– …9sЅ4ЦЎШE<њпеЫЯэМЇЋH4убG(ZY4$Мь5ЄЎахЃ&шНДшзu0КОЄ1ГЦЌЂїЪєф`шзZYяfяэЩьАhY§КЋў{†жа{}ёа’к ]ФšWпЈN…nй•›fН5 КмпшŠЃCЋ~ š#ЂEЕ-КaM­‰‰y4bі@ j{ДxУб˜9*ZЛюh^эBжЂcl`WwzЃe1ИЮь…V7їЇ[g‡іЫЪьёЋK,До<tяўvGа%ЛџњЊ*:Дšџ(эFеЫe`З€ілz }еНЌŠI^.cЉЏ№<бЫe45.йюшe<є6]†4‡fяьаъ+WДh^n‡5гhѓЅq‰ЈжЁ-–в˜Ч‰юйЊyќhиœmЗiN†Ж\ 3Ч@уjых q$4Њ„обgg.вE™кaiмЬЃ]д†h‡•уЁб@ŸYУ бNfННра;mПЉBochИ:gэІFЭ>ш…1кЩ\єk—]6obЯŸ?GН†hWГˆожЃ;7„^PhU§ыЏl{[eЋшГЦќœ}љх—Їm‹@цбLQЇDЯнаъЌЂчш~}оЬCЯ­аТ  f"Кa#w нЏО3 4oжЃw"Ё96Sд [0Wшž­yю”п DаO5шљhаћiЪžƒhy‡Рф8шЇOuшЙŒўђЫ/YшgЯТЁ+6‚nю|…™IфчЯЇšUhFwvžUD?‚oзŒIшщЈа šЋ5wъSљ •,ЃНЩВYT#f­.ˆš[uГ GЬЯЋгka3уœ’ЙRћ“На/‰A7HЩ\нРŸТшisR№ЎŠV•сЭ4њЉŒž6Еш]`Eв†M Ыth@­1'GOM&=шthа ЂKvyЏ:7Cшъ№`Тœ ‹3€Ў<&Ьр§#,лЭ<,33FšGŠЖ4ў=šкџ)2EџЮ•Ц Ѓџ30ZcаўљŸІБЁDбZЂO†ўEџiˆnйПKХCгцсбŸКzs}‡FЭZeыб!иŸH4ДЁэаЊй§IHFCw;4`іfбј Ч€ўЄDяш}лєЧЉбЊй};0Kh•§ЙъEЗьњ'`hw6dЦЬЎhаь€ІйaбАљSe+1ЊЬ аNlЭ4l }} ЃлЧIГ„†o{:ДёQвœyhДљЁнœa‡CзlТ|ча6gК‹hˆ С­ЂЬУ oœатaу=7Z|)Šь!_4ЋаЂ9<њ&Кf‹Whо[ДшšЭЏš-иЪiєЩаЊй­˜+ЖxЭ7п„@Ы0{ЁЅkє7ZєhШьƒ–ЏљІ CџеdŠf 4›Вƒ џв ПUЬ)б"НEџ ПW2‹nй*њпџ.б xdшП$4шхD/Д/л]ВнбЫршоLЃMз#ЭEлл5к‡Э™Iєе•+zН0F›ЏIˆД{aŒЖXTc'Кgƒц‘Ѓas:ДнВЄ™CЛБE4ЮЖ\1‡A/"ЁФа‹Фшэ;ˆоŽ„ойљэЗП к~iˆ Ёэс0ZЭХЌЂЗƒ !s<єЖ€йцpа/zўœ№hˆНmˆž#шErєЏПn СшВyƒўВшДIh•нšE4l К3 hФНm„ž[Ёw"Ѓл6`Я­а’y‡Б!аsc44h&ЁЭЛќZe#цБ€fкнЬ8ѓS zn‰VЭЁа%Л7сь9‰йˆ9 š7›ЁŸkаЊYДZ0+шž-™4ДAѓЮГЊшЇhйzЈу™!ђ;ѕXzЙ@ГtjCГ]ž mjж ыƒшЉA3ˆ>д›Gˆ>м/ЖDЧ`уf]x<47f]>‹0CїРlЬЬHѓАhдЬH3еУЃЉ- ЃO€Іvєўѓcєя\iЬšUhP  €ж˜єŸV‹ўEџљчДшraШ§#ŠўГGjЭ t 6|у =єЇ.ЮЬˆ9shU§^й2:ћ‰†цl‡VЭўшOB2ИsˆhE-ЃГ7ћˆfЦhнЄaГњ“œfG7ш?џsліGrДbў$ЬBЎКEбТэƒahЕjЎдZU+hD­A;Ћ!sє‡fЁб йЈпгъцOяЊуЃдˆ™%CЛЈ1tiбфK1(њњк™%4|ЏжЁ’цЬCЃЭэцЬ0; КffKєѕрhЋ“ш4Рކр7].цkб }$Ё%і'šƒ34yгб7BЎц}-^CпІ­б 6[Ј•ƒн…ЭЬ™нб5›_6Ћs:ДjvG—lёšoО –w5`іBKз|гЄEcf ™MеZОц›o`vўЋCЋМaВЉ:њ[1iSЃъh‘оЂџъъбп™Ј‡DCцaб-[EџЛDƒрфhL­˜џњ7К5 ЭбˆК6џ‚6иб аЏЫАQ33є^bte~-ЮМпеŒiб{u)бЏл@4уаퟘ‘“Ђ_ ш^Ѓ•хZ5ƒа<;КƒЃцўЗm_w{BCЂЫ@3ЇоЬCЁ{…ўЬSн˜wv4hуitЁоnаюjnЮ4кXM€%ДЋzaŒЖXTіR/тЂAђHбћЂ2ўх4ЁЖ[з}ц‡жЈmVС0кaƒ,ЂЁauє"-z{;s§[ZtqБ{1ТhHmm†д0кі‚ •\Ь z{C—У6…/р-  sAЫj-БЇ ›BLЛ€.Aƒl'4cПЖ ЛiЯЫžCfЁјш_3†.яѓy‡>­‚Щ*ZU{Ѓ§u[VCшГГ§eбщiчVЬ*ZQ'CЗf}Š˜@ƒъж\Љ;4bŽŽоо6ѕм -šwXh4л6QЯEє—4zGFГаhH™ѕhpакбЬБЫЏU6bюаиašIhw3уЬO5шЙ%Z5‡BьъПO›pіBїъS ˜УЁГњЙЭt --›tЯ–Ь к *ygчYUHєS4hž=8ZОEПЏ‹oЦбьtхWuљЅкпŒЂ™њ%ИrD4Ф~PЃ+јKѕшаFЃ†йAЬ рBшЏ„ŒаЃ™cЂupє1vGe†~ЈИCЃШyЂш@ц†­ˆKє=Žm~ЈаЬГ0Eo$КgлЁ!ђУ‡AЭоh^}7{Ѓя`ІаˆCпGбЁЭ$Кcџэа­7‡GУь{ї6‰nCЭƒ янѓCG0ƒь{R>ш8fM™Q4тŽdжЂЩ[žFЫЌ ЩA“hEЭЌа=аїSŠyДl6пг";ЙЃЋfъюЈяыJh4ѓF'7WљЁ‡1ћЁ2CpCєbЭpєРц6€Э„*Єюi=ВЋuшВ=,JgюЛ9—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—Ыхюjћ@ђ5е™?# 2ЫшƒТ|0ˆjVЊ9іAз?‹†ГЖсц}0*t)~W„Јі„оšiєСЈа™D€шЁрНљЎ 91СІбЉс3GДlN‰ž9ЂsBіЬ}Є1ЇAЯКx4ќгžnVŠŽ@sі D#o‹њh@tЫбѕwq4_zv7beаГй!€VЭщбъ^юбхA”20•'`ЇGуfStњIЋцlЬ FC[$žљbўБ3™еQЧCЋоЦ,KЏ5ПOЗЋMЭ:єћ„hиܘbюи„9еAаъ iєћ нбС 3€ŽСЦЭ0š‘ƒN†ХѕŽ†бхГЈ=Ÿ›нб9$š0;ЃM™aє{§{4iбяєя\ёЭ7Cшп# эwtљШŠhtЫў=!К5ЋшжLЁй шЮЌ 1ТцЬ :лв<єЇ&#Г­ВetіЇЮ ЁС[‡Z5ћЃ? щя"ZПAГ7ћˆfњ3ћLšE4lіCбŒ@ЎКэЂбŒ!jЖlўФ™ЧŠVЬЛ}д §Ч0;2ъЬуDƒцO§у~ш–Ёни:ѓбZГšп ёбТ„y(єѕЕЦ ўЫвgMПqДљиНY‡Іmqдxoи’й]Г Г%ћDы}cюO“Жлб.ш>E-] ™на=ќњк­ВU4 Жb_ ‘*ѕFЫfSДr§ЕŠЦўMк-~hъбŠй-њ›(hеьŽ.йт5пљЃy6b6eƒhщKДjў@УfwД|яјІ Gџѕ—|ЫћVHD#b/40i њЏ Эњ[Э­-_ѓ”ЬЎЬU=њ[ ~Эсбqhмœ­В[xў‹CЃтЃё1‹ц№h•§КШ п9sєk§—z/1њuWПQz4cК|ў^SJєk§ZA3}Є ysJєkЉђ{-Z^­Eѓплу§КНU їFЎƒб={l h`=Э]7_gѓW &VФG БMVкhe'sШЯЁCЭМЋЋŒЎ[.cЃљюњ*:&ћ ШНМƒшeS{Uy}ltЭvG/%єY`4lО25ƒш%WcіFзGг“ц"УХ4цhмlŠVй‚yYŸ2юЯ.б;U„йНŒ‚^DE/QД+ћМh-›§бчz'Z1ш’]Ѓ)r2Ÿз/У8hиьƒюЭaб=sh{6gŽ„ЦЬюшѓˆш’ь m?бл­š§бч‘б€™D›АЯДž=4Z6‡GClmЪ>?WЬc‰>wD[šа8ќмmkVблЮhиœЭŒжГГ„fь7ЎPhdвX 1ЫшпДЕYaoЃhн‹Б7Ÿ§AєЮЮoJc@/3v0§Zd‚юсŒЭЋЪgŸVЕk-Є˜эfцбл†шy‡>аВ9.КMDУьГГy‡ўђЫSŽ­˜Gƒ>ыаЯ 361Ї@Cь§МЈGŸž™Ѕ;u:є|ФhlƒЬtЯ Э аsc4lf!ЬЛќz{[†#f-Г3 cfœљЉ= КэiЮnп y4ЦNƒ~j€& MЬўшЇ(КgЯбАљYQHєS4l†а D?“аЭ([обхgВюsSЧnWбЯК‚oЭ8єѓhoГ„с§U­y:б2[‡.‹a†ан +ѓE›˜§б€™c‹цђЋЪ\ДЛ[Ђwwyv{u #ЬIбЌAO;єЎ€юж”аВ9КeЋз7ц]з~Ÿ3KlХ­^>mЬ*ZИŒCЋцxш2Рм%ЃХiFgєа*[EУь!бЪеw­^mŠІй1б”yЌhB, эйёаЪ•(њхhаъ•њe‘{xєKkДЗeыа/…lа!Ь0ZgњA‘jўЊЪ Гу  _ЁЃ™™тm‚бm&ш‡c™bіG?Œˆnй”ЬбћaДjіC?бСЬE€и}џўCЁXfєW†шћ:ЈAп+jЏјЪ}_Aї№АцАhеќ0†™@їpS4`Ў m‡† Гянуй4њў§z? }O‹ОOЂ#˜Aі=)н—ЮЌЂeѓ]@+fc4Ф#њОЩЌаmаї•в‰yДjvEG7wtРl….ялщМ5šYЁ!s‰NjЎЂбŒiЬїг‹§бƒ˜И9z8Б)zdц&=>o‰ЉЙIFзUлtf6ns.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫЩэѓ 1hHОF:ѓg№ ГŒ>(D4+ећ ыŸEУaыf„ЙWŒ ]‰пН{‡Ёїs…>3CŒ н’5ш=|6›ѕhT=.4Ід4:1|цŠ–Э б3WДbNЦžЭT4ёі2 є DУя0Эщfј$ЇaЯ 4іЖиЩVšЫB7\ БћУяњвГgњ„>аЊ9=ZйЫК<QFцЃђию”hѕ(šMбI'ЬљЧжЌАa4ДEЂ™пЩ[Й1џјcg>42ЋЃŽ‰†*ЬвљюZѓћtЛ63ХЌCП‡а‘дˆ™)цŽM˜mЬl‹~?єъ–юр„@‡gУфrs`цCrа :™@3шcGвYуfw4‹ŒЦЩюh6 нв(њ=ў= š˜3‚~ чŠkЎђAwьп# эwtљШўѓCєяЩаЌ5ƒ“Ўб š33Р§#ˆf‡џi#ю:лvЮѕ”1Д fбŸъŒцЌEЫГVаAиЙsќЧxдХЛI є'>kДvWCfoі'н<„Ё?ў|лЅлд1аЂљгЕ§ЙŠR› }иŸdєuovFХEЫцjжнЃfш?u,4`ўФK?J4dўд›Mб€šпек Яyмhнœ}аќ ŠООІчЬ€YъЬcB‹W@шЯл :ДщЁюМљZa‹hpwDŸD/šI4ќЯ§žBпдй›EЖВЃ‰-mЎ+|й } ЂХkрOKЎhaф77~ш.Э9<"ŠVйяe5HЖa_ЫhШьVЬІhХ  Бо5E+ћ3ЛЃ Ж4шoО Œf0й-]ѓЭ70л DВ!ДДЁmбЊљ[рN-ЉПi#а)ЗМo…тЃISъвќз_в П•бќŠађ5пHЩъЪ\ЦЁПUжŒŽ–е њЏПz5jNVfнТkє_=GGkGЂсЁJށ–еЏЫюњu—|їЋЬL1ёдН&#sєkЭ4шNЭГЃЃ_Kё7вЬ6їПpqЯол-›ЫoЕhy5ЭЉSЃЋLа{JЃ_УшŽ­‚Gƒ†ФбќUƒ ‰бYЇDl“…я$ZUЇEяъЪЫ<кoаCMњ ЖйѓAWьршшюЋО€шe2ДїDЧT_ЩCGd+шю…^.cЊу —KQ]ц]Б=аЫЅЈ>ѓG/њ/r™сb$ЙQŸљЃљ“щc s}^ЗПКBзgwfSДТ^hu‰о‰…^.ƒЃЯЯЯ‹ЁаŽьѓѓV -“%є/Пќтf>чЖttћJЌаЖъsђ…Ш0ѓv“€ЖSsцРh†яgm­цЭЁб млкм}Ђ)Ж š!ЛC›ЉЯ#ЃUГ?њEуъш^­gŸЋh§Ќ‡EŸ+fЉ­аЄšCsj’ ˜E4Ђ}юˆЖ3Л qјЙ#кв  С=-Ћ-ЬњUР­Јй6Џ>Уд1Ыhі[_(є62iI Ќ„˜%єЮЮoВккЌЈqДюХи‹ы_XLаuоj­Й[їSVЬ4кСЬиЏe&шоЭиМЊ|њiU+_H1-кЩ, З5шFн˜чљДvRt›ˆ†g}v6яа_žrj…<є™`юбЇš7яА h† k5РnбЯŸ?џђKNm2gщN=‡бЇЃ@ѓџŒ˜tЯvB;šy5cZєEЋћ4Г ц^]~Н­ л-Ћс9 hs /џxК­ЈГŠ–д а•ИŽ˜uћ^ШЃ9ішЇh`ви@ГршЇOQ5v‡  ѓГgЯ‚ЂŸ %3SаЇ4њYSј9уlis„дaбЊй§D33€нбїя?Šd6BeˆОO CšєНВі’ЏОЂеœYBї№ цРhеќ0‚Qпkƒд80W…6‡CУƒŽb†еїю l}џ~НŸSЂ!ЕˆОЇCw%3Cъ{RІhP-ЋeВR Ј#Ё%Жњў}ZЭ,Т­аВYTЧїh•l‰ОŸамв§бїYBo“ЭtцтЭ&Еb‹hІ1пO/іGbVсшсФІш‘™ы4шбyыj1‚ЉЙNAWUлЇš;ѕ€Њ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.7\ћ\C[LлПcш} ЁMК ѓ˜бГ*PЭСКўY4ЄЗlf„>zжEЃ$є№™!њ`4ш™…>бCРgwнsпНгБqtZ8oО+hСмА]бЉи3ДjNƒž)hŠ пЅSГgVhЦŽ8ѓб@шІимQ”]щйАЙFhеœ Šty<ЂŒЬGхБн)б:Г):хЄaёЛwх#эсЊ&hh‹ЄF—ZЁеQЧCїї ЩЬФCЧѕ{ZнеБия@Дj>40ЇBѓЏ;вмБ 3РŽk~Ї5Sшї бђЃ7џј# ЎрЄ9Сyšk4l>д :>уЛЃ об=›БИlГЭ"Ѓq1ОЃuшњйЉбЎf §{dДЮ }’ІаП7Х7‡CџM˜I4Ццб%ћwЁxh3ГњїDhCГšБпcАЭcB›Ж‚}эvštt{RЂњЖЩ эЫОv@юЬУ е3mѕшЯEЗZvџ3nnТВUѓug+0_їМ‡CCьАfњѓ hФЌA–аќЁ)жGИ‡`cц1ЃQs4ДATvŒAп%t…)л ќOƒаІ'бл :4Z6лЂMvthД$Ў kЦ}у€60“я‡~шЎБЃ!ѓh•­ОНb+Ж‰§ЗR/Дj6EˆўяŽюh@ь/њ&86ћЁ%s‘{OtfG@ЋцoBУpъ–ї­ан@;0КgЫј§Wў–DуьtшП84<шo%sztЏбuqЏ=ЁН=yХјшзžшНаЏЛф%Ž>:jŸНз4њ5€fFf™c ыјca.ЊЭќПі*fšЃЂћћыаŒCCцaбe-ZМR4яI-­& qsšwD ­XЂeЏќBЭPs‰V†l|ѓ‰с&ы’fvu•mДЎЦ ГCuuбWкl…єшЋ.Wѓп }%•бЉа<ќџ&zY” нТ}бЫаІKтЂў4w_j0=†.ѓA/ƒЃћѓв)Г;z)TГЯЮќиѕСєѕ1и1аЊйНŒйЫ%`юаПќт">?_DEЫf§‹њ<2Z1 шГГ_ичU)б­й} нГ!q{ЫkбvьsMБэбАйЭ›CЃkЖhf C›У3‡ЦйЖшepєydДzп№GŸпAєљHа6ьsmТіEw 4dŽ†юг<šfƒц‘ЃЯбVf'4?7@CП и™!ДfOhмЬЃН АЗЙzД ›0shhƒ„D3 Ќ„˜ѕhk3fZџbьХЭяYњ7Ѕ1 ‚9šБ_Ћєhё-f^U^sZ%ЖУбŒ…Foп)t›ˆ–й§/*šџНpŒhемЃuц0h‘нЪУихП„єц/П<иZѓNљєшж ЁeГ кЩ,Аy4єbфЬѓчЯK4ЯVЬZДЋ˜G3єм ЭД‡Йƒ3 БчZeЫшіЇ…зhеЌЂчVhF ˜›ž>н&й§Žюбјa(:dOЕh`в(:…љiЮž“h‘жŒЃE3„ІЬсбO…`ЖdюанЛyaоyЦо Ѓe3…†ЬЁбO•dtYofLDЫlа, А-бЕG›˜c yЖˆ.ПzЎ {v{ЕЦœЭ8є—hйнГеыkєtЪЃљпbTЖbŽŒЦЭЛšЛŒ4ЧBзpѕъщД1Wѕh9B \]ЁЇ]•4ЧD?} ЃЇzw_‚žЂqs\ДЪž6эюъйCЁ•ЋяZН: к›эd/š0НA,Ьсаžf ] Ѓ_йЁ}Э6ш)ˆ~9jєTЊЃhŒ ­7ПфЬvho3ˆ†ЎSЬRцh3„~ Щ,Бt…@Ч33а§0"Кe?PђC?,ŠVЭ~ш‡ :˜™^є§ћ…т˜1є=-›{є}аŒ яUЕз|%…Ёя+швœ дŒАяu•WLЇ>шВаf}OB›Mњ>Šnаї„Ъkht‰mЬ :Мй­™t…ОŸ­Вя)щб}mїCЋьhеLЃeГŒŽfцр€™D+f‰з\Ѓ™жl‡Žlюв˜ПbЬ Ъk†Ьїг›6…ЭїS{C 1Kp;єpbwє fŽmŠк[…˜yєшЬ]*КfSл˜K4Г9—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫХnŸkh‹iћw =лE7›н5єЌ Bѓ№ƒЎ щ-›ЁDєюY>PбЉg3Sє„‚=›ЃtrіLЩ–ЭaпigMЁВgwЭ“ЫМа‰и3ЉЕц$ш™‚Ўй‡&hРœ‚=Cб њ@;шъŠ7;PeNЎ–яЮТЄQŒ ЫXVй*љЈ<Е;%5ГYsvцЈбяо ц-ГA4ИCт›g’™к пЃŽ‡юю3ЩЬЁE8†дqи3=SЭ‡zsЊYїP ˜[6ВЁп#ъf ›k8iN2jщŽС™ДBПŸN-пцєƒ><ЄбŒ)шЗaЭX‡FЖєQ‡Vеƒ›5hЁCЊA№Ќ~ лб&h•]ьёњ1kѓшњ|ЮЬ§{]Ds7gЊy4“ЬСајœi4ІаЌїЦEЯ:3ОЃбŒ§Cэ8gGt Еуœ]бAдзŽsFй:tusш кшюЁНен™”Vшл&GДЇZ96Кfї?уц&АZ=ˆWўќљѓэ­vж4кG­šЏЏ# vXsъј8бА9 Z…‡5kаŸЋzєи§ƒћIкM™эаЗцh‰д]Б“ЂЛ+"ЃOЂ7@їWЂџ@6ˆ№г є5[?ш˜шfђЁЬ§ŽўбЭ Д8e{ЕоЬ~D>N{ЃoИ› 4h‹ЖQ†О‘ †ЭZe3ѕэEВЅкРŒў~шŒVС6hq:ДЉкШь‰f ~O ŒЏљц›o|аШKбC-Йiє70œBЫ—нВУЁQuxД:ё§WUё›K‡ўі[ЉЂkѓ_ќnЭ{ЪЯMцр5њЏПTЕhоSд^ћУ§КЃл;Ч^Srєы§кнЉ%vBtЗЏKsq…vа23'A~ЎЎЈЬТПї2ЭЋQГ6kаEZИ˜ѓаЏA4Ь{{#EKЫy›УЁ6ƒШ\‚–ињuI3ЛJ„цпa К$Шњ e{ aЖE———јƒW8кhёXhВЛˆОjSЭWcE_hГPt<ѕ•”=zѕпЭУя"кьuHЁ—Ыtш‡Н\ЦQcц*/єВЉ?Эн“к=Н\Jъ3OusЦ{yдqєRЈVŸyЊkt}@sДЂVЭўшEh4УХЙEџђЫ/.тѓѓETДlаgnшѓШhХ,ЂKЕ5ћќМUЧAуfwєЙŠІд+УшээЮЬЁэичšP[ЃГŠ6wѓцашŠ-™Š6Ÿі9‚ЦйVhu;@ŸпAєљDЫfAТlˆЖaŸЋh§Ќ}банУ ™ ћ4ІйчcElиЌEл™бћм ќcivиг7sh`дЖh•ННЭЋЯЮЖЮ,ьh­ЊCЂ†V"MЁћ-ZщХlБ аП)љЂЗC БбŒ§ZЅG‹o1ѓВъљЇUђg;ЭТЁ›$4Лш_%Д4ыж]›EД№;жPh`д­zЮ™eДЮМУЕZd3І™uуа_6ш–­5hYнš4убВйэdи<Кƒ”џLжЂŸ—ш/П<эg­˜Ён! ]Х<šЉhYн™аѕЯ anсеŸлѕœ@Ћl]Б}С5Z5ъЙ‚ІFЭ"Ѓыžnгj 95dбЁz\іTƒƒаЇъgЅИfV€›№YЯєs-ьјцjЪИ4гhеМГЮ§”™ЕdюаŒcцg}!аEєS-КEЩЃOyєŠ~РќTNU3ўЮј€fђЌdаЯž„G?%бЕ™G3m`Ž‚~ŠЂЫ/Ÿ+ш^н.J›у ŸЪfўї•§%‡fєГ$шЇ КЏFOЇ<šџ…@eЫцXшЇZ3„ц.ЃЬбаЕ[Н|к˜wЋzД.Ž.Ÿ6snашВ”9&њщS=эаЛ˼ҘјY€w[єД2 АЇMЛЛzіˆ&э­эЫЦбрхS ѕHаSЎ!7†/†і3‡@П|љвэIўћЃЇb-И [>šЙЭЙД кп ЁWѕфщєЅ”1:€YњmќAй*ЄvBЋф'оёjЕlЎ ‚цЦмЭњXєУˆhЂeИ ™‹тЁр•бВY~ эшшћЕЗ+ЪœQє=-oiN}џО„nн!чŒЁяU5—l}%†ЂяпППіP)јœє=Нх….нAЩћ^_‰žšЃAѓУ‡ аї$ДnвЖИlх>ŠnVбїФŠK4›КджfоЌEoЩ“–бїљЁі=% 4Є?PGAKpOДЊN€VЭ4њ…Œ–ебЬ=0гhХ,ЉуšK4czГ:ВЙMgўŠ13t"/ЈІб€ЙQ'5361Gƒцћ‰Н€к=ˆЙЬ=˜XPлЁ5їjcєРо:єшЬmКfRл˜K4Ћ~СЉ9—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫХnŸkh‹iћw =Ћк—ZE7ЛsшY—Œцс]џ,z[43…> z&…Ѓ$t ƒG€ш/&а :§Д!Г :хДA3ˆ.й8КlXѓИбˆй†™ДЮœš‹ Джœр.B™!єzs}*Жж|P•Б‡1›Ё@ццќq]Jљў§лЗу@ZЁ‡šєЛІ~GCl§ў}К 2CаЬ}4z† ™€сG@яЋ“шгАgњACц”hљХЧЃ‘@sƒVйо44hнš‡CC;šFwfІо­CГ•{ГС uheWFCo)КMэщЛ2Яœ šЋFЬ:*лЩь‚О 8j'3Šц_Œ=ћэ[ЋгTНЬЁа7oэŽ€ѕ2;ЁKvПОЫБЦЎhѓ0ші1м\Bя€УОv4‰.Oяs2;Ѓ§йзЮhЧ=нЄi‡О-rG{ВбЗ#AѓxњЖЩэУЮ;6@пŠЬ›F3vЋeЧCУцыЮьŽ~ ˜ЙCщ1єчЯ4њН€ЪvFОƒшЯgЧAыЭ>hсGC˜=ађO УЦЬzєgДђу‚ QГ§й­ўМИhсЊ;‚Џ2Aџё‡;к’э<шБЃё{Ч0hwГ јаЎћй §D mС60ЛЃСŸ -_уŠЦ~fFchзЛўS§а&[к}dlіC›м;pz‹ўЋЪфЮ14ЭCЃ_7Сьђ Р\ЁїšЬа†l#єы§EгцєшзRZ§7HСЌА‡F3ЭH4fއцйќuъ‹CЃf#4lіGЋцphФ,БUtзУіѓ8аЌAKыaћYBуцphnА4ОКmb–бм#бај[yйEіиeўьЋЊдш }щ…60;Ё/И3СОъ’ЭWWC / аWЃeіЅ”ЦЌаcЁ/GлГ/”ќб=н ^OЂeГ-њЪН\šЁ{ЖbЖBз§пD—н-є2š6ћ —]ѕ™Ьхє>шіИєйНtBЋfН­В—B=ZЧЬК> 9Z5ЛЃys<єr ˜;є/ПиЁыѕЯЯQбВ9њ<2Z1+hŒЃЯ4ЭЖEуfšЁшsKДЁЙcУтњ@ї]В‘[№ямmnfЄYEџbˆnЭqаŒa;B—™ ;sƒ6aЇCwЋ цБ љ}ЭЏšGˆж!ЭzД•@‹ьГ3•M˜94ЬЖ3‡GŸMУЯя 6ыа–fG4ЦFЬZeлš!ДpћАBŸЃƒ‹Vйа-Яlƒœ#hvgа cєoСб[‡^шп”|блAа‹ШhЦ~Тбд[Ьщ)ќ^иЂyјццб Н“-ПyіМJD‹ПЏрлc(є\BŸrhШ-ВЃ6Hн\BŸVеlа,Ёev єœ@Ыfuа*кЩ,Аy4Ьf F—lХЌьhЦжзyДЋ˜G342iCєz^anрѕŸ*ZdЯЙћђЫ БeєzSЙI|Х%њБzЎ O9ДvKsшfіИJDЋdЎ Пќ’SŸъюы\ЁЬ:ДlІбДй§ИыщSœнп9Ъž?WбќЎж˜ƒЂшљHбu0{ЎEѓьиhй Ѓe3ŒЦЭ"њIh3Ш_ƒЯ;ДЬ†яаeOЄвЂ™mbцй2šIшђятО62GE3 нšŸ7f3Дjށnй§u§ЧЄЪќ|:эб<М§ЛЦœ Э8єAwзkЬqа5zFcžюѕhЙVќЌhшi‡Fзi&а%FO;єю.Оr<3Ÿб˜MаЯ@Уߘ hЧьЮЂУп;B q6j~ђьY,4m'Zc6@—ьДhфњ@h/3ŠЦЎ‡адб~f[єDПDбА9-z Ђ_aыЇDыЭSСl‡і4ье*­yЪ‰ vГŒ~`…~ЉAЧxбКLа/Ѕ^МЬрлKHє§@k–б9Кf?#ЬSНymэсCˆ ›yДlжЃfФ\„˜9ДbжЂv‰ьPf }Я§C?ŒaFаїЊъ+ЖŠшЛЧЪJyнЪЪZеCЅаf}Я­š†6ƒь{\5њЋ" ]Вk4`. +†аїє–‚–Э5z…@7+ш{R-Кeѕ•ŒО_TТяп‡бkkCЃПRаїє}мЌАqt›|ЫЛЯБc˜я&Z„ћЂUv|ДlіGG3wpХl‰VйqЭ%šшЏHє}йм4™ШhЩќcЪObGЛ?BЋцЭв™+6Їб€Й(Ѕ6zГФЖE#іCfnрЖшњsѕ8аВ™G 3оЬъMRўWEзьъгh5сЁЅ\•™M`.бl…5–™ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—Ых†hЖп7ДХАйŒG_]ŸїО/5ДŠnf€>hШ(6ы’бќ яŸџќчлВq˜ єˆўч€ш™”9КvСŒЃ`trЖ"&аz€iCцБЃA3ˆ.й(К‚kvD'R#f7є?џ9ЈChа д(Й<ЏBыШ ^Ј™!ш%еŒЂ‚–ХхQ‰РЌ2WhU ЁЫїТ„hТ\ŸBЉAз‡RОZQƒшї :Іš‡ОЋыw4Јаь}QК]=CаЬЭX*є A3&*ЭЁеу™ДЂŽУžЃ)s‹N2kљХЧЃхsАл s‡–е1оAДМЃ аŒНoV”ю!)бЬнЮYAG`wg7єQ:4`žщv4‚.gdWCц:F a3‡f1бЄйnsˆш˜Г&Эжш#Э8ny–jРQЛЬ™@swN]› bі5;Ё8tЇ ‹&ЭnшЃ-ŸщЭ4hЪL Љ 11gцŠЂОООFЭcE_hr‘!ZU{ГЛѓэа‡Д9.њк}{{ыіd‹gУZЁIuBtыжЁo›мб>lХ\ЋGЬ•šFГГуЁAѓЕі.m€~ЏG;Њaѓ5w‚fŸ5шї:шЌ]б‡Ÿuшў7ђб ?жЋcЁѕfДT(Ей Ћ•ŸF˜ƒ ™ѕшЯŸG‡ЏКhщ*єhKіпП ‡A›Œй §Рhз!ˆ–ерOФаjз§l‚>A~fД|#3ћoДёž6D{:"šјЉ~hЃ{F—аG‚љД'кфоЁGџU&пэ(sJ4ЌОe 0зшН= sXєы&іR—WЈцzGяеЂ йFшзB2КО†4+ъјшзЏqu‡–еЂYVЇGѓьў*к, QrrДРf šW{ЂaГ]М$U3Ш{rСаˆYbCццю'­7"ДъЦWьпКqѓU"ДЈО0XG_]j/4ўІШиEqСхх%ёhDДVMˆЋ(є „Ор"ЬИšB˜# //ЕъЋ>‰\|'њBŒ0#ъ+Эг‡A_^ъеWJббJ„йЭOнmЯ;М^EїjХ Ё1s“zЙ\Ђ;uFЛЂ—|Фшe—|z-VЭК9(эьhЬш%.йхєhюмёHшЅ њ3KшPh…НФаКYkа‹ц„цш%`vGѓцhh™МмаПќb‡Ўз?_hк­˜лA­š4ЦЦбчч2šf[Ђ ГЭPєЙ%камВ‘§\ПЗєш’ švmnе&hs3ƒ†мš=а­йbдhF˜Ut‘К3ЗhuLє/ ™!цHh@Н-Јe4ПEјu@ѓАш3-ЌCš94ЂЖ2CћC`ŸЩъ_t+f ЊэЬсбчр ‡Fг№ѓ;ˆЭ"R'Aclи,ЁЕ%T З3DmƒfСбВz[0їhƒ r~ю„ўm<шŽомќM*0cыа ­аŒ§ЪЕa†зAЬ :РЄEєЏZx7—:e№{a‹цмqбќч<ДњщЎ7'›ДќRфиѓ*ЭЉъ w‚ЃщQЋhЦц2њ”Cf-Б]Ь‚њ#wuе|.ЉOЋ*6[ЄB3+4#аŠYоыыык‘ЬЋ4Јfніа%[1+hVБЫ=њѕQ€f™t5kЙœtЎЧНщ'ЎдХ”Ы”ћ‡Єžѓ1і%‡f Ђз›MтfЫДшЙŠ>хаК—!^…–еђЖž+ш/П<х3E—…2kаL6гh’ь~мїR3љEXі@ѓЛšЅC?~ŒЃчуEKюž=зЃy6“еOѓ“Рf-эТм %5nоy" ВХзрѓ-Я~h?5€~LЂ™€fšЉhХ­ЊГ€.їЕJЬабI334г™c [vwY/.ЩzЪЁyxћw9 šuцzЮгщt—еštїw9КfCЯЈц\Ђww9Д\K~іьй8агiƒоХзэЬM K6ˆžіhBЭЂЭYƒ†ŸТЃ umNŽ&Э šb?ЛЃhxGЦй8њY44m6@ьдhy”hфzЋяiьzЊЧžТhT=єDП|љвR­7‹ш—)Э{ЕLožір—И:’Fƒj§zЦкZtєƒ6#єKБ/Tіќž§€Gъ)~š‹ utЭ~E™ДКюккCpжqбТЌGЏ•шВц", ГНіАmэY3ŒžTЃWђ‡fЬŒ я•5ъ­"ђюБВRЉWVЊб“л‚›AѕЄAзг6DЏ ш‡СЭ€К&з5шЏОњŠDь­’‹Т‚!є„GпЋЬ%њ+Н‚ЃзжтЃя‰uшF]|-Ё_оППBпЧасеЋЋшцб•zKFw АcLšЃлt„Ž@ЎимДНб ;šŸіB—ї7ДШŽjЎд2й­Ю:ВЙЌњаЁA3&Ђя#шЗ:œ-ЃХ9hA}_nt=ь‰!Zžs7ьrЅtfy‹hа€Й(ЁVPO\б€{Жйž™ŸЕ9Кўˆ:lw]ЁYѓЖђЂУ–мсЭЌf—џаЅњХЪ‹vТCљZ4ђp5щ•1lŠ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—Мўѕ§§Ё-ІёцЛ€ž э7‰з4 #T› F…ž)эsезHН-Џy|h厘 є0pи ЁeѓPhD Ђs‡NЫЦЭуEf ]В)t:8e+š4mgоЬЉбИЖНBFf Щ< кг­3­5џmбьЂыывЁѕf=š%F˜ЕшўЪ4lЬl3hюв$hдЬЁKiрq-ХNЃO№r42 цCХ<Д`–ROIчйёo}fƒкlG› ivjГŠ†ЭЉаFf˜‰уЭM@Ж“й}S ƒ™о Mw4ЦЖ9Š9žйmu~t<3_Œ.Ч^ЛЂ…kF‡ЎO№#Ф#D_hх"K3v:нЬ,АеЋT3cfhЦмs73Sh`аЂХГamvДк“эŒОeЗ#AЗl=њЖЪэУ–Эw­˜Ж)gыбЎlШ|mtѓИе …gEƒцk“Лє­-??>Ив­’ЬБаf… н№NєооИбCУцАшз\-ЛGзпЭКЬаlЪ€fК7Ыhм ]wxXГћk wТН.Csdєыzд š)цq ыiѓшž-yЖ/6›Ё™dfœ9&1kйјŠэЇбёЁ/4Cа§%WбадЬE~Хх%ўиUQzє…}9:є…(nТб8|єЅкР-Г/…(t ПŠƒ–Э"њв}•­˜іЅ%Z-=Z6ЧAлГ)Дb ^яІЭ~шeQ ДЦь…^FBыЬ>шe—|,„nй8К?t<zщ„VЭ-š;С;z)дž|vІCцЫЮм•НМh™НDб[.йБайЭ eqcюаПќb‡nжБmбЊЙєXб€yйŸ2^Ѓ1Жк„m‡ж›q4#б ДЁЙbcbС\ЁK6hиŒW-тСйцfF˜}а­9š0h• Ѓ;3‡жmtшnФЬЃУMbooѓьГ3œЭЏšэБSЁ…uHs|ДШ–бѕ­ 0 h˜=,њt|єЦ†Šцйќ@Г$h`вш…кЪ ВЁэ!Ђq6МЃEєцІЏYE ЗK44h=њ7OtПŸХ[žкбњ7%єF0єEo@3і+—ŒЖ{)‚f НY5YЩmmFбђспЬУЂэЭL0› б• ЬЁа…tЃ3 hёNнВЫчЬ‹ј5NOy4anа"л§Јјт‘нšqє‚@ЏhsУ.МMд)kЬћєДf—-єzбцІw33СќH2Ыh O9єТэhЎz €fњД 0шžэуЕEЯ-аЂ9bsцŽ}zкГIsƒnссал$Z4ЋhuаАЙDЏ{Ѓ{\՘|гуй’YAŸžЪhФмЦLЃaГ;:ˆ`ЗWf-юjэgб4ГF3§$ КLEзщб<Л~ДG?QJ†Э23ЇCѓlP АѓрhщљкФ УQГoПЇ1'Eƒkhа9<š‡ѓhj š“ЁЩu$3г˜у [6іМщtw—ZWcŽŠЦЭfhЬ ]ВQq…жГQsD4ђct$3‰ЦžгЃu№8fєєЂЇк…M›Ч‰ж˜94ХN‹FЎ5ЛFуь1 Їw=Eб{xє”@л˜}б[kа/Š gЌ­ЅDЏZЁ_ ш5эmцаЋBfш\€dћ›bVбSM™cЂ[іЊвdB˜Ї/Єдuзж`v84dцбВY^CаAЬEЊИ2W!fНВŠv(sxєŠfй.ЦЖŠLа++kHсЭ*zт„^б ƒšє@‹l]‡ЁзжТŠѕш­;ˆžLЖКJpљ'ccCЫfНх„nf3‡nГE‡7пMДїAcьиhеьŽdюЬVhˆль†^!ббЭ [‡^‘J-NdиЖшžЮы‚†Ь,ЕYгh@ьЊЅќ Э|ё_fцCСl‹ЎжЃеŽдHt`Ес ­абG ­™ub3€ЭєЌS˜I4lІ^Œ77е7Ѕ6=диЭ]b†е6G1‡1d mkЋѓЃнЭќ%–hётrьЕЖыk yœш2Ъ<>є5€–ЏБ4 hЇSбЭЬ[Й03fЈv<ЬнЬŒЃСЭ1 Z<6к“эƒІд б-[О-ѓ@ћА•­а„:"Z17lS4ЎцŸŽЈйљкш.};4_wiE}{KЋхчЧGWЂ“ КR6&ба Ёиццё -ЬbУkФC#зŽ ЯA]|,Ћ]а>эYЂѕчЯNhЕЅYPпєБ1њ§Ёžjлнa>‰…ЖЙu0eˆш?dѓ˜аЧFш“б %5>БE[АcЁЬёа5Л#chкь‰Ж7ѓГ.б КyœИ кэ`fвЌj.а{{#E3†š4b‹~ЭеВyth.аe†fSЕ#њu;ыўpCяAhм ]wЈAзплыњѕk ˜Ч‚.І- ;ЖьUдОhиlІ.О}Ј,и|€VЬš0Ё1ГFMЌ8*4пХEёџ.Ј+./Б­СиеU44ХОh"Ь—јГЏЎv4єE"Ў#а(<њB7cъ˜hє9$њђвнРЏ„в %іхЅ–MЂMдzihцб—r:ДZДbцйiа„z Ћ)ДbŽ„Жžѕ˜бЫ2KДj†аДyœhйНь2B_˜Ѓuц hх№Z}ЁC7‡aяььФA/…”#wq4`nбм‰єЉа•њьЬНfY@Sjн:0šЃ Е]АЃ epCvGЗ?aPє/ПxЁ›ГАCЂUr‹nЭњtї@3Ьк н;ЭЈ)ѓƒЦбŒD/,аІцBM Y?ш ]ВAГЊ.Оu^ЖhыNЅGйцfF BЫjЭT4‹‹оРбъЌлuР9 hн „цїєй/рЌЛuР9Чš4Р†брЌљu€9ƒhŒэ‰ои бЌЗДRЃSЬббќЌtЫЦ;W- aЖ7z#4š ш8“юдšgSюѓsЭ’ I hB ˜eєІЏboC{ZDуjxG‹шM…mkfв”‘[ž!Д§[84#аˆкбњ7%Kє†д6ЂЖD/Дhи–hЖёkŸŠЖz)‚цДhbƒ K9ЃmЭZz)ЪoцсажцzSЗd-оєј{l>ЇаИЙA‹l{4#ал"КџХk>еЇЇЕA{™4аэ?ЎЯЕh†Ѓu8Г4jЭA‹“>ЬњIg~ЭГХ MаŒ7 ъ'J‘а‚$+jЬœЭЉ13ЌfЃCK hsX4 ЧШ*М§žЦœ,ЂACц№hоЭЁЩ…p4hŽ‚~Ќ 5 IfІ1ЧAЗlь‰SЖK.L“уЂб'ЁQr4tЩFРelw—d?>ЩЭБŸйНЋ›vГzКыЁіCSj’мЃ]иБаиІw=а;)Лўo„Цйc@Oя zŠЂікDЏХAclYDПxёBЏЅEЏЎZЃUѕZU 3уЅ|fш}А@ћ›ƒЁ•Ызж`vsЧ^Uš№Љд Љб yЕzM(МЙHф&˜ЌЂWVPѓZ 3Јб[Іш5ЌаdP=с*а[2FЏŒ НEЂW*є Ž. KVᓉŠов Ћšuш­-Y­юŽБЁ'“­-Ю]}С`4ЁН5mўДF73šЬЃЗбсЭёбЬмАя":–ЙK%лЁvt3ЈжЁW(t2ЈЖC‹ь4цАшDf€m‹ЎсщМ5Zrkаy%ЕЙ†гhF™‡№жhЮ ˜)є`цŽ ‰жЬА ТѕИЬ žuћ˜ŠR*TЃ3@Щ”Ћбp=:ЅШ Т\ЂYљkјиЬЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙџЫЁ‡е8ьАњq6“кчъЏ:hЮЩ'›aєСˆаŠDHл`ца)сИyЌhB<дЁћkгАa3>Tаъ гЂ3‡>lа‡]ъŽцWŒЯЦЬ=њАAhaЩшhдмЁŽŽs|Ж“YFMšЫSЛ9s{†w"Жл Eє‘:‰йнТјѓвЖщ1ю~h3ѓgІа†1{Ђ ЭR0кцќhtїxДеЁзЮhўq;ДШФйзNfsДУуzs•Ейэr*К™љ5л:>К?Б1#hЦ5ЧVбўьы;ˆДЕCSlэЩў [Ж?КgУhЖrLГ1šЃaГ;Z17l=šБл"Г ‚Јйй}[Ё & š4ФОm2AcьАhхЪбЃЁ+}бйЦцБЃс+q4Ю–зƒ67f ­,m,ЎBЭZiьhpЅфh‘MЃOŠт Э7Д-њ$кќUm }bЖdGCŸŒ ЭГoo1іЩDSцДh•Ё 1‚ЖaCfs4s2ћЂA3йхп{sџл‹Ць‰†Эnш#Щl;hS4b&бќЏў;М7Jєоž…y4xпб˜94њu—ШцЏюu{U†цШшз7n“ба}cЏk<шCЭ@ѓXахFїt[}з Кј.hfЮцИЗ<Ц..ЈG//qѓееPш })Ё… ДЁESь‹.Dм?ћŠ(њ‚D_Ž}!„Šа†lЏAЫшЫСаЫ&34ЯОTJ…^jаВyhєRЪШЬБ‡@ЫцЛ€VЬ |\hиlƒVЭš6лЁГКff]АЊ5[Ё1shДЮlѓžˆ‘?|шЏ­ŽtwDїв‡CЃsўаŸЙ{ц^GЃтЂўLцГПqє")zлнzбЯНэ‰nB},}Дp6њA‹чЙŸU§ђ‹;кlWћЁ!ГКћ ЩаѕZ2Whˆ ЁћŸ ЂiЖДzб wЂaіі6П?z4ЬЦбчч‹ЎЖzУ ЭtkN‡оЈ‚б*Л]4sh“]эŽоАBwы€f;ДБYaotСшšнТХ•јЛЦ9ŠЦи6fІ1Shi%ХœНБ˜tЫІ:'б0л Н }Ў ™€7щ кœ}Ў ™€ом …†Ьnhеl‚Ж27l@L )6`Vа*лжЬр§Мнџ‚§›5zCJ03шЅHБЭаeП§ж™‹Ц^шDhЗ] ˜ЅЛєцfЯЎсЉашjh3‰ц?}Шoцѓyt­й]›)Дh–йК†7f}ZдЃ%3‚юйОшGZtoЦа Н ЬњQ….џщfЂkvїћ,ˆ^/кrїhШ Ё{s>ха НC ЭE„№›ždюаЇ]ŠYКwЌЏѓlwБšiаЇцН -Г™]І5s…B?ж чЮhеь‡~,„ГГ%0{ЁЂEГ?кУ\ЄCЗџИ>ї@яь<)Še6EwOGбŒD? iFй№ŽЦй @‹ХC7WfЭDїзЁfЭF‡–Vа&цАhŽˆxћ=9!YEƒ†Ьсб<ЛGг+сhаœ­YI239К‡ЛЎLxGІЬБа3цŽ&ХбХуЮцЁаЫАу }Э4кoiѓДЊќjЗЪžюgvAOяzкеЃ)іјаЛwНЫuWаЛшЕ‘ЁwЅ@sенBЏEBcьеU[ДЪ^уJ^EаS єŠі6ше*Y‹^S gVбЋ(zJЂuцЕpf‰Н*…šЇ/^єоEZsУcf„™GOQє  ›зТ™9Жb^Lѓє…дЪ щ­ 'юбЊЙGЫf M™УЂМ КŒБ­-34izЅBгцєh™­˜ЋЦ„оRаъ ѕшРf z2йтиѕз0šb‡6cш €оrD7#ш‰„цГE‡7ЧGG0#p4ЬŽeމŽf№“ ЮЦб*;О9<:Йh2бo -Вг˜УЂ™9Ж+К†Їѓжhи\У'š1zs9mтюЁEbЎс(Л|CчЅбŒ@lЎ‚аѕ#*zX)WcfŠYEъ”ЊЬŒ1Щ\ХЃ‡б!5f˜k4Ÿ9—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.ї9№0ђ‘Ÿ >жfbпяsѕWд ЧšЁЦЃ–Х0њ@lXВжшЃоžђ.Ч›ЭНі@›™ДЂЬ а†f)myОИšм -Љ%t0ѕЕЦl‰е<8 ЛжЁл9aвъЌ14!Fа6lШl€>ЎпЋп™Эб ™@ ГЎў/Ф:sџл Е3G7п‘ц|BН Г)&гhюnЭЃtёШоxанэšџ8ч=H™CЃ_wеаLsaЎ2#GD7aha;я §ZFїН=H=$КPГC`EykŒ ]ьn]ВEё`h€ЎYнъ0ѓееUBДаХХёшхх%:ч˜шх’&_рьЫK->zХчfFбзњЂ #зOОЂŠ‡ОИРе——уD_\ ъЫKOД!мЮUFfA}9zЙДCsj ВЃ—rFц­šЧ‹юиfhк­axF{ЂВ 0Gог^шŠ ™ty,ЌжlјіB’—>|'šQш‚мž^[шюŠюЯv„ЦЧ\ЭЙ9tїЬ]рН“ нЩ|жЂaЕНH†ўАэ‰юЭЩаН™лшMпбѕЉєiа‚йнп-šы§qіЫ/юhГ т…ў кнў MГ}аzt?ч Љ!tїВ:QCƒЎб№gjЭ ЙMMВMб z{›Wїhxж PзkŸŸЗшEtє‰–е @ЗцЭ"Ѓ7Њ`Д:ыfиЬЁMvЕ1ZQohбL5џN#˜y4Њ67Ыъ.§K§$ймИћПœуhDmcfГŒцевJВY@ы^ŠVf‰9Г‚ўХ`ЭsНГ­šД…њ\F3НЙ НБЁCЋЯуЃ7602ŠжЈГ‚VеvцB-ЃЁЯx"šRŸЋƒVбŠк-'˜нб -СmЭ8КН@l ЈыЬП§і›'zC›Э0‹“юGНщŽ–еќч%‡] Ѓw@t>г’7ёCžŒўЭЭŒящг‡є d>Ÿ‡@WY›uш3ЭГ€>=хбЂCwl{ДЄ~DЁ+xkиЇЇ5[ї2 ~TGЃ93€eаыы›Rф§ЈBŸѕf нВ8zН,€ЙQ?Эв Q2їшSНб;Zd;Ђй#1тІWэ}꽘вцрбыЎ`KД`†аЇЇИy]- ZfыаeКЭ§ј1‰žлЁIВњБ>kС<(š=6EЯAГT{ eЕŠnўqн-ОБ<) EжLКŸ5М9dє)g&бOž„DcГЦаШЌ„‹ЦЭ š ‰юЏCЭš%G7kОЏ€шіЃ“`ШСбаД1Y@ыЬсбA4НІЭаДf%lw цшоэИ0 އ~|'бЗ™;šQр˜штqgГV эБЌzЄhRюЗЊ yZV}Е[eЏі3Л Їw=эъЬ${tш]=:Ъ–„FйЃCяъбkk1Ьш])а\uЇаkБа{uе­ВзИR WєдН&в  WЋ4f-zM)&zЕ4Ћhy-œYbЏJЁцщ‹žћЂLGnиaШZ6ѓшЉ„~С“{5т­ EцйŠyu‚™Ї/ЄV›j^tj34i‹fЗE—1ЖЕu'б2[AЏhЭбЈКAoща+ucBOЖЖzv§Ї2gu`Г=бe0šb‡6cш‰ˆцГF7#шI8tx2ц‡Žd†д.hЭ АCЁcšњd‚ГqДЪО‹шцЂ‰СЁа";™ѕг€NfюfэŠЎсщМMаЩЭE“ …fL‡ТЬ&ŒП}XЃ1зp”]>ŠЁ‡ѓвhF 6WAшњ=Ќ” @7(шAR%™еПнђц*=0зh6^s.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.— пLшћЂ§ЎўЊš†sђЭŒа#BЯ” tutэhи:ѓбZГ€nйo›ЦdVбњэ€hUм˜є€~+4FѓО`mhоЬ:%2Ушƒб A3ˆ>аЂSБЭЭуA[˜%tЩM™ЧŠ&ЭNшјl;ѓ8аА™1Ф< 4f3[ЂЫыгБq334—h–M˜+Жљ џ Э&СЖs‹61єПЖ$AЃЏС&б{XЅЂћыSМ a3†>1#шCMГг˜{4dš;4 жЂ!x twhЖG4[ьшCKДШ6?єк­š§а'u;ЂљЧaєQ‘9лцxq}з3CЬvhЋ3бѕц"вŒьh ПэsЗEУfhаzДl‡йˆибzЖb‚Ож ЁЗB[єM`єЕ }Кбє‹Q1`_kаћаВйЭŸJOОЋhЦLи€й— ™УЁ{6Žцй?‡а8лНa…fК5ЇCoTЉh˜Эtgца&ФНa…fZ5›Ё-Ь 4wlЭГљuФћ†`–ах'kmcf3…жQЬ"К7oВMmefГ„ЎйКЮ4gЎ’бvfF˜cЂНЭ6€ [ž [ікб š7Л Я@ f­cŸ ex84sBЋf=квL л+ь6`–юг*ћуG_єvєNPДЬо …об-<š\ 0/ГŠоД7+DfЫшњYѓ"~•гS-˜;КЮ§HBŸIшоlŠобЂ­Эьб#N\%ВЯЄ:ГР>=хйјŽойY_ї7ѓшG†шЙН аыAбИhєAЗь‚^—ђG?BаŒt>%а˜yннЬс7=ЂOЛT4jюJž[ЁwЂ !6ў#˜t 7йбЁбФЛЂ`6AG2шЧRлR={n„юйБЬL1уhиŒЃcэш2Кe#f нoўхIгибЬэlVаа)йо DЫХFуfЭ’Ѓev}j6!ZZa$h‘-ЂсUЦFVаzs4Н’ˆ60'AkVВth4Яv[7ЃMб=мuхП'кйLЂ?fЬнВУ›ѕhЕc ZУ6[aw—z45кдь‚і2hьгІЪлd‹і3ЧFGt 4Ц^[K‹ж™Ї‚FЏ!hO3ŠжšЇЛR Й*ДљnЂ1іъЊ-ZeЏ ХGЏ"шЉz-)zЕ‰4kбkJ1бЋ(zJЂ_hЬkсЬ {UˆПnkk В_t!ZЎ0bНŠЂЗ$є s8tЯ^UЬUYЩР­šCЃš эšёш–э‚iІа“НЅEЏ$FуьIг–„^);2ЏА•”fKt`ЎJgЦа“€шрf> †Ž#Ž‹Žfи.hˆг|7б2}2Сй8ZeпEtГwC‹ьTцшdцŽэŠЎс)НЁаЩЭE“ …fL‡ТЬ&ŒП}XЃ1зp”]>ŠЃ‡ЛЃ5WйЁ‡ж6шъ=АUŠgѓпчбCйа 3Ь5šгœЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—Ыхт4њОhП?ОЏы‡КС”bЊ™BA=“беЙˆoЦТж˜Eє›q ГИЃEєСAƒ~л4&Г§v@Д*nЬа “ЉA2Œ>аЂЉ-ЬcGƒf]Бt5e+š4;ЁуГЩ ­˜Ч†Щ 3˜}бQеАИЬ}PЂЫыгЉq334—h–M˜+Жљ џ ЭЁЭ 0Cшюњ$hф%и%rЫTѓA}Šз#vп36cшУC ЭБЃЃ3‡VчЌCЧое˜ЙG+`4ю/PЇь†hЖ@кЁEЕљЁзnhсqpЮšP[œд­яZƒо?„б‡GGGj›уХѕцkE-^яhlkЫSбѕhY аЂZ4bз›lh}td0jХ}m>:BеЪ[ЬMXєЕ |цбšY+цq щ;ˆbРцЮЄбћаВй}­AяhvdТЬОъыkˆЃїэб€йSmцдŒSЋьvаьЅООеFh6Z6ЗъўŠcUНп™yДТж еЊљZОyшЃа€ЙVkа5ќііжxƒ@цтГЕp ŠОН•еCЁеkŽaіэ­ЂFб{hью1šбш[3t86ИЃ4Ј=RпоЪl ГC˜!і1Ќ7QЋh™­,`ƒРf -ЋoЕhuЁ”hH}ЋEC?2%Pƒhо|’ _z|,Г9ѓ „>‰ƒ6ŸsЏюбŒFУцФheжŒQhФьџceVf]}Џ3vRЃOŠмЬОhъzqжѕїnЫџuш“в[feЖ@[КwsцКо|тd6GлэhA]Ф}ы7hB|uх†Э:єk­3hдlŠFЬњЕ€>9‘Ш{MуB WМ23‰.йв%ˆ™G_ХD/—K-Z] 6ЇDKjtCпШЩаK­Аб5///їs_ ДЪnЛЈ"а—&fE}}AЂ/Д№Œ– ‚†й\ ИI}fDє’Kc–б—~hCЕЦ А/Є1ˆ4kŠ Ђeѓ€h Ё3ŽЖЋЕf-КSЋцЈhЪЌG_ fhƒ$A(Л[шЦˆfsжЁ/0ГŠўјёc4Гйњ1 шђ(Ъ`hэœыJЯЮ(4lцбељ™Ћ ыsUЫн]бмсюбб8Г7К=V7ы шэ шХbGPЧBPЬішо,ЁqЖ!a fжЁ‘;ЕЮМіЪіA‹snај§УНЭŸ~]Ћ €ІйюшˆйЭаЦf ˜­аэъ‹F­ВУЃЗ­ај/  ЈЭбаЎо†бПРьr }оЃMд>ш2]ЋAГŒfЉб‚šCƒГfК!ŸѓhžНa‡fZ1/D3‚Ж1#ш ]Њ™LцсэпЮyДИ?6Y`ДjЦбв:ŠY@sц"mef yЃ3Kшš­ыGoжIh;2cЈYšєY@єцІ'Z КOлЬZік |sБ@ЫfpвмЭ“!ДŽ}NЁw’ •MmoFа=ћc8t{…2kГ„&7ШІ?šџМo4jF]Уэбћбv 4ї&­Њet§Ќљ|N z‡@WyЂYKшЮ,ЊOO9Д`^ьhбіъGИ9—шГцїђ9€циФ AЕЕYEKГ>SеѓЙЂ&а’z}нпмЂёбш9‚nй dвыыеAЯч€кН.ч…V#65бЇm*5ЧC—W ;šCŸтшнcв‚Z0шŠьш€hHП+ъб%{ДxЯоГ:’ЙT?–кVиy>7BїьXfІ˜4ЃЬšлжбݘнЮ1Ышnƒpя†ыOътЁ‘YcfЭj3їўVЛš б GУЛšhЙ€h™]]‡›Ё]-šCУ; tѓ)$9њ1…†VЁб˜90њ1ŠF–3šZIB˜бћЃCkV!к,ЋнЭГнжЭhStw]љя‰v6“шЧ™Кe‡7kдŒy˜YЌAkдF ьюю&GуOš5р:kД—™@SтJНЛЋG#j?s 4ЊŽ2шPhDНЖ–­3Owѕш5эiFбZГ„†иkMЁЭ(z5 Zf{Ѓ1і*ЂЦбЊzM(>zuVO-аk:€@Џ6‘f-ЊздbЂWћГŠ~A{tГТ^тЏлкš‚ь]„И)YBЏЂш- §ТСнБWеsUgV20GфВЩ$ : ™!о]ГЗЖDЖ :Є™BOє–„VЭ+‰б8{вД%ЁWVVЦ.Ь…z%ЅйН˜Ћв™1є$ :ИO‚Ёуˆя*ZeЛ !vDВЪžъЁEј„Pуh…РЬБУ г˜{Ж#Z`'3‡CЇ#wlgtэN+.+ šщбщЭЅšD3 zrЎІБ5шaШ œ@3=Є™F3=ЈЙЪ=ДЖ uѓ˜‚TЊФЋљяѓшЁlh…™fVБй8ЭЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.^§QѕпW}W$^ёCе0:8Ш,œƒЧоŒ =jЭћТё}ošЦŸш§ЃgJ5zŸDПmЇYF‹ц!аЊXоб=4РЦЭпsц}04aў~_B—GЊТшДlШ<Ьћyx4(wєў~L0ŒNЦ&ЭТŽа?Œ эh}pЃгАщAяMяш}]ГUt|ЖyhKГ!:.›6 ‹ЫGЬа%ЛІCуf†˜!4KŠFХ 0шіњ4[„63#ѓAџkKДЦЬŒЬ§ѕ)^Ž:ѓбZГ!КgЧG‡3ЇC4ˆЯ‹Шv2Л šДA‹lбl|КИAзNцCkДљ‘шц"[ѓa•лъ$wO4nЖCл?o‚й†цУЃ#st}8Г К7›Ѓo‚ЂљУЧMа‡‡œй€­˜я њ&"Кeл aЖˆО‘ kVбш†Ж@Ыf_єЕ’ˆЦ_…4šџрЄ˜яZ5‰fЬdƒfO6l71“шžнЃ!6і`kMЁйhахgkў ]У™€Vй§aбЊЙD —Œ ˜ЏхkpєmЕAјUВ &}|LЁooЭасий};4+ьуc˜}лe††й­gїш“˜m‚Жecf3є­­ќРhд Ђe6c<КNDŸœЈ?3ZЙRƒ>ща:s<4|Е яб'\s44r5Š>бА9П^dзп+?{@hФьџRД4Уhб|тdіEгЯјњыžн~яеЋђЎбЃы?­ЬhлA—ш~жнї є‡v1›ЃэюmЧM_нЃ_Н:т蘼ъ 5Г13~Ђuцhд  _ AhYМз” Н4BїfM™)Д‘E/‹htgfѕ§УР\› ЯЄїB3СЬ^ЕЗъ=С<.4МтЋW{RІћЁ—hdE›eє•zй„=ыЂ {єВШШ фŽ^jа$њR@ ED/Й3ПфRŸНд /єхш%c> f})§М№hШМ,Ь;Ѓа Y@—GQ~lЇюЭЭAє6ѓш$шN\uFЂ/.(t §Ч:ЖZ4ћЂw’ %s….йnшХbGbЧ@Ыf7to†иŠЙCclYAclw4f3Z5WwМ hнqECf4s@›™йнЎ^ЃљSЧqЖЙFoXЁё_‘а{ЃHEcьђЛдŽ.б<ћ#W8є†šhqа)а(њ—_T6аэЪш]t”A{ w аkkiб:Г z A{šQєъЊЦ,Ё!іZWXѓнDcьеU˜э†сБаЋzj^CаЬzЕ‹0+hžНВВЮЌЂWQє”DПшЎ[Э!б2{UˆПnkk В_tUbВ8шUН%Ё_8˜зB™;і*RgЎъЬJцЕpfFš'#EcоЪ\ФЃ[і]DУf: ™dO&5{KJ6ЏЌшбaЭ8zв eГŒ^Ља№ :’EOКhєJW:s tp3 ‡Žc†а“`шHf>q@Уь˜цXшЈf‰>™рl-ГSˆ{є$:‘ЙaOœб<;™f7tBs‘b–аŒQш–жиЌeыащНўшЬм=Єй=ЈY‚‹ш2=ЌЕ D7)шAЅJ"šЄGeC›№П( f6Ns.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—‹зЌэћКяОћNКт‡ВAlXВљ{сМВ7EуQЯ„š9я‹GОiњa$у†Ьпя=“3BПmЇЙEПаoD+beGwlpЮCАqѓїћњ`,hТЌЂtZЖЉyП6 ‰{єwК;%A'c“fqаw]Аat6Н;іqt=ыAаˆyšyt3kŸM›Ч‰Ж›Г):.лrЮКR'GУтђ3tЉЎ€ бИ™!f]]žŠ6`Vбэх‰vmf&цƒƒюђ4ћZcfFfA­1­›Г)Кg'P3ЇC‡›3ЗA ydДоl6=zоm`Fа"[BT_;™mбе™шсЬEЖцУ2LЭГ%t0Ж Nйн?-ВuцУКƒ#tіЕ5К1ahN­ƒ љУЧMа‡]GG8[RЧD_ЧAпмDE_[Ѓ6…іg__jТlˆц?ю)f_ДlЎе„йЭ}p#Z3jРьЋіA3FБл ГŸ6“шž=1[Ѓ!6і`ЋшkнЭЃ‡33t№YЋцтГЕpŠЎ=:ТйБаР хKF‡ЬцшУлл[Fmn‘Л:кhвЩбЧАљИBпоšЁВ!ГŠ†еЧЕ™W“шPћ4+ьcD}лvb††еёа КGŸœŒЭZEЫjyjЬ Ёeѕё1убU2ZљаЈDKьcІЂЅпЬONдŸщ­66kа'кЩ ^|,С{є OЬЉб­њИG—яˆ'€њ6GCуз hжЁŒ—бVl[4c_їъў›тЄл/lЬОhњ_—ъЏEєЋWХНNFУOЧЬhћA7шКЮ\Ђ„q#ЯFЭцhЛ—a[ѓjаЏ^я…Џtф+мlЬЦЬ4њѕk§Њš7E.аЄкЯ  _ AhyЪ{uЩаЫЅ§њЕАЇnПšЫтьŽхRUЫшз™5/E`ЮњъŠPпŽ.ю"ТуЏЪџœtЬ= вг Ё^эЩЅB/!ДФFVД0y —KDнtQ†=Иwyyщjі@/5ш‹ \}YšcЂ—}”t_іЯŒ‡^Z eѕ%ŽБЇ—@и‡0ВШО”rQ[ !m‹ўpв„ЙFїl™ЬГe4Р†ІШ6hеЌ ?~0ЫшeаŒ™ћM}аŒа5{,шЮмчˆЂ!Г„ўи§Aty =ŽЭ<К<‰в@э‹юЭхС™g~шЋ=бНИьŒD_\PшўlwНк§! zбž -‘ktЩvC/К3ƒЁѕ‡(SгfБMбЊZ!shDM›{u,Д:цж­ЛяyЃљгЏУЁщ}э††цЬœаL‡дЦf-ž2nnWЏбќЉуИкм,Њ[ѓ„ЎдџЕe ЬzЃ@#Г.ПKmŽЭГ?r…CoPhјзDrабб5FџЈ™ŠюVцбˆz3zƒBзjрl rg–&НЙЩЃ7наlУ-ЮZ\F$ŸŸŸ/њѓІШvBolЈdнn:р˜ИПaшЭЎnж›.ƒЖAџђ‹nЙ– Ѓ7t9ыЭ›vfЖМ#†FѓГ‚ооцекˆ­ Ўрўцш…`†GнѓЃЃЕlyЮ<VД3 ЯјL& Ё5ЃЖDыїt4ИЋеГА=ИЗХy‘Двi^`ц@hž§ЈL4Ыш3-ЉOO14їб48њQ‰цЬ"њєДUГ…ˆо‰€~Є$ ЗЯTѕ\EŸžіъСбллл zŽЂOuш@З-Т•§1'аЇz}}Нўo ДЈюЭ†hЮ,”=Ÿƒъггž ЂeГРŽ€f№ yє)ŠЦЭГ­Э&h† ;ѕЉ€цйн]DWй“ДxЋцдzД8jFN:(Z~WфўЩF>eРюˆ~ŒЁErПЇO1u$sЩ~,'ННtlCtПCєfWДbVи-1Ѓhƒ ГMб ›1НњIl4fдѕџЇE?y-Вы+13ИAєЮЮЄ”hemhNˆзQб;#B#ыh”œ M­5V4ЙV2ДЩMЯfЕAбб§П ~ьŠnнГЃЁЭКeЛЎ<$кyхHo-ZЖКa'G?і!зшЛCƒFŸ4-+Пиэ‚/L&Щzзэe&а4ЙlW‹Цд~fєЎН66єЎ QЧBkШFш5эiFбЋ–hˆНжжŒЊWauДПQЏ–…C №(ше6Šl€^ƒб!ЬZa“hžНВВН*„’I4lnиAа{UOЗѕ‹Жъ2ФлБCЃWСšЋЖŠHtsШмБasЋоЊыЬ/ф ШkkсЬŒ4Oєжhа˜З2ёш–=8šROjѕ–Нb‚iІд“ZН%Ї K5vЏ‹bЦб“&zЅ-EO&˜1шаfдУ ЋУЁу˜!іФАЃ™і$:ІYbЛЁvdГрžLpЖ9:˜SO\б;‘ЙQO‚ “™+ЕlЖBЏ `.RЬšбш•!Ьaа‰ЭZЕœ‹Љ-аC™И€fzPГ zXp†fœ{dф2н<"ЂEBM„_Йzє`6ƒDsЅf#'чrЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙрЭšОяZЄoІ їѕOА™PgЮ|гѕCбк:Ъѓя…"њ€D'ckаТйв•yќhСМпž!ЃгАaѓИбˆYƒnй:>лЮ<ДЅ™Cзl—mk— fMБ‡03Ф ЁYR4aЎи€@—з&d“ff`>hЬУЂљG ЬEэеЉиДyœhй–ЪLЁ ЯCOo>рŸ%™qgЖE[œ=ЯŒ 1іM`єЕУУ}]žzl{‡ІаъЫ‘?>кз,Ђo"ЁEЖ‰љ№а}#Юl‹>4FЫцhёˆwєaгб‘ݘbЮhnŠ6aЋh6dцб№v š94ђьа8Л]x%њВ !szt gьш‡їk„FЋцёЃГ!КdїшЄlЭ]A йˆат8š hˆ­7‡A‡М˜єqUћ?|š AГ+л ЭДшnб uш~ эТ†Ьцh64+ьrїBшіё“&•-Ў3,њEЃ“NŽ–йЧњфп8;”й­3‡@Ѓf]п—iДl>9QІ7л}lˆ65ЧBЗl1]џна \K˜U4fŽ‰ЦŸёѕз€™Л{№AЯ‡бVlk3iіGSЯјšЋ§оЋWfт0oхіƒ†аЏ4ђьhєehХ~ХEŠIД)лЭќZ‹ЦŸ{хЦЭЫ%ЈхТаЏ^Q?ёЊ*z Ђ_hІ ЩŸHЂЬ(z Ђ_шіБVМWд~ooџЦJƒюуЬ-s@гцјhxХ=% Гz-<НDа"о ->Н4B_€]’цxшЅ}б˜ЛoTєR‹О@б—|j@є‰БUˆY_ ХEcцecб(њR‹ж™MбЈИъƒТОPBЬћуЧ0hк§1šБtшUёбЊGЋцaа­™?ЯQEзlР ЂiИ?њCPєЧ$шњьЬ]žDљб€э‹цЭz4dއЦи‚YƒОИЭк„э‡Эл…yмшBѕБЛgUnшХЂ?5XЧvECf74ыа;Qб>€f ГЉЭБ(киЁаДй Нˆ‚ЎйВЗзїWєBBгl;4evCѓƒ6E[˜™*ЬgЋя.эк5š;uœ@л˜!є†šЁПЖ,Ђ7ŠЬбLAKцEљ5Фс~ш +4SанЪZєІzBЗlЮtП2оlrCCfS4SаЊy!˜7%Г4slнТљП‹bЮ,мє6СBЁЩI7haЩ ЃaѓІ­AУлCdгAhФ\5єтЂsїі ­3‡@3tPГ„6eKf-лЦl‚>fo Aшy•ИвщщнFЫ[К{O „†и"z)Тш– п;тЂЗ%Д:щ9€>Eб;а”$ѕЖŒžшг&Н3 ємН-гEємН.uаВ96ZќxJЃK6„VЬ<Йщqf346hmmFатКgЯ… ДШnяв0КЬ^ŒЁЗєм мЅ хїФўЧLаЇЇњ{Gxєc™1Доь†.{ЌГQГ„–џ0;ЃUs43@? gFиІшўcЊn<)Š‹ЦЭЎш'б"МО5+lнВŸЅC+Ћ€шоќ$Ќй ЏЃЂ;1‘›Go#hdM™CЃе—"iр<š4'B“k%C›Бmж кj=ёц‘нГнж§ЛЂЭКeЛЎщ.m„v^9"šb3цaжВуЁНVІG ]ВсІUхWЛ]№•уAO;єЎ3кЫlžrэ:Ѓ§ЬкЦ<Д•AЏ­§}аžf‚m‡†йkMЁЭzUc6AЏшfНкEš аkB!Э2zEO-бkЩаЋRЈYAѓь••5А8hйь†^‰ŽцйŠ™ƒ›ЃWPtЩ†ЭІhоŒЃ™;6bnа[E[0ЃшpfFš'Fшn­dhЦ0qaЎЊбu*КdŠhŒНЅ {ѓ НBЂƒš іЄiKŠ3W­HЅ0cш‰§ТмŒА'(šБBzt slt3Ш‡ŽeVб“`шhf> †Žk6GПА@G6 ьЩgП0FЧѓшItsЧžAЇ23аLЃeѓJjs•b&бŠyeГ/š aіDЇж†@dщј;тxФnшЁЩm0šgЫ[е˜™d–б+бкyЗчбCКШšywoЬlЬц\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.ЃYнї]Cƒ šЩшіlц‘6уыЭнIиeoК~(R[‘[ѓ8бГ8g њmнШаћњ ˆB=SSа5ћ€~л74`ІбЉеФœєС†NЌ64яWfN L™@шdj-ž™ЮъУqt*5‰Эћэ‘Ь8:6kа8:…1ыа8:>лЮЬЁ†C[šyєŽŽЋЦЬ3Ф, ъЯЉб0ИxДˆ&fк\Ђb†а,)'зlР  ЫkВ5hНЙTГСбќЃ&цƒƒіъTjbЪAа1д4йнЉ“ЬZ3gаLЂUЖщyшfёqCВЈf2:,[7чh‹ГчЭz2†ЦvШЭDпF___[пь(4Ф!йзЊZxм} -ВMШ‡ЦшЉ€hžm†ІдZ6‡@‹GМ› ыі аL!ЧB hB]Сб&Гдоlе|­лвƒЃВА=Р—`&иэ ъ б›э‚nр†hpдƒЁйСбяз†vДКd„Ь.h;ьазТ8Кќїєб Х+(3‡й§*!бњAгhv@Юš4ЛЂѕd}\еќŸFhаьЪvB7шцqн­1єёБнЏЁ]дрŽжюiбмќ['ЉаˆYB#шіё“&uжТ2ЁдfhY}Œ OˆIЇGГуc#ДЂ–– ‚ЦЬ4њиxвЪ €FЭКО/гh‰\|ЧHmЧ6GГc(}blކе8КўЛКJL4p­љDkŽ‰ЦŸёѕзЊ™ЛyAЯ‡бVjks.бЏ^љš Љg|Эе™4ќlЬlƒЖп€њU•ŸйBО ­дЏИАmЌFЭKWєЋWд3ЏЎМб8y Ђ_sЙЂЫb —Ks4SафOМrкvшзЏUtћX+о+jПЗЧџDK%Bwqf Mš Сї”,Ь†jœ яižn„– нВсЧHДЮьŒ^.ЭаШcј”F_д\Жцш%cЪ3ЄОьеа bжЁ?|д|Й,"—}дюш0ЛƒбцЭЉ/ф2Рўј1 š%DќЈUЂiuHєЧКиш€YEwъ‘ЁљUєB†б$мЭ™Нб;;;IаDє™/šWcl_Д`ІбЩб[4kа YF›А}а3;;5њƒP>+sD/XPКŽНэnж_,њщЃ ?|цмЂё BnŽХbБГАcЁЛƒЄ=а…™5‡омєЙ}0hЦиНа{`4ДЇЙA/3C[˜™ цЩ=e3ѕЭЅ]{ЁЈqДBolX ™ŠЭzsГлдвЖіDol№j{Дdцoе…šЛяm†CoXЁ™‚юV&б›MNfV#х tЫцсLAї+Ё7а ™c“hІ U3џюВГ –нТљП‹bЮЬЋasRДАŽd†аЙ*ог"›ЮmЇŽ„^мAєB@ГРh9šuЗМTf mЪ–аZЖйНЁчѓЁа0[@oCшy•ИвщщˆаLEЯ5ш…„жНЛиЂ!Ж„V_ŠКe/DДіmм§ЈH0?вMzЁO1ДўГ‡#Zl[JBЯ!єiг`h™.ЂчюшѕЛ†^—‹ŒfАй ™ЃЃ™9Кd›ЁyxdємЭГe^w5#hёNнБчsD}z ЯКygAаeіbK4ГG““Š–пћ3AŸžniwДЛSЃf нЭZovE3іXž5К90Д~GЛЃs‘‚.ишŠЭ˜~K? h–длvшўcЊn<) ˆсе…ИY‡ЦдOтЃБЗC€-ЃwžpJЉThhнŠ›Т™а№:*Z2ƒЙ™qДrџ ЭLўвЂIshДzџ Щ<›CгfW4ІбкХRЁfmГоXаVы 7Hfƒћ‡лКw]Б#™ tЫ!šR{™Kv44ЁfЬЫЌ™u<ДюЩЛeФу‘ЬфЎFž2­kб”|,шiпЎЩlžТhX=кЦ Ѓз’Ѓ­Ьz a{ЂqЕTЏ­Сl_3ЎЖDCъЕЖаfєдНЦжЌ WЛHГН&вL %ідНЮЬpВШžjаМzeBWьбЂWЂЃyЖLцсцш]АƒЃaГ!Z0ЃшPцŽ˜єжжЉЬЩа˜yвЁЗєŠ: ЙцЊН%Ш9q‘ˆFиaбИКAomЩъ]нАW(t`3Ўž4m‰qфU+RCЂ'zЫмŒА'(šНгЃc˜cЃЃ˜Au0t$2Єž„BЧ3+юЩA3Sє tdГ žjsttБ žA'1wьIt*rƒžXЁeѓJbr•Lж ѓD'цЊiє0f?є@fˆNМ#Ž\‡ЂˆšлЉ™ ›˜uh&šєаLЌvмЭ_є 0]НЙSГБ›sЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\шfEпs э1i&Ё‡іш›5ёцў$ьВ7]? im›ш§QЃg\=zŸDџ№УлЂq˜gŠЙEПzЂљГБ%3‡Š ›ПчЯѓz6CЬпяKшƒ™§іэ0lй ьш}  п„VЬ3аМпžэЮЃпr kžц§Ц<<whЩМп$ ЃSБaѓИбˆY‹nй2:3Я@ГŠўa4jžf]ВM›Ч‰ж˜Ешš­ЂЃВQ3CЬš]>štymJ6e6EГФhвlˆnзJ…ІЭ 4ж˜hFб<НyŒh­йMБ-ЮqOlЦб6‡Я'6 lХœ­3л oЁЕf­оњnИтЂѕfSєMt}R:ф%Э†шЉf ›ЭаВ9 š?—^Ef#Дb‚ОVаТУžhе}­$>ю†юй€кŸ­ASцБЂIГ:[5›Ѓ)sL4`6F“цˆhШnаL‹южŠFЬ$њИ‹iи§w™уЁe6Œ>9БпбnlЬl†fњ$5KшђNЁЂлGOКьїt*Д кЭPДйэhš§5WюУŸyu…ЊЭй(zщ&~^ t™тmТžѕКGS?яJ(zщ‰&66Г–'i5lнГїŠЬбb.hШ Ѓ_sh6 Щпяб5ЦShcv`є^‡†'N›уЁ[6Мо—•7(њ‚FжCЭ)бŠ —’иђїгЁ?XЃ/у›5шMќ3.К@sW<3ў /HєхршњBˆ0+ьS ?XЃ/ єЧ$шh‘}I ?6ЅCsзhйЬЃ?&Gѓ:Ъшž­˜9іЮЮGЎxhоьŠюž•-˜б§ГЪSaѕl_Дh6ASƒ†й’™DзljGЗ'aЧѕtауEахUggўh‘НЙ НmˆІЭiблgгцХЂGѓьЭM•эŽ–Э~ш‚оєBЫlХь…^ThžНЩ ­šна§ у ћ№0whŒ]~пб2{sgЛЁ{ѓ†Z4/јQh+3ћ ЕQхŽ–Ь l{ˆp;ѓh6E3н-мЁw а–f4нВепЩAs‡о!бmщаLAЋц…‘9>К…ѓХœyЁѕD+{ZA ыHцaаќMяь bг оіD/@o{Ђ ZЧі7ЇG0Ѓhž=Ÿ›ЁщwФp;к= mЛЇ[єМJ\щєCcŸђТЂЗ5шЙ%:єЄ{TD˜єAїlш…§HBŸIш9ˆ>Mކkй"zЂO›ў~шѕ„hёэХ НЎ”Э›Эа;ƒЃ3ˆ–йэ§NEѓ№qЂaѓКЋйнџrЋGзl˜ИНGoASƒЎбf”-О+Жџ8f‚цйдŽЎs3›Ѓq3†ж›]б0[F—Ёf]яhЦRЁ@ГM™Ÿ8ЃWqт.‘mŠю?:щіЧ“Ђ0шЧhiGєo4Œ†VСбOšq4ю†юдкŸ­šE4e6AƒъШhвl„ŽРЬцhТzвeПЇЃЂл›0hн/Н4Eїl>-Š‹oШ‹aуhхRk4`ŽŒV/ЕBзU ^bhє њxzL4ѕœЏПўZBПzejfWёафsОцд@УЯН ЩЫхR‡ЎЋбЏЊŒЬиюИJ‰f=Z`cOEц|seЁF_†$ћk.нDќшV-БƒОЅЭQЃЯH4mFа*;8Ÿ5m^phŽэ‡VдВ90z“+и§C1ЗhtƒPшEи1а-ycУнЮ™DЫl 4лј ЮЙ7whlƒ”пC7‡Ђ‡ў ˜7Њ|а‚Yме›JNfЦ}:та й *Z4›ЂэЬXZb3н­мЁw(tCЗ2уш нЉ™df ЙEяь 77гЁЛярц…™9>К П”~_,5С€оюбgкХ†Fѓwъ3ѕп­S[™єіЖzБбu3†6VhRТŒЂ9ѕ|>7C“oˆw‡=Џ—:=Eаич%gДнžnбs;4zŽ {vмэСиЃ2œ  чVhЃЗq'ДРЎПЂч0њД.)ЈcŸ j}:64ƒЭvшѕu”§и ЮшuЅdhС ЂЖrяИ hх7DЭУЃ dFа5[BУцuGГ!šљЁsЗ6ъmW4ЇІ]ЃЬЈZ|Wlўв нЋб—aŸ“SЫш2д ЃщWЁVыатКRГ(hH§ИˆBK+œЊъЊx“fЋDёc€mŒюдК§ёфЩ“@шЧzДКЦ@h0 Ў‚ЃŸ4)р'юhНYD#Ы ш' кЯ ­~ЉбOШ’ щЅ4mцядл-Z˘tЯг#Lx1CїНш Ю}-яi—"™)ulДћКЦo.ЃBыg}ЗаŒљ™5ъXhІ#яVЙЉЃЁ‘Іu™bG2S/Eк\ДЋeЧ1лЃЇшЕHhл 2б0{-=ОкНVЧl…žN14Р^[УиwэoŽŽVщбЋЋVfНЖ†Ё˜ ДФž’f НЮŒЁWeєд ™зТ™Aєj—zDь0dPНъ‰^СаkСа  nsє ŽЇІЭAбСЬ[ѕђъqЂ1sƒоккЂа+МC‡4WaфIU…&дЅД7cьдш­6дМТ›AtpГ=™lm‰nбќbEjtш-Щќ@ъ№f„=™@шВТњЂ&W)hEХl‹~!ЄЂWmб/Дш•f= „Žfиs4­NˆžBЧ$+ю0шшdA= NAцмєЪŠў‡…TOфюIЭEŠYƒžlТ&бУ!Ж1z8ВJ7CэmВBэƒиŒЉшЁJўХвЌЂ‡&тЕdЭFM.анW-8—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—Ы§пэћІЁ6}ЇапK}їнў>|хEimX3Р Ѓ zVЄ˜ы#Ч›оt§а4ЄЗlІEПQаo‡ішš§FAП-о8(?KъhlмЬ,а,)š0ГђїD3tНV*6mf yh4).Э(bЇ7­5[ЃАƒ™)єMДƒљ€_UWХGыЬ6ш›Dh­DУь›Ўpцk'Г9њ&њК f­Оo„BšЏГ?њ&њZJ2{Ђo”b˜Џgз†цсаŠЙЪШŒЂљ7sэЯ†Эса,1C—gkб”yЌhвL yvhtЌAЧDыіГыŽОћhШ>fЖжь„ЦЬcFЃf ]ю_ нВON\аь€ш“dшхвно/ є W|єв -›q4‹€^Ѓ{6_ћиЩ Ф>9щŸM •k­бМ94КNkщ0КM}v\4њ mjюсхŸєГdєЋWFтЂЋЂ››+)tљЇцYњ€FžYesёt§ЌЏ›jєЋ&3SМ]ща Aл›C iіз]<КŽzaў?ŒІиmТЎџvЗаLAЛšУЁuЗО>НXc эc­K#ŠўЬ§Ё(„љуЧtша&цPш ћЂ _ёВЪкнšyє…}9(К3sш !ФЋА?VЅ@їfSєхрhЮŒЂEіЅ­ƒћЃ7РAShймЃwЁ784ЅŒюйŠЙc—ЧќЈ‡ћЂEГ+Кtto–(ЕAЗдGwїшЭЂ˜hхXU:%КL= VEзl|GЗшžНйН1zДЪоŒ–й›RAf-™]бмГДl‹ц’>;Уй0šџ ;;=[1slwДnв™SЃЉ=}мЁ™'кU­ЛuЈьу>FЋЕfG4b6F“l­йM™Џх Еш“““Dhд,Ё 4;ёA;АЭбu0š/zЙ4D7Ц1 —Іш†нщyГˆюимsƒЂ—ЖшcШŒЁOLйіhŽ<У}rЂ>/ZaЃЯ0C#rŒM?IЗЅp‡ОъѓDї№%г ™Œ~eŒЎ Wrўшђ ;єЋWВ}Ітmђ@їбЯњКЉ3Wљ ­и~шЏtЇŸˆ›C iіз‚šGПr5џFSъЛfcC›А›ПнtяО2#“ц`h-ЛЯ€L›‡@D›ЧˆжˆG‰ж›ƒЁ7>…0ќ˜ НБQЁЈ?ІG ъ‹:bХЫ2ЩlА;‚ 7:3„Це——ŠњcU"є}С‡yu*47g­ЈiДЮ§A‹е——Z4ЉіEoƒцЮsМ д(zчуGvPє6юе—j­ЙШ„э‡оирблŽш~аща-x›FwjЭГ7‹ЂMzcC1‡@o6ХEѓWЋш ˜Ќ ;і&ІЖ@+ъDh™nƒўЩ}ЁCwъЭБƒ е-Žš2 h…ЬЉC љнЯЕнЋw@єЯОhes8Ђ…бЃw’ЂЯZ6„ІvєBbB—5фŸ~вЂС7EbаœєЯ?[Ѓ _‡оаЃСMzБ0@ЗГЖEЗhlд @їs6D—ГЖ03*&Ђ‘Yш~qCt9kГНMЂ›oЁц…`Цб?FoЫhžн~3/˜і–W нoЭ}OНC7hr4є™~1БEжН}бвžЖVЧC3­йНА@[о=PєЖŠЖR/Д†mivCЯчs`ЉгЂёЁ;ѕМ 0їjMВCЁb‡žл ™СЈ чvшц§…B[šйЃъѓн# єœDЗjйнd„>3@ŸЪшрят=ZUsŸЈyєм Э˜ЩžvFЫѕЗqжZtЭ§Dsf;єњztЯцпШбыe%oН+zn‚>эаLFЏ'DwП˜ЁOћп[xДZ|4Э4ZќЕ1ЏЛ™F§УšlŽЎ3EWЛšuf Нno&йлŠк}*ў“XBД2jЪЌ YLДСЌ!ДВЪXађў ЬЉбьбу2NћИnU‹ЄFГЧЂњБЌ2Z FcЋрш'M!б˜FS+Сш':И™cїhz-§„,ZЛš`fZs tЫ6_MFkЬQаЪчЛvиDГAаЬгЌcЛ/;кcY ЭЦŠ&дЌRп-4ёœicЛMNl4ЊжЂЇšP=mлеЋу˜}аъ8f{ѕдНЖ mЋб0{m S'FOЭбk(клl‡žbh•НжУŒЂWWУ Uі@Ы№xшеUY=•#бk(:€™B jХ,ЁEіP83Ш^mrFCцšШЌЂWћмаˆЙ(”™Ёb­E'53вмЁЗЖ _ˆ89$Кc+`žН%ЋБA'23ŠЬЁЗsztj^L&ЕY`#ш•••tf=iб=[$жЊSЃ'“-‘­˜ ѕJ[*ГzE)‘WOdt]~QfЂŽbЦд §‚OЋŽd†б §Т‹ Ѓ'Ўh‘= ‚ŽG†иc4ЩNŠž„@Ч+ь‰/z%™Ёf7t 2Ÿhа/ХіѓH2ДlЖGЇЗ)f[tzВ›@C†ицшсЬ ›О}ŒХмЃх[^ЫZлЯšСшЁБb ZQMЬ*4cŒ3Ыh6>sзVїU‹ЭхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\Žы{ЎяК†ViњЁyі›ІЊ†“іЭs~3*єЌ 47ш7\5њmб№f §fTш™„.йoє0ь™њЭˆа3%§†@Ї†Ћцh0WlХЌEЇccц1ЃQs‡оoтб0: 6ыањmr4bж ыsшkє[ЅЁЬ3РМ/™‡AЃтяичтФ[EЧdгf348щˆhй}pЃЃБ 3#а6ЇG—bhЩ|РЂŽТІЭ 4я+цДhR\ЄxЋѓAym*ДЮЬ@ѓАh­™bKthv83…ОЋљ }†"ЎŠцЎ№Fп$BѓWиЃKvOПщŠ‹ж›uhжЁo" ЏЋ01jж Y‡О‰€ОŽŒО‰€О–2о†шЉцаhй­˜И+Zdцlи|-nj4‹€FЬзтUюшВрьП1кцQeЇB+зY™‡@УWіжуcй`ƒЄ13Юl‹;i 3ыФMІhhsxБ­бЧкpаIаћXI”žT™Н }аІЗє ‚ЦЬЎhФlŒfL№vl#Г#3лЂO$Д№ЌРhдŒОUє ј эРіFГаЫЅš €^FBKЯ ŠnЂс>hѕYiашsFƒйКgЙ {њWОВ;DkŸ%™U4њLЩ|е˜]б=\џЌоќѕзц’/ziЎЭЏŒЭ1а}єГОюЊЬEЅЕў“~&†ЖbDПЊўдќМЈhš­Ђлt?/ЃџhђY‚й›уП[zћ•)š0'Cw_0Чпгn‘ц‘ЂisєЦFBё(бzs(tй‡"ѓЧiаНй§1zЃыCєЧІ˜hй|аŠY@_4СЋ]vAhšэƒо№@_€ўWб€цOtМр"ЬšbЛЁџ… 1ГŒОDа;Сбџ’RбЈYb_"шђ˜cЖ;zCAoЭиO?•@РМБ­Л+Ѓy6…цй›MўшŸ*ѓOшKCєf 4Ÿ+њRƒnй›Rnhм-›на„@уl=Кd+fvасаАљч€шэ@hž šЋ†@Sf3Д…YBѓl ПСf ћчІёЂбI€Цо oДh Лk“ЃХћєйЬnПoŽЛƒцЭ СœнТe4ЯюПš‚y$hю{ъCACцИh‘mН‘алw-ОEє|n†.йБбъ˜aємНˆ†йРора={Ž O‹$ѓЂ}!ЦBCк}ъ€ўй-п9Z6ŒVйЇ$šОKЛЂU3†ž;Ёšfщ>нЂч$КeїhъЅшfквЬ=*Щ}ёЦюб5л Mні67]а,аs+Д™йніEгЃG-Зп g]s-КfЫцѕѕ˜шG њQ…о–аsGєz$ДZџіЂюh нГ[єzUЩ[яJƒЭ&hІ зЂлцшЖ­v—б–fнВэб<›BЏЏџЃШжНЃE[›5lєŽНОюbЖASцДhŠ-ЂI3ƒ_ŠcBƒыŒ ­ВБ•\аЁwЕђ/ЇГкЩ\є FS+Сш'M)Ь0š\ D?!аСЭ [kюр<њ Y ДСzв"mށnйŽKhЦвЃ•Oz–h6š1 =-2ћC qГ/кбLВЫGIsо-rEЛ›uhЪ<­ЬуC“цщnWFћАWWЭбћя„і2ЃьеUŒ=кl8f[єд iа–d ЂaіZбаS єZDДЭ™Ђh•Нж5,zРŒАUєд-УӘ!єЊ‚–Э4z E2+ье&в,ЁEіXX3ЭюhиМжЬ1Wок2E#цЂfFškє–ммАAqƒов ыUVŠв™až€hhа+‰б˜И0еhž эш•‘ЁЗ ƒ›5шЩd‹Ы оl‹–Э+CG0ьЩDeomЕкE+RщЬzBЂ_Ђ#™єA3і‚‹fЧcш Š~aŒŽhб!§Тг Ё'аQЭ{bŒЦйБЭ2Z6Л Ѓ›%ЖbЖBз№цАh–Ц,РiДюЅИВ’NмЃUГ:ЉЙ 0[ ‡ћЂ2#p3єfп=57СhёS^ЯZлd…+f‚кЈT™g–бl|ц\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхЬњžыЛЎЁUšўFhŽ§У›КЊ”іЭs‡~ѓF@­ž5ц§цŒ~ћіэЬішЁд3>]ВпМбУЈgFш7(:НzІЃпшфn-›uш”j•\ГГN™MбoпІWЃцН_' `t6lжЁJ5dNFЬєAŒŽЯЦЬТ–юаЂљмБбЈxЦп;іћxqЅ~ЂcВiГžtDДЦl‚Ўи:;6ЇG—bшБ‚ŽУІЭLЙwдшЊšлЧ%nLЎа˜:Н™AfЭЂudЦTБ-:4[oбЊЙBcъ›f ЮECю›Вhю kДЂО ­vл ZP3‰T­5ћЂo" ЏЫp1Bж [Й`ЇООжЈ=б7азbЦ;к}#С-›CЈes wE‹j€B …klЬвЈY5HОО–ЎђAGP›Ё-nг#B›~Цƒиiааu6ц!аШ•=іј˜6›l4fЦ™ЋLбр }дІ›ЃGwyЂнежшc>ГЭ‘Љ•DыIYДсэC3Х  1Г+6cjЭ8n›сŽvfћЃOдLэ†ЦШцћDKOЂаьЅ/š Fеи33„–дaбЫВhљI!бЫІаhѕYаK‰K˜%5ˆžН4™1Є6Eїђ+Ў}хŠцмкgIf>F_љ kѕRџЌŽќѕз_hќ‰˜ЯнІ}кз]хп^™‰‹0sДŽ-™‹Jnѕ'§DmЅˆ.џxЅљqqб4[EЗщ~^uFнС™„жўМЈh“ч6fžэLN4щн}e6eвœ miƒоиHj#Z#‡ЎК‹ш> ќ˜Н§Б,2zЃыУ‡шMдуDkд^h‰,Ё/ъе.л@4­іAo(hсDЧ R­A“jGєПŠ64xцJFб”к§Џ f-Rъ€ољhЄЖB‹Ah˜,Г/…8s‘‰:zcC>С6z3š§єгO…Ž ShžMЁw6{t›'КЌ2Wў8шЭM‘Ќ mЬ-КЭ}yIЂлYoЪљ кяj=ʘЕBцрюhнžЦg­E—ГО‹hЄŸ‹BЁЗЗУ 5ьŸыэi­ЊЕf#єЯQбрK‘4sj€§Гƒ: ZV#hjв ‘З–Ejє‚f™СƒNnygˆК§М9F„fЊљ,НЬIа-\AЯUtЯцШ‹QЁчРJРœy4ŽŽ>;г-ЅФЃ1s єіC /Ф3iƒ@;DEWьиhuЬz>GаЇE а"и=КgЁ ВНба†ЖAŸRhX§Г/ZОs№џ„ ЂUі)†д?ћЂU3ŒžЯItЫюбФўp43Т,оЇнбФKбЭмЂПјт‹б–fіЈ2?Bа%ЛCзlG4qллмДF—ъGJu•=зЂkvOnа,(К­e?zдpЙ rж6ЗGзs^Š~д ы?З9tyЙКо!z}НјЊр­—DЋѕo/–шvж-šUжН.гу лцшЖЭж…ўёŒ­§ˆB++"j]Л,(њ‘3šSSшu'Г†Н>Jt§Ц‚Ѓз]ШДZBSfdSkбыnhB-Ђi3|џYhLh…Ўф‚vd?FRoдГќљДC75І~ ЂЩЅ`є“К$цЧŒ)hƒѕ$tёп'­њ Ÿ™@?fтЌнаOШ" хYлЦЯ9КѕB3rвг"УŸ1.ДЁ:8šМ}”l‚\ wЫœбЎf:&кнЌ5ežюvetєTESьhœНКсuˆЃW#ЃНЬ{ucOЇлэkЖDOA4Т^[[K‰Ц6ШдН6єEъЕК(h› B ѕZзАшЉZa0Уl=uF‹ь0fYНкFšiєš\pГЄбŠYB‹jХмСУ™™ –сVhиМжL [јtkkЫ˜‹Bšk5юІ­A`Ўд$zЫНВВ‚“ƒ›*^]€hФ<єЄЈFѓlhGЏŒН  W4шрf z2йта+U‡7ъ‰Њ.jЕ/ЪVјšqѕTЃfDЧŒЁ'0zы—^ЩŒ 'šН0WЧ[ЃЗЬбЭ zТ‡›eєJ*3Ј€ŽkVе)­ЈWR™ut|ГЈ–ЩvшЪ‚,В}бЉФ›Fk^‰Љб [5лЁ›ЋГєіBЁ‡#ncєpfпCšUИйэchrЌf/фЦ#n2F SаВš ,ж˜EєаЈ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—Ых<њžыЛЎЁUšўFшž§ƒавОb+zжš;є›7?ќ0јЬ§FAПƒAзь7U‚Йhx3…~3"єL FПщ’бCРeѓ 4 ­˜+Жbца<ћэл!иY‡†Ьща X‹>8ЬЩрИ™B Š&Ьњ  FЧgcfxаc@ЃbdG›ЂcВiГ~аC 5fэŽІабиЮшƒ‘ЂЫп^0єŽŽУІЭ н†o|я8JЛAtf-›гЂ5т НЏЄ˜Ъ+Smн˜KДjЖE'1ЯФЋLбѕ?)Јц››hй}“­5шž ˜УВЭ6ЧF˜ 4cѕ+Oe_GB7tС }ннуo”ЦVЭ!б"<0`_ƒhщ"csєЕ`6ОKЇAЋцёЃѓD3РlіСc84veЏ=nђAћАЁAыаЧЃЁMЃЙю њјŽЁ•;9Щhw4Ц†б|vhW6l71;ЃkЖ9к…НєD3­х2Cџьў"2:р ™`йaає бЮЬ$ѓ0hKsУf F—ь0шЦTє?š\аиЃшh џсŒ~ддВ=ЊЙѕŸђqA—ьњЯѕ*Хь~д ы?хћЧмЭє? сDєм­Вytн?ЂЁЗя Z~{ ‰цйЉаЪ:IбGCыиЂ{vFуw0ш–M›нбfЭXж˜Ж)z}нEь‚FWJˆ~ŒTЃU6Е–§ЄЩ›M ЋЧЅMMЎEšaД“E?~ьЖ^юсŽK%C?ЬO|ЬЩаOРЛ“hœM?kZЕлt7аSK4lN‹žJh1gД–­Ђiі]D7CуьЕЕаfєд ™}а8{uUc6BЃц(шеШh/3Ш^mЂб&ь;AЏшЉz-z•KcжЂзЊтЃWяКgЏ*…@C№phе,ЃЇVш5Р\xід Н&к-›зB› й6hХмСУ™CЃaѓZX3юс[[ІhФ\вШЌa›ЃWVpqx3…ž€hи<єЄЈFѓlФш#аqи”yVўњbŠЦд Ээу№Ну@,ё!fм їРh\Ѓї•фЪ_Гвэj=šY “ЬZЗ5Ќа(ћ& ZКЪ§>ы›Ђјh@sГ†ЬAеns†Ь6‡TЛЭ™@3жМ№DqHѕuхœi4ЋoŠ9ћк Љ•еsі5WДj?0`_KAfѓ=-›+Еr•Љ9 Z5 ˜Mб y84pB>>ЙP№ж™ЉaД˜Г}<0к4њ˜kќшяѓ]@+Б“““‘ 15ŒЎsA_E#jнЋ9К)кuдА9кM˜б5лэЂ^zЂˆVžН,ђa3]6y†ZyVpД Џі9ё=Z}NHєFгIf WW7zŽ ‹џяД DƒцСбŒDУцhф…8ЧеЇ кфЃG(4і†8ЧеЇ :Zѓ.>ЗF—ь h‘§ХъЧ% =wCБ8ш/4МЇ)єщ)ЂFа?џьўBBƒo.s\}zŠЉуЁПЈ‹„.ўnw0ЩЌЮC+jMПэЬL2‹шpш2§7sЭf AoА@hxƒќЃЭ^Эuъ/5оGСаЛ§bНL&; 5ЕцGЕКў“IФН­V>*Ђ 3‰n[яћЧ?т KЗcЏ#ъhц:щAбђлKH4ЯN„J‰І^‰Vhƒ—тњ:ЬŠFї4Иўі‘п=Ё[v`4упi3ё‰ZƒЖ7›ЃufNmŒ^_wыб\:3У~#ЇаnъЧX-Zš5ɘ§ЄЭWЂ]ЃбnKЅSїшюИT2є“' аеOРsFO‹Ъ?www“ЃqЖ–\Длt'аS[4l­c#цЄшщhб@гьЛˆ^ m†Цйkкнь№І8ЕCЏХ@ЃъееhŒНŠ ЇTЃsі3ƒье&m ŽГ9@є*ŽžZЁзЊ WЙ<бkб 3ЋъЉ €ћ›{ѕЊвˆб 3Kъ-+єšT`3cWUOЇ”Zc^ m&аМк­˜;v(ГЁк ™kv8Гz‹мдцЂ€fRнСбИyДh‚жЌQ›ЃWVšIєЄE lиLЁC›)єЄHAo!цЄhBн ЗФє o&д“* §Ђj…+ЁY‡žlъІш(f\=Aд/ИДшHц˜шXd\m‹VйЭzтŽi†еДШŽk†а§Тй А'L§‚Dwьјd=ёDЇ Ыь‰КdЇ2ѓю‰':ЅЙQЫd[tZrІя‘ЖХ}z8Г;z@Г7нC›]аC“л Жxџx121бL47П" …*ХmЬL2Зюзђъow‚œЫхrЙ\.—ЫхrЙ\.—ЫхrЙ\.—ЫхrЙœaп ­1K474GлїJпѕџР5œR 6=›!fާƒдоВ€ўNBЫцaбГ&Фќb>3BПЭo‡+ьяИо4IтЊЁЭ3Ф<.єL 4wh‘§іэlеlƒ~;sl=њ­диЬcA[™аёй˜yЬhдЌEїl—­3­5;ЃуБq36шсб„Йa+f’M›h­1W™Ђ“Н Ь*њЭHбќ5Єy€ тb=›]Qb|GT™lРьЪ,ЃЅkєњ&(њК‰0ƒш.}го|M˜їѓ`>QDЬсаз\ЈYщ@ЉцжџRя`I}  ѕf Э*4Ћ_u€9 њZЪа АЫ]-?S1‡aE+ЋцqЁ ѕЕ7[6_f4dіE+цkРьЭžhеlŽVЭiа€й}| ˜DзцqЁЁыОћN№VAh• Ѓ}иY‡> šIє1з]Aп1t™`>>щrA_]ЅAп14cЧJŒЅAУцqЃГ3КfПycŠva/=б AKЯ#Ьішe‘›ш2љYЈ80y†ZyavCЋpњ9zДњTь€^‚hЭ“$ГŠžC˜mбK!Csбз]*b‚6x&ž…˜§аmюшWЏЈg!f[vє+Юl‚VЭ!аz6~UU‰5h@;0ZoŽ6gЗh3Amє3#ЂMй<кьgzoo4уа>цPшхrcУb)q@єFp4n…nNIO!†оŒІЭaабsєF`єfєWsW<єF`єfPєПўЅ5@яьljйОшРшшРшЊMЁџW-›ЗѕЋX›}бrŠY<%=ŒЙAї…EћšhVб6KъаЊљЂ [ёђRE+f§џўŸZ5лЁ/%45 KЛЌѕ,o7 3ЧqЧqЧqЧqЧqЧqЧqЧљѕ Wу™bО+­qї`tw'Г‡Š ГЌ~ЌM§ЯГЂ~T+ЈНєє„™{єЃ^Iя м†˜;Еa.ъ~zењўёўо0љRVlЈєн}—Nn*l~BЬњОє“h–аї&:7л0ЁП@›b™эFQ+h'к C0ЯžшєlФьFп—Ccfє=ŽNЫv™kDЃf ЎŽ›‘е,ъœsm1_и†9Hm5 аŒ ГMЕ}žЯcМбЙдf­ьІксбїї˜:гђїпСцвшЇП›lb|EџП&ŸѕA­ў;9њПm а*[Ёџп§п.zГ юв~шџJб›%Ж>цѕюўŸо-zД0ЭdьПЃаІњ2еЂ7 ˜iаkљ‘› єНёе’iІaSЂяяУsUшИ=ЄЭжЭS@цПMђ4h‰6ЭўhУœ ˜=б‡ƒiўџЏwwg˜'…>tAh“ ЃЧЈ!Г }њМq(ЭVєс0)t›l>ЛbаџЩ†>Ршc њ?Бl*Д,Џ-4p“еЉбА9нЊяѕ7Eb4bŽG[ДІЦб1ьџ;-„a6бM>3§ŸKцqj ѕЋ,fB4~‰fбЦE89mКэзИбц5s0њпџ†дŽ‹~‚бР5s(њпrОfЛкrL‡ўЗЏGџnН &Ћџ ЂVаПGЂУд$шп;ёяДИdhЗZFЗипЯf;5—B{˜-l t[A{=gAД–t˜žmДя\SЁCдДЧdw˜ЉаџПмi”˜rІ'ˆnЯwЯІCџ:=єЏПЃэdєЏПЋџq.%њз_‰еџш#@П:Э$шаЂ!ѕЏдшўѓNі8єЏZџC`Vа0М2є?лTє[[<њUM'џЯX4d6б!w|52буд љ‚‡6Щ#g4шЗДшџяzЧџа†йD‡Ј=Ьуа№DEo6Qh§чt39zЃ 7ЙаІ;Н1ђFkьџњЫ ­Б­Ёџ$D+ьЄш? блmд>О<рђџЃэь­TYє_љЂЗЁѕё(; 6 hЏЎšЇ‰6?H К№ђА|˜FаеŠўѓЯ?Ё;ЕŸ8ўњ `g@ЏD БЯ“ЪЃЁE§чŸZ2ы лЈ бГ Yќ Гџ‚бтŸ2гЃOс‹#- є6жlAƒѓ\%zж$ЁёzЁЕљVиГ™ §Ї'кЁ&DЯdДeЛbN„žЉhM…žЯч$ш™TjєМ-о,ГR‡Ёex КeЯРЬЁ4шЙ67СhSM€О:57"#'™щ+2є;$ЋzкdgBC7њЫ­ОКйyарўrЋЏЎ@v833кDЫl:s0кcQ_ъ`3%кcџеYашНМї<•]кђlЅаілЂ›ТЭдhQq/wWя›аПР‘ƒ›о_‹FЬIая‡FЁ…ШЇ~ЏT§щгЇкаNіЇOgѕПўѕЏtGЯ‰ўtю_чbЭяуЬЕ‡ЙC{ЈAѓћH3 кЉ†ЭбшЈ—тЇOas˜ГЂ?™hЛšЎўЁ­ъ)Ђзфцp5ŒЦйыSдцP4fЦаы5ЂN^­V.єПДP2ЈІGЏкьf7z-Gi†иЋ.Ћ9­ВЧšuєJj z­GŠVи+Ењб+ eмѕ(ДФ&0wl-ЋЏЏЏIа4d!@ЏЎжаКкi^гšmшA}}mkO4™™ ™лшЬh™ЃQsХш,fЛs_kl Н\VˆОШБн#›9} Ѓ-brГ НX, є5lЖ ЉЭє™}mQїцЪаКљ4уjrГНш‚б7mKЉ|цXєЮhЦй(њFЪ…Neƒv­Ždf*4РNg†б‹ХxtB3ЬŽAkьДfНXŒG'6›ьXtЯN/жб‹ХXtГJƒnи9Щ{1 [|щчC2ьt9s<К й€{ЂK“-ш]<Јti)а`D—BѕТmзЃЫЂ|ъШЧqЧqЧqЧqЧqЧqЧqЧqс=(ннЉ>^*cУвЭ*њБBєУƒaVиJхœrАy@?V‡жХНЙg?>оп?VrЂяOцzаO}8њОOE9Uжќ„˜я$ѓНaЮ~RBЬwїњЫЅ’цi Ÿˆа9сКљ 1cш/йб†XaпЁш§ХЈŒЙn4b‰NЫЦЬ5ЃQ3‚іл?Гhн\7њЬ6ЬШЩ‰Ж™h.ЖšлќбйиNГ‰ОЏ-p˜шьПƒЭ64dў/НљT й@ло`ўлFo6бЪQшџ&@џ}ЩbўЏНљя Г/њПIаKйЬџ+хўЏНљoФжЭ4шПЕ@Гnи&КcwЛ2`Іa{Ёя4d>ЃEїNšsЁяєџў/†–ЏеЃйКy hУ<нАеkѓЁЕQ 6—A7ŸїєQУJ'>ŽGмќЬќЂ—mšД1Ь@,hуjb4`ў'Пy.Aш3Л>єС‰6Ў.Ž>Hш&m^mЂџѓZГ}ˆ@Cцx4hЖЂZ‡7Пї0ЧГƒб‡ДiЮ‹> h™ЎЃѓ(4lЦбOДr%1њпџCшŽЎ^‰ЃcиџD /ГБK[ЬсшЁЯЩf!`Д~ХLˆЖ\Ѓ˜aДqХ‡6йіk~“‚бц5SІџ‡эИЦ‰ЎiЭ4ЧЂUЖы-Гџн~хЦЃз h—™-чО BџўЛг\њїо<єяRSD;Џ+Šр2кя:іHДЈэЫюš2zŒ™їфЅШшLhмќkVsњѕЗQjџб†š аП’Ѓџ‘§kпџœ"4[иcбП’Ѓџ‘§Ћ њŸџќ‡-к4Gџ3њUЩ0fџГMgџуooёшW':YE‡мёеШDЃЇv‡˜OhЙ1hsIS !3xF хSвQsХh|ЂЧ 7›Д{@у+z zЃ 7$шПЃ7FубM§WДЬ6п[мьПŠ -3`\сh;{+5єЖZ4Юо&AŸёбл$hшsщŸКиОшmEшП ЃЁ?!Каhј“^JД6~hsќŸкйхбРјhДHŠžТЧџљЇ ЃЯЅCЯFЁџђF0шй(є_VДZМYGЯш?Ћ@Ыь™”г\ z–='AЯŒвЁчmубІЙfє™ ˜GЁэьyп4dN‡žш`ГХ ›}ujnD‡6F Џ’Ёп]2ЧŽE_ѕQЃпy С;eFПУб№Bа*; ›kF#тДћэхJ+'НW$:иЖнЭgŸжссцpДѕnЎ7DaBћdџмaЂЏЎj@[­mяъъ§ЉЉЁпЁKƒ~п7 ›Il‡QџтОђгЉHГФЮ‹ўT!кХnЭŸўu)нбsЂ?Ѓ!ѓћ8s$њ“†vГAѓћ8s.4lŽEЧН?} c#цЌшODњ)аkjsFуьu­CЏЭzНj 0ьЕRzє A @ЏЂMіJЪbv з`Ља+§‰=вмГW`Ј9 нСЧ›…ХœM`>…ˆіѕ)лM#ўбб*ћGCg0 e6ŽЮaЖЁш,f {qJgwx Н\ц1Ч Б}z‰Ђ‰ЭVtЧVб№›ЫВ-C/Мбns.єЂЯDЋlsДnОFЬй&a/”`єM›dЮЕЂG ozt3ШЖЃoЄ–Ы2ц1шbцшrцtш„f€MƒNkжб tbГЦ^ г‹щбYЬ >-ГѓŠЯhнŠЮnnƒ^.ۘנ‹™ Жњ\9s<К й€ћЁK‹…‚ˆљІ6Гж`F—If1sлХмWГЕO3‹)˜9Žу8Žу8Žу8Žу8Žу8Žу8Žу8ŽЋЅЅЛ;ѕбЧsehxšFзЄ~аЇЙmxќQЎS $ЫшћкдzwКњёў^UwfнўX‹њЉ Cп]ФћЫ—/eЭOйЮЏ~’Cбїї0њЫЅ‚ц‰ Ÿˆа9сO8њЎNД.Vй8z`1*bЎ ›ЧЂгВs:ѓ\cf }‡ ГВшЛ)Ё/lнЌ­" ФAЎm›чv@кBВЂ›9†бїЕЂЅ#бIдДcУs­щ/џ§яЩЩџ§wр<›шž ›щй‰бџM€ўћN†а€FџW*'иЄНбџM‚ў{Ш:Яџ+хўЏЙљoФ<­›iаЋfqЇЃџ~%ошгU™„§ЗњВЂџWU­hбЂ!s.є€ў_-] ЂGЋu31V“Ѓџ‡nиЪЕ аІљolяPс‡уб Љщбй;єсpаэ?ˆёE/50џ}њМЇSо—PД~uєч‰ОАыCєб\зЭOє‹ЫЃNДqБ‰ўЯhЭєAGkpНп›фџŒPCf;њржи†љŒŽVЃ0ZЂhsЂ3Ѓсh“мЁ#е й‚Ж›‡ф ‰бЏџDМаїЎнЃ#дџўw ZЈцп<ІЙ %GЂa5ˆnSЬb<:\ Ђw;œмЉ;‡ kNЬНДƒќч?cблJт7)m^г EJДУЌЂ!5vсiЎџ‰VйЎkTДЬўн~!HŽ`hч5 њї&з•Фh9їUгGџ>4єяG{<п[9єр4Ѓ“=Ђ–gК,кOн7eє3:иэfft•hŒќыЏП’ƒџём‚~}EЭФьДЅDџJŽўGrєЏ]џsŠвlaEџZr3§њЋњŸџќ‡%њѕѕе0GџѓŸІZw‡Ђ_• ѓhі?џ ЋпотбЏNtѓ }юD~{ Cы™шaДуPї0s>7mшh4dІC›/УД| =jЎOєєfГ AћБ4ОЂG 7—.ц њЏLш>є_йб›бшП  %ЖљођЇ›§WДэ 1эНO˜—G4QoЅhбђ№4ЎоnыEЃъhш#%z›mg{ЂЗz”huИ§—‰7Dh№ˆ.є_њЄ—mŒЏ Œw­Bш™uќŸ5ŒnKˆžђ@cj Z$CЯЦЁџВЁ•F˜uєlцPлбљЃEМYQЯњмцбш-Ћgr.s%шYNє|>Ї@ЯŒвЁччFЃMѓь]Хh‘meЯ‡bб6Яо™jєеЉЙZŒY@bxЎ‰аКњ њ]9њъ*њн%s, к„GПsЂ‘;eFПK‰Vй1hиŒv~ЬЛКBиСhDœ=А3 mwѓиёLtА9mН›у б˜ыnBћd§рё@Ч@ѕбD›ьБhгМ3Ь4уhхкhР|ЪЇyл`tУЎ}pЂ•+єВЃNДzЅŽўOл~OivЁ#бџЙ уЭаоaG<а*{піЃx4lЦб‡`єž˜Qє!НGбБlЬŒЁ}ЭщаЏЇ3‚VЭП§‚&Z €йŽжЭ8ZКŽ§яSўш&Щлц+l’bA#Whfm\EŽжйqлoПIf ]•mНц„ўЭŠЏ"GЋl‡YќІ$Фя}ˆ—š ЂзXажыШбrюЋ0ДћЪiЂ!3њѕ5њэ­tˆЙ$Zf™t D{\9бща>/ХŽнќjjh!ЁЧ˜)аОь Ї:‰QsFt˜9=њз_EбИ™§‹9§њŠš‰йџhCЭш_'ˆО˜§ŸSДhœ=§kє?ш{щшц[_Ѕhиџ<ѕ#йќі~еаџC‚ўgєЋ–fЭў'‚~ЛƒЦЭП&5ЫшЗ@ДХќЋnvœDfюбчЦ Ms§hРўK:‘žбч6—|б~ьМш_IаeBwQ џš њЏьhЃ]ьП44іЩƒэ˜щDш3€v-84ійcлGƒ>-‘ЃЗФhш КћСV‰§?Щат‚о’ЂЯрh;лDЋ/Хюg[RДPаЪшjбУcачџ) ёNє_tџГDh(њ/}†+fRє,Z(fJєь”ГqДzV `VиГОќш0ГЬ8њO2єЈ‰€eџI†БЂ%є,+zN‚žН{— =П4%є<)кdћЃaіеЉЙQ,к4Ї@_Ёш@ѓ)@|Aыl7кЖ@ЎњL8 њmЙŠОJŒ~зЇѕ§ЃqГкзL‡Тb–а*6/—5 AшЅMhЖ ЇєŒ^:а”ц4ДЄ—4Љй†й:zй—ЧŒЃ=Z7_Ѓf MlFй )­™4НF/МбEЬ zЁ…ЃЫ˜Ч —ŠF'1ƒl?єR+Ї9}s1п”4ЂoЄЪ™iа™Э;пЌЃus:БYcfmї№CЇ7гЃ3˜јxt.1%:ЃЙ‡Ч evnГЭaшьцЖ1ш2тqшbf€эƒ.щuЃ‘LЅЭmZˆ]šk&Гati!аBHf1 ѓЅ‹ЙЏnэ%Э,І`ц8Žу8Žу8Žу8Žу8Žу8Žу8Žу8ЎІКФ]iŠw'эpТ{iŒg ZU?ž+$УгЬ КѕƒднЌОT*‡НєрОПЏJ§№`AŸйї—+q?=ЙбїК„њщ’}bЃш/_О2;бїњЫ—мъ'mВ1є—ЎfњўVљ’W§ЄdGппУъ/j™Э4шдъЇ$шДlньи>0ДЉЮjждОшœj§ф.4е њЩ]dUУцКбˆ™ˆэ6{Ѓ!sNДџюQэ1бжїI šы@ }Ѓџл”Щly3эBSЋУW4О>`pu№жQ§w“AњЛаџUЃ5hљK„;є}.єпC*јœВ8TєёЋ-d"і.},†оЩh‰- а'іБ ^еэuЕ хє№Ћо|Q›ьёшПѕбJЕtэ—}єЮэe>Ћеяёі{ђ§cч‰6Ш‡УTMД1зфшнnЇ›…i>lhхNш=1к˜ч]“1ЬЃш†]њрD+—jшцЗћьшƒ­^ЊЃџг4 nО ]шƒ­ЊїZєs0њрƒVдUŽНлйб‡`єAЧЋсyFб‡C0zЂcеЏ0@‹ 3€&Z ЏЇ‚а*љЗп~Ћ}J#[авEФшџћпahЁˆ1Д~ŽŽa7hmЎэfЁ™AДy5ZŸk›Иэ7й ЁЁ‹шбЪ\ЛЬтЗп$ѓoПŸr€e5ХЊўїПЙv™ХoJтї!‹™rЎ;ДœУЌЉДѕ2jДмЋћ* эМ0к­ŽF‹§[*ДS~Ћd†бЁъ8Дб>ЯЃеqkZVзўїП}.ьVєЉ:аj эgN‡іR‹3йП7ŒœіTЩбџў5”§ Š__M€~#BП"ш_›HХџhТШшззdшt3}&Ÿаџѓ?џC‹ЦчzњђyКC A’ШoocбПЭѕ?џљЯ=ЄЂCд'єЋо@IбвŒSЂџчмx25кLC$ŸчYXачFЁЕ­ џŒ#Cѓœ-ФTаЦеЖЛaшЋbh/є•њYхh@œ­ТƒбяоЁцДёU^*4к/hсиiбїCпXptА9нћ.У-"ШубЭIєоf•эk@t"є/—Ќз}:їЏЙйК9)кЊўЄЈ§С?-4Јœ?U;аяЃШЇ@o(SЛаБj4ЂЎэ˜ыїыѕšбŒŽDGšгЃmьX4Ў2ƒьїЩаЈ:а Аз]љаИкН.€^Ёj?єZќZќD„AЖЈW”h>ЉW њŠVеЉб zеf5ыhE  Uv:ДЮўT+zЅd1[W5ˆ–сcбТ‚–езўhдМ^ЗДG“%ѕ HBъєš ™%Жэi^S€6bюйзз:A[ЭДhмь…і5Ђ…А˜%ДЪбыeш3л }RYб”dzБXHш!Н\Vƒ†дЦыАѕкбДf;њ”‰ОО6б—2™-ъEŸ-“Q4ЙS/шсƒN`і@ыj]džaєB E—™gXэ…О9хD'2Cj?єR­zєЭЙR‹#}#Ulž!u8:ЛйPыцHtZГІ6ЬъšіEЇ6+jгЌН§ащЭ2›Х<АЧЃs%јhtns4zYам4 ]D ЋНбХЬёшrdˆэ. >ч…^V†Vй2YˆŠбMошвP(™=ДЬm'rїGёЂ2g’Й­zp“fц8Žу8Žу8Žу8Žу8Žу8Žу8Žу8ŽуЊьсдpФ{i_ЊЙvєCп’<цQЊ”SюС}_њAыюЮdп_z|ЌўфОЏ §дfGпнн#шЧЧ/_J™уб_ВЃŸњ\ фўfЙTТ<є!:ќirш'#ДЬўЂ•зќ`.ƒЬ лaftшtlи\71 Ж‰NФvš§б9':`Чыб 9 :|ЂЫЃwЛаŠNGЬuЃБНc`ћ Яь\hlЂkFяvиšІESВw4n.‰оѕ™тсЛР|w<†Ѓiи; ZTŠо!шюq;z`ПjиЭ•uЂњЈ EFДЬvЃFzИ{іЮэcЮ…ощhулєЖУ)@нТеЏїћ†ЙяK‰–Цшƒ­hд~ Bћ›гЁ_ћмш&UќлЉЉЁГЂЅЋ’ЁM8|…"Fањ58:ŠmA#Whfm\CkжамvbўэїSV1Т~ЛD‡Ж^Ѓ˜u4r jІA7lзUПiш.дЌБп”hаЮЋPДхдLƒ~}EлЏХ“@›цКбM€9œMŠіxОъа>ЯЧш0ДЬbzhбЃуЭЙа<фЙqvtаs%FћВУТбalЬœm3‡ QsДеL‚І7ЇG'03:šlї`є(іxt*sJt*rS*t*o["t*nзЯ‰о\Ъ‰†й—шTR)"Д>њЯS>w§ы/F37з†vГџ*€ЖŒNˆ0hлh*єРоіMНzЋU§—Z7ЇCћАџђBцmВgГщЁgDЯквЃMvJєее-m3SЂЏбB bRє•5њкz7}• §ШDляЃЏŒЈа9mќ”}fƒb'њг)“m>ƒ‰Vссцwоf˜Ы !ы/}:к0jЮGCl є/(Zљ‚žУ6 д  еДЪ†ая/щьpЏ‰7ћЁп'Cыb/ѓmgПзЂC›f*Дn~?жмГ3к№jCCцКб 8 Г]шh6jЎšНаіТh?ДmЂ!і‰Ž4[йЉбёц4dЎ šібыtц6†VйыSщЬЁшOU qЖУ\%zх0A6#ше%дьDуьёfє'"4a›шOF.4ФІУше(єКz%еКОіEЏ•rЁWhЬœ }fЏЌ5hэeжиДhЛйmšзiЬЇц ZeЋшх+бšiа.35кХnF\+™шхВ>єЕ†V7Ѕšмь@/NiъkНє@г›ЧЁo<а Ьhн‹л\ьцxДlЦбIЬ6ŽVЬ(:•9}3AєMХш‚ОёD'3[и }#eGЇ4cш…НДЂ“š5іТC/­шдfa5ЧЁ“›%6`ŽBч0 ‹9Х| 4ЂszЉайЭл]B<]Ш В}бхЬёш‚fюF—іЖyЁ+3_‚бBдl†бТ@—fТЩьѓOєљлЅZЭb!4ГhЭЂfѓ%Щ<Іhц8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žћљz8еŸ<^у™bЎ^§аwЇ$y*ХTz№@п?жЃ~аКЛ3йї—ы€?y яЋB?ЕйбwїїњёёЫ—Rцxє—ьшЇ>ЧњеїšљK^ї:Ÿњ‰Ы§DŒNЏ~2ђGЫь/j™ЭOц2hРЌАfRэ0џlшtlзъ№G›цThи‚юй:‘кiіFCцiЂ“ЈwСЋЃ]˜RНльўq њиЃGЊKЂGЃ=м=zЇч‡>œ DяЯ  Г6ОMяЬњ WП~мЫтTш&uŒ>Bа{ХмT}АЂЖŠ6KжЦ f­\]-hFбЧЃ =ЮэГ:TєЁ86›jа<ЏF‚б˜9§zЪ}ађAЃцhєk:ЦL~эѓx%žRХП*Š6ирxУ ЁЋpt”њѕe#W(тёш5ŠЦ/QЭ:М$щLїpы52љЗп~?хBCьЗKdhћ5ŠYEЃз fє‰эМJGwсh…§ІF‚~FлЎСШThЇ:нБ ѓаІЙnt`W“Ђ#ЭEбOЃCе?Zf €ІYЃбЂGЧ›sЁ;xШs!тьш чJŒіT†Ѓп(ЬUЃ1s Д…LƒN`NŽNaЖЃCд9бdSmUW‹ЖЉыE[д7ЩlЖЈю‘лŒЋn‘нLё9ЏQм €yi 8%z>7еQhгŒИЧЃчCуајнЛwЉбѓ1hpšпъбшЙYИY@фw}„шЋЋ+@|.Xm3гЁЏЎHб“Ѓ/ЅFыjїчi}ueUAПJ6мyбŸ>}2йРsшЋ‘ш3;бŸ>j?ДтŽDћ™…1ЯЇўѕЏHєе4d§ЅЯ‚ўдЁUЖ?Кg“ СаJЪŠ'ыш_Дќа.іеећs;FЌЃУЭ>шЋ„h]ьeО ­ьŽќоЄGЂn~F€Ј9ZтCCц шјѕ‚Cб0лЅ~‹FЭ?.њЃ а6€†иЩа6ubt4йЊўЁа йT'[1шOZW—A#jOtJГ•†VйыѕКєЇOu qібЋеЪjvЁmъбfНК„šh\=оьўЄ‡Ѓзk›šРŒА=ајІЗ^Ѓl1Œ^­ ѕЕ7z]НZ™ъkC зjЙа+ЃЦlЈНЬЉа-л„ЊъkSэeжи„шS^шk +шЌц} —bЙ\"ц!ZВ[-:ѕџ—v˜щбЕеgК^.+C/ }­ —hzГmSћ ˜G oNЙб)Ьh-Ѓ/ьЬцxДdЦбiЬ6ŠО‘Эг@пмјЁ“™8єBпHйбщЬіb‚ш…НДЂ“š5іТC/­шдцшфf‰m’Ѓа9Ш=2‡Ѓs‘Яц@t^1ЊBч7Уjt 1ЂіF—2Cj_t93РіD5l7КДї’К7—Ж*Сh!j6‹ž­š5ti#’Ќ>џфd>§ЕfГXЭ<&Hц8Žу8Žу8Žу8Žу8Žу8Žу8Žу8ŽуІбƒTi‹oВљЎ4ЦЃоЊ$xь+eд{pЂя+B?hннAьћЖGЅrц'/є}EшЇ6њОяQыЫ—RfњО*є“њююeљ’›§49є“д8t>јгфаOFўh•§E*ЗЙ~4`VиБшЄl‡9§Ѕ(:ny|1ЪiЖЃяДiN…v­h}o„š †НsЂ]K:?zwЪŽvэ.tј…и>ш3;z7Aєю :{gA­щŒшTШ ёx,‡оYажKб;­ГЖ{дŽюиУЏ\/EЖnо)fњиSш$ц$Fб‡ЖЃ–ŠnЎ–ЕћKiаЪуГ-4є>)zЗSG f}†7hљzЭLР†Ь2уhхzУ< š4hб [–НV Д65ch—9к…˜єёш0dћLДŠ>Ѓ!ѓ4МЂM6bіBƒц1ь`ДŸ9-њѕ”?њp№4'EПЁiЭБшз>їKQUќл)лŽс4ЧВQ48к0џцaN‰Vйј’XCcWPЃ_ДхХ<=кмУэзHтSПŸrЁ!іл%*ДуХ,Ѓ@П‘Ђ›\Wщш!і›ViДхд\mП 1OmšыF7цъбЙv4hgџDh™-Фи5]kЮ…рgДп…—G-кѓй*@‡7E4f~ МON4j~ МQ§xЃVt(ЛŠ—a :яоAД@эU*t*o["t*nЃЇŒNeэ#Bo”RaЛhа›‰Ё7@ЉА]ŒfД%FE‡м z{ЊГnћnPНк,ре CnЁSГЧšat"lзhДЩžJbэЃGЯ&ˆž]JЂНDžM=гJ"Дhнœ =oˆ8{.ksнhФœнбƒob1ПЫbž‡›O!т6*ыU nЃBП›њ%КaCєёшwIбр|FП B:‚fœ­›эшOХал;а­љгПўŽVсcаqцRhгњKŸгќЉ9‹>=РiаПdEG™т @ЛиКaЧ™Х(Г7_Хš&ўхќ•јICУьїmѓЉqhг\?0ЁЛшбљ|Ÿ.ŽНОЏУЫž":вœmвcЭгDЧА!4‡а2}Šшц"шІ1цpє'OДнœ НZ9ЬVДУœ э2—C‡-OДЪftл\еўшЄЛ‡Н2аŸаыДfНъCЬж—тњTJs єкŠ&0#ьНXœG]_ћЂз}щЬz5НЖЂ‰ЬzЅ ›ДЮ†бk­4fНаз4fN…>ЗВЖX\l/ГЦЎ НĘзщЬžhо‹/!ц>jq њ_кn.–йчtєrљуЁ˜“ЃS˜SЃ“˜=а:ЛCпДйбiЬёшСœmgУш›>зђЈ}уNfFпxЃг™mшEЕhœН˜ zсD4ь…†.kжб trГ_…ЃѓˆДiGg3_Ьшмb t3ШіG—C3l_tIs,КЈй€ћ K{л<ађŸKsх ЖŠyщОKцДИ E­цK2КДХЛЫзд“2sЧqЧqЧqЧqЧqЧqЧqЧq\к†JSМ;Y‡оKc<ъ&јNNёиUHhіЂѕc=ъ­Л;ˆ}пєЈT“к]J§дфDпїщъ/D?~ЩЏ~КdGпнпЃъ/_rГŸ&‡~’r яьшŒ№ЩЁŸŒМбћЫа$бiе&YUЧЂ“Њцє—/Йдtш/zЁяДaN†WД}Џ‡š“Љ‹эD;–tєю”эи;œшn §4IєSњТFбФънбЛK4ш< dgA‡ЌщœшTШюq<–Cя,hл6}<šjšJНг:k/КаgЕЬw iдКй }h:Њy їЇ’˜w=GИКG7—ыb"Е ~ez€бG}Йо0ЇAяvъдl [x‹–.зЭlШ Ё!3ŒОдО45Ьcб @ƒf}bыOВзK6F!f}tGЋНЬ1chU ЁGЉ}V‡‚>ЃAѓ4l6еˆyz;}ˆ0гЃ_OљЃ}ЭiбЏъa†Ÿ3ЧЊ_ћмh!№oMуЬ‘j ^ 54rIBДТЖ\!“U4v5њUЭУ,$ёЉпwЃ-ъЗёц л~b>Ё6~  Н” §›ОР@ПНХЋMt“у"нfЙђFЊiбжЋ0s&ДˆB Ф<ДiЎ} SЁWХЂAѓ4бСъёшп*AЛе[„ЌišBŠŽ5чBnсщŘ  Х”аЅDЇ№ЖM‘Iа)РM?њ-ш>y—4ЮЙIоНcЂh’ЗФjаoЗШn™ ˜нЕI…эЂCo†RaЛˆаЅTиKDЛЧІtШ6@‰А]ŒfД%FчBƒъ ”@oOuиmWШ ЃЗ“B…мBЇV5УшФъбшыcєъ†zж”лEžM=ыJТ=G‹žI%сž#0 аœNˆ6ШЉаѓљxГ@Э‰иѓЁ‘hиœ=Ÿъ4BNюшїAЭяrOш˜;!т6"ьUHnЂBП›њ!КeCєёшwшOЇj@П EћЈЏДˆбКй†ўtю_џ F_F \œ ­ТЧ !Г§ЉG;й аТЄўв•=И Ёl }o 7 КaЧ™…ХŒЃ?ЉhX§ОЩB>Ё#ЭлбŸt4Ј~яV_AфŸнEŠНŽзЁ‰†дEај5R{АЇˆŽ4gD›ђX3rшї$ш6‚6дZІчD"B0A71Ѓ?љЂэцTшеj кa‡Це њSh‹кaжаЊКкœыjа({:щ EЏњ0ГmQЏзыДfКWыfЫљzme7Уъ1шѕкŽІ0ƒj НXœG]_‡Ё18йDЏVёшЕ^Гнд uvšŠ|n…vA__ыj?ГЪІE[дЙЁі5—GK№М\.л{,— К‹X<НМ$ьцhI}Ю@gŸh‡zaSџРшц­ЋƒаIЬЏD]нЁošш4цˆЉ6Ь8:•йЎ†б7}гAпјЂг™ƒб75 -ьХ(tR3†^,jFƒьХТ.j6а % ]pECptГ€СQш<` nšбyХm€9 ]Р ЁЏ§б%Ф0л]Ь<]ЮlВ}бEЭ:ля Б4Й)]к+ …f^жfР\Ÿ~Њ˜K‘tѓƒж,š/ёj%ŸZЈцЉ490ЧqЧqЧqЧqЧqЧqЧqЧqЧq?@mwRњˆЧЖ6Ќ'њБ*єƒдV7цўўQЉЄЗщС}_њС}пVћС}_њЉЭ…Оя{дњrЊŒй…ОЏ§дgGпнйб9сOD?)Eчa?M§‰жй_ОфcыцXє—ŒhУ‰ўЂ•зlGп#hнœ ˜­ш{m˜В!sэhаL†NФž$zЗsБэш ЃSАwDя2 ЉйЛ Ђw—hаyШЮ‚іо=2ЃwRГ>ž [ ћ} sњXНгђAкŽRОhЖnЦбК9Н'Bfm˜ДЪ^tš8 ZXЬvДааћЄш†-@ЭњЬ>єpѕ~Џ™ иyЇ˜jЦбвеєž šwњ(Фl Я№уQОv– ›aєБД D“Ѓa3Ž>T€FЬ(њ@†СDטщбЏЇќб.3ќ:–§Š Ё'Гˆ2SЃ_ћœцKїЗ6/s&Дх Хќ›—9Z†лЎшНПІ §F€юиЖ+4ѓЅPє[пxѓЋгŒЃ-зXЬсhУмfПF7йЏМ“Aыцшk Mt-шŽ}mdЎш)Ё—НйŽ&6[бЛ7Kх4SЁГšl_tnѓ4бюmOgџјшDцрвЁoNЙаЉЬБшt2Г• Ѓoњьш”цPєMhœ Ёo*GƒЛ‡7:Б„/њта9Ь:zс.8б{с.ДЂєТ ]СDKь…^бљД*z1н|jф.!†бзошBf€}э.gжбКG4kpУŒЂK›…—YE—&™f!`tiЉ”ZдfnгбЛ5з™aюаЂ^s›$žNS4sЧqЧqЧqЧqЧqЧqЧqЧq7ѕкюЄєM%hhNєуcMъЉ;Е~Ь§ЃRAэЙ/t]ъє}[=ьє=„.Є~jГЂяzБ‰~ќrЊŒй…ОЏ§дgGп9а9сOш/™бOJcбyиO(к0Wƒ~ŠDkь/_2В-цє—œhнLƒNЫ6ЬоЏC­›SЂMsк0ЇdO ЛG:{Зћaали0:{7Aє.šZН;7)єŽg}ьvИк{ї№@я“˜MЕmЫ;žй(zOЦоэ,j }Ь—ВЃw;›DЮ Жc}ьїDlнŒЁOH•ˆоwЅ0Ѓh}žUДЪюЗŠ\hE-†‰жЩДPаћ}bєI-аЖ}f[tё ЉЃЧГ!3„Ш0њ^1‹=T ѓNЯГ‰>УђЅ z$л-DFаЧ ЂЩбАCєŠ sєvк ƒh§BzєыЉxДЫkGGГ42кŠЦž‚§кчe–иПЕе„Ж\Ё˜ћ§wЗ9!Z†лЎшИкmЖЉ3Ё5ѓЙXєКcЃEПѕ7П:ЭњT.ДanГ_ƒЂmj ўІХh?v(Z'OmšK eЖу2L‡v^U!к}U$QџМh5ђRt_GТ&EЧšKЂЃЭбWF эsQ:Дп…:кыЂвші|ŒŽBG5ћ2бhtєо12F—BБ ™нДI•ЗHVЉTжKаžїp=hNŠХ1шV*АРЭoїЭ%а!ї0М…–Gа-эЃmщэm{Њзnлп…н"?ZНнн Z/№&y–„:ФшLЋ# z6K;еyzv. іHŽGЯф’€›ццьhPzˆœа Ђƒя‚Ђ3Њƒo‚šЋGCцDьyгXД@ЩIаѓ9 ŽИjN€ž›QЃъOч>ŸŠ7Ÿдf§ЎЩ §Џ§ЫŠОККБ}Фh›њг' m›ы,шwZhл\ЯЏЎ\ьbhL}u)щLыd|‰(ш§ЫnЖБ бы*A›ГL‰жЂZгєhм|5nІЯlеќ%)Zch™э^wхA\ §)mc7wl'Z7 еп‘˜OЁтS‹Ђ6бЫхкБй }эƒvЋЩЬєЂu__КООЖЁ—єi_ЁЭ^4шыЉЁ‹kЉљњњ3А:ьhbГ{(шsњоQ!кTwŸ;>f+šкlEcsнЁ—RSDg5;иОшмцˆU„NbЖВЁmoи=ІˆОЙЙqЃS™m ФюиљЭS­Ёo†ьш„fЗКJ4ЊgњЦжŒЊыFƒьМ{јЂг›іb:‹YG/&Vй otБ‰†ч9Wg/>hpqф&їшE4:?Йiф.Cезžшbd@}=ДцжЭК0YQцzбMNГŒ.•3ЭBhhQ?ZшшвB$=Аы5 MмжšЫ‘ќвЬЧqЧqЧqЧqЧqЧqЧqЧqЧqмУЅЛОв"wC?(ннСьGЉRвЁ/є}Uш/є§ЉG­zЬ0њОєS› нАяћtє—SeЬSB?ѕCч„?Ёш;oє—Ьш'%‹й‚ў"•пќd1пIцВш'm˜яю•0tz6nЎm1@'f3:[7л—t шн)C§d1ЁБ б9'КcЛб4'aя’ЃїiЬ–2Н?•ЦœН'GяœшУЉxєўRГ‰~ @я wJ№–Ё}*5Вw‘шcAєЮ­w4и№йяЉйК™Н'Gfэ‹VйsДжЭiбн_є™}Fwзf 6ŠюG fн_ šг Ж: 4ш3\ўђ4fУцfCKз%A#ц>Ю}<ЪзхDуаЪuбаH§ћя3ŠХ&GkW%AПОŽC7uVРlAЧГ_A485ЫhуЊшзKfў[ляЧ‰ўЭ@ЃWЃ_•|аП) шпЧЏЩƒЖ\ BП ;Жэ §{њэдxѓЋгL‰~‹Bц6ћ51hўж7є[fДЪŽAП)M§V-ГэWН!б WUˆv_‡ЦиŒіeћЃ‰и‘fkіЛBЛOx'z)Ђ=ŽЅЏ§yRшЯНy:шЯRюыъC{\W=РƒЬ{Ќ9jЬшІ oЃcбЁьQ ф'G‡БЉб› шqћ‡dUŠAћБЁ /Н!@1‡Ѓ7F1hѓЖmк4Ч НFKцmЌY€т(Дяј­RŒY цКбˆ9Кƒ3šнПvэhгМ 3@C dЛЅ@мЁf‡\_ :шњJаГйєаГ(є8s,zІ†і=ŸƒцHДnЮ‹4 ФьЭІ@‡šЧЂ—tшOŸB_‡; ™}аŸ Ё6hі`_NЃ\ &;™]шOш95;иŸД{Ў”§)=бцHє'oємQŒ95кeІGЯfяоC;ЭqьЄшЋ4цHДпюq%•sy зUŒЦ_ŒЁhRvЄ™aЖАпЕбЁИќgЦая’ЁЏЁпѕбЂЭ:є/NДз>эŽ4‹_аpДљцБ]шІ|шODб&ЛМЂjtsЈ{:†=EtЄЙ(:ж™BП?FœН–аКy,:tјЂз}†8!zŒVЦeDЏ€дбззЎ-oйžLП^ли”hШЌЂЏшЦМVЬ)аkьOŸЎ%6„>‰Св qГК3ћ  ЬmѓjqJFwlаŒ e:•9'šЬьDŸйcбы5и}]кЦ^,:іuпtаз њ:MlіX ‹ХЕV(šкL^V…Ци*z9Aєв‰&7;и.єВ/Џy ʘйЪЖЃonЪ™cб7шdf FпHйб)ЭгDЛигB›щФf„эЛ<`vz3„^ŒBg0ьХ(t3-:“й`ЧЁ›я™ђ‰uє"еЌАAш[,Ѓ‘шцЖ…‘КљжД`3†.j6рз^швbЁ u3Œ. юBЬ КДЕЯУ|S›ЙЭ4 ЁЂK ГŒ5šлёЅ‹ЙоГЈнЬqЧqЧqЧqЧqЧqЧqЧqЧqЧљїpщЎЋ4ШЃ]ЗњAщюf?J•’JyЁяЋB?<ј яO=j•3[бНњОєS›}wёBш/MeЬSB?ѕCч„?Ёш; }ЁПфF?=!ъ;=tі†6ЬwїЕ Ÿž0Е­ВП|ЩЩЦЭѕЂ-цшФlFgbыfћыАєnЗ3бOs:{,њоnЮ‰~ђGп[ЭIдЛФш§~ŸФl[ hjіEгЬє~Oо9б‡Sёш}єn‡Њ,шу9Cš)бЛЊ~А }š5ВwОh­ЃЉЮ†оэ|дPУЋzП'g“ єž­“uЖ/њˆОїљбOИй­›гЂ/ž<бgі}Й2SАнш'Ь  UѓI ™г Ж:Ъ нєx/›hЭ†Э#аŠ9 1яєqошуQЙЎ(V;Э9баH§ЛЫŒЂGБЉбњUIаЏуаM6=BэиП+h˜S _Яy‘%іoч~заP o{p1єЋœњ7Ѕ§;Š&)О"ъ@єI§ЛхY’Ђ_dq ЃOE пооЦ›;55aПEЁ sыЖ^‰жиo}DшW;њіv4њэ-3Z›ыє›ZєчЯAш7ГшпМб€—эКЈFДѓЂH4ЦЮ„Vі‰ еЙ@Љ б>чЄЇB{]­щЯn5бK‘ -2Тш4hѓšpuнhšWb$Z€hŸ KЂw˜V5ћЃEЬD sњдmЗЏt {’шqj:t›бЇ6›M:€=nћPЌRЩа[hУ‹EoВ З[:єЦ(э1њLоž‡6ЭЉаbЋg8э9~ ГƒаbŠhФœ­Ћ/№)ЂƒЬаoІz[=˜ъm˜Й::!0‡ЂAuРхŒžM0йш9DŽGЯдбžЃчsX‰žщхD‡šbіeO}{јeMшOЁп0s‡†Ьnєiž?uS=jЃ6hvГo?IЇбћЃMv 3лбЭє-ˆ6йUЁ?}ЊН AGЈЩбэ‘юAшpѕбБцpє-:кŒЋ а’zН&Ecъе f[а–Й^П—ЋНnBаcШСЋкН^cшїяЧ‘-jxЊНбk%jtиёEу`rє H|}= oAѓrЙ\Џ…mž3 UѕЕЄОчyйЈ“Ѓ/lмДX(fI  —­(3z%Ё?Щъk ‘ OсфfЊнlŸбі5<б0ZЂ‘эj/ДЈ}f;ашŠЂOmQ/КФѕP$šжlQOНX\ЋЃЉЭЋк@_зŒFе zЙtЁЩЭV4І.ŽŽ™ъоМЪjіS@'1ЧЃonŠ™­lњІœ9}гчBЇ3[и.єMI4І‰NkvЉ+EУъQ3œŒЈ}б ;P#яˆ^ш,d@}8­ ­ГубљФ1hрэEˆМf•ўйB/‹LВ^„Ё—б=|Š^–$ Б0ђB/Ы‰!јЕК4YE_{ЁK‹Я…ЁKkЛ`2Œ.m•б@—†Њ™ѓ,4ti!’f[дj*јм™ЬqЧqЧqЧqЧqЧqЧqЧqЧqЧqХzhЛk+mёэabшЉ;)yЬЃT)ЇмƒњО2єŠиїЇЕъ1Уш{§Ѕ˜јщщС} ПД•1ћ яЋA?]rЁяћ t^ј‚Огаїе ŸЄ,тSїш<ьЇ ЂŸД|б*ћЫ—œlн<Дa&A'fџth™­ЃSВMѓ“Х\0їlР„NХЖ™УаyŸФМлYЬAhа|*—Йn4bZгCSГw(:`І-ш}єюО<Z њxЩо'@яPєƒ}єFя wRˆй@7љЂїRŒvБmш ozћ=={—НO€оAl;КcCш}14dіCыц<ш† šНа†™„mšM4lЦбТjЬ[7њЬΘћ@ѓxЖZЂЅЛgEЫ№ѓ87КakцDhм‹VnŸm1яК?uc}ањ§1є(ЖКы6юŸ}fcншуБД4ж0všЫ еno‡пњšџ:ЈUœ§Œў EƒO§к‚ўMCpь9ЈйЏДiЦбш“Ѓ_•\тж Ђ‡џф~› Œ'FG™5єЧЦпоЊl_ДЪ~ыЃ1ПZЭ4шЗQhР|ЪvХXє›Q§hгœ­Г§б€—эИІJДыšX4Цfє‡Žи=’Ђ}v˜-ŒЭшЂhЧ5UЂнWХЃa6ЃqєАDІˆў<1єЙP4ФoЎ š=а2;mВ=є&9švMo.ЅAo/бО7“BoДвЂM| Z7ЧЂзЁ…0М#аюЋ0іЯ‹vГуа&ћ Ÿ":аŒЂ]ьX4Ф53к;MДiЎ ХшщЁзUžЕy›#бѓ9%zІЁgIаsRє ˆ-Фœб™а; ™УбЯF„nи йС6б>Я5ŸCь4fІGЯЩаЈйЪіGЯСъFУцљ8ГГ}бWWˆКЇЧ˜гЂэцyЌ9)кanЫ‡О њж=Фh;z6[­hаЄlЇ95:ТlaПkЃCУ№83†~79єЛ>_4Ф6б&§.:в,оYѓG›p =kfД>В к{ŸЮŒЦйчƒшЧ …XЏѓЂ}Ьуа#ЬкЫьЂ4Уше„а+ЃДЩ^Џq6к4CЏ-шQцž ˆO-ЁшюЈє5YXЬЋ…6зNtw=f^г˜…Хl,zй†Šћ(а6Г?ZxЃG›лlшХbXйЭIє[xЃiЬБhрeш&2;бќњR#nўƒІ2ћЂЏ%єЕ†=:“йЪ^H]kщo,yЭ4шЬmaћЃГЎh"євMl^z ЉЭcбЫjб:{@/'ˆ^zЁЩЭЖ Wб7}Kv 3:ЋйыЭмЮkІAg6[йОшќцiЂqјЯˆNlFиcащХєш,fПOч2›ш€wФRfђ6^вLƒЮlVиn4ФЮ/–бшчi+КˆЙgу€бgv)Г0ЬўшbцKсшвb. >†.­Н„˜atiьhОТD—–JЕfa˜Mti(”fVаЅmhšy@‹zЭЧqЧqЧqЧqЧqЧqЧqЧqЧqW_MтЎЉ4ХП§p7ѕƒд”<цqЈS-]ƒњсCьћћћGНzЬ0њ@)&~zаƒаїїІњK[ѓ“ЎОаїе Ÿ.Йаї}:3BпIцвш')ЋљюоI§Ћcб9дOZОh•§%Џ::ЕZ'г ЋЁгЊЧ eЖŽNЉ6ЭO8Й4`юиcбЩиs к$яїiЬ;‹9 Ьѓ~Ÿ†m›h4НžчАхбБ14ЕzЗCд!3Ђїћшн%}аjаЧKоhRѕEїя-њш‹оЇ@яЄГ>х‹оЫхDf§˜А­ш nzћ}і.-zŸН3иtЧаК92ћЁ stУІDSАMГЁ†ЭДАšЧЃ!ГЎТ>ГЯф>LР†б [„ЁЅ›чFьѓ87Кa?j_LЇAуц8Дvћ$h‹y'4 ањ§бѕ1†mCws€6ю_-ВњXZЏФˆ}šŽЭшЂhЧ5UЂнWХЃav&t?лŒЮ€†П›к8h0†=о\;4{ БѕсљДŒž2:~ћА^ГН4vїаЕ›KIб€њчAoДвЂM| Z7ЧЂэзPЁ…0М#аЮЋP6 кЩ&Bwьšб(›эPЂЗсGбvu,d‡šsЂЯРiЁЗгEC1šбYаіЫъ@ЯšМЭБшљœ=›Љъй,zNŠžQЃХ|>U4ФЎЮu0Z`fЛBЛŸ ™ъpДРЬV5€іx*dФ 1ГM‚ž›5 мlQ ГЪЎ ›чуЬV4ЪіF_]!ъž^кnžЧš“ЂцЖlш[oє‰}еўuZшЎŒшеj‚ш“`Ч Q6)К?п8-:ЦŒГWяšб0œнЬpbчEŸС а& §N*mК=а‘fёЮVZScшОXrJДS]%кЅŽGЃъ }:7S …XЏГЂбwФ[*єГmŽО DЅGЃŸ=ъCЏЬBаІzНЦй$h@ АhљаёЕ•Йc#фE8z‰ˆeјXђЭГ>зєp =f^г˜…УŽFС}j!Ќh~{}mл=ќа$d‡zБVіѕЕЂжџпTЊA/šКЩООVиРЫаІ2;бЇ$є™нќН(кЂ^Hъk }­ЂEЮfЖЈrзZсhJ3 кguЂQЖ?z9AєвMl‹^њ ЉЭ#бЫzб:Л8кO —K5НйoлSб7}>ъfŸЗХ1ш$fŸO шЌѓleG'3 ГЯГХ=жŒЈkGƒъqшфdX= У Љ§wRf@=bЫЫe6и!яˆхЬ*;шГGA2 :7Ya{ хOLЩџўЄЁMѓdЎ§дg1пнW…~šњIЩ­ВП|ЩЬft&іˆ†ЬЕ ŸŒ,f -ГП|ЩЧ6ЭѕЃѓ…=НпчE“Ьtf4ЭђияSБё‰‹о'Cу+к=Аsіnrшн%њ дќфxЩMЫоЁшс ё` žш}єN 4Ÿ:=б{Ѕœhг\ff =Анh*і.)Z7г wF&л…юи&к03кЪІD“А=ай†Vs*ДЪТ>Г[q*&aУцxДшб"1+ьfœнАѕяЅг qsZЛ}ДХ,Б§бњ§“,/Д№Fї/€>Г…7z†2hсŸЁzЗЦКа№3аЃ_ЬЕ _л<ЭњќŸDЖЃЩйNД2к@.ˆ†щЭzWG7GШhѕь‹\шW њєАfжбŸ54њ4щЬЋЅЉбCxeщ›%O€~K€~}Еƒ~Ѓ1AЃзЁцp4hЦЏCЭUЃ1stш gCiбŽk,hыuIбЎkpД§:Fг­iїѓ‘А]эИІJДћЊx4Ьf4ЃЇˆxcб1›ЧXєи™Э‰алSавЈНMŒћШф‡о2ls*ЃS 7Do UЖŽоTŽb#%‰Г ј8єfкњL‰аjсhзsСь>Et Й tЈ9'3зŒFЭŒf4ЃЃЬЕ gЇdѓl–=ŸЇDЯ’ ч аjдшyк4зŒ>ГГ•]6‡Ђ}Э4hФlaCh//ШŽAуfДiž5 ‹9БГТŽ1ЇFУц”hŒэОКBд=Н>є•eNŠОjбWVzшЋьшеj,К+z51єp(3 cSЂWUЃaі*mВЏŒRЂWDЏ"б:лD›t*єЛŒшHsЯ~'EƒЦй=о, s.єГx‡і] ч֘Д}{ыП@жы:аЗ“@Ћьл@єPz4КW[бЦН“ЃW–ќаЭуъЁуk-jДЭŒЃѕ‰VvзЭk*ѓ…m5KlћŠ–OЄ7Ф|ЌјŒv™Уаk‹yMc>х4їьллыkѕ^Ђ1‡ ЏQДШŒЖБ ™}нБХdаР†—Гm*њЬnў^'zбЃ’љњbŽAšєBыZ+MiІ@/ГЃavz9Aєв MlйўшЅšоќЃ ]lmcз…^zЁ˜Ж Wб7}KvsZt"Г;ЮLƒЮlFиaшќцёшf‚.cІGg0ьqш]ўЄЁMsmшЇ>‹љюўо‰ЮЈ~šњIЩ­ВП|ЩЬft&іˆ†ЬЕ ŸŒ,f }ЂЋЁїYЩл }ЃїщиЈyjш€хaEЇbуцqш§>_Ош{+:{ч> ~wl+‡о]ВЁJ=Zf;аДьнQKoт#?є~ŸНлaъсЯ-ИRchBіU[ЬUЁСЙЬz`ЛбTьнЮЉŽFd"Дn†д.tЧ.ˆ6зѕаЦ\SЂIиhШЌЁЇCЋl!<аЧнодŠЯ†ЭёшЫm­цБhФЌА›qnєБE+7O„ЦЭqhѕюiаГЄіGkЗOГ@HбGн\}aŸGњ '(€оѕf4є%аЛн0ж…Ÿ њѕљ”ЇЙєk“-6бэйŽІgŸбчœf §ЙњžoЁ›л3FdДrіE6єЋŒfЛ{X3лбŸ13Šo–fo=Uщ3~rА,}“"BЗЅDПбЃOlлxлБJ.є‰yН5‡Ѓ!ѓ4~jЎ™s УN’“K‰ЖmѕЂ]зрhћu%gКJДsЎcб(М(куљВІEhїUёkd3::TЭhZтEGlxуа'р虆܉ал&hiЁћtz›ј9Я НЭ€оl6“Co6uьђРфшMZ4 оЄ@+jУ„6е›Офшm,Z ШjЮ€рёшLŽBл.I…оŒD;ž a7№)ЂЭU CЭљаѓљбЈЙb4О:~vДѕ*FгЁg)аШžЭfŠyfUGЃA5 z6‹A;žiоEŠжJ†6дСhЂmъвh­ъŸ=—#@УdB{z‰аИ9ЊMГЪŽ0 ‹9 ЈAѓ|œ95z Ѓ{v”йŠЦиўш+}WŠ^[нѕЁЏЎtћWZЕеМZFЏ[4ЎNеш.TMŠюN ІBcjJєp(3 њъ*љ+Q>ВлmЊЏ<дqhH‡6дWFщаъюh]= ДІ6бІœН2іPGš{іЛ!‡кЉ{zМYшцlшfёЮ,эЙЊ/1'D‹ѓgLh+ћіжд‚О Cwбšh•}‰6и$h`“FŸWЮя^kхDЫlZИаk2tЫЖ’-hhЂ—ы5VиcЩ>шm_бч#щ—tЫOnsЂ;ѕээЕЫŒrЛВ™;ѕэѕѕu%шѕ5ІОh*ГMНPдззŠњ@ЛдЅа-Лљ 4гља8{бЃЏЏЋF/К_\Ћ…Ѓ)ЩzЁuЊЇ‰^.ѓЃaі^.}адd˜§C бэcщЅЮƒvЭ5ˆЦе)акŽОщђA'!УjЭ U5ЬЮŠ^‘ S‘QvэhзЋ1ЛuR2ЌDчžgX=м Јƒа%цbDч1O­БЧЁГ™§ар>]ŒЌВУо ’1ДЪv s“%і" нГKЧЂЫ˜Л‚бЫъЬ>шЅћЎщ E—іžУаB@швкЎtiы†юи’лLtћcХ\˜ЄЃ‡Gnj%Ÿ“аЪЯ+&7Ег]СqЧqЧqЧqЧqЧqЧqЧqЧqЧqї#їpЊД!Д‡‰ЁЄ ЧЕrћ dѓ№ј}uшЅЛОaФ§ЉКи˜y@пW‡~zХќў’ŠўrЊœљЩbО“Ь5 Ÿњ,ц;Щ  Я•0O§Єф‹Vй_Оdf3:ћ DCц;Х\§ЂAѓнН'zПЯkžк0_и>h™­ЃSВ1ѓ8є>)5ƒшУсxЪо_Ъm†а‡*аѓƒ$•:UЖ‚ ™uє!НO†оэžžvm6є!НWЂ5я.fZ7—Eя” єУƒ!юбCВ=ай­›SЁЁ%š{єРжᆙŒ­›Ї€6ЬРqЁ;і€†Ьyа л>ГU4hІa{ asmh•-DКљеŽЯ†Э>ш#ˆ>нђQ8Ьcбˆйƒ}бУ-ц‘hм‡–n Нл=?SЂеЛ'bŸЬ>hс‰жюž§мgC /єёЈпН$ZxЂЛ'GcќaЌ н?2?#цZаЏЏ Z‚ЫЃiббlд,s-hд,Юя:ъшцр}ў/fлає Фf†йDVаШ“›Б— iаŸЕАыdщ›T ДnіAПE›Їаибo`thtќ4lІCууубˆЙj4fŽCClzДѕЂ-ЯDŒ†рОlosЕhы3e@ћюдоfoІ@{< ње‚Цс0кчљMŽe3::˜ЭhЏЯ ФFЎ FЫРД3_Šn`лSав E[ЎŠ@o3 7лUсшmє†НM„–й›6:Дщб› Ё;і&ЃGo&€>;єF*кќEo$єF1‡Ѓ-ЯCŠbƒŠЖ= †>Уща–kˆбСfmЛ&=?…ЁУЭŒЖЃ16Ѓ)бЖB‡Ж^S)z6K†йTшйбГdhNƒžEЁЯ“=ы CЛžg>ЧиубГIЁgFща*<mšiбКy<[йaЛ‡с%Acf4lž1ŸBЭh˜Н^лбqцДшЕiЖ 1Ж?њ|\)ВBNХš<єjEЖСщбЋ‰ЁЛуЉа›НšZ>Б{*шUєUBДv}кdKцЖ4hнL…ОJˆ6ЬDш+)jДiІA_ЁшHsЯФ;}6Ю,Ќц”шц6д„жйаškўба&ћіжЕ@–ЫѕZeC№КаK/єhГ­Гэшѓ о SEыєёf*ДИ зДnЮ‰Vй8Z\а†`—DCm3ЏщЬьсTєыkћŠЖšЛ…S О +BьыыŽ}}эѕ …†ОŽD“™=анЫёZJ§ rЙєaг™ѓЁ Э^ьХЂYзуаДf7zбЂЏДМІ—Ё‹^мІЈЅ—тRЊ4zбЂNєв MlFи #}sЪMoŽGпDClєЭб7ош$f/ЖŠОщsЃS™SЂ“™=^Œ>hˆЮœаŒРЧЃS›Cа7е M6†тGB0№Pt)ѓ4б2ћЧB#ЛG9ГФѓ6žWLƒЮnюсјЙ}Ÿ.#>Ѓ‘шbцЖ8tYsКАYcћ K{лбЅЙ]ЎїФЭ!швT5нБы нўДns›Œ–^Џј”єЕђѓšЭЧqЧqЧqЧqЧqЧqЧqЧqЧqЧq\њJ‚{x˜–њa|ќQ-ГN2пн#jS?(нѕ #юOUІFЬњў\Eъ'X,ЙяAє—/_Ъ™шћŠаO]8ЙEпушs%Ьўh•§%ЗњIЩ‚ОѓAgRЃѓЈЉб9дO 2п)ц’ш' šяю§а_і™Эш{Vm˜/jГЌжб)й˜Džш}R4`Цб‡УсxЪо_Ъm~ЉC -цамЂeЖ‚нwЛ}ˆ@я“ЁwgБ}ˆ@я•hбЛ‹Yc+ŸІusYєN Fт-БhBѕW?DяѕRЁu ‘єРжᆙL­›ЙЎmšЭuэBwь ˜3ЁЖ}fЋhШLФЮŽІPCh•-DКљ>вŽЏ†ЭЛчg В њ4іQиЭЃбˆљЄvЭѕB7ЦЩЕЁЅЇCŸVСs"t:іГZxЂе›ЇDŸГЁ…њxдn^нж™ЖЫœ№ЅБ.4pћ$hШ,УŸŸSЁуеЏNД<š­FЭgЖ2ЯBм†ЃХЫK6tѓ>ЯэY.К§oЊ[б‚Юђх1mИ ?Ч‹2з/]oooqflEcуЅ3sZДz  zжБ‚~“Њ-Яp1Дћ€3 §U1ZьЕN€ЦЧЧЃAr$TгЃ-R{ЃuЕх™’ЃНзt1є+ЧЏАЁmЯ”ЋkF{._2юŽ6­ывшW+cУhЇЋ=Щ™ŽkFчBГsЁAыh4Ђ&Bo%`r4rU zЛнОm›Пd˜iќЊPєЩЕЕЉща–Ћ‚блmєfcЛЊNєfcU‡ПЁ_UВUОх%Go’Ё1y<Кg'FъёшM4кђ<[ЃQшжзЃ7Riб2=}I1Ѓ#Ьqh!6h9аg8кrM0znE›QДэšpt†73кЁFиŒІDŸйЉбГhXM†žЅAƒj*єlzшй,‚S g—І„žЭмjэzžљcGЯЁчjDш™QJДЬ.ˆЖБ 1клйahˆ<-ps S;а1f!Ps(TЏaѓ|œ95SŸс‘f cћЃЯЧТтьXs4ЮN‚^­hафlЋ95:вŒ Л3™Ља; МЂJДt ћdађ)єAЫУTЏ]jєJ+mЈёU[Дnžк SЁЏЄHаТB†еtшhsЇ†Э:}6Ю|fcf4Цg>…šƒаšz] mЊншхr­ AїhГ mЈo]ыcyBЗjaSЇEыjК=ПЛa э-‘кlGkj;z‰ЂUxrДЊЦбŠŒвьB+j75l ДKнBЁƒЭk2БŸКy}н›Џ5ДлМОЌі\ш Л=‡ўLООЬn4™йЙЊWгGїЩшЅšЮьFŸи&њ@Лд„hѕy]ESš§Шx4­йkџ8ЅЎщaQ/‡ђ™QєB1ыjmQSЃ1ѕB5Cш›S^hr3Ќ^!h/u4Єі@пмјЂS˜!ѕаІк…ОщsЃ™}дбшdц„шtfзЂR'DюДЉNkv-‘8tjГcЎГоlЈQДЈ ­ЙGЃ3™u0КЬ<ЋlFчbяХР^hїлx~єХmyKДяEФЕхмŠ.fnŠC%ъ]|ю'@—жішгЯtiЊœКДвB_иЂVГ>џД!_ўхEQ% ­ќМbђ -.џЃ4„у8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу~К.•v„є09єƒд]Ÿ:цўвc[ЇlVбї•ЁsЯОWzьЋг\#њЉЭbv KАŸ ДnОЬ2њKБТ6Ь-ћEЙTТ†~,†~вђG?ш™_(–lіAAДшбАљ%yw>ь]e[Э-КЛ+Дš/fŠ2IєѓГ нБiбcйЯњYA OtлЄшоіŒ˜ŸёЂŽ>х;'\ њYAїЃhхЮіЉ&BcЩЃэh§оВS_ЃиAhћ6­ЃЇaЮ…ОН A›sћB„šш ДБ_ЁУVtкмфђЁ•бhмќ– ­Ž_гѓЉ:бТj.ƒŽы€бЭ_-цDhmt Z шЗ„h}twЂ’‰>ГБg1ДЃаaf§9§F€~}  э 0уT6нАп€ЈбрxкђL ™]aCу‡в šэЭіGВ‰бсц8t8Gы#З[Ї9§š ™УбЏ—Ти!ш3'AƒWЁhcфm3гЃсЋ0Д9ђŒЖšУйYалDhŒ]ч‹>ГЛђ быЊEлЎ‹CcьŸНйибл§юfЧЂuѓЦaЎ­‰лЈаMoo6v­hы\WŠобЂ7бhЫшЄшT(к6кDЫє8є0SЂ1sZˆ z>Gе-|Šш`s&t†7џhh;;lї˜Яq8-zцaЎ =ksš=бЖ%B‡Ж›ыD;ЬUЂg“CЯњТа~/ENі1з†і2Bы№ёшY"єœ­ВgIаs :єlrш™QJєРƒ6ЭThи<c€6 Гѓ…gŽAп зVtЄй‚ЦиЗшѓiЖ;жL‰Ц@ЏV!hhlwж11Л(:вœ=А!xЌйŽЏЈ ПCvш хQ н@Пъ~M‡ОКJƒ^Iш Z6гЁі lZ1ЗбЂasJєѓ…˜#бн9М&КЃ_]3 ‹9нМFбWЃбB f€эFївЃшЋъайD6[б:л…Ф{М™ Ms ДЪЖЃСЕРЫЁ?hЛyMivВЯ'Кышыkэ0_и4т8єЕ†і1Џ)Э^ш3ќZ)ам–}=MfіF/cбtf є2;кŸЁ—D/=бЄfoЖŽОЙф‡І6лбиLпЁЩЭV4Жшвb. >†.­Н„ ˆ.•3бЭOutiЅ–-ъ4‹Ž­ЂЯьцяušuєхЇГЈгм6ќЎв’€š853ЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧ§=œ+ЭъсajъЉЛ>uЬ§ЅЧІ2L5єН‚.Џ†Щћ^щБбО=ЕсdКћщЩPWŽ~’ТШgѕ§=†ўrЉ~єc1є“–?њ@чaыц)  ѓhtz5fа†CяK™MєСи:PєЉЌhs—> yЁїчђ‘MєAюxЪL§ДлэѓbVиръи'UŸŒЛЦжа_єDНЛ„ЂП~ GяхШЩOЛ!§ЕA?ибGšZНл9аM0КgчFяДњ‰z4šTНУбЇљuЂ/ьЃЄ~„ШЄш‘ЌіF›{ž&dћЂ(њТЎ}Ј§ќlЌj+КeЋh€œ§< ŸHб//ЉЬЛ]{Ъє0зц&‰~!BCцГКC_zЂХуу[б'ѓ Х СЭКкn>ЃлрКшЬS ›/hUэFw7Еš дvєsиLчB??[бЯQhD§ђBУюlљŒ^hљЖIбЮ‚ю;аŠfSЃ{іГš48`Іa4љLcХЂ…тдЬуи!hЧ{ 4г/x™аЗ• ƒVGZ_Фtш sкxхeD+ЃƒбђЫ[2Д::xMлЬЇЊD;Ьeа§#њє›9Zˆnџj1ЇAыЃЛƒ  є…<‰Љ…›h§9§F€~ Ыh№ˆ3нВп€ЪЃ?уfёšЉбШV4~$НЩ™fšЅFklo4х\Пкдsm5ЫЧЭc3‡З@ЌѓМ•д„шW;dЁЗVpњѕ\Jє6;МGы#Яh+9Љс‹PД1в ЌNŒ>ЋЗ‰аЛЬ}Qo­xBєц1aSЂ-—љЃХ€йTшЭЦŠ–и.ДЧ\GЃЭѕœ Аcб:˜нИпІˆЖЮvЅhSН%DoЄІ‚оŒA[FЯMДDE_д“L‰žЃХ =Чб-МVДЭnЮ‡FеuЂ;5Т&E[йaЛ‡•M‹žЭœфЪаГ6*ДэеH‡ЖšIбf=Г›kDЯfQhЛz>Gж5 z‹іz)ІAЯRЃ58кƒ\-Тч9=з‡ˆ™mˆIбГ™Ÿš=ЇAЯŒ’ЂчЃа3SЁaѓ™I€6 ГQs4ЂОН%BЯcЩV4ЌBŸ:&WЂСаЋ 44И;›XнЋAvЌ95zPь$hpQгЁЃЭv4ЄмђђЃWР‰Fj*єЊЋџЕ]‚ОвеёhšOъ z-ЃзdhˆЅЦЁ%ђ9b4lІF_‘;6bŽD/зК“_EŸи˜`{ —ЫeUVДЊО"@[ЬсшѓiиkЕ+НДhэBƒf=žў  rvДЪЖO46ЯœбX‹ц”q }}}m эц ›BьС>ŸшюF;ЭkJsњZ.дм”нТЏЏЕЏ™Pэ‹^ŒG“™§б‹Бh:Гƒэ…^zЁIЭоs —ЫhЛEп\ђD›}чAпxЁЩЭžS­Ђo‚аєfЯ—Ђ mQ'0[еh\mQ‡ Qu4ЊFїщt"3Ќ^(y au23Є^а šuѕТЈ~ДiŽE'5Ћьщ EtrГЄŽDю цž ˜ЃаyЬg6dіE/K˜›ˆаYЭА:йL€Ю-FиAш"цqш2dpдvM5Ž.&еS@n?tiГMЁK‹›BбЅНч‚аЅБRZшвN5нќTC—FšiшіgГЈ”|A нВлПWŠnjў%—bžB=К4„у8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8ŽыzКЛЄŽИПTЦѕрDпW‡~б2Л7п?і•ѓ6=8бїЁŸNf}ЂЫАŸZДn6бїе Ÿњ\ш{§Ѕ­„й…ЦЭЙбOJ6ДХ|Aчb?‘Ђї™ФЭёrTш§ЉќhlM 3ДЄїEац ёаwoAKцфьЮќŒ˜’Йєnw1?#fЅу%7:%{ч@УfНЯ€оЕЩьСћЕ 4ЗшцЏЧЃŠо+Ѕ4я.f§еnўzдаћ ш]ŸŠў*Ѓ‡dєуу>9{‡ ПFЂ“ЃwJђN§5§ iй; §Œ сЭЃ zg4,д…&dџ шaUO Эє! ™SЂЁrDƒц§ЫK:sкЧLƒn€6tЧvЁ…hЌЭ_aяХœ§l u3Œ>нЯaN‡ЮЈ?Г›qnt—еLТn…ЈљЙ7з„ю„ˆљЙ7 1іЫ Л"цчо\zрцчadfЇC?'CП$@УAПXJiƒЖ™Ч цhЋ9)Z„v™SЂхБa[žУ<bCЛЬoyЬkкa>55є[ЅhлЊ~KˆжFЂёЙ~Kˆ6ЧЭщU~шs 63њvњ-кdп*5чќИа ћэЭ№fDпZбШsДhШœ}  ЯУ ‰Ћ,њГ›ЫЂ?kшэЉE‹v™УавHM;гЏЏvs*-мnЖ-Jєf‚шЭЅxД/›-лt)t†6Чз€~ њЕ/КcЫ1: к‡M‡оLН‰DЧАубОцšаІ1l7кХv›ыC{˜#аvіXєf4ОdNŠV?{lFЃѓ)“нбcбРL‡ž[бfБAЃBЯ/Сьэ–бдhŒ§Г mьйŒ­ТM:-zŒFŸ#zж_ЁmЯ‚ГщаГlш(3€žѕЅAЫь8Г‰žM=Ы€и4hЗЙ>Д‡™нБ)аГDhг<cЈ™ ˆ/шXГ@Эщббцž=J‰n‹†Ь0§ь‘г,@/ŠОEбЎІ”fF›5g'`“ЁСЛWކяопЭш\hˆ=EєГ=›­Vўh|ї€йcЬ6єjrшU›9>­ВS W$шubє Щ†vНзFДhЬœ =Ъ|Ѓfƒэƒ>!tУnў7о,Ќцpєђ‚†Ьыyѓ?ѓ)ЋZaЛачМAo_3Ž6we6ДУЌАхУшЭ-o91ДаЌŽS‹… -$t3кЧL…vГлsш ДЬі6gC/zєЕэgІCлй )эiž$šаleSЂiЭcб^[4ЕйsЈш›ОŒя…™бфfЧЖGІ7лб3РleS,4цiЂqЖ?gчFЃћt:™aуo.fЇ4CшХФа ЃњбІ9дЌРs$:Н™СмГcб:;Y цt&shіDЫьœf*tV3ТCчS  ˜AЖ?КŒxʘ`ch]вЃѓЉŸфЌh‹љ‚ЮІnNj#Bяїћ рѓ™­ЃЭ5}Иd˜Mє~_ њ0toAѓœ}1?#цƒмёTшнюb~†wщƒ–с8:%{зє<А§ЬњxдаћшжЌЬuЯ§z4Ятгџє^-ЅЙŸъц%9pшЫЏ$єуcєnЇЊ§бC ZW'`я єѓзЏ‘шЧєш’ДS“Ђ‰е*Z^еЈ9MЉоСhdЧ @ЊЁsRєгбУЊFЭN4dN‹fvЁAѓ~џB…~ІB;Р„шЦgAїlZˆЧі{›љх%%ZњЈї›є9ы§†э2Ћhнь…Жa~ХЌ›ІPДЃcЩƒz”}jZ цдш1ъй &Уш[mљг§L#тpДзGS3Мћ$бЭЭ/јю“E#nFЇ@Cь4hїנטmшйjх†йы5ТeЖЁWЃбы5ІNƒ^Е™ууб ; zе5НN^!йаЎ—ЂŽ–иуа6f6иhгМІ27l 9}Bш†Нf!Ќh•oэУэщ ЖCŸўiˆЂEлйThЧLKьk%Ьœэ4#htЂы@/.Д№Fг˜Щб9VД‡zБИАБ5-›3Ёj}­Ђ=Шб‹>кgž)бvіbЉeДyšhJГ•§ƒЁoњВП ]ш•кыНмьЙЊGЁЩЭіmMoі\#а)Ь~/Хxtѓ4б8лГsЃЖ<ЬŒА}о\–K;;ЅB/аIЭТт§йаiЭ м$GЂ3˜{5:‹ЙSЧЂ5v&ѓ™#а9Э4{Ђ%vV3ЂDg&#ъ0t~3ЈB—0Cjot0ЌіE4›j ­Г‹ЂuЖ'КАYcO-‚бЅСmи\#швм.tiЉ’-к/!K3ѕ ДђD—цсЩъцївт(MГ'™лnšЏЇыo!Ўнƒ8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8юЧыAЊДХЗ‡‰Ё€дї}meœrYEпW‡Э њо@—†Уf}_њщщ|^› } ‹Р­цZбgѓггєууўTn3†> ц’шс`J}hЬ :ћй>xЃїйаЯVєAJˆуб†оїх4?[Э‡“Йєю”ŒЖšЧKgpѓw ’Нs tѓwxIЇEя. шЏZ8њќ+ŠН>BяДЮ†бC6t і.mšsЃwJ>hР\%к5бЕ eЖkEЛадь]ДiІEяŒЦЃs64fvЁ!s4ОGл᠘˜mšуаТiІC??г ЯwГšщииЅНбvѓ К)lяРбBXЭЇшЬЯ ™§B„€и[K3Ч’ §ЌЁлQ†йDїwt˜S Ÿ5t7Ю…–яЉ)шЬЯ€y3E?;ƒFЭЩб§Ш`4nNF†Ђ-ц‘l—9]а‰Тn~{K‰–ЦЂп’ЂхБtшЗbhнь~+„nNeГЃUіP*Д2V3‡ !s*Д:Жз^rЁ8hЮ†ОBУцKєьRl‰PЂ1sНшй 5“Ё;6z6ДЬžЅCŸйубІЙ~4`v.вhШL…†Ьѓ1fa1ЁAѓЉxГА˜iа˜y z6CЭ$hд<™)аIЬ“ г˜щарн+GУwohfttУf4Ѓ14ЖІG™­ше)_4Ь>JOmЖЁWЃбыDhŒНъУй.єZ+5z5 єЪ†vНuєРІAлЬБhгМІ2ЗYЭ лŽ>Ÿ8h%68mЌi4™й‰^,šQњщзз0кЮЮ‹6ЮuWаЂ:tУ6Ѓ—бBAлиља‹@tГЧђ€бчЃшMtѓxДjžКI1W^Ђq3%кЮ^Ё-тjбv3-кЦA;ЬеЁ LєhtіM€іјдAoіdcшЌ•2Ђ“˜Ѓг˜Ї‰ЦйўhœэБ{8бЩЬлgЫ[.эь”fН @'5шE0кdЇ5›шE:ГYЃ/Œb–GГ@Э1шLц 0GЌщœfšУбYЭтђ=Xz`ч6S Г›AЖ/њЬ.aƒЅЬл]Ъ;]ДЮЦа:{ŠшТцЖPtio[ К4З fCшвR)otiЈž‰b@—ж!ЕfЁ˜Eэц>Щм6ГаЬb fŽу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žћy{*MёюсaZъ3mФ}пcSЅ`v ЫЋ!ГЊОПзбЅсАЙVєгх?њўFq[Э~шќъГљщ+h>јЁїћ}v3Œ>4ц’шс0M}fпЛб™иЯ6єЁя4ђxєAчP?лаЙњhCяЛВšŸП~ŘЧK…бЛS2к6ЯК§;‚NЪощшЏj8њђїшн%§еŽ>Qt2і.=”На:{: {Њ-hг|Д™ wJ>hРlGгЋНаA]-Г]+к…Іfяшб€™Нг†ЬйаЮїC Š3Ёmяс64fІeг …pšщаЯ†9-ZЗ MІ~6дЮMG Лљ…нфzoёE ;њ…ˆ­Ѓс$ш"є ФоYNƒBаИњх\є3ŒжЭ&КП#•Ы€О sЂЅ[кФ$ъg §LˆFЬЃбЯŽzДЁvЃ1ѓhuB4nNF …Г§бuFєD_‡Я4йkyш›sSE+фI ›  ]ъ@tГ]НX шk‹Щб6uкjІF[д!hЛЙ6tХ1U4ЎіAg§дЊўЙаiШ~ЋК:ДЯTЛаЈ:U 1u:4ЂXг;!Q‡lyЕ ЁhC– Ёсh]mШшцAН0ŠXг™Ьл4G 3šOj€БІГšХљkАБшмцшe13ЈіD/‹™!Е/z)J™Е/КVO­Г1ДЎžњІ*t‚Ўк< …КДїR‡>шви.pЎ!tiЈž К4ЮD‹]чJ2‹ Л,Ш'Х,ZvA ЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqбƒ‘9цўвуЉќB3гlЂя+Cfƒ}ЏєјXš›Uє}Eшѓ1~nє=ˆ.У>›П‚цƒХ\}1Ÿ2ФmЈЙGч‡?Ѓшƒ‚6ЭЅаУС”_ПъьC_3ђxДЃѓБŸ-шƒ‚>hеМЯoО ізЏ’њpьCЭmyЭ:Z5зƒоэ tзAєшнH4dN‹о]ŠE 9-{вhœ‹NЧоЃїа;ЅёшНQjsŸш4ш‚Vйv4ОЂБQѓ3jЖЃ!sZ4ќsp …АŠ3Ђё‰Цб˜95Z[ AЃfbЖБЄ'€6їŽ8є™] |ъ№0wh›™нМтд—a„љxО—еМyЁ4?+цTш2tЗЛйо §б:ћХˆв<нпаaІ@?Ѓhлчxяаб€8 њAыf4lІE7ьg­ГИŽFЬl­›Ÿ{s87гЂЭ.т tУЖˆ аvѓsoCлЭcбѓѓ02-DIД4r2hyd=hџ‰жбК9§–вlAпокб&ћM)ZЋ™Cбo™аъXЩлцBЫь7ЃTf}[ВЂ;є-ŠЖ-|шЭHє›Хœ Нiгй№щ™2zЛhЈ9žэa–бЗŠй ›S 7њVыГж€–йxєhЗйD‹bш’Хl ‡xЗ—rЁ7DoHбv6Z7Om˜#б2ЇЇBKcЋEЋlulZgCєŸ §њjcCClkЖЁЕС• _­hs|(†GћOt=hПš-УЧЁMst„YBf"Дcа™ ›ЧЃAѓf6‹žЗ!ъm,ZXЬ1hШŒЃЃЬmˆ8 š•T6НЙ^ДХœ­ВщбГ ЂgЃбn65z6юю@GšєьRкМ;ŒюрБf=Ы‚Ž6ь™дX4ЮgжбГLшQfxA6z>ЇACцкб йБ@мhœM†ЭuЃsBє(Жеœ=ТмВQ3c3 ‹Й^ДХ\-кfAЃOm5 ёg˜":Хц‘Н^чFЃƒ—єA2[бЋ„ўаЃхнзzœљGDCltЧ>џ:'z…^Kшu"4Ц^IП6б&Л9Qz@ЏвЂWQшe†Эk*sЫ^YѓE/{4bОА)ЬТaіC ›зTцSЕФЦаBAлЂ2‡ ?ŒD“™=бЭ_ЏЏЧЁщЬ~ш…НЌ }fлбK)FSЃoкІ‹^fGћГ!tгВJ44г7:“йЩ–‡„ЦХєf;zсЮjЖЂошМfzA‚N`ЖА$ш4цДшDf”‚ЦищЬща Э $в>цBy яЅjP›d“}ЏєјX|О=аїК”К=• 6+ш{]Hн˜П~Э‹ЙC—P?ŸЭ_ іх€wдмЃ ИДТ>TєбŠЮЉ{Фб-ћxt 3В5ГФ>Шhщ zдœ §ЌOє€>|•е Z%я›JЁЯдŽjбЛŽvЈ:ЙzЗ“еш#lN‹о]Š\Ї@sZіЄбшВŽFЇcяє˜™оg@яфЦЃїFЉЭ‘htžЉw0Ze;ајтHЄЦЬЯИ邆ԕЂ…Уœ­П 13ЙZGf_4n&VЏУ(ДШŠоЁ… MЉ67М8ѓIm%“Ђ›mBн;ТЭgДА›_^HЭƒкяУ4†ЖЉ_šHЭкѓгŠже/zЄцg§}ХњЙ^в&к0“ ŸqДэƒŽ61‘ZFЊdы{И6ЇFwьf\0!“Ј 'чAwуќб'vbДн‰iбѓѓ02VэmžZYкЂuДnЮ‡і_б:њіжŽ6йoJ%аЗеЂеБ’ЗЭ…(x:`ž{є- :™DпЂhлЩ‡nŽЊAoЗчПП%YnГЉ†g–блm/CЩ#дf }{Ћ˜-h] На–“н[xо‚ЬфшжЭ&Z h8!zЃ6Œ5ЬК?ЁyыЧ&Co&ˆжЭ#бv6 к GŸиЈМ.ДЦЦдЉави1hNƒжиъи Д;mWSЃuvЄљеКчB{АS ѕСu __mhs| FћП ща;эЛлЃ{іHДѕm%:Ц,Ё3 кЪ‡†Ь1hmќ|>GШуб y3›ЭаVvК}C„ЩQhШŒЋcЭЇ0ѓxєHQг›+Fуц4h…MŽžЭТбкшIЂlbєl6яЃ;vЌAЯЃЯьh4ЈžeAЧ›MѕLj,W3ыш™Z*є|N„žеŽ†ЬњБЁЁ›'FƒdзЊvЂ-l4bЎ™ЂGЋQs­3}Rуцёh”=m13šm3ћЃ?~Ь‰ЖšашLfѓ BcЗŸЏГЃWњУŒ–GoJЯНwЌbађ‘юkLНj2д^ш ЛДGCь‘h”НjЯьаІzЙ\шѕC6#ш•ZV/ЯцN-Ѓз:<TЏ"аKЩМ†ШšР|R‹•ЕpДчЙc“ …КScшЅ6гXtfZVch!ќаУ;OtћзcбdцєѕH4й…>ЋэшeW5шэFлс ?Ж  Эбш›ІRhџU ЁO-—5Ђ;6€n*ƒіъыkt&ВSн/%ЮrvєDпЁщЩvєТ…О)2ЯVѕ‚ФŒЋшDf НAcъTfŒ†FдSD'4{,8tJ3ІBьДfїёAьдh€ИІMtz3=:ƒй€/&ˆ^јЁ-/Х\шОˆA—"{ЁЏatБyОИuГzY, Б/zY ЉУаЬ:]Ф<] Г§аЫeIГСіD6kьЩ eі„а{Rш [LЫм7˜…˜ŠYHf]‡ EерЎ3Zœнe)ўѕh1!4ЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧ•шAЉДЦЏ‡ ЂŒдЧя•Ы(еLГŠОЏ ˆ5єНn*хmњ šвˆceшЏF‡Оо| B—‚?{ UЁЯЇусш†-ŸъЁsУнцƒb>"цœhѓсЈšїћМf є>zЗ{іB›ьn˜ГАwЃацDЇGяк†cWCбцŠNЯоЃїа;­ВCб{ЉдцbEя3 w:~yьjEлЬЕЂ­ц$ь€мЇfzєN zkёG#ц hгь‹ЦЬщб€йšЩйЛ Ђw$h!\hRЖaіA›f‘г|љдЏny.4`>e7ПМP›Ÿs є !zxд>.YпaДЩ~бЂ6?kfы‡Ÿѕ9 ›|а.8Ѓ}аGŸЯв,‡^Ёш(zYнIЏЃ›0єpаjєЪ­›з)ЭVєЪm˜лR™mшUZ9кНzюН}yбЋє2cЏ4Ф6бK БSЁWшЅ'šР ЂWh™=œлmЂu>…BЏЂб63%Кie)m5_и9а §MfЖ Jcбы59šаьБІiа”ц-УнћД>E4ЉйЩІAS›s ЩЭQ $ MovЁСЉB'0;иљњ:ЦьёљCCп”ŸhЏЗђkЉЉ;‡Н @'2Ѓш:•C/ЊFУьХO‹NhйЁhˆжœи аУб:;™ЩЌАqД>ш|f˜УбЭ=|с‰Ц^ŠЙЭnєнмВmhїІWТ, ѓа†љ'@1B—C3p?єљпŒO ]имŠ.эm›$КiКh1-sп`†>š–ж!Iц-ъ6ФгkŠfŽу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žуь=Ш•Цјі0=ѕƒžіјНœx,b4 B?>–W`C}ЏЃKЛПžгЬiФЗoпt9ѕWЃC_7цx<ЊшoEншю|t_нžчgA7lљTwнэ4sЇ>­№ЧRъgpЂѓсxдљёqПЯkDŸ^‘п є>zзjGCj Н?W9њ[ єЎэaЛбцŠЮР&Fя3 w;­Вб{Йœши™>­ю}єngЂЃ—‡FNЦаЛЧАw˜фZбпхœ’­ЁѕM: ›щб;Й‘hФœ Нб˜Йf4jІgS …ЫL‹оэ44Јv OїqЁIеЯЯкЫ0тu(ZДнќB‹nRЗщД4ЁњYFcoт~hр§[6гЁІі/шѓ’@д/Zдf#‹EkŸяt3 кbŽAksm˜iдžhнlE76Ьœ=Ј…@CTZЕZ ХЗ:а"-’Ѓ­цчС‚vЈ›ЯjŒN<зh19є0ВДЫŒЃuГŠNЙЊf }{{kGлеoйб—ЅЇ„юЯ/…v› є­/кЎNjоhш[нЋЗлmBЕ мжОН5аŸ/)шmIєfЃЊuєg)§жTН1бj2њћїя њьЮŽоЁлйVбu4кЂ6ЭNt7nыЅŽGъб0ж…юд[/ѕк4B7af4р E†аoŠT*!Z‡–цњ-Z‹юзw&Д2vк`S э/ТД'›mЊЕБUЂuЗ>жэХІB['к{Ÿž,g№цZа~Ÿ9Јб{,кЙнUˆЬЃбnі84džЭfЁh}МiјgŽY8кИћќ”…‹6Г эšшy*ДРЩcбs  h]M‹Ž7лбšzT‚vѓj1Ј?4UЖ›ЯaЫшmA;сйбіЧш‘ц(tЫЖ лУ? .щіpw} G/ЫЃ‡Йў`S+цхrme'EЏМбЊљ|Hz*ВНZЉhЫњPЭнбюаЋє .‚^Х e2 O‡^Х —™а{ЅЂЁ—Ђ‰^h€НZy ?шш%ŒжифhIнŸ5™U< ZaЏЬBаVѓYM…АІ@Џ3ЃлFЃщФVєBi,šTэ7буб”fпхёSЂIЭVДьvюгv:-кW=MlvЉ'‰^Q ЩЭ.48зahzsдњBЇ0ћm{збш4fЏwХkY}ƒ˜!t"ГзчkЉЉ/ТєшTf-ПGЂ“™Qібъчщ б: А“’Aѕа&<НЬOжйшeХшk/t.ГТЦбТб<АуаyЭіТНГЃ…iFз4‚ЮoТF_‰ЩЇІˆ6Ь?8К xВhгэ‡^%ъ‰ UЖКДИ-]šл5Iє…-І†>џЭe.‹ФЬbј˜'Њ&7ѕц]оЩЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧ§Ј=\*эщa‚шЉвп&ˆ~а’ћжїxЉ”RэЋf>H}3апŠ9›ОњК1пŠЭЗњˆЂKЭЗ нАхГшk™mЛљ ˜ы@7ЧZЭ‡ЃФояѓš)аћlшюXЭёш}[Nѓxє>zЗ{FиЁшfEчaябћLш‚VйЁшНTjѓ1‡Ђї™а; =fyьЕвšwˆй…Ж›SЁwZпюмhhзHЯоIhШь‹ЦЬ)а; š=бЈЙb4nЎнќi 5'`яœKкv™ЉбŠ9rїТa&F?{ ДШŒ>CCоMєљNРЛŠдЫ ЕљйњСƒ§Bˆ~F‹A›яс/JЉЭ4ш—h‹9=Р_ŒrЂuГ §‚˜sЂ…№CŸй€•–э…D‹tУNЖ™Ÿ%sMhЋљТСшФlĘzщNН@\f­›ѓЁf}>PкŽЖГѓЃo'‡ЮЗЁ] $-zЃЁoЋGoкКБЗZ єѓ%Н=•”эaЖЁ?Kшўž=кfN…о8аŸЅОŸвбBфGo&ˆоŒBŸсЙбІй†ўЂЗ™аЃa,†ў~IGŸK6Эntgў„aVЏК7Ÿ‚а2ћM*%Z;§– -u­i нбп2Ё•Б#блLhu,ОхЉhŒНнц@kc+D›p}ЌхЭЅ…hvhй\Zgрц€UХlapД}Iуш…аюНG DwьБhШ<ѓD,„ЭЇьlI  ньqhЬьF”аЦX:к,АЯ3/ДdўhŽŸТйёfa5лбъDїN†Жˆ­шцlћŠ>ЃеЪЂ?hшЯЁMЖ|DКњ6юƒ–йŒfєрљаЗhЬœНZ)цaПsЂQѓN‹žyЂ?[бvѓ|ŒYXМџ<­ЃцљГpšнhш3žЫ<}fƒZ'њЃR™m3Ч нцБh!ЌfнМўмhsbєJB˜њ|PКd–рzНNvM4†ў8дŒ ЯсЛ‡‹=жœНv G›НаgЖ/К;$=йНЄCб§СюEаЋ>Ÿb˜QvJє* Н,Š^EЁ— †ЇCЏДnўš]h3Ш^OЧб’YCЋp1„ЦЬ.4f^г›5Ж)юЭtwм8 VJƒ†ЬuЂ›@­†жй5ЃD/Эш,hb3бюaЇS›<єџљафf'Z fЇ0лбрЊB'1GМCаiЬcаХЬVі€О–Кщ+gЦб‹‘ш„f”Н‰Nk†б‹‘шФfН‰NmNNnсуаyЬ:z1 ДЪ^ќ„шlf>з,sнш3м0OmšУаЬЇтаgvё8t1s4КœxЊh“§уЂ › ЖКДXD KƒЛBаЅ­} F—ІЪuџ~м….ЋдʘhušЅ:ГНЙўz؎™у8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8ЎжЮ•f„5AєУPiŠD?Ј)}ы{е3лcбй'ћљљй@фd2 мя3ЃŸ­шƒzПЯІюŽ/ЅAgR“Ёїћ\ънюQ‡ЂїЙд;:t7гЩе;­БCбћ}ѕnG7гћ}ѕŽНпчQя$ДОuИажyNЈо h€ь~4ХЩдЛ šf:zG„FцЙњр;г:…š}њ"JNЁ–ЭёhЫ<'@+fŸ@ |='QŸ˜Š@<аЖMŽ>CеЗCюBЗ7r _ШЭFqh‹ћх…N˜­ŸёЌшo†Ujш—h”ƒОМyХ™бКYG }сцœhс‰nй•Xэ…ўш——JаЭ8_ДpЁ дѓГlЎ m3wlŠNНЊ=а"|UЛаУHZR;HZГ­›ѓЁ]f}>PкŠvЌъДшg} Ђхл:WufєpоИэ\ iб›ŠОuЂЗЇкЙ.„оДucoЕщчKњЄvЬu2єЦ‰юЬŸПџn “MЕ‡E–њЎЉл_@oЦ З+;zГ‡>БsЃ7€й†ў ЯгН1Ц"шя]&к'CdЩŒ  ГzŒYXСAшг/AДЬ~J‰–Ч:fEьЖл†Оˆh2Є6бˆZ›ч%ЈVрTfM ˆ;Г-’nšз ЬŠкfі@b%JЕА‘ЋE xДЮЎ͘ zСhFг lb3бюawS›<єїBЃjrДKM€І7ЛдањРа0;…йŽu:‰йяЅNcЖВ єuгЭ b6бЩЬ>шkЙ›ОbѓlQ/FЂSš1ѕb$:­9 :БDЫ˜"аЉЩА{:‹йTBg2ыъХ4а7WŒ–н^hь§0+YRO }a/&†>Б…nžZŒA—ЧЃ[іфахР“ElFчbћМ‹—7MнЂˆ.Mr E•ш [К4S­ћџОšКK2wшв$Ÿzѓ”аЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqX_/щ?џжWBeя+‚ўV-њЋ’ќШ7ЄRв!е|Њ­‰/ubшВpимЁЂП~EЬ-њx gяїхЭ*њXК9Ѓв0KшУс(…ЃsВŸAєЁZєnзk5{ЃsАwDя SГwкОЄ}аћ,шжМћњеНwИб{Ѕдц3к4з‰оѕhИ1шTьнбНyЎ +bз>L}DgaKцщЁ‘w4=ћY1O§ >ГЁMѓKѕш^Њ”ж~Б˜Љаˆ9нмы$юЭ•Ёл{Iца\zИ›ЁL‚Ž3—Eћ˜›qThЖZL-ЊCcцgЭ\5їьnЄ=АkFыцZаgЖ‰>нЁ3Аш~Єfжб!цДш&=’›ЗЇЪЃћ‘šYEЏНiыFоj5жЯ—ОŸаnv:єЦ‰ў\zу@–а~ $z39єF*эbч2лапГЂqЋaFапћ†‘[ЉдhЛй…–F:бЃЬТцеЬ'єR:ZНяv‹СпкRЂ•БAЋcэh•НcєДпббЃи„hэЮаЮ§NœЗ<§љѓљрO§о0ЛєЧє63Z] z8V=ŸУ/G:ДBŒD0їl/3€ўhE7СьqfoњƒdОu˜jоŽ5 ќsЧlІ•8ОН§јбjЈљT*єЬўXzvЩ†–“Цб{,7з‹FХ[E сƒ†щхаЖMКДЪўЌн{Ў5ДnЮ…nXEцъа>цкаи'Јдhн|ыЦЭѓёf+њ|dАdnѓA[ЬmДhcЂQДjVб.ѓXДЬžiuGJЋшсk1ьбi&DУf}іШ`>Ѕkѓъ|Ѕ‰Ц>0•4зFЬZо№ъDЏ Дђџ“KAєЪ@лў ЃзыRшеб+ нА?|АБхг`]ь4шUR4YXМЪ A7Ѕ4 ЇљŒ^xЃз™б Й_"6іpЦёКяЧA“˜=жД/њЬ^+Ѕ1г ‡CАзV4‘Yј,Z>к}m”Т,œцДi^Ї0KьиЂEЌ”m7з†nТФНй`—Gћ˜kC{™] кХž"šиьЩŽ{GLgўбамГЇˆN`vАCа0;й†Xг:‘йТ6_ˆзЇnn0ДЩNgіG_+hгЌЃšшkЅ›>:Ѕ™бŒВCбyЭ0z1 м В#а9ФzŒЮn6и‹`t 3:ЃYƒЧЂs‹eєТ -щцžН№@›{Gq‡^L }ючA6GЁхг5tas[(КДЗ-]šл‚.mэб№biЊœ‰B—v*YаЂVГ8ГUє™]кeэdК4Ы'=‘Іhц8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8ŽћбњzIџљЗО*{_'‡ўЊ$?ђ ЎTJ5ф‡tiЕ&Од=ŠЁЫКПZбG К”њ+B>Ѓч,ъ}uшубЉЮŒ~~~6Ш2њp8нъ§>+ћ„6Э1ш<ъ]wК­•ьЮЂоэˆбщеЛ=:ЙКA§ъ^б^ш§>‡zЗЃCях’Ѓюht:ѕn—LеYаЛЎЏаzЖЃ!ѕ>‡КGƒ/BУ\TбYШ@N„NЁ–б{<š^§мqЂiеЯP#аgbтЙ&F_„‰зˆ~@!tз‹\bs,њ$УЭdhФŒnюеš/AцкаэН$ѓ dЎ =мMWІAcцgЋ9MЃі!7уЈа$jĘњ2Ў&4КЂ;v7А"ДХќЌ˜ш]нВ1ДnіGWЧ луЦQtЕ}ЪDп‚шnиv[КWЫbCнпoЛѕP'Gї#ooГ‚ўўНєІm@Ћ5иЯчО7 h';!z3=єfу@’а^ $zc˜ЋGo6#бvѓ4#шя]§И­TДEы‡ўnЂ}иthЛYGc­ЁAі(ГАpuГИ§CЮ†жд ћ­-%Z–йЩбъX;кВ>z hŸE]КgЋƒшQъ є­§ёЃzKŠFи:њDОќЉнQgFЋ фV#ш9ВА+@Gйш9ТІz%њ,i§ёc$z”љЂі3Ћш[7zŽРЧšў>3Ц~ј Ё?jщƒqѓv›mЈхs™uДqc‹yДEЯьш^hL=ЛdEp SЎ‹йPЧ a61zІdC O4/†v˜kAЋьЯrа­чZЙаЖUэBыц9™й^­VБhУ,Љ‰бГ(4КMзF>y‰ шfЖЂqѓI=>њ|b№0Ж§’f4šТm_+ пЈf‚ЩЦШgД<зкїbкE&\!yЖВЂбOy9ШЇLя`>Ÿƒ]кj–бђоQ ›'‰^9ашŸ\–ыuEhЫгJа+Ÿщ“кЮN…^­4ѕТ@kjщАрBше(t3е8œ‚ЌЁWP-zQ-4ЏКƒЛэш‹zy1clr4lюйЖЉюРЬг@Зl РiШ>k:НЮ‚і™k'Z:'}m”€L^цGїьш5mGwбšЩа88…ZМђиЈKЁ-ъХTW€і1з†і2џ˜h‡КRД]MЦеdhrВЇкуЭЅtР–gUчEnьнeщЃNіyOєBУъ$dЛ: ЊSЁнЏEOДЉNFЖЈMєѕЉmЈЋ@Зц›ЬМЬGvЃЏхn†ъДhLŒЮiЦд њGч5УъХt2Ј^ФЃѓѕ"lЈСшќѓlИ#б™СšzBh™1ДОЂ‹€ѕbс6^†хач,h|я`t&tisКМZLpІ›бЅЙ—`Д€бЅБ}швT)- tiЇк$бТ4‹ [дF•Bа…Uщш‰4I4ЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqWОЏ—ЬGО]ЪorѕEЋ§UI}ь›R”j>(}Ћ§Uыаж=њ ЉЄ3wшc•hФ|AOaьrpнЌЂUЂ s>Ž}uБmцбІW3{ЁїЇJ›ыEяN!ц(tЖЏйНЯ„і6;б{ЉrцZбVѓtJіn‚ш]$fяїYи­љйг\њ|дЛ‡й‰ЮГ@ѓtаНaEЇ`?+цi ŸЦ ЯШдlг<}!ц7lZeыжІ—Жzб/Ј9Z…ћ ›яA^њ/97‡ЁOЗ’Ь/€™m1KlКЛл‹Е<цgФЌЃћлeA;Ь-ЛgGїГЃ‰иh1AĘ ZLнГЃ6ЃkA“А#б˜y[њіЖБчбЫтяп{ѓЉєh_ѓ}[к.оœаj*КcoЗnvZєЦ§НєІЯў.Ё}H*ДiЎНйц tW>є&­šsЃ7@8њѓчяRђ=З[œm7ышЯ#а#ЭгцSH с‹6сooубИЙ^ДХь@Ыl;ZЅ—Cž њ?>_ђGwьДhmЌ§БД>Fw‡•ЊшљgGћO4ŒўЂчєлhДџŠжй’WCЯ/СьЗЄh`Д‚ўiЖ g3;њ#Šи0|Ќ9 §С‚VV„–ЯeжбњXћI…ž9аЖ‰.žѕсhх`wmgгЃg“CЯДЦЃ!8Ѓэh•‚жсЕЂuѓœЮlАu4О@ќЖ<ˆ=о,ц84džг™…У…ЭЇШN?Žœш4н‘Эvєb˜#а„чy;Ь1h›™vЎЁѕ|>Q: Н\ЪJУLІЭ1hEi˜ЉаЗїgw‡  ЅQ:єj$:БDЏ"б—Уш-б˜lДЯ;b{Hњ‡&2[бјQбн Ч.4•BЏЊGьXwpЗ}fŸЯ•Ю‰†ЭкВ{\аЭ-+l;К+—YXЭaшlfa5Ёѓ™v4ЮЎ эѕ:Ќ ]dяp шŒf+{€ЮkЦб‹ Ђ?1:‰91:™б?:‘й‹§сЬvН#І3Oэfћ !ібIЭDhж†ОAЭyбЛC_KнHъхдбЩЭBЫl-DЃЭe†а‹(ДhбYЬ{…Юм$б:|ŠшEКˆYb/‚бЅФz1)єЙХ†FпK›…Ъ–ЭB0šЖŸ]м‚.mэ @—ІЪAш]ЃX8а•šХ™­ЃЯьЕ—@sƒѕšл ѓšЂ™у8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8ŽуbћzxфлЙь"w_ПbъoпъT•гћ&WD‡$›хЁoпjTU;Дѕ~ƒ+шmШњˆ ЫЊСyюеЭqуЛœћЋ}9%Н2Еnа‡Уp}]sm!W‰6ц8§mПп—6ЃїйаЛн&kjOtЖЇйоwe {šш§>›кbŽGЇUлцy :Љ: ЋїyдЛ]$TяѓЈѓѓГЇй‰ЮД@Zs“Йєs_tѕюљйЊ‹NЂ~~ЖЋУбЩШГо(t‹L?зкPлаК@ПœJM6йVєб kНМЋIбgŸ9Яyа*м-zsУVМфjмќŒš1є‹Е,цэD_n– m7ŸбBд…v˜[v3ЮŽюogGSБ=аbzшЫ8OєЖ єЦ н›TК3;а§Tџhun4‰к-ќЬЇ*BпЖжл>™ќ§{^ДмдЃoГэ`Ї5ыh5нЉ‹Ђ7}шяu 7!шяZBo”њ‘і‰жЕmТгЃ‡‘žшjЫлбЗˆYAУlJ4@ЖЁ?—“ящdЁAАb>ЃџђE›ьБfaЋцS’ј!ќб:ћm<кb&CЋьёh›йŽўќ9-У‹ЁOkzЂшЯмнБгЂЕБєЧZа3},ˆюЮ§даѓ9ЮЖЬГ §QIEЯ-шЗЌh•Ѓч—`і[Bєlц@tЂіXrД‹] ZWZ:-иvЌы$шй%§СК:$t’ЉЖ 5vœ4„ЖЊЉб3% 4Р&FЯє(а;'ZL-bб<5ŸjЯн@5ыlЎj+к4lГp˜Ѓа љЌІ gEЯЩNw ˆй†FЭdgІлб эНOуf*ЖУ,Љ=биtЇЦб—Sƒh*Г/Тh@Н GЗьЅKM‡€UWЗpOДEMˆ~hЫюЁHŸЧмЈAАЦіCч2 a1Ђы0jt>ГM3гфfJ4ІЎэѓ:Ќ эЕwаЃmь :…G/Bаш<чE/Н B'1'FЇ13:aг “™=цњУ˜эzsIgЦд•Ѓsэƒ†иSD'5ЁuvZГsU__KцдМЬjvm{зR7R†z™ ЊAєЕ':ƒTУшkZˆ†›Ы ЈqшL\D‡ЮŸкКІK Х$б2ћЃЫ˜ѕ"]J<Р“C Б˜"Z hQ1Z hё#ЁKƒ›&‰’л]л€.M•бТ@—fjhЁЁK#ѕ єљЧЙ,D7jQ-Йi! ѓšЂљвЩЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧUлз>§‘oR%dxƒљ =ђ­ZєХл7<ђэ[sіЗ щ_QєБ5з‡–VЦAgwGŽ3ЊХlЂUЂП**ћhA—ƒњЋQ(:?л4ышЃН/-6иG'zЊМ9 НЯŠFЭAш}_YsНh‹9bMgb{šЇ‚>ЂѓБŸ'ˆ~>E‡иЉЭгB?їбЃSБŸ'ˆ~V CћА_^R›!єaњ%њШjDПДЅ7SЂ_ AГїE_|/2њ%7?Ѓf_є‹dІD[Ь=[ˆP4T^ĘКa‹ ЂEz[zГžшfдіTЖУь‹е 7оhбЃmьш7ZTƒоHh­ЂЛ1лmЖЫ Ѓas.ДCЌЁoћdѓїяu 7њV1зˆош[-;gЇC›fњ{aєЦЈ‡ЃПƒh N6ЭњX 0#ш?ў€б™иžfЁ™џPЬeаW1‹^{щЛ’|ЧэжЇBcf§G%hдЋЁ…јCЩ­УSЃ•‘AЋ#Ч e8ЃЭfЇ0tseКcЇEЯМбЪ ЁgJ8zHGЯч8;yšЉа‰ЬаЌБqtžЗAьёf*ДrЯv>Д~зЙTЖ­ŒžZэЗІUv.4fЈЙ,оЁMЖzВ{иЁFЯ<б*BЯŒєёаСн.ДЮЮOЏ­Вс#внh^+к4ЯщЬ› ˜{8…97šФьD/thБНа<б˜9z!Ё?xЂQѓ|Mu>НгŠЖ›ЉNЉЗ­g_єР6Š™ ™cаKsn3ZPмЃ;ЖК9V3kе‡^*hШœнью‹>ŸС ZГЁW аdfНъб[G7ЧЛбtfН B7G3/‹ЃW—ќаъєЅаЋъб:{%5F_7z… -ЛG ѓ…НZHљЁѓ™bІD“›(жруаєfšfІ˜-hšх‘Т?;дДЯ\ПМ$6CъУ8єKєГ%њЅ-Н™§ђ’ ™uИ/њ„аЄjдќŒš§бп^^R qѓР:њр@ƒхE‹iЁ[ƘzГiПоѕEoЗ 7›№D7УЖлLj‡й-:ДEНёG‹Ћs 7ўh!Ѓ3ЈцЭe˜ннk›Imchиœ э4+шл.ХќнMЃvš•5э‹N<еNѓ}ЋцBЃъш™pЂПChЬMFЭ6єїяƒzыTSЃr Yо=ОO§‚ждЉиЏ‰юЗщ?ўЩ8rSЁф§Gзw5щ†N5Ÿc-Фrh]§GZeO-ГЃе‘уа;1Z…O=›ЭPtseКcЇBЯЄ|ађ KЁg3HmЂ‡tє|ŽГг˜ДЪvЁч ;^ошy‡g{МйcЂНаЪ=Oиy_НhэІsЙъ­Žі[*;Zн84Д@Ь6ДЁІG[Щ’Z=й=hЃgzњCzžm˜ 4tpЗ=O‰6ЭК"н-БЧЃE 4@иfЗšнВIЬYбsВНXаЁЉЬТiаќајD“œnG/$є?4nžЏщЮЈЗЯs(кnІEƒлнТнГMЇbІSŸЭсшхriЬэ:‘&wшŽэ‡–йkГъа—3xmц шю`ї04dЭ‡^Љhл>§ёуrщƒІ3#шU†цКNє*-оЧ ЂW—ќаъєЅаЋъб:{%ЕVHЭш‚Жь%Ьі h1ф‰Юgˆ™Mo X…C'0ла§ЊNAЖЁѕЂquЭhT=EєТэоІѓЂhїУThXŒЭща : ›ѓЂrёшtfН A'4S ГO4:ћŠN6г)Щaш0RЇElЏЉЎ ­ЈБ?p9о'ˆNMvННјЁ5vzД}U__ћЁ—yЩіr­tгg —™бЖЉіG ‘‹‹Ј'жнњЦŽ.а$б2/Г‰.c–дZдˆОР•žш’фHtYrл$бE‹Šбb’h1IДA—ЖM-LtѓS]ZЉЂХДб…uH­Yшш [TŠn’бУOoЪ|’аЅ)сM(ц:аNѓA1ƒшoпіћ——§ЉrцєKF4hŽ@ћі’ ›ыF#цhtУ.eЎšЃаyиЯ“C?ЗЅ@Їc?O§,ŠіY //iЭ)а/ аЯFДш—hЗЙ>Д‡9Šn>hцќшѓЉњбІЙnєfѓѕЋђиDаbh™нœыэ‡nюЕ=U ­š§аЂ(Z]ОhбЃqv:ДiіA‹ЂhРьююЕнBь ФУ\7кЗц‘шl‡™§’ šЃа*ћ…=˜7 йнп DПЃ%3’ §§”‰nzЂEcfњ{14*О MЖbFа0 m3лбп‹ …АŠQіw%Zgч1CшяEбц њЅД gД ­ВaД›бrГ6К92 нБSЁg К‹ЂЅћCЯД†б*zHGЯл`ібцЄhNa†аИCK#4s.ДХŒ е;ЮЕr mfДnЮЖš=а†9Z7chlI—@f­žь.ГMДЪІG›f§ECцДhРЌЁСƒн%4hVидhШЌЂсгшKЂAГ‚†OїA№ња6ѓœЮьd‡ ­ц6*ѓ4бB/ўшюДвœhиьЮjVГ7кm^SžQo5ћЂнfZtjіBќ›зkѕwДlШ<НVаYЬГюxуДЬ^Ѕ7E›fJ4bžuЇб‡ЁkFєj‚шUюиѕЃWAшЅšа ЂW—ќаЪє(›в ЁWеЃuіJJ^ 5ЃW#б™Ьі (Я,3:љhV^Œёш4bz1A4М@Эhй\'f/‚бЛ~tиЁhhqфF/HаIЭ{Ё‹NmЖЃ=оK˜­шХ"оќ# uіЯ‚Ю`іFЋlќН%‡™ХlАУб<—иŽОFаКy™лlY зJ7}†љTN1:Гй€Ч K˜}а7еЁe6ŒОЉНˆ@2_Rwi_tYsКА9]Z,"аЅС]0Z]кЉф‰.ЭдsЃK œшв@8=АKы tћгЪбgЖfžZ шВ0w*КЉ~Г0ЬЂ~3ЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧq?f§ЙЬЪO›sнП}ћVШфъЂлѓЛПеЊў*Ÿ}љYwPњЗsE}`шКд_›<аUйєA—TU3аG]ާе>V‡жХњрB—`ЛЬХ\0ЃП}лПММьїћ‚f}tЃПНДъ‚цєEƒ ›ЃбYц1ЧЃ_вЃ1ѓ4ЩєQц(tІЙNƒN8зЯmIащцz‚шчЁ`ДEнЏъ$K$-:ЩК~ж› z 3эžgкІNХv“5ѓсP>ЯІКFДiЎНй|§*­А›ЃШ 6бЇ[}лnЗeакDFЫ€6Э^шіV ŸыthРь[P ™=анНЖ :СЊі0D'Xе0zГ‘ЬЁhTMЦv˜+Go rZeПМPЃ{2–КПйV/ њy,њ{Œ~1#DЃ`'њћw ЂgD›ьX4•кJЖ Пйа›-f„§])7кm†апCа <“љ‚ўCюч@їьМh… mъIЂЗЉбГ6 њ?†ЂЗiб3нEбУэЌшmBєLo­ ‡ єМ TOM!NŒр‰ай–яЇ™KЁхбnĘыЅG[чйm‹ ебUЂэѓ,Ё‘з!„ž'F;GжЯЗЃчIб€YE#g`hаœ ™Iа› š4vкјŠюс4шM€Ж™ч”fсПІQєGsКgџ0шцJotwlp>48Я‹єв‰&4ЁнѓМІD7Ёf_Д{žѓ ошy­ўnMЫЦЭh™}BЎ3)йВ8dv zm”о<ЈУачL111ЯVЋ4ШЭˆŽšщЂшU7бНzш•/кНœЉ_† zuIV{Ђ15-PЏъG DЌ-ыЪа3Ч s™ЯъP8:ŸЙaCf*tВ YйїтбЉЬ(z1ЬьFПabєFи‹ ЂСh€ Љ#аygR‡ЂХ‘mЈ Y‡NL6д ЅIЂ}оK˜­шE :ƒY_д“DЏ~ ДЦЮAіGЋьТhыЂіBьLbSƒОА3šqєѕѕ5‚жЭЫœ^-БЏеnњ sЕA—0E1+l}3 є1зƒюэ‹ptaГњyЩ]иŒЃoPtirК4И \D—ІСh!ttiЇж-ЌшвH='К4ЮŽ.­C‚а=ЛАЭ’‚ОќŒбщRбMе“'Šц8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8ŽЋЅѓЁЬЅM­ВЯ'Ѕk+хВ “AьЃ‚ю*i42аЧ ЂК&јACЋC5:()f]‚mšыGц`tЭ9нёf}Ќ š5єср‡ЮХ†ЭuЃs4:3зŒFЭQшLьIЂŸŸS гВŸ'ˆ~nЃDЇ_ ЯD?'DЇb?O§<]l8аКy hУ\њy‚шgНйŒE'ћˆъ@›цкб›ђ§A•hг\?0FЇљ#.КuTŒЦЗ;_ДчЏgЖmeбй-Ќhњoœ єІOxЁ…„†иMiЬР\'њтE‹A%b;Ь>шў^бБ§§ŽжсхбпЋF›lХь@Ыl*ДнŒЃПD;ЬћЛ’ =АKЂПO§‡”ЁшŽ=E4‘й-Гcа ;ŸЙ>4ЬœЕM =Sа§X М{Дh"3€ž ЃЖ =?eВSЁMs zž ˜%і€>ЋŠЁч}9аАй…юяf˜s 3Š>7мmT нžzƒ–й)аЎ‰ Й,кЕЂ…€“.‰1—Eь sz`џмшŽнСЉбnГm3ЯiЭmfнБ­цЖ<шХбэљЄошсДущ —N4Б™m•nаЉЭ0z€6Эeа o4 иљЬcаыьцеjЁБCбыKI–F"єZB'0#{GЧŽAЏЕђЁуgZ7чCыћ‡/кЇa#цШхQНj“йѕЃWеЃuіЊOоіъFЏ ˜{іJ‹ Ц,@3:‘љ”!–а ;ЮL…ЮjбђёCч5Om_ SBЏщ аЛGIє‡Htb3Р^HХЁг›=]t39:‡™ХlАЧЁs™)бйЬžh• Ѓѓ™qє‡@tFГЦЬззОшх2Џ7­›K Uј€VЛщ3Ь“D2Kьpt9Г }S%КЃЫ/EаlАK›…МQ{ЂK“›BбЅНm њE—цv™h!n@viЉ`жбе™ћ.оKКЙœЫšbжбХTAЩшвяІhЛД"А)š9Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8Žу8ЎЮк3™K#B›.ZcЗчЛ вS—i;˜ъу9вѓ­i;ъЃ‚І=PœІƒ>‚шЊд]}DаѕР•ГшлŸЋCе;4ібŠ.Тž к G ›^*C+Cd}8xЁ_ВБ'ˆЩёшБ“ЂgГYеhpjgч4ДЈ=ыгЬ2Zн=ОћЁЉЬ&zfЈџб’z~*™кУƒžчDCц-ЁлSUQєМ/1cшšYцбmвнц@Љбsz^н†б’DЯ“Ђ]-`sхhф8щьhgBЯЩбТлžЇBcfєœ}aЇEŸй”ш&3Šдє|NMЦбђ§бƒœ‚˜‹tдqYtsPpSgA/‚аЪљнYѕhД~М;рЮ‚^xЃM1 &7CшХXє2?zA‹ЮAžЭV Š^ŸKdЖМ G зыAРŒьвЋшЕZ>ДўR @ЏѕђЁgqhCœF˜W њУаЋ6‰]PЏъG PмЃ[vхш9:y`ЏДІ€жЭDшTцS†XBŸиёш„f*tV3ˆ–ˆ':ытРдЃбiЭі2%єј5MА{ЄF›ь§!оlA/таЬŒž,:‡™ХlАЧЁs™)бйЬ„ш|fOє7:ЃYSцkН4аYС†ZBуj НЬOVй(њfH7BKl ­єЃЁK™іДа9‚ОЙAеЅЭ'ЕДQЃш›Ъа"]к{юЧA ]š*gЂ…†ОАKCе ГЎЎ <дyЯiѓ\ŽeO1+шbЄа&‰–иЅ!!MЬqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqЧqxнљшУOŽ—ˆOš'ь` еЃхГшЯ?9jhЙВжЎƒ>V‰ў*uаRЬБПN§u$Кмn>hца_П:ЬЇjCыц)  3ШіAgdџ0h“э‡ЮХ†ЭuЃs4: ›б™аЯžцšаЯЇМЬшдьчЩЁŸ/бЃВ-цкбєЛG9Ę Кyœб?3кЖyˆJбЖ]ZŒF'b;ЭѕЂ-f'z+•}6oМбЧ аѓЅ3Жћ5„nОaњ~ Cga+цdоєf§]Bo sєiЃЂПїmЅAoPѓ€>T†FХњ?тбIиŒЖАѓЃUsншнhџИŽnиeаLнБџњyаЄf=;ŽžŸВГSЂgQhQ=ыг_Š6tѓxN4fžif§]CЗ;Ь”hдмgЂџјCFџо€аbI…†Ь.єw=ЯˆЭ=[F7'Сp=яЋнпЫ0з‡>'™Х,-кnЦавН  f§ёуTа'„†СvЁ;v 4fаШЩнбЈЙGcЧЛбg6=кm‹&4_ђ0ЃшmCг›гЃчеЁ‡aЯGУ№|hiŒzYК9(инАхѓЛЫЁAшeшEZЏ zAŒ&7ьХHДЮNaNNbFб;Н\ЎзyЭшuЮdHz-•ЦL^Bы;Е?zm”НRа&^и&^Ђ“˜ єъв№bДЁuvГŽ^MнБWZS@ыц§!Э|ЪKшХТгл‰ž'CџџэнлrкК€a2го'3kП ;яџH›3Ж, Б%Ѕп7“,кѕWЃШ”uЁЮцGtЧЩнщЂЛ›oбчGŸГ2њЂЇy0њ^нн̘ЂЙ'њў’žуш‹ŒОМлНˆџwSFпЊ/чЧЛѓ‹~ПwVЯН\./щ~Џ5ЧГgŠ^>§žGєхщзЂ#е?Љ^~+:Ќž 9RНќfє{‘бяг7wFпГŸŽ~џ;ѓDџDєпПчmn/'Ѓџ>L“7WцFuкК^їмЋš#ŠŒОfЇŽJr?‹ОfЗKг2ж6НЫ:z[ѓИК;KWеoоeНDяjОikЏ"бЛ,Ѓ7WэшSіЎ7:UјІ6чНih5Šž;{S`єІхЕш9ГлЭљGGš[йcЃчЪŽ7чнбќrє,йЂG‡ЛЧЎ€шіэe|є й/Eї7ч=а<}і/Šng‹ўЃЛšУшg6ЉЃ;›{яˆЙFo ŒWtЭЯGOам}n„бЇьЫ™в]йѓFЧšcбяEG›#бMiЃЋŠž 9š}9FњgЂЇinG/ Œ^~+:Ь=}ЪnGWеPt3МœшПS7wюcЂуйЏІ*~>њs0њo’ш?КЃ?ЂџжЄ‰n7ч}Ы.'њOбЭ№?W%EџљСш‰›Ћ?-пžКЙЬшvіэѓoEЯаќУбs—н•§/DЯИ {ЂУьўшЊJНќFєlЭAіђХшSіœЭ?=kѓEЯьлб šПЂљ•шф=*КяУšЃ“47ТЧEзГг5?ХDпГ—5џнЂџзPBtеДљ,}бКјшOѕdtър›gЂSЗоŠЮЌyTt^Хешшд™Ёсшд…‘ш*ћш[vUеšЋzvкКзцЊб\хнмЉФцЊФf€чmO‚kЛ$%OˆDяv9WojWwgЩЂ†DЃwYGoЗэшнУW iы]1б›‹vє9{Зы‰NОйдЊ‹ˆо4lCcЂчЯоlzГsŒ“_Œž7ЛНЩ=:’Љ=_іˆцмЂуѓќrє<йЂгFЗю.ЛЃЗлббsdПнп\fєєйП(К]-њ_ŒюhnE?БуMнемGŒžЖzьDџЂшuM)быІ"Ђз=б“VЏV/G‡ЭЭє)“ыњwУй#КЃљ–=SѓЊІ7—шюцiЃWmїшічb‡ZuOё-{Оц‘бCЭ'sзЋЋjп=Іy’ъшcѓ~пhЮ9њ’]Ѓы2>fЏ Œ> ГŸž ZДш‰ЃGЅE/FП=<НX Eџ|v4њ­оDъ዇єбЗђЊНЏG/‘ъШпaВшVѓБКъ>ФЂлџгЩшHѓQ$zџљљYЋЎнІŠюo~;§рU­ц{ѕ"Iє@ѓБ:}s§cњГEџ\tіDбЭљFw'ЧЂїЩЃЯž‹ўŒNugєbšшОц[tэИёЯhuwє"УшѓйЛ=ЩЂЧEŸюˆѕцvє1ћН/zŠцошъдˆEŸЭYннjŽDпd]Хš{Ђ;вЇˆюЎў™шIšcеЗcЄKŠ^ў`єDЭ­шхЗЂƒь™ЂЇаНŒEWеPt#|ІшЗшС™>њ{Ь§ћwЊрXєлбёьПљDGџM§чбвDGšГўsдYItГћЯEбUимН@ђ‹ўѓчйшЮ­cњцъOшћб“7ЗГKŽngџош9‚‹В‹ŒюќQЕO]eVїGWsG7ГЛѕPє1{Юф5zом8:EѓwЃ“4WБцшфЊ{>aJ] ~uМ§™Eє5ћљ™NкмŠ^.џ;ЙGџЏ!“шsxе]uEЇ.ЎЂбUGtърЋЇЂSЧо=:ѕaTtNС'їцъПFu0ЯЉ3C‘шЊ:0ІШшkіёё‘|"z>& гкЅЎxЮЎРшkѓюЋ!uUП]бЛŽшЌГ3Œо4œЎlя†ЂSeoZбл z—]єІeDяzЃ“dџТшSіPєќйCЭ9F6Šž7МнœtЄљхшйВGEя ŒоnѓŠŽ5чmўFє,йЂчЪYєш}:ЃшёwФYВџЙшu@є\б№i›WпˆŽ5ЯНЊщ>м]ЂЃХїьЙšŸ‹юn^OкМjнS|6gѓишЁцщЂ#ЭЕьЦЇbAєс0X=UxotUэƒцœЃ/сЧц@ўбЋVsўб'yFї7ч=а,:“шХт”ЕX\KŠ^$Ž~;z.њ!Uє[+z`ŸN§VsЛ6tGŒG7ŸM§~eІГEПEЕš{ЂлІŽŽ7Eї7OнбЎŸЬN6—нjюˆ~H›ш\ЂуйЇ“ЄK‹>iЃУц0zВц*в{iўhВЇkЎ:šП=as#њЯŸўшц;ъXє-ќяп)›Ÿ‹œщЃПг7?=Д{œ›ЯІmўщшПFџ=*ћЯŸGv)б ŒўгˆŽeч§чщшd›ЧеŸЛёб‘цyvщŽЎцlŽFЗГ‡ЂчЊ-9zм&К]bєьЭбьЁшfvŠfб9G'oЎeПђƒ˜Њљ;бЩšяйЯGЇlЎšu!бЇьюЗLЭO˜rŠ^]UП;:ЃцЊ;ћ4іhўпџrj~6:uюM<ћ4ђПџ…бЉ[яFDџя:ѕЁ§пЭш‡д•FѓЕц*пцГSёщёПГџўЛ\ЯЙЙК6пЂЋks•ssЭ):uУгJlШХю$uФГ Œо]|5ЄŽR`єnЮ;;УшMУёТіa :]і&А ЃwйE‡Щэш]_tšьoGЇЈюоŽˆNPнп<*zюъy>WGЯм§cбѓUЗ“ЂsЈН+0z;6zЎъЃcЩ‘шэишYВEЯU-zЎъ‘бЃwŒЂGп\цЉўчЂзбsEпУ'n^ŒŽО5EЏЇ^еєGю.ббр[ѕlЭЋžцvtwѓz=[q3Л?К/xъъvє=Л7zАyКшXђcЎЋžшеSuЧЃЯсЧЏVsўбUЕ<=Muwє‰ш™šѓŒh.2:lnFЇк>ОНXЋ'EEпЅ‹~{{{5КГzъшЗЗ Кеœ[є[ЭэZы†8*КљlЪшЗHt{Ђ{ЂяЁС_bКшЗИчЂCGw4Eї7/ІjЎz›ЃбЕг‚ЂЯйSDŸГŸ‰ў|&z‘aє˜ъiЂžˆо?=s,zџ\єdеOEf2епˆў|=WєIцбUбMŸЁlб#Ѓ?Bб3EwVЗч9ЃшhѕrЙŒEЗЊsŠ>ŸBiЃУцfѕtЩAєђ!вќ1дмЈž)zЙќvє-{Ът њЯ@t5"њœ]§Э'zpMŸL›ћэшhѕпб“Gџ§;Kt-Лаш?DO]§љSŽeg}ѓttЊНЃќdtВ Џ/К]==WnOtЋz(zоцGv‘бНЋњDЗЋKˆnUЯ[еOF'hŽЬѕPt3;EѓwЃ“4—н^еƒб4?CsОгВљешЄЭчью}:ўџrˆЎКп2UUІбе/Ў2ŠЎg‡бѕъЊЪ(Й1зat­њyEwЭѕiЄ:ѕ!>зЇ‘џ]бЗъџ§/udЈ§_}—:2ц|ђпЕцъž.ЌЯ#њПsїзыYG?ЃЋс—хх LрЋ&uЫX_FRїŒ6чНiионЦ[Э„w5пЂwFw6ŸЃww9eo Œо|#:Ux_sЎбНЭчьЁшљГУцЂ[ЭНбнйГ†џубѓeЗ›лбЛЬЂ#Э­шэvlєLйЂEЯ=KЖш™ЂcЭЙGG›Ÿˆ^з”НŽDOоќЭшuЫєХUЕњVtЛyŽшUЭfѓј.LЎЊУн#:вš,ЙЇ:Н*zЪъЃ‡›s‰Ў-zЎшсь<Ђ? ŒЮЂџ|џ}б6+њDєOFŸЯРnE_ЋЛВГˆў((КvЎ{GєCбЇ_>jЃпgjŽE/—ЫKєG`0њ}žцzіђсrсљшї™šЋHѓQ›Ѓyiož>zеaLtЗ4ЭэшC6бЭ­шCб‡‚ЂїwљDw7Џ‚ц|Ђ{šWтЇЃ'ЬюоНAєсАЈЩ':l.!КемЯ.1zВцsєллїЃCSп\оЂбэцчЂ'l>zы№НшХBєыбЭьЁшIГ_ŒnNЫЎŸл-њчЂлй#вГEГ›бяяП/zТцoEŸЄhў7ЃЛВE?—}Ы=‘о]—Sєљ`ї Й?zтцZіђюvхЃa8њ–=}sеjўnє ЭUЋљžнн•=GqЉб—ьхВ{tиќjєlЭUЄљœ§|є|Эе[ўШ:њ$–-ZєOFЯмЭ~6zўц2ЃлйџBt’цVіsбЉšE—Ќ9Ш~&:eѓЋбI›йЭшЊjFWU>ЭЏDЇN>•hsюб—ьЊ*/КˆNи%ŒЎgЇnыTdt3ћєМьшдa§šбЗьДMƒЂбi“ЦhFЂФцъ’КсiEFŸВSМ Фfіu“:фFo:^ёѕ•]іpt•[t-yГ={ŒэnОвХоŒŠЮЉzи>бavТюžшэ@tЊъ0ЙНˆNTўЃЗ#ЂчЯhо6šѓˆšч‘бѓfGяr‹n'ЗЃЗуЂчЫ-њGЃзkбЂ{Ђ[еЗ+YGЏЕ7ЉЃWЏDŸ/І‹^Ž^вEЏкбЗІХ6ЏчjЎj­wэшУMm-ДšgэЎVЋFѓИшhѓ бЋcЂ;e}Ш&К+Й}(0њPPєўЎœш§‹бSVw'ЃїMЯ­ ЋћЂїЂEП}Xдх6їDGЋSDЗšћЂcељG7УЋjв›ЫБюэээgЂkІ>š$zњцЈшъ‰Гyt3{ zкьЃ›“DЧВkЇК=\&К§љLuЊшАКŒшЗОшїЃппћЊЇLў^є{wИшŸ‹ОUЧГЇ~fг‹GGГ3ˆ>ьўбЩŸ:КїЎјё4GЃпчJОG/ЎW>šFDПЯ]UЫe˜§BєНЕшх“бйГUWэшsvібasбUkЂOй/DЯз\ЕЧ‹б36ŸEЊ‹Œ^ŠнS§lєьЭБъ'Ѓ4GЊKˆnUџОш<’лйЂEїd?2Йашъ•шФЩъftU5ЂЏЬ(КŠ7GЂГRdє%ЛЊЪ‹ЎŠ‹ОšеЉл:ЕЂЋќ››еч %DWEFWAtU@rUЋО>/"њž:у9EFŸГS'<ЏШшcvъ€W @6wлЃptЗЋЊЏЏ]}6НбЛcє.ЛшM]Яон}5ЄЋНh7?Ђw™FGšясЛЮшФйП*њ”kєІ'z—iєІ'zз0[Дш‰Ђ“eџђшѕ:—шMб›ЇЂлй9DoŸŒ^gНZ^_ЅŽ^=НЮ$zеŠnОЫЋGЏвEЏЂзЕшuтшUC}ИzЖŠg^ЭcЂлЭѓFЏZ†ЃуR6‡б‡ЬЂ#Х­шУшшyВуЭЋŽц<Ђ;šЯбћЛМЂЛšWцМЂ;›Wћ†CN ddsбћ.zтц—ЂЙ›ЇˆžМљGЂ›сг7џ|є ЭеллЯD?Є‹›s‹Ži57ЂћГE/zќ§Lt,ћqЊ{™б}Э)ЃлсŸ5ЂEчн—о§~ѕ[ЂgkюШюŽ~d7Уч,ўЉш™›Ѓйћ§Ч]wє%ќђ˜CєG-њГ7њ=QєВхЃЁ/њ]єdбёьєЭљGGšџ‘ш™›ЃйЯFЯп,ZДш š#йЯEЇiў^tЂцoEЇj~.:“‰neїEgВЂПА9Кљ•шдЩЏDЇ.Ў^ˆN|ЎЊztъЦ–hsюб'ЫeU•]}бŒЎgЇ.ы4W%4WAsUBsWtкЈaЭшKvЪžQ"б)sЦЋGЃФfn67еvЛmюŽ__ѓG iD‡еЛнБњ+ЗъЭУvTяnО’Ео…ЭЕъ]GtъъMkЂнЛЮшФйбл"ЃЗGw6Ћw™FozЂwНб ГEgНў%бЩЊЧGg4еODgSНљVtЭCб­ьтЂЯЯ3ˆ^=НОЪ.КъŽ^gНZЕЂЋЎшu]ОбзРHs‚шU]+њpѕ( ‚ЫˆŽ˜7yz-zжьVsX}oЮ%:RмŠ>Œž+Л3z’et<љ}QHєО!ЋшЎфюш ВG6—Нџmб‹EІkК?КЁШшE5oђЯD7f{ŽшЎь'ЃѓѕН§Pєc­Ь}ќzlЮ,:І•мŒюЭЮ)КЪ>zpЊEџTt,ћ~Њ{AбŸНлGЪшVїgш$К'<яшQ_#њ§ъWDЯWм™нГ>опcн37GvDПЇkŽfя?КЃ/нчЧ Ђ?њЂп/Э Ђ—-=еяQЂ>:žAsўб‘цќЃ`ІgOŽV‹-:ƒъЇЂ“$GЊ{tЊфBЃУъžш\GЛКшfїшшФЩъп:јфо\}ЯnFЏ7ЂSG†FDЇNŒ[ПDЯ&ˆЎe'ыUxєхyЩЕшыѓ"Ђяйїч$}R.F‘бР›ЃгуіЈ~}wіu—І.nsобЛlЃ7wлЛЫШЎKўІРшM4њ’]Bє6ˆоН ьzЃSfwMtЮб]+КН>=Wt;[є\бЩВПЈЙ7Кvw‰dЏз94?НNН Œ^_•Н.(њ–Н.0zuєсън–otwsОб=ЭГGЏ‚цUібЋЈ§YYбћZtUHєО!ПшО‰Ю5КoEЗЃћВEџlєb‘kєОРш}oєI=ЕМшъ=cѓ‹бЗш9›*zжцhі3бЇьЫЏszlŠ^Ь§vзймˆŽe?цeЇы%.gМ0К%6WЇьд/(Б€якl6чЧэvлИО;ЉОnRЄuкlЎебљTonNЩз‘нХWDвтЊШшЭУЖІЋЮ%zFяzЂгVwDГwНбIЋ ŒЎ­шžшѕ‘шЙЂлйЂчŠNVнVчвмн;зыuyбыdб›РРњX7šз‰К_Ž^}Ы^—}Ю~eŸI\6D_ЫчєvгнмˆюЊž5ќ-Ќn7ч}#zЎшvuщбŸŸ™FЗЊЋъГц7EЯ—ЋГ‹3з…DПѕDП_%žъFsGєЬЭcЖНXt#{іцслbtІkб ’cеMёшSіёнtšфVѕr96њ=YёЩ20.њ=itи\BtЋ9Ј-њ•ш„ЭeFm]бi›џЁшФЭ/EЇnЎZйУбЉƒOў‰шдНgOFЇЮ}шŠЎZбЉKkjбU#К ЂS‡Ц‰žO3КЊGЇNыDWЅEŸŸпЃwѕj&Ÿœ›ЋЃбŽ>f'ЋyB]„"ЃйЉ^Qd4Д}ЅЎxЮW†б›ГюёЏ†љКњlЂП2ŒомЃЗWЗ‘неWKЪоГ{єЖРшэбЉГ7Fo"бЗьннz-zЎшЌВEgАЙ#њ’НлugЏзхEЏ3‰ngwGЏЯЪŠ^}ЪЌ5g}Ы\зšѓŒ>\н›[в4Џzšб]ЭiЂW ѕц§ў}8ˆўйшеj6>:EvМynЮ5КЃљ*ЯшАљ•шфЭ/DЯн,ZєOE/ЙFяŸŽžНy`—Ѓ/NЅЇЧЊЪъ>}~ЌЉо•О]—Ctиœgєл[os–бoшvsŽбoбљF'Ш~*њ3“шсьЊњЌ2:УU]Dt˜нŒ~ПЪ=њs0zіцHvИ@bбѕьЭCбб™ЎE'ineяї ёшSvЊоvє2hюŽ~OН Œ‹>)1:aѓЫб)›EчДЙ•=.:uГшœЃS'Ÿ<КїьЩшдЙнбѕЛфе\u6ЧЂSЧЦ EЇю‹ˆNз­;:uYЮшдa}ъбьМ›ЛЂSgѕ‹GЇЎаhЎЪh>ЛŸ•в\еšЋRšШгзYъŠч|eН9щџЊ›­jР@єзW~е›Э-z{uй]|Е$ЌНкмЊЗЃЃгWпЂЗOD'ЯŒŽVЇ,О'зЃoйЛЛu‘б­ъ"ЂГЪ}tТцŽшKіnзНЮ#zSdtkЎЛЃOЯf?Н.2z}yŸК^—}ы\чН ЃWїцPЂцU]И}мЃ;šEЏКЂїћ§#њpШ8zuЭІ:ˆ^эЯЦGЇЈŽ7_eнлœitиќBtњц$zіfбYF/ВоїDЗЋчŽEя{ЃЯЮЕЧЧуя.'zqi>VŸУ ‰ЎЫЁ:lЮ3њ­П9гшЗоцЃпЂѓЮ Л?:^<К]UŸЂ“F'Јўбav#њ§*utЛ:ˆўŒDП'n\ бшїФЭ­ъ13}­NЉоя?ъ:Ђй)“ƒъeГЙ;њ§=iѓ206:iіЫб ›_ŽNйќЫЃ?3ŠЋGFЇmЋЧEЇn~%:urЁбЭь1бЉ{ЯžŒN{б}›—КіЊ;Кўo—МškšЭБшд…QбЉѓтњЃSзѕј=б™77Ђяй™7ЧЃЋМ›;Ђ №QћОфBЃрЇ|ЅЎxЮWб_5Љ[FЫНЏЉ5wDЇЩ›Kˆn5Н/0zџOD'hўvtŠцяF'iўVtšтvєў‰шdЭUos#zБШЃјѕшE1бm9D‡Э%DЗš ˆn7ч§V#:шŒВ‹ngWечgйбБц\ЃoЂЭЂ_ŒГыбяGП#:Is+Л?њ"uqtеАЙ o05ёш‹ДЭѕшeЃ9чшeУишФй/F'm~1:mѓoŽГKŒNмd‹N]\Н:јтЙшдЕWOEЇŽ­КГadtъЬЖ0К}{I]бhŽEЇŒыN]з!h.#њЄж\xtцЭе%;М–{siЎro˜ЧзIъˆg§ѕ:eМЏМЋЗ'­Ћ_M КzŠЮЅzsrIIї9zгЩžНАeГiDЗВwU†Kd zЗлUыЂЂwgыЃЬВ_ŠNV{ЖйќŽшGѕюНЮ=њVНлuV'mЎEЗЊwнбi›ыбAѕ.ˆЎg—ИљЉш*—ше*ж|Yд‡CЃљ6牋ЋSєC;њЄжМЮ"Йб\‹оŸ/б‡uSNХзш§U-:ЌNл‰озЂEDяkjЭёшTйF‡ЩeFя Œоџб)’џХш4Щп‹NеFяŸˆNж\ѕ67Ђ™?]Џ^н–Ctи\BtЋ9зшzw1бo5П0:Vt>еoНе%DЗЊЋъГШшЯОцlЃobЭЂ_ГыбяяяЙDїЯuVЇJ~.њНQžЎЙoЋЎЂбя4‡wХšxєYкфFєrЙ,$zй02:uіKбi“GFWEFWUyбс\ЇŽЎžN]|Rdt={Dtъи›"ЃOFFЇЮl*2њ$Œnн^RЦ,ЋЃЋ*hnF'nыTdєI­ЙАшыїХDŸГ[з2O.4јW|еЄn­јшbТГоuц™Нщ^gНЙ GvgыЃьВяЭлpЄ3:EfгНљЌ>ђˆnfЇ*­щŒо§ШоeН)0zгŠОe7Ѓыйi‹Ћ—ЂгŸtG7wGvЪк‹UЄљ}šзЙ4з<ЂїћгисъКіъˆЮ#}оgнh^эkњЂ‡‹Nв\FєъDя ŒоџŠшCOtВцшCOtКцзЃ6ŽnfЇ,Ѓї#ЃEя{Ѓ-Ђ_Э.1:lЮ9њэЊе,zЂшvЖhбcЃлЭЙFоEšEПfŸFoбUѕ;Ђ6ŽОЩЁЙ;њ<кЈіъэ­™§qwmGgЁбМЌ5чН\о‹ЯЪŠ^іDЇŽ -ЭшLf‹ž–ш9‰žS™бFWUйбЉCžUbsUb3TезCъ”ёJ.)<гшЭfг3šщ\їFЏзљEonZ#Л“ѕIvs}kоnУ‘Gє:Џф{єіЌ1R‹^чнЈЮ?њV}ЯоэŠ^ч}п;юбЗь z]DtsMпЋSЦо<НЮ&zЕj5пЂ'Ецuва‡UЭ#z;ТъФБ7џ@t&хFЏічбŽшдсП+z/zКф2ЃїFяEєЁ3:]ђPєсаY]`tЪфёбYН=ЗЄ3{ЃзнF/Byd‹žжл[М9ѓш‹А9м=ВŒnW—нЊ.?Ке,zšшvsЖбŸ7‘цLЂУъъQ]х§жŠОUПћ б)“ЧGпd§6GЂГ№TмœG3nT/ ‰^>ŠЯЪˆ^6šƒшL-ED‡йЂ'UdєЃК*(њDєœDЯGєœ L.4ў%ыЃд ЯZgН=j_]_Эп3ЦЖРшЭf{еМО^ч›Н).zsЖнЦВsоНSіЊе\^gНК ЃgЂJ‰бЋЃW ћЃGv;:“№ŽшѓXAбЇБxtйЭхDяEOЈєш}}( zDю~CtъфqбйнЪ;›ЛЂSŸt67Ђ‹дuнoєллиш‡дЭш}Qб7ћVvWtђlб™E/ Œ^ДфнnЮ%:Ь~DWUyбU$:isеН@šЏЪЋљ•ш4Ёu] $uW/бsЉ5/‹‹^^UU9бЫ :uжeCъš‘ŠŒnfЇn­Фf~ЮzНN№Дѕ:чъэvЙК^g]нgѕцНm‡ЏзgН9йо5ЦDџœЭf\tVйЋ‹xє:Ыше]X}8§cDЯcеА?zdЗЃ3щюˆ>}q‹Fчнб\Nє^є„JоGЃлеЉ“ыбћ њp“qєО3:П›т˜шCЎб­цztn#t67ЂЉ3› Œ~§:љ}SRєMеžъŽшєйЂГŠ>~_`є"”KtА<ЂЋ*лшpЎsŽю\ СЋВJ.>КБЊSgѕыXеЉГњ‰žЫcEпНМЈŠˆОyDaY—:f<бРяБ>K]ёЄ‚Ѓ ЯIёЌrЃK Я 0 then lXs := lXs/lSum; // lSum := 0; lYs := 0; for i := 1 to lYDim do lSum := lSum +lYcom^[i]; for i := 1 to lYDim do lYs := lYs +(i*lYcom^[i]); if lSum > 0 then lYs := lYs/lSum; //Z lSum := 0; lZs := 0; for i := 1 to lZDim do lSum := lSum +lZcom^[i]; for i := 1 to lZDim do lZs := lZs +(i*lZcom^[i]); if lSum > 0 then lZs := lzs/lSum; result := SlicesToImgPos(round(lXs),round(lYs),round(lZs)); //fx(result, lXs,lYs,lZs); end; function XYZstr (lPos: integer): string; var lXmm,lYmm,lZmm: single; begin ImgPosToMM(lPos, lXmm,lYmm,lZmm); result := inttostr(round(lXmm))+kTextSep+inttostr(round(lYmm))+kTextSep+inttostr(round(lZmm)); end; procedure Report (lClusterMax: single; lClusterSz, lClusterMaxPos: integer); var lAALstr,lBAstr : string; begin if lClusterSz < lMinClusterSz then exit; lBAstr := ''; if gMRIcroOverlay[2].ImgBufferItems = lVolSz then //BA map loaded lBAstr := inttostr(gMRIcroOverlay[2].ImgBuffer^[lClusterMaxPos]); if gMRIcroOverlay[3].ImgBufferItems = lVolSz then //AAL map loaded lAALstr := gBGImg.LabelStr20[gMRIcroOverlay[3].ImgBuffer^[lClusterMaxPos]]; TextForm.MemoT.lines.add(XYZstr(lClusterMaxPos)+kTextSep+XYZstr(CenterOfMassPosition)+kTextSep+inttostr(lClusterSz)+kTextSep+lCh+floattostr(lClusterMax)+kTextSep+(lBAStr)+kTextSep+(lAALstr)); end; procedure ReportLabel; begin TextForm.MemoT.lines.add('# Data='+kTextSep+lHdr.HdrFileName +kTextSep+'Threshold='+kTextSep+floattostr(lThreshIn) +kTextSep+'MinCluster='+kTextSep+inttostr(lMinClusterSz)); TextForm.MemoT.lines.add('#X'+kTextSep+'Y'+kTextSep+'Z'+kTextSep+'Xcom'+kTextSep+'Ycom'+kTextSep+'Zcom'+kTextSep+'ClusterSize[Vox]'+kTextSep+'Max'+kTextSep+'BA'+kTextSep+'AAL'); end; Procedure IncQra(var lVal, lQSz: integer); begin inc(lVal); if lVal >= lQSz then lVal := 1; end; procedure Check(lPixel: integer); var lVal: single; begin lVal := lClusterBuffS^[lPixel]; if (lVal= 0) then exit; AddCenterOfMass(lPixel,lVal); if lVal > lClusterMax then begin lClusterMax := lVal; lClusterMaxPos := lPixel; end; incQra(lQHead,lQSz); inc(lClusterSz); lClusterBuffS^[lPixel] := 0; lQra^[lQHead] := lPixel; end; PROCEDURE RetirePixel; //FIFO cleanup , 1410: added 18-voxel check VAR lVal,lValX,lXPos,lYPos,lZPos: integer; BEGIN lVal := lQra^[lQTail]; if lVal = 0 then begin incQra(lQTail,lQSz); //done with this pixel exit; end; lXpos := lVal mod lXdim; if lXpos = 0 then lXPos := lXdim; lYpos := (1+((lVal-1) div lXdim)) mod lYDim; if lYPos = 0 then lYPos := lYdim; lZpos := ((lVal-1) div lSliceSz)+1; if (lXPos <= 1) or (lXPos >= lXDim) or (lYPos <= 1) or (lYPos >= lYDim) or (lZPos <= 1) or (lZPos >= lZDim) then // retire and exiT else begin //lXDimM := lXDim; Check(lVal-1); //left Check(lVal+1); //right Check(lVal-lXDim); //up Check(lVal+lXDim); //down Check(lVal-lSliceSz); //up Check(lVal+lSliceSz); //down //check plane above lValX := lVal + lSLiceSz; Check(lValX-1); //left Check(lValX+1); //right Check(lValX-lXDim); //up Check(lValX+lXDim); //down //check plane below lValX := lVal - lSLiceSz; Check(lValX-1); //left Check(lValX+1); //right Check(lValX-lXDim); //up Check(lValX+lXDim); //down //check diagonals of current plane Check(lVal-lXDim-1); //up, left Check(lVal-lXDim+1); //up, right Check(lVal+lXDim-1); //down, left Check(lVal+lXDim+1); //down, right end; //not edge incQra(lQTail,lQSz); //done with this pixel END; procedure FillStart (lPt: integer); {FIFO algorithm: keep memory VERY low} var lI: integer; begin if (lClusterBuffS^[lPt]=0) then exit; for lI := 1 to lQsz do lQra^[lI] := 0; lQHead := 0; lQTail := 1; Check(lPt); RetirePixel; // check that there was anything in the cluster at all //showmessage('head'+inttostr(lQHead)+'.'+inttostr(lQTail)); //if lQHead > 2 then begin // and do the recursion to get rid of it while ((lQHead+1) <> lQTail) do begin//complete until all voxels in buffer have been tested RetirePixel; if (lQHead = lQSz) and (lQTail = 1) then exit; //break condition: avoids possible infinite loop where QTail is being incremented but QHead is stuck at maximum value end; end; begin lCh := ' '; //assume positive values lXDim := lHdr.NIFTIhdr.dim[1]; lYDim := lHdr.NIFTIhdr.dim[2]; lZDim := lHdr.NIFTIhdr.dim[3]; InitCenterOfMass; lVolSz := lXdim*lYdim*lZdim; lSliceSz := lXdim * lYdim; if (lXDim < 4) or (lYDim < 4) or (lZDim < 4) or (lVolSz < 1) or (lHdr.ImgBufferItems <> lVolSz) then exit; GetMem(lClusterBuffS, lVolSz* sizeof(Single)); ReportLabel; if lHdr.ImgBufferBPP = 4 then begin lBuffIn32 := SingleP(lHdr.ImgBuffer); for lInc := 1 to lVolSz do lClusterBuffS^[lInc] := lBuffIn32^[lInc]; end else if lHdr.ImgBufferBPP = 2 then begin //not 32bit - if 16bit input lBuffIn16 := SmallIntP(lHdr.ImgBuffer); for lInc := 1 to lVolSz do lClusterBuffS^[lInc] := lBuffIn16^[lInc]; end else begin //not 16 or 32 bit input for lInc := 1 to lVolSz do lClusterBuffS^[lInc] := lHdr.ImgBuffer^[lInc]; end; //8-bit input //Next - apply scale and intercept if (lHdr.NIFTIhdr.scl_slope <> 0) and (lHdr.NIFTIhdr.scl_slope <> 1) then //if one then no effect - zero is meaningless for lInc := 1 to lVolSz do lClusterBuffS^[lInc] := lClusterBuffS^[lInc]*lHdr.NIFTIhdr.scl_slope; if (lHdr.NIFTIhdr.scl_inter <> 0) then //if zero then no effect for lInc := 1 to lVolSz do lClusterBuffS^[lInc] := lClusterBuffS^[lInc]+lHdr.NIFTIhdr.scl_inter; lThresh := lThreshIn; if lThreshIn < 0 then begin //invert all values... for lInc := 1 to lVolSz do lClusterBuffS^[lInc] := -lClusterBuffS^[lInc]; lThresh := -lThresh; lCh := '-'; end; //Next - zero all voxels less than threshold for lInc := 1 to lVolSz do if (lClusterBuffS^[lInc]) < lThresh then lClusterBuffS^[lInc] := 0; //Next - get memory lQSz := (lVolSz div 4)+8; GetMem(lQra,lQsz * sizeof(longint) ); //check positive clusters.... ClearCenterOfMass; for lInc := 1 to lVolSz do begin if lClusterBuffS^[lInc] <> 0 then begin lClusterSz := 0; lClusterMax := 0; FillStart(lInc); // now fill the cluster with its size (=1 if the voxel was isolated) Report (lClusterMax,lClusterSz,lClusterMaxPos); ClearCenterOfMass; end; end; FreeCenterOfMass; Freemem(lQra); Freemem(lClusterBuffS); end; procedure BatchCluster; var lInc,lNumberofFiles,lMinClusterSz: integer; lFilename,lBAname,lAALname:string; lPref: boolean; lThresh: single; begin for lInc := 1 to (knMaxOverlay-1) do FreeImgMemory(gMRIcroOverlay[lInc]); ImgForm.UpdateLayerMenu; lMinClusterSz := ReadIntForm.GetInt('Minimum cluster size [in voxels]: ', 1,4,9999); lThresh := ReadFloatForm.GetFloat('Please enter statistical threshold. ', -9999,2.3,9999); if not OpenDialogExecute(kImgFilter,'Select statistical maps',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; if lNumberofFiles < 1 then exit; lAALname := gTemplateDir+pathdelim+'aal.nii.gz'; if not fileexists(lAALname) then lAALName := ''; lBAname := gTemplateDir+pathdelim+'brodmann.nii.gz'; if not fileexists(lBAname) then lBAName := ''; TextForm.MemoT.Lines.Clear; lPref := gBGImg.ResliceOnLoad; gBGImg.ResliceOnLoad := false; for lInc:= 1 to lNumberofFiles do begin lFilename := HdrForm.OpenHdrDlg.Files[lInc-1]; ImgForm.OpenAndDisplayImg(lFilename,false); if lBAName <> '' then ImgForm.OverlayOpenCore ( lBAname, 2); if lAALName <> '' then ImgForm.OverlayOpenCore ( lAALname, 3); FindClustersText(gMRIcroOverlay[kBGOverlayNum], lThresh,lMinClusterSz); end;//lLoop gBGImg.ResliceOnLoad := lPref; TextForm.Show; end; end. mricron-0.20120505.1~dfsg.1.orig/stat.pas0000664000175000017500000003347211326434470017345 0ustar michaelmichaelUnit stat; interface uses Dialogs,define_types; const ITMAX = 300; EPS = 3.0e-7; kMaxFact = 1700; {<= 1754} gFactRAready : boolean = false; type FactRA = array[0..kMaxFact] of extended; var gFactRA : FactRA; FUNCTION betai(a,b,x: double): double; procedure AlertMsg (pWarningStr: String); function gammq( a,x: real): real; procedure Chi2x2 (A, B, C, D: integer; var pMinExp, pChi, p, puChi, pup: double); function Liebermeister (A,B,C,D: integer): extended; procedure EstimateFDR(lnTests: integer; Ps: SingleP; var lFDR05, lFDR01: double); procedure EstimateFDR2(lnTests: integer; var Ps: SingleP; var lFDR05, lFDR01,lnegFDR05, lnegFDR01: double); function Fisher1TailMidP (A,B,C,D: integer): double; { use instead of chi2x2: returns p-value} procedure InitFact; implementation procedure InitFact; var lX: word; begin gFactRA[0]:= 1; gFactRA[1] := 1; for lx := 2 to kMaxFact do gFactRA[lx] := lx * gFactRA[lx-1]; gFactRAready := true; end; function FisherX (A,B,C,D: integer): double; {FisherExactTest, use instead of chi} {FisherX computes odds for this specific config only, not more extreme cases} {alternate to Chi Square, see Siegel & Castellan, Nonparametric Statistics} {use instead of Chi when n <= 20} {A= X hits, B= control hits, C = X misses, D = control misses} var N: word; begin N := A+B+C+D; if (N <= kMaxFact) and (A>=0) and (B>=0) and (C>=0) and (D>=0) and (N > 0) then begin FisherX := ( (gFactRA[A+B]/gFactRA[A])* (gFactRA[B+D]/gFactRA[B])* (gFactRA[A+C]/gFactRA[C])* (gFactRA[C+D]/gFactRA[D]) )/ gFactRA[N]; end else FisherX := 0; end; function MidPKingFisher (lSmal,lCross1,lCross2,lSmalDiag: integer): extended; var lProb1, lProb2: extended; lA,lB,lC,lD,lCnt: integer; l1st : boolean; begin lA :=lSmal; lB:=lCross1; lC:=lCross2; lD:=lSmalDiag; lProb1:=0; l1st := true; //set to true for midP for lCnt := lA downto 0 do begin if l1st then lProb1 := 0.5* FisherX(lA,lB,lC,lD) else lProb1 := lProb1 + FisherX(lA,lB,lC,lD); l1st := false; dec(lA); dec(lD); inc(lB); inc(lC); end; lA :=lSmal; lB:=lCross1; lC:=lCross2; lD:=lSmalDiag; lProb2:=0; l1st := true; //alfa -set to true for MidP while (lB >= 0) and (lC >= 0) do begin if l1st then lProb2 := 0.5* FisherX(lA,lB,lC,lD) else lProb2 := lProb2 + FisherX(lA,lB,lC,lD); l1st := false; inc(lA); inc(lD); dec(lB); dec(lC); end; if lProb1 < lProb2 then result := lProb1 else result := lProb2; //result := lprob1; end; function Lieber (lSmal,lCross1,lCross2,lSmalDiag: integer): extended; var lA,lB,lC,lD,lCnt: integer; begin lA :=lSmal; lB:=lCross1+1; lC:=lCross2+1; lD:=lSmalDiag; result :=0; for lCnt := lA downto 0 do begin result := result + FisherX(lA,lB,lC,lD); dec(lA); dec(lD); inc(lB); inc(lC); end; //TabbedNotebookDlg.caption := realtostr(result,6) ; //TabbedNotebookDlg.caption := realtostr(result,6) ; if result <= 0.5 then exit; lA :=lSmal+1; lB:=lCross1; lC:=lCross2; lD:=lSmalDiag+1; result:=0; while (lB >= 0) and (lC >= 0) do begin result := result + FisherX(lA,lB,lC,lD); inc(lA); inc(lD); dec(lB); dec(lC); end; end; function Liebermeister (A,B,C,D: integer): extended; {A= X hits, B= control hits, C = X misses, D = control misses} begin result := 1; if (A+B+C+D)<1 then exit; if not gFactRAready then InitFact; if (A<=B) and (A<=C) and (A<=D) then {lA smallest} result :=Lieber(A,B,C,D) else if (B<=C) and (B<=D) then {lB smallest} result :=Lieber(B,A,D,C) else if (C<=D) then {lC smallest} result :=Lieber(C,D,A,B) else {d smallest} result :=Lieber(D,C,B,A); if ((A+C)>0) and ((B+D)>0) then begin if (A/(A+C)) < (B/(B+D)) then result := -result; end; end; (*function Liebermeister (Ain,Bin,Cin,Din: integer): extended; var A,B,C,D: integer; {A= X hits, B= control hits, C = X misses, D = control misses} begin A := Ain; B := Bin; C := Cin; D := Din; if (A+B+C+D)<1 then begin result := 1; exit; end; //easy way to calculate Lieberman - make more extreme, then calculate Fisher if abs(A-D) > abs(B-C) then begin inc(A); inc(D); end else begin inc(B); inc(C); end; if not gFactRAready then InitFact; if (A<=B) and (A<=C) and (A<=D) then {lA smallest} result :=KingFisher(A,B,C,D) else if (B<=C) and (B<=D) then {lB smallest} result :=KingFisher(B,A,D,C) else if (C<=D) then {lC smallest} result :=KingFisher(C,D,A,B) else {d smallest} result :=KingFisher(D,C,B,A); if ((A+C)>0) and ((B+D)>0) then begin if (A/(A+C)) < (B/(B+D)) then result := -result; end; end;*) function Fisher1TailMidP (A,B,C,D: integer): double; {A= X hits, B= control hits, C = X misses, D = control misses} begin if (A+B+C+D)<1 then begin result := 1; exit end; if not gFactRAready then InitFact; if (A<=B) and (A<=C) and (A<=D) then {lA smallest} result :=MidPKingFisher(A,B,C,D) else if (B<=C) and (B<=D) then {lB smallest} result :=MidPKingFisher(B,A,D,C) else if (C<=D) then {lC smallest} result :=MidPKingFisher(C,D,A,B) else {d smallest} result :=MidPKingFisher(D,C,B,A); if ((A+C)>0) and ((B+D)>0) then begin if (A/(A+C)) < (B/(B+D)) then result := -result; end; end; (*procedure Sort (first, last: integer; var DynDataRA:SingleP); {Shell sort chuck uses this- see 'Numerical Recipes in C' for similar sorts.} {less memory intensive than recursive quicksort} label 555; const tiny = 1.0e-5; aln2i = 1.442695022; var n, nn, m, lognb2, l, k, j, i: INTEGER; swap: Single; begin n := abs(last - first + 1); lognb2 := trunc(ln(n) * aln2i + tiny); m := last; for nn := 1 to lognb2 do begin m := m div 2; k := last - m; for j := 1 to k do begin i := j; 555: {<- LABEL} l := i + m; if (DynDataRA^[l] < DynDataRA^[i]) then begin swap := DynDataRA^[i]; DynDataRA^[i] := DynDataRA^[l]; DynDataRA^[l] := swap; i := i - m; if (i >= 1) then goto 555; end end end end;//sort *) procedure qsort(lower, upper : integer; var Data:SingleP); //40ms - very recursive... var left, right : integer; pivot,lswap: single; begin pivot:=Data^[(lower+upper) div 2]; left:=lower; right:=upper; while left<=right do begin while Data^[left] < pivot do left:=left+1; { Parting for left } while Data^[right] > pivot do right:=right-1;{ Parting for right} if left<=right then begin { Validate the change } lswap := Data^[left]; Data^[left] := Data^[right]; Data^[right] := lswap; left:=left+1; right:=right-1; end; //validate end;//while left <=right if right>lower then qsort(lower,right,Data); { Sort the LEFT part } if upper>left then qsort(left ,upper,data); { Sort the RIGHT part } end; procedure EstimateFDR2(lnTests: integer; var Ps: SingleP; var lFDR05, lFDR01,lnegFDR05, lnegFDR01: double); var lInc: integer; lrPs,Qs: SingleP; begin //rank Pvalues //ShaQuickSort(lnTests,Singlep0(Ps[1])); qSort(1,lnTests,Ps); //qSort(1,lnTests,Ps); GetMem(Qs,lnTests*sizeof(single)); //next findcrit FDR05 for lInc := 1 to lnTests do Qs^[lInc] := (0.05*lInc)/lnTests; lFDR05 := 0; for lInc := 1 to lnTests do if Ps^[lInc] <= Qs^[lInc] then lFDR05 := Ps^[lInc]; //next findcrit FDR01 for lInc := 1 to lnTests do Qs^[lInc] := (0.01*lInc)/lnTests; lFDR01 := 0; for lInc := 1 to lnTests do if Ps^[lInc] <= Qs^[lInc] then lFDR01 := Ps^[lInc]; //reverse GetMem(lrPs,lnTests*sizeof(single)); for lInc := 1 to lnTests do lrPs^[lInc] := 1- Ps^[lnTests-lInc+1]; for lInc := 1 to lnTests do Qs^[lInc] := (0.05*lInc)/lnTests; lnegFDR05 := 0; for lInc := 1 to lnTests do if lrPs^[lInc] <= Qs^[lInc] then lnegFDR05 := lrPs^[lInc]; //next findcrit FDR01 for lInc := 1 to lnTests do Qs^[lInc] := (0.01*lInc)/lnTests; lnegFDR01 := 0; for lInc := 1 to lnTests do if lrPs^[lInc] <= Qs^[lInc] then lnegFDR01 := lrPs^[lInc]; FreeMem(lrPs); Freemem(Qs); end; procedure EstimateFDR(lnTests: integer; Ps: SingleP; var lFDR05, lFDR01: double); var lInc: integer; Qs: SingleP; begin //rank Pvalues qSort(1,lnTests,Ps); {lStr := 'sort='; for lInc := 1 to knTests do lStr := lStr+realtostr(Ps[lInc],4)+','; Memo1.Lines.Add(lStr); } GetMem(Qs,lnTests*sizeof(single)); //next findcrit FDR05 for lInc := 1 to lnTests do Qs^[lInc] := (0.05*lInc)/lnTests; lFDR05 := 0; for lInc := 1 to lnTests do if Ps^[lInc] <= Qs^[lInc] then lFDR05 := Ps^[lInc]; //next findcrit FDR01 for lInc := 1 to lnTests do Qs^[lInc] := (0.01*lInc)/lnTests; lFDR01 := 0; for lInc := 1 to lnTests do if Ps^[lInc] <= Qs^[lInc] then lFDR01 := Ps^[lInc]; Freemem(Qs); end; procedure AlertMsg (pWarningStr: String); begin MessageDLG(pWarningStr, mtWarning,[mbOK],0); end; function gammln (xx: double): double; {Numerical Recipes for Pascal, p 177} const stp = 2.50662827465; var x, tmp, ser: double; begin x := xx - 1.0; tmp := x + 5.5; tmp := (x + 0.5) * ln(tmp) - tmp; ser := 1.0 + 76.18009173 / (x + 1.0) - 86.50532033 / (x + 2.0) + 24.01409822 / (x + 3.0) - 1.231739516 / (x + 4.0) + 0.120858003e-2 / (x + 5.0) - 0.536382e-5 / (x + 6.0); gammln := tmp + ln(stp * ser) end; {procedure gammln} FUNCTION betacf(a,b,x: double): double; LABEL 1; CONST itmax=100; eps=3.0e-7; VAR tem,qap,qam,qab,em,d: double; bz,bpp,bp,bm,az,app: double; am,aold,ap: double; m: integer; BEGIN am := 1.0; bm := 1.0; az := 1.0; qab := a+b; qap := a+1.0; qam := a-1.0; bz := 1.0-qab*x/qap; FOR m := 1 TO itmax DO BEGIN em := m; tem := em+em; d := em*(b-m)*x/((qam+tem)*(a+tem)); ap := az+d*am; bp := bz+d*bm; d := -(a+em)*(qab+em)*x/((a+tem)*(qap+tem)); app := ap+d*az; bpp := bp+d*bz; aold := az; am := ap/bpp; bm := bp/bpp; az := app/bpp; bz := 1.0; IF ((abs(az-aold)) < (eps*abs(az))) THEN GOTO 1 END; writeln('pause in BETACF'); writeln('a or b too big, or itmax too small'); readln; 1: betacf := az END; FUNCTION betai(a,b,x: double): double; VAR bt: double; BEGIN IF ((x < 0.0) OR (x > 1.0)) THEN BEGIN writeln('pause in routine BETAI'); readln END; IF ((x = 0.0) OR (x = 1.0)) THEN bt := 0.0 ELSE bt := exp(gammln(a+b)-gammln(a)-gammln(b) +a*ln(x)+b*ln(1.0-x)); IF (x < ((a+1.0)/(a+b+2.0))) THEN betai := bt*betacf(a,b,x)/a ELSE betai := 1.0-bt*betacf(b,a,1.0-x)/b END; procedure gser(var gamser, a,x, gln: real); var n: integer; sum, del, ap: real; begin gln := gammln(a); if x <= 0.0 then begin if x < 0.0 then AlertMsg('x less then 0 in routine GSER'); gamser:= 0.0; end else begin ap := a; sum := 1.0/a; del := sum; for n := 1 to ITMAX do begin ap := ap + 1; del := del * (x/ap); sum := sum + del; if (abs(del) < abs((sum)*EPS) )then begin gamser := sum * exp(-x+a*ln(x)-gln); exit; end; end; Alertmsg('GSER error: ITMAX too small for requested a-value'); end; end; procedure gcf(var gammcf: real; a,x, gln: real); var n: integer; gold,fac,b1,b0,a0,g,ana,anf,an,a1: real; begin fac := 1.0; b1 := 1.0; b0 := 0.0; a0 := 1.0; gold := 0.0; gln := gammln(a); a1 := x; for n := 1 to ITMAX do begin an :=(n); ana := an - a; a0 := (a1 + a0*ana)*fac; b0 := (b1 + b0*ana)*fac; anf := an * fac; a1 := x*a0+anf*a1; b1 := x*b0+anf*b1; if a1 <> 0 then begin fac := 1.0/a1; g := b1*fac; if (abs((g-gold)/g) 0 then begin {avoid divide by 0} pMinExp := ((lA + lB) * (lA + lC)) / lN; if (((lA + lB) * (lB + lD)) / lN) < pMinExp then pMinExp := ((lA + lB) * (lB + lD)) / lN; if (((lC + lD) * (lA + lC)) / lN) < pMinExp then pMinExp := ((lC + lD) * (lA + lC)) / lN; if (((lC + lD) * (lB + lD)) / lN) < pMinExp then pMinExp := ((lC + lD) * (lB + lD)) / lN; end else pMinExp := 0; lSameOdds := false; if (lC > 0) and (lD > 0) then begin if (lA / lC) = (lB / lD) then lSameOdds := true; end; if (lC = 0) and (lD = 0) then lSameOdds := true; if ((lA+lC) = 0) or ((lB+lD) = 0) then lSameOdds := true; if (lSameOdds = true) then begin pChi := 0; {same odds} p := 1.0; puChi := 0; pup := 1.0; end else begin puChi := ((sqr((lA * lD) - (lB * lC))) * lN) / ((la + lb) * (lc + ld) * (lb + ld) * (la + lc)); pup := gammq(0.5, 0.5 * puChi); {half df} pChi := ((sqr(abs((lA * lD) - (lB * lC)) - (0.5 * lN))) * lN) / ((la + lb) * (lc + ld) * (lb + ld) * (la + lc)); p := gammq(0.5, 0.5 * pChi); end; end; end. mricron-0.20120505.1~dfsg.1.orig/ROIfilt.pas0000664000175000017500000001351711450366620017677 0ustar michaelmichaelunit ROIfilt; interface uses {$IFNDEF FPC} RXSpin, {$ELSE} Spin,LResources, {$ENDIF} {$IFNDEF Unix} Windows,{$ENDIF} Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons,define_types, nifti_hdr; type TFilterROIform = class(TForm) Label42: TLabel; FilterROIBtn: TSpeedButton; Label43: TLabel; Filter2NIfTIBtn: TSpeedButton; FiltROILabel: TLabel; MinROIfilt: TSpinEdit; MaxROIfilt: TSpinEdit; procedure MinROIfiltChange(Sender: TObject); procedure FilterROIBtnClick(Sender: TObject); {$IFNDEF FPC} procedure FormClose(Sender: TObject; var Action: TCloseAction); {$ELSE} procedure FormClose(Sender: TObject); {$ENDIF} procedure FormShow(Sender: TObject); procedure Filter2NIfTIBtnClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FilterROIform: TFilterROIform; implementation uses nifti_img_view,nifti_img; {$IFNDEF FPC} {$R *.DFM} {$ENDIF} procedure TFilterROIform.MinROIfiltChange(Sender: TObject); begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1 then exit; FilterLUT (gBGImg, gMRIcroOverlay[kBGOverlayNum], round(MinROIFilt.Value),round(MaxROIfilt.value)); //lLUT: 0=gray,1=red,2=green,3=blue FiltROILabel.caption := 'Calibrated range: '+realtostr(Scrn2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],MinROIfilt.value),3) +'...'+realtostr(Scrn2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],MaxROIfilt.value),3); ImgForm.RefreshImagesTimer.enabled := true; end; procedure TFilterROIform.FilterROIBtnClick(Sender: TObject); var lBGBuffer,lVOIBuffer:ByteP; lInc,lMin,lMax,lBufferItems,lVOIvoxelsAfter,lVOIvoxelsBefore: integer; begin lBufferItems := gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems; if lBufferItems < 1 then begin showmessage('You need to open up a VOI (Draw/Open) in order to apply an intensity filter to the VOI.'); exit; end; if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems <> lBufferItems then begin showmessage('Error: VOI dimensions do not match background image.'); exit; end; CreateUndoVol; (*case MessageDlg('Unable to undo this operation. You should save a backup copy prior to this (Draw/Save). Are you sure you wish to filter your VOI?', mtConfirmation, [mbYes, mbCancel], 0) of id_Cancel: exit; end; //case *) lMin := round(MinROIFilt.value); lMax := round(MaxROIFilt.value); if lMin > lMax then begin //swap lInc := lMin; lMin := lMax; lMax := lInc; end; //swap if lBufferItems < 1 then showmessage('Error: no background image open to filter.') else begin lBGBuffer := gMRIcroOverlay[kBGOverlayNum].ScrnBuffer; lVOIBuffer := gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer; lVOIvoxelsBefore := 0; for lInc := 1 to lBufferItems do if (lVOIBuffer^[lInc] > 0) then inc(lVOIvoxelsBefore); for lInc := 1 to lBufferItems do if (lBGBuffer^[lInc] < lMin) or (lBGBuffer^[lInc] > lMax) then lVOIBuffer^[lInc] := 0; lVOIvoxelsAfter := 0; for lInc := 1 to lBufferItems do if (lVOIBuffer^[lInc] > 0) then inc(lVOIvoxelsAfter); showmessage('VOI voxels prior to filter = '+inttostr(lVOIvoxelsBefore)+kCR + 'VOI voxels after filter = '+inttostr(lVOIvoxelsAfter)); gBGImg.VOIchanged := true; //Save8BitAsVOIorNIFTI(lFilteredBuffer,lBufferItems); end; //BGimage open FilterROIForm.Close; //nn end; {$IFNDEF FPC} procedure TFilterROIform.FormClose(Sender: TObject; var Action: TCloseAction); {$ELSE} procedure TFilterROIform.FormClose(Sender: TObject); {$ENDIF} begin FilterLUT (gBGImg, gMRIcroOverlay[kBGOverlayNum], -1,-1); //lLUT: 0=gray,1=red,2=green,3=blue ImgForm.RefreshImagesTimer.enabled := true; end; procedure TFilterROIform.FormShow(Sender: TObject); var lInc: integer; begin for lInc := 0 to 255 do gBGImg.BackupLUT[lInc]:= gMRIcroOverlay[kBGOverlayNum].LUT[lInc]; MinROIfiltChange(nil); end; procedure MirrorBuffer(var lBuffer8:ByteP; lX,lXYZ: integer ); var lnRow,lRow,lHlfX,lLineOffset,lXPos,lTemp: integer; begin if (lXYZ < 2) or (lX > lXYZ) or ((lXYZ mod lX) <> 0) then exit; lnRow := lXYZ div lX; lHlfX := lX div 2; lLineOffset := 0; for lRow := 1 to lnRow do begin for lXPos := 1 to lHlfX do begin lTemp := lBuffer8^[lXPos+lLineOffset]; lBuffer8^[lXPos+lLineOffset] := lBuffer8^[1+lX-lXPos+lLineOffset]; lBuffer8^[1+lX-lXPos+lLineOffset] := lTemp; end; //for X lLineOffset := lLineOffset + lX; end;//for each row... end; //MirrorBuffer procedure TFilterROIform.Filter2NIfTIBtnClick(Sender: TObject); var lFilteredBuffer:ByteP; lInc,lMin,lMax,lBufferItems: integer; lNiftiHdr : TNIFTIhdr; begin lBufferItems := gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems; lMin := round(MinROIFilt.value); lMax := round(MaxROIFilt.value); if lMin > lMax then begin //swap lInc := lMin; lMin := lMax; lMax := lInc; end; //swap if lBufferItems < 1 then showmessage('Error: no background image open to filter.') else begin getmem(lFilteredBuffer,lBufferItems); move(gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^,lFilteredBuffer^,lBufferItems); for lInc := 1 to lBufferItems do if (lFilteredBuffer^[lInc] < lMin) or (lFilteredBuffer^[lInc] > lMax) then lFilteredBuffer^[lInc] := 0; lNiftiHdr := gMRIcroOverlay[kBGOverlayNum].NiftiHdr; if gBGImg.Mirror then MirrorBuffer(lFilteredBuffer,gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.Dim[1], lBufferItems); //10/2010 SaveAsVOIorNIFTI(lFilteredBuffer,lBufferItems,1,1,true,{gMRIcroOverlay[kBGOverlayNum].}lNiftiHdr,''); //SaveAsVOIorNIFTI(lFilteredBuffer,lBufferItems,1,true,gMRIcroOverlay[kBGOverlayNum].NiftiHdr,''); freemem(lFilteredBuffer); end; FilterROIForm.Close; end; {$IFDEF FPC} initialization {$I ROIfilt.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/ROIfilt.lrs0000664000175000017500000000417211450366620017711 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TFilterROIform','FORMDATA',[ 'TPF0'#14'TFilterROIform'#13'FilterROIform'#4'Left'#3'9'#2#6'Height'#3#190#0#3 +'Top'#2'k'#5'Width'#3#240#0#18'HorzScrollBar.Page'#3#209#0#18'VertScrollBar.' +'Page'#3#196#0#13'ActiveControl'#7#10'MinROIfilt'#11'BorderIcons'#11#12'biSy' +'stemMenu'#0#11'BorderStyle'#7#12'bsToolWindow'#7'Caption'#6#16'Intensity fi' +'lter'#12'ClientHeight'#3#190#0#11'ClientWidth'#3#240#0#21'Constraints.MaxHe' +'ight'#3#190#0#20'Constraints.MaxWidth'#3#240#0#21'Constraints.MinHeight'#3 +#190#0#9'Font.Name'#6#13'MS Sans Serif'#7'OnClose'#7#9'FormClose'#6'OnShow'#7 +#8'FormShow'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29'#0#6 +'TLabel'#7'Label42'#4'Left'#2#4#6'Height'#2#17#3'Top'#2#14#5'Width'#2'Y'#7'C' +'aption'#6#14'Min. Threshold'#11'ParentColor'#8#0#0#12'TSpeedButton'#12'Filt' +'erROIBtn'#4'Left'#2#4#6'Height'#2#25#3'Top'#3#143#0#5'Width'#3#221#0#7'Capt' +'ion'#6#27'Filter VOI with highlighted'#5'Color'#7#9'clBtnFace'#9'NumGlyphs' +#2#0#7'OnClick'#7#17'FilterROIBtnClick'#8'ShowHint'#9#14'ParentShowHint'#8#0 +#0#6'TLabel'#7'Label43'#4'Left'#2#4#6'Height'#2#14#3'Top'#2'1'#5'Width'#2'K' +#7'Caption'#6#14'Max. Threshold'#12'Font.CharSet'#2#13#11'ParentColor'#8#10 +'ParentFont'#8#0#0#12'TSpeedButton'#15'Filter2NIfTIBtn'#3'Tag'#3#128#0#4'Lef' +'t'#2#4#6'Height'#2#25#3'Top'#2'k'#5'Width'#3#221#0#7'Caption'#6' Save highl' +'ighted as NIfTI or VOI'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClick' +#7#20'Filter2NIfTIBtnClick'#8'ShowHint'#9#14'ParentShowHint'#8#0#0#6'TLabel' +#12'FiltROILabel'#4'Left'#2#8#6'Height'#2#17#3'Top'#2'Q'#5'Width'#2#22#7'Cap' +'tion'#6#7' '#11'ParentColor'#8#0#0#9'TSpinEdit'#10'MinROIfilt'#4'Left' +#2'x'#6'Height'#2#24#3'Top'#2#7#5'Width'#2'4'#8'MaxValue'#3#254#0#8'OnChange' +#7#16'MinROIfiltChange'#8'TabOrder'#2#0#5'Value'#2'd'#0#0#9'TSpinEdit'#10'Ma' +'xROIfilt'#4'Left'#2'x'#6'Height'#2#24#3'Top'#2'*'#5'Width'#2'4'#8'MaxValue' +#3#255#0#8'OnChange'#7#16'MinROIfiltChange'#8'TabOrder'#2#1#5'Value'#3#255#0 +#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/ROIfilt.lfm0000664000175000017500000000372011450366620017665 0ustar michaelmichaelobject FilterROIform: TFilterROIform Left = 569 Height = 190 Top = 107 Width = 240 HorzScrollBar.Page = 209 VertScrollBar.Page = 196 ActiveControl = MinROIfilt BorderIcons = [biSystemMenu] BorderStyle = bsToolWindow Caption = 'Intensity filter' ClientHeight = 190 ClientWidth = 240 Constraints.MaxHeight = 190 Constraints.MaxWidth = 240 Constraints.MinHeight = 190 Font.Name = 'MS Sans Serif' OnClose = FormClose OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object Label42: TLabel Left = 4 Height = 17 Top = 14 Width = 89 Caption = 'Min. Threshold' ParentColor = False end object FilterROIBtn: TSpeedButton Left = 4 Height = 25 Top = 143 Width = 221 Caption = 'Filter VOI with highlighted' Color = clBtnFace NumGlyphs = 0 OnClick = FilterROIBtnClick ShowHint = True ParentShowHint = False end object Label43: TLabel Left = 4 Height = 14 Top = 49 Width = 75 Caption = 'Max. Threshold' Font.CharSet = 13 ParentColor = False ParentFont = False end object Filter2NIfTIBtn: TSpeedButton Tag = 128 Left = 4 Height = 25 Top = 107 Width = 221 Caption = 'Save highlighted as NIfTI or VOI' Color = clBtnFace NumGlyphs = 0 OnClick = Filter2NIfTIBtnClick ShowHint = True ParentShowHint = False end object FiltROILabel: TLabel Left = 8 Height = 17 Top = 81 Width = 22 Caption = ' ' ParentColor = False end object MinROIfilt: TSpinEdit Left = 120 Height = 24 Top = 7 Width = 52 MaxValue = 254 OnChange = MinROIfiltChange TabOrder = 0 Value = 100 end object MaxROIfilt: TSpinEdit Left = 120 Height = 24 Top = 42 Width = 52 MaxValue = 255 OnChange = MinROIfiltChange TabOrder = 1 Value = 255 end end mricron-0.20120505.1~dfsg.1.orig/rgb/0000775000175000017500000000000011754254530016430 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/rgb/rgbwinroutines.pas0000664000175000017500000001007011326434470022212 0ustar michaelmichael{ /*************************************************************************** RGBWinRoutines.pas ***************************************************************************/ ***************************************************************************** * * * See the file COPYING.modifiedLGPL, included in this distribution, * * for details about the copyright. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * * ***************************************************************************** Author: Tom Gregorovic (_tom_@centrum.cz) Abstract: This unit contains routines for win32 interface. } unit RGBWinRoutines; {$ifdef fpc} {$mode objfpc}{$H+} {$endif} interface uses SysUtils, Windows, Classes, RGBTypes; procedure WidgetSetDrawRGB32Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); procedure WidgetSetStretchDrawRGB32Bitmap(Dest: HDC; DstX, DstY, DstWidth, DstHeight: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); procedure WidgetSetDrawRGB8Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB8BitmapCore); implementation procedure WidgetSetDrawRGB32Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); var Info: BITMAPINFO; begin with Info.bmiHeader do begin biSize := SizeOf(BITMAPINFOHEADER); biWidth := Bitmap.Width; biHeight := Bitmap.Height; biPlanes := 1; biBitCount := 32; biCompression := BI_RGB; biSizeImage := 0; biClrImportant := 0; end; SetStretchBltMode(Dest, COLORONCOLOR); StretchDIBits(Dest, DstX, Pred(DstY + SrcHeight), SrcWidth, -SrcHeight, SrcX, SrcY, SrcWidth, SrcHeight, Bitmap.Pixels, Info, DIB_RGB_COLORS, SRCCOPY); end; procedure WidgetSetStretchDrawRGB32Bitmap(Dest: HDC; DstX, DstY, DstWidth, DstHeight: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); var Info: BITMAPINFO; begin with Info.bmiHeader do begin biSize := SizeOf(BITMAPINFOHEADER); biWidth := Bitmap.Width; biHeight := Bitmap.Height; biPlanes := 1; biBitCount := 32; biCompression := BI_RGB; biSizeImage := 0; biClrImportant := 0; end; SetStretchBltMode(Dest, COLORONCOLOR); StretchDIBits(Dest, DstX, Pred(DstY + DstHeight), DstWidth, -DstHeight, SrcX, SrcY, SrcWidth, SrcHeight, Bitmap.Pixels, Info, DIB_RGB_COLORS, SRCCOPY); end; procedure WidgetSetDrawRGB8Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB8BitmapCore); var Info: PBITMAPINFO; I: Byte; PColor: PRGBQUAD; begin GetMem(Info, SizeOf(BITMAPINFO) + 256 * SizeOf(RGBQUAD)); try with Info^.bmiHeader do begin biSize := SizeOf(BITMAPINFOHEADER); biWidth := Bitmap.Width; biHeight := Bitmap.Height; biPlanes := 1; biBitCount := 8; biCompression := BI_RGB; biSizeImage := 0; biClrUsed := 256; biClrImportant := 0; end; PColor := @(Info^.bmiColors[0]); for I := 0 to 255 do begin PColor^.rgbRed := I; PColor^.rgbGreen := I; PColor^.rgbBlue := I; Inc(PColor); end; SetStretchBltMode(Dest, COLORONCOLOR); StretchDIBits(Dest, DstX, Pred(DstY + SrcHeight), SrcWidth, -SrcHeight, SrcX, SrcY, SrcWidth, SrcHeight, Bitmap.Pixels, Info^, DIB_RGB_COLORS, SRCCOPY); finally FreeMem(Info); end; end; end. mricron-0.20120505.1~dfsg.1.orig/rgb/rgbutils.pas0000664000175000017500000000765611326434470021004 0ustar michaelmichael{ /*************************************************************************** RGBUtils.pas ***************************************************************************/ ***************************************************************************** * * * See the file COPYING.modifiedLGPL, included in this distribution, * * for details about the copyright. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * * ***************************************************************************** Author: Tom Gregorovic (_tom_@centrum.cz) Abstract: } unit RGBUtils; {$ifdef fpc} {$mode objfpc}{$H+} {$endif} interface uses Classes, SysUtils; type TIntArray = array of Integer; function DivideTrunc(Src, Dest: Integer): TIntArray; function GetMidPoints(const A: TIntArray): TIntArray; function GetDifference(const A: TIntArray): TIntArray; procedure SwapInt(var A, B: Integer); procedure SwapPtr(var A, B: Pointer); procedure MinMax(var A, B: Integer); procedure SortRect(var X1, Y1, X2, Y2: Integer); overload; procedure SortRect(var R: TRect); overload; procedure ClipDimension(ClipMin, ClipMax: Integer; var DstPos, SrcPos, SrcSize: Integer); operator =(A, B: TPoint): Boolean; implementation (* DivideTrunc divides bigger value of Src and Dest into array of chunks. Length(Result) = Min(Src, Dest) *) function DivideTrunc(Src, Dest: Integer): TIntArray; var I: Integer; VMax, VMin: Integer; P, D: Single; begin if Dest > Src then begin VMax := Dest; VMin := Src; end else begin VMax := Src; VMin := Dest; end; SetLength(Result, VMin); P := 0; D := VMax / VMin; for I := 0 to High(Result) do begin Result[I] := Round(P + D) - Round(P); P := P + D; end; end; (* GetMidPoints returns array of absolute positions of the middle in each chunk. *) function GetMidPoints(const A: TIntArray): TIntArray; var I, P, V: Integer; begin SetLength(Result, Length(A)); P := 0; for I := 0 to High(A) do begin V := A[I]; Result[I] := V shr 1 + P; Inc(P, V); end; end; (* GetDifference returns array of diffences between positions. *) function GetDifference(const A: TIntArray): TIntArray; var I, P: Integer; begin SetLength(Result, Length(A)); P := 0; for I := 0 to High(A) do begin Result[I] := A[I] - P; P := A[I]; end; end; operator =(A, B: TPoint): Boolean; begin Result := (A.X = B.X) and (A.Y = B.Y); end; procedure SwapInt(var A, B: Integer); var C: Integer; begin C := A; A := B; B := C; end; procedure SwapPtr(var A, B: Pointer); var C: Pointer; begin C := A; A := B; B := C; end; procedure MinMax(var A, B: Integer); var T: Integer; begin if A > B then begin T := A; A := B; B := T; end; end; procedure SortRect(var X1, Y1, X2, Y2: Integer); begin MinMax(X1, X2); MinMax(Y1, Y2); end; procedure SortRect(var R: TRect); begin MinMax(R.Left, R.Right); MinMax(R.Top, R.Bottom); end; procedure ClipDimension(ClipMin, ClipMax: Integer; var DstPos, SrcPos, SrcSize: Integer); var C: Integer; begin if ClipMin > DstPos then begin C := ClipMin - DstPos; Inc(SrcPos, C); Dec(SrcSize, C); DstPos := ClipMin; end; if ClipMax < DstPos + SrcSize then SrcSize := ClipMax - DstPos; end; end. mricron-0.20120505.1~dfsg.1.orig/rgb/rgbtypes.pas0000664000175000017500000005672011326434470021004 0ustar michaelmichael{ /*************************************************************************** RGBTypes.pas ***************************************************************************/ ***************************************************************************** * * * See the file COPYING.modifiedLGPL, included in this distribution, * * for details about the copyright. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * * ***************************************************************************** Author: Tom Gregorovic (_tom_@centrum.cz) Abstract: TRGB32Pixel - TRGB32Bitmap picture element, contains red, green and blue component and is platform dependent! TRGBBitmapCore - universal RGB bitmap core. TRGB32BitmapCore - 32-bit core of TRGB32Bitmap. } unit RGBTypes; {$ifdef fpc} {$mode objfpc}{$H+} {$endif} {$ifdef LCLwin32} {$define RGB} {$endif} {$ifdef LCLqt} {$define RGB} {$endif} interface uses Classes, SysUtils, FPImage, IntfGraphics, Graphics, Math, LCLProc, RGBUtils; type PRGBPixel = PByte; PRGB32Pixel = ^TRGB32Pixel; TRGB32Pixel = DWord; PRGB8Pixel = ^TRGB8Pixel; TRGB8Pixel = Byte; PRGB32PixelArray = ^TRGB32PixelArray; TRGB32PixelArray = packed array [0..0] of TRGB32Pixel; TPixelDifference = Word; const MAXDIFFERENCE = 255 + 255 + 255; type // integral float with 1/256 precision TIntensityFloat = Integer; TIntensityFloatTable = Array [0..255] of TIntensityFloat; { TRGBBitmapCore } TRGBBitmapCore = class(TPersistent) private FPixels: PRGBPixel; FSizeOfPixel: Integer; FWidth: Integer; FHeight: Integer; FRowPixelStride: Integer; FDataOwner: Boolean; function GetSize: Integer; public constructor Create(AWidth, AHeight: Integer; ASizeOfPixel: Integer); virtual; constructor CreateAsCopy(ABitmap: TRGBBitmapCore; ASizeOfPixel: Integer); virtual; constructor CreateFromData(AData: Pointer; AWidth, AHeight: Integer; ASizeOfPixel: Integer; ADataOwner: Boolean = False); virtual; destructor Destroy; override; procedure Assign(Source: TPersistent); override; procedure SwapWith(ABitmap: TRGBBitmapCore); virtual; public function GetPixelPtrUnsafe(X, Y: Integer): PRGBPixel; function GetPixelPtr(X, Y: Integer): PRGBPixel; procedure Clear; virtual; procedure ClearWhite; virtual; procedure Invert; virtual; procedure FlipHorz; virtual; procedure FlipVert; virtual; procedure Rotate90; virtual; procedure Rotate180; virtual; procedure Rotate270; virtual; public property DataOwner: Boolean read FDataOwner; property Width: Integer read FWidth; property Height: Integer read FHeight; property Pixels: PRGBPixel read FPixels; property RowPixelStride: Integer read FRowPixelStride; property Size: Integer read GetSize; property SizeOfPixel: Integer read FSizeOfPixel; end; { TRGB8BitmapCore } TRGB8BitmapCore = class(TRGBBitmapCore) public constructor Create(AWidth, AHeight: Integer); virtual; constructor CreateAsCopy(ABitmap: TRGBBitmapCore); virtual; constructor CreateFromData(AData: Pointer; AWidth, AHeight: Integer; ADataOwner: Boolean = False); virtual; procedure LoadFromLazIntfImageAlpha(AImage: TLazIntfImage); virtual; procedure SaveToLazIntfImageAlpha(AImage: TLazIntfImage); virtual; procedure SaveToLazIntfImageAlpha(AImage: TLazIntfImage; const ARect: TRect); virtual; procedure Assign(Source: TPersistent); override; procedure SwapWith(ABitmap: TRGBBitmapCore); override; public function Get8PixelPtrUnsafe(X, Y: Integer): PRGB8Pixel; function Get8PixelPtr(X, Y: Integer): PRGB8Pixel; function Get8PixelUnsafe(X, Y: Integer): TRGB8Pixel; procedure Set8PixelUnsafe(X, Y: Integer; Value: TRGB8Pixel); procedure Set8Pixel(X, Y: Integer; Value: TRGB8Pixel); end; { TRGB32BitmapCore } TRGB32BitmapCore = class(TRGBBitmapCore) public constructor Create(AWidth, AHeight: Integer); virtual; constructor CreateAsCopy(ABitmap: TRGBBitmapCore); virtual; constructor CreateFromLazIntfImage(AImage: TLazIntfImage); virtual; constructor CreateFromData(AData: Pointer; AWidth, AHeight: Integer; ADataOwner: Boolean = False); virtual; procedure Assign(Source: TPersistent); override; procedure SwapWith(ABitmap: TRGBBitmapCore); override; procedure SaveToLazIntfImage(AImage: TLazIntfImage); virtual; procedure SaveToLazIntfImage(AImage: TLazIntfImage; const ARect: TRect); virtual; public function Get32PixelPtrUnsafe(X, Y: Integer): PRGB32Pixel; function Get32PixelPtr(X, Y: Integer): PRGB32Pixel; function Get32PixelUnsafe(X, Y: Integer): TRGB32Pixel; procedure Set32PixelUnsafe(X, Y: Integer; Value: TRGB32Pixel); procedure Set32Pixel(X, Y: Integer; Value: TRGB32Pixel); end; procedure FlipHorzRGBBitmap(Bitmap: TRGBBitmapCore); procedure FlipVertRGBBitmap(Bitmap: TRGBBitmapCore); // intensity tables function GetIntensityFloatTable(A, B: Single): TIntensityFloatTable; // rotate clockwise procedure Rotate90CWRGBBitmap(Bitmap: TRGBBitmapCore); procedure Rotate180CWRGBBitmap(Bitmap: TRGBBitmapCore); procedure Rotate270CWRGBBitmap(Bitmap: TRGBBitmapCore); procedure InvertRGBBitmap(Bitmap: TRGBBitmapCore); procedure GrayscaleRGB32Bitmap(Bitmap: TRGB32BitmapCore); procedure DisableRGB32Bitmap(Bitmap: TRGB32BitmapCore); function RGB32PixelToColor(P: TRGB32Pixel): TColor; function ColorToRGB32Pixel(C: TColor): TRGB32Pixel; implementation function GetRedInline(P: TRGB32Pixel): Byte; inline; begin {$IFDEF RGB} Result := (P and $FF0000) shr 16; {$ELSE} Result := P and $FF; {$ENDIF} end; function GetGreenInline(P: TRGB32Pixel): Byte; inline; begin {$IFDEF RGB} Result := (P and $FF00) shr 8; {$ELSE} Result := (P and $FF00) shr 8; {$ENDIF} end; function GetBlueInline(P: TRGB32Pixel): Byte; inline; begin {$IFDEF RGB} Result := P and $FF; {$ELSE} Result := (P and $FF0000) shr 16; {$ENDIF} end; function RGBToRGB32PixelInline(R, G, B: Byte): TRGB32Pixel; inline; begin {$IFDEF RGB} Result := B or (G shl 8) or (R shl 16); {$ELSE} Result := R or (G shl 8) or (B shl 16); {$ENDIF} end; function RGB32PixelToColorInline(P: TRGB32Pixel): TColor; inline; begin {$IFDEF RGB} Result := ((P and $FF0000) shr 16) or (P and $FF00) or ((P and $FF) shl 16); {$ELSE} Result := P and $FFFFFF; {$ENDIF} end; function ColorToRGB32PixelInline(C: TColor): TRGB32Pixel; inline; begin {$IFDEF RGB} Result := ((C and $FF0000) shr 16) or (C and $FF00) or ((C and $FF) shl 16); {$ELSE} Result := C and $FFFFFF; {$ENDIF} end; function FPColorToRGB32PixelInline(F: TFPColor): TRGB32Pixel; inline; begin {$IFDEF RGB} Result := ((F.Blue shr 8) and $FF) or (F.Green and $FF00) or ((F.Red shl 8) and $FF0000); {$ELSE} Result := ((F.Red shr 8) and $FF) or (F.Green and $FF00) or ((F.Blue shl 8) and $FF0000); {$ENDIF} end; function RGB32PixelToFPColorInline(P: TRGB32Pixel): TFPColor; inline; begin {$IFDEF RGB} Result.Red := (P shr 16) and $FF; Result.Red := Result.Red or (Result.Red shl 8); Result.Green := P and $FF00; Result.Green := Result.Green or (Result.Green shr 8); Result.Blue := P and $FF; Result.Blue := Result.Blue or (Result.Blue shl 8); {$ELSE} Result.Red := P and $FF; Result.Red := Result.Red or (Result.Red shl 8); Result.Green := P and $FF00; Result.Green := Result.Green or (Result.Green shr 8); Result.Blue := (P shr 16) and $FF; Result.Blue := Result.Blue or (Result.Blue shl 8); {$ENDIF} end; function RGB32PixelToColor(P: TRGB32Pixel): TColor; begin Result := RGB32PixelToColorInline(P); end; function ColorToRGB32Pixel(C: TColor): TRGB32Pixel; begin Result := ColorToRGB32PixelInline(C); end; procedure SwapRGBPixels(A, B: PRGBPixel; const Size: Integer); inline; var T32: TRGB32Pixel; T8: TRGB8Pixel; begin if Size = 4 then begin T32 := PRGB32Pixel(A)^; PRGB32Pixel(A)^ := PRGB32Pixel(B)^; PRGB32Pixel(B)^ := T32; end else begin T8 := PRGB8Pixel(A)^; PRGB8Pixel(A)^ := PRGB8Pixel(B)^; PRGB8Pixel(B)^ := T8; end; end; procedure CopyRGBPixels(Src, Dest: PRGBPixel; const Size: Integer); inline; begin if Size = 4 then PRGB32Pixel(Dest)^ := PRGB32Pixel(Src)^ else begin PRGB8Pixel(Dest)^ := PRGB8Pixel(Src)^; end; end; function GetRGBBitmapPixelPtr(const Bitmap: TRGBBitmapCore; X, Y: Integer): PRGBPixel; inline; begin Result := Bitmap.FPixels; Inc(Result, Y * Bitmap.FRowPixelStride * Bitmap.FSizeOfPixel + X * Bitmap.FSizeOfPixel); end; function RoundIntensityFloatInline(V: TIntensityFloat): Byte; inline; begin Result := Max(0, Min(255, (V + 128) shr 8)); end; procedure FlipHorzRGBBitmap(Bitmap: TRGBBitmapCore); var X, Y: Integer; PNew, POld: PRGBPixel; begin for Y := 0 to Pred(Bitmap.Height) do begin PNew := Bitmap.GetPixelPtrUnsafe(0, Y); POld := Bitmap.GetPixelPtrUnsafe(Pred(Bitmap.Width), Y); for X := 0 to Pred(Bitmap.Width shr 1) do begin SwapRGBPixels(PNew, POld, Bitmap.SizeOfPixel); Inc(PNew, Bitmap.SizeOfPixel); Dec(POld, Bitmap.SizeOfPixel); end; end; end; procedure FlipVertRGBBitmap(Bitmap: TRGBBitmapCore); var X, Y: Integer; PNew, POld: PRGBPixel; begin for Y := 0 to Pred(Bitmap.Height shr 1) do begin PNew := Bitmap.GetPixelPtrUnsafe(0, Y); POld := Bitmap.GetPixelPtrUnsafe(0, Pred(Bitmap.Height) - Y); for X := 0 to Pred(Bitmap.Width) do begin SwapRGBPixels(PNew, POld, Bitmap.SizeOfPixel); Inc(PNew, Bitmap.SizeOfPixel); Inc(POld, Bitmap.SizeOfPixel); end; end; end; (* Creates look-up table T[I = 0..255] = A + I * B. *) function GetIntensityFloatTable(A, B: Single): TIntensityFloatTable; var I: Integer; C: Single; begin C := A; for I := 0 to High(Result) do begin Result[I] := Round(C * 256); C := C + B; end; end; procedure Rotate90CWRGBBitmap(Bitmap: TRGBBitmapCore); var X, Y: Integer; PNew, POld: PRGBPixel; Result: TRGBBitmapCore; begin Result := TRGBBitmapCore.Create(Bitmap.Height, Bitmap.Width, Bitmap.SizeOfPixel); try for Y := 0 to Pred(Bitmap.Height) do begin PNew := Result.GetPixelPtrUnsafe(Pred(Bitmap.Height) - Y, 0); POld := Bitmap.GetPixelPtrUnsafe(0, Y); for X := 0 to Pred(Bitmap.Width) do begin CopyRGBPixels(POld, PNew, Result.SizeOfPixel); Inc(PNew, Result.RowPixelStride * Result.SizeOfPixel); Inc(POld, Result.SizeOfPixel); end; end; Bitmap.SwapWith(Result); finally FreeAndNil(Result); end; end; procedure Rotate180CWRGBBitmap(Bitmap: TRGBBitmapCore); var X, Y: Integer; PNew, POld: PRGBPixel; begin for Y := 0 to Pred(Bitmap.Height shr 1) do begin PNew := Bitmap.GetPixelPtrUnsafe(0, Y); POld := Bitmap.GetPixelPtrUnsafe(Pred(Bitmap.Width), Pred(Bitmap.Height) - Y); for X := 0 to Pred(Bitmap.Width) do begin SwapRGBPixels(PNew, POld, Bitmap.SizeOfPixel); Inc(PNew, Bitmap.SizeOfPixel); Dec(POld, Bitmap.SizeOfPixel); end; end; if Odd(Bitmap.Height) then begin PNew := Bitmap.GetPixelPtrUnsafe(0, Bitmap.Height shr 1); POld := Bitmap.GetPixelPtrUnsafe(Pred(Bitmap.Width), Bitmap.Height shr 1); for X := 0 to Pred(Bitmap.Width shr 1) do begin SwapRGBPixels(PNew, POld, Bitmap.SizeOfPixel); Inc(PNew, Bitmap.SizeOfPixel); Dec(POld, Bitmap.SizeOfPixel); end; end; end; procedure Rotate270CWRGBBitmap(Bitmap: TRGBBitmapCore); var X, Y: Integer; PNew, POld: PRGBPixel; Result: TRGBBitmapCore; begin Result := TRGBBitmapCore.Create(Bitmap.Height, Bitmap.Width, Bitmap.SizeOfPixel); try for Y := 0 to Pred(Bitmap.Height) do begin PNew := Result.GetPixelPtrUnsafe(Y, Pred(Bitmap.Width)); POld := Bitmap.GetPixelPtrUnsafe(0, Y); for X := 0 to Pred(Bitmap.Width) do begin CopyRGBPixels(POld, PNew, Result.SizeOfPixel); Dec(PNew, Result.RowPixelStride * Result.SizeOfPixel); Inc(POld, Result.SizeOfPixel); end; end; Bitmap.SwapWith(Result); finally FreeAndNil(Result); end; end; procedure InvertRGBBitmap(Bitmap: TRGBBitmapCore); var I: Integer; P: PRGBPixel; begin P := Bitmap.Pixels; for I := 0 to Pred(Bitmap.Height * Bitmap.RowPixelStride * Bitmap.SizeOfPixel) do begin P^ := $FF - P^; Inc(P); end; end; procedure GrayscaleRGB32Bitmap(Bitmap: TRGB32BitmapCore); var X, Y: Integer; P: PRGB32Pixel; S: Byte; R, G, B: TIntensityFloatTable; begin // R * 0.299 + G * 0.587 + B * 0.114 R := GetIntensityFloatTable(0, 0.299); G := GetIntensityFloatTable(0, 0.587); B := GetIntensityFloatTable(0, 0.114); for Y := 0 to Pred(Bitmap.Height) do begin P := Bitmap.Get32PixelPtr(0, Y); for X := 0 to Pred(Bitmap.Width) do begin S := RoundIntensityFloatInline(R[GetRedInline(P^)] + G[GetGreenInline(P^)] + B[GetBlueInline(P^)]); P^ := RGBToRGB32PixelInline(S, S, S); Inc(P); end; end; end; procedure DisableRGB32Bitmap(Bitmap: TRGB32BitmapCore); var X, Y: Integer; P: PRGB32Pixel; S: Byte; R, G, B: TIntensityFloatTable; begin // 128 + R * 0.299 / 4 + G * 0.587 / 4 + B * 0.114 / 4 R := GetIntensityFloatTable(128, 0.299 / 4); G := GetIntensityFloatTable(0, 0.587 / 4); B := GetIntensityFloatTable(0, 0.114 / 4); for Y := 0 to Pred(Bitmap.Height) do begin P := Bitmap.Get32PixelPtr(0, Y); for X := 0 to Pred(Bitmap.Width) do begin S := RoundIntensityFloatInline(R[GetRedInline(P^)] + G[GetGreenInline(P^)] + B[GetBlueInline(P^)]); P^ := RGBToRGB32PixelInline(S, S, S); Inc(P); end; end; end; { TRGBBitmapCore } function TRGBBitmapCore.GetSize: Integer; begin Result := Height * RowPixelStride * SizeOfPixel; end; constructor TRGBBitmapCore.Create(AWidth, AHeight: Integer; ASizeOfPixel: Integer); begin inherited Create; FWidth := AWidth; FHeight := AHeight; // TODO: check on 64-bit arch. // 32-bit alignment FRowPixelStride := (((AWidth * ASizeOfPixel + 3) shr 2) shl 2) div ASizeOfPixel; FSizeOfPixel := ASizeOfPixel; FDataOwner := True; GetMem(FPixels, FHeight * FRowPixelStride * FSizeOfPixel); end; constructor TRGBBitmapCore.CreateAsCopy(ABitmap: TRGBBitmapCore; ASizeOfPixel: Integer); begin inherited Create; FWidth := ABitmap.Width; FHeight := ABitmap.Height; FRowPixelStride := ABitmap.RowPixelStride; FSizeOfPixel := ASizeOfPixel; FDataOwner := True; GetMem(FPixels, FHeight * FRowPixelStride * SizeOfPixel); Move(ABitmap.Pixels^, FPixels^, FHeight * FRowPixelStride * SizeOfPixel); end; constructor TRGBBitmapCore.CreateFromData(AData: Pointer; AWidth, AHeight: Integer; ASizeOfPixel: Integer; ADataOwner: Boolean); begin inherited Create; FWidth := AWidth; FHeight := AHeight; // TODO: check on 64-bit arch. // 32-bit alignment FRowPixelStride := (((AWidth * ASizeOfPixel + 3) shr 2) shl 2) div ASizeOfPixel; FSizeOfPixel := ASizeOfPixel; FPixels := AData; FDataOwner := ADataOwner; end; destructor TRGBBitmapCore.Destroy; begin if FDataOwner then FreeMem(FPixels); inherited; end; procedure TRGBBitmapCore.Assign(Source: TPersistent); begin if Source = nil then Exit; if Source = Self then Exit; if Source is TRGBBitmapCore then begin FreeMem(FPixels); FWidth := (Source as TRGBBitmapCore).Width; FHeight := (Source as TRGBBitmapCore).Height; FRowPixelStride := (Source as TRGBBitmapCore).RowPixelStride; FSizeOfPixel := (Source as TRGBBitmapCore).SizeOfPixel; GetMem(FPixels, FHeight * FRowPixelStride * FSizeOfPixel); Move((Source as TRGBBitmapCore).Pixels^, FPixels^, FHeight * FRowPixelStride * FSizeOfPixel); end else inherited Assign(Source); end; procedure TRGBBitmapCore.SwapWith(ABitmap: TRGBBitmapCore); begin if ABitmap = nil then Exit; SwapPtr(FPixels, ABitmap.FPixels); SwapInt(FWidth, ABitmap.FWidth); SwapInt(FHeight, ABitmap.FHeight); SwapInt(FRowPixelStride, ABitmap.FRowPixelStride); SwapInt(FSizeOfPixel, ABitmap.FSizeOfPixel); end; function TRGBBitmapCore.GetPixelPtrUnsafe(X, Y: Integer): PRGBPixel; begin Result := GetRGBBitmapPixelPtr(Self, X, Y); end; function TRGBBitmapCore.GetPixelPtr(X, Y: Integer): PRGBPixel; begin if (X >= 0) and (X < FWidth) and (Y >= 0) and (Y < FHeight) then Result := GetRGBBitmapPixelPtr(Self, X, Y) else Result := nil; end; procedure TRGBBitmapCore.Clear; begin FillByte(Pixels^, Size, 0); end; procedure TRGBBitmapCore.ClearWhite; begin FillByte(Pixels^, Size, $FF); end; procedure TRGBBitmapCore.Invert; begin InvertRGBBitmap(Self); end; procedure TRGBBitmapCore.FlipHorz; begin FlipHorzRGBBitmap(Self); end; procedure TRGBBitmapCore.FlipVert; begin FlipVertRGBBitmap(Self); end; procedure TRGBBitmapCore.Rotate90; begin Rotate90CWRGBBitmap(Self); end; procedure TRGBBitmapCore.Rotate180; begin Rotate180CWRGBBitmap(Self); end; procedure TRGBBitmapCore.Rotate270; begin Rotate270CWRGBBitmap(Self); end; { TRGB32BitmapCore } constructor TRGB32BitmapCore.Create(AWidth, AHeight: Integer); begin inherited Create(AWidth, AHeight, SizeOf(TRGB32Pixel)); end; constructor TRGB32BitmapCore.CreateAsCopy(ABitmap: TRGBBitmapCore); begin if ABitmap.SizeOfPixel = SizeOf(TRGB32Pixel) then inherited CreateAsCopy(ABitmap, SizeOf(TRGB32Pixel)); end; constructor TRGB32BitmapCore.CreateFromLazIntfImage(AImage: TLazIntfImage); var I, J: Integer; P: PRGB32Pixel; begin Create(AImage.Width, AImage.Height); for J := 0 to Pred(Height) do begin P := Get32PixelPtr(0, J); for I := 0 to Pred(Width) do begin if AImage.Colors[I, J].alpha < $FF00 then P^ := $FFFFFFFF else P^ := FPColorToRGB32PixelInline(AImage.Colors[I, J]); Inc(P); end; end; end; constructor TRGB32BitmapCore.CreateFromData(AData: Pointer; AWidth, AHeight: Integer; ADataOwner: Boolean); begin inherited CreateFromData(AData, AWidth, AHeight, SizeOf(TRGB32Pixel), ADataOwner); end; procedure TRGB32BitmapCore.Assign(Source: TPersistent); begin if (Source is TRGBBitmapCore) and ((Source as TRGBBitmapCore).SizeOfPixel = SizeOf(TRGB32Pixel)) then inherited Assign(Source); end; procedure TRGB32BitmapCore.SwapWith(ABitmap: TRGBBitmapCore); begin if ABitmap.SizeOfPixel = SizeOf(TRGB32Pixel) then inherited SwapWith(ABitmap); end; procedure TRGB32BitmapCore.SaveToLazIntfImage(AImage: TLazIntfImage); begin SaveToLazIntfImage(AImage, Bounds(0, 0, Width, Height)); end; procedure TRGB32BitmapCore.SaveToLazIntfImage(AImage: TLazIntfImage; const ARect: TRect); var I, J: Integer; P: PRGB32Pixel; W, H: Integer; begin W := ARect.Right - ARect.Left; H := ARect.Bottom - ARect.Top; AImage.SetSize(W, H); try for J := 0 to Pred(H) do begin P := Get32PixelPtr(ARect.Left, J + ARect.Top); for I := 0 to Pred(W) do begin AImage.Colors[I, J] := RGB32PixelToFPColorInline(P^); Inc(P); end; end; except AImage.Free; end; end; function TRGB32BitmapCore.Get32PixelPtrUnsafe(X, Y: Integer ): PRGB32Pixel; begin Result := PRGB32Pixel(GetRGBBitmapPixelPtr(Self, X, Y)); end; function TRGB32BitmapCore.Get32PixelPtr(X, Y: Integer): PRGB32Pixel; begin if (X >= 0) and (X < FWidth) and (Y >= 0) and (Y < FHeight) then Result := PRGB32Pixel(GetRGBBitmapPixelPtr(Self, X, Y)) else Result := nil; end; function TRGB32BitmapCore.Get32PixelUnsafe(X, Y: Integer): TRGB32Pixel; begin Result := GetRGBBitmapPixelPtr(Self, X, Y)^; end; procedure TRGB32BitmapCore.Set32PixelUnsafe(X, Y: Integer; Value: TRGB32Pixel); begin GetRGBBitmapPixelPtr(Self, X, Y)^ := Value; end; procedure TRGB32BitmapCore.Set32Pixel(X, Y: Integer; Value: TRGB32Pixel); begin if (X >= 0) and (X < FWidth) and (Y >= 0) and (Y < FHeight) then PRGB32Pixel(GetRGBBitmapPixelPtr(Self, X, Y))^ := Value; end; { TRGB8BitmapCore } constructor TRGB8BitmapCore.Create(AWidth, AHeight: Integer); begin inherited Create(AWidth, AHeight, SizeOf(TRGB8Pixel)); end; constructor TRGB8BitmapCore.CreateAsCopy(ABitmap: TRGBBitmapCore); begin if ABitmap.SizeOfPixel = SizeOf(TRGB8Pixel) then inherited CreateAsCopy(ABitmap, SizeOf(TRGB8Pixel)); end; constructor TRGB8BitmapCore.CreateFromData(AData: Pointer; AWidth, AHeight: Integer; ADataOwner: Boolean); begin inherited CreateFromData(AData, AWidth, AHeight, SizeOf(TRGB8Pixel), ADataOwner); end; procedure TRGB8BitmapCore.LoadFromLazIntfImageAlpha(AImage: TLazIntfImage); var I, J: Integer; P: PRGB8Pixel; begin for J := 0 to Pred(Height) do begin P := Get8PixelPtr(0, J); for I := 0 to Pred(Width) do begin P^ := (AImage.Colors[I, J].alpha shr 8) and $FF; Inc(P); end; end; end; procedure TRGB8BitmapCore.SaveToLazIntfImageAlpha(AImage: TLazIntfImage); begin SaveToLazIntfImageAlpha(AImage, Bounds(0, 0, Width, Height)); end; procedure TRGB8BitmapCore.SaveToLazIntfImageAlpha(AImage: TLazIntfImage; const ARect: TRect); var I, J: Integer; P: PRGB8Pixel; F: TFPColor; begin for J := 0 to Pred(AImage.Height) do begin P := Get8PixelPtr(ARect.Left, J + ARect.Top); for I := 0 to Pred(AImage.Width) do begin F := AImage.Colors[I, J]; F.alpha := P^ shl 8; AImage.Colors[I, J] := F; Inc(P); end; end; end; procedure TRGB8BitmapCore.Assign(Source: TPersistent); begin if (Source is TRGBBitmapCore) and ((Source as TRGBBitmapCore).SizeOfPixel = SizeOf(TRGB8Pixel)) then inherited Assign(Source); end; procedure TRGB8BitmapCore.SwapWith(ABitmap: TRGBBitmapCore); begin if ABitmap.SizeOfPixel = SizeOf(TRGB8Pixel) then inherited SwapWith(ABitmap); end; function TRGB8BitmapCore.Get8PixelPtrUnsafe(X, Y: Integer): PRGB8Pixel; begin Result := GetRGBBitmapPixelPtr(Self, X, Y); end; function TRGB8BitmapCore.Get8PixelPtr(X, Y: Integer): PRGB8Pixel; begin if (X >= 0) and (X < FWidth) and (Y >= 0) and (Y < FHeight) then Result := GetRGBBitmapPixelPtr(Self, X, Y) else Result := nil; end; function TRGB8BitmapCore.Get8PixelUnsafe(X, Y: Integer): TRGB8Pixel; begin Result := GetRGBBitmapPixelPtr(Self, X, Y)^; end; procedure TRGB8BitmapCore.Set8PixelUnsafe(X, Y: Integer; Value: TRGB8Pixel); begin GetRGBBitmapPixelPtr(Self, X, Y)^ := Value; end; procedure TRGB8BitmapCore.Set8Pixel(X, Y: Integer; Value: TRGB8Pixel); begin if (X >= 0) and (X < FWidth) and (Y >= 0) and (Y < FHeight) then GetRGBBitmapPixelPtr(Self, X, Y)^ := Value; end; end. mricron-0.20120505.1~dfsg.1.orig/rgb/rgbroutines.pas0000664000175000017500000007300211326434470021500 0ustar michaelmichael{ /*************************************************************************** RGBRoutines.pas ***************************************************************************/ ***************************************************************************** * * * See the file COPYING.modifiedLGPL, included in this distribution, * * for details about the copyright. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * * ***************************************************************************** Author: Tom Gregorovic (_tom_@centrum.cz) Abstract: This unit contains routines for manipulating rgb bitmaps (stretching, drawing on canvas...) and for drawing primitives (lines, ellipses...). } unit RGBRoutines; {$ifdef fpc} {$mode objfpc}{$H+} {$endif} interface uses SysUtils, Math, Forms, LCLIntf, LCLType, LCLProc, FPImage, IntfGraphics, Classes, {$IFDEF LCLwin32} RGBWinRoutines, {$ENDIF} {$IFDEF LCLqt} RGBQtRoutines, {$ENDIF} {$IFDEF LCLgtk} {$DEFINE StretchRGB32} RGBGTKRoutines, {$ENDIF} {$IFDEF LCLgtk2} {$DEFINE StretchRGB32} RGBGTKRoutines, {$ENDIF} {$IFDEF LCLcarbon} {$DEFINE StretchRGB32} RGBCarbonRoutines, {$ENDIF} RGBTypes, RGBUtils; procedure DrawRGB32Bitmap(Dst: TRGB32BitmapCore; X, Y: Integer; Src: TRGB32BitmapCore); overload; procedure DrawRGB8Bitmap(Dst: TRGB8BitmapCore; X, Y: Integer; Src: TRGB8BitmapCore); overload; procedure StretchRGB32BitmapTrunc(Dst, Src: TRGB32BitmapCore); procedure StretchRGB8BitmapTrunc(Dst, Src: TRGB8BitmapCore); procedure DrawRGB32Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); overload; procedure StretchDrawRGB32Bitmap(Dest: HDC; DstX, DstY, DstWidth, DstHeight: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); overload; procedure StretchDrawRGBMaskShapePortion(Dest: HDC; DstX, DstY, DstWidth, DstHeight: Integer; Bitmap: TRGB8BitmapCore; DX, DY, DW, DH: Integer; BgPen: HPEN; FgPen: HPEN); procedure DrawRGB8Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB8BitmapCore); overload; type TDrawPixelProcedure = procedure (X, Y: Integer) of Object; TGetPixelFunction = function (X, Y: Integer): TRGB32Pixel of Object; TSamePixelFunction = function (X, Y: Integer; Value: TRGB32Pixel): Boolean of Object; procedure LineBresenham(X1, Y1, X2, Y2: Integer; DrawPixel: TDrawPixelProcedure); procedure FillPixelRect(X1, Y1, X2, Y2: Integer; DrawPixel: TDrawPixelProcedure); procedure NormalRectangle(X1, Y1, X2, Y2: Integer; DrawOutlinePixel, DrawFillPixel: TDrawPixelProcedure); procedure EllipticRectangle(X1, Y1, X2, Y2: Integer; LX, LY: Integer; DrawOutlinePixel, DrawFillPixel: TDrawPixelProcedure); procedure FloodFillScanLine(X, Y, W, H: Integer; GetPixel: TGetPixelFunction; SamePixel: TSamePixelFunction; DrawPixel: TDrawPixelProcedure); implementation function GetDCClipRect(Dest: HDC): TRect; begin if GetClipBox(Dest, @Result) = ERROR then begin Result.TopLeft := Point(0, 0); if not GetDeviceSize(Dest, Result.BottomRight) then Result.BottomRight := Point(8000, 8000); end; end; procedure DrawRGB32Bitmap(Dst: TRGB32BitmapCore; X, Y: Integer; Src: TRGB32BitmapCore); var SrcX, SrcWidth, SrcY, SrcHeight: Integer; I: Integer; PS, PD: PRGB32Pixel; begin if (Dst = nil) or (Src = nil) then Exit; if (Dst.Width <= 0) or (Dst.Height <= 0) or (Src.Width <= 0) or (Src.Height <= 0) then Exit; if (X >= Dst.Width) or (Y >= Dst.Height) then Exit; if (X + Src.Width <= 0) or (Y + Src.Height <= 0) then Exit; SrcX := 0; SrcY := 0; SrcWidth := Src.Width; SrcHeight := Src.Height; if X < 0 then begin SrcX := -X; Inc(SrcWidth, X); X := 0; end; if Y < 0 then begin SrcY := -Y; Inc(SrcHeight, Y); Y := 0; end; if X + SrcWidth > Dst.Width then Dec(SrcWidth, X + SrcWidth - Dst.Width); if Y + SrcHeight > Dst.Height then Dec(SrcHeight, Y + SrcHeight - Dst.Height); for I := 0 to Pred(SrcHeight) do begin PS := Src.Get32PixelPtrUnsafe(SrcX, SrcY + I); PD := Dst.Get32PixelPtrUnsafe(X, Y + I); Move(PS^, PD^, SrcWidth shl 2); end; end; procedure DrawRGB8Bitmap(Dst: TRGB8BitmapCore; X, Y: Integer; Src: TRGB8BitmapCore); var SrcX, SrcWidth, SrcY, SrcHeight: Integer; I: Integer; PS, PD: PRGB8Pixel; begin if (Dst = nil) or (Src = nil) then Exit; if (Dst.Width <= 0) or (Dst.Height <= 0) or (Src.Width <= 0) or (Src.Height <= 0) then Exit; if (X >= Dst.Width) or (Y >= Dst.Height) then Exit; if (X + Src.Width <= 0) or (Y + Src.Height <= 0) then Exit; SrcX := 0; SrcY := 0; SrcWidth := Src.Width; SrcHeight := Src.Height; if X < 0 then begin SrcX := -X; Inc(SrcWidth, X); X := 0; end; if Y < 0 then begin SrcY := -Y; Inc(SrcHeight, Y); Y := 0; end; if X + SrcWidth > Dst.Width then Dec(SrcWidth, X + SrcWidth - Dst.Width); if Y + SrcHeight > Dst.Height then Dec(SrcHeight, Y + SrcHeight - Dst.Height); for I := 0 to Pred(SrcHeight) do begin PS := Src.Get8PixelPtrUnsafe(SrcX, SrcY + I); PD := Dst.Get8PixelPtrUnsafe(X, Y + I); Move(PS^, PD^, SrcWidth); end; end; procedure StretchRGB32BitmapTrunc(Dst, Src: TRGB32BitmapCore); var Cols: TIntArray; Rows: TIntArray; X, Y, PX, TX, OX, PY, TY, OY: Integer; I: Integer; PD, PS, PDLine, PSLine: PRGB32Pixel; DstDataWidth, DstDataHeight: Integer; SrcDataWidth, SrcDataHeight: Integer; SrcRowPixelStride, DstRowPixelStride: Integer; begin DstDataWidth := Dst.Width; DstDataHeight := Dst.Height; SrcDataWidth := Src.Width; SrcDataHeight := Src.Height; SrcRowPixelStride := Src.RowPixelStride; DstRowPixelStride := Dst.RowPixelStride; Cols := DivideTrunc(SrcDataWidth, DstDataWidth); Rows := DivideTrunc(SrcDataHeight, DstDataHeight); if DstDataWidth <= SrcDataWidth then begin PX := 0; OX := 0; for X := 0 to High(Cols) do begin TX := Cols[X]; Cols[X] := (PX + TX shr 1) - OX; OX := (PX + TX shr 1); Inc(PX, TX); end; end; if DstDataHeight <= SrcDataHeight then begin PY := 0; OY := 0; for Y := 0 to High(Rows) do begin TY := Rows[Y]; Rows[Y] := (PY + Rows[Y] shr 1) - OY; OY := (PY + TY shr 1); Inc(PY, TY); end; end; PD := PRGB32Pixel(Dst.Pixels); PS := PRGB32Pixel(Src.Pixels); for Y := 0 to High(Rows) do begin if DstDataHeight <= SrcDataHeight then begin Inc(PS, Rows[Y] * SrcRowPixelStride); end; PDLine := PD; PSLine := PS; if DstDataWidth > SrcDataWidth then begin for X := 0 to High(Cols) do begin if Cols[X] = 1 then begin PDLine^ := PSLine^; Inc(PDLine); end else begin FillDWord(PDLine^, Cols[X], PSLine^); Inc(PDLine, Cols[X]); end; Inc(PSLine); end; end else begin for X := 0 to High(Cols) do begin Inc(PSLine, Cols[X]); PDLine^ := PSLine^; Inc(PDLine); end; end; if DstDataHeight > SrcDataHeight then begin PDLine := PD; Inc(PD, DstRowPixelStride); for I := 2 to Rows[Y] do begin Move(PDLine^, PD^, DstDataWidth shl 2); Inc(PD, DstRowPixelStride); end; Inc(PS, SrcRowPixelStride); end else begin Inc(PD, DstRowPixelStride); end; end; end; procedure StretchRGB8BitmapTrunc(Dst, Src: TRGB8BitmapCore); var Cols: TIntArray; Rows: TIntArray; X, Y, PX, TX, OX, PY, TY, OY: Integer; I: Integer; PD, PS, PDLine, PSLine: PRGB8Pixel; DstDataWidth, DstDataHeight: Integer; SrcDataWidth, SrcDataHeight: Integer; SrcRowPixelStride, DstRowPixelStride: Integer; begin DstDataWidth := Dst.Width; DstDataHeight := Dst.Height; SrcDataWidth := Src.Width; SrcDataHeight := Src.Height; SrcRowPixelStride := Src.RowPixelStride; DstRowPixelStride := Dst.RowPixelStride; Cols := DivideTrunc(SrcDataWidth, DstDataWidth); Rows := DivideTrunc(SrcDataHeight, DstDataHeight); if DstDataWidth <= SrcDataWidth then begin PX := 0; OX := 0; for X := 0 to High(Cols) do begin TX := Cols[X]; Cols[X] := (PX + TX shr 1) - OX; OX := (PX + TX shr 1); Inc(PX, TX); end; end; if DstDataHeight <= SrcDataHeight then begin PY := 0; OY := 0; for Y := 0 to High(Rows) do begin TY := Rows[Y]; Rows[Y] := (PY + Rows[Y] shr 1) - OY; OY := (PY + TY shr 1); Inc(PY, TY); end; end; PD := PRGB8Pixel(Dst.Pixels); PS := PRGB8Pixel(Src.Pixels); for Y := 0 to High(Rows) do begin if DstDataHeight <= SrcDataHeight then begin Inc(PS, Rows[Y] * SrcRowPixelStride); end; PDLine := PD; PSLine := PS; if DstDataWidth > SrcDataWidth then begin for X := 0 to High(Cols) do begin if Cols[X] = 1 then begin PDLine^ := PSLine^; Inc(PDLine); end else begin FillByte(PDLine^, Cols[X], PSLine^); Inc(PDLine, Cols[X]); end; Inc(PSLine); end; end else begin for X := 0 to High(Cols) do begin Inc(PSLine, Cols[X]); PDLine^ := PSLine^; Inc(PDLine); end; end; if DstDataHeight > SrcDataHeight then begin PDLine := PD; Inc(PD, DstRowPixelStride); for I := 2 to Rows[Y] do begin Move(PDLine^, PD^, DstDataWidth); Inc(PD, DstRowPixelStride); end; Inc(PS, SrcRowPixelStride); end else begin Inc(PD, DstRowPixelStride); end; end; end; procedure StretchRGB32BitmapTrunc(Dst: TRGB32BitmapCore; DstX, DstY, DstWidth, DstHeight: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Src: TRGB32BitmapCore); var Cols: TIntArray; Rows: TIntArray; X, Y: Integer; SX, SY, DX, DY: Integer; I, J, C: Integer; PD, PS, PDLine, PSLine: PRGB32Pixel; DstDataWidth, DstDataHeight: Integer; SrcDataWidth, SrcDataHeight: Integer; SrcRowPixelStride, DstRowPixelStride: Integer; begin DstDataWidth := Dst.Width; DstDataHeight := Dst.Height; SrcDataWidth := Src.Width; SrcDataHeight := Src.Height; SrcRowPixelStride := Src.RowPixelStride; DstRowPixelStride := Dst.RowPixelStride; Cols := DivideTrunc(SrcWidth, DstWidth); Rows := DivideTrunc(SrcHeight, DstHeight); if DstWidth <= SrcWidth then Cols := GetDifference(GetMidPoints(Cols)); if DstHeight <= SrcHeight then Rows := GetDifference(GetMidPoints(Rows)); PD := Dst.Get32PixelPtrUnsafe(DstX, DstY); PS := Src.Get32PixelPtrUnsafe(SrcX, SrcY); DY := DstY; SY := SrcY; for Y := 0 to High(Rows) do begin if DstHeight <= SrcHeight then begin Inc(PS, Rows[Y] * SrcRowPixelStride); Inc(SY, Rows[Y]); end; if DstHeight > SrcHeight then C := Rows[Y] else C := 1; for I := 1 to C do begin DX := DstX; SX := SrcX; PDLine := PD; PSLine := PS; if (SY >= 0) and (SY < SrcDataHeight) and (DY >= 0) and (DY < DstDataHeight) then begin if (DstWidth > SrcWidth) then begin for X := 0 to High(Cols) do begin if Cols[X] = 1 then begin if (SX >= 0) and (SX < SrcDataWidth) and (DX >= 0) and (DX < DstDataWidth) then PDLine^ := PSLine^; Inc(PDLine); Inc(DX); end else begin if (SX >= 0) and (SX < SrcDataWidth) then begin if (DX + Cols[X] <= 0) or (DX >= DstDataWidth) then begin Inc(PDLine, Cols[X]); Inc(DX, Cols[X]); end else for J := 1 to Cols[X] do begin if (DX >= 0) and (DX < DstDataWidth) then PDLine^ := PSLine^; Inc(PDLine); Inc(DX); end; end else begin Inc(PDLine, Cols[X]); Inc(DX, Cols[X]); end; end; Inc(PSLine); Inc(SX); end; end else begin for X := 0 to High(Cols) do begin Inc(PSLine, Cols[X]); Inc(SX, Cols[X]); if (SX >= 0) and (SX < SrcDataWidth) and (DX >= 0) and (DX < DstDataWidth) then PDLine^ := PSLine^; Inc(PDLine); Inc(DX); end; end; end; if DstHeight > SrcHeight then begin Inc(PD, DstRowPixelStride); Inc(DY); end; end; if DstHeight > SrcHeight then begin Inc(PS, SrcRowPixelStride); Inc(SY); end else begin Inc(PD, DstRowPixelStride); Inc(DY); end; end; end; // ! SrcX < 0, SrcY < 0, SrcX + SrcWidth > Bitmap.Width, SrcY + SrcHeight > Bitmap.Height // ! results in mash procedure DrawRGB32Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); var Clip: TRect; begin if (Bitmap = nil) or (Bitmap.Pixels = nil) then Exit; if (Bitmap.Width <= 0) or (Bitmap.Height <= 0) then Exit; if (SrcWidth <= 0) or (SrcHeight <= 0) then Exit; Clip := GetDCClipRect(Dest); if (DstX >= Clip.Right) or (DstY >= Clip.Bottom) or (DstX + SrcWidth < Clip.Left) or (DstY + SrcHeight < Clip.Top) then Exit; // clipping: ClipDimension(Clip.Left, Clip.Right, DstX, SrcX, SrcWidth); ClipDimension(Clip.Top, Clip.Bottom, DstY, SrcY, SrcHeight); WidgetSetDrawRGB32Bitmap(Dest, DstX, DstY, SrcX, SrcY, SrcWidth, SrcHeight, Bitmap); end; // ! SrcX < 0, SrcY < 0, SrcX + SrcWidth > Bitmap.Width, SrcY + SrcHeight > Bitmap.Height // ! results in mash procedure StretchDrawRGB32Bitmap(Dest: HDC; DstX, DstY, DstWidth, DstHeight: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); var Clip: TRect; {$IFDEF StretchRGB32} Temp: TRGB32BitmapCore; X, Y, W, H: Integer; {$ENDIF} begin if (Bitmap = nil) or (Bitmap.Pixels = nil) then Exit; if (Bitmap.Width <= 0) or (Bitmap.Height <= 0) then Exit; if (SrcWidth <= 0) or (SrcHeight <= 0) then Exit; if (DstWidth <= 0) or (DstHeight <= 0) then Exit; Clip := GetDCClipRect(Dest); if (DstX >= Clip.Right) or (DstY >= Clip.Bottom) or (DstX + DstWidth < Clip.Left) or (DstY + DstHeight < Clip.Top) then Exit; if (DstWidth = SrcWidth) and (DstHeight = SrcHeight) then begin DrawRGB32Bitmap(Dest, DstX, DstY, SrcX, SrcY, SrcWidth, SrcHeight, Bitmap); Exit; end; {$IFDEF StretchRGB32} X := Max(Clip.Left, DstX); Y := Max(Clip.Top, DstY); W := Min(Clip.Right, DstX + DstWidth) - X; H := Min(Clip.Bottom, DstY + DstHeight) - Y; Temp := TRGB32BitmapCore.Create(W, H); try StretchRGB32BitmapTrunc(Temp, DstX - X, DstY - Y, DstWidth, DstHeight, SrcX, SrcY, SrcWidth, SrcHeight, Bitmap); DrawRGB32Bitmap(Dest, X, Y, 0, 0, W, H, Temp); finally Temp.Free; end; {$ELSE} WidgetSetStretchDrawRGB32Bitmap(Dest, DstX, DstY, DstWidth, DstHeight, SrcX, SrcY, SrcWidth, SrcHeight, Bitmap); {$ENDIF} end; procedure StretchDrawRGBMaskShapePortion(Dest: HDC; DstX, DstY, DstWidth, DstHeight: Integer; Bitmap: TRGB8BitmapCore; DX, DY, DW, DH: Integer; BgPen: HPEN; FgPen: HPEN); var ZoomX, ZoomY: Single; Clip: TRect; procedure DrawMask(SX, SY, EX, EY: Integer); var X, Y: Integer; P: PRGB8Pixel; V1, V2: TRGB8Pixel; A, B, C: Integer; Temp: HGDIOBJ; begin if EX >= Bitmap.Width then EX := Pred(Bitmap.Width); if EY >= Bitmap.Height then EY := Pred(Bitmap.Height); Temp := SelectObject(Dest, BgPen); try for Y := SY to EY do begin if Pred(SX) >= 0 then V2 := Bitmap.Get8PixelPtr(Pred(SX), Y)^ else V2 := 0; P := Bitmap.Get8PixelPtr(SX, Y); for X := Pred(SX) to EX do begin V1 := V2; if X < Pred(Bitmap.Width) then V2 := P^ else V2 := 0; if (V1 = $FF) and (V2 <> $FF) then begin A := DstX + Round(Succ(X) * ZoomX); B := DstY + Round(Y * ZoomY); C := DstY + Round(Succ(Y) * ZoomY); if ((X + Y) and $1) > 0 then begin SelectObject(Dest, BgPen); MoveToEx(Dest, A, B, nil); LineTo(Dest, A, C); end else begin SelectObject(Dest, FgPen); MoveToEx(Dest, A, B, nil); LineTo(Dest, A, C); end; end else if (V1 <> $FF) and (V2 = $FF) then begin A := DstX + Round(Succ(X) * ZoomX); B := DstY + Round(Y * ZoomY); C := DstY + Round(Succ(Y) * ZoomY); if ((X + Y) and $1) > 0 then begin SelectObject(Dest, BgPen); MoveToEx(Dest, A - 1, B, nil); LineTo(Dest, A - 1, C); end else begin SelectObject(Dest, FgPen); MoveToEx(Dest, A - 1, B, nil); LineTo(Dest, A - 1, C); end; end; Inc(P); end; end; for X := SX to EX do begin if Pred(SY) >= 0 then V2 := Bitmap.Get8PixelPtr(X, Pred(SY))^ else V2 := 0; P := Bitmap.Get8PixelPtr(X, SY); for Y := Pred(SY) to EY do begin V1 := V2; if Y < Pred(Bitmap.Height) then V2 := P^ else V2 := 0; if (V1 = $FF) and (V2 <> $FF) then begin A := DstX + Round(X * ZoomX); B := DstX + Round(Succ(X) * ZoomX); C := DstY + Round(Succ(Y) * ZoomY); if ((X + Y) and $1) > 0 then begin SelectObject(Dest, BgPen); MoveToEx(Dest, A, C, nil); LineTo(Dest, B, C); end else begin SelectObject(Dest, FgPen); MoveToEx(Dest, A, C, nil); LineTo(Dest, B, C); end; end else if (V1 <> $FF) and (V2 = $FF) then begin A := DstX + Round(X * ZoomX); B := DstX + Round(Succ(X) * ZoomX); C := DstY + Round(Succ(Y) * ZoomY); if ((X + Y) and $1) > 0 then begin SelectObject(Dest, BgPen); MoveToEx(Dest, A, C - 1, nil); LineTo(Dest, B, C - 1); end else begin SelectObject(Dest, FgPen); MoveToEx(Dest, A, C - 1, nil); LineTo(Dest, B, C - 1); end; end; Inc(P, Bitmap.RowPixelStride); end; end; finally SelectObject(Dest, Temp); end; end; begin if (Bitmap = nil) or (Bitmap.Pixels = nil) then Exit; if (Bitmap.Width <= 0) or (Bitmap.Height <= 0) then Exit; if (DstWidth <= 0) or (DstHeight <= 0) then Exit; Clip := GetDCClipRect(Dest); ZoomX := DstWidth / Bitmap.Width; ZoomY := DstHeight / Bitmap.Height; if (Floor(DstX + DX * ZoomX) >= Clip.Right) or (Floor(DstY + DY * ZoomY) >= Clip.Bottom) or (Ceil(DstX + (DX + DW) * ZoomX) < Clip.Left) or (Ceil(DstY + (DY + DH) * ZoomY) < Clip.Top) then Exit; DrawMask(DX, DY, Pred(DX + DW), Pred(DY + DH)); end; // ! SrcX < 0, SrcY < 0, SrcX + SrcWidth > Bitmap.Width, SrcY + SrcHeight > Bitmap.Height // ! results in mash procedure DrawRGB8Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB8BitmapCore); var Clip: TRect; begin if (Bitmap = nil) or (Bitmap.Pixels = nil) then Exit; if (Bitmap.Width <= 0) or (Bitmap.Height <= 0) then Exit; if (SrcWidth <= 0) or (SrcHeight <= 0) then Exit; Clip := GetDCClipRect(Dest); if (DstX >= Clip.Right) or (DstY >= Clip.Bottom) or (DstX + SrcWidth < Clip.Left) or (DstY + SrcHeight < Clip.Top) then Exit; // clipping: ClipDimension(Clip.Left, Clip.Right, DstX, SrcX, SrcWidth); ClipDimension(Clip.Top, Clip.Bottom, DstY, SrcY, SrcHeight); WidgetSetDrawRGB8Bitmap(Dest, DstX, DstY, SrcX, SrcY, SrcWidth, SrcHeight, Bitmap); end; (* LineBresenham - standard Bresenham's line plotting algorithm Note: Result depends on order of points. *) procedure LineBresenham(X1, Y1, X2, Y2: Integer; DrawPixel: TDrawPixelProcedure); var Y, X: Integer; DX, DY, SX, SY, E: Integer; begin DrawPixel(X1, Y1); if (Y1 = Y2) and (X1 = X2) then Exit; DX := X2 - X1; DY := Y2 - Y1; if DX < 0 then begin SX := -1; DX := -DX; end else SX := 1; if DY < 0 then begin SY := -1; DY := -DY; end else SY := 1; DX := DX shl 1; DY := DY shl 1; X := X1; Y := Y1; if DX > DY then begin E := DY - DX shr 1; while X <> X2 do begin if E >= 0 then begin Inc(Y, SY); Dec(E, DX); end; Inc(X, SX); Inc(E, DY); DrawPixel(X, Y); end; end else begin E := DX - DY shr 1; while Y <> Y2 do begin if E >= 0 then begin Inc(X, SX); Dec(E, DY); end; Inc(Y, SY); Inc(E, DX); DrawPixel(X, Y); end; end; end; procedure FillPixelRect(X1, Y1, X2, Y2: Integer; DrawPixel: TDrawPixelProcedure); var X, Y: Integer; begin SortRect(X1, Y1, X2, Y2); for Y := Y1 to Y2 do for X := X1 to X2 do DrawPixel(X, Y); end; procedure FillPixelRow(X1, X2, Y: Integer; DrawPixel: TDrawPixelProcedure); inline; var X: Integer; begin MinMax(X1, X2); for X := X1 to X2 do DrawPixel(X, Y); end; procedure NormalRectangle(X1, Y1, X2, Y2: Integer; DrawOutlinePixel, DrawFillPixel: TDrawPixelProcedure); var X, Y: Integer; begin SortRect(X1, Y1, X2, Y2); for X := X1 to X2 do DrawOutlinePixel(X, Y1); if Y1 < Y2 then for X := X1 to X2 do DrawOutlinePixel(X, Y2); for Y := Succ(Y1) to Pred(Y2) do begin DrawOutlinePixel(X1, Y); if X1 < X2 then DrawOutlinePixel(X2, Y); for X := Succ(X1) to Pred(X2) do DrawFillPixel(X, Y); end; end; (* EllipticRectangle - accurate elliptic rectangle plotting algorithm LX, LY - length of straight section of elliptic rectangle If both LX and LY are set to 0, the result is ellipse. *) procedure EllipticRectangle(X1, Y1, X2, Y2: Integer; LX, LY: Integer; DrawOutlinePixel, DrawFillPixel: TDrawPixelProcedure); var CX, CY, CX1, CY1, A, B, NX, NY: Single; X, Y, EX, EY: Integer; LX1, LY1: Integer; LX2, LY2: Integer; DivSqrA, DivSqrB: Single; I, J, S: Integer; EdgeList: Array of TPoint; procedure AddEdge(X, Y: Integer); begin if (EdgeList[Y].X = -1) or (X < EdgeList[Y].X) then EdgeList[Y].X := X; if (EdgeList[Y].Y = -1) or (X > EdgeList[Y].Y) then EdgeList[Y].Y := X; end; begin if (X1 = X2) and (Y1 = Y2) then begin DrawOutlinePixel(X1, Y1); Exit; end; SortRect(X1, Y1, X2, Y2); if (X2 - X1 = 1) or (Y2 - Y1 = 1) then begin FillPixelRect(X1, Y1, X2, Y2, DrawOutlinePixel); Exit; end; if (LX > X2 - X1) or (LY > Y2 - Y1) then begin NormalRectangle(X1, Y1, X2, Y2, DrawOutlinePixel, DrawFillPixel); Exit; end; SetLength(EdgeList, Ceil((Y2 - Y1 + 1) / 2)); for I := 0 to Pred(High(EdgeList)) do EdgeList[I] := Point(-1, -1); EdgeList[High(EdgeList)] := Point(0, 0); A := (X2 - X1 + 1 - LX) / 2; B := (Y2 - Y1 + 1 - LY) / 2; CX := (X2 + X1 + 1) / 2; CY := (Y2 + Y1 + 1) / 2; CX1 := X2 + 1 - A - Floor(CX); CY1 := Y2 + 1 - B - Floor(CY); EX := Floor(Sqr(A) / Sqrt(Sqr(A) + Sqr(B)) + Frac(A)); EY := Floor(Sqr(B) / Sqrt(Sqr(A) + Sqr(B)) + Frac(B)); DivSqrA := 1 / Sqr(A); DivSqrB := 1 / Sqr(B); NY := B; AddEdge(Floor(CX1), Round(CY1 + B) - 1); for X := 1 to Pred(EX) do begin NY := B * Sqrt(1 - Sqr(X + 0.5 - Frac(A)) * DivSqrA); AddEdge(Floor(CX1) + X, Round(CY1 + NY) - 1); end; LX1 := Floor(CX1) + Pred(EX); LY1 := Round(CY1 + NY) - 1; NX := A; AddEdge(Round(CX1 + A) - 1, Floor(CY1)); for Y := 1 to Pred(EY) do begin NX := A * Sqrt(1 - Sqr(Y + 0.5 - Frac(B)) * DivSqrB); AddEdge(Round(CX1 + NX) - 1, Floor(CY1) + Y); end; LX2 := Round(CX1 + NX) - 1; LY2 := Floor(CY1) + Pred(EY); if Abs(LX1 - LX2) > 1 then begin if Abs(LY1 - LY2) > 1 then AddEdge(LX1 + 1, LY1 - 1) else AddEdge(LX1 + 1, LY1); end else if Abs(LY1 - LY2) > 1 then AddEdge(LX2, LY1 - 1); for I := 0 to High(EdgeList) do begin if EdgeList[I].X = -1 then EdgeList[I] := Point(Round(CX1 + A) - 1, Round(CX1 + A) - 1) else Break; end; for J := 0 to High(EdgeList) do begin if (J = 0) and (Frac(CY) > 0) then begin for I := EdgeList[J].X to EdgeList[J].Y do begin DrawOutlinePixel(Floor(CX) + I, Floor(CY) + J); DrawOutlinePixel(Ceil(CX) - Succ(I), Floor(CY) + J); end; for I := Ceil(CX) - EdgeList[J].X to Floor(CX) + Pred(EdgeList[J].X) do begin DrawFillPixel(I, Floor(CY) + J); end; end else if (J = High(EdgeList)) then begin if Frac(CX) > 0 then S := -EdgeList[J].Y else S := -Succ(EdgeList[J].Y); for I := S to EdgeList[J].Y do begin DrawOutlinePixel(Floor(CX) + I, Floor(CY) + J); DrawOutlinePixel(Floor(CX) + I, Ceil(CY) - Succ(J)); end; end else begin for I := EdgeList[J].X to EdgeList[J].Y do begin DrawOutlinePixel(Floor(CX) + I, Floor(CY) + J); DrawOutlinePixel(Floor(CX) + I, Ceil(CY) - Succ(J)); if Floor(CX) + I <> Ceil(CX) - Succ(I) then begin DrawOutlinePixel(Ceil(CX) - Succ(I), Floor(CY) + J); DrawOutlinePixel(Ceil(CX) - Succ(I), Ceil(CY) - Succ(J)); end; end; for I := Ceil(CX) - EdgeList[J].X to Floor(CX) + Pred(EdgeList[J].X) do begin DrawFillPixel(I, Floor(CY) + J); DrawFillPixel(I, Ceil(CY) - Succ(J)); end; end; end; end; (* FloodFillScanLine - 4-directional scan line stack based flood fill algorithm with control of visited pixels. *) procedure FloodFillScanLine(X, Y, W, H: Integer; GetPixel: TGetPixelFunction; SamePixel: TSamePixelFunction; DrawPixel: TDrawPixelProcedure); var S: TRGB32Pixel; SX, EX, I: Integer; Added: Boolean; Visited: Array of Byte; Stack: Array of Integer; StackCount: Integer; function CheckPixel(AX, AY: Integer): Boolean; inline; begin if Visited[AX + AY * W] = 1 then Result := False else begin Result := SamePixel(AX, AY, S); end; end; procedure Push(AX, AY: Integer); inline; begin if StackCount >= High(Stack) then SetLength(Stack, Length(Stack) shl 1); Stack[StackCount] := AX or (AY shl 16); Inc(StackCount); end; procedure Pop(var AX, AY: Integer); inline; begin Dec(StackCount); AX := Stack[StackCount] and $FFFF; AY := (Stack[StackCount] shr 16) and $FFFF; end; begin if (X >= 0) and (X < W) and (Y >= 0) and (Y < H) then begin S := GetPixel(X, Y); SetLength(Stack, 1); StackCount := 0; SetLength(Visited, W * H); FillChar(Visited[0], Length(Visited), #0); Push(X, Y); repeat Pop(X, Y); if not CheckPixel(X, Y) then Continue; SX := X; while (SX > 0) and CheckPixel(Pred(SX), Y) do Dec(SX); EX := X; while (EX < Pred(W)) and CheckPixel(Succ(EX), Y) do Inc(EX); FillChar(Visited[SX + Y * W], Succ(EX - SX), #1); FillPixelRow(SX, EX, Y, DrawPixel); Added := False; if Y > 0 then for I := SX to EX do if CheckPixel(I, Pred(Y)) then begin if Added then Continue; Push(I, Pred(Y)); Added := True; end else Added := False; Added := False; if Y < Pred(H) then for I := SX to EX do if CheckPixel(I, Succ(Y)) then begin if Added then Continue; Push(I, Succ(Y)); Added := True; end else Added := False; until StackCount <= 0; end; end; end. mricron-0.20120505.1~dfsg.1.orig/rgb/rgbqtroutines.pas0000664000175000017500000000655411326434470022055 0ustar michaelmichael{ /*************************************************************************** RGBQtRoutines.pas ***************************************************************************/ ***************************************************************************** * * * See the file COPYING.modifiedLGPL, included in this distribution, * * for details about the copyright. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * * ***************************************************************************** Author: Tom Gregorovic (_tom_@centrum.cz) Abstract: This unit contains routines for Qt interface. } unit RGBQtRoutines; {$ifdef fpc} {$mode objfpc}{$H+} {$endif} interface uses SysUtils, Types, LCLType, Qt4, QtObjects, Classes, RGBTypes; procedure WidgetSetDrawRGB32Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); procedure WidgetSetStretchDrawRGB32Bitmap(Dest: HDC; DstX, DstY, DstWidth, DstHeight: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); procedure WidgetSetDrawRGB8Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB8BitmapCore); implementation procedure WidgetSetDrawRGB32Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); begin WidgetSetStretchDrawRGB32Bitmap(Dest, DstX, DstY, SrcWidth, SrcHeight, SrcX, SrcY, SrcWidth, SrcHeight, Bitmap); end; procedure WidgetSetStretchDrawRGB32Bitmap(Dest: HDC; DstX, DstY, DstWidth, DstHeight: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); var DstQDC: TQtDeviceContext absolute Dest; SrcRect, DstRect: TRect; Image: TQtImage; begin DstRect := Bounds(DstX, DstY, DstWidth, DstHeight); SrcRect := Bounds(SrcX, SrcY, SrcWidth, SrcHeight); Image := TQtImage.Create(Bitmap.Pixels, Bitmap.Width, Bitmap.Height, QImageFormat_RGB32); try QPainter_drawImage(DstQDC.Widget, PRect(@DstRect), Image.Handle, @SrcRect, QtAutoColor); finally Image.Free; end; end; procedure WidgetSetDrawRGB8Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB8BitmapCore); var DstQDC: TQtDeviceContext absolute Dest; SrcRect, DstRect: TRect; Image: TQtImage; I: Integer; begin DstRect := Bounds(DstX, DstY, SrcWidth, SrcHeight); SrcRect := Bounds(SrcX, SrcY, SrcWidth, SrcHeight); Image := TQtImage.Create(Bitmap.Pixels, Bitmap.Width, Bitmap.Height, QImageFormat_Indexed8); try // initialize palette for I := 0 to 255 do QImage_setColor(Image.Handle, I, I + I shl 8 + I shl 16 + $FF shl 24); QPainter_drawImage(DstQDC.Widget, PRect(@DstRect), Image.Handle, @SrcRect, QtAutoColor); finally Image.Free; end; end; end. mricron-0.20120505.1~dfsg.1.orig/rgb/rgbgtkroutines.pas0000664000175000017500000000525511540116236022206 0ustar michaelmichael{ /*************************************************************************** RGBGTKRoutines.pas ***************************************************************************/ ***************************************************************************** * * * See the file COPYING.modifiedLGPL, included in this distribution, * * for details about the copyright. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * * ***************************************************************************** Author: Tom Gregorovic (_tom_@centrum.cz) Abstract: This unit contains routines for GTK interfaces. } unit RGBGTKRoutines; {$ifdef fpc} {$mode objfpc}{$H+} {$endif} interface uses SysUtils, Classes, LCLType, {$IFDEF LCLgtk2} gtkDef, //<- uncomment for older versions of Lazarus glib2, gdk2,gtk2Def, gtk2Proc, {$ELSE} //LCLgtk1 glib, gdk, gtkDef, gtkProc, {$ENDIF} RGBTypes; procedure WidgetSetDrawRGB32Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); procedure WidgetSetDrawRGB8Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB8BitmapCore); implementation procedure WidgetSetDrawRGB32Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); var P: TPoint; begin P := TGtkDeviceContext(Dest).Offset; //<- if compiler stops here, uncomment gtkDef in Uses Inc(DstX, P.X); Inc(DstY, P.Y); gdk_draw_rgb_32_image(TGtkDeviceContext(Dest).Drawable, TGtkDeviceContext(Dest).GC, DstX, DstY, SrcWidth, SrcHeight, GDK_RGB_DITHER_NONE, Pguchar(Bitmap.GetPixelPtrUnsafe(SrcX, SrcY)), Bitmap.RowPixelStride shl 2); end; procedure WidgetSetDrawRGB8Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB8BitmapCore); var P: TPoint; begin P := TGtkDeviceContext(Dest).Offset; Inc(DstX, P.X); Inc(DstY, P.Y); gdk_draw_gray_image(TGtkDeviceContext(Dest).Drawable, TGtkDeviceContext(Dest).GC, DstX, DstY, SrcWidth, SrcHeight, GDK_RGB_DITHER_NONE, Pguchar(Bitmap.Get8PixelPtrUnsafe(SrcX, SrcY)), Bitmap.RowPixelStride); end; initialization gdk_rgb_init; end. mricron-0.20120505.1~dfsg.1.orig/rgb/rgbgraphics.pas0000664000175000017500000006535311326434470021442 0ustar michaelmichael{ /*************************************************************************** RGBGraphics.pas ***************************************************************************/ ***************************************************************************** * * * See the file COPYING.modifiedLGPL, included in this distribution, * * for details about the copyright. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * * ***************************************************************************** Author: Tom Gregorovic (_tom_@centrum.cz) Abstract: TRGB32Bitmap is a memory image which allows fast pixel manipulations. TRGB32Canvas is a TRGB32Bitmap canvas for drawing primitives and drawing bitmap image into TCanvas. } unit RGBGraphics; {$ifdef fpc} {$mode objfpc}{$H+} {$endif} interface uses Classes, SysUtils, LCLIntf, FPWriteBMP, LCLType, LCLProc, FPImage, LResources, IntfGraphics, GraphType, Graphics, Forms, Math, Clipbrd, RGBTypes, RGBRoutines, RGBUtils; type TEraseMode = (ermNone, ermErase, ermReplace); TDrawMode = (dmFillAndOutline, dmOutline, dmFill); TRandomDensity = Word; const MAXRANDOMDENSITY = $FFFF; type TMaskFillMode = (mfAdd, mfRemove, mfXOR); { TRGBMask } TRGBMask = class(TRGB8BitmapCore) private FBGPen: TPen; FFGPen: TPen; FFillMode: TMaskFillMode; FMaskedPixels: Integer; protected procedure AddPixel(X, Y: Integer); procedure RemovePixel(X, Y: Integer); procedure XORPixel(X, Y: Integer); procedure CreatePens; virtual; function GetFillProcedure: TDrawPixelProcedure; virtual; function GetMaskedPixelsCount: Integer; public constructor Create(AWidth, AHeight: Integer); override; constructor CreateAsCopy(ABitmap: TRGBBitmapCore); override; destructor Destroy; override; procedure LoadFromLazIntfImageAlpha(AImage: TLazIntfImage); override; procedure SwapWith(ABitmap: TRGBBitmapCore); override; procedure Assign(Source: TPersistent); override; procedure UpdateMaskedPixels; procedure Draw(X, Y: Integer; AMask: TRGBMask); procedure DrawShapeTo(ACanvas: TCanvas; X, Y: Integer); procedure StretchDrawShapeTo(ACanvas: TCanvas; DstX, DstY, DstWidth, DstHeight: Integer); procedure StretchDrawShapePortionTo(ACanvas: TCanvas; DstX, DstY, DstWidth, DstHeight: Integer; DX, DY, DW, DH: Integer); procedure DrawTo(ACanvas: TCanvas; X, Y: Integer); procedure StretchTrunc(AWidth, AHeight: Integer); virtual; procedure Rectangle(X1, Y1, X2, Y2: Integer); procedure Ellipse(X1, Y1, X2, Y2: Integer); procedure Clear; override; procedure ClearWhite; override; procedure Invert; override; public function IsEmpty: Boolean; function GetMaskedRect: TRect; property BackgroundPen: TPen read FBGPen; property ForegroundPen: TPen read FFGPen; property FillMode: TMaskFillMode read FFillMode write FFillMode; end; { TRGB32Canvas } TRGB32Canvas = class private FDrawMode: TDrawMode; FEraseMode: TEraseMode; FFillColor: TRGB32Pixel; FFloodFillTolerance: TPixelDifference; FOutlineColor: TRGB32Pixel; FOwner: TRGB32BitmapCore; FPaperColor: TRGB32Pixel; FRandomDensity: TRandomDensity; FRandomEnabled: Boolean; FRectangleRoundness: Integer; function GetFillColor: TColor; function GetOutlineColor: TColor; function GetPaperColor: TColor; procedure SetFillColor(const AValue: TColor); procedure SetOutlineColor(const AValue: TColor); procedure SetPaperColor(const AValue: TColor); protected function PixelMasked(X, Y: Integer): Boolean; function SamePixelUnsafe(X, Y: Integer; Value: TRGB32Pixel): Boolean; function SamePixelUnmasked(X, Y: Integer; Value: TRGB32Pixel): Boolean; procedure DrawOutlinePixel(X, Y: Integer); procedure DrawFillPixel(X, Y: Integer); procedure DrawPaperPixel(X, Y: Integer); procedure DrawReplacePixel(X, Y: Integer); procedure DrawRandomOutlinePixel(X, Y: Integer); procedure DrawRandomFillPixel(X, Y: Integer); procedure DrawRandomPaperPixel(X, Y: Integer); procedure DrawEmptyPixel(X, Y: Integer); function GetOutlineProcedure: TDrawPixelProcedure; virtual; function GetFillProcedure: TDrawPixelProcedure; virtual; public constructor Create(AOwner: TRGB32BitmapCore); procedure SetColor(X, Y: Integer; Value: TColor); function GetColor(X, Y: Integer): TColor; procedure Fill(Color: TColor); procedure FillRect(X1, Y1, X2, Y2: Integer); procedure FillEllipse(X1, Y1, X2, Y2: Integer); procedure Line(X1, Y1, X2, Y2: Integer); procedure Rectangle(X1, Y1, X2, Y2: Integer); procedure Ellipse(X1, Y1, X2, Y2: Integer); procedure FloodFill(X, Y: Integer); procedure MaskFloodFill(X, Y: Integer); public procedure DrawTo(ACanvas: TCanvas; X, Y: Integer); procedure StretchDrawTo(ACanvas: TCanvas; DstX, DstY, DstWidth, DstHeight: Integer); public property EraseMode: TEraseMode read FEraseMode write FEraseMode; property DrawMode: TDrawMode read FDrawMode write FDrawMode; property FloodFillTolerance: TPixelDifference read FFloodFillTolerance write FFloodFillTolerance; property FillColor: TColor read GetFillColor write SetFillColor; property OutlineColor: TColor read GetOutlineColor write SetOutlineColor; property PaperColor: TColor read GetPaperColor write SetPaperColor; property RandomEnabled: Boolean read FRandomEnabled write FRandomEnabled; property RandomDensity: TRandomDensity read FRandomDensity write FRandomDensity; property RectangleRoundness: Integer read FRectangleRoundness write FRectangleRoundness; end; TSmoothMethod = (smAreaPixel, smBilinear, smBicubic); { TRGB32Bitmap } TRGB32Bitmap = class(TRGB32BitmapCore) private FCanvas: TRGB32Canvas; FMask: TRGBMask; protected function CreateDefaultLazIntfImage: TLazIntfImage; public constructor Create(AWidth, AHeight: Integer); override; constructor CreateAsCopy(ABitmap: TRGBBitmapCore); override; constructor CreateFromLazIntfImage(AImage: TLazIntfImage); override; constructor CreateFromFile(const FileName: String); virtual; constructor CreateFromBitmap(ABitmap: TRasterImage); virtual; destructor Destroy; override; procedure Assign(Source: TPersistent); override; procedure SwapWith(ABitmap: TRGBBitmapCore); override; procedure SaveToLazIntfImage(AImage: TLazIntfImage; const ARect: TRect); override; procedure SaveToStream(Stream: TStream); virtual; procedure SaveToStream(Stream: TStream; AWriterClass: TFPCustomImageWriterClass); virtual; procedure SaveToStream(Stream: TStream; const ARect: TRect; AWriterClass: TFPCustomImageWriterClass); virtual; procedure SaveToFile(const FileName: String); virtual; procedure SaveToLazarusResource(const FileName, Name: String); virtual; public procedure Draw(X, Y: Integer; ABitmap: TRGB32Bitmap); procedure StretchTrunc(AWidth, AHeight: Integer); virtual; procedure StretchSmooth(AWidth, AHeight: Integer; Method: TSmoothMethod); virtual; procedure Grayscale; virtual; procedure Disable; virtual; procedure CutToClipboard; virtual; procedure CopyToClipboard; virtual; procedure Delete; virtual; procedure FlipHorz; override; procedure FlipVert; override; procedure Rotate90; override; procedure Rotate180; override; procedure Rotate270; override; public property Canvas: TRGB32Canvas read FCanvas; property Mask: TRGBMask read FMask write FMask; end; implementation function AbsByte(Src: Integer): Byte; inline; begin if Src >= 0 then Result := Src else Result := -Src; end; function RGB32PixelDifference(A, B: TRGB32Pixel): TPixelDifference; inline; begin Result := AbsByte(((A shr 16) and $FF) - ((B shr 16) and $FF)) + AbsByte(((A shr 8) and $FF) - ((B shr 8) and $FF)) + AbsByte((A and $FF) - (B and $FF)); end; { TRGB32Bitmap } function TRGB32Bitmap.CreateDefaultLazIntfImage: TLazIntfImage; var RID: TRawImageDescription; DC: HDC; begin DC := GetDC(0); try RawImage_DescriptionFromDevice(DC, RID); finally ReleaseDC(0, DC); end; Result := TLazIntfImage.Create(0, 0); Result.DataDescription := RID; end; constructor TRGB32Bitmap.Create(AWidth, AHeight: Integer); begin inherited; FCanvas := TRGB32Canvas.Create(Self); FMask := TRGBMask.Create(AWidth, AHeight); end; constructor TRGB32Bitmap.CreateAsCopy(ABitmap: TRGBBitmapCore); begin inherited; FCanvas := TRGB32Canvas.Create(Self); if ABitmap is TRGB32Bitmap then FMask := TRGBMask.CreateAsCopy((ABitmap as TRGB32Bitmap).Mask) else FMask := TRGBMask.Create(ABitmap.Width, ABitmap.Height); end; constructor TRGB32Bitmap.CreateFromLazIntfImage(AImage: TLazIntfImage); begin inherited CreateFromLazIntfImage(AImage); FMask.LoadFromLazIntfImageAlpha(AImage); end; constructor TRGB32Bitmap.CreateFromFile(const FileName: String); var Image: TLazIntfImage; begin Image := CreateDefaultLazIntfImage; try Image.LoadFromFile(FileName); CreateFromLazIntfImage(Image); finally Image.Free; end; end; constructor TRGB32Bitmap.CreateFromBitmap(ABitmap: TRasterImage); var Image: TLazIntfImage; begin Image := ABitmap.CreateIntfImage; try CreateFromLazIntfImage(Image); finally Image.Free; end; end; destructor TRGB32Bitmap.Destroy; begin FCanvas.Free; FMask.Free; inherited; end; procedure TRGB32Bitmap.Assign(Source: TPersistent); begin inherited Assign(Source); if Source is TRGB32Bitmap then begin Mask.Assign((Source as TRGB32Bitmap).Mask); end; end; procedure TRGB32Bitmap.SwapWith(ABitmap: TRGBBitmapCore); begin inherited SwapWith(ABitmap); if ABitmap is TRGB32Bitmap then begin Mask.SwapWith((ABitmap as TRGB32Bitmap).Mask); end; end; procedure TRGB32Bitmap.SaveToLazIntfImage(AImage: TLazIntfImage; const ARect: TRect); begin inherited SaveToLazIntfImage(AImage, ARect); if not Mask.IsEmpty then FMask.SaveToLazIntfImageAlpha(AImage, ARect); end; procedure TRGB32Bitmap.SaveToStream(Stream: TStream); begin SaveToStream(Stream, Bounds(0, 0, Width, Height), TLazWriterXPM); end; procedure TRGB32Bitmap.SaveToStream(Stream: TStream; AWriterClass: TFPCustomImageWriterClass); begin SaveToStream(Stream, Bounds(0, 0, Width, Height), AWriterClass); end; procedure TRGB32Bitmap.SaveToStream(Stream: TStream; const ARect: TRect; AWriterClass: TFPCustomImageWriterClass); var Image: TLazIntfImage; Writer: TFPCustomImageWriter; begin Image := CreateDefaultLazIntfImage; Writer := AWriterClass.Create; try SaveToLazIntfImage(Image, ARect); Image.SaveToStream(Stream, Writer); finally Writer.Free; Image.Free; end; end; procedure TRGB32Bitmap.SaveToFile(const FileName: String); var Image: TLazIntfImage; begin Image := CreateDefaultLazIntfImage; try inherited SaveToLazIntfImage(Image); Image.SaveToFile(FileName); finally Image.Free; end; end; procedure TRGB32Bitmap.SaveToLazarusResource(const FileName, Name: String); var PixmapStream, ResourceStream: TMemoryStream; FileStream: TFileStream; begin PixmapStream := TMemoryStream.Create; ResourceStream := TMemoryStream.Create; try SaveToStream(PixmapStream); PixmapStream.Position := 0; BinaryToLazarusResourceCode(PixmapStream, ResourceStream, Name, 'XPM'); ResourceStream.Position := 0; FileStream := TFileStream.Create(FileName, fmCreate); try FileStream.CopyFrom(ResourceStream, ResourceStream.Size); finally FileStream.Free; end; finally PixmapStream.Free; ResourceStream.Free; end; end; procedure TRGB32Bitmap.Draw(X, Y: Integer; ABitmap: TRGB32Bitmap); begin DrawRGB32Bitmap(Self, X, Y, ABitmap); end; procedure TRGB32Bitmap.StretchTrunc(AWidth, AHeight: Integer); var Result: TRGB32Bitmap; begin if (AWidth = Width) and (AHeight = Height) then Exit; Result := TRGB32Bitmap.Create(AWidth, AHeight); try StretchRGB32BitmapTrunc(Result, Self); inherited SwapWith(Result); Mask.StretchTrunc(AWidth, AHeight); finally FreeAndNil(Result); end; end; procedure TRGB32Bitmap.StretchSmooth(AWidth, AHeight: Integer; Method: TSmoothMethod); begin // end; procedure TRGB32Bitmap.Grayscale; begin GrayscaleRGB32Bitmap(Self); end; procedure TRGB32Bitmap.Disable; begin DisableRGB32Bitmap(Self); end; procedure TRGB32Bitmap.CutToClipboard; begin CopyToClipboard; Delete; end; procedure TRGB32Bitmap.CopyToClipboard; var PixmapStream, BitmapStream: TMemoryStream; PixmapWriter, BitmapWriter: TFPCustomImageWriter; Image: TLazIntfImage; R: TRect; begin PixmapStream := TMemoryStream.Create; BitmapStream := TMemoryStream.Create; Image := CreateDefaultLazIntfImage; PixmapWriter := TLazWriterXPM.Create; BitmapWriter := TFPWriterBMP.Create; try R := Mask.GetMaskedRect; SaveToLazIntfImage(Image, R); Clipboard.Open; try Clipboard.Clear; Image.SaveToStream(PixmapStream, PixmapWriter); Clipboard.AddFormat(PredefinedClipboardFormat(pcfPixmap), PixmapStream); Image.SaveToStream(BitmapStream, BitmapWriter); Clipboard.AddFormat(PredefinedClipboardFormat(pcfBitmap), BitmapStream); finally Clipboard.Close; end; finally PixmapStream.Free; BitmapStream.Free; Image.Free; PixmapWriter.Free; BitmapWriter.Free; end; end; procedure TRGB32Bitmap.Delete; begin Canvas.Fill(Canvas.PaperColor); end; procedure TRGB32Bitmap.FlipHorz; begin inherited FlipHorz; Mask.FlipHorz; end; procedure TRGB32Bitmap.FlipVert; begin inherited FlipVert; Mask.FlipVert; end; procedure TRGB32Bitmap.Rotate90; begin inherited Rotate90; Mask.Rotate90; end; procedure TRGB32Bitmap.Rotate180; begin inherited Rotate180; Mask.Rotate180; end; procedure TRGB32Bitmap.Rotate270; begin inherited Rotate270; Mask.Rotate270; end; { TRGB32Canvas } constructor TRGB32Canvas.Create(AOwner: TRGB32BitmapCore); begin inherited Create; FOwner := AOwner; FRandomDensity := MAXRANDOMDENSITY; FFloodFillTolerance := 0; FRectangleRoundness := 0; end; procedure TRGB32Canvas.SetColor(X, Y: Integer; Value: TColor); begin FOwner.Set32Pixel(X, Y, ColorToRGB32Pixel(Value)); end; function TRGB32Canvas.GetColor(X, Y: Integer): TColor; var P: PRGB32Pixel; begin P := FOwner.Get32PixelPtr(X, Y); if P <> nil then Result := RGB32PixelToColor(P^) else Result := clNone; end; function TRGB32Canvas.GetFillColor: TColor; begin Result := RGB32PixelToColor(FFillColor); end; function TRGB32Canvas.GetOutlineColor: TColor; begin Result := RGB32PixelToColor(FOutlineColor); end; function TRGB32Canvas.GetPaperColor: TColor; begin Result := RGB32PixelToColor(FPaperColor); end; procedure TRGB32Canvas.SetFillColor(const AValue: TColor); begin FFillColor := ColorToRGB32Pixel(AValue); end; procedure TRGB32Canvas.SetOutlineColor(const AValue: TColor); begin FOutlineColor := ColorToRGB32Pixel(AValue); end; procedure TRGB32Canvas.SetPaperColor(const AValue: TColor); begin FPaperColor := ColorToRGB32Pixel(AValue); end; function TRGB32Canvas.PixelMasked(X, Y: Integer): Boolean; var P: PRGB8Pixel; begin if not (FOwner is TRGB32Bitmap) then Result := True else if (FOwner as TRGB32Bitmap).Mask.IsEmpty then Result := True else begin P := (FOwner as TRGB32Bitmap).Mask.Get8PixelPtr(X, Y); Result := (P <> nil) and (P^ = $FF); end; end; function TRGB32Canvas.SamePixelUnsafe(X, Y: Integer; Value: TRGB32Pixel): Boolean; begin Result := PixelMasked(X, Y) and (RGB32PixelDifference(FOwner.Get32PixelUnsafe(X, Y), Value) <= FFloodFillTolerance); end; function TRGB32Canvas.SamePixelUnmasked(X, Y: Integer; Value: TRGB32Pixel): Boolean; begin Result := RGB32PixelDifference(FOwner.Get32PixelUnsafe(X, Y), Value) <= FFloodFillTolerance; end; procedure TRGB32Canvas.DrawOutlinePixel(X, Y: Integer); begin if PixelMasked(X, Y) then FOwner.Set32Pixel(X, Y, FOutlineColor); end; procedure TRGB32Canvas.DrawFillPixel(X, Y: Integer); begin if PixelMasked(X, Y) then FOwner.Set32Pixel(X, Y, FFillColor); end; procedure TRGB32Canvas.DrawPaperPixel(X, Y: Integer); begin if PixelMasked(X, Y) then FOwner.Set32Pixel(X, Y, FPaperColor); end; procedure TRGB32Canvas.DrawReplacePixel(X, Y: Integer); var P: PRGB32Pixel; begin if not PixelMasked(X, Y) then Exit; P := FOwner.Get32PixelPtr(X, Y); if (P <> nil) and (P^ = FFillColor) then P^ := FPaperColor; end; procedure TRGB32Canvas.DrawRandomOutlinePixel(X, Y: Integer); begin if PixelMasked(X, Y) and (Random(MAXRANDOMDENSITY) < FRandomDensity) then FOwner.Set32Pixel(X, Y, FOutlineColor); end; procedure TRGB32Canvas.DrawRandomFillPixel(X, Y: Integer); begin if PixelMasked(X, Y) and (Random(MAXRANDOMDENSITY) < FRandomDensity) then FOwner.Set32Pixel(X, Y, FFillColor); end; procedure TRGB32Canvas.DrawRandomPaperPixel(X, Y: Integer); begin if PixelMasked(X, Y) and (Random(MAXRANDOMDENSITY) < FRandomDensity) then FOwner.Set32Pixel(X, Y, FPaperColor); end; procedure TRGB32Canvas.DrawEmptyPixel(X, Y: Integer); begin // end; function TRGB32Canvas.GetOutlineProcedure: TDrawPixelProcedure; begin if not FRandomEnabled then begin case DrawMode of dmFillAndOutline, dmOutline: begin case EraseMode of ermNone: Result := @DrawOutlinePixel; ermErase: Result := @DrawPaperPixel; ermReplace: Result := @DrawReplacePixel; end; end; else Result := @DrawEmptyPixel; end; end else begin case EraseMode of ermNone: Result := @DrawRandomFillPixel; ermErase: Result := @DrawRandomPaperPixel; ermReplace: Result := @DrawRandomFillPixel; end; end; end; function TRGB32Canvas.GetFillProcedure: TDrawPixelProcedure; begin if not FRandomEnabled then begin case DrawMode of dmFillAndOutline, dmFill: begin case EraseMode of ermNone: Result := @DrawFillPixel; ermErase: Result := @DrawPaperPixel; ermReplace: Result := @DrawReplacePixel; end; end; else Result := @DrawEmptyPixel; end; end else begin case EraseMode of ermNone: Result := @DrawRandomFillPixel; ermErase: Result := @DrawRandomPaperPixel; ermReplace: Result := @DrawRandomFillPixel; end; end; end; procedure TRGB32Canvas.Fill(Color: TColor); var P: PRGB32Pixel; C: TRGB32Pixel; PM: PRGB8Pixel; I, J: Integer; begin C := ColorToRGB32Pixel(Color); for J := 0 to Pred(FOwner.Height) do begin P := FOwner.Get32PixelPtr(0, J); if (FOwner is TRGB32Bitmap) and not (FOwner as TRGB32Bitmap).Mask.IsEmpty then begin PM := (FOwner as TRGB32Bitmap).Mask.Get8PixelPtr(0, J); for I := 0 to Pred(FOwner.Width) do begin if PM^ = $FF then P^ := C; Inc(P); Inc(PM); end; end else FillDWord(P^, FOwner.Width, C); end; end; procedure TRGB32Canvas.FillRect(X1, Y1, X2, Y2: Integer); begin FillPixelRect(X1, Y1, X2, Y2, GetFillProcedure); end; procedure TRGB32Canvas.FillEllipse(X1, Y1, X2, Y2: Integer); begin EllipticRectangle(X1, Y1, X2, Y2, 0, 0, GetFillProcedure, GetFillProcedure); end; procedure TRGB32Canvas.Line(X1, Y1, X2, Y2: Integer); begin LineBresenham(X1, Y1, X2, Y2, GetOutlineProcedure); end; procedure TRGB32Canvas.Rectangle(X1, Y1, X2, Y2: Integer); var R1, R2: Integer; begin R1 := Max(0, Succ(Abs(X2 - X1)) - RectangleRoundness); R2 := Max(0, Succ(Abs(Y2 - Y1)) - RectangleRoundness); EllipticRectangle(X1, Y1, X2, Y2, R1, R2, GetOutlineProcedure, GetFillProcedure); end; procedure TRGB32Canvas.Ellipse(X1, Y1, X2, Y2: Integer); begin EllipticRectangle(X1, Y1, X2, Y2, 0, 0, GetOutlineProcedure, GetFillProcedure); end; procedure TRGB32Canvas.FloodFill(X, Y: Integer); begin case EraseMode of ermNone: FloodFillScanLine(X, Y, FOwner.Width, FOwner.Height, @FOwner.Get32PixelUnsafe, @SamePixelUnsafe, @DrawFillPixel); ermErase: FloodFillScanLine(X, Y, FOwner.Width, FOwner.Height, @FOwner.Get32PixelUnsafe, @SamePixelUnsafe, @DrawPaperPixel); end; end; procedure TRGB32Canvas.MaskFloodFill(X, Y: Integer); begin if not (FOwner is TRGB32Bitmap) then Exit; FloodFillScanLine(X, Y, FOwner.Width, FOwner.Height, @FOwner.Get32PixelUnsafe, @SamePixelUnmasked, (FOwner as TRGB32Bitmap).Mask.GetFillProcedure);; end; procedure TRGB32Canvas.DrawTo(ACanvas: TCanvas; X, Y: Integer); begin if ACanvas <> nil then with FOwner do DrawRGB32Bitmap(ACanvas.Handle, X, Y, 0, 0, Width, Height, FOwner); end; procedure TRGB32Canvas.StretchDrawTo(ACanvas: TCanvas; DstX, DstY, DstWidth, DstHeight: Integer); begin if ACanvas <> nil then with FOwner do StretchDrawRGB32Bitmap(ACanvas.Handle, DstX, DstY, DstWidth, DstHeight, 0, 0, Width, Height, FOwner); end; { TRGBMask } procedure TRGBMask.AddPixel(X, Y: Integer); var P: PRGB8Pixel; begin P := Get8PixelPtr(X, Y); if P <> nil then begin if P^ <> $FF then Inc(FMaskedPixels); P^ := $FF; end; end; procedure TRGBMask.RemovePixel(X, Y: Integer); var P: PRGB8Pixel; begin P := Get8PixelPtr(X, Y); if P <> nil then begin if P^ = $FF then Dec(FMaskedPixels); P^ := 0; end; end; procedure TRGBMask.XORPixel(X, Y: Integer); var P: PRGB8Pixel; begin P := Get8PixelPtr(X, Y); if P <> nil then begin if P^ = 0 then Inc(FMaskedPixels); if P^ = $FF then Dec(FMaskedPixels); P^ := $FF - P^; end; end; procedure TRGBMask.CreatePens; begin FBGPen := TPen.Create; FBGPen.Color := clYellow; FFGPen := TPen.Create; FFGPen.Color := clBlue; //FFGPen.Style := psDot; end; function TRGBMask.GetFillProcedure: TDrawPixelProcedure; begin case FillMode of mfAdd: Result := @AddPixel; mfRemove: Result := @RemovePixel; mfXOR: Result := @XORPixel; end; end; function TRGBMask.GetMaskedPixelsCount: Integer; var I, J: Integer; P: PRGB8Pixel; begin Result := 0; for J := 0 to Pred(Height) do begin P := Get8PixelPtr(0, J); for I := 0 to Pred(Width) do begin if P^ = $FF then Inc(Result); Inc(P); end; end; end; constructor TRGBMask.Create(AWidth, AHeight: Integer); begin inherited Create(AWidth, AHeight); Clear; CreatePens; end; constructor TRGBMask.CreateAsCopy(ABitmap: TRGBBitmapCore); begin inherited CreateAsCopy(ABitmap); UpdateMaskedPixels; CreatePens; end; procedure TRGBMask.SwapWith(ABitmap: TRGBBitmapCore); begin inherited SwapWith(ABitmap); UpdateMaskedPixels; end; procedure TRGBMask.Assign(Source: TPersistent); begin inherited Assign(Source); UpdateMaskedPixels; end; procedure TRGBMask.UpdateMaskedPixels; begin FMaskedPixels := GetMaskedPixelsCount; end; procedure TRGBMask.Draw(X, Y: Integer; AMask: TRGBMask); begin DrawRGB8Bitmap(Self, X, Y, AMask); UpdateMaskedPixels; end; destructor TRGBMask.Destroy; begin FBGPen.Free; FFGPen.Free; inherited Destroy; end; procedure TRGBMask.LoadFromLazIntfImageAlpha(AImage: TLazIntfImage); begin inherited LoadFromLazIntfImageAlpha(AImage); UpdateMaskedPixels; end; procedure TRGBMask.DrawShapeTo(ACanvas: TCanvas; X, Y: Integer); begin StretchDrawShapeTo(ACanvas, X, Y, Width, Height); end; procedure TRGBMask.StretchDrawShapeTo(ACanvas: TCanvas; DstX, DstY, DstWidth, DstHeight: Integer); begin StretchDrawShapePortionTo(ACanvas, DstX, DstY, DstWidth, DstHeight, 0, 0, Width, Height); end; procedure TRGBMask.StretchDrawShapePortionTo(ACanvas: TCanvas; DstX, DstY, DstWidth, DstHeight: Integer; DX, DY, DW, DH: Integer); begin if ACanvas <> nil then StretchDrawRGBMaskShapePortion(ACanvas.Handle, DstX, DstY, DstWidth, DstHeight, Self, DX, DY, DW, DH, FBGPen.Reference.Handle, FFGPen.Reference.Handle); end; procedure TRGBMask.DrawTo(ACanvas: TCanvas; X, Y: Integer); begin if ACanvas <> nil then DrawRGB8Bitmap(ACanvas.Handle, X, Y, 0, 0, Width, Height, Self); end; procedure TRGBMask.StretchTrunc(AWidth, AHeight: Integer); var Result: TRGBMask; begin if (AWidth = Width) and (AHeight = Height) then Exit; Result := TRGBMask.Create(AWidth, AHeight); try StretchRGB8BitmapTrunc(Result, Self); SwapWith(Result); FMaskedPixels := GetMaskedPixelsCount; finally FreeAndNil(Result); end; end; procedure TRGBMask.Rectangle(X1, Y1, X2, Y2: Integer); begin FillPixelRect(X1, Y1, X2, Y2, GetFillProcedure); end; procedure TRGBMask.Ellipse(X1, Y1, X2, Y2: Integer); begin EllipticRectangle(X1, Y1, X2, Y2, 0, 0, GetFillProcedure, GetFillProcedure); end; procedure TRGBMask.Clear; begin inherited Clear; FMaskedPixels := 0; end; procedure TRGBMask.ClearWhite; begin inherited ClearWhite; FMaskedPixels := Width * Height; end; procedure TRGBMask.Invert; begin inherited Invert; FMaskedPixels := Width * Height - FMaskedPixels; end; function TRGBMask.IsEmpty: Boolean; begin Result := FMaskedPixels = 0; end; function TRGBMask.GetMaskedRect: TRect; var I, J: Integer; LineMasked: Boolean; P: PRGB8Pixel; begin Result := Rect(Width, Height, 0, 0); for J := 0 to Pred(Height) do begin P := Get8PixelPtr(0, J); LineMasked := False; for I := 0 to Pred(Width) do begin if P^ = $FF then begin LineMasked := True; if I < Result.Left then Result.Left := I; if Succ(I) > Result.Right then Result.Right := Succ(I); end; Inc(P); end; if LineMasked then begin if J < Result.Top then Result.Top := J; if Succ(J) > Result.Bottom then Result.Bottom := Succ(J); end; end; SortRect(Result); end; end. mricron-0.20120505.1~dfsg.1.orig/rgb/rgbcarbonroutines.pas0000664000175000017500000000564111326434470022671 0ustar michaelmichael{ /*************************************************************************** RGBCarbonRoutines.pas ***************************************************************************/ ***************************************************************************** * * * See the file COPYING.modifiedLGPL, included in this distribution, * * for details about the copyright. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * * ***************************************************************************** Author: Tom Gregorovic (_tom_@centrum.cz) Abstract: This unit contains routines for Carbon interface. } unit RGBCarbonRoutines; {$ifdef fpc} {$mode objfpc}{$H+} {$endif} interface uses SysUtils, Classes, LCLType, MacOSAll, CarbonProc, CarbonGDIObjects, CarbonCanvas, RGBTypes, RGBUtils; procedure WidgetSetDrawRGB32Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); procedure WidgetSetDrawRGB8Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB8BitmapCore); implementation procedure WidgetSetDrawRGB32Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB32BitmapCore); var CGImage: CGImageRef; CarbonBitmap: TCarbonBitmap; begin if not CheckDC(Dest, 'WidgetSetDrawRGB32Bitmap') then Exit; CarbonBitmap := TCarbonBitmap.Create(Bitmap.Width, Bitmap.Height, 24, 32, cbaDWord, cbtRGB, Bitmap.Pixels, False); try CGImage := CarbonBitmap.CreateSubImage(Bounds(SrcX, SrcY, SrcWidth, SrcHeight)); TCarbonDeviceContext(Dest).DrawCGImage(DstX, DstY, SrcWidth, SrcHeight, CGImage); CGImageRelease(CGImage); finally CarbonBitmap.Free; end; end; procedure WidgetSetDrawRGB8Bitmap(Dest: HDC; DstX, DstY: Integer; SrcX, SrcY, SrcWidth, SrcHeight: Integer; Bitmap: TRGB8BitmapCore); var CGImage: CGImageRef; CarbonBitmap: TCarbonBitmap; begin if not CheckDC(Dest, 'WidgetSetDrawRGB8Bitmap') then Exit; CarbonBitmap := TCarbonBitmap.Create(Bitmap.Width, Bitmap.Height, 8, 8, cbaDWord, cbtGray, Bitmap.Pixels, False); try CGImage := CarbonBitmap.CreateSubImage(Bounds(SrcX, SrcY, SrcWidth, SrcHeight)); TCarbonDeviceContext(Dest).DrawCGImage(DstX, DstY, SrcWidth, SrcHeight, CGImage); CGImageRelease(CGImage); finally CarbonBitmap.Free; end; end; end. mricron-0.20120505.1~dfsg.1.orig/rgb/lazrgbgraphics.pas0000664000175000017500000000037411326434470022141 0ustar michaelmichael{ This file was automatically created by Lazarus. Do not edit! This source is only used to compile and install the package. } unit LazRGBGraphics; interface uses RGBGraphics, RGBUtils, RGBTypes, RGBRoutines; implementation end. mricron-0.20120505.1~dfsg.1.orig/rgb/lazrgbgraphics.lpk0000664000175000017500000000503111062207322022126 0ustar michaelmichael mricron-0.20120505.1~dfsg.1.orig/reslice_img.pas0000664000175000017500000005175111455063232020651 0ustar michaelmichaelunit reslice_img; //12 April 2009 - added lTrilinearSmooth option to allow nearest neighbor interpolation interface uses {$ifndef fpc}{windows,} {$endif} GraphicsMathLibrary,nifti_hdr; function Reslice_Img_To_Unaligned (var lTargHdr: TNIfTIhdr; var lSrcHdr: TMRIcroHdr; lTrilinearSmoothIn: boolean): boolean; function Hdr2InvMat (lHdr: TNiftiHdr; var lOK: boolean): TMatrix; procedure Voxel2mm(var X,Y,Z: single; var lHdr: TNIfTIHdr); procedure mm2Voxel (var X,Y,Z: single; var lInvMat: TMatrix); implementation uses dialogs, define_types; function Hdr2Mat (lHdr: TNIFTIhdr): TMatrix; begin Result := Matrix3D ( lHdr.srow_x[0],lHdr.srow_x[1],lHdr.srow_x[2],lHdr.srow_x[3], // 3D "graphics" matrix lHdr.srow_y[0],lHdr.srow_y[1],lHdr.srow_y[2],lHdr.srow_y[3], // 3D "graphics" matrix lHdr.srow_z[0],lHdr.srow_z[1],lHdr.srow_z[2],lHdr.srow_z[3], // 3D "graphics" matrix 0,0,0,1); end; (*procedure ReportMatrix (lM:TMatrix); const kCR = chr (13); begin showmessage(RealToStr(lM.matrix[1,1],6)+','+RealToStr(lM.matrix[1,2],6)+','+RealToStr(lM.matrix[1,3],6)+','+RealToStr(lM.matrix[1,4],6)+kCR+ RealToStr(lM.matrix[2,1],6)+','+RealToStr(lM.matrix[2,2],6)+','+RealToStr(lM.matrix[2,3],6)+','+RealToStr(lM.matrix[2,4],6)+kCR+ RealToStr(lM.matrix[3,1],6)+','+RealToStr(lM.matrix[3,2],6)+','+RealToStr(lM.matrix[3,3],6)+','+RealToStr(lM.matrix[3,4],6)+kCR +RealToStr(lM.matrix[4,1],6)+','+RealToStr(lM.matrix[4,2],6)+','+RealToStr(lM.matrix[4,3],6)+','+RealToStr(lM.matrix[4,4],6) ); end; *) (* procedure SPMmat(var lDestMat: TMatrix); //SPM matrices are indexed from 1 //This function is only useful for direct comparisons with SPM var lTemp,lVS: TMatrix; begin lVS := Matrix3D (1,0,0,-1, 0,1,0,-1, 0,0,1,-1, 0,0,0,1);//VoxelShift lTemp := lDestMat; lDestMat := MultiplyMatrices(lTemp,lVS); end;*) procedure Coord(var lV: TVector; var lMat: TMatrix); //transform X Y Z by matrix var lXi,lYi,lZi: single; begin lXi := lV.x; lYi := lV.y; lZi := lV.z; lV.x := (lXi*lMat.matrix[1][1]+lYi*lMat.matrix[1][2]+lZi*lMat.matrix[1][3]+lMat.matrix[1][4]); lV.y := (lXi*lMat.matrix[2][1]+lYi*lMat.matrix[2][2]+lZi*lMat.matrix[2][3]+lMat.matrix[2][4]); lV.z := (lXi*lMat.matrix[3][1]+lYi*lMat.matrix[3][2]+lZi*lMat.matrix[3][3]+lMat.matrix[3][4]); end; procedure Transposemat(var lMat: TMatrix); var lTemp: TMatrix; i,j: integer; begin lTemp := lMat; for i := 1 to lMat.size do for j := 1 to lMat.size do lMat.matrix[i,j] := lTemp.matrix[j,i]; end; function gaussj(VAR a: TMatrix): boolean;//Invert a Matrix - see Numerical Recipes label 666; VAR big,dum,pivinv: real; n,i,icol,irow,j,k,l,ll: integer; indxc,indxr,ipiv: array [1..4] of integer; BEGIN result := true; icol := 1;//not used - avoids compiler warning irow := 1;//not used - avoids compiler warning n := a.size; FOR j := 1 TO n DO BEGIN ipiv[j] := 0 END; FOR i := 1 TO n DO BEGIN big := 0.0; FOR j := 1 TO n DO BEGIN IF (ipiv[j] <> 1) THEN BEGIN FOR k := 1 TO n DO BEGIN IF (ipiv[k] = 0) THEN BEGIN IF (abs(a.matrix[j,k]) >= big) THEN BEGIN big := abs(a.matrix[j,k]); irow := j; icol := k END END ELSE IF (ipiv[k] > 1) THEN BEGIN goto 666; END END END END; ipiv[icol] := ipiv[icol]+1; IF (irow <> icol) THEN BEGIN FOR l := 1 TO n DO BEGIN dum := a.matrix[irow,l]; a.matrix[irow,l] := a.matrix[icol,l]; a.matrix[icol,l] := dum END; END; indxr[i] := irow; indxc[i] := icol; IF (a.matrix[icol,icol] = 0.0) THEN goto 666; pivinv := 1.0/a.matrix[icol,icol]; a.matrix[icol,icol] := 1.0; FOR l := 1 TO n DO BEGIN a.matrix[icol,l] := a.matrix[icol,l]*pivinv END; FOR ll := 1 TO n DO BEGIN IF (ll <> icol) THEN BEGIN dum := a.matrix[ll,icol]; a.matrix[ll,icol] := 0.0; FOR l := 1 TO n DO BEGIN a.matrix[ll,l] := a.matrix[ll,l]-a.matrix[icol,l]*dum END; END END END; FOR l := n DOWNTO 1 DO BEGIN IF (indxr[l] <> indxc[l]) THEN BEGIN FOR k := 1 TO n DO BEGIN dum := a.matrix[k,indxr[l]]; a.matrix[k,indxr[l]] := a.matrix[k,indxc[l]]; a.matrix[k,indxc[l]] := dum END END END; exit; 666: //only get here if there is an error Showmessage('error in reslice_img - singular matrix. Spatial orientation is ambiguous.'); a := Eye3D; result := false; END; procedure SubVec (var lVx: TVector; lV0: TVector); begin lVx.x := lVx.x - lV0.x; lVx.y := lVx.y - lV0.y; lVx.z := lVx.z - lV0.z; end; (*procedure mm2Voxel (var X,Y,Z: single; var lInvMat: TMatrix); //returns voxels indexed from 1 not 0! var lV: TVector; lSrcMatInv,lSrcMat: TMatrix; begin lV := Vector3D (X,Y,Z); lV := Transform (lV,lInvMat); X := lV.x+1; Y := lV.y+1; Z := lV.z+1; end;*) procedure mm2Voxel (var X,Y,Z: single; var lInvMat: TMatrix); //returns voxels indexed from 1 not 0! var lV: TVector; lSrcMatInv,lSrcMat: TMatrix; begin lV := Vector3D (X,Y,Z); Coord (lV,lInvMat); X := lV.x+1; Y := lV.y+1; Z := lV.z+1; end; procedure Voxel2mm(var X,Y,Z: single; var lHdr: TNIfTIHdr); var lV: TVector; lMat: TMatrix; begin //lV := Vector3D (X-1,Y-1,Z-1); lV := Vector3D (X-1,Y-1,Z-1); lMat := Hdr2Mat(lHdr); Coord(lV,lMat); X := lV.x; Y := lV.y; Z := lV.z; end; function Voxel2Voxel (var lDestHdr,lSrcHdr: TNIFTIhdr): TMatrix; //returns matrix for transforming voxels from one image to the other image //results are in VOXELS not mm var lV0,lVx,lVy,lVz: TVector; lDestMat,lSrcMatInv,lSrcMat: TMatrix; begin //Step 1 - compute source coordinates in mm for 4 voxels //the first vector is at 0,0,0, with the //subsequent voxels being left, up or anterior lDestMat := Hdr2Mat(lDestHdr); //SPMmat(lDestMat); lV0 := Vector3D (0,0,0); lVx := Vector3D (1,0,0); lVy := Vector3D (0,1,0); lVz := Vector3D (0,0,1); Coord(lV0,lDestMat); Coord(lVx,lDestMat); Coord(lVy,lDestMat); Coord(lVz,lDestMat); lSrcMat := Hdr2Mat(lSrcHdr); //SPMmat(lSrcMat); lSrcMatInv := lSrcMat; gaussj(lSrcMatInv); //the vectors should be rows not columns.... //therefore we transpose the matrix Transposemat(lSrcMatInv); //the 'transform' multiplies the vector by the matrix lV0 := Transform (lV0,lSrcMatInv); lVx := Transform (lVx,lSrcMatInv); lVy := Transform (lVy,lSrcMatInv); lVz := Transform (lVz,lSrcMatInv); //subtract each vector from the origin // this reveals the voxel-space influence for each dimension SubVec(lVx,lV0); SubVec(lVy,lV0); SubVec(lVz,lV0); result := Matrix3D(lVx.x,lVy.x,lVz.x,lV0.x, lVx.y,lVy.y,lVz.y,lV0.y, lVx.z,lVy.z,lVz.z,lV0.z, 0,0,0,1); end; procedure CopyHdrMat(var lTarg,lDest: TNIfTIHdr); //destination has dimensions and rotations of destination var lI: integer; begin //destination will have dimensions of target lDest.dim[0] := 3; //3D for lI := 1 to 3 do lDest.dim[lI] := lTarg.dim[lI]; lDest.dim[4] := 1; //3D //destination will have pixdim of target for lI := 0 to 7 do lDest.pixdim[lI] := lTarg.pixdim[lI]; lDest.xyzt_units := lTarg.xyzt_units; //e.g. mm and sec lDest.qform_code := lTarg.qform_code; lDest.sform_code := lTarg.sform_code; lDest.quatern_b := lTarg.quatern_b; lDest.quatern_c := lTarg.quatern_c; lDest.quatern_d := lTarg.quatern_d; lDest.qoffset_x := lTarg.qoffset_x; lDest.qoffset_y := lTarg.qoffset_y; lDest.qoffset_z := lTarg.qoffset_z; for lI := 0 to 3 do begin lDest.srow_x[lI] := lTarg.srow_x[lI]; lDest.srow_y[lI] := lTarg.srow_y[lI]; lDest.srow_z[lI] := lTarg.srow_z[lI]; end; end; function OneToOne(lM:TMatrix): boolean; var lC,lR: integer; begin result := false; for lC := 1 to 3 do for lR := 1 to 3 do if (lM.matrix[lC,lR] <> 0) and ((abs(lM.matrix[lC,lR])- 1) > 0.00001) then exit; result := true; end; function Reslice_Img_To_Unaligned (var lTargHdr: TNIfTIhdr; var lSrcHdr: TMRIcroHdr; lTrilinearSmoothIn: boolean): boolean; var lXrM1,lYrM1,lZrM1,lZx,lZy,lZz,lYx,lYy,lYz,lXreal,lYreal,lZreal: single; lXo,lYo,lZo,lMinY,lMaxY,lMinZ,lMaxZ, lPos,lXs,lYs,lZs,lXYs,lXYZs,lX,lY,lZ,lOutVolItems, lXi,lYi,lZi: integer; lDestHdr: TNIFTIhdr; lMat: TMatrix; lTrilinearSmooth,lOverlap: boolean; lXx,lXy,lXz: Singlep0; l32fs,l32f : SingleP; l16is,l16i : SmallIntP; l8i,l8is,lSrcBuffer,lBuffUnaligned,lBuffAligned,lBuffOutUnaligned: bytep; begin lTrilinearSmooth := lTrilinearSmoothIn; result := false; lOverlap := false; lDestHdr := lSrcHdr.NIfTIHdr; //destination has the comments and voxel BPP of source CopyHdrMat(lTargHdr,lDestHdr);//destination has dimensions and rotations of destination lXs := lSrcHdr.NIfTIHdr.Dim[1]; lYs := lSrcHdr.NIfTIHdr.Dim[2]; lZs := lSrcHdr.NIfTIHdr.Dim[3]; lXYs:=lXs*lYs; //slicesz lXYZs := lXYs*lZs; lX := lDestHdr.Dim[1]; lY := lDestHdr.Dim[2]; lZ := lDestHdr.Dim[3]; lOutVolItems :=lX*lY*lZ; if lSrcHdr.ImgBufferBPP = 4 then begin l32fs := SingleP(lSrcHdr.ImgBuffer); GetMem(lBuffOutUnaligned,(lOutVolItems*sizeof(single))+16); {$IFDEF FPC} l32f := align(lBuffOutUnaligned,16); {$ELSE} l32f := SingleP($fffffff0 and (integer(lBuffOutUnaligned)+15)); {$ENDIF} for lPos := 1 to lOutVolItems do l32f^[lPos] := 0; //set all to zero end else if lSrcHdr.ImgBufferBPP = 2 then begin l16is := SmallIntP(lSrcHdr.ImgBuffer); GetMem(lBuffOutUnaligned,(lOutVolItems*sizeof(smallint))+16); {$IFDEF FPC} l16i := align(lBuffOutUnaligned,16); {$ELSE} l16i := SmallIntP($fffffff0 and (integer(lBuffOutUnaligned)+15)); {$ENDIF} for lPos := 1 to lOutVolItems do l16i^[lPos] := 0; //set all to zero end else if lSrcHdr.ImgBufferBPP = 1 then begin l8is := ByteP(lSrcHdr.ImgBuffer); GetMem(l8i,lOutVolItems); Fillchar(l8i^,lOutVolItems,0); //set all to zero end; lMat := Voxel2Voxel (lTargHdr,lSrcHdr.NIfTIHdr); //lDestHdr := lSrcHdr; //destination has the comments and voxel BPP of source //CopyHdrMat(lTargHdr,lDestHdr);//destination has dimensions and rotations of destination //now we can apply the transforms... //build lookup table - speed up inner loop getmem(lXx, lX*sizeof(single)); getmem(lXy, lX*sizeof(single)); getmem(lXz, lX*sizeof(single)); for lXi := 0 to (lX-1) do begin lXx^[lXi] := lXi*lMat.matrix[1][1]; lXy^[lXi] := lXi*lMat.matrix[2][1]; lXz^[lXi] := lXi*lMat.matrix[3][1]; end; lPos := 0; if (lTrilinearSmooth) and (OneToOne(lMat)) then begin lTrilinearSmooth := false; end; if lTrilinearSmooth then begin//compute trilinear interpolation //compute trilinear interpolation for lZi := 0 to (lZ-1) do begin //these values are the same for all voxels in the slice // compute once per slice lZx := lZi*lMat.matrix[1][3]; lZy := lZi*lMat.matrix[2][3]; lZz := lZi*lMat.matrix[3][3]; for lYi := 0 to (lY-1) do begin //these values change once per row // compute once per row lYx := lYi*lMat.matrix[1][2]; lYy := lYi*lMat.matrix[2][2]; lYz := lYi*lMat.matrix[3][2]; for lXi := 0 to (lX-1) do begin //compute each column inc(lPos); lXreal := (lXx^[lXi]+lYx+lZx+lMat.matrix[1][4]); lYreal := (lXy^[lXi]+lYy+lZy+lMat.matrix[2][4]); lZreal := (lXz^[lXi]+lYz+lZz+lMat.matrix[3][4]); //need to test Xreal as -0.01 truncates to zero if (lXreal >= 0) and (lYreal >= 0) and (lZreal >= 0) and (lXreal < (lXs -1)) and (lYreal < (lYs -1) ) and (lZreal <= (lZs -1)) //June09 lZReal <= instead of < then begin //compute the contribution for each of the 8 source voxels //nearest to the target lOverlap := true; lXo := trunc(lXreal); lYo := trunc(lYreal); lZo := trunc(lZreal); lXreal := lXreal-lXo; lYreal := lYreal-lYo; lZreal := lZreal-lZo; lXrM1 := 1-lXreal; lYrM1 := 1-lYreal; lZrM1 := 1-lZreal; lMinY := lYo*lXs; lMinZ := lZo*lXYs; lMaxY := lMinY+lXs; inc(lXo);//images incremented from 1 not 0 //Check if sample is perfectly in the Z-plane. //This requires only 8 samples, so its faster //in addition, for very thin volumes, it allows us to sample to the edge if lZReal = 0 then begin // perfectly in plane, only sample 4 voxels near each other case lSrcHdr.ImgBufferBPP of 1 : l8i^[lPos] := round ( ( (lXrM1*lYrM1)*l8is^[lXo+lMinY+lMinZ])+((lXreal*lYrM1)*l8is^[lXo+1+lMinY+lMinZ])+((lXrM1*lYreal)*l8is^[lXo+lMaxY+lMinZ])+((lXreal*lYreal)*l8is^[lXo+1+lMaxY+lMinZ])); 2: l16i^[lPos] := round (( (lXrM1*lYrM1)*l16is^[lXo+lMinY+lMinZ])+((lXreal*lYrM1)*l16is^[lXo+1+lMinY+lMinZ])+((lXrM1*lYreal)*l16is^[lXo+lMaxY+lMinZ])+((lXreal*lYreal)*l16is^[lXo+1+lMaxY+lMinZ])); 4: l32f^[lPos] := ( (lXrM1*lYrM1)*l32fs^[lXo+lMinY+lMinZ])+((lXreal*lYrM1)*l32fs^[lXo+1+lMinY+lMinZ])+((lXrM1*lYreal)*l32fs^[lXo+lMaxY+lMinZ])+((lXreal*lYreal)*l32fs^[lXo+1+lMaxY+lMinZ]); end; //case end else begin //not perfectly in plane... we need 8 samples... lMaxZ := lMinZ+lXYs; case lSrcHdr.ImgBufferBPP of 1 : l8i^[lPos] := round ({all min} ( (lXrM1*lYrM1*lZrM1)*l8is^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*l8is^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*l8is^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*l8is^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*l8is^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*l8is^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*l8is^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*l8is^[lXo+1+lMaxY+lMaxZ]) ); 2:l16i^[lPos] := round ({all min} ( (lXrM1*lYrM1*lZrM1)*l16is^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*l16is^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*l16is^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*l16is^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*l16is^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*l16is^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*l16is^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*l16is^[lXo+1+lMaxY+lMaxZ]) ); 4: l32f^[lPos] := {all min} ( (lXrM1*lYrM1*lZrM1)*l32fs^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*l32fs^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*l32fs^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*l32fs^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*l32fs^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*l32fs^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*l32fs^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*l32fs^[lXo+1+lMaxY+lMaxZ]) ; end; //case end; //not perfectly in plane end; //if voxel is in source image's bounding box end;//z end;//y end;//z end else begin //if trilinear, else nearest neighbor //nearest neighbor - added 12 April 2009 for lZi := 0 to (lZ-1) do begin //these values are the same for all voxels in the slice // compute once per slice lZx := lZi*lMat.matrix[1][3]; lZy := lZi*lMat.matrix[2][3]; lZz := lZi*lMat.matrix[3][3]; for lYi := 0 to (lY-1) do begin //these values change once per row // compute once per row lYx := lYi*lMat.matrix[1][2]; lYy := lYi*lMat.matrix[2][2]; lYz := lYi*lMat.matrix[3][2]; for lXi := 0 to (lX-1) do begin //compute each column inc(lPos); lXo := round(lXx^[lXi]+lYx+lZx+lMat.matrix[1][4]); lYo := round(lXy^[lXi]+lYy+lZy+lMat.matrix[2][4]); lZo := round(lXz^[lXi]+lYz+lZz+lMat.matrix[3][4]); //need to test Xreal as -0.01 truncates to zero if (lXo >= 0) and (lYo >= 0{1}) and (lZo >= 0{1}) and (lXo < (lXs -1)) and (lYo < (lYs -1) ) and (lZo < (lZs)) then begin lOverlap := true; inc(lXo);//images incremented from 1 not 0 lYo := lYo*lXs; lZo := lZo*lXYs; case lSrcHdr.ImgBufferBPP of 1 : l8i^[lPos] :=l8is^[lXo+lYo+lZo]; 2: l16i^[lPos] :=l16is^[lXo+lYo+lZo]; 4: l32f^[lPos] :=l32fs^[lXo+lYo+lZo] ; end; //case end; //if voxel is in source image's bounding box end;//z end;//y end;//z //end nearest neighbor end; //release lookup tables freemem(lXx); freemem(lXy); freemem(lXz); //check to see if image is empty... if not lOverlap then Showmessage('No overlap between overlay and background - these images do not appear coregistered.'); if lSrcHdr.ImgBufferBPP = 4 then begin FreeMem(lSrcHdr.ImgBufferUnaligned); GetMem(lSrcHdr.ImgBufferUnaligned ,(lOutVolItems*sizeof(Single)) + 16); {$IFDEF FPC} lSrcHdr.ImgBuffer := align(lSrcHdr.ImgBufferUnaligned,16); {$ELSE} lSrcHdr.ImgBuffer := ByteP($fffffff0 and (integer(lSrcHdr.ImgBufferUnaligned)+15)); {$ENDIF} lSrcHdr.ImgBufferItems := lOutVolItems; move(l32f^,lSrcHdr.ImgBuffer^,(lOutVolItems*sizeof(Single))); FreeMem(lBuffOutUnaligned); end else if lSrcHdr.ImgBufferBPP = 2 then begin FreeMem(lSrcHdr.ImgBufferUnaligned); GetMem(lSrcHdr.ImgBufferUnaligned ,(lOutVolItems*sizeof(SmallInt)) + 16); {$IFDEF FPC} lSrcHdr.ImgBuffer := align(lSrcHdr.ImgBufferUnaligned,16); {$ELSE} lSrcHdr.ImgBuffer := ByteP($fffffff0 and (integer(lSrcHdr.ImgBufferUnaligned)+15)); {$ENDIF} lSrcHdr.ImgBufferItems := lOutVolItems; //CopyMemory(Pointer(lSrcHdr.ImgBuffer),Pointer(l16i),(lOutVolItems*sizeof(SmallInt))); move(l16i^,lSrcHdr.ImgBuffer^,(lOutVolItems*sizeof(SmallInt))); FreeMem(lBuffOutUnaligned); end else if lSrcHdr.ImgBufferBPP = 1 then begin FreeMem(lSrcHdr.ImgBufferUnaligned); GetMem(lSrcHdr.ImgBufferUnaligned ,lOutVolItems + 16); {$IFDEF FPC} lSrcHdr.ImgBuffer := align(lSrcHdr.ImgBufferUnaligned,16); {$ELSE} lSrcHdr.ImgBuffer := ByteP($fffffff0 and (integer(lSrcHdr.ImgBufferUnaligned)+15)); {$ENDIF} lSrcHdr.ImgBufferItems := lOutVolItems; //CopyMemory(Pointer(lSrcHdr.ImgBuffer),Pointer(l8i),lOutVolItems); move(l8i^,lSrcHdr.ImgBuffer^,lOutVolItems); FreeMem(l8i); end; lSrcHdr.NIfTIHdr := lDestHdr; //header inherits coordinates of target end; function Hdr2InvMat (lHdr: TNiftiHdr; var lOK: boolean): TMatrix; var lSrcMat,lSrcMatInv: TMatrix; begin lSrcMat := Hdr2Mat( lHdr); lSrcMatInv := lSrcMat; lOK := gaussj(lSrcMatInv); //the vectors should be rows not columns.... //therefore we transpose the matrix //use this if you use transform instead of coord //Transposemat(lSrcMatInv); result := lSrcMatInv; end; end. mricron-0.20120505.1~dfsg.1.orig/reslice_fsl.pas0000664000175000017500000001762211425651456020670 0ustar michaelmichaelunit reslice_fsl; {$H+} interface uses nifti_hdr,define_types,metagraph,sysutils; function ResliceImg (lTargetImgName,lSrcImgName,lSrc2TargetMatName,lOutputName: string): boolean; procedure ResliceFSL; implementation uses nifti_img_view,dialogs,nifti_img,text,graphx,math,nifti_hdr_view,GraphicsMathLibrary,classes; procedure ResliceFSL; label 666; var lInc,lNumberofFiles: integer; lSrc2TargetMatName,lSrcImgName,lTargetImgName,lOutputName:string; lStrings : TStringList; begin ImgForm.CloseImagesClick(nil); if not OpenDialogExecute(kImgFilter,'Select source image[s]',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; if lNumberofFiles < 1 then exit; lStrings := TStringList.Create; lStrings.AddStrings(HdrForm.OpenHdrDlg.Files); if not OpenDialogExecute('FSL (*.mat)|*.mat','Select FSL source-to-target matrix',false) then goto 666; lSrc2TargetMatName := HdrForm.OpenHdrDlg.Filename; if not OpenDialogExecute(kImgFilter,'Select target image (source image will be warped to this)',false) then goto 666; lTargetImgName := HdrForm.OpenHdrDlg.Filename; TextForm.MemoT.Lines.Clear; for lInc:= 1 to lNumberofFiles do begin lSrcImgName := lStrings[lInc-1]; lOutputName := ChangeFilePrefix (lSrcImgName,'w'); TextForm.MemoT.Lines.Add(' Source->Matrix->Target '+lSrcImgName+'->'+ lSrc2TargetMatName+'->'+lTargetImgName); ResliceImg (lTargetImgName,lSrcImgName,lSrc2TargetMatName,lOutputName); end;//lLoop TextForm.Show; 666: lStrings.free; end; function ReadFSLMat (var lMat: TMatrix; lSrc2TargetMatName: string):boolean; var lF: TextFile; xx,xy,xz,xo ,yx,yy,yz,yo ,zx,zy,zz,zo: double; begin result := false; if not fileexists(lSrc2TargetMatName) then exit; Assign(lF,lSrc2TargetMatName); Filemode := 0; Reset(lF); readln(lF,xx,xy,xz,xo,yx,yy,yz,yo,zx,zy,zz,zo); //read all with one readln - // separate readlns only work for native eoln CloseFile(lF); lMat:= Matrix3D (xx,xy,xz,xo ,yx,yy,yz,yo ,zx,zy,zz,zo ,0,0,0,1); result := true; Filemode := 2; end; function Rx (var lDestHdr,lSrcHdr: TMRIcroHdr; var lInMat: TMatrix; var lOutputName: string):boolean; var lPos,lXYs,lXYZs,lXs,lYs,lZs,lXi,lYi,lZi,lX,lY,lZ, lXo,lYo,lZo,lMinY,lMinZ,lMaxY,lMaxZ: integer; lXrM1,lYrM1,lZrM1, lXreal,lYreal,lZreal: double; lOutImg: bytep; lScale,lMat: TMatrix; begin result := false; lXs := lSrcHdr.NIFTIhdr.Dim[1]; lYs := lSrcHdr.NIFTIhdr.Dim[2]; lZs := lSrcHdr.NIFTIhdr.Dim[3]; if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems <> lXs*lYs*lZs) then begin showmessage('Reslice error: background image not loaded.'); exit; end; lXYs:=lXs*lYs; //slicesz lXYZs := lXYs*lZs; lX := lDestHdr.NIFTIhdr.Dim[1]; lY := lDestHdr.NIFTIhdr.Dim[2]; lZ := lDestHdr.NIFTIhdr.Dim[3]; //TextForm.Memo1.Lines.Add(inttostr(lXs)+'x'+inttostr(lYs)+'x'+inttostr(lZs)+'->'+inttostr(lX)+'x'+inttostr(lY)+'x'+inttostr(lZ)); lDestHdr.NIFTIhdr.Dim[4] := 1; getmem(lOutImg, lX*lY*lZ*sizeof(byte)); lPos := 0; //http://eeg.sourceforge.net/MJenkinson_coordtransforms.pdf //FLIRT transforms are in world coordinates [mm] //to convert to a vxl-vxl transform, the matrix must be //PRE-multiplied by inv(Dest) and POST-multiplied by Src //where Dest and Src are the spatial dimensions in mm lScale:= Matrix3D (abs(lSrcHdr.NIFTIhdr.pixdim[1]),0,0,0 ,0,abs(lSrcHdr.NIFTIhdr.pixdim[2]),0,0 ,0,0,abs(lSrcHdr.NIFTIhdr.pixdim[3]),0 ,0,0,0,1); lScale := InvertMatrix3D(lScale); lMat := MultiplyMatrices(lScale,lInMat); lScale:= Matrix3D (abs(lDestHdr.NIFTIhdr.pixdim[1]),0,0,0 ,0,abs(lDestHdr.NIFTIhdr.pixdim[2]),0,0 ,0,0,abs(lDestHdr.NIFTIhdr.pixdim[3]),0 ,0,0,0,1); lMat := MultiplyMatrices(lMat,lScale); for lZi := 0 to (lZ-1) do begin for lYi := 0 to (lY-1) do begin for lXi := 0 to (lX-1) do begin inc(lPos); lOutImg^[lPos] := 0; lXreal := (lXi*lMat.matrix[1][1]+lYi*lMat.matrix[1][2]+lZi*lMat.matrix[1][3]+lMat.matrix[1][4]); lYreal := (lXi*lMat.matrix[2][1]+lYi*lMat.matrix[2][2]+lZi*lMat.matrix[2][3]+lMat.matrix[2][4]); lZreal := (lXi*lMat.matrix[3][1]+lYi*lMat.matrix[3][2]+lZi*lMat.matrix[3][3]+lMat.matrix[3][4]); //need to test Xreal as -0.01 truncates to zero if (lXreal >= 0) and (lYreal >= 1) and (lZreal >= 1) and (lXreal < (lXs -1)) and (lYreal < (lYs -1) ) and (lZreal < (lZs -1)) then begin lXo := trunc(lXreal); lYo := trunc(lYreal); lZo := trunc(lZreal); lXreal := lXreal-lXo; lYreal := lYreal-lYo; lZreal := lZreal-lZo; lXrM1 := 1-lXreal; lYrM1 := 1-lYreal; lZrM1 := 1-lZreal; lMinY := ((lYo)*lXs); lMinZ := ((lZo)*lXYs); lMaxY := ((lYo+1)*lXs); lMaxZ := ((lZo+1)*lXYs); inc(lXo);//images incremented from 1 not 0 {if lMax <(lXreal) then lMax := lXreal; if lMin >(lXreal) then lMin := lXreal; } lOutImg^[lPos] := round ( {all min} ( (lXrM1*lYrM1*lZrM1)*gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lXo+1+lMaxY+lMaxZ]) ); end; end;//z end;//y end;//z deletefile(lOutputName); SaveAsVOIorNIFTIcore (lOutputName,lOutImg, lX*lY*lZ, 1,1,lDestHdr.NIFTIhdr); lPos := 1; while (lPos <= (lX*lY*lZ)) and (lOutImg^[lPos] = 0) do inc(lPos); if lPos > (lX*lY*lZ) then result := false else result := true; freemem(lOutImg); end; function ResliceImg (lTargetImgName,lSrcImgName,lSrc2TargetMatName,lOutputName: string): boolean; label 666; var lReslice,lOrtho : boolean; lDestHdr,lSrcHdr: TMRIcroHdr; lMat: TMatrix; begin result := false; if not fileexists(lTargetImgName) then exit; if not fileexists(lSrcImgName) then exit; if not fileexists(lSrc2TargetMatName) then exit; if not ReadFSLMat(lMat,lSrc2TargetMatName) then exit; ImgForm.CloseImagesClick(nil); lReslice := gBGImg.ResliceOnLoad; lOrtho := gBGImg.OrthoReslice; gBGImg.OrthoReslice := false; gBGImg.ResliceOnLoad := false; //if not HdrForm.OpenAndDisplayHdr(lTargetImgName,lDestHdr) then goto 666; if not NIFTIhdr_LoadHdr(lTargetImgName, lDestHdr) then goto 666; if not NIFTIhdr_LoadHdr(lSrcImgName, lSrcHdr) then goto 666; ImgForm.OpenAndDisplayImg(lSrcImgName,True); if not Rx(lDestHdr,lSrcHdr,lMat,lOutputName) then goto 666; result := true; 666: if not result then showmessage('Error applying transform '+lSrcImgName+'->'+lTargetImgName+' using '+lSrc2TargetMatName); gBGImg.ResliceOnLoad := lReslice; gBGImg.OrthoReslice := lOrtho; end; end. mricron-0.20120505.1~dfsg.1.orig/reorient.pas0000664000175000017500000001025111326434470020207 0ustar michaelmichaelunit reorient; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, RXSpin,nifti_hdr,graphicsMathLibrary, ExtCtrls; type TReorientForm = class(TForm) ZEdit: TRxSpinEdit; YEdit: TRxSpinEdit; XEdit: TRxSpinEdit; ReorientTimer: TTimer; PitchEdit: TRxSpinEdit; RollEdit: TRxSpinEdit; YawEdit: TRxSpinEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Xlabel: TLabel; YLabel: TLabel; ZLabel: TLabel; procedure ReorientTimerTimer(Sender: TObject); procedure EditChange(Sender: TObject); private { Private declarations } public procedure ApplyTransform ( var lHdr: TMRIcroHdr); { Public declarations } end; var ReorientForm: TReorientForm; implementation uses nifti_img_view,nifti_img, nifti_hdr_view; {$R *.DFM} procedure TReorientForm.ApplyTransform ( var lHdr: TMRIcroHdr); var lM,lRot: TMatrix; begin //exit; if (XEdit.value = 0) and (YEdit.value = 0) and (ZEdit.value = 0) and (PitchEdit.value = 0) and (YawEdit.value = 0) and (RollEdit.value = 0) then exit; lRot := Matrix3D (1,0,0,XEdit.value, 0,1,0,YEdit.value, 0,0,1,ZEdit.value, 0,0,0,1); lM := Matrix3D ( lHdr.NIFTIhdr.srow_x[0],lHdr.NIFTIhdr.srow_x[1],lHdr.NIFTIhdr.srow_x[2],lHdr.NIFTIhdr.srow_x[3], // 3D "graphics" matrix lHdr.NIFTIhdr.srow_y[0],lHdr.NIFTIhdr.srow_y[1],lHdr.NIFTIhdr.srow_y[2],lHdr.NIFTIhdr.srow_y[3], // 3D "graphics" matrix lHdr.NIFTIhdr.srow_z[0],lHdr.NIFTIhdr.srow_z[1],lHdr.NIFTIhdr.srow_z[2],lHdr.NIFTIhdr.srow_z[3], // 3D "graphics" matrix 0,0,0,1); if PitchEdit.value <> 0 then RotatePitch(PitchEdit.value{-11.4592},lRot); if RollEdit.value <> 0 then RotateRoll(RollEdit.value,lRot); if YawEdit.value <> 0 then RotateYaw(YawEdit.value,lRot); //lM := lRot; lM := MultiplyMatrices(lRot,lM); (* WriteNiftiMatrix (lHdr.NiftiHdr, lM.matrix[1,1],lM.matrix[1,2],lM.matrix[1,3],lM.matrix[1,4], lM.matrix[2,1],lM.matrix[2,2],lM.matrix[1,3],lM.matrix[2,4], lM.matrix[3,1],lM.matrix[3,2],lM.matrix[1,3],lM.matrix[3,4]); lHdr.Mat := lM; *) //Caption := inttostr(random(888))+floattostr(lM.matrix[1,4]); XLabel.caption:= floattostr(lM.matrix[1,1])+'x'+floattostr(lM.matrix[1,2])+'x'+floattostr(lM.matrix[1,3])+'x'+floattostr(lM.matrix[1,4]); YLabel.caption:= floattostr(lM.matrix[2,1])+'x'+floattostr(lM.matrix[2,2])+'x'+floattostr(lM.matrix[2,3])+'x'+floattostr(lM.matrix[2,4]); ZLabel.caption:= floattostr(lM.matrix[3,1])+'x'+floattostr(lM.matrix[3,2])+'x'+floattostr(lM.matrix[3,3])+'x'+floattostr(lM.matrix[3,4]); end; (*procedure DrawLine(lIMage: TImage; lXmm,lYmm,lZmm,lXmm2,lYmm2,lZmm2: integer); var lX,lY,lZ: integer; begin lImage.Canvas.Pen.Color:=gBGImg.XBarClr; lImage.Canvas.Pen.Width := gBGImg.XBarThick; MMToImgCoord( lX,lY,lZ, lXmm,lYmm,lZmm); lImage.Canvas.MoveTo(lX,lY); MMToImgCoord( lX,lY,lZ, lXmm2,lYmm2,lZmm2); lImage.Canvas.LineTo(lX,lY); end;*) procedure TReorientForm.ReorientTimerTimer(Sender: TObject); begin ReorientTimer.enabled := false; //ImgForm.CloseOverlayImgClick(nil); (*DrawLine(ImgForm.PGImage2,0,-104,0,0,72,0);//horizontal line on Sag DrawLine(ImgForm.PGImage2,0,0,78,0,0,-48);//horizontal line on Sag DrawLine(ImgForm.PGImage3,0,0,77,0,0,-48);//horizontal line on Sag DrawLine(ImgForm.PGImage3,-64,0,0,64,0,0);//horizontal line on Sag *) ApplyTransform(gMRIcroOverlay[kBGOverlayNum]); //MMToImgCoord(var lX,lY,lZ: integer; var lXmm,lYmm,lZmm: single); end; (*procedure TReorientForm.ReorientTimerTimer(Sender: TObject); var lFilename: string; begin ReorientTimer.enabled := false; ImgForm.CloseOverlayImgClick(nil); ReorientTimer.enabled := false; lFilename := 'C:\pas\Delphi\niftiview\grey.voi'; ImgForm.LoadOverlay (lFilename); end; *) procedure TReorientForm.EditChange(Sender: TObject); begin ReorientTimer.enabled := true; end; end. mricron-0.20120505.1~dfsg.1.orig/reorient.dfm0000664000175000017500000000360111014324604020162 0ustar michaelmichaelџ TREORIENTFORM0jTPF0 TReorientForm ReorientFormLeftTopА BorderStylebsDialogCaptionReorient image ClientHeightН ClientWidthhColor clBtnFace Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Heightѕ Font.Name MS Sans Serif Font.Style FormStyle fsStayOnTopOldCreateOrderPositionpoScreenCenter PixelsPerInch` TextHeight TLabelLabel1LeftTop(WidthHeight CaptionPitchTLabelLabel2LefthTop(WidthHeight CaptionRollTLabelLabel3LeftШTop(WidthHeight CaptionYawTLabelLabel4LeftTopWidthHeight CaptionXTLabelLabel5LefthTopWidthHeight CaptionYTLabelLabel6LeftШTopWidthHeight CaptionZTLabelXlabelLeft TophWidthHeight CaptionXlabelTLabelYLabelLeft TopxWidth!Height CaptionYLabelTLabelZLabelLeft TopˆWidth!Height CaptionZLabel TRxSpinEditZEditLeftцTopWidth.Height ButtonKind bkStandardDecimalMaxValueШ@MinValueШРTabOrderOnChange EditChange TRxSpinEditYEditLeftŒTopWidth.Height ButtonKind bkStandardDecimalMaxValueШ@MinValueШРTabOrderOnChange EditChange TRxSpinEditXEditLeft,TopWidth.Height ButtonKind bkStandardDecimalMaxValueШ@MinValueШРTabOrderOnChange EditChange TRxSpinEdit PitchEditLeft,Top$Width.Height ButtonKind bkStandardDecimalMaxValueШ@MinValueШРTabOrderOnChange EditChange TRxSpinEditRollEditLeftŒTop$Width.Height ButtonKind bkStandardDecimalMaxValueШ@MinValueШРTabOrderOnChange EditChange TRxSpinEditYawEditLeftфTop$Width.Height ButtonKind bkStandardDecimalMaxValueШ@MinValueШРTabOrderOnChange EditChangeTTimer ReorientTimerEnabledOnTimerReorientTimerTimerLeft(Top@mricron-0.20120505.1~dfsg.1.orig/render_composite.pas0000664000175000017500000012745311326434470021736 0ustar michaelmichaelunit render_composite; interface {$include isthreaded.inc} uses {$IFDEF Unix} lclintf, //gettickcount {$ELSE} Windows, {$ENDIF} {$IFNDEF NoThreads} RenderThds, {$ELSE} rendernothreads, {$ENDIF} {$IFDEF FPC} LResources, //not sure if this is used... {$ENDIF} SysUtils, GraphicsMathLibrary,Classes, Graphics, Controls, Forms, Dialogs,ExtCtrls,Buttons, nifti_img, nifti_hdr,define_types,nifti_img_view,StdCtrls, Menus,ClipBrd,ReadInt,cutout,IniFiles, ComCtrls; type TRender = record Zoom: single; Cutout,CutoutFrac: TCutout; //BGNearClipFrac, BGNearClip,OverlayNearClipFrac,OverlayNearClip, ClipFrac, Azimuth,Elevation,cutoutLUTindex,ShadePct, OverlayFromBGSurface,BGSurface,OverlaySurface,BGDepth,OverlayDepth,CutoutBias,Gain,Bias: integer; SmoothBG,SmoothOverlay,Trilinear,ShowCutout,FlipLR: boolean; end; procedure VolumeRotateMatrix (var lBGImg: TBGImg; var lHdr: TMRIcroHdr; var lMatrixIn: TMatrix; lBilinearSmooth,lRenderCutout,lIsBG: boolean{;lNearSlicesClipIn: integer}); procedure DrawRender; procedure SliceToFrac(var lBGImg: TBGImg); var gRender:TRender; const kBelow = 1; kInFront = 2; implementation uses math,render; procedure MinMaxFilt (var lHdr: TMRIcroHdr; var lFiltMin8bit, lFiltMax8bit: integer);var lMin,lMax: single; begin ReturnMinMax (lHdr,lMin,lMax, lFiltMin8bit, lFiltMax8bit); end; procedure Smooth2DImage (lX,lY: integer; lInBuffer: ByteP); var lSmoothBuffer: ByteP; lLine,lLineStart,lInc,lOutPixel,lV: integer; begin GetMem (lSmoothBuffer , lX*lY); FillChar(lSmoothBuffer^,lX*lY, 0); //zero array for lLine:= (lY-1) downto 2 do begin lLineStart := ((lLine-1)*(lX)); for lInc := (lX-1) downto 2 do begin lOutPixel := lLineStart+lInc; lV := (lInBuffer^[lOutPixel] shl 3) +(lInBuffer^[lOutPixel+1] shl 1)+(lInBuffer^[lOutPixel-1] shl 1) +(lInBuffer^[lOutPixel+lX] shl 1)+(lInBuffer^[lOutPixel-lX] shl 1) +(lInBuffer^[lOutPixel+lX+1])+(lInBuffer^[lOutPixel+lX-1]) +(lInBuffer^[lOutPixel-lX+1])+(lInBuffer^[lOutPixel-lX-1]) ; lV := lV div 20; lSmoothBuffer^[lOutPixel] := lV;//lV; end; //for each column end; //for each line (row) Move(lSmoothBuffer^,lInBuffer^,lX*lY); //Move(lSmoothBuffer^[1],lInBuffer[1]^,lX*lY); FreeMem(lSmoothBuffer); end; //proc Smooth2DImage procedure CreateOverlayRenderInfrontNear(var lBGHdr,lHdr: TMRIcroHdr; var lX,lY,lZ,lInRenderSurface,lInRenderDepth: Integer; var lQuadP: RGBQuadp; Smooth2D: boolean); //changes Aug2007 - make sure search depth is not MAxInt - we get wrap around var lSrc,lOutBuffer: Bytep; lLow,lHigh, lIntensity,lDepth,lPixel,lSliceSz,lRenderSurface,lRenderDepth,lSamples: integer; begin if gBGImg.RenderDepthBufferItems < 1 then exit; lSrc := lHdr.RenderBuffer;//lHdr.ScrnBuffer; lSliceSz := lX*lY; //lVolSz := lSliceSz * lZ; GetMem (lOutBuffer , lSliceSz); fillchar(lOutBuffer^,lSliceSz,0); lRenderSurface := lInRenderSurface; RenderForm.caption := inttostr(lRenderSurface); if (lHdr.IMgBufferItems > 0) {2/2008} and (lHdr.NIFTIhdr.intent_code = kNIFTI_INTENT_LABEL) then lRenderSurface := 1; for lPixel := 1 to lSliceSz do begin if gBGImg.RenderDepthBuffer^[lPixel] <> 0 then begin //background surface at this voxel lIntensity := 0; lSamples := 0; if gBGImg.RenderDepthBuffer^[lPixel] < 0 then lRenderDepth := (abs(gBGImg.RenderDepthBuffer^[lPixel])-1)+1 else lRenderDepth := (abs(gBGImg.RenderDepthBuffer^[lPixel])-1)+lInRenderDepth; if lRenderDepth >= lX then lRenderDepth := lX-1; lDepth := ((lPixel-1)* lX)+1; lRenderDepth := lDepth + lRenderDepth; while (lDepth < lRenderDepth) do begin if (lSrc^[lDepth] > lRenderSurface) then begin lIntensity := lIntensity+lSrc^[lDepth]; inc(lSamples); end; inc(lDepth); end; if lSamples > 0 then lOutBuffer^[lPixel]:= lIntensity div lSamples; end; //for each pixel with a background image end; //for each pixel (*for lPixel := 1 to lSliceSz do begin if gBGImg.RenderDepthBuffer^[lPixel] <> 0 then begin //background surface at this voxel lDepth := 0; lIntensity := 0; lSliceOffset := 0; lSamples := 0; lRenderDepth := (abs(gBGImg.RenderDepthBuffer^[lPixel])-1)+lInRenderDepth; while (lDepth < lRenderDepth) and (lSliceOffset < lVolSz) do begin if (lSrc^[lSliceOffset+lPixel] > lRenderSurface) then begin lIntensity := lIntensity+lSrc^[lSliceOffset+lPixel]; inc(lSamples); end; inc(lSliceOffset,lSliceSz); inc(lDepth); if gBGImg.RenderDepthBuffer^[lPixel] < 0 then lDepth := lRenderDepth; //only show surface for cutout end; if lSamples > 0 then lOutBuffer^[lPixel]:= lIntensity div lSamples; end ; //if background end; *) if (Smooth2D) and (lHdr.NIFTIhdr.intent_code <> kNIFTI_INTENT_LABEL) then //do not smooth labels Smooth2DImage (lX,lY, lOutBuffer); //Mar2007 start if lHdr.LUTfromZero then begin MinMaxFilt(lHdr,lLow,lHigh); //fx(lLow,lHigh); if lLow > 0 then for lPixel := 1 to (lSliceSz) do if lOutBuffer^[lPixel] < lLow then lOutBuffer^[lPixel] := 0; if lHigh < 255 then for lPixel := 1 to (lSliceSz) do if lOutBuffer^[lPixel] < lHigh then lOutBuffer^[lPixel] := 0; end; for lPixel := 1 to lSliceSz do lQuadP^[lPixel]:= lHdr.LUT[lOutBuffer^[lPixel]]; Freemem(lOutBuffer); end; procedure CreateOverlayRenderBehind(var lBGHdr,lHdr: TMRIcroHdr; var lX,lY,lZ,lInRenderSurface,lInRenderDepth: Integer; var lQuadP: RGBQuadp; Smooth2D: boolean); var lSrc,lOutBuffer: Bytep; lLow,lHigh,lQ, lSurfaceDepth,lIntensity,lDepth,lPixel,lSliceSz,lRenderSurface,lRenderDepth: integer; begin if gBGImg.RenderDepthBufferItems < 1 then exit; lSrc := lHdr.RenderBuffer;//lHdr.ScrnBuffer; lSliceSz := lX*lY; //lVolSz := lSliceSz * lZ; GetMem (lOutBuffer , lSliceSz); fillchar(lOutBuffer^,lSliceSz,0); //lRenderDepth := lInRenderDepth; //if (lRenderDepth < 1) or (lHdr.NIFTIhdr.intent_code = kNIFTI_INTENT_LABEL) then // lRenderDepth := 1; lRenderSurface := lInRenderSurface; if (lHdr.IMgBufferItems > 0) {2/2008} and (lHdr.NIFTIhdr.intent_code = kNIFTI_INTENT_LABEL) then lRenderSurface := 1; for lPixel := 1 to lSliceSz do begin lSurfaceDepth := abs(gBGImg.RenderDepthBuffer^[lPixel]); if (lSurfaceDepth > 0) and (lSurfaceDepth <= lX) then begin //background surface at this voxel lIntensity := 0; lRenderDepth := (lSurfaceDepth-1)+lInRenderDepth; if lRenderDepth >= lX then lRenderDepth := lX-1; lDepth := ((lPixel-1)* lX)+1; lRenderDepth := lDepth + lRenderDepth; lDepth := lDepth + lSurfaceDepth-1; lQ := 0; while (lDepth < lRenderDepth) do begin if (lSrc^[lDepth] > lRenderSurface) and (lSrc^[lDepth] > lIntensity) then lIntensity := lSrc^[lDepth]; //if gBGImg.RenderDepthBuffer^[lPixel] < 0 then if (gBGImg.RenderDepthBuffer^[lPixel] < 0) and (lQ > 3) then lDepth := lRenderDepth; //only show surface for cutout inc(lDepth); inc(lQ); end; lOutBuffer^[lPixel]:= lIntensity; end; //for each pixel with a background image end; //for each pixel //renderform.caption := inttostr(lQMax); (*for lPixel := 1 to lSliceSz do begin if gBGImg.RenderDepthBuffer^[lPixel] <> 0 then begin //background surface at this voxel lDepth := 0; lIntensity := 0; lSliceOffset := (abs(gBGImg.RenderDepthBuffer^[lPixel])-1)*lSliceSz; //start with nearest slice while (lDepth < lRenderDepth) and (lSliceOffset < lVolSz) do begin if (lSrc^[lSliceOffset+lPixel] > lRenderSurface) and (lSrc^[lSliceOffset+lPixel] > lIntensity) then lIntensity := lSrc^[lSliceOffset+lPixel]; inc(lSliceOffset,lSliceSz); inc(lDepth); if gBGImg.RenderDepthBuffer^[lPixel] < 0 then lDepth := lRenderDepth; //only show surface for cutout end; lOutBuffer^[lPixel]:= lIntensity; end; //background surface at this voxel end; *) if (Smooth2D) and (lHdr.NIFTIhdr.intent_code <> kNIFTI_INTENT_LABEL) then //do not smooth labels Smooth2DImage (lX,lY, lOutBuffer); //Mar2007 start if lHdr.LUTfromZero then begin MinMaxFilt(lHdr,lLow,lHigh); //fx(lLow,lHigh); if lLow > 0 then for lPixel := 1 to (lSliceSz) do if lOutBuffer^[lPixel] < lLow then lOutBuffer^[lPixel] := 0; if lHigh < 255 then for lPixel := 1 to (lSliceSz) do if lOutBuffer^[lPixel] < lHigh then lOutBuffer^[lPixel] := 0; end; //Mar2007 end for lPixel := 1 to lSliceSz do lQuadP^[lPixel]:= lHdr.LUT[lOutBuffer^[lPixel]]; Freemem(lOutBuffer); end; Function AziElevMatrix : TMatrix; var lLRFlipMatrix: TMatrix; begin // gRender.Azimuth := RenderForm.AzimuthEdit.value; //gRender.Elevation := RenderForm.ElevationEdit.value; result := ViewTransformMatrix( coordSpherical, ToRadians(gRender.Azimuth), ToRadians(gRender.Elevation), 3{Distance.Value},6{ScreenWidthHeight.Value},6{ScreenWidthHeight.Value},{ScreenToCamera.Value}3); {The ViewTransformMatrix is all that is needed for other objects defined in world coordinates.} if {RenderForm.FlipLRcheck.checked} gRender.FlipLR then begin lLRFlipMatrix := Matrix3D (-1,0,0,0, // 3D "graphics" matrix 0,1,0,0, 0,0,1,0, 0,0,0,0); result := MultiplyMatrices(lLRFlipMatrix,Result); end; end; procedure ShadeCutoutCrease (var lRenderBuffer: bytep); var lZ,lY,lX: single; lXin,lYin,lZIn,lXm,lYm,lZm,lPixel, lOutDim,lOutPivot,lXPivotIn,lYPivotIn,lZPivotIn, lXlo,lXhi,lYlo,lYhi,lZlo,lZhi,lYOffset: integer; lClose,lScale: single; lMatrix: TMatrix; begin lOutDim := gBGImg.RenderDim;//MaxDim(lBackgroundImg.ScrnDim[1],lBackgroundImg.ScrnDim[2],lBackgroundImg.ScrnDim[3]); if gRender.Zoom > 0 then lOutPivot := (round(gBGImg.RenderDim/gRender.Zoom)+1) shr 1 else lOutPivot :=(gBGImg.RenderDim+1) shr 1; //11/2007b //lOutPivot := (lOutDim+1) shr 1; //e.g. if DimMax=9, then pivot is 5 lXPivotIn := (gBGImg.ScrnDim[1]+1) shr 1; //e.g. if DimMax=9, then pivot is 5 lYPivotIn := (gBGImg.ScrnDim[2]+1) shr 1; //e.g. if DimMax=9, then pivot is 5 lZPivotIn := (gBGImg.ScrnDim[3]+1) shr 1; //e.g. if DimMax=9, then pivot is 5 lMatrix := InvertMatrix3D(AziElevMatrix); //next: dilate borders by 1 pixel - draw crease INSIDE cutout lXlo := gRender.CutOut.Lo[1]-1; lXhi := gRender.CutOut.Hi[1]+1; lYlo := gRender.CutOut.Lo[2]-1; lYhi := gRender.CutOut.Hi[2]+1; lZlo := gRender.CutOut.Lo[3]-1; lZhi := gRender.CutOut.Hi[3]+1; lScale := 1/gRender.Zoom; //11/2007 for lYin := 1 to lOutDim do begin lYOffset := ((gBGImg.RenderDim-lYin)*gBGImg.RenderDim); for lXin := 1 to lOutDim do begin lPixel := lXin+ lYOffset; if gBGImg.RenderDepthBuffer^[lPixel]<0 then begin lZin := abs(gBGImg.RenderDepthBuffer^[lPixel]); lX := (lXin *lScale)-lOutPivot ; lY := lOutPivot -(lYin * lScale); lZ := (lZin * lScale)-lOutPivot; lXm := round( (lX*lMatrix.matrix[1,1])+(lY * lMatrix.matrix[2,1])+(lZ*lMatrix.matrix[3,1])); lYm := round( (lX*(lMatrix.matrix[1,2]))+(lY * lMatrix.matrix[2,2])+(lZ*lMatrix.matrix[3,2])); lZm := round( (lX*(lMatrix.matrix[1,3]))+(lY * lMatrix.matrix[2,3])+(lZ*lMatrix.matrix[3,3])); lXm := (lXm+lXPivotIn); lYm := (lYm+lYPivotIn); lZm := (lZm+lZPivotIn); if abs(lXlo-lXm) < abs(lXhi-lXm) then lXm := abs(lXlo-lXm) else lXm := abs(lXhi-lXm); if abs(lYlo-lYm) < abs(lYhi-lYm) then lYm := abs(lYlo-lYm) else lYm := abs(lYhi-lYm); if abs(lZlo-lZm) < abs(lZhi-lZm) then lZm := abs(lZlo-lZm) else lZm := abs(lZhi-lZm); if (lXm < lYm) and (lZm < lYm) then lYm := lZm //Y is furthest, replace with Z else if lZm < lXm then //X is furthest, replace with Z lXm := lZm; lClose := sqrt((lXm*lXm) + (lYm*lYm)); if lClose < 8 then begin lClose := 1-sqr(1-(lClose/8)); lRenderBuffer^[lPixel] := round(lRenderBuffer^[lPixel]*(0.33+(0.67*lClose))); end; end; end; //for lYin end; //for lXin end; procedure LUTbiasX (var lOutLUT : TLUT); {http://dept-info.labri.fr/~schlick/DOC/gem2.html http://dept-info.labri.fr/~schlick/publi.html Fast Alternatives to Perlin's Bias and Gain Functions Christophe Schlick Graphics Gems IV, p379-382, April 1994 } var lIndex: integer; lA,lT,lBias: single; lLUT: TLUT; begin if gRender.CutoutBias = 4 then exit; lA := (gRender.CutoutBias+1)/10; for lIndex := 1 to 254 do begin lT := lIndex/255; //lBias := 255*(lt/((1/la-2)*(1-lt)+1)) ; lBias := 255*(lt/((1/la-2)*(1-lt)+1)) ; lLUT[lIndex] := lOutLUT[round(lBias)]; {lHdr.LUT[lIndex].rgbRed := round(lBias*lHdr.LUT[lIndex].rgbRed); lHdr.LUT[lIndex].rgbGreen := round(lBias*lHdr.LUT[lIndex].rgbGreen); lHdr.LUT[lIndex].rgbBlue := round(lBias*lHdr.LUT[lIndex].rgbBlue);} //lHdr.LUT[lIndex].rgbReserved := kLUTalpha; end; for lIndex := 1 to 254 do lOutLUT[lIndex] := lLUT[lIndex]; end; procedure LUTgainX (var lOutLUT : TLUT; lBiasIn,lGainIn: integer {0..99}); {http://dept-info.labri.fr/~schlick/DOC/gem2.html http://dept-info.labri.fr/~schlick/publi.html Fast Alternatives to Perlin's Bias and Gain Functions Christophe Schlick Graphics Gems IV, p379-382, April 1994 } var lIndex,lV: integer; lA,lG,lT,lGain: single; lLUT: TLUT; begin if (lGainIn = 50) and (lBiasIn = 50){gRender.CutoutBias = 4} then exit; lA := (lBiasIn)/100; if lA = 0 then lA := 0.000001; lG := (lGainIn)/100; if lG = 0 then lG := 0.00001; if lG = 1 then lG := 0.99999; for lIndex := 1 to 254 do begin lT := lIndex/255; //apply bias lT := (lt/((1/la-2)*(1-lt)+1)) ; //next apply gain if lT < 0.5 then lGain := (lT/((1/lG-2)*(1-2*lT)+1)) else lGain := (( (1/lG-2)*(1-2*lT)-lT ) / ( (1/lG-2)*(1-2*lT)-1 ) ); lGain := lGain / lT; lV := round(255*lT*lGain); if lV > 255 then lV := 255; if lV < 0 then lV := 0; //lBias := 255*(lt/((1/la-2)*(1-lt)+1)) ; lLUT[lIndex] := lOutLUT[lV]; end; for lIndex := 1 to 254 do lOutLUT[lIndex] := lLUT[lIndex]; end; function SmoothShading (lX,lY: integer; lRenderDepthBuffer: SmallintP): boolean; var kRenderInfiniteDepth,lPrevLineStart,lNextLineStart,lLineStart,lScanLines, lGap,lDepthSum,lWeightSum,lFar,lClose,lCenter,lInc,lXmG: integer; lRenderDepthBufferS: SmallIntP; procedure AddPt (lI,lW: integer; var lSumI,lSumW: integer); begin if lI = kRenderInfiniteDepth then exit; lSumI := lSumI + (lW*lI); //add scaled value lSumW := lSumW + lW;//add weight end; //problem - smoothing gives embossed look! begin //func Smoothshading kRenderInfiniteDepth := 0; result := false; if (gRender.Zoom < 1) or (lY < 5) or (lX < 5) or (gBGImg.RenderDepthBufferItems <> (lX * lY)) then exit; lFar := 2; lClose := 3; lCenter := 5; lGap := trunc((gRender.Zoom-0.001)/1)+1; //must be at least 1! lXmG := lX-lGap; Getmem(lRenderDepthBufferS,lX*lY*sizeof(smallint)); for lInc := 1 to (lX*lY) do lRenderDepthBufferS^[lInc] := lRenderDepthBuffer^[lInc]; for lScanlines := (1+lGap) to (lY - lGap) do begin //can not compute angle for 1st and last scanline lLineStart := (lScanLines-1)*lX; //inc from 0 lPrevLineStart := lLineStart-(lX*lGap); //inc from 0 lNextLineStart := lLineStart+(lX*lGap); //inc from 0 for lInc := (1+lGap) to (lXmG) do begin lWeightSum := 0; lDepthSum := 0; AddPt (lRenderDepthBuffer^[lPrevLineStart+lInc-1],lFar,lDepthSum,lWeightSum); AddPt (lRenderDepthBuffer^[lPrevLineStart+lInc],lClose,lDepthSum,lWeightSum); AddPt (lRenderDepthBuffer^[lPrevLineStart+lInc+1],lFar,lDepthSum,lWeightSum); AddPt (lRenderDepthBuffer^[lLineStart+lInc-1],lClose,lDepthSum,lWeightSum); AddPt (lRenderDepthBuffer^[lLineStart+lInc],lCenter,lDepthSum,lWeightSum); AddPt (lRenderDepthBuffer^[lLineStart+lInc+1],lClose,lDepthSum,lWeightSum); AddPt (lRenderDepthBuffer^[lNextLineStart+lInc-1],lFar,lDepthSum,lWeightSum); AddPt (lRenderDepthBuffer^[lNextLineStart+lInc],lClose,lDepthSum,lWeightSum); AddPt (lRenderDepthBuffer^[lNextLineStart+lInc+1],lFar,lDepthSum,lWeightSum); if lWeightSum > 0 then lRenderDepthBufferS^[lLineStart+lInc] := round(lDepthSum/lWeightSum); end; //columns end; //for scanlines: rows for lInc := 1 to (lX*lY) do lRenderDepthBuffer^[lInc] := lRenderDepthBufferS^[lInc]; freemem(lRenderDepthBufferS); result := true; end; //function SmoothShading function IlluminationShading (lX,lY,lPct: integer; lImgBuffer: bytep; lRenderDepthBuffer: SmallintP): boolean; var kRenderInfiniteDepth,lXm1,lPrevLineStart,lNextLineStart,lLineStart,lScanLines, lIntensity,lInc,lGrayMin,lGrayMax: integer; lShadeFrac,lImgFrac, lPhongMagic,lMagic,lYVal,lXVal,lNormalPlane,lXLight,lYLight,lZLight,lLightVectorNormalise: single; lShadeBuffer: bytep; begin //func illumination shading result := false; if (lPct < 1) or (lY < 5) or (lX < 5) or (gBGImg.RenderDepthBufferItems <> (lX * lY)) then exit; lMagic := 1; lPhongMagic := 1; kRenderInfiniteDepth := 0; lXLight := 0;//RenderForm.XL.value / 100;//lXLight / lLightVectorNormalise; lYLight := -0.5;//Renderform.YL.value / 100;//lYLight / lLightVectorNormalise; lZLight := -1;//RenderForm.ZL.value / 100;//lZLight / lLightVectorNormalise; lLightVectorNormalise := sqrt(sqr(lXLight)+sqr(lYLight)+sqr(lZLight)); lXLight := lXLight / lLightVectorNormalise; lYLight := lYLight / lLightVectorNormalise; lZLight := lZLight / lLightVectorNormalise; lGrayMin := 0{64}; lGrayMax := 255 - lGrayMin; lXm1 := lX-1; Getmem(lShadeBuffer,lX*lY*sizeof(byte)); fillchar(lShadeBuffer^,lX*lY,0); for lScanlines := 2 to (lY - 1) do begin //can not compute angle for 1st and last scanline lLineStart := (lScanLines-1)*lX; //inc from 0 lPrevLineStart := lLineStart-lX; //inc from 0 lNextLineStart := lLineStart+lX; //inc from 0 for lInc := 2 to (lXm1) do begin if lImgBuffer^[lLineStart+lInc] <> 0 then begin //only shade non-zero intensities if ( lRenderDepthBuffer^[lPrevLineStart+lInc-1]<>kRenderInfiniteDepth) and (lRenderDepthBuffer^[lPrevLineStart+lInc]<>kRenderInfiniteDepth) and (lRenderDepthBuffer^[lPrevLineStart+lInc+1]<>kRenderInfiniteDepth) and (lRenderDepthBuffer^[lLineStart+lInc-1]<>kRenderInfiniteDepth) and (lRenderDepthBuffer^[lLineStart+lInc]<>kRenderInfiniteDepth) and (lRenderDepthBuffer^[lLineStart+lInc+1]<>kRenderInfiniteDepth) and (lRenderDepthBuffer^[lNextLineStart+lInc-1]<>kRenderInfiniteDepth) and (lRenderDepthBuffer^[lNextLineStart+lInc]<>kRenderInfiniteDepth) and (lRenderDepthBuffer^[lNextLineStart+lInc+1]<>kRenderInfiniteDepth) then begin lYVal := lRenderDepthBuffer^[lPrevLineStart+lInc-1]+lRenderDepthBuffer^[lPrevLineStart+lInc]+lRenderDepthBuffer^[lPrevLineStart+lInc+1] -lRenderDepthBuffer^[lNextLineStart+lInc-1]-lRenderDepthBuffer^[lNextLineStart+lInc]-lRenderDepthBuffer^[lNextLineStart+lInc+1]; lXVal := lRenderDepthBuffer^[lPrevLineStart+lInc-1]+lRenderDepthBuffer^[lLineStart+lInc-1]+lRenderDepthBuffer^[lNextLineStart+lInc-1] -lRenderDepthBuffer^[lPrevLineStart+lInc+1]-lRenderDepthBuffer^[lLineStart+lInc+1]-lRenderDepthBuffer^[lNextLineStart+lInc+1]; lNormalPlane := sqrt(sqr(lXVal)+sqr(lYVal)+sqr(lMagic)); if lNormalPlane <> 0 then begin lNormalPlane := -((-lXLight*lXVal)-(lYLight*lYVal)+lMagic*lZLight)/lNormalPlane; if {lImageAndShade} false then begin lNormalPlane := Power(lNormalPlane,lPhongMagic); //lIntensity := gProjBuffer[lLineStart+lInc]; //lIntensity := lPropShadingPivot+round((lPctImage*(lIntensity-lPropShadingPivot))+(lPctShade*(lNormalPlane-0.5)) ); if lIntensity > 254 then lIntensity := 254; lShadeBuffer^[lLineStart+lInc] := lIntensity; end else begin //shading only //if lAbbaRandom then //abba lNormalPlane := (lNormalPlane+1) / 2; if lNormalPlane > 0 then begin lNormalPlane := Power(lNormalPlane,lPhongMagic); //if lAbbaRandom then //abba //if lNormalPlane < 0.5 then lNormalPlane := 1-lNormalPlane; //backlighting lShadeBuffer^[lLineStart+lInc] := lGrayMin{64}+ round(lNormalPlane*(lGrayMax)); end else lShadeBuffer^[lLineStart+lInc] := lGrayMin; end; //Shading vs ImageAndShading end; //NormalPlane = 0 end else begin //samples for each pixel if {lImageAndShade}false then lShadeBuffer^[lLineStart+lInc] := 0//lPropShadingPivot+round((lPctImage*(gProjBuffer[lLineStart+lInc]-lPropShadingPivot))+(lPctShade*(-0.5)) )//1362 else lShadeBuffer^[lLineStart+lInc] := lGrayMin;//1363;'# 20{64}; end; end; //only shade non-zero intensities end; //columns end; //for scanlines: rows if lPct > 99 then begin for lInc := 1 to (lX*lY) do lImgBuffer^[lInc] := lShadeBuffer^[lInc]; end else begin //partial shade lImgFrac := (100-lPct)/100; lShadeFrac := lPct/100; for lInc := 1 to (lX*lY) do lImgBuffer^[lInc] := round((lImgBuffer^[lInc]* lImgFrac) + (lShadeBuffer^[lInc]*lShadeFrac )); end; freemem(lShadeBuffer); result := true; end; //function illuminationshading procedure LUTLoad( lLUTindex: integer; var lLUT: TLUT); var lHdr: TMRIcroHdr; lStr: string; lInc: integer; begin //gMRIcroOverlay[lLayer].LUTindex := LUTdrop.ItemIndex; if lLUTindex < knAutoLUT then begin LoadMonochromeLUT(lLUTindex,gBGImg,lHdr); end else begin //if B&W lut lStr := gColorSchemeDir+pathdelim+ImgForm.LUTdrop.Items.Strings[lLUTindex]+'.lut'; if not FileExistsEX(lStr) then showmessage('Can not find '+lStr); LoadColorScheme(lStr, lHdr); end; for lInc := 0 to 255 do lLUT[lInc] := lHdr.LUT[lInc]; end; procedure CreateRender(var lBGHdr, lHdr: TMRIcroHdr; var lX,lY,lZ,lInRenderSurface,lInRenderDpeth: Integer; var lQuadP: RGBQuadp; Smooth2D, NormalizeIntensity,lCreateDepthBuffer: boolean;lUseDepthBuffer: integer); var lLUT : array [0..255] of byte; lrgbLUT: TLUT;// array[0..255] of TRGBQuad; //lTime: DWord; lSrc,lOutBuffer: Bytep; lShade,lShadePrecise: boolean; lPreciseDepthBuffer: Smallintp; lMaxInten,lDepth,lPixel,lSamples,lSliceOffset,lIntensity,lSliceSz,lSliceEnd,lSliceStart, lVolSz,lRenderDepth,lRenderSurface,lTemp,lNear,lSubPixel,lClip: integer; begin lShade := false; lShadePrecise := false; if {(gRender.BGNearClip<>0) or} (gRender.ShowCutout) then lMaxInten := 254 else lMaxInten := 257; lRenderDepth := lInRenderDpeth; if (lHdr.IMgBufferItems > 0) {2/2008} and (lHdr.NIFTIhdr.intent_code = kNIFTI_INTENT_LABEL) then lRenderDepth := 1; lRenderSurface := lInRenderSurface; //if not lCreateDepthBuffer then if (lHdr.IMgBufferItems > 0) {2/2008} and (lHdr.NIFTIhdr.intent_code = kNIFTI_INTENT_LABEL) then lRenderSurface := 1 else begin //make sure at least some voxels are below air-surface threshold if (lHdr.WindowScaledMin <= (Raw2ScaledIntensity(lHdr,lHdr.GlMinUnscaledS) )) and (lHdr.WindowScaledMax <> 0 ) then begin lTemp := round( (Raw2ScaledIntensity(lHdr,lHdr.GlMinUnscaledS)-lHdr.WindowScaledMin)/(lHdr.WindowScaledMax)*255); //showmessage(inttostr(lTemp)); if lTemp >= lRenderSurface then lRenderSurface := lTemp + 1; end; end; if (lUseDepthBuffer=kBelow) then begin CreateOverlayRenderBehind(lBGHdr,lHdr, lX,lY,lZ,lRenderSurface,lRenderDepth, lQuadP, Smooth2D); exit; end; if (lUseDepthBuffer=kInFront) then begin CreateOverlayRenderInfrontNear(lBGHdr,lHdr, lX,lY,lZ,lRenderSurface,lRenderDepth, lQuadP, Smooth2D); exit; end; lSrc := lHdr.RenderBuffer; lSliceSz := lX*lY; lVolSz := lSliceSz * lZ; GetMem (lOutBuffer , lX*lY); //gRender.ClipFrac := kMaxFrac div 2; lClip := round(gRender.ClipFrac/kMaxFrac * lX); if lClip >= lX then lClip := 0; if lCreateDepthBuffer then begin if (gRender.ShadePct > 0) then begin lShade := true; if lRenderDepth > 0 then begin//not MIP lShadePrecise := true; getmem(lPreciseDepthBuffer,lSliceSz * sizeof(smallint)); fillchar(lPreciseDepthBuffer^,lSliceSz* sizeof(smallint),0); end; end; if gBGImg.RenderDepthBufferItems <> lSliceSz then begin if gBGImg.RenderDepthBufferItems > 0 then Freemem(gBGImg.RenderDepthBuffer); gBGImg.RenderDepthBufferItems := lSliceSz; GetMem(gBGImg.RenderDepthBuffer,lSliceSz*sizeof(smallint)); end; fillchar(gBGImg.RenderDepthBuffer^,lSliceSz* sizeof(smallint),0); //lTime := gettickcount; if lRenderDepth < 1 then begin//MIP for lPixel := 1 to lSliceSz do begin lIntensity := 0; lSliceStart := ((lPixel-1)* lX)+1; lSliceOffset := lSliceStart+lClip; //start with nearest slice lSliceEnd := lSliceStart + lX; while (lSliceOffset < lSliceEnd) do begin if (lSrc^[lSliceOffset] < lMaxInten) and (lSrc^[lSliceOffset] > lIntensity) then begin lIntensity := lSrc^[lSliceOffset]; gBGImg.RenderDepthBuffer^[lPixel] := lSliceOffset - lSliceStart; end; inc(lSliceOffset,1); end; //while traversing front to back lOutBuffer^[lPixel]:= lIntensity; end; //for each pixel end else begin //if MIP else use opacity filter... for lPixel := 1 to lSliceSz do begin lDepth := 0; lSamples := 0; lIntensity := 0; lSliceStart := ((lPixel-1)* lX)+1; lSliceOffset := lSliceStart+lClip; //start with nearest slice lSliceEnd := (lPixel* lX); while (lDepth < lRenderDepth) and (lSliceOffset < lSliceEnd) do begin if (lSrc^[lSliceOffset] < lMaxInten) and ((lDepth > 0) or (lSrc^[lSliceOffset] > lRenderSurface)) then begin inc(lDepth); if (lSrc^[lSliceOffset] > lRenderSurface) then begin lIntensity := lIntensity+ lSrc^[lSliceOffset]; inc(lSamples); end; if (lDepth = 1) then begin gBGImg.RenderDepthBuffer^[lPixel] := lSliceOffset - lSliceStart; if (gBGImg.RenderDepthBuffer^[lPixel]=lCLip ) or ((gBGImg.RenderDepthBuffer^[lPixel] > 1) and (lSrc^[lSliceOffset-1]>=lMaxInten)) then begin //cutout if lSrc^[lSliceOffset-1]=lMaxInten-1 then lIntensity := 0; lDepth := lRenderDepth; gBGImg.RenderDepthBuffer^[lPixel] := -gBGImg.RenderDepthBuffer^[lPixel]; //negative: this is a cutout end; if lShade then begin if (gBGImg.RenderDepthBuffer^[lPixel] > 1) then begin //estimate surface depth with sub-pixel accuracy lNear := lSrc^[lSliceOffset-1]; lSubPixel := lIntensity-lNear; //delta lSubPixel := round(((lRenderSurface-lNear)/lSubPixel)*10); if lNear >= lMaxInten then //cutout lSubPixel := 0; end else lSubpixel := 0; lPreciseDepthBuffer^[lPixel] := (gBGImg.RenderDepthBuffer^[lPixel] * 10)+lSubPixel; end; end; end; inc(lSliceOffset,1); end; //while no voxel found if lDepth > 0 then lIntensity := lIntensity div lSamples; //lIntensity := lIntensity div lDepth; //mean of nDepth voxels lOutBuffer^[lPixel]:= lIntensity; end; //for each pixel 1..sliceSz if (Smooth2D) and (lHdr.NIFTIhdr.intent_code <> kNIFTI_INTENT_LABEL) then //do not smooth labels Smooth2DImage (lX,lY, lOutBuffer); //only smooth volume renderings - not MIPS (they looked embossed) end; //if not MIP end else begin //do not create depth buffer for lPixel := 1 to lSliceSz do begin lDepth := 0; lSamples := 0; lIntensity := 0; lSliceOffset := ((lPixel-1)* lX)+1+lClip; //start with nearest slice lSliceEnd := (lPixel* lX); while (lDepth < lRenderDepth) and (lSliceOffset < lSliceEnd) do begin if (lSrc^[lSliceOffset] < lMaxInten) and ((lDepth > 0) or (lSrc^[lSliceOffset] > lRenderSurface)) then begin inc(lDepth); if (lSrc^[lSliceOffset] > lRenderSurface) then begin lIntensity := lIntensity+ lSrc^[lSliceOffset]; inc(lSamples); end; end; inc(lSliceOffset,1); end; //while no voxel found if lDepth > 0 then lIntensity := lIntensity div lSamples; //lIntensity := lIntensity div lDepth; //mean of nDepth voxels lOutBuffer^[lPixel]:= lIntensity; end; //for each pixel end; //volume render without depth buffer //RenderForm.Caption := inttostr(gettickcount - lTime)+' '+inttostr(lRenderDepth); if (NormalizeIntensity) and (lRenderSurface < 254) then begin //do BEFORE shading! for lPixel := 0 to 255 do lLUT[lPixel] := 0; for lPixel := lRenderSurface to 255 do lLUT[lPixel] := round(255*(lPixel-lRenderSurface)/(255-lRenderSurface)); for lPixel := 1 to lSliceSz do lOutBuffer^[lPixel] := lLUT[lOutBuffer^[lPixel]]; end; if lShade then begin if lShadePrecise then begin SmoothShading (lX,lY,lPreciseDepthBuffer); IlluminationShading(lX,lY,gRender.ShadePct,lOutBuffer,lPreciseDepthBuffer{gBGImg.RenderDepthBuffer} ); freemem(lPreciseDepthBuffer); end else IlluminationShading(lX,lY,gRender.ShadePct,lOutBuffer,gBGImg.RenderDepthBuffer); end;//shading for lPixel := 0 to 255 do lrgbLUT[lPixel] := lHdr.LUT[lPixel]; if (lHdr.NIFTIhdr.intent_code <> kNIFTI_INTENT_LABEL) then LUTGainX(lrgbLUT,gRender.Bias,gRender.Gain ); //Mar2007 for lPixel := 1 to lSliceSz do lQuadP^[lPixel]:= lrgbLUT[lOutBuffer^[lPixel]]; if ((lClip >0) or (gRender.ShowCutout)) and (lCreateDepthBuffer) then begin //make cutout grayscale, shade edges if gRender.ShowCutout then ShadeCutoutCrease(lOutBuffer); LUTLoad(gRender.cutoutLUTindex,lrgblut);//11/2007 {for lPixel := 0 to 255 do begin lrgbLUT[lPixel].rgbRed := lPixel; lrgbLUT[lPixel].rgbGreen := lPixel; lrgbLUT[lPixel].rgbBlue := lPixel; lrgbLUT[lPixel].rgbReserved := kLUTalpha; end;}//create grayscale LUT LUTBiasX(lrgbLUT); for lPixel := 1 to lSliceSz do if gBGImg.RenderDepthBuffer^[lPixel]<0 then //cutout lQuadP^[lPixel]:= lrgbLUT[lOutBuffer^[lPixel]]; end; //if BGimg with Cutout Freemem(lOutBuffer); end; function RenderDepth (lVal: integer): integer;//11/2007 begin if (lVal > 0) and (lVal < 16000) and (gBGImg.ScrnMM[1] > 0.1) and (gBGImg.ScrnMM[1] < 10) then begin result:= round (lVal / gBGImg.ScrnMM[1]); if result < 1 then result := 1; end else result := lVal; result := round(result * gRender.Zoom); end; procedure DrawRender; var lBGQuadP, lOverlayQuadP, l2ndOverlayQuadP: RGBQuadp; lUseBGSurface,lnOverlay,lOverlay, lX,lY,lZ,lSliceSz,lRenderSurface,lRenderDepth: longint; lBG0Clr,lOverlay0Clr: DWord; lSmooth : boolean; begin lRenderSurface := gRender.BGSurface; //lRenderDepth:= gRender.BGDepth; lRenderDepth:= RenderDepth(gRender.BGDepth);//11/2007 lSmooth := gRender.SmoothBG; lUseBGSurface := gRender.OverlayFromBGSurface ; lX := gMRIcroOverlay[kBGOverlayNum].RenderDim; lY := lX; lZ := lX; lSliceSz := (lX * lY); if (gMRIcroOverlay[kBGOverlayNum].RenderBufferItems=0)or (lX < 2) or (lY < 2) or (lZ < 2) or ((lX*lY*lZ) > gMRIcroOverlay[kBGOverlayNum].RenderBufferItems{ScrnBufferItems}) then exit; GetMem ( lBGQuadP, lSliceSz*4); CreateRender(gMRIcroOverlay[kBGOverlayNum],gMRIcroOverlay[kBGOverlayNum], lX,lY,lZ,lRenderSurface,lRenderDepth, lBGQuadP, lSmooth, true,true,0); //next: overlays lSmooth := gRender.SmoothOverlay; lRenderSurface := gRender.OverlaySurface; //lRenderDepth:= gRender.OverlayDepth; lRenderDepth:= RenderDepth(gRender.OverlayDepth);//11/2007 lnOverlay := 0; lBG0Clr:= TRGBQuad2DWord(gMRIcroOverlay[0].LUTinvisible);//just to avoid compiler warning hint - never used... for lOverlay := knMaxOverlay downto 1 do begin if gMRIcroOverlay[lOverlay].RenderBufferItems{ScrnBufferItems} > 0 then begin if lOverlay = kVOIOverlayNum then //Aug2007 lRenderSurface := 0 else lRenderSurface := gRender.OverlaySurface;// inc(lnOverlay); if lnOverlay = 1 then begin //top overlay GetMem ( lOverlayQuadP , lSliceSz*4); lBG0Clr:= TRGBQuad2DWord(gMRIcroOverlay[lOverlay].LUTinvisible); CreateRender(gMRIcroOverlay[kBGOverlayNum],gMRIcroOverlay[lOverlay],lX,lY,lZ,lRenderSurface,lRenderDepth,lOverlayQuadP,lSmooth,false,false,lUseBGSurface); end else begin //2nd or lower overlay if lnOverlay = 2 then //2nd overlay GetMem ( l2ndOverlayQuadP , lSliceSz*4); CreateRender(gMRIcroOverlay[kBGOverlayNum],gMRIcroOverlay[lOverlay], lX,lY,lZ,lRenderSurface,lRenderDepth,l2ndOverlayQuadP,lSmooth,false,false,lUseBGSurface); lOverlay0Clr:= TRGBQuad2DWord(gMRIcroOverlay[lOverlay].LUTinvisible); AlphaBlend32(lOverlayQuadP,l2ndOverlayQuadP, lBG0Clr,lOverlay0Clr, lSliceSz,gBGImg.OverlayTransPct); end; //2nd overlay or more end; //overlay loaded end; //for knOverlay..1 //Finally: draw overlays on BG if lnOverlay > 0 then begin lOverlay0Clr := lBG0Clr; //lBG0Clr := DWord(lHdr.LUTinvisible); lBG0Clr := 0;//0=impossible, no alpha DWord(lHdr.LUT[0]); if lnOverlay > 1 then FreeMem ( l2ndOverlayQuadP); AlphaBlend32(lBGQuadP,lOverlayQuadP, lBG0Clr,lOverlay0Clr, lSliceSz,gBGImg.BGTransPct); FreeMem ( lOverlayQuadP); end; //draw image SetDimension32(lY,lX, lBGQuadP, gBGImg, RenderForm.RenderImage, RenderForm.RenderPanel); SetDimension32(lY,lX, lBGQuadP, gBGImg, RenderForm.RenderImageBUP, RenderForm.RenderPanel); FreeMem ( lBGQuadP); if gBGImg.RenderDepthBufferItems > 0 then //negative depth was used for cutouts, now set to true depth for lX := 1 to gBGImg.RenderDepthBufferItems do gBGImg.RenderDepthBuffer^[lX] := abs(gBGImg.RenderDepthBuffer^[lX]); end; procedure SliceToFrac(var lBGImg: TBGImg); var lInc: integer; begin SortCutOut (gRender.CutOut); for lInc := 1 to 3 do begin if lBGImg.ScrnDim[lInc] < 1 then begin gRender.CutoutFrac.Lo[lInc] := round (0.5* kMaxFrac); gRender.CutoutFrac.Hi[lInc] := kMaxFrac; end else begin gRender.CutoutFrac.Lo[lInc] := round(kMaxFrac * gRender.Cutout.Lo[lInc]/lBGImg.ScrnDim[lInc]); gRender.CutoutFrac.Hi[lInc] := round(kMaxFrac * gRender.Cutout.Hi[lInc]/lBGImg.ScrnDim[lInc]); end; end; end; procedure SetLimits(var lBGImg: TBGImg); var lInc: integer; lUpdateCutout: boolean; lScale: single; begin SortCutOut (gRender.CutOutFrac); if gRender.CutoutFrac.Lo[1] < 0 then SliceToFrac(lBGImg); lScale := 1/kMaxFrac; for lInc := 1 to 3 do begin gRender.Cutout.Lo[lInc] := round(gBGImg.ScrnDim[lInc] * lScale * gRender.CutoutFrac.Lo[lInc]); gRender.Cutout.Hi[lInc] := round(gBGImg.ScrnDim[lInc] * lScale * gRender.CutoutFrac.Hi[lInc]); end; lUpdateCutout := true; for lInc := 1 to 3 do if gRender.Cutout.Lo[lInc] <> gRender.Cutout.Hi[lInc] then lUpdateCutout := false; if lUpdateCutout then for lInc := 1 to 3 do begin gRender.Cutout.Lo[lInc] := gBGImg.ScrnDim[lInc] div 2; gRender.Cutout.Hi[lInc] := gBGImg.ScrnDim[lInc]; end; for lInc := 1 to 3 do begin if gRender.Cutout.Lo[lInc] < 1 then gRender.Cutout.Lo[lInc] := 1; if gRender.Cutout.Lo[lInc] > lBGImg.ScrnDim[lInc] then gRender.Cutout.Lo[lInc] := lBGImg.ScrnDim[lInc]; if gRender.Cutout.Hi[lInc] < 1 then gRender.Cutout.Hi[lInc] := 1; if gRender.Cutout.Hi[lInc] > lBGImg.ScrnDim[lInc] then gRender.Cutout.Hi[lInc] := lBGImg.ScrnDim[lInc]; end; end; procedure VolumeRotateMatrix (var lBGImg: TBGImg; var lHdr: TMRIcroHdr; var lMatrixIn: TMatrix; lBilinearSmooth,lRenderCutout,lIsBG: boolean {;lNearSlicesClipIn: integer}); label 345; const kUgly2 = 10000; //kSh = 10; //bits to shift kUgly1 = (kUgly2 shl kSh) + (1 shl kSh); var l: TRotateVals; lZinc,lZ,lY,lX,lOutVolSz, lOutPos,lInVolSz, lYo,lZo,lnThreads: integer; lBuffIn,lSrcBuff,lBuffOut: Bytep; lXxp,lXyp,lXzp: Pointer; lStartTime: DWord; lM, lScale,lMatrix: TMatrix; lZoomRatio: Single; begin lMatrix := lMatrixIn; if (gRender.Zoom <> 0) and (gRender.Zoom <> 1 )then begin lZoomRatio := 1/gRender.Zoom; lScale := Matrix3D(lZoomRatio,0,0,0, 0,lZoomRatio,0,0, 0,0,lZoomRatio,0, 0,0,0,0); lMatrix := MultiplyMatrices(lMatrixIn,lScale); end else gRender.Zoom := 1; //lScale := Matrix3D(0,1,0,0, 1,0,0,0, 0,0,1,0, 0,0,0,0); //lScale := Matrix3D(0,1,0,0, 0,0,1,0, 1,0,0,0, 0,0,0,0); lScale := Matrix3D(0,1,0,0, 0,0,1,0, 1,0,0,0, 0,0,0,0); lMatrix := MultiplyMatrices(lMatrix,lScale); lStartTime := GetTickCount; l.XdimIn := lBGImg.ScrnDim[1]; l.YdimIn := lBGImg.ScrnDim[2]; l.ZdimIn := lBGImg.ScrnDim[3];; l.InSliceSz := l.XDimIn*l.YDimIn; lInVolSz := l.XdimIn*l.YdimIn*l.ZdimIn; //InVolSz! if (lHdr.ScrnBufferItems < lInVolSz) then exit; lSrcBuff := lHdr.ScrnBuffer; l.OutDim := MaxDim(l.XDimIn,l.YDimIn,l.ZDimIn); l.OutDim := round(gRender.Zoom * l.OutDim); //11/2007 (*lNearSlicesClip := lNearSlicesClipIn;//May07 if lNearSlicesClip >= l.OutDim then //May07 lNearSlicesClip := 0; //May07*) lBGImg.RenderDim := l.OutDim; lHdr.RenderDim := l.OutDim; //l.RenderCutout := false; if (lRenderCutout) then begin //l.RenderCutout := true; SetLimits(lBGImg); GetMem(lBuffIn, lInVolSz); Move(lSrcBuff^,lBuffIn^,lInVolSz); for lZ := 1 to lInVolSz do if lBuffIn^[lZ] >= 254 then lBuffIn^[lZ] := 253; if lRenderCutout then begin for lZ := gRender.Cutout.Lo[3] to gRender.Cutout.Hi[3] do begin lZo := (lZ-1) * l.InSliceSz; Application.ProcessMessages; for lY := gRender.Cutout.Lo[2] to gRender.Cutout.Hi[2] do begin lYo := (lY-1) * l.XdimIn; for lX := gRender.Cutout.Lo[1] to gRender.Cutout.Hi[1] do lBuffIn^[lX+lYo+lZo] := 255; end; //for lY end; //for lZ end; end else lBuffIn := lSrcBuff; l.OutPivot := (lHdr.RenderDim+1) shr 1; //e.g. if DimMax=9, then pivot is 5 l.XPivotIn := ((l.XdimIn+1) shr 1); //e.g. if DimMax=9, then pivot is 5 l.YPivotIn := ((l.YdimIn+1) shr 1); //e.g. if DimMax=9, then pivot is 5 l.ZPivotIn := ((l.ZdimIn+1) shr 1); //e.g. if DimMax=9, then pivot is 5 l.YDimStart := -l.OutPivot+1; //e.g. if 9, start from -4 l.ZDimStart := l.YDimStart ; l.YDimEnd := l.YDimStart+lHdr.RenderDim-1; //e.g. if 9, go to 4 l.ZDimEnd := l.YDimEnd; if l.ZDimStart >= l.ZDimEnd then l.ZDImStart := l.ZDimStart; l.OutSliceSz := sqr(lHdr.RenderDim); lOutVolSz := lHdr.RenderDim*l.OutSliceSz; if lHdr.RenderBufferItems <> lOutVolSz then begin if lHdr.RenderBufferItems > 0 then Freemem(lHdr.RenderBuffer); lHdr.RenderBufferItems := lOutVolSz; try GetMem(lHdr.RenderBuffer,lOutVolSz); except //12/2007 showmessage('Volume Rotate Error: System memory exhausted.'); lHdr.RenderBufferItems := 0; exit; end; end; lBuffOut := lHdr.RenderBuffer; fillchar(lBuffOut^,lOutVolSz,0); //set all to zero //lMatrix := InvertMatrix3D(lMatrix); lZ := (sizeof(longint)* l.OutDim)+16; GetMem(lXxp, lZ); GetMem(lXyp, lZ); GetMem(lXzp, lZ); // if RenderForm.RenderRefreshTimer.enabled then goto 345;//abort {$IFNDEF FPC} l.XxRA := LongIntP($fffffff0 and (integer(lXxP)+15)); //data aligned to quad-word boundary l.XyRA := LongIntP($fffffff0 and (integer(lXyP)+15)); //quad-word boundary l.XzRA := LongIntP($fffffff0 and (integer(lXzP)+15)); //quad-word boundary} {$ELSE} l.XxRA := system.align(lXxP, 16); //data aligned to quad-word boundary l.XyRA := system.align(lXyP, 16); //quad-word boundary l.XzRA := system.align(lXzP, 16); //quad-word boundary {$ENDIF} for lX := 1 to l.OutDim do begin l.XxRA^[lX] := round((lX-l.OutPivot)*lMatrix.matrix[1,1]* (1 shl kSh) )+kUgly1; l.XyRA^[lX] := round((lX-l.OutPivot)*lMatrix.matrix[2,1]* (1 shl kSh) )+kUgly1; l.XzRA^[lX] := round((lX-l.OutPivot)*lMatrix.matrix[3,1]* (1 shl kSh) )+kUgly1; end; l.XPivotInU2 := l.XPivotIn-kUgly2; l.YPivotInU2 := l.YPivotIn-kUgly2; l.ZPivotInU2 := l.ZPivotIn-kUgly2; {$IFNDEF NoThreads} lnThreads := gnCPUThreads; {$ELSE} lnThreads := 1; {$ENDIF} //if lIsBG then //TextForm.Memo1.Lines.Add( 'bg'+(inttostr(RenderForm.ThreadsRunning)+' '+inttostr(lnThreads))) //else //TextForm.Memo1.Lines.Add( 'xx'+(inttostr(RenderForm.ThreadsRunning)+' '+inttostr(lnThreads))); lZ := l.ZDimStart; lZo := l.ZDimEnd; lZinc := (l.ZDimEnd - l.ZDimStart) div lnThreads; l.ZDimEnd := l.ZDimStart + lZinc; //showmessage( inttostr(l.ZDimStart)+'..'+inttostr(l.ZDimEnd) +' '+inttostr(lZo)); if l.ZDimEnd > ImgForm.ProgressBar1.Min then begin //crashes if max < min, so write order important... ImgForm.ProgressBar1.Max := l.ZDimEnd+1; ImgForm.ProgressBar1.Min := l.ZDimStart; end else begin ImgForm.ProgressBar1.Min := l.ZDimStart; ImgForm.ProgressBar1.Max := l.ZDimEnd+1; end; {$IFNDEF NoThreads} Application.processmessages; for lX := 1 to lnThreads do begin if lX = lnThreads then l.ZDimEnd := lZo; //avoid integer rounding error //TextForm.Memo1.Lines.Add('+'+inttostr(lX)); if (lBilinearSmooth) and (lHdr.NIFTIhdr.intent_code <> kNIFTI_INTENT_LABEL) then TTriRender.Create(ImgForm.ProgressBar1,lX,l,lMatrix, lRenderCutout, lBuffIn,lBuffOut) else TNNRender.Create(ImgForm.ProgressBar1,lX,l,lMatrix, lRenderCutout, lBuffIn,lBuffOut); inc(ThreadsRunning); l.ZDimStart := l.ZDimEnd + 1; l.ZDimEnd := l.ZDimEnd + lZInc; end; //for each thread l.ZDimStart := lZ; repeat Application.processmessages; until ThreadsRunning = 0; Application.processmessages; {$ELSE}//not threaded l.ZDimEnd := lZo; //avoid integer rounding error if (lBilinearSmooth) and (lHdr.NIFTIhdr.intent_code <> kNIFTI_INTENT_LABEL) then TriRotate(ImgForm.ProgressBar1,l,lMatrix, lRenderCutout, lBuffIn,lBuffOut) else NNRotate(ImgForm.ProgressBar1,l,lMatrix, lRenderCutout, lBuffIn,lBuffOut); {$ENDIF} FreeMem(lXxp); FreeMem(lXyp); FreeMem(lXzp); if (lRenderCutout) then begin FreeMem(lBuffIn); end; ImgForm.ProgressBar1.Position := l.ZDimStart; ImgForm.StatusLabel.caption :=('update(ms): '+inttostr(GetTickCount-lStartTime)); end; //proceudre VolumeRotate; end. mricron-0.20120505.1~dfsg.1.orig/RenderThds.pas0000664000175000017500000005336311641356320020432 0ustar michaelmichaelunit RenderThds; interface {$include isthreaded.inc} {$mode delphi} uses {$IFDEF UNIX} lclintf,//critical sections {$ELSE} Windows, {$ENDIF} ComCtrls,Classes, Graphics, ExtCtrls, define_types,GraphicsMathLibrary ,sysutils; const kSh = 10; //bits to shift - precision for integers to simulate floats var ThreadsRunning: Integer = 0; type TRotateVals = record InSliceSz,ZDimStart,ZDimEnd,YDimStart,YDimEnd,OutPivot,OutDim,OutSliceSz: integer; XPivotInU2,YDimIN,YPivotInU2,ZDimIN,ZPivotInU2,XDimIN: integer; XPivotIn,YPivotIn,ZPivotIn: integer; Xxra,Xyra,Xzra: longintp; //RenderCutout: boolean; end; TRenderThread = class(TThread) private lBarX: TProgressBar; lRV: TRotateVals; lMx : TMatrix; lThreadX: integer; lRenderCutoutX: boolean; lBuffInX,lBuffOutX: ByteP; lPosX: integer; procedure DoVisualSwap; protected procedure Execute; override; procedure VisualProg(lPos: Integer); procedure Rotate(lThread: integer; l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); virtual; abstract; public constructor Create(lBar: TProgressBar; lThread: integer; l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); end; { NearestNeighbor } TNNRender = class(TRenderThread) protected procedure Rotate(lThread: integer;l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); override; end; { Trilinear } TTriRender = class(TRenderThread) protected procedure Rotate(lThread: integer;l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); override; end; implementation uses Render; var {$IFDEF UNIX} {$ifdef cpux86_64} CritSect : QWord; {$else} CritSect : LongWord; {$endif} {$ELSE} CritSect : TRTLCriticalSection; {$ENDIF} procedure ThreadDone; begin EnterCriticalSection(CritSect); Dec(ThreadsRunning); LeaveCriticalSection(CritSect); end; procedure TRenderThread.DoVisualSwap; begin {$IFDEF SHOWPROG} lBarX.Position := lPosX; {$ENDIF} end; procedure TRenderThread.VisualProg(lPos: Integer); begin lPosX := lPos; {$IFDEF SHOWPROG} {$IFDEF FPC} Synchronize(DoVisualSwap); {$ELSE} Synchronize(DoVisualSwap); {$ENDIF} {$ENDIF} end; constructor TRenderThread.Create(lBar: TProgressBar;lThread: integer;l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); begin lBarX := lBar; lRV := l; lMx := lM; lRenderCutoutX := lRenderCutout; lBuffInX := lBuffIn; lBuffOutX := lBuffOut; lThreadX := lThread; FreeOnTerminate := True; inherited Create(False); end; // The Execute method is called when the thread starts procedure TRenderThread.Execute; begin Rotate(lThreadX,lRV,lMx,lRenderCutoutX, lBuffInX,lBuffOutX); end; procedure FindXBounds (var lXMax,lXMin: integer; lXDimIN,lYxiZxi,lXPivotInU2,lYDimIN,lYyiZyi,lYPivotInU2,lZDimIN,lYziZzi,lZPivotInU2,lOutDim:integer; lXxra,lXyra,lXzra : LongIntP); var lXo,lYo,lZo,Xo_at_one,Xo_at_two,Xo_grad,Xo_offs,lShiftedOne : integer; when_it_is_zero, when_it_is_max: double; lReallySmall {, debugx0, debugx1, debugy0, debugy1, debugz0, debugz1}: double; l2: integer; begin lXMax := lOutDim; lXMin := 1; l2 := 2; lShiftedOne := 1 shl ksh; lReallySmall := 1e-6; Xo_at_one := lXxRA^[1] +lYxiZxi + (lXPivotInU2 shl kSh); Xo_at_two := lXxRA^[l2] +lYxiZxi + (lXPivotInU2 shl kSh); Xo_grad := Xo_at_two - Xo_at_one; Xo_offs := Xo_at_one - Xo_grad; if Abs(Xo_grad) > lReallySmall then begin when_it_is_zero := (lShiftedOne-Xo_offs) / Xo_grad; when_it_is_max := ((lXDimIn shl kSh)-Xo_offs) / Xo_grad; //debugx0 := when_it_is_zero; debugx1 := when_it_is_max; if (when_it_is_zero < when_it_is_max) then begin if when_it_is_zero > lXMin then lXMin := Round(when_it_is_zero+0.5); if when_it_is_max < lXMax then lXMax := Round(when_it_is_max-0.5); end else begin if when_it_is_max > lXMin then lXMin := Round(when_it_is_max+0.5); if when_it_is_zero < lXMax then lXMax := Round(when_it_is_zero-0.5); end; end; Xo_at_one := lXyRA^[1] +lYyiZyi + (lYPivotInU2 shl kSh); Xo_at_two := lXyRA^[l2] +lYyiZyi + (lYPivotInU2 shl kSh); Xo_grad := Xo_at_two - Xo_at_one; Xo_offs := Xo_at_one - Xo_grad; if Abs(Xo_grad) > lReallySmall then begin when_it_is_zero := (lShiftedOne-Xo_offs) / Xo_grad; when_it_is_max := ((lYDimIn shl kSh)-Xo_offs) / Xo_grad; //debugy0 := when_it_is_zero; debugy1 := when_it_is_max; if (when_it_is_zero < when_it_is_max) then begin if when_it_is_zero > lXMin then lXMin := Round(when_it_is_zero+0.5); if when_it_is_max < lXMax then lXMax := Round(when_it_is_max-0.5); end else begin if when_it_is_max > lXMin then lXMin := Round(when_it_is_max+0.5); if when_it_is_zero < lXMax then lXMax := Round(when_it_is_zero-0.5); end; end; Xo_at_one := lXzRA^[1] +lYziZzi + (lZPivotInU2 shl kSh); Xo_at_two := lXzRA^[l2] +lYziZzi + (lZPivotInU2 shl kSh); Xo_grad := Xo_at_two - Xo_at_one; Xo_offs := Xo_at_one - Xo_grad; if Abs(Xo_grad) > lReallySmall then begin when_it_is_zero := (lShiftedOne-Xo_offs) / Xo_grad; when_it_is_max := ((lZDimIn shl kSh)-Xo_offs) / Xo_grad; //debugz0 := when_it_is_zero; debugz1 := when_it_is_max; if (when_it_is_zero < when_it_is_max) then begin if when_it_is_zero > lXMin then lXMin := Round(when_it_is_zero+0.5); if when_it_is_max < lXMax then lXMax := Round(when_it_is_max-0.5); end else begin if when_it_is_max > lXMin then lXMin := Round(when_it_is_max+0.5); if when_it_is_zero < lXMax then lXMax := Round(when_it_is_zero-0.5); end; end; // even with all the care about rounding, it's possible that we've got the // edges wrong in ultra-high-gradient cases if lXMin < lXMax then begin while true do begin lXo := ((lXxRA^[lXMin] +lYxiZxi) shr kSh)+lXPivotInU2; lYo := ((lXyRA^[lXMin] +lYyiZyi) shr kSh)+lYPivotInU2; lZo := ((lXzRA^[lXMin] +lYziZzi) shr kSh)+lZPivotInU2; if (lXMin < lXMax) and ((lXo<1) or (lXo>lXDimIn) or (lYo<1) or (lYo>lYDimIn) or (lZo<1) or (lZo>lZDimIn)) then begin lXMin := 1+lXMin; end else break; end; while true do begin lXo := ((lXxRA^[lXMax] +lYxiZxi) shr kSh)+lXPivotInU2; lYo := ((lXyRA^[lXMax] +lYyiZyi) shr kSh)+lYPivotInU2; lZo := ((lXzRA^[lXMax] +lYziZzi) shr kSh)+lZPivotInU2; if (lXMax > lXMin) and ((lXo<1) or (lXo>lXDimIn) or (lYo<1) or (lYo>lYDimIn) or (lZo<1) or (lZo>lZDimIn)) then begin lXMax := lXMax-1; end else break; end; end; end;//proc findXBounds //Nearest Neighbor procedure TNNRender.Rotate (lThread: integer;l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); const kshx = ksh shr 1; var lZxi,lZyi,lZzi,lYxiZxi,lYyiZyi,lYziZzi,lZ,lY,lX,lOutPos, lMaxX,lMinX,lXo,lYo,lZo: integer; begin for lZ := l.ZDimStart to l.ZDimEnd do begin lZxi := round(lZ*lM.matrix[1,3]* (1 shl kSh) ); lZyi := round(lZ*lM.matrix[2,3]* (1 shl kSh) ); lZzi := round(lZ*lM.matrix[3,3]* (1 shl kSh) ); if {(RenderForm.RenderRefreshTimer.enabled) or} (Terminated) then begin ThreadDone; exit; end; {$IFDEF SHOWPROG} //flicker with lazarus if (lThread = 1) and ((lZ mod 30)=0) then VisualProg(lZ); {$ENDIF} //ImgForm.ProgressBar1.Position := lZ; for lY := l.YDimStart to l.YDimEnd do begin lYxiZxi := round(lY * lM.matrix[1,2]* (1 shl kSh) )+lZxi; lYyiZyi := round(lY * lM.matrix[2,2]* (1 shl kSh) )+lZyi; lYziZzi := round(lY * lM.matrix[3,2]* (1 shl kSh) )+lZzi; lOutPos := ((lZ+l.OutPivot-1)*l.OutSliceSz)+((lY+l.OutPivot-1)*l.Outdim); //if gAbortRender > 0 then goto 345; FindXBounds (lMaxX,lMinX,l.XDimIN,lYxiZxi,l.XPivotInU2,l.YDimIN,lYyiZyi,l.YPivotInU2,l.ZDimIN,lYziZzi,l.ZPivotInU2,l.OutDim,l.Xxra,l.Xyra,l.Xzra); if lMaxX > lMinX then for lX := lMinX to lMaxX do begin lXo := ((l.XxRA^[lX] +lYxiZxi) shr kSh)+l.XPivotInU2; lYo := ((l.XyRA^[lX] +lYyiZyi) shr kSh)+l.YPivotInU2; lZo := ((l.XzRA^[lX] +lYziZzi) shr kSh)+l.ZPivotInU2; {lXo := (lXo shr 1) + 1; lYo := lYo shr 1; lZo := lZo shr 1;} lBuffOut[lX+lOutPos] := lBuffIn[(lXo)+((lYo-1)*l.XdimIn)+((lZo-1)*l.InSliceSz)] end; end; //for y end; //for z ThreadDone; end; procedure TTriRender.Rotate (lThread: integer;l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); //Trilinear - this uses integer math, and on CoreDuo CPUs is 30% faster than Floating Point //For precision, integers are multiplied by kSh (~2^10 bits) to simulate floats // However, we will use 32-bit integers and the image intensity is 8 bit values, // with the final interpolation multiplying X*Y*Z*intensity // Therefore, this final interpolation adjusts kSh to be 2^8, avoiding overflow var lMi: TMatrixi; lXr,lYr,lZr,lYxi,lYyi,lYzi,lXxi,lXyi,lXzi,lZxi,lZyi,lZzi, lYxiZxi,lYyiZyi,lYziZzi,lZ,lY,lX,lOutPos, lXPiv,lYPiv,lZPiv,lXrM1i,lYrM1i,lZrM1i, lShr,lShl,lShlTo8,lShl8, lMinZ,lMaxZ,lMinY,lMaxY,lMaxX,lMinX,lXo,lYo,lZo: integer; begin lShl := 1 shl kSh; lShl8 := 1 shl 8; //8bit precision lShlTo8 := (kSh - 8); //shr the kSh precision by this to get 8-bit precision lShr := 24;//24-bits * 8 bit intensity = 32 bits lXPiv := l.XPivotIn * lShl; lYPiv := l.YPivotIn * lShl; lZPiv := l.ZPivotIn * lShl; for lX := 1 to 3 do for lY := 1 to 3 do lMi.matrix[lX,lY] := round(lM.matrix[lX,lY] * lShl); if (lRenderCutout ) then begin //only separated to unroll IF rendercutout for lZ := l.ZDimStart to l.ZDimEnd do begin lZxi := (lZ*lMi.matrix[1,3] ); lZyi := (lZ*lMi.matrix[2,3] ); lZzi := (lZ*lMi.matrix[3,3] ); if {(RenderForm.RenderRefreshTimer.enabled) or} (Terminated) then begin ThreadDone; exit; end; {$IFDEF SHOWPROG} //flicker with lazarus if (lThread = 1) and ((lZ mod 30)=0) then VisualProg(lZ); {$ENDIF} for lY := l.YDimStart to l.YDimEnd do begin lYxi := lY * lMi.matrix[1,2]; lYyi := lY * lMi.matrix[2,2]; lYzi := lY * lMi.matrix[3,2]; lYxiZxi := (lY * lMi.matrix[1,2] )+lZxi; lYyiZyi := (lY * lMi.matrix[2,2] )+lZyi; lYziZzi := (lY * lMi.matrix[3,2] )+lZzi; FindXBounds (lMaxX,lMinX,l.XDimIN,lYxiZxi,l.XPivotInU2,l.YDimIN,lYyiZyi,l.YPivotInU2,l.ZDimIN,lYziZzi,l.ZPivotInU2,l.OutDim,l.Xxra,l.Xyra,l.Xzra); lMaxX := lMaxX - l.OutPivot -1 ; lMinX := lMinX - l.OutPivot+1; if lMaxX > lMinX then for lX := lMinX to lMaxX do begin lXr := ( (lX*lMi.matrix[1,1])+lYxi+lZxi)+lXPiv; lYr := ((lX*lMi.matrix[2,1])+lYyi+lZyi)+lYPiv; lZr := ( (lX*lMi.matrix[3,1])+lYzi+lZzi)+lZPiv; lXo := (lXr shr kSh); lYo := (lYr shr kSh); lZo := (lZr shr kSh); if (lXo > 0) and (lXo < l.XDimIn) and (lYo > 0) and (lYo < l.YDimIn) and (lZo > 0) and (lZo < l.ZDimIn) then begin lXr := (lXr- (lXo * lShl)) shr lShlTo8; lYr := (lYr- (lYo * lShl)) shr lShlTo8; lZr := (lZr- (lZo * lShl)) shr lShlTo8; lXrM1i := lShl8-lXr; lYrM1i := lShl8-lYr; lZrM1i := lShl8-lZr; lMinY := ((lYo-1)*l.XdimIn); lMinZ := ((lZo-1)*l.InSliceSz); lMaxY := ((lYo)*l.XdimIn); lMaxZ := ((lZo)*l.InSliceSz); lOutPos := ((lZ+l.OutPivot-1)*l.OutSliceSz)+((lY+l.OutPivot-1)*l.Outdim); if {(lRenderCutout ) and} ((lBuffIn^[lXo+lMinY+lMinZ]=255) or (lBuffIn^[lXo+1+lMinY+lMinZ]=255) or (lBuffIn^[lXo+lMaxY+lMinZ]=255) or (lBuffIn^[lXo+1+lMaxY+lMinZ]=255) or (lBuffIn^[lXo+lMinY+lMaxZ]=255) or (lBuffIn^[lXo+1+lMinY+lMaxZ]=255) or (lBuffIn^[lXo+lMaxY+lMaxZ]=255) or (lBuffIn^[lXo+1+lMaxY+lMaxZ]=255)) then lBuffOut^[lX+l.OutPivot+lOutPos] := 255 else lBuffOut^[lX+l.OutPivot+lOutPos] := ( (lXrM1i*lYrM1i*lZrM1i *lBuffIn^[lXo+lMinY+lMinZ] ) +(lXr*lYrM1i*lZrM1i *lBuffIn^[lXo+1+lMinY+lMinZ]) +(lXrM1i*lYr*lZrM1i *lBuffIn^[lXo+lMaxY+lMinZ] ) +(lXrM1i*lYrM1i*lZr *lBuffIn^[lXo+lMinY+lMaxZ] ) +(lXr*lYr*lZrM1i *lBuffIn^[lXo+1+lMaxY+lMinZ] ) +(lXr*lYrM1i*lZr *lBuffIn^[lXo+1+lMinY+lMaxZ] ) +(lXrM1i*lYr*lZr *lBuffIn^[lXo+lMaxY+lMaxZ]) +(lXr*lYr*lZr *lBuffIn^[lXo+1+lMaxY+lMaxZ] ) ) shr lShr; end; //values in range end; //for x end; //for y end; //for z ThreadDone; exit; end; //if RenderCutout for lZ := l.ZDimStart to l.ZDimEnd do begin lZxi := (lZ*lMi.matrix[1,3] ); lZyi := (lZ*lMi.matrix[2,3] ); lZzi := (lZ*lMi.matrix[3,3] ); if {(RenderForm.RenderRefreshTimer.enabled) or} (Terminated) then begin ThreadDone; exit; end; {$IFDEF SHOWPROG} //flicker with lazarus if (lThread = 1) and ((lZ mod 30)=0) then VisualProg(lZ); {$ENDIF} for lY := l.YDimStart to l.YDimEnd do begin lYxi := lY * lMi.matrix[1,2]; lYyi := lY * lMi.matrix[2,2]; lYzi := lY * lMi.matrix[3,2]; lYxiZxi := (lY * lMi.matrix[1,2] )+lZxi; lYyiZyi := (lY * lMi.matrix[2,2] )+lZyi; lYziZzi := (lY * lMi.matrix[3,2] )+lZzi; FindXBounds (lMaxX,lMinX,l.XDimIN,lYxiZxi,l.XPivotInU2,l.YDimIN,lYyiZyi,l.YPivotInU2,l.ZDimIN,lYziZzi,l.ZPivotInU2,l.OutDim,l.Xxra,l.Xyra,l.Xzra); lMaxX := lMaxX - l.OutPivot -1 ; lMinX := lMinX - l.OutPivot+1; if lMaxX > lMinX then for lX := lMinX to lMaxX do begin lXr := ( (lX*lMi.matrix[1,1])+lYxi+lZxi)+lXPiv; lYr := ((lX*lMi.matrix[2,1])+lYyi+lZyi)+lYPiv; lZr := ( (lX*lMi.matrix[3,1])+lYzi+lZzi)+lZPiv; lXo := (lXr shr kSh); lYo := (lYr shr kSh); lZo := (lZr shr kSh); if (lXo > 0) and (lXo < l.XDimIn) and (lYo > 0) and (lYo < l.YDimIn) and (lZo > 0) and (lZo < l.ZDimIn) then begin lXr := (lXr- (lXo * lShl)) shr lShlTo8; lYr := (lYr- (lYo * lShl)) shr lShlTo8; lZr := (lZr- (lZo * lShl)) shr lShlTo8; lXrM1i := lShl8-lXr; lYrM1i := lShl8-lYr; lZrM1i := lShl8-lZr; lMinY := ((lYo-1)*l.XdimIn); lMinZ := ((lZo-1)*l.InSliceSz); lMaxY := ((lYo)*l.XdimIn); lMaxZ := ((lZo)*l.InSliceSz); lOutPos := ((lZ+l.OutPivot-1)*l.OutSliceSz)+((lY+l.OutPivot-1)*l.Outdim); lBuffOut^[lX+l.OutPivot+lOutPos] :=( (lXrM1i*lYrM1i*lZrM1i *lBuffIn^[lXo+lMinY+lMinZ] ) +(lXr*lYrM1i*lZrM1i *lBuffIn^[lXo+1+lMinY+lMinZ]) +(lXrM1i*lYr*lZrM1i *lBuffIn^[lXo+lMaxY+lMinZ] ) +(lXrM1i*lYrM1i*lZr *lBuffIn^[lXo+lMinY+lMaxZ] ) +(lXr*lYr*lZrM1i *lBuffIn^[lXo+1+lMaxY+lMinZ] ) +(lXr*lYrM1i*lZr *lBuffIn^[lXo+1+lMinY+lMaxZ] ) +(lXrM1i*lYr*lZr *lBuffIn^[lXo+lMaxY+lMaxZ]) +(lXr*lYr*lZr *lBuffIn^[lXo+1+lMaxY+lMaxZ] ) ) shr lShr; end; //values in range end; //for x end; //for y end; //for z ThreadDone; end; (* // floating point version of the same algorithm... procedure TTriRender.Rotate (lThread: integer;l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); var lXreal,lYreal,lZreal,lZx,lZy,lZz,lYx,lYy,lYz,lXrM1,lYrM1,lZrM1: single; lXxi,lXyi,lXzi,lZxi,lZyi,lZzi,lYxiZxi,lYyiZyi,lYziZzi,lZ,lY,lX,lOutPos, lMinZ,lMaxZ,lMinY,lMaxY,lMaxX,lMinX,lXo,lYo,lZo: integer; begin if (lRenderCutout ) then begin for lZ := l.ZDimStart to l.ZDimEnd do begin lZx := lZ*lM.matrix[1,3]; lZy := lZ*lM.matrix[2,3]; lZz := lZ*lM.matrix[3,3]; lZxi := round(lZ*lM.matrix[1,3]* (1 shl kSh) ); lZyi := round(lZ*lM.matrix[2,3]* (1 shl kSh) ); lZzi := round(lZ*lM.matrix[3,3]* (1 shl kSh) ); if RenderForm.RenderRefreshTimer.enabled then exit;//abort if Terminated then exit; //goto 345;//abort if (lThread = 1) and ((lZ mod 10)=0) then VisualProg(lZ); for lY := l.YDimStart to l.YDimEnd do begin lYx := lY * lM.matrix[1,2]; lYy := lY * lM.matrix[2,2]; lYz := lY * lM.matrix[3,2]; lOutPos := ((lZ+l.OutPivot-1)*l.OutSliceSz)+((lY+l.OutPivot-1)*l.Outdim); lYxiZxi := round(lY * lM.matrix[1,2]* (1 shl kSh) )+lZxi; lYyiZyi := round(lY * lM.matrix[2,2]* (1 shl kSh) )+lZyi; lYziZzi := round(lY * lM.matrix[3,2]* (1 shl kSh) )+lZzi; FindXBounds (lMaxX,lMinX,l.XDimIN,lYxiZxi,l.XPivotInU2,l.YDimIN,lYyiZyi,l.YPivotInU2,l.ZDimIN,lYziZzi,l.ZPivotInU2,l.OutDim,l.Xxra,l.Xyra,l.Xzra); lMaxX := lMaxX - l.OutPivot -1 ; lMinX := lMinX - l.OutPivot+1; if lMaxX > lMinX then for lX := lMinX to lMaxX do begin lXreal := ( (lX*lM.matrix[1,1])+lYx+lZx)+l.XPivotIn; lYreal := ( (lX*lM.matrix[2,1])+lYy+lZy)+l.YPivotIn; lZreal := ( (lX*lM.matrix[3,1])+lYz+lZz)+l.ZPivotIn; lXo := trunc(lXreal); lYo := trunc(lYreal); lZo := trunc(lZreal); if (lXo > 0) and (lXo < l.XDimIn) and (lYo > 0) and (lYo < l.YDimIn) and (lZo > 0) and (lZo < l.ZDimIn) then begin lXreal := lXreal-lXo; lYreal := lYreal-lYo; lZreal := lZreal-lZo; lXrM1 := 1-lXreal; lYrM1 := 1-lYreal; lZrM1 := 1-lZreal; lMinY := ((lYo-1)*l.XdimIn); lMinZ := ((lZo-1)*l.InSliceSz); lMaxY := ((lYo)*l.XdimIn); lMaxZ := ((lZo)*l.InSliceSz); if {(l.RenderCutout ) and} ((lBuffIn^[lXo+lMinY+lMinZ]=255) or (lBuffIn^[lXo+1+lMinY+lMinZ]=255) or (lBuffIn^[lXo+lMaxY+lMinZ]=255) or (lBuffIn^[lXo+1+lMaxY+lMinZ]=255) or (lBuffIn^[lXo+lMinY+lMaxZ]=255) or (lBuffIn^[lXo+1+lMinY+lMaxZ]=255) or (lBuffIn^[lXo+lMaxY+lMaxZ]=255) or (lBuffIn^[lXo+1+lMaxY+lMaxZ]=255)) then lBuffOut^[lX+l.OutPivot+lOutPos] := 255 else lBuffOut^[lX+l.OutPivot+lOutPos] := round ( {all min} ( (lXrM1*lYrM1*lZrM1)*lBuffIn^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*lBuffIn^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*lBuffIn^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*lBuffIn^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*lBuffIn^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*lBuffIn^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*lBuffIn^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*lBuffIn^[lXo+1+lMaxY+lMaxZ]) ); end; //values in range end; //for x end; //for y end; //for z ThreadDone; exit; end; //rendercutout for lZ := l.ZDimStart to l.ZDimEnd do begin lZx := lZ*lM.matrix[1,3]; lZy := lZ*lM.matrix[2,3]; lZz := lZ*lM.matrix[3,3]; lZxi := round(lZ*lM.matrix[1,3]* (1 shl kSh) ); lZyi := round(lZ*lM.matrix[2,3]* (1 shl kSh) ); lZzi := round(lZ*lM.matrix[3,3]* (1 shl kSh) ); if RenderForm.RenderRefreshTimer.enabled then exit;//abort if Terminated then exit; //goto 345;//abort if (lThread = 1) and ((lZ mod 10)=0) then VisualProg(lZ); for lY := l.YDimStart to l.YDimEnd do begin lYx := lY * lM.matrix[1,2]; lYy := lY * lM.matrix[2,2]; lYz := lY * lM.matrix[3,2]; lOutPos := ((lZ+l.OutPivot-1)*l.OutSliceSz)+((lY+l.OutPivot-1)*l.Outdim); lYxiZxi := round(lY * lM.matrix[1,2]* (1 shl kSh) )+lZxi; lYyiZyi := round(lY * lM.matrix[2,2]* (1 shl kSh) )+lZyi; lYziZzi := round(lY * lM.matrix[3,2]* (1 shl kSh) )+lZzi; FindXBounds (lMaxX,lMinX,l.XDimIN,lYxiZxi,l.XPivotInU2,l.YDimIN,lYyiZyi,l.YPivotInU2,l.ZDimIN,lYziZzi,l.ZPivotInU2,l.OutDim,l.Xxra,l.Xyra,l.Xzra); lMaxX := lMaxX - l.OutPivot -1 ; lMinX := lMinX - l.OutPivot+1; if lMaxX > lMinX then for lX := lMinX to lMaxX do begin lXreal := ( (lX*lM.matrix[1,1])+lYx+lZx)+l.XPivotIn; lYreal := ((lX*lM.matrix[2,1])+lYy+lZy)+l.YPivotIn; lZreal := ( (lX*lM.matrix[3,1])+lYz+lZz)+l.ZPivotIn; lXo := trunc(lXreal); lYo := trunc(lYreal); lZo := trunc(lZreal); if (lXo > 0) and (lXo < l.XDimIn) and (lYo > 0) and (lYo < l.YDimIn) and (lZo > 0) and (lZo < l.ZDimIn) then begin lXreal := lXreal-lXo; lYreal := lYreal-lYo; lZreal := lZreal-lZo; lXrM1 := 1-lXreal; lYrM1 := 1-lYreal; lZrM1 := 1-lZreal; lMinY := ((lYo-1)*l.XdimIn); lMinZ := ((lZo-1)*l.InSliceSz); lMaxY := ((lYo)*l.XdimIn); lMaxZ := ((lZo)*l.InSliceSz); lBuffOut^[lX+l.OutPivot+lOutPos] := round ( {all min} ( (lXrM1*lYrM1*lZrM1)*lBuffIn^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*lBuffIn^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*lBuffIn^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*lBuffIn^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*lBuffIn^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*lBuffIn^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*lBuffIn^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*lBuffIn^[lXo+1+lMaxY+lMaxZ]) ); end; //values in range end; //for x end; //for y end; //for z // if Terminated then Exit; ThreadDone; end; *) initialization InitializeCriticalSection(CritSect); finalization DeleteCriticalSection(CritSect); end. mricron-0.20120505.1~dfsg.1.orig/rendernothreads.pas0000664000175000017500000003206611326434470021557 0ustar michaelmichaelunit rendernothreads; interface {$include isthreaded.inc} {$mode objfpc}{$H+} uses {$IFDEF SHOWPROG}Forms,{$ENDIF} ComCtrls,Classes, SysUtils, define_types,GraphicsMathLibrary; const kSh = 10; //bits to shift - precision for integers to simulate floats type TRotateVals = record InSliceSz,ZDimStart,ZDimEnd,YDimStart,YDimEnd,OutPivot,OutDim,OutSliceSz: integer; XPivotInU2,YDimIN,YPivotInU2,ZDimIN,ZPivotInU2,XDimIN: integer; XPivotIn,YPivotIn,ZPivotIn: integer; Xxra,Xyra,Xzra: longintp; //RenderCutout: boolean; end; procedure NNRotate (lBar: TProgressBar; l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); procedure TriRotate (lBar: TProgressBar; l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); implementation {$IFDEF SHOWPROG} procedure VisualProg(lBar: TProgressBar; lPos: Integer); begin lBar.Position := lPos; Application.ProcessMessages; end; {$ENDIF}//IFDEF SHOWPROG procedure FindXBounds (var lXMax,lXMin: integer; lXDimIN,lYxiZxi,lXPivotInU2,lYDimIN,lYyiZyi,lYPivotInU2,lZDimIN,lYziZzi,lZPivotInU2,lOutDim:integer; lXxra,lXyra,lXzra : LongIntP); var lXo,lYo,lZo,Xo_at_one,Xo_at_two,Xo_grad,Xo_offs,lShiftedOne : integer; when_it_is_zero, when_it_is_max: double; lReallySmall {, debugx0, debugx1, debugy0, debugy1, debugz0, debugz1}: double; l2: integer; begin lXMax := lOutDim; lXMin := 1; l2 := 2; lShiftedOne := 1 shl ksh; lReallySmall := 1e-6; Xo_at_one := lXxRA^[1] +lYxiZxi + (lXPivotInU2 shl kSh); Xo_at_two := lXxRA^[l2] +lYxiZxi + (lXPivotInU2 shl kSh); Xo_grad := Xo_at_two - Xo_at_one; Xo_offs := Xo_at_one - Xo_grad; if Abs(Xo_grad) > lReallySmall then begin when_it_is_zero := (lShiftedOne-Xo_offs) / Xo_grad; when_it_is_max := ((lXDimIn shl kSh)-Xo_offs) / Xo_grad; //debugx0 := when_it_is_zero; debugx1 := when_it_is_max; if (when_it_is_zero < when_it_is_max) then begin if when_it_is_zero > lXMin then lXMin := Round(when_it_is_zero+0.5); if when_it_is_max < lXMax then lXMax := Round(when_it_is_max-0.5); end else begin if when_it_is_max > lXMin then lXMin := Round(when_it_is_max+0.5); if when_it_is_zero < lXMax then lXMax := Round(when_it_is_zero-0.5); end; end; Xo_at_one := lXyRA^[1] +lYyiZyi + (lYPivotInU2 shl kSh); Xo_at_two := lXyRA^[l2] +lYyiZyi + (lYPivotInU2 shl kSh); Xo_grad := Xo_at_two - Xo_at_one; Xo_offs := Xo_at_one - Xo_grad; if Abs(Xo_grad) > lReallySmall then begin when_it_is_zero := (lShiftedOne-Xo_offs) / Xo_grad; when_it_is_max := ((lYDimIn shl kSh)-Xo_offs) / Xo_grad; //debugy0 := when_it_is_zero; debugy1 := when_it_is_max; if (when_it_is_zero < when_it_is_max) then begin if when_it_is_zero > lXMin then lXMin := Round(when_it_is_zero+0.5); if when_it_is_max < lXMax then lXMax := Round(when_it_is_max-0.5); end else begin if when_it_is_max > lXMin then lXMin := Round(when_it_is_max+0.5); if when_it_is_zero < lXMax then lXMax := Round(when_it_is_zero-0.5); end; end; Xo_at_one := lXzRA^[1] +lYziZzi + (lZPivotInU2 shl kSh); Xo_at_two := lXzRA^[l2] +lYziZzi + (lZPivotInU2 shl kSh); Xo_grad := Xo_at_two - Xo_at_one; Xo_offs := Xo_at_one - Xo_grad; if Abs(Xo_grad) > lReallySmall then begin when_it_is_zero := (lShiftedOne-Xo_offs) / Xo_grad; when_it_is_max := ((lZDimIn shl kSh)-Xo_offs) / Xo_grad; //debugz0 := when_it_is_zero; debugz1 := when_it_is_max; if (when_it_is_zero < when_it_is_max) then begin if when_it_is_zero > lXMin then lXMin := Round(when_it_is_zero+0.5); if when_it_is_max < lXMax then lXMax := Round(when_it_is_max-0.5); end else begin if when_it_is_max > lXMin then lXMin := Round(when_it_is_max+0.5); if when_it_is_zero < lXMax then lXMax := Round(when_it_is_zero-0.5); end; end; // even with all the care about rounding, it's possible that we've got the // edges wrong in ultra-high-gradient cases if lXMin < lXMax then begin while true do begin lXo := ((lXxRA^[lXMin] +lYxiZxi) shr kSh)+lXPivotInU2; lYo := ((lXyRA^[lXMin] +lYyiZyi) shr kSh)+lYPivotInU2; lZo := ((lXzRA^[lXMin] +lYziZzi) shr kSh)+lZPivotInU2; if (lXMin < lXMax) and ((lXo<1) or (lXo>lXDimIn) or (lYo<1) or (lYo>lYDimIn) or (lZo<1) or (lZo>lZDimIn)) then begin lXMin := 1+lXMin; end else break; end; while true do begin lXo := ((lXxRA^[lXMax] +lYxiZxi) shr kSh)+lXPivotInU2; lYo := ((lXyRA^[lXMax] +lYyiZyi) shr kSh)+lYPivotInU2; lZo := ((lXzRA^[lXMax] +lYziZzi) shr kSh)+lZPivotInU2; if (lXMax > lXMin) and ((lXo<1) or (lXo>lXDimIn) or (lYo<1) or (lYo>lYDimIn) or (lZo<1) or (lZo>lZDimIn)) then begin lXMax := lXMax-1; end else break; end; end; end;//proc findXBounds procedure NNRotate (lBar: TProgressBar; l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); const kshx = ksh shr 1; var lZxi,lZyi,lZzi,lYxiZxi,lYyiZyi,lYziZzi,lZ,lY,lX,lOutPos, lMaxX,lMinX,lXo,lYo,lZo: integer; begin for lZ := l.ZDimStart to l.ZDimEnd do begin lZxi := round(lZ*lM.matrix[1,3]* (1 shl kSh) ); lZyi := round(lZ*lM.matrix[2,3]* (1 shl kSh) ); lZzi := round(lZ*lM.matrix[3,3]* (1 shl kSh) ); {$IFDEF SHOWPROG} //flicker with lazarus if ((lZ mod 30)=0) then VisualProg(lBar,lZ); {$ENDIF} //ImgForm.ProgressBar1.Position := lZ; for lY := l.YDimStart to l.YDimEnd do begin lYxiZxi := round(lY * lM.matrix[1,2]* (1 shl kSh) )+lZxi; lYyiZyi := round(lY * lM.matrix[2,2]* (1 shl kSh) )+lZyi; lYziZzi := round(lY * lM.matrix[3,2]* (1 shl kSh) )+lZzi; lOutPos := ((lZ+l.OutPivot-1)*l.OutSliceSz)+((lY+l.OutPivot-1)*l.Outdim); //if gAbortRender > 0 then goto 345; FindXBounds (lMaxX,lMinX,l.XDimIN,lYxiZxi,l.XPivotInU2,l.YDimIN,lYyiZyi,l.YPivotInU2,l.ZDimIN,lYziZzi,l.ZPivotInU2,l.OutDim,l.Xxra,l.Xyra,l.Xzra); if lMaxX > lMinX then for lX := lMinX to lMaxX do begin lXo := ((l.XxRA^[lX] +lYxiZxi) shr kSh)+l.XPivotInU2; lYo := ((l.XyRA^[lX] +lYyiZyi) shr kSh)+l.YPivotInU2; lZo := ((l.XzRA^[lX] +lYziZzi) shr kSh)+l.ZPivotInU2; {lXo := (lXo shr 1) + 1; lYo := lYo shr 1; lZo := lZo shr 1;} lBuffOut[lX+lOutPos] := lBuffIn[(lXo)+((lYo-1)*l.XdimIn)+((lZo-1)*l.InSliceSz)] end; end; //for y end; //for z end; procedure TriRotate (lBar: TProgressBar; l: TRotateVals; var lM: TMatrix; lRenderCutout: boolean; var lBuffIn,lBuffOut: ByteP); //Trilinear - this uses integer math, and on CoreDuo CPUs is 30% faster than Floating Point //For precision, integers are multiplied by kSh (~2^10 bits) to simulate floats // However, we will use 32-bit integers and the image intensity is 8 bit values, // with the final interpolation multiplying X*Y*Z*intensity // Therefore, this final interpolation adjusts kSh to be 2^8, avoiding overflow var lMi: TMatrixi; lXr,lYr,lZr,lYxi,lYyi,lYzi,lXxi,lXyi,lXzi,lZxi,lZyi,lZzi, lYxiZxi,lYyiZyi,lYziZzi,lZ,lY,lX,lOutPos, lXPiv,lYPiv,lZPiv,lXrM1i,lYrM1i,lZrM1i, lShr,lShl,lShlTo8,lShl8, lMinZ,lMaxZ,lMinY,lMaxY,lMaxX,lMinX,lXo,lYo,lZo: integer; begin lShl := 1 shl kSh; lShl8 := 1 shl 8; //8bit precision lShlTo8 := (kSh - 8); //shr the kSh precision by this to get 8-bit precision lShr := 24;//24-bits * 8 bit intensity = 32 bits lXPiv := l.XPivotIn * lShl; lYPiv := l.YPivotIn * lShl; lZPiv := l.ZPivotIn * lShl; for lX := 1 to 3 do for lY := 1 to 3 do lMi.matrix[lX,lY] := round(lM.matrix[lX,lY] * lShl); if (lRenderCutout ) then begin //only separated to unroll IF rendercutout for lZ := l.ZDimStart to l.ZDimEnd do begin lZxi := (lZ*lMi.matrix[1,3] ); lZyi := (lZ*lMi.matrix[2,3] ); lZzi := (lZ*lMi.matrix[3,3] ); {$IFDEF SHOWPROG} //flicker with lazarus if ((lZ mod 30)=0) then VisualProg(lBar,lZ); {$ENDIF} for lY := l.YDimStart to l.YDimEnd do begin lYxi := lY * lMi.matrix[1,2]; lYyi := lY * lMi.matrix[2,2]; lYzi := lY * lMi.matrix[3,2]; lYxiZxi := (lY * lMi.matrix[1,2] )+lZxi; lYyiZyi := (lY * lMi.matrix[2,2] )+lZyi; lYziZzi := (lY * lMi.matrix[3,2] )+lZzi; FindXBounds (lMaxX,lMinX,l.XDimIN,lYxiZxi,l.XPivotInU2,l.YDimIN,lYyiZyi,l.YPivotInU2,l.ZDimIN,lYziZzi,l.ZPivotInU2,l.OutDim,l.Xxra,l.Xyra,l.Xzra); lMaxX := lMaxX - l.OutPivot -1 ; lMinX := lMinX - l.OutPivot+1; if lMaxX > lMinX then for lX := lMinX to lMaxX do begin lXr := ( (lX*lMi.matrix[1,1])+lYxi+lZxi)+lXPiv; lYr := ((lX*lMi.matrix[2,1])+lYyi+lZyi)+lYPiv; lZr := ( (lX*lMi.matrix[3,1])+lYzi+lZzi)+lZPiv; lXo := (lXr shr kSh); lYo := (lYr shr kSh); lZo := (lZr shr kSh); if (lXo > 0) and (lXo < l.XDimIn) and (lYo > 0) and (lYo < l.YDimIn) and (lZo > 0) and (lZo < l.ZDimIn) then begin lXr := (lXr- (lXo * lShl)) shr lShlTo8; lYr := (lYr- (lYo * lShl)) shr lShlTo8; lZr := (lZr- (lZo * lShl)) shr lShlTo8; lXrM1i := lShl8-lXr; lYrM1i := lShl8-lYr; lZrM1i := lShl8-lZr; lMinY := ((lYo-1)*l.XdimIn); lMinZ := ((lZo-1)*l.InSliceSz); lMaxY := ((lYo)*l.XdimIn); lMaxZ := ((lZo)*l.InSliceSz); lOutPos := ((lZ+l.OutPivot-1)*l.OutSliceSz)+((lY+l.OutPivot-1)*l.Outdim); if {(lRenderCutout ) and} ((lBuffIn^[lXo+lMinY+lMinZ]=255) or (lBuffIn^[lXo+1+lMinY+lMinZ]=255) or (lBuffIn^[lXo+lMaxY+lMinZ]=255) or (lBuffIn^[lXo+1+lMaxY+lMinZ]=255) or (lBuffIn^[lXo+lMinY+lMaxZ]=255) or (lBuffIn^[lXo+1+lMinY+lMaxZ]=255) or (lBuffIn^[lXo+lMaxY+lMaxZ]=255) or (lBuffIn^[lXo+1+lMaxY+lMaxZ]=255)) then lBuffOut^[lX+l.OutPivot+lOutPos] := 255 else lBuffOut^[lX+l.OutPivot+lOutPos] := ( (lXrM1i*lYrM1i*lZrM1i *lBuffIn^[lXo+lMinY+lMinZ] ) +(lXr*lYrM1i*lZrM1i *lBuffIn^[lXo+1+lMinY+lMinZ]) +(lXrM1i*lYr*lZrM1i *lBuffIn^[lXo+lMaxY+lMinZ] ) +(lXrM1i*lYrM1i*lZr *lBuffIn^[lXo+lMinY+lMaxZ] ) +(lXr*lYr*lZrM1i *lBuffIn^[lXo+1+lMaxY+lMinZ] ) +(lXr*lYrM1i*lZr *lBuffIn^[lXo+1+lMinY+lMaxZ] ) +(lXrM1i*lYr*lZr *lBuffIn^[lXo+lMaxY+lMaxZ]) +(lXr*lYr*lZr *lBuffIn^[lXo+1+lMaxY+lMaxZ] ) ) shr lShr; end; //values in range end; //for x end; //for y end; //for z exit; end; //if RenderCutout for lZ := l.ZDimStart to l.ZDimEnd do begin lZxi := (lZ*lMi.matrix[1,3] ); lZyi := (lZ*lMi.matrix[2,3] ); lZzi := (lZ*lMi.matrix[3,3] ); {$IFDEF SHOWPROG} //flicker with lazarus if ((lZ mod 30)=0) then VisualProg(lBar,lZ); {$ENDIF} for lY := l.YDimStart to l.YDimEnd do begin lYxi := lY * lMi.matrix[1,2]; lYyi := lY * lMi.matrix[2,2]; lYzi := lY * lMi.matrix[3,2]; lYxiZxi := (lY * lMi.matrix[1,2] )+lZxi; lYyiZyi := (lY * lMi.matrix[2,2] )+lZyi; lYziZzi := (lY * lMi.matrix[3,2] )+lZzi; FindXBounds (lMaxX,lMinX,l.XDimIN,lYxiZxi,l.XPivotInU2,l.YDimIN,lYyiZyi,l.YPivotInU2,l.ZDimIN,lYziZzi,l.ZPivotInU2,l.OutDim,l.Xxra,l.Xyra,l.Xzra); lMaxX := lMaxX - l.OutPivot -1 ; lMinX := lMinX - l.OutPivot+1; if lMaxX > lMinX then for lX := lMinX to lMaxX do begin lXr := ( (lX*lMi.matrix[1,1])+lYxi+lZxi)+lXPiv; lYr := ((lX*lMi.matrix[2,1])+lYyi+lZyi)+lYPiv; lZr := ( (lX*lMi.matrix[3,1])+lYzi+lZzi)+lZPiv; lXo := (lXr shr kSh); lYo := (lYr shr kSh); lZo := (lZr shr kSh); if (lXo > 0) and (lXo < l.XDimIn) and (lYo > 0) and (lYo < l.YDimIn) and (lZo > 0) and (lZo < l.ZDimIn) then begin lXr := (lXr- (lXo * lShl)) shr lShlTo8; lYr := (lYr- (lYo * lShl)) shr lShlTo8; lZr := (lZr- (lZo * lShl)) shr lShlTo8; lXrM1i := lShl8-lXr; lYrM1i := lShl8-lYr; lZrM1i := lShl8-lZr; lMinY := ((lYo-1)*l.XdimIn); lMinZ := ((lZo-1)*l.InSliceSz); lMaxY := ((lYo)*l.XdimIn); lMaxZ := ((lZo)*l.InSliceSz); lOutPos := ((lZ+l.OutPivot-1)*l.OutSliceSz)+((lY+l.OutPivot-1)*l.Outdim); lBuffOut^[lX+l.OutPivot+lOutPos] :=( (lXrM1i*lYrM1i*lZrM1i *lBuffIn^[lXo+lMinY+lMinZ] ) +(lXr*lYrM1i*lZrM1i *lBuffIn^[lXo+1+lMinY+lMinZ]) +(lXrM1i*lYr*lZrM1i *lBuffIn^[lXo+lMaxY+lMinZ] ) +(lXrM1i*lYrM1i*lZr *lBuffIn^[lXo+lMinY+lMaxZ] ) +(lXr*lYr*lZrM1i *lBuffIn^[lXo+1+lMaxY+lMinZ] ) +(lXr*lYrM1i*lZr *lBuffIn^[lXo+1+lMinY+lMaxZ] ) +(lXrM1i*lYr*lZr *lBuffIn^[lXo+lMaxY+lMaxZ]) +(lXr*lYr*lZr *lBuffIn^[lXo+1+lMaxY+lMaxZ] ) ) shr lShr; end; //values in range end; //for x end; //for y end; //for z end; end. mricron-0.20120505.1~dfsg.1.orig/render.pas0000664000175000017500000006574711641356310017657 0ustar michaelmichaelunit render; interface {$include isthreaded.inc} {$mode delphi} uses {$IFDEF Unix} lclintf, //gettickcount {$ELSE} Windows, {$ENDIF} {$IFNDEF NoThreads} RenderThds, {$ELSE} rendernothreads, {$ENDIF} LResources,SysUtils, GraphicsMathLibrary,Classes, Graphics, Controls, Forms, Dialogs,ExtCtrls,Buttons, nifti_img, nifti_hdr,define_types,nifti_img_view,StdCtrls, Spin, Menus,ClipBrd,ReadInt,IniFiles, ComCtrls,userdir,render_composite; type { TRenderForm } TRenderForm = class(TForm) CutoutMenu: TMenuItem; ClipTrack: TTrackBar; MenuItem1: TMenuItem; SaveClipMenu: TMenuItem; MIPItem: TMenuItem; ShadeEdit: TSpinEdit; Label5: TLabel; RotationBMPMenu: TMenuItem; RenderBar: TPanel; AzimuthEdit: TSpinEdit; ElevationEdit: TSpinEdit; MainMenu1: TMainMenu; FileMenu: TMenuItem; Close1: TMenuItem; Edit1: TMenuItem; Copy1: TMenuItem; Save1: TMenuItem; Label4: TLabel; RefreshBtn: TSpeedButton; BiasTrack: TTrackBar; GainTrack: TTrackBar; Volume1: TMenuItem; RenderBGSurfaceMenu: TMenuItem; N1: TMenuItem; N101: TMenuItem; N401: TMenuItem; N601: TMenuItem; N801: TMenuItem; N403: TMenuItem; N404: TMenuItem; N405: TMenuItem; RenderBGDepthMenu: TMenuItem; N1voxel1: TMenuItem; N2voxels1: TMenuItem; N4voxels1: TMenuItem; N8voxels1: TMenuItem; N16voxels1: TMenuItem; N16voxels: TMenuItem; RenderSmoothBG: TMenuItem; RenderPreciseInterpolation: TMenuItem; Label1: TLabel; Overlay1: TMenuItem; RenderOverlaySurfaceMenu: TMenuItem; N701: TMenuItem; N602: TMenuItem; N501: TMenuItem; N402: TMenuItem; N301: TMenuItem; N201: TMenuItem; N102: TMenuItem; N01: TMenuItem; RenderOverlayDepthMenu: TMenuItem; N16voxels2: TMenuItem; N12voxels1: TMenuItem; N8voxels2: TMenuItem; N4voxels2: TMenuItem; N2voxels2: TMenuItem; N1voxel2: TMenuItem; Quality1: TMenuItem; RenderRefreshTimer: TTimer; RenderPanel: TScrollBox; RenderImage: TImage; RenderImageBUP: TImage; //RenderImage2: TImage; RenderSmoothOverlay: TMenuItem; FlipLRcheck: TMenuItem; Settings1: TMenuItem; Savesettings1: TMenuItem; N2: TMenuItem; Infinite1: TMenuItem; Infinite2: TMenuItem; Search1: TMenuItem; BehindBG1: TMenuItem; Infront1: TMenuItem; Anydepth1: TMenuItem; procedure BiasTrackChange(Sender: TObject); procedure ClipTrackChange(Sender: TObject); procedure RenderSmoothBGClick(Sender: TObject); procedure RotationBMPMenuClick(Sender: TObject); procedure SaveClipMenuClick(Sender: TObject); procedure Settings1Click(Sender: TObject); procedure SetSearch(Sender: TObject); procedure Save1Click(Sender: TObject); procedure RenderImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Copy1Click(Sender: TObject); procedure Close1Click(Sender: TObject); procedure N1Click(Sender: TObject); procedure N01Click(Sender: TObject); procedure N1voxel1Click(Sender: TObject); procedure N16voxels2Click(Sender: TObject); procedure RenderSmoothClick(Sender: TObject); procedure RenderPreciseInterpolationClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure RenderRefreshTimerTimer(Sender: TObject); procedure EditChange(Sender: TObject); procedure OverlayRenderDepthItem(Sender: TObject); procedure RenderImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Cutout1Click(Sender: TObject); procedure Savesettings1Click(Sender: TObject); procedure UpdateRenderMRU; procedure OpenRenderMRU(Sender:TObject); procedure UpdateRenderDisplay; procedure FormHide(Sender: TObject); procedure FormCreate(Sender: TObject); procedure RefreshClick(Sender: TObject); procedure RefreshRotation; private { Private declarations } public { Public declarations } end; var RenderForm: TRenderForm; gZoom : single = 1; gRenderDir,gRenderStartupFilename,gRenderDefaultsFilename:string; implementation uses MultiSlice,math,cutout; {$IFNDEF FPC} {$R *.DFM} {$ENDIF} procedure MinMaxFilt (var lHdr: TMRIcroHdr; var lFiltMin8bit, lFiltMax8bit: integer);var lMin,lMax: single; begin ReturnMinMax (lHdr,lMin,lMax, lFiltMin8bit, lFiltMax8bit); end; procedure TRenderForm.UpdateRenderDisplay; begin SetSubmenuWithTag(RenderBGSurfaceMenu,gRender.BGSurface); SetSubmenuWithTag(RenderOverlaySurfaceMenu,gRender.OverlaySurface); SetSubmenuWithTag(RenderBGDepthMenu,gRender.BGDepth); SetSubmenuWithTag(RenderOverlayDepthMenu,gRender.OverlayDepth); RenderSmoothBG.checked := gRender.SmoothBG; RenderSmoothOverlay.checked := gRender.SmoothOverlay; RenderPreciseInterpolation.Checked := gRender.Trilinear; //RenderSurfaceOverlay.Checked := gRender.OverlayFromBGSurface; SetSubmenuWithTag(Search1,gRender.OverlayFromBGSurface); FlipLRCheck.Checked := gRender.FlipLR; AzimuthEdit.value := gRender.Azimuth; ElevationEdit.value := gRender.Elevation; ShadeEdit.value := gRender.ShadePct; RenderRefreshTimer.tag := -1; RenderRefreshTimer.enabled := true; end; procedure WriteRenderIniFile (lFilename: string); var lIniFile: TIniFile; lInc: integer; begin if DiskFreeEx(lFilename) < 1 then exit; if not DirectoryExists(extractfiledir(lFilename)) then begin mkDir(extractfiledir(lFilename)); end; lIniFile := TIniFile.Create(lFilename); with gRender do begin lIniFile.WriteString('BOOL', 'SmoothBG',Bool2Char( SmoothBG)); lIniFile.WriteString('BOOL', 'SmoothOverlay',Bool2Char( SmoothOverlay)); lIniFile.WriteString('BOOL', 'Trilinear',Bool2Char( Trilinear)); lIniFile.WriteString('BOOL', 'ShowCutout',Bool2Char( ShowCutout)); lIniFile.WriteString('BOOL', 'FlipLR',Bool2Char( FlipLR)); lIniFile.WriteString('INT', 'OverlayFromBGSurface',IntToStr( OverlayFromBGSurface)); //lIniFile.WriteString('INT', 'BGNearClip',IntToStr(BGNearClip)); //lIniFile.WriteString('INT', 'OverlayNearClip',IntToStr(OverlayNearClip)); lIniFile.WriteString('INT', 'Azimuth',IntToStr(Azimuth)); lIniFile.WriteString('INT', 'Elevation',IntToStr(Elevation)); lIniFile.WriteString('INT', 'BGSurface',IntToStr(BGSurface)); lIniFile.WriteString('INT', 'OverlaySurface',IntToStr(OverlaySurface)); lIniFile.WriteString('INT', 'BGDepth',IntToStr(BGDepth)); lIniFile.WriteString('INT', 'OverlayDepth',IntToStr(OverlayDepth)); lIniFile.WriteString('INT', 'CutoutBias',IntToStr(CutoutBias)); lIniFile.WriteString('INT', 'cutoutLUTindex',IntToStr(cutoutLUTindex)); lIniFile.WriteString('INT', 'ShadePct',IntToStr(ShadePct)); for lInc := 1 to 3 do begin lIniFile.WriteString('INT', 'CutoutLoFrac'+inttostr(lInc),IntToStr(CutoutFrac.Lo[lInc])); lIniFile.WriteString('INT', 'CutoutHiFrac'+inttostr(lInc),IntToStr(CutoutFrac.Hi[lInc])); end; end;//with gRender lIniFile.Free; end; procedure ReadRenderIniFile (lFilename: string); var lIniFile: TIniFile; //lStr: string; lInc: integer; begin if not FileexistsEx(lFilename) then begin exit; end; lIniFile := TIniFile.Create(lFilename); //lStr := lIniFile.ReadString('STR', 'Slices', '10,20,30');//file0 - last file viewed with gRender do begin //Booleans //SmoothBG,SmoothOverlay,Trilinear,OverlayFromBGSurface,ShowCutout SmoothBG := IniBool(lIniFile,'SmoothBG',SmoothBG); SmoothOverlay := IniBool(lIniFile,'SmoothOverlay',SmoothOverlay); Trilinear := IniBool(lIniFile,'Trilinear',Trilinear); //OverlayFromBGSurface := IniBool(lIniFile,'OverlayFromBGSurface',OverlayFromBGSurface); ShowCutout := IniBool(lIniFile,'ShowCutout',ShowCutout); FlipLR := IniBool(lIniFile,'FlipLR',FlipLR); OverlayFromBGSurface:= IniInt(lIniFile,'OverlayFromBGSurface',OverlayFromBGSurface); //BGNearClip:= IniInt(lIniFile,'BGNearClip',BGNearClip); //OverlayNearClip:= IniInt(lIniFile,'OverlayNearClip',OverlayNearClip); Azimuth:= IniInt(lIniFile,'Azimuth',Azimuth); Elevation:= IniInt(lIniFile,'Elevation',Elevation); BGSurface:= IniInt(lIniFile,'BGSurface',BGSurface); OverlaySurface:= IniInt(lIniFile,'OverlaySurface',OverlaySurface); BGDepth:= IniInt(lIniFile,'BGDepth',BGDepth); OverlayDepth:= IniInt(lIniFile,'OverlayDepth',OverlayDepth); CutoutBias:= IniInt(lIniFile,'CutoutBias', CutoutBias); ShadePct:= IniInt(lIniFile,'ShadePct', 0); cutoutLUTindex:= IniInt(lIniFile,'cutoutLUTindex',cutoutLUTindex); for lInc := 1 to 3 do begin Cutout.Lo[lInc] := IniInt(lIniFile,'CutoutLo'+inttostr(lInc),Cutout.Lo[lInc]); Cutout.Hi[lInc] := IniInt(lIniFile,'CutoutHi'+inttostr(lInc),Cutout.Hi[lInc]); end; for lInc := 1 to 3 do begin CutoutFrac.Lo[lInc] := IniInt(lIniFile,'CutoutLoFrac'+inttostr(lInc),-1); CutoutFrac.Hi[lInc] := IniInt(lIniFile,'CutoutHiFrac'+inttostr(lInc),-1); end; end;//with gRender lIniFile.Free; end; procedure TRenderForm.OpenRenderMRU(Sender:TObject); var lFilename: string; begin lFilename := gRenderDir+(Sender as TMenuItem).caption+'.ini' ; ReadRenderIniFile(lFilename); //07 CutoutForm.Prep; UpdateRenderDisplay; end; procedure TRenderForm.UpdateRenderMRU; var NewItem: TMenuItem; lSearchRec: TSearchRec; begin While Settings1.Count > 0 do Settings1.Items[0].Free; if FindFirst(gRenderDir+'*.ini', faAnyFile, lSearchRec) = 0 then repeat NewItem := TMenuItem.Create(Self); NewItem.Caption := ParseFileName(ExtractFileName(lSearchRec.Name)); {$IFDEF FPC} NewItem.onclick := OpenRenderMRU; //Lazarus {$ELSE} NewItem.onclick := OpenRenderMRU; {$ENDIF} Settings1.Add(NewItem); until (FindNext(lSearchRec) <> 0); FindClose(lSearchRec); end; Function AziElevMatrix: TMatrix; var lLRFlipMatrix: TMatrix; begin gRender.Azimuth := RenderForm.AzimuthEdit.value; gRender.Elevation := RenderForm.ElevationEdit.value; result := ViewTransformMatrix( coordSpherical, ToRadians(RenderForm.AzimuthEdit.Value), ToRadians(RenderForm.ElevationEdit.Value), 3{Distance.Value},6{ScreenWidthHeight.Value},6{ScreenWidthHeight.Value},{ScreenToCamera.Value}3); {The ViewTransformMatrix is all that is needed for other objects defined in world coordinates.} if {RenderForm.FlipLRcheck.checked} gRender.FlipLR then begin lLRFlipMatrix := Matrix3D (-1,0,0,0, // 3D "graphics" matrix 0,1,0,0, 0,0,1,0, 0,0,0,0); result := MultiplyMatrices(lLRFlipMatrix,Result); end; end; procedure InvertMatrixPoint (var lBackgroundImg: TBGImg; var lInMatrix: TMatrix; var lXin,lYin,lZIn, lXout,lYout,lZout: integer); //convert mouse click to position var lZ,lY,lX,lOutDim,lOutPivot,lXPivotIn,lYPivotIn,lZPivotIn: integer; lMatrix: TMatrix; begin //lOutDim := gBGImg.RenderDim;//MaxDim(lBackgroundImg.ScrnDim[1],lBackgroundImg.ScrnDim[2],lBackgroundImg.ScrnDim[3]); if gRender.Zoom > 0 then lOutDim := round(gBGImg.RenderDim/gRender.Zoom) else lOutDim :=gBGImg.RenderDim; //11/2007b lOutPivot := (lOutDim+1) shr 1; //e.g. if DimMax=9, then pivot is 5 lXPivotIn := (lBackgroundImg.ScrnDim[1]+1) shr 1; //e.g. if DimMax=9, then pivot is 5 lYPivotIn := (lBackgroundImg.ScrnDim[2]+1) shr 1; //e.g. if DimMax=9, then pivot is 5 lZPivotIn := (lBackgroundImg.ScrnDim[3]+1) shr 1; //e.g. if DimMax=9, then pivot is 5 lX := (lXin-lOutPivot); lY := ({lYin-}lOutPivot-lYin); lZ := (lZin-lOutPivot); lMatrix := InvertMatrix3D(lInMatrix); lXout := round( (lX*lMatrix.matrix[1,1])+(lY * lMatrix.matrix[2,1])+(lZ*lMatrix.matrix[3,1])); lYout := round( (lX*(lMatrix.matrix[1,2]))+(lY * lMatrix.matrix[2,2])+(lZ*lMatrix.matrix[3,2])); lZout := round( (lX*(lMatrix.matrix[1,3]))+(lY * lMatrix.matrix[2,3])+(lZ*lMatrix.matrix[3,3])); lXOut := (lXOut+lXPivotIn); lYOut := (lYOut+lYPivotIn); lZOut := (lZOut+lZPivotIn); end; procedure TRenderForm.Save1Click(Sender: TObject); begin //if (RenderImage.Picture.Graphic = nil) then begin SaveImgAsPNGBMP (RenderImage); end; procedure TRenderForm.RenderImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin end; procedure TRenderForm.Copy1Click(Sender: TObject); {$IFDEF FPC} begin {$IFDEF zxDarwin} Showmessage('Copy not yet supported with OSX: use File/Save'); exit; {$ENDIF} if (RenderImage.Picture.Graphic = nil) then begin //1420z Showmessage('You need to load an image before you can copy it to the clipboard.'); exit; end; RenderImage.Picture.Bitmap.SaveToClipboardFormat(2); end; {$ELSE} var MyFormat : Word; AData: THandle; APalette : HPalette; //For later versions of Delphi: APalette : THandle; begin if (RenderImage.Picture.Graphic = nil) then begin //1420z Showmessage('You need to load an image before you can copy it to the clipboard.'); exit; end; RenderImage.Picture.Bitmap.SaveToClipBoardFormat(MyFormat,AData,APalette); ClipBoard.SetAsHandle(MyFormat,AData); end; {$ENDIF} procedure TRenderForm.RotationBMPMenuClick(Sender: TObject); var lnViews,lC,lAngle,lStartA: integer; lZoom,lAzi: boolean; lBaseFilename,lFilename: string; begin lnViews:= ReadIntForm.GetInt('How many bitmaps for a 360-degree rotation?', 4,24,72); {$IFDEF ENDIAN_BIG} ImgForm.SaveDialog1.Filter := 'Bitmap|*.xpm'; ImgForm.SaveDialog1.DefaultExt := '.xpm'; {$ELSE} ImgForm.SaveDialog1.Filter := 'Bitmap|*.bmp'; ImgForm.SaveDialog1.DefaultExt := '.bmp'; {$ENDIF} if not ImgForm.SaveDialog1.Execute then exit; lBaseFilename := ImgForm.SaveDialog1.Filename; lAzi := false; case MessageDlg('Rotate azimuth?', mtConfirmation, [mbYes, mbNo], 0) of mrYes: lAzi := true; end; //case case MessageDlg('Generate super-sampled (high quality) renderings?', mtConfirmation, [mbYes, mbNo], 0) of mrYes: lZoom := true; end; //case if lAzi then lStartA := AzimuthEdit.value else lStartA := ElevationEdit.value; for lC := 1 to lnViews do begin lAngle := round((lC-1) * (360/lnviews)); if lAzi then AzimuthEdit.value := lAngle else ElevationEdit.value := lAngle - 180; RenderRefreshTimer.enabled := false; if lZoom then gZoom := 2; RefreshRotation; DrawRender; {$IFDEF ENDIAN_BIG} lFilename := ChangeFilePostfixExt (lBaseFilename,PadStr(lAngle,3),'.xpm'); {$ELSE} lFilename := ChangeFilePostfixExt (lBaseFilename,PadStr(lAngle,3),'.bmp'); {$ENDIF} RenderImage.Picture.Bitmap.SaveToFile(lFilename); //SaveImgAsPNGBMPCore(RenderImage,lFilename); end; //for each of 36 views if lAzi then AzimuthEdit.value := lStartA else ElevationEdit.value := lStartA; RenderRefreshTimer.enabled := false; RefreshRotation; DrawRender; end; procedure TRenderForm.SaveClipMenuClick(Sender: TObject); var lStartClip,lnClips,lC: integer; lBaseFilename,lFilename: string; lStartTime: DWord; begin lStartClip := gRender.ClipFrac; lnClips:= ReadIntForm.GetInt('How many bitmaps for a 360-degree rotation?', 4,24,200); ImgForm.SaveDialog1.Filter := 'PNG bitmap|*.png'; ImgForm.SaveDialog1.DefaultExt := '*.png'; if not ImgForm.SaveDialog1.Execute then exit; lBaseFilename := ImgForm.SaveDialog1.Filename; lStartTime := GetTickCount; for lC := 1 to lnClips do begin gRender.ClipFrac := round( ((lC-1)/lnClips)*kMaxFrac ); DrawRender; refresh; {$IFDEF ENDIAN_BIG} lFilename := ChangeFilePostfixExt (lBaseFilename,PadStr(lC,3),'.xpm'); {$ELSE} lFilename := ChangeFilePostfixExt (lBaseFilename,PadStr(lC,3),'.bmp'); {$ENDIF} RenderImage.Picture.Bitmap.SaveToFile(lFilename); //SaveImgAsPNGBMPCore(RenderImage,lFilename); end; //for each of 36 views ImgForm.StatusLabel.caption :=('batchtime(ms): '+inttostr(GetTickCount-lStartTime)); gRender.ClipFrac := lStartClip; end; procedure TRenderForm.Settings1Click(Sender: TObject); begin end; procedure TRenderForm.BiasTrackChange(Sender: TObject); begin gRender.Bias := BiasTrack.position; gRender.Gain := GainTrack.Position; RenderRefreshTimer.Enabled := true; //RenderForm.caption := inttostr(BiasTrack.position)+'zzz'+inttostr(GainTrack.Position); end; procedure TRenderForm.ClipTrackChange(Sender: TObject); begin gRender.ClipFrac := ClipTrack.Position; RenderRefreshTimer.Enabled := true; end; procedure TRenderForm.RenderSmoothBGClick(Sender: TObject); begin (sender as TMenuItem).checked := not (sender as TMenuItem).checked; gRender.SmoothBG := RenderSmoothBG.checked; gRender.SmoothOverlay := RenderSmoothOverlay.checked; RenderRefreshTimer.Enabled := true; end; procedure TRenderForm.Close1Click(Sender: TObject); begin RenderForm.Close; end; procedure TRenderForm.N1Click(Sender: TObject); begin (sender as TMenuItem).checked := true; gRender.BGSurface := (sender as TMenuItem).tag; RenderRefreshTimer.Enabled := true; end; procedure TRenderForm.N01Click(Sender: TObject); begin (sender as TMenuItem).checked := true; gRender.OverlaySurface := (sender as TMenuItem).tag; RenderRefreshTimer.Enabled := true; end; procedure TRenderForm.N1voxel1Click(Sender: TObject); begin (sender as TMenuItem).checked := true; gRender.BGDepth := (sender as TMenuItem).tag; RenderRefreshTimer.Enabled := true; end; procedure TRenderForm.N16voxels2Click(Sender: TObject); begin (sender as TMenuItem).checked := true; gRender.OverlayDepth := (sender as TMenuItem).tag; RenderRefreshTimer.Enabled := true; end; procedure TRenderForm.RenderSmoothClick(Sender: TObject); begin (sender as TMenuItem).checked := not (sender as TMenuItem).checked; gRender.FlipLR := FlipLRCheck.Checked; //RenderSmoothSurface.checked := not RenderSmoothSurface.Checked; gRender.SmoothBG := RenderSmoothBG.checked; gRender.SmoothOverlay := RenderSmoothOverlay.checked; RenderRefreshTimer.Tag := -1;//force a new rotation matrix to be generated RenderRefreshTimer.Enabled := true; end; procedure TRenderForm.RenderPreciseInterpolationClick(Sender: TObject); begin RenderPreciseInterpolation.Checked := not RenderPreciseInterpolation.Checked; gRender.Trilinear := RenderPreciseInterpolation.Checked; RenderRefreshTimer.Tag := -1; //force a new rotation matrix to be generated RenderRefreshTimer.Enabled := true; end; procedure TRenderForm.FormShow(Sender: TObject); var lInc: integer; begin gRender.ClipFrac := 0; gRender.Bias := 50; gRender.Gain := 50; gRender.cutoutLUTindex := 0; gRender.BGSurface := 51; gRender.OverlaySurface := 1; gRender.BGDepth := 12; gRender.OverlayDepth := 8; gRender.Azimuth := 90; gRender.Elevation := 45; gRender.ShadePct := 0; //gRender.OverlayNearClip := 0; //gRender.BGNearClip := 0; gRender.SmoothBG := true; gRender.SmoothOverlay := false; gRender.Trilinear := true; gRender.FlipLR := false; gRender.OverlayFromBGSurface := kBelow; gRender.ShowCutout := false; gRender.CutoutBias := 4; {for lInc := 1 to 3 do begin gRender.Cutout.Lo[lInc] := gBGImg.ScrnDim[lInc] div 2; gRender.Cutout.Hi[lInc] := gBGImg.ScrnDim[lInc]; end;} for lInc := 1 to 3 do begin gRender.CutoutFrac.Lo[lInc] := kMaxFrac div 2; gRender.CutoutFrac.Hi[lInc] := kMaxFrac; end; ReadRenderIniFile (gRenderStartupFilename); UpdateRenderMRU; UpdateRenderDisplay; RenderForm.BringToFront; end; function RAMok (var lBGImg: TBGImg): boolean; var lOutDim,lOutBytes,lBytesNeeded,lFreeRam: int64; lBGSz,lC: integer; begin lBGSz := lBGImg.ScrnDim[1]*lBGImg.ScrnDim[2]*lBGImg.ScrnDim[3]; lOutDim := round(MaxDim(lBGImg.ScrnDim[1],lBGImg.ScrnDim[2],lBGImg.ScrnDim[3]) * gRender.Zoom); lOutBytes := lOutDim*lOutDim*lOutDim; lBytesNeeded := 0; for lC := 0 to knMaxOverlay do begin if (gMRIcroOverlay[lC].ScrnBufferItems >= lBGSz) then begin lBytesNeeded := lBytesNeeded + (lOutBytes - gMRIcroOverlay[lC].RenderBufferItems); end; end; if (lBytesNeeded > freeRam) then begin beep; ImgForm.StatusLabel.Caption := 'Memory exhausted: unable to render at this quality'; result := false; end else result := true; end; procedure TRenderForm.RefreshRotation; var lC: integer; lMatrix: TMatrix; lStartTime: DWord; begin lMatrix := AziElevMatrix; {$IFNDEF FPC} //refresh causes flicker with lazarus Application.processmessages; Refresh; {$ENDIF} gRender.Zoom := gZoom; //11/2007b gZoom := 1; gRender.ClipFrac := ClipTrack.position; gRender.Bias := BiasTrack.position; gRender.Gain := GainTrack.Position; gRender.Azimuth := round(AzimuthEdit.value); gRender.Elevation := round(ElevationEdit.value); if not RAMok(gBGImg) then exit; lStartTime := GetTickCount; VolumeRotateMatrix (gBGImg, gMRIcroOverlay[0],lMatrix, gRender.Trilinear,gRender.ShowCutout,true{,round(gRender.BGNearClip*gRender.Zoom)}); for lC := 1 to knMaxOverlay do VolumeRotateMatrix (gBGImg, gMRIcroOverlay[lC],lMatrix, gRender.Trilinear,false,false{,round(gRender.OverlayNearClip*gRender.Zoom)}); end; var gRendering: boolean = false; procedure TRenderForm.RenderRefreshTimerTimer(Sender: TObject); begin if gMRIcroOverlay[0].ScrnBufferItems=0 then begin RenderRefreshTimer.Enabled := false; RenderImage.Width := 0; exit; end; if gRendering then exit; RenderRefreshTimer.Enabled := false; gRender.ShadePct := ShadeEdit.value; gRendering := true; if (gMRIcroOverlay[0].RenderBufferItems=0) or (RenderRefreshTimer.Tag <> 0) or (AzimuthEdit.value<>gRender.Azimuth) or (ElevationEdit.value<>gRender.Elevation) then RefreshRotation; //RenderRefreshTimer.Enabled := false; (*if RenderRefreshTimer.Enabled then begin gRendering := false; exit; end; *) RenderRefreshTimer.Tag := 0; DrawRender; //RenderRefreshTimer.Enabled := false; gRendering := false; end; procedure TRenderForm.EditChange(Sender: TObject); begin RenderRefreshTimer.Enabled := true; end; procedure TRenderForm.OverlayRenderDepthItem(Sender: TObject); begin (sender as TMenuItem).checked := true; gRender.OverlayDepth := (sender as TMenuItem).tag; RenderRefreshTimer.Enabled := true; end; procedure RenderDrawXBar ( lHorPos, lVerPos: integer;var lImage: TImage); var lL,lT,lW,lH,lZoomPct: integer; begin lImage.Picture.Graphic := RenderForm.RenderImageBUP.Picture.Graphic; //redraw image even if not drawing X-bar: hide visible X-bar if use toggles X-bars off. if not ImgForm.XBarBtn.Down then exit; //only draw xbars if requested //lImage.Refresh; lZoomPct := 100; //ImageZoomPct(lImage); lL := (lHorPos * lZoomPct) div 100; lT := (lVerPos * lZoomPct) div 100; lW := lImage.Width;// div 100; lH := lImage.Height;// div 100; lImage.Canvas.Pen.Color:= gBGImg.XBarClr; lImage.Canvas.Pen.Width := gBGImg.XBarThick; //next horizontal lines lImage.Canvas.MoveTo(0,lT); lImage.Canvas.LineTo(lL-gBGImg.XBarGap,lT); lImage.Canvas.MoveTo(lL+gBGImg.XBarGap,lT); lImage.Canvas.LineTo(lW,lT); //next vertical lines lImage.Canvas.MoveTo(lL,0); lImage.Canvas.LineTo(lL,lT-gBGImg.XBarGap); lImage.Canvas.MoveTo(lL,lT+gBGImg.XBarGap); lImage.Canvas.LineTo(lL,lH); end; //Proc RenderDrawXBar procedure TRenderForm.RenderImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var lXrender,lYrender,lZrender,lXout,lYout,lZOut,lPixelOffset,lZoom: integer; lMatrix: TMatrix; begin RenderDrawXBar ( X,Y,RenderImage); //Next: find coordinates for orthogonal views: lZoom := ImageZoomPct(RenderImage); lXrender := round((X*100) / lZoom ); lYrender := round(((Y)*100) / lZoom ); lPixelOffset := lXrender+ ((gBGImg.RenderDim-lYrender)*gBGImg.RenderDim); //ImgForm.StatusLabel.caption := inttostr(lXrender)+'x'+inttostr(lYrender)+' -> '+inttostr(gMRIcroOverlay[kBGOverlayNum].RenderDepthBufferItems ); if (lPixelOffset < 1) or (lPixelOffset >gBGImg.RenderDepthBufferItems ) then exit; lZrender := gBGImg.RenderDepthBuffer^[lPixelOffset]; lXrender := round(lXrender / gRender.Zoom); lYrender := round(lYrender / gRender.Zoom); lZrender := round(lZrender / gRender.Zoom); lMatrix := AziElevMatrix; InvertMatrixPoint (gBGImg,lMatrix,lXrender,lYrender,lZrender, lXout,lYout,lZOut); ImgForm.XViewEdit.value := lXOut; ImgForm.YViewEdit.value := lYOut; ImgForm.ZViewEdit.value := lZOut; {$IFDEF FPC} ImgForm.XViewEditChange(nil); {$ENDIF} end; procedure TRenderForm.Cutout1Click(Sender: TObject); begin CutoutForm.Show; end; procedure TRenderForm.Savesettings1Click(Sender: TObject); begin //showmessage(gRenderDir+' '+extractfiledir(gRenderDir)); MultiSliceForm.MultiSaveDialog.InitialDir := extractfiledir(gRenderDir); MultiSliceForm.MultiSaveDialog.FileName := 'a'+inttostr(gRender.Azimuth)+'e'+inttostr(gRender.Elevation); if not MultiSliceForm.MultiSaveDialog.Execute then exit; {$IFDEF Unix} WriteRenderIniFile(extractfiledir(gRenderDir)+pathdelim+extractfilename(MultiSliceForm.MultiSaveDialog.Filename)); {$ELSE} WriteRenderIniFile(MultiSliceForm.MultiSaveDialog.Filename); {$ENDIF} UpdateRenderMRU; end; procedure TRenderForm.FormHide(Sender: TObject); begin WriteRenderIniFile (gRenderDefaultsFilename); //not sure how to make this safe for currently rendering threads... if gBGImg.RenderDepthBufferItems > 0 then Freemem(gBGImg.RenderDepthBuffer); gBGImg.RenderDepthBufferItems := 0; end; procedure TRenderForm.FormCreate(Sender: TObject); begin {$IFDEF Darwin} Save1.ShortCut := ShortCut(Word('S'), [ssMeta]); Close1.ShortCut := ShortCut(Word('W'), [ssMeta]); {$ENDIF} gRenderDir := DefaultsDir('render'); //showmessage(gRenderDir); //gRenderDir := extractfiledir(paramstr(0))+pathdelim+'render'+pathdelim; gRenderDefaultsFilename := gRenderDir + 'default.ini'; gRenderStartupFilename := gRenderDefaultsFilename; RenderForm.DoubleBuffered := true; end; procedure TRenderForm.RefreshClick(Sender: TObject); begin gZoom := 2; RenderForm.RenderRefreshTimer.Tag := -1; //force a new rotation matrix to be generated RenderForm.RenderRefreshTimer.enabled := true; end; procedure TRenderForm.SetSearch(Sender: TObject); begin (sender as TMenuItem).checked := true; gRender.OverlayFromBGSurface := (sender as TMenuItem).tag; RenderRefreshTimer.Enabled := true; end; {$IFDEF FPC} initialization {$I render.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/render.lrs0000664000175000017500000004360011423404106017647 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TRenderForm','FORMDATA',[ 'TPF0'#11'TRenderForm'#10'RenderForm'#4'Left'#3#2#1#6'Height'#3#0#2#3'Top'#3 +#167#0#5'Width'#3#187#3#13'ActiveControl'#7#11'AzimuthEdit'#7'Caption'#6#13 +'Volume Render'#12'ClientHeight'#3#237#1#11'ClientWidth'#3#187#3#9'Font.Name' +#6#13'MS Sans Serif'#4'Menu'#7#9'MainMenu1'#8'OnCreate'#7#10'FormCreate'#6'O' +'nHide'#7#8'FormHide'#6'OnShow'#7#8'FormShow'#8'Position'#7#14'poScreenCente' +'r'#10'LCLVersion'#6#6'0.9.29'#0#6'TPanel'#9'RenderBar'#4'Left'#2#0#6'Height' +#2' '#3'Top'#2#0#5'Width'#3#187#3#5'Align'#7#5'alTop'#10'BevelOuter'#7#6'bvN' +'one'#12'ClientHeight'#2' '#11'ClientWidth'#3#187#3#8'TabOrder'#2#0#0#6'TLab' +'el'#6'Label4'#4'Left'#3#152#0#6'Height'#2#17#3'Top'#2#5#5'Width'#2'9'#7'Cap' +'tion'#6#9'Elevation'#11'ParentColor'#8#0#0#6'TLabel'#6'Label1'#4'Left'#2#4#6 +'Height'#2#17#3'Top'#2#5#5'Width'#2'/'#7'Caption'#6#7'Azimuth'#11'ParentColo' +'r'#8#0#0#12'TSpeedButton'#10'RefreshBtn'#4'Left'#3'('#1#6'Height'#2#31#4'Hi' +'nt'#6'"Generate high-resolution rendering'#3'Top'#2#0#5'Width'#2'('#5'Color' +#7#9'clBtnFace'#10'Glyph.Data'#10'z'#8#0#0'v'#8#0#0'BMv'#8#0#0#0#0#0#0'6'#0#0 +#0'('#0#0#0#24#0#0#0#22#0#0#0#1#0' '#0#0#0#0#0'@'#8#0#0'd'#0#0#0'd'#0#0#0#0#0 +#0#0#0#0#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0 ,#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#9'NumGlyphs'#2#0#7'OnClick'#7#12'RefreshCli' +'ck'#8'ShowHint'#9#14'ParentShowHint'#8#0#0#6'TImage'#14'RenderImageBUP'#3'T' +'ag'#2#2#6'Cursor'#7#7'crCross'#4'Left'#3'h'#1#6'Height'#2#12#3'Top'#2#8#5'W' +'idth'#2#12#8'AutoSize'#9#6'Center'#9#11'OnMouseDown'#7#20'RenderImageMouseD' +'own'#11'OnMouseMove'#7#20'RenderImageMouseMove'#7'Stretch'#9#7'Visible'#8#0 +#0#6'TLabel'#6'Label5'#4'Left'#3'h'#2#6'Height'#2#17#3'Top'#2#5#5'Width'#2'B' +#7'Caption'#6#9'Shading %'#11'ParentColor'#8#0#0#9'TSpinEdit'#11'AzimuthEdit' +#4'Left'#2'H'#6'Height'#2#21#3'Top'#2#2#5'Width'#2'F'#9'Increment'#2#30#8'Ma' +'xValue'#3'h'#1#8'OnChange'#7#10'EditChange'#8'TabOrder'#2#0#5'Value'#2'x'#0 +#0#9'TSpinEdit'#13'ElevationEdit'#4'Left'#3#216#0#6'Height'#2#21#3'Top'#2#2#5 +'Width'#2'F'#9'Increment'#2#30#8'MaxValue'#3#180#0#8'MinValue'#3'L'#255#8'On' +'Change'#7#10'EditChange'#8'TabOrder'#2#1#5'Value'#2#30#0#0#9'TTrackBar'#9'B' +'iasTrack'#4'Left'#3'`'#1#6'Height'#2#29#3'Top'#2#2#5'Width'#2'x'#3'Max'#2'd' +#8'OnChange'#7#15'BiasTrackChange'#8'Position'#2'2'#9'TickStyle'#7#6'tsNone' +#8'TabOrder'#2#2#0#0#9'TTrackBar'#9'GainTrack'#4'Left'#3#224#1#6'Height'#2#29 +#3'Top'#2#2#5'Width'#2'x'#3'Max'#2'd'#8'OnChange'#7#15'BiasTrackChange'#8'Po' ,'sition'#2'2'#9'TickStyle'#7#6'tsNone'#8'TabOrder'#2#3#0#0#9'TSpinEdit'#9'Sh' +'adeEdit'#4'Left'#3#178#2#6'Height'#2#21#3'Top'#2#2#5'Width'#2'F'#9'Incremen' +'t'#2#10#8'OnChange'#7#10'EditChange'#8'TabOrder'#2#4#0#0#9'TTrackBar'#9'Cli' +'pTrack'#4'Left'#3#8#3#6'Height'#2#29#3'Top'#2#2#5'Width'#2'x'#3'Max'#3#231#3 +#8'OnChange'#7#15'ClipTrackChange'#8'Position'#2#0#9'TickStyle'#7#6'tsNone'#8 +'TabOrder'#2#5#0#0#0#10'TScrollBox'#11'RenderPanel'#4'Left'#2#0#6'Height'#3 +#205#1#3'Top'#2' '#5'Width'#3#187#3#5'Align'#7#8'alClient'#12'ClientHeight'#3 +#201#1#11'ClientWidth'#3#183#3#8'TabOrder'#2#1#0#6'TImage'#11'RenderImage'#3 +'Tag'#2#2#6'Cursor'#7#7'crCross'#4'Left'#2#2#6'Height'#2#12#3'Top'#2#2#5'Wid' +'th'#2#12#8'AutoSize'#9#11'OnMouseDown'#7#20'RenderImageMouseDown'#11'OnMous' +'eMove'#7#20'RenderImageMouseMove'#7'Stretch'#9#0#0#0#9'TMainMenu'#9'MainMen' +'u1'#4'left'#2#16#3'top'#2' '#0#9'TMenuItem'#8'FileMenu'#7'Caption'#6#4'File' +#0#9'TMenuItem'#9'Settings1'#7'Caption'#6#13'Open settings'#7'OnClick'#7#14 +'Settings1Click'#0#0#9'TMenuItem'#13'Savesettings1'#7'Caption'#6#16'Save set' +'tings...'#7'OnClick'#7#18'Savesettings1Click'#0#0#9'TMenuItem'#5'Save1'#7'C' +'aption'#6#17'Save as bitmap...'#8'ShortCut'#3'S@'#7'OnClick'#7#10'Save1Clic' +'k'#0#0#9'TMenuItem'#15'RotationBMPMenu'#7'Caption'#6#21'Save Rotation Bitma' +'ps'#7'OnClick'#7#20'RotationBMPMenuClick'#0#0#9'TMenuItem'#12'SaveClipMenu' +#7'Caption'#6#17'Save clip bitmaps'#7'OnClick'#7#17'SaveClipMenuClick'#0#0#9 +'TMenuItem'#6'Close1'#7'Caption'#6#12'Close window'#8'ShortCut'#3'W@'#7'OnCl' +'ick'#7#11'Close1Click'#0#0#0#9'TMenuItem'#5'Edit1'#7'Caption'#6#4'Edit'#0#9 +'TMenuItem'#5'Copy1'#7'Caption'#6#4'Copy'#7'OnClick'#7#10'Copy1Click'#0#0#0#9 +'TMenuItem'#7'Volume1'#7'Caption'#6#10'Background'#0#9'TMenuItem'#19'RenderB' +'GSurfaceMenu'#7'Caption'#6#18'Air/Skin Threshold'#0#9'TMenuItem'#2'N1'#7'Ca' +'ption'#6#2'0%'#10'GroupIndex'#2'w'#9'RadioItem'#9#7'OnClick'#7#7'N1Click'#0 +#0#9'TMenuItem'#4'N101'#3'Tag'#2#25#7'Caption'#6#3'10%'#7'Checked'#9#10'Grou' +'pIndex'#2'w'#9'RadioItem'#9#7'OnClick'#7#7'N1Click'#0#0#9'TMenuItem'#4'N401' +#3'Tag'#2'3'#7'Caption'#6#3'20%'#10'GroupIndex'#2'w'#9'RadioItem'#9#7'OnClic' +'k'#7#7'N1Click'#0#0#9'TMenuItem'#4'N601'#3'Tag'#2'L'#7'Caption'#6#3'30%'#10 +'GroupIndex'#2'w'#9'RadioItem'#9#7'OnClick'#7#7'N1Click'#0#0#9'TMenuItem'#4 +'N801'#3'Tag'#2'e'#7'Caption'#6#3'40%'#10'GroupIndex'#2'w'#9'RadioItem'#9#7 +'OnClick'#7#7'N1Click'#0#0#9'TMenuItem'#4'N403'#3'Tag'#3#128#0#7'Caption'#6#3 +'50%'#10'GroupIndex'#2'w'#9'RadioItem'#9#7'OnClick'#7#7'N1Click'#0#0#9'TMenu' +'Item'#4'N404'#3'Tag'#3#152#0#7'Caption'#6#3'60%'#10'GroupIndex'#2'w'#9'Radi' +'oItem'#9#7'OnClick'#7#7'N1Click'#0#0#9'TMenuItem'#4'N405'#3'Tag'#3#178#0#7 +'Caption'#6#3'70%'#10'GroupIndex'#2'w'#9'RadioItem'#9#7'OnClick'#7#7'N1Click' +#0#0#0#9'TMenuItem'#17'RenderBGDepthMenu'#7'Caption'#6#12'Search Depth'#0#9 +'TMenuItem'#8'N1voxel1'#3'Tag'#2#1#7'Caption'#6#7'1 voxel'#7'Checked'#9#10'G' +'roupIndex'#2'z'#9'RadioItem'#9#7'OnClick'#7#13'N1voxel1Click'#0#0#9'TMenuIt' +'em'#9'N2voxels1'#3'Tag'#2#2#7'Caption'#6#8'2 voxels'#10'GroupIndex'#2'z'#9 +'RadioItem'#9#7'OnClick'#7#13'N1voxel1Click'#0#0#9'TMenuItem'#9'N4voxels1'#3 +'Tag'#2#4#7'Caption'#6#8'4 voxels'#10'GroupIndex'#2'z'#9'RadioItem'#9#7'OnCl' +'ick'#7#13'N1voxel1Click'#0#0#9'TMenuItem'#9'N8voxels1'#3'Tag'#2#8#7'Caption' +#6#8'8 voxels'#10'GroupIndex'#2'z'#9'RadioItem'#9#7'OnClick'#7#13'N1voxel1Cl' +'ick'#0#0#9'TMenuItem'#10'N16voxels1'#3'Tag'#2#12#7'Caption'#6#9'12 voxels' +#10'GroupIndex'#2'z'#9'RadioItem'#9#7'OnClick'#7#13'N1voxel1Click'#0#0#9'TMe' +'nuItem'#9'N16voxels'#3'Tag'#2#16#7'Caption'#6#9'16 voxels'#10'GroupIndex'#2 +'z'#9'RadioItem'#9#7'OnClick'#7#13'N1voxel1Click'#0#0#9'TMenuItem'#9'Infinit' +'e1'#3'Tag'#4#255#255#255#127#7'Caption'#6#8'Infinite'#10'GroupIndex'#2'z'#9 +'RadioItem'#9#7'OnClick'#7#13'N1voxel1Click'#0#0#9'TMenuItem'#7'MIPItem'#7'C' +'aption'#6#3'MIP'#10'GroupIndex'#2'z'#9'RadioItem'#9#7'OnClick'#7#13'N1voxel' +'1Click'#0#0#0#0#9'TMenuItem'#8'Overlay1'#7'Caption'#6#7'Overlay'#0#9'TMenuI' +'tem'#24'RenderOverlaySurfaceMenu'#7'Caption'#6#18'Air/Skin Threshold'#0#9'T' +'MenuItem'#3'N01'#7'Caption'#6#2'0%'#7'Checked'#9#10'GroupIndex'#2'x'#9'Radi' +'oItem'#9#7'OnClick'#7#8'N01Click'#0#0#9'TMenuItem'#4'N102'#3'Tag'#2#25#7'Ca' +'ption'#6#3'10%'#10'GroupIndex'#2'x'#9'RadioItem'#9#7'OnClick'#7#8'N01Click' +#0#0#9'TMenuItem'#4'N201'#3'Tag'#2'3'#7'Caption'#6#3'20%'#10'GroupIndex'#2'x' +#9'RadioItem'#9#7'OnClick'#7#8'N01Click'#0#0#9'TMenuItem'#4'N301'#3'Tag'#2'L' +#7'Caption'#6#3'30%'#10'GroupIndex'#2'x'#9'RadioItem'#9#7'OnClick'#7#8'N01Cl' +'ick'#0#0#9'TMenuItem'#4'N402'#3'Tag'#2'e'#7'Caption'#6#3'40%'#10'GroupIndex' +#2'x'#9'RadioItem'#9#7'OnClick'#7#8'N01Click'#0#0#9'TMenuItem'#4'N501'#3'Tag' +#3#128#0#7'Caption'#6#3'50%'#10'GroupIndex'#2'x'#9'RadioItem'#9#7'OnClick'#7 +#8'N01Click'#0#0#9'TMenuItem'#4'N602'#3'Tag'#3#152#0#7'Caption'#6#3'60%'#10 +'GroupIndex'#2'x'#9'RadioItem'#9#7'OnClick'#7#8'N01Click'#0#0#9'TMenuItem'#4 ,'N701'#3'Tag'#3#178#0#7'Caption'#6#3'70%'#10'GroupIndex'#2'x'#9'RadioItem'#9 +#7'OnClick'#7#8'N01Click'#0#0#0#9'TMenuItem'#22'RenderOverlayDepthMenu'#7'Ca' +'ption'#6#12'Search Depth'#0#9'TMenuItem'#8'N1voxel2'#3'Tag'#2#1#7'Caption'#6 +#7'1 voxel'#7'Checked'#9#10'GroupIndex'#2'z'#9'RadioItem'#9#7'OnClick'#7#22 +'OverlayRenderDepthItem'#0#0#9'TMenuItem'#9'N2voxels2'#3'Tag'#2#2#7'Caption' +#6#8'2 voxels'#10'GroupIndex'#2'z'#9'RadioItem'#9#7'OnClick'#7#22'OverlayRen' +'derDepthItem'#0#0#9'TMenuItem'#9'N4voxels2'#3'Tag'#2#4#7'Caption'#6#8'4 vox' +'els'#10'GroupIndex'#2'z'#9'RadioItem'#9#7'OnClick'#7#22'OverlayRenderDepthI' +'tem'#0#0#9'TMenuItem'#9'N8voxels2'#3'Tag'#2#8#7'Caption'#6#8'8 voxels'#10'G' +'roupIndex'#2'z'#9'RadioItem'#9#7'OnClick'#7#22'OverlayRenderDepthItem'#0#0#9 +'TMenuItem'#10'N12voxels1'#3'Tag'#2#12#7'Caption'#6#9'12 voxels'#10'GroupInd' +'ex'#2'z'#9'RadioItem'#9#7'OnClick'#7#22'OverlayRenderDepthItem'#0#0#9'TMenu' +'Item'#10'N16voxels2'#3'Tag'#2#16#7'Caption'#6#9'16 voxels'#10'GroupIndex'#2 +'z'#9'RadioItem'#9#7'OnClick'#7#22'OverlayRenderDepthItem'#0#0#9'TMenuItem'#9 +'Infinite2'#3'Tag'#4#255#255#255#127#7'Caption'#6#8'Infinite'#10'GroupIndex' +#2'z'#9'RadioItem'#9#7'OnClick'#7#22'OverlayRenderDepthItem'#0#0#0#9'TMenuIt' +'em'#7'Search1'#7'Caption'#6#6'Search'#0#9'TMenuItem'#9'BehindBG1'#7'Caption' +#6#9'Any Depth'#10'GroupIndex'#2#17#9'RadioItem'#9#7'OnClick'#7#9'SetSearch' +#0#0#9'TMenuItem'#8'Infront1'#3'Tag'#2#1#7'Caption'#6' Below BG surface [max' +' intensity]'#10'GroupIndex'#2#17#9'RadioItem'#9#7'OnClick'#7#9'SetSearch'#0 +#0#9'TMenuItem'#9'Anydepth1'#3'Tag'#2#2#7'Caption'#6#24'Infront/below BG sur' +'face'#10'GroupIndex'#2#17#9'RadioItem'#9#7'OnClick'#7#9'SetSearch'#0#0#0#0#9 +'TMenuItem'#8'Quality1'#7'Caption'#6#4'View'#0#9'TMenuItem'#10'CutoutMenu'#7 +'Caption'#6#6'Cutout'#7'OnClick'#7#12'Cutout1Click'#0#0#9'TMenuItem'#9'MenuI' +'tem1'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#14'RenderSmoothBG'#7'Caption'#6#17 +'Smooth Background'#7'Checked'#9#4'Hint'#6#14'Blur rendering'#7'OnClick'#7#19 +'RenderSmoothBGClick'#0#0#9'TMenuItem'#19'RenderSmoothOverlay'#7'Caption'#6 +#14'Smooth Overlay'#7'Checked'#9#4'Hint'#6#14'Blur rendering'#7'OnClick'#7#19 +'RenderSmoothBGClick'#0#0#9'TMenuItem'#26'RenderPreciseInterpolation'#7'Capt' +'ion'#6#21'Precise interpolation'#4'Hint'#6'"Use trilinear interpolation [sl' +'ow]'#7'OnClick'#7#31'RenderPreciseInterpolationClick'#0#0#9'TMenuItem'#2'N2' +#7'Caption'#6#1'-'#0#0#9'TMenuItem'#11'FlipLRcheck'#7'Caption'#6#8'Flip L/R' +#7'OnClick'#7#17'RenderSmoothClick'#0#0#0#0#6'TTimer'#18'RenderRefreshTimer' +#7'Enabled'#8#8'Interval'#3#150#0#7'OnTimer'#7#23'RenderRefreshTimerTimer'#4 +'left'#2'0'#3'top'#2' '#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/render.lfm0000664000175000017500000004257111423404106017633 0ustar michaelmichaelobject RenderForm: TRenderForm Left = 258 Height = 512 Top = 167 Width = 955 ActiveControl = AzimuthEdit Caption = 'Volume Render' ClientHeight = 493 ClientWidth = 955 Font.Name = 'MS Sans Serif' Menu = MainMenu1 OnCreate = FormCreate OnHide = FormHide OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object RenderBar: TPanel Left = 0 Height = 32 Top = 0 Width = 955 Align = alTop BevelOuter = bvNone ClientHeight = 32 ClientWidth = 955 TabOrder = 0 object Label4: TLabel Left = 152 Height = 17 Top = 5 Width = 57 Caption = 'Elevation' ParentColor = False end object Label1: TLabel Left = 4 Height = 17 Top = 5 Width = 47 Caption = 'Azimuth' ParentColor = False end object RefreshBtn: TSpeedButton Left = 296 Height = 31 Hint = 'Generate high-resolution rendering' Top = 0 Width = 40 Color = clBtnFace Glyph.Data = { 76080000424D7608000000000000360000002800000018000000160000000100 2000000000004008000064000000640000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFF FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFF FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF } NumGlyphs = 0 OnClick = RefreshClick ShowHint = True ParentShowHint = False end object RenderImageBUP: TImage Tag = 2 Cursor = crCross Left = 360 Height = 12 Top = 8 Width = 12 AutoSize = True Center = True OnMouseDown = RenderImageMouseDown OnMouseMove = RenderImageMouseMove Stretch = True Visible = False end object Label5: TLabel Left = 616 Height = 17 Top = 5 Width = 66 Caption = 'Shading %' ParentColor = False end object AzimuthEdit: TSpinEdit Left = 72 Height = 21 Top = 2 Width = 70 Increment = 30 MaxValue = 360 OnChange = EditChange TabOrder = 0 Value = 120 end object ElevationEdit: TSpinEdit Left = 216 Height = 21 Top = 2 Width = 70 Increment = 30 MaxValue = 180 MinValue = -180 OnChange = EditChange TabOrder = 1 Value = 30 end object BiasTrack: TTrackBar Left = 352 Height = 29 Top = 2 Width = 120 Max = 100 OnChange = BiasTrackChange Position = 50 TickStyle = tsNone TabOrder = 2 end object GainTrack: TTrackBar Left = 480 Height = 29 Top = 2 Width = 120 Max = 100 OnChange = BiasTrackChange Position = 50 TickStyle = tsNone TabOrder = 3 end object ShadeEdit: TSpinEdit Left = 690 Height = 21 Top = 2 Width = 70 Increment = 10 OnChange = EditChange TabOrder = 4 end object ClipTrack: TTrackBar Left = 776 Height = 29 Top = 2 Width = 120 Max = 999 OnChange = ClipTrackChange Position = 0 TickStyle = tsNone TabOrder = 5 end end object RenderPanel: TScrollBox Left = 0 Height = 461 Top = 32 Width = 955 Align = alClient ClientHeight = 457 ClientWidth = 951 TabOrder = 1 object RenderImage: TImage Tag = 2 Cursor = crCross Left = 2 Height = 12 Top = 2 Width = 12 AutoSize = True OnMouseDown = RenderImageMouseDown OnMouseMove = RenderImageMouseMove Stretch = True end end object MainMenu1: TMainMenu left = 16 top = 32 object FileMenu: TMenuItem Caption = 'File' object Settings1: TMenuItem Caption = 'Open settings' OnClick = Settings1Click end object Savesettings1: TMenuItem Caption = 'Save settings...' OnClick = Savesettings1Click end object Save1: TMenuItem Caption = 'Save as bitmap...' ShortCut = 16467 OnClick = Save1Click end object RotationBMPMenu: TMenuItem Caption = 'Save Rotation Bitmaps' OnClick = RotationBMPMenuClick end object SaveClipMenu: TMenuItem Caption = 'Save clip bitmaps' OnClick = SaveClipMenuClick end object Close1: TMenuItem Caption = 'Close window' ShortCut = 16471 OnClick = Close1Click end end object Edit1: TMenuItem Caption = 'Edit' object Copy1: TMenuItem Caption = 'Copy' OnClick = Copy1Click end end object Volume1: TMenuItem Caption = 'Background' object RenderBGSurfaceMenu: TMenuItem Caption = 'Air/Skin Threshold' object N1: TMenuItem Caption = '0%' GroupIndex = 119 RadioItem = True OnClick = N1Click end object N101: TMenuItem Tag = 25 Caption = '10%' Checked = True GroupIndex = 119 RadioItem = True OnClick = N1Click end object N401: TMenuItem Tag = 51 Caption = '20%' GroupIndex = 119 RadioItem = True OnClick = N1Click end object N601: TMenuItem Tag = 76 Caption = '30%' GroupIndex = 119 RadioItem = True OnClick = N1Click end object N801: TMenuItem Tag = 101 Caption = '40%' GroupIndex = 119 RadioItem = True OnClick = N1Click end object N403: TMenuItem Tag = 128 Caption = '50%' GroupIndex = 119 RadioItem = True OnClick = N1Click end object N404: TMenuItem Tag = 152 Caption = '60%' GroupIndex = 119 RadioItem = True OnClick = N1Click end object N405: TMenuItem Tag = 178 Caption = '70%' GroupIndex = 119 RadioItem = True OnClick = N1Click end end object RenderBGDepthMenu: TMenuItem Caption = 'Search Depth' object N1voxel1: TMenuItem Tag = 1 Caption = '1 voxel' Checked = True GroupIndex = 122 RadioItem = True OnClick = N1voxel1Click end object N2voxels1: TMenuItem Tag = 2 Caption = '2 voxels' GroupIndex = 122 RadioItem = True OnClick = N1voxel1Click end object N4voxels1: TMenuItem Tag = 4 Caption = '4 voxels' GroupIndex = 122 RadioItem = True OnClick = N1voxel1Click end object N8voxels1: TMenuItem Tag = 8 Caption = '8 voxels' GroupIndex = 122 RadioItem = True OnClick = N1voxel1Click end object N16voxels1: TMenuItem Tag = 12 Caption = '12 voxels' GroupIndex = 122 RadioItem = True OnClick = N1voxel1Click end object N16voxels: TMenuItem Tag = 16 Caption = '16 voxels' GroupIndex = 122 RadioItem = True OnClick = N1voxel1Click end object Infinite1: TMenuItem Tag = 2147483647 Caption = 'Infinite' GroupIndex = 122 RadioItem = True OnClick = N1voxel1Click end object MIPItem: TMenuItem Caption = 'MIP' GroupIndex = 122 RadioItem = True OnClick = N1voxel1Click end end end object Overlay1: TMenuItem Caption = 'Overlay' object RenderOverlaySurfaceMenu: TMenuItem Caption = 'Air/Skin Threshold' object N01: TMenuItem Caption = '0%' Checked = True GroupIndex = 120 RadioItem = True OnClick = N01Click end object N102: TMenuItem Tag = 25 Caption = '10%' GroupIndex = 120 RadioItem = True OnClick = N01Click end object N201: TMenuItem Tag = 51 Caption = '20%' GroupIndex = 120 RadioItem = True OnClick = N01Click end object N301: TMenuItem Tag = 76 Caption = '30%' GroupIndex = 120 RadioItem = True OnClick = N01Click end object N402: TMenuItem Tag = 101 Caption = '40%' GroupIndex = 120 RadioItem = True OnClick = N01Click end object N501: TMenuItem Tag = 128 Caption = '50%' GroupIndex = 120 RadioItem = True OnClick = N01Click end object N602: TMenuItem Tag = 152 Caption = '60%' GroupIndex = 120 RadioItem = True OnClick = N01Click end object N701: TMenuItem Tag = 178 Caption = '70%' GroupIndex = 120 RadioItem = True OnClick = N01Click end end object RenderOverlayDepthMenu: TMenuItem Caption = 'Search Depth' object N1voxel2: TMenuItem Tag = 1 Caption = '1 voxel' Checked = True GroupIndex = 122 RadioItem = True OnClick = OverlayRenderDepthItem end object N2voxels2: TMenuItem Tag = 2 Caption = '2 voxels' GroupIndex = 122 RadioItem = True OnClick = OverlayRenderDepthItem end object N4voxels2: TMenuItem Tag = 4 Caption = '4 voxels' GroupIndex = 122 RadioItem = True OnClick = OverlayRenderDepthItem end object N8voxels2: TMenuItem Tag = 8 Caption = '8 voxels' GroupIndex = 122 RadioItem = True OnClick = OverlayRenderDepthItem end object N12voxels1: TMenuItem Tag = 12 Caption = '12 voxels' GroupIndex = 122 RadioItem = True OnClick = OverlayRenderDepthItem end object N16voxels2: TMenuItem Tag = 16 Caption = '16 voxels' GroupIndex = 122 RadioItem = True OnClick = OverlayRenderDepthItem end object Infinite2: TMenuItem Tag = 2147483647 Caption = 'Infinite' GroupIndex = 122 RadioItem = True OnClick = OverlayRenderDepthItem end end object Search1: TMenuItem Caption = 'Search' object BehindBG1: TMenuItem Caption = 'Any Depth' GroupIndex = 17 RadioItem = True OnClick = SetSearch end object Infront1: TMenuItem Tag = 1 Caption = 'Below BG surface [max intensity]' GroupIndex = 17 RadioItem = True OnClick = SetSearch end object Anydepth1: TMenuItem Tag = 2 Caption = 'Infront/below BG surface' GroupIndex = 17 RadioItem = True OnClick = SetSearch end end end object Quality1: TMenuItem Caption = 'View' object CutoutMenu: TMenuItem Caption = 'Cutout' OnClick = Cutout1Click end object MenuItem1: TMenuItem Caption = '-' end object RenderSmoothBG: TMenuItem Caption = 'Smooth Background' Checked = True Hint = 'Blur rendering' OnClick = RenderSmoothBGClick end object RenderSmoothOverlay: TMenuItem Caption = 'Smooth Overlay' Checked = True Hint = 'Blur rendering' OnClick = RenderSmoothBGClick end object RenderPreciseInterpolation: TMenuItem Caption = 'Precise interpolation' Hint = 'Use trilinear interpolation [slow]' OnClick = RenderPreciseInterpolationClick end object N2: TMenuItem Caption = '-' end object FlipLRcheck: TMenuItem Caption = 'Flip L/R' OnClick = RenderSmoothClick end end end object RenderRefreshTimer: TTimer Enabled = False Interval = 150 OnTimer = RenderRefreshTimerTimer left = 48 top = 32 end end mricron-0.20120505.1~dfsg.1.orig/render/0000775000175000017500000000000011660470014017126 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/render/default.ini0000664000175000017500000000060311645606414021262 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=1 Trilinear=1 ShowCutout=0 FlipLR=0 [INT] OverlayFromBGSurface=1 BGNearClip=0 OverlayNearClip=0 Azimuth=90 Elevation=45 BGSurface=25 OverlaySurface=1 BGDepth=12 OverlayDepth=8 CutoutBias=3 cutoutLUTindex=0 ShadePct=0 CutoutLoFrac1=530 CutoutHiFrac1=1000 CutoutLoFrac2=544 CutoutHiFrac2=1000 CutoutLoFrac3=481 CutoutHiFrac3=1000 mricron-0.20120505.1~dfsg.1.orig/render/cut.ini0000664000175000017500000000051010532014624020414 0ustar michaelmichael[BOOL] SmoothBG=0 SmoothOverlay=0 Trilinear=1 ShowCutout=1 FlipLR=0 [INT] OverlayFromBGSurface=1 BGNearClip=0 OverlayNearClip=0 Azimuth=110 Elevation=30 BGSurface=0 OverlaySurface=1 BGDepth=12 OverlayDepth=8 CutoutBias=3 CutoutLo1=96 CutoutHi1=181 CutoutLo2=118 CutoutHi2=217 CutoutLo3=87 CutoutHi3=181 mricron-0.20120505.1~dfsg.1.orig/render/a0e90.ini0000664000175000017500000000050610531444336020452 0ustar michaelmichael[BOOL] SmoothBG=0 SmoothOverlay=0 Trilinear=1 ShowCutout=0 FlipLR=0 [INT] OverlayFromBGSurface=1 BGNearClip=0 OverlayNearClip=0 Azimuth=0 Elevation=90 BGSurface=0 OverlaySurface=1 BGDepth=12 OverlayDepth=8 CutoutBias=3 CutoutLo1=96 CutoutHi1=181 CutoutLo2=118 CutoutHi2=217 CutoutLo3=87 CutoutHi3=181 mricron-0.20120505.1~dfsg.1.orig/Readme.txt0000664000175000017500000000573511424011424017611 0ustar michaelmichaelThis is a beta release of MRIcron. You can compile this using Lazarus. It has been compiled on Windows, Linux-x86, OSX-x86 and OSX-PPC. It requires builds of Lazarus and FreePascal created after October 7, 2007. http://www.hu.freepascal.org/lazarus/ ------------------------------------------- To compile for OSX [Carbon] - 1.) Launch Lazarus and open the project. 2.) Select Project/CompilerOptions Paths tab: make sure the "LCL widget type" is set to "carbon" Linking tab: make sure the "Pass options to linker" checkbox is selected and set the text to "-framework carbon" (no quotes). 3.) Select Project/ProjectOptions and set "Use application bundle for running and debugging" 4.) If using OSX 10.5 or later, add to Project / Compiler options / Other / Custom options: -k-macosx_version_min -k10.4 -XR/Developer/SDKs/MacOSX10.4u.sdk/ Alternative: Project/ProjectOptions/Linking/ Check 'pass options to linker' and add this line -macosx_version_min 10.4 5.) For debugging, you will want to create an alias from the application folder to the compiled executable: The exact value will depend on your paths, but it will be similar to this: rm ~/Documents/mricron/mricron.app/mricron ln -s ~/Documents/mricron/mricron ~/Documents/mricron/mricron.app/mricron rm ~/Documents/mricron/npm/npm.app/npm ln -s ~/Documents/mricron/npm/npm ~/Documents/mricron/npm/npm.app/npm rm ~/Documents/mricron/dcm2nii/dcm2niigui.app/dcm2niigui ln -s ~/Documents/mricron/dcm2nii/dcm2niigui ~/Documents/mricron/dcm2nii/dcm2niigui.app/dcm2niigui 6.) Select Run/Run to build and execute your program 7.) For making an executable to distribute, control+click on the program's .app folder (e.g. the file named mricron that has a brain icon) and choose "show package contents" - move the executable generated with Lazarus into the folder, overwriting the symbolic link created in step 4. ------------------------------------------- To compile for Linux GTK1 - 1.) Launch Lazarus and open the project. 2.) Select Project/CompilerOptions Paths tab: make sure the "LCL widget type" is set to "default [gtk]" Linking tab: make sure the "Pass options to linker" checkbox is UNCHECKED. 3.) Choose Run/Run to build and execute the program ------------------------------------------- To compile for Linux GTK2 - 1.) Launch Lazarus and open the project. 2.) Select Project/CompilerOptions Paths tab: make sure the "LCL widget type" is set to "gtk2" Linking tab: make sure the "Pass options to linker" checkbox is UNCHECKED. 3.) Choose Run/Run to build and execute the program ------------------------------------------- To compile for Windows - 1.) Launch Lazarus and open the project. 2.) Select Project/CompilerOptions Paths tab: make sure the "LCL widget type" is set to "default [Win API]" Linking tab: make sure the "Pass options to linker" checkbox is UNCHECKED. 3.) Choose Run/Run to build and execute the program mricron-0.20120505.1~dfsg.1.orig/ReadInt.pas0000664000175000017500000000343411450366562017717 0ustar michaelmichaelunit ReadInt; interface uses {$IFDEF FPC} LResources,{$ENDIF} Buttons{only Lazarus?},SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin; type { TReadIntForm } TReadIntForm = class(TForm) ReadIntEdit: TSpinEdit; ReadIntLabel: TLabel; OKBtn: TButton; procedure FormShow(Sender: TObject); function GetInt(lStr: string; lMin,lDefault,lMax: integer): integer; procedure OKBtnClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var ReadIntForm: TReadIntForm; implementation uses nifti_img_view,{license,} MultiSlice, render; {$IFNDEF FPC} {$R *.DFM} {$ENDIF} function TReadIntForm.GetInt(lStr: string; lMin,lDefault,lMax: integer): integer; begin //result := lDefault; ReadIntLabel.caption := lStr+' ['+inttostr(lMin)+'..'+inttostr(lMax)+']'; ReadIntEdit.MinValue := lMin; ReadIntEdit.MaxValue := lMax; ReadIntEdit.Value := lDefault; //ReadIntForm.OKBtn.Focused := true; //ReadIntForm.OKBtn.SetFocus; ReadIntForm.ShowModal; result := ReadIntEdit.Value; end; procedure TReadIntForm.FormShow(Sender: TObject); begin //OKBtn.SetFocus;; end; procedure TReadIntForm.OKBtnClick(Sender: TObject); begin ReadIntForm.ModalResult := mrOK; end; procedure TReadIntForm.FormCreate(Sender: TObject); //var lCPUid: longint; begin //Jan 2008 39448 if Date > (400003) then begin showmessage('This software became obsolete on '+datetostr(40000)+'. Please update to the current version.'); //gBGImg.LicenseID := 1626; //ImgForm.Exit1Click(nil); end; end; {$IFDEF FPC} initialization {$I ReadInt.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/ReadInt.lrs0000664000175000017500000000227211450366562017733 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TReadIntForm','FORMDATA',[ 'TPF0'#12'TReadIntForm'#11'ReadIntForm'#4'Left'#3'N'#1#6'Height'#2'_'#3'Top'#3 +#206#0#5'Width'#3#209#1#13'ActiveControl'#7#11'ReadIntEdit'#11'BorderStyle'#7 +#8'bsDialog'#7'Caption'#6#16'Integer required'#12'ClientHeight'#2'_'#11'Clie' +'ntWidth'#3#209#1#21'Constraints.MaxHeight'#2'_'#20'Constraints.MaxWidth'#3 +#209#1#21'Constraints.MinHeight'#2'_'#20'Constraints.MinWidth'#3#209#1#9'Fon' +'t.Name'#6#13'MS Sans Serif'#8'OnCreate'#7#10'FormCreate'#6'OnShow'#7#8'Form' +'Show'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29'#0#6'TLabe' +'l'#12'ReadIntLabel'#4'Left'#2#16#6'Height'#2#14#3'Top'#2#15#5'Width'#3'P'#1 +#9'Alignment'#7#14'taRightJustify'#8'AutoSize'#8#7'Caption'#6#14'Enter a num' +'ber'#11'ParentColor'#8#0#0#9'TSpinEdit'#11'ReadIntEdit'#4'Left'#3'h'#1#6'He' +'ight'#2#24#3'Top'#2#12#5'Width'#2']'#8'MaxValue'#2#0#8'TabOrder'#2#1#0#0#7 +'TButton'#5'OKBtn'#4'Left'#3'p'#1#6'Height'#2#25#3'Top'#2'7'#5'Width'#2'K'#25 +'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#2'OK'#7'OnClick'#7#10'OKBtnClic' +'k'#8'TabOrder'#2#0#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/ReadInt.lfm0000664000175000017500000000177711450366562017722 0ustar michaelmichaelobject ReadIntForm: TReadIntForm Left = 334 Height = 95 Top = 206 Width = 465 ActiveControl = ReadIntEdit BorderStyle = bsDialog Caption = 'Integer required' ClientHeight = 95 ClientWidth = 465 Constraints.MaxHeight = 95 Constraints.MaxWidth = 465 Constraints.MinHeight = 95 Constraints.MinWidth = 465 Font.Name = 'MS Sans Serif' OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object ReadIntLabel: TLabel Left = 16 Height = 14 Top = 15 Width = 336 Alignment = taRightJustify AutoSize = False Caption = 'Enter a number' ParentColor = False end object ReadIntEdit: TSpinEdit Left = 360 Height = 24 Top = 12 Width = 93 MaxValue = 0 TabOrder = 1 end object OKBtn: TButton Left = 368 Height = 25 Top = 55 Width = 75 BorderSpacing.InnerBorder = 4 Caption = 'OK' OnClick = OKBtnClick TabOrder = 0 end end mricron-0.20120505.1~dfsg.1.orig/ReadFloat.pas0000664000175000017500000000216511450366530020225 0ustar michaelmichaelunit ReadFloat; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Spin; type { TReadFloatForm } TReadFloatForm = class(TForm) ReadFloatEdit: TFloatSpinEdit; OKBtn: TButton; ReadFloatLabel: TLabel; procedure OKBtnClick(Sender: TObject); function GetFloat(lStr: string; lMin,lDefault,lMax: double): double; private { private declarations } public { public declarations } end; var ReadFloatForm: TReadFloatForm; implementation { TReadFloatForm } function TReadFloatForm.GetFloat(lStr: string; lMin,lDefault,lMax: double): double; begin //result := lDefault; ReadFloatLabel.caption := lStr+' ['+floattostr(lMin)+'..'+floattostr(lMax)+']'; ReadFloatEdit.MinValue := lMin; ReadFloatEdit.MaxValue := lMax; ReadFloatEdit.Value := lDefault; ReadFloatForm.ShowModal; result := ReadFloatEdit.value; end; procedure TReadFloatForm.OKBtnClick(Sender: TObject); begin ReadFloatForm.ModalResult := mrOK; end; initialization {$I ReadFloat.lrs} end. mricron-0.20120505.1~dfsg.1.orig/ReadFloat.lrs0000664000175000017500000000254011450366530020237 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TReadFloatForm','FORMDATA',[ 'TPF0'#14'TReadFloatForm'#13'ReadFloatForm'#4'Left'#3'O'#1#6'Height'#2'_'#3'T' +'op'#3'4'#1#5'Width'#3#209#1#18'HorzScrollBar.Page'#3#208#1#18'VertScrollBar' +'.Page'#2'^'#11'BorderIcons'#11#12'biSystemMenu'#0#11'BorderStyle'#7#8'bsDia' +'log'#7'Caption'#6#20'Real number required'#12'ClientHeight'#2'_'#11'ClientW' +'idth'#3#209#1#21'Constraints.MaxHeight'#2'_'#20'Constraints.MaxWidth'#3#209 +#1#21'Constraints.MinHeight'#2'_'#20'Constraints.MinWidth'#3#209#1#8'Positio' +'n'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29'#0#6'TLabel'#14'ReadFloat' +'Label'#4'Left'#2#16#6'Height'#2#14#3'Top'#2#15#5'Width'#3'8'#1#9'Alignment' +#7#14'taRightJustify'#8'AutoSize'#8#7'Caption'#6#14'Enter a number'#11'Paren' +'tColor'#8#0#0#7'TButton'#5'OKBtn'#4'Left'#3'p'#1#6'Height'#2#25#3'Top'#2'7' +#5'Width'#2'K'#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#2'OK'#7'OnClic' +'k'#7#10'OKBtnClick'#8'TabOrder'#2#0#0#0#14'TFloatSpinEdit'#13'ReadFloatEdit' +#4'Left'#3'P'#1#6'Height'#2#21#3'Top'#2#12#5'Width'#2'w'#13'DecimalPlaces'#2 +#4#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0' '#188#190 +#25'@'#8'MinValue'#5#0#0#0#0#0' '#188#190#25#192#8'TabOrder'#2#1#5'Value'#5#0 +#0#0#0#0#0#0#0#0#0#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/ReadFloat.lfm0000664000175000017500000000213011450366530020210 0ustar michaelmichaelobject ReadFloatForm: TReadFloatForm Left = 335 Height = 95 Top = 308 Width = 465 HorzScrollBar.Page = 464 VertScrollBar.Page = 94 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Real number required' ClientHeight = 95 ClientWidth = 465 Constraints.MaxHeight = 95 Constraints.MaxWidth = 465 Constraints.MinHeight = 95 Constraints.MinWidth = 465 Position = poScreenCenter LCLVersion = '0.9.29' object ReadFloatLabel: TLabel Left = 16 Height = 14 Top = 15 Width = 312 Alignment = taRightJustify AutoSize = False Caption = 'Enter a number' ParentColor = False end object OKBtn: TButton Left = 368 Height = 25 Top = 55 Width = 75 BorderSpacing.InnerBorder = 4 Caption = 'OK' OnClick = OKBtnClick TabOrder = 0 end object ReadFloatEdit: TFloatSpinEdit Left = 336 Height = 21 Top = 12 Width = 119 DecimalPlaces = 4 Increment = 1 MaxValue = 100000000 MinValue = -100000000 TabOrder = 1 Value = 0 end end mricron-0.20120505.1~dfsg.1.orig/prefs.pas0000664000175000017500000000523211545352326017504 0ustar michaelmichaelunit prefs; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Spin, Buttons; type { TPrefForm } TPrefForm = class(TForm) SingleRowCheck: TCheckBox; OrthoCheck: TCheckBox; XBarClr: TButton; OKBtn: TButton; CancelBtn: TButton; ThinPenCheck: TCheckBox; GroupBox2: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; ResliceCheck: TCheckBox; GroupBox1: TGroupBox; DrawCheck: TCheckBox; MaxDimEdit: TSpinEdit; ThreadEdit: TSpinEdit; SigDigEdit: TSpinEdit; procedure CancelBtnClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure OKBtnClick(Sender: TObject); procedure ResliceCheckClick(Sender: TObject); procedure XBarClrClick(Sender: TObject); private { private declarations } public { public declarations } end; var PrefForm: TPrefForm; implementation uses nifti_img_view; { TPrefForm } procedure TPrefForm.CancelBtnClick(Sender: TObject); begin Close; end; procedure TPrefForm.FormCreate(Sender: TObject); begin end; procedure TPrefForm.FormShow(Sender: TObject); begin ResliceCheck.checked := gBGImg.ResliceOnLoad; //OrthoCheck.Visible := not gBGImg.ResliceOnLoad; OrthoCheck.checked := gBGImg.OrthoReslice; MaxDimEdit.value := gBGImg.MaxDim; ThreadEdit.value := gnCPUThreads; DrawCheck.checked := ImgForm.ToolPanel.Visible; ThinPenCheck.Checked := gBGImg.ThinPen; SigDigEdit.value := gBGImg.SigDig; SingleRowCheck.checked := gBGImg.SingleRow; end; procedure TPrefForm.OKBtnClick(Sender: TObject); begin gBGImg.ResliceOnLoad := ResliceCheck.checked; gBGImg.OrthoReslice := OrthoCheck.checked; gBGImg.MaxDim := MaxDimEdit.value; gnCPUThreads := ThreadEdit.value; ImgForm.ToolPanel.Visible := DrawCheck.checked; ImgForm.DrawMenu.Visible := DrawCheck.checked; gBGImg.ThinPen := ThinPenCheck.Checked; gBGImg.SigDig := SigDigEdit.value; if gBGImg.SingleRow <> SingleRowCheck.Checked then begin gBGImg.SingleRow := SingleRowCheck.Checked; ImgForm.DefaultControlPanel; ImgForm.RefreshImagesTimer.enabled := true; end; Close; end; procedure TPrefForm.ResliceCheckClick(Sender: TObject); begin // OrthoCheck.Visible := not ResliceCheck.checked; end; procedure TPrefForm.XBarClrClick(Sender: TObject); begin ImgForm.XBarColor; PrefForm.BringToFront; end; initialization {$I prefs.lrs} end. mricron-0.20120505.1~dfsg.1.orig/prefs.lrs0000664000175000017500000000655511545352326017532 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TPrefForm','FORMDATA',[ 'TPF0'#9'TPrefForm'#8'PrefForm'#4'Left'#3'l'#3#6'Height'#3#200#1#3'Top'#3#139 +#0#5'Width'#3#137#1#13'ActiveControl'#7#12'ResliceCheck'#11'BorderIcons'#11 +#12'biSystemMenu'#0#11'BorderStyle'#7#8'bsDialog'#7'Caption'#6#11'Preference' +'s'#12'ClientHeight'#3#200#1#11'ClientWidth'#3#137#1#21'Constraints.MaxHeigh' +'t'#3#200#1#20'Constraints.MaxWidth'#3#137#1#21'Constraints.MinHeight'#3#200 +#1#20'Constraints.MinWidth'#3#137#1#8'OnCreate'#7#10'FormCreate'#6'OnShow'#7 +#8'FormShow'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29'#0#9 +'TGroupBox'#9'GroupBox1'#4'Left'#2#8#6'Height'#3#24#1#3'Top'#2#8#5'Width'#3 +'p'#1#7'Caption'#6#13'Image Display'#12'ClientHeight'#3#6#1#11'ClientWidth'#3 +'l'#1#8'TabOrder'#2#0#0#6'TLabel'#6'Label1'#4'Left'#2'x'#6'Height'#2#14#3'To' +'p'#2'G'#5'Width'#3#138#0#7'Caption'#6#26'Maximum Dimension [Voxels]'#11'Par' +'entColor'#8#0#0#6'TLabel'#6'Label2'#4'Left'#2'x'#6'Height'#2#14#3'Top'#2'q' +#5'Width'#2'\'#7'Caption'#6#17'Rendering Threads'#11'ParentColor'#8#0#0#6'TL' +'abel'#6'Label3'#4'Left'#2'x'#6'Height'#2#14#3'Top'#3#145#0#5'Width'#2'w'#7 +'Caption'#6#24'Decimal places Displayed'#11'ParentColor'#8#0#0#9'TCheckBox' +#12'ResliceCheck'#4'Left'#2#15#6'Height'#2#17#3'Top'#2#9#5'Width'#3#163#0#7 +'Caption'#6#28'Reorient images when loading'#7'OnClick'#7#17'ResliceCheckCli' +'ck'#8'TabOrder'#2#0#0#0#9'TSpinEdit'#10'MaxDimEdit'#4'Left'#2#14#6'Height'#2 +#21#3'Top'#2'@'#5'Width'#2'd'#8'MaxValue'#3#0#16#8'MinValue'#3#0#1#8'TabOrde' +'r'#2#1#5'Value'#3#0#1#0#0#9'TSpinEdit'#10'ThreadEdit'#4'Left'#2#14#6'Height' +#2#21#3'Top'#2'e'#5'Width'#2'd'#8'MaxValue'#3#0#16#8'MinValue'#2#1#8'TabOrde' +'r'#2#2#5'Value'#2#1#0#0#9'TSpinEdit'#10'SigDigEdit'#4'Left'#2#14#6'Height'#2 +#21#3'Top'#3#138#0#5'Width'#2'd'#8'MaxValue'#2' '#8'TabOrder'#2#3#0#0#9'TChe' +'ckBox'#10'OrthoCheck'#4'Left'#2'+'#6'Height'#2#17#3'Top'#2'%'#5'Width'#3#190 +#0#7'Caption'#6'"Rotate to nearest orthogonal angle'#8'TabOrder'#2#4#7'Visib' +'le'#8#0#0#9'TCheckBox'#14'SingleRowCheck'#4'Left'#2#15#6'Height'#2#17#3'Top' +#3#208#0#5'Width'#3#134#0#7'Caption'#6#26'All slices on a single row'#8'TabO' +'rder'#2#5#0#0#0#9'TGroupBox'#9'GroupBox2'#4'Left'#2#8#6'Height'#2'P'#3'Top' +#3'('#1#5'Width'#3'p'#1#7'Caption'#6#7'Drawing'#12'ClientHeight'#2'>'#11'Cli' +'entWidth'#3'l'#1#8'TabOrder'#2#1#0#9'TCheckBox'#9'DrawCheck'#4'Left'#2#15#6 +'Height'#2#17#3'Top'#2#9#5'Width'#3#168#0#7'Caption'#6#28'Show drawing menus' +' and tools'#8'TabOrder'#2#0#0#0#9'TCheckBox'#12'ThinPenCheck'#4'Left'#2#15#6 +'Height'#2#17#3'Top'#2' '#5'Width'#2'='#7'Caption'#6#8'Thin Pen'#8'TabOrder' +#2#1#0#0#0#7'TButton'#5'OKBtn'#4'Left'#3'('#1#6'Height'#2#25#3'Top'#3#133#1#5 +'Width'#2'K'#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#2'OK'#7'OnClick' +#7#10'OKBtnClick'#8'TabOrder'#2#2#0#0#7'TButton'#9'CancelBtn'#4'Left'#3#192#0 +#6'Height'#2#25#3'Top'#3#133#1#5'Width'#2'K'#25'BorderSpacing.InnerBorder'#2 +#4#7'Caption'#6#6'Cancel'#7'OnClick'#7#14'CancelBtnClick'#8'TabOrder'#2#3#0#0 +#7'TButton'#7'XBarClr'#4'Left'#2#26#6'Height'#2#25#3'Top'#3#197#0#5'Width'#3 +#178#0#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#22'Choose Cross-Bar Co' +'lor'#7'OnClick'#7#12'XBarClrClick'#8'TabOrder'#2#4#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/prefs.lfm0000664000175000017500000000643311545352326017503 0ustar michaelmichaelobject PrefForm: TPrefForm Left = 876 Height = 456 Top = 139 Width = 393 ActiveControl = ResliceCheck BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Preferences' ClientHeight = 456 ClientWidth = 393 Constraints.MaxHeight = 456 Constraints.MaxWidth = 393 Constraints.MinHeight = 456 Constraints.MinWidth = 393 OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object GroupBox1: TGroupBox Left = 8 Height = 280 Top = 8 Width = 368 Caption = 'Image Display' ClientHeight = 262 ClientWidth = 364 TabOrder = 0 object Label1: TLabel Left = 120 Height = 14 Top = 71 Width = 138 Caption = 'Maximum Dimension [Voxels]' ParentColor = False end object Label2: TLabel Left = 120 Height = 14 Top = 113 Width = 92 Caption = 'Rendering Threads' ParentColor = False end object Label3: TLabel Left = 120 Height = 14 Top = 145 Width = 119 Caption = 'Decimal places Displayed' ParentColor = False end object ResliceCheck: TCheckBox Left = 15 Height = 17 Top = 9 Width = 163 Caption = 'Reorient images when loading' OnClick = ResliceCheckClick TabOrder = 0 end object MaxDimEdit: TSpinEdit Left = 14 Height = 21 Top = 64 Width = 100 MaxValue = 4096 MinValue = 256 TabOrder = 1 Value = 256 end object ThreadEdit: TSpinEdit Left = 14 Height = 21 Top = 101 Width = 100 MaxValue = 4096 MinValue = 1 TabOrder = 2 Value = 1 end object SigDigEdit: TSpinEdit Left = 14 Height = 21 Top = 138 Width = 100 MaxValue = 32 TabOrder = 3 end object OrthoCheck: TCheckBox Left = 43 Height = 17 Top = 37 Width = 190 Caption = 'Rotate to nearest orthogonal angle' TabOrder = 4 Visible = False end object SingleRowCheck: TCheckBox Left = 15 Height = 17 Top = 208 Width = 134 Caption = 'All slices on a single row' TabOrder = 5 end end object GroupBox2: TGroupBox Left = 8 Height = 80 Top = 296 Width = 368 Caption = 'Drawing' ClientHeight = 62 ClientWidth = 364 TabOrder = 1 object DrawCheck: TCheckBox Left = 15 Height = 17 Top = 9 Width = 168 Caption = 'Show drawing menus and tools' TabOrder = 0 end object ThinPenCheck: TCheckBox Left = 15 Height = 17 Top = 32 Width = 61 Caption = 'Thin Pen' TabOrder = 1 end end object OKBtn: TButton Left = 296 Height = 25 Top = 389 Width = 75 BorderSpacing.InnerBorder = 4 Caption = 'OK' OnClick = OKBtnClick TabOrder = 2 end object CancelBtn: TButton Left = 192 Height = 25 Top = 389 Width = 75 BorderSpacing.InnerBorder = 4 Caption = 'Cancel' OnClick = CancelBtnClick TabOrder = 3 end object XBarClr: TButton Left = 26 Height = 25 Top = 197 Width = 178 BorderSpacing.InnerBorder = 4 Caption = 'Choose Cross-Bar Color' OnClick = XBarClrClick TabOrder = 4 end end mricron-0.20120505.1~dfsg.1.orig/periutils.pas0000664000175000017500000002433411425652656020417 0ustar michaelmichaelunit periutils; interface {$IFDEF FPC} {$H+} {$ENDIF} uses metagraph, define_types, sysutils,nifti_hdr, classes; function FSLMatName (lFeatDir: string): string; function FSLFuncName (lFeatDir: string): string;//Given feat folder returns name of filtered data function FSLReslicedVOIName (lFeatDir, lMNIVOIName: string): string; procedure RegressTrace (var l4DTrace: T4DTrace); function ConvertToTrace (var l4DHdr: TMRIcroHdr;var l4DTrace: T4DTrace; lX,lY,lZ: integer): boolean; function ReadCond (l3ColTextFileName: string; var l4DTrace: T4DTrace; lCond: integer): boolean; procedure FSLEVNames (lFeatDir: string; var lEVlist: TStringList); implementation uses nifti_img_view, text,dialogs,periplot; function ReadCond (l3ColTextFileName: string; var l4DTrace: T4DTrace; lCond: integer): boolean; var lOnsetText: TextFile; lnEvents: integer; lFloat,lFloat2,lFloat3: single; begin result := false; if (lCond < 1) or (lCond > kMaxCond) then exit; CloseCond(l4DTrace,lCond); Filemode := 0; assignfile(lOnsetText,l3ColTextFileName); {I-} reset(lOnsetText); {$I+} if ioresult <> 0 then begin Showmessage('Unable to read file [may be in use by another program '+ l3ColTextFileName); exit; end; lnEvents := 0; while not EOF(lOnsetText) do begin {$I-} read(lOnsetText,lFloat,lFloat2,lFloat3); //read triplets instead of readln: this should load UNIX files {$I+} if (ioresult = 0) and (lFloat3 > 0) then inc(lnEvents); end; if lnEvents < 1 then begin closefile(lOnsetText); showmessage('No events detected. Is this really a FSL-style 3 Column format file? '+l3ColTextFileName); exit; end; InitCond (l4DTrace, lCond, lnEvents); reset(lOnsetText); lnEvents := 0; while not EOF(lOnsetText) do begin lFloat := 0; {$I-} read(lOnsetText,lFloat,lFloat2,lFloat3); //read triplets instead of readln: this should load UNIX files {$I+} if (ioresult = 0) and (lFloat3 > 0) then begin inc(lnEvents); l4DTrace.Conditions[lCond].EventRA^[lnEvents] := lFloat; l4DTrace.Conditions[lCond].DurRA^[lnEvents] := lFloat2; //l4DTrace.DurRA[lCond]^[lnEvents] := lFloat2; end; end; closefile(lOnsetText); l4DTrace.Conditions[lCond].ELabel := parsefilename(extractfilename(l3ColTextFileName)); result := true; end; function ConvertToTrace (var l4DHdr: TMRIcroHdr;var l4DTrace: T4DTrace; lX,lY,lZ: integer): boolean; var lVol,lVolSz,lPos,lSamples,lLine,lnLines,lROI: integer; l16Buf : SmallIntP; l32Buf : SingleP; begin result := false; lSamples := l4DHdr.NIFTIhdr.dim[4]; lVolSz := l4DHdr.NIFTIhdr.dim[1]*l4DHdr.NIFTIhdr.dim[2]*l4DHdr.NIFTIhdr.dim[3]; if lSamples < 2 then exit; lnLines := 0; for lVol := (kBGOverlayNum+1) to knMaxOverlay do if gMRIcroOverlay[lVol].ScrnBufferItems > 0 then //for each ROI inc(lnLines); if lnLines = 0 then begin //no ROIs lLine := 1; lPos := lX + ((lY-1)*gBGImg.ScrnDim[1])+((lZ-1)*gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]); if (lPos > l4DHdr.ImgBufferItems) or (lPos < 1) then exit; Init4DTrace(lSamples, 1,l4DTrace,false); l4DTrace.Lines[1].ELabel := inttostr(lX)+'x'+inttostr(lY)+'x'+inttostr(lZ); if (l4DHdr.ImgBufferBPP = 4) then begin l32Buf := SingleP(l4DHdr.ImgBuffer ); for lVol := 1 to lSamples do begin l4DTrace.Lines[lLine].EventRA[lVol] := l32Buf[lPos]; lPos := lPos + lVolSz; end; end else if (l4DHdr.ImgBufferBPP = 2) then begin l16Buf := SmallIntP(l4DHdr.ImgBuffer ); for lVol := 1 to lSamples do begin l4DTrace.Lines[lLine].EventRA^[lVol] := l16Buf^[lPos]; lPos := lPos + lVolSz; end; end else if l4DHdr.ImgBufferBPP = 1 then begin for lVol := 1 to lSamples do begin l4DTrace.Lines[lLine].EventRA^[lVol] := l4DHdr.ImgBuffer^[lPos]; lPos := lPos + lVolSz; end; end else showmessage('Serious error: unknown data size!'); end else begin //>0 ROIS Init4DTrace(lSamples, lnLines,l4DTrace,false); for lLine := 1 to lnLines do begin lROI := ROIoverlayNum(lLine); l4DTrace.Lines[lLine].ELabel := ParseFileName(extractfilename(gMRIcroOverlay[lROI].HdrFileName)); for lVol := 1 to lSamples do l4DTrace.Lines[lLine].EventRA^[lVol] := ROImean(l4DHdr,lROI,lVol{,lVolSz}); end; end; MinMax4DTrace(l4DTrace); result := true; end; function ComputeRegress (ldataRA: singlep; lndata: integer): string; const //kMax = 1000; kCR = chr (13); Var gx : Array[1..4] of extended; gy : Array[1..4] of extended; Exy : Array[1..4] of extended; Ex : Array[1..4] of extended; Ey : Array[1..4] of extended; Ex2 : Array[1..4] of extended; Ey2 : Array[1..4] of extended; a : Array[1..4] of extended; b : Array[1..4] of extended; r : Array[1..4] of extended; chtX: Array[1..4] of extended; chtY: Array[1..4] of extended; no : Integer; gInter, gSlope,gRSqr : extended; function calcit: string; Var q : Integer; Begin For q := 1 To 4 Do Begin b[q] := (no * Exy[q] - Ex[q] * Ey[q]) / (no * Ex2[q] - (Ex[q]*Ex[q]) ); a[q] := (Ey[q] - b[q] * Ex[q]) / no; r[q] := (no * Exy[q] - Ex[q] * Ey[q]) / (Sqrt((no * Ex2[q] - (Ex[q]*Ex[q]) ) * (no * Ey2[q] - (Ey[q]*Ey[q]) ) )); End; // for a[2] := Exp(a[2]); a[4] := Exp(a[4]); result := (' Linear Y=' + RealToStr(a[1],8) + ' +' + RealToStr(b[1],8) + ' * X'+' R=' + RealToStr(r[1],8)+' R^2=' + RealToStr(r[1]*r[1],8)); gInter := a[1]; gSlope := b[1]; gRSqr := r[1]; result := result + (', Exp Y=' + RealToStr(a[2],8) + ' * e ^' + RealToStr(b[2],8) + ' * X'+' R=' + RealToStr(r[2],8)+' R^2=' + RealToStr(r[2]*r[2],8)); result := result + (', Log Y=' + RealToStr(a[3],8) + ' +' + RealToStr(b[3],8) + ' * LOG(X)'+' R=' + RealToStr(r[3],8)+' R^2=' + RealToStr(r[3]*r[3],8)); result := result +(', Power Y=' + RealToStr(a[4],8) + ' * X ^' + RealToStr(b[4],8)+' R=' + RealToStr(r[4],8)+' R^2=' + RealToStr(r[4]*r[4],8)); End; // nested calcit() Procedure inpcalc (lX, lY: extended); Var q : Integer; Begin gx[1] := lX; gy[1] := lY; //inc(gnVal); inc(no); gx[2] := gx[1]; gy[2] := Ln(gy[1]); // exp gx[3] := Ln(gx[1]); gy[3] := gy[1]; // log gx[4] := Ln(gx[1]); gy[4] := Ln(gy[1]); // power For q := 1 To 4 Do Begin Exy[q] := Exy[q] + gx[q] * gy[q]; Ex[q] := Ex[q] + gx[q]; Ey[q] := Ey[q] + gy[q]; Ex2[q] := Ex2[q] + (gx[q]*gx[q]); Ey2[q] := Ey2[q] + (gy[q]*gy[q]); End; // For End; //nested inpcalc procedure initReg; var lC: byte; begin for lC := 1 to 4 do begin gx [lC]:= 0; gy [lC]:= 0; Exy [lC]:= 0; Ex[lC]:= 0; Ey[lC]:= 0; Ex2[lC]:= 0; Ey2[lC]:= 0; a[lC]:= 0; b[lC]:= 0; r[lC]:= 0; chtX[lC]:= 0; chtY[lC]:= 0; end; //for lC end;//nested inp calc const kDeleteVols = 3; var i: integer; begin //computeRegress result := ''; no := 0; if lndata < (kDeleteVols+5) then exit; //gnVal := 0; initReg; for i := kDeleteVols to lndata do begin //fx(i,ldatara[i]); inpcalc (i, ldataRA^[i]); end; result := calcit; end; //func ComputeRegress procedure RegressTrace (var l4DTrace: T4DTrace); var lStr: string; lE,lCond, lnCond,lnE: integer; lMean : double; ldataRA: singlep; begin lncond := 0; for lCond := 1 to kMaxCond do if l4DTrace.Lines[lCond].Events > 0 then inc(lnCond); if lncond = 0 then exit; for lCond := 1 to kMaxCond do begin if l4DTrace.Lines[lCond].Events > 0 then begin lnE := l4DTrace.Lines[lCond].Events; getmem(ldataRA,lnE * sizeof(single)); lStr := gMRIcroOverlay[kBGOverlayNum].HdrFileName+','+l4DTrace.Lines[lCond].ELabel; //load data lMean := 0; for lE := 1 to lnE do begin ldataRA[lE] := l4DTrace.Lines[lCond].EventRA[lE]; lMean := ldataRA^[lE] + lMean; //sum end; lMean := lMean / lnE; //fx(lMean); //normalize data... for lE := 1 to lnE do ldataRA^[lE] := ldataRA^[lE]/lMean; //compute functions lStr := lStr +kTextSep+ (ComputeRegress (ldataRA, lnE) ); TextForm.MemoT.lines.add(lStr); //TextForm.Memo1.lines.add(lStr); freemem(ldataRA); end; end; //TextForm.show; end; //NEXT SECTION - FSL UTILITIES procedure FSLEVNames (lFeatDir: string; var lEVlist: TStringList); //Given feat folder returns name of matrix to reorient MNI image to functional data var lEVdir : string; lSearchRec: TSearchRec; begin lEVList.clear; lEVdir := lFEATDir+pathdelim+'custom_timing_files'; //showmessage(lEVdir); if not DirExists(lEVdir) then exit; //showmessage(lEVdir); if FindFirst(lEVdir+pathdelim+'*'+'.txt', faAnyFile, lSearchRec) = 0 then begin repeat lEVlist.Add(lEVdir+pathdelim+lSearchRec.Name) until (FindNext(lSearchRec) <> 0); end; FindClose(lSearchRec); //fx(lEVlist.count); //result := lFeatDir+PathDelim+'reg'+PathDelim+'example_func2standard.mat'; end; //MatName function FSLMatName (lFeatDir: string): string; //Given feat folder returns name of matrix to reorient MNI image to functional data begin result := lFeatDir+PathDelim+'reg'+PathDelim+'example_func2standard.mat'; end; //MatName function FSLFuncName (lFeatDir: string): string;//Given feat folder returns name of filtered data begin result := lFeatDir+PathDelim+'filtered_func_data.nii.gz'; end; //FuncName function FSLReslicedVOIName (lFeatDir, lMNIVOIName: string): string; //Given FSL .feat folder name and source MNI volume name retuns resliced VOI name begin result := lFeatDir+PathDelim+extractfilename(lMNIVOIName); (*result := extractfilename(lMNIVOIName); result := lFeatDir+PathDelim+ChangeFileExtX(result,'.nii.gz'); //; *) end; //ReslicedVOIName end. mricron-0.20120505.1~dfsg.1.orig/perisettings.pas0000664000175000017500000000465511450366456021121 0ustar michaelmichaelunit perisettings; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Spin, StdCtrls, define_types; type { TPSForm } TPSForm = class(TForm) BinWidthEdit: TFloatSpinEdit; OKBtn: TButton; SavePSVolCheck: TCheckBox; PctSignalCheck: TCheckBox; ModelCheck: TCheckBox; RegressCheck: TCheckBox; TDCheck: TCheckBox; SliceTImeCheck: TCheckBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; PreBinEdit: TSpinEdit; PostBinEdit: TSpinEdit; procedure FormShow(Sender: TObject); function GetPeriSettings(var lPSPlot: TPSPlot): boolean; procedure OKBtnClick(Sender: TObject); procedure RegressCheckClick(Sender: TObject); private { private declarations } public { public declarations } end; var PSForm: TPSForm; implementation uses nifti_img_view; function TPSForm.GetPeriSettings(var lPSPlot: TPSPlot): boolean; begin result := false; if lPSPlot.TRSec <= 0 then begin showmessage('Please specify the TR (in seconds) before creating a peristimulus plot.'); exit; end; if BinWidthEdit.value = 0 then BinWidthEdit.value := lPSPlot.TRsec; PSForm.ShowModal; if BinWidthEdit.value = 0 then BinWidthEdit.value := lPSPlot.TRsec else lPSPlot.BinWidthSec := BinWidthEdit.Value; lPSPlot.nNegBins := PreBinEdit.value; lPSPlot.nPosBins := PostBinEdit.value; lPSPlot.SliceTime := SliceTimeCheck.checked; lPSPlot.SavePSVol := SavePSVolCheck.checked; lPSPlot.BaselineCorrect := ModelCheck.checked; lPSPlot.PctSignal := PctSignalCheck.checked; lPSPlot.RemoveRegressorVariability := RegressCheck.checked; lPSPlot.TemporalDeriv := TDcheck.checked; lPSPlot.PlotModel := ModelCheck.checked; lPSPlot.SPMDefaultsStatsFmriT := gBGImg.SPMDefaultsStatsFmriT; lPSPlot.SPMDefaultsStatsFmriT0 := gBGImg.SPMDefaultsStatsFmriT0; result := true; end; procedure TPSForm.FormShow(Sender: TObject); begin RegressCheckClick(nil); end; procedure TPSForm.OKBtnClick(Sender: TObject); begin end; procedure TPSForm.RegressCheckClick(Sender: TObject); begin TDCheck.visible := RegressCheck.checked; ModelCheck.Visible := RegressCheck.checked; end; initialization {$I perisettings.lrs} end. mricron-0.20120505.1~dfsg.1.orig/perisettings.lrs0000664000175000017500000000571411450366456021133 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TPSForm','FORMDATA',[ 'TPF0'#7'TPSForm'#6'PSForm'#4'Left'#3'"'#4#6'Height'#3#142#1#3'Top'#3#164#1#5 +'Width'#3'r'#1#18'HorzScrollBar.Page'#3'q'#1#18'VertScrollBar.Page'#3#162#1 +#13'ActiveControl'#7#12'BinWidthEdit'#7'Caption'#6#17'Peristimulus Plot'#12 +'ClientHeight'#3#142#1#11'ClientWidth'#3'r'#1#21'Constraints.MaxHeight'#3#142 +#1#20'Constraints.MaxWidth'#3'r'#1#21'Constraints.MinHeight'#3#142#1#20'Cons' +'traints.MinWidth'#3'r'#1#6'OnShow'#7#8'FormShow'#8'Position'#7#14'poScreenC' +'enter'#10'LCLVersion'#6#6'0.9.29'#0#6'TLabel'#6'Label1'#4'Left'#2'('#6'Heig' +'ht'#2#14#3'Top'#2#25#5'Width'#2'G'#7'Caption'#6#15'Bin width (sec)'#11'Pare' +'ntColor'#8#0#0#6'TLabel'#6'Label2'#4'Left'#2'('#6'Height'#2#14#3'Top'#2'>'#5 +'Width'#3#134#0#7'Caption'#6#27'Number of pre-stimulus bins'#11'ParentColor' +#8#0#0#6'TLabel'#6'Label3'#4'Left'#2'('#6'Height'#2#14#3'Top'#2'e'#5'Width'#3 +#139#0#7'Caption'#6#28'Number of post-stimulus bins'#11'ParentColor'#8#0#0#14 +'TFloatSpinEdit'#12'BinWidthEdit'#4'Left'#3#232#0#6'Height'#2#21#3'Top'#2#16 +#5'Width'#3#130#0#13'DecimalPlaces'#2#4#9'Increment'#5#0#0#0#0#0#0#0#128#255 +'?'#8'MaxValue'#5#0#0#0#0#0#0#0#200#5'@'#8'MinValue'#5#0#0#0#0#0#0#0#0#0#0#8 +'TabOrder'#2#0#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#9'TSpinEdit'#10'PreBinEdit' +#4'Left'#3#232#0#6'Height'#2#21#3'Top'#2'5'#5'Width'#3#130#0#8'MinValue'#2#1 +#8'TabOrder'#2#1#5'Value'#2#4#0#0#9'TSpinEdit'#11'PostBinEdit'#4'Left'#3#232 +#0#6'Height'#2#21#3'Top'#2'\'#5'Width'#3#130#0#8'MinValue'#2#1#8'TabOrder'#2 +#2#5'Value'#2#14#0#0#9'TCheckBox'#14'SliceTImeCheck'#4'Left'#2'('#6'Height'#2 +#17#3'Top'#3#132#0#5'Width'#3#139#0#7'Caption'#6#25'Data slice-time correcte' +'d'#8'TabOrder'#2#3#0#0#9'TCheckBox'#14'SavePSVolCheck'#4'Left'#2'('#6'Heigh' +'t'#2#17#3'Top'#3#164#0#5'Width'#3#145#0#7'Caption'#6#25'Save peristimulus v' +'olumes'#8'TabOrder'#2#4#0#0#7'TButton'#5'OKBtn'#4'Left'#3#24#1#6'Height'#2 +#25#3'Top'#3'h'#1#5'Width'#2'K'#25'BorderSpacing.InnerBorder'#2#4#7'Caption' +#6#2'OK'#11'ModalResult'#2#1#8'TabOrder'#2#5#0#0#9'TCheckBox'#14'PctSignalCh' +'eck'#4'Left'#2'('#6'Height'#2#17#3'Top'#3#200#0#5'Width'#2'>'#7'Caption'#6#8 +'% Signal'#7'Checked'#9#5'State'#7#9'cbChecked'#8'TabOrder'#2#6#0#0#9'TCheck' +'Box'#10'ModelCheck'#4'Left'#2'P'#6'Height'#2#17#3'Top'#3'@'#1#5'Width'#3#192 +#0#7'Caption'#6'!Report modeled, not observed data'#8'TabOrder'#2#7#7'Visibl' +'e'#8#0#0#9'TCheckBox'#12'RegressCheck'#4'Left'#2'('#6'Height'#2#17#3'Top'#3 +#240#0#5'Width'#2't'#7'Caption'#6#17'Remove Regressors'#7'Checked'#9#7'OnCli' +'ck'#7#17'RegressCheckClick'#5'State'#7#9'cbChecked'#8'TabOrder'#2#8#0#0#9'T' +'CheckBox'#7'TDCheck'#4'Left'#2'P'#6'Height'#2#17#3'Top'#3#24#1#5'Width'#3 +#181#0#7'Caption'#6#31'Also Remove Temporal Derivative'#7'Checked'#9#5'State' +#7#9'cbChecked'#8'TabOrder'#2#9#7'Visible'#8#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/perisettings.lfm0000664000175000017500000000543311450366456021107 0ustar michaelmichaelobject PSForm: TPSForm Left = 1058 Height = 398 Top = 420 Width = 370 HorzScrollBar.Page = 369 VertScrollBar.Page = 418 ActiveControl = BinWidthEdit Caption = 'Peristimulus Plot' ClientHeight = 398 ClientWidth = 370 Constraints.MaxHeight = 398 Constraints.MaxWidth = 370 Constraints.MinHeight = 398 Constraints.MinWidth = 370 OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object Label1: TLabel Left = 40 Height = 14 Top = 25 Width = 71 Caption = 'Bin width (sec)' ParentColor = False end object Label2: TLabel Left = 40 Height = 14 Top = 62 Width = 134 Caption = 'Number of pre-stimulus bins' ParentColor = False end object Label3: TLabel Left = 40 Height = 14 Top = 101 Width = 139 Caption = 'Number of post-stimulus bins' ParentColor = False end object BinWidthEdit: TFloatSpinEdit Left = 232 Height = 21 Top = 16 Width = 130 DecimalPlaces = 4 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 0 Value = 0 end object PreBinEdit: TSpinEdit Left = 232 Height = 21 Top = 53 Width = 130 MinValue = 1 TabOrder = 1 Value = 4 end object PostBinEdit: TSpinEdit Left = 232 Height = 21 Top = 92 Width = 130 MinValue = 1 TabOrder = 2 Value = 14 end object SliceTImeCheck: TCheckBox Left = 40 Height = 17 Top = 132 Width = 139 Caption = 'Data slice-time corrected' TabOrder = 3 end object SavePSVolCheck: TCheckBox Left = 40 Height = 17 Top = 164 Width = 145 Caption = 'Save peristimulus volumes' TabOrder = 4 end object OKBtn: TButton Left = 280 Height = 25 Top = 360 Width = 75 BorderSpacing.InnerBorder = 4 Caption = 'OK' ModalResult = 1 TabOrder = 5 end object PctSignalCheck: TCheckBox Left = 40 Height = 17 Top = 200 Width = 62 Caption = '% Signal' Checked = True State = cbChecked TabOrder = 6 end object ModelCheck: TCheckBox Left = 80 Height = 17 Top = 320 Width = 192 Caption = 'Report modeled, not observed data' TabOrder = 7 Visible = False end object RegressCheck: TCheckBox Left = 40 Height = 17 Top = 240 Width = 116 Caption = 'Remove Regressors' Checked = True OnClick = RegressCheckClick State = cbChecked TabOrder = 8 end object TDCheck: TCheckBox Left = 80 Height = 17 Top = 280 Width = 181 Caption = 'Also Remove Temporal Derivative' Checked = True State = cbChecked TabOrder = 9 Visible = False end end mricron-0.20120505.1~dfsg.1.orig/periplot.pas0000664000175000017500000007107711425653322020232 0ustar michaelmichaelunit periplot; //peristimulus plotting routines interface uses nifti_hdr,define_types,metagraph,sysutils; function CreatePeristimulusPlot (var l4DHdr: TMRIcroHdr; var l4DTrace: T4DTrace; var lPSPlot: TPSPlot): boolean; function ROIoverlayNameShort(lROI: integer): string; function numROI: integer; function ROIoverlayNum(lROI: integer): integer; function NCond ( var l4DTrace: T4DTrace): integer; function ROImean (var l4DHdr: TMRIcroHdr; lROInum,lVol: integer): double; implementation {$IFNDEF FPC} {$DEFINE REMOVEREGRESS} {$ENDIF} uses nifti_img_view,dialogs,nifti_img,text,graphx,math {$IFDEF REMOVEREGRESS},fmath, hrf, matrices,Regmult{$ENDIF}; //need to specify path, e.g. C:\pas\mricron\npm\math //var gOffsetError: array [1..kMaxCond] of double; function numROI: integer; var lR: integer; begin result := 0; for lR := (kBGOverlayNum+1) to knMaxOverlay do if gMRIcroOverlay[lR].ScrnBufferItems > 0 then inc(result); end; function ROIoverlayNum(lROI: integer): integer; var lR,lN: integer; begin result := 0; lN := 0; for lR := (kBGOverlayNum+1) to knMaxOverlay do begin //fx(lR,gMRIcroOverlay[lR].ScrnBufferItems); if gMRIcroOverlay[lR].ScrnBufferItems > 0 then begin inc(lN); if lROI = lN then begin result := lR; exit; end; end; //if ROI has items end; end; function ROIoverlayNameShort(lROI: integer): string; begin if ROIoverlayNum(lROI) = 0 then {$IFDEF FPC} result := inttostr(ImgForm.XViewEdit.value)+'x'+inttostr(ImgForm.YViewEdit.value)+'x'+inttostr(ImgForm.ZViewEdit.value) {$ELSE} result := inttostr(ImgForm.XViewEdit.asinteger)+'x'+inttostr(ImgForm.YViewEdit.asinteger)+'x'+inttostr(ImgForm.ZViewEdit.asinteger) {$ENDIF} else result := parsefilename(extractfilename(gMRIcroOverlay[ROIoverlayNum(lROI)].HdrFileName)); end; function StDev (lSum, lSumSqr: single; lN: integer): single; begin result := 0; if lN < 2 then exit; //avoid divide by zero. We divide by N-1 result:= (lSumSqr - ((Sqr(lSum))/lN)); if (result > 0) then result := Sqrt ( result/(lN-1)) end; function ROIoverlayNameLong(lROI: integer): string; begin if ROIoverlayNum(lROI) = 0 then {$IFDEF FPC} result := inttostr(ImgForm.XViewEdit.value)+'x'+inttostr(ImgForm.YViewEdit.value)+'x'+inttostr(ImgForm.ZViewEdit.value) {$ELSE} result := inttostr(ImgForm.XViewEdit.asinteger)+'x'+inttostr(ImgForm.YViewEdit.asinteger)+'x'+inttostr(ImgForm.ZViewEdit.asinteger) {$ENDIF} else result := gMRIcroOverlay[ROIoverlayNum(lROI)].HdrFileName; end; function NCond ( var l4DTrace: T4DTrace): integer; var lCond: integer; begin result := 0; for lCond := 1 to kMaxCond do if l4DTrace.Conditions[lCond].Events > 0 then inc(result); end; function StError (lSum, lSumSqr: single; lN: integer): single; //= STANDARD DEVIATION / SQUARE ROOT OF THE POPULATION SIZE //= STDEV(range of values)/SQRT(lN) begin if lN > 1 then result := StDev (lSum, lSumSqr, lN)/ sqrt(lN) else result := 0; end; const kMaxEvents = 2048; procedure TimecourseVoxinten (var l4DHdr: TMRIcroHdr; lVoxel: integer; lTimeCourse: DoubleP); //could also use periutil's VoxInten, but this is faster... var lVol,lVolOffset,lImgVox,lMaxStatVol: integer; l32Buf: singleP; l16Buf: smallintp; begin //if ROI else no ROI - single voxel lImgVox := l4DHdr.NIFTIhdr.dim[1]*l4DHdr.NIFTIhdr.dim[2]*l4DHdr.NIFTIhdr.dim[3]; lMaxStatVol := l4DHdr.NIFTIhdr.dim[4]; if (l4DHdr.ImgBufferBPP = 4) then begin l32Buf := SingleP(l4DHdr.ImgBuffer ); for lVol := 1 to lMaxStatVol do begin lVolOffset := (lVol-1)*lImgVox; lTimeCourse^[lVol] := l32Buf^[lVoxel+lVolOffset] end; end else if l4DHdr.ImgBufferBPP = 2 then begin l16Buf := SmallIntP(l4DHdr.ImgBuffer ); for lVol := 1 to lMaxStatVol do begin lVolOffset := (lVol-1)*lImgVox; lTimeCourse^[lVol] := l16Buf^[lVoxel+lVolOffset] end; end else if l4DHdr.ImgBufferBPP = 1 then begin for lVol := 1 to lMaxStatVol do begin lVolOffset := (lVol-1)*lImgVox; lTimeCourse^[lVol] := l4DHdr.ImgBuffer^[lVoxel+lVolOffset]; end; end; //if 1 bpp end; //GenerateVoxinten function ROImean (var l4DHdr: TMRIcroHdr; lROInum,lVol: integer): double; var l32Buf: singleP; l16Buf: smallintp; lSum: double; lMaskVox: int64; lInc,lVolOffset,lImgVox: integer; begin result := 0; //compute number of voxels in mask lImgVox := l4DHdr.NIFTIhdr.dim[1]*l4DHdr.NIFTIhdr.dim[2]*l4DHdr.NIFTIhdr.dim[3]; lMaskVox := 0; for lInc := 1 to lImgVox do if gMRIcroOverlay[lROInum].ScrnBuffer^[lInc] > 0 then //in mask lMaskVox := lMaskVox + gMRIcroOverlay[lROInum].ScrnBuffer^[lInc]; if lMaskVox < 1 then exit; lSum := 0; lVolOffset := (lVol-1)*lImgVox; if (l4DHdr.ImgBufferBPP = 4) then begin l32Buf := SingleP(l4DHdr.ImgBuffer ); for lInc := 1 to lImgVox do begin if gMRIcroOverlay[lROInum].ScrnBuffer^[lInc] > 0 then begin//in mask lSum := lSum + (gMRIcroOverlay[lROInum].ScrnBuffer^[lInc]*l32Buf^[lInc+lVolOffset]); end; //in mask end; //for each vox end else if (l4DHdr.ImgBufferBPP = 2) then begin l16Buf := SmallIntP(l4DHdr.ImgBuffer ); for lInc := 1 to lImgVox do begin if gMRIcroOverlay[lROInum].ScrnBuffer^[lInc] > 0 then begin//in mask lSum := lSum + (gMRIcroOverlay[lROInum].ScrnBuffer^[lInc]*l16Buf^[lInc+lVolOffset]); end; //in mask end; //for each vox end else if (l4DHdr.ImgBufferBPP = 1) then begin for lInc := 1 to lImgVox do begin if gMRIcroOverlay[lROInum].ScrnBuffer^[lInc] > 0 then begin//in mask lSum := lSum + (gMRIcroOverlay[lROInum].ScrnBuffer^[lInc]*l4DHdr.ImgBuffer^[lInc+lVolOffset]); end; //for each volume end; //for each vox end; //for image type result := lSum/lMaskVox; end; function TimecourseROIinten (var l4DHdr: TMRIcroHdr; lROInum: integer; lTimeCourse: DoubleP): boolean; var lVol,lMaxStatVol: integer; begin lMaxStatVol := l4DHdr.NIFTIhdr.dim[4]; //result := false; for lVol := 1 to lMaxStatVol do lTimeCourse^[lVol] := ROImean (l4DHdr,lROInum,lVol); //compute mean for each volume result := true; end; function ComputeMeanSE (lCountBin: longintp; lMnBin,lSEBin,lSumBin,lSumSqrBin: doublep; lNegBins,lPosBins: integer): boolean; var lBin: integer; begin result := false; (*var lBins,lBin,lnBinsWithSamples: integer; lIntensitySum: double; begin result := false; lIntensitySum := 0; lnBinsWithSamples := 0; lBins := lNegBins; if lBins < 1 then lBins := lNegBins+lPosBins; for lBin := lBins downto 1 do begin //new only base pct on baseline if lCountBin^[lBin] > 0 then begin lIntensitySum := lIntensitySum+lMnBin^[lBin]; inc(lnBinsWithSamples); end; //samples in bin end; //for each bin if lnBinsWithSamples < 1 then exit;*) if (lNegBins + lPosBins) < 1 then exit; for lBin := (lNegBins + lPosBins) downto 1 do lSEBin^[lBin] := StError(lSumBin^[lBin],lSumSqrBin^[lBin],lCountBin^[lBin]); result := true; end; //ifunc ComputeMeanSE {$IFDEF REMOVEREGRESS} {procedure OutCSV (lTimeCourseRaw,lTimeCourseRegress,lTimeCourseFilt: DoubleP; lnVol,lC: integer; lSlope,lInter: double); var lVol: integer; lF: TextFile; lStr: string; begin AssignFile(lF, 'C:\fatigue\td'+inttostr(lC)+'.csv'); Rewrite(lF); lStr := ''; for lVol := 1 to lnVol do lStr := lStr+floattostr(lTimeCourseRaw^[lVol])+','; lStr := lStr + '666'; writeln(lF,lStr); lStr := ''; for lVol := 1 to lnVol do lStr := lStr+floattostr(lTimeCourseRegress^[lVol])+','; lStr := lStr + '666'; writeln(lF,lStr); lStr := ''; for lVol := 1 to lnVol do lStr := lStr+floattostr(lTimeCourseFilt^[lVol])+','; lStr := lStr + '666'; writeln(lF,lStr); writeln(lF,''); writeln(lF,''); writeln(lF,floattostr(lSlope)+','+floattostr(lInter)); CloseFile(lF); end; } function RemoveRegressors(lTimeCourseRaw,lTimeCourseFilt: DoubleP; var l4DTrace: T4DTrace;lCond,lnVol: integer;var lPSPlot: TPSPlot): boolean; var lOK: boolean; lKernelBins,lncond,lC,lVol,lnCondincludeTD: integer; lHRFra, lTDra: doublep; lInputSum,lOutputSum : double; X: PMatrix; Y: PVector; //lDummy,lEstTimeCoursePrecise: DoubleP; lOutT,lOutSlope: DoubleP0; begin result := false; lncond := NCond (l4DTrace); lnCondincludeTD := lnCond; if lPSPlot.TemporalDeriv then lnCondincludeTD := lnCondincludeTD * 2; if (lnCondincludeTD < 2) or (lPSPlot.SPMDefaultsStatsFmriT < 1) then begin Showmessage('You need at least two variables to remove regressors (you could add the temporal derivative)'); exit; end; //cond = 0 if not CreateHRF (lPSPlot.TRsec, lKernelBins,lPSPlot.SPMDefaultsStatsFmriT, lHRFra, lTDra) then exit; //getmem(lTimeCourseRegress,lnVol*sizeof(double)); for lVol := 1 to lnVol do lTimeCourseFilt^[lVol] := lTimeCourseRaw^[lVol]; //compute sum intensity so we can adjust for shifts in the mean... lInputSum := 0; for lVol := 1 to lnVol do lInputSum := lInputSum+lTimeCourseRaw^[lVol]; //convolve each condition... DimMatrix(X, lnCondincludeTD, lnVol); //lDummy := nil; //Getmem(lEstTimeCoursePrecise, lnVol *lPSPlot.SPMDefaultsStatsFmriT * sizeof(double)); for lC := 1 to lnCond do begin (*if lC = lCond then ConvolveTimeCourse(X, lHRFra, lEstTimeCoursePrecise,l4DTrace, lC,lC,lnVol,lKernelBins,lPSPlot.SPMDefaultsStatsFmriT,lPSPlot.SPMDefaultsStatsFmriT0,lPSPlot.TRSec, lPSPlot.SliceTime) else*) ConvolveTimeCourse(X, lHRFra, l4DTrace, lC,lC,lnVol,lKernelBins,lPSPlot.SPMDefaultsStatsFmriT,lPSPlot.SPMDefaultsStatsFmriT0,lPSPlot.TRSec, lPSPlot.SliceTime); end; //convolve temporal derivatives for each condition if lPSPlot.TemporalDeriv then for lC := 1 to lnCond do ConvolveTimeCourse(X, lTDra, l4DTrace, lC,lC+lnCond,lnVol,lKernelBins,lPSPlot.SPMDefaultsStatsFmriT,lPSPlot.SPMDefaultsStatsFmriT0,lPSPlot.TRSec, lPSPlot.SliceTime); freemem(lHRFra); freemem(lTDra); DimVector(Y, lnVol); for lVol := 1 to lnVol do Y^[lVol] := lTimeCourseRaw^[lVol]; getmem(lOutT, (lnCondincludeTD+1)* sizeof(double)); getmem(lOutSlope, (lnCondincludeTD+1)* sizeof(double)); lOK := MultipleRegressionVec (lnVol,lnCondincludeTD, X, Y, lOutT,lOutSlope); freemem(lOutT); DelVector(Y, lnVol); //begin test - show responses... if lPSPlot.PlotModel then begin lC := lCond; //response for condition //if lTemporalDeriv then lC := lCond + lnCond; //lCond + lnCond = TD //if lPSPlot.TemporalDeriv then fx( lC,lOutSlope^[lC-1],lOutSlope^[lnCond+lC-1] ); for lVol := 1 to lnVol do lTimeCourseFilt^[lVol] := (X^[lC]^[lVol] *lOutSlope[lC-1]); end else begin //not test if lOK then begin for lC := 1 to lnCondincludeTD do begin if lC <> lCond then begin for lVol := 1 to lnVol do lTimeCourseFilt^[lVol] := lTimeCourseFilt^[lVol]- (X^[lC]^[lVol] *lOutSlope[lC-1]); end; //for each regressor end; //for lC result := true;//SUCCESS! //next - search for optimal fit of model to data.. //if (lPSPlot.TextOutput) and (lCond > 0) and (lCond <= kMaxCond) then // gOffsetError[lCond] := (OptimalOffset(lOutSlope^[lCond-1],lOutSlope^[lnCondincludeTD], lPSPlot.SPMDefaultsStatsFmriT0,lPSPlot.SPMDefaultsStatsFmriT,lnVol, lTimeCourseFilt,lEstTimeCoursePrecise)/ lPSPlot.SPMDefaultsStatsFmriT ) * lPSPlot.TRsec; end;//lOK end; //Freemem(lEstTimeCoursePrecise); DelMatrix(X, lnCondincludeTD, lnVol); //adjust for shifts in the mean... lOutputSum := 0; for lVol := 1 to lnVol do lOutputSum := lOutputSum+lTimeCourseFilt^[lVol]; if lOutputSum <> lInputsum then begin lOutputSum := (lOutputSum - lInputSum)/lnVol; for lVol := 1 to lnVol do lTimeCourseFilt^[lVol] := lTimeCourseFilt^[lVol] - lOutputSum; end; //correct for changes... freemem(lOutSlope); end; {$ENDIF} //IFDEF REMOVEREGRESS //old TimeCourseToPSPlot - each event can contribute to several samples e.g. both before and after stimulus (*function TimeCourseToPSPlot(lTimeCourse: DoubleP; var l4DTrace: T4DTrace; lCountBin: longintp; lMnBin,lSumBin,lSumSqrBin: doublep; var lTRsec,lBinWidthSec: single; lCond,lnNegBins,lnPosBins,lMaxStatVol: integer; lSliceTime: boolean): boolean; var lOnsetRAx: doublep; lEvent,lnEvent,lBin,lVol: integer; lNegMS,lPosMS,lVolTime,lTRms,lHalfTRms,lPeristimulusTime,lmsPerBin: double; begin result := false; if l4DTrace.Conditions[lCond].Events < 1 then exit; lmsPerBin := lBinWidthSec * 1000; lTRms := lTRsec * 1000; if lTRms = 0 then begin Showmessage('Unable to compute plots: You need to specify the TR in seconds.'); exit; end; lHalfTRms := lTRms/2; lNegMS := -lnNegBins * lmsPerBin; lPosMS := lnPosBins * lmsPerBin; lnEvent := l4DTrace.Conditions[lCond].Events; getmem(lOnsetRAx,lnEvent*sizeof(double) ); if lSliceTime then begin for lEvent := 1 to lnEvent do begin lOnsetRAx^[lEvent] := (l4DTrace.Conditions[lCond].EventRA^[lEvent]*1000)-lHalfTRms; end; end else for lEvent := 1 to lnEvent do lOnsetRAx^[lEvent] := (l4DTrace.Conditions[lCond].EventRA^[lEvent]*1000); //initialize bins for lBin := 1 to (lnNegBins + lnPosBins) do begin lMnBin^[lBin] := 0; lSumBin^[lBin] := 0; lSumSqrBin^[lBin] := 0; lCountBin^[lBin] := 0; //no samples in each cell end; for lVol := 1 to lMaxStatVol do begin lVolTime := (lVol-1) * lTRms; for lEvent := 1 to l4DTrace.Conditions[lCond].Events do begin lPeristimulusTime := lVolTime-lOnsetRAx^[lEvent]; if (lPeristimulusTime >= lNegMS) and (lPeristimulusTime < lPosMS) then begin lBin := trunc((lPeristimulusTime - lNegMS) / lmsPerBin)+1; inc(lCountBin^[lBin]); lSumBin^[lBin] := lSumBin^[lBin] + lTimeCourse^[lVol]; lSumSqrBin^[lBin] := lSumSqrBin^[lBin] + sqr(lTimeCourse^[lVol]); end; //if lPeristimulusTime within mix/max temporal window end; //for each event end; //for each vol //next compute mean for lBin := 1 to (lnNegBins + lnPosBins) do if lCountBin^[lBin] > 0 then lMnBin^[lBin] := lSumBin^[lBin]/lCountBin^[lBin]; freemem(lOnsetRAx); result := true; end;//func TimeCourseToPS *) function TimeCourseToPSPlot(lTimeCourse: DoubleP; var l4DTrace: T4DTrace; lCountBin: longintp; lMnBin,lSumBin,lSumSqrBin: doublep; var lPSPlot: TPSPlot; lCond,lMaxStatVol: integer): boolean; var lOnsetRAx: doublep; lEvent,lnEvent,lBin,lVol: integer; lNextEvent,lPrevEvent,lNegMS,lPosMS,lVolTime,lTRms,lHalfTRms,lPeristimulusTime,lmsPerBin: double; begin result := false; if (l4DTrace.Conditions[lCond].Events < 1) or ((lPSPlot.nNegBins + lPSPlot.nPosBins)<1) then exit; lmsPerBin := lPSPlot.BinWidthSec * 1000; lTRms := lPSPlot.TRsec * 1000; if lTRms = 0 then begin Showmessage('Unable to compute plots: You need to specify the TR in seconds.'); exit; end; lHalfTRms := lTRms/2; lNegMS := -lPSPlot.nNegBins * lmsPerBin; lPosMS := lPSPlot.nPosBins * lmsPerBin; lnEvent := l4DTrace.Conditions[lCond].Events; getmem(lOnsetRAx,lnEvent*sizeof(double) ); if lPSPlot.SliceTime then begin for lEvent := 1 to lnEvent do begin lOnsetRAx^[lEvent] := (l4DTrace.Conditions[lCond].EventRA^[lEvent]*1000)-lHalfTRms; end; end else for lEvent := 1 to lnEvent do lOnsetRAx^[lEvent] := (l4DTrace.Conditions[lCond].EventRA^[lEvent]*1000); //initialize bins for lBin := 1 to (lPSPlot.nNegBins + lPSPlot.nPosBins) do begin lMnBin^[lBin] := 0; lSumBin^[lBin] := 0; lSumSqrBin^[lBin] := 0; lCountBin^[lBin] := 0; //no samples in each cell end; //find volume's peristimulus time //note: we assume periutil's ReadCond ensures that Cond.Events are sorted in ascending order lEvent := 1; lPrevEvent := -MaxInt; lNextEvent := lOnsetRAx^[lEvent]; for lVol := 1 to lMaxStatVol do begin lVolTime := (lVol-1) * lTRms; while lVolTime > lNextEvent do begin inc(lEvent); lPrevEvent := lNextEvent; if lEvent > lnEvent then lNextEvent := MaxInt else lNextEvent := lOnsetRAx^[lEvent]; end; lPeristimulusTime := lVolTime-lPrevEvent; if (lPeristimulusTime >= 0) and (lPeristimulusTime < lPosMS) then begin lBin := trunc((lPeristimulusTime - lNegMS) / lmsPerBin)+1; inc(lCountBin^[lBin]); lSumBin^[lBin] := lSumBin^[lBin] + lTimeCourse^[lVol]; lSumSqrBin^[lBin] := lSumSqrBin^[lBin] + sqr(lTimeCourse^[lVol]); end else begin //if not after - check if before lPeristimulusTime := lVolTime-lNextEvent; if (lPeristimulusTime >= lNegMS) and (lPeristimulusTime < 0) then begin lBin := trunc((lPeristimulusTime - lNegMS) / lmsPerBin)+1; inc(lCountBin^[lBin]); lSumBin^[lBin] := lSumBin^[lBin] + lTimeCourse^[lVol]; lSumSqrBin^[lBin] := lSumSqrBin^[lBin] + sqr(lTimeCourse^[lVol]); end; //if lPeristimulusTime within mix/max temporal window end; //if else... not after stimuli (*for lEvent := 1 to l4DTrace.Conditions[lCond].Events do begin lPeristimulusTime := lVolTime-lOnsetRAx^[lEvent]; if (lPeristimulusTime >= lNegMS) and (lPeristimulusTime < lPosMS) then begin lBin := trunc((lPeristimulusTime - lNegMS) / lmsPerBin)+1; inc(lCountBin^[lBin]); lSumBin^[lBin] := lSumBin^[lBin] + lTimeCourse^[lVol]; lSumSqrBin^[lBin] := lSumSqrBin^[lBin] + sqr(lTimeCourse^[lVol]); end; //if lPeristimulusTime within mix/max temporal window end; //for each event*) end; //for each vol //next compute mean for lBin := 1 to (lPSPlot.nNegBins + lPSPlot.nPosBins) do if lCountBin^[lBin] > 0 then lMnBin^[lBin] := lSumBin^[lBin]/lCountBin^[lBin]; freemem(lOnsetRAx); result := true; end;//func TimeCourseToPS function TextOutput (lROI,lCond: integer; var lPSPlot : TPSPlot; var l4DTrace: T4DTrace; lCountBin: longintp; lMnROI,lSEROI: doublep): boolean; var lOutMnStr,lOutSDStr,lCondStr, lOutStr,lModelStr: string; lNegMS,lmsPerBin: double; lnBins,lBin,lMinBinCount,lMaxBinCount: integer; begin result := false; lnBins := lPSPlot.nNegBins + lPSPlot.nPosBins; if lnBins < 1 then exit; lmsPerBin := lPSPlot.BinWidthSec * 1000; lNegMS := -lPSPlot.nNegBins * lmsPerBin; lMinBinCount := lCountBin^[1]; lMaxBinCount := lCountBin^[1]; for lBin := 1 to lnBins do begin if lCountBin^[lBin] < lMinBinCount then lMinBinCount := lCountBin^[lBin]; if lCountBin^[lBin] > lMaxBinCount then lMaxBinCount := lCountBin^[lBin]; end; lModelStr := ', Processing=,'; if lPSPlot.RemoveRegressorVariability then begin if lPSPlot.PlotModel then lModelStr := lModelStr+'MODEL[hrf' else lModelStr := lModelStr+'observed[hrf'; if lPSPlot.TemporalDeriv then lModelStr := lModelStr+'+TD'; lModelStr := lModelStr+']'; //if (lCond > 0) and (lCond <= kMaxCond) then lModelStr := lModelStr+ floattostr(gOffsetError[lCond]); end else lModelStr := lModelStr+'observed[raw]'; lModelStr := lModelStr+kTextSep; lCondStr := 'Image=,'+gMRIcroOverlay[kBGOverlayNum].HdrFileName+', '+inttostr(lCond)+',Condition=,'+l4DTrace.Conditions[lCond].ELabel+lModelStr+'Events=, '+inttostr(l4DTrace.Conditions[lCond].Events)+', samples per bin= '+inttostr(lMinBinCount)+'..'+inttostr(lMaxBinCount); lOutStr := kTextSep; for lBin := 1 to 11 do lOutStr := lOutStr+kTextSep; lOutStr := lOutStr+'Bin Starts At->'; for lBin := 1 to lnBins do lOutStr := lOutStr+kTextSep+ RealToStr((lNegMS+ ((lBin-1)* lmsPerBin)),0 ); TextForm.MemoT.lines.add(lOutStr); TextForm.MemoT.Lines.add('samples per bin '+inttostr(lMinBinCount)+'..'+inttostr(lMaxBinCount)); //next report number of samples averaged lOutStr := lCondStr+kTextSep+kTextSep+kTextSep+'samples in bin='; for lBin := 1 to lnBins do lOutStr := lOutStr+kTextSep+ inttostr(lCountBin^[lBin] ); TextForm.MemoT.lines.add(lOutStr); //next report mean signal lOutMnStr := lCondStr+kTextSep+'roiMn'+kTextSep+'MaskROI['+ROIoverlayNameShort(lROI)+']='+kTextSep+ROIoverlayNameLong(lROI); lOutSDStr := lCondStr+kTextSep+'roiSE'+kTextSep+'MaskROI['+ROIoverlayNameShort(lROI)+']='+kTextSep+ROIoverlayNameLong(lROI); for lBin := 1 to (lnBins) do begin lOutMnStr := lOutMnStr+kTextSep+ floattostr(lMnROI^[lBin]);//floattostr(lSumROI[lROI,lBin]/lBinCountRA[lBin]); lOutSDStr := lOutSDStr+kTextSep+ floattostr(lSEROI^[lBin]);//StDev(lSumROI[lROI,lBin],lSumSqrROI[lROI,lBin],lBinCountRA[lBin]) ); end; //for each bin TextForm.MemoT.lines.add(lOutMnStr); TextForm.MemoT.lines.add(lOutSDStr); result := true; end; //proc TextOutput function CalcMean (lTimeCourse: DoubleP;lnVol: integer): double; var lSum: double; lVol: integer; begin result := 0; if lnVol < 1 then exit; lSum := 0; for lVol := 1 to lnVol do lSum := lSum + lTimeCourse^[lVol]; //Sum result := lSum / lnVol; end; procedure PctSignal (lTimeCourse: DoubleP;lnVol: integer); var lMean,lScale: double; lVol: integer; begin if lnVol < 1 then exit; lMean := CalcMean (lTimeCourse,lnVol); if lMean = 0 then exit; //can't compute % signal change... lScale := abs(1/lMean); for lVol := 1 to lnVol do lTimeCourse^[lVol] := (lTimeCourse^[lVol]-lMean)*lScale; //Sum end; function CreatePeristimulusPlot (var l4DHdr: TMRIcroHdr; var l4DTrace: T4DTrace; var lPSPlot: TPSplot): boolean; var lBinData: T4DTrace; lTimeCourse,lTimeCourseFilt: doublep; lCountBin: longintp; lMnBin,lSEBin,lSumBin,lSumSqrBin: doublep; lCond,lncond,lnVol,lnROI,lROI,lnROImin1,lLine,lBin: integer; lTR: double; begin result := false; lncond := NCond (l4DTrace); if lncond = 0 then begin Showmessage('You need to specify event onset times before creating a peristimulus plot.'); exit; end; //cond = 0 lnVol := l4DHdr.NIFTIhdr.dim[4]; if lnVol < 3 then begin Showmessage('Unable to compute plots: You need to analyze a 4D image.'); exit; end; if (l4DHdr.ImgBufferItems = 0) then exit; lTR := lPSPlot.TRsec * 1000; if lTR = 0 then begin Showmessage('Unable to compute plots: You need to specify the TR in seconds.'); exit; end; lnROI := 0; for lROI := (kBGOverlayNum+1) to knMaxOverlay do if gMRIcroOverlay[lROI].ScrnBufferItems > 0 then //current implementation only one ROI inc(lnROI); if lnROI < 1 then begin lnROImin1 := 1; end else begin lnROImin1 := lnROI; end; //allocate memory getmem(lTimeCourse,lnVol*sizeof(double)); getmem(lTimeCourseFilt,lnVol*sizeof(double)); getmem(lCountBin,(lPSPlot.nNegBins+lPSPlot.nPosBins)*sizeof(integer)); getmem(lMnBin,(lPSPlot.nNegBins+lPSPlot.nPosBins)*sizeof(double)); getmem(lSEBin,(lPSPlot.nNegBins+lPSPlot.nPosBins)*sizeof(double)); getmem(lSumSqrBin,(lPSPlot.nNegBins+lPSPlot.nPosBins)*sizeof(double)); getmem(lSumBin,(lPSPlot.nNegBins+lPSPlot.nPosBins)*sizeof(double)); if lPSPlot.GraphOutput then begin Create4DTrace (lBinData); Init4DTrace(lPSPlot.nNegBins + lPSPlot.nPosBins,lnROImin1*lnCond,lBinData,true); for lROI := 1 to lnROImin1 do lBinData.Lines[lROI].ELabel := ROIoverlayNameShort(lROI); end; //if graphoutput //repeat for each Region of interest for lROI := 1 to lnROImin1 do begin //compute complete timecourse for all volumes... if lnROI = 0 then begin {$IFDEF FPC} TimecourseVoxinten (l4DHdr, ImgForm.XViewEdit.value + ((ImgForm.YViewEdit.value-1)*gBGImg.ScrnDim[1]) +((ImgForm.ZViewEdit.value-1)*gBGImg.ScrnDim[1] *gBGImg.ScrnDim[2]),lTimeCourse) {$ELSE} TimecourseVoxinten (l4DHdr, ImgForm.XViewEdit.asinteger + ((ImgForm.YViewEdit.asinteger-1)*gBGImg.ScrnDim[1]) +((ImgForm.ZViewEdit.asinteger-1)*gBGImg.ScrnDim[1] *gBGImg.ScrnDim[2]),lTimeCourse) {$ENDIF} end else TimecourseROIinten (l4DHdr, ROIoverlayNum(lROI), lTimeCourse); //next normalize signal if lPSPlot.PctSignal then PctSignal(lTimeCourse,lnVol); //next compute PSPlots for lCond := 1 to lnCond do begin //here is where we can remove variability predicted by regressors.... {$IFDEF REMOVEREGRESS} if lPSPlot.RemoveRegressorVariability then begin RemoveRegressors(lTimeCourse,lTimeCourseFilt,l4DTrace,lCond,lnVol,lPSPlot); TimeCourseToPSPlot(lTimeCourseFilt, l4DTrace,lCountBin, lMnBin,lSumBin,lSumSqrBin ,lPSPlot, lCond,lnVol); end else {$ENDIF} TimeCourseToPSPlot(lTimeCourse, l4DTrace,lCountBin, lMnBin,lSumBin,lSumSqrBin ,lPSPlot,lCond,lnVol); //percent signal change and std error ComputeMeanSE (lCountBin, lMnBin,lSEBin,lSumBin,lSumSqrBin ,lPSPlot.nNegBins,lPSPlot.nPosBins); //report results if lPSPlot.TextOutput then TextOutput (lROI,lCond,lPSPlot, l4DTrace,lCountBin,lMnBin,lSEBin); if (lPSPlot.GraphOutput) then begin lLine := lROI + ((lCond-1)* lnROImin1); for lBin := 1 to (lPSPlot.nNegBins + lPSPlot.nPosBins) do begin lBinData.Lines[lLine].EventRA^[lBin] := lMnBin^[lBin]; lBinData.Conditions[lLine].EventRA^[lBin] := lSEBin^[lBin]; end;//for each bin end; //if graphoutput end; //for each cond end; //for each ROI freemem(lCountBin); //12/2007 freemem(lTimeCourse); freemem(lTimeCourseFilt); freemem(lMnBin); freemem(lSEBin); freemem(lSumSqrBin); freemem(lSumBin); if lPSPlot.TextOutput then TextForm.show; if (lPSPlot.GraphOutput) then begin MinMax4DTrace(lBinData); for lCond := 1 to lnCond do lBinData.Conditions[lCond].eLabel:= l4DTrace.Conditions[lCond].eLabel; lBinData.HorzMin := (-lPSPlot.nNegBins+0.5)*lPSPlot.BinWidthSec; lBinData.HorzWidPerBin := lPSPlot.BinWidthSec; CorePlot4DTrace(lBinData,Graph4DForm.Image1,1,0,lnCond,lPSPlot.TRsec,Graph4DForm.MinEdit.value,Graph4DForm.MaxEdit.value,true); Close4DTrace(lBinData,true); end;//if graph result := true; end; end. mricron-0.20120505.1~dfsg.1.orig/otsuml.pas0000664000175000017500000002047611647075074017724 0ustar michaelmichaelunit otsuml; //Multilevel Otsu's Method //Otsu N (1979) A threshold selection method from gray-level histograms. IEEE Trans. Sys., Man., Cyber. 9: 62-66. //Lookup Tables as suggested by Liao, Chen and Chung (2001) A fast algorithm for multilevel thresholding //note that my "otsu.pas" is slightly faster and much simpler if you only want bi-level output interface uses define_types, sysutils; function FindOtsu2 (var Img: Bytep; nVox: integer): byte; //function ApplyOtsu2 (var Img: Bytep; nVox: integer): byte; //function ApplyOtsu3 (var Img: Bytep; nVox: integer): byte; //function ApplyOtsu4 (var Img: Bytep; nVox: integer): byte; procedure ApplyOtsu (var Img: Bytep; nVox, levels: integer);//levels: 2=black/white, 3=3tone, 4=4tone procedure ApplyOtsuBinary (var Img: Bytep; nVox,levels: integer); implementation Type HistoRA = array [0..255] of longint; HistoRAd = array [0..255] of double; Histo2D = array [0..255] of HistoRAd; Function OtsuLUT(H: HistoRA): Histo2D; var Sum,Prob: double; v,u: integer;//column/rom index P,S: Histo2D; begin Sum := 0; for v := 0 to 255 do Sum := Sum + H[v]; if Sum <= 0 then exit; P[0][0] := H[0]; S[0][0] := H[0]; for v := 1 to 255 do begin prob := H[v]/Sum; P[0][v] := P[0][v-1]+prob; S[0][V] := S[0][v-1]+(v+1)*prob; end; for u := 1 to 255 do begin for v := u to 255 do begin P[u][v] := P[0][v]-P[0][u-1]; S[u][v] := S[0][v]-S[0][u-1]; end end; //result is eq 29 from Liao for u := 0 to 255 do begin for v := u to 255 do begin if S[u][v] = 0 then //avoid divide by zero errors... result[u][v] := 0 else result[u][v] := sqr(S[u][v]) /P[u][v]; end end; end; Function OtsuCostFunc(H: HistoRA): integer; //Otsu N (1979) A threshold selection method from gray-level histograms". IEEE Trans. Sys., Man., Cyber. 9: 62-66. //http://en.wikipedia.org/wiki/Otsu's_method //http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html //returns threshold for binarizing an image // all voxel <=Threshold are background // all voxel >Threshold are object const kMaxBin = 255; var t,total: integer; wB,wF,Sum,SumB,mF,mB,varBetween,varMax: double; begin result := 0; wB := 0; wF := 0; SumB := 0; Sum := 0; Total := 0; varMax := 0; for t := 0 to kMaxBin do Total := Total + H[t]; if Total = 0 then exit; for t := 0 to kMaxBin do Sum := Sum + (t*H[t]); for t :=0 to kMaxBin do begin wB := wB + H[t]; // Weight Background if (wB = 0) then continue; wF := Total - wB; // Weight Foreground if (wF = 0) then break; sumB := sumB+(t * H[t]); mB := sumB / wB; // Mean Background mF := (sum - sumB) / wF; // Mean Foreground // Calculate Between Class Variance varBetween := (wB/Total) * (wF/Total) * sqr(mB - mF); // Check if new maximum found if (t=0) or (varBetween > varMax) then begin varMax := varBetween; result := t; end; end; end; //OtsuCostFunc2 provides same answer as OtsuCostFunc, but is slightly slower and requires more RAM function OtsuCostFunc2(lHisto: HistoRA): integer; var v,max: double; h2d: Histo2D; n: integer; begin h2d := OtsuLUT(lHisto); //default solution n := 128; max := h2d[0,n]+h2d[n+1,255]; result := n; //exhaustively search for n := 0 to (255-1) do begin v := h2d[0,n]+h2d[n+1,255]; if v > max then begin result := n; max := v; end; //new max end; //for n end; //bilevel OtsuCostFunc2 procedure OtsuCostFunc3(lHisto: HistoRA; var Lo,Hi: integer); var v,max: double; l,h: integer; h2d: Histo2D; begin h2d := OtsuLUT(lHisto); //default solution lo := 85; hi := 170; max := h2d[0,lo]+h2d[lo+1,Hi]+h2d[Hi+1,255]; //exhaustively search for l := 0 to (255-2) do begin for h := l+1 to (255-1) do begin v := h2d[0,l]+h2d[l+1,h]+h2d[h+1,255]; if v > max then begin lo := l; hi := h; max := v; end; //new max end;//for h -> hi end; //for l -> low end; //trilevel OtsuCostFunc3 procedure OtsuCostFunc4(lHisto: HistoRA; var Lo,Mid,Hi: integer); var v,max: double; l,m,h: integer; h2d: Histo2D; begin h2d := OtsuLUT(lHisto); //default solution lo := 64; mid := 128; hi := 192; max := h2d[0,lo]+h2d[lo+1,mid]+h2d[mid+1,hi]+h2d[Hi+1,255]; //exhaustively search for l := 0 to (255-3) do begin for m := l+1 to (255-2) do begin for h := m+1 to (255-1) do begin v := h2d[0,l]+h2d[l+1,m]+h2d[m+1,h]+h2d[h+1,255]; if v > max then begin lo := l; mid := m; hi := h; max := v; end; //new max end;//for h -> hi end; //for mid end; //for l -> low end; //quad OtsuCostFunc4 function FindOtsu2 (var Img: Bytep; nVox: integer): byte; var n: integer; lHisto: HistoRA; begin result := 128; if nVox < 1 then exit; //create histogram for n := 0 to 255 do lHisto[n] := 0; for n := 0 to nVox do inc(lHisto[Img^[n]]); //now find minimum intraclass variance.... //result := OtsuCostFunc(lHisto); result := OtsuCostFunc2(lHisto); //same answer, just slower and more memory end; procedure FindOtsu3 (var Img: Bytep; nVox: integer; var lo, hi: integer); var n: integer; lHisto: HistoRA; begin lo := 85; hi := 170; if nVox < 1 then exit; //create histogram for n := 0 to 255 do lHisto[n] := 0; for n := 0 to nVox do inc(lHisto[Img^[n]]); //now find minimum intraclass variance.... OtsuCostFunc3(lHisto,lo,hi); end; procedure FindOtsu4 (var Img: Bytep; nVox: integer; var lo, med, hi: integer); var n: integer; lHisto: HistoRA; begin lo := 64; med := 128; hi := 192; if nVox < 1 then exit; //create histogram for n := 0 to 255 do lHisto[n] := 0; for n := 0 to nVox do inc(lHisto[Img^[n]]); //now find minimum intraclass variance.... OtsuCostFunc4(lHisto,lo,med,hi); end; function ApplyOtsu2 (var Img: Bytep; nVox: integer): byte; var n: integer; begin result := 128; if nVox < 1 then exit; result := FindOtsu2(Img,nVox); for n := 1 to nVox do if Img^[n] > result then Img^[n] := 255 else Img^[n] := 0; end; procedure ApplyOtsu3 (var Img: Bytep; nVox: integer); var n,lo,hi: integer; h: histora; begin if nVox < 1 then exit; FindOtsu3(Img,nVox,lo,hi); for n := 0 to 255 do if n <= Lo then H[n] := 0 else if n <= hi then h[n] := 128 else h[n] := 255; for n := 1 to nVox do Img^[n] := H[Img^[n]]; end; procedure ApplyOtsu4 (var Img: Bytep; nVox: integer); var n,lo,med,hi: integer; h: histora; begin if nVox < 1 then exit; FindOtsu4(Img,nVox,lo,med,hi); for n := 0 to 255 do if n <= Lo then H[n] := 0 else if n <= med then h[n] := 85 else if n <= hi then h[n] := 170 else h[n] := 255; for n := 1 to nVox do Img^[n] := H[Img^[n]]; end; procedure ApplyOtsu (var Img: Bytep; nVox,levels: integer); begin if levels <= 2 then ApplyOtsu2(Img,nVox) else if levels = 3 then ApplyOtsu3(Img,nVox) else ApplyOtsu4(Img,nVox); end; procedure ApplyOtsuBinary (var Img: Bytep; nVox,levels: integer); //1=1/4, 2=1/3, 3=1/2, 4=2/3, 5=3/4 var n: integer; h: histora; begin if nVox < 1 then exit; if (levels <= 1) or (levels >= 5) then ApplyOtsu4(Img,nVox) else if (levels = 2) or (levels = 4) then ApplyOtsu3(Img,nVox) else //level = 3 ApplyOtsu2(Img,nVox); if levels <= 3 then begin //make dark: all except 255 equal 0 for n := 0 to 254 do H[n] := 0; H[255] := 255; end else begin //make bright: all except 0 equal 255 H[0] := 0; for n := 1 to 255 do H[n] := 255; end; for n := 1 to nVox do Img^[n] := H[Img^[n]]; end; end. mricron-0.20120505.1~dfsg.1.orig/ortho_reorient.pas0000664000175000017500000004211311544434226021425 0ustar michaelmichaelunit ortho_reorient; //reorient image to nearest orthogonal plane interface uses SysUtils,define_types,GraphicsMathLibrary,prefs,nifti_hdr,dialogs; function OrthoReorientCore(var lHdr: TMRIcroHdr; l4D: boolean): boolean; implementation function NIfTIAlignedM (var lM: TMatrix): boolean; //check that diagonals are positive and all other cells are zero //negative diagonals suggests flipping... //non-negative other cells suggests the image is not pure axial var lr,lc: integer; begin result := false; for lr := 1 to 3 do for lc := 1 to 3 do begin if (lr = lc) and (lM.matrix[lr,lc] <= 0) then exit; if (lr <> lc) and (lM.matrix[lr,lc] <> 0) then exit; end; result := true; end; function NIfTIAligned (var lHdr: TNIFTIhdr): boolean; //check that diagonals are positive and all other cells are zero //negative diagonals suggests flipping... //non-negative other cells suggests the image is not pure axial var lM: TMatrix; begin lM := Matrix3D ( lHdr.srow_x[0],lHdr.srow_x[1],lHdr.srow_x[2],lHdr.srow_x[3], lHdr.srow_y[0],lHdr.srow_y[1],lHdr.srow_y[2],lHdr.srow_y[3], lHdr.srow_z[0],lHdr.srow_z[1],lHdr.srow_z[2],lHdr.srow_z[3], 0,0,0,1); result := NIfTIAlignedM(lM); end; procedure FromMatrix (M: TMatrix; var m11,m12,m13, m21,m22,m23, m31,m32,m33: DOUBLE) ; BEGIN m11 := M.Matrix[1,1]; m12 := M.Matrix[1,2]; m13 := M.Matrix[1,3]; m21 := M.Matrix[2,1]; m22 := M.Matrix[2,2]; m23 := M.Matrix[2,3]; m31 := M.Matrix[3,1]; m32 := M.Matrix[3,2]; m33 := M.Matrix[3,3]; END {FromMatrix3D}; function nifti_mat44_orthogx( lR :TMatrix): TMatrix; //returns rotation matrix required to orient image so it is aligned nearest to the identity matrix = // 1 0 0 0 // 0 1 0 0 // 0 0 1 0 // 0 0 0 1 //Therefore, image is approximately oriented in space var lrow,lcol,lMaxRow,lMaxCol,l2ndMaxRow,l2ndMaxCol,l3rdMaxRow,l3rdMaxCol: integer; r11,r12,r13 , r21,r22,r23 , r31,r32,r33, val,lAbsmax,lAbs: double; Q: TMatrix; //3x3 begin // load 3x3 matrix into local variables FromMatrix(lR,r11,r12,r13,r21,r22,r23,r31,r32,r33); Q := Matrix2D( r11,r12,r13,r21,r22,r23,r31,r32,r33); // normalize row 1 val := Q.matrix[1,1]*Q.matrix[1,1] + Q.matrix[1,2]*Q.matrix[1,2] + Q.matrix[1,3]*Q.matrix[1,3] ; if( val > 0.0 )then begin val := 1.0 / sqrt(val) ; Q.matrix[1,1] := Q.matrix[1,1]*val ; Q.matrix[1,2] := Q.matrix[1,2]*val ; Q.matrix[1,3] := Q.matrix[1,3]*val ; end else begin Q.matrix[1,1] := 1.0 ; Q.matrix[1,2] := 0.0; Q.matrix[1,3] := 0.0 ; end; // normalize row 2 val := Q.matrix[2,1]*Q.matrix[2,1] + Q.matrix[2,2]*Q.matrix[2,2] + Q.matrix[2,3]*Q.matrix[2,3] ; if( val > 0.0 ) then begin val := 1.0 / sqrt(val) ; Q.matrix[2,1] := Q.matrix[2,1]* val ; Q.matrix[2,2] := Q.matrix[2,2] * val ; Q.matrix[2,3] := Q.matrix[2,3] * val ; end else begin Q.matrix[2,1] := 0.0 ; Q.matrix[2,2] := 1.0 ; Q.matrix[2,3] := 0.0 ; end; // normalize row 3 val := Q.matrix[3,1]*Q.matrix[3,1] + Q.matrix[3,2]*Q.matrix[3,2] + Q.matrix[3,3]*Q.matrix[3,3] ; if( val > 0.0 ) then begin val := 1.0 / sqrt(val) ; Q.matrix[3,1] := Q.matrix[3,1] *val ; Q.matrix[3,2] := Q.matrix[3,2] *val ; Q.matrix[3,3] := Q.matrix[3,3] *val ; end else begin Q.matrix[3,1] := Q.matrix[1,2]*Q.matrix[2,3] - Q.matrix[1,3]*Q.matrix[2,2] ; //* cross */ Q.matrix[3,2] := Q.matrix[1,3]*Q.matrix[2,1] - Q.matrix[1,1]*Q.matrix[2,3] ; //* product */ Q.matrix[3,3] := Q.matrix[1,1]*Q.matrix[2,2] - Q.matrix[1,2]*Q.matrix[2,1] ; end; //next - find closest orthogonal coordinates - each matrix cell must be 0,-1 or 1 //First: find axis most aligned to a principal axis lAbsmax := 0; lMaxRow := 1; lMaxCol := 1; for lrow := 1 to 3 do begin for lcol := 1 to 3 do begin lAbs := abs(Q.matrix[lrow,lcol]); if lAbs > lAbsMax then begin lAbsmax := lAbs; lMaxRow := lRow; lMaxCol := lCol; end; end; //for rows end; //for columns //Second - find find axis that is 2nd closest to principal axis lAbsmax := 0; l2ndMaxRow := 2; l2ndMaxCol := 2; for lrow := 1 to 3 do begin for lcol := 1 to 3 do begin if (lrow <> lMaxRow) and (lCol <> lMaxCol) then begin lAbs := abs(Q.matrix[lrow,lcol]); if lAbs > lAbsMax then begin lAbsmax := lAbs; l2ndMaxRow := lRow; l2ndMaxCol := lCol; end; //new max end; //do not check MaxRow/MaxCol end; //for rows end; //for columns //next - no degrees of freedom left: third prinicple axis is the remaining axis if ((lMaxRow = 1) or (l2ndMaxRow = 1)) and ((lMaxRow = 2) or (l2ndMaxRow = 2)) then l3rdMaxRow := 3 else if ((lMaxRow = 1) or (l2ndMaxRow = 1)) and ((lMaxRow = 3) or (l2ndMaxRow = 3)) then l3rdMaxRow := 2 else l3rdMaxRow := 1; if ((lMaxCol = 1) or (l2ndMaxCol = 1)) and ((lMaxCol = 2) or (l2ndMaxCol = 2)) then l3rdMaxCol := 3 else if ((lMaxCol = 1) or (l2ndMaxCol = 1)) and ((lMaxCol = 3) or (l2ndMaxCol = 3)) then l3rdMaxCol := 2 else l3rdMaxCol := 1; //finally, fill in our rotation matrix //cells in the canonical rotation transform can only have values 0,1,-1 result := Matrix3D( 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0); if Q.matrix[lMaxRow,lMaxCol] < 0 then result.matrix[lMaxRow,lMaxCol] := -1 else result.matrix[lMaxRow,lMaxCol] := 1; if Q.matrix[l2ndMaxRow,l2ndMaxCol] < 0 then result.matrix[l2ndMaxRow,l2ndMaxCol] := -1 else result.matrix[l2ndMaxRow,l2ndMaxCol] := 1; if Q.matrix[l3rdMaxRow,l3rdMaxCol] < 0 then result.matrix[l3rdMaxRow,l3rdMaxCol] := -1 else result.matrix[l3rdMaxRow,l3rdMaxCol] := 1; end; FUNCTION QuickInvertMatrix3D (CONST Input:TMatrix): TMatrix; //http://www.cellperformance.com/articles/2006/06/a_4x4_matrix_inverse_1.html //Most of the time in the video games, programmers are not doing a standard inverse matrix. //It is too expensive. Instead, to inverse a matrix, they consider it as orthonormal //and they just do a 3x3 transpose of the rotation part with a dot product for the translation. //Sometimes the full inverse algorithm is necessary.... var i,j: integer; begin result.size := Input.size; for i := 1 to 3 do for j := 1 to 3 do result.matrix[i,j] := input.matrix[j,i]; //next - fill in edge if 3D if result.size <> size3D then exit; //do not fill in final column for 2D matrices for i := 1 to 3 do result.matrix[4,i] := 0; for i := 1 to 3 do result.matrix[i,4] := 0; result.matrix[4,4] := 1; end; procedure FindMatrixPt (lX,lY,lZ: single; var lXout,lYOut,lZOut: single; var lMatrix: TMatrix); begin lXOut := (lX*lMatrix.matrix[1,1])+(lY*lMatrix.matrix[1,2])+(lZ*lMatrix.matrix[1,3])+lMatrix.matrix[1,4]; lYOut := (lX*lMatrix.matrix[2,1])+(lY*lMatrix.matrix[2,2])+(lZ*lMatrix.matrix[2,3])+lMatrix.matrix[2,4]; lZOut := (lX*lMatrix.matrix[3,1])+(lY*lMatrix.matrix[3,2])+(lZ*lMatrix.matrix[3,3])+lMatrix.matrix[3,4]; end; procedure CheckMin(var lX,lY,lZ,lXMin,lYMin,lZMin: single); begin if lX < lXMin then lXMin := lX; if lY < lYMin then lYMin := lY; if lZ < lZMin then lZMin := lZ; end; procedure Mins (var lMatrix: TMatrix; var lHdr: TNIFTIhdr; var lXMin,lYMin,lZMin: single); var lPos,lXc,lYc,lZc: integer; lx,ly,lz: single; begin FindMatrixPt(0,0,0,lX,lY,lZ,lMatrix); lXMin := lX; lYMin := lY; lZMin := lZ; for lPos := 1 to 7 do begin if odd(lPos) then lXc := lHdr.Dim[1]-1 else lXc := 0; if odd(lPos shr 1) then lYc := lHdr.Dim[2]-1 else lYc := 0; if odd(lPos shr 2) then lZc := lHdr.Dim[3]-1 else lZc := 0; FindMatrixPt(lXc,lYc,lZc,lX,lY,lZ,lMatrix); CheckMin(lX,lY,lZ,lXMin,lYMin,lZMin); end; end; (*procedure ReportMatrix (lM:TMatrix); const kCR = chr (13); begin showmessage(RealToStr(lM.matrix[1,1],6)+','+RealToStr(lM.matrix[1,2],6)+','+RealToStr(lM.matrix[1,3],6)+','+RealToStr(lM.matrix[1,4],6)+kCR+ RealToStr(lM.matrix[2,1],6)+','+RealToStr(lM.matrix[2,2],6)+','+RealToStr(lM.matrix[2,3],6)+','+RealToStr(lM.matrix[2,4],6)+kCR+ RealToStr(lM.matrix[3,1],6)+','+RealToStr(lM.matrix[3,2],6)+','+RealToStr(lM.matrix[3,3],6)+','+RealToStr(lM.matrix[3,4],6)+kCR +RealToStr(lM.matrix[4,1],6)+','+RealToStr(lM.matrix[4,2],6)+','+RealToStr(lM.matrix[4,3],6)+','+RealToStr(lM.matrix[4,4],6) ); end;*) function OrthoReorientCore(var lHdr: TMRIcrohdr; l4D: boolean): boolean; var //lF: File; lOutHdr: TNIFTIhdr; lOutName: string; lResidualMat: TMatrix; lInMinX,lInMinY,lInMinZ,lOutMinX,lOutMinY,lOutMinZ, dx, dy, dz, QFac: single; lStartX,lStartY,lStartZ, lZ,lY,lX,lB, lOutZ,lOutY, lXInc, lYInc, lZInc,lBPP,lVol,lnVol: integer; lInPos,lVolBytes,lOutPos,lInOffset: integer; lBufferOut: bytep; lByteSwap,lFlipX,lFlipY,lFlipZ: boolean; lInMat,lRotMat: TMatrix; begin result := false; if {(lhdr.NIfTIhdr.dim[4] > 1) or} (lhdr.NIfTIhdr.dim[3] < 2) then begin //Showmessage('Can only orient 3D images '+inttostr(lhdr.NIfTIhdr.dim[3])+' '+inttostr(lhdr.NIfTIhdr.dim[4])); exit; end; if (lHdr.ImgBufferItems < lhdr.NIfTIhdr.dim[1]*lhdr.NIfTIhdr.dim[2]*lhdr.NIfTIhdr.dim[3]) then exit; //Msg(lHdrName); lInMat := Matrix3D ( lhdr.NIfTIhdr.srow_x[0],lhdr.NIfTIhdr.srow_x[1],lhdr.NIfTIhdr.srow_x[2],lhdr.NIfTIhdr.srow_x[3], lhdr.NIfTIhdr.srow_y[0],lhdr.NIfTIhdr.srow_y[1],lhdr.NIfTIhdr.srow_y[2],lhdr.NIfTIhdr.srow_y[3], lhdr.NIfTIhdr.srow_z[0],lhdr.NIfTIhdr.srow_z[1],lhdr.NIfTIhdr.srow_z[2],lhdr.NIfTIhdr.srow_z[3], 0,0,0,1); //ReportMatrix(lInMat); if (NIfTIAlignedM (lInMat)) then begin //Msg('According to header, image is already canonically oriented'); exit; end; lRotMat := nifti_mat44_orthogx( lInMat); if NIfTIAlignedM (lRotMat) then begin //Msg('According to header, image is already approximately canonically oriented'); exit; //already as close as possible end; lOutHdr := lHdr.NIFTIhdr; //Some software uses negative pixdims to represent a spatial flip - now that the image is canonical, all dimensions are positive lOutHdr.pixdim[1] := abs(lhdr.NIfTIhdr.pixdim[1]); lOutHdr.pixdim[2] := abs(lhdr.NIfTIhdr.pixdim[2]); lOutHdr.pixdim[3] := abs(lhdr.NIfTIhdr.pixdim[3]); //sort out dim1 lFlipX := false; if lRotMat.Matrix[1,2] <> 0 then begin lXinc := lhdr.NIfTIhdr.dim[1]; lOutHdr.dim[1] := lhdr.NIfTIhdr.dim[2]; lOutHdr.pixdim[1] := abs(lhdr.NIfTIhdr.pixdim[2]); if lRotMat.Matrix[1,2] < 0 then lFlipX := true end else if lRotMat.Matrix[1,3] <> 0 then begin lXinc := lhdr.NIfTIhdr.dim[1]*lhdr.NIfTIhdr.dim[2]; lOutHdr.dim[1] := lhdr.NIfTIhdr.dim[3]; lOutHdr.pixdim[1] := abs(lhdr.NIfTIhdr.pixdim[3]); if lRotMat.Matrix[1,3] < 0 then lFlipX := true end else begin lXinc := 1; if lRotMat.Matrix[1,1] < 0 then lFlipX := true end; //sort out dim2 lFlipY := false; if lRotMat.Matrix[2,2] <> 0 then begin lYinc := lhdr.NIfTIhdr.dim[1]; //lOutHdr.dim[2] := lhdr.NIfTIhdr.dim[2]; //lOutHdr.pixdim[2] := lhdr.NIfTIhdr.pixdim[2]; if lRotMat.Matrix[2,2] < 0 then lFlipY := true end else if lRotMat.Matrix[2,3] <> 0 then begin lYinc := lhdr.NIfTIhdr.dim[1]*lhdr.NIfTIhdr.dim[2]; lOutHdr.dim[2] := lhdr.NIfTIhdr.dim[3]; lOutHdr.pixdim[2] := abs(lhdr.NIfTIhdr.pixdim[3]); if lRotMat.Matrix[2,3] < 0 then lFlipY := true end else begin lYinc := 1; lOutHdr.dim[2] := lhdr.NIfTIhdr.dim[1]; lOutHdr.pixdim[2] := abs(lhdr.NIfTIhdr.pixdim[1]); if lRotMat.Matrix[2,1] < 0 then lFlipY := true end; //sort out dim3 lFlipZ := false; if lRotMat.Matrix[3,2] <> 0 then begin lZinc := lhdr.NIfTIhdr.dim[1]; lOutHdr.dim[3] := lhdr.NIfTIhdr.dim[2]; lOutHdr.pixdim[3] := lhdr.NIfTIhdr.pixdim[2]; if lRotMat.Matrix[3,2] < 0 then lFlipZ := true; end else if lRotMat.Matrix[3,3] <> 0 then begin lZinc := lhdr.NIfTIhdr.dim[1]*lhdr.NIfTIhdr.dim[2]; //lOutHdr.dim[3] := lhdr.NIfTIhdr.dim[3]; //lOutHdr.pixdim[3] := lhdr.NIfTIhdr.pixdim[3]; if lRotMat.Matrix[3,3] < 0 then lFlipZ := true; end else begin lZinc := 1; lOutHdr.dim[3] := lhdr.NIfTIhdr.dim[1]; lOutHdr.pixdim[3] := lhdr.NIfTIhdr.pixdim[1]; if lRotMat.Matrix[3,1] < 0 then lFlipZ := true; end; //details for writing... lBPP := (lhdr.NIfTIhdr.bitpix div 8); //bytes per pixel if lBPP > 4 then lBPP := 4;//64bit data is stored as 32-bit precision June 2009 lXinc := lXinc * lBPP; lYinc := lYinc * lBPP; lZinc := lZinc * lBPP; lVolBytes := lhdr.NIfTIhdr.dim[1]*lhdr.NIfTIhdr.dim[2]*lhdr.NIfTIhdr.dim[3]*lBPP; //now write header... //create Matrix of residual orientation... lResidualMat := QuickInvertMatrix3D(lRotMat); //the next steps are inelegant - the translation values are computed by brute force //at the moment, our lResidualMat looks like this //lResidualMat = [ 0 -1 0 0; 0 0 1 0; 1 0 0 0; 0 0 0 1]; //however, it should specify the dimensions in mm of the dimensions that are flipped //However, note that whenever you reverse the direction of //voxel coordinates, you need to include the appropriate offset //in the 'a' matrix. That is: //lResidualMat = [0 0 1 0; -1 0 0 Nx-1; 0 1 0 0; 0 0 0 1] //where Nx is the number of voxels in the x direction. //So, if you took Nx=256, then for your values before, you'd get: //TransRot = [ 0 -1 0 255; 0 0 1 0; 1 0 0 0; 0 0 0 1]; //Because we do not do this, we use the function mins to compute the translations... //I have not implemented refined version yet - require sample volumes to check //Ensure Nx is voxels not mm, etc.... //start of kludge lResidualMat := multiplymatrices(lInMat,lResidualMat); //source lResidualMat.Matrix[1,4] := 0; lResidualMat.Matrix[2,4] := 0; lResidualMat.Matrix[3,4] := 0; Mins (lInMat, lHdr.NIFTIHdr,lInMinX,lInMinY,lInMinZ); Mins (lResidualMat, lOutHdr,lOutMinX,lOutMinY,lOutMinZ); lResidualMat.Matrix[1,4] := lInMinX-lOutMinX; lResidualMat.Matrix[2,4] := lInMinY-lOutMinY; lResidualMat.Matrix[3,4] := lInMinZ-lOutMinZ; //End of kuldge lOutHdr.srow_x[0] := lResidualMat.Matrix[1,1]; lOutHdr.srow_x[1] := lResidualMat.Matrix[1,2]; lOutHdr.srow_x[2] := lResidualMat.Matrix[1,3]; lOutHdr.srow_y[0] := lResidualMat.Matrix[2,1]; lOutHdr.srow_y[1] := lResidualMat.Matrix[2,2]; lOutHdr.srow_y[2] := lResidualMat.Matrix[2,3]; lOutHdr.srow_z[0] := lResidualMat.Matrix[3,1]; lOutHdr.srow_z[1] := lResidualMat.Matrix[3,2]; lOutHdr.srow_z[2] := lResidualMat.Matrix[3,3]; lOutHdr.srow_x[3] := lResidualMat.Matrix[1,4]; lOutHdr.srow_y[3] := lResidualMat.Matrix[2,4]; lOutHdr.srow_z[3] := lResidualMat.Matrix[3,4]; nifti_mat44_to_quatern( lResidualMat, lOutHdr.quatern_b,lOutHdr.quatern_c,lOutHdr.quatern_d, lOutHdr.qoffset_x,lOutHdr.qoffset_y,lOutHdr.qoffset_z, dx, dy, dz, lOutHdr.pixdim[0]); GetMem(lBufferOut,lVolBytes); lnVol := 1; if (lhdr.NIfTIhdr.dim[4] > 1) and (l4D) then lnVol := lhdr.NIfTIhdr.dim[4]; //convert (*if lFlipX then fx(1); if lFlipY then fx(2); if lFlipZ then fx(3);*) if lFlipX then lXInc := -lXInc; if lFlipY then lYInc := -lYInc; if lFlipZ then lZInc := -lZInc; for lVol := 1 to lnVol do begin lOutPos := 0; if lFlipX then lStartX := (lOutHdr.dim[1]-1)*-lXInc else lStartX := 0; if lFlipY then lStartX := lStartX + (lOutHdr.dim[2]-1)*-lYInc; if lFlipZ then lStartX := lStartX + (lOutHdr.dim[3]-1)*-lZInc; lStartX := lStartX+ ((lVol-1)*lVolBytes); for lZ := 1 to lOutHdr.dim[3] do begin lOutZ := lStartX + (lZ-1) * lZInc; for lY := 1 to lOutHdr.dim[2] do begin lOutY := ((lY-1) * lYInc) + lOutZ; for lX := 1 to lOutHdr.dim[1] do begin for lB := 1 to (lBPP) do begin inc(lOutPos); //lInPos := ((lX-1) * lXInc) + lOutY + lB; lInPos := lOutY + lB; lBufferOut^[lOutPos] := lHdr.ImgBuffer^[lInPos]; end; inc(lOutY,lXinc); end; end; //for Y end; //for Z Move(lBufferOut^,lHdr.ImgBuffer^[1+((lVol-1)*lVolBytes)],lVolBytes); end; //for each volume (* Filemode := 2; AssignFile(lF,'C:\Documents and Settings\Admin\Desktop\rorden\perisample\shit.img'); {WIN} Rewrite(lF,1); BlockWrite(lF,lHdr.ImgBuffer^,lnVol*lVolBytes); CloseFile(lF);*) Freemem(lBufferOut); lHdr.NIFTIhdr := lOutHdr; //fx(lOutHdr.srow_x[3],lOutHdr.srow_y[3],lOutHdr.srow_z[3]); result := true; end;//ReorientCore end. mricron-0.20120505.1~dfsg.1.orig/npm/0000775000175000017500000000000011754254530016450 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/npm/zconf.inc0000664000175000017500000000127410251352300020247 0ustar michaelmichael{ -------------------------------------------------------------------- } {$DEFINE MAX_MATCH_IS_258} { Compile with -DMAXSEG_64K if the alloc function cannot allocate more than 64k bytes at a time (needed on systems with 16-bit int). } {- $DEFINE MAXSEG_64K} {$IFNDEF WIN32} {$DEFINE UNALIGNED_OK} { requires SizeOf(ush) = 2 ! } {$ENDIF} {$UNDEF DYNAMIC_CRC_TABLE} {$UNDEF FASTEST} {$define patch112} { apply patch from the zlib home page } { -------------------------------------------------------------------- } {$IFDEF FPC} {$DEFINE Use32} {$UNDEF DPMI} {$UNDEF MSDOS} {$UNDEF UNALIGNED_OK} { requires SizeOf(ush) = 2 ! } {$UNDEF MAXSEG_64K} {$ENDIF} mricron-0.20120505.1~dfsg.1.orig/npm/xmontecarlo.pas0000664000175000017500000002100411326434470021503 0ustar michaelmichaelunit montecarlo; interface {$H+} {$DEFINE anacom} uses define_types,SysUtils, part,StatThds,statcr,StatThdsUtil,Brunner,DISTR,nifti_img, hdr, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,ExtCtrls,Menus, overlap,ReadInt,lesion_pattern,stats,LesionStatThds,nifti_hdr, {$IFDEF FPC} LResources,gzio2, {$ELSE} gziod,associate,{$ENDIF} //must be in search path, e.g. C:\pas\mricron\npm\math {$IFNDEF UNIX} Windows, {$ENDIF} upower,firthThds,firth,IniFiles,cpucount,userdir,math, regmult,utypes{$IFDEF anacom} ,anacom{$ENDIF}; procedure LesionMonteCarlo (lBinomial,lTTest,lBM: boolean); implementation uses npmform,filename,turbolesion; procedure RandomGroup(kSamplesPerTest: integer;lImageNames: TStrings;lSymptomRA: SingleP;var lPartImageNames: TStrings; var lPartSymptomRA: SingleP); var lTotal,lInc,lRand,lSwap: integer; lRanOrder: longintP; begin lPartImageNames.Clear; lTotal := lImageNames.Count; if kSamplesPerTest > lTotal then begin showmessage('Monte carlo error: population must be larger than sample size.'); exit; end; Getmem(lRanOrder,lTotal*sizeof(longint)); for lInc := 1 to lTotal do lRanOrder^[lInc] := lInc; for lInc := lTotal downto 2 do begin lRand := Random(lInc)+1; lSwap := lRanOrder^[lRand]; lRanOrder^[lRand] := lRanOrder^[lInc]; lRanOrder^[lInc] := lSwap; end; for lInc := 1 to kSamplesPerTest do begin lPartImageNames.Add(lImageNames.Strings[lRanOrder^[lInc]-1]);//indexed from 0 lPartSymptomRA^[lInc] := lSymptomRA^[lRanOrder^[lInc]]; end; Freemem(lRanOrder); end; procedure LesionMonteCarlo (lBinomial,lTTest,lBM: boolean); label 666; //const //kSimSampleSize = 64; //knSim = 2; //kCrit = 3; {$IFDEF anacom} //knControls = 64; {$ENDIF} var lPrefs: TLDMPrefs ; lCrit,lnSim, lSimSampleSize,lSim,lFact,lnFactors,lSubj,lnSubj,lnSubjAll,lMaskVoxels,lnCrit: integer; lPartImageNames,lImageNames,lImageNamesAll: TStrings; lPredictorList: TStringList; lControlFilename,lTemp4D,lMaskname,lOutName,lFactname,lOutNameSim: string; lMaskHdr: TMRIcroHdr; lMultiSymptomRA,lSymptomRA,lPartSymptomRA: singleP; {$IFDEF anacom} lnControlObservations: integer; lControlSymptomRA: singleP; {$ENDIF} begin lnSim := ReadIntForm.GetInt('Enter total numbers of simulations ', 10,25,1000); lSimSampleSize := ReadIntForm.GetInt('Number of patients per simulation? ', 2,10,1000); lCrit := ReadIntForm.GetInt('Only analyze voxels damaged in at least N patients ', 2,10,1000); //lBinomial := not odd( (Sender as tMenuItem).tag); lPrefs.NULP := true{gNULP false}; if not lBinomial then begin lPrefs.BMtest := lbm;//BMmenu.checked; lPrefs.Ttest := lttest;//ttestmenu.checked; if (not lPrefs.BMtest) and (not lPrefs.ttest) then lPrefs.ttest := true; lPrefs.Ltest:= false; end else begin lPrefs.BMtest := false; lPrefs.Ttest := false; lPrefs.Ltest:= true; end; lPrefs.nCrit := lCrit; lPrefs.nPermute := 0;//MainForm.ReadPermute;; lPrefs.Run := 0;{0 except for montecarlo} if (not lBinomial) and (not lTTest) and (not lBM) then begin Showmessage('Error: you need to compute at least on test [options/test menu]'); exit; end; lImageNamesAll:= TStringList.Create; //not sure why TStrings.Create does not work??? lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? lPartImageNames := TStringList.Create; getmem(lPartSymptomRA,lSimSampleSize*sizeof(single)); {$IFDEF anacom} if not MainForm.OpenDialogExecute('Select text file',false,false,'Text file (*.txt)|*.txt;*.csv') then begin showmessage('AnaCOM aborted: Control data file selection failed.'); exit; end; //if not selected lControlFilename := MainForm.OpenHdrDlg.Filename; if (not readTxt (lControlFilename, lnControlObservations,lControlSymptomRA)) or (lnControlObservations < 1) then begin showmessage('Error reading file '+lControlFilename); exit; end; //lnControlObservations := knControls; //getmem(lControlSymptomRA,lnControlObservations*sizeof(single)); //for lSim := 1 to lnControlObservations do // lControlSymptomRA^[lSim] := 1000; {$ENDIF} //next, get 1st group if not MainForm.GetValX(lnSubjAll,lnFactors,lMultiSymptomRA,lImageNamesAll,lnCrit{,binom},lPredictorList) then begin showmessage('Error with VAL file'); goto 666; end; lTemp4D := CreateDecompressed4D(lImageNamesAll); if (lnSubjAll < 1) or (lnFactors < 1) or (lnSubjAll < lSimSampleSize) then begin Showmessage('Not enough subjects ('+inttostr(lnSubjAll)+') [sample size is '+inttostr(lSimSampleSize)+']or factors ('+inttostr(lnFactors)+').'); goto 666; end; lMaskname := lImageNamesAll[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; lOutName := ExtractFileDirWithPathDelim(lMaskName)+'results'; MainForm.SaveHdrDlg.Filename := loutname; lOutName := lOutName+'.nii.gz'; if not MainForm.SaveHdrName ('Base Statistical Map', lOutName) then goto 666; for lFact := 1 to lnFactors do begin lImageNames.clear; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then {$ENDIF} lImageNames.Add(lImageNamesAll[lSubj-1]); lnSubj := lImageNames.Count; if lnSubj > 1 then begin getmem(lSymptomRA,lnSubj * sizeof(single)); lnSubj := 0; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then begin {$ELSE} begin{$ENDIF} inc(lnSubj); lSymptomRA^[lnSubj] := lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)]; end; //randomization loop.... for lSim := 1 to lnSim do begin RandomGroup(lSimSampleSize, lImageNames,lSymptomRA, lPartImageNames, lPartSymptomRA); lOutNameSim := AddIndexToFilename(lOutName,lSim); lnCrit := lCrit; MainForm.NPMMsgClear; //Msg(GetKVers); MainForm.NPMMsg('Threads: '+inttostr(gnCPUThreads)); lFactName := lPredictorList.Strings[lFact-1]; lFactName := LegitFilename(lFactName,lFact); MainForm.NPMMsg('Factor = '+lFactname); For lSubj := 1 to lSimSampleSize do MainForm.NPMMsg (lPartImageNames.Strings[lSubj-1] + ' = '+realtostr(lPartSymptomRA^[lSubj],2) ); MainForm.NPMMsg('Total voxels = '+inttostr(lMaskVoxels)); MainForm.NPMMsg('Only testing voxels damaged in at least '+inttostr(lnCrit)+' individual[s]'); MainForm.NPMMsg('Number of Lesion maps = '+inttostr(lSimSampleSize)); if not CheckVoxelsGroup(lPartImageNames,lMaskVoxels) then begin showmessage('File dimensions differ from mask.'); goto 666; end; lPrefs.Run := lSim; if lBinomial then TurboLDM (lPartImageNames, lMaskHdr, lPrefs, lPartSymptomRA, lFactname,lOutNameSim) else begin MainForm.ReportDescriptives(lPartSymptomRA,lnSubj); TurboLDM (lPartImageNames, lMaskHdr, lPrefs, lPartSymptomRA, lFactname,lOutNameSim); {$IFDEF anacom} AnacomLesionNPMAnalyze (lPartImageNames, lMaskHdr, lnCrit,lSim,lnControlObservations, lPartSymptomRA,lControlSymptomRA, lFactname,lOutNameSim,true,false); {$ENDIF} end; end; //for each simulation... Freemem(lSymptomRA); end; //lnsubj > 1 end; //for each factor if lnSubjAll > 0 then begin Freemem(lMultiSymptomRA); end; 666: lPartImageNames.free; lImageNames.Free; lImageNamesAll.Free; lPredictorList.Free; freemem(lPartSymptomRA); {$IFDEF anacom} freemem(lControlSymptomRA); {$ENDIF} DeleteDecompressed4D(lTemp4D); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/xLesionStatThds.pas0000664000175000017500000004452711354606552022272 0ustar michaelmichaelunit LesionStatThds; interface uses SysUtils, ComCtrls,Classes, Graphics, ExtCtrls, define_types,stats,StatThdsUtil,Brunner,lesion_pattern; type TLesionStatThread = class(TThread) private lBarX: TProgressBar; lttestx,lBMx: boolean; lnCritx,lBarPosX,lnPermuteX,lThreadx,lThreadStartx,lThreadEndx,lStartVoxx,lVoxPerPlankx, lImagesCountx,lControlsx : integer; lPlankImgx:ByteP; lOutImgMnx,lOutImgBMx,lOutImgTx,lOutImgAUCX,lSymptomRAx: SingleP; //lBarX: TProgressBar; procedure DoVisualSwap; protected procedure Execute; override; procedure VisualProg(lPos: Integer); procedure Analyze(lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg:bytep;lOutImgMn,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA: SingleP); virtual; abstract; public constructor Create(lBar: TProgressBar;lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg:ByteP;lOutImgMn,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA: SingleP); end; { Lesion - image reveals value } TLesionContinuous = class(TLesionStatThread ) protected procedure Analyze(lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg: byteP;lOutImgMn,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA: SingleP); override; end; TLesionBinom = class(TLesionStatThread ) protected procedure Analyze(lChi2,lLieber: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg: byteP;lOutImgMn,lOutImgL,lOutImgX,lOutImgAUC,lSymptomRA: SingleP); override; end; implementation (*procedure OutStr(lStr: string); var lOutname: string; f: TextFile; begin lOutname:='c:\fx.txt'; if fileexists(lOutname) then begin { open a text file } AssignFile(f, lOutname); Append(f); Writeln(f, lStr); Flush(f); { ensures that the text was actually written to file } { insert code here that would require a Flush before closing the file } CloseFile(f); end; end; *) Const Two32 = 4294967296.0 ; function GenRandThreaded(lRange: integer; var lRandSeed:comp): integer; //normal random function does not work well when threaded - randseed is changed by each thread const lFactor = $08088405 ; lTerm = 1 ; type lT = array [0..1] of longint ; var lX: extended; begin lRandSeed := lRandSeed*lFactor + lTerm; lT(lRandSeed)[1] := 0 ; // < May'04 was: RS := RS - Trunc(RS/Two32)*Two32 ; lX := lRandSeed/Two32 ; result := trunc((lRange)*lX); end; procedure GenPermuteThreaded (lnSubj: integer; var lOrigOrder,lRanOrder: DoubleP0; var lRandSeed:comp); var lInc,lRand: integer; lSwap: double; begin Move(lOrigOrder^,lRanOrder^,lnSubj*sizeof(double)); for lInc := lnSubj downto 2 do begin lRand := GenRandThreaded(lInc,lRandSeed); lSwap := lRanOrder^[lRand]; lRanOrder^[lRand] := lRanOrder^[lInc-1]; lRanOrder^[lInc-1] := lSwap; end; end; procedure StatPermuteThreaded (lttest,lBM: boolean; lnSubj, lnGroup0,lnPermute,lThread: integer;var lOrigOrder: DoubleP0); var lInc: integer; lOutT,lDF,lBMz: double; lRS: Comp; lRanOrderp: pointer; lRanOrder: Doublep0; begin if (lnSubj < 1) or (lnPermute < 1) then exit; createArray64(lRanOrderp,lRanOrder,lnSubj); lRS := 128; for lInc := 1 to lnPermute do begin GenPermuteThreaded(lnSubj, lOrigOrder,lRanOrder,lRS); //generate random order of participants if lttest then begin TStat2 (lnSubj, lnGroup0, lRanOrder, lOutT); if lOutT > gPermuteMaxT[lThread,lInc] then gPermuteMaxT[lThread,lInc] := lOutT; if lOutT < gPermuteMinT[lThread,lInc] then gPermuteMinT[lThread,lInc] := lOutT; end; //compute ttest if lBM then begin //BMTest (lnSubj, lnGroup0, lRanOrder,lOutT); tBM (lnSubj, lnGroup0, lRanOrder,lBMz,lDF); lBMz := BMzVal (lnSubj, lnGroup0,lBMz,lDF); if lBMz > gPermuteMaxBM[lThread,lInc] then gPermuteMaxBM[lThread,lInc] := lBMz; if lBMz < gPermuteMinBM[lThread,lInc] then gPermuteMinBM[lThread,lInc] := lBMz; end; //compute BM end; freemem(lRanOrderp); end; procedure GenPermuteThreadedBinom (lnSubj: integer; var lOrigOrder,lRanOrder: ByteP0; var lRandSeed:comp); var lInc,lRand: integer; lSwap: byte; begin Move(lOrigOrder^,lRanOrder^,lnSubj); for lInc := lnSubj downto 2 do begin lRand := GenRandThreaded(lInc,lRandSeed); lSwap := lRanOrder^[lRand]; lRanOrder^[lRand] := lRanOrder^[lInc-1]; lRanOrder^[lInc-1] := lSwap; end; end; procedure StatPermuteBinomialThreaded (lnSubj, lnGroup0,lnPermute,lThread: integer;var lOrigOrder: ByteP0); var lInc: integer; lOutP: double; lRS: Comp; lRanOrder: byteP0; begin if (lnSubj < 1) or (lnPermute < 1) then exit; //createArray64(lRanOrderp,lRanOrder,lnSubj); getmem(lRanOrder,lnSubj); lRS := 128; for lInc := 1 to lnPermute do begin GenPermuteThreadedBinom(lnSubj, lOrigOrder,lRanOrder,lRS); //generate random order of participants (*if lChi2 then begin Chi2 (lnSubj, lnGroup0, lRanOrder, lOutT); if lOutT > gPermuteMaxT[lThread,lInc] then gPermuteMaxT[lThread,lInc] := lOutT; if lOutT < gPermuteMinT[lThread,lInc] then gPermuteMinT[lThread,lInc] := lOutT; end; //compute ttest if lLieber then begin*) //Liebermeister2bP (lnSubj, lnGroup0, lRanOrder,lOutP); Liebermeister2bP (lnSubj, lnGroup0, lRanOrder,lOutP); if (lOutP > 0) and (lOutP < gPermuteMinT[lThread,lInc]) then begin //negative correlation //fx(lOutP, gPermuteMinBM[lThread,lInc]); gPermuteMinT[lThread,lInc] := lOutP; end; if (lOutP < 0) and ( lOutP > gPermuteMaxT[lThread,lInc]) then //negative correlation gPermuteMaxT[lThread,lInc] := lOutP; //end; //compute BM end; freemem(lRanOrder); end; procedure TLesionStatThread .DoVisualSwap; begin lBarX.Position := lBarPosX; end; procedure TLesionStatThread .VisualProg(lPos: Integer); begin lBarPosX := lPos; {$IFDEF FPC}Synchronize(@DoVisualSwap); {$ELSE} Synchronize(DoVisualSwap);{$ENDIF} end; constructor TLesionStatThread.Create(lBar: TProgressBar; lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg: byteP;lOutImgMn,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA: SingleP); begin lBarX := lBar; lttestx := lttest; lBMx:= lBM; lThreadX := lThread; lThreadStartX := lThreadStart; lThreadEndX := lThreadEnd; lStartVoxx := lStartVox; lVoxPerPlankx := lVoxPerPlank; lImagesCountX := lImagesCount; lControlsX := lControlsIn; lPlankImgx := lPlankImg; lOutImgMnx := lOutImgMn; lOutImgBMx := lOutImgBM; lOutImgTx := lOutImgT; lOutImgAUCx := lOutImgAUC; lSymptomRAx := lSymptomRA; lnPermuteX := lnPermute; lnCritX := lnCrit; FreeOnTerminate := True; inherited Create(False); end; { The Execute method is called when the thread starts } procedure TLesionStatThread .Execute; begin Analyze(lttestx,lBMx, lnCritX,lnPermuteX,lThreadx,lThreadStartx,lThreadEndx,lStartVoxx,lVoxPerPlankx,lImagesCountx,lControlsx,lPlankImgX,lOutImgMnx,lOutImgBMx,lOutImgTx,lOutImgAUCx,lSymptomRAx); end; procedure TLesionContinuous.Analyze (lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIN : integer; lPlankImg:bytep;lOutImgMn,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA: SingleP); //pattern variables const knPrevPattern = 10; var lPrevPatternRA: array[1..knPrevPattern] of TLesionPattern; lPattern: TLesionPattern; lPrevZValsT,lPrevZValsBM,lPrevAUCVals: array [1..knPrevPattern] of Single; lPatternPos: integer; lLesionOrderp: bytep; //standard variables var lStr: string; lObstp,lObsp: pointer; lObst,lObs: Doublep0; lT,lBMz,lDF: Double; lObsB: bytep0; lnLesion,lnNoLesion,lPosPct,lPos,lPos2,lPos2Offset,lnControl, lnControlsPlusLesion,lnControlsPlusPatients : integer; begin //statthread //init patterns lnControl := abs(lControlsIn); if lControlsIn < 0 then begin //binomial getmem(lObsB, lImagesCount+lnControl); end; lnControlsPlusPatients := lImagesCount+lnControl; for lPatternPos := 1 to knPrevPattern do lPrevPatternRA[lPatternPos] := EmptyOrder; lPatternPos := 1; //lMaxLesion := lImagesCount-lnCrit; getmem(lLesionOrderp, lImagesCount *sizeof(byte)); //now init standard variables createArray64(lObsp,lObs,lnControlsPlusPatients); lPosPct := (lThreadEnd-lThreadStart) div 100; //if lThread = 1 then // OutStr( inttostr(lThreadStart)+':'+inttostr(lThreadEnd)); //xxxxx for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; lnNoLesion := 0; for lPos := 1 to lImagesCount do begin if lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2] = 0 then begin //no lesion inc(lnNoLesion); lLesionOrderp^[lPos] := 0; lObs^[lnNoLesion-1] := lSymptomRA^[lPos]; end else begin //lesion inc(lnLesion); lLesionOrderp^[lPos] := 1; //lObs^[lImagesCount-lnLesion] := lSymptomRA^[lPos]; //note: lObs indexed from zero! lObs^[lImagesCount-lPos+lnNoLesion] := lSymptomRA^[lPos]; //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCrit) and (lnLesion > 0) {and (lnLesion <= lMaxLesion)} then begin inc(gnVoxTestedRA[lThread]); //now check if we have seen this precise lesion order recently... lPattern := SetOrderX (lLesionOrderp,lImagesCount); lPos := 1; while (lPos <= knPrevPattern) and not (SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount)) do inc(lPos); if SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount) then begin //lesion pattern is not novel if lttest then lOutImgT^[lPos2Offset] := lPrevZvalsT[lPos]; if lBM then lOutImgBM^[lPos2Offset] := lPrevZvalsBM[lPos]; if lOutImgAUC <> nil then lOutImgAUC^[lPos2Offset] := lPrevAUCvals[lPos]; end else begin //lesion pattern is novel //record novel pattern inc(lPatternPos); if lPatternPos > knPrevPattern then lPatternPos := 1; lPrevPatternRA[lPatternPos] := lPattern; lnControlsPlusLesion := lnControlsPlusPatients; if (lControlsIn > 0) {and (lnLesion > 0)} then begin //anaCOm createArray64(lObstp,lObst,lImagesCount); for lPos := 1 to lImagesCount do lObst^[lPos-1] := lObs^[lPos-1]; for lPos := 1 to lnLesion do lObs^[lPos-1+lnControl] := lObst^[lPos-1+lnNoLesion]; freemem(lObstP); for lPos := 1 to lnControl do lObs^[lPos-1] := lSymptomRA^[lPos+lImagesCount]; lnControlsPlusLesion := lnControl+lnLesion; lnNoLesion := {lnNoLesion +} lnControl; end;//controls (*if lPos2 = 2570879 then begin //xxxx for lPos := 1 to lImagesCount do begin outstr(inttostr(lPos)+'>'+floattostr(lObs^[lPos-1]) ); end; end;*) if lttest then begin if lControlsIn > 0 then begin//anacom TStat2Z (lnControlsPlusLesion, lnControl {lnNoLesion},lObs,lT); (* if lPos2 = 2570879 then begin outstr( floattostr(lT)+ ' '+inttostr(lnControl)); //xxxx for lPos := 1 to lnControlsPlusLesion do begin outstr(inttostr(lPos)+', '+floattostr(lObs^[lPos-1]) ); end; end; *) end else TStat2 (lnControlsPlusLesion, lnNoLesion, lObs,lT); lOutImgT^[lPos2Offset] := lT; lPrevZValsT[lPatternPos] := lT; end; if lBM then begin tBM (lnControlsPlusLesion, lnNoLesion, lObs,lBMz,lDF); lBMz := BMzVal (lnControlsPlusPatients, lnNoLesion,lBMz,lDF); lOutImgBM^[lPos2Offset] := lBMz; lPrevZValsBM[lPatternPos] := lBMz; end; if lOutImgAUC <> nil then begin lOutImgAUC^[lPos2Offset] := continROC (lnControlsPlusLesion, lnNoLesion, lObs); lPrevAUCVals[lPatternPos] := lOutImgAUC^[lPos2Offset]; end; StatPermuteThreaded (lttest,lBM,lImagesCount, lnNoLesion,lnPermute,lThread, lObs); end; //novel lesion pattern end; //in brain mask - compute end; //for each voxel freemem(lObsP); freemem(lLesionOrderp); if lControlsIn < 0 then //binomial freemem(lObsB); end; procedure TLesionBinom.Analyze (lChi2,lLieber: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg: bytep;lOutImgMn,lOutImgL,lOutImgX,lOutImgAUC,lSymptomRA: SingleP); //procedure TLesionBinomial.Analyze (lChi2,lLieber: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgL,lOutImgX,lSymptomRA: SingleP); //pattern variables const knPrevPattern = 10; var lPrevPatternRA: array[1..knPrevPattern] of TLesionPattern; lPattern: TLesionPattern; lPrevZValsL ,lPrevAUCVals: array [1..knPrevPattern] of Single; lPatternPos: integer; lLesionOrderp: bytep; //standard variables var //lObsp: pointer; //lObs: Doublep0; lPrevZVals lObs: ByteP0; lAUC,lZ: Double; lnLesion,lPosPct,lPos,lPos2,lPos2Offset,lnVoxTested: integer; begin //Binomial StatThread //init patterns for lPatternPos := 1 to knPrevPattern do lPrevPatternRA[lPatternPos] := EmptyOrder; lPatternPos := 1; getmem(lLesionOrderp, lImagesCount *sizeof(byte)); //now init standard variables //createArray64(lObsp,lObs,lImagesCount); getmem(lObs,lImagesCount); lPosPct := (lThreadEnd-lThreadStart) div 100; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; for lPos := 1 to lImagesCount do begin if ((gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]) = 0 then begin //no lesion lObs^[lImagesCount-lPos+lnLesion] := round(lSymptomRA^[lPos]); lLesionOrderp^[lPos] := 0; end else begin //lesion inc(lnLesion); lLesionOrderp^[lPos] := 1; lObs^[lnLesion-1] := round(lSymptomRA^[lPos]); //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCrit) and (lnLesion > 0) then begin inc(gnVoxTestedRA[lThread]); //next check patterns //x lPattern := SetOrderX (lLesionOrderp,lImagesCount); lPos := 1; while (lPos <= knPrevPattern) and not (SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount)) do inc(lPos); if SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount) then begin //lesion pattern is not novel //if lChi2 then // lOutImgX^[lPos2Offset] := lPrevZvalsX[lPos]; //if lLieber then lOutImgL^[lPos2Offset] := lPrevZvalsL[lPos]; if lOutImgAUC <> nil then lOutImgAUC^[lPos2Offset] := lPrevAUCvals[lPos]; end else begin //lesion pattern is novel //record novel pattern inc(lPatternPos); if lPatternPos > knPrevPattern then lPatternPos := 1; lPrevPatternRA[lPatternPos] := lPattern; {if lChi2 then begin Chi2 (lImagesCount, lnLesion, lObs,lT); lOutImgX^[lPos2Offset] := lT;//lT; lPrevZValsX[lPatternPos] := lT; end; if lLieber then begin} Liebermeister2b(lImagesCount, lnLesion, lObs,lAUC,lZ); if lOutImgAUC <> nil then lOutImgAUC^[lPos2Offset] := lAUC; lPrevAUCVals[lPatternPos] := lAUC; lOutImgL^[lPos2Offset] := lZ; lPrevZValsL[lPatternPos] := lZ; //end; StatPermuteBinomialThreaded (lImagesCount, lnLesion,lnPermute,lThread, lObs); end; end; //in brain mask - compute end; //for each voxel freemem(lObs); freemem(lLesionOrderp) end; end. mricron-0.20120505.1~dfsg.1.orig/npm/xanacom.pas0000664000175000017500000006331011326434470020604 0ustar michaelmichaelunit anacom; interface {$H+} uses define_types,SysUtils,part,StatThds,statcr,StatThdsUtil,Brunner, DISTR,nifti_img, hdr,filename,Messages, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls,ComCtrls,ExtCtrls,Menus, overlap, ReadInt,lesion_pattern,stats,LesionStatThds,nifti_hdr, upower,firthThds,firth,IniFiles,cpucount,userdir,math, {$IFDEF FPC} LResources,gzio2, {$ELSE} gziod,associate,{$ENDIF} //must be in search path, e.g. C:\pas\mricron\npm\math {$IFNDEF UNIX} Windows, {$ENDIF} regmult,utypes; function AnacomLesionNPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun,lnControl: integer; var lSymptomRA,lControlSymptomRA: SingleP;var lFactname,lOutName: string; lttestIn,lBMIn: boolean): boolean; procedure DoAnaCOM; function readTxt (lFilename: string; var lnObservations : integer; var ldataRA1: singlep): boolean; implementation uses npmform; {$DEFINE NOTmedianfx} function AnacomLesionNPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun,lnControl: integer; var lSymptomRA,lControlSymptomRA: SingleP;var lFactname,lOutName: string; lttestIn,lBMIn: boolean): boolean; label 123,667; var lOutNameMod: string; lPlankImg: byteP; lOutImgSum,lOutImgBM,lOutImgT, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM,lCombinedSymptomRA: singleP; lPos,lPlank,lThread,lnControlsPlusPatients: integer; lVolVox,lMinMask,lMaxMask,lTotalMemory,lnPlanks,lVoxPerPlank, lThreadStart,lThreadEnd,lThreadInc,lnLesion,lnPermute, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lPosPct: int64; lT,lBMz, lSum,lThresh,lThreshBonf,lThreshPermute,lThreshNULP :double; lObsp: pointer; lObs: Doublep0; lStatHdr: TNIfTIhdr; lFdata: file; lRanOrderp: pointer; lRanOrder: Doublep0; lSave,lBM,lttest,lLtest: boolean; lnControlNeg: integer; {$IFDEF medianfx} lmedianFX,lmeanFX,lsummean,lsummedian: double; lmediancount: integer; {$ENDIF} begin lSave := true; lnControlNeg := lnControl; //negative for binomial test lttest := lttestin; lbm := lbmin; if (not (lttest)) and (not (lbm)) then begin lLtest := true; lBM := true; lnControlNeg := -lnControl; end; //lttest:= ttestmenu.checked; //lBM := BMmenu.checked; if lnControl < 1 then begin MainForm.NPMmsg('AnaCOM aborted - need data from at least 1 control individual'); exit; end; lnPermute := 0;//MainForm.ReadPermute; MainForm.NPMmsg('Permutations = ' +IntToStr(lnPermute)); MainForm.NPMmsg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lMinMask := 1; lMaxMask := lVolVox; lVoxPerPlank := kPlankSz div lImages.Count div sizeof(byte) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; MainForm.NPMmsg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); MainForm.NPMmsg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); if (lnPlanks = 1) then getmem(lPlankImg,lTotalMemory) //assumes 1bpp else getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; {$IFDEF medianfx} lsummean := 0; lsummedian:= 0; lmediancount := 0; {$ENDIF} for lPos := 1 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; lnControlsPlusPatients := lImages.Count+lnControl; createArray64(lObsp,lObs,lnControlsPlusPatients); getmem(lOutImgSum,lVolVox* sizeof(single)); getmem(lOutImgBM,lVolVox* sizeof(single)); getmem(lOutImgT,lVolVox* sizeof(single)); MainForm.InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do begin lOutImgSum^[lPos] := 0; lOutImgBM^[lPos] := 0; lOutImgT^[lPos] := 0; end; //sumptom array for lesions AND controls for lPos := 1 to lImages.Count do lObs^[lPos-1] := lSymptomRA^[lPos]; for lPos := 1 to lnControl do lObs^[lPos-1+lImages.Count] := lControlSymptomRA^[lPos]; getmem(lCombinedSymptomRA,lnControlsPlusPatients* sizeof(single)); for lPos := 1 to lnControlsPlusPatients do lCombinedSymptomRA^[lPos] := lObs^[lPos-1]; //next create permuted BM bounds if lBM then begin MainForm.NPMmsg('Generating BM permutation thresholds'); MainForm.Refresh; //for lPos := 1 to lImages.Count do // lObs^[lPos-1] := lSymptomRA^[lPos]; genBMsim (lnControlsPlusPatients, lObs); end; ClearThreadData(gnCPUThreads,lnPermute) ; for lPlank := 1 to lnPlanks do begin MainForm.NPMmsg('Computing plank = ' +Inttostr(lPlank)); MainForm.Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image //threading start lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error with TLesionContinuous.Create (MainForm.ProgressBar1,lttest,lBM,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,lnControlNeg,lPlankImg,lOutImgSum,lOutImgBM,lOutImgT,nil,lCombinedSymptomRA) do {$IFDEF FPC} OnTerminate := @MainForm.ThreadDone; {$ELSE}OnTerminate := MainForm.ThreadDone;{$ENDIF} inc(gThreadsRunning); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; //threading end lStartVox := lEndVox + 1; end; lThreshPermute := 0; lnVoxTested := SumThreadData(gnCPUThreads,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); //next report findings if lnVoxTested < 1 then begin MainForm.NPMmsg('**Error: no voxels tested: no regions lesioned in at least '+inttostr(lnCrit)+' patients**'); goto 123; end; MainForm.NPMmsg('Voxels tested = ' +Inttostr(lnVoxTested)); {$IFDEF medianfx} MainForm.NPMmsg('Average MEAN effect size = ' +realtostr((lsummean/lmediancount),3)); MainForm.NPMmsg('Average MEDIAN effect size = ' +realtostr((lsummedian/lmediancount),3)); {$ENDIF} MainForm.NPMmsg('Only tested voxels with more than '+inttostr(lnCrit)+' lesions'); //Next: save results from permutation thresholding.... //Next: save results from permutation thresholding.... lThreshBonf := MainForm.reportBonferroni('Std',lnVoxTested); //Next: NULPS if lRun > 0 then //terrible place to do this - RAM problems, but need value to threshold maps lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap2 (lImages, lnCrit,lnVoxTested,lPlankImg)); //lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap (lImages, lnCrit)); //next: save data MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save sum map lOutNameMod := ChangeFilePostfixExt(lOutName,'Sum'+lFactName,'.hdr'); if (lSave) and (lRun < 1) then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); //create new header - subsequent images will use Z-scores MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if (lSave) and (lRun < 1) and (Sum2PowerCont(lOutImgSum,lVolVox,lImages.Count)) then begin lOutNameMod := ChangeFilePostfixExt(lOutName,'Power'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); end; //MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if lttest then begin //save Ttest //next: convert t-scores to z scores if lnControl < 1 then //do not convert t-scores for anaCOM - numbers vary from voxel to voxel... for lPos := 1 to lVolVox do lOutImgT^[lPos] := TtoZ (lOutImgT^[lPos],lImages.Count-2); for lPos := 1 to lnPermute do begin lPermuteMaxT^[lPos] := TtoZ (lPermuteMaxT^[lPos],lImages.Count-2); lPermuteMinT^[lPos] := TtoZ (lPermuteMinT^[lPos],lImages.Count-2); end; lThresh := MainForm.reportFDR ('ttest', lVolVox, lnVoxTested, lOutImgT); lThreshPermute := MainForm.reportPermute('attest',lnPermute,lPermuteMaxT, lPermuteMinT); lOutNameMod := ChangeFilePostfixExt(lOutName,'attest'+lFactName,'.hdr'); if lRun > 0 then MainForm.NPMmsgAppend('AnaComthreshtt,'+inttostr(lRun)+','+inttostr(MainForm.ThreshMap(lThreshNULP,lVolVox,lOutImgT))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); if lSave then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgT,1); end; if lBM then begin //save Mann Whitney lThresh := MainForm.reportFDR ('BM', lVolVox, lnVoxTested, lOutImgBM); lThreshPermute := MainForm.reportPermute('aBM',lnPermute,lPermuteMaxBM, lPermuteMinBM); lOutNameMod := ChangeFilePostfixExt(lOutName,'aBM'+lFactName,'.hdr'); if lRun > 0 then MainForm.NPMmsgAppend('AnaCOMthreshbm,'+inttostr(lRun)+','+inttostr(MainForm.ThreshMap(lThreshNULP,lVolVox,lOutImgBM))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); if lSave then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgBM,1); end; //next: free dynamic memory 123: MainForm.FreePermute (lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); freemem(lOutImgT); freemem(lOutImgBM); freemem(lOutImgSum); freemem(lObsp); freemem(lPlankImg); freemem(lCombinedSymptomRA); MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lFactName,'.txt'); if lSave then MainForm.MsgSave(lOutNameMod); MainForm.ProgressBar1.Position := 0; exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 1 then freemem(lPlankImg); MainForm.NPMmsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; //LesionNPMAnalyze (*function readCSV2 (lFilename: string; lCol1,lCol2: integer; var lnObservations : integer; var ldataRA1,ldataRA2: singlep): boolean; const kHdrRow = 0;//1; kHdrCol = 0;//1; var lNumStr: string; F: TextFile; lTempFloat: double; lCh: char; lnFactors,MaxC,R,C:integer; lError: boolean; begin lError := false; result := false; if not fileexists(lFilename) then begin showmessage('Can not find '+lFilename); exit; end; AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //First pass: determine column height/width Reset(F); C := 0; MaxC := 0; R := 0; while not Eof(F) do begin //read next line //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if lNumStr <> '' then //july06- read data immediately prior to EOF inc(R); if (R <= (kHdrRow+1)) or (MaxC < (kHdrCol+lCol1)) or (MaxC < (kHdrCol+lCol2)) then begin showmessage('problems reading CSV - not enough columns/rows '+inttostr(lCol1)+' '+inttostr(lCol2)); exit; end; lnObservations := R -kHdrRow ; //-1: first row is header.... lnFactors := MaxC-1;// -1: first column is Y values //fx(lnObservations,lnFactors); //exit; getmem(ldataRA1,lnObservations*sizeof(single)); getmem(ldataRA2,lnObservations*sizeof(single)); //second pass Reset(F); C := 1; MaxC := 0; R := 1; lNumStr := ''; lTempfloat := 0; while not Eof(F) do begin //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin if (R > kHdrRow) and (C > kHdrCol) then begin if ((C-kHdrCol) = lCol1) or ((C-kHdrCol) = lCol2) then begin if lNumStr = '-' then begin lTempFloat := 0; end else begin //number try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except //showmessage(lNumStr); if (C-kHdrCol) = lCol1 then ldataRA1^[R-kHdrRow] := lTempFloat else if (C-kHdrCol) = lCol2 then ldataRA2^[R-kHdrRow] := lTempFloat; end; //number end; //col1 or col2 end;// else //R > 1 lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 1; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if (lNumStr <> '') and (C = lnFactors) then begin //unterminated string try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except ldataRA2^[R-1] := lTempFloat; end;//unterminated string //read finel item CloseFile(F); FileMode := 2; //Set file access to read/write result := true; end; *) function readTxt (lFilename: string; var lnObservations : integer; var ldataRA1: singlep): boolean; const kHdrRow = 0;//1; kHdrCol = 0;//1; var lCol1: integer; lNumStr: string; F: TextFile; lTempFloat: double; lCh: char; lnFactors,MaxC,R,C:integer; lError: boolean; begin lCol1:= 1; lError := false; result := false; if not fileexists(lFilename) then begin showmessage('Can not find '+lFilename); exit; end; AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //First pass: determine column height/width Reset(F); C := 0; MaxC := 0; R := 0; while not Eof(F) do begin //read next line //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if lNumStr <> '' then //july06- read data immediately prior to EOF inc(R); if (R <= (kHdrRow+1)) or (MaxC < (kHdrCol+lCol1)) then begin showmessage('problems reading CSV - not enough columns/rows '); exit; end; lnObservations := R -kHdrRow ; //-1: first row is header.... lnFactors := kHdrCol+lCol1;// -1: first column is Y values //fx(lnObservations,lnFactors); //exit; getmem(ldataRA1,lnObservations*sizeof(single)); //second pass Reset(F); C := 1; MaxC := 0; R := 1; lNumStr := ''; lTempfloat := 0; while not Eof(F) do begin //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin if (R > kHdrRow) and (C > kHdrCol) then begin if ((C-kHdrCol) = lCol1) {or ((C-kHdrCol) = lCol2)} then begin if lNumStr = '-' then begin lTempFloat := 0; end else begin //number try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except //showmessage(lNumStr); if (C-kHdrCol) = lCol1 then begin //showmessage(lNumStr); ldataRA1^[R-kHdrRow] := lTempFloat; end; {else if (C-kHdrCol) = lCol2 then ldataRA2^[R-kHdrRow] := lTempFloat;} end; //number end; //col1 or col2 end;// else //R > 1 lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 1; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; //showmessage(lNumStr+' '+inttostr(lnFactors)+' '+inttostr(C)); if (lNumStr <> '') and (C = lnFactors) then begin //unterminated string try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except //showmessage(inttostr(R)+' '+floattostr(lTempFLoat)); ldataRA1^[R] := lTempFloat; end;//unterminated string //read finel item CloseFile(F); FileMode := 2; //Set file access to read/write result := not lError; end; procedure DoAnaCOM; label 666; var lControlFilename: string; lI, lnControlObservations : integer; lControldata: singlep; //lBinomial: boolean; lFact,lnFactors,lSubj,lnSubj,lnSubjAll,lMaskVoxels,lnCrit: integer; lImageNames,lImageNamesAll: TStrings; lPredictorList: TStringList; lTemp4D,lMaskname,lOutName,lFactname: string; lMaskHdr: TMRIcroHdr; lMultiSymptomRA,lSymptomRA: singleP; begin npmform.MainForm.memo1.lines.clear; npmform.MainForm.memo1.lines.add('AnaCOM analysis requires TXT/CSV format text file.'); npmform.MainForm.memo1.lines.add('One row per control participant.'); npmform.MainForm.memo1.lines.add('First column is performance of that participant.'); npmform.MainForm.memo1.lines.add('Example file:'); npmform.MainForm.memo1.lines.add('11'); npmform.MainForm.memo1.lines.add('19'); npmform.MainForm.memo1.lines.add('2'); npmform.MainForm.memo1.lines.add('22'); npmform.MainForm.memo1.lines.add('19'); npmform.MainForm.memo1.lines.add('6'); if not MainForm.OpenDialogExecute('Select text file',false,false,'Text file (*.txt)|*.txt;*.csv') then begin showmessage('AnaCOM aborted: Control data file selection failed.'); exit; end; //if not selected lControlFilename := MainForm.OpenHdrDlg.Filename; if (not readTxt (lControlFilename, lnControlObservations,lControldata)) or (lnControlObservations < 1) then begin showmessage('Error reading file '+lControlFilename); exit; end; npmform.MainForm.memo1.lines.add('Control (n='+inttostr(lnControlObservations)+')performance ['+lControlFilename+']'); for lI := 1 to lnControlObservations do npmform.MainForm.memo1.lines.add(inttostr(lI)+' '+floattostr(lControldata^[lI])); //begin - copy lImageNamesAll:= TStringList.Create; //not sure why TStrings.Create does not work??? lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? //next, get 1st group if not MainForm.GetValX(lnSubjAll,lnFactors,lMultiSymptomRA,lImageNamesAll,lnCrit,{,binom}lPredictorList) then begin showmessage('Error with VAL file'); goto 666; end; lTemp4D := CreateDecompressed4D(lImageNamesAll); if (lnSubjAll < 1) or (lnFactors < 1) then begin Showmessage('AnaCOM error: not enough patients ('+inttostr(lnSubjAll)+') or factors ('+inttostr(lnFactors)+').'); goto 666; end; lMaskname := lImageNamesAll[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st file: '+lMaskName); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; lOutName := ExtractFileDirWithPathDelim(lMaskName)+'results'; MainForm.SaveHdrDlg.Filename := loutname; lOutName := lOutName+'.nii.gz'; if not MainForm.SaveHdrName ('Base Statistical Map', lOutName) then exit; for lFact := 1 to lnFactors do begin lImageNames.clear; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then {$ENDIF} lImageNames.Add(lImageNamesAll[lSubj-1]); lnSubj := lImageNames.Count; if lnSubj > 1 then begin getmem(lSymptomRA,lnSubj * sizeof(single)); lnSubj := 0; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then begin {$ELSE} begin{$ENDIF} inc(lnSubj); lSymptomRA^[lnSubj] := lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)]; end; MainForm.NPMmsgClear; MainForm.NPMMsg(MainForm.GetKVers); MainForm.NPMMsg('Threads: '+inttostr(gnCPUThreads)); npmform.MainForm.memo1.lines.add('Control (n='+inttostr(lnControlObservations)+')performance ['+lControlFilename+']'); for lI := 1 to lnControlObservations do npmform.MainForm.memo1.lines.add(inttostr(lI)+' '+floattostr(lControldata^[lI])); lFactName := lPredictorList.Strings[lFact-1]; lFactName := LegitFilename(lFactName,lFact); MainForm.NPMMsg('Patient performance, (n= '+inttostr(lnSubj)+') Factor = '+lFactname); For lSubj := 1 to lnSubj do MainForm.NPMMsg (lImageNames.Strings[lSubj-1] + ' = '+realtostr(lSymptomRA^[lSubj],2) ); MainForm.NPMMsg('Total voxels = '+inttostr(lMaskVoxels)); MainForm.NPMMsg('Only testing voxels damaged in at least '+inttostr(lnCrit)+' individual[s]'); MainForm.NPMMsg('Number of Lesion maps = '+inttostr(lnSubj)); if not CheckVoxelsGroup(lImageNames,lMaskVoxels) then begin showmessage('File dimensions differ from mask.'); goto 666; end; MainForm.ReportDescriptives(lSymptomRA,lnSubj); AnacomLesionNPMAnalyze(lImageNames,lMaskHdr,lnCrit,-1,lnControlObservations,lSymptomRA,lControldata,lFactName,lOutname,true {ttest},false{BM}); Freemem(lSymptomRA); end; //lnsubj > 1 end; //for each factor if lnSubjAll > 0 then Freemem(lMultiSymptomRA); 666: lImageNames.Free; lImageNamesAll.Free; lPredictorList.Free; DeleteDecompressed4D(lTemp4D); freemem(lControldata); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/windowsxp.res0000664000175000017500000000134007374562764021241 0ustar michaelmichael џџџџŸ џџџџ0  Windows Shell mricron-0.20120505.1~dfsg.1.orig/npm/Vector.pas0000664000175000017500000004331711326434470020425 0ustar michaelmichaelunit Vector; interface uses SysUtils; //var gMat: boolean = false; type EVectorSizeError = class (Exception); TMatElement = double; //extended; { The 1000 in the array types below does not impose a limit at runtime! If you compile with range checking on then the compiled code will impose an effective limit of 1000, but with range checking off the size of vector is limited to 64K under 16bit OS or *much* greater under 32bit OS } TArrayd = array[1..1000] of TMatElement; pTArrayd = ^TArrayd; TArrayi = array[1..1000] of integer; pTArrayi = ^TArrayi; { Define a dynamic array type for holding integers } TVectori = class (TObject) private s : integer; { size of vector } vx : pTArrayi; { pointer to the data } private procedure SetSize (NewSize : integer); public constructor create (i : integer); virtual; destructor destroy; override; procedure EnlargeBy (n : integer); procedure ReduceBy (n : integer); procedure Enlarge; procedure Reduce; procedure Zero; procedure Clear; procedure Assign (v : TVectori); procedure Setval (i : integer; v : integer); function Getval (i : integer) : integer; function GetSize : integer; property Elem[x : Integer] : integer read GetVal write SetVal; default; property Size : integer read s; end; { Define a dynamic array type for holding Extendeds } TVector = class (TObject) private s : integer; { size of vector } vx : pTArrayd; { pointer to the data } Tmp : boolean; { set to true if temporary } public { Declare as a class method, saves having a self variable } class function Dot (u, v : TVector) : TMatElement; constructor create (i : integer); virtual; constructor createTmp (i : integer); destructor destroy; override; procedure FreeSpace; procedure SetSize (i : integer); procedure EnlargeBy (n : integer); procedure ReduceBy (n : integer); procedure Enlarge; procedure Reduce; procedure Zero; procedure Clear; procedure Setval (i : integer; v : TMatElement); function Getval (i : integer) : TMatElement; property Elem[x : Integer] : TMatElement read GetVal write SetVal; default; property Size : integer read s; procedure Assign (v : TVector); function Add (v, u : TVector) : TVector; function Sub (v, u : TVector) : TVector; class function xAdd (v, u : TVector) : TVector; class function xSub (v, u : TVector) : TVector; function DotU (v : TVector) : TMatElement; function CrossU (v : TVector) : TVector; function Cross (v1, v2 : TVector) : TVector; function Sum : TMatElement; function Mean : TMatElement; function SumofSquares : TMatElement; function Norm : TMatElement; function StdDev : TMatElement; procedure Scale (factor : TMatElement); end; implementation // ------------------------------------------------------------------------- // START OF VECTOR TYPE IMPLEMETATION // ------------------------------------------------------------------------- { The data space which holds the data for a vector is typed as [1..x] so that indexing autmatically starts at one, therefore there is no need in the following code to add 1 to the size of the vector when creating or destroying it } { Create a vector of size i } constructor TVector.create(i : integer); begin Inherited Create; s := 0; vx := Nil; { vx set to Nil to indicate empty vector, used by SetSize } if i > 0 then Self.SetSize (i); end; constructor TVector.createTmp (i : integer); begin Inherited Create; s := 0; vx := Nil; { vx set to Nil to indicate empty vector, used by SetSize } if i > 0 then Self.SetSize (i); Tmp := true; end; destructor TVector.destroy; begin FreeSpace; Inherited Destroy; end; { Private internal procedure } procedure TVector.FreeSpace; begin if vx <> Nil then FreeMem (vx, sizeof (TMatElement) * s); vx := Nil; s := 0; end; { Internal routine to allocate space. If space already exists then it frees it first } procedure TVector.SetSize (i : integer); begin if vx <> Nil then FreeMem (vx, sizeof (TMatElement) * s); s := i; vx := AllocMem (sizeof (TMatElement) * s); //if gMat then beep; end; { Increase the size of the vector without destroying and existing data } procedure TVector.EnLargeBy (n : integer); begin if n < 0 then raise EVectorSizeError.Create ('Argument to EnLargeBy must be positive'); ReAllocMem (vx, sizeof (TMatElement)*(s+n)); inc (s,n); { Modified for D2 } end; { Reduce the size of the vector } procedure TVector.ReduceBy (n : integer); begin if n >= s then raise EVectorSizeError.Create ('Can''t reduce size of vector to below zero elements'); ReAllocMem (vx, sizeof (TMatElement)*(s-n)); dec (s,n); { modified for D2 } end; { Enlarge the vector by one element without destroying any existing data } procedure TVector.Enlarge; begin ReAllocMem (vx, sizeof (TMatElement)*(s+1)); inc (s); { Modified for D2 } end; { Reduce the vector by one element, the top most element is destroyed } procedure TVector.Reduce; begin ReAllocMem (vx, sizeof (TMatElement)*(s-1)); dec (s); { Modified for D2 } end; { Clears the vector, sets all elements to zero } procedure TVector.Zero; var i : integer; begin for i := 1 to s do vx^[i] := 0.0; end; { Clears the vector, sets all elements to zero } procedure TVector.Clear; begin Zero; end; { used internally but is also accessible from the outside } procedure TVector.Setval (i : integer; v : TMatElement); begin vx^[i] := v; end; { used internally but is also accessible from the outside } function TVector.Getval (i : integer) : TMatElement; begin result := vx^[i]; end; // ------------------------------------------------------------------------- // Copies vector v, including contects to self. If self is not the same // size as v then self is resized // Copy v to u: // Usage: u.Assign (v) // ------------------------------------------------------------------------- procedure TVector.Assign (v : TVector); begin v.Tmp := False; { just in case its a temporary variable } if v.s <> Self.s then Self.SetSize (v.s); move (v.vx^, Self.vx^, sizeof(TMatElement) * s) end; // ------------------------------------------------------------------------- // Add the vectors, 'v' and 'u' together to produce Self. Error if v and u are // the the same size. If Self is not sized correctly, then Add will resize Self // Usage: w.Add (u, v) // Add u to v giving result w // ------------------------------------------------------------------------- function TVector.Add (v, u : TVector) : TVector; var i : integer; begin if v.s <> u.s then raise EVectorSizeError.Create ('Vectors must be the same size to sum them'); if Self.s <> v.s then Self.SetSize (v.s); for i := 1 to v.s do Self[i] := v[i] + u[i]; if v.tmp then v.free; if u.tmp then u.free; result := Self; end; // ------------------------------------------------------------------------- // Add the vectors, 'v' and 'u' together and RETURN the result. An Error // occurs if v and u are the the same size. xAdd returns the result to the // caller therefore it is the responsibility of the caller to dispose of the // memory allocated by xSub. Note, the variable which is used to store the // returned result must not have been previously allocated, otherwise you'll // get memory leak! // w must be unallocated // Usage: w := Add (u, v) // Add u to v giving result w // ------------------------------------------------------------------------- class function TVector.xAdd (v, u : TVector) : TVector; var i : integer; t : TVector; begin if v.s <> u.s then raise EVectorSizeError.Create ('Vectors must be the same size to sum them'); t := TVector.CreateTmp (v.s); for i := 1 to v.s do t[i] := v[i] + u[i]; result := t; end; // ------------------------------------------------------------------------- // Subtract the vectors, 'v' and 'u' together to produce Self. Error if v and u are // the the same size. If Self is not sized correctly, then Add will resize Self // Usage: w.Sub (u, v) // Add u to v giving result w // ------------------------------------------------------------------------- function TVector.Sub (v, u : TVector) : TVector; var i : integer; begin if v.s <> u.s then raise EVectorSizeError.Create ('Vectors must be the same size to subtract them'); if Self.s <> v.s then Self.SetSize (v.s); for i := 1 to v.s do Self[i] := v[i] - u[i]; if v.tmp then v.free; if u.tmp then u.free; result := Self; end; // ------------------------------------------------------------------------- // Subtract the vectors, 'v' and 'u' together and RETURN the result. An Error // occurs if v and u are the the same size. xSub returns the result to the // caller therefore it is the responsibility of the caller to dispose of the // memory allocated by xSub. Note, the variable which is used to store the // returned result must not have been previously allocated, otherwise you'll // get memory leak! // w must be unallocated // Usage: w := Sub (u, v) // Add u to v giving result w // ------------------------------------------------------------------------- class function TVector.xSub (v, u : TVector) : TVector; var i : integer; t : TVector; begin if v.s <> u.s then raise EVectorSizeError.Create ('Vectors must be the same size to subtract them'); t := TVector.CreateTmp (v.s); for i := 1 to v.s do t[i] := v[i] - u[i]; result := t; end; // ------------------------------------------------------------------------- // Compute the dot product of vectors 'u' and 'v' // Usage: d := dot (u, v); // ------------------------------------------------------------------------- class function TVector.Dot (u, v : TVector) : TMatElement; var i : integer; begin if u.Size <> v.Size then raise EVectorSizeError.Create ('Vectors must be of the same size to compute dot product'); result := 0.0; for i := 1 to u.Size do result := result + u[i]*v[i]; end; // ------------------------------------------------------------------------- // Apply a dot product to Self and argument, 'v' // Usage: d := u.dotU (v); // ------------------------------------------------------------------------- function TVector.DotU (v : TVector) : TMatElement; var i : integer; begin if Self.Size <> v.Size then raise EVectorSizeError.Create ('Vectors must be of the same size to compute dot product'); result := 0.0; for i := 1 to Self.Size do result := result + Self[i]*v[i]; end; // ------------------------------------------------------------------------- // Compute the cross product of Self and vector 'v', replacing Self // Usage: v.CrossU (u) // ------------------------------------------------------------------------- function TVector.CrossU (v : TVector) : TVector; begin if (v.Size = 3) and (Self.Size = 3) then begin Self[1] := Self[2]*v[3] - Self[3]*v[2]; Self[2] := Self[3]*v[1] - Self[1]*v[3]; Self[3] := Self[1]*v[2] - Self[2]*v[1]; result := Self; end else raise EVectorSizeError.Create ('Cross product can only be calculated for vectors in 3D'); end; // ------------------------------------------------------------------------- // Compute the cross product of 'v1' and vector 'v2' giving Self // Usage: v.Cross (v1, v2) // ------------------------------------------------------------------------- function TVector.Cross (v1, v2 : TVector) : TVector; begin if (v1.Size = 3) and (v2.Size = 3) and (Self.Size = 3) then begin Self[1] := v1[2]*v2[3] - v1[3]*v2[2]; Self[2] := v1[3]*v2[1] - v1[1]*v2[3]; Self[3] := v1[1]*v2[2] - v1[2]*v2[1]; result := Self; end else raise EVectorSizeError.Create ('Cross product can only be calculated for vectors in 3D'); end; // ------------------------------------------------------------------------- // Returns the sum of values in the vector // Usage: total := v.sum // ------------------------------------------------------------------------- function TVector.Sum : TMatElement; var i : integer; begin result := 0.0; for i := 1 to s do result := result + vx^[i]; end; // ------------------------------------------------------------------------- // Returns the mean of the elements of the vector // Usage: average := v.mean; // ------------------------------------------------------------------------- function TVector.Mean : TMatElement; begin if s > 0 then result := sum / s else raise Exception.Create ('Vector must have at least one element to compute mean'); end; // ------------------------------------------------------------------------- // Returns the sum of the squares of values in Data // Usage: s := v.SumOfSquares; // ------------------------------------------------------------------------- function TVector.SumOfSquares : TMatElement; var i : integer; begin result := 0.0; for i := 1 to s do result := result + sqr(vx^[i]); end; // ------------------------------------------------------------------------- // Returns the Euclidean norm of the Self vector // ------------------------------------------------------------------------- function TVector.Norm : TMatElement; begin result := sqrt (Self.SumOfSquares); end; // ------------------------------------------------------------------------- // Returns the sample standard deviation // Usage: sd := v.StdDev; // ------------------------------------------------------------------------- function TVector.StdDev : TMatElement; var sq, total : TMatElement; i : integer; begin sq := 0; total := 0; if s > 1 then begin for i := 1 to s do begin sq := sq + sqr(vx^[i]); total := total + vx^[i]; end; result := sqrt ((sq - sqr(total)/s)/(s-1)); // The following code is easier to read but slightly slower in execution: // result := sqrt ((SumOfSquares - sqr (sum)/s)/(s-1));} end else raise Exception.Create ('Can''t calculate stddev for vector with one or no elements'); end; // ------------------------------------------------------------------------- // Scale the vector by factor // Usage: v.Scale (2) Multiplies all elements by 2 // ------------------------------------------------------------------------- procedure TVector.Scale (factor : TMatElement); var i : integer; begin for i := 1 to s do vx^[i] := vx^[i]*factor; end; { ------------------------------------------------------------------------- } { START OF INTEGER VECTOR IMPLEMETATION } { ------------------------------------------------------------------------- } { Create a vector of size i } constructor TVectori.create(i : integer); begin Inherited Create; vx := Nil; Self.SetSize (i); end; destructor TVectori.destroy; begin if vx <> Nil then FreeMem (vx, sizeof (integer) * s); Inherited Destroy; end; { Internal routine used by define } procedure TVectori.SetSize (NewSize : integer); begin if vx <> Nil then FreeMem (vx, sizeof (integer) * s); s := NewSize; vx := AllocMem (sizeof (integer) * NewSize); end; procedure TVectori.EnLargeBy (n : integer); begin ReAllocMem (vx, sizeof (integer)*(s+n)); inc (s,n); { Modified for D2 } end; procedure TVectori.ReduceBy (n : integer); begin if n >= s then raise EVectorSizeError.Create ('Can''t reduce size of vector to below zero elements'); ReAllocMem (vx, sizeof (integer)*(s-n)); dec (s,n); { Modified for D2 } end; { Enlarge the vector by one element without destroying any existing data } procedure TVectori.Enlarge; begin ReAllocMem (vx, sizeof (integer)*(s+1)); inc (s); { Modified for D2 } end; { Reduce the vector by one element, the top most element is destroyed } procedure TVectori.Reduce; begin ReAllocMem (vx, sizeof (integer)*(s-1)); dec (s); { Modified for D2 } end; { Clear the vector, sets all elements to zero } procedure TVectori.Zero; var i : integer; begin for i := 1 to s do vx^[i] := 0; end; { Clear the vector, sets all elements to zero } procedure TVectori.Clear; begin Zero; end; procedure TVectori.Assign (v : TVectori); begin if v.s <> Self.s then Self.SetSize (v.s); move (v.vx^, Self.vx^, sizeof(integer) * s) end; { used internally but is also accessible from the outside } procedure TVectori.Setval (i : integer; v : integer); begin vx^[i] := v; end; { used internally but is also accessible from the outside } function TVectori.Getval (i : integer) : integer; begin result := vx^[i]; end; function TVectori.GetSize : integer; begin result := s; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/valformat.pas0000664000175000017500000002364611326434470021161 0ustar michaelmichaelunit valformat; {$H+} interface uses {$IFNDEF UNIX} Windows,{Registry,ShlObj,}{$ENDIF} Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, Menus, ToolWin, ComCtrls, Buttons,Clipbrd, StdCtrls, Spin,define_types,npmform; const {$IFDEF FPC} kNaN = -maxint; {$ELSE} kNaN : double = 1/0; {$ENDIF} kVALNativeSignatureBase = '#Version:'; kValMaxVers = 1; //version 0 = 3D, version 1 = 4D, version 2 not yet supported kTxtExt = '.txt'; kVALNativeExt = '.val'; kValFilter = 'Text description (*.val)|*.val'; function RowColPos (lRow,lCol,lnCol: integer): integer; function OpenValFile (var lFilename,lTemplateName:string; var lnRow,lnCol,lnColWObs,lnCritPct: integer; var lDesignUnspecified : boolean; var lPredictorList,lFileList:TStringList; var lDoublePtr: Pointer): boolean; function GetValCore (var lVALFilename:string; var lnSubj, lnFactors: integer; var lSymptomRA: singleP; var lImageNames: TStrings; var lCrit,lCritPct: integer; {lBinomial : boolean;} var lPredictorList: TStringList):boolean; implementation procedure MsgX (lStr: string); begin //output something here showmessage(lStr); end; function VALNativeSignature (lStr: string): boolean; var lP,lLen: integer; lVers: string; begin result := false; lLen := length(lStr); if lLen < (length(kVALNativeSignatureBase)+1) then exit; for lP := 1 to length(kVALNativeSignatureBase) do if lStr[lP] <> kVALNativeSignatureBase[lP] then exit; //VAL format, but can we read this version? for lP := (length(kVALNativeSignatureBase)+1) to lLen do lVers := lVers + lStr[lP]; if strtoint(lVers) <= kValMaxVers then result := true; end; function ReadTabStr (var lStr: string; var lPos: integer): string; var lLen: integer; begin result := ''; if lPos < 1 then lPos := 1; lLen := length(lStr); while (lPos <= lLen) and (lStr[lPos] <> kTab) do begin result := result + lStr[lPos]; inc(lPos); end; inc(lPos); end; function RowColPos (lRow,lCol,lnCol: integer): integer; begin result := ((lRow-1{alfa})*lnCol)+lCol; end; //Replicates Readln, but works for Unix files... Delphi 4's readln fails for non-MSDOS EOLs procedure ReadlnX (var F: TextFile; var lResult: string); var lCh: char; begin lResult := ''; while not Eof(F) do begin Read(F, lCh); if (lCh in [#10,#13]) then begin if lResult <> '' then begin //Showmessage(lResult); exit; end; end else lResult := lResult + lCh; end; end; //ReadlnX function OpenValFile (var lFilename,lTemplateName:string; var lnRow,lnCol,lnColwObs,lnCritPct: integer; var lDesignUnspecified : boolean; var lPredictorList,lFileList:TStringList; var lDoublePtr: Pointer): boolean; var lNumStr,lStr,lExt,lPrevNumStr,lCmdStr: string; F: TextFile; lTempFloat: double; lCh: char; lPos,MaxC,R,C:integer; lDoubleBuf: DoubleP; lError: boolean; lDecimalSep: char; begin lnRow := 0; lnCol := 0; result := false; if not fileexists(lFilename) then exit; lError:= false; lnCritPct := 0; lExt := StrLower(PChar(extractfileext(lFilename))); if (lExt = kTxtExt) or (lExt = kVALNativeExt) then else begin Showmessage('This version is unable to recognize the extension of the file: '+lFilename); exit; end; lDecimalSep := DecimalSeparator; DecimalSeparator := '.'; AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //First pass: determine column height/width Reset(F); C := 0; MaxC := 0; R := 0; if lExt = kVALNativeExt then begin ReadlnX(F,lStr);//Version if not VALNativeSignature(lStr) then begin showmessage('This software can not read this file. Perhaps you need to upgrade your software. The first line should read "'+kVALNativeSignatureBase+'x" where "x" is <'+inttostr(kValMaxVers+1)); CloseFile(F); FileMode := 2; //Set file access to read/write exit; end; lDesignUnspecified := false; lStr := '#'; while (length(lStr)> 0) and (lStr[1] = '#') and (not Eof(F)) do begin ReadlnX(F,lStr); lPos := 0; //start at beginning of line lCmdStr := ReadTabStr(lStr,lPos); if lCmdStr = '#Template' then lTemplateName := ReadTabStr(lStr,lPos); if lCmdStr = '#CritPct' then lnCritPct := StrToInt(ReadTabStr(lStr,lPos)); end; if (length(lStr)> 0) and (lStr[1] = '#') then showmessage(lCmdStr); end else begin lnCritPct := 0; lDesignUnspecified := true; lTemplateName := '-'; end;//Ext=native version Reset(F); while not Eof(F) do begin //read next line //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9]) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if lNumStr <> '' then //july06- read data immediately prior to EOF inc(R); lnRow:= R; lnCol := MaxC-1; lnColWObs := lnCol+1; getmem(lDoublePtr,(lnRow*lnColWObs* sizeof(double))+16); {$IFDEF FPC} lDoubleBuf := align(lDoublePtr,16); {$ELSE} //lDoubleBuf := DoubleP((integer(lDoublePtr) and $FFFFFFF0)+16); lDoubleBuf := DoubleP($fffffff0 and (integer(lDoublePtr)+15)); {$ENDIF} for C := 1 to (lnRow*lnColWObs) do lDoubleBuf^[C] := 0; //Second pass: fill values Reset(F); C := 0; MaxC := 0; R := 1; lNumStr := ''; while not Eof(F) do begin //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9]) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin //read current entry if R = 1 then begin //1st Row if C > 0 then lPredictorList.Add( lNumStr) end else if C = 0 then begin //1st Row //showmessage(lNumStr); lFileList.Add( lNumStr) end else begin //note: below -1 as we strip first header row for predictor names if lNumStr = '-' then begin lDoubleBuf^[RowColPos (R-1{ july 06 alfa},C,lnColWObs)] := 0; end else begin //number try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading VAL file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := knan; end; end; lDoubleBuf^[RowColPos (R-1{ july 06 alfa},C,lnColWObs)] := lTempFloat;//DataGrid.Cells[ C, kMaxFactors+R-1 ] := (lNumStr) ; end; end; lPrevNumStr := lNumStr; lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if (lNumStr <> '') and (C>0) then //alfa read data immediately prior to EOF lDoubleBuf^[RowColPos (R-1{alfa},C,lnColWObs)] := strtofloat(lNumStr); CloseFile(F); FileMode := 2; //Set file access to read/write result := true; DecimalSeparator := lDecimalSep; //fx(lPredictorList.Count,lnCol); if lPredictorList.Count < lnCol then begin for C := (lPredictorList.Count+1) to lnCol do lPredictorList.Add('Predictor'+inttostr(C)); end; end; function GetValCore (var lVALFilename:string; var lnSubj, lnFactors: integer; var lSymptomRA: singleP; var lImageNames: TStrings; var lCrit,lCritPct: integer; {lBinomial : boolean;} var lPredictorList: TStringList):boolean; //warning: you MUST free lPredictorList var lTemplateName: string; lnRow,lCol,lnColWObs,lInc,lRow: integer; lDesignUnspecified : boolean; lFileList:TStringList; lInRA: DoubleP0; lInP: Pointer; begin lPredictorList := TStringList.Create; result := false; lnSubj := 0; if not Fileexists(lVALFilename) then begin MsgX('NPM aborted: VAL file selection failed:' +lValFilename); exit; end; //if not selected lFileList := TStringList.Create; //MsgX( 'VAL filename: '+lVALFilename); if not OpenValFile (lVALFilename,lTemplateName, lnRow,lnFactors,lnColWObs,lCritPct, lDesignUnspecified,lPredictorList,lFileList, lInP) then exit; if lnRow > 1 then begin lnSubj := lnRow -1; //top row is predictor {$IFDEF FPC} lInRA := align(lInP,16); {$ELSE} lInRA := DoubleP0($fffffff0 and (integer(lInP)+15)); {$ENDIF} getmem(lSymptomRA,lnSubj*lnFactors* sizeof(single)); for lCol := 1 to lnFactors do begin for lRow := 1 to lnSubj do begin lSymptomRA^[lRow+ ((lCol-1)*lnSubj)] := lInRA^[(lRow*lnColWObs)-lnColWObs-1+lCol]; end; end; for lInc := 1 to lnSubj do lImageNames.add(ExtractFileDirWithPathDelim(lVALFilename)+lFileList.Strings[lInc-1]); //end reverse end; //for lRow = each subject lFileList.free; Freemem(lInP); lCrit := round( (lnSubj*lCritPct)/100); result := true; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/upower.pas0000664000175000017500000001173211326434470020500 0ustar michaelmichaelunit upower; interface uses define_types, statcr, distr, dialogs; function Sum2Power(lOutImgSum: SingleP; lVolVox,lnTotal,lnDeficit: integer; lBinomial: boolean): boolean; function Sum2PowerCont(lOutImgSum: SingleP; lVolVox,lnTotal: integer): boolean; function Sum2PowerBinom(lOutImgSum: SingleP; lVolVox,lnTotal,lnDeficit: integer): boolean; function k_out_n (k,n: integer): double; //total possible permutations implementation function k_out_n (k,n: integer): double; //total possible permutations //k= smaller group, n=sum of both groups begin if not gFactRAready then InitFact; result := round(gFactRA[n] / (gFactRA[k]*gFactRA[n-k] ) ); // k out n = n!/(k!*(n-k)! which is equal to the PROD(i=k; 1){(n-i+1)/i} end; //k_out_n function Sum2Power(lOutImgSum: SingleP; lVolVox,lnTotal,lnDeficit: integer; lBinomial: boolean): boolean; begin if lBinomial then result := Sum2PowerBinom(lOutImgSum, lVolVox,lnTotal,lnDeficit) else result := Sum2PowerCont(lOutImgSum, lVolVox,lnTotal) end; function Sum2PowerCont(lOutImgSum: SingleP; lVolVox,lnTotal: integer): boolean; //convert Sum image to power map showing maximum possible effect size //'Cont' version is for continuous data var lDensity,lN,lRank: integer; lDensityPowerRA: singleP; begin result := false; if (lnTotal < 2) or (lVolVox < 1) then exit; getmem(lDensityPowerRA,lnTotal* sizeof(single)); //no need to compute power for [lnTotal] and [0] - no variability when everyone or no one has a lesion //lDensityPowerRA[lnTotal] := 0; //everyone has a lesion = no variability lRank := 0; for lN := 1 to (lnTotal -1) do begin //most power when all participants with a lesion have most extreme behavioural data //therefore, they will have the lowest ranks: rank 1,2,3,4 lRank := lRank + lN; if (lnTotal > 360) then //cannot calculate values this large... lDensityPowerRA^[lN] := 0 else if (lN > 10) and (lnTotal > 64) then //avoid overflow... lDensityPowerRA^[lN] := pNormalInv ( 1/(k_out_n(10,lnTotal)) ) else begin lDensityPowerRA^[lN] := 1/(k_out_n(lN,lnTotal)); //compute Wilcoxon probability lDensityPowerRA^[lN] := pNormalInv (lDensityPowerRA^[lN]);//convert p to z-score end; //max power when every possible person with a lesion has a defict, and everyone w/o lesion does not... //lDensityPowerRA[lN] := Liebermeister (lLD,lnoLD,lLnoD,lnoLnoD); //probability of this observation //lDensityPowerRA[lN] := pNormalInv (lDensityPowerRA[lN]);//convert p to z-score //fx(lDensityPowerRA[lN]); end; //now use lookup table to convert overlay density to effective power for lN := 1 to lVolVox do begin lDensity := round( lOutImgSum^[lN]); if (lDensity > 0) and (lDensity < lnTotal) then lOutImgSum^[lN] := lDensityPowerRA^[lDensity] else lOutImgSum^[lN] := 0; end; //for each voxel freemem(lDensityPowerRA); result := true; end; function Sum2PowerBinom(lOutImgSum: SingleP; lVolVox,lnTotal,lnDeficit: integer): boolean; //convert Sum image to power map showing maximum possible effect size var lDensity,lN,lLD,lLnoD,lnoLD,lnoLnoD: integer; lDensityPowerRA: singleP; begin result := false; if (lnTotal < 2) or (lnDeficit < 1) or (lVolVox < 1) then exit; if(lnDeficit >= lnTotal) then begin showmessage('Sum2Power error: people with deficit must be less than sample size'); exit; end; getmem(lDensityPowerRA,lnTotal* sizeof(single)); //no need to compute power for lnTotal and 0 - no variability when everyone or no one has a lesion //lDensityPowerRA[lnTotal] := 0; //everyone has a lesion = no variability for lN := 1 to (lnTotal -1) do begin //max power when every possible person with a lesion has a defict, and everyone w/o lesion does not... if lN > lnDeficit then begin lLD := lnDeficit; lLnoD := lN - lnDeficit; end else begin lLD := lN; lLnoD := 0; end; lnoLD := lnDeficit-lLD; //number of people with deficit who do not have a lesion - as close to zero as possible lnoLnoD := lnTotal-lnoLD-lLnoD-lLD; lDensityPowerRA^[lN] := Liebermeister (lLD,lnoLD,lLnoD,lnoLnoD); //probability of this observation lDensityPowerRA^[lN] := pNormalInv (lDensityPowerRA^[lN]);//convert p to z-score //fx(lLD,lnoLD,lLnoD,lnoLnoD,lDensityPowerRA[lN]); end; //now use lookup table to convert overlay density to effective power for lN := 1 to lVolVox do begin lDensity := round( lOutImgSum^[lN]); if (lDensity > 0) and (lDensity < lnTotal) then lOutImgSum^[lN] := lDensityPowerRA^[lDensity] else lOutImgSum^[lN] := 0; end; //for each voxel freemem(lDensityPowerRA); result := true; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/turbolesion.pas0000664000175000017500000005234711477153772021545 0ustar michaelmichaelunit turbolesion; interface {$H+} uses define_types,SysUtils, part,StatThds,statcr,StatThdsUtil,Brunner,DISTR,nifti_img, hdr, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,ExtCtrls,Menus, overlap,ReadInt,lesion_pattern,stats,LesionStatThds,nifti_hdr, {$IFDEF FPC} LResources,gzio2, {$ELSE} gziod,associate,{$ENDIF} //must be in search path, e.g. C:\pas\mricron\npm\math {$IFNDEF UNIX} Windows, {$ENDIF} upower,firthThds,firth,IniFiles,cpucount,userdir,math, regmult,utypes; Type TLDMPrefs = record NULP,BMtest,Ttest,Ltest: boolean; CritPct,nCrit,nPermute,Run: integer; ValFilename, OutName, ExplicitMaskName: string; end; function TurboLDM (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; var lPrefs: TLDMPrefs ; var lSymptomRA: SingleP;var lFactname,lOutName: string): boolean; implementation uses npmform; (*procedure Debog (var lSumImg: Smallintp; lVox: integer); var lInName : string; lFData: file; begin lInName := 'c:\16.img'; assignfile(lFdata,lInName); filemode := 2; Rewrite(lFdata,lVox*sizeof(smallint)); BlockWrite(lFdata,lSumImg^, 1 {, NumWritten}); closefile(lFdata); end;*) function MakeSum (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; var lSumImg: Smallintp): boolean; //if successful, you MUST freemem(lSumImg)... label 667; var lVolVox,lVox,lImg,lPosPct: integer; lVolImg: byteP; begin result := false; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then exit; getmem(lVolImg,lVolVox* sizeof(byte)); getmem(lSumImg,lVolVox* sizeof(smallint)); for lVox := 1 to lVolVox do //June 2009 init array lSumImg^[lVox] := 0; (* for lVox := 1 to lVolVox do if lVolImg^[lVox] <> 0 then lSumImg^[lVox] := lSumImg^[lVox]+1;*) for lImg := 1 to lImages.Count do begin lPosPct := round(100*(lImg / lImages.Count)); MainForm.ProgressBar1.Position := lPosPct; Application.Processmessages; if not LoadImg8(lImages[lImg-1], lVolImg, 1, lVolVox,round(gOffsetRA[lImg]),1,gDataTypeRA[lImg],lVolVox) then goto 667; for lVox := 1 to lVolVox do if lVolImg^[lVox] <> 0 then lSumImg^[lVox] := lSumImg^[lVox]+1; end;//for each image MainForm.NPMmsg('Sum image finished = ' +TimeToStr(Now)); MainForm.ProgressBar1.Position := 0; //Debog(lSumImg, lVolVox); freemem(lVolImg); result := true; exit; 667: //you only get here if you aborted ... free memory and report error freemem(lVolImg); freemem(lSumImg); MainForm.NPMMsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; function ThreshSumImg (var lSumImg: Smallintp; lVolVox,lThresh: integer): integer; //sets all voxels with values < lThresh to zero, returns number of voxels to survive threshold. var lPos: integer; begin result := 0; if lVolVox < 1 then exit; for lPos := 1 to lVolVox do if lSumImg^[lPos] < lThresh then lSumImg^[lPos] := 0 else inc(result); end; function ExplicitMaskSumImg (lMaskName: string; var lSumImg: Smallintp; lVolVox: integer): integer; //Any voxels in MaskImg that are 0 are zeroed in the SumImg var lOK: boolean; lPos: integer; lMaskHdr: TMRIcroHdr; lMaskData: bytep; label 666; begin result := 0; if (lVolVox < 1) or (not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr)) then begin MainForm.NPMmsg('Error: unable to load explicit mask named '+lMaskName); exit; end; if lVolVox <> (lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]) then begin MainForm.NPMmsg('Error: data and explicit mask have different sizes '+lMaskName); exit; end; getmem(lMaskData,lVolVox* sizeof(byte)); lOK := LoadImg8(lMaskName, lMaskData, 1, lVolVox,round(lMaskHdr.NIFTIhdr.vox_offset),1,lMaskHdr.NIFTIhdr.DataType,lVolVox); if not lOK then goto 666; if lVolVox < 1 then exit; for lPos := 1 to lVolVox do if lMaskData^[lPos] < 1 then lSumImg^[lPos] := 0 else inc(result); 666: freemem(lMaskData); end; function LoadImg8Masked(lInName: string; lImgData: bytep; lMaskData: SmallIntP; lStartMaskPos, lEndMaskPos,linvox_offset,lRApos,lDataType,lVolVox: integer): boolean; label 111; var lFullImgData: bytep; lMaskPos,lPos: integer; begin result := false; if (lVolVox < 1) or (lEndMaskPos < lStartMaskPos) then exit; getmem(lFullImgData,lVolVox* sizeof(byte)); result := LoadImg8(lInName, lFullImgData, 1, lVolVox,linvox_offset,1,lDataType,lVolVox); if result then begin lMaskPos := 0; for lPos := 1 to lVolVox do begin if lMaskData^[lPos] <> 0 then begin inc(lMaskPos); if (lMaskPos >=lStartMaskPos) then lImgData^[lRApos+lMaskPos-1] := lFullImgData^[lPos]; if lMaskPos = lEndMaskPos then goto 111; end;//voxel in mask end; //for each voxel in image end;//if LoadImg8 success 111: freemem(lFullImgData); end; function reformat(var lStatImg: singlep; lMaskImg: smallintp; lVolVox: integer): boolean; var lPos,lStatPos,lMaskItems: integer; begin result := false; if lVolVox < 1 then exit; lMaskItems := 0; for lPos := 1 to lVolVox do if lMaskImg^[lPos] <> 0 then inc(lMaskItems); result := true; if (lMaskItems < 1) or (lMaskItems >= lVolVox) then exit;//no need to reformat //note that we do this in descending order, so we do not overwrite... lStatPos := lMaskItems; for lPos := lVolVox downto 1 do if lMaskImg^[lPos] <> 0 then begin lStatImg^[lPos] := lStatImg^[lStatPos]; dec(lStatPos); end else lStatImg^[lPos] := 0; end;//reformat function NULPcount (lPlankImg: bytep; lVoxPerPlank,lImagesCount: integer; var lUniqueOrders: integer; var lOverlapRA: Overlapp): boolean; procedure CheckOrder(var lObservedOrder: TLesionPattern); var lInc: integer; begin if lUniqueOrders > 0 then begin //see if this is unique for lInc := 1 to lUniqueOrders do if SameOrder(lObservedOrder,lOverlapRA^[lInc],lImagesCount) then exit; //not unique end; //UniqueOrders > 0 //if we have not exited yet, we have found a new ordering! lUniqueOrders := lUniqueOrders + 1; lOverlapRA^[lUniqueOrders] := lObservedOrder; end; var lVox,lPlankImgPos,lPos: integer; lOrder,lPrevOrder: TLesionPattern; begin result := false; lPrevOrder := EmptyOrder;//impossible: forces first voxel of each order to be checked for lVox := 1 to lVoxPerPlank do begin (*if (lVox mod lVoxPerPlankDiv10) = 0 then begin MainForm.ProgressBar1.Position := (lVox div lVoxPerPlankDiv10)*10; MainForm.Refresh; Application.processmessages; end;*) lOrder := EmptyOrder; lPlankImgPos := 0; //lnDeficits := 0; for lPos := 1 to lImagesCount do begin if (lPlankImg^[lPlankImgPos + lVox] > 0) then begin //inc(lnDeficits); SetBit(lPos,lOrder); end; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end; //if (lnDeficits >= lminDeficits) then begin //this is different from the last voxel: perhaps this is a new ordering if (not SameOrder(lOrder,lPrevOrder,lImagesCount)) then CheckOrder(lOrder); //inc(lnVoxels); //end;//nDeficies lPrevOrder := lOrder; end;//for lVox result := true; end; procedure PtoZpermute (lnPermute: integer; lPermuteMaxT, lPermuteMinT: singlep); var lPos: integer; lVal : single; begin if lPos < 1 then exit; for lPos := 1 to lnPermute do begin if (lPermuteMinT^[lPos] > 1.1) or (lPermuteMinT^[lPos] < -1.1) then lPermuteMinT^[lPos] := 0.5; if (lPermuteMaxT^[lPos] > 1.1) or (lPermuteMaxT^[lPos] < -1.1) then lPermuteMaxT^[lPos] := 0.5; lVal := lPermuteMaxT^[lPos]; lPermuteMaxT^[lPos] := lPermuteMinT^[lPos]; lPermuteMinT^[lPos] := lVal; if lPermuteMaxT^[lPos] < 0 then lPermuteMaxT^[lPos] := -pNormalInv(abs(lPermuteMaxT^[lPos])) else lPermuteMaxT^[lPos] := pNormalInv(lPermuteMaxT^[lPos]); if lPermuteMinT^[lPos] < 0 then lPermuteMinT^[lPos] := -pNormalInv(abs(lPermuteMinT^[lPos])) else lPermuteMinT^[lPos] := pNormalInv(lPermuteMinT^[lPos]); end; end; function TurboLDM (var lImages: TStrings; var lMaskHdr: TMRIcroHdr;var lPrefs: TLDMPrefs ; var lSymptomRA: SingleP;var lFactname,lOutName: string): boolean; label 123,667; var lOutNameMod: string; lStatHdr: TNIfTIhdr; lThreshFDR,lThreshPermute,lThreshBonf,lThreshNULP :double; lObsp: pointer; lObs: Doublep0; lRanOrderp: pointer; lRanOrder: Doublep0; lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM,lOutImgSum,lOutImgBM,lOutImgT,lOutImgAUC: singlep; lSumImg: Smallintp; lPlankImg: byteP; lVoxPerPlank,lnPlanks,lTotalMemory,lnVoxTested,lVolVox: int64; lUniqueOrders,lThread,lThreadStart,lThreadInc,lThreadEnd, lPos2,lPosPct,lPos,lPlankImgPos,lPlank,lStartVox,lEndVox: integer; lOverlapRA: Overlapp; {$IFNDEF FPC} lStartTime :DWord;{$ENDIF} begin {$IFNDEF FPC} lStartTime := GetTickCount;{$ENDIF} result := false; lSumImg := nil; lPlankImg := nil; lOutImgSum := nil; lOutImgBM := nil; lOutImgT := nil; lOutImgAUC := nil; lOverlapRA := nil; lUniqueOrders := 0; if lPrefs.Ltest then begin lPrefs.Ttest := false; lPrefs.BMtest := false; end else if (not lPrefs.Ttest) and (not lPrefs.BMtest) then begin//not binomial MainForm.NPMmsg('Error no tests specified'); exit; end; MainForm.NPMmsg('Permutations = ' +IntToStr(lPrefs.nPermute)); MainForm.NPMmsg('Analysis began = ' +TimeToStr(Now)); lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; if not MakeSum( lImages, lMaskHdr, lSumImg) then goto 667; lnVoxTested := ThreshSumImg(lSumImg,lVolVox,lPrefs.nCrit); MainForm.NPMmsg('Voxels damaged in at least '+inttostr(lPrefs.nCrit)+' individuals = ' +Floattostr(lnVoxTested)); if lnVoxTested < 1 then begin MainForm.NPMmsg('Error: no voxels damaged in at least '+inttostr(lPrefs.nCrit)+' individuals.'); goto 667; end; if (lPrefs.ExplicitMaskName <> '') then begin lnVoxTested := ExplicitMaskSumImg (lPrefs.ExplicitMaskName, lSumImg, lVolVox); MainForm.NPMmsg('Voxels also non-zero in mask '+lPrefs.ExplicitMaskName+' = ' +Floattostr(lnVoxTested)); if lnVoxTested < 1 then begin MainForm.NPMmsg('Error: no remaing voxels also non-zero in mask '+lPrefs.ExplicitMaskName); goto 667; end; end; //compute planks and acquire memory lTotalMemory := lnVoxTested * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/kPlankSz ) + 1; MainForm.NPMmsg('Memory planks = ' +Floattostr(lTotalMemory/kPlankSz)); if (lnPlanks = 1) then begin lVoxPerPlank := lnVoxTested; //we can do this in a single pass getmem(lPlankImg,lTotalMemory) end else begin getmem(lPlankImg,kPlankSz); lVoxPerPlank := kPlankSz div lImages.Count; end; //spatial maps for results getmem(lOutImgSum,lVolVox*sizeof(single)); getmem(lOutImgBM,lVolVox*sizeof(single)); getmem(lOutImgT,lVolVox*sizeof(single)); getmem(lOutImgAUC,lVolVox*sizeof(single)); //initialize memory MainForm.InitPermute (lImages.Count, lPrefs.nPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do begin lOutImgSum^[lPos] := 0; lOutImgBM^[lPos] := 0; lOutImgT^[lPos] := 0; lOutImgAUC^[lPos] := 0; end; //next create permuted BM bounds if lPrefs.BMtest then begin MainForm.NPMmsg('Generating BM permutation thresholds'); MainForm.Refresh; createArray64(lObsp,lObs,lImages.Count); for lPos := 1 to lImages.Count do lObs^[lPos-1] := lSymptomRA^[lPos]; genBMsim (lImages.Count, lObs); freemem(lObsp); end; if lPrefs.NULP then getmem(lOverlapRA,lnVoxTested* sizeof(TLesionPattern)); if lPrefs.Ltest then ClearThreadDataPvals(gnCPUThreads,lPrefs.nPermute) else ClearThreadData(gnCPUThreads,lPrefs.nPermute) ; //load and process data lStartVox := 1; lEndVox := 0; for lPlank := 1 to lnPlanks do begin MainForm.NPMmsg('Computing plank = ' +Inttostr(lPlank)+' of '+inttostr(lnPlanks)); lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lnVoxTested then begin lVoxPerPlank := lnVoxTested-lStartVox+1{lVoxPerPlank - (lEndVox-lVolVox)}; lEndVox := lnVoxTested; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg8Masked(lImages[lPos-1], lPlankImg,lSumImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error if lPrefs.Ltest then begin with TLesionBinom.Create (MainForm.ProgressBar1,false,true,lPrefs.nCrit, lPrefs.nPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,0,lPlankImg,lOutImgSum,lOutImgBM,lOutIMgT{not used},lOutImgAUC,lSymptomRA) do {$IFDEF FPC} OnTerminate := @MainForm.ThreadDone; {$ELSE}OnTerminate := MainForm.ThreadDone;{$ENDIF} end else begin with TLesionContinuous.Create (MainForm.ProgressBar1,lPrefs.ttest,lPrefs.BMtest,lPrefs.nCrit, lPrefs.nPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,0,lPlankImg,lOutImgSum,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA) do //with TLesionContinuous.Create (MainForm.ProgressBar1,lttest,lBM,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,lPlankImg,lOutImgSum,lOutImgBM,lOutImgT,lSymptomRA) do {$IFDEF FPC} OnTerminate := @MainForm.ThreadDone; {$ELSE}OnTerminate := MainForm.ThreadDone;{$ENDIF} end; inc(gThreadsRunning); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; //end of threading if lPrefs.NULP then NULPcount (lPlankImg, lVoxPerPlank,lImages.Count, lUniqueOrders, lOverlapRA); lStartVox := lEndVox + 1; end; //calculate max per thread SumThreadData(gnCPUThreads,lPrefs.nPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); //data in maps is stored in voxels 1..lnVoxTested - put in spatial order reformat(lOutImgSum,lSumImg,lVolVox); reformat(lOutImgBM,lSumImg,lVolVox); reformat(lOutImgT,lSumImg,lVolVox); reformat(lOutImgAUC,lSumImg,lVolVox); lThreshBonf := MainForm.reportBonferroni('Std',lnVoxTested); if lPrefs.NULP then lThreshBonf := MainForm.reportBonferroni('Number of Unique Lesion Patterns',lUniqueOrders); //next: save data MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save sum map lOutNameMod := ChangeFilePostfixExt(lOutName,'Sum'+lFactName,'.hdr'); if lPrefs.Run < 1 then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); //save Area Under Curve lOutNameMod := ChangeFilePostfixExt(lOutName,'rocAUC'+lFactName,'.hdr'); if lPrefs.Run < 1 then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgAUC,1); //create new header - subsequent images will use Z-scores MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if (lPrefs.Run < 1) and (Sum2Power(lOutImgSum,lVolVox,lImages.Count,lPrefs.nCrit, lPrefs.LTest)) then begin lOutNameMod := ChangeFilePostfixExt(lOutName,'Power'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); end; //if lPrefs.Run > 0 then //terrible place to do this - RAM problems, but need value to threshold maps // lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap2 (lImages, lPrefs.nCrit,lnVoxTested,lPlankImg)); if lPrefs.ttest then begin //save Ttest //next: convert t-scores to z scores for lPos := 1 to lVolVox do lOutImgT^[lPos] := TtoZ (lOutImgT^[lPos],lImages.Count-2); for lPos := 1 to lPrefs.nPermute do begin lPermuteMaxT^[lPos] := TtoZ (lPermuteMaxT^[lPos],lImages.Count-2); lPermuteMinT^[lPos] := TtoZ (lPermuteMinT^[lPos],lImages.Count-2); end; lThreshFDR := MainForm.reportFDR ('ttest', lVolVox, lnVoxTested, lOutImgT); lThreshPermute := MainForm.reportPermute('ttest',lPrefs.nPermute,lPermuteMaxT, lPermuteMinT); lOutNameMod := ChangeFilePostfixExt(lOutName,'ttest'+lFactName,'.hdr'); {$IFNDEF FPC} if lPrefs.Run > 0 then begin MainForm.NPMmsgAppend('threshtt,'+inttostr(lPrefs.Run)+','+inttostr(MainForm.ThreshMap(lThreshBonf,lVolVox,lOutImgT))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)+','+inttostr(round((GetTickCount - lStartTime)/1000))); end; {$ENDIF} NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgT,1); end; if lPrefs.LTest then begin PtoZpermute (lPrefs.nPermute, lPermuteMaxT, lPermuteMinT); lOutNameMod := ChangeFilePostfixExt(lOutName,'L'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgBM,1); MainForm.reportFDR ('L', lVolVox, lnVoxTested, lOutImgBM); MainForm.reportPermute('L',lPrefs.nPermute,lPermuteMaxT, lPermuteMinT); end;//Liebermeister if lPrefs.BMtest then begin //save Brunner Munzel lThreshFDR := MainForm.reportFDR ('BM', lVolVox, lnVoxTested, lOutImgBM); lThreshPermute := MainForm.reportPermute('BM',lPrefs.nPermute,lPermuteMaxBM, lPermuteMinBM); lOutNameMod := ChangeFilePostfixExt(lOutName,'BM'+lFactName,'.hdr'); if lPrefs.Run > 0 then MainForm.NPMmsgAppend('threshbm,'+inttostr(lPrefs.Run)+','+inttostr(MainForm.ThreshMap(lThreshBonf,lVolVox,lOutImgBM))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgBM,1); end; MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); {$IFNDEF FPC} MainForm.NPMmsg('Processing Time = ' +inttostr(round((GetTickCount - lStartTime)/1000)));{$ENDIF} lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lFactName,'.txt'); MainForm.MsgSave(lOutNameMod); //all done result := true;//all done without aborting 667: // free memory and report error if lPlankImg <> nil then freemem(lPlankImg); if lSumImg <> nil then freemem(lSumImg); if lOutImgSum <> nil then freemem(lOutImgSum); if lOutImgBM <> nil then freemem(lOutImgBM); if lOutImgT <> nil then freemem(lOutImgT); if lOutImgAUC <> nil then freemem(lOutImgAUC); if lOverlapRA <> nil then freemem(lOverlapRA); if not result then MainForm.NPMmsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; //TurboLDM end. mricron-0.20120505.1~dfsg.1.orig/npm/StatThdsUtil.pas0000664000175000017500000000726111477115460021557 0ustar michaelmichaelunit StatThdsUtil; interface uses ComCtrls,Classes, Graphics, ExtCtrls, define_types,stats,dialogs; const kMaxThreads = 16; kSh = 10; //bits to shift kMaxImages = 1024; kMaxPermute = 4000; kPlankMB : integer = 512; var gnCPUThreads, gThreadsRunning: Integer; kPlankSz : integer;// =1024 {bytes/kb} * 1024 {bytes/mb} * kPlankMB; //e.g. 512 MB gDataTypeRA: array [0..kMaxImages] of integer; gOffsetRA,gScaleRA,gInterceptRA: array [0..kMaxImages] of single; gnVoxTestedRA : array [0..kMaxThreads] of integer; gPermuteMinT,gPermuteMaxT,gPermuteMinBM,gPermuteMaxBM : array [0..kMaxThreads,0..kMaxPermute ] of double; procedure ClearThreadData(lnThreads,lnPermute: integer); function SumThreadDataLite (lnThreads: integer): integer; function SumThreadData (lnThreads,lnPermute: integer;lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP): integer; procedure ClearThreadDataPvals (lnThreads,lnPermute: integer); implementation procedure ClearThreadDataPvals (lnThreads,lnPermute: integer); var lT,lP: integer; begin if lnThreads < 1 then exit; if lnPermute > kMaxPermute then showmessage('Error: recompile with larger kMaxPermute'); for lT := 1 to lnThreads do gnVoxTestedRA[lT] := 0; if lnPermute < 1 then exit; for lT := 1 to lnThreads do begin for lP := 1 to lnPermute do begin gPermuteMinT[lT,lP] := 10; gPermuteMaxT[lT,lP] := -10; gPermuteMinBM[lT,lP] := 10; gPermuteMaxBM[lT,lP] := -10; end; end; end; procedure ClearThreadData (lnThreads,lnPermute: integer); var lT,lP: integer; begin if lnThreads < 1 then exit; if lnPermute > kMaxPermute then showmessage('Error: recompile with larger kMaxPermute'); for lT := 1 to lnThreads do gnVoxTestedRA[lT] := 0; if lnPermute < 1 then exit; for lT := 1 to lnThreads do begin for lP := 1 to lnPermute do begin gPermuteMinT[lT,lP] := 0; gPermuteMaxT[lT,lP] := 0; gPermuteMinBM[lT,lP] := 0; gPermuteMaxBM[lT,lP] := 0; end; end; end; function SumThreadDataLite (lnThreads: integer): integer; var lT: integer; begin result := 0; if lnThreads < 1 then exit; for lT := 1 to lnThreads do result := result + gnVoxTestedRA[lT]; end; function SumThreadData (lnThreads,lnPermute: integer;lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP): integer; var lT,lP: integer; begin result := 0; if lnThreads < 1 then exit; for lT := 1 to lnThreads do result := result + gnVoxTestedRA[lT]; if lnPermute < 1 then exit; for lP := 1 to lnPermute do begin lPermuteMinT^[lP] := gPermuteMinT[1,lP]; lPermuteMaxT^[lP] := gPermuteMaxT[1,lP]; lPermuteMinBM^[lP] := gPermuteMinBM[1,lP]; lPermuteMaxBM^[lP] := gPermuteMaxBM[1,lP]; end; if lnThreads < 2 then exit; for lT := 2 to lnThreads do begin for lP := 1 to lnPermute do begin if lPermuteMinT^[lP] > gPermuteMinT[lT,lP] then lPermuteMinT^[lP] := gPermuteMinT[lT,lP]; if lPermuteMinBM^[lP] > gPermuteMinBM[lT,lP] then lPermuteMinBM^[lP] := gPermuteMinBM[lT,lP]; if lPermuteMaxT^[lP] < gPermuteMaxT[lT,lP] then lPermuteMaxT^[lP] := gPermuteMaxT[lT,lP]; if lPermuteMaxBM^[lP] < gPermuteMaxBM[lT,lP] then lPermuteMaxBM^[lP] := gPermuteMaxBM[lT,lP]; end; end; end; //SumThreadData end. mricron-0.20120505.1~dfsg.1.orig/npm/StatThds.pas0000664000175000017500000005607211326434470020723 0ustar michaelmichaelunit StatThds; interface uses ComCtrls,Classes, Graphics, ExtCtrls, define_types,stats,StatThdsUtil,Brunner,lesion_pattern; type TStatThread = class(TThread) private lBarX: TProgressBar; lttestx,lBMx: boolean; lnCritx,lBarPosX,lnPermuteX,lThreadx,lThreadStartx,lThreadEndx,lStartVoxx,lVoxPerPlankx,lImagesCountx,lnGroup1x : integer; lMaskImgx,lPlankImgx,lOutImgMnx,lOutImgBMx,lOutImgTx,lSymptomRAx: SingleP; //lBarX: TProgressBar; procedure DoVisualSwap; protected procedure Execute; override; procedure VisualProg(lPos: Integer); procedure Analyze(lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lSymptomRA: SingleP); virtual; abstract; public constructor Create(lBar: TProgressBar;lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lSymptomRA: SingleP); end; { VBM - two groups } TNNStat = class(TStatThread) protected procedure Analyze(lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lSymptomRA: SingleP); override; end; TPairedTStat = class(TStatThread) protected procedure Analyze(lunused1,lunused2: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lSymptomRA: SingleP); override; end; { Lesion - image reveals value } TLesionStat = class(TStatThread) protected procedure Analyze(lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lSymptomRA: SingleP); override; end; TLesionBinomial = class(TStatThread) protected procedure Analyze(lChi2,lLieber: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgL,lOutImgX,lSymptomRA: SingleP); override; end; implementation //uses Stat; { TSortThread } (*tpIdle The thread executes only when the system is idle. The system will not interrupt other threads to execute a thread with tpIdle priority. tpLowest The thread's priority is two points below normal. tpLower The thread's priority is one point below normal. tpNormal The thread has normal priority. tpHigher The thread's priority is one point above normal. tpHighest The thread's priority is two points above normal. tpTimeCritical*) Const Two32 = 4294967296.0 ; function GenRandThreaded(lRange: integer; var lRandSeed:comp): integer; //normal random function does not work well when threaded - randseed is changed by each thread const lFactor = $08088405 ; lTerm = 1 ; type lT = array [0..1] of longint ; var lX: extended; begin lRandSeed := lRandSeed*lFactor + lTerm; lT(lRandSeed)[1] := 0 ; // < May'04 was: RS := RS - Trunc(RS/Two32)*Two32 ; lX := lRandSeed/Two32 ; result := trunc((lRange)*lX); end; procedure GenPermuteThreaded (lnSubj: integer; var lOrigOrder,lRanOrder: DoubleP0; var lRandSeed:comp); var lInc,lRand: integer; lSwap: double; begin Move(lOrigOrder^,lRanOrder^,lnSubj*sizeof(double)); for lInc := lnSubj downto 2 do begin lRand := GenRandThreaded(lInc,lRandSeed); lSwap := lRanOrder^[lRand]; lRanOrder^[lRand] := lRanOrder^[lInc-1]; lRanOrder^[lInc-1] := lSwap; end; end; procedure StatPermuteThreaded (lttest,lBM: boolean; lnSubj, lnGroup0,lnPermute,lThread: integer;var lOrigOrder: DoubleP0); var lInc: integer; lOutT: double; lRS: Comp; lRanOrderp: pointer; lRanOrder: Doublep0; begin if (lnSubj < 1) or (lnPermute < 1) then exit; createArray64(lRanOrderp,lRanOrder,lnSubj); lRS := 128; for lInc := 1 to lnPermute do begin GenPermuteThreaded(lnSubj, lOrigOrder,lRanOrder,lRS); //generate random order of participants if lttest then begin TStat2 (lnSubj, lnGroup0, lRanOrder, lOutT); if lOutT > gPermuteMaxT[lThread,lInc] then gPermuteMaxT[lThread,lInc] := lOutT; if lOutT < gPermuteMinT[lThread,lInc] then gPermuteMinT[lThread,lInc] := lOutT; end; //compute ttest if lBM then begin BMTest (lnSubj, lnGroup0, lRanOrder,lOutT); if lOutT > gPermuteMaxBM[lThread,lInc] then gPermuteMaxBM[lThread,lInc] := lOutT; if lOutT < gPermuteMinBM[lThread,lInc] then gPermuteMinBM[lThread,lInc] := lOutT; end; //compute BM end; freemem(lRanOrderp); end; procedure StatPermuteBinomialThreaded (lChi2,lLieber: boolean; lnSubj, lnGroup0,lnPermute,lThread: integer;var lOrigOrder: DoubleP0); var lInc: integer; lOutT: double; lRS: Comp; lRanOrderp: pointer; lRanOrder: Doublep0; begin if (lnSubj < 1) or (lnPermute < 1) then exit; createArray64(lRanOrderp,lRanOrder,lnSubj); lRS := 128; for lInc := 1 to lnPermute do begin GenPermuteThreaded(lnSubj, lOrigOrder,lRanOrder,lRS); //generate random order of participants if lChi2 then begin Chi2 (lnSubj, lnGroup0, lRanOrder, lOutT); if lOutT > gPermuteMaxT[lThread,lInc] then gPermuteMaxT[lThread,lInc] := lOutT; if lOutT < gPermuteMinT[lThread,lInc] then gPermuteMinT[lThread,lInc] := lOutT; end; //compute ttest if lLieber then begin Liebermeister2 (lnSubj, lnGroup0, lRanOrder,lOutT); if lOutT > gPermuteMaxBM[lThread,lInc] then gPermuteMaxBM[lThread,lInc] := lOutT; if lOutT < gPermuteMinBM[lThread,lInc] then gPermuteMinBM[lThread,lInc] := lOutT; end; //compute BM end; freemem(lRanOrderp); end; procedure TStatThread.DoVisualSwap; begin lBarX.Position := lBarPosX; end; procedure TStatThread.VisualProg(lPos: Integer); begin lBarPosX := lPos; {$IFDEF FPC}Synchronize(@DoVisualSwap); {$ELSE} Synchronize(DoVisualSwap);{$ENDIF} end; constructor TStatThread.Create(lBar: TProgressBar; lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lSymptomRA: SingleP); begin lBarX := lBar; lttestx := lttest; lBMx:= lBM; lThreadX := lThread; lThreadStartX := lThreadStart; lThreadEndX := lThreadEnd; lStartVoxx := lStartVox; lVoxPerPlankx := lVoxPerPlank; lImagesCountX := lImagesCount; lnGroup1x := lnGroup1; lMaskImgx := lMaskImg; lPlankImgx := lPlankImg; lOutImgMnx := lOutImgMn; lOutImgBMx := lOutImgBM; lOutImgTx := lOutImgT; lSymptomRAx := lSymptomRA; lnPermuteX := lnPermute; lnCritX := lnCrit; FreeOnTerminate := True; inherited Create(False); end; { The Execute method is called when the thread starts } procedure TStatThread.Execute; begin Analyze(lttestx,lBMx, lnCritX,lnPermuteX,lThreadx,lThreadStartx,lThreadEndx,lStartVoxx,lVoxPerPlankx,lImagesCountx,lnGroup1x,lMaskImgx,lPlankImgX,lOutImgMnx,lOutImgBMx,lOutImgTx,lSymptomRAx); end; { Nearest Nighbor } procedure TNNStat.Analyze(lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lSymptomRA: SingleP); var lObsp: pointer; lObs: Doublep0; lT: Double; lPosPct,lPos,lPos2,lPos2Offset: integer; lSum: single; begin //statthread createArray64(lObsp,lObs,lImagesCount); lPosPct := (lThreadEnd-lThreadStart) div 100; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; if lMaskImg^[lPos2Offset] <> 0 then begin inc(gnVoxTestedRA[lThread]); lSum := 0; for lPos := 1 to lImagesCount do begin lObs^[lPos-1] := (gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]; lSum := lSum + lObs^[lPos-1]; end; lOutImgMn^[lPos2Offset] := lSum/lImagesCount; if lttest then begin TStat2 (lImagesCount, lnGroup1, lObs,lT); lOutImgT^[lPos2Offset] := lT; end; if lBM then begin BMTest(lImagesCount, lnGroup1, lObs,lT); lOutImgBM^[lPos2Offset] := lT; //TStatAbs (lImagesCount, lnGroup1, lObs,lT); //lOutImgBM[lPos2Offset] := lT; end; StatPermuteThreaded (lttest,lBM,lImagesCount, lnGroup1,lnPermute,lThread, lObs); end; //in brain mask - compute end; //for each voxel freemem(lObsP); end; { Paired T-Test} (*procedure PairedTTest (N, SumOfDifSqrs, SumDif: double;var t, p,DF: double); var meanDif, SumDifSqr, temp: double; begin df := n - 1; t := 0; p := 1; if (SumOfDifSqrs <> 0)and (SumDif <> 0)and (df <> 0) and (N <> 0) then begin meanDif := SumDif / N; SumDifSqr := sqr(SumDif); temp := SumOfDifSqrs - (SumDifSqr / n); temp := temp / (n * df); temp := sqrt(temp); if temp <> 0 then begin t := meanDif / temp; p := betai(0.5 * df, 0.5, df / (df + sqr(t))) end else {t is infinitely big} p := -1.0; end; end; {paired ttest} *) procedure TPairedTStat.Analyze(lUnused1,lUnused2: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lSymptomRA: SingleP); var lObsp: pointer; lObs: Doublep0; lT: Double; lPosPct,lPos,lPos2,lPos2Offset: integer; lSum: single; begin //statthread createArray64(lObsp,lObs,lImagesCount); lPosPct := (lThreadEnd-lThreadStart) div 100; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; if lMaskImg^[lPos2Offset] <> 0 then begin inc(gnVoxTestedRA[lThread]); lSum := 0; for lPos := 1 to lImagesCount do begin lObs^[lPos-1] := (gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]; lSum := lSum + lObs^[lPos-1]; end; lOutImgMn^[lPos2Offset] := lSum/lImagesCount; PairedTStat (lImagesCount, lObs,lT); lOutImgT^[lPos2Offset] := lT; //StatPermuteThreaded (lttest,lBM,lImagesCount, lnGroup1,lnPermute,lThread, lObs); end; //in brain mask - compute end; //for each voxel freemem(lObsP); end; (*procedure TLesionStat.Analyze (lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lSymptomRA: SingleP); var lObsp: pointer; lObs: Doublep0; lT,lBMz,lDF: Double; lnLesion,lnNoLesion,lPosPct,lPos,lPos2,lPos2Offset,lnVoxTested: integer; begin //statthread createArray64(lObsp,lObs,lImagesCount); lPosPct := (lThreadEnd-lThreadStart) div 100; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; lnNoLesion := 0; for lPos := 1 to lImagesCount do begin if ((gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]) = 0 then begin //no lesion inc(lnNoLesion); lObs^[lnNoLesion-1] := lSymptomRA^[lPos]; end else begin //lesion inc(lnLesion); lObs^[lImagesCount-lPos+lnNoLesion] := lSymptomRA^[lPos]; //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCrit) and (lnLesion > 0) then begin inc(gnVoxTestedRA[lThread]); if lttest then begin TStat2 (lImagesCount, lnNoLesion, lObs,lT); lOutImgT^[lPos2Offset] := lT; end; if lBM then begin tBM (lImagesCount, lnNoLesion, lObs,lBMz,lDF); BMzVal (lImagesCount, lnNoLesion,lBMz,lDF); lOutImgBM^[lPos2Offset] := lBMz; end; StatPermuteThreaded (lttest,lBM,lImagesCount, lnNoLesion,lnPermute,lThread, lObs); end; //in brain mask - compute end; //for each voxel freemem(lObsP); end;*) procedure TLesionStat.Analyze (lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lSymptomRA: SingleP); //pattern variables const knPrevPattern = 10; var lPrevPatternRA: array[1..knPrevPattern] of TLesionPattern; lPattern: TLesionPattern; lPrevZValsT,lPrevZValsBM: array [1..knPrevPattern] of Single; lPatternPos: integer; lLesionOrderp: bytep; //standard variables var lObsp: pointer; lObs: Doublep0; lT,lBMz,lDF: Double; lnLesion,lnNoLesion,lPosPct,lPos,lPos2,lPos2Offset,lnVoxTested: integer; begin //statthread //init patterns for lPatternPos := 1 to knPrevPattern do lPrevPatternRA[lPatternPos] := EmptyOrder; lPatternPos := 1; getmem(lLesionOrderp, lImagesCount *sizeof(byte)); //now init standard variables createArray64(lObsp,lObs,lImagesCount); lPosPct := (lThreadEnd-lThreadStart) div 100; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; lnNoLesion := 0; for lPos := 1 to lImagesCount do begin if ((gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]) = 0 then begin //no lesion inc(lnNoLesion); lLesionOrderp^[lPos] := 0; lObs^[lnNoLesion-1] := lSymptomRA^[lPos]; end else begin //lesion inc(lnLesion); lLesionOrderp^[lPos] := 1; lObs^[lImagesCount-lPos+lnNoLesion] := lSymptomRA^[lPos]; //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCrit) and (lnLesion > 0) then begin inc(gnVoxTestedRA[lThread]); //now check if we have seen this precise lesion order recently... lPattern := SetOrderX (lLesionOrderp,lImagesCount); lPos := 1; while (lPos <= knPrevPattern) and not (SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount)) do inc(lPos); if SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount) then begin //lesion pattern is not novel if lttest then lOutImgT^[lPos2Offset] := lPrevZvalsT[lPos]; if lBM then lOutImgBM^[lPos2Offset] := lPrevZvalsBM[lPos]; end else begin //lesion pattern is novel //record novel pattern inc(lPatternPos); if lPatternPos > knPrevPattern then lPatternPos := 1; lPrevPatternRA[lPatternPos] := lPattern; if lttest then begin TStat2 (lImagesCount, lnNoLesion, lObs,lT); lOutImgT^[lPos2Offset] := lT; lPrevZValsT[lPatternPos] := lT; end; if lBM then begin tBM (lImagesCount, lnNoLesion, lObs,lBMz,lDF); BMzVal (lImagesCount, lnNoLesion,lBMz,lDF); lOutImgBM^[lPos2Offset] := lBMz; lPrevZValsBM[lPatternPos] := lBMz; end; StatPermuteThreaded (lttest,lBM,lImagesCount, lnNoLesion,lnPermute,lThread, lObs); end; //novel lesion pattern end; //in brain mask - compute end; //for each voxel freemem(lObsP); freemem(lLesionOrderp) end; procedure TLesionBinomial.Analyze (lChi2,lLieber: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgL,lOutImgX,lSymptomRA: SingleP); //pattern variables const knPrevPattern = 10; var lPrevPatternRA: array[1..knPrevPattern] of TLesionPattern; lPattern: TLesionPattern; lPrevZValsL,lPrevZValsX: array [1..knPrevPattern] of Single; lPatternPos: integer; lLesionOrderp: bytep; //standard variables var lObsp: pointer; lObs: Doublep0; lT: Double; lnLesion,lPosPct,lPos,lPos2,lPos2Offset,lnVoxTested: integer; begin //Binomial StatThread //init patterns for lPatternPos := 1 to knPrevPattern do lPrevPatternRA[lPatternPos] := EmptyOrder; lPatternPos := 1; getmem(lLesionOrderp, lImagesCount *sizeof(byte)); //now init standard variables createArray64(lObsp,lObs,lImagesCount); lPosPct := (lThreadEnd-lThreadStart) div 100; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; for lPos := 1 to lImagesCount do begin if ((gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]) = 0 then begin //no lesion lObs^[lImagesCount-lPos+lnLesion] := lSymptomRA^[lPos]; lLesionOrderp^[lPos] := 0; end else begin //lesion inc(lnLesion); lLesionOrderp^[lPos] := 1; lObs^[lnLesion-1] := lSymptomRA^[lPos]; //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCrit) and (lnLesion > 0) then begin inc(gnVoxTestedRA[lThread]); //next check patterns lPattern := SetOrderX (lLesionOrderp,lImagesCount); lPos := 1; while (lPos <= knPrevPattern) and not (SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount)) do inc(lPos); if SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount) then begin //lesion pattern is not novel //if lChi2 then // lOutImgX^[lPos2Offset] := lPrevZvalsX[lPos]; //if lLieber then lOutImgL^[lPos2Offset] := lPrevZvalsL[lPos]; end else begin //lesion pattern is novel //record novel pattern inc(lPatternPos); if lPatternPos > knPrevPattern then lPatternPos := 1; lPrevPatternRA[lPatternPos] := lPattern; {if lChi2 then begin Chi2 (lImagesCount, lnLesion, lObs,lT); lOutImgX^[lPos2Offset] := lT;//lT; lPrevZValsX[lPatternPos] := lT; end; if lLieber then begin} Liebermeister2(lImagesCount, lnLesion, lObs,lT); lOutImgL^[lPos2Offset] := lT; lPrevZValsL[lPatternPos] := lT; //end; StatPermuteBinomialThreaded ({lChi2}false,lLieber,lImagesCount, lnLesion,lnPermute,lThread, lObs); end; end; //in brain mask - compute end; //for each voxel freemem(lObsP); freemem(lLesionOrderp) end; (*procedure TLesionBinomial.Analyze (lChi2,lLieber: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgL,lOutImgX,lSymptomRA: SingleP); var lObsp: pointer; lObs: Doublep0; lT: Double; lnLesion,lPosPct,lPos,lPos2,lPos2Offset,lnVoxTested: integer; begin //statthread createArray64(lObsp,lObs,lImagesCount); lPosPct := (lThreadEnd-lThreadStart) div 100; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; for lPos := 1 to lImagesCount do begin if ((gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]) = 0 then begin //no lesion lObs^[lImagesCount-lPos+lnLesion] := lSymptomRA^[lPos]; end else begin //lesion inc(lnLesion); lObs^[lnLesion-1] := lSymptomRA^[lPos]; //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCrit) and (lnLesion > 0) then begin inc(gnVoxTestedRA[lThread]); if lChi2 then begin Chi2 (lImagesCount, lnLesion, lObs,lT); lOutImgX^[lPos2Offset] := lT;//lT; end; if lLieber then begin Liebermeister2(lImagesCount, lnLesion, lObs,lT); lOutImgL^[lPos2Offset] := lT; end; StatPermuteBinomialThreaded (lChi2,lLieber,lImagesCount, lnLesion,lnPermute,lThread, lObs); end; //in brain mask - compute end; //for each voxel freemem(lObsP); end;*) end. mricron-0.20120505.1~dfsg.1.orig/npm/stats.pas0000664000175000017500000010202211477156276020322 0ustar michaelmichaelunit stats; interface uses define_types,statcr,DISTR ,SysUtils,Dialogs,ClipBrd; procedure TStat2 (lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lOutT: double); //procedure TStatAbs (lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lOutT: double); procedure PairedTStat (lnSubj: integer; var lIn: DoubleP0; var lOutT: double); procedure TStatWelch (lnSubj, lnGroup0: integer; var lIn: DoubleP0; var lOutT: double); procedure WilcoxonMW2 (lnSubj, lnGroup0: integer; var lIn: DoubleP0; var lOutT: double); procedure MeanMedian(lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lMeanFX,lMedianFX: double); procedure TStat2Z (lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lOutT: double); procedure BMTest (lnSubj, lnGroup0: integer; var lIn: DoubleP0; var lOutT: double); procedure Liebermeister2 (lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lOutZ: double); procedure Liebermeister2b (lnSubj, lnGroupX: integer; var lIn: ByteP0; var lAUC,lOutZ: double); procedure Liebermeister2bP (lnSubj, lnGroupX: integer; var lIn: ByteP0; var lOutP: double); //procedure Liebermeister2bPlus (lnSubj, lnGroupX: integer; var lIn: ByteP0; var lAUC, lOutP: double); //function Aprime (lHit,lFA: double): double; //function AUC (lHit,lFA: double): double; //function rocAUC (lHit,lFA: double): double; function rocAUC (lnYesDeficitYesLesion,lnNoDeficitYesLesion,lnYesDeficitNoLesion,lnNoDeficitNoLesion: integer): double; procedure Chi2 (lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lOutZ: double); implementation procedure Chi2 (lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lOutZ: double); var lVal: double; // luChiP: double; i,lnYesDeficit1,lnYesDeficit0,lnNoDeficit1,lnNoDeficit0, lnYesDeficit,lnNoDeficit: integer; begin lnYesDeficit0 := 0; lnYesDeficit1 := 0; lnNoDeficit0 := 0; lnNoDeficit1 := 0; for i := 0 to (lnGroupX-1) do begin //for each subject if lIn^[i] = 0 then inc(lnYesDeficit0) else inc(lnNoDeficit0); end; for i := lnGroupX to (lnSubj-1) do begin //for each subject if lIn^[i] = 0 then inc(lnYesDeficit1) else inc(lnNoDeficit1); end; //for each sub lnYesDeficit :=lnYesDeficit0+lnYesDeficit1; lnNoDeficit := lnNoDeficit0+lnNoDeficit1; if (lnYesDeficit<1) or (lnNoDeficit<1) then lOutZ := 0 else begin lVal := Fisher(lnYesDeficit0, lnYesDeficit1, lnNoDeficit0, lnNoDeficit1); if lVal < 0 then lOutZ := -pNormalInv(abs(lVal)) else lOutZ := pNormalInv(lVal) (*Chi2x2 (lnYesDeficit0, lnYesDeficit1, lnNoDeficit0, lnNoDeficit1,lMinExp,lChi,lChip,luChi, luChiP); if (lnYesDeficit1/lnYesDeficit) > (lnNoDeficit1/lnNoDeficit) then lOutZ := -luChi//t = m / d; else lOutZ := luChi;//t = m / d; *) end; //compute chi end; function rocAz (lHit,lFA: double): double; //see Zhang and Mueller, 2005, Psychometrika 70, 145-154 var lH,lF: double; begin if (lHit = 1) and (lFA = 0) then begin result := 1; exit; end; if (lHit = 0) and (lFA = 1) then begin result := 0; exit; end; if lHit >= lFA then begin//normal: better than chance lH := lHit; lF := lFA; end else begin //..else worse than chance lF := lHit; lH := lFA; end; if (lF <= 0.5) and (0.5 <= lH) then result := 0.75+ ((lH-lF)*0.25)- lF*(1-lH) else if (lF <= lH) and (lH < 0.5) then begin if (4*lH) = 0 then result := 0.5 else result := 0.75+ ((lH-lF)*0.25)- (lF/(4*lH)) end else if (0.5 < lF) and (lF <= lH) then begin if (4*(1-lF)) = 0 then result := 0.5 else result := 0.75 + ((lH-lF)*0.25) - ((1-lH)/(4*(1-lF))) end else showmessage('error in Zhang and Mueller, 2005 (func rocA)'); if lHit < lFA then //worse than chance result := 1 - result; end; function rocAUC (lnYesDeficitYesLesion,lnNoDeficitYesLesion,lnYesDeficitNoLesion,lnNoDeficitNoLesion: integer): double; var lHitRate,lFalseAlarmRate: double; begin result := 0.5; if ((lnYesDeficitYesLesion+lnNoDeficitYesLesion)=0) or ((lnYesDeficitNoLesion+lnNoDeficitNoLesion)=0) then exit; lHitRate := lnYesDeficitYesLesion/(lnYesDeficitYesLesion+lnNoDeficitYesLesion); lFalseAlarmRate := lnYesDeficitNoLesion/(lnYesDeficitNoLesion+lnNoDeficitNoLesion); result := rocAz(lHitRate,lFalseAlarmRate); end; (*function Aprime (lHit,lFA: double): double; //see Wickens Elementary Signal Detection, equation 4.11, page 71 //problem - not symetrical: values less than 0.5 extreme - // does not deal with lFA > lHit begin if (lFA=1) or (lHit = 0) then result := 0.5 //avoid divide by zero else result := 1 - 0.25*( ((1-lHit)/(1-lFA)) + lFA/lHit); end;*) (*function AUC (lHit,lFA: double): double; var lNum,lDenom: double; begin if (lHit> lFA) then begin lNum := (lHit-lFA)*(1+lHit-lFA); lDenom := 4 * lHit * (1 - lFA); if lDenom = 0 then result := 0 else result := 0.5+ (lNum/lDenom); end else begin lNum := (lFA-lHit)*(1+lFA-lHit); lDenom := 4 * lFA * (1 - lHit); if lDenom = 0 then result := 0 else result := 0.5- (lNum/lDenom); end; end; *) procedure ROCbinomialAUC (lnSubj, lnGroupX: integer; var lIn: ByteP0; var lAUC: double); //Receiver operating characteristic area under curve for binimial data //Liebermeister QuasiExact - excellent power var i,lnYesDeficit1,lnYesDeficit0,lnNoDeficit1,lnNoDeficit0, lnYesDeficit,lnNoDeficit: integer; //lHitRate,lFalseAlarmRate: double; begin lnYesDeficit0 := 0; lnYesDeficit1 := 0; lnNoDeficit0 := 0; lnNoDeficit1 := 0; for i := 0 to (lnGroupX-1) do begin //for each subject if lIn^[i] = 0 then inc(lnYesDeficit0) else inc(lnNoDeficit0); end; for i := lnGroupX to (lnSubj-1) do begin //for each subject if lIn^[i] = 0 then inc(lnYesDeficit1) else inc(lnNoDeficit1); end; //for each sub lAUC := rocAUC (lnYesDeficit1,lnNoDeficit1,lnYesDeficit0,lnNoDeficit0); (*lHitRate := lnYesDeficit1/(lnYesDeficit1+lnNoDeficit1); lFalseAlarmRate := lnYesDeficit0/(lnYesDeficit0+lnNoDeficit0); lAUC := rocA {AUC} (lHitRate,lFalseAlarmRate); *) end; procedure Liebermeister2bP (lnSubj, lnGroupX: integer; var lIn: ByteP0; var lOutP: double); //Liebermeister QuasiExact - excellent power var i,lnYesDeficit1,lnYesDeficit0,lnNoDeficit1,lnNoDeficit0, lnYesDeficit,lnNoDeficit: integer; //lMaxChi,lMinChi: single; begin lnYesDeficit0 := 0; lnYesDeficit1 := 0; lnNoDeficit0 := 0; lnNoDeficit1 := 0; for i := 0 to (lnGroupX-1) do begin //for each subject if lIn^[i] = 0 then inc(lnYesDeficit0) else inc(lnNoDeficit0); end; for i := lnGroupX to (lnSubj-1) do begin //for each subject if lIn^[i] = 0 then inc(lnYesDeficit1) else inc(lnNoDeficit1); end; //for each sub lnYesDeficit :=lnYesDeficit0+lnYesDeficit1; lnNoDeficit := lnNoDeficit0+lnNoDeficit1; if (lnYesDeficit<1) or (lnNoDeficit<1) then lOutP := 0 else begin lOutP := Liebermeister(lnYesDeficit0, lnYesDeficit1, lnNoDeficit0, lnNoDeficit1); end; //compute chi end; procedure Liebermeister2b (lnSubj, lnGroupX: integer; var lIn: ByteP0; var lAUC,lOutZ: double); //(lnRow,lnCol: integer; var lIn,lOutZ: DoubleP0); //Liebermeister QuasiExact - excellent power var lVal: double; i,lnYesDeficitNoLesion,lnYesDeficitYesLesion,lnNoDeficitNoLesion,lnNoDeficitYesLesion, lnYesDeficit,lnNoDeficit: integer; //lHitRate,lFalseAlarmRate: double; //lMaxChi,lMinChi: single; begin lnYesDeficitYesLesion := 0; lnYesDeficitNoLesion := 0; lnNoDeficitYesLesion := 0; lnNoDeficitNoLesion := 0; for i := 0 to (lnGroupX-1) do begin //for each lesioned subject if lIn^[i] = 0 then inc(lnYesDeficitYesLesion) else inc(lnNoDeficitYesLesion); end; for i := lnGroupX to (lnSubj-1) do begin //for each unlesioned subject if lIn^[i] = 0 then inc(lnYesDeficitNoLesion) else inc(lnNoDeficitNoLesion); end; //for each sub lnYesDeficit :=lnYesDeficitYesLesion+lnYesDeficitNoLesion; lnNoDeficit := lnNoDeficitYesLesion+lnNoDeficitNoLesion; if (lnYesDeficit<1) or (lnNoDeficit<1) then lOutZ := 0 else begin lVal := Liebermeister(lnYesDeficitYesLesion, lnYesDeficitNoLesion, lnNoDeficitYesLesion, lnNoDeficitNoLesion); if lVal < 0 then lOutZ := -pNormalInv(abs(lVal)) else lOutZ := pNormalInv(lVal) end; //compute chi lAUC := rocAUC (lnYesDeficitYesLesion,lnNoDeficitYesLesion,lnYesDeficitNoLesion,lnNoDeficitNoLesion); {lFalseAlarmRate := lnYesDeficitNoLesion/(lnYesDeficitNoLesion+lnNoDeficitNoLesion); lHitRate := lnYesDeficitYesLesion/(lnYesDeficitYesLesion+lnNoDeficitYesLesion); lAUC := rocAz (lHitRate,lFalseAlarmRate); } //if lOutZ > 4 then ax(lnYesDeficitYesLesion,lnNoDeficitYesLesion,lnYesDeficitNoLesion,lnNoDeficitNoLesion,lauc,lOutZ); end; procedure Liebermeister2 (lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lOutZ: double); //(lnRow,lnCol: integer; var lIn,lOutZ: DoubleP0); //Liebermeister QuasiExact - excellent power var lVal: double; i,lnYesDeficit1,lnYesDeficit0,lnNoDeficit1,lnNoDeficit0, lnYesDeficit,lnNoDeficit: integer; //lMaxChi,lMinChi: single; begin lnYesDeficit0 := 0; lnYesDeficit1 := 0; lnNoDeficit0 := 0; lnNoDeficit1 := 0; for i := 0 to (lnGroupX-1) do begin //for each subject if lIn^[i] = 0 then inc(lnYesDeficit0) else inc(lnNoDeficit0); end; for i := lnGroupX to (lnSubj-1) do begin //for each subject if lIn^[i] = 0 then inc(lnYesDeficit1) else inc(lnNoDeficit1); end; //for each sub lnYesDeficit :=lnYesDeficit0+lnYesDeficit1; lnNoDeficit := lnNoDeficit0+lnNoDeficit1; if (lnYesDeficit<1) or (lnNoDeficit<1) then lOutZ := 0 else begin lVal := Liebermeister(lnYesDeficit0, lnYesDeficit1, lnNoDeficit0, lnNoDeficit1); if lVal < 0 then lOutZ := -pNormalInv(abs(lVal)) else lOutZ := pNormalInv(lVal) end; //compute chi end; procedure SortDouble (first, last: integer; var DynDataRA:DoubleP0; var lGroupRA: Bytep0); {Shell sort chuck uses this- see 'Numerical Recipes in C' for similar sorts.} {less memory intensive than recursive quicksort} label 555; const tiny = 1.0e-5; aln2i = 1.442695022; var n, nn, m, lognb2, l, k, j, i: INTEGER; swap: Single; swapbyte: byte; begin n := abs(last - first + 1); lognb2 := trunc(ln(n) * aln2i + tiny); m := last; for nn := 1 to lognb2 do begin m := m div 2; k := last - m; for j := 0 to k do begin i := j; 555: {<- LABEL} l := i + m; if (DynDataRA^[l] < DynDataRA^[i]) then begin swap := DynDataRA^[i]; DynDataRA^[i] := DynDataRA^[l]; DynDataRA^[l] := swap; swapbyte := lGroupRA^[i]; lGroupRA^[i] := lGroupRA^[l]; lGroupRA^[l] := swapbyte; i := i - m; if (i >= 0) then goto 555; end end end end;//sort procedure RankArray (first, last: integer; var DynDataRA:DoubleP0; var lGSum: double); var lnTies,lPos,lStartPos,lRankPos: integer; lScore,lTie : double; begin lGSum := 0; lPos := first; while lPos <= last do begin lStartPos := lPos; lScore := DynDataRA^[lPos]; while (lPos < last) and (lScore = DynDataRA^[lPos+1]) do inc(lPos); //count ties lnTies := lPos - lStartPos; lTie := (lnTies) *0.5; if lnTies > 0 then begin lnTies := lnTies+1;//tj on page 135 of Siegel lGSum := lGSum + (( (lnTies*lnTies*lnTies) - lnTies)/12); //showmessage(inttostr(lnTies)+' '+realtostr(lGSum,4)); end; for lRankPos := lStartPos to lPos do DynDataRA^[lRankPos] := lStartPos+1+lTie; inc(lPos);//start with next value end; end; function k_out_n (k,n: integer): double; //total possible permutations //k= smaller group, n=sum of both groups var lVal: double; begin if not gFactRAready then InitFact; if (k < 1) or (n <0) then begin result := 20000001; showmessage('error k_out_n: k and n must be positive '+inttostr(n)+':'+inttostr(k)) end else if (n > kMaxFact) or (k > kMaxFact) then result := 20000001 else begin lVal := gFactRA[n] / (gFactRA[k]*gFactRA[n-k] ); if lVal > 20000001 then result := 20000001 else result := round(lVal); //result := round(gFactRA[n] / (gFactRA[k]*gFactRA[n-k] ) ); end; // k out n = n!/(k!*(n-k)! which is equal to the PROD(i=k; 1){(n-i+1)/i} end; //k_out_n //http://www.fon.hum.uva.nl/rob/ //# samples for which the sum of the ranks in the smaller sample is smaller than or //# equal to a given upper bound W. //# $W = the bound, $Sum = the sum of ranks upto now, $m-1 = one less than the //# number of elements in the smaller sample that still have to be done, //# $Start = the current position in the ranks list, *RankList = the array //# with all the ranks (this is NOT just the numbers from 1 - N because of ties). //# The list with ranks MUST be sorted in INCREASING order. function CountSmallerRanks(var W,Sum: double; lm, Start,N: integer; var RankList: DoubleP0): integer; var Temp: double; i, mminus1: integer; begin Temp:= 0; result := 0; if(Sum > W) then exit; //Check all subsets of the remaining of RankList mminus1 := lm-1; if(mminus1 > 0) then begin for i := Start to (N-mminus1) do begin Temp := Sum + RankList^[i]; if(Temp > W) then exit;// No smaller values expected anymore result := result +CountSmallerRanks(W,Temp, mminus1, i+1, N, RankList); end; end else begin //If even adding the highest rank doesn't reach $W, //return the remaining number of items if( (Sum + N + 1) <= W) then begin result := N - Start + 1; exit; end; for i := Start to N do begin Temp := Sum + RankList^[i]; if(Temp <= W) then inc(result) else // No smaller values expected anymore exit; end; //for end; //m = 0 end; procedure SortD (first, last: integer; var DynDataRA:DoubleP0); {Shell sort chuck uses this- see 'Numerical Recipes in C' for similar sorts.} {less memory intensive than recursive quicksort} label 555; const tiny = 1.0e-5; aln2i = 1.442695022; var n, nn, m, lognb2, l, k, j, i: INTEGER; swap: Single; begin n := abs(last - first + 1); lognb2 := trunc(ln(n) * aln2i + tiny); m := last; for nn := 1 to lognb2 do begin m := m div 2; k := last - m; for j := 1 to k do begin i := j; 555: {<- LABEL} l := i + m; if (DynDataRA^[l] < DynDataRA^[i]) then begin swap := DynDataRA^[i]; DynDataRA^[i] := DynDataRA^[l]; DynDataRA^[l] := swap; i := i - m; if (i >= 0) then goto 555; end end end end;//sort function Median (var lObs: DoubleP0; lnSubj: integer): double; begin SortD(0,lnSubj-1,lObs); if odd(lnSubj) then result := lObs^[lnSubj div 2] else result := 0.5* (lObs^[(lnSubj div 2)-1]+lObs^[lnSubj div 2]); end; (* getmem(lGroupRA,lnSubj*sizeof(Byte)); createArray64(lObspX,lObsX,lnSubj); ln0 := 0; ln1 := 0; for i := 0 to (lnSubj-1) do begin //for each subject //lVal := lIn[i]; lObs[i] := lIn[i]; if i < lnGroup0 then //group0 lGroupRA[i] := 0 else lGroupRA[i] := 1; end; //for each sub for i := 0 to (lnSubj-1) do if lGroupRA[i] = 0 then inc(ln0) //number of observations in group zero else inc(ln1); //number of observations in group one if (ln0 > 1) and (ln1 > 1) then begin SortDouble(0,lnSubj-1,lObs,lGroupRA); *) procedure MeanMedian(lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lMeanFX,lMedianFX: double); //compute mean and median effect size var i: integer; lMeanY,lMeanX,lMedianY,lMedianX: double; lObsp: pointer; lObs: Doublep0; begin lMeanFX := 0; lMedianFX := 0; if (lnSubj=lnGroupX) or (lnSubj < 2) or (lnGroupX = 0) then exit; //at least one empty group - no effect size //next compute mean/median for groupX lMeanX := 0; createArray64(lObsp,lObs,lnSubj); for i := 0 to (lnGroupX-1) do begin //for each subject lMeanX := lMeanX + lIn^[i]; lObs[i] := lIn[i]; end; lMeanX := lMeanX/lnGroupX; lMedianX := Median (lObs,lnGroupX); freemem(lObsp); //next compute mean/median for groupY lMeanY := 0; createArray64(lObsp,lObs,(lnSubj-lnGroupX)); for i := lnGroupX to (lnSubj-1) do begin //for each subject lMeanY := lMeany + lIn^[i]; lObs^[i-lnGroupX] := lIn^[i]; end; lMeanY := lMeanY/ (lnSubj-lnGroupX); lMedianY := Median (lObs,(lnSubj-lnGroupX)); freemem(lObsp); //finally, compute effect sizes lMeanFX := lMeanX-lMeanY; lMedianFX := lMedianX-lMedianY; end; procedure PairedTStat (lnSubj: integer; var lIn: DoubleP0; var lOutT: double); //lIn has data for controls 1...n followed by 1..n paired measures. //e.g. if three observations, 1x,2x,3x,1c,2c,3c var i,lnObs: integer; lSqrSumDif,lSumDif,lSumDifSqr,lDF,lDif,lmeanDif,lVar: double; begin lOutT := 0; if (odd(lnSubj)) or (lnSubj < 4) then exit; //must have even number lnObs := lnSubj shr 1; lSumDif := 0; lSumDifSqr := 0; for i := 0 to (lnObs-1) do begin //for each subject lDif := lIn^[i]-(lIn^[lnObs+i]) ; lSumDif := lSumDif + lDif; lSumDifSqr := lSumDifSqr + sqr(lDif); end; lDF := lnObs - 1; if (lSumDifSqr <> 0)and (lSumDif <> 0){and (lDF <> 0) and (lnObs <> 0)} then begin lmeanDif := lSumDif / lnObs; lSqrSumDif := sqr(lSumDif); lVar := lSumDifSqr - (lSqrSumDif / lnObs); lVar := lVar / (lnObs * lDF); lVar := sqrt(lVar); if lVar <> 0 then lOutT := lmeanDif / lVar; end; end; (*procedure ReportError (lnSubj, lnGroupX: integer; var lIn: DoubleP0; lS: double); var myFile : TextFile; text : string; i: integer; begin AssignFile(myFile, 'c:\Test666.txt'); ReWrite(myFile); WriteLn(myFile,'Subj = '+INTTOSTR(lnSubj)); WriteLn(myFile,'Group1 = '+INTTOSTR(lnGroupX)); WriteLn(myFile,'Var = '+FLOATTOSTR(lS)); for i := 0 to (lnSubj-1) do WriteLn(myFile,floattostr(lIn^[i])); CloseFile(myFile); end;*) procedure TStat2 (lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lOutT: double); //pooled variance t-test http://www.okstate.edu/ag/agedcm4h/academic/aged5980a/5980/newpage26.htm const tiny = 1.0e-5; var i,lnGroupY: integer; lSumX,lSumY,lSumSqrx,lSumSqry,lVarx,lVary,lS: double; begin lnGroupY := lnSubj - lnGroupX; lOutT := 0; if (lnGroupX < 1) or (lnGroupY < 1) or (lnSubj < 3) then //need at least 1 subj in each group exit; lSumx := 0; lSumSqrX := 0; for i := 0 to (lnGroupX-1) do begin //for each subject //lVal := lIn[i]; lsumx := lsumx + lIn^[i]; lSumSqrX := lSumSqrX + sqr(lIn^[i]); end; lVarx := (lnGroupX*lSumSqrX) - Sqr(lsumx); if lnGroupX > 1 then lVarX := lVarX / (lnGroupX*(lnGroupX-1)) else lVarx := 0; lSumy := 0; lSumSqry := 0; for i := lnGroupX to (lnSubj-1) do begin //for each subject lsumy := lsumy + lIn^[i]; lSumSqry := lSumSqry + sqr(lIn^[i]); end; //for each sub //lMnY := lsumy/lnGroupY; lVary := (lnGroupY*lSumSqrY) - Sqr(lsumy); if lnGroupY > 1 then lVary := lVary / (lnGroupY*(lnGroupY-1)) else lVary := 0; //lm := (lsumx/lnGroupX)-(lsumy/lnGroupY); //mean effect size lmnx - lmny; //ldf := lnSubj - 2; ls := ( ((lnGroupX - 1) * lvarx + (lnGroupY - 1) * lvary) / (lnSubj - 2){ldf}) ; if abs(ls) < tiny then exit; if ls < 0 then showmessage('Error: t-test variance should not be zero.'); //deepshit (lnSubj, lnGroupX, lIn,lS); //if ls <= 0 then // exit; xxx ls := sqrt( ls) ; ls := ls * sqrt(1 / lnGroupX + 1 / lnGroupY); //note - to get here both lnx and lny > 0 if ls = 0 then lOutT := 0 else lOutT := ( ((lsumx/lnGroupX)-(lsumy/lnGroupY))/ls);//t = lm / ls; end; (*procedure TStatAbs (lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lOutT: double); var i,lnGroupY: integer; lSumX,lSumY,lSumSqrx,lSumSqry,lVarx,lVary,lS: double; begin lnGroupY := lnSubj - lnGroupX; if (lnGroupX < 1) or (lnGroupY < 1) then begin //need at least 1 subj in each group lOutT := 0; exit; end; lSumx := 0; lSumSqrX := 0; for i := 0 to (lnGroupX-1) do begin //for each subject lsumx := lsumx + lIn[i]; lSumSqrX := lSumSqrX + sqr(lIn[i]); end; lVarx := (lnGroupX*lSumSqrX) - Sqr(lsumx); if lnGroupX > 1 then lVarX := lVarX / (lnGroupX*(lnGroupX-1)) else lVarx := 0; lSumy := 0; lSumSqry := 0; for i := lnGroupX to (lnSubj-1) do begin //for each subject //lVal := lIn[i]; lsumy := lsumy + lIn[i]; lSumSqry := lSumSqry + sqr(lIn[i]); end; //for each sub lVary := (lnGroupY*lSumSqrY) - Sqr(lsumy); if lnGroupY > 1 then lVary := lVary / (lnGroupY*(lnGroupY-1)) else lVary := 0; ls := sqrt( ( ((lnGroupX - 1) * lvarx + (lnGroupY - 1) * lvary) / (lnSubj - 2)) ) ; ls := ls * sqrt(1 / lnGroupX + 1 / lnGroupY); //note - to get here both lnx and lny > 0 if ls = 0 then lOutT := 0 else lOutT := ( ((lsumx/lnGroupX)-(lsumy/lnGroupY))/ls);//t = lm / ls; //next - create direction map if (abs(lOutT) >= 1.96) then begin if abs (lsumx/lnGroupX) > abs(lsumy/lnGroupY) then lOutT := 4 else lOutT := -4 end else lOutT := 0; end;*) procedure TStat2Z (lnSubj, lnGroupX: integer; var lIn: DoubleP0; var lOutT: double); var i,lnGroupY: integer; lSumX,lSumY,lSumSqrx,lSumSqry,lVarx,lVary,lS: double; begin lnGroupY := lnSubj - lnGroupX; if (lnGroupX < 1) or (lnGroupY < 1) then begin //need at least 1 subj in each group lOutT := 0; exit; end; lSumx := 0; lSumSqrX := 0; for i := 0 to (lnGroupX-1) do begin //for each subject //lVal := lIn[i]; lsumx := lsumx + lIn^[i]; lSumSqrX := lSumSqrX + sqr(lIn^[i]); end; lVarx := (lnGroupX*lSumSqrX) - Sqr(lsumx); if lnGroupX > 1 then lVarX := lVarX / (lnGroupX*(lnGroupX-1)) else lVarx := 0; lSumy := 0; lSumSqry := 0; for i := lnGroupX to (lnSubj-1) do begin //for each subject //lVal := lIn[i]; lsumy := lsumy + lIn^[i]; lSumSqry := lSumSqry + sqr(lIn^[i]); end; //for each sub //lMnY := lsumy/lnGroupY; lVary := (lnGroupY*lSumSqrY) - Sqr(lsumy); if lnGroupY > 1 then lVary := lVary / (lnGroupY*(lnGroupY-1)) else lVary := 0; //lm := (lsumx/lnGroupX)-(lsumy/lnGroupY); //mean effect size lmnx - lmny; //ldf := lnSubj - 2; ls := sqrt( ( ((lnGroupX - 1) * lvarx + (lnGroupY - 1) * lvary) / (lnSubj - 2){ldf}) ) ; ls := ls * sqrt(1 / lnGroupX + 1 / lnGroupY); //note - to get here both lnx and lny > 0 if ls = 0 then lOutT := 0 else begin lOutT := ( ((lsumx/lnGroupX)-(lsumy/lnGroupY))/ls);//t = lm / ls; lOutT := TtoZ (lOutT,lnSubj-2); //fx((lsumx/lnGroupX),(lsumy/lnGroupY)); end; end; procedure TStatWelch (lnSubj, lnGroup0: integer; var lIn: DoubleP0; var lOutT: double); //see R. D. DeVeaux 'The t -test: Some details' for details //uses Welch's Test to protect against unequal variances //uses true [often fractional] Degrees of Freedom label 129; var i,lNx,lNy: integer; lVal,lSumX,lSumY,lSumSqrx,lSumSqry,lVarx,lVary,lMnX,lMnY,lM,lDF,lDenom,lZ,lT: double; begin lZ := 0; lNx := 0; lSumx := 0; lSumSqrX := 0; lNy := 0; lSumy := 0; lSumSqry := 0; for i := 0 to (lnSubj-1) do begin //for each subject lVal := lIn^[i]; if i < lnGroup0 then begin //group0 inc(lNx); lsumx := lsumx + lVal; lSumSqrX := lSumSqrX + sqr(lVal); end else begin //else group1 inc(lNy); lsumy := lsumy + lVal; lSumSqry := lSumSqry + sqr(lVal); end;//group1 end; //for each sub if (lNy < 2) or (lNx < 2) then goto 129; //unable to calculate lVarX := (lNx*lSumSqrX) - Sqr(lSumX); lVarX := lVarX / (lNx*(lNx-1)); lMnX := lSumX/lNx; lVary := (lNy*lSumSqrY) - Sqr(lsumy); lVary := lVary / (lNy*(lNy-1)); lMnY := lSumY/lNy; lm := lMnX - lMnY; //difference between means = t-Numerator if (lm = 0) {or (lVarY=0) or (lVarX = 0)} then goto 129; //no difference in proportions - do not waste time computing DF //next compute true Degrees of Freedom lDF := sqr( (lVarX/lNx)+(lVarY/lNy)); //lDF := lDF /( ((Sqr(lVarX/lNx)) / (lnx-1) ) + ((Sqr(lVarY/lNy)) / (lny-1) ) ); if (lVarX=0) or (lVarY=0) then begin //forced to estimate based on pooled variance lDF := lnx+lny -2; lDenom:= ( ((lnx - 1) * lvarx + (lny - 1) * lvary) / (lNx+lNy-2)); lDenom := sqrt(lDenom / lnx + lDenom / lny); end else begin lDF := lDF /( ((Sqr(lVarX/lNx)) / (lnx-1) ) + ((Sqr(lVarY/lNy)) / (lny-1) ) ); lDenom := sqrt(lVarX/lNx + lVary/lNy);//assume Unequal variances "Welch's Test" end; if lDenom = 0 then goto 129; lT := ( lm/lDenom);//t = m / d; lZ := TtoZ(lT,lDF); //az //lP := pNormal(TtoZ(lT,lDF)); 129: lOutT := lZ; //vlsm compatible = lOutT[lColX] := ( lm/lD);//t = m / d; end; FUNCTION specialdouble (d:double): boolean; //returns true if s is Infinity, NAN or Indeterminate //8byte IEEE: msb[63] = signbit, bits[52-62] exponent, bits[0..51] mantissa //exponent of all 1s = Infinity, NAN or Indeterminate CONST kSpecialExponent = 2047 shl 20; VAR Overlay: ARRAY[1..2] OF LongInt ABSOLUTE d; BEGIN IF ((Overlay[2] AND kSpecialExponent) = kSpecialExponent) THEN RESULT := true ELSE RESULT := false; END; procedure LocalRank (first, last: integer; var DynDataRA,DynDataRAX:DoubleP0; var lGroupRA: Bytep0); var lGroup,lnTies,lPos,lStartPos,lRankPos,lLocalRank: integer; lScore,lTie : double; begin for lGroup := 0 to 1 do begin lPos := first; lLocalRank := 0; while lPos <= last do begin if lGroupRA^[lPos] = lGroup then begin// inc(lLocalRank); lStartPos := lPos; lScore := DynDataRA^[lPos]; lnTies := 0; while (lPos < last) and (0.001 > abs (lScore - DynDataRA^[lPos+1]) ) do begin inc(lPos); //count ties if lGroupRA^[lPos] = lGroup then inc(lnTies); end; lTie := (lnTies) *0.5; for lRankPos := lStartPos to lPos do begin if lGroupRA^[lRankPos] = lGroup then DynDataRAX^[lRankPos] := (lLocalRank+lTie); end; lLocalRank := lLocalRank + lnTies; end; //if in group inc(lPos);//start with next value end; //while... for each observation end; //for each group end; procedure BMTest (lnSubj, lnGroup0: integer; var lIn: DoubleP0; var lOutT: double); //procedure BMtest (lnRow,lnCol: integer; var lIn,lOutT: DoubleP0); var lObspX,lObsp: pointer; lObsX,lObs: Doublep0; lGroupRA: Bytep0; i,ln0,ln1,lColX: integer; lDF,lZ,lGSum: double; lSum0,lSum1,lMean0,lMean1,lSqr0,lSqr1,lk0,lk1: double; begin createArray64(lObsp,lObs,lnSubj); getmem(lGroupRA,lnSubj*sizeof(Byte)); createArray64(lObspX,lObsX,lnSubj); ln0 := 0; ln1 := 0; for i := 0 to (lnSubj-1) do begin //for each subject //lVal := lIn[i]; lObs^[i] := lIn^[i]; if i < lnGroup0 then //group0 lGroupRA^[i] := 0 else lGroupRA^[i] := 1; end; //for each sub for i := 0 to (lnSubj-1) do if lGroupRA^[i] = 0 then inc(ln0) //number of observations in group zero else inc(ln1); //number of observations in group one if (ln0 > 1) and (ln1 > 1) then begin SortDouble(0,lnSubj-1,lObs,lGroupRA); RankArray(0,lnSubj-1,lObs,lGSum); lSum0 := 0; lSum1 := 0; for i := 0 to (lnSubj-1) do if lGroupRA^[i] = 0 then lSum0 := lSum0 + lObs^[i] else lSum1 := lSum1 + lObs^[i]; lMean0 := lSum0 / ln0; lMean1 := lSum1 / ln1; //fx(lmean0,lMean1); lSqr0 := 0; lSqr1 := 1; lk0 := (ln0+1)/2; lk1 := (ln1+1)/2; LocalRank(0,lnSubj-1,lObs,lObsX,lGroupRA); for i := 0 to (lnSubj-1) do if lGroupRA^[i] = 0 then lSqr0 := lSqr0 + Sqr(lObs^[i]-lObsX^[i]-lMean0+lk0) else lSqr1 := lSqr1 + Sqr(lObs^[i]-lObsX^[i]-lMean1+lk1); lSqr0 := (1/(ln0-1))*lSqr0; lSqr1 := (1/(ln1-1))*lSqr1; lZ := -(ln0*ln1*(lMean1-lMean0))/((ln0+ln1)*sqrt((ln0*lSqr0)+(ln1*lSqr1) ) ); lDF := sqr(ln0*lSqr0+ln1*lSqr1) / ( (sqr(ln0*lSqr0)/(ln0-1)) + (sqr(ln1*lSqr1)/(ln1-1)) ) ; lZ := TtoZ(lZ,lDF); //az lOutT := lZ; //fx(lZ,lDF); end else //>1 lOutT := 0; freemem(lObsp); freemem(lObspX); freemem(lGroupRA); end; //bmtest procedure WilcoxonMW2 (lnSubj, lnGroup0: integer; var lIn: DoubleP0; var lOutT: double); var lObsp: pointer; lObs: Doublep0; lGroupRA: Bytep0; m,n,i,ln0,ln1,mplusn: integer; lPermutations,lVal,lWsmalln,lZ,lZi,lTail,lGSum,lWTotal,lH0,lSum: double; begin createArray64(lObsp,lObs,lnSubj); getmem(lGroupRA,lnSubj*sizeof(Byte)); ln0 := 0; ln1 := 0; for i := 0 to (lnSubj-1) do begin //for each subject //lVal := lIn[i]; lObs[i] := lIn[i]; if i < lnGroup0 then //group0 lGroupRA^[i] := 0 else lGroupRA^[i] := 1; end; //for each sub for i := 0 to (lnSubj-1) do if lGroupRA^[i] = 0 then inc(ln0) //number of observations in group zero else inc(ln1); //number of observations in group one SortDouble(0,lnSubj-1,lObs,lGroupRA); RankArray(0,lnSubj-1,lObs,lGSum); lWsmalln := 0; if ln1 < ln0 then begin //Group1 smaller than Group0 m := ln1; n := ln0; for i := 0 to (lnSubj-1) do if lGroupRA^[i] = 1 then lWsmalln := lWsmalln + lObs^[i]; end else begin//Group0 smaller than Group1 m := ln0; n := ln1; for i := 0 to (lnSubj-1) do if lGroupRA^[i] = 0 then lWsmalln := lWsmalln + lObs^[i]; end; mplusn := m + n; lZ := 0; if lWsmalln > (mplusn*(mplusn+1)/4) then lTail := -0.5 else lTail := 0.5; if m < 1 then lZ := 0 else if lGSum = 0 then begin //no ties lZ := ( lWsmalln + lTail - m * ( m + n + 1 ) / 2 ) / sqrt( m * n * ( m + n + 1 ) / 12 ); end else begin //correct for ties, see Siegel page 135 if ((12-lGSum)<>0) and (((lnSubj*(lnSubj-1)) * (((lnSubj*lnSubj*lnSubj) -lnSubj) /12-lGSum))<> 0) then begin lZ := lWsmalln + lTail - (m * ( lnSubj + 1 ) / 2 ); lZ := lZ/sqrt ( (m*n)/ (lnSubj*(lnSubj-1)) * (((lnSubj*lnSubj*lnSubj) -lnSubj) /12-lGSum)); end else begin lZ := ( lWsmalln + lTail - m * ( m + n + 1 ) / 2 ) / sqrt( m * n * ( m + n + 1 ) / 12 ); end; end; {if lStr = '' then begin for i := 0 to (lnSubj-1) do lStr := lStr+inttostr(lGroupRA[i])+', '+floattostr( lObs[i])+';'; lStr := ('w'+floattostr(lWsmalln)+'Z'+floattostr(lZ)+'ties'+floattostr(lgSum)+'m'+inttostr(m)+'n'+inttostr(n)+':'+lStr); end; } if m < 10 then lPermutations := k_out_n(m,mplusn); if (m < 10) and (lPermutations < 20000000) and (abs(lZ) > 1) {}then begin lWTotal :=mplusn*(mplusn+1)/2; //sum ranks for both groups m and n lH0 := lWTotal * (m/mplusn); //null hypothesis lSum := 0; //next - use smallest value of W if lWSmallN > lH0 then begin lWSmallN := lH0 - (lWSmallN-lH0); //Due to ties, we need to flip the order as well, as we are searching smaller for i := 0 to (lnSubj-1) do lObs^[i] := (lnSubj+1)-lObs^[i]; for i := 0 to ((lnSubj-2) div 2) do begin //swap lVal := lObs^[i]; lObs^[i] := lObs^[lnSubj-1-i]; lObs^[lnSubj-1-i] := lVal; end; end; lVal := CountSmallerRanks(lWSmallN, lSum, m, 0,(mplusn-1), lObs); lZi := lZ; lZ :=pNormalInvQuickApprox(lVal/lPermutations); if ((lZ > 0) and (lZi < -1)) or ((lZ < 0) and (lZi > 1)) then lZ := -lZ; end; if ln1 < ln0 then //we computed unexpected tail lOutT := -lZ else lOutT := lZ;//t = m / d; freemem(lObsp); freemem(lGroupRA); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/statcr.pas0000664000175000017500000003742011326434470020461 0ustar michaelmichaelUnit statcr; interface uses Dialogs,define_types; const ITMAX = 300; EPS = 3.0e-7; kMaxFact = 1700; {<= 1754} gFactRAready : boolean = false; type FactRA = array[0..kMaxFact] of extended; var gFactRA : FactRA; FUNCTION betai(a,b,x: double): double; procedure AlertMsg (pWarningStr: String); function gammq( a,x: real): real; function Fisher (A,B,C,D: integer): double; procedure Chi2x2 (A, B, C, D: integer; var pMinExp, pChi, p, puChi, pup: double); function Liebermeister (A,B,C,D: integer): extended; procedure EstimateFDR(lnTests: integer; Ps: SingleP; var lFDR05, lFDR01: double); function Fisher1TailMidP (A,B,C,D: integer): double; { use instead of chi2x2: returns p-value} procedure InitFact; procedure EstimateFDR2(lnTests: integer; var Ps: SingleP; var lFDR05, lFDR01,lnegFDR05, lnegFDR01: double); procedure Descriptive (nV, SumOfSqrs, Sum: double; var lMn,lSD,lSE: double); procedure SuperDescriptive (var RA: SingleP; n: integer; var lMn,lSD,lSE,lSkew,lZSkew: double); implementation uses Math{power}; procedure Descriptive (nV, SumOfSqrs, Sum: double; var lMn,lSD,lSE: double); //given nV,SumOfSqrs,and Sum, returns Mean, StandardDeviation,StandardError and Skew begin //first: initialize values lSD := 0; lSE := 0; lMn := 0; if nV < 1 then exit; //next: compute mean lMn := Sum / nV; if (nV < 2) then exit; lSD := SumOfSqrs-(Sum*Sum/nV); lSD := sqrt((lSD)/(nV-1) ); lSE := lSD/ sqrt(nV); end; procedure SuperDescriptive (var RA: SingleP; n: integer; var lMn,lSD,lSE,lSkew,lZSkew: double); var i: integer; SumOfSqrs,Sum,Sigma: double; begin lMn:= 0; lSD := 0; lSE := 0; lSkew := 0; lZSkew := 0; if n < 1 then exit; Sum := 0; SumOfSqrs := 0; for i := 1 to n do begin Sum := Sum + RA^[i]; SumOfSqrs := SumOfSqrs + sqr(RA^[i]); end; Descriptive (n, SumOfSqrs, Sum,lMn,lSD,lSE); if (n < 3) or (lSD = 0) then lSkew := 0 else begin Sigma := 0; for i := 1 to n do Sigma := Sigma + Power( ((RA^[i]-lMn) / lSD) ,3); lSkew := (n/ ( (n-1)*(n-2) ) ) * Sigma; end; lZSkew := lSkew/(sqrt(6/N)); end; procedure InitFact; var lX: word; begin gFactRA[0]:= 1; gFactRA[1] := 1; for lx := 2 to kMaxFact do gFactRA[lx] := lx * gFactRA[lx-1]; gFactRAready := true; end; function FisherX (A,B,C,D: integer): double; {FisherExactTest, use instead of chi} {FisherX computes odds for this specific config only, not more extreme cases} {alternate to Chi Square, see Siegel & Castellan, Nonparametric Statistics} {use instead of Chi when n <= 20} {A= X hits, B= control hits, C = X misses, D = control misses} var N: word; begin N := A+B+C+D; if (N <= kMaxFact) and (A>=0) and (B>=0) and (C>=0) and (D>=0) and (N > 0) then begin FisherX := ( (gFactRA[A+B]/gFactRA[A])* (gFactRA[B+D]/gFactRA[B])* (gFactRA[A+C]/gFactRA[C])* (gFactRA[C+D]/gFactRA[D]) )/ gFactRA[N]; end else FisherX := 0; end; function MidPKingFisher (lSmal,lCross1,lCross2,lSmalDiag: integer): extended; var lProb1, lProb2: extended; lA,lB,lC,lD,lCnt: integer; l1st : boolean; begin lA :=lSmal; lB:=lCross1; lC:=lCross2; lD:=lSmalDiag; lProb1:=0; l1st := true; //set to true for midP for lCnt := lA downto 0 do begin if l1st then lProb1 := 0.5* FisherX(lA,lB,lC,lD) else lProb1 := lProb1 + FisherX(lA,lB,lC,lD); l1st := false; dec(lA); dec(lD); inc(lB); inc(lC); end; lA :=lSmal; lB:=lCross1; lC:=lCross2; lD:=lSmalDiag; lProb2:=0; l1st := true; //alfa -set to true for MidP while (lB >= 0) and (lC >= 0) do begin if l1st then lProb2 := 0.5* FisherX(lA,lB,lC,lD) else lProb2 := lProb2 + FisherX(lA,lB,lC,lD); l1st := false; inc(lA); inc(lD); dec(lB); dec(lC); end; if lProb1 < lProb2 then result := lProb1 else result := lProb2; //result := lprob1; end; function KingFisher (lSmal,lCross1,lCross2,lSmalDiag: integer): double; var lProb1, lProb2: double; lA,lB,lC,lD,lCnt: integer; begin lA :=lSmal; lB:=lCross1; lC:=lCross2; lD:=lSmalDiag; lProb1:=0; for lCnt := lA downto 0 do begin lProb1 := lProb1 + FisherX(lA,lB,lC,lD); dec(lA); dec(lD); inc(lB); inc(lC); end; lA :=lSmal; lB:=lCross1; lC:=lCross2; lD:=lSmalDiag; lProb2:=0; while (lB >= 0) and (lC >= 0) do begin lProb2 := lProb2 + FisherX(lA,lB,lC,lD); inc(lA); inc(lD); dec(lB); dec(lC); end; if lProb1 < lProb2 then result := lProb1 else result := lProb2; end; function Lieber (lSmal,lCross1,lCross2,lSmalDiag: integer): extended; var lA,lB,lC,lD,lCnt: integer; begin lA :=lSmal; lB:=lCross1+1; lC:=lCross2+1; lD:=lSmalDiag; result :=0; for lCnt := lA downto 0 do begin result := result + FisherX(lA,lB,lC,lD); dec(lA); dec(lD); inc(lB); inc(lC); end; //TabbedNotebookDlg.caption := realtostr(result,6) ; //TabbedNotebookDlg.caption := realtostr(result,6) ; if result <= 0.5 then exit; lA :=lSmal+1; lB:=lCross1; lC:=lCross2; lD:=lSmalDiag+1; result:=0; while (lB >= 0) and (lC >= 0) do begin result := result + FisherX(lA,lB,lC,lD); inc(lA); inc(lD); dec(lB); dec(lC); end; end; function Liebermeister (A,B,C,D: integer): extended; {A= X hits, B= control hits, C = X misses, D = control misses} begin result := 1; if (A+B+C+D)<1 then exit; if not gFactRAready then InitFact; if (A<=B) and (A<=C) and (A<=D) then {lA smallest} result :=Lieber(A,B,C,D) else if (B<=C) and (B<=D) then {lB smallest} result :=Lieber(B,A,D,C) else if (C<=D) then {lC smallest} result :=Lieber(C,D,A,B) else {d smallest} result :=Lieber(D,C,B,A); if ((A+C)>0) and ((B+D)>0) then begin if (A/(A+C)) < (B/(B+D)) then result := -result; end; end; (*function Liebermeister (Ain,Bin,Cin,Din: integer): extended; var A,B,C,D: integer; {A= X hits, B= control hits, C = X misses, D = control misses} begin A := Ain; B := Bin; C := Cin; D := Din; if (A+B+C+D)<1 then begin result := 1; exit; end; //easy way to calculate Lieberman - make more extreme, then calculate Fisher if abs(A-D) > abs(B-C) then begin inc(A); inc(D); end else begin inc(B); inc(C); end; if not gFactRAready then InitFact; if (A<=B) and (A<=C) and (A<=D) then {lA smallest} result :=KingFisher(A,B,C,D) else if (B<=C) and (B<=D) then {lB smallest} result :=KingFisher(B,A,D,C) else if (C<=D) then {lC smallest} result :=KingFisher(C,D,A,B) else {d smallest} result :=KingFisher(D,C,B,A); if ((A+C)>0) and ((B+D)>0) then begin if (A/(A+C)) < (B/(B+D)) then result := -result; end; end;*) function Fisher (A,B,C,D: integer): double; {A= X hits, B= control hits, C = X misses, D = control misses} begin if (A+B+C+D)<1 then begin result := 1; exit end; if not gFactRAready then InitFact; if (A<=B) and (A<=C) and (A<=D) then {lA smallest} result :=KingFisher(A,B,C,D) else if (B<=C) and (B<=D) then {lB smallest} result :=KingFisher(B,A,D,C) else if (C<=D) then {lC smallest} result :=KingFisher(C,D,A,B) else {d smallest} result :=KingFisher(D,C,B,A); if ((A+C)>0) and ((B+D)>0) then begin if (A/(A+C)) < (B/(B+D)) then result := -result; end; end; function Fisher1TailMidP (A,B,C,D: integer): double; {A= X hits, B= control hits, C = X misses, D = control misses} begin if (A+B+C+D)<1 then begin result := 1; exit end; if not gFactRAready then InitFact; if (A<=B) and (A<=C) and (A<=D) then {lA smallest} result :=MidPKingFisher(A,B,C,D) else if (B<=C) and (B<=D) then {lB smallest} result :=MidPKingFisher(B,A,D,C) else if (C<=D) then {lC smallest} result :=MidPKingFisher(C,D,A,B) else {d smallest} result :=MidPKingFisher(D,C,B,A); if ((A+C)>0) and ((B+D)>0) then begin if (A/(A+C)) < (B/(B+D)) then result := -result; end; end; procedure Sort (first, last: integer; var DynDataRA:SingleP); {Shell sort chuck uses this- see 'Numerical Recipes in C' for similar sorts.} {less memory intensive than recursive quicksort} label 555; const tiny = 1.0e-5; aln2i = 1.442695022; var n, nn, m, lognb2, l, k, j, i: INTEGER; swap: Single; begin n := abs(last - first + 1); lognb2 := trunc(ln(n) * aln2i + tiny); m := last; for nn := 1 to lognb2 do begin m := m div 2; k := last - m; for j := 1 to k do begin i := j; 555: {<- LABEL} l := i + m; if (DynDataRA^[l] < DynDataRA^[i]) then begin swap := DynDataRA^[i]; DynDataRA^[i] := DynDataRA^[l]; DynDataRA^[l] := swap; i := i - m; if (i >= 1) then goto 555; end end end end;//sort procedure EstimateFDR(lnTests: integer; Ps: SingleP; var lFDR05, lFDR01: double); var lInc: integer; Qs: SingleP; begin //rank Pvalues Sort(1,lnTests,Ps); {lStr := 'sort='; for lInc := 1 to knTests do lStr := lStr+realtostr(Ps[lInc],4)+','; Memo1.Lines.Add(lStr); } GetMem(Qs,lnTests*sizeof(single)); //next findcrit FDR05 for lInc := 1 to lnTests do Qs^[lInc] := (0.05*lInc)/lnTests; lFDR05 := 0; for lInc := 1 to lnTests do if Ps^[lInc] <= Qs^[lInc] then lFDR05 := Ps^[lInc]; //next findcrit FDR01 for lInc := 1 to lnTests do Qs^[lInc] := (0.01*lInc)/lnTests; lFDR01 := 0; for lInc := 1 to lnTests do if Ps^[lInc] <= Qs^[lInc] then lFDR01 := Ps^[lInc]; Freemem(Qs); end; procedure EstimateFDR2(lnTests: integer; var Ps: SingleP; var lFDR05, lFDR01,lnegFDR05, lnegFDR01: double); var lInc: integer; lrPs,Qs: SingleP; begin //rank Pvalues Sort(1,lnTests,Ps); {lStr := 'sort='; for lInc := 1 to knTests do lStr := lStr+realtostr(Ps[lInc],4)+','; Memo1.Lines.Add(lStr); } GetMem(Qs,lnTests*sizeof(single)); //next findcrit FDR05 for lInc := 1 to lnTests do Qs^[lInc] := (0.05*lInc)/lnTests; lFDR05 := 0; for lInc := 1 to lnTests do if Ps^[lInc] <= Qs^[lInc] then lFDR05 := Ps^[lInc]; //next findcrit FDR01 for lInc := 1 to lnTests do Qs^[lInc] := (0.01*lInc)/lnTests; lFDR01 := 0; for lInc := 1 to lnTests do if Ps^[lInc] <= Qs^[lInc] then lFDR01 := Ps^[lInc]; //reverse GetMem(lrPs,lnTests*sizeof(single)); for lInc := 1 to lnTests do lrPs^[lInc] := 1- Ps^[lnTests-lInc+1]; //for lInc := 1 to lnTests do // Ps[lInc] := lR[lnTests-lInc+1]; for lInc := 1 to lnTests do Qs^[lInc] := (0.05*lInc)/lnTests; lnegFDR05 := 0; for lInc := 1 to lnTests do if lrPs^[lInc] <= Qs^[lInc] then lnegFDR05 := lrPs^[lInc]; //next findcrit FDR01 for lInc := 1 to lnTests do Qs^[lInc] := (0.01*lInc)/lnTests; lnegFDR01 := 0; for lInc := 1 to lnTests do if lrPs^[lInc] <= Qs^[lInc] then lnegFDR01 := lrPs^[lInc]; FreeMem(lrPs); Freemem(Qs); end; procedure AlertMsg (pWarningStr: String); begin MessageDLG(pWarningStr, mtWarning,[mbOK],0); end; function gammln (xx: double): double; {Numerical Recipes for Pascal, p 177} const stp = 2.50662827465; var x, tmp, ser: double; begin x := xx - 1.0; tmp := x + 5.5; tmp := (x + 0.5) * ln(tmp) - tmp; ser := 1.0 + 76.18009173 / (x + 1.0) - 86.50532033 / (x + 2.0) + 24.01409822 / (x + 3.0) - 1.231739516 / (x + 4.0) + 0.120858003e-2 / (x + 5.0) - 0.536382e-5 / (x + 6.0); gammln := tmp + ln(stp * ser) end; {procedure gammln} FUNCTION betacf(a,b,x: double): double; LABEL 1; CONST itmax=100; eps=3.0e-7; VAR tem,qap,qam,qab,em,d: double; bz,bpp,bp,bm,az,app: double; am,aold,ap: double; m: integer; BEGIN am := 1.0; bm := 1.0; az := 1.0; qab := a+b; qap := a+1.0; qam := a-1.0; bz := 1.0-qab*x/qap; FOR m := 1 TO itmax DO BEGIN em := m; tem := em+em; d := em*(b-m)*x/((qam+tem)*(a+tem)); ap := az+d*am; bp := bz+d*bm; d := -(a+em)*(qab+em)*x/((a+tem)*(qap+tem)); app := ap+d*az; bpp := bp+d*bz; aold := az; am := ap/bpp; bm := bp/bpp; az := app/bpp; bz := 1.0; IF ((abs(az-aold)) < (eps*abs(az))) THEN GOTO 1 END; writeln('pause in BETACF'); writeln('a or b too big, or itmax too small'); readln; 1: betacf := az END; FUNCTION betai(a,b,x: double): double; VAR bt: double; BEGIN IF ((x < 0.0) OR (x > 1.0)) THEN BEGIN writeln('pause in routine BETAI'); readln END; IF ((x = 0.0) OR (x = 1.0)) THEN bt := 0.0 ELSE bt := exp(gammln(a+b)-gammln(a)-gammln(b) +a*ln(x)+b*ln(1.0-x)); IF (x < ((a+1.0)/(a+b+2.0))) THEN betai := bt*betacf(a,b,x)/a ELSE betai := 1.0-bt*betacf(b,a,1.0-x)/b END; procedure gser(var gamser, a,x, gln: real); var n: integer; sum, del, ap: real; begin gln := gammln(a); if x <= 0.0 then begin if x < 0.0 then AlertMsg('x less then 0 in routine GSER'); gamser:= 0.0; end else begin ap := a; sum := 1.0/a; del := sum; for n := 1 to ITMAX do begin ap := ap + 1; del := del * (x/ap); sum := sum + del; if (abs(del) < abs((sum)*EPS) )then begin gamser := sum * exp(-x+a*ln(x)-gln); exit; end; end; Alertmsg('GSER error: ITMAX too small for requested a-value'); end; end; procedure gcf(var gammcf: real; a,x, gln: real); var n: integer; gold,fac,b1,b0,a0,g,ana,anf,an,a1: real; begin fac := 1.0; b1 := 1.0; b0 := 0.0; a0 := 1.0; gold := 0.0; gln := gammln(a); a1 := x; for n := 1 to ITMAX do begin an :=(n); ana := an - a; a0 := (a1 + a0*ana)*fac; b0 := (b1 + b0*ana)*fac; anf := an * fac; a1 := x*a0+anf*a1; b1 := x*b0+anf*b1; if a1 <> 0 then begin fac := 1.0/a1; g := b1*fac; if (abs((g-gold)/g) 0 then begin {avoid divide by 0} pMinExp := ((lA + lB) * (lA + lC)) / lN; if (((lA + lB) * (lB + lD)) / lN) < pMinExp then pMinExp := ((lA + lB) * (lB + lD)) / lN; if (((lC + lD) * (lA + lC)) / lN) < pMinExp then pMinExp := ((lC + lD) * (lA + lC)) / lN; if (((lC + lD) * (lB + lD)) / lN) < pMinExp then pMinExp := ((lC + lD) * (lB + lD)) / lN; end else pMinExp := 0; lSameOdds := false; if (lC > 0) and (lD > 0) then begin if (lA / lC) = (lB / lD) then lSameOdds := true; end; if (lC = 0) and (lD = 0) then lSameOdds := true; if ((lA+lC) = 0) or ((lB+lD) = 0) then lSameOdds := true; if (lSameOdds = true) then begin pChi := 0; {same odds} p := 1.0; puChi := 0; pup := 1.0; end else begin puChi := ((sqr((lA * lD) - (lB * lC))) * lN) / ((la + lb) * (lc + ld) * (lb + ld) * (la + lc)); pup := gammq(0.5, 0.5 * puChi); {half df} pChi := ((sqr(abs((lA * lD) - (lB * lC)) - (0.5 * lN))) * lN) / ((la + lb) * (lc + ld) * (lb + ld) * (la + lc)); p := gammq(0.5, 0.5 * pChi); end; end; END. mricron-0.20120505.1~dfsg.1.orig/npm/spread.pas0000664000175000017500000010100111540116506020415 0ustar michaelmichaelunit spread; interface {$H+} uses {$IFNDEF FPC} //Utils, Toolwin,shlobj,Spin,ShellApi,windows,messages, {$ELSE} LResources, {$ENDIF} SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, Menus, ComCtrls, Buttons,Clipbrd,design, StdCtrls,Registry, define_types,valformat; type { TSpreadForm } TSpreadForm = class(TForm) DataGrid: TStringGrid; MainMenu1: TMainMenu; File1: TMenuItem; //DescriptiveMenu: TMenuItem; New1: TMenuItem; Open1: TMenuItem; Design1:TMenuItem; Quit1: TMenuItem; ToolBar1: TToolBar; Help1: TMenuItem; Aboutthissoftware1: TMenuItem; StatusBar1: TStatusBar; Save1: TMenuItem; Edit1: TMenuItem; Copy1: TMenuItem; Paste1: TMenuItem; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Selectall1: TMenuItem; View: TMenuItem; Font1: TMenuItem; N81: TMenuItem; N101: TMenuItem; N121: TMenuItem; N141: TMenuItem; DesignBtn: TSpeedButton; Clearallcells1: TMenuItem; DescriptiveMenu: TMenuItem; procedure UpdateLabels; function GetVal (lC,lR: integer; var lVal: double): boolean; procedure Quit1Click(Sender: TObject); procedure FormResize(Sender: TObject); procedure Aboutthissoftware1Click(Sender: TObject); procedure OpenBtnClick(Sender: TObject); procedure DataGridSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure NewBtnClick(Sender: TObject); procedure Save1Click(var NoCancel: boolean); procedure FormCreate(Sender: TObject); procedure DataGridMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure OpenTextFile (var lFilename:string); function CheckSave2Close (lAllowCancel: boolean): boolean; procedure DataGridKeyPress(Sender: TObject; var Key: Char); procedure Copy1Click(Sender: TObject); procedure Paste1Click(Sender: TObject); procedure SaveBtnClick(Sender: TObject); procedure ShowStatus; procedure ReadCells2Buffer; procedure Selectall1Click(Sender: TObject); procedure FontSizeChange(Sender: TObject); procedure DataGridMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure DataGridDrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState); procedure Clearallcells1Click(Sender: TObject); procedure DesignBtnClick(Sender: TObject); procedure AddMRIScansClick(Sender: TObject); procedure DescriptiveClick(Sender: TObject); function SOpenDialogExecute (lCaption: string;lAllowMultiSelect,lForceMultiSelect: boolean; lFilter: string): boolean; {$IFNDEF FPC} procedure FormClose(Sender: TObject; var Action: TCloseAction); {$ELSE} procedure FormClose(Sender: TObject); //procedure SpeedButton3Click(Sender: TObject); {$ENDIF} private //procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES; { Private declarations } public { Public declarations } end; var SpreadForm: TSpreadForm; const kRegressSWName = 'VAL'; kRegressSWVers = kRegressSWName+' v1.0'; kMaxFactors = 1; gVALChanges: boolean = false; gDesignUnspecified : boolean = true; gEnterCell : boolean= false; gVALFontSize: integer = 8; kMagicDouble : double = -111666222; //kVALNativeSignature = 'abba'; //kTxtExt = '.txt'; //kVALNativeExt = '.val'; implementation uses statcr,hdr; {$IFNDEF FPC} {$R *.DFM} {$ENDIF} function TSpreadForm.SOpenDialogExecute (lCaption: string;lAllowMultiSelect,lForceMultiSelect: boolean; lFilter: string): boolean;//; lAllowMultiSelect: boolean): boolean; var lNumberofFiles: integer; begin OpenDialog1.Filter := lFilter;//kAnaHdrFilter;//lFilter; OpenDialog1.FilterIndex := 1; OpenDialog1.Title := lCaption; if lAllowMultiSelect then OpenDialog1.Options := [ofAllowMultiSelect,ofFileMustExist] else OpenDialog1.Options := [ofFileMustExist]; result := OpenDialog1.Execute; if not result then exit; if lForceMultiSelect then begin lNumberofFiles:= OpenDialog1.Files.Count; if lNumberofFiles < 2 then begin Showmessage('Error: This function is designed to overlay MULTIPLE images. You selected less than two images.'); result := false; end; end; end; (*procedure TSpreadForm.WMDropFiles(var Msg: TWMDropFiles); var lStr: string; CFileName: array[0..MAX_PATH] of Char; begin try if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then //requires ShellAPI in 'uses' clause begin if gChanges then begin if not CheckSave2Close(true) then exit; end; lStr := CFilename; OpenTextFile(lStr); OpenDialog1.FileName := lStr; Msg.Result := 0; end; finally DragFinish(Msg.Drop); end; end; *) procedure TSpreadForm.Quit1Click(Sender: TObject); begin if not CheckSave2Close(true) then exit; gVALChanges := false; SpreadForm.Close; end; procedure TSpreadForm.FormResize(Sender: TObject); var lClient,lWid,lCount: integer; begin lCount := DataGrid.ColCount; lClient := DataGrid.ClientWidth; if lCount < 1 then begin DataGrid.ColWidths[0] := lClient; exit; end; lWid := ((lClient) div lCount); DataGrid.DefaultColWidth := lWid-1; (*if lWid <> lCol1Wid then begin lCol1Wid := (lClient-((lCount) * lWid))-lCount{-14}; lGrid.ColWidths[0] := lCol1Wid; end;*) end; function ColLabel (lCol: integer): string; //first column= A, 26th=Z,27th AA, etc... var lColDiv,lColMod: integer; begin result := ''; lColDiv := lCol; repeat lColMod := lColDiv mod 26; if lColMod = 0 then lColMod := 26; result := chr(ord('A')+lColMod-1)+result; {if lColDiv = 26 then lColDiv := 0 else} lColDiv := (lColDiv-1) div 26; until lColDiv <= 0; end; procedure UpdateGridLabels(lGrid: TStringGrid); var lA,lInc,lInc2: integer; begin if lGrid.RowCount < 2 then exit; //for lInc := (lGrid.RowCount -1) downto 1 do // lGrid.Cells[0,kMaxFactors+lInc] := inttostr(lInc); if (lGrid.ColCount) < 1 then exit; //Next enter ANOVA labels for each row for lInc := (lGrid.ColCount-1 {-1 for Lazarus 999}) downto 0 do for lInc2 := 0 to kMaxFactors do lGrid.Cells[lInc,lInc2] := ''; lA := DesignForm.AVal.value; //999 showmessage(inttostr(lGrid.RowCount)+'x'+inttostr(lGrid.ColCount)+'alpha'+inttostr(lA)); //lGrid.Cells[0,0] := ''; for lInc := 1 to lA do lGrid.Cells[lInc,0] := DesignForm.ALevelNames.Cells[lInc-1,0]; {$IFDEF FPC} for lInc := (lGrid.ColCount -2) downto 0 do lGrid.Cells[lInc +1 ,kMaxFactors] := ColLabel(lInc+1); {$ELSE} for lInc := (lGrid.ColCount -1) downto 0 do lGrid.Cells[lInc+1,kMaxFactors] := ColLabel(lInc+1);//chr(ord('A')+lInc); {$ENDIF} end; procedure TSpreadForm.UpdateLabels; begin DataGrid.ColCount := DesignForm.AVal.value+1; //2007 For FPC UpdateGridLabels(DataGrid); DataGrid.ColCount := DesignForm.AVal.value+1; end; procedure TSpreadForm.Aboutthissoftware1Click(Sender: TObject); begin Showmessage(kRegressSWVers); // AboutForm.Showmodal; end; procedure ClearDesignMatrix; begin gDesignUnspecified := true; SpreadForm.DesignBtn.Caption := 'Design: not specified'; end; procedure DesignBtnLabelUpdate; begin SpreadForm.DesignBtn.Caption := 'Design IVs: '+inttostr(DesignForm.AVal.Value) ; SpreadForm.UpdateLabels; SpreadForm.FormResize(nil); end; {$ifdef fpc} function alignx(addr : Pointer;alignment : PtrUInt) : Pointer; begin result:=align(addr,alignment); end; {$endif} procedure TSpreadForm.OpenTextFile (var lFilename:string); var lTemplateName:string; lnCritPct,lnRow,lnCol,lnColWObs,lCol,lRow: integer; //lLesionCovary : boolean; lPredictorList,lFileList:TStringList; lDoublePtr: Pointer; lDoubleBuf : DoubleP; begin Self.Caption := kRegressSWVers+': '+extractfilename(lFilename); ClearDesignMatrix; lPredictorList := TStringList.Create; lFileList := TStringList.Create; gVALChanges := false; OpenValFile (lFilename,lTemplateName, lnRow,lnCol,lnColWObs,lnCritPct,gDesignUnspecified,lPredictorList,lFileList,lDoublePtr); {$IFDEF FPC} DataGrid.RowCount := kMaxFactors+lnRow{-1}; {$ELSE} DataGrid.RowCount := kMaxFactors+lnRow; {$ENDIF} DataGrid.ColCount := lnCol+1; DataGrid.refresh; {$IFDEF FPC} lDoubleBuf := alignx(lDoublePtr, 16); // note: lDoubleBuf > lDoublePtr always (VSDS); {$ELSE} lDoubleBuf := DoubleP($fffffff0 and (integer(lDoublePtr)+15)); {$ENDIF} if lFileList.Count < lnRow then lnRow := lFileList.Count; for lRow := 1 to lnRow do begin DataGrid.Cells[ 0, kMaxFactors+lRow ] := lFileList.Strings[lRow-1]; for lCol := 1 to lnCol do begin if lDoubleBuf^[RowColPos (lRow,lCol,lnColWObs)] = kMagicDouble then DataGrid.Cells[ lCol, kMaxFactors+lRow ] := '' else DataGrid.Cells[ lCol, kMaxFactors+lRow ] := floattostr((lDoubleBuf^[RowColPos (lRow,lCol,lnColWObs)])); end; end; if lPredictorList.Count < lnRow then for lCol := (lPredictorList.Count+1) to lnRow do lPredictorList.Add( 'Pred'+inttostr(lCol) ); DesignForm.ALevelNames.ColCount := lnCol; for lCol := 1 to lnCol do DesignForm.ALevelNames.Cells[lCol-1,0] := lPredictorList.Strings[lCol-1]; Freemem(lDoublePtr); lPredictorList.Free; lFileList.free; //DesignForm.LesionCovaryCheck.Checked := lLesionCovary; DesignForm.CritPctEdit.value := lnCritPct; DesignForm.TemplateLabel.Caption := lTemplateName; //Tidy Up... DesignForm.AVal.Value := lnCol; UpdateLabels; DesignBtnLabelUpdate; FormResize(nil); if gDesignUnspecified then Showmessage('You need to define the experiment design [press the ''Design'' button]'); end; procedure TSpreadForm.OpenBtnClick(Sender: TObject); var lFileName: string; begin if gVALChanges then begin if not CheckSave2Close(true) then exit; end; if not SOpenDialogExecute('Select VAL design file',false,false, kValFilter) then exit; lFilename := OpenDialog1.filename; if not fileexists(lFilename) then exit; OpenTextFile(lFilename); end; procedure GridToStatusBar(lGrid: TStringGrid; lStatus: TStatusBar); begin {$IFDEF FPC} //SpreadForm.StatusBar1.Panels[1].Text := inttostr(random(888)); if (lGrid.Selection.Top <= kMaxFactors) or (lGrid.Selection.Left <= 0) then begin lGrid.Selection:=TGridRect(Rect(-1,-1,-1,-1)); SpreadForm.Caption := ''; exit; end; if lGrid.Selection.Top < 0 then exit; if((lGrid.Selection.Top = lGrid.Selection.Bottom ) and ( lGrid.Selection.Left = lGrid.Selection.Right )) then begin SpreadForm.Caption := lGrid.Cells[0,lGrid.Selection.Top]+' = '+lGrid.Cells[lGrid.Selection.Left,lGrid.Selection.Top]+' '+ lGrid.Cells[lGrid.Selection.Left,0]+' '+ lGrid.Cells[lGrid.Selection.Left,1]+inttostr(lGrid.Selection.Top-kMaxFactors); end else begin SpreadForm.Caption := inttostr(lGrid.Selection.Bottom-lGrid.Selection.Top + 1)+'R x '+ inttostr(lGrid.Selection.Right-lGrid.Selection.Left + 1)+'C'; end; (*if((lGrid.Selection.Top <> lGrid.Selection.Bottom ) or ( lGrid.Selection.Left <> lGrid.Selection.Right )) then exit; if (lGrid.Selection.Top <= kMaxFactors) or (lGrid.Selection.Left <= 0) then begin lGrid.Selection:=TGridRect(Rect(-1,-1,-1,-1)); lStatus.Panels[0].Text := ''; exit; end; if (lGrid.Selection.Top < 0) then exit; //lStatus.Panels[1].Text := inttostr(lGrid.Selection.Bottom-lGrid.Selection.Top + 1)+'R x '+ inttostr(lGrid.Selection.Right-lGrid.Selection.Left + 1)+'C'; //lStatus.Panels[1].Text := inttostr(lGrid.Selection.Top)+'R x '+ inttostr(lGrid.Selection.Bottom)+'C'; SpreadForm.Caption := inttostr(lGrid.Selection.Top)+'R x '+ inttostr(lGrid.Selection.Left)+'C'; exit; if((lGrid.Selection.Top = lGrid.Selection.Bottom ) and ( lGrid.Selection.Left = lGrid.Selection.Right )) then begin lStatus.Panels[1].Text := {ColLabel(lGrid.Selection.Left)+}lGrid.Cells[0,lGrid.Selection.Top]{inttostr(lGrid.Selection.Top-kMaxFactors)}+' = '+lGrid.Cells[lGrid.Selection.Left,lGrid.Selection.Top]; // lStatus.Panels[0].Text := lGrid.Cells[lGrid.Selection.Left,0]+' '+ lGrid.Cells[lGrid.Selection.Left,1]+' '+lGrid.Cells[lGrid.Selection.Left,2]; // lStatus.Panels[0].Text := lGrid.Cells[lGrid.Selection.Left,0]+' '+ lGrid.Cells[lGrid.Selection.Left,1]+inttostr(lGrid.Selection.Top-kMaxFactors); //lStatus.Panels[0].Text := lGrid.Cells[lGrid.Selection.Left,0]+' '+ lGrid.Cells[lGrid.Selection.Left,1]+inttostr(lGrid.Selection.Top-kMaxFactors); end else begin lStatus.Panels[0].Text := inttostr(lGrid.Selection.Bottom-lGrid.Selection.Top + 1)+'R x '+ inttostr(lGrid.Selection.Right-lGrid.Selection.Left + 1)+'C'; lStatus.Panels[1].Text := ''; end; *) {$ELSE} //Delphi if (lGrid.Selection.Top <= kMaxFactors) or (lGrid.Selection.Left <= 0) then begin lGrid.Selection:=TGridRect(Rect(-1,-1,-1,-1)); lStatus.Panels[0].Text := ''; exit; end; if lGrid.Selection.Top < 0 then exit; if((lGrid.Selection.Top = lGrid.Selection.Bottom ) and ( lGrid.Selection.Left = lGrid.Selection.Right )) then begin lStatus.Panels[1].Text := lGrid.Cells[0,lGrid.Selection.Top]+' = '+lGrid.Cells[lGrid.Selection.Left,lGrid.Selection.Top]; lStatus.Panels[0].Text := lGrid.Cells[lGrid.Selection.Left,0]+' '+ lGrid.Cells[lGrid.Selection.Left,1]+inttostr(lGrid.Selection.Top-kMaxFactors); end else begin lStatus.Panels[0].Text := inttostr(lGrid.Selection.Bottom-lGrid.Selection.Top + 1)+'R x '+ inttostr(lGrid.Selection.Right-lGrid.Selection.Left + 1)+'C'; lStatus.Panels[1].Text := ''; end; {$ENDIF} end; procedure TSpreadForm.ShowStatus; begin //SpreadForm.Caption := inttostr(random(888)); GridToStatusBar(DataGrid,StatusBar1); end; procedure TSpreadForm.DataGridSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin //ShowStatus; //bxxx gEnterCell := true; end; procedure TSpreadForm.NewBtnClick(Sender: TObject); begin DesignForm.Showmodal; gDesignUnspecified := false; DesignBtnLabelUpdate; end; function RemoveColons( lStr: string): string; var lLen,lPos: integer; begin result := lStr; lLen := length(lStr); if lLen < 1 then exit; for lPos := 1 to lLen do if result[lPos] = ':' then result[lPos] := ';'; end; function Str2Float (var lStr: string; var lError: boolean): single; begin lError := false; try result := Strtofloat(lStr); except on EConvertError do lError := true; end; //except end; procedure TSpreadForm.Save1Click(var NoCancel: boolean); const kNative = 1; kTxt = 2; var f: TextFile; lFormat,C, R,lLen,lPos,ColStart,ColEnd,RowStart,RowEnd : integer ; lLevelStr,lFilename,S,lCell,lExt : string ; kSpacer,lDecimalSep : char; lError: boolean; begin NoCancel := false; if not SaveDialog1.Execute then exit; lFormat := SaveDialog1.FilterIndex; if (lFormat < kNative) or (lFormat > kTxt) then lFormat := kNative; case lFormat of kTxt: lExt := kTXText; else lExt := kValNativeExt; end; if lFormat <> kNative then begin case MessageDlg( 'Export file as a text format? Note you will lose information about the experiment design [save to Native format to preserve condition information]', mtWarning, [mbYes, mbCancel], 0 ) of mrCancel : exit ; end ; end; //not native if (lFormat = kNative) and (gDesignUnspecified) then begin showmessage('Unable to save this data as '+kRegressSWVers+' format file until you have specified the conditions [press the ''Design'' button]'); exit; end; //lExt := StrUpper(PChar(extractfileext(SaveDialog1.Filename))); lFilename := SaveDialog1.Filename; lDecimalSep := DecimalSeparator; DecimalSeparator := '.'; ChangeFileExt(lFilename,lExt); // Setup... kSpacer := #9; //tab S := '' ; RowStart := kMaxFactors+1 ; RowEnd := DataGrid.RowCount - 1; ColStart := 0 ; ColEnd := DataGrid.ColCount - 1; if (ColEnd < ColStart) or (RowEnd < RowStart) then exit; // Copy to string for R := RowStart to RowEnd do begin for C := ColStart to ColEnd do begin lCell := DataGrid.Cells[ C, R ]; if C <> ColStart then begin if lCell = '' then //this simply prevents error reports when run from debugger lError := true else Str2Float (lCell, lError); if (lError) then lCell := '-'; end; S := S + lCell; if( C < DataGrid.ColCount - 1 ) then S := S + kSpacer{#9} ; // Tab end ; if R <> (DataGrid.RowCount - 1) then //all except last line S := S + #13#10 ; // End line end ; AssignFile(f, lFileName); rewrite(f); if lFormat = kNative then begin Self.Caption := kRegressSWVers+': '+extractfilename(SaveDialog1.Filename);//remove any previous filename if Files4D(DataGrid.Cells[ ColStart, RowStart ]) then writeln(f,kVALNativeSignatureBase + '1')//version 1 supports 4D images else writeln(f,kVALNativeSignatureBase + '0');//version 0 supports 3D images only //Details for 1st factor //writeln(f,'#Predictors:'+inttostr(lLen)+lLevelStr+lWithinSubjStr); writeln(f,'#Covary Volume'+kSpacer+bool2char(DesignForm.LesionCovaryCheck.Checked)); writeln(f,'#Template'+kSpacer+DesignForm.TemplateLabel.Caption); writeln(f,'#CritPct'+kSpacer+inttostr(DesignForm.CritPctEdit.value)); lLevelStr := 'ImageName'; lLen := DesignForm.AVal.value; if lLen >= 1 then for lPos := 1 to lLen do lLevelStr := lLevelStr+kTab+(DesignForm.ALevelNames.Cells[lPos-1,0]); writeln(f,lLevelStr); gVALChanges := false; end; Writeln(f, S); Flush(f); { ensures that the text was actually written to file } CloseFile(f); NoCancel := true; DecimalSeparator :=lDecimalSep; end; procedure registerfiletype(inft,inkey,desc,icon:string); var myreg : treginifile; ct : integer; ft,key: string; begin ft := inft; key := inkey; ct := pos('.',ft); while ct > 0 do begin delete(ft,ct,1); ct := pos('.',ft); end; if (ft = '') or (Application.ExeName = '') then exit; //not a valid file-ext or ass. app ft := '.'+ft; myreg := treginifile.create(''); try myreg.rootkey := hkey_classes_root; // where all file-types are described if key = '' then key := copy(ft,2,maxint)+'_auto_file'; // if no key-name is given, create one myreg.writestring(ft,'',key); // set a pointer to the description-key myreg.writestring(key,'',desc); // write the description myreg.writestring(key+'\DefaultIcon','',icon); // write the def-icon if given myreg.writestring(key+'\shell\open\command','',Application.ExeName+' %1'); //association finally myreg.free; end; end; procedure TSpreadForm.FormCreate(Sender: TObject); begin SpreadForm.Caption := kRegressSWName; (* registerfiletype(kNativeExt,kRegressSWName{key},kRegressSWName,Application.ExeName+',1'); DragAcceptFiles(Handle, True); *) DataGrid.Selection:=TGridRect(Rect(-1,-1,-1,-1)); gVALFontSize := 8; //DecSeparator := DecimalSeparator; //l64rBufP := nil; gEnterCell := false; gVALChanges := false; DataGrid.ColCount := 9; DataGrid.RowCount := 15; FormResize(nil); end; procedure TSpreadForm.DataGridMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var C, R : integer ; Rect : TGridRect ; begin DataGrid.MouseToCell( X, Y, C, R ) ; Rect.Left := C ; Rect.Right := C ; Rect.Top := R ; Rect.Bottom := R ; DataGrid.Selection := Rect ; end; procedure TSpreadForm.DataGridKeyPress(Sender: TObject; var Key: Char); var S : string ; begin if (Key in ['0'..'9','.',kBS,kDel,kCR]) or ((Key='-') and (gEnterCell)) then else exit; if(( DataGrid.Selection.Top = DataGrid.Selection.Bottom ) and ( DataGrid.Selection.Left = DataGrid.Selection.Right )) then begin gVALChanges := true; if gEnterCell then begin S := '' end else S := DataGrid.Cells[ DataGrid.Selection.Left,DataGrid.Selection.Top ] ; gEnterCell := false; if ( ( Key = kDEL ) or ( Key = kBS ) )then begin if( length( S ) > 0 ) then begin setlength( S, length( S ) - 1 ) ; end ; end else if ( Key = kCR ) then begin //Edit_Box.Text := S ; exit ; end else begin S := S + Key ; end ; DataGrid.Cells[ DataGrid.Selection.Left, DataGrid.Selection.Top ] := S ; //Format_Grid.Cells[ DataGrid.Selection.Left, DataGrid.Selection.Top ] := '' ; end ; end; procedure TSpreadForm.Copy1Click(Sender: TObject); var C, R : integer ; P: PChar; S : string ; RStart,CStart,REnd,CEnd : integer ; begin // Setup... S := '' ; if (DataGrid.Selection.Left < 0) or (DataGrid.Selection.Top < 0) then begin DataGrid.Selection:= TGridRect(Rect(1,1+kMaxFactors,DataGrid.ColCount-1,DataGrid.RowCount-1)); end; CStart := DataGrid.Selection.Left; CEnd := DataGrid.Selection.Right; RStart := DataGrid.Selection.Top; REnd := DataGrid.Selection.Bottom; // Copy to string for R := RStart to REnd do begin for C := CStart to CEnd do begin S := S + DataGrid.Cells[ C, R ] ; if( C < CEnd ) then begin S := S + #9 ; // Tab end ; end ; S := S + #13#10 ; // End line end ; // Set clipboard {$IFNDEF FPC} Clipboard.SetTextBuf( PChar( S ) ) ; {$ELSE} p:=StrAlloc (length(S)+1); if StrPCopy (P,S)=P then Clipboard.SetTextBuf(P); {$ENDIF} end; procedure TSpreadForm.Paste1Click(Sender: TObject); const BS = #8 ; { Backspace } CR = #13 ; { Carriage return } DEL = #127 ; { Delete } //HT = #9 ; { Horizontal Tab } //LF = #10 ; { Line Feed } //VT = #11 ; { Vertical Tab } var StartC,C, R,I : integer ; Dummy : integer ; lSciNotation,EOF: boolean; lValue: double; DecSeparator : char; Line, S, Work,WorkFilter : string ; begin // Setup... DecSeparator := DecimalSeparator; S := Clipboard.AsText ; EOF:= false; if (DataGrid.Selection.Left < 0) or (DataGrid.Selection.Top < 0) then begin Selectall1Click(nil); end; //gChanges := true; StartC := DataGrid.Selection.Left; R := DataGrid.Selection.Top; C := StartC; while( length( S ) > 0 ) do begin // Extract next line... Dummy := pos( #13#10, S + #13#10 ) ; Line := copy( S, 1, Dummy - 1 ) ; if (Dummy+1) < length(S) then //last line may not have eol S := copy( S, Dummy + 1, length( S ) ) else EOF := true; while( length( Line ) > 0 ) do begin // Extract next cell... lSciNotation := false; Dummy := pos( #9, Line + #9 ) ; Work := copy( Line, 1, Dummy - 1 ) ; Line := copy( Line, Dummy + 1, length( S ) ) ; WorkFilter := ''; if length(Work) > 0 then begin for I := length(Work) downto 1 do begin if (Work[i] in ['-','0'..'9','E','e',DecSeparator,BS,DEL,CR]) then WorkFilter := Work[i]+WorkFilter; if (Work[i] in ['E','e']) then lSciNotation := true; end; end; if lSciNotation then begin try lValue := strtofloat(Workfilter); except on EConvertError do lValue := NaN else lValue := NaN; end; //try..except if lValue <> NaN then DataGrid.Cells[ C, R ] :=(floattostr(lValue)); end else if(length(WorkFilter) > 0) and ( C < DataGrid.ColCount ) then begin DataGrid.Cells[ C, R ] := WorkFilter ; //Format_Grid.Cells[ C, R ] := '' ; end ; inc( C ) ; end ; inc( R ) ; // Move to next row if( R >= DataGrid.RowCount ) or (EOF) then begin break ; // All done with paste end ; C := StartC; end ; // While length(S) > 0 end; //proc Paste1Click (*var StartC,C, R,I : integer ; Dummy : integer ; lSciNotation,EOF,lData: boolean; lValue: double; Line, S, Work,WorkFilter : string ; begin // Setup... lValue := 0; //only to prevent compiler warning... S := Clipboard.AsText ; EOF:= false; if (DataGrid.Selection.Left < 0) or (DataGrid.Selection.Top < 0) then begin Selectall1Click(nil); end; //R := 1 ; //StartC := 1 ; StartC := DataGrid.Selection.Left; //CEnd := DataGrid.Selection.Right; R := DataGrid.Selection.Top; //REnd := DataGrid.Selection.Bottom; // Do the paste C := StartC; while( length( S ) > 0 ) do begin // Extract next line... Dummy := pos( #13#10, S + #13#10 ) ; Line := copy( S, 1, Dummy - 1 ) ; if (Dummy+1) < length(S) then //last line may not have eol S := copy( S, Dummy + 1, length( S ) ) else EOF := true; //showmessage(inttostr(C)+'x'+Line); while( length( Line ) > 0 ) do begin // Extract next cell... lSciNotation := false; //old //Dummy := pos( #9, Line + #9 ) ; //new - comma separated, etc lData := false; Dummy := length(line)+1; I := 1; repeat if (Line[i] in ['-','0'..'9','E','e']) then lData := true else begin if lData then Dummy := I; end; inc(I); until (I > length(Line)) or (Dummy = (I-1)); //end new Work := copy( Line, 1, Dummy - 1 ); //showmessage(inttostr(Dummy)+'x'+Work); Line := copy( Line, Dummy + 1, length( S ) ) ; //showmessage(Line); WorkFilter := ''; if length(Work) > 0 then begin for I := length(Work) downto 1 do begin if (Work[i] in ['-','0'..'9','E','e','.',kBS,kDEL,kCR]) then WorkFilter := Work[i]+WorkFilter; if (Work[i] in ['E','e']) then lSciNotation := true; end; end; if lSciNotation then begin try lValue := strtofloat(Workfilter); except on EConvertError do lValue := NaN; end; //try..except if lValue <> NaN then DataGrid.Cells[ C, R ] :=(floattostr(lValue)); end else if(length(WorkFilter) > 0) and ( C < DataGrid.ColCount ) then begin DataGrid.Cells[ C, R ] := WorkFilter ; //Format_Grid.Cells[ C, R ] := '' ; end ; inc( C ) ; end ; inc( R ) ; // Move to next row if( R >= DataGrid.RowCount ) or (EOF) then begin break ; // All done with paste end ; //Showmessage(inttostr(StartC)); C := StartC; end ; // TMainForm.Paste1Click end; *) procedure TSpreadForm.SaveBtnClick(Sender: TObject); var b: boolean; begin Save1Click(b); end; function TSpreadForm.CheckSave2Close (lAllowCancel: boolean): boolean; begin result := true; if not gVALChanges then exit; result := false; if lAllowCancel then begin case MessageDlg( 'Save changes?', mtWarning, [mbYes, mbNo, mbCancel], 0 ) of mrYes : begin Save1Click( result ) ; end ; mrCancel : exit ; end ; end else case MessageDlg( 'Save changes?', mtWarning, [mbYes, mbNo], 0 ) of mrYes : begin Save1Click( result ) ; end ; end; result := true; end; procedure TSpreadForm.ReadCells2Buffer; var lDbl: double; lRend,lRStart,lCStart,lCEnd,lC,lR,lPos: integer; lStr: string; l64rBufP: pointer; l64rBuf: DoubleP; begin //if l64rBufP <> nil then // freemem(l64rBufP); GetMem(l64rBufP,(DataGrid.ColCount*DataGrid.RowCount*sizeof(double))+16); {$IFDEF FPC} l64rBuf := alignx(l64rBufP, 16); {$ELSE} l64rBuf := DoubleP((integer(l64rBufP) and $FFFFFFF0)+16); {$ENDIF} lRStart := {1}kMaxFactors+1; lREnd := DataGrid.RowCount - 1; lCstart := 1; lCend := DataGrid.ColCount - 1; //gnCol := lCEnd; //gnRow := lREnd-lRStart+1; // Copy to string lPos := 0; for lR := lRStart to lREnd do begin for lC := lCStart to lCEnd do begin inc(lPos); lStr := (DataGrid.Cells[ lC, lR ]); lDbl := NaN; if length(lStr) > 0 then begin try lDbl := Strtofloat(lStr); except on EConvertError do begin showmessage('Cell '+ColLabel(lC)+inttostr(lR-kMaxFactors)+ ': Unable to convert the string '+lStr+' to a number'); DataGrid.Cells[ lC, lR ] := ''; lDbl := NaN; //NAN? Not-A-Number end; //Error end; //except end; //length > 0 l64rBuf^[lPos] :=lDbl; end ; //for each col end ; //for each row freemem(l64rBufP); end; procedure TSpreadForm.Selectall1Click(Sender: TObject); begin DataGrid.Selection:= TGridRect(Rect(1,1+kMaxFactors,DataGrid.ColCount-1,DataGrid.RowCount-1)); end; procedure TSpreadForm.FontSizeChange(Sender: TObject); begin (sender as TMenuItem).Checked := true; gVALFontSize := (sender as TMenuItem).tag; DataGrid.Font.Size := (sender as TMenuItem).tag; DataGrid.DefaultRowHeight := (sender as TMenuItem).tag+12; FormResize(nil); end; procedure TSpreadForm.DataGridMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin ShowStatus; end; procedure TSpreadForm.DataGridDrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState); begin ShowStatus; end; procedure TSpreadForm.Clearallcells1Click(Sender: TObject); var lR,lC,lRi,lCi: integer; begin lR := DataGrid.RowCount-1; lC := DataGrid.ColCount-1; for lRi := 1 to lR do begin for lCi := 1 to lC do begin DataGrid.Cells[lCi,kMaxFactors+lRi] := ''; end;//for cols end;//for rows end; procedure TSpreadForm.DesignBtnClick(Sender: TObject); begin DesignForm.Showmodal; gDesignUnspecified := false; DesignBtnLabelUpdate; end; procedure TSpreadForm.AddMRIScansClick(Sender: TObject); begin DesignForm.AddMRIBtnClick(nil); end; function TSpreadForm.GetVal (lC,lR: integer; var lVal: double): boolean; var lStr: string; lDbl: double; begin result := false; lVal := 0; lStr := (DataGrid.Cells[ lC, lR ]); if lStr = '' then exit; try lDbl := Strtofloat(lStr); except on EConvertError do begin showmessage('Cell '+ColLabel(lC)+inttostr(lR-kMaxFactors)+ ': Unable to convert the string '+lStr+' to a number'); exit; end; end; //try..except lVal := lDbl; result := true; end;//GetVal procedure TSpreadForm.DescriptiveClick(Sender: TObject); var lMn,lSD,lSE,lSkew,lZSkew: double; n,lR,lC,lRi,lCi: integer; lVal: double; RA: SingleP; begin lR := DataGrid.RowCount-1; if (lR <= kMaxFactors+1) then exit; lC := DataGrid.ColCount-1; Getmem(RA,lR * sizeof(single)); for lCi := 1 to lC do begin n := 0; for lRi := (kMaxFactors+1) to lR do begin if GetVal (lCi,lRi,lVal) then begin inc(n); RA^[n] := lVal; end; end;//for rows if n > 0 then begin SuperDescriptive (RA, n, lMn,lSD,lSE,lSkew,lZSkew); Showmessage('"'+DataGrid.Cells[ lC, 0]+'" mean='+floattostr(lMn)+',StDev='+floattostr(lSD)+',StEr='+floattostr(lSE)+',Skew='+floattostr(lSkew)+',ZSkew='+floattostr(lZSkew)); end; //n > 0 end;//for cols Freemem(RA); end; {$IFNDEF FPC} procedure TSpreadForm.FormClose(Sender: TObject; var Action: TCloseAction); {$ELSE} procedure TSpreadForm.FormClose(Sender: TObject); {$ENDIF} begin CheckSave2Close(false); end; {$IFDEF FPC} initialization {$I spread.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/npm/spread.lrs0000664000175000017500000001175511540116506020452 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TSpreadForm','FORMDATA',[ 'TPF0'#11'TSpreadForm'#10'SpreadForm'#4'Left'#3#145#1#6'Height'#3#26#2#3'Top' +#3#183#0#5'Width'#3'F'#1#13'ActiveControl'#7#8'DataGrid'#7'Caption'#6#29'Vox' +'elwise Analysis of Lesions'#12'ClientHeight'#3#1#2#11'ClientWidth'#3'F'#1#9 +'Font.Name'#6#13'MS Sans Serif'#4'Menu'#7#9'MainMenu1'#7'OnClose'#7#9'FormCl' +'ose'#8'OnCreate'#7#10'FormCreate'#8'OnResize'#7#10'FormResize'#8'Position'#7 +#14'poScreenCenter'#10'LCLVersion'#6#8'0.9.28.2'#0#11'TStringGrid'#8'DataGri' +'d'#4'Left'#2#0#6'Height'#3#211#1#3'Top'#2#25#5'Width'#3'F'#1#5'Align'#7#8'a' +'lClient'#9'FixedRows'#2#2#7'Options'#11#15'goFixedVertLine'#10'goVertLine' +#10'goHorzLine'#13'goRangeSelect'#19'goDrawFocusSelected'#6'goTabs'#15'goThu' +'mbTracking'#0#8'RowCount'#2#12#8'TabOrder'#2#0#14'TitleFont.Name'#6#13'MS S' +'ans Serif'#10'OnDrawCell'#7#16'DataGridDrawCell'#10'OnKeyPress'#7#16'DataGr' +'idKeyPress'#11'OnMouseDown'#7#17'DataGridMouseDown'#11'OnMouseMove'#7#17'Da' +'taGridMouseMove'#12'OnSelectCell'#7#18'DataGridSelectCell'#0#0#8'TToolBar'#8 +'ToolBar1'#4'Left'#2#0#6'Height'#2#25#3'Top'#2#0#5'Width'#3'F'#1#11'EdgeBord' +'ers'#11#0#8'TabOrder'#2#1#0#12'TSpeedButton'#9'DesignBtn'#4'Left'#2#1#6'Hei' +'ght'#2#22#4'Hint'#6#5'ANOVA'#3'Top'#2#0#5'Width'#2'x'#7'Caption'#6#6'Design' +#5'Color'#7#9'clBtnFace'#10'Glyph.Data'#10'z'#1#0#0'v'#1#0#0'BMv'#1#0#0#0#0#0 +#0'v'#0#0#0'('#0#0#0' '#0#0#0#16#0#0#0#1#0#4#0#0#0#0#0#0#1#0#0#0#0#0#0#0#0#0 +#0#16#0#0#0#16#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128#0#128#0#0#0#128#0 +#128#0#128#128#0#0#127#127#127#0#191#191#191#0#0#0#255#0#0#255#0#0#0#255#255 +#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0'3s3s3s3s3'#127'?'#127'?' +#127'?'#127'3sssssss?'#127#127#127#127#127#127#127'w'#0#0#0#0#0#0#0'wwwwwwww' +'3'#3'33<3333'#127#255'37'#243'3?7'#9#147'3<33'#153'7ws'#243'7'#243'3w3'#3'9' +'3<393?'#127#247#255#247#255#247#255'w'#7'w'#151'|w'#151'wwwwwwwww3'#3'3'#147 +'<3'#147'33'#127'3s'#247#243's37'#3'39<9337'#127'377'#247'333'#3'33'#153#147 +'33?'#127#255#255'w'#127#255#255'w'#7'ww|wwwwwwwwwww3'#3'33<3'#3'33'#127'337' +#255#127#243'7'#3'33<'#0#0'<7'#127'337ww73'#3'33<3'#3'3?'#127#255#255#247#255 +#127#255'w'#7'wwwwwwwwwwwwww3333333333333333'#9'NumGlyphs'#2#2#7'OnClick'#7 +#14'DesignBtnClick'#8'ShowHint'#9#14'ParentShowHint'#8#0#0#0#10'TStatusBar' +#10'StatusBar1'#4'Left'#2#0#6'Height'#2#21#3'Top'#3#236#1#5'Width'#3'F'#1#6 +'Panels'#14#1#5'Width'#3#140#0#0#1#5'Width'#2'2'#0#0#11'SimplePanel'#8#0#0#9 +'TMainMenu'#9'MainMenu1'#4'left'#2'l'#3'top'#2','#0#9'TMenuItem'#5'File1'#7 +'Caption'#6#5'&File'#0#9'TMenuItem'#4'New1'#7'Caption'#6#6'New...'#8'ShortCu' +'t'#3'N@'#7'OnClick'#7#11'NewBtnClick'#0#0#9'TMenuItem'#5'Open1'#7'Caption'#6 +#7'Open...'#8'ShortCut'#3'O@'#7'OnClick'#7#12'OpenBtnClick'#0#0#9'TMenuItem' +#5'Save1'#7'Caption'#6#4'Save'#8'ShortCut'#3'S@'#7'OnClick'#7#12'SaveBtnClic' +'k'#0#0#9'TMenuItem'#5'Quit1'#7'Caption'#6#12'Close window'#8'ShortCut'#3'W@' +#7'OnClick'#7#10'Quit1Click'#0#0#0#9'TMenuItem'#5'Edit1'#7'Caption'#6#4'Edit' +#0#9'TMenuItem'#5'Copy1'#7'Caption'#6#4'Copy'#8'ShortCut'#3'C@'#7'OnClick'#7 +#10'Copy1Click'#0#0#9'TMenuItem'#6'Paste1'#7'Caption'#6#5'Paste'#8'ShortCut' +#3'V@'#7'OnClick'#7#11'Paste1Click'#0#0#9'TMenuItem'#10'Selectall1'#7'Captio' +'n'#6#16'Select all cells'#8'ShortCut'#3'A@'#7'OnClick'#7#15'Selectall1Click' +#0#0#9'TMenuItem'#14'Clearallcells1'#7'Caption'#6#18'Clear all cells...'#7'O' +'nClick'#7#19'Clearallcells1Click'#0#0#9'TMenuItem'#15'DescriptiveMenu'#7'Ca' +'ption'#6#12'Descriptives'#7'OnClick'#7#16'DescriptiveClick'#0#0#0#9'TMenuIt' +'em'#4'View'#7'Caption'#6#4'View'#0#9'TMenuItem'#5'Font1'#7'Caption'#6#4'Fon' +'t'#0#9'TMenuItem'#3'N81'#3'Tag'#2#8#7'Caption'#6#1'8'#7'Checked'#9#10'Group' +'Index'#2'o'#9'RadioItem'#9#7'OnClick'#7#14'FontSizeChange'#0#0#9'TMenuItem' +#4'N101'#3'Tag'#2#10#7'Caption'#6#2'10'#10'GroupIndex'#2'o'#9'RadioItem'#9#7 +'OnClick'#7#14'FontSizeChange'#0#0#9'TMenuItem'#4'N121'#3'Tag'#2#12#7'Captio' +'n'#6#2'12'#10'GroupIndex'#2'o'#9'RadioItem'#9#7'OnClick'#7#14'FontSizeChang' +'e'#0#0#9'TMenuItem'#4'N141'#3'Tag'#2#14#7'Caption'#6#2'14'#10'GroupIndex'#2 +'o'#9'RadioItem'#9#7'OnClick'#7#14'FontSizeChange'#0#0#0#9'TMenuItem'#7'Desi' +'gn1'#7'Caption'#6#6'Design'#8'ShortCut'#3'D@'#7'OnClick'#7#14'DesignBtnClic' +'k'#0#0#0#9'TMenuItem'#5'Help1'#7'Caption'#6#5'&Help'#0#9'TMenuItem'#18'Abou' +'tthissoftware1'#7'Caption'#6#20'&About this software'#7'OnClick'#7#23'About' +'thissoftware1Click'#0#0#0#0#11'TOpenDialog'#11'OpenDialog1'#10'DefaultExt'#6 +#4'.val'#6'Filter'#6' SimplePanel = False end object MainMenu1: TMainMenu left = 108 top = 44 object File1: TMenuItem Caption = '&File' object New1: TMenuItem Caption = 'New...' ShortCut = 16462 OnClick = NewBtnClick end object Open1: TMenuItem Caption = 'Open...' ShortCut = 16463 OnClick = OpenBtnClick end object Save1: TMenuItem Caption = 'Save' ShortCut = 16467 OnClick = SaveBtnClick end object Quit1: TMenuItem Caption = 'Close window' ShortCut = 16471 OnClick = Quit1Click end end object Edit1: TMenuItem Caption = 'Edit' object Copy1: TMenuItem Caption = 'Copy' ShortCut = 16451 OnClick = Copy1Click end object Paste1: TMenuItem Caption = 'Paste' ShortCut = 16470 OnClick = Paste1Click end object Selectall1: TMenuItem Caption = 'Select all cells' ShortCut = 16449 OnClick = Selectall1Click end object Clearallcells1: TMenuItem Caption = 'Clear all cells...' OnClick = Clearallcells1Click end object DescriptiveMenu: TMenuItem Caption = 'Descriptives' OnClick = DescriptiveClick end end object View: TMenuItem Caption = 'View' object Font1: TMenuItem Caption = 'Font' object N81: TMenuItem Tag = 8 Caption = '8' Checked = True GroupIndex = 111 RadioItem = True OnClick = FontSizeChange end object N101: TMenuItem Tag = 10 Caption = '10' GroupIndex = 111 RadioItem = True OnClick = FontSizeChange end object N121: TMenuItem Tag = 12 Caption = '12' GroupIndex = 111 RadioItem = True OnClick = FontSizeChange end object N141: TMenuItem Tag = 14 Caption = '14' GroupIndex = 111 RadioItem = True OnClick = FontSizeChange end end object Design1: TMenuItem Caption = 'Design' ShortCut = 16452 OnClick = DesignBtnClick end end object Help1: TMenuItem Caption = '&Help' object Aboutthissoftware1: TMenuItem Caption = '&About this software' OnClick = Aboutthissoftware1Click end end end object OpenDialog1: TOpenDialog DefaultExt = '.val' Filter = 'Native [val]|.val|Tab delimited text [txt]|.txt|All files|.*' FilterIndex = 0 left = 36 top = 44 end object SaveDialog1: TSaveDialog DefaultExt = '.val' Filter = 'Native format [val]|*.val|Tab delimited text [txt]|*.txt' FilterIndex = 0 Options = [ofOverwritePrompt, ofHideReadOnly] left = 74 top = 44 end end mricron-0.20120505.1~dfsg.1.orig/npm/spread.dfm0000664000175000017500000000644511050310442020407 0ustar michaelmichaelџ TSPREADFORM0 TPF0 TSpreadForm SpreadFormLeftTopмWidthlHeightCaptionVoxelwise Analysis of LesionsColor clBtnFace Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Heightѕ Font.Name MS Sans Serif Font.Style Menu MainMenu1OldCreateOrder PositionpoScreenCenterOnClose FormCloseOnCreate FormCreateOnResize FormResize PixelsPerInch` TextHeight TStringGridDataGridLeftTopWidthdHeightМAlignalClientDefaultRowHeightRowCount FixedRowsOptions goFixedVertLine goVertLine goHorzLine goRangeSelectgoDrawFocusSelectedgoTabsgoThumbTrackingTabOrder OnDrawCellDataGridDrawCell OnKeyPressDataGridKeyPress OnMouseDownDataGridMouseDown OnMouseMoveDataGridMouseMove OnSelectCellDataGridSelectCell ColWidths@@@@@ RowHeightsTToolBarToolBar1LeftTopWidthdHeight EdgeBorders TabOrder TSpeedButton SpeedButton1LeftTopWidthHeightEnabledFlat TSpeedButton DesignBtnLeftTopWidthрHeightHintANOVACaptionDesign Glyph.Data zvBMvv( €€€€€€€€€ПППџџџџџџџџџџџџ3s3s3s3s3???3sssssss?wwwwwwwww333<3333џ37ѓ3?7 “3<33™7wsѓ7ѓ3w393<393?їџїџїџww—|w—wwwwwwwww33“<3“333sїѓs3739<9337377ї33333™“33?џџwџџwww|wwwwwwwwwww333<333337џѓ733<<7337ww7333<33?џџїџџwwwwwwwwwwwwwww3333333333333333 NumGlyphsParentShowHintShowHint OnClickDesignBtnClick TStatusBar StatusBar1LeftTopзWidthdHeightPanelsWidthŒWidth2 SimplePanel TMainMenu MainMenu1LeftlTop, TMenuItemFile1Caption&File TMenuItemNew1CaptionNew...ShortCutN@OnClick NewBtnClick TMenuItemOpen1CaptionOpen...ShortCutO@OnClick OpenBtnClick TMenuItemSave1CaptionSaveShortCutS@OnClick SaveBtnClick TMenuItem Descriptives1Caption DescriptivesShortCutD@OnClickDescriptiveClick TMenuItemQuit1Caption Close windowShortCutW@OnClick Quit1Click TMenuItemEdit1CaptionEdit TMenuItemCopy1CaptionCopyShortCutC@OnClick Copy1Click TMenuItemPaste1CaptionPasteShortCutV@OnClick Paste1Click TMenuItem Selectall1CaptionSelect all cellsShortCutA@OnClickSelectall1Click TMenuItemClearallcells1CaptionClear all cells...OnClickClearallcells1Click TMenuItemDescriptiveMenuCaption DescriiptiveShortCutD@OnClickDescriptiveClick TMenuItemViewCaptionView TMenuItemFont1CaptionFont TMenuItemN81TagCaption8Checked GroupIndexo RadioItem OnClickFontSizeChange TMenuItemN101Tag Caption10 GroupIndexo RadioItem OnClickFontSizeChange TMenuItemN121Tag Caption12 GroupIndexo RadioItem OnClickFontSizeChange TMenuItemN141TagCaption14 GroupIndexo RadioItem OnClickFontSizeChange TMenuItemDesign1CaptionDesignShortCutD@OnClickDesignBtnClick TMenuItemHelp1Caption&Help TMenuItemAboutthissoftware1Caption&About this softwareOnClickAboutthissoftware1Click TOpenDialog OpenDialog1 DefaultExt*.valFilter?Native [val]|*.val|Tab delimited text [txt]|*.txt|All files|*.*Left$Top, TSaveDialog SaveDialog1 DefaultExt.valFilter8Native format [val]|*.val|Tab delimited text [txt]|*.txtOptions ofOverwritePromptofHideReadOnlyLeftJTop,mricron-0.20120505.1~dfsg.1.orig/npm/roc.pas0000664000175000017500000002725511454075652017756 0ustar michaelmichaelunit roc; interface //demonstrates the ROC tests that are in the Brunner.pas file uses define_types,SysUtils, part,StatThds,statcr,StatThdsUtil,Brunner,//Brunner,nifti_img, DISTR Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,ExtCtrls,Menus, //overlap,ReadInt,stats,LesionStatThds,nifti_hdr, {$IFDEF FPC} LResources,gzio2, {$ELSE} gziod,associate,{$ENDIF} //must be in search path, e.g. C:\pas\mricron\npm\math {$IFNDEF UNIX} Windows, {$ENDIF} upower,IniFiles,cpucount,userdir,math, regmult,utypes; procedure testROC; procedure testROC2; function AUCbinomcont (lBinomdataRA,lContdataRA: singlep; lnSubj :integer): double; function AUCcontcont (ldatara1,ldatara2: singlep; lnSubj :integer): double; implementation uses npmform; function readCSV2 (lFilename: string; lCol1,lCol2: integer; var lnObservations : integer; var ldataRA1,ldataRA2: singlep): boolean; const kHdrRow = 0;//1; kHdrCol = 0;//1; var lNumStr: string; F: TextFile; lTempFloat: double; lCh: char; lnFactors,MaxC,R,C:integer; lError: boolean; begin lError := false; result := false; if not fileexists(lFilename) then begin showmessage('Can not find '+lFilename); exit; end; AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //First pass: determine column height/width Reset(F); C := 0; MaxC := 0; R := 0; while not Eof(F) do begin //read next line //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if lNumStr <> '' then //july06- read data immediately prior to EOF inc(R); if (R <= (kHdrRow+1)) or (MaxC < (kHdrCol+lCol1)) or (MaxC < (kHdrCol+lCol2)) then begin showmessage('problems reading CSV - not enough columns/rows '+inttostr(lCol1)+' '+inttostr(lCol2)); exit; end; lnObservations := R -kHdrRow ; //-1: first row is header.... lnFactors := MaxC-1;// -1: first column is Y values //fx(lnObservations,lnFactors); //exit; getmem(ldataRA1,lnObservations*sizeof(single)); getmem(ldataRA2,lnObservations*sizeof(single)); //second pass Reset(F); C := 1; MaxC := 0; R := 1; lNumStr := ''; lTempfloat := 0; while not Eof(F) do begin //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin if (R > kHdrRow) and (C > kHdrCol) then begin if ((C-kHdrCol) = lCol1) or ((C-kHdrCol) = lCol2) then begin if lNumStr = '-' then begin lTempFloat := 0; end else begin //number try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except //showmessage(lNumStr); if (C-kHdrCol) = lCol1 then ldataRA1^[R-kHdrRow] := lTempFloat else if (C-kHdrCol) = lCol2 then ldataRA2^[R-kHdrRow] := lTempFloat; end; //number end; //col1 or col2 end;// else //R > 1 lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 1; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if (lNumStr <> '') and (C = lnFactors) then begin //unterminated string try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except ldataRA2^[R-1] := lTempFloat; end;//unterminated string //read finel item CloseFile(F); FileMode := 2; //Set file access to read/write result := true; end; function AUCcontcont (ldatara1,ldatara2: singlep; lnSubj :integer): double; var lIn,lInDX : DoubleP0; lnGroup0,lnGroup1,lI: integer; begin result := 0.5; if lnSubj < 1 then exit; Getmem(lIn,lnSubj*sizeof(double)); Getmem(lInDX,lnSubj*sizeof(double)); for lI := 1 to lnSubj do begin lIn^[lI-1] := ldatara2^[lI]; lInDX^[lI-1] := ldatara1^[lI]; end; result := continROC2 (lnSubj, lIn, lInDX); freemem(lIn); freemem(lInDX); end; function AUCbinomcont (lBinomdataRA,lContdataRA: singlep; lnSubj :integer): double; var lIn : DoubleP0; lnGroup0,lnGroup1,lI: integer; begin result := 0.5; if lnSubj < 1 then exit; Getmem(lIn,lnSubj*sizeof(double)); lnGroup0 := 0; lnGroup1 := 0; for lI := 1 to lnSubj do begin if lBinomdataRA^[lI] = 0 then begin lIn^[lnGroup0] := lContdataRA^[lI]; inc (lnGroup0); end else begin inc (lnGroup1); lIn^[lnSubj-lnGroup1] := lContdataRA^[lI]; end; end; result := continROC (lnSubj, lnGroup0, lIn); freemem(lIn); end; procedure testROC; var lROC : single; lI,lnSubj,lnGroup0: integer; //lIn : DoubleP0; //csv lnGroup1,lCol1,lCol2: integer; var lnObservations : integer; var ldataRA1,ldataRA2: singlep ; begin npmform.MainForm.memo1.lines.clear; npmform.MainForm.memo1.lines.add('ROC analysis requires CSV format text file.'); npmform.MainForm.memo1.lines.add('First column is the filename (ignored).'); npmform.MainForm.memo1.lines.add('Second column is 0 [deficit present] or 1 [no deficit].'); npmform.MainForm.memo1.lines.add('Third column is number of voxels injured in ROI [0 or greater]:'); npmform.MainForm.memo1.lines.add('Example file:'); //npmform.MainForm.memo1.lines.add('deficit, voxels'); npmform.MainForm.memo1.lines.add('c:\c01.voi,0, 121'); npmform.MainForm.memo1.lines.add('c:\c02.voi,1, 33'); npmform.MainForm.memo1.lines.add('c:\c03.voi,0, 222'); npmform.MainForm.memo1.lines.add('c:\c04.voi,1, 56'); npmform.MainForm.memo1.lines.add('c:\c05.voi,1, 96'); npmform.MainForm.memo1.lines.add('c:\c06.voi,0, 100'); //get csv npmform.MainForm.memo1.lines.add(' ...requesting CSV file'); if not MainForm.OpenDialogExecute('Select comma separated filenames ',false,false,kTxtFilter) then exit; npmform.MainForm.memo1.lines.add(' ...reading CSV file'); if not readCSV2 (MainForm.OpenHdrDlg.Filename, 2,3, lnObservations, ldataRA1,ldataRA2) then exit; npmform.MainForm.memo1.lines.add(' ...observations: '+inttostr(lnObservations)); if lnObservations < 3 then begin showmessage('At least 3 subjects required.'); exit; end; lnSubj := lnObservations; lnGroup0 := 0; for lI := 1 to lnSubj do if ldatara1^[lI] = 0 then inc (lnGroup0); npmform.MainForm.memo1.lines.add(' ...observations with deficit [0]: '+inttostr(lnGroup0)); if (lnGroup0 = lnSubj) or (lnGroup0 = 0) then begin showmessage('Some values in the first column must be zero, some must be non-zero.'); exit; end; lROC := AUCbinomcont (ldatara1,ldatara2, lnSubj); (*Getmem(lIn,lnSubj*sizeof(double)); lnGroup0 := 0; lnGroup1 := 0; for lI := 1 to lnSubj do begin if ldatara1[lI] = 0 then begin lIn[lnGroup0] := ldatara2[lI]; inc (lnGroup0); end else begin inc (lnGroup1); lIn[lnSubj-lnGroup1] := ldatara2[lI]; end; end; lROC := continROC (lnSubj, lnGroup0, lIn); freemem(lIn); *) freemem(ldataRA1); freemem(ldataRA2); //now analyze npmform.MainForm.memo1.lines.add('ROC = '+floattostr(lROC)); //fx(lROC); end; procedure testROC2; var //lDouble: double; lVariable: boolean; lF,lROC : single; lI,lnSubj: integer; lIn,lInDX : DoubleP0; //csv lnGroup1,lCol1,lCol2: integer; var lnObservations : integer; var ldataRA1,ldataRA2: singlep ; begin npmform.MainForm.memo1.lines.clear; npmform.MainForm.memo1.lines.add('ROC analysis requires CSV format text file.'); npmform.MainForm.memo1.lines.add('First column is the filename (ignored).'); npmform.MainForm.memo1.lines.add('Second column is degree of deficit [lower value = more impaired].'); npmform.MainForm.memo1.lines.add('Third column is number of voxels injured in ROI [0 or greater]:'); npmform.MainForm.memo1.lines.add('Example file:'); //npmform.MainForm.memo1.lines.add('deficit, voxels'); npmform.MainForm.memo1.lines.add('c:\c01.voi,0.3, 121'); npmform.MainForm.memo1.lines.add('c:\c02.voi,0.1, 33'); npmform.MainForm.memo1.lines.add('c:\c03.voi,0.2, 222'); npmform.MainForm.memo1.lines.add('c:\c04.voi,1.3, 56'); npmform.MainForm.memo1.lines.add('c:\c05.voi,1.7, 96'); npmform.MainForm.memo1.lines.add('c:\c06.voi,1.5, 100'); //get csv npmform.MainForm.memo1.lines.add(' ...requesting CSV file'); if not MainForm.OpenDialogExecute('Select comma separated filenames ',false,false,kTxtFilter) then exit; npmform.MainForm.memo1.lines.add(' ...reading CSV file'); if not readCSV2 (MainForm.OpenHdrDlg.Filename, 2,3, lnObservations, ldataRA1,ldataRA2) then exit; npmform.MainForm.memo1.lines.add(' ...observations: '+inttostr(lnObservations)); if lnObservations < 3 then begin showmessage('At least 3 subjects required.'); exit; end; lnSubj := lnObservations; lF := ldatara1^[1]; lVariable := false; for lI := 1 to lnSubj do if ldatara1^[lI] <> lF then lVariable := true; if (not lVariable) then begin showmessage('The columns must have some variability.'); exit; end; Getmem(lIn,lnSubj*sizeof(double)); Getmem(lInDX,lnSubj*sizeof(double)); for lI := 1 to lnSubj do begin lIn^[lI-1] := ldatara2^[lI]; lInDX^[lI-1] := ldatara1^[lI]; end; freemem(ldataRA1); freemem(ldataRA2); //now analyze (*lnSubj := 10; lnGroup0 := 5; Getmem(lIn,lnSubj*sizeof(double)); for lI := 0 to (lnSubj-1) do lIn[lI] := -lI;//random(99); *) lROC := continROC2 (lnSubj, lIn, lInDX); npmform.MainForm.memo1.lines.add('ROC = '+floattostr(lROC)); freemem(lIn); freemem(lInDX); end; (*procedure testROC; var lROC : single; lI,lnSubj,lnGroup0: integer; lIn : DoubleP0; begin lnSubj := 10; lnGroup0 := 5; Getmem(lIn,lnSubj*sizeof(double)); for lI := 0 to (lnSubj-1) do lIn[lI] := -lI;//random(99); lROC := continROC (lnSubj, lnGroup0, lIn); npmform.MainForm.memo1.lines.add('ROC = '+floattostr(lROC)); //fx(lROC); freemem(lIn); end; *) end. mricron-0.20120505.1~dfsg.1.orig/npm/results.niiNotesseverity.txt0000664000175000017500000000440311326434470024273 0ustar michaelmichaelThreads: 2 Factor = severity c:\mri\anacom\n01.voi = 4.00 c:\mri\anacom\n02.voi = 4.50 c:\mri\anacom\n03.voi = 0.00 c:\mri\anacom\n04.voi = 2.50 c:\mri\anacom\n05.voi = 5.00 c:\mri\anacom\n06.voi = 4.00 c:\mri\anacom\n07.voi = 3.25 c:\mri\anacom\n08.voi = 0.75 c:\mri\anacom\n09.voi = 4.50 c:\mri\anacom\n10.voi = 4.50 c:\mri\anacom\n11.voi = 0.50 c:\mri\anacom\n12.voi = 1.63 c:\mri\anacom\n13.voi = 0.00 c:\mri\anacom\n14.voi = 3.50 c:\mri\anacom\n15.voi = 3.00 c:\mri\anacom\n17.voi = 4.00 c:\mri\anacom\n18.voi = 2.00 c:\mri\anacom\n19.voi = 4.50 c:\mri\anacom\n20.voi = 5.00 c:\mri\anacom\n21.voi = 0.00 c:\mri\anacom\n22.voi = 1.50 c:\mri\anacom\n23.voi = 5.00 c:\mri\anacom\n24.voi = 2.50 c:\mri\anacom\n25.voi = 5.00 c:\mri\anacom\n26.voi = 4.00 c:\mri\anacom\n27.voi = 0.00 c:\mri\anacom\n28.voi = 0.00 c:\mri\anacom\n29.voi = 2.00 c:\mri\anacom\n30.voi = 1.50 c:\mri\anacom\n31.voi = 1.75 c:\mri\anacom\n32.voi = 0.00 c:\mri\anacom\n33.voi = 2.50 c:\mri\anacom\n34.voi = 5.00 c:\mri\anacom\n35.voi = 0.00 c:\mri\anacom\n37.voi = 0.00 c:\mri\anacom\n38.voi = 3.25 c:\mri\anacom\n39.voi = 4.38 c:\mri\anacom\n40.voi = 0.00 c:\mri\anacom\n41.voi = 3.75 c:\mri\anacom\n42.voi = 0.25 c:\mri\anacom\n43.voi = 0.00 c:\mri\anacom\n44.voi = 2.00 c:\mri\anacom\n45.voi = 5.00 c:\mri\anacom\n46.voi = 0.00 c:\mri\anacom\n47.voi = 0.50 c:\mri\anacom\n48.voi = 0.00 c:\mri\anacom\n49.voi = 2.25 c:\mri\anacom\n50.voi = 0.00 c:\mri\anacom\n51.voi = 2.25 c:\mri\anacom\n52.voi = 2.00 c:\mri\anacom\n53.voi = 0.00 c:\mri\anacom\n54.voi = 0.25 c:\mri\anacom\n55.voi = 0.00 Total voxels = 7109137 Only testing voxels damaged in at least 5 individual[s] Number of Lesion maps = 53 Permutations = 0 Analysis began = 2008-Mar-24 14:41:02 Memory planks = 0.701815434883711 Max voxels per Plank = 10129639 Computing plank = 1 Voxels tested = 40826 Only tested voxels with more than 5 lesions 40826 test Std Bonferroni FWE Z 0.050=4.712, 0.025=4.852, 0.01=5.030 n=,53,minN=,5,unique overlap patterns,9785,voxels tested,20016 9785 test Unique overlap Bonferroni FWE Z 0.050=4.412, 0.025=4.560, 0.01=4.749 ttest Range -3.936...5.118 ttest +FDR Z 0.050=2.085, 0.01=3.152 ttest -FDR Z 0.050=-3.440, 0.01=9.200 Analysis finished = 2008-Mar-24 14:41:50 mricron-0.20120505.1~dfsg.1.orig/npm/regression.pas0000664000175000017500000007075311477115466021357 0ustar michaelmichaelunit regression; //only for Delphi - not Freepascal //Unit for running multiple regression interface uses {$H+} {$IFNDEF UNIX} Windows, {$ENDIF} {$IFDEF FPC} utypes,regmult,{$ELSE} utypes,regmult, {$ENDIF}define_types,Classes,nifti_hdr,sysutils,nifti_img, StatThdsUtil,Forms,Distr,Dialogs,npmform; function GetValReg (var lnSubj,lnFactors: integer; var X : PMatrix; var lImageNames: TStrings; var lPredictorList: TStringList): boolean; function ARegressNPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; var X: PMatrix; lnFactors: integer; var lPredictorList: TStringList; lOutname: string): boolean; function Regress2NPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lOutname: string; var lXadditional: PMatrix; lnAdditionalFactors: integer ): boolean; function TtoR(t,df: double): double; implementation uses valformat,hdr,math; (*function readCSV (lFilename: string; var lnObservations,lnFactors : integer; var X : PMatrix; var Y: PVector): boolean; var lNumStr: string; F: TextFile; lTempFloat: double; lCh: char; lPos,MaxC,R,C:integer; lError: boolean; begin result := false; if not fileexists(lFilename) then exit; AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //First pass: determine column height/width Reset(F); C := 0; MaxC := 0; R := 0; while not Eof(F) do begin //read next line //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if lNumStr <> '' then //july06- read data immediately prior to EOF inc(R); if (R < 2) or (MaxC < 5) then begin showmessage('problems reading CSV'); exit; end; lnObservations := MaxC; lnFactors := R -1; DimVector(Y, lnObservations); DimMatrix(X, lnFactors, lnObservations); //second pass Reset(F); C := 0; MaxC := 0; R := 1; lNumStr := ''; while not Eof(F) do begin //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin if lNumStr = '-' then begin lTempFloat := 0; end else begin //number try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading VAL file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end; if R = 1 then Y^[C+1] := lTempFloat else X^[R-1]^[C+1] := lTempFloat; //xxx := lTempFloat;//DataGrid.Cells[ C, kMaxFactors+R-1 ] := (lNumStr) ; end; lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; CloseFile(F); FileMode := 2; //Set file access to read/write result := true; end; function TestMultReg: boolean; var i,lnFactors, lnObservations: integer; X : PMatrix; Y: PVector; lOutT,lOutSlope: DoubleP0; lStart: dword; begin if not readCSV('C:\xio.csv',lnObservations,lnFactors,X,Y ) then exit; //showmessage('alpha'); getmem(lOutT, (lnFactors+1)* sizeof(double)); getmem(lOutSlope, (lnFactors+1)* sizeof(double)); lStart := gettickcount; for i := 1 to 10000 do MultipleRegressionVec (lnObservations,lnFactors, X, Y, lOutT,lOutSlope); fx(gettickcount-lstart); if MultipleRegressionVec (lnObservations,lnFactors, X, Y, lOutT,lOutSlope) then begin for i := 0 to lnFactors do fx(lOutT^[i],lOutSlope^[i]); end; freemem(lOutT); freemem(lOutSlope); DelMatrix(X, lnFactors, lnObservations); DelVector(Y, lnObservations); end; *) (*procedure rx(lnObs,lnFactors: integer; X: PMatrix; lObs: Doublep0); var n,f: integer; str: string; begin for n := 1 to lnObs do begin str := floattostr(lObs^[n-1]); for f := 1 to lnFactors do str := str+','+floattostr(X^[f]^[n]); MainForm.NPMmsg(str); end;//each obs str := '----------'; end;//proc RX*) function Sign(value: double): double; begin if value > 0 then result := 1 else if value < 0 then result := -1 else result := 0; end; function TtoR(t,df: double): double; CONST eps=3.0e-7; begin result := 0; if (t = 0) or (df = 0) then exit; result := sign(t)/ sqrt( (df/(t*t+eps)) +1 ); end; {$DEFINE SaveT} //if SaveT then t-score map will be saved {$DEFINE SaveRnotZ} //if SaveRnotZ then r-value map will be saved, but not Z-score map function Regress2NPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lOutname: string; var lXadditional: PMatrix; lnAdditionalFactors: integer ): boolean; //lImages is list 1..N of 1st images followed by 1..N of corresponding control images //example c1.img, c2.img,c3.img,e1.img,e2.img,e3.img //lImages.Count must be even label 667; const kMaxFact = 80; var lOutNameMod,lFactName,lRunName: string; lMaskImg,lPlankImg,lOutImgMn: SingleP; lOutImgR: array [1..kMaxFact] of SingleP; lTotalMemory: int64; lnFactors,lnObservations,lnObservationsDiv2,lPlank,lVolVox,lPos,lMinMask,lMaxMask,lnPlanks,lVoxPerPlank, lDF,lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lPosPct,lFact,lnStatFact: integer; l1st, lSum, lMn: double; lVar: boolean; lObsp: pointer; lObs: Doublep0; lStatHdr: TNIfTIhdr; lFdata: file; lnPermute: integer; lRanOrderp: pointer; lRanOrder: Doublep0; lZP: Pointer; lZra : DoubleP0; X : PMatrix; begin lnFactors := 1+lnAdditionalFactors; lnPermute := MainForm.ReadPermute; if odd(lImages.Count) then begin showmessage('Regress2NPMAnalyze must be passed an even number of images: the first half of the list is the experimental images, followed by corresponding control images.'); exit; end; lnObservations := lImages.Count; lnObservationsDiv2 := lImages.Count div 2; lDF := lnObservationsDiv2-lnFactors-1; if lDF < 1 then begin showmessage('Regress2NPMAnalyze: DF must be >0 (DF=[Num-Factors-1]) Num='+inttostr(lnObservationsDiv2)+' Factors='+inttostr(lnFactors) ); exit; end; DimMatrix(X, lnFactors, lnObservationsDiv2); //fx(lnAdditionalFactors); if lnAdditionalFactors > 0 then begin for lPos2 := 1 to lnAdditionalFactors do begin for lPos := 1 to lnObservationsDiv2 do begin X^[lPos2+1]^[lPos] := lXadditional^[lPos2]^[lPos]; //fx(lPos2+1,lPos, X^[lPos2+1]^[lPos]); end; end; //pos 2 end; //additional factros //Memo1.Lines.Add('Permutations = ' +IntToStr(lnPermute)); MainForm.Memo1.Lines.Add('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lnStatFact := lnFactors + 1; //factors + overall model if lnStatFact > (kMaxFact-1) then begin //-1 because factors + model MainForm.Memo1.Lines.Add('ERROR: Can not analyze more than = ' +inttostr(kMaxFact-1)+' factors'); goto 667; end; //load mask getmem(lMaskImg,lVolVox*sizeof(single)); if not LoadImg(lMaskHdr.ImgFileName, lMaskImg, 1, lVolVox,round(gOffsetRA[0]),1,lMaskHdr.NIFTIhdr.datatype,lVolVox) then begin MainForm.Memo1.Lines.Add('Unable to load mask ' +lMaskHdr.ImgFileName); goto 667; end; //next find start and end of mask lPos := 0; repeat inc(lPos); until (lMaskImg^[lPos] > 0) or (lPos = lVolVox); lMinMask := lPos; lPos := lVolVox+1; repeat dec(lPos); until (lMaskImg^[lPos] > 0) or (lPos = 1); lMaxMask := lPos; if lMaxMask = 1 then begin MainForm.Memo1.Lines.Add('Mask appears empty' +lMaskHdr.ImgFileName); goto 667; end; MainForm.Memo1.Lines.Add('Mask has voxels from '+inttostr(lMinMask)+'..'+inttostr(lMaxMask)); lVoxPerPlank := kPlankSz div lnObservations div sizeof(single) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lnObservations; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lnObservations) ) + 1; MainForm.Memo1.Lines.Add('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lnObservations))); MainForm.Memo1.Lines.Add('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); if (lnPlanks = 1) then getmem(lPlankImg,lTotalMemory*sizeof(single)) //assumes 4bpp else getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; lnVoxTested := 0; for lPos := 1 to lnObservations do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; createArray64(lObsp,lObs,lnObservations); getmem(lOutImgMn,lVolVox* sizeof(single)); for lPos := 1 to lVolVox do lOutImgMn^[lPos] := 0; for lFact := 1 to (lnStatFact) do begin //+1 as we include full model getmem(lOutImgR[lFact],lVolVox* sizeof(single)); for lPos := 1 to lVolVox do lOutImgR[lFact]^[lPos] := 0; end; createArray64(lZp,lZra,lnFactors+1); //+1 as we include full model //InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxTW, lPermuteMinTW,lPermuteMaxWMW, lPermuteMinWMW, lRanOrderp, lRanOrder); for lPlank := 1 to lnPlanks do begin MainForm.Memo1.Lines.Add('Computing plank = ' +Inttostr(lPlank)); MainForm.Refresh; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lnObservations do begin if not LoadImg(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image lPosPct := lVoxPerPlank div 100; for lPos2 := 1 to lVoxPerPlank do begin if (lPos2 mod lPosPct) = 0 then begin MainForm.ProgressBar1.Position := round((lPos2/lVoxPerPlank)*100); Application.Processmessages; end; lPos2Offset := lPos2+lStartVox-1; if lMaskImg^[lPos2Offset] <> 0 then begin inc(lnVoxTested); lSum := 0; //check for variance lVar := false; lPos := 1; l1st := (gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]; for lPos := 1 to lnObservations do lObs^[lPos-1] := (gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]; for lPos := 1 to lnObservationsDiv2 do begin lSum := lSum + lObs^[lPos-1]; if (not lVar) and (lObs^[lPos-1]<>l1st) then lVar := true; //lSumOfSqrs := lSumOfSqrs + sqr(lObs[lPos-1]); X^[1]^[lPos] := lObs^[lnObservationsDiv2+lPos-1]; end; lOutImgMn^[lPos2Offset] := lSum/lnObservationsDiv2; if lVar then begin MultipleRegression (lnObservationsDiv2,lnFactors, X, lObs, lZra); //if lPos2Offset = 359948 then rx(lnObservationsDiv2,lnFactors,X,lObs); for lFact := 1 to lnStatFact do lOutImgR[lFact]^[lPos2Offset] := lZra^[lFact-1]; end; //StatPermute (lttest,lwelch,lWMW,lImages.Count, lnGroup1,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxTW, lPermuteMinTW,lPermuteMaxWMW, lPermuteMinWMW, lObs,lRanOrder); end; //in brain mask - compute end; lStartVox := lEndVox + 1; end; //next report findings MainForm.Memo1.Lines.Add('Voxels tested = ' +Inttostr(lnVoxTested)); MainForm.reportBonferroni('Std',lnVoxTested); //next: save data if lnFactors = 1 then lRunName := 'reg' else lRunName := ''; //savedata MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save mean lOutNameMod := ChangeFilePostfixExt(lOutName,'Mn'+lRunName,'.hdr'); if not FileExistsEX(lOutNameMod) then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgMn,1); //save regression for lFact := 1 to (lnStatFact) do begin if (lFact > lnFactors) and (lnFactors = 1) then lFactName := 'intercept'+'reg' //for analysis of multiple single regressions else if (lFact > lnFactors) then lFactName := 'intercept' else lFactName := 'reg'+inttostr(lFact); MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); {$IFDEF SaveT} //if SaveTRnotZ then t-score and r-score maps will be created, but no Z-score maps //the next bit is optional - save data as T-values instead of Z-scores // this allows direct comparison with SPM... MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,lDF,0,lnVoxTested,kNIFTI_INTENT_TTEST,inttostr(lnVoxTested) ); lOutNameMod := ChangeFilePostfixExt(lOutName, 'wlsT'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgR[lFact],1); {$ENDIF} {$IFDEF SaveRnotZ} MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,lDF,0,lnVoxTested,kNIFTI_INTENT_CORREL,inttostr(lnVoxTested) ); for lPos := 1 to lVolVox do lOutImgR[lFact]^[lPos] := TtoR (lOutImgR[lFact]^[lPos],lDF); lOutNameMod := ChangeFilePostfixExt(lOutName, 'wlsR'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgR[lFact],1); {$ELSE} //next - save Zscores MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,lDF,0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); //{ DoF = Nb points - Nb parameters } for lPos := 1 to lVolVox do lOutImgR[lFact]^[lPos] := TtoZ (lOutImgR[lFact]^[lPos],lDF); MainForm.reportFDR ('wls'+lFactName, lVolVox, lnVoxTested, lOutImgR[lFact]); lOutNameMod := ChangeFilePostfixExt(lOutName, 'wls'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgR[lFact],1); {$ENDIF} freemem(lOutImgR[lFact]); end; //next: close images Freemem(lZp); freemem(lOutImgMn); freemem(lObsp); freemem(lMaskImg); freemem(lPlankImg); MainForm.Memo1.Lines.Add('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lRunName,'.txt'); MainForm.Memo1.Lines.SaveToFile(lOutNameMod); MainForm.ProgressBar1.Position := 0; DelMatrix(X, lnFactors, lnObservationsDiv2); exit; 667: //you only get here if you aborted ... free memory and report error DelMatrix(X, 1, lnObservationsDiv2); if lVolVox > 1 then freemem(lMaskImg); if lTotalMemory > 1 then freemem(lPlankImg); MainForm.Memo1.Lines.Add('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; {$DEFINE NoThread} function ARegressNPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; var X: PMatrix; lnFactors: integer; var lPredictorList: TStringList; lOutname: string): boolean; {$IFNDEF Thread} const kMaxFact = 80; {$ENDIF} label 667; var lOutNameMod,lFactName,lRunName: string; lMaskImg,lPlankImg,lOutImgMn: SingleP; {$IFDEF Thread} lOutImgR: TRegRA; {$ELSE} lOutImgR: array [1..kMaxFact] of SingleP; {$ENDIF} lTotalMemory: int64; lnObservations,lPlank,lVolVox,lPos,lMinMask,lMaxMask,lnPlanks,lVoxPerPlank, //lPos2,lPos2Offset, lDF,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lFact,lnStatFact: integer; //l1st, lSum, lMn: double; //lVar: boolean; //lObsp: pointer;lObs: Doublep0; lStatHdr: TNIfTIhdr; lFdata: file; {$IFDEF Thread} lThread,lThreadStart,lThreadEnd,lThreadInc: integer; {$ELSE} lObsP,lZP: Pointer; lObs,lZra : DoubleP0; lSum,l1st: double; lVar: boolean; lPos2,lPosPct,lPos2Offset: integer; {$ENDIF} begin lnObservations := lImages.Count; lDF := lnObservations-lnFactors-1; if lDF < 1 then begin showmessage('Regress2NPMAnalyze: DF must be >0 (DF=[Num-Factors-1]) Num='+inttostr(lnObservations)+' Factors='+inttostr(lnFactors) ); exit; end; MainForm.NPMmsg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lnStatFact := lnFactors + 1; //factors + overall model if lnStatFact > (kMaxFact-1) then begin //-1 because factors + model MainForm.NPMmsg('ERROR: Can not analyze more than = ' +inttostr(kMaxFact-1)+' factors'); goto 667; end; //load mask getmem(lMaskImg,lVolVox*sizeof(single)); if not LoadImg(lMaskHdr.ImgFileName, lMaskImg, 1, lVolVox,round(gOffsetRA[0]),1,lMaskHdr.NIFTIhdr.datatype,lVolVox) then begin MainForm.NPMmsg('Unable to load mask ' +lMaskHdr.ImgFileName); goto 667; end; //next find start and end of mask lPos := 0; repeat inc(lPos); until (lMaskImg^[lPos] > 0) or (lPos = lVolVox); lMinMask := lPos; lPos := lVolVox+1; repeat dec(lPos); until (lMaskImg^[lPos] > 0) or (lPos = 1); lMaxMask := lPos; if lMaxMask = 1 then begin MainForm.NPMmsg('Mask appears empty' +lMaskHdr.ImgFileName); goto 667; end; MainForm.NPMmsg('Mask has voxels from '+inttostr(lMinMask)+'..'+inttostr(lMaxMask)); lVoxPerPlank := kPlankSz div lnObservations div sizeof(single) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lnObservations; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lnObservations) ) + 1; MainForm.NPMmsg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lnObservations))); MainForm.NPMmsg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); if (lnPlanks = 1) then getmem(lPlankImg,lTotalMemory* sizeof(single)) //assumes 4bpp else getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; //lnVoxTested := 0; for lPos := 1 to lnObservations do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; //createArray64(lObsp,lObs,lnObservations); getmem(lOutImgMn,lVolVox* sizeof(single)); for lPos := 1 to lVolVox do lOutImgMn^[lPos] := 0; for lFact := 1 to (lnStatFact) do begin //+1 as we include full model getmem(lOutImgR[lFact],lVolVox* sizeof(single)); for lPos := 1 to lVolVox do lOutImgR[lFact]^[lPos] := 0; end; //createArray64(lZp,lZra,lnFactors+1); //+1 as we include full model {$IFDEF Thread} ClearThreadDataPvals(gnCPUThreads,0) ; {$ELSE} lnVoxTested := 0; {$ENDIF} for lPlank := 1 to lnPlanks do begin MainForm.NPMmsg('Computing plank = ' +Inttostr(lPlank)); MainForm.Refresh; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lnObservations do begin if not LoadImg(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image {$IFDEF Thread} lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error with TLinThreadStat.Create (X,ProgressBar1, lnFactors,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lnObservations, lMaskImg,lPlankImg,lOutImgMn,lOutImgR) do {$IFDEF FPC} OnTerminate := @ThreadDone; {$ELSE}OnTerminate := ThreadDone;{$ENDIF} inc(gThreadsRunning); Msg('Thread ' +Inttostr(gThreadsRunning)+' = '+inttostr(lThreadStart)+'..'+inttostr(lThreadEnd)); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; {$ELSE} //not threaded createArray64(lZp,lZra,lnFactors+1); //+1 as we include full model createArray64(lObsp,lObs,lnObservations); lPosPct := lVoxPerPlank div 100; for lPos2 := 1 to lVoxPerPlank do begin if (lPos2 mod lPosPct) = 0 then begin MainForm.ProgressBar1.Position := round((lPos2/lVoxPerPlank)*100); Application.Processmessages; end; lPos2Offset := lPos2+lStartVox-1; if lMaskImg^[lPos2Offset] <> 0 then begin inc(lnVoxTested); lSum := 0; //check for variance lVar := false; lPos := 1; l1st := (gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]; for lPos := 1 to lnObservations do begin lObs^[lPos-1] := (gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]; lSum := lSum + lObs^[lPos-1]; if (not lVar) and (lObs^[lPos-1]<>l1st) then lVar := true; end; lOutImgMn^[lPos2Offset] := lSum/lnObservations; if {lPos2Offset = 762287 }lVar then begin MultipleRegression (lnObservations,lnFactors, X, lObs, lZra); //if {lZra^[0] < -5.548} lPos2Offset = 762287 then // ReportRegression (lPos2Offset,lnObservations,lnFactors, X, lObs, lZra ); for lFact := 1 to lnStatFact do lOutImgR[lFact]^[lPos2Offset] := lZra^[lFact-1]; end; end; //in brain mask - compute end; //for each voxel Freemem(lZp); Freemem(lObsp); {$ENDIF} //if threaded else not threaded lStartVox := lEndVox + 1; end; //for each plank {$IFDEF Thread} lnVoxTested := SumThreadDataLite(gnCPUThreads); {$ENDIF} //next report findings MainForm.NPMmsg('Voxels tested = ' +Inttostr(lnVoxTested)); MainForm.reportBonferroni('Std',lnVoxTested); //next: save data if lnFactors = 1 then lRunName := lPredictorList[0] else lRunName := ''; //savedata MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save mean lOutNameMod := ChangeFilePostfixExt(lOutName,'Mean'+lRunName,'.hdr'); if not FileExistsEX(lOutNameMod) then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgMn,1); //save regression for lFact := 1 to (lnStatFact) do begin if (lFact > lnFactors) and (lnFactors = 1) then begin //nothing end else begin if (lFact > lnFactors) and (lnFactors = 1) then lFactName := 'intercept'+lPredictorList[0] //for analysis of multiple single regressions else if (lFact > lnFactors) then lFactName := 'model' else lFactName := lPredictorList[lFact-1]; MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //NEXT : optional save t-maps //MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,lDF,0,lnVoxTested,kNIFTI_INTENT_TTEST,inttostr(lnVoxTested) ); //lOutNameMod := ChangeFilePostfixExt(lOutName, 'wlsT'+lFactName,'.hdr'); //NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgR[lFact],1); //END: t-maps //next - Z scores MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,lDF,0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); //{ DoF = Nb points - Nb parameters } for lPos := 1 to lVolVox do lOutImgR[lFact]^[lPos] := TtoZ (lOutImgR[lFact]^[lPos],lDF); MainForm.reportFDR ('wls'+lFactName, lVolVox, lnVoxTested, lOutImgR[lFact]); lOutNameMod := ChangeFilePostfixExt(lOutName, 'wls'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgR[lFact],1); freemem(lOutImgR[lFact]); end;//if..else intercept and lnFactors = 1 end;//for each statfactor //next: close images //Freemem(lZp); freemem(lOutImgMn); //freemem(lObsp); freemem(lMaskImg); freemem(lPlankImg); MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lRunName,'.txt'); MainForm.MsgSave(lOutNameMod); MainForm.ProgressBar1.Position := 0; exit; 667: //you only get here if you aborted ... free memory and report error if lVolVox > 1 then freemem(lMaskImg); if lTotalMemory > 1 then freemem(lPlankImg); MainForm.NPMmsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; function GetValReg (var lnSubj,lnFactors: integer; var X : PMatrix; var lImageNames: TStrings; var lPredictorList: TStringList): boolean; var lVALFilename,lTemplateName: string; lnRow,lnColWObs,lnCritPct,lInc,lRow,lCol: integer; lDesignUnspecified : boolean; lFileList:TStringList; lInRA: DoubleP0; lInP: Pointer; begin result := false; lnSubj := 0; if not MainForm.OpenDialogExecute('Select MRIcron VAL file',false,false,'MRIcron VAL (*.val)|*.val') then begin showmessage('NPM aborted: VAL file selection failed.'); exit; end; //if not selected lVALFilename := MainForm.OpenHdrDlg.Filename; MainForm.Memo1.Lines.Add( 'VAL filename: '+lVALFilename); lFileList := TStringList.Create; if not OpenValFile (lVALFilename,lTemplateName, lnRow,lnFactors,lnColWObs,lnCritPct, lDesignUnspecified,lPredictorList,lFileList, lInP) then exit; if lnRow > 1 then begin lnSubj := lnRow -1; //top row is predictor {$IFDEF FPC} lInRA := align(lInP,16); {$ELSE} lInRA := DoubleP0($fffffff0 and (integer(lInP)+15)); //lInRA := DoubleP0((integer(lInP) and $FFFFFFF0)+16); {$ENDIF} DimMatrix(X, lnFactors, lnSubj); for lCol := 1 to lnFactors do begin for lRow := 1 to lnSubj do begin //MainForm.Memo1.Lines.Add(inttostr( (lRow*lnColWObsAndCovary)-4+lCol )); X^[lCol]^[lRow] := lInRA^[(lRow*lnColWObs)-lnColWObs-1+lCol]; end; end; MainForm.Memo1.Lines.Add(inttostr(lnFactors)+' '+inttostr(lnSubj)); for lInc := 1 to lnSubj do lImageNames.add(ExtractFileDirWithPathDelim(lVALFilename)+lFileList.Strings[lInc-1]); result := true; end else result := false; lFileList.free; Freemem(lInP); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/ReadInt.pas0000664000175000017500000000236311540116470020500 0ustar michaelmichaelunit ReadInt; interface uses {$IFDEF FPC} LResources,{$ENDIF} Buttons{only Lazarus?},SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin; type TReadIntForm = class(TForm) ReadIntEdit: TSpinEdit; ReadIntLabel: TLabel; OKBtn: TButton; function GetInt(lStr: string; lMin,lDefault,lMax: integer): integer; procedure OKBtnClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var ReadIntForm: TReadIntForm; implementation {$IFNDEF FPC} {$R *.DFM} {$ENDIF} function TReadIntForm.GetInt(lStr: string; lMin,lDefault,lMax: integer): integer; begin //result := lDefault; ReadIntLabel.caption := lStr+' ['+inttostr(lMin)+'..'+inttostr(lMax)+']'; ReadIntEdit.MinValue := lMin; ReadIntEdit.MaxValue := lMax; ReadIntEdit.Value := lDefault; ReadIntForm.ShowModal; result := ReadIntEdit.Value; end; procedure TReadIntForm.OKBtnClick(Sender: TObject); begin ReadIntForm.ModalResult := mrOK; end; procedure TReadIntForm.FormCreate(Sender: TObject); begin end; {$IFDEF FPC} initialization {$I ReadInt.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/npm/ReadInt.lrs0000664000175000017500000000231711540116472020516 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TReadIntForm','FORMDATA',[ 'TPF0'#12'TReadIntForm'#11'ReadIntForm'#4'Left'#3'2'#1#6'Height'#2'P'#3'Top'#3 +'*'#2#5'Width'#3#213#1#18'HorzScrollBar.Page'#3#212#1#18'VertScrollBar.Page' +#2'O'#13'ActiveControl'#7#11'ReadIntEdit'#11'BorderStyle'#7#8'bsDialog'#7'Ca' +'ption'#6#16'Integer required'#12'ClientHeight'#2'P'#11'ClientWidth'#3#213#1 +#21'Constraints.MaxHeight'#2'P'#20'Constraints.MaxWidth'#3#213#1#21'Constrai' +'nts.MinHeight'#2'P'#20'Constraints.MinWidth'#3#213#1#9'Font.Name'#6#13'MS S' +'ans Serif'#8'OnCreate'#7#10'FormCreate'#8'Position'#7#14'poScreenCenter'#10 +'LCLVersion'#6#8'0.9.28.2'#0#6'TLabel'#12'ReadIntLabel'#4'Left'#2#16#6'Heigh' +'t'#2#14#3'Top'#2#12#5'Width'#3'P'#1#9'Alignment'#7#14'taRightJustify'#8'Aut' +'oSize'#8#7'Caption'#6#14'Enter a number'#11'ParentColor'#8#0#0#9'TSpinEdit' +#11'ReadIntEdit'#4'Left'#3'h'#1#6'Height'#2#27#3'Top'#2#12#5'Width'#2']'#8'M' +'axValue'#2#0#8'TabOrder'#2#0#0#0#7'TButton'#5'OKBtn'#4'Left'#3'p'#1#6'Heigh' +'t'#2#25#3'Top'#2','#5'Width'#2'K'#25'BorderSpacing.InnerBorder'#2#4#7'Capti' +'on'#6#2'OK'#7'OnClick'#7#10'OKBtnClick'#8'TabOrder'#2#1#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/npm/ReadInt.lfm0000664000175000017500000000176211540116472020477 0ustar michaelmichaelobject ReadIntForm: TReadIntForm Left = 306 Height = 80 Top = 554 Width = 469 HorzScrollBar.Page = 468 VertScrollBar.Page = 79 ActiveControl = ReadIntEdit BorderStyle = bsDialog Caption = 'Integer required' ClientHeight = 80 ClientWidth = 469 Constraints.MaxHeight = 80 Constraints.MaxWidth = 469 Constraints.MinHeight = 80 Constraints.MinWidth = 469 Font.Name = 'MS Sans Serif' OnCreate = FormCreate Position = poScreenCenter LCLVersion = '0.9.28.2' object ReadIntLabel: TLabel Left = 16 Height = 14 Top = 12 Width = 336 Alignment = taRightJustify AutoSize = False Caption = 'Enter a number' ParentColor = False end object ReadIntEdit: TSpinEdit Left = 360 Height = 27 Top = 12 Width = 93 MaxValue = 0 TabOrder = 0 end object OKBtn: TButton Left = 368 Height = 25 Top = 44 Width = 75 BorderSpacing.InnerBorder = 4 Caption = 'OK' OnClick = OKBtnClick TabOrder = 1 end end mricron-0.20120505.1~dfsg.1.orig/npm/ReadInt.dfm0000664000175000017500000000120410621051756020460 0ustar michaelmichaelџ TREADINTFORM0nTPF0 TReadIntForm ReadIntFormLeft9TopК BorderStylebsDialogCaptionInteger required ClientHeightI ClientWidthФColor clBtnFace Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Heightѕ Font.Name MS Sans Serif Font.Style OldCreateOrderPositionpoScreenCenter PixelsPerInch` TextHeight TLabel ReadIntLabelLeftTopWidthKHeight AlignmenttaRightJustifyCaptionEnter a number TSpinEdit ReadIntEditLefthTop WidthYHeightMaxValueMinValueTabOrderValueTButtonOKBtnLeftXTop(WidthKHeightCaptionOK ModalResultTabOrderOnClick OKBtnClickmricron-0.20120505.1~dfsg.1.orig/npm/ReadFloat.pas0000664000175000017500000000203111326434470021010 0ustar michaelmichaelunit ReadFloat; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, RXSpin; type TReadFloatForm = class(TForm) OKBtn: TButton; ReadFloatLabel: TLabel; ReadFloatEdit: TRxSpinEdit; function GetFloat(lStr: string; lMin,lDefault,lMax: double): double; procedure OKBtnClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var ReadFloatForm: TReadFloatForm; implementation {$R *.DFM} function TReadFloatForm.GetFloat(lStr: string; lMin,lDefault,lMax: double): double; begin //result := lDefault; ReadFloatLabel.caption := lStr+' ['+floattostr(lMin)+'..'+floattostr(lMax)+']'; ReadFloatEdit.MinValue := lMin; ReadFloatEdit.MaxValue := lMax; ReadFloatEdit.Value := lDefault; ReadFloatForm.ShowModal; result := ReadFloatEdit.Value; end; procedure TReadFloatForm.OKBtnClick(Sender: TObject); begin ReadFloatForm.ModalResult := mrOK; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/ReadFloat.dfm0000664000175000017500000000125210737143264021002 0ustar michaelmichaelџ TREADFLOATFORM0’TPF0TReadFloatForm ReadFloatFormLeftTop BorderStylebsDialogCaptionReal number required ClientHeightG ClientWidthТColor clBtnFace Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Heightѕ Font.Name MS Sans Serif Font.Style OldCreateOrderPositionpoScreenCenter PixelsPerInch` TextHeight TLabelReadFloatLabelLeftрTopWidthKHeight AlignmenttaRightJustifyCaptionEnter a number TButtonOKBtnLeftXTop(WidthKHeightCaptionOK ModalResultTabOrderOnClick OKBtnClick TRxSpinEdit ReadFloatEditLeft0Top WidthyHeight ButtonKind bkStandardDecimal ValueTypevtFloatTabOrdermricron-0.20120505.1~dfsg.1.orig/npm/prefs.pas0000664000175000017500000002273411477153250020303 0ustar michaelmichaelunit prefs; {$H+} interface uses inifiles, define_types,SysUtils,classes,turbolesion; function DoLesion (var lPrefs: TLDMPrefs): boolean; procedure SetDefaultPrefs (var lPrefs: TLDMPrefs); procedure ReadParamStr; implementation uses nifti_img, hdr,nifti_hdr, valformat,StatThdsUtil,filename,npmform; procedure MsgX(lStr: string); begin MainForm.NPMmsg(lStr); end; procedure ClearMsgX; begin MainForm.NPMmsgClear end; procedure SetDefaultPrefs (var lPrefs: TLDMPrefs); begin //lPrefs.unusedbool := true; lPrefs.tTest := true; lPrefs.BMtest := false; lPrefs.Ltest := false; lPrefs.nPermute := 0; lPrefs.CritPct := -1;//use default in val file lPrefs.ExplicitMaskName := ''; lPrefs.ValFilename := ''; lPrefs.Outname := ''; end; (*function CheckBool (lPref, lFlag: integer): boolean; //check if Flag is in lPref. For example, if Flag is 1 then returns true for all odd lPrefs begin result := (lPref and lFlag) = lFlag; end; *) function noVariance (lRA: singlep; lnSubj: integer): boolean; var lI : integer; begin result := false; if lnSubj < 2 then exit; for lI := 2 to lnSubj do if lRA^[1] <> lRA^[lI] then exit; result := true; end; function DoLesion (var lPrefs: TLDMPrefs): boolean; label 666; var lFact,lnFactors,lSubj,lnSubj,lnSubjAll,lMaskVoxels,lnCritV,lCritPctV: integer; lImageNames,lImageNamesAll: TStrings; lPredictorList: TStringList; lTemp4D,lMaskname,lFactname: string; lMaskHdr: TMRIcroHdr; lMultiSymptomRA,lSymptomRA: singleP; begin if (not lPrefs.BMtest) and (not lPrefs.ttest) and (not lPrefs.LTest) then begin MsgX('Error: you need to compute at least on test [options/test menu]'); exit; end; lImageNamesAll:= TStringList.Create; //not sure why TStrings.Create does not work??? lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? if not GetValCore(lPrefs.ValFilename, lnSubjAll,lnFactors,lMultiSymptomRA,lImageNamesAll,lnCritV,lCritPctV,lPredictorList) then begin MsgX('Error with VAL file'); goto 666; end; if lPrefs.critPct < 0 then //-1 denotes using the values specified in the VAL file lPrefs.critPct := lCritPctV; lTemp4D := CreateDecompressed4D(lImageNamesAll); if (lnSubjAll < 1) or (lnFactors < 1) then begin MsgX('Not enough subjects ('+inttostr(lnSubjAll)+') or factors ('+inttostr(lnFactors)+').'); goto 666; end; lMaskname := lImageNamesAll[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin MsgX('Error reading 1st mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin MsgX('Mask file size too small.'); goto 666; end; if (lPrefs.OutName = '') or (not DirExists(extractfiledir(lPrefs.Outname))) then begin lPrefs.Outname := extractfiledir(lPrefs.ValFilename)+pathdelim+'results.nii.gz'; MsgX('Output stored as '+lPrefs.Outname); end; for lFact := 1 to lnFactors do begin ClearMsgX; MsgX(MainForm.GetKVers); lImageNames.clear; for lSubj := 1 to lnSubjAll do if (not lPrefs.LTest) or (lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] = 0) OR (lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] = 1) THEN begin {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then {$ENDIF} lImageNames.Add(lImageNamesAll[lSubj-1]); end else begin MsgX('Data rejected: behavior must be zero or one for binomial test '+lImageNamesAll.Strings[lSubj-1]); end; lnSubj := lImageNames.Count; if lnSubj > 2 then begin getmem(lSymptomRA,lnSubj * sizeof(single)); lnSubj := 0; for lSubj := 1 to lnSubjAll do begin if (not lPrefs.LTest) or (lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] = 0) OR (lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] = 1) THEN begin {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then begin {$ELSE} begin{$ENDIF} inc(lnSubj); lSymptomRA^[lnSubj] := lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)]; end; //valid value end; //not binomial, or 1/0 end; //for each subject MsgX('Threads: '+inttostr(gnCPUThreads)); lFactName := lPredictorList.Strings[lFact-1]; lFactName := LegitFilename(lFactName,lFact); MsgX('Factor = '+lFactname); For lSubj := 1 to lnSubj do MsgX (lImageNames.Strings[lSubj-1] + ' = '+realtostr(lSymptomRA^[lSubj],2) ); MsgX('Total voxels = '+inttostr(lMaskVoxels)); lPrefs.nCrit := round( (lnSubj*lPrefs.CritPct)/100); MsgX('Only testing voxels damaged in at least '+inttostr(lPrefs.nCrit)+' individual[s]'); MsgX('Number of Lesion maps = '+inttostr(lnSubj)); if not CheckVoxelsGroupX(lImageNames,lMaskHdr {lMaskVoxels}) then begin MsgX('Error: File dimensions differ from mask.'); goto 666; end; if noVariance (lSymptomRA,lnSubj) then MsgX('Error no variability in behavioral data ') else TurboLDM (lImageNames, lMaskHdr, lPrefs, lSymptomRA, lFactname,lPrefs.OutName); Freemem(lSymptomRA); end else begin MsgX('At least 2 individuals required to compute statistics for '+lPredictorList.Strings[lFact-1]); end; //lnsubj > 2 end; //for each factor if lnSubjAll > 0 then begin Freemem(lMultiSymptomRA); end; 666: lImageNames.Free; lImageNamesAll.Free; lPredictorList.Free; DeleteDecompressed4D(lTemp4D); end; procedure ShowHelp; begin MsgX('usage ''npm [options] -o resultsfilname valfilename'' '); MsgX(' Options '); MsgX(' -c: critical percent 0..100 '); MsgX(' -p: permutations 0..4000 '); MsgX(' -t: Test [1=Liebermeister, 2=TTest, 4=BMtest, 6=t&BMtests'); MsgX(' -o: Output filename'); MsgX('examples:'); MsgX(' npm -c 25 -p 1000 -o c:\results.nii.gz c:\mri\data.val'); MsgX(' npm -c 25 -o "c:\program files\results.hdr" c:\mri\data.val'); end; procedure ReadParamStr; var lStr: String; I,lError: integer; lCommandChar: Char; lSingle: single; lHelpShown: boolean; lPrefs: TLDMPrefs; begin if (ParamCount < 1) then exit; SetDefaultPrefs(lPrefs); lHelpShown := false; lStr := paramstr(0); lStr := extractfilename(lStr); lStr := string(StrUpper(PChar(lStr))) ; if (ParamCount > 0) then begin I := 0; repeat lStr := ''; repeat inc(I); if I = 1 then lStr := ParamStr(I) else begin if lStr <> '' then lStr := lStr +' '+ ParamStr(I) else lStr := ParamStr(I); end; if (length(lStr)>1) and (lStr[1] = '-') and (ParamCount > I) then begin //special command //-z= zoom, -f= format [png,jpeg,bmp], -o= output directory lCommandChar := UpCase(lStr[2]); inc(I); lStr := ParamStr(I); lStr := string(StrUpper(PChar(lStr))) ; case lCommandChar of 'C','P','T': begin //CritPct Val(lStr,lSingle,lError); if lError = 0 then begin if lCommandChar = 'C' then lPrefs.CritPct := round(lSingle) else if lCOmmandChar = 'P' then lPrefs.nPermute := round(lSingle) else if lCOmmandChar = 'T' then begin case round(lSingle) of 1: begin lPrefs.LTest := true; lPrefs.Ttest := false; lPrefs.BMtest := false; end; 2: begin lPrefs.LTest := false; lPrefs.Ttest := true; lPrefs.BMtest := false; end; 4: begin lPrefs.LTest := false; lPrefs.Ttest := false; lPrefs.BMtest := true; end; 6: begin lPrefs.LTest := false; lPrefs.Ttest := true; lPrefs.BMtest := true; end; //1=Liebermeister, 2=TTest, 4=BMtest, 6=t&BMtests end;//xxx end; end; //not lError end; //C= CritPct,P=permutations,T=test 'O': begin //output filename lPrefs.OutName :=lStr; end; end; //case lStr[2] lStr := ''; end; //special command until (I=ParamCount) or (fileexists(lStr)) {or (gAbort)}; if fileexists(lStr) then begin //lStr := GetLongFileName(lStr); lPrefs.ValFilename := lStr; //if lPrefs.OutName = '' then // lPrefs.Outname := extractfiledir(paramstr(0))+pathdelim+'results.nii.gz'; MsgX ('output ' + lPrefs.Outname); MsgX ('val file: '+lPrefs.ValFilename); DoLesion(lPrefs); MainForm.close; end else begin MsgX('Error: unable to find '+lStr); if not lHelpShown then Showhelp; lHelpShown := true; end; until I >= ParamCount; end else begin ShowHelp; end;{param count > 0} end; end. mricron-0.20120505.1~dfsg.1.orig/npm/part.pas0000664000175000017500000005266711326434470020141 0ustar michaelmichaelunit part; //Physiological Artifact Removal Tool {$H+} interface uses define_types,dialogs,SysUtils; function ApplyPart( lFilename: string;lImgData: singleP; lBins,lVolVox,lSlices, lImgVol : integer; lTRsec: single): string; implementation type TPhysioT = RECORD Triggers,InterpolatedTriggers: integer; TriggerMedian,TriggerQ1,TriggerQ3: Double; TriggerRA: singleP; END; function SaveTriggersAs3ColumnFSL(lPhysioIn: TPhysioT; lOutName: string): boolean; var lF: textfile; lPos: integer; begin result := false; if (lPhysioIn.Triggers < 1) then exit; assignfile(lF,lOutName+'.txt'); Filemode := 0; rewrite(lF); for lPos := 1 to lPhysioIn.Triggers do Writeln(lf,realtostr(lPhysioIn.TriggerRA^[lPos],3)+' 1 1'); closefile(lF); Filemode := 2; result := true; end; procedure qsort(lower, upper : integer; var Data:SingleP); //40ms - fast but very recursive... var left, right : integer; pivot,lswap: single; begin pivot:=Data^[(lower+upper) div 2]; left:=lower; right:=upper; while left<=right do begin while Data^[left] < pivot do left:=left+1; { Parting for left } while Data^[right] > pivot do right:=right-1;{ Parting for right} if left<=right then begin { Validate the change } lswap := Data^[left]; Data^[left] := Data^[right]; Data^[right] := lswap; left:=left+1; right:=right-1; end; //validate end;//while left <=right if right>lower then qsort(lower,right,Data); { Sort the LEFT part } if upper>left then qsort(left ,upper,data); { Sort the RIGHT part } end; procedure QuartileTriggerSpacing(var lPhysio: TPhysioT); var lTriggerDelayRA: singleP; lPos: integer; begin lPhysio.TriggerQ1 := 0; lPhysio.TriggerMedian := 0; lPhysio.TriggerQ3 := 0; if lPhysio.Triggers < 4 then exit; getmem(lTriggerDelayRA,(lPhysio.Triggers-1)*sizeof(single)); for lPos := 1 to (lPhysio.Triggers-1) do lTriggerDelayRA^[lPos] := abs(lPhysio.TriggerRA^[lPos]-lPhysio.TriggerRA^[lPos+1]); qsort(1,lPhysio.Triggers-1,lTriggerDelayRA);//-1 : fence post vs wire lPos := lPhysio.Triggers div 2; lPhysio.TriggerMedian := lTriggerDelayRA^[lPos]; lPos := lPhysio.Triggers div 4; lPhysio.TriggerQ1 := lTriggerDelayRA^[lPos]; lPos := round(0.75*lPhysio.Triggers ); lPhysio.TriggerQ3 := lTriggerDelayRA^[lPos]; freemem(lTriggerDelayRA); end; function PARTool (var lPhysio: TPhysioT; lImgData: singleP; lTRsec: single; lnVolVox,lnSlices, lImgVol, lBinIn : integer): string; const kMinSamplesPerBin = 4; var lV,lSliceTime,lMeanSignal,lOnsetTime,lBinWidth,lBinMin,lBinMax,lTimeSinceTrigger,lPrevTriggerTime: double; lSlice,lSlicePos,lnSliceVox,lnSlicePos,lVoxel,lBin,lSample,lnBin,lnBinDiv2,lNextTrigger,lSamplesWithVariance,lCorrectedSamples,lVolOffset: integer; lBinCountRA,lVolBinRA: longintp; lVariance : boolean; lBinEstimateRA: doublep; begin result := ''; if (lPhysio.Triggers < 4) or (lnVolVox < 4) or (lImgVol < 4) then begin showmessage('PART requires at least 4 triggers and at least 4 volumes each with at least 4 voxels'); exit; end; if (lBinIn < 4) then begin showmessage('PART requires at least 4 data bins'); exit; end; lnSliceVox := lnVolVox div lnSlices; if (lnVolVox mod lnSlices) <> 0 then begin showmessage('PART requires volvox to be evenly divisible by number of slices.'); exit; end; lSamplesWithVariance := 0; lCorrectedSamples := 0; QuartileTriggerSpacing(lPhysio); //find number bin range - this is median-1.5IQR..median+1.5IQR lBinMin := -lPhysio.TriggerMedian/2-(abs(lPhysio.TriggerQ1-lPhysio.TriggerQ3)*0.75); lBinMax := +lPhysio.TriggerMedian/2+abs(lPhysio.TriggerQ1-lPhysio.TriggerQ3)*0.75; //next - create bins lnBin := lBinIn; //could adjust number of bins and return here wth a label lBinWidth := abs((lBinMax-lBinMin)/(lnBin-1));//lnBin-1: fenceposts vs wire lnBinDiv2 := (lnBin div 2)+1; getmem(lBinCountRA,lnBin*sizeof(integer)); getmem(lBinEstimateRA,lnBin*sizeof(double)); getmem(lVolBinRA,lImgVol*sizeof(integer)); lVoxel := 0; for lSlice := 1 to lnSlices do begin //adjust slices so slice 1 occurs at 0, slice 2 at 1/nslices... lSliceTime := ((lSlice-1)/lnSlices)-1; //-1 as 1st volume starts at zero, not 1 //do next step for each slice - different slices have different bin distributions due to different slicetime //next count number of samples in each bin for lBin := 1 to lnBin do lBinCountRA^[lBin] := 0; lPrevTriggerTime := -MaxInt; lNextTrigger := 1; for lSample := 1 to lImgVol do begin //for each sample, find nearest trigger lOnsetTime := lSample+lSliceTime; if lOnsetTime > lPhysio.TriggerRA^[lNextTrigger] then begin while (lNextTrigger <= lPhysio.Triggers ) and (lOnsetTime > lPhysio.TriggerRA^[lNextTrigger]) do begin lPrevTriggerTime := lPhysio.TriggerRA^[lNextTrigger]; inc(lNextTrigger); end; //while end;//if onset > lTimeSinceTrigger := lOnsetTime-lPrevTriggerTime; if lTimeSinceTrigger > abs(lPhysio.TriggerRA^[lNextTrigger]-lOnsetTime) then lTimeSinceTrigger := -abs(lPhysio.TriggerRA^[lNextTrigger]-lOnsetTime);//use abs in case we are past final trigger //now compute bin... //inc(lCorrectedSamples); if (lTimeSinceTrigger > lBinMin) and (lTimeSinceTrigger < lBinMax) then begin lBin := round( (lTimeSinceTrigger)/ lBinWidth)+lnBinDiv2; lVolBinRA^[lSample] := lBin; if (lBin < 1) or (lBin > lnBin) then fx(-661,lBin,lTimeSinceTrigger) else inc(lBinCountRA^[lBin]); end else lVolBinRA^[lSample] := 0; end; //for each volume for lSlicePos := 1 to lnSliceVox do begin inc(lVoxel); //first - only correct voxels with variability - do not waste time outside brain lVolOffset := lVoxel; lVariance := false; lSample := 1; lV := lImgData^[lVolOffset]; while (not lVariance) and (lSample <= lImgVol) do begin if lV <> lImgData^[lVolOffset] then lVariance := true; inc(lSample); lVolOffset := lVolOffset+lnVolVox; end; //while no variance if lVariance then begin //voxel intensity varies accross time - attempt to remove artifact lSamplesWithVariance := lSamplesWithVariance +lImgVol; //1st - sum effects for lBin := 1 to lnBin do lBinEstimateRA^[lBin] := 0; lMeanSignal := 0; lVolOffset := lVoxel; for lSample := 1 to lImgVol do begin lMeanSignal := lImgData^[lVolOffset] + lMeanSignal; lBin := lVolBinRA^[lSample]; if (lBin > 0) and (lBinCountRA^[lBin] > kMinSamplesPerBin) then lBinEstimateRA^[lBin] := lBinEstimateRA^[lBin]+ lImgData^[lVolOffset]; lVolOffset := lVolOffset+lnVolVox; end; //for each volume lMeanSignal := lMeanSignal /lImgVol; //next compute correction... average signal in bin - average voxel intensity irrelevant of bin for lBin := 1 to lnBin do if lBinCountRA^[lBin] > kMinSamplesPerBin then lBinEstimateRA^[lBin] := (lBinEstimateRA^[lBin]/lBinCountRA^[lBin])-lMeanSignal; //lBinEstimateRA[lBin] := lBinEstimateRA[lBin]-lBinMeanCount; //next apply correction - inner loop complete for each voxel! lVolOffset := lVoxel; for lSample := 1 to lImgVol do begin //for each sample, find nearest trigger lBin := lVolBinRA^[lSample]; if (lBin > 0) and (lBinCountRA^[lBin] > kMinSamplesPerBin) then begin lImgData^[lVolOffset] := (lImgData^[lVolOffset]-lBinEstimateRA^[lBin]); inc(lCorrectedSamples) end; lVolOffset := lVolOffset+lnVolVox; end; //for each volume end; //if variance end;//for each voxel in slice end; //for slice //**INNER LOOP end - //next - report results result :=' Time per vol (TR) [sec] '+realtostr(lTRsec,4)+kCR; result :=result +' fMRI Volumes '+inttostr(lImgVol)+kCR; result :=result +' Triggers n/First...Last [vol] '+realtostr(lPhysio.Triggers,0)+'/'+realtostr(lPhysio.TriggerRA^[1],2)+'...'+realtostr(lPhysio.TriggerRA^[lPhysio.Triggers],2)+kCR; if abs(lImgVol-lPhysio.TriggerRA^[lPhysio.Triggers]) > 10 then begin result :=result +'******* WARNING: Duration of fMRI session and duration of triggers is very different *******'; result :=result +'******* Please ensure specified TR is correct, files are correct and onset of fMRI was synchronized with physio data *******'; end; result := result + ' Q1/Median/Q2 [sec] '+realtostr(lTRsec*lPhysio.TriggerQ1,2)+'/'+realtostr(lTRsec*lPhysio.TriggerMedian,2)+'/'+realtostr(lTRsec*lPhysio.TriggerQ3,2)+kCR; result := result + ' Bin n/Range [sec] '+inttostr(lnBin)+'/'+realtostr(lTRsec*lBinMin,2)+ '...'+realtostr(lTRsec*lBinMax,2)+kCR; result := result+ ' voxels without variance (outside brain) %: '+realtostr(100*( (lnVolVox-(lSamplesWithVariance/lImgVol))/lnVolVox),2)+kCR; if lSamplesWithVariance > 0 then result := result+ ' voxels with variance which were corrected %: '+realtostr(100*(lCorrectedSamples/lSamplesWithVariance),2)+kCR; for lBin := 1 to lnBin do result := result+(' Bin '+inttostr(lBin)+ ' '+realtostr(lBin*lBinWidth+lBinMin ,2) +' '+inttostr(lBinCountRA^[lBin]) )+kCR; freemem(lBinCountRA); freemem(lBinEstimateRA); freemem(lVolBinRA); end; function StrVal (var lNumStr: string): integer; begin try result := strtoint(lNumStr); except on EConvertError do begin showmessage('StrVal Error - Unable to convert the string '+lNumStr+' to a number'); result := MaxInt; end; end; end; procedure AddSample(var lNumStr: string; var lnTotal,lnSample, lnTrigger: integer; var lPhysio: TPhysioT); var lVal: integer; begin lVal := StrVal(lNumStr); if lVal = 5003 then exit; lNumStr := ''; inc(lnTotal); if lnTotal < 5 then exit; if lVal > 4096 then begin if lVal <> 5000 then begin showmessage('Potentially serious error: unknown trigger type : '+inttostr(lVal)); end; inc(lnTrigger); if (lPhysio.Triggers <> 0) then lPhysio.TriggerRA^[lnTrigger] := lnSample; end else begin inc(lnSample); end; end; function AdjustStartPos (var lStr: string; var lStartPos: integer): boolean; //Some Siemens physio files appear to have nonsense characters befor real data1 var lLen: integer; begin lLen := length(lStr); result := false; if (lLen-lStartPos)<2 then exit; result := true; repeat if lStr[lStartPos] in [ '0'..'9'] then exit; inc(lStartPos); until (lStartPos = lLen); result := false; end; procedure CountValidItems(var lStr: string; var lStartPos,lnSample, lnTrigger: integer; var lPhysio: TPhysioT); label 123; var lPos,lnTotal: integer; lNumStr: string; begin lnTotal:= 0; lnSample := 0; lnTrigger := 0; lNumStr := ''; if length(lStr)<2 then exit; if not AdjustStartPos ( lStr, lStartPos) then exit; //Oct 2009 for lPos := lStartPos to length(lStr) do begin if (lStr[lPos] = ' ') and (lNumStr <> '') then begin if lNumStr = '5003' then begin lNumStr := ''; goto 123; //end of recording end else AddSample(lNumStr, lnTotal,lnSample, lnTrigger, lPhysio); end else begin if lStr[lPos] in [ '0'..'9'] then lNumStr := lNumStr + lStr[lPos] else if lStr[lPos] in [' '] then else begin //Showmessage(lStr[lPos]); goto 123; end; end; end; //for length 123: if (lNumStr <> '') then AddSample(lNumStr, lnTotal,lnSample, lnTrigger, lPhysio); lStartPos := lPos; while (lStartPos < length(lStr)) and ( lStr[lStartPos] <> ' ') do begin inc(lStartPos); end; end; procedure CreatePhysio (var lPhysio: TPhysioT); begin lPhysio.Triggers := 0; end; procedure ClosePhysio (var lPhysio: TPhysioT); begin with lPhysio do begin if Triggers > 0 then freemem(TriggerRA); Triggers := 0; end; end; procedure InitPhysio(lnTrigger: integer; var lPhysio: TPhysioT); begin ClosePhysio (lPhysio); with lPhysio do begin Triggers := lnTrigger; InterpolatedTriggers := 0; if Triggers > 0 then getmem(TriggerRA,Triggers*sizeof(single)); end; end; function load3ColTxtPhysio (lFilename: string; var lPhysio: TPhysioT): boolean; var F: TextFile; lnTrigger: integer; lFloat,lFloat2,lFloat3: single; begin result := false; if not fileexists(lFilename) then exit; ClosePhysio(lPhysio); AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //pass 1 - count number of triggers lnTrigger := 0; Reset(F); while not EOF(F) do begin {$I-} read(F,lFloat,lFloat2,lFloat3); //read triplets instead of readln: this should load UNIX files {$I+} if (ioresult = 0) and (lFloat > 0) then inc(lnTrigger); end; //pass 2 - load array InitPhysio(lnTrigger, lPhysio); lnTrigger := 0; Reset(F); while not EOF(F) do begin {$I-} read(F,lFloat,lFloat2,lFloat3); //read triplets instead of readln: this should load UNIX files {$I+} if (ioresult = 0) and (lFloat > 0) then begin inc(lnTrigger); lPhysio.TriggerRA^[lnTrigger] := lFloat; end; end; FileMode := 2; //Set file access to read/write CloseFile(F); result := true; end; procedure ReadlnX (var F: TextFile; var lResult: string); var lCh: char; begin lResult := ''; while not Eof(F) do begin Read(F, lCh); if (lCh in [#10,#13]) then begin if lResult <> '' then begin //Showmessage(lResult); exit; end; end else lResult := lResult + lCh; end; end; //ReadlnX function loadSiemensPhysio (lFilename: string; var lPhysio: TPhysioT): boolean; var F: TextFile; lStr: string; lPos,lnSample,lnTrigger: integer; begin result := false; if not fileexists(lFilename) then exit; ClosePhysio(lPhysio); AssignFile(F, lFilename); FileMode := 0; //Set file access to read only Reset(F); ReadlnX(F,lStr);//ColNames if length(lStr) < 1 then begin CloseFile(F); exit; end; //first pass - count items lPos := 1; CountValidItems(lStr,lPos,lnSample,lnTrigger,lPhysio); //second pass - load array if (lnSample < 1) and (lnTrigger < 1) then begin CloseFile(F); exit; end; //2nd pass... InitPhysio(lnTrigger, lPhysio); lPos := 1; CountValidItems(lStr,lPos,lnSample,lnTrigger,lPhysio); FileMode := 2; //Set file access to read/write CloseFile(F); result := true; end; function InterpolateGaps (var lPhysioIn: TPhysioT): boolean; //attempts to fill missing trigger pulses //you must call QuartileTriggerSpacing before this function! // it assumes q1/median/q3 are filled var lGap,l2Min,l2Max,l3Min,l3Max: double; lnReplace,lTrigger,lTrigger2: integer; lTempPhysio: TPhysioT; begin result := false; if (lPhysioIn.Triggers < 4) then begin showmessage('InterpolateGaps requires at least 4 triggers.'); exit; end; l2Min := 2*lPhysioIn.TriggerMedian-(abs(lPhysioIn.TriggerQ1-lPhysioIn.TriggerQ3)*1.5); l2Max := 2*lPhysioIn.TriggerMedian+(abs(lPhysioIn.TriggerQ1-lPhysioIn.TriggerQ3)*1.5); l3Min := 3*lPhysioIn.TriggerMedian-(abs(lPhysioIn.TriggerQ1-lPhysioIn.TriggerQ3)*1.5); l3Max := 3*lPhysioIn.TriggerMedian+(abs(lPhysioIn.TriggerQ1-lPhysioIn.TriggerQ3)*1.5); if l2Max > l3Min then exit; //variability too high to determine gaps lnReplace := 0; for lTrigger := 2 to lPhysioIn.Triggers do begin lGap := lPhysioIn.TriggerRA^[lTrigger] - lPhysioIn.TriggerRA^[lTrigger-1]; if (lGap > l2Min) and (lGap < l2Max) then inc(lnReplace); if (lGap > l3Min) and (lGap < l3Max) then inc(lnReplace,2); end; if lnReplace = 0 then begin result := true; exit; end; //create temp backup CreatePhysio(lTempPhysio); InitPhysio(lPhysioIn.Triggers, lTempPhysio); for lTrigger := 1 to lPhysioIn.Triggers do lTempPhysio.TriggerRA[lTrigger] := lPhysioIn.TriggerRA[lTrigger]; //create resized array InitPhysio(lTempPhysio.Triggers+lnReplace, lPhysioIn); //fill gaps lPhysioIn.TriggerRA[1] := lTempPhysio.TriggerRA[1]; lTrigger2 := 1; for lTrigger := 2 to lTempPhysio.Triggers do begin inc(lTrigger2); lGap := lTempPhysio.TriggerRA^[lTrigger] - lTempPhysio.TriggerRA^[lTrigger-1]; if ((lGap > l2Min) and (lGap < l2Max)) then begin //1 beat lPhysioIn.TriggerRA^[lTrigger2] := lTempPhysio.TriggerRA^[lTrigger-1]+(lgap / 2); inc(lTrigger2); end; if ((lGap > l3Min) and (lGap < l3Max)) then begin //2 beats lPhysioIn.TriggerRA^[lTrigger2] := lTempPhysio.TriggerRA^[lTrigger-1]+(lgap / 3); inc(lTrigger2); lPhysioIn.TriggerRA^[lTrigger2] := lTempPhysio.TriggerRA^[lTrigger-1]+(2*lgap / 3); inc(lTrigger2); end; lPhysioIn.TriggerRA^[lTrigger2] := lTempPhysio.TriggerRA^[lTrigger]; end; ClosePhysio (lTempPhysio); lPhysioIn.InterpolatedTriggers := lnReplace; result := true; end; function ScalePhysioToTime(lPhysio: TPhysioT; lSamplesPerUnit: single): boolean; var lScale: single; lTrigger: integer; begin result := false; if (lPhysio.Triggers < 4) then begin showmessage('ScalePhysioToTR requires at least 4 triggers.'); exit; end; if (lSamplesPerUnit <= 0) then begin showmessage('ScalePhysioToTime requires TR(sec) and samples/sec >0.'); exit; end; lScale := 1/(lSamplesPerUnit); //use reciprocal: mults faster than divides for lTrigger := 1 to lPhysio.Triggers do lPhysio.TriggerRA^[lTrigger] := lPhysio.TriggerRA^[lTrigger] * lScale; result := true; end; procedure EnsureAscending(lPhysio: TPhysioT); //check if order is correct - if not the sort... //an alternative is to always sort, but this method is faster and less resource intensive for sorted data var lPos: integer; begin if lPhysio.Triggers < 2 then exit; for lPos := 2 to lPhysio.Triggers do begin if lPhysio.TriggerRA^[lPos] < lPhysio.TriggerRA^[lPos-1] then begin showmessage('Warning: input times are not in ascending order - data will be sorted.'); qsort(1,lPhysio.Triggers,lPhysio.TriggerRA); //ensure trigger timings are in order... exit; end; end; end; function ApplyPart( lFilename: string;lImgData: singleP; lBins,lVolVox,lSlices, lImgVol : integer; lTRsec: single): string; var lPhysio: TPhysioT; begin result := ''; if not fileexists (lFilename) then exit; CreatePhysio(lPhysio); if UpCaseExt(lFilename) = '.TXT' then begin if not load3ColTxtPhysio(lFilename,lPhysio) then exit; end else if not loadSiemensPhysio(lFilename,lPhysio) then exit; EnsureAscending(lPhysio); QuartileTriggerSpacing(lPhysio); if not InterpolateGaps (lPhysio) then exit; if UpCaseExt(lFilename) <> '.TXT' then begin//export Siemens file as 3-column text ScalePhysioToTime(lPhysio,50); //50: siemens files use 50 Hz sampling -> convert to sec SaveTriggersAs3ColumnFSL(lPhysio,lFilename); //do this before TR conversion... end; ScalePhysioToTime(lPhysio,lTRsec); //Convert sec to volumes result := PARTool (lPhysio,lImgData,lTRsec,lVolVox,lSlices, lImgVol, lBins); ClosePhysio(lPhysio); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/overlap.pas0000664000175000017500000004165711326434470020640 0ustar michaelmichaelunit overlap; {$H+} interface uses nifti_hdr,define_types,SysUtils, StatThdsUtil,Brunner,nifti_img, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,ExtCtrls,lesion_pattern; Type OverlapRA = array [1..1] of TLesionPattern;//Toverlap; Overlapp = ^OverlapRA; //function CountOverlap2(var lImages: TStrings; lMinDeficits: integer; lPlankImg: bytep): integer; function CountOverlap (var lImages: TStrings; lMinDeficits,lnVoxTested: integer): integer; procedure EvaluatePower(var lFilenames: TStrings; lOverlapInc,lOverlapMax,lReps,lPct: integer); function CountOverlap2(var lImages: TStrings; lMinDeficits, lnVoxTested: integer; lPlankImg: bytep): integer; //procedure EvaluatePower; implementation uses npmform; function SelectFiles (var lIn,lOut: TStrings; lN: integer): boolean; //select (without replacement) lN filenames from the population lIn var lnFound,lTrial,lRan,lSwap: integer; lRandRA: longintP; begin result := false; lnFound := lIn.count; if (lnFound < lN) then exit; //not enough items found getmem(lRandRA,lnFound*sizeof(longint)); for lTrial := 1 to lnFound do lRandRA^[lTrial] := lTrial-1; //index to each strong for lTrial := lnFound downto 2 do begin //jumble order lRan := random(lTrial)+1; lSwap := lRandRA^[lTrial]; lRandRA^[lTrial] := lRandRA^[lRan]; lRandRA^[lRan] := lSwap; end; for lTrial := 1 to lN do lOut.Add(lIn[lRandRA^[lTrial]]); freemem(lRandRA); result := true; end; procedure EvaluatePower(var lFilenames: TStrings; lOverlapInc,lOverlapMax,lReps,lPct: integer); label 666; var lG: TStrings; lSize,lRep: integer; begin if (lReps < 1) or (lOverlapMax < 1) or (lOverlapInc < 1) or (lOverlapMax > lFilenames.count) or (lOverlapInc > lOverlapMax) then begin showmessage('Error with EvaluatePower inputs...'); exit; end; MainForm.NPMMsgClear; //MainForm.NPMmsg(kVers); randomize; MainForm.NPMmsg('Power Analysis began = ' +TimeToStr(Now)); lSize := lOverlapInc; while lSize <= lOverlapMax do begin for lRep := 1 to lReps do begin lG:= TStringList.Create; if not SelectFiles(lFilenames,lG,lSize) then begin showmessage('Error selecting '+inttostr(lSize)+'files!'); goto 666; end; CountOverlap(lG, round((lPct/100)*lSize),-1 ); lG.Free; end; //for lLoop lSize := lSize + lOverlapInc; end; //for lRep MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); exit; 666: //there has been a critical failure! lG.Free; end; (*function SelectFiles (lN: integer; var lOut: TStrings): boolean; var lnFound,lTrial,lRan,lSwap: integer; lMaskExt,lFilePath: string; lSearchRec: TSearchRec; lF: TStrings; lRandRA: longintP; begin result := false; lF:= TStringList.Create; lFilepath := 'C:\140\'; lMaskExt := '*.voi'; if FindFirst(lFilePath{+PathDelim}+lMaskExt, faAnyFile-faSysFile-faDirectory, lSearchRec) = 0 then begin repeat lF.add(lFilePath+lSearchRec.Name); until (FindNext(lSearchRec) <> 0); end; lnFound := lF.count; if (lnFound < lN) then begin lF.free; exit; end; //not enough items found getmem(lRandRA,lnFound*sizeof(longint)); for lTrial := 1 to lnFound do lRandRA[lTrial] := lTrial-1; //index to each strong for lTrial := lnFound downto 2 do begin //jumble order lRan := random(lTrial)+1; lSwap := lRandRA[lTrial]; lRandRA[lTrial] := lRandRA[lRan]; lRandRA[lRan] := lSwap; end; for lTrial := 1 to lN do lOut.Add(lF[lRandRA[lTrial]]); freemem(lRandRA); lF.Free; result := true; end; procedure EvaluatePower; label 666; var lG: TStrings; lMaskname: string; lMaskHdr: TMRIcroHdr; lMaskVoxels,lN,lLoop,lRep: integer; begin MainForm.NPMMsgClear; //MainForm.NPMmsg(kVers); randomize; MainForm.NPMmsg('Power Analysis began = ' +TimeToStr(Now)); for lRep := 7 to 10 do begin for lLoop := 1 to 10 do begin lN := lRep * 10; lG:= TStringList.Create; if not SelectFiles(lN,lG) then begin showmessage('Error selecting '+inttostr(lN)+'files!'); goto 666; end; {if not OpenDialogExecute('Select images to average',true,true,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected lG:= TStringList.Create; lG.addstrings(OpenHdrDlg.Files);} {$IFDEF FORMATVARIES} //this next bit allows different types of scans to be read, but it is slow.... lMaskname := lG[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if not MainForm.CheckVoxelsGroup(lG,lMaskVoxels) then begin showmessage('File dimensions differ from mask.'); goto 666; end; {$ENDIF} CountOverlap(lG, {round(0.1*lN)} 0); lG.Free; end; //for lLoop end; //for lRep MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); exit; 666: //there has been a critical failure! lG.Free; end; *) function CountOverlap2(var lImages: TStrings; lMinDeficits, lnVoxTested: integer; lPlankImg: bytep): integer; label 123,667; const kMaxBit = 63; var lMaskName: string; //lPlankImg: byteP; lDouble,lTotalMemory: double; lVoxPerPlankDiv10,lOffset,lnDeficits,lUniqueOrders, lVolVox,lPos,lPlank,lVox,lDataType,lnVoxels,lImagesCount: integer; lnPlanks,lVoxPerPlank,lStartVox,lEndVox,lPlankImgPos: int64; lOverlapRA: Overlapp; lOrder,lPrevOrder: TLesionPattern;//x TOverlap; lMaskHdr: TMRIcroHdr; //lPowerRA: array [1..kMaxBit] of int64; procedure CheckOrder(var lObservedOrder: TLesionPattern); var lInc: integer; begin if lUniqueOrders > 0 then begin //see if this is unique for lInc := 1 to lUniqueOrders do if SameOrder(lObservedOrder,lOverlapRA^[lInc],lImagesCount) then exit; //not unique end; //UniqueOrders > 0 //if we have not exited yet, we have found a new ordering! lUniqueOrders := lUniqueOrders + 1; lOverlapRA^[lUniqueOrders] := lObservedOrder; end; begin result := -1; //MainForm.NPMmsg('Analysis began = ' +TimeToStr(Now)); //lMinDeficits := 0; lUniqueOrders := 0; lTotalMemory := 0; lMaskName := lImages[0]; lImagesCount := lImages.Count; if lImagesCount < 1 then goto 667; if lImages.Count > (kMaxObs) then begin MainForm.NPMmsg('Only able to compute tests for <= '+inttostr(kMaxObs)+' overlays.'); goto 667; end; if not NIFTIhdr_LoadHdr(lMaskName,lMaskHdr) then begin MainForm.NPMmsg('Error reading 1st image.'); goto 667; end; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; lDataType := lMaskHdr.NIFTIhdr.datatype; lOffset := round(lMaskHdr.NIFTIhdr.vox_offset); //showmessage(inttostr(lVolVox)); if (lVolVox < 1) then goto 667; lVoxPerPlank := kPlankSz div lImages.Count {div sizeof(single)} ; if (lVoxPerPlank = 0) then goto 667; //no data lDouble := lVolVox;//force floating point multiplication in next step... lTotalMemory := lDouble * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; lnVoxels := 0; lStartVox := 1; lEndVox := 0; if lnVoxTested <= 0 then getmem(lOverlapRA,lVolVox* sizeof(TLesionPattern)) else getmem(lOverlapRA,lnVoxTested* sizeof(TLesionPattern)); for lPlank := 1 to lnPlanks do begin MainForm.ProgressBar1.Position := 1; MainForm.Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lVolVox then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lVolVox); lEndVox := lVolVox; end; lVoxPerPlankDiv10 := lVoxPerPlank div 10; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin {$IFDEF FORMATVARIES} if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then {$ELSE} if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,lOffset,lPlankImgPos,lDataType,lVolVox) then {$ENDIF} goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image lPrevOrder := EmptyOrder;//impossible: forces first voxel of each order to be checked for lVox := 1 to lVoxPerPlank do begin if (lVox mod lVoxPerPlankDiv10) = 0 then begin MainForm.ProgressBar1.Position := (lVox div lVoxPerPlankDiv10)*10; MainForm.Refresh; Application.processmessages; end; lOrder := EmptyOrder; lPlankImgPos := 0; lnDeficits := 0; for lPos := 1 to lImages.Count do begin if (lPlankImg^[lPlankImgPos + lVox] > 0) then begin inc(lnDeficits); SetBit(lPos,lOrder); end; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end; if (lnDeficits >= lminDeficits) then begin //this is different from the last voxel: perhaps this is a new ordering if (not SameOrder(lOrder,lPrevOrder,lImagesCount)) then CheckOrder(lOrder); inc(lnVoxels); end; lPrevOrder := lOrder; end; lStartVox := lEndVox + 1; end; MainForm.NPMmsg('n=,'+inttostr( lImages.Count)+',minN=,'+inttostr(lMinDeficits) +',unique overlap patterns,' +Inttostr(lUniqueOrders) +',voxels tested,' +Inttostr(lnVoxels)); 123: //next: free dynamic memory freemem(lOverlapRA); //MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); MainForm.ProgressBar1.Position := 0; result := lUniqueOrders; exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 0 then begin freemem(lPlankImg); freemem(lOverlapRA); end; MainForm.NPMmsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; function CountOverlap(var lImages: TStrings; lMinDeficits,lnVoxTested: integer): integer; var lPlankImg: byteP; begin getmem(lPlankImg,kPlankSz); result := CountOverlap2( lImages, lMinDeficits,lnVoxTested,lPlankImg); freemem(lPlankImg); end; (*function CountOverlap2(var lImages: TStrings; lMinDeficits: integer; lPlankImg: bytep): integer; label 123,667; var lMaskName: string; lVoxPerPlankDiv10,lOffset,lnDeficits,lUniqueOrders,lTotalMemory, lImagesCount,lVolVox,lPos,lPlank,lVox,lDataType,lnVoxels: integer; lnPlanks,lVoxPerPlank,lStartVox,lEndVox,lPlankImgPos: int64; lOverlapRA: Overlapp; lOrder,lPrevOrder: TLesionPattern; lMaskHdr: TMRIcroHdr; //lPowerRA: array [1..kMaxBit] of int64; procedure CheckOrder(var lObservedOrder: TLesionPattern); var lInc: integer; begin if lUniqueOrders > 0 then begin //see if this is unique for lInc := 1 to lUniqueOrders do if SameOrder(lObservedOrder,lOverlapRA^[lInc],lImagesCount) then exit; //not unique end; //UniqueOrders > 0 //if we have not exited yet, we have found a new ordering! lUniqueOrders := lUniqueOrders + 1; lOverlapRA^[lUniqueOrders] := lObservedOrder; end; begin result := -1; //MainForm.NPMmsg('Analysis began = ' +TimeToStr(Now)); //lMinDeficits := 0; lUniqueOrders := 0; lTotalMemory := 0; lImagesCount := lImages.Count; lMaskName := lImages[0]; if lImages.Count < 1 then goto 667; if lImages.Count > (kMaxObs) then begin MainForm.NPMmsg('Only able to compute tests for <= '+inttostr(kMaxObs)+' overlays.'); goto 667; end; if not NIFTIhdr_LoadHdr(lMaskName,lMaskHdr) then begin MainForm.NPMmsg('Error reading 1st image.'); goto 667; end; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; lDataType := lMaskHdr.NIFTIhdr.datatype; lOffset := round(lMaskHdr.NIFTIhdr.vox_offset); //showmessage(inttostr(lVolVox)); if (lVolVox < 1) then goto 667; lVoxPerPlank := kPlankSz div lImages.Count ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := lVolVox * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data //showmessage('xx'); lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; //MainForm.NPMmsg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); //MainForm.NPMmsg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); //if lTotalMemory > kPLankSz then // getmem(lPlankImg,kPlankSz); //else // getmem(lPlankImg,lTotalMemory); lnVoxels := 0; lStartVox := 1; lEndVox := 0; getmem(lOverlapRA,lVolVox* sizeof(TLesionPattern)); for lPlank := 1 to lnPlanks do begin MainForm.ProgressBar1.Position := 1; MainForm.Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lVolVox then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lVolVox); lEndVox := lVolVox; end; lVoxPerPlankDiv10 := lVoxPerPlank div 10; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin {$IFDEF FORMATVARIES} if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then {$ELSE} if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,lOffset,lPlankImgPos,lDataType,lVolVox) then {$ENDIF} goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image lPrevOrder := EmptyOrder;//impossible: forces first voxel of each order to be checked for lVox := 1 to lVoxPerPlank do begin if (lVox mod lVoxPerPlankDiv10) = 0 then begin MainForm.ProgressBar1.Position := (lVox div lVoxPerPlankDiv10)*10; MainForm.Refresh; Application.processmessages; end; lOrder := EmptyOrder; lPlankImgPos := 0; lnDeficits := 0; for lPos := 1 to lImages.Count do begin if (lPlankImg^[lPlankImgPos + lVox] > 0) then begin inc(lnDeficits); SetBit(lPos,lOrder); end; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end; if (lnDeficits >= lminDeficits) then begin //this is different from the last voxel: perhaps this is a new ordering if (not SameOrder(lOrder,lPrevOrder,lImagesCount)) then CheckOrder(lOrder); inc(lnVoxels); end; lPrevOrder := lOrder; end; lStartVox := lEndVox + 1; end; MainForm.NPMmsg('n=,'+inttostr( lImagesCount)+',minN=,'+inttostr(lMinDeficits) +',unique overlap patterns,' +Inttostr(lUniqueOrders) +',voxels tested,' +Inttostr(lnVoxels)); 123: //next: free dynamic memory //freemem(lPlankImg); freemem(lOverlapRA); //MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); MainForm.ProgressBar1.Position := 0; result := lUniqueOrders; exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 0 then begin freemem(lPlankImg); freemem(lOverlapRA); end; MainForm.NPMmsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; *) end. mricron-0.20120505.1~dfsg.1.orig/npm/options.inc0000664000175000017500000000033610673233666020646 0ustar michaelmichael{ -------------------------------------------------------------------- } {$DEFINE SPREADSHEET} {If "DEFINE SPREADSHEET" then the VAL file design for will be created.} {This uses the spread.* and design.* files} mricron-0.20120505.1~dfsg.1.orig/npm/old/0000775000175000017500000000000011660470014017217 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/npm/old/montecarlo.pas0000664000175000017500000001730711326434470022104 0ustar michaelmichaelunit montecarlo; interface {$H+} uses define_types,SysUtils, part,StatThds,statcr,StatThdsUtil,Brunner,DISTR,nifti_img, hdr, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,ExtCtrls,Menus, overlap,ReadInt,lesion_pattern,stats,LesionStatThds,nifti_hdr, {$IFDEF FPC} LResources,gzio2, {$ELSE} gziod,associate,{$ENDIF} //must be in search path, e.g. C:\pas\mricron\npm\math {$IFNDEF UNIX} Windows, {$ENDIF} upower,firthThds,firth,IniFiles,cpucount,userdir,math, regmult,utypes; procedure LesionMonteCarlo (lBinomial,lTTest,lBM: boolean); implementation uses npmform,filename,turbolesion; procedure RandomGroup(kSamplesPerTest: integer;lImageNames: TStrings;lSymptomRA: SingleP;var lPartImageNames: TStrings; var lPartSymptomRA: SingleP); var lTotal,lInc,lRand,lSwap: integer; lRanOrder: longintP; begin lPartImageNames.Clear; lTotal := lImageNames.Count; if kSamplesPerTest > lTotal then begin showmessage('Monte carlo error: population must be larger than sample size.'); exit; end; //fx(lTOtal); Getmem(lRanOrder,lTotal*sizeof(longint)); for lInc := 1 to lTotal do lRanOrder^[lInc] := lInc; for lInc := lTotal downto 2 do begin lRand := Random(lInc)+1; lSwap := lRanOrder^[lRand]; lRanOrder^[lRand] := lRanOrder^[lInc]; lRanOrder^[lInc] := lSwap; end; for lInc := 1 to kSamplesPerTest do begin lPartImageNames.Add(lImageNames.Strings[lRanOrder^[lInc]-1]);//indexed from 0 lPartSymptomRA^[lInc] := lSymptomRA^[lRanOrder^[lInc]]; end; Freemem(lRanOrder); end; {$DEFINE notanacom} procedure LesionMonteCarlo (lBinomial,lTTest,lBM: boolean); label 666; const kSimSampleSize = 64; knSim = 5; kCrit = 3; {$IFDEF anacom} knControls = 64; {$ENDIF} var lPrefs: TLDMPrefs ; lSim,lFact,lnFactors,lSubj,lnSubj,lnSubjAll,lMaskVoxels,lnCrit: integer; lPartImageNames,lImageNames,lImageNamesAll: TStrings; lPredictorList: TStringList; lTemp4D,lMaskname,lOutName,lFactname,lOutNameSim: string; lMaskHdr: TMRIcroHdr; lMultiSymptomRA,lSymptomRA,lPartSymptomRA: singleP; {$IFDEF anacom} lnControlObservations: integer; lControlSymptomRA: singleP; {$ENDIF} begin //lBinomial := not odd( (Sender as tMenuItem).tag); lPrefs.NULP := true{gNULP false}; if not lBinomial then begin lPrefs.BMtest := lbm;//BMmenu.checked; lPrefs.Ttest := lttest;//ttestmenu.checked; if (not lPrefs.BMtest) and (not lPrefs.ttest) then lPrefs.ttest := true; lPrefs.Ltest:= false; end else begin lPrefs.BMtest := false; lPrefs.Ttest := false; lPrefs.Ltest:= true; end; lPrefs.nCrit := kCrit; lPrefs.nPermute := MainForm.ReadPermute;; lPrefs.Run := 0;{0 except for montecarlo} if (not lBinomial) and (not lTTest) and (not lBM) then begin Showmessage('Error: you need to compute at least on test [options/test menu]'); exit; end; lImageNamesAll:= TStringList.Create; //not sure why TStrings.Create does not work??? lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? lPartImageNames := TStringList.Create; getmem(lPartSymptomRA,kSimSampleSize*sizeof(single)); {$IFDEF anacom} lnControlObservations := knControls; getmem(lControlSymptomRA,lnControlObservations*sizeof(single)); for lSim := 1 to lnControlObservations do lControlSymptomRA^[lSim] := 5; {$ENDIF} //next, get 1st group if not MainForm.GetVal(lnSubjAll,lnFactors,lMultiSymptomRA,lImageNamesAll,lnCrit{,binom},lPredictorList) then begin showmessage('Error with VAL file'); goto 666; end; lTemp4D := CreateDecompressed4D(lImageNamesAll); if (lnSubjAll < 1) or (lnFactors < 1) or (lnSubjAll < kSimSampleSize) then begin Showmessage('Not enough subjects ('+inttostr(lnSubjAll)+') [sample size is '+inttostr(kSimSampleSize)+']or factors ('+inttostr(lnFactors)+').'); goto 666; end; lMaskname := lImageNamesAll[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; lOutName := ExtractFileDirWithPathDelim(lMaskName)+'results'; MainForm.SaveHdrDlg.Filename := loutname; lOutName := lOutName+'.nii.gz'; if not MainForm.SaveHdrName ('Base Statistical Map', lOutName) then goto 666; for lFact := 1 to lnFactors do begin lImageNames.clear; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then {$ENDIF} lImageNames.Add(lImageNamesAll[lSubj-1]); lnSubj := lImageNames.Count; if lnSubj > 1 then begin getmem(lSymptomRA,lnSubj * sizeof(single)); lnSubj := 0; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then begin {$ELSE} begin{$ENDIF} inc(lnSubj); lSymptomRA^[lnSubj] := lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)]; end; //randomization loop.... for lSim := 1 to knSim do begin RandomGroup(kSimSampleSize, lImageNames,lSymptomRA, lPartImageNames, lPartSymptomRA); lOutNameSim := AddIndexToFilename(lOutName,lSim); lnCrit := kCrit; MainForm.NPMMsgClear; //Msg(GetKVers); MainForm.NPMMsg('Threads: '+inttostr(gnCPUThreads)); lFactName := lPredictorList.Strings[lFact-1]; lFactName := LegitFilename(lFactName,lFact); MainForm.NPMMsg('Factor = '+lFactname); For lSubj := 1 to kSimSampleSize do MainForm.NPMMsg (lPartImageNames.Strings[lSubj-1] + ' = '+realtostr(lPartSymptomRA^[lSubj],2) ); MainForm.NPMMsg('Total voxels = '+inttostr(lMaskVoxels)); MainForm.NPMMsg('Only testing voxels damaged in at least '+inttostr(lnCrit)+' individual[s]'); MainForm.NPMMsg('Number of Lesion maps = '+inttostr(kSimSampleSize)); if not CheckVoxelsGroup(lPartImageNames,lMaskVoxels) then begin showmessage('File dimensions differ from mask.'); goto 666; end; lPrefs.Run := lSim; if lBinomial then TurboLDM (lPartImageNames, lMaskHdr, lPrefs, lPartSymptomRA, lFactname,lOutNameSim) else begin MainForm.ReportDescriptives(lPartSymptomRA,lnSubj); //TurboLDM (lPartImageNames, lMaskHdr, lPrefs, lPartSymptomRA, lFactname,lOutNameSim); {$IFDEF anacom} AnacomLesionNPMAnalyze (lPartImageNames, lMaskHdr, lnCrit,lSim,lnControlObservations, lPartSymptomRA,lControlSymptomRA, lFactname,lOutNameSim,lPrefs.Ttest,lPrefs.BMtest {lttest,lBM}); {$ENDIF} end; end; //for each simulation... Freemem(lSymptomRA); end; //lnsubj > 1 end; //for each factor if lnSubjAll > 0 then begin Freemem(lMultiSymptomRA); end; 666: lPartImageNames.free; lImageNames.Free; lImageNamesAll.Free; lPredictorList.Free; freemem(lPartSymptomRA); {$IFDEF anacom} freemem(lControlSymptomRA); {$ENDIF} DeleteDecompressed4D(lTemp4D); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/old/lesion.pas0000664000175000017500000004730011326434470021226 0ustar michaelmichaelunit lesion; interface {$H+} uses define_types,SysUtils, part,StatThds,statcr,StatThdsUtil,Brunner,DISTR,nifti_img, hdr, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,ExtCtrls,Menus, overlap,ReadInt,lesion_pattern,stats,LesionStatThds,nifti_hdr, {$IFDEF FPC} LResources,gzio2, {$ELSE} gziod,associate,{$ENDIF} //must be in search path, e.g. C:\pas\mricron\npm\math {$IFNDEF UNIX} Windows, {$ENDIF} upower,firthThds,firth,IniFiles,cpucount,userdir,math, regmult,utypes; function LesionNPMAnalyze2 (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun,lnPermute: integer; var lSymptomRA: SingleP;var lFactname,lOutName: string; lttest,lBM: boolean): boolean; function LesionNPMAnalyzeBinomial2 (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lnPermute: integer; var lSymptomRA: SingleP; var lFactname,lOutName: string): boolean; var gNULP,gROI: boolean; implementation uses npmform; {$DEFINE NOTmedianfx} function LesionNPMAnalyze2 (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun,lnPermute: integer; var lSymptomRA: SingleP;var lFactname,lOutName: string; lttest,lBM: boolean): boolean; label 123,667; var lOutNameMod: string; lPlankImg: byteP; lOutImgSum,lOutImgBM,lOutImgT,lOutImgAUC, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP; lPos,lPlank,lThread: integer; lVolVox,lMinMask,lMaxMask,lTotalMemory,lnPlanks,lVoxPerPlank, lThreadStart,lThreadEnd,lThreadInc,lnLesion,//,lnPermute, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lPosPct: int64; lT,lBMz, lSum,lThresh,lThreshPermute,lThreshBonf,lThreshNULP :double; lObsp: pointer; lObs: Doublep0; lStatHdr: TNIfTIhdr; lFdata: file; lRanOrderp: pointer; lRanOrder: Doublep0; lPlankAllocated: boolean; //lttest,lBM: boolean; {$IFDEF medianfx} lmedianFX,lmeanFX,lsummean,lsummedian: double; lmediancount: integer; {$ENDIF} begin //lttest:= ttestmenu.checked; //lBM := BMmenu.checked; lPlankAllocated := false; //lnPermute := MainForm.ReadPermute; MainForm.NPMmsg('Permutations = ' +IntToStr(lnPermute)); MainForm.NPMmsg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lMinMask := 1; lMaxMask := lVolVox; lVoxPerPlank := kPlankSz div lImages.Count div sizeof(byte) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; MainForm.NPMmsg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); MainForm.NPMmsg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); if (lnPlanks = 1) then getmem(lPlankImg,lTotalMemory) //assumes 1bpp else getmem(lPlankImg,kPlankSz); lPlankAllocated := true; lStartVox := lMinMask; lEndVox := lMinMask-1; {$IFDEF medianfx} lsummean := 0; lsummedian:= 0; lmediancount := 0; {$ENDIF} for lPos := 1 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; createArray64(lObsp,lObs,lImages.Count); getmem(lOutImgSum,lVolVox* sizeof(single)); getmem(lOutImgBM,lVolVox* sizeof(single)); getmem(lOutImgT,lVolVox* sizeof(single)); getmem(lOutImgAUC,lVolVox* sizeof(single)); MainForm.InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do begin lOutImgSum^[lPos] := 0; lOutImgBM^[lPos] := 0; lOutImgT^[lPos] := 0; lOutImgAUC^[lPos] := 0; end; //next create permuted BM bounds if lBM then begin MainForm.NPMmsg('Generating BM permutation thresholds'); MainForm.Refresh; for lPos := 1 to lImages.Count do lObs^[lPos-1] := lSymptomRA^[lPos]; genBMsim (lImages.Count, lObs); end; ClearThreadData(gnCPUThreads,lnPermute) ; for lPlank := 1 to lnPlanks do begin MainForm.NPMmsg('Computing plank = ' +Inttostr(lPlank)); MainForm.Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image //threading start lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error with TLesionContinuous.Create (MainForm.ProgressBar1,lttest,lBM,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,0,lPlankImg,lOutImgSum,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA) do //with TLesionContinuous.Create (MainForm.ProgressBar1,lttest,lBM,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,lPlankImg,lOutImgSum,lOutImgBM,lOutImgT,lSymptomRA) do {$IFDEF FPC} OnTerminate := @MainForm.ThreadDone; {$ELSE}OnTerminate := MainForm.ThreadDone;{$ENDIF} inc(gThreadsRunning); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; //threading end lStartVox := lEndVox + 1; end; //freemem(lPlankImg); //lPlankAllocated := false; lThreshPermute := 0; lnVoxTested := SumThreadData(gnCPUThreads,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); //next report findings if lnVoxTested < 1 then begin MainForm.NPMmsg('**Error: no voxels tested: no regions lesioned in at least '+inttostr(lnCrit)+' patients**'); goto 123; end; MainForm.NPMmsg('Voxels tested = ' +Inttostr(lnVoxTested)); {$IFDEF medianfx} MainForm.NPMmsg('Average MEAN effect size = ' +realtostr((lsummean/lmediancount),3)); MainForm.NPMmsg('Average MEDIAN effect size = ' +realtostr((lsummedian/lmediancount),3)); {$ENDIF} MainForm.NPMmsg('Only tested voxels with more than '+inttostr(lnCrit)+' lesions'); //Next: save results from permutation thresholding.... lThreshBonf := MainForm.reportBonferroni('Std',lnVoxTested); //next: save data MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save sum map lOutNameMod := ChangeFilePostfixExt(lOutName,'Sum'+lFactName,'.hdr'); if lRun < 1 then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); //save Area Under Curve lOutNameMod := ChangeFilePostfixExt(lOutName,'rocAUC'+lFactName,'.hdr'); if lRun < 1 then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgAUC,1); //create new header - subsequent images will use Z-scores MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if (lRun < 1) and (Sum2PowerCont(lOutImgSum,lVolVox,lImages.Count)) then begin lOutNameMod := ChangeFilePostfixExt(lOutName,'Power'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); end; if lRun > 0 then //terrible place to do this - RAM problems, but need value to threshold maps lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap2 (lImages, lnCrit,lnVoxTested,lPlankImg)); //MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if lttest then begin //save Ttest //next: convert t-scores to z scores for lPos := 1 to lVolVox do lOutImgT^[lPos] := TtoZ (lOutImgT^[lPos],lImages.Count-2); for lPos := 1 to lnPermute do begin lPermuteMaxT^[lPos] := TtoZ (lPermuteMaxT^[lPos],lImages.Count-2); lPermuteMinT^[lPos] := TtoZ (lPermuteMinT^[lPos],lImages.Count-2); end; lThresh := MainForm.reportFDR ('ttest', lVolVox, lnVoxTested, lOutImgT); lThreshPermute := MainForm.reportPermute('ttest',lnPermute,lPermuteMaxT, lPermuteMinT); lOutNameMod := ChangeFilePostfixExt(lOutName,'ttest'+lFactName,'.hdr'); if lRun > 0 then MainForm.NPMmsgAppend('threshtt,'+inttostr(lRun)+','+inttostr(MainForm.ThreshMap(lThreshNULP,lVolVox,lOutImgT))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgT,1); end; if lBM then begin //save Brunner Munzel lThresh := MainForm.reportFDR ('BM', lVolVox, lnVoxTested, lOutImgBM); lThreshPermute := MainForm.reportPermute('BM',lnPermute,lPermuteMaxBM, lPermuteMinBM); lOutNameMod := ChangeFilePostfixExt(lOutName,'BM'+lFactName,'.hdr'); if lRun > 0 then MainForm.NPMmsgAppend('threshbm,'+inttostr(lRun)+','+inttostr(MainForm.ThreshMap(lThreshNULP,lVolVox,lOutImgBM))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgBM,1); end; //next: free dynamic memory 123: MainForm.FreePermute (lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); freemem(lOutImgT); freemem(lOutImgAUC); freemem(lOutImgBM); freemem(lOutImgSum); freemem(lObsp); if lPlankAllocated then freemem(lPlankImg); //Next: NULPS - do this after closing all memory - this is a memory hog if gNULP then lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap (lImages, lnCrit,lnVoxTested)); MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lFactName,'.txt'); MainForm.MsgSave(lOutNameMod); MainForm.ProgressBar1.Position := 0; //if lRun > 0 then // AX(freeram,freeram,freeram,freeram,freeram,freeram); exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 1 then freemem(lPlankImg); MainForm.NPMmsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; //LesionNPMAnalyze function LesionNPMAnalyzeBinomial2 (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lnPermute: integer; var lSymptomRA: SingleP; var lFactname,lOutName: string): boolean; label 123,667; var lVal: single; lOutNameMod: string; lPlankImg: byteP; lOutImgSum,lOutImgL,lOutImgAUC,lDummyImg, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP; lPos,lPlank,lThread,lnDeficit: integer; lTotalMemory,lVolVox,lMinMask,lMaxMask,lnPlanks,lVoxPerPlank, lThreadStart,lThreadInc,lThreadEnd, lnLesion, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lPosPct: int64; lT, lSum: double; lObsp: pointer; lObs: Doublep0; lStatHdr: TNIfTIhdr; lFdata: file; lRanOrderp: pointer; lRanOrder: Doublep0; begin MainForm.NPMmsg('Permutations = ' +IntToStr(lnPermute)); //lOutName := lMaskHdr.ImgFileName; //if not SaveHdrName ('Statistical Map', lOutName) then exit; MainForm.NPMmsg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lMinMask := 1; lMaxMask := lVolVox; lVoxPerPlank := kPlankSz div lImages.Count div sizeof(byte) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; MainForm.NPMmsg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); MainForm.NPMmsg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); if (lnPlanks = 1) then getmem(lPlankImg,lTotalMemory) //assumes 1bp else getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; for lPos := 1 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; createArray64(lObsp,lObs,lImages.Count); getmem(lOutImgSum,lVolVox* sizeof(single)); getmem(lOutImgL,lVolVox* sizeof(single)); getmem(lOutImgAUC,lVolVox* sizeof(single)); MainForm.InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do begin lOutImgSum^[lPos] := 0; lOutImgL^[lPos] := 0; lOutImgAUC^[lPos] := 0; end; ClearThreadDataPvals(gnCPUThreads,lnPermute) ; for lPlank := 1 to lnPlanks do begin MainForm.ProgressBar1.Position := 1; MainForm.NPMmsg('Computing plank = ' +Inttostr(lPlank)); MainForm.Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image //threading start lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error //with TLesionBinomial.Create (ProgressBar1,false,true,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,666, lDummyImg,lPlankImg,lOutImgSum,lOutImgL,lDummyImg,lSymptomRA) do with TLesionBinom.Create (MainForm.ProgressBar1,false,true,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,0,lPlankImg,lOutImgSum,lOutImgL,lDummyImg,lOutImgAUC,lSymptomRA) do {$IFDEF FPC} OnTerminate := @MainForm.ThreadDone; {$ELSE}OnTerminate := MainForm.ThreadDone;{$ENDIF} inc(gThreadsRunning); MainForm.NPMmsg('Thread ' +Inttostr(gThreadsRunning)+' = '+inttostr(lThreadStart)+'..'+inttostr(lThreadEnd)); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; //threading end lStartVox := lEndVox + 1; end; lnVoxTested := SumThreadData(gnCPUThreads,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); for lPos := 1 to lnPermute do begin if (lPermuteMinT^[lPos] > 1.1) or (lPermuteMinT^[lPos] < -1.1) then lPermuteMinT^[lPos] := 0.5; if (lPermuteMaxT^[lPos] > 1.1) or (lPermuteMaxT^[lPos] < -1.1) then lPermuteMaxT^[lPos] := 0.5; lVal := lPermuteMaxT^[lPos]; lPermuteMaxT^[lPos] := lPermuteMinT^[lPos]; lPermuteMinT^[lPos] := lVal; if lPermuteMaxT^[lPos] < 0 then lPermuteMaxT^[lPos] := -pNormalInv(abs(lPermuteMaxT^[lPos])) else lPermuteMaxT^[lPos] := pNormalInv(lPermuteMaxT^[lPos]); if lPermuteMinT^[lPos] < 0 then lPermuteMinT^[lPos] := -pNormalInv(abs(lPermuteMinT^[lPos])) else lPermuteMinT^[lPos] := pNormalInv(lPermuteMinT^[lPos]); end; if lnVoxTested < 1 then begin MainForm.NPMmsg('**Error: no voxels tested: no regions lesioned in at least '+inttostr(lnCrit)+' patients**'); goto 123; end; //next report findings MainForm.NPMmsg('Voxels tested = ' +Inttostr(lnVoxTested)); MainForm.NPMmsg('Only tested voxels with more than '+inttostr(lnCrit)+' lesions'); //Next: save results from permutation thresholding.... MainForm.reportBonferroni('Std',lnVoxTested); //next: save data //savedata MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save sum map lOutNameMod := ChangeFilePostfixExt(lOutName,'Sum'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); //save Area Under Curve lOutNameMod := ChangeFilePostfixExt(lOutName,'rocAUC'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgAUC,1); //future images will store Z-scores... MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); //save power map lnDeficit := 0; for lPos := 1 to lImages.Count do if lSymptomRA^[lPos] = 0 then inc(lnDeficit); if Sum2PowerBinom(lOutImgSum,lVolVox,lImages.Count,lnDeficit) then begin lOutNameMod := ChangeFilePostfixExt(lOutName,'Power'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); end; //save Liebermeister lOutNameMod := ChangeFilePostfixExt(lOutName,'L'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgL,1); //save end MainForm.reportFDR ('L', lVolVox, lnVoxTested, lOutImgL); MainForm.reportPermute('L',lnPermute,lPermuteMaxT, lPermuteMinT); 123: //next: free dynamic memory MainForm.FreePermute (lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); freemem(lOutImgL); freemem(lOutImgAUC); freemem(lOutImgSum); freemem(lObsp); freemem(lPlankImg); //Next: NULPS - do this at the end, it is a memory hog! if gNULP then MainForm.reportBonferroni('Unique overlap',CountOverlap (lImages, lnCrit,lnVoxTested)); MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lFactName,'.txt'); MainForm.MsgSave(lOutNameMod); MainForm.ProgressBar1.Position := 0; exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 1 then freemem(lPlankImg); MainForm.NPMmsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/old/anacom.pas0000664000175000017500000006166411326434470021204 0ustar michaelmichaelunit anacom; interface {$H+} uses define_types,SysUtils, part,StatThds,statcr,StatThdsUtil,Brunner,DISTR,nifti_img, hdr,filename, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,ExtCtrls,Menus, overlap,ReadInt,lesion_pattern,stats,LesionStatThds,nifti_hdr, {$IFDEF FPC} LResources,gzio2, {$ELSE} gziod,associate,{$ENDIF} //must be in search path, e.g. C:\pas\mricron\npm\math {$IFNDEF UNIX} Windows, {$ENDIF} upower,firthThds,firth,IniFiles,cpucount,userdir,math, regmult,utypes; //procedure DoAnaCOM; function AnacomLesionNPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun,lnControl: integer; var lSymptomRA,lControlSymptomRA: SingleP;var lFactname,lOutName: string; lttestIn,lBMIn: boolean): boolean; implementation uses npmform; {$DEFINE NOTmedianfx} function AnacomLesionNPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun,lnControl: integer; var lSymptomRA,lControlSymptomRA: SingleP;var lFactname,lOutName: string; lttestIn,lBMIn: boolean): boolean; label 123,667; var lOutNameMod: string; lPlankImg: byteP; lOutImgSum,lOutImgBM,lOutImgT, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM,lCombinedSymptomRA: singleP; lPos,lPlank,lThread,lnControlsPlusPatients: integer; lVolVox,lMinMask,lMaxMask,lTotalMemory,lnPlanks,lVoxPerPlank, lThreadStart,lThreadEnd,lThreadInc,lnLesion,lnPermute, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lPosPct: int64; lT,lBMz, lSum,lThresh,lThreshBonf,lThreshPermute,lThreshNULP :double; lObsp: pointer; lObs: Doublep0; lStatHdr: TNIfTIhdr; lFdata: file; lRanOrderp: pointer; lRanOrder: Doublep0; lBM,lttest,lLtest: boolean; lnControlNeg: integer; {$IFDEF medianfx} lmedianFX,lmeanFX,lsummean,lsummedian: double; lmediancount: integer; {$ENDIF} begin lnControlNeg := lnControl; //negative for binomial test lttest := lttestin; lbm := lbmin; if (not (lttest)) and (not (lbm)) then begin lLtest := true; lBM := true; lnControlNeg := -lnControl; end; //lttest:= ttestmenu.checked; //lBM := BMmenu.checked; if lnControl < 1 then begin MainForm.NPMmsg('AnaCom aborted - need data from at least 1 control individual'); exit; end; lnPermute := 0;//MainForm.ReadPermute; MainForm.NPMmsg('Permutations = ' +IntToStr(lnPermute)); MainForm.NPMmsg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lMinMask := 1; lMaxMask := lVolVox; lVoxPerPlank := kPlankSz div lImages.Count div sizeof(byte) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; MainForm.NPMmsg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); MainForm.NPMmsg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); if (lnPlanks = 1) then getmem(lPlankImg,lTotalMemory) //assumes 1bpp else getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; {$IFDEF medianfx} lsummean := 0; lsummedian:= 0; lmediancount := 0; {$ENDIF} for lPos := 1 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; lnControlsPlusPatients := lImages.Count+lnControl; createArray64(lObsp,lObs,lnControlsPlusPatients); getmem(lOutImgSum,lVolVox* sizeof(single)); getmem(lOutImgBM,lVolVox* sizeof(single)); getmem(lOutImgT,lVolVox* sizeof(single)); MainForm.InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do begin lOutImgSum^[lPos] := 0; lOutImgBM^[lPos] := 0; lOutImgT^[lPos] := 0; end; //sumptom array for lesions AND controls for lPos := 1 to lImages.Count do lObs^[lPos-1] := lSymptomRA^[lPos]; for lPos := 1 to lnControl do lObs^[lPos-1+lImages.Count] := lControlSymptomRA^[lPos]; getmem(lCombinedSymptomRA,lnControlsPlusPatients* sizeof(single)); for lPos := 1 to lnControlsPlusPatients do lCombinedSymptomRA^[lPos] := lObs^[lPos-1]; //next create permuted BM bounds if lBM then begin MainForm.NPMmsg('Generating BM permutation thresholds'); MainForm.Refresh; //for lPos := 1 to lImages.Count do // lObs^[lPos-1] := lSymptomRA^[lPos]; genBMsim (lnControlsPlusPatients, lObs); end; ClearThreadData(gnCPUThreads,lnPermute) ; for lPlank := 1 to lnPlanks do begin MainForm.NPMmsg('Computing plank = ' +Inttostr(lPlank)); MainForm.Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image //threading start lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error with TLesionContinuous.Create (MainForm.ProgressBar1,lttest,lBM,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,lnControlNeg,lPlankImg,lOutImgSum,lOutImgBM,lOutImgT,nil,lCombinedSymptomRA) do {$IFDEF FPC} OnTerminate := @MainForm.ThreadDone; {$ELSE}OnTerminate := MainForm.ThreadDone;{$ENDIF} inc(gThreadsRunning); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; //threading end lStartVox := lEndVox + 1; end; lThreshPermute := 0; lnVoxTested := SumThreadData(gnCPUThreads,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); //next report findings if lnVoxTested < 1 then begin MainForm.NPMmsg('**Error: no voxels tested: no regions lesioned in at least '+inttostr(lnCrit)+' patients**'); goto 123; end; MainForm.NPMmsg('Voxels tested = ' +Inttostr(lnVoxTested)); {$IFDEF medianfx} MainForm.NPMmsg('Average MEAN effect size = ' +realtostr((lsummean/lmediancount),3)); MainForm.NPMmsg('Average MEDIAN effect size = ' +realtostr((lsummedian/lmediancount),3)); {$ENDIF} MainForm.NPMmsg('Only tested voxels with more than '+inttostr(lnCrit)+' lesions'); //Next: save results from permutation thresholding.... //Next: save results from permutation thresholding.... lThreshBonf := MainForm.reportBonferroni('Std',lnVoxTested); //Next: NULPS if lRun > 0 then //terrible place to do this - RAM problems, but need value to threshold maps lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap2 (lImages, lnCrit,lnVoxTested,lPlankImg)); //lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap (lImages, lnCrit)); //next: save data MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save sum map lOutNameMod := ChangeFilePostfixExt(lOutName,'Sum'+lFactName,'.hdr'); if (lRun < 1) then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); //create new header - subsequent images will use Z-scores MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if (lRun < 1) and (Sum2PowerCont(lOutImgSum,lVolVox,lImages.Count)) then begin lOutNameMod := ChangeFilePostfixExt(lOutName,'Power'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); end; //MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if lttest then begin //save Ttest //next: convert t-scores to z scores if lnControl < 1 then for lPos := 1 to lVolVox do lOutImgT^[lPos] := TtoZ (lOutImgT^[lPos],lImages.Count-2); for lPos := 1 to lnPermute do begin lPermuteMaxT^[lPos] := TtoZ (lPermuteMaxT^[lPos],lImages.Count-2); lPermuteMinT^[lPos] := TtoZ (lPermuteMinT^[lPos],lImages.Count-2); end; lThresh := MainForm.reportFDR ('ttest', lVolVox, lnVoxTested, lOutImgT); lThreshPermute := MainForm.reportPermute('attest',lnPermute,lPermuteMaxT, lPermuteMinT); lOutNameMod := ChangeFilePostfixExt(lOutName,'attest'+lFactName,'.hdr'); if lRun > 0 then MainForm.NPMmsgAppend('AnaComthreshtt,'+inttostr(lRun)+','+inttostr(MainForm.ThreshMap(lThreshNULP,lVolVox,lOutImgT))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgT,1); end; if lBM then begin //save Mann Whitney lThresh := MainForm.reportFDR ('BM', lVolVox, lnVoxTested, lOutImgBM); lThreshPermute := MainForm.reportPermute('aBM',lnPermute,lPermuteMaxBM, lPermuteMinBM); lOutNameMod := ChangeFilePostfixExt(lOutName,'aBM'+lFactName,'.hdr'); if lRun > 0 then MainForm.NPMmsgAppend('AnaCOMthreshbm,'+inttostr(lRun)+','+inttostr(MainForm.ThreshMap(lThreshNULP,lVolVox,lOutImgBM))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgBM,1); end; //next: free dynamic memory 123: MainForm.FreePermute (lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); freemem(lOutImgT); freemem(lOutImgBM); freemem(lOutImgSum); freemem(lObsp); freemem(lPlankImg); MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lFactName,'.txt'); MainForm.MsgSave(lOutNameMod); MainForm.ProgressBar1.Position := 0; exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 1 then freemem(lPlankImg); MainForm.NPMmsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; //LesionNPMAnalyze (*function readCSV2 (lFilename: string; lCol1,lCol2: integer; var lnObservations : integer; var ldataRA1,ldataRA2: singlep): boolean; const kHdrRow = 0;//1; kHdrCol = 0;//1; var lNumStr: string; F: TextFile; lTempFloat: double; lCh: char; lnFactors,MaxC,R,C:integer; lError: boolean; begin lError := false; result := false; if not fileexists(lFilename) then begin showmessage('Can not find '+lFilename); exit; end; AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //First pass: determine column height/width Reset(F); C := 0; MaxC := 0; R := 0; while not Eof(F) do begin //read next line //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if lNumStr <> '' then //july06- read data immediately prior to EOF inc(R); if (R <= (kHdrRow+1)) or (MaxC < (kHdrCol+lCol1)) or (MaxC < (kHdrCol+lCol2)) then begin showmessage('problems reading CSV - not enough columns/rows '+inttostr(lCol1)+' '+inttostr(lCol2)); exit; end; lnObservations := R -kHdrRow ; //-1: first row is header.... lnFactors := MaxC-1;// -1: first column is Y values //fx(lnObservations,lnFactors); //exit; getmem(ldataRA1,lnObservations*sizeof(single)); getmem(ldataRA2,lnObservations*sizeof(single)); //second pass Reset(F); C := 1; MaxC := 0; R := 1; lNumStr := ''; lTempfloat := 0; while not Eof(F) do begin //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin if (R > kHdrRow) and (C > kHdrCol) then begin if ((C-kHdrCol) = lCol1) or ((C-kHdrCol) = lCol2) then begin if lNumStr = '-' then begin lTempFloat := 0; end else begin //number try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except //showmessage(lNumStr); if (C-kHdrCol) = lCol1 then ldataRA1^[R-kHdrRow] := lTempFloat else if (C-kHdrCol) = lCol2 then ldataRA2^[R-kHdrRow] := lTempFloat; end; //number end; //col1 or col2 end;// else //R > 1 lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 1; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if (lNumStr <> '') and (C = lnFactors) then begin //unterminated string try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except ldataRA2^[R-1] := lTempFloat; end;//unterminated string //read finel item CloseFile(F); FileMode := 2; //Set file access to read/write result := true; end; *) function readTxt (lFilename: string; var lnObservations : integer; var ldataRA1: singlep): boolean; const kHdrRow = 0;//1; kHdrCol = 0;//1; var lCol1: integer; lNumStr: string; F: TextFile; lTempFloat: double; lCh: char; lnFactors,MaxC,R,C:integer; lError: boolean; begin lCol1:= 1; lError := false; result := false; if not fileexists(lFilename) then begin showmessage('Can not find '+lFilename); exit; end; AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //First pass: determine column height/width Reset(F); C := 0; MaxC := 0; R := 0; while not Eof(F) do begin //read next line //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if lNumStr <> '' then //july06- read data immediately prior to EOF inc(R); if (R <= (kHdrRow+1)) or (MaxC < (kHdrCol+lCol1)) then begin showmessage('problems reading CSV - not enough columns/rows '); exit; end; lnObservations := R -kHdrRow ; //-1: first row is header.... lnFactors := kHdrCol+lCol1;// -1: first column is Y values //fx(lnObservations,lnFactors); //exit; getmem(ldataRA1,lnObservations*sizeof(single)); //second pass Reset(F); C := 1; MaxC := 0; R := 1; lNumStr := ''; lTempfloat := 0; while not Eof(F) do begin //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin if (R > kHdrRow) and (C > kHdrCol) then begin if ((C-kHdrCol) = lCol1) {or ((C-kHdrCol) = lCol2)} then begin if lNumStr = '-' then begin lTempFloat := 0; end else begin //number try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except //showmessage(lNumStr); if (C-kHdrCol) = lCol1 then begin //showmessage(lNumStr); ldataRA1^[R-kHdrRow] := lTempFloat; end; {else if (C-kHdrCol) = lCol2 then ldataRA2^[R-kHdrRow] := lTempFloat;} end; //number end; //col1 or col2 end;// else //R > 1 lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 1; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; //showmessage(lNumStr+' '+inttostr(lnFactors)+' '+inttostr(C)); if (lNumStr <> '') and (C = lnFactors) then begin //unterminated string try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except //showmessage(inttostr(R)+' '+floattostr(lTempFLoat)); ldataRA1^[R] := lTempFloat; end;//unterminated string //read finel item CloseFile(F); FileMode := 2; //Set file access to read/write result := true; end; (*procedure DoAnaCOM; label 666; var lControlFilename: string; lI, lnControlObservations : integer; lControldata: singlep; lBinomial: boolean; lFact,lnFactors,lSubj,lnSubj,lnSubjAll,lMaskVoxels,lnCrit: integer; lImageNames,lImageNamesAll: TStrings; lPredictorList: TStringList; lTemp4D,lMaskname,lOutName,lFactname: string; lMaskHdr: TMRIcroHdr; lMultiSymptomRA,lSymptomRA: singleP; begin npmform.MainForm.memo1.lines.clear; npmform.MainForm.memo1.lines.add('AnaCOM analysis requires TXT/CSV format text file.'); npmform.MainForm.memo1.lines.add('One row per control participant.'); npmform.MainForm.memo1.lines.add('First column is performance of that participant.'); npmform.MainForm.memo1.lines.add('Example file:'); //npmform.MainForm.memo1.lines.add('deficit, voxels'); npmform.MainForm.memo1.lines.add('11'); npmform.MainForm.memo1.lines.add('19'); npmform.MainForm.memo1.lines.add('2'); npmform.MainForm.memo1.lines.add('22'); npmform.MainForm.memo1.lines.add('19'); npmform.MainForm.memo1.lines.add('6'); lControlFilename := 'c:\fx.txt'; if (not readTxt (lControlFilename, lnControlObservations,lControldata)) or (lnControlObservations < 1) then begin showmessage('Error reading file '+lControlFilename); exit; end; npmform.MainForm.memo1.lines.add('Control (n='+inttostr(lnControlObservations)+')performance: '); for lI := 1 to lnControlObservations do begin npmform.MainForm.memo1.lines.add(inttostr(lI)+' '+floattostr(lControldata^[lI])); end; //begin - copy lImageNamesAll:= TStringList.Create; //not sure why TStrings.Create does not work??? lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? //next, get 1st group if not MainForm.GetVal(lnSubjAll,lnFactors,lMultiSymptomRA,lImageNamesAll,lnCrit,{,binom}lPredictorList) then begin showmessage('Error with VAL file'); goto 666; end; lTemp4D := CreateDecompressed4D(lImageNamesAll); if (lnSubjAll < 1) or (lnFactors < 1) then begin Showmessage('Not enough subjects ('+inttostr(lnSubjAll)+') or factors ('+inttostr(lnFactors)+').'); goto 666; end; lMaskname := lImageNamesAll[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; lOutName := ExtractFileDirWithPathDelim(lMaskName)+'results'; MainForm.SaveHdrDlg.Filename := loutname; lOutName := lOutName+'.nii.gz'; if not MainForm.SaveHdrName ('Base Statistical Map', lOutName) then exit; for lFact := 1 to lnFactors do begin lImageNames.clear; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then {$ENDIF} lImageNames.Add(lImageNamesAll[lSubj-1]); lnSubj := lImageNames.Count; if lnSubj > 1 then begin getmem(lSymptomRA,lnSubj * sizeof(single)); lnSubj := 0; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then begin {$ELSE} begin{$ENDIF} inc(lnSubj); lSymptomRA^[lnSubj] := lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)]; end; MainForm.NPMmsgClear; MainForm.NPMMsg(MainForm.GetKVers); MainForm.NPMMsg('Threads: '+inttostr(gnCPUThreads)); lFactName := lPredictorList.Strings[lFact-1]; lFactName := LegitFilename(lFactName,lFact); MainForm.NPMMsg('Factor = '+lFactname); For lSubj := 1 to lnSubj do MainForm.NPMMsg (lImageNames.Strings[lSubj-1] + ' = '+realtostr(lSymptomRA^[lSubj],2) ); MainForm.NPMMsg('Total voxels = '+inttostr(lMaskVoxels)); MainForm.NPMMsg('Only testing voxels damaged in at least '+inttostr(lnCrit)+' individual[s]'); MainForm.NPMMsg('Number of Lesion maps = '+inttostr(lnSubj)); if not CheckVoxelsGroup(lImageNames,lMaskVoxels) then begin showmessage('File dimensions differ from mask.'); goto 666; end; MainForm.ReportDescriptives(lSymptomRA,lnSubj); AnacomLesionNPMAnalyze(lImageNames,lMaskHdr,lnCrit,-1,lnControlObservations,lSymptomRA,lControldata,lFactName,lOutname,true {ttest},false{BM}); Freemem(lSymptomRA); end; //lnsubj > 1 end; //for each factor if lnSubjAll > 0 then begin Freemem(lMultiSymptomRA); end; 666: lImageNames.Free; lImageNamesAll.Free; lPredictorList.Free; DeleteDecompressed4D(lTemp4D); ///end //AnacomLesionNPMAnalyze ( lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun,lnControl: integer; var lSymptomRA,lControlSymptomRA: SingleP;var lFactname,lOutName: string; lttest,lBM: boolean): boolean; freemem(lControldata); end;*) end. mricron-0.20120505.1~dfsg.1.orig/npm/npmform.pas0000664000175000017500000046566211732047364020657 0ustar michaelmichaelunit npmform; {$IFDEF FPC} {$mode objfpc}{$H+} {$ENDIF} interface {$I options.inc} uses define_types,SysUtils, part,StatThds,statcr,StatThdsUtil,Brunner,DISTR,nifti_img, Messages, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, ExtCtrls, StdCtrls, overlap,ReadInt,lesion_pattern,stats,LesionStatThds,nifti_hdr, {$IFDEF FPC} LResources,gzio2, {$ELSE} gziod,associate,{$ENDIF} //must be in search path, e.g. C:\pas\mricron\npm\math {$IFNDEF UNIX} Windows, {$ELSE} LCLType, {$ENDIF} upower,firthThds,firth,IniFiles,cpucount,userdir,math, regmult,utypes,turbolesion {$IFDEF compileANACOM}, anacom{$ENDIF} {$IFDEF benchmark}, montecarlo{$ENDIF} ; //regmultdelphi,matrices; type { TMainForm } TMainForm = class(TForm) Memo1: TMemo; Design1: TMenuItem; SaveText1: TMenuItem; ROIanalysis1: TMenuItem; OpenHdrDlg: TOpenDialog; SaveHdrDlg: TSaveDialog; Panel1: TPanel; ProgressBar1: TProgressBar; MainMenu1: TMainMenu; About1: TMenuItem; AssociatevalfileswithNPM1: TMenuItem; Balance1: TMenuItem; BinomialAnalysislesions1: TMenuItem; BMmenu: TMenuItem; ContinuousanalysisVBM1: TMenuItem; Copy1: TMenuItem; Countlesionoverlaps1: TMenuItem; Edit1: TMenuItem; Exit1: TMenuItem; File1: TMenuItem; Help1: TMenuItem; IntensitynormalizationA1: TMenuItem; Makemeanimage1: TMenuItem; Makemeanimage2: TMenuItem; N0: TMenuItem; N1000: TMenuItem; N2000: TMenuItem; N3000: TMenuItem; N4000: TMenuItem; niiniigz1: TMenuItem; Options1: TMenuItem; PairedTMenu: TMenuItem; PenalizedLogisticRegerssion1: TMenuItem; Permutations1: TMenuItem; PhysiologicalArtifactCorrection1: TMenuItem; SingleSubjectZScores1: TMenuItem; T1: TMenuItem; T15: TMenuItem; T16: TMenuItem; T2: TMenuItem; T3: TMenuItem; T4: TMenuItem; T7: TMenuItem; T8: TMenuItem; Tests1: TMenuItem; Threads1: TMenuItem; ttestmenu: TMenuItem; Utilities1: TMenuItem; Variance1: TMenuItem; VBM1: TMenuItem; VLSM1: TMenuItem; ComputeIntersectionandUnion1: TMenuItem; Intensitynormalization1: TMenuItem; Masked1: TMenuItem; MaskedintensitynormalizationA1: TMenuItem; MaskedintensitynormalizationB1: TMenuItem; Binaryimagescontinuousgroupsfast1: TMenuItem; Binarizeimages1: TMenuItem; Resliceimagetoneworientationandboundingbox1: TMenuItem; Setnonseroto1001: TMenuItem; AnaCOMmenu: TMenuItem; MonteCarloSimulation1: TMenuItem; Subtract1: TMenuItem; LogPtoZ1: TMenuItem; function GetKVers: string; function GetValX (var lnSubj, lnFactors: integer; var lSymptomRA: singleP; var lImageNames: TStrings; var lCrit: integer; {lBinomial : boolean;} var lPredictorList: TStringList):boolean; function ThreshMap(lThresh: single; lVolVox: integer;lOutImg: singleP): integer; function FirthNPMAnalyze (var lImages: TStrings; var lPredictorList: TStringList; var lMaskHdr: TMRIcroHdr; lnCond,lnCrit: integer; var lSymptomRA: SingleP; var lOutName: string): boolean; procedure InitPermute (lnSubj, lnPermute: integer; var lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP; var lRanOrderp: pointer; var lRanOrder: Doublep0); function reportPermute (lLabel:string; lnPermute: integer; var lPermuteMaxZ, lPermuteMinZ: singleP): double; procedure FreePermute (lnPermute: integer; var lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP;var lRanOrderp: pointer); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); function SaveHdrName (lCaption: string; var lFilename: string): boolean; procedure StrToMemo (lStr: string); procedure NPMclick(Sender: TObject); function OpenDialogExecute (lCaption: string;lAllowMultiSelect,lForceMultiSelect: boolean; lFilter: string): boolean;//; lAllowMultiSelect: boolean): boolean; function NPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lMaskVoxels,lnGroup1: integer): boolean; function NPMAnalyzePaired (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lMaskVoxels: integer): boolean; function NPMzscore (var lImages: TStrings; var lMnHdr,lStDevHdr: TMRIcroHdr): boolean; procedure FormCreate(Sender: TObject); function ReportDescriptives (var RA: SingleP; n: integer): boolean; function MakeSubtract (lPosName,lNegName: string): boolean; function MakeMean (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lBinarize,lVariance: boolean): boolean; function Balance (var lImageName,lMaskName: String; lMethod: integer{lInflection: boolean}): boolean; procedure LesionBtnClick(Sender: TObject); procedure Copy1Click(Sender: TObject); procedure testmenuclick(Sender: TObject); procedure radiomenuclick(Sender: TObject); procedure ReadIniFile; procedure WriteIniFile; function reportBonferroni(lLabel: string; lnTests: integer): double; function reportFDR (lLabel:string; lnVox, lnTests: integer; var lData: SingleP): double; procedure Makemeanimage1Click(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure Balance1Click(Sender: TObject); procedure niiniigz1Click(Sender: TObject); procedure Variance1Click(Sender: TObject); procedure ZtoP1Click(Sender: TObject); procedure About1Click(Sender: TObject); procedure Design1Click(Sender: TObject); procedure PhysiologicalArtifactCorrection1Click(Sender: TObject); procedure DualImageCorrelation1Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure PairedTMenuClick(Sender: TObject); procedure SingleSubjectZScores1Click(Sender: TObject); procedure MultipleRegressClick(Sender: TObject); function ReadPermute: integer; procedure NPMmsg( lStr: string); procedure NPMmsgClear; procedure MsgSave(lFilename: string); procedure SingleRegressClick(Sender: TObject); procedure AssociatevalfileswithNPM1Click(Sender: TObject); procedure threadChange(Sender: TObject); procedure Countlesionoverlaps1Click(Sender: TObject); procedure PenalizedLogisticRegerssion1Click(Sender: TObject); procedure ComputeIntersectionandUnion1Click(Sender: TObject); procedure ROCbinomialdeficit1Click(Sender: TObject); procedure ROCcontinuousdeficit1Click(Sender: TObject); procedure ThreadDone(Sender: TObject); procedure NPMmsgAppend( lStr: string); procedure ROIanalysis1Click(Sender: TObject); procedure Masked1Click(Sender: TObject); procedure Binarizeimages1Click(Sender: TObject); procedure Resliceimagetoneworientationandboundingbox1Click( Sender: TObject); procedure Setnonseroto1001Click(Sender: TObject); procedure Savetext1Click(Sender: TObject); procedure AnaCOMmenuClick(Sender: TObject); procedure MonteCarloSimulation1Click(Sender: TObject); procedure Subtract1Click(Sender: TObject); procedure LogPtoZ1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var MainForm: TMainForm; implementation uses filename,prefs,roc,hdr,regression,valformat {$IFDEF SPREADSHEET} ,design,spread{$ENDIF} {$IFNDEF UNIX},ActiveX {$ENDIF}; {$IFNDEF FPC} {$R *.DFM} {$ENDIF} const kVers : string = 'Chris Rorden''s NPM :: '+kMRIcronVers; var gNULP: boolean = true; gROI : boolean = false; function TMainForm.GetKVers: string; begin result := kVers +'; Threads used = '+inttostr(gnCPUThreads ); end; procedure TMainForm.NPMmsgAppend( lStr: string); var lOutname: string; f: TextFile; begin MainForm.Memo1.Lines.add(lStr); lOutname:='c:\dx.txt'; if fileexists(lOutname) then begin { open a text file } AssignFile(f, lOutname); Append(f); Writeln(f, lStr); Flush(f); { ensures that the text was actually written to file } { insert code here that would require a Flush before closing the file } CloseFile(f); end; end; procedure TMainForm.NPMmsg( lStr: string); begin MainForm.Memo1.Lines.add(lStr); end; procedure Msg(lStr: string); begin MainForm.NPMmsg(lStr); end; procedure MsgClear; begin MainForm.Memo1.Lines.Clear; end; procedure TMainForm.NPMmsgClear; begin MsgClear; end; procedure TMainForm.MsgSave(lFilename: string); begin MainForm.Memo1.Lines.SaveToFile(lFilename); end; procedure TMainForm.ThreadDone(Sender: TObject); begin Dec(gThreadsRunning); end; procedure InitRA (lnPermute: integer; var lRA: singleP); var lInc: integer; begin getmem(lRA,lnPermute* sizeof(single)); for lInc := 1 to lnPermute do lRA^[lInc] := 0; end; procedure TMainForm.InitPermute (lnSubj, lnPermute: integer; var lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP; var lRanOrderp: pointer; var lRanOrder: Doublep0); begin if (lnPermute < 2) then exit; InitRA(lnPermute,lPermuteMaxT); InitRA(lnPermute,lPermuteMinT); InitRA(lnPermute,lPermuteMaxBM); InitRA(lnPermute,lPermuteMinBM); createArray64(lRanOrderp,lRanOrder,lnSubj); end; //init permute procedure sort (lo, up: integer; var r:SingleP); //62ms Shell Sort http://www.dcc.uchile.cl/~rbaeza/handbook/algs/4/414.sort.p.html label 999; var d, i, j : integer; tempr : single; begin d := up-lo+1; while d>1 do begin if d<5 then d := 1 else d := trunc( 0.45454*d ); //Do linear insertion sort in steps size d for i:=up-d downto lo do begin tempr := r^[i]; j := i+d; while j <= up do if tempr > r^[j] then begin r^[j-d] := r^[j]; j := j+d end else goto 999; //break 999: r^[j-d] := tempr end //for end //while end; //proc Sort function IndexPct(lnPermute: integer; lPct: single; lTop: boolean): integer; begin result := round(lnPermute * lPct); if lTop then result := (lnPermute - result)+1; if (result < 1) then result := 1; if (result > lnPermute) then result := lnPermute; end; function TMainForm.reportBonferroni(lLabel: string; lnTests: integer): double; //returns 5% Z score begin if lnTests < 1 then exit; result := pNormalInv(0.05/lnTests); msg(inttostr(lnTests)+' test '+lLabel+' Bonferroni FWE Z '+ '0.050='+realtostr(result,3)+ ', 0.025='+realtostr(pNormalInv(0.025/lnTests),3)+ ', 0.01='+realtostr(pNormalInv(0.01/lnTests),3)); end; function TMainForm.reportFDR (lLabel:string; lnVox, lnTests: integer; var lData: SingleP): double; var lC,lN: integer; lPs: SingleP; lFDR05r, lFDR01r,lFDR05p, lFDR01p,lMin,lMax : double; begin result := 10000; if (lnTests < 1) or (lnVox < 1) then exit; GetMem(lPs,lnTests*sizeof(single)); for lC := 1 to lnTests do lPs^[lC] := 0; lN := 0; lMin := 0; lMax := 0; for lC := 1 to lnVox do begin if lData^[lC] <> 0 then begin inc(lN); if lData^[lC] > lMax then lMax := lData^[lC] else if lData^[lC] < lMin then lMin := lData^[lC]; if lN <= lnTests then lPs^[lN] := pNormal(lData^[lC]); end; end; EstimateFDR2(lnTests, lPs, lFDR05p, lFDR01p,lFDR05r, lFDR01r); msg(lLabel+' Range ' +realtostr(lMin,3)+ '...'+realtostr(lMax,3)); {Msg(lLabel+' Range ' +realtostr(pNormalInv(lPs[lnTests]),3)+ '...'+realtostr(pNormalInv(lPs[1]),3)+ ' '); } //we could use this and save time computing lmin/lmax, but loss in precision msg(lLabel+' +FDR Z '+ '0.050='+realtostr(pNormalInv(lFDR05p),8)+ ', 0.01='+realtostr(pNormalInv(lFDR01p),8)+ ' '); msg(lLabel+' -FDR Z '+ '0.050='+realtostr(pNormalInv(1-lFDR05r),8)+ ', 0.01='+realtostr(pNormalInv(1-lFDR01r),8)+ ' '); result := pNormalInv(lFDR01p); end; function ReportThresh (lLabel: string; lnPermute: integer; var lRankedData: singleP;lTop:boolean): double; begin result := lRankedData^[IndexPct(lnPermute,0.050,lTop)]; msg(lLabel+': permutationFWE '+ //'0.500='+realtostr(lRankedData[IndexPct(lnPermute,0.500,lTop)],3)+ ', 0.050='+realtostr({lRankedData^[IndexPct(lnPermute,0.050,lTop)]} result,8)+ ', 0.025='+realtostr(lRankedData^[IndexPct(lnPermute,0.025,lTop)],8)+ ', 0.01='+realtostr(lRankedData^[IndexPct(lnPermute,0.010,lTop)],8)+ ' '); end; function TMainForm.reportPermute (lLabel:string; lnPermute: integer; var lPermuteMaxZ, lPermuteMinZ: singleP): double; begin result := 0; if (lnPermute < 2) then exit; sort (1, lnPermute,lPermuteMaxZ); result := ReportThresh(lLabel+'+',lnPermute,lPermuteMaxZ,true); sort (1, lnPermute,lPermuteMinZ); ReportThresh(lLabel+'-',lnPermute,lPermuteMinZ,false); //for lPos := 1 to lnPermute do // msg(inttostr(lPos)+', '+realtostr(lPermuteMinZ[lPos],4)); end; procedure TMainForm.FreePermute (lnPermute: integer; var lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP;var lRanOrderp: pointer); begin if (lnPermute < 2) then exit; Freemem(lRanOrderp); Freemem(lPermuteMaxT); Freemem(lPermuteMinT); Freemem(lPermuteMaxBM); Freemem(lPermuteMinBM); end; function TMainForm.SaveHdrName (lCaption: string; var lFilename: string): boolean; begin result := false; SaveHdrDlg.InitialDir := lFilename; SaveHdrDlg.Title := lCaption; SaveHdrDlg.Filter := kAnaHdrFilter; if not SaveHdrDlg.Execute then exit; lFilename := SaveHdrDlg.Filename; result := true; end; procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin //showmessage('zz'); WriteIniFile; end; procedure MakeStatHdr (var lBGHdr,lStatHdr: TniftiHdr; lMinIntensity,lMaxIntensity,lIntent_p1,lIntent_p2,lIntent_p3: single; lIntent_code: smallint;lIntentName: string); var lIntentNameLen,lPos: integer; lStr: string; begin move(lBGHdr,lStatHdr,sizeof(TniftiHdr)); with lStatHdr do begin magic :=kNIFTI_MAGIC_SEPARATE_HDR; bitpix := 32; //32-bit real data datatype := kDT_FLOAT; scl_slope:= 1; scl_inter:= 0; glmin := round(lMinIntensity); glmax := round(lMaxIntensity); intent_code := lIntent_Code;// kNIFTI_INTENT_ESTIMATE; intent_p1 := lIntent_p1; intent_p2 := lIntent_p2; intent_p3 := lIntent_p3; lIntentNameLen := length(lIntentName); descrip[1] := 'N'; descrip[2] := 'P'; descrip[3] := 'M'; if lIntent_code=kNIFTI_INTENT_TTEST then begin descrip[4] := 't' ; lStr := inttostr(trunc(lIntent_p1)); for lPos := 1 to length (lStr) do descrip[4+lPos] := lStr[lPos] ; end else descrip[4] := 'z'; if lIntentNameLen > sizeof(intent_name) then lIntentNameLen := sizeof(intent_name); if lIntentNameLen > 0 then for lPos := 1 to lIntentNameLen do intent_name[lPos] := lIntentName[lPos]; end; end; procedure WriteThread( lnThread: integer); begin case lnThread of 2: MainForm.T2.checked := true; 3: MainForm.T3.checked := true; 4: MainForm.T4.checked := true; 7: MainForm.T7.checked := true; 8: MainForm.T8.checked := true; 15: MainForm.T15.checked := true; 16: MainForm.T16.checked := true; else MainForm.T1.checked := true; end; gnCPUThreads := lnThread; end; function ReadThread: integer; begin if MainForm.T16.checked then result := 16 else if MainForm.T15.checked then result := 15 else if MainForm.T8.checked then result := 8 else if MainForm.T7.checked then result := 7 else if MainForm.T4.checked then result := 4 else if MainForm.T3.checked then result := 3 else if MainForm.T2.checked then result := 2 else result := 1; gnCPUThreads := result; end; procedure WritePermute( lnPermute: integer); begin case lnPermute of 4000: MainForm.N4000.checked := true; 3000: MainForm.N3000.checked := true; 2000: MainForm.N2000.checked := true; 1000: MainForm.N1000.checked := true; else MainForm.N0.checked := true; end; end; function TMainForm.ReadPermute: integer; begin if MainForm.N4000.checked then result := 4000 else if MainForm.N3000.checked then result := 3000 else if MainForm.N2000.checked then result := 2000 else if MainForm.N1000.checked then result := 1000 else result := 0; end; (*function LoadImgX(lInName: string; lImgData: SingleP; lStart, lEnd,linvox_offset,lRApos,lDataType,lVolVox: integer): boolean; var lInc: integer; begin //LoadImgX(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox); for lInc := 1 to ((lEnd{+1})-lStart) do lImgData^[lRApos+lInc-1] := 123; msg(inttostr(lRApos+1-1)+' '+inttostr(lRApos+((lEnd+1)-lStart)-1) ); end;*) function TMainForm.NPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lMaskVoxels,lnGroup1: integer): boolean; label 667; var lOutName,lOutNameMod: string; lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lDummy: SingleP; lTotalMemory: double; //not integer - limit for 32bit int is 2Gb lPlank,lVolVox,lPos,lMinMask,lMaxMask,lnPlanks,lVoxPerPlank, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lThreadStart,lThreadEnd,lThreadInc: integer; lT, lSum, lMn: double; lStatHdr: TNIfTIhdr; lFdata: file; lThread,lnPermute: integer; lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP; lRanOrderp: pointer; lRanOrder: Doublep0; lttest,lBM: boolean; begin result := false; lttest:= ttestmenu.checked; lBM := BMmenu.checked; lnPermute := ReadPermute; //lnPermute := 100; msg('Permutations = ' +IntToStr(lnPermute)); lOutName := lMaskHdr.ImgFileName; if not SaveHdrName ('Statistical Map', lOutName) then exit; msg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; //load mask getmem(lMaskImg,lVolVox*sizeof(single)); if not LoadImg(lMaskHdr.ImgFileName, lMaskImg, 1, lVolVox,round(gOffsetRA[0]),1,lMaskHdr.NIFTIhdr.datatype,lVolVox) then begin msg('Unable to load mask ' +lMaskHdr.ImgFileName); goto 667; end; //next find start and end of mask lPos := 0; repeat inc(lPos); until (lMaskImg^[lPos] > 0) or (lPos = lVolVox); lMinMask := lPos; lPos := lVolVox+1; repeat dec(lPos); until (lMaskImg^[lPos] > 0) or (lPos = 1); lMaxMask := lPos; if lMaxMask = 1 then begin msg('Mask appears empty' +lMaskHdr.ImgFileName); goto 667; end; msg('Mask has voxels from '+inttostr(lMinMask)+'..'+inttostr(lMaxMask)); lVoxPerPlank := kPlankSz div lImages.Count div sizeof(single) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; msg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); msg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; for lPos := 1 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; getmem(lOutImgMn,lVolVox* sizeof(single)); getmem(lOutImgBM,lVolVox* sizeof(single)); getmem(lOutImgT,lVolVox* sizeof(single)); InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do begin lOutImgMn^[lPos] := 0; lOutImgBM^[lPos] := 0; lOutImgT^[lPos] := 0; end; ClearThreadData(gnCPUThreads,lnPermute); for lPlank := 1 to lnPlanks do begin msg('Computing plank = ' +Inttostr(lPlank)); Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image //showmessage('stop'); //threading start lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error with TNNStat.Create (ProgressBar1,lttest,lBM,0, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,lnGroup1, lMaskImg,lPlankImg,lOutImgMn,lOutImgBM,lOutImgT,lDummy) do {$IFDEF FPC} OnTerminate := @ThreadDone; {$ELSE}OnTerminate := ThreadDone;{$ENDIF} inc(gThreadsRunning); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; //threading end lStartVox := lEndVox + 1; end; lnVoxTested := SumThreadData(gnCPUThreads,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); //next report findings msg('Voxels tested = ' +Inttostr(lnVoxTested)); reportBonferroni('Std',lnVoxTested); //next: save data (*savedata*) MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save mean lOutNameMod := ChangeFilePostfixExt(lOutName,'Mean','.hdr'); if lnVoxTested > 1 then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgMn,1); MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if (lttest) and (lnVoxTestED > 1 ) then begin //save Ttest //reportRange ('ttest', lVolVox, lnVoxTested, lOutImgT); //next: convert t-scores to z scores for lPos := 1 to lVolVox do lOutImgT^[lPos] := TtoZ (lOutImgT^[lPos],lImages.Count-2); for lPos := 1 to lnPermute do begin lPermuteMaxT^[lPos] := TtoZ (lPermuteMaxT^[lPos],lImages.Count-2); lPermuteMinT^[lPos] := TtoZ (lPermuteMinT^[lPos],lImages.Count-2); end; reportFDR ('ttest', lVolVox, lnVoxTested, lOutImgT); reportPermute('ttest',lnPermute,lPermuteMaxT, lPermuteMinT); lOutNameMod := ChangeFilePostfixExt(lOutName,'ttest','.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgT,1); end; if (lBM) and (lnVoxTested > 1 ) then begin //save Brunner Munzel reportFDR ('BM', lVolVox, lnVoxTested, lOutImgBM); reportPermute('BM',lnPermute,lPermuteMaxBM, lPermuteMinBM); lOutNameMod := ChangeFilePostfixExt(lOutName,'BM','.hdr'); {reportFDR ('absT', lVolVox, lnVoxTested, lOutImgBM); reportPermute('absT',lnPermute,lPermuteMaxBM, lPermuteMinBM); lOutNameMod := ChangeFilePostfixExt(lOutName,'absT','.hdr'); } //NIFTIhdr_SaveHdr(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr)); lOutNameMod := changefileext(lOutNameMod,'.img'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgBM,1); end;(**) //next: close images FreePermute (lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); freemem(lOutImgT); freemem(lOutImgBM); freemem(lOutImgMn); //freemem(lObsp); freemem(lMaskImg); freemem(lPlankImg); msg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes','.txt'); MsgSave(lOutNameMod); ProgressBar1.Position := 0; result := true; exit; 667: //you only get here if you aborted ... free memory and report error if lVolVox > 1 then freemem(lMaskImg); if lTotalMemory > 1 then freemem(lPlankImg); msg('Unable to complete analysis.'); ProgressBar1.Position := 0; end; function TMainForm.NPMAnalyzePaired (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lMaskVoxels: integer): boolean; label 667; var lOutName,lOutNameMod: string; lMaskImg,lPlankImg,lOutImgMn,lOutImgT,lDummy,lDummy2: SingleP; lTotalMemory: double; //not integer - limit for 32bit int is 2Gb lPlank,lVolVox,lPos,lMinMask,lMaxMask,lnPlanks,lVoxPerPlank, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lThreadStart,lThreadEnd,lThreadInc: integer; lT, lSum, lMn: double; lStatHdr: TNIfTIhdr; lFdata: file; lThread,lnPermute: integer; lPermuteMaxT, lPermuteMinT: singleP; lRanOrderp: pointer; lRanOrder: Doublep0; begin //lnPermute := ReadPermute; lnPermute := 0;//not yet msg('Permutations = ' +IntToStr(lnPermute)); lOutName := lMaskHdr.ImgFileName; if not SaveHdrName ('Statistical Map', lOutName) then exit; msg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; //load mask getmem(lMaskImg,lVolVox*sizeof(single)); if not LoadImg(lMaskHdr.ImgFileName, lMaskImg, 1, lVolVox,round(gOffsetRA[0]),1,lMaskHdr.NIFTIhdr.datatype,lVolVox) then begin msg('Unable to load mask ' +lMaskHdr.ImgFileName); goto 667; end; //next find start and end of mask lPos := 0; repeat inc(lPos); until (lMaskImg^[lPos] > 0) or (lPos = lVolVox); lMinMask := lPos; lPos := lVolVox+1; repeat dec(lPos); until (lMaskImg^[lPos] > 0) or (lPos = 1); lMaxMask := lPos; if lMaxMask = 1 then begin Msg('Mask appears empty' +lMaskHdr.ImgFileName); goto 667; end; Msg('Mask has voxels from '+inttostr(lMinMask)+'..'+inttostr(lMaxMask)); lVoxPerPlank := kPlankSz div lImages.Count div sizeof(single) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; Msg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); Msg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; for lPos := 1 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; getmem(lOutImgMn,lVolVox* sizeof(single)); getmem(lOutImgT,lVolVox* sizeof(single)); //not yet InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do begin lOutImgMn^[lPos] := 0; lOutImgT^[lPos] := 0; end; ClearThreadData(gnCPUThreads,lnPermute); for lPlank := 1 to lnPlanks do begin Msg('Computing plank = ' +Inttostr(lPlank)); Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image //threading start lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error with TPairedTStat.Create (ProgressBar1,false,false,0, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,666, lMaskImg,lPlankImg,lOutImgMn,lDummy2,lOutImgT,lDummy) do {$IFDEF FPC} OnTerminate := @ThreadDone; {$ELSE}OnTerminate := ThreadDone;{$ENDIF} inc(gThreadsRunning); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; //threading end lStartVox := lEndVox + 1; end; lnVoxTested := SumThreadDataLite(gnCPUThreads);//not yet SumThreadData(gnCPUThreads,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); //next report findings Msg('Voxels tested = ' +Inttostr(lnVoxTested)); reportBonferroni('Std',lnVoxTested); //next: save data (*savedata *) MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save mean lOutNameMod := ChangeFilePostfixExt(lOutName,'Mean','.hdr'); if lnVoxTested > 1 then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgMn,1); MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if (lnVoxTestED > 1 ) then begin //save Ttest //next: convert t-scores to z scores for lPos := 1 to lVolVox do lOutImgT^[lPos] := TtoZ (lOutImgT^[lPos],(lImages.Count div 2)-1); for lPos := 1 to lnPermute do begin lPermuteMaxT^[lPos] := TtoZ (lPermuteMaxT^[lPos],lImages.Count-2); lPermuteMinT^[lPos] := TtoZ (lPermuteMinT^[lPos],lImages.Count-2); end; reportFDR ('ttest', lVolVox, lnVoxTested, lOutImgT); reportPermute('ttest',lnPermute,lPermuteMaxT, lPermuteMinT); lOutNameMod := ChangeFilePostfixExt(lOutName,'ttest','.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgT,1); end; //next: close images //not yet FreePermute (lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); freemem(lOutImgT); freemem(lOutImgMn); //freemem(lObsp); freemem(lMaskImg); freemem(lPlankImg); Msg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes','.txt'); MsgSave(lOutNameMod); ProgressBar1.Position := 0; exit; 667: //you only get here if you aborted ... free memory and report error if lVolVox > 1 then freemem(lMaskImg); if lTotalMemory > 1 then freemem(lPlankImg); Msg('Unable to complete analysis.'); ProgressBar1.Position := 0; end; function TMainForm.OpenDialogExecute (lCaption: string;lAllowMultiSelect,lForceMultiSelect: boolean; lFilter: string): boolean;//; lAllowMultiSelect: boolean): boolean; var lNumberofFiles: integer; begin OpenHdrDlg.Filter := lFilter;//kAnaHdrFilter;//lFilter; OpenHdrDlg.FilterIndex := 1; OpenHdrDlg.Title := lCaption; if lAllowMultiSelect then OpenHdrDlg.Options := [ofAllowMultiSelect,ofFileMustExist] else OpenHdrDlg.Options := [ofFileMustExist]; result := OpenHdrDlg.Execute; if not result then exit; if lForceMultiSelect then begin lNumberofFiles:= OpenHdrDlg.Files.Count; if lNumberofFiles < 2 then begin Showmessage('Error: This function is designed to overlay MULTIPLE images. You selected less than two images.'); result := false; end; end; end; procedure TMainForm.NPMclick(Sender: TObject); label 666; var lnGroup1,lMaskVoxels: integer; lG: TStrings; lMaskname: string; lMaskHdr: TMRIcroHdr; begin if (not ttestmenu.checked) and (not BMmenu.checked) then begin Showmessage('Error: you need to compute at least on test [options/test menu]'); exit; end; MsgClear; Msg(GetKVers); Msg('Threads: '+inttostr(gnCPUThreads)); if not OpenDialogExecute('Select brain mask ',false,false,kImgFilter) then begin showmessage('NPM aborted: mask selection failed.'); exit; end; //if not selected lMaskname := OpenHdrDlg.Filename; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading mask.'); exit; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); exit; end; Msg('Mask name = '+ lMaskname); Msg('Total voxels = '+inttostr(lMaskVoxels)); //next, get 1st group if not OpenDialogExecute('Select postive group (Z scores positive if this group is brighter)',true,true,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected lG:= TStringList.Create; //not sure why TStrings.Create does not work??? lG.addstrings(OpenHdrDlg.Files); lnGroup1 :=OpenHdrDlg.Files.Count; Msg('Scans in Group 1 = '+inttostr(lnGroup1)); //next, get 2nd group if not OpenDialogExecute('Select negative group (Z scores negative if this group is brighter)',true,true,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); goto 666; end; //if not selected lG.addstrings(OpenHdrDlg.Files); if not CheckVoxelsGroupX(lG,lMaskHdr {lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; Msg('Scans in Group 2 = '+inttostr(lG.count-lnGroup1)); NPMAnalyze(lG,lMaskHdr,lMaskVoxels,lnGroup1); 666: lG.Free; end; function TMainForm.ThreshMap(lThresh: single; lVolVox: integer;lOutImg: singleP): integer; var lVox: integer; begin result := 0; for lVox := 1 to lVolVox do if lOutImg^[lVox] >= lThresh then inc(result); for lVox := 1 to lVolVox do if lOutImg^[lVox] >= lThresh then lOutImg^[lVox] := 1 else lOutImg^[lVox] := 0; end; {x$DEFINE NOTmedianfx} (*function TMainForm.LesionNPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun: integer; var lSymptomRA: SingleP;var lFactname,lOutName: string): boolean; label 123,667; var lOutNameMod: string; lPlankImg: byteP; lOutImgSum,lOutImgBM,lOutImgT, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP; lPos,lPlank,lThread: integer; lVolVox,lMinMask,lMaxMask,lTotalMemory,lnPlanks,lVoxPerPlank, lThreadStart,lThreadEnd,lThreadInc,lnLesion,lnPermute, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lPosPct: int64; lT,lBMz, lSum,lThresh :double; lObsp: pointer; lObs: Doublep0; lStatHdr: TNIfTIhdr; lFdata: file; lRanOrderp: pointer; lRanOrder: Doublep0; lttest,lBM: boolean; {$IFDEF medianfx} lmedianFX,lmeanFX,lsummean,lsummedian: double; lmediancount: integer; {$ENDIF} begin lttest:= ttestmenu.checked; lBM := BMmenu.checked; lnPermute := ReadPermute; Msg('Permutations = ' +IntToStr(lnPermute)); Msg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lMinMask := 1; lMaxMask := lVolVox; lVoxPerPlank := kPlankSz div lImages.Count div sizeof(byte) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; Msg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); Msg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); if (lnPlanks = 1) then getmem(lPlankImg,lTotalMemory) //assumes 1bpp else getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; {$IFDEF medianfx} lsummean := 0; lsummedian:= 0; lmediancount := 0; {$ENDIF} for lPos := 1 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; createArray64(lObsp,lObs,lImages.Count); getmem(lOutImgSum,lVolVox* sizeof(single)); getmem(lOutImgBM,lVolVox* sizeof(single)); getmem(lOutImgT,lVolVox* sizeof(single)); InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do begin lOutImgSum^[lPos] := 0; lOutImgBM^[lPos] := 0; lOutImgT^[lPos] := 0; end; //next create permuted BM bounds if lBM then begin Msg('Generating BM permutation thresholds'); Refresh; for lPos := 1 to lImages.Count do lObs^[lPos-1] := lSymptomRA^[lPos]; genBMsim (lImages.Count, lObs); end; ClearThreadData(gnCPUThreads,lnPermute) ; for lPlank := 1 to lnPlanks do begin Msg('Computing plank = ' +Inttostr(lPlank)); Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image //threading start lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error with TLesionContinuous.Create (ProgressBar1,lttest,lBM,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,0,lPlankImg,lOutImgSum,lOutImgBM,lOutImgT,nil,lSymptomRA) do {$IFDEF FPC} OnTerminate := @ThreadDone; {$ELSE}OnTerminate := ThreadDone;{$ENDIF} inc(gThreadsRunning); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; //threading end lStartVox := lEndVox + 1; end; lnVoxTested := SumThreadData(gnCPUThreads,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); //next report findings if lnVoxTested < 1 then begin Msg('**Error: no voxels tested: no regions lesioned in at least '+inttostr(lnCrit)+' patients**'); goto 123; end; Msg('Voxels tested = ' +Inttostr(lnVoxTested)); {$IFDEF medianfx} Msg('Average MEAN effect size = ' +realtostr((lsummean/lmediancount),3)); Msg('Average MEDIAN effect size = ' +realtostr((lsummedian/lmediancount),3)); {$ENDIF} Msg('Only tested voxels with more than '+inttostr(lnCrit)+' lesions'); //Next: save results from permutation thresholding.... reportBonferroni('Std',lnVoxTested); //next: save data MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save sum map lOutNameMod := ChangeFilePostfixExt(lOutName,'Sum'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); //create new header - subsequent images will use Z-scores MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if Sum2PowerCont(lOutImgSum,lVolVox,lImages.Count) then begin lOutNameMod := ChangeFilePostfixExt(lOutName,'Power'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); end; //MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if lttest then begin //save Ttest //next: convert t-scores to z scores for lPos := 1 to lVolVox do lOutImgT^[lPos] := TtoZ (lOutImgT^[lPos],lImages.Count-2); for lPos := 1 to lnPermute do begin lPermuteMaxT^[lPos] := TtoZ (lPermuteMaxT^[lPos],lImages.Count-2); lPermuteMinT^[lPos] := TtoZ (lPermuteMinT^[lPos],lImages.Count-2); end; lThresh := reportFDR ('ttest', lVolVox, lnVoxTested, lOutImgT); reportPermute('ttest',lnPermute,lPermuteMaxT, lPermuteMinT); lOutNameMod := ChangeFilePostfixExt(lOutName,'ttest'+lFactName,'.hdr'); if lRun > 0 then Msg('threshtt,'+inttostr(lRun)+','+inttostr(ThreshMap(lThresh,lVolVox,lOutImgT))+','+realtostr(lThresh,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgT,1); end; if lBM then begin //save Mann Whitney lThresh := reportFDR ('BM', lVolVox, lnVoxTested, lOutImgBM); reportPermute('BM',lnPermute,lPermuteMaxBM, lPermuteMinBM); lOutNameMod := ChangeFilePostfixExt(lOutName,'BM'+lFactName,'.hdr'); if lRun > 0 then Msg('threshbm,'+inttostr(lRun)+','+inttostr(ThreshMap(lThresh,lVolVox,lOutImgBM))+','+realtostr(lThresh,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgBM,1); end; //next: free dynamic memory 123: FreePermute (lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); freemem(lOutImgT); freemem(lOutImgBM); freemem(lOutImgSum); freemem(lObsp); freemem(lPlankImg); Msg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lFactName,'.txt'); MsgSave(lOutNameMod); ProgressBar1.Position := 0; exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 1 then freemem(lPlankImg); Msg('Unable to complete analysis.'); ProgressBar1.Position := 0; end; //LesionNPMAnalyze *) (*function TMainForm.LesionNPMAnalyzeBinomial (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit: integer; var lSymptomRA: SingleP; var lFactname,lOutName: string): boolean; label 123,667; var lVal: single; lOutNameMod: string; lPlankImg: byteP; lOutImgSum,lOutImgL,lDummyImg, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM: singleP; lPos,lPlank,lThread,lnDeficit: integer; lTotalMemory,lVolVox,lMinMask,lMaxMask,lnPlanks,lVoxPerPlank, lThreadStart,lThreadInc,lThreadEnd, lnLesion,lnPermute, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lPosPct: int64; lT, lSum: double; lObsp: pointer; lObs: Doublep0; lStatHdr: TNIfTIhdr; lFdata: file; lRanOrderp: pointer; lRanOrder: Doublep0; begin lnPermute := ReadPermute; Msg('Permutations = ' +IntToStr(lnPermute)); //lOutName := lMaskHdr.ImgFileName; //if not SaveHdrName ('Statistical Map', lOutName) then exit; Msg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lMinMask := 1; lMaxMask := lVolVox; lVoxPerPlank := kPlankSz div lImages.Count div sizeof(byte) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; Msg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); Msg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); if (lnPlanks = 1) then getmem(lPlankImg,lTotalMemory) //assumes 1bp else getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; for lPos := 1 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; createArray64(lObsp,lObs,lImages.Count); getmem(lOutImgSum,lVolVox* sizeof(single)); getmem(lOutImgL,lVolVox* sizeof(single)); InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do begin lOutImgSum^[lPos] := 0; lOutImgL^[lPos] := 0; end; ClearThreadDataPvals(gnCPUThreads,lnPermute) ; for lPlank := 1 to lnPlanks do begin ProgressBar1.Position := 1; Msg('Computing plank = ' +Inttostr(lPlank)); Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image //threading start lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error //with TLesionBinomial.Create (ProgressBar1,false,true,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,666, lDummyImg,lPlankImg,lOutImgSum,lOutImgL,lDummyImg,lSymptomRA) do with TLesionBinom.Create (ProgressBar1,false,true,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,0,lPlankImg,lOutImgSum,lOutImgL,lDummyImg,nil,lSymptomRA) do {$IFDEF FPC} OnTerminate := @ThreadDone; {$ELSE}OnTerminate := ThreadDone;{$ENDIF} inc(gThreadsRunning); Msg('Thread ' +Inttostr(gThreadsRunning)+' = '+inttostr(lThreadStart)+'..'+inttostr(lThreadEnd)); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; //threading end lStartVox := lEndVox + 1; end; lnVoxTested := SumThreadData(gnCPUThreads,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); for lPos := 1 to lnPermute do begin if (lPermuteMinT^[lPos] > 1.1) or (lPermuteMinT^[lPos] < -1.1) then lPermuteMinT^[lPos] := 0.5; if (lPermuteMaxT^[lPos] > 1.1) or (lPermuteMaxT^[lPos] < -1.1) then lPermuteMaxT^[lPos] := 0.5; lVal := lPermuteMaxT^[lPos]; lPermuteMaxT^[lPos] := lPermuteMinT^[lPos]; lPermuteMinT^[lPos] := lVal; if lPermuteMaxT^[lPos] < 0 then lPermuteMaxT^[lPos] := -pNormalInv(abs(lPermuteMaxT^[lPos])) else lPermuteMaxT^[lPos] := pNormalInv(lPermuteMaxT^[lPos]); if lPermuteMinT^[lPos] < 0 then lPermuteMinT^[lPos] := -pNormalInv(abs(lPermuteMinT^[lPos])) else lPermuteMinT^[lPos] := pNormalInv(lPermuteMinT^[lPos]); end; if lnVoxTested < 1 then begin Msg('**Error: no voxels tested: no regions lesioned in at least '+inttostr(lnCrit)+' patients**'); goto 123; end; //next report findings Msg('Voxels tested = ' +Inttostr(lnVoxTested)); Msg('Only tested voxels with more than '+inttostr(lnCrit)+' lesions'); //Next: save results from permutation thresholding.... reportBonferroni('Std',lnVoxTested); //next: save data //savedata MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save sum map lOutNameMod := ChangeFilePostfixExt(lOutName,'Sum'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); //future images will store Z-scores... MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); //save power map lnDeficit := 0; for lPos := 1 to lImages.Count do if lSymptomRA^[lPos] = 0 then inc(lnDeficit); if Sum2Power(lOutImgSum,lVolVox,lImages.Count,lnDeficit) then begin lOutNameMod := ChangeFilePostfixExt(lOutName,'Power'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); end; // MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); //save Liebermeister lOutNameMod := ChangeFilePostfixExt(lOutName,'L'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgL,1); //save end reportFDR ('L', lVolVox, lnVoxTested, lOutImgL); reportPermute('L',lnPermute,lPermuteMaxT, lPermuteMinT); 123: //next: free dynamic memory FreePermute (lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); freemem(lOutImgL); freemem(lOutImgSum); freemem(lObsp); freemem(lPlankImg); Msg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lFactName,'.txt'); MsgSave(lOutNameMod); ProgressBar1.Position := 0; exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 1 then freemem(lPlankImg); Msg('Unable to complete analysis.'); ProgressBar1.Position := 0; end; *) function TMainForm.GetValX (var lnSubj, lnFactors: integer; var lSymptomRA: singleP; var lImageNames: TStrings; var lCrit: integer; {lBinomial : boolean;} var lPredictorList: TStringList):boolean; //warning: you MUST free lPredictorList var lVALFilename {,lTemplateName}: string; lCritPct: integer; begin lPredictorList := TStringList.Create; result := false; lnSubj := 0; if not MainForm.OpenDialogExecute('Select MRIcron VAL file',false,false,'MRIcron VAL (*.val)|*.val') then begin showmessage('NPM aborted: VAL file selection failed.'); exit; end; //if not selected lVALFilename := MainForm.OpenHdrDlg.Filename; result := GetValCore ( lVALFilename, lnSubj, lnFactors, lSymptomRA, lImageNames, lCrit,lCritPct{,binom},lPredictorList); end; function TMainForm.ReportDescriptives (var RA: SingleP; n: integer): boolean; var lMn,lSD,lSE,lSkew,lZSkew: double; begin SuperDescriptive (RA, n, lMn,lSD,lSE,lSkew,lZSkew); Msg('mean='+floattostr(lMn)+',StDev='+floattostr(lSD)+',StEr='+floattostr(lSE)+',Skew='+floattostr(lSkew)+',ZSkew='+floattostr(lZSkew)); end; (*function noVariance (lRA: singlep; lnSubj: integer): boolean; var lI : integer; begin result := false; if lnSubj < 2 then exit; for lI := 2 to lnSubj do if lRA^[1] <> lRA^[lI] then exit; result := true; end; *) (*procedure TMainForm.LesionBtnClick(Sender: TObject); label 666; var lBinomial: boolean; lFact,lnFactors,lSubj,lnSubj,lnSubjAll,lMaskVoxels,lnCrit: integer; lImageNames,lImageNamesAll: TStrings; lPredictorList: TStringList; lTemp4D,lMaskname,lOutName,lFactname: string; lMaskHdr: TMRIcroHdr; lMultiSymptomRA,lSymptomRA: singleP; begin lBinomial := not odd( (Sender as tMenuItem).tag); if (not lBinomial) and (not ttestmenu.checked) and (not BMmenu.checked) then begin Showmessage('Error: you need to compute at least on test [options/test menu]'); exit; end; lImageNamesAll:= TStringList.Create; //not sure why TStrings.Create does not work??? lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? //next, get 1st group if not GetVal(lnSubjAll,lnFactors,lMultiSymptomRA,lImageNamesAll,lnCrit{,binom},lPredictorList) then begin showmessage('Error with VAL file'); goto 666; end; lTemp4D := CreateDecompressed4D(lImageNamesAll); if (lnSubjAll < 1) or (lnFactors < 1) then begin Showmessage('Not enough subjects ('+inttostr(lnSubjAll)+') or factors ('+inttostr(lnFactors)+').'); goto 666; end; lMaskname := lImageNamesAll[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; if not CheckVoxelsGroup(lImageNamesAll,lMaskVoxels) then begin showmessage('File dimensions differ from mask.'); goto 666; end; lOutName := ExtractFileDirWithPathDelim(lMaskName)+'results'; SaveHdrDlg.Filename := loutname; lOutName := lOutName+'.nii.gz'; if not SaveHdrName ('Base Statistical Map', lOutName) then goto 666; for lFact := 1 to lnFactors do begin MsgClear; Msg(GetKVers); lImageNames.clear; for lSubj := 1 to lnSubjAll do if (not lBinomial) or (lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] = 0) OR (lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] = 1) THEN begin {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then {$ENDIF} lImageNames.Add(lImageNamesAll[lSubj-1]); end else begin Msg('Data rejected: behavior must be zero or one for binomial test '+lImageNamesAll.Strings[lSubj-1]); end; lnSubj := lImageNames.Count; if lnSubj > 1 then begin getmem(lSymptomRA,lnSubj * sizeof(single)); lnSubj := 0; for lSubj := 1 to lnSubjAll do if (not lBinomial) or (lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] = 0) OR (lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] = 1) THEN {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then begin {$ELSE} begin{$ENDIF} inc(lnSubj); lSymptomRA^[lnSubj] := lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)]; end; Msg('Threads: '+inttostr(gnCPUThreads)); lFactName := lPredictorList.Strings[lFact-1]; lFactName := LegitFilename(lFactName,lFact); Msg('Factor = '+lFactname); For lSubj := 1 to lnSubj do Msg (lImageNames.Strings[lSubj-1] + ' = '+realtostr(lSymptomRA^[lSubj],2) ); Msg('Total voxels = '+inttostr(lMaskVoxels)); Msg('Only testing voxels damaged in at least '+inttostr(lnCrit)+' individual[s]'); Msg('Number of Lesion maps = '+inttostr(lnSubj)); if not CheckVoxelsGroup(lImageNames,lMaskVoxels) then begin showmessage('File dimensions differ from mask.'); goto 666; end; if noVariance (lSymptomRA,lnSubj) then Msg('Error no variability in behavioral data ') else if lBinomial then LesionNPMAnalyzeBinomial2(lImageNames,lMaskHdr,lnCrit,MainForm.ReadPermute,lSymptomRA,lFactname,lOutName) else begin ReportDescriptives(lSymptomRA,lnSubj); LesionNPMAnalyze2(lImageNames,lMaskHdr,lnCrit,-1,MainForm.ReadPermute,lSymptomRA,lFactName,lOutname,ttestmenu.checked,BMmenu.checked); end; Freemem(lSymptomRA); end; //lnsubj > 1 end; //for each factor if lnSubjAll > 0 then begin Freemem(lMultiSymptomRA); end; 666: lImageNames.Free; lImageNamesAll.Free; lPredictorList.Free; DeleteDecompressed4D(lTemp4D); end; *) procedure TMainForm.Copy1Click(Sender: TObject); begin Memo1.SelectAll; Memo1.CopyToClipBoard; end; procedure TMainForm.testmenuclick(Sender: TObject); begin (sender as TMenuItem).checked := not (sender as TMenuItem).checked; end; procedure TMainForm.radiomenuclick(Sender: TObject); begin (sender as tmenuitem).checked := true; end; procedure ComputePlankSize; begin if kPlankMB < 128 then kPlankMB := 128; if kPlankMB > 2000 then kPlankMB := 2000; //we use signed 32-bit pointers, so we can not exceed 2Gb kPlankSz :=1024 {bytes/kb} * 1024 {bytes/mb} * kPlankMB; kVers := kVers + ' CacheMB = '+inttostr(kPlankMB); end; procedure TMainForm.ReadIniFile; var lFilename: string; lThreads: integer; lIniFile: TIniFile; begin lFilename := IniName; if not FileexistsEx(lFilename) then exit; lIniFile := TIniFile.Create(lFilename); ttestmenu.checked := IniBool(lIniFile,'computettest',true); //welchmenu.checked := IniBool(lIniFile,'computewelch',true); BMmenu.checked := IniBool(lIniFile,'computebm',false); gNULP := IniBool(lIniFile,'countlesionpatterns',false); gROI := IniBool(lIniFile,'ROI',false); kPlankMB := IniInt(lIniFile,'CacheMB',512); WritePermute(IniInt(lIniFile,'nPermute',0)); lThreads := IniInt(lIniFile,'nThread', gnCPUThreads ); if lThreads > gnCPUThreads then lThreads := gnCPUThreads; gnCPUThreads := lThreads; lIniFile.Free; end; //ReadIniFile procedure TMainForm.WriteIniFile; var lIniName: string; lIniFile: TIniFile; begin //showmessage('aaa'); lIniName := IniName; if (DiskFreeEx(lIniName) < 1) then exit; lIniFile := TIniFile.Create(lIniName); lIniFile.WriteString('BOOL', 'computettest',Bool2Char(ttestmenu.checked)); lIniFile.WriteString('BOOL', 'countlesionpatterns',Bool2Char(gNULP)); lIniFile.WriteString('BOOL', 'ROI',Bool2Char(gROI)); //lIniFile.WriteString('BOOL', 'computewelch',Bool2Char(welchmenu.checked)); lIniFile.WriteString('BOOL', 'computebm',Bool2Char(BMmenu.checked)); lIniFile.WriteString('INT', 'CacheMB',inttostr(kPlankMB)); lIniFile.WriteString('INT', 'nPermute',inttostr(ReadPermute)); lIniFile.WriteString('INT', 'nThread',inttostr(ReadThread)); lIniFile.Free; end; procedure TMainForm.FormCreate(Sender: TObject); begin {$IFDEF Darwin} File1.visible := false;//for OSX, exit is in the application's menu Edit1.visible := false;//clipboard note yet working for OSX {$ENDIF} {$IFDEF FPC} Application.ShowButtonGlyphs := sbgNever; {$ENDIF} gnCPUThreads := GetLogicalCpuCount; (*if (ssShift in KeyDataToShiftState(vk_Shift)) then begin case MessageDlg('Shift key down during launch: do you want to reset the default preferences?', mtConfirmation, [mbYes, mbNo], 0) of { produce the message dialog box } mrNo: ReadIniFile; end; //case end else *) if not ResetDefaults then ReadIniFile; WriteThread(gnCPUThreads); ComputePlankSize; ROIanalysis1.visible := gROI; {$IFDEF compileANACOM} AnaCOMmenu.visible := gROI; {$ENDIF} end; function TMainForm.MakeMean (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lBinarize,lVariance : boolean): boolean; label 667; var lOutName,lOutNameMod: string; lCountRA,lOutImgMn,lOutStDev,lPlankImg: SingleP; lTotalMemory: double; lPlank,lVolVox,lPos,lMinMask,lMaxMask,lnPlanks,lVoxPerPlank, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lPosPct: integer; lStDev: boolean; lT, lSum,lSumSqr,lSD, lMn,lTotalSum,lTotalN: double; lStatHdr: TNIfTIhdr; lFdata: file; begin result := false; if not SaveHdrName ('Output image', lOutName) then exit; if (not lVariance) and (not lBinarize) then lStDev := true else lStDev := false; if lStDev then lStDev := OKMsg('Create a standard deviation image as well as a mean image?'); Msg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lMinMask := 1; lMaxMask := lVolVox; lVoxPerPlank := kPlankSz div lImages.Count div sizeof(single) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; Msg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); Msg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); // fx(kPlankSz,8888); getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; Msg('Number of scans = '+inttostr(lImages.count)); Msg(' Index,Filename,Intercept,Slope'); if lBinarize then begin getmem(lCountRA,lImages.Count*sizeof(single)); for lPos := 1 to lImages.Count do begin gInterceptRA[lPos] := 0; gScaleRA[lPos] := 1; lCountRA^[lPos] := 0; end; end else begin for lPos := 1 to lImages.Count do begin Msg(' '+inttostr(lPos)+','+lImages[lPos-1]+','+realtostr(gInterceptRA[lPos],4)+','+realtostr(gScaleRA[lPos],4)); if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; end; end; lTotalSum := 0; lTotalN := 0; //createArray64(lObsp,lObs,lImages.Count); getmem(lOutImgMn,lVolVox* sizeof(single)); if lStDev then getmem(lOutStDev,lVolVox* sizeof(single)); for lPlank := 1 to lnPlanks do begin Msg('Computing plank = ' +Inttostr(lPlank)); Refresh; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image lPosPct := lVoxPerPlank div 100; for lPos2 := 1 to lVoxPerPlank do begin if (lPos2 mod lPosPct) = 0 then begin ProgressBar1.Position := round((lPos2/lVoxPerPlank)*100); Application.Processmessages; end; lPos2Offset := lPos2+lStartVox-1; lSum := 0; if lVariance then begin lSum := sqr(lPlankImg^[lPos2]-lPlankImg^[lVoxPerPlank+lPos2]);//actually variance... //% signal //if lPlankImg[lVoxPerPlank+lPos2] <> 0 then // lSum := lPlankImg[lPos2]/lPlankImg[lVoxPerPlank+lPos2] //else // lSum := 0;//pct signal... //end % signal lOutImgMn^[lPos2Offset] := lSum; lTotalSum := lTotalSum + lOutImgMn^[lPos2Offset]; lTotalN := lTotalN + 1; end else begin //not variance if lBinarize then begin for lPos := 1 to lImages.Count do if lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2] <> 0 then begin lSum := lSum+1; lCountRA^[lPos] := lCountRA^[lPos] + 1; end; end else for lPos := 1 to lImages.Count do lSum := lSum +(gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]; // fx(lPos, gScaleRA[lPos],gInterceptRA[lPos]); lOutImgMn^[lPos2Offset] := lSum/lImages.Count; if lStDev then begin //lSum := 0; //for lPos := 1 to lImages.Count do // lSum := lSum + (gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]; lSumSqr := 0; for lPos := 1 to lImages.Count do lSumSqr := lSumSqr + Sqr((gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]); lSD := (lSumSqr - ((Sqr(lSum))/lImages.Count)); if (lSD > 0) then lSD := Sqrt ( lSD/(lImages.Count-1)) else begin lSD := 0; (*if l1stError then begin for lPos := 1 to lImages.Count do Msg(floattostr( (gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos])); msg('---'); msg(floattostr(lSum)); msg(floattostr(lSumSqr)); l1stError := false; end;*) end; lOutStDev^[lPos2Offset] := lSD; end; end; //not variance if lSum > 0 then begin lTotalSum := lTotalSum + lOutImgMn^[lPos2Offset]; lTotalN := lTotalN + 1; end; end; lStartVox := lEndVox + 1; end; if lBinarize then begin for lPos := 1 to lImages.Count do begin Msg(' '+inttostr(lPos)+','+lImages[lPos-1]+','+inttostr(round(lCountRA^[lPos])) ); lCountRA^[lPos] := 0; end; freemem(lCountRA); end; //if binar //next: save data MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save mean if lVariance then lOutNameMod := ChangeFilePostfixExt(lOutName,'var','.hdr') else lOutNameMod := ChangeFilePostfixExt(lOutName,'Mean','.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgMn,1); freemem(lOutImgMn); if lStDev then begin lOutNameMod := ChangeFilePostfixExt(lOutName,'StDev','.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutStDev,1); freemem(lOutStDev); end; //freemem(lObsp); freemem(lPlankImg); Msg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes','.txt'); MsgSave(lOutNameMod); if (lTotalN > 0) then Msg('num voxels >0 = ' +inttostr(round(lTotalN))+' mean value for voxels >0: '+floattostr(lTotalSum/lTotalN)); ProgressBar1.Position := 0; exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 1 then freemem(lPlankImg); Msg('Unable to complete analysis.'); ProgressBar1.Position := 0; end; procedure TMainForm.Makemeanimage1Click(Sender: TObject); label 666; var lMaskVoxels: integer; lG: TStrings; lMaskname: string; lMaskHdr: TMRIcroHdr; begin MsgClear; Msg(GetKVers); if not OpenDialogExecute('Select images to average',true,true,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected lG:= TStringList.Create; lG.addstrings(OpenHdrDlg.Files); lMaskname := lG[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading '+lMaskName); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if not CheckVoxelsGroupX(lG,lMaskHdr {lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; Msg('Voxels = '+inttostr(lMaskVoxels)); MakeMean(lG,lMaskHdr, odd((Sender as TMenuItem).tag),false); 666: lG.Free; end; procedure TMainForm.Exit1Click(Sender: TObject); begin Close; end; function MinMax (var lImg: SingleP; var lVolVox: integer; var lMin, lMax: single): boolean; var lC: integer; begin result := false; if lVolVox < 1 then exit; lMax := lImg^[1]; for lC := 1 to lVolVox do if lImg^[lC] > lMax then lMax := lImg^[lC]; //lCx := lC; lMin := lImg^[1]; for lC := 1 to lVolVox do if lImg^[lC] < lMin then lMin := lImg^[lC]; result := true; end; function DetectMode (var lImg: SingleP; var lVolVox: integer; var lMin, lMax, lModeLo,lModeHi: single; lInflection: boolean): boolean; const kHistoBins = 255;//numbers of bins for histogram/image balance var lSmooth,lPrevSmooth,lModeWid,lC,lMinPos,lMode,lModePos,lMaxModePos,lMode2NotInflection: integer; lMod,lRng: single; lHisto : array [0..kHistoBins] of longint; begin result := false; if (lVolVox < 1) or (lMax < lMin) then exit; //zero array for lC := 1 to kHistoBins do lHisto[lC] := 0; //find scaling lRng := abs(lMax-lMin); if lRng > 0 then lMod := (kHistoBins)/lRng else lMod := 0; //fill histogram for lC := 1 to lVolVox do if lImg^[lC] <> 0 then inc(lHisto[round((lImg^[lC]-lMin)*lMod)]); {for lC := 1 to lVolVox do inc(lHisto[round((lImg^[lC]-lMin)*lMod)]); } //smooth histogram lPrevSmooth := lHisto[1]; for lC := 2 to (kHistoBins-1) do begin lSmooth := round( (lHisto[lC-1]+lHisto[lC]+lHisto[lC]+lHisto[lC+1])/4); lHisto[lC-1] := lPrevSmooth; lPrevSmooth := lSmooth; end; lHisto[kHistoBins-1] := lPrevSmooth; //find mode lMode := 0; lMinPos := 1;//indexed from zero //find highest peak for lC := lMinPos to kHistoBins do begin if lHisto[lC] > lMode then begin lModePos := lC; lMode := lHisto[lC]; end;//if new mode end; //for each bin if lMode > 0 then lMaxModePos := lModePos else exit; //find 2nd highest peak //find 2nd highest peak lModeWid := 25; lModePos := lMinPos; lMode := lHisto[lMinPos]; if (lMaxModePos - lModeWid) > lMinPos then begin for lC := lMinPos to (lMaxModePos - lModeWid) do begin if lHisto[lC] > lMode then begin lModePos := lC; lMode := lHisto[lC]; end;//if new mode end; //for each bin end; //check below highest peak if (lMaxModePos + lModeWid) < kHistoBins then begin for lC := (lMaxModePos + lModeWid) to kHistoBins do begin if lHisto[lC] > lMode then begin lModePos := lC; lMode := lHisto[lC]; end;//if new mode end; //for each bin end; //check above highest peak //fx(lModePos); //an alternative method to find mode is to look for inflection - less assumptions, more sensitive to noise if lInflection then begin lMode2NotInflection := lModePos; lModePos := lMinPos; lMode := 0; lC := lMaxModePos; while ((lC-1) > lMinPos) and (lHisto[lC] > lHisto[lC-1]) do dec(lC); //find inflection while ((lC-1) > lMinPos) do begin dec(lC); if lHisto[lC] > lMode then begin lModePos := lC; lMode := lHisto[lC]; end;//if new mode end; //look for mode lC := lMaxModePos; while ((lC+1) <= kHistoBins) and (lHisto[lC] > lHisto[lC+1]) do inc(lC); //find inflection while ((lC+1) <= kHistoBins) do begin inc(lC); if lHisto[lC] > lMode then begin lModePos := lC; lMode := lHisto[lC]; end;//if new mode end; //look for mode if abs(lMode2NotInflection-lModePos) > 3 then Showmessage('Warning: inflection and windowed algorithms find different 2nd modes. Using inflection 2nd mode. inflection ='+inttostr(lModePos)+' windowed: '+inttostr(lMode2NotInflection)); end; //now, return scaled values... if lMod = 0 then exit; lModeLo := (lModePos/lMod)+lMin; lModeHi := (lMaxModePos/lMod)+lMin; if lModeLo > lModeHi then begin lMod := lModeLo; lModeLo := lModeHi; lModeHi := lMod; end; result := true; end; procedure CopyFileEXoverwrite (lInName,lOutName: string); var lFSize: Integer; lBuff: bytep0; lFData: file; begin lFSize := FSize(lInName); if (lFSize < 1) then exit; assignfile(lFdata,lInName); filemode := 0; reset(lFdata,lFSize{1}); GetMem( lBuff, lFSize); BlockRead(lFdata, lBuff^, 1{lFSize}); closefile(lFdata); assignfile(lFdata,lOutName); filemode := 2; Rewrite(lFdata,lFSize); BlockWrite(lFdata,lBuff^, 1 {, NumWritten}); closefile(lFdata); freemem(lBuff); end; procedure CopyFileEX (lInName,lOutName: string); var lFSize: Integer; begin lFSize := FSize(lInName); if (lFSize < 1) or (fileexistsEX(lOutName)) then exit; CopyFileEXoverwrite (lInName,lOutName); end; function DetectMeanStDev (var lImg: SingleP; var lVolVox: integer; var lMean,lStDev: double): boolean; var lIncVox,lVox: integer; lSum,lSumSqr,lSE: double; begin lMean := 0; lStDev := 0; result := false; if (lVolVox < 1) then exit; lSum := 0; lSumSqr := 0; lIncVox := 0; //voxels included - e.g. not masked for lVox := 1 to lVolVox do begin if lImg^[lVox] <> 0 then begin //not in mask inc(lIncVox); lSum := lSum + lImg^[lVox]; lSumSqr := lSumSqr + sqr(lImg^[lVox]); end; end; if lincVox < 3 then exit; Descriptive (lincVox, lSumSqr, lSum,lMean,lStDev,lSE); result := true; end; //DetectMeanStDev //zero array function TMainForm.Balance (var lImageName,lMaskName: String; {lInflection: boolean}lMethod: integer): boolean; //0 = masked peak //1 = inflection //2 = mean =1, stdev=1 var lImg,lMaskImg: SingleP; lHdr,lMaskHdr: TMRIcroHdr; lVolVox,lVox,lMasked: integer; lMaskedInten,lMean,lStDev: double; lMin,lMax: single; lModeLo,lModeHi,lIntercept,lSlope: single; lOutNameMod: string; begin //lOutName := lMaskHdr.ImgFileName; result := false; //if not SaveHdrName ('Statistical Map', lOutName) then exit; if not NIFTIhdr_LoadHdr(lImageName,lHdr) then begin showmessage('Error reading '+lImageName); exit; end; lVolVox := lHdr.NIFTIhdr.dim[1]*lHdr.NIFTIhdr.dim[2]* lHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then exit; getmem(lImg,lVolVox*sizeof(single)); if not LoadImg(lHdr.ImgFileName, lImg, 1, lVolVox,round(lHdr.NIFTIhdr.vox_offset),1,lHdr.NIFTIhdr.datatype,lVolVox) then begin Msg('Unable to load ' +lHdr.ImgFileName); exit; end; if lMaskName <> '' then begin if not NIFTIhdr_LoadHdr(lMaskName,lMaskHdr) then begin showmessage('Error reading '+lMaskName); exit; end; if lVolVox <> (lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]) then begin showmessage('Mask and header must have identical dimensions '+lMaskName+ ' ' + lImageName); exit; end; getmem(lMaskImg,lVolVox*sizeof(single)); if not LoadImg(lMaskHdr.ImgFileName, lMaskImg, 1, lVolVox,round(lMaskHdr.NIFTIhdr.vox_offset),1,lMaskHdr.NIFTIhdr.datatype,lVolVox) then begin Msg('Unable to load mask ' +lMaskHdr.ImgFileName); exit; end; lMasked := 0; lMaskedInten := 0; for lVox := 1 to lVolVox do if lMaskImg^[lVox] = 0 then begin lMaskedInten := lMaskedInten + lImg^[lVox]; lImg^[lVox] := 0; inc(lMasked); end; if lMasked < 1 then Msg('Warning: no voxels masked with image '+lMaskName) else Msg('Mask='+ lMaskName+' Number of voxels masked= '+inttostr(lMasked)+' Mean unscaled intensity of masked voxels= '+floattostr(lMaskedInten/lMasked)); freemem(lMaskImg); end;//mask if not MinMax(lImg,lVolVox,lMin,lMax) then exit; Msg(lImageName+' -> '+lHdr.ImgFileName); Msg('min..max ' +floattostr(lMin)+'..'+floattostr(lMax)); if (lMethod = 0) or (lMethod = 1) then begin if not DetectMode(lImg,lVolVox,lMin,lMax,lModeLo,lModeHi, odd(lMethod)) then exit; if odd(lMethod) then Msg('method for finding second mode: inflection') else Msg('method for finding second mode: masked peak'); Msg('modes Lo Hi ' +floattostr(lModeLo)+'..'+floattostr(lModeHi)); if lModeLo >= lModeHi then exit; lSlope := 1/abs(lModeHi-lModeLo); lIntercept := (abs(lModeHi-lModeLo)-(lModeLo))*lSlope ; //make mode lo = 1; end else begin DetectMeanStDev (lImg, lVolVox, lMean,lStDev); if lStDev <>0 then lSlope := 1/lStDev else begin Msg('Warning: StDev = 0!!!!'); lSlope := 1; end; lIntercept := (-lMean*lSlope)+2; //mean voxel has intensity of zero Msg('method for intensity normalization: Mean = 2, StDev = 1'); Msg('raw_Mean = '+floattostr(lMean)+' '+' raw_StDev = '+floattostr(lStDev)); end; Msg('Slope/Intercept ' +floattostr(lSlope)+'..'+floattostr(lIntercept)); lHdr.NIFTIhdr.scl_slope := lSlope; lHdr.NIFTIhdr.scl_inter := lIntercept; //CopyFileEX(lHdr.HdrFilename,changefileext( lHdr.HdrFilename,'.hdx')); RenameFile(lHdr.HdrFilename,changefileext( lHdr.HdrFilename,'.hdx')); //optional - save input lOutNameMod := ChangeFilePrefixExt(lImageName,'i','.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lHdr.NIFTIhdr,true,not IsNifTiMagic(lHdr.NIFTIhdr),true,lImg,1); //end optional NIFTIhdr_SaveHdr(lHdr.HdrFilename,lHdr.NIFTIhdr,true,not IsNifTiMagic(lHdr.NIFTIhdr)); freemem(lImg); end; procedure TMainForm.Balance1Click(Sender: TObject); var lFilename,lMaskName: string; lPos: Integer; begin MsgClear; Msg(GetKVers); if not OpenDialogExecute('Select images for intensity normalization',true,false,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected if OpenHdrDlg.Files.Count < 1 then exit; lMaskName := ''; for lPos := 1 to OpenHdrDlg.Files.Count do begin lFilename := OpenHdrDlg.Files[lPos-1]; balance(lFilename,lMaskname,(Sender as TMenuItem).tag); end; end; procedure TMainForm.niiniigz1Click(Sender: TObject); var lFilename,lOutname,lPath,lName,lExt: string; lPos: Integer; begin MsgClear; Msg(GetKVers); if not OpenDialogExecute('Select images',true,false,kNIIFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected if OpenHdrDlg.Files.Count < 1 then exit; for lPos := 1 to OpenHdrDlg.Files.Count do begin lFilename := OpenHdrDlg.Files[lPos-1]; FilenameParts(lFilename,lPath,lName,lExt); lOutname := lPath+lName+'.nii.gz'; msg('Compressing '+ lFilename+' -> '+lOutname); GZipFile(lFilename, lOutname,false); end; msg('Compression completed'); end; procedure TMainForm.Variance1Click(Sender: TObject); label 666; var lMaskVoxels: integer; lG: TStrings; lMaskname: string; lMaskHdr: TMRIcroHdr; begin MsgClear; Msg(GetKVers); if not OpenDialogExecute('Select 2 images)',true,true,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected lG:= TStringList.Create; lG.addstrings(OpenHdrDlg.Files); if lG.count <> 2 then begin showmessage('You must select exactly two image.'); goto 666; end; lMaskname := lG[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if not CheckVoxelsGroupX(lG,lMaskHdr{lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; Msg('Voxels = '+inttostr(lMaskVoxels)); MakeMean(lG,lMaskHdr, odd((Sender as TMenuItem).tag),true); 666: lG.Free; end; procedure BMX; const kN = 53; knNoLesion = 48; kSymptomRA: array[1..kn] of single = (4,4.5,2.5,5,4,3.25,0.75,4.5,4.5,0.5,1.625,0,3.5,3,4,2,4.5,5,1.5,5,2.5,5,4,0,2, 1.5,1.75,2.5,5,0,3.25,4.375,0,3.75,0.25,0,2,5,0,0.5,0,2.25,0,2.25,2,0,0.25,0,0,0,0,0,0); var lObs: doublep0; lI: integer; lBMz,lBMzs,lDF: double; begin getmem(lObs,kN * sizeof(double)); for lI := 1 to kN do lObs^[lI-1] := kSymptomRA[lI]; tBM (kN, knNoLesion, lObs,lBMz,lDF); //simulate MainForm.NPMmsg('Generating BM permutation thresholds'); MainForm.Refresh; genBMsim (kN, lObs); lBMzs := BMzVal (kN, knNoLesion,lBMz,lDF); //end simulate MainForm.NPMmsg('BMsim= '+floattostr(lBMzs)+' '+'BM= '+floattostr(lBMz)+' '+floattostr(lDF) ); freemem(lObs); end; (*procedure SX; var lVALFilename {,lTemplateName}: string; lCritPct,lnSubj, lnFactors: integer; var lSymptomRA: singleP; var lImageNames: TStrings; var lCrit: integer; {lBinomial : boolean;} var lPredictorList: TStringList; begin lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? lVALFilename := 'c:\RT_norm.val';//MainForm.OpenHdrDlg.Filename; lPredictorList := TStringList.Create; GetValCore ( lVALFilename, lnSubj, lnFactors, lSymptomRA, lImageNames, lCrit,lCritPct{,binom},lPredictorList); lImageNames.Free; lPredictorList.Free; end;*) (*procedure ComputeR; var lStr: string; lT,lDF: double; begin inputquery('Enter value','Enter T score',lStr); lT := strtofloat(lStr); inputquery('Enter value','Enter DF',lStr); lDF := strtofloat(lStr); showmessage('The coresponding correlation Z score for t('+floattostr(lDF)+')='+floattostr(lT) +' is '+floattostr(TtoZ(lT,lDF) ) ); //showmessage('The coresponding correlation R score for t('+floattostr(lDF)+')='+floattostr(lT) +' is '+floattostr(TtoR(lT,lDF) ) ); end; function Log10x (lLogP: double): double; begin result := -Log10(lLogP); fx(result); end; procedure LogPtoZ (lLogP: double); var lD,lZ: double; begin ///lD := Log10(lLogp); lD := Power(10,-lLogP); lZ := pNormalInv(lD); fx(lD,lZ); end; *) procedure TMainForm.About1Click(Sender: TObject); begin //Masked1Click(nil); exit; //LogPtoZ (Log10x(0.02)); //LogPtoZ(1.699); //ComputeR; showmessage(GetkVers ); end; procedure TMainForm.Design1Click(Sender: TObject); begin {$IFDEF SPREADSHEET} SpreadForm.Show; {$ELSE} Showmessage('Spreadsheet not yet supported on the Operating System');{$ENDIF} end; procedure TMainForm.StrToMemo(lStr: String); var lLen,lPos: integer; lOutStr: string; begin lLen := length(lStr); if lLen < 1 then exit; lOutStr := ''; for lPos := 1 to lLen do begin if lStr[lPos] = kCR then begin Msg(lOutStr); lOutStr := ''; end else lOutStr := lOutStr + lStr[lPos]; end; if lOutStr <> '' then Msg(lOutStr); end; procedure TMainForm.PhysiologicalArtifactCorrection1Click(Sender: TObject); var lInImgName,lPulsFile,lRespFile,lOutImgName,lStr: string; l4Ddata: singlep; lHdr: TMRIcroHdr; lDim,lImgVox: integer; lOutHdr: TniftiHdr; begin if not OpenDialogExecute('Select file with pulse onsets',false,false,'Siemens physio |*.puls|3-column text |*.txt') then exit; lPulsFile := OpenHdrDlg.Filename; if UpCaseExt(lPulsFile) = '.PULS' then lRespFile := changefileext(lPulsFile,'.resp') else begin //text input if not OpenDialogExecute('Select file with respiration onsets',false,false,'3-column text |*.txt') then lRespFile := '' else lRespFile := OpenHdrDlg.Filename; end; if not OpenDialogExecute('Select 4D motion corrected data ',false,false,kImgFilter) then exit; lInImgName := OpenHdrDlg.Filename; if not NIFTIhdr_LoadHdr(lInImgName,lHdr) then begin showmessage('Error reading image header.'); exit; end; for lDim := 1 to 4 do if lHdr.NIFTIhdr.Dim[lDim] < 4 then begin Showmessage('You need to select a 4D image with at least 4 voxels/images in each dimension.'); exit; end; lImgVox := lHdr.NIFTIhdr.Dim[1]*lHdr.NIFTIhdr.Dim[2]*lHdr.NIFTIhdr.Dim[3]; lDim := lImgVox*lHdr.NIFTIhdr.Dim[4]; MsgClear; Msg(kVers); Msg('Physiological Artifact Removal Tool started = ' +TimeToStr(Now)); Msg('Assuming continuous fMRI ascending acquisition with TR = '+realtostr(lHdr.NIFTIhdr.PixDim[4],4)+'sec'); MainForm.refresh; getmem(l4Ddata,lDim*sizeof(single)); if not LoadImg(lHdr.ImgFileName, l4Ddata, 1, lDim,round(lHdr.NIFTIhdr.vox_offset),1,lHdr.NIFTIhdr.datatype,lImgVox) then begin Showmessage('Unable to load data'); freemem(l4Ddata); exit; end; lStr := ApplyPART( lPulsFile,l4Ddata,40, lImgVox,lHdr.NIFTIhdr.Dim[3], lHdr.NIFTIhdr.Dim[4], lHdr.NIFTIhdr.PixDim[4]); if lStr = '' then begin Showmessage('Unable to apply physio file. Physiological correction is being aborted.'); exit; end; StrToMemo (lStr); if (lRespFile <> '') and (fileexists(lRespFile)) then begin lStr := ApplyPART( lRespFile,l4Ddata,20, lImgVox,lHdr.NIFTIhdr.Dim[3], lHdr.NIFTIhdr.Dim[4], lHdr.NIFTIhdr.PixDim[4]); StrToMemo (lStr); if lStr = '' then begin Showmessage('Unable to read Respiration file. Hysiological correction is being aborted.'); exit; end; end; MakeHdr (lHdr.NIFTIhdr,lOutHdr); Msg('Input = ' +lInImgName); lOutImgName := ChangeFilePrefixExt(lInImgName,'i','.hdr'); NIFTIhdr_SaveHdrImg(lOutImgName,lOutHdr,true,not IsNifTiMagic(lHdr.NIFTIhdr),true,l4Ddata,lHdr.NIFTIhdr.Dim[4]); Msg('Output = ' +lOutImgName); Msg('Physiological Artifact Removal Tool finished = ' +TimeToStr(Now)); lOutImgName := ChangeFilePostfixExt(lOutImgName,'Notes','.txt'); MsgSave(lOutImgName); freemem(l4Ddata); end; function ChangeName (lInName: string): string; var lPath,lName,lExt: string; begin //lInName:= 'c:\vbm\ds\123'; FilenameParts (lInName, lPath,lName,lExt); //showmessage(lPath+'*'+lName+'*'+lExt); if length(lName) > 0 then lName[1] := 'e' else lName := 'Unable to convert '+lInName; result := lPath+lName+lExt; end; function Add2ndScans(var lImageNames: TStrings): boolean; var lnSubj,lSubj: integer; lFilename: string; begin result := false; lnSubj :=lImageNames.Count; if lnSubj < 1 then exit; for lSubj := 1 to lnSubj do begin lFilename := ChangeName(lImageNames[lSubj-1]); if not (fileexists4D(lFilename)) then begin showmessage('Unable to find a file named '+ lFilename); exit; end; lImageNames.add(lFilename); end; result := true; end; function ReadPairedFilenames(var lImageNames: TStrings): boolean; var lLen,lPos: integer; lFilenames,lF1,lF2: string; lImageNames2: TStrings; lF: TextFile; begin result := false; Showmessage('Please select a text file with the image names. '+kCR+ 'Each line of the file should specify the control and experimental filenames, separated by an *'+kCR+ 'C:\vbmdata\c1.nii.gz*C:\vbmdata\e1.nii.gz'+kCR + 'C:\vbmdata\c2.nii.gz*C:\vbmdata\e2.nii.gz'+kCR+ 'C:\vbmdata\c3.nii.gz*C:\vbmdata\e3.nii.gz'+kCR+ '...' ); if not MainForm.OpenDialogExecute('Select asterix separated filenames ',false,false,kTxtFilter) then exit; lImageNames2:= TStringList.Create; //not sure why TStrings.Create does not work??? //xxx assignfile(lF,MainForm.OpenHdrDlg.FileName ); FileMode := 0; //read only reset(lF); while not EOF(lF) do begin readln(lF,lFilenames); lLen := length(lFilenames); if lLen > 0 then begin lF1:= ''; lF2 := ''; lPos := 1; while (lPos <= lLen) and (lFilenames[lPos] <> '*') do begin lF1 := lF1 + lFilenames[lPos]; inc(lPos); end; inc(lPos); while (lPos <= lLen) do begin lF2 := lF2 + lFilenames[lPos]; inc(lPos); end; if (length(lF1) > 0) and (length(lF2)>0) then begin if Fileexists4D(lF1) then begin if Fileexists4D(lF2) then begin lImageNames.add(lF1); lImageNames2.add(lF2); end else //F2exists showmessage('Can not find image '+lF2); end else //F1 exists showmessage('Can not find image '+lF1); end; end;//len>0 end; //while not EOF closefile(lF); FileMode := 2; //read/write if (lImageNames.count > 0) and (lImageNames2.count = lImageNames.count) then begin lImageNames.AddStrings(lImageNames2); result := true; end; lImageNames2.Free; end; function AddNumStr(var X : PMatrix; var lNumStr: string; lRow,lCol: integer):boolean; var lTempFloat: double; begin result := false; if (lNumStr = '') or (lRow < 1) or (lCol < 1) then exit; try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin showmessage('Empty cells? Error reading TXT file row:'+inttostr(lRow)+' col:'+inttostr(lCol)+' - Unable to convert the string '+lNumStr+' to a number'); exit; end; end; //fx(lRow,lCol,lTempFloat); X^[lCol]^[lRow] := lTempFloat; lNumStr := ''; result := true; end; {$DEFINE notRTEST} function ReadPairedFilenamesReg(var lImageNames: TStrings; var X : PMatrix; var lnAdditionalFactors: integer): boolean; var lLen,lPos,lSep,lMaxSep,lLine: integer; lFilenames,lF1,lF2,lNumStr: string; lImageNames2: TStrings; lF: TextFile; begin result := false; {$IFDEF RTEST} MainForm.OpenHdrDlg.FileName := 'c:\twins\dataplus.txt'; {$ELSE} Showmessage('Please select a text file with the image names. '+kCR+ 'Each line of the file should specify the control and experimental filenames, separated by an *'+kCR+ 'C:\vbmdata\c1.nii.gz*C:\vbmdata\e1.nii.gz'+kCR + 'C:\vbmdata\c2.nii.gz*C:\vbmdata\e2.nii.gz'+kCR+ 'C:\vbmdata\c3.nii.gz*C:\vbmdata\e3.nii.gz'+kCR+ '...' ); if not MainForm.OpenDialogExecute('Select asterix separated filenames ',false,false,kTxtFilter) then exit; {$ENDIF} lImageNames2:= TStringList.Create; //not sure why TStrings.Create does not work??? //xxx assignfile(lF,MainForm.OpenHdrDlg.FileName ); FileMode := 0; //read only reset(lF); while not EOF(lF) do begin readln(lF,lFilenames); lLen := length(lFilenames); if lLen > 0 then begin lF1:= ''; lF2 := ''; lPos := 1; while (lPos <= lLen) and (lFilenames[lPos] <> '*') do begin lF1 := lF1 + lFilenames[lPos]; inc(lPos); end; inc(lPos); while (lPos <= lLen) and (lFilenames[lPos] <> '*') do begin lF2 := lF2 + lFilenames[lPos]; inc(lPos); end; if (length(lF1) > 0) and (length(lF2)>0) then begin if Fileexists4D(lF1) then begin if Fileexists4D(lF2) then begin lImageNames.add(lF1); lImageNames2.add(lF2); end else //F2exists showmessage('Can not find image '+lF2); end else //F1 exists showmessage('Can not find image '+lF1); end; end;//len>0 end; //while not EOF //fx(lImageNames.count); //next - count additional factors lnAdditionalFactors := 0; reset(lF); lMaxSep := 0; while not EOF(lF) do begin readln(lF,lFilenames); lLen := length(lFilenames); lSep := 0; if lLen > 0 then begin for lPos := 1 to lLen do if lFilenames[lPos] = '*' then inc(lSep) end;//len>0 if lSep > lMaxSep then lMaxSep := lSep; end; //while not EOF if (lMaxSep > 1) and (lImageNames2.count > 1) then begin //additional factors present //final pas - load additional factors lnAdditionalFactors := lMaxSep - 1; DimMatrix(X, lnAdditionalFactors, lImageNames2.count); reset(lF); lLine := 0; while not EOF(lF) do begin readln(lF,lFilenames); lLen := length(lFilenames); lSep := 0; if lLen > 0 then begin inc(lLine); lPos := 1; lNumStr := ''; while lPos <= lLen do begin if (lFilenames[lPos] = '*') then begin AddNumStr(X,lNumStr,lLine,lSep-1); inc(lSep); end else if (lSep >= 2) and (not (lFilenames[lPos] in [#10,#13,#9]) ) then begin lNumStr := lNumStr+lFilenames[lPos]; //showmessage(lNumStr); end; inc(lPos); end; //while not EOLN AddNumStr(X,lNumStr,lLine,lSep-1); end;//len>0 end; //while not EOF //next - read final line of unterminated string... end;//maxsepa > 1 //2nd pass vals closefile(lF); FileMode := 2; //read/write if (lImageNames.count > 0) and (lImageNames2.count = lImageNames.count) then begin lImageNames.AddStrings(lImageNames2); result := true; end; lImageNames2.Free; result := true; end; procedure TMainForm.DualImageCorrelation1Click(Sender: TObject); label 666; var lnSubj,lSubj,lMaskVoxels,lnAdditionalFactors,lI: integer; lImageNames: TStrings; X: PMatrix; lMaskname,lStr,lOutName: string; lMaskHdr: TMRIcroHdr; begin lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? MsgClear; Msg(kVers); {$IFDEF RTEST} OpenHdrDlg.FileName := 'c:\twins\aameanMean.hdr'; {$ELSE} Msg('Dual-image Linear Regression [Weighted Least Squares]'); if not OpenDialogExecute('Select brain mask ',false,false,kImgFilter) then begin showmessage('NPM aborted: mask selection failed.'); goto 666; end; //if not selected {$ENDIF} lMaskname := OpenHdrDlg.Filename; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading Mask image.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; if not ReadPairedFilenamesReg(lImageNames,X,lnAdditionalFactors) then exit; lnSubj :=lImageNames.Count div 2; //fx(lnAdditionalFactors); //show matrix //MsgStrings (lImageNames); Msg ('n Subjects = '+inttostr(lnSubj)); for lSubj := 0 to (lnSubj-1) do begin lStr := lImageNames[lSubj]+' <-> '+lImageNames[lSubj+lnSubj]; if lnAdditionalFactors > 0 then for lI := 1 to lnAdditionalFactors do lStr := lStr+','+floattostr(X^[lI]^[lSubj+1]); Msg(lStr); end; if not CheckVoxelsGroupX(lImageNames,lMaskHdr{lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; Msg('Mask = '+lMaskname); Msg('Total voxels = '+inttostr(lMaskVoxels)); Msg('Number of observations = '+inttostr(lnSubj)); (*if not CheckVoxelsGroupX(lImageNames,lMaskHdr{lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end;*) if lnSubj < 5 then begin showmessage('Paired regression error: Requires at least 5 images per group.'); goto 666; end; lOutName := lMaskName; if not SaveHdrName ('Base Statistical Map', lOutName) then exit; //showmessage('Unimplemented Regress');// Regress2NPMAnalyze (lImageNames, lMaskHdr, lOutname,X,lnAdditionalFactors); if lnAdditionalFactors > 1 then DelMatrix(X, lnAdditionalFactors, lnSubj); 666: lImageNames.Free; end; procedure TMainForm.LesionBtnClick(Sender: TObject); label 666; var lPrefs: TLDMPrefs ; begin lPrefs.NULP := gNULP; if (1= (Sender as tMenuItem).tag) then begin //continuous lPrefs.BMtest := BMmenu.checked; lPrefs.Ttest := ttestmenu.checked; if (not lPrefs.BMtest) and (not lPrefs.ttest) then lPrefs.ttest := true; lPrefs.Ltest:= false; end else begin //binomial lPrefs.BMtest := false; lPrefs.Ttest := false; lPrefs.Ltest:= true; end; lPrefs.CritPct := -1; lPrefs.nPermute := ReadPermute; lPrefs.Run := 0;{0 except for montecarlo} {if (not lPrefs.Ltest) and (not lPrefs.Ttest) and (not lPrefs.BMtest) then begin Showmessage('Error: you need to compute at least on test [options/test menu]'); exit; end; code above defaults to t-test} if not MainForm.OpenDialogExecute('Select MRIcron VAL file',false,false,'MRIcron VAL (*.val)|*.val') then begin showmessage('NPM aborted: VAL file selection failed.'); exit; end; //if not selected lPrefs.VALFilename := MainForm.OpenHdrDlg.Filename; lPrefs.OutName := ExtractFileDirWithPathDelim(lPrefs.VALFilename)+'results'; lPrefs.OutName := lPrefs.OutName+'.nii.gz'; SaveHdrDlg.Filename := lPrefs.Outname; if not SaveHdrName ('Base Statistical Map', lPrefs.OutName) then exit; //Explicit mask if not OpenDialogExecute('Select explicit mask [optional]',false,false,kImgPlusVOIFilter) then lPrefs.ExplicitMaskName := '' else lPrefs.ExplicitMaskName := OpenHdrDlg.FileName; DoLesion (lPrefs); //Prefs.pas end; procedure TMainForm.FormShow(Sender: TObject); begin MsgClear; Msg(GetkVers); {$IFNDEF UNIX} {GUILaunch;}{$ENDIF} LongTimeFormat := 'YYYY-MMM-DD hh:nn:ss'; //delphi TimeToStr ShortTimeFormat := 'YYYY-MMM-DD hh:nn:ss'; //freepascal TimeToStr //stax; //MakeGZ; //{x$IFNDEF UNIX} Threads1.visible := false;{x$ENDIF}//Windows can read actual CPU count //TestMultReg; //SingleRegressClick(nil); //DualImageCorrelation1Click(nil); //AnaCOM1Click(nil); //msg(floattostr(pNormalInv(1/20000))); //msg(floattostr(pNormalInv(0.01667))); //msg(floattostr(pNormalInv(0.05/51700))); //msg(floattostr(0.05/pNormal(4.76 ))); {$IFNDEF UNIX} ReadParamStr; {$ENDIF} //FX(rocA(0.2,0.4),AUC(0.7,0.4),rocA(0.4,0.7),AUC(0.4,0.7) ); //LesionX; {$IFDEF benchmark} MonteCarloSimulation1.visible := true; // LesionMonteCarlo (false,true,true); {$ENDIF} end; procedure TMainForm.PairedTMenuClick(Sender: TObject); label 666; var lnSubj,lSubj,lMaskVoxels: integer; lImageNames: TStrings; lMaskname,lStr,lOutName: string; lMaskHdr: TMRIcroHdr; begin lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? MsgClear; Msg(kVers); Msg('Paired T-test [Repeated Measures]'); if not OpenDialogExecute('Select brain mask ',false,false,kImgFilter) then begin showmessage('NPM aborted: mask selection failed.'); goto 666; end; //if not selected //OpenHdrDlg.FileName := 'c:\vbmdata\mask50.nii.gz'; lMaskname := OpenHdrDlg.Filename; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading Mask image.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; if not ReadPairedFilenames(lImageNames) then exit; lnSubj :=lImageNames.Count div 2; if not CheckVoxelsGroupX(lImageNames,lMaskHdr{lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; Msg('Mask = '+lMaskname); Msg('Total voxels = '+inttostr(lMaskVoxels)); Msg('Number of observations = '+inttostr(lnSubj)); Msg('Degrees of Freedom = '+inttostr(lnSubj-1)); if not CheckVoxelsGroupX(lImageNames,lMaskHdr{lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; //show matrix //MsgStrings (lImageNames); Msg ('n Subjects = '+inttostr(lnSubj)); lStr := 'Image,'; for lSubj := 0 to (lnSubj-1) do Msg(lImageNames[lSubj]+' <-> '+lImageNames[lSubj+lnSubj]); if lnSubj < 4 then begin showmessage('Paired t-test error: Requires at least 4 images per group.'); goto 666; end; lOutName := lMaskName; //if not SaveHdrName ('Base Statistical Map', lOutName) then exit; NPMAnalyzePaired (lImageNames, lMaskHdr, lMaskVoxels); //Regress2NPMAnalyze (lImageNames, lMaskHdr, lOutname); 666: lImageNames.Free; end; function TMainForm.NPMzscore (var lImages: TStrings; var lMnHdr,lStDevHdr: TMRIcroHdr): boolean; label 667; var lOutNameMod: string; lMnImg,lStDevImg,lSubjImg,lOutImg: SingleP; lVal: single; lSubj,lPos,lVolVox: integer; lStatHdr: TNIfTIhdr; begin result := false; //lOutName := lMnHdr.ImgFileName; //if not SaveHdrName ('Statistical Map', lOutName) then exit; Msg('Analysis began = ' +TimeToStr(Now)); lVolVox := lMnHdr.NIFTIhdr.dim[1]*lMnHdr.NIFTIhdr.dim[2]* lMnHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; //load mask for lPos := 0 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; if gScaleRA[kMaxImages] = 0 then gScaleRA[kMaxImages] := 1; getmem(lMnImg,lVolVox*sizeof(single)); if not LoadImg(lMnHdr.ImgFileName, lMnImg, 1, lVolVox,round(gOffsetRA[0]),1,lMnHdr.NIFTIhdr.datatype,lVolVox) then begin Msg('Unable to load mean ' +lMnHdr.ImgFileName); goto 667; end; //load StDev getmem(lStDevImg,lVolVox*sizeof(single)); if not LoadImg(lStDevHdr.ImgFileName, lStDevImg, 1, lVolVox,round(gOffsetRA[kMaxImages]),1,lStDevHdr.NIFTIhdr.datatype,lVolVox) then begin Msg('Unable to load StDev ' +lStDevHdr.ImgFileName); goto 667; end; getmem(lOutImg,lVolVox* sizeof(single)); for lPos := 1 to lVolVox do begin lMnImg^[lPos] := (gScaleRA[0]*lMnImg^[lPos])+gInterceptRA[0]; lStDevImg^[lPos] := (gScaleRA[kMaxImages]*lStDevImg^[lPos])+gInterceptRA[kMaxImages]; if lStDevImg^[lPos] = 0 then lOutImg^[lPos] := 0; end; getmem(lSubjImg,lVolVox* sizeof(single)); for lSubj := 1 to lImages.Count do begin ProgressBar1.Position := round((lSubj/lImages.Count)*100); Msg( lImages.Strings[lSubj-1]); showmessage(inttostr(round(gOffsetRA[lSubj]))); LoadImg(lImages.Strings[lSubj-1], lSubjImg, 1, lVolVox,round(gOffsetRA[lSubj]),1,gDataTypeRA[lSubj],lVolVox); for lPos := 1 to lVolVox do begin if lStDevImg^[lPos] <> 0 then begin lVal := (gScaleRA[lSubj]*lSubjImg^[lPos])+gInterceptRA[lSubj]; lOutImg^[lPos] := (lVal-lMnImg^[lPos])/lStDevImg^[lPos]; end; //for each voxel with variance end; //for each voxel lOutNameMod := ChangeFilePostfixExt(lImages.Strings[lSubj-1],'Z','.hdr'); MakeStatHdr (lMnHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lVolVox,kNIFTI_INTENT_ZSCORE,inttostr(lVolVox) ); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMnHdr.NIFTIhdr),true,lOutImg,1); end; //for each subj freemem(lSubjImg); freemem(lOutImg); freemem(lMnImg); freemem(lStDevImg); Msg('Analysis finished = ' +TimeToStr(Now)); ProgressBar1.Position := 0; result := true; exit; 667: //you only get here if you aborted ... free memory and report error if lVolVox > 1 then freemem(lMnImg); Msg('Unable to complete analysis.'); ProgressBar1.Position := 0; end; procedure TMainForm.SingleSubjectZScores1Click(Sender: TObject); label 666; var lnSubj,lMnVoxels: integer; lG: TStrings; lMn,lStDev: string; lMnHdr,lStDevHdr: TMRIcroHdr; begin if (not ttestmenu.checked) and (not BMmenu.checked) then begin Showmessage('Error: you need to compute at least on test [options/test menu]'); exit; end; MsgClear; Msg(kVers); Msg('Threads: '+inttostr(gnCPUThreads)); if not OpenDialogExecute('Select mean image ',false,false,kImgFilter) then begin showmessage('NPM aborted: mean selection failed.'); exit; end; //if not selected lMn := OpenHdrDlg.Filename; if not NIFTIhdr_LoadHdr(lMn,lMnHdr) then begin showmessage('Error reading mask.'); exit; end; lMnVoxels := ComputeImageDataBytes8bpp(lMnHdr); if (lMnVoxels < 2) or (not CheckVoxels(lMn,lMnVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mean file size too small.'); exit; end; if not OpenDialogExecute('Select StDev image ',false,false,kImgFilter) then begin showmessage('NPM aborted: StDev selection failed.'); exit; end; //if not selected lStDev := OpenHdrDlg.Filename; if not NIFTIhdr_LoadHdr(lStDev,lStDevHdr) then begin showmessage('Error reading StDev.'); exit; end; if not CheckVoxels(lStDev, lMnVoxels,kMaxImages) then begin showmessage('Error Mean and StDev must have same size.'); exit; end; Msg('Mean name = '+ lMn); Msg('Total voxels = '+inttostr(lMnVoxels)); //next, get 1st group if not OpenDialogExecute('Select postive group (Z scores positive if this group is brighter)',true,false,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected lG:= TStringList.Create; //not sure why TStrings.Create does not work??? lG.addstrings(OpenHdrDlg.Files); lnSubj :=OpenHdrDlg.Files.Count; Msg('Subjects= '+inttostr(lnSubj)); if not CheckVoxelsGroupX(lG,lMnHdr {lMnVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; NPMzscore (lG, lMnHdr,lStDevHdr); //NPMAnalyze(lG,lMnHdr,lMnVoxels,lnSubj); 666: lG.Free; end; procedure TMainForm.MultipleRegressClick(Sender: TObject); label 666; var lnFactors,lnSubj,lMaskVoxels,lRow,lCol: integer; lImageNames: TStrings; lPredictorList: TStringList; lTemp4D,lMaskname,lStr,lOutName: string; lMaskHdr: TMRIcroHdr; X : PMatrix; begin {$IFDEF FPC} showmessage('Regression routines not extensively tested: you may want to use the Windows compilation.'); {$ENDIF} lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? lPredictorList := TStringList.Create; Memo1.Lines.Clear; Memo1.Lines.Add(kVers); Memo1.Lines.Add('Multiple Linear Regression [Weighted Least Squares]'); if not GetValReg(lnSubj,lnFactors,X,lImageNames,lPredictorList) then goto 666; lTemp4D := CreateDecompressed4D(lImageNames); if not OpenDialogExecute('Select brain mask ',false,false,kImgFilter) then begin showmessage('NPM aborted: mask selection failed.'); goto 666; end; //if not selected lMaskname := OpenHdrDlg.Filename; //lMaskname := lImageNames[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st image.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; Memo1.Lines.Add('Mask = '+lMaskname); Memo1.Lines.Add('Total voxels = '+inttostr(lMaskVoxels)); Memo1.Lines.Add('Number of observations = '+inttostr(lnSubj)); if not CheckVoxelsGroupX(lImageNames,lMaskHdr {lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; //show matrix lStr := 'Image,'; for lCol := 1 to lnFactors do lStr := lStr + lPredictorList.Strings[lCol-1]+', '; MainForm.Memo1.Lines.Add(lStr); for lRow := 1 to lnSubj do begin lStr := lImageNames[lRow-1]+','; for lCol := 1 to lnFactors do lStr := lStr + floattostr(X^[lCol]^[lRow])+', '; MainForm.Memo1.Lines.Add(lStr); end; lOutName := lMaskName; if not SaveHdrName ('Base Statistical Map', lOutName) then exit; ARegressNPMAnalyze(lImageNames,lMaskHdr,X,lnFactors,lPredictorList,lOutName); DelMatrix(X, lnFactors, lnSubj); 666: lImageNames.Free; lPredictorList.Free; DeleteDecompressed4D(lTemp4D); end; {$DEFINE notRegTest} procedure TMainForm.SingleRegressClick(Sender: TObject); label 666; var lnSubj1,lnFactors,lnSubj,lMaskVoxels,lRow,lCol: integer; lImageNames,lImageNames1: TStrings; lPredictorList,lPredictorList1: TStringList; lTemp4D,lMaskname,lOutName: string; lMaskHdr: TMRIcroHdr; X,X1 : PMatrix; begin {$IFDEF FPC} showmessage('Regression routines not extensively tested: you may want to use the Windows compilation.'); {$ENDIF} lTemp4D := ''; lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? lPredictorList := TStringList.Create; lPredictorList1 := TStringList.Create; if not GetValReg(lnSubj,lnFactors,X,lImageNames,lPredictorList) then goto 666; {$IFDEF regtest} lMaskname := 'C:\Documents and Settings\Chris Rorden\Desktop\npmdata\npmdata\amask50.nii.gz'; {$ELSE} if not OpenDialogExecute('Select brain mask ',false,false,kImgFilter) then begin showmessage('NPM aborted: mask selection failed.'); goto 666; end; //if not selected lMaskname := OpenHdrDlg.Filename; {$ENDIF} if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st image.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; if not CheckVoxelsGroupX(lImageNames,lMaskHdr{lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; lOutName := lMaskName; {$IFNDEF regtest} if not SaveHdrName ('Base Statistical Map', lOutName) then goto 666; {$ENDIF} lTemp4D := CreateDecompressed4D(lImageNames); lImageNames1:= TStringList.Create; for lCol := 1 to lnFactors do begin lPredictorList1.Clear; lPredictorList1.Add(lPredictorList[lCol-1]); lImageNames1.clear; for lRow := 1 to lnSubj do if X^[lCol]^[lRow] <> kNaN then lImageNames1.Add(lImageNames[lRow-1]); DimMatrix(X1, 1, lImageNames1.Count); lnSubj1 := 0; for lRow := 1 to lnSubj do if X^[lCol]^[lRow] <> kNaN then begin inc(lnSubj1); X1^[1]^[lnSubj1] := X^[lCol]^[lRow]; end; if lnSubj1 <> lImageNames1.Count then //should be impossible showmessage('serious error'); Memo1.Lines.Clear; Memo1.Lines.Add(kVers); Memo1.Lines.Add('Single Linear Regression [Weighted Least Squares]'); Memo1.Lines.Add('Mask = '+lMaskname); Memo1.Lines.Add('Total voxels = '+inttostr(lMaskVoxels)); Memo1.Lines.Add('Number of observations = '+inttostr(lnSubj1)); MainForm.Memo1.Lines.Add('Image,'+ lPredictorList1.Strings[0]); for lRow := 1 to lnSubj1 do MainForm.Memo1.Lines.Add(lImageNames1[lRow-1]+','+floattostr(X1^[1]^[lRow]) ) ; ARegressNPMAnalyze(lImageNames1,lMaskHdr,X1,1,lPredictorList1,lOutName); DelMatrix(X1, 1, lnSubj1); end; lImageNames1.Free; DelMatrix(X, lnFactors, lnSubj); 666: DeleteDecompressed4D(lTemp4D); lImageNames.Free; lPredictorList.Free; lPredictorList1.Free; end; procedure TMainForm.AssociatevalfileswithNPM1Click(Sender: TObject); begin {$IFDEF FPC} //unsupported by FreePascal {$ELSE} case MessageDlg('NPM installation:'+kCR+'Do you want .val fiels to automatically open NPM when you double click on their icons?', mtConfirmation, [mbYes, mbNo], 0) of { produce the message dialog box } id_No: exit; end; registerfiletype(kVALNativeExt,'NPM'{key},'NPM',Application.ExeName+',1'); {$ENDIF} end; procedure TMainForm.threadChange(Sender: TObject); begin (sender as tmenuitem).checked := true; ReadThread; end; procedure TMainForm.Countlesionoverlaps1Click(Sender: TObject); label 666; var lReps,lMax,lInc,lMaskVoxels,lDefault,lTotal,lPct: integer; lG: TStrings; lMaskname: string; lMaskHdr: TMRIcroHdr; begin MsgClear; Msg(kVers); if not OpenDialogExecute('Select images to overlap',true,false,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected if MainForm.OpenHdrDlg.Files.Count < 2 then begin lTotal := NIFTIhdr_HdrVolumes(MainForm.OpenHdrDlg.Filename); if lTotal < 2 then begin Showmessage('Error: This function is designed to overlay MULTIPLE volumes. You selected less than two images.'); exit; end; lG:= TStringList.Create; for lReps := 1 to lTotal do lG.Add(MainForm.OpenHdrDlg.Filename+':'+inttostr(lReps) ); end else begin lG:= TStringList.Create; lG.addstrings(OpenHdrDlg.Files); end; lMaskname := lG[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if not CheckVoxelsGroupX(lG,lMaskHdr{lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; lTotal := lG.Count; if lTotal > kMaxObs then lTotal := kMaxObs; //this implemmentation uses 126 bits per voxel - we can not test more than this! if lTotal > 100 then lDefault := 100 else lDefault := lTotal; lMax := ReadIntForm.GetInt('Enter maximum number of overlaps to test ', 3,lDefault,lTotal); lDefault := lMax div 10; if lDefault < 1 then lDefault := 1; lInc := ReadIntForm.GetInt('Enter overlap increment (e.g. if 5; then 5, 10, 15...) ', 1,lDefault,lMax); lReps := ReadIntForm.GetInt('Enter number of times each increment is tested ', 1,10,100); lPct := ReadIntForm.GetInt('Only include voxels damaged in N% of patients ', 0,5,100); Msg('Voxels = '+inttostr(lMaskVoxels)); Msg('Scans to permute = '+inttostr(lG.count)); EvaluatePower (lG,lInc,lMax,lReps,lPct); //MakeMean(lG,lMaskHdr, odd((Sender as TMenuItem).tag),false); 666: lG.Free; end; {$DEFINE SINGLETHREAD} {$DEFINE NOTHREAD} function TMainForm.FirthNPMAnalyze (var lImages: TStrings; var lPredictorList: TStringList; var lMaskHdr: TMRIcroHdr; lnCond,lnCrit: integer; var lSymptomRA: SingleP; var lOutName: string): boolean; label 123,667; var lOutNameMod: string; lPlankImg: bytep; lOutImgSum : singleP; lOutImg: SingleRAp; {$IFDEF SINGLETHREAD}lnCPUThreads,{$ENDIF} lCond,lPos,lPlank,lThread,lnDeficit: integer; lTotalMemory,lVolVox,lMinMask,lMaxMask,lnPlanks,lVoxPerPlank, lThreadStart,lThreadInc,lThreadEnd, lnLesion,lnPermute, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lPosPct: int64; lT, lSum: double; lObsp: pointer; lObs: Doublep0; lStatHdr: TNIfTIhdr; lFdata: file; lRanOrderp: pointer; lRanOrder: Doublep0; begin if lnCond < 1 then exit; lnPermute := ReadPermute; if lnPermute > 1 then begin Msg('NPM does not (yet) support permutation thresholding with Logisitic Regression.'); lnPermute := 0; end; {$IFDEF SINGLETHREAD} lnCPUThreads := gnCPUThreads; if gnCPUThreads > 1 then Msg('July 2007 logistic regression will only use 1 thread. You may want to check for a software update'); gnCPUThreads := 1; {$ENDIF} Msg('Permutations = ' +IntToStr(lnPermute)); Msg('Logisitic Regression began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lMinMask := 1; lMaxMask := lVolVox; lVoxPerPlank := kPlankSz div lImages.Count div sizeof(byte) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; Msg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); Msg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); if (lnPlanks = 1) then getmem(lPlankImg,lTotalMemory) else getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; for lPos := 1 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; createArray64(lObsp,lObs,lImages.Count); getmem(lOutImgSum,lVolVox* sizeof(single)); //getmem(lOutImgL,lVolVox* sizeof(single)); getmem(lOutImg,lnCond*sizeof(Singlep)); for lCond := 1 to lnCond do begin getmem(lOutImg^[lCond],lVolVox* sizeof(single)); for lPos := 1 to lVolVox do lOutImg^[lCond]^[lPos] := 0; end; //InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do lOutImgSum^[lPos] := 0; ClearThreadData(gnCPUThreads,lnPermute) ; for lPlank := 1 to lnPlanks do begin ProgressBar1.Position := 1; Msg('Computing plank = ' +Inttostr(lPlank)); Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image //threading start lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; {$IFDEF NOTHREAD} FirthAnalyzeNoThread (lnCond, lnCrit,lnPermute,1,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,lPlankImg,lOutImgSum,lSymptomRA,lOutImg); //FirthAnalyzeNoThread (lnCond,lnCrit, lnPermute,1,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,lPlankImg,lOutImgSum,lSymptomRA,lOutImg); {$ELSE} for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error with TFirthThreadStat.Create (ProgressBar1,lnCond,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,lPlankImg,lOutImgSum,lSymptomRA,lOutImg) do {$IFDEF FPC} OnTerminate := @ThreadDone; {$ELSE}OnTerminate := ThreadDone;{$ENDIF} inc(gThreadsRunning); Msg('Thread ' +Inttostr(gThreadsRunning)+' = '+inttostr(lThreadStart)+'..'+inttostr(lThreadEnd)); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; {$ENDIF} //THREADED Application.processmessages; //showmessage('Threads done'); //threading end lStartVox := lEndVox + 1; end; lnVoxTested := SumThreadDataLite(gnCPUThreads); //not yet lnVoxTested := SumThreadData(gnCPUThreads,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); if lnVoxTested < 1 then begin Msg('**Error: no voxels tested: no regions lesioned in at least '+inttostr(lnCrit)+' patients**'); goto 123; end; //next report findings Msg('Voxels tested = ' +Inttostr(lnVoxTested)); Msg('Only tested voxels with more than '+inttostr(lnCrit)+' lesions'); //Next: save results from permutation thresholding.... reportBonferroni('Std',lnVoxTested); //next: save data (*savedata *) MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save sum map lOutNameMod := ChangeFilePostfixExt(lOutName,'Sum','.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); for lCond := 1 to lnCond do begin reportFDR (lPredictorList[lCond-1]+inttostr(lCond), lVolVox, lnVoxTested, lOutImg^[lCond]); //reportPermute('L',lnPermute,lPermuteMaxBM, lPermuteMinBM); lOutNameMod := ChangeFilePostfixExt(lOutName,lPredictorList[lCond-1]+inttostr(lCond),'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImg^[lCond],1); end; 123: //next: free dynamic memory //FreePermute (lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); for lCond := 1 to lnCond do freemem(lOutImg^[lCond]); freemem(lOutImg); freemem(lOutImgSum); freemem(lObsp); freemem(lPlankImg); Msg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes','.txt'); MsgSave(lOutNameMod); ProgressBar1.Position := 0; {$IFDEF SINGLETHREAD} gnCPUThreads := lnCPUThreads; {$ENDIF} exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 1 then freemem(lPlankImg); Msg('Unable to complete analysis.'); ProgressBar1.Position := 0; {$IFDEF SINGLETHREAD} gnCPUThreads := lnCPUThreads; {$ENDIF} end; function ComputeLesionVolume (lImgName: string): integer; var lHdr: TMRIcroHdr; lImg: byteP; lVolVox,lVox:integer; begin result := -1; //error NIFTIhdr_LoadHdr(lImgName,lHdr); lVolVox := lHdr.NIFTIhdr.dim[1]*lHdr.NIFTIhdr.dim[2]* lHdr.NIFTIhdr.dim[3]; getmem(lImg,lVolVox*sizeof(byte)); if not LoadImg8(lImgName, lImg, 1, lVolVox,round(lHdr.NIFTIhdr.vox_offset),1,lHdr.NIFTIhdr.datatype,lVolVox) then begin Msg('Unable to load ' +lHdr.ImgFileName); freemem(lImg); exit; end; result := 0; for lVox := 1 to lVolVox do if (lImg^[lVox] <> 0) then inc(result); freemem(lImg); end; procedure TMainForm.PenalizedLogisticRegerssion1Click(Sender: TObject); label 666; var lVol,lMin,lMax,lI,lFact,lnFactors,lSubj,lnSubj,lMaskVoxels,lnCrit: integer; lImageNames: TStrings; lPredictorList: TStringList; lTemp4D,lMaskname,lOutName,lStr: string; lMaskHdr: TMRIcroHdr; lMultiSymptomRA,lTempRA: singleP; //lBinomial: boolean; begin // lBinomial := false; lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? //next, get 1st group if not GetValX(lnSubj,lnFactors,lMultiSymptomRA,lImageNames,lnCrit{,binom},lPredictorList) then goto 666; lTemp4D := CreateDecompressed4D(lImageNames); if (lnSubj < 2) or (lnFactors < 1) then begin showmessage('This analysis requires at least 2 participants and one factor'); goto 666; end; lMaskname := lImageNames[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st image: '+lMaskname); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if not CheckVoxelsGroupX(lImageNames,lMaskHdr{lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; case MessageDlg('Do you want to add lesion volume as a regressor?', mtConfirmation, [mbYes, mbNo], 0) of { produce the message dialog box } mrYes: begin //add a new condition called lesionvolume - create a new larger array for data Msg('Computing lesion volumes...'); lPredictorList.Add('LesionVolume'); GetMem(lTempRA,lnSubj*lnFactors*sizeof(single)); for lI := 1 to (lnSubj*lnFactors) do lTempRA^[lI] := lMultiSymptomRA^[lI]; Freemem(lMultiSymptomRA); GetMem(lMultiSymptomRA,lnSubj*(lnFactors+1)*sizeof(single)); for lI := 1 to (lnSubj*lnFactors) do lMultiSymptomRA^[lI] := lTempRA^[lI]; Freemem(lTempRA); //now create the new factor lI := lnSubj*lnFactors; for lSubj := 1 to lnSubj do lMultiSymptomRA^[lI+lSubj] := ComputeLesionVolume(lImageNames[lSubj-1]); //ensure there is variability in this regressor lMin := round(lMultiSymptomRA^[lI+1]); lMax := round(lMultiSymptomRA^[lI+1]); for lSubj := 1 to lnSubj do begin lVol := round(lMultiSymptomRA^[lI+lSubj]); if lVol < lMin then lMin := lVol; if lVol > lMax then lMax := lVol; end; if (lMin < 0) then begin showmessage('Regression aborted: Error computing lesion volumes.'); goto 666; end; if (lMin = lMax) then begin showmessage('Regression aborted: no variability in lesion volume.'); goto 666; end; inc(lnFactors); end; //if user decides to include lesion volume end; //case lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; lOutName := ExtractFileDirWithPathDelim(lMaskName)+'results'; SaveHdrDlg.Filename := loutname; MsgClear; Msg(kVers); Msg('Firth Penalized regression is still beta software...'); Msg('Number of participants: '+inttostr(lnSubj)); Msg('Number of factors: '+inttostr(lnFactors)); Msg('Threads: '+inttostr(gnCPUThreads)); //next - header shows factor names lStr :='imagename'; for lFact := 1 to lnFactors do lStr := lStr+','+lPredictorList[lFact-1]; Msg(lStr); For lSubj := 1 to lnSubj do begin lStr :=''; for lFact := 1 to lnFactors do begin lStr := lStr+','+realtostr(lMultiSymptomRA^[lSubj+ ((lFact-1)*lnSubj)],2); end; Msg (lImageNames.Strings[lSubj-1] + ' = '+lStr ); end; Msg('Total voxels = '+inttostr(lMaskVoxels)); Msg('Only testing voxels damaged in at least '+inttostr(lnCrit)+' individual[s]'); Msg('Number of Lesion maps = '+inttostr(lnSubj)); lOutName := lOutName+'.nii.gz'; if not SaveHdrName ('Base Statistical Map', lOutName) then goto 666; if not CheckVoxelsGroupX(lImageNames,lMaskHdr{lMaskVoxels}) then begin showmessage('File dimensions differ from mask.'); goto 666; end; FirthNPMAnalyze (lImageNames,lPredictorList,lMaskHdr,lnFactors,lnCrit, lMultiSymptomRA, lOutName); 666: lImageNames.Free; lPredictorList.Free; DeleteDecompressed4D(lTemp4D); end; function ComputeIntersection ( lAname,lBname: string; var lUnion,lIntersection,lAnotB,lBnotA: integer): boolean; label 667; var lOutName,lOutNameMod: string; lVolVox,lVolVoxA,lVox: integer; lImgA,lImgB: SingleP; lMaskHdr: TMRIcroHdr; lA,lB: boolean; begin lUnion:= 0; lIntersection := 0; lAnotB := 0; lBnotA := 0; result := false; //read A if not NIFTIhdr_LoadHdr(lAname,lMaskHdr) then begin showmessage('Error reading image A - '+lAname); exit; end; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; getmem(lImgA,lVolVox*sizeof(single)); if not LoadImg(lAname, lImgA, 1, lVolVox,round(lMaskHdr.NIFTIhdr.vox_offset),1,lMaskHdr.NIFTIhdr.datatype,lVolVox) then begin msg('Unable to load mask ' +lMaskHdr.ImgFileName); goto 667; end; lVolVoxA := lVolVox; //read B if not NIFTIhdr_LoadHdr(lBname,lMaskHdr) then begin showmessage('Error reading image B - '+lBname); exit; end; //fx(666,round(gOffsetRA[0])); lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVoxA <> lVolVox) or (lVolVox < 1) then goto 667; getmem(lImgB,lVolVox*sizeof(single)); if not LoadImg(lBname, lImgB, 1, lVolVox,round(lMaskHdr.NIFTIhdr.vox_offset),1,lMaskHdr.NIFTIhdr.datatype,lVolVox) then begin msg('Unable to load mask ' +lMaskHdr.ImgFileName); goto 667; end; for lVox := 1 to lVolVox do begin lA := (lImgA^[lVox] <> 0); lB := (lImgB^[lVox] <> 0); if lA and lB then begin //fx(lVox,lImgA^[lVox],lImgB^[lVox]); inc(lIntersection); end; if lA or lB then inc(lUnion); if lA and not lB then inc(lAnotB); if lB and not lA then inc(lBnotA); end; freemem(lImgA); freemem(lImgB); result := true; 667: end; procedure TMainForm.ZtoP1Click(Sender: TObject); var lAname,lBname: string; var lUnion,lIntersection,lAnotB,lBnotA: integer; begin //removed lAName := 'C:\mri\roc\p2.nii.gz'; lBName := 'C:\mri\roc\RBD35.voi'; if not ComputeIntersection ( lAName,lBName,lUnion,lIntersection,lAnotB,lBnotA) then Msg('Error'); Msg( lAName+' '+lBName+' I'+inttostr(lIntersection)+' U'+inttostr(lUnion)+' AnotB'+inttostr(lAnotB)+' BnotA'+inttostr(lBnotA)); end; procedure TMainForm.ComputeIntersectionandUnion1Click(Sender: TObject); label 666; var lUnion,lIntersection,lAnotB,lBnotA, lnSubj,lSubj,lMaskVoxels,lnAdditionalFactors: integer; lImageNames: TStrings; lMaskname, lStr,lOutName: string; lMaskHdr: TMRIcroHdr; X: PMatrix; begin lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? MsgClear; Msg(kVers); Msg('Compute intersection [A and B] and union [A or B] for a series of images'); if not ReadPairedFilenamesReg(lImageNames,X,lnAdditionalFactors) then exit; lnSubj :=lImageNames.Count div 2; if lnAdditionalFactors > 1 then DelMatrix(X, lnAdditionalFactors, lnSubj); lMaskname :=lImageNames[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading first image.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Image file size too small.'); goto 666; end; if not CheckVoxelsGroupX(lImageNames,lMaskHdr{lMaskVoxels}) then begin showmessage('File dimensions differ from first image.'); goto 666; end; Msg ('n Subjects = '+inttostr(lnSubj)); for lSubj := 0 to (lnSubj-1) do begin lStr := 'A=,'+lImageNames[lSubj]+',B=,'+lImageNames[lSubj+lnSubj]; ComputeIntersection ( lImageNames[lSubj],lImageNames[lSubj+lnSubj],lUnion,lIntersection,lAnotB,lBnotA); lStr := lStr + ',A and B=,'+inttostr(lIntersection); lStr := lStr + ',A or B=,'+inttostr(lUnion); lStr := lStr + ',A not B=,'+inttostr(lAnotB); lStr := lStr + ',B not A=,'+inttostr(lBnotA); Msg(lStr); end; //Msg('Mask = '+lMaskname); //Msg('Total voxels = '+inttostr(lMaskVoxels)); Msg('Number of observations = '+inttostr(lnSubj)); 666: lImageNames.Free; end; //compute intersection and union procedure TMainForm.ROCbinomialdeficit1Click(Sender: TObject); begin testROC; end; procedure TMainForm.ROCcontinuousdeficit1Click(Sender: TObject); begin testROC2; end; function isBinom ( lRA: singleP; lnObs: integer): boolean; var lI: integer; begin result := false; if lnObs < 1 then exit; for lI := 1 to lnObs do if (lRA^[lI] <> 0) and (lRA^[lI] <> 1) then exit; result := true; end; procedure Means ( lBinomRA,lContRA: singleP; lnObs: integer); var lI,ln0: integer; lMeans0, lMeans1: double; begin lMeans0 := 0; lMeans1 := 0; ln0 := 0; if lnObs < 1 then exit; for lI := 1 to lnObs do begin if (lBinomRA^[lI] = 0) then begin inc(ln0); lMeans0 := lMeans0 + lContRA^[lI]; end else lMeans1 := lMeans1 + lContRA^[lI]; end; if ln0 > 0 then lMeans0 := lMeans0 / ln0; if ln0 < lnObs then lMeans1 := lMeans1 / (lnObs-ln0); npmform.MainForm.memo1.lines.add('mean volume for '+inttostr(ln0)+' people who scored 0 is = '+floattostr(lmeans0)); npmform.MainForm.memo1.lines.add('mean volume for '+inttostr(lnObs-ln0)+' people who scored 1 is = '+floattostr(lmeans1)); end; function AUCbinomcontT (lBinomdataRA,lContdataRA: singlep; lnSubj :integer; var lT: double): double; var lIn : DoubleP0; lnGroup0,lnGroup1,lI: integer; begin result := 0.5; if lnSubj < 1 then exit; Getmem(lIn,lnSubj*sizeof(double)); lnGroup0 := 0; lnGroup1 := 0; for lI := 1 to lnSubj do begin if lBinomdataRA^[lI] = 0 then begin lIn^[lnGroup0] := lContdataRA^[lI]; inc (lnGroup0); end else begin inc (lnGroup1); lIn^[lnSubj-lnGroup1] := lContdataRA^[lI]; end; end; result := continROC (lnSubj, lnGroup0, lIn); TStat2 (lnSubj, lnGroup0, lIn,lT); freemem(lIn); end; procedure Contrast(lBehavName,lROIname: string; lBehavRA,lLesionVolRA: singleP; lnSubj: integer); var lDF: integer; lROC,lT,lP: double; begin if isBinom (lBehavRA,lnSubj) then begin lROC := AUCbinomcontT (lBehavRA,lLesionVolRA, lnSubj,lT); lDF := lnSubj-2; lP := pTdistr(lDF,lT); Means ( lBehavRA,lLesionVolRA, lnSubj); npmform.MainForm.memo1.lines.add('ROI=,'+lROIname+',Behav=,'+lBehavName+', Area Under Curve=,'+floattostr(lROC)+', T('+inttostr(lDF)+')=,'+floattostr(lT)+',p<,'+floattostr(lp)); end else begin lROC := AUCcontcont (lBehavRA,lLesionVolRA, lnSubj); npmform.MainForm.memo1.lines.add('ROI=,'+lROIname+',Behav=,'+lBehavName+', Area Under Curve = '+floattostr(lROC)); end; //xxx end; function ComputeOverlap ( lROIname: string; var lLesionNames: TStrings; var lROIvol: double; lFracROIinjured: singlep): boolean; label 667; var lName: string; lSum: double; lLesion,lnLesions,lVolVox,lVolVoxA,lVox: integer; lROIImg,lImgB: SingleP; lMaskHdr: TMRIcroHdr; begin lROIvol := 0; result := false; lnLesions := lLesionNames.count; if lnLesions < 1 then begin showmessage('Error: no lesion names'); exit; end; for lLesion := 1 to lnLesions do lFracROIinjured^[lLesion] := 0; //read A if not NIFTIhdr_LoadHdr(lROIname,lMaskHdr) then begin showmessage('Error reading ROI - '+lROIname); exit; end; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then begin showmessage('Error with Mask voxels ' + inttostr(lVolVox)); exit; end; if not CheckVoxelsGroupX(lLesionNames, lMaskHdr) then begin showmessage('Error image dimensions vary.'); exit; end; getmem(lROIImg,lVolVox*sizeof(single)); getmem(lImgB,lVolVox*sizeof(single)); if not LoadImg(lROIname, lROIImg, 1, lVolVox,round(lMaskHdr.NIFTIhdr.vox_offset),1,lMaskHdr.NIFTIhdr.datatype,lVolVox) then begin MainForm.NPMmsg('Unable to load lesion ' +lMaskHdr.ImgFileName); goto 667; end; lVolVoxA := lVolVox; for lVox := 1 to lVolVox do if (lROIImg^[lVox] > 0) then lROIvol := lROIvol +lROIImg^[lVox]; //read Lesion if lROIvol < 1 then begin MainForm.NPMmsg('ROI volume < 1'); goto 667; end; //for each lesion //MainForm.NPMmsg('Compute overlap started '+inttostr(lnLesions)+' '+floattostr(lROIvol)+' '+inttostr(lVolVoxA)); MainForm.ProgressBar1.Position := 0; for lLesion := 1 to lnLesions do begin MainForm.ProgressBar1.Position := round((lLesion/lnLesions)*100) ; lSum := 0; lName := lLesionNames.Strings[lLesion-1]; if not NIFTIhdr_LoadHdr(lName,lMaskHdr) then begin showmessage('Error reading lesion - '+lName); exit; end; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVoxA <> lVolVox) or (lVolVox < 1) then begin MainForm.NPMmsg('Volume does not have expected number of voxels ' +lMaskHdr.ImgFileName +'<>'+lROIname+ ' found ' +inttostr(lVolVox)+' expected '+inttostr(lVolVoxA)); goto 667; end; if not LoadImg(lName, lImgB, 1, lVolVox,round(lMaskHdr.NIFTIhdr.vox_offset),1,lMaskHdr.NIFTIhdr.datatype,lVolVox) then begin MainForm.NPMmsg('Unable to load mask ' +lMaskHdr.ImgFileName); goto 667; end; for lVox := 1 to lVolVox do begin //if {(lImgB^[lVox] <> 0) and} (lROIImg^[lVox] <> 0) then fx(lROIImg^[lVox]); if (lROIImg^[lVox] > 0) and (lImgB^[lVox] <> 0) then lSum := lSum + lROIImg^[lVox]; end; lFracROIinjured^[lLesion] := lSum/lROIvol; end;//for each lesion result := true; MainForm.ProgressBar1.Position := 0; (*for lLesion := 1 to lnLesions do begin if lFracROIinjured^[lLesion] > 0 then fx( lFracROIinjured^[lLesion], lLesion); end; *) 667: freemem(lImgB); freemem(lROIImg); end; procedure TMainForm.ROIanalysis1Click(Sender: TObject); label 666; var lROI,lnROI,lVol,lMin,lMax,lI,lFact,lnFactors,lSubj,lnSubj,lMaskVoxels,lnCrit: integer; lROInames,lImageNames: TStrings; lPredictorList: TStringList; lVolStr,lTemp4D,lOutName,lStr: string; lBehav: single; lROIvolRA: doubleP; lMultiSymptomRA,lLesionVolRA,lBehavRA: singleP; lError: boolean; begin if not OpenDialogExecute('Select regions of interest',true,false,kImgPlusVOIFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected lROInames:= TStringList.Create; lROInames.addstrings(OpenHdrDlg.Files); lnROI := lROINames.Count; if lnROI < 1 then begin showmessage('You need to select at least one ROI.'); exit; end; lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? if not GetValX(lnSubj,lnFactors,lMultiSymptomRA,lImageNames,lnCrit,lPredictorList) then goto 666; lTemp4D := CreateDecompressed4D(lImageNames); if (lnSubj < 1) or (lnFactors < 1) then begin showmessage('This analysis requires at least 1 participant and one factor'); goto 666; end; MsgClear; Msg(kVers); MainForm.NPMmsg('Analysis began = ' +TimeToStr(Now)); Msg('VAL file name: '+MainForm.OpenHdrDlg.Filename); Msg('Number of participants: '+inttostr(lnSubj)); Msg('Number of factors: '+inttostr(lnFactors)); Msg('Number of Lesion maps = '+inttostr(lnSubj)); //next - header shows factor names lStr :='imagename'; for lFact := 1 to lnFactors do lStr := lStr+','+lPredictorList[lFact-1]; for lROI := 1 to lnROI do lStr := lStr+','+lROInames[lROI-1]; Msg(lStr+',LesionVolume'); lError := false; Getmem(lROIVolRA, lnSubj*lnROI*sizeof(double)); Getmem(lLesionVolRA, lnSubj*lnROI*sizeof(single)); Getmem(lBehavRA, lnSubj*lnFactors*sizeof(single)); for lROI := 1 to lnROI do begin //if not ComputeIntersection ( lImageNames.Strings[lSubj-1],lROInames[lROI-1],lUnion,lIntersection,lAnotB,lBnotA) then if not ComputeOverlap (lROInames[lROI-1],lImageNames, lROIvolRA^[lROI], singlep(@lLesionVolRA^[((lROI-1)*lnSubj)+1])) then begin MainForm.NPMmsg('Error computing overlap'); goto 666; end; end; For lSubj := 1 to lnSubj do begin lStr :=''; for lFact := 1 to lnFactors do begin lBehav := lMultiSymptomRA^[lSubj+ ((lFact-1)*lnSubj)]; lStr := lStr+','+realtostr(lBehav,2); lBehavRA^[((lFact-1)*lnSubj) +lSubj] := lBehav; end; for lROI := 1 to lnROI do lStr := lStr+','+floattostr(lLesionVolRA^[((lROI-1)*lnSubj) +lSubj]); lVolStr := floattostr(ComputeLesionVolume(lImageNames.Strings[lSubj-1])); Msg (lImageNames.Strings[lSubj-1] + ' = '+lStr +','+lVolStr ); end; (* For lSubj := 1 to lnSubj do begin lStr :=''; for lFact := 1 to lnFactors do begin lBehav := lMultiSymptomRA^[lSubj+ ((lFact-1)*lnSubj)]; lStr := lStr+','+realtostr(lBehav,2); lBehavRA^[((lFact-1)*lnSubj) +lSubj] := lBehav; end; for lROI := 1 to lnROI do begin if ComputeIntersection ( lImageNames.Strings[lSubj-1],lROInames[lROI-1],lUnion,lIntersection,lAnotB,lBnotA) then begin lStr := lStr+','+inttostr(lIntersection); lLesionVolRA^[((lROI-1)*lnSubj) +lSubj] := lIntersection; end else begin lError:= true; lStr := lStr+',error'; end; //Msg( lImageNames.Strings[lSubj-1]+' '+lROInames[lROI-1]+' I'+inttostr(lIntersection)+' U'+inttostr(lUnion)+' AnotB'+inttostr(lAnotB)+' BnotA'+inttostr(lBnotA)); end; Msg (lImageNames.Strings[lSubj-1] + ' = '+lStr ); end;*) for lROI := 1 to lnROI do begin for lFact := 1 to lnFactors do begin Contrast(lPredictorList[lFact-1],lROInames[lROI-1],singlep(@lBehavRA^[((lFact-1)*lnSubj)+1]),singlep(@lLesionVolRA^[((lROI-1)*lnSubj)+1]),lnSubj);//,((lFact-1)*lnSubj),((lROI-1)*lnSubj)); end; //for each factor end; //for each ROI for lROI := 1 to lnROI do begin Msg( lROInames[lROI-1] +' volume = '+floattostr(lROIvolRA^[lROI]) ) end; //for each ROI Freemem(lLesionVolRA); Freemem(lBehavRA); Freemem(lROIvolRA); 666: lROInames.free; lImageNames.Free; lPredictorList.Free; DeleteDecompressed4D(lTemp4D); MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); end; procedure TMainForm.Masked1Click(Sender: TObject); var lFilename,lMaskname: string; lPos: Integer; begin MsgClear; Msg(GetKVers); if not OpenDialogExecute('Select brain mask ',false,false,kImgFilter) then begin showmessage('NPM aborted: mask selection failed.'); exit; end; //if not selected lMaskname := OpenHdrDlg.Filename; if not OpenDialogExecute('Select images for intensity normalization',true,false,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected if OpenHdrDlg.Files.Count < 1 then exit; for lPos := 1 to OpenHdrDlg.Files.Count do begin lFilename := OpenHdrDlg.Files[lPos-1]; balance(lFilename,lMaskname,(Sender as TMenuItem).tag); end; end; function Binarize (var lImageName:String; lNonZeroVal: integer; lZeroThresh: boolean): boolean; var lImg8: ByteP; lImg: SingleP; lHdr: TMRIcroHdr; lVolVox,lVox: integer; lMin,lMax: single; lModeLo,lModeHi,lIntercept,lSlope: single; lOutNameMod: string; begin //lOutName := lMaskHdr.ImgFileName; result := false; //if not SaveHdrName ('Statistical Map', lOutName) then exit; if not NIFTIhdr_LoadHdr(lImageName,lHdr) then begin showmessage('Error reading '+lImageName); exit; end; lVolVox := lHdr.NIFTIhdr.dim[1]*lHdr.NIFTIhdr.dim[2]* lHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then exit; getmem(lImg,lVolVox*sizeof(single)); getmem(lImg8,lVolVox*sizeof(byte)); if not LoadImg(lHdr.ImgFileName, lImg, 1, lVolVox,round(lHdr.NIFTIhdr.vox_offset),1,lHdr.NIFTIhdr.datatype,lVolVox) then begin Msg('Unable to load ' +lHdr.ImgFileName); exit; end; lHdr.NIFTIhdr.scl_slope := 1; lHdr.NIFTIhdr.scl_inter := 0; if lZeroThresh then begin lOutNameMod := ChangeFilePrefixExt(lImageName,'i','.nii'); lMin := 0; lMax := 0 end else begin lOutNameMod := ChangeFilePrefixExt(lImageName,'i','.voi'); lMin := lIMg^[1]; for lVox := 1 to lVolVox do if lImg^[lVox] < lMin then lMin := lIMg^[lVox]; lMax := lIMg^[1]; for lVox := 1 to lVolVox do if lImg^[lVox] > lMax then lMax := lIMg^[lVox]; for lVox := 1 to lVolVox do lImg8^[lVox] := 0; lMax := ((lMax-lMin) / 2)+lMin; end; for lVox := 1 to lVolVox do if lImg^[lVox] > lMax then lImg8^[lVox] := lNonZeroVal; Msg('Creating ' +lOutNameMod+' Threshold = '+floattostr(lMax)); NIFTIhdr_SaveHdrImg8(lOutNameMod,lHdr.NIFTIhdr,true,not IsNifTiMagic(lHdr.NIFTIhdr),true,lImg8,1); freemem(lIMg8); freemem(lImg); end; procedure TMainForm.Binarizeimages1Click(Sender: TObject); var lFilename: string; lPos: Integer; begin MsgClear; Msg(GetKVers); if not OpenDialogExecute('Select images for intensity normalization',true,false,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected if OpenHdrDlg.Files.Count < 1 then exit; for lPos := 1 to OpenHdrDlg.Files.Count do begin lFilename := OpenHdrDlg.Files[lPos-1]; Binarize(lFilename,1,false); //Binarize (var lImageName:String; lNonZeroVal: integer; lZeroThresh: boolean): boolean; end; Msg('Done'); end; procedure TMainForm.Resliceimagetoneworientationandboundingbox1Click( Sender: TObject); begin (* var lSourcename,lTargetName: string; lPos: integer; begin MsgClear; Msg(GetKVers); Msg('This function will transform a source image to match a target image.'); Msg(' The resliced image will have the voxel size, orientation and bounding box of the target.'); Msg('You will be prompted to select a target image as well as source images.'); Msg(' The resliced image will have the prefix ''r'', e.g. c:\source.nii -> c:\rsource.nii.'); if not OpenDialogExecute('Select target image (source images will be resliced to match target)',false,false,kImgFilter) then begin showmessage('reslice aborted: target selection failed.'); exit; end; //if not selected lTargetName := OpenHdrDlg.Filename; if not OpenDialogExecute('Select source images for reslicing',true,false,kImgFilter) then begin showmessage('reslice aborted: source selection failed.'); exit; end; //if not selected if OpenHdrDlg.Files.Count < 1 then exit; for lPos := 1 to OpenHdrDlg.Files.Count do begin lSourcename := OpenHdrDlg.Files[lPos-1]; xxBinarize(lFilename); end; Msg('Done'); *) end; procedure TMainForm.Setnonseroto1001Click(Sender: TObject); var lFilename: string; lPos: Integer; begin MsgClear; Msg(GetKVers); if not OpenDialogExecute('Select images for intensity normalization',true,false,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected if OpenHdrDlg.Files.Count < 1 then exit; for lPos := 1 to OpenHdrDlg.Files.Count do begin lFilename := OpenHdrDlg.Files[lPos-1]; Binarize(lFilename,100,true); //Binarize (var lImageName:String; lNonZeroVal: integer; lZeroThresh: boolean): boolean; end; end; procedure TMainForm.Savetext1Click(Sender: TObject); begin SaveHdrDlg.Title := 'Save file as comma separated values (to open with Excel)'; SaveHdrDlg.Filter := 'Comma Separated (*.csv)|*.csv|Text (*.txt)|*.txt'; SaveHdrDlg.DefaultExt := '*.csv'; if not SaveHdrDlg.Execute then exit; Memo1.Lines.SaveToFile(SaveHdrDlg.Filename); end; procedure TMainForm.AnaCOMmenuClick(Sender: TObject); begin {$IFDEF compileANACOM} DoAnaCOM; {$ENDIF} end; procedure TMainForm.MonteCarloSimulation1Click(Sender: TObject); begin {$IFDEF benchmark} LesionMonteCarlo (false,true,true); {$ENDIF} end; function TMainForm.MakeSubtract (lPosName,lNegName: string): boolean; var lNegImg,lImg,lOutImg: SingleP; lHdr,lNegHdr: TMRIcroHdr; lVolVox,lVox: integer; lOutNameMod: string; begin result := false; if not NIFTIhdr_LoadHdr(lPosName,lHdr) then begin showmessage('Error reading '+lPosName); exit; end; lVolVox := lHdr.NIFTIhdr.dim[1]*lHdr.NIFTIhdr.dim[2]* lHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then exit; getmem(lImg,lVolVox*sizeof(single)); if not LoadImg(lHdr.ImgFileName, lImg, 1, lVolVox,round(lHdr.NIFTIhdr.vox_offset),1,lHdr.NIFTIhdr.datatype,lVolVox) then begin Msg('Unable to load ' +lHdr.ImgFileName); exit; end; if not NIFTIhdr_LoadHdr(lNegName,lNegHdr) then begin showmessage('Error reading '+lNegName); exit; end; if lVolVox <> (lNegHdr.NIFTIhdr.dim[1]*lNegHdr.NIFTIhdr.dim[2]* lNegHdr.NIFTIhdr.dim[3]) then begin showmessage('Volumes differ'); exit; end; getmem(lImg,lVolVox*sizeof(single)); if not LoadImg(lHdr.ImgFileName, lImg, 1, lVolVox,round(lHdr.NIFTIhdr.vox_offset),1,lHdr.NIFTIhdr.datatype,lVolVox) then begin Msg('Unable to load ' +lHdr.ImgFileName); exit; end; getmem(lNegImg,lVolVox*sizeof(single)); if not LoadImg(lNegHdr.ImgFileName, lNegImg, 1, lVolVox,round(lNegHdr.NIFTIhdr.vox_offset),1,lNegHdr.NIFTIhdr.datatype,lVolVox) then begin Msg('Unable to load ' +lNegHdr.ImgFileName); exit; end; getmem(lOutImg,lVolVox*sizeof(single)); for lVox := 1 to lVolVox do lOutImg^[lVox] := lImg^[lVox] - lNegImg^[lVox]; lHdr.NIFTIhdr.scl_slope := 1; lHdr.NIFTIhdr.scl_inter := 0; lOutNameMod := ChangeFilePrefixExt(lPosName,'subtract_','.hdr'); Msg(lPosName+' - ' + lNegName+ ' = '+lOutNameMod); NIFTIhdr_SaveHdrImg(lOutNameMod,lHdr.NIFTIhdr,true,not IsNifTiMagic(lHdr.NIFTIhdr),true,lOutImg,1); //end optional //NIFTIhdr_SaveHdr(lHdr.HdrFilename,lHdr.NIFTIhdr,true,not IsNifTiMagic(lHdr.NIFTIhdr)); freemem(lImg); freemem(lOutImg); freemem(lNegImg); end;//makesubtract procedure TMainForm.Subtract1Click(Sender: TObject); var lPosName,lNegName: string; begin if not OpenDialogExecute('Select positive',false,false,kImgPlusVOIFilter) then exit; lPosName := OpenHdrDlg.FileName; if not OpenDialogExecute('Select negative',false,false,kImgPlusVOIFilter) then exit; lNegName := OpenHdrDlg.FileName; MakeSubtract (lPosName,lNegName); end; procedure TMainForm.LogPtoZ1Click(Sender: TObject); var lFilename: string; lPos: Integer; begin MsgClear; Msg(GetKVers); if not OpenDialogExecute('Select images for intensity normalization',true,false,kImgFilter) then begin showmessage('NPM aborted: file selection failed.'); exit; end; //if not selected if OpenHdrDlg.Files.Count < 1 then exit; for lPos := 1 to OpenHdrDlg.Files.Count do begin lFilename := OpenHdrDlg.Files[lPos-1]; //LogPToZ(lFilename,1,false); end; Msg('Done'); end; {$IFDEF UNIX} initialization {$I npmform.lrs} {$ELSE} //not unix: windows initialization {$IFDEF FPC} {$I npmform.lrs} {$ENDIF}//FPC OleInitialize(nil); finalization OleUninitialize {$ENDIF} //Windows end. mricron-0.20120505.1~dfsg.1.orig/npm/npmform.lrs0000664000175000017500000001502211454076560020652 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TMainForm','FORMDATA',[ 'TPF0'#9'TMainForm'#8'MainForm'#4'Left'#3#202#2#6'Height'#3#162#1#3'Top'#2'<' +#5'Width'#3#30#2#13'ActiveControl'#7#5'Memo1'#7'Caption'#6#22'Non-Parametric' +' Mapping'#12'ClientHeight'#3#143#1#11'ClientWidth'#3#30#2#4'Menu'#7#9'MainM' +'enu1'#7'OnClose'#7#9'FormClose'#8'OnCreate'#7#10'FormCreate'#6'OnShow'#7#8 +'FormShow'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29'#0#5'T' +'Memo'#5'Memo1'#4'Left'#2#0#6'Height'#3'v'#1#3'Top'#2#0#5'Width'#3#30#2#5'Al' +'ign'#7#8'alClient'#10'ScrollBars'#7#10'ssAutoBoth'#8'TabOrder'#2#0#0#0#6'TP' +'anel'#6'Panel1'#4'Left'#2#0#6'Height'#2#25#3'Top'#3'v'#1#5'Width'#3#30#2#5 +'Align'#7#8'alBottom'#12'ClientHeight'#2#25#11'ClientWidth'#3#30#2#8'TabOrde' +'r'#2#1#0#12'TProgressBar'#12'ProgressBar1'#4'Left'#2#1#6'Height'#2#23#3'Top' +#2#1#5'Width'#3#28#2#5'Align'#7#8'alClient'#8'TabOrder'#2#0#0#0#0#9'TMainMen' +'u'#9'MainMenu1'#4'left'#2#8#3'top'#2#8#0#9'TMenuItem'#5'File1'#7'Caption'#6 +#4'File'#0#9'TMenuItem'#9'SaveText1'#7'Caption'#6#12'Save text...'#7'OnClick' +#7#14'Savetext1Click'#0#0#9'TMenuItem'#5'Exit1'#7'Caption'#6#4'Exit'#7'OnCli' +'ck'#7#10'Exit1Click'#0#0#0#9'TMenuItem'#5'Edit1'#7'Caption'#6#4'Edit'#0#9'T' +'MenuItem'#5'Copy1'#7'Caption'#6#4'Copy'#7'OnClick'#7#10'Copy1Click'#0#0#0#9 +'TMenuItem'#5'VLSM1'#7'Caption'#6#4'VLSM'#0#9'TMenuItem'#24'BinomialAnalysis' +'lesions1'#7'Caption'#6'''Binary images, binary groups (lesions) '#8'ShortCu' +'t'#3'B@'#7'OnClick'#7#14'LesionBtnClick'#0#0#9'TMenuItem!Binaryimagescontin' +'uousgroupsvlsm1'#3'Tag'#2#1#7'Caption'#6'(Binary images, continuous grooups' +' (vlsm)'#8'ShortCut'#3'L@'#7'OnClick'#7#14'LesionBtnClick'#0#0#9'TMenuItem' +#28'PenalizedLogisticRegerssion1'#7'Caption'#6#31'Binary images, multiple fa' +'ctors'#7'OnClick'#7'!PenalizedLogisticRegerssion1Click'#0#0#9'TMenuItem'#12 +'ROIanalysis1'#7'Caption'#6#12'ROI analysis'#7'OnClick'#7#17'ROIanalysis1Cli' +'ck'#0#0#9'TMenuItem'#7'Design1'#7'Caption'#6#9'Design...'#8'ShortCut'#3'D@' +#7'OnClick'#7#12'Design1Click'#0#0#0#9'TMenuItem'#4'VBM1'#7'Caption'#6#3'VBM' +#0#9'TMenuItem'#22'ContinuousanalysisVBM1'#7'Caption'#6'&Continuous images, ' +'binary groups (VBM)'#8'ShortCut'#3'V@'#7'OnClick'#7#8'NPMclick'#0#0#9'TMenu' +'Item'#11'PairedTMenu'#7'Caption'#6#22'Paired Measures T-test'#7'OnClick'#7 +#16'PairedTMenuClick'#0#0#9'TMenuItem'#9'MenuItem1'#7'Caption'#6#23'Multiple' +' WLS Regression'#7'OnClick'#7#20'MultipleRegressClick'#0#0#9'TMenuItem'#9'M' +'enuItem2'#7'Caption'#6#21'Single WLS Regression'#7'OnClick'#7#18'SingleRegr' +'essClick'#0#0#9'TMenuItem'#9'MenuItem3'#7'Caption'#6#22'Dual image correlat' +'ion'#7'OnClick'#7#26'DualImageCorrelation1Click'#0#0#0#9'TMenuItem'#8'Optio' +'ns1'#7'Caption'#6#7'Options'#0#9'TMenuItem'#13'Permutations1'#7'Caption'#6 +#12'Permutations'#0#9'TMenuItem'#2'N0'#9'AutoCheck'#9#7'Caption'#6#4'None'#7 +'Checked'#9#10'GroupIndex'#2'{'#9'RadioItem'#9#7'OnClick'#7#14'radiomenuclic' +'k'#0#0#9'TMenuItem'#5'N1000'#3'Tag'#3#232#3#9'AutoCheck'#9#7'Caption'#6#4'1' +'000'#10'GroupIndex'#2'{'#9'RadioItem'#9#7'OnClick'#7#14'radiomenuclick'#0#0 +#9'TMenuItem'#5'N2000'#3'Tag'#3#208#7#9'AutoCheck'#9#7'Caption'#6#4'2000'#10 +'GroupIndex'#2'{'#9'RadioItem'#9#7'OnClick'#7#14'radiomenuclick'#0#0#9'TMenu' +'Item'#5'N3000'#3'Tag'#3#184#11#9'AutoCheck'#9#7'Caption'#6#4'3000'#10'Group' +'Index'#2'{'#9'RadioItem'#9#7'OnClick'#7#14'radiomenuclick'#0#0#9'TMenuItem' +#5'N4000'#3'Tag'#3#160#15#9'AutoCheck'#9#7'Caption'#6#4'4000'#10'GroupIndex' +#2'{'#9'RadioItem'#9#7'OnClick'#7#14'radiomenuclick'#0#0#0#9'TMenuItem'#6'Te' +'sts1'#7'Caption'#6#5'Tests'#0#9'TMenuItem'#9'ttestmenu'#7'Caption'#6#6't-te' +'st'#7'OnClick'#7#13'testmenuclick'#0#0#9'TMenuItem'#6'BMmenu'#7'Caption'#6 +#14'Brunner Munzel'#7'Checked'#9#7'OnClick'#7#13'testmenuclick'#0#0#0#9'TMen' +'uItem'#8'Threads1'#7'Caption'#6#7'Threads'#0#9'TMenuItem'#2'T1'#9'AutoCheck' +#9#7'Caption'#6#1'1'#7'Checked'#9#10'GroupIndex'#3#131#0#9'RadioItem'#9#7'On' +'Click'#7#12'threadChange'#0#0#9'TMenuItem'#2'T2'#9'AutoCheck'#9#7'Caption'#6 +#1'2'#10'GroupIndex'#3#131#0#9'RadioItem'#9#7'OnClick'#7#12'threadChange'#0#0 +#9'TMenuItem'#2'T3'#9'AutoCheck'#9#7'Caption'#6#1'3'#10'GroupIndex'#3#131#0#9 +'RadioItem'#9#7'OnClick'#7#12'threadChange'#0#0#9'TMenuItem'#2'T4'#9'AutoChe' +'ck'#9#7'Caption'#6#1'4'#10'GroupIndex'#3#131#0#9'RadioItem'#9#7'OnClick'#7 +#12'threadChange'#0#0#9'TMenuItem'#2'T7'#9'AutoCheck'#9#7'Caption'#6#1'7'#10 +'GroupIndex'#3#131#0#9'RadioItem'#9#7'OnClick'#7#12'threadChange'#0#0#9'TMen' +'uItem'#2'T8'#9'AutoCheck'#9#7'Caption'#6#1'8'#10'GroupIndex'#3#131#0#9'Radi' +'oItem'#9#7'OnClick'#7#12'threadChange'#0#0#9'TMenuItem'#3'T15'#9'AutoCheck' +#9#7'Caption'#6#2'15'#10'GroupIndex'#3#131#0#9'RadioItem'#9#7'OnClick'#7#12 +'threadChange'#0#0#9'TMenuItem'#3'T16'#9'AutoCheck'#9#7'Caption'#6#2'16'#10 +'GroupIndex'#3#131#0#9'RadioItem'#9#7'OnClick'#7#12'threadChange'#0#0#0#0#9 +'TMenuItem'#10'Utilities1'#7'Caption'#6#9'Utilities'#0#9'TMenuItem'#9'niinii' +'gz1'#7'Caption'#6#14'nii -> .nii.gz'#7'OnClick'#7#14'niiniigz1Click'#0#0#9 ,'TMenuItem'#9'Variance1'#7'Caption'#6#14'Variance image'#7'OnClick'#7#14'Var' +'iance1Click'#0#0#9'TMenuItem'#14'Makemeanimage2'#3'Tag'#2#1#7'Caption'#6#19 +'Make binarized mean'#7'OnClick'#7#19'Makemeanimage1Click'#0#0#9'TMenuItem' +#14'Makemeanimage1'#7'Caption'#6#21'Make mean/StDev image'#7'OnClick'#7#19'M' +'akemeanimage1Click'#0#0#9'TMenuItem'#21'SingleSubjectZScores1'#7'Caption'#6 +#22'Single Subject Z-Score'#7'OnClick'#7#26'SingleSubjectZScores1Click'#0#0#9 +'TMenuItem'#24'IntensitynormalizationA1'#3'Tag'#2#1#7'Caption'#6#25'Intensit' +'y normalization A'#7'OnClick'#7#13'Balance1Click'#0#0#9'TMenuItem'#8'Balanc' +'e1'#7'Caption'#6#25'Intensity normalization B'#7'OnClick'#7#13'Balance1Clic' +'k'#0#0#9'TMenuItem PhysiologicalArtifactCorrection1'#7'Caption'#6#24'Physio' +'logical Correction'#7'OnClick'#7'%PhysiologicalArtifactCorrection1Click'#0#0 +#9'TMenuItem'#20'Countlesionoverlaps1'#7'Caption'#6#21'Count lesion overlaps' +#7'OnClick'#7#25'Countlesionoverlaps1Click'#0#0#0#9'TMenuItem'#5'Help1'#7'Ca' +'ption'#6#4'Help'#0#9'TMenuItem'#6'About1'#7'Caption'#6#5'About'#7'OnClick'#7 +#11'About1Click'#0#0#0#0#11'TSaveDialog'#10'SaveHdrDlg'#11'FilterIndex'#2#0#4 +'left'#2#8#3'top'#2'('#0#0#11'TOpenDialog'#10'OpenHdrDlg'#11'FilterIndex'#2#0 +#4'left'#2#8#3'top'#2'H'#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/npm/npmform.lfm0000664000175000017500000001717511454076560020643 0ustar michaelmichaelobject MainForm: TMainForm Left = 714 Height = 418 Top = 60 Width = 542 ActiveControl = Memo1 Caption = 'Non-Parametric Mapping' ClientHeight = 399 ClientWidth = 542 Menu = MainMenu1 OnClose = FormClose OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object Memo1: TMemo Left = 0 Height = 374 Top = 0 Width = 542 Align = alClient ScrollBars = ssAutoBoth TabOrder = 0 end object Panel1: TPanel Left = 0 Height = 25 Top = 374 Width = 542 Align = alBottom ClientHeight = 25 ClientWidth = 542 TabOrder = 1 object ProgressBar1: TProgressBar Left = 1 Height = 23 Top = 1 Width = 540 Align = alClient TabOrder = 0 end end object MainMenu1: TMainMenu left = 8 top = 8 object File1: TMenuItem Caption = 'File' object SaveText1: TMenuItem Caption = 'Save text...' OnClick = Savetext1Click end object Exit1: TMenuItem Caption = 'Exit' OnClick = Exit1Click end end object Edit1: TMenuItem Caption = 'Edit' object Copy1: TMenuItem Caption = 'Copy' OnClick = Copy1Click end end object VLSM1: TMenuItem Caption = 'VLSM' object BinomialAnalysislesions1: TMenuItem Caption = 'Binary images, binary groups (lesions) ' ShortCut = 16450 OnClick = LesionBtnClick end object Binaryimagescontinuousgroupsvlsm1: TMenuItem Tag = 1 Caption = 'Binary images, continuous grooups (vlsm)' ShortCut = 16460 OnClick = LesionBtnClick end object PenalizedLogisticRegerssion1: TMenuItem Caption = 'Binary images, multiple factors' OnClick = PenalizedLogisticRegerssion1Click end object ROIanalysis1: TMenuItem Caption = 'ROI analysis' OnClick = ROIanalysis1Click end object Design1: TMenuItem Caption = 'Design...' ShortCut = 16452 OnClick = Design1Click end end object VBM1: TMenuItem Caption = 'VBM' object ContinuousanalysisVBM1: TMenuItem Caption = 'Continuous images, binary groups (VBM)' ShortCut = 16470 OnClick = NPMclick end object PairedTMenu: TMenuItem Caption = 'Paired Measures T-test' OnClick = PairedTMenuClick end object MenuItem1: TMenuItem Caption = 'Multiple WLS Regression' OnClick = MultipleRegressClick end object MenuItem2: TMenuItem Caption = 'Single WLS Regression' OnClick = SingleRegressClick end object MenuItem3: TMenuItem Caption = 'Dual image correlation' OnClick = DualImageCorrelation1Click end end object Options1: TMenuItem Caption = 'Options' object Permutations1: TMenuItem Caption = 'Permutations' object N0: TMenuItem AutoCheck = True Caption = 'None' Checked = True GroupIndex = 123 RadioItem = True OnClick = radiomenuclick end object N1000: TMenuItem Tag = 1000 AutoCheck = True Caption = '1000' GroupIndex = 123 RadioItem = True OnClick = radiomenuclick end object N2000: TMenuItem Tag = 2000 AutoCheck = True Caption = '2000' GroupIndex = 123 RadioItem = True OnClick = radiomenuclick end object N3000: TMenuItem Tag = 3000 AutoCheck = True Caption = '3000' GroupIndex = 123 RadioItem = True OnClick = radiomenuclick end object N4000: TMenuItem Tag = 4000 AutoCheck = True Caption = '4000' GroupIndex = 123 RadioItem = True OnClick = radiomenuclick end end object Tests1: TMenuItem Caption = 'Tests' object ttestmenu: TMenuItem Caption = 't-test' OnClick = testmenuclick end object BMmenu: TMenuItem Caption = 'Brunner Munzel' Checked = True OnClick = testmenuclick end end object Threads1: TMenuItem Caption = 'Threads' object T1: TMenuItem AutoCheck = True Caption = '1' Checked = True GroupIndex = 131 RadioItem = True OnClick = threadChange end object T2: TMenuItem AutoCheck = True Caption = '2' GroupIndex = 131 RadioItem = True OnClick = threadChange end object T3: TMenuItem AutoCheck = True Caption = '3' GroupIndex = 131 RadioItem = True OnClick = threadChange end object T4: TMenuItem AutoCheck = True Caption = '4' GroupIndex = 131 RadioItem = True OnClick = threadChange end object T7: TMenuItem AutoCheck = True Caption = '7' GroupIndex = 131 RadioItem = True OnClick = threadChange end object T8: TMenuItem AutoCheck = True Caption = '8' GroupIndex = 131 RadioItem = True OnClick = threadChange end object T15: TMenuItem AutoCheck = True Caption = '15' GroupIndex = 131 RadioItem = True OnClick = threadChange end object T16: TMenuItem AutoCheck = True Caption = '16' GroupIndex = 131 RadioItem = True OnClick = threadChange end end end object Utilities1: TMenuItem Caption = 'Utilities' object niiniigz1: TMenuItem Caption = 'nii -> .nii.gz' OnClick = niiniigz1Click end object Variance1: TMenuItem Caption = 'Variance image' OnClick = Variance1Click end object Makemeanimage2: TMenuItem Tag = 1 Caption = 'Make binarized mean' OnClick = Makemeanimage1Click end object Makemeanimage1: TMenuItem Caption = 'Make mean/StDev image' OnClick = Makemeanimage1Click end object SingleSubjectZScores1: TMenuItem Caption = 'Single Subject Z-Score' OnClick = SingleSubjectZScores1Click end object IntensitynormalizationA1: TMenuItem Tag = 1 Caption = 'Intensity normalization A' OnClick = Balance1Click end object Balance1: TMenuItem Caption = 'Intensity normalization B' OnClick = Balance1Click end object PhysiologicalArtifactCorrection1: TMenuItem Caption = 'Physiological Correction' OnClick = PhysiologicalArtifactCorrection1Click end object Countlesionoverlaps1: TMenuItem Caption = 'Count lesion overlaps' OnClick = Countlesionoverlaps1Click end end object Help1: TMenuItem Caption = 'Help' object About1: TMenuItem Caption = 'About' OnClick = About1Click end end end object SaveHdrDlg: TSaveDialog FilterIndex = 0 left = 8 top = 40 end object OpenHdrDlg: TOpenDialog FilterIndex = 0 left = 8 top = 72 end end mricron-0.20120505.1~dfsg.1.orig/npm/npmform.dfm0000664000175000017500000001307511454075440020622 0ustar michaelmichaelџ TMAINFORM0*TPF0 TMainFormMainFormLeft'Top[WidthЪHeightТCaptionNon-Parametric MappingColor clBtnFace Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Heightѕ Font.Name MS Sans Serif Font.Style Menu MainMenu1OldCreateOrder PositionpoScreenCenterOnClose FormCloseOnCreate FormCreateOnShowFormShow PixelsPerInch` TextHeight TMemoMemo1LeftTopWidthТHeight€AlignalClient ScrollBars ssVerticalTabOrderWordWrapTPanelPanel1LeftTop€WidthТHeightAlignalBottom BevelOuterbvNoneCaptionPanel1TabOrder TProgressBar ProgressBar1LeftTopWidthТHeightAlignalClientTabOrder TOpenDialog OpenHdrDlgLeftTop< TSaveDialog SaveHdrDlgLeftTop$ TMainMenu MainMenu1LeftTop TMenuItemFile1CaptionFile TMenuItem Savetext1Caption Save text....OnClickSavetext1Click TMenuItemExit1CaptionExitOnClick Exit1Click TMenuItemEdit1CaptionEdit TMenuItemCopy1CaptionCopyShortCutC@OnClick Copy1Click TMenuItemVLSM1CaptionVLSM TMenuItemBinomialAnalysislesions1CaptionBinary images, binary behaviorShortCutB@OnClickLesionBtnClick TMenuItem!Binaryimagescontinuousgroupsfast1TagCaption"Binary images, continuous behaviorShortCutL@OnClickLesionBtnClick TMenuItemPenalizedLogisticRegerssion1Caption"Binary Images, Multiple RegressorsOnClick!PenalizedLogisticRegerssion1Click TMenuItem AnaCOMmenuCaptionAnaCOMVisibleOnClickAnaCOMmenuClick TMenuItemMonteCarloSimulation1CaptionMonteCarloSimulationOnClickMonteCarloSimulation1Click TMenuItem ROIanalysis1Caption ROI analysisOnClickROIanalysis1Click TMenuItemDesign1Caption Design...ShortCutD@OnClick Design1Click TMenuItemVBM1CaptionVBM TMenuItemContinuousanalysisVBM1Caption&Continuous images, binary groups (VBM)ShortCutV@OnClickNPMclick TMenuItemMultipleRegressCaptionMultiple WLS RegressionShortCutR@OnClickMultipleRegressClick TMenuItem SingleRegressTagCaptionSingle WLS RegressionOnClickSingleRegressClick TMenuItemDualImageCorrelation1CaptionDual Image CorrelationOnClickDualImageCorrelation1Click TMenuItem PairedTMenuCaptionPaired Measures T-testOnClickPairedTMenuClick TMenuItemOptions1CaptionOptions TMenuItem Permutations1Caption Permutations TMenuItemN0CaptionNoneChecked GroupIndex{ RadioItem OnClickradiomenuclick TMenuItemN1000TagшCaption1000 GroupIndex{ RadioItem OnClickradiomenuclick TMenuItemN2000TagаCaption2000 GroupIndex{ RadioItem OnClickradiomenuclick TMenuItemN3000TagИ Caption3000 GroupIndex{ RadioItem OnClickradiomenuclick TMenuItemN4000Tag Caption4000 GroupIndex{ RadioItem OnClickradiomenuclick TMenuItemTests1CaptionTests TMenuItem ttestmenuCaptionttestChecked OnClick testmenuclick TMenuItemBMmenuCaptionBrunner MunzelChecked GroupIndexOnClick testmenuclick TMenuItemThreads1CaptionThreads TMenuItemT1Caption1Checked GroupIndexƒ RadioItem OnClick threadChange TMenuItemT2Caption2 GroupIndexƒ RadioItem OnClick threadChange TMenuItemT3Caption3 GroupIndexƒ RadioItem OnClick threadChange TMenuItemT4Caption4 GroupIndexƒ RadioItem OnClick threadChange TMenuItemT7Caption7 GroupIndexƒ RadioItem OnClick threadChange TMenuItemT8Caption8 GroupIndexƒ RadioItem OnClick threadChange TMenuItemT15Caption15 GroupIndexƒ RadioItem OnClick threadChange TMenuItemT16Caption16 GroupIndexƒ RadioItem OnClick threadChange TMenuItem Utilities1Caption Utilities TMenuItem niiniigz1Caption nii->.nii.gzOnClickniiniigz1Click TMenuItem Variance1CaptionVariance imageOnClickVariance1Click TMenuItemMakemeanimage2TagCaptionMake binarized mean OnClickMakemeanimage1Click TMenuItemBinarizeimages1CaptionBinarize imagesOnClickBinarizeimages1Click TMenuItemMakemeanimage1CaptionMake mean/StDev imageShortCutM@OnClickMakemeanimage1Click TMenuItemSingleSubjectZScores1CaptionSingle Subject Z-ScoresOnClickSingleSubjectZScores1Click TMenuItem PhysiologicalArtifactCorrection1CaptionPhysiological CorrectionOnClick%PhysiologicalArtifactCorrection1Click TMenuItemCountlesionoverlaps1CaptionCount lesion overlapsOnClickCountlesionoverlaps1Click TMenuItemComputeIntersectionandUnion1CaptionCompute Intersection and UnionOnClick!ComputeIntersectionandUnion1Click TMenuItemIntensitynormalization1CaptionIntensity normalization TMenuItemMaskedintensitynormalizationA1TagCaption Masked intensity normalization AShortCutI@OnClick Masked1Click TMenuItemMasked1Caption Masked intensity normalization BOnClick Masked1Click TMenuItemMaskedintensitynormalizationB1TagCaption Masked intensity normalization COnClick Masked1Click TMenuItemIntensitynormalizationA1TagCaptionIntensity normalization AOnClick Balance1Click TMenuItemBalance1CaptionIntensity normalization BOnClick Balance1Click TMenuItemSetnonseroto1001CaptionSet non-zero to 100OnClickSetnonseroto1001Click TMenuItem+Resliceimagetoneworientationandboundingbox1CaptionReslice imagesVisibleOnClick0Resliceimagetoneworientationandboundingbox1Click TMenuItem Subtract1CaptionSubtract imagesOnClickSubtract1Click TMenuItemLogPtoZ1Caption LogP to ZOnClick LogPtoZ1Click TMenuItemHelp1CaptionHelp TMenuItemAbout1CaptionAboutShortCutA@OnClick About1Click TMenuItemAssociatevalfileswithNPM1CaptionAssociate .val files with NPMOnClickAssociatevalfileswithNPM1Clickmricron-0.20120505.1~dfsg.1.orig/npm/npm.res0000664000175000017500000000155411477155230017761 0ustar michaelmichael џџџџш џџџџ ( @€€€€€€€€€€€€РРРџџџџџџџџџџџџˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€‡ˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€™ˆˆˆˆ‰˜ˆˆˆˆˆˆˆˆ€3˜ˆˆˆ˜ˆˆˆˆˆˆˆˆˆ€wywwywwˆˆˆˆˆˆˆˆ€ˆ‰ˆˆ‰ˆˆˆˆˆˆˆˆˆˆ€ˆˆ˜ˆ˜ˆˆˆˆˆˆˆˆˆˆ€ˆˆ‰™ˆˆˆˆˆˆˆˆˆˆˆ€wwww€€ˆˆˆˆ€ˆˆˆˆџџџџџџџџџ€ˆˆˆˆџ№џџџ№џ€wwwwџџџџџˆˆˆˆˆ№џ№ˆˆˆˆˆ№џ№ˆˆˆˆˆџџџџџˆˆˆˆˆџ№џџ№џˆˆˆˆˆџџџ№џџџˆˆˆˆˆџџџџџџˆˆˆˆˆџџџџџџˆˆˆˆˆџџџ№џџџˆˆˆˆˆџ№џџ№џˆˆˆˆˆџџџџџˆˆˆˆˆ№џ№ˆˆˆˆˆ№џ№ˆˆˆˆˆџџџџџˆˆˆˆˆџ№џџџ№џˆˆˆˆˆџџџџџџџџџˆˆˆˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ0џџMAINICON  шmricron-0.20120505.1~dfsg.1.orig/npm/npm.or0000664000175000017500000001622011454076564017613 0ustar michaelmichaelLz.rsrc <\@Р € P€ €8€а€p€№€ˆ€(8LAZ_PIC_DIALOG_TEMPLATETFINDDIALOGFORMTREPLACEDIALOGFORMH<„qј(T,‘PШ‘_STATICTPF0TFindDialogFormFindDialogFormLeftѓHeightƒTop“WidthМ ActiveControl FindButton BorderIcons biSystemMenubiHelpCaptionFind ClientHeightƒ ClientWidthМOnCreate FormCreatePositionpoScreenCenter LCLVersion0.9.27TLabel FindLabelLeftHeightTopWidthFCaption Text to find FocusControlEditFind ParentColorTEditEditFindLeftHHeightTop Width Anchors akTopakLeftakRightOnChangeEditFindChangeTabOrderTextEditFindTButton FindButtonLeft]HeightTopWidth[Anchors akTopakRightCaption Find moreDefault TabOrderTButton CancelButtonLeft]HeightTop(Width[Anchors akTopakRightCancel CaptionCancel ModalResultTabOrder TCheckBoxWholeWordsOnlyCheckBoxLeftHeightTop3Width…CaptionWhole words onlyTabOrder TCheckBoxCaseSensitiveCheckBoxLeftHeightTopNWidthtCaptionCase sensitiveTabOrder TRadioGroupDirectionRadioGroupLeftHeight-Top.WidthХAutoFill Caption DirectionChildSizing.LeftRightSpacingChildSizing.TopBottomSpacingChildSizing.EnlargeHorizontalcrsHomogenousChildResizeChildSizing.EnlargeVerticalcrsHomogenousChildResizeChildSizing.ShrinkHorizontalcrsScaleChildsChildSizing.ShrinkVerticalcrsScaleChildsChildSizing.LayoutcclLeftToRightThenTopToBottomChildSizing.ControlsPerLine ClientHeight ClientWidthСColumns Items.StringsForwardBackwardTabOrderTButton HelpButtonLeft]HeightTopdWidth[Anchors akRightakBottomCaptionHelpTabOrder TCheckBoxEntireScopeCheckBoxLeftHeightTopgWidth„CaptionSearch entire fileTabOrderTPF0TReplaceDialogFormReplaceDialogFormLeftŸHeightЂTop‡WidthА HelpContext ActiveControlEditFind BorderIcons biSystemMenubiHelpCaption Replace textChildSizing.LeftRightSpacingChildSizing.TopBottomSpacingChildSizing.HorizontalSpacingChildSizing.VerticalSpacingChildSizing.ControlsPerLine ClientHeightЂ ClientWidthА Font.Height Font.Style LCLVersion0.9.27TLabel TextLabelLeftHeightTopWidthF HelpContext Alignment taLeftJustifyBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Text to find FocusControlEditFind ParentColorTLabel ReplaceLabelLeftHeightTop0WidthO HelpContext Alignment taLeftJustifyBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Replace with FocusControl EditReplace ParentColorTEditEditFindLeftHHeightTop Width HelpContextAnchors akTopakLeftakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillTabOrderTextEditFindTEdit EditReplaceLeftHHeightTop*Width HelpContextAnchors akTopakLeftakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillTabOrderText EditReplace TCheckBoxWholeWordsOnlyCheckBoxLeftHeightTopPWidth… HelpContextBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionWhole words onlyState cbUncheckedTabOrder UseOnChange TCheckBoxCaseSensitiveCheckBoxLeftHeightTophWidtht HelpContextBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionCase sensitiveState cbUncheckedTabOrder UseOnChangeTButtonFindMoreButtonTagLeftQHeightTop Width[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Find moreDefault TabOrderTButton ReplaceButtonTagLeftQHeightTop(Width[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionReplaceTabOrderTButtonReplaceAllButtonTagLeftPHeightTopDWidth[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Replace allTabOrderTButton CancelButtonLeftQHeightTop`Width[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCancel CaptionCancel ModalResultTabOrderTButton HelpButtonLeftQHeightTopWidth[ HelpContextAnchors akRightakBottomBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionHelpTabOrder TRadioGroupDirectionRadioGroupLeftˆHeight-TopPWidthИ HelpContextAutoFill BorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption DirectionChildSizing.LeftRightSpacingChildSizing.TopBottomSpacingChildSizing.HorizontalSpacingChildSizing.VerticalSpacingChildSizing.EnlargeHorizontalcrsHomogenousChildResizeChildSizing.EnlargeVerticalcrsHomogenousChildResizeChildSizing.ShrinkHorizontalcrsScaleChildsChildSizing.ShrinkVerticalcrsScaleChildsChildSizing.LayoutcclLeftToRightThenTopToBottomChildSizing.ControlsPerLine ClientHeight ClientWidthДColumnsCtl3D Items.StringsForwardBackwardTabOrder TCheckBoxEntireScopeCheckBoxLeftHeightTop€Width„ HelpContextBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionSearch entire fileState cbUncheckedTabOrder UseOnChange(8.rsrcmricron-0.20120505.1~dfsg.1.orig/npm/npm.lpr0000664000175000017500000000127511421031656017757 0ustar michaelmichaelprogram npm; {$mode objfpc}{$H+} {$I options.inc} uses {$IFDEF UNIX}cthreads,{$ENDIF} Interfaces, // this includes the LCL widgetset Forms, npmform,stats ,nifti_hdr,valformat, part, gzio2, StatThds, StatThdsUtil, brunner, statcr, distr, GraphicsMathLibrary, define_types, ReadInt {$IFDEF SPREADSHEET} ,design,spread{$ENDIF}; {$IFNDEF FPC} {$R npm.res} {$ENDIF} begin Application.Initialize; Application.CreateForm(TMainForm, MainForm); {$IFDEF SPREADSHEET} Application.CreateForm(TSpreadForm, SpreadForm); Application.CreateForm(TDesignForm, DesignForm); {$ENDIF} Application.CreateForm(TReadIntForm, ReadIntForm); Application.Run; end. mricron-0.20120505.1~dfsg.1.orig/npm/npm.lpi0000664000175000017500000004150011540116516017742 0ustar michaelmichael mricron-0.20120505.1~dfsg.1.orig/npm/npm.ini0000664000175000017500000000016011732362766017747 0ustar michaelmichael[BOOL] computettest=1 computebm=0 countlesionpatterns=1 ROI=1 [INT] CacheMB=512 nPermute=0 nThread=2 mricron-0.20120505.1~dfsg.1.orig/npm/npm.dpr0000664000175000017500000000125410772416414017753 0ustar michaelmichaelprogram npm; uses Forms, npmform in 'npmform.pas' {MainForm}, stats in 'stats.pas', spread in 'spread.pas' {SpreadForm}, design in 'design.pas' {DesignForm}, valformat in 'valformat.pas', ReadInt in 'ReadInt.pas' {ReadIntForm}, firth in 'firth.pas', roc in 'roc.pas', prefs in 'prefs.pas'; {$R *.RES} {$IFNDEF FPC} {$R windowsxp.res} {$ENDIF} begin Application.Initialize; Application.Title := 'NPM'; Application.CreateForm(TMainForm, MainForm); Application.CreateForm(TSpreadForm, SpreadForm); Application.CreateForm(TDesignForm, DesignForm); Application.CreateForm(TReadIntForm, ReadIntForm); Application.Run; end. mricron-0.20120505.1~dfsg.1.orig/npm/npm.dof0000664000175000017500000000243211477334722017741 0ustar michaelmichael[Compiler] A=1 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 V=1 W=0 X=1 Y=1 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 RemoteSymbols=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=4194304 ExeDescription= [Directories] OutputDir= UnitOutputDir= PackageDLLOutputDir= PackageDCPOutputDir= SearchPath=C:\pas\mricron\common;C:\pas\mricron\fpmath Packages=Vcl40;Vclx40;VclSmp40;Qrpt40;Vcldb40;RxCtl4 Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams= HostApplication= [Version Info] IncludeVerInfo=0 AutoIncBuild=0 MajorVer=1 MinorVer=0 Release=0 Build=0 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=1033 CodePage=1252 [Version Info Keys] CompanyName= FileDescription= FileVersion=1.0.0.0 InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion=1.0.0.0 Comments= [HistoryLists\hlUnitAliases] Count=1 Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [HistoryLists\hlSearchPath] Count=2 Item0=C:\pas\mricron\common;C:\pas\mricron\fpmath Item1=C:\pas\mricron\common mricron-0.20120505.1~dfsg.1.orig/npm/npm.cfg0000664000175000017500000000101111477334722017720 0ustar michaelmichael-$A+ -$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 -LN"c:\program files\borland\delphi4\Lib" -U"C:\pas\mricron\common;C:\pas\mricron\fpmath" -O"C:\pas\mricron\common;C:\pas\mricron\fpmath" -I"C:\pas\mricron\common;C:\pas\mricron\fpmath" -R"C:\pas\mricron\common;C:\pas\mricron\fpmath" mricron-0.20120505.1~dfsg.1.orig/npm/npm.app/0000775000175000017500000000000011660470014020012 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/npm/npm.app/Contents/0000775000175000017500000000000011660470014021607 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/npm/npm.app/Contents/PkgInfo0000664000175000017500000000001111255443606023066 0ustar michaelmichaelAPPL???? mricron-0.20120505.1~dfsg.1.orig/npm/npm.app/Contents/MacOS/0000775000175000017500000000000011660470014022551 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/npm/npm.app/Contents/MacOS/npm0000664000175000017500000000001411255443606023270 0ustar michaelmichael../../../npmmricron-0.20120505.1~dfsg.1.orig/npm/npm.app/Contents/Info.plist0000664000175000017500000000221511255443606023566 0ustar michaelmichael CFBundleDevelopmentRegion English CFBundleExecutable npm CFBundleName npm CFBundleIdentifier com.company.npm CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleSignature npm? CFBundleShortVersionString 0.1 CFBundleVersion 1 CSResourcesFileMapped CFBundleDocumentTypes CFBundleTypeRole Viewer CFBundleTypeExtensions * CFBundleTypeOSTypes fold disk **** mricron-0.20120505.1~dfsg.1.orig/npm/nifti_img.pas0000664000175000017500000004533211477122364021132 0ustar michaelmichaelunit nifti_img; //only for Delphi - not Freepascal //Unit for running multiple regression interface uses define_types,Classes,nifti_hdr,sysutils,dialogs {$IFDEF FPC},gzio2 {$ELSE} ,gziod {$ENDIF} ; {$H+} function LoadImg(lInName: string; lImgData: SingleP; lStart, lEnd,linvox_offset,lRApos,lDataType,lVolVox: integer): boolean; function LoadImg8(lInName: string; lImgData: ByteP; lStart, lEnd,linvox_offset,lRApos,lDataType,lVolVox: integer): boolean; implementation uses npmform,hdr; function LoadImg(lInName: string; lImgData: SingleP; lStart, lEnd,linvox_offset,lRApos,lDataType,lVolVox: integer): boolean; var lvox_offset,lInc,lFSize,lP2: integer; lFData: file; lImgName: string; lByteP: ByteP; lSmallIntP: SmallIntP; lV,lMin,lMax: single; begin result := false; if (lStart >= lEnd) or (lStart < 1) or (lEnd < 1) then begin MainForm.NPMmsg('Error: LoadImg '+inttostr(lStart)+'>='+inttostr(lEnd)+' or zero'); exit; end; if Files4D(lInName) then begin lImgName := Filename4D(lInName); lP2 := BPP (lDataType); if lP2 = 0 then begin Showmessage(lImgName +' is an unsupported file type'); exit; end; lvox_offset := linvox_offset+ ((Vol4D(lInName)-1)* (lP2 * lVolVox)); end else begin lImgName := lInName; lvox_offset := linvox_offset; end; if UpCaseExt(lImgName) = '.HDR' then lImgName := changefileext(lImgName,'.img'); lFSize := FSize(lImgName); if (not GzExt(lImgName)) and (lFSize < (lEnd+ lvox_offset)) then begin MainForm.NPMmsg('Error: LoadImg '+lImgName+' FSize = '+inttostr(lFSize)+' Expected '+inttostr(lEnd+ lvox_offset)); exit; end; filemode := 0; if GzExt(lImgName) then begin if lDataType = kDT_UNSIGNED_CHAR then begin getmem(lByteP, (lEnd+1)-lStart); UnGZip(lImgName,lByteP,lvox_offset+lStart-1,(lEnd+1)-lStart); for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := lByteP^[lInc]; freemem(lByteP); end else if (lDataType = kDT_SIGNED_SHORT) then begin //getmem(lSmallIntP, sizeof(smallint)* ((lEnd+1)-lStart)); getmem(lByteP, ((lEnd+1)-lStart)*sizeof(smallint)); UnGZip(lImgName,lByteP,lvox_offset+((lStart-1)*sizeof(smallint)),((lEnd+1)-lStart)*sizeof(smallint)); for lInc := 1 to ((lEnd+1)-lStart) do begin lP2 := ((lInc-1)*2)+1 ; lImgData^[lRApos+lInc-1] := makesmallint(lByteP^[lP2],lByteP^[lP2+1]); end; freemem(lByteP); end else if (lDataType = kDT_SIGNED_INT) or (lDataType = kDT_FLOAT) then begin lByteP := ByteP(@lImgData^[lRApos]); UnGZip(lImgName,lByteP,lvox_offset+((lStart-1)*sizeof(single)),((lEnd+1)-lStart)*sizeof(single)); (*getmem(lByteP, ((lEnd+1)-lStart)*sizeof(single)); UnGZip(lImgName,lByteP,lvox_offset+((lStart-1)*sizeof(single)),((lEnd+1)-lStart)*sizeof(single)); for lInc := 1 to ((lEnd+1)-lStart) do begin lP2 := ((lInc-1)*4)+1 ; lImgData^[lRApos+lInc-1] := makesingle(lByteP^[lP2],lByteP^[lP2+1],lByteP^[lP2+2],lByteP^[lP2+3]); //lImgData^[lRApos+lInc-1] := makesingle(lByteP^[lP2+3],lByteP^[lP2+2],lByteP^[lP2+1],lByteP^[lP2]); end; freemem(lByteP); *) //test range (*lINc := 1; lMin := lImgData^[lRApos+lInc-1]; lMax := lMin; for lInc := 1 to ((lEnd+1)-lStart) do begin lV := lImgData^[lRApos+lInc-1]; if lV > lMax then lMax := lV; if lV < lMin then lMin := lMax; end; MainForm.NPMmsg(inttostr(lvox_offset)+' '+realtostr(lMin,8)+' '+realtostr(lMax,8)); *) //end if lDataType = kDT_SIGNED_INT then begin for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := conv4r4i (lImgData^[lRApos+lInc-1]); end else begin for lInc := 1 to ((lEnd+1)-lStart) do if specialsingle(lImgData^[lRApos+lInc-1])then lImgData^[lRApos+lInc-1] := 0; end; end else begin showmessage(lImgName + ' is an unsupported compressed data type '+inttostr(lDataType)); exit; end; end else begin assignfile(lFdata,lImgName); if lDataType = kDT_UNSIGNED_CHAR then begin getmem(lByteP, (lEnd+1)-lStart); reset(lFdata,1); //12/2010 seek(lFdata,lvox_offset+lStart-1); BlockRead(lFdata, lByteP^, (lEnd+1)-lStart); for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := lByteP^[lInc]; freemem(lByteP); end else if (lDataType = kDT_SIGNED_SHORT) then begin getmem(lSmallIntP, sizeof(smallint)* ((lEnd+1)-lStart)); reset(lFdata,2); if (lvox_offset mod 2) <> 0 then begin showmessage('Error: this software can only read headers with dataoffsets that are divisible by 4.'); end; seek(lFdata,(lvox_offset div 2)+ (lStart-1)); BlockRead(lFdata, lSmallIntP^, (lEnd+1)-lStart); for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := lSmallIntP^[lInc]; freemem(lSmallIntP); end else if (lDataType = kDT_SIGNED_INT) or (lDataType = kDT_FLOAT) then begin //next: 4 byte data reset(lFdata,4); if (lvox_offset mod 4) <> 0 then begin showmessage('Error: this software can only read headers with dataoffsets that are divisible by 4.'); end; seek(lFdata,(lvox_offset div 4)+ (lStart-1) ); BlockRead(lFdata, lImgData[lRApos], (lEnd+1)-lStart); if lDataType = kDT_SIGNED_INT then begin for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := conv4r4i (lImgData^[lRApos+lInc-1]); end else begin for lInc := 1 to ((lEnd+1)-lStart) do if specialsingle(lImgData^[lRApos+lInc-1]) then lImgData^[lRApos+lInc-1] := 0; end; end else showmessage('Unsupported COMPRESSED data type '+inttostr(lDataType)); closefile(lFdata); end; //not gz result := true; end; (*function LoadImgx(lInName: string; lImgData: SingleP; lStart, lEnd,linvox_offset,lRApos,lDataType,lVolVox: integer): boolean; var lvox_offset,lInc,lFSize,lP2: integer; lFData: file; lImgName: string; lByteP: ByteP; lSmallIntP: SmallIntP; lV,lMin,lMax: single; begin result := false; if (lStart >= lEnd) or (lStart < 1) or (lEnd < 1) then begin MainForm.NPMmsg('Error: LoadImg '+inttostr(lStart)+'>='+inttostr(lEnd)+' or zero'); exit; end; if Files4D(lInName) then begin lImgName := Filename4D(lInName); lP2 := BPP (lDataType); if lP2 = 0 then begin Showmessage(lImgName +' is an unsupported file type'); exit; end; lvox_offset := linvox_offset+ ((Vol4D(lInName)-1)* (lP2 * lVolVox)); end else begin lImgName := lInName; lvox_offset := linvox_offset; end; if UpCaseExt(lImgName) = '.HDR' then lImgName := changefileext(lImgName,'.img'); lFSize := FSize(lImgName); if (not GzExt(lImgName)) and (lFSize < (lEnd+ lvox_offset)) then begin MainForm.NPMmsg('Error: LoadImg '+lImgName+' FSize = '+inttostr(lFSize)+' Expected '+inttostr(lEnd+ lvox_offset)); exit; end; filemode := 0; if GzExt(lImgName) then begin if lDataType = kDT_UNSIGNED_CHAR then begin getmem(lByteP, (lEnd+1)-lStart); UnGZip(lImgName,lByteP,lvox_offset+lStart-1,(lEnd+1)-lStart); for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := lByteP^[lInc]; freemem(lByteP); end else if (lDataType = kDT_SIGNED_SHORT) then begin //getmem(lSmallIntP, sizeof(smallint)* ((lEnd+1)-lStart)); getmem(lByteP, ((lEnd+1)-lStart)*sizeof(smallint)); UnGZip(lImgName,lByteP,lvox_offset+((lStart-1)*sizeof(smallint)),((lEnd+1)-lStart)*sizeof(smallint)); for lInc := 1 to ((lEnd+1)-lStart) do begin lP2 := ((lInc-1)*2)+1 ; lImgData^[lRApos+lInc-1] := makesmallint(lByteP^[lP2],lByteP^[lP2+1]); end; freemem(lByteP); end else if (lDataType = kDT_SIGNED_INT) or (lDataType = kDT_FLOAT) then begin lByteP := ByteP(@lImgData^[lRApos]); UnGZip(lImgName,lByteP,lvox_offset+((lStart-1)*sizeof(single)),((lEnd+1)-lStart)*sizeof(single)); {getmem(lByteP, ((lEnd+1)-lStart)*sizeof(single)); UnGZip(lImgName,lByteP,lvox_offset+((lStart-1)*sizeof(single)),((lEnd+1)-lStart)*sizeof(single)); for lInc := 1 to ((lEnd+1)-lStart) do begin lP2 := ((lInc-1)*4)+1 ; lImgData^[lRApos+lInc-1] := makesingle(lByteP^[lP2],lByteP^[lP2+1],lByteP^[lP2+2],lByteP^[lP2+3]); //lImgData^[lRApos+lInc-1] := makesingle(lByteP^[lP2+3],lByteP^[lP2+2],lByteP^[lP2+1],lByteP^[lP2]); end; freemem(lByteP);} //test range {lINc := 1; lMin := lImgData^[lRApos+lInc-1]; lMax := lMin; for lInc := 1 to ((lEnd+1)-lStart) do begin lV := lImgData^[lRApos+lInc-1]; if lV > lMax then lMax := lV; if lV < lMin then lMin := lMax; end; MainForm.NPMmsg(inttostr(lvox_offset)+' '+realtostr(lMin,8)+' '+realtostr(lMax,8)); } //end if lDataType = kDT_SIGNED_INT then begin for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := conv4r4i (lImgData^[lRApos+lInc-1]); end else begin for lInc := 1 to ((lEnd+1)-lStart) do if specialsingle(lImgData^[lRApos+lInc-1])then lImgData^[lRApos+lInc-1] := 0; end; end else begin showmessage(lImgName + ' is an unsupported compressed data type '+inttostr(lDataType)); exit; end; end else begin assignfile(lFdata,lImgName); if lDataType = kDT_UNSIGNED_CHAR then begin getmem(lByteP, (lEnd+1)-lStart); reset(lFdata,1); seek(lFdata,lvox_offset+lStart-1); BlockRead(lFdata, lByteP^, (lEnd+1)-lStart); for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := lByteP^[lInc]; freemem(lByteP); end else if (lDataType = kDT_SIGNED_SHORT) then begin getmem(lSmallIntP, sizeof(smallint)* ((lEnd+1)-lStart)); reset(lFdata,2); if (lvox_offset mod 2) <> 0 then begin showmessage('Error: this software can only read headers with dataoffsets that are divisible by 4.'); end; seek(lFdata,(lvox_offset div 2)+ (lStart-1)); BlockRead(lFdata, lSmallIntP^, (lEnd+1)-lStart); for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := lSmallIntP^[lInc]; freemem(lSmallIntP); end else if (lDataType = kDT_SIGNED_INT) or (lDataType = kDT_FLOAT) then begin //next: 4 byte data reset(lFdata,4); if (lvox_offset mod 4) <> 0 then begin showmessage('Error: this software can only read headers with dataoffsets that are divisible by 4.'); end; seek(lFdata,(lvox_offset div 4)+ (lStart-1) ); BlockRead(lFdata, lImgData[lRApos], (lEnd+1)-lStart); if lDataType = kDT_SIGNED_INT then begin for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := conv4r4i (lImgData^[lRApos+lInc-1]); end else begin for lInc := 1 to ((lEnd+1)-lStart) do if specialsingle(lImgData^[lRApos+lInc-1]) then lImgData^[lRApos+lInc-1] := 0; end; end else showmessage('Unsupported COMPRESSED data type '+inttostr(lDataType)); closefile(lFdata); end; //not gz result := true; end; *) function LoadImg8(lInName: string; lImgData: ByteP; lStart, lEnd,linvox_offset,lRApos,lDataType,lVolVox: integer): boolean; //loads BINARY data - ignore scaling: zero or not zero var lvox_offset,lInc,lFSize,lP2: integer; lFData: file; lImgName: string; lByteP: ByteP; lSmallIntP: SmallIntP; lSingle: single; begin result := false; if (lStart >= lEnd) or (lStart < 1) or (lEnd < 1) then begin MainForm.NPMmsg('Error: LoadImg '+inttostr(lStart)+'>='+inttostr(lEnd)+' or zero'); exit; end; if Files4D(lInName) then begin lImgName := Filename4D(lInName); lP2 := BPP (lDataType); if lP2 = 0 then begin Showmessage(lImgName +' is an unsupported file type'); exit; end; lvox_offset := linvox_offset+ ((Vol4D(lInName)-1)* (lP2 * lVolVox)); end else begin lImgName := lInName; lvox_offset := linvox_offset; end; if UpCaseExt(lImgName) = '.HDR' then lImgName := changefileext(lImgName,'.img'); lFSize := FSize(lImgName); if (not GzExt(lImgName)) and (lFSize < (lEnd+ lvox_offset)) then begin MainForm.NPMmsg('Error: LoadImg '+lImgName+' FSize = '+inttostr(lFSize)+' Expected '+inttostr(lEnd+ lvox_offset)); exit; end; filemode := 0; //zero array for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := 0;//makesingle(lByteP^[lP2],lByteP^[lP2+1],lByteP^[lP2+2],lByteP^[lP2+3]); if GzExt(lImgName) then begin if lDataType = kDT_UNSIGNED_CHAR then begin getmem(lByteP, (lEnd+1)-lStart); UnGZip(lImgName,lByteP,lvox_offset+lStart-1,(lEnd+1)-lStart); for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := lByteP^[lInc]; freemem(lByteP); end else if (lDataType = kDT_SIGNED_SHORT) then begin //getmem(lSmallIntP, sizeof(smallint)* ((lEnd+1)-lStart)); getmem(lByteP, ((lEnd+1)-lStart)*sizeof(smallint)); UnGZip(lImgName,lByteP,lvox_offset+((lStart-1)*sizeof(smallint)),((lEnd+1)-lStart)*sizeof(smallint)); for lInc := 1 to ((lEnd+1)-lStart) do begin lP2 := ((lInc-1)*2)+1 ; lImgData^[lRApos+lInc-1] := makesmallint(lByteP^[lP2],lByteP^[lP2+1]); end; freemem(lByteP); end else if (lDataType = kDT_SIGNED_INT) or (lDataType = kDT_FLOAT) then begin getmem(lByteP, ((lEnd+1)-lStart)*sizeof(single)); UnGZip(lImgName,lByteP,lvox_offset+((lStart-1)*sizeof(single)),((lEnd+1)-lStart)*sizeof(single)); if lDataType = kDT_SIGNED_INT then begin for lInc := 1 to ((lEnd+1)-lStart) do begin lP2 := ((lInc-1)*4)+1 ; lSingle := conv4r4i (makesingle(lByteP^[lP2],lByteP^[lP2+1],lByteP^[lP2+2],lByteP^[lP2+3])); if lSingle <> 0 then lImgData^[lRApos+lInc-1] := 1; end; end else begin //32 bit float for lInc := 1 to ((lEnd+1)-lStart) do begin lP2 := ((lInc-1)*4)+1 ; lSingle := makesingle(lByteP^[lP2],lByteP^[lP2+1],lByteP^[lP2+2],lByteP^[lP2+3]); if (not specialsingle(lSingle)) and (lSingle <> 0) then lImgData^[lRApos+lInc-1] := 1; end; end; freemem(lByteP); end else begin showmessage(lImgName + ' is an unsupported compressed data type '+inttostr(lDataType)); exit; end; end else begin assignfile(lFdata,lImgName); if lDataType = kDT_UNSIGNED_CHAR then begin getmem(lByteP, (lEnd+1)-lStart); reset(lFdata,1); seek(lFdata,lvox_offset+lStart-1); BlockRead(lFdata, lByteP^, (lEnd+1)-lStart); for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := lByteP^[lInc]; freemem(lByteP); end else if (lDataType = kDT_SIGNED_SHORT) then begin getmem(lSmallIntP, sizeof(smallint)* ((lEnd+1)-lStart)); reset(lFdata,2); if (lvox_offset mod 2) <> 0 then begin showmessage('Error: this software can only read headers with dataoffsets that are divisible by 4.'); end; seek(lFdata,(lvox_offset div 2)+ (lStart-1)); BlockRead(lFdata, lSmallIntP^, (lEnd+1)-lStart); for lInc := 1 to ((lEnd+1)-lStart) do lImgData^[lRApos+lInc-1] := lSmallIntP^[lInc]; freemem(lSmallIntP); end else if (lDataType = kDT_SIGNED_INT) or (lDataType = kDT_FLOAT) then begin //next: 4 byte data reset(lFdata,4); if (lvox_offset mod 4) <> 0 then begin showmessage('Error: this software can only read headers with dataoffsets that are divisible by 4.'); end; seek(lFdata,(lvox_offset div 4)+ (lStart-1) ); getmem(lByteP, ((lEnd+1)-lStart)*sizeof(single)); //fx(((lEnd+1)-lStart)*sizeof(single)); BlockRead(lFdata, lByteP^, ((lEnd+1)-lStart)); //April 2009 //UnGZip(lImgName,lByteP,lvox_offset+((lStart-1)*sizeof(single)),((lEnd+1)-lStart)*sizeof(single)); if lDataType = kDT_SIGNED_INT then begin for lInc := 1 to ((lEnd+1)-lStart) do begin lP2 := ((lInc-1)*4)+1 ; lSingle := conv4r4i (makesingle(lByteP^[lP2],lByteP^[lP2+1],lByteP^[lP2+2],lByteP^[lP2+3])); if lSingle <> 0 then lImgData^[lRApos+lInc-1] := 1; end; end else begin for lInc := 1 to ((lEnd+1)-lStart) do begin lP2 := ((lInc-1)*4)+1 ; lSingle := makesingle(lByteP^[lP2],lByteP^[lP2+1],lByteP^[lP2+2],lByteP^[lP2+3]); if (not specialsingle(lSingle)) and (lSingle <> 0) then lImgData^[lRApos+lInc-1] := 1; end; end; freemem(lByteP); end else showmessage('Unsupported COMPRESSED data type '+inttostr(lDataType)); closefile(lFdata); end; //not gz result := true; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/montecarlo.pas0000664000175000017500000001727311326434470021330 0ustar michaelmichaelunit montecarlo; interface {$H+} {$DEFINE anacom} uses define_types,SysUtils, part,StatThds,statcr,StatThdsUtil,Brunner,DISTR,nifti_img, hdr, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,ExtCtrls,Menus, overlap,ReadInt,lesion_pattern,stats,LesionStatThds,nifti_hdr, {$IFDEF FPC} LResources,gzio2, {$ELSE} gziod,associate,{$ENDIF} //must be in search path, e.g. C:\pas\mricron\npm\math {$IFNDEF UNIX} Windows, {$ENDIF} upower,firthThds,firth,IniFiles,cpucount,userdir,math, regmult,utypes{$IFDEF anacom} ,anacom{$ENDIF}; procedure LesionMonteCarlo (lBinomial,lTTest,lBM: boolean); implementation uses npmform,filename,turbolesion; procedure RandomGroup(kSamplesPerTest: integer;lImageNames: TStrings;lSymptomRA: SingleP;var lPartImageNames: TStrings; var lPartSymptomRA: SingleP); var lTotal,lInc,lRand,lSwap: integer; lRanOrder: longintP; begin lPartImageNames.Clear; lTotal := lImageNames.Count; if kSamplesPerTest > lTotal then begin showmessage('Monte carlo error: population must be larger than sample size.'); exit; end; Getmem(lRanOrder,lTotal*sizeof(longint)); for lInc := 1 to lTotal do lRanOrder^[lInc] := lInc; for lInc := lTotal downto 2 do begin lRand := Random(lInc)+1; lSwap := lRanOrder^[lRand]; lRanOrder^[lRand] := lRanOrder^[lInc]; lRanOrder^[lInc] := lSwap; end; for lInc := 1 to kSamplesPerTest do begin lPartImageNames.Add(lImageNames.Strings[lRanOrder^[lInc]-1]);//indexed from 0 lPartSymptomRA^[lInc] := lSymptomRA^[lRanOrder^[lInc]]; end; Freemem(lRanOrder); end; procedure LesionMonteCarlo (lBinomial,lTTest,lBM: boolean); label 666; const kSimSampleSize = 64; knSim = 2; kCrit = 3; {$IFDEF anacom} knControls = 64; {$ENDIF} var lPrefs: TLDMPrefs ; lSim,lFact,lnFactors,lSubj,lnSubj,lnSubjAll,lMaskVoxels,lnCrit: integer; lPartImageNames,lImageNames,lImageNamesAll: TStrings; lPredictorList: TStringList; lTemp4D,lMaskname,lOutName,lFactname,lOutNameSim: string; lMaskHdr: TMRIcroHdr; lMultiSymptomRA,lSymptomRA,lPartSymptomRA: singleP; {$IFDEF anacom} lnControlObservations: integer; lControlSymptomRA: singleP; {$ENDIF} begin //lBinomial := not odd( (Sender as tMenuItem).tag); lPrefs.NULP := true{gNULP false}; if not lBinomial then begin lPrefs.BMtest := lbm;//BMmenu.checked; lPrefs.Ttest := lttest;//ttestmenu.checked; if (not lPrefs.BMtest) and (not lPrefs.ttest) then lPrefs.ttest := true; lPrefs.Ltest:= false; end else begin lPrefs.BMtest := false; lPrefs.Ttest := false; lPrefs.Ltest:= true; end; lPrefs.nCrit := kCrit; lPrefs.nPermute := 0;//MainForm.ReadPermute;; lPrefs.Run := 0;{0 except for montecarlo} if (not lBinomial) and (not lTTest) and (not lBM) then begin Showmessage('Error: you need to compute at least on test [options/test menu]'); exit; end; lImageNamesAll:= TStringList.Create; //not sure why TStrings.Create does not work??? lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? lPartImageNames := TStringList.Create; getmem(lPartSymptomRA,kSimSampleSize*sizeof(single)); {$IFDEF anacom} lnControlObservations := knControls; getmem(lControlSymptomRA,lnControlObservations*sizeof(single)); for lSim := 1 to lnControlObservations do lControlSymptomRA^[lSim] := 1000; {$ENDIF} //next, get 1st group if not MainForm.GetValX(lnSubjAll,lnFactors,lMultiSymptomRA,lImageNamesAll,lnCrit{,binom},lPredictorList) then begin showmessage('Error with VAL file'); goto 666; end; lTemp4D := CreateDecompressed4D(lImageNamesAll); if (lnSubjAll < 1) or (lnFactors < 1) or (lnSubjAll < kSimSampleSize) then begin Showmessage('Not enough subjects ('+inttostr(lnSubjAll)+') [sample size is '+inttostr(kSimSampleSize)+']or factors ('+inttostr(lnFactors)+').'); goto 666; end; lMaskname := lImageNamesAll[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; lOutName := ExtractFileDirWithPathDelim(lMaskName)+'results'; MainForm.SaveHdrDlg.Filename := loutname; lOutName := lOutName+'.nii.gz'; if not MainForm.SaveHdrName ('Base Statistical Map', lOutName) then goto 666; for lFact := 1 to lnFactors do begin lImageNames.clear; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then {$ENDIF} lImageNames.Add(lImageNamesAll[lSubj-1]); lnSubj := lImageNames.Count; if lnSubj > 1 then begin getmem(lSymptomRA,lnSubj * sizeof(single)); lnSubj := 0; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then begin {$ELSE} begin{$ENDIF} inc(lnSubj); lSymptomRA^[lnSubj] := lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)]; end; //randomization loop.... for lSim := 1 to knSim do begin RandomGroup(kSimSampleSize, lImageNames,lSymptomRA, lPartImageNames, lPartSymptomRA); lOutNameSim := AddIndexToFilename(lOutName,lSim); lnCrit := kCrit; MainForm.NPMMsgClear; //Msg(GetKVers); MainForm.NPMMsg('Threads: '+inttostr(gnCPUThreads)); lFactName := lPredictorList.Strings[lFact-1]; lFactName := LegitFilename(lFactName,lFact); MainForm.NPMMsg('Factor = '+lFactname); For lSubj := 1 to kSimSampleSize do MainForm.NPMMsg (lPartImageNames.Strings[lSubj-1] + ' = '+realtostr(lPartSymptomRA^[lSubj],2) ); MainForm.NPMMsg('Total voxels = '+inttostr(lMaskVoxels)); MainForm.NPMMsg('Only testing voxels damaged in at least '+inttostr(lnCrit)+' individual[s]'); MainForm.NPMMsg('Number of Lesion maps = '+inttostr(kSimSampleSize)); if not CheckVoxelsGroup(lPartImageNames,lMaskVoxels) then begin showmessage('File dimensions differ from mask.'); goto 666; end; lPrefs.Run := lSim; if lBinomial then TurboLDM (lPartImageNames, lMaskHdr, lPrefs, lPartSymptomRA, lFactname,lOutNameSim) else begin MainForm.ReportDescriptives(lPartSymptomRA,lnSubj); TurboLDM (lPartImageNames, lMaskHdr, lPrefs, lPartSymptomRA, lFactname,lOutNameSim); {$IFDEF anacom} AnacomLesionNPMAnalyze (lPartImageNames, lMaskHdr, lnCrit,lSim,lnControlObservations, lPartSymptomRA,lControlSymptomRA, lFactname,lOutNameSim,true,false); {$ENDIF} end; end; //for each simulation... Freemem(lSymptomRA); end; //lnsubj > 1 end; //for each factor if lnSubjAll > 0 then begin Freemem(lMultiSymptomRA); end; 666: lPartImageNames.free; lImageNames.Free; lImageNamesAll.Free; lPredictorList.Free; freemem(lPartSymptomRA); {$IFDEF anacom} freemem(lControlSymptomRA); {$ENDIF} DeleteDecompressed4D(lTemp4D); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/Mat.pas0000664000175000017500000024452411326434466017714 0ustar michaelmichaelunit Mat; { Basic Matrix Unit for Delphi, May 1996. Implemented using original iMAP C matrix library } { Use this instead of matrix } interface Uses SysUtils, Classes, Vector,dialogs; //var gMat: boolean = false; type EMatrixError = class (Exception); EMatrixSizeError = class (EMatrixError); ESingularMatrix = class (EMatrixError); ENonSquareMatrix = class (EMatrixError); TMatError = (Singular, NonSingular, NonSquare); { A Matrix is made up of a set of rows of type TRow, pTRow is a pointer to a single row and a matrix is a row of pTRows, this allows arrays larger then 65K to be built, the max size of a matrix is roughly 4096 MBytes } MatRA = array [1..1] of Double; Matp = ^MatRA; { forward declare the Matrix class } TMatrix = class; { Used by svdfit, supplies basis functions at x } BasisProc = procedure (x : TMatElement; var BasisFunc : TVector); { Define a dynamic matrix type for holding doubles } TMatrix = class (TObject) private nr, nc : integer; mx :matp;//: pTRowList; { pointer to a list of rows } procedure SetSize (ri, ci : integer); procedure FreeSpace; public constructor create (r, c : integer); overload; virtual; constructor create (n : integer); overload; virtual; constructor create (c : integer; d : array of TMatElement); overload; virtual; destructor destroy; override; procedure Setval (ri, ci : integer; v : TMatElement); function Getval (ri, ci : integer) : TMatElement; property M[x, y : Integer] : TMatElement read GetVal write SetVal; default; property r : integer read nr; property c : integer read nc; function IsSquare : boolean; function SameDimensions (m1, m2 : TMatrix) : boolean; function Identity : TMatrix; function Diagonal (k : TMatElement) : TMatrix; overload; function Diagonal (v : TVector) : TMatrix; overload; function Zero : TMatrix; function Ones : TMatrix; function L (ci :integer; d : array of TMatElement) : TMatrix; function transpose : TMatrix; overload; function transpose (m1 : TMatrix) : TMatrix; overload; function add (m1, m2 : TMatrix) : TMatrix; overload; function add (m1 : TMatrix) : TMatrix; overload; function sub (m1, m2 : TMatrix) : TMatrix; overload; function sub (m1 : TMatrix) : TMatrix; overload; function mult (m1 : TMatrix; k : TMatElement) : TMatrix; overload; function mult (k : TMatElement) : TMatrix; overload; function mult (m1, m2 : TMatrix) : TMatrix; overload; function copy (m1 : TMatrix) : TMatrix; procedure ExtractColumn (var v : TVector; cc : integer); procedure ExtractRow (var v : TVector; rr : integer); function ExchangeRows (r1, r2 : integer) : TMatrix; function ExchangeCols (c1, c2 : integer) : TMatrix; function Rank (echelon : TMatrix; eps : double) : integer; procedure Invert (inv : TMatrix); overload; procedure Invert; overload; procedure Invert2 (var dest, src : TMatrix; var col: TVector; var index : TVectori); function Det2 (m1 : TMatrix; var index : TVectori; var v : TVector): double; procedure SolveLinear (v, b : TVector; SelfToInv : boolean); procedure LUSolve (index : TVectori; b : TVector); procedure LUDecomp (m1 : TMatrix; index : TVectori); procedure LUDecomp2 (var m1 : TMatrix; var index : TVectori; var v : TVector); function MatMax: double; function MatAbsMax: double; function Det : double; procedure NullSpace (var NullVectors : TMatrix; var BasisSize : integer; var Echelon : TMatrix; var TheRank : integer); procedure svd (var u : TMatrix; var w : TVector; var v : TMatrix); procedure svd2 (var u : TMatrix; var w : TVector; var v : TMatrix); procedure svdSolve (var u : TMatrix; var w : TVector; var v : TMatrix; b : TVector; var x : TVector); function svdfit (x, y, yerr : TVector; var fit : TVector; var u, v : TMatrix; var w : TVector; funcs : BasisProc): TMatElement; procedure svdCovar (v : TMatrix; w : TVector; alpha : TMatrix); procedure eliminate_cms (S, Tk1 : TMatrix; var cr, N : integer); procedure ElementaryModes (D : TVectori; var mf, mb, C1, k : integer; Tk : TMatrix); class procedure Tableau (N, R1 : integer; var mf, mb, C1, k : integer; Tk, Tk1 : TMatrix); class function grecodiv_of_vector (N, R1 : integer; vec : TVector) : integer; class function grecodiv(P, Rest: integer) : integer; procedure Conserve(st : TMatrix); end; { ------------------------------------------------------------------------- } implementation const MATERROR = 'Matrix Operation Error:'; { ------------------------------------------------------------------------- } { START OF MATRIX IMPLEMETATION } { ------------------------------------------------------------------------- } { ------------------------- Constructors first ---------------------------- } { ******************************************************************** } { Usage: A := TMatrix.create (3, 2); } { ******************************************************************** } constructor TMatrix.create (r, c : integer); begin Inherited Create; nr := 0; nc := 0; mx := Nil; Self.SetSize (r, c); end; { ******************************************************************** } { Create an identity matrix } { } { Usage: A := TMatrix.createI (3); } { ******************************************************************** } constructor TMatrix.create (n : integer); var i : integer; begin Inherited Create; nr := 0; nc := 0; mx := Nil; Self.SetSize (n, n); for i := 1 to n do Self[i,i] := 1.0; end; { ******************************************************************** } { Create a matrix filled with values from array d given that the } { number of columns equals c. } { } { Usage: A := TMatrix.createLit (2, [1, 2, 3, 4]); } { Creates a 2 by 2 array } { ******************************************************************** } constructor TMatrix.create (c : integer; d : array of TMatElement); var i, j, ri, count : integer; begin Inherited Create; nr := 0; nc := 0; mx := Nil; ri := (High(d)+1) div c; Self.SetSize (ri, c); count := 0; for i := 1 to ri do for j := 1 to c do begin Self[i,j] := d[count]; inc (count); end; end; { ******************************************************************** } { Usage: A.destroy, use a.free in a program } { ******************************************************************** } destructor TMatrix.destroy; begin FreeSpace; Inherited Destroy; end; { Free the data space but not the object } procedure TMatrix.FreeSpace; //var i : integer; begin if mx <> Nil then begin FreeMem (mx); mx := Nil; end; end; { Internal routine used set size of matrix and allocate space } procedure TMatrix.SetSize (ri, ci : integer); //var i : integer; begin if (mx <> Nil) and ((ri*ci)= (nr*nc) ) then begin nr := ri; nc := ci; exit; end; //if gMat then beep; FreeSpace; nr := ri; nc := ci; //if gMat then beep; Getmem(mx,ri*ci*sizeof(TMatElement));//AllocMem (sizeof (pTRowList) * (nr+1)); { r+1 so that I can index from 1 } end; { ---------------------------------------------------------------------------- } { BASIC ROUTINES } { ---------------------------------------------------------------------------- } { ******************************************************************** } { Used internally but is also accessible from the outside } { } { Normal Usage: A[2, 3] := 1.2; } { } { ******************************************************************** } procedure TMatrix.Setval (ri, ci : integer; v : TMatElement); begin if ri > r then raise EMatrixSizeError.Create ('ri index out of range: ' + inttostr (ri)); if ci > c then raise EMatrixSizeError.Create ('ci index out of range: ' + inttostr (ci)); mx^[ri + ((ci-1)* r )] := v; end; { ******************************************************************** } { Used internally but is also accessible from the outside } { } { Normal Usage: d := A[2, 3]; } { } { ******************************************************************** } function TMatrix.Getval (ri, ci : integer) : TMatElement; begin result := mx^[ri + ((ci-1)* r )]; end; { ******************************************************************** } { Fill an existing matrix with the array d of numbers. ci equals } { the number of columns. } { } { Usage: A.L(3, [1, 2, 3, 4, 5, 6, 7, 8, 9]); } { } { ******************************************************************** } function TMatrix.L (ci :integer; d : array of TMatElement) : TMatrix; var i, j, ri, count : integer; begin ri := (High(d)+1) div ci; FreeMem (mx, sizeof (TMatElement) * nr * nc); Self.SetSize (ri, ci); count := 0; for i := 1 to ri do for j := 1 to ci do begin Self[i,j] := d[count]; inc (count); end; result := Self; end; { ******************************************************************** } { Set all elements to one } { } { Usage: A.Ones; } { } { ******************************************************************** } function TMatrix.Ones : TMatrix; var i, j : integer; begin for i := 1 to r do for j := 1 to c do Self[i,j] := 1.0; result := Self; end; { ******************************************************************** } { Zero the Self matrix } { } { Usage: A.Zero; } { } { ******************************************************************** } function TMatrix.Zero : TMatrix; var i, j : integer; begin for i := 1 to r do for j := 1 to c do Self[i,j] := 0.0; result := Self; end; { ******************************************************************** } { Returns true if matrices m1 and m2 have the same dimensions } { } { Usage: if SameDimensions (A, B) then } { } { ******************************************************************** } function TMatrix.SameDimensions (m1, m2 : TMatrix) : boolean; begin result := (m1.nr = m2.nr) and (m1.nc = m2.nc); { use nr, nc for direct access } end; { ******************************************************************** } { Returns true if matrix m is square } { } { Usage: if IsSquare then } { } { ******************************************************************** } function TMatrix.IsSquare : boolean; begin result := Self.nr = Self.nc; end; { ******************************************************************** } { Turn the matrix Self into an identify matrix } { } { Usage: A.Identity } { } { ******************************************************************** } function TMatrix.Identity : TMatrix; var i : integer; begin if Self.IsSquare then begin Self.Zero; for i := 1 to r do Self[i,i] := 1.0; result := Self; end else raise EMatrixSizeError.Create ('An identity matrix can only be formed from a square matrix'); end; { ******************************************************************** } { Make the matrix object a diagonal matrix with the value, k } { } { Usage: A.Diagonal (3.1415); } { } { ******************************************************************** } function TMatrix.Diagonal (k : TMatElement) : TMatrix; var i : integer; begin if Self.IsSquare then begin Self.Zero; for i := 1 to r do Self[i,i] := k; result := Self; end else raise EMatrixSizeError.Create ('Can only form a diagonal matrix from a square matrix'); end; { ******************************************************************** } { This forms a diagonal matrix from the elements of vector v. } { } { Usage: A.Diagonal (v) } { } { ******************************************************************** } function TMatrix.Diagonal (v : TVector) : TMatrix; var i : integer; begin if Self.IsSquare then begin if v.size = Self.nr then begin Self.zero; for i := 1 to r do Self[i,i] := v[i]; result := Self; end else raise EMatrixSizeError.Create ('Vector must be same size as matrix in DiagonalV'); end else raise EMatrixSizeError.Create ('Can only form a diagonal matrix from a square matrix'); end; { ******************************************************************** } { Transpose matrix 'Self', Self is thus destroyed and replaced } { } { Usage: A.transpose } { } { ******************************************************************** } function TMatrix.Transpose : TMatrix; var i, j : integer; tmp : TMatrix; begin if (r=1) or (c=1) then begin i := nr; nr := nc; nc := i; exit; end; tmp := TMatrix.create (c, r); try for i := 1 to r do for j := 1 to c do tmp [j,i] := Self[i,j]; Self.FreeSpace; Self.SetSize (tmp.nr, tmp.nc); { move data from transpose to Self } Self.Copy (tmp); finally tmp.Destroy; end; result := Self; end; { ******************************************************************** } { Transpose the matrix 'm' into Self } { } { Usage: T.transpose (A); Tranposes A and puts result into T } { Will also accept T.transpose (T) } { ******************************************************************** } function TMatrix.Transpose (m1 : TMatrix) : TMatrix; var i, j : integer; t : TMatrix; begin if (m1.r <> Self.c) and (m1.c <> Self.r) then raise EMatrixSizeError.Create ('Destination matrix has incorrect dimensions for transpose'); { If the user is trying to transpose itself.... } if Self = m1 then begin t := TMatrix.Create (r, c); try t.Copy (m1); for i := 1 to m1.r do for j := 1 to m1.c do Self[j,i] := t[i,j]; finally t.free; result := Self; end; exit; end; for i := 1 to m1.r do for j := 1 to m1.c do Self[j,i] := m1[i,j]; result := Self; end; { ******************************************************************** } { Copy matrix 'm' to Self, Self must exist and is overwritten } { in the process. This procedure does a fast deep copy of the matrix. } { } { Usage: B.Copy (A); performs the operation: B = A with deep copy } { } { ******************************************************************** } function TMatrix.Copy (m1 : TMatrix) : TMatrix; begin if ( r<> m1.r) or (c <> m1.c) then begin (*if r <> m.r then raise EMatrixSizeError.Create (MATERROR + #13#10'Cannot copy matrices with different sized rows: dest<' + inttostr (r) + '> src<' + inttostr (m.r) + '>') else raise EMatrixSizeError.Create (MATERROR + #13#10'Cannot copy matrices with different sized columns: dest<' + inttostr (c) + '> src<' + inttostr (m.c) + '>'); *) SetSize (self.r, self.c); end; { Copy a whole row at a time using move } //for i := 1 to r do move (m.mx^[i]^, Self.mx^[i]^, sizeof(TMatElement) * (c+1)); move(m1.mx^,self.mx^,r*c*sizeof(double)); // Copy over column and row names, clear destination first then copy result := Self; end; { ******************************************************************** } { Extract column cc from the Self matrix and return it as a TVector } { } { Usage: m.ExtractColumn (v, 1) extract column 1 from m and place in v} { } { ******************************************************************** } procedure TMatrix.ExtractColumn (var v : TVector; cc : integer); var i : integer; begin v.freeSpace; v.SetSize (Self.r); { Create result vector of appropriate size } for i := 1 to Self.r do v[i] := Self[i, cc]; end; { ******************************************************************** } { Extract rwo rr from the Self matrix and return it as a TVector } { } { Usage: m.ExtractRow (v, 1) extract row 1 from m and place in v } { } { ******************************************************************** } procedure TMatrix.ExtractRow (var v : TVector; rr : integer); var i : integer; begin v.freespace; v.SetSize (Self.c); for i := 1 to Self.c do v[i] := Self[rr, i]; end; { ******************************************************************** } { Add matrix 'm' to Self, giving a new Self } { } { Usage: A.addU (B); add B to A, giving A } { } { ******************************************************************** } function TMatrix.add (m1 : TMatrix) : TMatrix; var i, j : integer; begin if Not SameDimensions (m1, Self) then raise EMatrixSizeError.Create ('Incorrectly sized result matrix for matrix addition'); for i := 1 to r do for j := 1 to c do Self[i,j] := Self[i,j] + m1[i,j]; result := Self; end; { ******************************************************************** } { Add matrix 'm1' and 'm2' and assign to Self } { } { Usage: A.add (A1, A2); add A1 to A2 giving A } { } { ******************************************************************** } function TMatrix.add (m1, m2 : TMatrix) : TMatrix; var i, j : integer; begin if Not SameDimensions (m1, m2) then raise EMatrixSizeError.Create ('Incompatible matrix operands to add'); if Not SameDimensions (m1, Self) then raise EMatrixSizeError.Create ('Incorrectly sized result matrix for matrix addition'); for i := 1 to r do for j := 1 to c do Self[i,j] := m1[i,j] + m2[i,j]; result := Self; end; { ******************************************************************** } { Subtract matrix m from Self giving a new Self } { } { Usage: A.subU (B); subtract B from A giving A } { } { ******************************************************************** } function TMatrix.sub (m1 : TMatrix) : TMatrix; var i, j : integer; begin if Not SameDimensions (m1, Self) then raise EMatrixSizeError.Create ('Incorrecly sized result matrix for matrix subtraction'); for i := 1 to r do for j := 1 to c do Self[i,j] := Self[i,j] - m1[i,j]; result := Self; end; { ******************************************************************** } { Subtract m2 from m1 giving Self } { } { Usage: A.sub (A1, A2); subtract A2 from A1 giving A (A = A2 - A1) } { } { ******************************************************************** } function TMatrix.sub (m1, m2 : TMatrix) : TMatrix; var i, j : integer; begin if Not SameDimensions (m1, m2) then raise EMatrixSizeError.Create ('Incompatible matrix operands to subtract'); if Not SameDimensions (m1, Self) then raise EMatrixSizeError.Create ('Incorrectly sized result matrix for matrix subtraction'); for i := 1 to r do for j := 1 to c do Self[i,j] := m1[i,j] - m2[i,j]; result := Self; end; { ******************************************************************** } { Multiply a matrix 'm' by scalar constant k and assign result to Self } { } { Usage: A.multk (B, 0.5); multiply scalar, 0.5 by B giving A } { } { ******************************************************************** } function TMatrix.mult (m1 : TMatrix; k : TMatElement) : TMatrix; var i, j : integer; begin for i := 1 to m1.r do for j := 1 to m1.c do Self[i, j] := m1[i,j] * k; result := Self; end; { ******************************************************************** } { Multiply the Self matrix by the scalar constant k } { } { Usage: A.multKU (0.5); multiply scalar 0.5 by A giving A } { } { ******************************************************************** } function TMatrix.mult (k : TMatElement) : TMatrix; var i, j : integer; begin for i := 1 to r do for j := 1 to c do Self[i, j] := Self[i,j] * k; result := Self; end; { ******************************************************************** } { Multiply matrix 'm1' by 'm2' to give result in Self } { } { Usage: A.mult (A1, A2); multiply A1 by A2 giving A } { } { ******************************************************************** } function TMatrix.mult (m1, m2 : Tmatrix) : TMatrix; var i, j, k, m1_Col : integer; sum : TMatElement; begin if m1.c = m2.r then begin m1_col := m1.c; for i := 1 to Self.r do for j := 1 to Self.c do begin sum := 0.0; for k := 1 to m1_Col do sum := sum + m1[i, k]* m2[k, j]; Self[i,j] := sum; end; result := Self; end else raise EMatrixSizeError.Create ('Incompatible matrix operands to multiply'); end; { ******************************************************************** } { LU Solve. Solve the linear system represented by m and right-hand } { side b m is assumed have have been decomposed by LUDecomp } { } { Usage: m.LUSolve (index, b) } { } { ******************************************************************** } procedure TMatrix.LUSolve (index : TVectori; b : TVector); var i, j, ii, ip, nRows : integer; sum : TMatElement; begin ii := 0; nRows := r; for i := 1 to nRows do begin ip := index[i]; sum := b[ip]; b[ip] := b[i]; if ii <> 0 then for j := ii TO i-1 do sum := sum - Self[i,j]*b[j] else if sum <> 0.0 then ii := i; b[i] := sum; end; for i := nRows downto 1 do begin sum := b[i]; if i < nRows then for j := i+1 to nRows do sum := sum - Self[i,j]*b[j]; b[i] := sum/Self[i,i]; end end; { ******************************************************************** } { Form LU decomposition of Self matrix. Result goes into m } { } { Usage: m.LUDecomp(result, index); } { } { ******************************************************************** } procedure TMatrix.LUDecomp (m1 : TMatrix; index : TVectori); var v : TVector; i, k, j, imax, nRows : integer; sum, big, tmp : TMatElement; begin if Self.r = m1.c then begin m1.Copy (Self); v := TVector.Create (m1.r); try { Find the largest element in every row, and store its reciprocal in v[i] } nRows := m1.r; for i := 1 to nRows do begin big := 0.0; { needed to test for singularity } { Although we're working across columns we can use nRows since m1 is square } for j := 1 to nRows do if (abs(m[i,j]) > big) then big := abs(m[i,j]); if big = 0.0 then raise ESingularMatrix.Create ('LUDecomp: Singular matrix in LUDecomp, found row of zeros'); v[i] := 1.0/big end; for j := 1 TO nRows do begin { Form beta = aij - sum_k=1^i-1 aik * bkj } for i := 1 TO j-1 do begin sum := m[i,j]; for k := 1 to i-1 do sum := sum - m[i,k]*m[k,j]; m[i,j] := sum end; big := 0.0; for i := j to nRows do begin sum := m[i,j]; for k := 1 to j-1 do sum := sum - m[i,k]*m[k,j]; m[i,j] := sum; if v[i]*abs(sum) >= big then begin big := v[i]*abs(sum); imax := i end end; { Interchange rows if necessary } if j <> imax then begin { Swap row names aswell } for k := 1 to nRows do begin tmp := m[imax,k]; m[imax,k] := m[j,k]; m[j,k] := tmp end; v[imax] := v[j] end; index[j] := imax; { Get ready to divide by pivot element } if m[j,j] = 0.0 then raise ESingularMatrix.Create ('LUDecomp: Singular Matrix, pivot value is zero'); if j <> nRows then begin tmp := 1.0/m[j,j]; for i := j+1 to nRows do m[i,j] := m[i,j]*tmp end end; finally v.destroy; end; end else raise ENonSquareMatrix.Create ('LUDecomp: Matrix must be square'); end; //return max value in a matrix function TMatrix.MatMax : double; var i,j : integer; begin if (r < 1) or (c<1) then begin result := 0; exit; end; result := m[1,1]; for i := 1 to r do for j := 1 to c do if m[i, j] > result then result := m[i,j]; end; //return max value in a matrix function TMatrix.MatAbsMax : double; var i,j : integer; begin if (r < 1) or (c<1) then begin result := 0; exit; end; result := abs(m[1,1]); for i := 1 to r do for j := 1 to c do if abs(m[i, j]) > result then result := abs(m[i,j]); end; { ******************************************************************** } { Find determinant of matrix } { } { Usage: d := m.det } { } { ******************************************************************** } function TMatrix.Det : double; var m1 : TMatrix; index : TVectori; i : integer; begin result := 1; if r = c then begin index := TVectori.Create (r); m1 := TMatrix.Create (r,r); try m1.copy (Self); Self.LUDecomp (m1, index); for i := 1 to r do result := result * m1[i,i]; finally m1.free; index.free; end; end else raise ENonSquareMatrix.Create ('Determinant: Matrix must be square'); end; (*procedure wMatrix( lTitle: string; A : TMatrix); var lR,lC: integer; lStr: string; begin if (A.r < 1) or (A.c < 1) then exit; lStr := (lTitle)+chr($0D)+chr($0A); for lR := 1 to (A.r) do begin for lC := 1 to (A.c) do lStr := lStr + floattostr(A.Getval(lr, lc))+' '; lStr := lStr + chr($0D)+chr($0A); end; //each row showmessage(lStr); end;*) procedure TMatrix.LUDecomp2 (var m1 : TMatrix; var index : TVectori; var v : TVector); var i, k, j, imax, nRows : integer; sum, big, tmp : TMatElement; begin if Self.r = m1.c then begin m1.Copy (Self); //wmatrix('m1',m1); //v := TVector.Create (m.r); try { Find the largest element in every row, and store its reciprocal in v[i] } nRows := m1.r; for i := 1 to nRows do begin big := 0.0; { needed to test for singularity } { Although we're working across columns we can use nRows since m1 is square } for j := 1 to nRows do if (abs(m1[i,j]) > big) then big := abs(m1[i,j]); if big = 0.0 then raise ESingularMatrix.Create ('LUDecomp: Singular matrix in LUDecomp, found row of zeros'); v[i] := 1.0/big end; for j := 1 TO nRows do begin { Form beta = aij - sum_k=1^i-1 aik * bkj } for i := 1 TO j-1 do begin sum := m1[i,j]; for k := 1 to i-1 do sum := sum - m1[i,k]*m1[k,j]; m1[i,j] := sum end; big := 0.0; for i := j to nRows do begin sum := m1[i,j]; for k := 1 to j-1 do sum := sum - m1[i,k]*m1[k,j]; m1[i,j] := sum; if v[i]*abs(sum) >= big then begin big := v[i]*abs(sum); imax := i end end; { Interchange rows if necessary } if j <> imax then begin { Swap row names aswell } for k := 1 to nRows do begin tmp := m1[imax,k]; m1[imax,k] := m1[j,k]; m1[j,k] := tmp end; v[imax] := v[j] end; index[j] := imax; { Get ready to divide by pivot element } if m1[j,j] = 0.0 then raise ESingularMatrix.Create ('LUDecomp: Singular Matrix, pivot value is zero'); if j <> nRows then begin tmp := 1.0/m1[j,j]; for i := j+1 to nRows do m1[i,j] := m1[i,j]*tmp end end; finally //v.destroy; end; end else raise ENonSquareMatrix.Create ('LUDecomp: Matrix must be square'); end; function TMatrix.Det2 (m1 : TMatrix; var index : TVectori; var v : TVector): double; var i : integer; begin result := 1; if r = c then begin //index := TVectori.Create (r); //m := TMatrix.Create (r,r); try m1.copy (Self); Self.LUDecomp2 (m1, index,v); for i := 1 to r do result := result * m1[i,i]; finally //m.free; index.free; end; end else raise ENonSquareMatrix.Create ('Determinant: Matrix must be square'); end; { ******************************************************************** } { Solve a linear system of equations: Self.v = b, i.e solve for v } { } { Usage: A.SolveLinear (v, b, t); } { Solution in v } { If the boolean t is true then self is replaced by the inverse } { ******************************************************************** } procedure TMatrix.SolveLinear (v, b : TVector; SelfToInv : boolean); var n, i, j : integer; indx : TVectori; col : TVector; dest, src : TMatrix; begin if Self.r = Self.c then begin n := Self.r; { Make a copy and work on the copy } dest := TMatrix.Create (n, n); src := TMatrix.Create (n, n); indx := TVectori.Create (n); try src.Copy (Self); for i := 1 to n do v[i] := b[i]; src.LUDecomp (dest, indx); dest.LUSolve (indx, v); if SelfToInv then begin col := TVector.Create (n); try for j := 1 to n do begin for i := 1 to n do col[i] := 0.0; col[j] := 1.0; dest.LUSolve (indx, col); for i := 1 to n do Self[i,j] := col[i]; end; finally col.free; end; end; finally indx.destroy; dest.destroy; src.destroy; end; end else raise ENonSquareMatrix.Create ('SolveLinear: Matrix must be square'); end; { ******************************************************************** } { Fast method for inverting a matrix (Self) } { Result in inv } { } { Usage: A.Invert (inv); } { ******************************************************************** } procedure TMatrix.Invert2 (var dest, src : TMatrix; var col: TVector; var index : TVectori); var n, i, j : integer; begin n := Self.r; try src.Copy (Self); try //wmatrix('w1',src); src.LUDecomp2 (dest, index,col); //wmatrix('w2',src); except on ESingularMatrix do raise ESingularMatrix.Create ('Invert: Singular Matrix'); end; for j := 1 to n do begin for i := 1 to n do col[i] := 0.0; col[j] := 1.0; dest.LUSolve (index, col); for i := 1 to n do Self[i,j] := col[i]; end; finally //col.destroy; dest.destroy; src.destroy; index.destroy; end; end; procedure TMatrix.Invert (inv : TMatrix); var col : TVector; n, i, j : integer; dest, src : TMatrix; indx : TVectori; begin n := Self.r; col := TVector.Create (n); dest := TMatrix.Create (n, n); src := TMatrix.Create (n, n); indx := TVectori.Create (n); try src.Copy (Self); try src.LUDecomp (dest, indx); except on ESingularMatrix do raise ESingularMatrix.Create ('Invert: Singular Matrix'); end; for j := 1 to n do begin for i := 1 to n do col[i] := 0.0; col[j] := 1.0; dest.LUSolve (indx, col); for i := 1 to n do inv[i,j] := col[i]; end; finally col.destroy; dest.destroy; src.destroy; indx.destroy; end; end; { ******************************************************************** } { Fast method for inverting a matrix (Self) } { Result in Self } { } { Usage: A.Invert } { ******************************************************************** } procedure TMatrix.Invert; var col : TVector; n, i, j : integer; dest, src : TMatrix; index : TVectori; begin n := Self.r; col := TVector.Create (n); dest := TMatrix.Create (n, n); src := TMatrix.Create (n, n); index := TVectori.Create (n); try src.Copy (Self); try src.LUDecomp (dest, index); except on ESingularMatrix do raise ESingularMatrix.Create ('Invert: Singular Matrix'); end; for j := 1 to n do begin for i := 1 to n do col[i] := 0.0; col[j] := 1.0; dest.LUSolve (index, col); for i := 1 to n do Self[i,j] := col[i]; end; finally col.destroy; dest.destroy; src.destroy; index.destroy; end; end; { Internal routine that sets any values less than eps to 0.0 } procedure CleanUpMatrix (m : TMatrix; eps : double); var i, j, ri, ci : integer; begin { Removes all numbers close to zero, i.e between -eps and +eps } ri := m.r; ci := m.c; for i := 1 to ri do for j := 1 to ci do if abs (m [i, j]) < eps then m [i, j] := 0.0; end; { Internal routine to work out the rank of a matrix given the reduced row-echelon } function ComputeRank (m : TMatrix; eps : double) : integer; var i, j, ri, ci, rank : integer; begin ri := m.r; ci := m.c; { find the rank - brute force algorithm } rank := 0; { search row by row for zero rows } for i := 1 to ri do begin { search along the row looking for nonzero entry } for j := 1 to ci do if abs (m [i, j]) > eps then begin inc (rank); break; end; end; result := rank; end; { ******************************************************************** } { Routine to exchange two rows, r1 and r2 in matrix Self } { } { Usage: A.exchangeRows (1, 2); } { } { ******************************************************************** } function TMatrix.ExchangeRows (r1, r2 : integer) : TMatrix; var ci, i : integer; t : double; begin if (r1 > 0) and (r1 <= Self.r) and (r2 > 0) and (r2 <= Self.r) then begin ci := Self.c; for i := 1 to ci do begin t := Self[r1, i]; Self[r1, i] := Self[r2, i]; Self[r2, i] := t; end; result := Self; end else raise EMatrixSizeError.Create ('Rows not in range for exchange'); end; { ******************************************************************** } { Routine to exchange two columns, c1 and c2 in matrix Self } { } { Usage: A.exchangeCols (1, 2); } { } { ******************************************************************** } function TMatrix.ExchangeCols (c1, c2 : integer) : TMatrix; var ri, i : integer; t : double; begin if (c1 > 0) and (c1 <= Self.c) and (c2 > 0) and (c2 <= Self.c) then begin ri := Self.r; for i := 1 to ri do begin t := Self[c1, i]; Self[c1, i] := Self[c2, i]; Self[c2, i] := t; end; result := Self; end else raise EMatrixSizeError.Create ('Columns not in range for exchange'); end; { ******************************************************************** } { Find the rank r, of the matrix Self, The reduced Row } { echelon is returned in mat. eps is the magnitude of } { the largest number before it is assumed to be zero. } { } { Usage: r := A.Rank (echelon, 1e-8) } { Find the rank of A, place echelon in echelon } { } { ******************************************************************** } function TMatrix.Rank (echelon : TMatrix; eps : double) : integer; var Arow, Acol, i, j, n, m1, RowScan : integer; factor : double; begin echelon.copy (Self); { we work on mat, not Self } if (eps = 0.0) then eps := 1.0E-14; n := echelon.r; m1 := echelon.c; Arow := 1; Acol := 1; repeat { locate a nonzero column } if abs(echelon [Arow, Acol]) <= eps then { i.e equals zero } begin { First entry was zero, therefore work our way down the matrix looking for a nonzero entry, when found, swap it for Arow } RowScan := Arow; repeat { next row } inc (RowScan); { have we reached the end of the rows but we've still got columns left to scan } if (RowScan > n) and (Acol < m1) then begin { reset row counter back to where it was and try next column } RowScan := Arow; inc (Acol); end; { If we've scanned the whole matrix, so lets get out... } if (RowScan > n) then begin CleanUpMatrix (echelon, eps); result := ComputeRank (echelon, eps); exit; end; until abs (echelon [RowScan, Acol]) > eps; { keep searching until non-zero entry found } { We've found a nonzero row entry so swap it with 'Arow' which did have a zero as its entry } echelon.exchangeRows (Arow, RowScan); end; { Arow now holds the row of interest } factor := 1.0/echelon [Arow, Acol]; { reduce all the entries along the column by the factor } for i := Acol to m1 do echelon[Arow,i] := echelon[Arow, i] * factor; { now eliminate all entries above and below Arow, this generates the reduced form } for i := 1 to n do { miss out Arow itself } if (i <> Arow) and (abs (echelon [i, Acol]) > eps) then begin factor := echelon [i, Acol]; { work your way along the column doing the same operation } for j := Acol to m1 do echelon[i,j] := echelon [i, j] - factor * echelon [Arow, j]; end; inc (Arow); inc (Acol); until (Arow > n) or (Acol > m1); CleanUpMatrix (echelon, eps); result := ComputeRank (echelon, eps); { This is just a patch for the moment } end; (* Algorithm 1. Reduce matrix to reduced echelon form 2. There will be as many null space vectors as there are non-leading columns. Select one of these non-leading columns. 3. Select the ith non-leading column and place a 1 at the ith position in the growing null space vector 4. Consider the remaining non-leading columns, say j,k,l... and place zero's at positions j,k,l... in the growing null vector. 5. Consider now the column positions of the leading columns, say l,m,n... The equivalent entries in the growing null space are what remains to be filled in. Select each of these leading columns in turn, say the lth first. Record which row the leading one is in, say r. Then place at position l in the growing null space vector, the element -1 * element (r, i) where i is the original ith non-leading column selected in step 3. Continue for leading columns m,n... until the growing null space vector is complete. 6. Go back to step 2 and pick another non-leading column to compute the next null space vector. Does not disturb the matrix Self. Null space to be found in NullVectors, size of the basis in BasisSize, the reduced row-echelon in Echelon and the rank in TheRank } Usage: A.NullSpace (N, b, Echelon, r); *) procedure TMatrix.NullSpace (var NullVectors : TMatrix; var BasisSize : integer; var Echelon : TMatrix; var TheRank : integer); var eps, x: double; i, j, k : integer; mask : TVectori; tmpNullVectors : TMatrix; VectorCounter, maskcount : integer; minus999, minus888, EchelonCols : integer; begin try eps := 0.000000001; minus999 := -999; { leading column } minus888 := -888; { non-leading column } if NullVectors <> Nil then NullVectors.free; if Echelon <> Nil then Echelon.free; tmpNullVectors := TMatrix.Create (Self.c, Self.c); Echelon := TMatrix.Create (Self.r, Self.c); EchelonCols := Echelon.c; mask := TVectori.create (EchelonCols); // STEP 1 k := Self.Rank (Echelon, eps); TheRank := k; k := Self.c - TheRank; BasisSize := k; if BasisSize > 0 then begin for i := 1 to EchelonCols do mask [i] := minus888; for i := 1 to Echelon.r do begin { scan along columns looking for a leading one } j := 1; repeat x := Echelon[i, j]; if (x > -eps) and (x < eps) then { check if its practically zero } Echelon [i, j] := 0.0; if (x > 1.0-eps) and (x < 1.0+eps) then { x is then = 1.0 } begin mask [j] := minus999; { tag as leading column } j := 0; { exit signal } end else j := j + 1; until (j = 0) or (j > EchelonCols); end; { end row scan } { Find non-leading columns } VectorCounter := 1; i := 1; { i = column counter, check all columns } repeat for j := 1 to EchelonCols do tmpNullVectors[j, VectorCounter] := minus888; { STEP 5 } { remember, all minus888's in mask = non-leading columns } if mask [i] = minus888 then { found a non-leading column } begin j := 1; { move down mask } for maskcount := 1 to EchelonCols do if (mask [maskcount] = minus999) then begin tmpNullVectors[maskcount, VectorCounter] := -Echelon[j, i]; inc (j); end; { STEP 4 } { zero all -888 (free) entries } for j := 1 to EchelonCols do if tmpNullVectors[j, VectorCounter] = minus888 then tmpNullVectors[j, VectorCounter] := 0.0; { STEP 2 AND 3 } { mark free variable } tmpNullVectors[i, VectorCounter] := 1.0; VectorCounter := VectorCounter + 1; end; inc (i); until i > EchelonCols; end else begin BasisSize := 0; NullVectors := Nil; end; finally if BasisSize > 0 then begin NullVectors := TMatrix.Create (Self.c, BasisSize); for i := 1 to Self.c do for j := 1 to BasisSize do NullVectors[i,j] := tmpNullVectors[i,j]; end; mask.free; tmpNullVectors.free; end; end; function sign (a, b : TMatElement) : TMatElement; begin if b >= 0.0 then result := abs (a) else result := -abs(a); end; function max (a, b : TMatElement) : TMatElement; begin if a > b then result := a else result := b; end; { Compute sqrt (a^2 + b^2) using numerically more stable method. If x = sqrt(a^2 + b^2), then, x/a^2 = 1/a^2 sqrt (a^2 + b^2), mult both sides by sqrt(..), so x/a^2 * sqrt (a^2 + b^2) = 1/a^2 (a^2 + b^2) or x/a^2 * sqrt (a^2 + b^2) = 1 + (b/a)^2 but on left side 1/a^2 sqrt(a^2 + b^2) equals x/a^2, therefore x * x/a^2 = 1 + (b/a) ^2, take square roots on both side yields: x/a := sqrt (1+(b/a)^2), or FINALLY: x := a sqrt (1 + (b/a)^2) } function pythag (a, b : TMatElement) : TMatElement; var at, bt, ct : TMatElement; begin result := sqrt (a*a + b*b); exit; at := abs (a); bt := abs (b); if at > bt then begin ct := bt/at; result := at*sqrt (1 + ct*ct); end else begin if bt > 0 then begin ct := at/bt; result := bt*sqrt (1 + ct*ct); end else result := 0.0; end; end; function MyAbs (x : TMatElement) : TMatElement; begin if x < 0.0 then x := -x; result := x; end; {procedure TMatrix.svd2 (var u : TMatrix; var w : TVector; var v : TMatrix);} procedure TMatrix.svd2 (var u : TMatrix; var w : TVector; var v : TMatrix); LABEL 1,2,3; CONST nmax=100; VAR n, m1, nm, l1, k, j, jj, its, i : integer; z, y, x, scale, s, h, g, f, cc, anorm : real; rv1 : TVector; //Aug : TMatrix; AugMatrix : boolean; function sign(a,b: TMatElement): TMatElement; begin if (b >= 0.0) then sign := abs(a) else sign := -abs(a) end; function max(a,b: TMatElement): TMatElement; begin if (a > b) then max := a else max := b end; begin m1 := r; n := c; AugMatrix := false; (*if m < n then begin { More parameters than data ! Change structure of Self by augmenting Self with additional rows (entries set to zero) so that m = n, don't change m or n though } {Aug := TMatrix.Create (n, n); Aug.zero; try for i := 1 to m do for j := 1 to n do Aug[i,j] := Self[i,j]; u.FreeSpace; u.SetSize (n, n); u.Copy (Aug); AugMatrix := true; finally Aug.free; end; end else*) u.Copy(Self); { Work on U, don't destroy Self } if AugMatrix then rv1 := TVector.Create (n) { Make enough room } else rv1 := TVector.Create (m1); { Save some space } g := 0.0; scale := 0.0; anorm := 0.0; FOR i := 1 TO n DO BEGIN l1 := i+1; rv1[i] := scale*g; g := 0.0; s := 0.0; scale := 0.0; IF (i <= m1) THEN BEGIN FOR k := i TO m1 DO scale := scale + Myabs(u[k,i]); IF (Myabs(scale) > 1e-12) THEN BEGIN {IF (scale <> 0.0) THEN BEGIN} for k := i to m1 do begin u[k,i] := u[k,i]/scale; s := s + u[k,i]*u[k,i] end; f := u[i,i]; g := -sign(sqrt(s),f); h := f*g-s; u[i,i] := f-g; if (i <> n) then begin for j := l1 to n do begin s := 0.0; for k := i to m1 do s := s + u[k,i]*u[k,j]; f := s/h; for k := i to m1 do u[k,j] := u[k,j] + f*u[k,i]; end end; for k := i to m1 do u[k,i] := scale*u[k,i] END END; w[i] := scale*g; g := 0.0; s := 0.0; scale := 0.0; IF ((i <= m1) AND (i <> n)) THEN BEGIN for k := l1 to n do scale := scale + Myabs(u[i,k]); if (Myabs(scale) > 1e-12) then begin {if (scale <> 0.0) then begin} for k := l1 to n do begin u[i,k] := u[i,k]/scale; s := s + u[i,k]*u[i,k] end; f := u[i,l1]; g := -sign(sqrt(s),f); h := f*g-s; u[i,l1] := f-g; for k := l1 to n do rv1[k] := u[i,k]/h; if (i <> m1) then begin for j := l1 to m1 do begin s := 0.0; for k := l1 to n do s := s + u[j,k]*u[i,k]; for k := l1 to n do u[j,k] := u[j,k] + s*rv1[k]; end end; for k := l1 to n do u[i,k] := scale*u[i,k]; END END; anorm := max(anorm,(Myabs(w[i]) + Myabs(rv1[i]))) END; FOR i := n DOWNTO 1 DO BEGIN IF (i < n) THEN BEGIN if (Myabs(g) > 1e-12) then {IF (g <> 0.0) THEN} begin for j := l1 to n do v[j,i] := (u[i,j]/u[i,l1])/g; for j := l1 to n do begin s := 0.0; for k := l1 to n do s := s + u[i,k]*v[k,j]; for k := l1 to n do v[k,j] := v[k,j] + s*v[k,i] end end; for j := l1 to n do begin v[i,j] := 0.0; v[j,i] := 0.0; end END; v[i,i] := 1.0; g := rv1[i]; l1 := i end; FOR i := n DOWNTO 1 DO BEGIN l1 := i+1; g := w[i]; if (i < n) then for j := l1 to n do u[i,j] := 0.0; if (Myabs(g) > 1e-12) then {IF (g <> 0.0) THEN} begin g := 1.0/g; IF (i <> n) THEN begin for j := l1 to n do begin s := 0.0; for k := l1 to m1 do s := s + u[k,i]*u[k,j]; f := (s/u[i,i])*g; for k := i to m1 do u[k,j] := u[k,j] + f*u[k,i]; end end; for j := i to m1 do u[j,i] := u[j,i]*g; end else begin for j := i to m1 do u[j,i] := 0.0; end; u[i,i] := u[i,i]+1.0 END; FOR k := n DOWNTO 1 DO BEGIN FOR its := 1 TO 30 DO BEGIN for l1 := k downto 1 do begin nm := l1-1; if ((Myabs(rv1[l1]) + anorm) - anorm < 1e-12) then goto 2; {if ((Myabs(rv1[l]) + anorm) = anorm) then goto 2;} if ((Myabs(w[nm]) + anorm) - anorm < 1e-12) then goto 1 {if ((Myabs(w[nm]) + anorm) = anorm) then goto 1} end; 1: cc := 0.0; s := 1.0; for i := l1 to k do begin f := s*rv1[i]; if ((Myabs(f) + anorm) - anorm > 1e-12) then {if ((Myabs(f)+anorm) <> anorm) then} begin g := w[i]; h := sqrt(f*f+g*g); w[i] := h; h := 1.0/h; cc := (g*h); s := -(f*h); for j := 1 to m1 do begin y := u[j,nm]; z := u[j,i]; u[j,nm] := (y*cc)+(z*s); u[j,i] := -(y*s)+(z*cc) end end end; 2: z := w[k]; if (l1 = k) then begin if (z < 0.0) then begin w[k] := -z; for j := 1 to n do v[j,k] := -v[j,k]; end; GOTO 3 end; if (its = 30) then writeln ('no convergence in 30 SVDCMP iterations'); x := w[l1]; nm := k-1; y := w[nm]; g := rv1[nm]; h := rv1[k]; f := ((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y); g := sqrt(f*f+1.0); f := ((x-z)*(x+z)+h*((y/(f+sign(g,f)))-h))/x; cc := 1.0; s := 1.0; for j := l1 to nm do begin i := j+1; g := rv1[i]; y := w[i]; h := s*g; g := cc*g; z := sqrt(f*f+h*h); rv1[j] := z; cc := f/z; s := h/z; f := (x*cc)+(g*s); g := -(x*s)+(g*cc); h := y*s; y := y*cc; for jj := 1 to n do begin x := v[jj,j]; z := v[jj,i]; v[jj,j] := (x*cc)+(z*s); v[jj,i] := -(x*s)+(z*cc) end; z := sqrt(f*f+h*h); w[j] := z; if (Myabs(z) > 1e-12) then {if (z <> 0.0) then} begin z := 1.0/z; cc := f*z; s := h*z end; f := (cc*g)+(s*y); x := -(s*g)+(cc*y); for jj := 1 to m1 do begin y := u[jj,j]; z := u[jj,i]; u[jj,j] := (y*cc)+(z*s); u[jj,i] := -(y*s)+(z*cc) end end; rv1[l1] := 0.0; rv1[k] := f; w[k] := x END; 3: END END; { Perform a Singular Value Decompostion on self, returning u, w, and v, modified from Numerical Recipes and Forsythe et al 1977, Computer methods for Math Calc } procedure TMatrix.svd (var u : TMatrix; var w : TVector; var v : TMatrix); label 3; var i, j, k, l1, n, m1, its, flag, nm, jj : integer; rv1 : TVector; scale, g, h, f, anorm, s, cc, x, y, z : TMatElement; Aug : TMatrix; AugMatrix : boolean; begin m1:= r; n := c; AugMatrix := false; if m1 < n then begin { More parameters than data ! Change structure of Self by augmenting Self with additional rows (entries set to zero) so that m = n, don't change m or n though } Aug := TMatrix.Create (n, n); Aug.zero; try for i := 1 to m1 do for j := 1 to n do Aug[i,j] := Self[i,j]; u.FreeSpace; u.SetSize (n, n); u.Copy (Aug); AugMatrix := true; finally Aug.free; end; end else u.Copy(Self); { Work on U, don't destroy Self } scale := 0.0; g := 0.0; anorm := 0.0; if AugMatrix then rv1 := TVector.Create (n) { Make enough room } else rv1 := TVector.Create (m1); { Save some space } try for i := 1 to n do begin l1 := i + 1; rv1[i] := scale * g; g := 0.0; s := 0.0; scale := 0.0; if i <= m1 then begin for k := i to m1 do scale := scale + abs (u[k,i]); if scale <> 0.0 then begin for k := i to m1 do begin u[k, i] := u[k, i] / scale; s := s + u[k,i]*u[k,i]; end; f := u[i,i]; g := -sign (sqrt (s), f); h := f*g - s; u[i,i] := f - g; if i <> n then begin for j := l1 to n do begin s := 0.0; for k := i to m1 do s := s + u[k,i]*u[k,j]; f := s/h; for k := i to m1 do u[k,j] := u[k,j] + f*u[k,i]; end; end; for k := i to m1 do u[k,i] := u[k,i] * scale; end; end; w[i] := scale * g; g := 0.0; s := 0.0; scale := 0.0; if (i <= m1) and (i <> n) then begin for k := l1 to n do scale := scale + abs (u[i,k]); if scale <> 0.0 then begin for k := l1 to n do begin u[i,k] := u[i,k] / scale; s := s + u[i,k]*u[i,k]; end; f := u[i,l1]; g := -sign(sqrt (s), f); h := f*g - s; u[i,l1] := f - g; for k := l1 to n do rv1[k] := u[i,k]/h; if i <> m1 then begin for j := l1 to m1 do begin s := 0.0; for k := l1 to n do s := s + u[j,k]*u[i,k]; for k := l1 to n do u[j,k] := u[j,k] + s*rv1[k]; end; end; for k := l1 to n do u[i,k] := u[i,k] * scale; end; end; anorm := max (anorm, abs(w[i]) + abs(rv1[i])); end; { ------------------------------------------ } { Accumulation of right-hand transformations } for i := n downto 1 do begin if i < n then begin if g <> 0.0 then begin for j := l1 to n do v[j,i] := (u[i,j]/u[i,l1])/g; for j := l1 to n do begin s := 0.0; for k := l1 to n do s := s + u[i,k]*v[k,j]; for k := l1 to n do v[k,j] := v[k,j] + s*v[k,i]; end; end; for j := l1 to n do begin v[i,j] := 0.0; v[j,i] := 0.0; end; end; v[i,i] := 1.0; g := rv1[i]; l1 := i; end; { ------------------------------------------ } { Accumulation of left-hand transformations } for i := n downto 1 do begin l1 := i + 1; g := w[i]; if i < n then for j := l1 to n do u[i,j] := 0.0; if g <> 0.0 then begin g := 1.0/g; if i <> n then begin for j := l1 to n do begin s := 0.0; for k := l1 to m1 do s := s + u[k,i]*u[k,j]; f := (s/u[i,i])*g; for k := i to m1 do u[k,j] := u[k,j] + f*u[k,i]; end; end; for j := i to m1 do u[j,i] := u[j,i] * g; end else begin for j := i to m1 do u[j,i] := 0.0; end; u[i,i] := u[i,i] + 1.0; end; { --------------------------------------------- } { Diagonalization of the bidiagonal form } for k := n downto 1 do begin for its := 1 to 30 do begin flag := 1; for l1 := k downto 1 do begin nm := l1 - 1; if abs (rv1[l1] + anorm) = anorm then begin flag := 0; break; end; if abs (w[nm] + anorm) = anorm then break; end; if flag <> 0 then begin cc := 0.0; s := 1.0; for i := l1 to k do begin f := s * rv1[i]; if (abs (f) + anorm) <> anorm then begin g := w[i]; h := pythag (f, g); w[i] := h; h := 1.0/h; cc := g*h; s := -f*h; for j := 1 to m1 do begin y := u[j,nm]; z := u[j, i]; u[j,nm] := y*cc + z*s; u[j,i] := z*cc - y*s; end; end; end; end; z := w[k]; if l1 = k then begin if z < 0.0 then begin w[k] := -z; for j := 1 to n do v[j,k] := -v[j,k]; end; {break;} goto 3; end; if (its = 30) then raise Exception.Create ('Exceeded iterations in SVD routine'); x := w[l1]; nm := k - 1; y := w[nm]; g := rv1[nm]; h := rv1[k]; f := ((y - z)*(y + z) + (g - h)*(g + h))/(2.0*h*y); g := pythag (f, 1.0); f := ((x - z) * (x + z) + h*((y/(f + sign(g, f))) - h))/x; cc := 1.0; s := 1.0; for j := l1 to nm do begin i := j + 1; g := rv1[i]; y := w[i]; h := s*g; g := cc*g; z := pythag (f, h); rv1[j] := z; cc := f/z; s := h/z; f := x*cc + g*s; g := g*cc - x*s; h := y*s; y := y*cc; for jj := 1 to n do begin x := v[jj,j]; z := v[jj,i]; v[jj,j] := x*cc + z*s; v[jj,i] := z*cc - x*s; end; z := pythag (f, h); w[j] := z; if z <> 0 then begin z := 1.0/z; cc := f*z; s := h*z; end; f := (cc*g) + (s*y); x := (cc*y) - (s*g); for jj := 1 to m1 do begin y := u[jj,j]; z := u[jj,i]; u[jj,j] := y*cc + z*s; u[jj,i] := z*cc - y*s; end; end; rv1[l1] := 0.0; rv1[k] := f; w[k] := x; 3: end; end; finally rv1.free; end; if AugMatrix then begin { This means that originally m < n, therefore u has some junk rows, remove them here } Aug := TMatrix.Create (m1, n); try for i := 1 to m1 do for j := 1 to n do Aug[i,j] := u[i,j]; u.FreeSpace; u.SetSize (m1, n); u.Copy (Aug); finally Aug.free; end; end; end; { Call this after having called svd, computes x = V [diag (1/wj)]. U^t.b } procedure TMatrix.svdSolve (var u : TMatrix; var w : TVector; var v : TMatrix; b : TVector; var x : TVector); var j, i, n, m1 : integer; s: TMatElement; tmp: TVector; begin m1 := u.r; n := u.c; tmp := TVector.Create (u.c); try { Compute diag (1/wj) . U^t . b } for j := 1 to n do begin s := 0.0; if (w[j] <> 0.0) then begin for i := 1 to m1 do s := s + u[i,j]*b[i]; s := s/w[j] end; tmp[j] := s end; { ...mult by V to get solution vector x } for i := 1 to n do begin s := 0.0; for j := 1 to w.size do s := s + v[i,j]*tmp[j]; x[i] := s end; finally tmp.free; end; end; { Solves the equation: (A.a - b)^2 = 0 for a. Where, A is the 'design matrix', Aij = Xj(xi)/sigi, where Xj is the value of the jth basis function; b is the set of weighted observed y values, b = yi/sigi; and a is the set of fitting coefficients for the basis functions. Thus A.a - b expresses predicted - observed } { BasisProc is a procedure which must return in an array the values for the basis functions at a particular value of xi, i.e it computes, Xj(xi) } function TMatrix.svdfit (x, y, yerr : TVector; var fit : TVector; var u, v : TMatrix; var w : TVector; funcs : BasisProc): TMatElement; const tol=1.0e-5; var i, j : integer; wmax, weight, thresh, sum: TMatElement; BasisVal, b : TVector; A : TMatrix; begin BasisVal := TVector.Create (fit.size); b := TVector.Create (x.size); A := TMatrix.Create (x.size, fit.size); try { Form the A matrix } for i := 1 to x.size do begin funcs(x[i], BasisVal); weight := 1.0/yerr[i]; for j := 1 to fit.size do A[i,j] := BasisVal[j]*weight; b[i] := y[i]*weight end; A.svd (u, w, v); wmax := 0.0; for j := 1 to fit.size do if (w[j] > wmax) then wmax := w[j]; thresh := tol*wmax; for j := 1 to fit.size do if (w[j] < thresh) then w[j] := 0.0; svdSolve (u, w, v, b, fit); result := 0.0; { chisqr set to zero ready to accumulate } for i := 1 to x.size do begin funcs(x[i], BasisVal); sum := 0.0; for j := 1 to fit.size do sum := sum + fit[j]*BasisVal[j]; result := result + sqr((y[i]-sum)/yerr[i]); { Accumulate chisqr } end; finally BasisVal.free; A.free; b.free; end; end; procedure TMatrix.svdCovar (v : TMatrix; w : TVector; alpha : TMatrix); var i, j, k : integer; wti : TVector; sum : TMatElement; begin wti := TVector.Create (w.size); try for i := 1 to w.size do begin wti[i] := 0.0; if w[i] > 0.0 then wti[i] := 1.0/(w[i]*w[i]); end; for i := 1 to w.size do begin for j := 1 to i do begin sum := 0.0; for k := 1 to w.size do sum := sum + v[i,k]*v[j,k]*wti[k]; alpha[j,i] := sum; alpha[i,j] := alpha[j,i]; end; end; finally wti.free; end; end; procedure TMatrix.eliminate_cms (S, Tk1 : TMatrix; var cr, N : integer); (* eliminating conserved moieties *) var i,j,x,y,crc,old_cr : byte; begin x := 0; cr := 0; (* cr - conservation relations *) for i := 1 to N do begin old_cr := cr; for j := i+1 to N do begin crc := 0; (* crc - cr counter *) // S.c = number of reactions for y := 1 to S.c do crc := crc + trunc (abs(S[i,y]+S[j,y])); if crc = 0 then cr := cr+1; end; if cr = old_cr then begin x := x+1; for y := 1 to S.c do Tk1[x,y] := S[i,y]; end; end; end; procedure TMatrix.ElementaryModes (D : TVectori; var mf, mb, C1, k : integer; Tk : TMatrix); var i, j, cr, N, k1 : integer; Tk1 : TMatrix; hlpRow : TVector; begin N := Self.r; Tk1 := TMatrix.Create (Self.r, Self.c); hlpRow := TVector.Create (Self.c); try {eliminate_cms; (* also transscribing S into Tk1 *) N := N-cr; for i := 1 to R do begin for j := 1 to N do Tk[i,j] := Tk1[j,i]; (* transposing matrix *) for j:=N+1 to N+R do if i=j-N then Tk[i,j]:=1 (* appending.. *) else Tk[i,j]:=0; (*..unity matrix*) end; (* (preliminary) fund. rows to the top *) i := 0; (* splitting indices into F/B *) for j := 1 TO R DO begin if (D[j] <> 0) then begin i := i+1; hlprow := Tk[i]; Tk[i] := Tk[j]; Tk[j] := hlprow; end; end; mf := i; (* no. of fundamental rows *) mb := R-mf;} eliminate_cms (Self, Tk1, cr, N); (* also transscribing S into Tk1 *) N := N-cr; for i := 1 to Self.c do begin for j := 1 to N do Tk[i,j] := Tk1[j,i]; (* transposing matrix *) for j := N+1 to N+Self.c do if i=j-N then Tk[i,j] := 1 (* appending.. *) else Tk[i,j] := 0; (*..unity matrix*) end; (* (preliminary) fund. rows to the top *) i := 0; (* splitting indices into F/B *) for j := 1 TO Self.c DO begin if (D[j] <> 0) then begin i := i+1; for k1 := 1 to Self.c do hlprow[k1] := Tk[i,k1]; for k1 := 1 to Self.c do Tk[i,k1] := Tk[j,k1]; for k1 := 1 to Self.c do Tk[j,k1] := hlprow[k1]; //hlprow := Tk[i]; //Tk[i] := Tk[j]; //Tk[j] := hlprow; end; end; mf := i; (* no. of fundamental rows *) mb := Self.c-mf; (* no. of basis rows *) Tableau (N, Self.c, mf, mb, C1, k, Tk, Tk1); finally hlpRow.Free; Tk1.Free; end; end; class function TMatrix.grecodiv(P, Rest: integer) : integer; var old_Rest : integer; begin grecodiv := 1; if (Rest*P <> 0) then begin if ABS(P) < ABS(Rest) then begin old_Rest := Rest; Rest := P; P := old_Rest; (* swap P 'n' R *) end; repeat (* Euclidean Algorithm: *) old_Rest := Rest; Rest := P mod old_Rest; P := old_Rest; until (Rest = 0); grecodiv := P; end else if (P = 0) then begin if (Rest = 0) then grecodiv := 1 else grecodiv := Rest; end else grecodiv := P; end; class function TMatrix.grecodiv_of_vector (N, R1 : integer; vec : TVector) : integer; var x : byte; coeff : integer; begin coeff := trunc (vec[1]); for x := 2 to (N+R1) do begin if (vec[x] <> 0) then coeff := grecodiv(trunc (vec[x]), coeff); end; grecodiv_of_vector := coeff; end; class procedure TMatrix.Tableau (N, R1 : integer; var mf, mb, C1, k : integer; Tk, Tk1 : TMatrix); var i,j,k1,x,xa,y,m1 : integer; cf,dir,ifrom,iend : integer; index,bool,allow_comb : boolean; l1 : integer; vec : TVector; begin C1 := R1; (* C: number of rows of the tableau *) k := 0; (* k: tableau index *) vec := TVector.Create (Tk1.c); repeat //output; (* HELPFUL MONITORING*) //write(' k = ');writeln(k);writeln('cf=',cf); (* OF TABLEAU STEPS *) {write(' Press to continue.'); readln;} l1 := 1; (* l: row index in the tableau k+1 *) cf := 0; (* counter for f-rows in the tableau k+1*) for dir :=1 to 2 do BEGIN IF dir=1 THEN BEGIN ifrom:=1; iend:=mf; END ELSE BEGIN ifrom:=mf+1; iend:=c1 END; FOR i := ifrom TO iend DO BEGIN IF Tk[i,k+1] = 0 THEN (* copying rows that *) BEGIN (* have a zero element *) for k1 := 1 to Tk1.c do Tk1[l1, k1] := Tk[i, k1]; (* already *) //Tk1[l] := Tk[i]; (* already *) l1 := l1+1; IF i <= mf THEN cf := cf+1; END END; FOR i:=ifrom TO iend DO BEGIN IF Tk[i,k+1]<>0 THEN BEGIN FOR j := i+1 TO C1 DO BEGIN IF Tk[j,k+1] <> 0 THEN BEGIN IF Tk[i,k+1]*Tk[j,k+1] > 0 THEN BEGIN (* not for f-rows with *) IF j <= mf THEN allow_comb := false (* same signum *) ELSE BEGIN FOR y := 1 TO N+R1 DO Tk[j,y] := -1 * Tk[j,y]; (* invert b-row *) allow_comb := true; END; END ELSE allow_comb := true; IF allow_comb THEN BEGIN index:=true; (* first simplicity (S) test: *) IF (l1>1) THEN BEGIN IF dir=1 THEN x:=0 ELSE x:=cf; WHILE (x Tk[i,y] THEN bool:=false; UNTIL (y=n+r1)or NOT bool; IF (y=n+r1)and bool THEN index:=false; END; END; IF index THEN BEGIN (* combine rows *) FOR y:=1 TO R1+N DO Tk1[l1,y]:=abs(Tk[i,k+1])*Tk[j,y]+abs(Tk[j,k+1])*Tk[i,y]; for k1 := 1 to Tk1.c do vec[i] := Tk1[l1,k1]; m1:= Grecodiv_of_vector(N, R1, vec) ; //m:= Grecodiv_of_vector(Tk1[l]) ; IF (ABS(m1)<>1) AND (m1<>0) THEN FOR y:=1 to R1+N DO Tk1[l1,y]:= trunc (Tk1[l1,y]) DIV ABS(m1); l1:= l1+1; IF i <= mf THEN cf := cf+1; (* second simplicity (S) test: *) IF dir=1 THEN x:=0 ELSE x:=cf; bool:=true; WHILE (XTk[i,y]) OR (Tk1[x,y]<>Tk[j,y]) THEN bool:=true; UNTIL (y=n+r1)or bool; IF (y=n+r1)and NOT(bool) THEN BEGIN {writeln('Jetzt hat folgende Zeile:'); FOR Y:=n+1 to n+r DO write(Tk1[x,y]:3); writeln; writeln('x=',x); writeln; writeln('l-1=',l-1); writeln('verloren gegen folgende Zeilen:'); FOR Y:=n+1 to n+r DO write(Tk[i,y]:3); writeln; writeln('i=',i); FOR Y:=n+1 to n+r DO write(Tk[j,y]:3); writeln; writeln('j=',j); writeln; writeln(x,'+1te Zeile:'); FOR Y:=n+1 to n+r DO write(Tk1[x+1,y]:3); writeln;} FOR xa:=x TO l1-2 DO BEGIN FOR y:=1 TO n+r1 DO Tk1[xa,y]:=Tk1[xa+1,y]; END; l1:=l1-1; IF x<=cf THEN cf:=cf-1; END; END; END; END; END; END; END; END; END; C1 := l1-1; (* new no. of rows *) mf := cf; mb := C1-mf; k := k+1; (* next tableau *) for i := 1 to C1 do begin for k1 := 1 to Tk.c do Tk[i, k1] := Tk1[i, k1]; (* restarting with Tk1 *) end; //for i := 1 to C do Tk[i] := Tk1[i]; (* restarting with Tk1 *) until (k = N) or ((mb = 0) and (mf = 0)); //if ((mb = 0) and (mf = 0)) then // writeln(' There exist neither irreversible nor reversible flux modes.') //else // output; vec.Free; end; // Evaluate conservation relations, uses the algorthim: tr(ns(tr(m))) procedure TMatrix.Conserve(st : TMatrix); var tmp, ns, echelon : TMatrix; b, r1 : integer; begin tmp := TMatrix.Create (st.c, st.r); ns := TMatrix.Create (1,1); echelon := TMatrix.Create (1,1); try tmp.Transpose (st); tmp.NullSpace (ns, b, Echelon, r1); Self.SetSize (ns.c, ns.r); Self.Transpose (ns); finally ns.free; echelon.free; tmp.free; end; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/lesion_pattern.pas0000664000175000017500000000477711326434466022225 0ustar michaelmichaelunit lesion_pattern; interface uses define_types; Type TLesionPattern = RECORD lowest, lo,hi,highest : int64; end; function SetOrderX (var lObs: Bytep; var lObsCount: integer): TLesionPattern ; function SameOrder(lO1,lO2: TLesionPattern; lObsCount: integer): boolean; function EmptyOrder: TLesionPattern; procedure SetBit(lPos: integer; var lVal: TLesionPattern); const kMaxBit = 63; kMaxBitx2 = 2*kMaxBit; kMaxBitx3 = 3*kMaxBit; kMaxObs = {126}kMaxBit*4; implementation var lPowerRA: array [1..kMaxBit] of int64; procedure SetBit(lPos: integer; var lVal: TLesionPattern); begin if (lPos <= kMaxBit) then lVal.Lowest := lVal.Lowest + lPowerRA[lPos] else if (lPos <= kMaxBitx2) then lVal.Lo := lVal.Lo + lPowerRA[lPos-kMaxBit] else if (lPos <= kMaxBitx3) then lVal.Hi := lVal.Hi + lPowerRA[lPos-kMaxBitx2] else lVal.Highest := lVal.Highest + lPowerRA[lPos-kMaxBitx3]; end; function EmptyOrder: TLesionPattern; begin result.lowest := 0; result.lo := 0; result.hi := 0; result.highest := 0; end; function SameOrder(lO1,lO2: TLesionPattern; lObsCount: integer): boolean; begin result := false; if lObsCount > kMaxObs then exit; if (lO1.lowest = lo2.lowest) and (lO1.highest = lO2.highest) and (lO1.lo = lo2.lo) and (lO1.hi = lO2.hi) then result := true else result := false; end; (*function SetOrder (var lObs: Singlep; var lObsCount: integer): TLesionPattern ; var lPos: integer; begin result := EmptyOrder; if ( lObsCount > kMaxObs) or (lObsCount < 1) then exit; for lPos := 1 to lObsCount do if lObs[lPos] <> 0 then SetBit(lPos,result); end; function SetOrderI (var lObs: LongIntp; var lObsCount: integer): TLesionPattern ; var lPos: integer; begin result := EmptyOrder; if ( lObsCount > kMaxObs) or (lObsCount < 1) then exit; for lPos := 1 to lObsCount do if lObs[lPos] <> 0 then SetBit(lPos,result); end;*) function SetOrderX (var lObs: Bytep; var lObsCount: integer): TLesionPattern ; var lPos: integer; begin result := EmptyOrder; if ( lObsCount > kMaxObs) or (lObsCount < 1) then exit; for lPos := 1 to (lObsCount) do if lObs^[lPos] <> 0 then SetBit(lPos,result); end; var lPowerPos: integer; initialization lPowerRA[1] := 1; for lPowerPos := 2 to kMaxBit do lPowerRA[lPowerPos] := lPowerRA[lPowerPos-1]*2; end. mricron-0.20120505.1~dfsg.1.orig/npm/LesionStatThds.pas0000664000175000017500000004507711354612360022075 0ustar michaelmichaelunit LesionStatThds; interface uses SysUtils, ComCtrls,Classes, Graphics, ExtCtrls, define_types,stats,StatThdsUtil,Brunner,lesion_pattern; type TLesionStatThread = class(TThread) private lBarX: TProgressBar; lttestx,lBMx: boolean; lnCritx,lBarPosX,lnPermuteX,lThreadx,lThreadStartx,lThreadEndx,lStartVoxx,lVoxPerPlankx, lImagesCountx,lControlsx : integer; lPlankImgx:ByteP; lOutImgMnx,lOutImgBMx,lOutImgTx,lOutImgAUCX,lSymptomRAx: SingleP; //lBarX: TProgressBar; procedure DoVisualSwap; protected procedure Execute; override; procedure VisualProg(lPos: Integer); procedure Analyze(lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg:bytep;lOutImgMn,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA: SingleP); virtual; abstract; public constructor Create(lBar: TProgressBar;lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg:ByteP;lOutImgMn,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA: SingleP); end; { Lesion - image reveals value } TLesionContinuous = class(TLesionStatThread ) protected procedure Analyze(lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg: byteP;lOutImgMn,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA: SingleP); override; end; TLesionBinom = class(TLesionStatThread ) protected procedure Analyze(lChi2,lLieber: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg: byteP;lOutImgMn,lOutImgL,lOutImgX,lOutImgAUC,lSymptomRA: SingleP); override; end; implementation (*procedure OutStr(lStr: string); var lOutname: string; f: TextFile; begin lOutname:='c:\fx.txt'; if fileexists(lOutname) then begin { open a text file } AssignFile(f, lOutname); Append(f); Writeln(f, lStr); Flush(f); { ensures that the text was actually written to file } { insert code here that would require a Flush before closing the file } CloseFile(f); end; end; *) Const Two32 = 4294967296.0 ; function GenRandThreaded(lRange: integer; var lRandSeed:comp): integer; //normal random function does not work well when threaded - randseed is changed by each thread const lFactor = $08088405 ; lTerm = 1 ; type lT = array [0..1] of longint ; var lX: extended; begin lRandSeed := lRandSeed*lFactor + lTerm; lT(lRandSeed)[1] := 0 ; // < May'04 was: RS := RS - Trunc(RS/Two32)*Two32 ; lX := lRandSeed/Two32 ; result := trunc((lRange)*lX); end; procedure GenPermuteThreaded (lnSubj: integer; var lOrigOrder,lRanOrder: DoubleP0; var lRandSeed:comp); var lInc,lRand: integer; lSwap: double; begin Move(lOrigOrder^,lRanOrder^,lnSubj*sizeof(double)); for lInc := lnSubj downto 2 do begin lRand := GenRandThreaded(lInc,lRandSeed); lSwap := lRanOrder^[lRand]; lRanOrder^[lRand] := lRanOrder^[lInc-1]; lRanOrder^[lInc-1] := lSwap; end; end; procedure StatPermuteThreaded (lttest,lBM: boolean; lnSubj, lnGroup0,lnPermute,lThread: integer;var lOrigOrder: DoubleP0); var lInc: integer; lOutT,lDF,lBMz: double; lRS: Comp; lRanOrderp: pointer; lRanOrder: Doublep0; begin if (lnSubj < 1) or (lnPermute < 1) then exit; createArray64(lRanOrderp,lRanOrder,lnSubj); lRS := 128; for lInc := 1 to lnPermute do begin GenPermuteThreaded(lnSubj, lOrigOrder,lRanOrder,lRS); //generate random order of participants if lttest then begin TStat2 (lnSubj, lnGroup0, lRanOrder, lOutT); if lOutT > gPermuteMaxT[lThread,lInc] then gPermuteMaxT[lThread,lInc] := lOutT; if lOutT < gPermuteMinT[lThread,lInc] then gPermuteMinT[lThread,lInc] := lOutT; end; //compute ttest if lBM then begin //BMTest (lnSubj, lnGroup0, lRanOrder,lOutT); tBM (lnSubj, lnGroup0, lRanOrder,lBMz,lDF); lBMz := BMzVal (lnSubj, lnGroup0,lBMz,lDF); if lBMz > gPermuteMaxBM[lThread,lInc] then gPermuteMaxBM[lThread,lInc] := lBMz; if lBMz < gPermuteMinBM[lThread,lInc] then gPermuteMinBM[lThread,lInc] := lBMz; end; //compute BM end; freemem(lRanOrderp); end; procedure GenPermuteThreadedBinom (lnSubj: integer; var lOrigOrder,lRanOrder: ByteP0; var lRandSeed:comp); var lInc,lRand: integer; lSwap: byte; begin Move(lOrigOrder^,lRanOrder^,lnSubj); for lInc := lnSubj downto 2 do begin lRand := GenRandThreaded(lInc,lRandSeed); lSwap := lRanOrder^[lRand]; lRanOrder^[lRand] := lRanOrder^[lInc-1]; lRanOrder^[lInc-1] := lSwap; end; end; procedure StatPermuteBinomialThreaded (lnSubj, lnGroup0,lnPermute,lThread: integer;var lOrigOrder: ByteP0); var lInc: integer; lOutP: double; lRS: Comp; lRanOrder: byteP0; //lRanOrderp: pointer; //lRanOrder: Doublep0; begin if (lnSubj < 1) or (lnPermute < 1) then exit; //createArray64(lRanOrderp,lRanOrder,lnSubj); getmem(lRanOrder,lnSubj); lRS := 128; for lInc := 1 to lnPermute do begin GenPermuteThreadedBinom(lnSubj, lOrigOrder,lRanOrder,lRS); //generate random order of participants (*if lChi2 then begin Chi2 (lnSubj, lnGroup0, lRanOrder, lOutT); if lOutT > gPermuteMaxT[lThread,lInc] then gPermuteMaxT[lThread,lInc] := lOutT; if lOutT < gPermuteMinT[lThread,lInc] then gPermuteMinT[lThread,lInc] := lOutT; end; //compute ttest if lLieber then begin*) //Liebermeister2bP (lnSubj, lnGroup0, lRanOrder,lOutP); Liebermeister2bP (lnSubj, lnGroup0, lRanOrder,lOutP); if (lOutP > 0) and (lOutP < gPermuteMinT[lThread,lInc]) then begin //negative correlation //fx(lOutP, gPermuteMinBM[lThread,lInc]); gPermuteMinT[lThread,lInc] := lOutP; end; if (lOutP < 0) and ( lOutP > gPermuteMaxT[lThread,lInc]) then //negative correlation gPermuteMaxT[lThread,lInc] := lOutP; //end; //compute BM end; freemem(lRanOrder); end; procedure TLesionStatThread .DoVisualSwap; begin lBarX.Position := lBarPosX; end; procedure TLesionStatThread .VisualProg(lPos: Integer); begin lBarPosX := lPos; {$IFDEF FPC}Synchronize(@DoVisualSwap); {$ELSE} Synchronize(DoVisualSwap);{$ENDIF} end; constructor TLesionStatThread .Create(lBar: TProgressBar; lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg: byteP;lOutImgMn,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA: SingleP); begin lBarX := lBar; lttestx := lttest; lBMx:= lBM; lThreadX := lThread; lThreadStartX := lThreadStart; lThreadEndX := lThreadEnd; lStartVoxx := lStartVox; lVoxPerPlankx := lVoxPerPlank; lImagesCountX := lImagesCount; lControlsX := lControlsIn; lPlankImgx := lPlankImg; lOutImgMnx := lOutImgMn; lOutImgBMx := lOutImgBM; lOutImgTx := lOutImgT; lOutImgAUCx := lOutImgAUC; lSymptomRAx := lSymptomRA; lnPermuteX := lnPermute; lnCritX := lnCrit; FreeOnTerminate := True; inherited Create(False); end; { The Execute method is called when the thread starts } procedure TLesionStatThread .Execute; begin Analyze(lttestx,lBMx, lnCritX,lnPermuteX,lThreadx,lThreadStartx,lThreadEndx,lStartVoxx,lVoxPerPlankx,lImagesCountx,lControlsx,lPlankImgX,lOutImgMnx,lOutImgBMx,lOutImgTx,lOutImgAUCx,lSymptomRAx); end; procedure TLesionContinuous.Analyze (lttest,lBM: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIN : integer; lPlankImg:bytep;lOutImgMn,lOutImgBM,lOutImgT,lOutImgAUC,lSymptomRA: SingleP); //pattern variables const knPrevPattern = 10; var lPrevPatternRA: array[1..knPrevPattern] of TLesionPattern; lPattern: TLesionPattern; lPrevZValsT,lPrevZValsBM,lPrevAUCVals: array [1..knPrevPattern] of Single; lPatternPos: integer; lLesionOrderp: bytep; //standard variables var lStr: string; lObstp,lObsp: pointer; lObst,lObs: Doublep0; lT,lBMz,lDF: Double; lObsB: bytep0; lnLesion,lnNoLesion,lPosPct,lPos,lPos2,lPos2Offset,lnControl, lnControlsPlusLesion,lnControlsPlusPatients : integer; begin //statthread //init patterns lnControl := abs(lControlsIn); if lControlsIn < 0 then begin //binomial getmem(lObsB, lImagesCount+lnControl); end; lnControlsPlusPatients := lImagesCount+lnControl; for lPatternPos := 1 to knPrevPattern do lPrevPatternRA[lPatternPos] := EmptyOrder; lPatternPos := 1; //lMaxLesion := lImagesCount-lnCrit; getmem(lLesionOrderp, lImagesCount *sizeof(byte)); //now init standard variables createArray64(lObsp,lObs,lnControlsPlusPatients); lPosPct := (lThreadEnd-lThreadStart) div 100; //if lThread = 1 then // OutStr( inttostr(lThreadStart)+':'+inttostr(lThreadEnd)); //xxxxx for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; lnNoLesion := 0; for lPos := 1 to lImagesCount do begin if lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2] = 0 then begin //no lesion inc(lnNoLesion); lLesionOrderp^[lPos] := 0; lObs^[lnNoLesion-1] := lSymptomRA^[lPos]; end else begin //lesion inc(lnLesion); lLesionOrderp^[lPos] := 1; //lObs^[lImagesCount-lnLesion] := lSymptomRA^[lPos]; //note: lObs indexed from zero! lObs^[lImagesCount-lPos+lnNoLesion] := lSymptomRA^[lPos]; //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCrit) and (lnLesion > 0) and (lnLesion < lImagesCount) then begin //when there are 0 lesions or all lesions there is no variability! inc(gnVoxTestedRA[lThread]); //now check if we have seen this precise lesion order recently... lPattern := SetOrderX (lLesionOrderp,lImagesCount); lPos := 1; while (lPos <= knPrevPattern) and not (SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount)) do inc(lPos); if SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount) then begin //lesion pattern is not novel if lttest then lOutImgT^[lPos2Offset] := lPrevZvalsT[lPos]; if lBM then lOutImgBM^[lPos2Offset] := lPrevZvalsBM[lPos]; if lOutImgAUC <> nil then lOutImgAUC^[lPos2Offset] := lPrevAUCvals[lPos]; end else begin //lesion pattern is novel //record novel pattern inc(lPatternPos); if lPatternPos > knPrevPattern then lPatternPos := 1; lPrevPatternRA[lPatternPos] := lPattern; lnControlsPlusLesion := lnControlsPlusPatients; if (lControlsIn > 0) {and (lnLesion > 0)} then begin //anaCOm createArray64(lObstp,lObst,lImagesCount); for lPos := 1 to lImagesCount do lObst^[lPos-1] := lObs^[lPos-1]; for lPos := 1 to lnLesion do lObs^[lPos-1+lnControl] := lObst^[lPos-1+lnNoLesion]; freemem(lObstP); for lPos := 1 to lnControl do lObs^[lPos-1] := lSymptomRA^[lPos+lImagesCount]; lnControlsPlusLesion := lnControl+lnLesion; lnNoLesion := {lnNoLesion +} lnControl; end;//controls (*if lPos2 = 2570879 then begin //xxxx for lPos := 1 to lImagesCount do begin outstr(inttostr(lPos)+'>'+floattostr(lObs^[lPos-1]) ); end; end;*) if lttest then begin if lControlsIn > 0 then begin//anacom TStat2Z (lnControlsPlusLesion, lnControl {lnNoLesion},lObs,lT); (* if lPos2 = 2570879 then begin outstr( floattostr(lT)+ ' '+inttostr(lnControl)); //xxxx for lPos := 1 to lnControlsPlusLesion do begin outstr(inttostr(lPos)+', '+floattostr(lObs^[lPos-1]) ); end; end; *) end else TStat2 (lnControlsPlusLesion, lnNoLesion, lObs,lT); lOutImgT^[lPos2Offset] := lT; lPrevZValsT[lPatternPos] := lT; end; if lBM then begin tBM (lnControlsPlusLesion, lnNoLesion, lObs,lBMz,lDF); lBMz := BMzVal (lnControlsPlusPatients, lnNoLesion,lBMz,lDF); lOutImgBM^[lPos2Offset] := lBMz; lPrevZValsBM[lPatternPos] := lBMz; end; if lOutImgAUC <> nil then begin lOutImgAUC^[lPos2Offset] := continROC (lnControlsPlusLesion, lnNoLesion, lObs); lPrevAUCVals[lPatternPos] := lOutImgAUC^[lPos2Offset]; end; StatPermuteThreaded (lttest,lBM,lImagesCount, lnNoLesion,lnPermute,lThread, lObs); end; //novel lesion pattern end; //in brain mask - compute end; //for each voxel freemem(lObsP); freemem(lLesionOrderp); if lControlsIn < 0 then //binomial freemem(lObsB); end; procedure TLesionBinom.Analyze (lChi2,lLieber: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lControlsIn : integer; lPlankImg: bytep;lOutImgMn,lOutImgL,lOutImgX,lOutImgAUC,lSymptomRA: SingleP); //procedure TLesionBinomial.Analyze (lChi2,lLieber: boolean; lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount,lnGroup1 : integer; lMaskImg,lPlankImg,lOutImgMn,lOutImgL,lOutImgX,lSymptomRA: SingleP); //pattern variables const knPrevPattern = 10; var lPrevPatternRA: array[1..knPrevPattern] of TLesionPattern; lPattern: TLesionPattern; lPrevZValsL ,lPrevAUCVals: array [1..knPrevPattern] of Single; lPatternPos: integer; lLesionOrderp: bytep; //standard variables var //lObsp: pointer; //lObs: Doublep0; lPrevZVals lObs: ByteP0; lAUC,lZ: Double; lnLesion,lPosPct,lPos,lPos2,lPos2Offset,lnVoxTested: integer; begin //Binomial StatThread //init patterns for lPatternPos := 1 to knPrevPattern do lPrevPatternRA[lPatternPos] := EmptyOrder; lPatternPos := 1; getmem(lLesionOrderp, lImagesCount *sizeof(byte)); //now init standard variables //createArray64(lObsp,lObs,lImagesCount); getmem(lObs,lImagesCount); lPosPct := (lThreadEnd-lThreadStart) div 100; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; for lPos := 1 to lImagesCount do begin if ((gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]) = 0 then begin //no lesion lObs^[lImagesCount-lPos+lnLesion] := round(lSymptomRA^[lPos]); lLesionOrderp^[lPos] := 0; end else begin //lesion inc(lnLesion); lLesionOrderp^[lPos] := 1; lObs^[lnLesion-1] := round(lSymptomRA^[lPos]); //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCrit) and (lnLesion > 0) and (lnLesion < lImagesCount) then begin //when there are 0 lesions or all lesions there is no variability! inc(gnVoxTestedRA[lThread]); //next check patterns lPattern := SetOrderX (lLesionOrderp,lImagesCount); lPos := 1; while (lPos <= knPrevPattern) and not (SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount)) do inc(lPos); if SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount) then begin //lesion pattern is not novel //if lChi2 then // lOutImgX^[lPos2Offset] := lPrevZvalsX[lPos]; //if lLieber then lOutImgL^[lPos2Offset] := lPrevZvalsL[lPos]; if lOutImgAUC <> nil then lOutImgAUC^[lPos2Offset] := lPrevAUCvals[lPos]; end else begin //lesion pattern is novel //record novel pattern inc(lPatternPos); if lPatternPos > knPrevPattern then lPatternPos := 1; lPrevPatternRA[lPatternPos] := lPattern; {if lChi2 then begin Chi2 (lImagesCount, lnLesion, lObs,lT); lOutImgX^[lPos2Offset] := lT;//lT; lPrevZValsX[lPatternPos] := lT; end; if lLieber then begin} Liebermeister2b(lImagesCount, lnLesion, lObs,lAUC,lZ); if lOutImgAUC <> nil then lOutImgAUC^[lPos2Offset] := lAUC; lPrevAUCVals[lPatternPos] := lAUC; lOutImgL^[lPos2Offset] := lZ; lPrevZValsL[lPatternPos] := lZ; //end; StatPermuteBinomialThreaded (lImagesCount, lnLesion,lnPermute,lThread, lObs); end; end; //in brain mask - compute end; //for each voxel freemem(lObs); freemem(lLesionOrderp) end; end. mricron-0.20120505.1~dfsg.1.orig/npm/hdr.pas0000664000175000017500000005026611477115514017743 0ustar michaelmichaelunit hdr; interface {$H+} uses nifti_hdr,define_types,classes; procedure MakeStatHdr (var lBGHdr,lStatHdr: TniftiHdr; lMinIntensity,lMaxIntensity,lIntent_p1,lIntent_p2,lIntent_p3: single; lIntent_code: smallint;lIntentName: string); procedure MakeHdr (var lBGHdr,lStatHdr: TniftiHdr); function NIFTIhdr_SaveHdrImg (var lFilename: string; var lHdr: TNIFTIHdr; lAllowOverwrite,lSPM2,lSingleFile: boolean;var lImg: SingleP; lnVol: integer): boolean; function NIFTIhdr_SaveHdrImg8 (var lFilename: string; var lHdr: TNIFTIHdr; lAllowOverwrite,lSPM2,lSingleFile: boolean;var lImg: ByteP; lnVol: integer): boolean; function Files4D (lFilename: string): boolean; function Vol4D (lFilename: string): integer; function FileExists4D (lFilename: string): boolean; function Filename4D(lFilename: string): string; function FilenameVol4D (lFilename: string; var lBaseName: string; var lVol: integer): boolean; function NIFTIhdr_HdrVolumes (lFilenameIn: string): integer; function BPP (lDataType: integer): integer; function CreateDecompressed4D(var lImageNames: TStrings): string; function CheckVoxels(var lHdrNameIn : string; lMaskVoxels, lImageNumber: integer):boolean; //function CheckVoxelsGroupX(var lG: TStrings; lMaskVoxels: integer):boolean; function CheckVoxelsGroupX(var lG: TStrings; lMaskHdr: TMRIcroHdr): boolean; //function CheckVoxelsGroupY(var lG: TStrings):boolean; procedure DeleteDecompressed4D(lDecomName: string); implementation uses {$IFDEF FPC} gzio2,Controls, {$ELSE} {gzio,ZLib,}DiskSpaceKludge,gziod,{$ENDIF} {$IFNDEF UNIX}Windows, {$ENDIF} Dialogs ,SysUtils,StatThdsUtil,npmform; //define_types,GraphicsMathLibrary; {$IFDEF FPC} {$mode objfpc}{$H+} {$ENDIF} procedure MsgX (lStr: string); begin //msgx end; procedure DeleteDecompressed4D(lDecomName: string); begin if lDecomName = '' then exit; if not fileexists(lDecomName) then exit; sysutils.deletefile(lDecomName); end; function CheckVoxels(var lHdrNameIn : string; lMaskVoxels, lImageNumber: integer):boolean; var lHdr: TMRIcroHdr; lHdrName: string; lVox: integer; begin result := false; lHdrName := Filename4D(lHdrNameIn); if not NIFTIhdr_LoadHdr(lHdrName,lHdr) then begin MainForm.NPMmsg('Unable to load image '+lHdrName); exit; end; lVox := ComputeImageDataBytes8bpp(lHdr); if lVox <> lMaskVoxels then begin MainForm.NPMmsg('Voxels differ for '+lHdrName+' expected '+inttostr(lMaskVoxels)+' described '+inttostr(lVox)); exit; end; (*if (lHdr.NIFTIhdr.bitpix <> 8) and (lHdr.NIFTIhdr.datatype <> kDT_FLOAT) and (lHdr.NIFTIhdr.datatype <> kDT_SIGNED_INT) then begin showmessage('Error: This software can only read uncompressed images that are either 8-bit integer or 32-bit real precision.'); exit; end; //beta *) if UpCaseExt(lHdrName) = '.HDR' then lHdrName := changefileext(lHdrName,'.img'); if (not GzExt(lHdrName) ) and (FSize(lHdrName) < lMaskVoxels) then begin showmessage('The uncompressed image data should be at least '+inttostr(lMaskVoxels)+' bytes. '+lHdrName); exit; end; result := true; //gBitPixRA[lImageNumber] := lHdr.NIFTIhdr.bitpix; gDataTypeRA[lImageNumber] := lHdr.NIFTIhdr.datatype; gOffsetRA[lImageNumber] := lHdr.NIFTIhdr.vox_offset; gScaleRA[lImageNumber] := lHdr.NIFTIhdr.scl_slope; gInterceptRA[lImageNumber] := lHdr.NIFTIhdr.scl_inter; end; (*function CheckVoxelsGroup(var lG: TStrings; lMaskVoxels: integer):boolean; var lC: integer; lHdrName : string; begin result := false; if lG.count < 1 then exit; for lC := 1 to lG.count do begin lHdrName:= lG[lC-1]; result := CheckVoxels(lHdrName, lMaskVoxels,lC); end; end;*) (*function CheckVoxelsGroup(var lG: TStrings; lMaskVoxels: integer):boolean; var lC: integer; lHdrName : string; begin result := false; if lG.count < 1 then exit; for lC := 1 to lG.count do begin lHdrName:= lG[lC-1]; if not CheckVoxels(lHdrName, lMaskVoxels,lC) then begin if not fileexists (lHdrName) then MainForm.NPMmsg('File not found "'+lHdrName+'"') else MainForm.NPMmsg('Problem with "'+lHdrName+'" expected '+inttostr(lMaskVoxels)); exit; end; end; result := true; end;*) function SameTransform (A,B:TNIFTIhdr): boolean; var lDim: integer; begin result := false; for lDim := 0 to 3 do begin if A.srow_x[lDim] <> B.srow_x[lDim] then exit; if A.srow_y[lDim] <> B.srow_y[lDim] then exit; if A.srow_z[lDim] <> B.srow_z[lDim] then exit; end; result := true; end; function TransformTxt (A:TNIFTIhdr): string; var lDim: integer; begin result := '['; for lDim := 0 to 3 do result := result + ' '+floattostr(A.srow_x[lDim]); result := result + ';'; for lDim := 0 to 3 do result := result + ' '+floattostr(A.srow_y[lDim]); result := result + ';'; for lDim := 0 to 3 do result := result + ' '+floattostr(A.srow_z[lDim]); result := result + ']'; end; function CheckVoxelsX(var lHdrNameIn : string; lMaskHdr: TMRIcroHdr; lImageNumber: integer):boolean; var lHdr: TMRIcroHdr; lHdrName: string; lDim: integer; begin result := false; lHdrName := Filename4D(lHdrNameIn); if not NIFTIhdr_LoadHdr(lHdrName,lHdr) then begin MainForm.NPMmsg('Unable to load image '+lHdrName); exit; end; (*lVox := ComputeImageDataBytes8bpp(lHdr); lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if lVox <> lMaskVoxels then begin MainForm.NPMmsg('Voxels differ for '+lHdrName+' expected '+inttostr(lMaskVoxels)+' described '+inttostr(lVox)); exit; end; *) for lDim := 1 to 3 do begin if (lHdr.NIFTIhdr.dim[lDim] <> lMaskHdr.NIFTIhdr.dim[lDim]) then begin MainForm.NPMmsg('Dimension '+inttostr(lDim)+' of '+lHdrName+' does not match '+lMaskHdr.HdrFileName); exit; end; end; if (not lHdr.NIfTItransform) then MainForm.NPMmsg('Warning: no spatial transform for '+lHdrName+' (Analyze not NIfTI). Please ensure images are coregistered.') else if (not lMaskHdr.NIfTItransform) then MainForm.NPMmsg('Warning: no spatial transform for '+lMaskHdr.HdrFileName+' (Analyze not NIfTI). Please ensure images are coregistered.') else begin if not SameTransform (lHdr.NIFTIhdr, lMaskHdr.NIFTIhdr) then begin MainForm.NPMmsg('Warning: spatial transforms differ for '+lHdrName+' and '+lMaskHdr.HdrFileName); MainForm.NPMmsg(TransformTxt(lHdr.NIFTIhdr)+' <> '+ TransformTxt(lMaskHdr.NIFTIhdr)); end; end; (*if (lHdr.NIFTIhdr.bitpix <> 8) and (lHdr.NIFTIhdr.datatype <> kDT_FLOAT) and (lHdr.NIFTIhdr.datatype <> kDT_SIGNED_INT) then begin showmessage('Error: This software can only read uncompressed images that are either 8-bit integer or 32-bit real precision.'); exit; end; //beta *) if UpCaseExt(lHdrName) = '.HDR' then lHdrName := changefileext(lHdrName,'.img'); if (not GzExt(lHdrName) ) and (FSize(lHdrName) < (lHdr.NIFTIhdr.dim[1]*lHdr.NIFTIhdr.dim[2]*lHdr.NIFTIhdr.dim[3])) then begin showmessage('The file size appears too small '+lHdrName); exit; end; result := true; //gBitPixRA[lImageNumber] := lHdr.NIFTIhdr.bitpix; gDataTypeRA[lImageNumber] := lHdr.NIFTIhdr.datatype; gOffsetRA[lImageNumber] := lHdr.NIFTIhdr.vox_offset; gScaleRA[lImageNumber] := lHdr.NIFTIhdr.scl_slope; gInterceptRA[lImageNumber] := lHdr.NIFTIhdr.scl_inter; end; function CheckVoxelsGroupX(var lG: TStrings; lMaskHdr: TMRIcroHdr):boolean; var lC: integer; lHdrName : string; begin result := false; if lG.count < 1 then exit; for lC := 1 to lG.count do begin lHdrName:= lG[lC-1]; if not CheckVoxelsX(lHdrName, lMaskHdr,lC) then begin if not fileexists (lHdrName) then MainForm.NPMmsg('File not found "'+lHdrName+'"') else MainForm.NPMmsg('Problem with "'+lHdrName); exit; end; end; result := true; end; (*function CheckVoxelsGroupY(var lG: TStrings):boolean; var lMaskHdr: TMRIcroHdr; lS: string; begin result := false; if lG.count < 1 then exit; lS := lG[0]; if not NIFTIhdr_LoadHdr(lS,lMaskHdr) then begin MainForm.NPMmsg('Unable to load image '+lS); exit; end; result := CheckVoxelsGroupX(lG,lMaskHdr); end; *) function BPP (lDataType: integer): integer; begin result := 0; case lDataType of kDT_UNSIGNED_CHAR: result := 1; kDT_SIGNED_SHORT: result := 2; // signed short (16 bits/voxel) kDT_SIGNED_INT : result := 4; // signed int (32 bits/voxel) kDT_FLOAT : result := 4; // float (32 bits/voxel) kDT_COMPLEX : result := 8; // complex (64 bits/voxel) end; end; function NIFTIhdr_HdrVolumes (lFilenameIn: string): integer; var lFilename: string; lHdr: TMRIcroHdr; begin result := 0; lFilename := lFilenameIn; if not NIFTIhdr_LoadHdr (lFilename, lHdr)then exit; result := lHdr.niftiHdr.dim[4]; end; function FileExists4D (lFilename: string): boolean; var lBaseName: string; var lVol: integer; begin FilenameVol4D (lFilename, lBasename,lVol); result := fileexists(lBasename); end; function FilenameVol4D (lFilename: string; var lBaseName: string; var lVol: integer): boolean; //4D files end with the image index number c:\dir\filename:1 //returns true if 4D file (with lVol = volume), otherwise returns false with lvol = 1 var lLen,lP: integer; lNumStr: string; begin lVol := 1; lBasename := lFilename; result := false; lLen := length(lFilename); if lLen < 1 then exit; lP := lLen; lNumStr := ''; while (lP > 0) and (lFilename[lP] in ['0'..'9']) do begin lNumStr := lFilename[lP]+lNumStr; dec(lP); end; //showmessage(lNumStr + '*'+lFilename[lP]); if (lNumStr = '') or (lP < 2) or (lFilename[lP] <> ':') then exit; lVol := strtoint(lNumStr); lLen := lP -1; lBasename := ''; for lP := 1 to lLen do lBasename := lBasename + lFilename[lP]; result := true; end; function Filename4D(lFilename: string): string; var lVol: integer; begin FilenameVol4D (lFilename, result,lVol); end; function Vol4D (lFilename: string): integer; var lBaseName: string; begin FilenameVol4D (lFilename, lBasename,result); end; function Files4D (lFilename: string): boolean; var lBaseName: string; var lVol: integer; begin result := FilenameVol4D (lFilename, lBasename,lVol); end; function CreateDecompressed4D(var lImageNames: TStrings): string; //returns temp filename if all imagenames are a single compressed 4D datafile //this means that a nii.gz file is only decompressed once, instead of once per volume*plank var lP: integer; lFilename : string; begin result := ''; if lImageNames.Count < 2 then exit; if not Files4D(lImageNames.Strings[0]) then exit; lFilename := Filename4D(lImageNames.Strings[0]); if not Fileexists(lFilename) then exit; if not GzExt(lFilename) then exit; //not a decompressed file //see if single 4D image for lP := 2 to lImageNames.Count do if not Files4D(lImageNames.Strings[lP-1]) then exit; for lP := 2 to lImageNames.Count do if lFilename <> Filename4D(lImageNames.Strings[lP-1]) then exit; //find unique filename for extracted file result := lFilename +'.nii'; while fileexists(result) do //make sure we do not overwrite anything result := lFilename +inttostr(random(9999))+'.nii'; //unzip Msgx('Decompressing 4D image '+lFilename+ ' -> '+result); Gunzip(lFilename,result); //set image names to point to uncompressed volume for lP := 1 to lImageNames.Count do lImageNames.Strings[lP-1] := result +':'+inttostr(Vol4D(lImageNames.Strings[lP-1]) ); end; procedure MakeStatHdr (var lBGHdr,lStatHdr: TniftiHdr; lMinIntensity,lMaxIntensity,lIntent_p1,lIntent_p2,lIntent_p3: single; lIntent_code: smallint;lIntentName: string); var lIntentNameLen,lPos: integer; lStr: string; begin move(lBGHdr,lStatHdr,sizeof(TniftiHdr)); with lStatHdr do begin magic :=kNIFTI_MAGIC_SEPARATE_HDR; bitpix := 32; //32-bit real data datatype := kDT_FLOAT; scl_slope:= 1; scl_inter:= 0; glmin := round(lMinIntensity); glmax := round(lMaxIntensity); intent_code := lIntent_Code;// kNIFTI_INTENT_ESTIMATE; intent_p1 := lIntent_p1; intent_p2 := lIntent_p2; intent_p3 := lIntent_p3; lIntentNameLen := length(lIntentName); descrip[1] := 'N'; descrip[2] := 'P'; descrip[3] := 'M'; if lIntent_code=kNIFTI_INTENT_TTEST then begin descrip[4] := 't' ; lStr := inttostr(trunc(lIntent_p1)); for lPos := 1 to length (lStr) do descrip[4+lPos] := lStr[lPos] ; end else descrip[4] := 'z'; if lIntentNameLen > sizeof(intent_name) then lIntentNameLen := sizeof(intent_name); if lIntentNameLen > 0 then for lPos := 1 to lIntentNameLen do intent_name[lPos] := lIntentName[lPos]; end; end; procedure SaveAsVOIorNIFTIcore (var lFilename: string; var lNiftiHdr: TNIFTIHdr; var lImg: SingleP; lnVolIn,lImgBufferBPP: integer); const kImgOffset = 352; //header is 348 bytes, but 352 is divisible by 8... var lHdr: TNIFTIhdr; lBuff: ByteP; lF: File; lCompressedFilename,lExt: string; lnVol,lC,lFSize: integer; lImgBuffer: ByteP; lImgBufferItems{, lImgBufferBPP}: integer; begin lnVol := lnVolIn; move(lNiftiHdr,lHdr,sizeof(lHdr)); lImgBufferItems := lHdr.dim[1]*lHdr.dim[2]*lHdr.dim[3]; //lImgBufferBPP:= 4; lImgBuffer := ByteP(lImg); lExt := UpCaseExt(lFileName); if DiskFreeEx(lFilename) < (kImgOffset+(lImgBufferItems*lImgBufferBPP*lnVol)) then begin case MessageDlg('Very little space on the selected drive. Attempt to save to this disk?', mtConfirmation, [mbYes, mbCancel], 0) of {$IFDEF FPC}mrCancel: exit; {$ELSE} id_Cancel: exit;{$ENDIF} end; //case end; if FileExistsEX(lFileName) then begin case MessageDlg('Overwrite the file named '+lFileName+'?', mtConfirmation, [mbYes, mbCancel], 0) of {$IFDEF FPC}mrCancel: exit; {$ELSE} id_Cancel: exit;{$ENDIF} //requires Uses Controls end; //case end; //file exists if (lExt='.VOI') then begin lHdr.intent_name[1] := 'B';//Binary lHdr.scl_slope := 1/kVOI8bit; lHdr.scl_inter := 0; end; if lnVol < 2 then begin lHdr.dim[0] := 3;//3D july2006 lHdr.dim[4] := 1;//3D Aug 2007 lnVol := 1; end else begin lHdr.dim[0] := 4;//3D july2006 lHdr.dim[4] := lnVol;//3D july2006 end; (*if not (lImgBufferItems = (lHdr.dim[1]*lHdr.dim[2]*lHdr.dim[3])) then begin //july2006 lHdr.sform_code := 1; WriteNiftiMatrix ( lHdr, //must match MAGMA in nifti_hdr gBGImg.ScrnMM[1],0,0,(gBGImg.ScrnOri[1]-1)*-gBGImg.ScrnMM[1], 0,gBGImg.ScrnMM[2],0,(gBGImg.ScrnOri[2]-1)*-gBGImg.ScrnMM[2], 0,0,gBGImg.ScrnMM[3],(gBGImg.ScrnOri[3]-1)*-gBGImg.ScrnMM[3]); end;*) if not IsNifTiMagic(lHdr) then begin {lHdr.sform_code := 1; WriteNiftiMatrix ( lHdr, //must match MAGMA in nifti_hdr gBGImg.ScrnMM[1],0,0,(gBGImg.ScrnOri[1]-1)*-gBGImg.ScrnMM[1], 0,gBGImg.ScrnMM[2],0,(gBGImg.ScrnOri[2]-1)*-gBGImg.ScrnMM[2], 0,0,gBGImg.ScrnMM[3],(gBGImg.ScrnOri[3]-1)*-gBGImg.ScrnMM[3]); } end; case lImgBufferBPP of 4: begin lHdr.bitpix := 32; lHdr.datatype := kDT_FLOAT;//note 32-bit integers saved internally as 32-bit float end; 2: begin lHdr.bitpix := 16; lHdr.datatype := kDT_SIGNED_SHORT; end; 1: begin lHdr.bitpix := 8; lHdr.datatype := kDT_UNSIGNED_CHAR; //lHdr.scl_inter := lHdr.WindowScaledMin; //lHdr.scl_slope := (lHdr.WindowScaledMax-lHdr.WindowScaledMin) /255; end; else begin showmessage('Error: Unsupported bytes per voxel: '+inttostr(lImgBufferBPP)); exit; end; end; if (lExt='.IMG') or (lExt ='.HDR') then begin //done previously lHdr.magic := kNIFTI_MAGIC_SEPARATE_HDR; lHdr.vox_offset := 0; Filemode := 1; //next write header data as .hdr lFilename := changeFileExt(lFilename,'.hdr'); AssignFile(lF, lFileName); Rewrite(lF,sizeof(TNIFTIhdr)); BlockWrite(lF,lHdr, 1); CloseFile(lF); //next write image data as .img lFilename := changeFileExt(lFilename,'.img'); AssignFile(lF, lFileName); {WIN} Rewrite(lF,lImgBufferItems*lImgBufferBPP*lnVol); BlockWrite(lF,lImgBuffer^,1); CloseFile(lF); Filemode := 2; exit; end; //separate header lHdr.magic := kNIFTI_MAGIC_EMBEDDED_HDR; lHdr.vox_offset := kImgOffset;//352 bytes lFSize := kImgOffset+(lImgBufferItems*lImgBufferBPP*lnVol); getmem(lBuff,lFSize); move(lHdr,lBuff^,sizeof(lHdr)); //Next: NIfTI 1.1 requires bytes 349..352 set to zero when no XML information lC := kImgOffset; lBuff^[lC-3] := 0; lBuff^[lC-2] := 0; lBuff^[lC-1] := 0; lBuff^[lC] := 0; lC := kImgOffset+1; move(lImgBuffer^[1],lBuff^[lC],lImgBufferItems*lImgBufferBPP*lnVol); if (lExt='.NII') then begin Filemode := 1; AssignFile(lF, lFileName); Rewrite(lF,lFSize); BlockWrite(lF,lBuff^,1); CloseFile(lF); Filemode := 2; exit; end; //uncompressed if (lExt<>'.VOI') then lCompressedFilename := changefileextX(lFilename,'.nii.gz') else lCompressedFilename := lFilename; //FX(lFSize); GZipBuffer(lCompressedFilename,lBuff,lFSize,false); freemem(lBuff); end; procedure MakeHdr (var lBGHdr,lStatHdr: TniftiHdr); //lIntent kNIFTI_INTENT_CHISQ lIntent_p1 = DOF //lIntent kNIFTI_INTENT_ZSCORE no params //lIntent kNIFTI_INTENT_TTEST lIntent_p1 = DOF begin move(lBGHdr,lStatHdr,sizeof(TniftiHdr)); with lStatHdr do begin magic :=kNIFTI_MAGIC_SEPARATE_HDR; bitpix := 32; //32-bit real data datatype := kDT_FLOAT; scl_slope:= 1; scl_inter:= 0; descrip[1] := 'X';//can not be npm end; end; function NIFTIhdr_SaveHdrImg (var lFilename: string; var lHdr: TNIFTIHdr; lAllowOverwrite,lSPM2,lSingleFile: boolean;var lImg: SingleP; lnVol: integer): boolean; var lOutNameMod: string; lSPM2output: boolean; begin lOutNameMod := lFilename; lOutNameMod := changefileextX(lOutNameMod,'.hdr'); lSPM2output := lSPM2; //fx(lHdr.srow_x[3],lHdr.srow_y[3],lHdr.srow_z[3]); (*if not IsNifTiMagic(lHdr) then lSPM2output := true;*) if (lSingleFile) and (not lSPM2output) then begin lHdr.magic := kNIFTI_MAGIC_EMBEDDED_HDR; lOutNameMod := changefileextX(lOutNameMod,'.nii.gz'); end else if (not lSPM2output) then lHdr.magic := kNIFTI_MAGIC_SEPARATE_HDR else //the nifti_hdr reader converts the Analyze to NIfTI, so we need to save as NIfTI with NPM lHdr.magic := kNIFTI_MAGIC_SEPARATE_HDR; //lHdr.magic := 1984; SaveAsVOIorNIFTIcore (lOutNameMod, lHdr, lImg,lnVol,4); end; function NIFTIhdr_SaveHdrImg8 (var lFilename: string; var lHdr: TNIFTIHdr; lAllowOverwrite,lSPM2,lSingleFile: boolean;var lImg: ByteP; lnVol: integer): boolean; var lOutNameMod: string; begin lOutNameMod := lFilename; if IsVOIExt (lOutNameMod) then begin lHdr.magic := kNIFTI_MAGIC_EMBEDDED_HDR; end else begin lOutNameMod := changefileextX(lOutNameMod,'.hdr'); if (lSingleFile) and (not lSPM2) then begin lHdr.magic := kNIFTI_MAGIC_EMBEDDED_HDR; lOutNameMod := changefileextX(lOutNameMod,'.nii.gz'); end else if (not lSPM2) then lHdr.magic := kNIFTI_MAGIC_SEPARATE_HDR else lHdr.magic := 1984; end; SaveAsVOIorNIFTIcore (lOutNameMod, lHdr, SingleP(lImg),lnVol,1); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/fpc-res.res0000664000175000017500000000176411316131250020515 0ustar michaelmichael џџџџ<LџџLAZ_PIC_DIALOG_TEMPLATE0T,‘PШ‘_STATICш џџџџ ( @€€€€€€€€€€€€РРРџџџџџџџџџџџџˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€‡ˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€™ˆˆˆˆ‰˜ˆˆˆˆˆˆˆˆ€3˜ˆˆˆ˜ˆˆˆˆˆˆˆˆˆ€wywwywwˆˆˆˆˆˆˆˆ€ˆ‰ˆˆ‰ˆˆˆˆˆˆˆˆˆˆ€ˆˆ˜ˆ˜ˆˆˆˆˆˆˆˆˆˆ€ˆˆ‰™ˆˆˆˆˆˆˆˆˆˆˆ€wwww€€ˆˆˆˆ€ˆˆˆˆџџџџџџџџџ€ˆˆˆˆџ№џџџ№џ€wwwwџџџџџˆˆˆˆˆ№џ№ˆˆˆˆˆ№џ№ˆˆˆˆˆџџџџџˆˆˆˆˆџ№џџ№џˆˆˆˆˆџџџ№џџџˆˆˆˆˆџџџџџџˆˆˆˆˆџџџџџџˆˆˆˆˆџџџ№џџџˆˆˆˆˆџ№џџ№џˆˆˆˆˆџџџџџˆˆˆˆˆ№џ№ˆˆˆˆˆ№џ№ˆˆˆˆˆџџџџџˆˆˆˆˆџ№џџџ№џˆˆˆˆˆџџџџџџџџџˆˆˆˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ0џџMAINICON  шmricron-0.20120505.1~dfsg.1.orig/npm/fpc-res.or0000664000175000017500000000232411316131250020335 0ustar michaelmichaelLО.rsrcd< @РІВ8K(€X€ˆ€ІВ8K@€ІВ8K ќІВ8KИ€p€ІВ8K ІВ8Kш€ €ІВ8K LAZ_PIC_DIALOG_TEMPLATEMAINICON,ш<P( @€€€€€€€€€€€€РРРџџџџџџџџџџџџˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€‡ˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€™ˆˆˆˆ‰˜ˆˆˆˆˆˆˆˆ€3˜ˆˆˆ˜ˆˆˆˆˆˆˆˆˆ€wywwywwˆˆˆˆˆˆˆˆ€ˆ‰ˆˆ‰ˆˆˆˆˆˆˆˆˆˆ€ˆˆ˜ˆ˜ˆˆˆˆˆˆˆˆˆˆ€ˆˆ‰™ˆˆˆˆˆˆˆˆˆˆˆ€wwww€€ˆˆˆˆ€ˆˆˆˆџџџџџџџџџ€ˆˆˆˆџ№џџџ№џ€wwwwџџџџџˆˆˆˆˆ№џ№ˆˆˆˆˆ№џ№ˆˆˆˆˆџџџџџˆˆˆˆˆџ№џџ№џˆˆˆˆˆџџџ№џџџˆˆˆˆˆџџџџџџˆˆˆˆˆџџџџџџˆˆˆˆˆџџџ№џџџˆˆˆˆˆџ№џџ№џˆˆˆˆˆџџџџџˆˆˆˆˆ№џ№ˆˆˆˆˆ№џ№ˆˆˆˆˆџџџџџˆˆˆˆˆџ№џџџ№џˆˆˆˆˆџџџџџџџџџˆˆˆˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆT,‘PШ‘_STATIC шќ .rsrcmricron-0.20120505.1~dfsg.1.orig/npm/firthThds.pas0000664000175000017500000005075711326434466021135 0ustar michaelmichaelunit firthThds; //Unit for running penalized multiple logistic regression //creates multiple threads //Requires firth interface uses ComCtrls,Classes, Graphics, ExtCtrls, define_types,{stats,}StatThdsUtil,lesion_pattern,Mat,Math,Distr,Vector; type TMultiRegThread = class(TThread) private finalloglik: SingleP0; KxKA1,KxKB1,KxKA,KxKB :TMatrix; Kvec,Kvec1 : TVector; Kveci,kVeci1 : TVectori; betak,xbeta,y,pi,ustar, XXx,XXXW2,XXFisher,XXcovs,XXXWPrime, deltahalfs,deltat,delta,covs,x,Fisher,XW2,W,XWprime,Hprime,H,ustarmat,negx: TMatrix; lBarX: TProgressBar; lnCondx,lnCritx,lBarPosX,lnPermuteX,lThreadx,lThreadStartx,lThreadEndx,lStartVoxx,lVoxPerPlankx,lImagesCountx : integer; lPlankImgx: byteP;lOutImgMnx,lSymptomRAx: SingleP; lOutImgX: SingleRAp; //lBarX: TProgressBar; procedure DoVisualSwap; protected procedure Execute; override; procedure VisualProg(lPos: Integer); procedure Analyze(lnCond,lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount : integer; lPlankImg: bytep;lOutImgMn,lSymptomRA: SingleP; lOutImg: SingleRAp); virtual; abstract; public constructor Create(lBar: TProgressBar; lnCond,lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount : integer; lPlankImg: byteP;lOutImgMn,lSymptomRA: SingleP; lOutImg: SingleRAp); end; TFirthThreadStat = class(TMultiRegThread ) protected procedure Analyze(lnCond,lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount : integer; lPlankImg: bytep;lOutImgMn,lSymptomRA: SingleP; lOutImg: SingleRAp); override; procedure logistfx (xin: SingleP; var lZvals: SingleP0; numSubj,numCond: integer; lComputeIntercept: boolean); end; implementation procedure TMultiRegThread .DoVisualSwap; begin lBarX.Position := lBarPosX; end; procedure TMultiRegThread.VisualProg(lPos: Integer); begin lBarPosX := lPos; {$IFDEF FPC}Synchronize(@DoVisualSwap); {$ELSE} Synchronize(DoVisualSwap);{$ENDIF} end; constructor TMultiRegThread.Create(lBar: TProgressBar; lnCond,lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount : integer; lPlankImg: bytep;lOutImgMn,lSymptomRA: SingleP;lOutImg: SingleRAp); begin lBarX := lBar; lThreadX := lThread; lThreadStartX := lThreadStart; lThreadEndX := lThreadEnd; lStartVoxx := lStartVox; lVoxPerPlankx := lVoxPerPlank; lImagesCountX := lImagesCount; lPlankImgx := lPlankImg; lOutImgMnx := lOutImgMn; lOutImgX := lOutImg; lSymptomRAx := lSymptomRA; lnPermuteX := lnPermute; lnCritX := lnCrit; lnCondX := lnCond; FreeOnTerminate := True; inherited Create(False); end; { The Execute method is called when the thread starts } procedure TMultiRegThread .Execute; begin Analyze(lnCondX,lnCritX,lnPermuteX,lThreadx,lThreadStartx,lThreadEndx,lStartVoxx,lVoxPerPlankx,lImagesCountx,lPlankImgX,lOutImgMnx,lSymptomRAx,lOutImgX); end; procedure TFirthThreadStat.logistfx (xin: SingleP; var lZvals: SingleP0; numSubj,numCond: integer; lComputeIntercept: boolean); //todo zero output incase exit //yin = 1..numSubj binary 0/1 values //xin = numSubj*numCond predictors //Chivals = 0..numCond p-values - the 0th Khi-value is the intercept // [0th value will not be computed if ; lComputeIntercept= false] label 123,666; const maxit = 25; maxhs = 5; epsilon = 0.0001; maxstep = 10; var SumY0,SumY1,mx, beta0,loglik,loglikold: double; sumy, n, i,j, k, iter,halfs,lCond,dropCond: integer; variability,firth: boolean; procedure crossprodustar; var inc,row: integer; begin for row := 1 to k do begin ustarmat[row,1] := 0; for inc := 1 to ustar.r do ustarmat[row,1] := ustarmat[row,1] + (x[row,inc]*ustar[inc,1]); end; end; procedure Diag2Vec; var inc: integer; begin for inc := 1 to pi.r do ustar[inc,1] := ustar[inc,1]+ H[inc,inc]*(0.5-pi[inc,1]); end; //nested DiagP2 procedure DiagP2 (var W, P: TMatrix); var inc: integer; begin W.Zero; for inc := 1 to P.r do W[inc,inc] := Power((P[inc,1] * (1-P[inc,1])),0.5) ; end; //nested DiagP2 procedure ComputeFisher; begin DiagP2(W,pi); XW2.mult(x,W); //XWPrime.copy( XW2); //XWPrime.transpose; XWPrime.transpose(XW2); Fisher.mult(XW2,XWPrime); covs.copy( Fisher); covs.Invert2(KxKA,KxKB,Kvec,Kveci) end; //nested computeFisher procedure computedropdelta; var jinc,iinc,ii,jj: integer; begin DiagP2(W,pi); XXXW2.mult(XXx,W); //XXXWPrime.copy( XXXW2); //XXXWPrime.transpose; XXXWPrime.transpose(XXXW2); XXFisher.mult(XXXW2,XXXWPrime); XXcovs.copy( XXFisher); //XXcovs.Invert; XXcovs.Invert2(KxKA1,KxKB1,Kvec1,Kveci1); covs.Zero; ii := 0; for iinc := 1 to (k) do begin if iinc <> (dropCond+1) then begin //leave the specified column zeros... inc(ii); jj := 0; for jinc := 1 to (k) do begin if jinc <> (dropCond+1) then begin inc(jj); covs[iinc,jinc] := xxCovs[ii,jj]; end; end; end; end; end; function firthpenalty: double; begin ComputeFisher; //result := 0.5 * ln(abs(Fisher.det)); result := 0.5 * ln(abs(Fisher.Det2(KxKA,kVeci,kVec))); end; //nested firthpenalty function ComputeLogLik: double; var inc: integer; begin xbeta.mult(betak,negx); for inc := 1 to n do pi[inc,1] := (1/(1 + exp( xbeta[inc,1]))); result := 0; for inc := 1 to n do if y[inc,1] = 1 then result := result+ln(pi[inc,1]); for inc := 1 to n do if y[inc,1] = 0 then result := result+ln(1-pi[inc,1]); if firth then result := result + firthpenalty; end;//nested ComputeLogLik begin for i := 0 to (numCond) do lZVals^[i] := 0; // if (numSubj < 2) or (numCond < 1) then exit; //ensure there is some variability in the input data... variability := false; i := 1; repeat inc(i); if xin^[i] <> xin^[1] then variability := true; until (i= (numSubj*numCond)) or (variability); if not variability then exit; //no variance in the regressors... variability := false; i := 1; repeat inc(i); if y[i,1] <> y[1,1] then variability := true; until (i= (numSubj)) or (variability); if not variability then exit; //no variance in the dependent variable... dropCond := -1; //initially compute full model, then compute effect of removing individual conditions firth := true; n := numSubj; k := numCond + 1; //get memory //beta := TMatrix.Create(n,1); //design our model //first row = 1: ell samples have equal weight for i := 1 to n do x.M[1,i] := 1; //next load model into x iter := 0; for j := 2 to k do for i := 1 to n do begin inc(iter); x.M[j,i] := xin^[iter]; end; //WriteMatrix('Observations',y); //WriteMatrix('Model',x); //negx is just sing-swapped - we will generate this as we use it a lot... for j := 1 to k do for i := 1 to n do begin negx.M[j,i] := -x.M[j,i]; end; //now start computations sumy := 0; for i := 1 to n do sumy := sumy + round(y[i,1]); if (sumy <= 0) or (sumy >= n) then begin //serious error: no variability. This should have been detected earlier in the procedure when yin was tested for variability goto 666; end; beta0 := ln((sumy/n)/(1 - sumy/n));//initial estimate 123: //go here for each dropcond if DropCond >= 0 then begin betak.Ones; betak.mult( 0) //start with a null model... does not really make sense end else begin betak.zero; betak[1,1] := (beta0); end; iter := 0; if DropCond >= 0 then begin //drop one of the factors... if dropCond <> 0 then begin//include intercept for i := 1 to n do XXx.M[1,i] := 1; lCond := 1; end else lCond := 0; for j := 1 to NumCond do begin if j <> DropCond then begin inc(lCond); for i := 1 to n do XXx.M[lCond,i] := x.M[j+1,i]; end; //if j <> dropCond end; end;//if lDropCond >= 0 loglik := ComputeLogLik; repeat inc(iter); ComputeFisher; HPrime.mult(XWPrime,covs); H.mult(HPrime,XW2); //WriteMatrix(covs); ustar.Sub(y,pi); if firth then Diag2Vec; crossprodustar; if dropCond >= 0 then // model with dropped factor computedropdelta; deltat.mult(covs,ustarmat); delta.transpose(deltat); mx := delta.MatAbsMax/MaxStep; if mx > 1 then delta.mult(mx);//scale delta betak.add(delta); loglikold := loglik; halfs := 1; while halfs <= maxhs do begin // Half-Steps //fx(iter,halfs,loglik); loglik := ComputeLogLik; deltahalfs.mult(delta,power(2,-halfs)); betak.sub(deltahalfs); if (loglik > loglikold) then break; inc(halfs); end; if delta.MatAbsMax <= epsilon then break; until (iter >= maxit); //fx(DropCond,loglik); //done with this model - record model fit if DropCond < 0 then finalloglik^[k] := loglik //full model else begin finalloglik^[DropCond] := loglik; //model with a factor removed end; if DropCond < numCond then begin inc(DropCond); if (DropCond = 0) and (not lComputeIntercept) then //only compute intercept model if requested inc(DropCond); goto 123; end; //finally - results //ResultsForm.Memo1.lines.add (inttostr(j)+' cases have Y=0, '+inttostr(n-j)+' cases have Y=1'); if lComputeIntercept then J := 0 else J := 1; for i := J to (k-1) do begin lZVals^[i] := abs(2*(finalloglik^[i]-finalloglik^[k])); //find direction of effect - does a larger value of the IV predict more zeros or ones lZVals^[i] := pNormalInv(ChiSq(lZVals^[i],1)); //we have now computed a Z scores - but Chi is one tailed, so all Z > 0... lets check direction Sumy0 := 0; Sumy1 := 0; for iter := 1 to n do begin if y[iter,1] = 0 then Sumy0 := Sumy0 + x.M[i+1,iter] //+1: M indexed from 1, ZVal indexed from 0 else Sumy1 := Sumy1 + x.M[i+1,iter]; //+1 M indexed from 1 end; //compute means Sumy1 := Sumy1/sumy; Sumy0 := Sumy0/(n-sumy); if Sumy0 < Sumy1 then //negative z-scores: damage here predicts performance is BETTER lZVals^[i] := -lZVals^[i]; end; (*if lComputeIntercept then //intercept is the 0th value lChiVals[0] := abs(2*(finalloglik[0]-finalloglik[k])); for i := 1 to (k-1) do //k-1 as this is indexed from 0 lChiVals[i] := abs(2*(finalloglik[i]-finalloglik[k])); *) 666: end; {Firth penalized logisitic regression} procedure TFirthThreadStat.Analyze(lnCond, lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount : integer; lPlankImg: bytep;lOutImgMn,lSymptomRA: SingleP;lOutImg: SingleRAp); //calls logistf (yin,xin: SingleP; var lChivals: SingleP0; numSubj,numCond: integer); label 666; const knPrevPattern = 10; var lPrevPatternRA: array[1..knPrevPattern] of TLesionPattern; lPattern: TLesionPattern; lObs: Bytep; lPrevZVals: array [1..knPrevPattern] of SingleP0; lZVals: SingleP0; lPatternPos,lC,lnLesion,lPosPct,lPos,lPos2,lPos2Offset,lnCritLocal,n,k: integer; begin //statthread lnCritLocal := lnCrit; if lnCritLocal < 1 then lnCritLocal := 1; Getmem(lObs,lImagesCount*sizeof(byte)); Getmem(lZVals,(lnCond+1)*sizeof(single)); for lPos := 1 to knPrevPattern do Getmem(lPrevZVals[lPos],(lnCond+1)*sizeof(single)); n := lImagesCount; k := lnCond + 1; y := TMatrix.Create(n,1); GetMem(finalloglik,(k+1)*sizeof(single));//finalloglik := TVector.Create(k+1); x := TMatrix.Create (k, n); betak:=TMatrix.Create(1,k); covs:=TMatrix.Create(k,k); delta:=TMatrix.Create(1,k); deltahalfs:=TMatrix.Create(1,k); deltat:=TMatrix.Create(k,1); Fisher:=TMatrix.Create(k,k); H:=TMatrix.Create(n,n); HPrime:=TMatrix.Create(n,k); negx:=TMatrix.Create(k,n); pi:=TMatrix.Create(n,1); ustar:=TMatrix.Create(n,1); ustarmat:=TMatrix.create(k,1); W:=TMatrix.Create(n,n); xbeta:=TMatrix.Create(1,n); XW2:=TMatrix.Create(k,n); //XWPrime:=TMatrix.Create(k,n); XWPrime:=TMatrix.Create(n,k); XXcovs:=TMatrix.Create(k-1,k-1); XXFisher:=TMatrix.Create(k-1,k-1); XXx:=TMatrix.Create(k-1,n); XXXW2:=TMatrix.Create(k-1,n); //XXXWPrime:=TMatrix.Create(k-1,n); XXXWPrime := TMatrix.Create ( n, k-1); KxKA := TMatrix.Create(k,k); KxKB := TMatrix.Create(k,k); Kvec := TVector.Create(k); Kveci := TVectori.Create(k); KxKA1 := TMatrix.Create(k-1,k-1); KxKB1 := TMatrix.Create(k-1,k-1); Kvec1 := TVector.Create(k-1); Kveci1 := TVectori.Create(k-1); lPosPct := (lThreadEnd-lThreadStart) div 100; for lPatternPos := 1 to knPrevPattern do lPrevPatternRA[lPatternPos] := EmptyOrder; lPatternPos := 1; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; for lPos := 1 to lImagesCount do begin if lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2] = 0 then begin //no lesion y[lPos,1] := 0; lObs^[lPos] := 0; end else begin //lesion inc(lnLesion); lObs^[lPos] := 1; y[lPos,1] := 1; //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCritLocal) and (lnLesion < lImagesCount) then begin lPattern := SetOrderX (lObs,lImagesCount); lPos := 1; while (lPos <= knPrevPattern) and not (SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount)) do inc(lPos); if SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount) then begin inc(gnVoxTestedRA[lThread]); //logistf(lObs,lSymptomRA, lZvals, lImagesCount,lnCond,false); for lC := 1 to lnCond do lOutImg^[lC]^[lPos2Offset] := lPrevZvals[lPos]^[lC]; end else begin //new pattern - need to compute inc(gnVoxTestedRA[lThread]); logistfx(lSymptomRA, lZvals, lImagesCount,lnCond,false); for lC := 1 to lnCond do lOutImg^[lC]^[lPos2Offset] := lZvals^[lC]; lPrevPatternRA[lPatternPos] := lPattern; for lC := 1 to lnCond do lPrevZVals[lPatternPos]^[lC] := lZvals^[lC]; inc(lPatternPos); if lPatternPos > knPrevPattern then lPatternPos := 1; end; //new pattern end; //nlesion > nCritical end; //for each voxel //gMat := false; 666: freemem(lObs); for lPos := 1 to knPrevPattern do freemem(lPrevZVals[lPos]); freemem(lZVals); y.free; x.free; betak.free; covs.free; delta.free; deltahalfs.free; deltat.free; Fisher.free; H.free; HPrime.free; negx.free; pi.free; ustar.free; ustarmat.Free; W.free; xbeta.free; XW2.free; XWPrime.free; XXcovs.free; XXFisher.free; XXx.free; XXXW2.free; XXXWPrime.free; KxKA.free; KxKB.free; Kvec.free; Kveci.free; KxKA1.free; KxKB1.free; Kvec1.free; Kveci1.free; freemem(finalloglik); end; (* {Firth penalized logisitic regression} procedure TFirthThreadStat .Analyze(lnCond, lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount : integer; lPlankImg,lOutImgMn,lSymptomRA: SingleP;lOutImg: SingleRAp); //calls logistf (yin,xin: SingleP; var lChivals: SingleP0; numSubj,numCond: integer); var lPattern,lPrevPattern: TLesionPattern; lObs: Singlep; lZVals,lPrevZVals: SingleP0; lC,lnLesion,lPosPct,lPos,lPos2,lPos2Offset,lnCritLocal,n,k: integer; begin //statthread lnCritLocal := lnCrit; if lnCritLocal < 1 then lnCritLocal := 1; Getmem(lObs,lImagesCount*sizeof(single)); Getmem(lZVals,(lnCond+1)*sizeof(single)); Getmem(lPrevZVals,(lnCond+1)*sizeof(single)); n := lImagesCount; k := lnCond + 1; y := TMatrix.Create(n,1); GetMem(finalloglik,(k+1)*sizeof(single));//finalloglik := TVector.Create(k+1); x := TMatrix.Create (k, n); betak:=TMatrix.Create(1,k); covs:=TMatrix.Create(k,k); delta:=TMatrix.Create(1,k); deltahalfs:=TMatrix.Create(1,k); deltat:=TMatrix.Create(k,1); Fisher:=TMatrix.Create(k,k); H:=TMatrix.Create(n,n); HPrime:=TMatrix.Create(n,k); negx:=TMatrix.Create(k,n); pi:=TMatrix.Create(n,1); ustar:=TMatrix.Create(n,1); ustarmat:=TMatrix.create(k,1); W:=TMatrix.Create(n,n); xbeta:=TMatrix.Create(1,n); XW2:=TMatrix.Create(k,n); //XWPrime:=TMatrix.Create(k,n); XWPrime:=TMatrix.Create(n,k); XXcovs:=TMatrix.Create(k-1,k-1); XXFisher:=TMatrix.Create(k-1,k-1); XXx:=TMatrix.Create(k-1,n); XXXW2:=TMatrix.Create(k-1,n); //XXXWPrime:=TMatrix.Create(k-1,n); XXXWPrime := TMatrix.Create ( n, k-1); KxKA := TMatrix.Create(k,k); KxKB := TMatrix.Create(k,k); Kvec := TVector.Create(k); Kveci := TVectori.Create(k); KxKA1 := TMatrix.Create(k-1,k-1); KxKB1 := TMatrix.Create(k-1,k-1); Kvec1 := TVector.Create(k-1); Kveci1 := TVectori.Create(k-1); //gMat := true; lPosPct := (lThreadEnd-lThreadStart) div 100; lPrevPattern := EmptyOrder; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); if Terminated then exit; //goto 345;//abort lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; for lPos := 1 to lImagesCount do begin if ((gScaleRA[lPos]*lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2])+gInterceptRA[lPos]) = 0 then begin //no lesion y[lPos,1] := 0; lObs[lPos] := 0; end else begin //lesion inc(lnLesion); lObs[lPos] := 1; y[lPos,1] := 1; //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCritLocal) and (lnLesion < lImagesCount) then begin lPattern := SetOrder (lObs,lImagesCount); if SameOrder(lPattern,lPrevPattern,lImagesCount) then begin inc(gnVoxTestedRA[lThread]); //logistf(lObs,lSymptomRA, lZvals, lImagesCount,lnCond,false); for lC := 1 to lnCond do lOutImg^[lC]^[lPos2Offset] := lPrevZvals[lC]; end else begin //new pattern - need to compute inc(gnVoxTestedRA[lThread]); logistfx(lSymptomRA, lZvals, lImagesCount,lnCond,false); for lC := 1 to lnCond do lOutImg^[lC]^[lPos2Offset] := lZvals[lC]; end; lPrevPattern := lPattern; for lC := 1 to lnCond do lPrevZVals[lC] := lZvals[lC]; end; end; //for each voxel //gMat := false; freemem(lObs); freemem(lPrevZVals); freemem(lZVals); y.free; x.free; betak.free; covs.free; delta.free; deltahalfs.free; deltat.free; Fisher.free; H.free; HPrime.free; negx.free; pi.free; ustar.free; ustarmat.Free; W.free; xbeta.free; XW2.free; XWPrime.free; XXcovs.free; XXFisher.free; XXx.free; XXXW2.free; XXXWPrime.free; KxKA.free; KxKB.free; Kvec.free; Kveci.free; KxKA1.free; KxKB1.free; Kvec1.free; Kveci1.free; freemem(finalloglik); end; (**) end. mricron-0.20120505.1~dfsg.1.orig/npm/firth.pas0000664000175000017500000003505611326434466020305 0ustar michaelmichaelunit firth; interface uses ComCtrls,Classes, Graphics, ExtCtrls, define_types,{stats,}StatThdsUtil,lesion_pattern,Mat,Math,Distr,Vector; procedure FirthAnalyzeNoThread(lnCond, lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount : integer; lPlankImg: bytep;lOutImgMn,lSymptomRA: SingleP;lOutImg: SingleRAp); implementation uses npmform, dialogs; procedure VisualProg(lPos: Integer); begin MainForm.ProgressBar1.Position := lPos; MainForm.Refresh; end; var finalloglik: SingleP0; KxKA1,KxKB1,KxKA,KxKB :TMatrix; Kvec,Kvec1 : TVector; Kveci,kVeci1 : TVectori; betak,xbeta,y,pi,ustar, XXx,XXXW2,XXFisher,XXcovs,XXXWPrime, deltahalfs,deltat,delta,covs,x,Fisher,XW2,W,XWprime,Hprime,H,ustarmat,negx: TMatrix; lBarX: TProgressBar; lnCondx,lnCritx,lBarPosX,lnPermuteX,lThreadx,lThreadStartx,lThreadEndx,lStartVoxx,lVoxPerPlankx,lImagesCountx : integer; lPlankImgx: byteP;lOutImgMnx,lSymptomRAx: SingleP; lOutImgX: SingleRAp; procedure logistfx (xin: SingleP; var lZvals: SingleP0; numSubj,numCond: integer; lComputeIntercept: boolean); //todo zero output incase exit //yin = 1..numSubj binary 0/1 values //xin = numSubj*numCond predictors //Chivals = 0..numCond p-values - the 0th Khi-value is the intercept // [0th value will not be computed if ; lComputeIntercept= false] label 123,666; const maxit = 25; maxhs = 5; epsilon = 0.0001; maxstep = 10; var SumY0,SumY1,mx, beta0,loglik,loglikold: double; sumy, n, i,j, k, iter,halfs,lCond,dropCond: integer; variability,firth: boolean; procedure crossprodustar; var inc,row: integer; begin for row := 1 to k do begin ustarmat[row,1] := 0; for inc := 1 to ustar.r do ustarmat[row,1] := ustarmat[row,1] + (x[row,inc]*ustar[inc,1]); end; end; procedure Diag2Vec; var inc: integer; begin for inc := 1 to pi.r do ustar[inc,1] := ustar[inc,1]+ H[inc,inc]*(0.5-pi[inc,1]); end; //nested DiagP2 procedure DiagP2 (var W, P: TMatrix); var inc: integer; begin W.Zero; for inc := 1 to P.r do W[inc,inc] := Power((P[inc,1] * (1-P[inc,1])),0.5) ; end; //nested DiagP2 procedure ComputeFisher; begin DiagP2(W,pi); XW2.mult(x,W); //XWPrime.copy( XW2); //XWPrime.transpose; XWPrime.transpose(XW2); Fisher.mult(XW2,XWPrime); covs.copy( Fisher); covs.Invert2(KxKA,KxKB,Kvec,Kveci) end; //nested computeFisher procedure computedropdelta; var jinc,iinc,ii,jj: integer; begin DiagP2(W,pi); XXXW2.mult(XXx,W); //XXXWPrime.copy( XXXW2); //XXXWPrime.transpose; XXXWPrime.transpose(XXXW2); XXFisher.mult(XXXW2,XXXWPrime); XXcovs.copy( XXFisher); //XXcovs.Invert; XXcovs.Invert2(KxKA1,KxKB1,Kvec1,Kveci1); covs.Zero; ii := 0; for iinc := 1 to (k) do begin if iinc <> (dropCond+1) then begin //leave the specified column zeros... inc(ii); jj := 0; for jinc := 1 to (k) do begin if jinc <> (dropCond+1) then begin inc(jj); covs[iinc,jinc] := xxCovs[ii,jj]; end; end; end; end; end; function firthpenalty: double; begin ComputeFisher; //result := 0.5 * ln(abs(Fisher.det)); result := 0.5 * ln(abs(Fisher.Det2(KxKA,kVeci,kVec))); end; //nested firthpenalty function ComputeLogLik: double; var inc: integer; lDenom: double; begin xbeta.mult(betak,negx); for inc := 1 to n do begin lDenom := (1 + exp( xbeta[inc,1])); if lDenom = 0 then showmessage('yikes') else pi[inc,1] := 1/lDenom; end; result := 0; for inc := 1 to n do if y[inc,1] = 1 then //if pi[inc,1] <> 1 then result := result+ln(pi[inc,1]); for inc := 1 to n do if y[inc,1] = 0 then //if pi[inc,1] <> 1 then result := result+ln(1-pi[inc,1]); if firth then result := result + firthpenalty; end;//nested ComputeLogLik begin for i := 0 to (numCond) do lZVals^[i] := 0; // if (numSubj < 2) or (numCond < 1) then exit; //ensure there is some variability in the input data... variability := false; i := 1; repeat inc(i); if xin^[i] <> xin^[1] then variability := true; until (i= (numSubj*numCond)) or (variability); if not variability then exit; //no variance in the regressors... variability := false; i := 1; repeat inc(i); if y[i,1] <> y[1,1] then variability := true; until (i= (numSubj)) or (variability); if not variability then exit; //no variance in the dependent variable... dropCond := -1; //initially compute full model, then compute effect of removing individual conditions firth := true; n := numSubj; k := numCond + 1; //get memory //beta := TMatrix.Create(n,1); //design our model //first row = 1: ell samples have equal weight for i := 1 to n do x.M[1,i] := 1; //next load model into x iter := 0; for j := 2 to k do for i := 1 to n do begin inc(iter); x.M[j,i] := xin^[iter]; end; //WriteMatrix('Observations',y); //WriteMatrix('Model',x); //negx is just sing-swapped - we will generate this as we use it a lot... for j := 1 to k do for i := 1 to n do begin negx.M[j,i] := -x.M[j,i]; end; //now start computations sumy := 0; for i := 1 to n do sumy := sumy + round(y[i,1]); if (sumy <= 0) or (sumy >= n) then begin //serious error: no variability. This should have been detected earlier in the procedure when yin was tested for variability goto 666; end; beta0 := ln((sumy/n)/(1 - sumy/n));//initial estimate 123: //go here for each dropcond if DropCond >= 0 then begin betak.Ones; betak.mult( 0) //start with a null model... does not really make sense end else begin betak.zero; betak[1,1] := (beta0); end; iter := 0; if DropCond >= 0 then begin //drop one of the factors... if dropCond <> 0 then begin//include intercept for i := 1 to n do XXx.M[1,i] := 1; lCond := 1; end else lCond := 0; for j := 1 to NumCond do begin if j <> DropCond then begin inc(lCond); for i := 1 to n do XXx.M[lCond,i] := x.M[j+1,i]; end; //if j <> dropCond end; end;//if lDropCond >= 0 loglik := ComputeLogLik; repeat inc(iter); ComputeFisher; HPrime.mult(XWPrime,covs); H.mult(HPrime,XW2); //WriteMatrix(covs); ustar.Sub(y,pi); if firth then Diag2Vec; crossprodustar; if dropCond >= 0 then // model with dropped factor computedropdelta; deltat.mult(covs,ustarmat); delta.transpose(deltat); mx := delta.MatAbsMax/MaxStep; if mx > 1 then delta.mult(mx);//scale delta betak.add(delta); loglikold := loglik; halfs := 1; while halfs <= maxhs do begin // Half-Steps //fx(iter,halfs,loglik); loglik := ComputeLogLik; deltahalfs.mult(delta,power(2,-halfs)); betak.sub(deltahalfs); if (loglik > loglikold) then break; inc(halfs); end; if delta.MatAbsMax <= epsilon then break; until (iter >= maxit); //fx(DropCond,loglik); //done with this model - record model fit if DropCond < 0 then finalloglik^[k] := loglik //full model else begin finalloglik^[DropCond] := loglik; //model with a factor removed end; if DropCond < numCond then begin inc(DropCond); if (DropCond = 0) and (not lComputeIntercept) then //only compute intercept model if requested inc(DropCond); goto 123; end; //finally - results //ResultsForm.Memo1.lines.add (inttostr(j)+' cases have Y=0, '+inttostr(n-j)+' cases have Y=1'); if lComputeIntercept then J := 0 else J := 1; for i := J to (k-1) do begin lZVals^[i] := abs(2*(finalloglik^[i]-finalloglik^[k])); //find direction of effect - does a larger value of the IV predict more zeros or ones lZVals^[i] := pNormalInv(ChiSq(lZVals^[i],1)); //we have now computed a Z scores - but Chi is one tailed, so all Z > 0... lets check direction Sumy0 := 0; Sumy1 := 0; for iter := 1 to n do begin if y[iter,1] = 0 then Sumy0 := Sumy0 + x.M[i+1,iter] //+1: M indexed from 1, ZVal indexed from 0 else Sumy1 := Sumy1 + x.M[i+1,iter]; //+1 M indexed from 1 end; //compute means Sumy1 := Sumy1/sumy; Sumy0 := Sumy0/(n-sumy); if Sumy0 < Sumy1 then //negative z-scores: damage here predicts performance is BETTER lZVals^[i] := -lZVals^[i]; end; (*if lComputeIntercept then //intercept is the 0th value lChiVals[0] := abs(2*(finalloglik[0]-finalloglik[k])); for i := 1 to (k-1) do //k-1 as this is indexed from 0 lChiVals[i] := abs(2*(finalloglik[i]-finalloglik[k])); *) 666: end; //FirthAnalyzeNoThread (lnCond,lnCrit, lnPermute,1,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,lPlankImg,lOutImgSum,lSymptomRA,lOutImg); procedure FirthAnalyzeNoThread(lnCond, lnCrit,lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImagesCount : integer; lPlankImg: bytep;lOutImgMn,lSymptomRA: SingleP;lOutImg: SingleRAp); //calls logistf (yin,xin: SingleP; var lChivals: SingleP0; numSubj,numCond: integer); label 666; const knPrevPattern = 10; var lPrevPatternRA: array[1..knPrevPattern] of TLesionPattern; lPattern: TLesionPattern; lObs: Bytep; lPrevZVals: array [1..knPrevPattern] of SingleP0; lZVals: SingleP0; lPatternPos,lC,lnLesion,lPosPct,lPos,lPos2,lPos2Offset,lnCritLocal,n,k: integer; begin //statthread lnCritLocal := lnCrit; if lnCritLocal < 1 then lnCritLocal := 1; Getmem(lObs,lImagesCount*sizeof(byte)); Getmem(lZVals,(lnCond+1)*sizeof(single)); for lPos := 1 to knPrevPattern do Getmem(lPrevZVals[lPos],(lnCond+1)*sizeof(single)); n := lImagesCount; k := lnCond + 1; y := TMatrix.Create(n,1); GetMem(finalloglik,(k+1)*sizeof(single));//finalloglik := TVector.Create(k+1); x := TMatrix.Create (k, n); betak:=TMatrix.Create(1,k); covs:=TMatrix.Create(k,k); delta:=TMatrix.Create(1,k); deltahalfs:=TMatrix.Create(1,k); deltat:=TMatrix.Create(k,1); Fisher:=TMatrix.Create(k,k); H:=TMatrix.Create(n,n); HPrime:=TMatrix.Create(n,k); negx:=TMatrix.Create(k,n); pi:=TMatrix.Create(n,1); ustar:=TMatrix.Create(n,1); ustarmat:=TMatrix.create(k,1); W:=TMatrix.Create(n,n); xbeta:=TMatrix.Create(1,n); XW2:=TMatrix.Create(k,n); //XWPrime:=TMatrix.Create(k,n); XWPrime:=TMatrix.Create(n,k); XXcovs:=TMatrix.Create(k-1,k-1); XXFisher:=TMatrix.Create(k-1,k-1); XXx:=TMatrix.Create(k-1,n); XXXW2:=TMatrix.Create(k-1,n); //XXXWPrime:=TMatrix.Create(k-1,n); XXXWPrime := TMatrix.Create ( n, k-1); KxKA := TMatrix.Create(k,k); KxKB := TMatrix.Create(k,k); Kvec := TVector.Create(k); Kveci := TVectori.Create(k); KxKA1 := TMatrix.Create(k-1,k-1); KxKB1 := TMatrix.Create(k-1,k-1); Kvec1 := TVector.Create(k-1); Kveci1 := TVectori.Create(k-1); lPosPct := (lThreadEnd-lThreadStart) div 100; for lPatternPos := 1 to knPrevPattern do lPrevPatternRA[lPatternPos] := EmptyOrder; lPatternPos := 1; for lPos2 := lThreadStart to lThreadEnd do begin if (lThread = 1) and ((lPos2 mod lPosPct) = 0) then VisualProg(round((lPos2/(lThreadEnd-lThreadStart))*100)); lPos2Offset := lPos2+lStartVox-1; lnLesion := 0; for lPos := 1 to lImagesCount do begin if lPlankImg^[((lPos-1)* lVoxPerPlank)+lPos2] = 0 then begin //no lesion y[lPos,1] := 0; lObs^[lPos] := 0; end else begin //lesion inc(lnLesion); lObs^[lPos] := 1; y[lPos,1] := 1; //note: lObs indexed from zero! end; end; lOutImgMn^[lPos2Offset] := lnLesion;///lImages.Count; if (lnLesion >= lnCritLocal) and (lnLesion < lImagesCount) then begin lPattern := SetOrderX (lObs,lImagesCount); lPos := 1; while (lPos <= knPrevPattern) and not (SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount)) do inc(lPos); if SameOrder(lPattern,lPrevPatternRA[lPos],lImagesCount) then begin inc(gnVoxTestedRA[lThread]); //logistfx(lObs,lSymptomRA, lZvals, lImagesCount,lnCond,false); for lC := 1 to lnCond do lOutImg^[lC]^[lPos2Offset] := lPrevZvals[lPos]^[lC]; end else begin //new pattern - need to compute inc(gnVoxTestedRA[lThread]); logistfx(lSymptomRA, lZvals, lImagesCount,lnCond,false); for lC := 1 to lnCond do lOutImg^[lC]^[lPos2Offset] := lZvals^[lC]; lPrevPatternRA[lPatternPos] := lPattern; for lC := 1 to lnCond do lPrevZVals[lPatternPos]^[lC] := lZvals^[lC]; inc(lPatternPos); if lPatternPos > knPrevPattern then lPatternPos := 1; end; //new pattern end; //nlesion > nCritical end; //for each voxel //gMat := false; 666: freemem(lObs); for lPos := 1 to knPrevPattern do freemem(lPrevZVals[lPos]); freemem(lZVals); y.free; x.free; betak.free; covs.free; delta.free; deltahalfs.free; deltat.free; Fisher.free; H.free; HPrime.free; negx.free; pi.free; ustar.free; ustarmat.Free; W.free; xbeta.free; XW2.free; XWPrime.free; XXcovs.free; XXFisher.free; XXx.free; XXXW2.free; XXXWPrime.free; KxKA.free; KxKB.free; Kvec.free; Kveci.free; KxKA1.free; KxKB1.free; Kvec1.free; Kveci1.free; freemem(finalloglik); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/filename.pas0000664000175000017500000000111711326434466020740 0ustar michaelmichaelunit filename; interface {$H+} function LegitFilename(var lInName: string; lIndex: integer): string; implementation uses SysUtils; function LegitFilename(var lInName: string; lIndex: integer): string; var I: integer; begin if length(lInName) < 1 then begin result := inttostr(lIndex); exit; end; result := ''; for I := 1 to length(lInName) do if lInName[I] in [ '0'..'9','a'..'z','A'..'Z'] then result := result + lInName[I]; if length(result) < 1 then result := inttostr(lIndex); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/extrafpc.cfg0000664000175000017500000000013011316131074020726 0ustar michaelmichael#IFDEF Darwin -k-macosx_version_min -k10.4 -XR/Developer/SDKs/MacOSX10.4u.sdk/ #ENDIFmricron-0.20120505.1~dfsg.1.orig/npm/dmath/0000775000175000017500000000000011660470014017536 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/npm/dmath/_clean.bat0000664000175000017500000000021310722116570021445 0ustar michaelmichaeldel /S *.~* del /S *.dcu del /S *.dsk del /S *.cfg del /S *.dof del /S *.obj del /S *.hpp del /S *.ddp del /S *.mps del /S *.mpt mricron-0.20120505.1~dfsg.1.orig/npm/dmath/winplot.pas0000664000175000017500000007114211326434466021756 0ustar michaelmichael{ ********************************************************************** * Unit WINPLOT.PAS * * Version 1.1 * * (c) J. Debord, October 1999 * ********************************************************************** Plotting routines for DELPHI ********************************************************************** } unit WinPlot; interface uses { DELPHI units } WinTypes, Graphics, { TPMath units } FMath, Matrices, Stat, PaString; { ************************* Constants and types ************************ } const MAXCURV = 255; { Max. number of curves which may be plotted } MAXSYMBOL = 9; { Max. number of symbols for plotting curves } EPS = 1.0E-10; { Lower limit for an axis label } type TScale = (LIN_SCALE, { Scale } LOG_SCALE); TGrid = (NO_GRID, { Grid } HORIZ_GRID, VERTIC_GRID, BOTH_GRID); TAxis = record { Coordinate axis } Scale : TScale; Min, Max, Step : Float; Title : String; end; TPointParam = record { Point parameters } Symbol : Integer; { Symbol index } Size : Integer; { Symbol size in 1/250 of graphic width } Color : TColor; end; TLineParam = record { Line parameters } Width : Integer; Style : TPenStyle; Color : TColor; end; TCurvParam = record { Curve parameters } PointParam : TPointParam; LineParam : TLineParam; Legend : String[30]; { Legend of curve } Step : Integer; { Plot 1 point every Step points } Connect : Boolean; { Connect points with line? } end; TCurvParamArray = array[1..MAXCURV] of TCurvParam; PCurvParamArray = ^TCurvParamArray; { ******** Global variables defining the appearance of the graph ******* } const Xwin1 : Integer = 15; { Window coordinates in percent of maximum } Ywin1 : Integer = 15; Xwin2 : Integer = 75; Ywin2 : Integer = 75; GraphBorder : Boolean = True; { For plotting a rectangle around the graph } XAxis : TAxis = (Scale : LIN_SCALE; { Horizontal axis } Min : 0.0; Max : 1.0; Step : 0.2; Title : 'X'); YAxis : TAxis = (Scale : LIN_SCALE; { Vertical axis } Min : 0.0; Max : 1.0; Step : 0.2; Title : 'Y'); Grid : TGrid = BOTH_GRID; { Grid } GraphTitle : String = ''; { Title of graph } { ************************** Graphic routines ************************** } procedure InitGraph(Canvas : TCanvas; Width, Height : Integer); { ---------------------------------------------------------------------- Initializes the graphic ---------------------------------------------------------------------- The parameters refer to the object on which the graphic is plotted. Examples: To draw on a TImage object: InitGraph(Image1.Canvas, Image1.Width, Image1.Height); To print the graphic: InitGraph(Printer.Canvas, Printer.PageWidth, Printer.PageHeight); ---------------------------------------------------------------------- } procedure PlotXAxis(Canvas : TCanvas); { ---------------------------------------------------------------------- Plots the X axis ---------------------------------------------------------------------- } procedure PlotYAxis(Canvas : TCanvas); { ---------------------------------------------------------------------- Plots the Y axis ---------------------------------------------------------------------- } procedure WriteTitle(Canvas : TCanvas); { ---------------------------------------------------------------------- Writes the title of the graph ---------------------------------------------------------------------- } procedure PlotGrid(Canvas : TCanvas); { ---------------------------------------------------------------------- Plots a grid on the graph ---------------------------------------------------------------------- } procedure PlotPoint(Canvas : TCanvas; X, Y : Float; PointParam : TPointParam); { ---------------------------------------------------------------------- Plots a point ---------------------------------------------------------------------- X, Y : point coordinates PointParam : point parameters ---------------------------------------------------------------------- } procedure PlotCurve(Canvas : TCanvas; X, Y : PVector; Lbound, Ubound : Integer; CurvParam : TCurvParam); { ---------------------------------------------------------------------- Plots a curve ---------------------------------------------------------------------- X, Y : point coordinates Lbound, Ubound : indices of first and last points CurvParam : curve parameters ---------------------------------------------------------------------- } procedure PlotCurveWithErrorBars(Canvas : TCanvas; X, Y, S : PVector; Ns : Integer; Lbound, Ubound : Integer; CurvParam : TCurvParam); { ---------------------------------------------------------------------- Plots a curve with error bars ---------------------------------------------------------------------- X, Y : point coordinates S : errors (e.g. standard deviations) Ns : error multiplier (e.g. 2 for plotting 2 SD's) Lbound, Ubound : indices of first and last points CurvParam : curve parameters ---------------------------------------------------------------------- } procedure PlotFunc(Canvas : TCanvas; Func : TFunc; Xmin, Xmax : Float; Npt : Integer; LineParam : TLineParam); { ---------------------------------------------------------------------- Plots a function ---------------------------------------------------------------------- Func : function to be plotted must be programmed as: function Func(X : Float) : Float; Xmin, Xmax : abscissae of 1st and last point to plot Npt : number of points LineParam : line parameters ---------------------------------------------------------------------- } procedure WriteLegend(Canvas : TCanvas; NCurv : Integer; CurvParam : PCurvParamArray; ShowPoints, ShowLines : Boolean); { ---------------------------------------------------------------------- Writes the legends for the plotted curves ---------------------------------------------------------------------- NCurv : number of curves (1 to MAXCURV) CurvParam : curve parameters ShowPoints : for displaying points ShowLines : for displaying lines ---------------------------------------------------------------------- } { *********** The following routines are defined in PLOT.INC *********** } procedure Interval(X1, X2 : Float; MinDiv, MaxDiv : Integer; var Min, Max, Step : Float); { ---------------------------------------------------------------------- Determines an interval [Min, Max] including the values from X1 to X2, and a subdivision Step of this interval ---------------------------------------------------------------------- Input parameters : X1, X2 = min. & max. values to be included MinDiv = minimum nb of subdivisions MaxDiv = maximum nb of subdivisions ---------------------------------------------------------------------- Output parameters : Min, Max, Step ---------------------------------------------------------------------- } procedure AutoScale(Z : PVector; Lbound, Ubound : Integer; var Axis : TAxis); { ---------------------------------------------------------------------- Determines the scale of an axis ---------------------------------------------------------------------- Input parameters : Z = array of values to be plotted Lbound, Ubound = indices of first and last elements of Z ---------------------------------------------------------------------- Output parameters : Axis ---------------------------------------------------------------------- } function Xpixel(X : Float) : Integer; { ---------------------------------------------------------------------- Converts user abscissa X to screen coordinate ---------------------------------------------------------------------- } function Ypixel(Y : Float) : Integer; { ---------------------------------------------------------------------- Converts user ordinate Y to screen coordinate ---------------------------------------------------------------------- } function Xuser(X : Integer) : Float; { ---------------------------------------------------------------------- Converts screen coordinate X to user abscissa ---------------------------------------------------------------------- } function Yuser(Y : Integer) : Float; { ---------------------------------------------------------------------- Converts screen coordinate Y to user ordinate ---------------------------------------------------------------------- } implementation uses Classes; var GraphWidth, GraphHeight, SymbolSizeUnit : Integer; { ---------------------------------------------------------------------- Include the variables and routines common to PLOT.PAS and WINPLOT.PAS ---------------------------------------------------------------------- } {$I PLOT.INC} { ---------------------------------------------------------------------- } procedure PlotXAxis(Canvas : TCanvas); var W, X, Z : Float; N, I, J, TickLength, MinorTickLength, Wp, Xp : Integer; XLabel : String; NSZ : Boolean; begin TickLength := Canvas.TextHeight('M') div 2; MinorTickLength := Round(0.67 * TickLength); { For log scale } { Draw axis } Canvas.MoveTo(XminPixel, YmaxPixel); Canvas.LineTo(XmaxPixel, YmaxPixel); NSZ := NSZero; NSZero := False; { Don't write non significant zero's } N := Round((XAxis.Max - XAxis.Min) / XAxis.Step); { Nb of intervals } X := XAxis.Min; { Tick mark position } for I := 0 to N do { Label axis } begin if (XAxis.Scale = LIN_SCALE) and (Abs(X) < EPS) then X := 0.0; Xp := Xpixel(X); { Draw tick mark } Canvas.MoveTo(Xp, YmaxPixel); Canvas.LineTo(Xp, YmaxPixel + TickLength); { Write label } if XAxis.Scale = LIN_SCALE then Z := X else Z := Exp10(X); XLabel := Trim(PaString.FloatToStr(Z)); Canvas.TextOut(Xp - Canvas.TextWidth(XLabel) div 2, YmaxPixel + TickLength, XLabel); { Plot minor divisions on logarithmic scale } if (XAxis.Scale = LOG_SCALE) and (I < N) then for J := 2 to 9 do begin W := X + Log10(J); Wp := Xpixel(W); Canvas.MoveTo(Wp, YmaxPixel); Canvas.LineTo(Wp, YmaxPixel + MinorTickLength); end; X := X + XAxis.Step; end; NSZero := NSZ; { Write axis title } if XAxis.Title <> '' then Canvas.TextOut(XminPixel + (XmaxPixel - XminPixel - Canvas.TextWidth(XAxis.Title)) div 2, YmaxPixel + 2 * Canvas.TextHeight('M'), XAxis.Title); end; procedure PlotYAxis(Canvas : TCanvas); var W, Y, Z : Float; N, I, J, Wp, Yp : Integer; TickLength, MinorTickLength, Yoffset : Integer; YLabel : String; NSZ : Boolean; begin TickLength := Canvas.TextWidth('M') div 2; MinorTickLength := Round(0.67 * TickLength); { For log scale } Yoffset := Canvas.TextHeight('M') div 2; { Draw axis } Canvas.MoveTo(XminPixel, YminPixel); Canvas.LineTo(XminPixel, YmaxPixel); NSZ := NSZero; NSZero := False; { Don't write non significant zero's } N := Round((YAxis.Max - YAxis.Min) / YAxis.Step); { Nb of intervals } Y := YAxis.Min; { Tick mark position } for I := 0 to N do { Label axis } begin if (YAxis.Scale = LIN_SCALE) and (Abs(Y) < EPS) then Y := 0.0; Yp := Ypixel(Y); { Draw tick mark } Canvas.MoveTo(XminPixel, Yp); Canvas.LineTo(XminPixel - TickLength, Yp); { Write label } if YAxis.Scale = LIN_SCALE then Z := Y else Z := Exp10(Y); YLabel := Trim(PaString.FloatToStr(Z)); Canvas.TextOut(XminPixel - TickLength - Canvas.TextWidth(YLabel), Yp - Yoffset, YLabel); { Plot minor divisions on logarithmic scale } if (YAxis.Scale = LOG_SCALE) and (I < N) then for J := 2 to 9 do begin W := Y + Log10(J); Wp := Ypixel(W); Canvas.MoveTo(XminPixel, Wp); Canvas.LineTo(XminPixel - MinorTickLength, Wp); end; Y := Y + YAxis.Step; end; NSZero := NSZ; { Write axis title } if YAxis.Title <> '' then Canvas.TextOut(XminPixel, YminPixel - 3 * Yoffset, YAxis.Title); end; procedure InitGraph(Canvas : TCanvas; Width, Height : Integer); begin GraphWidth := Width; GraphHeight := Height; SymbolSizeUnit := GraphWidth div 250; XminPixel := Round(Xwin1 / 100 * Width); YminPixel := Round(Ywin1 / 100 * Height); XmaxPixel := Round(Xwin2 / 100 * Width); YmaxPixel := Round(Ywin2 / 100 * Height); FactX := (XmaxPixel - XminPixel) / (XAxis.Max - XAxis.Min); FactY := (YmaxPixel - YminPixel) / (YAxis.Max - YAxis.Min); if GraphBorder then Canvas.Rectangle(XminPixel, YminPixel, Succ(XmaxPixel), Succ(YmaxPixel)); end; procedure WriteTitle(Canvas : TCanvas); begin if GraphTitle <> '' then with Canvas do TextOut((XminPixel + XmaxPixel - TextWidth(GraphTitle)) div 2, YminPixel - 2 * TextHeight(GraphTitle), GraphTitle); end; procedure PlotGrid(Canvas : TCanvas); var X, Y : Float; I, N, Xp, Yp : Integer; PenStyle : TpenStyle; begin { Save current settings } PenStyle := Canvas.Pen.Style; Canvas.Pen.Style := psDot; if Grid in [HORIZ_GRID, BOTH_GRID] then { Horizontal lines } begin N := Round((YAxis.Max - YAxis.Min) / YAxis.Step); { Nb of intervals } for I := 1 to Pred(N) do begin Y := YAxis.Min + I * YAxis.Step; { Origin of line } Yp := Ypixel(Y); Canvas.MoveTo(XminPixel, Yp); Canvas.LineTo(XmaxPixel, Yp); end; end; if Grid in [VERTIC_GRID, BOTH_GRID] then { Vertical lines } begin N := Round((XAxis.Max - XAxis.Min) / XAxis.Step); for I := 1 to Pred(N) do begin X := XAxis.Min + I * XAxis.Step; Xp := Xpixel(X); Canvas.MoveTo(Xp, YminPixel); Canvas.LineTo(Xp, YmaxPixel); end; end; { Restore settings } Canvas.Pen.Style := PenStyle; end; function XOutOfBounds(X : Integer) : Boolean; { Checks if an absissa is outside the graphic bounds } begin XOutOfBounds := (X < XminPixel) or (X > XmaxPixel); end; function YOutOfBounds(Y : Integer) : Boolean; { Checks if an ordinate is outside the graphic bounds } begin YOutOfBounds := (Y < YminPixel) or (Y > YmaxPixel); end; function CheckPoint(X, Y : Float; var Xp, Yp : Integer) : Boolean; { Computes the pixel coordinates of a point and checks if it is enclosed within the graph limits } begin Xp := Xpixel(X); Yp := Ypixel(Y); CheckPoint := not(XOutOfBounds(Xp) or YOutOfBounds(Yp)); end; procedure PlotSymbol(Canvas : TCanvas; Xp, Yp : Integer; Symbol, Size : Integer); { Plots a symbol at pixel coordinates (Xp, Yp) with the current canvas settings } var Xp1, Xp2, Yp1, Yp2 : Integer; begin if Symbol > 0 then begin Size := Size * SymbolSizeUnit; Xp1 := Xp - Size; Yp1 := Yp - Size; Xp2 := Xp + Size + 1; Yp2 := Yp + Size + 1; end; with Canvas do case Symbol of 0 : Pixels[Xp, Yp] := Brush.Color; 1, 2 : Ellipse(Xp1, Yp1, Xp2, Yp2); { Circle } 3, 4 : Rectangle(Xp1, Yp1, Xp2, Yp2); { Square } 5, 6 : Polygon([Point(Xp1, Yp2 - 1), Point(Xp2, Yp2 - 1), Point(Xp, Yp1 - 1)]); { Triangle } 7 : begin { + } MoveTo(Xp, Yp1); LineTo(Xp, Yp2); MoveTo(Xp1, Yp); LineTo(Xp2, Yp); end; 8 : begin { x } MoveTo(Xp1, Yp1); LineTo(Xp2, Yp2); MoveTo(Xp1, Yp2 - 1); LineTo(Xp2, Yp1 - 1); end; 9 : begin { * } MoveTo(Xp, Yp1); LineTo(Xp, Yp2); MoveTo(Xp1, Yp); LineTo(Xp2, Yp); MoveTo(Xp1, Yp1); LineTo(Xp2, Yp2); MoveTo(Xp1, Yp2 - 1); LineTo(Xp2, Yp1 - 1); end; end; end; procedure PlotLine(Canvas : TCanvas; Xp1, Yp1, Xp2, Yp2 : Integer); { Plots a line with the current canvas settings } begin Canvas.MoveTo(Xp1, Yp1); Canvas.LineTo(Xp2, Yp2); end; procedure PlotPoint(Canvas : TCanvas; X, Y : Float; PointParam : TPointParam); var Xp, Yp : Integer; BrushStyle : TBrushStyle; PenColor, BrushColor : TColor; begin if XAxis.Scale = LOG_SCALE then X := Log10(X); if YAxis.Scale = LOG_SCALE then Y := Log10(Y); if not CheckPoint(X, Y, Xp, Yp) then Exit; with Canvas do begin { Save current settings } PenColor := Pen.Color; BrushColor := Brush.Color; BrushStyle := Brush.Style; Pen.Color := PointParam.Color; Brush.Color := PointParam.Color; if PointParam.Symbol in [0, 1, 3, 5] then Brush.Style := bsSolid else Brush.Style := bsClear; PlotSymbol(Canvas, Xp, Yp, PointParam.Symbol, PointParam.Size); { Restore settings } Pen.Color := PenColor; Brush.Color := BrushColor; Brush.Style := BrushStyle; end; end; procedure PlotErrorBar(Canvas : TCanvas; Y, S : Float; Ns : Integer; Xp, Yp, Size : Integer); { Plots an error bar with the current canvas settings } var Delta, Y1 : Float; Yp1 : Integer; begin Size := Size * SymbolSizeUnit; Delta := Ns * S; Y1 := Y - Delta; if YAxis.Scale = LOG_SCALE then Y1 := Log10(Y1); Yp1 := Ypixel(Y1); if Yp1 <= YmaxPixel then begin PlotLine(Canvas, Xp - Size, Yp1, Xp + Size + 1, Yp1); PlotLine(Canvas, Xp, Yp, Xp, Yp1); end else PlotLine(Canvas, Xp, Yp, Xp, YmaxPixel); Y1 := Y + Delta; if YAxis.Scale = LOG_SCALE then Y1 := Log10(Y1); Yp1 := Ypixel(Y1); if Yp1 >= YminPixel then begin PlotLine(Canvas, Xp - Size, Yp1, Xp + Size + 1, Yp1); PlotLine(Canvas, Xp, Yp, Xp, Yp1); end else PlotLine(Canvas, Xp, Yp, Xp, YminPixel); end; procedure GenPlotCurve(Canvas : TCanvas; X, Y, S : PVector; Ns : Integer; Lbound, Ubound : Integer; CurvParam : TCurvParam; ErrorBars : Boolean); { General curve plotting routine } var X1, Y1, X2, Y2 : Float; Xp1, Yp1, Xp2, Yp2 : Integer; I : Integer; Flag1, Flag2 : Boolean; PenWidth : Integer; PenStyle : TpenStyle; PenColor, BrushColor : TColor; BrushStyle : TBrushStyle; begin with Canvas do begin { Save current settings } PenColor := Pen.Color; PenStyle := Pen.Style; PenWidth := Pen.Width; BrushColor := Brush.Color; BrushStyle := Brush.Style; Pen.Color := CurvParam.LineParam.Color; Pen.Style := CurvParam.LineParam.Style; Pen.Width := CurvParam.LineParam.Width; Brush.Color := CurvParam.PointParam.Color; if CurvParam.PointParam.Symbol in [0, 1, 3, 5] then Brush.Style := bsSolid else Brush.Style := bsClear; { Plot first point } X1 := X^[Lbound]; if XAxis.Scale = LOG_SCALE then X1 := Log10(X1); Y1 := Y^[Lbound]; if YAxis.Scale = LOG_SCALE then Y1 := Log10(Y1); Flag1 := CheckPoint(X1, Y1, Xp1, Yp1); if Flag1 then begin PlotSymbol(Canvas, Xp1, Yp1, CurvParam.PointParam.Symbol, CurvParam.PointParam.Size); if ErrorBars and (S^[Lbound] > 0.0) then PlotErrorBar(Canvas, Y^[Lbound], S^[Lbound], Ns, Xp1, Yp1, CurvParam.PointParam.Size); end; { Plot other points and connect them by lines if necessary } I := Lbound + CurvParam.Step; while I <= Ubound do begin X2 := X^[I]; if XAxis.Scale = LOG_SCALE then X2 := Log10(X2); Y2 := Y^[I]; if YAxis.Scale = LOG_SCALE then Y2 := Log10(Y2); Flag2 := CheckPoint(X2, Y2, Xp2, Yp2); if Flag2 then begin PlotSymbol(Canvas, Xp2, Yp2, CurvParam.PointParam.Symbol, CurvParam.PointParam.Size); if ErrorBars and (S^[I] > 0.0) then PlotErrorBar(Canvas, Y^[I], S^[I], Ns, Xp2, Yp2, CurvParam.PointParam.Size); if CurvParam.Connect and Flag1 then PlotLine(Canvas, Xp1, Yp1, Xp2, Yp2); end; Xp1 := Xp2; Yp1 := Yp2; Flag1 := Flag2; Inc(I, CurvParam.Step); end; { Restore settings } Pen.Color := PenColor; Pen.Style := PenStyle; Pen.Width := PenWidth; Brush.Color := BrushColor; Brush.Style := BrushStyle; end; end; procedure PlotCurve(Canvas : TCanvas; X, Y : PVector; Lbound, Ubound : Integer; CurvParam : TCurvParam); var Ns : Integer; { Dummy variables } S : PVector; begin GenPlotCurve(Canvas, X, Y, S, Ns, Lbound, Ubound, CurvParam, False); end; procedure PlotCurveWithErrorBars(Canvas : TCanvas; X, Y, S : PVector; Ns : Integer; Lbound, Ubound : Integer; CurvParam : TCurvParam); begin GenPlotCurve(Canvas, X, Y, S, Ns, Lbound, Ubound, CurvParam, True); end; procedure PlotFunc(Canvas : TCanvas; Func : TFunc; Xmin, Xmax : Float; Npt : Integer; LineParam : TLineParam); var PenColor : TColor; PenStyle : TpenStyle; PenWidth : Integer; X1, Y1, X2, Y2, H : Float; Xp1, Yp1, Xp2, Yp2 : Integer; Flag1, Flag2 : Boolean; I : Integer; begin if (Npt < 2) or (LineParam.Style = psClear) then Exit; if Xmin >= Xmax then begin Xmin := XAxis.Min; Xmax := XAxis.Max; end; H := (Xmax - Xmin) / Npt; with Canvas do begin { Save current settings } PenColor := Pen.Color; PenStyle := Pen.Style; PenWidth := Pen.Width; Pen.Color := LineParam.Color; Pen.Style := LineParam.Style; Pen.Width := LineParam.Width; { Check first point } X1 := Xmin; if XAxis.Scale = LIN_SCALE then Y1 := Func(X1) else Y1 := Func(Exp10(X1)); if YAxis.Scale = LOG_SCALE then Y1 := Log10(Y1); Flag1 := CheckPoint(X1, Y1, Xp1, Yp1); { Check other points and plot lines if possible } for I := 1 to Npt do begin X2 := X1 + H; if XAxis.Scale = LIN_SCALE then Y2 := Func(X2) else Y2 := Func(Exp10(X2)); if YAxis.Scale = LOG_SCALE then Y2 := Log10(Y2); Flag2 := CheckPoint(X2, Y2, Xp2, Yp2); if Flag1 and Flag2 then PlotLine(Canvas, Xp1, Yp1, Xp2, Yp2); X1 := X2; Xp1 := Xp2; Yp1 := Yp2; Flag1 := Flag2; end; { Restore settings } Pen.Color := PenColor; Pen.Style := PenStyle; Pen.Width := PenWidth; end; end; procedure WriteLegend(Canvas : TCanvas; NCurv : Integer; CurvParam : PCurvParamArray; ShowPoints, ShowLines : Boolean); var CharHeight, I, L, Lmax, N, Nmax, Xp, Xl, Y : Integer; PenWidth : Integer; PenStyle : TpenStyle; PenColor, BrushColor : TColor; BrushStyle : TBrushStyle; begin N := 0; { Nb of legends to be plotted } Lmax := 0; { Length of the longest legend } for I := 1 to NCurv do if CurvParam^[I].Legend <> '' then begin Inc(N); L := Canvas.TextWidth(CurvParam^[I].Legend); if L > Lmax then Lmax := L; end; if (N = 0) or (Lmax = 0) then Exit; { Character height } CharHeight := Canvas.TextHeight('M'); { Max. number of legends which may be plotted } Nmax := Round((YmaxPixel - YminPixel) / CharHeight) - 1; if N > Nmax then N := Nmax; { Draw rectangle around the legends } Canvas.Rectangle(XmaxPixel + Round(0.02 * GraphWidth), YminPixel, XmaxPixel + Round(0.12 * GraphWidth) + Lmax, YminPixel + (N + 1) * CharHeight); L := Round(0.02 * GraphWidth); { Half-length of line } Xp := XmaxPixel + 3 * L; { Position of symbol } Xl := XmaxPixel + 5 * L; { Position of legend } { Save current settings } with Canvas do begin PenColor := Pen.Color; PenStyle := Pen.Style; PenWidth := Pen.Width; BrushColor := Brush.Color; BrushStyle := Brush.Style; end; for I := 1 to IMin(NCurv, Nmax) do with Canvas do begin Pen.Color := CurvParam^[I].LineParam.Color; Pen.Style := CurvParam^[I].LineParam.Style; Pen.Width := CurvParam^[I].LineParam.Width; Brush.Color := CurvParam^[I].PointParam.Color; if CurvParam^[I].PointParam.Symbol in [0, 1, 3, 5] then Brush.Style := bsSolid else Brush.Style := bsClear; { Plot point and line } Y := YminPixel + I * CharHeight; if ShowPoints then PlotSymbol(Canvas, Xp, Y, CurvParam^[I].PointParam.Symbol, CurvParam^[I].PointParam.Size); if ShowLines then PlotLine(Canvas, Xp - L, Y, Xp + L, Y); { Write legend } Brush.Style := bsClear; Canvas.TextOut(Xl, Y - CharHeight div 2, CurvParam^[I].Legend); end; { Restore settings } with Canvas do begin Pen.Color := PenColor; Pen.Style := PenStyle; Pen.Width := PenWidth; Brush.Color := BrushColor; Brush.Style := BrushStyle; end; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/texplot.pas0000664000175000017500000003621411326434466021762 0ustar michaelmichael{ ********************************************************************** * Unit TEXPLOT.PAS * * Version 1.1 * * (c) J. Debord, June 2001 * ********************************************************************** Plotting routines for TeX/PSTricks ********************************************************************** } unit TexPlot; interface uses FMath, Matrices, PaString; { ********************** Include global variables ********************** } {$I PLOTVAR.INC} { ************************** Graphic routines ************************** } procedure InitTexGraph(var F : Text; FileName : String); { ---------------------------------------------------------------------- Initializes TeX graphics. Writes a border around the graph according to the value of the global variable GraphBorder (defined in PLOTVAR.INC) ---------------------------------------------------------------------- F : file to be written FileName : name of TeX file (e.g. 'figure.tex') ---------------------------------------------------------------------- } function Xcm(X : Float) : Float; { ---------------------------------------------------------------------- Converts user coordinate X to cm ---------------------------------------------------------------------- } function Ycm(Y : Float) : Float; { ---------------------------------------------------------------------- Converts user coordinate Y to cm ---------------------------------------------------------------------- } procedure WriteXAxis(var F : Text); { ---------------------------------------------------------------------- Writes horizontal axis (global variable XAxis in PLOTVAR.INC) ---------------------------------------------------------------------- } procedure WriteYAxis(var F : Text); { ---------------------------------------------------------------------- Writes vertical axis (global variable YAxis in PLOTVAR.INC) ---------------------------------------------------------------------- } procedure WriteGrid(var F : Text); { ---------------------------------------------------------------------- Writes a grid (global variable Grid in PLOTVAR.INC) ---------------------------------------------------------------------- } procedure WriteLine(var F : Text; X1, Y1, X2, Y2 : Float; Style : String); { ---------------------------------------------------------------------- Writes a line between two points ---------------------------------------------------------------------- F : output file X1, Y1 : coordinates of first point X2, Y2 : coordinates of second point Style : line style (must be 'solid', 'dotted' or 'dashed') ---------------------------------------------------------------------- } procedure WritePoints(var F : Text; X, Y : PVector; Lbound, Ubound, Symbol, Size : Integer); { ---------------------------------------------------------------------- Writes a set of points ---------------------------------------------------------------------- F : output file X, Y : point coordinates Lbound, Ubound : indices of first and last point Symbol : 1 = solid circle 2 = open circle 3 = solid square 4 = open square 5 = solid triangle 6 = open triangle 7 = plus (+) 8 = multiply (x) 9 = star (*) Size : size of points ---------------------------------------------------------------------- } procedure WriteText(var F : Text; Place : String; X, Y : Float; S : String); { ---------------------------------------------------------------------- Writes a text ---------------------------------------------------------------------- F : output file Place : defines the position of point (X,Y) with respect to the box enclosing the text the possible values are 'tl', 't', 'tr', 'l', 'r', 'Bl', 'B', 'Br', 'bl', 'b', 'br' according to the following scheme: t tl +---------------------+ tr | | | | l | | r | | Bl |----------B----------| Br bl +---------------------+ br b X, Y : position of text S : text to be written ---------------------------------------------------------------------- } procedure WriteNumber(var F : Text; Place : String; X, Y, Z : Float); { ---------------------------------------------------------------------- Writes a number ---------------------------------------------------------------------- Z is the number to be written Other parameters as in WriteText ---------------------------------------------------------------------- } procedure WriteCurve(var F : Text; X, Y : PVector; Lbound, Ubound, Width : Integer; Style : String; Smooth : Boolean); { ---------------------------------------------------------------------- Writes a curve ---------------------------------------------------------------------- F : output file X, Y : point coordinates Lbound, Ubound : indices of first and last point Width : curve width in units of 0.01 cm Style : curve style (must be 'solid', 'dotted' or 'dashed') Smooth : indicates if the curve must be smoothed ---------------------------------------------------------------------- } procedure WriteFunc(var F : Text; Func : TFunc; X1, X2 : Float; Npt, Width : Integer; Style : String); { ---------------------------------------------------------------------- Writes the curve representing a function ---------------------------------------------------------------------- F : output file Func : function to be plotted X1, X2 : abscissae of 1st and last point to plot Npt : number of points Width, Style : width of curve (as in WriteCurve) ---------------------------------------------------------------------- The function must be programmed as: function Func(X : Float) : Float; ---------------------------------------------------------------------- } procedure CloseTexGraph(var F : Text); { ---------------------------------------------------------------------- Close graphics ---------------------------------------------------------------------- } implementation const PAGEWIDTH = 13; { Graph width in cm } PAGEHEIGHT = 10; { Graph height in cm } var XminCm, YminCm : Float; { Coord. of lower left corner in cm } XmaxCm, YmaxCm : Float; { Coord. of upper right corner in cm } FactX, FactY : Float; { Scaling factors } function Xcm(X : Float) : Float; { Converts user coordinate X to cm } begin Xcm := XminCm + FactX * (X - XAxis.Min); end; function Ycm(Y : Float) : Float; { Converts user coordinate Y to cm } begin Ycm := YminCm + FactY * (Y - YAxis.Min); end; procedure WriteHeader(var F : Text); begin WriteLn(F, '\documentclass[12pt,a4paper]{article}'); WriteLn(F, '\usepackage{t1enc}'); WriteLn(F, '\usepackage{pst-plot}'); WriteLn(F, '\begin{document}'); WriteLn(F); WriteLn(F, '\begin{pspicture}(', PAGEWIDTH, ',', PAGEHEIGHT, ')'); end; procedure WriteCoord(var F : Text; X, Y : Float); { Writes the coordinates (in cm) of a point } var NSZ : Boolean; begin NSZ := NSZEro; NSZero := False; Write(F, '(', Trim(FloatToStr(X)), ',', Trim(FloatToStr(Y)), ')'); NSZEro := NSZ; end; procedure WriteLine(var F : Text; X1, Y1, X2, Y2 : Float; Style : String); begin Write(F, '\psline'); if Style <> '' then Write(F, '[linestyle=', Style, ']'); WriteCoord(F, X1, Y1); WriteCoord(F, X2, Y2); WriteLn(F); end; procedure WriteText(var F : Text; Place : String; X, Y : Float; S : String); begin Write(F, '\rput[', Place, ']'); WriteCoord(F, X, Y); WriteLn(F, '{', S, '}'); end; procedure WriteNumber(var F : Text; Place : String; X, Y, Z : Float); begin Write(F, '\rput[', Place, ']'); WriteCoord(F, X, Y); WriteLn(F, '{', Trim(FloatToStr(Z)), '}'); end; procedure WriteXAxis(var F: Text); var W, X, Xc, Z : Float; N, I, J : Integer; NSZ : Boolean; begin WriteLine(F, XminCm, YminCm, XmaxCm, YminCm, ''); N := Round((XAxis.Max - XAxis.Min) / XAxis.Step); { Nb of intervals } X := XAxis.Min; { Tick mark position } NSZ := NSZero; NSZero := False; { Don't write non significant zero's } for I := 0 to N do { Label axis } begin if (XAxis.Scale = LIN_SCALE) and (Abs(X) < EPS) then X := 0.0; Xc := Xcm(X); WriteLine(F, Xc, YminCm, Xc, YminCm - 0.25, ''); { Tick mark } if XAxis.Scale = LIN_SCALE then Z := X else Z := Exp10(X); WriteNumber(F, 't', Xc, YminCm - 0.35, Z); { Label } if (XAxis.Scale = LOG_SCALE) and (I < N) then for J := 2 to 9 do { Plot minor divisions } begin { on logarithmic scale } W := X + Log10(J); Xc := Xcm(W); WriteLine(F, Xc, YminCm, Xc, YminCm - 0.15, ''); end; X := X + XAxis.Step; end; { Write axis title } if XTitle.Text <> '' then WriteText(F, 't', 0.5 * (XminCm + XmaxCm), YminCm - 1.0, XTitle.Text); NSZero := NSZ; end; procedure WriteYAxis(var F : Text); var W, Y, Yc, Z : Float; N, I, J : Integer; NSZ : Boolean; begin WriteLine(F, XminCm, YminCm, XminCm, YmaxCm, ''); N := Round((YAxis.Max - YAxis.Min) / YAxis.Step); Y := YAxis.Min; NSZ := NSZero; NSZero := False; for I := 0 to N do begin if (YAxis.Scale = LIN_SCALE) and (Abs(Y) < EPS) then Y := 0.0; Yc := Ycm(Y); WriteLine(F, XminCm, Yc, XminCm - 0.25, Yc, ''); if YAxis.Scale = LIN_SCALE then Z := Y else Z := Exp10(Y); WriteNumber(F, 'r', XminCm - 0.35, Yc, Z); if (YAxis.Scale = LOG_SCALE) and (I < N) then for J := 2 to 9 do begin W := Y + Log10(J); Yc := Ycm(W); WriteLine(F, XminCm, Yc, XminCm - 0.15, Yc, ''); end; Y := Y + YAxis.Step; end; { Write axis title } if YTitle.Text <> '' then WriteText(F, 'l', XminCm, YmaxCm + 0.5, YTitle.Text); NSZero := NSZ; end; procedure WriteGrid(var F : Text); var X, Y, Xc, Yc : Float; I, N : Integer; begin { Horizontal lines } if Grid in [HORIZ_GRID, BOTH_GRID] then begin N := Round((YAxis.Max - YAxis.Min) / YAxis.Step); { Nb of intervals } for I := 1 to Pred(N) do begin Y := YAxis.Min + I * YAxis.Step; { Origin of line } Yc := Ycm(Y); WriteLine(F, XminCm, Yc, XmaxCm, Yc, 'dotted'); end; end; { Vertical lines } if Grid in [VERTIC_GRID, BOTH_GRID] then begin N := Round((XAxis.Max - XAxis.Min) / XAxis.Step); for I := 1 to Pred(N) do begin X := XAxis.Min + I * XAxis.Step; Xc := Xcm(X); WriteLine(F, Xc, YminCm, Xc, YmaxCm, 'dotted'); end; end; end; procedure InitTexGraph(var F : Text; Filename : String); begin XminCm := 0.01 * Xwin1 * PAGEWIDTH; XmaxCm := 0.01 * Xwin2 * PAGEWIDTH; YminCm := 0.01 * Ywin1 * PAGEHEIGHT; YmaxCm := 0.01 * Ywin2 * PAGEHEIGHT; FactX := (XmaxCm - XminCm) / (XAxis.Max - XAxis.Min); FactY := (YmaxCm - YminCm) / (YAxis.Max - YAxis.Min); Assign(F, FileName); Rewrite(F); WriteHeader(F); if GraphBorder then begin Write(F, '\pspolygon'); WriteCoord(F, XminCm, YminCm); WriteCoord(F, XmaxCm, YminCm); WriteCoord(F, XmaxCm, YmaxCm); WriteCoord(F, XminCm, YmaxCm); WriteLn(F); end; end; procedure WritePoint(var F : Text; X, Y : Float); var Xc, Yc : Float; begin if XAxis.Scale = LOG_SCALE then X := Log10(X); if YAxis.Scale = LOG_SCALE then Y := Log10(Y); Xc := Xcm(X); Yc := Ycm(Y); if (Xc >= XminCm) and (Xc <= XmaxCm) and (Yc >= YminCm) and (Yc <= YmaxCm) then WriteCoord(F, Xc, Yc); end; procedure WritePoints(var F : Text; X, Y : PVector; Lbound, Ubound, Symbol, Size : Integer); var I, N : Integer; begin Write(F, '\psdots[dotscale=', Size, ' ', Size, ', dotstyle='); case Symbol of 1 : Write(F, '*'); 2 : Write(F, 'o'); 3 : Write(F, 'square*'); 4 : Write(F, 'square'); 5 : Write(F, 'triangle*'); 6 : Write(F, 'triangle'); 7 : Write(F, '+'); 8 : Write(F, 'x'); 9 : Write(F, 'asterisk'); end; WriteLn(F, ']%'); I := Lbound; repeat WritePoint(F, X^[I], Y^[I]); if (I > 0) and (I < Ubound) and (I mod 5 = 0) then WriteLn(F, '%'); Inc(I); until I > Ubound; WriteLn(F); end; procedure WriteCurve(var F : Text; X, Y : PVector; Lbound, Ubound, Width : Integer; Style : String; Smooth : Boolean); var I, N : Integer; W : Float; Ws : String; begin W := 0.01 * Width; Str(W:5:2, Ws); Ws := Trim(Ws); if Smooth then Write(F, '\pscurve') else Write(F, '\psline'); WriteLn(F, '[linewidth=', Ws, ', linestyle=', Style, ']%'); I := Lbound; repeat WritePoint(F, X^[I], Y^[I]); if (I > 0) and (I < Ubound) and (I mod 5 = 0) then WriteLn(F, '%'); Inc(I); until I > Ubound; WriteLn(F); end; procedure WriteFunc(var F : Text; Func : TFunc; X1, X2 : Float; Npt, Width : Integer; Style : String); const X : PVector = nil; Y : PVector = nil; N : Integer = 0; var H : Float; I : Integer; begin if Npt <> N then begin DelVector(X, N); DelVector(Y, N); DimVector(X, Npt); DimVector(Y, Npt); N := Npt; end; H := (X2 - X1) / N; for I := 0 to N do begin X^[I] := X1 + I * H; if XAxis.Scale = LIN_SCALE then Y^[I] := Func(X^[I]) else Y^[I] := Func(Exp10(X^[I])); end; WriteCurve(F, X, Y, 0, N, Width, Style, True); end; procedure CloseTexGraph(var F: Text); begin WriteLn(F, '\end{pspicture}'); WriteLn(F); WriteLn(F, '\end{document}'); Close(F); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/stat.pas0000664000175000017500000002557311326434466021244 0ustar michaelmichael{ ********************************************************************** * Unit STAT.PAS * * Version 1.5 * * (c) J. Debord, June 2001 * ********************************************************************** Statistical routines ********************************************************************** } unit Stat; interface uses FMath, Matrices; { ---------------------------------------------------------------------- Common input parameters : X : Vector of statistical variable Lbound, Ubound : Indices of first and last elements of X W : Vector of weights ---------------------------------------------------------------------- } procedure QSort(X : PVector; Lbound, Ubound : Integer); { ---------------------------------------------------------------------- Sorts the elements of vector X in increasing order (quick sort) ---------------------------------------------------------------------- } procedure DQSort(X : PVector; Lbound, Ubound : Integer); { ---------------------------------------------------------------------- Sorts the elements of vector X in decreasing order (quick sort) ---------------------------------------------------------------------- } function Median(X : PVector; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Sorts vector X is ascending order and returns its median value ---------------------------------------------------------------------- } function Sum(X : PVector; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Returns the sum of the elements of vector X ---------------------------------------------------------------------- } function SumSqr(X : PVector; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Returns the sum of squared elements of vector X ---------------------------------------------------------------------- } function SumSqrDif(X : PVector; Lbound, Ubound : Integer; A : Float) : Float; { ---------------------------------------------------------------------- Returns the sum of squared differences between the elements of vector X and the constant A ---------------------------------------------------------------------- } function SumSqrDifVect(X, Y : PVector; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Returns the sum of squared differences between two vectors ---------------------------------------------------------------------- } function SumWSqr(X, W : PVector; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Returns the sum of weighted squared elements of vector X ---------------------------------------------------------------------- } function SumWSqrDif(X, W : PVector; Lbound, Ubound : Integer; A : Float) : Float; { ---------------------------------------------------------------------- Returns the sum of weighted squared differences between the elements of vector X and the constant A ---------------------------------------------------------------------- } function SumWSqrDifVect(X, Y, W : PVector; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Returns the sum of weighted squared differences between two vectors ---------------------------------------------------------------------- } function Average(X : PVector; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Returns the average value of vector X ---------------------------------------------------------------------- } function Variance(X : PVector; Lbound, Ubound : Integer; Avg : Float) : Float; { ---------------------------------------------------------------------- Returns the variance of vector X, with average Avg ---------------------------------------------------------------------- } function EstVar(X : PVector; Lbound, Ubound : Integer; Avg : Float) : Float; { ---------------------------------------------------------------------- Returns the estimated variance of the population to which vector X belongs ---------------------------------------------------------------------- } function Skewness(X : PVector; Lbound, Ubound : Integer; Avg, Sigma : Float) : Float; { ---------------------------------------------------------------------- Returns the skewness of vector X, with average Avg and standard deviation Sigma ---------------------------------------------------------------------- } function Kurtosis(X : PVector; Lbound, Ubound : Integer; Avg, Sigma : Float) : Float; { ---------------------------------------------------------------------- Returns the kurtosis of vector X, with average Avg and standard deviation Sigma ---------------------------------------------------------------------- } procedure RanMult(M : PVector; L : PMatrix; N : Integer; X : PVector); { ---------------------------------------------------------------------- Samples a vector X from the N-dimensioned multinormal distribution with mean vector M. L is the Cholesky factor of the variance-covariance matrix. ---------------------------------------------------------------------- } implementation procedure QSort(X : PVector; Lbound, Ubound : Integer); { Quick sort in ascending order - Adapted from Borland's BP7 demo } procedure Sort(L, R : Integer); var I, J : Integer; U, V : Float; begin I := L; J := R; U := X^[(L + R) div 2]; repeat while X^[I] < U do I := I + 1; while U < X^[J] do J := J - 1; if I <= J then begin V := X^[I]; X^[I] := X^[J]; X^[J] := V; I := I + 1; J := J - 1; end; until I > J; if L < J then Sort(L, J); if I < R then Sort(I, R); end; begin Sort(Lbound, Ubound); end; procedure DQSort(X : PVector; Lbound, Ubound : Integer); { Quick sort in descending order - Adapted from Borland's BP7 demo } procedure Sort(L, R : Integer); var I, J : Integer; U, V : Float; begin I := L; J := R; U := X^[(L + R) div 2]; repeat while X^[I] > U do I := I + 1; while U > X^[J] do J := J - 1; if I <= J then begin V := X^[I]; X^[I] := X^[J]; X^[J] := V; I := I + 1; J := J - 1; end; until I > J; if L < J then Sort(L, J); if I < R then Sort(I, R); end; begin Sort(Lbound, Ubound); end; function Median(X : PVector; Lbound, Ubound : Integer) : Float; var N, N2 : Integer; begin N := Ubound - Lbound + 1; N2 := N div 2 + Lbound - 1; QSort(X, Lbound, Ubound); if Odd(N) then Median := X^[N2 + 1] else Median := 0.5 * (X^[N2] + X^[N2 + 1]); end; function Sum(X : PVector; Lbound, Ubound : Integer) : Float; var S : Float; I : Integer; begin S := 0.0; for I := Lbound to Ubound do S := S + X^[I]; Sum := S; end; function SumSqr(X : PVector; Lbound, Ubound : Integer) : Float; var S : Float; I : Integer; begin S := 0.0; for I := Lbound to Ubound do S := S + Sqr(X^[I]); SumSqr := S; end; function SumSqrDif(X : PVector; Lbound, Ubound : Integer; A : Float) : Float; var S : Float; I : Integer; begin S := 0.0; for I := Lbound to Ubound do S := S + Sqr(X^[I] - A); SumSqrDif := S; end; function SumSqrDifVect(X, Y : PVector; Lbound, Ubound : Integer) : Float; var S : Float; I : Integer; begin S := 0.0; for I := Lbound to Ubound do S := S + Sqr(X^[I] - Y^[I]); SumSqrDifVect := S; end; function SumWSqr(X, W : PVector; Lbound, Ubound : Integer) : Float; var S : Float; I : Integer; begin S := 0.0; for I := Lbound to Ubound do S := S + W^[I] * Sqr(X^[I]); SumWSqr := S; end; function SumWSqrDif(X, W : PVector; Lbound, Ubound : Integer; A : Float) : Float; var S : Float; I : Integer; begin S := 0.0; for I := Lbound to Ubound do S := S + W^[I] * Sqr(X^[I] - A); SumWSqrDif := S; end; function SumWSqrDifVect(X, Y, W : PVector; Lbound, Ubound : Integer) : Float; var S : Float; I : Integer; begin S := 0.0; for I := Lbound to Ubound do S := S + W^[I] * Sqr(X^[I] - Y^[I]); SumWSqrDifVect := S; end; function Average(X : PVector; Lbound, Ubound : Integer) : Float; begin Average := Sum(X, Lbound, Ubound) / (Ubound - Lbound + 1); end; function Variance(X : PVector; Lbound, Ubound : Integer; Avg : Float) : Float; begin Variance := SumSqrDif(X, Lbound, Ubound, Avg) / (Ubound - Lbound + 1); end; function EstVar(X : PVector; Lbound, Ubound : Integer; Avg : Float) : Float; begin EstVar := SumSqrDif(X, Lbound, Ubound, Avg) / (Ubound - Lbound); end; function Skewness(X : PVector; Lbound, Ubound : Integer; Avg, Sigma : Float) : Float; var S, T : Float; I : Integer; begin S := 0.0; for I := Lbound to Ubound do begin T := (X^[I] - Avg) / Sigma; S := S + T * Sqr(T); end; Skewness := S / (Ubound - Lbound + 1); end; function Kurtosis(X : PVector; Lbound, Ubound : Integer; Avg, Sigma : Float) : Float; var S, T : Float; I : Integer; begin S := 0.0; for I := Lbound to Ubound do begin T := (X^[I] - Avg) / Sigma; S := S + Sqr(Sqr(T)); end; Kurtosis := S / (Ubound - Lbound + 1) - 3.0; end; procedure RanMult(M : PVector; L : PMatrix; N : Integer; X : PVector); var U : PVector; I, J : Integer; begin { Form a vector of N independent standard normal variates } DimVector(U, N); for I := 1 to N do U^[I] := RanGaussStd; { Form X = M + L*U, which follows the multinormal distribution } for I := 1 to N do begin X^[I] := M^[I]; for J := 1 to I do X^[I] := X^[I] + L^[I]^[J] * U^[J]; end; DelVector(U, N); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/simopt.pas0000664000175000017500000002442511326434466021577 0ustar michaelmichael{ ********************************************************************** * Unit SIMOPT.PAS * * Version 1.0 * * (c) J. Debord, August 2000 * ********************************************************************** This unit implements simulated annealing for function minimization ********************************************************************** Reference: Program SIMANN.FOR by Bill Goffe (http://www.netlib.org/simann) ********************************************************************** } unit SimOpt; interface uses FMath, Matrices, Optim, Stat; const SA_Nt : Integer = 5; { Number of loops at constant temperature } SA_Ns : Integer = 15; { Number of loops before step adjustment } SA_Rt : Float = 0.9; { Temperature reduction factor } SA_NCycles : Integer = 1; { Number of cycles } function SimAnn(Func : TFuncNVar; X, Xmin, Xmax : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var F_min : Float) : Integer; { ---------------------------------------------------------------------- Minimization of a function of several variables by simulated annealing ---------------------------------------------------------------------- Input parameters : Func = objective function to be minimized X = initial minimum coordinates Xmin = minimum value of X Xmax = maximum value of X Lbound, Ubound = indices of first and last variables MaxIter = max number of annealing steps Tol = required precision ---------------------------------------------------------------------- Output parameter : X = refined minimum coordinates F_min = function value at minimum ---------------------------------------------------------------------- Possible results : OPT_OK OPT_NON_CONV ---------------------------------------------------------------------- } implementation var LogFile : Text; { Stores the result of each minimization step } procedure CreateLogFile; begin Assign(LogFile, LogFileName); Rewrite(LogFile); end; function InitTemp(Func : TFuncNVar; X, Xmin, Range : PVector; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Computes the initial temperature so that the probability of accepting an increase of the function is about 0.5 ---------------------------------------------------------------------- } const N_EVAL = 50; { Number of function evaluations } var T : Float; { Temperature } F, F1 : Float; { Function values } DeltaF : PVector; { Function increases } N_inc : Integer; { Number of function increases } I : Integer; { Index of function evaluation } K : Integer; { Index of parameter } begin DimVector(DeltaF, N_EVAL); T := 0.0; N_inc := 0; F := Func(X); { Compute N_EVAL function values, changing each parameter in turn } K := Lbound; for I := 1 to N_EVAL do begin X^[K] := Xmin^[K] + RanMar * Range^[K]; F1 := Func(X); if F1 > F then begin Inc(N_inc); DeltaF^[N_inc] := F1 - F; end; F := F1; Inc(K); if K > Ubound then K := Lbound; end; { The median M of these N_eval values has a probability of 1/2. From Boltzmann's formula: Exp(-M/T) = 1/2 ==> T = M / Ln(2) } T := Median(DeltaF, 1, N_inc) / LN2; if T = 0.0 then T := 1.0; InitTemp := T; DelVector(DeltaF, N_EVAL); end; function ParamConv(X, Step : PVector; Lbound, Ubound : Integer; Tol : Float) : Boolean; { ---------------------------------------------------------------------- Checks for convergence on parameters ---------------------------------------------------------------------- } var I : Integer; Conv : Boolean; begin I := Lbound; Conv := True; repeat Conv := Conv and (Step^[I] < FMax(Tol, Tol * Abs(X^[I]))); Inc(I); until (Conv = False) or (I > Ubound); ParamConv := Conv; end; function Accept(DeltaF, T : Float; var N_inc, N_acc : Integer) : Boolean; { ---------------------------------------------------------------------- Checks if a variation DeltaF of the function at temperature T is acceptable. Updates the counters N_inc (number of increases of the function) and N_acc (number of accepted increases). ---------------------------------------------------------------------- } begin if DeltaF < 0.0 then Accept := True else begin Inc(N_inc); if Expo(- DeltaF / T) > RanMar then begin Accept := True; Inc(N_acc); end else Accept := False; end; end; function SimAnnCycle(Func : TFuncNVar; X, Xmin, Xmax : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var LogFile : Text; var F_min : Float) : Integer; { ---------------------------------------------------------------------- Performs one cycle of simulated annealing ---------------------------------------------------------------------- } const N_FACT = 2.0; { Factor for step reduction } var I, Iter, J, K, N_inc, N_acc : Integer; F, F1, DeltaF, Ratio, T, OldX : Float; Range, Step, Xopt : PVector; Nacc : PIntVector; begin DimVector(Step, Ubound); DimVector(Xopt, Ubound); DimVector(Range, Ubound); DimIntVector(Nacc, Ubound); { Determine parameter range, step and optimum } for K := Lbound to Ubound do begin Range^[K] := Xmax^[K] - Xmin^[K]; Step^[K] := 0.5 * Range^[K]; Xopt^[K] := X^[K]; end; { Initialize function values } F := Func(X); F_min := F; { Initialize temperature and iteration count } T := InitTemp(Func, X, Xmin, Range, Lbound, Ubound); Iter := 0; repeat { Perform SA_Nt evaluations at constant temperature } N_inc := 0; N_acc := 0; for I := 1 to SA_Nt do begin for J := 1 to SA_Ns do for K := Lbound to Ubound do begin { Save current parameter value } OldX := X^[K]; { Pick new value, keeping it within Range } X^[K] := X^[K] + (2.0 * RanMar - 1.0) * Step^[K]; if (X^[K] < Xmin^[K]) or (X^[K] > Xmax^[K]) then X^[K] := Xmin^[K] + RanMar * Range^[K]; { Compute new function value } F1 := Func(X); DeltaF := F1 - F; { Check for acceptance } if Accept(DeltaF, T, N_inc, N_acc) then begin Inc(Nacc^[K]); F := F1; end else { Restore parameter value } X^[K] := OldX; { Update minimum if necessary } if F < F_min then begin Xopt^[K] := X^[K]; F_min := F; end; end; { Ajust step length to maintain an acceptance ratio of about 50% for each parameter } for K := Lbound to Ubound do begin Ratio := Int(Nacc^[K]) / Int(SA_Ns); if Ratio > 0.6 then begin { Increase step length, keeping it within Range } Step^[K] := Step^[K] * (1.0 + ((Ratio - 0.6) / 0.4) * N_FACT); if Step^[K] > Range^[K] then Step^[K] := Range^[K]; end else if Ratio < 0.4 then { Reduce step length } Step^[K] := Step^[K] / (1.0 + ((0.4 - Ratio) / 0.4) * N_FACT); { Restore counter } Nacc^[K] := 0; end; end; if WriteLogFile then WriteLn(LogFile, Iter:4, ' ', T:12, ' ', F:12, N_inc:6, N_acc:6); { Update temperature and iteration count } T := T * SA_Rt; Inc(Iter); until ParamConv(Xopt, Step, Lbound, Ubound, Tol) or (Iter > MaxIter); for K := Lbound to Ubound do X^[K] := Xopt^[K]; DelVector(Step, Ubound); DelVector(Xopt, Ubound); DelVector(Range, Ubound); DelIntVector(Nacc, Ubound); if Iter > MaxIter then SimAnnCycle := OPT_NON_CONV else SimAnnCycle := OPT_OK; end; function SimAnn(Func : TFuncNVar; X, Xmin, Xmax : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var F_min : Float) : Integer; var Cycle, ErrCode : Integer; begin if WriteLogFile then CreateLogFile; { Initialize the Marsaglia random number generator using the standard Pascal generator } Randomize; RMarIn(System.Random(10000), System.Random(10000)); Cycle := 1; repeat if WriteLogFile then begin WriteLn(LogFile, 'Simulated annealing: Cycle ', Cycle); WriteLn(LogFile); WriteLn(LogFile, 'Iter T F Inc Acc'); end; ErrCode := SimAnnCycle(Func, X, Xmin, Xmax, Lbound, Ubound, MaxIter, Tol, LogFile, F_min); Inc(Cycle); until (Cycle > SA_NCycles) or (ErrCode <> OPT_OK); if WriteLogFile then Close(LogFile); SimAnn := ErrCode; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/Regress.pas0000664000175000017500000013260011326434466021671 0ustar michaelmichael{ ********************************************************************** * Unit REGRESS.PAS * * Version 2.2 * * (c) J. Debord, August 2000 * ********************************************************************** Regression routines ********************************************************************** } unit Regress; interface uses FMath, Matrices, Eigen, Optim, SimOpt, Stat,dialogs; { ********************************************************************** Type definitions ********************************************************************** } { Algorithm for linear regression } type TRegAlgo = ( GAUSS_JORDAN, { Gauss-Jordan solution of normal equations } SVD); { Singular value decomposition } { Optimization algorithm for nonlinear regression } type TOptAlgo = ( NL_MARQ, { Marquardt algorithm } NL_SIMP, { Simplex algorithm } NL_BFGS, { BFGS algorithm } NL_SA); { Simulated annealing } { Regression modes } type TRegMode = (UNWEIGHTED, WEIGHTED); { Regression function } type TRegFunc = function(X : Float; B : PVector) : Float; { Procedure to compute the derivatives of the regression function with respect to the regression parameters } type TDerivProc = procedure(RegFunc : TRegFunc; X, Y : Float; B, D : PVector); { Test of regression } type TRegTest = record Vr, { Residual variance } R2, { Coefficient of determination } R2a, { Adjusted coeff. of determination } F, { Variance ratio (explained/residual) } Prob : Float; { Probability of F } end; { ********************************************************************** Procedures to modify the regression settings ********************************************************************** } procedure SetRegAlgo(Algo : TRegAlgo); { ---------------------------------------------------------------------- Sets the linear regression algorithm according to Algo, which must be GAUSS_JORDAN or SVD. The default algorithm is SVD. ---------------------------------------------------------------------- } procedure SetOptAlgo(Algo : TOptAlgo); { ---------------------------------------------------------------------- Sets the optimization algorithm according to Algo, which must be NL_MARQ, NL_SIMP, NL_BFGS or NL_SA. The default algorithm is NL_MARQ. ---------------------------------------------------------------------- } procedure SetFirstPoint(Index : Integer); { ---------------------------------------------------------------------- Sets the index of the first data point (usually 0 or 1). The default value is 1. ---------------------------------------------------------------------- } function GetRegAlgo : TRegAlgo; { ---------------------------------------------------------------------- Returns the linear regression algorithm ---------------------------------------------------------------------- } function GetOptAlgo : TOptAlgo; { ---------------------------------------------------------------------- Returns the optimization algorithm ---------------------------------------------------------------------- } function GetFirstPoint : Integer; { ---------------------------------------------------------------------- Returns the index of the first data point ---------------------------------------------------------------------- } { ********************************************************************** Unweighted regression routines ********************************************************************** These routines fit equations to data by minimizing the sum of squared residuals : SS = Sum [y(k) - ycalc(k)]^2 where y(k) and ycalc(k) are respectively the observed and calculated value of the dependent variable for observation k. ycalc(k) is a function of the regression parameters b(0), b(1) ... The following regression types are implemented : * Simple linear regression : y(k) = b(0) + b(1) * x(k) * Multiple linear regression : y(k) = b(0) + b(1) * x(1,k) + b(2) * x(2,k) + ... + b(Nvar) * x(Nvar,k) * Polynomial regression : y(k) = b(0) + b(1) * x(k) + b(2) * x(k)^2 + ... + b(Deg) * x(k)^Deg * Nonlinear regression : y(k) = f[x(k), b(0), b(1), ... ] where f is a user-specified function. The following parameters are common to all routines : Input : X = Vector or matrix of independent variables Y = Vector of dependent variable N = Index of the last observation Output : B = Regression parameters V = Inverse matrix of normal equations ********************************************************************** } function LinFit(X, Y : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; { ---------------------------------------------------------------------- Simple linear regression ---------------------------------------------------------------------- } function MulFit(X : PMatrix; Y : PVector; N, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix) : Integer; { ---------------------------------------------------------------------- Multiple linear regression ---------------------------------------------------------------------- Additional input parameters : Nvar = Index of the last independent variable ConsTerm = Flags the presence of a constant term b(0) ---------------------------------------------------------------------- } function PolFit(X, Y : PVector; N, Deg : Integer; B : PVector; V : PMatrix) : Integer; { ---------------------------------------------------------------------- Polynomial regression ---------------------------------------------------------------------- Additional input parameter : Deg = Degree of polynomial ---------------------------------------------------------------------- } function NLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y : PVector; N, Lbound, Ubound, MaxIter : Integer; Tol : Float; B, B_min, B_max : PVector; V : PMatrix) : Integer; { ---------------------------------------------------------------------- Nonlinear regression ---------------------------------------------------------------------- Additional input parameters : RegFunc = Regression function DerivProc = Procedure to compute the derivatives of RegFunc Lbound, Ubound = Indices of first and last function parameters MaxIter = Maximum number of iterations Tol = Required parameter precision B = Initial parameter values B_min, B_max = Lower and upper parameter bounds ---------------------------------------------------------------------- } { ********************************************************************** Weighted regression routines ********************************************************************** These routines fit equations to data by minimizing the sum of weighted squared residuals : SWS = Sum w(k)*[y(k) - ycalc(k)]^2 where the "weight" w(k) is inversely proportional to the variance v(k) of the observation y(k). v(k) is usually computed as : v(k) = Vr * g[y(k)] = Vr / w(k) where Vr is the residual variance and g is a user-specified function (e.g. g[y(k)] = y(k)^2 for a constant coefficient of variation). Function syntax and results are the same than for unweighted regression except that the vector of weights (W) is passed as an additional input parameter. ********************************************************************** } function WLinFit(X, Y, W : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; function WMulFit(X : PMatrix; Y, W : PVector; N, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix) : Integer; function WPolFit(X, Y, W : PVector; N, Deg : Integer; B : PVector; V : PMatrix) : Integer; function WNLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y, W : PVector; N, Lbound, Ubound, MaxIter : Integer; Tol : Float; B, B_min, B_max : PVector; V : PMatrix) : Integer; { ********************************************************************** Procedure to compute the derivatives of the regression function by numerical differentiation. ********************************************************************** } procedure NumDeriv(RegFunc : TRegFunc; X, Y : Float; B, D : PVector); { ---------------------------------------------------------------------- Input parameters : RegFunc = Regression function X, Y = Coordinates of point B = Regression parameters Output parameter : D = Derivatives (D^[I] contains the derivative w.r.t. parameter B^[I]) ---------------------------------------------------------------------- } { ********************************************************************** Routines to test the quality of the regression ********************************************************************** These routines compute the variance-covariance matrix of the fitted parameters and the different statistics used to test the quality of the fit. Input parameters : Y = Vector of dependent variable Ycalc = Computed Y values W = Vector of weights (if any) N = Index of the last observation Lbound, Ubound = Indices of first & last fitted parameters V = Inverse normal equations matrix Output parameters : V = Variance-covariance matrix Test = Test statistics (Vr, R2, R2a, F, Prob) ********************************************************************** } procedure RegTest(Y, Ycalc : PVector; N, Lbound, Ubound : Integer; V : PMatrix; var Test : TRegTest); { ---------------------------------------------------------------------- Test of unweighted regression ---------------------------------------------------------------------- } procedure WRegTest(Y, Ycalc, W : PVector; N, Lbound, Ubound : Integer; V : PMatrix; var Test : TRegTest); { ---------------------------------------------------------------------- Test of weighted regression ---------------------------------------------------------------------- } { ********************************************************************** Test of regression parameters ********************************************************************** } procedure ParamTest(B : PVector; V : PMatrix; N, Lbound, Ubound : Integer; S, T, Prob : PVector); { ---------------------------------------------------------------------- This routine tests the significance of the parameters. It must be called AFTER RegTest or WRegTest since it uses the variance-covariance matrix. ---------------------------------------------------------------------- Input parameters : B = Regression parameters V = Variance-covariance matrix N = Index of the last observation Lbound, Ubound = Indices of first & last fitted parameters ---------------------------------------------------------------------- Output parameters : S = Standard deviations of parameters T = Student's t Prob = Probabilities ---------------------------------------------------------------------- } { ********************************************************************** Correlation and principal component analysis Common parameters: X = matrix of variables (X^[I] contains the I-th variable) N = Index of the last observation Lbound, Ubound = Indices of first & last variables M = Mean vector (M^[I] = mean of X^[I]) S = Vector of standard deviations V = Variance-covariance matrix R = Correlation matrix ********************************************************************** } procedure VecMean(X : PMatrix; N, Lbound, Ubound : Integer; M : PVector); { ---------------------------------------------------------------------- Computes the mean vector (M) from matrix X Input : X, Lbound, Ubound Output : M ---------------------------------------------------------------------- } procedure VecSD(X : PMatrix; N, Lbound, Ubound : Integer; M, S : PVector); { ---------------------------------------------------------------------- Computes the vector of standard deviations (S) from matrix X Input : X, Lbound, Ubound, M Output : S ---------------------------------------------------------------------- } procedure MatVarCov(X : PMatrix; N, Lbound, Ubound : Integer; M : PVector; V : PMatrix); { ---------------------------------------------------------------------- Computes the variance-covariance matrix (V) from matrix X Input : X, Lbound, Ubound, M Output : V ---------------------------------------------------------------------- } procedure MatCorrel(V : PMatrix; Lbound, Ubound : Integer; R : PMatrix); { ---------------------------------------------------------------------- Computes the correlation matrix (R) from the variance-covariance matrix (V) Input : V, Lbound, Ubound Output : R ---------------------------------------------------------------------- } function PCA(R : PMatrix; Lbound, Ubound : Integer; Lambda : PVector; C, Rc : PMatrix) : Integer; { ---------------------------------------------------------------------- Performs a principal component analysis of the correlation matrix R ---------------------------------------------------------------------- Input : R, Lbound, Ubound Output : Lambda = Eigenvalues of the correlation matrix (in descending order) C = Eigenvectors of the correlation matrix (C^[I] is the I-th eigenvector) Rc = Correlations between principal factors and variables (R^[I]^[J] is the correlation coefficient between factor I and variable J) ---------------------------------------------------------------------- Possible results : MAT_OK : No error MAT_NON_CONV : Non-convergence of eigenvalue determination ---------------------------------------------------------------------- NB : This procedure destroys the original matrix R ---------------------------------------------------------------------- } procedure ScaleVar(X : PMatrix; N, Lbound, Ubound : Integer; M, S : PVector; Z : PMatrix); { ---------------------------------------------------------------------- Scales a set of variables by subtracting means and dividing by SD's ---------------------------------------------------------------------- Input : X, N, Lbound, Ubound, M, S Output : Z = matrix of scaled variables (Z^[I] contains the I-th var.) ---------------------------------------------------------------------- } procedure PrinFac(Z : PMatrix; N, Lbound, Ubound : Integer; C, F : PMatrix); { ---------------------------------------------------------------------- Computes principal factors ---------------------------------------------------------------------- Input : Z, N, Lbound, Ubound C = matrix of eigenvectors from PCA Output : F = matrix of principal factors (F^[I] contains the I-th factor) ---------------------------------------------------------------------- } implementation { Constants for eigenvalue determination in PCA } const PCA_MAXITER = 100; { Max number of iterations } PCA_TOL = 1.0E-6; { Required precision } MAX_FUNC = 1.0E+30; { Max. value for objective function (used to prevent overflow) } { Default settings } const RegAlgo : TRegAlgo = SVD; { Linear regression algorithm } OptAlgo : TOptAlgo = NL_MARQ; { Optimization algorithms } FirstPoint : Integer = 1; { Index of first data point } { Global variables used by the nonlinear regression routines } const NN : Integer = 1; { Number of observations } XX : PVector = nil; { X coordinates } YY : PVector = nil; { Y coordinates } WW : PVector = nil; { Weights } YYcalc : PVector = nil; { Estimated Y values } FirstParam : Integer = 0; { Index of first fitted parameter } LastParam : Integer = 1; { Index of last fitted parameter } ParamMin : PVector = nil; { Lower bounds on parameters } ParamMax : PVector = nil; { Higher bounds on parameters } var RegFunc1 : TRegFunc; { Regression function } DerivProc1 : TDerivProc; { Derivation procedure } function TolSVD(N : Integer) : Float; { This function sets the relative threshold below which a singular value is considered zero. N is the number of observations. } begin TolSVD := N * MACHEP; end; procedure SetRegAlgo(Algo : TRegAlgo); begin RegAlgo := Algo; end; procedure SetOptAlgo(Algo : TOptAlgo); begin OptAlgo := Algo; end; procedure SetFirstPoint(Index : Integer); begin if Index >= 0 then FirstPoint := Index; end; function GetRegAlgo : TRegAlgo; begin GetRegAlgo := RegAlgo; end; function GetOptAlgo : TOptAlgo; begin GetOptAlgo := OptAlgo; end; function GetFirstPoint : Integer; begin GetFirstPoint := FirstPoint; end; function GenLinFit(Mode : TRegMode; X, Y, W : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; { ---------------------------------------------------------------------- General linear regression routine ---------------------------------------------------------------------- } var WX, S, SX, SY, SX2, SXY, D : Float; K : Integer; begin S := 0.0; SX := 0.0; SY := 0.0; SX2 := 0.0; SXY := 0.0; if Mode = UNWEIGHTED then begin S := N - FirstPoint + 1; for K := FirstPoint to N do begin SX := SX + X^[K]; SY := SY + Y^[K]; SX2 := SX2 + Sqr(X^[K]); SXY := SXY + X^[K] * Y^[K]; end; end else begin for K := FirstPoint to N do begin WX := W^[K] * X^[K]; S := S + W^[K]; SX := SX + WX; SY := SY + W^[K] * Y^[K]; SX2 := SX2 + WX * X^[K]; SXY := SXY + WX * Y^[K]; end; end; D := S * SX2 - Sqr(SX); if D <= 0.0 then GenLinFit := MAT_SINGUL else begin V^[0]^[0] := SX2 / D; V^[0]^[1] := - SX / D; V^[1]^[0] := V^[0]^[1]; V^[1]^[1] := S / D; B^[0] := V^[0]^[0] * SY + V^[0]^[1] * SXY; B^[1] := V^[1]^[0] * SY + V^[1]^[1] * SXY; GenLinFit := MAT_OK; end; end; function LinFit(X, Y : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; var W : PVector; begin LinFit := GenLinFit(UNWEIGHTED, X, Y, W, N, B, V); end; function WLinFit(X, Y, W : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; begin WLinFit := GenLinFit(WEIGHTED, X, Y, W, N, B, V); end; function Gauss_GenMulFit(Mode : TRegMode; X : PMatrix; Y, W : PVector; N, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix) : Integer; { ---------------------------------------------------------------------- General multiple linear regression routine (Gauss-Jordan algorithm) ---------------------------------------------------------------------- } var A : PMatrix; { Matrix of normal equations } G : PVector; { Constant vector } I, J, K : Integer; { Loop variables } WX : Float; begin DimMatrix(A, Nvar, Nvar); DimVector(G, Nvar); { If constant term, set line 0 and column 0 of matrix A, and element 0 of vecteur G } if ConsTerm then begin if Mode = UNWEIGHTED then begin A^[0]^[0] := Int(N - FirstPoint + 1); for K := FirstPoint to N do begin for J := 1 to Nvar do A^[0]^[J] := A^[0]^[J] + X^[J]^[K]; G^[0] := G^[0] + Y^[K]; end; end else begin for K := FirstPoint to N do begin A^[0]^[0] := A^[0]^[0] + W^[K]; for J := 1 to Nvar do A^[0]^[J] := A^[0]^[J] + W^[K] * X^[J]^[K]; G^[0] := G^[0] + W^[K] * Y^[K]; end; end; for J := 1 to Nvar do A^[J]^[0] := A^[0]^[J]; end; { Set other elements of A and G } if Mode = UNWEIGHTED then for K := FirstPoint to N do for I := 1 to Nvar do begin for J := I to Nvar do A^[I]^[J] := A^[I]^[J] + X^[I]^[K] * X^[J]^[K]; G^[I] := G^[I] + X^[I]^[K] * Y^[K]; end else for K := FirstPoint to N do for I := 1 to Nvar do begin WX := W^[K] * X^[I]^[K]; for J := I to Nvar do A^[I]^[J] := A^[I]^[J] + WX * X^[J]^[K]; G^[I] := G^[I] + WX * Y^[K]; end; { Fill in symmetric matrix } for I := 2 to Nvar do for J := 1 to Pred(I) do A^[I]^[J] := A^[J]^[I]; { Solve normal equations } if ConsTerm then Gauss_GenMulFit := GaussJordan(A, G, 0, Nvar, V, B) else Gauss_GenMulFit := GaussJordan(A, G, 1, Nvar, V, B); DelMatrix(A, Nvar, Nvar); DelVector(G, Nvar); end; function SVD_GenMulFit(Mode : TRegMode; X : PMatrix; Y, W : PVector; N, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix) : Integer; { ---------------------------------------------------------------------- General multiple linear regression routine (SVD algorithm) ---------------------------------------------------------------------- } var U : PMatrix; { Matrix of independent variables for SVD } Z : PVector; { Vector of dependent variables for SVD } S : PVector; { Singular values } S2inv : PVector; { Inverses of squared singular values } V1 : PMatrix; { Orthogonal matrix from SVD } Lbound : Integer; { Lower bound of U matrix in both dims. } Ubound : Integer; { Upper bound of U matrix in 1st dim. } I, J, K : Integer; { Loop variables } Sigma : Float; { Square root of weight } Sum : Float; { Element of variance-covariance matrix } ErrCode : Integer; { Error code } begin if ConsTerm then begin Lbound := 0; Ubound := N - FirstPoint; end else begin Lbound := 1; Ubound := N - FirstPoint + 1; end; { Dimension arrays } DimMatrix(U, Ubound, Nvar); DimVector(Z, Ubound); DimVector(S, Nvar); DimVector(S2inv, Nvar); DimMatrix(V1, Nvar, Nvar); { ---------------------------------------------------------- Prepare arrays for SVD : If constant term, use U[0..(N - FirstPoint), 0..Nvar] and Z[0..(N - FirstPoint)] Else use U[1..(N - FirstPoint + 1), 1..Nvar] and Z[1..(N - FirstPoint + 1)] ---------------------------------------------------------- } if Mode = UNWEIGHTED then for I := Lbound to Ubound do begin K := I - Lbound + FirstPoint; Z^[I] := Y^[K]; if ConsTerm then U^[I]^[0] := 1.0; for J := 1 to Nvar do U^[I]^[J] := X^[J]^[K]; end else for I := Lbound to Ubound do begin K := I - Lbound + FirstPoint; Sigma := Sqrt(W^[K]); Z^[I] := Y^[K] * Sigma; if ConsTerm then U^[I]^[0] := Sigma; for J := 1 to Nvar do U^[I]^[J] := X^[J]^[K] * Sigma; end; { Perform singular value decomposition } ErrCode := SV_Decomp(U, Lbound, Ubound, Nvar, S, V1); if ErrCode = MAT_OK then begin { Set the lowest singular values to zero } SV_SetZero(S, Lbound, Nvar, TolSVD(N - FirstPoint + 1)); { Solve the system } SV_Solve(U, S, V1, Z, Lbound, Ubound, Nvar, B); { Compute variance-covariance matrix } for I := Lbound to Nvar do if S^[I] > 0.0 then S2inv^[I] := 1.0 / Sqr(S^[I]) else S2inv^[I] := 0.0; for I := Lbound to Nvar do for J := Lbound to I do begin Sum := 0.0; for K := Lbound to Nvar do Sum := Sum + V1^[I]^[K] * V1^[J]^[K] * S2inv^[K]; V^[I]^[J] := Sum; V^[J]^[I] := Sum; end; end; SVD_GenMulFit := ErrCode; DelMatrix(U, Ubound, Nvar); DelVector(Z, Ubound); DelVector(S, Nvar); DelVector(S2inv, Nvar); DelMatrix(V1, Nvar, Nvar); end; function GenMulFit(Mode : TRegMode; X : PMatrix; Y, W : PVector; N, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix) : Integer; { ---------------------------------------------------------------------- General multiple linear regression routine ---------------------------------------------------------------------- } begin case RegAlgo of GAUSS_JORDAN : GenMulFit := Gauss_GenMulFit(Mode, X, Y, W, N, Nvar, ConsTerm, B, V); SVD : GenMulFit := SVD_GenMulFit(Mode, X, Y, W, N, Nvar, ConsTerm, B, V); end; end; function MulFit(X : PMatrix; Y : PVector; N, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix) : Integer; var W : PVector; begin MulFit := GenMulFit(UNWEIGHTED, X, Y, W, N, Nvar, ConsTerm, B, V); end; function WMulFit(X : PMatrix; Y, W : PVector; N, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix) : Integer; begin WMulFit := GenMulFit(WEIGHTED, X, Y, W, N, Nvar, ConsTerm, B, V); end; procedure PowMat(X : PVector; N, Deg : Integer; U : PMatrix); { ---------------------------------------------------------------------- Computes matrix of increasing powers of X for polynomial regression ---------------------------------------------------------------------- } var I, K : Integer; begin for K := FirstPoint to N do begin U^[1]^[K] := X^[K]; for I := 2 to Deg do U^[I]^[K] := U^[I - 1]^[K] * X^[K]; end; end; function GenPolFit(Mode : TRegMode; X, Y, W : PVector; N, Deg : Integer; B : PVector; V : PMatrix) : Integer; { ---------------------------------------------------------------------- General polynomial regression routine ---------------------------------------------------------------------- } var U : PMatrix; begin DimMatrix(U, Deg, N); PowMat(X, N, Deg, U); GenPolFit := GenMulFit(Mode, U, Y, W, N, Deg, True, B, V); DelMatrix(U, Deg, N); end; function PolFit(X, Y : PVector; N, Deg : Integer; B : PVector; V : PMatrix) : Integer; var W : PVector; begin PolFit := GenPolFit(UNWEIGHTED, X, Y, W, N, Deg, B, V); end; function WPolFit(X, Y, W : PVector; N, Deg : Integer; B : PVector; V : PMatrix) : Integer; begin WPolFit := GenPolFit(WEIGHTED, X, Y, W, N, Deg, B, V); end; procedure SetGlobalVar(RegFunc : TRegFunc; DerivProc : TDerivProc; Mode : TRegMode; X, Y, W : PVector; N, Lbound, Ubound : Integer; B_min, B_max : PVector); { Sets the global variables used by the nonlinear regression routines } begin DelVector(XX, NN); DelVector(YY, NN); DelVector(YYcalc, NN); DimVector(XX, N); DimVector(YY, N); DimVector(YYcalc, N); CopyVector(XX, X, FirstPoint, N); CopyVector(YY, Y, FirstPoint, N); if Mode = WEIGHTED then begin DelVector(WW, NN); DimVector(WW, N); CopyVector(WW, W, FirstPoint, N); end; NN := N; DelVector(ParamMin, LastParam); DelVector(ParamMax, LastParam); DimVector(ParamMin, Ubound); DimVector(ParamMax, Ubound); CopyVector(ParamMin, B_min, Lbound, Ubound); CopyVector(ParamMax, B_max, Lbound, Ubound); FirstParam := Lbound; LastParam := Ubound; RegFunc1 := RegFunc; DerivProc1 := DerivProc; end; {$F+} procedure NumDeriv(RegFunc : TRegFunc; X, Y : Float; B, D : PVector); var I : Integer; Eps, Temp, Y1 : Float; begin Eps := Sqrt(MACHEP); for I := FirstParam to LastParam do begin Temp := B^[I]; { Save parameter } B^[I] := B^[I] + Eps * Abs(B^[I]); { Modified parameter } Y1 := RegFunc(X, B); D^[I] := (Y1 - Y) / (B^[I] - Temp); { Derivative } B^[I] := Temp; { Restore parameter } end; end; function OutOfBounds(B, B_min, B_max : PVector) : Boolean; { Check if the parameters are inside the bounds } var I : Integer; OoB : Boolean; begin I := FirstParam; OoB := False; repeat OoB := (B^[I] < B_min^[I]) or (B^[I] > B_max^[I]); Inc(I); until OoB or (I > LastParam); OutOfBounds := OoB; end; function OLS_ObjFunc(B : PVector) : Float; { Objective function for unweighted nonlinear regression } var K : Integer; S : Float; begin if OutOfBounds(B, ParamMin, ParamMax) then begin OLS_ObjFunc := MAX_FUNC; Exit; end; S := 0.0; K := FirstPoint; repeat YYcalc^[K] := RegFunc1(XX^[K], B); S := S + Sqr(YY^[K] - YYcalc^[K]); Inc(K); until (K > NN) or (S > MAX_FUNC); if S > MAX_FUNC then S := MAX_FUNC; OLS_ObjFunc := S; end; procedure OLS_Gradient(Func : TFuncNVar; B : PVector; Lbound, Ubound : Integer; G : PVector); { Gradient for unweighted nonlinear regression. Func is a dummy parameter here. } var I, K : Integer; { Loop variables } R : Float; { Residual } D : PVector; { Derivatives of the regression function } begin DimVector(D, Ubound); { Initialization } for I := Lbound to Ubound do G^[I] := 0.0; { Compute Gradient } for K := FirstPoint to NN do begin R := YY^[K] - YYcalc^[K]; DerivProc1(RegFunc1, XX^[K], YYcalc^[K], B, D); for I := Lbound to Ubound do G^[I] := G^[I] - D^[I] * R; end; for I := Lbound to Ubound do G^[I] := 2.0 * G^[I]; DelVector(D, Ubound); end; procedure OLS_HessGrad(Func : TFuncNVar; B : PVector; Lbound, Ubound : Integer; G : PVector; H : PMatrix); { Gradient and Hessian for unweighted nonlinear regression. Func is a dummy parameter here. } var I, J, K : Integer; { Loop variables } R : Float; { Residual } D : PVector; { Derivatives of the regression function } begin DimVector(D, Ubound); { Initializations } for I := Lbound to Ubound do begin G^[I] := 0.0; for J := I to Ubound do H^[I]^[J] := 0.0; end; { Compute Gradient & Hessian } for K := FirstPoint to NN do begin R := YY^[K] - YYcalc^[K]; DerivProc1(RegFunc1, XX^[K], YYcalc^[K], B, D); for I := Lbound to Ubound do begin G^[I] := G^[I] - D^[I] * R; for J := I to Ubound do H^[I]^[J] := H^[I]^[J] + D^[I] * D^[J]; end; end; { Fill in symmetric matrix } for I := Succ(Lbound) to Ubound do for J := Lbound to Pred(I) do H^[I]^[J] := H^[J]^[I]; DelVector(D, Ubound); end; function WLS_ObjFunc(B : PVector) : Float; { Objective function for weighted nonlinear regression } var K : Integer; S : Float; begin if OutOfBounds(B, ParamMin, ParamMax) then begin WLS_ObjFunc := MAX_FUNC; Exit; end; S := 0.0; K := FirstPoint; repeat YYcalc^[K] := RegFunc1(XX^[K], B); S := S + WW^[K] * Sqr(YY^[K] - YYcalc^[K]); Inc(K); until (K > NN) or (S > MAX_FUNC); if S > MAX_FUNC then S := MAX_FUNC; WLS_ObjFunc := S; end; procedure WLS_Gradient(Func : TFuncNVar; B : PVector; Lbound, Ubound : Integer; G : PVector); { Gradient for weighted nonlinear regression. Func is a dummy parameter here. } var I, K : Integer; { Loop variables } R : Float; { Residual } D : PVector; { Derivatives of the regression function } WD : Float; { Weighted derivative } begin DimVector(D, Ubound); { Initialization } for I := Lbound to Ubound do G^[I] := 0.0; { Compute Gradient } for K := FirstPoint to NN do begin R := YY^[K] - YYcalc^[K]; DerivProc1(RegFunc1, XX^[K], YYcalc^[K], B, D); for I := Lbound to Ubound do begin WD := WW^[K] * D^[I]; G^[I] := G^[I] - WD * R; end; end; for I := Lbound to Ubound do G^[I] := 2.0 * G^[I]; DelVector(D, Ubound); end; procedure WLS_HessGrad(Func: TFuncNVar; B : PVector; Lbound, Ubound : Integer; G : PVector; H : PMatrix); { Gradient and Hessian for weighted nonlinear regression. Func is a dummy parameter here. } var I, J, K : Integer; { Loop variables } R : Float; { Residual } D : PVector; { Derivatives of the regression function } WD : Float; { Weighted derivative } begin DimVector(D, Ubound); { Initialization } for I := Lbound to Ubound do begin G^[I] := 0.0; for J := I to Ubound do H^[I]^[J] := 0.0; end; { Compute Gradient & Hessian } for K := FirstPoint to NN do begin R := YY^[K] - YYcalc^[K]; DerivProc1(RegFunc1, XX^[K], YYcalc^[K], B, D); for I := Lbound to Ubound do begin WD := WW^[K] * D^[I]; G^[I] := G^[I] - WD * R; for J := I to Ubound do H^[I]^[J] := H^[I]^[J] + WD * D^[J]; end; end; { Fill in symmetric matrix } for I := Succ(Lbound) to Ubound do for J := Lbound to Pred(I) do H^[I]^[J] := H^[J]^[I]; DelVector(D, Ubound); end; {$F-} function GenNLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; Mode : TRegMode; X, Y, W : PVector; N, Lbound, Ubound, MaxIter : Integer; Tol : Float; B, B_min, B_max : PVector; V : PMatrix) : Integer; { -------------------------------------------------------------------- General nonlinear regression routine -------------------------------------------------------------------- } var F_min : Float; { Value of objective function at minimum } ErrCode : Integer; { Error code } G : PVector; { Gradient vector } H : PMatrix; { Hessian matrix } ObjFunc : TFuncNVar; { Objective function } GradProc : TGradient; { Procedure to compute gradient } HessProc : THessGrad; { Procedure to compute gradient and hessian } begin SetGlobalVar(RegFunc, DerivProc, Mode, X, Y, W, N, Lbound, Ubound, B_min, B_max); case Mode of UNWEIGHTED : begin ObjFunc := {$IFDEF FPK}@{$ENDIF}OLS_ObjFunc; GradProc := {$IFDEF FPK}@{$ENDIF}OLS_Gradient; HessProc := {$IFDEF FPK}@{$ENDIF}OLS_HessGrad; end; WEIGHTED : begin ObjFunc := {$IFDEF FPK}@{$ENDIF}WLS_ObjFunc; GradProc := {$IFDEF FPK}@{$ENDIF}WLS_Gradient; HessProc := {$IFDEF FPK}@{$ENDIF}WLS_HessGrad; end; end; case OptAlgo of NL_MARQ : ErrCode := Marquardt(ObjFunc, HessProc, B, Lbound, Ubound, MaxIter, Tol, F_min, V); NL_SIMP : ErrCode := Simplex(ObjFunc, B, Lbound, Ubound, MaxIter, Tol, F_min); NL_BFGS : ErrCode := BFGS(ObjFunc, GradProc, B, Lbound, Ubound, MaxIter, Tol, F_min, V); NL_SA : ErrCode := SimAnn(ObjFunc, B, B_min, B_max, Lbound, Ubound, MaxIter, Tol, F_min); end; if (OptAlgo <> NL_MARQ) and (OptAlgo <> NL_BFGS) and (ErrCode = OPT_OK) then begin { Compute the Hessian matrix and its inverse } DimVector(G, Ubound); DimMatrix(H, Ubound, Ubound); case Mode of UNWEIGHTED : OLS_HessGrad(ObjFunc, B, Lbound, Ubound, G, H); WEIGHTED : WLS_HessGrad(ObjFunc, B, Lbound, Ubound, G, H); end; if InvMat(H, Lbound, Ubound, V) = 0 then ErrCode := OPT_OK else ErrCode := OPT_SING; DelVector(G, Ubound); DelMatrix(H, Ubound, Ubound); end; GenNLFit := ErrCode; end; function NLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y : PVector; N, Lbound, Ubound, MaxIter : Integer; Tol : Float; B, B_min, B_max : PVector; V : PMatrix) : Integer; var W : PVector; begin NLFit := GenNLFit(RegFunc, DerivProc, UNWEIGHTED, X, Y, W, N, Lbound, Ubound, MaxIter, Tol, B, B_min, B_max, V); end; function WNLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y, W : PVector; N, Lbound, Ubound, MaxIter : Integer; Tol : Float; B, B_min, B_max : PVector; V : PMatrix) : Integer; begin WNLFit := GenNLFit(RegFunc, DerivProc, WEIGHTED, X, Y, W, N, Lbound, Ubound, MaxIter, Tol, B, B_min, B_max, V); end; procedure GenRegTest(Mode : TRegMode; Y, Ycalc, W : PVector; N, Lbound, Ubound : Integer; V : PMatrix; var Test : TRegTest); var Ybar : Float; { Average Y value } SSt : Float; { Total sum of squares } SSe : Float; { Explained sum of squares } SSr : Float; { Residual sum of squares } Nobs : Integer; { Number of observations } Npar : Integer; { Number of fitted parameters } Nu1, Nu2 : Integer; { Degrees of freedom } I, J : Integer; { Loop variables } begin Nobs := N - FirstPoint + 1; Npar := Ubound - Lbound + 1; with Test do if Nobs > Npar then begin Ybar := Average(Y, FirstPoint, N); if Mode = UNWEIGHTED then begin SSt := SumSqrDif(Y, FirstPoint, N, Ybar); SSe := SumSqrDif(Ycalc, FirstPoint, N, Ybar); SSr := SumSqrDifVect(Y, Ycalc, FirstPoint, N); end else begin SSt := SumWSqrDif(Y, W, FirstPoint, N, Ybar); SSe := SumWSqrDif(Ycalc, W, FirstPoint, N, Ybar); SSr := SumWSqrDifVect(Y, Ycalc, W, FirstPoint, N); end; Nu1 := Npar - 1; Nu2 := Nobs - Npar; if (SSt = 0) or (Nu2=0) then begin //showmessage('Error: are all you data points in the same plane?'); exit; end; R2 := SSe / SSt; R2a := 1.0 - (1.0 - R2) * (Nobs - 1) / Nu2; Vr := SSr / Nu2; if (Vr > 0.0) and (Nu1 > 0.0) then begin F := (SSe / Nu1) / Vr; Prob := PSnedecor(Nu1, Nu2, F); end else begin F := MAXNUM; Prob := 0.0; end; end else begin Vr := 0.0; R2 := 1.0; R2a := 0.0; F := 0.0; Prob := 1.0; end; { Compute variance-covariance matrix } for I := Lbound to Ubound do for J := I to Ubound do V^[I]^[J] := V^[I]^[J] * Test.Vr; for I := Succ(Lbound) to Ubound do for J := Lbound to Pred(I) do V^[I]^[J] := V^[J]^[I]; end; procedure RegTest(Y, Ycalc : PVector; N, Lbound, Ubound : Integer; V : PMatrix; var Test : TRegTest); var W : PVector; begin GenRegTest(UNWEIGHTED, Y, Ycalc, W, N, Lbound, Ubound, V, Test); end; procedure WRegTest(Y, Ycalc, W : PVector; N, Lbound, Ubound : Integer; V : PMatrix; var Test : TRegTest); begin GenRegTest(WEIGHTED, Y, Ycalc, W, N, Lbound, Ubound, V, Test); end; procedure ParamTest(B : PVector; V : PMatrix; N, Lbound, Ubound : Integer; S, T, Prob : PVector); var I : Integer; Nu : Integer; { Degrees of freedom } Nobs : Integer; { Number of observations } Nvar : Integer; { Number of indep. variables } begin Nobs := N - FirstPoint + 1; Nvar := Ubound - Lbound + 1; Nu := Nobs - Nvar; { DoF = Nb points - Nb parameters } for I := Lbound to Ubound do if V^[I]^[I] > 0.0 then begin S^[I] := Sqrt(V^[I]^[I]); T^[I] := B^[I] / S^[I]; Prob^[I] := PStudent(Nu, T^[I]); end else begin S^[I] := 0.0; T^[I] := 0.0; Prob^[I] := 1.0; end; end; procedure VecMean(X : PMatrix; N, Lbound, Ubound : Integer; M : PVector); var I, K, Nobs : Integer; Sum : Float; begin Nobs := N - FirstPoint + 1; for I := Lbound to Ubound do begin Sum := 0.0; for K := FirstPoint to N do Sum := Sum + X^[I]^[K]; M^[I] := Sum / Nobs; end; end; procedure VecSD(X : PMatrix; N, Lbound, Ubound : Integer; M, S : PVector); var I, K, Nobs : Integer; Sum : Float; begin Nobs := N - FirstPoint + 1; for I := Lbound to Ubound do begin Sum := 0.0; for K := FirstPoint to N do Sum := Sum + Sqr(X^[I]^[K] - M^[I]); S^[I] := Sqrt(Sum / Nobs); end; end; procedure MatVarCov(X : PMatrix; N, Lbound, Ubound : Integer; M : PVector; V : PMatrix); var I, J, K, Nobs : Integer; Sum : Float; begin Nobs := N - FirstPoint + 1; for I := Lbound to Ubound do for J := I to Ubound do begin Sum := 0.0; for K := FirstPoint to N do Sum := Sum + (X^[I]^[K] - M^[I]) * (X^[J]^[K] - M^[J]); V^[I]^[J] := Sum / Nobs; end; for I := Succ(Lbound) to Ubound do for J := Lbound to Pred(I) do V^[I]^[J] := V^[J]^[I]; end; procedure MatCorrel(V : PMatrix; Lbound, Ubound : Integer; R : PMatrix); var I, J : Integer; begin for I := Lbound to Ubound do begin R^[I]^[I] := 1.0; for J := Succ(I) to Ubound do begin R^[I]^[J] := V^[I]^[J] / Sqrt(V^[I]^[I] * V^[J]^[J]); R^[J]^[I] := R^[I]^[J]; end; end; end; function PCA(R : PMatrix; Lbound, Ubound : Integer; Lambda : PVector; C, Rc : PMatrix) : Integer; var I, J, ErrCode : Integer; Rac : Float; begin { Compute eigenvalues and eigenvectors of correlation matrix } ErrCode := Jacobi(R, Lbound, Ubound, PCA_MAXITER, PCA_TOL, C, Lambda); if ErrCode <> 0 then begin PCA := ErrCode; Exit; end; { Compute correlations between principal factors and reduced variables } for I := Lbound to Ubound do begin Rac := Sqrt(Lambda^[I]); for J := Lbound to Ubound do Rc^[I]^[J] := C^[I]^[J] * Rac; end; PCA := ErrCode; end; procedure ScaleVar(X : PMatrix; N, Lbound, Ubound : Integer; M, S : PVector; Z : PMatrix); var I, K : Integer; begin for I := Lbound to Ubound do for K := FirstPoint to N do Z^[I]^[K] := (X^[I]^[K] - M^[I]) / S^[I]; end; procedure PrinFac(Z : PMatrix; N, Lbound, Ubound : Integer; C, F : PMatrix); var I, J, K : Integer; begin for I := Lbound to Ubound do for K := FirstPoint to N do begin F^[I]^[K] := 0.0; for J := Lbound to Ubound do F^[I]^[K] := F^[I]^[K] + C^[I]^[J] * Z^[J]^[K]; end; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/regmultdelphi.pas0000664000175000017500000005022011326434466023121 0ustar michaelmichael{ ********************************************************************** * Program REGMULT.PAS * * Version 1.1 * * (c) J. Debord, August 2000 * ********************************************************************** This program performs a weighted multiple linear least squares fit : y = b0 + b1 * x1 + b2 * x2 + ... The following parameters are passed on the command line : 1st parameter = name of input file (default extension = .DAT) 2nd parameter = 1 if the equation includes a constant term b0 Input files are ASCII files with the following structure : Line 1 : Title of study Line 2 : Number of variables (must be >= 2 here !) Next lines : Names of variables x1, x2, ..., y Next line : Number of observations (must be > number of variables !) The next lines contain the coordinates (x1, x2, ..., y) of the observations (1 observation by line). The coordinates must be separated by spaces or tabulations. The file INHIB.DAT is an example of data relating the inhibition of an enzyme to the physico-chemical properties of the inhibitors (J. DEBORD, P. N'DIAYE, J. C. BOLLINGER et al, J. Enzyme Inhib., 1997, 12, 13-26). The program parameters are : INHIB 1 The program may be executed from Turbo Pascal's integrated environment, in which case the parameters are entered through the "Parameters" option of the menu, or from DOS (after compilation into an executable file), in which case the parameters are entered on the command line (e.g. REGMULT INHIB 1). ********************************************************************** } unit RegMultDelphi; interface uses SysUtils,FMath, Matrices, Regress, Models, PaString,messages,dialogs,classes,define_types; const kMaxRA = 127; kCR = chr (13); kMaxObs = 100; kMaxFact = 64; //type // TIVra = array [1..kMaxFact,1..kMaxObs] of integer; {SpaceType = record mrix,mriy,mriz,fobx,foby,fobz: integer; end;} function MultipleRegression (lnObservations,lnFactors: integer; var X: PMatrix; var lImgIntensity: DoubleP0; var lOutT: DoubleP0): boolean; function MultipleRegressionVec (lnObservations,lnFactors: integer; var X: PMatrix; var Y: PVector; var lOutT,lOutSlope: DoubleP0): boolean; //var // gMRIFOBra: array [1..kMaxRA] of SpaceType; // gCoregRA: array[1..3,0..3] of double; {MRIx,y,z, Offset,FOBx,FOBy,FOBz} implementation (*var InFName : String; { Name of input file } Title : String; { Title of study } XName : PStrVector; { Names of independent variables } YName : String; { Name of dependent variable } N : Integer; { Number of observations } X : PMatrix; { Matrix of independent variables } Y : PVector; { Vector of dependent variable } Z : PVector; { Vector of independent variable (not used here) } Ycalc : PVector; { Expected Y values } S : PVector; { Standard deviations of Y values } CstPar : PVector; { Constant parameters } B : PVector; { Regression parameters } B_min, B_max : PVector; { Parameter bounds (not used, but must be declared in order to use the WLSFit routine ) } V : PMatrix; { Variance-covariance matrix of regression parameters } Theta : PVector; { Variance parameters } RegTest : TRegTest; { Regression tests } gErrCode : Integer; { Error code } *) (* procedure ReadCmdLine(var InFName : String; var CstPar : PVector); { ---------------------------------------------------------------------- Reads command line parameters. Stores constant parameters in CstPar, such that : CstPar^[0] = Number of independent variables (this one is set by ReadInputFile) CstPar^[1] = 1 to include a constant term (b0) The contents of CstPar are defined in the unit FITMULT.PAS, in the subdirectory REG of the TP Math units directory. ---------------------------------------------------------------------- } var I : Integer; begin DimVector(CstPar, 1); { Name of input file } InFName := ParamStr(1); if Pos('.', InFName) = 0 then InFName := InFName + '.dat'; { Presence of constant term } //I := 0; Val(ParamStr(2), I, gErrCode); CstPar^[1] := I; end; function ReadInputFile(InFName : String; var Title : String; var XName : PStrVector; var YName : String; var N : Integer; var X : PMatrix; var Y : PVector; CstPar : PVector) : Integer; var InF : Textfile; { Input file } Nvar : Integer; { Nb of independent variables } I, K : Integer; { Loop variables } begin Assign(InF, InFName); Reset(InF); ReadLn(InF, Title); ReadLn(InF, Nvar); { Total number of variables } if Nvar < 2 then begin showmessage('Data file must contain at least 2 variables !'); ReadInputFile := - 1; Exit; end; Nvar := Pred(Nvar); showmessage('trap3x'+inttostr(NVar)); DimStrVector(XName, Nvar);{crashes here} showmessage('trap4x'+inttostr(NVar)); for I := 1 to Nvar do begin ReadLn(InF, XName^[I]); showmessage(XName^[I]); end; ReadLn(InF, YName); ReadLn(InF, N); DimMatrix(X, Nvar, N); DimVector(Y, N); for K := 1 to N do begin for I := 1 to Nvar do Read(InF, X^[I]^[K]); Read(InF, Y^[K]); end; Close(InF); CstPar^[0] := Nvar; ReadInputFile := 0; end; procedure WriteOutputFile(InFName, Title : String; XName : PStrVector; YName : String; N : Integer; Y, CstPar, Ycalc, S, B : PVector; V : PMatrix; Test : TRegTest); var OutFName : String; { Name of output file } OutF : TextFile; { Output file } Line1, Line2 : String; { Separating lines } Nvar : Integer; { Nb of independent variables } Delta : Float; { Residual } Sr : Float; { Residual error } SB : PVector; { Standard deviations of parameters } T : PVector; { Student's t } Prob : PVector; { Probabilities } I, K : Integer; { Loop variables } begin Nvar := Round(CstPar^[0]); DimVector(SB, LastParam); DimVector(T, LastParam); DimVector(Prob, LastParam); K := Pos('.', InFName); OutFName := Copy(InFName, 1, Pred(K)) + '.out'; Assign(OutF, OutFName); Rewrite(OutF); Line1 := StrChar(73, '-'); Line2 := StrChar(73, '='); WriteLn(OutF, Line2); WriteLn(OutF, 'Data file : ', InFName); WriteLn(OutF, 'Study name : ', Title); for I := 1 to Nvar do WriteLn(OutF, 'x', I:1, ' : ', XName^[I]); WriteLn(OutF, 'y : ', YName); WriteLn(OutF, 'Function : ', FuncName); { Perform tests on parameters } ParamTest(B, V, N, FirstParam, LastParam, SB, T, Prob); WriteLn(OutF, Line1); WriteLn(OutF, 'Parameter Est.value Std.dev. t Student Prob(>|t|)'); WriteLn(OutF, Line1); showmessage(inttostr(nVar)+':'+inttostr(FirstParam)+':'+inttostr(LastParam)); for I := FirstParam to LastParam do if SB^[I] > 0.0 then WriteLn(OutF, ParamName(I):5, B^[I]:17:8, SB^[I]:17:8, T^[I]:17:2, Prob^[I]:17:4) else WriteLn(OutF, ParamName(I):5, B^[I]:17:8); WriteLn(OutF, Line1); WriteLn(OutF, 'Number of observations : n = ', N:5); with Test do begin Sr := Sqrt(Vr); WriteLn(OutF, 'Residual error : s = ', Sr:10:8); if (R2 >= 0.0) and (R2 <= 1.0) then WriteLn(OutF, 'Coefficient of determination : r2 = ', R2:10:8); if (R2a >= 0.0) and (R2a <= 1.0) then WriteLn(OutF, 'Adjusted coeff. of determination : r2a = ', R2a:10:8); Write(OutF, 'Variance ratio (explained/resid.) : F = ', F:10:4); WriteLn(OutF, ' Prob(>F) = ', Prob:6:4); end; WriteLn(OutF, Line1); WriteLn(OutF, ' i Y obs. Y calc. Residual Std.dev. Std.res.'); WriteLn(OutF, Line1); for K := 1 to N do begin Delta := Y^[K] - Ycalc^[K]; WriteLn(OutF, K:3, Y^[K]:14:4, Ycalc^[K]:14:4, Delta:14:4, S^[K]:14:4, (Delta / S^[K]):14:4); end; WriteLn(OutF, Line2); Close(OutF); Showmessage('Results written to file '+OutFName); DelVector(SB, LastParam); DelVector(T, LastParam); DelVector(Prob, LastParam); end; { *************************** Main program ***************************** } procedure RunReg; begin { Read command line parameters } //ReadCmdLine(InFName, CstPar); InFName := 'C:\inhib.dat'; DimVector(CstPar, 1); CstPar^[1] := 1; { Read input file } if ReadInputFile(InFName, Title, XName, YName, N, X, Y, CstPar) <> 0 then begin showmessage('Error reading file '+ InFName); exit; end; { Initialize regression and variance models. See MODELS.PAS in the REG subdirectory for a list of available models } InitModel(REG_MULT, VAR_CONST, { Here we use a constant variance } CstPar); { Set the regression algorithm which must be GAUSS_JORDAN or SVD. The default algorithm is SVD. Comment off the following line if you wish to change the algorithm. } { SetRegAlgo(GAUSS_JORDAN); } { Dimension arrays. Note: the variance parameters Theta^[1]..Theta^[LastVarParam] must be supplied if we use a non-constant variance model } DimVector(Theta, LastVarParam); DimVector(B, LastParam); DimMatrix(V, LastParam, LastParam); DimVector(Ycalc, N); DimVector(S, N); { Perform regression. The numbers 1 and 0.1 denote the maximal number of iterations and the tolerance on the parameters. They are purely formal values here since the multiple linear regression does not use an iterative minimization algorithm. } gErrCode := WLSFit(Z, X, Y, N, True, 1, 0.1, Theta, B, B_min, B_max, V, Ycalc, S, RegTest); { Write results } case gErrCode of MAT_OK : WriteOutputFile(InFName, Title, XName, YName, N, Y, CstPar, Ycalc, S, B, V, RegTest); MAT_SINGUL : WriteLn('Singular matrix !'); MAT_NON_CONV : WriteLn('Non-convergence of SVD algorithm !'); end; end; *) //ComputeRegress(lnObservations,lnFactors, Y, CstPar, Ycalc, S, B, V, lRegTest); procedure ComputeRegress (N,lnFactors : Integer; var Y, CstPar, Ycalc, S, B : PVector; var V : PMatrix; var Test : TRegTest; var lOutT: DoubleP0); var I: integer; SB : PVector; { Standard deviations of parameters } T : PVector; { Student's t } Prob : PVector; { Probabilities } begin DimVector(SB, LastParam); DimVector(T, LastParam); DimVector(Prob, LastParam); { Perform tests on parameters } ParamTest(B, V, N, FirstParam, LastParam, SB, T, Prob); for I := 0 to (lnFactors-1) do lOutT[I] := T^[FirstParam+I+1];//first parameter is global fit lOutT[lnFactors] := T^[FirstParam];//global fit //for I := FirstParam to LastParam do // Showmessage(floattostr(T^[I]) ); DelVector(SB, LastParam); DelVector(T, LastParam); DelVector(Prob, LastParam); end; (* procedure ScreenOutputFile( var YName : String; N,ldimension : Integer; var Y, CstPar, Ycalc, S, B : PVector; var V : PMatrix; var Test : TRegTest; var lDynStr: String); var lA,lB,lC,lD : String; { Name of output file } Nvar : Integer; { Nb of independent variables } Delta : Float; { Residual } Sr : Float; { Residual error } SB : PVector; { Standard deviations of parameters } T : PVector; { Student's t } Prob : PVector; { Probabilities } I, K : Integer; { Loop variables } begin Nvar := Round(CstPar^[0]); DimVector(SB, LastParam); DimVector(T, LastParam); DimVector(Prob, LastParam); { Perform tests on parameters } ParamTest(B, V, N, FirstParam, LastParam, SB, T, Prob); lDynStr:=lDynStr+'|'+( 'Parameter Est.value Std.dev. t Student Prob(>|t|)'); //showmessage(inttostr(nVar)+':'+inttostr(FirstParam)+':'+inttostr(LastParam)); for I := FirstParam to LastParam do begin if SB^[I] > 0.0 then begin Str(B^[I]:17:8,lA); Str(SB^[I]:17:8,lB); Str(T^[I]:17:2,lC); Str(Prob^[I]:17:4,lD); lDynStr:=lDynStr+'|'+(ParamName(I)+lA+lB+'T='+lC+lD); end else begin B^[I]:= 0; Str(B^[I]:17:8,lA); lDynStr:=lDynStr+'|'+(ParamName(I)+lA); end; //gCoregRA[lDImension,I]:= B^[I]; end; DelVector(SB, LastParam); DelVector(T, LastParam); DelVector(Prob, LastParam); end; *) //function PredictData(lnObservations: integer; var lStr: tstringlist): boolean; function MultipleRegression (lnObservations,lnFactors: integer; var X: PMatrix; var lImgIntensity: DoubleP0; var lOutT: DoubleP0): boolean; var K : Integer; { Nb of independent variables } //X : PMatrix; { Matrix of independent variables } Y : PVector; { Vector of dependent variable } Z : PVector; { Vector of independent variable (not used here) } Ycalc : PVector; { Expected Y values } S : PVector; { Standard deviations of Y values } CstPar : PVector; { Constant parameters } B : PVector; { Regression parameters } B_min, B_max : PVector; { Parameter bounds (not used, but must be declared in order to use the WLSFit routine ) } V : PMatrix; { Variance-covariance matrix of regression parameters } Theta : PVector; { Variance parameters } lRegTest : TRegTest; { Regression tests } gErrCode : Integer; { Error code } begin result := false; if lnObservations < 5 then begin showmessage('At least 5 samples required for 3D registration.'); exit; end; DimVector(CstPar, 1); DimVector(Y, lnObservations); CstPar^[1] := 1; CstPar^[0] := lnFactors; for K := 1 to lnObservations do Y^[K] := lImgIntensity[K-1]; { Initialize regression and variance models.} InitModel(REG_MULT,VAR_CONST,{ Here we use a constant variance }CstPar); { Set the regression algorithm which must be GAUSS_JORDAN or SVD. The default algorithm is SVD. Comment off the following line if you wish to change the algorithm. } { SetRegAlgo(GAUSS_JORDAN); } DimVector(Theta, LastVarParam); DimVector(B, LastParam); DimMatrix(V, LastParam, LastParam); DimVector(Ycalc, lnObservations); DimVector(S, lnObservations); { Perform regression. The numbers 1 and 0.1 denote the maximal number of iterations and the tolerance on the parameters. They are purely formal values here since the multiple linear regression does not use an iterative minimization algorithm. } gErrCode := WLSFit(Z, X, Y, lnObservations, True, 1, 0.1, Theta, B,B_min, B_max, V, Ycalc, S, lRegTest); { Write results } //showmessage(inttostr(xx)); case gErrCode of MAT_OK : begin //ScreenOutputFile({XName,}YName,lnObservations,lDim, Y, CstPar, Ycalc, S, B, V, lRegTest,lStr); //Showmessage(lStr); ComputeRegress(lnObservations,lnFactors, Y, CstPar, Ycalc, S, B, V, lRegTest,lOutT); end; { MAT_OK : WriteOutputFile(InFName, Title, XName, YName, N, Y, CstPar, Ycalc, S, B, V, RegTest); } MAT_SINGUL : Showmessage('Singular matrix !'); MAT_NON_CONV : Showmessage('Non-convergence of SVD algorithm !'); end; DelVector(CstPar, 1); DelVector(Y, lnObservations); //DelStrVector(XName,lnXFactors); DelVector(Theta, LastVarParam); DelVector(B, LastParam); DelMatrix(V, LastParam, LastParam); DelVector(Ycalc, lnObservations); DelVector(S, lnObservations); result := true; end; function MultipleRegressionVec (lnObservations,lnFactors: integer; var X: PMatrix; var Y: PVector; var lOutT,lOutSlope: DoubleP0): boolean; var K : Integer; { Nb of independent variables } Z : PVector; { Vector of independent variable (not used here) } Ycalc : PVector; { Expected Y values } S : PVector; { Standard deviations of Y values } CstPar : PVector; { Constant parameters } B : PVector; { Regression parameters } B_min, B_max : PVector; { Parameter bounds (not used, but must be declared in order to use the WLSFit routine ) } V : PMatrix; { Variance-covariance matrix of regression parameters } Theta : PVector; { Variance parameters } lRegTest : TRegTest; { Regression tests } gErrCode : Integer; { Error code } begin result := false; if lnObservations < 5 then begin showmessage('At least 5 samples required for 3D registration.'); exit; end; DimVector(CstPar, 1); CstPar^[1] := 1; CstPar^[0] := lnFactors; { Initialize regression and variance models.} InitModel(REG_MULT,VAR_CONST,{ Here we use a constant variance }CstPar); { Set the regression algorithm which must be GAUSS_JORDAN or SVD. The default algorithm is SVD. Comment off the following line if you wish to change the algorithm. } { SetRegAlgo(GAUSS_JORDAN); } DimVector(Theta, LastVarParam); DimVector(B, LastParam); DimMatrix(V, LastParam, LastParam); DimVector(Ycalc, lnObservations); DimVector(S, lnObservations); { Perform regression. The numbers 1 and 0.1 denote the maximal number of iterations and the tolerance on the parameters. They are purely formal values here since the multiple linear regression does not use an iterative minimization algorithm. } gErrCode := WLSFit(Z, X, Y, lnObservations, True, 1, 0.1, Theta, B,B_min, B_max, V, Ycalc, S, lRegTest); { Write results } //showmessage(inttostr(xx)); case gErrCode of MAT_OK : begin //ScreenOutputFile({XName,}YName,lnObservations,lDim, Y, CstPar, Ycalc, S, B, V, lRegTest,lStr); //Showmessage(lStr); ComputeRegress(lnObservations,lnFactors, Y, CstPar, Ycalc, S, B, V, lRegTest,lOutT); end; { MAT_OK : WriteOutputFile(InFName, Title, XName, YName, N, Y, CstPar, Ycalc, S, B, V, RegTest); } MAT_SINGUL : Showmessage('Singular matrix !'); MAT_NON_CONV : Showmessage('Non-convergence of SVD algorithm !'); end; for K := 0 to (lnFactors-1) do lOutSlope^[K] := B^[FirstParam+K+1];//first parameter is global fit lOutSlope^[lnFactors] := B^[FirstParam];//global fit DelVector(CstPar, 1); //DelVector(Y, lnObservations); //DelStrVector(XName,lnXFactors); DelVector(Theta, LastVarParam); DelVector(B, LastParam); DelMatrix(V, LastParam, LastParam); DelVector(Ycalc, lnObservations); DelVector(S, lnObservations); result := true; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/polynom.pas0000664000175000017500000001517411326434466021762 0ustar michaelmichael{ ********************************************************************** * Unit POLYNOM.PAS * * Version 1.3 * * (c) J. Debord, January 1998 * ********************************************************************** This unit implements routines for polynomials and rational fractions. ********************************************************************** Reference: 'Numerical Recipes' by Press et al. ********************************************************************** } unit Polynom; interface uses FMath, Matrices, Eigen, Stat; function Poly(X : Float; Coef : PVector; Deg : Integer) : Float; { ---------------------------------------------------------------------- Evaluates the polynomial : P(X) = Coef[0] + Coef[1] * X + Coef[2] * X^2 +...+ Coef[Deg] * X^Deg ---------------------------------------------------------------------- } function RRootPol(Coef : PVector; Deg : Integer; X : PVector) : Integer; { ---------------------------------------------------------------------- Real roots of a polynomial. The roots are computed analytically if Deg <= 3, otherwise they are computed numerically from the eigenvalues of the companion matrix (function RootPol in EIGEN.PAS). The roots are returned in X (in increasing order). The function returns the number of real roots found. ---------------------------------------------------------------------- } function CRootPol(Coef : PVector; Deg : Integer; X_Re, X_Im : PVector) : Integer; { ---------------------------------------------------------------------- Complex roots of a polynomial. The roots are computed numerically from the eigenvalues of the companion matrix (function RootPol in EIGEN.PAS). The real and imaginary parts of the roots are returned in X_Re and X_Im (in increasing order of the real parts). The function returns the number of roots found, which may be Deg or zero if the method did not converge. ---------------------------------------------------------------------- } function RFrac(X : Float; Coef : PVector; Deg1, Deg2 : Integer) : Float; { ---------------------------------------------------------------------- Evaluates the rational fraction : Coef[0] + Coef[1] * X + ... + Coef[Deg1] * X^Deg1 F(X) = ----------------------------------------------------- 1 + Coef[Deg1+1] * X + ... + Coef[Deg1+Deg2] * X^Deg2 ---------------------------------------------------------------------- } implementation const MAXDEG = 3; { Maximal degree for analytical solution of polynomial } function Poly(X : Float; Coef : PVector; Deg : Integer) : Float; var I : Integer; Y : Float; begin Y := Coef^[Deg]; for I := Pred(Deg) downto 0 do Y := Y * X + Coef^[I]; Poly := Y; end; function RFrac(X : Float; Coef : PVector; Deg1, Deg2 : Integer) : Float; var I : Integer; Sum : Float; { Denominator sum } begin Sum := 0.0; for I := (Deg1 + Deg2) downto Succ(Deg1) do Sum := (Sum + Coef^[I]) * X; RFrac := Poly(X, Coef, Deg1) / (1.0 + Sum); end; function RootPol3(Coef : PVector; Deg : Integer; X : PVector) : Integer; { Real roots of polynomial up to degree 3 (Analytical solution) } const PI2DIV3 = 2.0943951023931954923; { 2*pi/3 } var NR : Integer; { Number of roots } R, R2, Q, Q3, Delta, A0, A1, A2, A22, A3, AA, BB, Theta, Z : Float; begin if (Deg < 1) or (Deg > MAXDEG) then begin RootPol3 := 0; Exit; end; case Deg of 1 : begin NR := 1; X^[1] := - Coef^[0] / Coef^[1]; end; 2 : begin Delta := Sqr(Coef^[1]) - 4.0 * Coef^[0] * Coef^[2]; if Delta < 0 then NR := 0 else begin NR := 2; if Coef^[1] >= 0 then Q := - 0.5 * (Coef^[1] + Sqrt(Delta)) else Q := - 0.5 * (Coef^[1] - Sqrt(Delta)); X^[1] := Q / Coef^[2]; X^[2] := Coef^[0] / Q; end; end; 3 : begin A0 := Coef^[0] / Coef^[3]; A1 := Coef^[1] / Coef^[3]; A2 := Coef^[2] / Coef^[3]; A3 := A2 / 3.0; A22 := Sqr(A2); Q := (A22 - 3.0 * A1) / 9.0; R := (A2 * (2.0 * A22 - 9.0 * A1) + 27.0 * A0) / 54.0; R2 := R * R; Q3 := Q * Q * Q; Delta := Q3 - R2; if Delta < 0 then begin NR := 1; AA := Power(Abs(R) + Sqrt(- Delta), 0.333333333333333); if R >= 0 then AA := - AA; if AA <> 0 then BB := Q / AA else BB := 0.0; X^[1] := (AA + BB) - A3; end else begin NR := 3; Theta := ArcCos(R / Sqrt(Q3)) / 3.0; Z := - 2.0 * Sqrt(Q); X^[1] := Z * Cos(Theta) - A3; X^[2] := Z * Cos(Theta + PI2DIV3) - A3; X^[3] := Z * Cos(Theta - PI2DIV3) - A3; end; end; end; QSort(X, 1, Deg); RootPol3 := NR; end; function RRootPol(Coef : PVector; Deg : Integer; X : PVector) : Integer; var N : Integer; { Number of real roots } X_Re, X_Im : PVector; { Real and imaginary parts } ErrCode : Integer; { Error code } I : Integer; { Loop variable } begin DimVector(X_Re, Deg); DimVector(X_Im, Deg); if Deg <= MAXDEG then RRootPol := RootPol3(Coef, Deg, X) else begin ErrCode := RootPol(Coef, Deg, X_Re, X_Im); if ErrCode = MAT_OK then begin { Get real roots } N := 0; for I := 1 to Deg do if Abs(X_Im^[I]) <= MACHEP then begin Inc(N); X^[N] := X_Re^[I]; end; { Set other roots to zero } for I := Succ(N) to Deg do X^[I] := 0.0; RRootPol := N; end else RRootPol := 0; end; DelVector(X_Re, Deg); DelVector(X_Im, Deg); end; function CRootPol(Coef : PVector; Deg : Integer; X_Re, X_Im : PVector) : Integer; begin if RootPol(Coef, Deg, X_Re, X_Im) = MAT_OK then CRootPol := Deg else CRootPol := 0; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/plotvar.inc0000664000175000017500000000673707316713324021744 0ustar michaelmichael{ ********************************************************************** * PLOTVAR.INC * ********************************************************************** Constants, types and global variables common to PLOT.PAS and TEXPLOT.PAS ********************************************************************** } const MAXSYMBOL = 9; { Max. number of graphic symbols } EPS = 1.0E-10; { Lower limit for an axis label } type TScale = (LIN_SCALE, { Scale } LOG_SCALE); TGrid = (NO_GRID, { Grid } HORIZ_GRID, VERTIC_GRID, BOTH_GRID); TAxis = record { Coordinate axis } Scale : TScale; Min : Float; Max : Float; Step : Float; end; TTitle = record { Title for main graph or axis } Text : String[70]; Font : Integer; CharWidth : Integer; CharHeight : Integer; end; TLegend = record { Legends of plotted curves } Text : array[1..MAXSYMBOL] of String[40]; Font : Integer; CharWidth : Integer; CharHeight : Integer; SymbolSize : Integer; end; { ******** Global variables defining the appearance of the graph ******* } const Xwin1 : Integer = 15; { Window limits in % } Ywin1 : Integer = 15; Xwin2 : Integer = 85; Ywin2 : Integer = 85; GraphBorder : Boolean = True; { Plot graph border } XAxis : TAxis = (Scale : LIN_SCALE; { Horizontal axis } Min : 0.0; Max : 1.0; Step : 0.2); YAxis : TAxis = (Scale : LIN_SCALE; { Vertical axis } Min : 0.0; Max : 1.0; Step : 0.2); Grid : TGrid = NO_GRID; { Grid } GraphTitle : TTitle = (Text : ''; { Title of graph } Font : 2; CharWidth : 300; CharHeight : 350); XTitle : TTitle = (Text : 'X'; { Title of X axis } Font : 2; CharWidth : 200; CharHeight : 250); YTitle : TTitle = (Text : 'Y'; { Title of Y axis } Font : 2; CharWidth : 200; CharHeight : 250); Legend : TLegend = (Text : ('A', { Legends of curves } 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'); Font : 2; CharWidth : 50; CharHeight : 50; SymbolSize : 3); mricron-0.20120505.1~dfsg.1.orig/npm/dmath/plot.pas0000664000175000017500000004311511326434466021237 0ustar michaelmichael{ ********************************************************************** * Unit PLOT.PAS * * Version 1.7 * * (c) J. Debord, June 2001 * ********************************************************************** Plotting routines for Turbo Pascal ********************************************************************** } unit Plot; interface uses Graph, FMath, Matrices, PaString; const BGIPath : String = 'C:\BP\BGI'; { Access path for graphic drivers } DefSymbSize : Integer = 3; { Default symbol size } { ********************** Include global variables ********************** } {$I PLOTVAR.INC} { ************************** Graphic routines ************************** } function GraphOk : Boolean; { ---------------------------------------------------------------------- Initializes high resolution graphics and plots the axes ---------------------------------------------------------------------- } procedure PlotGrid; { ---------------------------------------------------------------------- Plots a grid on the graph ---------------------------------------------------------------------- } procedure WriteLegend(NCurv : Integer); { ---------------------------------------------------------------------- Writes the graph title and the legends for the plotted curves Input parameter : NCurv = number of curves (1 to MAXCURV) ---------------------------------------------------------------------- } procedure SetClipping(Clip : Boolean); { ---------------------------------------------------------------------- Determines whether drawings are clipped at the current viewport boundaries, according to the value of the Boolean parameter Clip ---------------------------------------------------------------------- } procedure PlotPoint(Xp, Yp, Symbol, Size, Trace : Integer); { ---------------------------------------------------------------------- Plots a point on the screen ---------------------------------------------------------------------- Input parameters : Xp, Yp : point coordinates in pixels Symbol : 0 = point (.) 1 = solid circle 2 = open circle 3 = solid square 4 = open square 5 = solid triangle 6 = open triangle 7 = plus (+) 8 = multiply (x) 9 = star (*) Size : symbol size Trace : type of line between points 0 = none 1 = solid 2 = dotted 3 = centered 4 = dashed ---------------------------------------------------------------------- } procedure PlotCurve(X, Y : PVector; Lbound, Ubound, Symbol, Trace : Integer); { ---------------------------------------------------------------------- Plots a curve ---------------------------------------------------------------------- Input parameters : X, Y = point coordinates Lbound, Ubound = indices of first and last points Symbol, Trace = as in PlotPoint ---------------------------------------------------------------------- } procedure PlotCurveWithErrorBars(X, Y, S : PVector; Lbound, Ubound, Symbol, Trace : Integer); { ---------------------------------------------------------------------- Plots a curve with error bars ---------------------------------------------------------------------- Input parameters : X, Y = point coordinates S = errors (standard deviations) Lbound, Ubound = indices of first and last points Symbol, Trace = as in PlotPoint ---------------------------------------------------------------------- } procedure PlotFunc(Func : TFunc; X1, X2 : Float; Trace : Integer); { ---------------------------------------------------------------------- Plots a function ---------------------------------------------------------------------- Input parameters : Func = function to be plotted X1, X2 = abscissae of 1st and last point to plot Trace = as in PlotPoint ---------------------------------------------------------------------- The function must be programmed as : function Func(X : Float) : Float; ---------------------------------------------------------------------- } { *********** The following routines are defined in PLOT.INC *********** } procedure Interval(X1, X2 : Float; MinDiv, MaxDiv : Integer; var Min, Max, Step : Float); { ---------------------------------------------------------------------- Determines an interval [Min, Max] including the values from X1 to X2, and a subdivision Step of this interval ---------------------------------------------------------------------- Input parameters : X1, X2 = min. & max. values to be included MinDiv = minimum nb of subdivisions MaxDiv = maximum nb of subdivisions ---------------------------------------------------------------------- Output parameters : Min, Max, Step ---------------------------------------------------------------------- } procedure AutoScale(Z : PVector; Lbound, Ubound : Integer; var Axis : TAxis); { ---------------------------------------------------------------------- Determines the scale of an axis ---------------------------------------------------------------------- Input parameters : Z = array of values to be plotted Lbound, Ubound = indices of first and last elements of Z ---------------------------------------------------------------------- Output parameters : Axis ---------------------------------------------------------------------- } function Xpixel(X : Float) : Integer; { ---------------------------------------------------------------------- Converts user abscissa X to screen coordinate ---------------------------------------------------------------------- } function Ypixel(Y : Float) : Integer; { ---------------------------------------------------------------------- Converts user ordinate Y to screen coordinate ---------------------------------------------------------------------- } function Xuser(X : Integer) : Float; { ---------------------------------------------------------------------- Converts screen coordinate X to user abscissa ---------------------------------------------------------------------- } function Yuser(Y : Integer) : Float; { ---------------------------------------------------------------------- Converts screen coordinate Y to user ordinate ---------------------------------------------------------------------- } implementation { ---------------------------------------------------------------------- Include the variables and routines common to PLOT.PAS and WINPLOT.PAS ---------------------------------------------------------------------- } {$I PLOT.INC} { ---------------------------------------------------------------------- } procedure PlotXAxis; var W, X, Z : Float; N, I, J : Integer; NSZ : Boolean; begin Line(XminPixel, YmaxPixel, XmaxPixel, YmaxPixel); SetTextStyle(XTitle.Font, HorizDir, 1); SetUserCharSize(XTitle.CharWidth, 100, XTitle.CharHeight, 100); SetTextJustify(CenterText, TopText); N := Round((XAxis.Max - XAxis.Min) / XAxis.Step); { Nb of intervals } X := XAxis.Min; { Tick mark position } NSZ := NSZero; NSZero := False; { Don't write non significant zero's } for I := 0 to N do { Label axis } begin if (XAxis.Scale = LIN_SCALE) and (Abs(X) < EPS) then X := 0.0; MoveTo(Xpixel(X), YmaxPixel); LineRel(0, 5); { Plot tick mark } if XAxis.Scale = LIN_SCALE then Z := X else Z := Exp10(X); OutText(Trim(FloatToStr(Z))); if (XAxis.Scale = LOG_SCALE) and (I < N) then for J := 2 to 9 do { Plot minor divisions } begin { on logarithmic scale } W := X + Log10(J); MoveTo(Xpixel(W), YmaxPixel); LineRel(0, 3); end; X := X + XAxis.Step; end; if XTitle.Text <> '' then { Plot axis title } OutTextXY((XminPixel + XmaxPixel) div 2, YmaxPixel + GetMaxY div 12, XTitle.Text); NSZero := NSZ; end; procedure PlotYAxis; var W, Y, Z : Float; N, I, J : Integer; NSZ : Boolean; begin Line(XminPixel, YminPixel, XminPixel, YmaxPixel); SetTextStyle(YTitle.Font, HorizDir, 1); SetUserCharSize(YTitle.CharWidth, 100, YTitle.CharHeight, 100); SetTextJustify(RightText, CenterText); N := Round((YAxis.Max - YAxis.Min) / YAxis.Step); Y := YAxis.Min; NSZ := NSZero; NSZero := False; for I := 0 to N do begin if (YAxis.Scale = LIN_SCALE) and (Abs(Y) < EPS) then Y := 0.0; MoveTo(XminPixel, Ypixel(Y)); LineRel(- 5, 0); MoveRel(- 2, - 2); if YAxis.Scale = LIN_SCALE then Z := Y else Z := Exp10(Y); OutText(Trim(FloatToStr(Z))); if (YAxis.Scale = LOG_SCALE) and (I < N) then for J := 2 to 9 do begin W := Y + Log10(J); MoveTo(XminPixel, Ypixel(W)); LineRel(- 3, 0); end; Y := Y + YAxis.Step; end; if YTitle.Text <> '' then begin SetTextStyle(YTitle.Font, VertDir, 1); SetUserCharSize(YTitle.CharWidth, 100, YTitle.CharHeight, 100); OutTextXY(XminPixel - GetMaxX div 8, (YminPixel + YmaxPixel) div 2, YTitle.Text); end; NSZero := NSZ; end; function GraphOk : Boolean; var Pilot, Mode : Integer; begin Pilot := Detect; InitGraph(Pilot, Mode, BGIPath); if GraphResult <> 0 then begin GraphOk := False; Exit; end; GraphOk := True; XminPixel := Round(Xwin1 / 100 * GetMaxX); YminPixel := Round(Ywin1 / 100 * GetMaxY); XmaxPixel := Round(Xwin2 / 100 * GetMaxX); YmaxPixel := Round(Ywin2 / 100 * GetMaxY); FactX := (XmaxPixel - XminPixel) / (XAxis.Max - XAxis.Min); FactY := (YmaxPixel - YminPixel) / (YAxis.Max - YAxis.Min); if GraphBorder then Rectangle(XminPixel, YminPixel, XmaxPixel, YmaxPixel); PlotXAxis; PlotYAxis; end; procedure PlotGrid; var X, Y : Float; I, N, Xp, Yp : Integer; begin SetLineStyle(DottedLn, 0, NormWidth); if Grid in [HORIZ_GRID, BOTH_GRID] then { Horizontal lines } begin N := Round((YAxis.Max - YAxis.Min) / YAxis.Step); { Nb of intervals } for I := 1 to Pred(N) do begin Y := YAxis.Min + I * YAxis.Step; { Origin of line } Yp := Ypixel(Y); Line(XminPixel, Yp, XmaxPixel, Yp); end; end; if Grid in [VERTIC_GRID, BOTH_GRID] then { Vertical lines } begin N := Round((XAxis.Max - XAxis.Min) / XAxis.Step); for I := 1 to Pred(N) do begin X := XAxis.Min + I * XAxis.Step; Xp := Xpixel(X); Line(Xp, YminPixel, Xp, YmaxPixel); end; end; SetLineStyle(SolidLn, 0, NormWidth); end; procedure PlotPoint(Xp, Yp, Symbol, Size, Trace : Integer); var Xasp, Yasp, Xp1, Xp2, Yp1, Yp2, Dx, Dy : Word; R : Float; Triangle : array[1..4] of PointType; Square : array[1..5] of PointType; begin if Trace = 0 then MoveTo(Xp, Yp) else begin SetLineStyle(Pred(Trace), 0, NormWidth); LineTo(Xp, Yp); SetLineStyle(0, 0, 1); end; GetAspectRatio(Xasp, Yasp); R := 0.0001 * Size; Dx := Round(R * Yasp); Dy := Round(R * Xasp); Xp1 := Xp - Size; Xp2 := Xp + Size; Yp1 := Yp - Size; Yp2 := Yp + Size; if Symbol in [3, 4] then begin Square[1].X := Xp1; Square[1].Y := Yp1; Square[2].X := Xp1; Square[2].Y := Yp2; Square[3].X := Xp2; Square[3].Y := Yp2; Square[4].X := Xp2; Square[4].Y := Yp1; Square[5].X := Xp1; Square[5].Y := Yp1; end; if Symbol in [5, 6] then begin Triangle[1].X := Xp; Triangle[1].Y := Yp1; Triangle[2].X := Xp2; Triangle[2].Y := Yp2; Triangle[3].X := Xp1; Triangle[3].Y := Yp2; Triangle[4].X := Xp; Triangle[4].Y := Yp1; end; case Symbol of 0 : PutPixel(Xp, Yp, GetColor); { љ } 1 : PieSlice(Xp, Yp, 0, 360, Dx); { Solid circle } 2 : Ellipse(Xp, Yp, 0, 360, Dx, Dy); { Open circle } 3 : FillPoly(5, Square); { Solid square } 4 : DrawPoly(5, Square); { Open square } 5 : FillPoly(4, Triangle); { Solid triangle } 6 : DrawPoly(4, Triangle); { Open triangle } 7 : begin { + } Line(Xp, Yp1, Xp, Yp2); Line(Xp1, Yp, Xp2, Yp); end; 8 : begin { x } Line(Xp1, Yp1, Xp2, Yp2); Line(Xp1, Yp2, Xp2, Yp1); end; 9 : begin Line(Xp, Yp1, Xp, Yp2); { * } Line(Xp1, Yp, Xp2, Yp); Line(Xp1, Yp1, Xp2, Yp2); Line(Xp1, Yp2, Xp2, Yp1); end; end; end; procedure WriteLegend(NCurv : Integer); var I, Xp, Yp, Dy : Integer; begin with GraphTitle do if Text <> '' then begin SetTextStyle(Font, HorizDir, 1); SetUserCharSize(CharWidth, 100, CharHeight, 100); SetTextJustify(CenterText, TopText); OutTextXY((XminPixel + XmaxPixel) div 2, YminPixel - GetMaxY div 10, Text); end; with Legend do begin SetTextStyle(Font, HorizDir, 1); SetUserCharSize(CharWidth, 100, CharHeight, 100); SetTextJustify(LeftText, CenterText); Dy := (YmaxPixel - YminPixel) div 10; Xp := XmaxPixel + 30; Yp := YminPixel + Dy; for I := 1 to NCurv do if Text[I] <> '' then begin PlotPoint(Xp, Yp, I, SymbolSize, 0); OutTextXY(Xp + 20, Yp, Text[I]); Yp := Yp + Dy; end; end; end; procedure SetClipping(Clip : Boolean); begin if XminPixel = 0 then begin XminPixel := Round(Xwin1 / 100 * GetMaxX); YminPixel := Round(Ywin1 / 100 * GetMaxY); XmaxPixel := Round(Xwin2 / 100 * GetMaxX); YmaxPixel := Round(Ywin2 / 100 * GetMaxY); end; SetViewPort(XminPixel, YminPixel, XmaxPixel, YmaxPixel, Clip); XmaxPixel := XmaxPixel - XminPixel; XminPixel := 0; YmaxPixel := YmaxPixel - YminPixel; YminPixel := 0; end; procedure PlotCurve(X, Y : PVector; Lbound, Ubound, Symbol, Trace : Integer); var XI, YI : Float; I, NL : Integer; begin NL := 0; for I := Lbound to Ubound do begin XI := X^[I]; if XAxis.Scale = LOG_SCALE then XI := Log10(XI); YI := Y^[I]; if YAxis.Scale = LOG_SCALE then YI := Log10(YI); PlotPoint(Xpixel(XI), Ypixel(YI), Symbol, DefSymbSize, NL); NL := Trace; end; end; procedure PlotCurveWithErrorBars(X, Y, S : PVector; Lbound, Ubound, Symbol, Trace : Integer); var XI, YI, Y1, Y2 : Float; I, NL, Xp, Yp, Yp1, Yp2 : Integer; begin NL := 0; for I := Lbound to Ubound do begin XI := X^[I]; if XAxis.Scale = LOG_SCALE then XI := Log10(XI); YI := Y^[I]; if YAxis.Scale = LOG_SCALE then YI := Log10(YI); Xp := Xpixel(XI); Yp := Ypixel(YI); PlotPoint(Xp, Yp, Symbol, DefSymbSize, NL); if S^[I] > 0 then begin Y1 := Y^[I] - S^[I]; if YAxis.Scale = LOG_SCALE then Y1 := Log10(Y1); Y2 := Y^[I] + S^[I]; if YAxis.Scale = LOG_SCALE then Y2 := Log10(Y2); Yp1 := Ypixel(Y1); Yp2 := Ypixel(Y2); Line(Xp - 5, Yp1, Xp + 5, Yp1); Line(Xp - 5, Yp2, Xp + 5, Yp2); Line(Xp, Yp1, Xp, Yp2); end; NL := Trace; end; end; procedure PlotFunc(Func : TFunc; X1, X2 : Float; Trace : Integer); var X, Y, H : Float; I, Npt, NL, Xp, Yp : Integer; begin NL := 0; { Indicates if a line must be drawn from the previous point } X := X1; { Nb of points to be plotted = number of pixels between X1 and X2 } Npt := Xpixel(X2) - Xpixel(X1); H := (X2 - X1) / Npt; for I := 0 to Npt do begin X := X1 + I * H; if XAxis.Scale = LIN_SCALE then Y := Func(X) else Y := Func(Exp10(X)); if MathError <> FN_OK then NL := 0 else begin if YAxis.Scale = LOG_SCALE then Y := Log10(Y); Xp := Xpixel(X); Yp := Ypixel(Y); PlotPoint(Xp, Yp, 0, 0, NL); NL := Trace; end; end; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/plot.inc0000664000175000017500000000523607275536440021232 0ustar michaelmichael{ ********************************************************************** * PLOT.INC * ********************************************************************** Variables and routines common to PLOT.PAS and WINPLOT.PAS ********************************************************************** } var XminPixel, YminPixel : Integer; { Pixel coord. of upper left corner } XmaxPixel, YmaxPixel : Integer; { Pixel coord. of lower right corner } FactX, FactY : Float; { Scaling factors } function Xpixel(X : Float) : Integer; var P : Float; begin P := FactX * (X - XAxis.Min); if Abs(P) > 30000 then Xpixel := 30000 else Xpixel := Round(P) + XminPixel; end; function Ypixel(Y : Float) : Integer; var P : Float; begin P := FactY * (YAxis.Max - Y); if Abs(P) > 30000 then Ypixel := 30000 else Ypixel := Round(P) + YminPixel; end; function Xuser(X : Integer) : Float; begin Xuser := XAxis.Min + (X - XminPixel) / FactX; end; function Yuser(Y : Integer) : Float; begin Yuser := YAxis.Max - (Y - YminPixel) / FactY; end; procedure Interval(X1, X2 : Float; MinDiv, MaxDiv : Integer; var Min, Max, Step : Float); var H, R, K : Float; begin if X1 >= X2 then Exit; H := X2 - X1; R := Int(Log10(H)); if H < 1.0 then R := R - 1.0; Step := Exp10(R); repeat K := Int(H / Step); if K < MinDiv then Step := 0.5 * Step; if K > MaxDiv then Step := 2.0 * Step; until (K >= MinDiv) and (K <= MaxDiv); Min := Step * Int(X1 / Step); Max := Step * Int(X2 / Step); while Min > X1 do Min := Min - Step; while Max < X2 do Max := Max + Step; end; procedure AutoScale(Z : PVector; Lbound, Ubound : Integer; var Axis : TAxis); var I : Integer; Zmin, Zmax, Z1, Z2 : Float; begin if Axis.Scale = LIN_SCALE then Interval(Min(Z, Lbound, Ubound), Max(Z, Lbound, Ubound), 2, 6, Axis.Min, Axis.Max, Axis.Step) else begin Zmin := MAXNUM; Zmax := 0.0; for I := Lbound to Ubound do if Z^[I] > 0.0 then if Z^[I] < Zmin then Zmin := Z^[I] else if Z^[I] > Zmax then Zmax := Z^[I]; Z1 := Int(Log10(Zmin)); Z2 := Int(Log10(Zmax)); if Zmin < 1.0 then Z1 := Z1 - 1.0; if Zmax > 1.0 then Z2 := Z2 + 1.0; Axis.Min := Z1; Axis.Max := Z2; Axis.Step := 1.0; end; end; mricron-0.20120505.1~dfsg.1.orig/npm/dmath/pastring.pas0000664000175000017500000002010111326434466022076 0ustar michaelmichael{ ********************************************************************** * Unit PASTRING.PAS * * Version 1.8 * * (c) J. Debord, December 2000 * ********************************************************************** Turbo Pascal string routines ********************************************************************** } unit PaString; interface uses FMath, FComp, Matrices; { *** Global variables controlling the appearance of a numeric string ** } const NumLength : Integer = 10; { Length of a numeric field } MaxDec : Integer = 4; { Max. number of decimal places } FloatPoint : Boolean = False; { Floating point notation } NSZero : Boolean = True; { Write non significant zero's } { ************************** String routines *************************** } function LTrim(S : String) : String; { ---------------------------------------------------------------------- Removes leading blanks ---------------------------------------------------------------------- } function RTrim(S : String) : String; { ---------------------------------------------------------------------- Removes trailing blanks ---------------------------------------------------------------------- } function Trim(S : String) : String; { ---------------------------------------------------------------------- Removes leading and trailing blanks ---------------------------------------------------------------------- } function StrChar(N : Byte; C : Char) : String; { ---------------------------------------------------------------------- Returns a string made of character C repeated N times ---------------------------------------------------------------------- } function RFill(S : String; L : Byte) : String; { ---------------------------------------------------------------------- Completes string S with trailing blanks for a total length L ---------------------------------------------------------------------- } function LFill(S : String; L : Byte) : String; { ---------------------------------------------------------------------- Completes string S with leading blanks for a total length L ---------------------------------------------------------------------- } function CFill(S : String; L : Byte) : String; { ---------------------------------------------------------------------- Completes string S with leading blanks to center the string on a total length L ---------------------------------------------------------------------- } function Replace(S : String; C1, C2 : Char) : String; { ---------------------------------------------------------------------- Replaces in string S all the occurences of character C1 by character C2 ---------------------------------------------------------------------- } function Extract(S : String; var Index : Byte; Delim : Char) : String; { ---------------------------------------------------------------------- Extracts a field from a string. Index is the position of the first character of the field. Delim is the character used to separate fields (e.g. blank, comma or tabulation). Blanks immediately following Delim are ignored. Index is updated to the position of the next field. ---------------------------------------------------------------------- } procedure Parse(S : String; Delim : Char; Field : PStrVector; var N : Byte); { ---------------------------------------------------------------------- Parses a string into its constitutive fields. Delim is the field separator. The number of fields is returned in N. The fields are returned in Field^[0]..Field^[N - 1]. Field must be dimensioned in the calling program. ---------------------------------------------------------------------- } function FloatToStr(X : Float) : String; { ---------------------------------------------------------------------- Converts a real to a string according to the values of the global variables NumLength, MaxDec, FloatPoint and NSZero ---------------------------------------------------------------------- } function IntToStr(N : LongInt) : String; { ---------------------------------------------------------------------- Converts an integer to a string according to the values of the global variables NumLength and MaxDec. ---------------------------------------------------------------------- } function CompToStr(Z : Complex) : String; { ---------------------------------------------------------------------- Converts a complex number to a string. ---------------------------------------------------------------------- } implementation function LTrim(S : String) : String; begin if S <> '' then repeat if S[1] = ' ' then Delete(S, 1, 1); until S[1] <> ' '; LTrim := S; end; function RTrim(S : String) : String; var L1 : Byte; begin if S <> '' then repeat L1 := Length(S); if S[L1] = ' ' then Delete(S, L1, 1); until S[L1] <> ' '; RTrim := S; end; function Trim(S : String) : String; begin Trim := LTrim(RTrim(S)); end; function StrChar(N : Byte; C : Char) : String; var I : Byte; S : String; begin S := ''; for I := 1 to N do S := S + C; StrChar := S; end; function RFill(S : String; L : Byte) : String; var L1 : Byte; begin L1 := Length(S); if L1 >= L then RFill := S else RFill := S + StrChar(L - L1, ' '); end; function LFill(S : String; L : Byte) : String; var L1 : Byte; begin L1 := Length(S); if L1 >= L then LFill := S else LFill := StrChar(L - L1, ' ') + S; end; function CFill(S : String; L : Byte) : String; var L1 : Byte; begin L1 := Length(S); if L1 >= L then CFill := S else CFill := StrChar((L - L1) div 2, ' ') + S; end; function Replace(S : String; C1, C2 : Char) : String; var S1 : String; K : Byte; begin S1 := S; K := Pos(C1, S1); while K > 0 do begin S1[K] := C2; K := Pos(C1, S1); end; Replace := S1; end; function Extract(S : String; var Index : Byte; Delim : Char) : String; var I, L : Byte; begin I := Index; L := Length(S); { Search for Delim } while (I <= L) and (S[I] <> Delim) do Inc(I); { Extract field } if I = Index then Extract := '' else Extract := Copy(S, Index, I - Index); { Skip blanks after Delim } repeat Inc(I); until (I > L) or (S[I] <> ' '); { Update Index } Index := I; end; procedure Parse(S : String; Delim : Char; Field : PStrVector; var N : Byte); var I, Index, L : Byte; begin I := 0; Index := 1; L := Length(S); repeat Field^[I] := Extract(S, Index, Delim); Inc(I); until Index > L; N := I; end; function FloatToStr(X : Float) : String; var S : String; C : Char; L : Byte; begin if FloatPoint then begin Str(X:Pred(NumLength), S); S := ' ' + S; end else begin Str(X:NumLength:MaxDec, S); if not NSZero then repeat L := Length(S); C := S[L]; if (C = '0') or (C = '.') then Delete(S, L, 1); until C <> '0'; end; FloatToStr := S; end; function IntToStr(N : LongInt) : String; var S : String; begin Str(N:(NumLength - MaxDec - 1), S); IntToStr := S; end; function CompToStr(Z : Complex) : String; var S : String; begin if Z.Form = Rec then begin if Z.Y >= 0.0 then S := ' + ' else S := ' - '; CompToStr := FloatToStr(Z.X) + S + FloatToStr(Abs(Z.Y)) + ' * i'; end else CompToStr := FloatToStr(Z.R) + ' * Exp(' + FloatToStr(Z.Theta) + ' * i)'; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/optim.pas0000664000175000017500000010064211326434466021410 0ustar michaelmichael{ ********************************************************************** * Unit OPTIM.PAS * * Version 2.1 * * (c) J. Debord, June 2001 * ********************************************************************** This unit implements the following methods for function minimization: * Golden search for a function of one variable * Simplex, Marquardt, BFGS for a function of several variables ********************************************************************** References: 1) 'Numerical Recipes' by Press et al. 2) D. W. MARQUARDT, J. Soc. Indust. Appl. Math., 1963, 11, 431-441 3) J. A. NELDER & R. MEAD, Comput. J., 1964, 7, 308-313 4) R. O'NEILL, Appl. Statist., 1971, 20, 338-345 ********************************************************************** } unit Optim; interface uses FMath, Matrices; { ********************************************************************** Error codes ********************************************************************** } const OPT_OK = 0; { No error } OPT_SING = - 1; { Singular hessian matrix } OPT_BIG_LAMBDA = - 2; { Too high Marquardt's parameter } OPT_NON_CONV = - 3; { Non-convergence } { ********************************************************************** Functional types ********************************************************************** } type { Function of several variables } TFuncNVar = function(X : PVector) : Float; { Procedure to compute gradient vector } TGradient = procedure(Func : TFuncNVar; X : PVector; Lbound, Ubound : Integer; G : PVector); { Procedure to compute gradient vector and hessian matrix } THessGrad = procedure(Func : TFuncNVar; X : PVector; Lbound, Ubound : Integer; G : PVector; H : PMatrix); { ********************************************************************** Log file ********************************************************************** } const WriteLogFile : Boolean = False; { Write iteration info to log file } LogFileName : String = 'optim.log'; { Name of log file } { ********************************************************************** Minimization routines ********************************************************************** } function GoldSearch(Func : TFunc; A, B : Float; MaxIter : Integer; Tol : Float; var Xmin, Ymin : Float) : Integer; { ---------------------------------------------------------------------- Performs a golden search for the minimum of function Func ---------------------------------------------------------------------- Input parameters : Func = objective function A, B = two points near the minimum MaxIter = maximum number of iterations Tol = required precision (should not be less than the square root of the machine precision) ---------------------------------------------------------------------- Output parameters : Xmin, Ymin = coordinates of minimum ---------------------------------------------------------------------- Possible results : OPT_OK OPT_NON_CONV ---------------------------------------------------------------------- } function LinMin(Func : TFuncNVar; X, DeltaX : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var F_min : Float) : Integer; { ---------------------------------------------------------------------- Minimizes function Func from point X in the direction specified by DeltaX ---------------------------------------------------------------------- Input parameters : Func = objective function X = initial minimum coordinates DeltaX = direction in which minimum is searched Lbound, Ubound = indices of first and last variables MaxIter = maximum number of iterations Tol = required precision ---------------------------------------------------------------------- Output parameters : X = refined minimum coordinates F_min = function value at minimum ---------------------------------------------------------------------- Possible results : OPT_OK OPT_NON_CONV ---------------------------------------------------------------------- } function Simplex(Func : TFuncNVar; X : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var F_min : Float) : Integer; { ---------------------------------------------------------------------- Minimization of a function of several variables by the simplex method of Nelder and Mead ---------------------------------------------------------------------- Input parameters : Func = objective function X = initial minimum coordinates Lbound, Ubound = indices of first and last variables MaxIter = maximum number of iterations Tol = required precision ---------------------------------------------------------------------- Output parameters : X = refined minimum coordinates F_min = function value at minimum ---------------------------------------------------------------------- Possible results : OPT_OK OPT_NON_CONV ---------------------------------------------------------------------- } procedure NumGradient(Func : TFuncNVar; X : PVector; Lbound, Ubound : Integer; G : PVector); { ---------------------------------------------------------------------- Computes the gradient vector of a function of several variables by numerical differentiation ---------------------------------------------------------------------- Input parameters : Func = function of several variables X = vector of variables Lbound, Ubound = indices of first and last variables ---------------------------------------------------------------------- Output parameter : G = gradient vector ---------------------------------------------------------------------- } procedure NumHessGrad(Func : TFuncNVar; X : PVector; Lbound, Ubound : Integer; G : PVector; H : PMatrix); { ---------------------------------------------------------------------- Computes gradient vector & hessian matrix by numerical differentiation ---------------------------------------------------------------------- Input parameters : as in NumGradient ---------------------------------------------------------------------- Output parameters : G = gradient vector H = hessian matrix ---------------------------------------------------------------------- } function Marquardt(Func : TFuncNVar; HessGrad : THessGrad; X : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; H_inv : PMatrix) : Integer; { ---------------------------------------------------------------------- Minimization of a function of several variables by Marquardt's method ---------------------------------------------------------------------- Input parameters : Func = objective function HessGrad = procedure to compute gradient & hessian X = initial minimum coordinates Lbound, Ubound = indices of first and last variables MaxIter = maximum number of iterations Tol = required precision ---------------------------------------------------------------------- Output parameters : X = refined minimum coordinates F_min = function value at minimum H_inv = inverse hessian matrix ---------------------------------------------------------------------- Possible results : OPT_OK OPT_SING OPT_BIG_LAMBDA OPT_NON_CONV ---------------------------------------------------------------------- } function BFGS(Func : TFuncNVar; Gradient : TGradient; X : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; H_inv : PMatrix) : Integer; { ---------------------------------------------------------------------- Minimization of a function of several variables by the Broyden-Fletcher-Goldfarb-Shanno method ---------------------------------------------------------------------- Parameters : Gradient = procedure to compute gradient vector Other parameters as in Marquardt ---------------------------------------------------------------------- Possible results : OPT_OK OPT_NON_CONV ---------------------------------------------------------------------- } implementation var Eps : Float; { Fractional increment for numer. derivation } X1 : PVector; { Initial point for line minimization } DeltaX1 : PVector; { Direction for line minimization } Lbound1, Ubound1 : Integer; { Bounds of X1 and DeltaX1 } LinObjFunc : TFuncNVar; { Objective function for line minimization } LogFile : Text; { Stores the result of each minimization step } procedure MinBrack(Func : TFunc; var A, B, C, Fa, Fb, Fc : Float); { ---------------------------------------------------------------------- Given two points (A, B) this procedure finds a triplet (A, B, C) such that: 1) A < B < C 2) A, B, C are within the golden ratio 3) Func(B) < Func(A) and Func(B) < Func(C). The corresponding function values are returned in Fa, Fb, Fc ---------------------------------------------------------------------- } begin if A > B then FSwap(A, B); Fa := Func(A); Fb := Func(B); if Fb > Fa then begin FSwap(A, B); FSwap(Fa, Fb); end; C := B + GOLD * (B - A); Fc := Func(C); while Fc < Fb do begin A := B; B := C; Fa := Fb; Fb := Fc; C := B + GOLD * (B - A); Fc := Func(C); end; if A > C then begin FSwap(A, C); FSwap(Fa, Fc); end; end; function GoldSearch(Func : TFunc; A, B : Float; MaxIter : Integer; Tol : Float; var Xmin, Ymin : Float) : Integer; var C, Fa, Fb, Fc, F1, F2, MinTol, X0, X1, X2, X3 : Float; Iter : Integer; begin MinTol := Sqrt(MACHEP); if Tol < MinTol then Tol := MinTol; MinBrack(Func, A, B, C, Fa, Fb, Fc); X0 := A; X3 := C; if (C - B) > (B - A) then begin X1 := B; X2 := B + CGOLD * (C - B); F1 := Fb; F2 := Func(X2); end else begin X1 := B - CGOLD * (B - A); X2 := B; F1 := Func(X1); F2 := Fb; end; Iter := 0; while (Iter <= MaxIter) and (Abs(X3 - X0) > Tol * (Abs(X1) + Abs(X2))) do if F2 < F1 then begin X0 := X1; X1 := X2; F1 := F2; X2 := X1 + CGOLD * (X3 - X1); F2 := Func(X2); Inc(Iter); end else begin X3 := X2; X2 := X1; F2 := F1; X1 := X2 - CGOLD * (X2 - X0); F1 := Func(X1); Inc(Iter); end; if F1 < F2 then begin Xmin := X1; Ymin := F1; end else begin Xmin := X2; Ymin := F2; end; if Iter > MaxIter then GoldSearch := OPT_NON_CONV else GoldSearch := OPT_OK; end; procedure CreateLogFile; begin Assign(LogFile, LogFileName); Rewrite(LogFile); end; function Simplex(Func : TFuncNVar; X : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var F_min : Float) : Integer; const STEP = 1.50; { Step used to construct the initial simplex } var P : PMatrix; { Simplex coordinates } F : PVector; { Function values } Pbar : PVector; { Centroid coordinates } Pstar, P2star : PVector; { New vertices } Ystar, Y2star : Float; { New function values } F0 : Float; { Function value at minimum } N : Integer; { Number of parameters } M : Integer; { Index of last vertex } L, H : Integer; { Vertices with lowest & highest F values } I, J : Integer; { Loop variables } Iter : Integer; { Iteration count } Corr, MaxCorr : Float; { Corrections } Sum : Float; Flag : Boolean; procedure UpdateSimplex(Y : Float; Q : PVector); { Update "worst" vertex and function value } begin F^[H] := Y; CopyVector(P^[H], Q, Lbound, Ubound); end; begin if WriteLogFile then begin CreateLogFile; WriteLn(LogFile, 'Simplex'); WriteLn(LogFile, 'Iter F'); end; N := Ubound - Lbound + 1; M := Succ(Ubound); DimMatrix(P, M, Ubound); DimVector(F, M); DimVector(Pbar, Ubound); DimVector(Pstar, Ubound); DimVector(P2star, Ubound); Iter := 1; F0 := MAXNUM; { Construct initial simplex } for I := Lbound to M do CopyVector(P^[I], X, Lbound, Ubound); for I := Lbound to Ubound do P^[I]^[I] := P^[I]^[I] * STEP; { Evaluate function at each vertex } for I := Lbound to M do F^[I] := Func(P^[I]); repeat { Find vertices (L,H) having the lowest and highest function values, i.e. "best" and "worst" vertices } L := Lbound; H := Lbound; for I := Succ(Lbound) to M do if F^[I] < F^[L] then L := I else if F^[I] > F^[H] then H := I; if F^[L] < F0 then F0 := F^[L]; if WriteLogFile then WriteLn(LogFile, Iter:4, ' ', F0:12); { Find centroid of points other than P(H) } for J := Lbound to Ubound do begin Sum := 0.0; for I := Lbound to M do if I <> H then Sum := Sum + P^[I]^[J]; Pbar^[J] := Sum / N; end; { Reflect worst vertex through centroid } for J := Lbound to Ubound do Pstar^[J] := 2.0 * Pbar^[J] - P^[H]^[J]; Ystar := Func(Pstar); { If reflection successful, try extension } if Ystar < F^[L] then begin for J := Lbound to Ubound do P2star^[J] := 3.0 * Pstar^[J] - 2.0 * Pbar^[J]; Y2star := Func(P2star); { Retain extension or contraction } if Y2star < F^[L] then UpdateSimplex(Y2star, P2star) else UpdateSimplex(Ystar, Pstar); end else begin I := Lbound; Flag := False; repeat if (I <> H) and (F^[I] > Ystar) then Flag := True; Inc(I); until Flag or (I > M); if Flag then UpdateSimplex(Ystar, Pstar) else begin { Contraction on the reflection side of the centroid } if Ystar <= F^[H] then UpdateSimplex(Ystar, Pstar); { Contraction on the opposite side of the centroid } for J := Lbound to Ubound do P2star^[J] := 0.5 * (P^[H]^[J] + Pbar^[J]); Y2star := Func(P2star); if Y2star <= F^[H] then UpdateSimplex(Y2star, P2star) else { Contract whole simplex } for I := Lbound to M do for J := Lbound to Ubound do P^[I]^[J] := 0.5 * (P^[I]^[J] + P^[L]^[J]); end; end; { Test convergence } MaxCorr := 0.0; for J := Lbound to Ubound do begin Corr := Abs(P^[H]^[J] - P^[L]^[J]); if Corr > MaxCorr then MaxCorr := Corr; end; Inc(Iter); until (MaxCorr < Tol) or (Iter > MaxIter); CopyVector(X, P^[L], Lbound, Ubound); F_min := F^[L]; DelMatrix(P, M, Ubound); DelVector(F, M); DelVector(Pbar, Ubound); DelVector(Pstar, Ubound); DelVector(P2star, Ubound); if WriteLogFile then Close(LogFile); if Iter > MaxIter then Simplex := OPT_NON_CONV else Simplex := OPT_OK; end; {$F+} function F1dim(R : Float) : Float; { ---------------------------------------------------------------------- Function used by LinMin to find the minimum of the objective function LinObjFunc in the direction specified by the global variables X1 and DeltaX1. R is the step in this direction. ---------------------------------------------------------------------- } const Xt : PVector = nil; var I : Integer; begin if Xt = nil then DimVector(Xt, Ubound1); for I := Lbound1 to Ubound1 do Xt^[I] := X1^[I] + R * DeltaX1^[I]; F1dim := LinObjFunc(Xt); end; {$F-} function LinMin(Func : TFuncNVar; X, DeltaX : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var F_min : Float) : Integer; var I, ErrCode : Integer; R : Float; begin { Redimension global vectors } DelVector(X1, Ubound1); DelVector(DeltaX1, Ubound1); DimVector(X1, Ubound); DimVector(DeltaX1, Ubound); Lbound1 := Lbound; Ubound1 := Ubound; { Initialize global variables } LinObjFunc := Func; for I := Lbound to Ubound do begin X1^[I] := X^[I]; DeltaX1^[I] := DeltaX^[I] end; { Perform golden search } ErrCode := GoldSearch({$IFDEF FPK}@{$ENDIF}F1dim, 0.0, 1.0, MaxIter, Tol, R, F_min); { Update variables } if ErrCode = OPT_OK then for I := Lbound to Ubound do X^[I] := X^[I] + R * DeltaX^[I]; LinMin := ErrCode; end; {$F+} procedure NumGradient(Func : TFuncNVar; X : PVector; Lbound, Ubound : Integer; G : PVector); var Temp, Delta, Fplus, Fminus : Float; I : Integer; begin for I := Lbound to Ubound do begin Temp := X^[I]; if Temp <> 0.0 then Delta := Eps * Abs(Temp) else Delta := Eps; X^[I] := Temp - Delta; Fminus := Func(X); X^[I] := Temp + Delta; Fplus := Func(X); G^[I] := (Fplus - Fminus) / (2.0 * Delta); X^[I] := Temp; end; end; {$F-} {$F+} procedure NumHessGrad(Func : TFuncNVar; X : PVector; Lbound, Ubound : Integer; G : PVector; H : PMatrix); var Delta, Xminus, Xplus, Fminus, Fplus : PVector; Temp1, Temp2, F, F2plus : Float; I, J : Integer; begin DimVector(Delta, Ubound); { Increments } DimVector(Xminus, Ubound); { X - Delta } DimVector(Xplus, Ubound); { X + Delta } DimVector(Fminus, Ubound); { F(X - Delta) } DimVector(Fplus, Ubound); { F(X + Delta) } F := Func(X); for I := Lbound to Ubound do begin if X^[I] <> 0.0 then Delta^[I] := Eps * Abs(X^[I]) else Delta^[I] := Eps; Xplus^[I] := X^[I] + Delta^[I]; Xminus^[I] := X^[I] - Delta^[I]; end; for I := Lbound to Ubound do begin Temp1 := X^[I]; X^[I] := Xminus^[I]; Fminus^[I] := Func(X); X^[I] := Xplus^[I]; Fplus^[I] := Func(X); X^[I] := Temp1; end; for I := Lbound to Ubound do begin G^[I] := (Fplus^[I] - Fminus^[I]) / (2.0 * Delta^[I]); H^[I]^[I] := (Fplus^[I] + Fminus^[I] - 2.0 * F) / Sqr(Delta^[I]); end; for I := Lbound to Pred(Ubound) do begin Temp1 := X^[I]; X^[I] := Xplus^[I]; for J := Succ(I) to Ubound do begin Temp2 := X^[J]; X^[J] := Xplus^[J]; F2plus := Func(X); H^[I]^[J] := (F2plus - Fplus^[I] - Fplus^[J] + F) / (Delta^[I] * Delta^[J]); H^[J]^[I] := H^[I]^[J]; X^[J] := Temp2; end; X^[I] := Temp1; end; DelVector(Delta, Ubound); DelVector(Xminus, Ubound); DelVector(Xplus, Ubound); DelVector(Fminus, Ubound); DelVector(Fplus, Ubound); end; {$F-} function ParamConv(OldX, X : PVector; Lbound, Ubound : Integer; Tol : Float) : Boolean; { ---------------------------------------------------------------------- Check for convergence on parameters ---------------------------------------------------------------------- } var I : Integer; Conv : Boolean; begin I := Lbound; Conv := True; repeat Conv := Conv and (Abs(X^[I] - OldX^[I]) < FMax(Tol, Tol * Abs(OldX^[I]))); Inc(I); until (Conv = False) or (I > Ubound); ParamConv := Conv; end; function Marquardt(Func : TFuncNVar; HessGrad : THessGrad; X : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; H_inv : PMatrix) : Integer; const LAMBDA0 = 1.0E-2; { Initial lambda value } LAMBDAMAX = 1.0E+3; { Highest lambda value } FTOL = 1.0E-10; { Tolerance on function decrease } var Lambda, Lambda1 : Float; { Marquardt's lambda } I : Integer; { Loop variable } OldX : PVector; { Old parameters } G : PVector; { Gradient vector } H : PMatrix; { Hessian matrix } A : PMatrix; { Modified Hessian matrix } DeltaX : PVector; { New search direction } F1 : Float; { New minimum } Lambda_Ok : Boolean; { Successful Lambda decrease } Conv : Boolean; { Convergence reached } Done : Boolean; { Iterations done } Iter : Integer; { Iteration count } ErrCode : Integer; { Error code } begin if WriteLogFile then begin CreateLogFile; WriteLn(LogFile, 'Marquardt'); WriteLn(LogFile, 'Iter F Lambda'); end; Lambda := LAMBDA0; ErrCode := OPT_OK; DimVector(OldX, Ubound); DimVector(G, Ubound); DimMatrix(H, Ubound, Ubound); DimMatrix(A, Ubound, Ubound); DimVector(DeltaX, Ubound); F_min := Func(X); { Initial function value } LinObjFunc := Func; { Function for line minimization } Iter := 1; Conv := False; Done := False; repeat if WriteLogFile then WriteLn(LogFile, Iter:4, ' ', F_min:12, ' ', Lambda:12); { Save current parameters } CopyVector(OldX, X, Lbound, Ubound); { Compute Gradient and Hessian } HessGrad(Func, X, Lbound, Ubound, G, H); CopyMatrix(A, H, Lbound, Lbound, Ubound, Ubound); { Change sign of gradient } for I := Lbound to Ubound do G^[I] := - G^[I]; if Conv then { Newton-Raphson iteration } begin ErrCode := GaussJordan(A, G, Lbound, Ubound, H_inv, DeltaX); if ErrCode = MAT_OK then for I := Lbound to Ubound do X^[I] := OldX^[I] + DeltaX^[I]; Done := True; end else { Marquardt iteration } begin repeat { Multiply each diagonal term of H by (1 + Lambda) } Lambda1 := 1.0 + Lambda; for I := Lbound to Ubound do A^[I]^[I] := Lambda1 * H^[I]^[I]; ErrCode := GaussJordan(A, G, Lbound, Ubound, H_inv, DeltaX); if ErrCode = MAT_OK then begin { Initialize parameters } CopyVector(X, OldX, Lbound, Ubound); { Minimize in the direction specified by DeltaX } ErrCode := LinMin(Func, X, DeltaX, Lbound, Ubound, 100, 0.01, F1); { Check that the function has decreased. Otherwise increase Lambda, without exceeding LAMBDAMAX } Lambda_Ok := (F1 - F_min) < F_min * FTOL; if not Lambda_Ok then Lambda := 10.0 * Lambda; if Lambda > LAMBDAMAX then ErrCode := OPT_BIG_LAMBDA; end; until Lambda_Ok or (ErrCode <> MAT_OK); { Check for convergence } Conv := ParamConv(OldX, X, Lbound, Ubound, Tol); { Prepare next iteration } Lambda := 0.1 * Lambda; F_min := F1; end; Inc(Iter); if Iter > MaxIter then ErrCode := OPT_NON_CONV; until Done or (ErrCode <> OPT_OK); DelVector(OldX, Ubound); DelVector(G, Ubound); DelMatrix(H, Ubound, Ubound); DelMatrix(A, Ubound, Ubound); DelVector(DeltaX, Ubound); if WriteLogFile then Close(LogFile); if ErrCode = MAT_SINGUL then ErrCode := OPT_SING; Marquardt := ErrCode; end; function BFGS(Func : TFuncNVar; Gradient : TGradient; X : PVector; Lbound, Ubound : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; H_inv : PMatrix) : Integer; var I, J, Iter, ErrCode : Integer; DeltaXmax, Gmax, P1, P2, R1, R2 : Float; OldX, DeltaX, dX, G, OldG, dG, HdG, R1dX, R2HdG, U, P2U : PVector; Conv : Boolean; function AbsMax(V : PVector; Lbound, Ubound : Integer) : Float; { Returns the component with maximum absolute value } var I : Integer; AbsV : PVector; begin DimVector(AbsV, Ubound); for I := Lbound to Ubound do AbsV^[I] := Abs(V^[I]); AbsMax := Max(AbsV, Lbound, Ubound); DelVector(AbsV, Ubound); end; begin if WriteLogFile then begin CreateLogFile; WriteLn(LogFile, 'BFGS'); WriteLn(LogFile, 'Iter F'); end; DimVector(OldX, Ubound); DimVector(DeltaX, Ubound); DimVector(dX, Ubound); DimVector(G, Ubound); DimVector(OldG, Ubound); DimVector(dG, Ubound); DimVector(HdG, Ubound); DimVector(R1dX, Ubound); DimVector(R2HdG, Ubound); DimVector(U, Ubound); DimVector(P2U, Ubound); Iter := 0; Conv := False; LinObjFunc := Func; { Function for line minimization } { Initialize function } F_min := Func(X); { Initialize inverse hessian to unit matrix } for I := Lbound to Ubound do for J := Lbound to Ubound do if I = J then H_inv^[I]^[J] := 1.0 else H_inv^[I]^[J] := 0.0; { Initialize gradient } Gradient(Func, X, Lbound, Ubound, G); Gmax := AbsMax(G, Lbound, Ubound); { Initialize search direction } if Gmax > MACHEP then for I := Lbound to Ubound do DeltaX^[I] := - G^[I] else Conv := True; { Quit if gradient is already small } while (not Conv) and (Iter < MaxIter) do begin if WriteLogFile then WriteLn(LogFile, Iter:4, ' ', F_min:12); { Normalize search direction to avoid excessive displacements } DeltaXmax := AbsMax(DeltaX, Lbound, Ubound); if DeltaXmax > 1.0 then for I := Lbound to Ubound do DeltaX^[I] := DeltaX^[I] / DeltaXmax; { Save old parameters and gradient } CopyVector(OldX, X, Lbound, Ubound); CopyVector(OldG, G, Lbound, Ubound); { Minimize along the direction specified by DeltaX } ErrCode := LinMin(Func, X, DeltaX, Lbound, Ubound, 100, 0.01, F_min); { Compute new gradient } Gradient(Func, X, Lbound, Ubound, G); { Compute differences between two successive estimations of parameter vector and gradient vector } for I := Lbound to Ubound do begin dX^[I] := X^[I] - OldX^[I]; dG^[I] := G^[I] - OldG^[I]; end; { Multiply by inverse hessian } for I := Lbound to Ubound do begin HdG^[I] := 0.0; for J := Lbound to Ubound do HdG^[I] := HdG^[I] + H_inv^[I]^[J] * dG^[J]; end; { Scalar products in denominator of BFGS formula } P1 := 0.0; P2 := 0.0; for I := Lbound to Ubound do begin P1 := P1 + dX^[I] * dG^[I]; P2 := P2 + dG^[I] * HdG^[I]; end; if (P1 = 0.0) or (P2 = 0.0) then Conv := True else begin { Inverses of scalar products } R1 := 1.0 / P1; R2 := 1.0 / P2; { Compute BFGS correction terms } for I := Lbound to Ubound do begin R1dX^[I] := R1 * dX^[I]; R2HdG^[I] := R2 * HdG^[I]; U^[I] := R1dX^[I] - R2HdG^[I]; P2U^[I] := P2 * U^[I]; end; { Update inverse hessian } for I := Lbound to Ubound do for J := Lbound to Ubound do H_inv^[I]^[J] := H_inv^[I]^[J] + R1dX^[I] * dX^[J] - R2HdG^[I] * HdG^[J] + P2U^[I] * U^[J]; { Update search direction } for I := Lbound to Ubound do begin DeltaX^[I] := 0.0; for J := Lbound to Ubound do DeltaX^[I] := DeltaX^[I] - H_inv^[I]^[J] * G^[J]; end; { Test convergence and update iteration count } Conv := ParamConv(OldX, X, Lbound, Ubound, Tol); Inc(Iter); end; end; DelVector(OldX, Ubound); DelVector(DeltaX, Ubound); DelVector(dX, Ubound); DelVector(G, Ubound); DelVector(OldG, Ubound); DelVector(dG, Ubound); DelVector(HdG, Ubound); DelVector(R1dX, Ubound); DelVector(R2HdG, Ubound); DelVector(U, Ubound); DelVector(P2U, Ubound); if WriteLogFile then Close(LogFile); if Iter > MaxIter then BFGS := OPT_NON_CONV else BFGS := OPT_OK; end; begin X1 := nil; DeltaX1 := nil; Ubound1 := 1; Eps := Power(MACHEP, 0.333); end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/models.pas0000664000175000017500000004741111326434466021547 0ustar michaelmichael{ ********************************************************************** * Unit MODELS.PAS * * Version 1.4 * * (c) J. Debord, August 2000 * ********************************************************************** Library of regression and variance models ********************************************************************** } unit Models; {$F+} interface uses FMath, Matrices, Regress, FitLin, FitMult, FitPoly, FitFrac, FitExpo, FitIExpo, FitExLin, FitPower, FitMich, FitHill, FitLogis, FitPKa; { --------------------------------------------------------------------- Highest index of regression models --------------------------------------------------------------------- } const MAXMODEL = 11; { --------------------------------------------------------------------- Highest index of variance models --------------------------------------------------------------------- } const MAXVARMODEL = 5; { --------------------------------------------------------------------- Definition of regression models --------------------------------------------------------------------- } const REG_LIN = 0; { Linear } REG_MULT = 1; { Multiple linear } REG_POL = 2; { Polynomial } REG_FRAC = 3; { Rational fraction } REG_EXPO = 4; { Sum of exponentials } REG_IEXPO = 5; { Increasing exponential } REG_EXLIN = 6; { Exponential + linear } REG_POWER = 7; { Power } REG_MICH = 8; { Michaelis } REG_HILL = 9; { Hill } REG_LOGIS = 10; { Logistic } REG_PKA = 11; { Acid/Base titration curve } { --------------------------------------------------------------------- Definition of variance models --------------------------------------------------------------------- } const VAR_CONST = 0; { Constant } VAR_LIN = 1; { Linear } VAR_POL2 = 2; { 2nd degree polynomial } VAR_POL3 = 3; { 3rd degree polynomial } VAR_EXPO = 4; { Exponential } VAR_POWER = 5; { Power } { --------------------------------------------------------------------- Names of regression models --------------------------------------------------------------------- } const MODELNAME : array[0..MAXMODEL] of String = {$IFDEF FRENCH} ('Lineaire', 'Lineaire multiple', 'Polynomial', 'Fraction rationnelle', 'Somme d''exponentielles', 'Exponentielle croissante', 'Exponentielle + lineaire', 'Puissance', 'Michaelis', 'Hill', 'Logistique', 'Titrage acide/base'); {$ELSE} ('Linear', 'Multiple linear', 'Polynomial', 'Rational fraction', 'Sum of exponentials', 'Increasing exponential', 'Exponential + linear', 'Power', 'Michaelis', 'Hill', 'Logistic', 'Acid/Base titration curve'); {$ENDIF} { --------------------------------------------------------------------- Names of variance models --------------------------------------------------------------------- } const VARMODELNAME : array[0..MAXVARMODEL] of String = {$IFDEF FRENCH} ('Constante', 'Lineaire', 'Polynome de degre 2', 'Polynome de degre 3', 'Exponentielle', 'Puissance'); {$ELSE} ('Constant', 'Linear', '2nd degree polynomial', '3rd degree polynomial', 'Exponential', 'Power'); {$ENDIF} function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function -------------------------------------------------------------------- } function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first fitted parameter -------------------------------------------------------------------- } function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last fitted parameter -------------------------------------------------------------------- } function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th fitted parameter -------------------------------------------------------------------- } function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function for one independent variable B is the vector of parameters -------------------------------------------------------------------- } function RegFuncNVar(X, B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function for several independent variables B is the vector of parameters -------------------------------------------------------------------- } procedure DerivProc(RegFunc : TRegFunc; X, Y : Float; B, D : PVector); { -------------------------------------------------------------------- Computes the derivatives of the regression function at point (X,Y) with respect to the parameters B. The results are returned in D. D^[I] contains the derivative with respect to the I-th parameter. -------------------------------------------------------------------- } procedure InitModel(Reg_Model, Var_Model : Integer; CstPar : PVector); { -------------------------------------------------------------------- Initializes the regression and variance models. Constant parameters (e.g. degree of polynomial) are passed in vector CstPar. -------------------------------------------------------------------- } function WLSFit(X : PVector; U : PMatrix; Y : PVector; N : Integer; Init : Boolean; MaxIter : Integer; Tol : Float; Theta, B : PVector; B_min, B_max : PVector; V : PMatrix; Ycalc, S : PVector; var Test : TRegTest) : Integer; { ---------------------------------------------------------------------- Fits the regression function and computes the regression tests ---------------------------------------------------------------------- Input : X, U = vector or matrix of independent variable(s) Y = vector of dependent variable N = number of observations Init = TRUE to compute initial parameter estimates FALSE to use the current values MaxIter = maximum number of iterations (if 0 the parameters will not be refined) Tol = required parameter precision Theta = variance parameters B = initial parameters values B_min, B_max = parameter bounds -------------------------------------------------------------------- Output : Theta = updated variance parameters (residual variance stored in Theta^[0]) B = regression parameters V = variance-covariance matrix Ycalc = estimated Y values S = standard deviations of Y Test = regression tests -------------------------------------------------------------------- Possible results = OPT_OK : no error OPT_SING : singular matrix OPT_BIG_LAMBDA : too high Marquardt's parameter OPT_NON_CONV : non-convergence -------------------------------------------------------------------- } function VarFuncName : String; { -------------------------------------------------------------------- Returns the name of the variance function -------------------------------------------------------------------- } function LastVarParam : Integer; { ---------------------------------------------------------------------- Returns the index of the last variance parameter (upper bound of Theta) ---------------------------------------------------------------------- } function VarFunc(Y : Float; Theta : PVector) : Float; { -------------------------------------------------------------------- Computes the variance of an observation Y. The parameters are Theta^[1], Theta^[2],... The true variance is Theta^[0] * VarFunc, where Theta^[0] (equal to the residual variance Vr) is estimated by the regression program. -------------------------------------------------------------------- } implementation const RegModel : Integer = 0; { Index of regression model } VarModel : Integer = 0; { Index of variance model } function FuncName : String; begin case RegModel of REG_LIN : FuncName := FitLin.FuncName; REG_MULT : FuncName := FitMult.FuncName; REG_POL : FuncName := FitPoly.FuncName; REG_FRAC : FuncName := FitFrac.FuncName; REG_EXPO : FuncName := FitExpo.FuncName; REG_IEXPO : FuncName := FitIExpo.FuncName; REG_EXLIN : FuncName := FitExLin.FuncName; REG_POWER : FuncName := FitPower.FuncName; REG_MICH : FuncName := FitMich.FuncName; REG_HILL : FuncName := FitHill.FuncName; REG_LOGIS : FuncName := FitLogis.FuncName; REG_PKA : FuncName := FitPKa.FuncName; end; end; function FirstParam : Integer; begin case RegModel of REG_LIN : FirstParam := FitLin.FirstParam; REG_MULT : FirstParam := FitMult.FirstParam; REG_POL : FirstParam := FitPoly.FirstParam; REG_FRAC : FirstParam := FitFrac.FirstParam; REG_EXPO : FirstParam := FitExpo.FirstParam; REG_IEXPO : FirstParam := FitIExpo.FirstParam; REG_EXLIN : FirstParam := FitExLin.FirstParam; REG_POWER : FirstParam := FitPower.FirstParam; REG_MICH : FirstParam := FitMich.FirstParam; REG_HILL : FirstParam := FitHill.FirstParam; REG_LOGIS : FirstParam := FitLogis.FirstParam; REG_PKA : FirstParam := FitPKa.FirstParam; end; end; function LastParam : Integer; begin case RegModel of REG_LIN : LastParam := FitLin.LastParam; REG_MULT : LastParam := FitMult.LastParam; REG_POL : LastParam := FitPoly.LastParam; REG_FRAC : LastParam := FitFrac.LastParam; REG_EXPO : LastParam := FitExpo.LastParam; REG_IEXPO : LastParam := FitIExpo.LastParam; REG_EXLIN : LastParam := FitExLin.LastParam; REG_POWER : LastParam := FitPower.LastParam; REG_MICH : LastParam := FitMich.LastParam; REG_HILL : LastParam := FitHill.LastParam; REG_LOGIS : LastParam := FitLogis.LastParam; REG_PKA : LastParam := FitPKa.LastParam; end; end; function ParamName(I : Integer) : String; begin case RegModel of REG_LIN : ParamName := FitLin.ParamName(I); REG_MULT : ParamName := FitMult.ParamName(I); REG_POL : ParamName := FitPoly.ParamName(I); REG_FRAC : ParamName := FitFrac.ParamName(I); REG_EXPO : ParamName := FitExpo.ParamName(I); REG_IEXPO : ParamName := FitIExpo.ParamName(I); REG_EXLIN : ParamName := FitExLin.ParamName(I); REG_POWER : ParamName := FitPower.ParamName(I); REG_MICH : ParamName := FitMich.ParamName(I); REG_HILL : ParamName := FitHill.ParamName(I); REG_LOGIS : ParamName := FitLogis.ParamName(I); REG_PKA : ParamName := FitPKa.ParamName(I); end; end; function RegFunc(X : Float; B : PVector) : Float; begin case RegModel of REG_LIN : RegFunc := FitLin.RegFunc(X, B); REG_POL : RegFunc := FitPoly.RegFunc(X, B); REG_FRAC : RegFunc := FitFrac.RegFunc(X, B); REG_EXPO : RegFunc := FitExpo.RegFunc(X, B); REG_IEXPO : RegFunc := FitIExpo.RegFunc(X, B); REG_EXLIN : RegFunc := FitExLin.RegFunc(X, B); REG_POWER : RegFunc := FitPower.RegFunc(X, B); REG_MICH : RegFunc := FitMich.RegFunc(X, B); REG_HILL : RegFunc := FitHill.RegFunc(X, B); REG_LOGIS : RegFunc := FitLogis.RegFunc(X, B); REG_PKA : RegFunc := FitPKa.RegFunc(X, B); end; end; function RegFuncNVar(X, B : PVector) : Float; begin case RegModel of REG_MULT : RegFuncNVar := FitMult.RegFunc(X, B); end; end; procedure DerivProc(RegFunc : TRegFunc; X, Y : Float; B, D : PVector); begin case RegModel of REG_FRAC : FitFrac.DerivProc(X, Y, B, D); REG_EXPO : FitExpo.DerivProc(X, B, D); REG_IEXPO : FitIExpo.DerivProc(X, B, D); REG_EXLIN : FitExLin.DerivProc(X, B, D); REG_POWER : FitPower.DerivProc(X, Y, B, D); REG_MICH : FitMich.DerivProc(X, Y, B, D); REG_HILL : FitHill.DerivProc(X, Y, B, D); REG_LOGIS : FitLogis.DerivProc(X, B, D); REG_PKA : FitPKa.DerivProc(X, B, D); else NumDeriv(RegFunc, X, Y, B, D); end; end; procedure InitModel(Reg_Model, Var_Model : Integer; CstPar : PVector); begin RegModel := Reg_Model; VarModel := Var_Model; case RegModel of REG_MULT : FitMult.InitModel(CstPar); REG_POL : FitPoly.InitModel(CstPar); REG_FRAC : FitFrac.InitModel(CstPar); REG_EXPO : FitExpo.InitModel(CstPar); REG_LOGIS : FitLogis.InitModel(CstPar); end; end; function FitModel(Method : Integer; X : PVector; U : PMatrix; Y, W : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; { -------------------------------------------------------------------- Fits the regression model by unweighted linear least squares. For nonlinear models, this is only an approximate fit, to be refined by the nonlinear regression procedure WLSFit -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X, U = vector or matrix of independent variable(s) Y = vector of dependent variable W = weights N = number of observations -------------------------------------------------------------------- Output : B = estimated regression parameters V = unscaled variance-covariance matrix (for linear and polynomial models only). The true matrix will be Vr * V, where Vr is the residual variance. -------------------------------------------------------------------- The function returns 0 if no error occurred -------------------------------------------------------------------- } begin case RegModel of REG_LIN : FitModel := FitLin.FitModel(Method, X, Y, W, N, B, V); REG_MULT : FitModel := FitMult.FitModel(Method, U, Y, W, N, B, V); REG_POL : FitModel := FitPoly.FitModel(Method, X, Y, W, N, B, V); REG_FRAC : FitModel := FitFrac.FitModel(Method, X, Y, W, N, B); REG_EXPO : FitModel := FitExpo.FitModel(Method, X, Y, W, N, B); REG_IEXPO : FitModel := FitIExpo.FitModel(Method, X, Y, W, N, B); REG_EXLIN : FitModel := FitExLin.FitModel(X, Y, N, B); REG_POWER : FitModel := FitPower.FitModel(Method, X, Y, W, N, B); REG_MICH : FitModel := FitMich.FitModel(Method, X, Y, W, N, B); REG_HILL : FitModel := FitHill.FitModel(Method, X, Y, W, N, B); REG_LOGIS : FitModel := FitLogis.FitModel(Method, X, Y, W, N, B); REG_PKA : FitModel := FitPKa.FitModel(X, Y, N, B); end; end; function WLSFit(X : PVector; U : PMatrix; Y : PVector; N : Integer; Init : Boolean; MaxIter : Integer; Tol : Float; Theta, B : PVector; B_min, B_max : PVector; V : PMatrix; Ycalc, S : PVector; var Test : TRegTest) : Integer; var Method : Integer; { Regression method } W : PVector; { Weights } Xk : PVector; { Vector of variables for observation k } Sr : Float; { Residual standard deviation } ErrCode : Integer; { Error code } K : Integer; { Loop variable } begin DimVector(W, N); DimVector(Xk, LastParam); { Determine regression method } if VarModel = VAR_CONST then Method := 0 else Method := 1; { Compute weights if necessary } if Method = 1 then for K := 1 to N do W^[K] := 1.0 / VarFunc(Y^[K], Theta); { Compute initial parameter estimates if necessary } if Init then ErrCode := FitModel(Method, X, U, Y, W, N, B, V) else ErrCode := 0; { Refine parameters if necessary } if not(RegModel in [REG_LIN, REG_MULT, REG_POL]) and (MaxIter > 0) and (ErrCode = 0) then if VarModel = VAR_CONST then ErrCode := NLFit({$IFDEF FPK}@{$ENDIF}RegFunc, {$IFDEF FPK}@{$ENDIF}DerivProc, X, Y, N, FirstParam, LastParam, MaxIter, Tol, B, B_min, B_max, V) else ErrCode := WNLFit({$IFDEF FPK}@{$ENDIF}RegFunc, {$IFDEF FPK}@{$ENDIF}DerivProc, X, Y, W, N, FirstParam, LastParam, MaxIter, Tol, B, B_min, B_max, V); if ErrCode = 0 then begin { Estimate Y values } if RegModel = REG_MULT then for K := 1 to N do begin CopyVectorFromCol(Xk, U, FirstParam, LastParam, K); Ycalc^[K] := RegFuncNVar(Xk, B); end else for K := 1 to N do Ycalc^[K] := RegFunc(X^[K], B); { Compute regression tests and update variance-covariance matrix } if VarModel = VAR_CONST then RegTest(Y, Ycalc, N, FirstParam, LastParam, V, Test) else WRegTest(Y, Ycalc, W, N, FirstParam, LastParam, V, Test); { Store residual variance in Theta^[0] } Theta^[0] := Test.Vr; { Compute standard deviations } Sr := Sqrt(Test.Vr); for K := 1 to N do S^[K] := Sr; if VarModel <> VAR_CONST then for K := 1 to N do S^[K] := S^[K] / Sqrt(W^[K]); end; DelVector(W, N); DelVector(Xk, LastParam); WLSFit := ErrCode; end; function VarFuncName : String; begin case VarModel of VAR_CONST : VarFuncName := 'v = e0'; VAR_LIN : VarFuncName := 'v = e0.(1 + e1.y)'; VAR_POL2 : VarFuncName := 'v = e0.(1 + e1.y + e2.y^2)'; VAR_POL3 : VarFuncName := 'v = e0.(1 + e1.y + e2.y^2 + e3.y^3)'; VAR_EXPO : VarFuncName := 'v = e0.exp(e1.y)'; VAR_POWER : VarFuncName := 'v = e0.y^e1'; end; end; function VarFunc(Y : Float; Theta : PVector) : Float; begin case VarModel of VAR_CONST : VarFunc := 1.0; VAR_LIN : VarFunc := 1.0 + Theta^[1] * Y; VAR_POL2 : VarFunc := 1.0 + Y * (Theta^[1] + Theta^[2] * Y); VAR_POL3 : VarFunc := 1.0 + Y * (Theta^[1] + Y * (Theta^[2] + Theta^[3] * Y)); VAR_EXPO : VarFunc := Exp(Theta^[1] * Y); VAR_POWER : VarFunc := Power(Y, Theta^[1]); end; end; function LastVarParam : Integer; begin case VarModel of VAR_CONST : LastVarParam := 0; VAR_LIN : LastVarParam := 1; VAR_POL2 : LastVarParam := 2; VAR_POL3 : LastVarParam := 3; VAR_EXPO : LastVarParam := 1; VAR_POWER : LastVarParam := 1; end; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/mcmc.pas0000664000175000017500000002407511326434466021204 0ustar michaelmichael{ ********************************************************************** * Unit MCMC.PAS * * Version 1.2 * * (c) J. Debord, June 2001 * ********************************************************************** Simulation by Markov Chain Monte Carlo (MCMC) with the Metropolis-Hastings algorithm. This algorithm simulates the probability density function (pdf) of a vector X. The pdf P(X) is written as: P(X) = C * Exp(- F(X) / T) Simulating P by the Metropolis-Hastings algorithm is equivalent to minimizing F by simulated annealing at the constant temperature T. The constant C is not used in the simulation. The series of random vectors generated during the annealing step constitutes a Markov chain which tends towards the pdf to be simulated. It is possible to run several cycles of the algorithm. The variance-covariance matrix of the simulated distribution is re-evaluated at the end of each cycle and used for the next cycle. ********************************************************************** } unit MCMC; interface uses FMath, Matrices, Optim, Regress; { ********************************************************************** Metropolis-Hastings parameters ********************************************************************** } const MH_NCycles : Integer = 1; { Number of cycles } MH_MaxSim : Integer = 1000; { Max nb of simulations at each cycle } MH_SavedSim : Integer = 200; { Nb of simulations to be saved } { ********************************************************************** Simulation routine ********************************************************************** } function Hastings(Func : TFuncNVar; T : Float; X : PVector; V : PMatrix; Lbound, Ubound : Integer; Xmat : PMatrix; X_min : PVector; var F_min : Float) : Integer; { ---------------------------------------------------------------------- Simulation of a probability density function by the Metropolis-Hastings algorithm ---------------------------------------------------------------------- Input parameters : Func = Function such that the pdf is P(X) = C * Exp(- Func(X) / T) T = Temperature X = Initial mean vector V = Initial variance-covariance matrix Lbound, Ubound = Indices of first and last variables ---------------------------------------------------------------------- Output parameters : Xmat = Matrix of simulated vectors, stored columnwise, i.e. Xmat[Lbound..Ubound, 1..MH_SavedSim] X = Mean of distribution V = Variance-covariance matrix of distribution X_min = Coordinates of minimum of F(X) (mode of the distribution) F_min = Value of F(X) at minimum ---------------------------------------------------------------------- Possible results : MAT_OK : No error MAT_NOT_PD : The variance-covariance matrix is not positive definite ---------------------------------------------------------------------- } implementation function CalcSD(V : PMatrix; Lbound, Ubound : Integer; L : PMatrix) : Integer; { ---------------------------------------------------------------------- Computes the standard deviations for independent random numbers from the variance-covariance matrix. ---------------------------------------------------------------------- } var I, ErrCode : Integer; begin I := LBound; ErrCode := 0; repeat if V^[I]^[I] > 0.0 then L^[I]^[I] := Sqrt(V^[I]^[I]) else ErrCode := MAT_NOT_PD; Inc(I); until (ErrCode <> 0) or (I > Ubound); CalcSD := ErrCode; end; procedure GenIndepRandomVector(X : PVector; L : PMatrix; Lbound, Ubound : Integer; X1 : PVector); { ---------------------------------------------------------------------- Generates a random vector X1 from X, using independent gaussian random increments. L is the diagonal matrix of the standard deviations. ---------------------------------------------------------------------- } var I : Integer; begin for I := Lbound to Ubound do X1^[I] := RanGauss(X^[I], L^[I]^[I]); end; procedure GenRandomVector(X : PVector; L : PMatrix; Lbound, Ubound : Integer; X1 : PVector); { ---------------------------------------------------------------------- Generates a random vector X1 from X, using correlated gaussian random increments. L is the Cholesky factor of the variance-covariance matrix ---------------------------------------------------------------------- } var U : PVector; I, J : Integer; begin { Form a vector U of independent standard normal variates } DimVector(U, Ubound); for I := Lbound to Ubound do U^[I] := RanGaussStd; { Form X1 = X + L*U, which follows the multinormal distribution } for I := Lbound to Ubound do begin X1^[I] := X^[I]; for J := Lbound to I do X1^[I] := X1^[I] + L^[I]^[J] * U^[J]; end; DelVector(U, Ubound); end; function Accept(DeltaF, T : Float) : Boolean; { ---------------------------------------------------------------------- Checks if a variation DeltaF of the function at temperature T is acceptable. ---------------------------------------------------------------------- } begin Accept := (DeltaF < 0.0) or (Expo(- DeltaF / T) > RanMar); end; function HastingsCycle(Func : TFuncNVar; T : Float; X : PVector; V : PMatrix; Lbound, Ubound : Integer; Indep : Boolean; Xmat : PMatrix; X_min : PVector; var F_min : Float) : Integer; { ---------------------------------------------------------------------- Performs one cycle of the Metropolis-Hastings algorithm ---------------------------------------------------------------------- } var F, F1 : Float; { Function values } DeltaF : Float; { Variation of function } X1 : PVector; { New coordinates } L : PMatrix; { Standard dev. or Cholesky factor } I, K : Integer; { Loop variable } Iter : Integer; { Iteration count } FirstSavedSim : Integer; { Index of first simulation to be saved } ErrCode : Integer; { Error code } begin { Dimension arrays } DimVector(X1, Ubound); DimMatrix(L, Ubound, Ubound); { Compute SD's or Cholesky factor } if Indep then ErrCode := CalcSD(V, Lbound, Ubound, L) else ErrCode := Cholesky(V, Lbound, Ubound, L); HastingsCycle := ErrCode; if ErrCode = MAT_NOT_PD then Exit; { Compute initial function value } F := Func(X); { Perform MH_MaxSim simulations at constant temperature } FirstSavedSim := MH_MaxSim - MH_SavedSim + 1; Iter := 1; K := 1; repeat { Generate new vector } if Indep then GenIndepRandomVector(X, L, Lbound, Ubound, X1) else GenRandomVector(X, L, Lbound, Ubound, X1); { Compute new function value } F1 := Func(X1); DeltaF := F1 - F; { Check for acceptance } if Accept(DeltaF, T) then begin CopyVector(X, X1, Lbound, Ubound); if Iter >= FirstSavedSim then begin { Save simulated vector into column K of matrix Xmat } CopyColFromVector(Xmat, X1, Lbound, Ubound, K); Inc(K); end; if F1 < F_min then begin { Update minimum } CopyVector(X_min, X1, Lbound, Ubound); F_min := F1; end; F := F1; Inc(Iter); end; until Iter > MH_MaxSim; { Update mean vector and variance-covariance matrix } VecMean(Xmat, MH_SavedSim, Lbound, Ubound, X); MatVarCov(Xmat, MH_SavedSim, Lbound, Ubound, X, V); DelVector(X1, Ubound); DelMatrix(L, Ubound, Ubound); end; function Hastings(Func : TFuncNVar; T : Float; X : PVector; V : PMatrix; Lbound, Ubound : Integer; Xmat : PMatrix; X_min : PVector; var F_min : Float) : Integer; var K, ErrCode : Integer; Indep : Boolean; begin { Initialize the Marsaglia random number generator using the standard Pascal generator } Randomize; RMarIn(System.Random(10000), System.Random(10000)); K := 1; Indep := True; F_min := MAXNUM; repeat ErrCode := HastingsCycle(Func, T, X, V, Lbound, Ubound, Indep, Xmat, X_min, F_min); Indep := False; Inc(K); until (ErrCode <> 0) or (K > MH_NCycles); Hastings := ErrCode; end; end.mricron-0.20120505.1~dfsg.1.orig/npm/dmath/Matrices.pas0000664000175000017500000016202311326434466022030 0ustar michaelmichael{ ********************************************************************** * Unit MATRICES.PAS * * Version 2.0 * * (c) J. Debord, May 2001 * ********************************************************************** This unit implements dynamic allocation of vectors and matrices in Pascal, together with various matrix operations. Dynamic allocation is allowed by declaring arrays as pointers. There are 8 types available : PVector, PMatrix for floating point arrays PIntVector, PIntMatrix for integer arrays PBoolVector, PBoolMatrix for boolean arrays PStrVector, PStrMatrix for string arrays (255 char.) To use these arrays in your programs, you must : (1) Declare variables of the appropriate type, e.g. var V : PVector; A : PMatrix; (2) Allocate each array BEFORE using it : DimVector(V, N); creates vector V[0..N] DimMatrix(A, N, M); creates matrix A[0..N, 0..M] where N, M are two integer variables If the allocation succeeds, all array elements are initialized to zero (for numeric arrays), False (for boolean arrays), or the null string (for string arrays). Otherwise, the pointer is initialized to NIL. (3) Use arrays as in standard Turbo Pascal, with the following exceptions : (a) You must use the indirection operator (^) to reference any array element, i.e. write V^[I] and A^[I]^[J] instead of V[I] and A[I,J]. (b) You cannot use the assignment operator (:=) to copy the contents of an array into another array. Writing B := A simply makes B point to the same memory block than A. You must use one of the provided Copy... procedures (see their documentation in the interface part of the unit). In addition, note that : (a) All arrays begin at index 0, so that the 0-indexed element is always present, even if you don't use it. (b) A matrix is declared as an array of vectors, so that A^[I] denotes the I-th vector of matrix A and may be used as any vector. (4) Deallocate arrays when you no longer need them. This will free the corresponding memory : DelVector(V, N); DelMatrix(A, N, M); For more information, read the comments of each routine in the interface part of the unit, and check the demo programs. ********************************************************************** References : 1) 'Basic Programs for Scientists and Engineers' by A.R. Miller : GaussJordan, InvMat 2) Borland's Numerical Methods Toolbox : Det 3) 'Numerical Recipes' by Press et al. : Cholesky, LU, SVD 4) 'Matrix Computations' by Golub & Van Loan : QR_Decomp & QR_Solve (Pascal implementation contributed by Mark Vaughan) ********************************************************************** } unit Matrices; interface uses FMath,dialogs,sysutils; { ********************************************************************** This section defines some error codes. ********************************************************************** } const MAT_OK = 0; { No error } MAT_SINGUL = - 1; { Singular matrix } MAT_NON_CONV = - 2; { Non convergence of iterative procedure } MAT_NOT_PD = - 3; { Matrix not positive definite } { ********************************************************************** This section defines the vector and matrix types. Maximal sizes are given for a 16-bit compiler (TP / BP / Delphi 1). Higher values may be used with the 32-bit compilers (Delphi 2-4, FPK, GPC). ********************************************************************** } const {$IFDEF EXTENDEDREAL} MAX_FLT = 6552; { Max size of real vector } {$ELSE} {$IFDEF SINGLEREAL} MAX_FLT = 16382; {$ELSE} {$IFDEF PASCALREAL} MAX_FLT = 10921; {$ELSE} {$DEFINE DOUBLEREAL} MAX_FLT = 8190; {$ENDIF} {$ENDIF} {$ENDIF} MAX_INT = 16382; { Max size of integer vector } MAX_BOOL = 32766; { Max size of boolean vector } MAX_STR = 254; { Max size of string vector } MAX_VEC = 16382; { Max number of vectors in a matrix } type Str255= string[255]; TVector = array[0..MAX_FLT] of Float; TIntVector = array[0..MAX_INT] of Integer; TBoolVector = array[0..MAX_BOOL] of Boolean; TStrVector = array[0..MAX_STR] of Str255; PVector = ^TVector; PIntVector = ^TIntVector; PBoolVector = ^TBoolVector; PStrVector = ^TStrVector; TMatrix = array[0..MAX_VEC] of PVector; TIntMatrix = array[0..MAX_VEC] of PIntVector; TBoolMatrix = array[0..MAX_VEC] of PBoolVector; TStrMatrix = array[0..MAX_VEC] of PStrVector; PMatrix = ^TMatrix; PIntMatrix = ^TIntMatrix; PBoolMatrix = ^TBoolMatrix; PStrMatrix = ^TStrMatrix; { ********************************************************************** Memory allocation routines ********************************************************************** } procedure DimVector(var V : PVector; Ubound : Integer); { ---------------------------------------------------------------------- Creates floating point vector V[0..Ubound] ---------------------------------------------------------------------- } procedure DimIntVector(var V : PIntVector; Ubound : Integer); { ---------------------------------------------------------------------- Creates integer vector V[0..Ubound] ---------------------------------------------------------------------- } procedure DimBoolVector(var V : PBoolVector; Ubound : Integer); { ---------------------------------------------------------------------- Creates boolean vector V[0..Ubound] ---------------------------------------------------------------------- } procedure DimStrVector(var V : PStrVector; Ubound : Integer); { ---------------------------------------------------------------------- Creates string vector V[0..Ubound] ---------------------------------------------------------------------- } procedure DimMatrix(var A : PMatrix; Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Creates floating point matrix A[0..Ubound1, 0..Ubound2] ---------------------------------------------------------------------- } procedure DimIntMatrix(var A : PIntMatrix; Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Creates integer matrix A[0..Ubound1, 0..Ubound2] ---------------------------------------------------------------------- } procedure DimBoolMatrix(var A : PBoolMatrix; Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Creates boolean matrix A[0..Ubound1, 0..Ubound2] ---------------------------------------------------------------------- } procedure DimStrMatrix(var A : PStrMatrix; Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Creates string matrix A[0..Ubound1, 0..Ubound2] ---------------------------------------------------------------------- } { ********************************************************************** Memory deallocation routines ********************************************************************** } procedure DelVector(var V : PVector; Ubound : Integer); { ---------------------------------------------------------------------- Deletes floating point vector V[0..Ubound] ---------------------------------------------------------------------- } procedure DelIntVector(var V : PIntVector; Ubound : Integer); { ---------------------------------------------------------------------- Deletes integer vector V[0..Ubound] ---------------------------------------------------------------------- } procedure DelBoolVector(var V : PBoolVector; Ubound : Integer); { ---------------------------------------------------------------------- Deletes boolean vector V[0..Ubound] ---------------------------------------------------------------------- } procedure DelStrVector(var V : PStrVector; Ubound : Integer); { ---------------------------------------------------------------------- Deletes string vector V[0..Ubound] ---------------------------------------------------------------------- } procedure DelMatrix(var A : PMatrix; Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Deletes floating point matrix A[0..Ubound1, 0..Ubound2] ---------------------------------------------------------------------- } procedure DelIntMatrix(var A : PIntMatrix; Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Deletes integer matrix A[0..Ubound1, 0..Ubound2] ---------------------------------------------------------------------- } procedure DelBoolMatrix(var A : PBoolMatrix; Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Deletes boolean matrix A[0..Ubound1, 0..Ubound2] ---------------------------------------------------------------------- } procedure DelStrMatrix(var A : PStrMatrix; Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Deletes string matrix A[0..Ubound1, 0..Ubound2] ---------------------------------------------------------------------- } { ********************************************************************** Routines for copying vectors and matrices ---------------------------------------------------------------------- Lbound, Ubound : indices of first and last vector elements Lbound1, Lbound2 : indices of first matrix element in each dimension Ubound1, Ubound2 : indices of last matrix element in each dimension ********************************************************************** } procedure SwapRows(I, K : Integer; A : PMatrix; Lbound, Ubound : Integer); { ---------------------------------------------------------------------- Exchanges rows I and K of matrix A ---------------------------------------------------------------------- } procedure SwapCols(J, K : Integer; A : PMatrix; Lbound, Ubound : Integer); { ---------------------------------------------------------------------- Exchanges columns J and K of matrix A ---------------------------------------------------------------------- } procedure CopyVector(Dest, Source : PVector; Lbound, Ubound : Integer); { ---------------------------------------------------------------------- Copies vector Source into vector Dest ---------------------------------------------------------------------- } procedure CopyMatrix(Dest, Source : PMatrix; Lbound1, Lbound2, Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Copies matrix Source into matrix Dest ---------------------------------------------------------------------- } procedure CopyRowFromVector(Dest : PMatrix; Source : PVector; Lbound, Ubound, Row : Integer); { ---------------------------------------------------------------------- Copies vector Source into line Row of matrix Dest ---------------------------------------------------------------------- } procedure CopyColFromVector(Dest : PMatrix; Source : PVector; Lbound, Ubound, Col : Integer); { ---------------------------------------------------------------------- Copies vector Source into column Col of matrix Dest ---------------------------------------------------------------------- } procedure CopyVectorFromRow(Dest : PVector; Source : PMatrix; Lbound, Ubound, Row : Integer); { ---------------------------------------------------------------------- Copies line Row of matrix Source into vector Dest ---------------------------------------------------------------------- } procedure CopyVectorFromCol(Dest : PVector; Source : PMatrix; Lbound, Ubound, Col : Integer); { ---------------------------------------------------------------------- Copies column Col of matrix Source into vector Dest ---------------------------------------------------------------------- } { ********************************************************************** Vector and matrix functions ********************************************************************** } function Min(X : PVector; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Returns the lowest value of vector X ---------------------------------------------------------------------- } function Max(X : PVector; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Returns the highest value of vector X ---------------------------------------------------------------------- } function IntMin(X : PIntVector; Lbound, Ubound : Integer) : Integer; { ---------------------------------------------------------------------- Returns the lowest value of integer vector X ---------------------------------------------------------------------- } function IntMax(X : PIntVector; Lbound, Ubound : Integer) : Integer; { ---------------------------------------------------------------------- Returns the highest value of integer vector X ---------------------------------------------------------------------- } procedure Transpose(A : PMatrix; Lbound1, Lbound2, Ubound1, Ubound2 : Integer; A_t : PMatrix); { ---------------------------------------------------------------------- Transposes a matrix ---------------------------------------------------------------------- Input parameters : A = original matrix Lbound1, Lbound2 = indices of 1st matrix elem. in each dim. Ubound1, Ubound2 = indices of last matrix elem. in each dim. ---------------------------------------------------------------------- Output parameter : A_t = transposed matrix ---------------------------------------------------------------------- } function GaussJordan(A : PMatrix; B : PVector; Lbound, Ubound : Integer; A_inv : PMatrix; X : PVector) : Integer; { ---------------------------------------------------------------------- Solves a system of linear equations by the Gauss-Jordan method ---------------------------------------------------------------------- Input parameters : A = system matrix B = constant vector Lbound = index of first matrix element Ubound = index of last matrix element ---------------------------------------------------------------------- Output parameters : A_inv = inverse matrix X = solution vector ---------------------------------------------------------------------- Possible results : MAT_OK MAT_SINGUL ---------------------------------------------------------------------- } function InvMat(A : PMatrix; Lbound, Ubound : Integer; A_inv : PMatrix) : Integer; { ---------------------------------------------------------------------- Computes the inverse of a square matrix by the Gauss-Jordan method ---------------------------------------------------------------------- Parameters : as in Gauss-Jordan ---------------------------------------------------------------------- Possible results : MAT_OK MAT_SINGUL ---------------------------------------------------------------------- } function Det(A : PMatrix; Lbound, Ubound : Integer) : Float; { ---------------------------------------------------------------------- Computes the determinant of a square matrix ---------------------------------------------------------------------- Parameters : as in Gauss-Jordan ---------------------------------------------------------------------- NB : This procedure destroys the original matrix A ---------------------------------------------------------------------- } function Cholesky(A : PMatrix; Lbound, Ubound : Integer; L : PMatrix) : Integer; { ---------------------------------------------------------------------- Cholesky decomposition. Factors the symmetric positive definite matrix A as a product L * L', where L is a lower triangular matrix. This procedure may be used as a test of positive definiteness. ---------------------------------------------------------------------- Input parameters : A = matrix Lbound = index of first matrix element Ubound = index of last matrix element ---------------------------------------------------------------------- Output parameter : L = Cholesky factor of matrix A ---------------------------------------------------------------------- Possible results : MAT_OK MAT_NOT_PD ---------------------------------------------------------------------- } function LU_Decomp(A : PMatrix; Lbound, Ubound : Integer) : Integer; { ---------------------------------------------------------------------- LU decomposition. Factors the square matrix A as a product L * U, where L is a lower triangular matrix (with unit diagonal terms) and U is an upper triangular matrix. This routine is used in conjunction with LU_Solve to solve a system of equations. ---------------------------------------------------------------------- Input parameters : A = matrix Lbound = index of first matrix element Ubound = index of last matrix element ---------------------------------------------------------------------- Output parameter : A = contains the elements of L and U ---------------------------------------------------------------------- Possible results : MAT_OK MAT_SINGUL ---------------------------------------------------------------------- NB : This procedure destroys the original matrix A ---------------------------------------------------------------------- } procedure LU_Solve(A : PMatrix; B : PVector; Lbound, Ubound : Integer; X : PVector); { ---------------------------------------------------------------------- Solves a system of equations whose matrix has been transformed by LU_Decomp ---------------------------------------------------------------------- Input parameters : A = result from LU_Decomp B = constant vector Lbound, Ubound = as in LU_Decomp ---------------------------------------------------------------------- Output parameter : X = solution vector ---------------------------------------------------------------------- } function SV_Decomp(A : PMatrix; Lbound, Ubound1, Ubound2 : Integer; S : PVector; V : PMatrix) : Integer; { ---------------------------------------------------------------------- Singular value decomposition. Factors the matrix A (n x m, with n >= m) as a product U * S * V' where U is a (n x m) column-orthogonal matrix, S a (m x m) diagonal matrix with elements >= 0 (the singular values) and V a (m x m) orthogonal matrix. This routine is used in conjunction with SV_Solve to solve a system of equations. ---------------------------------------------------------------------- Input parameters : A = matrix Lbound = index of first matrix element Ubound1 = index of last matrix element in 1st dim. Ubound2 = index of last matrix element in 2nd dim. ---------------------------------------------------------------------- Output parameter : A = contains the elements of U S = vector of singular values V = orthogonal matrix ---------------------------------------------------------------------- Possible results : MAT_OK MAT_NON_CONV ---------------------------------------------------------------------- NB : This procedure destroys the original matrix A ---------------------------------------------------------------------- } procedure SV_SetZero(S : PVector; Lbound, Ubound : Integer; Tol : Float); { ---------------------------------------------------------------------- Sets the singular values to zero if they are lower than a specified threshold. ---------------------------------------------------------------------- Input parameters : S = vector of singular values Tol = relative tolerance Threshold value will be Tol * Max(S) Lbound = index of first vector element Ubound = index of last vector element ---------------------------------------------------------------------- Output parameter : S = modified singular values ---------------------------------------------------------------------- } procedure SV_Solve(U : PMatrix; S : PVector; V : PMatrix; B : PVector; Lbound, Ubound1, Ubound2 : Integer; X : PVector); { ---------------------------------------------------------------------- Solves a system of equations by singular value decomposition, after the matrix has been transformed by SV_Decomp, and the lowest singular values have been set to zero by SV_SetZero. ---------------------------------------------------------------------- Input parameters : U, S, V = vector and matrices from SV_Decomp B = constant vector Lbound, Ubound1, Ubound2 = as in SV_Decomp ---------------------------------------------------------------------- Output parameter : X = solution vector = V * Diag(1/s(i)) * U' * B, for s(i) <> 0 ---------------------------------------------------------------------- } procedure SV_Approx(U : PMatrix; S : PVector; V : PMatrix; Lbound, Ubound1, Ubound2 : Integer; A : PMatrix); { ---------------------------------------------------------------------- Approximates a matrix A by the product USV', after the lowest singular values have been set to zero by SV_SetZero. ---------------------------------------------------------------------- Input parameters : U, S, V = vector and matrices from SV_Decomp Lbound, Ubound1, Ubound2 = as in SV_Decomp ---------------------------------------------------------------------- Output parameter : A = approximated matrix ---------------------------------------------------------------------- } function QR_Decomp(A : PMatrix; Lbound, Ubound1, Ubound2 : Integer; R : PMatrix) : Integer; { ---------------------------------------------------------------------- QR decomposition. Factors the matrix A (n x m, with n >= m) as a product Q * R where Q is a (n x m) column-orthogonal matrix, and R a (m x m) upper triangular matrix. This routine is used in conjunction with QR_Solve to solve a system of equations. ---------------------------------------------------------------------- Input parameters : A = matrix Lbound = index of first matrix element Ubound1 = index of last matrix element in 1st dim. Ubound2 = index of last matrix element in 2nd dim. ---------------------------------------------------------------------- Output parameter : A = contains the elements of Q R = upper triangular matrix ---------------------------------------------------------------------- Possible results : MAT_OK MAT_SING ---------------------------------------------------------------------- NB : This procedure destroys the original matrix A ---------------------------------------------------------------------- } procedure QR_Solve(Q, R : PMatrix; B : PVector; Lbound, Ubound1, Ubound2 : Integer; X : PVector); { ---------------------------------------------------------------------- Solves a system of equations by the QR decomposition, after the matrix has been transformed by QR_Decomp. ---------------------------------------------------------------------- Input parameters : Q, R = matrices from QR_Decomp B = constant vector Lbound, Ubound1, Ubound2 = as in QR_Decomp ---------------------------------------------------------------------- Output parameter : X = solution vector ---------------------------------------------------------------------- } implementation const { Used by LU procedures } LastDim : Integer = 1; { Dimension of the last system solved } Index : PIntVector = nil; { Records the row permutations } procedure DimVector(var V : PVector; Ubound : Integer); var I : Integer; begin { Check bounds } if (Ubound < 0) or (Ubound > MAX_FLT) then begin V := nil; Exit; end; { Allocate vector } GetMem(V, Succ(Ubound) * SizeOf(Float)); if V = nil then Exit; { Initialize vector } for I := 0 to Ubound do V^[I] := 0.0; end; procedure DimIntVector(var V : PIntVector; Ubound : Integer); var I : Integer; begin { Check bounds } if (Ubound < 0) or (Ubound > MAX_INT) then begin V := nil; Exit; end; { Allocate vector } GetMem(V, Succ(Ubound) * SizeOf(Integer)); if V = nil then Exit; { Initialize vector } for I := 0 to Ubound do V^[I] := 0; end; procedure DimBoolVector(var V : PBoolVector; Ubound : Integer); var I : Integer; begin { Check bounds } if (Ubound < 0) or (Ubound > MAX_BOOL) then begin V := nil; Exit; end; { Allocate vector } GetMem(V, Succ(Ubound) * SizeOf(Boolean)); if V = nil then Exit; { Initialize vector } for I := 0 to Ubound do V^[I] := False; end; procedure DimStrVector(var V : PStrVector; Ubound : Integer); var I : Integer; begin { Check bounds } if (Ubound < 0) or (Ubound > MAX_STR) then begin showmessage('DIMstr error'); V := nil; Exit; end; { Allocate vector } GetMem(V, Succ(Ubound) * sizeof(TStrVector) {256}); if V = nil then Exit; { Initialize vector } for I := 0 to Ubound do V^[I] := ''; //showmessage(inttostr(Ubound)+'b'+inttostr(MAX_STR)); end; procedure DimMatrix(var A : PMatrix; Ubound1, Ubound2 : Integer); var I, J : Integer; RowSize : Word; begin if (Ubound1 < 0) or (Ubound1 > MAX_VEC) or (Ubound2 < 0) or (Ubound2 > MAX_FLT) then begin A := nil; Exit; end; { Allocate matrix } GetMem(A, Succ(Ubound1) * SizeOf(PVector)); if A = nil then Exit; { Size of a row } RowSize := Succ(Ubound2) * SizeOf(Float); { Allocate each row } for I := 0 to Ubound1 do begin GetMem(A^[I], RowSize); if A^[I] = nil then begin A := nil; Exit; end; end; { Initialize matrix } for I := 0 to Ubound1 do for J := 0 to Ubound2 do A^[I]^[J] := 0.0; end; procedure DimIntMatrix(var A : PIntMatrix; Ubound1, Ubound2 : Integer); var I, J : Integer; RowSize : Word; begin { Check bounds } if (Ubound1 < 0) or (Ubound1 > MAX_VEC) or (Ubound2 < 0) or (Ubound2 > MAX_INT) then begin A := nil; Exit; end; { Allocate matrix } GetMem(A, Succ(Ubound1) * SizeOf(PIntVector)); if A = nil then Exit; { Size of a row } RowSize := Succ(Ubound2) * SizeOf(Integer); { Allocate each row } for I := 0 to Ubound1 do begin GetMem(A^[I], RowSize); if A^[I] = nil then begin A := nil; Exit; end; end; { Initialize matrix } for I := 0 to Ubound1 do for J := 0 to Ubound2 do A^[I]^[J] := 0; end; procedure DimBoolMatrix(var A : PBoolMatrix; Ubound1, Ubound2 : Integer); var I, J : Integer; RowSize : Word; begin { Check bounds } if (Ubound1 < 0) or (Ubound1 > MAX_VEC) or (Ubound2 < 0) or (Ubound2 > MAX_BOOL) then begin A := nil; Exit; end; { Allocate matrix } GetMem(A, Succ(Ubound1) * SizeOf(PBoolVector)); if A = nil then Exit; { Size of a row } RowSize := Succ(Ubound2) * SizeOf(Boolean); { Allocate each row } for I := 0 to Ubound1 do begin GetMem(A^[I], RowSize); if A^[I] = nil then begin A := nil; Exit; end; end; { Initialize matrix } for I := 0 to Ubound1 do for J := 0 to Ubound2 do A^[I]^[J] := False; end; procedure DimStrMatrix(var A : PStrMatrix; Ubound1, Ubound2 : Integer); var I, J : Integer; RowSize : Word; begin { Check bounds } if (Ubound1 < 0) or (Ubound1 > MAX_VEC) or (Ubound2 < 0) or (Ubound2 > MAX_STR) then begin A := nil; Exit; end; { Allocate matrix } GetMem(A, Succ(Ubound1) * SizeOf(PStrVector)); if A = nil then Exit; { Size of a row } RowSize := Succ(Ubound2) * 256; { Allocate each row } for I := 0 to Ubound1 do begin GetMem(A^[I], RowSize); if A^[I] = nil then begin A := nil; Exit; end; end; { Initialize matrix } for I := 0 to Ubound1 do for J := 0 to Ubound2 do A^[I]^[J] := ''; end; procedure DelVector(var V : PVector; Ubound : Integer); begin if V <> nil then begin FreeMem(V, Succ(Ubound) * SizeOf(Float)); V := nil; end; end; procedure DelIntVector(var V : PIntVector; Ubound : Integer); begin if V <> nil then begin FreeMem(V, Succ(Ubound) * SizeOf(Integer)); V := nil; end; end; procedure DelBoolVector(var V : PBoolVector; Ubound : Integer); begin if V <> nil then begin FreeMem(V, Succ(Ubound) * SizeOf(Boolean)); V := nil; end; end; procedure DelStrVector(var V : PStrVector; Ubound : Integer); begin if V <> nil then begin FreeMem(V{, Succ(Ubound) * 256}); V := nil; end; end; procedure DelMatrix(var A : PMatrix; Ubound1, Ubound2 : Integer); var I : Integer; RowSize : Word; begin if A <> nil then begin RowSize := Succ(Ubound2) * SizeOf(Float); for I := Ubound1 downto 0 do FreeMem(A^[I], RowSize); FreeMem(A, Succ(Ubound1) * SizeOf(PVector)); A := nil; end; end; procedure DelIntMatrix(var A : PIntMatrix; Ubound1, Ubound2 : Integer); var I : Integer; RowSize : Word; begin if A <> nil then begin RowSize := Succ(Ubound2) * SizeOf(Integer); for I := Ubound1 downto 0 do FreeMem(A^[I], RowSize); FreeMem(A, Succ(Ubound1) * SizeOf(PIntVector)); A := nil; end; end; procedure DelBoolMatrix(var A : PBoolMatrix; Ubound1, Ubound2 : Integer); var I : Integer; RowSize : Word; begin if A <> nil then begin RowSize := Succ(Ubound2) * SizeOf(Boolean); for I := Ubound1 downto 0 do FreeMem(A^[I], RowSize); FreeMem(A, Succ(Ubound1) * SizeOf(PBoolVector)); A := nil; end; end; procedure DelStrMatrix(var A : PStrMatrix; Ubound1, Ubound2 : Integer); var I : Integer; RowSize : Word; begin if A <> nil then begin RowSize := Succ(Ubound2) * 256; for I := Ubound1 downto 0 do FreeMem(A^[I], RowSize); FreeMem(A, Succ(Ubound1) * SizeOf(PStrVector)); A := nil; end; end; procedure SwapRows(I, K : Integer; A : PMatrix; Lbound, Ubound : Integer); var J : Integer; begin for J := Lbound to Ubound do FSwap(A^[I]^[J], A^[K]^[J]); end; procedure SwapCols(J, K : Integer; A : PMatrix; Lbound, Ubound : Integer); var I : Integer; begin for I := Lbound to Ubound do FSwap(A^[I]^[J], A^[I]^[K]); end; procedure CopyVector(Dest, Source : PVector; Lbound, Ubound : Integer); var I : Integer; begin for I := Lbound to Ubound do Dest^[I] := Source^[I]; end; procedure CopyMatrix(Dest, Source : PMatrix; Lbound1, Lbound2, Ubound1, Ubound2 : Integer); var I, J : Integer; begin for I := Lbound1 to Ubound1 do for J := Lbound2 to Ubound2 do Dest^[I]^[J] := Source^[I]^[J]; end; procedure CopyRowFromVector(Dest : PMatrix; Source : PVector; Lbound, Ubound, Row : Integer); var J : Integer; begin for J := Lbound to Ubound do Dest^[Row]^[J] := Source^[J]; end; procedure CopyColFromVector(Dest : PMatrix; Source : PVector; Lbound, Ubound, Col : Integer); var I : Integer; begin for I := Lbound to Ubound do Dest^[I]^[Col] := Source^[I]; end; procedure CopyVectorFromRow(Dest : PVector; Source : PMatrix; Lbound, Ubound, Row : Integer); var J : Integer; begin for J := Lbound to Ubound do Dest^[J] := Source^[Row]^[J]; end; procedure CopyVectorFromCol(Dest : PVector; Source : PMatrix; Lbound, Ubound, Col : Integer); var I : Integer; begin for I := Lbound to Ubound do Dest^[I] := Source^[I]^[Col]; end; function Min(X : PVector; Lbound, Ubound : Integer) : Float; var Xmin : Float; I : Integer; begin Xmin := X^[Lbound]; for I := Succ(Lbound) to Ubound do if X^[I] < Xmin then Xmin := X^[I]; Min := Xmin; end; function Max(X : PVector; Lbound, Ubound : Integer) : Float; var Xmax : Float; I : Integer; begin Xmax := X^[Lbound]; for I := Succ(Lbound) to Ubound do if X^[I] > Xmax then Xmax := X^[I]; Max := Xmax; end; function IntMin(X : PIntVector; Lbound, Ubound : Integer) : Integer; var I, Xmin : Integer; begin Xmin := X^[Lbound]; for I := Succ(Lbound) to Ubound do if X^[I] < Xmin then Xmin := X^[I]; IntMin := Xmin; end; function IntMax(X : PIntVector; Lbound, Ubound : Integer) : Integer; var I, Xmax : Integer; begin Xmax := X^[Lbound]; for I := Succ(Lbound) to Ubound do if X^[I] > Xmax then Xmax := X^[I]; IntMax := Xmax; end; procedure Transpose(A : PMatrix; Lbound1, Lbound2, Ubound1, Ubound2 : Integer; A_t : PMatrix); var I, J : Integer; begin for I := Lbound1 to Ubound1 do for J := Lbound2 to Ubound2 do A_t^[J]^[I] := A^[I]^[J]; end; function GaussJordan(A : PMatrix; B : PVector; Lbound, Ubound : Integer; A_inv : PMatrix; X : PVector) : Integer; var I, J, K : Integer; Pvt, T : Float; PRow, PCol : PIntVector; { Store line and column of pivot } begin DimIntVector(PRow, Ubound); DimIntVector(PCol, Ubound); { Copy A into A_inv and B into X } CopyMatrix(A_inv, A, Lbound, Lbound, Ubound, Ubound); CopyVector(X, B, Lbound, Ubound); K := Lbound; while K <= Ubound do begin { Search for largest pivot in submatrix A_inv[K..Ubound, K..Ubound] } Pvt := A_inv^[K]^[K]; PRow^[K] := K; PCol^[K] := K; for I := K to Ubound do for J := K to Ubound do if Abs(A_inv^[I]^[J]) > Abs(Pvt) then begin Pvt := A_inv^[I]^[J]; PRow^[K] := I; PCol^[K] := J; end; { Pivot too weak ==> quasi-singular matrix } if Abs(Pvt) < MACHEP then begin DelIntVector(PRow, Ubound); DelIntVector(PCol, Ubound); GaussJordan := MAT_SINGUL; Exit; end; { Exchange current row (K) with pivot row } if PRow^[K] <> K then begin SwapRows(PRow^[K], K, A_inv, Lbound, Ubound); FSwap(X^[PRow^[K]], X^[K]); end; { Exchange current column (K) with pivot column } if PCol^[K] <> K then SwapCols(PCol^[K], K, A_inv, Lbound, Ubound); { Transform pivot row } A_inv^[K]^[K] := 1.0; for J := Lbound to Ubound do A_inv^[K]^[J] := A_inv^[K]^[J] / Pvt; X^[K] := X^[K] / Pvt; { Transform other rows } for I := Lbound to Ubound do if I <> K then begin T := A_inv^[I]^[K]; A_inv^[I]^[K] := 0.0; for J := Lbound to Ubound do A_inv^[I]^[J] := A_inv^[I]^[J] - T * A_inv^[K]^[J]; X^[I] := X^[I] - T * X^[K]; end; Inc(K); end; { Rearrange inverse matrix } for I := Ubound downto Lbound do if PCol^[I] <> I then begin SwapRows(PCol^[I], I, A_inv, Lbound, Ubound); FSwap(X^[PCol^[I]], X^[I]); end; for J := Ubound downto Lbound do if PRow^[J] <> J then SwapCols(PRow^[J], J, A_inv, Lbound, Ubound); DelIntVector(PRow, Ubound); DelIntVector(PCol, Ubound); GaussJordan := MAT_OK; end; function InvMat(A : PMatrix; Lbound, Ubound : Integer; A_inv : PMatrix) : Integer; var I, J, K : Integer; Pvt, T : Float; PRow, PCol : PIntVector; { Store line and column of pivot } begin DimIntVector(PRow, Ubound); DimIntVector(PCol, Ubound); { Copy A into A_inv } CopyMatrix(A_inv, A, Lbound, Lbound, Ubound, Ubound); K := Lbound; while K <= Ubound do begin { Search for largest pivot in submatrix A_inv[K..Ubound, K..Ubound] } Pvt := A_inv^[K]^[K]; PRow^[K] := K; PCol^[K] := K; for I := K to Ubound do for J := K to Ubound do if Abs(A_inv^[I]^[J]) > Abs(Pvt) then begin Pvt := A_inv^[I]^[J]; PRow^[K] := I; PCol^[K] := J; end; { Pivot too weak ==> quasi-singular matrix } if Abs(Pvt) < MACHEP then begin DelIntVector(PRow, Ubound); DelIntVector(PCol, Ubound); InvMat := MAT_SINGUL; Exit; end; { Exchange current row (K) with pivot row } if PRow^[K] <> K then SwapRows(PRow^[K], K, A_inv, Lbound, Ubound); { Exchange current column (K) with pivot column } if PCol^[K] <> K then SwapCols(PCol^[K], K, A_inv, Lbound, Ubound); { Transform pivot row } A_inv^[K]^[K] := 1.0; for J := Lbound to Ubound do A_inv^[K]^[J] := A_inv^[K]^[J] / Pvt; { Transform other rows } for I := Lbound to Ubound do if I <> K then begin T := A_inv^[I]^[K]; A_inv^[I]^[K] := 0.0; for J := Lbound to Ubound do A_inv^[I]^[J] := A_inv^[I]^[J] - T * A_inv^[K]^[J]; end; Inc(K); end; { Rearrange inverse matrix } for I := Ubound downto Lbound do if PCol^[I] <> I then SwapRows(PCol^[I], I, A_inv, Lbound, Ubound); for J := Ubound downto Lbound do if PRow^[J] <> J then SwapCols(PRow^[J], J, A_inv, Lbound, Ubound); DelIntVector(PRow, Ubound); DelIntVector(PCol, Ubound); InvMat := MAT_OK; end; function Det(A : PMatrix; Lbound, Ubound : Integer) : Float; var D, T : Float; { Partial determinant & multiplier } I, J, K : Integer; { Loop variables } ZeroDet : Boolean; { Flags a null determinant } begin ZeroDet := False; D := 1.0; K := Lbound; { Make the matrix upper triangular } while not(ZeroDet) and (K < Ubound) do begin { If diagonal element is zero then switch rows } if Abs(A^[K]^[K]) < MACHEP then begin ZeroDet := True; I := K; { Try to find a row with a non-zero element in this column } while ZeroDet and (I < Ubound) do begin I := Succ(I); if Abs(A^[I]^[K]) > MACHEP then begin { Switch these two rows } SwapRows(I, K, A, Lbound, Ubound); ZeroDet := False; { Switching rows changes the sign of the determinant } D := - D; end; end; end; if not(ZeroDet) then for I := Succ(K) to Ubound do if Abs(A^[I]^[K]) > MACHEP then begin { Make the K element of this row zero } T := - A^[I]^[K] / A^[K]^[K]; for J := 1 to Ubound do A^[I]^[J] := A^[I]^[J] + T * A^[K]^[J]; end; D := D * A^[K]^[K]; { Multiply the diagonal term into D } Inc(K); end; if ZeroDet then Det := 0.0 else Det := D * A^[Ubound]^[Ubound]; end; function Cholesky(A : PMatrix; Lbound, Ubound : Integer; L : PMatrix) : Integer; var I, J, K : Integer; Sum : Float; begin for K := Lbound to Ubound do begin Sum := A^[K]^[K]; for J := Lbound to K - 1 do Sum := Sum - Sqr(L^[K]^[J]); if Sum <= 0.0 then begin Cholesky := MAT_NOT_PD; Exit; end; L^[K]^[K] := Sqrt(Sum); for I := K + 1 to Ubound do begin Sum := A^[I]^[K]; for J := Lbound to K - 1 do Sum := Sum - L^[I]^[J] * L^[K]^[J]; L^[I]^[K] := Sum / L^[K]^[K]; end; end; Cholesky := MAT_OK; end; function LU_Decomp(A : PMatrix; Lbound, Ubound : Integer) : Integer; const TINY = 1.0E-20; var I, Imax, J, K : Integer; Pvt, T, Sum : Float; V : PVector; begin DimVector(V, Ubound); { Reallocate Index } if Index <> nil then DelIntVector(Index, LastDim); DimIntVector(Index, Ubound); LastDim := Ubound; for I := Lbound to Ubound do begin Pvt := 0.0; for J := Lbound to Ubound do if Abs(A^[I]^[J]) > Pvt then Pvt := Abs(A^[I]^[J]); if Pvt < MACHEP then begin DelVector(V, Ubound); LU_Decomp := MAT_SINGUL; Exit; end; V^[I] := 1.0 / Pvt; end; for J := Lbound to Ubound do begin for I := Lbound to Pred(J) do begin Sum := A^[I]^[J]; for K := Lbound to Pred(I) do Sum := Sum - A^[I]^[K] * A^[K]^[J]; A^[I]^[J] := Sum; end; Pvt := 0.0; for I := J to Ubound do begin Sum := A^[I]^[J]; for K := Lbound to Pred(J) do Sum := Sum - A^[I]^[K] * A^[K]^[J]; A^[I]^[J] := Sum; T := V^[I] * Abs(Sum); if T > Pvt then begin Pvt := T; Imax := I; end; end; if J <> Imax then begin SwapRows(Imax, J, A, Lbound, Ubound); V^[Imax] := V^[J]; end; Index^[J] := Imax; if A^[J]^[J] = 0.0 then A^[J]^[J] := TINY; if J <> Ubound then begin T := 1.0 / A^[J]^[J]; for I := Succ(J) to Ubound do A^[I]^[J] := A^[I]^[J] * T; end; end; DelVector(V, Ubound); LU_Decomp := MAT_OK; end; procedure LU_Solve(A : PMatrix; B : PVector; Lbound, Ubound : Integer; X : PVector); var I, Ip, J, K : Integer; Sum : Float; begin K := Pred(Lbound); CopyVector(X, B, Lbound, Ubound); for I := Lbound to Ubound do begin Ip := Index^[I]; Sum := X^[Ip]; X^[Ip] := X^[I]; if K >= Lbound then for J := K to Pred(I) do Sum := Sum - A^[I]^[J] * X^[J] else if Sum <> 0.0 then K := I; X^[I] := Sum; end; for I := Ubound downto Lbound do begin Sum := X^[I]; if I < Ubound then for J := Succ(I) to Ubound do Sum := Sum - A^[I]^[J] * X^[J]; X^[I] := Sum / A^[I]^[I]; end; end; function SV_Decomp(A : PMatrix; Lbound, Ubound1, Ubound2 : Integer; S : PVector; V : PMatrix) : Integer; label 1, 2, 3; var I, Its, J, JJ, K, L, N : Integer; Anorm, C, F, G, H, Sum, Scale, T, X, Y, Z : Float; R : PVector; begin G := 0.0; Scale := 0.0; Anorm := 0.0; DimVector(R, Ubound2); for I := Lbound to Ubound2 do begin L := I + 1; R^[I] := Scale * G; G := 0.0; Sum := 0.0; Scale := 0.0; if I <= Ubound1 then begin for K := I to Ubound1 do Scale := Scale + Abs(A^[K]^[I]); if Scale <> 0.0 then begin for K := I to Ubound1 do begin A^[K]^[I] := A^[K]^[I] / Scale; Sum := Sum + A^[K]^[I] * A^[K]^[I]; end; F := A^[I]^[I]; G := - Sgn(F) * Sqrt(Sum); H := F * G - Sum; A^[I]^[I] := F - G; if I <> Ubound2 then begin for J := L to Ubound2 do begin Sum := 0.0; for K := I to Ubound1 do Sum := Sum + A^[K]^[I] * A^[K]^[J]; F := Sum / H; for K := I to Ubound1 do A^[K]^[J] := A^[K]^[J] + F * A^[K]^[I]; end; end; for K := I to Ubound1 do A^[K]^[I] := Scale * A^[K]^[I]; end; end; S^[I] := Scale * G; G := 0.0; Sum := 0.0; Scale := 0.0; if (I <= Ubound1) and (I <> Ubound2) then begin for K := L to Ubound2 do Scale := Scale + Abs(A^[I]^[K]); if Scale <> 0.0 then begin for K := L to Ubound2 do begin A^[I]^[K] := A^[I]^[K] / Scale; Sum := Sum + A^[I]^[K] * A^[I]^[K]; end; F := A^[I]^[L]; G := - Sgn(F) * Sqrt(Sum); H := F * G - Sum; A^[I]^[L] := F - G; for K := L to Ubound2 do R^[K] := A^[I]^[K] / H; if I <> Ubound1 then for J := L to Ubound1 do begin Sum := 0.0; for K := L to Ubound2 do Sum := Sum + A^[J]^[K] * A^[I]^[K]; for K := L to Ubound2 do A^[J]^[K] := A^[J]^[K] + Sum * R^[K]; end; for K := L to Ubound2 do A^[I]^[K] := Scale * A^[I]^[K]; end; end; Anorm := FMax(Anorm, Abs(S^[I]) + Abs(R^[I])); end; for I := Ubound2 downto Lbound do begin if I < Ubound2 then begin if G <> 0.0 then begin for J := L to Ubound2 do V^[J]^[I] := (A^[I]^[J] / A^[I]^[L]) / G; for J := L to Ubound2 do begin Sum := 0.0; for K := L to Ubound2 do Sum := Sum + A^[I]^[K] * V^[K]^[J]; for K := L to Ubound2 do V^[K]^[J] := V^[K]^[J] + Sum * V^[K]^[I]; end; end; for J := L to Ubound2 do begin V^[I]^[J] := 0.0; V^[J]^[I] := 0.0; end; end; V^[I]^[I] := 1.0; G := R^[I]; L := I; end; for I := Ubound2 downto Lbound do begin L := I + 1; G := S^[I]; if I < Ubound2 then for J := L to Ubound2 do A^[I]^[J] := 0.0; if G <> 0.0 then begin G := 1.0 / G; if I <> Ubound2 then for J := L to Ubound2 do begin Sum := 0.0; for K := L to Ubound1 do Sum := Sum + A^[K]^[I] * A^[K]^[J]; F := (Sum / A^[I]^[I]) * G; for K := I to Ubound1 do A^[K]^[J] := A^[K]^[J] + F * A^[K]^[I]; end; for J := I to Ubound1 do A^[J]^[I] := A^[J]^[I] * G; end else for J := I to Ubound1 do A^[J]^[I] := 0.0; A^[I]^[I] := A^[I]^[I] + 1.0; end; for K := Ubound2 downto Lbound do begin for Its := 1 to 30 do begin for L := K downto Lbound do begin N := L - 1; if (Abs(R^[L]) + Anorm) = Anorm then goto 2; if (Abs(S^[N]) + Anorm) = Anorm then goto 1; end; 1: T := 1.0; for I := L to K do begin F := T * R^[I]; if (Abs(F) + Anorm) <> Anorm then begin G := S^[I]; H := Pythag(F, G); S^[I] := H; H := 1.0 / H; C := G * H; T := - (F * H); for J := Lbound to Ubound1 do begin Y := A^[J]^[N]; Z := A^[J]^[I]; A^[J]^[N] := (Y * C) + (Z * T); A^[J]^[I] := - (Y * T) + (Z * C); end; end; end; 2: Z := S^[K]; if L = K then begin if Z < 0.0 then begin S^[K] := - Z; for J := Lbound to Ubound2 do V^[J]^[K] := - V^[J]^[K]; end; goto 3 end; if Its = 30 then begin DelVector(R, Ubound2); SV_Decomp := MAT_NON_CONV; Exit; end; X := S^[L]; N := K - 1; Y := S^[N]; G := R^[N]; H := R^[K]; F := ((Y - Z) * (Y + Z) + (G - H) * (G + H)) / (2.0 * H * Y); G := Pythag(F, 1.0); F := ((X - Z) * (X + Z) + H * ((Y / (F + Sgn(F) * Abs(G))) - H)) / X; C := 1.0; T := 1.0; for J := L to N do begin I := J + 1; G := R^[I]; Y := S^[I]; H := T * G; G := C * G; Z := Pythag(F, H); R^[J] := Z; C := F / Z; T := H / Z; F := (X * C) + (G * T); G := - (X * T) + (G * C); H := Y * T; Y := Y * C; for JJ := Lbound to Ubound2 do begin X := V^[JJ]^[J]; Z := V^[JJ]^[I]; V^[JJ]^[J] := (X * C) + (Z * T); V^[JJ]^[I] := - (X * T) + (Z * C); end; Z := Pythag(F, H); S^[J] := Z; if Z <> 0.0 then begin Z := 1.0 / Z; C := F * Z; T := H * Z; end; F := (C * G) + (T * Y); X := - (T * G) + (C * Y); for JJ := Lbound to Ubound1 do begin Y := A^[JJ]^[J]; Z := A^[JJ]^[I]; A^[JJ]^[J] := (Y * C) + (Z * T); A^[JJ]^[I] := - (Y * T) + (Z * C); end end; R^[L] := 0.0; R^[K] := F; S^[K] := X; end; 3: end; DelVector(R, Ubound2); SV_Decomp := MAT_OK; end; procedure SV_SetZero(S : PVector; Lbound, Ubound : Integer; Tol : Float); var Threshold : Float; I : Integer; begin Threshold := Tol * Max(S, Lbound, Ubound); for I := Lbound to Ubound do if S^[I] < Threshold then S^[I] := 0.0; end; procedure SV_Solve(U : PMatrix; S : PVector; V : PMatrix; B : PVector; Lbound, Ubound1, Ubound2 : Integer; X : PVector); var I, J, JJ : Integer; Sum : Float; Tmp : PVector; begin DimVector(Tmp, Ubound2); for J := Lbound to Ubound2 do begin Sum := 0.0; if S^[J] > 0.0 then begin for I := Lbound to Ubound1 do Sum := Sum + U^[I]^[J] * B^[I]; Sum := Sum / S^[J]; end; Tmp^[J] := Sum; end; for J := Lbound to Ubound2 do begin Sum := 0.0; for JJ := Lbound to Ubound2 do Sum := Sum + V^[J]^[JJ] * Tmp^[JJ]; X^[J] := Sum; end; DelVector(Tmp, Ubound2); end; procedure SV_Approx(U : PMatrix; S : PVector; V : PMatrix; Lbound, Ubound1, Ubound2 : Integer; A : PMatrix); var I, J, K : Integer; begin for I := Lbound to Ubound1 do for J := Lbound to Ubound2 do begin A^[I]^[J] := 0.0; for K := Lbound to Ubound2 do if S^[K] > 0.0 then A^[I]^[J] := A^[I]^[J] + U^[I]^[K] * V^[J]^[K]; end; end; function QR_Decomp(A : PMatrix; Lbound, Ubound1, Ubound2 : Integer; R : PMatrix) : Integer; var I, J, K : Integer; Sum : Float; begin for K := Lbound to Ubound2 do begin { Compute the "k"th diagonal entry in R } Sum := 0.0; for I := Lbound to Ubound1 do Sum := Sum + Sqr(A^[I]^[K]); if Sum = 0.0 then begin QR_Decomp := MAT_SINGUL; Exit; end; R^[K]^[K] := Sqrt(Sum); { Divide the entries in the "k"th column of A by the computed "k"th } { diagonal element of R. this begins the process of overwriting A } { with Q . . . } for I := Lbound to Ubound1 do A^[I]^[K] := A^[I]^[K] / R^[K]^[K]; for J := (K + 1) to Ubound2 do begin { Complete the remainder of the row entries in R } Sum := 0.0; for I := Lbound to Ubound1 do Sum := Sum + A^[I]^[K] * A^[I]^[J]; R^[K]^[J] := Sum; { Update the column entries of the Q/A matrix } for I := Lbound to Ubound1 do A^[I]^[J] := A^[I]^[J] - A^[I]^[K] * R^[K]^[J]; end; end; QR_Decomp := MAT_OK; end; procedure QR_Solve(Q, R : PMatrix; B : PVector; Lbound, Ubound1, Ubound2 : Integer; X : PVector); var I, J : Integer; Sum : Float; begin { Form Q'B and store the result in X } for J := Lbound to Ubound2 do begin X^[J] := 0.0; for I := Lbound to Ubound1 do X^[J] := X^[J] + Q^[I]^[J] * B^[I]; end; { Update X with the solution vector } X^[Ubound2] := X^[Ubound2] / R^[Ubound2]^[Ubound2]; for I := (Ubound2 - 1) downto Lbound do begin Sum := 0.0; for J := (I + 1) to Ubound2 do Sum := Sum + R^[I]^[J] * X^[J]; X^[I] := (X^[I] - Sum) / R^[I]^[I]; end; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/mathp2.inc0000664000175000017500000007002507140412440021425 0ustar michaelmichael{ ********************************************************************** * MATHP2.INC * ********************************************************************** Mathematical functions for TPMATH (Assembler version for Pentium II/III with FPC) ********************************************************************** } { Bibliotheque mathematique pour utilisation du coprocesseur flottant JD GAYRARD Sept. 95 ---------------------------------------------------------------------- Unite d'origine : MATH387.PAS, disponible dans MATHLIB2.ZIP (http://wcarchive.cdrom.com/pub/delphi_www/) Adapte aux pentiums II/III et complete par P. NOGARET (2000) ---------------------------------------------------------------------- } {***********************************************************************} {* function fexp(x : Float): Float;assembler; *} {***********************************************************************} {* Fonction d‚velopp‚e … partir du document de Agner Fog *} {* www.agner.org/assem *} {***********************************************************************} {* retourne e^x, par la methode e^x = 2^(x.log2(e)) *} {* 2^z = 2^f.2^i avec f = frac(z) and i = int(z) *} {* 2^f is computed with F2XM1, *} {* 2^i pourrait ˆtre calcul‚ avec FSCALE mais cette instruction *} {* est trŠs lente 56 micro-ops sur un pentium II *} {* pour la m‚thode utilis‚ pour calculer 2^i voir Agner Fog *} {***********************************************************************} {* st(0) st(1) *} {* log2(e) - *} {* x log2(e) *} {* z:=x.log2(e) - *} {* z - *} {* z - round(z) - *} {* 2^(z - round(z)) - 1 - *} {* 1 2^(z - round(z)) - 1 *} {* 2^(z - round(z)) - *} {* temp:=2^i 2^f:=2^(z - round(z)) *} {* e^x - *} {***********************************************************************} function fexp(x : Float): Float;assembler; var round_z : dword; temp : extended; asm FLDL2E FLD x FMULP FIST round_z MOV DWORD PTR [temp], 00000000H MOV DWORD PTR [temp+4],80000000H FISUB round_z MOV EAX, round_z ADD EAX, 00003FFFH MOV DWORD PTR [temp+8],EAX F2XM1 FLD1 FADDP FLD TBYTE PTR [temp] FMULP end ['eax']; {***********************************************************************} {* function fexp2(x : Float): Float; assembler; *} {***********************************************************************} {* Fonction d‚velopp‚e … partir du document de Agner Fog *} {* www.agner.org/assem *} {***********************************************************************} {* retourne 2^x par la methode 2^z = 2^f.2^i *} {* avec f = frac(z) and i = int(z) *} {* 2^f is computed with F2XM1, *} {* 2^i pourrait ˆtre calcul‚ avec FSCALE mais cette instruction *} {* est trŠs lente 56 micro-ops sur un pentium II *} {* pour la m‚thode utilis‚ pour calculer 2^i voir Agner Fog *} {***********************************************************************} {* st(0) st(1) *} {* x - *} {* z:=x - *} {* z - *} {* z - round(z) - *} {* 2^(z - round(z)) - 1 - *} {* 1 2^(z - round(z)) - 1 *} {* 2^(z - round(z)) - *} {* temp:=2^i 2^f:=2^(z - round(z)) *} {* e^x - *} {***********************************************************************} function fexp2(x : Float): Float; assembler; var round_z : dword; temp : extended; asm FLD x FIST round_z MOV DWORD PTR [temp], 00000000H MOV DWORD PTR [temp+4],80000000H FISUB round_z MOV EAX, round_z { round_zmax := 16384 } ADD EAX, 00003FFFH MOV DWORD PTR [temp+8],EAX F2XM1 FLD1 FADDP FLD TBYTE PTR [temp] FMULP end ['EAX']; {***********************************************************************} {* function fexp10(x : Float): Float; assembler; *} {***********************************************************************} {* Fonction d‚velopp‚e … partir du document de Agner Fog *} {* www.agner.org/assem *} {***********************************************************************} {* retourne 10^x, par la methode 10^x = 2^(x.log2(10)) *} {* 2^z = 2^f.2^i with f = frac(z) and i = int(z) *} {* 2^f is computed with F2XM1 *} {* 2^i pourrait ˆtre calcul‚ avec FSCALE mais cette instruction *} {* est trŠs lente 56 micro-ops sur un pentium II *} {* pour la m‚thode utilis‚ pour calculer 2^i voir Agner Fog *} {***********************************************************************} {* st(0) st(1) *} {* log2(10) - *} {* x log2(10) *} {* z:=x.log2(10) - *} {* z - *} {* z - round(z) - *} {* 2^(z - round(z)) - 1 - *} {* 1 2^(z - round(z)) - 1 *} {* 2^(z - round(z)) - *} {* temp:=2^i 2^f:=2^(z - round(z)) *} {* 10^x - *} {***********************************************************************} function fexp10(x : Float): Float; assembler; var round_z : dword; temp : extended; asm FLDL2T FLD X FMULP FIST round_z MOV DWORD PTR [temp], 00000000H MOV DWORD PTR [temp+4],80000000H FISUB round_z MOV EAX, round_z ADD EAX, 00003FFFH MOV DWORD PTR [temp+8],EAX F2XM1 FLD1 FADDP FLD TBYTE PTR [temp] FMULP end ['EAX']; function fln(x : Float): Float; assembler; { retourne le logarithme naturel de x, utilise la methode loge(x) = loge(2).log2(x) } { pas de verification du domaine de definition (x < 0) } asm { ST(0) ST(1) } FLDLN2 { ln(2) - } FLD X { x ln(2) } FYL2X { ln(2).log2(x) - } end; function flog2(x : Float): Float; assembler; { retourne le logarithme de base 2 de x } { pas de verification du domaine de definition (x < 0) } asm { ST(0) ST(1) } FLD1 { 1 - } FLD X { x 1 } FYL2X { log2(x) - } end; {***********************************************************************} {* function flog10(X : Float) : Float; *} {***********************************************************************} {* Compute a common (base 10) logarithm. If X is near 1.0, then we *} {* use the FYL2XP1 instruction instead of FYL2X. "Near" means between *} {* 1.0 and 1+Sqrt(2)/2. We use an approximation for Sqrt(2)/2, so we *} {* don't have to compute it. The exact value isn't important, since *} {* FYL2X works fine for values near the transition. *} {***********************************************************************} function flog10(x : Float): Float; assembler; const HalfSqrt2p1: Extended = 1.7071; asm fldlg2 { push Log2 } fld X { push X } fld1 { push 1.0 } fcomp ST(1) { if (X < 1.0) } jl @@1 { goto @@1 } fld HalfSqrt2p1 { push 1.707 } fcomp ST(1) { if (X > 1.707) } jg @@1 { goto @@1 } fld1 { X is small, so subtract 1.0 } fsubrp { X := X - 1.0 } fyl2xp1 { Log10(2) * Log2(X+1) } jmp @@2 @@1: { X is not near 1.0 } fyl2x { Log10(2) * Log2(X) } @@2: end; {***********************************************************************} {* function fsin(X : Float) : Float; *} {***********************************************************************} {* if x < pi.2^62, then C2 is set to 0 and ST = sin(x) *} {* else C2 is set to 1 and ST = x *} {* no check range validity is performed in this function *} {***********************************************************************} function fsin(X : Float) : Float; assembler; asm FLD x fsin end; {***********************************************************************} {* function fcos(X : Float) : Float; *} {***********************************************************************} function fcos(X : Float) : Float; assembler; asm FLD x fcos end; {***********************************************************************} {* function ftan(X : Float) : Float;assembler; *} {***********************************************************************} function ftan(X : Float) : Float; assembler; asm { ST(0) ST(1) } FLD x { x - } FPTAN { 1 tan(x) } FSTP ST(0) { tan(x) - } end; {***********************************************************************} {* function farctan(X : Float) : Float; *} {***********************************************************************} function farctan(x : Float): Float; assembler; asm { ST(0) ST(1) } FLD x { x - } FLD1 { 1 x } FPATAN { atan(x/1) - } end; {***********************************************************************} {* function farctan2(Y, X : Float) : Float; *} {***********************************************************************} function farctan2(y, x : Float): Float; assembler; { retourne arctan (y / x) } asm { ST(0) ST(1) } FLD y { y - } FLD x { x y } FPATAN { atan(y/x) - } end; {***********************************************************************} {* function farcsin(X : Float) : Float; *} {***********************************************************************} {* retourne l'arcsin de x *} {* methode : ________ *} {* arcsin(x) = arctan( x / V 1 - x.x ) *} {* no range validity check is performed in this function |x| > 1 *} {***********************************************************************} {* ST(0) ST(1) ST(2) *} {* x - - *} {* x x - *} {* x.x x - *} {* 1 x.x x *} {* 1 - x§ x - *} {* sqrt(1-x§) x - *} {* arcsin(x) - - *} {***********************************************************************} function farcsin(x : Float): Float; assembler; asm FLD X FLD ST(0) FMUL ST(0), ST FLD1 FSUBRP ST(1), ST FSQRT FPATAN end; {***********************************************************************} {* function farccos(x : Float): Float; assembler; *} {***********************************************************************} {* retourne l'arccos de x *} {* methode : ________ *} {* arccos(x) = arctan( V 1 - x.x / x) *} {* pas de controle de domaine de definition |x| > 1 *} {***********************************************************************} {* ST(0) ST(1) ST(2) *} {* x - - *} {* x x - *} {* x.x x - *} {* 1 x.x x *} {* 1 - x§ x - *} {* sqrt(1-x§) x - *} {* x z - *} {* arccos(x) - - *} {***********************************************************************} function farccos(x : Float): Float; assembler; asm FLD X FLD ST(0) FMUL ST(0), ST FLD1 FSUBRP ST(1), ST FSQRT FXCH FPATAN end; {***********************************************************************} {* function fsinh(X : Float) : Float; *} {***********************************************************************} {* retourne le sinus hyperbolique de l'argument *} {* sh(x) = [exp(x) - exp(-x)] / 2 *} {* methode : z = exp(x), ch(x) = 1/2 (z - 1/z) *} {* z = 2^y, y = x.log2(e), *} {* z = 2^f.2^i, f = frac(y), i = int(y) *} {* 2^f est calcul‚ avec F2XM1, 2^i sans FSCALE *} {***********************************************************************} {* ST(0) ST(1) ST(2) *} {* log2(e) - - *} {* x log2(e) - *} {* z:=x.log2(e) - - *} {* z - - *} {* z - round(z) - - *} {* 2^(z - round(z)) - 1 - - *} {* 1 2^(z - round(z)) - 1 - *} {* 2^(z - round(z)) - - *} {* temp:=2^i 2^f:=2^(z - round(z)) - *} {* e^x - - *} {* e^x e^x - *} {* 1 z z *} {* 1/z z - *} {* z-1/z - - *} {* 0.5 z-1/z - *} {* sh(x) - - *} {***********************************************************************} function fsinh(x : float): float; assembler; const one_half : float = 0.5; var round_z : dword; temp : extended; asm FLDL2E FLD x FMULP FIST round_z MOV DWORD PTR [temp], 00000000H MOV DWORD PTR [temp+4],80000000H FISUB round_z MOV EAX, round_z ADD EAX, 00003FFFH MOV DWORD PTR [temp+8],EAX F2XM1 FLD1 FADDP FLD TBYTE PTR [temp] FMULP FST ST(1) FLD1 FDIVRP ST(1), ST FSUBP ST(1), ST FLD one_half FMULP ST(1), ST end; {***********************************************************************} {* function fcosh(X : Float) : Float; *} {***********************************************************************} {* retourne le cosinus hyperbolique de l'argument *} {* ch(x) = [exp(x) + exp(-x)] / 2 *} {* methode : z = exp(x), ch(x) = 1/2 (z + 1/z) *} {* z = 2^y, y = x.log2(e), *} {* z = 2^f.2^i, f = frac(y), i = int(y) *} {* 2^f est calcul‚ avec F2XM1, 2^i sans FSCALE *} {***********************************************************************} {* st(0) st(1) st(2) *} {* log2(e) - *} {* x log2(e) *} {* z:=x.log2(e) - *} {* z - *} {* z - round(z) - *} {* 2^(z - round(z)) - 1 - *} {* 1 2^(z - round(z)) - 1 *} {* 2^(z - round(z)) - *} {* temp:=2^i 2^f:=2^(z - round(z)) *} {* e^x - *} {* e^x e^x - *} {* 1 z z *} {* 1/z z - *} {* z+1/z - - *} {* 0.5 z+1/z - *} {* ch(x) - - *} {***********************************************************************} function fcosh(x : float): float; assembler; const one_half : float = 0.5; var round_z : dword; temp : extended; asm FLDL2E FLD x FMULP FIST round_z MOV DWORD PTR [temp], 00000000H MOV DWORD PTR [temp+4],80000000H FISUB round_z MOV EAX, round_z ADD EAX, 00003FFFH MOV DWORD PTR [temp+8],EAX F2XM1 FLD1 FADDP FLD TBYTE PTR [temp] FMULP FST ST(1) FLD1 FDIVRP ST(1), ST FADDP ST(1), ST FLD one_half FMULP ST(1), ST end; {***********************************************************************} {* function ftanh(X : Float) : Float; *} {***********************************************************************} {* retourne la tangente hyperbolique de l'argument *} {* th(x) = sh(x) / ch(x) *) *} {* th(x) = [exp(x) - exp(-x)] / [exp(x) + exp(-x)] *} {* methode : z = exp(x), ch(x) = (z - 1/z) / (z + 1/z) *} {* z = 2^y, y = x.log2(e), *} {* z = 2^f.2^i, f = frac(y), i = int(y) *} {* 2^f est calcul‚ avec F2XM1, 2^i sans FSCALE *} {***********************************************************************} {* st(0) st(1) st(2) *} {* log2(e) - *} {* x log2(e) *} {* z:=x.log2(e) - *} {* z - *} {* z - round(z) - *} {* 2^(z - round(z)) - 1 - *} {* 1 2^(z - round(z)) - 1 *} {* 2^(z - round(z)) - *} {* temp:=2^i 2^f:=2^(z - round(z)) *} {* e^x - *} {* e^x e^x - *} {* 1 z z *} {* 1/z z z *} {* 1/z z z-1/z *} {* z+1/z z-1/z - *} {* th(x) - - *} {***********************************************************************} function ftanh(x : float): float; assembler; const one_half : float = 0.5; var round_z : dword; temp : extended; asm FLDL2E FLD x FMULP FIST round_z MOV DWORD PTR [temp], 00000000H MOV DWORD PTR [temp+4],80000000H FISUB round_z MOV EAX, round_z ADD EAX, 00003FFFH MOV DWORD PTR [temp+8],EAX F2XM1 FLD1 FADDP FLD TBYTE PTR [temp] FMULP FST ST(1) FLD1 FDIV ST, ST(1) FSUB ST(2), ST FADDP ST(1), ST FDIVP ST(1), ST end; {***********************************************************************} {* function farcsinh(X : Float) : Float; *} {***********************************************************************} {* retourne l'arc sinus hyperbolique de l'argument *} {* _________ *} {* arg sh(x) = ln ( x + V x.x + 1 ) *} {***********************************************************************} {* ST(0) ST(1) ST(2) ST(3) *} {* ln(2) - - - *} {* x ln(2) - - *} {* x x ln(2) - *} {* x.x x ln(2) - *} {* 1 x.x x ln(2) *} {* x.x + 1 x ln(2) - *} {* sqrt(x.x+1) x ln(2) - *} {* x + z ln(2) - - *} {* arg_sh(x) - - - *} {***********************************************************************} function farcsinh(x : float): float; assembler; asm FLDLN2 FLD X FLD ST(0) FMUL ST(0), ST FLD1 FADDP ST(1), ST FSQRT FADDP ST(1), ST FYL2X end; {***********************************************************************} {* function farccosh(X : Float) : Float; *} {***********************************************************************} {* retourne l'arc cosinus hyperbolique de l'argument *} {* ________ *} {* arg ch(x) = ln ( x + V x.x - 1 ) x >=1 *} {***********************************************************************} {* ST(0) ST(1) ST(2) ST(3) *} {* ln(2) - - - *} {* x ln(2) - - *} {* x x ln(2) - *} {* x.x x ln(2) - *} {* 1 x.x x ln(2) *} {* x.x - 1 x ln(2) - *} {* sqrt(x2-1) x ln(2) - *} {* x + z ln(2) - - *} {* arg_ch(x) - - - *} {***********************************************************************} function farccosh(x : float): float; assembler; asm FLDLN2 FLD X FLD ST(0) FMUL ST(0), ST FLD1 FSUBP ST(1), ST FSQRT FADDP ST(1), ST FYL2X end; {***********************************************************************} {* function farctanh(X : Float) : Float; *} {***********************************************************************} {* retourne l'arc tangente hyperbolique de l'argument *} {* arg th(x) = 1/2 ln [ (1 + x) / (1 - x) ] *} {***********************************************************************} {* ST(0) ST(1) ST(2) ST(3) *} {* ln(2) - - - *} {* x ln(2) - - *} {* x x ln(2) - *} {* 1 x x ln(2) *} {* 1 x 1 + x ln(2) *} {* 1 - x 1 + x ln(2) - *} {* 1+x/1-x ln(2) - - *} {* ln(z) - - - *} {***********************************************************************} function farctanh(x : float): float; assembler; asm FLDLN2 FLD X FLD ST(0) FLD1 FADD ST(2),ST FSUBRP ST(1),ST FDIVP ST(1),ST FYL2X end; mricron-0.20120505.1~dfsg.1.orig/npm/dmath/math387.inc0000664000175000017500000002766307140416714021447 0ustar michaelmichael{ ********************************************************************** * MATH387.INC * ********************************************************************** Mathematical functions for TPMATH (Assembler version for 387/486/Pentium with BP7 and Delphi1) ********************************************************************** } (* Bibliotheque mathematique pour utilisation du coprocesseur flottant JD GAYRARD Sept. 95 ---------------------------------------------------------------------- Unite d'origine : MATH387.PAS, disponible dans MATHLIB2.ZIP (http://wcarchive.cdrom.com/pub/delphi_www/) Convertie en fichier Include par J. DEBORD, Juin 97 avec ajout des fonctions fexp2 et flog2 ---------------------------------------------------------------------- la bibliotheque est batie … partir des fonctions du coprocesseur du type 386, elle fournit les fonctions suivantes: fsin, fcos, ftan, farctan, farctan2, farcsin, farccos, fmod, mod_2PI, ften_to, fy_to_x, fexp, fexp2, fln, flog, flog2... Aucune verification du domaine de definition des fonctions n'est faite, pas plus qu'un controle de la validite des operandes. Il est conseille d'utiliser cette bibliotheque pour les types single et double exclusivement *) { table opcode du 387 non comprise par turbo pascal V7 } { FSIN : D9 FE FCOS : D9 FF FSINCOS : D9 FB FPREM1 : D9 F5 } (* use only with 80387, 80486 or pentium for type single, double and extended, no check of definition domain of the function or range (FPU limitation). The f prefix avoids function redefinition of system runtime library *) function fsin(x : Float): Float; assembler; {if x < pi.2^62, then C2 is set to 0 and ST = sin(x) else C2 is set to 1 and ST = x } {no check range validity is performed in this function} asm FLD x { load x } DB $D9, $FE { opcode for FSIN } end; function fcos(x : Float): Float; assembler; { if x < pi.2^62, then C2 is set to 0 and ST = sin(x) else C2 is set to 1 and ST = x } {no range validity check is performed in this function} asm FLD x { load angle } DB $D9, $FF { opcode for FCOS } end; (* procedure dsincos(x : Float; var sinus, cosinus : double); assembler; { retourne sinus et cosinus(x), utilisable uniquement avec 80387, 80468 et pentium et type double } asm { ST(0) ST(1) } FLD x { x - } DB $D9, $FB { cos(x) sin(x) } LES DI,cosinus { } FSTP ES:QWORD PTR [DI] { sin(x) - } LES DI,sinus { } FSTP ES:QWORD PTR [DI] { - - } end; procedure ssincos(x : Float; var sinus, cosinus : single); assembler; { retourne sinus et cosinus(x), utilisable uniquement avec 80387, 80468 et pentium et type single } asm { ST(0) ST(1) } FLD x { x - } DB $D9, $FB { cos(x) sin(x) } LES DI,cosinus { } FSTP ES:DWORD PTR [DI] { sin(x) - } LES DI,sinus { } FSTP ES:DWORD PTR [DI] { - - } end; procedure fsincos(x : Float; var sinus, cosinus : Float); { retourne sinus et cosinus(x), utilisable uniquement avec 80387, 80486 et pentium } var lcos, lsin : Float; begin asm { ST(0) ST(1) } FLD x { x - } DB $D9, $FB { cos(x) sin(x) } FSTP lcos { sin(x) - } FSTP lsin { - - } end; cosinus := lcos; sinus := lsin end; *) function ftan(x : Float): Float; assembler; { if x < pi.2^62, then C2 is set to 0 and ST = 1 and ST(1) = tan(x) else C2 is set to 1 and ST = x } {no range validity check is performed in this function} asm { ST(0) ST(1) } FLD x { x - } FPTAN { 1 tan(x) } FSTP ST(0) { tan(x) - } end; function farcsin(x : Float): Float; assembler; (* retourne l'arcsin de x *) { methode : ________ arcsin(x) = arctan( x / V 1 - x.x ) } {no range validity check is performed in this function |x| > 1 } asm { ST(0) ST(1) ST(2) } FLD X { x - - } FLD ST(0) { x x - } FMUL ST(0), ST { x.x x - } FLD1 { 1 x.x x } FSUBRP ST(1), ST { 1 - x§ x - } FSQRT { sqrt(1-x§) x - } FPATAN { arcsin(x) - - } end; function farccos(x : Float): Float; assembler; { retourne arccos(x) methode : ________ arcsin(x) = arctan( V 1 - x.x / x ) } { pas de controle de domaine de definition |x| > 1 } asm { ST(0) ST(1) ST(2) } FLD X { x - - } FLD ST(0) { x x - } FMUL ST(0), ST { x.x x - } FLD1 { 1 x.x x } FSUBRP ST(1), ST { 1 - x§ x - } FSQRT { sqrt(1-x§) x - } FXCH { x z - } FPATAN { arccos(x) - - } end; function farctan(x : Float): Float; assembler; asm { ST(0) ST(1) } FLD x { x - } FLD1 { 1 x } FPATAN { atan(x/1) - } end; function farctan2(y, x : Float): Float; assembler; { retourne arctan (y / x) } asm { ST(0) ST(1) } FLD y { y - } FLD x { x y } FPATAN { atan(y/x) - } end; (* function fmod(x, y : Float): Float; assembler; { retourne x mod y } asm { ST(0) ST(1) } FLD Y { y - } FLD X { x y } @repeat_mod: FPREM { x mod y y } FSTSW AX SAHF JP @repeat_mod FSTP ST(1) { x mod y - } end; function fmod_2PI( x : Float): Float; assembler; { retourne x mod 2.pi } asm { ST(0) ST(1) } FLDPI { pi - } FADD ST, ST { 2.pi - } FLD x { x 2.pi } @unit_circle: FPREM { x mod 2pi 2pi } FSTSW AX SAHF JP @unit_circle FSTP ST(1) { x mod 2pi - } end; *) function fln(x : Float): Float; assembler; { retourne le logarithme naturel de x, utilise la methode loge(x) = loge(2).log2(x) } { pas de verification du domaine de definition (x < 0) } asm { ST(0) ST(1) } FLDLN2 { ln(2) - } FLD X { x ln(2) } FYL2X { ln(2).log2(x) - } end; function flog2(x : Float): Float; assembler; { retourne le logarithme de base 2 de x } { pas de verification du domaine de definition (x < 0) } asm { ST(0) ST(1) } FLD1 { 1 - } FLD X { x 1 } FYL2X { log2(x) - } end; function flog10(x : Float): Float; assembler; { retourne le logarithme base 10 de x, utilise la methode log10(x) = log10(2).log2(x) } { pas de verification du domaine de definition (x < 0) } asm { ST(0) ST(1) } FLDLG2 { log10(2) - } FLD X { x log10(2) } FYL2X {log2(x).log10(2) - } end; function fexp(x : Float): Float; assembler; { retourne e^x, par la methode e^x = 2^(x.log2(e)) } { 2^z = 2^f.2^i with f = frac(z) and i = int(z) } { 2^f is computed with F2XM1, 2^i with FSCALE } const round_down : word = $177F; var control_ww : word; asm { ST(0) ST(1) ST(2) } FLD X { x - - } FLDL2E { log2(e) x - } FMULP ST(1), ST { x.log2(e) - - } FSTCW control_ww FLDCW round_down FLD ST(0) { z z - } FRNDINT { int(z) z - } FLDCW control_ww FXCH { z i - } FSUB ST, ST(1) { f i - } F2XM1 { 2^f-1 i - } FLD1 { 1 2^f-1 i } FADDP ST(1), ST { 2^f i - } FSCALE { 2^f.2^i i - } FSTP ST(1) { e^x - - } end; function fexp2(x : Float): Float; assembler; { retourne 2^x par la methode 2^z = 2^f.2^i } { with f = frac(z) and i = int(z) } { 2^f is computed with F2XM1, 2^i with FSCALE } const round_down : word = $177F; var control_ww : word; asm { ST(0) ST(1) ST(2) } FLD X { x - - } FSTCW control_ww FLDCW round_down FLD ST(0) { x x - } FRNDINT { int(x) x - } FLDCW control_ww FXCH { x i - } FSUB ST, ST(1) { f i - } F2XM1 { 2^f-1 i - } FLD1 { 1 2^f-1 i } FADDP ST(1), ST { 2^f i - } FSCALE { 2^f.2^i i - } FSTP ST(1) { 2^x - - } end; function fexp10(x : Float): Float; assembler; { retourne 10^x, par la methode 10^x = 2^(x.log2(10)) { 2^z = 2^f.2^i with f = frac(z) and i = int(z) { 2^f is computed with F2XM1, 2^i with FSCALE } const round_down : word = $177F; var control_ww : word; asm { ST(0) ST(1) ST(2) } FLD X { x - - } FLDL2T { log2(10) x - } FMULP ST(1), ST { x.log2(10) - - } FSTCW control_ww FLDCW round_down FLD ST(0) { z z - } FRNDINT { int(z) z - } FLDCW control_ww FXCH { z i - } FSUB ST, ST(1) { f i - } F2XM1 { 2^f-1 i - } FLD1 { 1 2^f-1 i } FADDP ST(1), ST { 2^f i - } FSCALE { 2^f.2^i i - } FSTP ST(1) { 10^x - - } end; (* function fpower(y, x : Float): Float; assembler; { retourne y^x, par la methode y^x = 2^(y.log2(y)) {no range validity check is performed in this function (y > 0) } { 2^z = 2^f.2^i with f = frac(z) and i = int(z) { 2^f is computed with F2XM1, 2^i with FSCALE } const round_down : word = $177F; var control_ww : word; asm { ST(0) ST(1) ST(2) } FLD Y { y - - } FLD X { x y - } FYL2X { x.log2(y) - - } FSTCW control_ww FLDCW round_down FLD ST(0) { z z - } FRNDINT { int(z) z - } FLDCW control_ww FXCH { z i - } FSUB ST, ST(1) { f i - } F2XM1 { 2^f-1 i - } FLD1 { 1 2^f-1 i } FADDP ST(1), ST { 2^f i - } FSCALE { 2^f.2^i i - } FSTP ST(1) { y^x - - } end; function module(x, y : Float): Float; assembler; { retourne le module du complexe (x,y) } asm { ST(0) ST(1) } FLD Y { y - } FMUL ST(0), ST { y.y - } FLD X { x y.y } FMUL ST(0), ST { x.x y.y } FADDP ST(1), ST { d.d - } FSQRT { d - } end; *) mricron-0.20120505.1~dfsg.1.orig/npm/dmath/matcomp.pas0000664000175000017500000002215611326434466021723 0ustar michaelmichael{ ********************************************************************** * Unit MATCOMP.PAS * * Version 1.3 * * (c) J. Debord, August 2000 * ********************************************************************** Matrices with complex elements. See MATRICES.PAS for details concerning the dynamic allocation and use of matrices. ********************************************************************** References: 1) 'Basic Programs for Scientists and Engineers' by A.R. Miller 2) 'Numerical Recipes' by Press et al. ********************************************************************** } unit MatComp; interface uses FMath, FComp, Matrices; { ********************************************************************** This section defines the vector and matrix types. Maximal sizes are given for a 16-bit compiler (TP/BP). Higher values may be used with a 32-bit compiler such as FPC. ********************************************************************** } const {$IFDEF DOUBLEREAL} MAX_COMP = 3854; { Max size of complex vector } {$ELSE} {$IFDEF SINGLEREAL} MAX_COMP = 7280; {$ELSE} {$IFDEF PASCALREAL} MAX_COMP = 5040; {$ELSE} {$DEFINE EXTENDEDREAL} MAX_COMP = 3119; {$ENDIF} {$ENDIF} {$ENDIF} type TCompVector = array[0..MAX_COMP] of Complex; PCompVector = ^TCompVector; TCompMatrix = array[0..MAX_VEC] of PCompVector; PCompMatrix = ^TCompMatrix; { ********************************************************************** Memory allocation routines ********************************************************************** } procedure DimCompVector(var V : PCompVector; Ubound : Integer); { ---------------------------------------------------------------------- Creates complex vector V[0..Ubound] ---------------------------------------------------------------------- } procedure DimCompMatrix(var A : PCompMatrix; Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Creates complex matrix A[0..Ubound1, 0..Ubound2] ---------------------------------------------------------------------- } { ********************************************************************** Memory deallocation routines ********************************************************************** } procedure DelCompVector(V : PCompVector; Ubound : Integer); { ---------------------------------------------------------------------- Deletes complex vector V[0..Ubound] ---------------------------------------------------------------------- } procedure DelCompMatrix(A : PCompMatrix; Ubound1, Ubound2 : Integer); { ---------------------------------------------------------------------- Deletes complex matrix A[0..Ubound1, 0..Ubound2] ---------------------------------------------------------------------- } { ********************************************************************** Complex matrix functions ********************************************************************** } function C_LU_Decomp(A : PCompMatrix; Lbound, Ubound : Integer) : Integer; { ---------------------------------------------------------------------- LU decomposition ---------------------------------------------------------------------- } procedure C_LU_Solve(A : PCompMatrix; B : PCompVector; Lbound, Ubound : Integer; X : PCompVector); { ---------------------------------------------------------------------- Solves a system of equations whose matrix has been transformed by C_LU_Decomp ---------------------------------------------------------------------- } implementation const { Used by LU procedures } LastDim : Integer = 1; { Dimension of the last system solved } Index : PIntVector = nil; { Records the row permutations } procedure DimCompVector(var V : PCompVector; Ubound : Integer); var I : Integer; begin { Check bounds } if (Ubound < 0) or (Ubound > MAX_COMP) then begin V := nil; Exit; end; { Allocate vector } GetMem(V, Succ(Ubound) * SizeOf(Complex)); if V = nil then Exit; { Initialize vector } for I := 0 to Ubound do V^[I] := C_zero; end; procedure DimCompMatrix(var A : PCompMatrix; Ubound1, Ubound2 : Integer); var I, J : Integer; RowSize : Word; begin { Check bounds } if (Ubound1 < 0) or (Ubound1 > MAX_VEC) or (Ubound2 < 0) or (Ubound2 > MAX_COMP) then begin A := nil; Exit; end; { Size of a row } GetMem(A, Succ(Ubound1) * SizeOf(PCompVector)); if A = nil then Exit; { Allocate each row } for I := 0 to Ubound1 do begin GetMem(A^[I], RowSize); if A^[I] = nil then begin A := nil; Exit; end; end; { Initialize matrix } for I := 0 to Ubound1 do for J := 0 to Ubound2 do A^[I]^[J] := C_zero; end; procedure DelCompVector(V : PCompVector; Ubound : Integer); begin if V <> nil then begin FreeMem(V, Succ(Ubound) * SizeOf(Complex)); V := nil; end; end; procedure DelCompMatrix(A : PCompMatrix; Ubound1, Ubound2 : Integer); var I : Integer; RowSize : Word; begin if A <> nil then begin RowSize := Succ(Ubound2) * SizeOf(Complex); for I := Ubound1 downto 0 do FreeMem(A^[I], RowSize); FreeMem(A, Succ(Ubound1) * SizeOf(PCompVector)); A := nil; end; end; function C_LU_Decomp(A : PCompMatrix; Lbound, Ubound : Integer) : Integer; const TINY = 1.0E-20; var I, Imax, J, K : Integer; C, Pvt, T : Float; Sum, Z : Complex; V : PVector; begin DimVector(V, Ubound); { Reallocate Index } if Index <> nil then DelIntVector(Index, LastDim); DimIntVector(Index, Ubound); LastDim := Ubound; for I := Lbound to Ubound do begin Pvt := 0.0; for J := Lbound to Ubound do begin C := CAbs(A^[I]^[J]); if C > Pvt then Pvt := C; end; if Pvt < MACHEP then begin DelVector(V, Ubound); C_LU_Decomp := MAT_SINGUL; Exit; end; V^[I] := 1.0 / Pvt; end; for J := Lbound to Ubound do begin for I := Lbound to Pred(J) do begin Sum := A^[I]^[J]; for K := Lbound to Pred(I) do begin { Sum := Sum - A^[I]^[K] * A^[K]^[J]; } CMult(A^[I]^[K], A^[K]^[J], Z); CSub(Sum, Z, Sum); end; A^[I]^[J] := Sum; end; Pvt := 0.0; for I := J to Ubound do begin Sum := A^[I]^[J]; for K := Lbound to Pred(J) do begin { Sum := Sum - A^[I]^[K] * A^[K]^[J]; } CMult(A^[I]^[K], A^[K]^[J], Z); CSub(Sum, Z, Sum); end; A^[I]^[J] := Sum; T := V^[I] * CAbs(Sum); if T > Pvt then begin Pvt := T; Imax := I; end; end; if J <> Imax then begin { SwapRows(Imax, J, A, Lbound, Ubound); } for K := Lbound to Ubound do CSwap(A^[Imax]^[K], A^[J]^[K]); V^[Imax] := V^[J]; end; Index^[J] := Imax; if CAbs(A^[J]^[J]) = 0.0 then CSet(A^[J]^[J], TINY, TINY, Rec); if J <> Ubound then for I := Succ(J) to Ubound do { A^[I]^[J] := A^[I]^[J] / A^[J]^[J]; } CDiv(A^[I]^[J], A^[J]^[J], A^[I]^[J]); end; DelVector(V, Ubound); C_LU_Decomp := MAT_OK; end; procedure C_LU_Solve(A : PCompMatrix; B : PCompVector; Lbound, Ubound : Integer; X : PCompVector); var I, Ip, J, K : Integer; Sum, Z : Complex; begin K := Pred(Lbound); { CopyVector(X, B, Lbound, Ubound); } for I := Lbound to Ubound do X^[I] := B^[I]; for I := Lbound to Ubound do begin Ip := Index^[I]; Sum := X^[Ip]; X^[Ip] := X^[I]; if K >= Lbound then for J := K to Pred(I) do begin { Sum := Sum - A^[I]^[J] * X^[J] } CMult(A^[I]^[J], X^[J], Z); CSub(Sum, Z, Sum); end else if CAbs(Sum) <> 0.0 then K := I; X^[I] := Sum; end; for I := Ubound downto Lbound do begin Sum := X^[I]; if I < Ubound then for J := Succ(I) to Ubound do begin { Sum := Sum - A^[I]^[J] * X^[J]; } CMult(A^[I]^[J], X^[J], Z); CSub(Sum, Z, Sum); end; { X^[I] := Sum / A^[I]^[I]; } CDiv(Sum, A^[I]^[I], X^[I]); end; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/GraphicsMathLibrary.pas0000664000175000017500000006147311326434466024167 0ustar michaelmichael// Graphics Math Library // // Copyright (C) 1982, 1985, 1992, 1995-1998 Earl F. Glynn, Overland Park, KS. // All Rights Reserved. E-Mail Address: EarlGlynn@att.net UNIT GraphicsMathLibrary; // Matrix/Vector Operations for 2D/3D Graphics} INTERFACE USES SysUtils,dialogs; {Exception} CONST sizeUndefined = 1; size2D = 3; // 'size' of 2D homogeneous vector or transform matrix size3D = 4; // 'size' of 3D homogeneous vector or transform matrix TYPE EVectorError = CLASS(Exception); EMatrixError = CLASS(Exception); TAxis = (axisX, axisY, axisZ); TCoordinate = (coordCartesian, coordSpherical, coordCylindrical); TDimension = (dimen2D, dimen3D); // two- or three-dimensional TYPE TIndex = 1..4; // index of 'TMatrix' and 'TVector' TYPEs TMatrix = // transformation 'matrix' RECORD size: TIndex; matrix: ARRAY[TIndex,TIndex] OF single //azx DOUBLE END; Trotation = (rotateClockwise, rotateCounterClockwise); // Normally the TVector TYPE is used to define 2D/3D homogenous // cartesian coordinates for graphics, i.e., (x,y,1) for 2D and // (x,y,z,1) for 3D. // // Cartesian coordinates can be converted to spherical (r, theta, phi), // or cylindrical coordinates (r,theta, z). Spherical or cylindrical // coordinates can be converted back to cartesian coordinates. TVector = RECORD size: TIndex; CASE INTEGER OF 0: (vector: ARRAY[TIndex] OF single); 1: (x: single; y: single; z: single; // contains 'h' for 2D cartesian vector h: single) END; TIntVector = RECORD size: TIndex; CASE INTEGER OF 0: (vector: ARRAY[TIndex] OF integer); 1: (x: integer; y: integer; z: integer; // contains 'h' for 2D cartesian vector h: integer) END; // Vector Operations // FUNCTION Vector2D (CONST xValue, yValue: DOUBLE): TVector; FUNCTION Vector3D (CONST xValue, yValue, zValue: DOUBLE): TVector; (* FUNCTION AddVectors (CONST u,v: TVector): TVector; // FUNCTION Transform (CONST u: TVector; CONST a: TMatrix): TVector; FUNCTION DotProduct (CONST u,v: TVector): DOUBLE; FUNCTION CrossProduct(CONST u,v: TVector): TVector; *) // Basic Matrix Operations FUNCTION Matrix2D (CONST m11,m12,m13, // 2D "graphics" matrix m21,m22,m23, m31,m32,m33: DOUBLE): TMatrix; FUNCTION Matrix3D (CONST m11,m12,m13,m14, // 3D "graphics" matrix m21,m22,m23,m24, m31,m32,m33,m34, m41,m42,m43,m44: DOUBLE): TMatrix; FUNCTION MultiplyMatrices (CONST a,b: TMatrix): TMatrix; FUNCTION InvertMatrix3D (CONST Input:TMatrix): TMatrix; FUNCTION InvertMatrix (CONST a,b: TMatrix; VAR determinant: DOUBLE): TMatrix; // Transformation Matrices FUNCTION RotateMatrix (CONST dimension: TDimension; CONST xyz : TAxis; CONST angle : DOUBLE; CONST rotation : Trotation): TMatrix; // FUNCTION ScaleMatrix (CONST s: TVector): TMatrix; // FUNCTION TranslateMatrix (CONST t: TVector): TMatrix; FUNCTION ViewTransformMatrix (CONST coordinate: TCoordinate; CONST azimuth {or x}, elevation {or y}, distance {or z}: DOUBLE; CONST ScreenX, ScreenY, ScreenDistance: DOUBLE): TMatrix; // conversions // FUNCTION FromCartesian (CONST ToCoordinate: TCoordinate; CONST u: TVector): TVector; // FUNCTION ToCartesian (CONST FromCoordinate: TCoordinate; CONST u: TVector): TVector; //FUNCTION ToDegrees(CONST angle {radians}: DOUBLE): DOUBLE {degrees}; FUNCTION ToRadians(CONST angle {degrees}: DOUBLE): DOUBLE {radians}; // miscellaneous FUNCTION Defuzz(CONST x: DOUBLE): DOUBLE; { FUNCTION GetFuzz: DOUBLE; PROCEDURE SetFuzz(CONST x: DOUBLE); } IMPLEMENTATION VAR fuzz : DOUBLE; // ************************* Vector Operations ************************* // This procedure defines two-dimensional homogeneous coordinates (x,y,1) // as a single 'vector' data element 'u'. The 'size' of a two-dimensional // homogenous vector is 3. // This procedure defines three-dimensional homogeneous coordinates // (x,y,z,1) as a single 'vector' data element 'u'. The 'size' of a // three-dimensional homogenous vector is 4. FUNCTION Vector3D (CONST xValue, yValue, zValue: DOUBLE): TVector; BEGIN WITH RESULT DO BEGIN x := xValue; y := yValue; z := zValue; h := 1.0; // homogeneous coordinate size := size3D END END {Vector3D}; // AddVectors adds two vectors defined with homogeneous coordinates. FUNCTION AddVectors (CONST u,v: TVector): TVector; VAR i: TIndex; BEGIN IF (u.size IN [size2D..size3D]) AND (v.size IN [size2D..size3D]) AND (u.size = v.size) THEN BEGIN RESULT.size := u.size; FOR i := 1 TO u.size-1 DO {2D + 2D = 2D or 3D + 3D = 3D} BEGIN RESULT.vector[i] := u.vector[i] + v.vector[i] END; RESULT.vector[u.size] := 1.0 {homogeneous coordinate} END ELSE raise EVectorError.Create('Vector Addition Mismatch') END {AddVectors}; // *********************** Basic Matrix Operations ********************** FUNCTION Matrix2D (CONST m11,m12,m13, m21,m22,m23, m31,m32,m33: DOUBLE): TMatrix; BEGIN WITH RESULT DO BEGIN matrix[1,1] := m11; matrix[1,2] := m12; matrix[1,3] := m13; matrix[2,1] := m21; matrix[2,2] := m22; matrix[2,3] := m23; matrix[3,1] := m31; matrix[3,2] := m32; matrix[3,3] := m33; size := size2D END END {Matrix2D}; FUNCTION Matrix3D (CONST m11,m12,m13,m14, m21,m22,m23,m24, m31,m32,m33,m34, m41,m42,m43,m44: DOUBLE): TMatrix; BEGIN WITH RESULT DO BEGIN matrix[1,1] := m11; matrix[1,2] := m12; matrix[1,3] := m13; matrix[1,4] := m14; matrix[2,1] := m21; matrix[2,2] := m22; matrix[2,3] := m23; matrix[2,4] := m24; matrix[3,1] := m31; matrix[3,2] := m32; matrix[3,3] := m33; matrix[3,4] := m34; matrix[4,1] := m41; matrix[4,2] := m42; matrix[4,3] := m43; matrix[4,4] := m44; size := size3D END END {Matrix3D}; // Compound geometric transformation matrices can be formed by multiplying // simple transformation matrices. This procedure only multiplies together // matrices for two- or three-dimensional transformations, i.e., 3x3 or 4x4 // matrices. The multiplier and multiplicand must be of the same dimension. FUNCTION MultiplyMatrices (CONST a,b: TMatrix): TMatrix; VAR i,j,k: TIndex; temp : DOUBLE; BEGIN RESULT.size := a.size; IF a.size = b.size THEN FOR i := 1 TO a.size DO BEGIN FOR j := 1 TO a.size DO BEGIN temp := 0.0; FOR k := 1 TO a.size DO BEGIN temp := temp + a.matrix[i,k]*b.matrix[k,j]; END; RESULT.matrix[i,j] := Defuzz(temp) END END ELSE Showmessage('shit'+inttostr(a.size)+'x'+inttostr(b.size)); //ELSE EMatrixError.Create('MultiplyMatrices error') END {MultiplyMatrices}; PROCEDURE lubksb(a: {glnpbynp}TMatrix; n: integer; indx: TIntVector; VAR b: TVector); VAR j,ip,ii,i: integer; sum: double; BEGIN ii := 0; FOR i := 1 TO n DO BEGIN ip := indx.vector[i]; sum := b.vector[ip]; b.vector[ip] := b.vector[i]; IF (ii <> 0) THEN BEGIN FOR j := ii TO i-1 DO BEGIN sum := sum-a.matrix[i,j]*b.vector[j] END END ELSE IF (sum <> 0.0) THEN BEGIN ii := i END; b.vector[i] := sum END; FOR i := n DOWNTO 1 DO BEGIN sum := b.vector[i]; IF (i < n) THEN BEGIN FOR j := i+1 TO n DO BEGIN sum := sum-a.matrix[i,j]*b.vector[j] END END; b.vector[i] := sum/a.matrix[i,i] END end; PROCEDURE ludcmp(VAR a: TMatrix; n: integer; VAR indx: TIntVector; VAR d: double); CONST tiny=1.0e-20; VAR k,j,imax,i: integer; sum,dum,big: real; vv: TVector; BEGIN d := 1.0; FOR i := 1 TO n DO BEGIN big := 0.0; FOR j := 1 TO n DO IF (abs(a.matrix[i,j]) > big) THEN big := abs(a.matrix[i,j]); IF (big = 0.0) THEN BEGIN writeln('pause in LUDCMP - singular matrix'); readln END; vv.vector[i] := 1.0/big END; FOR j := 1 TO n DO BEGIN FOR i := 1 TO j-1 DO BEGIN sum := a.matrix[i,j]; FOR k := 1 TO i-1 DO BEGIN sum := sum-a.matrix[i,k]*a.matrix[k,j] END; a.matrix[i,j] := sum END; big := 0.0; FOR i := j TO n DO BEGIN sum := a.matrix[i,j]; FOR k := 1 TO j-1 DO BEGIN sum := sum-a.matrix[i,k]*a.matrix[k,j] END; a.matrix[i,j] := sum; dum := vv.vector[i]*abs(sum); IF (dum > big) THEN BEGIN big := dum; imax := i END END; IF (j <> imax) THEN BEGIN FOR k := 1 TO n DO BEGIN dum := a.matrix[imax,k]; a.matrix[imax,k] := a.matrix[j,k]; a.matrix[j,k] := dum END; d := -d; vv.vector[imax] := vv.vector[j] END; indx.vector[j] := imax; IF (a.matrix[j,j] = 0.0) THEN a.matrix[j,j] := tiny; IF (j <> n) THEN BEGIN dum := 1.0/a.matrix[j,j]; FOR i := j+1 TO n DO BEGIN a.matrix[i,j] := a.matrix[i,j]*dum END END END; END; FUNCTION InvertMatrix3D (CONST Input:TMatrix): TMatrix; var n,i,j: integer; d: double; indx: tIntVector; col: tvector; a,y: TMatrix; begin a:= Input; n := 3; ludcmp(a,n,indx,d); for j := 1 to n do begin for i := 1 to n do col.vector[i] := 0; col.vector[j] := 1.0; lubksb(a,n,indx,col); for i := 1 to n do y.matrix[i,j] := col.vector[i]; end; result := y; end; // This procedure inverts a general transformation matrix. The user need // not form an inverse geometric transformation by keeping a product of // the inverses of simple geometric transformations: translations, rotations // and scaling. A determinant of zero indicates no inverse is possible for // a singular matrix. FUNCTION InvertMatrix (CONST a,b: TMatrix; VAR determinant: DOUBLE): TMatrix; VAR c : TMatrix; i,i_pivot: TIndex; i_flag : ARRAY[TIndex] OF BOOLEAN; j,j_pivot: TIndex; j_flag : ARRAY[TIndex] OF BOOLEAN; modulus : DOUBLE; n : TIndex; pivot : DOUBLE; pivot_col: ARRAY[TIndex] OF TIndex; pivot_row: ARRAY[TIndex] OF TIndex; temporary: DOUBLE; BEGIN c := a; // The matrix inversion algorithm used here WITH c DO // is similar to the "maximum pivot strategy" BEGIN // described in "Applied Numerical Methods" FOR i := 1 TO size DO // by Carnahan, Luther and Wilkes, BEGIN // pp. 282-284. i_flag[i] := TRUE; j_flag[i] := TRUE END; modulus := 1.0; i_pivot := 1; // avoid initialization warning j_pivot := 1; // avoid initialization warning FOR n := 1 TO size DO BEGIN pivot := 0.0; IF ABS(modulus) > 0.0 THEN BEGIN FOR i := 1 TO size DO IF i_flag[i] THEN FOR j := 1 TO size DO IF j_flag[j] THEN IF ABS(matrix[i,j]) > ABS(pivot) THEN BEGIN pivot := matrix[i,j]; // largest value on which to pivot i_pivot := i; // indices of pivot element j_pivot := j END; IF Defuzz(pivot) = 0 // If pivot is too small, consider THEN modulus := 0 // the matrix to be singular ELSE BEGIN pivot_row[n] := i_pivot; pivot_col[n] := j_pivot; i_flag[i_pivot] := FALSE; j_flag[j_pivot] := FALSE; FOR i := 1 TO size DO IF i <> i_pivot THEN FOR j := 1 TO size DO // pivot column unchanged for elements IF j <> j_pivot // not in pivot row or column ... THEN matrix[i,j] := (matrix[i,j]*matrix[i_pivot,j_pivot] - matrix[i_pivot,j]*matrix[i,j_pivot]) / modulus; // 2x2 minor / modulus FOR j := 1 TO size DO IF j <> j_pivot // change signs of elements in pivot row THEN matrix[i_pivot,j] := -matrix[i_pivot,j]; temporary := modulus; // exchange pivot element and modulus modulus := matrix[i_pivot,j_pivot]; matrix[i_pivot,j_pivot] := temporary END END END {FOR n} END {WITH}; determinant := Defuzz(modulus); IF determinant <> 0 THEN BEGIN RESULT.size := c.size; // The matrix inverse must be unscrambled FOR i := 1 TO c.size DO // if pivoting was not along main diagonal. FOR j := 1 TO c.size DO RESULT.matrix[pivot_row[i],pivot_col[j]] := Defuzz(c.matrix[i,j]/determinant) END ELSE EMatrixError.Create('InvertMatrix error') END {InvertMatrix}; // *********************** Transformation Matrices ******************** // This procedure defines a matrix for a two- or three-dimensional rotation. // To avoid possible confusion in the sense of the rotation, 'rotateClockwise' // or 'roCounterlcockwise' must always be specified along with the axis // of rotation. Two-dimensional rotations are assumed to be about the z-axis // in the x-y plane. // // A rotation about an arbitrary axis can be performed with the following // steps: // (1) Translate the object into a new coordinate system where (x,y,z) // maps into the origin (0,0,0). // (2) Perform appropriate rotations about the x and y axes of the // coordinate system so that the unit vector (a,b,c) is mapped into // the unit vector along the z axis. // (3) Perform the desired rotation about the z-axis of the new // coordinate system. // (4) Apply the inverse of step (2). // (5) Apply the inverse of step (1). FUNCTION RotateMatrix (CONST dimension: TDimension; CONST xyz : TAxis; CONST angle : DOUBLE; CONST rotation : Trotation): TMatrix; VAR cosx : DOUBLE; sinx : DOUBLE; TempAngle: DOUBLE; BEGIN TempAngle := angle; // Use TempAngle since "angle" is CONST parameter IF rotation = rotateCounterClockwise THEN TempAngle := -TempAngle; cosx := Defuzz( COS(TempAngle) ); sinx := Defuzz( SIN(TempAngle) ); CASE dimension OF dimen2D: CASE xyz OF axisX,axisY: EMatrixError.Create('Invalid 2D rotation matrix. Specify axisZ'); axisZ: RESULT := Matrix2D ( cosx, -sinx, 0, sinx, cosx, 0, 0, 0, 1) END; dimen3D: CASE xyz OF axisX: RESULT := Matrix3D ( 1, 0, 0, 0, 0, cosx, -sinx, 0, 0, sinx, cosx, 0, 0, 0, 0, 1); axisY: RESULT := Matrix3D ( cosx, 0, sinx, 0, 0, 1, 0, 0, -sinx, 0, cosx, 0, 0, 0, 0, 1); axisZ: RESULT := Matrix3D ( cosx, -sinx, 0, 0, sinx, cosx, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); END END END {RotateMatrix}; // 'ScaleMatrix' accepts a 'vector' containing the scaling factors for // each of the dimensions and creates a scaling matrix. The size // of the vector dictates the size of the resulting matrix. FUNCTION ScaleMatrix (CONST s: TVector): TMatrix; BEGIN CASE s.size OF size2D: RESULT := Matrix2D (s.x, 0, 0, 0, s.y, 0, 0, 0, 1); size3D: RESULT := Matrix3D (s.x, 0, 0, 0, 0, s.y, 0, 0, 0, 0, s.z, 0, 0, 0, 0, 1) END END {ScaleMatrix}; // 'TranslateMatrix' defines a translation transformation matrix. The // components of the vector 't' determine the translation components. // (Note: 'Translate' here is from kinematics in physics.) FUNCTION TranslateMatrix (CONST t: TVector): TMatrix; BEGIN CASE t.size OF size2D: RESULT := Matrix2D ( 1, 0, 0, 0, 1, 0, t.x, t.y, 1); size3D: RESULT := Matrix3D ( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, t.x, t.y, t.z, 1) END END {TranslateMatrix}; // 'ViewTransformMatrix' creates a transformation matrix for changing // from world coordinates to eye coordinates. The location of the 'eye' // from the 'object' is given in spherical (azimuth,elevation,distance) // coordinates or Cartesian (x,y,z) coordinates. The size of the screen // is 'ScreenX' units horizontally and 'ScreenY' units vertically. The // eye is 'ScreenDistance' units from the viewing screen. A large ratio // 'ScreenDistance/ScreenX (or ScreenY)' specifies a narrow aperature // -- a telephoto view. Conversely, a small ratio specifies a large // aperature -- a wide-angle view. This view transform matrix is very // useful as the default three-dimensional transformation matrix. Once // set, all points are automatically transformed. FUNCTION ViewTransformMatrix (CONST coordinate: TCoordinate; CONST azimuth {or x}, elevation {or y}, distance {or z}: DOUBLE; CONST ScreenX, ScreenY, ScreenDistance: DOUBLE): TMatrix; CONST HalfPI = PI / 2.0; VAR a : TMatrix; b : TMatrix; cosm : DOUBLE; // COS(-angle) hypotenuse: DOUBLE; sinm : DOUBLE; // SIN(-angle) temporary : DOUBLE; u : TVector; x : DOUBLE ABSOLUTE azimuth; // x and azimuth are synonyms y : DOUBLE ABSOLUTE elevation; // synonyms z : DOUBLE ABSOLUTE distance; // synonyms BEGIN CASE coordinate OF coordCartesian: u := Vector3D (-x, -y, -z); coordSpherical: BEGIN temporary := -distance * COS(elevation); u := Vector3D (temporary * COS(azimuth - HalfPI), temporary * SIN(azimuth - HalfPI), -distance * SIN(elevation)); END END; a := TranslateMatrix(u); // translate origin to 'eye' b := RotateMatrix (dimen3D, axisX, HalfPI, rotateClockwise); a := MultiplyMatrices(a,b); CASE coordinate OF coordCartesian: BEGIN temporary := SQR(x) + SQR(y); hypotenuse := SQRT(temporary); if hypotenuse <> 0 then begin cosm := -y/hypotenuse; sinm := x/hypotenuse; end else begin cosm := 1;//abba sinm := 0; end; b := Matrix3D ( cosm, 0, sinm, 0, 0, 1, 0, 0, -sinm, 0, cosm, 0, 0, 0, 0, 1); a := MultiplyMatrices (a,b); cosm := hypotenuse; hypotenuse := SQRT(temporary + SQR(z)); cosm := cosm/hypotenuse; sinm := -z/hypotenuse; b := Matrix3D ( 1, 0, 0, 0, 0, cosm, -sinm, 0, 0, sinm, cosm, 0, 0, 0, 0, 1) END; coordSpherical: BEGIN b := RotateMatrix (dimen3D,axisY,-azimuth,rotateCounterClockwise); a := MultiplyMatrices(a,b); b := RotateMatrix (dimen3D,axisX,elevation,rotateCounterClockwise); END END {CASE}; a := MultiplyMatrices (a,b); u := Vector3D (ScreenDistance/(0.5*ScreenX), ScreenDistance/(0.5*ScreenY),-1.0); b := ScaleMatrix (u); // reverse sense of z-axis; screen transformation RESULT := MultiplyMatrices (a,b); END {ViewTransformMatrix}; // *************************** Conversions ************************** // This function converts the vector parameter from Cartesian // coordinates to the specified type of coordinates. FUNCTION FromCartesian (CONST ToCoordinate: TCoordinate; CONST u: TVector): TVector; VAR phi : DOUBLE; r : DOUBLE; temp : DOUBLE; theta: DOUBLE; BEGIN IF ToCoordinate = coordCartesian THEN RESULT := u ELSE BEGIN RESULT.size := u.size; IF (u.size = size3D) AND (ToCoordinate = coordSpherical) THEN BEGIN // spherical 3D temp := SQR(u.x)+SQR(u.y); // (x,y,z) -> (r,theta,phi) r := SQRT(temp+SQR(u.z)); IF Defuzz(u.x) = 0.0 THEN theta := PI/4 ELSE theta := ARCTAN(u.y/u.x); IF Defuzz(u.z) = 0.0 THEN phi := PI/4 ELSE phi := ARCTAN(SQRT(temp)/u.z); RESULT.x := r; RESULT.y := theta; RESULT.z := phi END ELSE BEGIN // cylindrical 2D/3D or spherical 2D // (x,y) -> (r,theta) or (x,y,z) -> (r,theta,z) r := SQRT( SQR(u.x) + SQR(u.y) ); IF Defuzz(u.x) = 0.0 THEN theta := PI/4 ELSE theta := ARCTAN(u.y/u.x); RESULT.x := r; RESULT.y := theta END END END {FromCartesian}; // This function converts the vector parameter from specified coordinates // into Cartesian coordinates. FUNCTION ToCartesian (CONST FromCoordinate: TCoordinate; CONST u: TVector): TVector; VAR phi : DOUBLE; r : DOUBLE; sinphi: DOUBLE; theta : DOUBLE; BEGIN RESULT := u; IF FromCoordinate = coordCartesian THEN RESULT := u ELSE BEGIN RESULT.size := u.size; IF (u.size = size3D) AND (FromCoordinate = coordSpherical) THEN BEGIN // spherical 3D r := u.x; // (r,theta,phi) -> (x,y,z) theta := u.y; phi := u.z; sinphi := SIN(phi); RESULT.x := r * COS(theta) * sinphi; RESULT.y := r * SIN(theta) * sinphi; RESULT.z := r * COS(phi) END ELSE BEGIN // cylindrical 2D/3D or spherical 2D r := u.x; // (r,theta) -> (x,y) or (r,theta,z) -> (x,y,z) theta := u.y; RESULT.x := r * COS(theta); RESULT.y := r * SIN(theta) END END END {ToCartesian}; // Convert angle in degrees to radians. FUNCTION ToRadians (CONST angle: DOUBLE): DOUBLE; BEGIN RESULT := PI/180.0 * angle END; {ToRadians} // *************************** Miscellaneous ************************** // 'Defuzz' is used for comparisons and to avoid propagation of 'fuzzy', // nearly-zero values. DOUBLE calculations often result in 'fuzzy' values. // The term 'fuzz' was adapted from the APL language. FUNCTION Defuzz(CONST x: DOUBLE): DOUBLE; BEGIN IF ABS(x) < fuzz THEN RESULT := 0.0 ELSE RESULT := x END {Defuzz}; INITIALIZATION fuzz := 1.0E-6; END. {GraphicsMath UNIT} mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fourier.pas0000664000175000017500000002543711326434466021743 0ustar michaelmichael(*========================================================================== fourier.pas - Don Cross Modified by Jean Debord for use with TP Math. This is a Turbo Pascal Unit for calculating the Fast Fourier Transform (FFT) and the Inverse Fast Fourier Transform (IFFT). Visit the following URL for the latest version of this code. This page also has a C/C++ version, and a brief discussion of the theory behind the FFT algorithm. http://www.intersrv.com/~dcross/fft.html#pascal Revision history [most recent first]: 1998 November 27 [Jean Debord] Replaced the constant MAXPOWER by a variable which is initialized according to the value of MAX_FLT defined in MATRICES.PAS 1997 March 1 [Jean Debord] Modifications for use with the TP Math library: 1. Added a USES clause for the TP Math units. 2. Set real type to Float (defined in FMATH.PAS) 3. Added a constant MAXPOWER to define the maximum number of points. Modified functions IsPowerOfTwo and NumberOfBitsNeeded accordingly. 4. Changed array types to those defined in TP Math. Modified array allocation, deallocation and reference accordingly. 5. Removed compiler directives, which were no longer necessary. 6. Modified some typographical and formatting options so that the code looks like the other TP Math units. No modification was made to the original algorithm. 1996 December 11 [Don Cross] Improved documentation of the procedure CalcFrequency. Fixed some messed up comments in procedure IFFT. 1996 December 6 [Don Cross] Made procedure 'fft_integer' more efficient when buffer size changes in successive calls: the buffer is now only resized when the input has more samples, not a differing number of samples. Also changed the way 'fft_integer_cleanup' works so that it is more "bullet-proof". 1996 December 4 [Don Cross] Adding the procedure 'CalcFrequency', which calculates the FFT at a specific frequency index p=0..n-1, instead of the whole FFT. This is O(n^2) instead of O(n*log(n)). 1996 November 30 [Don Cross] Adding a routine to allow FFT of an input array of integers. It is called 'fft_integer'. 1996 November 18 [Don Cross] Added some comments. 1996 November 17 [Don Cross] Wrote and debugged first version. ==========================================================================*) unit Fourier; interface uses FMath, Matrices; (*--------------------------------------------------------------------------- procedure FFT Calculates the Fast Fourier Transform of the array of complex numbers represented by 'RealIn' and 'ImagIn' to produce the output complex numbers in 'RealOut' and 'ImagOut'. ---------------------------------------------------------------------------*) procedure FFT(NumSamples : Integer; RealIn, ImagIn, RealOut, ImagOut : PVector); (*--------------------------------------------------------------------------- procedure IFFT Calculates the Inverse Fast Fourier Transform of the array of complex numbers represented by 'RealIn' and 'ImagIn' to produce the output complex numbers in 'RealOut' and 'ImagOut'. ---------------------------------------------------------------------------*) procedure IFFT(NumSamples : Integer; RealIn, ImagIn, RealOut, ImagOut : PVector); (*--------------------------------------------------------------------------- procedure FFT_Integer Same as procedure FFT, but uses Integer input arrays instead of double. Make sure you call FFT_Integer_Cleanup after the last time you call FFT_Integer to free up memory it allocates. ---------------------------------------------------------------------------*) procedure FFT_Integer(NumSamples : Integer; RealIn, ImagIn : PIntVector; RealOut, ImagOut : PVector); (*-------------------------------------------------------------------------- procedure FFT_Integer_Cleanup If you call the procedure 'FFT_Integer', you must call 'FFT_Integer_Cleanup' after the last time you call 'FFT_Integer' in order to free up dynamic memory. --------------------------------------------------------------------------*) procedure FFT_Integer_Cleanup; (*-------------------------------------------------------------------------- procedure CalcFrequency This procedure calculates the complex frequency sample at a given index directly. Use this instead of 'FFT' when you only need one or two frequency samples, not the whole spectrum. It is also useful for calculating the Discrete Fourier Transform (DFT) of a number of data which is not an integer power of 2. For example, you could calculate the DFT of 100 points instead of rounding up to 128 and padding the extra 28 array slots with zeroes. --------------------------------------------------------------------------*) procedure CalcFrequency(NumSamples, FrequencyIndex : Integer; RealIn, ImagIn : PVector; var RealOut, ImagOut : Float); implementation var MaxPower : Integer; function IsPowerOfTwo(X : Integer) : Boolean; var I, Y : Integer; begin Y := 2; for I := 1 to Pred(MaxPower) do begin if X = Y then begin IsPowerOfTwo := True; Exit; end; Y := Y shl 1; end; IsPowerOfTwo := False; end; function NumberOfBitsNeeded(PowerOfTwo : Integer) : Integer; var I : Integer; begin for I := 0 to MaxPower do begin if (PowerOfTwo and (1 shl I)) <> 0 then begin NumberOfBitsNeeded := I; Exit; end; end; end; function ReverseBits(Index, NumBits : Integer) : Integer; var I, Rev : Integer; begin Rev := 0; for I := 0 to NumBits - 1 do begin Rev := (Rev shl 1) or (Index and 1); Index := Index shr 1; end; ReverseBits := Rev; end; procedure FourierTransform(AngleNumerator : Float; NumSamples : Integer; RealIn, ImagIn, RealOut, ImagOut : PVector); var NumBits, I, J, K, N, BlockSize, BlockEnd : Integer; Delta_angle, Delta_ar : Float; Alpha, Beta : Float; Tr, Ti, Ar, Ai : Float; begin if not IsPowerOfTwo(NumSamples) or (NumSamples < 2) then begin Write('Error in procedure Fourier: NumSamples=', NumSamples); WriteLn(' is not a positive integer power of 2.'); Halt; end; NumBits := NumberOfBitsNeeded(NumSamples); for I := 0 to NumSamples - 1 do begin J := ReverseBits(I, NumBits); RealOut^[J] := RealIn^[I]; ImagOut^[J] := ImagIn^[I]; end; BlockEnd := 1; BlockSize := 2; while BlockSize <= NumSamples do begin Delta_angle := AngleNumerator / BlockSize; Alpha := Sin(0.5 * Delta_angle); Alpha := 2.0 * Alpha * Alpha; Beta := Sin(Delta_angle); I := 0; while I < NumSamples do begin Ar := 1.0; (* cos(0) *) Ai := 0.0; (* sin(0) *) J := I; for N := 0 to BlockEnd - 1 do begin K := J + BlockEnd; Tr := Ar * RealOut^[K] - Ai * ImagOut^[K]; Ti := Ar * ImagOut^[K] + Ai * RealOut^[K]; RealOut^[K] := RealOut^[J] - Tr; ImagOut^[K] := ImagOut^[J] - Ti; RealOut^[J] := RealOut^[J] + Tr; ImagOut^[J] := ImagOut^[J] + Ti; Delta_ar := Alpha * Ar + Beta * Ai; Ai := Ai - (Alpha * Ai - Beta * Ar); Ar := Ar - Delta_ar; Inc(J); end; I := I + BlockSize; end; BlockEnd := BlockSize; BlockSize := BlockSize shl 1; end; end; procedure FFT(NumSamples : Integer; RealIn, ImagIn, RealOut, ImagOut : PVector); begin FourierTransform(2 * PI, NumSamples, RealIn, ImagIn, RealOut, ImagOut); end; procedure IFFT(NumSamples : Integer; RealIn, ImagIn, RealOut, ImagOut : PVector); var I : Integer; begin FourierTransform(- 2 * PI, NumSamples, RealIn, ImagIn, RealOut, ImagOut); { Normalize the resulting time samples } for I := 0 to NumSamples - 1 do begin RealOut^[I] := RealOut^[I] / NumSamples; ImagOut^[I] := ImagOut^[I] / NumSamples; end; end; var RealTemp, ImagTemp : PVector; TempArraySize : Integer; procedure FFT_Integer(NumSamples : Integer; RealIn, ImagIn : PIntVector; RealOut, ImagOut : PVector); var I : Integer; begin if NumSamples > TempArraySize then begin FFT_Integer_Cleanup; { free up memory in case we already have some } DimVector(RealTemp, NumSamples); DimVector(ImagTemp, NumSamples); TempArraySize := NumSamples; end; for I := 0 to NumSamples - 1 do begin RealTemp^[I] := RealIn^[I]; ImagTemp^[I] := ImagIn^[I]; end; FourierTransform(2 * PI, NumSamples, RealTemp, ImagTemp, RealOut, ImagOut); end; procedure FFT_Integer_Cleanup; begin if TempArraySize > 0 then begin if RealTemp <> nil then DelVector(RealTemp, TempArraySize); if ImagTemp <> nil then DelVector(ImagTemp, TempArraySize); TempArraySize := 0; end; end; procedure CalcFrequency(NumSamples, FrequencyIndex : Integer; RealIn, ImagIn : PVector; var RealOut, ImagOut : Float); var K : Integer; Cos1, Cos2, Cos3, Theta, Beta : Float; Sin1, Sin2, Sin3 : Float; begin RealOut := 0.0; ImagOut := 0.0; Theta := 2 * PI * FrequencyIndex / NumSamples; Sin1 := Sin(- 2 * Theta); Sin2 := Sin(- Theta); Cos1 := Cos(- 2 * Theta); Cos2 := Cos(- Theta); Beta := 2 * Cos2; for K := 0 to NumSamples - 1 do begin { Update trig values } Sin3 := Beta * Sin2 - Sin1; Sin1 := Sin2; Sin2 := Sin3; Cos3 := Beta * Cos2 - Cos1; Cos1 := Cos2; Cos2 := Cos3; RealOut := RealOut + RealIn^[K] * Cos3 - ImagIn^[K] * Sin3; ImagOut := ImagOut + ImagIn^[K] * Cos3 + RealIn^[K] * Sin3; end; end; begin { Unit initialization code } MaxPower := Trunc(Log2(MAX_FLT)); { Max power of two } TempArraySize := 0; { flag that buffers RealTemp, RealImag not allocated } RealTemp := nil; ImagTemp := nil; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fmath.pas0000664000175000017500000017161411326434466021366 0ustar michaelmichael{ ********************************************************************** * Unit FMATH.PAS * * Version 2.4 * * (c) J. Debord, June 2001 * ********************************************************************** This unit implements some mathematical functions in Pascal ********************************************************************** Notes: 1) The default real type is DOUBLE (8-byte real). Depending on the compiler, other types may be selected by defining the symbols: ------------------------------------------------------- Symbol Type TP-BP-Delphi FPC GPC ------------------------------------------------------- SINGLEREAL Single X X X PASCALREAL Real X EXTENDEDREAL Extended X X X ------------------------------------------------------- Note: "Real" is equivalent to "Double" in FPC and GPC 2) Error handling: The function MathError returns the error code from the last function evaluation. It must be checked immediately after a function call: Y := f(X); (* f is one of the functions of the library *) if MathError = FN_OK then ... The possible error codes, and the default values attributed to the function, are the following: ------------------------------------------------------------------ Error code Value Significance Function default value ------------------------------------------------------------------ FN_OK 0 No error FN_DOMAIN -1 Argument domain error 0 FN_SING -2 Function singularity +/- MAXNUM FN_OVERFLOW -3 Overflow range error MAXNUM FN_UNDERFLOW -4 Underflow range error 0 ------------------------------------------------------------------ where MAXNUM is a constant defining the highest number which may be represented within the chosen floating point type. The standard functions Exp and Ln have been redefined according to the above conventions as Expo and Log. 3) Assembler functions: some functions are written in assembler. There are two versions: * One for BP 7 or Delphi 1 with a 387, 486 or Pentium processor. This version may be selected by defining the symbol CPU387 * The other for FPC with a Pentium II or Pentium III processor. This version may be selected by defining the symbol CPUP2 Units and programs must be compiled with the options -Si and -Rintel (e.g. ppc386 -Si -Rintel -dCPUP2 fmath) Once you have selected a version you have two possibilities: * Call the Pascal functions (e.g. Expo, ArcSin...). This will provide some acceleration while keeping the error handling. * Call the assembler functions directly (e.g. fExp, fArcSin...) This will provide further acceleration but without error handling. Thus it is the responsibility of the calling program to check the arguments passed to the function. See the interface files MATH387.INT and MATHP2.INT for a list of available functions. ********************************************************************** } unit FMath; interface { ---------------------------------------------------------------------- Floating point type (Default = Double) ---------------------------------------------------------------------- } {$IFDEF __GPC__} {$UNDEF PASCALREAL} {$ENDIF} {$IFDEF FPK} {$UNDEF PASCALREAL} {$ENDIF} {$IFDEF PASCALREAL} {$IFDEF VER120} type Float = Real48; { Delphi 4 } {$ELSE} type Float = Real; {$ENDIF} {$ELSE} {$IFDEF SINGLEREAL} type Float = Single; {$ELSE} {$IFDEF EXTENDEDREAL} type Float = Extended; {$ELSE} {$DEFINE DOUBLEREAL} type Float = Double; {$ENDIF} {$ENDIF} {$ENDIF} { ---------------------------------------------------------------------- Mathematical constants ---------------------------------------------------------------------- } const PI = 3.14159265358979323846; { Pi } LN2 = 0.69314718055994530942; { Ln(2) } LN10 = 2.30258509299404568402; { Ln(10) } LNPI = 1.14472988584940017414; { Ln(Pi) } INVLN2 = 1.44269504088896340736; { 1/Ln(2) } INVLN10 = 0.43429448190325182765; { 1/Ln(10) } TWOPI = 6.28318530717958647693; { 2*Pi } PIDIV2 = 1.57079632679489661923; { Pi/2 } SQRTPI = 1.77245385090551602730; { Sqrt(Pi) } SQRT2PI = 2.50662827463100050242; { Sqrt(2*Pi) } INVSQRT2PI = 0.39894228040143267794; { 1/Sqrt(2*Pi) } LNSQRT2PI = 0.91893853320467274178; { Ln(Sqrt(2*Pi)) } LN2PIDIV2 = 0.91893853320467274178; { Ln(2*Pi)/2 } SQRT2 = 1.41421356237309504880; { Sqrt(2) } SQRT2DIV2 = 0.70710678118654752440; { Sqrt(2)/2 } GOLD = 1.61803398874989484821; { Golden Mean = (1 + Sqrt(5))/2 } CGOLD = 0.38196601125010515179; { 2 - GOLD } { ---------------------------------------------------------------------- Machine-dependent constants ---------------------------------------------------------------------- } {$IFDEF SINGLEREAL} const MACHEP = 1.192093E-7; { Floating point precision: 2^(-23) } MAXNUM = 3.402823E+38; { Max. floating point number: 2^128 } MINNUM = 1.175495E-38; { Min. floating point number: 2^(-126) } MAXLOG = 88.72283; { Max. argument for Exp = Ln(MAXNUM) } MINLOG = -87.33655; { Min. argument for Exp = Ln(MINNUM) } MAXFAC = 33; { Max. argument for Factorial } MAXGAM = 34.648; { Max. argument for Gamma } MAXLGM = 1.0383E+36; { Max. argument for LnGamma } {$ELSE} {$IFDEF DOUBLEREAL} const MACHEP = 2.220446049250313E-16; { 2^(-52) } MAXNUM = 1.797693134862315E+308; { 2^1024 } MINNUM = 2.225073858507202E-308; { 2^(-1022) } MAXLOG = 709.7827128933840; MINLOG = -708.3964185322641; MAXFAC = 170; MAXGAM = 171.624376956302; MAXLGM = 2.556348E+305; {$ELSE} {$IFDEF EXTENDEDREAL} const MACHEP = 1.08420217248550444E-19; { 2^(-63) } MAXNUM = 1.18973149535723103E+4932; { 2^16384 } MINNUM = 3.36210314311209558E-4932; { 2^(-16382) } MAXLOG = 11356.5234062941439; MINLOG = - 11355.137111933024; MAXFAC = 1754; MAXGAM = 1755.455; MAXLGM = 1.04848146839019521E+4928; {$ELSE} {$IFDEF PASCALREAL} const MACHEP = 1.818989404E-12; { 2^(-39) } MAXNUM = 4.253529586E+37; { 2^126 } MINNUM = 2.350988703E-38; { 2^(-125) } MAXLOG = 8.664339757E+01; MINLOG = - 4.253529586E+01; MAXFAC = 33; MAXGAM = 34.64809785; MAXLGM = 1.038324114E+36; {$ENDIF} {$ENDIF} {$ENDIF} {$ENDIF} { ---------------------------------------------------------------------- Error codes for mathematical functions ---------------------------------------------------------------------- } const FN_OK = 0; { No error } FN_DOMAIN = - 1; { Argument domain error } FN_SING = - 2; { Function singularity } FN_OVERFLOW = - 3; { Overflow range error } FN_UNDERFLOW = - 4; { Underflow range error } FN_TLOSS = - 5; { Total loss of precision } FN_PLOSS = - 6; { Partial loss of precision } { ---------------------------------------------------------------------- Global variables and constants ---------------------------------------------------------------------- } const NFACT = 33; { The factorials of the first NFACT integers are stored in a table } var MathErr : Integer; { Error code from the latest function evaluation } FactArray : array[0..NFACT] of Float; { Table of factorials } { ---------------------------------------------------------------------- Functional type ---------------------------------------------------------------------- } type TFunc = function(X : Float) : Float; { ---------------------------------------------------------------------- Error handling function ---------------------------------------------------------------------- } function MathError : Integer; { Error code from the last function call } { ---------------------------------------------------------------------- Minimum, maximum, sign and exchange ---------------------------------------------------------------------- } function FMin(X, Y : Float) : Float; { Minimum of 2 reals } function FMax(X, Y : Float) : Float; { Maximum of 2 reals } function IMin(X, Y : Integer) : Integer; { Minimum of 2 integers } function IMax(X, Y : Integer) : Integer; { Maximum of 2 integers } function Sgn(X : Float) : Integer; { Sign (returns 1 if X = 0) } function Sgn0(X : Float) : Integer; { Sign (returns 0 if X = 0) } procedure FSwap(var X, Y : Float); { Exchange 2 reals } procedure ISwap(var X, Y : Integer); { Exchange 2 integers } { ---------------------------------------------------------------------- Assembler functions ---------------------------------------------------------------------- } {$IFDEF CPU387} {$UNDEF CPUP2} {$I MATH387.INT} {$ENDIF} {$IFDEF CPUP2} {$UNDEF CPU387} {$I MATHP2.INT} {$ENDIF} { ---------------------------------------------------------------------- Sign, logarithms, exponentials and power ---------------------------------------------------------------------- } function Expo(X : Float) : Float; { Exponential } function Exp2(X : Float) : Float; { 2^X } function Exp10(X : Float) : Float; { 10^X } function Log(X : Float) : Float; { Natural log } function Log2(X : Float) : Float; { Log, base 2 } function Log10(X : Float) : Float; { Decimal log } function LogA(X, A : Float) : Float; { Log, base A } function IntPower(X : Float; N : Integer) : Float; { X^N } function Power(X, Y : Float) : Float; { X^Y, X >= 0 } function Pythag(X, Y : Float) : Float; { Sqrt(X^2 + Y^2) } { ---------------------------------------------------------------------- Trigonometric and inverse trigonometric functions ---------------------------------------------------------------------- } function FixAngle(Theta : Float) : Float; { Set Theta in -Pi..Pi } function Tan(X : Float) : Float; { Tangent } function ArcSin(X : Float) : Float; { Arc sinus } function ArcCos(X : Float) : Float; { Arc cosinus } function ArcTan2(Y, X : Float) : Float; { Angle (Ox, OM) with M(X,Y) } procedure SinCos(X : Float; var SinX, CosX : Float); { Sin & Cos } { ---------------------------------------------------------------------- Hyperbolic and inverse hyperbolic functions ---------------------------------------------------------------------- } function Sinh(X : Float) : Float; { Hyperbolic sine } function Cosh(X : Float) : Float; { Hyperbolic cosine } function Tanh(X : Float) : Float; { Hyperbolic tangent } function ArcSinh(X : Float) : Float; { Inverse hyperbolic sine } function ArcCosh(X : Float) : Float; { Inverse hyperbolic cosine } function ArcTanh(X : Float) : Float; { Inverse hyperbolic tangent } procedure SinhCosh(X : Float; var SinhX, CoshX : Float); { Sinh & Cosh } { ---------------------------------------------------------------------- Special functions ---------------------------------------------------------------------- } function Fact(N : Integer) : Float; { Factorial } function Binomial(N, K : Integer) : Float; { Binomial coef. C(N,K) } function Gamma(X : Float) : Float; { Gamma function } function SgnGamma(X : Float) : Integer; { Sign of Gamma function } function LnGamma(X : Float) : Float; { Log(|Gamma(X)|) } function IGamma(A, X : Float) : Float; { Incomplete Gamma function } function JGamma(A, X : Float) : Float; { Complement of IGamma } function Beta(X, Y : Float) : Float; { Beta function } function IBeta(A, B, X : Float) : Float; { Incomplete Beta function } function Erf(X : Float) : Float; { Error function } function Erfc(X : Float) : Float; { Complement of Erf } { ---------------------------------------------------------------------- Binomial distribution with probability P and number of repetitions N ---------------------------------------------------------------------- } function PBinom(N : Integer; P : Float; K : Integer) : Float; { Prob(X = K) } function FBinom(N : Integer; P : Float; K : Integer) : Float; { Prob(X <= K) } { ---------------------------------------------------------------------- Poisson distribution with mean Mu ---------------------------------------------------------------------- } function PPoisson(Mu : Float; K : Integer) : Float; { Prob(X = K) } function FPoisson(Mu : Float; K : Integer) : Float; { Prob(X <= K) } { ---------------------------------------------------------------------- Standard normal distribution ---------------------------------------------------------------------- } function DNorm(X : Float) : Float; { Density of standard normal } function FNorm(X : Float) : Float; { Prob(U <= X) } function PNorm(X : Float) : Float; { Prob(|U| >= |X|) } function InvNorm(P : Float) : Float; { Inverse of FNorm : returns X such that Prob(U <= X) = P} { ---------------------------------------------------------------------- Student distribution with Nu d.o.f. ---------------------------------------------------------------------- } function DStudent(Nu : Integer; X : Float) : Float; { Density of t } function FStudent(Nu : Integer; X : Float) : Float; { Prob(t <= X) } function PStudent(Nu : Integer; X : Float) : Float; { Prob(|t| >= |X|) } { ---------------------------------------------------------------------- Khi-2 distribution with Nu d.o.f. ---------------------------------------------------------------------- } function DKhi2(Nu : Integer; X : Float) : Float; { Density of Khi2 } function FKhi2(Nu : Integer; X : Float) : Float; { Prob(Khi2 <= X) } function PKhi2(Nu : Integer; X : Float) : Float; { Prob(Khi2 >= X) } { ---------------------------------------------------------------------- Fisher-Snedecor distribution with Nu1 and Nu2 d.o.f. ---------------------------------------------------------------------- } function DSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; { Density of F } function FSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; { Prob(F <= X) } function PSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; { Prob(F >= X) } { ---------------------------------------------------------------------- Exponential distribution ---------------------------------------------------------------------- } function DExpo(A, X : Float) : Float; { Density of exponential distrib. } function FExpo(A, X : Float) : Float; { Prob( <= X) } { ---------------------------------------------------------------------- Beta distribution ---------------------------------------------------------------------- } function DBeta(A, B, X : Float) : Float; { Density of Beta distribution } function FBeta(A, B, X : Float) : Float; { Prob( <= X) } { ---------------------------------------------------------------------- Gamma distribution ---------------------------------------------------------------------- } function DGamma(A, B, X : Float) : Float; { Density of Gamma distribution } function FGamma(A, B, X : Float) : Float; { Prob( <= X) } { ---------------------------------------------------------------------- Random numbers ---------------------------------------------------------------------- } procedure RMarIn(Seed1, Seed2 : Integer); { Initializes the random number generator. The default initialization corresponds to RMarIn(1802, 9373) } function IRanMar : LongInt; { Returns a 32 bit random number in [ -2,147,483,648 ; 2,147,483,647 ] } function RanMar : Float; { Returns a random number in [0, 1[ } function RanGaussStd : Float; { Returns a random number from the standard normal distribution (i.e. the Gaussian distribution with zero mean and unit variance) } function RanGauss(Mu, Sigma : Float) : Float; { Returns a random number from a Gaussian distribution with mean Mu and standard deviation Sigma } { ********************************************************************** } implementation { ---------------------------------------------------------------------- Error handling functions ---------------------------------------------------------------------- } function DefaultVal(ErrCode : Integer) : Float; { Sets the global variable MathErr and the function default value according to the error code } begin MathErr := ErrCode; case ErrCode of FN_DOMAIN : DefaultVal := 0.0; FN_SING : DefaultVal := MAXNUM; FN_OVERFLOW : DefaultVal := MAXNUM; FN_UNDERFLOW : DefaultVal := 0.0; else DefaultVal := 0.0; end; end; function MathError : Integer; begin MathError := MathErr; end; { ---------------------------------------------------------------------- Minimum, maximum and sign ---------------------------------------------------------------------- } function FMin(X, Y : Float) : Float; begin if X <= Y then FMin := X else FMin := Y; end; function FMax(X, Y : Float) : Float; begin if X >= Y then FMax := X else FMax := Y; end; function IMin(X, Y : Integer) : Integer; begin if X <= Y then IMin := X else IMin := Y; end; function IMax(X, Y : Integer) : Integer; begin if X >= Y then IMax := X else IMax := Y; end; procedure FSwap(var X, Y : Float); var Temp : Float; begin Temp := X; X := Y; Y := Temp; end; procedure ISwap(var X, Y : Integer); var Temp : Integer; begin Temp := X; X := Y; Y := Temp; end; function Sgn(X : Float) : Integer; begin if X >= 0.0 then Sgn := 1 else Sgn := - 1; end; function Sgn0(X : Float) : Integer; begin if X > 0.0 then Sgn0 := 1 else if X = 0.0 then Sgn0 := 0 else Sgn0 := - 1; end; { ---------------------------------------------------------------------- Assembler functions ---------------------------------------------------------------------- } {$IFDEF CPU387} {$I MATH387.INC} {$DEFINE USE_ASM} {$ENDIF} {$IFDEF CPUP2} {$I MATHP2.INC} {$DEFINE USE_ASM} {$ENDIF} { ---------------------------------------------------------------------- Elementary functions ---------------------------------------------------------------------- } function Expo(X : Float) : Float; begin MathErr := FN_OK; if X < MINLOG then Expo := DefaultVal(FN_UNDERFLOW) else if X > MAXLOG then Expo := DefaultVal(FN_OVERFLOW) else Expo := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(X); end; function Exp2(X : Float) : Float; var XLn2 : Float; begin MathErr := FN_OK; XLn2 := X * LN2; if XLn2 < MINLOG then Exp2 := DefaultVal(FN_UNDERFLOW) else if XLn2 > MAXLOG then Exp2 := DefaultVal(FN_OVERFLOW) else Exp2 := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(XLn2); end; function Exp10(X : Float) : Float; var XLn10 : Float; begin MathErr := FN_OK; XLn10 := X * LN10; if XLn10 < MINLOG then Exp10 := DefaultVal(FN_UNDERFLOW) else if XLn10 > MAXLOG then Exp10 := DefaultVal(FN_OVERFLOW) else Exp10 := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(XLn10); end; function Log(X : Float) : Float; begin MathErr := FN_OK; if X < 0.0 then Log := DefaultVal(FN_DOMAIN) else if X = 0.0 then Log := DefaultVal(FN_SING) else Log := {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X); end; function Log10(X : Float) : Float; begin MathErr := FN_OK; if X < 0.0 then Log10 := DefaultVal(FN_DOMAIN) else if X = 0.0 then Log10 := DefaultVal(FN_SING) else Log10 := {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X) * INVLN10; end; function Log2(X : Float) : Float; begin MathErr := FN_OK; if X < 0.0 then Log2 := DefaultVal(FN_DOMAIN) else if X = 0.0 then Log2 := DefaultVal(FN_SING) else Log2 := {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X) * INVLN2; end; function LogA(X, A : Float) : Float; begin MathErr := FN_OK; if (X < 0.0) or (A <= 0.0) or (A = 1.0) then LogA := DefaultVal(FN_DOMAIN) else if X = 0.0 then LogA := Sgn(1.0 - A) * DefaultVal(FN_SING) else {$IFDEF USE_ASM} LogA := fLn(X) / fLn(A); {$ELSE} LogA := Ln(X) / Ln(A); {$ENDIF} end; function IntPower(X : Float; N : Integer) : Float; { Computes X^N by repeated multiplications } var M : Integer; T : Float; begin MathErr := FN_OK; if X = 0.0 then begin if N = 0 then { 0^0 = lim x^x = 1 } IntPower := 1.0 { x->0 } else if N > 0 then IntPower := 0.0 { 0^N = 0 } else IntPower := DefaultVal(FN_SING); Exit; end; if N = 0 then begin IntPower := 1.0; Exit; end; { Legendre's algorithm for minimizing the number of multiplications } T := 1.0; M := Abs(N); repeat if Odd(M) then begin Dec(M); T := T * X; end else begin M := M div 2; X := Sqr(X); end; until M = 0; if N > 0 then IntPower := T else IntPower := 1.0 / T; end; function Power(X, Y : Float) : Float; { Computes X^Y = Exp(Y * Ln(X)), for X >= 0 } var YLnX : Float; begin MathErr := FN_OK; if X < 0.0 then begin Power := DefaultVal(FN_DOMAIN); Exit; end; if X = 0.0 then begin if Y = 0.0 then { 0^0 = lim x^x = 1 } Power := 1.0 { x->0 } else if Y > 0.0 then Power := 0.0 { 0^Y = 0 } else Power := DefaultVal(FN_SING); Exit; end; if Y = 0.0 then begin Power := 1.0; Exit; end; YLnX := Y * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X); if YLnX < MINLOG then Power := DefaultVal(FN_UNDERFLOW) else if YLnX > MAXLOG then Power := DefaultVal(FN_OVERFLOW) else Power := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(YLnX); end; function Pythag(X, Y : Float) : Float; { Computes Sqrt(X^2 + Y^2) without destructive underflow or overflow } var AbsX, AbsY : Float; begin MathErr := FN_OK; AbsX := Abs(X); AbsY := Abs(Y); if AbsX > AbsY then Pythag := AbsX * Sqrt(1.0 + Sqr(AbsY / AbsX)) else if AbsY = 0.0 then Pythag := 0.0 else Pythag := AbsY * Sqrt(1.0 + Sqr(AbsX / AbsY)); end; procedure SinCos(X : Float; var SinX, CosX : Float); begin MathErr := FN_OK; SinX := {$IFDEF USE_ASM}fSin{$ELSE}Sin{$ENDIF}(X); CosX := {$IFDEF USE_ASM}fCos{$ELSE}Cos{$ENDIF}(X); end; function FixAngle(Theta : Float) : Float; begin MathErr := FN_OK; while Theta > PI do Theta := Theta - TWOPI; while Theta <= - PI do Theta := Theta + TWOPI; FixAngle := Theta; end; function Tan(X : Float) : Float; var SinX, CosX : Float; begin MathErr := FN_OK; SinX := {$IFDEF USE_ASM}fSin{$ELSE}Sin{$ENDIF}(X); CosX := {$IFDEF USE_ASM}fCos{$ELSE}Cos{$ENDIF}(X); if CosX = 0.0 then Tan := Sgn(SinX) * DefaultVal(FN_SING) else Tan := SinX / CosX; end; function ArcSin(X : Float) : Float; begin MathErr := FN_OK; if (X < - 1.0) or (X > 1.0) then ArcSin := DefaultVal(FN_DOMAIN) else if X = 1.0 then ArcSin := PIDIV2 else if X = - 1.0 then ArcSin := - PIDIV2 else ArcSin := {$IFDEF USE_ASM}fArcTan{$ELSE}ArcTan{$ENDIF}(X / Sqrt(1.0 - Sqr(X))); end; function ArcCos(X : Float) : Float; begin MathErr := FN_OK; if (X < - 1.0) or (X > 1.0) then ArcCos := DefaultVal(FN_DOMAIN) else if X = 1.0 then ArcCos := 0.0 else if X = - 1.0 then ArcCos := PI else ArcCos := PIDIV2 - {$IFDEF USE_ASM}fArcTan{$ELSE}ArcTan{$ENDIF}(X / Sqrt(1.0 - Sqr(X))); end; function ArcTan2(Y, X : Float) : Float; var Theta : Float; begin MathErr := FN_OK; if X = 0.0 then if Y = 0.0 then ArcTan2 := 0.0 else if Y > 0.0 then ArcTan2 := PIDIV2 else ArcTan2 := - PIDIV2 else begin { 4th/1st quadrant -PI/2..PI/2 } Theta := {$IFDEF USE_ASM}fArcTan{$ELSE}ArcTan{$ENDIF}(Y / X); { 2nd/3rd quadrants } if X < 0.0 then if Y >= 0.0 then Theta := Theta + PI { 2nd quadrant: PI/2..PI } else Theta := Theta - PI; { 3rd quadrant: -PI..-PI/2 } ArcTan2 := Theta; end; end; { ---------------------------------------------------------------------- Hyperbolic functions ---------------------------------------------------------------------- } function Sinh(X : Float) : Float; var ExpX : Float; begin MathErr := FN_OK; if (X < MINLOG) or (X > MAXLOG) then Sinh := Sgn(X) * DefaultVal(FN_OVERFLOW) else begin ExpX := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(X); Sinh := 0.5 * (ExpX - 1.0 / ExpX); end; end; function Cosh(X : Float) : Float; var ExpX : Float; begin MathErr := FN_OK; if (X < MINLOG) or (X > MAXLOG) then Cosh := DefaultVal(FN_OVERFLOW) else begin ExpX := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(X); Cosh := 0.5 * (ExpX + 1.0 / ExpX); end; end; procedure SinhCosh(X : Float; var SinhX, CoshX : Float); var ExpX, ExpMinusX : Float; begin MathErr := FN_OK; if (X < MINLOG) or (X > MAXLOG) then begin CoshX := DefaultVal(FN_OVERFLOW); SinhX := Sgn(X) * CoshX; end else begin ExpX := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(X); ExpMinusX := 1.0 / ExpX; SinhX := 0.5 * (ExpX - ExpMinusX); CoshX := 0.5 * (ExpX + ExpMinusX); end; end; function Tanh(X : Float) : Float; var SinhX, CoshX : Float; begin SinhCosh(X, SinhX, CoshX); Tanh := SinhX / CoshX; end; function ArcSinh(X : Float) : Float; begin MathErr := FN_OK; ArcSinh := {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X + Sqrt(Sqr(X) + 1.0)); end; function ArcCosh(X : Float) : Float; begin MathErr := FN_OK; if X < 1.0 then ArcCosh := DefaultVal(FN_DOMAIN) else ArcCosh := {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X + Sqrt(Sqr(X) - 1.0)); end; function ArcTanh(X : Float) : Float; begin MathErr := FN_OK; if (X < - 1.0) or (X > 1.0) then ArcTanh := DefaultVal(FN_DOMAIN) else if (X = - 1.0) or (X = 1.0) then ArcTanh := Sgn(X) * DefaultVal(FN_SING) else ArcTanh := 0.5 * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}((1.0 + X) / (1.0 - X)); end; { ---------------------------------------------------------------------- Special functions (translated from Cephes math library by S. Moshier: http://www.netlib.org/cephes) ---------------------------------------------------------------------- } const { Used by IGamma and IBeta } BIG = 9.223372036854775808E18; BIGINV = 1.084202172485504434007E-19; type TabCoef = array[0..9] of Float; function PolEvl(var X : Float; var Coef : TabCoef; N : Integer) : Float; { ---------------------------------------------------------------------- Evaluates polynomial of degree N: 2 N y = C + C x + C x +...+ C x 0 1 2 N Coefficients are stored in reverse order: Coef[0] = C , ..., Coef[N] = C N 0 The function P1Evl() assumes that Coef[N] = 1.0 and is omitted from the array. Its calling arguments are otherwise the same as PolEvl(). ---------------------------------------------------------------------- } var Ans : Float; I : Integer; begin Ans := Coef[0]; for I := 1 to N do Ans := Ans * X + Coef[I]; PolEvl := Ans; end; function P1Evl(var X : Float; var Coef : TabCoef; N : Integer) : Float; { ---------------------------------------------------------------------- Evaluate polynomial when coefficient of X is 1.0. Otherwise same as PolEvl. ---------------------------------------------------------------------- } var Ans : Float; I : Integer; begin Ans := X + Coef[0]; for I := 1 to N - 1 do Ans := Ans * X + Coef[I]; P1Evl := Ans; end; function SgnGamma(X : Float) : Integer; begin if X > 0.0 then SgnGamma := 1 else if Odd(Trunc(Abs(X))) then SgnGamma := 1 else SgnGamma := - 1; end; function Stirf(X : Float) : Float; { Stirling's formula for the gamma function Gamma(x) = Sqrt(2*Pi) x^(x-.5) exp(-x) (1 + 1/x P(1/x)) where P(x) is a polynomial } const STIR : TabCoef = ( 7.147391378143610789273E-4, - 2.363848809501759061727E-5, - 5.950237554056330156018E-4, 6.989332260623193171870E-5, 7.840334842744753003862E-4, - 2.294719747873185405699E-4, - 2.681327161876304418288E-3, 3.472222222230075327854E-3, 8.333333333333331800504E-2, 0); var W, P : Float; begin W := 1.0 / X; if X > 1024.0 then begin P := 6.97281375836585777429E-5 * W + 7.84039221720066627474E-4; P := P * W - 2.29472093621399176955E-4; P := P * W - 2.68132716049382716049E-3; P := P * W + 3.47222222222222222222E-3; P := P * W + 8.33333333333333333333E-2; end else P := PolEvl(W, STIR, 8); {$IFDEF USE_ASM} Stirf := SQRT2PI * fExp((X - 0.5) * fLn(X) - X) * (1.0 + W * P); {$ELSE} Stirf := SQRT2PI * Exp((X - 0.5) * Ln(X) - X) * (1.0 + W * P); {$ENDIF} end; function GamSmall(X1, Z : Float) : Float; { Gamma function for small values of the argument } const S : TabCoef = ( - 1.193945051381510095614E-3, 7.220599478036909672331E-3, - 9.622023360406271645744E-3, - 4.219773360705915470089E-2, 1.665386113720805206758E-1, - 4.200263503403344054473E-2, - 6.558780715202540684668E-1, 5.772156649015328608253E-1, 1.000000000000000000000E0, 0); SN : TabCoef = ( 1.133374167243894382010E-3, 7.220837261893170325704E-3, 9.621911155035976733706E-3, - 4.219773343731191721664E-2, - 1.665386113944413519335E-1, - 4.200263503402112910504E-2, 6.558780715202536547116E-1, 5.772156649015328608727E-1, - 1.000000000000000000000E0, 0); var P : Float; begin if X1 = 0.0 then begin GamSmall := DefaultVal(FN_SING); Exit; end; if X1 < 0.0 then begin X1 := - X1; P := PolEvl(X1, SN, 8); end else P := PolEvl(X1, S, 8); GamSmall := Z / (X1 * P); end; function StirfL(X : Float) : Float; { Approximate Ln(Gamma) by Stirling's formula, for X >= 13 } const P : TabCoef = ( 4.885026142432270781165E-3, - 1.880801938119376907179E-3, 8.412723297322498080632E-4, - 5.952345851765688514613E-4, 7.936507795855070755671E-4, - 2.777777777750349603440E-3, 8.333333333333331447505E-2, 0, 0, 0); var Q, W : Float; begin Q := {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X) * (X - 0.5) - X; Q := Q + LNSQRT2PI; if X > 1.0E+10 then StirfL := Q else begin W := 1.0 / Sqr(X); StirfL := Q + PolEvl(W, P, 6) / X; end; end; function Gamma(X : Float) : Float; const P : TabCoef = ( 4.212760487471622013093E-5, 4.542931960608009155600E-4, 4.092666828394035500949E-3, 2.385363243461108252554E-2, 1.113062816019361559013E-1, 3.629515436640239168939E-1, 8.378004301573126728826E-1, 1.000000000000000000009E0, 0, 0); Q : TabCoef = ( - 1.397148517476170440917E-5, 2.346584059160635244282E-4, - 1.237799246653152231188E-3, - 7.955933682494738320586E-4, 2.773706565840072979165E-2, - 4.633887671244534213831E-2, - 2.243510905670329164562E-1, 4.150160950588455434583E-1, 9.999999999999999999908E-1, 0); var SgnGam, N : Integer; A, X1, Z : Float; begin MathErr := FN_OK; SgnGam := SgnGamma(X); if (X = 0.0) or ((X < 0.0) and (Frac(X) = 0.0)) then begin Gamma := SgnGam * DefaultVal(FN_SING); Exit; end; if X > MAXGAM then begin Gamma := DefaultVal(FN_OVERFLOW); Exit; end; A := Abs(X); if A > 13.0 then begin if X < 0.0 then begin N := Trunc(A); Z := A - N; if Z > 0.5 then begin N := N + 1; Z := A - N; end; Z := Abs(A * {$IFDEF USE_ASM}fSin{$ELSE}Sin{$ENDIF}(PI * Z)) * Stirf(A); if Z <= PI / MAXNUM then begin Gamma := SgnGam * DefaultVal(FN_OVERFLOW); Exit; end; Z := PI / Z; end else Z := Stirf(X); Gamma := SgnGam * Z; end else begin Z := 1.0; X1 := X; while X1 >= 3.0 do begin X1 := X1 - 1.0; Z := Z * X1; end; while X1 < - 0.03125 do begin Z := Z / X1; X1 := X1 + 1.0; end; if X1 <= 0.03125 then Gamma := GamSmall(X1, Z) else begin while X1 < 2.0 do begin Z := Z / X1; X1 := X1 + 1.0; end; if (X1 = 2.0) or (X1 = 3.0) then Gamma := Z else begin X1 := X1 - 2.0; Gamma := Z * PolEvl(X1, P, 7) / PolEvl(X1, Q, 8); end; end; end; end; function LnGamma(X : Float) : Float; const P : TabCoef = ( - 2.163690827643812857640E3, - 8.723871522843511459790E4, - 1.104326814691464261197E6, - 6.111225012005214299996E6, - 1.625568062543700591014E7, - 2.003937418103815175475E7, - 8.875666783650703802159E6, 0, 0, 0); Q : TabCoef = ( - 5.139481484435370143617E2, - 3.403570840534304670537E4, - 6.227441164066219501697E5, - 4.814940379411882186630E6, - 1.785433287045078156959E7, - 3.138646407656182662088E7, - 2.099336717757895876142E7, 0, 0, 0); var N : Integer; A, X1, Z : Float; begin MathErr := FN_OK; if (X = 0.0) or ((X < 0.0) and (Frac(X) = 0.0)) then begin LnGamma := DefaultVal(FN_SING); Exit; end; if X > MAXLGM then begin LnGamma := DefaultVal(FN_OVERFLOW); Exit; end; A := Abs(X); if A > 34.0 then begin if X < 0.0 then begin N := Trunc(A); Z := A - N; if Z > 0.5 then begin N := N + 1; Z := N - A; end; Z := A * {$IFDEF USE_ASM}fSin{$ELSE}Sin{$ENDIF}(PI * Z); if Z = 0.0 then begin LnGamma := DefaultVal(FN_OVERFLOW); Exit; end; Z := LNPI - {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(Z) - StirfL(A); end else Z := StirfL(X); LnGamma := Z; end else if X < 13.0 then begin Z := 1.0; X1 := X; while X1 >= 3 do begin X1 := X1 - 1.0; Z := Z * X1; end; while X1 < 2.0 do begin if Abs(X1) <= 0.03125 then begin LnGamma := {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(Abs(GamSmall(X1, Z))); Exit; end; Z := Z / X1; X1 := X1 + 1.0; end; if Z < 0.0 then Z := - Z; if X1 = 2.0 then LnGamma := {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(Z) else begin X1 := X1 - 2.0; LnGamma := X1 * PolEvl(X1, P, 6) / P1Evl(X1, Q, 7) + {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(Z); end; end else LnGamma := StirfL(X); end; function IGamma(A, X : Float) : Float; var Ans, Ax, C, R : Float; begin MathErr := FN_OK; if (X <= 0.0) or (A <= 0.0) then begin IGamma := 0.0; Exit; end; if (X > 1.0) and (X > A) then begin IGamma := 1.0 - JGamma(A, X); Exit; end; Ax := A * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X) - X - LnGamma(A); if Ax < MINLOG then begin IGamma := DefaultVal(FN_UNDERFLOW); Exit; end; Ax := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(Ax); { power series } R := A; C := 1.0; Ans := 1.0; repeat R := R + 1.0; C := C * X / R; Ans := Ans + C; until C / Ans <= MACHEP; IGamma := Ans * Ax / A; end; function JGamma(A, X : Float) : Float; var Ans, C, Yc, Ax, Y, Z, R, T, Pk, Pkm1, Pkm2, Qk, Qkm1, Qkm2 : Float; begin MathErr := FN_OK; if (X <= 0.0) or (A <= 0.0) then begin JGamma := 1.0; Exit; end; if (X < 1.0) or (X < A) then begin JGamma := 1.0 - IGamma(A, X); Exit; end; Ax := A * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X) - X - LnGamma(A); if Ax < MINLOG then begin JGamma := DefaultVal(FN_UNDERFLOW); Exit; end; Ax := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(Ax); { continued fraction } Y := 1.0 - A; Z := X + Y + 1.0; C := 0.0; Pkm2 := 1.0; Qkm2 := X; Pkm1 := X + 1.0; Qkm1 := Z * X; Ans := Pkm1 / Qkm1; repeat C := C + 1.0; Y := Y + 1.0; Z := Z + 2.0; Yc := Y * C; Pk := Pkm1 * Z - Pkm2 * Yc; Qk := Qkm1 * Z - Qkm2 * Yc; if Qk <> 0.0 then begin R := Pk / Qk; T := Abs((Ans - R) / R); Ans := R; end else T := 1.0; Pkm2 := Pkm1; Pkm1 := Pk; Qkm2 := Qkm1; Qkm1 := Qk; if Abs(Pk) > BIG then begin Pkm2 := Pkm2 / BIG; Pkm1 := Pkm1 / BIG; Qkm2 := Qkm2 / BIG; Qkm1 := Qkm1 / BIG; end; until T <= MACHEP; JGamma := Ans * Ax; end; function Fact(N : Integer) : Float; begin MathErr := FN_OK; if N < 0 then Fact := DefaultVal(FN_DOMAIN) else if N > MAXFAC then Fact := DefaultVal(FN_OVERFLOW) else if N <= NFACT then Fact := FactArray[N] else Fact := Gamma(N + 1); end; function Binomial(N, K : Integer) : Float; var I, N1 : Integer; Prod : Float; begin MathErr := FN_OK; if K < 0 then Binomial := 0.0 else if (K = 0) or (K = N) then Binomial := 1.0 else if (K = 1) or (K = N - 1) then Binomial := N else begin if K > N - K then K := N - K; N1 := Succ(N); Prod := N; for I := 2 to K do Prod := Prod * (Int(N1 - I) / Int(I)); Binomial := Int(0.5 + Prod); end; end; function Beta(X, Y : Float) : Float; { Computes Beta(X, Y) = Gamma(X) * Gamma(Y) / Gamma(X + Y) } var Lx, Ly, Lxy : Float; SgnBeta : Integer; begin MathErr := FN_OK; SgnBeta := SgnGamma(X) * SgnGamma(Y) * SgnGamma(X + Y); Lxy := LnGamma(X + Y); if MathErr <> FN_OK then begin Beta := 0.0; Exit; end; Lx := LnGamma(X); if MathErr <> FN_OK then begin Beta := SgnBeta * MAXNUM; Exit; end; Ly := LnGamma(Y); if MathErr <> FN_OK then begin Beta := SgnBeta * MAXNUM; Exit; end; Beta := SgnBeta * {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(Lx + Ly - Lxy); end; function PSeries(A, B, X : Float) : Float; { Power series for incomplete beta integral. Use when B*X is small } var S, T, U, V, T1, Z, Ai : Float; N : Integer; begin Ai := 1.0 / A; U := (1.0 - B) * X; V := U / (A + 1.0); T1 := V; T := U; N := 2; S := 0.0; Z := MACHEP * Ai; while Abs(V) > Z do begin U := (N - B) * X / N; T := T * U; V := T / (A + N); S := S + V; N := N + 1; end; S := S + T1; S := S + Ai; U := A * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X); if (A + B < MAXGAM) and (Abs(U) < MAXLOG) then begin T := Gamma(A + B) / (Gamma(A) * Gamma(B)); S := S * T * Power(X, A); end else begin T := LnGamma(A + B) - LnGamma(A) - LnGamma(B) + U + {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(S); if T < MINLOG then S := 0.0 else S := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(T); end; PSeries := S; end; function CFrac1(A, B, X : Float) : Float; { Continued fraction expansion #1 for incomplete beta integral } var Xk, Pk, Pkm1, Pkm2, Qk, Qkm1, Qkm2, K1, K2, K3, K4, K5, K6, K7, K8, R, T, Ans, Thresh : Float; N : Integer; label CDone; begin K1 := A; K2 := A + B; K3 := A; K4 := A + 1.0; K5 := 1.0; K6 := B - 1.0; K7 := K4; K8 := A + 2.0; Pkm2 := 0.0; Qkm2 := 1.0; Pkm1 := 1.0; Qkm1 := 1.0; Ans := 1.0; R := 1.0; N := 0; Thresh := 3.0 * MACHEP; repeat Xk := - (X * K1 * K2) / (K3 * K4); Pk := Pkm1 + Pkm2 * Xk; Qk := Qkm1 + Qkm2 * Xk; Pkm2 := Pkm1; Pkm1 := Pk; Qkm2 := Qkm1; Qkm1 := Qk; Xk := (X * K5 * K6) / (K7 * K8); Pk := Pkm1 + Pkm2 * Xk; Qk := Qkm1 + Qkm2 * Xk; Pkm2 := Pkm1; Pkm1 := Pk; Qkm2 := Qkm1; Qkm1 := Qk; if Qk <> 0.0 then R := Pk / Qk; if R <> 0.0 then begin T := Abs((Ans - R) / R); Ans := R; end else T := 1.0; if T < Thresh then goto CDone; K1 := K1 + 1.0; K2 := K2 + 1.0; K3 := K3 + 2.0; K4 := K4 + 2.0; K5 := K5 + 1.0; K6 := K6 - 1.0; K7 := K7 + 2.0; K8 := K8 + 2.0; if Abs(Qk) + Abs(Pk) > BIG then begin Pkm2 := Pkm2 * BIGINV; Pkm1 := Pkm1 * BIGINV; Qkm2 := Qkm2 * BIGINV; Qkm1 := Qkm1 * BIGINV; end; if (Abs(Qk) < BIGINV) or (Abs(Pk) < BIGINV) then begin Pkm2 := Pkm2 * BIG; Pkm1 := Pkm1 * BIG; Qkm2 := Qkm2 * BIG; Qkm1 := Qkm1 * BIG; end; N := N + 1; until N > 400; MathErr := FN_PLOSS; CDone: CFrac1 := Ans; end; function CFrac2(A, B, X : Float) : Float; { Continued fraction expansion #2 for incomplete beta integral } var Xk, Pk, Pkm1, Pkm2, Qk, Qkm1, Qkm2, K1, K2, K3, K4, K5, K6, K7, K8, R, T, Z, Ans, Thresh : Float; N : Integer; label CDone; begin K1 := A; K2 := B - 1.0; K3 := A; K4 := A + 1.0; K5 := 1.0; K6 := A + B; K7 := A + 1.0; K8 := A + 2.0; Pkm2 := 0.0; Qkm2 := 1.0; Pkm1 := 1.0; Qkm1 := 1.0; Z := X / (1.0 - X); Ans := 1.0; R := 1.0; N := 0; Thresh := 3.0 * MACHEP; repeat Xk := - (Z * K1 * K2) / (K3 * K4); Pk := Pkm1 + Pkm2 * Xk; Qk := Qkm1 + Qkm2 * Xk; Pkm2 := Pkm1; Pkm1 := Pk; Qkm2 := Qkm1; Qkm1 := Qk; Xk := (Z * K5 * K6) / (K7 * K8); Pk := Pkm1 + Pkm2 * Xk; Qk := Qkm1 + Qkm2 * Xk; Pkm2 := Pkm1; Pkm1 := Pk; Qkm2 := Qkm1; Qkm1 := Qk; if Qk <> 0.0 then R := Pk / Qk; if R <> 0.0 then begin T := Abs((Ans - R) / R); Ans := R; end else T := 1.0; if T < Thresh then goto CDone; K1 := K1 + 1.0; K2 := K2 - 1.0; K3 := K3 + 2.0; K4 := K4 + 2.0; K5 := K5 + 1.0; K6 := K6 + 1.0; K7 := K7 + 2.0; K8 := K8 + 2.0; if Abs(Qk) + Abs(Pk) > BIG then begin Pkm2 := Pkm2 * BIGINV; Pkm1 := Pkm1 * BIGINV; Qkm2 := Qkm2 * BIGINV; Qkm1 := Qkm1 * BIGINV; end; if (Abs(Qk) < BIGINV) or (Abs(Pk) < BIGINV) then begin Pkm2 := Pkm2 * BIG; Pkm1 := Pkm1 * BIG; Qkm2 := Qkm2 * BIG; Qkm1 := Qkm1 * BIG; end; N := N + 1; until N > 400; MathErr := FN_PLOSS; CDone: CFrac2 := Ans; end; function IBeta(A, B, X : Float) : Float; var A1, B1, X1, T, W, Xc, Y : Float; Flag : Boolean; label Done; begin MathErr := FN_OK; if (A <= 0.0) or (B <= 0.0) or (X < 0.0) or (X > 1.0) then begin IBeta := DefaultVal(FN_DOMAIN); Exit; end; if (X = 0.0) or (X = 1.0) then begin IBeta := X; Exit; end; Flag := False; if (B * X <= 1.0) and (X <= 0.95) then begin T := PSeries(A, B, X); goto Done; end; W := 1.0 - X; { Reverse a and b if x is greater than the mean. } if X > A / (A + B) then begin Flag := True; A1 := B; B1 := A; Xc := X; X1 := W; end else begin A1 := A; B1 := B; Xc := W; X1 := X; end; if Flag and (B1 * X1 <= 1.0) and (X1 <= 0.95) then begin T := PSeries(A1, B1, X1); goto Done; end; { Choose expansion for optimal convergence } Y := X1 * (A1 + B1 - 2.0) - (A1 - 1.0); if Y < 0.0 then W := CFrac1(A1, B1, X1) else W := CFrac2(A1, B1, X1) / Xc; { Multiply w by the factor a b _ _ _ x (1-x) | (a+b) / ( a | (a) | (b) ) } Y := A1 * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X1); T := B1 * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(Xc); if (A1 + B1 < MAXGAM) and (Abs(Y) < MAXLOG) and (Abs(T) < MAXLOG) then begin T := Power(Xc, B1) ; T := T * Power(X1, A1); T := T / A1; T := T * W; T := T * Gamma(A1 + B1) / (Gamma(A1) * Gamma(B1)); end else begin { Resort to logarithms } Y := Y + T + LnGamma(A1 + B1) - LnGamma(A1) - LnGamma(B1) + {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(W / A1); if Y < MINLOG then T := 0.0 else T := {$IFDEF USE_ASM}fExp{$ELSE}Exp{$ENDIF}(Y); end; Done: if Flag then if T <= MACHEP then T := 1.0 - MACHEP else T := 1.0 - T; IBeta := T; end; function Erf(X : Float) : Float; begin if X < 0.0 then Erf := - IGamma(0.5, Sqr(X)) else Erf := IGamma(0.5, Sqr(X)); end; function Erfc(X : Float) : Float; begin if X < 0.0 then Erfc := 1.0 + IGamma(0.5, Sqr(X)) else Erfc := JGamma(0.5, Sqr(X)); end; { ---------------------------------------------------------------------- Probability functions ---------------------------------------------------------------------- } function PBinom(N : Integer; P : Float; K : Integer) : Float; begin MathErr := FN_OK; if (P < 0.0) or (P > 1.0) or (N <= 0) or (N < K) then PBinom := DefaultVal(FN_DOMAIN) else if K = 0 then PBinom := IntPower(1.0 - P, N) else if K = N then PBinom := IntPower(P, N) else PBinom := Binomial(N, K) * IntPower(P, K) * IntPower(1.0 - P, N - K); end; function FBinom(N : Integer; P : Float; K : Integer) : Float; begin MathErr := FN_OK; if (P < 0.0) or (P > 1.0) or (N <= 0) or (N < K) then FBinom := DefaultVal(FN_DOMAIN) else if K = 0 then FBinom := IntPower(1.0 - P, N) else if K = N then FBinom := 1.0 else FBinom := 1.0 - IBeta(K + 1, N - K, P); end; function PPoisson(Mu : Float; K : Integer) : Float; var P : Float; I : Integer; begin MathErr := FN_OK; if (Mu <= 0.0) or (K < 0) then PPoisson := DefaultVal(FN_DOMAIN) else if K = 0 then PPoisson := Expo(- Mu) else begin P := Mu; for I := 2 to K do P := P * Mu / I; PPoisson := Expo(- Mu) * P; end; end; function FPoisson(Mu : Float; K : Integer) : Float; begin MathErr := FN_OK; if (Mu <= 0.0) or (K < 0) then FPoisson := DefaultVal(FN_DOMAIN) else if K = 0 then FPoisson := Expo(- Mu) else FPoisson := JGamma(K + 1, Mu); end; function DNorm(X : Float) : Float; begin DNorm := INVSQRT2PI * Expo(- 0.5 * Sqr(X)); end; function FNorm(X : Float) : Float; begin FNorm := 0.5 * (1.0 + Erf(X * SQRT2DIV2)); end; function InvNorm(P : Float) : Float; { ---------------------------------------------------------------------- Inverse of Normal distribution function Returns the argument, X, for which the area under the Gaussian probability density function (integrated from minus infinity to X) is equal to P. Translated from Cephes library. ---------------------------------------------------------------------- } const P0 : TabCoef = ( 8.779679420055069160496E-3, - 7.649544967784380691785E-1, 2.971493676711545292135E0, - 4.144980036933753828858E0, 2.765359913000830285937E0, - 9.570456817794268907847E-1, 1.659219375097958322098E-1, - 1.140013969885358273307E-2, 0, 0); Q0 : TabCoef = ( - 5.303846964603721860329E0, 9.908875375256718220854E0, - 9.031318655459381388888E0, 4.496118508523213950686E0, - 1.250016921424819972516E0, 1.823840725000038842075E-1, - 1.088633151006419263153E-2, 0, 0, 0); P1 : TabCoef = ( 4.302849750435552180717E0, 4.360209451837096682600E1, 9.454613328844768318162E1, 9.336735653151873871756E1, 5.305046472191852391737E1, 1.775851836288460008093E1, 3.640308340137013109859E0, 3.691354900171224122390E-1, 1.403530274998072987187E-2, 1.377145111380960566197E-4); Q1 : TabCoef = ( 2.001425109170530136741E1, 7.079893963891488254284E1, 8.033277265194672063478E1, 5.034715121553662712917E1, 1.779820137342627204153E1, 3.845554944954699547539E0, 3.993627390181238962857E-1, 1.526870689522191191380E-2, 1.498700676286675466900E-4, 0); P2 : TabCoef = ( 3.244525725312906932464E0, 6.856256488128415760904E0, 3.765479340423144482796E0, 1.240893301734538935324E0, 1.740282292791367834724E-1, 9.082834200993107441750E-3, 1.617870121822776093899E-4, 7.377405643054504178605E-7, 0, 0); Q2 : TabCoef = ( 6.021509481727510630722E0, 3.528463857156936773982E0, 1.289185315656302878699E0, 1.874290142615703609510E-1, 9.867655920899636109122E-3, 1.760452434084258930442E-4, 8.028288500688538331773E-7, 0, 0, 0); P3 : TabCoef = ( 2.020331091302772535752E0, 2.133020661587413053144E0, 2.114822217898707063183E-1, - 6.500909615246067985872E-3, - 7.279315200737344309241E-4, - 1.275404675610280787619E-5, - 6.433966387613344714022E-8, - 7.772828380948163386917E-11, 0, 0); Q3 : TabCoef = ( 2.278210997153449199574E0, 2.345321838870438196534E-1, - 6.916708899719964982855E-3, - 7.908542088737858288849E-4, - 1.387652389480217178984E-5, - 7.001476867559193780666E-8, - 8.458494263787680376729E-11, 0, 0, 0); var X, Y, Z, Y2, X0, X1 : Float; Code : Integer; begin if (P <= 0.0) or (P >= 1.0) then begin InvNorm := DefaultVal(FN_DOMAIN); Exit; end; Code := 1; Y := P; if Y > (1.0 - 0.13533528323661269189) then { 0.135... = exp(-2) } begin Y := 1.0 - Y; Code := 0; end; if Y > 0.13533528323661269189 then begin Y := Y - 0.5; Y2 := Y * Y; X := Y + Y * (Y2 * PolEvl(Y2, P0, 7) / P1Evl(Y2, Q0, 7)); X := X * SQRT2PI; InvNorm := X; Exit; end; X := Sqrt(- 2.0 * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(Y)); X0 := X - {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X) / X; Z := 1.0 / X; if X < 8.0 then X1 := Z * PolEvl(Z, P1, 9) / P1Evl(Z, Q1, 9) else if X < 32.0 then X1 := Z * PolEvl(Z, P2, 7) / P1Evl(Z, Q2, 7) else X1 := Z * PolEvl(Z, P3, 7) / P1Evl(Z, Q3, 7); X := X0 - X1; if Code <> 0 then X := - X; InvNorm := X; end; function PNorm(X : Float) : Float; var A : Float; begin A := Abs(X); MathErr := FN_OK; if A = 0.0 then PNorm := 1.0 else if A < 1.0 then PNorm := 1.0 - Erf(A * SQRT2DIV2) else PNorm := Erfc(A * SQRT2DIV2); end; function DStudent(Nu : Integer; X : Float) : Float; var L, P, Q : Float; begin MathErr := FN_OK; if Nu < 1 then DStudent := DefaultVal(FN_DOMAIN) else begin P := 0.5 * (Nu + 1); Q := 0.5 * Nu; L := LnGamma(P) - LnGamma(Q) - 0.5 * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(Nu * PI) - P * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(1.0 + Sqr(X) / Nu); DStudent := Expo(L); end; end; function FStudent(Nu : Integer; X : Float) : Float; begin MathErr := FN_OK; if Nu < 1 then FStudent := DefaultVal(FN_DOMAIN) else FStudent := 1.0 - IBeta(0.5 * Nu, 0.5, Nu / (Nu + Sqr(X))); end; function PStudent(Nu : Integer; X : Float) : Float; begin MathErr := FN_OK; if Nu < 1 then PStudent := DefaultVal(FN_DOMAIN) else PStudent := IBeta(0.5 * Nu, 0.5, Nu / (Nu + Sqr(X))); end; function DKhi2(Nu : Integer; X : Float) : Float; begin MathErr := FN_OK; DKhi2 := DGamma(0.5 * Nu, 0.5, X); end; function FKhi2(Nu : Integer; X : Float) : Float; begin MathErr := FN_OK; if (Nu < 1) or (X <= 0.0) then FKhi2 := DefaultVal(FN_DOMAIN) else FKhi2 := IGamma(0.5 * Nu, 0.5 * X); end; function PKhi2(Nu : Integer; X : Float) : Float; begin MathErr := FN_OK; if (Nu < 1) or (X <= 0.0) then PKhi2 := DefaultVal(FN_DOMAIN) else PKhi2 := JGamma(0.5 * Nu, 0.5 * X); end; function DSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; var P1, P2, R, S, L : Float; begin MathErr := FN_OK; if (Nu1 < 1) or (Nu2 < 1) or (X <= 0.0) then DSnedecor := DefaultVal(FN_DOMAIN) else begin R := Int(Nu1) / Int(Nu2); P1 := 0.5 * Nu1; P2 := 0.5 * Nu2; S := P1 + P2; L := LnGamma(S) - LnGamma(P1) - LnGamma(P2) + P1 * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(R); L := L + (P1 - 1.0) * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X) - S * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(1.0 + R * X); DSnedecor := Expo(L); end; end; function FSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; begin MathErr := FN_OK; if (Nu1 < 1) or (Nu2 < 1) or (X <= 0.0) then FSnedecor := DefaultVal(FN_DOMAIN) else FSnedecor := 1.0 - IBeta(0.5 * Nu2, 0.5 * Nu1, Nu2 / (Nu2 + Nu1 * X)); end; function PSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; begin MathErr := FN_OK; if (Nu1 < 1) or (Nu2 < 1) or (X <= 0.0) then PSnedecor := DefaultVal(FN_DOMAIN) else PSnedecor := IBeta(0.5 * Nu2, 0.5 * Nu1, Nu2 / (Nu2 + Nu1 * X)); end; function DExpo(A, X : Float) : Float; begin if (A <= 0.0) or (X < 0.0) then DExpo := DefaultVal(FN_DOMAIN) else DExpo := A * Expo(- A * X); end; function FExpo(A, X : Float) : Float; begin if (A <= 0.0) or (X < 0.0) then FExpo := DefaultVal(FN_DOMAIN) else FExpo := 1.0 - Expo(- A * X); end; function DBeta(A, B, X : Float) : Float; var L : Float; begin MathErr := FN_OK; if (A <= 0.0) or (B <= 0.0) or (X < 0.0) or (X > 1.0) then DBeta := DefaultVal(FN_DOMAIN) else if X = 0.0 then if A < 1.0 then DBeta := DefaultVal(FN_SING) else DBeta := 0.0 else if X = 1.0 then if B < 1.0 then DBeta := DefaultVal(FN_SING) else DBeta := 0.0 else begin L := LnGamma(A + B) - LnGamma(A) - LnGamma(B); L := L + (A - 1.0) * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X) + (B - 1.0) * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(1.0 - X); DBeta := Expo(L); end; end; function FBeta(A, B, X : Float) : Float; begin FBeta := IBeta(A, B, X); end; function DGamma(A, B, X : Float) : Float; var L : Float; begin MathErr := FN_OK; if (A <= 0.0) or (B <= 0.0) or (X < 0.0) then DGamma := DefaultVal(FN_DOMAIN) else if X = 0.0 then if A < 1.0 then DGamma := DefaultVal(FN_SING) else if A = 1.0 then DGamma := B else DGamma := 0.0 else begin L := A * Ln(B) - LnGamma(A) + (A - 1.0) * {$IFDEF USE_ASM}fLn{$ELSE}Ln{$ENDIF}(X) - B * X; DGamma := Expo(L); end; end; function FGamma(A, B, X : Float) : Float; begin FGamma := IGamma(A, B * X); end; { ---------------------------------------------------------------------- Random numbers ---------------------------------------------------------------------- } var X1, X2, C1, C2 : LongInt; procedure RMarIn(Seed1, Seed2 : Integer); begin X1 := Seed1; X2 := Seed2; C1 := 0; C2 := 0; end; function IRanMar : LongInt; var Y1, Y2 : LongInt; begin Y1 := 18000 * X1 + C1; X1 := Y1 and 65535; C1 := Y1 shr 16; Y2 := 30903 * X2 + C2; X2 := Y2 and 65535; C2 := Y2 shr 16; IRanMar := (X1 shl 16) + (X2 and 65535); end; function RanMar : Float; begin RanMar := (IRanMar + 2147483648.0) / 4294967296.0; end; function RanGaussStd : Float; { Computes 2 random numbers from the standard normal distribution, returns one and saves the other for the next call } const Gauss_Save : Float = 0.0; { Saves a random number } Gauss_Set : Boolean = False; { Flags if a number has been saved } var R, Theta, SinTheta, CosTheta : Float; begin if not Gauss_Set then begin R := Sqrt(- 2.0 * Log(RanMar)); Theta := TWOPI * RanMar; SinCos(Theta, SinTheta, CosTheta); RanGaussStd := R * CosTheta; { Return 1st number } Gauss_Save := R * SinTheta; { Save 2nd number } end else RanGaussStd := Gauss_Save; { Return saved number } Gauss_Set := not Gauss_Set; end; function RanGauss(Mu, Sigma : Float) : Float; { Returns a random number from the normal distribution with mean Mu and standard deviation Sigma } begin RanGauss := Mu + Sigma * RanGaussStd; end; { ---------------------------------------------------------------------- Initialization code ---------------------------------------------------------------------- } var I : Integer; begin { Initialize MathErr } MathErr := FN_OK; { Store the factorials of the first NFACT integers in a table } FactArray[0] := 1.0; FactArray[1] := 1.0; FactArray[2] := 2.0; for I := 3 to NFACT do FactArray[I] := FactArray[I - 1] * I; { Initialize random number generator } RMarIn(1802, 9373); end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitpower.pas0000664000175000017500000001141511326434466022116 0ustar michaelmichael{ ********************************************************************** * Unit FITPOWER.PAS * * Version 1.1 * * (c) J. Debord, August 2000 * ********************************************************************** This unit fits a power function : y = A.x^n ********************************************************************** } unit FitPower; {$F+} interface uses FMath, Matrices, Stat, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; procedure DerivProc(X, Y : Float; B, D : PVector); function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; implementation function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function. -------------------------------------------------------------------- } begin FuncName := 'y = A.x^n'; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted. -------------------------------------------------------------------- } begin FirstParam := 0; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted. -------------------------------------------------------------------- } begin LastParam := 1; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter. -------------------------------------------------------------------- } begin case I of 0 : ParamName := 'A'; 1 : ParamName := 'n'; end; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X. B is the vector of parameters, such that : B^[0] = A B^[1] = n -------------------------------------------------------------------- } begin RegFunc := B^[0] * Power(X, B^[1]); end; procedure DerivProc(X, Y : Float; B, D : PVector); { -------------------------------------------------------------------- Computes the derivatives of the regression function at point (X,Y) with respect to the parameters B. The results are returned in D. D^[I] contains the derivative with respect to the I-th parameter. -------------------------------------------------------------------- } begin D^[0] := Y / B^[0]; { dy/dA = x^n } D^[1] := Y * Log(X); { dy/dk = A.x^n.Ln(x) } end; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; { -------------------------------------------------------------------- Approximate fit of a power function by linear regression: Ln(y) = Ln(A) + n.Ln(x) -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X, Y = point coordinates W = weights N = number of points Output : B = estimated regression parameters -------------------------------------------------------------------- } var X1, Y1 : PVector; { Transformed coordinates } W1 : PVector; { Weights } A : PVector; { Linear regression parameters } V : PMatrix; { Variance-covariance matrix } P : Integer; { Number of points for linear regression } K : Integer; { Loop variable } ErrCode : Integer; { Error code } begin DimVector(X1, N); DimVector(Y1, N); DimVector(W1, N); DimVector(A, 1); DimMatrix(V, 1, 1); P := 0; for K := 1 to N do if (X^[K] > 0.0) and (Y^[K] > 0.0) then begin Inc(P); X1^[P] := Log(X^[K]); Y1^[P] := Log(Y^[K]); W1^[P] := Sqr(Y^[K]); if Method = 1 then W1^[P] := W1^[P] * W^[K]; end; ErrCode := WLinFit(X1, Y1, W1, P, A, V); if ErrCode = MAT_OK then begin B^[0] := Expo(A^[0]); B^[1] := A^[1]; end; FitModel := ErrCode; DelVector(X1, N); DelVector(Y1, N); DelVector(W1, N); DelVector(A, 1); DelMatrix(V, 1, 1); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitpoly.pas0000664000175000017500000000777511326434466021763 0ustar michaelmichael{ ********************************************************************** * Unit FITPOLY.PAS * * Version 1.2 * * (c) J. Debord, March 1999 * ********************************************************************** This unit fits a polynomial : y = b0 + b1.x + b2.x^2 + ... ********************************************************************** } unit FitPoly; {$F+} interface uses FMath, Matrices, Polynom, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; procedure InitModel(CstPar : PVector); implementation const Deg : Integer = 2; { Degree of polynomial } function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function. -------------------------------------------------------------------- } var Name, S : String; I : Integer; begin Name := 'y = b0 + b1.x'; for I := 2 to Deg do begin Str(I, S); Name := Name + ' + b' + S + '.x^' + S; end; FuncName := Name; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted. -------------------------------------------------------------------- } begin FirstParam := 0; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted. -------------------------------------------------------------------- } begin LastParam := Deg; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter. -------------------------------------------------------------------- } var S : String; begin Str(I, S); ParamName := 'b' + S; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X. B is the vector of parameters (coefficients of polynomial). -------------------------------------------------------------------- } begin RegFunc := Poly(X, B, Deg); end; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; { -------------------------------------------------------------------- Fit of polynomial. -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X, Y = point coordinates W = weights N = number of points Output : B = estimated regression parameters V = variance-covariance matrix of parameters -------------------------------------------------------------------- } begin case Method of 0 : FitModel := PolFit(X, Y, N, Deg, B, V); 1 : FitModel := WPolFit(X, Y, W, N, Deg, B, V); end; end; procedure InitModel(CstPar : PVector); { -------------------------------------------------------------------- Initializes the global variables of the unit. -------------------------------------------------------------------- CstPar^[0] = Degree of polynomial -------------------------------------------------------------------- } var D : Integer; begin D := Round(CstPar^[0]); if D > 1 then Deg := D; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitpka.pas0000664000175000017500000001253211326434466021536 0ustar michaelmichael{ ********************************************************************** * Unit FITPKA.PAS * * Version 1.1 * * (c) J. Debord, July 1999 * ********************************************************************** This unit fits the acid/base titration function : B - A y = A + ---------------- 1 + 10^(pKa - x) where x is pH y is some property (e.g. absorbance) which depends on the ratio of the acidic and basic forms of the compound A is the property for the pure acidic form B is the property for the pure basic form pKa is the acidity constant ********************************************************************** } unit FitPKa; {$F+} interface uses FMath, Matrices, Stat, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; procedure DerivProc(X : Float; B, D : PVector); function FitModel(X, Y : PVector; N : Integer; B : PVector) : Integer; implementation function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function -------------------------------------------------------------------- } begin FuncName := 'y = A + (B - A) / [1 + 10^(pKa - x)]' end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted (0 if there is a constant term A, 1 otherwise) -------------------------------------------------------------------- } begin FirstParam := 0; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted -------------------------------------------------------------------- } begin LastParam := 2; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter -------------------------------------------------------------------- } begin case I of 0 : ParamName := 'A'; 1 : ParamName := 'B'; 2 : ParamName := 'pKa'; end; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X B is the vector of parameters, such that : B^[0] = A B^[1] = B B^[2] = pKa -------------------------------------------------------------------- } begin RegFunc := B^[0] + (B^[1] - B^[0]) / (1.0 + Exp10(B^[2] - X)); end; procedure DerivProc(X : Float; B, D : PVector); { -------------------------------------------------------------------- Computes the derivatives of the regression function at point X with respect to the parameters B. The results are returned in D. D^[I] contains the derivative with respect to the I-th parameter. -------------------------------------------------------------------- } var Q, R : Float; begin Q := Exp10(B^[2] - X); { 10^(pKa - x) } R := 1.0 / (1.0 + Q); { 1/[1 + 10^(pKa - x)] } D^[0] := 1.0 - R; { dy/dA = 1 - 1/[1 + 10^(pKa - x)] } D^[1] := R; { dy/dB = 1/[1 + 10^(pKa - x)] } { dy/dpKa = (A-B).10^(pKa - x).Ln(10) / [1 + 10^(pKa - x)]^2 } D^[2] := (B^[0] - B^[1]) * Q * LN10 * Sqr(R); end; procedure SortPoints(X, Y : PVector; N : Integer); { ---------------------------------------------------------------------- Sort points by increasing X values ---------------------------------------------------------------------- } var I, J, K : Integer; A : Float; begin for I := 1 to Pred(N) do begin K := I; A := X^[I]; for J := Succ(I) to N do if X^[J] < A then begin K := J; A := X^[J]; end; FSwap(X^[I], X^[K]); FSwap(Y^[I], Y^[K]); end; end; function FitModel(X, Y : PVector; N : Integer; B : PVector) : Integer; { -------------------------------------------------------------------- Approximate fit of the acid/base titration function -------------------------------------------------------------------- Input : X, Y = point coordinates N = number of points Output : B = estimated regression parameters -------------------------------------------------------------------- } var K : Integer; { Loop variable } Z : Float; { (A + B) / 2 } begin SortPoints(X, Y, N); B^[0] := Y^[1]; B^[1] := Y^[N]; Z := 0.5 * (B^[0] + B^[1]); for K := 2 to N - 1 do if Y^[K] = Z then B^[2] := X^[K] else if ((Y^[K] < Z) and (Y^[K + 1] > Z)) or ((Y^[K] > Z) and (Y^[K + 1] < Z)) then B^[2] := 0.5 * (X^[K] + X^[K + 1]); FitModel := 0; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitmult.pas0000664000175000017500000001076111326434466021746 0ustar michaelmichael{ ********************************************************************** * Unit FITMULT.PAS * * Version 1.1 * * (c) J. Debord, October 1998 * ********************************************************************** This unit fits the multiple linear equation: y = b0 + b1.x1 + b2.x2 + ... ********************************************************************** } unit FitMult; {$F+} interface uses FMath, Matrices, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X, B : PVector) : Float; function FitModel(Method : Integer; X : PMatrix; Y, W : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; procedure InitModel(CstPar : PVector); implementation const Nvar : Integer = 2; { Number of independent variables } ConsTerm : Boolean = True; { Flags the presence of a constant term b0 } function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function -------------------------------------------------------------------- } var Name, S : String; I : Integer; begin Name := 'y = '; if ConsTerm then Name := Name + 'b0 + '; Name := Name + 'b1.x1'; for I := 2 to Nvar do begin Str(I, S); Name := Name + ' + b' + S + '.x' + S; end; FuncName := Name; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted -------------------------------------------------------------------- } begin if ConsTerm then FirstParam := 0 else FirstParam := 1; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted -------------------------------------------------------------------- } begin LastParam := Nvar; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter -------------------------------------------------------------------- } var S : String; begin Str(I, S); ParamName := 'b' + S; end; function RegFunc(X, B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at observation X B is the vector of parameters. -------------------------------------------------------------------- } var I : Integer; Y : Float; begin if ConsTerm then Y := B^[0] else Y := 0.0; for I := 1 to Nvar do Y := Y + B^[I] * X^[I]; RegFunc := Y; end; function FitModel(Method : Integer; X : PMatrix; Y, W : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; { -------------------------------------------------------------------- Multiple linear regression -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X = matrix of independent variables Y = vector of dependent variable W = vector of weights N = number of observations Output : B = estimated regression parameters V = variance-covariance matrix of parameters -------------------------------------------------------------------- } begin case Method of 0 : FitModel := MulFit(X, Y, N, Nvar, ConsTerm, B, V); 1 : FitModel := WMulFit(X, Y, W, N, Nvar, ConsTerm, B, V); end; end; procedure InitModel(CstPar : PVector); { -------------------------------------------------------------------- Initializes the global variables of the unit -------------------------------------------------------------------- CstPar^[0] = number of independent variables CstPar^[1] = 1 to include a constant term (b0) -------------------------------------------------------------------- } begin Nvar := Round(CstPar^[0]); ConsTerm := (CstPar^[1] = 1); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitmich.pas0000664000175000017500000001167511326434466021712 0ustar michaelmichael{ ********************************************************************** * Unit FITMICH.PAS * * Version 1.0 * * (c) J. Debord, April 1998 * ********************************************************************** This unit fits the Michaelis equation : Ymax . x y = -------- Km + x ********************************************************************** } unit FitMich; {$F+} interface uses FMath, Matrices, Stat, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; procedure DerivProc(X, Y : Float; B, D : PVector); function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; implementation function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function -------------------------------------------------------------------- } begin FuncName := 'y = Ymax . x / (Km + x)'; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted -------------------------------------------------------------------- } begin FirstParam := 0; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted -------------------------------------------------------------------- } begin LastParam := 1; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter -------------------------------------------------------------------- } begin case I of 0 : ParamName := 'Ymax'; 1 : ParamName := 'Km '; end; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X B is the vector of parameters, such that : B^[0] = Ymax B^[1] = Km -------------------------------------------------------------------- } begin RegFunc := B^[0] * X / (B^[1] + X); end; procedure DerivProc(X, Y : Float; B, D : PVector); { -------------------------------------------------------------------- Computes the derivatives of the regression function at point (X,Y) with respect to the parameters B. The results are returned in D. D^[I] contains the derivative with respect to the I-th parameter -------------------------------------------------------------------- } begin D^[0] := Y / B^[0]; { dy/dYmax = x / (Km + x) } D^[1] := - Y / (B^[1] + X); { dy/dKm = - Ymax.x / (Km + x)^2 } end; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; { -------------------------------------------------------------------- Approximate fit of the Michaelis equation by linear regression: 1/y = 1/Ymax + (Km/Ymax) * (1/x) -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X, Y = point coordinates W = weights N = number of points Output : B = estimated regression parameters -------------------------------------------------------------------- } var X1, Y1 : PVector; { Transformed coordinates } W1 : PVector; { Weights } A : PVector; { Linear regression parameters } V : PMatrix; { Variance-covariance matrix } P : Integer; { Number of points for linear regression } K : Integer; { Loop variable } ErrCode : Integer; { Error code } begin DimVector(X1, N); DimVector(Y1, N); DimVector(W1, N); DimVector(A, 1); DimMatrix(V, 1, 1); P := 0; for K := 1 to N do if (X^[K] > 0.0) and (Y^[K] > 0.0) then begin Inc(P); X1^[P] := 1.0 / X^[K]; Y1^[P] := 1.0 / Y^[K]; W1^[P] := Sqr(Sqr(Y^[K])); if Method = 1 then W1^[P] := W1^[P] * W^[K]; end; ErrCode := WLinFit(X1, Y1, W1, P, A, V); if ErrCode = MAT_OK then begin B^[0] := 1.0 / A^[0]; B^[1] := A^[1] / A^[0]; end; FitModel := ErrCode; DelVector(X1, N); DelVector(Y1, N); DelVector(W1, N); DelVector(A, 1); DelMatrix(V, 1, 1); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitlogis.pas0000664000175000017500000001607611326434466022107 0ustar michaelmichael{ ********************************************************************** * Unit FITLOGIS.PAS * * Version 1.4 * * (c) J. Debord, August 2000 * ********************************************************************** This unit fits the logistic function : B - A y = A + ----------------- 1 + exp(-a.x + b) ********************************************************************** } unit FitLogis; {$F+} interface uses FMath, Matrices, Stat, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; procedure DerivProc(X : Float; B, D : PVector); function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; procedure InitModel(CstPar : PVector); implementation const ConsTerm : Boolean = True; { Flags the presence of a constant term A } function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function. -------------------------------------------------------------------- } begin if ConsTerm then FuncName := 'y = A + (B - A) / [1 + exp(-a.x + b)]' else FuncName := 'y = B / [1 + exp(-a.x + b)]'; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted (0 if there is a constant term A, 1 otherwise) -------------------------------------------------------------------- } begin if ConsTerm then FirstParam := 0 else FirstParam := 1; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted -------------------------------------------------------------------- } begin LastParam := 3; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter. -------------------------------------------------------------------- } begin case I of 0 : ParamName := 'A'; 1 : ParamName := 'B'; 2 : ParamName := 'a'; 3 : ParamName := 'b'; end; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X. B is the vector of parameters, such that : B^[0] = A B^[1] = B B^[2] = a B^[3] = b -------------------------------------------------------------------- } begin if ConsTerm then RegFunc := B^[0] + (B^[1] - B^[0]) / (1.0 + Expo(- B^[2] * X + B^[3])) else RegFunc := B^[1] / (1.0 + Expo(- B^[2] * X + B^[3])); end; procedure DerivProc(X : Float; B, D : PVector); { -------------------------------------------------------------------- Computes the derivatives of the regression function at point X with respect to the parameters B. The results are returned in D. D^[I] contains the derivative with respect to the I-th parameter -------------------------------------------------------------------- } var Q, R : Float; begin Q := Expo(- B^[2] * X + B^[3]); { exp(-ax+b) } R := 1.0 / (1.0 + Q); { 1 / [1 + exp(-ax+b)] } D^[0] := 1.0 - R; { dy/dA = 1 - 1 / [1 + exp(-ax+b)] } D^[1] := R; { dy/dB = 1 / [1 + exp(-ax+b)] } { dy/db = (A-B).exp(-ax+b) / [1 + exp(-ax+b)]^2 } D^[3] := (B^[0] - B^[1]) * Q * Sqr(R); { dy/da = (B-A).x.exp(-ax+b) / [1 + exp(-ax+b)]^2 } D^[2] := - D^[3] * X; end; procedure SortPoints(X, Y : PVector; N : Integer); { ---------------------------------------------------------------------- Sort points by increasing X values ---------------------------------------------------------------------- } var I, J, K : Integer; A : Float; begin for I := 1 to Pred(N) do begin K := I; A := X^[I]; for J := Succ(I) to N do if X^[J] < A then begin K := J; A := X^[J]; end; FSwap(X^[I], X^[K]); FSwap(Y^[I], Y^[K]); end; end; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; { -------------------------------------------------------------------- Approximate fit of a logistic function by linear regression: Ln[(B - A)/(y - A) - 1] = -ax + b -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X, Y = point coordinates W = weights N = number of points Output : B = estimated regression parameters -------------------------------------------------------------------- } var XX : PVector; { Transformed X coordinates } YY : PVector; { Transformed Y coordinates } WW : PVector; { Weights } A : PVector; { Linear regression parameters } V : PMatrix; { Variance-covariance matrix } P : Integer; { Number of points for linear regression } K : Integer; { Loop variable } ErrCode : Integer; { Error code } D : Float; { B - A } begin DimVector(XX, N); DimVector(YY, N); DimVector(WW, N); DimVector(A, 1); DimMatrix(V, 1, 1); SortPoints(X, Y, N); if ConsTerm then B^[0] := Y^[1] else B^[0] := 0.0; B^[1] := Y^[N]; P := 0; D := B^[1] - B^[0]; for K := 1 to N do if (X^[K] > X^[1]) and (X^[K] < X^[N]) then begin Inc(P); XX^[P] := X^[K]; YY^[P] := Log(D / (Y^[K] - B^[0]) - 1.0); WW^[P] := Sqr((Y^[K] - B^[0]) * (Y^[K] - B^[1]) / D); if Method = 1 then WW^[P] := WW^[P] * W^[K]; end; ErrCode := WLinFit(XX, YY, WW, P, A, V); if ErrCode = MAT_OK then begin B^[2] := - A^[1]; B^[3] := A^[0]; end; FitModel := ErrCode; DelVector(XX, N); DelVector(YY, N); DelVector(WW, N); DelVector(A, 1); DelMatrix(V, 1, 1); end; procedure InitModel(CstPar : PVector); { -------------------------------------------------------------------- Initializes the global variables of the unit. -------------------------------------------------------------------- CstPar^[0] = 1 to include a constant term (A) -------------------------------------------------------------------- } begin ConsTerm := (CstPar^[0] = 1); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitlin.pas0000664000175000017500000000643511326434466021552 0ustar michaelmichael{ ********************************************************************** * Unit FITLIN.PAS * * Version 1.0 * * (c) J. Debord, April 1998 * ********************************************************************** This unit fits a linear function : y = a + b.x ********************************************************************** } unit FitLin; {$F+} interface uses FMath, Matrices, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; implementation function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function -------------------------------------------------------------------- } begin FuncName := 'y = a + b.x'; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted -------------------------------------------------------------------- } begin FirstParam := 0; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted -------------------------------------------------------------------- } begin LastParam := 1; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter -------------------------------------------------------------------- } begin case I of 0 : ParamName := 'a'; 1 : ParamName := 'b'; end; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X B is the vector of parameters, such that : B^[0] = a B^[1] = b -------------------------------------------------------------------- } begin RegFunc := B^[0] + B^[1] * X; end; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector; V : PMatrix) : Integer; { -------------------------------------------------------------------- Fit the straight line -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X, Y = point coordinates W = weights N = number of points Output : B = estimated regression parameters V = variance-covariance matrix of the parameters -------------------------------------------------------------------- } begin case Method of 0 : FitModel := LinFit(X, Y, N, B, V); 1 : FitModel := WLinFit(X, Y, W, N, B, V); end; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitiexpo.pas0000664000175000017500000001125111326434466022104 0ustar michaelmichael{ ********************************************************************** * Unit FITIEXPO.PAS * * Version 1.2 * * (c) J. Debord, August 2000 * ********************************************************************** This unit fits the increasing exponential : y = A.[1 - exp(-k.x)] ********************************************************************** } unit FitIExpo; {$F+} interface uses FMath, Matrices, Stat, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; procedure DerivProc(X : Float; B, D : PVector); function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; implementation function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function -------------------------------------------------------------------- } begin FuncName := 'y = A[1 - exp(-k.x)]'; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted -------------------------------------------------------------------- } begin FirstParam := 0; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted -------------------------------------------------------------------- } begin LastParam := 1; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter -------------------------------------------------------------------- } begin case I of 0 : ParamName := 'A'; 1 : ParamName := 'k'; end; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X B is the vector of parameters, such that : B^[0] = A B^[1] = k -------------------------------------------------------------------- } begin RegFunc := B^[0] * (1.0 - Expo(- B^[1] * X)); end; procedure DerivProc(X : Float; B, D : PVector); { -------------------------------------------------------------------- Computes the derivatives of the regression function at point X with respect to the parameters B. The results are returned in D. D^[I] contains the derivative with respect to the I-th parameter. -------------------------------------------------------------------- } var E : Float; begin E := Expo(- B^[1] * X); { exp(-k.x) } D^[0] := 1.0 - E; { dy/dA = 1 - exp(-k.x) } D^[1] := B^[0] * X * E; { dy/dk = A.x.exp(-k.x) } end; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; { -------------------------------------------------------------------- Approximate fit of the increasing exponential by linear regression: Ln(1 - y/A) = -k.x -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X, Y = point coordinates W = weights N = number of points Output : B = estimated regression parameters -------------------------------------------------------------------- } var Y1 : PVector; { Transformed ordinates } W1 : PVector; { Weights } A : PVector; { Linear regression parameters } V : PMatrix; { Variance-covariance matrix } K : Integer; { Loop variable } ErrCode : Integer; { Error code } begin DimVector(Y1, N); DimVector(W1, N); DimVector(A, 1); DimMatrix(V, 1, 1); { Estimation of A } B^[0] := 1.1 * Max(Y, 1, N); for K := 1 to N do begin Y1^[K] := Log(1.0 - Y^[K] / B^[0]); W1^[K] := Sqr(Y^[K] - B^[0]); if Method = 1 then W1^[K] := W1^[K] * W^[K]; end; ErrCode := WLinFit(X, Y1, W1, N, A, V); if ErrCode = MAT_OK then B^[1] := - A^[1]; FitModel := ErrCode; DelVector(Y1, N); DelVector(W1, N); DelVector(A, 1); DelMatrix(V, 1, 1); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fithill.pas0000664000175000017500000001352511326434466021716 0ustar michaelmichael{ ********************************************************************** * Unit FITHILL.PAS * * Version 1.1 * * (c) J. Debord, August 2000 * ********************************************************************** This unit fits the Hill equation : Ymax . x^n y = ---------- K^n + x^n ********************************************************************** } unit FitHill; {$F+} interface uses FMath, Matrices, Stat, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; procedure DerivProc(X, Y : Float; B, D : PVector); function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; implementation function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function -------------------------------------------------------------------- } begin FuncName := 'y = Ymax . x^n / (K^n + x^n)'; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted -------------------------------------------------------------------- } begin FirstParam := 0; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted -------------------------------------------------------------------- } begin LastParam := 2; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter -------------------------------------------------------------------- } begin case I of 0 : ParamName := 'Ymax'; 1 : ParamName := 'K '; 2 : ParamName := 'n '; end; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X B is the vector of parameters, such that : B^[0] = Ymax B^[1] = K B^[2] = n -------------------------------------------------------------------- } begin if X = 0.0 then if B^[2] > 0.0 then RegFunc := 0.0 else RegFunc := B^[0] else { Compute function according to y = Ymax / [1 + (K/x)^n] } RegFunc := B^[0] / (1.0 + Power(B^[1] / X, B^[2])); end; procedure DerivProc(X, Y : Float; B, D : PVector); { -------------------------------------------------------------------- Computes the derivatives of the regression function at point (X,Y) with respect to the parameters B. The results are returned in D. D^[I] contains the derivative with respect to the I-th parameter -------------------------------------------------------------------- } var Q, R, S : Float; begin if X = 0.0 then begin if B^[2] > 0.0 then D^[0] := 0.0 else D^[0] := 1.0; D^[1] := 0.0; D^[2] := 0.0; end else begin Q := Power(B^[1] / X, B^[2]); { (K/x)^n } R := 1.0 / (1.0 + Q); { 1 / [1 + (K/x)^n] } S := - Y * R * Q; { -Ymax.(K/x)^n / [1 + (K/x)^n]^2 } { dy/dYmax = 1 / [1 + (K/x)^n] } D^[0] := R; { dy/dK = -Ymax.(K/x)^n.(n/K)/[1 + (K/x)^n]^2 } D^[1] := S * B^[2] / B^[1]; { dy/dn = -Ymax.(K/x)^n.Ln(K/x)/[1 + (K/x)^n]^2 } D^[2] := S * Log(B^[1] / X); end; end; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; { -------------------------------------------------------------------- Approximate fit of the Hill equation by linear regression: Ln(Ymax/y - 1) = n.Ln(K) - n.Ln(x) -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X, Y = point coordinates W = weights N = number of points Output : B = estimated regression parameters -------------------------------------------------------------------- } var Ymax : Float; { Estimated value of Ymax } X1, Y1 : PVector; { Transformed coordinates } W1 : PVector; { Weights } A : PVector; { Linear regression parameters } V : PMatrix; { Variance-covariance matrix } P : Integer; { Number of points for linear regression } K : Integer; { Loop variable } ErrCode : Integer; { Error code } begin DimVector(X1, N); DimVector(Y1, N); DimVector(W1, N); DimVector(A, 1); DimMatrix(V, 1, 1); P := 0; Ymax := Max(Y, 1, N); for K := 1 to N do if (X^[K] > 0.0) and (Y^[K] > 0.0) and (Y^[K] < Ymax) then begin Inc(P); X1^[P] := Log(X^[K]); Y1^[P] := Log(Ymax / Y^[K] - 1.0); W1^[P] := Sqr(Y^[K] * (1.0 - Y^[K] / Ymax)); if Method = 1 then W1^[P] := W1^[P] * W^[K]; end; ErrCode := WLinFit(X1, Y1, W1, P, A, V); if ErrCode = MAT_OK then begin B^[0] := Ymax; B^[1] := Expo(- A^[0] / A^[1]); B^[2] := - A^[1]; end; FitModel := ErrCode; DelVector(X1, N); DelVector(Y1, N); DelVector(W1, N); DelVector(A, 1); DelMatrix(V, 1, 1); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitfrac.pas0000664000175000017500000001554011326434466021700 0ustar michaelmichael{ ********************************************************************** * Unit FITFRAC.PAS * * Version 1.2 * * (c) J. Debord, April 1999 * ********************************************************************** This unit fits a rational fraction : p0 + p1.x + p2.x^2 + ... y = ------------------------ 1 + q1.x + q2.x^2 + ... ********************************************************************** } unit FitFrac; {$F+} interface uses FMath, Matrices, Polynom, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; procedure DerivProc(X, Y : Float; B, D : PVector); function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; procedure InitModel(CstPar : PVector); implementation const Deg1 : Integer = 1; { Degree of numerator } Deg2 : Integer = 1; { Degree of denominator } ConsTerm : Boolean = True; { Flags the presence of a constant term p0 } function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function -------------------------------------------------------------------- } var Name, S : String; I : Integer; begin Name := 'y = ('; if ConsTerm then Name := Name + 'p0 + '; Name := Name + 'p1.x'; for I := 2 to Deg1 do begin Str(I, S); Name := Name + ' + p' + S + '.x^' + S; end; Name := Name + ') / (1 + q1.x'; for I := (Deg1 + 2) to (Deg1 + Deg2) do begin Str(I - Deg1, S); Name := Name + ' + q' + S + '.x^' + S; end; Name := Name + ')'; FuncName := Name; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted (0 if there is a constant term p0, 1 otherwise) -------------------------------------------------------------------- } begin if ConsTerm then FirstParam := 0 else FirstParam := 1; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted -------------------------------------------------------------------- } begin LastParam := Deg1 + Deg2; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter -------------------------------------------------------------------- } var S : String; begin if I <= Deg1 then begin Str(I, S); ParamName := 'p' + S; end else begin Str(I - Deg1, S); ParamName := 'q' + S; end; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X B is the vector of parameters, such that : B^[0] = p0 B^[1] = p1 B^[2] = p2 ... B^[Deg1 + 1] = q1 B^[Deg1 + 2] = q2 ... -------------------------------------------------------------------- } begin RegFunc := RFrac(X, B, Deg1, Deg2); end; procedure DerivProc(X, Y : Float; B, D : PVector); { -------------------------------------------------------------------- Computes the derivatives of the regression function at point (X,Y) with respect to the parameters B. The results are returned in D. D^[I] contains the derivative with respect to the I-th parameter -------------------------------------------------------------------- } var I : Integer; Den : Float; begin { Compute denominator (1 + q1.x + q2.x^2 + ...) } Den := 0.0; for I := (Deg1 + Deg2) downto Succ(Deg1) do Den := (Den + B^[I]) * X; Den := 1.0 + Den; { dy/dp0 = 1 / (1 + q1.x + q2.x^2 + ...) } D^[0] := 1.0 / Den; { dy/dpi = x^i / (1 + q1.x + q2.x^2 + ...) } for I := 1 to Deg1 do D^[I] := D^[I - 1] * X; { dy/dq1 = -x.y / (1 + q1.x + q2.x^2 + ...) } D^[Deg1 + 1] := - X * Y / Den; { dy/dqi = -x^i.y / (1 + q1.x + q2.x^2 + ...) } for I := (Deg1 + 2) to (Deg1 + Deg2) do D^[I] := D^[I - 1] * X; end; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; { -------------------------------------------------------------------- Approximate fit of a rational fraction by linear regression: y = p0 + p1.x + p2.x^2 + ... - q1.(x.y) - q2.(x^2.y) - ... -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X, Y = point coordinates W = weights N = number of points Output : B = estimated regression parameters -------------------------------------------------------------------- } var I, J : Integer; { Loop variables } M : Integer; { Index of last fitted parameter } U : PMatrix; { Matrix of independent variables } V : PMatrix; { Variance-covariance matrix } begin M := LastParam; DimMatrix(U, M, N); DimMatrix(V, M, M); for J := 1 to N do begin U^[1]^[J] := X^[J]; for I := 2 to Deg1 do U^[I]^[J] := U^[I - 1]^[J] * X^[J]; U^[Deg1 + 1]^[J] := - X^[J] * Y^[J]; for I := (Deg1 + 2) to M do U^[I]^[J] := U^[I - 1]^[J] * X^[J]; end; case Method of 0 : FitModel := MulFit(U, Y, N, M, ConsTerm, B, V); 1 : FitModel := WMulFit(U, Y, W, N, M, ConsTerm, B, V); end; if not ConsTerm then B^[0] := 0.0; DelMatrix(U, M, N); DelMatrix(V, M, M); end; procedure InitModel(CstPar : PVector); { -------------------------------------------------------------------- Initializes the global variables of the unit -------------------------------------------------------------------- CstPar^[0] = Degree of numerator CstPar^[1] = Degree of denominator CstPar^[2] = 1 to include a constant term (p0) -------------------------------------------------------------------- } var D1, D2 : Integer; begin D1 := Round(CstPar^[0]); D2 := Round(CstPar^[1]); if D1 > 0 then Deg1 := D1; if D2 > 0 then Deg2 := D2; ConsTerm := (CstPar^[2] = 1); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitexpo.pas0000664000175000017500000002427111326434466021741 0ustar michaelmichael{ ********************************************************************** * Unit FITEXPO.PAS * * Version 1.4 * * (c) J. Debord, August 2000 * ********************************************************************** This unit fits a sum of decreasing exponentials : y = Ymin + A1.exp(-a1.x) + A2.exp(-a2.x) + A3.exp(-a3.x) + ... ********************************************************************** } unit FitExpo; {$F+} interface uses FMath, Matrices, Polynom, Stat, Regress; const NO_REAL_ROOT = - 2; { No real exponent } function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; procedure DerivProc(X : Float; B, D : PVector); function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; procedure InitModel(CstPar : PVector); implementation const N_exp : Integer = 1; { Number of exponentials } ConsTerm : Boolean = True; { Flags the presence of a constant term Ymin } function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function -------------------------------------------------------------------- } var I : Integer; Name, S : String; begin Name := 'y = '; if ConsTerm then Name := Name + 'Ymin + '; Name := Name + 'A1.exp(-a1.x)'; for I := 2 to N_exp do begin Str(I, S); Name := Name + ' + A' + S + '.exp(-a' + S + '.x)'; end; FuncName := Name; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted (0 if there is a constant term Ymin, 1 otherwise) -------------------------------------------------------------------- } begin if ConsTerm then FirstParam := 0 else FirstParam := 1; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted -------------------------------------------------------------------- } begin LastParam := 2 * N_exp; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter -------------------------------------------------------------------- } var S : String; begin if I = 0 then ParamName := 'Ymin' else if Odd(I) then begin Str(Succ(I) div 2, S); ParamName := 'A' + S; end else begin Str(I div 2, S); ParamName := 'a' + S; end; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X B is the vector of parameters, such that : B^[0] = Ymin B^[1] = A1 B^[2] = a1 ............................... B^[2*i-1] = Ai B^[2*i] = ai i = 1..N_exp -------------------------------------------------------------------- } var I : Integer; S : Float; begin if ConsTerm then S := B^[0] else S := 0.0; for I := 1 to N_exp do S := S + B^[2 * I - 1] * Expo(- B^[2 * I] * X); RegFunc := S; end; procedure DerivProc(X : Float; B, D : PVector); { -------------------------------------------------------------------- Computes the derivatives of the regression function at point X with respect to the parameters B. The results are returned in D. D^[I] contains the derivative with respect to the I-th parameter. -------------------------------------------------------------------- } var I, P, Q : Integer; E : Float; begin D^[0] := 1.0; { dy/dYmin = 1 } for I := 1 to N_exp do begin Q := 2 * I; P := Pred(Q); E := Expo(- B^[Q] * X); D^[P] := E; { dy/dAi = exp(-ai.x) } D^[Q] := - X * B^[P] * E; { dy/dai = -x.Ai.exp(-ai.x) } end; end; function FitModel(Method : Integer; X, Y, W : PVector; N : Integer; B : PVector) : Integer; { -------------------------------------------------------------------- Approximate fit of a sum of exponentials by linear regression -------------------------------------------------------------------- Input : Method = 0 for unweighted regression, 1 for weighted X, Y = point coordinates W = weights N = number of points Output : B = estimated regression parameters -------------------------------------------------------------------- Ref. : R. GOMENI & C. GOMENI, Automod : A polyalgorithm for an integrated analysis of linear pharmacokinetic models Comput. Biol. Med., 1979, 9, 39-48 -------------------------------------------------------------------- } var I, K, M : Integer; X1, Y1 : PVector; { Modified coordinates } U : PMatrix; { Variables for linear regression } P : PVector; { Linear regression parameters } C, Z : PVector; { Coefficients and roots of polynomial } V : PMatrix; { Variance-covariance matrix } H : Float; { Integration step } ErrCode : Integer; { Error code } begin M := Pred(2 * N_exp); DimVector(X1, N); DimVector(Y1, N); DimMatrix(U, M, N); DimMatrix(V, M, M); DimVector(P, M); DimVector(C, N_exp); DimVector(Z, N_exp); CopyVector(X1, X, 1, N); CopyVector(Y1, Y, 1, N); { Change scale so that the X's begin at zero } if X^[1] <> 0.0 then for K := 1 to N do X1^[K] := X1^[K] - X^[1]; { Estimate the constant term at 90% of the lowest observed value, then subtract it from each Y value } if ConsTerm then begin B^[0] := 0.9 * Min(Y1, 1, N); for K := 1 to N do Y1^[K] := Y1^[K] - B^[0]; end; { ------------------------------------------------------------------ Fit the linearized form of the function : y = p(0) + p(1) * x + p(2) * x^2 + ... + p(N_exp-1) * x^(N_exp-1) (x (x (x + p(N_exp) | y dx + ... + p(2*N_exp-1) | ....| y dx )0 )0 )0 ------------------------------------------------------------------ } { Compute increasing powers of X } if N_exp > 1 then for K := 2 to N do begin U^[1]^[K] := X1^[K]; for I := 2 to Pred(N_exp) do U^[I]^[K] := U^[I - 1]^[K] * X1^[K]; end; { Compute integrals by the trapezoidal rule } for K := 2 to N do begin H := 0.5 * (X1^[K] - X1^[K - 1]); U^[N_exp]^[K] := U^[N_exp]^[K - 1] + (Y1^[K] + Y1^[K - 1]) * H; for I := Succ(N_exp) to M do U^[I]^[K] := U^[I]^[K - 1] + (U^[I - 1]^[K] + U^[I - 1]^[K - 1]) * H; end; { Fit the equation } case Method of 0 : ErrCode := MulFit(U, Y1, N, M, True, P, V); 1 : ErrCode := WMulFit(U, Y1, W, N, M, True, P, V); end; if ErrCode = MAT_SINGUL then FitModel := ErrCode else begin { ---------------------------------------------------------------- The exponents are the roots of the polynomial : x^N_exp + p(N_exp) * x^(N_exp-1) - p(N_exp+1) * x^(N_exp-2) +... ---------------------------------------------------------------- } { Compute polynomial coefficients } C^[N_exp] := 1.0; for I := 1 to N_exp do if Odd(I) then C^[N_exp - I] := P^[N_exp + I - 1] else C^[N_exp - I] := - P^[N_exp + I - 1]; { Solve polynomial } if RRootPol(C, N_exp, Z) <> N_exp then FitModel := NO_REAL_ROOT else begin { Sort exponents in decreasing order } DQSort(Z, 1, N_exp); { Compute the coefficients of the exponentials by linear regression on the exponential terms } for I := 1 to N_exp do for K := 1 to N do U^[I]^[K] := Expo(- Z^[I] * X1^[K]); case Method of 0 : ErrCode := MulFit(U, Y1, N, N_exp, False, P, V); 1 : ErrCode := WMulFit(U, Y1, W, N, N_exp, False, P, V); end; if ErrCode = MAT_SINGUL then FitModel := ErrCode else begin { Extract model parameters } for I := 1 to N_exp do begin { Correct for scale change if necessary } if X^[1] <> 0.0 then P^[I] := P^[I] * Expo(Z^[I] * X^[1]); { Extract coefficients and exponents } B^[2 * I - 1] := P^[I]; { Coefficients } B^[2 * I] := Z^[I]; { Exponents } end; FitModel := MAT_OK; end; end; end; DelVector(X1, N); DelVector(Y1, N); DelMatrix(U, M, N); DelMatrix(V, M, M); DelVector(P, M); DelVector(C, N_exp); DelVector(Z, N_exp); end; procedure InitModel(CstPar : PVector); { -------------------------------------------------------------------- Initializes the global variables of the unit -------------------------------------------------------------------- CstPar^[0] = number of exponentials CstPar^[1] = 1 to include a constant term (Ymin) -------------------------------------------------------------------- } var N : Integer; begin N := Round(CstPar^[0]); if N > 0 then N_exp := N; ConsTerm := (CstPar^[1] = 1); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fitexlin.pas0000664000175000017500000001033011326434466022074 0ustar michaelmichael{ ********************************************************************** * Unit FITEXLIN.PAS * * Version 1.1 * * (c) J. Debord, August 2000 * ********************************************************************** This unit fits the "exponential + linear" model: y = A.[1 - exp(-k.x)] + B.x ********************************************************************** } unit FitExLin; {$F+} interface uses FMath, Matrices, Stat, Regress; function FuncName : String; function FirstParam : Integer; function LastParam : Integer; function ParamName(I : Integer) : String; function RegFunc(X : Float; B : PVector) : Float; procedure DerivProc(X : Float; B, D : PVector); function FitModel(X, Y : PVector; N : Integer; B : PVector) : Integer; implementation function FuncName : String; { -------------------------------------------------------------------- Returns the name of the regression function -------------------------------------------------------------------- } begin FuncName := 'y = A[1 - exp(-k.x)] + B.x'; end; function FirstParam : Integer; { -------------------------------------------------------------------- Returns the index of the first parameter to be fitted -------------------------------------------------------------------- } begin FirstParam := 0; end; function LastParam : Integer; { -------------------------------------------------------------------- Returns the index of the last parameter to be fitted -------------------------------------------------------------------- } begin LastParam := 2; end; function ParamName(I : Integer) : String; { -------------------------------------------------------------------- Returns the name of the I-th parameter -------------------------------------------------------------------- } begin case I of 0 : ParamName := 'A'; 1 : ParamName := 'k'; 2 : ParamName := 'B'; end; end; function RegFunc(X : Float; B : PVector) : Float; { -------------------------------------------------------------------- Computes the regression function at point X B is the vector of parameters, such that : B^[0] = A B^[1] = k B^[2] = B -------------------------------------------------------------------- } begin RegFunc := B^[0] * (1.0 - Expo(- B^[1] * X)) + B^[2] * X; end; procedure DerivProc(X : Float; B, D : PVector); { -------------------------------------------------------------------- Computes the derivatives of the regression function at point X with respect to the parameters B. The results are returned in D. D^[I] contains the derivative with respect to the I-th parameter. -------------------------------------------------------------------- } var E : Float; begin E := Expo(- B^[1] * X); { exp(-k.x) } D^[0] := 1.0 - E; { dy/dA = 1 - exp(-k.x) } D^[1] := B^[0] * X * E; { dy/dk = A.x.exp(-k.x) } D^[2] := X; { dy/dB = x } end; function FitModel(X, Y : PVector; N : Integer; B : PVector) : Integer; { -------------------------------------------------------------------- Computes initial estimates of the regression parameters -------------------------------------------------------------------- Input : N = number of points X, Y = point coordinates Output : B = estimated regression parameters -------------------------------------------------------------------- } var K : Integer; D : Float; begin { B is the slope of the last (linear) part of the curve } K := Round(0.9 * N); if K = N then K := Pred(N); B^[2] := (Y^[N] - Y^[K]) / (X^[N] - X^[K]); { A is the intercept of the linear part } B^[0] := Y^[N] - B^[2] * X^[N]; { Slope of the tangent at origin = B + k.A } K := Round(0.1 * N); if K = 1 then K := 2; D := (Y^[K] - Y^[1]) / (X^[K] - X^[1]); B^[1] := (D - B^[1]) / B^[0]; FitModel := 0; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/fcomp.pas0000664000175000017500000004340711326434466021371 0ustar michaelmichael{ ********************************************************************** * Unit FCOMP.PAS * * Version 1.1 * * (c) J. Debord, July 2000 * ********************************************************************** Complex functions for TPMATH (Based on CMPLX.ZIP by E.F. Glynn) ********************************************************************** } unit FComp; interface uses FMath; { ********************************************************************** Complex type ********************************************************************** } type ComplexForm = (Rec, Pol); { Rectangular or Polar form } Complex = record case Form : ComplexForm of Rec : (X, Y : Float); Pol : (R, Theta : Float); end; const C_infinity : Complex = (Form : Rec; X : MAXNUM; Y : 0.0); C_zero : Complex = (Form : Rec; X : 0.0; Y : 0.0); C_one : Complex = (Form : Rec; X : 1.0; Y : 0.0); C_i : Complex = (Form : Rec; X : 0.0; Y : 1.0); C_pi : Complex = (Form : Rec; X : PI; Y : 0.0); C_pi_div_2 : Complex = (Form : Rec; X : PIDIV2; Y : 0.0); { ********************************************************************** Complex number initialization and conversion ********************************************************************** } procedure CSet(var Z : Complex; A, B : Float; F : ComplexForm); { ---------------------------------------------------------------------- Initializes a complex number according to the form specified by F F = Rec ==> Z = A + i * B F = Pol ==> Z = A * Exp(i * B) ---------------------------------------------------------------------- } procedure CConvert(var Z : Complex; F : ComplexForm); { Converts the complex number Z to the form specified by F } procedure CSwap(var X, Y : Complex); { Exchanges two complex numbers } { ********************************************************************** Complex functions ********************************************************************** } function CReal(Z : Complex) : Float; { Re(Z) } function CImag(Z : Complex) : Float; { Im(Z) } function CAbs(Z : Complex) : Float; { |Z| } function CArg(Z : Complex) : Float; { Arg(Z) } function CSgn(Z : Complex) : Integer; { Complex sign } procedure CNeg(A : Complex; var Z : Complex); { Z = -A } procedure CConj(A : Complex; var Z : Complex); { Z = A* } procedure CAdd(A, B : Complex; var Z : Complex); { Z = A + B } procedure CSub(A, B : Complex; var Z : Complex); { Z = A - B } procedure CDiv(A, B : Complex; var Z : Complex); { Z = A / B } procedure CMult(A, B : Complex; var Z : Complex); { Z = A * B } procedure CLn(A : Complex; var Z : Complex); { Z = Ln(A) } procedure CExp(A : Complex; var Z : Complex); { Z = Exp(A) } procedure CPower(A, B : Complex; var Z : Complex); { Z = A^B } procedure CIntPower(A : Complex; N : Integer; var Z : Complex); { Z = A^N } procedure CRealPower(A : Complex; X : Float; var Z : Complex); { Z = A^X } procedure CSqrt(A : Complex; var Z : Complex); { Z = Sqrt(A) } procedure CRoot(A : Complex; K, N : Integer; var Z : Complex); { Z = A^(1/N) } procedure CSin(A : Complex; var Z : Complex); { Z = Sin(A) } procedure CCos(A : Complex; var Z : Complex); { Z = Cos(A) } procedure CTan(A : Complex; var Z : Complex); { Z = Tan(A) } procedure CArcSin(A : Complex; var Z : Complex); { Z = ArcSin(A) } procedure CArcCos(A : Complex; var Z : Complex); { Z = ArcCos(A) } procedure CArcTan(A : Complex; var Z : Complex); { Z = ArcTan(A) } procedure CSinh(A : Complex; var Z : Complex); { Z = Sinh(A) } procedure CCosh(A : Complex; var Z : Complex); { Z = Cosh(A) } procedure CTanh(A : Complex; var Z : Complex); { Z = Tanh(A) } procedure CArcSinh(A : Complex; var Z : Complex); { Z = ArcSinh(A) } procedure CArcCosh(A : Complex; var Z : Complex); { Z = ArcCosh(A) } procedure CArcTanh(A : Complex; var Z : Complex); { Z = ArcTanh(A) } procedure CLnGamma(A : Complex; var Z : Complex); { Z = Ln(Gamma(A)) } implementation {$IFDEF CPU387} {$DEFINE USE_ASM} {$ENDIF} {$IFDEF CPUP2} {$DEFINE USE_ASM} {$ENDIF} procedure CSet(var Z : Complex; A, B : Float; F : ComplexForm); begin Z.Form := F; if F = Pol then begin Z.R := A; Z.Theta := B; end else begin Z.X := A; Z.Y := B; end; end; function CAbs(Z : Complex) : Float; begin if Z.Form = Rec then CAbs := Pythag(Z.X, Z.Y) else CAbs := Z.R; end; function CArg(Z : Complex) : Float; begin if Z.Form = Rec then CArg := ArcTan2(Z.Y, Z.X) else CArg := Z.Theta; end; function CReal(Z : Complex) : Float; begin if Z.Form = Rec then CReal := Z.X else CReal := Z.R * {$IFDEF USE_ASM}fCos{$ELSE}Cos{$ENDIF}(Z.Theta); end; function CImag(Z : Complex) : Float; begin if Z.Form = Rec then CImag := Z.Y else CImag := Z.R * {$IFDEF USE_ASM}fSin{$ELSE}Sin{$ENDIF}(Z.Theta); end; function CSgn(Z : Complex) : Integer; var Re, Im : Float; begin Re := CReal(Z); if Re > 0.0 then CSgn := 1 else if Re < 0.0 then CSgn := - 1 else begin Im := CImag(Z); if Im > 0.0 then CSgn := 1 else if Im < 0.0 then CSgn := - 1 else CSgn := 0; end; end; procedure CConvert(var Z : Complex; F : ComplexForm); var A : Complex; begin if Z.Form = F then Exit; if Z.Form = Pol then begin { Polar-to-rectangular conversion } A.Form := Rec; A.X := Z.R * {$IFDEF USE_ASM}fCos{$ELSE}Cos{$ENDIF}(Z.Theta); A.Y := Z.R * {$IFDEF USE_ASM}fSin{$ELSE}Sin{$ENDIF}(Z.Theta); end else begin { Rectangular-to-polar conversion } A.Form := Pol; if Z.X = 0.0 then if Z.Y = 0.0 then A.R := 0.0 else if Z.Y > 0.0 then A.R := Z.Y else A.R := - Z.Y else A.R := CAbs(Z); A.Theta := ArcTan2(Z.Y, Z.X); end; Z := A; end; procedure CSwap(var X, Y : Complex); var Temp : Complex; begin Temp := X; X := Y; Y := Temp; end; procedure CNeg(A : Complex; var Z : Complex); begin Z.Form := A.Form; if A.Form = Pol then begin Z.R := A.R; Z.Theta := FixAngle(A.Theta + PI) end else begin Z.X := - A.X; Z.Y := - A.Y end; end; procedure CConj(A : Complex; var Z : Complex); begin Z.Form := A.Form; if A.Form = Pol then begin Z.R := A.R; Z.Theta := FixAngle(- A.Theta) end else begin Z.X := A.X; Z.Y := - A.Y end end; procedure CAdd(A, B : Complex; var Z : Complex); begin CConvert(A, Rec); CConvert(B, Rec); Z.Form := Rec; Z.X := A.X + B.X; Z.Y := A.Y + B.Y; end; procedure CSub(A, B : Complex; var Z : Complex); begin CConvert(A, Rec); CConvert(B, Rec); Z.Form := Rec; Z.X := A.X - B.X; Z.Y := A.Y - B.Y; end; procedure CMult(A, B : Complex; var Z : Complex); begin CConvert(B, A.Form); { arbitrarily convert one to type of other } Z.Form := A.Form; if A.Form = Pol then begin Z.R := A.R * B.R; Z.Theta := FixAngle(A.Theta + B.Theta) end else begin Z.X := A.X * B.X - A.Y * B.Y; Z.Y := A.X * B.Y + A.Y * B.X end; end; procedure CDiv(A, B : Complex; var Z : Complex); var Temp : Float; begin if ((B.Form = Rec) and (B.X = 0.0) and (B.Y = 0.0)) or ((B.Form = Pol) and (B.R = 0.0)) then begin MathErr := FN_OVERFLOW; Z := C_infinity; Exit; end; CConvert(B, A.Form); { arbitrarily convert one to type of other } Z.Form := A.Form; if A.Form = Pol then begin Z.R := A.R / B.R; Z.Theta := FixAngle(A.Theta - B.Theta); end else begin Temp := Sqr(B.X) + Sqr(B.Y); Z.X := (A.X * B.X + A.Y * B.Y) / Temp; Z.Y := (A.Y * B.X - A.X * B.Y) / Temp; end; end; procedure CLn(A : Complex; var Z : Complex); var LnR : Float; begin CConvert(A, Pol); LnR := Log(A.R); if MathErr = FN_OK then CSet(Z, LnR, FixAngle(A.Theta), Rec) else CSet(Z, - MAXNUM, 0.0, Rec); end; procedure CExp(A : Complex; var Z : Complex); var ExpX, SinY, CosY : Float; begin CConvert(A, Rec); ExpX := Expo(A.X); if MathErr = FN_OK then begin SinY := {$IFDEF USE_ASM}fSin{$ELSE}Sin{$ENDIF}(A.Y); CosY := {$IFDEF USE_ASM}fCos{$ELSE}Cos{$ENDIF}(A.Y); CSet(Z, ExpX * CosY, ExpX * SinY, Rec); end else CSet(Z, ExpX, 0.0, Rec); end; procedure CPower(A, B : Complex; var Z : Complex); var BLnA, LnA : Complex; begin CConvert(A, Rec); CConvert(B, Rec); if (A.X = 0.0) and (A.Y = 0.0) then if (B.X = 0.0) and (B.Y = 0.0) then Z := C_one { lim a^a = 1 as a -> 0 } else Z := C_zero { 0^b = 0, b > 0 } else begin CLn(A, LnA); CMult(B, LnA, BLnA); CExp(BLnA, Z); end; end; procedure CIntPower(A : Complex; N : Integer; var Z : Complex); { CIntPower directly applies DeMoivre's theorem to calculate an integer power of a complex number. The formula holds for both positive and negative values of N } begin CConvert(A, Pol); if A.R = 0.0 then if N = 0 then Z := C_one else if N > 0 then Z := C_zero else begin MathErr := FN_SING; Z := C_infinity; end else CSet(Z, IntPower(A.R, N), FixAngle(N * A.Theta), Pol); end; procedure CRealPower(A : Complex; X : Float; var Z : Complex); begin CConvert(A, Pol); if A.R = 0.0 then if X = 0.0 then Z := C_one else if X > 0.0 then Z := C_zero else begin MathErr := FN_SING; Z := C_infinity; end else CSet(Z, Power(A.R, X), FixAngle(X * A.Theta), Pol); end; procedure CRoot(A : Complex; K, N : Integer; var Z : Complex); { CRoot can calculate all 'N' roots of 'A' by varying 'K' from 0..N-1 } { This is another application of DeMoivre's theorem. See CIntPower. } begin if (N <= 0) or (K < 0) or (K >= N) then begin MathErr := FN_DOMAIN; Z := C_zero; Exit; end; CConvert(A, Pol); if A.R = 0.0 then Z := C_zero else CSet(Z, Power(A.R, 1.0 / N), FixAngle((A.Theta + K * TWOPI) / N), Pol); end; procedure CSqrt(A : Complex; var Z : Complex); begin CConvert(A, Pol); if A.R = 0.0 then Z := C_zero else CSet(Z, Sqrt(A.R), FixAngle(0.5 * A.Theta), Pol); end; procedure CCos(A : Complex; var Z : Complex); var SinX, CosX, SinhY, CoshY : Float; begin CConvert(A, Rec); SinCos(A.X, SinX, CosX); SinhCosh(A.Y, SinhY, CoshY); { Called here to set MathErr } CSet(Z, CosX * CoshY, - SinX * SinhY, Rec) end; procedure CSin(A : Complex; var Z : Complex); var SinX, CosX, SinhY, CoshY : Float; begin CConvert(A, Rec); SinCos(A.X, SinX, CosX); SinhCosh(A.Y, SinhY, CoshY); { Called here to set MathErr } CSet(Z, SinX * CoshY, CosX * SinhY, Rec) end; procedure CTan(A : Complex; var Z : Complex); var X2, Y2, SinX2, CosX2, SinhY2, CoshY2, Temp : Float; begin CConvert(A, Rec); X2 := 2.0 * A.X; Y2 := 2.0 * A.Y; SinCos(X2, SinX2, CosX2); SinhCosh(Y2, SinhY2, CoshY2); if MathErr = FN_OK then Temp := CosX2 + CoshY2 else Temp := CoshY2; if Temp <> 0.0 then CSet(Z, SinX2 / Temp, SinhY2 / Temp, Rec) else begin { A = Pi/2 + k*Pi } MathErr := FN_SING; CSet(Z, MAXNUM, 0.0, Rec); end; end; procedure CCosh(A : Complex; var Z : Complex); var SinhX, CoshX, SinY, CosY : Float; begin CConvert(A, Rec); SinCos(A.Y, SinY, CosY); SinhCosh(A.X, SinhX, CoshX); CSet(Z, CoshX * CosY, SinhX * SinY, Rec) end; procedure CSinh(A : Complex; var Z : Complex); var SinhX, CoshX, SinY, CosY : Float; begin CConvert(A, Rec); SinCos(A.Y, SinY, CosY); SinhCosh(A.X, SinhX, CoshX); CSet(Z, SinhX * CosY, CoshX * SinY, Rec) end; procedure CTanh(A : Complex; var Z : Complex); var X2, Y2, SinY2, CosY2, SinhX2, CoshX2, Temp : Float; begin CConvert(A, Rec); X2 := 2.0 * A.X; Y2 := 2.0 * A.Y; SinCos(Y2, SinY2, CosY2); SinhCosh(X2, SinhX2, CoshX2); if MathErr = FN_OK then Temp := CoshX2 + CosY2 else Temp := CoshX2; if Temp <> 0.0 then CSet(Z, SinhX2 / Temp, SinY2 / Temp, Rec) else begin { A = i * (Pi/2 + k*Pi) } MathErr := FN_SING; CSet(Z, 0.0, MAXNUM, Rec); end; end; procedure CArcSin(A : Complex; var Z : Complex); var Rp, Rm, S, T, X2, XX, YY : Float; B : Complex; begin CConvert(A, Rec); CSet(B, A.Y, - A.X, Rec); { Y - i*X } X2 := 2.0 * A.X; XX := Sqr(A.X); YY := Sqr(A.Y); S := XX + YY + 1.0; Rp := 0.5 * Sqrt(S + X2); Rm := 0.5 * Sqrt(S - X2); T := Rp + Rm; Z.Form := Rec; Z.X := ArcSin(Rp - Rm); Z.Y := CSgn(B) * Log(T + Sqrt(Sqr(T) - 1.0)); end; procedure CArcCos(A : Complex; var Z : Complex); begin CArcSin(A, Z); CSub(C_pi_div_2, Z, Z); { Pi/2 - ArcSin(Z) } end; procedure CArcTan(A : Complex; var Z : Complex); var XX, Yp1, Ym1 : Float; begin CConvert(A, Rec); if (A.X = 0.0) and (Abs(A.Y) = 1.0) then { A = +/- i } begin MathErr := FN_SING; CSet(Z, 0.0, Sgn(A.Y) * MAXNUM, Rec); Exit; end; XX := Sqr(A.X); Yp1 := A.Y + 1.0; Ym1 := A.Y - 1.0; Z.Form := Rec; Z.X := 0.5 * (ArcTan2(A.X, - Ym1) - ArcTan2(- A.X, Yp1)); Z.Y := 0.25 * Log((XX + Sqr(Yp1)) / (XX + Sqr(Ym1))); end; procedure CArcSinh(A : Complex; var Z : Complex); { ArcSinH(A) = -i*ArcSin(i*A) } begin CMult(C_i, A, Z); CArcSin(Z, Z); CMult(C_i, Z, Z); CNeg(Z, Z); end; procedure CArcCosh(A : Complex; var Z : Complex); { ArcCosH(A) = CSgn(Y + i(1-X))*i*ArcCos(A) where A = X+iY } var B : Complex; begin CArcCos(A, Z); CMult(C_i, Z, Z); CSet(B, A.Y, 1.0 - A.X, Rec); { Y + i*(1-X) } if CSgn(B) = -1 then CNeg(Z, Z); end; procedure CArcTanh(A : Complex; var Z : Complex); { ArcTanH(A) = -i*ArcTan(i*A) } begin CConvert(A, Rec); if (Abs(A.X) = 1.0) and (A.Y = 0.0) then { A = +/- 1 } begin MathErr := FN_SING; CSet(Z, Sgn(A.X) * MAXNUM, 0.0, Rec); Exit; end; CMult(C_i, A, Z); CArcTan(Z, Z); CMult(C_i, Z, Z); CNeg(Z, Z); end; procedure CApproxLnGamma(Z : Complex; var Sum : Complex); { This is the approximation used in the National Bureau of Standards "Table of the Gamma Function for Complex Arguments," Applied Mathematics Series 34, 1954. The NBS table was created using this approximation over the area 9 < Re(z) < 10 and 0 < Im(z) < 10. Other table values were computed using the relationship: _ _ ln | (z+1) = ln z + ln | (z) } const C : array[1..8] of Float = (8.33333333333333E-02, - 2.77777777777778E-03, 7.93650793650794E-04, - 5.95238095238095E-04, 8.41750841750842E-04, - 1.91752691752692E-03, 6.41025641025641E-03, - 2.95506535947712E-02); var I : Integer; Powers : array[1..8] of Complex; Temp1, Temp2 : Complex; begin CConvert(Z, Rec); CLn(Z, Temp1); { Ln(Z) } CSet(Temp2, Z.X - 0.5, Z.Y, Rec); { Z - 0.5 } CMult(Temp1, Temp2, Sum); { (Z - 0.5)*Ln(Z) } CSub(Sum, Z, Sum); { (Z - 0.5)*ln(Z) - Z } Sum.X := Sum.X + LN2PIDIV2; Temp1 := C_one; CDiv(Temp1, Z, Powers[1]); { Z^(-1) } CMult(Powers[1], Powers[1], Temp2); { Z^(-2) } for I := 2 to 8 do CMult(Powers[I - 1], Temp2, Powers[I]); for I := 8 downto 1 do begin CSet(Temp1, C[I] * Powers[I].X, C[I] * Powers[I].Y, Rec); CAdd(Sum, Temp1, Sum); end end; procedure CLnGamma(A : Complex; var Z : Complex); var LnA, Temp : Complex; begin CConvert(A, Rec); if (A.X <= 0.0) and (A.Y = 0.0) then if (Int(A.X - 1E-8) - A.X) = 0.0 then { Negative integer? } begin MathErr := FN_SING; Z := C_infinity; Exit end; if A.Y < 0.0 then { 3rd or 4th quadrant? } begin CConj(A, A); CLnGamma(A, Z); { Try again in 1st or 2nd quadrant } CConj(Z, Z) { Left this out! 1/3/91 } end else begin if A.X < 9.0 then { "left" of NBS table range } begin CLn(A, LnA); CSet(A, A.X + 1.0, A.Y, Rec); CLnGamma(A, Temp); CSub(Temp, LnA, Z) end else CApproxLnGamma(A, Z) { NBS table range: 9 < Re(z) < 10 } end end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dmath/eigen.pas0000664000175000017500000006037211326434466021354 0ustar michaelmichael{ ********************************************************************** * Unit EIGEN.PAS * * Version 1.8 * * (c) J. Debord, May 2001 * ********************************************************************** Procedures for computing eigenvalues and eigenvectors ********************************************************************** References: 1) Borland's Numerical Methods Toolbox : Jacobi 2) 'Numerical Recipes' by Press et al. : EigenVals, RootPol ********************************************************************** } unit Eigen; interface uses FMath, Matrices; function Jacobi(A : PMatrix; Lbound, Ubound, MaxIter : Integer; Tol : Float; V : PMatrix; Lambda : PVector) : Integer; { ---------------------------------------------------------------------- Eigenvalues and eigenvectors of a symmetric matrix by the iterative method of Jacobi ---------------------------------------------------------------------- Input parameters : A = matrix Lbound = index of first matrix element Ubound = index of last matrix element MaxIter = maximum number of iterations Tol = required precision ---------------------------------------------------------------------- Output parameters : V = matrix of eigenvectors (stored by lines) Lambda = eigenvalues in decreasing order ---------------------------------------------------------------------- Possible results : MAT_OK MAT_NON_CONV ---------------------------------------------------------------------- NB : 1. The eigenvectors are normalized, with their first component > 0 2. This procedure destroys the original matrix A ---------------------------------------------------------------------- } function EigenVals(A : PMatrix; Lbound, Ubound : Integer; Lambda_Re, Lambda_Im : PVector) : Integer; { ---------------------------------------------------------------------- Eigenvalues of a general square matrix ---------------------------------------------------------------------- Input parameters : A = matrix Lbound = index of first matrix element Ubound = index of last matrix element ---------------------------------------------------------------------- Output parameters : Lambda_Re = real part of eigenvalues Lambda_Im = imaginary part of eigenvalues ---------------------------------------------------------------------- Possible results : MAT_OK MAT_NON_CONV ---------------------------------------------------------------------- NB : This procedure destroys the original matrix A ---------------------------------------------------------------------- } function EigenVect(A : PMatrix; Lbound, Ubound : Integer; Lambda, Tol : Float; V : PVector) : Integer; { ---------------------------------------------------------------------- Computes the eigenvector associated to a real eigenvalue ---------------------------------------------------------------------- Input parameters : A = matrix Lbound = index of first matrix element Ubound = index of last matrix element Lambda = eigenvalue Tol = required precision ---------------------------------------------------------------------- Output parameters : V = eigenvector ---------------------------------------------------------------------- Possible results : MAT_OK MAT_NON_CONV ---------------------------------------------------------------------- NB : 1. The eigenvector is normalized, with its first component > 0 2. The function returns only one eigenvector, even if the eigenvalue has a multiplicity greater than 1. ---------------------------------------------------------------------- } procedure DivLargest(V : PVector; Lbound, Ubound : Integer; var Largest : Float); { ---------------------------------------------------------------------- Normalizes an eigenvector V by dividing by the element with the largest absolute value ---------------------------------------------------------------------- } function RootPol(Coef : PVector; Deg : Integer; X_Re, X_Im : PVector) : Integer; { ---------------------------------------------------------------------- Real and complex roots of a real polynomial by the method of the companion matrix ---------------------------------------------------------------------- Input parameters : Coef = coefficients of polynomial Deg = degree of polynomial ---------------------------------------------------------------------- Output parameters : X_Re = real parts of root (in increasing order) X_Im = imaginary parts of root ---------------------------------------------------------------------- Possible results : MAT_OK MAT_NON_CONV ---------------------------------------------------------------------- } implementation function Jacobi(A : PMatrix; Lbound, Ubound, MaxIter : Integer; Tol : Float; V : PMatrix; Lambda : PVector) : Integer; var SinTheta, CosTheta, TanTheta, Tan2Theta : Float; CosSqr, SinSqr, SinCos, SumSqrDiag : Float; AII, AJJ, AIJ, AIK, AJK, VIK, VJK, D : Float; I, J, K, Iter : Integer; Done : Boolean; begin Iter := 0; for I := Lbound to Ubound do for J := Lbound to Ubound do if I = J then V^[I]^[J] := 1.0 else V^[I]^[J] := 0.0; repeat Iter := Succ(Iter); SumSqrDiag := 0.0; for I := Lbound to Ubound do SumSqrDiag := SumSqrDiag + Sqr(A^[I]^[I]); Done := True; for I := Lbound to Pred(Ubound) do for J := Succ(I) to Ubound do if Abs(A^[I]^[J]) > Tol * SumSqrDiag then begin Done := False; { Calculate rotation } D := A^[I]^[I] - A^[J]^[J]; if Abs(D) > MACHEP then begin Tan2Theta := D / (2.0 * A^[I]^[J]); TanTheta := - Tan2Theta + Sgn(Tan2Theta) * Sqrt(1.0 + Sqr(Tan2Theta)); CosTheta := 1.0 / Sqrt(1.0 + Sqr(TanTheta)); SinTheta := CosTheta * TanTheta; end else begin CosTheta := SQRT2DIV2; { Sqrt(2)/2 } SinTheta := Sgn(A^[I]^[J]) * SQRT2DIV2; end; { Rotate matrix } CosSqr := Sqr(CosTheta); SinSqr := Sqr(SinTheta); SinCos := SinTheta * CosTheta; AII := A^[I]^[I] * CosSqr + 2.0 * A^[I]^[J] * SinCos + A^[J]^[J] * SinSqr; AJJ := A^[I]^[I] * SinSqr - 2.0 * A^[I]^[J] * SinCos + A^[J]^[J] * CosSqr; AIJ := (A^[J]^[J] - A^[I]^[I]) * SinCos + A^[I]^[J] * (CosSqr - SinSqr); for K := Lbound to Ubound do if not(K in [I, J]) then begin AIK := A^[I]^[K] * CosTheta + A^[J]^[K] * SinTheta; AJK := - A^[I]^[K] * SinTheta + A^[J]^[K] * CosTheta; A^[I]^[K] := AIK; A^[K]^[I] := AIK; A^[J]^[K] := AJK; A^[K]^[J] := AJK; end; A^[I]^[I] := AII; A^[J]^[J] := AJJ; A^[I]^[J] := AIJ; A^[J]^[I] := AIJ; { Rotate eigenvectors } for K := Lbound to Ubound do begin VIK := CosTheta * V^[I]^[K] + SinTheta * V^[J]^[K]; VJK := - SinTheta * V^[I]^[K] + CosTheta * V^[J]^[K]; V^[I]^[K] := VIK; V^[J]^[K] := VJK; end; end; until Done or (Iter > MaxIter); { The diagonal terms of the transformed matrix are the eigenvalues } for I := Lbound to Ubound do Lambda^[I] := A^[I]^[I]; if Iter > MaxIter then begin Jacobi := MAT_NON_CONV; Exit; end; { Sort eigenvalues and eigenvectors } for I := Lbound to Pred(Ubound) do begin K := I; D := Lambda^[I]; for J := Succ(I) to Ubound do if Lambda^[J] > D then begin K := J; D := Lambda^[J]; end; FSwap(Lambda^[I], Lambda^[K]); SwapRows(I, K, V, Lbound, Ubound); end; { Make sure that the first component of each eigenvector is > 0 } for I := Lbound to Ubound do if V^[I]^[Lbound] < 0.0 then for J := Lbound to Ubound do V^[I]^[J] := - V^[I]^[J]; Jacobi := MAT_OK; end; procedure Balance(A : PMatrix; Lbound, Ubound : Integer); { Balances the matrix, i.e. reduces norm without affecting eigenvalues } const RADIX = 2; { Base used for machine computations } var I, J, Last : Integer; C, F, G, R, S, Sqrdx : Float; begin Sqrdx := Sqr(RADIX); repeat Last := 1; for I := Lbound to Ubound do begin C := 0.0; R := 0.0; for J := Lbound to Ubound do if J <> I then begin C := C + Abs(A^[J]^[I]); R := R + Abs(A^[I]^[J]); end; if (C <> 0.0) and (R <> 0.0) then begin G := R / RADIX; F := 1.0; S := C + R; while C < G do begin F := F * RADIX; C := C * Sqrdx; end; G := R * RADIX; while C > G do begin F := F / RADIX; C := C / Sqrdx; end; if (C + R) / F < 0.95 * S then begin Last := 0; G := 1.0 / F; for J := Lbound to Ubound do A^[I]^[J] := A^[I]^[J] * G; for J := Lbound to Ubound do A^[J]^[I] := A^[J]^[I] * F; end; end; end; until Last <> 0; end; procedure ElmHes(A : PMatrix; Lbound, Ubound : Integer); { Reduces the matrix to upper Hessenberg form by elimination } var I, J, M : Integer; X, Y : Float; begin for M := Succ(Lbound) to Pred(Ubound) do begin X := 0.0; I := M; for J := M to Ubound do if Abs(A^[J]^[M - 1]) > Abs(X) then begin X := A^[J]^[M - 1]; I := J; end; if I <> M then begin for J := Pred(M) to Ubound do FSwap(A^[I]^[J], A^[M]^[J]); for J := Lbound to Ubound do FSwap(A^[J]^[I], A^[J]^[M]); end; if X <> 0.0 then for I := Succ(M) to Ubound do begin Y := A^[I]^[M - 1]; if Y <> 0.0 then begin Y := Y / X; A^[I]^[M - 1] := Y; for J := M to Ubound do A^[I]^[J] := A^[I]^[J] - Y * A^[M]^[J]; for J := Lbound to Ubound do A^[J]^[M] := A^[J]^[M] + Y * A^[J]^[I]; end; end; end; for I := (Lbound + 2) to Ubound do for J := Lbound to (I - 2) do A^[I]^[J] := 0.0; end; function Hqr(A : PMatrix; Lbound, Ubound : Integer; Lambda_Re, Lambda_Im : PVector) : Integer; { Finds the eigenvalues of an upper Hessenberg matrix } label 2, 3, 4; var I, Its, J, K, L, M, N : Integer; Anorm, P, Q, R, S, T, U, V, W, X, Y, Z : Float; function Sign(A, B : Float) : Float; begin if B < 0.0 then Sign := - Abs(A) else Sign := Abs(A) end; begin Anorm := Abs(A^[1]^[1]); for I := Succ(Lbound) to Ubound do for J := I - 1 to Ubound do Anorm := Anorm + Abs(A^[I]^[J]); N := Ubound; T := 0.0; while N >= Lbound do begin Its := 0; 2: for L := N downto Succ(Lbound) do begin S := Abs(A^[L - 1]^[L - 1]) + Abs(A^[L]^[L]); if S = 0.0 then S := Anorm; if Abs(A^[L]^[L - 1]) <= MACHEP * S then goto 3 end; L := Lbound; 3: X := A^[N]^[N]; if L = N then begin Lambda_Re^[N] := X + T; Lambda_Im^[N] := 0.0; N := N - 1 end else begin Y := A^[N - 1]^[N - 1]; W := A^[N]^[N - 1] * A^[N - 1]^[N]; if L = N - 1 then begin P := 0.5 * (Y - X); Q := Sqr(P) + W; Z := Sqrt(Abs(Q)); X := X + T; if Q >= 0.0 then begin Z := P + Sign(Z, P); Lambda_Re^[N] := X + Z; Lambda_Re^[N - 1] := Lambda_Re^[N]; if Z <> 0.0 then Lambda_Re^[N] := X - W / Z; Lambda_Im^[N] := 0.0; Lambda_Im^[N - 1] := 0.0 end else begin Lambda_Re^[N] := X + P; Lambda_Re^[N - 1] := Lambda_Re^[N]; Lambda_Im^[N] := Z; Lambda_Im^[N - 1] := - Z end; N := N - 2 end else begin if Its = 30 then begin Hqr := MAT_NON_CONV; Exit; end; if (Its = 10) or (Its = 20) then begin T := T + X; for I := Lbound to N do A^[I]^[I] := A^[I]^[I] - X; S := Abs(A^[N]^[N - 1]) + Abs(A^[N - 1]^[N - 2]); X := 0.75 * S; Y := X; W := - 0.4375 * Sqr(S) end; Its := Its + 1; for M := N - 2 downto L do begin Z := A^[M]^[M]; R := X - Z; S := Y - Z; P := (R * S - W) / A^[M + 1]^[M] + A^[M]^[M + 1]; Q := A^[M + 1]^[M + 1] - Z - R - S; R := A^[M + 2]^[M + 1]; S := Abs(P) + Abs(Q) + Abs(R); P := P / S; Q := Q / S; R := R / S; if M = L then goto 4; U := Abs(A^[M]^[M - 1]) * (Abs(Q) + Abs(R)); V := Abs(P) * (Abs(A^[M - 1]^[M - 1]) + Abs(Z) + Abs(A^[M + 1]^[M + 1])); if U <= MACHEP * V then goto 4 end; 4: for I := M + 2 to N do begin A^[I]^[I - 2] := 0.0; if I <> (M + 2) then A^[I]^[I - 3] := 0.0 end; for K := M to N - 1 do begin if K <> M then begin P := A^[K]^[K - 1]; Q := A^[K + 1]^[K - 1]; R := 0.0; if K <> (N - 1) then R := A^[K + 2]^[K - 1]; X := Abs(P) + Abs(Q) + Abs(R); if X <> 0.0 then begin P := P / X; Q := Q / X; R := R / X end end; S := Sign(Sqrt(Sqr(P) + Sqr(Q) + Sqr(R)), P); if S <> 0.0 then begin if K = M then begin if L <> M then A^[K]^[K - 1] := - A^[K]^[K - 1]; end else begin A^[K]^[K - 1] := - S * X end; P := P + S; X := P / S; Y := Q / S; Z := R / S; Q := Q / P; R := R / P; for J := K to N do begin P := A^[K]^[J] + Q * A^[K + 1]^[J]; if K <> (N - 1) then begin P := P + R * A^[K + 2]^[J]; A^[K + 2]^[J] := A^[K + 2]^[J] - P * Z end; A^[K + 1]^[J] := A^[K + 1]^[J] - P * Y; A^[K]^[J] := A^[K]^[J] - P * X end; for I := L to IMin(N, K + 3) do begin P := X * A^[I]^[K] + Y * A^[I]^[K + 1]; if K <> (N - 1) then begin P := P + Z * A^[I]^[K + 2]; A^[I]^[K + 2] := A^[I]^[K + 2] - P * R end; A^[I]^[K + 1] := A^[I]^[K + 1] - P * Q; A^[I]^[K] := A^[I]^[K] - P end end end; goto 2 end end end; Hqr := MAT_OK; end; function EigenVals(A : PMatrix; Lbound, Ubound : Integer; Lambda_Re, Lambda_Im : PVector) : Integer; begin Balance(A, Lbound, Ubound); ElmHes(A, Lbound, Ubound); EigenVals := Hqr(A, Lbound, Ubound, Lambda_Re, Lambda_Im); end; procedure DivLargest(V : PVector; Lbound, Ubound : Integer; var Largest : Float); var I : Integer; begin Largest := V^[Lbound]; for I := Succ(Lbound) to Ubound do if Abs(V^[I]) > Abs(Largest) then Largest := V^[I]; for I := Lbound to Ubound do V^[I] := V^[I] / Largest; end; function EigenVect(A : PMatrix; Lbound, Ubound : Integer; Lambda, Tol : Float; V : PVector) : Integer; procedure SetMatrix(A, A1 : PMatrix; Lbound, Ubound : Integer; Lambda : Float); { Form A1 = A - Lambda * I } var I : Integer; begin CopyMatrix(A1, A, Lbound, Lbound, Ubound, Ubound); for I := Lbound to Ubound do A1^[I]^[I] := A^[I]^[I] - Lambda; end; function Solve(A : PMatrix; Lbound, Ubound, N : Integer; Tol : Float; V : PVector) : Integer; { Solve the system A*X = 0 after fixing the N-th unknown to 1 } var A1, W : PMatrix; B, S, X : PVector; ErrCode, I, I1, J, J1, Ubound1 : Integer; begin Ubound1 := Pred(Ubound); DimMatrix(A1, Ubound1, Ubound1); DimMatrix(W, Ubound1, Ubound1); DimVector(B, Ubound1); DimVector(S, Ubound1); DimVector(X, Ubound1); I1 := Pred(Lbound); for I := Lbound to Ubound do if I <> N then begin Inc(I1); J1 := 0; for J := Lbound to Ubound do if J <> N then begin Inc(J1); A1^[I1]^[J1] := A^[I]^[J]; end else B^[I1] := - A^[I]^[J]; end; ErrCode := SV_Decomp(A1, Lbound, Ubound1, Ubound1, S, W); if ErrCode = 0 then begin SV_SetZero(S, Lbound, Ubound1, Tol); SV_Solve(A1, S, W, B, Lbound, Ubound1, Ubound1, X); { Update eigenvector } I1 := 0; for I := Lbound to Ubound do if I = N then V^[I] := 1.0 else begin Inc(I1); V^[I] := X^[I1]; end; end; DelMatrix(A1, Ubound1, Ubound1); DelMatrix(W, Ubound1, Ubound1); DelVector(B, Ubound1); DelVector(S, Ubound1); DelVector(X, Ubound1); Solve := ErrCode; end; function ZeroVector(B : PVector; Lbound, Ubound : Integer; Tol : Float) : Boolean; { Check if vector B is zero } var I : Integer; Z : Boolean; begin Z := True; for I := Lbound to Ubound do Z := Z and (Abs(B^[I]) < Tol); ZeroVector := Z; end; function CheckEigenVector(A1 : PMatrix; V : PVector; Lbound, Ubound : Integer; Tol : Float) : Boolean; { Check if the equation A1 * V = 0 holds } var I, K : Integer; B : PVector; begin DimVector(B, Ubound); { Form B = A1 * V } for I := Lbound to Ubound do for K := Lbound to Ubound do B^[I] := B^[I] + A1^[I]^[K] * V^[K]; { Check if B is zero } CheckEigenVector := ZeroVector(B, Lbound, Ubound, Tol); DelVector(B, Ubound); end; procedure Normalize(V : PVector; Lbound, Ubound : Integer); { Normalize eigenvector and make sure that the first component is >= 0 } var Sum, Norm : Float; I : Integer; begin Sum := 0.0; for I := Lbound to Ubound do Sum := Sum + Sqr(V^[I]); Norm := Sqrt(Sum); for I := Lbound to Ubound do if V^[I] <> 0.0 then V^[I] := V^[I] / Norm; if V^[Lbound] < 0.0 then for I := Lbound to Ubound do if V^[I] <> 0.0 then V^[I] := - V^[I]; end; var ErrCode, I : Integer; A1 : PMatrix; begin DimMatrix(A1, Ubound, Ubound); { Form A1 = A - Lambda * I } SetMatrix(A, A1, Lbound, Ubound, Lambda); { Try to solve the system A1*V=0 by eliminating 1 equation } I := Lbound; repeat if (Solve(A1, Lbound, Ubound, I, Tol, V) = 0) and CheckEigenVector(A1, V, Lbound, Ubound, Tol) then ErrCode := 0 else ErrCode := - 1; Inc(I); until (ErrCode = 0) or (I > Ubound); if ErrCode = 0 then begin Normalize(V, Lbound, Ubound); EigenVect := MAT_OK; end else EigenVect := MAT_NON_CONV; DelMatrix(A1, Ubound, Ubound); end; function RootPol(Coef : PVector; Deg : Integer; X_Re, X_Im : PVector) : Integer; var A : PMatrix; { Companion matrix } N : Integer; { Size of matrix } I, J, K : Integer; { Loop variables } ErrCode : Integer; { Error code } Temp : Float; begin N := Pred(Deg); DimMatrix(A, N, N); { Set up the companion matrix (to save space, begin at index 0) } for J := 0 to N do A^[0]^[J] := - Coef^[Deg - J - 1] / Coef^[Deg]; for J := 0 to Pred(N) do A^[J + 1]^[J] := 1.0; { The roots of the polynomial are the eigenvalues of the companion matrix } Balance(A, 0, N); ErrCode := Hqr(A, 0, N, X_Re, X_Im); if ErrCode = MAT_OK then begin { Sort roots in increasing order of real parts } for I := 0 to N - 1 do begin K := I; Temp := X_Re^[I]; for J := Succ(I) to N do if X_Re^[J] < Temp then begin K := J; Temp := X_Re^[J]; end; FSwap(X_Re^[I], X_Re^[K]); FSwap(X_Im^[I], X_Im^[K]); end; { Transfer roots from 0..(Deg - 1) to 1..Deg } for J := N downto 0 do begin X_Re^[J + 1] := X_Re^[J]; X_Im^[J + 1] := X_Im^[J]; end; end; DelMatrix(A, N, N); RootPol := ErrCode; end; end. mricron-0.20120505.1~dfsg.1.orig/npm/dice.ico0000664000175000017500000000137607522644474020067 0ustar michaelmichael ш( @€€€€€€€€€€€€РРРџџџџџџџџџџџџˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€‡ˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€™ˆˆˆˆ‰˜ˆˆˆˆˆˆˆˆ€3˜ˆˆˆ˜ˆˆˆˆˆˆˆˆˆ€wywwywwˆˆˆˆˆˆˆˆ€ˆ‰ˆˆ‰ˆˆˆˆˆˆˆˆˆˆ€ˆˆ˜ˆ˜ˆˆˆˆˆˆˆˆˆˆ€ˆˆ‰™ˆˆˆˆˆˆˆˆˆˆˆ€wwww€€ˆˆˆˆ€ˆˆˆˆџџџџџџџџџ€ˆˆˆˆџ№џџџ№џ€wwwwџџџџџˆˆˆˆˆ№џ№ˆˆˆˆˆ№џ№ˆˆˆˆˆџџџџџˆˆˆˆˆџ№џџ№џˆˆˆˆˆџџџ№џџџˆˆˆˆˆџџџџџџˆˆˆˆˆџџџџџџˆˆˆˆˆџџџ№џџџˆˆˆˆˆџ№џџ№џˆˆˆˆˆџџџџџˆˆˆˆˆ№џ№ˆˆˆˆˆ№џ№ˆˆˆˆˆџџџџџˆˆˆˆˆџ№џџџ№џˆˆˆˆˆџџџџџџџџџˆˆˆˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆmricron-0.20120505.1~dfsg.1.orig/npm/design.pas0000664000175000017500000001300511540116510020411 0ustar michaelmichaelunit design; interface uses {$IFNDEF FPC} //Utils, {$ELSE} LResources, {$ENDIF} //{$IFNDEF Unix} Windows,{$ENDIF} Buttons, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin, Grids,nifti_hdr; type String10= String[10]; { TDesignForm } TDesignForm = class(TForm) OKBtn: TButton; AVal: TSpinEdit; Label4: TLabel; Label5: TLabel; ALevelNames: TStringGrid; LesionCovaryCheck: TCheckBox; AddMRIBtn: TButton; Label1: TLabel; TemplateBtn: TButton; TemplateLabel: TLabel; CritPctEdit: TSpinEdit; Label2: TLabel; //procedure LRsetup (var NumColumns,Vars,L1,L2,L3: integer; var OK: boolean); procedure AValChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ALevelNamesEnter(Sender: TObject); procedure ALevelNamesExit(Sender: TObject); procedure AddMRIBtnClick(Sender: TObject); procedure TemplateBtnClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var DesignForm: TDesignForm; implementation uses npmform,spread,hdr; {$IFNDEF FPC} {$R *.DFM} {$ENDIF} const kMaxColumns = 16; {for ANOVA} //maxElements = kMaxColumns; {ANOVA} MaxLen = 12; //kCR = chr (13); //kTab = chr(9); kVALImgFilter = 'Image (*.hdr;*.nii;*.voi)|*.hdr;*.nii;*.nii.gz;*.voi'; procedure TDesignForm.AValChange(Sender: TObject); {$IFDEF FPC} var lOrig,lP: integer; begin lOrig := ALevelNames.ColCount; DesignForm.Caption := inttostr(AVal.Value); ALevelNames.ColCount := AVal.Value; if AVal.value > lOrig then for lP := lOrig to (AVal.value-1) do AlevelNames.Cells[lP,0] := 'Pred'+inttostr(lP+1); end; {$ELSE} begin ALevelNames.ColCount := AVal.Value; end; {$ENDIF} procedure TDesignForm.FormCreate(Sender: TObject); var lC: integer; begin ALevelNames.ColCount := 16 ; AlevelNames.Selection:=TGridRect(Rect(-1,-1,-1,-1)); //AlevelNames.Cells[8,0] := 'Pred'; for lC := 0 to 15 do begin AlevelNames.Cells[lC,0] := 'Pred'+inttostr(lC+1); end; SpreadForm.UpdateLabels; AValChange(nil); end; procedure TDesignForm.ALevelNamesEnter(Sender: TObject); begin AlevelNames.Selection:=TGridRect(Rect(0,0,0,0)); end; procedure TDesignForm.ALevelNamesExit(Sender: TObject); begin AlevelNames.Selection:=TGridRect(Rect(-1,-1,-1,-1)); end; function LeadingZeroFilename (lInX: string): string; var lIn: string; lC,lnPad,lPos,lnDec,lExtPos,lLen: integer; begin {$IFDEF Unix} lIn := lInX; {$ELSE} lIn := Lowercase(lInX); {$ENDIF} lnPad := 8; lLen := length(lIn); result := lIn; if lLen < 1 then exit; lExtPos := 1; while (lExtPos <= lLen) and (lIn[lExtPos] <> '.') do inc(lExtPos); if lExtPos <= 1 then exit; lnDec := 0; lPos := lExtPos -1; while (lPos > 0) and ( lIn[lPos] in ['0'..'9']) do dec(lPos); lnDec := (lExtPos-lPos)-1; if (lnDec = 0) or (lnDec >= lnPad) then exit; result := ''; if lPos > 0 then for lC := 1 to lPos do result := result + lIn[lC]; for lC := 1 to (lnPad-lnDec) do result := result + '0'; for lC := (lPos+1) to lLen do result := result+lIn[lC]; end; procedure SortStrPadded (var lStr: TStringList); {file1,file2...file10 not file1,file10..file2} var counter, look:integer; temp:Tstrings; begin if lStr.Count < 2 then exit; temp := TStringList.Create; for counter:=0 to lStr.Count-1 do temp.Append(LeadingZeroFilename{LowerCase}(lStr[counter])); for counter:=0 to temp.Count-1 do for look:=counter+1 to temp.Count-1 do if temp[look] 0 then //terrible place to do this - RAM problems, but need value to threshold maps lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap2 (lImages, lPrefs.nCrit,lnVoxTested,lPlankImg)); //MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if lPrefs.ttest then begin //save Ttest //next: convert t-scores to z scores for lPos := 1 to lVolVox do lOutImgT^[lPos] := TtoZ (lOutImgT^[lPos],lImages.Count-2); for lPos := 1 to lPrefs.nPermute do begin lPermuteMaxT^[lPos] := TtoZ (lPermuteMaxT^[lPos],lImages.Count-2); lPermuteMinT^[lPos] := TtoZ (lPermuteMinT^[lPos],lImages.Count-2); end; lThresh := MainForm.reportFDR ('ttest', lVolVox, lnVoxTested, lOutImgT); lThreshPermute := MainForm.reportPermute('ttest',lPrefs.nPermute,lPermuteMaxT, lPermuteMinT); lOutNameMod := ChangeFilePostfixExt(lOutName,'ttest'+lFactName,'.hdr'); if lPrefs.Run > 0 then MainForm.NPMmsgAppend('threshtt,'+inttostr(lPrefs.Run)+','+inttostr(MainForm.ThreshMap(lThreshNULP,lVolVox,lOutImgT))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgT,1); end; if lPrefs.BMtest then begin //save Brunner Munzel lThresh := MainForm.reportFDR ('BM', lVolVox, lnVoxTested, lOutImgBM); lThreshPermute := MainForm.reportPermute('BM',lPrefs.nPermute,lPermuteMaxBM, lPermuteMinBM); lOutNameMod := ChangeFilePostfixExt(lOutName,'BM'+lFactName,'.hdr'); if lPrefs.Run > 0 then MainForm.NPMmsgAppend('threshbm,'+inttostr(lPrefs.Run)+','+inttostr(MainForm.ThreshMap(lThreshNULP,lVolVox,lOutImgBM))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgBM,1); end; //next: free dynamic memory 123: MainForm.FreePermute (lPrefs.nPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); freemem(lOutImgT); freemem(lOutImgAUC); freemem(lOutImgBM); freemem(lOutImgSum); freemem(lObsp); if lPlankAllocated then freemem(lPlankImg); //Next: NULPS - do this after closing all memory - this is a memory hog if lPrefs.NULP then lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap (lImages, lPrefs.nCrit,lnVoxTested)); MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lFactName,'.txt'); MainForm.MsgSave(lOutNameMod); MainForm.ProgressBar1.Position := 0; //if lRun > 0 then // AX(freeram,freeram,freeram,freeram,freeram,freeram); exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 1 then freemem(lPlankImg); MainForm.NPMmsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; //LesionNPMAnalyze end. mricron-0.20120505.1~dfsg.1.orig/npm/Copy of prefs.pas0000664000175000017500000002143211326434466021561 0ustar michaelmichaelunit prefs; {$H+} interface uses inifiles, define_types,SysUtils,classes; type TPrefs = record UnusedBool: boolean; Test, Permutations,CritPct: integer; end; const knotest = 0; //no test specified kltest = 1;//binomial Liebermeister test kttest = 2; //t-test kbmtest = 4;//Bruneer-Mnuzel test klrtest = 8; //logisitic regression test //procedure ReadIni(var lIniName: string; var lPrefs: TPrefs); procedure SetDefaultPrefs (var lPrefs: TPrefs); //procedure SaveIni (var lIniName: string; var lPrefs: TPrefs); //procedure CorrectPrefs (var lPrefs: TPrefs); //ensures only usable file types are created procedure ReadParamStr; implementation uses nifti_img, hdr,nifti_hdr; procedure Msg(lStr: string); begin // end; procedure SetDefaultPrefs (var lPrefs: TPrefs); begin lPrefs.unusedbool := true; lPrefs.Test := knotest; lPrefs.Permutations := 0; lPrefs.CritPct := 0; end; function CheckBool (lPref, lFlag: integer): boolean; //check if Flag is ni lPref. For example, if Flag is 1 then returns true for all odd lPrefs begin result := (lPref and lFlag) = lFlag; end; function DoLesion (lPrefs: TPrefs): boolean; label 666; const kSimSampleSize = 64; knSim = 100; kCrit = 3; var //lBinomial: boolean; lSim,lFact,lnFactors,lSubj,lnSubj,lnSubjAll,lMaskVoxels,lnCrit,lnControlObservations: integer; lPartImageNames,lImageNames,lImageNamesAll: TStrings; lPredictorList: TStringList; lTemp4D,lMaskname,lOutName,lFactname,lOutNameSim: string; lMaskHdr: TMRIcroHdr; lMultiSymptomRA,lSymptomRA,lPartSymptomRA,lControlSymptomRA: singleP; begin result := false; //lBinomial := not odd( (Sender as tMenuItem).tag); if (not CheckBool(lPrefs.test ,kltest)) and (not CheckBool(lPrefs.test, kttest)) and (not CheckBool(lPrefs.test, kbmtest)) then begin Msg('Error: you need to compute at least on test [options/test menu]'); exit; end; lImageNamesAll:= TStringList.Create; //not sure why TStrings.Create does not work??? lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? lPartImageNames := TStringList.Create; getmem(lPartSymptomRA,kSimSampleSize*sizeof(single)); lnControlObservations := 20; getmem(lControlSymptomRA,lnControlObservations*sizeof(single)); for lSim := 1 to lnControlObservations do lControlSymptomRA[lSim] := 5; //next, get 1st group if not MainForm.GetVal(lnSubjAll,lnFactors,lMultiSymptomRA,lImageNamesAll,lnCrit,lBinomial,lPredictorList) then begin showmessage('Error with VAL file'); goto 666; end; lTemp4D := MainForm.CreateDecompressed4D(lImageNamesAll); if (lnSubjAll < 1) or (lnFactors < 1) then begin Showmessage('Not enough subjects ('+inttostr(lnSubjAll)+') or factors ('+inttostr(lnFactors)+').'); goto 666; end; lMaskname := lImageNamesAll[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not MainForm.CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; lOutName := ExtractFileDirWithPathDelim(lMaskName)+'results'; MainForm.SaveHdrDlg.Filename := loutname; lOutName := lOutName+'.nii.gz'; if not MainForm.SaveHdrName ('Base Statistical Map', lOutName) then goto 666; for lFact := 1 to lnFactors do begin lImageNames.clear; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then {$ENDIF} lImageNames.Add(lImageNamesAll[lSubj-1]); lnSubj := lImageNames.Count; if lnSubj > 1 then begin getmem(lSymptomRA,lnSubj * sizeof(single)); lnSubj := 0; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then begin {$ELSE} begin{$ENDIF} inc(lnSubj); lSymptomRA^[lnSubj] := lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)]; end; //randomization loop.... for lSim := 1 to knSim do begin RandomGroup(kSimSampleSize, lImageNames,lSymptomRA, lPartImageNames, lPartSymptomRA); lOutNameSim := AddIndexToFilename(lOutName,lSim); lnCrit := kCrit; MainForm.NPMMsgClear; //Msg(GetKVers); MainForm.NPMMsg('Threads: '+inttostr(gnCPUThreads)); lFactName := lPredictorList.Strings[lFact-1]; lFactName := MainForm.LegitFilename(lFactName,lFact); MainForm.NPMMsg('Factor = '+lFactname); For lSubj := 1 to kSimSampleSize do MainForm.NPMMsg (lPartImageNames.Strings[lSubj-1] + ' = '+realtostr(lPartSymptomRA^[lSubj],2) ); MainForm.NPMMsg('Total voxels = '+inttostr(lMaskVoxels)); MainForm.NPMMsg('Only testing voxels damaged in at least '+inttostr(lnCrit)+' individual[s]'); MainForm.NPMMsg('Number of Lesion maps = '+inttostr(kSimSampleSize)); if not MainForm.CheckVoxelsGroup(lPartImageNames,lMaskVoxels) then begin showmessage('File dimensions differ from mask.'); goto 666; end; if lBinomial then MainForm.LesionNPMAnalyzeBinomial(lPartImageNames,lMaskHdr,lnCrit,lPartSymptomRA,lFactname,lOutNameSim) else begin MainForm.ReportDescriptives(lPartSymptomRA,lnSubj); //LesionNPMAnalyze2(lImageNames,lMaskHdr,lnCrit,-1,lSymptomRA,lFactName,lOutname); LesionNPMAnalyze2(lPartImageNames,lMaskHdr,lnCrit,lSim{-1},MainForm.ReadPermute,lPartSymptomRA,lFactName,lOutNameSim,lTTest,lBM); end; end; //for each simulation... Freemem(lSymptomRA); end; //lnsubj > 1 end; //for each factor if lnSubjAll > 0 then begin Freemem(lMultiSymptomRA); end; result := true; 666: lPartImageNames.free; lImageNames.Free; lImageNamesAll.Free; lPredictorList.Free; freemem(lPartSymptomRA); MainForm.DeleteDecompressed4D(lTemp4D); end; procedure ReadParamStr; var lStr: String; I,lError: integer; //lResult,lHelpShown : boolean; lCommandChar: Char; //I,lError: integer; lSingle: single; //lOrigWinWid,lOrigWinCen: Integer;*) lPrefs: TPrefs; begin SetDefaultPrefs(lPrefs); lStr := paramstr(0); lStr := extractfilename(lStr); lStr := string(StrUpper(PChar(lStr))) ; {$IFDEF PNG} if (lStr = 'DCM2PNG.EXE') then gOutputFormat := kPNG; {$ENDIF} if (ParamCount > 0) then begin I := 0; repeat lStr := ''; repeat inc(I); if I = 1 then lStr := ParamStr(I) else begin if lStr <> '' then lStr := lStr +' '+ ParamStr(I) else lStr := ParamStr(I); end; if (length(lStr)>1) and (lStr[1] = '-') and (ParamCount > I) then begin //special command //-z= zoom, -f= format [png,jpeg,bmp], -o= output directory lCommandChar := UpCase(lStr[2]); inc(I); lStr := ParamStr(I); lStr := string(StrUpper(PChar(lStr))) ; case lCommandChar of 'C','P','T': begin //CritPct Val(lStr,lSingle,lError); if lError = 0 then begin if lCommandChar = 'C' then lPrefs.CritPct := round(lSingle) else if lCOmmandChar = 'P' then lPrefs.Permutations := round(lSingle) else if lCOmmandChar = 'T' then lPrefs.Test := round(lSingle); end; //not lError end; //C= CritPct end; //case lStr[2] lStr := ''; end; //special command until (I=ParamCount) or (fileexists(lStr)) {or (gAbort)}; if fileexists(lStr) then begin //lStr := GetLongFileName(lStr); xxx end else if not (gSilent) then begin MyWriteln('0 dcm2jpg ERROR: unable to find '+lStr); if lHelpShown then MyReadln else Showhelp; lHelpShown := true; end; until I >= ParamCount; end else begin //begin test routines.... (* lStr := 'D:\yuv2.dcm'; ResetDCMvalues; lOrigWinWid := gWinWid; lOrigWinCen := gWinCen; LoadData(lStr); gWinWid := lOrigWinWid; gWinCen := lOrigWinCen; //...end test routines(**) ShowHelp; end;{param count > 0} end; end. mricron-0.20120505.1~dfsg.1.orig/npm/Copy of npm.cfg0000664000175000017500000000101111030771072021164 0ustar michaelmichael-$A+ -$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 -LN"c:\program files\borland\delphi4\Lib" -U"C:\pas\mricron\common;C:\pas\mricron\fpmath" -O"C:\pas\mricron\common;C:\pas\mricron\fpmath" -I"C:\pas\mricron\common;C:\pas\mricron\fpmath" -R"C:\pas\mricron\common;C:\pas\mricron\fpmath" mricron-0.20120505.1~dfsg.1.orig/npm/brunner.pas0000664000175000017500000004007111326434466020635 0ustar michaelmichaelunit brunner; interface uses define_types,math,Distr; procedure tBM (lnSubj, lnGroup0: integer; var lIn: DoubleP0; var ltBM,lDF: double); procedure genBMsim (lnSubj: integer; var lOrigOrder: DoubleP0); function BMzVal(lnSubj, lnGroup0: integer; ltBM,lDF: double): double; function continROC (lnSubj, lnGroup0: integer; var lIn: DoubleP0): single; function continROC2 (lnSubj: integer; var lInIV, lInDV: DoubleP0): single; const knPermute= 20000; knSim = 15; var gSimRA: array [1..knSim] of DoubleP; gSimRAp: array [1..knSim] of pointer; implementation function BMzVal(lnSubj,lnGroup0 : integer; ltBM,lDF: double): double; //can be approximated by result := TtoZ(ltBM,lDF); var lnSmallGroup,lJump,lEstimate,i,tie: integer; ltBMs : double; lSwap: boolean; begin //result := TtoZ(ltBM,lDF); exit; lSwap := false; ltBMs := ltBM; result := 0; tie := 0; if (lnSubj div 2) > lnGroup0 then lnSmallGroup := lnGroup0 else lnSmallGroup := lnSubj-lnGroup0; if lnSmallGroup < 1 then exit; if lnSmallGroup > knSim then begin result := TtoZ(ltBMs,lDF); exit; end; if (lnSubj div 2) < lnGroup0 then begin ltBMs := -ltBMs; lSwap := not lSwap; //distributions are not symetrical end; lEstimate := knPermute div 2; //start half way through data lJump := lEstimate div 2; for i := 1 to 9 do begin if gSimRA[lnSmallGroup]^[lEstimate] > ltBMs then lEstimate := lEstimate - lJump else lEstimate := lEstimate + lJump; lJump := (lJump+1) div 2; end; if lEstimate < (knPermute div 2) then begin //p < 0.5 count up for less extreme i := lEstimate-lJump-lJump; if i < 1 then i := 1; while ltBMs > gSimRA[lnSmallGroup]^[i] do begin inc(i); end; if ltBMs = gSimRA[lnSmallGroup]^[i] then begin while ltBMs = gSimRA[lnSmallGroup]^[i] do begin inc(i); dec(tie); end; dec(tie); end; end else begin //p < 0.5 count down for less extreme i := lEstimate+lJump+lJump; if i >= knPermute then i := knPermute; while ltBMs < gSimRA[lnSmallGroup]^[i] do dec(i); if ltBMs = gSimRA[lnSmallGroup]^[i] then begin while ltBMs = gSimRA[lnSmallGroup]^[i] do begin dec(i); inc(tie); end; inc(tie); end; i := i - 1; //indexed from 1 not 0 end; //result := (i+(tie/2)); //result := (1-( (i+(tie/2))/knPermute)); result := pNormalInv(1-( (i+(tie/2))/knPermute)); if lSwap then result := -result; end; procedure Sort (lo, up: integer; var r:DoubleP); //62ms Shell Sort http://www.dcc.uchile.cl/~rbaeza/handbook/algs/4/414.sort.p.html label 999; var d, i, j : integer; tempr : single; begin d := up-lo+1; while d>1 do begin if d<5 then d := 1 else d := trunc( 0.45454*d ); // Do linear insertion sort in steps size d for i:=up-d downto lo do begin tempr := r^[i]; j := i+d; while j <= up do if tempr > r^[j] then begin r^[j-d] := r^[j]; j := j+d end else goto 999; {*** break ***} 999: r^[j-d] := tempr end end end; //sort procedure GenPermute (lnSubj: integer; var lOrigOrder,lRanOrder: DoubleP0); var lInc,lRand: integer; lSwap: double; begin //next lines commented out - this check should be done before inner loop //if lnSubj < 2 then //can not randomize order of single value // exit; //Move(src,dest,count); Move(lOrigOrder^,lRanOrder^,lnSubj*sizeof(double)); //for lInc := 1 to lnSubj do // lRanOrder[lInc-1] := lOrigOrder[lInc-1]; for lInc := lnSubj downto 2 do begin lRand := Random(lInc); lSwap := lRanOrder^[lRand]; lRanOrder^[lRand] := lRanOrder^[lInc-1]; lRanOrder^[lInc-1] := lSwap; end; end; procedure genBMsim (lnSubj: integer; var lOrigOrder: DoubleP0); //1.) creates kSim random permutations of the data //2.) sorts permutations var lRanOrderp: pointer; lRanOrder: DoubleP0; lInc,lnSmallGroup: integer; lOutT,lDF: double; begin if (lnSubj < 1) or (knPermute < 1) then exit; createArray64(lRanOrderp,lRanOrder,lnSubj); //lnSmallGroup := lnGroup0; //if lnSmallGroup > knSim then exit; for lnSmallGroup := 1 to knSim do begin //RandSeed := 128; //same order for all voxels for lInc := 1 to knPermute do begin GenPermute(lnSubj, lOrigOrder,lRanOrder); //generate random order of participants tBM (lnSubj, lnSmallGroup, lRanOrder,lOutT,lDF); gSimRA[lnSmallGroup]^[lInc] := lOutT; end; //next sort permutes... Sort(1,knPermute,gSimRA[lnSmallGroup]); end; freemem(lRanOrderp); end; procedure SortDouble (first, last: integer; var DynDataRA:DoubleP0; var lGroupRA: Bytep0); {Shell sort chuck uses this- see 'Numerical Recipes in C' for similar sorts.} {less memory intensive than recursive quicksort} label 555; const tiny = 1.0e-5; aln2i = 1.442695022; var n, nn, m, lognb2, l, k, j, i: INTEGER; swap: Single; swapbyte: byte; begin n := abs(last - first + 1); lognb2 := trunc(ln(n) * aln2i + tiny); m := last; for nn := 1 to lognb2 do begin m := m div 2; k := last - m; for j := 0 to k do begin i := j; 555: {<- LABEL} l := i + m; if (DynDataRA^[l] < DynDataRA^[i]) then begin swap := DynDataRA^[i]; DynDataRA^[i] := DynDataRA^[l]; DynDataRA^[l] := swap; swapbyte := lGroupRA^[i]; lGroupRA^[i] := lGroupRA^[l]; lGroupRA^[l] := swapbyte; i := i - m; if (i >= 0) then goto 555; end end end end;//sort procedure RankArray (first, last: integer; var DynDataRA:DoubleP0; var lGSum: double); var lnTies,lPos,lStartPos,lRankPos: integer; lScore,lTie : double; begin lGSum := 0; lPos := first; while lPos <= last do begin lStartPos := lPos; lScore := DynDataRA^[lPos]; while (lPos < last) and (lScore = DynDataRA^[lPos+1]) do inc(lPos); //count ties lnTies := lPos - lStartPos; lTie := (lnTies) *0.5; if lnTies > 0 then begin lnTies := lnTies+1;//tj on page 135 of Siegel lGSum := lGSum + (( (lnTies*lnTies*lnTies) - lnTies)/12); //showmessage(inttostr(lnTies)+' '+realtostr(lGSum,4)); end; for lRankPos := lStartPos to lPos do DynDataRA^[lRankPos] := lStartPos+1+lTie; inc(lPos);//start with next value end; end; procedure LocalRank (first, last: integer; var DynDataRA,DynDataRAX:DoubleP0; var lGroupRA: Bytep0); var lGroup,lnTies,lPos,lStartPos,lRankPos,lLocalRank: integer; lScore,lTie : double; begin for lGroup := 0 to 1 do begin lPos := first; lLocalRank := 0; while lPos <= last do begin if lGroupRA^[lPos] = lGroup then begin// inc(lLocalRank); lStartPos := lPos; lScore := DynDataRA^[lPos]; lnTies := 0; while (lPos < last) and (0.001 > abs (lScore - DynDataRA^[lPos+1]) ) do begin inc(lPos); //count ties if lGroupRA^[lPos] = lGroup then inc(lnTies); end; lTie := (lnTies) *0.5; for lRankPos := lStartPos to lPos do begin if lGroupRA^[lRankPos] = lGroup then DynDataRAX^[lRankPos] := (lLocalRank+lTie); end; lLocalRank := lLocalRank + lnTies; end; //if in group inc(lPos);//start with next value end; //while... for each observation end; //for each group end; (*procedure tBM (lnSubj, lnGroup0: integer; var lIn: DoubleP0; var ltBM,lDF: double); //this is a t-test - only use to test BM!!! var i,lnGroupY,lnGroupX: integer; lSumX,lSumY,lSumSqrx,lSumSqry,lVarx,lVary,lS: double; begin lnGroupX := lnGroup0; lnGroupY := lnSubj - lnGroupX; lDF := lnSubj -1; if (lnGroupX < 1) or (lnGroupY < 1) then begin //need at least 1 subj in each group ltBM := 0; exit; end; lSumx := 0; lSumSqrX := 0; for i := 0 to (lnGroupX-1) do begin //for each subject //lVal := lIn[i]; lsumx := lsumx + lIn[i]; lSumSqrX := lSumSqrX + sqr(lIn[i]); end; //lMnX := lsumx/lnGroupX; lVarx := (lnGroupX*lSumSqrX) - Sqr(lsumx); if lnGroupX > 1 then lVarX := lVarX / (lnGroupX*(lnGroupX-1)) else lVarx := 0; lSumy := 0; lSumSqry := 0; for i := lnGroupX to (lnSubj-1) do begin //for each subject //lVal := lIn[i]; lsumy := lsumy + lIn[i]; lSumSqry := lSumSqry + sqr(lIn[i]); end; //for each sub //lMnY := lsumy/lnGroupY; lVary := (lnGroupY*lSumSqrY) - Sqr(lsumy); if lnGroupY > 1 then lVary := lVary / (lnGroupY*(lnGroupY-1)) else lVary := 0; //lm := (lsumx/lnGroupX)-(lsumy/lnGroupY); //mean effect size lmnx - lmny; //ldf := lnSubj - 2; ls := sqrt( ( ((lnGroupX - 1) * lvarx + (lnGroupY - 1) * lvary) / (lnSubj - 2){ldf}) ) ; ls := ls * sqrt(1 / lnGroupX + 1 / lnGroupY); //note - to get here both lnx and lny > 0 if ls = 0 then ltBM := 0 else ltBM := ( ((lsumx/lnGroupX)-(lsumy/lnGroupY))/ls);//t = lm / ls; end; *) procedure tBM (lnSubj, lnGroup0: integer; var lIn: DoubleP0; var ltBM,lDF: double); var lObspX,lObsp: pointer; lObsX,lObs: Doublep0; lGroupRA: Bytep0; i,ln0,ln1: integer; lZ,lGSum: double; lSum0,lSum1,lMean0,lMean1,lSqr0,lSqr1,lk0,lk1: double; begin createArray64(lObsp,lObs,lnSubj); getmem(lGroupRA,lnSubj*sizeof(Byte)); createArray64(lObspX,lObsX,lnSubj); ln0 := 0; ln1 := 0; for i := 0 to (lnSubj-1) do begin //for each subject //lVal := lIn[i]; lObs[i] := lIn[i]; if i < lnGroup0 then //group0 lGroupRA^[i] := 0 else lGroupRA^[i] := 1; end; //for each sub for i := 0 to (lnSubj-1) do if lGroupRA^[i] = 0 then inc(ln0) //number of observations in group zero else inc(ln1); //number of observations in group one if (ln0 > 1) and (ln1 > 1) then begin SortDouble(0,lnSubj-1,lObs,lGroupRA); RankArray(0,lnSubj-1,lObs,lGSum); lSum0 := 0; lSum1 := 0; for i := 0 to (lnSubj-1) do if lGroupRA^[i] = 0 then lSum0 := lSum0 + lObs^[i] else lSum1 := lSum1 + lObs^[i]; lMean0 := lSum0 / ln0; lMean1 := lSum1 / ln1; //fx(lmean0,lMean1); lSqr0 := 0; lSqr1 := 1; lk0 := (ln0+1)/2; lk1 := (ln1+1)/2; LocalRank(0,lnSubj-1,lObs,lObsX,lGroupRA); for i := 0 to (lnSubj-1) do if lGroupRA^[i] = 0 then lSqr0 := lSqr0 + Sqr(lObs^[i]-lObsX^[i]-lMean0+lk0) else lSqr1 := lSqr1 + Sqr(lObs^[i]-lObsX^[i]-lMean1+lk1); lSqr0 := (1/(ln0-1))*lSqr0; lSqr1 := (1/(ln1-1))*lSqr1; lZ := -(ln0*ln1*(lMean1-lMean0))/((ln0+ln1)*sqrt((ln0*lSqr0)+(ln1*lSqr1) ) ); lDF := sqr(ln0*lSqr0+ln1*lSqr1) / ( (sqr(ln0*lSqr0)/(ln0-1)) + (sqr(ln1*lSqr1)/(ln1-1)) ) ; //lZ := TtoZ(lZ,lDF); ltBM := lZ; //fx(lZ,lDF); end else //>1 ltBM := 0; freemem(lObsp); freemem(lObspX); freemem(lGroupRA); end; //tBM (**) procedure SortDoubleP0 (first, last: integer; var DynDataRA:DoubleP0); {Shell sort chuck uses this- see 'Numerical Recipes in C' for similar sorts.} {less memory intensive than recursive quicksort} label 555; const tiny = 1.0e-5; aln2i = 1.442695022; var n, nn, m, lognb2, l, k, j, i: INTEGER; swap: Single; //swapbyte: byte; begin n := abs(last - first + 1); lognb2 := trunc(ln(n) * aln2i + tiny); m := last; for nn := 1 to lognb2 do begin m := m div 2; k := last - m; for j := 0 to k do begin i := j; 555: {<- LABEL} l := i + m; if (DynDataRA^[l] < DynDataRA^[i]) then begin swap := DynDataRA^[i]; DynDataRA^[i] := DynDataRA^[l]; DynDataRA^[l] := swap; i := i - m; if (i >= 0) then goto 555; end end end end;//sort function continROC (lnSubj, lnGroup0: integer; var lIn: DoubleP0): single; //see equation 1 of Obuchiwski, Statistics in Medicine, 25: 481-493 var lSum,lV: double; linc0,linc1,lnGroup1,i: integer; lObsp0,lObsp1: pointer; lObs0,lObs1: Doublep0; begin result := -1; lnGroup1 := lnSubj - lnGroup0; if (lnGroup1 < 1) or (lnGroup0 < 1) then exit; createArray64(lObsp1,lObs1,lnSubj); createArray64(lObsp0,lObs0,lnSubj); for i := 0 to (lnGroup0-1) do //for each subject without disease lObs0[i] := lIn[i]; SortDoubleP0(0,lnGroup0-1,lObs0); for i := lnGroup0 to (lnSubj-1) do //for each subject with disease lObs1[i-lnGroup0] := lIn[i]; SortDoubleP0(0,lnGroup1-1,lObs1); lSum := 0; for linc0 := 0 to (lnGroup0-1) do begin for linc1 := 0 to (lnGroup1-1) do begin if (lObs0^[linc0]) > (lObs1^[linc1]) then lV := 1 else if (lObs0^[linc0]) = (lObs1^[linc1]) then //tie lV := 0.5 else lV := 0; lSum := lV + lSum; end;//for group1 end;//for group0 lSum := lSum * (1/ (lnGroup0*lnGroup1 ) ); result := lSum; freemem(lObsp1); freemem(lObsp0); end; //continROC procedure SortDoubleDouble (first, last: integer; var DynDataRA, lGroupRA: DoubleP0); {Shell sort chuck uses this- see 'Numerical Recipes in C' for similar sorts.} {less memory intensive than recursive quicksort} label 555; const tiny = 1.0e-5; aln2i = 1.442695022; var n, nn, m, lognb2, l, k, j, i: INTEGER; swap,swapbyte: double; begin n := abs(last - first + 1); lognb2 := trunc(ln(n) * aln2i + tiny); m := last; for nn := 1 to lognb2 do begin m := m div 2; k := last - m; for j := 0 to k do begin i := j; 555: {<- LABEL} l := i + m; if (DynDataRA^[l] < DynDataRA^[i]) then begin swap := DynDataRA^[i]; DynDataRA^[i] := DynDataRA^[l]; DynDataRA^[l] := swap; swapbyte := lGroupRA^[i]; lGroupRA^[i] := lGroupRA^[l]; lGroupRA^[l] := swapbyte; i := i - m; if (i >= 0) then goto 555; end end end end;//sort function continROC2 (lnSubj: integer; var lInIV, lInDV: DoubleP0): single; //see equation 9 of Obuchiwski, Statistics in Medicine, 25: 481-493 var lSum,lV: double; linci,lincj,i: integer; lObspIV,lObspDV: pointer; lObsIV,lObsDV: Doublep0; begin result := -1; if (lnSubj < 1) then exit; createArray64(lObspIV,lObsIV,lnSubj); createArray64(lObspDV,lObsDV,lnSubj); for i := 0 to (lnSubj-1) do //for each subject without disease lObsIV[i] := lInIV[i]; for i := 0 to (lnSubj-1) do //for each subject without disease lObsDV[i] := lInDV[i]; SortDoubleDouble(0,lnSubj-1,lObsIV,lObsDV); lSum := 0; for linci := 0 to (lnSubj-1) do begin for lincj := 0 to (lnSubj-1) do begin if lincj <> linci then begin if ((lObsDV^[linci] > lObsDV^[lincj]) and (lObsIV^[linci] > lObsIV^[lincj])) or ((lObsDV^[linci] < lObsDV^[lincj]) and (lObsIV^[linci] < lObsIV^[lincj])) then lV := 1 else if (lObsDV^[linci] = lObsDV^[lincj]) or (lObsIV^[linci] = lObsIV^[lincj]) then //tie lV := 0.5 else lV := 0; lSum := lV + lSum; end; end;//for group1 end;//for group0 lSum := lSum * (1/ (lnSubj* (lnSubj-1) ) ); result := lSum; freemem(lObspDV); freemem(lObspIV); end; //continROC2 var i: integer; initialization begin for i := 1 to knSim do createArray64(gSimRAp[i],gSimRA[i],knPermute); end; finalization begin for i := 1 to knSim do freemem(gSimRAp[i]); end; end. mricron-0.20120505.1~dfsg.1.orig/npm/associate.pas0000664000175000017500000000264311326434466021140 0ustar michaelmichaelunit associate; interface uses Windows,registry,Forms,dialogs,SysUtils; function registerfiletype(inft,inkey,desc,icon:string): boolean; implementation function registerfiletype(inft,inkey,desc,icon:string): boolean; var myreg : treginifile; ct : integer; ft,key: string; begin result := true; ft := inft; key := inkey; ct := pos('.',ft); while ct > 0 do begin delete(ft,ct,1); ct := pos('.',ft); end; if (ft = '') or (Application.ExeName = '') then exit; //not a valid file-ext or ass. app ft := '.'+ft; myreg := treginifile.create(''); try myreg.rootkey := hkey_classes_root; // where all file-types are described if key = '' then key := copy(ft,2,maxint)+'_auto_file'; // if no key-name is given, create one myreg.writestring(ft,'',key); // set a pointer to the description-key myreg.writestring(key,'',desc); // write the description myreg.writestring(key+'\DefaultIcon','',icon); // write the def-icon if given //showmessage(key); myreg.writestring(key+'\shell\open\command','',Application.ExeName+' %1'); //association except result := false; showmessage('Only administrators can change file associations. You are currently logged in as a restricted user.'); end; //finally myreg.free; //end; end; end.mricron-0.20120505.1~dfsg.1.orig/npm/anacom.pas0000664000175000017500000006166411326434466020433 0ustar michaelmichaelunit anacom; interface {$H+} uses define_types,SysUtils, part,StatThds,statcr,StatThdsUtil,Brunner,DISTR,nifti_img, hdr,filename, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,ExtCtrls,Menus, overlap,ReadInt,lesion_pattern,stats,LesionStatThds,nifti_hdr, {$IFDEF FPC} LResources,gzio2, {$ELSE} gziod,associate,{$ENDIF} //must be in search path, e.g. C:\pas\mricron\npm\math {$IFNDEF UNIX} Windows, {$ENDIF} upower,firthThds,firth,IniFiles,cpucount,userdir,math, regmult,utypes; //procedure DoAnaCOM; function AnacomLesionNPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun,lnControl: integer; var lSymptomRA,lControlSymptomRA: SingleP;var lFactname,lOutName: string; lttestIn,lBMIn: boolean): boolean; implementation uses npmform; {$DEFINE NOTmedianfx} function AnacomLesionNPMAnalyze (var lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun,lnControl: integer; var lSymptomRA,lControlSymptomRA: SingleP;var lFactname,lOutName: string; lttestIn,lBMIn: boolean): boolean; label 123,667; var lOutNameMod: string; lPlankImg: byteP; lOutImgSum,lOutImgBM,lOutImgT, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM,lCombinedSymptomRA: singleP; lPos,lPlank,lThread,lnControlsPlusPatients: integer; lVolVox,lMinMask,lMaxMask,lTotalMemory,lnPlanks,lVoxPerPlank, lThreadStart,lThreadEnd,lThreadInc,lnLesion,lnPermute, lPos2,lPos2Offset,lStartVox,lEndVox,lPlankImgPos,lnTests,lnVoxTested,lPosPct: int64; lT,lBMz, lSum,lThresh,lThreshBonf,lThreshPermute,lThreshNULP :double; lObsp: pointer; lObs: Doublep0; lStatHdr: TNIfTIhdr; lFdata: file; lRanOrderp: pointer; lRanOrder: Doublep0; lBM,lttest,lLtest: boolean; lnControlNeg: integer; {$IFDEF medianfx} lmedianFX,lmeanFX,lsummean,lsummedian: double; lmediancount: integer; {$ENDIF} begin lnControlNeg := lnControl; //negative for binomial test lttest := lttestin; lbm := lbmin; if (not (lttest)) and (not (lbm)) then begin lLtest := true; lBM := true; lnControlNeg := -lnControl; end; //lttest:= ttestmenu.checked; //lBM := BMmenu.checked; if lnControl < 1 then begin MainForm.NPMmsg('AnaCom aborted - need data from at least 1 control individual'); exit; end; lnPermute := 0;//MainForm.ReadPermute; MainForm.NPMmsg('Permutations = ' +IntToStr(lnPermute)); MainForm.NPMmsg('Analysis began = ' +TimeToStr(Now)); lTotalMemory := 0; lVolVox := lMaskHdr.NIFTIhdr.dim[1]*lMaskHdr.NIFTIhdr.dim[2]* lMaskHdr.NIFTIhdr.dim[3]; if (lVolVox < 1) then goto 667; lMinMask := 1; lMaxMask := lVolVox; lVoxPerPlank := kPlankSz div lImages.Count div sizeof(byte) ; if (lVoxPerPlank = 0) then goto 667; //no data lTotalMemory := ((lMaxMask+1)-lMinMask) * lImages.Count; if (lTotalMemory = 0) then goto 667; //no data lnPlanks := trunc(lTotalMemory/(lVoxPerPlank*lImages.Count) ) + 1; MainForm.NPMmsg('Memory planks = ' +Floattostr(lTotalMemory/(lVoxPerPlank*lImages.Count))); MainForm.NPMmsg('Max voxels per Plank = ' +Floattostr(lVoxPerPlank)); if (lnPlanks = 1) then getmem(lPlankImg,lTotalMemory) //assumes 1bpp else getmem(lPlankImg,kPlankSz); lStartVox := lMinMask; lEndVox := lMinMask-1; {$IFDEF medianfx} lsummean := 0; lsummedian:= 0; lmediancount := 0; {$ENDIF} for lPos := 1 to lImages.Count do if gScaleRA[lPos] = 0 then gScaleRA[lPos] := 1; lnControlsPlusPatients := lImages.Count+lnControl; createArray64(lObsp,lObs,lnControlsPlusPatients); getmem(lOutImgSum,lVolVox* sizeof(single)); getmem(lOutImgBM,lVolVox* sizeof(single)); getmem(lOutImgT,lVolVox* sizeof(single)); MainForm.InitPermute (lImages.Count, lnPermute, lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp, lRanOrder); for lPos := 1 to lVolVox do begin lOutImgSum^[lPos] := 0; lOutImgBM^[lPos] := 0; lOutImgT^[lPos] := 0; end; //sumptom array for lesions AND controls for lPos := 1 to lImages.Count do lObs^[lPos-1] := lSymptomRA^[lPos]; for lPos := 1 to lnControl do lObs^[lPos-1+lImages.Count] := lControlSymptomRA^[lPos]; getmem(lCombinedSymptomRA,lnControlsPlusPatients* sizeof(single)); for lPos := 1 to lnControlsPlusPatients do lCombinedSymptomRA^[lPos] := lObs^[lPos-1]; //next create permuted BM bounds if lBM then begin MainForm.NPMmsg('Generating BM permutation thresholds'); MainForm.Refresh; //for lPos := 1 to lImages.Count do // lObs^[lPos-1] := lSymptomRA^[lPos]; genBMsim (lnControlsPlusPatients, lObs); end; ClearThreadData(gnCPUThreads,lnPermute) ; for lPlank := 1 to lnPlanks do begin MainForm.NPMmsg('Computing plank = ' +Inttostr(lPlank)); MainForm.Refresh; Application.processmessages; lEndVox := lEndVox + lVoxPerPlank; if lEndVox > lMaxMask then begin lVoxPerPlank := lVoxPerPlank - (lEndVox-lMaxMask); lEndVox := lMaxMask; end; lPlankImgPos := 1; for lPos := 1 to lImages.Count do begin if not LoadImg8(lImages[lPos-1], lPlankImg, lStartVox, lEndVox,round(gOffsetRA[lPos]),lPlankImgPos,gDataTypeRA[lPos],lVolVox) then goto 667; lPlankImgPos := lPlankImgPos + lVoxPerPlank; end;//for each image //threading start lThreadStart := 1; lThreadInc := lVoxPerPlank div gnCPUThreads; lThreadEnd := lThreadInc; Application.processmessages; for lThread := 1 to gnCPUThreads do begin if lThread = gnCPUThreads then lThreadEnd := lVoxPerPlank; //avoid integer rounding error with TLesionContinuous.Create (MainForm.ProgressBar1,lttest,lBM,lnCrit, lnPermute,lThread,lThreadStart,lThreadEnd,lStartVox,lVoxPerPlank,lImages.Count,lnControlNeg,lPlankImg,lOutImgSum,lOutImgBM,lOutImgT,nil,lCombinedSymptomRA) do {$IFDEF FPC} OnTerminate := @MainForm.ThreadDone; {$ELSE}OnTerminate := MainForm.ThreadDone;{$ENDIF} inc(gThreadsRunning); lThreadStart := lThreadEnd + 1; lThreadEnd :=lThreadEnd + lThreadInc; end; //for each thread repeat Application.processmessages; until gThreadsRunning = 0; Application.processmessages; //threading end lStartVox := lEndVox + 1; end; lThreshPermute := 0; lnVoxTested := SumThreadData(gnCPUThreads,lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM); //next report findings if lnVoxTested < 1 then begin MainForm.NPMmsg('**Error: no voxels tested: no regions lesioned in at least '+inttostr(lnCrit)+' patients**'); goto 123; end; MainForm.NPMmsg('Voxels tested = ' +Inttostr(lnVoxTested)); {$IFDEF medianfx} MainForm.NPMmsg('Average MEAN effect size = ' +realtostr((lsummean/lmediancount),3)); MainForm.NPMmsg('Average MEDIAN effect size = ' +realtostr((lsummedian/lmediancount),3)); {$ENDIF} MainForm.NPMmsg('Only tested voxels with more than '+inttostr(lnCrit)+' lesions'); //Next: save results from permutation thresholding.... //Next: save results from permutation thresholding.... lThreshBonf := MainForm.reportBonferroni('Std',lnVoxTested); //Next: NULPS if lRun > 0 then //terrible place to do this - RAM problems, but need value to threshold maps lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap2 (lImages, lnCrit,lnVoxTested,lPlankImg)); //lThreshNULP := MainForm.reportBonferroni('Unique overlap',CountOverlap (lImages, lnCrit)); //next: save data MakeHdr (lMaskHdr.NIFTIhdr,lStatHdr); //save sum map lOutNameMod := ChangeFilePostfixExt(lOutName,'Sum'+lFactName,'.hdr'); if (lRun < 1) then NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); //create new header - subsequent images will use Z-scores MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if (lRun < 1) and (Sum2PowerCont(lOutImgSum,lVolVox,lImages.Count)) then begin lOutNameMod := ChangeFilePostfixExt(lOutName,'Power'+lFactName,'.hdr'); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgSum,1); end; //MakeStatHdr (lMaskHdr.NIFTIhdr,lStatHdr,-6, 6,1{df},0,lnVoxTested,kNIFTI_INTENT_ZSCORE,inttostr(lnVoxTested) ); if lttest then begin //save Ttest //next: convert t-scores to z scores if lnControl < 1 then for lPos := 1 to lVolVox do lOutImgT^[lPos] := TtoZ (lOutImgT^[lPos],lImages.Count-2); for lPos := 1 to lnPermute do begin lPermuteMaxT^[lPos] := TtoZ (lPermuteMaxT^[lPos],lImages.Count-2); lPermuteMinT^[lPos] := TtoZ (lPermuteMinT^[lPos],lImages.Count-2); end; lThresh := MainForm.reportFDR ('ttest', lVolVox, lnVoxTested, lOutImgT); lThreshPermute := MainForm.reportPermute('attest',lnPermute,lPermuteMaxT, lPermuteMinT); lOutNameMod := ChangeFilePostfixExt(lOutName,'attest'+lFactName,'.hdr'); if lRun > 0 then MainForm.NPMmsgAppend('AnaComthreshtt,'+inttostr(lRun)+','+inttostr(MainForm.ThreshMap(lThreshNULP,lVolVox,lOutImgT))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgT,1); end; if lBM then begin //save Mann Whitney lThresh := MainForm.reportFDR ('BM', lVolVox, lnVoxTested, lOutImgBM); lThreshPermute := MainForm.reportPermute('aBM',lnPermute,lPermuteMaxBM, lPermuteMinBM); lOutNameMod := ChangeFilePostfixExt(lOutName,'aBM'+lFactName,'.hdr'); if lRun > 0 then MainForm.NPMmsgAppend('AnaCOMthreshbm,'+inttostr(lRun)+','+inttostr(MainForm.ThreshMap(lThreshNULP,lVolVox,lOutImgBM))+','+realtostr(lThreshNULP,3)+','+realtostr(lThreshPermute,3)+','+realtostr(lThreshBonf,3)); NIFTIhdr_SaveHdrImg(lOutNameMod,lStatHdr,true,not IsNifTiMagic(lMaskHdr.NIFTIhdr),true,lOutImgBM,1); end; //next: free dynamic memory 123: MainForm.FreePermute (lnPermute,lPermuteMaxT, lPermuteMinT,lPermuteMaxBM, lPermuteMinBM, lRanOrderp); freemem(lOutImgT); freemem(lOutImgBM); freemem(lOutImgSum); freemem(lObsp); freemem(lPlankImg); MainForm.NPMmsg('Analysis finished = ' +TimeToStr(Now)); lOutNameMod := ChangeFilePostfixExt(lOutName,'Notes'+lFactName,'.txt'); MainForm.MsgSave(lOutNameMod); MainForm.ProgressBar1.Position := 0; exit; 667: //you only get here if you aborted ... free memory and report error if lTotalMemory > 1 then freemem(lPlankImg); MainForm.NPMmsg('Unable to complete analysis.'); MainForm.ProgressBar1.Position := 0; end; //LesionNPMAnalyze (*function readCSV2 (lFilename: string; lCol1,lCol2: integer; var lnObservations : integer; var ldataRA1,ldataRA2: singlep): boolean; const kHdrRow = 0;//1; kHdrCol = 0;//1; var lNumStr: string; F: TextFile; lTempFloat: double; lCh: char; lnFactors,MaxC,R,C:integer; lError: boolean; begin lError := false; result := false; if not fileexists(lFilename) then begin showmessage('Can not find '+lFilename); exit; end; AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //First pass: determine column height/width Reset(F); C := 0; MaxC := 0; R := 0; while not Eof(F) do begin //read next line //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if lNumStr <> '' then //july06- read data immediately prior to EOF inc(R); if (R <= (kHdrRow+1)) or (MaxC < (kHdrCol+lCol1)) or (MaxC < (kHdrCol+lCol2)) then begin showmessage('problems reading CSV - not enough columns/rows '+inttostr(lCol1)+' '+inttostr(lCol2)); exit; end; lnObservations := R -kHdrRow ; //-1: first row is header.... lnFactors := MaxC-1;// -1: first column is Y values //fx(lnObservations,lnFactors); //exit; getmem(ldataRA1,lnObservations*sizeof(single)); getmem(ldataRA2,lnObservations*sizeof(single)); //second pass Reset(F); C := 1; MaxC := 0; R := 1; lNumStr := ''; lTempfloat := 0; while not Eof(F) do begin //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin if (R > kHdrRow) and (C > kHdrCol) then begin if ((C-kHdrCol) = lCol1) or ((C-kHdrCol) = lCol2) then begin if lNumStr = '-' then begin lTempFloat := 0; end else begin //number try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except //showmessage(lNumStr); if (C-kHdrCol) = lCol1 then ldataRA1^[R-kHdrRow] := lTempFloat else if (C-kHdrCol) = lCol2 then ldataRA2^[R-kHdrRow] := lTempFloat; end; //number end; //col1 or col2 end;// else //R > 1 lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 1; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if (lNumStr <> '') and (C = lnFactors) then begin //unterminated string try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except ldataRA2^[R-1] := lTempFloat; end;//unterminated string //read finel item CloseFile(F); FileMode := 2; //Set file access to read/write result := true; end; *) function readTxt (lFilename: string; var lnObservations : integer; var ldataRA1: singlep): boolean; const kHdrRow = 0;//1; kHdrCol = 0;//1; var lCol1: integer; lNumStr: string; F: TextFile; lTempFloat: double; lCh: char; lnFactors,MaxC,R,C:integer; lError: boolean; begin lCol1:= 1; lError := false; result := false; if not fileexists(lFilename) then begin showmessage('Can not find '+lFilename); exit; end; AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //First pass: determine column height/width Reset(F); C := 0; MaxC := 0; R := 0; while not Eof(F) do begin //read next line //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 0; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; if lNumStr <> '' then //july06- read data immediately prior to EOF inc(R); if (R <= (kHdrRow+1)) or (MaxC < (kHdrCol+lCol1)) then begin showmessage('problems reading CSV - not enough columns/rows '); exit; end; lnObservations := R -kHdrRow ; //-1: first row is header.... lnFactors := kHdrCol+lCol1;// -1: first column is Y values //fx(lnObservations,lnFactors); //exit; getmem(ldataRA1,lnObservations*sizeof(single)); //second pass Reset(F); C := 1; MaxC := 0; R := 1; lNumStr := ''; lTempfloat := 0; while not Eof(F) do begin //read next line Read(F, lCh); if lCh = '#' then while not (lCh in [#10,#13]) do Read(F, lCh) else if not (lCh in [#10,#13,#9,',']) then begin lNumStr := lNumStr + lCh; end else if lNumStr <> '' then begin if (R > kHdrRow) and (C > kHdrCol) then begin if ((C-kHdrCol) = lCol1) {or ((C-kHdrCol) = lCol2)} then begin if lNumStr = '-' then begin lTempFloat := 0; end else begin //number try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except //showmessage(lNumStr); if (C-kHdrCol) = lCol1 then begin //showmessage(lNumStr); ldataRA1^[R-kHdrRow] := lTempFloat; end; {else if (C-kHdrCol) = lCol2 then ldataRA2^[R-kHdrRow] := lTempFloat;} end; //number end; //col1 or col2 end;// else //R > 1 lNumStr := ''; inc(C); if C > MaxC then MaxC := C; if (lCh in [#10,#13]) then begin C := 1; inc(R); end; //eoln end; //if lNumStr <> '' and not tab end; //showmessage(lNumStr+' '+inttostr(lnFactors)+' '+inttostr(C)); if (lNumStr <> '') and (C = lnFactors) then begin //unterminated string try lTempFloat := strtofloat(lNumStr); except on EConvertError do begin if not lError then showmessage('Empty cells? Error reading CSV file row:'+inttostr(R)+' col:'+inttostr(C)+' - Unable to convert the string '+lNumStr+' to a number'); lError := true; lTempFloat := nan; end; end;//except //showmessage(inttostr(R)+' '+floattostr(lTempFLoat)); ldataRA1^[R] := lTempFloat; end;//unterminated string //read finel item CloseFile(F); FileMode := 2; //Set file access to read/write result := true; end; (*procedure DoAnaCOM; label 666; var lControlFilename: string; lI, lnControlObservations : integer; lControldata: singlep; lBinomial: boolean; lFact,lnFactors,lSubj,lnSubj,lnSubjAll,lMaskVoxels,lnCrit: integer; lImageNames,lImageNamesAll: TStrings; lPredictorList: TStringList; lTemp4D,lMaskname,lOutName,lFactname: string; lMaskHdr: TMRIcroHdr; lMultiSymptomRA,lSymptomRA: singleP; begin npmform.MainForm.memo1.lines.clear; npmform.MainForm.memo1.lines.add('AnaCOM analysis requires TXT/CSV format text file.'); npmform.MainForm.memo1.lines.add('One row per control participant.'); npmform.MainForm.memo1.lines.add('First column is performance of that participant.'); npmform.MainForm.memo1.lines.add('Example file:'); //npmform.MainForm.memo1.lines.add('deficit, voxels'); npmform.MainForm.memo1.lines.add('11'); npmform.MainForm.memo1.lines.add('19'); npmform.MainForm.memo1.lines.add('2'); npmform.MainForm.memo1.lines.add('22'); npmform.MainForm.memo1.lines.add('19'); npmform.MainForm.memo1.lines.add('6'); lControlFilename := 'c:\fx.txt'; if (not readTxt (lControlFilename, lnControlObservations,lControldata)) or (lnControlObservations < 1) then begin showmessage('Error reading file '+lControlFilename); exit; end; npmform.MainForm.memo1.lines.add('Control (n='+inttostr(lnControlObservations)+')performance: '); for lI := 1 to lnControlObservations do begin npmform.MainForm.memo1.lines.add(inttostr(lI)+' '+floattostr(lControldata^[lI])); end; //begin - copy lImageNamesAll:= TStringList.Create; //not sure why TStrings.Create does not work??? lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work??? //next, get 1st group if not MainForm.GetVal(lnSubjAll,lnFactors,lMultiSymptomRA,lImageNamesAll,lnCrit,{,binom}lPredictorList) then begin showmessage('Error with VAL file'); goto 666; end; lTemp4D := CreateDecompressed4D(lImageNamesAll); if (lnSubjAll < 1) or (lnFactors < 1) then begin Showmessage('Not enough subjects ('+inttostr(lnSubjAll)+') or factors ('+inttostr(lnFactors)+').'); goto 666; end; lMaskname := lImageNamesAll[0]; if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin showmessage('Error reading 1st mask.'); goto 666; end; lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr); if (lMaskVoxels < 2) or (not CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin showmessage('Mask file size too small.'); goto 666; end; lOutName := ExtractFileDirWithPathDelim(lMaskName)+'results'; MainForm.SaveHdrDlg.Filename := loutname; lOutName := lOutName+'.nii.gz'; if not MainForm.SaveHdrName ('Base Statistical Map', lOutName) then exit; for lFact := 1 to lnFactors do begin lImageNames.clear; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then {$ENDIF} lImageNames.Add(lImageNamesAll[lSubj-1]); lnSubj := lImageNames.Count; if lnSubj > 1 then begin getmem(lSymptomRA,lnSubj * sizeof(single)); lnSubj := 0; for lSubj := 1 to lnSubjAll do {$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then begin {$ELSE} begin{$ENDIF} inc(lnSubj); lSymptomRA^[lnSubj] := lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)]; end; MainForm.NPMmsgClear; MainForm.NPMMsg(MainForm.GetKVers); MainForm.NPMMsg('Threads: '+inttostr(gnCPUThreads)); lFactName := lPredictorList.Strings[lFact-1]; lFactName := LegitFilename(lFactName,lFact); MainForm.NPMMsg('Factor = '+lFactname); For lSubj := 1 to lnSubj do MainForm.NPMMsg (lImageNames.Strings[lSubj-1] + ' = '+realtostr(lSymptomRA^[lSubj],2) ); MainForm.NPMMsg('Total voxels = '+inttostr(lMaskVoxels)); MainForm.NPMMsg('Only testing voxels damaged in at least '+inttostr(lnCrit)+' individual[s]'); MainForm.NPMMsg('Number of Lesion maps = '+inttostr(lnSubj)); if not CheckVoxelsGroup(lImageNames,lMaskVoxels) then begin showmessage('File dimensions differ from mask.'); goto 666; end; MainForm.ReportDescriptives(lSymptomRA,lnSubj); AnacomLesionNPMAnalyze(lImageNames,lMaskHdr,lnCrit,-1,lnControlObservations,lSymptomRA,lControldata,lFactName,lOutname,true {ttest},false{BM}); Freemem(lSymptomRA); end; //lnsubj > 1 end; //for each factor if lnSubjAll > 0 then begin Freemem(lMultiSymptomRA); end; 666: lImageNames.Free; lImageNamesAll.Free; lPredictorList.Free; DeleteDecompressed4D(lTemp4D); ///end //AnacomLesionNPMAnalyze ( lImages: TStrings; var lMaskHdr: TMRIcroHdr; lnCrit,lRun,lnControl: integer; var lSymptomRA,lControlSymptomRA: SingleP;var lFactname,lOutName: string; lttest,lBM: boolean): boolean; freemem(lControldata); end;*) end. mricron-0.20120505.1~dfsg.1.orig/nifti_img_view.pas0000664000175000017500000053646311660465464021411 0ustar michaelmichaelunit nifti_img_view; {$mode delphi} interface {x$IFNDEF Darwin} {$DEFINE COMPILEYOKE} {x$ENDIF} uses {$H+} {$IFDEF Darwin}CarbonOpenDoc,{$ENDIF} {$IFDEF Unix} lclintf,LCLType,//gettickcount ,LMessages {$ELSE} Windows,ShellAPI, {$ENDIF} {$IFDEF COMPILEYOKE} yokesharemem, {$ENDIF} LResources, fx8, cpucount, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, ExtCtrls, StdCtrls, GraphicsMathLibrary, ClipBrd, define_types, Spin, Buttons, nifti_hdr, nifti_hdr_view, nifti_img, voismooth, IniFiles, ReadInt, registry, stat, Distr, bet, mni, prefs, CropEdges, userdir, graphx, GraphType, IntfGraphics, landmarks,fastsmooth; type { TImgForm } TImgForm = class(TForm) AutoContrastBtn: TSpeedButton; ColorBarBtn: TSpeedButton; LayerDrop: TComboBox; LUTdrop: TComboBox; LutFromZeroBtn: TSpeedButton; MainMenu1: TMainMenu; File1: TMenuItem; MaxWindowEdit: TFloatSpinEdit; MenuItem1: TMenuItem; HistoMenu: TMenuItem; Header1: TMenuItem; ApplyClusterThreshold1: TMenuItem; LRFlip1: TMenuItem; ExportasRGBAnalyzeimage1: TMenuItem; BatchROImean1: TMenuItem; Batchprobmaps1: TMenuItem; Batchclusterprobmaps1Batchclusterprobmaps1Click: TMenuItem; Axial1: TMenuItem; Coronal1: TMenuItem; Axial2: TMenuItem; Coronal2: TMenuItem; Landmarks1: TMenuItem; Extract1: TMenuItem; Sagittal2: TMenuItem; Sagittal1: TMenuItem; Multiple1: TMenuItem; PGImageAx: TImage; PGImageSag: TImage; Resliceimage1: TMenuItem; AdjustimagessoVOIintensityiszero1: TMenuItem; Brainmask1: TMenuItem; GenerateSPM5maskslesions1: TMenuItem; RescaleMenu: TMenuItem; BrainExtraction1: TMenuItem; CropEdges1: TMenuItem; NIIVOI: TMenuItem; MinWindowEdit: TFloatSpinEdit; N4DTraces1: TMenuItem; LayerPanel: TPanel; n5: TMenuItem; Preferences1: TMenuItem; Display2: TMenuItem; MNIMenu: TMenuItem; Open1: TMenuItem; CloseImages: TMenuItem; Exit1: TMenuItem; Edit1: TMenuItem; Copy1: TMenuItem; Help1: TMenuItem; About1: TMenuItem; ControlPanel: TPanel; Crosshair1: TMenuItem; Pen1: TMenuItem; Penautoclose1: TMenuItem; CircleSquare1: TMenuItem; YokeTimer: TTimer; XViewEdit: TSpinEdit; YViewEdit: TSpinEdit; ZViewEdit: TSpinEdit; MagPanel: TPanel; ProgressBar1: TProgressBar; StatusLabel: TLabel; LabelX: TLabel; LabelY: TLabel; LabelZ: TLabel; Templates1: TMenuItem; Recent1: TMenuItem; Controls1: TMenuItem; ZoomDrop: TComboBox; Panel1: TPanel; Saveaspicture1: TMenuItem; SaveDialog1: TSaveDialog; ColorDialog1: TColorDialog; RefreshImagesTimer: TTimer; MagnifyMenuItem: TMenuItem; OverlayMenu: TMenuItem; OverlayOpen: TMenuItem; LayerMenu: TMenuItem; Noneopen1: TMenuItem; OverlaySmoothMenu: TMenuItem; CloseOverlayImg: TMenuItem; BGTransPctMenu: TMenuItem; OverlayTransPctMenu: TMenuItem; BGtrans0: TMenuItem; BGtrans20: TMenuItem; BGtrans40: TMenuItem; BGtrans50: TMenuItem; BGtrans60: TMenuItem; BGtrans80: TMenuItem; BGtrans100: TMenuItem; N0opaque1: TMenuItem; N201: TMenuItem; N401: TMenuItem; N501: TMenuItem; N601: TMenuItem; N801: TMenuItem; N100transparent1: TMenuItem; Layerrange1: TMenuItem; Noneopen2: TMenuItem; BGAdditive: TMenuItem; OverlayAdditive: TMenuItem; ShowRender: TMenuItem; DrawMenu: TMenuItem; OpenVOI: TMenuItem; SaveVOI: TMenuItem; CloseVOI: TMenuItem; VOIColor: TMenuItem; TriplePanel: TScrollBox; PGImageCor: TImage; Undo1: TMenuItem; Paste1: TMenuItem; Applyintensityfiltertovolume1: TMenuItem; Quicksmooth1: TMenuItem; MaskimagewithVOI1: TMenuItem; VOImaskDelete: TMenuItem; VOImaskPreserve: TMenuItem; SaveasNIfTI1: TMenuItem; Circle1: TMenuItem; Overlaycomparisons1: TMenuItem; IntersectionmutualtoVOIandoverlays1: TMenuItem; UnionVOIoroverlays1: TMenuItem; MaskVOIbutnotoverlays1: TMenuItem; RescaleImagesTimer: TTimer; SmoothVOI1: TMenuItem; Circle2: TMenuItem; Beta1: TMenuItem; Chisquare1: TMenuItem; Convert1: TMenuItem; ROIVOI1: TMenuItem; Statistics1: TMenuItem; ShowMultislice: TMenuItem; DescriptiveMenuItem: TMenuItem; N1: TMenuItem; HideROIBtn: TSpeedButton; XBarBtn: TSpeedButton; ToolPanel: TPanel; PenBtn: TSpeedButton; ClosedPenBtn: TSpeedButton; FillBtn: TSpeedButton; EllipseBtn: TSpeedButton; Fill3DBtn: TSpeedButton; N2: TMenuItem; Display1: TMenuItem; N3: TMenuItem; FlipLRmenu: TMenuItem; N4: TMenuItem; Menu2DSmooth: TMenuItem; VOI2NII: TMenuItem; Nudge1: TMenuItem; Up1: TMenuItem; Left1: TMenuItem; LeftX1: TMenuItem; RightX1: TMenuItem; Posterior1: TMenuItem; Posterior2: TMenuItem; YokeMenu: TMenuItem; procedure Extract1Click(Sender: TObject); procedure SaveVOIcore(lPromptFilename: boolean); procedure FormOpenFileMethod(const FileName : string); procedure Landmarks1Click(Sender: TObject); procedure SetIniMenus; procedure Batchclusterprobmaps1Batchclusterprobmaps1ClickClick(Sender: TObject); procedure Batchprobmaps1Click(Sender: TObject); procedure BatchROImean1Click(Sender: TObject); procedure BrainMask1Click(Sender: TObject); procedure ControlPanelDragDrop(Sender, Source: TObject; X, Y: Integer); procedure GenerateSPM5maskslesions1Click(Sender: TObject); procedure LoadOverlay (lFilename: string); procedure LoadOverlayIncludingRGB (lFilename: string); procedure ApplyClusterThreshold1Click(Sender: TObject); procedure BETmenuClick(Sender: TObject); procedure C(Sender: TObject); procedure CropMenuClick(Sender: TObject); procedure ExportasRGBAnalyzeimage1Click(Sender: TObject); procedure FormDropFiles(Sender: TObject; const FileNames: array of String); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyPress(Sender: TObject; var Key: char); procedure Header1Click(Sender: TObject); procedure HistoMenuClick(Sender: TObject); procedure LayerDropChange(Sender: TObject); procedure LUTdropChange(Sender: TObject); procedure AdjustimagessoVOIintensityiszero1Click(Sender: TObject); procedure MirrorNII1Click(Sender: TObject); procedure MNIMenuClick(Sender: TObject); procedure N4DTraces1Click(Sender: TObject); procedure NIIVOIClick(Sender: TObject); procedure PGImageCorDblClick(Sender: TObject); procedure Preferences1Click(Sender: TObject); procedure RescaleMenuClick(Sender: TObject); procedure Resliceimage1Click(Sender: TObject); procedure SaveasNIfTI1Click(Sender: TObject); procedure SaveDialog1Close(Sender: TObject); procedure UpdateColorSchemes; procedure UpdateTemplates; procedure UpdateMRU; procedure UpdateStatusLabel; procedure Exit1Click(Sender: TObject); procedure About1Click(Sender: TObject); procedure DisplayHdrClick(Sender: TObject); procedure Open1Click(Sender: TObject); procedure ToolSelectClick(Sender: TObject); procedure Copy1Click(Sender: TObject); procedure FormCreate(Sender: TObject); function OpenAndDisplayImg(var lFilename: string; lAdd2MRU: boolean): boolean; procedure OpenTemplateMRU(Sender: TObject); procedure XViewEditChange(Sender: TObject); procedure ReadIniFile; //read init file values procedure WriteIniFile; {$IFNDEF FPC} procedure FormClose(Sender: TObject; var Action: TCloseAction); {$ELSE} procedure FormClose(Sender: TObject); {$ENDIF} procedure MagnifyTimerTimer(Sender: TObject); procedure MagnifyPanelResize(Sender: TObject); procedure PGImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); procedure PGImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure PGImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure LUTdropLoad(var lLayer: integer); procedure LUTdropSelect(Sender: TObject); procedure ZoomDropChange(Sender: TObject); procedure ZoomDropSelect(Sender: TObject); procedure ColorBarBtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Saveaspicture1Click(Sender: TObject); procedure XBarBtnClick(Sender: TObject); procedure XBarBtnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure XBarBtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure AutoContrastBtnClick(Sender: TObject); procedure RefreshImagesTimerTimer(Sender: TObject); procedure MinContrastWindowEditChange(Sender: TObject); procedure ImgPanelClick(Sender: TObject); procedure MagnifyMenuItemClick(Sender: TObject); procedure CloseImagesClick(Sender: TObject); procedure UpdateLayerMenu; procedure OverlayOpenCore (var lFilename: string; lOverlayNum: integer); procedure OverlayOpenClick(Sender: TObject); procedure CloseOverlayImgClick(Sender: TObject); procedure BGtrans100Click(Sender: TObject); procedure OverlayTransClick(Sender: TObject); procedure LayerDropSelect(Sender: TObject); procedure OverlaySmoothMenuClick(Sender: TObject); procedure MaxContrastWindowEditChange(Sender: TObject); procedure ShowRenderClick(Sender: TObject); procedure PenBtnClick(Sender: TObject); procedure OpenVOIClick(Sender: TObject); procedure OpenVOICore(var lFilename : string); procedure SaveVOIClick(Sender: TObject); procedure VOIColorClick(Sender: TObject); procedure CloseVOIClick(Sender: TObject); procedure SetDimension8(lInPGHt,lInPGWid:integer; lBuff: ByteP; lUndoOnly: boolean); procedure Undo1Click(Sender: TObject); procedure Paste1Click(Sender: TObject); procedure HideROIBtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure HideROIBtnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure XBarColor; procedure Applyintensityfiltertovolume1Click(Sender: TObject); procedure Quicksmooth1Click(Sender: TObject); procedure VOImaskClick(Sender: TObject); procedure Sagittal1Click(Sender: TObject); procedure ROIcomparisonClick(Sender: TObject); procedure RescaleImagesTimerTimer(Sender: TObject); procedure Fill3DBtnClick(Sender: TObject); procedure SmoothVOI1Click(Sender: TObject); procedure CreateOverlap(Sender: TObject); procedure Chisquare1Click(Sender: TObject); procedure ROIVOI1Click(Sender: TObject); procedure LUTinvertBtnClick(Sender: TObject); procedure LutFromZeroBtnClick(Sender: TObject); procedure ShowMultisliceClick(Sender: TObject); procedure DescriptiveMenuItemClick(Sender: TObject); procedure FormResize(Sender: TObject); procedure FormShow(Sender: TObject); procedure OnLaunch; procedure FlipLRmenuClick(Sender: TObject); procedure Menu2DSmoothClick(Sender: TObject); procedure VALclick(Sender: TObject); procedure VOI2NIIClick(Sender: TObject); procedure TtoP1Click(Sender: TObject); procedure DesignVALClick(Sender: TObject); procedure Up1Click(Sender: TObject); procedure SetShareMem (lXmm,lYmm,lZmm: single); procedure CreateShareMem; procedure CloseShareMem; procedure YokeTimerTimer(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure YokeMenuClick(Sender: TObject); procedure DefaultControlPanel; procedure ControlPanelDblClick(Sender: TObject); procedure ResizeControlPanel (lRows: integer); procedure SaveOrCopyImages(lCopy: boolean); private { Private declarations } {$IFDEF FPC} function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;MousePos: TPoint): Boolean; override;{$ENDIF} public { Public declarations } public //procedure WMSysCommand (var Msg: TWMSysCommand) ; message WM_SYSCOMMAND; published property OnMouseWheel; end; const kYokeItems= 12; knMRU = 5;//max items in most recently used list knMaxOverlay = 20; kVOIOverlayNum = knMaxOverlay; kBGOverlayNum = 0; knAutoLUT = 7; kVOIFilter = 'Volume of interest (*.voi)|*.voi|MRIcro ROI (*.roi)|*.roi|'+kImgFilter; var gYoke: boolean = false; ImgForm: TImgForm; gBGImg: TBGImg; gMRIcroOverlay: array [0..knMaxOverlay] of TMRIcroHdr; gColorSchemeDir,gTemplateDir: String; gMRUstr: array [0..knMRU] of String; //most recently used files gMouseDownX,gMouseDownY: integer; gSelectOrigin: TPoint; gSelectRect: TRect; gOrigBGTransPct : integer= 50; //gMaxCPUThreads : integer = 8; gnCPUThreads : integer = 1; gUndoImg,gDrawImg: Tfx8; Type SingleArr = Array[1..kYokeItems] Of Single; SingleArrPtr = ^SingleArr; implementation uses statclustertable,batch,imgutil, reslice_fsl,render,ROIfilt,autoroi, MultiSlice, Text, histoform, about,clustering,ReadFloat; {$IFNDEF FPC} {$R *.DFM} {$ENDIF} procedure TImgForm.XBarColor; begin ColorDialog1.Color := gBGImg.XBarClr; if not ColorDialog1.Execute then exit; gBGImg.XBarClr := ColorDialog1.Color; RefreshImagesTimer.Enabled := true; exit; end; procedure DecViewEdit(var lEdit: TSpinEdit); begin if lEdit.Value > 1 then lEdit.value := lEdit.value -1 else lEdit.Value := lEdit.MaxValue; {$IFDEF FPC} ImgForm.XViewEditChange(nil); {$ENDIF} end; //DecViewEdit procedure IncViewEdit(var lEdit: TSpinEdit); begin if lEdit.Value < lEdit.MaxValue then lEdit.value := lEdit.value +1 else lEdit.Value := 1; {$IFDEF FPC} ImgForm.XViewEditChange(nil); {$ENDIF} end; //IncViewEdit function TImgForm.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; begin Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos); //ImgForm.Caption := inttostr(random(888)); //... actions after a possible OnMouseWheel[Down|Up] //ImgForm.Caption := inttostr(WheelDelta)+' '+inttostr(random(888))+' '+inttostr(MousePos.X); if WheelDelta < 0 then begin Case SelectedImageNum of 3: DecViewEdit(YViewEdit); 2: DecViewEdit(XViewEdit); else DecViewEdit(ZViewEdit); end; end else begin Case SelectedImageNum of 3: IncViewEdit(YViewEdit); 2: IncViewEdit(XViewEdit); else IncViewEdit(ZViewEdit); end; end; end; procedure TImgForm.CloseShareMem; begin {$IFDEF COMPILEYOKE} YokeTimer.Enabled := false; CloseSharedMem; {$ENDIF} end; procedure TImgForm.SetShareMem (lXmm,lYmm,lZmm: single); begin {$IFDEF COMPILEYOKE} if not gYoke then exit; SetShareFloats(lXmm,lYmm,lZmm); {$ENDIF} end; procedure TImgForm.CreateShareMem; begin {$IFDEF COMPILEYOKE} CreateSharedMem(self); SetShareMem (0,0,0); YokeTimer.Enabled := gYoke; {$ENDIF} end; procedure TImgForm.YokeTimerTimer(Sender: TObject); var lX,lY,lZ: integer; lXmm,lYmm,lZmm: single; begin if not gYoke then YokeTimer.Enabled := false; {$IFDEF COMPILEYOKE} //labelx.caption := inttostr(random(888)); if not gYoke then exit; //LabelX.caption := inttostr(random(888)); if not GetShareFloats(lXmm,lYmm,lZmm) then exit; //LabelY.caption := inttostr(random(888)); MMToImgCoord(lX,lY,lZ,lXmm,lYmm,lZmm); if lX <> XViewEdit.value then XViewEdit.value := lX; if lY <> YViewEdit.value then YViewEdit.value := lY; if lZ <> ZViewEdit.value then ZViewEdit.value := lZ; XViewEditChange(nil); {$ENDIF} end; (*var lXmm,lYmm,lZmm: single; lX,lY,lZ: integer; begin if not gYoke then begin YokeTimer.Enabled := false; exit; end; if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then exit; {$IFDEF FPC} {$IFDEF COMPILEYOKE} lXmm:=gShareIntBuf^[1]; lYmm:=gShareIntBuf^[2]; lZmm:=gShareIntBuf^[3]; {$ELSE} YokeTimer.Enabled := false; exit; {$ENDIF} {$ELSE} EMemMap.EnterCriticalSection; Try lXmm:=SingleArrPtr(EMemMap.MemMap)^[1]; lYmm:=SingleArrPtr(EMemMap.MemMap)^[2]; lZmm:=SingleArrPtr(EMemMap.MemMap)^[3]; Finally EMemMap.LeaveCriticalSection; end; {$ENDIF} MMToImgCoord(lX,lY,lZ,lXmm,lYmm,lZmm); if lX <> XViewEdit.value then XViewEdit.value := lX; if lY <> YViewEdit.value then YViewEdit.value := lY; if lZ <> ZViewEdit.value then ZViewEdit.value := lZ; YokeTimer.Enabled := false; end; *) {$IFNDEF FPC} procedure TImgForm.WMSysCommand; begin if (Msg.CmdType = SC_MINIMIZE) then Application.Minimize else DefaultHandler(Msg) ; if (Msg.CmdType = SC_MAXIMIZE) then RefreshImagesTimer.enabled := true; end; {$ENDIF} function SelectedImagePanel: TScrollBox; begin case SelectedImageNum of 3: result := ImgForm.TriplePanel; 2: result := ImgForm.TriplePanel; else result := ImgForm.TriplePanel; end; end; function DrawToolSelected: boolean; begin if ( ImgForm.PenBtn.Down) or ( ImgForm.ClosedPenBtn.Down) or (ImgForm.FillBtn.Down) or (ImgForm.EllipseBtn.Down) then result := true else result := false; end; procedure TImgForm.WriteIniFile; var lInc: integer; lIni: string; lIniFile: TIniFile; begin lIni:= IniName; // if not (gBGIMg.SaveDefaultIni) then // showmessage(lIni+ inttostr(DiskFreeEx(lIni))); if (DiskFreeEx(lIni) < 1) or (not gBGIMg.SaveDefaultIni) then exit; //lIniFile := TIniFile.Create(changefileext(paramstr(0),'.ini')); lIniFile := TIniFile.Create(lIni);//DefaultsDir('')+ParseFileName(extractfilename(paramstr(0)))+'.ini'); //recent files lIniFile.WriteString('MRU', 'file0', gMRIcroOverlay[kBGOverlayNum].HdrFilename); for lInc := 1 to knMRU do lIniFile.WriteString('MRU', 'file'+inttostr(lInc), gMRUstr[lINc]); //STR //lIniFile.WriteString('STR', 'FSLDIR',gBGImg.FSLDIR); //lIniFile.WriteString('STR', 'FSLBETEXE',gBGImg.FSLBETEXE); lIniFile.WriteString('STR', 'FSLBASE',gBGImg.FSLBASE); lIniFile.WriteString('STR', 'FSLOUTPUTTYPE',gBGImg.FSLOUTPUTTYPE); //Booleans lIniFile.WriteString('BOOL', 'Reslice',Bool2Char(gBGImg.ResliceOnLoad)); lIniFile.WriteString('BOOL', 'ResliceOrtho',Bool2Char(gBGImg.OrthoReslice)); lIniFile.WriteString('BOOL', 'ShowDraw',Bool2Char(ToolPanel.Visible)); lIniFile.WriteString('BOOL', 'ThinPen',Bool2Char(gBGImg.ThinPen)); lIniFile.WriteString('BOOL', 'Smooth2D',Bool2Char(Menu2DSmooth.checked)); lIniFile.WriteString('BOOL', 'XBar',Bool2Char(XBarBtn.Down)); lIniFile.WriteString('BOOL', 'OverlaySmooth',Bool2Char(OverlaySmoothMenu.Checked)); lIniFile.WriteString('BOOL', 'LRmirror',Bool2Char(gBGImg.Mirror)); lIniFile.WriteString('BOOL', 'Yoke',Bool2Char(gYoke)); lIniFile.WriteString('BOOL', 'SingleRow',Bool2Char(gBGImg.SingleRow)); lIniFile.WriteString('BOOL', 'FlipAx',Bool2Char(gBGImg.FlipAx)); lIniFile.WriteString('BOOL', 'FlipSag',Bool2Char(gBGImg.FlipSag)); YokeTimer.Enabled := gYoke; //Integers //lIniFile.WriteString('INT', 'ResizeBeforeRescale',IntToStr(gBGImg.ResizeBeforeRescale)); lIniFile.WriteString('INT', 'FontSize',IntToStr(gBGImg.FontSize)); lIniFile.WriteString('INT', 'MaxDim',IntToStr(gBGImg.MaxDim)); lIniFile.WriteString('INT', 'LicenseID',IntToStr(gBGImg.LicenseID)); lIniFile.WriteString('INT', 'Zoom',IntToStr(ZoomDrop.ItemIndex)); lIniFile.WriteString('INT', 'LUT',IntToStr(gMRIcroOverlay[kBGOverlayNum].LUTindex)); lIniFile.WriteString('INT', 'XBarGap',IntToStr(gBGImg.XBarGap)); lIniFile.WriteString('INT', 'XBarThick',IntToStr(gBGImg.XBarThick)); lIniFile.WriteString('INT', 'XBarClr',IntToStr(gBGIMg.XBarClr)); lIniFile.WriteString('INT', 'VOIClr',IntToStr(gBGIMg.VOIClr)); if (gBGImg.BGTransPct < 0) or (gBGImg.BGTransPct > 90) then gBGImg.BGTransPct := 20; //additive or transparent values can confuse users if (gBGImg.OverlayTransPct < 0) or (gBGImg.OverlayTransPct > 90) then gBGImg.OverlayTransPct := 20; //additive or transparent values can confuse users lIniFile.WriteString('INT', 'BGTransPct',IntToStr(gBGImg.BGTransPct)); lIniFile.WriteString('INT', 'OverlayTransPct',IntToStr(gBGImg.OverlayTransPct)); lIniFile.WriteString('INT','MaxThreads',IntToStr(gnCPUThreads)); lIniFile.WriteString('INT', 'LesionDilate',IntToStr(gBGImg.LesionDilate)); lIniFile.WriteString('INT', 'LesionSmooth',IntToStr(gBGImg.LesionSmooth)); // {$ELSE} // lIniFile.WriteString('INT', 'MaxThreads',IntToStr(gMaxCPUThreads)); // {$ENDIF} lIniFile.WriteString('INT', 'SigDigits',IntToStr(gBGImg.SigDig)); lIniFile.WriteString('INT', 'ImageSeparation',IntToStr(gBGImg.ImageSeparation)); lIniFile.WriteString('INT', 'SPMDefaultsStatsFmriT',IntToStr(gBGImg.SPMDefaultsStatsFmriT)); lIniFile.WriteString('INT', 'SPMDefaultsStatsFmriT0',IntToStr(gBGImg.SPMDefaultsStatsFmriT0)); lIniFile.Free; end; function registerfiletype(inft,inkey,desc,icon:string): boolean; var myreg : treginifile; ct : integer; ft,key: string; begin result := true; ft := inft; key := inkey; ct := pos('.',ft); while ct > 0 do begin delete(ft,ct,1); ct := pos('.',ft); end; if (ft = '') or (Application.ExeName = '') then exit; //not a valid file-ext or ass. app ft := '.'+ft; myreg := treginifile.create(''); try myreg.rootkey := hkey_classes_root; // where all file-types are described if key = '' then key := copy(ft,2,maxint)+'_auto_file'; // if no key-name is given, create one myreg.writestring(ft,'',key); // set a pointer to the description-key myreg.writestring(key,'',desc); // write the description myreg.writestring(key+'\DefaultIcon','',icon); // write the def-icon if given myreg.writestring(key+'\shell\open\command','',Application.ExeName+' %1'); //association except result := false; showmessage('Only administrators can change file associations. You are currently logged in as a restricted user.'); end; myreg.free; end; procedure TImgForm.SetIniMenus; begin XBarBtn.Down := gBGImg.XBarVisible; YokeMenu.Checked := gYoke; Menu2DSmooth.checked := gBGImg.StretchQuality = sqHigh; Menu2DSmoothClick(nil);//set quality end; procedure TImgForm.ReadIniFile; var lInc,lFilenum: integer; lFilename: string; lIniFile: TIniFile; begin //lFilename := changefileext(paramstr(0),'.ini'); lFilename := ininame;//DefaultsDir('')+ParseFileName(extractfilename(paramstr(0)))+'.ini'; if not FileexistsEx(lFilename) then begin DrawMenu.Visible := ToolPanel.visible; exit; end; lIniFile := TIniFile.Create(lFilename); gMRUstr[0] := lIniFile.ReadString('MRU', 'file0', '');//file0 - last file viewed lFileNum := 0; for lInc := 1 to knMRU do begin lFilename := lIniFile.ReadString('MRU', 'file'+inttostr(lInc), ''); if (length(lFilename) > 0) and (fileexistsex(lFilename)) then begin Inc(lFileNum); gMRUstr[lFileNum] := lFilename; end; end; gBGImg.FSLOUTPUTTYPE := lIniFile.ReadString('STR', 'FSLOUTPUTTYPE', gBGImg.FSLOUTPUTTYPE); //gBGImg.FSLDIR := lIniFile.ReadString('STR', 'FSLDIR', gBGImg.FSLDIR); //gBGImg.FSLBETEXE := lIniFile.ReadString('STR', 'FSLBETEXE', gBGImg.FSLBETEXE); gBGImg.FSLBASE := lIniFile.ReadString('STR', 'FSLDIR', gBGImg.FSLBASE); gBGImg.ResliceOnLoad := IniBool(lIniFile,'Reslice',gBGImg.ResliceOnLoad); gBGImg.OrthoReslice := IniBool(lIniFile,'ResliceOrtho',gBGImg.OrthoReslice); gBGImg.ThinPen := IniBool(lIniFile, 'ThinPen',True); ToolPanel.Visible := IniBool(lIniFile, 'ShowDraw',True); DrawMenu.Visible := ToolPanel.visible; if IniBool(lIniFile,'Smooth2D',Menu2DSmooth.checked) then gBGImg.StretchQuality := sqHigh else gBGImg.StretchQuality := sqLow; //Menu2DSmooth.checked := IniBool(lIniFile,'Smooth2D',Menu2DSmooth.checked); Menu2DSmoothClick(nil);//set quality gBGImg.XBarVisible := IniBool(lIniFile,'XBar',XBarBtn.Down); gBGImg.OverlaySmooth := IniBool(lIniFile,'OverlaySmooth',gBGImg.OverlaySmooth); OverlaySmoothMenu.Checked := gBGImg.OverlaySmooth; gBGImg.Mirror := IniBool(lIniFile,'LRmirror',gBGImg.Mirror); FlipLRmenu.Checked := gBGImg.Mirror; gYoke := IniBool(lIniFile,'Yoke',gYoke); gBGImg.SingleRow := IniBool(lIniFile,'SingleRow',gBGImg.SingleRow); gBGImg.FlipAx := IniBool(lIniFile,'FlipAx',gBGImg.FlipAx); gBGImg.FlipSag := IniBool(lIniFile,'FlipSag',gBGImg.FlipSag); gBGImg.MaxDim := IniInt(lIniFile,'MaxDim',gBGImg.MaxDim); gBGImg.LicenseID := IniInt(lIniFile,'LicenseID',gBGImg.LicenseID); {$IFNDEF FPC} ZoomDrop.SetItemIndex(IniInt(lIniFile,'Zoom',ZoomDrop.ItemIndex)); LUTDrop.SetItemIndex(IniInt(lIniFile,'LUT',LUTDrop.ItemIndex)); {$ELSE} ZoomDrop.ItemIndex := (IniInt(lIniFile,'Zoom',ZoomDrop.ItemIndex)); LUTDrop.ItemIndex:= (IniInt(lIniFile,'LUT',LUTDrop.ItemIndex)); {$ENDIF} gBGImg.XBarGap := IniInt(lIniFile,'XBarGap',gBGImg.XBarGap); gBGImg.XBarThick := IniInt(lIniFile,'XBarThick',gBGImg.XBarThick); gBGImg.XBarClr := IniInt(lIniFile,'XBarClr',gBGImg.XBarClr); gBGImg.VOIClr := IniInt(lIniFile,'VOIClr',gBGImg.VOIClr); gBGImg.BGTransPct := IniInt(lIniFile,'BGTransPct',gBGImg.BGTransPct); gBGImg.OverlayTransPct := IniInt(lIniFile,'OverlayTransPct',gBGImg.OverlayTransPct); gnCPUThreads := IniInt(lIniFile,'MaxThreads',gnCPUThreads); gBGImg.SigDig := IniInt(lIniFile,'SigDigits',gBGImg.SigDig); gBGImg.ImageSeparation := IniInt(lIniFile,'ImageSeparation',gBGImg.ImageSeparation); gBGImg.FontSize := IniInt(lIniFile,'FontSize',gBGImg.FontSize); gBGImg.SPMDefaultsStatsFmriT := IniInt(lIniFile,'SPMDefaultsStatsFmriT',gBGImg.SPMDefaultsStatsFmriT); gBGImg.SPMDefaultsStatsFmriT0 := IniInt(lIniFile,'SPMDefaultsStatsFmriT0',gBGImg.SPMDefaultsStatsFmriT0); gBGImg.LesionSmooth := IniInt(lIniFile,'LesionSmooth',gBGImg.LesionSmooth); gBGImg.LesionDilate := IniInt(lIniFile,'LesionDilate',gBGImg.LesionDilate); SetSubmenuWithTag(BGTransPctMenu, gBGImg.BGTransPct); SetSubmenuWithTag(OverlayTransPctMenu, gBGImg.OverlayTransPct); lIniFile.Free; end; //ReadIniFile //lStrings := TStringList.Create; procedure TImgForm.UpdateColorSchemes; var lSearchRec: TSearchRec; lStrings : TStringList; begin LUTdrop.Items.Clear; LUTdrop.Items.Add('Grayscale'); LUTdrop.Items.Add('Red'); LUTdrop.Items.Add('Blue'); LUTdrop.Items.Add('Green'); LUTdrop.Items.Add('Violet [r+b]'); LUTdrop.Items.Add('Yellow [r+g]'); LUTdrop.Items.Add('Cyan [g+b]'); lStrings := TStringList.Create; if FindFirst(gColorSchemeDir+pathdelim+'*.lut', faAnyFile, lSearchRec) = 0 then repeat lStrings.Add(ParseFileName(ExtractFileName(lSearchRec.Name))); //LUTdrop.Items.Add(ParseFileName(ExtractFileName(lSearchRec.Name))); until (FindNext(lSearchRec) <> 0); FindClose(lSearchRec); lStrings.Sort; LUTdrop.Items.AddStrings(lStrings); lStrings.Free; //LUTDrop.DropDownCount := 66;//LUTDrop.Items.Count; end;//UpdateColorSchemes (*procedure TImgForm.UpdateColorSchemes; var lSearchRec: TSearchRec; begin LUTdrop.Items.Clear; LUTdrop.Items.Add('Grayscale'); LUTdrop.Items.Add('Red'); LUTdrop.Items.Add('Blue'); LUTdrop.Items.Add('Green'); LUTdrop.Items.Add('Violet [r+b]'); LUTdrop.Items.Add('Yellow [r+g]'); LUTdrop.Items.Add('Cyan [g+b]'); if FindFirst(gColorSchemeDir+pathdelim+'*.lut', faAnyFile, lSearchRec) = 0 then repeat LUTdrop.Items.Add(ParseFileName(ExtractFileName(lSearchRec.Name))); until (FindNext(lSearchRec) <> 0); FindClose(lSearchRec); xxx //LUTDrop.DropDownCount := 66;//LUTDrop.Items.Count; end;//UpdateColorSchemes *) procedure TImgForm.BETmenuClick(Sender: TObject); begin BetForm.show; end; procedure TImgForm.ApplyClusterThreshold1Click(Sender: TObject); var lNumberofFiles,lC,lClusterSz: integer; lThresh: double; lFilename: string; begin CloseImagesClick(nil); if not OpenDialogExecute(kImgFilter,'Select NIfTI format images to convert',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; lClusterSz := ReadIntForm.GetInt('Minimum cluster size [in voxels]: ', 1,32,9999); lThresh := ReadFloatForm.GetFloat('Include voxels with an intensity above: ', 0,2,9999); ProgressBar1.Min := 0; ProgressBar1.Max :=lNumberofFiles; ProgressBar1.Position := 0; for lC:= 1 to lNumberofFiles do begin lFilename := HdrForm.OpenHdrDlg.Files[lC-1]; ImgForm.OpenAndDisplayImg(lFilename,True); //lFilename := changefileextX(lFilename,'I'+inttostr(round(lThresh))+'C'+inttostr(lClusterSz)+'.nii.gz'); lFilename := changefileprefix(lFilename,'I'+inttostr(round(lThresh))+'C'+inttostr(lClusterSz)); if ClusterFilterScrnImg (gMRIcroOverlay[kBGOverlayNum],lClusterSz,lThresh ) then if ImgVaries(gMRIcroOverlay[kBGOverlayNum]) then SaveAsVOIorNIFTIcore (lFilename, gMRIcroOverlay[kBGOverlayNum].ImgBuffer,gMRIcroOverlay[kBGOverlayNum].ImgBufferItems,gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr) else showmessage('No clusters survive filter '+ HdrForm.OpenHdrDlg.Files[lC-1]); ProgressBar1.Position := lC; end; if fileexistsEX(lFilename) then ImgForm.OpenAndDisplayImg(lFilename,True); ProgressBar1.Position := 0; end; procedure TImgForm.C(Sender: TObject); begin end; procedure TImgForm.CropMenuClick(Sender: TObject); begin CropEdgeForm.Show; end; procedure TImgForm.ExportasRGBAnalyzeimage1Click(Sender: TObject); var lFlip: boolean; begin lFlip := gBGImg.Mirror; gBGImg.Mirror := true; CreateAnaRGB; gBGImg.Mirror := lFlip; end; procedure TImgForm.FormDropFiles(Sender: TObject; const FileNames: array of String); var lFilename: string; begin if length(FileNames) < 1 then exit; lFilename := Filenames[0]; OpenAndDisplayImg(lFilename,true); end; procedure TImgForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin //ImgForm.caption := inttostr(Key); if (XViewEdit.focused) or (YViewEdit.focused) or (ZViewEdit.focused) or (MinWindowEdit.focused) or (MaxWindowEdit.focused) then exit; Case Key of 36: DecViewEdit(YViewEdit); 35: IncViewEdit(YViewEdit); 37: DecViewEdit(XViewEdit); 38: IncViewEdit(ZViewEdit); 39: IncViewEdit(XViewEdit); 40: DecViewEdit(ZViewEdit); end; //case Key (* if WheelDelta < 0 then begin Case SelectedImageNum of 3: DecViewEdit(YViewEdit); 2: DecViewEdit(XViewEdit); else DecViewEdit(ZViewEdit); end; end else begin Case SelectedImageNum of 3: IncViewEdit(YViewEdit); 2: IncViewEdit(XViewEdit); else IncViewEdit(ZViewEdit); end; end;*) end; procedure TImgForm.FormKeyPress(Sender: TObject; var Key: char); begin //imgform.caption := 'zzz'; end; procedure TImgForm.Header1Click(Sender: TObject); begin DisplayHdrClick(nil); end; function ActiveLayer:integer; begin result := ImgForm.LayerDrop.ItemIndex; if result < 0 then result := 0; end; {$DEFINE noTEST} {$IFDEF TEST} procedure DrawBMP2( lx, ly: integer; var lBuff: RGBQuadp; var lImage: TImage); //uses GraphType, IntfGraphics var IntfImage: TLazIntfImage; ScanLineImage: TLazIntfImage; ImgFormatDescription: TRawImageDescription; lBitmap: TBitmap; begin lBitmap:=TBitmap.Create; ScanLineImage:=TLazIntfImage.Create(0,0); ImgFormatDescription.Init_BPP32_B8G8R8_BIO_TTB(lx,ly); ScanLineImage.DataDescription:=ImgFormatDescription; // call the pf24bit specific drawing function Move(lBuff^[1],PByte(ScanLineImage.GetDataLineStart(0))[1],lx*ly*sizeof(TRGBquad) ); lBitmap.Width:=ScanLineImage.Width; lBitmap.Height:=ScanLineImage.Height; IntfImage:=lBitmap.CreateIntfImage; // convert the content from the very specific to the current format IntfImage.CopyPixels(ScanLineImage); lBitmap.LoadFromIntfImage(IntfImage); ScanLineImage.Free; IntfImage.Free; lImage.Picture.Bitmap := lBitmap; lBitmap.Free; end; procedure FZ; var l2Time,lTime: DWord; y,x,lx, ly, lpos: integer; lBuff: RGBQuadp ; begin lx := 320; ly := 320; getmem(lBuff,(lx*ly)*sizeof( TRGBquad)); lpos := 0; for y := 1 to ly do begin for x := 1 to lx do begin inc(lpos); lBuff^[lpos].rgbblue := (y mod 255); lBuff^[lpos].rgbgreen :=(y mod 255); lBuff^[lpos].rgbred := (x mod 255) ; lBuff^[lpos].rgbreserved := 0; end; end; l2Time := GetTickCount; for y := 1 to 100 do DrawBMP2( lx, ly, lBuff,HistogramForm.HistoImage{lImage}); l2Time := GetTickCount - l2Time; lTime := GetTickCount; for y := 1 to 100 do DrawBMP( lx, ly, lBuff,HistogramForm.HistoImage{lImage}); lTime := GetTickCount - lTime; HistogramForm.Caption := inttostr(lTime)+' '+inttostr(l2Time); freemem(lBuff); end; {$ENDIF} procedure TImgForm.HistoMenuClick(Sender: TObject); VAR lLayer: integer; begin {$IFDEF TEST} FZ; {$ELSE} lLayer := ActiveLayer; DrawHistogram(gMRIcroOverlay[lLayer],HistogramForm.HistoImage{lImage}); HistogramForm.Caption := 'Histogram: '+extractfilename(gMRIcroOverlay[lLayer].HdrFileName); {$ENDIF} HistogramForm.show; //HistogramForm.BringToFront; end; procedure TImgForm.MNIMenuClick(Sender: TObject); begin MNIForm.show; //MNIForm.BringToFront; end; procedure TImgForm.N4DTraces1Click(Sender: TObject); begin Graph4DForm.show; //Graph4DForm.BringToFront; end; procedure TImgForm.NIIVOIClick(Sender: TObject); var lNumberofFiles,lC: integer; lFilename: string; begin CloseImagesClick(nil); if not OpenDialogExecute(kImgFilter {10/2007},'Select NIfTI format images to convert',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; ProgressBar1.Min := 0; ProgressBar1.Max :=lNumberofFiles; ProgressBar1.Position := 0; for lC:= 1 to lNumberofFiles do begin lFilename := HdrForm.OpenHdrDlg.Files[lC-1]; ImgForm.OpenAndDisplayImg(lFilename,True); lFilename := changefileextx(lFilename,'.voi'); ////Xversion 10/2007 - removes .nii.gz not just gz //SaveAsVOIorNIFTIcore (lFilename, lByteP, lVoxels, 1, gMRIcroOverlay[kBGOverlayNum].NiftiHdr); SaveAsVOIorNIFTIcore (lFilename, gMRIcroOverlay[kBGOverlayNum].ScrnBuffer,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems, 1,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); CloseVOIClick(nil); ProgressBar1.Position := lC; end; ProgressBar1.Position := 0; end; procedure TImgForm.PGImageCorDblClick(Sender: TObject); begin if Graph4DForm.visible then Graph4DForm.RefreshBtn.click; end; procedure TImgForm.Preferences1Click(Sender: TObject); begin PrefForm.ShowModal; end; function RescaleImg( lRescaleIntercept,lRescaleSlope: double): boolean; var //lRow,lNumberofFiles,lX,lY,lZ: integer; //lFilename: string; lHdr:TMRIcroHdr; lImgSamples,lInc,lBPP: integer; l32Buf,lo32Buf : SingleP; l16Buf : SmallIntP; begin //note ignores input slope/intercept scaling values result := false; if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1 then begin showmessage('Please load a background image for rescaling.'); exit; end; if ((gBGImg.ScrnDim[1] * gBGImg.ScrnDim[2] * gBGImg.ScrnDim[3]) <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) then begin showmessage('Unable to rescale.'); exit; end; lBPP := gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP;//check if BitsPerPixel is supported if (lBPP <> 4) and (lBPP <> 2) and (lBPP <> 1) then begin showmessage('RescaleImg Error: Unsupported BPP: '+inttostr(lBPP)); exit; end; lImgSamples := gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems; MakeStatHdr (gMRIcroOverlay[kBGOverlayNum],lHdr,0{min}, 0{max},0{p1},0{p2},0{p3},kNIFTI_INTENT_NONE,floattostr(lRescaleSlope) ); GetMem(lHdr.ImgBufferUnaligned ,(lImgSamples*4)+16); //svn lHdr.ImgBuffer := ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned, 16); lo32Buf := SingleP( lHdr.ImgBuffer ); if lBPP = 4 then begin l32Buf := SingleP( gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); for lInc := 1 to lImgSamples do lo32Buf^[lInc] := (l32Buf^[lInc]+lRescaleIntercept) * lRescaleSlope; end else if lBPP = 2 then begin //lBPP=4 else l16Buf := SmallIntP( gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); for lInc := 1 to lImgSamples do lo32Buf^[lInc] := (l16Buf^[lInc]+lRescaleIntercept) * lRescaleSlope; end else if lBPP = 1 then begin //lBPP=2 else for lInc := 1 to lImgSamples do lo32Buf^[lInc] := (gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[lInc]+lRescaleIntercept) * lRescaleSlope; end;//lBPP = 1 SaveAsVOIorNIFTI(bytep(lo32Buf),lImgSamples,4,1,false,lHdr.NiftiHdr,'rscl'+extractfilename(gMRIcroOverlay[kBGOverlayNum].HdrFilename)); //SaveAsVOIorNIFTI(gMRIcroOverlay[lLayer].ImgBuffer,gMRIcroOverlay[lLayer].ImgBufferItems,gMRIcroOverlay[lLayer].ImgBufferBPP,1,false,gMRIcroOverlay[kBGOverlayNum].NiftiHdr,gMRIcroOverlay[lLayer].HdrFilename); FreeMem(lHdr.ImgBufferUnaligned); //lFilename := 'c:\striped2.hdr'; //SaveAsVOIorNIFTIcore (lFilename, gMRIcroOverlay[kBGOverlayNum].ScrnBuffer,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems, 1,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); result := true; end; procedure TImgForm.RescaleMenuClick(Sender: TObject); var ldTE,lScale,lTE1,lTE2: double; //lStr: string; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1 then begin showmessage('Please load a background image for rescaling.'); exit; end; if gBGImg.Resliced then begin if not HdrForm.OpenAndDisplayHdr(gMRIcroOverlay[kBGOverlayNum].HdrFileName,gMRIcroOverlay[kBGOverlayNum]) then exit; if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,false,false) then exit; end; if (gMRIcroOverlay[kBGOverlayNum].GlMinUnscaledS < 0) or (gMRIcroOverlay[kBGOverlayNum].GlMaxUnscaledS > 4096) then begin showmessage('Error: you need to load a Siemens format Phase map with raw values in the range 0..4096'); exit; end; lTE1 := ReadFloatForm.GetFloat('Please enter the first TE (ms) used for phasemap. ', 0,5.19,9999); lTE2 := ReadFloatForm.GetFloat('Please enter the second TE (ms) used for phasemap. ', 0,7.65,9999); (*lStr := floattostr(5.19); //use floattostr for local decimal separator if not InputQuery('TEs used to create phasemap','Please enter the first TE in ms', lStr) then exit; try lTE1 := strtofloat(lStr); except showmessage('Unable to convert the string '+lStr+' to a number'); exit; end; lStr := floattostr(7.65); if not InputQuery('TEs used to create phasemap','Please enter the second TE in ms', lStr) then exit; try lTE2 := strtofloat(lStr); except showmessage('Unable to convert the string '+lStr+' to a number'); exit; end;*) if lTE1 = lTE2 then begin showmessage('In order to compute Rad/S the two TEs must be different.'); exit; end; //fx(lTE1,lTE2); //exit; //the fieldmap is simply a phase //difference image and is not scaled to any particular units. In Siemens //phase images the data goes from 0 to 4095 with 0 being -pi radians, 2048 //is 0 radians, and 4095 is just short of +pi radians. //So, to get units of radians/s you would need to know the difference in //echo times (dTE) in units of s (not ms). You would then take //(x-2048)(2pi/4096)/dTE //Note ignore original intercept and scale values //ldTE := abs(5.19 - 7.65)/1000; // div 1000 to scale ms to sec ldTE := abs(lTE1 - lTE2)/1000; // div 1000 to scale ms to sec lScale := (2*pi/4096)/ldTE; //showmessage(floattostr(lScale)); rescaleImg(-2048,lScale); end; procedure TImgForm.Resliceimage1Click(Sender: TObject); begin ResliceFSL; end; procedure TImgForm.SaveasNIfTI1Click(Sender: TObject); var lLayer: integer; begin lLayer := ActiveLayer; if gMRIcroOverlay[lLayer].ImgBufferItems=0 then begin Showmessage('You must load an image [File/Open] before you can save the image.'); exit; end; if (not IsNifTiMagic(gMRIcroOverlay[lLayer].niftiHdr)) then Showmessage('Warning: image will be saved with NIfTI spatial transform - ensure this image matches the orientation of the template images.'); SaveAsVOIorNIFTI(gMRIcroOverlay[lLayer].ImgBuffer,gMRIcroOverlay[lLayer].ImgBufferItems,gMRIcroOverlay[lLayer].ImgBufferBPP,1,false,gMRIcroOverlay[kBGOverlayNum].NiftiHdr,gMRIcroOverlay[lLayer].HdrFilename); end; procedure ApplySaveDlgFilter (lSaveDlg: TSaveDialog); var lLen,lPos,lPipes,lPipesReq: integer; lExt,lName: string; begin lPipesReq := (lSaveDlg.FilterIndex * 2)-1; if lPipesReq < 1 then exit; lLen := length(lSaveDlg.Filter); lPos := 1; lPipes := 0; while (lPos < lLen) and (lPipes < lPipesReq) do begin if lSaveDlg.Filter[lPos] = '|' then inc(lPipes); inc(lPos); end; if (lPos >= lLen) or (lPipes < lPipesReq) then exit; lExt := ''; while (lPos <= lLen) and (lSaveDlg.Filter[lPos] <> '|') do begin if lSaveDlg.Filter[lPos] <> '*' then lExt := lExt + lSaveDlg.Filter[lPos]; inc(lPos); end; lName := lSaveDlg.Filename; if lExt <> '' then lSaveDlg.Filename := ChangeFileExtX(lName,lExt); end; procedure TImgForm.SaveDialog1Close(Sender: TObject); begin ApplySaveDlgFilter(SaveDialog1); end; procedure Add2MRU (var lNewFilename: string); //add new file to most-recent list var lStr: string; lPos,lN : integer; begin //first, increase position of all old MRUs lN := 0; //Number of MRU files for lPos := 1 to (knMRU) do begin//first, eliminate duplicates lStr := gMRUstr[lPos]; if (lStr <> '') and (lStr <> lNewFileName) then begin inc(lN); gMRUstr[lN] := lStr; end; //keep in MRU list end; //for each MRU //next, increment positions if lN >= knMRU then lN := knMRU - 1; for lPos := lN downto 1 do gMRUstr[lPos+1] := gMRUstr[lPos]; if (lN+2) < (knMRU) then //+1 as we have added a file for lPos := (lN+2) to knMRU do gMRUstr[lPos] := ''; gMRUstr[1] := lNewFilename; ImgForm.UpdateMRU; ImgForm.SaveDialog1.FileName := lNewFilename; end;//Add2MRU procedure TImgForm.UpdateMRU;//most-recently-used menu var NewItem: TMenuItem; lPos: integer; begin While Recent1.Count < knMRU do begin NewItem := TMenuItem.Create(Self); Recent1.Add(NewItem); end; for lPos := 1 to knMRU do begin//for each MRU Recent1.Items[lPos-1].Visible:=gMRUstr[lPos] <> ''; Recent1.Items[lPos-1].Caption :=ExtractFileName(gMRUstr[lPos]); Recent1.Items[lPos-1].Tag := lPos; Recent1.Items[lPos-1].onclick := OpenTemplateMRU; {$IFDEF Darwin} Recent1.Items[lPos-1].ShortCut := ShortCut(Word('1')+ord(lPos-1), [ssMeta]); {$ELSE} Recent1.Items[lPos-1].ShortCut := ShortCut(Word('1')+ord(lPos-1), [ssCtrl]); {$ENDIF} end;//for each MRU end; //UpdateMRU procedure TImgForm.UpdateTemplates; var NewItem: TMenuItem; lN : integer; lFName : String; lSearchRec: TSearchRec; begin While Templates1.Count < knMRU do begin NewItem := TMenuItem.Create(Self); Templates1.Add(NewItem); end; lN := 0; if FindFirst(gTemplateDir+pathdelim+'*.*', faAnyFile, lSearchRec) = 0 then begin repeat lFName := lSearchRec.Name; if IsNIfTIHdrExt (lFName) then begin Templates1.Items[lN].Caption :=ExtractFileName(lFName);//(ParseFileName(ExtractFileName(lFName))); Templates1.Items[lN].Tag := 0; Templates1.Items[lN].visible := true; Templates1.Items[lN].onclick := OpenTemplateMRU; {$IFDEF Darwin} Templates1.Items[lN].ShortCut := ShortCut(Word('1')+ord(lN), [ssMeta, ssAlt]); {$ELSE} Templates1.Items[lN].ShortCut := ShortCut(Word('1')+ord(lN), [ssCtrl, ssShift]); {$ENDIF} inc(lN); end; until (FindNext(lSearchRec) <> 0) or (lN >= knMRU); end; while lN < knMRU do begin Templates1.Items[lN].visible := false; inc(lN); end; FindClose(lSearchRec); end;//UpdateTemplates (*NOT OSX 10.7 friendly... procedure TImgForm.UpdateMRU;//most-recently-used menu var NewItem: TMenuItem; lPos,lN : integer; begin //Recent1.Clear; //While Recent1.Count > 1 do Recent1.Delete(0); // While Recent1.Count > 0 do Recent1.Items[0].Free; lN := 0; for lPos := 1 to knMRU do begin//for each MRU if gMRUstr[lPos] <> '' then begin inc(lN); NewItem := TMenuItem.Create(Self); NewItem.Caption :=ExtractFileName(gMRUstr[lPos]);//(ParseFileName(ExtractFileName(lFName))); NewItem.Tag := lN; {$IFDEF FPC} NewItem.onclick := OpenTemplateMRU; //Lazarus {$ELSE} NewItem.onclick := OpenTemplateMRU; {$ENDIF} NewItem.ShortCut := ShortCut(Word('1')+ord(lN-1), [ssCtrl]); Recent1.Add(NewItem); end;//if mru exists end;//for each MRU end; //UpdateMRU procedure TImgForm.UpdateTemplates; var NewItem: TMenuItem; lN : integer; lFName : String; lSearchRec: TSearchRec; begin While Templates1.Count > 0 do Templates1.Items[0].Free; lN := 0; if FindFirst(gTemplateDir+pathdelim+'*.*', faAnyFile, lSearchRec) = 0 then begin repeat lFName := lSearchRec.Name; if IsNIfTIHdrExt (lFName) then begin inc(lN); NewItem := TMenuItem.Create(Self); NewItem.Caption :=ExtractFileName(lFName);//(ParseFileName(ExtractFileName(lFName))); NewItem.Tag := 0; {$IFDEF FPC} NewItem.onclick := OpenTemplateMRU; //Lazarus {$ELSE} NewItem.onclick := OpenTemplateMRU; {$ENDIF} if (lN+knMRU) <= 9 then NewItem.ShortCut := ShortCut(Word('1')+knMRU+ord(lN-1), [ssCtrl]); Templates1.Add(NewItem); end; until (FindNext(lSearchRec) <> 0) end; FindClose(lSearchRec); end;//UpdateTemplates *) procedure TImgForm.OpenTemplateMRU(Sender: TObject);//open template or MRU //Templates have tag set to 0, Most-Recently-Used items have tag set to position in gMRUstr var lFilename: string; begin if sender = nil then begin //autolaunch with last image, or last template image in list lFilename := gMRUstr[0]; if (lFilename = '') or (not FileExistsEX(lFilename)) then begin if Templates1.Count > 0 then Templates1.Items[Templates1.Count-1].click; exit; end; OpenAndDisplayImg(lFilename,true); //open but do not add templates to MRU end else if (Sender as TMenuItem).tag = 0 then begin lFilename := gTemplateDir+pathdelim+(Sender as TMenuItem).caption ;//+ '.hdr'; OpenAndDisplayImg(lFilename,false); //open but do not add templates to MRU end else if (Sender as TMenuItem).tag <= knMRU then begin lFilename := gMRUstr[(Sender as TMenuItem).tag]; OpenAndDisplayImg(lFilename,true); end else Showmessage('OpenTemplateMRU error.'); end; function TImgForm.OpenAndDisplayImg(var lFilename: string; lAdd2MRU: boolean): boolean; var lVal: integer; begin Result := false; if not HdrForm.OpenAndDisplayHdr(lFilename,gMRIcroOverlay[kBGOverlayNum]) then exit; //if (ssShift in KeyDataToShiftState(vk_Shift)) then begin // if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,not gBGImg.ResliceOnLoad,false) then exit //end else if (ssCtrl in KeyDataToShiftState(vk_Shift)) and (gBGIMg.OrthoReslice) then begin gBGIMg.OrthoReslice := false; OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,false,false); gBGIMg.OrthoReslice := true; end else if (ssShift in KeyDataToShiftState(vk_Shift)) then begin if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,not gBGImg.ResliceOnLoad,false) then exit end else if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,gBGImg.ResliceOnLoad,false) then exit; XViewEdit.MaxValue := gBGImg.ScrnDim[1];//gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[1]; YViewEdit.MaxValue := gBGImg.ScrnDim[2];//gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[2]; ZViewEdit.MaxValue :=gBGImg.ScrnDim[3];// gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[3]; XViewEdit.Value := round(gBGImg.ScrnOri[1]);//gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[1] div 2; YViewEdit.Value := round(gBGImg.ScrnOri[2]);//gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[2]div 2; lVal := round(gBGImg.ScrnOri[3]); if lVal < 1 then lVal := 1; ZViewEdit.Value := lVal;//gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[3] div 2; ImgForm.Caption := extractfilename(paramstr(0))+' - '+lFilename; StatusLabel.caption := 'opened: '+lFilename; Result := true; //LayerDrop.ItemIndex := 0; //LayerDropSelect(nil); if lAdd2MRU then Add2MRU(lFilename); if gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.datatype = kDT_RGB then begin //RGB //we have loaded the first [red] plane - now load green and blue... OverlayOpenCore(lFilename,1); OverlayOpenCore(lFilename,2); //must use additive blending //gBGImg.BGTransPct := -1; //gBGImg.OverlayTransPct := -1; OverlayAdditive.Click; BGAdditive.Click; end; {$IFDEF FPC} XViewEditChange(nil); {$ENDIF} //showmessage(lFilename+' 666 '+ChangeFileext(lFilename,'.anat')); AnatForm.OpenAnat( ChangeFileextx(lFilename,'.anat')); end; //OpenAndDisplayImg {$IFNDEF FPC} procedure TImgForm.WMDropFiles(var Msg: TWMDropFiles); //implement drag and drop var CFileName: array[0..MAX_PATH] of Char; lFilename: string; begin try if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then begin lFilename := CFilename; OpenAndDisplayImg(lFilename,true); Msg.Result := 0; end; finally DragFinish(Msg.Drop); end; end; {$ENDIF} procedure TImgForm.Exit1Click(Sender: TObject); begin ImgForm.Close; end; function XToStr(lR: extended; lDec: integer): string; begin result := FloatToStrF(lR, ffFixed,7,lDec); end; procedure TImgForm.DisplayHdrClick(Sender: TObject); var lLayer:integer; begin lLayer := ActiveLayer; HdrForm.SaveHdrDlg.Filename := gMRIcroOverlay[lLayer].HdrFilename; HdrForm.WriteHdrForm (gMRIcroOverlay[lLayer]); HdrForm.ShowModal; //HdrForm.BringToFront; end; procedure TImgForm.Open1Click(Sender: TObject); var lFilename: string; begin CloseImagesClick(nil); if not OpenDialogExecute(kImgFilter,'Select background image',false) then exit; lFilename := HdrForm.OpenHdrDlg.Filename; OpenAndDisplayImg(lFilename,True); end; procedure TImgForm.ToolSelectClick(Sender: TObject); begin if (not ToolPanel.Visible) and ((Sender as TMenuItem).Tag > 0) then exit; //tools disabled case (Sender as TMenuItem).Tag of 0: begin XBarBtn.Down := not XBarBtn.Down; {$IFDEF Darwin} XBarbtnClick(nil); exit;{$ENDIF} end; 2: PenBtn.Down := true; 3: ClosedPenBtn.Down := true; 4: FillBtn.Down := true; 5: EllipseBtn.Down := true; 6: begin PenBtn.Down := false; ClosedPenBtn.Down := false; FillBtn.Down := false; EllipseBtn.Down := false; end; end; //case RefreshImagesTimer.Enabled := true; end; function SelectedImage: TImage; begin case SelectedImageNum of kSagView0: result := ImgForm.PGImageSag; kCoroView0: result := ImgForm.PGImageCor; else result := ImgForm.PGImageAx; end; end; procedure TImgForm.SetDimension8(lInPGHt,lInPGWid:integer; lBuff: ByteP; lUndoOnly: boolean); begin DefineBuffFX8(gDrawImg, lInPGWid,lInPGHt,lBuff); DefineBuffFX8(gUndoImg, lInPGWid,lInPGHt,lBuff); end; procedure WriteAxialVOI (lUndoOnly: boolean); var lX,lY,lSliceOffset,lSliceSz,lSlicePos: integer; lInBuff: ByteP; begin lX := gBGImg.ScrnDim[1]; lY := gBGImg.ScrnDim[2]; lSliceSz := lX*lY; if lSliceSz < 1 then exit; lSliceOffset := (ImgForm.ZViewEdit.Value-1)*lX*lY; gBGImg.VOIUndoSlice := ImgForm.ZViewEdit.Value; getmem(lInBuff,lSliceSz); for lSlicePos := 1 to lSliceSz do lInBuff^[lSlicePos] := gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lSliceOffset+lSlicePos]; ImgForm.SetDimension8(lY,lX, lInBuff,lUndoOnly); freemem(lInBuff); end; procedure WriteCorVOI (lUndoOnly: boolean); var lX,lY,lZ,lYOffset,lZOffset,lXYSliceSz,lPixel,lZPos,lXPos: integer; lInBuff: ByteP; begin lX := gBGImg.ScrnDim[1]; lY := gBGImg.ScrnDim[2]; lZ := gBGImg.ScrnDim[3]; lYOffset := (lX) * (round(ImgForm.YViewEdit.Value)-1); gBGImg.VOIUndoSlice := ImgForm.YViewEdit.Value; lXYSliceSz := (lX*lY); getmem(lInBuff,lZ*lX); lPixel := 0; for lZPos := 1 to lZ do begin lZOffset := (lZPos-1) * lXYSliceSz; for lXPos := 1 to lX do begin inc(lPixel); lInBuff^[lPixel] := gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lZOffset+lYOffset+lXPos]; end; //for each Y end; //for each Z ImgForm.SetDimension8(lZ,lX, lInBuff,lUndoOnly); freemem(lInBuff); end; procedure WriteSagVOI (lUndoOnly: boolean); var lX,lY,lZ,lXOffset,lYOffset,lZOffset,lXYSliceSz,lPixel,lZPos,lYPos: integer; lInBuff: ByteP; begin lX := gBGImg.ScrnDim[1]; lY := gBGImg.ScrnDim[2]; lZ := gBGImg.ScrnDim[3]; lXYSliceSz := lX*lY; lXOffset := round(ImgForm.XViewEdit.Value); //dec(lXOffset);//999+8 gBGImg.VOIUndoSlice := ImgForm.XViewEdit.Value; getmem(lInBuff,lZ*lY); lPixel := 0; for lZPos := 1 to lZ do begin lZOffset := (lZPos-1) * lXYSliceSz; lYOffset := 0; for lYPos := 1 to lY do begin inc(lPixel); lInBuff^[lPixel] := gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lZOffset+lYOffset+lXOffset]; lYOffset := lYOffset+ lX; end; //for each Y end; //for each Z ImgForm.SetDimension8(lZ,lY, lInBuff, lUndoOnly); freemem(lInBuff); end; procedure WriteUndoVOI(lPanel: integer;lUndoOnly: boolean); begin EnsureVOIOPen; case lPanel of 3: WriteCorVOI(lUndoOnly); 2: WriteSagVOI(lUndoOnly); else WriteAxialVOI(lUndoOnly); end; gBGImg.VOIchanged := true; if gBGImg.VOIUndoOrient = 4 then FreeUndoVol; //release 3D undo buffer when creating 2D buffer gBGImg.VOIUndoOrient := lPanel; end; procedure TImgForm.FormOpenFileMethod(const FileName : string); var lFilename: string; begin lFilename := Filename; OpenAndDisplayImg(lFilename,true); end; procedure TImgForm.Landmarks1Click(Sender: TObject); begin //Graph4DForm.show; AnatForm.show; end; procedure TImgForm.FormCreate(Sender: TObject); var lInc: longint; begin Application.ShowButtonGlyphs := sbgNever; KeyPreview := true; {$IFDEF Darwin} InitOpenDocHandler;//allows files to be associated... {$IFNDEF LCLgtk} //only for Carbon compile Open1.ShortCut := ShortCut(Word('O'), [ssMeta]); SaveasNIfTI1.ShortCut := ShortCut(Word('S'), [ssMeta,ssAlt]); Saveaspicture1.ShortCut := ShortCut(Word('S'), [ssMeta]); Copy1.ShortCut := ShortCut(Word('C'), [ssMeta]); Paste1.ShortCut := ShortCut(Word('V'), [ssMeta]); Undo1.ShortCut := ShortCut(Word('Z'), [ssMeta]); OverlayOpen.ShortCut := ShortCut(Word('A'), [ssMeta]); Applyintensityfiltertovolume1.ShortCut := ShortCut(Word('F'), [ssMeta]); HistoMenu.ShortCut := ShortCut(Word('H'), [ssMeta]); ShowRender.ShortCut := ShortCut(Word('R'), [ssMeta]); ShowMultislice.ShortCut := ShortCut(Word('M'), [ssMeta]); N4DTraces1.ShortCut := ShortCut(Word('D'), [ssMeta]); Header1.ShortCut := ShortCut(Word('I'), [ssMeta]); YokeMenu.ShortCut := ShortCut(Word('Y'), [ssMeta]); {$ENDIF} {$ENDIF} {$IFDEF Darwin} {$IFNDEF LCLgtk} //only for Carbon compile Exit1.visible := false;//with OSX users quit from application menu {$ENDIF} {$ENDIF} CreateFX8(gUndoImg); CreateFX8(gDrawImg); TriplePanel.OnMouseWheelDown:= FormMouseWheelDown; TriplePanel.OnMouseWheelUp:= FormMouseWheelUp; TriplePanel.OnMouseWheelDown:= FormMouseWheelDown; TriplePanel.OnMouseWheelUp:= FormMouseWheelUp; TriplePanel.OnMouseWheelDown:= FormMouseWheelDown; TriplePanel.OnMouseWheelUp:= FormMouseWheelUp; randomize; gnCPUThreads := GetLogicalCpuCount; gMouseDownX := -1; ImgForm.Caption := extractfilename(paramstr(0)); ImgForm.DoubleBuffered := true; TriplePanel.DoubleBuffered := true; TriplePanel.DoubleBuffered := true; TriplePanel.DoubleBuffered := true; for lInc := 0 to knMaxOverlay do begin FreeImgMemory(gMRIcroOverlay[lInc]); NIFTIhdr_ClearHdr(gMRIcroOverlay[lInc]); gMRIcroOverlay[lInc].ScrnBufferItems := 0; gMRIcroOverlay[lInc].ImgBufferItems := 0; if lInc < knAutoLUT then gMRIcroOverlay[lInc].LUTindex := lInc else gMRIcroOverlay[lInc].LUTindex := lInc;//B&W LoadMonochromeLUT(gMRIcroOverlay[lInc].LUTindex,gBGImg,gMRIcroOverlay[lInc]); end; lInc:=maxint; LoadMonochromeLUT(lInc,gBGImg,gMRIcroOverlay[kVOIOverlayNum]); SetBGImgDefaults(gBGImg); CloseImagesClick(nil); gColorSchemeDir := extractfilepath(paramstr(0))+'lut'; {$IFNDEF Unix} DragAcceptFiles(Handle, True); //engage drag and drop {$ENDIF} UpdateColorSchemes; {$IFNDEF FPC} LUTdrop.SetItemIndex(0); Zoomdrop.SetItemIndex(0); LayerDrop.SetItemIndex(0); {$ELSE} LUTdrop.ItemIndex:=(0); Zoomdrop.ItemIndex:=(0); LayerDrop.ItemIndex:=(0); MagnifyMenuItem.visible := false; {$IFNDEF COMPILEYOKE} YokeMenu.visible := false; {$ENDIF} {$ENDIF} gTemplateDir := extractfilepath(paramstr(0))+'templates'; UpdateTemplates; for lInc := 1 to knMRU do gMRUstr[lInc] := ''; (*if (ssShift in KeyDataToShiftState(vk_Shift)) then begin case MessageDlg('Shift key down during launch: do you want to reset the default preferences?', mtConfirmation, [mbYes, mbNo], 0) of { produce the message dialog box } mrNo: ReadIniFile; end; //case end else*) if ResetDefaults then DrawMenu.Visible := ToolPanel.visible else ReadIniFile; SetIniMenus; UpdateMRU; DefaultControlPanel; OverlaySmoothMenuClick(nil); LUTDrop.OnSelect(nil); ZoomDrop.OnSelect(nil); CreateShareMem; if YokeMenu.checked then YokeTimer.enabled := true; //gBGIMg.SaveDefaultIni := true; end; function ImgIntensity(var lHdr: TMRIcroHdr; lX,lY,lZ: integer): single; var lPos: integer; l16Buf : SmallIntP; l32Buf : SingleP; begin result := 0; lPos := lX + ((lY-1)*gBGImg.ScrnDim[1])+((lZ-1)*gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]); if (lPos > lHdr.ImgBufferItems) or (lPos < 1) then exit; if (lHdr.ImgBufferBPP = 4) then begin l32Buf := SingleP(lHdr.ImgBuffer ); result := l32Buf^[lPos]; end else if (lHdr.ImgBufferBPP = 2) then begin l16Buf := SmallIntP(lHdr.ImgBuffer ); result := l16Buf^[lPos]; end else if lHdr.ImgBufferBPP = 1 then result := lHdr.ImgBuffer^[lPos] else begin showmessage('Unknown Image Buffer Bytes Per Pixel: '+inttostr(lHdr.ImgBufferBPP)+' '+lHdr.HdrFileName); exit; end; result := Raw2ScaledIntensity (lHdr,result); end; function ImgIntensityString(var lHdr: TMRIcroHdr; lX,lY,lZ: integer): string; var lPos: integer; begin lPos := lX + ((lY-1)*gBGImg.ScrnDim[1])+((lZ-1)*gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]); result := ''; if lHdr.ImgBufferItems < 1 then exit; if not lHdr.UsesCustomPalette then begin result := realtostr(ImgIntensity(lHdr,lX,lY,lZ),gBGImg.SigDig); (* if lHdr.ScrnBuffer[lPos] = 0 then begin if lHdr.Slope8Bit < 0 then result := '>'+result else result := '<'+result end else if lHdr.ScrnBuffer[lPos] = 255 then begin if lHdr.Slope8Bit < 0 then result := '<'+result else result := '>'+result end else result := '~'+result;*) exit; end; if (lPos > lHdr.ImgBufferItems) or (lPos < 1) then exit; result := gBGImg.LabelStr20[lHdr.ImgBuffer^[lPos]]; end; procedure TImgForm.UpdateStatusLabel; var lX,lY,lZ,lOverlay,lLen: integer; lXmm,lYmm,lZmm: single; lIntenStr : string; begin lX := XviewEdit.value; lY := YviewEdit.value; lZ := ZviewEdit.value; ImgCoordToMM(lX,lY,lZ,lXmm,lYmm,lZmm); lIntenStr := ''; //StatusLabel.Caption := realtostr(lXmm,0)+'x'+realtostr(lYmm,0)+'x'+realtostr(lZmm,0); //lIntenStr := realtostr(lXmm,0)+'x'+realtostr(lYmm,0)+'x'+realtostr(lZmm,0)+'= '+lIntenStr;; //StatusLabel.Caption := lIntenStr; //StatusLabel.Caption := realtostr(lXmm,0)+'x'+realtostr(lYmm,0)+'x'+realtostr(lZmm,0)+'= '+lIntenStr; //crash! for lOverlay := kBGOverlayNum to (kVOIOverlayNum-1) do if gMRIcroOverlay[lOverlay].ImgBufferItems > 0 then lIntenStr := lIntenStr + ImgIntensityString(gMRIcroOverlay[lOverlay],lX,lY,lZ)+', '; lLen := length (lIntenstr); if lLen > 2 then lIntenStr[lLen-1] := ' '; //StatusLabel.Caption := realtostr(lXmm,0)+'x'+realtostr(lYmm,0)+'x'+realtostr(lZmm,0)+'= '+lIntenStr; Caption := realtostr(lXmm,0)+'x'+realtostr(lYmm,0)+'x'+realtostr(lZmm,0)+'= '+lIntenStr; SetShareMem (lXmm,lYmm,lZmm); end; procedure TImgForm.XViewEditChange(Sender: TObject); begin gBGImg.XViewCenter := XviewEdit.value; gBGImg.YViewCenter := YviewEdit.value; gBGImg.ZViewCenter := ZviewEdit.value; RefreshImagesTimer.Enabled := true; //UpdateStatusLabel; //caused crash! - only with refreshimagestimes end; {$IFNDEF FPC} procedure TImgForm.FormClose(Sender: TObject; var Action: TCloseAction); {$ELSE} procedure TImgForm.FormClose(Sender: TObject); {$ENDIF} begin WriteIniFile; CloseImagesClick(nil); FreeFX8(gDrawImg); FreeFX8(gUndoImg); end; procedure TImgForm.MagnifyTimerTimer(Sender: TObject); {$IFDEF FPC} begin // MagnifyTimer.Enabled := false; end; {$ELSE} var Srect,Drect,PosForme,ImgForme:TRect; lZoomSlider,iWidth,iHeight,DmX,DmY:Integer; iTmpX,iTmpY:Real; C:TCanvas; hDesktop: Hwnd; Kursor:TPoint; begin MagnifyTimer.Enabled := false; lZoomSlider := 2; If not IsIconic(Application.Handle) then begin hDesktop:= GetDesktopWindow; GetCursorPos(Kursor); ImgForme := Rect(ImgForm.Left+ImgForm.TriplePanel.Left,ImgForm.Top+ImgForm.TriplePanel.Top,ImgForm.Left+ImgForm.Width,ImgForm.Top+ImgForm.Height); PosForme:=Rect(MagnifyPanel.Left,MagnifyPanel.Top,MagnifyPanel.Left+MagnifyPanel.Width,MagnifyPanel.Top+MagnifyPanel.Height); if true then begin iWidth:=MagnifyImage.Width; iHeight:=MagnifyImage.Height; if iHeight < 6 then exit; Drect:=Rect(0,0,iWidth,iHeight); iTmpX:=iWidth / (lZoomSlider*4);//(Slider.Position * 4); iTmpY:=iHeight / (lZoomSlider*4);//(Slider.Position * 4); Srect:=Rect(Kursor.x,Kursor.y,Kursor.x,Kursor.y); InflateRect(Srect,Round(iTmpX),Round(iTmpY)); If Srect.Left<0 then OffsetRect(Srect,-Srect.Left,0); If Srect.Top<0 then OffsetRect(Srect,0,-Srect.Top); If Srect.Right>Screen.Width then OffsetRect(Srect,-(Srect.Right-Screen.Width),0); If Srect.Bottom>Screen.Height then OffsetRect(Srect,0,-(Srect.Bottom-Screen.Height)); C:=TCanvas.Create; try C.Handle:=GetDC(GetDesktopWindow); SetStretchBltMode(C.Handle,COLORONCOLOR); //SetStretchBltMode(C.Handle, STRETCH_DELETESCANS); //SetStretchBltMode(C.Handle,{BILINEAR}TransparencyEdit.value); MagnifyImage.Canvas.CopyRect(Drect,C,Srect); finally ReleaseDC(hDesktop, C.Handle); C.Free; end; If True then begin // show crosshair MagnifyImage.Canvas.Pen.Color := gBGIMg.XBarClr; with MagnifyImage.Canvas do begin DmX:=lZoomSlider * 2 * (Kursor.X-Srect.Left); DmY:=lZoomSlider * 2 * (Kursor.Y-Srect.Top); MoveTo(1,DmY); // - LineTo(iWidth,DmY); // - MoveTo(DmX,1); // | LineTo(DmX,iHeight); // | end; // with MagnifyImage.Canvas end; // show crosshair Application.ProcessMessages; end // Cursor not inside form end; // IsIconic end; //magnify image {$ENDIF} procedure TImgForm.MagnifyPanelResize(Sender: TObject); begin (* MagnifyImage.Picture:=nil; if MagnifyPanel.Width < MagnifyPanel.Constraints.MinWidth then MagnifyPanel.Width := MagnifyPanel.Constraints.MinWidth; *) end; //Proc MagnifyPanelResize procedure SelectPanel (lPanelNumber: integer); begin gSelectedImageNum := lPanelNumber; end; //Proc SelectPanel procedure ShowFocusRect(lInRect: TRect); var LImage: TImage; begin lImage := SelectedImage; lImage.Canvas.DrawFocusRect(lInRect); end; //proc ShowFocusRect procedure XYscrn2Img (lImage: TIMage;lPanel,lXinRaw,lYinRaw: integer; var lXout,lYOut,lZOut: integer); var lYin,lXin,lZoom : integer; lOffset: single; begin //amx - must match XYscrn2Img and DrawXBar - e.g. +0.5 for middle of zoomed slice lZoom := ImageZoomPct(lImage); if lZoom = 0 then lZoom := 100; if lZoom > 100 then lOffset := 0.5 else lOffset := 0; lXIn := lXinRaw + 1; //index from 0 lYin := lImage.Height-lYinRaw; case lPanel of 2: begin if gBGImg.FlipSag then lXin := lImage.Width-lXinRaw; lXOut := ImgForm.XViewEdit.value; lYOut := round((lXin*100) / lZoom +lOffset); lZOut := round((lYin*100) / lZoom +lOffset); end; 3: begin lXOut := round((lXin*100) / lZoom +lOffset); lYOut := ImgForm.YViewEdit.value; lZOut := round((lYin*100) / lZoom +lOffset); end; else begin if gBGImg.FlipAx then lYin := lYinRaw; lXOut := round((lXin*100) / lZoom +lOffset); lYOut := round((lYin*100) / lZoom +lOffset); lZOut := ImgForm.ZViewEdit.value; end; //else end;//case lPanel //ImgForm.Caption := inttostr(lXOut)+' '+inttostr(lYOut)+' '+Inttostr(lZOut); end; //proc XYscrn2Img procedure AdjustContrastRectangle (lImage: TImage); var lXpos,lYPos,lXOut,lYOut,lZOut,lPanel,lLayer: integer; lMinInten,lMaxInten,lVal: single; begin lPanel := SelectedImageNum; lLayer := ActiveLayer; XYscrn2Img (lImage,lPanel,gSelectRect.Left,gSelectRect.Top, lXout,lYOut,lZOut); lMinInten := ImgIntensity(gMRIcroOverlay[lLayer],lXout,lYOut,lZOut); lMaxInten := lMinInten; for lYpos := gSelectRect.Top to gSelectRect.Bottom do begin for lXpos := gSelectRect.Left to gSelectRect.Right do begin XYscrn2Img (lImage,lPanel,lXpos,lYPos, lXout,lYOut,lZOut); lVal:= ImgIntensity(gMRIcroOverlay[lLayer],lXout,lYOut,lZOut); if lVal < lMinInten then lMinInten := lVal; if lVal > lMaxInten then lMaxInten := lVal; end; //for PGX each column end; //for PGY2 - each row ImgForm.StatusLabel.caption := 'Intensity range '+(RealToStr(lMinInten,4))+'..'+({x} RealToStr(lMaxInten,4)); if lMinInten = lMaxInten then exit; //no range ImgForm.MinWindowEdit.value := lMinInten; ImgForm.MaxWindowEdit.value := lMaxInten; {$IFDEF FPC} ImgForm.MinContrastWindowEditChange(nil) {$ENDIF} end; procedure sortLTRB(var lXoutLow,lYOutLow,lXoutHi,lYOutHi: integer); //left 100 then lBasePenThick := gBGImg.ZoomPct div 100 else lBasePenThick := 1; end; //if not thinpen if (ssCtrl in Shift) then begin lImage.Canvas.Pen.Width := lBasePenThick*3; gDrawImg.PenThick := 3; end else begin lImage.Canvas.Pen.Width := lBasePenThick; gDrawImg.PenThick := 1; end; end; //paint tool selected //lImage.Canvas.Pen.Width := 1;//abba if (FillBtn.Down) and (ssCtrl in Shift) then begin //3D fill XYscrn2Img (lImage,lPanel,lX,lY, lXout,lYOut,lZOut); XViewEdit.value := lXOut; YViewEdit.value := lYOut; ZViewEdit.value := lZOut; if (ssShift in Shift) then //erase ROICluster(gBGImg.ScrnDim[1], gBGImg.ScrnDim[2], gBGImg.ScrnDim[3],XViewEdit.value,YViewEdit.value,ZViewEdit.value,true) else //draw ROICluster(gBGImg.ScrnDim[1], gBGImg.ScrnDim[2], gBGImg.ScrnDim[3],XViewEdit.value,YViewEdit.value,ZViewEdit.value,false); exit; end; //end 3D fill if (not PenBtn.Down) and (not ClosedPenBtn.Down) and (not FillBtn.Down) then begin if (EllipseBtn.Down) or (ssRight in Shift) then begin lImage.Canvas.Brush.Color:=gBGImg.VOIClr; //lImage.Canvas.Pen.Color :=gBGImg.VOIClr; ScaleScrn2BMP(lX,lY, lImage); gSelectRect.Left := lX; gSelectRect.Top := lY; gSelectRect.Right := lX; gSelectRect.Bottom := lY; ShowFocusRect(gSelectRect); gSelectOrigin.X := gSelectRect.Left; gSelectOrigin.Y := gSelectRect.Top; exit; end; //next no paint tools selected - show position where click occurred XYscrn2Img (lImage,lPanel,lX,lY, lXout,lYOut,lZOut); XViewEdit.value := lXOut; YViewEdit.value := lYOut; ZViewEdit.value := lZOut; //showmessage(floattostr(lXOut)+'x'+floattostr(lYOut)+'x'+floattostr(lZOut)); //ImgCoordToMM(lXOut,lYOut,lZOut,lXmm,lYmm,lZmm); //showmessage(floattostr(lXmm)+'x'+floattostr(lYmm)+'x'+floattostr(lZmm)); //showmessage(floattostr(gBGImg.ScrnOri[1])+'x'+floattostr(gBGImg.ScrnOri[2])+'x'+floattostr(gBGImg.ScrnOri[3])); //MMToImgCoord(lXOut,lYOut,lZOut,lXmm,lYmm,lZmm); //showmessage(floattostr(lXOut)+'x'+floattostr(lYOut)+'x'+floattostr(lZOut)); //SetShareMem (lXmm,lYmm,lZmm); {$IFDEF FPC} XViewEditChange(nil); {$ENDIF} exit; end; ScaleScrn2BMP(lX,lY, lImage); lImage.Canvas.MoveTo(lX,lY); lX2 := X; lY2 := Y; ScaleBMP2Draw(gBGImg.VOIInvZoom, lX2,lY2,lPanel,lImage); if (FillBtn.Down) or(ssRight in Shift) then begin if (ssShift in Shift) then FloodFillFX8 (gDrawImg, lX2,lY2,kVOI8bit,0,true) //FloodFillX(DrawImg2,lX2-1,lY2-1,gBGImg.VOIClr, fsSurface) else FloodFillFX8 (gDrawImg, lX2,lY2,kVOI8bit,kVOI8bit,false); //FloodFillX(DrawImg2,lX2-1,lY2-1,gBGImg.VOIClr, fsBorder); exit; end; //ImgForm.caption := inttostr(lX2); MoveToFX8(gDrawImg,lX2,lY2); if lImage.Canvas.Pen.Color = clBlack then //ensure single pixel is drawn if user clicks without dragging LineToFX8(gDrawImg,lX2,lY2,0) else LineToFX8(gDrawImg,lX2,lY2,kVOI8bit); gMouseDownX := lX; gMouseDownY := lY; end; //PGImageMouseDown var gDragX,gDragY,gDragZ : integer; //gDragRefresh : boolean = false; //only redraw one snapshot at a time procedure TImgForm.PGImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var lX, lY,lPanel,lXOut,lYOut,lZOut: integer; lImage: TImage; begin lImage := Sender as TImage; lX := X; lY := Y; ScaleScrn2BMP(lX,lY,lImage); //if MagnifyImage.Height > 10 then // MagnifyTimer.Enabled := true;//MagnifyBtn.Down; //StatusLabel.Caption := inttostr(lX)+','+inttostr(lY); if {(ssShift in Shift) and} (gSelectOrigin.X > 0) then begin ShowFocusRect(gSelectRect); gSelectRect.Left := gSelectOrigin.X; gSelectRect.Top := gSelectOrigin.Y; gSelectRect.Right := lX; gSelectRect.Bottom := lY; sortLTRB(gSelectRect.Left,gSelectRect.Top,gSelectRect.Right,gSelectRect.Bottom); ShowFocusRect(gSelectRect); exit; end; if (not DrawToolSelected) and ((ssLeft in Shift)) then begin //RefreshImagesTimer.Enabled := false; //gDragRefresh := true; if lImage.Name = PGImageCor.Name then lPanel := kCoroView0 else if lImage.Name = PGImageSag.Name then lPanel := kSagView0 else lPanel := kAxView0; XYscrn2Img (lImage,lPanel,lX,lY, lXout,lYOut,lZOut); if (lXout = gDragX) and (lYout = gDragY) and (lZOut = gDragZ) then exit;//no change XViewEdit.value := lXOut; YViewEdit.value := lYOut; ZViewEdit.value := lZOut; {$IFDEF FPC}XViewEditChange(nil);{$ENDIF} //can generate crash! //gDragRefresh := false; exit; end; if (not (ssLeft in Shift)) or (gMouseDownX < 0) then exit; if PenBtn.Down or ClosedPenBtn.Down then begin lImage.Canvas.LineTo(lX,lY); lX := X; lY := Y; ScaleBMP2Draw(gBGImg.VOIInvZoom, lX,lY,lPanel,lImage); //DrawImg2.Canvas.LineTo(lX,lY); if lImage.Canvas.Pen.Color = clBlack then LineToFX8(gDrawImg,lX,lY,0)//zzzxx else LineToFX8(gDrawImg,lX,lY,kVOI8bit);//zzzxx end; end; //PGImageMouseMove (*procedure Scrn2VOI (var lImage: TImage; lXvoi,lYvoi: integer; var lVOIBuffer: ByteP); const kSh = 10; //bits to shift var lInc,lXpos,lYPos,lVOISliceSz: integer; srcBmp : TBitmap; begin srcBmp := lImage.Picture.Bitmap; lVOISliceSz := lXvoi*lYvoi; GetMem (lVOIBuffer , lVOISliceSz); lInc := 0; for lYpos:=(lYvoi-1) downto 0 do begin for lXpos:=0 to lXvoi-1 do begin inc(lInc); //zax if srcBmp.Canvas.Pixels[lXpos,lYPos] = clBlack then lVOIBuffer^[lInc] := 0 else lVOIBuffer^[lInc] := 100; end; end; end; //Scrn2VOI *) procedure ReadCorVOI (var lImage: TFX8; lSlice: integer); var lX,lY,lZ,lYOffset,lZOffset,lXYSliceSz,lPixel,lZPos,lXPos: integer; begin lX := gBGImg.ScrnDim[1]; lY := gBGImg.ScrnDim[2]; lZ := gBGImg.ScrnDim[3]; lYOffset := (lX) * (round(lSlice)-1); lXYSliceSz := (lX*lY); //Scrn2VOI (lImage,lX,lZ, lInBuff); lPixel := 0; for lZPos := 1 to lZ do begin lZOffset := (lZPos-1) * lXYSliceSz; for lXPos := 1 to lX do begin inc(lPixel); gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lZOffset+lYOffset+lXPos] :=lImage.Img^[lPixel]; end; //for each Y end; //for each Z end; procedure ReadSagVOI (var lImage: TFX8;lSlice: integer); var lX,lY,lZ,lXOffset,lYOffset,lZOffset,lXYSliceSz,lPixel,lZPos,lYPos: integer; begin lX := gBGImg.ScrnDim[1]; lY := gBGImg.ScrnDim[2]; lZ := gBGImg.ScrnDim[3]; lXYSliceSz := lX*lY; lXOffset := round(lSlice); // dec(lXOffset);//999+8 lPixel := 0; for lZPos := 1 to lZ do begin lZOffset := (lZPos-1) * lXYSliceSz; lYOffset := 0; for lYPos := 1 to lY do begin inc(lPixel); gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lZOffset+lYOffset+lXOffset] := lImage.Img^[lPixel]; lYOffset := lYOffset+ lX; end; //for each Y end; //for each Z //freemem(lInBuff); end; procedure ReadAxialVOI (var lImage: TFX8;lSlice: integer); var lX,lY,lSliceOffset,lSliceSz: integer; begin lX := gBGImg.ScrnDim[1]; lY := gBGImg.ScrnDim[2]; lSliceSz := lX*lY; lSliceOffset := (lSlice-1)*lX*lY; //Scrn2VOI (lImage,lX,lY, lInBuff); for lX := 1 to lSliceSz do gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lSliceOffset+lX] := lImage.Img^[lX]; end; procedure ReadScrnVOI (lImage: TImage); var lView: integer; begin if (gBGImg.VOIUndoSlice < 1) or (gBGImg.VOIUndoOrient < 1) or (gBGImg.VOIUndoOrient > 3) then exit; if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1) or (lImage.Picture.Bitmap.Width < 1) or (lImage.Picture.Bitmap.Height < 1) then exit; EnsureVOIOpen; lView := SelectedImageNum; case lView of 3: ReadCorVOI(gDrawImg,ImgForm.YViewEdit.Value); 2: ReadSagVOI(gDrawImg,ImgForm.XViewEdit.Value); 1: ReadAxialVOI(gDrawImg,ImgForm.ZViewEdit.Value); end; ImgForm.RefreshImagesTimer.Enabled := true; end; procedure TImgForm.PGImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var lX, lY,lPanel: integer; lImage: TImage; begin lPanel := SelectedImageNum; lImage := Sender as TImage; lX := X; lY := Y; ScaleScrn2BMP(lX,lY,lImage); if (gSelectOrigin.X > 0) then begin sortLTRB(gSelectRect.Left,gSelectRect.Top,gSelectRect.Right,gSelectRect.Bottom); ShowFocusRect(gSelectRect); gSelectOrigin.X := -1; if (EllipseBtn.Down) then DrawEllipse(Limage,gSelectRect,Shift,lPanel) else begin AdjustContrastRectangle(lImage); exit; end; end; if ((PenBtn.Down) or (ClosedPenBtn.Down)) and (gMouseDownX > 0) then begin ScaleBMP2Draw(gBGImg.VOIInvZoom, gMouseDownX,gMouseDownY,lPanel,lImage); //next: draw single pxiel if user clicks on image without moving the mouse //DrawImg2.Canvas.Pixels[gMouseDownX,gMouseDownY] := DrawImg2.Canvas.Pen.Color; if (ClosedPenBtn.Down) then begin if lImage.Canvas.Pen.Color = clBlack then LineToFX8(gDrawImg,gMouseDownX,gMouseDownY,0) else LineToFX8(gDrawImg,gMouseDownX,gMouseDownY,kVOI8Bit); end; end; gMouseDownX := -1; //disable draws //if DrawToolSelected then if DrawToolSelected and (not (ssAlt in Shift)) then ReadScrnVOI (lImage); end; //PGImageMouseUp procedure TImgForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin Case SelectedImageNum of 3: DecViewEdit(YViewEdit); 2: DecViewEdit(XViewEdit); else DecViewEdit(ZViewEdit); end; end; procedure TImgForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin Case SelectedImageNum of 3: IncViewEdit(YViewEdit); 2: IncViewEdit(XViewEdit); else IncViewEdit(ZViewEdit); end; end; procedure TImgForm.ZoomDropSelect(Sender: TObject); begin gBGImg.ZoomPct := (ZoomDrop.ItemIndex-1)*100; RefreshImagesTimer.Enabled := true; end; procedure TImgForm.ColorBarBtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var lLTRB,lLayer: integer; lImage: TImage; begin if (ssAlt in Shift) then begin //lImage := SelectedImage; lLayer := ActiveLayer; DrawHistogram(gMRIcroOverlay[lLayer],HistogramForm.HistoImage{lImage}); HistogramForm.Caption := 'Histogram: '+extractfilename(gMRIcroOverlay[lLayer].HdrFileName); HistogramForm.show; if (ssCtrl in Shift) then TextReportHisto(gMRIcroOverlay[lLayer]); exit; end; lLTRB := 1; if (ssRight in Shift) then lLTRB := lLTRB + 1; if (ssCtrl in Shift) then lLTRB := lLTRB + 2; lImage := SelectedImage; intenBar(lImage,gMRIcroOverlay[ActiveLayer],lLTRB,0,0); end; procedure TImgForm.XBarBtnClick(Sender: TObject); begin gBGImg.XBarVisible := XBarBtn.Down; RefreshImagesTimer.Enabled := true; end; procedure RepositionOrigin; begin gBGImg.ScrnOri[1] := ImgForm.XviewEdit.value; gBGImg.ScrnOri[2] := ImgForm.YviewEdit.value; gBGImg.ScrnOri[3] := ImgForm.ZviewEdit.value; end; procedure TImgForm.XBarBtnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin end; procedure TImgForm.XBarBtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); label 555; begin if not (ssRight in shift) then exit; if (ssShift in Shift) then begin RepositionOrigin; goto 555; end; if (ssAlt in Shift) and (ssCtrl in Shift) then begin inc(gBGImg.FontSize,2); if gBGImg.FontSize > 24 then gBGImg.FontSize := 8; goto 555; end; if (ssAlt in Shift) then begin inc(gBGImg.XBarThick,2); if gBGImg.XBarThick > 10 then gBGImg.XBarThick := 1; goto 555; end; if (ssCtrl in Shift) then begin ColorDialog1.Color := gBGImg.XBarClr; if not ColorDialog1.Execute then exit; gBGImg.XBarClr := ColorDialog1.Color; goto 555; end; inc(gBGImg.XBarGap); if gBGImg.XBarGap > 10 then gBGImg.XBarGap := 0; 555: RefreshImagesTimer.Enabled := true; if MultiSliceForm.Visible then MultiSliceForm.CreateMultiSlice; end; //XBarBtnMouseDown procedure TImgForm.RefreshImagesTimerTimer(Sender: TObject); begin RefreshImagesTimer.Enabled := false; RefreshImages; UpdateStatusLabel; end; procedure TImgForm.ImgPanelClick(Sender: TObject); begin SelectPanel((Sender as TScrollBox).tag); end; procedure TImgForm.MagnifyMenuItemClick(Sender: TObject); begin (*if MagnifyPanel.Height < 20 then //Height constrained by Y MagnifyPanel.Height := 128 else MagnifyPanel.Height := MagnifyPanel.Constraints.MinHeight; *) end; procedure TImgForm.CloseImagesClick(Sender: TObject); var lC: integer; begin CloseVOIClick(nil); FreeUndoVol; for lC := 0 to knMaxOverlay do //background, all overlays, VOI FreeImgMemory(gMRIcroOverlay[lC]); gBGImg.VOIUndoSlice := 0; //next- set layers menu LayerDrop.Items.Clear; LayerDrop.Items.Add('Background'); {$IFNDEF FPC} LayerDrop.SetItemIndex(0); {$ELSE} LayerDrop.ItemIndex :=(0); {$ENDIF} LayerDropSelect(nil); end; procedure TImgForm.OverlayOpenCore (var lFilename: string; lOverlayNum: integer); begin if not HdrForm.OpenAndDisplayHdr(lFilename,gMRIcroOverlay[lOverlayNum]) then exit; //if not OpenImg(gBGImg,gMRIcroOverlay[lOverlayNum],false,false,false) then exit; //if (ssShift in KeyDataToShiftState(vk_Shift)) then begin // if not OpenImg(gBGImg,gMRIcroOverlay[lOverlayNum],false,false,false,not gBGImg.ResliceOnLoad,false) then exit; //end else if not OpenImg(gBGImg,gMRIcroOverlay[lOverlayNum],false,false,false,gBGImg.ResliceOnLoad,false) then exit; ImgForm.UpdateLayerMenu; ImgForm.RefreshImagesTimer.Enabled := true; end; procedure TImgForm.LoadOverlay (lFilename: string); var lOverlay,lC: integer; begin lOverlay := 0; for lC := 1 to (knMaxOverlay-1) do //-1: save final overlay for VOI if (lOverlay = 0) and (gMRIcroOverlay[lC].ImgBufferItems = 0) then lOverlay := lC; if lOverlay = 0 then begin showmessage('Unable to add an overlay. You have loaded the maximum number of overlays.'); exit; end; OverlayOpenCore ( lFilename, lOverlay); end; procedure TImgForm.LoadOverlayIncludingRGB (lFilename: string); var lOverlay,lC: integer; begin lOverlay := 0; for lC := 1 to (knMaxOverlay-1) do //-1: save final overlay for VOI if (lOverlay = 0) and (gMRIcroOverlay[lC].ImgBufferItems = 0) then lOverlay := lC; if lOverlay = 0 then begin showmessage('Unable to add an overlay. You have loaded the maximum number of overlays.'); exit; end; OverlayOpenCore ( lFilename, lOverlay); if (gMRIcroOverlay[lOverlay].NIFTIhdr.datatype = kDT_RGB) then begin OverlayOpenCore ( lFilename, lOverlay+1); OverlayOpenCore ( lFilename, lOverlay+2); OverlayAdditive.click; end; end; procedure TImgForm.BrainMask1Click(Sender: TObject); var lInc: integer; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1 then begin showmessage('Please load a background image for rescaling.'); exit; end; //lImgSamples := gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems; for lInc := 1 to gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems do if gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc] <> 0 then gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc] := 1; SaveAsVOIorNIFTI(gMRIcroOverlay[kBGOverlayNum].ScrnBuffer,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems,1,1,true,gMRIcroOverlay[kBGOverlayNum].NiftiHdr,gMRIcroOverlay[kVOIOverlayNum].HdrFileName); end; procedure TImgForm.ControlPanelDragDrop(Sender, Source: TObject; X, Y: Integer); begin end; (*procedure DescribeVOIonLabelsz (lOverlayNum: integer; lShowFilename: boolean); var lLocalMax,lLocalSum : HistoDoubleRA; l16Buf : SmallIntP; l32Buf : SingleP; l8Buf: byteP; lInten: double; lXmm,lYmm,lZmm: single; lHisto,lRegionVol,lLocalMaxPos: HistoRA; lInc,lRegion: Integer; lLabelStr: string; lVOI: boolean; lLabelStr20 : Array[0..kHistoBins] of kstr20; begin lInten := 0;//just to hide compiler hint... if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 2) and ('ratlas.nii.gz' = (extractfilename( gMRIcroOverlay[kBGOverlayNum].HdrFileName))) then begin // specific for PCDescribeVOIonLabelsRAT(lOverlayNum,lShowFilename); exit; end; if (gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) or (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP <> 1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 2) then exit; TextForm.MemoT.Lines.add(' Custom Region Analysis'); TextForm.MemoT.Lines.add(' For Speculative Brodmann Map: 0=not cortical and 48=no Brodmann label'); lVOI := IsVOIROIExt(gMRIcroOverlay[lOverlayNum].HdrFileName); if (not lVOI) and (lOverlayNum = kVOIOverlayNum) then lVOI := true; //next describe format if lShowfilename then lLabelStr := ' Filename,' else lLabelStr := ' '; if lVOI then //intensity min/max position are not important TextForm.MemoT.Lines.add(lLabelStr+'Area'+kTextSep+'N>0'+kTextSep+'%N>0') else TextForm.MemoT.Lines.add(lLabelStr+'Area'+kTextSep+'N>0'+kTextSep+'%N>0'+kTextSep+'Sum>0'+kTextSep+'Mean>0'+kTextSep+'Max'+kTextSep+'MaxX'+kTextSep+'MaxY'+kTextSep+'MaxZ'); //next initialize if lShowFilename then lLabelStr := gMRIcroOverlay[lOverlayNum].HdrFileName+kTextSep else lLabelStr := ''; for lInc := 0 to kHistoBins do begin lHisto[lInc] := 0; lLocalMax[lInc] := 0; lLocalSum[lInc] := 0; lRegionVol[lInc] := 0; if (gMRIcroOverlay[kBGOverlayNum].UsesCustomPalette) then lLabelStr20[lInc] := gBGImg.LabelStr20[lInc] else lLabelStr20[lInc] := inttostr(lInc); end; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then inc(lHisto[gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc]]); //local max start l32Buf := SingleP(gMRIcroOverlay[lOverlayNum].ImgBuffer ); l16Buf := SmallIntP(gMRIcroOverlay[lOverlayNum].ImgBuffer ); //NEXT if..else July07 - ROIs only use screen buffer, not imgbuffer... if gMRIcroOverlay[lOverlayNum].ScrnBufferItems = gMRIcroOverlay[lOverlayNum].ImgBufferItems then l8Buf := gMRIcroOverlay[lOverlayNum].ImgBuffer else l8Buf := gMRIcroOverlay[lOverlayNum].ScrnBuffer; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin if (gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 4) then lInten := l32Buf^[lInc] else if (gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 2) then lInten := l16Buf^[lInc] else if gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 1 then lInten := l8Buf^[lInc];//July07 lRegion := gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc]; if lInten > 0 then lLocalSum[lRegion] := lLocalSum[lRegion]+lInten; if lInten > lLocalMax[lRegion] then begin lLocalMax[lRegion] := lInten;//intensity lLocalMaxPos[lRegion] := lInc;//location end; inc(lRegionVol[lRegion]); end; for lInc := 0 to kHistoBins do begin if (not lVOI) and (lLocalMax[lInc] > 0) then begin lLocalMax[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalMax[lInc]); lLocalSum[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalSum[lInc]); ImgPosToMM(lLocalMaxPos[lInc], lXmm,lYmm,lZmm); TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr20[lInc] + kTextSep + inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc]) +kTextSep+floattostr( lLocalSum[lInc])+kTextSep+floattostr( lLocalSum[lInc]/lRegionVol[lInc]) //Sum>0, mean>0 +kTextSep + floattostr(lLocalMax[lInc])+kTextSep+floattostr(lXmm)+kTextSep+floattostr(lYmm)+kTextSep+floattostr(lZmm) ); end else if (lHisto[lInc] > 0) {necessarily also and (lRegionVol[lInc] > 0)} then TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr20[lInc] +kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ; end; //for each row end; *) procedure DescribeVOIonLabels (lOverlayNum: integer; lShowFilename: boolean); var lLocalMax,lLocalSum : HistoDoubleRA; l16Buf : SmallIntP; l32Buf : SingleP; l8Buf: byteP; lInten: double; lXmm,lYmm,lZmm: single; lHisto,lRegionVol,lLocalMaxPos: HistoRA; lInc,lRegion: Integer; lLabelStr: string; lVOI: boolean; lLabelStr50 : Array[0..kHistoBins] of kstr50; begin lInten := 0;//just to hide compiler hint... (*if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 2) and ('ratlas.nii.gz' = (extractfilename( gMRIcroOverlay[kBGOverlayNum].HdrFileName))) then begin DescribeVOIonLabelsRAT(lOverlayNum,lShowFilename); exit; end; *) if (gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) or (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP <> 1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 2) then exit; TextForm.MemoT.Lines.add(' Custom Region Analysis'); TextForm.MemoT.Lines.add(' For Speculative Brodmann Map: 0=not cortical and 48=no Brodmann label'); lVOI := IsVOIROIExt(gMRIcroOverlay[lOverlayNum].HdrFileName); if (not lVOI) and (lOverlayNum = kVOIOverlayNum) then lVOI := true; //next describe format if lShowfilename then lLabelStr := kTextSep+'Filename'+kTextSep else lLabelStr := kTextSep; if lVOI then //intensity min/max position are not important TextForm.MemoT.Lines.add(lLabelStr+'Index'+kTextSep+'Area'+kTextSep+'N>0'+kTextSep+'%N>0') else TextForm.MemoT.Lines.add(lLabelStr+'Index'+kTextSep+'Area'+kTextSep+'N>0'+kTextSep+'%N>0'+kTextSep+'Sum>0'+kTextSep+'Mean>0'+kTextSep+'Max'+kTextSep+'MaxX'+kTextSep+'MaxY'+kTextSep+'MaxZ'); //next initialize if lShowFilename then begin if gMRIcroOverlay[lOverlayNum].HdrFileName = '' then lLabelStr := 'VOI'+kTextSep else lLabelStr := gMRIcroOverlay[lOverlayNum].HdrFileName+kTextSep; end else lLabelStr := ''; for lInc := 0 to kHistoBins do begin lHisto[lInc] := 0; lLocalMax[lInc] := 0; lLocalSum[lInc] := 0; lRegionVol[lInc] := 0; if (gMRIcroOverlay[kBGOverlayNum].UsesCustomPalette) then lLabelStr50[lInc] := inttostr(lInc)+kTextSep+gBGImg.LabelStr20[lInc] else lLabelStr50[lInc] := inttostr(lInc)+kTextSep+realtostr(Scrn2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lInc),2); end; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then inc(lHisto[gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc]]); //local max start l32Buf := SingleP(gMRIcroOverlay[lOverlayNum].ImgBuffer ); l16Buf := SmallIntP(gMRIcroOverlay[lOverlayNum].ImgBuffer ); //NEXT if..else July07 - ROIs only use screen buffer, not imgbuffer... if gMRIcroOverlay[lOverlayNum].ScrnBufferItems = gMRIcroOverlay[lOverlayNum].ImgBufferItems then l8Buf := gMRIcroOverlay[lOverlayNum].ImgBuffer else l8Buf := gMRIcroOverlay[lOverlayNum].ScrnBuffer; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin if (gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 4) then lInten := l32Buf^[lInc] else if (gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 2) then lInten := l16Buf^[lInc] else if gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 1 then lInten := l8Buf^[lInc];//July07 lRegion := gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc]; if lInten > 0 then lLocalSum[lRegion] := lLocalSum[lRegion]+lInten; if lInten > lLocalMax[lRegion] then begin lLocalMax[lRegion] := lInten;//intensity lLocalMaxPos[lRegion] := lInc;//location end; inc(lRegionVol[lRegion]); end; for lInc := 0 to kHistoBins do begin if (not lVOI) and (lLocalMax[lInc] > 0) then begin lLocalMax[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalMax[lInc]); lLocalSum[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalSum[lInc]); ImgPosToMM(lLocalMaxPos[lInc], lXmm,lYmm,lZmm); TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr50[lInc] +kTextSep + inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc]) +kTextSep+floattostr( lLocalSum[lInc])+kTextSep+floattostr( lLocalSum[lInc]/lRegionVol[lInc]) //Sum>0, mean>0 +kTextSep + floattostr(lLocalMax[lInc])+kTextSep+floattostr(lXmm)+kTextSep+floattostr(lYmm)+kTextSep+floattostr(lZmm) ); end else if (lHisto[lInc] > 0) {necessarily also and (lRegionVol[lInc] > 0)} then TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr50[lInc] +kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ; end; //for each row end; procedure ShowDescriptive (lOverlayNum: integer; lShowFilename: boolean); var lROIVol: array [1..3] of integer; lInc: integer; lCenterOfMass,lROISum,lROISumSqr,lROImin,lROImax:array [1..3] of double; lCC,lVal,lSD,lROImean: double; lLabelStr,lStr: string; procedure AddVal( lRA: integer); begin inc(lROIVol[lRA]); lROISum[lRA] := lROISum[lRA]+lVal; lROISumSqr[lRA] := lROISumSqr[lRA] + sqr(lVal); if lVal > lROImax[lRA] then lROImax[lRA] := lVal; if lVal < lROImin[lRA] then lROImin[lRA] := lVal; end; //proc AddVal begin //proc ShowDescript if gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems then exit; if lShowFilename then lLabelStr := gMRIcroOverlay[lOverlayNum].HdrFileName else lLabelStr := ''; for lInc := 1 to 3 do begin lROIVol[lInc] := 0; lROISum[lInc] := 0; lROISumSqr[lInc] := 0; lROImin[lInc] := maxint; lROImax[lInc] := -maxint; end; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then begin //fx(lInc); lVal := RawBGIntensity(lInc); AddVal(1); if lVal <> 0 then AddVal(2); if lVal > 0 then AddVal(3); end; //if VOI voxel end; //for each voxel //next - compute StDev //compute descriptives for each set of values if lOverlayNum = kVOIOverlayNum then lStr := 'VOI notes ' else lStr := 'Overlay #'+inttostr(lOverlayNum); if not lShowFilename then begin TextForm.MemoT.Lines.Add(lStr+' '+gMRIcroOverlay[lOverlayNum].HdrFileName); end; //TextForm.Memo1.Lines.Add('CoM'); if CenterOfMass (lOverlayNum, lCenterOfMass[1],lCenterOfMass[2],lCenterOfMass[3]) > 0 then TextForm.MemoT.Lines.Add(' '+lLabelStr+' Center of mass XYZ '+RealToStr(lCenterOfMass[1],2)+'x'+RealToStr(lCenterOfMass[2],2)+'x'+RealToStr(lCenterOfMass[3],2)); for lInc := 1 to 3 do begin if lROIVol[lInc] > 1 then begin lSD := (lROISumSqr[lInc] - ((Sqr(lROISum[lInc]))/lROIVol[lInc])); if (lSD > 0) then lSD := Sqrt ( lSD/(lROIVol[lInc]-1)) else lSD := 0; end else lSD := 0; //next compute mean if lROIVol[lInc] > 0 then begin lROImean := lROISum[lInc]/lROIVol[lInc]; //next - calibrate values lROImin[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lROImin[lInc]); lROIMean := Raw2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lROIMean); lROImax[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lROImax[lInc]); lSD := Raw2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lSD); end else begin //2/2008 lROImin[lInc] := 0; lROImax[lInc] := 0; lROImean := 0; end; lcc := ((lROIVol[lInc]/1000)*gBGImg.ScrnMM[1]*gBGImg.ScrnMM[2]*gBGImg.ScrnMM[3]); case lInc of 3: lStr := 'VOI >0 '; 2: lStr := 'VOI <>0 '; else lStr := 'VOI '; end; lStr := lStr+' nvox(cc)=min/mean/max=SD: '+inttostr(round(lROIVol[lInc]))+kTextSep+RealToStr(lCC,2)+kTextSep+'='+kTextSep+RealToStr(lROIMin[lInc],4)+kTextSep+realToStr(lROIMean,4)+kTextSep+realToStr(lROIMax[lInc],4)+kTextSep+'='+kTextSep+realtostr(lSD,4); TextForm.MemoT.Lines.Add(lLabelStr+ lStr); end; //June07 if (gMRIcroOverlay[kBGOverlayNum].UsesCustomPalette) or (lShowFilename) then DescribeVOIonLabels(lOverlayNum,lShowfilename); TextForm.MemoT.Lines.Add(''); ImgForm.SaveDialog1.Filename := ExtractFileDirWithPathDelim(gMRIcroOverlay[lOverlayNum].HdrFileName)+'desc.csv'; end; procedure TImgForm.BatchROImean1Click(Sender: TObject); var lInc,lNumberofFiles: integer; lFilename:string; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1 then begin showmessage('Please load a background image for rescaling.'); exit; end; for lInc := 1 to (knMaxOverlay-1) do FreeImgMemory(gMRIcroOverlay[lInc]); UpdateLayerMenu; if not OpenDialogExecute(kImgFilter,'Select images you wish to analyze',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; if lNumberofFiles < 1 then exit; TextForm.MemoT.Lines.Clear; for lInc:= 1 to lNumberofFiles do begin lFilename := HdrForm.OpenHdrDlg.Files[lInc-1]; OverlayOpenCore ( lFilename, 2); ShowDescriptive(2,true); //LayerDrop.SetItemIndex(LayerDrop.Items.Count-1); //LayerDropSelect(nil); end; FreeImgMemory(gMRIcroOverlay[2]); UpdateLayerMenu; //SaveDialog1.Filename := ExtractFileDirWithPathDelim(HdrForm.OpenHdrDlg.Files[0])+'desc.csv'; TextForm.Show; end; procedure TImgForm.Batchprobmaps1Click(Sender: TObject); begin BatchVOI; end; procedure TImgForm.Batchclusterprobmaps1Batchclusterprobmaps1ClickClick( Sender: TObject); begin BatchCluster; end; procedure TImgForm.GenerateSPM5maskslesions1Click(Sender: TObject); begin VOISmoothForm.SmoothVOI_SPM5masks; end; procedure TImgForm.OverlayOpenClick(Sender: TObject); var lFilename: string; lOverlay,lInc: integer; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1 then begin showmessage('Please load a background image (''File''/''Open'') before adding an overlay.'); exit; end; if not OpenDialogExecute(kImgFilter,'Select overlay image[s]',true) then exit; if HdrForm.OpenHdrDlg.Files.Count < 1 then exit; for lInc := 1 to HdrForm.OpenHdrDlg.Files.Count do begin //vcx lFilename := HdrForm.OpenHdrDlg.Files[lInc-1]; LoadOverlayIncludingRGB{LoadOverlay}(lFilename); LayerDrop.ItemIndex := (LayerDrop.Items.Count-1); {$IFNDEF FPC} LayerDrop.SetItemIndex(LayerDrop.Items.Count-1); {$ELSE} LayerDrop.ItemIndex :=(LayerDrop.Items.Count-1); {$ENDIF} end; (* //HdrForm.OpenHdrDlg.Filter := kImgFilter; // if not HdrForm.OpenHdrDlg.Execute then exit; if not OpenDialogExecute(kImgFilter,'Select overlay image',false) then exit; lOverlay := 0; for lC := 1 to (knMaxOverlay-1) do //-1: save final overlay for VOI if (lOverlay = 0) and (gMRIcroOverlay[lC].ImgBufferItems = 0) then lOverlay := lC; if lOverlay = 0 then begin showmessage('Unable to add an overlay. You have loaded the maximum number of overlays.'); exit; end; lFilename := HdrForm.OpenHdrDlg.Filename; OverlayOpenCore ( lFilename, lOverlay); *) LayerDropSelect(nil); end; //OverlayOpenClick procedure TImgForm.BGtrans100Click(Sender: TObject); begin (sender as TMenuItem).checked := true; gBGImg.BGTransPct := (sender as TMenuItem).tag; RefreshImagesTimer.Enabled := true; end; procedure TImgForm.OverlayTransClick(Sender: TObject); begin (sender as TMenuItem).checked := true; gBGImg.OverlayTransPct := (sender as TMenuItem).tag; RefreshImagesTimer.Enabled := true; end; procedure TImgForm.LayerDropSelect(Sender: TObject); var lLayer: integer; begin lLayer := ActiveLayer; MaxWindowEdit.Value := gMRIcroOverlay[lLayer].WindowScaledMax; MinWindowEdit.Value := gMRIcroOverlay[lLayer].WindowScaledMin; if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then exit; {$IFNDEF FPC} LUTdrop.SetItemIndex(gMRIcroOverlay[lLayer].LUTindex); {$ELSE} LUTdrop.ItemIndex :=(gMRIcroOverlay[lLayer].LUTindex); {$ENDIF} //LUTinvertBtn.down := gMRIcroOverlay[lLayer].LUTinvert; LutFromZeroBtn.down := gMRIcroOverlay[lLayer].LutFromZero; end; procedure TImgForm.UpdateLayerMenu; var lStrings: TStringList; lPos,lLayer:integer; begin lStrings := TStringList.Create; lStrings.Add('Background'); lLayer := 0; for lPos := 1 to (knMaxOverlay-1) do //-1 as max overlay is VOI if (gMRIcroOverlay[lPos].ImgBufferItems > 0) then begin lStrings.Add(ParseFileName(ExtractFileName(gMRIcroOverlay[lPos].HdrFileName))); inc(lLayer); LUTdropLoad(lLayer); end; LayerDrop.Items := lStrings; {$IFNDEF FPC} if LayerDrop.ItemIndex >= LayerDrop.Items.Count then LayerDrop.SetItemIndex(LayerDrop.Items.Count-1); {$ELSE} if LayerDrop.ItemIndex >= LayerDrop.Items.Count then LayerDrop.ItemIndex :=(LayerDrop.Items.Count-1); {$ENDIF} LayerDropSelect(nil); lStrings.Free; end; procedure TImgForm.CloseOverlayImgClick(Sender: TObject); var lOverlay: integer; begin for lOverlay := 1 to (knMaxOverlay-1) do FreeImgMemory(gMRIcroOverlay[lOverlay]); UpdateLayerMenu; RefreshImagesTimer.Enabled := true; end; procedure TImgForm.LUTdropLoad(var lLayer: integer); var lStr: string; begin if gMRIcroOverlay[lLayer].UsesCustomPalette then begin exit; end; //gMRIcroOverlay[lLayer].LUTindex := LUTdrop.ItemIndex; if gMRIcroOverlay[lLayer].LUTindex < knAutoLUT then begin LoadMonochromeLUT(gMRIcroOverlay[lLayer].LUTindex,gBGImg,gMRIcroOverlay[lLayer]); RefreshImagesTimer.Enabled := true; exit; end; //if B&W lut lStr := gColorSchemeDir+pathdelim+LUTdrop.Items.Strings[gMRIcroOverlay[lLayer].LUTindex]+'.lut'; if not FileExistsEX(lStr) then showmessage('Can not find '+lStr); LoadColorScheme(lStr, gMRIcroOverlay[lLayer]); RefreshImagesTimer.Enabled := true; end; procedure TImgForm.LUTdropSelect(Sender: TObject); var lLayer: integer; begin lLayer := ActiveLayer; gMRIcroOverlay[lLayer].LUTindex := LUTdrop.ItemIndex; //gMRIcroOverlay[lLayer].LUTinvert := LUTinvertBtn.down; //gMRIcroOverlay[lLayer].LutFromZero := LutFromZeroBtn.down; LUTdropLoad(lLayer); //RescaleImagesTimer.Enabled := true; end; //proc LUTdropSelect procedure TImgForm.AutoContrastBtnClick(Sender: TObject); var lLayer: integer; begin lLayer := ActiveLayer; MinWindowEdit.Value := raw2ScaledIntensity(gMRIcroOverlay[lLayer], gMRIcroOverlay[lLayer].AutoBalMinUnscaled); MaxWindowEdit.Value := raw2ScaledIntensity(gMRIcroOverlay[lLayer],gMRIcroOverlay[lLayer].AutoBalMaxUnscaled);{} gMRIcroOverlay[lLayer].WindowScaledMin := MinWindowEdit.Value; gMRIcroOverlay[lLayer].WindowScaledMax := MaxWindowEdit.Value; RescaleImgIntensity(gBGImg,gMRIcroOverlay[lLayer],lLayer); RefreshImagesTimer.Enabled := true; end; procedure TImgForm.MinContrastWindowEditChange(Sender: TObject); var lLayer: integer; begin lLayer := ActiveLayer; if gMRIcroOverlay[lLayer].WindowScaledMin = MinWindowEdit.Value then exit; gMRIcroOverlay[lLayer].WindowScaledMin := MinWindowEdit.Value; RescaleImagesTimer.Enabled := true; end; procedure TImgForm.MaxContrastWindowEditChange(Sender: TObject); var lLayer: integer; begin lLayer := ActiveLayer; if gMRIcroOverlay[lLayer].WindowScaledMax = MaxWindowEdit.Value then exit; gMRIcroOverlay[lLayer].WindowScaledMax := MaxWindowEdit.Value; RescaleImagesTimer.Enabled := true; end; procedure TImgForm.OverlaySmoothMenuClick(Sender: TObject); var lC: integer; begin if Sender = nil then begin gBGImg.OverlaySmooth := OverlaySmoothMenu.Checked; exit; end; OverlaySmoothMenu.Checked := not OverlaySmoothMenu.Checked; gBGImg.OverlaySmooth := OverlaySmoothMenu.Checked; for lC := 1 to knMaxOverlay do if gMRIcroOverlay[lC].ScrnBufferItems > 0 then RescaleImgIntensity(gBGImg,gMRIcroOverlay[lC],lC); RefreshImagesTimer.Enabled := true; end; procedure TImgForm.ShowRenderClick(Sender: TObject); begin RenderForm.Show; //RenderForm.BringToFront; end; procedure TImgForm.PenBtnClick(Sender: TObject); begin RefreshImagesTimer.Enabled := true; end; procedure OpenMRIcroROI (lFilename: string); const kMax12bit = 4095; kMax16bit = (256*256)-1; kMax15bit = kMax16bit shr 1; //kMax20bit = (16*256*256)-1; // k20v16bit = kMax20bit - kMax16bit; //kMaxRuns = 10000; //kMaxFile = 65536; //k16v12bit = kMax16bit - kMax12bit; var lFile32bitItems,lFileSz,lFilePos,lSliceSz,lZ,lRunsOnSlice, lRunLength,lRun,lRunOffset,lOutputSliceOffset,lRunPos: integer; lROIformatRA: LongIntp; lF: File; lBigFormat: boolean; begin lFileSz := FSize(lFilename); if (lFileSz < 1) or ((lFileSz mod 4) <> 0) then begin showmessage('Unable to open ROI: file size should be divisible by 4.'); exit; end; lFile32bitItems := lFileSz div 4; //how many 32-bit items? lSliceSz := gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]; lZ := gBGImg.ScrnDim[3]; if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems > 0 then freemem(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer); gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems := lSliceSz * lZ; getmem(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer,lSliceSz * lZ); fillchar(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems,0); if lSliceSz > 65535 then lBigFormat := true else lBigFormat := false; getmem(lROIformatRA,lFileSz); //file size must be divisible by 4 {$I-} AssignFile(lF, lFilename); FileMode := 0; { Set file access to read only } Reset(lF, 1); BlockRead(lF,lROIformatRA^,lFileSz); CloseFile(lF); FileMode := 2; {$I+} //next: check MSB of first byte to see if this is big format images if lBigFormat <> odd((lROIformatRA^[1] and kMax16bit) shr 15) then Showmessage('Warning: this ROI does not appear to be designed for the currently loaded background image.'); lFilePos := 1; if lBigFormat then begin //20-byte offset, 12-byte runlength while lFilePos < lFile32bitItems do begin lRunsOnSlice := (lROIformatRA^[lFilePos] shr 17) - 1; //shr 17: shift 16 bits, then div 2 (words instead of longints). Subtract 1 as the we have read slice number/ number of runs lZ := (lROIformatRA^[lFilePos] and kMax15bit); inc(lFilePos); lOutputSliceOffset := (lZ-1) * lSliceSz; for lRun := 1 to lRunsOnSlice do begin if (lFilePos <= lFileSz) then begin lRunLength := (lROIformatRA^[lFilePos] shr 16) and kMax12bit; lRunOffset := (lROIformatRA^[lFilePos] and kMax16bit)+ ((lROIformatRA^[lFilePos] shr 28) shl 16); if (lOutputSliceOffset+lRunLength+lRunOffset-1)> gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems then //showmessage('Overrun on slice '+inttostr(lZ)) else for lRunPos := lRunOffset to (lRunLength+lRunOffset-1) do gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lRunPos+lOutputSliceOffset] := kVOI8bit; end; inc(lFilePos); end;//for all runs end; //while lPos < lFSz end else begin //not big format format - 16-byte offset, 16-byte length while lFilePos < lFile32bitItems do begin //lRunsOnSlice := (lROIformatRA[lFilePos] shr 16) and kMax16bit; lRunsOnSlice := (lROIformatRA^[lFilePos] shr 17) - 1; //shr 17: shift 16 bits, then div 2 (words instead of longints). Subtract 1 as the we have read slice number/ number of runs lZ := (lROIformatRA^[lFilePos] and kMax15bit); inc(lFilePos); lOutputSliceOffset := (lZ-1) * lSliceSz; //showmessage(inttostr(lZ)+' '+inttostr(lRunsOnSlice)+' '+inttostr(lFilePos)+' '+inttostr(lFileSz)); for lRun := 1 to lRunsOnSlice do begin if (lFilePos <= lFileSz) then begin lRunLength := (lROIformatRA^[lFilePos] shr 16) and kMax16bit; lRunOffset := (lROIformatRA^[lFilePos] and kMax16bit); {if (lRunLength+lRunOffset-1)> gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems then showmessage('Overrun on slice '+inttostr(lZ)) else} for lRunPos := lRunOffset to (lRunLength+lRunOffset-1) do gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lRunPos+lOutputSliceOffset] := kVOI8bit; end; inc(lFilePos); end;//for all runs end; //while lPos < lFSz end; //if bigformat ... else little format freemem(lROIformatRA); lRun := maxint; LoadMonochromeLUT(lRun,gBGImg,gMRIcroOverlay[kVOIOverlayNum]); end; procedure TImgForm.OpenVOICore(var lFilename : string); var lExt: string; begin if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems > 0 then ImgForm.CloseVOIClick(nil); lExt := UpCaseExt(lFileName); gBGImg.VOIchanged := false; if (lExt='.ROI') then begin Showmessage('Warning: MRIcro ROI format does not save image dimensions. The background image must be in the same dimensions as the ROI.'); OpenMRIcroROI (lFileName); ImgForm.RefreshImagesTimer.Enabled := true; exit; end; if not HdrForm.OpenAndDisplayHdr(lFilename,gMRIcroOverlay[kVOIOverlayNum]) then exit; if not OpenImg(gBGImg,gMRIcroOverlay[kVOIOverlayNum],false,true,false,gBGImg.ResliceOnLoad,false) then exit; ImgForm.RefreshImagesTimer.Enabled := true; end;//OpenVOIClick procedure TImgForm.OpenVOIClick(Sender: TObject); var lFilename: string; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1 then begin showmessage('Please load a background image (''File''/''Open'') before adding a VOI.'); exit; end; //HdrForm.OpenHdrDlg.Filter := '*.roi';//kVOIFilter; //if not HdrForm.OpenHdrDlg.Execute then exit; if not OpenDialogExecute(kVOIFilter,'Select Volume of Interest drawing',false) then exit; lFilename := HdrForm.OpenHdrDlg.Filename; OpenVOICore(lFilename); end;//OpenVOIClick (*procedure TImgForm.SaveVOIClick(Sender: TObject); var lHdr: TMRIcroHdr; begin if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems= 0 then begin Showmessage('You need to create a VOI before you can save it.'); exit; end; if gBGImg.Mirror then begin lHdr.ScrnBufferItems := gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems; Getmem(lHdr.ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems); Move(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[1],lHdr.ScrnBuffer^[1],lHdr.ScrnBufferItems); MirrorScrnBuffer(gBGImg,lHdr); SaveAsVOIorNIFTI(lHdr.ScrnBuffer,lHdr.ScrnBufferItems,1,1,true,gMRIcroOverlay[kBGOverlayNum].NiftiHdr,gMRIcroOverlay[kVOIOverlayNum].HdrFileName); Freemem(lHdr.ScrnBuffer); exit; //sept2007 end; SaveAsVOIorNIFTI(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems,1,1,true,gMRIcroOverlay[kBGOverlayNum].NiftiHdr,gMRIcroOverlay[kVOIOverlayNum].HdrFileName); end;*) procedure TImgForm.SaveVOIcore(lPromptFilename: boolean); var lHdr: TMRIcroHdr; lNIFTIhdr: TNIFTIhdr; begin if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems= 0 then begin Showmessage('You need to create a VOI before you can save it.'); exit; end; //Start 10/2007: adjust scl_slope;? 10/2007 CopyNiftiHdr(gMRIcroOverlay[kBGOverlayNum].NiftiHdr,lNIFTIhdr); lNIFTIhdr.scl_slope := 1; lNIFTIhdr.scl_inter := 0; //end if gBGImg.Mirror then begin lHdr.ScrnBufferItems := gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems; Getmem(lHdr.ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems); Move(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[1],lHdr.ScrnBuffer^[1],lHdr.ScrnBufferItems); MirrorScrnBuffer(gBGImg,lHdr); if lPromptFilename then SaveAsVOIorNIFTI(lHdr.ScrnBuffer,lHdr.ScrnBufferItems,1,1,true,lNIFTIhdr,gMRIcroOverlay[kVOIOverlayNum].HdrFileName) else SaveAsVOIorNIFTIcore(gMRIcroOverlay[kVOIOverlayNum].HdrFileName,lHdr.ScrnBuffer,lHdr.ScrnBufferItems,1,1,lNIFTIhdr); Freemem(lHdr.ScrnBuffer); exit; //12/2010 end; if lPromptFilename then SaveAsVOIorNIFTI(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems,1,1,true,lNiftiHdr,gMRIcroOverlay[kVOIOverlayNum].HdrFileName) else SaveAsVOIorNIFTIcore(gMRIcroOverlay[kVOIOverlayNum].HdrFileName,gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems,1,1,lNiftiHdr); end; procedure TImgForm.Extract1Click(Sender: TObject); var lMin : smallint; lOtsuLevels,lnVox,lVox,lDilate: integer; lOneContiguousObject : boolean; l16Buf : SmallIntP; l32Buf : SingleP; lMinS: single; begin lnVox := gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems; if lnVox < 9 then begin showmessage('Please load a background image.'); exit; end; lOtsuLevels := ReadIntForm.GetInt('Otsu levels: larger values for larger volumes',1,4,5); lDilate := ReadIntForm.GetInt('Edge dilation voxels: larger values for larger volumes',0,2,12); lOneContiguousObject := OKMsg('Only extract single largest object?'); //MaskBackground (var lImg: Bytep; lXi,lYi,lZi,lOtsuLevels: integer; lDilateVox: single; lOneContiguousObject: boolean ); MaskBackground(gMRIcroOverlay[kBGOverlayNum].ScrnBuffer, gBGImg.ScrnDim[1],gBGImg.ScrnDim[2],gBGImg.ScrnDim[3],lOtsuLevels,lDilate,lOneContiguousObject); if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 4) then begin l32Buf := SingleP(gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); lMinS := l32Buf^[1]; for lVox := 1 to lnVox do if l32Buf^[lVox] < lMinS then lMinS := l32Buf^[lVox]; for lVox := 1 to lnVox do if gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lVox] = 0 then l32Buf^[lVox] := lMinS; end else if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 2) then begin l16Buf := SmallIntP(gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); lMin := l16Buf^[1]; for lVox := 1 to lnVox do if l16Buf^[lVox] < lMin then lMin := l16Buf^[lVox]; for lVox := 1 to lnVox do if gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lVox] = 0 then l16Buf^[lVox] := lMin; end else if gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 1 then begin lMin := gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[1]; for lVox := 1 to lnVox do if gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[lVox] < lMin then lMin := gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[lVox]; for lVox := 1 to lnVox do if gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lVox] = 0 then gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[lVox] := lMin; end; end; procedure TImgForm.SaveVOIClick(Sender: TObject); var lHdr: TMRIcroHdr; lNIFTIhdr: TNIFTIhdr; begin if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems= 0 then begin Showmessage('You need to create a VOI before you can save it.'); exit; end; //Start 10/2007: adjust scl_slope;? 10/2007 CopyNiftiHdr(gMRIcroOverlay[kBGOverlayNum].NiftiHdr,lNIFTIhdr); lNIFTIhdr.scl_slope := 1; lNIFTIhdr.scl_inter := 0; //end if gBGImg.Mirror then begin lHdr.ScrnBufferItems := gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems; Getmem(lHdr.ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems); Move(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[1],lHdr.ScrnBuffer^[1],lHdr.ScrnBufferItems); MirrorScrnBuffer(gBGImg,lHdr); SaveAsVOIorNIFTI(lHdr.ScrnBuffer,lHdr.ScrnBufferItems,1,1,true,lNIFTIhdr,gMRIcroOverlay[kVOIOverlayNum].HdrFileName); Freemem(lHdr.ScrnBuffer); exit; //sept2007 end; SaveAsVOIorNIFTI(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems,1,1,true,lNiftiHdr,gMRIcroOverlay[kVOIOverlayNum].HdrFileName); end; procedure TImgForm.VOIColorClick(Sender: TObject); var lMaxi: longint; begin ColorDialog1.Color := gBGImg.VOIClr; if not ColorDialog1.Execute then exit; gBGImg.VOIClr := ColorDialog1.Color; if gBGImg.VOIClr = clBlack then gBGImg.VOIClr := 1; //reserve 0 for deleting lMaxi:=maxint; LoadMonochromeLUT(lMaxi,gBGImg,gMRIcroOverlay[kVOIOverlayNum]); RefreshImagesTimer.Enabled := true; end; procedure TImgForm.CloseVOIClick(Sender: TObject); begin if (gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems>0) and (gBGImg.VOIChanged) then begin case MessageDlg('Do you wish to save the VOI drawing?', mtConfirmation, [mbYes, mbNo], 0) of { produce the message dialog box } {id_Yes}mrYes: SaveVOIClick(nil); end; //case end;//if changed FreeUndoVol; FreeImgMemory(gMRIcroOverlay[kVOIOverlayNum]); gBGImg.VOIUndoSlice := 0; gBGImg.VOIchanged := false; gBGImg.VOIUndoOrient := 0; RefreshImagesTimer.Enabled := true; end; procedure ImageRB (var lMaxR,lMaxB: integer; var lImage: TImage); var lPos: integer; begin if not lImage.Visible then exit; lPos := lImage.Left+lImage.Width; if lPos > lMaxR then lMaxR := lPos; lPos := lImage.Top+lImage.Height; if lPos > lMaxB then lMaxB := lPos; end; procedure CopyImg(var lSourceImg,lDestImg: TImage); var lPos: integer; begin if not lSourceImg.Visible then exit; lDestImg.Canvas.Draw(lSourceImg.Left,lSourceImg.Top,lSourceImg.Picture.Graphic); end; procedure TImgForm.SaveOrCopyImages(lCopy: boolean); var lMaxR,lMaxB: integer; lOutImg: TImage; begin lMaxR := 0; lMaxB := 0; ImageRB(lMaxR,lMaxB,ImgForm.PGImageAx); ImageRB(lMaxR,lMaxB,ImgForm.PGImageCor); ImageRB(lMaxR,lMaxB,ImgForm.PGImageSag); if (lMaxR < 1) or (lMaxB < 1) then exit; lOutImg := TImage.Create(ImgForm); try //use the object {$IFDEF FPC} lOutImg.Width := lMaxR; lOutImg.Height := lMaxB; {$ELSE} CreateImg(lMaxB,lMaxR,lOutImg); {$ENDIF} lOutImg.Canvas.Brush.color := ImgForm.TriplePanel.color; lOutImg.Canvas.Rectangle(0,0,lMaxR+1,lMaxB+1); CopyImg(ImgForm.PGImageAx,lOutImg); CopyImg(ImgForm.PGImageCor,lOutImg); CopyImg(ImgForm.PGImageSag,lOutImg); if lCopy then begin {$IFDEF FPC} lOutImg.Picture.Bitmap.SaveToClipboardFormat(2); {$ELSE} Clipboard.Assign(lOutImg.Picture.Graphic); {$ENDIF} end else SaveImgAsPNGBMP (lOutImg); finally FreeAndNil (lOutImg); end; end; procedure TImgForm.Saveaspicture1Click(Sender: TObject); begin SaveOrCopyImages(false); end; (*var lImage: TImage; begin lImage := SelectedImage; SaveImgAsPNGBMP (lImage); end; //Proc Saveaspicture1Click *) procedure TImgForm.Copy1Click(Sender: TObject); //Requires 'ClipBrd' in uses section begin SaveOrCopyImages(true); end; (*procedure TImgForm.Copy1Click(Sender: TObject); //Requires 'ClipBrd' in uses section var MyFormat : Word; lImage: TImage; AData: THandle; {$IFNDEF FPC}APalette : HPalette;{$ENDIF} begin lImage := SelectedImage; if (lImage.Picture.Graphic = nil) then begin //1420z Showmessage('You need to load an image before you can copy it to the clipboard.'); exit; end; {$IFNDEF FPC} lImage.Picture.Bitmap.SaveToClipBoardFormat(MyFormat,AData,APalette); ClipBoard.SetAsHandle(MyFormat,AData); {$ELSE} lImage.Picture.Bitmap.SaveToClipboardFormat(2); {$ENDIF} if (gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems>0) then WriteUndoVOI(SelectedImageNum,false); end; *) procedure TImgForm.Undo1Click(Sender: TObject); begin if gBGImg.VOIUndoSlice < 1 then exit; case gBGImg.VOIUndoOrient of 4: UndoVolVOI; 3: ReadCorVOI(gUndoImg,gBGImg.VOIUndoSlice); 2: ReadSagVOI(gUndoImg,gBGImg.VOIUndoSlice); 1: ReadAxialVOI(gUndoImg,gBGImg.VOIUndoSlice); end; ImgForm.RefreshImagesTimer.Enabled := true; end; procedure TImgForm.Paste1Click(Sender: TObject); begin if (gBGImg.VOIUndoSlice < 1) then exit; if gBGImg.VOIUndoOrient <> SelectedImageNum then //12/2007 exit; WriteUndoVOI(SelectedImageNum,true); case gBGImg.VOIUndoOrient of 3: ReadCorVOI(gDrawImg,ImgForm.YViewEdit.Value); 2: ReadSagVOI(gDrawImg,ImgForm.XViewEdit.Value); 1: ReadAxialVOI(gDrawImg,ImgForm.ZViewEdit.Value); else exit; end; ImgForm.RefreshImagesTimer.Enabled := true; end; procedure TImgForm.HideROIBtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin gOrigBGTransPct := gBGImg.BGTransPct; gBGImg.BGTransPct := 100; refreshimagestimer.enabled := true; end; procedure TImgForm.HideROIBtnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin gBGImg.BGTransPct := gOrigBGTransPct; Refreshimagestimer.enabled := true; end; procedure TImgForm.Applyintensityfiltertovolume1Click(Sender: TObject); begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then begin showmessage('You must have open a background image in order to apply an intensity filter (use File/Open).'); exit; end; FilterROIform.showmodal; end; procedure TImgForm.Quicksmooth1Click(Sender: TObject); var lHdr: TMRicroHdr; lXDim,lYDim,lZDim,lSum,lMinWt,lMaxWt,lMinInten,lMaxInten,lOutVolVox,lOutSliceSz,lX,lY,lZ,lXxi,l2,lZyi: integer; lSum32,lMinInten32,lMaxInten32: single; lTempBuff,lSrcBuff: Bytep; l16TempBuff,l16SrcBuff: SmallIntP; l32TempBuff,l32SrcBuff: SingleP; procedure AddPoint (lInten,lWeight:integer); begin lSum := lSum + (lInten*lWeight); if lInten <= lMinInten then begin lMinWt := lWeight; lMinInten := lInten; end else if lInten >= lMaxInten then begin lMaxWt := lWeight; lMaxInten := lInten; end; end; //nested AddPoint procedure AddPoint32 (lInten32: single; lWeight:integer); begin lSum32 := lSum32 + (lInten32*lWeight); if lInten32 <= lMinInten32 then begin lMinWt := lWeight; lMinInten32 := lInten32; end else if lInten32 >= lMaxInten32 then begin lMaxWt := lWeight; lMaxInten32 := lInten32; end; end; //nested AddPoint32 begin lHdr := gMRIcroOverlay[kBGOverlayNum]; lXDim := gBGImg.ScrnDim[1]; lYDim := gBGImg.ScrnDim[2]; lZDim := gBGImg.ScrnDim[3]; lOutSliceSz := gBGImg.ScrnDim[1] * gBGImg.ScrnDim[2]; lOutVolVox := lOutSliceSz * lZDim; if (lXDim < 3) or (lYDim < 3) or (lZDim < 3) or (lOutVolVox < 36) then begin showmessage('The 3D smoothing can only be applied to images with at least 3 slices in each dimension.'); exit; end; if (lHdr.ImgBufferItems < 1) then begin showmessage('Please first load the image you would like to smooth.'); exit; end; ProgressBar1.Min := 0; ProgressBar1.Max :=lZDim; StatusLabel.caption := 'Removing noise speckles and smoothing data [blur]'; if lHdr.ImgBufferBPP = 4 then begin //32-bit float data l32SrcBuff := SingleP(lHdr.ImgBuffer); GetMem(l32TempBuff,lOutVolVox*sizeof(single)); Move(l32SrcBuff^,l32TempBuff^,lOutVolVox*sizeof(single)); for lZ := 1 to lOutVolVox do l32SrcBuff^[lZ] := 0; for lZ := lZDim-1 downto 2 do begin ProgressBar1.Position := (lZDim-lZ); for lY := lYDim-1 downto 2 do begin lZyi := ((lZ-1)*lOutSliceSz) + ((lY-1) * lXDim); for lX := lXDim-1 downto 2 do begin lXxi := lZyi + lX; //next: gaussian mean after min/max values are excluded lSum32 := 0; lMinInten32 := l32TempBuff^[lXxi]; lMaxInten32 := l32TempBuff^[lXxi]; lMinWt := 12; lMaxWt := 12; AddPoint32(l32TempBuff^[lXxi],12);//quad-weight center AddPoint32(l32TempBuff^[lXxi-lOutSliceSz],2);//prev slice AddPoint32(l32TempBuff^[lXxi+lOutSliceSz],2);//next slices AddPoint32(l32TempBuff^[lXxi-1],2);//Left AddPoint32(l32TempBuff^[lXxi+1],2);//right AddPoint32(l32TempBuff^[lXxi-lXDim],2);//up AddPoint32(l32TempBuff^[lXxi+lXDim],2);//down AddPoint32(l32TempBuff^[lXxi-lOutSliceSz-1],1); AddPoint32(l32TempBuff^[lXxi-lOutSliceSz+1],1); AddPoint32(l32TempBuff^[lXxi-lOutSliceSz-lXDim],1); AddPoint32(l32TempBuff^[lXxi-lOutSliceSz+lXDim],1); AddPoint32(l32TempBuff^[lXxi+lOutSliceSz-1],1); AddPoint32(l32TempBuff^[lXxi+lOutSliceSz+1],1); AddPoint32(l32TempBuff^[lXxi+lOutSliceSz-lXDim],1); AddPoint32(l32TempBuff^[lXxi+lOutSliceSz+lXDim],1); AddPoint32(l32TempBuff^[lXxi-lXDim-1],1); AddPoint32(l32TempBuff^[lXxi+lXDim-1],1); AddPoint32(l32TempBuff^[lXxi-lXDim+1],1); AddPoint32(l32TempBuff^[lXxi+lXDim+1],1); if lMinInten32 = lMaxInten32 then l32SrcBuff^[lXxi] := lMaxInten32 //no variability in data else begin l2 := 36 - lMinWt -lMaxWt; //weight after we exceed brightest and darkest lSum32 := lSum32 -(lMinWt*lMinInten32) - (lMaxWt*lMaxInten32); //exclude brightest/darkest l32SrcBuff^[lXxi] := (lSum32/l2); end; end; //forX end; //forY end; //forZ Freemem(l32TempBuff); end else if (lHdr.ImgBufferBPP = 2) then begin //16-bit int data*) l16SrcBuff := SmallIntP(lHdr.ImgBuffer ); GetMem(l16TempBuff,lOutVolVox*sizeof(word)); Move(l16SrcBuff^,l16TempBuff^,lOutVolVox*sizeof(word)); for lZ := 1 to lOutVolVox do l16SrcBuff^[lZ] := 0; for lZ := lZDim-1 downto 2 do begin ProgressBar1.Position := (lZDim-lZ); for lY := lYDim-1 downto 2 do begin lZyi := ((lZ-1)*lOutSliceSz) + ((lY-1) * lXDim); for lX := lXDim-1 downto 2 do begin lXxi := lZyi + lX; //next: gaussian mean after min/max values are excluded lSum := 0; lMinInten := l16TempBuff^[lXxi]; lMaxInten := l16TempBuff^[lXxi]; lMinWt := 12; lMaxWt := 12; AddPoint(l16TempBuff^[lXxi],12);//quad-weight center AddPoint(l16TempBuff^[lXxi-lOutSliceSz],2);//prev slice AddPoint(l16TempBuff^[lXxi+lOutSliceSz],2);//next slices AddPoint(l16TempBuff^[lXxi-1],2);//Left AddPoint(l16TempBuff^[lXxi+1],2);//right AddPoint(l16TempBuff^[lXxi-lXDim],2);//up AddPoint(l16TempBuff^[lXxi+lXDim],2);//down AddPoint(l16TempBuff^[lXxi-lOutSliceSz-1],1); AddPoint(l16TempBuff^[lXxi-lOutSliceSz+1],1); AddPoint(l16TempBuff^[lXxi-lOutSliceSz-lXDim],1); AddPoint(l16TempBuff^[lXxi-lOutSliceSz+lXDim],1); AddPoint(l16TempBuff^[lXxi+lOutSliceSz-1],1); AddPoint(l16TempBuff^[lXxi+lOutSliceSz+1],1); AddPoint(l16TempBuff^[lXxi+lOutSliceSz-lXDim],1); AddPoint(l16TempBuff^[lXxi+lOutSliceSz+lXDim],1); AddPoint(l16TempBuff^[lXxi-lXDim-1],1); AddPoint(l16TempBuff^[lXxi+lXDim-1],1); AddPoint(l16TempBuff^[lXxi-lXDim+1],1); AddPoint(l16TempBuff^[lXxi+lXDim+1],1); if lMinInten = lMaxInten then l16SrcBuff^[lXxi] := lMaxInten //no variability in data else begin l2 := 36 - lMinWt -lMaxWt; //weight after we exceed brightest and darkest lSum := lSum -(lMinWt*lMinInten) - (lMaxWt*lMaxInten); //exclude brightest/darkest l16SrcBuff^[lXxi] := round(lSum/l2); end; end; //forX end; //forY end; //forZ Freemem(l16TempBuff); //OptimizeSingle(nil); end else if lHdr.ImgBufferBPP = 1 then begin //8-bit data lSrcBuff := lHdr.ImgBuffer; GetMem(lTempBuff,lOutVolVox); Move(lSrcBuff^,lTempBuff^,lOutVolVox); fillchar(lSrcBuff^,lOutVolVox,0); //set edges to 0, as outside voxel is not smoothed for lZ := lZDim-1 downto 2 do begin ProgressBar1.Position := (lZDim-lZ); for lY := lYDim-1 downto 2 do begin lZyi := ((lZ-1)*lOutSliceSz) + ((lY-1) * lXDim); for lX := lXDim-1 downto 2 do begin lXxi := lZyi + lX; //next: gaussian mean after min/max values are excluded lSum := 0; lMinInten := lTempBuff^[lXxi]; lMaxInten := lTempBuff^[lXxi]; lMinWt := 12; lMaxWt := 12; AddPoint(lTempBuff^[lXxi],12);//quad-weight center AddPoint(lTempBuff^[lXxi-lOutSliceSz],2);//prev slice AddPoint(lTempBuff^[lXxi+lOutSliceSz],2);//next slices AddPoint(lTempBuff^[lXxi-1],2);//Left AddPoint(lTempBuff^[lXxi+1],2);//right AddPoint(lTempBuff^[lXxi-lXDim],2);//up AddPoint(lTempBuff^[lXxi+lXDim],2);//down AddPoint(lTempBuff^[lXxi-lOutSliceSz-1],1); AddPoint(lTempBuff^[lXxi-lOutSliceSz+1],1); AddPoint(lTempBuff^[lXxi-lOutSliceSz-lXDim],1); AddPoint(lTempBuff^[lXxi-lOutSliceSz+lXDim],1); AddPoint(lTempBuff^[lXxi+lOutSliceSz-1],1); AddPoint(lTempBuff^[lXxi+lOutSliceSz+1],1); AddPoint(lTempBuff^[lXxi+lOutSliceSz-lXDim],1); AddPoint(lTempBuff^[lXxi+lOutSliceSz+lXDim],1); AddPoint(lTempBuff^[lXxi-lXDim-1],1); AddPoint(lTempBuff^[lXxi+lXDim-1],1); AddPoint(lTempBuff^[lXxi-lXDim+1],1); AddPoint(lTempBuff^[lXxi+lXDim+1],1); if lMinInten = lMaxInten then lSrcBuff^[lXxi] := lMaxInten //no variability in data else begin l2 := 36 - lMinWt -lMaxWt; //weight after we exceed brightest and darkest lSum := lSum -(lMinWt*lMinInten) - (lMaxWt*lMaxInten); //exclude brightest/darkest lSrcBuff^[lXxi] := round(lSum/l2); end; end; //forX end; //forY end; //forZ Freemem(lTempBuff); end else begin //8bit data showmessage('Unknown bits per pixel '+inttostr(lHdr.ImgBufferBPP) ); end; ProgressBar1.Position := 0; RescaleImgIntensity(gBGImg,gMRIcroOverlay[kBGOverlayNum],kBGOverlayNum); RefreshImagesTimer.Enabled := true; end; //quicksmooth procedure TImgForm.VOImaskClick(Sender: TObject); var lPreserve: integer; lHdr,lMaskHdr: TMRicroHdr; lXDim,lYDim,lZDim,lOutVolVox,lOutSliceSz,lZ: integer; lSrcBuff,lMaskBuff: Bytep; l16SrcBuff: SmallIntP; l32SrcBuff: SingleP; begin lPreserve := (sender as TMenuItem).tag; lHdr := gMRIcroOverlay[kBGOverlayNum]; lMaskHdr := gMRIcroOverlay[kVOIOverlayNum]; lXDim := gBGImg.ScrnDim[1]; lYDim := gBGImg.ScrnDim[2]; lZDim := gBGImg.ScrnDim[3]; lOutSliceSz := gBGImg.ScrnDim[1] * gBGImg.ScrnDim[2]; lOutVolVox := lOutSliceSz * lZDim; if (lXDim < 2) or (lYDim < 2) or (lZDim < 2) then begin showmessage('Masking can only be applied to images with multiple slices in 3 dimensions.'); exit; end; if (lHdr.ImgBufferItems <> lMaskHdr.ScrnBufferItems) or (lHdr.ImgBufferItems < 8) then begin showmessage('Please first load both an image (File/Open) and a masking VOI (Draw/Open).'); exit; end; if gBGImg.Mirror then MirrorScrnBuffer(gBGImg,lMaskHdr);//4/2008 lMaskBuff := (lMaskHdr.ScrnBuffer); ProgressBar1.Min := 0; ProgressBar1.Max :=lZDim; StatusLabel.caption := 'Masking data'; if lHdr.ImgBufferBPP = 4 then begin //32-bit float data l32SrcBuff := SingleP(lHdr.ImgBuffer); if lPreserve = 1 then begin for lZ := 1 to lOutVolVox do if lMaskBuff^[lZ] = 0 then l32SrcBuff^[lZ] := 0; end else begin for lZ := 1 to lOutVolVox do if lMaskBuff^[lZ] <> 0 then l32SrcBuff^[lZ] := 0; end; //if preserve end else if (lHdr.ImgBufferBPP = 2) then begin //16-bit int data*) l16SrcBuff := SmallIntP(lHdr.ImgBuffer ); if lPreserve = 1 then begin for lZ := 1 to lOutVolVox do if lMaskBuff^[lZ] = 0 then l16SrcBuff^[lZ] := 0; end else begin for lZ := 1 to lOutVolVox do if lMaskBuff^[lZ] <> 0 then l16SrcBuff^[lZ] := 0; end; end else if lHdr.ImgBufferBPP = 1 then begin //8-bit data lSrcBuff := lHdr.ImgBuffer; if lPreserve = 1 then begin for lZ := 1 to lOutVolVox do if lMaskBuff^[lZ] = 0 then lSrcBuff^[lZ] := 0 end else begin for lZ := 1 to lOutVolVox do if lMaskBuff^[lZ] <> 0 then lSrcBuff^[lZ] := 0; end; end else begin //8bit data showmessage('Unknown bits per pixel '+inttostr(lHdr.ImgBufferBPP) ); end; if gBGImg.Mirror then MirrorScrnBuffer(gBGImg,lMaskHdr);//4/2008 ProgressBar1.Position := 0; RescaleImgIntensity(gBGImg,gMRIcroOverlay[kBGOverlayNum],kBGOverlayNum); RefreshImagesTimer.Enabled := true; end; //VOImaskClick procedure TImgForm.Sagittal1Click(Sender: TObject); begin gBGImg.SliceView := (Sender as TMenuItem).Tag; RefreshImagesTimer.Enabled := true; end; procedure TImgForm.ROIcomparisonClick(Sender: TObject); var lComparison,lVolItems,lOverlay,lnOverlays,lPos: integer; begin lComparison := (Sender as TMenuItem).tag; //0=intersect AND,1=union OR ,2=mask lVolItems := gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]* gBGImg.ScrnDim[3]; if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems <> lVolItems) or (gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems <> lVolItems) then begin Showmessage('VOI comparisons require a VOI loaded onto a background image (Draw/Open).'); exit; end; lnOverlays := 0; for lOverlay := 1 to knMaxOverlay do if gMRIcroOverlay[lOverlay].ScrnBufferItems = lVolItems then inc(lnOverlays); if (lnOverlays = 0) then begin Showmessage('VOI comparisons require loaded overlays (Overlay/Add).'); exit; end; CreateUndoVol; if lComparison = 0 then begin //intersect AND for lOverlay := 1 to (knMaxOverlay-1) do begin if gMRIcroOverlay[lOverlay].ScrnBufferItems = lVolItems then begin for lPos := 1 to lVolItems do if gMRIcroOverlay[lOverlay].ScrnBuffer^[lPos] = 0 then gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lPos] := 0; end; //if overlay loaded end; //for each overlay end else if lComparison = 1 then begin //if intersect else UNION OR for lOverlay := 1 to (knMaxOverlay-1) do begin if gMRIcroOverlay[lOverlay].ScrnBufferItems = lVolItems then begin for lPos := 1 to lVolItems do if gMRIcroOverlay[lOverlay].ScrnBuffer^[lPos] > 0 then gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lPos] := kVOI8bit; end; //if overlay loaded end; //for each overlay end else if lComparison = 2 then begin //if union else MASK for lOverlay := 1 to (knMaxOverlay-1) do begin if gMRIcroOverlay[lOverlay].ScrnBufferItems = lVolItems then begin for lPos := 1 to lVolItems do if gMRIcroOverlay[lOverlay].ScrnBuffer^[lPos] > 0 then gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lPos] := 0; end; //if overlay loaded end; //for each overlay end; //if ..else MASK RefreshImagesTimer.Enabled := true; end; //ROIcomparisonClick procedure TImgForm.RescaleImagesTimerTimer(Sender: TObject); var lLayer: integer; begin lLayer := ActiveLayer; RescaleImagesTimer.Enabled := false; RescaleImgIntensity(gBGImg,gMRIcroOverlay[lLayer],lLayer); RefreshImages; end; procedure TImgForm.Fill3DBtnClick(Sender: TObject); begin AutoROIForm.Show; end; procedure TImgForm.SmoothVOI1Click(Sender: TObject); begin voismoothform.showmodal; //SmoothVOIForm.Showmodal end; procedure TImgForm.CreateOverlap(Sender: TObject); var lNumberofFiles,lC,lOverlay,lPos: integer; lFilename,lExt: string; lOverlapBuffer: ByteP; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1 then begin showmessage('Please load a background image (''File''/''Open'') before adding an overlay.'); exit; end; lOverlay := 0; for lC := 1 to (knMaxOverlay-1) do //-1: save final overlay for VOI if (lOverlay = 0) and (gMRIcroOverlay[lC].ImgBufferItems = 0) then lOverlay := lC; if lOverlay = 0 then begin showmessage('Unable to add an overlay. You have loaded the maximum number of overlays.'); exit; end; if not OpenDialogExecute(kVOIFilter,'Select VOIs you wish to combine',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; if lNumberofFiles < 2 then begin Showmessage('Error: This function is designed to overlay MULTIPLE images. You selected less than two images.'); exit; end; ProgressBar1.Min := 0; ProgressBar1.Max :=lNumberofFiles; ProgressBar1.Position := 0; getmem(lOverlapBuffer,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems); fillchar(lOverlapBuffer^,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems,0); for lC:= 1 to lNumberofFiles do begin lFilename := HdrForm.OpenHdrDlg.Files[lC-1]; lExt := UpCaseExt(lFileName); gBGImg.VOIchanged := false; if not HdrForm.OpenAndDisplayHdr(lFilename,gMRIcroOverlay[lOverlay]) then exit; if not OpenImg(gBGImg,gMRIcroOverlay[lOverlay],false,false,false,gBGImg.ResliceOnLoad,false) then exit; ProgressBar1.Position := lC; for lPos := 1 to gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems do if gMRIcroOverlay[lOverlay].ScrnBuffer^[lPos] > 0 then lOverlapBuffer^[lPos] := lOverlapBuffer^[lPos]+1; FreeImgMemory(gMRIcroOverlay[lOverlay]); end; //for each image //July07 getmem for unaligned buffer getmem(gMRIcroOverlay[lOverlay].ImgBuffer,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems); GetMem(gMRIcroOverlay[lOverlay].ImgBufferUnaligned ,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems + 16); //July072007 //gMRIcroOverlay[lOverlay].ImgBuffer := ByteP($fffffff0 and (integer(gMRIcroOverlay[lOverlay].ImgBufferUnaligned)+15)); gMRIcroOverlay[lOverlay].ImgBuffer := system.align(gMRIcroOverlay[lOverlay].ImgBufferUnaligned, 16); gMRIcroOverlay[lOverlay].ImgBufferItems := gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems; for lPos := 1 to gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems do gMRIcroOverlay[lOverlay].ImgBuffer[lPos] := lOverlapBuffer[lPos]; freemem(lOverlapBuffer); MakeStatHdr (gMRIcroOverlay[kBGOverlayNum],gMRIcroOverlay[lOverlay],0, lNumberofFiles,1,0,0,kNIFTI_INTENT_ESTIMATE,'N'+inttostr(lNumberofFiles) ); UpdateLayerMenu; RescaleImgIntensity(gBGImg,gMRIcroOverlay[lOverlay],lOverlay); ProgressBar1.Position := 0; //SaveAsVOIorNIFTI(gMRIcroOverlay[lOverlay].ImgBuffer,gMRIcroOverlay[lOverlay].ScrnBufferItems,1,false,gMRIcroOverlay[lOverlay].niftiHdr,'sum'+inttostr(lNumberofFiles)); SaveAsVOIorNIFTI(gMRIcroOverlay[lOverlay].ImgBuffer,gMRIcroOverlay[lOverlay].ScrnBufferItems,1,1,false,gMRIcroOverlay[lOverlay].niftiHdr,'sum'+inttostr(lNumberofFiles)); RefreshImagesTimer.Enabled := true; end;//proc CreateOverlap procedure TImgForm.Chisquare1Click(Sender: TObject); var lNegativeNumbers: boolean; lVolVoxels,lPos,lnTotalThreshold,lLoop,lnVoxelsTested:integer; lMinExp,lChi,lChip,luChi, luChiP: double; lMaxChi,lMinChi: single; lBufferAligned,lBufferUnAligned,lBuffer: ByteP; l32Buf : SingleP; lFilename: string; lTotal,lYes,lNo: array [1..2] of integer; lMRIcroHdr: TMRIcroHdr; begin lVolVoxels := gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems; if lVolVoxels < 1 then begin showmessage('Please load a background image (''File''/''Open'') before adding an overlay.'); exit; end; CloseOverlayImgClick(nil); for lLoop := 1 to 2 do begin //open two images if lLoop = 1 then begin if not OpenDialogExecute(kImgFilter,'Select POSITIVE overlap image',false) then exit end else begin if not OpenDialogExecute(kImgFilter,'Select NEGATIVE overlap image',false) then exit; end; lFilename := HdrForm.OpenHdrDlg.Filename; if not HdrForm.OpenAndDisplayHdr(lFilename,gMRIcroOverlay[lLoop]) then exit; if not OpenImg(gBGImg,gMRIcroOverlay[lLoop],false,false,true,gBGImg.ResliceOnLoad,false) then exit; lTotal[lLoop] := round(gMRIcroOverlay[lLoop].NIFTIhdr.glmax); if (gMRIcroOverlay[lLoop].NIFTIhdr.intent_code <> kNIFTI_INTENT_ESTIMATE) then showmessage('Warning: header intent_code is not set to ESTIMATE. Compute Chi-squared only with cumulative maps created with this program.'); if (gMRIcroOverlay[lLoop].NIFTIhdr.intent_name[1] <> 'N') then showmessage('Warning: header intention not N. Compute Chi-squared only with cumulative maps created with this program.'); UpdateLayerMenu; RefreshImagesTimer.Enabled := true; end; if (lVolVoxels<> gMRIcroOverlay[1].ScrnBufferItems) or (lVolVoxels<> gMRIcroOverlay[2].ScrnBufferItems) then begin showmessage('Error loading images.'); exit; end; //next - chi squared lnTotalThreshold:= ReadIntForm.GetInt('Only test voxels damaged in at least N patients [A+B]', 1,1,(lTotal[1]+lTotal[2])); GetMem(lBufferUnaligned ,(lVolVoxels *sizeof(single) )+16); //lBufferAligned := ByteP($fffffff0 and (integer(lBufferUnaligned)+15)); lBufferAligned := system.align(lBufferUnaligned, 16); l32Buf := SingleP(lBufferAligned); lnVoxelsTested := 0; lNegativeNumbers := false; lMaxChi := 0; lMinChi := 0; for lPos := 1 to lVolVoxels do begin l32Buf^[lPos] := 0; lYes[1] := gMRIcroOverlay[1].ScrnBuffer^[lPos]; lNo[1] := lTotal[1]-lYes[1]; lYes[2] := gMRIcroOverlay[2].ScrnBuffer^[lPos]; lNo[2] := lTotal[2]-lYes[2]; if (lYes[1] < 0) or (lNo[1] < 0) or (lYes[2] < 0) or (lNo[2] < 0) then lNegativeNumbers := true else if (lYes[1]+lYes[2]) >= lnTotalThreshold then begin//e.g. at least 30% of all patients inc(lnVoxelsTested); //showmessage(inttostr(lYes[1])+'x'+inttostr(lNo[1])+'x'+ inttostr(lYes[2])+'x'+inttostr(lNo[2]) ); Chi2x2 (lYes[1], lNo[1], lYes[2], lNo[2],lMinExp,lChi,lChip,luChi, luChiP); if (luChi) > lMaxChi then lMaxChi := (luChi) else if (luChi < lMinChi) then lMinChi := luChi; if (lYes[1]/lTotal[1]) > (lYes[2]/lTotal[2]) then l32Buf^[lPos] := luChi//100-(100*luChip) //positives more likely than negative else l32Buf^[lPos] := -luChi;//-100+(100*luChip); //negatives more common end;//> threshold end; //for each voxel MakeStatHdr (gMRIcroOverlay[kBGOverlayNum],lMRIcroHdr,lMinChi, lMaxChi,1{df},0,lnVoxelsTested,kNIFTI_INTENT_CHISQ,inttostr(lnVoxelsTested) ); if lNegativeNumbers then Showmessage('Serious error: some group sizes were negative. This should be impossible with a Chi-Squared.'); //SaveAsVOIorNIFTI(lBufferAligned,lVolVoxels,4,false,lMRIcroHdr.NiftiHdr,'chi'+inttostr(lnTotalThreshold)); SaveAsVOIorNIFTI(lBufferAligned,lVolVoxels,4,1,false,lMRIcroHdr.NiftiHdr,'log10p'+inttostr(lnTotalThreshold)); //next - save log10 p values... MakeStatHdr (gMRIcroOverlay[kBGOverlayNum],lMRIcroHdr,lMinChi, lMaxChi,1{df},0,lnVoxelsTested,NIFTI_INTENT_LOG10PVAL,inttostr(lnVoxelsTested) ); for lPos := 1 to lVolVoxels do if l32Buf^[lPos] > 0 then l32Buf^[lPos] := -log(abs(gammq(0.5, 0.5 * l32Buf^[lPos])),10) else l32Buf^[lPos] :=0; SaveAsVOIorNIFTI(lBufferAligned,lVolVoxels,4,1,false,lMRIcroHdr.NiftiHdr,'log10p'+inttostr(lnTotalThreshold)); //next - free float buffer FreeMem(lBufferUnaligned); StatusLabel.Caption := 'Voxels tested: '+inttostr(lnVoxelsTested); //next - subtraction GetMem(lBuffer ,(lVolVoxels )); lNegativeNumbers := false; fillchar(lBuffer^,lVolVoxels,100); for lPos := 1 to lVolVoxels do begin lYes[1] := gMRIcroOverlay[1].ScrnBuffer^[lPos]; lNo[1] := lTotal[1]-lYes[1]; lYes[2] := gMRIcroOverlay[2].ScrnBuffer^[lPos]; lNo[2] := lTotal[2]-lYes[2]; if (lYes[1] < 0) or (lNo[1] < 0) or (lYes[2] < 0) or (lNo[2] < 0) then lNegativeNumbers := true else if (lYes[1] >0) or (lYes[2] > 0) then begin lBuffer^[lPos] := round((100* ((lYes[1]/lTotal[1])-(lYes[2]/lTotal[2])))+100); end;//> threshold end; //for each voxel MakeStatHdr (gMRIcroOverlay[kBGOverlayNum],lMRIcroHdr,-100, 100,1,0,0,kNIFTI_INTENT_ESTIMATE,'%'+inttostr(lTotal[1])+':'+inttostr(lTotal[2]) ); lMRIcroHdr.NIFTIhdr.scl_inter:= -100; if lNegativeNumbers then Showmessage('Serious error: some group sizes were negative. This should be impossible with a subtraction analysis.'); SaveAsVOIorNIFTI(lBuffer,lVolVoxels,1,1,false,lMRIcroHdr.NiftiHdr,'Sub'+inttostr(lTotal[1])+'_'+inttostr(lTotal[2])); FreeMem(lBuffer); end; //procedure Chisquare1Click procedure TImgForm.ROIVOI1Click(Sender: TObject); var lNumberofFiles,lC: integer; lFilename: string; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1 then begin showmessage('Please load a background image (''File''/''Open'') before adding an overlay.'); exit; end; if gBGImg.Resliced then begin if not HdrForm.OpenAndDisplayHdr(gMRIcroOverlay[kBGOverlayNum].HdrFileName,gMRIcroOverlay[kBGOverlayNum]) then exit; if not OpenImg(gBGImg,gMRIcroOverlay[0],true,false,false,false,false) then exit; end; showmessage('Warning: the currently open background image must have the dimensions (size, space between slices, etc) as the image used when creating the ROIs.'); if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems > 0 then CloseVOIClick(nil); if not OpenDialogExecute('MRIcro ROI (.roi)|*.roi','Select MRIcro format ROIs to convert',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; ProgressBar1.Min := 0; ProgressBar1.Max :=lNumberofFiles; ProgressBar1.Position := 0; for lC:= 1 to lNumberofFiles do begin lFilename := HdrForm.OpenHdrDlg.Files[lC-1]; OpenMRIcroROI (lFileName); lFilename := changefileextX(lFilename,'.voi'); SaveAsVOIorNIFTIcore (lFilename, gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems, 1,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); CloseVOIClick(nil); ProgressBar1.Position := lC; end; ProgressBar1.Position := 0; end; procedure TImgForm.LUTinvertBtnClick(Sender: TObject); begin end; //proc LUTdropSelect procedure TImgForm.LutFromZeroBtnClick(Sender: TObject); var lLayer: integer; begin lLayer := ActiveLayer; gMRIcroOverlay[lLayer].LUTfromZero := LUTfromZeroBtn.down; LUTdropLoad(lLayer); RescaleImagesTimer.Enabled := true; end; procedure TImgForm.ShowMultisliceClick(Sender: TObject); begin (* if gBGImg.XBarClr = TColor(gMRIcroOverlay[kBGOverlayNum].LUTinvisible) then MultiSliceForm.MultiImage.canvas.font.Color := clBlack//clWhite;//gLUT[lClr].rgbRed+(gLUT[lClr].rgbGreen shl 8)+(gLUT[lClr].rgbBlue shl 16); else MultiSliceForm.MultiImage.canvas.font.Color := gBGImg.XBarClr;*) MultiSliceForm.Show; //MultiSliceForm.BringToFront; end; function RawBGIntensity(lPos: integer): single; var l16Buf : SmallIntP; l32Buf : SingleP; begin result := 0; if (lPos > gMRIcroOverlay[kBGOverlayNum].ImgBufferItems) or (lPos < 1) then exit; if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 4) then begin l32Buf := SingleP(gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); result := l32Buf^[lPos]; end else if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 2) then begin l16Buf := SmallIntP(gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); result := l16Buf^[lPos]; end else if gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 1 then result := gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[lPos] else begin showmessage('Unknown Background Buffer Bytes Per Pixel'); exit; end; end; procedure DescribeVOIonLabelsX (lOverlayNum: integer); var lShowfilename: boolean = true; lLocalMax,lLocalSum : HistoDoubleRA; l16Buf : SmallIntP; l32Buf : SingleP; l8Buf: byteP; lInten: double; lXmm,lYmm,lZmm: single; lHisto,lRegionVol,lLocalMaxPos: HistoRA; lInc,lRegion: Integer; lLabelStr: string; lVOI: boolean; lLabelStr20 : Array[0..kHistoBins] of kstr20; begin lInten := 0;//just to hide compiler hint... if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 2) and ('ratlas.nii.gz' = (extractfilename( gMRIcroOverlay[kBGOverlayNum].HdrFileName))) then begin //DescribeVOIonLabelsRAT(lOverlayNum,lShowFilename); Showmessage('Please use Windows version.'); exit; end; if (gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) or (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP <> 1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 2) then exit; TextForm.MemoT.Lines.add(' Custom Region Analysis'); TextForm.MemoT.Lines.add(' For Speculative Brodmann Map: 0=not cortical and 48=no Brodmann label'); lVOI := IsVOIROIExt(gMRIcroOverlay[lOverlayNum].HdrFileName); if (not lVOI) and (lOverlayNum = kVOIOverlayNum) then lVOI := true; //next describe format if lShowfilename then lLabelStr := ' Filename,' else lLabelStr := ' '; if lVOI then //intensity min/max position are not important TextForm.MemoT.Lines.add(lLabelStr+'Area'+kTextSep+'N>0'+kTextSep+'%N>0') else TextForm.MemoT.Lines.add(lLabelStr+'Area'+kTextSep+'N>0'+kTextSep+'%N>0'+kTextSep+'Sum>0'+kTextSep+'Mean>0'+kTextSep+'Max'+kTextSep+'MaxX'+kTextSep+'MaxY'+kTextSep+'MaxZ'); //next initialize if lShowFilename then lLabelStr := gMRIcroOverlay[lOverlayNum].HdrFileName+',' else lLabelStr := ''; for lInc := 0 to kHistoBins do begin lHisto[lInc] := 0; lLocalMax[lInc] := 0; lLocalSum[lInc] := 0; lRegionVol[lInc] := 0; if (gMRIcroOverlay[kBGOverlayNum].UsesCustomPalette) then lLabelStr20[lInc] := gBGImg.LabelStr20[lInc] else lLabelStr20[lInc] := inttostr(lInc); end; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then inc(lHisto[gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc]]); //local max start l32Buf := SingleP(gMRIcroOverlay[lOverlayNum].ImgBuffer ); l16Buf := SmallIntP(gMRIcroOverlay[lOverlayNum].ImgBuffer ); //NEXT if..else July07 - ROIs only use screen buffer, not imgbuffer... if gMRIcroOverlay[lOverlayNum].ScrnBufferItems = gMRIcroOverlay[lOverlayNum].ImgBufferItems then l8Buf := gMRIcroOverlay[lOverlayNum].ImgBuffer else l8Buf := gMRIcroOverlay[lOverlayNum].ScrnBuffer; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin if (gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 4) then lInten := l32Buf^[lInc] else if (gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 2) then lInten := l16Buf^[lInc] else if gMRIcroOverlay[lOverlayNum].ImgBufferBPP = 1 then lInten := l8Buf^[lInc];//July07 lRegion := gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc]; if lInten > 0 then lLocalSum[lRegion] := lLocalSum[lRegion]+lInten; if lInten > lLocalMax[lRegion] then begin lLocalMax[lRegion] := lInten;//intensity lLocalMaxPos[lRegion] := lInc;//location end; inc(lRegionVol[lRegion]); end; for lInc := 0 to kHistoBins do begin if (not lVOI) and (lLocalMax[lInc] > 0) then begin lLocalMax[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalMax[lInc]); lLocalSum[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalSum[lInc]); ImgPosToMM(lLocalMaxPos[lInc], lXmm,lYmm,lZmm); TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr20[lInc] +kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc]) +kTextSep+floattostr( lLocalSum[lInc])+kTextSep+floattostr( lLocalSum[lInc]/lRegionVol[lInc]) //Sum>0, mean>0 +kTextSep + floattostr(lLocalMax[lInc])+kTextSep+floattostr(lXmm)+kTextSep+floattostr(lYmm)+kTextSep+floattostr(lZmm) ); end else if (lHisto[lInc] > 0) {necessarily also and (lRegionVol[lInc] > 0)} then TextForm.MemoT.Lines.Add({lLabelStr+ lLabelStr20[lInc]}gBGImg.LabelStr20[lInc] + kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ; end; //for each row end; (*procedure DescribeVOIonLabels (lOverlayNum: integer); var lHisto: HistoRA; lInc: Integer; begin if (gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) or (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP <> 1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 2) then exit; TextForm.Memo1.Lines.Add(''); TextForm.Memo1.Lines.add('Custom Region Analysis'); TextForm.Memo1.Lines.add(' For Speculative Brodmann Map, 0=not cortical, 48=no Brodmann label'); for lInc := 0 to 255 do lHisto[lInc] := 0; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then inc(lHisto[gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lInc]]); for lInc := 0 to 255 do begin if lHisto[lInc] > 0 then TextForm.Memo1.Lines.Add( gBGImg.LabelStr20[lInc] + ', ' + inttostr(lHisto[lInc]) ); end; end;*) function Mode (lOverlayNum: integer): double; const kBins = 4095; var lInc,lS,lMaxI: integer; lV,lMin,lMax,lScale: single; lRA: LongIntP0; begin result := nan; //error if (gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems ) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1)then exit; lMin := RawBGIntensity(1); lMax := lMin; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then begin lV := RawBGIntensity(lInc); if lV < lMin then lMin := lV; if lV > lMax then lMax := lV; end; //if VOI voxel end; //for each voxel if lMin = lMax then begin //no variability result := Raw2ScaledIntensity(gMRIcroOverlay[kBGOverlayNum],lMin); exit; end; lScale := kBins/(lMax-lMin); getmem(lRA,(kBins+1) * sizeof(longint) ); //0..kBins for lInc := 0 to kBins do lRA^[lInc] := 0; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then begin lV := RawBGIntensity(lInc); lS := round((lV-lMin)*lScale); inc(lRA^[lS]); end; //if VOI voxel end; //for each voxel lMaxI := 0; for lInc := 1 to kBins do if lRA^[lInc] > lRA^[lMaxI] then lMaxI := lInc; result := lMin+ (lMaxI/kBins * (lMax-lMin)); result := Raw2ScaledIntensity(gMRIcroOverlay[kBGOverlayNum],result); freemem(lRA); end; procedure TImgForm.DescriptiveMenuItemClick(Sender: TObject); var lROIVol: array [1..3] of integer; lInc,lOverlayNum,lImgSz: integer; lCenterOfMass,lROISum,lROISumSqr,lROImin,lROImax:array [1..3] of double; lMode,lCC,lVal,lSD,lROImean: double; lStr: string; procedure AddVal( lRA: integer); begin inc(lROIVol[lRA]); lROISum[lRA] := lROISum[lRA]+lVal; lROISumSqr[lRA] := lROISumSqr[lRA] + sqr(lVal); if lVal > lROImax[lRA] then lROImax[lRA] := lVal; if lVal < lROImin[lRA] then lROImin[lRA] := lVal; end; begin lImgSz := 0; for lOverlayNum := 1 to knMaxOverlay do if gMRIcroOverlay[lOverlayNum].ScrnBufferItems > lImgSz then lImgSz := gMRIcroOverlay[lOverlayNum].ScrnBufferItems; if (lImgSz < 1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < lImgSz) then begin Showmessage('You need to create or load an overlay (Overlay/Open or Draw/OpenVOI) to get overlay statistics.'); exit; end; TextForm.MemoT.Lines.Clear; for lOverlayNum := 1 to knMaxOverlay do begin if gMRIcroOverlay[lOverlayNum].ScrnBufferItems = gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems then begin for lInc := 1 to 3 do begin lROIVol[lInc] := 0; lROISum[lInc] := 0; lROISumSqr[lInc] := 0; lROImin[lInc] := maxint; lROImax[lInc] := -maxint; end; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then begin lVal := RawBGIntensity(lInc); AddVal(1); if lVal <> 0 then AddVal(2); if lVal > 0 then AddVal(3); end; //if VOI voxel end; //for each voxel //next - compute StDev //compute descriptives for each set of values TextForm.MemoT.Lines.Add('Overlay '+gMRIcroOverlay[lOverlayNum].HdrFileName); if CenterOfMass (lOverlayNum, lCenterOfMass[1],lCenterOfMass[2],lCenterOfMass[3]) > 0 then TextForm.MemoT.Lines.Add(' Center of mass XYZ '+RealToStr(lCenterOfMass[1],2)+'x'+RealToStr(lCenterOfMass[2],2)+'x'+RealToStr(lCenterOfMass[3],2)); for lInc := 1 to 3 do begin if lROIVol[lInc] > 1 then begin lSD := (lROISumSqr[lInc] - ((Sqr(lROISum[lInc]))/lROIVol[lInc])); if (lSD > 0) then lSD := Sqrt ( lSD/(lROIVol[lInc]-1)) else lSD := 0; end else lSD := 0; //next compute mean if lROIVol[lInc] > 0 then lROImean := lROISum[lInc]/lROIVol[lInc] else lROImean := 0; //next - calibrate values lROImin[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lROImin[lInc]); lROIMean := Raw2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lROIMean); lROImax[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lROImax[lInc]); lSD := Raw2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],lSD); lcc := ((lROIVol[lInc]/1000)*gBGImg.ScrnMM[1]*gBGImg.ScrnMM[2]*gBGImg.ScrnMM[3]); case lInc of 3: lStr := 'VOI >0 '; 2: lStr := 'VOI <>0 '; else lStr := 'VOI '; end; lStr := lStr+' nvox(cc)=min/mean/max=SD: '+inttostr(round(lROIVol[lInc]))+kTextSep+RealToStr(lCC,2)+kTextSep+'='+RealToStr(lROIMin[lInc],4)+kTextSep+realToStr(lROIMean,4)+kTextSep+realToStr(lROIMax[lInc],4)+kTextSep+'='+kTextSep+realtostr(lSD,4); TextForm.MemoT.Lines.Add(lStr); end; lMode := Mode(lOverlayNum); if lMode <> NaN then TextForm.MemoT.Lines.Add('Mode:'+kTextSep+floattostr(lMode)); if gMRIcroOverlay[kBGOverlayNum].UsesCustomPalette then DescribeVOIonLabels(lOverlayNum,false); TextForm.MemoT.Lines.Add(''); end; //overlaynum loaded end; //for each overlay TextForm.Show; end; procedure TImgForm.FormResize(Sender: TObject); begin if not ImgForm.visible then exit; RefreshImagesTimer.enabled := true; end; function ParamStrFilename (var lParamPos: integer): string; var I: integer; lStr: string; begin result := ''; if (ParamCount < lParamPos) then exit; I := lParamPos; repeat if I = lParamPos then lStr := ParamStr(I) else lStr := lStr +' '+ ParamStr(I); inc(I); until (I>ParamCount) or (fileexistsex(lStr)); lParamPos := I; if fileexistsex(lStr) then result := lStr; end; procedure TImgForm.OnLaunch; var lStr: String; lMaximize,lRender,lMultislice : boolean; lCommandChar: Char; I,lError,lOverlayNum,lInc,lLUT: integer; lSingle: single; procedure ReadCmdVal;//nested begin inc(I); lStr := ParamStr(I); {$IFNDEF FPC} lStr := string(StrUpper(PChar(lStr))) ; {$ELSE} {$IFNDEF UNIX} lStr := UpCase(lStr); //unix file names are case specific /EXAMPLE/ATTENTION.NII <> /Example/Attention {$ENDIF} {$ENDIF} end; //nested ReadCmdVal begin {$IFDEF Darwin} //Darwin starts passing a strange paramstr.... //with Darwin, opening a file can interfere with opening by association... exit; //ResliceImg ('/Users/crlab/Documents/example_func.nii.gz','/Users/crlab/Documents/v1x.voi','/Users/crlab/Documents/example_func2standard.mat','/Users/crlab/Documents/z1x.nii.gz'); {$ENDIF} if (ParamCount < 1) then begin ImgForm.OpenTemplateMRU(nil); RefreshImagesTimer.enabled := true; exit; end; lMaximize := false; lRender := false; lMultislice := false; lOverlayNum := 0; I := 1; lStr := ParamStrFilename(I); if lStr <> '' then OpenAndDisplayImg(lStr,True) else begin //no requested image OpenTemplateMRU(nil); I := 1;//exit; end; I := I-1; //ShowMultisliceClick(nil); if I >= ParamCount then exit; gBGIMg.SaveDefaultIni := false; //do not store changes loaded by script repeat lStr := ''; repeat inc(I); if I = 1 then lStr := ParamStr(I) else begin if lStr <> '' then lStr := lStr +' '+ ParamStr(I) else lStr := ParamStr(I); end; if (length(lStr)>1) and (lStr[1] = '-') then begin //special command lCommandChar := UpCase(lStr[2]); case lCommandChar of 'B': begin //background transparency ReadCmdVal; Val(lStr,lSingle,lError); if lError = 0 then gBGImg.BGTransPct := round(lSingle); SetSubmenuWithTag(BGTransPctMenu, gBGImg.BGTransPct); end; 'C': begin //color look up table ReadCmdVal; if (Length(lStr)>1) then begin if lStr[1] = '-' then begin //LUT index number Val(lStr,lSingle,lError); if lError = 0 then lLUT := abs(round(lSingle)) else lLUT := -1; end else begin lStr := ParseFileName(ExtractFileName(lStr)); {$IFDEF UNIX} lStr := UpCase(lStr); {$ENDIF} lLUT := -1; for lInc := 1 to (LUTdrop.Items.Count-1) do if lStr = string(StrUpper(PChar(LUTdrop.Items.Strings[lINc]))) then lLUT := lInc; end; //else text LUTname if lLUT >= 0 then begin gMRIcroOverlay[lOverlayNum].LUTindex := lLUT; LUTdropLoad(lOverlayNum); end; end; //str length > 1 end; 'D': gBGIMg.SaveDefaultIni := true; 'F': gBGImg.ResliceOnLoad := false; //turn off reslicing... loads files flat 'H': begin ReadCmdVal; Val(lStr,lSingle,lError); if lError = 0 then gMRIcroOverlay[lOverlayNum].WindowScaledMax := (lSingle); end; 'L': begin //Low intensity scale ReadCmdVal; Val(lStr,lSingle,lError); if lError = 0 then gMRIcroOverlay[lOverlayNum].WindowScaledMin := (lSingle); end; 'M': begin //multislice lMultislice := true; ReadCmdVal; if (lStr <> '') and (lStr <> '-')and (FileexistsEx(lStr)) and (lOverlayNum < (knMaxOverlay-1)) then gMultiSliceStartupFilename := (lStr); end; //if 'M' 'O': begin//Overlay ReadCmdVal; //Showmessage('o'+lStr); if (lStr <> '') and (FileexistsEx(lStr)) and (lOverlayNum < (knMaxOverlay-1)) then begin //Showmessage('oexists'+lStr); inc(lOverlayNum); OverlayOpenCore (lStr,lOverlayNum); end; end; //if 'O' 'R': begin//Overlay lRender := true;//Render ReadCmdVal; if (lStr <> '') and (lStr <> '-')and (FileexistsEx(lStr)) and (lOverlayNum < (knMaxOverlay-1)) then gRenderStartupFilename := (lStr); end; //if 'R' 'S': begin //smooth ReadCmdVal; Val(lStr,lSingle,lError); if lError = 0 then begin if odd(round(lSingle)) then begin gBGImg.StretchQuality := sqHigh; Menu2DSmooth.checked := true; end else begin gBGImg.StretchQuality := sqLow; Menu2DSmooth.checked := false; end; if lSingle > 1 then gBGIMg.OverlaySmooth := true else gBGIMg.OverlaySmooth := false; OverlaySmoothMenu.Checked := gBGIMg.OverlaySmooth; end;//error=0 end; 'T': begin //overlay transparency ReadCmdVal; Val(lStr,lSingle,lError); if lError = 0 then gBGImg.OverlayTransPct := round(lSingle); SetSubmenuWithTag(OverlayTransPctMenu, gBGImg.OverlayTransPct); end; 'V': begin //open voi ReadCmdVal; if (lStr <> '') and (FileexistsEx(lStr)) then OpenVOICore(lStr); end; 'X': lMaximize := true; //open maximized 'Z': gMRIcroOverlay[lOverlayNum].LUTfromZero := true; end; //case lStr[2] lStr := ''; end; //special command until (I=ParamCount) or (fileexists(lStr)) {or (gAbort)}; until I >= ParamCount; LayerDropSelect(nil); for lInc := 0 to lOverlayNum do RescaleImgIntensity(gBGImg,gMRIcroOverlay[lInc],lINc); RefreshImages; if lMultiSlice then ShowMultisliceClick(nil); if lRender then ShowRenderClick(nil); if lMaximize then begin ImgForm.WindowState := wsMaximized; RefreshImagesTimer.enabled := true; end; end; procedure TImgForm.FormShow(Sender: TObject); var lStr: String; lMaximize,lRender,lMultislice : boolean; lCommandChar: Char; I,lError,lOverlayNum,lInc,lLUT: integer; lSingle: single; procedure ReadCmdVal;//nested begin inc(I); lStr := ParamStr(I); {$IFNDEF FPC} lStr := string(StrUpper(PChar(lStr))) ; {$ELSE} {$IFNDEF UNIX} lStr := UpCase(lStr); //unix file names are case specific /EXAMPLE/ATTENTION.NII <> /Example/Attention {$ENDIF} {$ENDIF} end; //nested ReadCmdVal begin {$IFDEF Darwin} //Darwin starts passing a strange paramstr.... //with Darwin, opening a file can interfere with opening by association... exit; //ResliceImg ('/Users/crlab/Documents/example_func.nii.gz','/Users/crlab/Documents/v1x.voi','/Users/crlab/Documents/example_func2standard.mat','/Users/crlab/Documents/z1x.nii.gz'); {$ENDIF} if (ParamCount < 1) then begin ImgForm.OpenTemplateMRU(nil); RefreshImagesTimer.enabled := true; exit; end; lMaximize := false; lRender := false; lMultislice := false; lOverlayNum := 0; I := 1; lStr := ParamStrFilename(I); if lStr <> '' then OpenAndDisplayImg(lStr,True) else begin //no requested image OpenTemplateMRU(nil); I := 1;//exit; end; I := I-1; //ShowMultisliceClick(nil); if I >= ParamCount then exit; gBGIMg.SaveDefaultIni := false; //do not store changes loaded by script repeat lStr := ''; repeat inc(I); if I = 1 then lStr := ParamStr(I) else begin if lStr <> '' then lStr := lStr +' '+ ParamStr(I) else lStr := ParamStr(I); end; if (length(lStr)>1) and (lStr[1] = '-') then begin //special command lCommandChar := UpCase(lStr[2]); case lCommandChar of 'B': begin //background transparency ReadCmdVal; Val(lStr,lSingle,lError); if lError = 0 then gBGImg.BGTransPct := round(lSingle); SetSubmenuWithTag(BGTransPctMenu, gBGImg.BGTransPct); end; 'C': begin //color look up table ReadCmdVal; if (Length(lStr)>1) then begin if lStr[1] = '-' then begin //LUT index number Val(lStr,lSingle,lError); if lError = 0 then lLUT := abs(round(lSingle)) else lLUT := -1; end else begin lStr := ParseFileName(ExtractFileName(lStr)); {$IFDEF UNIX} lStr := UpCase(lStr); {$ENDIF} lLUT := -1; for lInc := 1 to (LUTdrop.Items.Count-1) do if lStr = string(StrUpper(PChar(LUTdrop.Items.Strings[lINc]))) then lLUT := lInc; end; //else text LUTname if lLUT >= 0 then begin gMRIcroOverlay[lOverlayNum].LUTindex := lLUT; LUTdropLoad(lOverlayNum); end; end; //str length > 1 end; 'D': gBGIMg.SaveDefaultIni := true; 'F': gBGImg.ResliceOnLoad := false; //turn off reslicing... loads files flat 'H': begin ReadCmdVal; Val(lStr,lSingle,lError); if lError = 0 then gMRIcroOverlay[lOverlayNum].WindowScaledMax := (lSingle); end; 'L': begin //Low intensity scale ReadCmdVal; Val(lStr,lSingle,lError); if lError = 0 then gMRIcroOverlay[lOverlayNum].WindowScaledMin := (lSingle); end; 'M': begin //multislice lMultislice := true; ReadCmdVal; if (lStr <> '') and (lStr <> '-')and (FileexistsEx(lStr)) and (lOverlayNum < (knMaxOverlay-1)) then gMultiSliceStartupFilename := (lStr); end; //if 'M' 'O': begin//Overlay ReadCmdVal; //Showmessage('o'+lStr); if (lStr <> '') and (FileexistsEx(lStr)) and (lOverlayNum < (knMaxOverlay-1)) then begin //Showmessage('oexists'+lStr); inc(lOverlayNum); OverlayOpenCore (lStr,lOverlayNum); end; end; //if 'O' 'R': begin//Overlay lRender := true;//Render ReadCmdVal; if (lStr <> '') and (lStr <> '-')and (FileexistsEx(lStr)) and (lOverlayNum < (knMaxOverlay-1)) then gRenderStartupFilename := (lStr); end; //if 'R' 'S': begin //smooth ReadCmdVal; Val(lStr,lSingle,lError); if lError = 0 then begin if odd(round(lSingle)) then begin gBGImg.StretchQuality := sqHigh; Menu2DSmooth.checked := true; end else begin gBGImg.StretchQuality := sqLow; Menu2DSmooth.checked := false; end; if lSingle > 1 then gBGIMg.OverlaySmooth := true else gBGIMg.OverlaySmooth := false; OverlaySmoothMenu.Checked := gBGIMg.OverlaySmooth; end;//error=0 end; 'T': begin //overlay transparency ReadCmdVal; Val(lStr,lSingle,lError); if lError = 0 then gBGImg.OverlayTransPct := round(lSingle); SetSubmenuWithTag(OverlayTransPctMenu, gBGImg.OverlayTransPct); end; 'V': begin //open voi ReadCmdVal; if (lStr <> '') and (FileexistsEx(lStr)) then OpenVOICore(lStr); end; 'X': lMaximize := true; //open maximized 'Z': gMRIcroOverlay[lOverlayNum].LUTfromZero := true; end; //case lStr[2] lStr := ''; end; //special command until (I=ParamCount) or (fileexists(lStr)) {or (gAbort)}; until I >= ParamCount; LayerDropSelect(nil); for lInc := 0 to lOverlayNum do RescaleImgIntensity(gBGImg,gMRIcroOverlay[lInc],lINc); RefreshImages; if lMultiSlice then ShowMultisliceClick(nil); if lRender then ShowRenderClick(nil); if lMaximize then begin ImgForm.WindowState := wsMaximized; RefreshImagesTimer.enabled := true; end; end; procedure TImgForm.FlipLRmenuClick(Sender: TObject); var lC: integer; lStr: string; begin (sender as TMenuItem).checked := not (sender as TMenuItem).checked; gBGImg.Mirror := (sender as TMenuItem).checked ; gBGImg.VOImirrored := true; for lC := 0 to knMaxOverlay do if gMRIcroOverlay[lC].ScrnBufferItems > 0 then RescaleImgIntensity(gBGImg,gMRIcroOverlay[lC],lC); RefreshImagesTimer.Enabled := true; if gBGImg.Mirror then lStr := 'radiological [right on left side]' else lStr := 'neurological [left on left side]'; showmessage('Warning: left-right flips can be confusing. From now on, this software will attempt to show NIfTI images in '+lStr+' orientation.'); if MultiSliceForm.Visible then MultiSliceForm.CreateMultiSlice; end; procedure TImgForm.Menu2DSmoothClick(Sender: TObject); begin if Sender <> nil then (sender as TMenuItem).checked := not (sender as TMenuItem).checked; if Menu2DSmooth.checked then gBGImg.StretchQuality := sqHigh else gBGImg.StretchQuality := sqLow; RefreshImagesTimer.Enabled := true; end; procedure TImgForm.VALclick(Sender: TObject); begin //ComputeValFile( (sender as Tmenuitem).tag); end; procedure TImgForm.VOI2NIIClick(Sender: TObject); var lNumberofFiles,lC: integer; lFilename: string; begin CloseImagesClick(nil); if not OpenDialogExecute('VOI Drawings (.VOI)|*.VOI','Select VOI format images to convert',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; ProgressBar1.Min := 0; ProgressBar1.Max :=lNumberofFiles; ProgressBar1.Position := 0; for lC:= 1 to lNumberofFiles do begin lFilename := HdrForm.OpenHdrDlg.Files[lC-1]; OpenAndDisplayImg(lFilename,True); lFilename := changefileextx(lFilename,'.nii'); //SaveAsVOIorNIFTIcore (lFilename, lByteP, lVoxels, 1, gMRIcroOverlay[kBGOverlayNum].NiftiHdr); SaveAsVOIorNIFTIcore (lFilename, gMRIcroOverlay[kBGOverlayNum].ScrnBuffer,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems, 1,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); CloseVOIClick(nil); ProgressBar1.Position := lC; end; ProgressBar1.Position := 0; end;//VOI->NII procedure TImgForm.TtoP1Click(Sender: TObject); var lBufferAligned,lBufferUnAligned: ByteP; l32Buf,l32BufSrc : SingleP; l16BufSrc : SmallIntP; lSlope,lIntercept: single; lMRIcroHdr: TMRIcroHdr; lVolVoxels,lPos: integer; begin //alfa - currently open image lVolVoxels := gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems; if lVolVoxels < 1 then begin showmessage('Please load a background image (''File''/''Open'') before adding an overlay.'); exit; end; GetMem(lBufferUnaligned ,(lVolVoxels *sizeof(single) )+16); //lBufferAligned := ByteP($fffffff0 and (integer(lBufferUnaligned)+15)); lBufferAligned := system.align(lBufferUnaligned, 16); l32Buf := SingleP(lBufferAligned); //next load values case gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP of 4: begin l32BufSrc := SingleP(gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); for lPos := 1 to lVolVoxels do l32Buf^[lPos] := l32BufSrc^[lPos]; end; 2: begin l16BufSrc := SmallIntP(gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); for lPos := 1 to lVolVoxels do l32Buf^[lPos] := l16BufSrc^[lPos]; end; 1: begin for lPos := 1 to lVolVoxels do l32Buf^[lPos] := gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[lPos]; end; else begin showmessage('unknown datatype'); end; end; //next calibrate values lSlope := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.scl_slope; lIntercept := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.scl_inter; if (lSlope=0) or ((lSlope=1) and (lIntercept=0)) then //no slope else begin for lPos := 1 to lVolVoxels do l32Buf^[lPos] := (l32Buf^[lPos] * lSlope)+lIntercept; end; //next - save log10 p values... MakeStatHdr (gMRIcroOverlay[kBGOverlayNum],lMRIcroHdr,0, 255,1{df},0,666,NIFTI_INTENT_LOG10PVAL,inttostr(666) ); for lPos := 1 to lVolVoxels do if l32Buf^[lPos] > 0 then l32Buf^[lPos] := -log(abs(pTdistr(42,l32Buf^[lPos])),10) else l32Buf^[lPos] :=0; SaveAsVOIorNIFTI(lBufferAligned,lVolVoxels,4,1,false,lMRIcroHdr.NiftiHdr,'log10p'+inttostr(666)); //next - free float buffer FreeMem(lBufferUnaligned); end; procedure TImgForm.DesignVALClick(Sender: TObject); begin //SpreadForm.Show; end; procedure TImgForm.Up1Click(Sender: TObject); var lVolVox,lPos,lShift: integer; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then begin showmessage('You must have open a background image in order to apply an intensity filter (use File/Open).'); exit; end; if not IsVOIOpen then begin ShowMessage('You have not created or opened a region of interest.'); exit; end; CreateUndoVol;//create gBGImg.VOIUndoVol Move(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,gBGImg.VOIUndoVol^,gBGImg.VOIUndoVolItems); lVolVox := gBGImg.ScrnDim[1]* gBGImg.ScrnDim[2]*gBGImg.ScrnDim[3]; case (Sender as TMenuItem).tag of 0: lShift := 1; 1: lShift := -1; 2: lShift := gBGImg.ScrnDim[1]; 3: lShift := -gBGImg.ScrnDim[1]; 4: lShift := gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]; 5: lShift := -gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]; end; if lShift > 0 then begin for lPos := 1 to (lVolVox-lShift) do gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer[lPos] := gBGImg.VOIUndoVol[lPos+lShift]; end else begin for lPos := (1+abs(lShift)) to lVolVox do gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer[lPos] := gBGImg.VOIUndoVol[lPos+lShift]; end; gBGImg.VOIchanged := true; ImgForm.ProgressBar1.Position := 0; ImgForm.RefreshImagesTimer.Enabled := true; end; procedure TImgForm.FormDestroy(Sender: TObject); begin {$IFDEF Darwin} FormClose(nil); //OSX does not send a FormClose Event if you choose the Application/Quit option {$ENDIF} CloseShareMem; end; procedure TImgForm.YokeMenuClick(Sender: TObject); begin (sender as TMenuItem).checked := not (sender as TMenuItem).checked; gYoke := (sender as TMenuItem).checked ; if gYoke then CreateShareMem else CloseShareMem; end; procedure TImgForm.About1Click(Sender: TObject); begin AboutForm.ThreadLabel.Caption := ' '+inttostr(gnCPUThreads)+' threads'+' '+ininame; AboutForm.Showmodal; end; procedure TImgForm.LayerDropChange(Sender: TObject); begin {$IFDEF LCLgtk2} LayerDropSelect(nil); {$ENDIF} end; procedure TImgForm.LUTdropChange(Sender: TObject); begin {$IFDEF LCLgtk2} LutDropSelect(nil); {$ENDIF} end; procedure TImgForm.AdjustimagessoVOIintensityiszero1Click(Sender: TObject); begin BatchChangeInterceptSoVOIEqualsZero; end; procedure TImgForm.MirrorNII1Click(Sender: TObject); var lNumberofFiles,lC: integer; lFilename: string; begin Showmessage('WARNING: This will flip the images in the Left-Right dimension: this has serious consequences'); CloseImagesClick(nil); if not OpenDialogExecute(kImgFilter,'Select NIfTI format images to convert',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; ProgressBar1.Min := 0; ProgressBar1.Max :=lNumberofFiles; ProgressBar1.Position := 0; for lC:= 1 to lNumberofFiles do begin lFilename := HdrForm.OpenHdrDlg.Files[lC-1]; ImgForm.OpenAndDisplayImg(lFilename,True); lFilename := changefileextX(lFilename,'lr.nii.gz'); //zap //showmessage(lFilename); if MirrorImgBuffer (gMRIcroOverlay[kBGOverlayNum] ) then begin //showmessage(lFilename); SaveAsVOIorNIFTIcore (lFilename, gMRIcroOverlay[kBGOverlayNum].ImgBuffer,gMRIcroOverlay[kBGOverlayNum].ImgBufferItems,gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); end; CloseVOIClick(nil); ProgressBar1.Position := lC; end; ProgressBar1.Position := 0; end; procedure TImgForm.ZoomDropChange(Sender: TObject); begin {$IFDEF LCLgtk2} ZoomDropSelect(nil); {$ENDIF} end; procedure TImgForm.ResizeControlPanel (lRows: integer); begin if lRows = 2 then begin ControlPanel.Tag := 2; LayerPanel.Top := 36; LayerPanel.Left := 1; ControlPanel.Height := 72; HideROIBtn.left := 307; XBarBtn.Left := 307+29; ToolPanel.Left := 307+61; end else begin ControlPanel.Tag := 1; LayerPanel.Top := 1; LayerPanel.Left := 307; HideROIBtn.left := 809; XBarBtn.Left := 809+29; ToolPanel.Left := 809+61; ControlPanel.Height := 40; end; end; procedure TImgForm.ControlPanelDblClick(Sender: TObject); begin if ControlPanel.Tag = 1 then ResizeControlPanel(2) else ResizeControlPanel(1); ImgForm.RefreshImagesTimer.enabled := true; end; procedure TImgForm.DefaultControlPanel; begin if gBGImg.SingleRow then begin ResizeControlPanel(1); ImgForm.Width := 1025; ImgForm.Height := 469; end else begin ResizeControlPanel(2); ImgForm.Width := 524; ImgForm.Height := 640; end; end; {$IFDEF FPC} initialization {$I nifti_img_view.lrs} {$ENDIF} for gMouseDownY := 0 to knMaxOverlay do gMRIcroOverlay[gMouseDownY].index := gMouseDownY; //RGB end. mricron-0.20120505.1~dfsg.1.orig/nifti_img_view.lrs0000664000175000017500000024476611660465464021430 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TImgForm','FORMDATA',[ 'TPF0'#8'TImgForm'#7'ImgForm'#4'Left'#3'c'#3#6'Height'#3#213#1#3'Top'#3#208#0 +#5'Width'#3#1#4#13'ActiveControl'#7#12'ControlPanel'#14'AllowDropFiles'#9#7 +'Caption'#6#7'MRIcroN'#12'ClientHeight'#3#213#1#11'ClientWidth'#3#1#4#8'Dock' +'Site'#9#9'Font.Name'#6#13'MS Sans Serif'#4'Menu'#7#9'MainMenu1'#7'OnClose'#7 +#9'FormClose'#8'OnCreate'#7#10'FormCreate'#9'OnDestroy'#7#11'FormDestroy'#11 +'OnDropFiles'#7#13'FormDropFiles'#9'OnKeyDown'#7#11'FormKeyDown'#10'OnKeyPre' +'ss'#7#12'FormKeyPress'#8'OnResize'#7#10'FormResize'#6'OnShow'#7#8'FormShow' +#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#8'0.9.30.2'#0#6'TPanel'#12 +'ControlPanel'#4'Left'#2#0#6'Height'#2'('#3'Top'#2#0#5'Width'#3#1#4#5'Align' +#7#5'alTop'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'('#11'ClientWidth' +#3#1#4#11'ParentColor'#8#14'ParentShowHint'#8#8'ShowHint'#9#8'TabOrder'#2#0 +#10'OnDblClick'#7#20'ControlPanelDblClick'#0#6'TLabel'#6'LabelX'#4'Left'#2#6 +#6'Height'#2#18#3'Top'#2#12#5'Width'#2#9#7'Caption'#6#1'X'#11'ParentColor'#8 +#0#0#6'TLabel'#6'LabelY'#4'Left'#2'Q'#6'Height'#2#18#3'Top'#2#12#5'Width'#2#9 +#7'Caption'#6#1'Y'#11'ParentColor'#8#0#0#6'TLabel'#6'LabelZ'#4'Left'#3#153#0 +#6'Height'#2#18#3'Top'#2#12#5'Width'#2#8#7'Caption'#6#1'Z'#11'ParentColor'#8 +#0#0#12'TSpeedButton'#10'HideROIBtn'#4'Left'#3'('#3#6'Height'#2#30#4'Hint'#6 +#30'Briefly hide VOIs and Overlays'#3'Top'#2#4#5'Width'#2#30#10'Glyph.Data' +#10':'#6#0#0'6'#6#0#0'BM6'#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#24#0#0#0 +#1#0' '#0#0#0#0#0#0#6#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255 +#255#255#0#255#255#255#0#198#28#29'%'#192#0#0#127#140'EE'#188#183#11#11#203 +#191#1#1#232#192#0#0#246#192#0#0#219#192#0#0#189#192#0#0#160#192#0#0#130#192 +#0#0'c'#192#0#0'$'#255#255#255#0#255#255#255#0#214']_<'#207'AB'#196#200'%%' +#255#141'LL'#255'G'#160#160#255'B'#168#168#255#152'55'#255#192#0#0#255#192#0 +#0#255#192#0#0#255#192#0#0#255#154'33'#255#192#0#0#255#192#0#0#255#192#0#0 +#197#222#130#132#134#216'fg'#253#209'JK'#255#202'-.'#255#171'00'#255'0'#191 +#191#255'0'#191#191#255#133'OO'#255#192#0#0#255#192#0#0#255#191#1#1#255'~XX' +#255'>'#173#173#255'Q'#148#148#255#175#22#22#255#192#0#0#149#224#138#141#187 +#218'np'#255#211'RS'#255#204'56'#255#171'9:'#255#140'FF'#255'z^^'#255#191#1#1 +#255#192#0#0#255#192#0#0#255#192#0#0#255#133'OO'#255'0'#191#191#255'7'#182 +#182#255#166'""'#255#192#0#0'>'#226#147#149'W'#219'wx'#255#213'Z\'#255#206'>' +'?'#255#182'66'#255#193#5#5#255#187#7#7#255#192#0#0#255#192#0#0#255#192#0#0 +#255#178#18#18#255#151'77'#255'oll'#255#147'<<'#255#186#8#8#229#192#0#0#1#228 +#155#158#7#221#127#129#236#210'gh'#255#162'op'#255'K'#176#176#255'too'#255 +#184#10#10#255#192#0#0#255#187#6#6#255#163''''''#255'N'#151#151#255'~WW'#255 +#184#11#11#255#189#4#4#255#192#0#0#143#255#255#255#0#255#255#255#0#223#135 +#137#144#217'kl'#255'r'#159#160#255'3'#204#204#255'I'#169#169#255#189#4#4#255 +#192#0#0#255#192#0#0#255'_'#129#129#255'0'#191#191#255'L'#154#154#255#191#1#1 +#255#192#0#0#255#192#0#0'8'#255#255#255#0#255#255#255#0#225#144#146','#219's' +'u'#255#136#147#148#255'T'#175#175#255#133'ij'#255#175#24#24#255#192#0#0#255 +#192#0#0#255'rhh'#255'E'#163#163#255'waa'#255#175#22#22#255#192#0#0#224#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#221'{}'#201#214'_a'#255 +#185'WX'#255#200'(('#255#194#10#10#255#192#0#0#255#192#0#0#255#192#0#0#255 +#166'""'#255#191#1#1#255#192#0#0#255#192#0#0#137#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#223#132#134'e'#172#135#136#255#209'KM'#255#203 +'/0'#255#196#19#19#255#192#0#0#255#192#0#0#255#168' '#255#192#0#0#255#192#0 +#0#255#192#0#0#255#192#0#0'2'#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#225#140#142#13'L'#205#206#251'b'#175#176#255#199'<='#255#198#27#27 +#255#192#0#0#255#148'::'#255'N'#151#151#255'c||'#255#166'""'#255#192#0#0#218 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0'Z'#200#200#204'M'#196#197#255#196'JK'#255#200'#$'#255#193#7#7#255 +#142'CC'#255'0'#191#191#255'3'#187#187#255#172#26#26#255#192#0#0#131#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +'Z'#204#205'k'#187'xz'#255#203'MN'#255#202',,'#255#195#15#15#255#144'@@'#255 +'c{{'#255'rgg'#255#169#30#30#255#192#0#0','#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#255#255#3#217'ln'#214 +#210'PR'#255#201'78'#255#197#24#24#255#192#0#0#255#189#4#4#255#180#16#16#255 +#192#0#0#212#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#219'uwr'#212'YZ'#255#149'rs' +#255#148'YY'#255#166'%%'#255#192#0#0#255#192#0#0#255#192#0#0'}'#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#221'}'#127#21#159#137#138#251'7'#205#206#255'2'#201 +#201#255#154'>>'#255#192#0#0#255#192#0#0#255#192#0#0'&'#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 ,#255#255#255#0#255#255#255#0#176#133#135#182'B'#199#199#255'B'#188#188#255 +#131'bc'#255#192#0#0#255#192#0#0#206#255#255#255#0#255#255#255#0#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#206'z{J'#209'XZ'#255#154'kk'#255#198#29#29#255#192#0 +#0#255#192#0#0'w'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#220'z|'#2#214']_'#225#207'AB'#255#182'9:'#255#194#9#9#255#192#0#0'!' +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#216'fg'#128#170'kl'#255'Z'#161#162#255#132'^^'#215#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#218'np'#31#159'|}'#253'3'#205#205#255'h'#134#135#154#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#148#141#142#202'h'#158#158#254#138'gg'''#255#255#255#0#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#215'cdU'#208'FH'#194#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#217'k' +'m'#6#210'OPW'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#9'NumGlyphs'#2#0#11'OnMouseDown'#7#19 +'HideROIBtnMouseDown'#9'OnMouseUp'#7#17'HideROIBtnMouseUp'#0#0#12'TSpeedButt' +'on'#7'XBarBtn'#4'Left'#3'F'#3#6'Height'#2#30#4'Hint'#6#190'Toggle Crosshair' +'s'#13#10'right-click to change gap size'#13#10'right+ctrl click to change c' +'olor'#13#10'right+alt click to change thickness'#13#10'right+shift to repos' +'ition origin'#13#10'right+ctrl+alt to adjust font size'#3'Top'#2#4#5'Width' +#2#30#10'AllowAllUp'#9#10'Glyph.Data'#10#218#8#0#0#214#8#0#0'BM'#214#8#0#0#0 +#0#0#0'6'#0#0#0'('#0#0#0#23#0#0#0#24#0#0#0#1#0' '#0#0#0#0#0#160#8#0#0'd'#0#0 +#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#192#0#0'9'#192#0#0'4'#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#0#0#255#20#0#0#255'P'#0#0#255#10#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#192#0#0#184#192#0#0#168#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'@'#0#0#255#255#0#0 +#255' '#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#192#0#0#184#192#0#0#168#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'@'#0#0#255 +#255#0#0#255' '#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#192#0#0#184#192#0#0#168#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'@' +#0#0#255#255#0#0#255' '#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#192#0#0#184#192#0#0#168 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255'@'#0#0#255#255#0#0#255' '#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#25 +#0#0#255'P'#0#0#255'P'#0#0#255'P'#0#0#255'Pv'#0'c'#206'q'#0'h'#195#0#0#255'P' +#0#0#255'P'#0#0#255'P'#0#0#255'P'#0#0#255'P'#0#0#255'|'#0#0#255#255#0#0#255 +'f'#0#0#255'P'#0#0#255'P'#0#0#255'P'#0#0#255'P'#0#0#255'P'#0#0#255'P'#0#0#255 +'P'#0#0#255#25#0#0#255'P'#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255'P'#0#0#255#5#0#0#255 +#16#0#0#255#16#0#0#255#16#0#0#255#16#176#0#22#188#174#0#24#173#0#0#255#16#0#0 +#255#16#0#0#255#16#0#0#255#16#0#0#255#16#0#0#255'L'#0#0#255#255#0#0#255'.'#0 +#0#255#16#0#0#255#16#0#0#255#16#0#0#255#16#0#0#255#16#0#0#255#16#0#0#255#16#0 +#0#255#5#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 +#0#192#0#0#184#192#0#0#168#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#0#0#255'@'#0#0#255#255#0#0#255' '#255#255#255#0#255#255 ,#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#192#0#0#184#192#0#0#168#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#0#0#255'@'#0#0#255#255#0#0#255' '#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#192#0#0#184#192#0#0#168#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#0#0#255'@'#0#0#255#255#0#0#255' '#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#192#0#0#184#192#0#0#168#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'@'#0#0#255#255#0#0 +#255' '#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#192#0#0#184#192#0#0#168#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'@'#0#0#255 +#255#0#0#255' '#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#192#0#0#184#192#0#0#168#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'@' +#0#0#255#255#0#0#255' '#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#192#0#0#184#192#0#0#168 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255'@'#0#0#255#255#0#0#255' '#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#192#0#0'M' +#192#0#0#248#192#0#0#248#192#0#0#248#192#0#0#248#192#0#0#253#192#0#0#253#192 +#0#0#248#192#0#0#248#192#0#0#248#192#0#0#248#192#0#0#248#143#0'A'#250#0#0#255 +#255#167#0'!'#249#192#0#0#248#192#0#0#248#192#0#0#248#192#0#0#248#192#0#0#248 +#192#0#0#248#192#0#0#248#192#0#0'M'#192#0#0' '#192#0#0'h'#192#0#0'h'#192#0#0 +'h'#192#0#0'h'#192#0#0#213#192#0#0#203#192#0#0'h'#192#0#0'h'#192#0#0'h'#192#0 +#0'h'#192#0#0'hi'#0's'#142#0#0#255#255#142#0'B{'#192#0#0'h'#192#0#0'h'#192#0 +#0'h'#192#0#0'h'#192#0#0'h'#192#0#0'h'#192#0#0'h'#192#0#0' '#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#192#0#0#184#192#0#0 +#168#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0 +#0#255'@'#0#0#255#255#0#0#255' '#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#192#0#0 +#184#192#0#0#168#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#0#0#255'@'#0#0#255#255#0#0#255' '#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#192#0#0#184#192#0#0#168#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#0#0#255'@'#0#0#255#255#0#0#255' '#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#192#0#0#184#192#0#0#168#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#0#0#255'@'#0#0#255#255#0#0#255' '#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#192#0#0#184#192#0#0#168#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#0#0#255'@'#0#0#255#255#0#0#255' '#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#192#0#0#184#192#0#0#168#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'@'#0#0#255#255#0#0 +#255' '#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#192#0#0'9'#192#0#0'4'#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#20#0#0#255 +'P'#0#0#255#10#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#10'GroupIndex'#3'A'#1#9 +'NumGlyphs'#2#0#7'OnClick'#7#12'XBarBtnClick'#11'OnMouseDown'#7#16'XBarBtnMo' +'useDown'#8'ShowHint'#9#14'ParentShowHint'#8#0#0#6'TPanel'#10'LayerPanel'#4 ,'Left'#3'0'#1#6'Height'#2'$'#3'Top'#2#2#5'Width'#3#244#1#12'ClientHeight'#2 +'$'#11'ClientWidth'#3#244#1#8'TabOrder'#2#5#0#12'TSpeedButton'#15'AutoContra' +'stBtn'#4'Left'#2'y'#6'Height'#2#28#4'Hint'#6#12'Autocontrast'#3'Top'#2#3#5 +'Width'#2#28#10'Glyph.Data'#10#218#8#0#0#214#8#0#0'BM'#214#8#0#0#0#0#0#0'6'#0 +#0#0'('#0#0#0#24#0#0#0#23#0#0#0#1#0' '#0#0#0#0#0#160#8#0#0'd'#0#0#0'd'#0#0#0 +#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#0#0#0'"'#25#25#25'c...'#165'???'#194 +'RRR'#215'OOO'#213'<<<'#192'---'#159#17#17#17'_'#0#0#0#26#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#0#0#0#12'...'#168'www'#232#198#198#198#254#244#244#244#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#240#240#240#255#24#24#24#255 +'100'#242'*(('#157#0#0#0#5#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +'###SEEE'#218#220#220#220#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#27#22#22#255#26#16#16#255''''#26#26#255'2(('#234'#'#30#30';'#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0'000'#158#150#150#150#240#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#250#250#255', '#255'/'#28#28#255':##'#255 +'>%%'#255'ZEE'#248'@66'#133#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0'$$$Y'#144#144#144#240#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#254#254#255#255#245#245#255':(('#255 +'B(('#255'Q11'#255'W44'#255'O//'#255'Y@@'#248'+'#31#31'='#255#255#255#0#255 +#255#255#0#255#255#255#0#0#0#0#22'JJJ'#223#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#252#252#255#255#243 +#243#255'B--'#255'N//'#255'd<<'#255'pCC'#255'a::'#255'K--'#255'H66'#232#17#10 +#10#10#255#255#255#0#255#255#255#0'000'#194#232#232#232#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#251#250#250 +#255#253#253#253#255#255#255#255#255#255#255#255#255#255#255#255#255#255#252 +#252#255#255#242#242#255'C--'#255'O//'#255'f=='#255'uFF'#255'c;;'#255'L..' +#255'B..'#255':11'#174#255#255#255#0#0#0#0'-'#139#139#139#238#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#243#240#239 +#255#130'hh'#255#244#242#242#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#254#254#255#255#245#245#255'<))'#255'E))'#255'U33'#255'\77'#255'S22' +#255'B(('#255'-'#27#27#255'<33'#242#0#0#0#9'!!!r'#207#207#207#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#232#223#223#255#131'^]' +#255'c>>'#255#244#242#242#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#249#249#255'/!!'#255'3'#31#31#255'?&&'#255'C(('#255'=%%' +#255'0'#29#29#255#31#19#19#255' '#28#28#254#3#3#3'<111'#177#251#251#251#255 +#255#255#255#255#255#255#255#255#255#255#255#255#222#204#203#255#141']\'#255 +'zML'#255'kCB'#255'tWV'#255'hQP'#255'\HH'#255'O@@'#255'C88'#255'600'#255#21 +#13#13#255#30#18#18#255''''#23#23#255')'#25#25#255'&'#23#23#255#28#17#17#255 +#14#8#8#255#2#2#2#255'%%%'#138'EEE'#202#255#255#255#255#255#255#255#255#255 +#254#254#255#215#183#182#255#159'ed'#255#144'[Z'#255#129'RP'#255'sHG'#255'd?' +'>'#255'U55'#255'F,+'#255'7#"'#255'('#25#25#255#26#16#16#255#11#7#7#255#7#4#4 +#255#14#8#8#255#16#10#10#255#13#8#8#255#5#3#3#255#0#0#0#255#0#0#0#255'''''''' +#199'TTT'#219#255#255#255#255#255#255#255#255#227#192#191#255#182'sq'#255#167 +'ih'#255#152'`^'#255#137'VU'#255'zML'#255'kDC'#255']:9'#255'N10'#255'?(''' +#255'0'#30#30#255'!'#21#21#255#19#12#11#255#4#2#2#255#0#0#0#255#0#0#0#255#0#0 +#0#255#0#0#0#255#0#0#0#255#0#0#0#255'+++'#219'EEE'#202#255#255#255#255#255 +#255#255#255#254#252#251#255#212#166#166#255#175'nm'#255#160'ec'#255#145'[Z' +#255#130'RQ'#255'sIH'#255'd?>'#255'V65'#255'G-,'#255'8##'#255')'#26#25#255#26 +#16#16#255#12#7#7#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0 +#255''''''''#199'111'#177#251#251#251#255#255#255#255#255#255#255#255#255#255 +#254#254#255#218#184#183#255#167'jh'#255#153'`_'#255#138'WV'#255'{ML'#255'lD' +'C'#255'];:'#255'O21'#255'@(('#255'1'#31#30#255'"'#21#21#255#19#12#12#255#4#3 +#3#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#2#2#2#255'%%%'#137'!!!r'#207 +#207#207#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#226#202#202#255#162'ih'#255#146'\Z'#255#225#214#213#255#246#244#244#255#245 +#243#243#255#244#242#242#255#244#242#242#255#243#241#241#255'6'''''#255#27#17 ,#17#255#12#8#7#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#22#22#22#254#3#3#3 +'<'#0#0#0'-'#139#139#139#238#255#255#255#255#255#254#254#255#255#254#254#255 +#255#254#254#255#255#255#255#255#234#219#219#255#161'mk'#255#233#223#223#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255'>,,'#255'#'#22#21#255#20#12#12#255#5#3#3#255#0#0#0#255#0#0#0#255#0#0#0 +#255'***'#241#0#0#0#9#255#255#255#0':55'#196#234#226#226#255#255#247#247#255 +#255#247#247#255#255#248#248#255#255#248#248#255#255#248#248#255#243#229#229 +#255#243#237#237#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255#255#255#255'E11'#255'+'#27#26#255#28#17#17#255#13#8#8#255#0#0#0 +#255#0#0#0#255#19#19#19#255''''''''#169#255#255#255#0#255#255#255#0'('#24#24 +#26'dVV'#227#255#241#241#255#255#241#241#255#255#241#241#255#255#242#242#255 +#255#242#242#255#255#242#242#255#255#243#243#255#255#248#248#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255'L65'#255'2 '#31#255'%' +#22#22#255#28#17#17#255#19#12#12#255#17#10#10#255'+&&'#229#0#0#0#9#255#255 +#255#0#255#255#255#0#255#255#255#0'O;;f'#166#146#146#243#255#235#235#255#255 +#235#235#255#255#236#236#255#255#236#236#255#255#236#236#255#255#237#237#255 +#255#237#237#255#255#240#240#255#255#251#251#255#255#252#252#255#255#251#251 +#255'`A@'#255'P21'#255'L//'#255'A(('#255'3'#31#31#255'B44'#247#24#20#20'9' +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'YEE' +#171#177#151#151#244#255#229#229#255#255#230#230#255#255#230#230#255#255#230 +#230#255#255#231#231#255#255#231#231#255#255#231#231#255#255#231#231#255#255 +#231#231#255#255#231#231#255#128'SS'#255'lBB'#255'`;;'#255'T43'#255'eMM'#248 +':22'#131#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 +#0#255#255#255#0#255#255#255#0'cFFh'#132'aa'#229#230#200#200#255#255#224#224 +#255#255#224#224#255#255#224#224#255#255#225#225#255#255#225#225#255#255#225 +#225#255#255#225#225#255#255#225#225#255#143'\\'#255'~MM'#255'vKJ'#255'cEE' +#236'3((?'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#154']]'#29'qP' +'P'#189#170#132#132#240#218#182#182#254#248#211#211#255#255#219#219#255#255 +#219#219#255#255#219#219#255#255#219#219#255#245#210#210#255#160'ii'#255#144 +'ee'#245'aFF'#170'@'''''#7#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0'D)),uMM'#131'|VV'#190#140'cc'#215 +#157'qq'#231#152'nn'#229#134'__'#212'wSS'#183'[<>'#238'{{'#223#203#203#204#0#255#0 +#145#145#145'PPP'#1#1#1#0#0#0#27#27#27#0#255#0#0#255#0#0#255#0#0#255#0#0#255 +#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0 +#203#203#204'{{'#223';;'#239#194#194#205#0#255#0#187#187#187':::'#10#10#10#0 +#0#0#24#24#24#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0 +#0#255#0#0#255#0#0#255#0#0#255#0#203#203#204#182#182#209'll'#227'SS'#233#169 +#169#212#0#255#0#0#255#0#202#202#202'222'#23#23#23#0#0#0#16#16#16#203#203#203 +#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#203 +#203#204#174#174#211'ii'#228'bb'#229#159#159#214#202#202#204#0#255#0#0#255#0 +#0#255#0#0#255#0'KKK'#21#21#21#0#0#0#11#11#11#198#198#198#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0#202#202#204#160#160#214'nn'#226'zz' +#223#181#181#209#203#203#204#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0 +#133#133#133#2#2#2#0#0#0#5#5#5#187#187#187#0#255#0#0#255#0#0#255#0#0#255#0#0 +#255#0#0#255#0#196#196#205#149#149#216#165#165#213#200#200#204#0#255#0#0#255 +#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#191#191#191#8#8#8 +#0#0#0#0#0#0#163#163#163#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#203 +#203#204#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0'JJJ'#0#0#0#0#0#0#132#132#132#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255 +#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0 +#166#166#166#3#3#3#0#0#0'eee'#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0 +#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0'AAA'#0#0#0'FFF'#0#255#0#0#255 +#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255 +#0#170#170#170#5#5#5'%%%'#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255 +#0#0#255#0#10'GroupIndex'#2','#9'NumGlyphs'#2#0#7'OnClick'#7#11'PenBtnClick' +#0#0#12'TSpeedButton'#12'ClosedPenBtn'#4'Left'#2#30#6'Height'#2#30#4'Hint'#6 +#13'Autoclose Pen'#3'Top'#2#0#5'Width'#2#30#10'AllowAllUp'#9#10'Glyph.Data' +#10#250#6#0#0#246#6#0#0'BM'#246#6#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#24#0 +#0#0#1#0#24#0#0#0#0#0#192#6#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#255 +#0#0#255#0#0#255#0#201#201#204#186#186#208#177#177#210#176#176#210#180#180 +#209#188#188#207#198#198#205#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0 +#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#202 +#202#204#164#164#213'{{'#223'44'#241'33'#242'33'#242'33'#241'55'#241'77'#240 +'CC'#237'VV'#233'oo'#226#139#139#219#173#173#211#200#200#204#0#255#0#0#255#0 +#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#160#160#214'//'#243#23#23 +#248#151#151#216'::'#240'33'#242'33'#242'33'#242'33'#242'33'#242'33'#242'33' +#242'33'#242'33'#242'33'#241'AA'#238'uu'#224#184#184#208#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#171#171#211'bb'#251'LL'#255#20#20#249#199#199#204#194 +#194#206#175#175#211#161#161#214#154#154#216#148#148#217#140#140#219#130#130 ,#222'xx'#224'mm'#227'\\'#231'BB'#238'33'#241'33'#242'=='#238#186#186#207#0 +#255#0#0#255#0#0#255#0#0#255#0#127#127#227#179#179#255'<<'#255#0#0#254#148 +#148#217#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0 +#255#0#0#255#0#201#201#204#142#142#218'33'#242'33'#242#165#165#213#0#255#0#0 +#255#0#0#255#0#0#255#0#159#159#219#152#152#255'55'#255#0#0#255'??'#238#0#255 +#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0 +#203#203#204'``'#229'33'#242'SS'#233#201#201#204#0#255#0#0#255#0#0#255#0#0 +#255#0#202#202#204'vv'#228#26#26#251'..'#242#168#168#212#0#255#0#0#255#0#255 +#0#0#255#0#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#154#154#215'33' +#241'<<'#239#181#181#209#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#204#204#204 +#169#169#169';;C[[]'#185#185#185#0#255#0#255#0#0#255#0#0#255#0#0#255#0#0#0 +#255#0#0#255#0#0#255#0#0#255#0#202#202#204'MM'#234'44'#241#153#153#216#0#255 +#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#204#204#204'@@@'#14#14#14#0#0#0#28 +#28#28#180#180#180#255#0#0#255#0#0#255#0#0#255#0#0#0#255#0#0#255#0#0#255#0#0 +#255#0#184#184#208'44'#241'\\'#231#203#203#204#0#255#0#0#255#0#0#255#0#0#255 +#0#0#255#0#0#255#0#203#203#203'DDDPPP'#0#0#0#0#0#0'bbb'#0#255#0#255#0#0#255#0 +#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#197#197#205'GG'#236'JJ'#235#188 +#188#207#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#203#203#203'FFF___' +#0#0#0#0#0#0'???'#0#255#0#0#255#0#0#255#0#0#255#0#255#0#0#255#0#0#0#255#0#0 +#255#0#0#255#0#177#177#210'II'#235'AA'#237#151#151#216#203#203#204#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0'IIIeee'#0#0#0#0#0#0'000'#0#255#0#0#255#0#0#255 +#0#255#0#0#255#0#0#255#0#0#255#0#0#0#255#0#0#255#0#0#255#0#196#196#205'zz' +#223'77'#240']]'#231#181#181#209#0#255#0#0#255#0#0#255#0#0#255#0'PPPiii'#0#0 +#0#0#0#0'$$$'#0#255#0#0#255#0#0#255#0#255#0#0#255#0#0#255#0#0#255#0#0#0#255#0 +#0#255#0#0#255#0#0#255#0#203#203#204#178#178#210'[['#231'::'#239#139#139#219 +#202#202#204#0#255#0#0#255#0'iii[[['#0#0#0#0#0#0#29#29#29#0#255#0#0#255#0#0 +#255#0#0#255#0#255#0#0#255#0#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255 +#0#0#255#0#202#202#204#151#151#216'>>'#238'{{'#223#203#203#204#0#255#0#145 +#145#145'PPP'#1#1#1#0#0#0#27#27#27#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0 +#255#0#0#255#0#255#0#0#255#0#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#203 +#203#204'{{'#223';;'#239#194#194#205#0#255#0#187#187#187':::'#10#10#10#0#0#0 +#24#24#24#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#255#0#0#255#0#0#255 +#0#0#255#0#0#0#255#0#0#255#0#203#203#204#182#182#209'll'#227'SS'#233#169#169 +#212#0#255#0#0#255#0#202#202#202'222'#23#23#23#0#0#0#16#16#16#203#203#203#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0#255#0#0#255#0#0#255#0#0#255#0#0#203 +#203#204#174#174#211'ii'#228'bb'#229#159#159#214#202#202#204#0#255#0#0#255#0 +#0#255#0#0#255#0'KKK'#21#21#21#0#0#0#11#11#11#198#198#198#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#255#0#0#255#0#0#160#160#214'nn'#226'zz'#223 +#181#181#209#203#203#204#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#133 +#133#133#2#2#2#0#0#0#5#5#5#187#187#187#0#255#0#0#255#0#0#255#0#0#255#0#0#255 +#0#0#255#0#196#196#205#149#149#216#165#165#213#200#200#204#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#191#191#191#8#8#8#0#0 +#0#0#0#0#163#163#163#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#203#203 +#204#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0 +#0#255#0#0#255#0#0#255#0#0#255#0'JJJ'#0#0#0#0#0#0#132#132#132#0#255#0#0#255#0 +#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#166 +#166#166#3#3#3#0#0#0'eee'#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255 +#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0'AAA'#0#0#0'FFF'#0#255#0#0#255#0#0 +#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255 +#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0 +#170#170#170#5#5#5'%%%'#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255 +#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0#255#0#0 +#255#0#10'GroupIndex'#2','#9'NumGlyphs'#2#0#7'OnClick'#7#11'PenBtnClick'#0#0 +#12'TSpeedButton'#7'FillBtn'#4'Left'#2'<'#6'Height'#2#30#4'Hint'#6#9'Fill to' +'ol'#3'Top'#2#0#5'Width'#2#30#10'AllowAllUp'#9#10'Glyph.Data'#10#218#8#0#0 +#214#8#0#0'BM'#214#8#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#23#0#0#0#24#0#0#0#1#0' '#0 +#0#0#0#0#160#8#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255 +#255#0#255#255#255#0#0#0#255#8#0#0#255'O'#0#0#255'z'#0#0#255#147#0#0#255#171 +#0#0#255#196#0#0#255#221#0#0#255#245#0#0#255#239#0#0#255#211#0#0#255#184#0#0 +#255#156#0#0#255#129#0#0#255'T'#0#0#255#3#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#0#0#255#4#0#0#255'H'#0#0#255#160#0#0#255 +#241#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 ,#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#221#0#0#255'$'#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#0#0#255#156#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#142#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255 +#212#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#254#0#0#255'@'#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'A'#0#0#255#248#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#237#0#0#255#182#0#0#255'6'#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'0'#0#0#255#214#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#252#0#0#255#227#0#0#255#209#0#0#255#191#0#0 +#255#173#0#0#255#155#0#0#255'}'#0#0#255'N'#0#0#255#30'T'#0#0#25'\'#9#9']T'#0 +#0#7#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#0#0#255#16#0#0#255#215#0#0#255'O'#0#0#255')'#0#0 +#255#6#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0'e'#18#18'jv%%'#228#180'mn'#248'r##'#225'h'#24#24 +#140'T'#0#0#3#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#0#0#255'f'#0#0#255#171#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'T'#0#0#28 +'i'#23#23#198#172'_`'#241#251#187#189#255#253#195#197#255#253#201#203#255#190 +#130#131#245'h'#25#25#195'T'#0#0#13#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#0#0#255#207#0#0#255#130#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'f'#18#18'ox%%' +#229#228#154#155#255#253#187#189#255#253#193#195#255#253#199#201#255#252#205 +#207#255#252#211#213#255#217#171#173#252'h'#27#27#203'T'#0#0#3#255#255#255#0 +#255#255#255#0#0#0#255'%'#0#0#255#255#0#0#255'Y'#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0'T'#0#0#30'j'#21#22#201#176'^^'#242 +#252#178#179#255#253#185#186#255#253#191#192#255#253#197#199#255#252#203#205 +#255#252#209#211#255#252#215#217#255#252#221#223#255#189#142#144#245'f'#25#26 +#143#255#255#255#0#255#255#255#0#0#0#255'z'#0#0#255#255#0#0#255'9'#255#255 +#255#0#255#255#255#0#255#255#255#0'T'#0#0#1'f'#17#17'tz%%'#229#231#148#148 +#255#254#177#178#255#253#183#184#255#253#189#190#255#253#195#196#255#253#201 +#203#255#252#207#209#255#252#212#215#255#252#218#221#255#252#224#227#255#251 +#230#233#255#128'>?'#232'T'#0#0'#'#255#255#255#0#0#0#255#167#0#0#255#255#0#0 +#255'P'#255#255#255#0#255#255#255#0'T'#0#0'!j'#20#20#203#180'\\'#243#253#168 +#169#255#254#175#176#255#253#181#182#255#253#187#188#255#253#193#194#255#253 +#198#200#255#252#204#206#255#252#210#213#255#252#216#219#255#252#222#225#255 +#251#228#231#255#251#234#237#255#215#188#191#255'h'#30#30#156#255#255#255#0#0 +#0#255#153#0#0#255#255#0#0#255#130'T'#0#0#1'g'#17#17'x|$$'#230#233#141#141 +#255#254#167#167#255#254#173#173#255#253#179#180#255#253#184#186#255#253#190 +#192#255#253#196#198#255#252#202#204#255#252#208#210#255#252#214#217#255#252 +#220#223#255#252#226#229#255#251#232#235#255#251#238#241#255#251#244#247#255 +'i '#228#255#255#255#0#0#0#255')'#0#0#255#244#0#0#254#241'G'#20'd'#230'r''2' +#252#223#130#130#255#254#165#165#255#254#170#171#255#254#176#177#255#253#182 +#184#255#253#188#190#255#253#194#196#255#253#200#202#255#252#206#208#255#252 +#212#214#255#252#218#221#255#252#224#227#255#251#230#233#255#251#236#239#255 +#251#241#245#255#175#134#136#243'f'#27#27#134#255#255#255#0#255#255#255#0#0#0 +#255#22#13#0#217#155'5%'#205#249'C?'#243#255'E+'#185#255#129':H'#255#215#135 +#135#255#253#180#181#255#253#186#187#255#253#192#194#255#253#198#200#255#252 +#204#206#255#252#210#212#255#252#216#218#255#252#222#224#255#251#228#231#255 +#251#233#237#255#251#239#243#255#211#187#190#253'g'#28#29#191#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0'T'#0#0#12'm%$'#224#173#167#243#255 +#0#0#255#255#22#21#253#255'[3'#142#255#195'|}'#255#253#190#191#255#253#196 +#197#255#252#202#204#255#252#208#210#255#252#214#216#255#252#219#222#255#252 +#225#228#255#251#231#234#255#251#237#241#255#235#219#223#255'j!!'#220'T'#0#0 +#13#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'_' +#16#16'\'#165'wu'#239'A?'#252#255#0#0#255#255#0#0#255#255'P2'#169#255#183'uv' +#255#253#200#201#255#252#205#208#255#252#211#214#255#252#217#220#255#252#223 +#226#255#251#229#232#255#251#235#238#255#248#236#240#255'w45'#231'T'#0#0')' +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 ,#255#255#0#255#255#255#0'h'#29#29#201#197#183#219#255#6#6#255#255#0#0#255#255 +#0#0#255#255'P7'#184#255#169'jj'#255#252#209#212#255#252#215#218#255#252#221 +#224#255#251#227#230#255#251#233#236#255#251#239#242#255#150'`b'#237'c'#22#22 +'\'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0'T'#0#0'&v10'#231#163#156#241#255#4#4 +#255#255#0#0#255#255#0#0#255#255'P;'#197#255#171'pq'#255#252#219#222#255#252 +#225#228#255#251#231#234#255#251#237#240#255#191#155#157#247'g'#28#29#156#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0']'#13#12'=u10' +#229#168#159#236#255#6#6#255#255#0#0#255#255#0#0#255#255']3'#136#255#227#190 +#191#255#251#229#232#255#251#235#238#255#222#199#202#255'h'#30#31#203'T'#0#0 +#3#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0'W'#5#5'-q+*'#225#172#162#230#255#9#9#255#255#0#0#255#255#19#18#252#255 +'|AW'#255#251#232#236#255#241#224#228#255'n&'''#224'T'#0#0#21#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0'T'#0#0' o''&'#219#192#178#217#255']['#251#255#4#4#255 +#255'E2'#202#255#194#156#158#255#129'AB'#233'['#10#11'8'#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0'T'#0#0#22'k"!'#186#139'ON'#229#199 +#182#209#255#220#211#235#255'w22'#252'g'#27#28'r'#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +'T'#0#0' j '#31#165'l##'#231'i'#31#31#190#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#10'GroupIndex'#2','#9'NumGlyphs'#2#0#7'OnClick'#7#11'PenBtnClick'#0#0#12'TS' +'peedButton'#10'EllipseBtn'#4'Left'#2'Z'#6'Height'#2#30#4'Hint'#6#12'Ellipse' +' Tool'#3'Top'#2#0#5'Width'#2#30#10'AllowAllUp'#9#10'Glyph.Data'#10'z'#8#0#0 +'v'#8#0#0'BMv'#8#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#24#0#0#0#22#0#0#0#1#0' '#0#0#0 +#0#0'@'#8#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#0#0#255#7#0#0#255'g'#0#0#255#179#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#0#0#255#26#0#0#255','#0#0#255#3#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#0#0#255#5'11'#255#191'>>'#255#255#0#0#255#203#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#31#0#0 +#255#167#0#0#255#229#0#0#255#255#0#0#255#255#0#0#255#245#0#0#255#195#0#0#255 +'R'#255#255#255#0#255#255#255#0#0#0#255'8'#166#166#255#255'55'#255#255#0#0 +#255#249#0#0#255#20#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'd'#0#0#255 +#242#0#0#255#203#0#0#255'h'#0#0#255'4'#0#0#255'"'#0#0#255'U'#0#0#255#154#0#0 +#255#253#0#0#255#166#0#0#255#16#7#7#255'$'#163#163#255#255',,'#255#255#0#0 +#255#255#0#0#255'l'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'N'#0#0#255#254#0#0#255'|' +#0#0#255#4#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#0#0#255'='#0#0#255#225#0#0#255#173#255#255#255#0',,'#255']'#15#15#255 +#216#0#0#255#156#0#0#255#18#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#0#0#255#18#0#0#255#231#0#0#255#147#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#0#0#255'6'#0#0#255#252#0#0#255'YT'#0#0'''T'#0#0 +#185'T'#0#0#140'T'#0#0#8#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#0#0#255#127#0#0#255#224#0#0#255#10#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#138#0#0#255#224'Z'#9#9#139 +'_'#16#16#255'T'#0#0#255'T'#0#0#207'T'#0#0#3#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#0#0#255#183#0#0#255#153#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#0#0#255#5#0#0#255#8#0#0#255'<'#0#0#255#255'Z'#15#26 ,#192#128'AA'#255'T'#0#0#255'T'#0#0#255'M'#0#21'H'#0#0#255#8#0#0#255#8#0#0#255 +#8#0#0#255#8#0#0#255#8#0#0#255#235#0#0#255'h'#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#0#0#255#176#0#0#255#255#0#0#255#255#0#0#255#255'8'#0'U'#255#131'FF' +#255'T'#0#0#255'T'#0#0#255'%'#0#144#255#0#0#255#255#0#0#255#255#0#0#255#255#0 +#0#255#255#0#0#255#255#0#0#255#235#0#0#255'h'#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#0#0#255#176#0#0#255#141#0#0#255'.'#0#0#255#251'@'#0'<'#190#130'EE'#255 +'T'#0#0#255'T'#0#0#255'H'#0'$'#145#0#0#255'('#0#0#255'('#0#0#255'('#0#0#255 +'I'#0#0#255#255#0#0#255#183#0#0#255#152#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#0#0#255#176#0#0#255'x'#0#0#255'5'#0#0#255#255'L'#0#23#132#130'DD'#255'T'#0#0 +#255'T'#0#0#255'T'#0#0#136#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255 +'('#0#0#255#255#0#0#255#129#0#0#255#221#0#0#255#8#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255#176#0#0#255'x'#0#0#255#134#0#0#255#226'T'#0#0'D'#130'DD'#255'T'#0#0#255 +'T'#0#0#255'T'#0#0#145#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'('#0 +#0#255#255#0#0#255#21#0#0#255#234#0#0#255#141#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255 +#176#0#0#255#146#0#0#255#251#0#0#255'_T'#0#0#9#129'CC'#250'U'#1#1#255'T'#0#0 +#255'T'#0#0#153#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'('#0#0#255 +#255#255#255#255#0#0#0#255'S'#0#0#255#253#0#0#255't'#0#0#255#2#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#193#0#0#255 +#238#0#0#255#179#255#255#255#0#255#255#255#0'm%%'#198'X'#6#6#255'T'#0#0#255 +'T'#0#0#161#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'('#0#0#255#255 +#255#255#255#0#255#255#255#0#0#0#255'l'#0#0#255#245#0#0#255#196#0#0#255'`'#0 +#0#255','#0#0#255#26#0#0#255'M'#0#0#255#146#0#0#255#254#0#0#255#212#0#0#255 +#19#255#255#255#0#255#255#255#0'U'#2#2'}Y'#8#8#255'T'#0#0#255'T'#0#0#169#255 +#255#255#0#255#255#255#0#255#255#255#0#0#0#255'('#0#0#255#255#255#255#255#0 +#255#255#255#0#255#255#255#0#0#0#255'$'#0#0#255#175#0#0#255#236#0#0#255#255#0 +#0#255#255#0#0#255#249#0#0#255#203#0#0#255#204#0#0#255'x'#255#255#255#0#255 +#255#255#0#255#255#255#0'T'#0#0':U'#1#1#255'T'#0#0#255'T'#0#0#199#255#255#255 +#0#255#255#255#0#255#255#255#0#0#0#255'('#0#0#255#255#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'"'#0#0 +#255'4'#0#0#255#7#255#255#255#0#0#0#255#176#0#0#255'x'#255#255#255#0#255#255 +#255#0#255#255#255#0'T'#0#0#4'T'#0#0#243'T'#0#0#255'T'#0#0#254'T'#0#0#26#255 +#255#255#0#255#255#255#0#0#0#255'('#0#0#255#255#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#0#0#255#176#0#0#255'x'#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0'T'#0#0#160'T'#0#0#255'T'#0#0#255 +'T'#0#0'l'#255#255#255#0#255#255#255#0#0#0#255'('#0#0#255#255#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#176#0#0#255'x' +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'T'#0#0'!T'#0#0#250 +'T'#0#0#255'T'#0#0#190#255#255#255#0#255#255#255#0#0#0#255'('#0#0#255#255#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#176#0 +#0#255'x'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 +#0'T'#0#0#149'T'#0#0#255'T'#0#0#251'T'#0#0#15#255#255#255#0#0#0#255'('#0#0 +#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255#176#0#0#255#243#0#0#255#232#0#0#255#232#0#0#255#232#0#0#255#232#0#0#255 +#232#9#0#228#234'Q'#0#8#254'T'#0#0#255#11#0#221#235#0#0#255#232#0#0#255#235#0 +#0#255#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#0#0#255'1'#0#0#255'H'#0#0#255'H'#0#0#255'H'#0#0#255'H'#0#0#255'H'#0#0#255'H' +#0#0#255'H5'#0'^'#132'L'#0#23#208#3#0#245'J'#0#0#255'H'#0#0#255'H'#0#0#255'H' +#10'GroupIndex'#2','#9'NumGlyphs'#2#0#7'OnClick'#7#11'PenBtnClick'#0#0#12'TS' +'peedButton'#9'Fill3DBtn'#4'Left'#2'x'#6'Height'#2#30#4'Hint'#6'(Create VOI ' +'based on background intensity'#3'Top'#2#0#5'Width'#2#30#10'AllowAllUp'#9#10 +'Glyph.Data'#10#218#8#0#0#214#8#0#0'BM'#214#8#0#0#0#0#0#0'6'#0#0#0'('#0#0#0 +#24#0#0#0#23#0#0#0#1#0' '#0#0#0#0#0#160#8#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#0#0#255#28#0#0#255'Q'#0#0#255#131#0#0#255#181#0#0 ,#255#231#0#0#255#231#0#0#255#181#0#0#255#131#0#0#255'Q'#2#4#255#28#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#0#0#255#11#0#0#255#141#0#0#255#252#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#1#2#255#255#10#17#255#255#18#28#255 +#252#23'%'#255#141#26'*'#255#11#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#0#0#255'F'#0#0#255#223#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#3#5#255#255#14#23#255#255#24''''#255#255 +'!4'#255#255'''>'#255#255'+D'#255#223'+E'#255'F'#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255#135#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#13#21#255#255#26')'#255#255'%<'#255 +#255'/K'#255#255'7W'#255#255';_'#255#255'<`'#255#255'9['#255#135#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'J'#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#8#12#255#255#22'#'#255#255'$9'#255#255'1N'#255#255 +'=`'#255#255'Fp'#255#255'Ly'#255#255'Mz'#255#255'It'#255#255'Ag'#255'J'#255 +#255#255#0#255#255#255#0#255#255#255#0#0#0#255#22#0#0#255#233#0#0#255#255#0#0 +#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#13#22#255#255#29'.'#255#255',F'#255#255':]'#255#255'Hr'#255 +#255'T'#133#255#255'\'#147#255#255'^'#149#255#255'X'#140#255#255'M{'#255#233 +'@f'#255#22#255#255#255#0#255#255#255#0#0#0#255#180#0#0#255#255#0#0#255#255#0 +#0#218#255#0#0#185#255#0#0#160#255#0#0#184#255#0#0#222#255#0#0#253#255#0#0 +#255#255#1#2#255#255#17#27#253#255#25''''#191#255'%:'#191#255'0L'#191#255'<_' +#191#255'Fp'#191#255'V'#136#204#255'd'#159#231#255'd'#158#254#255'V'#137#255 +#255'Gq'#255#180#255#255#255#0#0#0#255'*'#0#0#255#255#0#0#224#255#0#0'E'#255 +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0'9'#255#0#0#222#255#2#3 +#255#255#17#28#245#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0 +#0#255#0#0#0#255#14#23'#'#255'4S'#150#255'It'#255#255'9Z'#255'*'#0#0#255'`'#0 +#0#254#255#0#0'='#255#0#0#0#255#0#0#0#255#0#0'{'#255#0#0#236#255#0#0#141#255 +#0#0#0#255#0#0#0#255#0#0'3'#255#0#1#255#255#15#25#245#255#0#0#0#255#0#0#0#255 +#0#0#0#255#17#28'9'#255#31'2V'#255#21'!3'#255#0#0#0#255#0#0#0#255#0#0#0#255 +'%<'#138#255'6V'#255'`'#0#0#255#150#0#0#255#255#0#0#253#255#0#0#231#255#0#0 +#205#255#0#0#250#255#0#0#255#255#0#0#222#255#0#0#0#255#0#0#0#255#0#0#1#255#0 +#0#242#255#12#19#245#255#0#0#0#255#0#0#0#255#0#0#0#255'*B'#154#255'Q'#128#255 +#255'X'#140#255#255'%:h'#255#0#0#0#255#0#0#0#255#5#7#19#255'0L'#255#150#0#0 +#255#203#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#187#255#0#0'k' +#255#0#0''''#255#0#0#0#255#0#0#0#255#0#0'j'#255#0#0#255#255#6#10#245#255#0#0 +#0#255#0#0#0#255#0#0#0#255'"7'#154#255'Bj'#255#255'Hr'#255#255'1N'#171#255#0 +#0#0#255#0#0#0#255#0#0#0#255'!5'#217#209#0#0#255#242#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#170#255#0#0#3#255#0#0#0#255#0#0#0#255#0#0'~'#255 +#0#0#255#255#0#0#255#255#0#0#245#255#0#0#0#255#0#0#0#255#0#0#0#255#27'*'#154 +#255'3Q'#255#255'7X'#255#255#31'1'#139#255#0#0#0#255#0#0#0#255#0#0#0#255#25 +''''#226#243#0#0#255#200#0#0#255#255#0#0#248#255#0#0#217#255#0#0#184#255#0#0 +#246#255#0#0#236#255#0#0'>'#255#0#0#0#255#0#0#0#255#0#0#174#255#0#0#255#255#0 +#0#245#255#0#0#0#255#0#0#0#255#0#0#0#255#18#28#154#255'#8'#255#255'!5'#217 +#255#8#12'2'#255#0#0#0#255#0#0#0#255#3#5#30#255#15#25#255#200#0#0#255#146#0#0 +#255#255#0#0#133#255#0#0#0#255#0#0#0#255#0#0']'#255#0#0#173#255#0#0'/'#255#0 +#0#0#255#0#0#0#255#0#0#188#255#0#0#255#255#0#0#245#255#0#0#0#255#0#0#0#255#0 +#0#0#255#1#2#24#255#2#3#22#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#2#255#7#11 +#180#255#2#3#255#146#0#0#255'\'#0#0#255#255#0#0#255#255#0#0'{'#255#0#0#15#255 +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#15#255#0#0'}'#255#0#0#255#255#0#0#255#255 +#0#0#245#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#3#255#1#1 +#31#255#1#2'N'#255#0#1#206#255#0#0#255#255#0#0#255'\'#0#0#255'%'#0#0#255#255 +#0#7#255#255#0#15#255#255#0#16#250#255#0#14#225#255#0#11#213#255#0#5#230#255 +#0#0#251#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#239#255#0#0 +#239#255#0#0#239#255#0#0#239#255#0#0#239#255#0#0#251#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255'%'#255#255#255#0#0#28#255#181#0#29#255 +#255#0#29#255#255#0#28#255#255#0#28#255#255#0#27#255#255#0#27#255#255#0#23 +#255#255#0#10#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#164#255#255#255#0#255#255#255#0#0'2'#255#23#0'&'#255#232 +#0'#'#255#255#0'#'#255#255#0'"'#255#255#0'!'#255#255#0' '#255#255#0' '#255 ,#255#0#31#255#255#0#23#255#255#0#4#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#255#0#0#255#255#0#1#255#255#0#7#255#255#0#14#255#255#0#18#255 +#255#0#20#255#230#0'!'#255#22#255#255#255#0#255#255#255#0#255#255#255#0#0'4' +#255'U'#0'+'#255#253#0'*'#255#255#0')'#255#255#0'('#255#255#0''''#255#255#0 +'&'#255#255#0'%'#255#255#0'%'#255#255#0'#'#255#255#0#16#255#255#0#8#255#255#0 +#11#255#255#0#14#255#255#0#22#255#255#0#30#255#255#0#31#255#255#0#30#255#255 +#0#30#255#253#0' '#255'O'#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#0','#255#136#0'1'#255#253#0'0'#255#255#0'/'#255#255#0'.' +#255#255#0'.'#255#255#0','#255#255#0','#255#255#0'+'#255#255#0'*'#255#255#0 +'*'#255#255#0'('#255#255#0'('#255#255#0''''#255#255#0'&'#255#255#0'%'#255#255 +#0'%'#255#253#0'"'#255#135#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0'A'#255'J'#0'='#255#222#0 +'7'#255#255#0'6'#255#255#0'5'#255#255#0'5'#255#255#0'3'#255#255#0'2'#255#255 +#0'2'#255#255#0'1'#255#255#0'0'#255#255#0'/'#255#255#0'.'#255#255#0'.'#255 +#255#0'0'#255#221#0'1'#255'G'#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#0#147#255#17#0'B'#255#147#0'>'#255#249#0'='#255#255#0'<'#255#255#0';' +#255#255#0';'#255#255#0':'#255#255#0'8'#255#255#0'8'#255#255#0'7'#255#255#0 +'5'#255#249#0':'#255#146#0'{'#255#14#255#255#255#0#255#255#255#0#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0'U'#255#18#0'['#255'[' +#0'O'#255#142#0'J'#255#185#0'F'#255#223#0'F'#255#223#0'H'#255#186#0'L'#255 +#142#0'Q'#255'Y'#0'E'#255#16#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#10'GroupIndex'#2','#9'N' +'umGlyphs'#2#0#7'OnClick'#7#14'Fill3DBtnClick'#0#0#0#0#6'TPanel'#8'MagPanel' +#4'Left'#2#0#6'Height'#2#18#3'Top'#3#195#1#5'Width'#3#1#4#5'Align'#7#8'alBot' +'tom'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2#18#11'ClientWidth'#3#1#4 +#8'TabOrder'#2#1#0#6'TLabel'#11'StatusLabel'#4'Left'#2#2#6'Height'#2#18#3'To' +'p'#2#2#5'Width'#3#134#0#7'Caption'#6#20' No Images Loaded '#11'ParentColo' +'r'#8#0#0#12'TProgressBar'#12'ProgressBar1'#4'Left'#3'k'#3#6'Height'#2#18#3 +'Top'#2#0#5'Width'#3#150#0#5'Align'#7#7'alRight'#7'Anchors'#11#7'akRight'#8 +'akBottom'#0#11'BorderWidth'#2#1#8'TabOrder'#2#0#0#0#0#6'TPanel'#6'Panel1'#4 +'Left'#2#0#6'Height'#3#155#1#3'Top'#2'('#5'Width'#3#1#4#5'Align'#7#8'alClien' +'t'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#3#155#1#11'ClientWidth'#3#1#4 +#8'TabOrder'#2#2#0#10'TScrollBox'#11'TriplePanel'#3'Tag'#3#154#2#4'Left'#2#0 +#6'Height'#3#155#1#3'Top'#2#0#5'Width'#3#1#4#5'Align'#7#8'alClient'#12'Clien' +'tHeight'#3#155#1#11'ClientWidth'#3#1#4#20'Constraints.MinWidth'#2#5#5'Color' +#7#7'clBlack'#11'ParentColor'#8#8'TabOrder'#2#0#7'OnClick'#7#13'ImgPanelClic' +'k'#0#6'TImage'#10'PGImageCor'#3'Tag'#2#2#6'Cursor'#7#7'crCross'#4'Left'#2#1 +#6'Height'#2#12#3'Top'#2#1#5'Width'#2#12#8'AutoSize'#9#10'OnDblClick'#7#18'P' +'GImageCorDblClick'#11'OnMouseDown'#7#16'PGImageMouseDown'#11'OnMouseMove'#7 +#16'PGImageMouseMove'#9'OnMouseUp'#7#14'PGImageMouseUp'#7'Stretch'#9#0#0#6'T' +'Image'#10'PGImageSag'#3'Tag'#2#3#6'Cursor'#7#7'crCross'#4'Left'#3'C'#1#6'He' +'ight'#2#12#3'Top'#2'n'#5'Width'#2#12#8'AutoSize'#9#10'OnDblClick'#7#18'PGIm' +'ageCorDblClick'#11'OnMouseDown'#7#16'PGImageMouseDown'#11'OnMouseMove'#7#16 +'PGImageMouseMove'#9'OnMouseUp'#7#14'PGImageMouseUp'#7'Stretch'#9#0#0#6'TIma' +'ge'#9'PGImageAx'#3'Tag'#2#1#6'Cursor'#7#7'crCross'#4'Left'#3#251#2#6'Height' +#2#12#3'Top'#3#238#0#5'Width'#2#12#8'AutoSize'#9#10'OnDblClick'#7#18'PGImage' +'CorDblClick'#11'OnMouseDown'#7#16'PGImageMouseDown'#11'OnMouseMove'#7#16'PG' +'ImageMouseMove'#9'OnMouseUp'#7#14'PGImageMouseUp'#7'Stretch'#9#0#0#0#0#9'TM' +'ainMenu'#9'MainMenu1'#4'left'#2'p'#3'top'#3#212#0#0#9'TMenuItem'#5'File1'#7 +'Caption'#6#5'&File'#0#9'TMenuItem'#5'Open1'#7'Caption'#6#5'&Open'#8'ShortCu' +'t'#3'O@'#7'OnClick'#7#10'Open1Click'#0#0#9'TMenuItem'#7'Recent1'#7'Caption' +#6#12'Open &recent'#0#0#9'TMenuItem'#10'Templates1'#7'Caption'#6#15'Open &te' +'mplates'#0#0#9'TMenuItem'#11'CloseImages'#7'Caption'#6#13'&Close images'#7 +'OnClick'#7#16'CloseImagesClick'#0#0#9'TMenuItem'#12'SaveasNIfTI1'#7'Caption' +#6#16'Save as NIfTI...'#8'ShortCut'#4'S'#192#0#0#7'OnClick'#7#17'SaveasNIfTI' +'1Click'#0#0#9'TMenuItem'#14'Saveaspicture1'#7'Caption'#6#15'&Save as bitmap' +#8'ShortCut'#3'S@'#7'OnClick'#7#19'Saveaspicture1Click'#0#0#9'TMenuItem'#5'E' +'xit1'#7'Caption'#6#5'E&xit'#7'OnClick'#7#10'Exit1Click'#0#0#0#9'TMenuItem'#5 +'Edit1'#7'Caption'#6#5'&Edit'#0#9'TMenuItem'#5'Copy1'#7'Caption'#6#4'Copy'#8 +'ShortCut'#3'C@'#7'OnClick'#7#10'Copy1Click'#0#0#9'TMenuItem'#6'Paste1'#7'Ca' +'ption'#6#5'Paste'#8'ShortCut'#3'V@'#7'OnClick'#7#11'Paste1Click'#0#0#9'TMen' +'uItem'#5'Undo1'#7'Caption'#6#4'Undo'#8'ShortCut'#3'Z@'#7'OnClick'#7#10'Undo' ,'1Click'#0#0#0#9'TMenuItem'#11'OverlayMenu'#7'Caption'#6#8'&Overlay'#0#9'TMe' +'nuItem'#11'OverlayOpen'#7'Caption'#6#3'Add'#8'ShortCut'#3'A@'#7'OnClick'#7 +#16'OverlayOpenClick'#0#0#9'TMenuItem'#15'CloseOverlayImg'#7'Caption'#6#14'C' +'lose overlays'#7'OnClick'#7#20'CloseOverlayImgClick'#0#0#9'TMenuItem'#14'BG' +'TransPctMenu'#7'Caption'#6#26'Transparency on background'#0#9'TMenuItem'#8 +'BGtrans0'#7'Caption'#6#9'0% opaque'#7'Checked'#9#10'GroupIndex'#3#251#0#9'R' +'adioItem'#9#7'OnClick'#7#15'BGtrans100Click'#0#0#9'TMenuItem'#9'BGtrans20'#3 +'Tag'#2#20#7'Caption'#6#3'20%'#10'GroupIndex'#3#251#0#9'RadioItem'#9#7'OnCli' +'ck'#7#15'BGtrans100Click'#0#0#9'TMenuItem'#9'BGtrans40'#3'Tag'#2'('#7'Capti' +'on'#6#3'40%'#10'GroupIndex'#3#251#0#9'RadioItem'#9#7'OnClick'#7#15'BGtrans1' +'00Click'#0#0#9'TMenuItem'#9'BGtrans50'#3'Tag'#2'2'#7'Caption'#6#3'50%'#10'G' +'roupIndex'#3#251#0#9'RadioItem'#9#7'OnClick'#7#15'BGtrans100Click'#0#0#9'TM' +'enuItem'#9'BGtrans60'#3'Tag'#2'<'#7'Caption'#6#3'60%'#10'GroupIndex'#3#251#0 +#9'RadioItem'#9#7'OnClick'#7#15'BGtrans100Click'#0#0#9'TMenuItem'#9'BGtrans8' +'0'#3'Tag'#2'P'#7'Caption'#6#3'80%'#10'GroupIndex'#3#251#0#9'RadioItem'#9#7 +'OnClick'#7#15'BGtrans100Click'#0#0#9'TMenuItem'#10'BGtrans100'#3'Tag'#2'd'#7 +'Caption'#6#16'100% transparent'#10'GroupIndex'#3#251#0#9'RadioItem'#9#7'OnC' +'lick'#7#15'BGtrans100Click'#0#0#9'TMenuItem'#10'BGAdditive'#3'Tag'#2#255#7 +'Caption'#6#8'Additive'#10'GroupIndex'#3#251#0#9'RadioItem'#9#7'OnClick'#7#15 +'BGtrans100Click'#0#0#0#9'TMenuItem'#19'OverlayTransPctMenu'#7'Caption'#6#30 +'Transparency on other overlays'#0#9'TMenuItem'#9'N0opaque1'#7'Caption'#6#9 +'0% opaque'#10'GroupIndex'#3#253#0#9'RadioItem'#9#7'OnClick'#7#17'OverlayTra' +'nsClick'#0#0#9'TMenuItem'#4'N201'#3'Tag'#2#20#7'Caption'#6#3'20%'#10'GroupI' +'ndex'#3#253#0#9'RadioItem'#9#7'OnClick'#7#17'OverlayTransClick'#0#0#9'TMenu' +'Item'#4'N401'#3'Tag'#2'('#7'Caption'#6#3'40%'#10'GroupIndex'#3#253#0#9'Radi' +'oItem'#9#7'OnClick'#7#17'OverlayTransClick'#0#0#9'TMenuItem'#4'N501'#3'Tag' +#2'2'#7'Caption'#6#3'50%'#10'GroupIndex'#3#253#0#9'RadioItem'#9#7'OnClick'#7 +#17'OverlayTransClick'#0#0#9'TMenuItem'#4'N601'#3'Tag'#2'<'#7'Caption'#6#3'6' +'0%'#10'GroupIndex'#3#253#0#9'RadioItem'#9#7'OnClick'#7#17'OverlayTransClick' +#0#0#9'TMenuItem'#4'N801'#3'Tag'#2'P'#7'Caption'#6#3'80%'#10'GroupIndex'#3 +#253#0#9'RadioItem'#9#7'OnClick'#7#17'OverlayTransClick'#0#0#9'TMenuItem'#16 +'N100transparent1'#3'Tag'#2'd'#7'Caption'#6#16'100% transparent'#10'GroupInd' +'ex'#3#253#0#9'RadioItem'#9#7'OnClick'#7#17'OverlayTransClick'#0#0#9'TMenuIt' +'em'#15'OverlayAdditive'#3'Tag'#2#255#7'Caption'#6#8'Additive'#7'Checked'#9 +#10'GroupIndex'#3#253#0#9'RadioItem'#9#7'OnClick'#7#17'OverlayTransClick'#0#0 +#0#9'TMenuItem'#9'LayerMenu'#7'Caption'#6#11'Layer color'#7'Visible'#8#0#9'T' +'MenuItem'#9'Noneopen1'#7'Caption'#6#9'None open'#0#0#0#9'TMenuItem'#11'Laye' +'rrange1'#7'Caption'#6#15'Layer intensity'#7'Visible'#8#0#9'TMenuItem'#9'Non' +'eopen2'#7'Caption'#6#9'None open'#0#0#0#0#9'TMenuItem'#8'DrawMenu'#7'Captio' +'n'#6#5'&Draw'#0#9'TMenuItem'#7'OpenVOI'#7'Caption'#6#11'Open VOI...'#7'OnCl' +'ick'#7#12'OpenVOIClick'#0#0#9'TMenuItem'#7'SaveVOI'#7'Caption'#6#11'Save VO' +'I...'#7'OnClick'#7#12'SaveVOIClick'#0#0#9'TMenuItem'#8'CloseVOI'#7'Caption' +#6#12'Close VOI...'#7'OnClick'#7#13'CloseVOIClick'#0#0#9'TMenuItem'#8'VOICol' +'or'#7'Caption'#6#12'VOI color...'#7'OnClick'#7#13'VOIColorClick'#0#0#9'TMen' +'uItem'#29'Applyintensityfiltertovolume1'#7'Caption'#6#19'Intensity filter..' +'.'#8'ShortCut'#3'F@'#7'OnClick'#7'"Applyintensityfiltertovolume1Click'#0#0#9 +'TMenuItem'#10'SmoothVOI1'#7'Caption'#6#13'Smooth VOI...'#7'OnClick'#7#15'Sm' +'oothVOI1Click'#0#0#9'TMenuItem'#17'MaskimagewithVOI1'#7'Caption'#6#19'Mask ' +'image with VOI'#0#9'TMenuItem'#13'VOImaskDelete'#7'Caption'#6#23'Delete reg' +'ions with VOI'#7'OnClick'#7#12'VOImaskClick'#0#0#9'TMenuItem'#15'VOImaskPre' +'serve'#3'Tag'#2#1#7'Caption'#6#25'Preserve regions with VOI'#7'OnClick'#7#12 +'VOImaskClick'#0#0#0#9'TMenuItem'#19'Overlaycomparisons1'#7'Caption'#6#19'Ov' +'erlay comparisons'#0#9'TMenuItem#IntersectionmutualtoVOIandoverlays1'#7'Cap' +'tion'#6#31'Intersection [VOI and overlays]'#7'OnClick'#7#18'ROIcomparisonCl' +'ick'#0#0#9'TMenuItem'#19'UnionVOIoroverlays1'#3'Tag'#2#1#7'Caption'#6#23'Un' +'ion [VOI or overlays]'#7'OnClick'#7#18'ROIcomparisonClick'#0#0#9'TMenuItem' +#22'MaskVOIbutnotoverlays1'#3'Tag'#2#2#7'Caption'#6#27'Mask [VOI but not ove' +'rlays]'#7'OnClick'#7#18'ROIcomparisonClick'#0#0#0#9'TMenuItem'#11'Statistic' +'s1'#7'Caption'#6#10'Statistics'#0#9'TMenuItem'#5'Beta1'#7'Caption'#6#21'Cre' +'ate overlap images'#7'OnClick'#7#13'CreateOverlap'#0#0#9'TMenuItem'#10'Chis' +'quare1'#7'Caption'#6#17'Subtraction Plots'#7'OnClick'#7#15'Chisquare1Click' +#0#0#9'TMenuItem'#13'BatchROImean1'#7'Caption'#6#18'Batch descriptives'#7'On' +'Click'#7#18'BatchROImean1Click'#0#0#9'TMenuItem'#14'Batchprobmaps1'#7'Capti' +'on'#6#15'Batch prob maps'#7'OnClick'#7#19'Batchprobmaps1Click'#0#0#9'TMenuI' ,'tem/Batchclusterprobmaps1Batchclusterprobmaps1Click'#7'Caption'#6#23'Batch ' +'cluster prob maps'#7'OnClick'#7'4Batchclusterprobmaps1Batchclusterprobmaps1' +'ClickClick'#0#0#0#9'TMenuItem'#8'Convert1'#7'Caption'#6#7'Convert'#0#9'TMen' +'uItem'#7'ROIVOI1'#7'Caption'#6#10'ROI -> VOI'#7'OnClick'#7#12'ROIVOI1Click' +#0#0#9'TMenuItem'#7'VOI2NII'#7'Caption'#6#10'VOI -> NII'#7'OnClick'#7#12'VOI' +'2NIIClick'#0#0#9'TMenuItem'#6'NIIVOI'#7'Caption'#6#10'NII -> VOI'#7'OnClick' +#7#11'NIIVOIClick'#0#0#0#9'TMenuItem'#6'Nudge1'#7'Caption'#6#5'Nudge'#0#9'TM' +'enuItem'#3'Up1'#7'Caption'#6#4'Left'#7'OnClick'#7#8'Up1Click'#0#0#9'TMenuIt' +'em'#5'Left1'#3'Tag'#2#1#7'Caption'#6#5'Right'#7'OnClick'#7#8'Up1Click'#0#0#9 +'TMenuItem'#6'LeftX1'#3'Tag'#2#2#7'Caption'#6#9'Posterior'#7'OnClick'#7#8'Up' +'1Click'#0#0#9'TMenuItem'#7'RightX1'#3'Tag'#2#3#7'Caption'#6#8'Anterior'#7'O' +'nClick'#7#8'Up1Click'#0#0#9'TMenuItem'#10'Posterior1'#3'Tag'#2#4#7'Caption' +#6#8'Inferior'#7'OnClick'#7#8'Up1Click'#0#0#9'TMenuItem'#10'Posterior2'#3'Ta' +'g'#2#5#7'Caption'#6#8'Superior'#7'OnClick'#7#8'Up1Click'#0#0#0#9'TMenuItem' +#2'n5'#7'Caption'#6#8'Advanced'#0#9'TMenuItem'#11'RescaleMenu'#7'Caption'#6 +#14'Phase to rad/S'#7'OnClick'#7#16'RescaleMenuClick'#0#0#9'TMenuItem'#16'Br' +'ainExtraction1'#7'Caption'#6#16'Brain extraction'#7'OnClick'#7#12'BETmenuCl' +'ick'#0#0#9'TMenuItem'#10'CropEdges1'#7'Caption'#6#10'Crop edges'#7'OnClick' +#7#13'CropMenuClick'#0#0#9'TMenuItem'#10'Brainmask1'#7'Caption'#6#11'Brain m' +'ask '#7'OnClick'#7#15'BrainMask1Click'#0#0#9'TMenuItem'#25'GenerateSPM5mask' +'slesions1'#7'Caption'#6#16'Create SPM5 mask'#7'OnClick'#7#30'GenerateSPM5ma' +'skslesions1Click'#0#0#9'TMenuItem'#7'LRFlip1'#7'Caption'#6#7'LR Flip'#7'OnC' +'lick'#7#15'MirrorNII1Click'#0#0#9'TMenuItem'#22'ApplyClusterThreshold1'#7'C' +'aption'#6#23'Apply cluster threshold'#7'OnClick'#7#27'ApplyClusterThreshold' +'1Click'#0#0#9'TMenuItem'#24'ExportasRGBAnalyzeimage1'#7'Caption'#6#19'Expor' +'t as RGB image'#7'OnClick'#7#29'ExportasRGBAnalyzeimage1Click'#0#0#9'TMenuI' +'tem'#13'Resliceimage1'#7'Caption'#6#14'Reslice images'#7'OnClick'#7#18'Resl' +'iceimage1Click'#0#0#9'TMenuItem!AdjustimagessoVOIintensityiszero1'#7'Captio' +'n'#6'&Adjust images so VOI intensity is zero'#7'OnClick'#7'&AdjustimagessoV' +'OIintensityiszero1Click'#0#0#9'TMenuItem'#8'Extract1'#7'Caption'#6#15'Extra' +'ct objects'#7'OnClick'#7#13'Extract1Click'#0#0#0#9'TMenuItem'#19'Descriptiv' +'eMenuItem'#7'Caption'#6#11'Descriptive'#7'OnClick'#7#24'DescriptiveMenuItem' +'Click'#0#0#9'TMenuItem'#2'N1'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#4'Pen1'#3 +'Tag'#2#2#7'Caption'#6#3'Pen'#8'ShortCut'#2'p'#7'OnClick'#7#15'ToolSelectCli' +'ck'#0#0#9'TMenuItem'#13'Penautoclose1'#3'Tag'#2#3#7'Caption'#6#13'Autoclose' +' pen'#8'ShortCut'#2'q'#7'OnClick'#7#15'ToolSelectClick'#0#0#9'TMenuItem'#13 +'CircleSquare1'#3'Tag'#2#4#7'Caption'#6#4'Fill'#8'ShortCut'#2'r'#7'OnClick'#7 +#15'ToolSelectClick'#0#0#9'TMenuItem'#7'Circle2'#3'Tag'#2#5#7'Caption'#6#6'C' +'ircle'#8'ShortCut'#2's'#7'OnClick'#7#15'ToolSelectClick'#0#0#9'TMenuItem'#7 +'Circle1'#3'Tag'#2#6#7'Caption'#6#14'Deselect tools'#8'ShortCut'#2't'#7'OnCl' +'ick'#7#15'ToolSelectClick'#0#0#0#9'TMenuItem'#9'Controls1'#7'Caption'#6#5'&' +'View'#0#9'TMenuItem'#8'Display2'#3'Tag'#2#2#7'Caption'#6#7'Display'#0#9'TMe' +'nuItem'#6'Axial1'#3'Tag'#2#1#9'AutoCheck'#9#7'Caption'#6#5'Axial'#10'GroupI' +'ndex'#3#234#0#9'RadioItem'#9#7'OnClick'#7#14'Sagittal1Click'#0#0#9'TMenuIte' +'m'#8'Coronal1'#3'Tag'#2#3#9'AutoCheck'#9#7'Caption'#6#7'Coronal'#10'GroupIn' +'dex'#3#234#0#9'RadioItem'#9#7'OnClick'#7#14'Sagittal1Click'#0#0#9'TMenuItem' +#9'Sagittal1'#3'Tag'#2#2#9'AutoCheck'#9#7'Caption'#6#8'Sagittal'#10'GroupInd' +'ex'#3#234#0#9'RadioItem'#9#7'OnClick'#7#14'Sagittal1Click'#0#0#9'TMenuItem' +#9'Multiple1'#9'AutoCheck'#9#7'Caption'#6#8'Multiple'#7'Checked'#9#10'GroupI' +'ndex'#3#234#0#9'RadioItem'#9#7'OnClick'#7#14'Sagittal1Click'#0#0#9'TMenuIte' +'m'#6'Axial2'#3'Tag'#2#255#9'AutoCheck'#9#7'Caption'#6#10'Axial only'#10'Gro' +'upIndex'#3#234#0#9'RadioItem'#9#7'OnClick'#7#14'Sagittal1Click'#0#0#9'TMenu' +'Item'#8'Coronal2'#3'Tag'#2#253#9'AutoCheck'#9#7'Caption'#6#12'Coronal only' +#10'GroupIndex'#3#234#0#9'RadioItem'#9#7'OnClick'#7#14'Sagittal1Click'#0#0#9 +'TMenuItem'#9'Sagittal2'#3'Tag'#2#254#9'AutoCheck'#9#7'Caption'#6#13'Sagitta' +'l only'#10'GroupIndex'#3#234#0#9'RadioItem'#9#7'OnClick'#7#14'Sagittal1Clic' +'k'#0#0#0#9'TMenuItem'#2'N3'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#12'Quicksmoo' +'th1'#7'Caption'#6#20'3D Smooth background'#7'OnClick'#7#17'Quicksmooth1Clic' +'k'#0#0#9'TMenuItem'#17'OverlaySmoothMenu'#7'Caption'#6#18'3D Smooth overlay' +'s'#7'OnClick'#7#22'OverlaySmoothMenuClick'#0#0#9'TMenuItem'#12'Menu2DSmooth' +#7'Caption'#6#13'2D Smooth all'#7'Checked'#9#7'OnClick'#7#17'Menu2DSmoothCli' +'ck'#0#0#9'TMenuItem'#2'N4'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#10'FlipLRmenu' +#7'Caption'#6#8'Flip L/R'#7'OnClick'#7#15'FlipLRmenuClick'#0#0#9'TMenuItem'#8 +'YokeMenu'#7'Caption'#6#4'Yoke'#8'ShortCut'#3'Y@'#7'OnClick'#7#13'YokeMenuCl' ,'ick'#0#0#9'TMenuItem'#2'N2'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#15'MagnifyMe' +'nuItem'#7'Caption'#6#7'Magnify'#7'OnClick'#7#20'MagnifyMenuItemClick'#0#0#9 +'TMenuItem'#10'Crosshair1'#7'Caption'#6#9'Crosshair'#7'OnClick'#7#15'ToolSel' +'ectClick'#0#0#9'TMenuItem'#9'MenuItem1'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#7 +'MNIMenu'#7'Caption'#6#15'MNI coordinates'#7'OnClick'#7#12'MNIMenuClick'#0#0 +#9'TMenuItem'#10'Landmarks1'#7'Caption'#6#9'Landmarks'#7'OnClick'#7#15'Landm' +'arks1Click'#0#0#0#9'TMenuItem'#8'Display1'#7'Caption'#6#6'Window'#0#9'TMenu' +'Item'#10'ShowRender'#7'Caption'#6#6'Render'#8'ShortCut'#3'R@'#7'OnClick'#7 +#15'ShowRenderClick'#0#0#9'TMenuItem'#14'ShowMultislice'#7'Caption'#6#10'Mul' +'tislice'#8'ShortCut'#3'M@'#7'OnClick'#7#19'ShowMultisliceClick'#0#0#9'TMenu' +'Item'#9'HistoMenu'#7'Caption'#6#9'Histogram'#8'ShortCut'#3'H@'#7'OnClick'#7 +#14'HistoMenuClick'#0#0#9'TMenuItem'#10'N4DTraces1'#7'Caption'#6#9'4D Traces' +#8'ShortCut'#3'D@'#7'OnClick'#7#15'N4DTraces1Click'#0#0#9'TMenuItem'#7'Heade' +'r1'#7'Caption'#6#11'Information'#8'ShortCut'#3'I@'#7'OnClick'#7#12'Header1C' +'lick'#0#0#0#9'TMenuItem'#5'Help1'#7'Caption'#6#5'&Help'#0#9'TMenuItem'#12'P' +'references1'#7'Caption'#6#14'Preferences...'#7'OnClick'#7#17'Preferences1Cl' +'ick'#0#0#9'TMenuItem'#6'About1'#7'Caption'#6#5'About'#7'OnClick'#7#11'About' +'1Click'#0#0#0#0#11'TSaveDialog'#11'SaveDialog1'#7'OnClose'#7#16'SaveDialog1' +'Close'#10'DefaultExt'#6#4'.bmp'#6'Filter'#6#11'Bitmap|.bmp'#11'FilterIndex' +#2#0#4'left'#2#18#3'top'#3#212#0#0#0#12'TColorDialog'#12'ColorDialog1'#5'Col' +'or'#7#7'clBlack'#20'CustomColors.Strings'#1#6#13'ColorA=000000'#6#13'ColorB' +'=000080'#6#13'ColorC=008000'#6#13'ColorD=008080'#6#13'ColorE=800000'#6#13'C' +'olorF=800080'#6#13'ColorG=808000'#6#13'ColorH=808080'#6#13'ColorI=C0C0C0'#6 +#13'ColorJ=0000FF'#6#13'ColorK=00FF00'#6#13'ColorL=00FFFF'#6#13'ColorM=FF000' +'0'#6#13'ColorN=FF00FF'#6#13'ColorO=FFFF00'#6#13'ColorP=FFFFFF'#6#13'ColorQ=' +'C0DCC0'#6#13'ColorR=F0CAA6'#6#13'ColorS=F0FBFF'#6#13'ColorT=A4A0A0'#0#4'lef' +'t'#2'2'#3'top'#3#212#0#0#0#6'TTimer'#18'RefreshImagesTimer'#7'Enabled'#8#8 +'Interval'#2#20#7'OnTimer'#7#23'RefreshImagesTimerTimer'#4'left'#2'R'#3'top' +#3#212#0#0#0#6'TTimer'#18'RescaleImagesTimer'#7'Enabled'#8#8'Interval'#2'2'#7 +'OnTimer'#7#23'RescaleImagesTimerTimer'#4'left'#3#178#0#3'top'#3#212#0#0#0#6 +'TTimer'#9'YokeTimer'#7'Enabled'#8#8'Interval'#3#200#0#7'OnTimer'#7#14'YokeT' +'imerTimer'#4'left'#3#24#1#3'top'#3#8#1#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/nifti_img_view.lfm0000664000175000017500000021136011660465464021366 0ustar michaelmichaelobject ImgForm: TImgForm Left = 867 Height = 469 Top = 208 Width = 1025 ActiveControl = ControlPanel AllowDropFiles = True Caption = 'MRIcroN' ClientHeight = 469 ClientWidth = 1025 DockSite = True Font.Name = 'MS Sans Serif' Menu = MainMenu1 OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy OnDropFiles = FormDropFiles OnKeyDown = FormKeyDown OnKeyPress = FormKeyPress OnResize = FormResize OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.30.2' object ControlPanel: TPanel Left = 0 Height = 40 Top = 0 Width = 1025 Align = alTop BevelOuter = bvNone ClientHeight = 40 ClientWidth = 1025 ParentColor = False ParentShowHint = False ShowHint = True TabOrder = 0 OnDblClick = ControlPanelDblClick object LabelX: TLabel Left = 6 Height = 18 Top = 12 Width = 9 Caption = 'X' ParentColor = False end object LabelY: TLabel Left = 81 Height = 18 Top = 12 Width = 9 Caption = 'Y' ParentColor = False end object LabelZ: TLabel Left = 153 Height = 18 Top = 12 Width = 8 Caption = 'Z' ParentColor = False end object HideROIBtn: TSpeedButton Left = 808 Height = 30 Hint = 'Briefly hide VOIs and Overlays' Top = 4 Width = 30 Glyph.Data = { 36060000424D3606000000000000360000002800000010000000180000000100 2000000000000006000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00C61C1D25C000007F8C4545BCB70B0BCBBF0101E8C00000F6C000 00DBC00000BDC00000A0C0000082C0000063C0000024FFFFFF00FFFFFF00D65D 5F3CCF4142C4C82525FF8D4C4CFF47A0A0FF42A8A8FF983535FFC00000FFC000 00FFC00000FFC00000FF9A3333FFC00000FFC00000FFC00000C5DE828486D866 67FDD14A4BFFCA2D2EFFAB3030FF30BFBFFF30BFBFFF854F4FFFC00000FFC000 00FFBF0101FF7E5858FF3EADADFF519494FFAF1616FFC0000095E08A8DBBDA6E 70FFD35253FFCC3536FFAB393AFF8C4646FF7A5E5EFFBF0101FFC00000FFC000 00FFC00000FF854F4FFF30BFBFFF37B6B6FFA62222FFC000003EE2939557DB77 78FFD55A5CFFCE3E3FFFB63636FFC10505FFBB0707FFC00000FFC00000FFC000 00FFB21212FF973737FF6F6C6CFF933C3CFFBA0808E5C0000001E49B9E07DD7F 81ECD26768FFA26F70FF4BB0B0FF746F6FFFB80A0AFFC00000FFBB0606FFA327 27FF4E9797FF7E5757FFB80B0BFFBD0404FFC000008FFFFFFF00FFFFFF00DF87 8990D96B6CFF729FA0FF33CCCCFF49A9A9FFBD0404FFC00000FFC00000FF5F81 81FF30BFBFFF4C9A9AFFBF0101FFC00000FFC0000038FFFFFF00FFFFFF00E190 922CDB7375FF889394FF54AFAFFF85696AFFAF1818FFC00000FFC00000FF7268 68FF45A3A3FF776161FFAF1616FFC00000E0FFFFFF00FFFFFF00FFFFFF00FFFF FF00DD7B7DC9D65F61FFB95758FFC82828FFC20A0AFFC00000FFC00000FFC000 00FFA62222FFBF0101FFC00000FFC0000089FFFFFF00FFFFFF00FFFFFF00FFFF FF00DF848665AC8788FFD14B4DFFCB2F30FFC41313FFC00000FFC00000FFA820 20FFC00000FFC00000FFC00000FFC0000032FFFFFF00FFFFFF00FFFFFF00FFFF FF00E18C8E0D4CCDCEFB62AFB0FFC73C3DFFC61B1BFFC00000FF943A3AFF4E97 97FF637C7CFFA62222FFC00000DAFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF005AC8C8CC4DC4C5FFC44A4BFFC82324FFC10707FF8E4343FF30BF BFFF33BBBBFFAC1A1AFFC0000083FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF005ACCCD6BBB787AFFCB4D4EFFCA2C2CFFC30F0FFF904040FF637B 7BFF726767FFA91E1EFFC000002CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF0000FFFF03D96C6ED6D25052FFC93738FFC51818FFC00000FFBD04 04FFB41010FFC00000D4FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00DB757772D4595AFF957273FF945959FFA62525FFC000 00FFC00000FFC000007DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00DD7D7F159F898AFB37CDCEFF32C9C9FF9A3E3EFFC000 00FFC00000FFC0000026FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00B08587B642C7C7FF42BCBCFF836263FFC000 00FFC00000CEFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00CE7A7B4AD1585AFF9A6B6BFFC61D1DFFC000 00FFC0000077FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00DC7A7C02D65D5FE1CF4142FFB6393AFFC209 09FFC0000021FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D8666780AA6B6CFF5AA1A2FF845E 5ED7FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00DA6E701F9F7C7DFD33CDCDFF6886 879AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00948D8ECA689E9EFE8A67 6727FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D7636455D04648C2FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00D96B6D06D24F5057FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnMouseDown = HideROIBtnMouseDown OnMouseUp = HideROIBtnMouseUp end object XBarBtn: TSpeedButton Left = 838 Height = 30 Hint = 'Toggle Crosshairs'#13#10'right-click to change gap size'#13#10'right+ctrl click to change color'#13#10'right+alt click to change thickness'#13#10'right+shift to reposition origin'#13#10'right+ctrl+alt to adjust font size' Top = 4 Width = 30 AllowAllUp = True Glyph.Data = { D6080000424DD608000000000000360000002800000017000000180000000100 200000000000A008000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00C0000039C0000034FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF000000FF140000FF500000FF0AFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00C00000B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF400000FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00C00000B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FF400000FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00C00000B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 FF400000FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C000 00B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF400000 FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF190000FF500000FF500000FF500000FF50760063CE7100 68C30000FF500000FF500000FF500000FF500000FF500000FF7C0000FFFF0000 FF660000FF500000FF500000FF500000FF500000FF500000FF500000FF500000 FF190000FF500000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF500000 FF050000FF100000FF100000FF100000FF10B00016BCAE0018AD0000FF100000 FF100000FF100000FF100000FF100000FF4C0000FFFF0000FF2E0000FF100000 FF100000FF100000FF100000FF100000FF100000FF100000FF05FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00C00000B8C00000A8FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF000000FF400000FFFF0000FF20FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00C00000B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF400000FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00C00000B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FF400000FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00C00000B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 FF400000FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C000 00B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF400000 FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C00000B8C000 00A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF400000FFFF0000 FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C00000B8C00000A8FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF400000FFFF0000FF20FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C000 004DC00000F8C00000F8C00000F8C00000F8C00000FDC00000FDC00000F8C000 00F8C00000F8C00000F8C00000F88F0041FA0000FFFFA70021F9C00000F8C000 00F8C00000F8C00000F8C00000F8C00000F8C00000F8C000004DC0000020C000 0068C0000068C0000068C0000068C00000D5C00000CBC0000068C0000068C000 0068C0000068C00000686900738E0000FFFF8E00427BC0000068C0000068C000 0068C0000068C0000068C0000068C0000068C0000020FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00C00000B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF400000FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00C00000B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FF400000FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00C00000B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 FF400000FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C000 00B8C00000A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF400000 FFFF0000FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C00000B8C000 00A8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF400000FFFF0000 FF20FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C00000B8C00000A8FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF400000FFFF0000FF20FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00C0000039C0000034FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF000000FF140000FF500000FF0AFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } GroupIndex = 321 NumGlyphs = 0 OnClick = XBarBtnClick OnMouseDown = XBarBtnMouseDown ShowHint = True ParentShowHint = False end object LayerPanel: TPanel Left = 304 Height = 36 Top = 2 Width = 500 ClientHeight = 36 ClientWidth = 500 TabOrder = 5 object AutoContrastBtn: TSpeedButton Left = 121 Height = 28 Hint = 'Autocontrast' Top = 3 Width = 28 Glyph.Data = { D6080000424DD608000000000000360000002800000018000000170000000100 200000000000A008000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000022191919632E2E 2EA53F3F3FC2525252D74F4F4FD53C3C3CC02D2D2D9F1111115F0000001AFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF000000000C2E2E2EA8777777E8C6C6C6FEF4F4 F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0FF181818FF313030F22A28 289D00000005FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0023232353454545DADCDCDCFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B1616FF1A1010FF271A 1AFF322828EA231E1E3BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF003030309E969696F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFF2C2020FF2F1C1CFF3A23 23FF3E2525FF5A4545F840363685FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF0024242459909090F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFFFF5F5FF3A2828FF422828FF5131 31FF573434FF4F2F2FFF594040F82B1F1F3DFFFFFF00FFFFFF00FFFFFF000000 00164A4A4ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFFFFF3F3FF422D2DFF4E2F2FFF643C 3CFF704343FF613A3AFF4B2D2DFF483636E8110A0A0AFFFFFF00FFFFFF003030 30C2E8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFAFAFFFDFD FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFFFFF2F2FF432D2DFF4F2F2FFF663D 3DFF754646FF633B3BFF4C2E2EFF422E2EFF3A3131AEFFFFFF000000002D8B8B 8BEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F0EFFF826868FFF4F2 F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFFFF5F5FF3C2929FF452929FF5533 33FF5C3737FF533232FF422828FF2D1B1BFF3C3333F20000000921212172CFCF CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8DFDFFF835E5DFF633E3EFFF4F2 F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FF2F2121FF331F1FFF3F26 26FF432828FF3D2525FF301D1DFF1F1313FF201C1CFE0303033C313131B1FBFB FBFFFFFFFFFFFFFFFFFFFFFFFFFFDECCCBFF8D5D5CFF7A4D4CFF6B4342FF7457 56FF685150FF5C4848FF4F4040FF433838FF363030FF150D0DFF1E1212FF2717 17FF291919FF261717FF1C1111FF0E0808FF020202FF2525258A454545CAFFFF FFFFFFFFFFFFFFFEFEFFD7B7B6FF9F6564FF905B5AFF815250FF734847FF643F 3EFF553535FF462C2BFF372322FF281919FF1A1010FF0B0707FF070404FF0E08 08FF100A0AFF0D0808FF050303FF000000FF000000FF272727C7545454DBFFFF FFFFFFFFFFFFE3C0BFFFB67371FFA76968FF98605EFF895655FF7A4D4CFF6B44 43FF5D3A39FF4E3130FF3F2827FF301E1EFF211515FF130C0BFF040202FF0000 00FF000000FF000000FF000000FF000000FF000000FF2B2B2BDB454545CAFFFF FFFFFFFFFFFFFEFCFBFFD4A6A6FFAF6E6DFFA06563FF915B5AFF825251FF7349 48FF643F3EFF563635FF472D2CFF382323FF291A19FF1A1010FF0C0707FF0000 00FF000000FF000000FF000000FF000000FF000000FF272727C7313131B1FBFB FBFFFFFFFFFFFFFFFFFFFFFEFEFFDAB8B7FFA76A68FF99605FFF8A5756FF7B4D 4CFF6C4443FF5D3B3AFF4F3231FF402828FF311F1EFF221515FF130C0CFF0403 03FF000000FF000000FF000000FF000000FF020202FF2525258921212172CFCF CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2CACAFFA26968FF925C5AFFE1D6 D5FFF6F4F4FFF5F3F3FFF4F2F2FFF4F2F2FFF3F1F1FF362727FF1B1111FF0C08 07FF000000FF000000FF000000FF000000FF161616FE0303033C0000002D8B8B 8BEEFFFFFFFFFFFEFEFFFFFEFEFFFFFEFEFFFFFFFFFFEADBDBFFA16D6BFFE9DF DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E2C2CFF231615FF140C 0CFF050303FF000000FF000000FF000000FF2A2A2AF100000009FFFFFF003A35 35C4EAE2E2FFFFF7F7FFFFF7F7FFFFF8F8FFFFF8F8FFFFF8F8FFF3E5E5FFF3ED EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF453131FF2B1B1AFF1C11 11FF0D0808FF000000FF000000FF131313FF272727A9FFFFFF00FFFFFF002818 181A645656E3FFF1F1FFFFF1F1FFFFF1F1FFFFF2F2FFFFF2F2FFFFF2F2FFFFF3 F3FFFFF8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C3635FF32201FFF2516 16FF1C1111FF130C0CFF110A0AFF2B2626E500000009FFFFFF00FFFFFF00FFFF FF004F3B3B66A69292F3FFEBEBFFFFEBEBFFFFECECFFFFECECFFFFECECFFFFED EDFFFFEDEDFFFFF0F0FFFFFBFBFFFFFCFCFFFFFBFBFF604140FF503231FF4C2F 2FFF412828FF331F1FFF423434F718141439FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00594545ABB19797F4FFE5E5FFFFE6E6FFFFE6E6FFFFE6E6FFFFE7 E7FFFFE7E7FFFFE7E7FFFFE7E7FFFFE7E7FFFFE7E7FF805353FF6C4242FF603B 3BFF543433FF654D4DF83A323283FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF0063464668846161E5E6C8C8FFFFE0E0FFFFE0E0FFFFE0 E0FFFFE1E1FFFFE1E1FFFFE1E1FFFFE1E1FFFFE1E1FF8F5C5CFF7E4D4DFF764B 4AFF634545EC3328283FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF009A5D5D1D715050BDAA8484F0DAB6B6FEF8D3 D3FFFFDBDBFFFFDBDBFFFFDBDBFFFFDBDBFFF5D2D2FFA06969FF906565F56146 46AA40272707FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004429292C754D4D837C56 56BE8C6363D79D7171E7986E6EE5865F5FD4775353B75B3C3C720B07071BFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = AutoContrastBtnClick end object LutFromZeroBtn: TSpeedButton Left = 439 Height = 28 Hint = 'Color range from zero' Top = 4 Width = 28 AllowAllUp = True Glyph.Data = { AE060000424DAE06000000000000360000002800000018000000170000000100 180000000000780600000000000000000000000000000000000000FF0000FF00 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF0000FF0000000000000000000000FF0000FF0000FF0000FF0000FF0000FF00 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF0000FF0000000000000000000000000000000000FF0000FF0000 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 00FF0000FF0000FF0000FF0000FF0000FF0000000000000000FF000000000000 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00000000000000 00FF0000000000000000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF0000000000000000FF0000000000000000FF0000FF00000000000000000000 00000000000000FF0000FF0000FF0000FF0000FF0000FF0000FF000000000000 0000000000000000000000000000000000FF0000000000000000FF0000FF0000 000000000000000000000000000000FF0000FF0000FF0000FF0000FF0000FF00 00FF000000000000000000000000000000000000000000000000000000000000 0000FF0000FF0000000000000000000000000000000000FF0000FF0000FF0000 FF0000FF0000FF0000FF0000000000000000000000000000000000FF00000000 00000000000000FF0000FF0000FF0000FF0000000000000000000000FF0000FF 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000000000000000000000 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00000000000000 00000000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF000000 0000000000000000FF0000FF0000FF000000FF00FF0000FF0000FF0000FF0000 FF0000FF0000000000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 00FF0000FF0000FF0000000000FF0000FF0000FF0000FF000000FF00FF0000FF 0000FF0000FF0000FF0000FF0000000000FF0000FF0000FF0000FF0000FF0000 FF0000FF0000FF0000FF0000FF0000FF0000000000FF0000FF00808080808080 0000FF8080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080 80808080800000000000000A08080E0808140C0C190F0F1E1212231414281717 2C1A1A311D1D3620203923233A25253A27273A29293A2B2B3A2D2D3A30300000 000000000000008080808080800000000000002C1A1A4428285935356F424284 4F4F9A5C5CB06969C57676DA8383F19090FE9B9BFFA4A4FFACACFFB5B5FFBEBE FFC6C6FFD7D7FFE0E0FFFFFF0000008080808080800000000000002E1B1B4428 285935356F4242844F4F9A5C5CB06969C57676DA8383F19090FE9B9BFFA4A4FF ACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0E0FFFFFF000000808080808080000000 0000002E1B1B4428285935356F4242844F4F9A5C5CB06969C57676DA8383F190 90FE9B9BFFA4A4FFACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0E0FFFFFF00000080 80808080800000000000002E1B1B4428285935356F4242844F4F9A5C5CB06969 C57676DA8383F19090FE9B9BFFA4A4FFACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0 E0FFFFFF0000008080808080800000000000002E1B1B4428285935356F424284 4F4F9A5C5CB06969C57676DA8383F19090FE9B9BFFA4A4FFACACFFB5B5FFBEBE FFC6C6FFD7D7FFE0E0FFFFFF0000008080808080800000000000002E1B1B4428 285935356F4242844F4F9A5C5CB06969C57676DA8383F19090FE9B9BFFA4A4FF ACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0E0FFFFFF000000808080808080000000 0000002E1B1B4428285935356F4242844F4F9A5C5CB06969C57676DA8383F190 90FE9B9BFFA4A4FFACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0E0FFFFFF00000080 8080808080000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080 808080808080808080808080808080808080 } GroupIndex = 194 NumGlyphs = 0 OnClick = LutFromZeroBtnClick end object ColorBarBtn: TSpeedButton Left = 467 Height = 28 Hint = 'Draw color range ' Top = 4 Width = 28 Glyph.Data = { 96030000424D96030000000000003600000028000000180000000C0000000100 180000000000600300006400000064000000000000000000000000FF0000FF00 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF00808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080 808080808080808080808080800000000000000A08080E0808140C0C190F0F1E 12122314142817172C1A1A311D1D3620203923233A25253A27273A29293A2B2B 3A2D2D3A30300000000000000000008080808080800000000000002C1A1A4428 285935356F4242844F4F9A5C5CB06969C57676DA8383F19090FE9B9BFFA4A4FF ACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0E0FFFFFF000000808080808080000000 0000002E1B1B4428285935356F4242844F4F9A5C5CB06969C57676DA8383F190 90FE9B9BFFA4A4FFACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0E0FFFFFF00000080 80808080800000000000002E1B1B4428285935356F4242844F4F9A5C5CB06969 C57676DA8383F19090FE9B9BFFA4A4FFACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0 E0FFFFFF0000008080808080800000000000002E1B1B4428285935356F424284 4F4F9A5C5CB06969C57676DA8383F19090FE9B9BFFA4A4FFACACFFB5B5FFBEBE FFC6C6FFD7D7FFE0E0FFFFFF0000008080808080800000000000002E1B1B4428 285935356F4242844F4F9A5C5CB06969C57676DA8383F19090FE9B9BFFA4A4FF ACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0E0FFFFFF000000808080808080000000 0000002E1B1B4428285935356F4242844F4F9A5C5CB06969C57676DA8383F190 90FE9B9BFFA4A4FFACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0E0FFFFFF00000080 80808080800000000000002E1B1B4428285935356F4242844F4F9A5C5CB06969 C57676DA8383F19090FE9B9BFFA4A4FFACACFFB5B5FFBEBEFFC6C6FFD7D7FFE0 E0FFFFFF00000080808080808000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000008080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080808080808080 8080808080808080808080808080808080808080808080808080 } NumGlyphs = 0 OnMouseDown = ColorBarBtnMouseDown end object LayerDrop: TComboBox Left = 4 Height = 20 Top = 4 Width = 116 ItemHeight = 0 ItemIndex = 0 Items.Strings = ( 'Background Layer' ) OnChange = LayerDropChange OnSelect = LayerDropSelect ParentShowHint = False ShowHint = True Style = csDropDownList TabOrder = 0 Text = 'Background Layer' end object MinWindowEdit: TFloatSpinEdit Left = 153 Height = 16 Top = 4 Width = 88 DecimalPlaces = 4 Increment = 1 MaxValue = 9999999 MinValue = -9999999 OnChange = MinContrastWindowEditChange TabOrder = 1 Value = 1 end object MaxWindowEdit: TFloatSpinEdit Left = 245 Height = 16 Top = 4 Width = 88 DecimalPlaces = 4 Increment = 1 MaxValue = 9999999 MinValue = -9999999 OnChange = MaxContrastWindowEditChange TabOrder = 2 Value = 1 end object LUTdrop: TComboBox Left = 340 Height = 20 Top = 5 Width = 100 DropDownCount = 66 ItemHeight = 0 OnChange = LUTdropChange OnSelect = LUTdropSelect ParentShowHint = False ShowHint = True Style = csDropDownList TabOrder = 3 end end object ZoomDrop: TComboBox Left = 225 Height = 20 Top = 8 Width = 79 DropDownCount = 12 ItemHeight = 0 Items.Strings = ( 'To Fit' 'To Int' 'x1' 'x2' 'x3' 'x4' 'x5' 'x6' 'x7' 'x8' 'x9' ) OnChange = ZoomDropChange OnSelect = ZoomDropSelect ParentShowHint = False ShowHint = True Style = csDropDownList TabOrder = 4 end object XViewEdit: TSpinEdit Left = 24 Height = 16 Top = 12 Width = 52 MinValue = 1 OnChange = XViewEditChange TabOrder = 0 Value = 100 end object YViewEdit: TSpinEdit Left = 97 Height = 16 Top = 12 Width = 52 MinValue = 1 OnChange = XViewEditChange TabOrder = 1 Value = 32 end object ZViewEdit: TSpinEdit Left = 169 Height = 16 Top = 12 Width = 52 MinValue = 1 OnChange = XViewEditChange TabOrder = 2 Value = 14 end object ToolPanel: TPanel Left = 872 Height = 32 Top = 4 Width = 165 BevelOuter = bvNone ClientHeight = 32 ClientWidth = 165 TabOrder = 3 Visible = False object PenBtn: TSpeedButton Left = 0 Height = 30 Hint = 'Pen Tool' Top = 0 Width = 30 AllowAllUp = True Glyph.Data = { F6060000424DF606000000000000360000002800000018000000180000000100 180000000000C00600000000000000000000000000000000000000FF0000FF00 00FF0000FF00C9C9CCBABAD0B1B1D2B0B0D2B4B4D1BCBCCFC6C6CD00FF0000FF 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF0000FF0000FF00CACACCA4A4D57B7BDF3434F13333F23333F23333F13535F1 3737F04343ED5656E96F6FE28B8BDBADADD3C8C8CC00FF0000FF0000FF0000FF 0000FF0000FF0000FF0000FF00A0A0D62F2FF31717F89797D83A3AF03333F233 33F23333F23333F23333F23333F23333F23333F23333F23333F14141EE7575E0 B8B8D000FF0000FF0000FF0000FF0000FF00ABABD36262FB4C4CFF1414F9C7C7 CCC2C2CEAFAFD3A1A1D69A9AD89494D98C8CDB8282DE7878E06D6DE35C5CE742 42EE3333F13333F23D3DEEBABACF00FF0000FF0000FF0000FF007F7FE3B3B3FF 3C3CFF0000FE9494D900FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF00C9C9CC8E8EDA3333F23333F2A5A5D500FF0000FF0000FF0000 FF009F9FDB9898FF3535FF0000FF3F3FEE00FF0000FF0000FF0000FF0000FF00 00FF0000FF0000FF0000FF0000FF00CBCBCC6060E53333F25353E9C9C9CC00FF 0000FF0000FF0000FF00CACACC7676E41A1AFB2E2EF2A8A8D400FF0000FF0000 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF009A9AD73333F13C3CEF B5B5D100FF0000FF0000FF0000FF0000FF00CCCCCCA9A9A93B3B435B5B5DB9B9 B900FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00CACACC4D 4DEA3434F19999D800FF0000FF0000FF0000FF0000FF0000FF00CCCCCC404040 0E0E0E0000001C1C1CB4B4B400FF0000FF0000FF0000FF0000FF0000FF0000FF 0000FF00B8B8D03434F15C5CE7CBCBCC00FF0000FF0000FF0000FF0000FF0000 FF00CBCBCB44444450505000000000000062626200FF0000FF0000FF0000FF00 00FF0000FF0000FF0000FF00C5C5CD4747EC4A4AEBBCBCCF00FF0000FF0000FF 0000FF0000FF0000FF00CBCBCB4646465F5F5F0000000000003F3F3F00FF0000 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00B1B1D24949EB4141ED 9797D8CBCBCC00FF0000FF0000FF0000FF0000FF004949496565650000000000 0030303000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF00C4C4CD7A7ADF3737F05D5DE7B5B5D100FF0000FF0000FF0000FF00505050 69696900000000000024242400FF0000FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF0000FF0000FF00CBCBCCB2B2D25B5BE73A3AEF8B8BDBCACACC00 FF0000FF006969695B5B5B0000000000001D1D1D00FF0000FF0000FF0000FF00 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00CACACC9797 D83E3EEE7B7BDFCBCBCC00FF009191915050500101010000001B1B1B00FF0000 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 00FF0000FF00CBCBCC7B7BDF3B3BEFC2C2CD00FF00BBBBBB3A3A3A0A0A0A0000 0018181800FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF0000FF0000FF00CBCBCCB6B6D16C6CE35353E9A9A9D400FF0000FF00CACACA 323232171717000000101010CBCBCB00FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF0000FF00CBCBCCAEAED36969E46262E59F9FD6CACACC00FF0000 FF0000FF0000FF004B4B4B1515150000000B0B0BC6C6C600FF0000FF0000FF00 00FF0000FF0000FF0000FF00CACACCA0A0D66E6EE27A7ADFB5B5D1CBCBCC00FF 0000FF0000FF0000FF0000FF0000FF00858585020202000000050505BBBBBB00 FF0000FF0000FF0000FF0000FF0000FF00C4C4CD9595D8A5A5D5C8C8CC00FF00 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00BFBFBF0808080000 00000000A3A3A300FF0000FF0000FF0000FF0000FF0000FF00CBCBCC00FF0000 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 00FF004A4A4A00000000000084848400FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF0000FF0000FF0000FF00A6A6A603030300000065656500FF0000FF0000FF00 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0041414100000046464600 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00AAAA AA05050525252500FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 } GroupIndex = 44 NumGlyphs = 0 OnClick = PenBtnClick end object ClosedPenBtn: TSpeedButton Left = 30 Height = 30 Hint = 'Autoclose Pen' Top = 0 Width = 30 AllowAllUp = True Glyph.Data = { F6060000424DF606000000000000360000002800000018000000180000000100 180000000000C00600000000000000000000000000000000000000FF0000FF00 00FF0000FF00C9C9CCBABAD0B1B1D2B0B0D2B4B4D1BCBCCFC6C6CD00FF0000FF 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF0000FF0000FF00CACACCA4A4D57B7BDF3434F13333F23333F23333F13535F1 3737F04343ED5656E96F6FE28B8BDBADADD3C8C8CC00FF0000FF0000FF0000FF 0000FF0000FF0000FF0000FF00A0A0D62F2FF31717F89797D83A3AF03333F233 33F23333F23333F23333F23333F23333F23333F23333F23333F14141EE7575E0 B8B8D000FF0000FF0000FF0000FF0000FF00ABABD36262FB4C4CFF1414F9C7C7 CCC2C2CEAFAFD3A1A1D69A9AD89494D98C8CDB8282DE7878E06D6DE35C5CE742 42EE3333F13333F23D3DEEBABACF00FF0000FF0000FF0000FF007F7FE3B3B3FF 3C3CFF0000FE9494D900FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF00C9C9CC8E8EDA3333F23333F2A5A5D500FF0000FF0000FF0000 FF009F9FDB9898FF3535FF0000FF3F3FEE00FF0000FF0000FF0000FF0000FF00 00FF0000FF0000FF0000FF0000FF00CBCBCC6060E53333F25353E9C9C9CC00FF 0000FF0000FF0000FF00CACACC7676E41A1AFB2E2EF2A8A8D400FF0000FF00FF 0000FF000000FF0000FF0000FF0000FF0000FF0000FF009A9AD73333F13C3CEF B5B5D100FF0000FF0000FF0000FF0000FF00CCCCCCA9A9A93B3B435B5B5DB9B9 B900FF00FF0000FF0000FF0000FF000000FF0000FF0000FF0000FF00CACACC4D 4DEA3434F19999D800FF0000FF0000FF0000FF0000FF0000FF00CCCCCC404040 0E0E0E0000001C1C1CB4B4B4FF0000FF0000FF0000FF000000FF0000FF0000FF 0000FF00B8B8D03434F15C5CE7CBCBCC00FF0000FF0000FF0000FF0000FF0000 FF00CBCBCB44444450505000000000000062626200FF00FF0000FF000000FF00 00FF0000FF0000FF0000FF00C5C5CD4747EC4A4AEBBCBCCF00FF0000FF0000FF 0000FF0000FF0000FF00CBCBCB4646465F5F5F0000000000003F3F3F00FF0000 FF0000FF0000FF00FF0000FF000000FF0000FF0000FF00B1B1D24949EB4141ED 9797D8CBCBCC00FF0000FF0000FF0000FF0000FF004949496565650000000000 0030303000FF0000FF0000FF00FF0000FF0000FF0000FF000000FF0000FF0000 FF00C4C4CD7A7ADF3737F05D5DE7B5B5D100FF0000FF0000FF0000FF00505050 69696900000000000024242400FF0000FF0000FF00FF0000FF0000FF0000FF00 0000FF0000FF0000FF0000FF00CBCBCCB2B2D25B5BE73A3AEF8B8BDBCACACC00 FF0000FF006969695B5B5B0000000000001D1D1D00FF0000FF0000FF0000FF00 FF0000FF000000FF0000FF0000FF0000FF0000FF0000FF0000FF00CACACC9797 D83E3EEE7B7BDFCBCBCC00FF009191915050500101010000001B1B1B00FF0000 FF0000FF0000FF0000FF0000FF0000FF00FF0000FF000000FF0000FF0000FF00 00FF0000FF00CBCBCC7B7BDF3B3BEFC2C2CD00FF00BBBBBB3A3A3A0A0A0A0000 0018181800FF0000FF0000FF0000FF0000FF0000FF00FF0000FF0000FF0000FF 000000FF0000FF00CBCBCCB6B6D16C6CE35353E9A9A9D400FF0000FF00CACACA 323232171717000000101010CBCBCB00FF0000FF0000FF0000FF0000FF00FF00 00FF0000FF0000FF0000CBCBCCAEAED36969E46262E59F9FD6CACACC00FF0000 FF0000FF0000FF004B4B4B1515150000000B0B0BC6C6C600FF0000FF0000FF00 00FF0000FF0000FF00FF0000FF0000A0A0D66E6EE27A7ADFB5B5D1CBCBCC00FF 0000FF0000FF0000FF0000FF0000FF00858585020202000000050505BBBBBB00 FF0000FF0000FF0000FF0000FF0000FF00C4C4CD9595D8A5A5D5C8C8CC00FF00 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00BFBFBF0808080000 00000000A3A3A300FF0000FF0000FF0000FF0000FF0000FF00CBCBCC00FF0000 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 00FF004A4A4A00000000000084848400FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF0000FF0000FF0000FF00A6A6A603030300000065656500FF0000FF0000FF00 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF 0000FF0000FF0000FF0000FF0000FF0000FF0000FF0041414100000046464600 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 00FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00AAAA AA05050525252500FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF00 } GroupIndex = 44 NumGlyphs = 0 OnClick = PenBtnClick end object FillBtn: TSpeedButton Left = 60 Height = 30 Hint = 'Fill tool' Top = 0 Width = 30 AllowAllUp = True Glyph.Data = { D6080000424DD608000000000000360000002800000017000000180000000100 200000000000A008000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF000000FF080000FF4F0000FF7A0000FF930000FFAB0000FFC40000 FFDD0000FFF50000FFEF0000FFD30000FFB80000FF9C0000FF810000FF540000 FF03FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF040000FF480000 FFA00000FFF10000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFDD0000 FF24FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF9C0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF8EFFFF FF00FFFFFF00FFFFFF00FFFFFF000000FFD40000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFE0000FF40FFFFFF00FFFF FF00FFFFFF00FFFFFF000000FF410000FFF80000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFED0000FFB60000FF36FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF000000FF300000FFD60000FFFF0000FFFF0000FFFF0000 FFFC0000FFE30000FFD10000FFBF0000FFAD0000FF9B0000FF7D0000FF4E0000 FF1E540000195C09095D54000007FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF000000FF100000FFD70000FF4F0000FF290000FF06FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006512126A7625 25E4B46D6EF8722323E16818188C54000003FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF660000FFABFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF005400001C691717C6AC5F60F1FBBBBDFFFDC3 C5FFFDC9CBFFBE8283F5681919C35400000DFFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFCF0000FF82FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF006612126F782525E5E49A9BFFFDBBBDFFFDC1C3FFFDC7C9FFFCCD CFFFFCD3D5FFD9ABADFC681B1BCB54000003FFFFFF00FFFFFF000000FF250000 FFFF0000FF59FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005400001E6A15 16C9B05E5EF2FCB2B3FFFDB9BAFFFDBFC0FFFDC5C7FFFCCBCDFFFCD1D3FFFCD7 D9FFFCDDDFFFBD8E90F566191A8FFFFFFF00FFFFFF000000FF7A0000FFFF0000 FF39FFFFFF00FFFFFF00FFFFFF0054000001661111747A2525E5E79494FFFEB1 B2FFFDB7B8FFFDBDBEFFFDC3C4FFFDC9CBFFFCCFD1FFFCD4D7FFFCDADDFFFCE0 E3FFFBE6E9FF803E3FE854000023FFFFFF000000FFA70000FFFF0000FF50FFFF FF00FFFFFF00540000216A1414CBB45C5CF3FDA8A9FFFEAFB0FFFDB5B6FFFDBB BCFFFDC1C2FFFDC6C8FFFCCCCEFFFCD2D5FFFCD8DBFFFCDEE1FFFBE4E7FFFBEA EDFFD7BCBFFF681E1E9CFFFFFF000000FF990000FFFF0000FF82540000016711 11787C2424E6E98D8DFFFEA7A7FFFEADADFFFDB3B4FFFDB8BAFFFDBEC0FFFDC4 C6FFFCCACCFFFCD0D2FFFCD6D9FFFCDCDFFFFCE2E5FFFBE8EBFFFBEEF1FFFBF4 F7FF692020E4FFFFFF000000FF290000FFF40000FEF1471464E6722732FCDF82 82FFFEA5A5FFFEAAABFFFEB0B1FFFDB6B8FFFDBCBEFFFDC2C4FFFDC8CAFFFCCE D0FFFCD4D6FFFCDADDFFFCE0E3FFFBE6E9FFFBECEFFFFBF1F5FFAF8688F3661B 1B86FFFFFF00FFFFFF000000FF160D00D99B3525CDF9433FF3FF452BB9FF813A 48FFD78787FFFDB4B5FFFDBABBFFFDC0C2FFFDC6C8FFFCCCCEFFFCD2D4FFFCD8 DAFFFCDEE0FFFBE4E7FFFBE9EDFFFBEFF3FFD3BBBEFD671C1DBFFFFFFF00FFFF FF00FFFFFF00FFFFFF005400000C6D2524E0ADA7F3FF0000FFFF1615FDFF5B33 8EFFC37C7DFFFDBEBFFFFDC4C5FFFCCACCFFFCD0D2FFFCD6D8FFFCDBDEFFFCE1 E4FFFBE7EAFFFBEDF1FFEBDBDFFF6A2121DC5400000DFFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF005F10105CA57775EF413FFCFF0000FFFF0000FFFF5032 A9FFB77576FFFDC8C9FFFCCDD0FFFCD3D6FFFCD9DCFFFCDFE2FFFBE5E8FFFBEB EEFFF8ECF0FF773435E754000029FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00681D1DC9C5B7DBFF0606FFFF0000FFFF0000FFFF5037 B8FFA96A6AFFFCD1D4FFFCD7DAFFFCDDE0FFFBE3E6FFFBE9ECFFFBEFF2FF9660 62ED6316165CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF0054000026763130E7A39CF1FF0404FFFF0000FFFF0000FFFF503B C5FFAB7071FFFCDBDEFFFCE1E4FFFBE7EAFFFBEDF0FFBF9B9DF7671C1D9CFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF005D0D0C3D753130E5A89FECFF0606FFFF0000FFFF0000FFFF5D33 88FFE3BEBFFFFBE5E8FFFBEBEEFFDEC7CAFF681E1FCB54000003FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF005705052D712B2AE1ACA2E6FF0909FFFF0000FFFF1312FCFF7C41 57FFFBE8ECFFF1E0E4FF6E2627E054000015FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00540000206F2726DBC0B2D9FF5D5BFBFF0404FFFF4532CAFFC29C 9EFF814142E95B0A0B38FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00540000166B2221BA8B4F4EE5C7B6D1FFDCD3EBFF773232FC671B 1C72FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00540000206A201FA56C2323E7691F1FBEFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } GroupIndex = 44 NumGlyphs = 0 OnClick = PenBtnClick end object EllipseBtn: TSpeedButton Left = 90 Height = 30 Hint = 'Ellipse Tool' Top = 0 Width = 30 AllowAllUp = True Glyph.Data = { 76080000424D7608000000000000360000002800000018000000160000000100 2000000000004008000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF070000FF670000FFB3FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF1A0000FF2C0000FF03FFFF FF00FFFFFF00FFFFFF00FFFFFF000000FF053131FFBF3E3EFFFF0000FFCBFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF1F0000FFA70000FFE50000FFFF0000FFFF0000FFF50000 FFC30000FF52FFFFFF00FFFFFF000000FF38A6A6FFFF3535FFFF0000FFF90000 FF14FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FF640000FFF20000FFCB0000FF680000FF340000FF220000FF550000 FF9A0000FFFD0000FFA60000FF100707FF24A3A3FFFF2C2CFFFF0000FFFF0000 FF6CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 FF4E0000FFFE0000FF7C0000FF04FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FF3D0000FFE10000FFADFFFFFF002C2CFF5D0F0FFFD80000FF9C0000 FF12FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF120000 FFE70000FF93FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF360000FFFC0000FF5954000027540000B95400008C5400 0008FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF7F0000 FFE00000FF0AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF000000FF8A0000FFE05A09098B5F1010FF540000FF5400 00CF54000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FFB70000 FF99FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FF050000FF080000FF3C0000FFFF5A0F1AC0804141FF540000FF5400 00FF4D0015480000FF080000FF080000FF080000FF080000FF080000FFEB0000 FF68FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFB00000FFFF0000FFFF0000FFFF380055FF834646FF540000FF5400 00FF250090FF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFEB0000 FF68FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFB00000FF8D0000FF2E0000FFFB40003CBE824545FF540000FF5400 00FF480024910000FF280000FF280000FF280000FF490000FFFF0000FFB70000 FF98FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFB00000FF780000FF350000FFFF4C001784824444FF540000FF5400 00FF54000088FFFFFF00FFFFFF00FFFFFF000000FF280000FFFF0000FF810000 FFDD0000FF08FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFB00000FF780000FF860000FFE254000044824444FF540000FF5400 00FF54000091FFFFFF00FFFFFF00FFFFFF000000FF280000FFFF0000FF150000 FFEA0000FF8DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFB00000FF920000FFFB0000FF5F54000009814343FA550101FF5400 00FF54000099FFFFFF00FFFFFF00FFFFFF000000FF280000FFFFFFFFFF000000 FF530000FFFD0000FF740000FF02FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFC10000FFEE0000FFB3FFFFFF00FFFFFF006D2525C6580606FF5400 00FF540000A1FFFFFF00FFFFFF00FFFFFF000000FF280000FFFFFFFFFF00FFFF FF000000FF6C0000FFF50000FFC40000FF600000FF2C0000FF1A0000FF4D0000 FF920000FFFE0000FFD40000FF13FFFFFF00FFFFFF005502027D590808FF5400 00FF540000A9FFFFFF00FFFFFF00FFFFFF000000FF280000FFFFFFFFFF00FFFF FF00FFFFFF000000FF240000FFAF0000FFEC0000FFFF0000FFFF0000FFF90000 FFCB0000FFCC0000FF78FFFFFF00FFFFFF00FFFFFF005400003A550101FF5400 00FF540000C7FFFFFF00FFFFFF00FFFFFF000000FF280000FFFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF220000FF340000FF07FFFF FF000000FFB00000FF78FFFFFF00FFFFFF00FFFFFF0054000004540000F35400 00FF540000FE5400001AFFFFFF00FFFFFF000000FF280000FFFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFB00000FF78FFFFFF00FFFFFF00FFFFFF00FFFFFF00540000A05400 00FF540000FF5400006CFFFFFF00FFFFFF000000FF280000FFFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFB00000FF78FFFFFF00FFFFFF00FFFFFF00FFFFFF00540000215400 00FA540000FF540000BEFFFFFF00FFFFFF000000FF280000FFFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFB00000FF78FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005400 0095540000FF540000FB5400000FFFFFFF000000FF280000FFFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FFB00000FFF30000FFE80000FFE80000FFE80000FFE80000FFE80900 E4EA510008FE540000FF0B00DDEB0000FFE80000FFEB0000FFFFFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FF310000FF480000FF480000FF480000FF480000FF480000FF480000 FF4835005E844C0017D00300F54A0000FF480000FF480000FF48 } GroupIndex = 44 NumGlyphs = 0 OnClick = PenBtnClick end object Fill3DBtn: TSpeedButton Left = 120 Height = 30 Hint = 'Create VOI based on background intensity' Top = 0 Width = 30 AllowAllUp = True Glyph.Data = { D6080000424DD608000000000000360000002800000018000000170000000100 200000000000A008000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF1C0000FF510000 FF830000FFB50000FFE70000FFE70000FFB50000FF830000FF510204FF1CFFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF000000FF0B0000FF8D0000FFFC0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0102FFFF0A11FFFF121CFFFC1725 FF8D1A2AFF0BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF000000FF460000FFDF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0305FFFF0E17FFFF1827FFFF2134FFFF273E FFFF2B44FFDF2B45FF46FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF870000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0D15FFFF1A29FFFF253CFFFF2F4BFFFF3757 FFFF3B5FFFFF3C60FFFF395BFF87FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FF4A0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF080CFFFF1623FFFF2439FFFF314EFFFF3D60FFFF4670 FFFF4C79FFFF4D7AFFFF4974FFFF4167FF4AFFFFFF00FFFFFF00FFFFFF000000 FF160000FFE90000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0D16FFFF1D2EFFFF2C46FFFF3A5DFFFF4872FFFF5485 FFFF5C93FFFF5E95FFFF588CFFFF4D7BFFE94066FF16FFFFFF00FFFFFF000000 FFB40000FFFF0000FFFF0000DAFF0000B9FF0000A0FF0000B8FF0000DEFF0000 FDFF0000FFFF0102FFFF111BFDFF1927BFFF253ABFFF304CBFFF3C5FBFFF4670 BFFF5688CCFF649FE7FF649EFEFF5689FFFF4771FFB4FFFFFF000000FF2A0000 FFFF0000E0FF000045FF000000FF000000FF000000FF000000FF000000FF0000 39FF0000DEFF0203FFFF111CF5FF000000FF000000FF000000FF000000FF0000 00FF000000FF000000FF0E1723FF345396FF4974FFFF395AFF2A0000FF600000 FEFF00003DFF000000FF000000FF00007BFF0000ECFF00008DFF000000FF0000 00FF000033FF0001FFFF0F19F5FF000000FF000000FF000000FF111C39FF1F32 56FF152133FF000000FF000000FF000000FF253C8AFF3656FF600000FF960000 FFFF0000FDFF0000E7FF0000CDFF0000FAFF0000FFFF0000DEFF000000FF0000 00FF000001FF0000F2FF0C13F5FF000000FF000000FF000000FF2A429AFF5180 FFFF588CFFFF253A68FF000000FF000000FF050713FF304CFF960000FFCB0000 FFFF0000FFFF0000FFFF0000FFFF0000BBFF00006BFF000027FF000000FF0000 00FF00006AFF0000FFFF060AF5FF000000FF000000FF000000FF22379AFF426A FFFF4872FFFF314EABFF000000FF000000FF000000FF2135D9D10000FFF20000 FFFF0000FFFF0000FFFF0000FFFF0000AAFF000003FF000000FF000000FF0000 7EFF0000FFFF0000FFFF0000F5FF000000FF000000FF000000FF1B2A9AFF3351 FFFF3758FFFF1F318BFF000000FF000000FF000000FF1927E2F30000FFC80000 FFFF0000F8FF0000D9FF0000B8FF0000F6FF0000ECFF00003EFF000000FF0000 00FF0000AEFF0000FFFF0000F5FF000000FF000000FF000000FF121C9AFF2338 FFFF2135D9FF080C32FF000000FF000000FF03051EFF0F19FFC80000FF920000 FFFF000085FF000000FF000000FF00005DFF0000ADFF00002FFF000000FF0000 00FF0000BCFF0000FFFF0000F5FF000000FF000000FF000000FF010218FF0203 16FF000000FF000000FF000000FF000002FF070BB4FF0203FF920000FF5C0000 FFFF0000FFFF00007BFF00000FFF000000FF000000FF000000FF00000FFF0000 7DFF0000FFFF0000FFFF0000F5FF000000FF000000FF000000FF000000FF0000 00FF000003FF01011FFF01024EFF0001CEFF0000FFFF0000FF5C0000FF250000 FFFF0007FFFF000FFFFF0010FAFF000EE1FF000BD5FF0005E6FF0000FBFF0000 FFFF0000FFFF0000FFFF0000FFFF0000EFFF0000EFFF0000EFFF0000EFFF0000 EFFF0000FBFF0000FFFF0000FFFF0000FFFF0000FFFF0000FF25FFFFFF00001C FFB5001DFFFF001DFFFF001CFFFF001CFFFF001BFFFF001BFFFF0017FFFF000A FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFA4FFFFFF00FFFFFF000032 FF170026FFE80023FFFF0023FFFF0022FFFF0021FFFF0020FFFF0020FFFF001F FFFF0017FFFF0004FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0001 FFFF0007FFFF000EFFFF0012FFFF0014FFE60021FF16FFFFFF00FFFFFF00FFFF FF000034FF55002BFFFD002AFFFF0029FFFF0028FFFF0027FFFF0026FFFF0025 FFFF0025FFFF0023FFFF0010FFFF0008FFFF000BFFFF000EFFFF0016FFFF001E FFFF001FFFFF001EFFFF001EFFFD0020FF4FFFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00002CFF880031FFFD0030FFFF002FFFFF002EFFFF002EFFFF002C FFFF002CFFFF002BFFFF002AFFFF002AFFFF0028FFFF0028FFFF0027FFFF0026 FFFF0025FFFF0025FFFD0022FF87FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF000041FF4A003DFFDE0037FFFF0036FFFF0035FFFF0035 FFFF0033FFFF0032FFFF0032FFFF0031FFFF0030FFFF002FFFFF002EFFFF002E FFFF0030FFDD0031FF47FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF000093FF110042FF93003EFFF9003DFFFF003C FFFF003BFFFF003BFFFF003AFFFF0038FFFF0038FFFF0037FFFF0035FFF9003A FF92007BFF0EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000055FF12005BFF5B004F FF8E004AFFB90046FFDF0046FFDF0048FFBA004CFF8E0051FF590045FF10FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } GroupIndex = 44 NumGlyphs = 0 OnClick = Fill3DBtnClick end end end object MagPanel: TPanel Left = 0 Height = 18 Top = 451 Width = 1025 Align = alBottom BevelOuter = bvNone ClientHeight = 18 ClientWidth = 1025 TabOrder = 1 object StatusLabel: TLabel Left = 2 Height = 18 Top = 2 Width = 134 Caption = ' No Images Loaded ' ParentColor = False end object ProgressBar1: TProgressBar Left = 875 Height = 18 Top = 0 Width = 150 Align = alRight Anchors = [akRight, akBottom] BorderWidth = 1 TabOrder = 0 end end object Panel1: TPanel Left = 0 Height = 411 Top = 40 Width = 1025 Align = alClient BevelOuter = bvNone ClientHeight = 411 ClientWidth = 1025 TabOrder = 2 object TriplePanel: TScrollBox Tag = 666 Left = 0 Height = 411 Top = 0 Width = 1025 Align = alClient ClientHeight = 411 ClientWidth = 1025 Constraints.MinWidth = 5 Color = clBlack ParentColor = False TabOrder = 0 OnClick = ImgPanelClick object PGImageCor: TImage Tag = 2 Cursor = crCross Left = 1 Height = 12 Top = 1 Width = 12 AutoSize = True OnDblClick = PGImageCorDblClick OnMouseDown = PGImageMouseDown OnMouseMove = PGImageMouseMove OnMouseUp = PGImageMouseUp Stretch = True end object PGImageSag: TImage Tag = 3 Cursor = crCross Left = 323 Height = 12 Top = 110 Width = 12 AutoSize = True OnDblClick = PGImageCorDblClick OnMouseDown = PGImageMouseDown OnMouseMove = PGImageMouseMove OnMouseUp = PGImageMouseUp Stretch = True end object PGImageAx: TImage Tag = 1 Cursor = crCross Left = 763 Height = 12 Top = 238 Width = 12 AutoSize = True OnDblClick = PGImageCorDblClick OnMouseDown = PGImageMouseDown OnMouseMove = PGImageMouseMove OnMouseUp = PGImageMouseUp Stretch = True end end end object MainMenu1: TMainMenu left = 112 top = 212 object File1: TMenuItem Caption = '&File' object Open1: TMenuItem Caption = '&Open' ShortCut = 16463 OnClick = Open1Click end object Recent1: TMenuItem Caption = 'Open &recent' end object Templates1: TMenuItem Caption = 'Open &templates' end object CloseImages: TMenuItem Caption = '&Close images' OnClick = CloseImagesClick end object SaveasNIfTI1: TMenuItem Caption = 'Save as NIfTI...' ShortCut = 49235 OnClick = SaveasNIfTI1Click end object Saveaspicture1: TMenuItem Caption = '&Save as bitmap' ShortCut = 16467 OnClick = Saveaspicture1Click end object Exit1: TMenuItem Caption = 'E&xit' OnClick = Exit1Click end end object Edit1: TMenuItem Caption = '&Edit' object Copy1: TMenuItem Caption = 'Copy' ShortCut = 16451 OnClick = Copy1Click end object Paste1: TMenuItem Caption = 'Paste' ShortCut = 16470 OnClick = Paste1Click end object Undo1: TMenuItem Caption = 'Undo' ShortCut = 16474 OnClick = Undo1Click end end object OverlayMenu: TMenuItem Caption = '&Overlay' object OverlayOpen: TMenuItem Caption = 'Add' ShortCut = 16449 OnClick = OverlayOpenClick end object CloseOverlayImg: TMenuItem Caption = 'Close overlays' OnClick = CloseOverlayImgClick end object BGTransPctMenu: TMenuItem Caption = 'Transparency on background' object BGtrans0: TMenuItem Caption = '0% opaque' Checked = True GroupIndex = 251 RadioItem = True OnClick = BGtrans100Click end object BGtrans20: TMenuItem Tag = 20 Caption = '20%' GroupIndex = 251 RadioItem = True OnClick = BGtrans100Click end object BGtrans40: TMenuItem Tag = 40 Caption = '40%' GroupIndex = 251 RadioItem = True OnClick = BGtrans100Click end object BGtrans50: TMenuItem Tag = 50 Caption = '50%' GroupIndex = 251 RadioItem = True OnClick = BGtrans100Click end object BGtrans60: TMenuItem Tag = 60 Caption = '60%' GroupIndex = 251 RadioItem = True OnClick = BGtrans100Click end object BGtrans80: TMenuItem Tag = 80 Caption = '80%' GroupIndex = 251 RadioItem = True OnClick = BGtrans100Click end object BGtrans100: TMenuItem Tag = 100 Caption = '100% transparent' GroupIndex = 251 RadioItem = True OnClick = BGtrans100Click end object BGAdditive: TMenuItem Tag = -1 Caption = 'Additive' GroupIndex = 251 RadioItem = True OnClick = BGtrans100Click end end object OverlayTransPctMenu: TMenuItem Caption = 'Transparency on other overlays' object N0opaque1: TMenuItem Caption = '0% opaque' GroupIndex = 253 RadioItem = True OnClick = OverlayTransClick end object N201: TMenuItem Tag = 20 Caption = '20%' GroupIndex = 253 RadioItem = True OnClick = OverlayTransClick end object N401: TMenuItem Tag = 40 Caption = '40%' GroupIndex = 253 RadioItem = True OnClick = OverlayTransClick end object N501: TMenuItem Tag = 50 Caption = '50%' GroupIndex = 253 RadioItem = True OnClick = OverlayTransClick end object N601: TMenuItem Tag = 60 Caption = '60%' GroupIndex = 253 RadioItem = True OnClick = OverlayTransClick end object N801: TMenuItem Tag = 80 Caption = '80%' GroupIndex = 253 RadioItem = True OnClick = OverlayTransClick end object N100transparent1: TMenuItem Tag = 100 Caption = '100% transparent' GroupIndex = 253 RadioItem = True OnClick = OverlayTransClick end object OverlayAdditive: TMenuItem Tag = -1 Caption = 'Additive' Checked = True GroupIndex = 253 RadioItem = True OnClick = OverlayTransClick end end object LayerMenu: TMenuItem Caption = 'Layer color' Visible = False object Noneopen1: TMenuItem Caption = 'None open' end end object Layerrange1: TMenuItem Caption = 'Layer intensity' Visible = False object Noneopen2: TMenuItem Caption = 'None open' end end end object DrawMenu: TMenuItem Caption = '&Draw' object OpenVOI: TMenuItem Caption = 'Open VOI...' OnClick = OpenVOIClick end object SaveVOI: TMenuItem Caption = 'Save VOI...' OnClick = SaveVOIClick end object CloseVOI: TMenuItem Caption = 'Close VOI...' OnClick = CloseVOIClick end object VOIColor: TMenuItem Caption = 'VOI color...' OnClick = VOIColorClick end object Applyintensityfiltertovolume1: TMenuItem Caption = 'Intensity filter...' ShortCut = 16454 OnClick = Applyintensityfiltertovolume1Click end object SmoothVOI1: TMenuItem Caption = 'Smooth VOI...' OnClick = SmoothVOI1Click end object MaskimagewithVOI1: TMenuItem Caption = 'Mask image with VOI' object VOImaskDelete: TMenuItem Caption = 'Delete regions with VOI' OnClick = VOImaskClick end object VOImaskPreserve: TMenuItem Tag = 1 Caption = 'Preserve regions with VOI' OnClick = VOImaskClick end end object Overlaycomparisons1: TMenuItem Caption = 'Overlay comparisons' object IntersectionmutualtoVOIandoverlays1: TMenuItem Caption = 'Intersection [VOI and overlays]' OnClick = ROIcomparisonClick end object UnionVOIoroverlays1: TMenuItem Tag = 1 Caption = 'Union [VOI or overlays]' OnClick = ROIcomparisonClick end object MaskVOIbutnotoverlays1: TMenuItem Tag = 2 Caption = 'Mask [VOI but not overlays]' OnClick = ROIcomparisonClick end end object Statistics1: TMenuItem Caption = 'Statistics' object Beta1: TMenuItem Caption = 'Create overlap images' OnClick = CreateOverlap end object Chisquare1: TMenuItem Caption = 'Subtraction Plots' OnClick = Chisquare1Click end object BatchROImean1: TMenuItem Caption = 'Batch descriptives' OnClick = BatchROImean1Click end object Batchprobmaps1: TMenuItem Caption = 'Batch prob maps' OnClick = Batchprobmaps1Click end object Batchclusterprobmaps1Batchclusterprobmaps1Click: TMenuItem Caption = 'Batch cluster prob maps' OnClick = Batchclusterprobmaps1Batchclusterprobmaps1ClickClick end end object Convert1: TMenuItem Caption = 'Convert' object ROIVOI1: TMenuItem Caption = 'ROI -> VOI' OnClick = ROIVOI1Click end object VOI2NII: TMenuItem Caption = 'VOI -> NII' OnClick = VOI2NIIClick end object NIIVOI: TMenuItem Caption = 'NII -> VOI' OnClick = NIIVOIClick end end object Nudge1: TMenuItem Caption = 'Nudge' object Up1: TMenuItem Caption = 'Left' OnClick = Up1Click end object Left1: TMenuItem Tag = 1 Caption = 'Right' OnClick = Up1Click end object LeftX1: TMenuItem Tag = 2 Caption = 'Posterior' OnClick = Up1Click end object RightX1: TMenuItem Tag = 3 Caption = 'Anterior' OnClick = Up1Click end object Posterior1: TMenuItem Tag = 4 Caption = 'Inferior' OnClick = Up1Click end object Posterior2: TMenuItem Tag = 5 Caption = 'Superior' OnClick = Up1Click end end object n5: TMenuItem Caption = 'Advanced' object RescaleMenu: TMenuItem Caption = 'Phase to rad/S' OnClick = RescaleMenuClick end object BrainExtraction1: TMenuItem Caption = 'Brain extraction' OnClick = BETmenuClick end object CropEdges1: TMenuItem Caption = 'Crop edges' OnClick = CropMenuClick end object Brainmask1: TMenuItem Caption = 'Brain mask ' OnClick = BrainMask1Click end object GenerateSPM5maskslesions1: TMenuItem Caption = 'Create SPM5 mask' OnClick = GenerateSPM5maskslesions1Click end object LRFlip1: TMenuItem Caption = 'LR Flip' OnClick = MirrorNII1Click end object ApplyClusterThreshold1: TMenuItem Caption = 'Apply cluster threshold' OnClick = ApplyClusterThreshold1Click end object ExportasRGBAnalyzeimage1: TMenuItem Caption = 'Export as RGB image' OnClick = ExportasRGBAnalyzeimage1Click end object Resliceimage1: TMenuItem Caption = 'Reslice images' OnClick = Resliceimage1Click end object AdjustimagessoVOIintensityiszero1: TMenuItem Caption = 'Adjust images so VOI intensity is zero' OnClick = AdjustimagessoVOIintensityiszero1Click end object Extract1: TMenuItem Caption = 'Extract objects' OnClick = Extract1Click end end object DescriptiveMenuItem: TMenuItem Caption = 'Descriptive' OnClick = DescriptiveMenuItemClick end object N1: TMenuItem Caption = '-' end object Pen1: TMenuItem Tag = 2 Caption = 'Pen' ShortCut = 112 OnClick = ToolSelectClick end object Penautoclose1: TMenuItem Tag = 3 Caption = 'Autoclose pen' ShortCut = 113 OnClick = ToolSelectClick end object CircleSquare1: TMenuItem Tag = 4 Caption = 'Fill' ShortCut = 114 OnClick = ToolSelectClick end object Circle2: TMenuItem Tag = 5 Caption = 'Circle' ShortCut = 115 OnClick = ToolSelectClick end object Circle1: TMenuItem Tag = 6 Caption = 'Deselect tools' ShortCut = 116 OnClick = ToolSelectClick end end object Controls1: TMenuItem Caption = '&View' object Display2: TMenuItem Tag = 2 Caption = 'Display' object Axial1: TMenuItem Tag = 1 AutoCheck = True Caption = 'Axial' GroupIndex = 234 RadioItem = True OnClick = Sagittal1Click end object Coronal1: TMenuItem Tag = 3 AutoCheck = True Caption = 'Coronal' GroupIndex = 234 RadioItem = True OnClick = Sagittal1Click end object Sagittal1: TMenuItem Tag = 2 AutoCheck = True Caption = 'Sagittal' GroupIndex = 234 RadioItem = True OnClick = Sagittal1Click end object Multiple1: TMenuItem AutoCheck = True Caption = 'Multiple' Checked = True GroupIndex = 234 RadioItem = True OnClick = Sagittal1Click end object Axial2: TMenuItem Tag = -1 AutoCheck = True Caption = 'Axial only' GroupIndex = 234 RadioItem = True OnClick = Sagittal1Click end object Coronal2: TMenuItem Tag = -3 AutoCheck = True Caption = 'Coronal only' GroupIndex = 234 RadioItem = True OnClick = Sagittal1Click end object Sagittal2: TMenuItem Tag = -2 AutoCheck = True Caption = 'Sagittal only' GroupIndex = 234 RadioItem = True OnClick = Sagittal1Click end end object N3: TMenuItem Caption = '-' end object Quicksmooth1: TMenuItem Caption = '3D Smooth background' OnClick = Quicksmooth1Click end object OverlaySmoothMenu: TMenuItem Caption = '3D Smooth overlays' OnClick = OverlaySmoothMenuClick end object Menu2DSmooth: TMenuItem Caption = '2D Smooth all' Checked = True OnClick = Menu2DSmoothClick end object N4: TMenuItem Caption = '-' end object FlipLRmenu: TMenuItem Caption = 'Flip L/R' OnClick = FlipLRmenuClick end object YokeMenu: TMenuItem Caption = 'Yoke' ShortCut = 16473 OnClick = YokeMenuClick end object N2: TMenuItem Caption = '-' end object MagnifyMenuItem: TMenuItem Caption = 'Magnify' OnClick = MagnifyMenuItemClick end object Crosshair1: TMenuItem Caption = 'Crosshair' OnClick = ToolSelectClick end object MenuItem1: TMenuItem Caption = '-' end object MNIMenu: TMenuItem Caption = 'MNI coordinates' OnClick = MNIMenuClick end object Landmarks1: TMenuItem Caption = 'Landmarks' OnClick = Landmarks1Click end end object Display1: TMenuItem Caption = 'Window' object ShowRender: TMenuItem Caption = 'Render' ShortCut = 16466 OnClick = ShowRenderClick end object ShowMultislice: TMenuItem Caption = 'Multislice' ShortCut = 16461 OnClick = ShowMultisliceClick end object HistoMenu: TMenuItem Caption = 'Histogram' ShortCut = 16456 OnClick = HistoMenuClick end object N4DTraces1: TMenuItem Caption = '4D Traces' ShortCut = 16452 OnClick = N4DTraces1Click end object Header1: TMenuItem Caption = 'Information' ShortCut = 16457 OnClick = Header1Click end end object Help1: TMenuItem Caption = '&Help' object Preferences1: TMenuItem Caption = 'Preferences...' OnClick = Preferences1Click end object About1: TMenuItem Caption = 'About' OnClick = About1Click end end end object SaveDialog1: TSaveDialog OnClose = SaveDialog1Close DefaultExt = '.bmp' Filter = 'Bitmap|.bmp' FilterIndex = 0 left = 18 top = 212 end object ColorDialog1: TColorDialog Color = clBlack CustomColors.Strings = ( 'ColorA=000000' 'ColorB=000080' 'ColorC=008000' 'ColorD=008080' 'ColorE=800000' 'ColorF=800080' 'ColorG=808000' 'ColorH=808080' 'ColorI=C0C0C0' 'ColorJ=0000FF' 'ColorK=00FF00' 'ColorL=00FFFF' 'ColorM=FF0000' 'ColorN=FF00FF' 'ColorO=FFFF00' 'ColorP=FFFFFF' 'ColorQ=C0DCC0' 'ColorR=F0CAA6' 'ColorS=F0FBFF' 'ColorT=A4A0A0' ) left = 50 top = 212 end object RefreshImagesTimer: TTimer Enabled = False Interval = 20 OnTimer = RefreshImagesTimerTimer left = 82 top = 212 end object RescaleImagesTimer: TTimer Enabled = False Interval = 50 OnTimer = RescaleImagesTimerTimer left = 178 top = 212 end object YokeTimer: TTimer Enabled = False Interval = 200 OnTimer = YokeTimerTimer left = 280 top = 264 end end mricron-0.20120505.1~dfsg.1.orig/nifti_img.pas0000664000175000017500000061475511641356444020354 0ustar michaelmichaelunit nifti_img; interface uses {$H+} {$IFNDEF FPC} RXSpin,capmenu,PNGImage,SSE,ShellAPI,Spin, {$ENDIF} {$IFNDEF Unix} Windows,wgraphics, {$ELSE} RGBGraphics,rgbroutines, {$ENDIF} SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, ExtCtrls, NIFTI_hdr, StdCtrls,Math, ClipBrd,define_types, GraphicsMathLibrary,Distr,Stat,ReadInt,gzio2; const kMultiView = 0; kAxView0 = 1; kSagView0 = 2; kCoroView0 = 3; kAxViewOnly = -1; kSagViewOnly = -2; kCoroViewOnly = -3; Type TBGImg = record //Next: analyze Format Header structure ScrnDim: array [1..3] of smallint; ScrnMM,ScrnOri: array [1..3] of single; XViewCenter,YViewCenter,ZViewCenter: single; SliceView,SPMDefaultsStatsFmriT,SPMDefaultsStatsFmriT0, MaxDim,LicenseID,XBarGap,XBarThick,VOIUndoSlice,VOIUndoOrient,VOIUndoVolItems, RenderDepthBufferItems,VOIInvZoom,ZoomPct,BGTransPct,OverlayTransPct, ImageSeparation,RenderDim,SigDig,LesionSmooth,LesionDilate,FontSize: integer; //ResizeBeforeRescale - 0=intensity rescale, then resize; 1= nearest neighbor resize, then rescale;1=trilinear resize, then rescale;12:47 PM 7/13/2006 UseReorientHdr,XBarVisible,ThinPen,Mirror,OverlaySmooth,VOIchanged,VOImirrored, SaveDefaultIni,KnownAlignment,Resliced, FlipAx,FlipSag,SingleRow,ResliceOnLoad,Prompt4DVolume,OrthoReslice: boolean; MinChar,MaxChar: array [1..3] of char; //May07 StretchQuality : TStretchQuality; VOIClr,XBarClr: TColor; BackupLUT: TLUT; LabelStr20 : Array[0..255] of kstr20; {FSLDIR,}FSLBASE,FSLOUTPUTTYPE{,FSLBETEXE}: kStr255; InvMat: TMatrix; ReorientHdr: TNIFTIHdr; //Cutout: TCutout; VOIUndoVol: bytep; RenderDepthBuffer: SmallIntp; end; //TNIFTIhdr Header Structure procedure CreateAnaRGB; function SlicesToImgPos(lX,lY,lZ: integer): integer; procedure ImgPosToSlices(lPos: integer; var lX,lY,lZ: integer); procedure DrawBMP( lx, ly: integer; var lBuff: RGBQuadp; var lImage: TImage); procedure IntenBar (var lImage: TImage; var lHdr: TMRIcroHdr; lLTRB: integer {1=Left,2=Top,3=right,4=bottom}; lMin,lMax: single); procedure Balance (var lHdr: TMRIcroHdr); function ImgVaries ( var lHdr: TMRIcroHdr): boolean; function OpenImg(var lBackgroundImg: TBGImg; var lImg2Load: TMRIcroHdr; lLoadBackground,lVOILoadAsBinary,lNoScaling8bit,lResliceIn,l4D: boolean): boolean; procedure InitImgMemory(var lHdr: TMRIcroHdr); procedure FreeImgMemory(var lHdr: TMRIcroHdr); procedure SetDimension32(lInPGHt,lInPGWid:integer; lBuff: RGBQuadp; var lBackgroundImg: TBGImg; var lImage: TImage; lPanel: TScrollBox); //procedure RescaleImgIntensity(var lBackgroundImg: TBGImg; var lHdr: TMRIcroHdr ); procedure RescaleImgIntensity(var lBackgroundImg: TBGImg; var lHdr: TMRIcroHdr; lLayer: integer ); procedure LoadColorScheme(lStr: string; var lHdr: TMRIcroHdr); procedure LoadMonochromeLUT (var lLUT: integer; var lBackgroundImg: TBGImg; var lHdr: TMRIcroHdr); //lLUT: 0=gray,1=red,2=green,3=blue procedure FilterLUT (var lBackgroundImg: TBGImg; var lHdr: TMRIcroHdr; lMin, lMax: integer); //lLUT: 0=gray,1=red,2=green,3=blue function Raw2ScaledIntensity (lHdr: TMRIcroHdr; lRaw: single): single; function Scaled2RawIntensity (lHdr: TMRIcroHdr; lScaled: single): single; procedure AlphaBlend32(lBGQuad,lOverlayQuad : RGBQuadp; lBG0Clr,lOverlay0Clr: DWord; lSlicePixels, lOverlayTransPct: integer); // 630 procedure SetBGImgDefaults (var lBGImg: TBGImg); function MaxDim (lX,lY,lZ: integer): integer; //returns largest of 3 procedure DrawHistogram (var lHdr: TMRIcroHdr; var lImage: TImage); function MirrorImgBuffer(var lHdr: TMRIcroHdr ): boolean; procedure MirrorScrnBuffer(var lBackgroundImg: TBGImg; var lHdr: TMRIcroHdr ); procedure SetSubmenuWithTag (var lRootMenu: TMenuItem; lTag: Integer); procedure SaveAsVOIorNIFTIcore (var lFilename: string; var lImgBuffer: ByteP; lImgBufferItems, lImgBufferBPP,lnVol: integer; var lNiftiHdr: TNIFTIHdr); procedure SaveAsVOIorNIFTI (var lImgBuffer: ByteP; lImgBufferItems, lImgBufferBPP,lnVol: integer; DefaultFormatVOI: boolean; var lNiftiHdr: TNIFTIHdr; lDefFilename: string); function Scrn2ScaledIntensity (lHdr: TMRIcroHdr; lRaw: single): single; procedure ScaleScrn2BMP (var lX, lY: integer;lImage: TImage); procedure DrawXBar ( lHorPos, lVerPos: integer;var lImage: TImage); function ImageZoomPct( var lImage: TImage): integer; procedure ScaleBMP2Draw (var InvZoomShl10,lX, lY,lPanel: integer; lImage: TImage); function ComputeInvZoomShl10(lSelectedImageNum: integer; var lImage: TImage): integer; function ComputeZoomPct(lSelectedImageNum: integer; var lImage: TImage): integer; function SelectedImageNum: Integer; procedure EnsureVOIOpen; procedure FreeUndoVol; procedure CreateUndoVol; procedure UndoVolVOI; function IsVOIOpen: boolean; //procedure SortCutout (var lCutout : TCutout); //ensure Lo < Hi procedure SaveImgAsPNGBMP (lImage: TImage); procedure RefreshImages; procedure DrawAxial (lSlice,lMultiSlice: integer); procedure DrawSag(lSlice,lMultiSlice: integer); procedure DrawCor(lSlice,lMultiSlice: integer); procedure DrawLabel(var lImage: TImage; lValue,lXCenterIn,lXWidthIn: integer); procedure ImgCoordToMM(var lX,lY,lZ: integer; var lXmm,lYmm,lZmm: single); procedure MMToImgCoord(var lX,lY,lZ: integer; var lXmm,lYmm,lZmm: single); //function DimToMM (lIn, lDim: integer): integer; function DimToMM (lX,lY,lZ, lDim: integer): integer; function DimToMMx (lDim: integer): integer; procedure ImgPosToMM(lPos: integer; var lXmm,lYmm,lZmm: single); procedure MakeStatHdr (var lBGHdr,lStatHdr: TMRIcroHdr; lMinIntensity,lMaxIntensity,lIntent_p1,lIntent_p2,lIntent_p3: single; lIntent_code: smallint;lIntentName: string); function CenterOfMass (lOverlay: integer; var lX,lY,lZ: double): integer; procedure TextReportHisto (var lHdr: TMRIcroHdr); function TColor2TRGBQuad(lColor: TColor): TRGBQuad; function TRGBQuad2DWord (lLUT: TRGBQuad): DWord; procedure ReturnMinMax (var lHdr: TMRIcroHdr; var lMin,lMax: single; var lFiltMin8bit, lFiltMax8bit: integer); function RawBGIntensity(lPos: integer): single; //procedure FreeImgMemory(var lHdr: TMRIcroHdr); const gSelectedImageNum :integer= 1; //gTripleZoom100: integer = 1; //gImgSpacing: integer = 1; implementation uses nifti_img_view,MultiSlice,histoform,text, ortho_reorient, reslice_img; function RawBGIntensity(lPos: integer): single; var l16Buf : SmallIntP; l32Buf : SingleP; begin result := 0; if (lPos > gMRIcroOverlay[kBGOverlayNum].ImgBufferItems) or (lPos < 1) then exit; if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 4) then begin l32Buf := SingleP(gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); result := l32Buf^[lPos]; end else if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 2) then begin l16Buf := SmallIntP(gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); result := l16Buf^[lPos]; end else if gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 1 then result := gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[lPos] else begin showmessage('Unknown Background Buffer Bytes Per Pixel'); exit; end; end; function TRGBQuad2DWord (lLUT: TRGBQuad): DWord; var inguy : ^DWord; begin inguy := @lLUT; result := inguy^; end; function TRGBQuad2TColor (lLUT: TRGBQuad): TColor; begin result := (lLUT.rgbred)+(lLUT.rgbgreen shl 8)+(lLUT.rgbblue shl 16); end; function TColor2TRGBQuad(lColor: TColor): TRGBQuad; begin result.rgbRed := (lColor and 255) ; result.rgbGreen := (lColor shr 8) and 255 ;// and 65280; result.rgbBlue := ((lColor shr 16) and 255) ;//and 16711680; result.rgbReserved := kLUTalpha; end; procedure InitImgMemory(var lHdr: TMRIcroHdr); begin with lHdr do begin RenderBufferItems := 0; ScrnBufferItems := 0; ImgBufferItems := 0; end; end; function CenterOfMass (lOverlay: integer; var lX,lY,lZ: double): integer; //result is volume in voxels - 0 = no volume or error var lXpos,lYpos,lZpos,lInc: integer; begin result := 0; lX := 0; lY := 0; lZ := 0; //fx((gMRIcroOverlay[lOverlay].NIFTIhdr.dim[1]*gMRIcroOverlay[lOverlay].NIFTIhdr.dim[2]* gMRIcroOverlay[lOverlay].NIFTIhdr.dim[3]), gMRIcroOverlay[lOverlay].ScrnBufferItems); if (gMRIcroOverlay[lOverlay].NIFTIhdr.dim[1]*gMRIcroOverlay[lOverlay].NIFTIhdr.dim[2]* gMRIcroOverlay[lOverlay].NIFTIhdr.dim[3]) <> gMRIcroOverlay[lOverlay].ScrnBufferItems then exit; //fx(999); lInc := 0; for lZpos := 1 to gMRIcroOverlay[lOverlay].NIFTIhdr.dim[3] do begin for lYpos := 1 to gMRIcroOverlay[lOverlay].NIFTIhdr.dim[2] do begin for lXpos := 1 to gMRIcroOverlay[lOverlay].NIFTIhdr.dim[1] do begin inc(lInc); if gMRIcroOverlay[lOverlay].ScrnBuffer^[lInc] > 0 then begin inc(result); lX := lX + lXpos; lY := lY + lYpos; lZ := lZ + lZpos; end; end; //lX end;//Y end;//Z //fx(lX,lY,lZ); if result > 0 then begin lX := lX / result; lY := lY / result; lZ := lZ / result; end; //lARDistance := round(sqrt( sqr(lRX-lAX)+sqr(lRY-lAY)+sqr(lRZ-lAZ))); //<- pythagorean theorem for dx end; procedure MakeStatHdr (var lBGHdr,lStatHdr: TMRIcroHdr; lMinIntensity,lMaxIntensity,lIntent_p1,lIntent_p2,lIntent_p3: single; lIntent_code: smallint;lIntentName: string); //lIntent kNIFTI_INTENT_CHISQ lIntent_p1 = DOF //lIntent kNIFTI_INTENT_ZSCORE no params //lIntent kNIFTI_INTENT_TTEST lIntent_p1 = DOF var lIntentNameLen,lPos: integer; begin with lStatHdr do begin move(lBGHdr.niftiHdr,lStatHdr.niftiHdr,sizeof(TniftiHdr)); ImgBufferBPP := 1; ImgBufferItems := gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems; NIFTIhdr.scl_slope:= 1; NIFTIhdr.scl_inter:= 0; NIFTIhdr.glmin := round(lMinIntensity); NIFTIhdr.glmax := round(lMaxIntensity); AutoBalMinUnscaled := lMinIntensity; AutoBalMaxUnscaled := lMaxIntensity; WindowScaledMin := lMinIntensity; WindowScaledMax := lMaxIntensity; GlMinUnscaledS := lMinIntensity; GlMaxUnscaledS := lMaxIntensity; HdrFileName := extractfilepath(HdrFilename)+'stat.nii.gz'; ImgFileName := HdrFileName; NIFTIhdr.intent_code := lIntent_Code;// kNIFTI_INTENT_ESTIMATE; NIFTIhdr.intent_p1 := lIntent_p1; NIFTIhdr.intent_p2 := lIntent_p2; NIFTIhdr.intent_p3 := lIntent_p3; lIntentNameLen := length(lIntentName); if lIntentNameLen > sizeof(NIFTIhdr.intent_name) then lIntentNameLen := sizeof(NIFTIhdr.intent_name); if lIntentNameLen > 0 then for lPos := 1 to lIntentNameLen do NIFTIhdr.intent_name[lPos] := lIntentName[lPos]; end; end; procedure MMToImgCoord(var lX,lY,lZ: integer; var lXmm,lYmm,lZmm: single); var lXx,lYy,lZz: single; begin if (not gBGImg.Resliced) and ( gMRIcroOverlay[kBGOverlayNum].NIfTItransform) then begin//vcx //mirror lxx := lXmm; lyy := lYmm; lzz := lZmm; mm2Voxel (lxx,lyy,lzz, gBGImg.InvMat); if gBGImg.Mirror then lXx := gBGImg.ScrnDim[1]-lXx; lX := round(lxx); ly := round(lyy); lz := round(lzz); exit; end; if gBGImg.Mirror then lX := round((gBGImg.ScrnDim[1]-gBGImg.ScrnOri[1]+1)-(lXmm/gBGImg.ScrnMM[1])) else lX := round((lXmm/gBGImg.ScrnMM[1])+gBGImg.ScrnOri[1]); lY := round((lYmm/gBGImg.ScrnMM[2])+gBGImg.ScrnOri[2]); lZ := round((lZmm/gBGImg.ScrnMM[3])+gBGImg.ScrnOri[3]); if lX < 1 then lX := 1; if lY < 1 then lY := 1; if lZ < 1 then lZ := 1; if lX > gBGImg.ScrnDim[1] then lX := gBGImg.ScrnDim[1]; if lY > gBGImg.ScrnDim[2] then lY := gBGImg.ScrnDim[2]; if lZ > gBGImg.ScrnDim[3] then lZ := gBGImg.ScrnDim[3]; end; (*2008 procedure MMToImgCoord(var lX,lY,lZ: integer; var lXmm,lYmm,lZmm: single); begin lX := round((lXmm/gBGImg.ScrnMM[1])+gBGImg.ScrnOri[1]); lY := round((lYmm/gBGImg.ScrnMM[2])+gBGImg.ScrnOri[2]); lZ := round((lZmm/gBGImg.ScrnMM[3])+gBGImg.ScrnOri[3]); if lX < 1 then lX := 1; if lY < 1 then lY := 1; if lZ < 1 then lZ := 1; if lX > gBGImg.ScrnDim[1] then lX := gBGImg.ScrnDim[1]; if lY > gBGImg.ScrnDim[2] then lY := gBGImg.ScrnDim[2]; if lZ > gBGImg.ScrnDim[3] then lZ := gBGImg.ScrnDim[3]; end; *) (*procedure ImgCoordToMM(var lX,lY,lZ: integer; var lXmm,lYmm,lZmm: single); begin lXmm := ((lX)-gBGImg.ScrnOri[1])*gBGImg.ScrnMM[1]; lYmm := ((lY)-gBGImg.ScrnOri[2])*gBGImg.ScrnMM[2]; lZmm := ((lZ)-gBGImg.ScrnOri[3])*gBGImg.ScrnMM[3]; end; *) procedure ImgCoordToMM(var lX,lY,lZ: integer; var lXmm,lYmm,lZmm: single); begin if (not gBGImg.Resliced) and ( gMRIcroOverlay[kBGOverlayNum].NIfTItransform) then begin//vcx //mirror lXmm := lX; if gBGImg.Mirror then lXmm := gBGImg.ScrnDim[1]-lXmm; lYmm := lY; lZmm := lZ; Voxel2mm (lxmm,lymm,lzmm, gMRIcroOverlay[kBGOverlayNum].NIftiHdr); exit; end; if gBGImg.Mirror then lXmm := ((gBGImg.ScrnDim[1]-lX+1)-gBGImg.ScrnOri[1])*gBGImg.ScrnMM[1] else lXmm := ((lX)-gBGImg.ScrnOri[1])*gBGImg.ScrnMM[1]; lYmm := ((lY)-gBGImg.ScrnOri[2])*gBGImg.ScrnMM[2]; lZmm := ((lZ)-gBGImg.ScrnOri[3])*gBGImg.ScrnMM[3]; end; function XPos(lPos,XDim: integer): integer; //given 1D array return 3D column begin result := lPos mod XDim; if result = 0 then result := XDim; end; function ZPos(lPos, XDimTimesYDim: integer): integer; //given 1D array return 3D slice begin result := lPos div XDimTimesYDim; if (lPos mod XDimTimesYDim) <> 0 then inc(result); end; function YPos(lPos, XDim,YDim: integer): integer; //given 1D array return 3D row var lSlicePos: integer; begin //first - eliminate slice offset result := ZPos(lPos,XDim*YDim); lSlicePos := lPos - ((result-1)*(XDim*YDim)); //now find row result :=lSlicePos div XDim; if (lSlicePos mod XDim) <> 0 then inc(result); end; (*function XPos(lPos,XDim: integer): integer; //given 1D array return 3D column begin result := lPos mod XDim; if result = 0 then result := XDim; end; function ZPos(lPos, XDimTimesYDim: integer): integer; //given 1D array return 3D slice begin result := lPos div XDimTimesYDim; if (lPos mod XDimTimesYDim) <> 0 then inc(result); end; function YPos(lPos, XDim,YDim: integer): integer; //given 1D array return 3D row var lSlicePos: integer; begin //first - eliminate slice offset result := ZPos(lPos,XDim*YDim); lSlicePos := lPos - ((result-1)*(XDim*YDim)); //now find row result :=lSlicePos div XDim; if (lSlicePos mod XDim) <> 0 then inc(result); end; *) function SlicesToImgPos(lX,lY,lZ: integer): integer; begin result := lX + ((lY-1) * gBGImg.ScrnDim[1])+ ((lZ-1)*gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]); end; procedure ImgPosToSlices(lPos: integer; var lX,lY,lZ: integer); begin lX := XPos(lPos,gBGImg.ScrnDim[1]); lY := YPos(lPos,gBGImg.ScrnDim[1],gBGImg.ScrnDim[2]); lZ := ZPos(lPos,gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]); end; procedure ImgPosToMM(lPos: integer; var lXmm,lYmm,lZmm: single); var lX,lY,lZ: integer; begin lX := XPos(lPos,gBGImg.ScrnDim[1]); lY := YPos(lPos,gBGImg.ScrnDim[1],gBGImg.ScrnDim[2]); lZ := ZPos(lPos,gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]); ImgCoordToMM(lX,lY,lZ, lXmm,lYmm,lZmm); //xxx lPos := lX + ((lY-1)*gBGImg.ScrnDim[1])+((lZ-1)*gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]); end; (*function DimToMM (lIn, lDim: integer): integer; var lX,lY,lZ: integer; lXmm,lYmm,lZmm: single; begin lX := lIn; lY := lIn; lZ := lIn; //if lDim = 2 then imgform.caption := inttostr(lY)+'-'; ImgCoordToMM(lX,lY,lZ,lXmm,lYmm,lZmm); case lDim of 3: result := round(lZmm); 2: result := round(lYmm); else result := round(lXmm); end; //case //imgform.caption := floattostr(lYmm); end; //DimToMM *) function DimToMM (lX,lY,lZ, lDim: integer): integer; //Sept2008 - X/Y/Z required for rotated images var lXi,lYi,lZi: integer; lXmm,lYmm,lZmm: single; begin lXi := lX; lYi := lY; lZi := lZ; ImgCoordToMM(lXi,lYi,lZi,lXmm,lYmm,lZmm); //imgform.Caption := floattostr(lxmm)+' '+floattostr(lymm)+' '+floattostr(lzmm)+' 666'; case lDim of 3: result := round(lZmm); 2: result := round(lYmm); else result := round(lXmm); end //case end; //DimToMM function DimToMMx (lDim: integer): integer; var lX,lY,lZ: integer; begin lX := round(ImgForm.XViewEdit.value); lY := round(ImgForm.YViewEdit.value); lZ := round(ImgForm.ZViewEdit.value); result := DimToMM(lX,lY,lZ,lDim); end; //DimToMM procedure DrawTextLabel(var lImage: TImage; lOutStr: string; lXCenterIn,lXWidthIn: integer); var lXWidth,lXCenter: integer; begin lXWidth := lXWidthIn; lXCenter:= lXCenterIn; if lXWidth < 1 then begin lXWidth := lImage.Picture.Bitmap.Width; end; if gBGImg.XBarClr = TColor(gMRIcroOverlay[kBGOverlayNum].LUTinvisible) then lImage.canvas.font.Color := clBlack//clWhite;//gLUT[lClr].rgbRed+(gLUT[lClr].rgbGreen shl 8)+(gLUT[lClr].rgbBlue shl 16); else lImage.canvas.font.Color := gBGImg.XBarClr; lImage.Canvas.Brush.Style := bsClear; {$IFDEF Darwin} lImage.Canvas.Font.Name := 'Helvetica'; {$ELSE} lImage.Canvas.Font.Name := 'Arial'; {$ENDIF} lImage.Canvas.Font.Size := gBGImg.FontSize; (*if lXWidth < 100 then lImage.Canvas.Font.Size := 12 else if lXWidth < 200 then lImage.Canvas.Font.Size := 14 else lImage.Canvas.Font.Size := 18; *) //lImage.Canvas.Font.Size := 18; if lXCenterIn < 1 then lImage.canvas.TextOut(2,1,lOutStr) else if lXCenterIn = MaxInt then lImage.canvas.TextOut((lXWidth div 2)-(lImage.Canvas.TextWidth(lOutStr) div 2),1,lOutStr) else lImage.canvas.TextOut(lXCenter-(lImage.Canvas.TextWidth(lOutStr) div 2),1,lOutStr) end; procedure DrawLabel(var lImage: TImage; lValue,lXCenterIn,lXWidthIn: integer); begin DrawTextLabel(lImage,inttostr(lValue),lXCenterIn,lXWidthIn); end; procedure DrawTextLabelV(var lImage: TImage; lOutStr: string); var lYHt: integer; begin lYHt := lImage.Picture.Bitmap.Height; if gBGImg.XBarClr = TColor(gMRIcroOverlay[kBGOverlayNum].LUTinvisible) then lImage.canvas.font.Color := clBlack//clWhite;//gLUT[lClr].rgbRed+(gLUT[lClr].rgbGreen shl 8)+(gLUT[lClr].rgbBlue shl 16); else lImage.canvas.font.Color := gBGImg.XBarClr; lImage.Canvas.Brush.Style := bsClear; lImage.Canvas.Font.Name := 'Arial'; lImage.canvas.TextOut(2,(lYHt div 2)-round(0.5*lImage.Canvas.TextHeight('X')),lOutStr) end; (*procedure DrawLabel(var lImage: TImage; lValue,lXCenterIn,lXWidthIn: integer); var lOutStr: string; lXWidth,lXCenter: integer; begin lXWidth := lXWidthIn; lXCenter:= lXCenterIn; if lXWidth < 1 then begin lXWidth := lImage.Picture.Bitmap.Width; end; if gBGImg.XBarClr = TColor(gMRIcroOverlay[kBGOverlayNum].LUTinvisible) then lImage.canvas.font.Color := clBlack//clWhite;//gLUT[lClr].rgbRed+(gLUT[lClr].rgbGreen shl 8)+(gLUT[lClr].rgbBlue shl 16); else lImage.canvas.font.Color := gBGImg.XBarClr; lImage.Canvas.Brush.Style := bsClear; lImage.Canvas.Font.Name := 'Arial'; if lXWidth < 100 then lImage.Canvas.Font.Size := 9 else if lXWidth < 200 then lImage.Canvas.Font.Size := 12 else lImage.Canvas.Font.Size := 14; lOutStr := inttostr(lValue); if lXCenterIn < 1 then lImage.canvas.TextOut(2,1,lOutStr) else if lXCenterIn = MaxInt then lImage.canvas.TextOut((lXWidth div 2)-(lImage.Canvas.TextWidth(lOutStr) div 2),1,lOutStr) else lImage.canvas.TextOut(lXCenter-(lImage.Canvas.TextWidth(lOutStr) div 2),1,lOutStr) end;*) {$IFNDEF FPC} procedure PasteDimension32(lInPGHt,lInPGWid:integer; lBuff: RGBQuadp; var lImage: TImage; lXOffset: integer); var sbBits : PByteArray; lPGWid,lPGHt,nBytesInImage: integer; lBMP: TBitmap; lSrcRect,lDestRect: TRect; begin if lXOffset < 1 then begin showmessage('Error with paste dimension - XOffset is <1!'); exit; end; lPGWid := lInPGWid; lPGHt := lInPGHt; lBMP := TBitmap.Create; TRY lBMP.PixelFormat := pf32bit; lBMP.Width := lPGwid; lBMP.Height := lPGHt; sbBits := lBmp.ScanLine[lPGHt-1]; nBytesInImage := lPGWid*lPGHt * 4; CopyMemory(Pointer(sbBits),Pointer(lBuff),nBytesInImage); lImage.Canvas.CopyMode := cmSrcCopy; lSrcRect := Rect(0,0,lBMP.Width,lBMP.Height); lDestRect := Rect(lXOffset,0,lXOffset+lBMP.Width,lBMP.Height); lImage.Canvas.CopyRect(lDestRect,lBMP.Canvas,lSrcRect); FINALLY lBMP.Free; END; //try..finally end; //proc PasteDimension32 {$ELSE} //PasteDimension32 FPC procedure PasteDimension32(lInPGHt,lInPGWid:integer; lBuff: RGBQuadp; lXOffset: integer); var lRowStart,x, y,lPos: Integer; begin if lBuff = nil then exit; lPos := 0; for y:= (lInPGHt-1) downto 0 do begin lRowStart := (y * gMultiWid)+lXOffset; for x:=0 to lInPGWid-1 do begin //dec(lPos); inc(lPos); gMultiBuff^[lRowStart+x] := lBuff^[lPos]; end; end; end; {$ENDIF} procedure CreateSag(var lHdr: TMRIcroHdr; lX,lXOffset,lY,lZ,lXYSliceSz: Integer; var lQuadP: RGBQuadp); var lSrc: Bytep; //lLongBuff: LongIntp; lPixel,lYPos,lZPos,lZOffset,lYOffset: integer; begin lSrc := lHdr.ScrnBuffer; lPixel := 0; // lLongBuff := LongIntp(lQuadP); for lZPos := 1 to lZ do begin lZOffset := (lZPos-1) * lXYSliceSz; lYOffset := 0; for lYPos := 1 to lY do begin inc(lPixel); lQuadP^[lPixel] := lHdr.LUT[lSrc^[lZOffset+lYOffset+lXOffset]]; lYOffset := lYOffset+ lX; end; //for each Y end; //for each Z end; //CreateSag procedure MirrorSlice (lY,lX: integer; lImage: RGBQuadp); var lRowData: RGBQuadp; lXi,lYi,lHalfX,lRowBytes,lTop: integer; begin if lX < 2 then exit; lRowBytes := lX * 4; getmem(lRowData,lRowBytes); lHalfX := lX div 2; lTop := 1; for lYi := 1 to lY do begin Move(lImage^[lTop],lRowData^[1],lRowBytes); for lXi := 1 to lX do lImage^[lTop+lXi-1] := lRowData^[lX - lXi + 1]; lTop := lTop + lX; end; freemem(lRowData); end; procedure DrawSag (lSlice,lMultiSlice: integer); var lBGQuadP, lOverlayQuadP, l2ndOverlayQuadP: RGBQuadp; lOverlay,lnOverlay,lXOffset, lX,lY,lZ,lXYSliceSz,lYZSliceSz: longint; lBG0Clr,lOverlay0Clr: DWord; begin lX := round(gBGImg.ScrnDim[1]); lY := round(gBGImg.ScrnDim[2]); lZ := round(gBGImg.ScrnDim[3]); lXOffset := round(lSlice); lXYSliceSz := (lX*lY); lYZSliceSz := (lY*lZ); if (lXOffset > lX) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0)or (lXOffset < 1 {999+}) or (lXYSliceSz < 1) then exit; if (lZ < 2) then begin SetDimension32(1,1, nil, gBGImg, ImgForm.PGImageSag, ImgForm.TriplePanel); exit; end; GetMem ( lBGQuadP , lYZSliceSz*4); CreateSag(gMRIcroOverlay[kBGOverlayNum], lX,lXOffset,lY,lZ,lXYSliceSz, lBGQuadP); //next: overlays lnOverlay := 0; lBG0Clr:= TRGBQuad2DWord(gMRIcroOverlay[kBGOverlayNum].LUTinvisible);//just to avoid compiler warning hint - never used... for lOverlay := knMaxOverlay downto 1 do begin if gMRIcroOverlay[lOverlay].ScrnBufferItems > 0 then begin inc(lnOverlay); if lnOverlay = 1 then begin //top overlay GetMem ( lOverlayQuadP , lYZSliceSz*4); lBG0Clr:= TRGBQuad2DWord(gMRIcroOverlay[lOverlay].LUTinvisible); CreateSag(gMRIcroOverlay[lOverlay], lX,lXOffset,lY,lZ,lXYSliceSz, lOverlayQuadP); end else begin //2nd or lower overlay if lnOverlay = 2 then //2nd overlay GetMem ( l2ndOverlayQuadP , lYZSliceSz*4); CreateSag(gMRIcroOverlay[lOverlay], lX,lXOffset,lY,lZ,lXYSliceSz, l2ndOverlayQuadP); lOverlay0Clr:= TRGBQuad2DWord(gMRIcroOverlay[lOverlay].LUTinvisible); AlphaBlend32(lOverlayQuadP,l2ndOverlayQuadP, lBG0Clr,lOverlay0Clr, lYZSliceSz,gBGImg.OverlayTransPct); end; //2nd overlay or more end; //overlay loaded end; //for knOverlay..1 //Finally: draw overlays on BG if lnOverlay > 0 then begin lOverlay0Clr := lBG0Clr; lBG0Clr := 0;//0=impossible [no alpha] DWord(lHdr.LUTinvisible); if lnOverlay > 1 then FreeMem ( l2ndOverlayQuadP); AlphaBlend32(lBGQuadP,lOverlayQuadP, lBG0Clr,lOverlay0Clr, lYZSliceSz,gBGImg.BGTransPct); FreeMem ( lOverlayQuadP); end; //draw image if gBGImg.FlipSag then MirrorSlice (lZ,lY, lBGQuadP); if lMultiSlice >= 0 then PasteDimension32(lZ,lY, lBGQuadP,lMultiSlice)//, MultiSliceForm.MultiImage,lMultiSlice) else begin SetDimension32(lZ,lY, lBGQuadP, gBGImg, ImgForm.PGImageSag, ImgForm.TriplePanel); FreeMem ( lBGQuadP); if {ImgForm.XBarBtn.Down} gBGImg.XBarVisible then begin if gBGImg.FlipSag then DrawXBar ( round(lY-gBGImg.YViewCenter), round(gBGImg.ZViewCenter),ImgForm.PGImageSag) else DrawXBar ( round(gBGImg.YViewCenter), round({lZ-}gBGImg.ZViewCenter),ImgForm.PGImageSag); DrawLabel(ImgForm.PGImageSag, DimToMMx(1),-1,-1); if gBGImg.KnownAlignment then begin DrawTextLabel(ImgForm.PGImageSag,gBGImg.MaxChar[3]{'S'},MaxInt,-1); if gBGImg.FlipSag then DrawTextLabelV(ImgForm.PGImageSag,gBGImg.MaxChar[2]) else DrawTextLabelV(ImgForm.PGImageSag,gBGImg.MinChar[2]{'P'}); end; end; //XBars end; //draw end; procedure CreateCor(var lHdr: TMRIcroHdr; lX,lYOffset,lZ,lXYSliceSz: Integer; var lQuadP: RGBQuadp); var lSrc: Bytep; lPixel,lXPos,lZPos,lZOffset: integer; begin lSrc := lHdr.ScrnBuffer; lPixel := 0; //fx(lYOffset); for lZPos := 1 to (lZ) do begin lZOffset := (lZPos-1) * lXYSliceSz; for lXPos := 1 to lX do begin inc(lPixel); lQuadP^[lPixel]:=lHdr.LUT[lSrc^[lZOffset+lYOffset+lXPos]];//+1 Mac??? end; //for each Y end; //for each Z {$IFDEF ENDIAN_BIG} lPixel := random(255); //fixes strange PPC compiler bug where lS value in DrawCor is corrupted //bug only seen in Lazarus IDE {$ENDIF} end; procedure DrawCor (lSlice,lMultiSlice: integer); var lBGQuadP, lOverlayQuadP, l2ndOverlayQuadP: RGBQuadp; lOverlay,lnOverlay, lYOffset, lX,lY,lZ,lS,lXYSliceSz,lXZSliceSz: longint; lBG0Clr,lOverlay0Clr: DWord; begin lX := round(gBGImg.ScrnDim[1]); lY := round(gBGImg.ScrnDim[2]); lZ := round(gBGImg.ScrnDim[3]); lS := round(lSlice); lXYSliceSz := (lX*lY); lXZSliceSz := (lX*lZ); lYOffset := (lX) * (lS-1); if (lS > lY) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0)or (lS < 1 {999+}) or (lXYSliceSz < 1) then exit; if (lZ < 2) then begin SetDimension32(1,1, nil, gBGImg, ImgForm.PGImageSag, ImgForm.TriplePanel); //these do not work when image is stretched //ImgForm.PGImage3.Width := 1; //ImgForm.PGImage3.Height := 1; exit; end; GetMem ( lBGQuadP , (lXZSliceSz*4)); //imgform.caption := inttostr(lS)+'x666'; CreateCor(gMRIcroOverlay[kBGOverlayNum], lX,lYOffset,lZ,lXYSliceSz, lBGQuadP); //next: overlays lnOverlay := 0; //imgform.caption := inttostr(lS)+'x666'; lBG0Clr:= DWord(gMRIcroOverlay[1].LUTinvisible);//just to avoid compiler warning hint - never used... for lOverlay := knMaxOverlay downto 1 do begin if gMRIcroOverlay[lOverlay].ScrnBufferItems > 0 then begin inc(lnOverlay); if lnOverlay = 1 then begin //top overlay GetMem ( lOverlayQuadP , lXZSliceSz*4); lBG0Clr:= DWord(gMRIcroOverlay[lOverlay].LUTinvisible); CreateCor(gMRIcroOverlay[lOverlay], lX,lYOffset,lZ,lXYSliceSz, lOverlayQuadP); end else begin //2nd or lower overlay if lnOverlay = 2 then //2nd overlay GetMem ( l2ndOverlayQuadP , lXZSliceSz*4); CreateCor(gMRIcroOverlay[lOverlay], lX,lYOffset,lZ,lXYSliceSz, l2ndOverlayQuadP); lOverlay0Clr:= DWord(gMRIcroOverlay[lOverlay].LUTinvisible); AlphaBlend32(lOverlayQuadP,l2ndOverlayQuadP, lBG0Clr,lOverlay0Clr, lXZSliceSz,gBGImg.OverlayTransPct); end; //2nd overlay or more end; //overlay loaded end; //for knOverlay..1 //Finally: draw overlays on BG if lnOverlay > 0 then begin lOverlay0Clr := lBG0Clr; lBG0Clr := 0;//0=impossible, no alpha DWord(lHdr.LUTinvisible); if lnOverlay > 1 then FreeMem ( l2ndOverlayQuadP); AlphaBlend32(lBGQuadP,lOverlayQuadP, lBG0Clr,lOverlay0Clr, lXZSliceSz,gBGImg.BGTransPct); FreeMem ( lOverlayQuadP); end; //draw image if lMultiSlice >= 0 then PasteDimension32(lZ,lX, lBGQuadP,lMultiSlice)// MultiSliceForm.MultiImage,lMultiSlice) else begin SetDimension32(lZ,lX, lBGQuadP, gBGImg,ImgForm.PGImageCor, ImgForm.TriplePanel); if {ImgForm.XBarBtn.Down}gBGImg.XBarVisible then begin DrawXBar ( round(gBGImg.XViewCenter), round({lZ-}gBGImg.ZViewCenter),ImgForm.PGImageCor); DrawLabel(ImgForm.PGImageCor, DimToMMx(2),-1,-1); if gBGImg.KnownAlignment then begin DrawTextLabel(ImgForm.PGImageCor,gBGImg.MaxChar[3]{'S'},MaxInt,-1); if gBGImg.Mirror then DrawTextLabelV(ImgForm.PGImageCor,gBGImg.MaxChar[1]{'R'}) else DrawTextLabelV(ImgForm.PGImageCor,gBGImg.MinChar[1]{'L'}); end; end; //XBar end; FreeMem ( lBGQuadP); end; procedure CreateAxial(var lHdr: TMRIcroHdr; lStart,lSliceSz: Integer; var lQuadP: RGBQuadp); var lSrc: Bytep; lPixel: integer; begin lSrc := lHdr.ScrnBuffer; for lPixel := 1 to lSliceSz do lQuadP^[lPixel]:=lHdr.LUT[lSrc^[lStart+lPixel]]; //abba lQuadP^[200]:=lHdr.LUT[255]; end; procedure FlipSlice (lY,lX: integer; lImage: RGBQuadp); var lRowData: RGBQuadp; lYi,lHalfY,lRowBytes,lTop,lBottom: integer; begin if lY < 2 then exit; lRowBytes := lX * 4; getmem(lRowData,lRowBytes); lHalfY := lY div 2; lTop := 1; lBottom := ((lY-1)*lX)+1; for lYi := 1 to lHalfY do begin Move(lImage^[lTop],lRowData^[1],lRowBytes); Move(lImage^[lBottom],lImage^[lTop],lRowBytes); Move(lRowData^[1],lImage^[lBottom],lRowBytes); lTop := lTop + lX; lBottom := lBottom - lX; end; freemem(lRowData); end; procedure DrawAxial (lSlice,lMultiSlice: integer); var lBGQuadP, lOverlayQuadP, l2ndOverlayQuadP: RGBQuadp; lnOverlay,lOverlay, lX,lY,lS,lStart,lSliceSz: longint; lBG0Clr,lOverlay0Clr: DWord; begin lX := round(gBGImg.ScrnDim[1]); lY := round(gBGImg.ScrnDim[2]); lS := round(lSlice{ImgForm.ZViewEdit.value}); lSliceSz := (lX * lY{*lByte}); lStart := lX*lY*(lS-1); if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0)or (lS < 0) or (lX < 2) or (lStart < 0) or (lSliceSz < 1) or ((lStart+lSliceSz-1) > gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) then exit; GetMem ( lBGQuadP, lSliceSz*4); CreateAxial(gMRIcroOverlay[kBGOverlayNum], lStart,lSliceSz, lBGQuadP); //next: overlays lnOverlay := 0; lBG0Clr:= DWord(gMRIcroOverlay[1].LUTinvisible);//just to avoid compiler warning hint - never used... for lOverlay := knMaxOverlay downto 1 do begin if gMRIcroOverlay[lOverlay].ScrnBufferItems > 0 then begin inc(lnOverlay); if lnOverlay = 1 then begin //top overlay GetMem ( lOverlayQuadP , lSliceSz*4); lBG0Clr:= DWord(gMRIcroOverlay[lOverlay].LUTinvisible); CreateAxial(gMRIcroOverlay[lOverlay], lStart,lSliceSz,lOverlayQuadP); end else begin //2nd or lower overlay if lnOverlay = 2 then //2nd overlay GetMem ( l2ndOverlayQuadP , lSliceSz*4); CreateAxial(gMRIcroOverlay[lOverlay], lStart,lSliceSz,l2ndOverlayQuadP); lOverlay0Clr:= DWord(gMRIcroOverlay[lOverlay].LUTinvisible); AlphaBlend32(lOverlayQuadP,l2ndOverlayQuadP, lBG0Clr,lOverlay0Clr, lSliceSz,gBGImg.OverlayTransPct); end; //2nd overlay or more end; //overlay loaded end; //for knOverlay..1 //Finally: draw overlays on BG if lnOverlay > 0 then begin lOverlay0Clr := lBG0Clr; lBG0Clr := 0;//0=impossible, no alpha DWord(lHdr.LUT[0]); if lnOverlay > 1 then FreeMem ( l2ndOverlayQuadP); AlphaBlend32(lBGQuadP,lOverlayQuadP, lBG0Clr,lOverlay0Clr, lSliceSz,gBGImg.BGTransPct); FreeMem ( lOverlayQuadP); end; //draw image if gBGImg.FlipAx then FlipSlice (lY,lX, lBGQuadP); if lMultiSlice >= 0 then PasteDimension32(lY,lX, lBGQuadP, lMultislice)//MultiSliceForm.MultiImage,lMultiSlice) else begin SetDimension32(lY,lX, lBGQuadP, gBGImg, ImgForm.PGImageAx, ImgForm.TriplePanel); if {ImgForm.XBarBtn.Down}gBGImg.XBarVisible then begin if gBGImg.FlipAx then lS := round(lY-gBGImg.YViewCenter) else lS := round(gBGImg.YViewCenter); DrawXBar ( round(gBGImg.XViewCenter), lS{round(gBGImg.YViewCenter)},ImgForm.PGImageAx); DrawLabel(ImgForm.PGImageAx, DimToMMx(3),-1,-1); if gBGImg.KnownAlignment then begin DrawTextLabel(ImgForm.PGImageAx,gBGImg.MaxChar[2]{'A'},MaxInt,-1); if gBGImg.Mirror then DrawTextLabelV(ImgForm.PGImageAx,gBGImg.MaxChar[1]{'R'}) else DrawTextLabelV(ImgForm.PGImageAx,gBGImg.MinChar[1]{'L'}); end; end; //XBar end; FreeMem ( lBGQuadP); end; //DrawAxial procedure DrawAxialCore (lSlice: integer; var lBGQuadP: RGBQuadp); var lOverlayQuadP, l2ndOverlayQuadP: RGBQuadp; lnOverlay,lOverlay, lX,lY,lS,lStart,lSliceSz: longint; lBG0Clr,lOverlay0Clr: DWord; begin lX := round(gBGImg.ScrnDim[1]); lY := round(gBGImg.ScrnDim[2]); lS := round(lSlice{ImgForm.ZViewEdit.value}); lSliceSz := (lX * lY{*lByte}); lStart := lX*lY*(lS-1); if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0)or (lS < 0) or (lX < 2) or (lStart < 0) or (lSliceSz < 1) or ((lStart+lSliceSz-1) > gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) then exit; CreateAxial(gMRIcroOverlay[kBGOverlayNum], lStart,lSliceSz, lBGQuadP); //next: overlays lnOverlay := 0; lBG0Clr:= DWord(gMRIcroOverlay[1].LUTinvisible);//just to avoid compiler warning hint - never used... for lOverlay := knMaxOverlay downto 1 do begin if gMRIcroOverlay[lOverlay].ScrnBufferItems > 0 then begin inc(lnOverlay); if lnOverlay = 1 then begin //top overlay GetMem ( lOverlayQuadP , lSliceSz*4); lBG0Clr:= DWord(gMRIcroOverlay[lOverlay].LUTinvisible); CreateAxial(gMRIcroOverlay[lOverlay], lStart,lSliceSz,lOverlayQuadP); end else begin //2nd or lower overlay if lnOverlay = 2 then //2nd overlay GetMem ( l2ndOverlayQuadP , lSliceSz*4); CreateAxial(gMRIcroOverlay[lOverlay], lStart,lSliceSz,l2ndOverlayQuadP); lOverlay0Clr:= DWord(gMRIcroOverlay[lOverlay].LUTinvisible); AlphaBlend32(lOverlayQuadP,l2ndOverlayQuadP, lBG0Clr,lOverlay0Clr, lSliceSz,gBGImg.OverlayTransPct); end; //2nd overlay or more end; //overlay loaded end; //for knOverlay..1 //Finally: draw overlays on BG if lnOverlay > 0 then begin lOverlay0Clr := lBG0Clr; lBG0Clr := 0;//0=impossible, no alpha DWord(lHdr.LUT[0]); if lnOverlay > 1 then FreeMem ( l2ndOverlayQuadP); AlphaBlend32(lBGQuadP,lOverlayQuadP, lBG0Clr,lOverlay0Clr, lSliceSz,gBGImg.BGTransPct); FreeMem ( lOverlayQuadP); end; end; //DrawAxialCore procedure SegmentRGBplanes (lSlice,lXVox,lYVox: integer; var lSliceQuadP: RGBQuadp; var lImg3: bytep); //analyze RGB saves data as red, green blue planes var lLineOffset,lHalfX,lX,lY,lPos,lOutStart,lSliceVox: integer; lTempQuadP: TRGBQuad; begin lSliceVox := lXVox*lYVox; if lSliceVox < 1 then exit; if (ImgForm.FlipLRmenu.checked) and (lXVox > 1) then begin //showmessage('Flip'); lHalfX := lXVox div 2; lLineOffset := 0; for lY := 1 to lYVox do begin for lX := 1 to lHalfX do begin lTempQuadP := lSliceQuadP^[lX+lLineOffset]; lSliceQuadP^[lX+lLineOffset] := lSliceQuadP^[1+lXVox-lX+lLineOffset]; lSliceQuadP^[1+lXVox-lX+lLineOffset] := lTempQuadP; end; //for X lLineOffset := lLineOffset + lXVox; end;//lY end; //mirror lOutStart := (lSlice-1)*lSliceVox*3; for lPos := 1 to lSliceVox do begin lImg3^[lPos+lOutStart] := lSliceQuadP^[lPos].rgbRed; lImg3^[lPos+lOutStart+lSliceVox] := lSliceQuadP^[lPos].rgbGreen; lImg3^[lPos+lOutStart+lSliceVox+lSliceVox] := lSliceQuadP^[lPos].rgbBlue; end; end; procedure CreateAnaRGB; var lFilename: string; lImg3: bytep; lSliceQuadP: RGBQuadp; lVolVox,lX,lY,lZ,lI,lnSlice: integer; begin ImgForm.SaveDialog1.Filter := 'NIfTI compressed (.nii.gz)|*.nii.gz|NIfTI (.nii)|*.nii|NIfTI (.hdr/.img)|*.hdr|Volume of Interest(.voi)|*.voi|MRIcro (.roi)|*.roi'; ImgForm.SaveDialog1.DefaultExt := '.hdr'; ImgForm.SaveDialog1.Filename := ChangeFileExt(ImgForm.SaveDialog1.Filename, ImgForm.SaveDialog1.DefaultExt); //10102006 if not ImgForm.SaveDialog1.Execute then exit; lFilename := ImgForm.SaveDialog1.Filename; lX := round(gBGImg.ScrnDim[1]); lY := round(gBGImg.ScrnDim[2]); lZ := round(gBGImg.ScrnDim[3]); lVolVox := lX*lY*lZ ; if DiskFreeEx(lFilename) < (lVolVox*3) then begin case MessageDlg('Very little space on the selected drive. Attempt to save to this disk?', mtConfirmation, [mbYes, mbCancel], 0) of mrCancel: exit; end; //case end; getmem(lImg3, lVolVox* 3) ; //for Sag lnSlice := lZ; //fx(lX,lY,lZ); getmem(lSliceQuadP, lX*lY* sizeof(TRGBQuad)) ; for lI := 1 to lnSlice do begin //[1+ ((lI-1)*lSliceBytes)] DrawAxialCore (lI,lSliceQuadP ); SegmentRGBplanes (lI,lX,lY,lSliceQuadP,lImg3); end; freemem(lSliceQuadP); //output data SaveAsVOIorNIFTIcore (lFilename, lImg3, lVolVox, 3,1, gMRIcroOverlay[kBGOverlayNum].NiftiHdr); freemem(lImg3); end; procedure ComputeTripleZoom; //computes axial, coronal and sagittal zoom //values are SHL 10, so a 1% signal change will be 1024 //this preserves precision (though at the moment we round to nearest 1%) label 543,641; const kSHval = 1 shl 10; procedure SetPct(lAfrac,lCfrac,lSfrac: single); begin ImgForm.PGImageAx.Tag := trunc(lAfrac*100); ImgForm.PGImageCor.Tag := trunc(lCfrac*100) ; ImgForm.PGImageSag.Tag := trunc(lSfrac*100) ; end; var lHpanel,lWpanel,lH,lW: integer; lPrimaryZoom,l2ndZoom,lZoomw,lZoomh: single; begin SetPct(1,1,1); lHpanel := ImgForm.TriplePanel.ClientHeight-1; lWpanel := ImgForm.TriplePanel.ClientWidth-1; //gBGImg.ZoomPct := (ZoomDrop.ItemIndex-1)*100; if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then exit; if gBGImg.ZoomPct > 0 then begin SetPct(gBGImg.ZoomPct/100,gBGImg.ZoomPct/100,gBGImg.ZoomPct/100); lPrimaryZoom := ImgForm.PGImageAx.Tag/100; if abs(gBGImg.SliceView) <> kSagView0 then lW := gBGImg.ScrnDim[1] //Axial and Coronal width is X else lW := gBGImg.ScrnDim[2]; //Sagittal width is Y goto 543; exit; end; if (abs(gBGImg.SliceView) = kAxView0) or(abs(gBGImg.SliceView) = kCoroView0) or(abs(gBGImg.SliceView) = kSagView0) then begin //only show a single slice if abs(gBGImg.SliceView) <> kAxView0 then lH := gBGImg.ScrnDim[3] //Coronal and Sagitall height is Z else lH := gBGImg.ScrnDim[2]; //Axial height is Y if abs(gBGImg.SliceView) <> kSagView0 then lW := gBGImg.ScrnDim[1] //Axial and Coronal width is X else lW := gBGImg.ScrnDim[2]; //Sagittal width is Y lH := lH+1; lW := lW + 1; end else if gBGImg.SingleRow then begin //show 3 slices in row lW := gBGImg.ScrnDim[2]+gBGImg.ScrnDim[1]+gBGImg.ScrnDim[1]; lWpanel := lWpanel-2- (2*gBGImg.ImageSeparation); if gBGImg.ScrnDim[2]>gBGImg.ScrnDim[3] then lH := gBGImg.ScrnDim[2]+1 else lH := gBGImg.ScrnDim[3]+1 end else begin //show three slices, 2 in top row, one in bottom lW := gBGImg.ScrnDim[1]+gBGImg.ScrnDim[2]+4; lWpanel := lWpanel - 1 - gBGImg.ImageSeparation; lH := gBGImg.ScrnDim[3]+gBGImg.ScrnDim[2]+4; lHpanel := lHpanel - 1 - gBGImg.ImageSeparation; end; if (lW<1) or (lH < 1) or (lHpanel < 1) or (lWpanel < 1) then exit; lZoomw := lWpanel/ lW; lZoomh := lHpanel/ lH; if lZoomw < lZoomh then lPrimaryZoom := lZoomw else lPrimaryZoom := lZoomh; if (gBGImg.ZoomPct = 0) then begin//nearest integer lPrimaryZoom := trunc(lPrimaryZoom); if lPrimaryZoom < 1 then lPrimaryZoom := 1; end; SetPct(lPrimaryZoom,lPrimaryZoom,lPrimaryZoom); 543: //for single slice views, set residual ... if gBGImg.SliceView = kMultiView then exit;//All orientations use primary zoom if gBGImg.SliceView < 0 then begin l2ndZoom := 0; goto 641; end; lWpanel := lWpanel-2- (2*gBGImg.ImageSeparation); //see if we can fit in two more images horizontally //note all images are currently set to primary zooom, so we will read PGImageAx lWpanel := lWPanel - round(lW*lPrimaryZoom); l2ndZoom := 0; if lWpanel < 3 then goto 641; if (abs(gBGImg.SliceView) = kAxView0) then lW := gBGImg.ScrnDim[1]+gBGImg.ScrnDim[2] //CorX + SagY else if (abs(gBGImg.SliceView) = kCoroView0) then lW := gBGImg.ScrnDim[1]+gBGImg.ScrnDim[2] //AxX + SagY else //(gBGImg.SliceView = kSagView) lW := gBGImg.ScrnDim[1]+gBGImg.ScrnDim[1];//AxX+CorX if lW < 1 then //avoid div0 lZoomw := 0 else lZoomw := lWpanel/ lW; if gBGImg.ScrnDim[2] > gBGImg.ScrnDim[3] then lH := gBGImg.ScrnDim[2] else lH := gBGImg.ScrnDim[3]; if lH < 1 then //avoid div0 lZoomh := 0 else lZoomh := lHpanel/ lH; if lZoomw < lZoomh then l2ndZoom := lZoomw else l2ndZoom := lZoomh; 641: if (abs(gBGImg.SliceView) = kAxView0) then SetPct(lPrimaryZoom,l2ndZoom,l2ndZoom) else if (abs(gBGImg.SliceView) = kCoroView0) then SetPct(l2ndZoom,lPrimaryZoom,l2ndZoom) else //(gBGImg.SliceView = kSagView) SetPct(l2ndZoom,l2ndZoom,lPrimaryZoom); end; (*function ComputeTripleZoom : single; var lHc,lWc,lH,lW: integer; lZw,lZh: single; begin result := 1; lHc := ImgForm.TriplePanel.ClientHeight-1; lWc := ImgForm.TriplePanel.ClientWidth-1; //gBGImg.ZoomPct := (ZoomDrop.ItemIndex-1)*100; if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then exit; if gBGImg.ZoomPct > 0 then begin result := gBGImg.ZoomPct / 100; exit; end; if (gBGImg.SliceView = kAxView) or(gBGImg.SliceView = kCoroView) or(gBGImg.SliceView = kSagView) then begin //only show a single slice case gBGImg.SliceView of kSagView: lH := gBGImg.ScrnDim[3]; kCoroView: lH := gBGImg.ScrnDim[3]; else lH := gBGImg.ScrnDim[2]; end;//case case gBGImg.SliceView of kSagView: lW := gBGImg.ScrnDim[2]; kCoroView: lW := gBGImg.ScrnDim[1]; else lW := gBGImg.ScrnDim[1]; end;//case lH := lH+1; lW := lW + 1; end else if gBGImg.SingleRow then begin //show 3 slices in row lW := gBGImg.ScrnDim[2]+gBGImg.ScrnDim[1]+gBGImg.ScrnDim[1]; lWc := lWc-2- (2*gBGImg.ImageSeparation); if gBGImg.ScrnDim[2]>gBGImg.ScrnDim[3] then lH := gBGImg.ScrnDim[2]+1 else lH := gBGImg.ScrnDim[3]+1 end else begin //show three slices, 2 in top row, one in bottom lW := gBGImg.ScrnDim[1]+gBGImg.ScrnDim[2]+4; lWc := lWc - 1 - gBGImg.ImageSeparation; lH := gBGImg.ScrnDim[3]+gBGImg.ScrnDim[2]+4; lHc := lHc - 1 - gBGImg.ImageSeparation; end; if (lW<1) or (lH < 1) or (lHc < 1) or (lWc < 1) then exit; lZw := lWc/ lW; lZh := lHc/ lH; if lZw < lZh then result := lZw else result := lZh; if (gBGImg.ZoomPct = 0) then begin//nearest integer result := trunc(result); if result < 1 then result := 1; end; end; *) procedure ImageLT (lLScroll,lTScroll,lL,lT: integer; var lImage: TImage); begin //if (lImage.Left = lL) and (lImage.Top = lT) then // exit; ImgForm.Caption := 'a'+inttostr(lL)+'x'+inttostr(lT)+'debug'+inttostr(lImage.Left)+'x'+inttostr(lImage.Top); //if lImage.Left <> lL then lImage.Left := lL-lLScroll; //if lImage.Top <> lT then lImage.Top := lT-lTScroll; end; procedure RefreshImages; var lL,lT: integer; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then begin ImgForm.PGImageAx.Width := 0; ImgForm.PGImageSag.Width := 0; ImgForm.PGImageCor.Width := 0; exit; end; {$IFDEF FPC} lL := 0; lT := 0; {$ELSE} lL := imgForm.Triplepanel.HorzScrollBar.Position; lT := imgForm.Triplepanel.VertScrollBar.Position; {$ENDIF} //imgform.Caption := inttostr(lL)+'x'+inttostr(lT); ComputeTripleZoom; ImgForm.PGImageAx.visible := ImgForm.PGImageAx.tag <> 0; ImgForm.PGImageCor.visible := ImgForm.PGImageCor.tag <> 0; ImgForm.PGImageSag.visible := ImgForm.PGImageSag.tag <> 0; if (gBGImg.SliceView = kMultiView) and (not gBGImg.SingleRow) then begin //Coronal is upper-left ImageLT(lL,lT,1,1,ImgForm.PGImageCor); //Axial is below Coronal ImageLT(lL,lT,1,round(gBGImg.ScrnDim[3]*ImgForm.PGImageCor.Tag/100)+gBGImg.ImageSeparation+1,ImgForm.PGImageAx); //Sag is to right of coronal ImageLT(lL,lT,round(gBGImg.ScrnDim[1]*ImgForm.PGImageCor.Tag/100)+gBGImg.ImageSeparation+1,1,ImgForm.PGImageSag); end else begin //Sag is left-most ImageLT(lL,lT,1,1,ImgForm.PGImageSag); //Next is coronal... ImageLT(lL,lT,round(gBGImg.ScrnDim[2]*ImgForm.PGImageSag.Tag/100)+gBGImg.ImageSeparation+1,1,ImgForm.PGImageCor); //Axial is rightmost ImageLT(lL,lT,round(gBGImg.ScrnDim[2]*ImgForm.PGImageSag.Tag/100)+round(gBGImg.ScrnDim[1]*ImgForm.PGImageCor.Tag/100)+gBGImg.ImageSeparation+gBGImg.ImageSeparation+1,1,ImgForm.PGImageAx); end; (* //Coronal is upper-left ImageLT(lL,lT,1,1,ImgForm.PGImageCor); //Axial is below Coronal ImageLT(lL,lT,1,round(gBGImg.ScrnDim[3]*ImgForm.PGImageCor.Tag/100)+gBGImg.ImageSeparation+1,ImgForm.PGImageAx); //Sag is to right of coronal ImageLT(lL,lT,round(gBGImg.ScrnDim[1]*ImgForm.PGImageCor.Tag/100)+gBGImg.ImageSeparation+1,1,ImgForm.PGImageCor); ImgForm.PGImageAx.visible := true; ImgForm.PGImageCor.visible := true; ImgForm.PGImageSag.visible := true; end; if (gBGImg.SliceView = kAxView) or(gBGImg.SliceView = kCoroView) or(gBGImg.SliceView = kSagView) then begin //only show a single slice if (gBGImg.SliceView = kAxView) then begin ImageLT(lL,lT,1,1,ImgForm.PGImageAx); ImgForm.PGImageAx.visible := true; ImgForm.PGImageCor.visible := false; ImgForm.PGImageSag.visible := false; end; if (gBGImg.SliceView = kCoroView) then begin ImageLT(lL,lT,1,1,ImgForm.PGImageCor); ImgForm.PGImageAx.visible := false; ImgForm.PGImageCor.visible := true; ImgForm.PGImageSag.visible := false; end; if (gBGImg.SliceView = kSagView) then begin ImageLT(lL,lT,1,1,ImgForm.PGImageSag); ImgForm.PGImageAx.visible := false; ImgForm.PGImageCor.visible := false; ImgForm.PGImageSag.visible := true; end; end else if gBGImg.SingleRow then begin //Sag is left-most ImageLT(lL,lT,1,1,ImgForm.PGImageSag); //Next is coronal... ImageLT(lL,lT,round(gBGImg.ScrnDim[2]*ImgForm.PGImageSag.Tag/100)+gBGImg.ImageSeparation+1,1,ImgForm.PGImageCor); //Axial is rightmost ImageLT(lL,lT,round(gBGImg.ScrnDim[2]*ImgForm.PGImageSag.Tag/100)+round(gBGImg.ScrnDim[1]*ImgForm.PGImageCor.Tag/100)+gBGImg.ImageSeparation+gBGImg.ImageSeparation+1,1,ImgForm.PGImageAx); ImgForm.PGImageAx.visible := true; ImgForm.PGImageCor.visible := true; ImgForm.PGImageSag.visible := true; end else begin //Coronal is upper-left ImageLT(lL,lT,1,1,ImgForm.PGImageCor); //Axial is below Coronal ImageLT(lL,lT,1,round(gBGImg.ScrnDim[3]*ImgForm.PGImageCor.Tag/100)+gBGImg.ImageSeparation+1,ImgForm.PGImageAx); //Sag is to right of coronal ImageLT(lL,lT,round(gBGImg.ScrnDim[1]*ImgForm.PGImageCor.Tag/100)+gBGImg.ImageSeparation+1,1,ImgForm.PGImageCor); ImgForm.PGImageAx.visible := true; ImgForm.PGImageCor.visible := true; ImgForm.PGImageSag.visible := true; end; *) DrawAxial(round(gBGImg.ZViewCenter),-1); DrawSag (round(gBGImg.XViewCenter),-1); DrawCor (round(gBGImg.YViewCenter),-1); end; //RefreshImages (*procedure RefreshImages; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then begin ImgForm.PGImageAx.Width := 0; ImgForm.PGImageSag.Width := 0; ImgForm.PGImageCor.Width := 0; exit; end; gTripleZoom100 := trunc(100*ComputeTripleZoom); if gTripleZoom100 < 1 then gTripleZOom100 := 1; if (gBGImg.SliceView = kAxView) or(gBGImg.SliceView = kCoroView) or(gBGImg.SliceView = kSagView) then begin //only show a single slice if (gBGImg.SliceView = kAxView) then begin ImgForm.PGImageAx.Top := 1; ImgForm.PGImageAx.Left := 1; ImgForm.PGImageAx.visible := true; ImgForm.PGImageCor.visible := false; ImgForm.PGImageSag.visible := false; end; if (gBGImg.SliceView = kCoroView) then begin ImgForm.PGImageCor.Top := 1; ImgForm.PGImageCor.Left := 1; ImgForm.PGImageAx.visible := false; ImgForm.PGImageCor.visible := true; ImgForm.PGImageSag.visible := false; end; if (gBGImg.SliceView = kSagView) then begin ImgForm.PGImageSag.Top := 1; ImgForm.PGImageSag.Left := 1; ImgForm.PGImageAx.visible := false; ImgForm.PGImageCor.visible := false; ImgForm.PGImageSag.visible := true; end; end else if gBGImg.SingleRow then begin ImgForm.PGImageCor.Left := round(gBGImg.ScrnDim[2]*gTripleZoom100/100)+gBGImg.ImageSeparation+1; ImgForm.PGImageCor.Top := 1; ImgForm.PGImageSag.Left := 1; ImgForm.PGImageSag.Top := 1; ImgForm.PGImageAx.Left := round(gBGImg.ScrnDim[1]*gTripleZoom100/100)+round(gBGImg.ScrnDim[2]*gTripleZoom100/100)+gBGImg.ImageSeparation+gBGImg.ImageSeparation+1; ImgForm.PGImageAx.Top := 1; ImgForm.PGImageAx.visible := true; ImgForm.PGImageCor.visible := true; ImgForm.PGImageSag.visible := true; end else begin ImgForm.PGImageCor.Left := 1; ImgForm.PGImageCor.Top := 1; ImgForm.PGImageSag.Left := round(gBGImg.ScrnDim[1]*gTripleZoom100/100)+gBGImg.ImageSeparation+1; ImgForm.PGImageSag.Top := 1; ImgForm.PGImageAx.Left := 1; ImgForm.PGImageAx.Top := round(gBGImg.ScrnDim[3]*gTripleZoom100/100)+gBGImg.ImageSeparation+1; ImgForm.PGImageAx.visible := true; ImgForm.PGImageCor.visible := true; ImgForm.PGImageSag.visible := true; end; DrawAxial(round(gBGImg.ZViewCenter),-1); DrawSag (round(gBGImg.XViewCenter),-1); DrawCor (round(gBGImg.YViewCenter),-1); end; //RefreshImages *) (*function ComputeTripleZoom : single; var lHc,lWc,lH,lW: integer; lZw,lZh: single; begin result := 1; lHc := ImgForm.TriplePanel.ClientHeight-1; lWc := ImgForm.TriplePanel.ClientWidth-1; //gBGImg.ZoomPct := (ZoomDrop.ItemIndex-1)*100; if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then exit; if gBGImg.ZoomPct > 0 then begin result := gBGImg.ZoomPct / 100; exit; end; if (gBGImg.SliceView = kAxView) or(gBGImg.SliceView = kCoroView) or(gBGImg.SliceView = kSagView) then begin //only show a single slice case gBGImg.SliceView of kSagView: lH := gBGImg.ScrnDim[3]; kCoroView: lH := gBGImg.ScrnDim[3]; else lH := gBGImg.ScrnDim[2]; end;//case case gBGImg.SliceView of kSagView: lW := gBGImg.ScrnDim[2]; kCoroView: lW := gBGImg.ScrnDim[1]; else lW := gBGImg.ScrnDim[1]; end;//case lH := lH+1; lW := lW + 1; end else if gBGImg.SingleRow then begin //show 3 slices in row lW := gBGImg.ScrnDim[2]+gBGImg.ScrnDim[1]+gBGImg.ScrnDim[1]; lWc := lWc-4; if gBGImg.ScrnDim[2]>gBGImg.ScrnDim[3] then lH := gBGImg.ScrnDim[2]+1 else lH := gBGImg.ScrnDim[3]+1 end else begin //show three slices, 2 in top row, one in bottom lW := gBGImg.ScrnDim[1]+gBGImg.ScrnDim[2]+4; lWc := lWc - 2; lH := gBGImg.ScrnDim[3]+gBGImg.ScrnDim[2]+4; lHc := lHc - 2; end; if (lW<1) or (lH < 1) or (lHc < 1) or (lWc < 1) then exit; lZw := lWc/ lW; lZh := lHc/ lH; if lZw < lZh then result := lZw else result := lZh; if (gBGImg.ZoomPct = 0) then begin//nearest integer result := trunc(result); if result < 1 then result := 1; end; end; procedure RefreshImages; //var // lZoom: single; begin if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then begin ImgForm.PGImageAx.Width := 0; ImgForm.PGImageSag.Width := 0; ImgForm.PGImageCor.Width := 0; //yui exit; end; gTripleZoom100 := trunc(100*ComputeTripleZoom); if gTripleZoom100 < 1 then gTripleZOom100 := 1; if (gBGImg.SliceView = kAxView) or(gBGImg.SliceView = kCoroView) or(gBGImg.SliceView = kSagView) then begin //only show a single slice if (gBGImg.SliceView = kAxView) then begin ImgForm.PGImageAx.Top := 1; ImgForm.PGImageAx.Left := 1; ImgForm.PGImageAx.visible := true; ImgForm.PGImageCor.visible := false; ImgForm.PGImageSag.visible := false; end; if (gBGImg.SliceView = kCoroView) then begin ImgForm.PGImageCor.Top := 1; ImgForm.PGImageCor.Left := 1; ImgForm.PGImageAx.visible := false; ImgForm.PGImageCor.visible := true; ImgForm.PGImageSag.visible := false; end; if (gBGImg.SliceView = kSagView) then begin ImgForm.PGImageSag.Top := 1; ImgForm.PGImageSag.Left := 1; ImgForm.PGImageAx.visible := false; ImgForm.PGImageCor.visible := false; ImgForm.PGImageSag.visible := true; end; end else if gBGImg.SingleRow then begin ImgForm.PGImageCor.Left := round(gBGImg.ScrnDim[2]*gTripleZoom100/100)+2; ImgForm.PGImageCor.Top := 1; ImgForm.PGImageSag.Left := 1; ImgForm.PGImageSag.Top := 1; ImgForm.PGImageAx.Left := round(gBGImg.ScrnDim[1]*gTripleZoom100/100)+round(gBGImg.ScrnDim[2]*gTripleZoom100/100)+3; ImgForm.PGImageAx.Top := 1; ImgForm.PGImageAx.visible := true; ImgForm.PGImageCor.visible := true; ImgForm.PGImageSag.visible := true; end else begin ImgForm.PGImageCor.Left := 1; ImgForm.PGImageCor.Top := 1; ImgForm.PGImageSag.Left := round(gBGImg.ScrnDim[1]*gTripleZoom100/100)+2; ImgForm.PGImageSag.Top := 1; ImgForm.PGImageAx.Left := 1; ImgForm.PGImageAx.Top := round(gBGImg.ScrnDim[3]*gTripleZoom100/100)+2; ImgForm.PGImageAx.visible := true; ImgForm.PGImageCor.visible := true; ImgForm.PGImageSag.visible := true; end; DrawAxial(round(gBGImg.ZViewCenter),-1); DrawSag (round(gBGImg.XViewCenter),-1); DrawCor (round(gBGImg.YViewCenter),-1); end; //RefreshImages *) {$IFNDEF FPC} function PNGFilterSize(lFilter: integer; lImage: TImage): integer; var lStream: TMemoryStream; lPNGFilters : TEncodeFilterSet; begin result := 0; if (lImage.Picture.Graphic = nil) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1) then begin Showmessage('You need to load an image before you can save it.'); exit; end; lStream := TMemoryStream.Create; try with TPNGImage.Create do begin //gPNGSaveFilters := []; case lFilter of 1: lPNGFilters := [efSub]; 2: lPNGFilters := [efUp]; 3: lPNGFilters := [efAverage]; 4: lPNGFilters := [efPaeth];//Include(SaveFilters, efPaeth); else lPNGFilters := [efNone];//[efNone,efSub,efUp,efAverage,efPaeth]; end; Filter := lPNGFilters; //filters(efNone, efSub, efUp, efAverage, efPaeth); Assign(lImage.Picture.Graphic); SaveToStream(lStream); result := (lStream.Size); end; finally lStream.Free; end; //Stream TRY..FINALLY end; procedure SaveImgAsPNGBMP (lImage: TImage); var lPNGFilter,lMinFilter,lMinFilterSz,lFilter,lSz: integer; lPNGFilters : TEncodeFilterSet; begin if (lImage.Picture.Graphic = nil) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1) then begin Showmessage('You need to load an image before you can save it.'); exit; end; ImgForm.SaveDialog1.Filename := parsefilename(gMRIcroOverlay[kBGOverlayNum].HdrFilename); ImgForm.SaveDialog1.Filter := 'PNG bitmap|*.png'; ImgForm.SaveDialog1.DefaultExt := '*.png'; if not ImgForm.SaveDialog1.Execute then exit; lPNGFilter := 5; if lPNGFilter = 5 then begin //find PNG filter for smallest filesize lMinFilter := 0; lMinFilterSz := PNGFilterSize(0,lImage); for lFilter := 1 to 4 do begin Application.ProcessMessages; lSz := PNGFilterSize(lFilter,lImage); if lSz < lMinFilterSz then begin lMinFilter := lFilter; lMinFilterSz := lSz; end; end; //Filter 1..4 try each filter end else lMinFilter := lPNGFilter; //if look for smallest filter case lMinFilter of 1: lPNGFilters := [efSub]; 2: lPNGFilters := [efUp]; 3: lPNGFilters := [efAverage]; 4: lPNGFilters := [efPaeth];//Include(SaveFilters, efPaeth); else lPNGFilters := [efNone];//[efNone,efSub,efUp,efAverage,efPaeth]; end; with TPNGImage.Create do begin //filters(efNone, efSub, efUp, efAverage, efPaeth); Filter := lPNGFilters; Assign(lImage.Picture.Bitmap); SaveToFile(ChangeFileExt(ImgForm.SaveDialog1.FileName,'.png')); free; end; end; {$ELSE} procedure SaveImgAsPNGCore (lImage: TBitmap; lFilename: string); var PNG: TPortableNetworkGraphic; begin if (lImage = nil) then begin Showmessage('No image found to save.'); exit; end; PNG := TPortableNetworkGraphic.Create; try PNG.Assign(lImage); //Convert data into png PNG.SaveToFile(ChangeFileExt(lFilename,'.png')); finally PNG.Free; end end; procedure SaveImgAsPNGBMP (lImage: TImage); begin if (lImage.Picture.Graphic = nil) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1) then begin Showmessage('You need to load an image before you can save it.'); exit; end; ImgForm.SaveDialog1.Filename := parsefilename(gMRIcroOverlay[kBGOverlayNum].HdrFilename); {$IFDEF ENDIAN_BIG} ImgForm.SaveDialog1.Filter := 'NG (*.png)|*.png;Bitmap|*.xpm'; ImgForm.SaveDialog1.DefaultExt := '.png'; {$ELSE} ImgForm.SaveDialog1.Filter := 'PNG (*.png)|*.png;Bitmap|*.bmp'; ImgForm.SaveDialog1.DefaultExt := '.png'; {$ENDIF} if not ImgForm.SaveDialog1.Execute then exit; //showmessage(ImgForm.SaveDialog1.FileName); if upcaseext(ImgForm.SaveDialog1.Filename)='.BMP' then lImage.Picture.Bitmap.SaveToFile(ImgForm.SaveDialog1.Filename) else SaveImgAsPNGCore(lImage.Picture.Bitmap,ImgForm.SaveDialog1.Filename); end; {$ENDIF} (*procedure SaveImgAsBMP (lImage: TImage); begin if (lImage.Picture.Graphic = nil) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1) then begin Showmessage('You need to load an image before you can save it.'); exit; end; ImgForm.SaveDialog1.Filename := parsefilename(gMRIcroOverlay[kBGOverlayNum].HdrFilename); ImgForm.SaveDialog1.Filter := 'Bitmap|*.bmp'; ImgForm.SaveDialog1.DefaultExt := '*.bmp'; if not ImgForm.SaveDialog1.Execute then exit; lImage.Picture.Bitmap.SaveToFile(ImgForm.SaveDialog1.Filename); end;*) procedure UndoVolVOI; var lTempBuf: ByteP; begin if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems < 1 then exit; if gBGImg.VOIUndoVolItems <> gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems then exit; GetMem(lTempBuf,gBGImg.VOIUndoVolItems); Move(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,lTempBuf^,gBGImg.VOIUndoVolItems); Move(gBGImg.VOIUndoVol^,gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,gBGImg.VOIUndoVolItems); Move(lTempBuf^,gBGImg.VOIUndoVol^,gBGImg.VOIUndoVolItems); FreeMem(lTempBuf); end; procedure FreeUndoVol; begin if gBGImg.VOIUndoVolItems > 0 then freemem(gBGImg.VOIUndoVol); gBGImg.VOIUndoVolItems := 0; if gBGImg.RenderDepthBufferItems > 0 then freemem(gBGImg.RenderDepthBuffer); gBGImg.RenderDepthBufferItems := 0; end; procedure CreateUndoVol; begin if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems < 1 then exit; gBGImg.VOIUndoSlice := 1; gBGImg.VOIUndoOrient := 4; if gBGImg.VOIUndoVolItems <> gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems then begin FreeUndoVol; gBGImg.VOIUndoVolItems := gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems; getmem(gBGImg.VOIUndoVol,gBGImg.VOIUndoVolItems); end; Move(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,gBGImg.VOIUndoVol^,gBGImg.VOIUndoVolItems); end; function IsVOIOpen: boolean; begin result := false; if (gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems = gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) and (gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems > 0) then result := true; end; function SameAsBG(var lBGImg: TBGImg; var lHdr: TMRIcroHdr): boolean; var lMatrixBG: TMatrix; i, j: Integer; begin result := false; for i := 1 to 3 do //999 if lHdr.NIFTIhdr.dim[i] <>lBGImg.ScrnDim[i] then //999 exit; //999 lMatrixBG := Matrix3D ( lBGImg.Scrnmm[1],0,0,-lBGImg.Scrnmm[1]*(lBGImg.ScrnOri[1]-1), 0,lBGImg.Scrnmm[2],0,-lBGImg.Scrnmm[2]*(lBGImg.ScrnOri[2]-1), 0,0,lBGImg.Scrnmm[3],-lBGImg.Scrnmm[3]*(lBGImg.ScrnOri[3]-1), 0,0,0,1); for i := 1 to 3 do for j := 1 to 4 do begin if lMatrixBG.matrix[i,j] <> lHdr.Mat.matrix[i,j] then exit; end; //showmessage('same'); //for i := 1 to 3 do if (lBGIMg.ScrnDim[i])<>lHdr.NIFTIhdr.dim[i] then exit; result := true; end; procedure EnsureVOIOpen; var lMaxi: integer; begin if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems = gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems then exit; //showmessage(inttostr(gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems)); if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems > 0 then Freemem(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer); gMRIcroOverlay[kVOIOverlayNum].NIFTIhdr.dim[1] := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[1]; gMRIcroOverlay[kVOIOverlayNum].NIFTIhdr.dim[2] := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[2]; gMRIcroOverlay[kVOIOverlayNum].NIFTIhdr.dim[3] := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[3]; gMRIcroOverlay[kVOIOverlayNum].NIFTIhdr.pixdim[1] := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.pixdim[1]; gMRIcroOverlay[kVOIOverlayNum].NIFTIhdr.pixdim[2] := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.pixdim[2]; gMRIcroOverlay[kVOIOverlayNum].NIFTIhdr.pixdim[3] := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.pixdim[3]; gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems := gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems; gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems := gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems; Getmem(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems); fillchar(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems,0); lMaxI := maxint; LoadMonochromeLUT(lMaxi,gBGImg,gMRIcroOverlay[kVOIOverlayNum]); if (gBGImg.Resliced) and (not SameAsBG(gBGImg,gMRIcroOverlay[kBGOverlayNum])) then //fv showmessage('Warning: you are about to draw a region of interest on an resliced image, which can problems with SPM and FSL. Solution: choose Help/Preferences and uncheck ''Reorient images when loading'', then reload your image.'); end; function SelectedImageNum: Integer; begin result := gSelectedImageNum; if (result < 1) or (result > 3) then result := 1; { with ImgForm do begin if TriplePanel.BorderStyle = bsSingle then result := 3 else if TriplePanel.BorderStyle = bsSingle then result := 2 else result := 1 end;} //with ImgForm end;//SelectedImageNum function ComputeInvZoomShl10(lSelectedImageNum: integer; var lImage: TImage): integer; const kSHval = 1 shl 10; var lPGWid,lImgWid: integer; begin result := kSHval;//100% lPGWid := lImage.Picture.Bitmap.Width; if lImage.Tag > 0 then begin result := round((100/lImage.Tag)*kShVal); exit; end; if lSelectedImageNum = 2 then lImgWid := gBGImg.ScrnDim[2] //Sag - horizontal is Y else lImgWid := gBGImg.ScrnDim[1]; //cor and ax - horizontal is X If (lPGWid < 1) or (lImgWid < 1) then exit; result := round(lImgWid/lPGWid* kShVal); end; function ComputeZoomPct(lSelectedImageNum: integer; var lImage: TImage): integer; var lPGWid,lImgWid: integer; begin result := 100;//100% lPGWid := lImage.Picture.Bitmap.Width; if lImage.Tag > 0 then begin result := lImage.Tag; exit; end; if lSelectedImageNum = 2 then lImgWid := gBGImg.ScrnDim[2] //Sag - horizontal is Y else lImgWid := gBGImg.ScrnDim[1]; //cor and ax - horizontal is X If (lPGWid < 1) or (lImgWid < 1) then exit; result := round(lPGWid/lImgWid* 100); end; //ComputeZoomPct procedure ScaleBMP2Draw (var InvZoomShl10,lX, lY, lPanel: integer; lImage: TImage); begin //lScaleShl10 := ComputeInvZoomShl10(SelectedImageNum,lImage); //ImgForm.StatusLabel.Caption := inttostr(InvZoomShl10); if (gBGImg.FlipSag) and (lPanel = 2) then lX := ((lImage.Width-lX) * InvZoomShl10) shr 10 else if (lX < 1) then lX := 0 else lX := (lX * InvZoomShl10) shr 10; if (gBGImg.FlipAx) and (lPanel = 1) then lY := ((lImage.Height-lY) * InvZoomShl10) shr 10 else if (lY < 1) then lY := 0 else lY := (lY * InvZoomShl10) shr 10; end; function ImageZoomPct( var lImage: TImage): integer; begin result := ComputeZoomPct(SelectedImageNum,lImage); end; procedure DrawXBar ( lHorPos, lVerPos: integer;var lImage: TImage); var lL,lT,lW,lH,lZoomPct: integer; lOffset: single; begin lZoomPct := ImageZoomPct(lImage); //amx - must match XYscrn2Img and DrawXBar lW := lImage.Width;// div 100; lH := lImage.Height;// div 100; //lL := lHorPos-1; if lZoomPct > 100 then lOffset := 0.5 else lOffset := 0; lL := round((lHorPos-lOffset) * lZoomPct/100)-1;// div 100; //-1 as indexed from zero, 0.5 for middle of slice lT := lH-round((lVerPos-lOffset) * lZoomPct/100);// div 100; //ImgForm.Caption := inttostr(lZoomPct); //lL := (lHorPos * lZoomPct) div 100; //lT := (lVerPos * lZoomPct) div 100; lImage.Canvas.Pen.Color:=gBGImg.XBarClr; //lImage.Canvas.Pen.Color:=$03FF0000; lImage.Canvas.Pen.Width := gBGImg.XBarThick; //next horizontal lines lImage.Canvas.MoveTo(0,lT); lImage.Canvas.LineTo(lL-gBGImg.XBarGap,lT); lImage.Canvas.MoveTo(lL+gBGImg.XBarGap,lT); lImage.Canvas.LineTo(lW,lT); //next vertical lines lImage.Canvas.MoveTo(lL,0); lImage.Canvas.LineTo(lL,lT-gBGImg.XBarGap); lImage.Canvas.MoveTo(lL,lT+gBGImg.XBarGap); lImage.Canvas.LineTo(lL,lH); end; //Proc DrawXBar procedure ScaleScrn2BMP (var lX, lY: integer;lImage: TImage); var lScale: single; begin if (lImage.Height = 0) or (lImage.Width = 0) then exit; lScale := lImage.Picture.Bitmap.Height /lImage.Height; lX := round(lX * lScale); lY := round(lY * lScale); end; function Scrn2ScaledIntensity (lHdr: TMRIcroHdr; lRaw: single): single; var lRange,lMin,lMax: single; begin lMin := lHdr.WindowScaledMin; lMax := lHdr.WindowScaledMax; if lMin > lMax then begin lRange := lMin; lMin := lMax; lMax := lRange; end; lRange := lMax - lMin; result := lMin+(lRaw/255*lRange); end; procedure SaveMRIcroROI (lFilename: string); const kMax12bit = 4095; kMax16bit = (256*256)-1; kMax20bit = (16*256*256)-1; k20v16bit = kMax20bit - kMax16bit; kMaxRuns = 10000; kMaxFile = 65536; var lFilePos,lZPos,lZ,lSliceSz,lSliceOffset,lPrevVoxel,lVoxel,lRun,lnRuns,lSlicePos: integer; lRunStartRA,lRunLengthRA : array [1..kMaxRuns] of longint; lOutputRA: array [1..kMaxFile] of word; lF: File; lBigFormat: boolean; begin lSliceSz := gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]; lZ := gBGImg.ScrnDim[3]; if lSliceSz > 65535 then lBigFormat := true else lBigFormat := false; if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems<> (lSLiceSz*lZ) then begin Showmessage('You need to create a VOI before you can save it.'); exit; end; lSliceOffset := 0; lFilePos := 0; for lZPos := 1 to lZ do begin lnRuns := 0; lPrevVoxel := 0; for lSlicePos := 1 to lSliceSz do begin lVoxel := gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lSlicePos+lSliceOffset]; if lVoxel > 1 then lVoxel := 1; if lVoxel <> lPrevVoxel then begin //start or end run lPrevVoxel := lVoxel; if lnRuns = kMaxRuns then Showmessage('Error: To many runs...') else if lVoxel = 1 then begin //start new run inc(lnRuns); lRunStartRA[lnRuns] := lSlicePos; end else begin lRunLengthRA[lnRuns] := lSlicePos-lRunStartRA[lnRuns]; end; end; //if start or end if (lVoxel > 0) and ((lSlicePos-lRunStartRA[lnRuns])>4090) then begin //end this run, begin new lRunLengthRA[lnRuns] := lSlicePos-lRunStartRA[lnRuns]+1; lPrevVoxel := 0; end; //run >4090 end; //for each voxel in slice if lPrevVoxel = 1 then lRunLengthRA[lnRuns] := lSliceSz-lRunStartRA[lnRuns]+1; lSliceOffset := lSliceOffset+lSliceSz; if lnRuns > 0 then begin inc(lFilePos); lOutputRA[lFilePos] := lZPos; //record slice number inc(lFilePos); lOutputRA[lFilePos] := 2*(lnRuns+1); //words to store this slice: 2 per run, plus 2 for slice number and size if lBigFormat then begin for lRun := 1 to lnRuns do begin inc(lFilePos); lOutputRA[lFilePos] := (lRunStartRA[lRun] and kMax16bit); //record slice number inc(lFilePos); lOutputRA[lFilePos] := (lRunLengthRA[lRun] and kMax12bit)+ ((lRunStartRA[lRun] and k20v16bit)shr 4) ; //record slice number end; end else begin for lRun := 1 to lnRuns do begin inc(lFilePos); lOutputRA[lFilePos] := lRunStartRA[lRun]; //record slice number inc(lFilePos); lOutputRA[lFilePos] := lRunLengthRA[lRun]; //record slice number end;//for each run end; //small format end; //if data on this slice end; //for lZ if lFilePos = 0 then begin Showmessage('No VOIs detected - unable to create blank MRIcro ROI.'); exit; end; if lBigFormat then lOutputRA[1] := lOutputRA[1]+ 32768; //set MSB to 1 to denote this file uses 12/20 bytes Filemode := 1; AssignFile(lF, lFileName); {WIN} Rewrite(lF,lFilePos*2); BlockWrite(lF,lOutputRA, 1 {, NumWritten}); CloseFile(lF); Filemode := 2; end; procedure SaveAsVOIorNIFTIinnercore (var lFilename: string; var lImgBuffer: ByteP; lImgBufferItems, lImgBufferBPP,lnVol: integer; var lNiftiHdr: TNIFTIHdr); const kImgOffset = 352; //header is 348 bytes, but 352 is divisible by 8... kImgOffset2 = 480; //header is 348 bytes, but 352 is divisible by 8... lNII2 = false; var lHdr: TNIFTIhdr; lBuff: ByteP; lF: File; lXmm,lYmm,lZmm: single; lUnCompressedFilename,lExt: string; lImgOffset,lC,lFSize: integer; lMat: TMatrix; lHdr2: TNIfTIHdr2; begin lExt := UpCaseExt(lFileName); move(lNiftiHdr,lHdr,sizeof(lHdr)); if (lExt='.VOI') then begin lHdr.intent_code := kNIFTI_INTENT_NONE; lHdr.intent_name[1] := 'B';//Binary lHdr.scl_slope := 1/kVOI8bit; lHdr.scl_inter := 0; end; if lnVol > 1 then begin lHdr.dim[0] := 4;//3D july2006 lHdr.dim[4] := lnVol;//3D july2006 end else begin lHdr.dim[0] := 3;//3D july2006 lHdr.dim[4] := 1;//3D july2006 end; //if not (lImgBufferItems = (lHdr.dim[1]*lHdr.dim[2]*lHdr.dim[3])) then begin //july2006 //below - images are repositioned to match background if gBGImg.Resliced then begin lHdr.dim[1] := gBGImg.ScrnDim[1]; lHdr.dim[2] := gBGImg.ScrnDim[2]; lHdr.dim[3] := gBGImg.ScrnDim[3]; lHdr.pixdim[1] := gBGImg.ScrnMM[1]; //Apr07 lHdr.pixdim[2] := gBGImg.ScrnMM[2]; //Apr07 lHdr.pixdim[3] := gBGImg.ScrnMM[3]; //Apr07 lHdr.sform_code :=kNIFTI_XFORM_SCANNER_ANAT; //10102006 WriteNiftiMatrix ( lHdr, //must match MAGMA in nifti_hdr gBGImg.ScrnMM[1],0,0,(gBGImg.ScrnOri[1]-1)*-gBGImg.ScrnMM[1], 0,gBGImg.ScrnMM[2],0,(gBGImg.ScrnOri[2]-1)*-gBGImg.ScrnMM[2], 0,0,gBGImg.ScrnMM[3],(gBGImg.ScrnOri[3]-1)*-gBGImg.ScrnMM[3]); lHdr.qform_code := kNIFTI_XFORM_SCANNER_ANAT; //May07 lMat:= Matrix3D ( gBGImg.ScrnMM[1],0,0,(gBGImg.ScrnOri[1]-1)*-gBGImg.ScrnMM[1], 0,gBGImg.ScrnMM[2],0,(gBGImg.ScrnOri[2]-1)*-gBGImg.ScrnMM[2], 0,0,gBGImg.ScrnMM[3],(gBGImg.ScrnOri[3]-1)*-gBGImg.ScrnMM[3], 0,0,0,1); nifti_mat44_to_quatern( lMat,lHdr.quatern_b,lHdr.quatern_c,lHdr.quatern_d, lHdr.qoffset_x,lHdr.qoffset_y,lHdr.qoffset_z, lXmm,lYmm,lZmm,lHdr.pixdim[0]); end else begin //Apr07 - for unresliced data, use raw header for data end; case lImgBufferBPP of 4: begin {lSingleRA := SingleP(lImgBuffer); for lPos := 1 to 4 do fx(22,lSingleRA^[lPos]);} lHdr.bitpix := 32; lHdr.datatype := kDT_FLOAT;//note 32-bit integers saved internally as 32-bit float end; 3: begin lHdr.bitpix := 24; lHdr.datatype := kDT_RGB; end; 2: begin lHdr.bitpix := 16; lHdr.datatype := kDT_SIGNED_SHORT; end; 1: begin lHdr.bitpix := 8; lHdr.datatype := kDT_UNSIGNED_CHAR; //lHdr.scl_inter := lHdr.WindowScaledMin; //lHdr.scl_slope := (lHdr.WindowScaledMax-lHdr.WindowScaledMin) /255; end; else begin showmessage('Error: Unsupported bytes per voxel: '+inttostr(lImgBufferBPP)); exit; end; end; if (lExt='.IMG') or (lExt ='.HDR') then begin lHdr.magic := kNIFTI_MAGIC_SEPARATE_HDR; lHdr.vox_offset := 0; Filemode := 1; //next write header data as .hdr lFilename := changeFileExt(lFilename,'.hdr'); AssignFile(lF, lFileName); Rewrite(lF,sizeof(TNIFTIhdr)); BlockWrite(lF,lHdr, 1); CloseFile(lF); //next write image data as .img lFilename := changeFileExt(lFilename,'.img'); AssignFile(lF, lFileName); {WIN} Rewrite(lF,lImgBufferItems*lImgBufferBPP); BlockWrite(lF,lImgBuffer^,1); CloseFile(lF); Filemode := 2; exit; end; //separate header if lNII2 then begin lHdr.magic := kNIFTI2_MAGIC_EMBEDDED_HDR; lImgOffset := kImgOffset2; end else begin lHdr.magic := kNIFTI_MAGIC_EMBEDDED_HDR; lImgOffset := kImgOffset; end; lHdr.vox_offset := lImgOffset;//352 bytes lFSize := lImgOffset+(lImgBufferItems*lImgBufferBPP); getmem(lBuff,lFSize); if lNII2 then begin NII1_2_NII2 ( lHdr, lHdr2); move(lHdr2,lBuff^,sizeof(lHdr2)); end else move(lHdr,lBuff^,sizeof(lHdr)); //Next: NIfTI 1.1 requires bytes 349..352 set to zero when no XML information lC := lImgOffset; lBuff^[lC-3] := 0; lBuff^[lC-2] := 0; lBuff^[lC-1] := 0; lBuff^[lC] := 0; lC := lImgOffset+1; //move(lImgBuffer^[1],lBuff[lC],lImgBufferItems*lImgBufferBPP); move(lImgBuffer^,lBuff^[lC],lImgBufferItems*lImgBufferBPP); if (lExt='.NII') then begin Filemode := 1; AssignFile(lF, lFileName); Rewrite(lF,lFSize); BlockWrite(lF,lBuff^,1); CloseFile(lF); Filemode := 2; exit; end; //uncompressed lUnCompressedFilename := changefileextx(lFilename,'.nii'); GZipBuffer(lUnCompressedFilename,lFilename,lBuff,lFSize,false); freemem(lBuff); end; procedure SaveAsVOIorNIFTIcoreOrtho (var lFilename: string; var lImgBuffer: ByteP; lImgBufferItems, lImgBufferBPP,lnVol: integer; var lNiftiHdr: TNIFTIHdr); var lISize: integer; lTempHdr: TMRIcroHdr; begin if not gBGImg.UseReorientHdr then exit; lTempHdr.NIFTIhdr := lNIftIHdr; lISize := (lImgBufferItems*lImgBufferBPP); GetMem(lTempHdr.ImgBufferUnaligned ,lISize + 16); {$IFDEF FPC} lTempHdr.ImgBuffer := align(lTempHdr.ImgBufferUnaligned,16); {$ELSE} lTempHdr.ImgBuffer := ByteP($fffffff0 and (integer(lTempHdr.ImgBufferUnaligned)+15)); {$ENDIF} lTempHdr.ImgBufferItems := lImgBufferItems; lTempHdr.ImgBufferBPP := lImgBufferBPP; move(lImgBuffer^,lTempHdr.ImgBuffer^,lISize); Reslice_Img_To_Unaligned (gBGImg.ReorientHdr, lTempHdr ,true); SaveAsVOIorNIFTIinnercore (lFilename, lTempHdr.ImgBuffer,lImgBufferItems, lImgBufferBPP,lnVol, lTempHdr.NIFTIhdr); //restore orientation //12/2010 remove this line - we changed TMPHdr lNiftiHdr := lTempHdr.NIFtiHdr; //reslease memory FreeMem(lTempHdr.ImgBufferUnaligned); end; procedure SaveAsVOIorNIFTIcore (var lFilename: string; var lImgBuffer: ByteP; lImgBufferItems, lImgBufferBPP,lnVol: integer; var lNiftiHdr: TNIFTIHdr); const kImgOffset = 352; //header is 348 bytes, but 352 is divisible by 8... begin //10/2007 - scl_slope; //lExt := UpCaseExt(lFileName); if DiskFreeEx(lFilename) < (kImgOffset+(lImgBufferItems*lImgBufferBPP)) then begin case MessageDlg('Very little space on the selected drive. Attempt to save to this disk?', mtConfirmation, [mbYes, mbCancel], 0) of mrCancel: exit; end; //case end; if FileExistsEX(lFileName) then begin case MessageDlg('Overwrite the file named '+lFileName+'?', mtConfirmation, [mbYes, mbCancel], 0) of mrCancel: exit; end; //case end; //file exists if not gBGImg.UseReorientHdr then SaveAsVOIorNIFTIinnercore (lFilename, lImgBuffer,lImgBufferItems, lImgBufferBPP,lnVol, lNiftiHdr) else SaveAsVOIorNIFTIcoreOrtho (lFilename, lImgBuffer,lImgBufferItems, lImgBufferBPP,lnVol, lNiftiHdr); end; (*procedure SaveAsVOIorNIFTIcore (var lFilename: string; var lImgBuffer: ByteP; lImgBufferItems, lImgBufferBPP,lnVol: integer; var lNiftiHdr: TNIFTIHdr); const kImgOffset = 352; //header is 348 bytes, but 352 is divisible by 8... var lHdr: TNIFTIhdr; lBuff: ByteP; lMat: TMatrix; lXmm,lYmm,lZmm: single; lF: File; lUnCompressedFilename,lExt: string; lC,lFSize: integer; begin lExt := UpCaseExt(lFileName); if DiskFreeEx(lFilename) < (kImgOffset+(lImgBufferItems*lImgBufferBPP)) then begin case MessageDlg('Very little space on the selected drive. Attempt to save to this disk?', mtConfirmation, [mbYes, mbCancel], 0) of mrCancel: exit; end; //case end; if FileExistsEX(lFileName) then begin case MessageDlg('Overwrite the file named '+lFileName+'?', mtConfirmation, [mbYes, mbCancel], 0) of mrCancel: exit; end; //case end; //file exists move(lNiftiHdr,lHdr,sizeof(lHdr)); if (lExt='.VOI') then begin lHdr.intent_code := kNIFTI_INTENT_NONE; lHdr.intent_name[1] := 'B';//Binary lHdr.scl_slope := 1/kVOI8bit; lHdr.scl_inter := 0; end; if lnVol > 1 then begin lHdr.dim[0] := 4;//3D july2006 lHdr.dim[4] := lnVol;//3D july2006 end else begin lHdr.dim[0] := 3;//3D july2006 lHdr.dim[4] := 1;//3D july2006 end; //if not (lImgBufferItems = (lHdr.dim[1]*lHdr.dim[2]*lHdr.dim[3])) then begin //july2006 //below - images are repositioned to match background if gBGImg.Resliced then begin lHdr.dim[1] := gBGImg.ScrnDim[1]; lHdr.dim[2] := gBGImg.ScrnDim[2]; lHdr.dim[3] := gBGImg.ScrnDim[3]; lHdr.pixdim[1] := gBGImg.ScrnMM[1]; //Apr07 lHdr.pixdim[2] := gBGImg.ScrnMM[2]; //Apr07 lHdr.pixdim[3] := gBGImg.ScrnMM[3]; //Apr07 lHdr.sform_code :=kNIFTI_XFORM_SCANNER_ANAT; //10102006 WriteNiftiMatrix ( lHdr, //must match MAGMA in nifti_hdr gBGImg.ScrnMM[1],0,0,(gBGImg.ScrnOri[1]-1)*-gBGImg.ScrnMM[1], 0,gBGImg.ScrnMM[2],0,(gBGImg.ScrnOri[2]-1)*-gBGImg.ScrnMM[2], 0,0,gBGImg.ScrnMM[3],(gBGImg.ScrnOri[3]-1)*-gBGImg.ScrnMM[3]); lHdr.qform_code := kNIFTI_XFORM_SCANNER_ANAT; //May07 lMat:= Matrix3D ( gBGImg.ScrnMM[1],0,0,(gBGImg.ScrnOri[1]-1)*-gBGImg.ScrnMM[1], 0,gBGImg.ScrnMM[2],0,(gBGImg.ScrnOri[2]-1)*-gBGImg.ScrnMM[2], 0,0,gBGImg.ScrnMM[3],(gBGImg.ScrnOri[3]-1)*-gBGImg.ScrnMM[3], 0,0,0,1); nifti_mat44_to_quatern( lMat,lHdr.quatern_b,lHdr.quatern_c,lHdr.quatern_d, lHdr.qoffset_x,lHdr.qoffset_y,lHdr.qoffset_z, lXmm,lYmm,lZmm,lHdr.pixdim[0]); end else begin //Apr07 - for unresliced data, use raw header for data end; case lImgBufferBPP of 4: begin {lSingleRA := SingleP(lImgBuffer); for lPos := 1 to 4 do fx(22,lSingleRA^[lPos]);} lHdr.bitpix := 32; lHdr.datatype := kDT_FLOAT;//note 32-bit integers saved internally as 32-bit float end; 3: begin lHdr.bitpix := 24; lHdr.datatype := kDT_RGB; end; 2: begin lHdr.bitpix := 16; lHdr.datatype := kDT_SIGNED_SHORT; end; 1: begin lHdr.bitpix := 8; lHdr.datatype := kDT_UNSIGNED_CHAR; //lHdr.scl_inter := lHdr.WindowScaledMin; //lHdr.scl_slope := (lHdr.WindowScaledMax-lHdr.WindowScaledMin) /255; end; else begin showmessage('Error: Unsupported bytes per voxel: '+inttostr(lImgBufferBPP)); exit; end; end; if (lExt='.IMG') or (lExt ='.HDR') then begin lHdr.magic := kNIFTI_MAGIC_SEPARATE_HDR; lHdr.vox_offset := 0; Filemode := 1; //next write header data as .hdr lFilename := changeFileExt(lFilename,'.hdr'); AssignFile(lF, lFileName); Rewrite(lF,sizeof(TNIFTIhdr)); BlockWrite(lF,lHdr, 1); CloseFile(lF); //next write image data as .img lFilename := changeFileExt(lFilename,'.img'); AssignFile(lF, lFileName); {WIN} Rewrite(lF,lImgBufferItems*lImgBufferBPP); BlockWrite(lF,lImgBuffer^,1); CloseFile(lF); Filemode := 2; exit; end; //separate header lHdr.magic := kNIFTI_MAGIC_EMBEDDED_HDR; lHdr.vox_offset := kImgOffset;//352 bytes lFSize := kImgOffset+(lImgBufferItems*lImgBufferBPP); getmem(lBuff,lFSize); move(lHdr,lBuff^,sizeof(lHdr)); //Next: NIfTI 1.1 requires bytes 349..352 set to zero when no XML information lC := kImgOffset; lBuff^[lC-3] := 0; lBuff^[lC-2] := 0; lBuff^[lC-1] := 0; lBuff^[lC] := 0; lC := kImgOffset+1; //move(lImgBuffer^[1],lBuff[lC],lImgBufferItems*lImgBufferBPP); move(lImgBuffer^,lBuff^[lC],lImgBufferItems*lImgBufferBPP); if (lExt='.NII') then begin Filemode := 1; AssignFile(lF, lFileName); Rewrite(lF,lFSize); BlockWrite(lF,lBuff^,1); CloseFile(lF); Filemode := 2; exit; end; //uncompressed lUnCompressedFilename := changefileext(lFilename,'.nii'); GZipBuffer(lUnCompressedFilename,lFilename,lBuff,lFSize,false); freemem(lBuff); end;*) procedure SaveAsVOIorNIFTI (var lImgBuffer: ByteP; lImgBufferItems, lImgBufferBPP,lnVol: integer; DefaultFormatVOI: boolean; var lNiftiHdr: TNIFTIHdr; lDefFilename: string); const kImgOffset = 352; //header is 348 bytes, but 352 is diisible by 8... var lFileName,lExt: string; begin if DefaultFormatVOI then begin ImgForm.SaveDialog1.Filter := 'Volume of Interest(.voi)|*.voi|NIfTI (.nii)|*.nii|NIfTI compressed (.nii.gz)|*.nii.gz|NIfTI (.hdr/.img)|*.hdr|MRIcro (.roi)|*.roi'; ImgForm.SaveDialog1.Filename := changefileext(ImgForm.SaveDialog1.Filename,'.voi');//10/10/06 ImgForm.SaveDialog1.DefaultExt := '.voi'; end else begin ImgForm.SaveDialog1.Filter := 'NIfTI compressed (.nii.gz)|*.nii.gz|NIfTI (.nii)|*.nii|NIfTI (.hdr/.img)|*.hdr|Volume of Interest(.voi)|*.voi|MRIcro (.roi)|*.roi'; ImgForm.SaveDialog1.Filename := changefileext(ImgForm.SaveDialog1.Filename,'.nii.gz');//10/10/06 ImgForm.SaveDialog1.DefaultExt := '.nii.gz'; end; if lDefFilename <> '' then ImgForm.SaveDialog1.Filename := ParseFilename(lDefFilename); if not ImgForm.SaveDialog1.Execute then exit; lFileName := ImgForm.SaveDialog1.Filename; lExt := UpCaseExt(lFileName); gBGImg.VOIchanged := false; if (lExt='.ROI') then begin Showmessage('Note that the MRIcro ROI format does not save image dimensions. You may want to save a copy as VOI format.'); SaveMRIcroROI (lFileName); exit; end; SaveAsVOIorNIFTIcore (lFilename,lImgBuffer, lImgBufferItems, lImgBufferBPP,lnVol,lNiftiHdr); end; procedure SetSubmenuWithTag (var lRootMenu: TMenuItem; lTag: Integer); var lCount,lSubMenu: integer; begin lCount := lRootMenu.Count; if lCount < 1 then exit; for lSubMenu := (lCount-1) downto 0 do if lRootmenu.Items[lSubmenu].Tag = lTag then begin lRootmenu.Items[lSubmenu].Checked := true; exit end; //will exit unless tag not found: default select 1st item lRootmenu.Items[0].Checked := true; //While Recent1.Count > 0 do Recent1.Items[0].Free; end; function MaxDim (lX,lY,lZ: integer): integer; //returns largest of 3 begin result := lX; if lY > result then result := lY; if lZ > result then result := lZ; end; procedure SetBGImgDefaults (var lBGImg: TBGImg); begin with lBGImg do begin FlipAx := false; FlipSag := false; OverlayTransPct := -1; FontSize := 12; BGTransPct := 0; LicenseID := 0; ResliceOnLoad := false; OrthoReslice := true; Prompt4DVolume := true; MaxDim := 384; XBarGap := 7; XBarThick := 3; XBarClr := clBlue; VOIClr := 255;//clRed; VOIInvZoom := 1 shl 10; //1024 = 100% LesionSmooth := 3;//3mm smoothing LesionDilate := 8; VOIUndoSlice := 0; VOIUndoOrient := 0; VOIChanged := false; VOImirrored := false; VOIUndoVolItems := 0; RenderDepthBufferItems := 0; SigDig := 5; ImageSeparation := 0; SliceView := 0;//multiple slices SPMDefaultsStatsFmriT := 16; SingleRow := false; SPMDefaultsStatsFmriT0 := 1; SaveDefaultIni := true; ThinPen := true; XBarVisible := true; OverlaySmooth := true; //FSLDIR := 'FSLDIR=/usr/local/fsl'; FSLBASE := '/usr/local/fsl'; //FSLBETEXE := '/usr/local/fsl/bin/bet'; FSLOUTPUTTYPE := 'FSLOUTPUTTYPE=NIFTI_GZ'; //AutoFill := false; KnownAlignment := false; StretchQuality := sqHigh; end; end; procedure AlphaBlend32(lBGQuad,lOverlayQuad : RGBQuadp; lBG0Clr,lOverlay0Clr: DWord; lSlicePixels, lOverlayTransPct: integer); // 630 var lBGwt,lOverlaywt,lPixel,lPos:integer; lBGp,lOverlayP: ByteP; lBGDWordp,lOverlayDWordp : DWordp; begin //note Here we blend the RGBA values - in fact we only need to blend RGB //however, the position of Alpha varies between OSX ARGB and Linux/Windows RGBA //this routine would be ~25% faster if we use a compiler-switch for the OS, //but I do not want to do this until the Compiler code settles a bit more... lBGp := ByteP(lBGQuad); lOverlayP := ByteP(lOverlayQuad); lOverlayDWordp := DWordp(lOverlayQuad); lBGDWordp := DWordp(lBGQuad); //next: transparency weighting lBGwt := round((lOverlayTransPct)/100 * 1024); lOverlaywt := round((100-lOverlayTransPct)/100 * 1024); //next redraw each pixel lPos := 1; if lOverlayTransPct > -1 then begin for lPixel := 1 to lSlicePixels do begin if lOverlayDWordp^[lPixel] = lOverlay0Clr then inc(lPos,4) else if lBGDWordp^[lPixel] = lBG0Clr then begin lBGDWordp^[lPixel] := lOverlayDWordp^[lPixel]; inc(lPos,4); end else begin lBGp^[lPos] := (lBGp^[lPos]*lBGwt+lOverlayP^[lPos]*lOverlaywt) shr 10; inc(lPos); lBGp^[lPos] := (lBGp^[lPos]*lBGwt+lOverlayP^[lPos]*lOverlaywt) shr 10; inc(lPos); lBGp^[lPos] := (lBGp^[lPos]*lBGwt+lOverlayP^[lPos]*lOverlaywt) shr 10; inc(lPos); lBGp^[lPos] := (lBGp^[lPos]*lBGwt+lOverlayP^[lPos]*lOverlaywt) shr 10; inc(lPos); end; end; end else begin for lPixel := 1 to lSlicePixels do begin if lOverlayDWordp^[lPixel] = lOverlay0Clr then inc(lPos,4) else if lBGDWordp^[lPixel] = lBG0Clr then begin lBGDWordp^[lPixel] := lOverlayDWordp^[lPixel]; inc(lPos,4); end else begin if lOverlayP^[lPos] > lBGp^[lPos] then lBGp^[lPos] := lOverlayP^[lPos]; inc(lPos); if lOverlayP^[lPos] > lBGp^[lPos] then lBGp^[lPos] := lOverlayP^[lPos]; inc(lPos); if lOverlayP^[lPos] > lBGp^[lPos] then lBGp^[lPos] := lOverlayP^[lPos]; inc(lPos); if lOverlayP^[lPos] > lBGp^[lPos] then lBGp^[lPos] := lOverlayP^[lPos]; inc(lPos); end; end; end; end; function Raw2ScaledIntensity (lHdr: TMRIcroHdr; lRaw: single): single; begin if lHdr.NIFTIhdr.scl_slope = 0 then result := lRaw+lHdr.NIFTIhdr.scl_inter else result := (lRaw * lHdr.NIFTIhdr.scl_slope)+lHdr.NIFTIhdr.scl_inter; end; function Scaled2RawIntensity (lHdr: TMRIcroHdr; lScaled: single): single; begin if lHdr.NIFTIhdr.scl_slope = 0 then result := (lScaled)-lHdr.NIFTIhdr.scl_inter else result := (lScaled-lHdr.NIFTIhdr.scl_inter) / lHdr.NIFTIhdr.scl_slope; end; procedure FilterLUT (var lBackgroundImg: TBGImg; var lHdr: TMRIcroHdr; lMin, lMax: integer); //lLUT: 0=gray,1=red,2=green,3=blue var lInc: integer; lRGB : TRGBQuad; begin for lInc := 0 to 255 do lHdr.LUT[lInc] := lBackgroundImg.BackupLUT[lInc]; if (lMin < 0) or (lMin > 255) or (lMax < 0) or (lMax > 255) then exit; if lMin > lMax then begin lInc := lMin; lMin := lMax; lMax := lInc; end; //swap lMin/lMax lRGB.rgbRed := (lBackgroundImg.XBarClr and 255) ; lRGB.rgbGreen := ((lBackgroundImg.XBarClr shr 8) and 255) ;// and 65280; lRGB.rgbBlue := ((lBackgroundImg.XBarClr shr 16) and 255) ;//and 16711680; lRGB.rgbReserved := kLUTalpha; for lInc := lMin to lMax do lHdr.LUT[lInc] := lRGB; //z end; procedure LoadLabelLUT(var lBackgroundImg: TBGImg; var lHdr: TMRIcroHdr); var lLUTname: string; lInc: integer; lTextFile: TextFile; lStr1: string; lCh: char; begin lLUTname := changefileext(lHdr.HdrFileName,'.lut'); if Fileexists(lLUTname) then begin lHdr.UsesCustomPalette := true; LoadColorScheme(lLUTname,lHdr); end; //next load labels for lInc := 0 to 255 do //regular lBackgroundImg.LabelStr20[lInc] := inttostr(lInc); lLUTname := changefileext(lHdr.HdrFileName,'.txt'); if Fileexists(lLUTname) then begin assignfile(lTextFile,lLUTname); Filemode := 0; reset(lTextFile); while not EOF(lTextFile) do begin lStr1 := ''; repeat read(lTextFile,lCh); if (lCh >= '0') and (lCh <= '9') then lStr1 := lStr1 + lCh; until (EOF(lTextFile)) or (lCh=kCR) or (lCh=UNIXeoln) or (((lCh=kTab)or (lCh=' ')) and (length(lStr1)>0)); if (length(lStr1) > 0) and (not EOF(lTextFile)) then begin linc := strtoint(lStr1); if (lInc >= 0) and (lInc <= 255) then begin lStr1 := ''; repeat read(lTextFile,lCh); if (EOF(lTextFile)) or (lCh=kCR) or (lCh=UNIXeoln) or (lCh=kTab)or (lCh=' ') then else lStr1 := lStr1 + lCh; until (EOF(lTextFile)) or (lCh=kCR) or (lCh=UNIXeoln) or (lCh=kTab)or (lCh=' '); lBackgroundImg.LabelStr20[lInc] := lStr1; end; end; end; CloseFile(lTextFile); Filemode := 2; end; end; procedure LoadMonochromeLUT (var lLUT: integer; var lBackgroundImg: TBGImg; var lHdr: TMRIcroHdr); //lLUT: 0=gray,1=red,2=green,3=blue var lR,lG,lB,lInc: integer; begin for lInc := 0 to 255 do lHdr.LUT[lInc].rgbReserved := kLUTalpha; case lLUT of 1: for lInc := 0 to 255 do begin lHdr.LUT[lInc].rgbRed := lInc; lHdr.LUT[lInc].rgbGreen := 0; lHdr.LUT[lInc].rgbBlue := 0; end;//red 2: for lInc := 0 to 255 do begin lHdr.LUT[lInc].rgbRed := 0; lHdr.LUT[lInc].rgbGreen := 0; lHdr.LUT[lInc].rgbBlue := lInc; end;//blue 3: for lInc := 0 to 255 do begin lHdr.LUT[lInc].rgbRed := 0; lHdr.LUT[lInc].rgbGreen := lInc; lHdr.LUT[lInc].rgbBlue := 0; end;//green 4: for lInc := 0 to 255 do begin lHdr.LUT[lInc].rgbRed := lInc; lHdr.LUT[lInc].rgbGreen := 0; lHdr.LUT[lInc].rgbBlue := lInc; end;//r+b=violet 5: for lInc := 0 to 255 do begin lHdr.LUT[lInc].rgbRed := lInc; lHdr.LUT[lInc].rgbGreen := lInc; lHdr.LUT[lInc].rgbBlue := 0; end;//red + green = yellow 6: for lInc := 0 to 255 do begin lHdr.LUT[lInc].rgbRed := 0; lHdr.LUT[lInc].rgbGreen := lInc; lHdr.LUT[lInc].rgbBlue := lINc; end;//green+blue = cyan maxint: begin// //showmessage(inttostr(lBackgroundImg.VOIClr)+' '+'r'+inttostr(lR)+'g'+inttostr(lG)+'b'+inttostr(lB)); lHdr.LUT[0].rgbRed := 0; lHdr.LUT[0].rgbGreen := 0; lHdr.LUT[0].rgbBlue := 0; lR := (lBackgroundImg.VOIClr and 255) ; lG := ((lBackgroundImg.VOIClr shr 8) and 255) ;// and 65280; lB:= ((lBackgroundImg.VOIClr shr 16) and 255) ;//and 16711680; for lInc := 1 to kVOI8bit do begin lHdr.LUT[lInc].rgbRed := round((lInc*lR) div kVOI8bit); lHdr.LUT[lInc].rgbGreen := round((lInc*lG) div kVOI8bit); lHdr.LUT[lInc].rgbBlue := round((lInc*lB) div kVOI8bit); end;//green+blue = cyan end; else begin lLUT := 0; for lInc := 0 to 255 do begin lHdr.LUT[lInc].rgbRed := lInc; lHdr.LUT[lInc].rgbGreen := lInc; lHdr.LUT[lInc].rgbBlue := lInc; end;//for gray end//else... gray end; lHdr.LUTinvisible := (lHdr.LUT[0]); end; procedure LUTbias (var lHdr: TMRIcroHdr); {http://dept-info.labri.fr/~schlick/DOC/gem2.html http://dept-info.labri.fr/~schlick/publi.html Fast Alternatives to Perlin's Bias and Gain Functions Christophe Schlick Graphics Gems IV, p379-382, April 1994 } var lIndex,lBias: integer; lA,lT: single; lLUT: TLUT; begin //if gBias = 0.5 then exit; lA := 0.2; for lIndex := 1 to 254 do begin lT := lIndex/255; //lBias := 255*(lt/((1/la-2)*(1-lt)+1)) ; lBias := round(255*(lt/((1/la-2)*(1-lt)+1)) ); lLUT[lIndex] := lHdr.LUT[(lBias)]; //lHdr.LUT[lIndex].rgbReserved := kLUTalpha; end; for lIndex := 1 to 254 do lHdr.LUT[lIndex] := lLUT[lIndex]; end; procedure LoadColorScheme(lStr: string; var lHdr: TMRIcroHdr); const UNIXeoln = chr(10); var lF: textfile; lBuff: bytep0; lFData: file; lCh: char; lNumStr: String; lZ : integer; lByte,lIndex: byte; //lType, lIndx,lLong,lR,lG: boolean; procedure ResetBools; //nested begin //lType := false; lIndx := false; lR := false; lG := false; lNumStr := ''; end; //nested proc ResetBools begin //proc LoadColorScheme if not fileexistsex(lStr) then exit; lZ := FSize(lStr); if (lZ =768) or (lZ = 800) or (lZ=970) then begin //binary LUT assignfile(lFdata,lStr); Filemode := 0; reset(lFdata,1); seek(lFData,lZ-768); GetMem( lBuff, 768); BlockRead(lFdata, lBuff^, 768); for lZ := 0 to 255 do begin lHdr.LUT[lZ].rgbRed := lBuff^[lZ]; lHdr.LUT[lZ].rgbGreen := lBuff^[lZ+256]; lHdr.LUT[lZ].rgbBlue := lBuff^[lZ+512]; lHdr.LUT[lZ].rgbReserved := kLUTalpha; end; closefile(lFdata); Filemode := 2; freemem(lBuff); //LUTBIas (lHdr); lHdr.LUTinvisible := (lHdr.LUT[0]); exit; end; //Text LUT assignfile(lF,lStr); Filemode := 0; reset(lF); lLong := false; lIndex := 0; ResetBools; for lZ := 0 to 255 do begin lHdr.LUT[lZ].rgbRed := 0; lHdr.LUT[lZ].rgbGreen := 0; lHdr.LUT[lZ].rgbBlue := 0; lHdr.LUT[lZ].rgbReserved := kLUTalpha; end; while not EOF(lF) do begin read(lF,lCh); if lCh = '*' then //comment character while (not EOF(lF)) and (lCh <> kCR) and (lCh <> UNIXeoln) do read(lF,lCh); if (lCh = 'L') or (lCh = 'l') then begin //lType := true; lLong := true; end; //'l' if (lCh = 's') or (lCh = 'S') then begin //lType := true; lLong := false; end; //'s' if lCh in ['0'..'9'] then lNumStr := lNumStr + lCh; if ((not(lCh in ['0'..'9'])) or (EOF(lF)) ) and (length(lNumStr) > 0) then begin //not a number = space??? try to read number string if not lIndx then begin lIndex := strtoint(lNumStr); lIndx := true; end else begin //not index if lLong then lByte := trunc(strtoint(lNumStr) / 256) else lByte := strtoint(lNumStr); if not lR then begin lHdr.LUT[lIndex].rgbRed := lByte; lR := true; end else if not lG then begin lHdr.LUT[lIndex].rgbGreen := lByte; lG := true; end else {final value is blue} begin lHdr.LUT[lIndex].rgbBlue := lByte; ResetBools; end; end; lNumStr := ''; end; end; //not eof CloseFile(lF); Filemode := 2; //LUTBIas (lHdr); lHdr.LUTinvisible := (lHdr.LUT[0]); end; //Proc LoadColorScheme procedure FreeImgMemory(var lHdr: TMRIcroHdr); begin with lHdr do begin if ScrnBufferItems > 0 then freemem(ScrnBuffer); if ImgBufferItems > 0 then freemem(ImgBufferUnaligned); if RenderBufferItems > 0 then freemem(RenderBuffer); RenderBufferItems := 0; ScrnBufferItems := 0; ImgBufferItems := 0; end; end; procedure DrawFrame (var lImage: TImage; lL,lT,lR,lB: integer); begin lImage.Canvas.Brush.Style := bsSolid; lImage.canvas.pen.color := clWhite; lImage.canvas.pen.color := clSilver; lImage.Canvas.Rectangle(lL,lT,lR,lB); lImage.canvas.pen.color := clBlack; lImage.Canvas.Rectangle(lL+1,lT+1,lR-1,lB-1); end; procedure IntenLabel (var lImage: TImage; var lHdr: TMRIcroHdr; lLTRB: integer;lMinIn,lMaxIn: single); //special: if lMin=lMax, assumes current window values var lDesiredSteps,lPower,lTxtWid,lTxtTop,lPGWid,lPGHt,lBarTop,lBarLeft,lBarLength,lBarBorder,lBarThick: integer; lMin,lMax,l1stStep,lRange,lStepSize,lStepPos: single; lSteps,lStep,lDecimals,lStepPosScrn: integer; begin lMin := lMinIn; lMax := lMaxIn; lBarBorder := 6; lBarThick := 10; lPGWid := lImage.Width; lPGHt := lImage.Height; if gBGImg.XBarClr = TColor(gMRIcroOverlay[kBGOverlayNum].LUTinvisible) then lImage.canvas.font.Color := clBlack//clWhite;//gLUT[lClr].rgbRed+(gLUT[lClr].rgbGreen shl 8)+(gLUT[lClr].rgbBlue shl 16); else lImage.canvas.font.Color := gBGImg.XBarClr; //lImage.canvas.font.Color := clWhite;//gXBarClr; lImage.Canvas.Brush.Style := bsClear; lImage.Canvas.Font.Name := 'Arial'; (*if lPGWid < 100 then lImage.Canvas.Font.Size := 9 else if lPGWid < 200 then lImage.Canvas.Font.Size := 12 else lImage.Canvas.Font.Size := 14;*) lImage.Canvas.Font.Size := gBGImg.FontSize; lTxtTop := lPGHt - ( lBarBorder +(lImage.Canvas.TextHeight('X') div 2)); //next: compute increment lDesiredSteps := 4; if lMin=lMax then begin lMin := lHdr.WindowScaledMin; lMax := lHdr.WindowScaledMax; SortSingle(lMin,lMax); if (lHdr.WindowScaledMin <= 0) and (lHdr.WindowScaledMax <= 0) then begin if (lHdr.LutFromZero) then lMax := 0; lStepPos := lMin; lMin := lMax; lMax := lStepPos; end else if (lHdr.LutFromZero) and (lMin > 0) then lMin := 0; end; //lMinIn=lMaxIn if lMin = lMax then exit; //showmessage(realtostr(lMin,4)+' '+realtostr(lMax,4)); lRange := abs(lMax - lMin); //if lRange = 0 then exit; if lRange < 0.000001 then exit; lStepSize := lRange / lDesiredSteps; lPower := 0; while lStepSize >= 10 do begin lStepSize := lStepSize/10; inc(lPower); end; while lStepSize < 1 do begin lStepSize := lStepSize * 10; dec(lPower); end; lStepSize := round(lStepSize) *Power(10,lPower); if lPower < 0 then lDecimals := abs(lPower) else lDecimals := 0; if lMin > lMax then begin // inverted l1stStep := trunc((lMax) / lStepSize)*lStepSize; if l1stStep < (lMax) then l1stStep := l1stStep+lStepSize; lSteps := trunc( abs((lMin+0.0001)-l1stStep) / lStepSize)+1; end else begin l1stStep := trunc((lMin) / lStepSize)*lStepSize; if l1stStep < (lMin) then l1stStep := l1stStep+lStepSize; lSteps := trunc( abs((lMax+0.0001)-l1stStep) / lStepSize)+1; end; if not odd(lLTRB) then begin //vertical if lLTRB > 2 then //right lBarLeft := lPGWid - (lBarThick+lBarBorder+3) else //if right else LEFT lBarLeft := (lBarThick+lBarBorder+3); lBarLength := lPGHt - (lBarBorder+lBarBorder+2); for lStep := 1 to lSteps do begin lStepPos := l1stStep+((lStep-1)*lStepSize); lStepPosScrn := round( abs(lStepPos-lMin)/lRange*lBarLength); if lLTRB > 2 then //right - align text for width lImage.canvas.TextOut(lBarLeft-(lImage.Canvas.TextWidth(realtostr(lStepPos,lDecimals))),lTxtTop-lStepPosScrn,realtostr(lStepPos,lDecimals)) else lImage.canvas.TextOut(lBarLeft,lTxtTop-lStepPosScrn,realtostr(lStepPos,lDecimals)); end; end else begin //if vert else HORIZ lBarLength := lPGWid - (lBarBorder+lBarBorder+2); if lLTRB > 2 then //bottom lBarTop := lPGHt - (lBarThick+lBarBorder+lImage.Canvas.TextHeight('X')+1 ) else //top lBarTop := lBarThick+lBarBorder+1; for lStep := 1 to lSteps do begin lStepPos := l1stStep+((lStep-1)*lStepSize); lStepPosScrn := round(abs(lStepPos-lMin)/lRange*lBarLength); //lStepPosScrn := 15*lStep; lTxtWid := lImage.Canvas.TextWidth(realtostr(lStepPos,lDecimals)); lImage.canvas.TextOut(lBarBorder+lStepPosScrn-(lTxtWid div 2),lBarTop,realtostr(lStepPos,lDecimals)); end; end;//if vert else HORIZ end; procedure IntenBar (var lImage: TImage; var lHdr: TMRIcroHdr; lLTRB: integer; lMin,lMax: single); var lPGHt, lPGWid,lClr,lStripe,lBarBorder,lnStripes,lHorBarTop,lVerBarLeft,lBarThick: integer; begin //if lMin = lMax then lBarBorder := 6; lBarThick := 10; lPGWid := lImage.Width; lPGHt := lImage.Height; lHorBarTop := lBarBorder; lVerBarLeft := lBarBorder; lImage.canvas.pen.width := 1; if not odd(lLTRB) then begin //vertical if lLTRB > 2 then //right lVerBarLeft := lPGWid - (lBarThick+lBarBorder); lnStripes := lPGHt - (lBarBorder+lBarBorder+2); if lnStripes < 1 then exit; {$IFNDEF FPC} DrawFrame(lImage, lVerBarLeft-2, lBarBorder-2,lVerBarLeft+lBarThick+2, lBarBorder+lnStripes+3); {$ELSE} DrawFrame(lImage, lVerBarLeft-2, lBarBorder-2,lVerBarLeft+lBarThick+2, lBarBorder+lnStripes+2); lBarBorder := lBarBorder; lBarThick := lBarThick +1; {$ENDIF} for lStripe := 0 to lnStripes do begin lClr := round(((lnStripes- lStripe) / lnStripes)*255); lImage.canvas.pen.color := TRGBQuad2TColor(lHdr.LUT[lClr]); lImage.canvas.moveto(lVerBarLeft, lBarBorder+lStripe); lImage.canvas.lineto(lVerBarLeft+lBarThick,lBarBorder+lStripe); end; //draw each stripe end else begin //LTRB //Horizontal if lLTRB > 2 then //bottom lHorBarTop := lPGHt - (lBarThick+lBarBorder)-1; lnStripes := lPGWid - (lBarBorder+lBarBorder+1); {$IFNDEF FPC} DrawFrame(lImage,lBarBorder+1, lHorBarTop-2, lBarBorder+lnStripes+3,lHorBarTop+lBarThick+2); {$ELSE} DrawFrame(lImage,lBarBorder, lHorBarTop-2, lBarBorder+lnStripes+4,lHorBarTop+lBarThick+2); lBarBorder := lBarBorder+2; lBarThick := lBarThick +1; {$ENDIF} if lnStripes < 1 then exit; for lStripe := 0 to lnStripes do begin lClr := round((lStripe / lnStripes)*255); {$IFNDEF FPC} lImage.canvas.pen.color := lHdr.LUT[lClr].rgbRed+(lHdr.LUT[lClr].rgbGreen shl 8)+(lHdr.LUT[lClr].rgbBlue shl 16); {$ELSE}lImage.canvas.pen.Color := TRGBQuad2TColor(lHdr.LUT[lClr]);{$ENDIF} lImage.canvas.moveto(lBarBorder+lStripe,lHorBarTop); lImage.canvas.lineto(lBarBorder+lStripe,lHorBarTop+lBarThick); end; //draw each stripe end; //if horizontal IntenLabel(lImage,lHdr,lLTRB,lMin,lMax); end; //procedure SetDimension32(lInPGHt,lInPGWid:integer; lBuff: RGBQuadp; var lBackgroundImg: TBGImg; var lImage: TImage; lPanel: TScrollBox); (*procedure DrawBMPZoom( lx, ly, lZoomPct: integer; lBuff: RGBQuadp; var lImage: TImage); var x, y,lYPos,lPos,lImgSz,lOutX,lOutY: Integer; lRatio,lRatioRecip: single; TempBitmap: TBitmap; lLongBuff: LongIntp; lXlut: LongIntp0; begin if lZoomPct > 1 then lRatio := lZoomPct/100 else lRatio := 1; lRatioRecip := 1/lRatio;//e.g. 200% -> ratio = 2, recip = 0.5 lImgSz := lx * ly; TempBitmap := TBitmap.Create; lLongBuff := LongIntp(lBuff); lOutX := round(lx*lRatio); lOutY := round(ly*lRatio); TempBitmap.Width := lOutX; TempBitmap.Height := lOutY; //TempBitmap.PixelFormat := pf32bit ; TempBitmap.Transparent := False; if lBuff <> nil then begin getmem(lXlut,lOutX*sizeof(longint)); for x:=0 to lOutx-1 do lXlut^[x] := trunc((x+lRatio)*lRatioRecip); //find col for y:= (lOutY-1) downto 0 do begin lYPos := trunc((lOutY-y-0.5)*lRatioRecip) * lx; //find row for x:=0 to lOutx-1 do begin lPos := lXlut^[x] + lYPos; if (lPos > 0) and (lPos <= lImgSz) then TempBitmap.Canvas.Pixels[x,y] := lLongBuff^[lPos]; end; //for x end;//for y freemem(lXlut); end; //if Buff<> nil lImage.Picture.Bitmap := TempBitmap; TempBitmap.Free; end;*) {$IFDEF Unix} procedure DrawBMP( lx, ly: integer; var lBuff: RGBQuadp; var lImage: TImage); var TempBitmap: TBitmap; lRGBBitmap: TRGB32Bitmap; begin TempBitmap := TBitmap.Create; TempBitmap.Width := lx; TempBitmap.Height := ly; if lBuff <> nil then begin lRGBBitmap := TRGB32Bitmap.CreateFromData(@lBuff[1],lx,ly); DrawRGB32Bitmap(TempBitmap.Canvas.Handle, 0, 0, 0, 0, lx, ly,lRGBBitmap {Self}); end; //if lBuff=nil lImage.Picture.Bitmap := TempBitmap; TempBitmap.Free; end; procedure DrawBMPZoom( lSrcWid, lSrcHt, lZoomPct: integer; lRGBBuff: RGBQuadp; var lImage: TImage); //very fast nearest-neighbor rescaling: // integer math, not floating point // uses lookup table for columns // repeated rows are copied rather than recalculated var lRGBBitmap: TRGB32Bitmap; TempBitmap: TBitmap; lBuff,lInBuff,lXBuff: LongintP; //lOutRGBBuff: RGBQuadp; lOutWid,lOutHt,lOutWidx4: integer; lPos,P,Pinc,lRowPos,lPrevRowPos, x,y: integer; lXRatio,lYRatio: single; begin lInBuff:= LongIntP(lRGBBuff);; lXRatio := lZoomPct / 100; lYRatio := lZoomPct/100; lOutwid := round(lSrcWid*lXRatio); lOutHt := round(lSrcHt*lYRatio); lOutWidx4 := lOutWid * sizeof(longint); getmem(lBuff, lOutHt*lOutWid*4); getmem(lXBuff, lOutWid*sizeof(longint)); Pinc:=((lSrcWid)shl 15)div (lOutWid ); P := Pinc shr 1; for x := 1 to lOutWid do begin lXBuff^[x] := (P shr 15)+1; Inc(P,Pinc); end; lPrevRowPos := -MaxInt; Pinc:=((lSrcHt)shl 15)div (lOutHt); P := Pinc shr 1; lPos := 1; if lOutHt > lSrcHt then begin //check for repeated lines for y:=0 to lOutHt-1 do begin lRowPos:=lSrcWid *(P shr 15) ; //top row if lRowPos = lPrevRowPos then begin //repeated line //Move(Pointer(lBuff^[lPos-lOutWid]),Pointer(lBuff^[lPos]),lOutWidx4); Move(lBuff^[lPos-lOutWid],lBuff^[lPos],lOutWidx4); inc(lPos,lOutWid); end else begin //if lRowPos = lPrevRowPos else unique line for x := 1 to lOutWid do begin lBuff^[lPos] :=lInBuff^[lRowPos+lXBuff^[x]]; inc(lPos); end; lPrevRowPos := lRowPos; end; Inc(P,Pinc); end;//for each line end else begin //if lOutHt>lSrcHt else all lines unique for y:=0 to lOutHt-1 do begin lRowPos:=lSrcWid *(P shr 15) ; for x := 1 to lOutWid do begin lBuff^[lPos] :=lInBuff^[lRowPos+lXBuff^[x]]; inc(lPos); end; Inc(P,Pinc); end;//for each line end; freemem(lxBuff); TempBitmap := TBitmap.Create; TempBitmap.Width := lOutWid; TempBitmap.Height := lOutHt; //DrawBMP( lOutWid, lOutHt, lOutRGBBuff, lImage ); //Draw32Bitmap(TempBitmap.Canvas.Handle, lOutWid, lOutHt, lOutRGBBuff); lRGBBitmap := TRGB32Bitmap.CreateFromData(@lBuff[1],lOutWid,lOutHt); DrawRGB32Bitmap(TempBitmap.Canvas.Handle, 0, 0, 0, 0, lOutWid, lOutHt,lRGBBitmap {Self}); lImage.Picture.Bitmap := TempBitmap; TempBitmap.Free; freemem(lBuff); end; {$ELSE}//start windows specific procedure DrawBMPZoom( lx, ly, lZoomPct: integer; lBuff: RGBQuadp; var lImage: TImage); var //lImgSz, lOutX,lOutY: Integer; lRatio: single; TempBitmap: TBitmap; begin if lZoomPct > 1 then lRatio := lZoomPct/100 else lRatio := 1; //lImgSz := lx * ly; TempBitmap := TBitmap.Create; lOutX := round(lx*lRatio); lOutY := round(ly*lRatio); TempBitmap.Width := lOutX; TempBitmap.Height := lOutY; StretchDraw32Bitmap(TempBitmap.Canvas.Handle, lOutX, lOutY,lx, ly, lBuff); lImage.Picture.Bitmap := TempBitmap; TempBitmap.Free; end; procedure DrawBMP( lx, ly: integer; var lBuff: RGBQuadp; var lImage: TImage); //best general var TempBitmap: TBitmap; begin TempBitmap := TBitmap.Create; TempBitmap.Width := lx; TempBitmap.Height := ly; Draw32Bitmap(TempBitmap.Canvas.Handle, lx, ly,lBuff ); lImage.Picture.Bitmap := TempBitmap; TempBitmap.Free; end; //end windows specific {$ENDIF} procedure ScaleStretch(lSrcHt,lSrcWid: integer; lInXYRatio: single; var lRGBBuff: RGBQuadp; var lImage: TImage); var lInBuff,lBuff: ByteP; lOutRGBBuff: RGBQuadp; lOutWid,lOutHt: integer; lPos,xP,yP,yP2,xP2,t,z, z2,iz2,w1,w2,w3,w4,lTopPos,lBotPos, lINSz, lDstWidM,x,y: integer; lXRatio,lYRatio: single; begin lInBuff:= ByteP(lRGBBuff); yP:=0; lXRatio := lInXYRatio; lYRatio := lInXYRatio; lInSz := lSrcWid *lSrcHt; lOutwid := round(lSrcWid*lXRatio); lOutHt := round(lSrcHt*lYRatio); xP2:=((lSrcWid-1)shl 15)div (lOutWid -1 ); yP2:=((lSrcHt-1)shl 15)div (lOutHt -1); lPos := 1; lDstWidM := lOutWid - 1; getmem(lBuff, lOutHt*lOutWid*4); lInSz := lInSz * 4; //32bytesperpixel for y:=0 to lOutHt-1 do begin xP:= 0; lTopPos:=lSrcWid *(yP shr 15) *4; //top row if yP shr 16 lInSz) or ((lTopPos+t) < 0) then begin lBuff^[lPos] :=0; inc(lPos); //reds lBuff^[lPos] :=0; inc(lPos); //greens lBuff^[lPos] :=0; inc(lPos); //blues lBuff^[lPos] :=0; inc(lPos); //reserved end else begin z:=xP and $7FFF; w2:=(z*iz2)shr 15; w1:=iz2-w2; w4:=(z*z2)shr 15; w3:=z2-w4; //burp ScaleStretch 10/2009 {$IFDEF Darwin} lBuff^[lPos] :=0; inc(lPos); //red lBuff^[lPos] :=(lInBuff^[lTopPos+t+2]*w1+lInBuff^[lTopPos+t+6]*w2+lInBuff^[lBotPos+t+2]*w3+lInBuff^[lBotPos+t+6]*w4)shr 15; inc(lPos); //green lBuff^[lPos] := (lInBuff^[lTopPos+t+3]*w1+lInBuff^[lTopPos+t+7]*w2+lInBuff^[lBotPos+t+3]*w3+lInBuff^[lBotPos+t+7]*w4)shr 15; inc(lPos); //reserved lBuff^[lPos] :=(lInBuff^[lTopPos+t+4]*w1+lInBuff^[lTopPos+t+8]*w2+lInBuff^[lBotPos+t+4]*w3+lInBuff^[lBotPos+t+8]*w4)shr 15; inc(lPos); {$ELSE} lBuff^[lPos] :=(lInBuff^[lTopPos+t+1]*w1+lInBuff^[lTopPos+t+5]*w2 +lInBuff^[lBotPos+t+1]*w3+lInBuff^[lBotPos+t+5]*w4)shr 15; inc(lPos); //red lBuff^[lPos] :=(lInBuff^[lTopPos+t+2]*w1+lInBuff^[lTopPos+t+6]*w2 +lInBuff^[lBotPos+t+2]*w3+lInBuff^[lBotPos+t+6]*w4)shr 15; inc(lPos); //green lBuff^[lPos] :=(lInBuff^[lTopPos+t+3]*w1+lInBuff^[lTopPos+t+7]*w2 +lInBuff^[lBotPos+t+3]*w3+lInBuff^[lBotPos+t+7]*w4)shr 15; inc(lPos); //blue lBuff^[lPos] :=0; inc(lPos); //reserved {$ENDIF} end; Inc(xP,xP2); inc(x); end; //inner loop Inc(yP,yP2); end; lOutRGBBuff := RGBQuadp(lBuff); DrawBMP( lOutWid, lOutHt, lOutRGBBuff, lImage ); freemem(lBuff); end; procedure SetDimension32(lInPGHt,lInPGWid:integer; lBuff: RGBQuadp; var lBackgroundImg: TBGImg; var lImage: TImage; lPanel: TScrollBox); var lZoom,lZoomY,lZoomX,lY,lLen,lSrc,lDest: integer; lTBuff: RGBQuadp; begin //first, compute zoom if (lPanel = nil) then lImage.Tag := 100 else if (lPanel.Tag < 1) then begin//autosize lZoomY := round(100*(lPanel.Height-8)/lInPGHt); lZoomX := round(100*(lPanel.Width-8)/lInPGWid); if lZoomX < lZoomY then lZoom := lZoomX else lZoom := lZoomY; if lZoom < 1 then //nearest integer e.g. 100% or 200%, not 148% lZoom := 100; lImage.Tag := lZoom; end; if (lImage.Tag < 1) then lImage.Tag := 100 ; //next draw bitmap if lBuff = nil then begin getmem(lTBuff,lInPGHt*lInPGWid*4); Fillchar(lTBuff^,lInPGHt*lInPGWid*4,0); //set all to zero DrawBMP( lInPGWid, lInPGHt, lTBuff, lImage); freemem(lTBuff); end else if (lImage.Tag = 100) or (lPanel = nil) then begin getmem(lTBuff,lInPGHt*lInPGWid*4); lLen := lInPGWid*4; lSrc := 1; lDest := ((lInPGHt-1)*lInPGWid)+1; for lY := 1 to lInPGHt do begin //svn Move(Pointer(lBuff^[lSrc]),Pointer(lTBuff^[lDest]),lLen); Move(lBuff^[lSrc],lTBuff^[lDest],lLen); lSrc := lSrc + lInPGWid; lDest := lDest - lInPGWid; end; DrawBMP( lInPGWid, lInPGHt, lTBuff, lImage); freemem(lTBuff); //3/2011- the following code creates problems for "toInt" scaling: lImage.Tag := lBackgroundImg.ZoomPct; end else begin //not 100% lZoom := lImage.Tag; getmem(lTBuff,lInPGHt*lInPGWid*4); lLen := lInPGWid*4; lSrc := 1; lDest := ((lInPGHt-1)*lInPGWid)+1; for lY := 1 to lInPGHt do begin //Move(Pointer(lBuff^[lSrc]),Pointer(lTBuff^[lDest]),lLen); Move(lBuff^[lSrc],lTBuff^[lDest],lLen); lSrc := lSrc + lInPGWid; lDest := lDest - lInPGWid; end; if lZoom = 100 then DrawBMP( lInPGWid, lInPGHt, lTBuff, lImage) else begin if gBGImg.StretchQuality = sqHigh then //bilinear smoothed zoom ScaleStretch(lInPGHt,lInPGWid,lZoom/100,lTBuff, lImage) else //nearest neighbor DrawBMPZoom( lInPGWid, lInPGHt, lZoom, lTBuff, lImage) end; freemem(lTBuff);//flip lImage.Tag := lZoom; end; end; procedure FindImgMinMax8 (var lHdr: TMRIcroHdr; var lMini,lMaxi: integer); var lInc: integer; begin if (lHdr.ImgBufferBPP <> 1) or (lHdr.ImgBufferItems < 1) then exit; lMini := lHdr.ImgBuffer^[1]; lMaxi := lHdr.ImgBuffer^[1]; for lInc := 1 to lHdr.ImgBufferItems do begin if lHdr.ImgBuffer^[lInc] > lMaxi then lMaxi := lHdr.ImgBuffer^[lInc]; if lHdr.ImgBuffer^[lInc] < lMini then lMini := lHdr.ImgBuffer^[lInc]; end; end; //FindImgMinMax8 procedure FindImgMinMax16 (var lHdr: TMRIcroHdr; var lMini,lMaxi: integer); //very fast routine for finding brightest and darkest intensity... var lImgSamples,lInc,lFinalVal: integer; l16Buf: SmallIntP; begin if (lHdr.ImgBufferBPP <> 2) or (lHdr.ImgBufferItems < 1) then exit; lImgSamples := lHdr.ImgBufferItems; lInc:=1; l16Buf := SmallIntP(lHdr.ImgBuffer ); lMaxI := l16Buf^[lImgSamples]; lMinI := lMaxi; lFinalVal := lMaxi; l16Buf^[lImgSamples]:=32767; // set last value to the maximum integer value while true do // no check here at all now begin while (lMaxI>l16Buf^[lInc]) and (l16Buf^[lInc] >= lMini) do // stop for a >= value inc(lInc); if lInc=lImgSamples then begin l16Buf^[lImgSamples]:=lFinalVal; exit; // check to see if new max is actually end of data end; if l16Buf^[lInc] >lMaxi then lMaxI:=l16Buf^[lInc]; if l16Buf^[lInc] < lMini then lMini:=l16Buf^[lInc]; inc(lInc); end; end; //FindImgMinMax16 procedure FindImgMinMax32 (var lHdr: TMRIcroHdr; var lMin,lMax: single); var lInc: integer; l32Buf : SingleP; begin if (lHdr.ImgBufferBPP <> 4) or (lHdr.ImgBufferItems < 2) then exit; l32Buf := SingleP(lHdr.ImgBuffer ); //if specialsingle(lHdr.MRIcroHdr.gMultiBuf[1]) then lHdr.MRIcroHdr.gMultiBuf[1] := 0.0; lMin := l32Buf^[1]; lMax := l32Buf^[1]; for lInc := 2 to lHdr.ImgBufferItems do begin if (l32Buf^[lInc] > lMax) then lMax := l32Buf^[lInc]; if (l32Buf^[lInc] < lMin) then lMin := l32Buf^[lInc]; end; end; //FindImgMinMax32 function ImgVaries ( var lHdr: TMRIcroHdr): boolean; var lF: single; lI,lPos: integer; l32Buf : SingleP; l16Buf : SmallIntP; begin result := false; if lHdr.ImgBufferItems = 2 then exit; result := true; //assume variance... if lHdr.ImgBufferBPP = 4 then begin //32bit l32Buf := SingleP(lHdr.ImgBuffer ); lF := l32Buf^[1]; for lPos := 2 to lHdr.ImgBufferItems do if l32Buf^[lPos] <> lF then exit; end else if lHdr.ImgBufferBPP = 2 then begin //if 16bit ints l16Buf := SmallIntP(lHdr.ImgBuffer ); lI := l16Buf^[1]; for lPos := 2 to lHdr.ImgBufferItems do if l16Buf^[lPos] <> lI then exit; end else if lHdr.ImgBufferBPP = 1 then begin //if 16bit ints lI := lHdr.ImgBuffer^[1]; for lPos := 2 to lHdr.ImgBufferItems do if lHdr.ImgBuffer^[lPos] <> lI then exit; end else showmessage('ImgVaries error: Unsupported format'); result := false; //entire image has no variability... end; procedure CreateHisto (var lHdr: TMRIcroHdr; var lHisto: HistoRA); var lModShl10,lMinI,lC: integer; lMod,lRng: double {was extended}; l32Buf : SingleP; l16Buf : SmallIntP; begin if lHdr.ImgBufferItems = 0 then exit; for lC := 0 to kHistoBins do lHisto[lC] := 0; if lHdr.ImgBufferBPP = 4 then begin //32bit l32Buf := SingleP(lHdr.ImgBuffer ); lRng := lHdr.GlMaxUnscaledS - lHdr.GlMinUnscaledS; if lRng > 0 then lMod := (kHistoBins)/lRng else lMod := 0; for lC := 1 to lHdr.ImgBufferItems do inc(lHisto[round((l32Buf^[lC]-lHdr.GlMinUnscaledS)*lMod)]); end else {if lHdr.g16Sz >= lHdr.ScrnBufferSz then}begin //<>32bit.. integer lMinI := round(lHdr.GlMinUnscaledS); lRng := lHdr.GlMaxUnscaledS - lHdr.GlMinUnscaledS; if lRng > 0 then lMod := (kHistoBins)/lRng else lMod := 0; lModShl10 := trunc(lMod * 1024); if lHdr.ImgBufferBPP = 2 then begin //if 16bit ints l16Buf := SmallIntP(lHdr.ImgBuffer ); for lC := 1 to lHdr.ImgBufferItems do inc(lHisto[((l16Buf^[lC]-lMinI)*lModShl10)shr 10]) end else //else 8 bit data for lC := 1 to lHdr.ImgBufferItems do inc(lHisto[((lHdr.ImgBuffer^[lC]-lMinI)*lModShl10)shr 10]); end; //not 32bit end; function BinCenter (lBin: integer; var lHdr: TMRIcroHdr): single; begin result := (lHdr.GlMaxUnscaledS - lHdr.GlMinUnscaledS)/(kHistoBins-1); //range div bins result := (lBin * result)+ lHdr.GlMinUnscaledS+ (0.5*result); end; procedure TextReportHisto (var lHdr: TMRIcroHdr); var lC: integer; var lHisto: HistoRA; begin CreateHisto (lHdr, lHisto); TextForm.MemoT.Lines.Clear; TextForm.MemoT.Lines.add('#Histogram summary ~ Approximate Values'); TextForm.MemoT.Lines.add('#Image intensity range: '+realtostr(lHdr.GlMinUnscaledS,3)+'..'+realtostr(lHdr.GlMaxUnscaledS,3)); TextForm.MemoT.Lines.add('#BinNumber'+kTextSep+'BinCenter'+kTextSep+'BinCount'); for lC := 0 to kHistoBins do TextForm.MemoT.Lines.Add( inttostr(lC) + kTextSep +realtostr(BinCenter(lC,lHdr),3) +kTextSep+ inttostr(lHisto[lC]) ); TextForm.Show; end; procedure DrawHistogram (var lHdr: TMRIcroHdr; var lImage: TImage); var lPGHt, lPGWid,lIntenBarHt,lStripe,lBarBorder,lnStripes,lHorBarTop,lBarHt, l005Pct,ln005Pct,l02Pct,ln02Pct,l0005Pct,ln0005Pct,l001Pct,ln001Pct,l01Pct,ln01Pct,lMaxFreq,lMaxBarHt,lHistoPos,lPrevHistoPos,lFreq,lPos,lTotFreq: integer; lPct: double; lHisto: HistoRA; begin lPGWid := lImage.Width; lPGHt := lImage.Height; SetDimension32(lPGHt,lPGWid,nil,gBGImg,lImage,nil); lImage.Canvas.Font.Name := 'Arial'; (*if lPGWid < 100 then lImage.Canvas.Font.Size := 9 else if lPGWid < 200 then lImage.Canvas.Font.Size := 12 else lImage.Canvas.Font.Size := 14;*) lImage.Canvas.Font.Size := gBGImg.FontSize; CreateHisto (lHdr, lHisto); lBarBorder := 6; lIntenBarHt := 14; DrawFrame(lImage, 0, 0,lPGWid,lPGHt); lHorBarTop := lPGHt - lBarBorder-lIntenBarHt-lImage.Canvas.TextHeight('X'); lMaxBarHt := lHorBarTop - lBarBorder- lBarBorder- lBarBorder; lMaxFreq := 0; lnStripes := lPGWid - (lBarBorder+lBarBorder+1); if gBGImg.XBarClr = clWhite then lImage.canvas.pen.color := clBlack//clWhite;//gLUT[lClr].rgbRed+(gLUT[lClr].rgbGreen shl 8)+(gLUT[lClr].rgbBlue shl 16); else lImage.canvas.pen.color := gBGImg.XBarClr;//clWhite;//gLUT[lClr].rgbRed+(gLUT[lClr].rgbGreen shl 8)+(gLUT[lClr].rgbBlue shl 16); lImage.Canvas.Font.Color := lImage.canvas.pen.color; lImage.Canvas.Brush.Style := bsSolid; lImage.Canvas.Pen.Width := 1; lImage.Canvas.Pen.Style := psDot; lImage.canvas.moveto(lBarBorder,lHorBarTop-lMaxBarHt-1); lImage.canvas.lineto(lPGWid-lBarBorder,lHorBarTop-lMaxBarHt-1); lImage.Canvas.Brush.Style := bsClear; if (lnStripes < 1) then exit; //Next: compute scale find freq in graph - not same as image, as with large graphs bars resampled lPrevHistoPos := 0; lTotFreq := 0; for lStripe := 0 to lnStripes do begin lHistoPos := round(lStripe / lnStripes*kHistoBins); if lPrevHistoPos > lHistoPos then lPrevHistoPos := lHistoPos; for lPos := lPrevHistoPos to lHistoPos do lTotFreq := lTotFreq+lHisto[lPos]; lPrevHistoPos := lHistoPos+1; end; ln02Pct := 0; ln01Pct := 0; ln005Pct := 0; ln001Pct := 0; ln0005Pct := 0; l02Pct := round(lTotFreq/50); l01Pct := round(lTotFreq/100); l005Pct := round(lTotFreq/200); l001Pct := round(lTotFreq/1000); l0005Pct := round(lTotFreq/2000); lPrevHistoPos := 0; for lStripe := 0 to lnStripes do begin lHistoPos := round(lStripe / lnStripes*kHistoBins); if lPrevHistoPos > lHistoPos then lPrevHistoPos := lHistoPos; lFreq := 0; for lPos := lPrevHistoPos to lHistoPos do lFreq := lFreq+lHisto[lPos]; if lFreq > lMaxFreq then lMaxFreq := lFreq; if lFreq > l02Pct then inc(ln02Pct); if lFreq > l01Pct then inc(ln01Pct); if lFreq > l005Pct then inc(ln005Pct); if lFreq > l001Pct then inc(ln001Pct); if lFreq > l0005Pct then inc(ln0005Pct); //lTotFreq := lTotFreq + lFreq; lPrevHistoPos := lHistoPos+1; end; lImage.Canvas.Pen.Style := psSolid; if ln02Pct > 5 then lPct := 5 else if ln01Pct > 5 then lPct := 2 else if ln005Pct > 5 then lPct := 1 else if ln001Pct > 4 then lPct := 0.5 else if ln0005Pct > 4 then lPct := 0.01 else lPct := 0.05; lMaxFreq :=round( lTotFreq * (lPct/100)); if (lMaxFreq = 0) then exit; //Next: draw bars lImage.canvas.TextOut(lPGWid div 2,lHorBarTop-lMaxBarHt-1-6,' '+floattostr(lPct)+'% '); lImage.Canvas.Brush.Style := bsClear; lPrevHistoPos := 0; for lStripe := 0 to lnStripes do begin lHistoPos := round(lStripe / lnStripes*kHistoBins); if lPrevHistoPos > lHistoPos then lPrevHistoPos := lHistoPos; lFreq := 0; for lPos := lPrevHistoPos to lHistoPos do lFreq := lFreq+lHisto[lPos]; if lFreq > lMaxFreq then begin lFreq := lMaxFreq; lImage.canvas.moveto(lBarBorder+lStripe,lHorBarTop-lMaxBarHt-8); lImage.canvas.lineto(lBarBorder+lStripe,lHorBarTop-lMaxBarHt-6); lImage.canvas.moveto(lBarBorder+lStripe,lHorBarTop-lMaxBarHt-4); lImage.canvas.lineto(lBarBorder+lStripe,lHorBarTop-lMaxBarHt-2); end; lBarHt := round(lFreq/lMaxFreq*lMaxBarHt); lImage.canvas.moveto(lBarBorder+lStripe,lHorBarTop); lImage.canvas.lineto(lBarBorder+lStripe,lHorBarTop-lBarHt); lPrevHistoPos := lHistoPos+1; end; //draw each stripe intenBar(lImage,lHdr,3,Raw2ScaledIntensity(lHdr,lHdr.GlMinUnScaledS),Raw2ScaledIntensity(lHdr,lHdr.GlMaxUnscaledS)); end; procedure Balance (var lHdr: TMRIcroHdr); var lPct,lNum,lC: integer; lHisto: HistoRA; lBlackAUtoBal,lWhiteAutoBal: integer; begin //dsa if lHdr.ImgBufferItems = 0 then exit; CreateHisto (lHdr, lHisto); lPct := (lHdr.ImgBufferItems *2) div 100; lNum := 0; lC := kHistoBins; repeat lNum := lNum + lHisto[lC]; dec(lC); until (lC = 0) or (lNum >= lPct); if (lNum >= lPct) and (lC > 0) then lWHiteAUtoBal:= lC else begin lC := kHistoBins; repeat lNum := lHisto[lC]; dec(lC); until (lC = 0) or (lNum > 0); if lC = 0 then lWHiteAUtoBal := kHistoBins else lWHiteAUtoBal := lC; end; lNum := 0; lC := 0; repeat lNum := lNum + lHisto[lC]; inc(lC); until (lC >= kHistoBins) or (lNum >= lPct); if (lNum >= lPct) and (lC < kHistoBins) and (lC >2) then lBlackAutoBal := lC else lBlackAutoBal := 2; if (lWHiteAUtoBal-lBlackAutoBal) < (kHistoBins/20) then begin //5% of range.. lBlackAutoBal := 2; lWHiteAUtoBal := kHistoBins; end; lHdr.AutoBalMaxUnscaled := ((lWhiteAutoBal/kHistoBins)*(lHdr.GlMaxUnscaledS-lHdr.GlMinUnscaledS))+lHdr.GlMinUnscaledS; lHdr.AutoBalMinUnscaled := ((lBlackAutoBal/kHistoBins)*(lHdr.GlMaxUnscaledS-lHdr.GlMinUnscaledS))+lHdr.GlMinUnscaledS; //only apply rounding if there is a large difference - e.g. if range is 0..1 then rounding will hurt if (lHdr.ImgBufferBPP < 4) and ((lHdr.AutoBalMaxUnscaled-lHdr.AutoBalMinUnscaled) > 50) then begin //round integer values lHdr.AutoBalMinUnscaled := round(lHdr.AutoBalMinUnscaled); lHdr.AutoBalMaxUnscaled := round(lHdr.AutoBalMaxUnscaled); end; end; //proc Balance procedure ReturnMinMax (var lHdr: TMRIcroHdr; var lMin,lMax: single; var lFiltMin8bit, lFiltMax8bit: integer); var lSwap,lMinS,lMaxS {,lHalfBit}: single; begin lFiltMin8bit := 0; lFiltMax8bit := 255; lMinS := lHdr.WindowScaledMin; lMaxS := lHdr.WindowScaledMax; if lMinS > lMaxS then begin //swap lSwap := lMinS; lMinS := lMaxS; lMaxS := lSwap; end;//swap lMin := (Scaled2RawIntensity(lHdr, lMinS)); lMax := (Scaled2RawIntensity(lHdr, lMaxS)); //if lMin = lMax then exit; if (lHdr.LutFromZero) then begin if (lMinS > 0) and (lMaxS <> 0) then begin //lMin := Scaled2RawIntensity(lHdr, 0); lFiltMin8bit := round(lMinS/lMaxS*255); //lMinS := - lHalfBit;//0; lHdr.Zero8Bit := 0; end else if (lMaxS < 0) and (lMinS <> 0) then begin //lMax := Scaled2RawIntensity(lHdr, -0.000001); lFiltMax8bit := 255-round(lMaxS/lMinS*255); //lMaxS := lHalfBit; //0; //lFiltMax8bit := (Scaled2RawIntensity(lHdr, lHdr.WindowScaledMax)); end; //> 0 end; //LUTfrom Zero lHdr.Zero8Bit := lMinS; lHdr.Slope8bit := (lMaxS-lMinS)/255; end; //ReturnMinMax procedure FilterScrnImg (var lHdr: TMRIcroHdr); var lInc,lItems,lFiltMin8bit,lFiltMax8bit: integer; lMinS,lMaxS,lScale: single; begin ReturnMinMax(lHdr,lMinS,lMaxS,lFiltMin8bit,lFiltMax8bit); lItems :=lHdr.ScrnBufferItems; if lItems < 1 then exit; if lFiltMax8Bit < 255 then begin lFiltMin8bit := 255-lFiltMax8bit; lFiltMax8Bit := 255; end; lScale := (lFiltMax8bit-lFiltMin8bit)/255; if (lFiltMin8bit > 0) or (lFiltMax8bit < 255) then for lInc := 1 to lItems do if lHdr.ScrnBuffer^[lInc] <> 0 then lHdr.ScrnBuffer^[lInc] := lFiltMin8bit+round(lHdr.ScrnBuffer^[lInc]*lScale); end; //FilterScrnImg procedure RescaleImgIntensity8(var lHdr: TMRIcroHdr ); var lRng: single; lLUTra: array[0..255] of byte; lMax,lMin,lSwap,lMod: single; lFiltMin8bit,lFiltMax8bit,lInc: integer; begin if (lHdr.ImgBufferBPP <> 1) or (lHdr.ImgBufferItems < 2) then exit; ReturnMinMax (lHdr, lMin,lMax,lFiltMin8bit,lFiltMax8bit); lRng := (lMax - lMin); if lRng <> 0 then lMod := abs({trunc}(((254)/lRng))) else lMod := 0; if lMin > lMax then begin //maw lSwap := lMin; lMin := lMax; lMax := lSwap; end; for lInc := 0 to 255 do begin if lInc < lMin then lLUTra[lInc] := 0 else if lInc >= lMax then lLUTra[lInc] := 255 else lLUTra[lInc] := trunc(((lInc-lMin)*lMod)+1); end; //fill LUT if lRng < 0 then //inverted scale... e.g. negative scale factor for lInc := 0 to 255 do lLUTra[lInc] := 255-lLUTra[lInc]; for lInc := 1 to lHdr.ScrnBufferItems do lHdr.ScrnBuffer^[lInc] := lLUTra[lHdr.ImgBuffer^[lInc]]; end;//proc RescaleImgIntensity8 procedure ReturnMinMaxInt (var lHdr: TMRIcroHdr; var lMin,lMax, lFiltMin8bit, lFiltMax8bit: integer); var lMinS,lMaxS: single; begin ReturnMinMax (lHdr, lMinS,lMaxS,lFiltMin8bit, lFiltMax8bit); lMin := round(lMinS); lMax := round(lMaxS); end; procedure RescaleImgIntensity16(var lHdr: TMRIcroHdr ); var lRng: single; lBuff: bytep0; l16Buf : SmallIntP; lFiltMin8bit,lFiltMax8bit,lRngi,lMin16Val,lMax,lMin,lSwap,lModShl10,lInc,lInt: integer; begin if (lHdr.ImgBufferBPP <> 2) or (lHdr.ImgBufferItems < 2) then exit; ReturnMinMaxInt (lHdr, lMin,lMax,lFiltMin8bit,lFiltMax8bit); lRng := lMax - lMin; if lRng <> 0 then lModShl10 := abs( trunc(((254)/lRng)* 1024)) else lModShl10 := 0; if lMin > lMax then begin lSwap := lMin; lMin := lMax; lMax := lSwap; end; lMin16Val := trunc(lHdr.GlMinUnscaledS); lRngi := (1+ trunc(lHdr.GlMaxUnscaledS))-lMin16Val; getmem(lBuff, lRngi+1); //+1 if the only values are 0,1,2 the range is 2, but there are 3 values! for lInc := 0 to (lRngi) do begin //build lookup table lInt := lInc+lMin16Val; if lInt >= lMax then lBuff^[lInc] := (255) else if lInt < lMin then lBuff^[lInc] := 0 else lBuff^[lInc] := (((lInt-lMin)*lModShl10) shr 10)+1 ; //lBuff[lInc] := (((lInt-lMin)*lModShl10) shr 10) ; end; //build lookup table if lRng < 0 then //inverted scale... e.g. negative scale factor for lInc := 0 to lRngi do lBuff^[lInc] := 255-lBuff^[lInc]; l16Buf := SmallIntP(lHdr.ImgBuffer ); for lInc := 1 to lHdr.ImgBufferItems do lHdr.ScrnBuffer^[lInc] := lBuff^[l16Buf^[lInc]-lMin16Val] ; freemem(lBuff); //release lookup table end;//proc RescaleImgIntensity16; procedure RescaleImgIntensity32(var lHdr: TMRIcroHdr ); var lRng: double; lMod,lMax,lMin,lSwap: single {was extended}; lInc,lItems,lFiltMin8bit,lFiltMax8bit: integer; l32Buf : SingleP; begin lItems := lHdr.ImgBufferItems ; //fx(lItems,777); if (lHdr.ImgBufferBPP <> 4) or (lItems< 2) then exit; l32Buf := SingleP(lHdr.ImgBuffer ); //fx(lHdr.WindowScaledMin , lHdr.WindowScaledMax); ReturnMinMax (lHdr, lMin,lMax,lFiltMin8bit,lFiltMax8bit); //qaz lRng := (lMax - lMin); if lRng <> 0 then lMod := abs(254/lRng) else begin //June 2007 - binary contrast for lInc := 1 to lItems do begin if l32Buf^[lInc] >= lMax then lHdr.ScrnBuffer^[lInc] := 255 else //if l32Buf[lInc] < lMin then lHdr.ScrnBuffer^[lInc] := 0; end; exit; end; (*if lRng <> 0 then lMod := abs(254/lRng) else lMod := 0;*) if lMin > lMax then begin lSwap := lMin; lMin := lMax; lMax := lSwap; end; lMin := lMin - abs(lRng/255);//lMod; //showmessage(realtostr(lMin,3)+' '+realtostr(lMax,3)); begin//not SSE for lInc := 1 to lItems do begin if l32Buf^[lInc] > lMax then lHdr.ScrnBuffer^[lInc] := 255 else if l32Buf^[lInc] < lMin then lHdr.ScrnBuffer^[lInc] := 0 //alfa else begin lHdr.ScrnBuffer^[lInc] := round ((l32Buf^[lInc]-lMin)*lMod); end; end; //for each voxel end; // SSE-vs-x87 choice //next - flip intensity range OPTIONAL if lRng < 0 then //inverted scale... e.g. negative scale factor for lInc := 1 to lItems do lHdr.ScrnBuffer^[lInc] := 255-lHdr.ScrnBuffer^[lInc]; end; //RescaleImgIntensity32 function MirrorImgBuffer(var lHdr: TMRIcroHdr ): boolean; var lXPos,lYPos,lZPos,lX,lY,lZ,lHlfX,lLineOffset: integer; lTemp32: single; lTemp16: SmallInt; lTemp: byte; l32: SingleP; l16: SmallIntP; begin result := false; lX := lHdr.NIFTIhdr.Dim[1]; lY := lHdr.NIFTIhdr.Dim[2]; lZ := lHdr.NIFTIhdr.Dim[3]; if lHdr.NIFTIhdr.Dim[4] > 1 then begin Showmessage('Can not mirror 4D data : '+lHdr.HdrFileName); exit; end; if (lHdr.ImgBufferItems < (lX*lY*lZ)) or (lX < 2) then begin Showmessage('Unsupported filetype : '+lHdr.HdrFileName); exit; end; lHlfX := lX div 2; lLineOffset := 0; //for each datatype... if lHdr.ImgBufferBPP = 4 then begin l32 := SingleP(lHdr.ImgBuffer); for lZPos := 1 to lZ do begin for lYPos := 1 to lY do begin for lXPos := 1 to lHlfX do begin lTemp32 := l32^[lXPos+lLineOffset]; l32^[lXPos+lLineOffset] := l32^[1+lX-lXPos+lLineOffset]; l32^[1+lX-lXPos+lLineOffset] := lTemp32; end; //for X lLineOffset := lLineOffset + lX; end; //for Y end; //for Z end else if lHdr.ImgBufferBPP = 2 then begin l16 := SmallIntP(lHdr.ImgBuffer); for lZPos := 1 to lZ do begin for lYPos := 1 to lY do begin for lXPos := 1 to lHlfX do begin lTemp16 := l16^[lXPos+lLineOffset]; l16^[lXPos+lLineOffset] := l16^[1+lX-lXPos+lLineOffset]; l16^[1+lX-lXPos+lLineOffset] := lTemp16; end; //for X lLineOffset := lLineOffset + lX; end; //for Y end; //for Z end else if lHdr.ImgBufferBPP = 1 then begin for lZPos := 1 to lZ do begin for lYPos := 1 to lY do begin for lXPos := 1 to lHlfX do begin lTemp := lHdr.ImgBuffer^[lXPos+lLineOffset]; lHdr.ImgBuffer^[lXPos+lLineOffset] := lHdr.ImgBuffer^[1+lX-lXPos+lLineOffset]; lHdr.ImgBuffer^[1+lX-lXPos+lLineOffset] := lTemp; end; //for X lLineOffset := lLineOffset + lX; end; //for Y end; //for Z end else //unsupported bits-per-pixel dataformat Showmessage('Unsupported BPP ='+inttostr(lHdr.ImgBufferBPP) ); result := true; end; //proc MirrorImgBuffer procedure MirrorScrnBuffer(var lBackgroundImg: TBGImg; var lHdr: TMRIcroHdr ); var lXPos,lYPos,lZPos,lX,lY,lZ,lHlfX,lLineOffset: integer; lTemp: byte; begin lX := lBackgroundImg.ScrnDim[1]; lY := lBackgroundImg.ScrnDim[2]; lZ := lBackgroundImg.ScrnDim[3]; if (lHdr.ScrnBufferItems < (lX*lY*lZ)) or (lX < 2) then exit; lHlfX := lX div 2; lLineOffset := 0; for lZPos := 1 to lZ do begin for lYPos := 1 to lY do begin for lXPos := 1 to lHlfX do begin lTemp := lHdr.ScrnBuffer^[lXPos+lLineOffset]; lHdr.ScrnBuffer^[lXPos+lLineOffset] := lHdr.ScrnBuffer^[1+lX-lXPos+lLineOffset]; lHdr.ScrnBuffer^[1+lX-lXPos+lLineOffset] := lTemp; end; //for X lLineOffset := lLineOffset + lX; end; //for Y end; //for Z end; //proc MirrorImScrnBuffer procedure FindMatrixPt (lX,lY,lZ: single; var lXout,lYOut,lZOut: single; var lMatrix: TMatrix); begin lXOut := (lX*lMatrix.matrix[1,1])+(lY*lMatrix.matrix[1,2])+(lZ*lMatrix.matrix[1,3])+lMatrix.matrix[1,4]; lYOut := (lX*lMatrix.matrix[2,1])+(lY*lMatrix.matrix[2,2])+(lZ*lMatrix.matrix[2,3])+lMatrix.matrix[2,4]; lZOut := (lX*lMatrix.matrix[3,1])+(lY*lMatrix.matrix[3,2])+(lZ*lMatrix.matrix[3,3])+lMatrix.matrix[3,4]; end; procedure CheckMaxMin(var lX,lY,lZ,lXMax,lYMax,lZMax,lXMin,lYMin,lZMin: single); begin if lX > lXMax then lXMax := lX; if lY > lYMax then lYMax := lY; if lZ > lZMax then lZMax := lZ; if lX < lXMin then lXMin := lX; if lY < lYMin then lYMin := lY; if lZ < lZMin then lZMin := lZ; end; function FindOriMM (lX1,lY1,lZ1,lX2,lY2,lZ2: integer; var lMatrix: TMatrix): single; var lXdx,lYdx,lZdx,lXmm1,lYmm1,lZmm1,lXmm2,lYmm2,lZmm2: single; begin FindMatrixPt(lX1,lY1,lZ1,lXmm1,lYmm1,lZmm1,lMatrix); FindMatrixPt(lX2,lY2,lZ2,lXmm2,lYmm2,lZmm2,lMatrix); lXdx := abs(lXmm1-lXmm2); lYdx := abs(lYmm1-lYmm2); lZdx := abs(lZmm1-lZmm2); if (lXdx > lYdx) and (lXdx > lZdx) then begin //X greatest result := lXmm1; end else if (lYdx > lZdx) then begin //Y greatest result := lYmm1; end else begin //Z greatest result := lZmm1; end; result := -(result); end; procedure FindMatrixBounds (var lBGImg: TBGImg; var lHdr: TMRIcroHdr; lReslice: boolean); label 121; var lMatrix: TMatrix; lPos,lPass: integer; lXc,lYc,lZc,lXmin,lXMax,lYMin,lYMax,lZMin,lZMax,lX,lY,lZ,lmmMin,lDimMMMax: single; begin if not lReslice then begin //Dec06 lBGImg.ScrnDim[1] := lHdr.NIFTIhdr.Dim[1];//+0.5 Dec06 lBGImg.ScrnDim[2] := lHdr.NIFTIhdr.Dim[2];//+0.5 Dec06 lBGImg.ScrnDim[3] := lHdr.NIFTIhdr.Dim[3];//+0.5 Dec06 lBGImg.ScrnMM[1] := lHdr.NIFTIhdr.pixdim[1]; lBGImg.ScrnMM[2] := lHdr.NIFTIhdr.pixdim[2]; lBGImg.ScrnMM[3] := lHdr.NIFTIhdr.pixdim[3]; //Sept07 -estimate origin lBGImg.ScrnOri[1] := lBGImg.ScrnDim[1] div 2; lBGImg.ScrnOri[2] := lBGImg.ScrnDim[2] div 2; lBGImg.ScrnOri[3] := lBGImg.ScrnDim[3] div 2; if lHdr.NIfTItransform then begin lBGImg.ScrnOri[1] := 0; lBGImg.ScrnOri[2] := 0; lBGImg.ScrnOri[3] := 0; mm2Voxel (lBGImg.ScrnOri[1],lBGImg.ScrnOri[2],lBGImg.ScrnOri[3], lBGImg.invMat);//vcx (* lMatrix := lHdr.Mat; if lBGImg.ScrnMM[1] <> 0 then lBGImg.ScrnOri[1] := 1+FindOriMM (0,0,0,lBGImg.ScrnDim[1]-1,0,0, lMatrix)/lBGImg.ScrnMM[1]; if lBGImg.ScrnMM[2] <> 0 then lBGImg.ScrnOri[2] := 1+FindOriMM (0,0,0,0,lBGImg.ScrnDim[2]-1,0, lMatrix)/lBGImg.ScrnMM[2]; if lBGImg.ScrnMM[3] <> 0 then lBGImg.ScrnOri[3] := 1+FindOriMM (0,0,0,0,0,lBGImg.ScrnDim[3]-1, lMatrix)/lBGImg.ScrnMM[3]; *) end; //end estimate origin //fx(lBGImg.ScrnOri[1],lBGImg.ScrnMM[1],lBGImg.ScrnOri[3],1112); exit; end; lPass := 0; if (abs(lHdr.Mat.matrix[1,4]) > maxInt) or (abs(lHdr.Mat.matrix[2,4]) > MaxInt) or (abs(lHdr.Mat.matrix[3,4]) > maxint) then begin showmessage('Error: the origin is not plausible.'); lHdr.Mat.matrix[1,4] := 0; lHdr.Mat.matrix[2,4] := 0; lHdr.Mat.matrix[3,4] := 0; end; 121: inc(lPass); lMatrix := lHdr.Mat; FindMatrixPt(0,0,0,lX,lY,lZ,lMatrix); lXMax := lX; lYMax := lY; lZMax := lZ; lXMin := lX; lYMin := lY; lZMin := lZ; for lPos := 1 to 7 do begin if odd(lPos) then lXc := lHdr.NIFTIhdr.Dim[1]-1 else lXc := 0; if odd(lPos shr 1) then lYc := lHdr.NIFTIhdr.Dim[2]-1 else lYc := 0; if odd(lPos shr 2) then lZc := lHdr.NIFTIhdr.Dim[3]-1 else lZc := 0; //showmessage(floattostr(lXc)+' '+floattostr(lYc)+' '+floattostr(lZc) ); FindMatrixPt(lXc,lYc,lZc,lX,lY,lZ,lMatrix); CheckMaxMin(lX,lY,lZ,lXMax,lYMax,lZMax,lXMin,lYMin,lZMin); end; //fx(lXMax,lXMin,lZMax,lZMin); //next find min MM //fx(lZMin,lZMax); lmmMin := abs(lHdr.NIFTIhdr.pixdim[1]); if abs(lHdr.NIFTIhdr.pixdim[2]) < lmmMin then lmmMin := abs(lHdr.NIFTIhdr.pixdim[2]); if abs(lHdr.NIFTIhdr.pixdim[3]) < lmmMin then lmmMin := abs(lHdr.NIFTIhdr.pixdim[3]); if lmmMin = 0 then lmmMin := 1; //next find max Dim lDimMMMax := abs(lXMax-lXMin); if abs(lYMax-lYMin) > lDimMMMax then lDimMMMax := abs(lYMax-lYMin); if abs(lZMax-lZMin) > lDimMMMax then lDimMMMax := abs(lZMax-lZMin); if (1+trunc(lDimMMMax/lmmMin)) > gBGImg.MaxDim then begin //image will be too large if isotropically scalled by smallest mm, try largest mm lmmMin := lHdr.NIFTIhdr.pixdim[1]; if lHdr.NIFTIhdr.pixdim[2] > lmmMin then lmmMin := lHdr.NIFTIhdr.pixdim[2]; if lHdr.NIFTIhdr.pixdim[3] > lmmMin then lmmMin := lHdr.NIFTIhdr.pixdim[3]; if lmmMin = 0 then lmmMin := 1; if (1+trunc(lDimMMMax/lmmMin)) > gBGImg.MaxDim then begin //image will be too large if isotropically scalled by largest mm, try isotropic 1mm lmmMin := 1; end; if (1+trunc(lDimMMMax/lmmMin)) > gBGImg.MaxDim then begin //image will be too large if isotropically scaled by 1mm, find optimal scaling factor lmmMin := lDimMMMax/gBGImg.MaxDim; Showmessage('Maximum dimension is >'+inttostr(gBGImg.MaxDim)+' voxels. Therefore the image will resolution will be reduced. If you have a fast computer, you may consider increasing the ''MaxDim'' value saved in the mricron.ini file.'); //showmessage('Warning: having to downsample this large image - you may wish to view this image with MRIcro.'); end; //showmessage( floattostr(lmmMin)); //lmmMin := 3.5;// end; lBGImg.ScrnDim[1] := 1+trunc(0.5+((lXMax-lXMin)/lmmMin));//+0.5 May06 lBGImg.ScrnDim[2] := 1+trunc(0.5+((lYMax-lYMin)/lmmMin));//+0.5 May06 lBGImg.ScrnDim[3] := 1+trunc(0.5+((lZMax-lZMin)/lmmMin));//+0.5 May06 //fx(lBGImg.ScrnDim[3],lmmMin); lBGImg.ScrnMM[1] := lmmMin; lBGImg.ScrnMM[2] := lmmMin; lBGImg.ScrnMM[3] := lmmMin; //fx(lBGImg.ScrnDim[1],lBGImg.ScrnDim[2],lBGImg.ScrnDim[3]); //showmessage(floattostr(lZMin)+'...'+floattostr(lZMax)+' '+floattostr((lZMin)/lmmMin)); lBGImg.ScrnOri[1] := -(((lXMin)/lmmMin))+1; lBGImg.ScrnOri[2] := -(((lYMin)/lmmMin))+1; lBGImg.ScrnOri[3] := -(((lZMin)/lmmMin))+1; //fx(lBGImg.ScrnOri[1],lBGImg.ScrnOri[2],lBGImg.ScrnOri[3]); if (lXMin > 0) and (lYMin > 0) and (lZMin > 0) and (lPass <= 2) then begin lHdr.Mat.matrix[1,4] := -lHdr.Mat.matrix[1,4]; lHdr.Mat.matrix[2,4] := -lHdr.Mat.matrix[2,4]; lHdr.Mat.matrix[3,4] := -lHdr.Mat.matrix[3,4]; {lHdr.NIFTIhdr.srow_x[3] := -lHdr.NIFTIhdr.srow_x[3]; lHdr.NIFTIhdr.srow_y[3] := -lHdr.NIFTIhdr.srow_y[3]; lHdr.NIFTIhdr.srow_z[3] := -lHdr.NIFTIhdr.srow_z[3];} {lHdr.Mat.matrix[1,4] := 0; lHdr.Mat.matrix[2,4] := 0; lHdr.Mat.matrix[3,4] := 0; } if lPass = 1 then begin Showmessage('The origin is not in the image... check your transformation matrix - will attempt to invert offsets'); goto 121; end else if lPass = 2 then begin lHdr.Mat.matrix[1,4] := 0; lHdr.Mat.matrix[2,4] := 0; lHdr.Mat.matrix[3,4] := 0; Showmessage('The origin is not in the image... check your transformation matrix - will attempt to zero offsets'); goto 121; end else showmessage('The origin is not in the image... unable to correct.'); end; end; function mat44_inverse(var R: Tmatrix ) : TMatrix; var r11,r12,r13,r21,r22,r23,r31,r32,r33,v1,v2,v3 , deti : double; Q: TMatrix; begin r11 := R.matrix[1,1]; r12 := R.matrix[1,2]; r13 := R.matrix[1,3]; //* [ r11 r12 r13 v1 ] */ r21 := R.matrix[2,1]; r22 := R.matrix[2,2]; r23 := R.matrix[2,3]; //* [ r21 r22 r23 v2 ] */ r31 := R.matrix[3,1]; r32 := R.matrix[3,2]; r33 := R.matrix[3,3]; //* [ r31 r32 r33 v3 ] */ v1 := R.matrix[1,4]; v2 := R.matrix[2,4]; v3 := R.matrix[3,4]; //* [ 0 0 0 1 ] */ deti := r11*r22*r33-r11*r32*r23-r21*r12*r33 +r21*r32*r13+r31*r12*r23-r31*r22*r13 ; if( deti <> 0.0 ) then deti := 1.0 / deti ; Q.matrix[1,1] := deti*( r22*r33-r32*r23) ; Q.matrix[1,2] := deti*(-r12*r33+r32*r13) ; Q.matrix[1,3] := deti*( r12*r23-r22*r13) ; Q.matrix[1,4] := deti*(-r12*r23*v3+r12*v2*r33+r22*r13*v3 -r22*v1*r33-r32*r13*v2+r32*v1*r23) ; Q.matrix[2,1] := deti*(-r21*r33+r31*r23) ; Q.matrix[2,2] := deti*( r11*r33-r31*r13) ; Q.matrix[2,3] := deti*(-r11*r23+r21*r13) ; Q.matrix[2,4] := deti*( r11*r23*v3-r11*v2*r33-r21*r13*v3 +r21*v1*r33+r31*r13*v2-r31*v1*r23) ; Q.matrix[3,1] := deti*( r21*r32-r31*r22) ; Q.matrix[3,2] := deti*(-r11*r32+r31*r12) ; Q.matrix[3,3] := deti*( r11*r22-r21*r12) ; Q.matrix[3,4] := deti*(-r11*r22*v3+r11*r32*v2+r21*r12*v3 -r21*r32*v1-r31*r12*v2+r31*r22*v1) ; Q.matrix[4,1] := 0; Q.matrix[4,2] := 0; Q.matrix[4,3] := 0.0 ; Q.matrix[4,4] := 1;// (deti == 0.0l) ? 0.0l : 1.0l ; /* failure flag if deti == 0 */ result := Q ; end; function TestSameOrtho(var lHdr: TMRIcroHdr): boolean; var lRow,lCol: integer; begin result := false; for lRow := 1 to 3 do for lCol := 1 to 3 do if (lRow=lCol) then begin if lHdr.Mat.Matrix[lRow,lCol] <= 0 then exit; end else if lHdr.Mat.Matrix[lRow,lCol] <> 0 then exit; result := true; end; function OrthoReslice (var lBGImg: TBGImg; var lHdr: TMRIcroHdr): boolean; label 666; Type TXImg = record //Next: analyze Format Header structure rDim: array [1..3] of integer; rOri,rMM: array [1..3] of single; rSliceSz: integer; end; //TNIFTIhdr Header Structure var //lStartTime,lEndTime: DWord; lIn,lOut: TXImg; lBuffIn,lBuffOut,lBuffOutUnaligned: Bytep; lBuffIn16,lBuffOut16 : SmallIntP; lBuffIn32,lBuffOut32 : SingleP; lX,lY,lZ,lI,lPos,lOutVolItems,lInZPos,lInYPos,lOutZPos,lOutYPos,lInZPosHi,lInYPosHi: integer; lXmodLo,lXmodHi,lYmodLo,lYmodHi,lZmodLo,lZmodHi: single; lScale,lFloatPos: single; lMin,lMax: array [1..3] of integer; lLUTra: array [1..3] of LongIntp; lLUTmodRA: array [1..3] of Singlep; begin result := false; // if lHdr.ImgBufferBPP = 4 then exit; if not TestSameOrtho(lHdr) then exit; //if lHdr.ImgBufferBPP <> 1 then exit; //lStartTime := GetTickCount; for lI := 1 to 3 do begin lIn.rDim[lI] := lHdr.NIFTIhdr.dim[lI]; lIn.rMM[lI] := lHdr.NIFTIhdr.pixdim[lI]; lIn.rOri[lI] := (abs(lHdr.Mat.Matrix[lI,4]))/abs(lHdr.NIFTIhdr.pixdim[lI])+1;//May07 end; lIn.rSliceSz := lIn.rDim[1]*lIn.rDim[2]; //Output to background size for lI := 1 to 3 do begin lOut.rDim[lI] := lBGImg.ScrnDim[lI]; lOut.rMM[lI] := lBGImg.ScrnMM[lI]; lOut.rOri[lI] := lBGImg.ScrnOri[lI]; // fx(lOut.rDim[lI],lOut.rMM[lI],lOut.rOri[lI]); end; lOut.rSliceSz := lOut.rDim[1]*lOut.rDim[2]; lOutVolItems := lOut.rSliceSz * lOut.rDim[3]; //InVolSz! //find bounding box for overlay, and create lookup tables for lI := 1 to 3 do begin lScale := lOut.rMM[lI] / lIn.rMM[lI]; getmem(lLUTra[lI],lOut.rDim[lI]*4); getmem(lLUTmodra[lI],lOut.rDim[lI]*4); lMin[lI] := maxint; lMax[lI] := -1; for lPos := 1 to lOut.rDim[lI] do begin if lBGImg.OverlaySmooth then begin lFloatPos := ((lPos-lOut.rOri[lI]) *lScale)+lIn.rOri[lI] {-0.5}; lLUTra[lI]^[lPos] := trunc ( lFloatPos ); lLUTmodra[lI]^[lPos] := ( frac (lFloatPos )); end else begin lLUTra[lI]^[lPos] := round ( ((lPos-lOut.rOri[lI]) *lScale)+lIn.rOri[lI] ); lLUTmodra[lI]^[lPos] :=0;//not used end; if (lLUTra[lI]^[lPos] > 0) and (lMin[lI]=MaxInt) then lMin[lI] := lPos; if (lLUTra[lI]^[lPos] < lIn.rDim[lI]) {danger! <=} then lMax[lI] := lPos; end; end; //for lI := 1 to 3 do fx( lOut.rMM[lI],lIn.rMM[lI]); for lI := 1 to 3 do if lMin[lI] > lMax[lI] then begin showmessage ('Unusual rotation matrix - consider viewing with MRIcro.');//goto 345; //do after previous loop so we are sure all buffers used goto 666; end; lMax[1] := lMax[1] -1;{-1 as we do not want to sample past edge} ImgForm.ProgressBar1.Min := lMin[3]; ImgForm.ProgressBar1.Max := lMax[3]; //next - core if lHdr.ImgBufferBPP = 4 then begin //next- 32 bit lBuffIn32 := SingleP(lHdr.ImgBuffer); GetMem(lBuffOutUnaligned,(lOutVolItems*sizeof(single))+16); //svn lBuffOut32 := SingleP($fffffff0 and (integer(lBuffOutUnaligned)+15)); lBuffOut32 := Align(lBuffOutUnaligned, 16); for lX := 1 to lOutVolItems do lBuffOut32^[lX] := 0; //set all to zero //fx(lOutVolItems,lHdr.ImgBufferItems); for lZ := lMin[3] to lMax[3] do begin ImgForm.ProgressBar1.Position := lZ; lOutZPos := (lZ-1) * lOut.rSliceSz; lInZPos:= (lLUTra[3]^[lZ]-1) * lIn.rSliceSz; lInZPosHi := lInZPos + lIn.rSliceSz; lZmodHi := lLUTmodra[3]^[lZ]; lZModLo := 1 - lZmodHi; for lY := lMin[2] to lMax[2] do begin lOutYPos := (lY-1) * lOut.rDim[1]; lInYPos := (lLUTra[2]^[lY]-1) * lIn.rDim[1]; //number of lines lInYPosHi := lInYPos + lIn.rDim[1]; lYmodHi := lLUTmodra[2]^[lY]; lYModLo := 1 - lYmodHi; for lX := lMin[1] to lMax[1] do begin lXmodHi := lLUTmodra[1]^[lX]; lXModLo := 1 - lXmodHi; lBuffOut32^[lOutZPos+lOutYPos+lX] := ( lBuffIn32^[lInZPos+lInYPos+lLUTra[1]^[lX]]*lXModLo*lYModLo*lZModLo + lBuffIn32^[lInZPos+lInYPos+lLUTra[1]^[lX]+1]*lXModHi*lYModLo*lZModLo + lBuffIn32^[lInZPos+lInYPosHi+lLUTra[1]^[lX]]*lXModLo*lYModHi*lZModLo + lBuffIn32^[lInZPos+lInYPosHi+lLUTra[1]^[lX]+1]*lXModHi*lYModHi*lZModLo + lBuffIn32^[lInZPosHi+lInYPos+lLUTra[1]^[lX]]*lXModLo*lYModLo*lZModHi + lBuffIn32^[lInZPosHi+lInYPos+lLUTra[1]^[lX]+1]*lXModHi*lYModLo*lZModHi + lBuffIn32^[lInZPosHi+lInYPosHi+lLUTra[1]^[lX]]*lXModLo*lYModHi*lZModHi + lBuffIn32^[lInZPosHi+lInYPosHi+lLUTra[1]^[lX]+1]*lXModHi*lYModHi*lZModHi) ; end; //for X end; //for Y end; //for Z FreeMem(lHdr.ImgBufferUnaligned); GetMem(lHdr.ImgBufferUnaligned ,(lOutVolItems*sizeof(Single)) + 16); //svn lHdr.ImgBuffer := ByteP ($fffffff0 and (integer(lHdr.ImgBufferUnaligned )+15)); lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned, 16); lHdr.ImgBufferItems := lOutVolItems; Move(lBuffOut32^,lHdr.ImgBuffer^,lOutVolItems*sizeof(Single));//source/dest //678 winOnly-> CopyMemory(Pointer(lHdr.ImgBuffer),Pointer(lBuffOut32),(lOutVolItems*sizeof(Single))); FreeMem(lBuffOutUnaligned); end else if lHdr.ImgBufferBPP = 2 then begin //next- 16 bit lBuffIn16 := SmallIntP(lHdr.ImgBuffer); GetMem(lBuffOutUnaligned,(lOutVolItems*sizeof(smallint))+16); //svn lBuffOut16 := SmallIntP($fffffff0 and (integer(lBuffOutUnaligned)+15)); lBuffOut16 := align(lBuffOutUnaligned, 16); for lX := 1 to lOutVolItems do lBuffOut16^[lX] := 0; //set all to zero for lZ := lMin[3] to lMax[3] do begin ImgForm.ProgressBar1.Position := lZ; lOutZPos := (lZ-1) * lOut.rSliceSz; lInZPos:= (lLUTra[3]^[lZ]-1) * lIn.rSliceSz; lInZPosHi := lInZPos + lIn.rSliceSz; lZmodHi := lLUTmodra[3]^[lZ]; lZModLo := 1 - lZmodHi; for lY := lMin[2] to lMax[2] do begin lOutYPos := (lY-1) * lOut.rDim[1]; lInYPos := (lLUTra[2]^[lY]-1) * lIn.rDim[1]; //number of lines lInYPosHi := lInYPos + lIn.rDim[1]; lYmodHi := lLUTmodra[2]^[lY]; lYModLo := 1 - lYmodHi; for lX := lMin[1] to lMax[1] do begin lXmodHi := lLUTmodra[1]^[lX]; lXModLo := 1 - lXmodHi; lBuffOut16^[lOutZPos+lOutYPos+lX] := round( lBuffIn16^[lInZPos+lInYPos+lLUTra[1]^[lX]]*lXModLo*lYModLo*lZModLo + lBuffIn16^[lInZPos+lInYPos+lLUTra[1]^[lX+1]]*lXModHi*lYModLo*lZModLo + lBuffIn16^[lInZPos+lInYPosHi+lLUTra[1]^[lX]]*lXModLo*lYModHi*lZModLo + lBuffIn16^[lInZPos+lInYPosHi+lLUTra[1]^[lX+1]]*lXModHi*lYModHi*lZModLo + lBuffIn16^[lInZPosHi+lInYPos+lLUTra[1]^[lX]]*lXModLo*lYModLo*lZModHi + lBuffIn16^[lInZPosHi+lInYPos+lLUTra[1]^[lX+1]]*lXModHi*lYModLo*lZModHi + lBuffIn16^[lInZPosHi+lInYPosHi+lLUTra[1]^[lX]]*lXModLo*lYModHi*lZModHi + lBuffIn16^[lInZPosHi+lInYPosHi+lLUTra[1]^[lX+1]]*lXModHi*lYModHi*lZModHi) ; end; //for X end; //for Y end; //for Z FreeMem(lHdr.ImgBufferUnaligned); GetMem(lHdr.ImgBufferUnaligned ,(lOutVolItems*sizeof(SmallInt)) + 16); //lHdr.ImgBuffer := ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned, 16); lHdr.ImgBufferItems := lOutVolItems; Move((lBuffOut16^),(lHdr.ImgBuffer^),lOutVolItems*sizeof(SmallInt));//source/dest //678 winOnly-> CopyMemory(Pointer(lHdr.ImgBuffer),Pointer(lBuffOut16),(lOutVolItems*sizeof(SmallInt))); FreeMem(lBuffOutUnaligned); end else if lHdr.ImgBufferBPP = 1 then begin //next- 8 bit lBuffIn := lHdr.ImgBuffer; GetMem(lBuffOut,lOutVolItems); Fillchar(lBuffOut^,lOutVolItems,0); //set all to zero //for lI := 1 to lOutVolItems do lBuffOut[lI] := 0; //set all to zero for lZ := lMin[3] to lMax[3] do begin ImgForm.ProgressBar1.Position := lZ; lOutZPos := (lZ-1) * lOut.rSliceSz; lInZPos:= (lLUTra[3]^[lZ]-1) * lIn.rSliceSz; lInZPosHi := lInZPos + lIn.rSliceSz; lZmodHi := lLUTmodra[3]^[lZ]; lZModLo := 1 - lZmodHi; for lY := lMin[2] to lMax[2] do begin lOutYPos := (lY-1) * lOut.rDim[1]; lInYPos := (lLUTra[2]^[lY]-1) * lIn.rDim[1]; //number of lines lInYPosHi := lInYPos + lIn.rDim[1]; lYmodHi := lLUTmodra[2]^[lY]; lYModLo := 1 - lYmodHi; for lX := lMin[1] to lMax[1] do begin lXmodHi := lLUTmodra[1]^[lX]; lXModLo := 1 - lXmodHi; lBuffOut^[lOutZPos+lOutYPos+lX] := round( lBuffIn^[lInZPos+lInYPos+lLUTra[1]^[lX]]*lXModLo*lYModLo*lZModLo + lBuffIn^[lInZPos+lInYPos+lLUTra[1]^[lX+1]]*lXModHi*lYModLo*lZModLo + lBuffIn^[lInZPos+lInYPosHi+lLUTra[1]^[lX]]*lXModLo*lYModHi*lZModLo + lBuffIn^[lInZPos+lInYPosHi+lLUTra[1]^[lX+1]]*lXModHi*lYModHi*lZModLo + lBuffIn^[lInZPosHi+lInYPos+lLUTra[1]^[lX]]*lXModLo*lYModLo*lZModHi + lBuffIn^[lInZPosHi+lInYPos+lLUTra[1]^[lX+1]]*lXModHi*lYModLo*lZModHi + lBuffIn^[lInZPosHi+lInYPosHi+lLUTra[1]^[lX]]*lXModLo*lYModHi*lZModHi + lBuffIn^[lInZPosHi+lInYPosHi+lLUTra[1]^[lX+1]]*lXModHi*lYModHi*lZModHi); end; //for X end; //for Y end; //for Z FreeMem(lHdr.ImgBufferUnaligned); GetMem(lHdr.ImgBufferUnaligned ,lOutVolItems + 16); //svn lHdr.ImgBuffer := ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned, 16); lHdr.ImgBufferItems := lOutVolItems; Move(lBuffOut^,lHdr.ImgBuffer^,lOutVolItems);//source/dest //678winonly-> CopyMemory((lHdr.ImgBuffer),(lBuffOut),lOutVolItems); FreeMem(lBuffOut); end else Showmessage('Unsupported BPP '+inttostr(lHdr.ImgBufferBPP)); ImgForm.ProgressBar1.Position := lMin[3]; result := true; 666: for lI := 1 to 3 do begin freemem(lLUTra[lI]); freemem(lLUTmodra[lI]); end; //Output dimensions: size of background image //lEndTime := GetTickCount; //ImgForm.Label1.caption :=('update(ms): '+inttostr(lEndTime-lStartTime)); end; //procedure OrthogonalResliceImg procedure fSwap(var lX,lY: single); var lSwap: single; begin lSwap := lX; lX := lY; lY := lSwap; end; procedure ResliceScrnImg (var lBGImg: TBGImg; var lHdr: TMRIcroHdr; lTrilinearSmooth: boolean); var lOverlap: boolean; lMinY,lMinZ,lMaxY,lMaxZ: integer; //<- used by trilinear lXreal,lYreal,lZreal,lXrM1,lYrM1,lZrM1, //<- used by trilinear lZr,lYr,lXr,lZx,lZy,lZz,lYx,lYy,lYz,lSwap: single; lZ,lY,lX,lOutVolItems,lOutSliceSz,lInVolItems, lXdimIn,lYDimIn,lZDimIn,lInSliceSz, lOutPos,lOutDimX,lOutDimY,lOutDimZ,lSrcPos,lXo,lYo,lZo: integer; lXxp,lXyp,lXzp: Pointer; lXxra,lXyra,lXzra : SingleP; lMatrix,lMatrixBG: TMatrix; lBuffIn,lBuffOut,lBuffOutUnaligned: Bytep; lBuffIn16,lBuffOut16 : SmallIntP;//16bit lBuffIn32,lBuffOut32: SingleP; begin if SameAsBG(lBGImg,lHdr) then exit; if not lBGImg.Resliced then begin //2008 Reslice_Img_To_Unaligned (gMRIcroOverlay[kBGOverlayNum].NIftiHdr, lHdr, lBGImg.OverlaySmooth); exit; end; if OrthoReslice(lBGImg,lHdr) then exit; lOverlap := false; lMatrix := lHdr.Mat; lMatrix := mat44_inverse(lMatrix); lMatrixBG := Matrix3D ( lBGImg.Scrnmm[1],0,0,0, 0,lBGImg.Scrnmm[2],0,0, 0,0,lBGImg.Scrnmm[3],0, 0,0,0,1); lMatrix.size := size3D; lMatrix := MultiplyMatrices(lMatrix,lMatrixBG); lXdimIn := lHdr.NiftiHdr.dim[1]; lYdimIn := lHdr.NiftiHdr.dim[2]; lZDimIn := lHdr.NiftiHdr.dim[3]; lInSliceSz := lHdr.NiftiHdr.dim[1]*lHdr.NiftiHdr.dim[2]; lInVolItems := lInSliceSz*lHdr.NiftiHdr.dim[3]; if (lHdr.ImgBufferItems < lInVolItems) then exit; lBuffIn := lHdr.ImgBuffer; lOutDimX := lBGImg.ScrnDim[1]; lOutDimY := lBGImg.ScrnDim[2]; lOutDimZ := lBGImg.ScrnDim[3]; lOutSliceSz := lOutDimX*lOutDimY; lOutVolItems := lBGImg.ScrnDim[1]*lBGImg.ScrnDim[2]*lBGImg.ScrnDim[3]; lOutPos := 0; //start look up table... GetMem(lXxp, (sizeof(single)* lOutDimX)+16); GetMem(lXyp, (sizeof(single)* lOutDimX)+16); GetMem(lXzp, (sizeof(single)* lOutDimX)+16); lXxRA := align(lXxp, 16); //SingleP($fffffff0 and (integer(lXxP)+15)); //data aligned to quad-word boundary lXyRA := align(lXyp, 16);//SingleP($fffffff0 and (integer(lXyP)+15)); //quad-word boundary lXzRA := align(lXzp, 16);//SingleP($fffffff0 and (integer(lXzP)+15)); //quad-word boundary for lX := 1 to lOutDimX do begin lXr := lX-(lBGImg.ScrnOri[1]);//* lBGImg.ScrnMM[1]) ; //lXr := lX; lXxRA^[lX] := lXr*lMatrix.matrix[1,1]+1; lXyRA^[lX] := lXr*lMatrix.matrix[2,1]+1; lXzRA^[lX] := lXr*lMatrix.matrix[3,1]+1; end; //end look up table if lTrilinearSmooth then begin //smooth data if lHdr.ImgBufferBPP = 4 then begin lBuffIn32 := SingleP(lHdr.ImgBuffer); GetMem(lBuffOutUnaligned,(lOutVolItems*sizeof(single))+16); lBuffOut32 := align(lBuffOutUnaligned, 16); //SingleP($fffffff0 and (integer(lBuffOutUnaligned)+15)); for lX := 1 to lOutVolItems do lBuffOut32^[lX] := 0; //set all to zero for lZ := 1 to lOutDimZ do begin lZr := lZ -(lBGImg.ScrnOri[3]); lZx := lZr*lMatrix.matrix[1,3]+lMatrix.matrix[1,4]; lZy := lZr*lMatrix.matrix[2,3]+lMatrix.matrix[2,4]; lZz := lZr*lMatrix.matrix[3,3]+lMatrix.matrix[3,4]; for lY := 1 to lOutDimY do begin lYr := lY -(lBGImg.ScrnOri[2]); lYx := lYr*lMatrix.matrix[1,2]; lYy := lYr*lMatrix.matrix[2,2]; lYz := lYr*lMatrix.matrix[3,2]; for lX := 1 to lOutDimX do begin inc(lOutPos); lXreal := lXxRA^[lX]+lYx+lZx; lYreal := lXyRA^[lX]+lYy+lZy; lZreal := lXzRA^[lX]+lYz+lZz; lXo := trunc(lXreal); lYo := trunc(lYreal); lZo := trunc(lZreal); if (lXo > 0) and (lXo < lXDimIn) and (lYo > 0) and (lYo < lYDimIn) and (lZo > 0) and (lZo < lZDimIn) then begin lXreal := lXreal-lXo; lYreal := lYreal-lYo; lZreal := lZreal-lZo; lXrM1 := 1-lXreal; lYrM1 := 1-lYreal; lZrM1 := 1-lZreal; lMinY := ((lYo-1)*lXdimIn); lMinZ := ((lZo-1)*lInSliceSz); lMaxY := ((lYo)*lXdimIn); lMaxZ := ((lZo)*lInSliceSz); lOverlap := true; lBuffOut32^[lOutPos] := ( {all min} ( (lXrM1*lYrM1*lZrM1)*lBuffIn32^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*lBuffIn32^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*lBuffIn32^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*lBuffIn32^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*lBuffIn32^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*lBuffIn32^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*lBuffIn32^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*lBuffIn32^[lXo+1+lMaxY+lMaxZ]) ); end; //values in range end; //for X end; //for OutY end; //for OutZ //core 32 end FreeMem(lHdr.ImgBufferUnaligned); GetMem(lHdr.ImgBufferUnaligned ,(lOutVolItems*sizeof(Single)) + 16); lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned, 16);//ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); lHdr.ImgBufferItems := lOutVolItems; Move(lBuffOut32^,lHdr.ImgBuffer^,lOutVolItems*sizeof(Single));//source/dest FreeMem(lBuffOutUnaligned); end else if lHdr.ImgBufferBPP = 2 then begin lBuffIn16 := SmallIntP(lHdr.ImgBuffer); GetMem(lBuffOutUnaligned,(lOutVolItems*sizeof(smallint))+16); lBuffOut16 := align(lBuffOutUnaligned, 16); //SmallIntP($fffffff0 and (integer(lBuffOutUnaligned)+15)); for lX := 1 to lOutVolItems do lBuffOut16^[lX] := 0; //set all to zero //core 16 start for lZ := 1 to lOutDimZ do begin lZr := lZ -(lBGImg.ScrnOri[3]); lZx := lZr*lMatrix.matrix[1,3]+lMatrix.matrix[1,4]; lZy := lZr*lMatrix.matrix[2,3]+lMatrix.matrix[2,4]; lZz := lZr*lMatrix.matrix[3,3]+lMatrix.matrix[3,4]; for lY := 1 to lOutDimY do begin lYr := lY -(lBGImg.ScrnOri[2]); lYx := lYr*lMatrix.matrix[1,2]; lYy := lYr*lMatrix.matrix[2,2]; lYz := lYr*lMatrix.matrix[3,2]; for lX := 1 to lOutDimX do begin inc(lOutPos); lXreal := lXxRA^[lX]+lYx+lZx; lYreal := lXyRA^[lX]+lYy+lZy; lZreal := lXzRA^[lX]+lYz+lZz; lXo := trunc(lXreal); lYo := trunc(lYreal); lZo := trunc(lZreal); if (lXo > 0) and (lXo < lXDimIn) and (lYo > 0) and (lYo < lYDimIn) and (lZo > 0) and (lZo < lZDimIn) then begin lXreal := lXreal-lXo; lXrM1 := 1-lXreal; lYreal := lYreal-lYo; lYrM1 := 1-lYreal; lZreal := lZreal-lZo; lZrM1 := 1-lZreal; lMinY := ((lYo-1)*lXdimIn); lMaxY := lMinY+lXdimIn; lMinZ := ((lZo-1)*lInSliceSz); lMaxZ := lMinZ+lInSliceSz; lOverlap := true; lBuffOut16^[lOutPos] := round ( {all min} ( (lXrM1*lYrM1*lZrM1)*lBuffIn16^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*lBuffIn16^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*lBuffIn16^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*lBuffIn16^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*lBuffIn16^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*lBuffIn16^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*lBuffIn16^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*lBuffIn16^[lXo+1+lMaxY+lMaxZ]) ); (**) end; //values in range end; //for X end; //for OutY end; //for OutZ //core 16 end FreeMem(lHdr.ImgBufferUnaligned); GetMem(lHdr.ImgBufferUnaligned ,(lOutVolItems*sizeof(SmallInt)) + 16); lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned, 16); //ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); lHdr.ImgBufferItems := lOutVolItems; Move(lBuffOut16^,lHdr.ImgBuffer^,lOutVolItems*sizeof(SmallInt));//source/dest FreeMem(lBuffOutUnaligned); end else if lHdr.ImgBufferBPP = 1 then begin GetMem(lBuffOut,lOutVolItems); Fillchar(lBuffOut^,lOutVolItems,0); //set all to zero for lZ := 1 to lOutDimZ do begin lZr := lZ -(lBGImg.ScrnOri[3]); lZx := lZr*lMatrix.matrix[1,3]+lMatrix.matrix[1,4]; lZy := lZr*lMatrix.matrix[2,3]+lMatrix.matrix[2,4]; lZz := lZr*lMatrix.matrix[3,3]+lMatrix.matrix[3,4]; for lY := 1 to lOutDimY do begin lYr := lY -(lBGImg.ScrnOri[2]); lYx := lYr*lMatrix.matrix[1,2]; lYy := lYr*lMatrix.matrix[2,2]; lYz := lYr*lMatrix.matrix[3,2]; for lX := 1 to lOutDimX do begin inc(lOutPos); lXreal := lXxRA^[lX]+lYx+lZx; lYreal := lXyRA^[lX]+lYy+lZy; lZreal := lXzRA^[lX]+lYz+lZz; lXo := trunc(lXreal); lYo := trunc(lYreal); lZo := trunc(lZreal); if (lXo > 0) and (lXo < lXDimIn) and (lYo > 0) and (lYo < lYDimIn) and (lZo > 0) and (lZo < lZDimIn) then begin lXreal := lXreal-lXo; lYreal := lYreal-lYo; lZreal := lZreal-lZo; lXrM1 := 1-lXreal; lYrM1 := 1-lYreal; lZrM1 := 1-lZreal; lMinY := ((lYo-1)*lXdimIn); lMinZ := ((lZo-1)*lInSliceSz); lMaxY := ((lYo)*lXdimIn); lMaxZ := ((lZo)*lInSliceSz); lOverlap := true; lBuffOut^[lOutPos] := round ( {all min} ( (lXrM1*lYrM1*lZrM1)*lBuffIn^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*lBuffIn^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*lBuffIn^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*lBuffIn^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*lBuffIn^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*lBuffIn^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*lBuffIn^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*lBuffIn^[lXo+1+lMaxY+lMaxZ]) ); end; //values in range end; //for X end; //for OutY end; //for OutZ FreeMem(lHdr.ImgBufferUnaligned); GetMem(lHdr.ImgBufferUnaligned ,lOutVolItems + 16); lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned, 16); //ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); lHdr.ImgBufferItems := lOutVolItems; Move(lBuffOut^,lHdr.ImgBuffer^,lOutVolItems);//source/dest FreeMem(lBuffOut); end else //unsupported bits-per-pixel dataformat Showmessage('Unsupported BPP ='+inttostr(lHdr.ImgBufferBPP) ); end else begin //not trilinear - use nearest neighbor //start nearest neighbor if lHdr.ImgBufferBPP = 4 then begin lBuffIn32 := SingleP(lHdr.ImgBuffer); GetMem(lBuffOutUnaligned,(lOutVolItems*sizeof(single))+16); lBuffOut32 := align(lBuffOutUnaligned, 16);//SingleP($fffffff0 and (integer(lBuffOutUnaligned)+15)); for lX := 1 to lOutVolItems do lBuffOut32^[lX] := 0; //set all to zero //core 32 start for lZ := 1 to lOutDimZ do begin lZr := lZ -(lBGImg.ScrnOri[3]); lZx := lZr*lMatrix.matrix[1,3]+lMatrix.matrix[1,4]; lZy := lZr*lMatrix.matrix[2,3]+lMatrix.matrix[2,4]; lZz := lZr*lMatrix.matrix[3,3]+lMatrix.matrix[3,4]; for lY := 1 to lOutDimY do begin lYr := lY -(lBGImg.ScrnOri[2]); lYx := lYr*lMatrix.matrix[1,2]; lYy := lYr*lMatrix.matrix[2,2]; lYz := lYr*lMatrix.matrix[3,2]; for lX := 1 to lOutDimX do begin inc(lOutPos); lXo := round(lXxRA^[lX]+lYx+lZx); lYo := round(lXyRA^[lX]+lYy+lZy); lZo := round(lXzRA^[lX]+lYz+lZz); if (lXo > 0) and (lXo < lXDimIn) and (lYo > 0) and (lYo < lYDimIn) and (lZo > 0) and (lZo < lZDimIn) then begin lOverlap := true; lMinY := ((lYo-1)*lXdimIn); lMinZ := ((lZo-1)*lInSliceSz); lBuffOut32^[lOutPos] := lBuffIn32^[lXo+lMinY+lMinZ]; end; end; //for X end; //for OutY end; //for OutZ //core 32 end FreeMem(lHdr.ImgBufferUnaligned); GetMem(lHdr.ImgBufferUnaligned ,(lOutVolItems*sizeof(Single)) + 16); lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned, 16);//ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); lHdr.ImgBufferItems := lOutVolItems; Move(lBuffOut32^,lHdr.ImgBuffer^,lOutVolItems*sizeof(Single));//source/dest FreeMem(lBuffOutUnaligned); end else if lHdr.ImgBufferBPP = 2 then begin lBuffIn16 := SmallIntP(lHdr.ImgBuffer); GetMem(lBuffOutUnaligned,(lOutVolItems*sizeof(smallint))+16); lBuffOut16 := align(lBuffOutUnaligned, 16);//SmallIntP($fffffff0 and (integer(lBuffOutUnaligned)+15)); for lX := 1 to lOutVolItems do lBuffOut16^[lX] := 0; //set all to zero //core 16 start for lZ := 1 to lOutDimZ do begin lZr := lZ -(lBGImg.ScrnOri[3]); lZx := lZr*lMatrix.matrix[1,3]+lMatrix.matrix[1,4]; lZy := lZr*lMatrix.matrix[2,3]+lMatrix.matrix[2,4]; lZz := lZr*lMatrix.matrix[3,3]+lMatrix.matrix[3,4]; for lY := 1 to lOutDimY do begin lYr := lY -(lBGImg.ScrnOri[2]); lYx := lYr*lMatrix.matrix[1,2]; lYy := lYr*lMatrix.matrix[2,2]; lYz := lYr*lMatrix.matrix[3,2]; for lX := 1 to lOutDimX do begin inc(lOutPos); lXo := round(lXxRA^[lX]+lYx+lZx); lYo := round(lXyRA^[lX]+lYy+lZy); lZo := round(lXzRA^[lX]+lYz+lZz); if (lXo > 0) and (lXo < lXDimIn) and (lYo > 0) and (lYo < lYDimIn) and (lZo > 0) and (lZo < lZDimIn) then begin lOverlap := true; lMinY := ((lYo-1)*lXdimIn); lMinZ := ((lZo-1)*lInSliceSz); lBuffOut16^[lOutPos] := lBuffIn16^[lXo+lMinY+lMinZ]//lBuffIn16[lXo+lYo+lZo]; xxxx end; //values in range end; //for X end; //for OutY end; //for OutZ //core 16 end FreeMem(lHdr.ImgBufferUnaligned); GetMem(lHdr.ImgBufferUnaligned ,(lOutVolItems*sizeof(SmallInt)) + 16); lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned, 16);// ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); lHdr.ImgBufferItems := lOutVolItems; Move(lBuffOut16^,lHdr.ImgBuffer^,lOutVolItems*sizeof(SmallInt));//source/dest FreeMem(lBuffOutUnaligned); end else if lHdr.ImgBufferBPP = 1 then begin GetMem(lBuffOut,lOutVolItems); Fillchar(lBuffOut^,lOutVolItems,0); //set all to zero for lZ := 1 to lOutDimZ do begin lZr := lZ -(lBGImg.ScrnOri[3]); lZx := lZr*lMatrix.matrix[1,3]+lMatrix.matrix[1,4]; lZy := lZr*lMatrix.matrix[2,3]+lMatrix.matrix[2,4]; lZz := lZr*lMatrix.matrix[3,3]+lMatrix.matrix[3,4]; for lY := 1 to lOutDimY do begin lYr := lY -(lBGImg.ScrnOri[2]); lYx := lYr*lMatrix.matrix[1,2]; lYy := lYr*lMatrix.matrix[2,2]; lYz := lYr*lMatrix.matrix[3,2]; for lX := 1 to lOutDimX do begin inc(lOutPos); lXo := round(lXxRA^[lX]+lYx+lZx); lYo := round(lXyRA^[lX]+lYy+lZy); lZo := round(lXzRA^[lX]+lYz+lZz); if (lXo > 0) and (lXo < lXDimIn) and (lYo > 0) and (lYo < lYDimIn) and (lZo > 0) and (lZo < lZDimIn) then begin lMinY := ((lYo-1)*lXdimIn); lMinZ := ((lZo-1)*lInSliceSz); lOverlap := true; lBuffOut^[lOutPos] := lBuffIn^[lXo+lMinY+lMinZ]; end; //values in range end; //for X end; //for OutY end; //for OutZ FreeMem(lHdr.ImgBufferUnaligned); GetMem(lHdr.ImgBufferUnaligned ,lOutVolItems + 16); lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned, 16);//ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); lHdr.ImgBufferItems := lOutVolItems; Move(lBuffOut^,lHdr.ImgBuffer^,lOutVolItems);//source/dest FreeMem(lBuffOut); end else //unsupported bits-per-pixel dataformat Showmessage('Unsupported BPP ='+inttostr(lHdr.ImgBufferBPP) ); //end nearest neighbor end; //end if trilinear else nearest neighbor if not lOverlap then showmessage('No overlap between image and background bounding box - check the transfomation matrices.'); FreeMem(lXxp); FreeMem(lXyp); FreeMem(lXzp); end; //ResliceScrnImg procedure InvertScrnBuffer(var lHdr: TMRIcroHdr); var lPos: integer; begin if lHdr.ScrnBufferItems < 1 then exit; lHdr.Zero8Bit := lHdr.Zero8Bit+(255*lHdr.Slope8bit); lHdr.Slope8bit := -lHdr.Slope8bit; for lPos := 1 to lHdr.ScrnBufferItems do lHdr.ScrnBuffer^[lPos] := 255- lHdr.ScrnBuffer^[lPos]; {lMin := 255; for lPos := 1 to lHdr.ScrnBufferItems do if lMin > lHdr.ScrnBuffer[lPos] then lMin := lHdr.ScrnBuffer[lPos]; } //showmessage('inv'+inttostr(lMin)); end; const kMin8bit = 1; procedure RescaleImgIntensity(var lBackgroundImg: TBGImg; var lHdr: TMRIcroHdr; lLayer: integer ); var lImgSamples: integer; //lFiltMin8bit,lFiltMax8bit: integer; //lMin,lMax: single; begin lImgSamples := round(ComputeImageDataBytes8bpp(lHdr)); if (lHdr.ImgBufferItems = 0) and (lHdr.ScrnBufferItems > 0) then begin //image buffer loaded - not VOIs have screen but not img buffers if lBackgroundImg.VOImirrored then MirrorScrnBuffer(lBackgroundImg,lHdr); lBackgroundImg.VOImirrored := false; exit; end; if lHdr.ImgBufferItems<>lHdr.ScrnBufferItems then begin if lHdr.ScrnBufferItems > 0 then freemem(lHdr.ScrnBuffer); lHdr.ScrnBufferItems := lHdr.ImgBufferItems; GetMem(lHdr.ScrnBuffer ,lHdr.ScrnBufferItems); end; if lHdr.ImgBufferItems = 0 then exit; //2/2010 if lHdr.UsesCustomPalette then begin lHdr.WindowScaledMin := kMin8bit; lHdr.WindowScaledMax := 255; end; if lImgSamples < 1 then exit; if (lHdr.ImgBufferBPP = 4) then RescaleImgIntensity32(lHdr) else if (lHdr.ImgBufferBPP = 2) then RescaleImgIntensity16(LHdr) else if lHdr.ImgBufferBPP = 1 then RescaleImgIntensity8(lHdr) else begin showmessage(inttostr(lHdr.ImgBufferItems)+'Unknown Image Buffer Bytes Per Pixel: '+inttostr(lHdr.ImgBufferBPP)+' : '+lHdr.HdrFileName); exit; end; //if not lHdr.SameDimsAsBG then OrthogonalResliceScrnImg (lBackgroundImg, lHdr); //ReturnRawMinMax (lHdr, lMin,lMax,lFiltMin8bit,lFiltMax8bit); if (lLayer <> kBGOverlayNum) and ((lHdr.WindowScaledMin <= 0) and (lHdr.WindowScaledMax <= 0)) then InvertScrnBuffer(lHdr); FilterScrnImg (lHdr);//,lFiltMin8bit,lFiltMax8bit); if lBackgroundImg.Mirror then MirrorScrnBuffer(lBackgroundImg,lHdr); end; //RescaleImgIntensity32 function PtoLog10 ( lIn: double): double; //in= pvalue <=1 begin //result := -log(abs(lIn),10) result := -log((lIn),10) end; function Log10toP (lIn: double): double; begin //result := log((lIn),10) result := 1/power(10,lIn); //requires Math unit end; procedure ComputeFDR (var lInHdr: TMRIcroHdr; var lP05,lP01,lFWE05,lFWE01,lFDR05,lFDR01: single); //(lImg2Load.NIFTIhdr.intent_code,round(lImg2Load.NIFTIhdr.intent_p1),lImg2Load.ImgBufferItems,lImg2Load.ImgBufferBPP,lImg2Load.ImgBuffer,lP05,lP01,lFWE05,lFWE01,lFDR05,lFDR01); //procedure ComputeFDR(lStatIntent,lDF,lImgSamples,lImgBPP: integer; l32Buf:SingleP; var lP05,lP01,lFWE05,lFWE01,lFDR05,lFDR01: single); //StatIntents in kNIFTI_INTENT_CHISQ, kNIFTI_INTENT_ZSCORE,kNIFTI_INTENT_TTEST //Note DF meaningless for ZScore label 555; var lPs: SingleP; //array of tests lStr: string; lStatIntent,lImgSamples,lnTests,lInc,lDF: integer; lPrevP,lP,lFDR05p, lFDR01p,lnegFDR05p, lnegFDR01p,lnegFDR05, lnegFDR01 : double; l32Buf : SingleP; begin lStatIntent := lInHdr.NIFTIhdr.intent_code; lDF := round(lInHdr.NIFTIhdr.intent_p1); if ((lStatIntent = kNIFTI_INTENT_CHISQ) or (lStatIntent = kNIFTI_INTENT_TTEST)) and (lDF <= 1) then //May07 lDF := ReadIntForm.GetInt('Please specify degrees of freedom for '+extractfilename(lInHdr.HdrFileName),1,16,32000); lImgSamples := lInHdr.ImgBufferItems; if (lImgSamples < 1) then exit; ImgForm.StatusLabel.Caption := 'Computing FDR rates...'; ImgForm.refresh; //next: count number of tests [we could just rely on value lChiSamples to us, but perhaps value in intention is not correct lnTests := 0; l32Buf := SingleP(lInHdr.ImgBuffer ); for lInc := 1 to lImgSamples do if l32Buf^[lInc] <> 0 then inc(lnTests); if lnTests < 1 then exit; GetMem(lPs,lnTests*sizeof(single)); //for lInc := 1 to lnTests do lPs[lInc] := 1; //next - place Pvalues in array, as computing P is slow, we remember last Pvalue lPrevP := 0; lnTests := 0; lP := 1; //never used //lStartTime := GetTickCount; for lInc := 1 to lImgSamples do if l32Buf^[lInc] <> 0 then begin inc(lnTests); if l32Buf^[lInc] <> lPrevP then case lStatIntent of kNIFTI_INTENT_TTEST: lP := pTdistr(lDF,l32Buf^[lInc]);//slow!! 110ms kNIFTI_INTENT_ZSCORE: lP := pNormal(l32Buf^[lInc]);//slow!! 94ms kNIFTI_INTENT_PVAL: lP := l32Buf^[lInc]; NIFTI_INTENT_LOG10PVAL: lP := Log10toP(l32Buf^[lInc]); else {kNIFTI_INTENT_CHISQ:}begin if l32Buf^[lInc] < 0 then //MRIcro saves negative Chi lP := 0.6 else lP := pChi2(lDF,l32Buf^[lInc]);//slow! 47ms end; end; lPs^[lnTests] := lP; lPrevP := l32Buf^[lInc]; end; //Chi <> 0 //ImgForm.caption :=('update(ms): '+inttostr(GetTickCount-lStartTime)); //EstimateFDR(lnTests, lPs, lFDR05p, lFDR01p); EstimateFDR2(lnTests, lPs, lFDR05p, lFDR01p,lnegFDR05p, lnegFDR01p); //lStartTime := GetTickCount; //next histogram! (*for lInc := 1 to lnTests do lPs^[lInc] := pNormalInvQuickApprox(lPs^[lInc]); //slow!!!!!!!!! >5100ms lHdr.ImgBufferBPP := 4; lHdr.ImgBufferItems :=lnTests; lHdr.GlMaxUnscaledS :=lPs^[1]; lHdr.GlMinUnscaledS := lPs^[lnTests]; lHdr.ImgBuffer :=bytep(lPs); lHdr.NIFTIhdr.scl_slope := 1; lHdr.NIFTIhdr.scl_inter := 0; lInc := 0;//B&W LoadMonochromeLUT(lInc,gBGImg,lHdr); DrawHistogram(lHdr,HistogramForm.HistoImage); HistogramForm.Caption := 'Z Histogram'+realtostr(lHdr.GlMinUnscaledS,6)+'..'+realtostr(lHdr.GlMaxUnscaledS,6); HistogramForm.show; ImgForm.PGImageCor.refresh; //ImgForm.caption :=('update(ms): '+inttostr(GetTickCount-lStartTime)); //showmessage('Z Histogram'+realtostr(lHdr.GlMinUnscaledS,6)+'..'+realtostr(lHdr.GlMaxUnscaledS,6)); //end histogram *) 555: FreeMem(lPs); case lStatIntent of kNIFTI_INTENT_CHISQ:begin lP05:= pChi2Inv(lDF,0.05); lP01 := pChi2Inv(lDF,0.01); lFWE05 := pChi2Inv(lDF,0.05/lnTests); lFWE01 := pChi2Inv(lDF,0.01/lnTests); lFDR05 := pChi2Inv(lDF,lFDR05p); lFDR01 := pChi2Inv(lDF,lFDR01p); lnegFDR05 := pChi2Inv(lDF,lnegFDR05p); lnegFDR01 := pChi2Inv(lDF,lnegFDR01p); lStr := 'X DF='+inttostr(lDF); end; kNIFTI_INTENT_ZSCORE: begin lP05:= pNormalInv(0.05); lP01 := pNormalInv(0.01); lFWE05 := pNormalInv(0.05/lnTests); lFWE01 := pNormalInv(0.01/lnTests); lFDR05 := pNormalInv(lFDR05p); lFDR01 := pNormalInv(lFDR01p); lnegFDR05 := pNormalInv(lnegFDR05p); lnegFDR01 := pNormalInv(lnegFDR01p); lStr := 'Z'; end; kNIFTI_INTENT_TTEST: begin lP05:= pTdistrInv(lDF,0.05); lP01 := pTdistrInv(lDF,0.01); lFWE05 := pTdistrInv(lDF,0.05/lnTests); lFWE01 := pTdistrInv(lDF,0.01/lnTests); lFDR05 := pTdistrInv(lDF,lFDR05p); lFDR01 := pTdistrInv(lDF,lFDR01p); lnegFDR05 := pTdistrInv(lDF,lnegFDR05p); lnegFDR01 := pTdistrInv(lDF,lnegFDR01p); lStr := 't DF='+inttostr(lDF); end; kNIFTI_INTENT_PVAL:begin lP05:= (0.05); lP01 := (0.01); lFWE05 := (0.05/lnTests); lFWE01 := (0.01/lnTests); lFDR05 := (lFDR05p); lFDR01 := (lFDR01p); lnegFDR05 := (lnegFDR05p); lnegFDR01 := (lnegFDR01p); lStr := 'p'; end; NIFTI_INTENT_LOG10PVAL: begin lP05:= PtoLog10(0.05); lP01 := PtoLog10(0.01); lFWE05 := PtoLog10(0.05/lnTests); lFWE01 := PtoLog10(0.01/lnTests); lFDR05 := PtoLog10(lFDR05p); lFDR01 := PtoLog10(lFDR01p); lnegFDR05 := PtoLog10(lnegFDR05p); lnegFDR01 := PtoLog10(lnegFDR01p); lStr := 'log10p'; end; else Showmessage('Error: unknown stats intent'); end; //case if (lStatIntent = kNIFTI_INTENT_PVAL) then begin if (lFDR05 < lFWE05) then lFDR05 := lFWE05; end else if (lFDR05 > lFWE05) then lFDR05 := lFWE05; if (lStatIntent = kNIFTI_INTENT_PVAL) then begin if (lFDR01 < lFWE01) then lFDR01 := lFWE01; end else if (lFDR01 > lFWE01) then lFDR01 := lFWE01; if (lStatIntent = kNIFTI_INTENT_PVAL) then begin if (lnegFDR05 > -lFWE05) then lnegFDR05 := -lFWE05; if (lnegFDR01 > -lFWE01) then lnegFDR01 := -lFWE01; end else begin if (lnegFDR05 < -lFWE05) then lnegFDR05 := -lFWE05; if (lnegFDR01 < -lFWE01) then lnegFDR01 := -lFWE01; end; ImgForm.StatusLabel.Caption := lStr+' Tests='+inttostr(lnTests)+' p05='+realtostr(lP05,4)+ ' p01='+realtostr(lP01,4)+' fwe05='+realtostr(lFWE05,4)+ ' fwe01='+realtostr(lFWE01,4) +' fdr05='+realtostr(lFDR05,4)+' fdr01='+realtostr(lFDR01,4) +' -fdr05='+realtostr(lnegFDR05,4)+' -fdr01='+realtostr(lnegFDR01,4) ; end; function MakeSameOrtho(var lBGImg: TBGImg; var lHdr: TMRIcroHdr):boolean; //this function disables reslicing - images will be shown unrotated and unscaled... var lRow: integer; begin result := false; for lRow := 1 to 3 do begin //lHdr.NIFTIhdr.pixdim[lRow] := 1; //Apr07 if lHdr.NIFTIhdr.dim[lRow] <>lBGImg.ScrnDim[lRow] then exit; end; lHdr.Mat:= Matrix3D ( lBGImg.Scrnmm[1],0,0,-lBGImg.Scrnmm[1]*(lBGImg.ScrnOri[1]-1), 0,lBGImg.Scrnmm[2],0,-lBGImg.Scrnmm[2]*(lBGImg.ScrnOri[2]-1), 0,0,lBGImg.Scrnmm[3],-lBGImg.Scrnmm[3]*(lBGImg.ScrnOri[3]-1), 0,0,0,1); result := true; end; procedure FindAlignment (var lBGImg: TBGImg; var lHdr: TMRIcroHdr); //identifies spatial position of low X,Y,Z voxels : A/P/L/R/S/I var lDim: integer; lXMid,lYMid,lZMid,laX,laY,laZ,lX,lY,lZ,lX2,lY2,lZ2: single; lMatrix: TMatrix; begin lBGImg.KnownAlignment := false; if not IsNifTiMagic (lHdr.NIFTIHdr) then exit; //Analyze format: spatial coordinates are amibguous if (lHdr.NIFTIhdr.sform_code <= 0) and (lHdr.NIFTIhdr.qform_code <= 0) then exit; //NIfTI format with unspecified coordinates lBGImg.KnownAlignment := true; if (lBGImg.Resliced) and (lHdr.NIFTIhdr.sform_code > 0) then begin lBGImg.MinChar[1] := 'L'; lBGImg.MaxChar[1] := 'R'; lBGImg.MinChar[2] := 'P'; lBGImg.MaxChar[2] := 'A'; lBGImg.MinChar[3] := 'I'; lBGImg.MaxChar[3] := 'S'; exit; end; //there are two approaches to solve this - a more elegant solution is to find the nearest orthogonal aligment //the method below is simpler, but might give unusual results if the field of view in one dimension is much larger than another lMatrix := lHdr.Mat; lXMid := lHdr.NIFTIhdr.Dim[1] div 2; lYMid := lHdr.NIFTIhdr.Dim[2] div 2; lZMid := lHdr.NIFTIhdr.Dim[3] div 2; for lDim := 1 to 3 do begin if lDim = 1 then begin FindMatrixPt(0,lYMid,lZMid,lX,lY,lZ,lMatrix); FindMatrixPt(lXMid*2,lYMid,lZMid,lX2,lY2,lZ2,lMatrix); end else if lDim = 2 then begin FindMatrixPt(lXMid,0,lZMid,lX,lY,lZ,lMatrix); FindMatrixPt(lXMid,lYMid*2,lZMid,lX2,lY2,lZ2,lMatrix); end else begin //lDim=3 FindMatrixPt(lXMid,lYMid,0,lX,lY,lZ,lMatrix); FindMatrixPt(lXMid,lYMid,lZMid*2,lX2,lY2,lZ2,lMatrix); end; lX := lX-lX2; laX := abs(lX); lY := lY-lY2; laY := abs(lY); lZ := lZ-lZ2; laZ := abs(lZ); if (laX > laY) and (laX > laZ) then begin if lX < 0 then begin lBGImg.MinChar[lDim] := 'L'; lBGImg.MaxChar[lDim] := 'R'; end else begin lBGImg.MinChar[lDim] := 'R'; lBGImg.MaxChar[lDim] := 'L'; end; end else if (laY > laZ) then begin if lY < 0 then begin lBGImg.MinChar[lDIm] := 'P'; lBGImg.MaxChar[lDim] := 'A'; end else begin lBGImg.MinChar[lDim] := 'A'; lBGImg.MaxChar[lDim] := 'P'; end; end else if (laZ > laX) then begin if lZ < 0 then begin lBGImg.MinChar[lDim] := 'I'; lBGImg.MaxChar[lDim] := 'S'; end else begin lBGImg.MinChar[lDim] := 'S'; lBGImg.MaxChar[lDim] := 'I'; end; end else begin //all dims are equal lBGImg.MinChar[lDim] := '?'; lBGImg.MaxChar[lDim] := '?'; end; end;//for each dim end; //proc FindAlignment function DICOMMirrorImgBuffer(var lHdr: TMRIcroHdr ): boolean; var lXPos,lYPos,lZPos,lX,lY,lZ,lHlfY,lLineOffset,lLineOffsetIn: integer; lTemp32: single; lTemp16: SmallInt; lTemp: byte; l32: SingleP; l16: SmallIntP; begin result := false; lX := lHdr.NIFTIhdr.Dim[1]; lY := lHdr.NIFTIhdr.Dim[2]; lZ := lHdr.NIFTIhdr.Dim[3]; if lHdr.NIFTIhdr.Dim[4] > 1 then begin Showmessage('Can not mirror 4D data : '+lHdr.HdrFileName); exit; end; if (lHdr.ImgBufferItems < (lX*lY*lZ)) or (lX < 2) then begin Showmessage('Unsupported filetype : '+lHdr.HdrFileName); exit; end; lHlfY := lY div 2; lLineOffset := 0; //for each datatype... if lHdr.ImgBufferBPP = 4 then begin l32 := SingleP(lHdr.ImgBuffer); for lZPos := 1 to lZ do begin lLineOffsetIn := lLineOffset + ((lY-1)*lX ); for lYPos := 1 to lHlfY do begin for lXPos := 1 to lX do begin lTemp32 := l32^[lXPos+lLineOffsetIn]; l32^[lXPos+lLineOffsetIn] := l32^[lXPos+lLineOffset]; l32^[lXPos+lLineOffset] := lTemp32; end; //for X lLineOffset := lLineOffset + lX; lLineOffsetIn := lLineOffsetIn - lX; end; //for Y end; //for Z end else if lHdr.ImgBufferBPP = 2 then begin l16 := SmallIntP(lHdr.ImgBuffer); for lZPos := 1 to lZ do begin lLineOffsetIn := lLineOffset + ((lY-1)*lX ); for lYPos := 1 to lHlfY do begin for lXPos := 1 to lX do begin lTemp16 := l16^[lXPos+lLineOffsetIn]; l16^[lXPos+lLineOffsetIn] := l16^[lXPos+lLineOffset]; l16^[lXPos+lLineOffset] := lTemp16; end; //for X lLineOffset := lLineOffset + lX; lLineOffsetIn := lLineOffsetIn - lX; end; //for Y end; //for Z end else if lHdr.ImgBufferBPP = 1 then begin for lZPos := 1 to lZ do begin lLineOffsetIn := lLineOffset + ((lY-1)*lX ); for lYPos := 1 to lHlfY do begin for lXPos := 1 to lX do begin lTemp := lHdr.ImgBuffer^[lXPos+lLineOffsetIn]; lHdr.ImgBuffer^[lXPos+lLineOffsetIn] := lHdr.ImgBuffer^[lXPos+lLineOffset]; lHdr.ImgBuffer^[lXPos+lLineOffset] := lTemp; end; //for X lLineOffset := lLineOffset + lX; lLineOffsetIn := lLineOffsetIn - lX; end; //for Y end; //for Z end else //unsupported bits-per-pixel dataformat Showmessage('Unsupported BPP ='+inttostr(lHdr.ImgBufferBPP) ); result := true; end; //proc DICOMMirrorImgBuffer function ParseRGB (var lHdr: TMRIcroHdr): boolean;//RGB //red green blue saved as contiguous planes... var lInSlice,lOutSlice,lZ,lSliceSz,lSliceVox: integer; lP: bytep; begin result := false; lSliceSz := lHdr.NIFTIhdr.Dim[1]*lHdr.NIFTIhdr.Dim[2]; lZ := lSliceSz * 3 * lHdr.NIFTIhdr.Dim[3]; if lZ < 1 then exit; getmem( lP,lZ); Move(lHdr.ImgBuffer^,lP^,lZ); freemem(lHdr.ImgBufferUnaligned); lZ := lSliceSz * lHdr.NIFTIhdr.Dim[3]; GetMem(lHdr.ImgBufferUnaligned ,lZ+16); lHdr.ImgBuffer := ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); if (lHdr.Index mod 3) = 1 then //green lInSlice := lSliceSz else if (lHdr.Index mod 3) = 2 then//blue lInSlice := lSliceSz+lSliceSz else lInSlice := 0; lOutSlice := 0; for lZ := 1 to lHdr.NIFTIhdr.Dim[3] do begin for lSliceVox := 1 to lSliceSz do begin lHdr.ImgBuffer^[lSliceVox+lOutSlice] := lP^[lSliceVox+lInSlice]; end; inc(lOutSlice,lSliceSz); inc(lInSlice,lSliceSz+lSliceSz+lSliceSz); end; freemem(lP); for lZ := 0 to 255 do begin lHdr.LUT[lZ].rgbRed := 0; lHdr.LUT[lZ].rgbGreen := 0; lHdr.LUT[lZ].rgbBlue := 0; lHdr.LUT[lZ].rgbReserved := kLUTalpha; end; if (lHdr.Index mod 3) = 1 then begin//green for lZ := 0 to 255 do lHdr.LUT[lZ].rgbGreen := lZ; end else if (lHdr.Index mod 3) = 2 then begin //blue for lZ := 0 to 255 do lHdr.LUT[lZ].rgbBlue := lZ; end else begin for lZ := 0 to 255 do lHdr.LUT[lZ].rgbRed := lZ; end; result := true; end; (*function ParseRGB (var lHdr: TMRIcroHdr): boolean;//RGB //red green blue saved as contiguous planes... var lInSlice,lOutSlice,lZ,lSliceSz,lSliceVox: integer; lP: bytep; begin result := false; lSliceSz := lHdr.NIFTIhdr.Dim[1]*lHdr.NIFTIhdr.Dim[2]; lZ := lSliceSz * 3 * lHdr.NIFTIhdr.Dim[3]; if lZ < 1 then exit; getmem( lP,lZ); Move(lHdr.ImgBuffer^,lP^,lZ); freemem(lHdr.ImgBufferUnaligned); lZ := lSliceSz * lHdr.NIFTIhdr.Dim[3]; GetMem(lHdr.ImgBufferUnaligned ,lZ+16); {$IFDEF FPC} lHdr.ImgBuffer := align(lHdr.ImgBufferUnaligned,16); {$ELSE} lHdr.ImgBuffer := ByteP($fffffff0 and (integer(lHdr.ImgBufferUnaligned)+15)); {$ENDIF} if (lHdr.Index mod 3) = 1 then //green lInSlice := lSliceSz else if (lHdr.Index mod 3) = 2 then//blue lInSlice := lSliceSz+lSliceSz else lInSlice := 0; lOutSlice := 0; for lZ := 1 to lHdr.NIFTIhdr.Dim[3] do begin for lSliceVox := 1 to lSliceSz do begin lHdr.ImgBuffer^[lSliceVox+lOutSlice] := lP^[lSliceVox+lInSlice]; end; inc(lOutSlice,lSliceSz); inc(lInSlice,lSliceSz+lSliceSz+lSliceSz); end; freemem(lP); if (lHdr.Index mod 3) = 1 then //green lZ := 3 else if (lHdr.Index mod 3) = 2 then //blue lZ := 2 else //red lZ := 1; LoadMonochromeLUT (lZ, gBGImg, lHdr) ; result := true; end; *) procedure NonReslicedGB (var lBackgroundImg: TBGImg; var lImg2Load: TMRIcroHdr);//vcx begin if lImg2Load.NIfTItransform then lBackgroundImg.InvMat := Hdr2InvMat (lImg2Load.NIftiHdr,lImg2Load.NIfTItransform ); FindMatrixBounds(lBackgroundImg,lImg2Load,false); FindAlignment(lBackgroundImg,lImg2Load); MakeSameOrtho(lBackgroundImg,lImg2Load); end; procedure ReorientToNearestOrtho (var lBackgroundImg: TBGImg; var lImg2Load: TMRIcroHdr; lLoadBackground: boolean); //only apply this to the background image - other routines will reorient overlays begin lBackgroundImg.ReorientHdr := lImg2Load.NIFTIhdr;//vcx if not OrthoReorientCore(lImg2Load,false) then exit;//no change if not lLoadBackground then exit; //no change in bounding box lBackgroundImg.UseReorientHdr := true; NonReslicedGB(lBackgroundImg,lImg2Load); end; function OpenImg(var lBackgroundImg: TBGImg; var lImg2Load: TMRIcroHdr; lLoadBackground,lVOILoadAsBinary,lNoScaling8bit,lResliceIn,l4D: boolean): boolean; //lReslice: use orientation matrix to transform image -> do not use if l4D = true //l4D: load all slices of a 4D volume label 456; var lReslice,lSwap,lGzipped: boolean; lWordX: word; lP05,lP01,lFWE05,lFWE01,lFDR05,lFDR01:single; lMultiImgSzOff,lMultiImgSz,lOffset, lVol,lnVol,lFileSz,lDataType,lInc,lFSz,lImgSamples,lMinI,lMaxI,lRow: Integer; lP: Bytep; lFName,lExt,lParseName: String; F: file; l16Buf : SmallIntP; l32Buf,l32TempBuf : SingleP; l64Buf : DoubleP; begin lReslice := lResliceIn; if lLoadBackground then ImgForm.CloseImagesClick(nil); result := false; FreeImgMemory(lImg2Load); if not lImg2Load.DiskDataNativeEndian then lSwap := true else lSwap := false; if lLoadBackground then begin lBackgroundImg.UseReorientHdr := false;//vcx if(lImg2Load.NIFTIhdr.Dim[3] = 1) then lReslice := false; lBackgroundImg.Resliced := lReslice; if not lReslice then NonReslicedGB(lBackgroundImg,lImg2Load); FindMatrixBounds(lBackgroundImg,lImg2Load,lReslice); if (gBGImg.ScrnDim[1] < 2) or (gBGImg.ScrnDim[2] < 2) or (gBGImg.ScrnDim[3] < 1) then begin Showmessage('Error: this does not appear to be a valid 2D or 3D image.'); exit; end; if (gBGImg.ScrnDim[3] = 1) then begin lBackgroundImg.Resliced := false; //showmessage('x'); end; FindAlignment(lBackgroundImg,lImg2Load); end; if (not IsNifTiMagic(lImg2Load.niftiHdr)) or (lImg2Load.NIFTIhdr.sform_code < 1) or (lImg2Load.NIFTIhdr.sform_code > 10) then lBackgroundImg.KnownAlignment := false; if not lReslice then begin if lLoadBackground then begin //MakeSameOrtho(lBackgroundImg,lImg2Load); FindMatrixBounds(lBackgroundImg,lImg2Load,false); FindAlignment(lBackgroundImg,lImg2Load); MakeSameOrtho(lBackgroundImg,lImg2Load); end; end; //no reslice... lDataType := lImg2Load.NIFTIhdr.datatype; lFName := lImg2Load.ImgFileName; lGZipped := false; lMultiImgSz := ComputeImageDataBytes(lImg2Load); lOffset := round(lImg2Load.NIFTIhdr.vox_offset); lMultiImgSzOff := lMultiImgSz + abs(lOffset); if lImg2Load.NIFTIhdr.dim[4] < 1 then //June2009 - prevent error if 3D image sets field to zero instead of one lImg2Load.NIFTIhdr.dim[4] := 1; if lImg2Load.NIFTIhdr.dim[5] < 1 then //June2009 - prevent error if DTI image sets field to zero instead of one lImg2Load.NIFTIhdr.dim[5] := 1; lnVol := lImg2Load.NIFTIhdr.dim[4]*lImg2Load.NIFTIhdr.dim[5];//June2009 - for DTI data where direction is 5th dimension if lMultiImgSz < 1 then exit; lFSz := FSize(lFName); if (lFSz = 0) then Showmessage('Unable to find the image file '+lFName); lExt := UpCaseExt(lFName); if (lExt = '.GZ') or (lExt = '.VOI') or(lExt = '.NII.GZ') then lGzipped := true; lVol := 1; if lnVol > 1 then begin if lOffset < 0 then lFileSz := lMultiImgSzOff * {gAHdr.dim[4]}lnVol else lFileSz := ({gAHdr.dim[4]} lnVol * lMultiImgSz) + lOffset; lVol := 1; //alpha if {not l4D} lBackgroundImg.Prompt4DVolume then begin lVol := ReadIntForm.GetInt('Multi-volume file, please select volume to view.',1,1,lnVol); application.processmessages; end; end else lFileSz := lMultiImgSzOff; if ((lFileSz) > lFSz) and (not lgZipped) then begin ShowMessage('Error: This image file is smaller than described in header.'+ ' Expected: '+inttostr(lFileSz)+' Selected:'+inttostr(lFSz)+ ' '+lFname); exit; end; {$I-} AssignFile(F, lFName); FileMode := 0; { Set file access to read only } Reset(F, 1); if (lGzipped) then begin if lOffset < 0 then lOffset := abs(lOffset) + (lMultiImgSzOff *(lVol-1)) else lOffset := lOffset + (lMultiImgSz *(lVol-1)); end else if lOffset < 0 then Seek (F,abs(lOffset) + (lMultiImgSzOff *(lVol-1)) ) else Seek (F,lOffset + (lMultiImgSz *(lVol-1)) ); case lDataType of kDT_SIGNED_SHORT,kDT_UINT16: lImg2Load.ImgBufferBPP := 2; kDT_SIGNED_INT,kDT_FLOAT: lImg2Load.ImgBufferBPP := 4; kDT_DOUBLE: lImg2Load.ImgBufferBPP := 8; kDT_UNSIGNED_CHAR : lImg2Load.ImgBufferBPP := 1; kDT_RGB: lImg2Load.ImgBufferBPP := 1;//rgb else begin showmessage('Unable to read this image format '+inttostr(lDataType)); goto 456; end; end; //Next get memory lImgSamples := round(ComputeImageDataBytes8bpp(lImg2Load)); lImg2Load.ImgBufferItems := lImgSamples; lMultiImgSz := (lImgSamples * lImg2Load.ImgBufferBPP); if lDataType = kDT_RGB then lMultiImgSz := lMultiImgSz * 3;//RGB if l4D then begin lMultiImgSz := lMultiImgSz * lnVol; lImgSamples := lImgSamples * lnVol; //Apr07 end; if lMultiImgSz > freeRam then begin Showmessage('Unable to load image: not enough RAM.'); goto 456; //exit; end; try GetMem(lImg2Load.ImgBufferUnaligned ,lMultiImgSz+16); except showmessage('Load Image Error: System memory exhausted.'); freemem(lImg2Load.ImgBufferUnaligned); //do goto 456 exit; end; lImg2Load.ImgBuffer := align(lImg2Load.ImgBufferUnaligned, 16); //Next Load Image if lGzipped then begin lP := ByteP(lImg2Load.ImgBuffer); UnGZip(lFName,{gMultiBuf}lP,lOffset,lMultiImgSz); end else BlockRead(F,lImg2Load.ImgBuffer^,lMultiImgSz); if IOResult <> 0 then ShowMessage('Open image file error: '+inttostr(IOResult)); //Next: prepare image : byte swap, check for special.. case lDataType of kDT_RGB: ParseRGB(lImg2Load);//RGB kDT_SIGNED_SHORT,kDT_UINT16: begin //16-bit int l16Buf := SmallIntP(lImg2Load.ImgBuffer ); if lSwap then for lInc := 1 to lImgSamples do begin l16Buf^[lInc] := Swap2(l16Buf^[lInc]); end; if (kDT_UINT16=lDataType ) then begin //avoid wrap around if read as signed value for lInc := 1 to lImgSamples do begin lWordX := word(l16Buf^[lInc]); l16Buf^[lInc] := lWordX shr 1; end; //for end; //if kDT_UINT16 end; //16-bit kDT_SIGNED_INT: begin l32Buf := SingleP(lImg2Load.ImgBuffer ); if lSwap then //unswap and convert integer to float for lInc := 1 to lImgSamples do l32Buf^[lInc] := (Swap4r4i(l32Buf^[lInc])) else //convert integer to float for lInc := 1 to lImgSamples do l32Buf^[lInc] := Conv4r4i(l32Buf^[lInc]); end; //32-bit int kDT_FLOAT: begin l32Buf := SingleP(lImg2Load.ImgBuffer ); if lSwap then for lInc := 1 to lImgSamples do begin pswap4r(l32Buf^[lInc]) //faster as procedure than function see www.optimalcode.com end; for lInc := 1 to lImgSamples do if specialsingle(l32Buf^[lInc]) then l32Buf^[lInc] := 0.0; //thresh= for lInc := 1 to lImgSamples do if l32Buf[lInc] < 2.300611 then l32Buf[lInc] := 0.0; //invert= for lInc := 1 to lImgSamples do l32Buf[lInc] := -l32Buf[lInc]; end; //32-bit float kDT_DOUBLE: begin l64Buf := DoubleP(lImg2Load.ImgBuffer ); lImg2Load.ImgBufferBPP := 4; //we will save as 32-bit lMultiImgSz := (lImgSamples * lImg2Load.ImgBufferBPP); if l4D then begin lMultiImgSz := lMultiImgSz * lnVol; lImgSamples := lImgSamples * lnVol; //Apr07 end; try GetMem(l32TempBuf ,lMultiImgSz+16); except showmessage('64-bit Image Error: System memory exhausted.'); freemem(l32TempBuf); freemem(lImg2Load.ImgBufferUnaligned); exit; end; if lSwap then begin for lInc := 1 to lImgSamples do begin try l32TempBuf^[lInc] := Swap64r(l64Buf^[lInc]) except l32TempBuf^[lInc] := 0; end; //except end; //for end else begin for lInc := 1 to lImgSamples do begin try l32TempBuf^[lInc] := l64Buf^[lInc] except l32TempBuf^[lInc] := 0; end; //except end; //for end; //not swap //now copy from temp buffer to longer-term buffer freemem(lImg2Load.ImgBufferUnaligned); try GetMem(lImg2Load.ImgBufferUnaligned ,lMultiImgSz+16); except showmessage('Load Image Error: System memory exhausted.'); freemem(lImg2Load.ImgBufferUnaligned); exit; end; {$IFDEF FPC} lImg2Load.ImgBuffer := Align(lImg2Load.ImgBufferUnaligned, 16); {$ELSE} lImg2Load.ImgBuffer := ByteP($fffffff0 and (integer(lImg2Load.ImgBufferUnaligned)+15)); {$ENDIF} l32Buf := SingleP(lImg2Load.ImgBuffer ); Move(l32TempBuf^,l32Buf^,lMultiImgSz); freemem(l32TempBuf); for lInc := 1 to lImgSamples do if specialsingle(l32Buf^[lInc]) then l32Buf^[lInc] := 0.0; //for lInc := 1 to lImgSamples do // if specialsingle(l32Buf^[lInc]) then l32Buf^[lInc] := 0.0; end; //64-bit float kDT_UNSIGNED_CHAR : ; //else will be aborted at previous case end;//case lDataType of if lImg2Load.NIFTIhdr.magic = kNIFTI_MAGIC_DCM then DICOMMirrorImgBuffer(lImg2Load) else if (lLoadBackground) and (not lReslice) and (lBackgroundImg.KnownAlignment) and (lBackgroundImg.OrthoReslice) then ReorientToNearestOrtho(lBackgroundImg,lImg2Load,lLoadBackground) else if (l4D) and (not lReslice) and (lBackgroundImg.KnownAlignment) and (lBackgroundImg.OrthoReslice) then OrthoReorientCore(lImg2Load,true); //next correct image size if lImg2Load.NIFTIhdr.scl_slope = 0 then lImg2Load.NIFTIhdr.scl_slope := 1; if (lLoadBackground) and (not l4D) then ResliceScrnImg ( lBackgroundImg,lImg2Load,true) else if not l4D then ResliceScrnImg ( lBackgroundImg,lImg2Load,lBackgroundImg.OverlaySmooth); //12 April 2009 - allow nearest neighbor //Next: find min/max - better after reslicing incase we have padded zeros at the edges and zero < min case lImg2Load.ImgBufferBPP of 1: begin FindImgMinMax8 (lImg2Load, lMini,lMaxi); lImg2Load.GlMaxUnscaledS := lMaxI; lImg2Load.GlMinUnscaledS := lMinI;; end; 2: begin FindImgMinMax16 (lImg2Load, lMini,lMaxi); lImg2Load.GlMaxUnscaledS := lMaxI; lImg2Load.GlMinUnscaledS := lMinI;; end; 4: FindImgMinMax32 (lImg2Load,lImg2Load.GlMinUnscaledS,lImg2Load.GlMaxUnscaledS); else Showmessage('OpenImg and LoadImg error'); end; //case ImgBufferBPP balance(lImg2Load); //preparecontrast autobalance lImg2Load.WindowScaledMin := raw2ScaledIntensity(lImg2Load,lImg2Load.AutoBalMinUnscaled); lImg2Load.WindowScaledMax := raw2ScaledIntensity(lImg2Load,lImg2Load.AutoBalMaxUnscaled); if (lVOILoadAsBinary) then begin lImg2Load.WindowScaledMin := kMin8bit;//MAW lImg2Load.WindowScaledMax := kVOI8bit; lImg2Load.NIFTIhdr.scl_slope := 1; lImg2Load.NIFTIhdr.scl_inter := 0; end else if lDataType = kDT_RGB then begin//RGB lImg2Load.UsesCustomPalette := true; lImg2Load.NIFTIhdr.scl_slope := 1; lImg2Load.NIFTIhdr.scl_inter := 0; lImg2Load.WindowScaledMin := kMin8bit; lImg2Load.WindowScaledMax := 255; lImg2Load.AutoBalMinUnscaled := lImg2Load.WindowScaledMin; lImg2Load.AutoBalMaxUnscaled := lImg2Load.WindowScaledMax; end else if (lNoScaling8bit) and (lImg2Load.ImgBufferBPP = 1) then begin lImg2Load.UsesCustomPalette := false; lImg2Load.NIFTIhdr.scl_slope := 1; lImg2Load.NIFTIhdr.scl_inter := 0; lImg2Load.WindowScaledMin := kMin8bit; lImg2Load.WindowScaledMax := 255; lImg2Load.AutoBalMinUnscaled := lImg2Load.WindowScaledMin; lImg2Load.AutoBalMaxUnscaled := lImg2Load.WindowScaledMax; end else if (lImg2Load.NIFTIhdr.intent_code = kNIFTI_INTENT_ESTIMATE) and (lImg2Load.NIFTIhdr.intent_name[1] = '%') then begin lImg2Load.WindowScaledMin := kMin8bit; lImg2Load.WindowScaledMax := 100;//lImg2Load.GlMaxUnscaledS; lImg2Load.LutFromZero := true; lImg2Load.AutoBalMinUnscaled := lImg2Load.WindowScaledMin; lImg2Load.AutoBalMaxUnscaled := lImg2Load.WindowScaledMax; end else if ( (lImg2Load.NIFTIhdr.intent_code = NIFTI_INTENT_LOG10PVAL) or (lImg2Load.NIFTIhdr.intent_code =kNIFTI_INTENT_PVAL) or (lImg2Load.NIFTIhdr.intent_code = kNIFTI_INTENT_ZSCORE) or ((lImg2Load.NIFTIhdr.intent_code = kNIFTI_INTENT_TTEST) or (lImg2Load.NIFTIhdr.intent_code = kNIFTI_INTENT_CHISQ))) and (lImg2Load.ImgBufferBPP = 4) and (not l4D) then begin //ComputeFDR(lImg2Load.NIFTIhdr.intent_code,round(lImg2Load.NIFTIhdr.intent_p1),lImg2Load.ImgBufferItems,lImg2Load.ImgBufferBPP,lImg2Load.ImgBuffer,lP05,lP01,lFWE05,lFWE01,lFDR05,lFDR01); ComputeFDR(lImg2Load,lP05,lP01,lFWE05,lFWE01,lFDR05,lFDR01); if (Raw2ScaledIntensity(lImg2Load,lImg2Load.GlMaxUnscaledS)> lFDR05) and (lFDR05 > 0) then begin lImg2Load.WindowScaledMin := lFDR05; //0.001 xxx if lFDR01 > 0 then lImg2Load.WindowScaledMax := lFDR01 else lImg2Load.WindowScaledMax := 2*lFDR05; //0.000001 end else begin lImg2Load.WindowScaledMin := lP05; //0.001 xxx lImg2Load.WindowScaledMax := lP01; //0.000001 end; if (lImg2Load.WindowScaledMax < 0.00001) and (lImg2Load.WindowScaledMin < 0.00001) then begin lImg2Load.WindowScaledMax := 5; lImg2Load.WindowScaledMin := 0; end; lImg2Load.LutFromZero := true; lImg2Load.AutoBalMinUnscaled := lImg2Load.WindowScaledMin; lImg2Load.AutoBalMaxUnscaled := lImg2Load.WindowScaledMax; end else if (lImg2Load.NIFTIhdr.intent_code = kNIFTI_INTENT_LABEL) and (lImg2Load.ImgBufferBPP = 1) then begin //maw LoadLabelLUT(lBackgroundImg,lImg2Load); lImg2Load.NIFTIhdr.scl_slope := 1; lImg2Load.NIFTIhdr.scl_inter := 0; lImg2Load.WindowScaledMin := kMin8bit;//MAW lImg2Load.WindowScaledMax := 255; lImg2Load.UsesCustomPalette := true; lImg2Load.AutoBalMinUnscaled := lImg2Load.WindowScaledMin; lImg2Load.AutoBalMaxUnscaled := lImg2Load.WindowScaledMax; //ImgForm.Help1.caption := 'imaw'+realtostr(lImg2Load.WindowScaledMin,4);//maw end else begin lImg2Load.UsesCustomPalette := false; lImg2Load.WindowScaledMin := raw2ScaledIntensity(lImg2Load,lImg2Load.AutoBalMinUnscaled); lImg2Load.WindowScaledMax := raw2ScaledIntensity(lImg2Load,lImg2Load.AutoBalMaxUnscaled); end; lParseName := parsefilename(extractfilename(lImg2Load.HdrFileName)); if (lParsename = 'ch2bet') or (lParseName = 'ch2better') then begin lImg2Load.WindowScaledMin := 45; lImg2Load.WindowScaledMax := 120; lImg2Load.AutoBalMinUnscaled := lImg2Load.WindowScaledMin; lImg2Load.AutoBalMaxUnscaled := lImg2Load.WindowScaledMax; end; if lParseName = 'ch2' then begin lImg2Load.WindowScaledMin := 30; lImg2Load.WindowScaledMax := 120; lImg2Load.AutoBalMinUnscaled := lImg2Load.WindowScaledMin; lImg2Load.AutoBalMaxUnscaled := lImg2Load.WindowScaledMax; end; //Next: create screen buffer [scaled to background] //if not l4D then //12/2007: do not create screen buffer for 4D load! saves memory and time // RescaleImgIntensity (lBackgroundImg,lImg2Load); if not l4D then begin//12/2007: do not create screen buffer for 4D load! saves memory and time if lLoadBackground then RescaleImgIntensity (lBackgroundImg,lImg2Load,kBGOverlayNum) else RescaleImgIntensity (lBackgroundImg,lImg2Load,kVOIOverlayNum); end; if (lVOILoadAsBinary) and (lImg2Load.ScrnBufferItems> 0) then begin if lImg2Load.NIFTIhdr.intent_name[1] = 'I' then //indexed showmessage('Indexed drawing - assuming drawing is binary. You may want to upgrade this software.'); gBGImg.VOIchanged := false; for lInc := 1 to lImg2Load.ScrnBufferItems do if lImg2Load.ScrnBuffer^[lInc] > 1 then lImg2Load.ScrnBuffer^[lInc] := kVOI8bit; lMaxI := maxint; LoadMonochromeLUT(lMaxi,lBackgroundImg,lImg2Load); if lImg2Load.ImgBufferItems > 1 then freemem(lImg2Load.ImgBufferUnaligned); lImg2Load.ImgBufferItems := 0; end else begin ImgForm.LayerDropSelect(nil); ImgForm.LUTdropSelect(nil); end; result := true; 456: CloseFile(F); {$I+} FileMode := 2; end; //proc OpenImg end. mricron-0.20120505.1~dfsg.1.orig/nifti_hdr_view.pas0000664000175000017500000006267011645603144021374 0ustar michaelmichaelunit nifti_hdr_view; interface {$H+} uses {$IFNDEF FPC} RXSpin,capmenu, {$ELSE} LResources, Spin, {$ENDIF} {$IFNDEF Unix} ShellAPI, {$ENDIF} SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, nifti_hdr, Menus, ComCtrls, define_types; type { THdrForm } THdrForm = class(TForm) Ymm: TFloatSpinEdit; MainMenu1: TMainMenu; File1: TMenuItem; Open1: TMenuItem; Exit1: TMenuItem; Save1: TMenuItem; Help1: TMenuItem; About1: TMenuItem; OpenHdrDlg: TOpenDialog; SaveHdrDlg: TSaveDialog; PageControl1: TPageControl; TabRequired: TTabSheet; TabUnused: TTabSheet; intent_nameEdit: TEdit; data_typeEdit: TEdit; CommentEdit: TEdit; db_: TEdit; aux: TEdit; gmax: TSpinEdit; gmin: TSpinEdit; ses: TSpinEdit; ext: TSpinEdit; reg: TSpinEdit; Label34: TLabel; Label5: TLabel; Label6: TLabel; Label9: TLabel; Label10: TLabel; Label14: TLabel; Label15: TLabel; Label18: TLabel; Label19: TLabel; Label26: TLabel; HeaderMagicDrop: TComboBox; Label21: TLabel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label8: TLabel; Label7: TLabel; Endian: TComboBox; fTypeDrop: TComboBox; Label44: TLabel; xyzt_sizeDrop: TComboBox; xyzt_timeDrop: TComboBox; Xdim: TSpinEdit; Ydim: TSpinEdit; Zdim: TSpinEdit; Zmm: TFloatSpinEdit; OffsetEdit: TSpinEdit; TDim: TSpinEdit; Xmm: TFloatSpinEdit; TSec: TFloatSpinEdit; StatusBar1: TStatusBar; Label29: TLabel; Dim5Edit: TSpinEdit; TabSheet1: TTabSheet; Label35: TLabel; IntentCodeDrop: TComboBox; intent_p1Edit: TFloatSpinEdit; intent_p2Edit: TFloatSpinEdit; intent_p3Edit: TFloatSpinEdit; Label25: TLabel; Label27: TLabel; Label28: TLabel; TabSheet2: TTabSheet; Label11: TLabel; Label16: TLabel; Label17: TLabel; Label32: TLabel; slice_startEdit: TSpinEdit; Slice_durationEdit: TFloatSpinEdit; toffsetEdit: TFloatSpinEdit; TabSheet3: TTabSheet; cmax: TFloatSpinEdit; cmin: TFloatSpinEdit; Label12: TLabel; Label13: TLabel; Scale: TFloatSpinEdit; Label23: TLabel; Intercept: TFloatSpinEdit; Label22: TLabel; Label30: TLabel; Label33: TLabel; Page1: TMenuItem; Dimensions1: TMenuItem; ImageIntensity1: TMenuItem; Statistics1: TMenuItem; FunctionalMRI1: TMenuItem; Optional1: TMenuItem; TabSheet4: TTabSheet; Rotations1: TMenuItem; srow_x0Edit: TFloatSpinEdit; srow_x1Edit: TFloatSpinEdit; srow_x2Edit: TFloatSpinEdit; Label24: TLabel; Label36: TLabel; Label37: TLabel; srow_y0Edit: TFloatSpinEdit; srow_y1Edit: TFloatSpinEdit; srow_y2Edit: TFloatSpinEdit; srow_z0Edit: TFloatSpinEdit; srow_z1Edit: TFloatSpinEdit; srow_z2Edit: TFloatSpinEdit; srow_x3Edit: TFloatSpinEdit; srow_y3Edit: TFloatSpinEdit; srow_z3Edit: TFloatSpinEdit; quatern_bEdit: TFloatSpinEdit; quatern_cEdit: TFloatSpinEdit; quatern_dEdit: TFloatSpinEdit; qoffset_xEdit: TFloatSpinEdit; qoffset_yEdit: TFloatSpinEdit; qoffset_zEdit: TFloatSpinEdit; Label39: TLabel; Label40: TLabel; Label41: TLabel; Dim6Edit: TSpinEdit; Label42: TLabel; Dim7Edit: TSpinEdit; PixDim5: TFloatSpinEdit; PixDim6: TFloatSpinEdit; PixDim7: TFloatSpinEdit; SliceCodeDrop: TComboBox; Label20: TLabel; slice_endEdit: TSpinEdit; FreqDimDrop: TComboBox; PhaseDimDrop: TComboBox; SliceDimDrop: TComboBox; Label31: TLabel; Label43: TLabel; Label45: TLabel; QFacEdit: TFloatSpinEdit; Label46: TLabel; QFormDrop: TComboBox; SFormDrop: TComboBox; Label38: TLabel; Label47: TLabel; //procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject); procedure SaveHdrDlgClose(Sender: TObject); procedure WriteHdrForm (var lHdr: TMRIcroHdr); procedure ReadHdrDimensionsOnly (var lHdr: TMRIcroHdr); //reads only size dimensions: useful for computing estimated filesize procedure ReadHdrForm (var lHdr: TMRIcroHdr); //reads entire header procedure About1Click(Sender: TObject); procedure Open1Click(Sender: TObject); procedure Save1Click(Sender: TObject); procedure TabMenuClick(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ImageSzChange(Sender: TObject); procedure HeaderMagicDropSelect(Sender: TObject); function OpenAndDisplayHdr (var lFilename: string; var lHdr: TMRIcroHdr): boolean; //procedure ReadXForm (var lHdr: TMRIcroHdr); private { Private declarations } {$IFNDEF FPC} procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES; {$ENDIF} public { Public declarations } end; function OpenDialogExecute (lFilter,lCaption: string; lAllowMultiSelect: boolean): boolean; var HdrForm: THdrForm; implementation uses nifti_img_view, render,nifti_img; {$IFNDEF FPC} {$R *.DFM} {$ENDIF} function OpenDialogExecute (lFilter,lCaption: string; lAllowMultiSelect: boolean): boolean; begin HdrForm.OpenHdrDlg.Filter := lFilter; HdrForm.OpenHdrDlg.FilterIndex := 1; HdrForm.OpenHdrDlg.Title := lCaption; if lAllowMultiSelect then HdrForm.OpenHdrDlg.Options := [ofAllowMultiSelect,ofFileMustExist]; result := HdrForm.OpenHdrDlg.Execute; HdrForm.OpenHdrDlg.Options := [ofFileMustExist]; end; function DropItem2DataType(lItemIndex: integer): integer; //returns NIfTI datatype number begin case lItemIndex of 0: result :=1; //binary 1 : result := 256; //8-bit S 2 : result := 2; //8-bit int U* 3 : result := 4; //16-bit int S* 4 : result := 512; //16-bit int U 5 : result := 8; //32-bit int S* 6 : result := 768; //32-bit int U 7: result := 1024; //64-bit int S 8: result := 1280; //64-bit int U 9: result := 16; //32-bit real* 10: result := 64; //64-bit real* 11: result := 1536; //128-bit real 12: result := 128; //24-bit rgb 13: result := 32; //64-bit complex 14: result := 1792; //128-bit complex 15: result := 2048; //256-bit complex else result := 0; end; //case end; //func DropItem2DataType function DataType2DropItem (lDataType: smallint): integer; begin case lDataType of 1: result := 0; //binary 256: result := 1; //8-bit S 2: result := 2; //8-bit int U* 4: result := 3; //16-bit int S* 512: result := 4; //16-bit int U 8: result := 5; //32-bit int S* 768: result := 6; //32-bit int U 1024: result := 7; //64-bit int S 1280: result := 8; //64-bit int U 16: result := 9; //32-bit real* 64: result := 10; //64-bit real* 1536: result := 11; //128-bit real 128: result := 12; //24-bit rgb 32: result := 13; //64-bit complex 1792: result := 14; //128-bit complex 2048: result := 15; //256-bit complex else result := 0; end; //case end; //func DataType2DropItem function DataType2BitsPerVoxel (lDataType: smallint): integer; begin case lDataType of 1: result := 1; //binary 256: result := 8; //8-bit S 2: result := 8; //8-bit int U* 4: result := 16; //16-bit int S* 512: result := 16; //16-bit int U 8: result := 32; //32-bit int S* 768: result := 32; //32-bit int U 1024: result := 64; //64-bit int S 1280: result := 64; //64-bit int U 16: result := 32; //32-bit real* 64: result := 64; //64-bit real* 1536: result := 128; //128-bit real 128: result := 24; //24-bit rgb 32: result := 64; //64-bit complex 1792: result := 128; //128-bit complex 2048: result := 256; //256-bit complex else result := 0; end; //case end; //func DataType2BitsPerVoxel function time_units2DropItem (lxyzt_units: byte): integer; var lxyzt_unitsClipped: byte; begin lxyzt_unitsClipped := lxyzt_units and 56; case lxyzt_unitsClipped of kNIFTI_UNITS_SEC : result := 1;//= 8; kNIFTI_UNITS_MSEC : result := 2;//= 16; kNIFTI_UNITS_USEC : result := 3;//= 24; kNIFTI_UNITS_HZ : result := 4;//= 32; kNIFTI_UNITS_PPM : result := 5;//= 40; else result := 0; //unknown end; //case end; //func time_units2DropItem function DropItem2time_units (lDropItemIndex: byte): integer; //convert ComboBox index to NIFTI time units begin case lDropItemIndex of 1: result := kNIFTI_UNITS_SEC; 2: result := kNIFTI_UNITS_MSEC; 3: result := kNIFTI_UNITS_USEC; 4: result := kNIFTI_UNITS_HZ; 5: result := kNIFTI_UNITS_PPM; else result := 0; //unknown end; //case end; //func DropItem2time_units procedure THdrForm.WriteHdrForm (var lHdr: TMRIcroHdr); //writes a header to the various controls var //lCStr: string[80]; lInc: Integer; begin with lHdr.NIFTIhdr do begin //numDimEdit.value := dim[0]; XDim.Value := dim[1]; YDim.Value := dim[2]; ZDim.Value := dim[3]; TDim.Value := dim[4]; Dim5Edit.value := dim[5]; Dim6Edit.value := dim[6]; Dim7Edit.value := dim[7]; Xmm.Value := pixdim[1]; Ymm.Value := pixdim[2]; Zmm.Value := pixdim[3]; TSec.Value := pixdim[4]; PixDim5.value := pixdim[5]; PixDim6.value := pixdim[6]; PixDim7.value := pixdim[7]; OffsetEdit.value := round(vox_offset); Scale.value := scl_slope; Intercept.value := scl_inter; {$IFNDEF FPC} fTypeDrop.SetItemIndex( DataType2DropItem( datatype)); if lHdr.NativeEndian then Endian.SetItemIndex(0) else Endian.SetItemIndex(1); //caption := inttohex(Magic); if Magic = kNIFTI2_MAGIC_EMBEDDED_HDR then HeaderMagicDrop.SetItemIndex(4) else if Magic = kNIFTI2_MAGIC_SEPARATE_HDR then HeaderMagicDrop.SetItemIndex(3) else if Magic = kswapNIFTI2_MAGIC_EMBEDDED_HDR then HeaderMagicDrop.SetItemIndex(4) else if Magic = kswapNIFTI2_MAGIC_SEPARATE_HDR then HeaderMagicDrop.SetItemIndex(3) else if Magic = kNIFTI_MAGIC_EMBEDDED_HDR then HeaderMagicDrop.SetItemIndex(2) else if Magic = kNIFTI_MAGIC_SEPARATE_HDR then HeaderMagicDrop.SetItemIndex(1) else if Magic = kswapNIFTI_MAGIC_EMBEDDED_HDR then HeaderMagicDrop.SetItemIndex(2) else if Magic = kswapNIFTI_MAGIC_SEPARATE_HDR then HeaderMagicDrop.SetItemIndex(1) else HeaderMagicDrop.SetItemIndex(0); xyzt_sizeDrop.SetItemIndex(xyzt_units and 3); xyzt_timeDrop.SetItemIndex(time_units2DropItem(xyzt_units)); {$ELSE} fTypeDrop.ItemIndex := ( DataType2DropItem( datatype)); if lHdr.DiskDataNativeEndian then Endian.ItemIndex:=(0) else Endian.ItemIndex:=(1); if Magic = kNIFTI2_MAGIC_EMBEDDED_HDR then HeaderMagicDrop.ItemIndex:=(4) else if Magic = kNIFTI2_MAGIC_SEPARATE_HDR then HeaderMagicDrop.ItemIndex:=(3) else if Magic = kswapNIFTI2_MAGIC_EMBEDDED_HDR then HeaderMagicDrop.ItemIndex:=(4) else if Magic = kswapNIFTI2_MAGIC_SEPARATE_HDR then HeaderMagicDrop.ItemIndex:=(3) else if Magic = kNIFTI_MAGIC_EMBEDDED_HDR then HeaderMagicDrop.ItemIndex:=(2) else if Magic = kNIFTI_MAGIC_SEPARATE_HDR then HeaderMagicDrop.ItemIndex:=(1) else if Magic = kswapNIFTI_MAGIC_EMBEDDED_HDR then HeaderMagicDrop.ItemIndex:=(2) else if Magic = kswapNIFTI_MAGIC_SEPARATE_HDR then HeaderMagicDrop.ItemIndex:=(1) else HeaderMagicDrop.ItemIndex:=(0); xyzt_sizeDrop.ItemIndex:=(xyzt_units and 3); xyzt_timeDrop.ItemIndex:=(time_units2DropItem(xyzt_units)); {$ENDIF} CommentEdit.text := descrip; data_typeEdit.text := data_type; db_.text := db_name; aux.text := aux_file; intent_nameEdit.text := intent_name; ext.value := extents; lInc := intent_code; if (intent_code > 1) and (intent_code <= kNIFTI_LAST_STATCODE) then lInc := lInc - 1 //intent_codes start from 2 not 1 else if intent_code >= kNIFTI_FIRST_NONSTATCODE then //remove gap in numbers that follow final statcode lInc := (intent_code - kNIFTI_FIRST_NONSTATCODE)+kNIFTI_LAST_STATCODE else begin lInc := 0; //unknown end; {$IFNDEF FPC} IntentCodeDrop .SetItemIndex(lInc); SliceCodeDrop.SetItemIndex(slice_code); FreqDimDrop.SetItemIndex(dim_info and 3); PhaseDimDrop.SetItemIndex((dim_info shr 2) and 3); SliceDimDrop.SetItemIndex((dim_info shr 4) and 3); {$ELSE} IntentCodeDrop.ItemIndex:=lInc; SliceCodeDrop.ItemIndex:=(slice_code); FreqDimDrop.ItemIndex:=(dim_info and 3); PhaseDimDrop.ItemIndex:=((dim_info shr 2) and 3); SliceDimDrop.ItemIndex:=((dim_info shr 4) and 3); {$ENDIF} intent_p1Edit.value := intent_p1; intent_p2Edit.value := intent_p2; intent_p3Edit.value := intent_p3; ses.value := session_error; reg.value := ord(regular); slice_startEdit.value := slice_start; slice_endEdit.value := slice_end; cmax.value := cal_max; cmin.value := cal_min; slice_durationEdit.value := slice_duration; toffsetEdit.value := toffset; gmax.value := glmax; gmin.value := glmin; //Next: 3D orientation rotations QFacEdit.value := pixdim[0]; {$IFNDEF FPC} QFormDrop.SetItemIndex(qform_code); SFormDrop.SetItemIndex(sform_code); {$ELSE} QFormDrop.ItemIndex:= (qform_code); SFormDrop.ItemIndex :=(sform_code); {$ENDIF} quatern_bEdit.value := quatern_b; quatern_cEdit.value := quatern_c; quatern_dEdit.value := quatern_d; qoffset_xEdit.value := qoffset_x; qoffset_yEdit.value := qoffset_y; qoffset_zEdit.value := qoffset_z; srow_x0Edit.value := srow_x[0];//12 affine matrix values srow_x1Edit.value := srow_x[1]; srow_x2Edit.value := srow_x[2]; srow_x3Edit.value := srow_x[3]; srow_y0Edit.value := srow_y[0]; srow_y1Edit.value := srow_y[1]; srow_y2Edit.value := srow_y[2]; srow_y3Edit.value := srow_y[3]; srow_z0Edit.value := srow_z[0]; srow_z1Edit.value := srow_z[1]; srow_z2Edit.value := srow_z[2]; srow_z3Edit.value := srow_z[3]; //Finally... check values HeaderMagicDropSelect(nil); //disable or enable offset based on image format end; //with lHdr end; procedure ApplySaveDlgFilter (lSaveDlg: TSaveDialog); var lLen,lPos,lPipes,lPipesReq: integer; lExt: string; begin lPipesReq := (lSaveDlg.FilterIndex * 2)-1; if lPipesReq < 1 then exit; lLen := length(lSaveDlg.Filter); lPos := 1; lPipes := 0; while (lPos < lLen) and (lPipes < lPipesReq) do begin if lSaveDlg.Filter[lPos] = '|' then inc(lPipes); inc(lPos); end; if (lPos >= lLen) or (lPipes < lPipesReq) then exit; lExt := ''; while (lPos <= lLen) and (lSaveDlg.Filter[lPos] <> '|') do begin if lSaveDlg.Filter[lPos] <> '*' then lExt := lExt + lSaveDlg.Filter[lPos]; inc(lPos); end; if lExt <> '' then lSaveDlg.Filename := ChangeFileExt(lSaveDlg.Filename,lExt); end; procedure THdrForm.SaveHdrDlgClose(Sender: TObject); begin ApplySaveDlgFilter(SaveHdrDlg); end; procedure THdrForm.FormShow(Sender: TObject); begin // ImgForm.OnLaunch; end; procedure THdrForm.ReadHdrDimensionsOnly (var lHdr: TMRIcroHdr); //reads only size dimensions: useful for computing estimated filesize var lInc: Integer; begin with lHdr.NIFTIhdr do begin dim[1] := round(XDim.Value); dim[2] := round(YDim.Value); dim[3] := round(ZDim.Value); dim[4] := round(TDim.Value); dim[5] := round(Dim5Edit.value); dim[6] := round(Dim6Edit.value); dim[7] := round(Dim7Edit.value); //Next: compute Dim[0]: compute number of dimensions by finding largest dimension with at least two samples lInc := 7; while dim[lInc] < 2 do dec(lInc); Dim[0] := lInc; //comp //showmessage(inttostr(Dim[0])); vox_offset := OffsetEdit.value; DataType := DropItem2DataType(FTypeDrop.ItemIndex); bitpix := DataType2BitsPerVoxel(DataType); if Endian.ItemIndex = 0 then lHdr.DiskDataNativeEndian := true else lHdr.DiskDataNativeEndian := false; end; //with NIfTIhdr end; //proc ReadHdrDimensionsOnly procedure THdrForm.ReadHdrForm (var lHdr: TMRIcroHdr); //read the values the user has entered var lInc: Integer; begin NIFTIhdr_ClearHdr(lHdr); //important: reset values like first 4 bytes = 348 ReadHdrDimensionsOnly(lHdr); //StatusBar1.Panels[0].text := 'ImageData (bytes)= '+inttostr(ComputeImageDataBytes(lHdr)); with lHdr.NIFTIhdr do begin pixdim[1] := Xmm.Value; pixdim[2] := Ymm.Value; pixdim[3] := Zmm.Value; pixdim[4] := TSec.Value; pixdim[5] := PixDim5.Value; pixdim[6] := PixDim6.Value; pixdim[7] := PixDim7.Value; scl_slope := Scale.value; scl_inter := Intercept.value; if HeaderMagicDrop.ItemIndex = 2 then Magic := kNIFTI_MAGIC_EMBEDDED_HDR else if HeaderMagicDrop.ItemIndex = 1 then Magic := kNIFTI_MAGIC_SEPARATE_HDR else Magic := 0; //not saed as NIFTI for lInc := 1 to 80 do descrip[lInc] := chr(0); for lInc := 1 to length(CommentEdit.text) do descrip[lInc] := CommentEdit.text[lInc]; for lInc := 1 to 10 do data_type[lInc] := chr(0); for lInc := 1 to length(data_typeEdit.text) do data_type[lInc] := data_typeEdit.text[lInc]; for lInc := 1 to 18 do db_name[lInc] := chr(0); for lInc := 1 to length(db_.text) do db_name[lInc] := db_.text[lInc]; for lInc := 1 to 24 do aux_file[lInc] := chr(0); for lInc := 1 to length(aux.text) do aux_file[lInc] := aux.text[lInc]; for lInc := 1 to 16 do intent_name[lInc] := chr(0); for lInc := 1 to length(intent_nameEdit.text) do intent_name[lInc] := intent_nameEdit.text[lInc]; xyzt_units := xyzt_sizeDrop.ItemIndex; xyzt_units := xyzt_units+ (DropItem2time_units(xyzt_timeDrop.ItemIndex)); lInc := IntentCodeDrop.ItemIndex; if (lInc > 0) and (lInc < kNIFTI_LAST_STATCODE) then lInc := lInc + 1 //intent_codes start from 2 not 1 else if (lInc >= kNIFTI_LAST_STATCODE) then //add gap in numbers between last stat code and misc codes lInc := (lInc - kNIFTI_LAST_STATCODE)+kNIFTI_FIRST_NONSTATCODE else lInc := 0; //unknown intent_code := lInc; intent_p1 := intent_p1Edit.value; intent_p2 := intent_p2Edit.value; intent_p3 := intent_p3Edit.value; extents:= round(ext.value); session_error := round(ses.value); regular := chr(round(reg.value)); dim_Info := FreqDimDrop.ItemIndex+(PhaseDimDrop.ItemIndex shl 2)+(SliceDimDrop.ItemIndex shl 4); slice_start := round(slice_startEdit.value); slice_end := round(slice_endEdit.value); slice_code := SliceCodeDrop.ItemIndex; Slice_duration := (Slice_DurationEdit.value); toffset := (toffsetEdit.value); cal_max := cmax.value; cal_min := cmin.value; glmax := round(gmax.value); glmin := round(gmin.value); //Next: 3D orientation rotations pixdim[0] := QFacEdit.value; qform_code := QFormDrop.ItemIndex; quatern_b := quatern_bEdit.value; quatern_c := quatern_cEdit.value; quatern_d := quatern_dEdit.value; qoffset_x := qoffset_xEdit.value; qoffset_y := qoffset_yEdit.value; qoffset_z := qoffset_zEdit.value; sform_code := SFormDrop.ItemIndex; srow_x[0] := srow_x0Edit.value;//12 affine matrix values srow_x[1] := srow_x1Edit.value; srow_x[2] := srow_x2Edit.value; srow_x[3] := srow_x3Edit.value; srow_y[0] := srow_y0Edit.value; srow_y[1] := srow_y1Edit.value; srow_y[2] := srow_y2Edit.value; srow_y[3] := srow_y3Edit.value; srow_z[0] := srow_z0Edit.value; srow_z[1] := srow_z1Edit.value; srow_z[2] := srow_z2Edit.value; srow_z[3] := srow_z3Edit.value; end; //with lHdr //zero_intercept := intercept.value; end; procedure THdrForm.About1Click(Sender: TObject); begin Showmessage('Chris Rorden''s NIfTI header viewer release 1/1/2006.'); end; function THdrForm.OpenAndDisplayHdr (var lFilename: string; var lHdr: TMRIcroHdr): boolean; var lFileDir: string; begin FreeImgMemory(lHdr); result := false; NIFTIhdr_ClearHdr(lHdr); if not NIFTIhdr_LoadHdr(lFilename, lHdr) then exit; WriteHdrForm (lHdr); lFileDir := extractfiledir(lFilename); if lFileDir <> gTemplateDir then OpenHdrDlg.InitialDir := lFileDir; SaveHdrDlg.InitialDir := lFileDir; //999 ImgForm.SaveDialog1.InitialDir := lFileDir; SaveHdrDlg.FileName := lFilename; //make this default file to write StatusBar1.Panels[1].text := lFilename; StatusBar1.Panels[0].text := 'Img= '+inttostr(ComputeImageDataBytes(lHdr)); result := true; end; procedure THdrForm.Open1Click(Sender: TObject); var lHdr: TMRIcroHdr; lFilename: string; begin //NIfTI (*.hdr;*.nii)|*.hdr; *.nii; *.nii.gz|NIfTI separate header (*.hdr)|*.hdr|NIfTI embedded header|*.nii|NIfTI compressed|*.nii.gz //if not OpenHdrDlg.Execute then exit; if not OpenDialogExecute(kImgFilter,'Select header',false) then exit; lFilename := OpenHdrDlg.Filename; OpenAndDisplayHdr(lFilename,lHdr); end; procedure THdrForm.Save1Click(Sender: TObject); var lHdr: TMRIcroHdr; lFilename: string; begin NIFTIhdr_ClearHdr(lHdr); if not SaveHdrDlg.Execute then exit; lFilename := SaveHdrDlg.Filename; OpenHdrDlg.InitialDir := extractfiledir(lFilename); //999 ImgForm.SaveDialog1.InitialDir := extractfiledir(lFilename); ReadHdrForm (lHdr); if not NIFTIhdr_SaveHdr (lFilename, lHdr,true) then exit; OpenHdrDlg.FileName := lFilename; //make this default file to open StatusBar1.Panels[1].text := 'wrote: '+lFilename; end; procedure THdrForm.TabMenuClick(Sender: TObject); begin PageControl1.ActivePage := PageControl1.Pages[(Sender as TMenuItem).Tag]; end; procedure THdrForm.Exit1Click(Sender: TObject); //Quit the program or form begin Close; end; {$IFNDEF FPC} procedure THdrForm.WMDropFiles(var Msg: TWMDropFiles); //implement drag and drop //NOTE: requires 'ShellAPI' in uses clause var lHdr: TMRIcroHdr; CFileName: array[0..MAX_PATH] of Char; lFilename: string; begin try if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then begin lFilename := CFilename; OpenAndDisplayHdr(lFileName, lHdr); Msg.Result := 0; end; finally DragFinish(Msg.Drop); end; end; {$ENDIF} procedure THdrForm.FormCreate(Sender: TObject); var lHdr: TMRIcroHdr; begin //DecimalSeparator := '.'; //important for reading DICOM data: e.g. Germans write '12,00' but DICOM is '12.00' {$IFNDEF Unix} DragAcceptFiles(Handle, True); //engage drag and drop {$ENDIF} NIFTIhdr_ClearHdr(lHdr); HdrForm.WriteHdrForm (lHdr); //show default header end; procedure THdrForm.ImageSzChange(Sender: TObject); //report size of image data var lHdr: TMRIcroHdr; begin NIFTIhdr_ClearHdr(lHdr); //important: reset values like first 4 bytes = 348 ReadHdrDimensionsOnly(lHdr); StatusBar1.Panels[0].text := 'Img= '+inttostr(ComputeImageDataBytes(lHdr)); end; procedure THdrForm.HeaderMagicDropSelect(Sender: TObject); var lHdrIndex: integer; begin lHdrIndex := HeaderMagicDrop.ItemIndex; //0=unkown, 1=nifti hdr+img, 2=nifti .nii embedded if lHdrIndex = 1 then begin//nifti hdr+img, offset must be = 0 OffsetEdit.MinValue := 0; OffsetEdit.Enabled := false; OffsetEdit.value := 0; end else if lHdrIndex = 2 then begin//embedded header, offset must be at least 348 OffsetEdit.Enabled := true; if OffsetEdit.value < sizeof(TNIFTIHdr) then OffsetEdit.value := sizeof(TNIFTIHdr); OffsetEdit.MinValue := sizeof(TNIFTIHdr); end else begin //no embedded header... therefore offset can be zero OffsetEdit.MinValue := 0; OffsetEdit.Enabled := true; if OffsetEdit.value = sizeof(TNIFTIHdr) then OffsetEdit.value := 0; end; end; {$IFDEF FPC} initialization {$I nifti_hdr_view.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/nifti_hdr_view.lrs0000664000175000017500000007057111645603144021410 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('THdrForm','FORMDATA',[ 'TPF0'#8'THdrForm'#7'HdrForm'#4'Left'#3#220#1#6'Height'#3#162#1#3'Top'#3'|'#1 +#5'Width'#3#30#2#13'ActiveControl'#7#12'PageControl1'#11'BorderIcons'#11#12 +'biSystemMenu'#0#11'BorderStyle'#7#8'bsDialog'#7'Caption'#6#24'NIfTI Header ' +'Information'#12'ClientHeight'#3#143#1#11'ClientWidth'#3#30#2#21'Constraints' +'.MaxHeight'#3#162#1#20'Constraints.MaxWidth'#3#30#2#21'Constraints.MinHeigh' +'t'#3#162#1#20'Constraints.MinWidth'#3#30#2#9'Font.Name'#6#13'MS Sans Serif' +#4'Menu'#7#9'MainMenu1'#8'OnCreate'#7#10'FormCreate'#6'OnShow'#7#8'FormShow' +#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.30'#0#12'TPageContr' +'ol'#12'PageControl1'#4'Left'#2#4#6'Height'#3's'#1#3'Top'#2#4#5'Width'#3#22#2 +#10'ActivePage'#7#11'TabRequired'#5'Align'#7#8'alClient'#18'BorderSpacing.Le' +'ft'#2#2#17'BorderSpacing.Top'#2#2#19'BorderSpacing.Right'#2#2#20'BorderSpac' +'ing.Bottom'#2#2#20'BorderSpacing.Around'#2#2#8'TabIndex'#2#0#8'TabOrder'#2#0 +#0#9'TTabSheet'#11'TabRequired'#7'Caption'#6#10'Dimensions'#12'ClientHeight' +#3'V'#1#11'ClientWidth'#3#14#2#0#6'TLabel'#7'Label21'#4'Left'#2#6#6'Height'#2 +#17#3'Top'#2#6#5'Width'#2'R'#7'Caption'#6#11'Header Type'#11'ParentColor'#8#0 +#0#6'TLabel'#6'Label1'#4'Left'#2#14#6'Height'#2#17#3'Top'#2'#'#5'Width'#3#238 +#0#7'Caption'#6'.Dimension Length Spacing Unit'#9'Font.Name' +#6#13'MS Sans Serif'#11'ParentColor'#8#10'ParentFont'#8#0#0#6'TLabel'#6'Labe' +'l2'#4'Left'#2#16#6'Height'#2#17#3'Top'#2'C'#5'Width'#2'/'#7'Caption'#6#7'I ' +'Space'#11'ParentColor'#8#0#0#6'TLabel'#6'Label3'#4'Left'#2#16#6'Height'#2#17 +#3'Top'#2'a'#5'Width'#2'3'#7'Caption'#6#7'J Space'#11'ParentColor'#8#0#0#6'T' +'Label'#6'Label4'#4'Left'#2#16#6'Height'#2#17#3'Top'#3#131#0#5'Width'#2'4'#7 +'Caption'#6#7'K Space'#11'ParentColor'#8#0#0#6'TLabel'#6'Label8'#4'Left'#2#6 +#6'Height'#2#17#3'Top'#3')'#1#5'Width'#2#30#7'Caption'#6#4'Data'#11'ParentCo' +'lor'#8#0#0#6'TLabel'#6'Label7'#4'Left'#3'&'#1#6'Height'#2#17#3'Top'#3#235#0 +#5'Width'#2'#'#7'Caption'#6#6'Offset'#11'ParentColor'#8#0#0#6'TLabel'#7'Labe' +'l44'#4'Left'#2#16#6'Height'#2#17#3'Top'#3#166#0#5'Width'#2' '#7'Caption'#6#4 +'Time'#11'ParentColor'#8#0#0#6'TLabel'#7'Label29'#4'Left'#2#16#6'Height'#2#17 +#3'Top'#3#198#0#5'Width'#2'-'#7'Caption'#6#7'5th Dim'#11'ParentColor'#8#0#0#6 +'TLabel'#7'Label41'#4'Left'#2#16#6'Height'#2#17#3'Top'#3#230#0#5'Width'#2'-' +#7'Caption'#6#7'6th Dim'#11'ParentColor'#8#0#0#6'TLabel'#7'Label42'#4'Left'#2 +#16#6'Height'#2#17#3'Top'#3#9#1#5'Width'#2'-'#7'Caption'#6#7'7th Dim'#11'Par' +'entColor'#8#0#0#9'TComboBox'#15'HeaderMagicDrop'#4'Left'#2'l'#6'Height'#2#24 +#3'Top'#2#2#5'Width'#3#239#0#10'ItemHeight'#2#16#13'Items.Strings'#1#6#7'Unk' +'nown'#6'#ni1: NIfTI separate file (hdr+.img)'#6#28'n+1: NIfTI embedded (.' +'nii)'#6'$ni2: NIfTI2 separate file (hdr+.img)'#6#29'n+2: NIfTI2 embedded ' +'(.nii)'#0#8'OnSelect'#7#21'HeaderMagicDropSelect'#5'Style'#7#14'csDropDownL' +'ist'#8'TabOrder'#2#15#0#0#9'TComboBox'#6'Endian'#4'Left'#3#231#0#6'Height'#2 +#24#3'Top'#3'#'#1#5'Width'#3#210#0#10'ItemHeight'#2#16#13'Items.Strings'#1#6 +#13'Native Endian'#6#14'Swapped Endian'#0#5'Style'#7#14'csDropDownList'#8'Ta' +'bOrder'#2#16#0#0#9'TComboBox'#9'fTypeDrop'#4'Left'#2'8'#6'Height'#2#24#3'To' +'p'#3'#'#1#5'Width'#3#152#0#13'DropDownCount'#2#20#10'ItemHeight'#2#16#13'It' +'ems.Strings'#1#6#6'binary'#6#7'8-bit S'#6#12'8-bit int U*'#6#13'16-bit int ' +'S*'#6#12'16-bit int U'#6#13'32-bit int S*'#6#12'32-bit int U'#6#12'64-bit i' +'nt S'#6#12'64-bit int U'#6#12'32-bit real*'#6#12'64-bit real*'#6#12'128-bit' +' real'#6#10'24-bit rgb'#6#10'64-bit com'#6#15'128-bit complex'#6#15'256-bit' +' complex'#0#8'OnSelect'#7#13'ImageSzChange'#5'Style'#7#14'csDropDownList'#8 +'TabOrder'#2#17#0#0#9'TComboBox'#13'xyzt_sizeDrop'#4'Left'#3#6#1#6'Height'#2 +#24#3'Top'#2'W'#5'Width'#3#128#0#10'ItemHeight'#2#16#13'Items.Strings'#1#6#7 +'Unknown'#6#5'Meter'#6#10'Millimeter'#6#10'Micrometer'#6#6'Micron'#0#5'Style' +#7#14'csDropDownList'#8'TabOrder'#2#18#0#0#9'TComboBox'#13'xyzt_timeDrop'#4 +'Left'#3#6#1#6'Height'#2#24#3'Top'#3#157#0#5'Width'#3#128#0#10'ItemHeight'#2 +#16#13'Items.Strings'#1#6#7'Unknown'#6#6'Second'#6#11'Millisecond'#6#11'Micr' +'osecond'#6#11'Hertzsecond'#6#5'Part '#6#16'Part per million'#0#5'Style'#7#14 +'csDropDownList'#8'TabOrder'#2#19#0#0#9'TSpinEdit'#4'Xdim'#4'Left'#2'P'#6'He' +'ight'#2#24#3'Top'#2';'#5'Width'#2'J'#8'MaxValue'#3#15''''#8'MinValue'#2#1#6 +'OnExit'#7#13'ImageSzChange'#8'TabOrder'#2#0#5'Value'#2#2#0#0#9'TSpinEdit'#4 +'Ydim'#4'Left'#2'P'#6'Height'#2#24#3'Top'#2'Y'#5'Width'#2'J'#8'MaxValue'#3#15 +''''#8'MinValue'#2#1#8'OnChange'#7#13'ImageSzChange'#6'OnExit'#7#13'ImageSzC' +'hange'#8'TabOrder'#2#1#5'Value'#2#2#0#0#9'TSpinEdit'#4'Zdim'#4'Left'#2'P'#6 +'Height'#2#24#3'Top'#2'{'#5'Width'#2'J'#8'MaxValue'#3#15''''#8'MinValue'#2#1 +#8'OnChange'#7#13'ImageSzChange'#6'OnExit'#7#13'ImageSzChange'#8'TabOrder'#2 +#2#5'Value'#2#1#0#0#14'TFloatSpinEdit'#3'Xmm'#4'Left'#3#164#0#6'Height'#2#24 +#3'Top'#2';'#5'Width'#2'J'#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValu' ,'e'#5#0#0#0#0#224#31#188#190#25'@'#8'MinValue'#5#0#0#0#0#224#31#188#190#25 +#192#8'TabOrder'#2#10#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#14'TFloatSpinEdit'#3 +'Ymm'#4'Left'#3#164#0#6'Height'#2#24#3'Top'#2'Y'#5'Width'#2'J'#9'Increment'#5 +#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#224#31#188#190#25'@'#8'MinVa' +'lue'#5#0#0#0#0#224#31#188#190#25#192#8'TabOrder'#2#11#5'Value'#5#0#0#0#0#0#0 +#0#0#0#0#0#0#14'TFloatSpinEdit'#3'Zmm'#4'Left'#3#164#0#6'Height'#2#24#3'Top' +#2'{'#5'Width'#2'J'#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0 +#0#0#224#31#188#190#25'@'#8'MinValue'#5#0#0#0#0#224#31#188#190#25#192#8'TabO' +'rder'#2#12#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#9'TSpinEdit'#10'OffsetEdit'#4 +'Left'#3'V'#1#6'Height'#2#24#3'Top'#3#230#0#5'Width'#2'^'#8'MaxValue'#4'?B' +#15#0#6'OnExit'#7#13'ImageSzChange'#8'TabOrder'#2#14#5'Value'#2#1#0#0#9'TSpi' +'nEdit'#4'TDim'#4'Left'#2'P'#6'Height'#2#24#3'Top'#3#157#0#5'Width'#2'J'#8'M' +'axValue'#3#15''''#8'MinValue'#2#1#8'OnChange'#7#13'ImageSzChange'#6'OnExit' +#7#13'ImageSzChange'#8'TabOrder'#2#3#5'Value'#2#1#0#0#14'TFloatSpinEdit'#4'T' +'Sec'#4'Left'#3#164#0#6'Height'#2#24#3'Top'#3#157#0#5'Width'#2'J'#13'Decimal' +'Places'#2#4#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0 +#224#31#188#190#25'@'#8'MinValue'#5#0#0#0#0#224#31#188#190#25#192#8'TabOrder' +#2#13#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#9'TSpinEdit'#8'Dim5Edit'#4'Left'#2 +'P'#6'Height'#2#24#3'Top'#3#191#0#5'Width'#2'J'#8'MaxValue'#4#184#136#0#0#8 +'MinValue'#2#1#8'OnChange'#7#13'ImageSzChange'#6'OnExit'#7#13'ImageSzChange' +#8'TabOrder'#2#4#5'Value'#2#1#0#0#9'TSpinEdit'#8'Dim6Edit'#4'Left'#2'P'#6'He' +'ight'#2#24#3'Top'#3#223#0#5'Width'#2'J'#8'MaxValue'#4#184#136#0#0#8'MinValu' +'e'#2#1#8'OnChange'#7#13'ImageSzChange'#6'OnExit'#7#13'ImageSzChange'#8'TabO' +'rder'#2#5#5'Value'#2#1#0#0#9'TSpinEdit'#8'Dim7Edit'#4'Left'#2'P'#6'Height'#2 +#24#3'Top'#3#2#1#5'Width'#2'J'#8'MaxValue'#4#184#136#0#0#8'MinValue'#2#1#8'O' +'nChange'#7#13'ImageSzChange'#6'OnExit'#7#13'ImageSzChange'#8'TabOrder'#2#9#5 +'Value'#2#1#0#0#14'TFloatSpinEdit'#7'PixDim5'#4'Left'#3#164#0#6'Height'#2#24 +#3'Top'#3#191#0#5'Width'#2'J'#13'DecimalPlaces'#2#4#9'Increment'#5#0#0#0#0#0 +#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#224#31#188#190#25'@'#8'MinValue'#5#0#0 +#0#0#224#31#188#190#25#192#8'TabOrder'#2#6#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0 +#14'TFloatSpinEdit'#7'PixDim6'#4'Left'#3#164#0#6'Height'#2#24#3'Top'#3#223#0 +#5'Width'#2'J'#13'DecimalPlaces'#2#4#9'Increment'#5#0#0#0#0#0#0#0#128#255'?' +#8'MaxValue'#5#0#0#0#0#224#31#188#190#25'@'#8'MinValue'#5#0#0#0#0#224#31#188 +#190#25#192#8'TabOrder'#2#7#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#14'TFloatSpin' +'Edit'#7'PixDim7'#4'Left'#3#164#0#6'Height'#2#24#3'Top'#3#2#1#5'Width'#2'J' +#13'DecimalPlaces'#2#4#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5 +#0#0#0#0#224#31#188#190#25'@'#8'MinValue'#5#0#0#0#0#224#31#188#190#25#192#8 +'TabOrder'#2#8#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#0#9'TTabSheet'#9'TabSheet4' +#7'Caption'#6#8'Reorient'#12'ClientHeight'#3'R'#1#11'ClientWidth'#3#14#2#0#6 +'TLabel'#7'Label24'#4'Left'#2#10#6'Height'#2#17#3'Top'#3#184#0#5'Width'#2#9#7 +'Caption'#6#1'X'#11'ParentColor'#8#0#0#6'TLabel'#7'Label36'#4'Left'#2#10#6'H' +'eight'#2#17#3'Top'#3#218#0#5'Width'#2#10#7'Caption'#6#1'Y'#11'ParentColor'#8 +#0#0#6'TLabel'#7'Label37'#4'Left'#2#10#6'Height'#2#17#3'Top'#3#251#0#5'Width' +#2#9#7'Caption'#6#1'Z'#11'ParentColor'#8#0#0#6'TLabel'#7'Label39'#4'Left'#2 +#10#6'Height'#2#17#3'Top'#2'{'#5'Width'#2'7'#7'Caption'#6#9'Q Offsets'#11'Pa' +'rentColor'#8#0#0#6'TLabel'#7'Label40'#4'Left'#2#10#6'Height'#2#17#3'Top'#2 +'V'#5'Width'#2'I'#7'Caption'#6#11'Quaternions'#11'ParentColor'#8#0#0#6'TLabe' +'l'#7'Label46'#4'Left'#2#10#6'Height'#2#17#3'Top'#2'.'#5'Width'#2'^'#7'Capti' +'on'#6#17'qFactor [1 or -1]'#11'ParentColor'#8#0#0#6'TLabel'#7'Label38'#4'Le' +'ft'#2#4#6'Height'#2#17#3'Top'#2#9#5'Width'#3#141#0#7'Caption'#6#22'Quaterni' +'on parameters '#11'ParentColor'#8#0#0#6'TLabel'#7'Label47'#4'Left'#2#4#6'He' +'ight'#2#17#3'Top'#3#157#0#5'Width'#2'm'#7'Caption'#6#18'Affine parameters ' +#11'ParentColor'#8#0#0#9'TComboBox'#9'QFormDrop'#4'Left'#3#150#0#6'Height'#2 +#24#3'Top'#2#5#5'Width'#3#4#1#10'ItemHeight'#2#16#13'Items.Strings'#1#6#4'No' +'ne'#6#16'Scanner Position'#6#16'Coregistrationon'#6#14'Normalized Tal'#6#20 +'Normalzied mni152ach'#6#17'Normalzied mni152'#0#8'OnSelect'#7#21'HeaderMagi' +'cDropSelect'#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#19#0#0#9'TComboBox' +#9'SFormDrop'#4'Left'#3#145#0#6'Height'#2#24#3'Top'#3#150#0#5'Width'#3#204#0 +#10'ItemHeight'#2#16#13'Items.Strings'#1#6#4'None'#6#16'Scanner Position'#6 +#16'Coregistrationon'#6#14'Normalized Tal'#6#20'Normalzied mni152ach'#6#17'N' +'ormalzied mni152'#0#8'OnSelect'#7#21'HeaderMagicDropSelect'#5'Style'#7#14'c' +'sDropDownList'#8'TabOrder'#2#20#0#0#14'TFloatSpinEdit'#11'srow_x0Edit'#4'Le' +'ft'#2'"'#6'Height'#2#24#3'Top'#3#184#0#5'Width'#2'd'#13'DecimalPlaces'#2#5#9 +'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0'<'#156#12'@' ,#8'MinValue'#5#0#0#0#0#0#0'<'#156#12#192#8'TabOrder'#2#7#5'Value'#5#0#0#0#0#0 +#0#0#128#255'?'#0#0#14'TFloatSpinEdit'#11'srow_x1Edit'#4'Left'#3#142#0#6'Hei' +'ght'#2#24#3'Top'#3#184#0#5'Width'#2'd'#13'DecimalPlaces'#2#5#9'Increment'#5 +#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0'<'#156#12'@'#8'MinValue' +#5#0#0#0#0#0#0'<'#156#12#192#8'TabOrder'#2#8#5'Value'#5#0#0#0#0#0#0#0#128#255 +'?'#0#0#14'TFloatSpinEdit'#11'srow_x2Edit'#4'Left'#3#254#0#6'Height'#2#24#3 +'Top'#3#184#0#5'Width'#2'd'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0 +#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0'<'#156#12'@'#8'MinValue'#5#0#0#0#0#0 +#0'<'#156#12#192#8'TabOrder'#2#9#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14 +'TFloatSpinEdit'#11'srow_y0Edit'#4'Left'#2'"'#6'Height'#2#24#3'Top'#3#218#0#5 +'Width'#2'd'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8 +'MaxValue'#5#0#0#0#0#0#0'<'#156#12'@'#8'MinValue'#5#0#0#0#0#0#0'<'#156#12#192 +#8'TabOrder'#2#11#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14'TFloatSpinEdit' +#11'srow_y1Edit'#4'Left'#3#142#0#6'Height'#2#24#3'Top'#3#218#0#5'Width'#2'd' +#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5 +#0#0#0#0#0#0'<'#156#12'@'#8'MinValue'#5#0#0#0#0#0#0'<'#156#12#192#8'TabOrder' +#2#12#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14'TFloatSpinEdit'#11'srow_y2E' +'dit'#4'Left'#3#254#0#6'Height'#2#24#3'Top'#3#218#0#5'Width'#2'd'#13'Decimal' +'Places'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0 +#0'<'#156#12'@'#8'MinValue'#5#0#0#0#0#0#0'<'#156#12#192#8'TabOrder'#2#13#5'V' +'alue'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14'TFloatSpinEdit'#11'srow_z0Edit'#4'L' +'eft'#2'"'#6'Height'#2#24#3'Top'#3#251#0#5'Width'#2'd'#13'DecimalPlaces'#2#5 +#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0'<'#156#12 +'@'#8'MinValue'#5#0#0#0#0#0#0'<'#156#12#192#8'TabOrder'#2#15#5'Value'#5#0#0#0 +#0#0#0#0#128#255'?'#0#0#14'TFloatSpinEdit'#11'srow_z1Edit'#4'Left'#3#142#0#6 +'Height'#2#24#3'Top'#3#251#0#5'Width'#2'd'#13'DecimalPlaces'#2#5#9'Increment' +#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0'<'#156#12'@'#8'MinValu' +'e'#5#0#0#0#0#0#0'<'#156#12#192#8'TabOrder'#2#16#5'Value'#5#0#0#0#0#0#0#0#128 +#255'?'#0#0#14'TFloatSpinEdit'#11'srow_z2Edit'#4'Left'#3#254#0#6'Height'#2#24 +#3'Top'#3#251#0#5'Width'#2'd'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0 +#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0'<'#156#12'@'#8'MinValue'#5#0#0#0#0 +#0#0'<'#156#12#192#8'TabOrder'#2#17#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0 +#14'TFloatSpinEdit'#11'srow_x3Edit'#4'Left'#3'n'#1#6'Height'#2#24#3'Top'#3 +#184#0#5'Width'#2'd'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128 +#255'?'#8'MaxValue'#5#0#0#0#0#0#0'<'#156#12'@'#8'MinValue'#5#0#0#0#0#0#0'<' +#156#12#192#8'TabOrder'#2#10#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14'TFlo' +'atSpinEdit'#11'srow_y3Edit'#4'Left'#3'n'#1#6'Height'#2#24#3'Top'#3#218#0#5 +'Width'#2'd'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8 +'MaxValue'#5#0#0#0#0#0#0'<'#156#12'@'#8'MinValue'#5#0#0#0#0#0#0'<'#156#12#192 +#8'TabOrder'#2#14#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14'TFloatSpinEdit' +#11'srow_z3Edit'#4'Left'#3'n'#1#6'Height'#2#24#3'Top'#3#251#0#5'Width'#2'd' +#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5 +#0#0#0#0#0#0'<'#156#12'@'#8'MinValue'#5#0#0#0#0#0#0'<'#156#12#192#8'TabOrder' +#2#18#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14'TFloatSpinEdit'#13'quatern_' +'bEdit'#4'Left'#2'^'#6'Height'#2#24#3'Top'#2'P'#5'Width'#2'd'#13'DecimalPlac' +'es'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0#0 +#200#5'@'#8'MinValue'#5#0#0#0#0#0#0#0#0#0#0#8'TabOrder'#2#1#5'Value'#5#0#0#0 +#0#0#0#0#128#255'?'#0#0#14'TFloatSpinEdit'#13'quatern_cEdit'#4'Left'#3#212#0 +#6'Height'#2#24#3'Top'#2'P'#5'Width'#2'd'#13'DecimalPlaces'#2#5#9'Increment' +#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0#0#200#5'@'#8'MinValue' +#5#0#0#0#0#0#0#0#0#0#0#8'TabOrder'#2#2#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0 +#0#14'TFloatSpinEdit'#13'quatern_dEdit'#4'Left'#3'L'#1#6'Height'#2#24#3'Top' +#2'P'#5'Width'#2'd'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128 +#255'?'#8'MaxValue'#5#0#0#0#0#0#0#0#200#5'@'#8'MinValue'#5#0#0#0#0#0#0#0#0#0 +#0#8'TabOrder'#2#3#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14'TFloatSpinEdit' +#13'qoffset_xEdit'#4'Left'#2'^'#6'Height'#2#24#3'Top'#2'q'#5'Width'#2'd'#13 +'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0 +#0#0#0#0#0#200#5'@'#8'MinValue'#5#0#0#0#0#0#0#0#0#0#0#8'TabOrder'#2#4#5'Valu' +'e'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14'TFloatSpinEdit'#13'qoffset_yEdit'#4'Le' +'ft'#3#212#0#6'Height'#2#24#3'Top'#2'q'#5'Width'#2'd'#13'DecimalPlaces'#2#5#9 +'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0#0#200#5'@'#8 +'MinValue'#5#0#0#0#0#0#0#0#0#0#0#8'TabOrder'#2#5#5'Value'#5#0#0#0#0#0#0#0#128 +#255'?'#0#0#14'TFloatSpinEdit'#13'qoffset_zEdit'#4'Left'#3'L'#1#6'Height'#2 +#24#3'Top'#2'q'#5'Width'#2'd'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0 ,#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0#0#200#5'@'#8'MinValue'#5#0#0#0#0#0 +#0#0#0#0#0#8'TabOrder'#2#6#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14'TFloat' +'SpinEdit'#8'QFacEdit'#4'Left'#3#140#0#6'Height'#2#24#3'Top'#2'*'#5'Width'#2 +'d'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue' +#5#0#0#0#0#0#0#0#128#255'?'#8'MinValue'#5#0#0#0#0#0#0#0#128#255#191#8'TabOrd' +'er'#2#0#5'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#0#9'TTabSheet'#9'TabSheet3' +#7'Caption'#6#15'Image Intensity'#12'ClientHeight'#3'R'#1#11'ClientWidth'#3 +#14#2#0#6'TLabel'#7'Label12'#4'Left'#2#24#6'Height'#2#17#3'Top'#3#163#0#5'Wi' +'dth'#2':'#7'Caption'#6#7'Maximum'#11'ParentColor'#8#0#0#6'TLabel'#7'Label13' +#4'Left'#2#24#6'Height'#2#17#3'Top'#3#129#0#5'Width'#2'6'#7'Caption'#6#7'Min' +'imum'#11'ParentColor'#8#0#0#6'TLabel'#7'Label23'#4'Left'#2#24#6'Height'#2#17 +#3'Top'#2#28#5'Width'#2'%'#7'Caption'#6#5'Slope'#11'ParentColor'#8#0#0#6'TLa' +'bel'#7'Label22'#4'Left'#2#24#6'Height'#2#17#3'Top'#2'@'#5'Width'#2'4'#7'Cap' +'tion'#6#9'Intercept'#11'ParentColor'#8#0#0#6'TLabel'#7'Label30'#4'Left'#2#6 +#6'Height'#2#17#3'Top'#2#4#5'Width'#2'q'#7'Caption'#6#19'Calibration Scaling' +#11'ParentColor'#8#0#0#6'TLabel'#7'Label33'#4'Left'#2#6#6'Height'#2#17#3'Top' +#2'g'#5'Width'#3#192#0#7'Caption'#6' Display Range (calibrated units)'#11'Pa' +'rentColor'#8#0#0#14'TFloatSpinEdit'#4'cmax'#4'Left'#2'^'#6'Height'#2#24#3'T' +'op'#3#161#0#5'Width'#2'n'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0 +#128#255'?'#8'MaxValue'#5#0#0#0#0#224#31#188#190#25'@'#8'MinValue'#5#0#0#0#0 +#224#31#188#190#25#192#8'TabOrder'#2#3#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#14 +'TFloatSpinEdit'#4'cmin'#4'Left'#2'^'#6'Height'#2#24#3'Top'#2'}'#5'Width'#2 +'n'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue' +#5#0#0#0#0#224#31#188#190#25'@'#8'MinValue'#5#0#0#0#0#224#31#188#190#25#192#8 +'TabOrder'#2#2#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#14'TFloatSpinEdit'#5'Scale' +#4'Left'#2'^'#6'Height'#2#24#3'Top'#2#24#5'Width'#2'n'#13'DecimalPlaces'#2#5 +#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#224#31#188#190 +#25'@'#8'MinValue'#5#0#0#0#0#224#31#188#190#25#192#8'TabOrder'#2#0#5'Value'#5 +#0#0#0#0#0#0#0#0#0#0#0#0#14'TFloatSpinEdit'#9'Intercept'#4'Left'#2'^'#6'Heig' +'ht'#2#24#3'Top'#2'<'#5'Width'#2'n'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0 +#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#224#31#188#190#25'@'#8'MinValue' +#5#0#0#0#0#224#31#188#190#25#192#8'TabOrder'#2#1#5'Value'#5#0#0#0#0#0#0#0#0#0 +#0#0#0#0#9'TTabSheet'#9'TabSheet1'#7'Caption'#6#10'Statistics'#12'ClientHeig' +'ht'#3'R'#1#11'ClientWidth'#3#14#2#0#6'TLabel'#7'Label35'#4'Left'#2#8#6'Heig' +'ht'#2#17#3'Top'#2#14#5'Width'#2'2'#7'Caption'#6#9'Intention'#11'ParentColor' +#8#0#0#6'TLabel'#7'Label25'#4'Left'#2#24#6'Height'#2#17#3'Top'#2'.'#5'Width' +#2'J'#7'Caption'#6#11'Parameter 1'#11'ParentColor'#8#0#0#6'TLabel'#7'Label27' +#4'Left'#2#24#6'Height'#2#17#3'Top'#2'S'#5'Width'#2'J'#7'Caption'#6#11'Param' +'eter 2'#11'ParentColor'#8#0#0#6'TLabel'#7'Label28'#4'Left'#2#24#6'Height'#2 +#17#3'Top'#2'v'#5'Width'#2'J'#7'Caption'#6#11'Parameter 3'#11'ParentColor'#8 +#0#0#9'TComboBox'#14'IntentCodeDrop'#4'Left'#2'L'#6'Height'#2#24#3'Top'#2#8#5 +'Width'#3#218#0#13'DropDownCount'#2','#10'ItemHeight'#2#16#13'Items.Strings' +#1#6#14'Not statistics'#6#24'Correlation coefficient '#6#24'T-testation coef' +'ficient '#6#6'F-test'#6#7'Z-score'#6#11'Chi-squared'#6#11'Beta distri'#6#21 +'Binomial distribution'#6#18'Gamma distribution'#6#18'Gamma distribution'#6 +#19'Normal distribution'#6#22'Noncentral F statistic'#6#22'Noncentral chi-sq' +'uared'#6' Logistic distributiond statistic'#6#20'Laplace distribution'#6#20 +'Uniform distribution'#6#22'Noncentral t statistic'#6#20'Weibull distributio' +'n'#6#16'Chi distribution'#6#17'Inverse Gaussian '#6#20'Extreme value type I' +#6#20'p-value value type I'#6#11'ln(p-value)'#6#11'log10(p-val'#6#14'Estimat' +'evalue)'#6#8'Labelste'#6#6'NeuroN'#6#9'Generic M'#6#16'Symmetric Matrix'#6 +#25'Displacement Field/Vector'#6#25'Vectorcement Field/Vector'#6#6'Points'#6 +#15'Triangle (mesh)'#6#10'Quaternion'#0#5'Style'#7#14'csDropDownList'#8'TabO' +'rder'#2#3#0#0#14'TFloatSpinEdit'#13'intent_p1Edit'#4'Left'#2'n'#6'Height'#2 +#24#3'Top'#2'*'#5'Width'#3#138#0#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0 +#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#224#31#188#190#25'@'#8'MinValue'#5#0 +#0#0#0#224#31#188#190#25#192#8'TabOrder'#2#0#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0 +#0#14'TFloatSpinEdit'#13'intent_p2Edit'#4'Left'#2'n'#6'Height'#2#24#3'Top'#2 +'O'#5'Width'#3#138#0#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128 +#255'?'#8'MaxValue'#5#0#0#0#0#224#31#188#190#25'@'#8'MinValue'#5#0#0#0#0#224 +#31#188#190#25#192#8'TabOrder'#2#1#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#14'TFl' +'oatSpinEdit'#13'intent_p3Edit'#4'Left'#2'n'#6'Height'#2#24#3'Top'#2's'#5'Wi' +'dth'#3#138#0#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8 +'MaxValue'#5#0#0#0#0#224#31#188#190#25'@'#8'MinValue'#5#0#0#0#0#224#31#188 ,#190#25#192#8'TabOrder'#2#2#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#0#9'TTabSheet' +#9'TabSheet2'#7'Caption'#6#4'fMRI'#12'ClientHeight'#3'M'#1#11'ClientWidth'#3 +#18#2#0#6'TLabel'#7'Label11'#4'Left'#2#12#6'Height'#2#13#3'Top'#3#145#0#5'Wi' +'dth'#2'A'#7'Caption'#6#11'Slice Order'#11'ParentColor'#8#0#0#6'TLabel'#7'La' +'bel16'#4'Left'#2#12#6'Height'#2#13#3'Top'#2#8#5'Width'#2'?'#7'Caption'#6#11 +'Time Offset'#11'ParentColor'#8#0#0#6'TLabel'#7'Label17'#4'Left'#2#14#6'Heig' +'ht'#2#13#3'Top'#2''''#5'Width'#2'N'#7'Caption'#6#14'Slice duration'#11'Pare' +'ntColor'#8#0#0#6'TLabel'#7'Label32'#4'Left'#2#12#6'Height'#2#13#3'Top'#2'J' +#5'Width'#2':'#7'Caption'#6#11'Slice Start'#11'ParentColor'#8#0#0#6'TLabel'#7 +'Label20'#4'Left'#2#12#6'Height'#2#13#3'Top'#2'i'#5'Width'#2'7'#7'Caption'#6 +#9'Slice End'#11'ParentColor'#8#0#0#6'TLabel'#7'Label31'#4'Left'#2#12#6'Heig' +'ht'#2#13#3'Top'#3#178#0#5'Width'#2'|'#7'Caption'#6#19'Frequency Dimension' +#11'ParentColor'#8#0#0#6'TLabel'#7'Label43'#4'Left'#2#12#6'Height'#2#13#3'To' +'p'#3#214#0#5'Width'#2'b'#7'Caption'#6#15'Phase Dimension'#11'ParentColor'#8 +#0#0#6'TLabel'#7'Label45'#4'Left'#2#12#6'Height'#2#13#3'Top'#3#250#0#5'Width' +#2'['#7'Caption'#6#15'Slice Dimension'#11'ParentColor'#8#0#0#9'TComboBox'#13 +'SliceCodeDrop'#4'Left'#2'W'#6'Height'#2#24#3'Top'#3#137#0#5'Width'#3#159#0 +#10'ItemHeight'#2#16#13'Items.Strings'#1#6#7'Unknown'#6#21'Sequential Increa' +'sing'#6#21'Sequential Decreasing'#6#22'Alternating Increasing'#6#22'Alterna' +'ting Decreasing'#0#8'OnSelect'#7#13'ImageSzChange'#5'Style'#7#14'csDropDown' +'List'#8'TabOrder'#2#4#0#0#9'TComboBox'#11'FreqDimDrop'#4'Left'#3#146#0#6'He' +'ight'#2#24#3'Top'#3#174#0#5'Width'#2'd'#10'ItemHeight'#2#16#13'Items.String' +'s'#1#6#7'Unknown'#6#1'I'#6#1'J'#6#1'K'#0#8'OnSelect'#7#13'ImageSzChange'#5 +'Style'#7#14'csDropDownList'#8'TabOrder'#2#5#0#0#9'TComboBox'#12'PhaseDimDro' +'p'#4'Left'#3#146#0#6'Height'#2#24#3'Top'#3#210#0#5'Width'#2'd'#10'ItemHeigh' +'t'#2#16#13'Items.Strings'#1#6#7'Unknown'#6#1'I'#6#1'J'#6#1'K'#0#8'OnSelect' +#7#13'ImageSzChange'#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#6#0#0#9'TCo' +'mboBox'#12'SliceDimDrop'#4'Left'#3#146#0#6'Height'#2#24#3'Top'#3#246#0#5'Wi' +'dth'#2'd'#10'ItemHeight'#2#16#13'Items.Strings'#1#6#7'Unknown'#6#1'I'#6#1'J' +#6#1'K'#0#8'OnSelect'#7#13'ImageSzChange'#5'Style'#7#14'csDropDownList'#8'Ta' +'bOrder'#2#7#0#0#9'TSpinEdit'#15'slice_startEdit'#4'Left'#2'x'#6'Height'#2#22 +#3'Top'#2'F'#5'Width'#2'p'#8'TabOrder'#2#2#5'Value'#2#1#0#0#14'TFloatSpinEdi' +'t'#18'Slice_durationEdit'#4'Left'#2'x'#6'Height'#2#22#3'Top'#2'#'#5'Width'#2 +'p'#13'DecimalPlaces'#2#5#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue' +#5#0#0#0#0#0#0#0#200#5'@'#8'MinValue'#5#0#0#0#0#0#0#0#0#0#0#8'TabOrder'#2#1#5 +'Value'#5#0#0#0#0#0#0#0#128#255'?'#0#0#14'TFloatSpinEdit'#11'toffsetEdit'#4 +'Left'#2'x'#6'Height'#2#22#3'Top'#2#4#5'Width'#2'p'#13'DecimalPlaces'#2#5#9 +'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0#0#200#5'@'#8 +'MinValue'#5#0#0#0#0#0#0#0#0#0#0#8'TabOrder'#2#0#5'Value'#5#0#0#0#0#0#0#0#128 +#255'?'#0#0#9'TSpinEdit'#13'slice_endEdit'#4'Left'#2'x'#6'Height'#2#22#3'Top' +#2'e'#5'Width'#2'p'#8'TabOrder'#2#3#5'Value'#2#1#0#0#0#9'TTabSheet'#9'TabUnu' +'sed'#7'Caption'#6#8'Optional'#12'ClientHeight'#3'M'#1#11'ClientWidth'#3#18#2 +#0#6'TLabel'#7'Label34'#4'Left'#2#3#6'Height'#2#13#3'Top'#2'+'#5'Width'#2';' +#7'Caption'#6#9'Data Type'#11'ParentColor'#8#0#0#6'TLabel'#6'Label5'#4'Left' +#2#3#6'Height'#2#13#3'Top'#2#8#5'Width'#2'0'#7'Caption'#6#9'Intention'#11'Pa' +'rentColor'#8#0#0#6'TLabel'#6'Label6'#4'Left'#3#12#1#6'Height'#2#13#3'Top'#2 +'t'#5'Width'#2')'#7'Caption'#6#7'Extents'#11'ParentColor'#8#0#0#6'TLabel'#6 +'Label9'#4'Left'#3#12#1#6'Height'#2#13#3'Top'#2'L'#5'Width'#2'F'#7'Caption'#6 +#12'Sesion Error'#11'ParentColor'#8#0#0#6'TLabel'#7'Label10'#4'Left'#3#12#1#6 +'Height'#2#13#3'Top'#3#148#0#5'Width'#2'K'#7'Caption'#6#13'Regular [114]'#11 +'ParentColor'#8#0#0#6'TLabel'#7'Label14'#4'Left'#3#12#1#6'Height'#2#13#3'Top' +#2#8#5'Width'#2'#'#7'Caption'#6#5'G Min'#11'ParentColor'#8#0#0#6'TLabel'#7'L' +'abel15'#4'Left'#3#12#1#6'Height'#2#13#3'Top'#2'+'#5'Width'#2'&'#7'Caption'#6 +#5'G Max'#11'ParentColor'#8#0#0#6'TLabel'#7'Label18'#4'Left'#2#3#6'Height'#2 +#13#3'Top'#3#148#0#5'Width'#2'0'#7'Caption'#6#8'Aux File'#11'ParentColor'#8#0 +#0#6'TLabel'#7'Label19'#4'Left'#2#3#6'Height'#2#13#3'Top'#2'o'#5'Width'#2'6' +#7'Caption'#6#7'DB Name'#11'ParentColor'#8#0#0#6'TLabel'#7'Label26'#4'Left'#2 +#3#6'Height'#2#13#3'Top'#2'L'#5'Width'#2'!'#7'Caption'#6#5'Notes'#11'ParentC' +'olor'#8#0#0#5'TEdit'#15'intent_nameEdit'#4'Left'#2'L'#6'Height'#2#25#3'Top' +#2#6#5'Width'#3#152#0#9'MaxLength'#2#16#8'TabOrder'#2#0#4'Text'#6#11'intent_' +'name'#0#0#5'TEdit'#13'data_typeEdit'#4'Left'#2'L'#6'Height'#2#25#3'Top'#2')' +#5'Width'#3#152#0#9'MaxLength'#2#10#8'TabOrder'#2#1#4'Text'#6#9'data_type'#0 +#0#5'TEdit'#11'CommentEdit'#4'Left'#2'L'#6'Height'#2#25#3'Top'#2'J'#5'Width' +#3#152#0#9'MaxLength'#2'P'#8'TabOrder'#2#2#4'Text'#6#11'CommentEdit'#0#0#5'T' ,'Edit'#3'db_'#4'Left'#2'L'#6'Height'#2#25#3'Top'#2'm'#5'Width'#3#152#0#9'Max' +'Length'#2#18#8'TabOrder'#2#3#4'Text'#6#3'db_'#0#0#5'TEdit'#3'aux'#4'Left'#2 +'L'#6'Height'#2#25#3'Top'#3#148#0#5'Width'#3#152#0#9'MaxLength'#2#24#8'TabOr' +'der'#2#4#4'Text'#6#3'aux'#0#0#9'TSpinEdit'#4'gmax'#4'Left'#3'n'#1#6'Height' +#2#22#3'Top'#2')'#5'Width'#2'B'#8'TabOrder'#2#6#5'Value'#2#1#0#0#9'TSpinEdit' +#4'gmin'#4'Left'#3'n'#1#6'Height'#2#22#3'Top'#2#6#5'Width'#2'B'#8'TabOrder'#2 +#5#5'Value'#2#1#0#0#9'TSpinEdit'#3'ses'#4'Left'#3'n'#1#6'Height'#2#22#3'Top' +#2'J'#5'Width'#2'B'#8'TabOrder'#2#7#5'Value'#2#1#0#0#9'TSpinEdit'#3'ext'#4'L' +'eft'#3'n'#1#6'Height'#2#22#3'Top'#2'r'#5'Width'#2'B'#8'TabOrder'#2#8#5'Valu' +'e'#2#1#0#0#9'TSpinEdit'#3'reg'#4'Left'#3'n'#1#6'Height'#2#22#3'Top'#3#148#0 +#5'Width'#2'B'#8'MaxValue'#3#255#0#8'TabOrder'#2#9#5'Value'#2#1#0#0#0#0#10'T' +'StatusBar'#10'StatusBar1'#4'Left'#2#0#6'Height'#2#20#3'Top'#3'{'#1#5'Width' +#3#30#2#6'Panels'#14#1#5'Width'#3#140#0#0#1#5'Width'#2'2'#0#0#11'SimplePanel' +#8#0#0#9'TMainMenu'#9'MainMenu1'#4'left'#3#155#1#3'top'#2#6#0#9'TMenuItem'#5 +'File1'#7'Caption'#6#5'&File'#0#9'TMenuItem'#5'Open1'#7'Caption'#6#11'Open h' +'eader'#8'ShortCut'#3'O@'#7'OnClick'#7#10'Open1Click'#0#0#9'TMenuItem'#5'Sav' +'e1'#7'Caption'#6#11'Save header'#8'ShortCut'#3'S@'#7'OnClick'#7#10'Save1Cli' +'ck'#0#0#9'TMenuItem'#5'Exit1'#7'Caption'#6#12'Close window'#8'ShortCut'#3'W' +'@'#7'OnClick'#7#10'Exit1Click'#0#0#0#9'TMenuItem'#5'Page1'#7'Caption'#6#4'&' +'Tab'#0#9'TMenuItem'#11'Dimensions1'#7'Caption'#6#10'Dimensions'#8'ShortCut' +#3'A@'#7'OnClick'#7#12'TabMenuClick'#0#0#9'TMenuItem'#10'Rotations1'#3'Tag'#2 +#1#7'Caption'#6#8'Reorient'#8'ShortCut'#3'B@'#7'OnClick'#7#12'TabMenuClick'#0 +#0#9'TMenuItem'#15'ImageIntensity1'#3'Tag'#2#2#7'Caption'#6#15'Image Intensi' +'ty'#8'ShortCut'#3'C@'#7'OnClick'#7#12'TabMenuClick'#0#0#9'TMenuItem'#11'Sta' +'tistics1'#3'Tag'#2#3#7'Caption'#6#10'Statistics'#8'ShortCut'#3'D@'#7'OnClic' +'k'#7#12'TabMenuClick'#0#0#9'TMenuItem'#14'FunctionalMRI1'#3'Tag'#2#4#7'Capt' +'ion'#6#14'Functional MRI'#8'ShortCut'#3'E@'#7'OnClick'#7#12'TabMenuClick'#0 +#0#9'TMenuItem'#9'Optional1'#3'Tag'#2#5#7'Caption'#6#8'Optional'#8'ShortCut' +#3'F@'#7'OnClick'#7#12'TabMenuClick'#0#0#0#9'TMenuItem'#5'Help1'#7'Caption'#6 +#5'&Help'#0#9'TMenuItem'#6'About1'#7'Caption'#6#8'About...'#7'OnClick'#7#11 +'About1Click'#0#0#0#0#11'TOpenDialog'#10'OpenHdrDlg'#11'FilterIndex'#2#0#7'O' +'ptions'#11#15'ofFileMustExist'#0#4'left'#3#194#1#3'top'#2#6#0#0#11'TSaveDia' +'log'#10'SaveHdrDlg'#7'OnClose'#7#15'SaveHdrDlgClose'#5'Width'#2'4'#6'Filter' +#6'`NIfTI (*.hdr;*.nii)|*.hdr; *.nii|NIfTI separate header (*.hdr)|*.hdr|NIf' +'TI embedded header|*.nii'#11'FilterIndex'#2#0#4'left'#3#228#1#3'top'#2#6#0#0 +#0 ]); mricron-0.20120505.1~dfsg.1.orig/nifti_hdr_view.lfm0000664000175000017500000007427111645603144021367 0ustar michaelmichaelobject HdrForm: THdrForm Left = 476 Height = 418 Top = 380 Width = 542 ActiveControl = PageControl1 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'NIfTI Header Information' ClientHeight = 399 ClientWidth = 542 Constraints.MaxHeight = 418 Constraints.MaxWidth = 542 Constraints.MinHeight = 418 Constraints.MinWidth = 542 Font.Name = 'MS Sans Serif' Menu = MainMenu1 OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.30' object PageControl1: TPageControl Left = 4 Height = 371 Top = 4 Width = 534 ActivePage = TabRequired Align = alClient BorderSpacing.Left = 2 BorderSpacing.Top = 2 BorderSpacing.Right = 2 BorderSpacing.Bottom = 2 BorderSpacing.Around = 2 TabIndex = 0 TabOrder = 0 object TabRequired: TTabSheet Caption = 'Dimensions' ClientHeight = 342 ClientWidth = 526 object Label21: TLabel Left = 6 Height = 17 Top = 6 Width = 82 Caption = 'Header Type' ParentColor = False end object Label1: TLabel Left = 14 Height = 17 Top = 35 Width = 238 Caption = 'Dimension Length Spacing Unit' Font.Name = 'MS Sans Serif' ParentColor = False ParentFont = False end object Label2: TLabel Left = 16 Height = 17 Top = 67 Width = 47 Caption = 'I Space' ParentColor = False end object Label3: TLabel Left = 16 Height = 17 Top = 97 Width = 51 Caption = 'J Space' ParentColor = False end object Label4: TLabel Left = 16 Height = 17 Top = 131 Width = 52 Caption = 'K Space' ParentColor = False end object Label8: TLabel Left = 6 Height = 17 Top = 297 Width = 30 Caption = 'Data' ParentColor = False end object Label7: TLabel Left = 294 Height = 17 Top = 235 Width = 35 Caption = 'Offset' ParentColor = False end object Label44: TLabel Left = 16 Height = 17 Top = 166 Width = 32 Caption = 'Time' ParentColor = False end object Label29: TLabel Left = 16 Height = 17 Top = 198 Width = 45 Caption = '5th Dim' ParentColor = False end object Label41: TLabel Left = 16 Height = 17 Top = 230 Width = 45 Caption = '6th Dim' ParentColor = False end object Label42: TLabel Left = 16 Height = 17 Top = 265 Width = 45 Caption = '7th Dim' ParentColor = False end object HeaderMagicDrop: TComboBox Left = 108 Height = 24 Top = 2 Width = 239 ItemHeight = 16 Items.Strings = ( 'Unknown' 'ni1: NIfTI separate file (hdr+.img)' 'n+1: NIfTI embedded (.nii)' 'ni2: NIfTI2 separate file (hdr+.img)' 'n+2: NIfTI2 embedded (.nii)' ) OnSelect = HeaderMagicDropSelect Style = csDropDownList TabOrder = 15 end object Endian: TComboBox Left = 231 Height = 24 Top = 291 Width = 210 ItemHeight = 16 Items.Strings = ( 'Native Endian' 'Swapped Endian' ) Style = csDropDownList TabOrder = 16 end object fTypeDrop: TComboBox Left = 56 Height = 24 Top = 291 Width = 152 DropDownCount = 20 ItemHeight = 16 Items.Strings = ( 'binary' '8-bit S' '8-bit int U*' '16-bit int S*' '16-bit int U' '32-bit int S*' '32-bit int U' '64-bit int S' '64-bit int U' '32-bit real*' '64-bit real*' '128-bit real' '24-bit rgb' '64-bit com' '128-bit complex' '256-bit complex' ) OnSelect = ImageSzChange Style = csDropDownList TabOrder = 17 end object xyzt_sizeDrop: TComboBox Left = 262 Height = 24 Top = 87 Width = 128 ItemHeight = 16 Items.Strings = ( 'Unknown' 'Meter' 'Millimeter' 'Micrometer' 'Micron' ) Style = csDropDownList TabOrder = 18 end object xyzt_timeDrop: TComboBox Left = 262 Height = 24 Top = 157 Width = 128 ItemHeight = 16 Items.Strings = ( 'Unknown' 'Second' 'Millisecond' 'Microsecond' 'Hertzsecond' 'Part ' 'Part per million' ) Style = csDropDownList TabOrder = 19 end object Xdim: TSpinEdit Left = 80 Height = 24 Top = 59 Width = 74 MaxValue = 9999 MinValue = 1 OnExit = ImageSzChange TabOrder = 0 Value = 2 end object Ydim: TSpinEdit Left = 80 Height = 24 Top = 89 Width = 74 MaxValue = 9999 MinValue = 1 OnChange = ImageSzChange OnExit = ImageSzChange TabOrder = 1 Value = 2 end object Zdim: TSpinEdit Left = 80 Height = 24 Top = 123 Width = 74 MaxValue = 9999 MinValue = 1 OnChange = ImageSzChange OnExit = ImageSzChange TabOrder = 2 Value = 1 end object Xmm: TFloatSpinEdit Left = 164 Height = 24 Top = 59 Width = 74 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 10 Value = 0 end object Ymm: TFloatSpinEdit Left = 164 Height = 24 Top = 89 Width = 74 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 11 Value = 0 end object Zmm: TFloatSpinEdit Left = 164 Height = 24 Top = 123 Width = 74 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 12 Value = 0 end object OffsetEdit: TSpinEdit Left = 342 Height = 24 Top = 230 Width = 94 MaxValue = 999999 OnExit = ImageSzChange TabOrder = 14 Value = 1 end object TDim: TSpinEdit Left = 80 Height = 24 Top = 157 Width = 74 MaxValue = 9999 MinValue = 1 OnChange = ImageSzChange OnExit = ImageSzChange TabOrder = 3 Value = 1 end object TSec: TFloatSpinEdit Left = 164 Height = 24 Top = 157 Width = 74 DecimalPlaces = 4 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 13 Value = 0 end object Dim5Edit: TSpinEdit Left = 80 Height = 24 Top = 191 Width = 74 MaxValue = 35000 MinValue = 1 OnChange = ImageSzChange OnExit = ImageSzChange TabOrder = 4 Value = 1 end object Dim6Edit: TSpinEdit Left = 80 Height = 24 Top = 223 Width = 74 MaxValue = 35000 MinValue = 1 OnChange = ImageSzChange OnExit = ImageSzChange TabOrder = 5 Value = 1 end object Dim7Edit: TSpinEdit Left = 80 Height = 24 Top = 258 Width = 74 MaxValue = 35000 MinValue = 1 OnChange = ImageSzChange OnExit = ImageSzChange TabOrder = 9 Value = 1 end object PixDim5: TFloatSpinEdit Left = 164 Height = 24 Top = 191 Width = 74 DecimalPlaces = 4 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 6 Value = 0 end object PixDim6: TFloatSpinEdit Left = 164 Height = 24 Top = 223 Width = 74 DecimalPlaces = 4 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 7 Value = 0 end object PixDim7: TFloatSpinEdit Left = 164 Height = 24 Top = 258 Width = 74 DecimalPlaces = 4 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 8 Value = 0 end end object TabSheet4: TTabSheet Caption = 'Reorient' ClientHeight = 338 ClientWidth = 526 object Label24: TLabel Left = 10 Height = 17 Top = 184 Width = 9 Caption = 'X' ParentColor = False end object Label36: TLabel Left = 10 Height = 17 Top = 218 Width = 10 Caption = 'Y' ParentColor = False end object Label37: TLabel Left = 10 Height = 17 Top = 251 Width = 9 Caption = 'Z' ParentColor = False end object Label39: TLabel Left = 10 Height = 17 Top = 123 Width = 55 Caption = 'Q Offsets' ParentColor = False end object Label40: TLabel Left = 10 Height = 17 Top = 86 Width = 73 Caption = 'Quaternions' ParentColor = False end object Label46: TLabel Left = 10 Height = 17 Top = 46 Width = 94 Caption = 'qFactor [1 or -1]' ParentColor = False end object Label38: TLabel Left = 4 Height = 17 Top = 9 Width = 141 Caption = 'Quaternion parameters ' ParentColor = False end object Label47: TLabel Left = 4 Height = 17 Top = 157 Width = 109 Caption = 'Affine parameters ' ParentColor = False end object QFormDrop: TComboBox Left = 150 Height = 24 Top = 5 Width = 260 ItemHeight = 16 Items.Strings = ( 'None' 'Scanner Position' 'Coregistrationon' 'Normalized Tal' 'Normalzied mni152ach' 'Normalzied mni152' ) OnSelect = HeaderMagicDropSelect Style = csDropDownList TabOrder = 19 end object SFormDrop: TComboBox Left = 145 Height = 24 Top = 150 Width = 204 ItemHeight = 16 Items.Strings = ( 'None' 'Scanner Position' 'Coregistrationon' 'Normalized Tal' 'Normalzied mni152ach' 'Normalzied mni152' ) OnSelect = HeaderMagicDropSelect Style = csDropDownList TabOrder = 20 end object srow_x0Edit: TFloatSpinEdit Left = 34 Height = 24 Top = 184 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 7 Value = 1 end object srow_x1Edit: TFloatSpinEdit Left = 142 Height = 24 Top = 184 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 8 Value = 1 end object srow_x2Edit: TFloatSpinEdit Left = 254 Height = 24 Top = 184 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 9 Value = 1 end object srow_y0Edit: TFloatSpinEdit Left = 34 Height = 24 Top = 218 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 11 Value = 1 end object srow_y1Edit: TFloatSpinEdit Left = 142 Height = 24 Top = 218 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 12 Value = 1 end object srow_y2Edit: TFloatSpinEdit Left = 254 Height = 24 Top = 218 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 13 Value = 1 end object srow_z0Edit: TFloatSpinEdit Left = 34 Height = 24 Top = 251 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 15 Value = 1 end object srow_z1Edit: TFloatSpinEdit Left = 142 Height = 24 Top = 251 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 16 Value = 1 end object srow_z2Edit: TFloatSpinEdit Left = 254 Height = 24 Top = 251 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 17 Value = 1 end object srow_x3Edit: TFloatSpinEdit Left = 366 Height = 24 Top = 184 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 10 Value = 1 end object srow_y3Edit: TFloatSpinEdit Left = 366 Height = 24 Top = 218 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 14 Value = 1 end object srow_z3Edit: TFloatSpinEdit Left = 366 Height = 24 Top = 251 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 9999 MinValue = -9999 TabOrder = 18 Value = 1 end object quatern_bEdit: TFloatSpinEdit Left = 94 Height = 24 Top = 80 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 1 Value = 1 end object quatern_cEdit: TFloatSpinEdit Left = 212 Height = 24 Top = 80 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 2 Value = 1 end object quatern_dEdit: TFloatSpinEdit Left = 332 Height = 24 Top = 80 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 3 Value = 1 end object qoffset_xEdit: TFloatSpinEdit Left = 94 Height = 24 Top = 113 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 4 Value = 1 end object qoffset_yEdit: TFloatSpinEdit Left = 212 Height = 24 Top = 113 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 5 Value = 1 end object qoffset_zEdit: TFloatSpinEdit Left = 332 Height = 24 Top = 113 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 6 Value = 1 end object QFacEdit: TFloatSpinEdit Left = 140 Height = 24 Top = 42 Width = 100 DecimalPlaces = 5 Increment = 1 MaxValue = 1 MinValue = -1 TabOrder = 0 Value = 1 end end object TabSheet3: TTabSheet Caption = 'Image Intensity' ClientHeight = 338 ClientWidth = 526 object Label12: TLabel Left = 24 Height = 17 Top = 163 Width = 58 Caption = 'Maximum' ParentColor = False end object Label13: TLabel Left = 24 Height = 17 Top = 129 Width = 54 Caption = 'Minimum' ParentColor = False end object Label23: TLabel Left = 24 Height = 17 Top = 28 Width = 37 Caption = 'Slope' ParentColor = False end object Label22: TLabel Left = 24 Height = 17 Top = 64 Width = 52 Caption = 'Intercept' ParentColor = False end object Label30: TLabel Left = 6 Height = 17 Top = 4 Width = 113 Caption = 'Calibration Scaling' ParentColor = False end object Label33: TLabel Left = 6 Height = 17 Top = 103 Width = 192 Caption = 'Display Range (calibrated units)' ParentColor = False end object cmax: TFloatSpinEdit Left = 94 Height = 24 Top = 161 Width = 110 DecimalPlaces = 5 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 3 Value = 0 end object cmin: TFloatSpinEdit Left = 94 Height = 24 Top = 125 Width = 110 DecimalPlaces = 5 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 2 Value = 0 end object Scale: TFloatSpinEdit Left = 94 Height = 24 Top = 24 Width = 110 DecimalPlaces = 5 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 0 Value = 0 end object Intercept: TFloatSpinEdit Left = 94 Height = 24 Top = 60 Width = 110 DecimalPlaces = 5 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 1 Value = 0 end end object TabSheet1: TTabSheet Caption = 'Statistics' ClientHeight = 338 ClientWidth = 526 object Label35: TLabel Left = 8 Height = 17 Top = 14 Width = 50 Caption = 'Intention' ParentColor = False end object Label25: TLabel Left = 24 Height = 17 Top = 46 Width = 74 Caption = 'Parameter 1' ParentColor = False end object Label27: TLabel Left = 24 Height = 17 Top = 83 Width = 74 Caption = 'Parameter 2' ParentColor = False end object Label28: TLabel Left = 24 Height = 17 Top = 118 Width = 74 Caption = 'Parameter 3' ParentColor = False end object IntentCodeDrop: TComboBox Left = 76 Height = 24 Top = 8 Width = 218 DropDownCount = 44 ItemHeight = 16 Items.Strings = ( 'Not statistics' 'Correlation coefficient ' 'T-testation coefficient ' 'F-test' 'Z-score' 'Chi-squared' 'Beta distri' 'Binomial distribution' 'Gamma distribution' 'Gamma distribution' 'Normal distribution' 'Noncentral F statistic' 'Noncentral chi-squared' 'Logistic distributiond statistic' 'Laplace distribution' 'Uniform distribution' 'Noncentral t statistic' 'Weibull distribution' 'Chi distribution' 'Inverse Gaussian ' 'Extreme value type I' 'p-value value type I' 'ln(p-value)' 'log10(p-val' 'Estimatevalue)' 'Labelste' 'NeuroN' 'Generic M' 'Symmetric Matrix' 'Displacement Field/Vector' 'Vectorcement Field/Vector' 'Points' 'Triangle (mesh)' 'Quaternion' ) Style = csDropDownList TabOrder = 3 end object intent_p1Edit: TFloatSpinEdit Left = 110 Height = 24 Top = 42 Width = 138 DecimalPlaces = 5 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 0 Value = 0 end object intent_p2Edit: TFloatSpinEdit Left = 110 Height = 24 Top = 79 Width = 138 DecimalPlaces = 5 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 1 Value = 0 end object intent_p3Edit: TFloatSpinEdit Left = 110 Height = 24 Top = 115 Width = 138 DecimalPlaces = 5 Increment = 1 MaxValue = 99999999 MinValue = -99999999 TabOrder = 2 Value = 0 end end object TabSheet2: TTabSheet Caption = 'fMRI' ClientHeight = 333 ClientWidth = 530 object Label11: TLabel Left = 12 Height = 13 Top = 145 Width = 65 Caption = 'Slice Order' ParentColor = False end object Label16: TLabel Left = 12 Height = 13 Top = 8 Width = 63 Caption = 'Time Offset' ParentColor = False end object Label17: TLabel Left = 14 Height = 13 Top = 39 Width = 78 Caption = 'Slice duration' ParentColor = False end object Label32: TLabel Left = 12 Height = 13 Top = 74 Width = 58 Caption = 'Slice Start' ParentColor = False end object Label20: TLabel Left = 12 Height = 13 Top = 105 Width = 55 Caption = 'Slice End' ParentColor = False end object Label31: TLabel Left = 12 Height = 13 Top = 178 Width = 124 Caption = 'Frequency Dimension' ParentColor = False end object Label43: TLabel Left = 12 Height = 13 Top = 214 Width = 98 Caption = 'Phase Dimension' ParentColor = False end object Label45: TLabel Left = 12 Height = 13 Top = 250 Width = 91 Caption = 'Slice Dimension' ParentColor = False end object SliceCodeDrop: TComboBox Left = 87 Height = 24 Top = 137 Width = 159 ItemHeight = 16 Items.Strings = ( 'Unknown' 'Sequential Increasing' 'Sequential Decreasing' 'Alternating Increasing' 'Alternating Decreasing' ) OnSelect = ImageSzChange Style = csDropDownList TabOrder = 4 end object FreqDimDrop: TComboBox Left = 146 Height = 24 Top = 174 Width = 100 ItemHeight = 16 Items.Strings = ( 'Unknown' 'I' 'J' 'K' ) OnSelect = ImageSzChange Style = csDropDownList TabOrder = 5 end object PhaseDimDrop: TComboBox Left = 146 Height = 24 Top = 210 Width = 100 ItemHeight = 16 Items.Strings = ( 'Unknown' 'I' 'J' 'K' ) OnSelect = ImageSzChange Style = csDropDownList TabOrder = 6 end object SliceDimDrop: TComboBox Left = 146 Height = 24 Top = 246 Width = 100 ItemHeight = 16 Items.Strings = ( 'Unknown' 'I' 'J' 'K' ) OnSelect = ImageSzChange Style = csDropDownList TabOrder = 7 end object slice_startEdit: TSpinEdit Left = 120 Height = 22 Top = 70 Width = 112 TabOrder = 2 Value = 1 end object Slice_durationEdit: TFloatSpinEdit Left = 120 Height = 22 Top = 35 Width = 112 DecimalPlaces = 5 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 1 Value = 1 end object toffsetEdit: TFloatSpinEdit Left = 120 Height = 22 Top = 4 Width = 112 DecimalPlaces = 5 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 0 Value = 1 end object slice_endEdit: TSpinEdit Left = 120 Height = 22 Top = 101 Width = 112 TabOrder = 3 Value = 1 end end object TabUnused: TTabSheet Caption = 'Optional' ClientHeight = 333 ClientWidth = 530 object Label34: TLabel Left = 3 Height = 13 Top = 43 Width = 59 Caption = 'Data Type' ParentColor = False end object Label5: TLabel Left = 3 Height = 13 Top = 8 Width = 48 Caption = 'Intention' ParentColor = False end object Label6: TLabel Left = 268 Height = 13 Top = 116 Width = 41 Caption = 'Extents' ParentColor = False end object Label9: TLabel Left = 268 Height = 13 Top = 76 Width = 70 Caption = 'Sesion Error' ParentColor = False end object Label10: TLabel Left = 268 Height = 13 Top = 148 Width = 75 Caption = 'Regular [114]' ParentColor = False end object Label14: TLabel Left = 268 Height = 13 Top = 8 Width = 35 Caption = 'G Min' ParentColor = False end object Label15: TLabel Left = 268 Height = 13 Top = 43 Width = 38 Caption = 'G Max' ParentColor = False end object Label18: TLabel Left = 3 Height = 13 Top = 148 Width = 48 Caption = 'Aux File' ParentColor = False end object Label19: TLabel Left = 3 Height = 13 Top = 111 Width = 54 Caption = 'DB Name' ParentColor = False end object Label26: TLabel Left = 3 Height = 13 Top = 76 Width = 33 Caption = 'Notes' ParentColor = False end object intent_nameEdit: TEdit Left = 76 Height = 25 Top = 6 Width = 152 MaxLength = 16 TabOrder = 0 Text = 'intent_name' end object data_typeEdit: TEdit Left = 76 Height = 25 Top = 41 Width = 152 MaxLength = 10 TabOrder = 1 Text = 'data_type' end object CommentEdit: TEdit Left = 76 Height = 25 Top = 74 Width = 152 MaxLength = 80 TabOrder = 2 Text = 'CommentEdit' end object db_: TEdit Left = 76 Height = 25 Top = 109 Width = 152 MaxLength = 18 TabOrder = 3 Text = 'db_' end object aux: TEdit Left = 76 Height = 25 Top = 148 Width = 152 MaxLength = 24 TabOrder = 4 Text = 'aux' end object gmax: TSpinEdit Left = 366 Height = 22 Top = 41 Width = 66 TabOrder = 6 Value = 1 end object gmin: TSpinEdit Left = 366 Height = 22 Top = 6 Width = 66 TabOrder = 5 Value = 1 end object ses: TSpinEdit Left = 366 Height = 22 Top = 74 Width = 66 TabOrder = 7 Value = 1 end object ext: TSpinEdit Left = 366 Height = 22 Top = 114 Width = 66 TabOrder = 8 Value = 1 end object reg: TSpinEdit Left = 366 Height = 22 Top = 148 Width = 66 MaxValue = 255 TabOrder = 9 Value = 1 end end end object StatusBar1: TStatusBar Left = 0 Height = 20 Top = 379 Width = 542 Panels = < item Width = 140 end item Width = 50 end> SimplePanel = False end object MainMenu1: TMainMenu left = 411 top = 6 object File1: TMenuItem Caption = '&File' object Open1: TMenuItem Caption = 'Open header' ShortCut = 16463 OnClick = Open1Click end object Save1: TMenuItem Caption = 'Save header' ShortCut = 16467 OnClick = Save1Click end object Exit1: TMenuItem Caption = 'Close window' ShortCut = 16471 OnClick = Exit1Click end end object Page1: TMenuItem Caption = '&Tab' object Dimensions1: TMenuItem Caption = 'Dimensions' ShortCut = 16449 OnClick = TabMenuClick end object Rotations1: TMenuItem Tag = 1 Caption = 'Reorient' ShortCut = 16450 OnClick = TabMenuClick end object ImageIntensity1: TMenuItem Tag = 2 Caption = 'Image Intensity' ShortCut = 16451 OnClick = TabMenuClick end object Statistics1: TMenuItem Tag = 3 Caption = 'Statistics' ShortCut = 16452 OnClick = TabMenuClick end object FunctionalMRI1: TMenuItem Tag = 4 Caption = 'Functional MRI' ShortCut = 16453 OnClick = TabMenuClick end object Optional1: TMenuItem Tag = 5 Caption = 'Optional' ShortCut = 16454 OnClick = TabMenuClick end end object Help1: TMenuItem Caption = '&Help' object About1: TMenuItem Caption = 'About...' OnClick = About1Click end end end object OpenHdrDlg: TOpenDialog FilterIndex = 0 Options = [ofFileMustExist] left = 450 top = 6 end object SaveHdrDlg: TSaveDialog OnClose = SaveHdrDlgClose Width = 52 Filter = 'NIfTI (*.hdr;*.nii)|*.hdr; *.nii|NIfTI separate header (*.hdr)|*.hdr|NIfTI embedded header|*.nii' FilterIndex = 0 left = 484 top = 6 end end mricron-0.20120505.1~dfsg.1.orig/niftiview.ico0000664000175000017500000001731610332567524020367 0ustar michaelmichael  Ј6 ˆ о hf( @ €ќќќ ќќќќќ$"ќ|zќќќќ ќќќќќќќќ0*ќjaќќќќ+ ќˆќ‡ќќќќќќќ ќ/)ќќ ќќ>ќщќџќџ ќыќšќќќЄЖќќќќќќќБ ќџќџќљќњћџћџќ@љїњќ ќќќ42ќ42ќ43ќџџЄЖќќќќќmќтќџќќќ§ќџќўќќќќћЯџџњќ ќќќќќќќќDBќDBќDCќTfќќІИќ`jќќ‰ќуќџќџќќќџќўќџћџћўњџ/ўљ}И”џ“љќ “ќNќќќџџќќќќќDLќDLќDNќќAќ=#ќk#(ќхќџќџќћќ§ќўќџќўќџGќџњџећџђєџџ(џњџћџќџќќќЬќќћќќ‚ќ™ќ˜ќ› ќ™ ќоќџќџќџќџќћќ§ќџќўќџ#ќџ†ћџаћџџњџџјўџџџџўјњћњќњќњќ§ќџќеќ §Ј7ќщ^ќџqќџ{ќџƒќџ|ќџwќџmќћeќћUќћ<ќўќўќџќўќџ…ќџэћџџќџџњџјїџљџџњ‹џћџћџќџћўќўќџќћќџќaряџџћџџќћџћљџќњџќњџќљџќќџќџџќўџќџџќџеќџƒќџ ќџУћџџћџўќџјљџљњџћџџќ•џћџќџќџќџќџќџќўќџќќќџџЂ§§ќўњћўћќџћћўћќџћќџћќџњќџњќџњќџќќџџћџ џќџРЛћџџ њџіјџњјџћџџќљџћ€џќџќџќџќџќџќџќџќџќўќџќћћ}ћ§№ўўќџ§ћў§ќџўћџўќџўќџ§ћџ§ќџўћџ§ћџћћџrїљџџџјџїџџћџџќџџћЭџќIџќџќџќџќџќџќџќџќџќџќўќџќў§ЁўІџўџџўѕџўњџўќџўћџўќџўћџўњџўјџ§њџўўџУћџџ§ќџџјихџћЖџћaџќџќџќџќџќџќџќџќџќџќџќџќџќџќџ ў‘ўљўеўўџўўћўўїџўїџўїџўњџўџџўџџўџџ*§№џшќЉџўџZџњє(џќџќџќџќџќџќџќџќџќџќџќџќџќўќўќќќєўўŽў$ќўАњўјџўџџўџџўџџўўџўмџўБџўoџ>ў џўќџљџџњѓџћџќџќџќџќџќџќџќџќџќџќџќўќџќќќџќ/ўў~ўџўљў7ўўYўўeџўWџў@џўџўџўџMўџўћџїџџћсџќџќџќџќџќџќџќџќџќџќџќџќџќћќџќВќўўўŸўџўќўџўџўџўџўџўџўџdўџўћџїџџќНџќџќџќџќџќџќџќџќџќџќџќўќўќљќєќLќ ў  ў ўўєўћўўўўўџўџўџўџўџ{§џџњџјўџћЄџќџќџќџќџќџќџќџќџќџќўќџќћќџќЭќќ)ў)ўўў”ўўўјўџўџўџўџўџўџŸўџўљџјўџќџќџќџќџќџќџќџќџќўќџќўќїќ џќ,.мќ+-!ќ&(ќ,ў,"ў" ў ў $ ў ђўћў§ўўўўўџўџ§џЯ§џџњџљўџќOџќџќџќџќџќџќўќџќџќўќќќџќ мќ "ќ "ќvxќ#ў#ў ў .ў.›ўџўљўџўџўџўџ§џёњџў§џћкџќџќџќџќџќџќўќџќ§ќњќџќўќ™ќќќќuwќўў ў ўў›ўџўјўўўў§ўgўџ§њџњџџњyџќџќџќўќџќ§ќ§ќћќџќ џќфќ[ќќќќќZ\ўъўъўўўŸўџўј§§ўџВћўџџџїаџћ џќўќџќћќњќџќџќџќнќ„ќќprќќќќўўўўў›ўџўџ+ћћёўќўђќњ;ќќќќќќќќџќ џќэќрќgќќќџџџџўўў ў ў§кќџМјџўcџљџћ џќџќџќ ГќŽќ'ќќќ ќќўўў'ў'ў!-ќ'џ5kы<4џ/5ј 5њ5ќ4ќ5ќќќќќќ ќќ&ў&ў!,ќ'џnы;џ.ј њќќќќќќќўў §џё,џ5#љ ћќќќќќџџџџџџџџџџџџџџчџџџСџџџџџќџџ№џРР€€Ррр№№ј?ќџўџџџџџџџџџџџџџџџџџџџџџџџ(0 ` ќќќ ќќќќќќќ ќќќќќќ$"ќЎЈќќќќќ ќKќCќќќќ$&ќџџќќеЬќ ќ ќ ќ%ќ—ќџћџћМќј ђњ ќќќ42ќ42ќ64ќ*-ќџџќќ''ќ*,ќќV ќъќџќљќјќџћџџњ ќќќ‹‘ќ‹Mќ"ќ0ќ1ќ3ќ)/ќYbќBGќќUќЭќџќџќћћџћ§ћћўюUФ[џYљ Zќќќџџ3ќ4 ќ6$ќ"ќa++ќ`%(ќЭќџќџќћћ§ћџ'ќўpјџКўџшцџџџљџћџќъќ lќ  ќNћ‰)ќо 0ћн 0ќо ,ќёќџќџќџќќќ§ћў7ќўЉќў№јџџњўџїџџPўљћћћќњќџќ џќC ­ѕџдћџшќџіћџѕќџѓќџяќњъќњлћќ›ћў0ћўzћўћњџџіџ§џџїћџљ\џњџћџќўћџќ§ќ§ќ ьџЩџџќњџћ§џќќџћ§џќ§џћџџћўџћџџњџgёјџџ>љџњўџїџџћфџћNџћџћџќџќџќўќџќўќџњlфћюџќќџќјџќћџќћџќњџќјџћљџіџџтџџџ§Уџџљэџќ•џћ џћџќџќџќџќџќўќџќўќџ §Аўvљўџўўџўўўўўџџўџџ§џџўџџGќшџ§ўЁџћ№Yџћџћџќџќџќџќџќџќџќџќўќџќіў ўдў`џўбќўюџўяџўжџў џ§^џfќџўџџјяџћџќџќџќџќџќџќџќўќўќќќ§ќOў ў {ўќўћўўўўўџўџ§џ|ћџўџџїжџћџќџќџќџќџќџќўќџќћќ§ќОќўўўПўџўћўџўџўџўџ’њџўўџјКџќџќџќџќџќџќўќџќ§ќљќџќBќўўўDўћўљўўўў§џ§џЕљџў§џљšџћџќџќџќўќўќўќќќџќ џќ/1xќ.0ќ02ПўПўўўТўџўњўџўў §џрћџџџџњYџќџќўќўќўќќќќќџќяќxќ ќ ќџџџџў ў  ў ўжўџ§њ§џ@ћўћџўњйўњ џќўќ§ќћќќќџќ џќЦќ ќ ќ џџџџўўўўўзўџќћšќћџџћїOћћћќќќџќџќџќЦќ"$MќќJLќJLќќўўўўў §ПћџІќ џў€ џјџћџќџќвќ ŒќKќ ќ!#ќќўўў…ў…џџ ERѓ Pџ"OјPњPќJќ ќќќќ!#ќўўŠўŠџџ Qѓ!џ#ј њќќ ќќќ|ў|џ _ѕџ1 љ ћќќќќџџџџџџџџџџјџр?џ€ќ€€€Ррр№јќџџOџџџџџџџџџџ(  @ќќ ќќ ќќќќќ$&ќ48ќќќ ќќ ћќ ћ ыџі ќќ!ќќќ7<ќќќќ ќYќчћрћAџџі ќџќќ-ќ*3ќ'.ќќ: ћЌћџќџњџ џЭ,л*b›*ѕ ќћ%ћ$ ќ3 ћA ќ‚'ќ­ћџќџћќIі§џ§лЮџџџџџњ КќMOuњЭ’ћјЁћџЈќџžћџˆћџOњў0јћЦїўџџўџрџџ%§ћўљќќџќЬџкџџўџџј§џј§џјњџљќџџўцŠџўџџўјОџј"џњўћўќџћќќџњAгњз§њџўњџџњџўјџџn§рџџ№›џѕ Lџќџќџћџќџќўќўќџ§ 5ў#юўŒўўЇ§§џќNџ•ўџ§ъџїџћџќџќўќўќћќџќ^ўўvўџўњ§џћўЉўџўгџјџћўќўќўќљќџќСќ ў ў ўцўўўњљџЫ§ўџБўљўќ§ќћќќќџќ еќ+-ќ<>ўў ў L§§§ў#ћљѓџћ§Sћњќќџќџќћќ”ќќќўўў ўPћїdўџџ џјџћџќ хќЂќ2ќ ќќќў!ў!џ§ (Pњkў*iљjћPќ ќќ56ќќџџќўўџќ Xћ џ1љћ ќќќ13ќќўџќ Tћ џD љ ћ ќќќ(*џџџџџў№€€Рррјџџџџmricron-0.20120505.1~dfsg.1.orig/neurodebian.txt0000664000175000017500000000044611423561012020703 0ustar michaelmichaelThis project is described by BSD license - please see the file license.txt. This was written by Chris Rorden, with the exceptions of DiskSpaceKludge and GraphicsMathLibrary: The author of those units gave written permission to distribute this file under the same licensing terms as MRICRON. mricron-0.20120505.1~dfsg.1.orig/MultiSlice.pas0000664000175000017500000007076411641356272020454 0ustar michaelmichaelunit MultiSlice; interface {$mode delphi} uses {$IFNDEF Unix} Windows,wgraphics, {$ELSE} //not used by Darwin... RGBGraphics,rgbroutines, {$ENDIF} LResources,LCLType,SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls,nifti_img,define_types,nifti_img_view, StdCtrls,GraphicsMathLibrary, Menus,ClipBrd,IniFiles,userdir; const kMaxMultiSlice = 24; type TMultiSlice = record Orient,nSlices,OverslicePct: integer; OrthoView,SliceLabel: boolean; SliceList: array [1..kMaxMultiSlice] of integer; end;//TMultiSlice { TMultiSliceForm } TMultiSliceForm = class(TForm) MainMenu1: TMainMenu; File1: TMenuItem; Closewindow1: TMenuItem; Saveasbitmap1: TMenuItem; Edit1: TMenuItem; Copy1: TMenuItem; MultiPanel: TScrollBox; MultiImage: TImage; View1: TMenuItem; OrientMenu: TMenuItem; Axial1: TMenuItem; Sagittal1: TMenuItem; Coronal1: TMenuItem; Orthoview: TMenuItem; Slices1: TMenuItem; Savesettings1: TMenuItem; Settings1: TMenuItem; MultiSaveDialog: TSaveDialog; SliceLabelCheck: TMenuItem; OversliceMenu: TMenuItem; N501: TMenuItem; N331: TMenuItem; N201: TMenuItem; N01: TMenuItem; N202: TMenuItem; N351: TMenuItem; N502: TMenuItem; procedure Copy1Click(Sender: TObject); procedure MenuItem1Click(Sender: TObject); procedure Saveasbitmap1Click(Sender: TObject); procedure OrientClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure CreateMultiAx; procedure CreateMultiCor; procedure CreateMultiSag; procedure CreateMultiSlice; procedure OrthoviewClick(Sender: TObject); procedure Settings1Click(Sender: TObject); procedure Slices1Click(Sender: TObject); procedure Closewindow1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure UpdateMultiSliceDisplay; procedure OpenMultiMRU(Sender:TObject); procedure UpdateMultiSliceMRU; {$IFNDEF FPC} procedure FormClose(Sender: TObject; var Action: TCloseAction); {$ELSE} procedure FormClose(Sender: TObject); {$ENDIF} procedure Savesettings1Click(Sender: TObject); procedure SliceLabelCheckClick(Sender: TObject); procedure OverlsiceClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var MultiSliceForm: TMultiSliceForm; gMulti:TMultiSlice; gMultiSliceDir,gMultiSliceStartupFilename,gMultiSliceDefaultsFilename:string; {$IFDEF FPC} gMultiBuff: RGBQuadp; gMultiWid,gMultiHt: Integer; gMultiXCenterRA: array [1..kMaxMultiSlice] of integer; {$ENDIF} implementation {$IFNDEF FPC} {$R *.DFM} {$ENDIF} function MultiSliceNum2String: string; var lSlice: integer; begin if gMulti.nSlices = 0 then begin gMulti.nSlices := 1; gMulti.SliceList[1] := 1; end; result := ''; for lSlice := 1 to gMulti.nSlices do begin result := result+inttostr(gMulti.SliceList[lSlice]); if lSlice < gMulti.nSlices then result := result+','; end; //for each slice end; procedure MultiSliceString2Num (var lStr: string); var lSliceStr: string; lStrPos,lStrLen,lSlice: integer; begin //showmessage(lStr); lStrLen := length(lStr); if lStrLen < 1 then exit; lSlice := 0; lSliceStr := ''; for lStrPos := 1 to lStrLen do begin if lStr[lStrPos] in ['0'..'9'] then lSliceStr := lSliceStr+lStr[lStrPos]; if ((not (lStr[lStrPos] in ['0'..'9'])) or (lStrPos=lStrLen)) and (lSliceStr<>'') then begin inc(lSlice); if lSlice <= kMaxMultiSlice then gMulti.SliceList[lSlice] := strtoint(lSliceStr); lSliceStr := ''; end; //if white space or eoln end; //for lStrPos gMulti.nSlices := lSlice; if lSlice > kMaxMultiSlice then begin showmessage('Warning: maximum number of slices is '+inttostr(kMaxMultiSlice)); gMulti.nSlices := kMaxMultiSlice; end; end; procedure WriteMultiSliceIniFile (lFilename: string); var lIniFile: TIniFile; begin if DiskFreeEx(lFilename) < 1 then exit; if not DirectoryExists(extractfiledir(lFilename)) then begin mkDir(extractfiledir(lFilename)); end; lIniFile := TIniFile.Create(lFilename); //Slice Index lIniFile.WriteString('STR', 'Slices', MultiSliceNum2String); //Booleans lIniFile.WriteString('BOOL', 'OrthoView',Bool2Char( gMulti.OrthoView)); lIniFile.WriteString('BOOL', 'SliceLabel',Bool2Char( gMulti.SliceLabel)); //Integers LicenseID lIniFile.WriteString('INT', 'Orient',IntToStr(gMulti.Orient)); lIniFile.WriteString('INT', 'OverslicePct',IntToStr(gMulti.OverslicePct)); lIniFile.Free; end; procedure ReadMultiSliceIniFile (lFilename: string); var lStr: string; lIniFile: TIniFile; begin if not FileexistsEx(lFilename) then begin exit; end; lIniFile := TIniFile.Create(lFilename); lStr := lIniFile.ReadString('STR', 'Slices', '10,20,30');//file0 - last file viewed MultiSliceString2Num(lStr); gMulti.OrthoView := IniBool(lIniFile,'OrthoView',gMulti.OrthoView); gMulti.SliceLabel := IniBool(lIniFile,'SliceLabel',gMulti.SliceLabel); gMulti.Orient:= IniInt(lIniFile,'Orient',gMulti.Orient); gMulti.OverslicePct:= IniInt(lIniFile,'OverslicePct',gMulti.OverslicePct); lIniFile.Free; end; procedure TMultiSliceForm.OpenMultiMRU(Sender:TObject); var lFilename: string; begin lFilename := gMultiSliceDir +(Sender as TMenuItem).caption+'.ini' ; ReadMultiSliceIniFile(lFilename); UpdateMultiSliceDisplay; CreateMultiSlice; end; procedure TMultiSliceForm.UpdateMultiSliceMRU; var NewItem: TMenuItem; lSearchRec: TSearchRec; begin While Settings1.Count > 0 do Settings1.Items[0].Free; if FindFirst(gMultiSliceDir +'*.ini', faAnyFile, lSearchRec) = 0 then repeat NewItem := TMenuItem.Create(Self); NewItem.Caption := ParseFileName(ExtractFileName(lSearchRec.Name)); {$IFDEF FPC} NewItem.Onclick := OpenMultiMRU; //Lazarus {$ELSE} NewItem.Onclick := OpenMultiMRU; {$ENDIF} Settings1.Add(NewItem); until (FindNext(lSearchRec) <> 0); FindClose(lSearchRec); end; procedure TMultiSliceForm.Copy1Click(Sender: TObject); {$IFNDEF FPC} var MyFormat : Word; AData: THandle; APalette : HPalette; {$ENDIF} begin {$IFDEF Darwin} Showmessage('Copy not yet supported with OSX: use File/Save'); {$ENDIF} if (MultiImage.Picture.Graphic = nil) then begin //1420z Showmessage('You need to load an image before you can copy it to the clipboard.'); exit; end; {$IFNDEF FPC} MultiImage.Picture.Bitmap.SaveToClipBoardFormat(MyFormat,AData,APalette); ClipBoard.SetAsHandle(MyFormat,AData); {$ELSE} MultiSliceForm.MultiImage.Picture.Bitmap.SaveToClipboardFormat(2); {$ENDIF} end; procedure TMultiSliceForm.MenuItem1Click(Sender: TObject); begin end; procedure TMultiSliceForm.Saveasbitmap1Click(Sender: TObject); begin SaveImgAsPNGBMP (MultiImage); end; {$IFNDEF FPC} //if delphi... procedure CreateBlankBitmap (lPGHt,lPGWid:integer;var lImage: TImage); var sbBits : PByteArray; l32BitP: DWordp; lBGInvisibleColor: DWord; lBMP: TBitmap; lInc : integer; begin lBMP := TBitmap.Create; TRY lBMP.PixelFormat := pf32bit; lBMP.Width := lPGwid; lBMP.Height := lPGHt; sbBits := lBmp.ScanLine[lPGHt-1]; //FillChar(sbBits^,(lPGHt*lPGwid*4), 0); //FillChar fills with black, the next bit will fill current background color lBGInvisibleColor := gMRIcroOverlay[kBGOverlayNum].LUTinvisible; l32BitP := DWordp(sbBits); for lInc := 1 to (lPGwid*lPGHt) do l32BitP[lInc] := lBGInvisibleColor; lImage.Width := (lBmp.Width);//xx lImage.Height := (lBmp.Height);//xx lImage.Picture.Graphic := lBMP; FINALLY lBMP.Free; END; //try..finally end; //proc CreateBlankBitmap {$ELSE} //else freepascal procedure CreateBlankBitmap (lPGHt,lPGWid:integer;var lImage: TImage); var lPos: integer; lBGInvisibleColor: TRGBQuad; begin {$IFDEF ENDIAN_BIG} lBGInvisibleColor :=TColor2TRGBQuad(clBlack); {$ELSE} //lBGInvisibleColor := gMRIcroOverlay[kBGOverlayNum].LUTinvisible; lBGInvisibleColor := gMRIcroOverlay[kBGOverlayNum].LUT[0]; {$ENDIF} gMultiWid := lPGWid; gMultiHt := lPGHt; if (gMultiWid < 1) or (gMultiHt < 1) then exit; getmem (gMultiBuff, gMultiHt*gMultiWid*sizeof(TRGBQuad) ); //fillchar(gMultiBuff^,gMultiHt*gMultiWid*sizeof(TRGBQuad),0); for lPos := 1 to (gMultiHt*gMultiWid) do gMultiBuff^[lPos] := lBGInvisibleColor; end; {$ENDIF} procedure MultiHLine (lX1,lX2,lY1,lThick: integer; lClr: TRGBQuad); var lLine,lY,lYPos,lX,lXlo,lXhi: integer; begin if (lThick < 1) or (gMultiWid < 1) or (gMultiHt < 1) or (lY1 < 1) or (lY1 >gMultiHt) or (gMultiBuff = nil) then exit; lXlo := lX1; lXHi := lX2; SortInteger(lXlo,lXhi); if lXlo < 1 then lXlo := 1; if lXlo > gMultiWid then lXlo := gMultiWid; if lXhi < 1 then lXhi := 1; if lXhi > gMultiWid then lXhi := gMultiWid; lY := lY1-((lThick{+1}) div 2); for lLine := 1 to lThick do begin lYPos := (lY)*gMultiWid; if lY < gMultiHt then for lX := lXlo to lXhi do gMultiBuff^[lYPos+lX] := lClr; inc(lY); end; end; procedure MultiVLine (lX1,lY1,lY2,lThick: integer; lClr: TRGBQuad); var lXs, lX,lY,lYlo,lYhi: integer; begin if (lThick < 1) or (gMultiWid < 1) or (gMultiHt < 1) or (lX1 < 1) or (lX1 >gMultiWid) or (gMultiBuff = nil) then exit; lYlo := lY1; lYHi := lY2; SortInteger(lYlo,lYhi); if lYlo < 1 then lYlo := 1; if lYlo > gMultiHt then lYlo := gMultiHt; if lYhi < 1 then lYhi := 1; if lYhi > gMultiHt then lYhi := gMultiHt; lXs := lX1-((lThick{+1}) div 2)-2;//-2 as indexed from 0 and line is at least 1 pixel thick for lX := lXs to (lXs+lThick-1) do if (lX >= 0) and (lX < gMultiWid) then for lY := lYlo to lYHi do gMultiBuff^[((lY-1)*gMultiWid)+lX] := lClr; end; procedure DefineBackGround(var lBMP: DWordp; lBGInvisibleColor: DWord; lMaskHt,lMaskWid: integer); //lMaskP should have all invis voxels as 128, non as 255 //sets all invis boundary voxels to 0 var lMaskP: ByteP; lBGvisibleColor: DWord; lPos,lMaskSz, lQSz,lQHead,lQTail: integer; lQRA: LongIntp; Procedure IncQra(var lVal, lQSz: integer); begin inc(lVal); if lVal >= lQSz then lVal := 1; end; PROCEDURE RetirePixel; //FIFO cleanup VAR lVal,lPos: integer; BEGIN lVal := lQra^[lQTail]; lPos := lVal-1; if (lPos > 0) and (lMaskP^[lPos]=128) then begin//add item to left incQra(lQHead,lQSz); lMaskP^[lPos] := 0; lQra^[lQHead] := lPos; end; if (lPos > 0) then lMaskP^[lPos] := 0; lPos := lVal+1; if (lPos < lMaskSz) and (lMaskP^[lPos]=128) then begin//add item to right incQra(lQHead,lQSz); lMaskP^[lPos] := 0; lQra^[lQHead] := lPos; end; if (lPos < lMaskSz) then lMaskP^[lPos] := 0; lPos := lVal-lMaskWid; if (lPos > 0) and (lMaskP^[lPos]=128) then begin//add item above incQra(lQHead,lQSz); lMaskP^[lPos] := 0; lQra^[lQHead] := lPos; end; if (lPos > 0) then lMaskP^[lPos] := 0; lPos := lVal+lMaskWid; if (lPos < lMaskSz) and(lMaskP^[lPos]=128) then begin//add item below incQra(lQHead,lQSz); lMaskP^[lPos] := 0; lQra^[lQHead] := lPos; end; if (lPos < lMaskSz) then lMaskP^[lPos] := 0; incQra(lQTail,lQSz); //done with this pixel END; procedure FillStart (lPt: integer); {FIFO algorithm: keep memory VERY low} begin if (lPt < 1) or (lPt > lMaskSz) or (lMaskP^[lPt] <> 128) then exit; //lQSz := 8000;//size of FIFO Queue Array lQHead := 1; lQTail := 1; lQra^[lQTail] := (lPt); //NOTE: both X and Y start from 0 not 1 lMaskP^[lPt] := 0; RetirePixel; if lQHead >= lQTail then begin while lQHead <> lQTail do RetirePixel; end; end; begin //proc DefineBG lMaskSz := lMaskWid * lMaskHt; Getmem(lMaskP,lMaskSz); for lPos := 1 to lMaskSz do if lBMP^[lPos] = lBGInvisibleColor then lMaskP^[lPos] := 128 else lMaskP^[lPos] := 255; lQSz := lMaskSz div 4; GetMem(lQra,lQSz*sizeof(LongInt)); //erase all rows for lPos := 1 to lMaskHt do begin FillStart( (lPos-1)*lMaskWid + 1); FillStart( (lPos)*lMaskWid); end; //erase all cols for lPos := 1 to lMaskWid do begin FillStart( lPos + 1); FillStart( ((lMaskHt-1) *lMaskWid) + lPos); end; Freemem(lQRa); //make sure bright blue 0000FF becauses neighbor 0000FE instead of 000100 if (lBGInvisibleColor and 255) = 255 then lBGVisibleColor:= lBGInvisibleColor-1 else lBGVisibleColor:= lBGInvisibleColor+1; //now, fill in islands so they are not transparent for lPos := 1 to lMaskSz do if lMaskP^[lPos] = 128 then lBMP^[lPos] := lBGVisibleColor; Freemem(lMaskP); end; {$IFDEF FPC} //Delphi draws bitmaps directly, Lazarus can use two indirect methods... procedure SetDim (lInPGHt,lInPGWid,lWriteColumn: integer; var l32OutBitP : DWordp); var lLen,lSrc,lDest,lY: integer; lTBuff: RGBQuadp; begin getmem(lTBuff,lInPGHt*lWriteColumn*4); lLen := lWriteColumn*4; lSrc := 1; lDest := 1; for lY := 1 to lInPGHt do begin //svn Move(Pointer(l32OutBitP^[lSrc]),Pointer(lTBuff^[lDest]),lLen); Move(l32OutBitP^[lSrc],lTBuff^[lDest],lLen); lSrc := lSrc + lInPGWid; lDest := lDest + lWriteColumn; end; DrawBMP( lWriteColumn, lInPGHt, lTBuff, MultiSliceForm.MultiImage); freemem(lTBuff); end; {$ENDIF} //ifdef FPC procedure RemoveHorizGaps (lMaxOverlapWid,lColWid: integer); //will overlap gaps from 1..lMaxOverlapWid, leave right non-overlapped); var l32BitP,l32OutBitP : DWordp; lBGInvisibleColor,lBGInvisibleColorShr8: DWord; lIsGap,lPrevIsGap: boolean; lInc,lPrevSliceStart,lPrevSliceEnd,lPrevWriteColumn,lWid,lHt,lReadRow, lMaxWriteColumn,lReadColumn,lWriteColumn,lReadOffset,lWriteOffset,lPos,x,y: integer; lTextPos,lTextReadColumn: integer; begin (*freemem (gMultiBuff ); gMultiBuff := nil; exit;*) for lTextPos := 1 to kMaxMultiSlice do gMultiXCenterRA[lTextPos] := 0; lTextPos := 0; lTextReadColumn := lColWid div 2; if (gMultiWid < 1) or (gMultiHt < 1) or (gMultiBuff = nil) then exit; lBGInvisibleColor := TRGBQuad2DWord(gMRIcroOverlay[kBGOverlayNum].LUTinvisible); //fx(lBGInvisibleColor); //lBGInvisibleColorShr8 := lBGInvisibleColor Shr 8; lHt := gMultiHt;//MultiSliceForm.MultiImage.Picture.Bitmap.Height; lWid := gMultiWid; //MultiSliceForm.MultiImage.Picture.Bitmap.Width; if (lHt < 2) or (lWid < 2) then exit; //next: prepare input l32BitP := DWordP(gMultiBuff); (*GetMem(l32BitP,lHt*lWid*sizeof(DWord)); lPos := 0; for y:= 0 to (lHt-1) do begin for x:=0 to lWid-1 do begin inc(lPos); l32BitP^[lPos] := MultiSliceForm.MultiImage.Picture.Bitmap.Canvas.Pixels[x,y]; end; end;*) lBGInvisibleColor := l32BitP^[1]; DefineBackGround(l32BitP,lBGInvisibleColor, lHt,lWid); //next prepare output GetMem(l32OutBitP,lHt*lWid*sizeof(DWord)); for lInc := 1 to (lwid*lHt) do l32OutBitP^[lInc] := lBGInvisibleColor; //next: compress by deleting empty columns lWriteColumn := 0; lPrevIsGap := true; lPrevSliceStart := maxint -10; lPrevSliceEnd := 0; lPrevWriteColumn := maxint-10;//do not degap 1st line if gMulti.OverSlicePct = 0 then begin //simply remove gaps between slice for lReadColumn := 1 to lWid do begin lReadOffset := lReadColumn; lIsGap := true; lReadRow := 1; if lReadColumn >= lTextReadColumn then begin inc(lTextPos); lTextReadColumn := lTextReadColumn+lColWid; if lTextPos <= kMaxMultiSlice then gMultiXCenterRA[lTextPos] := lWriteColumn; end; while (lReadRow < lHt) and (lIsGap) do begin if l32BitP^[lReadOffset] <> lBGInvisibleColor then lIsGap := false; inc(lReadOffset,lWid); inc(lReadRow); end; //while each readrow if not lIsGap then begin//data in this column if lReadColumn > (lPrevWriteColumn+1) then begin //leave one pixel gap between noncontiguous columns inc(lWriteColumn); lReadOffset := lReadColumn-1; lWriteOffset := lWriteColumn; //showmessage(inttostr(lWriteColumn)+' '+inttostr(lReadOffset)); for lReadRow := 1 to lHt do begin l32OutBitP[lWriteOffset] := l32BitP[lReadOffset]; inc(lReadOffset,lWid); inc(lWriteOffset,lWid); end; end; //leave 1 pixel gap inc(lWriteColumn); lReadOffset := lReadColumn; lWriteOffset := lWriteColumn; for lReadRow := 1 to lHt do begin l32OutBitP[lWriteOffset] := l32BitP[lReadOffset]; inc(lReadOffset,lWid); inc(lWriteOffset,lWid); end; lPrevWriteColumn := lReadColumn; end; //not Gap - write this column end; //for each column end else begin //overslice <> 0: show subsequent slices above/below each other lMaxWriteColumn := -maxint; for lReadColumn := 1 to lMaxOverlapWid do begin lReadOffset := lReadColumn; lIsGap := true; lReadRow := 1; while (lReadRow < lHt) and (lIsGap) do begin //ovx if l32BitP^[lReadOffset] <> lBGInvisibleColor then lIsGap := false; inc(lReadOffset,lWid); inc(lReadRow); end; //while each readrow if (lPrevIsGap <> lIsGap) then begin//change from prev column if not (lIsGap) then begin //fx(lPrevSliceStart,lPrevSliceEnd,lReadColumn,abs(((lPrevSliceEnd-lPrevSliceStart) * gMulti.OverSlicePct)div 100)); if lPrevSliceEnd > lPrevSliceStart then lWriteColumn := lPrevSliceEnd-abs(((lPrevSliceEnd-lPrevSliceStart) * gMulti.OverSlicePct)div 100); lPrevSliceStart := lWriteColumn; end; if (lIsGap) then lPrevSliceEnd := lWriteColumn; end; lPrevIsGap := lIsGap; if gMulti.OverSlicePct > 0 then begin if not lIsGap then begin//data in this column inc(lWriteColumn); lReadOffset := lReadColumn; lWriteOffset := lWriteColumn; for lReadRow := 1 to lHt do begin if l32BitP^[lReadOffset] <> lBGInvisibleColor then l32OutBitP^[lWriteOffset] := l32BitP^[lReadOffset]; inc(lReadOffset,lWid); inc(lWriteOffset,lWid); end; end; //not Gap - write this column end else begin //if overwrite, else underwrite if not lIsGap then begin//data in this column inc(lWriteColumn); lReadOffset := lReadColumn; lWriteOffset := lWriteColumn; for lReadRow := 1 to lHt do begin if l32OutBitP^[lWriteOffset] = lBGInvisibleColor then l32OutBitP^[lWriteOffset] := l32BitP^[lReadOffset]; inc(lReadOffset,lWid); inc(lWriteOffset,lWid); end; end; //not Gap - write this column end; if lReadColumn >= lTextReadColumn then begin //text inc(lTextPos); lTextReadColumn := lTextReadColumn+lColWid; if lTextPos <= kMaxMultiSlice then gMultiXCenterRA[lTextPos] := lWriteColumn; end; //text if lWriteColumn > lMaxWriteColumn then lMaxWriteColumn := lWriteColumn; end; //for each column if lWriteColumn < lMaxWriteColumn then lWriteColumn := lMaxWriteColumn; if lMaxOverlapWid < lWid then begin lReadColumn := lMaxOverlapWid; if (lWriteColumn) < lReadColumn then //add gap if some compression inc(lWriteColumn); for lReadColumn := (lMaxOverlapWid+1) to lWid do begin lReadOffset := lReadColumn; lIsGap := true; lReadRow := 1; while (lReadRow < lHt) and (lIsGap) do begin if l32BitP^[lReadOffset] <> lBGInvisibleColor then lIsGap := false; inc(lReadOffset,lWid); inc(lReadRow); end; //while each readrow if not lIsGap then begin inc(lWriteColumn); lReadOffset := lReadColumn; lWriteOffset := lWriteColumn; for lReadRow := 1 to lHt do begin l32OutBitP[lWriteOffset] := l32BitP[lReadOffset]; inc(lReadOffset,lWid); inc(lWriteOffset,lWid); end; //for each row end; //not gap end; //for each column if (lWriteColumn+1) < lWid then inc(lWriteColumn); end; //if maxwid < wid - unoverlapped end; SetDim (lHt,lWid,lWriteColumn,l32OutBitP); FreeMem(l32OutBitP); freemem (gMultiBuff ); gMultiBuff := nil; end; procedure TMultiSliceForm.CreateMultiSag; var lSlice,lHt,lWid,lSlicePos,lSliceWid: integer; begin lHt:= gBGIMg.ScrnDim[3]; lSliceWid :=gBGIMg.ScrnDim[2]+2;//+1 for 1-voxel gap between slices - ensures we can detect slice boundary lWid := (lSliceWid*gMulti.nSlices); if lWid < 2 then exit; if gMulti.OrthoView then //coro crossview lWid := lWid + gBGIMg.ScrnDim[1]+2; if lWid < 2 then exit; CreateBlankBitmap (lHt,lWid, MultiImage); for lSlice := 1 to gMulti.nSlices do begin DrawSag (gMulti.SliceList[lSlice],1+((lSlice-1)*lSliceWid));//+lSlice because we want 1-voxel gap between slices //if gMulti.SliceLabel then DrawLabel(MultiImage,DimToMM(gMulti.SliceList[lSlice],1),((lSlice-1)*lSliceWid)+(lSliceWid div 2),lWid); end; if gMulti.OrthoView then begin //coro crossview DrawCor (gBGImg.ScrnDim[2] div 2,(lSliceWid*gMulti.nSlices)-1); //MultiImage.Canvas.Pen.Color := clWhite; //MultiImage.Canvas.Pen.Color := gBGIMg.XBarClr; //MultiImage.Canvas.Pen.Width := gBGImg.XBarThick; for lSlice := 1 to gMulti.nSlices do begin //draw lines lSlicePos := (gMulti.nSlices*lSliceWid)+(gMulti.SliceList[lSlice]); MultiVLine (lSlicePos,0,lHt,gBGImg.XBarThick,TColor2TRGBQuad(gBGImg.XBarClr)); {MultiImage.Canvas.MoveTo(lSlicePos,0); MultiImage.Canvas.LineTo(lSlicePos,lHt);} end;//line for each slice end;//if cross view RemoveHorizGaps(lSliceWid*gMulti.nSlices,lSliceWid); end; //CreateMultiSag procedure TMultiSliceForm.CreateMultiCor; var lSlice,lHt,lWid,lLeft,lSliceWid: integer; begin lHt:= gBGIMg.ScrnDim[3]; lSliceWid :=gBGIMg.ScrnDim[1]+2;//+1 for 1-voxel gap between slices - ensures we can detect slice boundary lWid := lSliceWid*gMulti.nSlices; if lWid < 2 then exit; if gMulti.OrthoView then //sag crossview lWid := lWid + gBGIMg.ScrnDim[2]+2; if lWid < 2 then exit; CreateBlankBitmap (lHt,lWid, MultiImage); for lSlice := 1 to gMulti.nSlices do begin //ImgForm.YViewEdit.value := gMulti.SliceList[lSlice]; DrawCor (gMulti.SliceList[lSlice],1+((lSlice-1)*lSliceWid)); //if gMulti.SliceLabel then DrawLabel(MultiImage,DimToMM(gMulti.SliceList[lSlice],2),((lSlice-1)*lSliceWid)+(gBGIMg.ScrnDim[1] div 2),lWid); end; if gMulti.OrthoView then begin DrawSag (gBGImg.ScrnDim[1] div 2,(gMulti.nSlices*lSliceWid)-1); //MultiImage.Canvas.Pen.Color := gBGIMg.XBarClr; //MultiImage.Canvas.Pen.Color := clWhite; MultiImage.Canvas.Pen.Color := gBGIMg.XBarClr; MultiImage.Canvas.Pen.Width := gBGImg.XBarThick; for lSlice := 1 to gMulti.nSlices do begin lLeft := gMulti.nSlices*lSliceWid+(gMulti.SliceList[lSlice]); MultiVLine (lLeft,0,lHt,gBGImg.XBarThick,TColor2TRGBQuad(gBGImg.XBarClr)); {MultiImage.Canvas.MoveTo(lLeft,0); MultiImage.Canvas.LineTo(lLeft,lHt);} end; end;//if orthoview RemoveHorizGaps(lSliceWid*gMulti.nSlices,lSliceWid); end; //CreateMultiCor procedure TMultiSliceForm.CreateMultiAx; var lSliceWid,lSlice,lHt,lWid,lLeft: integer; begin lHt:= gBGIMg.ScrnDim[2]; lSliceWid :=gBGIMg.ScrnDim[1]+2;//+1 for 1-voxel gap between slices - ensures we can detect slice boundary lWid := lSliceWid*gMulti.nSlices; if lWid < 2 then exit; if gMulti.OrthoView then begin //sag crossview lWid := lWid + gBGIMg.ScrnDim[2]+2; if gBGIMg.ScrnDim[3]> lHt then lHt := gBGIMg.ScrnDim[3]; end; if lWid < 2 then exit; CreateBlankBitmap (lHt,lWid, MultiImage); for lSlice := 1 to gMulti.nSlices do begin DrawAxial (gMulti.SliceList[lSlice],1+((lSlice-1)*lSliceWid)); //if gMulti.SliceLabel then DrawLabel(MultiImage,DimToMM(gMulti.SliceList[lSlice],3),((lSlice-1)*lSliceWid)+(gBGIMg.ScrnDim[1] div 2),lWid); end; if gMulti.OrthoView then begin lLeft := gMulti.nSlices*lSliceWid; //DrawSag (gBGImg.ScrnDim[1] div 2,lLeft); DrawSag (gBGImg.ScrnDim[1] div 2,lLeft-1); //MultiImage.Canvas.pen.Color := clWhite; //MultiImage.Canvas.Pen.Color := gBGIMg.XBarClr; //MultiImage.Canvas.Pen.Width := gBGImg.XBarThick; for lSlice := 1 to gMulti.nSlices do begin lHt := gBGImg.ScrnDim[3]-(gMulti.SliceList[lSlice]); MultiHLine (lLeft,lWid,lHt,gBGImg.XBarThick,TColor2TRGBQuad(gBGImg.XBarClr)); end; end; RemoveHorizGaps(lSliceWid*gMulti.nSlices,lSliceWid); end; //CreateMultiAx procedure DrawLabels; var lSlice,lOrient: integer; begin case gMulti.Orient of 3: lOrient := 2; 2: lOrient := 1; else lOrient := 3; end;//case if not gMulti.SliceLabel then exit; for lSlice := 1 to gMulti.nSlices do begin if gMultiXCenterRA[lSlice] > 0 then DrawLabel(MultiSliceForm.MultiImage,DimToMM(gMulti.SliceList[lSlice],gMulti.SliceList[lSlice],gMulti.SliceList[lSlice],lOrient),gMultiXCenterRA[lSlice],maxint); end; end; //gMultiXCenterRA procedure TMultiSliceForm.CreateMultiSlice; //test var lI: integer; begin if gMulti.nSlices < 1 then begin showmessage('No valid slices selected - please use View/Slices.'); end; //MultiImage.Canvas.Font.Color := clWhite; //for lI := 1 to 32 do begin //test case gMulti.Orient of 3: CreateMultiCor; 2: CreateMultiSag; else CreateMultiAx; end;//case DrawLabels; // end; //test end;//CreateMultiSlice procedure TMultiSliceForm.OrientClick(Sender: TObject); begin (sender as TMenuItem).checked := true; gMulti.Orient := (sender as TMenuItem).tag; CreateMultiSlice; end; procedure TMultiSliceForm.FormShow(Sender: TObject); begin ReadMultiSliceIniFile (gMultiSliceStartupFilename ); UpdateMultiSliceMRU; UpdateMultiSliceDisplay; CreateMultiSlice; MultiSliceForm.BringToFront; end; procedure TMultiSliceForm.OrthoviewClick(Sender: TObject); begin OrthoView.checked := not OrthoView.Checked; gMulti.OrthoView := OrthoView.checked; CreateMultiSlice; end; procedure TMultiSliceForm.Settings1Click(Sender: TObject); begin end; procedure TMultiSliceForm.Slices1Click(Sender: TObject); var lStr: string; begin lStr := InputBox('Select multislices', 'Slice numbers [e.g. 10,16,24]',MultiSliceNum2String); //now parse line MultiSliceString2Num(lStr); CreateMultiSlice; end; procedure TMultiSliceForm.Closewindow1Click(Sender: TObject); begin MultiSliceForm.Close; end; procedure TMultiSliceForm.UpdateMultiSliceDisplay; begin SetSubmenuWithTag(OversliceMenu, gMulti.OverslicePct); SetSubmenuWithTag(OrientMenu, gMulti.Orient); OrthoView.Checked := gMulti.OrthoView; SliceLabelCheck.Checked := gMulti.SliceLabel; end; procedure TMultiSliceForm.FormCreate(Sender: TObject); var lSlice:integer; begin gMultiBuff := nil; gMultiSliceDir := DefaultsDir('multislice'); //gMultiSliceDir := extractfiledir(paramstr(0))+pathdelim+'multislice'+pathdelim; gMultiSliceDefaultsFilename := gMultiSliceDir + 'default.ini'; gMultiSliceStartupFilename := gMultiSliceDefaultsFilename; gMulti.Orient := 1; gMulti.OverslicePct := 0; gMulti.nSlices:= 4; gMulti.OrthoView := true; gMulti.SliceLabel := true; for lSlice := 1 to gMulti.nSlices do gMulti.SliceList[lSlice] := 62+10*lSlice; end; {$IFNDEF FPC} procedure TMultiSliceForm.FormClose(Sender: TObject; var Action: TCloseAction); {$ELSE} procedure TMultiSliceForm.FormClose(Sender: TObject); {$ENDIF} begin WriteMultiSliceIniFile (gMultiSliceDefaultsFilename ); end; procedure TMultiSliceForm.Savesettings1Click(Sender: TObject); begin MultiSaveDialog.InitialDir := extractfiledir(gMultiSliceDir ); if not MultiSaveDialog.Execute then exit; {$IFDEF Unix} WriteMultiSliceIniFile(extractfiledir(gMultiSliceDir)+pathdelim+extractfilename(MultiSaveDialog.Filename)); {$ELSE} WriteMultiSliceIniFile(MultiSaveDialog.Filename); {$ENDIF} UpdateMultiSliceMRU; end; procedure TMultiSliceForm.SliceLabelCheckClick(Sender: TObject); begin SliceLabelCheck.checked := not SliceLabelCheck.Checked; gMulti.SliceLabel := SliceLabelCheck.checked; CreateMultiSlice; end; procedure TMultiSliceForm.OverlsiceClick(Sender: TObject); begin (sender as TMenuItem).checked := true; gMulti.OverslicePct := (sender as TMenuItem).tag; CreateMultiSlice; end; {$IFDEF FPC} initialization {$I MultiSlice.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/MultiSlice.lrs0000664000175000017500000000721411424002512020437 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TMultiSliceForm','FORMDATA',[ 'TPF0'#15'TMultiSliceForm'#14'MultiSliceForm'#4'Left'#3#237#1#6'Height'#3#242 +#0#3'Top'#3'$'#1#5'Width'#3#233#2#7'Caption'#6#10'MultiSlice'#12'ClientHeigh' +'t'#3#223#0#11'ClientWidth'#3#233#2#11'Font.Height'#2#245#9'Font.Name'#6#13 +'MS Sans Serif'#4'Menu'#7#9'MainMenu1'#7'OnClose'#7#9'FormClose'#8'OnCreate' +#7#10'FormCreate'#6'OnShow'#7#8'FormShow'#8'Position'#7#14'poScreenCenter'#10 +'LCLVersion'#6#6'0.9.29'#0#10'TScrollBox'#10'MultiPanel'#4'Left'#2#0#6'Heigh' +'t'#3#223#0#3'Top'#2#0#5'Width'#3#233#2#5'Align'#7#8'alClient'#12'ClientHeig' +'ht'#3#219#0#11'ClientWidth'#3#229#2#8'TabOrder'#2#0#0#6'TImage'#10'MultiIma' +'ge'#3'Tag'#2#2#6'Cursor'#7#7'crCross'#4'Left'#2#2#6'Height'#2#12#3'Top'#2#2 +#5'Width'#2#12#8'AutoSize'#9#7'Stretch'#9#0#0#0#9'TMainMenu'#9'MainMenu1'#4 +'left'#2'('#3'top'#2#8#0#9'TMenuItem'#5'File1'#7'Caption'#6#4'File'#0#9'TMen' +'uItem'#9'Settings1'#7'Caption'#6#13'Open settings'#7'OnClick'#7#14'Settings' +'1Click'#0#0#9'TMenuItem'#13'Savesettings1'#7'Caption'#6#13'Save settings'#8 +'ShortCut'#3'S@'#7'OnClick'#7#18'Savesettings1Click'#0#0#9'TMenuItem'#13'Sav' +'easbitmap1'#7'Caption'#6#17'Save as bitmap...'#7'OnClick'#7#18'Saveasbitmap' +'1Click'#0#0#9'TMenuItem'#12'Closewindow1'#7'Caption'#6#12'Close window'#8'S' +'hortCut'#3'W@'#7'OnClick'#7#17'Closewindow1Click'#0#0#0#9'TMenuItem'#5'Edit' +'1'#7'Caption'#6#4'Edit'#0#9'TMenuItem'#5'Copy1'#7'Caption'#6#4'Copy'#8'Shor' +'tCut'#3'C@'#7'OnClick'#7#10'Copy1Click'#0#0#0#9'TMenuItem'#5'View1'#7'Capti' +'on'#6#4'View'#0#9'TMenuItem'#10'OrientMenu'#7'Caption'#6#6'Orient'#0#9'TMen' +'uItem'#9'Sagittal1'#3'Tag'#2#2#7'Caption'#6#8'Sagittal'#10'GroupIndex'#3#129 +#0#9'RadioItem'#9#7'OnClick'#7#11'OrientClick'#0#0#9'TMenuItem'#8'Coronal1'#3 +'Tag'#2#3#7'Caption'#6#7'Coronal'#10'GroupIndex'#3#129#0#9'RadioItem'#9#7'On' +'Click'#7#11'OrientClick'#0#0#9'TMenuItem'#6'Axial1'#3'Tag'#2#1#7'Caption'#6 +#5'Axial'#7'Checked'#9#10'GroupIndex'#3#129#0#9'RadioItem'#9#7'OnClick'#7#11 +'OrientClick'#0#0#0#9'TMenuItem'#13'OversliceMenu'#7'Caption'#6#9'Overslice' +#0#9'TMenuItem'#4'N501'#3'Tag'#2#206#7'Caption'#6#4'-50%'#10'GroupIndex'#3 +#158#0#9'RadioItem'#9#7'OnClick'#7#14'OverlsiceClick'#0#0#9'TMenuItem'#4'N33' +'1'#3'Tag'#2#221#7'Caption'#6#4'-35%'#10'GroupIndex'#3#158#0#9'RadioItem'#9#7 +'OnClick'#7#14'OverlsiceClick'#0#0#9'TMenuItem'#4'N201'#3'Tag'#2#236#7'Capti' +'on'#6#4'-20%'#10'GroupIndex'#3#158#0#9'RadioItem'#9#7'OnClick'#7#14'Overlsi' +'ceClick'#0#0#9'TMenuItem'#3'N01'#7'Caption'#6#2'0%'#7'Checked'#9#10'GroupIn' +'dex'#3#158#0#9'RadioItem'#9#7'OnClick'#7#14'OverlsiceClick'#0#0#9'TMenuItem' +#4'N202'#3'Tag'#2#20#7'Caption'#6#3'20%'#10'GroupIndex'#3#158#0#9'RadioItem' +#9#7'OnClick'#7#14'OverlsiceClick'#0#0#9'TMenuItem'#4'N351'#3'Tag'#2'#'#7'Ca' +'ption'#6#3'35%'#10'GroupIndex'#3#158#0#9'RadioItem'#9#7'OnClick'#7#14'Overl' +'siceClick'#0#0#9'TMenuItem'#4'N502'#3'Tag'#2'2'#7'Caption'#6#3'50%'#10'Grou' +'pIndex'#3#158#0#9'RadioItem'#9#7'OnClick'#7#14'OverlsiceClick'#0#0#0#9'TMen' +'uItem'#9'Orthoview'#7'Caption'#6#15'Orthogonal view'#7'Checked'#9#7'OnClick' +#7#14'OrthoviewClick'#0#0#9'TMenuItem'#15'SliceLabelCheck'#7'Caption'#6#16'S' +'how slice label'#7'Checked'#9#7'OnClick'#7#20'SliceLabelCheckClick'#0#0#9'T' +'MenuItem'#7'Slices1'#7'Caption'#6#9'Slices...'#7'OnClick'#7#12'Slices1Click' +#0#0#0#0#11'TSaveDialog'#15'MultiSaveDialog'#10'DefaultExt'#6#4'.ini'#6'Filt' +'er'#6#19'Settings file|*.ini'#11'FilterIndex'#2#0#4'left'#2'a'#3'top'#2#11#0 +#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/MultiSlice.lfm0000664000175000017500000001024611424002512020414 0ustar michaelmichaelobject MultiSliceForm: TMultiSliceForm Left = 493 Height = 242 Top = 292 Width = 745 Caption = 'MultiSlice' ClientHeight = 223 ClientWidth = 745 Font.Height = -11 Font.Name = 'MS Sans Serif' Menu = MainMenu1 OnClose = FormClose OnCreate = FormCreate OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object MultiPanel: TScrollBox Left = 0 Height = 223 Top = 0 Width = 745 Align = alClient ClientHeight = 219 ClientWidth = 741 TabOrder = 0 object MultiImage: TImage Tag = 2 Cursor = crCross Left = 2 Height = 12 Top = 2 Width = 12 AutoSize = True Stretch = True end end object MainMenu1: TMainMenu left = 40 top = 8 object File1: TMenuItem Caption = 'File' object Settings1: TMenuItem Caption = 'Open settings' OnClick = Settings1Click end object Savesettings1: TMenuItem Caption = 'Save settings' ShortCut = 16467 OnClick = Savesettings1Click end object Saveasbitmap1: TMenuItem Caption = 'Save as bitmap...' OnClick = Saveasbitmap1Click end object Closewindow1: TMenuItem Caption = 'Close window' ShortCut = 16471 OnClick = Closewindow1Click end end object Edit1: TMenuItem Caption = 'Edit' object Copy1: TMenuItem Caption = 'Copy' ShortCut = 16451 OnClick = Copy1Click end end object View1: TMenuItem Caption = 'View' object OrientMenu: TMenuItem Caption = 'Orient' object Sagittal1: TMenuItem Tag = 2 Caption = 'Sagittal' GroupIndex = 129 RadioItem = True OnClick = OrientClick end object Coronal1: TMenuItem Tag = 3 Caption = 'Coronal' GroupIndex = 129 RadioItem = True OnClick = OrientClick end object Axial1: TMenuItem Tag = 1 Caption = 'Axial' Checked = True GroupIndex = 129 RadioItem = True OnClick = OrientClick end end object OversliceMenu: TMenuItem Caption = 'Overslice' object N501: TMenuItem Tag = -50 Caption = '-50%' GroupIndex = 158 RadioItem = True OnClick = OverlsiceClick end object N331: TMenuItem Tag = -35 Caption = '-35%' GroupIndex = 158 RadioItem = True OnClick = OverlsiceClick end object N201: TMenuItem Tag = -20 Caption = '-20%' GroupIndex = 158 RadioItem = True OnClick = OverlsiceClick end object N01: TMenuItem Caption = '0%' Checked = True GroupIndex = 158 RadioItem = True OnClick = OverlsiceClick end object N202: TMenuItem Tag = 20 Caption = '20%' GroupIndex = 158 RadioItem = True OnClick = OverlsiceClick end object N351: TMenuItem Tag = 35 Caption = '35%' GroupIndex = 158 RadioItem = True OnClick = OverlsiceClick end object N502: TMenuItem Tag = 50 Caption = '50%' GroupIndex = 158 RadioItem = True OnClick = OverlsiceClick end end object Orthoview: TMenuItem Caption = 'Orthogonal view' Checked = True OnClick = OrthoviewClick end object SliceLabelCheck: TMenuItem Caption = 'Show slice label' Checked = True OnClick = SliceLabelCheckClick end object Slices1: TMenuItem Caption = 'Slices...' OnClick = Slices1Click end end end object MultiSaveDialog: TSaveDialog DefaultExt = '.ini' Filter = 'Settings file|*.ini' FilterIndex = 0 left = 97 top = 11 end end mricron-0.20120505.1~dfsg.1.orig/multislice/0000775000175000017500000000000011660470014020021 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/multislice/default.ini0000664000175000017500000000015211424002344022137 0ustar michaelmichael[STR] Slices=24,28,62,82,92,102 [BOOL] OrthoView=1 SliceLabel=1 [INT] Orient=3 OverslicePct=0 mricron-0.20120505.1~dfsg.1.orig/mricron.res0000664000175000017500000007401011660465464020052 0ustar michaelmichael џџџџv0џџMAINICON00Ј Ј Шh00 Ј%  Ј hЈ џџџџ(0`ёё№ššС~~ВyyДDDž++˜EEЇЇЇгЃЃФххьППлОNNЊ “Ž’š Ї <<СВВЮддшЂЂЯ``Г™‘›ЅЏЕЛСЧба/0кГГУ››МvvЋMM•66Œ‚MM•……Н››Ъ­­еššЯssРGGЎЁ˜ ЌЕМТЧЭвиохы№іžšџ•—ИXYš=>Ž-.ˆ"#‡‡‰ ‹‘–“ЁЅЎЙТЩЮгйпцьёіљћќќ ћUeџОТл8:”y~…”œЄЊЏЖМСШЯжкпхьёіљћќћћ&њ@ј[јnї~љМHˆЭamаnwз‚‚и#ЅŽ ІЋА ЖМСШЮдкрць№ѕјћќќћ)њUљ‰јБљдљѓњџњџєџџџ­ѓсдЦРЙРRRЯŠŠуЮЮ{}и#ZО|ВЃМВСКЧКЬВвЂи†о]х*ы№ѕљћќќќќћ'јvљМљуљџњџќџќџќ§љћѕњџљЪљњіяхжЩЛЏИ;;ФjjЪџбoџbёwнцфзштючєьќђџіџљўћєћШњ~љ3њћћћњ<їЉїђљџњџќџќњќјћњљћїќџ§џўВўџ§ўў§їцзЭЛФ;;шЧЧ;ћ?ћ ћѓЬіќњѓћќ§ќќ§ћќќќќќџћџћџћљњВљSњ љіќљџћџќћћњњќљ§ї§њџџўџџеўeўў§§ќў§ўўёсзХйmm%ў%§§џ+ўнўџ§ѕўљ§њќњ§ќўќ§ћћћњќ§ќџћўњmВљџњљњћј§іўїўњ§џџџў§ўЯџmўџўџўўў§§§ўўњѓээ)§))ў)$§'§ §.§Яўџ§ўўљ§ї§ј§ј§љўљўљћјљјњїЊџњќЗњїћўџўџўџџіўзўœџJџўџўџўџўџўўў§ќўџџ џ++LџL8§72ў2+ў0!§ў §Šќп§џўџўџўџўџўџўџўџўџ§џЬњџўџџњAђўа§ЋўxўEџџўџџџџўџўџўџўџў§ ўўўў11ўШШdўd>ў>AўA;§;1ў5'ў!§§ќO§ќœќАќЛќОќИќЎћ"њ‰эіoўџLћІ-ўўўџџџџџџџџџџџџџўџўџџџ!!џ''џ**џ''џ__/ў/GўGLўL@§?:§=§ўўў§§§ќўќ§6§џћќў§хў"ўўџџџџџџџџџџџџџџўџўў**ў,,ў55ў55ў88ˆџˆGџG[џ[MўMLўL(ў(§§§§ў§ўўўўL§ў§ћњ§§ўcўўџџџџџџџџџџџџџџџџџ((џ66џ88џBBџ;;џ@@MџMRўRbџbXџXAџAџўџўўў§ў§§Z§џўњјўџџЅџџџџџџџџџџџџџџџџџџџ==џAAџFFџMMџIIџIIџMџMlўleўeYўYўџўџџџўџќў`ќџ§ћњ§ўўкўўџџџџџџџџџџџџџџџџ--џKKџLLџUUџMMџQQDџDRџRxџxmџm%џ%ўџўўўўў§§\§ў§њ§§ћџќў?џџџџџџџџџџџџџџџџџNNџUUџXXџaaџRRџ……bџbhџhƒџƒSџSџџџџџўџ§ўM§ўўћўўљџџџuџџџџџџџџџџџџџџџџBBџ``џ]]џjjџ[[џƒƒfџfVџV|џ|…џ…EџEџџџџўў§§6§ў§ћ§§њўўўŸўџџџџџџџџџџџџџ џEEџffџddџrrџjjџ__kџkQџQˆџˆ‰џ‰TџT џ џџ§џ§§!ќьќў§ћћџџўРџџџџџџџџџџџџџ++џZZџllџkkџxxџmmџ\\]џ]^џ^“џ“‘џ‘pџp.џ.џўў§§§Ч§ў§њќўџўкўўџџџџџџџџџ77џXXџooџppџttџ||џssџssuџuQџQ•џ•“џ“‡џ‡bџb#ў#ўџ§§›ќџўјћўџўхў џџџџџџ!!џ99џRRџffџqqџrrџttџџ‚‚џ€€џ‡‡`џ`\џ\џ˜џ˜џˆџˆb§b/ў/ §ўXћќ§њќ§џ§уџўџ('џ::џKKџ[[џffџmmџppџqqџvvџџˆˆџzzџnnџxxˆџˆhџh‰џ‰ џ ”џ”ŒўŒ…џ…lўj7§8ќ гћў§ћ§ўи,ўGEўQRџ\[џaaџddџhhџjjџnnџyyџ„„џ††џ€€џnnџ‘‘rџrRџRhџh’џ’ џ ‘ў‘‰ў‰Šќ…Z§lšќ+џљќџ1ўК]ўLTў][џ``џeeџkkџttџ€€џ‰‰џ€€џttџuuџџЉЉЄџЄuџulўl§˜џ˜•§”“ў’‡ћнџ&џъ ќv\џhmўsrџxxџ}}џџ{{џmmџ__џxxџ™™џЖЖžџžyўyuўuoўpo§lpћxЂъ…іu,§§<:џMMџVVџWWџ__џjjџ’’џЉЉ|ў|!§ §Hћ@ўГТўqp§ ў++џ::џooџААџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРџџџўџџџ№џўџјџррР€€€€€€РРрр№јјќў?џџ€џџРџџрџџјџџўџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ џџџџ( @……НaaЄ……НЯЯу……НRRЄ55Ÿ›Ё^^РССкххэВВиxxП44ЇžЈГРЩЯ$!иpsЃLP•26ˆ‰45ЂCC­<<ВЌЇЏНЪжпчюѕљ ў€ŽџpkГ!Žˆ˜Ѓ­ГМЦгпшяєјћ&ћJћjї†ћšъН6`ТIZН]qЯˆˆмЛЛ<ЕSЇzКТuЫYе5о чяѕљќќќQћ–њбљёљџіџ§џџџeњщзСИР]]zџgђtыђіу§юџєџјљћкќ–ћAћћљ€їрјџљџїџјџўќџњхљ]њ§ўќюеПЮbbќ §ћБћџќњћјњјўљџљџљќјЙіМ/ѕџїџќћџњџќџ§уў‰ўў§§§ўџљът1§2'§$§§§џ§џўџ§џ§џњџќџ.џџ§оџќ џќќ§сџЇў]џўџџўўўў§ўџџ§^^>ў>;ў=3§2§§@§Œ§Г§ЦќЭќШќМRѕЋ§џŽќcc§8§ ўўўџўўџџўџўўў$$ў$$ўssQўQIўIKўL:ў<ў§§§§§§pњўўњЛ§ўџўџџџџўўџўџџ00џ55ў88WџWZўZWўWўўўўўў§…ќўўњѕў"ўџўџџџџџџўџў11ўAAўGGўEEtўtSџSqџq3џ3џџџџ§§‹ќџњћџџaўџџџџџџџџџџџNNџTTџSSџppiўinўnfўfўўўўў§€§ўљњўўšўўўџџџџџџџџHHџbbџaaџrrbџbџZџZџџџ§§e§ўћћўўС§џџџџџџџџџNNџllџllџ__eџeџqџq!џ!ўў§Dќ§ќўџўмў ўўџџџџџAAџhhџxxџ~~џ||tџt]џ]“џ“џYўY ў ўќцћўў§хўўџџ**џ@@џZZџooџ||џ}}џttџffnџn‘џ‘§ŒџŒb§_§(šњџўњсў@:ўLNў^]џjjџuuџ{{џ{{џxxџ‚‚џ››AџA~ў~ўšў—‹§“‰ћcљџ§ПL§_lўpmўqqџssџrrџssџ‰‰џŸŸ‡ў‡}ў}p§li§xЙщjўiiўiiўYXўiiџ{{џџФФ§}ў}џўiiџџџџџџџџџџџџџџџџџџџџџџџџџџџуџџџџџ№џ№РР€€€€€РРр№јјў?џџџРџџѓџџџџџџџџџџџџџџџџџџџџџШ џџџџ(0ЕПФЯбпръьѓєћд>ЧLЅPЙФћъПёњѕЭќќНќбќтќџ§§§„§џўџџїџџљrњўўџџяџџЙљжћј§ўўџЊќ7Ѕ јўџ;ќ-œЈўџ ЖЈћ!$#œ%-п-ћ!0ьF2ў23ќ(53Ї8џ8:ў3;§?< џ<хџ?1BќIћJJЂNMЕPќPPўRQ§ZTўSYўYYџYZў\\ZЪ^ў`_џ_`іbўbfўfgџgoџНvџvwwГzўy|zК|џ|~ћћ€vАПƒњ…§…††ШџŽўŽŽџќ•ў‘šњ›ў›œuЪŸљ ˆг­ўHЗЗгКїХ Х__Э$абім оњхџюює ѕџїlљ*љVTљЎњ‘њoњдћ‡ћећцќќћќ14ќЙ§§§&§6§§>8§LM§TT§Yg§§Љ2ўўўўўўўўўў ўў77ў::ўLLўPPўQQўUUў]\ўccўpmўttўїўџџџƒџєџњџџџџџџџџџџџ""џ&&џ44џ;џџAAџ[[џaaџccџeeџmmџssџttџyyџ{{џ}}џџƒƒџ††џŠŠџьџўџџџџџwaO@FchkP=0AgL?689<) 3>JsuX2  1Mix„‰‚~{zC+' #"[}ИЙЙЗЖ “|y;5!(!KФМŒ•ž““žЛ—ƒЌIE7*_’…–ЂžЕЁžžžЄЈСšTRH-,oГ†“К ŸЕЕЕЕРЉЊЎVY4%&tжŠ”ІЕЕЕžЃžЊЋ­]`G./qеˆžНЕЛЛЕЕТЧШаUdD$fД‹ЅžžЕЕОУЪЪЦ^l\:NеŽЇŸПСХЩЮЬЭZjnWB€д˜™АЫЯбгrmpev›БВЮвЬbQS‡‘Џœџџџџџџџџџџџџџџџџ№?џ€?Р€€€€€РРр№јќ?џџџџџџџџџџџџџџh џџџџ( ЪжуЫ ОКђћіќќџ§§ФџџйЋџшџњ§ џксk ;Љ ў ўkKŸ!И&ф џ'џ,->џ/џ!0ђ9ў+;2œM§]PPНWjОY§ZbY f§fhџkiу=jџjlўklџoўooџptџ}nЏ‹џŒўˆŽЮŽљŽљЩџ‘ŒХЄЧЄЇдЌџЎxœГўФџХZnЯ[[клH[уЋBёљњњjњ$њћќќ>5§§§§{§}{ўўўџўўўўBBўKMўNNўPPўddўjjў‚‚ўРўы џџџžџѕџџџ џџ#Ѓџ))џ::џT]џ[[џuuџ‚‚џ‡‡џтџџџ&!0793#$/18A>;) =Scba`C@? 5hFGDENegj% :OITRd`VWY*( <^JM`QUZ[+' 6pHLfilm-2",_KX\no4.BkP]џџџџџџџŸр€€€РрјџџџџџџЈ% џџџџ(0` џ“џ№џџџџџџџџџџџџџџџяџFџџPџСџџџџџџџџџџџџџџџџџџџџџњџ<џџбџџџџџџџџџџџџџџџџџџџџџџџџџџ==џтџ)џшџџџџџџџџџџџџџџџџџџџџџџџџџџџџ##џџhhџџooџџџџџџЊЊџџпџџы џџџ џџџџџџџeџЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLLџџrrџџppџџџџџџџ))DџJHnџ[W‡џmgcџшзџџъ џ џnџЁџеџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhhџџwўџ“oєџџUџoџŒџЦџфџ§џџџ>:џџXTџџXTџџKGьџtnXџџПџ џМџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџtжџхЮџќьџџџџџџџџџџџџџџvџџџvџџџaўџџџџџџџџџџџџџџ џџ)'џџTPџџtnџџrlџџhcџџOMxџџц џџџџ}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,їџГЮџовџїчџјШ§џџZџџџџџџџџџџџџџџџџџџџџџ8џџџwџџџnџџџ9Бџџџџџџџџџџџџџџџџџџ=:џџrlџџtoџџrlџџC@№џœ•&џџџџдџџџџџџџџџџџџџџџџџџџџџџџџ5єџобџ§ђџџџџџџџѕџџлОџџџџџџџџџџџЉџџџџџџџџџџџџџџџџџџ^џџџsџџџVяџџ$џџџџџџџџџџџџџџџџ џџ%#џџlgџџtnџџtoџџUQџџ@= џџц џџќџџџџџџџџџџџџџџ џџзџђтџџџџџџџџџџџџџџџџџџџіџџ§ъџџџџџџџџџџџџџџџџџџџeџџџџџџџџџ*џџџfџџџtџџџ*rџџџџџџџџџџџџџџџџџџџџџџџџOKџџlgџџtnџџjdџџGDџџC>_џшџџџџџџџџџџџџљџќёџџџџџџџџџџџџџџџџџџџџџџџџџЊСџџџџџџџџџџџџџџџџџџџџџџџыџџџ%џџџ/џџџiџџџsџџџcќџџџџџџџџџџџџџџџџџџџџџџџџџџ:8џџc^џџrmџџniџџPLџџ0-šџвџџџџ џџ џџ џџwоџћьџџџџџџџџџџџџџџџџџџџџџџџџџџџџтШџџџџџџџџџџџџџџџџџџџџџџџџџџџМџџџnџџџsџџџ_їџџ(aџџџџџџџџџџџџџџџџџџџџџџџџџџ*(џџZVџџqkџџpjџџSOџџ1-Ѓџџџџtџџ21џџ55џџ=хџ5ўџџ'џџџўџџ џџџ џџџ џџџџџџџџџ#џџџ8џџџGџџџWџџџџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзџџџ7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRNџџojџџoiџџQMџџ53Œџџџ@@џ%00џў~}џџwЬцџvўџџiџџџXўџџHџџџEџџџLџџџTџџџgџџџjџџџlџџџoџџџqџџџtџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћџџявьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ" џџUQџџpjџџlgџџLHџџ73|џџџџџџJJџгžЪђџЊўўџВўџџЈўџџ˜ўџџˆўџџuџџџtџџџtџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџџџџџџџџџяаьџіыOџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,*џџ[WџџqlџџgbџџB?џџSKDџлџџџџћћџ3АўџџУўџџЬўџџРўџџЎўџџšўџџ~џџџyџџџxџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџњџџфЫеџљщEџџџ џџџџџџџџџџєJџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџSOџџnhџџtnџџXTџџ:7Дџџу џџџџџџџљџ.ЉўјџХўџџаўџџФўџџВўџџўџџ€џџџzџџџxџџџuџџџsџџџrџџџoџџџmџџџkџџџѕејџчЫХџјю>џџџџџџџџџџџџџџџџџџџмБџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџd`џџrmџџtnџџMIџџA?rџџЬџџџџџџџџџ+‡§ŽџЕўгџЪўєџСўџџЎўџџ—ўџџvџџџoџќџjџѓџ[џрџRџбџHџЙџ4џ|џ*џZџ џ4џјџ џџџџџџџџџџџџџџџџџџџџџџџџџоцџџџџџџџџџџџџџџџџџџџџџџџџџџџџ84џџojџџtoџџrlџџ<9ѕџz$џџџџџџџџџџџџ uўu冧†џž§žџž§žџ„ў„џcўcџ'џ'џўџ џ џџџџџџџџџџџџџЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ<џџџџџџџџџџџџџџџџџџџџџџ20џџTPџџjeџџtoџџqlџџ`[џџБЈџџџџџџџџџ џѕџВ§Вuuўuў’§’џ § џŽўŽџs§sџ7ў7џ!џ!џўџџџџџџџџџџџџџsџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыwџџџџџџџџџџџџџџџџџџџџџџVQџџkfџџsmџџsnџџjeџџMJџџппџџџџџџџџџџ№џџћџ@}ў}Х€ў€џŸўŸџ™§™џ†ў†џPџPџ8ў8џ$ў$џ џ џџџџџџџџџџџ=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџфŠџџџџџџџџџџџџџџџџџџџџ85џџlgџџsnџџuoџџojџџ[Vџџ=:лџџџџџџџџџџїџџњџ5ЮќЮd‰ў‰џš§šџŸ§Ÿџ‰ў‰џsўsџ[ў[џ/ў/џўџџџџџџџџџџџбџџџџџџџџџџџџџџџџџџџџџџџџџџзІџџџџџџџџџџџџџџџџB>џџ]YџџniџџuoџџtoџџqkџџEB§џOJgџџу џџџџџџџџџџјџ"џџџ9wўwїŒ§Œџœ§œџ§џŽўŽџ{§{џLўLџ7ў7џ%џ%џџџџџџџџџœџџџџџџџџџџџџџџџџџџџџџџџџџџпЃџџџџџџџџџџ џџџџ20џџc^џџojџџtnџџtoџџqlџџd`џџJFxџџш џџџџџџџџџ џђџџјџ%Љ§Љ†vўvќŽ§ŽџЄ§Єџ ў џ•§•џmўmџWўWџAџAџџџџџ џ џџџhџџџџџџџџџџџџџџџџџџџџџџџџџџѕeџџџџџџџџџџ%$џџA>џџZVџџrlџџtoџџuoџџqlџџfaџџJGџџџъ џџџџџџџџџџџџ џљџ(џћџ?І§І‹ŒўŒџўџІўІџЁ§Ёџ”ў”џƒўƒџYўYџDџDџ3ў3џџџџџыџџџџџџџџџў џџџ'џџў)џџў(џэѕџџџџџџџџ2/џџHEџџkfџџrlџџtoџџtoџџsnџџniџџGDџџ=:Ѓџџэџџџџџџџџџџџџџџџ'џџџ=w§wѓ‰ў‰џ›§›џЊ§ЊџІ§Іџœўœџ{ў{џgўgџSўSџ7ў7џ0џ0џЁў.џџў4џџў:џџџ>џџўIџџўHџџўFџчТ4џџ-,џџ-+џџLHџџ\WџџidџџsnџџtoџџtoџџqkџџjdџџXTџџLJkџџџ џџџџџџџџџџџџ џѓџџџџ%Ч§Чkwўwъ„ў„џЄ§ЄџЉўЉџЉ§Љџ—§—џ‡ў‡џvўvџ[ў[џTўTџoўSџџў_џџўgџџўmџџ§uџџ§rџџ§mџџg[џџZWџџ\Xџџkfџџpkџџsnџџtoџџsnџџqlџџ_ZџџKHџџ<:аџџџџџџџџџџџџџџџ џџџџџџ0џћџFx§xѕ…ў…џ”ў”џЄ§ЄџЄўЄџЂ§Ђџšўšџ—ў—џ™§™џў§Ўџџ§Еџџ§Зџџ§­џќ§ЃџєЮ˜џџ…€џџ|wџџxrџџsnџџpjџџjeџџWSџџIEџџ=:цџЫПџџџџџџџџџџџџџџџџџџџџџџљџ*аќаbўШxўxћўџ™§™џўџ ў џ § џ ў џкќЌџџ§Гџџ§Гџ№ђЄџќЌ˜џџ‘Œџџ}wџџvqџџqlџџb]џџWSџџJFџџFC”џb_Fџ№сџџЊџџџџџџџлџџџџ џџџџњџ1џћџAсќс]€ў€р|ў|џ†§†џ§џ‘ў‘џ§џ’ќџМќ”ў№і“ўџŠ…џџ~zџџsnџџ^[џџXTџџQMџџGCЭџNK…џ€w8џџџ џџџџџџџџџџџџџџџџџџ џ№џџєџџљџ*џџџ3џћџ<џћџGџќџIџћџHџћџ=џџџ6џџџ-џџї џџѕџџёџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџјџ&џјџ'џјџ&џџџџѕџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџ џџџ џџџџџџџџџџыџ џџџ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџџџџРџџџ€џџќ>џ№<џ€€€€€€€Рр?р?№ќџќџџџџ€џџџрџџџ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ џџџџ( @ џ“џџџџџџџџџџџяџџбџџџџџџџџџџџџџџџџ==џтџ)џшџџџџџџџџџџџџџџџџџџ##џџooџџџџџџЊЊџџы џџџ џџџџ џnџеџџџџџџџџџџџџџџџџџџџџџџџџhhџџ“oєџџUџŒџЦџ§џџџXTџџXTџџtnXџџПџМџџџџџџџџџџџџџџџџџџџџџџџџџџtжџхЮџџџџџџџџџџџvџџџaўџџџџџџџџџџ џџTPџџtnџџhcџџOMxџџџџџџџџџџџџџџџџџџџ5єџобџџџџџџџлОџџџџџџџЉџџџџџџџџџџџџ^џџџsџџџ$џџџџџџџџџџџџ%#џџlgџџtoџџUQџџџц џџџџџџџџџџџ џџђтџџџџџџџџџџџџџіџџџџџџџџџџџџџџџeџџџџџџ*џџџtџџџ*rџџџџџџџџџџџџџџџџOKџџtnџџjdџџC>_џџџџ џџ џџћьџџџџџџџџџџџџџџџџџџџтШџџџџџџџџџџџџџџџџџџџnџџџsџџџ(aџџџџџџџџџџџџџџџџџџ*(џџqkџџpjџџ1-Ѓџџџџџ21џџ=хџ5ўџџўџџ џџџ џџџџџџ#џџџ8џџџWџџџџќџџџџџџџџџџџџџџџџџџџзџџџ7џџџџџџџџџџџџџџџџџџџџџџojџџoiџџ53ŒџџџJJџгžЪђџВўџџЈўџџˆўџџuџџџtџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџяаьџџџ џџџџџџџџџџџџџџџџџџџџџџ,*џџqlџџgbџџSKDџлџћћџ3АўџџЬўџџРўџџšўџџ~џџџxџџџwџџџwџџџwџџџwџџџџџџџџњџџфЫеџџџ џџџџџџџєJџџџџџџџџџџџџџџџџџџ џџSOџџtnџџXTџџџу џџџџџџ+‡§ŽџЪўєџСўџџ—ўџџvџџџjџѓџ[џрџHџЙџ4џ|џ џ4џјџ џџџџџџџџџџџџџџџџоцџџџџџџџџџџџџџџџџџџ84џџojџџrlџџ<9ѕџџџџџџџџџ uўuеž§žџž§žџcўcџ'џ'џ џ џџџџџџџџџЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ20џџjeџџtoџџ`[џџБЈџџџџ№џџћџ@€ў€џŸўŸџ†ў†џPџPџ$ў$џ џ џџџџџџџ=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ85џџlgџџuoџџojџџ=:лџџџџџџџїџЮќЮd‰ў‰џŸ§Ÿџ‰ў‰џ[ў[џ/ў/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB>џџniџџuoџџqkџџEB§џџу џџџџџџ џјџ%Љ§Љ†Ž§ŽџЄ§Єџ•§•џmўmџAџAџџџ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџ%$џџZVџџrlџџuoџџqlџџJGџџџъ џџџџџџ џљџ(І§І‹ŒўŒџІўІџЁ§ЁџƒўƒџYўYџ3ў3џџџыџџџџџџў џџџ'џџў(џэѕџџџџџџHEџџkfџџtoџџtoџџniџџGDџџџэџџџџџџ џџџ%Ч§Чk„ў„џЄ§ЄџЉ§Љџ—§—џvўvџ[ў[џoўSџџў_џџўmџџ§uџџ§mџџg[џџ\Xџџkfџџsnџџtoџџqlџџ_Zџџ<:аџџџџџџџџџ џџџџћџFx§xѕ”ў”џЄ§ЄџЂ§Ђџšўšџ™§™џў§Ўџџ§Зџџ§­џєЮ˜џџ…€џџxrџџsnџџjeџџWSџџ=:цџЫПџџџџџџџлџџџџџњџ1сќс]€ў€р†§†џ§џ§џ’ќџ№і“ўџŠ…џџsnџџ^[џџQMџџGCЭџ€w8џџџ џџџџџџџџџџџџ џєџџљџ*џћџ<џћџGџћџHџћџ=џџџ-џџї џџёџџџџџџџџџџџџџџџџџџџџџ џџџџџџџыџ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќџџрџџ€Уј€€€€€Рр№?јџќџџ?џџрџџџџџџџџџџџџџџh џџџџ(  џбџџџџџџџџџnџџџџџџџџџџџџhhџџџUџЦџџџXTџџџПџџџџџџџџобџџџџџџџџџџџџџџџsџџџџџџџџџlgџџUQџџџ џџџџџџџџџџџтШџџџџџџџџџџџsџџџџџџџџџџџ*(џџpjџџџџžЪђџЈўџџuџџџwџџџwџџџџџџџџџџџяаьџџџџџџџџџџџџ,*џџgbџџџџ‡§ŽџСўџџvџџџ[џрџ4џ|џјџ џџџџџџџоцџџџџџџџџџџojџџ<9ѕџџџџћџ@ŸўŸџPџPџ џ џџџ=џџџџџџџџџџџџџџџџџџlgџџojџџџџџџџ Љ§Љ†Є§Єџmўmџџџџџџџџџџџџџџџџџ%$џџrlџџqlџџџъ џџџ Ч§ЧkЄ§Єџ—§—џ[ў[џџў_џџ§uџџg[џџkfџџtoџџ_Zџџџџџлџџњџ1€ў€р§џ’ќџџŠ…џџ^[џџGCЭџџџ џџџџџџџџџџыџ џџџџџџџџџќр€€€Рр№џџџџ џџџџ((цЎњьюљїњќћ”ћБќ§žўўўќў§ўџџџќџ§ўџўџџўџ(џ(,џ,9џ9AџAIљќJ§WџWZџZhџhlџlnџnxџ{yџy‚џ‚‡џ‡‹џ‹ŒџŒŽџŽЉЦЩњSејж§прѕљўњќћў§џўўљўќўўпў§ўўџџџ2џњџћџќџ§џџџџ џџџ!!џ&&џ,,џ//џDDџEEџIIџLMџQQџWWџZZџ^^џbbџddџiiџjjџooџrrџssџ}}џ††џžžџААџИИџќџ§џџџBDA21,+ .49CE@>7>0, 8EB@>>>>7:H -;>?>>>>>>JM"5bF>>>>>>KON#3c>>>>>>>SV`& /=>>>>>>XZU )>IV\^_(*'6QTW[]Y!%$LRPaџџ№џџ№џџ№џџ№џС№Р№€€€€РРр№0ј№ў№џџ№џџ№џџ№џџ№mricron-0.20120505.1~dfsg.1.orig/mricron.or0000664000175000017500000001634011660465404017675 0ustar michaelmichaelЮњэў(Р8D0fpc.resources__DATA0Dt fpc.reshandles__DATA0Фа P0 0qP`q”(TFINDDIALOGFORMTREPLACEDIALOGFORMTPF0TFindDialogFormFindDialogFormLeftѓHeightƒTop“WidthМ ActiveControl FindButton BorderIcons biSystemMenubiHelpCaptionFind ClientHeightƒ ClientWidthМOnCreate FormCreatePositionpoScreenCenter LCLVersion0.9.27TLabel FindLabelLeftHeightTopWidthFCaption Text to find FocusControlEditFind ParentColorTEditEditFindLeftHHeightTop Width Anchors akTopakLeftakRightOnChangeEditFindChangeTabOrderTextEditFindTButton FindButtonLeft]HeightTopWidth[Anchors akTopakRightCaption Find moreDefault TabOrderTButton CancelButtonLeft]HeightTop(Width[Anchors akTopakRightCancel CaptionCancel ModalResultTabOrder TCheckBoxWholeWordsOnlyCheckBoxLeftHeightTop3Width…CaptionWhole words onlyTabOrder TCheckBoxCaseSensitiveCheckBoxLeftHeightTopNWidthtCaptionCase sensitiveTabOrder TRadioGroupDirectionRadioGroupLeftHeight-Top.WidthХAutoFill Caption DirectionChildSizing.LeftRightSpacingChildSizing.TopBottomSpacingChildSizing.EnlargeHorizontalcrsHomogenousChildResizeChildSizing.EnlargeVerticalcrsHomogenousChildResizeChildSizing.ShrinkHorizontalcrsScaleChildsChildSizing.ShrinkVerticalcrsScaleChildsChildSizing.LayoutcclLeftToRightThenTopToBottomChildSizing.ControlsPerLine ClientHeight ClientWidthСColumns Items.StringsForwardBackwardTabOrderTButton HelpButtonLeft]HeightTopdWidth[Anchors akRightakBottomCaptionHelpTabOrder TCheckBoxEntireScopeCheckBoxLeftHeightTopgWidth„CaptionSearch entire fileTabOrderTPF0TReplaceDialogFormReplaceDialogFormLeftŸHeightЂTop‡WidthА HelpContext ActiveControlEditFind BorderIcons biSystemMenubiHelpCaption Replace textChildSizing.LeftRightSpacingChildSizing.TopBottomSpacingChildSizing.HorizontalSpacingChildSizing.VerticalSpacingChildSizing.ControlsPerLine ClientHeightЂ ClientWidthА Font.Height Font.Style LCLVersion0.9.27TLabel TextLabelLeftHeightTopWidthF HelpContext Alignment taLeftJustifyBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Text to find FocusControlEditFind ParentColorTLabel ReplaceLabelLeftHeightTop0WidthO HelpContext Alignment taLeftJustifyBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Replace with FocusControl EditReplace ParentColorTEditEditFindLeftHHeightTop Width HelpContextAnchors akTopakLeftakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillTabOrderTextEditFindTEdit EditReplaceLeftHHeightTop*Width HelpContextAnchors akTopakLeftakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillTabOrderText EditReplace TCheckBoxWholeWordsOnlyCheckBoxLeftHeightTopPWidth… HelpContextBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionWhole words onlyState cbUncheckedTabOrder UseOnChange TCheckBoxCaseSensitiveCheckBoxLeftHeightTophWidtht HelpContextBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionCase sensitiveState cbUncheckedTabOrder UseOnChangeTButtonFindMoreButtonTagLeftQHeightTop Width[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Find moreDefault TabOrderTButton ReplaceButtonTagLeftQHeightTop(Width[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionReplaceTabOrderTButtonReplaceAllButtonTagLeftPHeightTopDWidth[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Replace allTabOrderTButton CancelButtonLeftQHeightTop`Width[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCancel CaptionCancel ModalResultTabOrderTButton HelpButtonLeftQHeightTopWidth[ HelpContextAnchors akRightakBottomBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionHelpTabOrder TRadioGroupDirectionRadioGroupLeftˆHeight-TopPWidthИ HelpContextAutoFill BorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption DirectionChildSizing.LeftRightSpacingChildSizing.TopBottomSpacingChildSizing.HorizontalSpacingChildSizing.VerticalSpacingChildSizing.EnlargeHorizontalcrsHomogenousChildResizeChildSizing.EnlargeVerticalcrsHomogenousChildResizeChildSizing.ShrinkHorizontalcrsScaleChildsChildSizing.ShrinkVerticalcrsScaleChildsChildSizing.LayoutcclLeftToRightThenTopToBottomChildSizing.ControlsPerLine ClientHeight ClientWidthДColumnsCtl3D Items.StringsForwardBackwardTabOrder TCheckBoxEntireScopeCheckBoxLeftHeightTop€Width„ HelpContextBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionSearch entire fileState cbUncheckedTabOrder UseOnChange ,0<@L\lFPC_RESSYMBOLmricron-0.20120505.1~dfsg.1.orig/mricron.lpr0000664000175000017500000000320111650234366020042 0ustar michaelmichaelprogram mricron; {$mode objfpc}{$H+} uses {$IFDEF UNIX} cthreads, {$ENDIF} Interfaces, // this includes the LCL widgetset Forms, nifti_img_view, nifti_hdr_view, about, Text, ReadInt, histoform, autoroi, ROIfilt, render, MultiSlice, CropEdges, bet, mni, voismooth, prefs, perisettings, graphx, cutout, ReadFloat, landmarks, batchstatselect; {$IFNDEF UNIX} {$IFDEF FPC} {$R manifest.res} {$ELSE} {$R *.res}//windows icon {$ENDIF} {$ENDIF} {$IFDEF WINDOWS}{$R mricron.rc}{$ENDIF} begin Application.Title:='MRIcron'; Application.Initialize; Application.CreateForm(TImgForm, ImgForm); Application.CreateForm(THdrForm, HdrForm); Application.CreateForm(TAnatForm, AnatForm); Application.CreateForm(TAboutForm, AboutForm); Application.CreateForm(TTextForm, TextForm); Application.CreateForm(TReadIntForm, ReadIntForm); Application.CreateForm(TAutoROIForm, AutoROIForm); Application.CreateForm(THistogramForm, HistogramForm); Application.CreateForm(TFilterROIform, FilterROIform); Application.CreateForm(TMultiSliceForm, MultiSliceForm); Application.CreateForm(TRenderForm, RenderForm); Application.CreateForm(TCropEdgeForm, CropEdgeForm); Application.CreateForm(TBETForm, BETForm); Application.CreateForm(TMNIForm, MNIForm); Application.CreateForm(Tvoismoothform, voismoothform); Application.CreateForm(TPrefForm, PrefForm); Application.CreateForm(TPSForm, PSForm); Application.CreateForm(TGraph4DForm, Graph4DForm); Application.CreateForm(TCutoutForm, CutoutForm); Application.CreateForm(TReadFloatForm, ReadFloatForm); Application.Run; end. mricron-0.20120505.1~dfsg.1.orig/mricron.lpi0000664000175000017500000014127311660465464020053 0ustar michaelmichael <Icon Value="0"/> <ActiveWindowIndexAtStart Value="0"/> </General> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <RequiredPackages Count="2"> <Item1> <PackageName Value="FCL"/> <MinVersion Major="1" Valid="True"/> </Item1> <Item2> <PackageName Value="LCL"/> </Item2> </RequiredPackages> <Units Count="140"> <Unit0> <Filename Value="mricron.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="mricron"/> <EditorIndex Value="8"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="16" Y="13"/> <UsageCount Value="200"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit0> <Unit1> <Filename Value="unit1.pas"/> <ComponentName Value="Form1"/> <UnitName Value="Unit1"/> <TopLine Value="16"/> <CursorPos X="7" Y="19"/> <UsageCount Value="17"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit1> <Unit2> <Filename Value="nifti_hdr_view.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="HdrForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="nifti_hdr_view"/> <EditorIndex Value="9"/> <WindowIndex Value="0"/> <TopLine Value="486"/> <CursorPos X="9" Y="488"/> <UsageCount Value="200"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit2> <Unit3> <Filename Value="define_types.pas"/> <UnitName Value="define_types"/> <TopLine Value="410"/> <CursorPos X="23" Y="420"/> <UsageCount Value="98"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit3> <Unit4> <Filename Value="GraphicsMathLibrary.pas"/> <UnitName Value="GraphicsMathLibrary"/> <TopLine Value="326"/> <CursorPos X="38" Y="349"/> <UsageCount Value="11"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit4> <Unit5> <Filename Value="about.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="AboutForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="about"/> <EditorIndex Value="6"/> <WindowIndex Value="0"/> <TopLine Value="4"/> <CursorPos X="65" Y="40"/> <UsageCount Value="200"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit5> <Unit6> <Filename Value="unit2.pas"/> <ComponentName Value="Form2"/> <UnitName Value="Unit2"/> <TopLine Value="105"/> <CursorPos X="1" Y="116"/> <UsageCount Value="4"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit6> <Unit7> <Filename Value="text.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="TextForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="text"/> <TopLine Value="52"/> <CursorPos X="51" Y="63"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit7> <Unit8> <Filename Value="..\lcl\include\customform.inc"/> <TopLine Value="315"/> <CursorPos X="31" Y="325"/> <UsageCount Value="6"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit8> <Unit9> <Filename Value="render.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="RenderForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="render"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="18" Y="4"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit9> <Unit10> <Filename Value="ROIfilt.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="FilterROIform"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="ROIfilt"/> <TopLine Value="1"/> <CursorPos X="25" Y="5"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit10> <Unit11> <Filename Value="smoothVOI.pas"/> <ComponentName Value="SmoothVOIForm"/> <HasResources Value="True"/> <UnitName Value="smoothVOI"/> <TopLine Value="382"/> <CursorPos X="31" Y="303"/> <UsageCount Value="6"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit11> <Unit12> <Filename Value="nifti_img_view.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="ImgForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="nifti_img_view"/> <IsVisibleTab Value="True"/> <EditorIndex Value="0"/> <WindowIndex Value="0"/> <TopLine Value="1167"/> <CursorPos X="40" Y="1170"/> <UsageCount Value="200"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit12> <Unit13> <Filename Value="nifti_img.pas"/> <UnitName Value="nifti_img"/> <EditorIndex Value="13"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="128" Y="1"/> <UsageCount Value="100"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit13> <Unit14> <Filename Value="DISTR.PAS"/> <UnitName Value="Distr"/> <TopLine Value="137"/> <CursorPos X="22" Y="150"/> <UsageCount Value="2"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit14> <Unit15> <Filename Value="cutout.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="CutoutForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="cutout"/> <TopLine Value="161"/> <CursorPos X="29" Y="166"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit15> <Unit16> <Filename Value="MultiSlice.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="MultiSliceForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="MultiSlice"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="30" Y="3"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit16> <Unit17> <Filename Value="render.lrs"/> <TopLine Value="1"/> <CursorPos X="1" Y="175"/> <UsageCount Value="4"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit17> <Unit18> <Filename Value="autoroi.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="AutoROIForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="autoroi"/> <WindowIndex Value="0"/> <TopLine Value="517"/> <CursorPos X="68" Y="537"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit18> <Unit19> <Filename Value="spread.pas"/> <ComponentName Value="SpreadForm"/> <HasResources Value="True"/> <UnitName Value="spread"/> <TopLine Value="83"/> <CursorPos X="47" Y="93"/> <UsageCount Value="197"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit19> <Unit20> <Filename Value="design.pas"/> <ComponentName Value="DesignForm"/> <HasResources Value="True"/> <UnitName Value="design"/> <TopLine Value="1"/> <CursorPos X="45" Y="167"/> <UsageCount Value="197"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit20> <Unit21> <Filename Value="histoform.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="HistogramForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="histoform"/> <TopLine Value="1"/> <CursorPos X="9" Y="4"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit21> <Unit22> <Filename Value="nifti_img_view.lrs"/> <TopLine Value="2"/> <CursorPos X="1" Y="1000"/> <UsageCount Value="10"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit22> <Unit23> <Filename Value="logistic.pas"/> <UnitName Value="logistic"/> <TopLine Value="1075"/> <CursorPos X="1" Y="1100"/> <UsageCount Value="27"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit23> <Unit24> <Filename Value="ReadInt.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="ReadIntForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="ReadInt"/> <TopLine Value="53"/> <CursorPos X="80" Y="68"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit24> <Unit25> <Filename Value="unit1.lfm"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="4"/> <DefaultSyntaxHighlighter Value="LFM"/> </Unit25> <Unit26> <Filename Value="..\lcl\grids.pas"/> <UnitName Value="Grids"/> <TopLine Value="5919"/> <CursorPos X="1" Y="5925"/> <UsageCount Value="1"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit26> <Unit27> <Filename Value="..\lcl\include\graphic.inc"/> <TopLine Value="1"/> <CursorPos X="1" Y="104"/> <UsageCount Value="6"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit27> <Unit28> <Filename Value="..\lcl\lclproc.pas"/> <UnitName Value="LCLProc"/> <TopLine Value="731"/> <CursorPos X="1" Y="741"/> <UsageCount Value="4"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit28> <Unit29> <Filename Value="nifti_img_view.lfm"/> <TopLine Value="499"/> <CursorPos X="7" Y="513"/> <UsageCount Value="5"/> <DefaultSyntaxHighlighter Value="LFM"/> </Unit29> <Unit30> <Filename Value="nifti_hdr.pas"/> <UnitName Value="nifti_hdr"/> <TopLine Value="172"/> <CursorPos X="5" Y="188"/> <UsageCount Value="90"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit30> <Unit31> <Filename Value="gzio2.pas"/> <UnitName Value="gzio2"/> <TopLine Value="278"/> <CursorPos X="11" Y="282"/> <UsageCount Value="42"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit31> <Unit32> <Filename Value="stat.pas"/> <UnitName Value="stat"/> <TopLine Value="318"/> <CursorPos X="10" Y="329"/> <UsageCount Value="19"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit32> <Unit33> <Filename Value="..\lcl\forms.pp"/> <UnitName Value="Forms"/> <TopLine Value="799"/> <CursorPos X="1" Y="806"/> <UsageCount Value="1"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit33> <Unit34> <Filename Value="..\lcl\lmessages.pp"/> <UnitName Value="LMessages"/> <TopLine Value="588"/> <CursorPos X="1" Y="600"/> <UsageCount Value="1"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit34> <Unit35> <Filename Value="cropedges.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="CropEdgeForm"/> <ResourceBaseClass Value="Form"/> <UnitName Value="CropEdges"/> <TopLine Value="61"/> <CursorPos X="23" Y="76"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit35> <Unit36> <Filename Value="bet.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="BETForm"/> <ResourceBaseClass Value="Form"/> <UnitName Value="bet"/> <WindowIndex Value="0"/> <TopLine Value="86"/> <CursorPos X="43" Y="99"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit36> <Unit37> <Filename Value="mni.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="MNIForm"/> <ResourceBaseClass Value="Form"/> <UnitName Value="mni"/> <WindowIndex Value="0"/> <TopLine Value="20"/> <CursorPos X="3" Y="53"/> <UsageCount Value="200"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit37> <Unit38> <Filename Value="RenderThds.pas"/> <UnitName Value="RenderThds"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="20" Y="4"/> <UsageCount Value="18"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit38> <Unit39> <Filename Value="..\examples\bounty\qgraphics.pas"/> <UnitName Value="qgraphics"/> <TopLine Value="30"/> <CursorPos X="15" Y="38"/> <UsageCount Value="6"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit39> <Unit40> <Filename Value="wgraphics.pas"/> <UnitName Value="wgraphics"/> <TopLine Value="1"/> <CursorPos X="1" Y="9"/> <UsageCount Value="19"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit40> <Unit41> <Filename Value="ugraphics.pas"/> <UnitName Value="ugraphics"/> <TopLine Value="1"/> <CursorPos X="15" Y="1"/> <UsageCount Value="90"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit41> <Unit42> <Filename Value="mricron_w\nifti_img.pas"/> <UnitName Value="nifti_img"/> <TopLine Value="70"/> <CursorPos X="26" Y="82"/> <UsageCount Value="6"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit42> <Unit43> <Filename Value="..\examples\bounty\fx8.pas"/> <UnitName Value="fx8"/> <TopLine Value="114"/> <CursorPos X="68" Y="121"/> <UsageCount Value="6"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit43> <Unit44> <Filename Value="fx8.pas"/> <UnitName Value="fx8"/> <TopLine Value="119"/> <CursorPos X="20" Y="146"/> <UsageCount Value="18"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit44> <Unit45> <Filename Value="MultiSlice.lfm"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="6"/> <DefaultSyntaxHighlighter Value="LFM"/> </Unit45> <Unit46> <Filename Value="MultiSlice.lrs"/> <TopLine Value="1"/> <CursorPos X="17" Y="3"/> <UsageCount Value="13"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit46> <Unit47> <Filename Value="smoothVOI.lfm"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="6"/> <DefaultSyntaxHighlighter Value="LFM"/> </Unit47> <Unit48> <Filename Value="voismooth.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="voismoothform"/> <ResourceBaseClass Value="Form"/> <UnitName Value="voismooth"/> <WindowIndex Value="0"/> <TopLine Value="385"/> <CursorPos X="36" Y="391"/> <UsageCount Value="185"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit48> <Unit49> <Filename Value="..\components\rtticontrols\rttictrls.pas"/> <UnitName Value="RTTICtrls"/> <TopLine Value="20"/> <CursorPos X="56" Y="37"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit49> <Unit50> <Filename Value="..\lcl\fileutil.pas"/> <UnitName Value="FileUtil"/> <TopLine Value="105"/> <CursorPos X="35" Y="124"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit50> <Unit51> <Filename Value="prefs.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="PrefForm"/> <ResourceBaseClass Value="Form"/> <UnitName Value="prefs"/> <WindowIndex Value="0"/> <TopLine Value="57"/> <CursorPos X="3" Y="59"/> <UsageCount Value="177"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit51> <Unit52> <Filename Value="dcm2nii\dcm2niigui.lrs"/> <TopLine Value="1"/> <CursorPos X="23" Y="1"/> <UsageCount Value="6"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit52> <Unit53> <Filename Value="C:\Documents and Settings\Chris Rorden\Application Data\Opera\Opera\profile\cache4\temporary_download\JclSysInfo.pas"/> <UnitName Value="JclSysInfo"/> <TopLine Value="29"/> <CursorPos X="36" Y="36"/> <UsageCount Value="12"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit53> <Unit54> <Filename Value="rgbroutines.pas"/> <UnitName Value="RGBRoutines"/> <TopLine Value="49"/> <CursorPos X="49" Y="4"/> <UsageCount Value="11"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit54> <Unit55> <Filename Value="junk.pas"/> <UnitName Value="junk"/> <TopLine Value="33"/> <CursorPos X="1" Y="46"/> <UsageCount Value="8"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit55> <Unit56> <Filename Value="rgbtypes.pas"/> <UnitName Value="RGBTypes"/> <TopLine Value="1"/> <CursorPos X="44" Y="5"/> <UsageCount Value="11"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit56> <Unit57> <Filename Value="usr\local\share\lazarus\components\rtticontrols\runtimetypeinfocontrols.pas"/> <UnitName Value="RunTimeTypeInfoControls"/> <TopLine Value="1"/> <CursorPos X="23" Y="4"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit57> <Unit58> <Filename Value="usr\local\share\lazarus\tools\svn2revisioninc.pas"/> <UnitName Value="Svn2RevisionInc"/> <TopLine Value="34"/> <CursorPos X="40" Y="49"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit58> <Unit59> <Filename Value="userdir.pas"/> <UnitName Value="userdir"/> <TopLine Value="62"/> <CursorPos X="10" Y="6"/> <UsageCount Value="11"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit59> <Unit60> <Filename Value="perisettings.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="PSForm"/> <ResourceBaseClass Value="Form"/> <UnitName Value="perisettings"/> <TopLine Value="81"/> <CursorPos X="38" Y="96"/> <UsageCount Value="156"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit60> <Unit61> <Filename Value="graphx.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="Graph4DForm"/> <ResourceBaseClass Value="Form"/> <UnitName Value="graphx"/> <TopLine Value="1043"/> <CursorPos X="29" Y="1055"/> <UsageCount Value="156"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit61> <Unit62> <Filename Value="metagraph.pas"/> <UnitName Value="metagraph"/> <TopLine Value="40"/> <CursorPos X="19" Y="45"/> <UsageCount Value="13"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit62> <Unit63> <Filename Value="render2.pas"/> <UnitName Value="render"/> <TopLine Value="1045"/> <CursorPos X="1" Y="1066"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit63> <Unit64> <Filename Value="RenderThds2.pas"/> <UnitName Value="RenderThds2"/> <TopLine Value="308"/> <CursorPos X="1" Y="333"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit64> <Unit65> <Filename Value="rgb\rgbgraphics.pas"/> <UnitName Value="RGBGraphics"/> <TopLine Value="241"/> <CursorPos X="5" Y="255"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit65> <Unit66> <Filename Value="C:\Desktop\rgbgraphics.pas"/> <UnitName Value="RGBGraphics"/> <TopLine Value="151"/> <CursorPos X="1" Y="165"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit66> <Unit67> <Filename Value="rgb\rgbtypes.pas"/> <UnitName Value="RGBTypes"/> <TopLine Value="1"/> <CursorPos X="131" Y="4"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit67> <Unit68> <Filename Value="C:\Desktop\rgbtypes.pas"/> <UnitName Value="RGBTypes"/> <TopLine Value="45"/> <CursorPos X="5" Y="59"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit68> <Unit69> <Filename Value="..\share\mango.txt"/> <TopLine Value="1"/> <CursorPos X="1" Y="5"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="None"/> </Unit69> <Unit70> <Filename Value="..\share\tempura.txt"/> <TopLine Value="1"/> <CursorPos X="1" Y="3"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="None"/> </Unit70> <Unit71> <Filename Value="rgb\rgbroutines.pas"/> <UnitName Value="RGBRoutines"/> <TopLine Value="26"/> <CursorPos X="1" Y="46"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit71> <Unit72> <Filename Value="..\share\mexico.txt"/> <TopLine Value="20"/> <CursorPos X="4" Y="23"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="None"/> </Unit72> <Unit73> <Filename Value="usr\local\share\lazarus\components\rtticontrols\rttictrls.pas"/> <UnitName Value="RTTICtrls"/> <TopLine Value="18"/> <CursorPos X="31" Y="33"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit73> <Unit74> <Filename Value="usr\local\share\lazarus\lcl\fileutil.pas"/> <UnitName Value="FileUtil"/> <TopLine Value="4"/> <CursorPos X="43" Y="10"/> <UsageCount Value="8"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit74> <Unit75> <Filename Value="cpucount.pas"/> <UnitName Value="cpucount"/> <TopLine Value="55"/> <CursorPos X="24" Y="5"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit75> <Unit76> <Filename Value="..\share\xview.pas"/> <UnitName Value="nifti_img_view"/> <TopLine Value="3594"/> <CursorPos X="20" Y="3617"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit76> <Unit77> <Filename Value="..\share\xhdr.pas"/> <UnitName Value="nifti_hdr"/> <TopLine Value="160"/> <CursorPos X="1" Y="174"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit77> <Unit78> <Filename Value="rgb\rgbcarbonroutines.pas"/> <UnitName Value="RGBCarbonRoutines"/> <TopLine Value="9"/> <CursorPos X="36" Y="23"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit78> <Unit79> <Filename Value="rgb\rgbgtkroutines.pas"/> <UnitName Value="RGBGTKRoutines"/> <TopLine Value="28"/> <CursorPos X="4" Y="36"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit79> <Unit80> <Filename Value="rgb\lazrgbgraphics.pas"/> <UnitName Value="LazRGBGraphics"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit80> <Unit81> <Filename Value="rgb\rgbutils.pas"/> <UnitName Value="RGBUtils"/> <TopLine Value="20"/> <CursorPos X="66" Y="47"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit81> <Unit82> <Filename Value="rgbw\RGBGraphics.pas"/> <UnitName Value="RGBGraphics"/> <TopLine Value="172"/> <CursorPos X="29" Y="186"/> <UsageCount Value="7"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit82> <Unit83> <Filename Value="irender.pas"/> <UnitName Value="render"/> <TopLine Value="1310"/> <CursorPos X="1" Y="1328"/> <UsageCount Value="12"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit83> <Unit84> <Filename Value="render_composite.pas"/> <UnitName Value="render_composite"/> <TopLine Value="808"/> <CursorPos X="46" Y="821"/> <UsageCount Value="13"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit84> <Unit85> <Filename Value="periplot.pas"/> <UnitName Value="periplot"/> <TopLine Value="532"/> <CursorPos X="20" Y="544"/> <UsageCount Value="14"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit85> <Unit86> <Filename Value="periutils.pas"/> <UnitName Value="periutils"/> <TopLine Value="159"/> <CursorPos X="1" Y="183"/> <UsageCount Value="16"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit86> <Unit87> <Filename Value="reslice.pas"/> <UnitName Value="reslice"/> <TopLine Value="202"/> <CursorPos X="46" Y="211"/> <UsageCount Value="12"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit87> <Unit88> <Filename Value="fpmath\fmath.pas"/> <UnitName Value="fmath"/> <TopLine Value="761"/> <CursorPos X="30" Y="852"/> <UsageCount Value="8"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit88> <Unit89> <Filename Value="hrf.pas"/> <UnitName Value="hrf"/> <TopLine Value="135"/> <CursorPos X="29" Y="151"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit89> <Unit90> <Filename Value="fpmath\regmult.pas"/> <UnitName Value="regmult"/> <TopLine Value="119"/> <CursorPos X="1" Y="115"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit90> <Unit91> <Filename Value="clustering.pas"/> <UnitName Value="clustering"/> <EditorIndex Value="11"/> <WindowIndex Value="0"/> <TopLine Value="161"/> <CursorPos X="6" Y="183"/> <UsageCount Value="16"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit91> <Unit92> <Filename Value="ReadFloat.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="ReadFloatForm"/> <ResourceBaseClass Value="Form"/> <UnitName Value="ReadFloat"/> <TopLine Value="38"/> <CursorPos X="38" Y="53"/> <UsageCount Value="117"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit92> <Unit93> <Filename Value="npm\gzio2.pas"/> <UnitName Value="gzio2"/> <TopLine Value="756"/> <CursorPos X="13" Y="797"/> <UsageCount Value="8"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit93> <Unit94> <Filename Value="common\nifti_hdr.pas"/> <UnitName Value="nifti_hdr"/> <TopLine Value="847"/> <CursorPos X="24" Y="850"/> <UsageCount Value="18"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit94> <Unit95> <Filename Value="common\define_types.pas"/> <UnitName Value="define_types"/> <EditorIndex Value="7"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="28" Y="21"/> <UsageCount Value="36"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit95> <Unit96> <Filename Value="common\cpucount.pas"/> <UnitName Value="cpucount"/> <TopLine Value="1"/> <CursorPos X="46" Y="12"/> <UsageCount Value="10"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit96> <Unit97> <Filename Value="common\userdir.pas"/> <UnitName Value="userdir"/> <TopLine Value="35"/> <CursorPos X="14" Y="43"/> <UsageCount Value="17"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit97> <Unit98> <Filename Value="C:\lazarus\lcl\dialogs.pp"/> <UnitName Value="Dialogs"/> <TopLine Value="466"/> <CursorPos X="43" Y="481"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit98> <Unit99> <Filename Value="dicomhdr.pas"/> <UnitName Value="dicomhdr"/> <TopLine Value="464"/> <CursorPos X="50" Y="493"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit99> <Unit100> <Filename Value="rgbnew\rgbgtkroutines.pas"/> <UnitName Value="RGBGTKRoutines"/> <TopLine Value="67"/> <CursorPos X="1" Y="79"/> <UsageCount Value="8"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit100> <Unit101> <Filename Value="render.lfm"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="8"/> <DefaultSyntaxHighlighter Value="LFM"/> </Unit101> <Unit102> <Filename Value="common\GraphicsMathLibrary.pas"/> <UnitName Value="GraphicsMathLibrary"/> <TopLine Value="45"/> <CursorPos X="15" Y="60"/> <UsageCount Value="14"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit102> <Unit103> <Filename Value="reslice_img.pas"/> <UnitName Value="reslice_img"/> <TopLine Value="264"/> <CursorPos X="1" Y="279"/> <UsageCount Value="17"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit103> <Unit104> <Filename Value="ortho_reorient.pas"/> <UnitName Value="ortho_reorient"/> <WindowIndex Value="0"/> <TopLine Value="376"/> <CursorPos X="24" Y="393"/> <UsageCount Value="11"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit104> <Unit105> <Filename Value="common\dicomhdr.pas"/> <UnitName Value="dicomhdr"/> <TopLine Value="77"/> <CursorPos X="63" Y="94"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit105> <Unit106> <Filename Value="C:\lazarus\components\cgi\cgimodules.pas"/> <UnitName Value="cgiModules"/> <TopLine Value="1"/> <CursorPos X="53" Y="19"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit106> <Unit107> <Filename Value="reslice_fsl.pas"/> <UnitName Value="reslice_fsl"/> <TopLine Value="25"/> <CursorPos X="27" Y="38"/> <UsageCount Value="19"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit107> <Unit108> <Filename Value="..\mricrogl\sourcex\mricrogl.lpr"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="8"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit108> <Unit109> <Filename Value="..\gl\Source\Base\OpenGL1x.pas"/> <UnitName Value="OpenGL1x"/> <TopLine Value="5131"/> <CursorPos X="10" Y="5142"/> <UsageCount Value="8"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit109> <Unit110> <Filename Value="imgutil.pas"/> <UnitName Value="imgutil"/> <WindowIndex Value="0"/> <TopLine Value="45"/> <CursorPos X="29" Y="3"/> <UsageCount Value="13"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit110> <Unit111> <Filename Value="batch.pas"/> <UnitName Value="batch"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="98" Y="2"/> <UsageCount Value="18"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit111> <Unit112> <Filename Value="fdr.pas"/> <UnitName Value="fdr"/> <TopLine Value="1"/> <CursorPos X="51" Y="73"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit112> <Unit113> <Filename Value="statclustertable.pas"/> <UnitName Value="statclustertable"/> <TopLine Value="279"/> <CursorPos X="19" Y="279"/> <UsageCount Value="12"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit113> <Unit114> <Filename Value="reorient.pas"/> <UnitName Value="reorient"/> <TopLine Value="54"/> <CursorPos X="35" Y="56"/> <UsageCount Value="14"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit114> <Unit115> <Filename Value="C:\lazarus\fpc\2.2.2\source\rtl\objpas\sysutils\osutilsh.inc"/> <TopLine Value="31"/> <CursorPos X="10" Y="38"/> <UsageCount Value="12"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit115> <Unit116> <Filename Value="npm\part.pas"/> <UnitName Value="part"/> <TopLine Value="1"/> <CursorPos X="11" Y="31"/> <UsageCount Value="12"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit116> <Unit117> <Filename Value="graphx.lrs"/> <TopLine Value="1"/> <CursorPos X="1" Y="153"/> <UsageCount Value="10"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit117> <Unit118> <Filename Value="landmarks.lfm"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="10"/> <DefaultSyntaxHighlighter Value="LFM"/> </Unit118> <Unit119> <Filename Value="landmarks.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="AnatForm"/> <HasResources Value="True"/> <ResourceBaseClass Value="Form"/> <UnitName Value="landmarks"/> <TopLine Value="166"/> <CursorPos X="50" Y="175"/> <UsageCount Value="63"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit119> <Unit120> <Filename Value="prefs.lfm"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="LFM"/> </Unit120> <Unit121> <Filename Value="C:\usr\share\fpcsrc\rtl\unix\baseunix.pp"/> <UnitName Value="BaseUnix"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit121> <Unit122> <Filename Value="common\isgui.inc"/> <EditorIndex Value="12"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="57" Y="1"/> <UsageCount Value="18"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit122> <Unit123> <Filename Value="batchstatselect.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="batchstatselect"/> <TopLine Value="58"/> <CursorPos X="64" Y="69"/> <UsageCount Value="52"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit123> <Unit124> <Filename Value="yokeipc.pas"/> <UnitName Value="yokeipc"/> <TopLine Value="3"/> <CursorPos X="29" Y="105"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit124> <Unit125> <Filename Value="yokesharemem.pas"/> <UnitName Value="yokesharemem"/> <EditorIndex Value="1"/> <WindowIndex Value="0"/> <TopLine Value="73"/> <CursorPos X="1" Y="124"/> <UsageCount Value="14"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit125> <Unit126> <Filename Value="winmemmap.pas"/> <UnitName Value="winmemmap"/> <TopLine Value="2"/> <CursorPos X="56" Y="9"/> <UsageCount Value="10"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit126> <Unit127> <Filename Value="C:\usr\lib\lazarus\lcl\interfaces\gtk\interfaces.pp"/> <UnitName Value="Interfaces"/> <TopLine Value="1"/> <CursorPos X="17" Y="13"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit127> <Unit128> <Filename Value="C:\lazarus\fpc\2.4.1\source\rtl\win\wininc\defines.inc"/> <TopLine Value="1"/> <CursorPos X="64" Y="301"/> <UsageCount Value="10"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit128> <Unit129> <Filename Value="common\dialogsx.pas"/> <UnitName Value="dialogsx"/> <WindowIndex Value="0"/> <TopLine Value="6"/> <CursorPos X="18" Y="15"/> <UsageCount Value="14"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit129> <Unit130> <Filename Value="..\mricrogl\source\common\nifti_hdr.pas"/> <UnitName Value="nifti_hdr"/> <TopLine Value="47"/> <CursorPos X="26" Y="49"/> <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit130> <Unit131> <Filename Value="C:\usr\share\fpcsrc\packages\fcl-process\src\process.pp"/> <UnitName Value="process"/> <TopLine Value="25"/> <CursorPos X="70" Y="25"/> <UsageCount Value="10"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit131> <Unit132> <Filename Value="otsu.pas"/> <UnitName Value="otsu"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="9" Y="6"/> <UsageCount Value="19"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit132> <Unit133> <Filename Value="C:\Developer\lazarus\lcl\interfaces\carbon\carbonobject.inc"/> <WindowIndex Value="0"/> <TopLine Value="206"/> <CursorPos X="1" Y="228"/> <UsageCount Value="11"/> </Unit133> <Unit134> <Filename Value="otsu2.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="otsu2"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="13" Y="98"/> <UsageCount Value="29"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit134> <Unit135> <Filename Value="CarbonOpenDoc.pas"/> <UnitName Value="CarbonOpenDoc"/> <EditorIndex Value="3"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="39" Y="6"/> <UsageCount Value="12"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit135> <Unit136> <Filename Value="fastsmooth.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="fastsmooth"/> <EditorIndex Value="4"/> <WindowIndex Value="0"/> <TopLine Value="16"/> <CursorPos X="17" Y="28"/> <UsageCount Value="29"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit136> <Unit137> <Filename Value="common\gzio2.pas"/> <UnitName Value="gzio2"/> <EditorIndex Value="10"/> <WindowIndex Value="0"/> <TopLine Value="761"/> <CursorPos X="15" Y="791"/> <UsageCount Value="12"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit137> <Unit138> <Filename Value="otsuml.pas"/> <UnitName Value="otsuml"/> <EditorIndex Value="5"/> <WindowIndex Value="0"/> <TopLine Value="275"/> <CursorPos X="11" Y="15"/> <UsageCount Value="11"/> <Loaded Value="True"/> <DefaultSyntaxHighlighter Value="Delphi"/> </Unit138> <Unit139> <Filename Value="..\..\..\..\..\Developer\lazarus\lcl\interfaces\carbon\carbonobject.inc"/> <EditorIndex Value="2"/> <WindowIndex Value="0"/> <TopLine Value="197"/> <CursorPos X="1" Y="228"/> <UsageCount Value="11"/> <Loaded Value="True"/> </Unit139> </Units> <JumpHistory Count="30" HistoryIndex="29"> <Position1> <Filename Value="common\gzio2.pas"/> <Caret Line="2" Column="115" TopLine="1"/> </Position1> <Position2> <Filename Value="common\gzio2.pas"/> <Caret Line="99" Column="29" TopLine="73"/> </Position2> <Position3> <Filename Value="common\gzio2.pas"/> <Caret Line="738" Column="28" TopLine="712"/> </Position3> <Position4> <Filename Value="common\gzio2.pas"/> <Caret Line="737" Column="24" TopLine="721"/> </Position4> <Position5> <Filename Value="nifti_img_view.pas"/> <Caret Line="4524" Column="1" TopLine="4503"/> </Position5> <Position6> <Filename Value="nifti_img_view.pas"/> <Caret Line="4859" Column="61" TopLine="1"/> </Position6> <Position7> <Filename Value="nifti_img_view.pas"/> <Caret Line="1" Column="105" TopLine="1"/> </Position7> <Position8> <Filename Value="common\gzio2.pas"/> <Caret Line="699" Column="13" TopLine="668"/> </Position8> <Position9> <Filename Value="nifti_img_view.pas"/> <Caret Line="3192" Column="2" TopLine="3183"/> </Position9> <Position10> <Filename Value="nifti_img_view.pas"/> <Caret Line="23" Column="52" TopLine="4"/> </Position10> <Position11> <Filename Value="fastsmooth.pas"/> <Caret Line="8" Column="57" TopLine="2"/> </Position11> <Position12> <Filename Value="fastsmooth.pas"/> <Caret Line="9" Column="40" TopLine="2"/> </Position12> <Position13> <Filename Value="fastsmooth.pas"/> <Caret Line="14" Column="67" TopLine="2"/> </Position13> <Position14> <Filename Value="fastsmooth.pas"/> <Caret Line="28" Column="17" TopLine="16"/> </Position14> <Position15> <Filename Value="CarbonOpenDoc.pas"/> <Caret Line="3" Column="1" TopLine="1"/> </Position15> <Position16> <Filename Value="CarbonOpenDoc.pas"/> <Caret Line="10" Column="64" TopLine="1"/> </Position16> <Position17> <Filename Value="nifti_img_view.pas"/> <Caret Line="3" Column="28" TopLine="1"/> </Position17> <Position18> <Filename Value="nifti_img_view.pas"/> <Caret Line="27" Column="55" TopLine="1"/> </Position18> <Position19> <Filename Value="nifti_img_view.pas"/> <Caret Line="1570" Column="50" TopLine="1511"/> </Position19> <Position20> <Filename Value="nifti_img_view.pas"/> <Caret Line="4" Column="82" TopLine="1"/> </Position20> <Position21> <Filename Value="nifti_img_view.pas"/> <Caret Line="5" Column="84" TopLine="1"/> </Position21> <Position22> <Filename Value="nifti_img_view.pas"/> <Caret Line="225" Column="21" TopLine="171"/> </Position22> <Position23> <Filename Value="nifti_img_view.pas"/> <Caret Line="1223" Column="20" TopLine="1169"/> </Position23> <Position24> <Filename Value="nifti_img_view.pas"/> <Caret Line="1227" Column="29" TopLine="1173"/> </Position24> <Position25> <Filename Value="nifti_img_view.pas"/> <Caret Line="1245" Column="7" TopLine="1195"/> </Position25> <Position26> <Filename Value="nifti_img_view.pas"/> <Caret Line="1232" Column="17" TopLine="1195"/> </Position26> <Position27> <Filename Value="nifti_img_view.pas"/> <Caret Line="1244" Column="23" TopLine="1195"/> </Position27> <Position28> <Filename Value="nifti_img_view.pas"/> <Caret Line="1246" Column="54" TopLine="1224"/> </Position28> <Position29> <Filename Value="nifti_img_view.pas"/> <Caret Line="1241" Column="81" TopLine="1213"/> </Position29> <Position30> <Filename Value="about.pas"/> <Caret Line="40" Column="65" TopLine="4"/> </Position30> </JumpHistory> </ProjectOptions> <CompilerOptions> <Version Value="9"/> <PathDelim Value="\"/> <Target> <Filename Value="mricron"/> </Target> <SearchPaths> <Libraries Value="rgb;fpmath"/> <OtherUnitFiles Value="rgb;fpmath;common"/> </SearchPaths> <Parsing> <SyntaxOptions> <SyntaxMode Value="Delphi"/> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <CodeGeneration> <SmartLinkUnit Value="True"/> <Optimizations> <OptimizationLevel Value="2"/> </Optimizations> </CodeGeneration> <Linking> <Debugging> <StripSymbols Value="True"/> </Debugging> <LinkSmart Value="True"/> <Options> <Win32> <GraphicApplication Value="True"/> </Win32> </Options> </Linking> <Other> <WriteFPCLogo Value="False"/> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> <Debugging> <Exceptions Count="2"> <Item1> <Name Value="ECodetoolError"/> </Item1> <Item2> <Name Value="EFOpenError"/> </Item2> </Exceptions> </Debugging> </CONFIG> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/mricron.ini��������������������������������������������������������0000664�0001750�0001750�00000001333�11645606520�020027� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[MRU] file1=C:\Users\neuropsych\Desktop\co20100726_122439WIPT1_TFE12_IsoSENSEs003a001.nii.gz file0=C:\Users\neuropsych\Desktop\co20100726_122439WIPT1_TFE12_IsoSENSEs003a001.nii.gz file2=C:\pas\mricron\templates\ch2bet.nii.gz [STR] FSLBASE=/usr/local/fsl FSLOUTPUTTYPE=FSLOUTPUTTYPE=NIFTI_GZ [BOOL] Reslice=0 ResliceOrtho=1 ShowDraw=1 ThinPen=1 Smooth2D=1 XBar=1 OverlaySmooth=0 LRmirror=0 Yoke=1 SingleRow=1 FlipAx=0 FlipSag=0 [INT] FontSize=12 MaxDim=384 LicenseID=0 Zoom=0 LUT=0 XBarGap=7 XBarThick=3 XBarClr=16711680 VOIClr=255 BGTransPct=0 OverlayTransPct=20 MaxThreads=2 LesionSmooth=3 SigDigits=5 ImageSeparation=0 SPMDefaultsStatsFmriT=16 SPMDefaultsStatsFmriT0=1 LesionDilate=0 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/mricron.ico��������������������������������������������������������0000664�0001750�0001750�00000073306�11660465464�020042� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������00����Ј��†��� ����Ј ��.������Ш��ж)������h��ž0��00�� �Ј%��6�� �� �Ј��Ў[���� �h��Vl��������Оp��(���0���`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ёё№ššС~~ВyyДDDž++˜EEЇЇЇгЃЃФ������������������������������������������������������������������������������������������������������������ххьППлОNNЊ “Ž��’��š�� ��Ї�� <<СВВЮ������������������������������������������������������������������������������������������������ддшЂЂЯ``Г™����‘��›��Ѕ��Џ��Е��Л��С��Чб��а/0к���������������������������������������������������������ГГУ››МvvЋMM•66Œ‚MM•……Н››Ъ­­еššЯssРGGЎЁ��˜�� ��Ќ��ЕМТЧ�Э�в�и�о�х�ы№іžšџ������������������������������������������������•—ИXYš=>Ž-.ˆ"#‡‡‰ ‹‘–��“����Ё��Ѕ��Ў��ЙТЩ�Ю��г��й�п�ц�ь��ё��і��љ��ћ��ќ��ќ ћUeџ������������������������������������������ОТл8:”y��~��…����”��œ��Є�Њ��Џ��ЖМСШЯжк��п��х�ь�ё�і��љ��ћ��ќ�ћ�ћ&�њ@�ј[�јn�ї~љМHˆЭamаnwз‚‚и������������������������������#Ѕ��Ž� ІЋА Ж��М��С��Ш��Ю��д�к�р�ц��ь��№��ѕ�ј�ћ��ќ��ќ��ћ)�њU�љ‰�јБ�љд�љѓ�њџ�њџ�єџ�џџ�­ѓ��с��д��Ц��РЙРRRЯŠŠуЮЮ���������������{}и#ZО|В�ЃМ�ВС�КЧ�КЬ�Вв�Ђи�†о�]х�*ы�№��ѕ��љ��ћ�ќ�ќ�ќ��ќ��ћ'�јv�љМ�љу�љџ�њџ�ќџ�ќџ�ќ§�љћ�ѕњ�џљ�Ъљ�њіяхж��Щ��Л��Џ��И;;Фjj���������Ъџбoџbёwнц�фз�шт�юч�єь�ќђ�џі�џљ�ўћ�єћ�Шњ�~љ�3њ�ћ��ћ��ћ��њ<�їЉ�їђ�љџ�њџ�ќџ�ќњ�ќј�ћњ�љћ�їќ�џ§�џў�Вў�џ��§�ў��ў��§��ї��цзЭЛ��Ф;;шЧЧ������;ћ?ћ �ћ�ѓЬ�іќ�њѓ�ћќ�§ќ�ќ§�ћќ�ќќ�ќќ�џћ�џћ�џћ�љњ�Вљ�Sњ љ�іќ�љџ�ћџ�ќћ�ћњ�њќ�љ§�ї§�њџ�џў�џџ�еў�eў�ў��§�§��ќ��ў��§��ў��ў��ё��с��зХ��йmm������%ў%§§џ+�ўн�ўџ�§ѕ�ўљ�§њ�ќњ�§ќ�ўќ�§ћ�ћћ�њќ�§ќџћ�ўњmВљџњљ�њћ�ј§�іў�їў�њ§�џџ�џў�§ў�Яџ�mў�џ��ў��џ�ў��ў��ў��§��§��§��ў��ў��њ��ѓээ������)§))ў)$§'§ §.§Я�ўџ�§ў�ўљ�§ї�§ј�§ј�§љ�ўљ�ўљ�ћјљјњїЊџњќЗњїћў�џў�џў�џџ�іў�зў�œџ�Jџ�ў��џ��ў�џ��ў��џ��ў��џ��ў��ў��ў��§��ќўџџ џ++������LџL8§72ў2+ў0!§ў �§Š�ќп�§џ�ўџ�ўџ�ўџ�ўџ�ўџ�ўџўџ�ўџ§џЬњџўџџњAђў�а§Ћў�xў�Eџ�џ��ў��џ��џ�џ�џ��ў��џ��ў��џ��ў��џ��ў��џ��ў��§ ўўўў11ўШШ���dўd>ў>AўA;§;1ў5'ў!§��§�ќO�§�ќœ�ќА�ќЛ�ќО�ќИќЎ�ћ"њ‰эіoўџLћІ-ў�ўў��џ��џ��џ�џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��ў��џ��ў��џџџ!!џ''џ**џ''џ__������/ў/GўGLўL@§?:§=§�ў��ў��ў��§��§��§�ќ�ўќ��§�6§�џћ�ќў�§х�ў"�ў�ўџ�џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��ў��џ��ўў**ў,,ў55ў55ў88���������ˆџˆGџG[џ[MўMLўL(ў(�§�§�§�§�ў��§��ў��ў�ў��ўL§ў§ћњ§§ўcў��ў�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џџ((џ66џ88џBBџ;;џ@@������������MџMRўRbџbXџXAџAџ�ў��џ��ў��ў��ў��§��ў�§��§�Z§�џў�њј�ўџ�џЅ�џ�џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џџ==џAAџFFџMMџIIџII������������џMџMlўleўeYўYў�џ��ў��џ��џ��џ��ў��џ�ќ��ў�`ќ�џ§�ћњ�§ў�ўк�ў�ў��џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ--џKKџLLџUUџMMџQQ������������������DџDRџRxџxmџm%џ%�ў��џ��ў��ў��ў��ў��ў�§��§�\§�ў§�њ§�§ћ�џќ�ў?�џ��џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џџNNџUUџXXџaaџRRџ……���������������������bџbhџhƒџƒSџSџ�џ��џ��џ��џ��ў��џ�§��ў�M§�ўў�ћў�ўљ�џџ�џu�џ��џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џџ��џџBBџ``џ]]џjjџ[[џƒƒ������������������������fџfVџV|џ|…џ…EџEџ�џ�џ�џ��ў��ў�§��§�6§�ў§�ћ§�§њ�ўў�ўŸ�ў��џ�џ��џ��џ��џ��џ��џ��џ��џ��џџ��џ��џ џEEџffџddџrrџjjџ__������������������������������kџkQџQˆџˆ‰џ‰TџT џ �џ��џ�§�џ�§��§�!ќ�ьќ�ў§�ћћ�џџ�ўР�џ�џ��џ��џ��џ��џџ��џ��џ��џ��џ��џџ++џZZџllџkkџxxџmmџ\\������������������������������������]џ]^џ^“џ“‘џ‘pџp.џ.џ�ў��ў�§�§�§�Ч§�ў§�њќ�ўџ�ўк�ў�ўџџ��џ��џ��џ��џ��џџџ77џXXџooџppџttџ||џssџss������������������������������������������uџuQџQ•џ•“џ“‡џ‡bџb#ў#ў�џ�§��§›ќ�џў�јћ�ўџ�ўх�ў �џ��џ��џ��џџџ!!џ99џRRџffџqqџrrџttџџ‚‚џ€€џ‡‡������������������������������������������������`џ`\џ\џ˜џ˜џˆџˆb§b/ў/ §�ў�Xћ�ќ§њќ�§џ�§у�џўџ('џ::џKKџ[[џffџmmџppџqqџvvџџˆˆџzzџnnџxx������������������������������������������������������ˆџˆhџh‰џ‰ џ ”џ”ŒўŒ…џ…lўj7§8ќ гћ�ў§�ћ§ўи,ўGEўQRџ\[џaaџddџhhџjjџnnџyyџ„„џ††џ€€џnnџ‘‘���������������������������������������������������������������rџrRџRhџh’џ’ џ ‘ў‘‰ў‰Šќ…Z§lšќ+џљ�ќџ1ўК]ўLTў][џ``џeeџkkџttџ€€џ‰‰џ€€џttџuuџџЉЉ������������������������������������������������������������������������ЄџЄuџulўl§˜џ˜•§”“ў’‡ћнџ&џъ ќv\џhmўsrџxxџ}}џџ{{џmmџ__џxxџ™™џЖЖ������������������������������������������������������������������������������������žџžyўyuўuoўpo§lpћxЂъ…іu,§§<:џMMџVVџWWџ__џjjџ’’џЉЉ���������������������������������������������������������������������������������������������������|ў|!§ §Hћ@���ўГТўqp§ ў++џ::џooџАА���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџРџ��џџў�џ��џџ№�џ��ў���џ��ј���џ��р������р������Р������€������€������€������€������€�������€�������Р������Р������р������р������№������ј������ј������ќ������ў����?��џ������џ€���џ��џР��џ��џр��џ��џј��џ��џў��џџ��џџ„џџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��(��� ���@��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������……НaaЄ……Н������������������������������������������������������������������������������ЯЯу……НRRЄ55Ÿ›Ё^^РССк������������������������������������������������������������ххэВВиxxП44Їž����Ј��Г��Р��Щ��Я$!и������������������������������������psЃLP•26ˆ‰45ЂCC­<<ВЌ��Ї��Џ��Н��Ъжп�ч��ю��ѕ�љ ў€Žџ���������������������������pkГ!Ž�ˆ����˜��Ѓ��­��Г��М��Ц��гпш�я��є��ј�ћ&�ћJ�ћj�ї†�ћšъН6`ТIZН]qЯˆˆмЛЛ���������������<Е�SЇ�zКТuЫ�Yе�5о ч�я�ѕљ�ќ��ќ�ќQ�ћ–�њб�љё�љџ�іџ�§џ�џџ�eњ��щ��з��СИР]]���������zџgђtыђ�іу�§ю�џє�џј�љћ�кќ�–ћ�Aћ��ћ�љ€�їр�јџ�љџ�їџ�јџ�ўќ�џњ�хљ�]њ��§ўќю��е��П��Юbb������ќ §ћБ�ћџ�ќњ�ћј�њј�ўљ�џљ�џљ�ќјЙіМ/ѕџ�їџ�ќћ�џњ�џќ�џ§�уў�‰ў�ў��§�§��§��ў��џ��љът������1§2'§$§§�§џ�§џ�ўџ�§џ�§џњџ�ќџ.џџ§оџќ џќ�ќ§�сџ�Їў�]џ�ў��џ��џ�ў��ў��ў��ў��§��ўџџ§^^���>ў>;ў=3§2§�§@�§Œ�§Г�§Ц�ќЭќШ�ќМRѕЋ§џŽќcc§�8§ ў��ў��ў��џ�ў�ў��џ��џ��ў��џ��ўўў$$ў$$ўss���QўQIўIKўL:ў<ў��§��§��§�§§�§�pњ�ўў�њЛ�§��ў�џ�ў�џ�џ��џ��џ��ў��ў��џ��ў��џџ00џ55ў88���������WџWZўZWўWў�ў�ў�ў��ў�ў��§�…ќўўњѕў"ў��џ�ў��џ��џ��џ��џ��џ��џ��ў��џў11ўAAўGGўEE���������tўtSџSqџq3џ3�џ�џ�џ��џ�§��§�‹ќ�џњ�ћџ�џa�ў��џ�џ��џ��џ��џ��џ��џ��џџ��џџNNџTTџSSџpp������������iўinўnfўfў�ў�ў�ў�ў��§�€§�ўљ�њў�ўš�ў��ў�ў��џ��џ��џ��џџџ��џџHHџbbџaaџrr������������������bџbџZџZџ�џ�џ§�§�e§�ўћ�ћў�ўС�§�џ��џ��џџ��џ��џ��џ��џџNNџllџllџ__������������������������eџeџqџq!џ!�ў��ў��§�Dќ§ќ�ўџ�ўмў �ў��ў��џ��џ��џџџAAџhhџxxџ~~џ||���������������������������tџt]џ]“џ“џYўY ў �ў�ќ�цћ�ўў�§х�ў�ўџџ**џ@@џZZџooџ||џ}}џttџff������������������������������������nџn‘џ‘§ŒџŒb§_§(šњ�џў�њсў@:ўLNў^]џjjџuuџ{{џ{{џxxџ‚‚џ››������������������������������������������AџA~ў~ўšў—‹§“‰ћcљџ§ПL§_lўpmўqqџssџrrџssџ‰‰џŸŸ������������������������������������������������������‡ў‡}ў}p§li§xЙщjўiiўiiўYXўiiџ{{џџФФ������������������������������������������������������������������§}ў}������џўiiџ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџуџџџ�џџ№�џ№��Р��Р��€��€��€���€���€��Р��Р��р��№��ј��ј��ў��?џ��џџРџџѓџџџџџџџџџџџџџџџџџџџџџ(������0�����������������������������������Е���П���Ф���Я���б���п���р���ъ���ь���ѓ��є��ћ��д��>Ч��LЅ��PЙ��Фћ��ъП��ёњ��ѕЭ��ќ��ќН��ќб��ќт��ќџ��§���§��§„��§џ��ў���џ���џї��џџ�љ�rњ�ў��ў�џ��џя�џџ�Й�љж�ћј�§�ў��ў�џ��Њ�ќ�7Ѕ� ј�ў�џ;��ќ-�œ�Ј�ў�џ� Ж�Ј��ћ�!�$#œ�%-п�-ћ!�0ьF�2ў2�3ќ(�53Ї�8џ8�:ў3�;§?�< џ�<хџ�?1�B�ќ�Iћ��JJЂ�NMЕ�PќP�PўR�Q§Z�TўS�YўY�YџY�Zў\�\ZЪ�^ў`�_џ_�`�і�bўb�fўf�gџg�oџН�vџv�wwГ�zўy�|zК�|џ|�~ћ�ћ�€vА�П�ƒ�њ�…§…�††Ш�џ�ŽўŽ�Žџ�ќ��•ў‘�šњ��›ў›�œuЪ�Ÿљ� ˆг�­ўH�ЗЗг�К�ї�Х �Х__�Э$�а���б�і�м �о�њ�хџ��ю���ю��є �ѕ�џ�ї�l�љ*��љVT�љЎ��њ�‘�њo�њд��ћ�‡�ћ�е�ћц��ќ���ќћ�ќ14�ќЙ�§���§��§�&�§6�§�§>8�§LM�§TT�§Yg�§�§Љ2�ў���ў��ў��ў��ў��ў�ў�ў��ў�ў ��ў�ў77�ў::�ўLL�ўPP�ўQQ�ўUU�ў]\�ўcc�ўpm�ўtt�ўї��ўџ��џ���џ�ƒ�џ�є�џ�њ�џ�џ�џ��џ�џџ�џ��џ�џ�џ�џ""�џ&&�џ44�џ;џ�џAA�џ[[�џaa�џcc�џee�џmm�џss�џtt�џyy�џ{{�џ}}�џ�џƒƒ�џ††�џŠŠ�џь�џў��џџ�џџџ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������waO@Fc���������������hkP=0A��������gL?689<) 3>Jsu�����X2  1Mix„‰‚~{z���C+' #"[}ИЙЙЗЖ “|y��;5!(!KФМŒ•ž““žЛ—ƒЌ�IE7*_’…–ЂžЕЁžžžЄЈСš�TRH-,oГ†“К ŸЕЕЕЕРЉЊЎ��VY4%&tжŠ”ІЕЕЕžЃžЊЋ­���]`G./qеˆžНЕЛЛЕЕТЧШа����UdD$fД‹ЅžžЕЕОУЪЪЦ������^l\:NеŽЇŸПСХЩЮЬЭ��������ZjnWB€д˜™АЫЯбг�����������rmpev›БВЮвЬ��������������bQS‡‘Џœ���������������������������������������������������������������������������������������������������������џџџ�џџџ�џџџ�џџџ�џџџ�џ№?�џ€?�Р��€��€��€���€���€���Р��Р��р��№��ј��ќ�?�џџ�џџџ�џџџ�џџџ�џџџ�(������ �����������������������������������Ъ���ж���у��Ы�� О��К��ђћ��і��ќ���ќџ��§���§Ф��џ���џй�Ћџ�шџ�њ��§ �џк�сk� ;Љ� ў �ўk�KŸ�!И�&ф� џ�'џ,�->џ�/џ!�0�ђ�9ў+�;2œ�M§]�PPН�WjО�Y§Z�bY �f§f�hџk�iу=�jџj�lўk�lџ�oўo�oџp�t�џ�}nЏ�‹�џ�Œўˆ�ŽЮ�ŽљŽ�љЩ�џ��‘ŒХ�Є�Ч�ЄЇд�Ќџ��Ўxœ�Гў�Фџ�ХZn�Я[[�к��лH[�уЋB�ё���љ���њ���њ�j�њ$�њ��ћ���ќ�ќ>5�§���§�§�§{��§}{�ў���ў��ўџ�ў��ў�ў�ўBB�ўKM�ўNN�ўPP�ўdd�ўjj�ў‚‚�ўР�ўы �џ���џ��џ�ž�џ�ѕ�џ�џ�џ �џ�џ#Ѓ�џ))�џ::�џT]�џ[[�џuu�џ‚‚�џ‡‡�џт��џџџ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������&!��������0793#�����$/18A>;�) =Scba`C@? 5hFGDENegj�% :OITRd`VWY�*( <^JM`QUZ[���+' 6pHLfilm�����-2",_KX\no��������4.BkP]�����������������������������������������������������џџ��џџ��џџ��џŸ��р��€����������€���€��Р��р��ј��џџ��џџ��џџ��(���0���`���� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џ“��џ№��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џя��џF������������������������������������������������������������������������������������������������������������������������������������������џ��џP��џС��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџњџ<����������������������������������������������������������������������������������������������������������������������������������џ��џб��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџ==џт����������������������������������������������������������������������������������������������������������������������џ)��џш��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ##џџhhџџooџџџџџ��������������������џЊЊџџпџџы џџџ џџџџџџ��������������������������������������������������������������џe��џЧ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџLLџџrrџџppџџџџџ����������������џ��џ))DџJHnџ[W‡џmgcџшзџџъ ����������������������������������������������џ ��џn��џЁ��џе��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџhhџџwўџ“oєџџUџ��oџ��Œџ��Цџ��фџ��§џџџ>:џџXTџџXTџџKGьџtnXџџП��������������џ ��џМ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ�јџt�жџх�Юџќ�ьџџ�џџџ�џџџџџџџџџvџџџvџџџaўџџџџ��џџ��џџ��џџ��џџ��џџ џџ)'џџTPџџtnџџrlџџhcџџOMxџџц џџџ������џ}��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ�џџ�,їџ�ГЮџ�овџ�їчџјШ§џџZџџџџџџ�џџџ�џџџ�џџџ�џџџџџџ8џџџwџџџnџџџ9Бџџ��џџ��џџ��џџ��џџ��џџ��џџџџџџ=:џџrlџџtoџџrlџџC@№џœ•&џџџ������џд��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ�5єџ�обџ�§ђџ�џџџ�џџџѕџџлОџџџџџџџџџџџЉџџџ�џџџ�џџџ�џџџџџџџџџ^џџџsџџџVяџџ$џџ��џџ��џџ��џџ��џџ��џџ��џџџџ џџ%#џџlgџџtnџџtoџџUQџџ@= џџц ��џ��џќ��џџџџџџџџџџџџ��џџ� џџ�зџ�ђтџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџіџџ§ъџџџџџџџџџџџџџџџџџџџeџџџџџџџџџ*џџџfџџџtџџџ*rџџџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџOKџџlgџџtnџџjdџџGDџџC>_������џш��џџџџџџџџџџџџљџ�ќёџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџЊСџџџџџџџџџџџџџџџџџџџџџџџыџџџ%џџџ/џџџiџџџsџџџcќџџџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ:8џџc^џџrmџџniџџPLџџ0-š����џвџџџџ џџ џџ џџwоџћьџџџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџтШџџџџџџџџџџџџџџџџџџџџџџџџџџџМџџџnџџџsџџџ_їџџ(aџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ*(џџZVџџqkџџpjџџSOџџ1-Ѓџџџџtџџ21џџ55џџ=хџ5ўџџ'џџџўџџ џџџ џџџ џџџџџџџџџ#џџџ8џџџGџџџWџџџџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзџџџ7џџџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџRNџџojџџoiџџQMџџ53Œџџџ@@џ%00џў~}џџwЬцџvўџџiџџџXўџџHџџџEџџџLџџџTџџџgџџџjџџџlџџџoџџџqџџџtџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћџџявьџџџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ" џџUQџџpjџџlgџџLHџџ73|џџџџџџJJџгžЪђџЊўўџВўџџЈўџџ˜ўџџˆўџџuџџџtџџџtџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџџџџџџџџџяаьџіыOџџџ џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ,*џџ[WџџqlџџgbџџB?џџSKDџлџџџџћћџ3АўџџУўџџЬўџџРўџџЎўџџšўџџ~џџџyџџџxџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџњџџфЫеџљщEџџџ џџџ�џџџ�џџџ�џєJ�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ џџSOџџnhџџtnџџXTџџ:7Дџџу џџџџџџџљџ.ЉўјџХўџџаўџџФўџџВўџџўџџ€џџџzџџџxџџџuџџџsџџџrџџџoџџџmџџџkџџџѕејџчЫХџјю>џџџџџџџџџ�џџџ�џџџ�џџџ�џмБ�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџџџd`џџrmџџtnџџMIџџA?rџџЬџџџџџџџџџ+‡§ŽџЕўгџЪўєџСўџџЎўџџ—ўџџvџџџoџќџjџѓџ[џрџRџбџHџЙџ4џ|џ*џZџ џ4џјџ џџџџџџџџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џоц�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџ84џџojџџtoџџrlџџ<9ѕџz$џџџџџџџџџџџџ uўu冧†џž§žџž§žџ„ў„џcўcџ'џ'џўџ џ џџџџџ�џ�џ�џ�џ�џ�џ�џ�џЉџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џѕ<�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџ20џџTPџџjeџџtoџџqlџџ`[џџБЈџџџ����џџџџџџ џѕџВ§Вuuўuў’§’џ § џŽўŽџs§sџ7ў7џ!џ!џўџџџџџџџ�џ�џ�џ�џ�џ�џsџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џыw�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџџџVQџџkfџџsmџџsnџџjeџџMJџџппџџџ����џџџџџџџ№џџћџ@}ў}Х€ў€џŸўŸџ™§™џ†ў†џPџPџ8ў8џ$ў$џ џ џџџџџџџ�џ�џ�џ�џ=џ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џфŠ�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџ85џџlgџџsnџџuoџџojџџ[Vџџ=:лџџџ������������џџџџџџџїџџњџ5ЮќЮd‰ў‰џš§šџŸ§Ÿџ‰ў‰џsўsџ[ў[џ/ў/џўџџџџџџџџџ�џ�џбџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџџџџ�џзІ�џџ��џџ��џџ��џџ��џџџџџџџџB>џџ]YџџniџџuoџџtoџџqkџџEB§џOJgџџу ����������������џџџџџџџџџџјџ"џџџ9wўwїŒ§Œџœ§œџ§џŽўŽџ{§{џLўLџ7ў7џ%џ%џџџџџџџџџœџџџџ�џџџџџџџџџџџџџџџџџџџџџџпЃџџџџ��џџ��џџ��џџ џџџџ20џџc^џџojџџtnџџtoџџqlџџd`џџJFxџџш џџџ��������������������џџџџџџ џђџџјџ%Љ§Љ†vўvќŽ§ŽџЄ§Єџ ў џ•§•џmўmџWўWџAџAџџџџџ џ џџџhџџџџџџџџџџџџџџџџџџџџџџџџџџѕeџџџџ��џџџџџџ%$џџA>џџZVџџrlџџtoџџuoџџqlџџfaџџJGџџџъ џџџ����������������������������џџџџџџџџџ џљџ(џћџ?І§І‹ŒўŒџўџІўІџЁ§Ёџ”ў”џƒўƒџYўYџDџDџ3ў3џџџџџыџџџџџџџџџў џџџ'џџў)џџў(џэѕџџџџџџџџ2/џџHEџџkfџџrlџџtoџџtoџџsnџџniџџGDџџ=:Ѓџџэ������������������������������������џџџџџџџџџџџџџџџ'џџџ=w§wѓ‰ў‰џ›§›џЊ§ЊџІ§Іџœўœџ{ў{џgўgџSўSџ7ў7џ0џ0џЁў.џџў4џџў:џџџ>џџўIџџўHџџўFџчТ4џџ-,џџ-+џџLHџџ\WџџidџџsnџџtoџџtoџџqkџџjdџџXTџџLJkџџџ џџџ����������������������������������������џџџџџџџџџ џѓџџџџ%Ч§Чkwўwъ„ў„џЄ§ЄџЉўЉџЉ§Љџ—§—џ‡ў‡џvўvџ[ў[џTўTџoўSџџў_џџўgџџўmџџ§uџџ§rџџ§mџџg[џџZWџџ\Xџџkfџџpkџџsnџџtoџџsnџџqlџџ_ZџџKHџџ<:аџџџџџџ����������������������������������������������������џџџџџџџџџ џџџџџџ0џћџFx§xѕ…ў…џ”ў”џЄ§ЄџЄўЄџЂ§Ђџšўšџ—ў—џ™§™џў§Ўџџ§Еџџ§Зџџ§­џќ§ЃџєЮ˜џџ…€џџ|wџџxrџџsnџџpjџџjeџџWSџџIEџџ=:цџЫПџџџџџџ������������������������������������������������������������џџџџџџџџџџџџџџџџљџ*аќаbўШxўxћўџ™§™џўџ ў џ § џ ў џкќЌџџ§Гџџ§Гџ№ђЄџќЌ˜џџ‘Œџџ}wџџvqџџqlџџb]џџWSџџJFџџFC”џb_Fџ№сџџЊџџџ������������������������������������������������������������������������џџџџлџџџџ џџџџњџ1џћџAсќс]€ў€р|ў|џ†§†џ§џ‘ў‘џ§џ’ќџМќ”ў№і“ўџŠ…џџ~zџџsnџџ^[џџXTџџQMџџGCЭџNK…џ€w8џџџ џџџџџџ������������������������������������������������������������������������������������џџџџџџџџџџџџ џ№џџєџџљџ*џџџ3џћџ<џћџGџќџIџћџHџћџ=џџџ6џџџ-џџї џџѕџџёџџџџџџџџџџџџџџџ������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџ џџџџџџџџџџјџ&џјџ'џјџ&џџџџѕџџџџџџџ џџџџџџџџџ��������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџ џџџ џџџџџџџџџџыџ џџџ џпџџџџџџџџџџ����������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџ�џ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџј�џџ��џџР�џ��џџ€�џ��џќ��>��џ№��<��џ������€�������€�������€���������������€�������€����������������������������������������������������������������������������€������€������Р������р����?��р����?��№������ќ���џ��ќ���џ��џ���џ��џ€��џџ��џр�џџ��џ№�џџ��џџ�џџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��(��� ���@���� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џ“��џџ��џџ��џџ��џџ��џџ��џя������������������������������������������������������������������������������������������џ��џб��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ==џт������������������������������������������������������������������������������џ)��џш��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ##џџooџџџџџ������������џЊЊџџы џџџ џџџ������������������������������џ ��џn��џе��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџhhџџ“oєџџUџ��Œџ��Цџ��§џџџXTџџXTџџtnXџџП����������џМ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџt�жџх�Юџџ�џџџ�џџџџџџvџџџaўџџџџ��џџ��џџ��џџ џџTPџџtnџџhcџџOMxџџџ������џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ�5єџ�обџ�џџџ�џџџлОџџџџџџџЉџџџ�џџџ�џџџџџџ^џџџsџџџ$џџ��џџ��џџ��џџ��џџџџ%#џџlgџџtoџџUQџџџц ��џ��џџџџџџџџ��џџ� џџ�ђтџ�џџџ�џџџ�џџџ�џџџіџџџџџџџџџџџџџџџeџџџџџџ*џџџtџџџ*rџџ��џџ��џџ��џџ��џџ��џџ��џџџџOKџџtnџџjdџџC>_����џџџџ џџ џџћьџџџџ�џџџ�џџџ�џџџ�џџџ�џџџтШџџџџџџџџџџџџџџџџџџџnџџџsџџџ(aџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ*(џџqkџџpjџџ1-Ѓџџџџџ21џџ=хџ5ўџџўџџ џџџ џџџџџџ#џџџ8џџџWџџџџќџџџџџџџџџџџџџџџџџџџзџџџ7џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџojџџoiџџ53ŒџџџJJџгžЪђџВўџџЈўџџˆўџџuџџџtџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџяаьџџџ џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ,*џџqlџџgbџџSKDџлџћћџ3АўџџЬўџџРўџџšўџџ~џџџxџџџwџџџwџџџwџџџwџџџџџџџџњџџфЫеџџџ џџџ�џџџ�џєJ�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ џџSOџџtnџџXTџџџу џџџџџџ+‡§ŽџЪўєџСўџџ—ўџџvџџџjџѓџ[џрџHџЙџ4џ|џ џ4џјџ џџџџџџ�џџџ�џџџ�џџџ�џоц�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ84џџojџџrlџџ<9ѕџџџџџџџџџ uўuеž§žџž§žџcўcџ'џ'џ џ џџџ�џ�џ�џ�џ�џ�џЉџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџ��џџ��џџ��џџ��џџ��џџ��џџџџ20џџjeџџtoџџ`[џџБЈ����џџџџ№џџћџ@€ў€џŸўŸџ†ў†џPџPџ$ў$џ џ џџџџџ�џ�џ=џ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџ��џџ��џџ��џџ��џџ��џџџџ85џџlgџџuoџџojџџ=:лџџџ��������џџџџїџЮќЮd‰ў‰џŸ§Ÿџ‰ў‰џ[ў[џ/ў/џџџџџџџ�џ�џџџ�џџџ�џџџ�џџџ�џџџџџџ�џџ��џџ��џџ��џџџџџџB>џџniџџuoџџqkџџEB§џџу ������������џџџџџџ џјџ%Љ§Љ†Ž§ŽџЄ§Єџ•§•џmўmџAџAџџџ џ џџџџџџџџџџџџџџџџџџџџџџџџ��џџџџ%$џџZVџџrlџџuoџџqlџџJGџџџъ ��������������������џџџџџџ џљџ(І§І‹ŒўŒџІўІџЁ§ЁџƒўƒџYўYџ3ў3џџџыџџџџџџў џџџ'џџў(џэѕџџџџџџHEџџkfџџtoџџtoџџniџџGDџџџэ����������������������������џџџџџџ џџџ%Ч§Чk„ў„џЄ§ЄџЉ§Љџ—§—џvўvџ[ў[џoўSџџў_џџўmџџ§uџџ§mџџg[џџ\Xџџkfџџsnџџtoџџqlџџ_Zџџ<:аџџџ������������������������������������џџџџџџ џџџџћџFx§xѕ”ў”џЄ§ЄџЂ§Ђџšўšџ™§™џў§Ўџџ§Зџџ§­џєЮ˜џџ…€џџxrџџsnџџjeџџWSџџ=:цџЫПџџџ��������������������������������������������џџџџлџџџџџњџ1сќс]€ў€р†§†џ§џ§џ’ќџ№і“ўџŠ…џџsnџџ^[џџQMџџGCЭџ€w8џџџ џџџ��������������������������������������������������������џџџџџџџџџ џєџџљџ*џћџ<џћџGџћџHџћџ=џџџ-џџї џџёџџџџџџџџџ����������������������������������������������������������������������������џџџџџџџџџџџџ џџџџџџџыџ џпџџџџџџџ����������������������������������������������������������������������������������������������������џџџџџџџџџџџџџ�џ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџќџџрџџ€Уј��€���€�������€�������������������������€��€��Р��р��№��?ј��џќ�џџ�?џџрџџџџџџџџџџџџџџ(������ ���� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џб��џџ��џџ��џџџџ����������������������������������џn��џџ��џџ��џџ��џџ��џџ��џџhhџџџUџ��ЦџџџXTџџџП������џџ��џџ��џџ��џџ�обџ�џџџџџџџџ�џџџџџџsџџџ��џџ��џџџџlgџџUQџ����џџ џџџџџ�џџџ�џџџтШџџџџџџџџџџџsџџџ��џџ��џџ��џџ��џџ*(џџpjџџџџžЪђџЈўџџuџџџwџџџwџџџџџџџџџџџяаьџџ��џџ��џџ��џџ��џџ��џџ,*џџgbџџџџ‡§ŽџСўџџvџџџ[џрџ4џ|џјџ џџџ�џџџ�џоц�џџ��џџ��џџ��џџџџojџџ<9ѕџџџџћџ@ŸўŸџPџPџ џ џџџ=џ�џџџ�џџџ�џџџ�џџ��џџ��џџџџlgџџojџџџџ����џџџ Љ§Љ†Є§Єџmўmџџџџџџџџџџџџџџџ��џџ%$џџrlџџqlџџџъ ������������џџџ Ч§ЧkЄ§Єџ—§—џ[ў[џџў_џџ§uџџg[џџkfџџtoџџ_Zџџџџ��������������������џлџџњџ1€ў€р§џ’ќџџŠ…џџ^[џџGCЭџџџ ��������������������������������џџџџџџџџџџыџ џџџ������������������������������������������������������������������������������������������������������������������������������������������������������������џџ��џџ��џџ��ќ��р���€���€���������������€��Р��р��№��џџ��џџ��(������(�����������������������������������ц��Ўњ��ью��љї��њќ��ћ”��ћБ��ќ���§ž��ў���ў��ўќ��ў§��ўџ��џ���џќ��џ§�ў��џ�ў��џ�џ�ў�џ�(џ(�,џ,�9џ9�AџA�Iљќ�J§��WџW�ZџZ�hџh�lџl�nџn�xџ{�yџy�‚џ‚�‡џ‡�‹џ‹�ŒџŒ�ŽџŽ�Љ���Ц���ЩњS�е�ј�ж§��п���р�ѕ��љў��њ�ќ�ћў��§џ��ў���ў�љ�ў�ќ�ў�ўп�ў§��ўў��џ���џ��џ�2�џ�њ�џ�ћ�џ�ќ�џ�§�џ�џ�џ��џ ��џ�џ�џ!!�џ&&�џ,,�џ//�џDD�џEE�џII�џLM�џQQ�џWW�џZZ�џ^^�џbb�џdd�џii�џjj�џoo�џrr�џss�џ}}�џ††�џžž�џАА�џИИ�џќ��џ§��џџџ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BDA21,+�� .49CE@>7>0,� 8EB@>>>>7:H� -;>?>>>>>>JM��"5bF>>>>>>KON��#3c>>>>>>>SV`���& /=>>>>>>XZU����� )<G>>IV\^_�������(*'6QTW[]Y�����������!%$LRPa��������������������������������������������������������������������������������������џџ№�џџ№�џџ№�џџ№�џС№�Р�№�€��€���€���€���Р���Р���р��№�0�ј�№�ў№�џџ№�џџ№�џџ№�џџ№���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/mni.pas������������������������������������������������������������0000664�0001750�0001750�00000002303�11551064504�017137� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit mni; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Spin; type { TMNIForm } TMNIForm = class(TForm) XEdit: TSpinEdit; YEdit: TSpinEdit; ZEdit: TSpinEdit; procedure FormCreate(Sender: TObject); procedure XEditChange(Sender: TObject); private { private declarations } public { public declarations } end; var MNIForm: TMNIForm; implementation uses define_types, nifti_img,nifti_img_view; { TMNIForm } procedure TMNIForm.XEditChange(Sender: TObject); var lXmm,lYmm,lZmm: single; lX,lY,lZ: integer; begin if not MNIForm.visible then exit; if gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems=0 then exit; lXmm:=XEdit.value; lYmm:=YEdit.value; lZmm:=ZEdit.value; MMToImgCoord(lX,lY,lZ,lXmm,lYmm,lZmm); if lX <> ImgForm.XViewEdit.value then ImgForm.XViewEdit.value := lX; if lY <> ImgForm.YViewEdit.value then ImgForm.YViewEdit.value := lY; if lZ <> ImgForm.ZViewEdit.value then ImgForm.ZViewEdit.value := lZ; ImgForm.XViewEditChange(nil); end; procedure TMNIForm.FormCreate(Sender: TObject); begin end; initialization {$I mni.lrs} end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/mni.lrs������������������������������������������������������������0000664�0001750�0001750�00000002317�11551064504�017161� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ This is an automatically generated lazarus resource file } LazarusResources.Add('TMNIForm','FORMDATA',[ 'TPF0'#8'TMNIForm'#7'MNIForm'#4'Left'#3#188#1#6'Height'#2' '#3'Top'#3','#1#5 +'Width'#3#8#1#18'HorzScrollBar.Page'#3#7#1#18'VertScrollBar.Page'#2'5'#13'Ac' +'tiveControl'#7#5'XEdit'#11'BorderIcons'#11#12'biSystemMenu'#0#11'BorderStyl' +'e'#7#8'bsDialog'#7'Caption'#6#12'MNI position'#12'ClientHeight'#2' '#11'Cli' +'entWidth'#3#8#1#21'Constraints.MaxHeight'#2' '#20'Constraints.MaxWidth'#3#8 +#1#21'Constraints.MinHeight'#2' '#20'Constraints.MinWidth'#3#8#1#8'OnCreate' +#7#10'FormCreate'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29' +#0#9'TSpinEdit'#5'XEdit'#4'Left'#2#16#6'Height'#2#21#3'Top'#2#4#5'Width'#2'B' +#8'MaxValue'#3#200#0#8'MinValue'#3'8'#255#8'OnChange'#7#11'XEditChange'#8'Ta' +'bOrder'#2#0#0#0#9'TSpinEdit'#5'YEdit'#4'Left'#2'`'#6'Height'#2#21#3'Top'#2#4 +#5'Width'#2'B'#8'MaxValue'#3#200#0#8'MinValue'#3'8'#255#8'OnChange'#7#11'XEd' +'itChange'#8'TabOrder'#2#1#0#0#9'TSpinEdit'#5'ZEdit'#4'Left'#3#176#0#6'Heigh' +'t'#2#21#3'Top'#2#4#5'Width'#2'B'#8'MaxValue'#3#200#0#8'MinValue'#3'8'#255#8 +'OnChange'#7#11'XEditChange'#8'TabOrder'#2#2#0#0#0 ]); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/mni.lfm������������������������������������������������������������0000664�0001750�0001750�00000002022�11551064504�017130� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object MNIForm: TMNIForm Left = 444 Height = 32 Top = 300 Width = 264 HorzScrollBar.Page = 263 VertScrollBar.Page = 53 ActiveControl = XEdit BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'MNI position' ClientHeight = 32 ClientWidth = 264 Constraints.MaxHeight = 32 Constraints.MaxWidth = 264 Constraints.MinHeight = 32 Constraints.MinWidth = 264 OnCreate = FormCreate Position = poScreenCenter LCLVersion = '0.9.29' object XEdit: TSpinEdit Left = 16 Height = 21 Top = 4 Width = 66 MaxValue = 200 MinValue = -200 OnChange = XEditChange TabOrder = 0 end object YEdit: TSpinEdit Left = 96 Height = 21 Top = 4 Width = 66 MaxValue = 200 MinValue = -200 OnChange = XEditChange TabOrder = 1 end object ZEdit: TSpinEdit Left = 176 Height = 21 Top = 4 Width = 66 MaxValue = 200 MinValue = -200 OnChange = XEditChange TabOrder = 2 end end ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/mini.bmp�����������������������������������������������������������0000664�0001750�0001750�00000000106�10423234000�017265� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMF�������6���(���������������������������������������џ����џ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/metagraph.pas������������������������������������������������������0000664�0001750�0001750�00000052676�11326434466�020356� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit metagraph; interface uses {$IFNDEF Unix}Windows, Messages, {$ENDIF} SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, ToolWin, ComCtrls,define_types, ExtCtrls, StdCtrls, Menus,ClipBrd; const kMaxCond = 6; knMaxRow = 20; //Niftiimgvie kMaxLines = kMaxCond* knMaxRow; kClrRA: array [1..kMaxCond] of TColor = (clRed,clGreen,clBlue,clTeal,clAqua,clSilver); kPenStyleRA: array[1..knMaxRow] of TPenStyle = (psSolid,psDot,psDash,psDashDot,psDashDotDot,psSolid,psDot,psDash,psDashDot,psDashDotDot, psSolid,psDot,psDash,psDashDot,psDashDotDot,psSolid,psDot,psDash,psDashDot,psDashDotDot); type TEventOnset = RECORD Events: integer; ELabel: string[16]; EventRA,DurRA: SingleP; END; T4DTrace = RECORD //Title: string[16]; //Samples: integer; HorzMin,HorzWidPerBin,SampleMin,SampleMax,SamplePlotMin,SamplePlotMax {SampleMean,SampleSD,SampleSE,SampleVar}: Double; //SampleRA: SingleP; Lines: array [1..kMaxLines] of TEventOnset; Conditions: array [1..kMaxLines] of TEventOnset; //DurationRA: array [1..kMaxLines] of SingleP; END; procedure Create4DTrace (var l4DTrace: T4DTrace); procedure Init4DTrace(lnSample,lnLines: integer; var l4DTrace: T4DTrace; lErrorBars: boolean); procedure Close4DTrace (var l4DTrace: T4DTrace; lCloseCond: boolean); procedure MinMax4DTrace(var l4DTrace: T4DTrace); procedure CorePlot4DTrace(var l4DTrace: T4DTrace; lImage: TImage; lStartSample,HSpeed,lnColors: integer;lTR,lVertMin,lVertMax: single; lErrorBars: boolean); procedure GraphResize(lImage: TImage); procedure CloseCond (var l4DTrace: T4DTrace; lCond: integer); procedure InitCond (var l4DTrace: T4DTrace; lCond, lnEvents: integer); {$IFNDEF FPC} var gWmf: TMetafile; {$ENDIF} implementation procedure GraphResize(lImage: TImage); var TempBitmap: TBitmap; lx,ly: integer; begin lx := lImage.Width; ly := lImage.Height; if (lx < 1) or (ly < 1) then exit; TempBitmap := TBitmap.Create; TempBitmap.Width := lx; TempBitmap.Height := ly; //Draw32Bitmap(TempBitmap.Canvas.Handle, lx, ly,lBuff {Self}); lImage.Picture.Bitmap := TempBitmap; lImage.Width := lx;//delphi lImage.Height := ly;//delphi TempBitmap.Free; end; function RealToStr(lR: double {was extended}; lDec: integer): string; begin if lR > 99999 then RealTOStr := FloatToStrF(lR, ffExponent ,lDec,7) else RealTOStr := FloatToStrF(lR, ffFixed,7,lDec); end; procedure Create4DTrace (var l4DTrace: T4DTrace); var lLine: integer; begin with l4DTrace do begin for lLine := 1 to kMaxLines do begin Lines[lLine].events := 0; Lines[lLine].elabel := ''; Conditions[lLine].events := 0; Conditions[lLine].elabel := ''; end; end; //with trace end; procedure Init4DTrace(lnSample,lnLines: integer; var l4DTrace: T4DTrace; lErrorBars: boolean); var lLine: integer; begin Close4DTrace(l4DTrace,lErrorBars); if (lnSample < 1) or (lnLines < 1) then exit; with l4DTrace do begin HorzMin := 0; HorzWidPerBin := 1; for lLine := 1 to lnLines do begin //getmem(DurationRA[lLine],lnSample*sizeof(single)); //fx(lLine,lnSample); getmem(Lines[lLine].EventRA,lnSample*sizeof(single)); Lines[lLine].events := lnSample; if lErrorBars then begin getmem(Conditions[lLine].EventRA,lnSample*sizeof(single)); getmem(Conditions[lLine].DurRA,lnSample*sizeof(single)); Conditions[lLine].events := lnSample; end; end; //for each line end; //with trace end; procedure Close4DTrace (var l4DTrace: T4DTrace; lCloseCond: boolean); var lLine: integer; begin with l4DTrace do begin for lLine := 1 to kMaxLines do begin if Lines[lLine].events > 0 then begin freemem(Lines[lLine].EventRA); end; Lines[lLine].events := 0; if lCloseCond then begin if Conditions[lLine].events > 0 then begin freemem(Conditions[lLine].EventRA); freemem(Conditions[lLine].DurRA); //1/1/2008 end; Conditions[lLine].events := 0; end; end; //for each Line end; //with trace end; procedure CloseCond (var l4DTrace: T4DTrace; lCond: integer); begin if (lCond < 1) or (lCond > kMaxLines) then exit; if l4DTrace.Conditions[lCond].events > 0 then begin freemem(l4DTrace.Conditions[lCond].EventRA); freemem(l4DTrace.Conditions[lCond].DurRA); end; l4DTrace.Conditions[lCond].events := 0; end; procedure InitCond (var l4DTrace: T4DTrace; lCond, lnEvents: integer); begin if (lCond < 1) or (lCond > kMaxLines) then exit; CloseCond (l4DTrace, lCond); if lnEvents > 0 then begin getmem(l4DTrace.Conditions[lCond].EventRA, lnEvents * sizeof(single)); //getmem(l4DTrace.DurationRA[lCond],lnEvents*sizeof(single)); getmem(l4DTrace.Conditions[lCond].DurRA,lnEvents*sizeof(single)); //fx(lLine,lnSample); end; l4DTrace.Conditions[lCond].events := lnEvents; end; procedure MinMax4DTrace(var l4DTrace: T4DTrace); var lPos,lLine: integer; l1stLine :boolean; begin l1stLine := true; with l4DTrace do begin for lLine := 1 to kMaxLines do begin if Lines[lLine].events > 0 then begin if l1stLine then begin SampleMin := Lines[lLine].EventRA^[1]; SampleMax:= Lines[lLine].EventRA^[1]; end; l1stLine := false; for lPos := 1 to Lines[lLine].events do begin if Lines[lLine].EventRA^[lPos] > SampleMax then SampleMax := Lines[lLine].EventRA^[lPos]; if Lines[lLine].EventRA^[lPos] < SampleMin then SampleMin := Lines[lLine].EventRA^[lPos]; end; //for each event end; //if events > 0 end; //for each line SamplePlotMin := SampleMin-0.1*abs(SampleMax-SampleMin); SamplePlotMax := SampleMax+0.1*abs(SampleMax-SampleMin); end; //with trace end; {$IFDEF FPC} procedure HText(lImage: TImage; lX,lY,lDec: integer; lVal: single); {$ELSE} procedure HText(lImage: TMetafileCanvas; lX,lY,lDec: integer; lVal: single); {$ENDIF} var lStr: string; begin if lDec >= 0 then lStr := realtostr(round(lVal),0) else lStr := realtostr(lVal,abs(lDec)); {$IFDEF FPC} lImage.Canvas.TextOut(lX-(lImage.Canvas.TextWidth(lStr) shr 1),lY,lStr); {$ELSE} lImage.TextOut(lX-(lImage.TextWidth(lStr) shr 1),lY,lStr); {$ENDIF} end; {$IFDEF FPC} procedure VText(lImage: TImage; lX,lY,lDec: integer; lVal: single); {$ELSE} procedure VText(lImage: TMetafileCanvas; lX,lY,lDec: integer; lVal: single); {$ENDIF} var lStr: string; begin if lDec >= 0 then lStr := realtostr(round(lVal),0) else lStr := realtostr(lVal,abs(lDec)); {$IFDEF FPC} lImage.Canvas.TextOut(lX-lImage.Canvas.TextWidth(lStr) ,lY,lStr); {$ELSE} lImage.TextOut(lX-lImage.TextWidth(lStr) ,lY,lStr); {$ENDIF} end; {$IFDEF FPC} procedure VTextLeftJustified(lImage: TIMage; lX,lY,lDec: integer; lVal: single); {$ELSE} procedure VTextLeftJustified(lImage: TMetafileCanvas; lX,lY,lDec: integer; lVal: single); {$ENDIF} var lStr: string; begin if lDec >= 0 then lStr := inttostr(round(lVal)) else lStr := realtostr(lVal,abs(lDec)); {$IFDEF FPC} lImage.Canvas.TextOut(lX ,lY,lStr); {$ELSE} lImage.TextOut(lX ,lY,lStr); {$ENDIF} end; {$IFDEF FPC} procedure ShowRange(lImage: TImage; lMin,lMax: single; lL,lT,lR,lB,lPosition: integer); {$ELSE} procedure ShowRange(lImage: TMetafileCanvas; lMin,lMax: single; lL,lT,lR,lB,lPosition: integer); {$ENDIF} //position 1=L,2=T,3=R,4=B var lRangeR,lRange,lD,lV: double; lDecimals,lPos,lLo,lHi,lHPos,lOffset : integer; begin {$IFDEF FPC} with lImage.Canvas do begin {$ELSE} with lImage do begin {$ENDIF} Font.color := clBlack; lRange := abs(lMax-lMin); lRangeR := lRange; lDecimals := 0; lD := 1; if lRangeR = 0 then exit; while lRangeR > 10 do begin//get range 1..10 lRangeR := lRangeR / 10; inc(lDecimals); lD := lD * 10; end; while lRangeR < 1 do begin//get range 1..10 lRangeR := lRangeR * 10; dec(lDecimals); lD := lD / 10; end; lLo := round((lMin + (lD/2)) / lD); lHi := trunc((lMax + (lD/20) ) / lD);//2007 //lHi := trunc((lMax ) / lD); if lHi <= (lLo+2) then begin lD := lD /2; if lDecimals <= 0 then dec(lDecimals) else inc(lDecimals); lLo := round((lMin + (lD/2)) / lD); lHi := trunc((lMax + (lD/20) ) / lD);//2007 end; if (lPosition = 2{T}) or (lPosition = 4{B}) then begin lOffset := TextHeight('0'); for lPos := lLo to lHi do begin lV := lPos * lD; lHPos := lL+ round( ((lV-lMin) / lRange)* abs(lR-lL)); if (lPosition = 2{T}) then HText(lImage, lHPos,lT- lOffset,lDecimals,lV) else HText(lImage, lHPos,lB+1,lDecimals,lV); end; end else if (lPosition = 1{L}) or (lPosition = 3{R}) then begin //vertical values lOffset := TextHeight('0') div 2; //2007 for lPos := lLo to lHi do begin lV := lPos * lD; {lHPos := lB- round( ((lV-lMin) / lRange)* abs(lT-lB)); lImage.MoveTo(1,lHPos); lImage.LineTo(1000,lHPos);} lHPos := lB- round( ((lV-lMin) / lRange)* abs(lT-lB))-lOffset; if (lPosition = 1{L}) then VText(lImage, lL-1,lHPos,lDecimals,lV) else VTextLeftJustified(lImage, lR+1,lHPos,lDecimals,lV); end; end; //if vertical end; //with limage end; {$IFDEF FPC} function ShowLegend(var l4DTrace: T4DTrace; lImage: TImage; lL,lT: integer): integer; {$ELSE} function ShowLegend(var l4DTrace: T4DTrace; lImage: TMetafileCanvas; lL,lT: integer): integer; {$ENDIF} var lC,lLegendLeft: integer; begin {$IFDEF FPC} with lImage.Canvas do begin {$ELSE} with lImage do begin {$ENDIF} lLegendLeft := lL; font.color := clBlack; for lC := 1 to kMaxCond do begin //lImage.canvas.pen.color := kClrRA[lC]; font.color := kClrRA[lC] ; if (l4DTrace.Conditions[lC].events > 0) then begin TextOut(lLegendLeft,lT,l4DTrace.Conditions[lC].ELabel); lLegendLeft := lLegendLeft + TextWidth(l4DTrace.Conditions[lC].ELabel)+5; end; //for each tevent end; //if cond has events result := lLegendLeft; end; //with limage end; //for each cond function n4DTrace(var l4DTrace: T4DTrace;var lSamples: integer; lErrorBars: boolean): integer; var lLine: integer; l1stLine :boolean; begin lSamples:= 0; result := 0; l1stLine := true; with l4DTrace do begin for lLine := 1 to kMaxLines do begin if Lines[lLine].events > 0 then begin if l1stLine then lSamples := Lines[lLine].events; l1stLine := false; if (lErrorBars) and (Lines[lLine].events <> lSamples) then exit; //all lines must have same number of samples inc(result); end; //if events > 0 end; //for each line end; //with trace end; {$IFDEF FPC} function SetColorStyle (lImage: TImage; lLine,lnColors: integer): TPenStyle; {$ELSE} function SetColorStyle (lImage: TMetafileCanvas; lLine,lnColors: integer): TPenStyle; {$ENDIF} var lC: integer; begin {$IFDEF FPC} with lImage.Canvas do begin {$ELSE} with lImage do begin {$ENDIF} if lnColors < 1 then begin pen.color := clBlack;//clRed pen.style := kPenStyleRA[lLine]; result := kPenStyleRA[lLine]; exit; end; lC := lLine mod lnColors; if lC = 0 then lC := lnColors; pen.color := kClrRA[lC]; lC := ((lLine-1) div lnColors)+1; pen.style := kPenStyleRA[lC]; result := kPenStyleRA[lC]; end; //with lImage. end; {$IFDEF FPC} procedure ShowLineLegend(var l4DTrace: T4DTrace; lImage: TImage; lL, lT,lnLines,lnColors: integer); {$ELSE} procedure ShowLineLegend(var l4DTrace: T4DTrace; lImage: TMetafileCanvas; lL, lT,lnLines,lnColors: integer); {$ENDIF} var lLineTop,lStyle,lnStyles,lLegendLeft: integer; begin if lnColors < 1 then lnStyles := lnLines else lnStyles := lnLines div lnColors; if lnStyles < 1 then lnStyles := 1; {$IFDEF FPC} with lImage.Canvas do begin {$ELSE} with lImage do begin {$ENDIF} font.color := clBlack; pen.color := clBlack; lLegendLeft := lL; lLineTop := lT+(TextHeight('X') div 2); for lStyle := 1 to lnStyles do begin pen.style := kPenStyleRA[lStyle]; MoveTo(lLegendLeft,lLineTop); lLegendLeft := lLegendLeft +40; LineTo(lLegendLeft,lLineTop); lLegendLeft := lLegendLeft + 2; TextOut(lLegendLeft,lT,l4DTrace.Lines[lStyle].ELabel); lLegendLeft := lLegendLeft + TextWidth(l4DTrace.Lines[lStyle].ELabel)+5; end; pen.style := psSolid; end;//with lImage. end; {$IFDEF FPC} procedure ShowPlot(var l4DTrace: T4DTrace; lImage: TImage; lL,lT,lR,lB,lStartSample,lHSpeedIn,lScalePos,lnColors: integer; lSecPerSample,lVertMin,lVertMax: single; lShowHRange,lErrorBars: boolean); {$ELSE} procedure ShowPlot(var l4DTrace: T4DTrace; lImage: TMetafileCanvas; lL,lT,lR,lB,lStartSample,lHSpeedIn,lScalePos,lnColors: integer; lSecPerSample,lVertMin,lVertMax: single; lShowHRange,lErrorBars: boolean); {$ENDIF} const kMinMax = 0; k2SD = 1; k12bit = 2; kMaxPt = 16000; type TPtRA= array [1..kMaxPt] of TPoint; var lnPt,lnLines,lLine,lnSamples,lC,lStartSamp,lEndSamp,lEndPix,lPos,lI: integer; lVert,lHorz,lVMax,lVMin,lScale,lHSpeed: single; lPenStyle: TPenStyle; lPtRA: TPtRA; begin lnLines := n4DTrace(l4DTrace,lnSamples,lErrorBars); if (lnLines < 1) or (lnSamples < 2) or (lB <= lT) then exit; lStartSamp := lStartSample; if (lStartSamp > lnSamples) then exit; if lStartSamp < 1 then lStartSamp := 1; lHSpeed := lHSpeedIn; if lHSpeed < 1 then begin lStartSamp := 1; lHSpeed := (lnSamples-1)/(lR-lL); end; {$IFDEF FPC} with lImage.Canvas do begin {$ELSE} with lImage do begin {$ENDIF} lEndSamp := trunc(lStartSamp + ((lR-lL)*lHSpeed))+1; ShowRange(lImage, l4DTrace.HorzMin+((lStartSamp-1)*l4DTrace.HorzWidPerBin),l4DTrace.HorzMin+((lEndSamp-1)*l4DTrace.HorzWidPerBin),lL,lT,lR,lB,4); if lShowHRange then ShowRange(lImage, l4DTrace.HorzMin+((lStartSamp-1)*l4DTrace.HorzWidPerBin),l4DTrace.HorzMin+((lEndSamp-1)*l4DTrace.HorzWidPerBin),lL,lT,lR,lB,4); lI := ShowLegend(l4DTrace,lImage, lL,5); ShowLineLegend(l4DTrace, lImage, lI+10, 5,lnLines,lnColors); //next show event onsets if not lErrorBars then for lC := 1 to kMaxCond do begin pen.color := kClrRA[lC]; if (l4DTrace.Conditions[lC].events > 0) and (lSecPerSample > 0) then begin //canvas.TextOut(lLegendLeft,lT-canvas.TextHeight('X')-2,l4DTrace.Conditions[lC].ELabel); //lLegendLeft := lLegendLeft + canvas.TextWidth(l4DTrace.Conditions[lC].ELabel)+5; for lPos := 1 to l4DTrace.Conditions[lC].events do begin lHorz := l4DTrace.Conditions[lC].EventRA^[lPos] / lSecPerSample; if (lHorz < lEndSamp) and (lHorz > lStartSamp) then begin lVert := ((lHorz - lStartSamp) / lHSpeed)+lL; moveto(round(lVert),lT); lineto(round(lVert),lB); end; //if event in range end; //for each tevent end; //if cond has events end; //for each cond if (lEndSamp > lnSamples) then begin lEndSamp := lnSamples; lEndPix := lL+trunc((lnSamples-lStartSamp) / lHSpeed); end else lEndPix := lR; lVMax := lVertMax; lVMin := lVertMin; if (lVMax <= lVMin) then begin lVMax := l4DTrace.SamplePlotMax; lVMin := l4DTrace.SamplePlotMin; end; if (lVMax < l4DTrace.SampleMin) or (lVMin > l4DTrace.SampleMax) then begin lVMax := l4DTrace.SamplePlotMax; lVMin := l4DTrace.SamplePlotMin; end; ShowRange(lImage,lVMin,lVMax,lL,lT,lR,lB,lScalePos); moveto(lL,lT); if lVMax <= lVMin then lScale := 1 else lScale := (lB-lT)/ (lVMax-lVMin); if lHSpeed < 1 then begin //lHSpeed := (l4DTrace.Samples-1)/(lR-lL); for lLine := 1 to lnLines do begin lPenStyle := SetColorStyle (lImage, lLine,lnColors); lnPt := 0; for lPos := lStartSamp to lEndSamp do begin lVert := l4DTrace.Lines[lLine].EventRA^[lPos]; if lVert > lVMax then lVert := lVMax else if lVert < lVMin then lVert := lVMin; lVert := round((lVert-lVMin)*lScale); lVert := lB-lVert; lHorz := lL+round((lPos-lStartSamp)/lHSpeed); inc(lnPt); if lnPt < kMaxPt then lPtRA[lnPt] := Point(round(lHorz),round(lVert)); if lErrorBars then begin pen.style := psSolid; moveto(round(lHorz),round(lVert-(l4DTrace.Conditions[lLine].EventRA^[lPos]*lScale))); lineto(round(lHorz) ,round(lVert+(l4DTrace.Conditions[lLine].EventRA^[lPos]*lScale))); moveto(round(lHorz) ,round(lVert)); pen.style := lPenStyle; end; end; //for lPos if lnPt > kMaxPt then lnPt := kMaxPt; if lnPt > 0 then PolyLine( Slice(lPtRA, lnPt)); end; //for each line end else begin //HSpeed >=1 so every pixel unique for lLine := 1 to lnLines do begin lPenStyle := SetColorStyle (lImage, lLine,lnColors); lI := lStartSamp; lnPt := 0; for lPos := lL to lEndPix do begin lVert := l4DTrace.Lines[lLine].EventRA^[lI]; if lVert > lVMax then lVert := lVMax else if lVert < lVMin then lVert := lVMin; lVert := round((lVert-lVMin)*lScale); //lVert := lVert + lT; lVert := lB-lVert; inc(lnPt); if lnPt < kMaxPt then lPtRA[lnPt] := Point(lPos,round(lVert)); if lErrorBars then begin pen.style := psSolid; moveto(lPos,round(lVert-(l4DTrace.Conditions[lLine].EventRA^[lPos]*lScale))); lineto(lPos ,round(lVert+(l4DTrace.Conditions[lLine].EventRA^[lPos]*lScale))); moveto(lPos ,round(lVert)); pen.style := lPenStyle; end; lI := round( lStartSamp+((lPos-lL)*lHSpeed) ); if lI < 1 then lI := 1; if lI > lEndSamp then lI := lEndSamp; end; //for lPos if lnPt > kMaxPt then lnPt := kMaxPt; if lnPt > 0 then PolyLine( Slice(lPtRA, lnPt)) end; //for each line end; //hspeed >= 1 pen.style := psSolid; end;//with .lImage end; procedure DrawBMP( lx, ly: integer; {lBuff: RGBQuadp;} var lImage: TImage); var TempBitmap: TBitmap; begin TempBitmap := TBitmap.Create; TempBitmap.Width := lx; TempBitmap.Height := ly; //Draw32Bitmap(TempBitmap.Canvas.Handle, lx, ly,lBuff {Self}); lImage.Picture.Bitmap := TempBitmap; lImage.Width := lx;//delphi lImage.Height := ly;//delphi TempBitmap.Free; end; {$IFDEF FPC} procedure PrepPlot(var lImage: TIMage; lL,lT,lR,lB,lWid,lHt,lFontSize: integer); {$ELSE} procedure PrepPlot(var lImage: TMetafileCanvas; lL,lT,lR,lB,lWid,lHt,lFontSize: integer); {$ENDIF} begin {$IFDEF FPC} with lImage.Canvas do begin {$ELSE} with lImage do begin {$ENDIF} Font.Name := 'Arial'; Font.Size := 12; pen.color := clBlack; Font.color := clBlack; Brush.Style := bsSolid; Brush.color := clWhite; Rectangle(1,1,lWid,lHt); Rectangle(lL,lT,lR,lB); end; end; procedure CorePlot4DTrace(var l4DTrace: T4DTrace; lImage: TImage; lStartSample,HSpeed,lnColors: integer;lTR,lVertMin,lVertMax: single; lErrorBars: boolean); var lWid,lHt,lBorder,lL,lT,lR,lB,lFontSize: integer; {$IFDEF FPC} //WmfCanvas: TCanvas; {$ELSE} WmfCanvas: TMetafileCanvas; {$ENDIF} begin lWid := lImage.Width; lHt := lImage.Height; lFontSize := 12; lBorder := lFontSize * 4; if (lWid <= (2*lBorder)) or (lHt <= (2*lBorder)) then exit; lL := round(1.3*lBorder); lT :=lFontSize*2; lR := lWid - lBorder; lB := lHt-(lFontSize*2); {$IFDEF FPC} //WmfCanvas := TCanvas.Create; PrepPlot(lImage,lL,lT,lR,lB,lWid,lHt,lFontSize); ShowPlot(l4DTrace,lImage,lL,lT,lR,lB,lStartSample,HSpeed,1,lnColors, lTR,lVertMin,lVertMax,true,lErrorBars); //abba lImage.Canvas.Draw (0, 0, WmfCanvas); //WmfCanvas.Free; {$ELSE} gWmf.clear; gWmf.Width := lWid; gWmf.Height := lHt; WmfCanvas := TMetafileCanvas.CreateWithComment(gWmf, 0, 'mricron', 'plot metafile'); try PrepPlot(WmfCanvas,lL,lT,lR,lB,lWid,lHt,lFontSize); ShowPlot(l4DTrace,WmfCanvas,lL,lT,lR,lB,lStartSample,HSpeed,1,lnColors, lTR,lVertMin,lVertMax,true,lErrorBars); finally WmfCanvas.Free; end;//finally lImage.Canvas.Draw (0, 0, gWmf); {$ENDIF} end; initialization begin {$IFDEF FPC} {$ELSE} gWmf := TMetafile.Create; gWmf.Enhanced := True; {$ENDIF} // Create4DTrace(g4Ddata); end; finalization begin //Close4DTrace(g4Ddata); {$IFDEF FPC} {$ELSE} gWmf.free; {$ENDIF} end; end. ������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/manifest.res�������������������������������������������������������0000664�0001750�0001750�00000001434�10724304526�020176� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���џџ��џџ������������������м�� ���џџ�џџ�����0���������<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="CompanyName.ProductName.YourApp" type="win32"/><description>Your application description here.</description><dependency><dependentAssembly><assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/></dependentAssembly></dependency><trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"><security><requestedPrivileges><requestedExecutionLevel level="asInvoker" uiAccess="false"/></requestedPrivileges></security></trustInfo></assembly>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/���������������������������������������������������������������0000775�0001750�0001750�00000000000�11660470014�016453� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/x_rain.lut�����������������������������������������������������0000664�0001750�0001750�00000001400�07152053504�020456� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  "$&(*,.02468:<>@><:86420.,*(&$"  ���������������������������������  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ЄЈЌАДИМРФШЬадимрфшь№єјќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ����������������������������������������������������������������� (08@HPX`hpx€ˆ˜ ЈАИРШаирш№јџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§ћљїѕѓёяэыщчхуспнлйзегбЯЭЫЩЧХУСРНКЗДБЎЋЈЅЂŸœ™–“Š‡„~{xurolifc`]ZWTQNKHEB?<9630-*'$! �  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ЄЈЌАДИМРФШЬадимрфшь№єјќџїячпзЯЧПЗЏЇŸ—‡wog_WOG?7/'��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/x_hot.lut������������������������������������������������������0000664�0001750�0001750�00000001400�07152053452�020321� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  !#$%'(*+,./1235689:<=?@ACDFGHJKMNOQRTUVXY[\]_`bcdfgijkmnpqrtuwxy{|~€‚ƒ…†‡‰ŠŒŽ‘“”•—˜š›œžŸЁЂЃЅІЈЉЊЌ­ЏАБГДЖЗИКЛНОПСТФХЦШЩЫЬЭЯавгджзйклнорстфхчшщыьюя№ђѓѕіїљњќ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ��������������������������������������������������������������������������������������������������������������������������������� !$'*,/258:=@CFHKNQTVY\_bdgjmprux{~€ƒ†‰ŒŽ‘”—šœŸЂЅЈЊ­АГЖИЛОСФЦЩЬЯвдзкнртхшыю№ѓіљќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� #'+/37;?CGKOSW[_cgkosw{ƒ‡‹“—›ŸЃЇЋЏГЗЛПУЧЫЯгзлпучыяѓїћ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/surface.lut����������������������������������������������������0000664�0001750�0001750�00000001400�07733711510�020631� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� !"$%&()+,./124578:;=>@ACDFGIJKMNPQSTVWYZ\]_`bcefhiklnoprsuvxy{|~‚„…‡ˆŠ‹Ž‘“”•—˜š›ž ЁЃЄІЇЉЊЌ­ЏАВГЕЖИЙКМНПРТУХЦШЩЫЬЮЯбвдезиклнопстфхчшъыэю№ёѓєіїљњќ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџџ  !"##$%&&'(()*++,-../01123345667899:;<<=>??@AABCDDEFGGHIJJKLLMNOOPQRRSTUUVWXXYZZ[\]]^_``abccdeefghhijkklmnnopqqrsstuvvwxyyz{||}~~€‚ƒ„„…†‡‡ˆ‰ŠŠ‹ŒŒŽ‘’’“”••–——˜™šš›œžŸ  ЁЂЃЃЄЅЅІЇЈЈЉЊЋЋЌ­ЎЎЏАДЙОУШЭвзмсцы№ѕњќџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/spectrum.lut���������������������������������������������������0000664�0001750�0001750�00000001400�07152053454�021044� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џњѕ№ыцсмзвЭШУОЙДЏЊЅ ›–‘Œ‡‚}xsnid_ZUPKFA<72-(# ������������������������������������������������������������������������������������������������������� #(-27<AFKPUZ_dinsx}‚‡Œ‘–› ЅЊЏДЙОУШЭвзмсцы№ѕњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ���������������������������������������������������� #(-27<AFKPUZ_dinsx}‚‡Œ‘–› ЅЊЏДЙОУШЭвзмсцы№ѕћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњѕ№ыцсмзвЭШУОЙДЏЊЅ ›–‘Œ‡‚}xsnid_ZUPKFA<72-(# �џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњѕ№ыцсмзвЭШУОЙДЏЊЅ ›–‘Œ‡‚}xsnid_ZUPKFA<72-(# �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/red_otto.lut���������������������������������������������������0000664�0001750�0001750�00000010257�10360606512�021025� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������* s=byte index red green blue S 0 0 0 0 S 1 128 0 0 S 2 128 0 0 S 3 128 0 0 S 4 128 0 0 S 5 128 0 0 S 6 128 0 0 S 7 128 0 0 S 8 128 0 0 S 9 128 0 0 S 10 128 0 0 S 11 128 0 0 S 12 128 0 0 S 13 128 0 0 S 14 128 0 0 S 15 128 0 0 S 16 128 0 0 S 17 128 0 0 S 18 128 0 0 S 19 128 0 0 S 20 128 0 0 S 21 128 0 0 S 22 128 0 0 S 23 128 0 0 S 24 128 0 0 S 25 128 0 0 S 26 128 0 0 S 27 128 0 0 S 28 128 0 0 S 29 128 0 0 S 30 128 0 0 S 31 128 0 0 S 32 128 0 0 S 33 128 0 0 S 34 128 0 0 S 35 128 0 0 S 36 128 0 0 S 37 128 0 0 S 38 128 0 0 S 39 128 0 0 S 40 128 0 0 S 41 128 0 0 S 42 128 0 0 S 43 128 0 0 S 44 128 0 0 S 45 128 0 0 S 46 128 0 0 S 47 128 0 0 S 48 128 0 0 S 49 128 0 0 S 50 128 0 0 S 51 192 0 32 S 52 192 0 32 S 53 192 0 32 S 54 192 0 32 S 55 192 0 32 S 56 192 0 32 S 57 192 0 32 S 58 192 0 32 S 59 192 0 32 S 60 192 0 32 S 61 192 0 32 S 62 192 0 32 S 63 192 0 32 S 64 192 0 32 S 65 192 0 32 S 66 192 0 32 S 67 192 0 32 S 68 192 0 32 S 69 192 0 32 S 70 192 0 32 S 71 192 0 32 S 72 192 0 32 S 73 192 0 32 S 74 192 0 32 S 75 192 0 32 S 76 192 0 32 S 77 192 0 32 S 78 192 0 32 S 79 192 0 32 S 80 192 0 32 S 81 192 0 32 S 82 192 0 32 S 83 192 0 32 S 84 192 0 32 S 85 192 0 32 S 86 192 0 32 S 87 192 0 32 S 88 192 0 32 S 89 192 0 32 S 90 192 0 32 S 91 192 0 32 S 92 192 0 32 S 93 192 0 32 S 94 192 0 32 S 95 192 0 32 S 96 192 0 32 S 97 192 0 32 S 98 192 0 32 S 99 192 0 32 S 100 192 0 32 S 101 192 0 32 S 102 255 179 0 S 103 255 179 0 S 104 255 179 0 S 105 255 179 0 S 106 255 179 0 S 107 255 179 0 S 108 255 179 0 S 109 255 179 0 S 110 255 179 0 S 111 255 179 0 S 112 255 179 0 S 113 255 179 0 S 114 255 179 0 S 115 255 179 0 S 116 255 179 0 S 117 255 179 0 S 118 255 179 0 S 119 255 179 0 S 120 255 179 0 S 121 255 179 0 S 122 255 179 0 S 123 255 179 0 S 124 255 179 0 S 125 255 179 0 S 126 255 179 0 S 127 255 179 0 S 128 255 179 0 S 129 255 179 0 S 130 255 179 0 S 131 255 179 0 S 132 255 179 0 S 133 255 179 0 S 134 255 179 0 S 135 255 179 0 S 136 255 179 0 S 137 255 179 0 S 138 255 179 0 S 139 255 179 0 S 140 255 179 0 S 141 255 179 0 S 142 255 179 0 S 143 255 179 0 S 144 255 179 0 S 145 255 179 0 S 146 255 179 0 S 147 255 179 0 S 148 255 179 0 S 149 255 179 0 S 150 255 179 0 S 151 255 179 0 S 152 255 235 97 S 153 255 235 97 S 154 255 235 97 S 155 255 235 97 S 156 255 235 97 S 157 255 235 97 S 158 255 235 97 S 159 255 235 97 S 160 255 235 97 S 161 255 235 97 S 162 255 235 97 S 163 255 235 97 S 164 255 235 97 S 165 255 235 97 S 166 255 235 97 S 167 255 235 97 S 168 255 235 97 S 169 255 235 97 S 170 255 235 97 S 171 255 235 97 S 172 255 235 97 S 173 255 235 97 S 174 255 235 97 S 175 255 235 97 S 176 255 235 97 S 177 255 235 97 S 178 255 235 97 S 179 255 235 97 S 180 255 235 97 S 181 255 235 97 S 182 255 235 97 S 183 255 235 97 S 184 255 235 97 S 185 255 235 97 S 186 255 235 97 S 187 255 235 97 S 188 255 235 97 S 189 255 235 97 S 190 255 235 97 S 191 255 235 97 S 192 255 235 97 S 193 255 235 97 S 194 255 235 97 S 195 255 235 97 S 196 255 235 97 S 197 255 235 97 S 198 255 235 97 S 199 255 235 97 S 200 255 235 97 S 201 255 235 97 S 202 255 235 97 S 203 255 235 97 S 204 255 235 97 S 205 255 255 200 S 206 255 255 200 S 207 255 255 200 S 208 255 255 200 S 209 255 255 200 S 210 255 255 200 S 211 255 255 200 S 212 255 255 200 S 213 255 255 200 S 214 255 255 200 S 215 255 255 200 S 216 255 255 200 S 217 255 255 200 S 218 255 255 200 S 219 255 255 200 S 220 255 255 200 S 221 255 255 200 S 222 255 255 200 S 223 255 255 200 S 224 255 255 200 S 225 255 255 200 S 226 255 255 200 S 227 255 255 200 S 228 255 255 200 S 229 255 255 200 S 230 255 255 200 S 231 255 255 200 S 232 255 255 200 S 233 255 255 200 S 234 255 255 200 S 235 255 255 200 S 236 255 255 200 S 237 255 255 200 S 238 255 255 200 S 239 255 255 200 S 240 255 255 200 S 241 255 255 200 S 242 255 255 200 S 243 255 255 200 S 244 255 255 200 S 245 255 255 200 S 246 255 255 200 S 247 255 255 200 S 248 255 255 200 S 249 255 255 200 S 250 255 255 200 S 251 255 255 200 S 252 255 255 200 S 253 255 255 200 S 254 255 255 200 S 255 255 255 200�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/Rainramp.lut���������������������������������������������������0000664�0001750�0001750�00000001400�07153744100�020747� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� !$'*-0369<?BEHKNQTWZ]`cfiljihfdcb`^]\ZXWVTRQPNLKJHFEDB@?><:9864320.-,*('&$"!  �  #&*.148<?BFJMPTX[^bfilptwz~‚…ˆŒ“–šžЁЄЈЌЏВЖКНРФШЫЮвжймрфчъюђѕјќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ�������������������������������������������������������������������������  $(,048<@DHLPTX\`dhlptx|€„ˆŒ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЪЧФТРНКИЖГАЎЌЉІЄЂŸœš˜•’Ž‹ˆ†„~|zwtrpmjhfc`^\YVTROLJHEB@>;864344456667AN[hu‚œЉЖУанъїџџ� !$'*-0369<?BEHKNQTWZ]`cfilorux{~„‡Š“–™œŸЂЅЈЋЎБДЗКНРУЦЩЬЯвеивЬЦРКДЎЈЂœ–Š„~xrlf`ZTNHB<60*$ �������������������������������������������������������������������������  #&*.148<?BFJMPTX[^bfilptwz~‚…ˆŒ“–šžЁЄЈЌЏВЖКНРФШЫЮвжймрфчъюђѕјќџџџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/pink_old.lut���������������������������������������������������0000664�0001750�0001750�00000001400�07177701750�021007� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%*.26:=@CFIKNPSUXZ\^`bdfhjlmoqstvxy{}~€ƒ„†‡‰ŠŒŽ‘’”•–˜™šœžŸЁЂЃЄЅЇЈЉЊЋЌЎЏАБВГДЕЖИЙКЛМНОПРСТТУУФФХХХЦЦЧЧШШШЩЩЪЪЫЫЫЬЬЭЭЭЮЮЯЯаааббвввггдддеежжжззииийййкклллммннноооппрррсстттуууффхххцццчччшшщщщъъъыыыььэээюююяяя№№№ёёђђђѓѓѓєєєѕѕѕіііїїїјјјљљљњњњћћћќќќ§§§ўўџ� "$')+-/024578:;=>?ABCDFGHIJLMNOPQRSTUVWXYZ[\]^^_`abcddefghiijklmmnoppqrsstuvvwxxyz{{|}}~€‚ƒ…†ˆ‰ŠŒ‘“”•—˜™›œž ЁЂЃЅІЇЈЉЊЌ­ЎЏАБВГЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежззийклмнопррстуфхццчшщщщъъъыыыььэээюююяяя№№№ёёђђђѓѓѓєєєѕѕѕіііїїїјјјљљљњњњћћћќќќ§§§ўўџ� "$')+-/024578:;=>?ABCDFGHIJLMNOPQRSTUVWXYZ[\]^^_`abcddefghiijklmmnoppqrsstuvvwxxyz{{|}}~€‚ƒƒ„„…††‡ˆˆ‰‰Š‹‹ŒŽŽ‘‘’’“””••––—˜˜™™šš››œžžŸŸ  ЁЁЂЂЃЃЄЄЅЅІІЇЇЈЈЉЊЊЊЋЋЌЌ­­ЎЎЏЏААББВВГГДЕЖИЙЛМНПРСУФХЦШЩЪЬЭЮЯавгдежийклмнпрстуфхцшщъыьэюя№ёђѓєѕіїјљњћќўџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/pink.lut�������������������������������������������������������0000664�0001750�0001750�00000001400�10402262762�020137� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%%%%****...2222666:::====@@@CCCFFFIIIKKKNNNPPPSSSUUXXXZZZ\\^^^``bbbddffhhhjjllmmooqqqssttvvxxyy{}}~~€€ƒƒ„††‡‡‰ŠŠŒŒŽŽ‘‘’””•––˜™ššœžŸЁЂЂЃЄЅЇЇЈЉЊЋЌЎЎЏАБВГДЕЖИЙКЛМНОПРТТУУФФХХЦЦЧШШШЩЪЪЫЫЬЭЭЮЮЯаабввгддежжзиййклмннопрсттуфхцчшщъыьэюя№ёђѓѕіїјљњќ§џ�� """$$$'''')))+++---///00022244455577888:::;;===>>???AABBCCCDDFFGGHHIIIJJLLMMNNOOPQQRRSSTTUUVWWXXYZZ[[\]]^^^_``abbcdddeffghiiijklmmmnoppqqrsstuvvwxxyz{{|}}€‚ƒ…†ˆŠŒ‘“”—˜™œ ЁЂЅІЈЊЌЎЏБГЕЗЙЛМОРТФЦШЪЬЮавезикнпсуцчщъыьэюя№ёђѓѕіїјљњќ§џ�� """$$$'''')))+++---///00022244455577888:::;;===>>???AABBCCCDDFFGGHHIIIJJLLMMNNOOPQQRRSSTTUUVWWXXYZZ[[\]]^^^_``abbcdddeffghiiijklmmmnoppqqrsstuvvwxxyz{{|}}€‚ƒ„„…†‡ˆˆ‰Š‹ŒŽŽ‘’“”••–˜˜™š›œžŸ ЁЂЃЄЅІЇЉЊЋЌ­ЎАБВГЖЛНСХЩЭадилрушыяђіњџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/overlay_classic.lut��������������������������������������������0000664�0001750�0001750�00000010074�10360676432�022375� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������* s=byte index red green blue S 0 0 0 0 S 1 250 0 255 S 2 245 0 255 S 3 240 0 255 S 4 235 0 255 S 5 230 0 255 S 6 224 0 255 S 7 219 0 255 S 8 214 0 255 S 9 209 0 255 S 10 204 0 255 S 11 199 0 255 S 12 194 0 255 S 13 189 0 255 S 14 184 0 255 S 15 179 0 255 S 16 173 0 255 S 17 168 0 255 S 18 163 0 255 S 19 158 0 255 S 20 153 0 255 S 21 148 0 255 S 22 143 0 255 S 23 138 0 255 S 24 133 0 255 S 25 128 0 255 S 26 122 0 255 S 27 117 0 255 S 28 112 0 255 S 29 107 0 255 S 30 102 0 255 S 31 97 0 255 S 32 92 0 255 S 33 87 0 255 S 34 82 0 255 S 35 77 0 255 S 36 71 0 255 S 37 66 0 255 S 38 61 0 255 S 39 56 0 255 S 40 51 0 255 S 41 46 0 255 S 42 41 0 255 S 43 36 0 255 S 44 31 0 255 S 45 26 0 255 S 46 20 0 255 S 47 15 0 255 S 48 10 0 255 S 49 5 0 255 S 50 0 5 255 S 51 0 10 255 S 52 0 15 255 S 53 0 20 255 S 54 0 26 255 S 55 0 31 255 S 56 0 36 255 S 57 0 41 255 S 58 0 46 255 S 59 0 51 255 S 60 0 56 255 S 61 0 61 255 S 62 0 66 255 S 63 0 71 255 S 64 0 77 255 S 65 0 82 255 S 66 0 87 255 S 67 0 92 255 S 68 0 97 255 S 69 0 102 255 S 70 0 107 255 S 71 0 112 255 S 72 0 117 255 S 73 0 122 255 S 74 0 128 255 S 75 0 133 255 S 76 0 138 255 S 77 0 143 255 S 78 0 148 255 S 79 0 153 255 S 80 0 158 255 S 81 0 163 255 S 82 0 168 255 S 83 0 173 255 S 84 0 179 255 S 85 0 184 255 S 86 0 189 255 S 87 0 194 255 S 88 0 199 255 S 89 0 204 255 S 90 0 209 255 S 91 0 214 255 S 92 0 219 255 S 93 0 224 255 S 94 0 230 255 S 95 0 235 255 S 96 0 240 255 S 97 0 245 255 S 98 0 250 255 S 99 0 255 255 S 100 0 255 250 S 101 0 255 245 S 102 0 255 240 S 103 0 255 235 S 104 0 255 229 S 105 0 255 224 S 106 0 255 219 S 107 0 255 214 S 108 0 255 209 S 109 0 255 204 S 110 0 255 199 S 111 0 255 194 S 112 0 255 189 S 113 0 255 184 S 114 0 255 178 S 115 0 255 173 S 116 0 255 168 S 117 0 255 163 S 118 0 255 158 S 119 0 255 153 S 120 0 255 148 S 121 0 255 143 S 122 0 255 138 S 123 0 255 133 S 124 0 255 127 S 125 0 255 122 S 126 0 255 117 S 127 0 255 112 S 128 0 255 107 S 129 0 255 102 S 130 0 255 97 S 131 0 255 92 S 132 0 255 87 S 133 0 255 82 S 134 0 255 76 S 135 0 255 71 S 136 0 255 66 S 137 0 255 61 S 138 0 255 56 S 139 0 255 51 S 140 0 255 46 S 141 0 255 41 S 142 0 255 36 S 143 0 255 31 S 144 0 255 25 S 145 0 255 20 S 146 0 255 15 S 147 0 255 10 S 148 0 255 5 S 149 0 255 0 S 150 5 255 0 S 151 10 255 0 S 152 15 255 0 S 153 20 255 0 S 154 26 255 0 S 155 31 255 0 S 156 36 255 0 S 157 41 255 0 S 158 46 255 0 S 159 51 255 0 S 160 56 255 0 S 161 61 255 0 S 162 66 255 0 S 163 71 255 0 S 164 77 255 0 S 165 82 255 0 S 166 87 255 0 S 167 92 255 0 S 168 97 255 0 S 169 102 255 0 S 170 107 255 0 S 171 112 255 0 S 172 117 255 0 S 173 122 255 0 S 174 128 255 0 S 175 133 255 0 S 176 138 255 0 S 177 143 255 0 S 178 148 255 0 S 179 153 255 0 S 180 158 255 0 S 181 163 255 0 S 182 168 255 0 S 183 173 255 0 S 184 179 255 0 S 185 184 255 0 S 186 189 255 0 S 187 194 255 0 S 188 199 255 0 S 189 204 255 0 S 190 209 255 0 S 191 214 255 0 S 192 219 255 0 S 193 224 255 0 S 194 230 255 0 S 195 235 255 0 S 196 240 255 0 S 197 245 255 0 S 198 250 255 0 S 199 255 255 0 S 200 255 250 0 S 201 255 245 0 S 202 255 240 0 S 203 255 235 0 S 204 255 229 0 S 205 255 224 0 S 206 255 219 0 S 207 255 214 0 S 208 255 209 0 S 209 255 204 0 S 210 255 199 0 S 211 255 194 0 S 212 255 189 0 S 213 255 184 0 S 214 255 178 0 S 215 255 173 0 S 216 255 168 0 S 217 255 163 0 S 218 255 158 0 S 219 255 153 0 S 220 255 148 0 S 221 255 143 0 S 222 255 138 0 S 223 255 133 0 S 224 255 127 0 S 225 255 122 0 S 226 255 117 0 S 227 255 112 0 S 228 255 107 0 S 229 255 102 0 S 230 255 97 0 S 231 255 92 0 S 232 255 87 0 S 233 255 82 0 S 234 255 76 0 S 235 255 71 0 S 236 255 66 0 S 237 255 61 0 S 238 255 56 0 S 239 255 51 0 S 240 255 46 0 S 241 255 41 0 S 242 255 36 0 S 243 255 31 0 S 244 255 25 0 S 245 255 20 0 S 246 255 15 0 S 247 255 10 0 S 248 255 5 0 S 249 255 0 0 S 250 255 0 3 S 251 255 0 5 S 252 255 0 8 S 253 255 0 10 S 254 255 0 13 S 255 255 0 16 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/NIH_ice.lut����������������������������������������������������0000664�0001750�0001750�00000001400�07152053456�020442� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� !#&(+-022111110047;?CFJNRVZ^bfjnqtwy|„‡Š’•˜›žЁЅЈЌЏВЖЙЛНПСУХЦШЪЬЮавджийлмопстфхчшъыэя№ђѓєѕіїјљњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњћћћћћћћћњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњњћћћћћћћћћћћћћњљјїіѕєѓё№юэыщшцœžŸ ЁЃЄЅІЇЉЊЋ­ЎЏББВГДЕЖЗИЙККЛМННОПРРСТТУФФУУУТТТСРПОНМЛКЙЗЖДГБЏЎЌЋЊЉЈІЅЄЃЂ žœš˜–•“Ž‹‰†ƒ~|zxusqomkigedb`_]\ZYWVTSQRRSTTUVWWXYYZZ[\\]]^__``aa`````____^^^^]]]]]]]]]]]\\\[[[ZZYYXWWVVUSQOMKIHFEDCCBBA@?>=<;98765432210/.,+)(&%#!  ��ŒŽ‘’“”•—˜™›œŸŸ ЁЂЃЄЅІЇЇЈЈЉЉЊЊЋЌЌ­ЎЎЏАГЗЛПУЧЫЯвгежзйклнортухчщъщшчхфутстфхцшщъьэюя№ђѓєѕіїїјјљљњњњњњћћћћћћћћћњњњњњњњњњњњњњљјјїїіѕєѓёяэыщшцццццццццхфутсрпомкиегаЮЫЩЦФСОМЙЖДВА­ЋЉЇЅЃЁž›™–”‘ŒŠˆ…ƒ|zyxwvutsrqponmlkjigfdca`^]\[YXWVUSPNKIFDB>:51,'#����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/NIH_fire.lut���������������������������������������������������0000664�0001750�0001750�00000001400�07152053460�020622� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  #&(+.147:=@CFILORUX[^adgjmorux{~„‡Š’”–˜šœž ЂЃЅІЇЉЊЋ­ЎЏБВГЕЖЗЙКЛНОПСТУХЦШЩЫЬЮЯабгдежийкмнпрсуфцчшъыьюя№ђѓѕіјљћќќ§§§ўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ����������������������������������������������������������������������������������������������������  "%(*-0258:=@BEHKMPSUX[]`cegikmoqsuwy{}~€‚„†ˆ‰‹’”•—™šœž ЁЃЅІЈЊЋ­ЏБГДЖИКМНПСУХЧШЪЬЮабгежиклнпсухцшъьэяёѓєіјљњњћќ§ўџџџџџџџџџџџџџџџџџџџџџџџџџџ#&*.159<@EIMQVZ^bfjosw{ƒˆŒ”™ЁЅЉЌЏВЖЙМРУЦЪЭбдзлннопрстттромкиждбЮЪЧУРМЙЕВЎЊЇЃŸœ˜•‘Š†ƒ|xuqnjgc`\YURNKGC@<952.+'$  ������������������������������������������������������������������������������������ ")18@HOW_fnu}„Œ“›ЃЊВЙСЩаипучыяѓїћў����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/NIH.lut��������������������������������������������������������0000664�0001750�0001750�00000001400�07152053406�017615� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� "'-38>DIOUOJE?:5/*% ������������������������������������������������������������������������������������������������� %*/5:?EJOU_jtŠ”ŸЊДПЩдпщєџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќњјіѓёяэъшцфспнлиждваЭЫЩЧФТРОЛЙЗЕВАЎ­����������������������������������������������������������������� %*/5:?EJOUZ_djotz„Š”šŸЄЊЏДЙПФЩЯдйпфщяєљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџљєящфпйдЯЩФПЙДЏЊЄŸš”Š„ztojd_ZUQNKGDA>:741-*'#  ���������������������������������������� "-8DOZfq|ˆ“žЊЄŸš”Š„ztojd_ZUZ_djotz„Š”šŸЄЊЏДЙПФЩЯдйпфщяєљџџџџџџџџџџџџџџџџџљєящфпйдЯЩФПЙДЏЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊŸ”Štj_UJ?5* � %*/5:?EJOUOJE?:5/*% �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/HOTIRON.lut����������������������������������������������������0000664�0001750�0001750�00000001400�07252524372�020327� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~€‚„†ˆŠŒŽ’”–˜šœž ЂЄІЈЊЌЎАВДЖИКМОРТФЦШЪЬЮавджикмортфцшъью№ђєіјњќўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ���������������������������������������������������������������������������������������������������������������������������������  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~€‚„†ˆŠŒŽ’”–˜šœž ЂЄІЈЊЌЎАВДЖИКМОРТФЦШЪЬЮавджикмортфцшъью№ђєіјњќџ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ЄЈЌАДИМРФШЬадимрфшь№єјќџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/greengray.lut��������������������������������������������������0000664�0001750�0001750�00000001400�10601005140�021143� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  !!"##$%%&'(()*++,-./00123456789:;<=>?ABCDEGHIKLMOPRSUWXZ\]_acegikmortvy{~ƒ†ˆ‹’”—™›ŸЁЃЅЇЉЋ­ЎАВГЕЗИКЛНОРСУФЦЧШЪЫЬЭЯабвгежзийклмнопрстуфхцчшшщъыьээюя№ёёђѓєєѕіїїјљљњћћќ§§ўўџ� !$&)+-02468:<>@ACEFHJKMNPQRTUVXYZ[]^_`abcdefghijklmnoopqrsstuvvwxyyz{{|}}~~€€‚ƒƒ„……††‡ˆˆ‰‰Š‹‹ŒŽ‘’’“””•––—˜˜™šš›œœžžŸ  ЁЂЂЃЄЄЅІЇЇЈЉЉЊЋЌЌ­ЎЎЏАББВГДДЕЖЖЗИЙЙКЛММНОПРРСТУУФХЦЧЧШЩЪЫЫЬЭЮЯЯабвггдежзиийклмноопрстуффхцчшщъыььэюя№ёђѓєѕіїїјљњћќ§ўџ��  !!""#$$%&&'())*+,,-./00123456789:;<=>?@ABDEFGIJKMNOQRTUWXZ\]_acegikmoqsuxz}‚„‡‰ŒŽ“•—™›ŸЁЃЅЇЉЋЌЎАВГЕЗИКЛНОРСУФХЧШЩЫЬЭЯабвгежзийклмопрстуфхццчшщъыьэююя№ёђѓѓєѕііїјљљњћќќ§ўўџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/gooch.lut������������������������������������������������������0000664�0001750�0001750�00000001400�07372346014�020302� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~€‚„†ˆŠŒŽ’”–˜šœž ЂЄІЈЊЌЎАВДЖИКМОРТФЦШЪЬЮавджикмортфцшъью№ђєіјњќўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ�����������������������������������������������������������������  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~€‚„†ˆŠŒŽ’”–˜šœž ЂЄІЈЊЌЎАВДЖИКМОРТФЦШЪЬЮавджикмортфцшъью№ђєіјњќўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ�  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ЄЈЌАДИМРФШЬадимрфшь№єјќџќњјієђ№юьъшцфтромкиждваЮЬЪШЦФТРОМКИЖДВАЎЌЊЈІЄЂ žœš˜–”’ŽŒŠˆ†„‚€~|zxvtrpnljhfdb`^\ZXVTRPNLJHFDB@><:86420.,*(&$"  �  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ЄЈЌАДИМРФШЬадимрфшь№єјќџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/gold.lut�������������������������������������������������������0000664�0001750�0001750�00000001400�07152612202�020117� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� !#%&(*,.013578:<>?ACEFHJKMOPRTUWYZ\]_abdeghjkmnpqstvwyz|}€ƒ„†‡ˆŠ‹ŒŽ’“”–—˜™›œž ЁЂЃЄІЇЈЉЊЋ­ЎЏАБВГДЕЖИЙКЛМНОПРСТУФХЦЧЧШЩЪЫЬЭЮЯаабвгдеежзиййклммноппрсстууфххцччшшщъъыыььээююяя№№ёёђђѓѓєєєѕѕіііїїїјјјљљљњњњњћћћћќќќќ§§§§§§ўўўўўўўўџџџџџџџџџџџџ�  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ���  !"##$%&'(()*+,-./0123456789:<=>?@ACDEFHIJLMNPQRTUWXZ[]^`acefhikmoprtvwy{}ƒ„†ˆŠŒŽ“•—™›ŸЂЄІЈЋ­ЏВДЖЙЛОРУХШЪЭЯвезкнптхшыэ№ѓіљќџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/GE_color.lut���������������������������������������������������0000664�0001750�0001750�00000001400�07152053466�020676� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� !#%')+-/13579;=?ACEGIKMOQSUVXZ\^`bdfhjlnprtvxz|~€‚„†ˆŠŒŽ’”–˜šœž ЂЄІЈЊЋ­ЏБГЕЗЙЛНПСУХЧЩЫЭЯбгезйлнпсухчщыэяёѓѕїљћ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ�  "$&(*,.02468:<>ACEGIKMOQSUWY[]_acegikmoqsuwy{}€~|zxvtrpnljhfdb`^\ZXVTRPNLJHFDB@?=;97531/-+)'%#! �  "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~€‚„†ˆŠŒŽ’”–˜šœž ЂЄІЈЊЌЎАВДЖИКМОРТФЦШЪЬЮавджикмортфцшъью№ђєіјњќџ� !#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}ƒ…‡‰‹‘“•—™›ŸЁЃЅЇЉЋ­ЏБГЕЗЙЛНПСУХЧЩЫЭЯбгезйлнпсухчщыэяёѓѕїљћ§џќјє№ьшфрмидаЬШФРМИДАЌЈЄ œ˜”Œˆ„€|xtplhd`\XTPLHD@<840,($  �  $(,048<@DHLPUY]aeimquy}…‰‘•™ЁЅЊЎВЖКОТЦЪЮвжкотцъюђіњџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/french.lut�����������������������������������������������������0000664�0001750�0001750�00000001400�10047726250�020445� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� !"#%&'((((((((((((((('&%#"! ����������������������������������������3jЄАИРШЯжлпщёњќ§ўўўўўўўўўўўўўўўў§ќћљјїѕѓ№юьъшцфтпнкизжжжжжжжжжжжжжжжжззийййизжжеддггвббаЯЯЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЭЭЬЬЬЬЬЬЬЭЮабгеилотхщыюя№№№№№№№№� !#&)+.1369;>ACFIKNQSVY[^acfiknqsvy{~ƒ†‰‹Ž’”–˜šœž ЁЂЂЂЂЂЂЂЂЁ Ÿœ›™˜—•”“‘Œ‰…~~~~ƒ†Š“™žЃЉЎГЙОФЩЯдйпфщёіњњњњњњњњњњњњњњњњњњњњђчквЪТКВЊЂš’Š‚zrjbZRJB:2*" ������������������������ "*2:BJRZbjrz‚‰‘˜ ЈАИРШаирш№єј� "'+15:?CHMQW[`einsw}†‹”—˜—–”’ŽŒŠˆ†„‚}|{yxwutsqpomlkjihec`][XVTRPNLJHFDB@=;85/*'%%$$$!  )8<<<<<<<<<<;83,$ �������������������������������� ;]|~€‚„†ˆŠŒŽ’”–˜šœŸŸЁЁЃЃЄЄЄЄЄЄЄЄЄЄЄПлїљљћћќќќ§ўўўўўўўў����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/flow.lut�������������������������������������������������������0000664�0001750�0001750�00000001400�07152053472�020151� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���  $(-159=AEIMQUY]aeimquy}‚†ŠŽ’–šžЂІЊЎВЖКОТЦЪЮвзлпучыяѓїћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШХТПМЙЖГА­ЊЇЄЁž›˜•’Œ‰†ƒ€}zwtqnkheb_\YVSPMJGDA>;852/,)&#  ������������������ "&*.26:>BFJNRVZ^bfjnrvz~‚†ŠŽ’–šžЂІЊЎВЖКОТЦЪЮвжкотцъюђіњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћїє№ьшфснйебЮЪЦТОКЗГЏЋЇЄ œ˜”‘‰…~zvrnkgc_[XTPLHEA=951.*&" ������������������������������������������������������������������������������������������������ (08@HPX`hpx€ˆ˜ ЈАИРШаирш№јџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/cortex.lut�����������������������������������������������������0000664�0001750�0001750�00000001400�10303131340�020465� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  !#$%'()+,./0234679:;=>?ABDEFHIKLMOPQSTVWXZ[\^_abcefhijlmnpqstuwxy{|~€‚ƒ„†‡‰Š‹Ž‘’”•–˜™›œŸ ЁЃЄІЇЈЊЋ­ЎЏБВГЕЖИЙКМНОРСУФХЧШЩЫЬЮЯавгежзйклнорстфхцшщыьэя№ђѓєіїјњћ§ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  !"#$$%&'()*+,--./01234556789:;<==>?@ABCDEEFGHIJKLMMNOPQRSTUUVWXYZ[\]]^_`abcdeefghijklmmnopqrstuuvwxyz{|}}~€‚ƒ„…††‡ˆ‰Š‹ŒŽŽ‘’“”•––—˜™š›œžžŸ ЁЂЃЄЅІІЇЈЉЊЋЌ­ЎЎЏАБВГДЕЖЖЗИЙКЛМНООПРСТУФХЦЦЧШЩЪЫЬЭЮЮЯабвгдежжзийклмнруцы№ѕњџ  !""#$$%&&'(()**+,--.//01123345567789::;<<=>>?@@ABBCDDEFGGHIIJKKLMMNOOPQRRSTTUVVWXXYZZ[\\]^__`aabccdeefgghiijkllmnnoppqrrsttuvvwxyyz{{|}}~€‚ƒ„„…††‡ˆˆ‰ŠŠ‹ŒŒŽŽ‘‘’““”••–——˜™™š››œžžŸ ЁЂЃЄІЊЏДЙОУШЭввзмсцы№ѕџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/cardiac.lut����������������������������������������������������0000664�0001750�0001750�00000001400�07152053474�020572� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������IHFEDBA?>=;:976430-)&#  ���������������������������������  $'+/269=ADHLOSVZ_chmqv{€„‰Ž’—œ ЅЉЌАГЗКОТХЩЬагзкортфцшъьяёѓѕїљћ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџњѕ№ьчтнигЮЩХРЛЖБЋЄž—‘Š„}wpjc]VIСУХЦШЪЬЮабгезйкмоооооооооооооооооигЭШТМЗБЋІ ›•Š„€}yvrnkgc`\YUQNJFC?<841-)&" ����������������������������������������������������������������� !%)-26:>BFJNSW[_cgkotx|€„ˆŒ•™ЁЅЊЎГИМСХЪЯгинсцъяюэьыъщшчхфутсрпомкйзегбаЮЬЪШЦХС %.6?GPXairzƒ‹’šЁЈЏЗОХЬдлтщёјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§ќњљїієѓёяюьыщшцхутрпнмкйзждгбаЮЫЩЦФСПМКЗДВЏ­ЊЈЅЃЁŸ›™—•’ŽŒŠˆ†„{vqmhc_ZUPLGB>952.+'$  ������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/bone.lut�������������������������������������������������������0000664�0001750�0001750�00000001400�07177701774�020141� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  !""#$%&'())*+,-./001234567789:;<=>>?@ABCDEEFGHIJKLLMNOPQRSSTUVWXYZ[[\]^_`abbcdefghiijklmnoppqrstuvwwxyz{|}~~€‚ƒ„……†‡ˆ‰Š‹ŒŒŽ‘’““”•–—˜™šš›œžŸ ЁЁЂЃЄЅІЇЈЉЋЌ­ЏАВГДЖЗИКЛНОПСТУХЦШЩЪЬЭЮабгдезийлмопртуфцчщъыэюяёђєѕіјљњќ§џ��  !""#$%&'())*+,-./001234567789:;<=>>?@ABCDEEFGHIJKLLMNOPQRSTUVWYZ[\]_`abdefghjklmnpqrstvwxyz|}~€‚ƒ„…‡ˆ‰Š‹Ž‘“”•–—™š›œŸ ЁЂЃЅІЇЈЊЋЌ­ЎАБВГДЖЗИЙКМНОПРТУФХЧЧШЩЪЫЬЭЮЮЯабвгдеежзийклммнопрстууфхцчшщъъыьэюя№ёёђѓєѕіїјјљњћќ§ўџ�  "#$%&()*+,./01345679:;<=?@ABCEFGHIKLMNOQRSTVWXYZ\]^_`bcdefhijklnopqrstuvwxyyz{|}~€€‚ƒ„…†‡‡ˆ‰Š‹ŒŽŽ‘’“”••–—˜™š›œœžŸ ЁЂЃЃЄЅІЇЈЉЊЋЋЌ­ЎЏАБВВГДЕЖЗИЙЙКЛМНОПРРСТУФХЦЧЧШЩЪЫЬЭЮЮЯабвгдеежзийклммнопрстууфхцчшщъъыьэюя№ёёђѓєѕіїјјљњћќ§ўџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/blue_otto.lut��������������������������������������������������0000664�0001750�0001750�00000010344�10360607142�021177� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������* s=byte index red green blue S 0 0 0 0 S 1 0 0 128 S 2 0 0 128 S 3 0 0 128 S 4 0 0 128 S 5 0 0 128 S 6 0 0 128 S 7 0 0 128 S 8 0 0 128 S 9 0 0 128 S 10 0 0 128 S 11 0 0 128 S 12 0 0 128 S 13 0 0 128 S 14 0 0 128 S 15 0 0 128 S 16 0 0 128 S 17 0 0 128 S 18 0 0 128 S 19 0 0 128 S 20 0 0 128 S 21 0 0 128 S 22 0 0 128 S 23 0 0 128 S 24 0 0 128 S 25 0 0 128 S 26 0 0 128 S 27 0 0 128 S 28 0 0 128 S 29 0 0 128 S 30 0 0 128 S 31 0 0 128 S 32 0 0 128 S 33 0 0 128 S 34 0 0 128 S 35 0 0 128 S 36 0 0 128 S 37 0 0 128 S 38 0 0 128 S 39 0 0 128 S 40 0 0 128 S 41 0 0 128 S 42 0 0 128 S 43 0 0 128 S 44 0 0 128 S 45 0 0 128 S 46 0 0 128 S 47 0 0 128 S 48 0 0 128 S 49 0 0 128 S 50 0 0 128 S 51 32 0 192 S 52 32 0 192 S 53 32 0 192 S 54 32 0 192 S 55 32 0 192 S 56 32 0 192 S 57 32 0 192 S 58 32 0 192 S 59 32 0 192 S 60 32 0 192 S 61 32 0 192 S 62 32 0 192 S 63 32 0 192 S 64 32 0 192 S 65 32 0 192 S 66 32 0 192 S 67 32 0 192 S 68 32 0 192 S 69 32 0 192 S 70 32 0 192 S 71 32 0 192 S 72 32 0 192 S 73 32 0 192 S 74 32 0 192 S 75 32 0 192 S 76 32 0 192 S 77 32 0 192 S 78 32 0 192 S 79 32 0 192 S 80 32 0 192 S 81 32 0 192 S 82 32 0 192 S 83 32 0 192 S 84 32 0 192 S 85 32 0 192 S 86 32 0 192 S 87 32 0 192 S 88 32 0 192 S 89 32 0 192 S 90 32 0 192 S 91 32 0 192 S 92 32 0 192 S 93 32 0 192 S 94 32 0 192 S 95 32 0 192 S 96 32 0 192 S 97 32 0 192 S 98 32 0 192 S 99 32 0 192 S 100 32 0 192 S 101 32 0 192 S 102 0 168 190 S 103 0 168 190 S 104 0 168 190 S 105 0 168 190 S 106 0 168 190 S 107 0 168 190 S 108 0 168 190 S 109 0 168 190 S 110 0 168 190 S 111 0 168 190 S 112 0 168 190 S 113 0 168 190 S 114 0 168 190 S 115 0 168 190 S 116 0 168 190 S 117 0 168 190 S 118 0 168 190 S 119 0 168 190 S 120 0 168 190 S 121 0 168 190 S 122 0 168 190 S 123 0 168 190 S 124 0 168 190 S 125 0 168 190 S 126 0 168 190 S 127 0 168 190 S 128 0 168 190 S 129 0 168 190 S 130 0 168 190 S 131 0 168 190 S 132 0 168 190 S 133 0 168 190 S 134 0 168 190 S 135 0 168 190 S 136 0 168 190 S 137 0 168 190 S 138 0 168 190 S 139 0 168 190 S 140 0 168 190 S 141 0 168 190 S 142 0 168 190 S 143 0 168 190 S 144 0 168 190 S 145 0 168 190 S 146 0 168 190 S 147 0 168 190 S 148 0 168 190 S 149 0 168 190 S 150 0 168 190 S 151 0 168 190 S 152 0 168 190 S 153 127 255 255 S 154 127 255 255 S 155 127 255 255 S 156 127 255 255 S 157 127 255 255 S 158 127 255 255 S 159 127 255 255 S 160 127 255 255 S 161 127 255 255 S 162 127 255 255 S 163 127 255 255 S 164 127 255 255 S 165 127 255 255 S 166 127 255 255 S 167 127 255 255 S 168 127 255 255 S 169 127 255 255 S 170 127 255 255 S 171 127 255 255 S 172 127 255 255 S 173 127 255 255 S 174 127 255 255 S 175 127 255 255 S 176 127 255 255 S 177 127 255 255 S 178 127 255 255 S 179 127 255 255 S 180 127 255 255 S 181 127 255 255 S 182 127 255 255 S 183 127 255 255 S 184 127 255 255 S 185 127 255 255 S 186 127 255 255 S 187 127 255 255 S 188 127 255 255 S 189 127 255 255 S 190 127 255 255 S 191 127 255 255 S 192 127 255 255 S 193 127 255 255 S 194 127 255 255 S 195 127 255 255 S 196 127 255 255 S 197 127 255 255 S 198 127 255 255 S 199 127 255 255 S 200 127 255 255 S 201 127 255 255 S 202 127 255 255 S 203 127 255 255 S 204 127 255 255 S 205 220 255 255 S 206 220 255 255 S 207 220 255 255 S 208 220 255 255 S 209 220 255 255 S 210 220 255 255 S 211 220 255 255 S 212 220 255 255 S 213 220 255 255 S 214 220 255 255 S 215 220 255 255 S 216 220 255 255 S 217 220 255 255 S 218 220 255 255 S 219 220 255 255 S 220 220 255 255 S 221 220 255 255 S 222 220 255 255 S 223 220 255 255 S 224 220 255 255 S 225 220 255 255 S 226 220 255 255 S 227 220 255 255 S 228 220 255 255 S 229 220 255 255 S 230 220 255 255 S 231 220 255 255 S 232 220 255 255 S 233 220 255 255 S 234 220 255 255 S 235 220 255 255 S 236 220 255 255 S 237 220 255 255 S 238 220 255 255 S 239 220 255 255 S 240 220 255 255 S 241 220 255 255 S 242 220 255 255 S 243 220 255 255 S 244 220 255 255 S 245 220 255 255 S 246 220 255 255 S 247 220 255 255 S 248 220 255 255 S 249 220 255 255 S 250 220 255 255 S 251 220 255 255 S 252 220 255 255 S 253 220 255 255 S 254 220 255 255 S 255 220 255 255 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/bluegray.lut���������������������������������������������������0000664�0001750�0001750�00000001400�10601005502�020774� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  !!""#$$%%&''())*++,-../011234556789:;;<=>?@ABCDEFHIJKLMOPQRTUVXY[\]_`bdegijlnprsuwy|~€‚„†ˆ‹‘“•—™šœž ЂЄІЇЉЋ­ЎАВДЕЗЙКМНПРТФХЧШЪЫЬЮЯбвдежийкмнорстухцчшъыьэю№ёђѓєѕіїљњћќ§ўџ��  !!"##$$%&&''())*++,-../0012344567889:;<=>?@ABCDEFGHIJKLNOPQSTUVXY[\]_`bceghjlmoqsuwy{}ƒ…‡‰‹‘“•—™›Ÿ ЂЄІЈЊЋ­ЏБВДЖЗЙЛМОПСУФЦЧЩЪЬЭЯавгежийкмнорсуфхчшщъьэюяёђѓєіїјљњќ§ўџ�  "#%'(*+-.01245789;<=>@ABCDEFHIJKLMNOPQRSTUUVWXYZ[\\]^_``abccdeefghhijjkllmnnoopqqrrsstuuvvwwxxyyzz{{||}}~~€€€‚‚ƒƒ„„……††‡‡ˆˆ‰‰ŠŠ‹ŒŒŽŽ‘‘’““””•––—˜˜™šš›œžŸ  ЁЂЃЃЄЅІЇЈЈЉЊЋЌ­ЎЏАБВВГДЕЖИЙКЛМНОПРСУФХЦЧЩЪЫЭЮЯбвгежийлморсуфцшъыэяёѓѕїљћ§џ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/blackbdy.lut���������������������������������������������������0000664�0001750�0001750�00000001400�07152053500�020745� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� !$'*-0369<?BEHKNQTWZ]`cfilorux{~„‡Š“–™œŸЂЅЈЋЎБДЗКНРУЦЩЬЯвеилосфчъэ№ѓіљќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ�������������������������������������������������������������������������������������� !$'*-0369<?BEHKNQTWZ]`cfilorux{~„‡Š“–™œŸЂЅЈЋЎБДЗКНРУЦЩЬЯвеилосфчъэ№ѓіљќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������� !$'*-0369<?BEHKNQTWZ]`cfilorux{~„‡Š“–™œŸЂЅЈЋЎБДЗКНРУЦЩЬЯвеилосфчъэ№ѓіљќџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/actc.lut�������������������������������������������������������0000664�0001750�0001750�00000001400�10313600710�020076� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� (08@HPX`hpx€ˆ˜ ЈАИРШаирш№јџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ������������������������������������������������������������������  #&),/147:=@BEHKNQSVY\_bdgjmpsux{~„†‰Œ’•—š ЃІЉЋЎБДЗКМПТХШЫЭагжймосфчъэяђѕјћўўћљіѓёюьщчфтпмкзеваЭЫШХУРОЛЙЖГБЎЌЉЇЄЂŸœš—•’‹ˆ…ƒ€~{yvsqnligdb_\ZWURPMKHEC@>;9631.,)'$" ��  "$&(*-/13579<>@BDFHJLOQSUWY[^`bdfhjlnqsuwy{}€‚„†ˆ†„‚€}{ywusqnljhfdb`^[YWUSQOLJHFDB@><97531/-*(&$"  ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/6bluegrn.lut���������������������������������������������������0000664�0001750�0001750�00000001400�10332744020�020714� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ�оннллккииззееддввббЯЯЮЮЬЬЫЫЩЩШШЦЦХХУУТТРРППННММККЙЙЗЗЖЖДДГГББААЎЎ­­ЋЋЊЊЈЈЇЇЅЅЄЄЂЂЁЁŸŸžžœœ››™™˜˜––••““’’ŒŒŠŠ‰‰‡‡††„„ƒƒ€€~~}}{{zzxxwwuuttrrqqoonnllkkiihhffeeccbb``__]]\\ZZYYWWVVTTSSQQPPNNMMKKJJHHGGEEDDBBAA??>><<;;99886655332200//--,,**))''&&$$##!! ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/5redyell.lut���������������������������������������������������0000664�0001750�0001750�00000001400�10332744236�020726� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������РРРССССТТТТУУУУФФФФХХХХЦЦЦЦЧЧЧЧШШШШЩЩЩЩЪЪЪЪЫЫЫЫЬЬЬЬЭЭЭЭЮЮЮЮЯЯЯЯааааббббввввггггддддеееежжжжззззииииййййккккллллммммннннооооппппррррссссттттууууффффххххццццччччшшшшщщщщъъъъыыыыььььээээююююяяяя№№№№ёёёёђђђђѓѓѓѓєєєєѕѕѕѕііііїїїїјјјјљљљљњњњњћћћћќќќќ§§§§ўўўўџџџџ�  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/4cool.lut������������������������������������������������������0000664�0001750�0001750�00000001400�10314531504�020211� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������€€‚‚ƒƒ„„……††‡‡ˆˆ‰‰ŠŠ‹‹ŒŒŽŽ‘‘’’““””••––——˜˜™™šš››œœžžŸŸ  ЁЁЂЂЃЃЄЄЅЅІІЇЇЈЈЉЉЊЊЋЋЌЌ­­ЎЎЏЏААББВВГГДДЕЕЖЖЗЗИИЙЙККЛЛММННООППРРССТТУУФФХХЦЦЧЧШШЩЩЪЪЫЫЬЬЭЭЮЮЯЯааббввггддеежжззииййккллммннооппррссттууффххццччшшщщъъыыььээююяя№№ёёђђѓѓєєѕѕііїїјјљљњњћћќќ§§ўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/3warm.lut������������������������������������������������������0000664�0001750�0001750�00000001400�10314530646�020230� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€€‚‚ƒƒ„„……††‡‡ˆˆ‰‰ŠŠ‹‹ŒŒŽŽ‘‘’’““””••––——˜˜™™šš››œœžžŸŸ  ЁЁЂЂЃЃЄЄЅЅІІЇЇЈЈЉЉЊЊЋЋЌЌ­­ЎЎЏЏААББВВГГДДЕЕЖЖЗЗИИЙЙККЛЛММННООППРРССТТУУФФХХЦЦЧЧШШЩЩЪЪЫЫЬЬЭЭЮЮЯЯааббввггддеежжззииййккллммннооппррссттууффххццччшшщщъъыыььээююяя№№ёёђђѓѓєєѕѕііїїјјљљњњћћќќ§§ўў��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/2winter.lut����������������������������������������������������0000664�0001750�0001750�00000001400�10314530646�020571� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџџџўў§§ќќћћњњљљјјїїііѕѕєєѓѓђђёё№№яяююээььыыъъщщшшччццххффууттссррппооннммллккййииззжжееддггввббааЯЯЮЮЭЭЬЬЫЫЪЪЩЩШШЧЧЦЦХХФФУУТТССРРППООННММЛЛККЙЙИИЗЗЖЖЕЕДДГГВВББААЏЏЎЎ­­ЌЌЋЋЊЊЉЉЈЈЇЇІІЅЅЄЄЃЃЂЂЁЁ  ŸŸžžœœ››šš™™˜˜——––••””““’’‘‘ŽŽŒŒ‹‹ŠŠ‰‰ˆˆ‡‡††……„„ƒƒ‚‚€€����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/1hot.lut�������������������������������������������������������0000664�0001750�0001750�00000001400�10314530646�020052� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  #%(+-0358;=@BEHJMPRUXZ]`behjmpruxz}€‚…ˆŠ’•˜š ЂЅЈЊ­АВЕИКНРТХШЪЭЯвезкнптхчъэяђѕїњ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ������������������������������������������������������������������������������������������������  #%(+-0358;=@BEHJMPRUXZ]`behjmpruxz}€‚…ˆŠ’•˜š ЂЅЈЊ­АВЕИКНРТХШЪЭЯвезкнптхчъэяђѕїњ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  $(,048<@DHLPTX\`dhlptx|€„ˆŒ”˜œ ЄЈЌАДИМРФШЬадимрфшь№єјќџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/lut/16.lut���������������������������������������������������������0000664�0001750�0001750�00000001400�07362412744�017434� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� 000000000000000@@@@@@@@@@@@@@@PPPPPPPPPPPPPPP```````````````ppppppppppppppp€€€€€€€€€€€€€€€               АААААААААААААААРРРРРРРРРРРРРРРаааааааааааааааррррррррррррррр№№№№№№№№№№№№№№№џџџџџџџџџџџџџџџџ��������������� 000000000000000@@@@@@@@@@@@@@@PPPPPPPPPPPPPPP```````````````ppppppppppppppp€€€€€€€€€€€€€€€               АААААААААААААААРРРРРРРРРРРРРРРаааааааааааааааррррррррррррррр№№№№№№№№№№№№№№№џџџџџџџџџџџџџџџџ��������������� 000000000000000@@@@@@@@@@@@@@@PPPPPPPPPPPPPPP```````````````ppppppppppppppp€€€€€€€€€€€€€€€               АААААААААААААААРРРРРРРРРРРРРРРаааааааааааааааррррррррррррррр№№№№№№№№№№№№№№№џџџџџџџџџџџџџџџџ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/license.txt��������������������������������������������������������0000664�0001750�0001750�00000003210�11326434466�020040� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MRIcron uses the BSD license. For details see http://www.answers.com/topic/bsd-and-gpl-licensing or http://en.wikipedia.org/wiki/BSD_and_GPL_licensing MRIcron medical viewer Copyright (c) 2006 Chris Rorden All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the names of the copyright owners nor the names of this project (MRIcron) may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/landmarks.pas������������������������������������������������������0000664�0001750�0001750�00000014460�11450366254�020344� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit landmarks; interface {$H+} uses {$IFDEF Win32} Windows, Messages, {$ELSE} LMessages, LCLType, {$ENDIF} {$IFDEF FPC}LResources, {$ENDIF} SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ToolWin, ComCtrls; type TAnatForm = class(TForm) ToolBar1: TToolBar; SaveBtn: TSpeedButton; AddBtn: TSpeedButton; ComboBox1: TComboBox; UpdateBtn: TSpeedButton; OpenBtn: TSpeedButton; DeleteBtn: TSpeedButton; procedure SaveBtnClick(Sender: TObject); procedure AddBtnClick(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure UpdateCombo; procedure OpenBtnClick(Sender: TObject); procedure Update(lIndex: integer); procedure UpdateBtnClick(Sender: TObject); procedure DeleteBtnClick(Sender: TObject); procedure OpenAnat(lFilename: string); procedure CloseAnat; private { Private declarations } public { Public declarations } end; var AnatForm: TAnatForm; implementation uses nifti_img_view, nifti_img, nifti_hdr_view, define_types; {$IFNDEF FPC} //Delphi {$R *.dfm} {$ENDIF} type TLandmark = record Name: string; X,Y,Z: single; end; TLandmarkRA = array of TLandmark; const kAnatFilter = 'AnatomyFile|*.anat'; var gLandmarks: TLandmarkRA; procedure TAnatForm.CloseAnat; begin if length(gLandmarks) < 1 then exit; SetLength(gLandmarks,0); UpdateCombo; end; procedure TAnatForm.SaveBtnClick(Sender: TObject); const kSep = chr(9); var i: integer; lF: TextFile; begin if length(gLandmarks) < 1 then begin showmessage('No landmarks open - either open a file or create new landmarks'); exit; end; ImgForm.SaveDialog1.Filter := kAnatFilter; ImgForm.SaveDialog1.DefaultExt := '.anat'; ImgForm.SaveDialog1.Filename := ChangeFileExt(ImgForm.SaveDialog1.Filename, ImgForm.SaveDialog1.DefaultExt); //10102006 if not ImgForm.SaveDialog1.Execute then exit; Filemode := 0; AssignFile(lF, ImgForm.SaveDialog1.Filename); rewrite(lF); for i := 0 to length(gLandmarks)-1 do Writeln(lF, gLandmarks[i].Name+kSep+floattostr(gLandmarks[i].X)+kSep+floattostr(gLandmarks[i].Y)+kSep+floattostr(gLandmarks[i].Z) ); CloseFile(lF); end; procedure TAnatForm.UpdateCombo; var i: integer; begin //xxx ComboBox1.Items.Clear; if length(gLandmarks) < 1 then exit; for i := 0 to length(gLandmarks)-1 do ComboBox1.Items.Add(gLandmarks[i].Name); ComboBox1.ItemIndex := length(gLandmarks)-1; ComboBox1Change(nil); end; procedure TAnatForm.AddBtnClick(Sender: TObject); var s: string; i: integer; lOK: boolean; begin i := length(gLandmarks)+1; s := 'A'+inttostr(i); lOK := InputQuery('Enter a name', 'region name', s); if not lOK then exit; setlength(gLandmarks,i); gLandmarks[i-1].Name := s; Update(i-1); UpdateCombo; end; (* MMToImgCoord(lX,lY,lZ,lXmm,lYmm,lZmm); if lX <> ImgForm.XViewEdit.value then ImgForm.XViewEdit.value := lX; if lY <> ImgForm.YViewEdit.value then ImgForm.YViewEdit.value := lY; if lZ <> ImgForm.ZViewEdit.value then ImgForm.ZViewEdit.value := lZ; *) procedure SetLandmark(index: integer);//indexed from 0 var //lXmm,lYmm,lZmm: single; lX,lY,lZ: integer; begin if (index < 0) or (index >= length(gLandmarks)) then exit; MMToImgCoord(lX,lY,lZ,gLandmarks[index].X,gLandmarks[index].Y,gLandmarks[index].Z); if lX <> ImgForm.XViewEdit.value then ImgForm.XViewEdit.value := lX; if lY <> ImgForm.YViewEdit.value then ImgForm.YViewEdit.value := lY; if lZ <> ImgForm.ZViewEdit.value then ImgForm.ZViewEdit.value := lZ; ImgForm.XViewEditChange(nil); end; procedure TAnatForm.ComboBox1Change(Sender: TObject); begin SetLandmark(ComboBox1.ItemIndex); end; function NextTab(lStr: string; var lP: integer): string; //reports text prior to comma... var len: integer; begin result := ''; len := length(lStr); if len < lP then exit; repeat if (lStr[lP] = chr(9){','}) then begin lP := lP + 1; exit; end; //if lStr[lP] <> ' ' then result := result + lStr[lP]; lP := lP + 1; until (lP > len); end; procedure TAnatForm.OpenAnat(lFilename: string); var st: string; sl: TStringList; n, line, col : integer; begin if not Fileexists(lFilename) then begin CloseAnat; exit; end; //will load the TAB delimited TXT here sl := TStringList.Create; try //load the tab delimited txt file sl.LoadFromFile(lFilename) ; //for each tab delimited line n := 0; setlength(gLandmarks,sl.Count); for line := 0 to sl.Count-1 do begin st := sl[line]; col := 1; if (NextTab(st,col) <> '') and (NextTab(st,col) <> '') and(NextTab(st,col) <> '') and(NextTab(st,col) <> '') then begin inc(n); col := 1; gLandmarks[line].Name := NextTab(st,col); gLandmarks[line].X := strtofloat(NextTab(st,col)); gLandmarks[line].Y := strtofloat(NextTab(st,col)); gLandmarks[line].Z := strtofloat(NextTab(st,col)); end; end; setlength(gLandmarks,n); finally sl.Free; end; UpdateCombo; AnatForm.show; end; procedure TAnatForm.OpenBtnClick(Sender: TObject); begin if not OpenDialogExecute(kAnatFilter,'Select background image',false) then exit; OpenAnat(HdrForm.OpenHdrDlg.Filename) ; end; procedure TAnatForm.Update(lIndex: integer); var X,Y,Z: integer; begin if lIndex >= Length(gLandmarks) then exit; X := round(ImgForm.XViewEdit.value); Y := round(ImgForm.YViewEdit.value); Z := round(ImgForm.ZViewEdit.value); ImgCoordToMM(X,Y,Z, gLandmarks[lIndex].X,gLandmarks[lIndex].Y,gLandmarks[lIndex].Z); ComboBox1Change(nil); end; procedure TAnatForm.UpdateBtnClick(Sender: TObject); begin Update(ComboBox1.ItemIndex); end; procedure TAnatForm.DeleteBtnClick(Sender: TObject); var p,i,l: integer; begin l := Length(gLandmarks); i := ComboBox1.ItemIndex; if (l < 1) or (i >= l) or (i < 0) then exit; if i < (l-1) then for p := i+1 to l-1 do gLandmarks[p-1] := gLandmarks[p]; SetLength(gLandmarks,l-1); UpdateCombo; end; initialization {$IFDEF FPC} {$I landmarks.lrs} {$ENDIF} end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/landmarks.lrs������������������������������������������������������0000664�0001750�0001750�00000003755�11450366254�020366� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ This is an automatically generated lazarus resource file } LazarusResources.Add('TAnatForm','FORMDATA',[ 'TPF0'#9'TAnatForm'#8'AnatForm'#4'Left'#3#144#1#6'Height'#2#27#3'Top'#3'^'#2#5 +'Width'#3#182#1#11'BorderStyle'#7#8'bsDialog'#7'Caption'#6#9'Landmarks'#12'C' +'lientHeight'#2#27#11'ClientWidth'#3#182#1#21'Constraints.MaxHeight'#2#27#20 +'Constraints.MaxWidth'#3#182#1#21'Constraints.MinHeight'#2#27#20'Constraints' +'.MinWidth'#3#182#1#11'Font.Height'#2#245#9'Font.Name'#6#13'MS Sans Serif'#9 +'FormStyle'#7#11'fsStayOnTop'#8'Position'#7#14'poScreenCenter'#10'LCLVersion' +#6#6'0.9.29'#0#8'TToolBar'#8'ToolBar1'#4'Left'#2#0#6'Height'#2#29#3'Top'#2#0 +#5'Width'#3#182#1#12'ButtonHeight'#2#21#7'Caption'#6#8'ToolBar1'#9'Font.Name' +#6#13'MS Sans Serif'#10'ParentFont'#8#8'TabOrder'#2#0#0#12'TSpeedButton'#7'O' +'penBtn'#4'Left'#2#1#6'Height'#2#21#3'Top'#2#2#5'Width'#2'8'#7'Caption'#6#4 +'Open'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClick'#7#12'OpenBtnClick' +#0#0#12'TSpeedButton'#7'SaveBtn'#4'Left'#2'9'#6'Height'#2#21#3'Top'#2#2#5'Wi' +'dth'#2'8'#7'Caption'#6#4'Save'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'O' +'nClick'#7#12'SaveBtnClick'#0#0#9'TComboBox'#9'ComboBox1'#4'Left'#2'q'#6'Hei' +'ght'#2#24#3'Top'#2#2#5'Width'#3#145#0#13'DropDownCount'#2#24#10'ItemHeight' +#2#16#8'OnChange'#7#15'ComboBox1Change'#5'Style'#7#14'csDropDownList'#8'TabO' +'rder'#2#0#0#0#12'TSpeedButton'#6'AddBtn'#4'Left'#3#2#1#6'Height'#2#21#3'Top' +#2#2#5'Width'#2'8'#7'Caption'#6#3'Add'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2 +#0#7'OnClick'#7#11'AddBtnClick'#0#0#12'TSpeedButton'#9'UpdateBtn'#4'Left'#3 +':'#1#6'Height'#2#21#3'Top'#2#2#5'Width'#2'8'#7'Caption'#6#6'Update'#5'Color' +#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClick'#7#14'UpdateBtnClick'#0#0#12'TSpe' +'edButton'#9'DeleteBtn'#4'Left'#3'r'#1#6'Height'#2#21#3'Top'#2#2#5'Width'#2 +'8'#7'Caption'#6#6'Delete'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClic' +'k'#7#14'DeleteBtnClick'#0#0#0#0 ]); �������������������mricron-0.20120505.1~dfsg.1.orig/landmarks.lfm������������������������������������������������������0000664�0001750�0001750�00000003666�11450366254�020345� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object AnatForm: TAnatForm Left = 400 Height = 27 Top = 606 Width = 438 BorderStyle = bsDialog Caption = 'Landmarks' ClientHeight = 27 ClientWidth = 438 Constraints.MaxHeight = 27 Constraints.MaxWidth = 438 Constraints.MinHeight = 27 Constraints.MinWidth = 438 Font.Height = -11 Font.Name = 'MS Sans Serif' FormStyle = fsStayOnTop Position = poScreenCenter LCLVersion = '0.9.29' object ToolBar1: TToolBar Left = 0 Height = 29 Top = 0 Width = 438 ButtonHeight = 21 Caption = 'ToolBar1' Font.Name = 'MS Sans Serif' ParentFont = False TabOrder = 0 object OpenBtn: TSpeedButton Left = 1 Height = 21 Top = 2 Width = 56 Caption = 'Open' Color = clBtnFace NumGlyphs = 0 OnClick = OpenBtnClick end object SaveBtn: TSpeedButton Left = 57 Height = 21 Top = 2 Width = 56 Caption = 'Save' Color = clBtnFace NumGlyphs = 0 OnClick = SaveBtnClick end object ComboBox1: TComboBox Left = 113 Height = 24 Top = 2 Width = 145 DropDownCount = 24 ItemHeight = 16 OnChange = ComboBox1Change Style = csDropDownList TabOrder = 0 end object AddBtn: TSpeedButton Left = 258 Height = 21 Top = 2 Width = 56 Caption = 'Add' Color = clBtnFace NumGlyphs = 0 OnClick = AddBtnClick end object UpdateBtn: TSpeedButton Left = 314 Height = 21 Top = 2 Width = 56 Caption = 'Update' Color = clBtnFace NumGlyphs = 0 OnClick = UpdateBtnClick end object DeleteBtn: TSpeedButton Left = 370 Height = 21 Top = 2 Width = 56 Caption = 'Delete' Color = clBtnFace NumGlyphs = 0 OnClick = DeleteBtnClick end end end ��������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/isthreaded.inc�����������������������������������������������������0000664�0001750�0001750�00000000645�11062730002�020453� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//x86-64 GTK2 crashes with progress bars //GTK2 crashes with threading {$IFDEF LCLgtk2} {$ifndef cpux86_64} {$DEFINE SHOWPROG}//SHOWPROG =ShowProgressBar {$ENDIF} {$ELSE} {$DEFINE SHOWPROG}//SHOWPROG =ShowProgressBar {$ENDIF} {$IFDEF UNIX} //Windows is always threaded {$IFDEF LCLgtk2} {$DEFINE NoThreads}//NoThreads - single threaded execution //GTK2 does not allow threading {$ENDIF} {$ENDIF} �������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/imgutil.pas��������������������������������������������������������0000664�0001750�0001750�00000005740�11425651436�020044� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit imgutil; {$H+} interface function UnscaledMean (lOverlayNum: integer): double; function ScaledMean (lOverlayNum: integer): double; procedure BatchChangeInterceptSoVOIEqualsZero; implementation uses text,nifti_hdr,nifti_hdr_view,define_types,nifti_img, nifti_img_view; function UnscaledMean (lOverlayNum: integer): double; //kVOIOverlayNum var lROIVol,lInc: integer; lROISum: double; begin //proc ShowDescript result := 0; if gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems then exit; lROIVol := 0; lROISum := 0; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then begin lROISum := lROISum + RawBGIntensity(lInc); inc(lROIVol); end; end; //for each voxel if lROIVol > 0 then result := lROISum/lROIVol; end; function ScaledMean (lOverlayNum: integer): double; begin result := UnscaledMean(lOverlayNum); result := Raw2ScaledIntensity (gMRIcroOverlay[kBGOverlayNum],result); end; procedure BatchChangeInterceptSoVOIEqualsZero; var lInc,lNumberofFiles,lMinClusterSz: integer; lZeroHdr : TNIfTIHdr; lFilename,lVOIname:string; lPref: boolean; lMean: double; begin for lInc := 1 to (knMaxOverlay-1) do FreeImgMemory(gMRIcroOverlay[lInc]); ImgForm.UpdateLayerMenu; if not OpenDialogExecute(kImgPlusVOIFilter,'Select volume of interest',false) then exit; lVOIName := HdrForm.OpenHdrDlg.FileName; if not OpenDialogExecute(kImgFilter,'Select perfusion images',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; if lNumberofFiles < 1 then exit; TextForm.MemoT.Lines.Clear; lPref := gBGImg.ResliceOnLoad; gBGImg.ResliceOnLoad := false; for lInc:= 1 to lNumberofFiles do begin lFilename := HdrForm.OpenHdrDlg.Files[lInc-1]; ImgForm.OpenAndDisplayImg(lFilename,false); ImgForm.OverlayOpenCore ( lVOIname, kVOIOverlayNum); lMean := UnscaledMean(kVOIOverlayNum); lZeroHdr := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr; if lZeroHdr.scl_slope <> 1 then TextForm.MemoT.Lines.Add(lFilename+' Scale slope is not 1, please contact Chris Rorden ') else if lMean <> 0 then begin TextForm.MemoT.Lines.Add(lFilename+kTextSep+realtostr(lMean,5)); lZeroHdr.scl_inter := lZeroHdr.scl_inter - lMean; lFilename := changefileprefix(lFilename,'z'); SaveAsVOIorNIFTIcore (lFilename, gMRIcroOverlay[kBGOverlayNum].ImgBuffer,gMRIcroOverlay[kBGOverlayNum].ImgBufferItems,gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP,1,lZeroHdr) end else TextForm.MemoT.Lines.Add(lFilename+' UNCHANGED (mean of VOI is already zero) '); //FindClustersText(gMRIcroOverlay[kBGOverlayNum], lThresh,lMinClusterSz); end;//lLoop gBGImg.ResliceOnLoad := lPref; TextForm.Show; end; end. ��������������������������������mricron-0.20120505.1~dfsg.1.orig/icons/�������������������������������������������������������������0000775�0001750�0001750�00000000000�11660470014�016762� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/icons/npm.png������������������������������������������������������0000664�0001750�0001750�00000054570�11464044024�020275� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ��юiCCPICC Profile��x…TЯkAў6nЉа"ZkВx"IYЋhEд6§bk лЖEd3Iжn6ыю&ЕЅˆфтб*оEэЁџ€z№d/J…ZE(оЋ(bЁ-ёЭnLЖЅъРЮ~ѓо7я}ovп� rв4ѕ€ф ЧRЂil|Bjќˆ�ŽЂ A4%UльN$Aƒsљ{чиz[VУ{ћwВw­šвЖš„§@рGšй*Аяq Yˆ<пЁ)Чtпуиђь9NyxСЕ+=ФY"|@5-ЮMИSЭ%г@ƒH8”ѕqR>œз‹”зinfЦШНOІЛЬюЋbЁœNіНє~NГо>Т!Т ­?FИžѕŒе?тaсЄцФ†=5єј`ЗЉј5Т_M'ЂTqй. ё˜Ў§VђJ‚p8Ъda€sZHOзLnјК‡}&зЏтwVQсygодняEкЏ0  š HPEa˜АP@†<14Вr?#Ћ“{2u$jЛtbDБA{6м=ЗQЄн<ў("q”CЕ’ќAў*ЏЩOхyљЫ\АиVї”­›šКђр;Хх™ЙзгШуsM^|•дv“WG–ЌyzМšь?ьW—1ц‚5ФsАћё-_•Ь—)ŒХуUѓъK„uZ17пŸl;=т.Я.Ежs­‰‹7V›—g§jHћюЊМ“цUљO^ѕёќgЭФcт)1&vŠч!‰—Х.ё’иKЋ т`mЧ•†)вm‘њ$е``šМѕ/]?[xНF ѕQ”ЬвT‰їТ*d4ЙoњлЧќфїŠчŸ(/lрШ™КmSqяЁeЅnsЎПб}№ЖnkЃ~8ќX<Ћ­R5Ÿ Мv‡zш)˜г––Э9R‡,Ÿ“КщЪbRЬPлCRRз%зeKГ™Ubщvи™гnЁ9BїФЇJe“њЏёА§АRљљЌRй~Nж—њoРМ§EРx‹‰��� pHYs�� �� �šœ�� �IDATxэН dзužyrЯЌНКЋКЋWT/ш tc�€ Hй”(‹Ж(Ы–FСбŒх™А-б’elЦЬиfЦŠc9b,3шаnIЖI‘ I,$Бизz­оЗЊЎН*++ЋrОяU_А.�HlTдЋx•/пЛяоsЯџŸsЯ]оЫˆхmYЫXжРВ–5АЌe ,k`YЫXжРВ–5АЌe ,k`YЫXжРВ–5АЌПЪШ§Јм@[[[ЌXБЂБnнКп, ЛњњњцFLOOGOOO<ћьГБИȘŸŸŸ?711ёЧџїГГГ?Oн‡^UџvОw]87ЭчФEзеUыЂя%X Pъььќ[з\sЭj@§пW­ZЕX­VcхЪ•E?{іlдjЕ8wю\@Š№šпчццbff&Ž?ŒJЅђЏжЌYѓVЋU^П~§ьЁC‡~ЉZЋн(В#УУЯ@”O>їмsO\@њШ_ Ф_U‰є\wнu…чŸ~УЦџЯ={іДwttмРq‹Х а\.;wюŒ^x!ОёoФ 7м !ДќЌЪЧŽ‹ўўўˆЉЉЉ(оыѕfГ™ЃR.GЉ •JД8>|јАyФЛф кўSЇNUё /LNNў„њIМШяОJŸ?t_пэјб›oНЕkБйќЭіЮЮѕM@Люкk ]]]qђфЩРнgж}цЬ™�œиВeKійоолЖmЫЎIŒ2`ž?>ЦЧЧ�3`EъЪ+ЏЬЎщюЛџўЈ’nЯШHєqэдM7ХB>O>ёDF рYўћїяoя?ЫчѓG№>yђЭу=Ю‘Я=?l xЗ@9.n_зяиБу3ы7lИ} Vм‹ћ>ѓѕЏЧ†;яЄ…юŠ—Аr]љТТBtwwg�ѕіі€dж|єшбРCФ{пћо,MЉTЪ,+ЮМ…V/ъѕzxŸб;L3œЂљињф“БДУ—\гЦk’Аm6bll,F ŠФГi‘dx˜EЪЙ“ч{сЅ—^:й~‰zН›IQ|—з"ЛђъЋЏММwuлЬОC‡w^sеЕЗbq^x>ZЭХиŠлnb/Ќ_ ЕэO№wœ$6mкДх(’€Ж=#„ŸюZАd00\НzuF›t—L9МЪЁт2Hqzћі ƒь› c ѓ}Я{о›7oЮH!™$фЪt~а€дsƒƒƒ’тяќSт•#O?§єBзsя}П,Ц;х’Х�р—ЏМrЯэнНWŸ8еш_;]l˜щЁžўЈœ:—w<Еж,q&&hП? €6Ф��крЁрLщZН€ Х@мКukž,јZ­Эmzцд‚Э…ЛИ <У7}4ЮœŽэ?ђžЬ;LNL“~1KЇеŽŽfMаЎ]ЛВfGтНюnЦю67ІЅЩаk< Aў=ЄјHВ%|ќ+Мƒ2\щЅ[Пљц~МжеЛuvЄ­}§јћтЙыЃgvEtMuХšЖЭQj>ЅЙƒq._Šџ�Р—нrK\Е{wlB0%ЎY7­ЅЙk}HFћ‚a рu­пДE€<чuПЛ7p§ ­Х=x&жЭєЦЁf)*ХщІВf'yЩц§z d—Sя"б<ж3™FO#Aљ>@уn<ФЯсmN‘fнЯПƒњЯŠ~ЧА}ћІOmоrу5їmŽЕ'уЖИ+.›ш•љ6\ъ\ЬчЯс/ЯЧб˜Š“…гqп–Mqе]wХ.мrjїфЕ:]ѓ№№pќ‹/ОЈ;Кˆq§ѕзЧеW_Йh-7‘Тvп{uћКlлt7t››ЋЧY�\wєŠШлУ]чЂН­иЧ3з/ ‚ЋхћiоoЙZМЛ1†Э’ж/Ym&ќNмбЭ}? ‘Ў:}њєPмХБOVўлљя‰V­ъќGЃухя~tGќTiw\йЕ"*“3Qh+њгm мфŸˆ“kзЦTїŽ8ђDgЌОlglІ}зzUЖ–ю.ˆРcпО}™•пDє~йe—ežAЫ­^Ы5ch0XdЈљ˜ЮЭ ЎX(FГкˆжьBь^™чцЂœяЪ<…€ъњоцDPS“"Ш’K™R3 WБ;)Iєл!АDƒ|„ШŸф‘Gў%Єјкл њХeНэиИОџWV­йѓ['OоЗTЏŠшН67еZ{фKtеZC…БhхЊ‘Лl{tvwФ3OЭХGК{‚€!sУ{їю#GŽМмџWй‚}ЧwН‡`$0Сž‚mЛ–.vф%cКj=‡ї'o" T.Wˆ="rѓ'ЃжV‹юЖюИтŠ+т™gžЩˆ&anМёЦЌг›ПхЄц%х'9$ c'NœШˆfяУИ„хnКГwsў мїIšЉЧ�g)ИЅЗ№јm#�‘ѓеггуYЎє­Л.n­эŽ‹ЅXйVŒrБŒТѓБX`єužЖИwUœXEР(ЃŽ]€ЊлM@jeЖП*лі?)йѓZЅ-ИКb-еXСMЫ4 "`‚hЯABИЅs‚єє6ЮЧhkЧ{2nў Bee[ЦЃ‹бsZwЪЧfХя’OB)Їо!ЩІL6;оЋЧЁЛњA љ ƒXŸ&ІјћПmллA€*]ІO•J…+Wњ&'оЗ–ЗЦЦ‰zДхŠQikGрЪEњњѕуажžˆ-;"‡UИUёbjm—^zi\B=mZА ^ВмrfЭоыwь5­Юvйя‚т9w ф.шЖщІёxjКЇОнЙJFPС4НрI„4as#йДn Љм%ЅФ№>Ыt—�ояfѓГ–&Ю еkƒt H? БJШўЫ$‘…oyЗё­&@ WћyРК}ff2кЪ=­-‹—фЕшЉЃЛд%,БјѕжёxtєObЂї†hЧ=жЏЧJСныКU\В`­иc-xZЎжnp(HЁ…:цЏЕ Њ ^УMТ jЅnоcoРЎЃФ1ЏОч+Гx*И нМ{яН7+Ы@Ў `ЛЄц#ЬKљŒ9,гkЦ zIр=’L"ZЗxР Ћ„XO3ѓп’Яп"˜ЄYћШфштT&ш[№я­$@‘Ёж{hчоЇѕMЬЬХъЦњм-еŽшШwDgЁнХЖЈфЕиёТљO œ‰ЈвюЮ“~аNАмTœљш:Е>­[%Ћ№dUЮњЙILmЛ›CХо+шЖЧїнw_ІM‹чДDc ѓ*ф�A[™цЁ^ЉF/hЧJ6ФS6'š”)Щ"!є"’ЯЭяЦ&€ЪІЌ’dТ:i§z•ГЉ2е.ШаIўBмЫї“‡Г“oњіVu;‰v?wЫ-ЗмЎ5ЕwЙŸМ*nšО-ЖжњcCЉ=њ*]QЂ}ˆй:у№ЅoF[Сщ[XЮqsN~ ьP-Y…вuЪ€`7САЈѕ тFЕ*wƒ;Ы6ъзњЕ:Сађ<я @™V‚Œ@њщ(е*ЌИ їО’nd•6мrДрD8‰Ђ<nбќНпЭ&Kp%ƒљI2wЯ{Ю2ЭGђјЉЧ’ДстиA’‘я&ђј%в4 єCYoтПЗ„�XЪG˜Нћ•йй}6VЏ_л'6ФЎгЋbюОГ\Ѕ[U`Ъu$ъsчЂЋѓЩшЌ gч;QjЪo`5{Ql ЅЋЈфЎUВ К.[0ЕtнЌ Јh­JptС‚+x*Yђ‚]EA№Лё„љ;o Рц7‡Љ0™Д,XТшELk'Ѓ^91‘Aљ”'‘) <љ]-CY§ю=жХf"ЩЎ\ІsзУX$.вŒОЯз yљњ›ˆМШЃд/Ў^НЊыфЩs1>Г2кOозN]…|LЦ"ж"(ѕњ,€ucСLмљh+5ЃŠRZTzž4ёЙO ВьОie*MЋRqC\3ј =€жeћЋ’m&_Oa;Ћ5y^Ob~Ѓ’UЅыўэт™ŸЃx9ЪђGњX7ю§–cI -GBoH›IЈ|Ъыю–к~яIѕ№SBйањНЯtжЯMЙ$†Лi!ёœ{�н qyЩ§˜№иоtьќc*љд#f›kcюЉ›уЮЙMБn_ŸйхY9Ћр ŠХvХЩ&_Ќў,Fg8nB Ѓ;WБ‘ЊЕRUIЙ&РСЫpZиHн Ящ_л_Gцє(Z˜оТ�M%ƒЭ‚mБ6vХ|кђ%‚$Йрž3Й$ŒVo™zЩd/@В*ŸоЧ|SзUiй^зƒАЮ!ЋƒђHNхЖNъ'}—tМx‚эО“4ќ�ИП|ы›J�”ѕ‰њџййЩxђЉЮш;{k|(пыs|Е4ы–Е™Œ€ЪьZЕFEWЂШЃX—]ЖГaи7‹rІиЧjхj%№Жщ*м€Щswп}w\~љх˜*J€эЖлnЫ†T Е2ЫTЉZЋ–'БTЌ^Тц@r™Чрр`щkБfЙоч§У'AжЃшД|IeЩ‘М‚^Jb}ѓ›пЬ`zA—4’YR ДхЊяз3)ЋёЛ2˜?^ІE™ ѕнШУэ“Ш:њ2šпЧС›F�Цоџ ілU(bew-Ж ?јнБЁmJъ_‹г}Ж[йЇ йФ3Ьtb)'уќЬу14>чАšY€™vŠЉ0;-IЗЎВДdћк‚Ѕ’мUА]4гЊЕ$-ЫkЪІR$‘зэЋ\=ˆЛїK.A`С фwЫєг:И žЄ№Sob^ŽQxlyЪЉзА™2НВћ]’љ)9”#-`‘l–'$Їy'r †œѕАОlwр•~†4—@„Џђнqƒ7МН)@)џСžпжвьjэ\Н;ЎoуђЦКhŸыЅ]_ЁёGsрЈИ)[ЙrЉЙ<V>>Г3'WЛИ-fZе˜]иMH0BЫqФQ?Ќ+WQКqЫR*G…Й'@<ЇђUЎJжBM№uУz=€KЪМ&ШZš2 €ЛЂщ-CЬл|“70AїЛ`ЛI:ЯыТ•G"І]‹v“\цey’кћ­‹^Ы‰+I(9R/FYЎїй )ЃчМ‡|кHyм„ўŸњЂ­7Ж§Ру�XаЏ`5ПЅИ>5kї Цѕня‰ њ3ХгLБ67W˜–О \t‘ЪLNMG>ЧdK™‰ ШвlѕD‘Ђі2sћљzly,&жЎ‹љРш-tО ”JВ}Ђ‚TЊпU˜юиѓZЛЪдrНюю&h‚Ÿ,ЬsчІаsиІ{нДСќ$И '"xNYЬзД ОэО2­›РъђаrМf3e~~їО'Y‰фBПы\9Rў’Iђ*—žЯІHйhFn#X§2ХмХў†F`€лџнСССUVPсіюн?ЕђƒБ:а�дœ_šЈQ9YePТжU и�o–ЪNGsq$JэИві5QmлУзGОyЁaЦЎК&zAЅЉTwmž–mў*Юы~&TИю^З,�ZОж-јоЇеz^вxŸ€ Ў�Jѓ|­жkцozЯ›^в=Ъc~юl>в{г9‰тБч§@Џk@цk|`М мжЭцKяeо’\™gŒ_<і>di‘я uјъїчo„? ^џuїюн7h1uL ѕХРићуf‚ЙmЈНЃ= єљ­ЄJ3шY ЂЕjжн[\ЬQй“Є§ƒhя>ЅŽV”+=БЂ(ЅБиx4VЬ6ЂЪŠœQЌVШuiтF%Њ@•-`ЩšTЄЪJ` КM‡чпvX D ГЭаbrЕ‚Єћ– jZѓuЗLѓд•›^yм!”+K™Юн4оя}цЇъGЛ+›їщсlТ$КГЎnЛ `JNтŽœЭїm"яшјЩ,Сыјї§€ж<ь&]sйЮПЙ7TэьˆгУcБјдUёГmƒБРЫTHх%ЖЋhлћЉ)њимПиТš�ПЙx:ІsŸŽbO•Пšs}13^Со({БИ3жДnŠТp9šЧŒ…2їєвžЃ@ѓhлu•e€(*еk (ћђ*OхJ�A3ј“И*кя*гєZ”›dH ЈdѓГІБLw­_‹u7oСuKфQ&<ѓwKї{ЌŒHWЏ…+‡РІO­пђ%ЩSO=•­ ’0y"eБl e§ї Џ›Шћ>taP•aeyпmћ~b� {w_џ—7вu}ќбшœ™ˆЕ#—ЧЭ51иMПžИ]Aн2k`�(—ЫgЊт2A€ZЅ—I ?БžBЌЩџ7QiЎЬf{Лqу­zœЌ>mиЇ&bещoФЁ:ЎїЊБХkЉ*GЅЉX•ЌаmлўЋ,-W�TЄ šFЋL],DiЩ“юUЁцЋќGK—‹YyВІЙз}�YчљД,u Сћ,Яs6ZЕ:рdЩI?’вnЅ@Jї”жv^$Ќ2Ѕо7гЅu5ž„оX?uМŸяЗaЎ/јžлїуЌЬ/оpуXq|(6?{26Ÿџpl™Є_\f‘f ХQgљЌ„ТЁѕ=?sTlnŽ@ЈСЪ”ЫмџlљйhжЎŒОЦ–шФѕW2Хг–в=Ќцh/gŠУ;`њb#ДrБKUvЗЬ_E' ˆыZ ЛK lp% ЪЃ"ЭC2ЈtѓPщ*QыЬ[‹–Гc/3ASRЗЉРг,LГщХчЂћаОшŸ`ЪzнšШѕЌˆ\6Oeїщ–%•Mr˜ПфwїЛВ(ЛeшцН.lЂ’|~їК–ю}ЪчЎч№~ ЋиДJ ›:ф/CМRяOƒўїь~? У†uџ,АњоЧХЮюGЅ5ѓsгT–Иš]ІЅЖ*‡ѓy–WеЯ р'ž +П’е>‡cbё>МЈЦLѓЅшžЛ•І€ДE=ƒєrX^LЧцЪŸ*Цљ[пy”PЅЛФ2Њ,ryЖ•@ф пЕз^›Y›ŠqSЉ*Y+зMы9И*R‹TЩ*WХ;kgкфŠ№\'точГ*<`˜5?И<П‰Ў,гзЕй7skG™юйaїužcаыидhЉ–eЙ~*ЏзИ~w“ Жљz =†ЮєжQRлTxŸЧ’ио€ч$ˆѕєXO%™™MdГќ(џч,ѓяђя z€kккКж~ЖTиБНЃГ;ЧЉ`юы4EФпѕЦюp%BфPbЋ‰@gуєЉ_‹Bщ1ж:ЭХ\сxмзtЗ3(SоEƒyuД7"?GџИd;KГEЗpvёXDy˜ЧДNDaєTЬіѕG§џеt…Д­ЪЖпMзчpЊŠtЂGEЈl9„GаО–-АЌRM#сTš`ЄxТc=УJ:]==“ c7EЅБ; ѓЛЂИxmДUnŒjЧ-Ф;7Г|ŒŸ‘/qЫ–­xЗљшЇЇсXC ў”[№,;зВ]”Эr%€ђ{Oц=ЉŸфд“X?ѓpх3‡ž%ŽоЦ ­ToяЁМKџYˆЦwмо юќщ+КќWЯ5ЖЧ†ЦЎИlЇoуa2тоpчh'ы(Д‹}EјЯRiF+ЛpcXўсцsБКЃkKЗFWёюшЫЏЁэЇK…РГГcTf"'cjёБџ/гфЃEPйЂ-ьТЗQy•Ј2­Є 9ˆтѓ€*РС"•уy•i�%јœ$ЅЋШКЧ*к{<жтД,-mDї}`ol<А>Кj~GДWЖF[ustw BІфЈ’/•РнђТў˜ыЅ)ь'ЈeЕ“фLх1o=ЄS~eHVnyZБ^HЏ!Щ[yЏ ыцm*ЌїJdхжтSыiѓp!џ^ђПCљ џ›‚7аьnџљкжџЅ­}0ЗOЦ]5s,ДЧФ<эш"–_{1:™дЩгѓLЦеkїБмf”gЌkё�1Рdc&ЎшlgVvЊxŠdm^™'vKД}ЌšoŒQ™бЃн/їПРН•hˆ`z w8‹EЗ.(RЉ4Н�OнdmЁ%Iq‚/)lk9tѓšЄQa*^РUTвђl.<їФуЧ6�йzт`Ќ.џXQЄџТЅЎ=Upх6oV'qš09o‰ќТІxьi<OзDмrгьЫ)€Щ’%€ВЂчбMЙ”зДZЙщ$ЇЧЪш5 тR2e7НфвЋщх\эlгр=ъЕ№Зб<р]d…Мъпы&РпUлRын0c|Кˆ[Ю­ ЊsААIАжVx1ЊMЦрІPЦ“їЕX Ј!˜{‚Rч6Ф]—ФF*г–ћ�Ћ‚ЖDЛэ!]C-sž#< ь8ЃQЎѕв`ЁЃ$зЮ3UЛРФЯ,iЯdЩјdщ’@цЋ ѓ2№сЂљЌ€ wТШkКM?Д6Јu&ХwaЕЧAЌœ‹ЫщЉЌЎђ iЩ9|ž=DeцщP†­[д№щб€ѕ&ў‰-БЎяlЬ­š†HŒu IЅМКxнНФехK�ЩІЬ‚щюyїœї*w"ŒƒYРtЪъЎмЪяqЊы‡?ќсЬ›€uNbPяЦуњ;mЏ‡�№;Z”N}ќ}ЙёјкgŒaUke,&FлС•ЇaŒщ…}1=цr(žЄaЅoхџQЋHћеПPћЛБЕВ-:r4 ‡P`–мЏež6лДоXећёЈžd(ј‹БШФRыeژЇВz]ƒ+œC™ЮУЋH™oeUЖркўk \чњuБzЏoЂIQЁ*\% NR|YЅBŽŽ<kўыЋivvл3а`–щв‚tЖn!З8dќUŽjвЂЧŽйЏFџ`5цЋ žFpŒYtЭZЎDЕLЕ9sГ|хsvгѓЦk~*WђXZПїjх_љѕ\ЫцЦ{ї@ъB#!>XOGГ‚^ѕяѕ uEќшц;k—­!бЧЂ§NЂй*+jіђ8жгkЃ #Gš,ХТCX'oTўh%SgіФO?;кЗаMdэ?ŒЯSЁ9иНЄ|4ГsГ1Ю}х+zJЋИЦЂ‘ќ!†МˆХ1ТЧ&ўФ2FаŠ кщNŽчQw*зЪZёСССLyКW•—”b“ вєW]uUvŸVу}ІбВH+рЙФЭ3 _wоЮƒ"ГЭљ˜a=ƒƒY•ВЫМщ­VYšЬu,дg�ы0х9V6žŽ‰{ˆ!˜м™ФЃЂŽ(›z,лrЫHВl­=.q=іœb:eГаƒxMвшA$ŠёиrЌЃїH8ѕIўoКˆзП ћьыы!@\›fgлMыЧFiSБLиД '`#*Б/ŠЂЇЉи0г>мЏrŸŽkђНБЛw'‹@GZцјиxІШl-�=-*ѓ€р_kБР0№%4к?гЭGЃБ№еЈхЉ.Н�иНXћ№ƒЦ0ПEЋŽŽUhrЋz7ЅђXЫWљZОT"ŒŠ”,юЪ7BКюПйЖ 'E�›џ:u~? _иZ€ьцgОЦ$ѕYh9{Ѕ}…|Oб+ Ы6?/вЅмXЧ!kВVAВ<HѓHч$‚ж,јzƒАiДtuф€у6]о/)”ХzЛyЮzйМ™—MЄЛbќ <‘Ср+ЖзьмWЌпвОч?їtЌŽЉќŸDkўTT/пЌPЬ‚Ќ ИЌ>і„twгэ={*жіЌ=‹7Ці2]!„RXAШи!dnБф"Lц ŽŒeŒwІ.З”я‰|kСю?w r †`ax ŸBAЇЈИ§і›oО9sЋ*P�гž&sTŽЛжЄ2uЃ’EХЙ)WХ&B:йЗŠЎмЉX=ХbеТR9КWfкšСМA.чгФ<?0Я№ѓ+…g‡Х-#(ПГщ�`= GK@ёJ’Tpl$Јђ(—њ(uЃ‡D‰švя‘$К~e•Ј…zуѓ n™N9/ё=ЏN.4!_#Пof‰.њїš`ЈєбеЛZ+ЃОp,ЪЋЦЂyнћЂ†ѕ4Бt+2їУБЎIс,ИFж87Ьо;КЖгж3ЖЮЕ3 Јt+ф–gEыW‰ЭvuВр†щa—‚U+ Хz‚-šа,tr_™>o?ь>„kuХpкЬWЫвкTЊВ(“Ѓ†oйZ‘ŠSn%‹ŠїšнIћгЪуxC}фщ'‰ž`„ђ.юsM"жЫ”wƒбЬ\юpŒ-МS­ЧЃ­—y6b %–Вёnže\G9”#є:Ъ"(@KleQf]ЗM™@&љo$Іnмt’6Еїц#)Ьw=H–AHцЇuГ^ц#бќN> жэелk 3џzEчхЬдэ‹ЉM[#ЧјПQИJR pVNр//2JјžŽ›cwщК{Ьяг~3\Њ"L+0d%\+АдІ.-Ќ0Џ›З[Г ` F�š/2ш1O_ЅЌЅr)+k?ѕЭ�ЈLВн=v~š—ŠT)ŽНf;щЊжэšV VN7Ф9ЙчМФhфчЩїCx,‡`ЯCЪ}Ш§$мS1JžчКvХо.т Жц7oˆО—D26lЉs’)е[В АжЌѕЛЛ)‹$z0wѕf“хЇЛr{ŸŸŽ­SоъBВ['ы* 85*š„яј(њї&Р­QЌ?RЎкQhѕХ˜žŸ‹}Dрu*ІВ-ШBtGvУdœЅœМ—а@Д†�� �IDATхжгЛy‰cћ їцщ:Ё„VэŠ ™kъsKUЈtwѓ”хГЌю`†qi#�Ъ3ОиХyЦpУђкFŸ‡,‡ј<D3АuрєЪb~n’Lцkх*IЋГŒD гЋ4{O <ЇејDP“Бѕ…CЃ5їЅ “ЦЊ-юџ"iІёNmЊ3†ѓзФъЦƒС}эCqыЅ№вW‘GBЛщ4ѓWOжUАЕh=ЉeЊOeU7шwG�эѕtъѓKрф%Ќ‡ч є,цŸ RВKЛН<ЧјыˆёyіWИяьшиіѓ§kк~aЧто8бv$žыg(•'e’‚дBdЌJЕ№g_|!ІŸыЇюˆоЮЭD§ДНИzŸАѕг{*ЬщOГ(Гў /@7СŸ™ўж" Вg#J`Є­UЄ§-Œ@2_ШЇ �рюГeЭ@DG %˜rљЉUшn}ŒVЇŒvЕиz$%%WЉB_Оh €еs№cz8иzš€p‚Б чѕ)ЋТ‚’ТхqІЕ;іЭб4жЃПЯч§– Ыqw$I),[ЂJA”€Ъ+Y§”ШЮ, Оq‰›uвSI,IтqЊЋВ{ЮkŽfв$xЮ:уyz№Оd<ЫшТПяI€]—]~Чжmяzј‰(_Н;жmиHх–њлКI+ЁыђXVўбџqЁ№бжl\R›СТ–ebH!dМЌє*$RШњlЧТщ йСЦ`~ЎЮ˜<KЫ$„пчQш3№вСƒУƒt ]hr†…"ИZђ[GЙ#ИР GМB зŒТ)SхыЁTЈх ‚ŸnЪф&и*P�$qВгyОi€Ц<{•ђrѕŒXЮpгК�aљ<qOk}œ‹+у�не\nœfё8JwOзп–•Ћ~_АŒŒ2xM`ZoЊ—rзЊѕLъWmІєzН™ЋФMЦ'$ŠЏgБ'`Y’ЩќљОŠыf™iћNШlŽ~ђп!“Oчn_Г>.MЎЩГ*MжšБЛЬНчž{т�B}ИXˆЌјqкЪŸ@XЂvH2eЂP “Й}šI01ЩГ€(=ГJЕ{eZЏЕЕгоБd|R`!ЫгЬЮцђ ;/ючЙ}оТдrŠй эTxd)hVpщx%+-ˆцЉ›Д(Y Tщ–Ў{ЮtnZЅчk\ŸумФ™@Žђ№љ(ATЩ" ъ€ЉMƒvХCР'™ќ:Щ„иъ>_Ујh k}ЩЅg@]ЭЭ<”A™*m‚Ўьъ9Ћ<Іqб‡=о7“y^‰Є^%КmН^У&Хњ7x]9НЯ<ˆ;ўпTŽŸп‰�я‡‰Іћ№ИL™Љ’l—LСв х+_љJLc)лPмЧ:Щыј(…nІ@Ÿк#цсi;GЯgBЙА@7а@ЇˆpZ‹пѓ…oЙK+ыгђ<ѓИ^ЅЫXХэцpУ žђ‰RИпŠvЯ7y”›’Љ‰(;-АH~эДЋ"TЌmЂ�ЛыaTœѕб#%зЊB­Ћ2,J ђ:ЏЇРВжPžѕМђ4›ЗGsnK№.Уx†y­7ЫЖiŽј8Йz,Н–.ѕ”ДNС5AQI  Ъ“zW t?•ЩOхwšнгv—w™ИРŠ‰ѕД^‰Xц-†ŸxТaHђЛЈu)@њ.ШГxт“є•wыBT„[i3Бm1S­@wєеЏ~№�сўnЅзP‘|СљяЭй=0š™uй7nЎ­#Ћh `ЅH@8>с’ІiвB�&WŒrxзўIGкшxѓМўX0’РЄ"€!!+†ѓyf#ŠnXdˆ–‡?'yЇРыњЯђДЯаЈзРњVg S•_Ђ$…ыT” ЋtЕЎжQ…%(ЇУж3Ъak4'+ДиL~ЛЋУXСА4ѓ"нћЃ{7я=hsN"АB‡y—˜І~Оё‡жЉзМ`ПЋOюИаЭA Ny<Џ,’u%ЦИŠ`БŸkн7(Ќ…Œv‰Э[H�qвC[W7<а*ЎƒщѕЗпюp!з ЈO‘АE3'ѓ,8  ХыЪЬ\WdЛІPл˜qЛœJє1cV`ŒМ1пK[l”ЬŒ^“іХкЎ•Ю3 Їк$ЬЮ'?—Gѓ&/YъЬЮ€e=3oКоЉёсhЇ‰i+m”ЕLУвІš.пРTэЕєnŒUcЛЂ0yu”Ya4q‹` „Е EњцЎ#T9n*\‹ѓS}лЖњЉв“В­Ї—ˆuњл9мldЊЂt‰‘cR,bŠdюtФёѓ_ЁЬ.8Љ‘,=Ud~ъIшIЕ~ѕ™d0Нƒi\CаQч ЇЛэ|ДЦЪ.5юЏA–-ф7)лкіqzѓаk+Л›љyь}]œ йN№Ї\vвцл @ЂПИюњызA€œ€)€lr7йhЦВеБu+ВV_К™ЙzњЕ]Є™›сеl<ыW­.тІDšуa<+•�]їхŽ(ж'ЩkŠЯGКПŒ‘™s1б$pjЕG7žЂMBх+ ;LёЂ‰ SбљТ ќС�мЩљK РМ[€Ј—ЕиѓrЌž™ŒТо“13џУКд& €BtН*FpР‚aъГ…ЩтЌ›uАH2CPъ’v?y™ѕ љѕF{сh&ŽЁ>”ЃчбгимЅИУђгІаiTnыиЁЛЭћю‹"нПГШеЮМA7^AYгfЏD 0  - ŸфЖN–g~’ЭzшННЯВ=Oy+СюwјžНэлb�@џ{[7o^уМ#qFаК|з’­Œ{ъЧ^нu™�mиYœ XŠ СZщЎyˆ.Ÿ§gк'оКT(е6\ыиМыпў8:КNEŽAЃxыйхЙ‡Y>Ўu'ЈpюЯуt"‹BgЬ,є0WАš�ŒЇnrL-HЈЈ=ˆZЕіЅ­СBг!КОGю‹Щ•X$–ДdЙZявГwvc ЬДNWyО*S6uжъ&qŒaз6н.Э…V[тў $m-:0†мљЃлщ№c'т˜M…љйœ$oуБ€”ЭŽРkPюъз(‰oђ§�ЯJЮ™^yйИФg.&Йц3”Ц�ž—Јт#‘§юњ@?н$И=› ˆаKyсљo#РU7м№пэ(зKœЁтнTТ1l•`%мФІ@ИЧБѕмVž)WWЬGYѓМѕЋ^.ВИуtLеКpGeКpЅ~œ?^bжЕјМўužWЈє<‹LŸX™ћzKDшtЌ<аlbaєJЅ•”ь шIЬ@ >'XF6>щBSF‰*4Й–УбЌяЇ'Q­:ќЫ:~šДOŸŽЧ‹БuЌЙGQ‚`=єl*ЮcQбКl%„ д}6ПH“з HО-ФAЂ$hуzŽnl>ч (І‡‰k:0œєFъ(л T`Е@uІ7№Л.]lЃ-ЯkОzЦv<OйГДхg)cpћ8–ЄІObц5И6ŒКDJX­^УtKН яK†ы9ШPdlфг$q0ў•›`ж(xmсJЫхXЕ§K 1JU)ZOе.во=IПtЯЎ8<&НesLМџ§qіŠ=БŸЪЭTŽzщ~жмЯcпџ‘q§'b†ўrt№жTŽГмћЅ^р€2gй+U,З‡5Л]й‹ЫЏ|Qџ GxДХЙ ш<н+XO8EмZрй>@Д WŠ‹еъaЦў ]ЬЧЃsd<Ю?Хюo…Мћв=KСрW%Jzw=aK№QЄЃdЬрO!цИo†kі�x+.g )C‹ѓgG#бъ-Cp$@ђ™gсК^РрM}*‡ФJ2Йф\аM+ˆЉ9Б ЖЭїœ›0`›‡c~J<Н•žШэB,ЗƒУПЦЮ ЫЋ6ЇtЧЉPЈы1SYjaВаяїпІ ЩbЦ]]э1<:GЮфbэQ\бvкlњмMFрц|�ДЦќ5Aиж™_рЁЯŠХЪGЃQo‹Ѓ_ˆgyаsš;АЂЗrІhћv@Д6іTЉ…цqф№Бoт‚`ˆ № ! rŒ”pћ9ЎщМЧ.X.Чдl™5‰|ч%№ЋІ'убЯ?{ыљиЕ{kїз–VуЊ$­ѕ*ЯІ@P\џ?ƒ,ОИЂ�љKF ‹!}…sЎI(№ ўYѓRрћ(эЖоE \,xц›šПkЩz *щкД’EнjpцуfZc2{ŽQ(›2[†ю]Вyр њ—6с^7ЖБl‰Bя;š‰й›Ÿћ6(Tg?ѓ,Zˆ`ы><і!]˜/,4pхнœлэ;bwћ1yњ/ЃqxДъ0ф•uчЈ@ ђ€clњй86ѓp _ПН[ЎЩ,ЋEЪ9OsrђЁ‡X8Š;eЗТМ,zfv(Z5оB€еЂэХфщ0кЦЊЁ…­ЫA)Šтr]”И…\†WxMрH}Ў™Єыz№Щр=уБ…€+ы™PW•юІн%ЄЗ)PуXд цx(Г€Е6>џљ(k}Ш–зћ№щbxз<A=ІIГ’И)ЎЙЋGЩ&)W№%чl єЌn‚)x^wWз*аtгГІйч/МWйНЯыCєT|p4m‚ЎчЖМ[oН5#5Я sЯя›ц1�m§/ьиЖэу�НkzYїЄлаEЩ$›ЛіЉemžіoе*зББ*h˜ЉKкј>”бsцkбsŽ™-њєmИЬ"hахѓmмЃ<?pЈХ›>oК$њЖэ`…-9”Ёв+(…Ьb хЯr~ ЅL рs(dЎРX{Чf&a‰sёу“˜‡љ=ЌВ€•ф&Аt—S9хыsk›Е…9Іi 34oЕ8т^"?чіuБ–Ћ’3…�„$wwю@хzм†,+БЊ•шФ–хZ ]шfАфqvѓѓwЮ№9ЧљEђЪsŸA›mМ�ЋGС6hЉ<u­~m~ НG‹•Є‰4v ћ‘Љ` jУ$З/>Ъ+Y$ЎфГ[ыЪhŸ<ТƒЗ˜XЪБ„ўЙіYВb§Ђ nкДiг;ZЦ€xійŽŽ{+œЎФŒ}ГlЖR.Ž˜­ЦёQfЖJ+bн"KЄчзDЙwV&p НђТЈiом˜!В%`{aїБnлЅбqнŠa%­š‰ ЌmŽ(і$Vpeœd~`hs<ТrєНXџгЭSёЃ‹УљЯђ� žЁВ— Цк}MьJф>Œчqъ”>5ВД,*бj,$Žod’шф^ƒЗ|•mљж]ЫбЊtЛі‚Vк4з6,вН:‹NЦ ік]•!R/Š�”–Чsœхž3ў ‹Lѕ�n&мtя‚fscЛЎе{Mг№гOIъ9Ќц‘ЩXdYъؘ‚WѓR‡6кI0ŸŠВ^‚Пј§ <+œЏ �7п >р гT�Є”!N$“>ЫУК-пїэ(”Т3ŠOиУhн@lІm^Яђ№щYК-A qЯЧАh ]ќ1”јС˜ич/eюКsi’Ca­И ߘNžЮъЁЉ€eq%рћp•ЕoхОшОЄƒ{№Sћch/ЕцЅ—@ix5Ђћщ(ЙЯtB"фiJРы!j3У(оѓњЃ‰зššœЪ”“&\$€J—�Кh•ЋђьO ~КОШuч)ИзU€бMШ~wРЊьэф3ЬШщ3Щ6kirє&ŸР—žS—Ў4№ЖЫєšЭz‘�YР‰ У7ЇВѓzхUnяsWnС7о0PO#ў]<ЫЫK„_A�„;E�ё“Œ4u•™елˆ№˜YцЅG>ї8: ј*Х а_и№uЏЋPX•GАŽ5ЂПаЛХMNв/іАDŒQСтFИш—ђ,@ЕауŒќuшš—AЋ‘y Рц ЬYмсдјH\Б+WэaH—Kе2юyŽWЕзiO{yc|šUЪ'|žGЫxП…fІЦ žfo,рrМ ђЉЋzb N—WБЏ‹@o„5Ž(.YЪSй~f2PОЪ•ЄBя'ё1гhђ<B2wЁьNЌO‚HУ YUAЃ�ь‚�ЎW0xГЎКfыщБЎпzЇёЫW&u­Qи$(‹2њ9‰8•KЛсzѓ1т7ЯдЋP^1JMœёЋЃПDо// Л8ФїЦ™œІыK0В“ W @ŽЪ>‰Рv8v_ Б@ƒЛЊщ2‹Ќc;оkХmд™9„­ДЙч&Цc€eamєкUэїь<УгNћZ ѓВ*ZиNZYY,ЮB:§zтИ?їv”ыiМ6Ыx‚AЮrі­рUk+Бю­#S‹ЙмUbш$+‰ќzœc†БЃgWlоЩЂіЮЈŸXъЪЊ0нІЎїт Pyм”Q€мG%ЛРе^ЫyРэЦ8‹wИи•Тйи�iеЯВиCpeб6<€Е›@ъЂ­ƒЫКkБћ)р’УяЈ<žГ‰№Лщ%ЁКбmN’G‘�ЩˆдŸр[/гКыйЉгR0“/|њ‘™7д.!ЪЌAСѓрў<ьоУ@ХvЦќ-(se(ЎФэчЮЂ˜Еёој3x".уцqЏмрuЈ`!Lчњрx‹ Ÿй21УŒ‘œŽr{)SЎГ2Ц‰Й–сБЛ§Z­"Е“ZЄ•дJT’"#:m(гk“ШцлХ(Ў‘ŸƒWу(­рњ FЕ ]ПдЪlялВZy<чЎжBЕrгЈаЂхC‚ц—О”_е(и—ВѕЈNš†kOрСЖЃdягЕK.ЫU~›Te‘€‚+ръ#ЩЇж[н˜оћuэІ7ѕф=КyW{Ъьšх•^Ѓ™=Aк?ПѓW ;ƒ#бЎмrŒs€§ ТS‘k7mЪњžZƒ]$зё;4ъŠоZхxєузqЮнГYољŸ_ ЋВШœ8dШ–†/LŒХклxVЎ5�јKн#Сд Ј -ЬM%h)VTЏ`Й’Aх ‚@[9•уЛ€f�щ@к{PžWЁ‚Щda6бbЌсfОцe™6A>}tЬлєИ*[ЅkU*Zхкї–pЋHY3ЦЭЄ–ю’чЫфcГхђ‹ЄЩйЋAfлqѓTЛsОrоябњ&й42Ы@eJбAЙ”[љ%Іi­ЏКщ>елOyЌ— ­#`‡й-(3ј‹=€eЛ`рз:єГлЉ@ЮS‰ЏsоZ ЌД ыјј•шпћBtцx%zюVКlŒАвgŽhпЇfJ ЧОy”‰<˜ќs(†yoЯƒќКЦхStۘUЃ,ѓ3_+—ayЩR)TTRŠз­œп%‰Vl^*кє’4)]ЂИIяS–#NU\0A>g ut7­о@%'2ЅШZ9tЉцSХ‚Ч0–€9ШЙљ8х…№KПў@yuЎ+“х)ЏЛЄђ~х8eO`Н<'ИюЪЏхЛ+›їxПщlТ$ЉyлTHnѕ&AlдЉ]JМФџЅXlј|8wтЅƒњвJхїЗЃ€i„:Haяƒ3А[І)„‚ЖИVІRŒчђ%VЭЌр­р ]’^ЗO5ŠV˜нСпўщтаŽЩюиђтšx&њ7јг,Œ О[QA+Ђђ­ .N`:7•e…•Уы‚qqЪ4*YkM„U)ІwSqцс5›ИN<C _П Ќ эeFлhe@яS&*са'‰йВŒь9Iј&љњЊ›.,г7Ž+yž›Ў[yє6Щ#%рkЙыЎЛВ4A"ъЉ”У=ЕћъJrЊ/хєЛз5ыg:ЫAж§NПb{E/ ]™}nгдд! і#c8Lц{ь Pйl%X@/nпЫS4 rЬѓIцЂ‹(М‡цƒўЕ2.œp DІЕžuеЯHБŸ‹НQьcIX…�T9‰еVBv И„XСЮЌ ehV."ыuЇ2^љLЏЋ`яIyxM…iYnІЬсœ)ЄЁЯЪˆф,Kх „M‘Ч–cўцe>Ž2ЎfldŽk‹Шы№№ѕžу3':K9k гЋю$Дї)Л$јжйВ<o›m;Џмъ#y ЏYІКВЮ^Г™ВžvїRs"•?‘–М~•Wш>œUјЂпЩd—џЄ^џь“‹ыЋећќ|бўэ,…* +rU ь™чбЌƒЇ˜89Х€аl>жВrИХ9М‚‚ъ% Ђi„e%sЗћТ=Рдюš*)­%WeХє,*Aхha oХU‚Š7?AWёю‚ф9e1­VЋkжЊ=яюН—’”fzuцйqћэСЛчX�Р�iъЩ.€œШ™тЯ{Ÿy(ЗоР™n‚ТГ€бbђlOбœШW†„Ъ›М€ŸЪЉlvЯД^ЫА.жC €“МъЦјУkімЌЇКr3  lЩ xЦ#СЬїБЧ[rйпњї=@К|О^і†ЉЉЛж nшэНнЧ -аaа xšшњ<Ћ&ЎgьiЙ”O gO�“™#gОj%Я№Ќz‰NќРOГ(t`Рчєm.—~ŽEЅZQы&P*инŠЊxѓ№X‹іzjMo:шІ’нU†Є’Ћ”t.)Š‹9[,rYљ к\@RУ )(SЎ1…JЕ А\7•kОZЂFт]{ц ˜'‘ё8їžЦЗаCq№ШсbяIђ[ѓSŸžs3oЯЬ)ŸЧzAу7IЃžмЌ‹DакеYђt)НюŸћNаUўu’ГPу•лwѕ�)й™­[ ƒŒLхЉЫцщіuЪ<м–ПьБHsPц1ЈмЊmМЦЭfгЈhŽJ0R›= 2bЪЕУ\;РМ~[a•s№ -MjШ`нЋ Е’ЉтVЬkКJСOп=Ж‚*Ьs‚рwlZЃ‚<gZЯЛK0ѓNщ%_цPb•_ЉѓЂЦ@йЖцMшцa{* TВ$SщiKжѕД Ѓџmї,@фШЋ z3хѓ~хHr Жч­ђšЮЭ<=жSX~ђJz%Й2Йi ж;uЇЭ oњзИt€§хшпДnЏI€њ”]XПн› ЌcOGОК)Ш _0ˆэё›ч.Чн3!ЮU*k—ˆп\ч˜gр gљ|ŽйР/Qш•+бkШѓz˜о) ЂkЕЅY%hХVX%Ќ˜JЕВ~j9*IЫЖТЩнkЁZ’JѕМљЉ„dЅ‰<FЧЖГЖ•NŸъrнъ�6qѓЭ1†ХЙ`зkйІ•фPmВVяQўT–пнќЎЗtэ`{FЙ_ЙЭЧ:žљ œч%2*Џп 7yхж(|J(‘L(ЗђyMй<жњеƒЭ‡ђ}tIЊoEџО3lў›cЯйИ<ЪžЃ0WN!x™ Жsn#BЎ=?+W0„Ы>4xoH‹6Ÿ1<М�A ї—оѕ}эTќ(ЧгѓЌшaјЖЋ‹%ч}ж}iЖЬv_цкоY– *ФяњВ™тTАJIЎаO•Іmзэщ5LЃЂIo Y†ЄHЃkъ§‚ ‰Д!Ї?UяVYІr e v„Nb œ J4­и2˜GЩДi^–Ћм‚mўц!`Ъэ=YY\ї>г Є€K�Џ{ПѕЬ‚AuсnЙ‰єжС2МпOAЗžъЯ�’Vš'•њћ—к‹LКWў{M€Ѕ№ѓ}М5ХЖу ‘q? ь!шqзЄvі|\™П'ЮyrЇzыєXЈˆ•UЦрЯ'hжЂрЛ ї#јcS Нђ*№bq•Ьго1†ЯuЄu žƒЩНЅaг‹нЂз”ЭћTЄ ‘0‚&’{єšр'@P№TІ–l:•g^І•jT­UI*•ЎЗ(яwPхt—Lщ~­б]яхНЪgZхѕг]Yќts@HР$y’E9!Ь_`ЭO29TЌЪ(Рцх5}рT9Н—ќsШњћx€#YAпспkz�2мЏХ8ЎН†Яуš МSTfšŠйЗЗљƒx€ђ9сb…/sncDњs0жytlžБйxЧ7ёdPžпšœєMзK*A—•H UЉtяЕbЅHd§I‘*ТћмTМCЖЇт6YО жЊz•\)оА=C"Žф‘LmцсБэОЄСжеšЇзЬгђТђМOY$@Vџ K9-Яћ”бМп:Ѕ:xl>ІГ ByV№мIЙ$ŠпНЎх{Юž‚eкмPЇ{PЫRw!га+џ}Я^€IБ†‡Qд/  >DyšЪхКчЧ9i>˜bM№Юž&ы цY \Тa|ŠЇФ}Ј4ŽЬ7тБ…БAJ< `Ѓ€Ёr—FХј*мŠЄ@Iж'TVXeJЏ)Ѓь—Lœ@Ў‡P‘‚ц=*Щќp*=‘Шы‰*^+PгЛi•’гfСД’(55ж2ЭЯї і@–Эђx>Й|ѓ‘Рщn],SЃГK' 6ж{LЃ 6sЋ=–d”�ќR[F$я“$,Й‚М<§kyoЏйPЩ2BЖКдј~жжЉ`?ПП[v>\—ЩОŠn^­yuz/Б^Ž'V <MФ|€ ЭЩR”хX•†жД-Оё�Щ‰‡IЃuЎЬ,L…X•ЇbнUšр  Ч*к|CЅ ƒлВ��IDATО�kЁ*Цk\3sHZ%šJTС)_ѓ|щ9ЩЁEz^WkоZЄЄ0oWzЫTV?Е@-_0є@n.­'гш˜N�p9пн”ЯМвn$ЕВ(ПЭi$•ŸЉ,1АzіКd6Ня>2uЇМшo?ђ|&+№Лќ{Mp_іtBЩ^­K% ŸП›…‡Q^…іЁ–x‡@­ј ‚(9k;ƒ#ДЃ97тў\ЖНŠўŒ <ШЉo6ћтЁoЦ5W>›7љќоЪ,0S‘VDХ€рZ9•ф5.ЦЪЄ‚TІчнЕ=S'? U4ЈгФ-*FАMcрw?Е*ЫВnожY@МІ’Э_КзMя5eRF­оcѓЗщkR^=m@ЦКЄОP†ї™фЕ.ЪрНnцc}$КeЛ{ЌŒЪ“ђ7Н“?З3€Ѕr4UВ*ЛЛƒт~›,—цБГмП§пk6мR…э#ТeГ3cП§Qз(˜KЁ|dМ!ц @к j5Lœ]žІй/чC`Еn™'g"i5‘‡З‰жј!Љ>–ƒЏeЙцтЯє­Ж=]zQsЊМЪ”хZЄх JR‰юў xJ+0*ШН эфћ�н )фœчЛУГh'ЛЎ*2 Шп|Ь_Т Œ›жЌhВ АlнM  ФЯЋ|Сrs}@ƒ|ГrдСz}kи$оЫђR”;y.Ы•шцЅ,цkННnљЪd§-лkЃЬ=c<}ЄйœfљS9ЇYїї4#џ&ф{ќ{=˜FQcИХг§ сvоіIЋS89ј–яEˆ0uќXіЌ~WЅLЮѓВcЦўy‹($р]РХтO |ўЪЄ %]A[§єyV§іСЎpЊ“ ‹ HbМJRюЇЂ-_eћi[ЎbLчѕnЮwbIšЈ"ъсx чVАžAХfжBйŽfЊШ”Ї XІчTЖžD@tЛжлќЕPн­ПЛч”MBи<8УнВJN"[Ѓ)ˆM|’'еM •Iй,C€ннЌЃiё$М›ѕ•tбТг}умЙGю№С№ŠџšМЭНЦПзC�•ЕЎBKUŠQІэЄЧ  ТІЇx3иT=Žч >~>кYPх'уцч˜ПЮЃ0~ Œџ— Uœkњ”н ~&І=6ЗїХфY–EWŽDЅkщ—3Ь7тБ›@ЙI�Ч4~њнМMы#д*Ј€^KњЉЫk”я&QTpЁ'Qz‹cяtѓѕ~­ZЯc[kШ–#P‚`zЗЌ<ЪА$ƒdФsшш<щlŽVмxcЖ„Ю< Qnѓ0­їZІDђXтYО„0epѓšzїМ+ЁєРўиЖžуиииƒgFGџ,Kј:џН.з<юф+ š|Ті_†juЖa ЄrrЙ…8|h.јњњœпЭЫо XЗЯ2эŠq3юЄ‚‹&Т€‡ѕє(#Я‹ :ј‘Ј•sXгЁЏФx‰чфжmЬ–ŠЃЅЌ<•хДЋCЉZ­пЭKУя*_%j)Ю@Pf‹у*юзnЌЏЖ›с\;ЌЫМ (№4їRяЕ.ZАљšЇСžžEЯЇъ†­ЛЪїКJЗМT~ŠYXB™—�ћЃ‡‘Г‹ІШбEe`ѓ3u*ШъбВеЋБM јь˜6Я|єœYцЕ—|ŽŸ9s'iоаLПž 0qЉI`1‚ы_)3\…љЉр‡ќ.p;CИv…:љОМ*? pbК,“F1 MWмРrоіeЅ+ er~6VГ†Џ{‘WЂ<ћXŒДѕФ$э[ЭУ$хљpˆs Z,QЖ~РU7.ДpГ@H7(ч%ІPV Р:ДjфY�дy,Ш45~o`=y… *9‘Ъ�ЫК%їŸb ПKу­бВЫs‚’е ЋNЄ” .)з#xЮ™CНЈР;p#Il6дЋН Й>єЁeљ9)dЪфљ!šaeD?Мx2мƒПA>iШ7гУыљїz=€y1лYў2јi*[БЯЉыJ.ЗZ-S:uФ UоZХѓ} Dќs,љъ)8йВфЂs9нП3zKЏo[фyОbзйb‡cayзСш:{2цi7ЧQЬрњ@I�z�бЗcД#ж §с3�тА­M+ЪTAўnQfЭ�уЃ]ѓ€п€P$ˆ"€хqЋ $ƒ<­IK@­ЬЗŒ ЌŠїœ�K‚фuC"%/ Ч№Лi=gйІdѓK�šЮJиПЗ™IрлНuќТŸКе“Ѕ2</й$ˆQПuј1^иq D§e Ѓ{йoh{#Р_Іz‚§~•у^”г+лU ЪчЕБѕyžO/ВX„Оџ4–}ЖBЄЫтаYйЦkеQ q�–Щ"M_чo6,і`иие‹ ghžУеѓІ+Ч@=G;=У([‹ЪБў§нm=—PЎ�ЯЁ˜(w?В4ˆKвvд6гf L№ц" ˜@с.Ъ№сWŸTЁn*Zp]bm}ДlСL7СѓЛ@ъaMя@ЬДщЦB^ НЁiМ?5•;ž iь=iнK‚HЩЂЬn–m™–я–мОDаѓX6ŸчШї_ќ†xŠd:Ф%їчMo`{#H<EУ‡G>ЂџІЃfјiЗN^рєђ3QœфeЮЅ›тsЭUБК5/ оO,–bm‹y|^ С0 Г†Ор4эa�пŸe­мCМ–и€1ƒѓ”УЌ(r§ћQ”б‹r:Б–uєoАHGуW tэЂoл+ЕIhуКр&}хМŠnуўEЎуŽ^ЖBЅК –бОнлDŽфоGЋA(HЏЃ1HСДщаЭk­O‹vQ�г=.b•ЄКЩуŒЄe(ЇїI:ѓДy•TЪƒЁ§ВN>єаCПŠИїя6Y=оШП7B€”oŽJ<zяНїўmFМЎфmbagЕ† mДЃ+Ю<рИљжйј0юўажАg[œп§чЗѓ’H+—u’–]žk`iє ЕŸр§tЗx–Џ­vOМX;гk7ЦЅx‚S ,cos…5Q&Ыžз?АГЌЬэВgHщцЇж­В=ж§єЛQбkaZЕз=‘'цљЅXgi~@pХћДXvгJѓ”0ЬfDpѕLn6К|•l^—Pgahhш,фљ"#{=xҘж'IWућ„eМ‰џО$Ж5Q˜?eў%|Пn?Бfžѕ5inŽ№cPГБn6“_YЭOШTJkАFпшф™Xр­Ÿ—ЂЄњu.˜dЈˆхd‹МІT=7ѓ›Шч{Кc†!Ю3М|‚gšc’.\‹(~ътИž€rчi/зто}qdВ|–*>YЙоJpЭыЩrѕ�hZ­[@=чw-й|<'XЩ]K�ƒ37­ž@KЖ {H)‘|b'РK,Ы–щЛБ‡?9Я+w~‘kџV|љС нКi’О§њІoп^!nmиЖгЧЌ^oeQJїыЗэoйw8*'ЃХяџЬЗ~’•ЦЌp|?рАЂ@›Чq,вnѓЊxVrщО?‡EвнCчf!ђЧX{wг†"ћo`ЉTЙXщ*[plоI-Ящz!P  –#јІ‘PZЊ/l–Hz Я{V.aL+ШКxЫїЛi“‡ёгы–сfЯYОЦ<Бў.€ŸЕчo5№™ ќ{#Н€tЯ+>БŽЈШ?ц5&9ћє'iПŽSЉ.”б)ћq\Ÿыѓ<ЁЛ;˜bV‹ ЪyVЙЂHŠЛрд™&,;У8ъѓ§1Ж’ХЁ=Ў4ZRЈЪs№Уп'˜ZœmLрЈX7AiЅїЅЖU2 ЖiTО„аBЕZЯЙ ˜^С@MзЏѕЛЛ%p%‚щЭЫћ-[OсНzƒР%Тx]тxнєЪ!Д~в|Œ ђpVРлјя&�Вк=,ЂЄ[VЂ іССј•ŽшnВƒŠЎ@)Œајсfyt{qё”Х(ИС^DёyžЌќ1‡‚І‰рy ‚DЃ=ЌЃыb ‡С$ЇUВmВ€ †JTЁ‚Љš.A]ЊhA”ІЗ­З `Сї3нуЇ€™ЇiЬЯ�Юіл|LыžgО~7e*“ї ОЧцУ2RГЂG‘4жУcIiрЩѕЯ §P@Eро~ OРƒ>ЌЦ"NSЙg9і=:Н�уVфЅБР>šМо­Х� ^ЁЃЪ˜7ПМф )ŠМ%l–Ѓ&у�ЭХЧуl‹щЮѕ�ТМ‚яVщ*M…ju‚фБЪVб*^�=Ї’Ц4ч.TМ@й$x]�Mђио š§rЏ™V№uѕц“ЌZА-SвЙй§М,_Џй,˜ŸхјiЏРЎ y˜ПљМc)>р)™ў,ч~( `›uwЛ %яQЩЮMЏ ы3Me}Іp?ŠtUp“WИLАbhŒyЙSЧѕПрyїћёЗћшОљ,<D•ЩЄвŽЉ /ЁМ†юX7ёСE�Џ%Ѕ&+ЈДЉl•)p’E"ˆ@Й{ЏŸоы5ƒ/ЛhРtžЌ”VrxœР4G ђЬпќ[b>–k^оч8€MЛQ~’Э8Рz8�фк ›(‡u~јaƒПcЉ.oзч"hжhRБ_ЂНќл(!o… pn{пћВ ‹ЃQЁА5[ЗёЦ.\§ќ“бuђD\v|(Гќ‘ЖЃЌ#x$Кš7Фрє)ЦэYЅГk?НЖŽ!e�†DЖХ*Xk@Џ5iщ.РPб’Oхы ЩНп{YрмLчfлЎ‹з2RR ДѓэF§Щѕ[/ЫбњMczЂAš=ы+)”ЧМ”УВLыБљъЅ$ЈчнЭТЕШчDŒ3aоцoF ‰Œ‹›ˆ2М%EЛ*ЩaKcСгэњ‹"О"v % ѓЛ<G˜џппечzКтьЦпЯ“Мшa …ЭpЯ8JSqZЂжЅѕиfЊ<7№ЛVЉЂнЬcх0 ˜ЮЯd§~šWеуД›6ня9AKSI%€nžзу™NљZЂY–„Hч•IyМпМLЫ<Пcpžпў(YщIпіэM#€’у ЯB‚QY^oЛєшVbКЎNљщ9_Ѓ:%њ%—aћ(YЃЙЃМ_їйЙzьЇХj%‘ŠtWБ*ЯћUЄЈ‚=/h’ЬіX—Кg›^kзђЭЯO-жuƒ~zнєž8Щ$XжA™Э_/aY–Ё очЇ^Чѓо{q9ZОЭ–›В+ŸФё~?-ЯsŒъ§WОџa–№јїf@ŸЅВЛPжЂвД•!�*LeЈX]ЋIљRDЏЋxQИk•ZЈщь ”€Јl7­rS€Шђо›ЎлLHЏЙ)љйlИ ‚Эƒю_Э[X–$ѓиO-нДЏ•Їk‚ЏzЉˆšЏљЅrMkš rЗšsж ыџMЭ™ўкоLdu в_јїЪ%*TpЌИРЋTƒ#•&шЩe ЎiIEЅtЩŠU–�žРJ•kоІёѓxA2/7-ЭРЭ{”Хr$žyY–ф№МВјнrнЕRЫ\›oкMчy]Кe{ь.‰м%Нп]“g^–u1!9Ю1‰УРц3ŸЁЗёГˆ™ХP™РяРПЗЊнЉ0SіepГгž(*U№Е"СT‚р5+ˆ~ЗџэqJЫJЛiи‰ѓѕXЗя ›дЬhЁzЩ %ZЎрЄ€Юћ$Є$22Й™Юr§.hЪ'ЩT’IAѕгyПїX†V.)Ќ—+u”гYПД™Ž|ZCCCПТRэџФyfРољэMї�ЊДР№щ�ФЭ(fP…ЊЇтUІ VЙZ˜Ÿ СOћШІ`гjQІ5/глL˜—їI”4X#(n*мM2Иy]<ѓJї™‡€™ж|Q§nЙЪсцЇїJ"ѓwœ@rxоК(Їљ;Ž`ў›6mЪЮ9уЧ~/~œ<'ЉУWѕћYњ”ю[e|ŠќКЗЗŠ� аDa,Tmўœ Uй’@ЫQщ*ЮѓЛЅ ытtКfЏ'‹$=DКЯOСдХ{ЭcЯ™Зey,i<o>{^рЬ[н<\7Ыr“�ZО„0oгк|%ђ$"aбY›Ўай˜‡HЯФЄЮДѓџ–tПѕщЌ€wЩПЗ’�*neфPЪm‚’@w7AQaЩђtБ’@Ћ6X8]ЖЪЗЛЇ•к$h…z %еѓ6яf™щ9Џ›Зї{Ÿх b"Œ`y]2Є<ЬWb˜Юћ,_`•ЩМ• РЋ…ЪЯАЏ@FžAYђ&Žќa§ŸАП— Гдж ўЛТђ/Шєіƒтў)Ћˆў…ЕЪ`•—"{ !tЏZRВdЯ ”їЄЧ‚Ї’§ЎЫ _‹–!8оo‚ѓ[‹ЇгJџРuю?ИYЧ&$чх'Џ9\ъњщ.№Ц)z�‰s!ІpРЦЕYЙ—s€kSзFњŸƒф/вcYQ~ Y6qпЏqэ (њЙЄьwучлЦFЌу“†џм!P„TД`щ2m?Е,гкйOН‚–ч&р~7–šЎK сц9ђ“се_УџЇ]…‘Kd‰yзq Њюг~ђ:5оwQПУ{!Х,eєKTIЋWpЇьЙџ%‚Мрџт_§Ѓ€vј—е‚ѕЊьЉLuМ$ яЖэm#€ь_gщгџj$ Ÿ€L§m•Z{j%пuЛІз*нНп&РЭѓA ЖѓB$џПБ оxЙIsА "6mз;АђmљНфxђхњюN§Жр‚*њ˜љS<Т­v\0“uk§nѓ рnЋе›F нѕ6@wm]Зо№џ:ЭУч.”їz?^ЏЅОоtЏЗмw4н[~—šЭp§ћK�x+рБHзЂKЫЉз.—M„‘З$H1Fа;М€KƒХt‡)FhwџKЅяЃьЅqия"Фђщ% МАф:MРS€}/–§3„МxlщЙ~ рБЛmd/№ЎаHлz‰р9#јЇŸ~zыП}hhш‹фП ўОЏљџ"@& кžў% žЇ)xЏЎ\зn3 АЇ`Ў• МпэиіK7Щ”ОіП`"ъхЩьфђПз­w"ИXИ—лSР§чtЃюdШwЧН…‚œкyoТ§ѓг<Ќ+†ЅУ…БЯcѕПLрwцBІ/чwq!ЫЧп]я4ОM2€ПŽюзUЁN їПЌЁыј;x‰_dќ/qю?а&тЛОњфл2^>ёCЁWВЉз]мЯ ьKOW,|uњ I—?–5АЌe ,k`YЫXжРВ–5АЌe ,k`YЫXжРВ–5АЌe ,kр[јџq‘IѓZль����IENDЎB`‚����������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/icons/mricron.png��������������������������������������������������0000664�0001750�0001750�00000004075�11247201502�021142� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���0���0���и`nа���tRNS�џ�џ�џ7X}��ђIDATx^э˜ ŒTхЧчЛїЮьУe—eyˆTЊ€lЃ˜дИ*iLMkkm›4Ж(šБАЁЕbРwSСаZ—в VдhKнД+"ева%€&R\ dAЄeпf˜йй™{ПгЙ3™B‘Ѕ5iгь/''пLnђ§ђ?пмЙЙшџЃBЃB#`ThTшaћpm0Е:ЈО)ћeUнё–§сlmmPWgoИA—.еѕпЦp!МФKъƒiвЗЪ-З3Пž™OѕОњƒУo4щф)L›&SІаеХoАx1ЋWгдФЃ#у5}m™.[b—<<ЛVзў2XгhWџ,ћєt=ZжЃп{РoXЄї§и._Ў<Ђ=І=Є zчšћцљчѕэЗ?Н‘нЇїнІЗ-вEкјВОќœ}nЅ]љЄџЬ’рі:iНF§љЖпњš§ю|Л`.\Ј‹ы§їыуыЪ•ЙЎ—- -_§?йJVІH]ЧuѕдLŸі%%yœМ%xQЗаыqѕ е}—Я2”$ыућЄг$“єєаоЎЋЊ;о{ЦF>™OК‹ЛZiЩЬJ*cФ’$ъС&mњЕЎ_v щХ\‰њicZЫuЧЩэЗg‡гйI"šЉ24D?БЊLžLw7K—ВbчBT•Х<p„#s™kБ9•6кЖыіљ8�ыъ ˜яЄq#tР H yЂQJKУT&Mтт‹ЉЉЁМŒ ŽƒЕс5Ы—XшюфZЎЕиckЁхC>,\iдБ0ЖРuЈувW!i@T9c7Žiг˜:•‰Сu)) “V­СШ–А$IrГRЄvВѓE^мЯ~EEСЂ�:Н@„H‹jбD(`-ННькEs3[З†kx˜“'ё<2цЯ?Ÿа=мгKouСVЖ6гœ ! Ђ(ёH5ЈA•c„](Т™9!nр�oОВl–ООаiЬ,јD!Пšъ(бНьЭ Y,PЁ †�PA„ƒ‚p. ~" ввТ‘#ј~˜„‹'ž8‡а<цХˆUQеCO8&U�-….(P‰‚*F рЏЪy)jAјc`x8ь‘ћіёдSp)ВžѕЅ”NжЩ§є'IцœPђзV0`]DŽ(m€ЂТШ8uŠcЧИєRDBПl6ЇxVBйшЉ—’TB]в5(ƒєŒ*ZfАŠЛ….AeфДЗ‡ZƒƒФу@˜жЭ7ИяШ2cdLЏі*кIg ОS йž•Ј„эЊСЊЖ „‹блjc(+#ЦѓNк &1)N<ЁIK&NП y,дЊ JVp…N膈Ѓ(XF“Z+}}j Й  аХъТJ*3d’šЬHЊTЇ&.SfчJјŒRхр@Ц’‚“–>эы№ŽКcoК?rz О=уXЮMq№Б˜””рydГ8N(Д`.а%]i›ЩJЦJКCSe’x†сo+Е…:С1›xA?‚6еа=ШЩт–Дјёьюћ9'--•hпџdюНQеYv‚еlƒSIОТрlБЊdЋ�€`EЧ{?н&_ЭК6Jž!ф8њ4#4 тЂўй6PDLIINŽкZZ[ѓBгuzF‡ЛH\n†6izЄWХЊ`5Žj ›ЄЁ‘у‹Щ• x(‹ю‡ѕШябЮтнSOѓ �€oLкq2&pтDu(t“?g/b[‡™э0фR*`EЕŒCЭ [WацŠ@ъАФр(ОЂŠБ3 шAфшz@атјL1* 1ЧIС@CCMcуєPh?ЛŸу7уO­YкФЃZютEТŠ”р:8`Rh+њ6ђGd?dц@ƒс+B…Ё@VБ6oV‚€М…,‚фД# 9iL\$хћ7оXКjехѕѕC!р№Ѓw§]rкGe3дЋ U<ˆ ‰9Aє‘№с).|›зš!|ОDȘR4#Рњи2t7њ ш4b№•Де”jp ’9›ЋЏОhЭšЯxњэЄЫЛЛV—ЉЯХ ˆЄˆ$еƒ(D хфЛ%’7ѓРС8Ј €‚rЅђ9хѓТLјЌp\”rh†o’„‚‡ыfЦO_}ДООrюмškЎ™œ!tdчЖ-Ыlg§(”@иѓ<ЭkуЉF‰ŠDU]k=еDуaд€€*ЅЪ2.QЦЇъйy_hПxlY…S^НфЙћючbмВіWпБ3йоž‰ХtpDвЄг&‰ žjN—›ЏR(‡вœxj=-ЄhЂ˜№b‚|~ќ�­№мямЪК&�.№™њнЭ›г]]'лкzъюNuwЛъЊ™ѕѕ&”WWgњћу‡ДЖ&іэъщ)‹ђ~Qc"fІxќ уOˆдŒ/}ђiо5bЁ ЇћРЮН{OДДtМѓNNк@YБ"ЇU™ыЈ”ЭОњŠ}уМшЇA_{{лЖm-?љIг-ЗЌЎ­§y4кырeиялчЬйЛiгсэG,пОnнІGнМbХњЙsзжеm˜7яУ о}ѕеџ“з1ЃBЃBЃBЃBЃBџ|ѓ €wPФ‹����IENDЎB`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/icons/mricrogl.png�������������������������������������������������0000664�0001750�0001750�00000031640�11212776162�021320� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ��3gIDATxкэ]|Uѕѕ?wМї2IB3*T@@Eмт�WнеVмZqVqўЕЖЕuдйсЈ nœЈЈежjдЭ”НW™oнё?ппxяц‘„’�%‡Я›МwѓоНПѓ=ћќ~з vкЁЩикаN[—кАƒS;�vpjРNэ�иСЉ�;8Е`Їv�ьрд€œкАƒS;�vpњ_@ˆG ю<Jyєр[ьFdZ–Y`šFЖВТф“с:nвѓ§Ћ‰ќ "wŸП’Ч*+xЌхQЮ#БЕoЊ5i{@нxьeY‘Н‹:цюVR’Зs—ЎEнКк]ЛPЇNљTPMЙЙŠDlb №]ф9ХеFTUЅѕe5Дv]­ZЙжЌЉЌсБЎ|}эвЊЊшїDЮзќsxќФc фжОё–Ђэ�;ё8„>І[Ђ}ћѕымs=v6 ъAНz•@0лЖ-ц3nЯ'пчџ}yЌsѓ†ќGƒфЙЎыS<žЄŠЪ­^]A ЎЃО_Aп}ЛТ]ИpэŠ•Ћ*ц$убЯјфOy|KRSИ[{RšKл �:ђ e§МwпЮйЇјРћ˜^RвB!‹<Яcцy‚~&Ї7wR�ўк?'’••UгМykш‹Y‹iњДюsW.`0œџ№Ÿ}Юcx`^ЗьBк€Жu� "ВЮь^Z|ъєыyдбChиА]ЈЈ(‡|Я''Щ gЦЗБ!4 @‘`ѓБ|y9Эb0LњЭўbбђЅKЪ>b0МСЇ~BвŸpH‚`›ТЖ €ƒYХ_<dHщБЧ0<їˆбЛгNЅ…d'“.KћЖ1Ÿ�ДЎ‹MЭ˜Ооyg,XНj§лЬїзљДY<6№�RЗ90lk�8Фe]5bDЏЃЧžБŸuШ!)??KHд{ыO†фпŒiб`�8/)ЃїпћŽўѕЯЏп|Н|Z<^ћŸТ€ %$Е‚ЇЦVЇm�У +r§ˆН{ž|ой‡<ВВBьŒ9ЭВч`ЄЅ„ ЬєФ+Fч2ѓи‡У91?Фм1)ЯHˆПpљчц 0„mЊЉ‰Г‰XDЏО:‹>œ:wбкЕхЏђ5НL2ЂˆR[M+le�фpŒПvзнKuСЏЮ;†m|vvИйŒ… —ЊН­t‹8€SО™ "ГšrЈ–0зž`ЊєјСј8…hЁг…ОN”вќd!­sУTln ГѓПЂRЋJ�Ђй“ЫЮc8l‰Ÿч/XKџx}6НљЦ—цЯ[§+‚gљхi<*I‚РЅ­�„­�žѓЌ’ЮEП=ыь§zqЦ~T\œKБXѓ ё<~‘шAoGQŒђ)Ÿ%1п2ЈSШЁžсrъi-ЅBo%^53–Aтї 9NZъRуS ;”8ŠXž Q7{н^є…PЭ1 ™dл06­][Iџўї74љХщёЏПZњОя'ŸфЗ?$щ'Р<Д)Ж�†иvжŸЦ9шш+ЎMvПЅŽ5=^JVŽЄЬјл�ШeЏ=з Q–Ђf@W;FЙ<зkмlZхфR ‡wQ'IеЎУC Ь1hБІЋ ?ЁУГSТЗZьцID"!ЊЌŒвћяOЯLњФ9cбTЯK<Юo@i шЂUЉ-слПЂwпЎ7\yх˜ТcŽ"T$Мњ-%ићѕЌіЏ(;‚v63йЅB›X§Ь|“r,‹rl›Вј2ј УЄЄчPмMRдuЉ–G jfўжы]“ц9:0{>нRј)Х}Лх'о0Df2M <ёјG „…ајm'…i@ЦБU5B 4”Ђ{O>yЯCЏ?šzt/duŸЄ-ЬзЄ(лpшўЊ=шоŠ=ЉЅю–ЫvпgM@”Ч#Ы4)Т`!ЙcШ[іјЫqж<QЕ<*�fў*зЂŸм ЏЁчJо&зoНiв@Ј­MалoC=њaќ›Џ—ў“Р#$CH8‹H.ЕJЖБЕРЂc^жЋOзп]{эQEG5DdьЇх" м€УџŸВіXњ.^B&{№M‡К1ŠM6<rјЄћrЖ!œёGЬkJ �№ 3ƒЋ<ƒЪ<“жxmrXЃŒШZС�јŸл|GАЩїЁ€PСІс•—gву}Дaщ’еЯА№?Сo/р#Y˜jб№БюЧіюоуŽіГkЏ?ŠJ{ ЉoiтШ›–КљєГе'RЕb T+&3ОƒсQ'љ<В Ÿ§_јє86Ц?T3ѓ+™љ•ЬфZЯJG ќYчw˜MП+јœЯkyаiaщВѕ4qТTziђŒŸjЊЋрЗўСc=I $Љ…ЬB+РлЕ[ёуЏну”Sізк’R$иџх €Ѓзœ@5Ь4ž?Vѕ ?ОЕ0‘|С|щЯуJидS-3Пк—3šŠ>DњРb'ВŠ^,љ'эbU гжЄKгІ- {яљЗ?эѓпф+ПпBeВ†фeoБYhс;ЫэТцъЖƒGэzўonњ аЅ>бbЖ~уKG%Я2ћ› в›Е§ЉРtYхћ _и{ѕЫŠŸт/_М}Љ тžBРТЖџц‚Oi-ЉўЁXдЧMLџhџрЉЇ>ЁGў`Х†ђŠПёЫSx”‘Тiƒ€udAaоŸЧ]tШЎчw …Уі&=|”цMЫЬH`цШІы;І№фС^ƒ<‹BBчѕš4ƒCСr/‡™kБ60„†А ™еKђь;<ѕѓ}•-ДЙfŒJэ 42В„фа/—?1чЯпТЌ­!ŠИAЋ†ЅКRNyМФЏMјhmΘ͘n§уыоЬ ^aјB ?ЁŠЄ6hжEЖ�Š˜•7эЙWЏЫoјЭqЁ{їЄxЬ^vН_h UЪ&/wэ:‹,Жhё2“*Њ ъмйЅQћ:Tя7�C1^жњ!§†С,6Lсм…йѓћavшВxFlžsSЈ~›g9Щgдx!vјBH;РтgIvcThF)Яˆ”`р‰ў—‡'ЦfglљRй—$‹Y“ГаІ?D({U˜ЌЈЬ)D{$iѕaU”(ђ�hСЗ~`@TVХшЏy‡žzђуo\'љ'ўє& s кРik�™ŸŸЧYчьПЧИ‹FQ‡ќ,‘дiŒё5Qƒцў”E3ПЬЂy LZ_ ŸO FDmмЇ>Нњ§јхeћT77d †“ЩV?ЋзŒдя††j№0 %уFР №oтsе ЋF­Рl WLї=Wќ.Œ†Пщ\0’‡]Aдс›|ІHy„ЙЧоH.;ЉYЖœі*v-ЇЃЫЩLš”НФЂќйlЮЂ­Х dcjдЃ@MSњ/П2ƒnПѕuыЫ6мCвADЇДСf™„ц 3ЛZ7яНOя_]sэ‘іШ}њˆŠ]CйМЭŒ4чЛ\њњы"–ќˆhЧJ$K$)žtјшSNЎK'Ї§їN2X(р;HIіоА„ дяЪЪВеЫз@P�0ИEщєљ)3`Іћ’ёТG№„ПЛ"|ѕШmа$ˆ�їКšЈ`–IОБКчsјzѓС|Anџž ”=а8y‰ЊмЙ’Bы8T§–ЏД‚?ПЪЅш�‡–^щR*dЉ‡P3™>}]нфиќy+ц9dЄх”юclš�{џ‚ТмG.ОdдюgЕ?хф„”zSђ„Оќ6D~RHељT—C6фЕб(UеЦЈ†œ(ƒ :ъгрнуt§eЕфЙв`Щ|0о0­ДэW�0г­у…vа�Hн^}З™€Ї$Œ ЁіЕ6p%У…&pSf!D‰yГ™ёS Ъ™ЯзУ Іd~l�AM’`MВ ђНS%(мpœПЋ–GдЅ%з|j#JгE‹жбUWНрЯšёrШ".цз85С/иL�XЧявГфёлn?ЅуA Нs K={ееьЎў3›f~‘MYЁ0хё„Dи9sŽK1ўћ(8џœ` `ŽяОk’ін+Iz{дЙXкyЉ|S1,e˜љ�™ŠёfšёFZ дНUю)�Є4ЇЄ^kW™Хє�<?­ их ‚їˆКоэЫяшh(ЦѓѕEЌє@Um8йJcнIХtŒ„:Цјѕ .­ыQйё|gёЦ9g{эк*КђŠgщгOО‘_B‰#є*nв9м �XЧіщлѕЙћ<#їнK)mИ[:Ф _Жв П?•MK‡(7Ч`@|яь”™2pžаЄ‹ћ<! Tфbќ3Пз!ŸhшnDЇуSп^ьšЙR @7ђч@ђ ’fСPі_FZњƒЗW_›^�ОtђДъЧOІч)'0 љО#<5ГЪЇžПfGф,р” �RђУfzиj˜ъZ 8№t“HIzr -)�РўСhŸV^Жi�ШљЖЈl} ]vщ$šій(3?Ў@АfS h*�і*-эќЏ‡'œS2xpiЃ=июхk КхoYДzЕ%ЬžЭ6Я2ха‰9Ч ‰гё| Я Њ.БgRЯнzƒCŠ˜сЌk…фkц‹€)s@Љњ}cъ?Ÿв@ЮŸдВ4m2ЃбшkЩšРсkdŸ'фQўч.uПЩIядзeёйа�†ЬBй:аHbHхЄ"/-�PuИA+nрг›�� ›VЎк@ПКрqїЛ9‹'ђK“yЬW ˆS>AS�Pœ—Ÿїопю;c#Žи]TЏDBџ›юаь9{ђИwCФћ`ОЉКmг­кђў]hў;��ЬGќц?Šи6…˜йЗмрRџ>ІаAц[ЄДЁ[Рг#хўЅ&\ЅдСO9€ РR.5›вZ§ћ �'ьPбы.uў џm8c~mCІ!#*5 ц›FњqК�’iЩ8�рK Dй58ŽhХеF“4€&„‰п~З‚Ю?їбšU+ЫўЪ/НЃ@�Ÿ ^ЧА �Ајѕј1—^sѕQ2fеџЩнxwDќ,юеLп{�”ъеw§Д6Фесм`>3•mПоD7_ЧёzФ’^f]ЩŽ!Ѕ%_ћi@ШWƒ‚T§~ Ј i\СpWљ xAс„ъ№ЎK]oуїB hY­�Р<>АF0bъ”B‘Rј~ПlёБp(›�P6;œoМё%Птйe‰D!тtѓHFЙ”›РЈс{і§їг“. ]›jк@ЈћіG6§сoaЪЮ ј_С/ ˜тЬO3„  dkВFЕЉїN&]zОGњBњ$›бЗ ЛцK™7љ�пЈЯH@ZFOЅ†} 6юІь=Щ<€сЫeZ №‘]єаr‡vў5ЄкЃ:нcКт„Џ)!Њо—т1НЦ8xЧ—ўB}Є&eщ=) тЋnF§,’eгЭПž||ъGќ0Ј,"™'ЈƒдЦ� geПѕаУg:ќАнšTЩƒ„#оПчб0}4нRmYZђИп€Р)9ь=їюaвС# }лŸ"0пNЉ~8|"яЇЬ€€ЉътwSПNdlф *ІЋй6ќДЈ­вљpдІ@hO‚РБ*y’MС“L!вП,эёОUФГ>’ѕo7~™hЏK| -ЄДЯIЌўЃ0�n6šсG!iCE-§ђД‡’?§И !:’П!™'ˆQр“Рё‡ОЧЋ&žcИ›QЩУмУžOћкЂOgZ4‰IыЫ їdlяЋh Њоf3‘ёЉАƒOн:ћдЏЇOƒ4 —I,iѓIv№јІ-b+Х|-§†Šъ2паЩЁ†H‡RБ~:юпH 82@f@k'­�зЁ‚<ЪўžсУZ0Б ‡ѓ�;ёщЫ‹Ќ_Rщ->хLU�HуT•(йшЯ\њНAёnѕg›JHM™2“ЎџьЯЭ%3y|GвH™‚†�`‡УYo><ём1‡ŽкUФћ›CіBxMљ�ƒЊj1 8yШ")–—у‹“фТгїйіKGOЦџ`ЖgfJПEigЯLEDFhРЈGѕЄOu@e=• ‚�RЯРѓ…)pхkЪРР{О .kН"™gddŽииеDяГІcyДзВAЋ‘чИ4УйPkPВcу  Іђ�ZѕЌ3'јгЇЭE+њ[$;Œ Њѕ•5€УїьїсГЯ‹X,Њ[RЮ5ŒД 0‚0ЅеПŽPž1YвM‘ёгЬЗE€АDМЏ2‚)ЛoІjОaЄBТКЬЯДџA HI7ГН -рЅ|W™УsвЮ ‚ЇŽM*Ш!К IpРУ‡nМ,9ЩoJ…А)”•Із^›EW^1i_+RХpПЄР ч�`мyуoOМюЂqЃ6щљЗЊалiщWЬ'�[ЅUAEиў є›)яП.ѓ7і@щ&O˜эŒдбЪ И$?УгЊпЁ i €з7З?#ѓВZИoed,N9љЄ’ѓч-G^�ЭІX‹€Ј@шžњ�PPдБрЃ&_2ИoŸ.lЗлjхГ�4€шмMчџыЗџfJ§›ТGаъ?hъcОІ�TђG0;�u§�G˜�ђ”sЈЬ‚ч&U’hл[%_рx›јюl’UCЌbўŠЄpы›§Gю7№ƒЇŸО0$rсmvЉ�–’~ �[4|h� 8д=�к˜�lЌў›�хџ Ѓй(�Д#шж ]/Љ*‡л�Оcѕђч=VэКЩј~БЏД�|h}ГsнхW}чЕзn:ёгВд�кЈ €L   M@кѓoi  ѓР“vŸ'V`д�pЌQ,:ё„ћhѕЊ АЏ‚ь šHА>qCць„l;ђвФЧЯ;~д!,ѓЖmdьД`‚§A`c�llФ‡Rу>€€!5€pЕFя)O?хТ?Ok�ЇщN`“ž†Бc'аŒщѓГ6C?!4Р +2gІk—ЎХН<хђОнКДЩ’ьКW+™Оq�пn0 аНd˜uтcЃL`f@)щOї�И*MЄЃ�•№!•ж�„‚žЇвУл �@‘Ќ]5ўyšђђŒZУp_чћ�А‰ХќL�ь5txŸЉЯ?qЎŒЩлzБЊ”nјdшђЏќйoj еЄлou6P’,d0?њuВВРU @аD$рЊїЖБНR”І[oљMxјXгї<Ч ј˜Чw™�8хиуі~щћЯ-[mOF:м33AЕІoуP0­Lб Ђ@р™$Љv0Я—}€Ъњ7œpS&AлхЯлž§з� ‘єЯїМEЁ1+™LBњ‚й™:ђъ‹.sї7лЦ`t2( * ўZ€”tЙ:РLu ћКђЈѓ]Кї\W№’ЇьПЏ;‚AнDio_fН:YРжPџВЈ•tƒ Те%ЕгкDB(xп}џЁ{ю�ЬЙЩdљ�Є†g€ќд]Мѕд+Я9ч€f@\˜ЈФIјКЋв~Ц&Џ[ѕ�Њpвo*щ‡_ ZРDi8ЃhhGP™?3шЫЬ›ЏЕ@Њ(Ѓ$ь9 ’щЂ1Фж”єЇТПцЋqj‹УŸ[у%ЈмMP™ЅѕNŒ*н8Х8дD7UїPк3Ї3eѓќИM4ба�їм§нїзџ@,J&PџШNNк7&>ј№йЇ{ЬM^ЧчЫЋ 2=“BGыIq,Ž"ЬИt–’!ƒт…!JфYbbLъГHi3­D r -н TСVЬž€ ˜њЎAiвuЉў]’L—ЁŸWзіЗ€є‹в7_w”?g…SE‹5ДЦIˆUJqўОZ7FеN е8ЕTхF1ZЯ@ш›]BшЖ/Z‘T]ГQ�АјняІа“LсА‰>фN  РЖУЯ?ёє…Gx@ПFC@Щtf’oR$fRvЅGYх oˆ‘]YKFM-Б !##?‘рш#IЎЭ ршЂjј.эпEj‰zьЮ4ѕЕƒYХ§FѕЙq- ОŽ ™в,эОbОV§�„чЅЂ�Дщ^ТЭ!Јv›ЏEВšfжЎЂЙбrJ№Ћ…с"ъšе™ C”єbT/Їѕ‰r*Ol JЇš*�UЌ цёп[2Œ.+"РГ) GlКє’IєЏ~MсБœ€(�•С”€јgчфLyіЙ‹:tчz—uљІ,ЗFЊ=Ъ_ЅœUZWEFu-љБ(y‰8Јy<(‘dЦ'х1Щ#ž$UХš„˜Гию=ЉтЬ§)йП„ŒX}7!nЉP0\„–*A`@йHПg6…‚М@BHwЋ. OТS& nИљЫЦРќj–т—7ЬЅiUЫШђБ…MubцwфQ)ІЌцуіx™�Рњ$€™^ -рХiQВ–Ю.JwЬІЁq�ШЊ OЇі}ѓ5Ÿщ/a№Пѕ|�Ьl—Мќќз^œ|ёоЛюк}#�јЖE‘ђ8|Н’rцЏ%ГЂJ0’bД:G>ЂьљCŸЛ#zнЎќЛ'кŸ >Я+ЩЇŠ›ŽІк‡082oDюп%œ>3эє Г RОb-€Z,bR )4ЃЌ~в‰х№љСж№Дк'•NЕ‰ж4Gѕл|m7­јŒ>Ћ\D;…rЉРЪЂ|yvЎ`|>УfD„–P§•lЊ˜љUn­ўr†k†шЇnЁœMњчзЌЉЄŽПŸЪЫkpѓ�hљ‘��шžп!џЕЩ/_:МПЎuŠ@ОmRо—ЫЈш9d•WЧ‘,еŽb:zлСh0мUŒ–УЋnW'н_— ЌŠлNЄš_ЏкѓзыR‹B,Uc–@к@EЉu   ўѕ* ]Ќ h˜љЭпн vџœХявќшZкЩfЦ33ѓЌ0х˜Y”Э@ˆ˜aсфтzь F™щQјќ3ЦJv ЧvB—”ьAеHAoтАnргOчбйgM`pœфwЎ“ѓч�БъС�xѕЅW.жЏoК ЩЯžГ„:нџ639!0l,еЎьhEчыoVˆ"дo^6•Нђ+rиаFнG PKУЬTQHš%_IО‘Б2(siXКe#нЊ#Й*ШO-•ывщ`O9‚[ѓ‡љњ>Ј^N7Ўј”rљ;:Z6х2гГйЬEXЛй†\еь ЙqyZ]D§$›�‡stpFЇ]щєТў šх›сFч;ў‹"YaжьёYžыbУЪ:>��PЪ�xхХЩ— 0 [�Y!*К§MЪ}q:Ћ{ž№ZGЖѕЈ‰”џЖl іƒiУ~N5Œ$ЃЖОшCƒ (§С%b:щЃзжmЯєг]Р$Л|RЉ` H)хщL єўѕ*с-Oј@ъ'WЬЃы—JYЋ1уsј~Т|/ЖИ/IPя ўЮ8›ƒ >ЎуkЉ№хі•Й|—wFjд„дŸ{юcєёG?BАџЮїЖšdЃh] “›ћтsЯ_МЯ!Ѕ)��Шш#ЪџЫ{фБЄ:НK(9ˆвЋ§лžБ˜В^-[›7‹|Бмqv+ЅђћNЩоХ4dW%ƒEzX1>нbІуџЬх`F§& ЖƒЛjYЛŸ ѕъ.пђ­~Ср VызЎј„оЋZ*r`~>_gжC(C&>ќŒЏЇšПЛ1‡˜ж wѕ8ˆN+ъп #ˆK—,[O'Ÿx?UUХљЛќŠD<†Ж0,C@* ФкжnЁPdвгЯŒ;hфHЙк75‡lУЭхЌЊУфч’Яa…aFT'(їЩi”ћП•VиT—Йf:Ov^%FєЄшёC(vH?ђ:Da~вKФMCзџыЊ šр1��Њл bАюN хvsХеEYš/[і_њАzЉˆnвd(ЗW&ЮєКЏ>аёuѕЯъHЯя2†:А h(€5Я<ѓнј/‹‚ч:‹й„э‡@{иŒ шТ4aтЃч@uђ�тЪЬtn|М:мё6йп.“іЗ‘КЛ–t?‹5Ш ю;| ХыOЩ>z<-XЙYEj&ЄпдiсрВp­ўѕу в�Ју”І"Нј#№{ HН&иџ›WOЇЇж}Ы—ZŸйL/O'#нм’Щќb;›&ьt( Яю,|„†[лŸўcєпЉs…3ш$_КЎƒmь}тГ‚�`nїмuЯиБЇ6ЂсL ЂАК’:yЬЪ*ОфPн Й=Гќй&Зkr†юDБƒњQbX)9}ŠЩЧRi61M“јІ�СH•‚u9ии(ЬdbК фRТuU}ЫUїр§/чpю˜oŠ<РFУŒ„xXўNДonz‡ЭУЇ5+)АДHј#В‹щŽnћбАьі f>Œ~ї§ њХЉ mЮ_eѕ?ƒяP" @=рЋ �№TŽ›ЎОіИЫЏИђŠж6P РФђ]љ e§ч[%%тй,Аš)Щc?Ё%‡–RbЯ)Й[Wёš тЊp‹WMгKТгŽ_0 4в6?• цН:О@k�@ЂšŽ^ј&е �7”:ОѓP: З{ї6ЭЌ]M?cАшsТь8žXи›Ц— ЃЎvNЃЬ!џл­oа#Н/МЯs—'ёяљ­ ’ і'ўЁN&ЧИБgtЫэњyЃЫП‘ћ7т.…П\FжЊJ1й^A6ЙнђЩэвМТlђБХŸфцЊїІ6_жЯBx–HhЯ=Рє5ж~лzLЯЄkІ‡ж}CY3[„x˜ЗУшЌŽшTы`ЯуТЫ7DшЋgа‚D b{bAк+Ї‹Аї›JўРљ[НІ’N9љZГІ ‘€я$уЌў]8АџЈB, ˆЧI2ј‘ЧŸ8пиd70Т­nХ"вK} Яk†ЇnЮЖDЛѓМyЋiцЬ…Дnm5ѕи•АaEЄ ;“mM’u3ƒ>ЋYE?ФЪиыЮЃЬд.ЁJx^gЮTЮ ТРlс,ЪА)„иџ|№_сќ1oЊ‰и,Д‚ЃT7†.ЩBѕИг3/П|YЖiћŽ Ц'73ўzф‘шЗПЅђѕrYeYt�ћППљъеГ$СlЃVŒxŽя5ZбЋЯ{iŒВ˜љџњ=]4ю)Б9Їаnr^2™\Drj<щ х`Д†Џ ъF<ƒopQЧТI/OЙЌgЯ]Š[mwЯЭ%§АІW^™)ъкxЖ_(ЏkŠГгкЏš0ё\к…Џ}[ж­Eh‡€œwюcДli9й!БAaœП™JњёPLЈh�8‚еA�фђшmšЁ'<vоXмц]Сѕš “п{ялєшФџdТЖыЌУŽљžЕnK~СА'L8—ЖNOуж#hьyЬќЫ/DпПR„} зMўш$“ћАы86‹�ѓбŒ•Т‰ �А2 [НqќеЧž;~ќ˜­и& ŽнCnў§ЋєТsгD];ещыћQŽi—№XЧŒNШѓ­<>Нџнїœ^pъЉ{ЗЪцдлщ]D?ўјGњЭЏаЂ…ыФ<Щ)ђЪиѓџЦ—=ыX я§€0и0ТЫh Ѓn<~1ъА!w<њиy†Ге(›Лљцзш™Ї?с› ЇВКвЌt’‰|cXыu гuИрТћ 1щ™ M#§§Џ‘dМMыЫkБkЈаŽ55 џKђkёјW ЬЄ›FAђ‘\Ђ^Ћс/ёрх§Лu/™0хЕЫ;–tЪoћЕŠ вюПџ]aѓУlяѕsXЅЭg•†'tъј ЛшРОсЉP�@v^~о˜WІ\оБoпЮлŒг$vPСSO˜Щ6дŠg>ёјGєэœхт)eiŸШЏaЩŸУсБо>Ёz�рљ#А^ЭеFС2BС]йИїс чю3fЬ ­ЂFЁвоџ;КфЂЇ… P7цЙNbЎу8+дЕтТ`ћл"e†нГСmvf­гyєќСcFкьН Ж%вZP?ТМXАp Нџоїxњ§№УJ1iЉjПœЕуЬ|§X:<ƒœ?xў˜ПдЮC™’<Нx\ђ‹гМшЮ;оц�Р~6Dщ—Пxˆ=кЕњц|зI2ѓ“+дiz Њ ŽЭb’6ФZЬИцЯ=sєЩ'яеЊзЏ gz…ЬUћЂЃ_япыЃиGСLяuŒ6Ў(_ћњВjZА`­и)|кч „ДWАє[* ‡%dЯб?нДPЉццK5№s}‚2€­‹№tюУwкЙЫнЌFѓ№œоЖ|T+TџнЌіИя?"… т8v!ЧБ дѕйzЌqџAWЋƒ?€Ђжп'>vўGоz‘ ˜…}ќgЙ„ЊЊbBBa“q§й<p„3f�ыч УVœАѕТU€ыјЁжз­ЋЂ+*hщ’2ZМИŒ–-[/m/ђљ*~Žќ(o- ;Фn•š#G1о?Ксќaў*(cЇАL�ˆо@Cјл~чПљЫгGЖY4`ЉцЩ'=@ыжVЩPЮѓж&1мPе…XvЎКБŸѓk76 ЄsёЛЏМzYiїn…­цУ@ђћлWйA§”LЫLBц,LaЋэ”R[Љph7=хњйIIЧЅd›gЛвgQкТ <Н|уЖ?ЪŸQЦRПJ1ž(эAэƒљАїшќYDвыпHжз:‹„а�Ї оїЊчžgт&к"І†дМ№Т4КўкЩ2…‰6гD|–ВgqХlH=l™ЎkЗB…Ъx№Т‹G_pУ ЧPЂ•ЄLYЕЊ‚Ž?ўoЌŽЃтї[џЇЌ~ ЇМюБABrдѓНJпsз3г+љ3ѕЃъѕІtpњ` aaї! p˜!љѕn#_пWfѓи…ЧУДЎЛѕіSw?ыЬ§„КkmЪЪ‰Xaд?{ќѓиу‡нrељhiЊСќhрІ†fфЇЖїБ7§і8jЪО†Э%€ѓпo}MГ“Њ..3C_‹ЁVuщ‚ОћTг„QЇ&)”ъ:ёQыafљиt ŽЯ…7ЯjОж—ПQэ)ЦтЛ7Ј9ѓЁю‘мЄšyі`}�€шL0DGvщV<nв3уВћїывъ™Ah€ыЎ›L/>џ9&9ІR˜p hжžьbuуИў|Щю>xчг.ОxTюQG ŒoMПХ–лnK—ZйўўРЮ—.оFКС”ПRЊ[ХЈћЙ,ЌE1dOКrт4(‚ф+fŠG‘4}˜D@ј~H;TџjѕzГv ЧkˆњђР#ПNbS0њсGЮ6Кv)hеА сп?ў1›~}й3иtOьuЃ`8’шgЊЛђ88;'яЄСCzьЯо~јШ#SaaŽИОжЖVАѓgž9‘Нђљ№kGЃЅVБ™§cѕѕЅiЕнPк|–кAP�jвUУЎЏUsІЏЃ4у›єшй†Ќ 0œС=HH˜qЬ=zэyыm'гаa;“Ѓœ•–і Д МяОwщЉ'>ŽVUUѓMљZЕ•f(ЛcЧќо={ї1ЂOЮЈQi№RЪa‰lь‰%-IАїЫ–•гI'оOее1я:vRЁ•\՘jJлл@ŸЅwЖмСnб 2 ­UŸяLЦМ”ЋcЅњо8mц3‡F^з9НX‡ ї}ыјТЂмв“Oй‹Ž?a8ѕэг™rr"*$IЧП`<яц2њ^ємЙЋшKБVЁс„?ŸП›v*-Ђ^НJЈ{їBёЄxвЩdЫБ1‚њіЙЯш†ы_‹Н№ЩdЁ(<q­‚ѕ#с­ŒaR]PhЪ”vŒ„bЈNхj�шЌg-Ѕ+ЋїЇйь‰hЬядmbyь иЁШбВtЬЭ‹P@_і J™):хQAAl*ъ˜K]иT ŒАЇЙ~ƒŸl“вЕ 0€ ЯиZ•>“ящœГЅЯ>'вЏN2>›=r„ІHRAРl‰-иhcІ7�:‰щj„њYПо"››x‰!˜‚нx gь GфыяŠŽ!Яе 3D’ъ^qaQэЖ[wBEюАУvkuЇЌ­џс‡sщ‚ѓї‹RДjД„*†“ŠJњэ5�ŒFF&eš (ZЖ=9@›jфЧћ9<z№ЬcўЖmАЌа.,ž2?CnЙы ?‰ŒГЯйŸnИсXѕоі ˜:$mЮfщŸ5cЁ~ЯsW$q„ЄАУКбE�bЛИйM@м;I�Й8…wfемб0­"г4;†™Ы: "–Н‹Емb‹o›љm'т њПFЂmЗѕyј%YY6нqЧ?щяО/4aћШtЃЅюДAЋ05[ћš›|oM<ў�ЄН'IsА+ЩšВ†aJo~njу>†9>%E…y_šr™ЙSiЧ6//з—FѕыЩд5єЗ(Fс8aТTКыЮЅ 6hЖ`ѕЉ‡“†Ф 6]BЙ‰˜­лIГ9ѓГчі�ЬA5К“ta&Тъœ`іKSПkЎ;ЎзЏ}DЋзр<†BІ`. -pB“IG8ŽКтІL E•П7 ЃNP Ђ@ѓуЋщйg>љ‰дyќv’?ЯuŽaР  Э€€§пnš6�:–Eя ж€љш Bж}0h+ Љ!чЋ~ю2rп=§Ь…ІпZщйˆ-rhŸ5k1};g-хx›"�tњЁ`>еЌl›r9ŒЭЩP.œьй!й~‹9TVVЊШсяM) ї'VџїрЃЗъ�с`j/ўэ6�š с`,€�P Ž��ъѕ>F–zЏGЗю%cЇМvy~ЇтМДDУ;Ч#жgВƒVY•7—ЊЏoќаЈ:uћњl6pВŒT5N“Z` •D!оGQ ЬGНщиэЪбi�4Hxщvрuќб+''їЦЩ/_к сaKЕlCGЃIб?№ќГŸ‹l`Цб–# ЅЦuЅŽ“\Ѕ^Ъ іЁЯ)UДI?ЈЅf*ГтLBєВB‘?Oš4nŸ}їэг" 7 ™5ЕqКњЊшнwц0уCŒїc,сU’V3ѓb2Wя‹…ПFjЉXфf“м‘J<кˆЧЧ GOьg‡ЏŸЃ*qј8~АѕшЎE}uwфсЗ+щ'j9�4F0= 3єаcOœ„|б–@3њъЋ_ 7^џ"е9BOKъrvа6 4AЪ\иPAЌОs КР|0і™?8€Ћ(уi\л Е� a]�`яУ[ M }мџ.н}ч[ЊqDу:ЩљЎуЌєгK–uЃ„:}ЊГjѕi­`ЃЯгЉYфпQz 6\ЌRЏo7žк�ВнмА}ќ‰ Ž9єа-г�№рQ$:ѓŒ тsT\’Нђoй;sФŽЋ$% ™*uЬ,œшћзОLfбFЯnК�“‘ёƒъGбо™њмэ’љzZ›0Ёl;ы‰Чž8яЈƒаl�шчŸўє{§*#ч9NbKўZJлgФц`д*uФяСri�™ЛTR‹вљx$/jеgши JвvЬ|=­M�І~њщЇ/Нџў§šэЂcшѕЬІ+/VфтAЊЛP&с‹HzхTHiљщ-Юъ:Џ™•К а&@WфtЭ}ЛГљ™дІ�р(`є~ћѕm� §(ЦœўЫ‡щ›Џ–1�DЃjE2›эЫ}]Р|”d—У;(ЪдыZRыcZ};IlМЙ№џУ3ЉЭ|�РO>yС‘8 Y�€єO™2K<њD5bzЊƒЪ$ъŒGBЮLЄ~ЛVб­MmІиД>xпƒgž|ќqУ6Л*щGn~ьиGшЫ/ ѕя{оЊD"†Lw #зЯЧE ˜џ?'Б-Mm�дnЭЯ.ПjќшЭn1‡єПѕжзtЩХ“єR17™ˆсyЎю…ƒНGг(ВrАћPћэЬoЕЁ “†яйяўчžg™fг7o ж{іЃbгуА~—Ѕ_4b@• џ.vН$›УCoWћMЄЖ��Мj�`УДюИхЖŸ?ћЌ§›Ќ §яОїће“р`ЫЖ§_АэзнАКƒЌќ€эІП-P[�@o@…&’c;w)Отйч/ЪAWёІœAљЬ!ŸЮaщџќГљJњН5j­ ЄъЙx<wЛ+Хn д��Ёa $Xhrъ>#Ž™0ёЪЯЯjД2ˆжяч_˜FџwэdїћЊ KУ!§X*†=o §pќЖЛbЬжІЖ@ЦB:с№бC‡мuзЉT\œWяjфј,XCgœўˆоь…žu‰x M—PѓHХBњЗЫFŒm…к �zЁIo{‘ш.ЖŽ4dчвkЎ9’інЗЏикTГŽпO?­1џW_-MХ§ьљЩž?т~фї!§тс‡$mЛє7ƒк � pс š З,k/пЗŽЕCV<Ÿ`шА]ЈsчтAK––бдї еЋ+SлЉl0ŒFЦЋ„�$}ЖЛFŒm…к�С…&ƒx cЏ~/;>дqќќє"y*69L­Лї§š„Lљ"ЙЃwЛжвПнЕamKд–�апЇšРjцюЁPhOбdZпљ5ЩDт[ж�АёAлИ_лўіИП™дж��Щљ$š %ЙаЄЇЩ�0-ЋГiyђQ~­XŽуЌV’&УћGЬ‡3ˆЪ_Лєom �€`ибM Ї�Рbh�§]AM€kд;^ЁТлеЎœі”явж�Ё!ж@Р1Ф†0�њѕhШAЭУёƒєCђѕŽW;оŽа-L[� Нк;~�Xn†…&Z€асЃїœЇŽѕюxеN›O[� ˜,(фwTC Иэъћ(ћwрhЇ-Єm�њ:�НšсbаФд@а2Яpk'Aл �2Џ)и“зКOsкСi[@;Е!Е`Їv�ьрд€œкАƒS;�vpjРNэ�иСЉ�;8§?ъФрнˆ‹p����IENDЎB`‚������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/icons/dcm2niigui.png�����������������������������������������������0000664�0001750�0001750�00000025326�11247202222�021525� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���€���У>aЫ��� pHYs�� �� �šœ�� �IDATxэwt\Ч•Їo#g‚�H$E‚I1)P”heK–4Ж‚ЧуuаJВVNыYлЃуДябйuЖзA{ійё{fœƒd-YВlYЩ"WЂВD1 "94аш§}јашnt7P8]…ї^Н ЗnЊ[ЗЊ^›хB9 ф0У@9 ф0У@9 ф0У@9 ф0У@9 ф0У@9 ф0У@9 ф0У@9 ф0УР Ё7To&wІpKMMщђššт57VЕuw-?}С3‡і‡Џ]НјhdДp_WGДbС‚ŠЦ†Х‹њ††Ђс‘Ћ,)ЩknokюыэYT^еm§}'jѓŠŽ]жммњїнз/„E&7ѓњ~z=1@свЅK+O?§є*ЁМbЩ’% j‹ŠŠъЪЫЫ)­z^EХт’‚ТКТ‚ТЪЁPДtАААњИuфWЖкh~IIaožйhqБE l4/d!]ѓђђ, уh$bЃЃЃCD‡Т ‹№бЖ‚с‘CzЉ"yЉj ќм†žџчпш|=3ХkŠ6oо\UQQQ­X3ўќњЪЪЪ†ТТТњввRЎ‹Eшšттт:ЛFЯхК–ш]вЌTQDЗ<ВЫFэРШАэ [гшˆЕF#6 Т"Вt4КЋщUх сO§ГP(dyЪЅ‹Лч™‡ЈтЈbDe"bŒб‹(ши1opшЉ…'Лž8Џщ№Г_Лћюу*ёКбрe6CЩЦч­[ЗЎVU+Im‘—ˆpKEР%%%% "fНžkt­аsiYY™AX=[~~О“Nˆ@„h.шšЏ€oŒиЫсA{VЂї8j*ПоFGmD’–DE<ЅAxOќ фЛКЧыcГ<Е›яbžJS(rЭWд?1EžETїhOЏхЗutVwv?ГєdЯУkКЛЏўйЯž§’й ЏїЕx Jrч-\ИАFЛЈККzЉ$uЩ8a!pƒЙ�т*VъЙHбWRьˆыЄk+зG’ќ}0РŠaQmЯШ§yЈпvHкЛEtЧ "іˆ= c ы‰uuЗ3г 0xІ€Šђђ­HŒZ ш5l,ьшД•]}{Nыэ$ПЃыСўќџЖэиБЃcІэgЛ|к №‘|ЄЎЃЃуі3Ю8уˆ/I'Љ-–tЧ%Ў'ЄПвюƒС?ћ<nќѕyDpЩšчдљѓ"ќж№€Bъ=eњ‡‡­OqŒшЈѕЩѕлš{ˆF@3Рв R].mY4dч [cgOЫpGЧж]‡нѓф“O>КџўГKКuІУ�y§шG?Мzѕъ/tuu->џќѓM*{ЬX—2їФLˆ‘ žиžјЄљ<м#ёC"ш3’є'FУжЂ4йn6$)яYŸЎсˆ Ж9&:А% žЂ�Ћч•EХv}i•ŽX[ssл‘––ЧŽ;іяЯ>ћьЃ/М№ТЋЦ )1Р 7мpЙЦёoЌ_ПўM§Х_Д-[ЖиˆŸ,xBЦйлПWc<ˆ{)2lˆ йБЦ}=#щ'‡%ѕ#6ЂёќЕ `  Q@ЛОИдn™ПаЮеЕНЃУ9вІ№иЁC‡~"†xќс‡юšЫ>%e�ЉћYхwhъuгђхЫнИ-ех/M0‰‚DMtŸJЧ�Љ?& ёл‘лсЅNћ†Уж>8`Нb�Цѕз[Рn@+Рд0ђ[ЪЋь5ѕЖXšІXssѓ‘ЃGо{фШ‘ŸўтПјГњ8ыž”>ё‰OмqѕеWЃ )–‘gлЗoЗUЋV™ ?ЇЊ!vФЯ›Ч‡‚d’ŒpH=г­mчлˆ$gDЦм MЙ:ЅюБш_ятc<Ђ;iњњ‘кEveeЕЃ4}‡У0‚I<ЃјгІІІянwп}=Гея‚$ч/XАр-LЧ 0appа†Х­žј0У€ŸЄЎi_!ѕэRщПАН”BS’јV@L№F Ю |24ДЪgёѕ–#ім@Ÿc„*1ќЈ„lХŠЖrхЪsOž<yюяџ{lрoЯVџЉ<nxЯ{оГОЖЖіL/сŒaІyМ ВIќ"еНSsјяєлСТ<Ы“&9млcЭ}Нo(т=Ђ>ŽiДЈнзнaŸ;кdћdлЫЏ�n* ПЖlйВT.!‚ufrŸАb5~йЂE‹ xЄF`œЊЉЉqZ€є™JОяŸˆ„э'ЃRёE…ж/ИПЇЫїЏЧБ>"рŒТo‘ЏыNMm?wЌЩžьэД"чЦ› iЊ}юM7нД)zгЩ›ЄўЏФт‡ј^к{zzЌЊЊЪSЄЭ$@| ЃћFэїЁˆ•ШЮhэяЗІžngшНўЬМЬБ.ЃŠ]ђm|ѕDГнпйfуiЇvZHён™зžМd\Х/Ч^ѕˆь нззч$CаЇ%Џ:ё[зЈˆџKЛ,ПR}Gњz{D$.љЦ}ƒз—5жЮ?wžА_vœАQiCl0iџ фтйшН›nЧVќŽwМуBЭћoУ'ъgЕЌННнii†1€›vˆјwkŠїJAШy‡zЛэxџРЋ?ЏW_=|Б8™‹gЗF!‡Ўхч†­D Б&Џ@x‰жŠНќђЫ‡В GмY€ЄџХ  €HкLЄпЋ§_Šј; ђDќSљ'њч~nЏЖ r3(ŽК•BuxПzЧ{ВшJ*Џфеѕ€aˆkЛJўŸ іHьCvЅŒСњњњПSу[Г @\ЅПеƒЁG@ 0Ш"`ŠL�aъsПМz/‹ј%bЊƒячŒјИdЁ(оЫAЫзєВ|pШ*†#V!Є—ˆРEtJ0bЁщЖOйћ ђ­ПИШ†JK,Њ^SL0 …Вp|Э+.Б ѕZ˜сДњњыдЪэŠ€–Е0…4џœЇ0ЩъФ9ХQ3dі­ЃУізМЈ•чи!ПEFпЌZњjslс lжйm‹ДdЛZ+Hg”–лђЪyЖАЎвЊДќ\"cл щр‘Ј–q@…УУж+_D›ŒпУн]ЖЗНеіЈЭe%60žŒ—RЧ N=d‚”$e…я1A•†сэяДїзжœёсwНkЫПнsOVЕРаяzM—xUЯќщЧ`}~:џМ> ЋЛД9уa™8ђ~U}ЧћћfoЬwв.HКК­ЎЕУ6kїР…u mнЦ56OØ|<›ъ—л †іLэЏєЁ0Td…ef•yѓm‰ђ"б‘ˆѕіік–уіTЫ1л>nЊЋ,R;пФAЌlQ4kqБ„%O№ўІВФ664d}˜Т�šчoЦс�Љ`њчНщі‹ПKэНR§%RŸђ&эя5І>YH<Q‹,+[Oк[+Њэв ›ЌЎІжЂ0ЏІYЮ#щš.xf@ѓsWVи†ygиYЋзи{Ѕži:`Пп{аžЋ,ГсE Ѕqду Еd,LшZV<ЫХ\Ч‹ ЌcQэuQлќпBієии[ ƒч) Рєiї’Ž€ыыъъ&$%v˜ып4эЯГq4г=6ld=€xСЙИЙХnЈЊБ7ŸБ•Я“ЯBГ…"™ ]БpТ є Xы!—ГЩ.”=ёќО}іѓнь…вu5lGŠ-šб3і@‡<„KЄ9W­8уђ{>§>{зЭwfTYœBh0фЩ�мшЦТёT:Ь�>МT $ЛЧХћŒ\М{д œ†kЗ[уjVƒžPtшˆнавiџћœѓэк-oВ‚ђ2Зg�˜aтйдЭNтЈ˜{ѓ† іе‹.ГO чYэžк()Гиѓ€&ЈP;Эс№џќфіэ YЈжU1 Т .И€={+Нњ'š�5ш}Љ6LХš@= [)*Lc~›89›7a†lхЎ}іхъzћаЅ—[…†ЏСйа0гt|X8Ъ“‘ ѓ}{ѕЛ`яaГ“n›и4EЇ} Ѓui[ŒкШ/)ЉфР+_‘~Щ WOb�­ёoдј?/Ш�Ь�аXЩщІ|ЫЧ?XX`=ЊуИ,ўl.чВs7кйe—55лз7mБM’РАцѓNтг4Ыy5Ь5,Yjџу’ЫэцŽ>ГЃЧГТlwы”‹ђНс№п~пП_ а'1€Іg=$ ѕO 5Š{ёАˆё|H{№1IП–>Г$ Аb~kЋНЛЕЫ>{Щ›­ЊЖж†_Љз№Ф.сЈЖnНє2ћtДШŠšЄ и'8ƒ 4J h9^Œ с8thАџ+бЭ› gPЅ+: *экн�Б‘"Уќ?€сЗUћїBВМл4f зXщд25/ћњщqЈЕЭог3dОєЭ–ЇЙxPcM-ѕъЅ оkпt}ЖДк Ьœ X9tZ@] EЏМёk_КrІН›Ф�џз%еАл3Хt zщп­ЉЖC‹мМXВ3 ŽјВЌCкn§ЮюAЛхтK-"c-•�ќБ1^ЙTђФ+/Az@CТхчžkŸб†аќУЭв`(Г€uЩж&XІд/tu|\i“h˜nЭ…ЕЫЗV аKш!;щx�йђєWIDޘжё=|щ5%?’/BGХŒ—h~ы…ЛЃ]БАЦ– Ц†ЁйоCЋЏЮЗСGф™™}ѕ^AЪј:bыNѕ™:0JЏк|ž} "тkOХLfLЁЛeSUШвNЉЗ^sянS…%^О ЫNчю–ЊѓuБъ”ѕ€рАЏŸ7uˆXЏh‡лˆцнэВ№ЖЭ4АCHЋ­:|дўўМ ЕvI<s@�<˜о“‰WГЉЉЩКЛЛхсэ9&#ЗWя DќzХ:-К”сѓ€ ќ8pЌ/YЛ‰оск}ї– ЌщйУr?‹г2rс:gфB1qYyyс‘СЈЭO%jwКє hЕŒРМ аi*`љПЌmмНjЕSФЯšУjЖџмИкцk9:,ІL‚„Bт‘h€нЬ{іьљгСƒyќјё­К6энЛїЄъё^ЉŠГЮ:kфр,­‡ќ­іDМ}У† а§Ь`$yž`Њtp…ф`ћ‡7]d;ўВеŽЎ]•а.;ЃћO… ЭЖШШ;ПЙmлч?wЩ%m`�utчђ‚тгщTЇ€`ђэц–пУOrЌ.Г{!{TОыeћo”ћuHъ/‚ФGегmБЖgžyцb€oоsЯ=$ЂW4ˆ”ч^i‚…з\sЭGФŸ>яМѓц{с ‰ѕKл?œЖТn?Іщсbj–fK7„5ЫшжBбRйyEEЫj?і`NЗђO0€ЦХ3@š_ц% �В‘$пвуL›šњpН•—• і—=a7^pЉxkaŠ…4%BвбXHў_ўђ—џS?§щOџoКАДДДœјўїПџUћБmќгUW]u=лсBІУmљ<рц!Т�C…goВЗќю~{ЏЈвв ЋјVFЫЂЮ<:аъ˜aЫb‘ŠкЃФщЦ\ŒПнrќАЏ Зe6Ц~g,iaчц Ж ЁСzЅŠA,Аx‘ќ01уНNиьєбGпЙmлЖ‚yвНпЕkW“тлЕђm1СеFY73Ђ§X|aтїФцЪ9іŸжnАm{wXxХ2$-]Аt$ŽГ+г~…ЖШш[‹FKЎ…в>‰ьgeв�“ќЫ� а‰ №‰ EйяP�–ЕБ_u.kыД+зot‹:žИ˜{`ƒ9Ш3О@ №73%~АЏwоyчg|№СЏiЏОг0МƒрСHš‡-DЮXќсД:cхJЛ""[BТ’Iр<d4-;ˆežўѕ~Н6“zœ}ійѓ…дAЪ<LW1&QŸБO8™їfe“‡ЊuhЛN+{U5ѓ'цћ<Ш0ƒLхЄђDјtwпtpЇћўЧ?ўёьБЧюB!й^;r…љ‚pyMдFT’ћіЇ›ЕЖgф%ф;]šЂGdЃ•–фu dфv Ы—ЏoTФЊ0ь::] ’6Љўc’~–_Г„дВі“іцгWХu$yI>Э˜ЯЙ…ЇŸ~њіGyфЉЌРЇе§БПўѕЏёxЦЃm"Яž№БR[еА6—lhlДЕ}вкžt%NŠ86Ч}яHјмtы Пc�Is`O˜  `ќ?,щ?)•Gf%ˆ‘Ю/-е˜;§с:"†‘є?§Ѓ§шŸВв~‚JvюмйЎvnзЙ=Gp№Š›’ ЎKЅБ.еЙ@ыыgь˜’gК„!„Nы,Нb„ОШШ:QoziЉд1€цџ ppр`Я�Сє˜ђюаIњљИвdŠ—;…4!k{Kе|㇈І-�8P)т|K™ГЄ‚7{яНїўќЅ—^zŽvg*77,БЖЎЙН‹TЦ"лIiy—kл6mRL/8њЏЧ`‰ Љк�§И@Y b€6pnЌЏOЩž€Вдwп}їнїe †фЪ‘єC BЦџLУˆfљ‚…VЏ= RUюЧ яК{лыг­Ф3РB:”t4�Њфгу5РnЋЉЃЌЕ];8lKД—oК!8йГ ‡Яoе~кг La~х•Whjjœ‰�ЏUђ46†ЄIиA”iP=к—TКГЏ[ћбв Ž„Фyё:ТЌ ^zА јV[cfLЌnь^nН:UY^1эR/ŒЋo™7[ЇV4{)O=ѕдžжжж3б�@—/wюr}-Dўэ;Š& еЅ[‰c�€“|�ОЏќsЂыАˆ5 Ђe-Hѓ,а‘ЈB!gК�d§GфЈй3]о,Пj1iO*jвvЅС•ˆ4уЪФєuѓq‰~­№ЯЉ^HщмЦTёѕ`К!�в �SыHIљФ�ѓЕ 6/# ИЕXг!Чœыsd#Еa'ХУ]Њ0†WcшЊž™ж]ŽwwS]ZСOДw*ё`€ Š#іLсJIњ‡Иё2Sы‹Ÿ'ŸЦУ2Ээ e˜В•<^@ђ< ‚SGŒ8ЇAšчˆ’L†bЅъЋ 2„ вІ™ŠuЩJ7Р�Eв‘и�‚ql0з…г9РxЫAQœ.ХF`X;иk=уУ�] Rу”{ѕqrњјсKњ>žŸ­ж§a{ъщЇ'6’Т|žIaB>R\ущh2ЇЭtГ C4uІ™4ЪКL ялЅŠy˜tПDщ4�„ŽэixqxА1‚U0˜A>‡|ђsX”SDœЅЛX�8 ъŸŠђп=ЧЛђох˜Иž*уЄZщ–ь"vЯфV!"эТ„š‡›ŽБ9#QИљ›6mЊе7їXпŸГ цЏ… gb€6Ж”iO‡Œр‡‰•W†2f€иVA6ŸƒaK˜жЦсёx"рwgњE˜Њ?аh’киŠS|vхT>^аLVИƒ їЋ˜АdётХb€НёђЯVšіPЌAЮ„€ І3€ШLІcюељк‡ž^№6Р”R њ> #"їD†ёh†XЭЌfЩ4И’ Ъ#uЌњщ‹ЅЦ+иТ%f=Om=œi{щ–“іiP›ыв-›чћ‡:�ЈЛЬё•'!ކNФж?нГ7уџ„Г!zь{‹фЃ^@ћ,Цph•РНОЃѓіЙ„E hЉЭљ3•~Nћ4Ы•+„fNiJКяk,*звbzС1€ЗьS- А‚Л‡R-›|Дд@<kп…—]vйљйЈ?•:жЌYѓ!†Ц™0�к3,-к4,WА6‰Ь$фG"mыЋЊZг­#cЫ™a V3ЄлјLђУ€h #Ў]Л6Є} Ÿ™IЉ–Нікk/в,фšdУ_*uQОM3ЊCњV’щћ€е!.Д’žОУ_ќтгv…gиъ˜�ї#}shгOM}л<ыЧ)nИшЂ‹Ў}ллоЦтЬ–ъ|ХqЎjчЋbИ ›(N–”’јˆє.ЭВz*Д7S<ВOђD›U Оlќcк 2Nяˆu№&uB’wІмŸ†вШ„­‚o@уђ]ZкnПх–[tD!–І ы Р1й !]ёіI{ jэ Yћћђфгh•1л­ЏЂŽ<їмs-кlћіэывжёыЎЛЮДЁTkЕ.8фо|ѓЭŸОјт‹Џ№ГŸёwютq8не— I€ž<qLЛƒхТ—‘v@њOvYAг!ЋмИю)=ЅNФёЦ`€aЉвžt J~пбДŸ…РТАpу7–?єаCхђQ, S WфсJєк‹сƒ{Ђ Лaь!]{•7Ќ>ŽОя}яkSНQM‡;фrжЮЗш•кuф�­#аЎБЯфёљЈРїЭЧлѕЋ'њ… ЇЦZDEЇ0”ьиЛŸ^ •œЖњбS…RПssџ;™ ЄоLіsЦƒ"2-дwL{їмь�ТРўЪН†œ№uщZ8N ЗЌ:~пДu`Я4\ёŽzІђWЪ#эр=х“ћ0яHыв,цЂa эўц1цš\9]бˆ3Яї.-№Ќ Ѓ=:М›_8Вцс‡ПАў§яRBдMЄ_ўЊЂю~ќ]žfPŠ_vC€,ъI'‚ШќZ›ЮФˆТP ѕzg$"}ЄсЩd˜ „ђЂќ8RcpO˜Ф_=гјw0:…р;ЪгІ~ъЮДНшЭH1ѕLTх|ЇcевЦєпeСНж_t)РЗњ<СЖунП6ЭvьоНћѓŽФХ-ОpЊз`ХЉ–ЩV>1™ zфRw&ж)pсБ Іsя%•+Ф ."ŒтЃЦйХ=љ(Ы. к%"ЭžQМ†ёLу™Š+х№UPVЫ xHO{SxpHpїуXgЊTq,иЊнг'HЦ6ШM5Є“7е:SЭAишUИ'Wˆс ФЃoБиЩыѓѓž4п'%ну†+?—Q96Q™Š9?LžQ‚mвŒХкŠ+cз\р†AaD­ЇИ 4Ž\Ї`ƒOdАƒ‰ђЬV:№@ЦUэЭsїAЕЮ{ЮъАgJ јОјkЂBМЌ‘œ8qТ4spк$_фѓ№xМr…)uhХй)ZМJ Я‰`I7тCxэмЃŸЅљ‰шќ}ъp dЖ� @г˜ Y yЉ4ЖѓЩЪeыm"Q, 1ЎK0@$огЇlOT†ъї„Nдp ‘{†#ŒT˜хœsЮqк#QљlЅ{щЌфпћоїоЉz'6Y8+J6�чф]{БШLљ|Х‰ђЬf:€ƒцяНzЭ6ŒžиBO[гiŒ`џ=ГP;@N#xццЭц=ТЬP(GD?\yЛъž >э8Pњ–У˜@Sщ�ЏV€a“i*[6Еxщ1ўЉ K<ЁЙžўy7]Х~˜ aЂя UПћнязa–ЗЦ;+щgњБŽў(о2ЯхгDОdˆзщlЅ і0KА~:рРЧЄоbївц™м_ƒхнг&LЯ•z<ƒƒ`=мOШ566:i\6~ˆ“>e3�›Оw№ФwОѓ+еы ЉЉЉ]їЉStтњЦ+ш‘‘,OМrйJЈљD ќH˜мЙІГ|Ц‘nОєA@2s№ц№ѕ„єзXx=^ш7фЋ#дCDъс \D№D$PЇПњњС5;Њф–v§qВєvё}ш‡>HVЅc�MiєэСpЏ ЙmХt =№ё*№Шˆїn.в@Hіˆ ЖIФЯоэƒЛз8aHзš€›AР ^Њ!(Ц]1 &Фіmаgeє‹*Ю ШŽ)A8R sњ2”ЇMЯžQx~к%/eйnчЫЙ†ЦџХK ОwO§в€ЃВјџяНOs  3uнМ]_Ф :J'Љ$Qx5�„�_2 DˆQYрс'o0М pЃT/Wъ bO`1ГЩD>�ЦPƒЯ{ђв.ФCz фѓТBЛДO~ЂgкёLтћРtVc4kvEАN_7mб60C№=щ<C;1ўKO<ёФ‹СМБїžТУь˜ n№<pЩьѓЮѕе#9и<Г0w'ЂnйPŠДБЉd"…DвЈгзЁ N|ў0Фb>ЭчbРQЂ@=0‚јH~ъїpЁ-hцЂ-џонŒчѕiРЈЉмvСr›ю‹<#ёžz‚QLˆ{_KС"л”р€Ц”мг�œDgшРk% aР—Œ<МБWІ` xёъСЬЭНjі8 iDˆЭ3эA(ˆ§’h€dLрыђзXќљ6 ,&Y€0Ё4зŸ§ы_џ9YоtоM0€ддA8(�&№їя<тщ<Ԙы@›РTŒ*ЯВтЌtоEєёїMЄB}рЮЈ`/yщ†!NЄšЕњOН ущх  ђЉ›!E;АЎ­QC оРdL n€ЧСŸ 3№0„i'єП†O&Ш–QђˆЛі3VбX,0<;Щ3a …ш™"#(2(дЂГэ;_б‡"cQŸІу35ќаSПˆиЏІjяАsУЃvХКѕЖvХJ+еЏ}фщШYОжпщ'щƒшєў#сHДx>Q�� |IDAT†"*Ф“Ю{ЁLLQ&ІиЈЧЛvЛaз-є?ЅЇЦЧЅ@QЗќЧћ7–49MШЯu AќгІ 9О|ђх_§ъW_8•+;wA8ШX‡К ЏЯ�^Ђ<sЬфыI*ЮЗ ЋфЬV$nS…~pZœˆ4Эў я lзї…ЯоѓŠ]TSg5иЂљ5"b‰˜AЬЎЌиѕ-~гзВlЁ†~ВžУ|‹8,эбЅqПIУЦі=ЛэБУ-мPoѓе\фOлl}cЃБНЋ@ћњјl~мнkЉжнSЗоMмѓьЃвi;Oyѓм§иPувDќbђ—_йљЅѓ›/ЦЃХLг&@г#ЧR…epћt•ш‡ bЎ˜`LZeН—щD-V8АމлШмŸeэŸдјњИДеу’шЂ]Я[Уаˆ5ъ Ц2Ы^TZfѓEєri~АцЗ…t\›ЯГѓБы#ŠMњ�ЦбТ|ыYЂэ[ыWˆcєkЇД­Ђк! сЯ.їКŽЇ…єЫ)yJ H{*-_яxцЪoћkїЊ,_umБ…CУMѕeeпk ћџ'р8ЁysЋ8oљtЭ@p�Ђ{mс™Цk•э0б–4�чьКk’–xЕ<ВђУbšƒ’љƒВЄлЧЮхїj[y МlЖdЋvЅмОЕхв0В7Hї„%?І“M ЎћюŸ{…І‘qJЖ‰ЄёІ]|,тйэF­f.ыјй7П§m˜0С�ЊОWCРAny*M1~BtтaЦяy†AВХО пNDsšЦAh2р=3bj,—ЅЇ{—0Е$љ‰ѕ-a№y‚\БёВСєdї S>џ’нКlЅmЉЌИџ/П§~В"3}7i5GаюT+„РФЋ~_Ž4Ц№дў}ЊW_u#щ|hqdвQєTk“тTЕ#4Ф&ђnЎФч„$џƒЫOЗ7m–ёз|П>N™2M25Ј˜*эaк—J@К‰фgЊбНФC$IЧ ёљ}žxmј2ёЎСќ #H№%0ŒhЦRДgП}lуйіжUkЌYч=њoГнХI  У–;˜с&…pЩ„D 0Eђо.G№D2цЫЏО\Мі!;ПЩ3ђF Пgт§MVЇb~ђMлІz}Q}”лњщў№‡ЧУA6г&1€іЌэ Щ+U<�sTм—ИPƒС3–|ŸюŸЙњ2СДиtWNHуЛЏ{ €дїъ4їЎ=vVY…нvљеж СуKЋa rYпЉў'—ТXde№<ЩаxsD†рQ${К�С№ŠЁ1т”ђ^’c‰LїїСі|Zl9ђ ј|_/Ҙљz Ь.а”ћXОŒНџиИЪ>щVЏEA|Œkэsl‘ЛљЎЙшо$  ћ%б{u]1]уh€…‘D Ќ#1ƒяSО—рлюЗR.є*g„kqR‰Р:dvр ­š7п>tХUvVuћѕQMќ\Рре:ХЯЕ{'э“ОуUЄu‰e�мŸЯ‹ИWOW eьЧЧ>—\Т|Ѓ]њ6РR= Q2 _“1M…a-Ї„Џ”ъяЮ9зЎ_ОвЪѕ~H3ўІІІˆж'~ргfћ:…$блQыоВO�~t?н#š k’ž aкp?ћўђNї=a[КиlМsВG&œ4 ЪЮIВрsD“К1ў˜п|TЎтЛ\›HоНz­~ъЅxlЌ7š=\єMпdzH?mѓЌO›эыаТУѓЌŽщ”эФњt" рX€f&€A8›ФЇW†�f|k?ФїіЕШc‹ъ-Z/F`Yфњ˜ЈйH.ч“аiЦАыаЗЊ М>aSЌУ#mиh{њ[]Vю|ќ�dl`ЊЬЧЏЄўџ5інl>Oa�ЉєНкыі‚cнт&",Ф@ А‰uuЦЏй Ž д&ЌpšvЯ湕Ж2}m;днc!MЇL?ЯЯЗGѕ#ŽŠдE-Вˆм_кL юЂў ЧЬ&­1„tL;ЪE B­Ю,\Ќп7МњДхЖBы |IЯп% гсУ‡wiъї`Ђ<Г‘>оЛЉUпtгMW­ZЕъщG“Ю‚ШёDЬДc‚ЦЦF—'ГLm!НˆOdhвљ}Ы“ЦщЊ,З?иoO:hэ'ѕДсS ЁV"Wo…ќјU•EK№IжљіyЧиLє�'†Q`j=Ђq|PіЮ€>Œ…ЧIзwўЃzvю[еUЂ=ыЄ9/Yоhчз.АZЉ}Д{’њХPЊЏ~юЛп§юЗ’хЭіЛ„ 0оPЩЧ?ўёlllќмŠ+ЪМKжр|Љ еuц™g&еОL&Wк!pХ№дЉVбЖиNгЮ_B‡~ЈbGGЛ=}Дй^>vдŽwžДФBJ *чъ`h€ји œЩчžшЊз?Ў” /\!>LХU1ŠS'ц ееѓl•–˜7/^bg‹шKДЬЬfЋхJ)0|jkxЗОkАQёpJ…В”i ГгTіоїОwуŠ+юа‡‘оŠгmр%Юе2NкзюпMSmJЏƒФї  MЌn Ъvof(xжкu0^?2bGz{lЗbO[Ћ5щк*н+U=AРi$r `[+ƒ%"ю|э"ZЊ§ЋєiК3jыЌБЂвjиdЂB8Ј2љН$4щж­[яМуŽ;>8ЅэYNћOюКыЎ—”ыmЗоzы-О.FX 1 >УDРVРЩё=с=t<ћ5к№їЄЃ`нђАЄT_НЖ5Uѓl]ЕО`zњjїгjќИRЛжє[њz­]Л}кtп-енЇЏsБ]lDвЮЬ‚Кђ5­,AЫŠ‹Ќ‚ЫpЋ“!ЗPŸЎ_ O~]ЫЪЅк!8§FН;ЃtаXИ=ќ\уНƒјьO”ѓgN?WJ р3џр?јб%—\ђ;m›ўŠся9|1—§Оv†‰xѕuЄ{Ѕ."'xІ]чb™ю”%0жš~ A’[eЋ$­Ёњ1ЅЧF,ˆŽФR&тoпArЯJsmбQCKЏNѕЧЖ9жвЉџЩопЁўхїRПvђЇSЅчю.-�,<TŠџEFт/Д3і8—�{ши ь\Ін€>xтOFФ”ŸќИж-ўYЛr' ГžA(МWйДеАv|ЃHўоЅвyяпљМОЮ`zМћ`ZАž`КПh‚э9пЦ\_Oa:Г–‹oЛэЖO‹№З‹“+8пЦА .6ФK‹ЭяэЂяШ`zЗ~ŒŸˆЩ…b`*u2Ј№њыЏ_ЋƒЅŸ”ѓЈ^jY&ѓX@Eћр5C0ЭП ^ЩdЄn\ZBк­{DžЪ;Ѕ._5‰ ТšЛЯa ‡rШa ‡rШa ‡rШa ‡rШa ‡rШa ‡rШa ‡rШa ‡rШa ‡^[јџ;Вч7v!Вз����IENDЎB`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/iconfinal.ico������������������������������������������������������0000664�0001750�0001750�00000073306�11041305666�020321� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������00����Ј��†��� ����Ј ��.������Ш��ж)������h��ž0��00�� �Ј%��6�� �� �Ј��Ў[���� �h��Vl��������Оp��(���0���`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ёё№ššС~~ВyyДDDž++˜EEЇЇЇгЃЃФ������������������������������������������������������������������������������������������������������������ххьППлОNNЊ “Ž��’��š�� ��Ї�� <<СВВЮ������������������������������������������������������������������������������������������������ддшЂЂЯ``Г™����‘��›��Ѕ��Џ��Е��Л��С��Чб��а/0к���������������������������������������������������������ГГУ››МvvЋMM•66Œ‚MM•……Н››Ъ­­еššЯssРGGЎЁ��˜�� ��Ќ��ЕМТЧ�Э�в�и�о�х�ы№іžšџ������������������������������������������������•—ИXYš=>Ž-.ˆ"#‡‡‰ ‹‘–��“����Ё��Ѕ��Ў��ЙТЩ�Ю��г��й�п�ц�ь��ё��і��љ��ћ��ќ��ќ ћUeџ������������������������������������������ОТл8:”y��~��…����”��œ��Є�Њ��Џ��ЖМСШЯжк��п��х�ь�ё�і��љ��ћ��ќ�ћ�ћ&�њ@�ј[�јn�ї~љМHˆЭamаnwз‚‚и������������������������������#Ѕ��Ž� ІЋА Ж��М��С��Ш��Ю��д�к�р�ц��ь��№��ѕ�ј�ћ��ќ��ќ��ћ)�њU�љ‰�јБ�љд�љѓ�њџ�њџ�єџ�џџ�­ѓ��с��д��Ц��РЙРRRЯŠŠуЮЮ���������������{}и#ZО|В�ЃМ�ВС�КЧ�КЬ�Вв�Ђи�†о�]х�*ы�№��ѕ��љ��ћ�ќ�ќ�ќ��ќ��ћ'�јv�љМ�љу�љџ�њџ�ќџ�ќџ�ќ§�љћ�ѕњ�џљ�Ъљ�њіяхж��Щ��Л��Џ��И;;Фjj���������Ъџбoџbёwнц�фз�шт�юч�єь�ќђ�џі�џљ�ўћ�єћ�Шњ�~љ�3њ�ћ��ћ��ћ��њ<�їЉ�їђ�љџ�њџ�ќџ�ќњ�ќј�ћњ�љћ�їќ�џ§�џў�Вў�џ��§�ў��ў��§��ї��цзЭЛ��Ф;;шЧЧ������;ћ?ћ �ћ�ѓЬ�іќ�њѓ�ћќ�§ќ�ќ§�ћќ�ќќ�ќќ�џћ�џћ�џћ�љњ�Вљ�Sњ љ�іќ�љџ�ћџ�ќћ�ћњ�њќ�љ§�ї§�њџ�џў�џџ�еў�eў�ў��§�§��ќ��ў��§��ў��ў��ё��с��зХ��йmm������%ў%§§џ+�ўн�ўџ�§ѕ�ўљ�§њ�ќњ�§ќ�ўќ�§ћ�ћћ�њќ�§ќџћ�ўњmВљџњљ�њћ�ј§�іў�їў�њ§�џџ�џў�§ў�Яџ�mў�џ��ў��џ�ў��ў��ў��§��§��§��ў��ў��њ��ѓээ������)§))ў)$§'§ §.§Я�ўџ�§ў�ўљ�§ї�§ј�§ј�§љ�ўљ�ўљ�ћјљјњїЊџњќЗњїћў�џў�џў�џџ�іў�зў�œџ�Jџ�ў��џ��ў�џ��ў��џ��ў��џ��ў��ў��ў��§��ќўџџ џ++������LџL8§72ў2+ў0!§ў �§Š�ќп�§џ�ўџ�ўџ�ўџ�ўџ�ўџ�ўџўџ�ўџ§џЬњџўџџњAђў�а§Ћў�xў�Eџ�џ��ў��џ��џ�џ�џ��ў��џ��ў��џ��ў��џ��ў��џ��ў��§ ўўўў11ўШШ���dўd>ў>AўA;§;1ў5'ў!§��§�ќO�§�ќœ�ќА�ќЛ�ќО�ќИќЎ�ћ"њ‰эіoўџLћІ-ў�ўў��џ��џ��џ�џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��ў��џ��ў��џџџ!!џ''џ**џ''џ__������/ў/GўGLўL@§?:§=§�ў��ў��ў��§��§��§�ќ�ўќ��§�6§�џћ�ќў�§х�ў"�ў�ўџ�џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��ў��џ��ўў**ў,,ў55ў55ў88���������ˆџˆGџG[џ[MўMLўL(ў(�§�§�§�§�ў��§��ў��ў�ў��ўL§ў§ћњ§§ўcў��ў�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џџ((џ66џ88џBBџ;;џ@@������������MџMRўRbџbXџXAџAџ�ў��џ��ў��ў��ў��§��ў�§��§�Z§�џў�њј�ўџ�џЅ�џ�џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џџ==џAAџFFџMMџIIџII������������џMџMlўleўeYўYў�џ��ў��џ��џ��џ��ў��џ�ќ��ў�`ќ�џ§�ћњ�§ў�ўк�ў�ў��џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ--џKKџLLџUUџMMџQQ������������������DџDRџRxџxmџm%џ%�ў��џ��ў��ў��ў��ў��ў�§��§�\§�ў§�њ§�§ћ�џќ�ў?�џ��џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џџNNџUUџXXџaaџRRџ……���������������������bџbhџhƒџƒSџSџ�џ��џ��џ��џ��ў��џ�§��ў�M§�ўў�ћў�ўљ�џџ�џu�џ��џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џџ��џџBBџ``џ]]џjjџ[[џƒƒ������������������������fџfVџV|џ|…џ…EџEџ�џ�џ�џ��ў��ў�§��§�6§�ў§�ћ§�§њ�ўў�ўŸ�ў��џ�џ��џ��џ��џ��џ��џ��џ��џ��џџ��џ��џ џEEџffџddџrrџjjџ__������������������������������kџkQџQˆџˆ‰џ‰TџT џ �џ��џ�§�џ�§��§�!ќ�ьќ�ў§�ћћ�џџ�ўР�џ�џ��џ��џ��џ��џџ��џ��џ��џ��џ��џџ++џZZџllџkkџxxџmmџ\\������������������������������������]џ]^џ^“џ“‘џ‘pџp.џ.џ�ў��ў�§�§�§�Ч§�ў§�њќ�ўџ�ўк�ў�ўџџ��џ��џ��џ��џ��џџџ77џXXџooџppџttџ||џssџss������������������������������������������uџuQџQ•џ•“џ“‡џ‡bџb#ў#ў�џ�§��§›ќ�џў�јћ�ўџ�ўх�ў �џ��џ��џ��џџџ!!џ99џRRџffџqqџrrџttџџ‚‚џ€€џ‡‡������������������������������������������������`џ`\џ\џ˜џ˜џˆџˆb§b/ў/ §�ў�Xћ�ќ§њќ�§џ�§у�џўџ('џ::џKKџ[[џffџmmџppџqqџvvџџˆˆџzzџnnџxx������������������������������������������������������ˆџˆhџh‰џ‰ џ ”џ”ŒўŒ…џ…lўj7§8ќ гћ�ў§�ћ§ўи,ўGEўQRџ\[џaaџddџhhџjjџnnџyyџ„„џ††џ€€џnnџ‘‘���������������������������������������������������������������rџrRџRhџh’џ’ џ ‘ў‘‰ў‰Šќ…Z§lšќ+џљ�ќџ1ўК]ўLTў][џ``џeeџkkџttџ€€џ‰‰џ€€џttџuuџџЉЉ������������������������������������������������������������������������ЄџЄuџulўl§˜џ˜•§”“ў’‡ћнџ&џъ ќv\џhmўsrџxxџ}}џџ{{џmmџ__џxxџ™™џЖЖ������������������������������������������������������������������������������������žџžyўyuўuoўpo§lpћxЂъ…іu,§§<:џMMџVVџWWџ__џjjџ’’џЉЉ���������������������������������������������������������������������������������������������������|ў|!§ §Hћ@���ўГТўqp§ ў++џ::џooџАА���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџРџ��џџў�џ��џџ№�џ��ў���џ��ј���џ��р������р������Р������€������€������€������€������€�������€�������Р������Р������р������р������№������ј������ј������ќ������ў����?��џ������џ€���џ��џР��џ��џр��џ��џј��џ��џў��џџ��џџ„џџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��(��� ���@��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������……НaaЄ……Н������������������������������������������������������������������������������ЯЯу……НRRЄ55Ÿ›Ё^^РССк������������������������������������������������������������ххэВВиxxП44Їž����Ј��Г��Р��Щ��Я$!и������������������������������������psЃLP•26ˆ‰45ЂCC­<<ВЌ��Ї��Џ��Н��Ъжп�ч��ю��ѕ�љ ў€Žџ���������������������������pkГ!Ž�ˆ����˜��Ѓ��­��Г��М��Ц��гпш�я��є��ј�ћ&�ћJ�ћj�ї†�ћšъН6`ТIZН]qЯˆˆмЛЛ���������������<Е�SЇ�zКТuЫ�Yе�5о ч�я�ѕљ�ќ��ќ�ќQ�ћ–�њб�љё�љџ�іџ�§џ�џџ�eњ��щ��з��СИР]]���������zџgђtыђ�іу�§ю�џє�џј�љћ�кќ�–ћ�Aћ��ћ�љ€�їр�јџ�љџ�їџ�јџ�ўќ�џњ�хљ�]њ��§ўќю��е��П��Юbb������ќ §ћБ�ћџ�ќњ�ћј�њј�ўљ�џљ�џљ�ќјЙіМ/ѕџ�їџ�ќћ�џњ�џќ�џ§�уў�‰ў�ў��§�§��§��ў��џ��љът������1§2'§$§§�§џ�§џ�ўџ�§џ�§џњџ�ќџ.џџ§оџќ џќ�ќ§�сџ�Їў�]џ�ў��џ��џ�ў��ў��ў��ў��§��ўџџ§^^���>ў>;ў=3§2§�§@�§Œ�§Г�§Ц�ќЭќШ�ќМRѕЋ§џŽќcc§�8§ ў��ў��ў��џ�ў�ў��џ��џ��ў��џ��ўўў$$ў$$ўss���QўQIўIKўL:ў<ў��§��§��§�§§�§�pњ�ўў�њЛ�§��ў�џ�ў�џ�џ��џ��џ��ў��ў��џ��ў��џџ00џ55ў88���������WџWZўZWўWў�ў�ў�ў��ў�ў��§�…ќўўњѕў"ў��џ�ў��џ��џ��џ��џ��џ��џ��ў��џў11ўAAўGGўEE���������tўtSџSqџq3џ3�џ�џ�џ��џ�§��§�‹ќ�џњ�ћџ�џa�ў��џ�џ��џ��џ��џ��џ��џ��џџ��џџNNџTTџSSџpp������������iўinўnfўfў�ў�ў�ў�ў��§�€§�ўљ�њў�ўš�ў��ў�ў��џ��џ��џ��џџџ��џџHHџbbџaaџrr������������������bџbџZџZџ�џ�џ§�§�e§�ўћ�ћў�ўС�§�џ��џ��џџ��џ��џ��џ��џџNNџllџllџ__������������������������eџeџqџq!џ!�ў��ў��§�Dќ§ќ�ўџ�ўмў �ў��ў��џ��џ��џџџAAџhhџxxџ~~џ||���������������������������tџt]џ]“џ“џYўY ў �ў�ќ�цћ�ўў�§х�ў�ўџџ**џ@@џZZџooџ||џ}}џttџff������������������������������������nџn‘џ‘§ŒџŒb§_§(šњ�џў�њсў@:ўLNў^]џjjџuuџ{{џ{{џxxџ‚‚џ››������������������������������������������AџA~ў~ўšў—‹§“‰ћcљџ§ПL§_lўpmўqqџssџrrџssџ‰‰џŸŸ������������������������������������������������������‡ў‡}ў}p§li§xЙщjўiiўiiўYXўiiџ{{џџФФ������������������������������������������������������������������§}ў}������џўiiџ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџџуџџџ�џџ№�џ№��Р��Р��€��€��€���€���€��Р��Р��р��№��ј��ј��ў��?џ��џџРџџѓџџџџџџџџџџџџџџџџџџџџџ(������0�����������������������������������Е���П���Ф���Я���б���п���р���ъ���ь���ѓ��є��ћ��д��>Ч��LЅ��PЙ��Фћ��ъП��ёњ��ѕЭ��ќ��ќН��ќб��ќт��ќџ��§���§��§„��§џ��ў���џ���џї��џџ�љ�rњ�ў��ў�џ��џя�џџ�Й�љж�ћј�§�ў��ў�џ��Њ�ќ�7Ѕ� ј�ў�џ;��ќ-�œ�Ј�ў�џ� Ж�Ј��ћ�!�$#œ�%-п�-ћ!�0ьF�2ў2�3ќ(�53Ї�8џ8�:ў3�;§?�< џ�<хџ�?1�B�ќ�Iћ��JJЂ�NMЕ�PќP�PўR�Q§Z�TўS�YўY�YџY�Zў\�\ZЪ�^ў`�_џ_�`�і�bўb�fўf�gџg�oџН�vџv�wwГ�zўy�|zК�|џ|�~ћ�ћ�€vА�П�ƒ�њ�…§…�††Ш�џ�ŽўŽ�Žџ�ќ��•ў‘�šњ��›ў›�œuЪ�Ÿљ� ˆг�­ўH�ЗЗг�К�ї�Х �Х__�Э$�а���б�і�м �о�њ�хџ��ю���ю��є �ѕ�џ�ї�l�љ*��љVT�љЎ��њ�‘�њo�њд��ћ�‡�ћ�е�ћц��ќ���ќћ�ќ14�ќЙ�§���§��§�&�§6�§�§>8�§LM�§TT�§Yg�§�§Љ2�ў���ў��ў��ў��ў��ў�ў�ў��ў�ў ��ў�ў77�ў::�ўLL�ўPP�ўQQ�ўUU�ў]\�ўcc�ўpm�ўtt�ўї��ўџ��џ���џ�ƒ�џ�є�џ�њ�џ�џ�џ��џ�џџ�џ��џ�џ�џ�џ""�џ&&�џ44�џ;џ�џAA�џ[[�џaa�џcc�џee�џmm�џss�џtt�џyy�џ{{�џ}}�џ�џƒƒ�џ††�џŠŠ�џь�џў��џџ�џџџ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������waO@Fc���������������hkP=0A��������gL?689<) 3>Jsu�����X2  1Mix„‰‚~{z���C+' #"[}ИЙЙЗЖ “|y��;5!(!KФМŒ•ž““žЛ—ƒЌ�IE7*_’…–ЂžЕЁžžžЄЈСš�TRH-,oГ†“К ŸЕЕЕЕРЉЊЎ��VY4%&tжŠ”ІЕЕЕžЃžЊЋ­���]`G./qеˆžНЕЛЛЕЕТЧШа����UdD$fД‹ЅžžЕЕОУЪЪЦ������^l\:NеŽЇŸПСХЩЮЬЭ��������ZjnWB€д˜™АЫЯбг�����������rmpev›БВЮвЬ��������������bQS‡‘Џœ���������������������������������������������������������������������������������������������������������џџџ�џџџ�џџџ�џџџ�џџџ�џ№?�џ€?�Р��€��€��€���€���€���Р��Р��р��№��ј��ќ�?�џџ�џџџ�џџџ�џџџ�џџџ�(������ �����������������������������������Ъ���ж���у��Ы�� О��К��ђћ��і��ќ���ќџ��§���§Ф��џ���џй�Ћџ�шџ�њ��§ �џк�сk� ;Љ� ў �ўk�KŸ�!И�&ф� џ�'џ,�->џ�/џ!�0�ђ�9ў+�;2œ�M§]�PPН�WjО�Y§Z�bY �f§f�hџk�iу=�jџj�lўk�lџ�oўo�oџp�t�џ�}nЏ�‹�џ�Œўˆ�ŽЮ�ŽљŽ�љЩ�џ��‘ŒХ�Є�Ч�ЄЇд�Ќџ��Ўxœ�Гў�Фџ�ХZn�Я[[�к��лH[�уЋB�ё���љ���њ���њ�j�њ$�њ��ћ���ќ�ќ>5�§���§�§�§{��§}{�ў���ў��ўџ�ў��ў�ў�ўBB�ўKM�ўNN�ўPP�ўdd�ўjj�ў‚‚�ўР�ўы �џ���џ��џ�ž�џ�ѕ�џ�џ�џ �џ�џ#Ѓ�џ))�џ::�џT]�џ[[�џuu�џ‚‚�џ‡‡�џт��џџџ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������&!��������0793#�����$/18A>;�) =Scba`C@? 5hFGDENegj�% :OITRd`VWY�*( <^JM`QUZ[���+' 6pHLfilm�����-2",_KX\no��������4.BkP]�����������������������������������������������������џџ��џџ��џџ��џŸ��р��€����������€���€��Р��р��ј��џџ��џџ��џџ��(���0���`���� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џ“��џ№��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џя��џF������������������������������������������������������������������������������������������������������������������������������������������џ��џP��џС��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџњџ<����������������������������������������������������������������������������������������������������������������������������������џ��џб��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџ==џт����������������������������������������������������������������������������������������������������������������������џ)��џш��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ##џџhhџџooџџџџџ��������������������џЊЊџџпџџы џџџ џџџџџџ��������������������������������������������������������������џe��џЧ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџLLџџrrџџppџџџџџ����������������џ��џ))DџJHnџ[W‡џmgcџшзџџъ ����������������������������������������������џ ��џn��џЁ��џе��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџhhџџwўџ“oєџџUџ��oџ��Œџ��Цџ��фџ��§џџџ>:џџXTџџXTџџKGьџtnXџџП��������������џ ��џМ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ�јџt�жџх�Юџќ�ьџџ�џџџ�џџџџџџџџџvџџџvџџџaўџџџџ��џџ��џџ��џџ��џџ��џџ џџ)'џџTPџџtnџџrlџџhcџџOMxџџц џџџ������џ}��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ�џџ�,їџ�ГЮџ�овџ�їчџјШ§џџZџџџџџџ�џџџ�џџџ�џџџ�џџџџџџ8џџџwџџџnџџџ9Бџџ��џџ��џџ��џџ��џџ��џџ��џџџџџџ=:џџrlџџtoџџrlџџC@№џœ•&џџџ������џд��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ�5єџ�обџ�§ђџ�џџџ�џџџѕџџлОџџџџџџџџџџџЉџџџ�џџџ�џџџ�џџџџџџџџџ^џџџsџџџVяџџ$џџ��џџ��џџ��џџ��џџ��џџ��џџџџ џџ%#џџlgџџtnџџtoџџUQџџ@= џџц ��џ��џќ��џџџџџџџџџџџџ��џџ� џџ�зџ�ђтџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџіџџ§ъџџџџџџџџџџџџџџџџџџџeџџџџџџџџџ*џџџfџџџtџџџ*rџџџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџOKџџlgџџtnџџjdџџGDџџC>_������џш��џџџџџџџџџџџџљџ�ќёџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџЊСџџџџџџџџџџџџџџџџџџџџџџџыџџџ%џџџ/џџџiџџџsџџџcќџџџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ:8џџc^џџrmџџniџџPLџџ0-š����џвџџџџ џџ џџ џџwоџћьџџџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџтШџџџџџџџџџџџџџџџџџџџџџџџџџџџМџџџnџџџsџџџ_їџџ(aџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ*(џџZVџџqkџџpjџџSOџџ1-Ѓџџџџtџџ21џџ55џџ=хџ5ўџџ'џџџўџџ џџџ џџџ џџџџџџџџџ#џџџ8џџџGџџџWџџџџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзџџџ7џџџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџRNџџojџџoiџџQMџџ53Œџџџ@@џ%00џў~}џџwЬцџvўџџiџџџXўџџHџџџEџџџLџџџTџџџgџџџjџџџlџџџoџџџqџџџtџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћџџявьџџџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ" џџUQџџpjџџlgџџLHџџ73|џџџџџџJJџгžЪђџЊўўџВўџџЈўџџ˜ўџџˆўџџuџџџtџџџtџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџџџџџџџџџяаьџіыOџџџ џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ,*џџ[WџџqlџџgbџџB?џџSKDџлџџџџћћџ3АўџџУўџџЬўџџРўџџЎўџџšўџџ~џџџyџџџxџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџњџџфЫеџљщEџџџ џџџ�џџџ�џџџ�џєJ�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ џџSOџџnhџџtnџџXTџџ:7Дџџу џџџџџџџљџ.ЉўјџХўџџаўџџФўџџВўџџўџџ€џџџzџџџxџџџuџџџsџџџrџџџoџџџmџџџkџџџѕејџчЫХџјю>џџџџџџџџџ�џџџ�џџџ�џџџ�џмБ�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџџџd`џџrmџџtnџџMIџџA?rџџЬџџџџџџџџџ+‡§ŽџЕўгџЪўєџСўџџЎўџџ—ўџџvџџџoџќџjџѓџ[џрџRџбџHџЙџ4џ|џ*џZџ џ4џјџ џџџџџџџџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џоц�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџ84џџojџџtoџџrlџџ<9ѕџz$џџџџџџџџџџџџ uўu冧†џž§žџž§žџ„ў„џcўcџ'џ'џўџ џ џџџџџ�џ�џ�џ�џ�џ�џ�џ�џЉџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џѕ<�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџ20џџTPџџjeџџtoџџqlџџ`[џџБЈџџџ����џџџџџџ џѕџВ§Вuuўuў’§’џ § џŽўŽџs§sџ7ў7џ!џ!џўџџџџџџџ�џ�џ�џ�џ�џ�џsџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џыw�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџџџVQџџkfџџsmџџsnџџjeџџMJџџппџџџ����џџџџџџџ№џџћџ@}ў}Х€ў€џŸўŸџ™§™џ†ў†џPџPџ8ў8џ$ў$џ џ џџџџџџџ�џ�џ�џ�џ=џ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џфŠ�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџџџ85џџlgџџsnџџuoџџojџџ[Vџџ=:лџџџ������������џџџџџџџїџџњџ5ЮќЮd‰ў‰џš§šџŸ§Ÿџ‰ў‰џsўsџ[ў[џ/ў/џўџџџџџџџџџ�џ�џбџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџџџџ�џзІ�џџ��џџ��џџ��џџ��џџџџџџџџB>џџ]YџџniџџuoџџtoџџqkџџEB§џOJgџџу ����������������џџџџџџџџџџјџ"џџџ9wўwїŒ§Œџœ§œџ§џŽўŽџ{§{џLўLџ7ў7џ%џ%џџџџџџџџџœџџџџ�џџџџџџџџџџџџџџџџџџџџџџпЃџџџџ��џџ��џџ��џџ џџџџ20џџc^џџojџџtnџџtoџџqlџџd`џџJFxџџш џџџ��������������������џџџџџџ џђџџјџ%Љ§Љ†vўvќŽ§ŽџЄ§Єџ ў џ•§•џmўmџWўWџAџAџџџџџ џ џџџhџџџџџџџџџџџџџџџџџџџџџџџџџџѕeџџџџ��џџџџџџ%$џџA>џџZVџџrlџџtoџџuoџџqlџџfaџџJGџџџъ џџџ����������������������������џџџџџџџџџ џљџ(џћџ?І§І‹ŒўŒџўџІўІџЁ§Ёџ”ў”џƒўƒџYўYџDџDџ3ў3џџџџџыџџџџџџџџџў џџџ'џџў)џџў(џэѕџџџџџџџџ2/џџHEџџkfџџrlџџtoџџtoџџsnџџniџџGDџџ=:Ѓџџэ������������������������������������џџџџџџџџџџџџџџџ'џџџ=w§wѓ‰ў‰џ›§›џЊ§ЊџІ§Іџœўœџ{ў{џgўgџSўSџ7ў7џ0џ0џЁў.џџў4џџў:џџџ>џџўIџџўHџџўFџчТ4џџ-,џџ-+џџLHџџ\WџџidџџsnџџtoџџtoџџqkџџjdџџXTџџLJkџџџ џџџ����������������������������������������џџџџџџџџџ џѓџџџџ%Ч§Чkwўwъ„ў„џЄ§ЄџЉўЉџЉ§Љџ—§—џ‡ў‡џvўvџ[ў[џTўTџoўSџџў_џџўgџџўmџџ§uџџ§rџџ§mџџg[џџZWџџ\Xџџkfџџpkџџsnџџtoџџsnџџqlџџ_ZџџKHџџ<:аџџџџџџ����������������������������������������������������џџџџџџџџџ џџџџџџ0џћџFx§xѕ…ў…џ”ў”џЄ§ЄџЄўЄџЂ§Ђџšўšџ—ў—џ™§™џў§Ўџџ§Еџџ§Зџџ§­џќ§ЃџєЮ˜џџ…€џџ|wџџxrџџsnџџpjџџjeџџWSџџIEџџ=:цџЫПџџџџџџ������������������������������������������������������������џџџџџџџџџџџџџџџџљџ*аќаbўШxўxћўџ™§™џўџ ў џ § џ ў џкќЌџџ§Гџџ§Гџ№ђЄџќЌ˜џџ‘Œџџ}wџџvqџџqlџџb]џџWSџџJFџџFC”џb_Fџ№сџџЊџџџ������������������������������������������������������������������������џџџџлџџџџ џџџџњџ1џћџAсќс]€ў€р|ў|џ†§†џ§џ‘ў‘џ§џ’ќџМќ”ў№і“ўџŠ…џџ~zџџsnџџ^[џџXTџџQMџџGCЭџNK…џ€w8џџџ џџџџџџ������������������������������������������������������������������������������������џџџџџџџџџџџџ џ№џџєџџљџ*џџџ3џћџ<џћџGџќџIџћџHџћџ=џџџ6џџџ-џџї џџѕџџёџџџџџџџџџџџџџџџ������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџ џџџџџџџџџџјџ&џјџ'џјџ&џџџџѕџџџџџџџ џџџџџџџџџ��������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџ џџџ џџџџџџџџџџыџ џџџ џпџџџџџџџџџџ����������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџ�џ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџј�џџ��џџР�џ��џџ€�џ��џќ��>��џ№��<��џ������€�������€�������€���������������€�������€����������������������������������������������������������������������������€������€������Р������р����?��р����?��№������ќ���џ��ќ���џ��џ���џ��џ€��џџ��џр�џџ��џ№�џџ��џџ�џџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��(��� ���@���� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џ“��џџ��џџ��џџ��џџ��џџ��џя������������������������������������������������������������������������������������������џ��џб��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ==џт������������������������������������������������������������������������������џ)��џш��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ##џџooџџџџџ������������џЊЊџџы џџџ џџџ������������������������������џ ��џn��џе��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџhhџџ“oєџџUџ��Œџ��Цџ��§џџџXTџџXTџџtnXџџП����������џМ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџt�жџх�Юџџ�џџџ�џџџџџџvџџџaўџџџџ��џџ��џџ��џџ џџTPџџtnџџhcџџOMxџџџ������џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ�5єџ�обџ�џџџ�џџџлОџџџџџџџЉџџџ�џџџ�џџџџџџ^џџџsџџџ$џџ��џџ��џџ��џџ��џџџџ%#џџlgџџtoџџUQџџџц ��џ��џџџџџџџџ��џџ� џџ�ђтџ�џџџ�џџџ�џџџ�џџџіџџџџџџџџџџџџџџџeџџџџџџ*џџџtџџџ*rџџ��џџ��џџ��џџ��џџ��џџ��џџџџOKџџtnџџjdџџC>_����џџџџ џџ џџћьџџџџ�џџџ�џџџ�џџџ�џџџ�џџџтШџџџџџџџџџџџџџџџџџџџnџџџsџџџ(aџџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ*(џџqkџџpjџџ1-Ѓџџџџџ21џџ=хџ5ўџџўџџ џџџ џџџџџџ#џџџ8џџџWџџџџќџџџџџџџџџџџџџџџџџџџзџџџ7џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџojџџoiџџ53ŒџџџJJџгžЪђџВўџџЈўџџˆўџџuџџџtџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџяаьџџџ џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ,*џџqlџџgbџџSKDџлџћћџ3АўџџЬўџџРўџџšўџџ~џџџxџџџwџџџwџџџwџџџwџџџџџџџџњџџфЫеџџџ џџџ�џџџ�џєJ�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџ џџSOџџtnџџXTџџџу џџџџџџ+‡§ŽџЪўєџСўџџ—ўџџvџџџjџѓџ[џрџHџЙџ4џ|џ џ4џјџ џџџџџџ�џџџ�џџџ�џџџ�џоц�џџ��џџ��џџ��џџ��џџ��џџ��џџ��џџџџ84џџojџџrlџџ<9ѕџџџџџџџџџ uўuеž§žџž§žџcўcџ'џ'џ џ џџџ�џ�џ�џ�џ�џ�џЉџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџ��џџ��џџ��џџ��џџ��џџ��џџџџ20џџjeџџtoџџ`[џџБЈ����џџџџ№џџћџ@€ў€џŸўŸџ†ў†џPџPџ$ў$џ џ џџџџџ�џ�џ=џ�џџџ�џџџ�џџџ�џџџ�џџџ�џџџ�џџ��џџ��џџ��џџ��џџ��џџџџ85џџlgџџuoџџojџџ=:лџџџ��������џџџџїџЮќЮd‰ў‰џŸ§Ÿџ‰ў‰џ[ў[џ/ў/џџџџџџџ�џ�џџџ�џџџ�џџџ�џџџ�џџџџџџ�џџ��џџ��џџ��џџџџџџB>џџniџџuoџџqkџџEB§џџу ������������џџџџџџ џјџ%Љ§Љ†Ž§ŽџЄ§Єџ•§•џmўmџAџAџџџ џ џџџџџџџџџџџџџџџџџџџџџџџџ��џџџџ%$џџZVџџrlџџuoџџqlџџJGџџџъ ��������������������џџџџџџ џљџ(І§І‹ŒўŒџІўІџЁ§ЁџƒўƒџYўYџ3ў3џџџыџџџџџџў џџџ'џџў(џэѕџџџџџџHEџџkfџџtoџџtoџџniџџGDџџџэ����������������������������џџџџџџ џџџ%Ч§Чk„ў„џЄ§ЄџЉ§Љџ—§—џvўvџ[ў[џoўSџџў_џџўmџџ§uџџ§mџџg[џџ\Xџџkfџџsnџџtoџџqlџџ_Zџџ<:аџџџ������������������������������������џџџџџџ џџџџћџFx§xѕ”ў”џЄ§ЄџЂ§Ђџšўšџ™§™џў§Ўџџ§Зџџ§­џєЮ˜џџ…€џџxrџџsnџџjeџџWSџџ=:цџЫПџџџ��������������������������������������������џџџџлџџџџџњџ1сќс]€ў€р†§†џ§џ§џ’ќџ№і“ўџŠ…џџsnџџ^[џџQMџџGCЭџ€w8џџџ џџџ��������������������������������������������������������џџџџџџџџџ џєџџљџ*џћџ<џћџGџћџHџћџ=џџџ-џџї џџёџџџџџџџџџ����������������������������������������������������������������������������џџџџџџџџџџџџ џџџџџџџыџ џпџџџџџџџ����������������������������������������������������������������������������������������������������џџџџџџџџџџџџџ�џ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџџџџџџќџџрџџ€Уј��€���€�������€�������������������������€��€��Р��р��№��?ј��џќ�џџ�?џџрџџџџџџџџџџџџџџ(������ ���� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џб��џџ��џџ��џџџџ����������������������������������џn��џџ��џџ��џџ��џџ��џџ��џџhhџџџUџ��ЦџџџXTџџџП������џџ��џџ��џџ��џџ�обџ�џџџџџџџџ�џџџџџџsџџџ��џџ��џџџџlgџџUQџ����џџ џџџџџ�џџџ�џџџтШџџџџџџџџџџџsџџџ��џџ��џџ��џџ��џџ*(џџpjџџџџžЪђџЈўџџuџџџwџџџwџџџџџџџџџџџяаьџџ��џџ��џџ��џџ��џџ��џџ,*џџgbџџџџ‡§ŽџСўџџvџџџ[џрџ4џ|џјџ џџџ�џџџ�џоц�џџ��џџ��џџ��џџџџojџџ<9ѕџџџџћџ@ŸўŸџPџPџ џ џџџ=џ�џџџ�џџџ�џџџ�џџ��џџ��џџџџlgџџojџџџџ����џџџ Љ§Љ†Є§Єџmўmџџџџџџџџџџџџџџџ��џџ%$џџrlџџqlџџџъ ������������џџџ Ч§ЧkЄ§Єџ—§—џ[ў[џџў_џџ§uџџg[џџkfџџtoџџ_Zџџџџ��������������������џлџџњџ1€ў€р§џ’ќџџŠ…џџ^[џџGCЭџџџ ��������������������������������џџџџџџџџџџыџ џџџ������������������������������������������������������������������������������������������������������������������������������������������������������������џџ��џџ��џџ��ќ��р���€���€���������������€��Р��р��№��џџ��џџ��(������(�����������������������������������ц��Ўњ��ью��љї��њќ��ћ”��ћБ��ќ���§ž��ў���ў��ўќ��ў§��ўџ��џ���џќ��џ§�ў��џ�ў��џ�џ�ў�џ�(џ(�,џ,�9џ9�AџA�Iљќ�J§��WџW�ZџZ�hџh�lџl�nџn�xџ{�yџy�‚џ‚�‡џ‡�‹џ‹�ŒџŒ�ŽџŽ�Љ���Ц���ЩњS�е�ј�ж§��п���р�ѕ��љў��њ�ќ�ћў��§џ��ў���ў�љ�ў�ќ�ў�ўп�ў§��ўў��џ���џ��џ�2�џ�њ�џ�ћ�џ�ќ�џ�§�џ�џ�џ��џ ��џ�џ�џ!!�џ&&�џ,,�џ//�џDD�џEE�џII�џLM�џQQ�џWW�џZZ�џ^^�џbb�џdd�џii�џjj�џoo�џrr�џss�џ}}�џ††�џžž�џАА�џИИ�џќ��џ§��џџџ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BDA21,+�� .49CE@>7>0,� 8EB@>>>>7:H� -;>?>>>>>>JM��"5bF>>>>>>KON��#3c>>>>>>>SV`���& /=>>>>>>XZU����� )<G>>IV\^_�������(*'6QTW[]Y�����������!%$LRPa��������������������������������������������������������������������������������������џџ№�џџ№�џџ№�џџ№�џС№�Р�№�€��€���€���€���Р���Р���р��№�0�ј�№�ў№�џџ№�џџ№�џџ№�џџ№���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/��������������������������������������������������������������0000775�0001750�0001750�00000000000�11660470014�016613� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/�����������������������������������������������������0000775�0001750�0001750�00000000000�11660470014�020456� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/����������������������������������������������0000775�0001750�0001750�00000000000�11660470014�021723� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/zhistogram.gif��������������������������������0000664�0001750�0001750�00000010500�10513204254�024572� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89ao№�Г��њš…ЊќRQRѓдпuчтіŽфVіїѕс§ RќНММ!љ�����,����o№�џ№ЩIЋН8ыЭЛџ`(ŽdižhЊ~ФУМp,ЯtmпxЎя|яџР pH,:E‹Бj:ŸаЈtJ­Z7JзuЫэzПр04Ы|ЮшДzЭnЛп№И|NЏляјМ~Яяћџmdk€ˆ‰Š‹ŒŽ‚K„‘–—˜™š›<žg “ZfjœЊЋЌ­ЎyeXŸJЁДЉЃƒІh ЏФХЦЧБJe�ЮЯЯ“ЖЕЙЛg‡ОПоk3i/hффс Ћ1nщЁ0схяючыmіуђтѕђќњџјЉЛе 4iѕ&8ЃАP.ReајЕ-и7pїкЙ‹ї†žІsџ9ђл(2$Шt'йЄ,ЉqуJ+E Hmж�p:œ&ЁaУж(ёвVёЂ7•05škЗЮ>#™\к)КЊ#ч‘ДšNв­YЛ†Эњu&+e˜ѕЬ‰эС е Vђе n‚мŒbŒW•Fд–єR ючR*X5!ыэ‡R*сЧ‰ѓa 86ьSТ•Э~$Иж‚Юjhoъ„ћаaЉ3 ъЊnР@яQ­ˆ•6іg˜фвТ’o“mxђсЈЖkЫќ[lYтКkоњ‚к›lКFњŒ\SЋU?pѓжфяzуўЫr7rЌДMђ/ќpdБС‡П?|љцšЭЂƒfЈѓg\г А@џ�И€Ўе'“nу™7Xy/Mж`Е•ѕ yфбGпwŽ'ž}œФbаhхчY[ ‘иаз`cˆ0ЦxQnЧнv™cВБGЃy™‰S#fН™Ѓa'EјЃSŒAbˆ)О5IA#~†KsА(TФЃ!gЁЗф—`2ЧYM<-SZ‹XnЉŽwaЖщf2 Ф)чœs~BчrN‰'žg^љцŸ€к„jшЁˆ&jшŠ*j€•*щЄ”jv]Ѕ˜fЊЉ*з‰сщЇ †*ъЈ"ьBъЉЈІЊъЊM˜ЪъЋАЦ*+ЊЎЮjы­ИцъD­КіъыЏР’VŠ$ІPlАШ&ЋlZByvџNЧv`PаBЗьЕиЫkgдŽ-Зпf+юИЋnk­BжRЧСБЯŠ.Й№Ц+†ЙгV;кЛMі‡nЕђіыЏЇєv ­“{/tјўЋ№Т­6л-C‡`№Оч2lёХ+ 1Пg0ёZc,ђШЅ: ёЦ=§ДСДюђЋ2Щ0Ч\ЅЩ2зl3ЈцоЌѓЮVфЬѓЯ@gLsаD]‚ЯF'­4H/эєвЛD)ѕдTWmѕеXg­ѕж\wэѕз`‡-іиd—НЂP� ЁікlЗэілpЧ-їм2HYJкfч­їо|їэїп€Ў7v7C8нˆ'ЎјтŒ7юИx_‡їу”Wnљх˜g~CџфоtИц ‡.њшЄСyдŸ—ЎњъЌЗўјщhЇюњьДзn{Ап-ћэМїю{эЙžіяФo<шСїДћёЬ7я<мЩ{>ќг?Џvѕж§л§фDtŸ=ѕу_oКѕп/_ўњьЗxсЪ‹яўќєŸОќ<р_џцћŸџƒўНЛ_�иПаmQŠ4 x@Ж5Pш#œфдWРч%№ЮР`ѕ2XAЬ Я�! 7Тjpz&$! KШТКP„/<! g(УЊ†7Дa wиBђpx <aшУъаˆ9L"C%"q‰Nl"SјО >АƒМaн€ИB,џzP‚љМ˜ƒ+"A‹[д _ч?ч}pŒdфу†HEкбŒkУЃёиИ7B.Ž8ру�/(Ф5ВёˆdqH9.hT оЈˆ8=&ru‹lc# шAёбб•д$їZ—ЩKnВnЌС'IјHQъ@­„ŸєxJР’zи‹$+wЉЫИYвЗL\)YKNЮ‰"Lц.…щЪ2’ŒЈ f0л7MмШ–]\f(M9JEB3vв,&*glnБ—Оlf Ÿ)K1ўQœ „g<ЙљJvZ‘–ђЄр&йƒjЮm˜§ЬЇ>ЩЯќй3ŒэІ<§YО‚*Tu�5h>:>‡жгџ›эLшE*P‹:Ѓї _GGJЯbђ›К чDIJЬ–ž4Ѓ*хшJKКN"4І№Єhі<Zг—†Ž9ei@] Q” Ÿ2MъP—ZT˜"5Ј3%ъCKбЉSЇЄЉ#›њгw*Uœ<н*UПЇ‚UЈeъX*вЈBUЊхъMЭzUДZеЄr&]k‰U ЊSЌЄЋj\ЯъжДv­]edaыЊUєЕm‚Х+aПzзžцœ{=хc›VЧTЏmЅ,_џъY›‚Ј“}ЋZXВЮ2ДЊMэaY;КШZVЖŒ…Ћd[ЫVдцv}АьЌ*?‹YитvЇОЅэmy›XвrГЁџ ЎsmIм”fvŸю“nc‡kкт&WГй§юrw[[зКSБЂЭ*zWK^бйАnФщ1™щUіŽзНцеh{™‡Юй*ЎП/|янќЪз‚ў/tЧЙ^џyОюё�ЌмJ.‚ѕu№€ мл #XТџМ№<\й CИУ$Ž/ˆхFaѓyИТЅѕщ\ћa+˜О)оoŒ/k]s6СТ1МуŸИЙлЕ-ŒущRWЗјEБ“ЩyЦ%г­Хg$2wэЫa$CљrўФВ‰Cмф$?™ЫGžБ–i1йt‚t3†П у7ыXsяЕѓЕgeюХ™Т}АžЧœЙ<oЙР|^qџџœcA;њЬNѓi_Мч6їљ•Œž2ƒ5=чHу9Т>s•ШL›й˜&4Њy|дP[.Ь—^4ф�ЭщU{вˆU3ЅEhWћyжЉtmфOKљд}ЕЏ1 ьZyзЊоtЎ'lЪСšд›3Е~ŸMч;{и_<vЗ­­ь5—Кймоr Ѓ-mpлњЪ 6wВ{-oЧj[(tvЇo§nwч1оаЎмЕ—-kkюеыЖТq]lМкl$Жэю„цй їїˆбќ6CgМв'јЙ Оё3'ќлO7П,nŽ“›оg6ЩUŽp}—Мс§і6dnsxУт#ЯџЮр“ќбэNЙіxŽёVўМчЪ:(ё}sЅwњ€{„њ[Ођy[zтЊМт‰>gЃЏыMЇљ?™>юˆ‡/жAџЕ6ЉЎvяэmЯy:ЙŽs*?=э цаЋ^vЈoАяdGњПљnѕm~]фУ•ѓи ?bГoя.?:єиžyП?Ооœ”ќры^yУ'>щŠ?}Ч9пѕ9–;цќ§д{jљЋ#žђь6уэюѕƒ•ВŸ;эM{еk~с;п}ъўyи{6јZЄћЖQџPЬЗОјW~ю™я{чG^ьЃЗ8іoYып~ќ,їrч{џvАќГwd.Ј]вSљzпМіёЯ~џ\К‚аwxђ—Fуe}цguB€ъw}џѕz@ї}‚16фe€ч7}Ц—| xeцG]ЈzuvfJW{ДД(rэїЁТ7€’Tеw((R*H~nчП€0}У7ƒXƒ'ЈuŒ”ƒљ'phz!X|#J(g‚М‡~їЗzHX…/з|‚?(€H€№%…Ы‡TЈ{иx>Ї…Lи…"Xrж=bИ}dhVx†SШ}-иƒёд„tј„к…Dx‡s8ˆ)h‡cиЗ…/1ј…B†X~єg„чs…шyнЇˆяЧˆ@(ƒ$ˆqe€“x…Јkšˆџˆ3ч}\Ш‰^Јn`X‚‘ИUoH‰ˆd‰eˆ‡<ЈŠ‹иOс'}8„ЁX}Ѓ˜w‹gˆrˆŠpі{Ш†Nш†Уx‰­(‹ЯШ€mЦzшx™И†Ќи†*7‹IИqЂ(ˆ„ˆƒЦШЎїwФИŠМ(ЎјˆАŒЁ8зHŽІH‹‡ŽыЇŽRзˆэј‰‡w'hH>ЖH‡Y˜Є8d|(~н(�yhо˜ŽYVуИvјHЫИЭи4x‘љ8‘хИ‚МІ† љ>Ьи‡Юи‘)Œт˜€{8’:ˆ‰yЈ‹›ИŽќhrЏŠ-/щzvƒi’y“ћи‰Žш§FH)‰?K]%џ”,Ж„'9IЉ’ Œйљ” ”іИs9(y• Й; ‰}uф’‡“ •a`c9V‰“MЉ“юШ“іЦ•)тXŠ“&•щ4—Љ)y–П‰ЅЦ—––dЙupy’SI˜‡˜‘v٘Ѕ——џИh˜yy~Y™є˜qљo”yŒ–y”™:‰љŽ[ šљ3YŒК&˜›WšцИ‹ЈЩhщœщšJ‰…Бi†Г9š.F”!i”rw—5їšIЧ”Љ ŽŸišЁщ]ƒш–ЧIq.ˆœ2ЇœEЗ“3‡Н‰~ЗЙt`)™ƒiœi˜fщ‹о™LрɘΠ…Сy‹ц™E‰Œџџwx™КЙšiŸ­)žЬy‰Рy Б‡Ÿз‰5yŠЇ™œЉщ‡ш4DфЗ–>й–шщGДЙzЖI’ѕДюY њњ‘фщЁ(њЁ КžC‰љљ лЁ+vъуœѓљ‡Иц˜…“У‰žЕЉždY—ЙЙ‘ЛIqК—7š–: š<*š>ЪЁ@J—8:rмYx"z^YЂNy[K*MJzQКЃB ЁџљžjtЄaїœщІЄ' ›ыtž/š†.К ьщŸD  пYЁUzvгиЅхz+њ˜щYЇ,ZІ1zІWZЃсimњЇoŠ Я7Ј9™cЪЄˆZp}Ъmz Ÿ|ЪІВуІ‚NrjџЇ-к кˆЇXYЄ4ЊІиЊу)Y€šЂЮTЊ,jЉ†ЄSšmьˆ—ПЩJЎЪ@АZ 3*‡ЄJЉ;ŠЋЈZ•ЛŠ›Њšh ЌŸšЄ:Њ€ ІФ™eZŸкЉЉ2š•цЌчD­ВЉ:Љ=:ЇЇš‹zЇCКЊšІгJ ПZЌхyЌщjЊЪЪЎЉњЎˆ­#Š…Z*хj­гйcŽ Ї§lѕW‰‡ЂПАЦ7А]ЩЅцjŸ‚šЏЗZЈrЖЇ6щƒэ„‹ЅEБ}YАcˆЏNЊЎИкБžњБ0ъ­Š:ВŒ*Ÿу}еšВзŠАеГ>Ї2љГB‹]9ДFл?wДJ[AIЛДNKџ?MћДR \ж8ЕV ЕU{ЕZKЕE+I”T@хDPADPY+taЫДзG„ЄЖe‹iM„ДйфEPDFQxФ \ёZ?dЌVVЧЗ…–ЗXфВеЖЩЖ‚лA„‹\]kNh­Š ИгFз#Й Йˆ ^WxЖѕš]‰Л?‹лP†ыЕ{KЗŸ Е–лЗЏE•p‹ЙЈ{VлЌ­KŸ ЛAЛІi‹ИœЙk+ЗЃЛ•ЙЋЛЁ_Н;ИПЛЕШы=Ч›МЬ@ЫлМаK;o$8д[Нж{Ни›Нк›5_ŠАл‹5От;Оф[ОцЋ({’ОъЛОьлОxв+і–jіНWsОі{Пј›эП„тОќлПўЛ'№ћiђ{Zєk5њ{РœРћћП мРьР…жН­ІB,5 |С\ОМС<'\iг[СS“С$\Т‡вС(ьР\’!,ТQbТ0LТ)<УўЛТЏ&С~KС. 1мУ LУ@мО6Ќ„ь];ќТ>œФљФLœОCœ…-|ФR<ХT\ХV|ЖuНZЌК$ЛХ^ьМБћХbЬFa<Цfќ•VtХjМЦlмЦй›_gЧЗгNn\Чv|Чx6ђ4|мЧMгЧ€Ь3YаФ„\Ш†|ШˆœШŠМШŒЌФŽќШЩ’<Щ”LЩ��;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/val.gif���������������������������������������0000664�0001750�0001750�00000007715�10513203700�023176� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a§�Ш�ї��ќŠ„ЂќJ\ќœ4ЮќRќЬŒў ў”<\ ь&lєк”фўl|ўdЌ4дњќNђЄLє4lќўvLЬммвќєєњLўќžќдвЬ |є4і$„‚„Ь$|њ ДМќ фўЬєў$ќœDBDм<d6l|„LД|~| фќЊќœђќфќъќєŽ ŒВќN\єФ ц ЬЄўўЌTT &lФТФ |мўЬ^$ю Ќ$tjl мќњќЂєLќŠфўќўфЌD ќќўќќќњєЖf‘%|��˜p�Вг�‘…�|������������ 0�����ы����‘�|����Г�������8��Ђ����рT�0к�ˆ||��1€�ƒщ�‘�|�Дџ�щџ�џ��џ�Mˆ�ш�дw��p2Œ†щк‘w|�@Ћ7�‘��|ˆ˜Чч7‘��|‹�`_���#����Ђ���`@��д�w���а��ш������ўШ�ƒщ�‘�|��@§�ў�€��|��� џ�€��|�� �`f����p�‚�ўк€w�|��`����������д�Ђw��� �$�����“��.Р�B�w��ъ�˜�щR�����Иј�ї������ј��ї����� �Јю�š�ƒ��|№�ч�џ�€��|Ю�џ=�џ?�џw�џъ��џR�€��| �дю��B���ћ  bщ�?Ђw��AЪ/;ќ?‘€w||p�‚$`ўE€��|A�X;`ж?дw�w�m‹��‘ж�|w!љ�����,����§�Ш�џ�IHА Сƒ*\ШАЁУ‡#JœHБbХ$МhмШБЃЧ CŠIВЄЩ“(SЊ\ЩВхJНXœIГІЭ›8sъ|3уЮŸ@ƒ JtaO™$(]ЪДЉгЇPЃJJЕЊеЋXГjнЪЕЋUG:НQТЋйГhгЊ]ЫЖэRА1ХКKЗЎ]Е'gфUКW�\ŸI—Fр` ‹ю*^Ьx.RЃzТф+y†вПH bAТ€=‘бИДiГн>V)€зАaУЅЬpВ_aп@`E–`Œ>"Aгд'WЎœ*GЇЯљn\ЫмЫщЈЭёVv;іьф_џлђэмJ#”0’eХŠCˆп!d)ђъжЅ[НŸ_џђџ�Ђ•нuP (рvp‚хб– ƒф5x^\ АA{э%с|Уu`_~ќh`ˆ!~Ј‰§IЧпŠ,ўз‘-Šтt&ЪX"[Ћ%дZ‚ ~—Ѓw醙\6@Ё� „А�p8BV'уS(њхŒ'Іи\•.і——_bЩхqX2Іj’Р`A к–Ѓšk~7d`PPХU@рNŽpЅ‰7’Yт–eО–b& ЈЂ]f™х€б-7gНyаŽjі(сВiоœJ9Ё 0€�ƒX|бB ў)щs”Fџh š‰ЈЃтzfЎЛЦшъ˜дЅgx>ŽсšB–˜ROa"P E|ёЋУЙ`kЙRщЅЂДюjх”cіj˜ч–‰k€Рjї pЙІЉ›сХI^Вш)%E5рРХ�_Q�]Œ@E}мJiшЖПЮˆŸК*:\ЈУМJ,ё•щоHшЄ)К 'МхqзнНцYjОBUУ�‚*(ѓЬŒ™\І9ШкЇЪfЦTƒ)ЅФ40@ѓбH;†ТвL7нД^NGЭtЩRKЭsОNнDєз`s5Уиd—mійh—­Tкi_жГ\PэuиtзmЗS о­їо|уџ§vQ€.јр„пLaсˆ'ЎјтхЦјуGŽИу’Wnљх8QŽљцœw` K“ш“юљщ†ƒЮІw šОPwlfъКAkЖ~“НšЂЎћЩ‡ЧNћDЎзў№8сўћюШ{ЊњxБ;;ѓЋ‹зz„ я<™fџ:єNO}ђœk^ЏlЖџzїФк>|іъЫŽ§ѓя’ŸОі№ƒЯИјиЯ;CУZЏ}CъѓžємW?мСЎ}ѕГŸт№ї?FЄњƒH�XО"Ф€Э#–7Ч@"€Оs чї> ђyў3п-зС ~,t@bнƒжїОЉАzм#�WШСоёА( ќсфџ|(DЁБˆƒc —ШФKБ‰PŒЂЃHE!NБŠXTрГШХнmБ‹`ьмт’2šёŒhLЃзИŒ dŒБYчИ“žМё‰ ‘#їh;:qy б#Y?ђ фцt �0ђ‘„$!gШд)’Œ+нђ7ЩЂT’ pDЄюixg“Ъ'•wЩ8fВ”œ4жїpИ>‚а~Ћœ“CZi9F:2’#ˆЄBxФZ†0!_.џЖЫWЄeДŒeM dТтвф%/{Ї`“оМ є^8CіЩя{дЬŸs—Мe†r›–[S8QЮу•Gдќр:5HџМtВyюФ#Bр9_>ђ�Œ ІЪШc:oŸюУg5§WЭz›‡дІ3ы‰Jдsœьг”>'JТŠ Е$DZP��Œ ѕшGщgТ Ž”“ЦЛЇEuPQд™0=:m˜NтЄp’ІyšRP є ,}œ/GFU“‹=еш‡ЩUtЕЋ6Y*џrGŸBu…УHZН:ЕŽ(Y]щ[ч*‘И>Ф UЫЋ^їЪзОњѕЏ€ Ќ`KиТЖЉЌ„лЫиЦ:іБЌd'KйЪZіВhгбSщЪйŸ„ВГ ЕШgCKкЦQШАЈM­jWЫкжКіЕzEJn`‚йкџкіЖИЭ­nwЋ[РЬ62ЄE�ЂкEсЖђДШ%.V‡[Zуf„$Пѕ-pCымр2Wб•эtA[]ъ^З6Ш•ЎrГи]БVфЊ˜s.vУЋнёbБК9Еz/Ї^№JWМЭeюRg2_~Љћ­{Ћп­“ЈЕƒш ы;>•xЛ-02“б ЗoСџ§ѕВЏќЪ‹vђ“Ј,јCWuNіА4)ZсXіЗr ой}лЋтџндТ4}БфbЌйwиК—QЭ™`bX&ыѕqШjь]$лWЛјВŠ§Ъо7йУ‘U2ЮИЋп+;ЄЪK–В”KТс0{љЪI†2ХŒц'ЃџТœэ.—ќ95[yЮ*Nѓ›LE9G8У=ЖГ™ё<f7?˜ЯRь2žѕ|h&я—<.Ћ ЗќчешŠ‘Юцž™|сTf:Ѓ›fsЇ;љiЇXЬ7œdЉЊe8гUТоЃsЉмjDcZПћЋqГ<iWЯеЙЖєєpLlŸаЙзЖn"АO щяћйЕvtЅЁ эhГyбЦЮvЕO}ц9S[лЎlєЕ+ юo#[кqvЙСmэn“лмьц6Ё› яc‡кнщЎwМ“›п�Рп�џЗРN№Мр?ИТЮ№…;Мсg‚Fж]ьvs�KШИЦ7ЮёŽ{ќу ЙШGNђ’o�џЇјКХэн˜ќх0ЙЬgОёH\пH9Зu1Nѓžћќч1G9ЮГЭђX‹“РџжјF€ЮєІнцзЗЕ“љVсђм JwКжЗnrЁЋ|лќ6)Љ“ЮqЌs§ьhч8д‡nqбѕSСЗцљЦЭžіКsныCзљŠK:j& зхsЗЛрЗОіЏFяK ˆћќšРўёLЧЛсщ,oв)ОХЗќшљЮгМ№RGМщЬзї%Z=уœїМъa.yЖWžЄ 6z‰Що‘елžф 7МХџ,їлћžф­ŸќНЙЌљпфЙ‡їюгнћу;џф)Яћ№џ\ќч[?љ*_ўЋo§ю/!јR—7џѕНп}ь[ћП~ ФЮўѕЛП§№џћЃ/|Фџ™ јЯПўїЯџўћџџ�€8€иQЇ{і—olД€ ˜єчzaGo 8ј7'|шWuУVXˆтЇ€8‚ xЁwoTwKŒчЈ-H‚0X~a—jЭжЏС9ƒ<H&ˆ€г'{ad\:и‚;иƒHhв—€9u=Bxd1\(…IX…ёƒЪgСvc‰Іƒ^0…_h…bш3Ј{Џї;ўTzHD„aи†Уі‚cШƒX˜}z7z!Еx]ш‚Бё…{‡HX†ЪwjГCzOИAl…8ш‡I8‡чЇsџRшƒt,˜ˆŠиƒ€˜}!И}•И‰Сˆ+—€šШ‰•x‰ч—‰щ'ŠЃx€Y„ЁˆŠqHŠ+gŠшŠ~ш‰еŠЇH‹c‹`eЈ‹Uh‹ь†‹X€ЦxŒШ˜ŒЪh€ѕ—К‡Р(‡ЊH‡Ќ˜‹бИˆKXГxиШvФјŒмˆЭX‡ГД=’…GсX‚Ч5ub7Hl†`ИŽk}аf”VˆЫѕ/єшєWgAи„яЂTІ§јj2&z[˜cя‡ ЉiФ6.Фbyˆˆ^H‘Ig ‰‘(ЄNњˆKFH‰‰FybeЉFˆ—ц9ёˆ’)yF ™k-џЙfф_‘И‚zЈŽнQ“ed‘)XfљиŠBй€iAFщkл˜”J ’Ytг•ьhVoц‹оf• И”šF•"Ш•ѕ(•’Ір(–l”rДіТ†–iщМ†bЅ5—4!hny—bЉKtЙ—31Z|љ—Ќ&[А5˜„Y˜U#˜†™˜Ў5i€9ВѕVŒй˜ё˜c™’9”™J–Y< •™“єГ5>—цv–WŽP”™шuD)9x•XИaAšі“ЇC™Іy;я˜8x…ЎЩ›ЅљPБз“:eOU„šЙу„Љ)9Л˜`k\Ј‘wHœХйœJХbЦ’�І8Ы šЇ•x!жbШ=;ЊEЦй#iX’ДyлЩ›rщv|gc…“%ЩCх‰†$i/#УlкЙ4СŸrIAяI<™гљšGUS%eMЌЩŸЫй›Ђ?4Е“ Ц“цušд™LjdBu›€ГžМЩОu™с™\фЁ§щ "*$ŠE&к –Ђ*J%Ъ 4Ъžs‚—œG8Ъ<БY0*™~љЃС…ŠYЄFzЄHšЄTЦ[LкЄNњЄPЅ�;���������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/threshold.gif���������������������������������0000664�0001750�0001750�00000054401�10512506666�024422� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aуRї��ќ„{ …ќФ‘xФˆћDИ„H„ў„ЗТI;мХУ\=ЗЄIxыˆћфќdЙхGќЄ8фШ‘љ$иу(фы—хi™Єgš„fи„(HќYФЇTуЋзd)лE%аˆќбёзХ)ПrA5ѓЫзЄ)йє'(ќ™ДgИѕHћTљє˜ѕhй”'И”HѕчћtXѕЈxВˆ•Тk˜”hXдЈtвŒЖГJќ4яxєˆЊtVќ”ћдъзt)‰ѕwdЕœ&єкЈѕXќДйT'Шє8јhє˜ФќЈЄX‡ЄyˆДxшєЦ”9єљIіЗŠ•vу<hԘщDЈ„XЧх9цTHдИыфцd*ьжШ„8іР|@зД)Љ”Wшtч„ЕгJфћhќЈќšнfщдю GфЙий(xМˆќ<дќЈуXKЬДРg?˜g˜ўhgд™(ўифВи\(ћ,‰фwиl(ИўHЇДY єй|'ќўќАXќ˜ќ8ќxќИќШЄ8фТЉШWdтœш­ЧЪ9‡Цyч”ШЛ8ЈзX‰дwрyЈ‡Љ}XaМŸЩо7БзL)нѓќЁРл ДsLlГ”ДiLwЬ‰ИŒGИЌH6ьЩйь'—ЌiXЬЈ8ўШиў(˜Мhќ\ј§ИœHўьќ|WўЉ–œivлŠxўˆЈўXШў8gў™ш§Шœ8HўИШь8щ\МоDDыЛeл›ЅК[ЦЋ:Д|Lъ;ќŒќЬќLЙЮGћьќlИыHќЌэы™юgж‹*йœ'™ЬgWмЉМОDќœћмˆўxќМЬќЈЌX‰­vˆМx §ї‰œwhܘшLЇŒYHмИщьъlШŒ7мО$ЇœYч|чŒьњынЈьXшН‰ьwьЮkэ•фŒоt уЬd4ь4Ьu4ЬT4lЛ”ŒtЬ\4Ьk4Ь{4lЊ”œ}dTОЌЬN4мќ!љ�����,����уRџ� HА Сƒ*\ШАЁУ‡#JœHБЂХ‹3jмШБЃЧ CŠIВЄЩ“(SЊ\ЩВЅЫ—0cЪœIГІЭ›8sъмЩГЇЯŸ@ƒ JДЈбЃH“*]ЪДЉгЇPЃJJЕЊеЋXГjнЪЕЋзЏ`УŠKЖЌйГhгЊ]ЫЖ-€ЗpуОН)ЗnFЙmGжн;їЎнˆ|уцэј/GУ їќR1мšŽ\ФЫјcфХCt\YчeЩ/фмЙхeШ‘-R.Нё3Aа€5;$ЭuъА3‹VHЛ6ЪеvЛ.|Ж`п"7žЛИAрШ*<‘яCшбUBпОїљђрдq‡џGˆЛшТЏЛgПn~<яƒиЩ_Яѓ|ќбъоЇOВ}sєт7п|оЙž€�˜ŸlќЩG ‚2‡o6h[„љ%6з~Nha~з›ˆЫU˜†%Ъ–`oB˜[‡&:шЁŒЖЈ‡жQИaŒfcr$К‡йt‹Ц#„№Ѕx"‚YcvЮ-!fј#KQXсqOjiх•~1ЈЃ“д9Ѕ”Iž‰Є—њ‰\–=~ЇšsццJpJ)d‘n $цБXg{~ЎFgЁ(6iчšiцY›ЃƒОщu“њ[—0ўЧчЁИUjщdzi__•Ъi|Ф%ШЈž˜–ЉЇ™‚џЪщЇaЮ+ЂšЮШž­ДR)e„–ЙЃЎƒ6 АAzˆ,Џ•НŠы–­&mЏ9ытІ‚VI­nТ†žн*иІЂпІШф„†ій™ГrŠZЋЄлЖ6э—ЎUЇnМh>›ыБЊз.Œ�?ЫцРO›Є‹ ЏРŒяa­&,Њ ћiьУБ•›,Пфš;kЊМ*ЃГхшПzŽЉiОktВЕ#ƒЬrЫу’ЉБЊњІ\3ЮЗщKjЖožцюЮЏ 4Эе›sЕок,1вTъ|-Њ!Wљ4‹ †втюЪ ШOCДаИЪŠюЦ0? .ЧУЮHЈе8 Vи’•Мз уGлмv‹џiбСЙмДЄ(ћmјсˆ'ЎјтŒ7юјуG.љф”Wnљх˜gЎљцœwюљч ‡.њшЄ—nњщЈЇЎњъЌЗюњыАЧ.ћьДзnћэИчЎћю[хЭ{вПЛќ№ФoќёШ'ЏќђЬ3ю{ѓЏAЏŸєдWo§ѕиgЏ§імw?›ї{џќђ”_ўіцŸЏ}њ€/ћцcПњжЯпОћйOПєњпO}џјуHџі’ёin€ўKŽщX $ЁС�f‚L)XA Vƒ^BBŽ„ДЬs˜BzФ•ka3:ъ…-lЭї6‡‰Š01œыa џ8šуЩp˜H&–ˆР%.Q‰L “шAˆДpŠ™QЭхІХєqб‰Y cхОП/>БZZ ž§ЬШEРPjz’cЃСИ™71Žs”ЃwxGм б|ylcё9GуRUdH‰Х"6аqŒ4coиИH~q’ Є%%9МMrФѓфA™HђˆВ‘#L#_ЅS.‘”ЉcuTИ5Wb–бSх,Y 9W‚р—єф/‡ЬM˜Ѕ4ˆ-‰>šРPПdф1Їi1Шˆ-š‡œц1ЋщLжљ’™;yІ†IHmnГ>-#g Э NЯœпlч]l"ЮØSŽь&BCџЯшм“љќх>ihMЧСѓ‹љЅ6ЅГ­€:T›ѕI=зѓаŠ ”ЁЂУІ-jЮˆтŽЃ‚GoR‡Š4™9цFKzЬ‘JдR,ЭЇH]J˜ЦДЃ'ЪDwгŽ‚€ІВ”ЩNЧвSˆц”ˆBENQЇ9S‚v“q@XjK›Z”ЁЖEЄKѕФOg д—кЋEе*WЛZSЬIuЊG=ŠUбVzBЋ xы[ЙЊ”ЕžЅ­}ы/хъ К&ХЎј:Ћ@ЙК†лЭДЄ|}ыц*вТкюАnMьbћкиDF5ІzEkeч“cеfЌx…Ћ6ы‰5˜жД› TRЙйа^vЏь$эiQ ЧџЊЖГ Sмk+кСЮдЖГsэa{;LЙЮvШЅ-pe'\ЌwЏŠ=-rG \Ыю–kfѕYлЦŽ�*€хJsЃЊзсЪ•КІnrkћ№~ЖЙкн*yЯ+]ѕЎНюеmvqъмФюЕБЈ]УwgGн™RжРŒэЏ'І›^ѕЂЗНОЏH<сЯwСЩАƒM с�rUІc%-_g[лOІŸЌeKM[ZЎЪеХou0rП№…д˜Уœ}j3лВтХJИТ>ЏŒilучx&ž5\w'Ь]зF—Х#ž­€; ;є’иРД­АŒgLc"лX–‹à „oЙЫ^ў˜Сš%—™џТeq}},хSy*с} hЌ|х+WУ3ž.šгМцЊфй){Ўѓќgѕж˜ЫhžqЁЉrшfЄЖ~Б‹ ЋсN+šК3ю]X^єш7ZЙŽNѓ(АjVг˜Ђ Љ3œa�ЃзЛ‚V5Ћ)ръUЧ:^˜žэ\)›х3ИЮЩЕБЏuЙкЪ<zУЧэБВ#mc^[ћеzxУ‰ ъь-KyНщєЃ[}эUg{л:ЦWо-хŸР€>vДЙ<i­Tё2ДM-]qwйкаƒЕЯн•{‡3!њЖяœћэor|рк.ИН_тgщ*њОѕнwЦ_ kŒ"МжїГAMkHЏЭџ8Џѕ ƒ–}ќ!!іШml”Ѓ|х*xЫOїђ#ФгќцsАЗЬg@ЗšхЃN&ѓA{;з�яuРѕ@ѕЊыр ЦHКi–žІS{УPјПЋNіЋg]жVщyCЮр ЯЛЫEц3ЄqМjЊНŽAЙћBT.ne:а9ЮYЎЊ_н�uŸољј“Х'„яNOГ ЋuŽ[Н№,тїЈx$Ћхо0ќ{Мnьi{9кcG:Y ю;а?Є№^яћИџѕ]O]ИЯН6?жП‡Ÿ}Џ§ї›WчЙз=яХт{мљ!p'yЎхnђ„Їњі:XОДЏV“„wЂ˜yџЙO>hлур†Ч§дo�cАŽ˜4ЪтП?‘№›џпт6џдбOјЋГп§№чH…h.ёuЙVjжp#7w†ї/ŽwИGuЕ'vД7xU‡|Wч€и~, 6.19WЦ7udЇиЦ№ЅcUVyЉіj7frБчo+Ї~ИBПGxBK&Фla�"Xudw„8Јyр€+Ш‚№!€OЈ>8…‰7BhDшjFx„7˜„Kˆu,р„:И}d˜Э‡XТw77r%Ј€Шч€Л—KNХ­зЦА~˜w‚ШGˆ„)И{‚И‚Ќ№�tЈC^q‡,‘‡"Ш‡џш‡HIЈ„ЛGˆ†˜[ˆ(q@rѕ^8|r\&~Еx]H‰ƒсzœw_иˆ‘˜r——|Й'‡ƒX‰,PˆЉШKx‡­И‡Џˆ§зˆ)H‰Жˆ‹s!œи{8~чWcЁ˜…[˜y”8f‘†ё…z(ŒЎиј|Ди~ЦŽ–ј�дXж8и˜|БHщWxВˆyrH‹тx‹@ŽоЧ8ƒ‰;ЈBи‡ЕїˆЯИ…Р˜~J(ŽЛ”n”t[ёw,А{јŽВ‹ВШŽс†–˜ ЩpžwЯW†бН‘кH’Ј„”8…Ј‘йl§б}Ђˆ‘ўˆZh‚‘џј‡ГЈyѓ(…u…c…ŽI‘о˜I8‰9aи”Ќ ‘2р“ИAY•A”иј;9I™‚Й7<iV`‘aј”,i†Kё<Ќg+чZщ‹—~#˜“€x”рш”лв–,€•ёH‘И“~IŒ•и„eЩ є˜ 2 А—,Б—ЦP”­ш—ю˜F9ѓ�Žbщ †€˜Šљ8r#'4‰”:9„8Yv&ЙƒY˜[ї“Ћ˜ba˜Ž)ˆ‚X‘~y›п8ˆ„y‹Ќ№›+Љ˜‹‰%iY…ВщД‰•Ж‰›oyКI‘У`™˜™ор e陉9œ=› ’ЧIЅљ–ЙџзыW—н˜Kй„Пy‰Л˜‰Ћ„Q)‘œY‰ЖЙœЛЙ„МЩ”РYˆѕˆА� `œ›eŸ9Ÿэ™Зyxіщ€У№ T`�ahещ YpŠљ™Њя‰g_C*п с)žGY’GI™пЈžќЙ‘є‘dbw(ё›*ŽЪ™ ЖYЃ4К™ћйŸѕˆ˜��Ф€њX&!:›ђ™Ѓ)Й„` Žѕi�V�ЁЪ šTКžŠ9АЄ-ЊЕ23ЂЌPšEљ—“8‘'J‘MъОйŸ,ъ’рE,!‘  ЃŽ9Ѓ9šŸDЩ”NЩŸl •? ЄЉgp rJЇ›‰•4њ`yЇЛџ'–V@Tр~RjЁTšМ№”W Ј‰M#”'Іѕ‰ЂE‰žhъMЊ’| •Нbr:ЇДй”všЃMHЃNY˜<Њ‘ИЊ˜�ЄФрЋЊ­JЇА:Ÿ4j�У�†ЕйЈŽJоPˆY@Љ–Ъ М€˜0d ЅЮГ'nІ5њœ”ˆЂYŸВЊž=ъЇэЩu@Y 'Ё‘ѕјЊР ЋMЉЇ№ъ›РYЎЙšМкЋгpЎdGЌСКЇ†9–ГjЌVа›щЈbЩЌЮzG­МРт `зКЁTH•QбЉVI†YЌiЊxŸФ*ЋЖzЏк)Є i2ЌћљЎѓ ЋЏJЏ|к™Иџъ™јJ Нъћj!2y-лЎ/;Аš‰‘zАЗx j№Yа™МрАyв*Б�jБик k‰-№’†sъ˜В*ЎzŸƒ™ЃѓКžP™�ъNM‘†‰ЩЎЎЪЇCыЎs[Г6›˜xћŸ?КГг0 РЖLсЖ-ыВ|Ъещ›†KV@Џ{YЁо MћДЩЕSKЕ\ Бц�€@€oЃц>G_;Ўтh‘нŠЇДzЖ+šЗ?ъUh˜А№Ж­ЪЃB[З…јВ}šЖЌћŸ@ъ<ыЗЋЎђЛВKЛѕhИж)Ѓо@ЁєјБš аыД \p•ы—;ЛЙћЏ_8Бџd_Г&›Ќe›К2;Дw+œ?ъЋшІТKџYМіjМэjПЙ›ЖzЋЗЛЊГП МFР}ЮŸ&1ПAлЇszИЪћжйŸЌ№Ќ НаћДд{НpСк{€pныЏ№Ki<2рЊ1ЏKКН)АѕкЃьЛЗюыН9ёГ$БЋ|Гˆ ЗјkУіŠЗ-ќЇНлЗРЛ LРtЁБ#�ѓ ЗP9Й”ZˆМр Ь 9Ї•ъА<­А S{СЬЌЮаСywp\#ЗћYТG*Џ…ЙТДыЇъПŸФ@УБ;И<lУИjГzЌЛjЛЋ€ЬЋО МА B<Ч)AУƒџ‹oЫ T*ХрШQ<ХŽœkХ™тХјРХР|dp`,Цž#Т…jЛ*\Т*Мžo Ч€ЌГњJm „"ЁГHlРy+Л}ŒГx‹ГћШљЊЏPЬ†,Фж@Ы:•u|Чrъ™А еkЉѕшШ™pг*Ї•|Щыš c€ђ0Ю Ъp^р /№н—ЈlПЖKТ№:ЗЏ|Гј:ЬƒќОeьК%сuЌШjЋЫ<мВ=аСмПВьПП[ШЧlFЬ йЫŒЭЬЫТ)ЭБ“{з<­-ЫМм\ѕcP­у,љPЮ€pЮщќ ЯРЏ0QЫёџАШјЛЃlЛvЫЧіЌЋљъЛПЛ эМЯс;грЯџœЫМ›ЫЭУће>œа ЭГ -Фm жP E=гF|ЫHlc трЃБ[НypЙтPНзЬˆЙж!=Еј€$э'ms вљАвAав/р/№ 'PœМ%qгƒ{ГјKЛъ›У~ќЧВ,д}[Ш€тxI­дЭмдv,еQ ШќЫU-йAŒеm Реw’†ulb=жј:\0ЕЛж"}+Д]Йs `з;s%є@~эP иЁуxHœи}\Я‹П-œ§+дџ[ШCќК1|дВџ,ЬИЬдœ-Ьрйж}нЄ]кІ] дРE|чPЧdакт€Ѕ�:|АХdл%Эc€лБ-зsН�Н}вd�м%PХMњ ЮумƒM€ZG>ам§мzlПНМЛСМГџФйЭƒм&т FанB§нУLо,žа]е@у еZmкЇ§щъе_­t№эч0п­­НЛŠпњ=%mзb-\,ЮО�љ�Фpр žрХнр/р P .Р:ОВYБx™§дМ|Џ{ьг6lа]н2nЬ‡ %;оЫан—й о§[оTmоФХŒн5nуЇ] 8ч`.џќуЌ=ŒžЙЫђ№ЩѕЭPв^,ж”юу мхчpsPх њ0YОх]ЎВ_>ў,оw|с~МсO§йр=Ш“§ч†lАБ…эF0ч@œтчНчФnнЁ}ыюц4.ш7ўШРыF§ƒ/№?фкkБч`.ЁŒпА�мОш™.РЭщž~Ђ^`�^0Я хˆ€WAгФIоэъQ]аК<нPMыьП„ьцX б?Ђwж№ыtоЗч­№˜эЛT}оьИоаЬ>ш„N э}%8эЄЌ€�A`БЃlA@ЮAю| юšNюхм€№џ ъыЮюу Ўр ˆ ЫIїШœ§ъћKц=Lы{>ШŸыYкžкыqў’§?чь1^чoнWџсЬЄ-шХіO а‡.бњшњдЎnђ›ћщСЪ'/рђd�ђ{§ђЎ2џ ŸPѓыою8Џѓ<яСббŽдЯт›нйєў^ьV}еJ_кЛ~ˆE:сM№UячХlѕ /кР{ѕIпа§а`ёaџ?@ір�GКцјєСі/р oџёЃLЪtŸ}ЭїРнз{}џђЁP€џ‚/ ТАюp�[ЮˆєюЙhџ_‡т.ЮтљAЏчYяЗ^пњšкѓ.•ю)0ѕЧœьєѕі/ёЅ?ёъпњ5ћВ/ћ�AЭ2‚ D˜PсB† >„и@DŠ'VЄxqсЛg/œiа�HЄ†sч4а›S‚žШ s\ (HО5k† UBУЃwŸ„§v@(”\L\1†QщRІMjtUjDЈQЋ"\ašФМ~ѕ@ЌXXc‰‘-;V­йЏ\нr7Т2#uэZУ; XБЋ ћNЬєo`„ƒ•.6РZнeG€ьВжЩZхN–ŒЙБнЛxѓю-іCє .LXuSд„[gŒјЌЃџГ!5а~ЄA_Э•€ш•pI/цo›ŸŒчїь] BŒ‚‘ ‘+RЄќТ^нЂvюлЛЬз-XђkПЎE€МлИэхnЎы9Џоа _З_ћ§Ј‰ёкu,РЬ*#02ŒOОљш M4jЈ…i!?§Лp5ў�;aЖк�ЙэvSIЄнRв$нl*СИOz�#Йw*ЉфŠ+œƒŽЪ!%Œ6ЬШ ‡„HШд zlЋЗЦ+МГдsЌЗмs/В= Kњ~XЪH"”Ъ0/ zm/Х8c >#P35зTSAkДЬВСб,MB ЛќђЛ1ЩtшO ;|aCџН№"DРЈ DwЫ)ХHlбИ`LюmМq”`ЂЧ#YыГЛ?9е5ќ OМ%™”’Ћ(з›ђ27“Ю-IsjУџъ*ЕЯTЂцџ~EЭГBаˆХыLWїКЯ[hEТVzХЯƒ§rиŠ:„ŠCuFDgМhQFsƒ6/­ЩвK…чM9НтЕGqGЗ`ƒŸтГ"V[ЅђUЏ&це%Љ,p.КАЄД;Xе34&80!7,жL9;{іMf9“х:ЕZo!ŒА›БніЛ™Нљ }N˜ЉЩЅмq'нBНјЄGmБ/џфЗвK/=� }kДбпud{&сВ1ќ.хЩЈtяUW%žИНЪLц˜Ћх8dЊЪKA–ї>ЛHќŠ5VK9ON–ЎhЯtіГ˜ЉД™ЈйfЫЭ“!wцY№Рњ"Dˆ6њшq xс(№щ�Dчэс/ =ŒŸhЌk­OрдыoФ(‡RТі#sуЙ §sЋАSJ1V+f[Iк†+zЙчІЛqЛ5ЦэЄЭвуЦ­)›?1™ЧШ —у№Џduќ9УwПAюI“œц-(ЇаrЫqбх(@Юх­gц њœ в™‹vD)к~т:/H9 o‡ЛџdM_]ѓš€G l`РХS^рВѓEХypЪJХ,CБZяzzг]ъЙШyk оЬDЬ>чхŠ|*\žDЄЂО’ ‘ˆя“#ЦЗCчС,rеВ–іЇХ- #8ћ.�Ф@d рЮ(ї9A%P5 Ь ф8 CA ЃЈDP eС MƒИУн\1КoаЁПa9АSјCJИ"ЙŸяа†ЊL•жf+ (YuЛŸƒВјУ ЦX‰ybЎД”BRu‡rы{*whВљ…OŠтœ4Ж>QОR \мТТ1Ь'рЂbDІ*sГ3Ђ‘€Ѓ"+б–!КџТsEЙrQ4<Vт9žF*‘MsB‚Ќ?ОсŠ`Ѓt ƒ D(†А1в‘вФЇ4Џ"ЎТ!kY1Ќ@eш&4ŽAX%)хбФR–†Ÿ 62…ˆkBLC5v,:Yу–;<х,ѓчУžQ˜УDi1‘ЙR 9Хr2M3 тLўEГЂЃ(цВSMkТРSбйf.№xOyъ 4"ЇOРЏ+d@ь †рiЊRЕžЇP0VсЉ l’\ecwиї,e{С!›š…2T” щžЂB8>TW @>[zю\T}Wlh(e Ўуn ­гЦ|YгšЂЅџІPщJUЁЬЉјOB1ХЌ3MSJНЖšЄ`@O} ƒAцТЃАQQQ[#ш@СЇќЪ@l3АЮvJЕЊ6…,ˆ‡еUlU’zІА�pтf‡}/ќф?7Ѓ\OТoAѓу!ЭаWm5ЃЇд(јbЉO‰ wЁЩѓыuЏЙ’ЭВыРƒayXХNГ^tьLЩN–ВN1Іeaњо™ Кмѕ‹wQЕPќT'Дз”#iGwЭдЮёЈDE0j9%л ˆ)С(Чms+ њсНѕ-pSјUС8;MЄ_ЫЗж4)Ћ m•yЅы_ъj+g9#/ЧћИэqo/"Ж‰Wsйfюl4эШџ_с wо0іNјk’ifššъ‰BO &1чk_.п—)bєпЭˆL!+ѓWO7ВЯ„ЌŸ€жš&­Ž\!†~}#СпрЧHkM1|Ѓ_БЅCl-\ SuУV Вбл0Эјœ$]ey8В~ввŸtпіšEў’љЬ—ЋШLёиРжеNЂ1 ;Щ2?sfzЅБ,švЌЃЩГ~зK3ыIBO�6АQ _tйО{Ѕˆ*Рf_7{П5Цж‘нY"ЕTх(‡ІЃ>џNŽ}ž­омэwТ36о№І€лCcUNXE ­@>’мЅ ‡8–‰OХђ‹q,џёVShлиЉ/‹ЅуR;”дЉVžg‡<fgŽš4БŽВфк‘ˆ[{Kз„ћ%AЪl№_ћ (@С.ŠЭe[ДМMY)Г-fЬ6лfвБ/ф‡63СчиЗŽИmШy‚ћwуі<•O&ф L˜7ЄЮa Ил к7э­ъ‰№ЏиЕыО[FiПЉrZKЖ“tEюlƒ‡љ˜ЩVТ]mё†“кAЃй:зƒ lЙ™iМј@ОЎqŽ“Ѓ›SC:жrmљкэb,&ЪUБ $иЗх—љ—‘)sЧП”эmЯћ€3Є‚,ђчиžаЫOря C9Ќ™эr+§В[щЅ.џѕ&єžЗWw„#B?|?y}зБŸAїнб§д=ќ%)йюі›Џчё|LўjЛ_qgy$пуўьў.VдoU9Т@50ёHG:јGђЖW_ŒіЅќхѕпђІ({ѓžя<�ДЙ0П!QТŸcд B‹'рС6€ЇrPРBЋЊ)И‡лЫ=lиНоыНE[рОœ#О`IžVШБ]˘IО'ъ(\z>РR;2Ѓ>ъГОф<эK#oщ>„Т "1фЩŽџ+Гї‚?љЕS5 H іЃœtxПј#%§#ћУ.ЫП§Г…>Ш< БЏфЛ�Гt;Нƒ4DРџ ЄРzТ†BCН ‹Ї6\Рлš‚;дРђоѓР&X4m рAР1A )СьH*cИ†cС€"М‚СИЕЋAУџ@"Ћ8КуœNt�Юв:ОR˜П"<Ѓtш" 9ХшcB'lПSlT ІЪР0ЊЏЩR$и?/єТў›ЌKУJќ4$AQдU�?`ЄФ67ФY04дГ{А:ДР;ФFYаУ=ьC?М:m(�A<DВ BА ŒЫb"м1МB%Ss"юсФ’ОJ|<`ЬЏLдФMьD5*){Kы+Хf3Љ.BG*дЂV|BСл‚X ‡`ъfЖKь2eXџ>шB^фEІА…0Ц' Ч+|<`HЦS0I @IgФ€h, jT@&€FЊТЦ;4!’†>Ь†ќЦ*ЧA\Еq,>еАВэSЧuИSЪЈФˆ.єФ*ЩJДGLД,šЃВмЧ„ P ЪеИA`ћ<dІ/КЌYдЂ6hТFhƒІ6Ј€a"HџМˆДО.k9ŠФШМd ‹мШЉЬ/ЊŒЪ0ђВЎМ’T“<”DЩEZ$ ˜‚мRLYxL P@—”…н“К)h‚Ќ†n�J�ЭЬры†pЁDЭ$"ŒОћЛЌDЪаXЏШi‡b˜5ЩIЧ}ЄБњ“JПМGъ#ПџПЃЉрќЁ˜B3jѓJы3ЙOk†Іx‚хtШ†lƒFЕьЂpЈ�ЗDЉ+DІ`ЛEЫЛЫŠЬЫZ O4lОДофЭ0ЛПСЬЇr<;Ь“Ќ:lаC рЊCIЩф XЄФМLЬфиLœMаЄu‚р+MQ8Mz;јмКаa&рЬJТЉMшЅ#Ил”Ў[ЛРДХКє?FПNс,Љї*NG“ЈQМПЙ 60ZNbKцєЂ…ЄNЕ /Њ€KxKb’KM&ЛММ(Œ$Я%еШЫы2ѕTЯЩ Ћ=ЦоJ4њФ*=<ЉSL—Œ:ФLLP�A­:аESџuаMЭпЊЗeЊаѕЁWЫPу>,B#­фЂЭвЭЉфВK<QS$ИЅБЕ1ѓ EТ06“6џСВp`д,ЫЮFH�ХВ­�Ш*ІEЙ•3RЬ+‚"XвQ-ЯЅ№Т–3Ж…R‰М/ эЊ!‘ЗUHДљЌКY=L.UЬ&јRФФЯн€_%S[J@гb-€шХtUТŒ—Ъ,<МИЭY5АMi БlNК„в'УtЖNы4щ3CKcC9“ЛG,cдGНдщЌд6€TSјбKадПlЯN§TЬыƒP%е%­ƒНфХT§Х"хHо”R sеXu‚‡ЭФДеџ-m0mnЈX‹ѕ@` VF#жbЅ78жXж6EYsŒŠ{4EBЭг‘9ЌЄ%<iхV,…5XUWЖ#з^гЭтlж Qд.ыдumзaУ…“+І`ГзK дcИ„zХ‚KР‚|НE~O§уE€е:�л=ŠРШѕПT%бƒmOїл)НyㆇuбtЗDЫ†4ЩЛ%PЌТЊЛэН_Ѕ„_Эy“7MP‘uаn0Y•PCLYBœ –mYї:ПшГ–жjP<‚ЋYЪ9)ЧŠ/oeUГMиe;&|ќМпфSz4Ц{ЃвИ,TU…ЃUZc#”УЄuк=џEZШ2…ЊНZњњЮйеE.МH^ЌиАлj0U^фBв§SъU…Ьkн б9§>mˆ[ˆMau‚Э& P[ѕл&8аРuТ­} P�…УE\Qш;Аƒ”ZD 8-У"d,эгмшS$TD-’ПсдAа ]vM[ызp ШднЏ‘бƒ{ЯьрBк%^dZЙN]км оKшнпEрэ…ЋUе,Œ][@‚унE%]^чЅa8ˆWРсWxђ<Uф5Ж„`–У^уМAє^Й _sJ№CбЬ•лЙUпѕEPG7Gп,Ж‡-^гћЭп†Шa6ˆ0~\т—џоФ|/MLр"3р™’П`JEўbрnZ„ bcГЧ @ ZмоЎ[ .|a$рз•њ`мНнрХ‚2P„2Р”Ca,и…ГeЙ–{с–сІс:Ј†j@€0х†XRєœо­•]ыu9- �#>bЙѕоUˆ[аœлб|bJˆт%ІbJ€_AФbљнтaN\ќ§b…хd&c".уiУ/гЕТп,Ъ66)$DG9vHUŒ)а59œ-І<Ж^П|Ю™CнaмЭ VZ фB6фх2hч,L9,hфGŽфy†�ЈМОМLvЙёX сO&he^ц„(eŒœ^фMeV…ЫЋџ†AtƒX~Xя=bbbаш(Іbи‡}p`‚-Ж„aЎ‚nPi;ј…_@fƒ†i1nхfц–ЉрYп$ПЦЫ7оS+“c%2~з“[зo6лSv 'рŽ4Уџ%УL&ШЅЄзŠZШKfч}6ЖіT|vфH€�”лeШg­Fe[XёЬЫ> е:‚ч%шИуSJц„Јƒ„Оj†оП‡жkЬ#кЉЮ^е€ Šv7PPŒЦh•[ŽІФv‚b щiAKАlЫЎ‚”ОпhщhИс˜m™NУЁlмШ%Eœ&2–cmvHжМYВМЌ,ƒдЁ>кЃжkOJeДНФџЇž9CЖ=›аБъМ\ЌNUЌbU@‚]иˆh�ыы8ШХфцыNыЕXА‚ИіюPЦсRћe„jлс^k.”оОVя!Fч qаc-lУnl`D4}lЦFlнљ‚ЩОЫЦьЬітˆ†э?hšfЅaYсžmъ Ы4fNwѕ5wъ`“Мй5Xіf1ыжуŽмTдоЭ\XV&эР@o^LыДЮd#ѕчЩZnВ~юш~ae ю`hWkЖоnюіnPF€"ЧaКŠe6oАmёМN^…цкŽrї.эе†ˆoљžo�wњІя…_Фўђ,‚џџAМlШьЬ6fGp‡sбnp§ЕщюM+Ф2 &=Ы/К™ K=й№цgі�KГвЕЧwЛˆ„jVЕСАђW „сFя‡qTнПДжt$P‡n}F‚аquрёііТДЖъ€­цИ.ђ"ЇZx…СЋ–dF€АЅR]ы^—r_зK2Кqi5й-џЩ.Ÿп-щeіј…2/s’]SKр€kЧvhѓ†8їv§№*дL•вНs§ 6ЫyTиN)tOЉˆмpб]л~хZ.М4М0[ѕdЯюM?]œ фЊцuLчtфxLўteИqŠuuˆSGuџЖікЖhˆѕXŸѕYЏѕEФQF€%gѕ&іWвDНЉ С,/€љй‘]і-Ÿп”Ÿя,ŽviЏ‚5…lПvT@…рynя�oz9/у§ l‹ёгnєsП9 NxewS˜m}W?nфэѕJ[ qhrF,дY#UMР–t„иPХtЋЯю#§tuHhHSOkuИ�SGЯMŽxђьdOЎŠ—ѕ‹Ї…[И…"[<šхИўxV^МљФGФџk‡И“…Ьжђ•?VPА‡-wƒ’^y7f‚*8yХyпy‡P§ zg-РЈШэ<G_њй6!Еџ,›ЏШjЊџ№‡чEЦ!ЛиzЎ_еб§дˆ[ VUГЏШ)ЯnОŒ{Ж—„ЗqЙW‡$ею%НћNŽk№ћYќ[№+~Єœ0Žkчeu/\џMnr&Eз Й;Р•ю†5Џ_’-€-оr{рќ•{і,,XBЈ8p@хасhбРБЉјъ"ЦŒ7rь˜1Ш"G’,iђ$Ъ”*WВlщ€K0AкЊЉъцM\:wъlхSч“'<q=1єhQЁ;‹Ђ@БЉв8ЇжДЅЊjе>ZЗn`э+иА_`­:u*OUCзВM{'ж˜%gЪEIЗх]’ujещ[ЋV‘РЙџЌеVŸEдЉK#)К’е]hV„АжП‹ИшыйsЕаЂyа*}ы4ъШ9hMэ5ЕжЋ3"§йГцмКџfоэЛZ]–yƒЎвИЪhvьtkо­ єЂІOЗdњѕ*Cьш^ ЪР‚Л%Tј№МФ‰йxlяў=q’ШуЇoŸўќ•fЯЖхtш(@рP(˜‚BND§‡ [g••f\уXXxЁWPѓ UoЉХ[jѕчсMeнWW~љеu[_‚VK„}Ж•bŒ]№˜:‚QffЙесBg,Š&ЈyZ+Њ­ж“В­жFHY ‹ИщЖ—oYњмџ‰'ІиeJЪ-чtаQ'J7• %б}W…xqаO7Ы-wУyЅG‘EяљљЇF` Šп СЉ’q}иdN§эфTZN…KS6uЄ’X"‡ˆХЈе„b8ъ�ХpЕпІo5(ЂTЉ>иG—‡ 7ыJU)o…cf‹5s#<9іЋeYzфmC†&e‘GžK’JВжЄOBy-ЬRY%–нІЅo}qYЈHВЎdЎЙ'‰Щ\se:‡fškВYХsєВЩаœ§аiЇxЪёЏKФgŸ€ќ'ЙƒІ›А\_žtXYhШЊNЊh* Ѕ>zщTšІЪщЋjіCЈSВџ…'ŸёЧ-ЗмЉV ЧчАKЖ Єf2ъVDЎ€5гЬ’ьaйАь4cьБAжЁьВ˜vd,аF+э’ВЕp5FЅ•І,ЗUњшѕg0<зЬvu Ю/ПАKІsЮq /œєЖ]ОњЮyПб�pРрј-Ојr0с цТ‡›ФXyЂˆr )NЛ WY‹œЩ%Ÿќ9ш'#Г2Ы—›~UЇžжЂ8^`вТѕ7Л хКЙ№ѓГьс‚`.н­fЗ !гM;§є-Q+ягдЋ9яќе-Дrбi[пѕЗиƒF ы^В.б/7ˆяsc.ЧPНєЖйv7јК/Ч jлё џ|лЯЇО”RJс§УSтКg(�А€< Ќ†#Ћ­pшt$Вм[<ц2}Њ7šq@ч&К ўрЄ+ъ:ф@ЊЄЮS}ЈЙŒC3DчuL“]gТUЛммhКƒ!;„�<О€&4ФSГДvšW(OyИ`^єЎі<kIzе+^h„Д-э%+4Ќ|WЎBЅG|у#Пь€>ч ЂЈ`ŸћђЏјЅэ1А_пж#§ёЯvlЯЫ–E!А<уЇ(T№&| JєВmn7ЬрЩ:ШСPЃ,Ёу.з!Lšpuy4I�QтBe OШксБКѕЃfА#wЛџЛ™rи5(VƒYЧЃ…‘Š5цM-zЯKтєtšli vK3fЋ4ЄO'”uщЂF;фЩ! aпBђЏ5ІG"їѓлzˆ@Ч;’г#Ь<g ќЈNPP&юl ЏѕСBjВoЁ`ŒВФšJВќ”ф?_у€x’“™ДgS—OO&l>Lч;щ“­ZжЦ‡Ѕд!Нх;vАc €Q)Щ–ЗФ%д”Ї‹#"1‰Оti+p!Lд˜ДЂДRojEtFT>э„(PжM/т тГSQѓдё}Q›льІ7ЕрЗЉ†sœхМъFxњж§д.]u A/)BWuŠD˜џ>{cС+Бц5�§'\)йšА6Ю vMk#yњаг–Ђ)хЋ(М6РЃІtС№DXq•дЄBtV,Є ]PVМt)fЅзш"jЗH…жњjS’ЖiZЮWж@“ЈЎ­ц ф`TЂ>d›џ‚ъDРЁ€нюVОg)L€есf•lЇэо^SР\E(u Eы]Ѓ›9Ў€Ы[Ws�lJИЦІ5- k]ы*]М6’Ё [Ё}Js<Пт”ЄТKь/Dzб№ ŠХГehQšвШR–В;‰ЉO2{ЕŸрBЉPо-ђ+кЦNЉДD’вqYxgЪ… Ћѕ[4\›сˆшЭЕБѕ0*lџЫ7Јv€ЗМѕэўb`"И.ўH„Е(Јф*W.Ьmюxs|зUЗ/зuЭv) ›эЙZЋoХ+н$_i\ŸЄpI,кб“i п‹fЙОP bhѕ,•і—b, Ає’ФЫŠиГFЪя”‚ШоWДЮR*MŒУКѕLZnџьZјЙV r€Ѓ,МкеšиЗsЄ#‹[ќтIП"ЯШMmk–3 FЧ;V2#ЗвcЯ$ЉID2Њ„Œ'YЌ0$“Пцф+B™$G эœozL!№ Ы‹hРКќх0‹yЬEьo*Ь|цѓ2ІЃЌ›Ѕ5ќNЛС5­Љi,-cџ†ёyЊ#†jРˆjhAбZP@EV[‘о:њбћ‹4Ѕу­эѓb:г-йЁn0cWюЛгЁІюзМuЭV ШЈNѕ“‹MЗКсŸ2!Рwѓ™Z2Гж#3œGлXeѕкзюˆ3мСпybжeдt‘Š•ЇТki6Ьwb‹ўЮДи NpЕСLLѕ>6ѓ6юсжУ†>ћр67†Gо Н"эv4KяxS§чˆЋЗНk…ям<М&Аю:Ф^СЏuMГЮВЉj5е|7п�;мзJvаˆ­PшЅOБЋЇоћ34WТ">ЮЌќкњ=9Ъ‘Эr‰Бt(ЮцЩЬћ[DŒ?џv˜<—2БoЁ‹п\О:бЇš[Љњ™єЄяГ§Lмt6<нн]ˆДЄЉ^uЮ_=” Г’–тЎћнЏU{,ЅЕ‚oЕhU—сМзИЄXwZ\$БШЛоЏН^"б‚JPBмZы+ЁЏ™‡lтiЮђd7ЪQk‰<Дu §[WОzХжEЅ­.сУ юѓн'UC_t§ыVѕMwt`�ТоФ€ь`ќЩ_У`žБФпёС’•aЯя)бД_“ ƒfЕ]ёM “ёэ”г0˜ хa[Ю9ЭѕaŸі бѕIјЁмdбeБм€ˆљIЫu Ўžќ]„6пJаџ‘Ѓ 85ў)@šиn NEŽ�V!ьХ�" *рK0`ЎФb}‹oD`ЌБšЮ]}FOєR™№q O<A+lŠZъŒ MмЖ”їpе ў ћнЮнй-Д`(С‘Ь€о Іœ Њ\*м$оЊ˜пYŒŸb.=_nb,ЄBqi›Њ>СЌ‡К)сКAсnэрьO рfЁj!*—~aJЄ!іdЩиэŽ!Žc1Э6k,б2ўRтТgHмNcђ‘с™їLX—ДY#Jл"ZžiЂ"Щ82b#>т Ўм$Rb%BЮ%і Эџ" Bт)OGTмЖ%LдЕоъ)€oM•ЌЂа5дE])Ьты]с-.$>™}аXУ€Ёmh5VЄEc• ‰Ы­Ё/1ЃGТЁГБˆРбсEŽ 2н—ж(Ю(ІB<v#ъ—ЬР t@9žЦ pт :ŽŸ:Nb&•_ХШРЃ 6Ђ&Ѕ. с=вžтd)№ЃгЕ^@њVTJe8ЅТ Cve.–Ы.’J Sз”ЄYVd)‹U№~фЅйNPфYЫHZу5ІфиЌф#jb'Ъф јТMЂF,ц~Љ”HС#ђ$оСE€аЫL"KЂc&"%eъЄRтбibJ˜џ€ $дЕлSJЅhњVbeBFкbWЎf.B$ŠЈ„ЦQQ4Юe5’ф•иehє™%єtЄЕ€d\Ъх4–e]rЫMT6д6ЂуaЊтA_І.I–gб dBЂbN"F№лXнSYд‚$х^’YњU&y^І{h•fžD А˜ \e):хhŽfvfдеbjЊцjВІеЙцkЂDƒЕ—lњEmhr вgIUƒЂ˜š ТOјbFЭн€ždi!'.щ(mcdкрaR' :чГDчM‘ˆZчN*f$ЎуvjEц<x%O^':&eyJцСфe> FDZi:хўЬџQы!a‘"фыq&gВX~цч~F)Œ)'ЂŠшD^ЈзT HjЉ—#E!@ƒ:h/Йд$QP<оMdi~щ€:иВb y(&в\ˆšgЭРaњBŠђ—Šк ‹іф:2ц+дXAWYдС+и(‹тhQ:Њј>’‹FРо,)|>Ѕ,š&BjхV>)WJЉЈ6d„љЇЁˆ–f)˜К)ЋВ*I Œˆ[>(šEєќGЋ@QЋ^ЈNž~щ—нбщкщdVfˆоidцdJf Жш f–pg q…Ђ.*Ѓ*fbB*ГЎœбк pD{jхF�вQЙ’Ћ’z*”Ž*ЛŠz†џ%�„z™ь S›юjВx)пё†ЌЮъe]ЭQ0Ўиšъъ—lNб’єOБЩЬ‰\ыАЖфВЋ. І.˜@Х†hХтhГЊvjDЗHыtFЕj ІЃxB*O’r‰G„ЋИ`�Є’жlЇzъЇЖЋЮ†т“Љ“ЕN”ЭkЎбRFоkОjNaшqFыXљkK9оPL…ЎН)œчТ2lУЦЋ6о‡ЕBljЋ#іЦъuЊЧJbGTƒё”зХH5\Фй6+Ж*оЪбэЪ–S6v(зЖGjтьiZjЇZ!-:)ЬЂцЮЎЛ>$�љ,mUа*XЊ:и1ъЁ•U­хrMЮ0џ ™Ўд6HMDЎН^ЎТ^­†Ў_ЌиFxьЩjЋјЅ‚ |ш Ў(Ož-кzФХнлТmмЪ-яš-Ё^•в‡Ÿ€*Юњэ�/jцч$/т6/Fфу6.аŽц ­ш^/і–_№kПvюЮшаfo†Њ`ѕ^ж*nplэ6*ыbчыжэАњюйОЧl‚`1ў…FЌяьzmяКЈ‹Эiњ ё"/k%ЈАѓ&0Љ~х‰DљNй‚ŠЏ;XEYIAхЎј†ЏхZшъм›œщЂoLДэђя‡ІьјНoя.цќњI§"Y–tDмюnџ>ыЄ9l ћЯА“ть“^+џА3pƒ„ЭAnœѕ]гLАё,ьЋІъ”Ьцcp[( йB-ддх’Ўє…pћaд№тЏФŸœp ГdvЎ1‹вюСˆЁёi ˜№ ›Ќ †ч ЯоєK\е�.r rЈb„~1k­zŠDо=ж Ю3Xпy1%Oђ[p'ШФАJkё”бы—yё'khћ‰0єб ‡ЊDсиp;ыЕBцјЙ1сPшpzЦ{д1.П№оGКМиџ20#В0ћ‰є‰№ДсZmxёWrƒАєVЎШш&›•ъ<r%—_'жЃQžjJ+Чrvцrћ€Ј-ћ‰џvџ­9џ.CJ8S0Cщ3>Їgk"ё1›/ЮeœЮ‰ђ >№??3лЦ4knљQЬЧ@_`ž@os~usосЉЯEфI ЛВ ПГЧо‘€h№p‹8ћ/Ki3ЁФ-ІfFђ!ч3L›SТK&Бi-œ)Г6oѓK"2янD&ДBѓGCЗ­ŒдDW/E/uNZtcIPšG?ы;_Yb іTУ-”<7Џо~ѕHФДXuBЕ^1u?;2ƒЃ?ЃuAO[{ ѕP{!a…Ј!u˜IД[wГEWІу†ФNuWЌ;cе-0K,Pш, ЩV“5сќ5H8Жd‹ѕМ�Nюџѕ›™\љb6E бD5Џ<Y9NцO5ДЕ7rЖ`^v_ЗЖђаJ 0$4CЦ1…tZ*K,Lіc‹elѓ6pчГЅYіeЋЖqŸrqwv1ЈxіЋ4jwaК6uы’žEiW/j”к6P‡єMэvpЬu‡7y3чE›tЇїj#‰Ўп‚m‹\/ Њ`’ђPtЛЕsVЗQ–gkлEyлбѓЭ+œкxџ71O˜'xg&zЋ7fOžy[r'иєСwXѕлFм1сЗ~WІф…;5‚+јСдмmї*~Ё'‰ѓЌ|ЌИ‹Зыqї ђuД!ињ§`‡ЗЗо5ъ}wZaєџJеx~чј~ЗoKіЕПИŸdі‰GёN76“'ю\LЙ•{eХ§qљфЅ”'КфГL7žЋE/т‰їИЋйuЌ yђЙy&9’KІe~3XЮ�\y{\і >ёЭЉј”‡–уЙ рЛn9e~Й„Л9e~x ’9˜bšЁ<‰WВЙЂ7:ХЦ9’‡-Ѓ;нљ oD—џ3љš/(њЇ‡КЊПиqЕv›CјЅ‡Ї_'™ё%…G:зu]Ѕ/Эв8ЭЋ[4™kКАkКuјЊ_ФЈt”‹YЈ/љБ?ћЕzЌыїЃ{Qъјg[јк~ŠлЩZœўКeІŸЕkызТ.ВХљkћБ'џћŽ‡q.5ЛКCЛМїшiM{иŽљИC*ЖЖHK:ђ! ‚ћЌчЛјЩюъв-БЋДМѓЗДЁvСЛIЬЛФїЖVй{ŽжњР“ЛЙ;*˜ѓЛmуmfфяЈЕЇ,vЖrЙmћ*<Д'9в Ф—ФФЯМсT<u;:ІМСGІЪ_Мпzё0F\‚і:!&ЮЃМвѓќмВ.ЫћєБћzЃ\v3љггМжГј9н|ˆч|в+=Ъ^ћЯŸy #]rЉбћ:вя<ЪnќвЃќЩG,ЄfНЊ%eM}{љеПИнo=рK;А“=и#yмЇ1суЄЧУё*ш-ЕљЮ>ЪУђвkџып‡:ЫНТзЙдЃzF>ш?oНў^ŽЛф#>сS#(FІeЯНфS~,‡чўnt+ушхКx.::Ц|T‡~шЧx xИщoќмЗ№:Ю~Гњ|єQЩНš$†В§˜ъслё 6э‹§#š Д›ќŸ&І 7№Я<S?чЧљщЗБЩZ?нwzѕPй–†МвJ?фЋмм'?G—3dbџFуПмЂ#@8 €Џ&TИaC‡!F”8‘с‹Љ0ъвИQWЌX9bФx‡bI“'QB$ИrЅA)aЦ”9“fM›7ВдЙ“gOŸ] є8”(HЃGE&UКдbг‘MЁF•5џ)HЂЗnбBP+з:_С~­5vlиАеъt­†�VЌ72Ѕ*5щTЛwёN]ЊєhЯ q\бiЦЃF™VLѓgK–‹!G–<rcЫ—/џJюсУ{A?Э;њnеWГnUk–uыЏjЛ" хіVg]JIOEh‘Hn’ }^ 2fЧ:)'/ •ЏgаП•GGИгxСвБgз>˜:fяоЋтьёо‹ИSЗИ;wѓгSУFыšО|ЖВk )R=TрН›z%@§Sh@ѕDтЈБ№^кNЛѓм‹ЫМѕŒь; zЊPУ 9LшТA,ŽЇЂШ ­Пб <аЎ;Š%5еКЂџЏ5љжbkЖќ:УЭПЈ€“Ъ@"zK("bX:рŒєm)ЫЌCЪ MЧŸД)D}ЊRЫ-ЛвKЬšя#чžыР)Lё!Њ|яEч“ё5mЄхFы*№Ь#Ёъ­ШWb’H!]Јаˆ”L*ГЫИTŒ9)гг­б”ОФВБI1Э4ЂJ9]АБЫЬ-Щ#‡ќ3ЁAз|4ŽргъОефЄБF;oФQЃ<Љ4Эн�$вTA 4XSMQыx ѓ1MiЂkB™Ѕ<ПМ‹жкFЇэDe"SЎѕdHXb…Uh\ˆT]ѕДЌь|Vив’ЕNкlЛMД4ЧНƒ\_ нџf@ЫE(`†ќ(/‘В­іZ”VфOв…вжRЬ Ўx;‰1NіВЯžѕЁqЩэї_€%JW]йuWж•k”­жЗЦМ5в ИрRЫѕdBџЙH fИАяИНЮтхD=šЁŒ‹FNщЇЫXjšюVц)Унm"bўYчCšАцPnWe–cЛЯх—ѓ“PЊI;†.Цѕ7Š(b`І_@ѕŽAю(ТV(шbЯ#кKЈ ёЉ'ўёЧeb\rd1ЛзЌ%*вцЎУЎ;ьР{МУ4”йmэДеІѕхzE#dЭНо&аОнцnМћЖ;я�њnл{GшѓФSщNу/!wџкЧ+mВъ “~г/Ÿ—Књ@ьХ:з…†яZXЙѕюні№?Н(;rKuЖNW{mкpŒй^ _Џйoп™Ё№лЃШŸџў™q;рёЏ|нkT>t=ЊBzIJž G=6‚Џ€рфЂoaNxхУяЈЛ�Š€!,`шЮг"ЌЌFюsЁъи6\ Ќ~ �ћv;tDўг!:vјПџа|ЃкЦ*Ш< bHbI\мЁ( joW‚ѓ иПкM‹$тљRvЅЌe.Ќ“ър?ЫQщuЗу™aо ˆ@dFwXG!b‘ˆ##ЬŽHЃ9bЧcZˆџšDШŠ2ŠЛ` fH †\‘Ž{ф!љЇG–OWTQ!mЬvF­Рm№У“УˆРГ@Q€tД€YYGYЮr–™de§˜"Ÿ8qŠŒуx95_2 ˜4˜Xв:ˆ|Ю–Ќlf35љХ?1ч“ъsекHYJЗŒGB‘zE*u–ПhђшxЅ№ˆ3�qГlЇ,щˆЩMі8WЊ^ѕ†‰-djыžпЩ'—fL/=r O™dЁЫZ^R §]рLх”jЎА]йЄUщEЂљyœВЛ#<Ы‰Mhb—4IЊN3ЌГ+ЅЅ<ŠKйŠџм@ИD›jЇ=-šВ jџE„ЦѓЅВ|gWъR˜юp„бˆ­iQ;a4ЃњqлR 0ЛНд–')ROšд•ŽTЌb-*O8šzЊR;ЭNѓрЪVфЙU:qэii™ тxF-jJСjжЅў. y*TKgQЊn“›ЗjJVkgЛГšдЋ(Uч?4ёВ’ДЌ‚UЊ3cк=)ю’ZŒд])sШвц•%х j'ЃZгтдЕ+ 3 KT•ЕГНь` Л“ ~Š],ЬN9ГAхЭnя|'eO ”ЎєееЌЊ›YЭZїКщ<ƒ&AœТЖKwmMЩ+ѓЎз8Н­я„ШNпЮ—КжMъwcšсџ"6ЊS=nќb†ЋхЮбЛХЌt“Z]8p—С ююoЩЩЩœю“r:MяLЂиЯу їТ1Щ№zЯ[)’м0ЄєЋƒ aъЗEФЅЊџЋбь­ЇTЅcUj]8,јКџи1Мcю ™Лeuhљ8UлЙvи$ ў‰’Чф&;™Ж�pЩ•16b.vЕОEFё—Л‹п‚нЁХ.ўoŒы5c’|/ шф!}‡Lф љЧuЎsƒqZ=™‰@Бђh7^)OяЎAбŒ•Бhšа>эs•ЁЌ-ЧѓЦ]Гэ|чъоwЉc.3ЯŒQЋЦХ?ТК:хлл9Ус@оqЋэ ыLџИџШFОЅэЖбМ?SйIŒ~ЏŸМk`ћzІРvrЄwТEwbїв˜žЕІУŒЧр}дЁ6%ыfFУ�Š”ЅЬvpЏ!ыW‡ћЧс6їЙХMыM vˆBvЇml&ЩЛARІ7•п-iнvљйЯ&wІэћй-FсАœБіqG=?њх‡œѕvƒЧ}npЃ›тЗ3žлЩ?~[3Ў№Н?Юо•xќб 7fО‘Уа;ЛпЌЎИЙяЬiLnƒЬд&нС㘹жyєЃgyЌЯНŠ =шK zИNqu™œx0Шakr@Г–оQ—:Ъ*Йэvе/їЫ•Юc#мцfЦyUїC’ч –џі7вžtsЧюuЗ;К~]=:Rъљgпч ј S№јŽbСъqА_Уюr‡Йия[pЮLўьŒ•пHДкПuj7Ш`oќчAпјЧkZЉQрће§NШ’>фђў‹"WЯњFb=й~TќЫCtX\ђ“ї§ЭCнXЬзЎЭ›їБ‚qŸ{х‡от V*ЦhЁЂUPЎ€ОгЁзРъЫȍлnП|а?ОКНџ§љЯ|~ Ьv+ЫУџљCЬўuЏПбщŸџќ‹я›bC Ф”%zHыо‚Щѕ~‚�W EޘЬ'*ФяюXхќ(ђD­Ч$иЏЭH ўтЯює/EpџїџZMГаAЖИЏзiХYА`зЎO'Фчћ7Шy5,5bЭl‡ЌOўH№‘№ўDЯљRњ8NњяZЎЇнэ ЇbІpЇ† Yb‹ ш€№тЪЎ1РШP#ngЄ| н№/ “ ра —PГЌЧ AФZ‰ѕИ0№ю№—I OO ЬрG&Ш№qђа№Єж№I!1%q)1G0щœ/№УАoфєщщ^АЉN В№Е>БЕ P�UБЇJJІтћ:HЈ€&iё SaСXЭўBАyБ%‘…nСЖMёIˆ1б1џ,ˆј*)ILjБ)p#шnў|qЙ1E0џai хІ(ьэ№фШб28$ыјнQr4ƒ НH‰ˆЬ€ ЌqcaO CДБВщ/ЛŠТЄ:ЪAжjУFБаfЏ�вq.F'сёqjнШiњЈUN'јТœ%*‘Tr%Yr%!Б%]rыЏеj3rY’у&7qз+:tђ!#rršфЃ ІHЬ’оŒКzb$)P'rщ."&Ѕr*Љ’gR1Ј‘H2T0!R(зоИв ;ё'ݘ–@Ю8mh)žъЋ1˜’3xт_: ‚*џё2/YВЏђ ЭвiИу/УR0ыMН“оАЎjў­жŠ ТМэ.ƒ)Т Š(Eю@/133-q РВЫR˜p!s‰s4Ѕ&0Dѓ3™‘'{bєœЯФN г г;Ќё2BH"І2ts7[’75 ъЯЎ@б№8 &Hф0'УВ9WБ чOЮšM6DH3@Ћ2b7Нѓ;С3<ѓЁ97N5ЃˆRЬK+ѓ<уб˜дѓ+пkЋЖъŽмV­прЮKx№B2МИ'<t@}&!‘3;Г&=гТ&Ђ=д/-’,T"Д+Е5cO џЭхв­ш– <Пфќџ@oэ„€†@QT<U2bВBƒRо абЊN%šё0‡5R'JpёрЎ ЕE.Џ„DЁО€'lРг”дОsIST7U8[OGЇtGЗo>OS!RѓНв4ЯвJљŒK—SK]=7ёJIбиШS:Хўа�cbЁR^Г#‘r7—єN•4№4OQt%ЗTkЪ<3CХ ƒ~-Aq4ЛLyТйємєMяэз)ogO15S T%A4GrQб4QЧбLН(mRTiK бТƒP‚uџvMŽRюЏv(SuO4Jџt]ЕP2X…SіˆЕ№XЕUѕTџН#JзT_RъˆrнŽЪЏъhIЯ [Я�OГUWu“OC@RУ4TЇN"ЉU­TЋєK/’\бu=е5іј)YM•Xcв'‘иФР1р`sЅ A[VIv[w•IУ•T™U^gДяŽUawPжXW•^=5BПd/SR_/—ЬЈЋ`EvdНU\ЫTAпub9:SѕѕЯX•ъиSb є%Uђb ЁMСP FіgvOб€cїеTe6^W–8ebCnfEQiЁTщЪЭhŒEЉr\г” идыZм!lAdЧ–dёєf#‡U>Э29o2XQчеЯ„­jџБФi'<ЙOC}єхФ6lГѕoЫіg mеі\‹cзMU[–bUгnq—ћ№v^ Эn BиO7PnWB уюGOt—@pMpжpГRsџ’ у–НXЗmOvrЉ#YWscg­–v{8 2ыюtOWdUвДЖXн•wgй4LyсqmїvЃ7wзumгЖQ}їwл№QГQ …wxГ•8зBЋW'пэuеёLЭWBQ‚ІWŠІ—zЖ]3`ѕYнPџvјї{Хw|ЅbбЗ~ХeЭ•€ззЇтsчw€ЩWrБ7VЕ1ч-и‚Mз;ЗsНдйiџ/cщw5?еzз“ЫG›ц‘œЕѓЯ/8†ХVƒG•vWеW…‡“ …WЯƒ™Б%’c8†э4`‘—]닇mg—˜‰W!W7vЫUyЅИRАVc‡x Ё.Xƒ Ж†їŠЁXwп•ŒЫиz|а€X'ЁД*Ѓ23WŒУјzЇгXŒK ѓ8}Ѓ–€ѓэ;х3›”`Г5Uq˜U–‡ЙeпЗ+a ta2I љ Жu’­X“Ѓ—“ЧиbOиŠЭ3Р<+љI[Е•iЊ†ŠЯИ”–k—”з†л˜–Aљ'œДWU™ŽYљ Тж‘H—wй|‹Й‘џynЏN™эxwyљNy@15p‡йнژ8yл6›й=w–П9qЧ™ƒA˜% Vš ”Iі’…Ylu ЪжјyKxXЕLю9„E™Ы™n—й'ДUSПЕяД`w PnžџйX:ŸкфК™Iј™{"  š[ šlУ–)Ђ;zЂС™š™ё|ŸзЃ­ЏŸAnpгЙV[ї—Ѓˆ'QњЁWuіTњ˜kњeUкu-u 6Ѓ_Z`Mї‚‰fЇуXg7Ѕ]uЄSP)ЉЃњЁХvЈ­њзЈёпrš‘_WЊmк•ЯX‘сж'ўіЊ­љ{С‚ЛИ2УƒСЊ§ЂџсšЌй9ЛК‡ЭЋcР7­еZlcИ­S`Aј8Ў?ј99юАљzЏ3Џ‰В ƒ[­‹xкк­§БI“ГУкАйЉ?Л‡%[љЉс‚+;І/›3[Г[ЫГOЎЉ­Џb]PЖ™^ИД…’З'Ч‹e˜Е[ћ‚_;R ЈFВq{Д—›}{5Ÿ{Š=YЛxИ­›­_ЛŒЛА3їЙE[XЗЗНЛЙoYbХ{ЁЩћ3ћК‰;Л3{ЛЙ;qЛyДЅ/К[ТО_–Й#ЗSРНЛКнћН{6сф›0q;КЯП“;Єщњ|”їћ;Р-\Рс›Р7!НёКžџп–z"<Y)Фчї­щ;ЙIм;рћТ‹О3|УS|ГcмЙgМvkЇov—•]мИ/МЧ_< „—w\v™„УЇš›M8иrœ›œ%МЧЛШ{\У < ў�Й;йІ‘ЛСŸ|ЏŸј0­œЪЋмЪ5ЫџРРы7vУќМО;ŠЧœwђЫ99Ю32 ЪмЬ<Э…\Шз|ЭйЮEšа §ЭбёкаЉ,ЫїМЯ7aЛ§ќЯ§v€‰х=3НУ§,QГќЯЃЭ мЪєа+}Э/]гџbгS~!w?НСќФ]yЦG]Ш­\Шmў\е+}Z=ёМ›џkнrq9йН<Хw=и“�еS=иWеuњЭa]TГ§и˜>З}‰v`еЃ�веМк‰}™НаqнЦЕНлЁћ'У}Э­ЌкЯНк-Ниџљл’пSжпЅЛнмОw�б}оЋ=Vи'сГз]№ўФ#оa^рEœг`&и9ўр-§т!ф5~ф'A$оЗ+>”1от)ўB bф9žиY=цEžф5^рSўЃY^ч›}ч!ОЇџц9~т!цmžф;хs<р§БЕщ'wтgл8l~Њоъ^у“~чЅЧ}^й)ъ;iYD ыоьеоьП~Щ^ь™дџлох[YдžфЯязоьЗ~юoлсžЁыоя1ўXуМіўю5>ёйž№§љ„џЖОып� еЃ;ёѓ3ПђяЛЪ<?У.?ђw™бw:ѓ7Ÿя3ѕC?ЖEПѕgћѕaпž{;DVџізўіYі3Зіy?іх‘єУšђннKAї‘џісїя{С…Пu››ј™џч•LЖсњ“?ѓЏџњЇ?ЖЋџљUиГ—Оћ;ЛЃпmћБѕбŸћЩпѕЗeќЛ_ЊЅП§ŸООЅ†жџјѓŸўkљЈљБ"Р �Р Т… :|1ЂФ‰+ZМˆ1cD„ rд‘'A$оK’ 2ЅЪ•,[*ќшЁЫ™4kкМiІC8{њќ 4ЈF™ ‰і‰д$JЁL›5jЊгЉTЋК”zАЃе­\Лz-(+NЄdEјŠ6эK­ХЊ} —iXЖqыкН;‘ЃлžЪr:‹7АSНt>œ‘0тХŒбжл8ВdАїNОŒЗВeЬœ;{ў :ДшбЄK›>:ЕъеЌ[Л~ ;ЖьйДkлО;ЗюнМ{ћў <И№сФ‹?Ž<ЙђхЬ›;=КєщдЋ[ПŽ=ЛіэмЛ{џ>МјёфЫ›?Џ< �;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/results.jpg�����������������������������������0000664�0001750�0001750�00000056264�10513205402�024134� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џиџр�JFIF������џл�C�    $.' ",#(7),01444'9=82<.342џл�C  2!!22222222222222222222222222222222222222222222222222џР��шж"�џФ��������������џФ�N���!1AQa"2q‘ЁБ#BRtВСб$345rs6b’с№‚вCDUVc•ЄёSЂТџФ�������������џФ�/�������!qA$1Qa#Б"‘Сб№BЁёџк� ��?�чњ(Ђ€ЂŠ( (Ђ€ЂŠ( +vЂс?4G“њda?iтЇсv{zš „ŸF‚œ#ьћш*tSJb7їР+/d~i(§хT€ь№P+'РМШў4 к)—+БыГO–ЬдЛњЊe+ЯиЊˆИіaЈmУ.ЦZGџ�UЅ7ї‘О‚—EnЭД\-џ�оЂИк[Oк8­*Š( (ЂŠŠ( (ЂЖc@™-@GŒы™шR“ЖƒZŠžcGоŸNс'бJћГYП з›і7ЗЬ•* н<Н!vOТ†—ўUџ�:а~ЫrŒ2ь'@ѓ м>ъ (#­Q@QEQ@QEfb$‰*†pŸеI4hЉ–ДЅхп§ЭHk Vааї’ †y№я(+”UЭ}m;Н(yЅ`дl‹5Ъ %шO$Й4Wв8#жОPQEEPQEEPda‡ЅHj<vœyїVлmЄЉKQ8�Щ$ёŠИkŽЮgh;]‰ћœІе2ф‡Tьd'"9FЯw~pЃ…Œр�8*е“Гл]ЏFщuі“Љa{ZCЁ›TЏ=ырЏ+PС СAТMЊ;Iй™лЇHЙшоЮЇЬsМ•*оЗž^а7-MЧ*8 ’zP%шІ>€віkн…љ7}ѓЩ’ІТЛеЇ IЦG‰5kџ�У§-џ�Тџ�ќ‡ѕUn^Љ‡ц–‰мxџ�*.OД<n>[bНmИћD’6Šyсў–џ�сўCПњЉ7zŽдKѕЦ3 иЫ2\mДфœ$(€2}+л‹ЮЧЩ™ŠDіћџ�ъOOъј9жšт‰}ѕ§ІZ4QELZ (Ђ€ЂŠ( +4XЏL†# ­Хœ�)я ћiˆШКъG=М%*РQљgЇй“с@ЂВhыЕёф!–€Г„ћ…JWЩ#šsщnТТ&ъІйЧМ{м8БєјSїšАъаєюŽЈvИm4ђ“ю'nч>uЧЊˆљRSSv…ЈѕCЮЂыqz0r#Ѓ)'Ш`bХsд=˜шGv­пЪ“‘бДќЄўрЊЕл§ .Ѕ•*УЇк‰ ‡d{п\ YYД}кќЎіOgгОwЊОпсS2;8žиCЏОGJ€эЭ БkЉЮ•~]r8QЮ@Hu}ў‘ъw&+[Iяж9ђИєЮqZi‡`Пнˆ%ч�ЮМ§У"икћДДкањ”P[�œЋЪ‚ЭД]lИ‰Mj&Ѕ8Д*@н‘хШЋ§›§Ё.ЁБљgNГ)Ђ�.ApƒѕIніqU‹&ƒ>+qпeТРJYѕ­;ЏfSэЮїЖз”ЅЄф№GвЗYі]­н<ІрKsнУшю“ъ=гѕЈ=IиT9ЬЎeŽKO'€б Qљc)WнHћНОя['C!yЯyнћЪљšигњгPщwї[ЎД‘ё4VvŸЅkю‚ОXиќWFBT‚…уќЇјfЋKB›YBвRЁС`ŠщнкЅЇZEќі#7ЌIBQоŸ‚}в|‡КkЏь†ЯЈ#9*ТН’іяіUЋ >ф|ДЯEI^ьsl3зkJBвHŒgєЏ6Л4ЫЛл#4Js‚Гажƒ@Ђ�“Р­šwГЫо y)n+ЈIч„+/­3lнžXt%Эg), {ŒŽ^pљсђычІдНЕ]L5СвА›Б[ТR юzљŸ_Z ЋВ+6@•Њ&Т€вFэђIRМ№щšѕ3_v_Іr‹l)7Ч†0JpињЈџ�ѕ4‡•.сw’ЉфH–ђ.:ВГіš”ЗikЕХ#ЛlЅƒ?‡ѓ cНўа—VжЖьКrгЕpсJ#ь)uDЏЖЭ~ђдйŸnŽж1ѕўuЧgГЦVИЪy)Ї~ љV6 к[†ь5ZTх:ЅйђTЋWozІbлeЖр”ф(”­_Tœ}еa‰л.†Кe§$ф'?^2RМŸR6ЋёЊ§™Ыtwб‡rœ–дМЋ5]“І/LKT^хЧ–HкHўTxњ FыxХћ юЏ=•&#л{ж§=яК—zЃВkНŽC‰mЕЇЪT<вЎŸo5Kq‰ЫьНфœ…ЄƒLЭ)кn гV№ќЩMjKОыё_Y/4ЩЯ‡žEіŒъš}Е6тzЅCБзIПЅtŸiж\ДЪкі 2ф'ЕM+ЫЭ>‡ЁєЄvЄв =%H}‡R‘д-8R~cјаWhЂЖ [ф\dc ЈјŸZ P ’|*г`а7ЛђбнEq ЈŒЄ“єІfŠьО OхнE!a фa%CаŸїж‹яnPЌЬ9nаі†лm>яЗIOФ|Т|~ЇщA!Ї;Ё"ьЄ4кх­џ�><+z]їВЭ$Kn\(К…cЙ‚УъAкцЄmчTj}Zщ]вс:p$”Д3АD'іV‰)–лJтДТ“Юї�ќСўT9}ЛXZгhб-9ЯКф•Є<2OуQovщz­ŒiK"'„­•(чч‘јUнЇІођуi~N8Ъ=3Š‘fЩi‡m}›„gФаМUЪGЇ…кЫлsј‰‹yбб_ЦwМв€*ЩђROЫ­X[эВ§Lћ&H›gx aЦ№йє;J‡з‘ra!ЗZі9KR€ ЯК|ВfUžєъ!VюљЊіњсйm‹TВfY$@—ŒsоЯЬqJ-Qй…ЮУ!ФЁ ;yкFxє5YЖн&YfЅћtЩVЩˆ<) gзўЙЇ%ŸЖ9іјБсы›{7(2.pH ф ˜?:3ЌИУ…ЗPPБдё]!~ьЦЭЋ,ЦяІe7.3ƒ-ьх@јњuЄ-ѓOЬБLq‰ ЋjN7b‚&Š( (ЂŠЄ,_“ПЄ6ЯЪџ�сžжзЖ|_ияў{сЯN|Њ>ŠўЋИvAЌ&Gv~ВКБ+A˜АЂF[lG@�aіsŒрgŸ�:�‡jVэ чgšsл/3›іkSŸv џ�[УMья?6qœ5зgФzxs…Y5&ЕЙj‹5Šз5ˆБeьё”ЪДэBrМЈ‚pишSAxьДуLЩ§Б_ИŠЛюЊ/fjOэЧФUзurмЪo=МОiеыѓй<ВюЎ~д_я5ліЧП|гѓu ѕћЫu§Бяп57ЄзWЗ…ПВёЌй<GюЂŠ*ёк (Ђ€ N�Щ4SВM НWN Ц;–Ѓв‚хй‘…f…#Sп› f:r7Ї‚ОЁ#=HќHђЈЎа{\Q>mЖ•{3I'М”O)Њ/Sдњ ВіЗЈк…cbaЈlaЈ­7ЋœŸџ�tГаšъT*lЕ-1ТА”ЪШўd­o,щqrю}Љd•ф 4є—fЂeлОHVеr3ыч^.:> Ќ‰їw‘д})•ІчЂLVq9J’<ш7тй %ДДи<��ЅIЬв^бБaa РШ#ЦЇ-Џ%Ф‚”сšздwцЌpЛеrсјS@ВЛiжэ7G•)е№<F)iЈкEŸWC˜ДmhЛоcxХ6ег'1ОmЗ ЩівюњѓZƒSРŒєuДЪ2Aq;w|ЈZ?R@•ЗМ) QјБаеЦu• Xy BЙRцКfC-$Л nX№lёвЎpš зKФŸ‡PŽыєƒƒђЅ>Љб№dЬj%Е њљ ТЙlyƒќ)Ёк тS.Зl…€ЕЈ$уУ=M`г`C†ќЗVЄ ЉJ?ЄqAЮ7­-:Ьђ’Є•Ч@ѓѕЋgНЉ\ЌЃBЙ8Љ Ж4ђ§ч#ф|Sц“єХX/qП\жIJи8 •,ЕEћLЭъeMЖчQŽєє щmgЃэ§ЃiяjŒ76в SjјИуў‡ш}(qЕ6–ьыLВЖт™Z•$ЅQоoЛмOˆЙфŸ\ŠйьV*TmцйŒ 2АЕ{‹§RЏ,єЯє&Є{`а‘Е%z–Ю‘эMx@9р~†+tеw IvќЏsyйЗп™dЭВ<0:QЩvд“$>Іœ—0 ЫHр'чќ…1єV…0ƒ<ЁЗлyДИУ•юžzUОџ�jrЭpTыci.ЅМh wƒЫч@ЖБvw5инєіTбBИg}ДdСn>ЧZї�лSњ3TEП?мрл• jіХІ7дѓ1—Uc4х[!й­iUСcк\ ЯУK[бˆ­]nr+iqє…•т8СЋоБЗ"uйNI•„$ћЈ ЅХХШЖ]U жђчz‚…Єr@>4 ВЃ`і–š!Фœ+>5ƒM[–˜\чЄmЯЏЅMщ‹ќ ЬўN}(%\ ŽП:—дёж—yЈшJ0pš жСRХ*C;е+ Cчц)?Ј4…ЯLN\ІP\‹žЈcхќ)няљ6 v ­k� šQИj6нiјС–WЦв2Ђ=h–{ЌћmйЉі)nDИ$;ГД+GN|Кxщ{`э.lкЅ–у^’”Ш�$ц‡ЫЇЪ”кЗGЛiЙЉDЇxR~ќљЋћk­ШLЪjkJv>/ŸЏуAwжšKАъVсЅ юпpд„ф8 Рлыž1сše[ДжьЛO7xе JЄmЫ0ЩRН|Ям+жЛEэ#I7dМ(!ьfŽЅ$r‚O‡=G”§ЃХдfљВѓ*LЕЧФp;‹{G<Žwu>$š ЭOЌцkIbс”ЈЖжŽa[ZJ‡™=1“UИА[7к%6mjќдFјЯЯШ}ѕpбz<˜эмЎЮя=PжxHu!NFWЪ1бљ–№:h-ZsC3>�хЗ=гjк”!Šˆд”Вe6b%ФЌЋ Ш"™š.вєЙ?›кjш˜Эn%^ђр‘@ЖbkJщ†YDpЉ %8ш<OЮ•—x2eъф7-А‘#‘Ž€Э?ѕC…ДЁIlЈ‘ŒљRŠѓоHе6ќс %dсA4ь(—ˆСІ’RЃШ4Ь“eL}<‡кlnW�xcЉeБA›%J–€АF5xЙCяmKaЁЉGЪƒ“.ь.EўKrЂŒ%DlO‡Ј> &3ЖЕЉ— r#œƒЧШгЕ­Ёq—*JwЈO…WзЂи™ЉDI.ŸgR ‚R|ОT­%ЎЎšээV‰фG/DY;<О~Ѓšyoг]БиVќмkТPw0Еr}чѓЅ>БьНыCk•kяB9[*фц<ъЁkНЪВ]˜Кл ЃОСФ$р:Ÿ—сA›Uщišfцьy )*кA§хђђ5_Ў”ЙІkZE3Ђ6…^Ѓ3ЙlЄcк=@ђ §џ�:чЋЕ­лTТЪђPr[^:ц<E…Q@QEQ@жьШуMШ§­_ИŠЙюЊOfЇrGэj§ФUЧuPriМж—ЮКЌ|юO,ЛЉЈ?оKЇэnўљЇžъF_џ�о;ŸэnўљЉ]:КЕ–ОЭFВфёК:Š(ЋW`(ЂŠ ЋlЎ—!GISЏ,% WOТbŽббЌvЧ[іЧR-Фžc?їучK>УьL›”ЭM=дэ­)ЭФq8з=ЅHъы›ДЕврЄЅЙSœ ёДЌє!š 5сщкяUpw9>B <c>ђЩѓ'јS{GЯbЩЈ Šu†і)ё^ь“NЦ‰lEЪCШBх{ХJ№@< fKгі›ДЄЩ…9Є:<3AхлEПQЦuPˆcоlдfžБN‹ л\iIл•Ц*ыcА1iJ–$ouc••4’:ч'Я гЕл—•ЋrГсUэYh~сsŽБ§N>Еr№ѓahЮ2Ev™R‚J]Cl%#rQnщ†›ЌtИ’Є!JюзŽ‡jљЎ~<vкh+jВHOЅ(lzˆOЛШ/нq*к„“хж‚чщjˆтc)УžJ•L=x‡tgdoqHЂЈ­щ•Юa/FкRЏ? Иi-7љ/8МИЁŽ:AтыЄз:ў™сРPxP=EOH…мйŒРї”М ‘ы_#GsL-<вТС.ѕV$е S\c^lo!шл9 ЄќDг#VX/eHLf{Эъ;VFF*ЭйЄФЬLЫ“œ#WюЅ?J’lнb[­К˜ыїB’FфМyŽЃхO­={f…Мч}hЙ 6ђГ™JОX8љ‡э/KЧИй$‹Bмe;а |КŠІvm{MЮиўŸ–ЌИк aGХ#ш~ущ@увЬ;Њ$щIj@ŽДЊUЉe)NрTTт3ŸxѓИ� сЬœ�+ЮБnDieмиEEH3fшц_ˆюыцœu/4юN\gзœЯ@G^­яСжšn4ЗюОм”pHШ9xEFл 5)’УxC„-Gдxгя(УЕЩМ”с&В[m1-LїQгЩъЃжБ^сЖЇc рЈ{Йѓ LЬbUорЅЎK„œmAхgЧ5ˆсjІї(ИЦ�YшsыWцэг№жќьdх- фšЁмк‡{К5€ Ш.,ИgчAvЕк­Rц4ѓrK/$Œ‚:§i†ы(— Шюr•ЄЄšK†^‚‘мžˆ'јгE]пЙСR$НА0Ty†‚Й.л"е-L:й(мWjгVд8ЩxЇqV'#Вњ]m.ZЬгi лiJR<Ж]…љЧЛШХMŒ€HѕЊ.КьЭЅЧvd6ћ™HI^б№ЎК|Ц Ц[Žї˜їE)uњlйF+(nЕ|)ЯЇ{Глг–›ЧВ>Ѕ",‡фуК{єUщгїдVцѕН…Xl~]ˆжV”ŒлЈ>GЏNЕЯš–У:С9QЄ,ї2ˆXR>,gћOлLюЬЕcїR—\?•­Фgqўе9ќ Нš —x*zi/АvЩŒЩ?›9 @PŽЃЈЩ зЋ]ЙЫ5эчI‘ДœŒaBЇцKЃѕDmPвœMšъ…&kiJ•н+Ўv‚2RЎzp“W›ЕŽхА9JгAl’ѓВˆэћƒЉЋ&юя9#Ї5Љ vИЩeМœTz“Z:ŠrсYоq)%jїA Ќ_uJъdl-@ЦЈw'-їФT)aKAR‚AшqХLУГЩŸ!sТP:)_ GѓЊЦІhF”Ф˜lїЅЯyMŒe#Фњ ЅПM.Zš~ЭЄ@QущLшЉЄ6ГИ„€IёЄНІтЅ„:Ф­ЋppE5ьв—&N8A^9>tяp@ek$Rцпkzы­™[H=ЫСV<IчюІщJmIXШ#…œИ:f0Цс дšЫЪсЬuШэЉ=ъ8ЧsПhкeV‹šЎZ)aьї€ёІЊ•9ЫИœRZ<+'“YuX‹:Х'Оd/s'pЦyЧ оЫ/ђ-—VтЖчvщ%иk=Ёё6}№І7ibнЊl д6Ц‹kS3Щiм|xјфД‡Š™)Œ­’˜p>ЪЧуЪŸžjјї›bоq8KЃИЙ0<rмШчэч";‘d8УЩкуjкЁXЉŸкЖ‡UŠwЕGЫБЪB›tэ= ѕв–Q@QE ўЮ4єкећˆЋ†ъІvvqЇп§Љ_ИŠЗnЊМдоI|џ�ЉЧЮdђЫК’пї†чћ[ПОiеК’—Яї‚хћSПОkл‰]ZVžЮЦВпУBŠ(ЉЮАWІаЇKiRˆцkЭ\;2гЫдšт ]…M!]у‡� tл­Iг]œк,щ^И(I‘г‚љЇэЊ'k'OТBO •Ш‰4ШеRЬЭNы џ�e!ІРш‘гўb~ЪUvЕ-(bнoШпИМЁт0?AЕйаyћYŒЉjHJBƒ{К$чЅ^ŒХЎ*ЄжŸ]нMSє–œ”ф{EХ‡vаДё'ƒW Lќ(бšnbа2Д€•‘ћд—Ё)AОЁ#ŒZИЃPCŒЄ0ѓсnt*3KЖЏI}“оАЌ`-c ­ћm‘щn%зжqŸˆџ�*›O!жЗ ‚1ХAZ5­Њсw•e›Œe­’y?*’€SI>шOлŠMъНХлR9|…%л}ФЏvіК„а7ЏvfяJЂ•F<щqdьr=ОћэrœRЖ‚AЯRNMOщa ЅЛfЁZ4{­Ојў~•|[mŒ`ѓж‚:нk‹nhВТHNrwд]л_и-6эF[nм\р2йЩзЪЋкУSЩ–ѓ–k  бOЛ&ZFJ?сO­VДЮц‰-0Љ­ХїŽѕ3ЭЎ;сјЭО8 HV*"щЉэіЇЖH_ОOž+u‰-ˆф„ИО•OдіЎo-Х /žRЏ?: к…РSАRё№Ћ‚*“'TЛ:хљ6b‹.(e</хUЫŠnvFTѕНЭшlel9ЯѕMG4ћ:Ёи’г$0ќuoO˜ ”еЊ—В[šqзЄх<tЧ4Ѕаi\.б"G^PwИвџ�)тŸ2.#Ф+}цР@ЩZŽ0+Ÿfм}‹ZЕzh~hШ$у‚А~яЦѕh}ЭWKpwOŽщд(ћЊm~щЯШреŸC—mЯоДѓgђt­ь’€”†Щ�c’wЈчѕ‡' Ё]ŸCЌFœбмоэ…CС*ёќ Zй–чєУL^УMr„ь)N+$х +$sзsi<}Д A=kТд=с‘Š№ŸЮd 85BПvЃlгš­›Х‡BTЇЧDчЅЦ­0бRVЌЋм)= *з.WєА——дй!$р”ч#4щpAЛСB“БіJ’r VЄvd™=ШŒ•`ЄŽŸ8mњ†уc­€EYьж–,ь)ЖЙ+9Rˆы_ [aZй(ŠкZG‰ѓЌбnPц8ДEлЅОsДаHфqХ{CЩ• ж�@H8<јV@х`|ш)њМMeJ})я#€<ќЊŸмф‡“qЙЄЖ2–“ќiТЖоХЁ*I№<ж'mœlЖЈш)ЧJ>ВБЪеVœХl% хH+ЈњRЗDмВыˆKx”n{Иx%psѕЧй]ovЕ6-ŠLvRžp‘\БкMйѕ:ЅБюЗ# ~ŠЈ+iэ7 LЂ ]иЧУЩщіŽ*[ГKЂ^в­лVё\‹aю•m7’Z vэїA dЁ]q“XВнMТЭkКВFчP…‘зо‘і‚*ZкшАіšc4—QіСShJс%РIъ� xqтЁ‘т†NусŠзкhЁ`(yYrH8šТЃqХ;XD”bЖc‘аєЇ­,ЂЩOє’DeК\ќв?WžE7uCя5oHj9y*>ј’гЏ ЦеM!ˆЛУˆ-: œЉ"‚№ў[hLЈ…яe# џ�­]tЄy1эa2R­Ч�љV–“vcжтЉhR6n8ЋCDЈєрPfOФyЈkеŠMйфќ%Дž*Xљж`В�'Т‚)lСВк­­)фu4ММjHЏШ1­ё›qѕ№п8ѕQ№ІœШQю ЄЗНТЁтщL7‹ЌЦN}@Aйфи6ѕ]X‘КR^й„ѓдJ­vaw­^ˆя+kSRXVzuN~ЃZyыCzyЗš‰8СBBИєЎqМB•hЛЅђв™u.сCсX9џ�­L\mЃQi –Ч•= ц22Tп;гџ�~•Ы7X Ж\пˆА}Х{ЇЭ'‘їWRщ›АuvЛ›dw2[I_R 3ќў”›эšР›>Є%АBw ѕ)>ђ>” *(Ђ€ЂŠ(=ŸX§Љ_КŠЖnЊ†€8Б?ћJПu5jнQoMк\'R›Щх—u&oуїк§уNдНŽм?isїo†К™Y{?Щ (ЂНнHЇЗћ=лC-^oЊ Ы-” ŸAšDзDіOнDьz§'; ЃЛџ�.�ћsіа{Ж-r—1рЄ‡UЛyщŽІ”^^ЅеsюЏЅNCadсДd!?_чLћ“ъЖhi’аЂ\1‰Ÿ6вƒM<Жт…„%[y'ž˜ Лi}MvŠтр0XЂFIN3хщYЏbѓ|КE% 1М$ужЖцшпgŠмЛz”г n#<šеЖZЎЗтіТЪXt„ЋnVЅПJ %’б*ЪЧv—;є)[ЗmС˜ЖD8ЈЩіwqЯUДСМАЄ6у…xъВ ќъду A!'оu|‘ф(1KК:фД’G O˜Ќ—"TЫa;фрVaE>ыSжЇQ8aьГЯЅ ы ХZ‰ФаZѕД`{:”ѓћ9aN єЭzэYRЌЖ—ЖGSŠtmyйž Њ|}$ђ;5z JЫяљJЦ}ўЂ‚ЭiŽкaД–ЙžЅDѓŸ^ЂЧUžо$ˆїT|*™й5Вr,H]й>ѓ<!*фсŸZК\{Ђ>Й1A‰Џ&Z_.цrK]ф8§ИJŠpЕЇь"Ђ{ОьЄ(sјWЉ“aнiФtє'ž8ыєЃ[Z+YДњ)з97v†RтJЖКw€@љ|Њ>\vDЦУVЦ„t$eефqу’8пXтЈ4лЏ‡С–с ЉТIљu9ыŸњдiŸ!ЇЅ­жђTЖд€ёœpyОЕ=Л G*™qжfўьЯ}DФЮ™npm—pkНm*#iIЪNxЩЊ4ФГ*йp‚”ЇНˆЎѕ.)YЮ8V>czUёФ€T“ЛƒƒгŽгŽ=*ЅrгРВЬuPщкTЁД…`uчЦЕj&№yѕф{гiˆяк=W]rUчBЖгƒs‘sdјШћXч-ЫƘгaЇМ}Л“nѕ�Ѕ)PQ<њЅPћ&’Д]Ё(|*ѓўР‡LiM?-Ѕ:гџ�–"2Е##(яАЁŸ"•`k 3MЬ%А|ж“ЄiAЊ”&ьИ2”Џ фNe№­йрxU*ђаjRРщд|#Mі…Ј4DеУZЫŒ6­ЋŽсЮЅ7л5Љ:YЋК™_~тЫAŸј€ЩЄзiБšcT anДПŸJ‚t,ihЊСС–цўTа]ЎнЅъmg4[ ЈЦeг№qѓІ6…Ж/K[œCn­Чо;оZŽwTvZЪПШqGоC<}Дя‚ЯxъRH�ѕ9№ `%юѕ-ž™@8њWЅЗо$x­HЋB“e[сЄnq\sЭРќШPOЪЊкŸUЭГKCMФ)imзЅ^їИ8ЦpœѕЯ=*#Wvь‡иlŽ$ЮШ) џ�Тr ѓђщзЂщчн^щВ‹вф-X*ZŠ”p‰<ёы[M}имЊ9R1лстлЫТтчhw8Й[jъ@ }т• ]Јf) АЖ— JМЛ9РЋ .МР+HeГЩЯёЈэDbІб Є<№Т €мWрG‘џ�Гс^qxžоЏ.SЩ|П,nfуо#Ьэ;йTЯiаСœхQžqМygо_ŸJдК.QIѓэœ№#ИЁї“JNЦžS‘.№ѓбmИЯ#јS2ё*C,щу/kЈМ6Т•А!XBЧ9ъ•(zxs[/ ІTЂ‚z‚)Iк&КИi Ch~:УJвђ< JА~ъiївŠќ ЅПГ7}ДHhо6Ѕ:бђ>4 [-њпЈ­­Ь€њBг’Œђ“хY“n‚™яcŽWU†ЦN+“tЦБЙщ+r;ЇЛ Тк'ƒOДіЇmF|pюžJh/’цGЗC\ЉNЁ–2JИ­}=Ј`jXŠ—mY[)pЕŸ5ЕЬкЛД ŽЏœˆЈqmФZТvšpш–ŽŸГF‹;6Фж'“@бWКvцНƒюŒœж8 r@Ќ‰>”3ЯЅDj;Уіx(}ˆхнЫкЕ€pкv“Ирp8'�fЗ.(–иЊ“6KQкЊЮ2pN‰8Э-o]ЄH’ mЂ;eA!O)=т„ђ—ZЬDЃчфWo­ОбŸшШ­{5Р{єGqр!%Dќ…'ћEНDП)—ЁАЄ„$…)C!]>•eR}Тщ$ЈЋr–TO>$ŸšддftЄЕlДћgѓ %@ƒœчЉ“ѓVf!‰д#5ўѕŸHя§}nЬfЎv„Š•ЈЉQдЖ‡Щ'#ю5Ћўа ‡­ж{€<МЯˆ Ят*7БЇ–ЋС„Џ”KB€>�ЇТЇ{mgМа7~"‚ЏЇ#?jВsхQ@QE =qcі•~ъjбКЊšтШїэ*§де›u=ЭИžЁ_šП–]дЁМџ�Ž\?isї6wRšёў7?і—?xгнвЧЁFВ_УJŠ(ЃЅбК2!и|Є’’Љ!�#%Y9љТЙШ <ыЊ-ёC}˜ZYBRу ИqЯ‚‹кЄGаŽ6ило-Ж@ђч$}‚ {:гЉ6‡/Ео+y-Ї_іk'kГ@nйnhƒИЉѕџ�*1Л:6ƒѓЙ=зН‘бTгЋ Ш&;ŠюеœЏƒšЎБЊгї‡c1лZu}т[IСЩыШІ&Нач[ܘэ‚O)u#}iyЃmщƒЈ$5(ЈМїƒч kёљ К„КŸ}QSёв;І‰Vpj6н2нT†нї’vЩ8Љ†’6Ё ч„Š ‘кW+лСШы[m0s|ШЌъސBs+e=г {Љѓ ˆд-Ц•I ”ДBŠ€Ю*кнўа#Ђ;†“ьыBSœЄsМySBzšЬƒ• з4œЕ0кћ^И,М§H‹CmЦe-ЖwнyЌюДs”рxв„ъT FGžjo{OВRЎO<†FнсЉ=Hђ­eс[Hх ьЉЄВœь#uъ*Ѓ~П3fdЅ+”ДgЇ†OЇуі‘˜‰™д4Щ’Иы7Мъ!K~2уП'Иhї)Z’…/‚ppBFNqЯ>8ѓтЊ†ј˜вb;чПBВДqгŸЕqŽћяЄ4Ёп+rЗdф’yyўЂnЖЈВЏаRг=уЬ‚ЅЄ{ф’}дњѓѕРЇmЬТ“‡3<šФЦЗѕњ/хљmк›(‚Ь‰Ї./Ј<чЏіњДЎе/bš%l-)'‘гžž8Эo.Уwu pк'a$'%…g'>ЩЛ=EIZєКf[%.KЅЖ­ЎЦqМxЄ)*Сыд}еу&oё-=емl9Гѓc5т~ЛяіHпћъ^і<Аnw6N=цRЌCџ�Zdj9r і}7и]юпƒtnC*рэ $р№p 8<RзKГљЕЉф’pИи`Т˜з&VН#xjBў�’23œgь5ъыЭ’\*VQšд!pѓž5ŸM8ыкRаЙ8уЊ‚СqХЋr”Ђ’IфŸS[r’лЭсд $с8 хнzФйКšT„0ЗF• dq[3єХХЎЭэˆЎkZ†о@P�~мНi{gq$GlДЕЅKмBy­Ї/6Ыžƒy М…эД—№9‘Э[ГE˜њ‘єЏн=бIIч#ТКЩHsrС'дд-ЗKйQtMиDJe#€QбYЋМ6YeЕwI хT,+Л^ФЅ!>kZјгŽл$3]лЮ4А•dŒЇŽG8­”•�њ Џk;Ђ`"DžхздB I>‘іќы1Ніi’k™Дъ 9}кћ”lУЭД”9Ч;€дsXP‡NBB€ё№ЗЉd—dЅ/žхчА;є •сŽ™№чвД[ŠийЕе’yССуьў5‹лЖмП?‡ђMВо#Nгщ§лIgyх{д<Эa›lpdїэ{ЭћЩXЄќЋa-Олn- ­-5‚тТxNN9>ёXylМЂЄЉ;“œ‘д‘іŽj4S,Я№Њqл6ХёЮІўЪTmks„Ѓэ/8ѓBЧѓ4ЮеђнЄ"ЯŠ_‡uя‡J •)9фq3ŠTщ7Н“Ерœcк вЏTп4ѕtuЙІ&эuХ%/Дта~pRѕыš’њmяDLz˜яЈїkЯ)лгФеъшj$…Џ8JTOШ Зкn?•Ќ№'­’и•ЗЫyнАЉ!XЮqžИFжRQбдmPљцŒЙОSйo8‘„­dѓ57+pа–ўNг1о>‚НЊФdщєЯ@**Rџ�jХЈ4у–ўШ,Rдœ-RTыžcТ‚‹jsКЛDs�эy'ч]3oуh)Щ*Ц+—[Qiд/Є…WQшЙIИF‡!ОRІТ‡ЇІ=гaC �“[HQЩ;О•Љœg9Ќsf˜PяЇ&eкщгu/БОЪšWIH@уrђ3HћКšЌ–Ъ”’ZЩ851zоЗФЗЅH~C„ь2ИmЮHhч ѓрVЂi IP;ШфФV3eЕb"БЗд­“&лњЯхЎZˆнЦ:?…hj \W­N­фћUЕG;‡ЇЯŽЕ4ЉiС G‡Хт+UзвђамЅГтSž?‡ЬѕЈјч5эЕм,й1ђ)xэяуеигЪnѓt„Ѓ…)ЄЙ"…cјеџ�Е™]ŸЦH ЉЗ@O—ЛИ~Иа;m§ЊHŒ”К—“цО? eыHЋV”uХЏ(іЅНН2ŒŸЈЉ.њ'}сЭ•|бW^ЭрйžkXiћ•Трd)MЛТ”†ЖЇ 8uю =<G>T:ШУJдxэ8ѓюЌ!ЖлIR–Ђp�’Iу/]‰JдxњP<ћЋmЖмZ”Е€�2I<bЁћdГiM=tЕл4ѕ­Ы|СП=ЅШ.–Ъіьm_œX H $0ЄH5Й§OБЋwўТfП”зЃйлPњ…<Aљ`ўЏіŠЗпzT‡dHuЧŸuen8тŠ”Е’I<’O9 Мш“‹3пД+їSVMеWб‡wПh?КšБюЉTІы;Ÿ_™П–]дЊЛŒЮ§ЁЯо4анJыЏјФяк§уZfЎЂњ,k%М5(ЂŠ№tLБ“ОS)ѓX}uЂГAщјмЩЪЙёкrЅ­з†<ўsж—РІ-vVH;PЧˆ4љЄ§ЏКЩNшЖ№Ёс„Ÿѓ`Шih{––ŸHчŽђ"ЋН”ЧMТџ�~Иu2'%^™'јŠ˜ž\Дkуъ>Я-=з?ЂБгэkf ~2Cš eC OTŸ•kj=0ФЈщЙкдPw%cЊ‘є­Ж`Ч’жCШъ•œUŠЩ�EŠт;Ф8кјкEыMмW"BZpHm}лЩѕѓљS Лr•"1$€R §1^игVіgˆk <уУ5.R•Шш<(4%АЌ…%g5Ѕ!е`u­ч№AQxјдїУ{€фx‘уAЇ=Х%ОМуšPй&6;[ИћуѓHЄХ1oј–л{’%Ћj�xŸAJШPйГъ%jY’И{Ы­‚€ *ѓ xDQS\1уS {ЇYШЊ•ЊєЭв+rbaM,xxzДC=рcтƒv;�+yY<еkPi6nш‘Аь”а—|<э>Ÿ‡к Ц;{ИF­’ЩфqЖГ1;†™1з%f—Ф‘—8г[ˆнЖкбTR ваGФЂjѕЂД‹vЦLЅ•Ш_ОЗъOZП%ФKЅєВ€z•UC|\•{%{БуXf•ŠV+_Є6я•Ѕ%qЃИOГжЊБWqŽы€9э ,фs‚=+0Е~cНsŽFO5ђЪЄ’’—2@#ж‰зfШWlпy CЉ–вT3ŒЮ=)ЧrG{nМDNтЅEоqމТПџ�4 дфЧэ}'t–UŸž8Avљ!’K№_IЩЧ!$К‚CAK“+Fл•!{”Žё Ќю%Х%$€>œѓSRфƒ”Ž1вЋ›Ьj^ŽC …%pпqЇ А”OyЧІ\ƒѓЉ ДЈёRЂЗ“Я€94zЪр щй’ ,Љ(Я™Є$[гі§ЭАъЖHlž|3L.гpTF;рЄwўьxШхjOŠˆЅАгwТДкІ`sЪЈ:7O\šИкbЩiC6“ЧЧ5m„ВІЖуыJЎЮX_єYr›pŽщe/0чЕ#WЛ.ЉЕ='йu,Ы§EŸ‹дPX•)`уЦЋ:эq]†Фi RЖИ AС'`§ЕpC{€P‘ƒХPužК]Е ^2;И- лR=х+чхY‰зб­Ћ[ЧЛhм nЖцюl6™M!I+ъ‰їтуЫЫ#чœV6с{\DFе ЈžэA9pџ�Т>™$Я<q^ЎЯлЁмZKяЉEA$"@ЌЉn<Чœ}!ФЉ ‘|Ц@8<ШцГЏ иІгˆмњ~??яэЕЫKлГкe:ѓЬІч!9Р €дœ{9чЧр]ЙљF?u [‘5Авдш}{ˆpќ]zŽsацЖTЙ,•2лёƒ ЖQ€ъ1Xо–І!8г осЌЧ=<iя3"=нЦт#зПrлMJ2;W„њ“АЊQsОщЇ№%Zbю•%d„Жр)щ„‘жК[оэ6мџ�}V29рš}мвњЌ7yhp%Є1н8’8P;HљVЉэ },ы+в–Ѕ4ђк!Доф+8RRЁ‘т љj‘­ждˆюэVK„ЁДљљš˜ввиЖіoKлRк ’zlх(дЯоЕ —J EVo<Ÿ.(7eZ–д[MБоЇE>9&ЎњQЎаЕ“Ž Ї-жів1њHV*L4ьл—є‚C+і Sjp'.К~њš­XмдА5Џє†UЂrš’ъН wGоm}GйA­,%Xг!Ж–™hoqI§?:mvCqJэ GCЌeЕ$чTыЛ“4ЅХцBоˆЏЮCxЕtдt­M)Ј[гšн.ї‰ю�+ўЬјgыAб%JŒŠ„дГ#iK_8ЌleLЁЮ0А<ъƒЌюsmRм‘ ŸшB‚П>4ЈнФ),Ѕo>…-Ї’Ÿ ŽsРђŒё[кvШЬHˆыdЫ $8ћЋ4|Fп?{Œ0…s„сБоЃп"&d тœЮб<‚<*щi\hач) T?i^фœ ЃмJxЮAх9щу[DЦ2№k“/ХЗyпк>ŸoЯv YІQь‘Є[b6вc)Em0ЪpB€ЪЖЩЪSг�уœU;[ђлxF}’ПЬК•Щ$`nPрsРЏ­Z}–ѓ<єMaо:ГЏЖvѕ№ЮэНOA[7)LМЅ;&oД) +e)Gv††мtоQч“чРчiдzГ›ю'З­яSѕ?oСЅнYэŠ9pmPуdg=Єџ� vj}Ња" S5МcЉїSќщЄоvЖУР5хБxЇfЁwМв—FіўlИŸ{oщ�Œ ѓMˆˆC˜фЃЛ”ъDЌОŸжЭ5&‚гIЙйь­мѕœд%е<Шjв‚9лН@-в22:Ž€їˆk’Jn’Сџ�љ—јš–ўыўkОїПѕQ•‘ўЦ{I•!й,Ž<ћЋ+qЧ'АЅ-Dф’K™$žsT{­Ў]–щ"л= Ђ\eьuuЋФnA##ЁрфAЉOщоАџ�цЛчџ�q{џ�UAОћвЄ;"CЎ<ћЋ+qЧTЅЈœ’Iф’yЭЫGœZџ�\ўъjУКЋzDтдяњчїSSћЊз 7ŽЇ6>bўYwRЮщў/7§uўёІ>ъ[мџ�ХfЎПо5сЫЎЋ Н"5{xjбE|Ÿв‘§ЛVФl о?5ч];Љœ–†z%Ь$žœ‘ќ+˜ttŸcдб$рэA\џ�˜WL^aHn;2фŸzCЮm)*Iћ9 XіC:LH“ƒL•(И•ёŒр SfѓnЕ_ 6nkj4ЇМ“јњRwВЉЩ…vЛAsуjWyƒу‚Aќ*ыu’ќЫы[ иTTсє№ Б3Ђм $1=+gР…ХX-6_Щ-ЌЉтНпLTMКьеІ2w+~~$љUž$цЎ1ѓн>t� љuѕЈ$jfеqšУ€6Фel.ŒЋЎOQоQ§ŸуHШšШ^u$›sŒ:SЅHиœŒ?#ХіN­ЖH–Жq!Еƒ„ЌД­‹`Qз;фHQе!чю‚rT†ЩчSДв}˜.SŠЩч`рPZ‚d7ŸEІh џ�i*–ЕП;xšдБ#1њ%ЄlСђ>uЏ/[LhnкД�€=хg%Dtљ зВR§ЬBb0J# ­`uЭT`-ЖЇ2ѓШ J]ISxхCЦ‚яЁѕєvYwыŒъ78zјSофh’Rяv 2ŠЂлUЅѕ<T4—лФ`0GЇXЁ\fщ•ЂДїб…xуТ‚ubлRУХ!1ёƒ €F|Аjbгv“.фЖ–уkŽR{Е'ФzњеOYI…nБІјг.Љ…РШ‰TбZм\5UЕ1їІ:ж[юњ“Ÿyt p^к|кфЗ~tЇЯЖnпre*оƒИFRGл‘‚щ`WХЦmI�Œё@Ёiw=ЫЁ=}мвНEj{N8 ”ГЧЏW1iЖюvJРWъ’j)эAS`CŽ„#3@ƒдPЅЃД‹c2Ж­їm}тz(ёіb)BЄБЩ еЄ’HщюcјвЎч1^кmэД2ˆЅ$y€TOпMt­-Ю$Љ DЕ>р*=В�ќ aZКхhŒ,P=вћ§ѓ'т Ё)РђјOлWНWлŠЅ4TЈа§ХЅnѕЦ|@ёЅ›qŸ}(i*.))hcѕˆуmtŽšАЧгzv-Е€tœЌутYј‰њаygaЙJ›$ ”0^Zz$б RN=*ПЈЎВ§”Ђи й—V:њ XкЕ=вћZЙ­З+;�вП"ЮСZнiДВњСJ”‘ТЧ’‡ˆЅnБЗЏK>$;ц]VbЌdїJЧ(ЯQц)Ћj™)цYmіƒЩ)Ч~ƒзц+%іХёl\)H iСqЪO*џ�eЇ*ы4iћСћŸно<е>ДкŸHŒЖЗ(nШ№Ў\Нк_вБЇ–BŒђ^р8~!єЎЊ‡!Йжјђ[CЈJ‡ШŒа*юЦ`LyM[дЗдpЅmх_:аoHмюsS)Jv*6Z`у?3N^ЪЪ Џ„% фЉCЅ`‹: ‚/6|€ WGьѕг'Лu/-’r{Х~&ІЎŸ“tьB…Œг•mOгЌW­R-6‹[iј•QЉ.PLДЄ­Мž1@€вN НЌГ!)кƒ)ч1ф0ЃO Ышg@^‚•ŽјЅ чѕ3єЄчf­53_ۘУd0гnИ€|7уMdgГХ:Д*TЄ cЂ’•у@›еzЅїь6э:УŠCKЋxыSЋ @Џ:HЭдз6b0Ќ“о>ё6‘ќ|ЊS.KП:г-—qђ„ фчКЃCidi]4ЬW�TЧ�rKƒХGУф($mvhV{kPЁДгcЉъO™ѕ­эН�|дт.5ndЪ’8Iѕ?Ъ–6]{Мj˜bртdхaj;SЯ€ l_4ѕПPлUk #ЊV>$+œ5Цš‘ЇюЊŒѓG 9Cž GвіЋ›В6127vё-? П•Eы­ ЦЋБ;сQ•Ч{Х*ўF‚ицО~ъагЗ ŸaQмWU$uIљSN}Б‹„bгЈљц= ФН7к•В5СЕАђ$wNъћ+ЋА0’G^(r‰axФ‡+ІG1Q3#нЎ™jž…ЩћщЌИэ;ЪлJ™NkVraCŽЇф66Єxh‘єкЂerЎsѕмРћЊIzz#Б;а—6ѕМ'š›zу`”ўVЫЩЩшOedМ?%­Пe8giY&ƒŸЛ?d;кjyю–ђљљќiйЉ–ьоHї“RЎOOЏУJNЫіerœ0Є6Ъ№}TБИjkЂьюк”ю “(ЉCфM6нnВЯџ�U_jVФѓ›Œ’<]Wтk^€ЂŠ(.PтжяњЧїSSЛЊПЅЮ-ŽЌдоъПуSxk.g™Џo,ЛЉyrџ�—ўВџ�xећuP.?тrџ�ж_тj/QЎЋTЮ•НМ5ЈЂŠЊ]3УbЪC №?*ъыEе:—ГJЩTˆLЁj�ј rGў]еЩTшьGVЂ ПЩѓ ѓJна%]Ы#ь ЅнЄ?Ї;C”у.wHНхCІеђOачьІ5К4ЖаЗћ’WФЃг5Uэ–ТЋ5сЄ80ІдЄ4qёВI(?Oy'дUŸВ‹š&Yл/Ќ8ЖирWЫЛж{ъя+2>Hщѓ4ЮЕк ВYJВs•кŒы-4”Ѕ!9� бЛ\о‚Д'pёЭњPR›QT4šгКzM“Дžдаљюж9тšжЫУ KgkЈфЂО]­ьЪZe60рф(~ђwћ лrA* GГfм_ЮVЉ$јљS�`ЄЇŒxŠЋjљ-ї‘ЁЃоЮjє—еЊ‡Дw”ЉТŒь9сU'мˆЏЇщЯipqпFlm_ЉЖuj–ѕрY/0А[uДѕ  еƒq‚єg]MТ№ЬPЏyn#)cw4 [e=Ў"ЌCn к—н!Y)ѕ4сŽЫ›z!I;d#с>cЪ—NZ%_&\SЮ1Тuiъ‘цqWˆJябдТГƒШjА v)Жy$ї/6R3р|щ/йо“ЛDэaˆ$8–"<ЅМЁаЅ уэЎ‰o lёœšїn…#ЫCCк>ђМ§(7\9Вp�­ir[}ЕЧn@CФyє­„$у‘ЩфљерЫыН>уdŒ/ТƒJѓІžCN;>Fі”zю<еJ|Јznй%фH!Д ”ЖNN})šуЭўLR.).4G:JvБ>m-ХД<ыУ ЯМ99њт‚ГdКž}тJИeЕ-J> Yџ�ЁІ–ЁЛ‹wg2y!Зя/ЋЛR!„` .ПmTЛ"А*шУ�ŽЗ}Ў{Єр%Є№”gЬђ§UЖѕb=Ѓj)ыH-к­‘ФxЁ9BK„ћЃІHDЪ28 ЋvAk~ёЈМОъQ х8 p№>СO}‰юЪ”F<WєѕŽ>™ВGЕЦ7ё+ѕ•тjПЌ5ШwtDG|–FфqуAЏЊ"]]vGwю ’Hї@њR:жеЪеЉУm'cЅўщJ# фг•.+ а\B‡‰№Њ4їŸЋ6ИRІ;є8Д!<’С mТМІЧ:AKuYPЋœiLЮЗЁђaC‚OCJ 7`Л„wJкЂIЪI bЇ\К;2;qYqA уЦ(3vЃQЊ,N†‘pŒ и_ŸЇфjыЄ˜\M%jeаЄИˆШ є V&Є1$юWt2MJ0ŒFювqСHє ОЛы[шuф„ž2pie$мbIKiLƒ’“СЯЁЉ)ђMžSё&ю(u}pMhwK*C`+$рє4шНK™7%Асш7rGжЈ}ЂоІYmžЫР†Ік‡Š|ёєЋ<xЬB#;„ŽwžДЄэј›е§,FVіcэ$sЙGЏ№ŽЩт˜VЋйФр8 кsтЩћЯнWОг-к.Уn}нЏ%АњаFO'ь9ЌœiЌЂпoq?е`Ж•Ч pœэ?^О•цџ�k_h§Јр6Ј,ЅOЊк[ 9FF0ЅœШР #;qAЅйЏfr-їеоЏm'Нkоi“ƒЕgЎqСХ7зŒƒ>Дcw­Q_дзXWз’й‡‡ЪƒVѓzaЙnУCI$€­Ї'ыJ8№œk\"J-<ьЅп9иsђЇmйPюЬИШ Xі:ŠY3Лк�|ЧRл[‚ˆъ1Ц­І–ќNШ–сю1ююѓєЉШЗЛt䇂T0О3T›ЦІb=Љ ђCiх)фЈќЊПhƒvнОьŽсЅ’ЄЖŸ‹Ÿ3@СМшыMђутѓ!3#,-ЃЉ�№[‡іIфžНjЯи–ЖвыЅХ“дјTЋэ­qЪpЂо—9*nyцV‘ЧЮЋVэNмƒьгТTpsQЬЯ›d”єyH+mJ#$XžИк\QZсЉ=BКPNнєќwу qœ Sі‹Љ$Yl†о„іP-ЅТ~њGtаuƒљ!дEuЮœ+<з9і‹vUчV*3'МDl2€<V~/ПЅЃГ8шЗi™з7�п!Э­њ„‚оM_{`yы]–ŽвгAXѕТВіwІSQY”˜–вЇ‰ъоЦт>‡“єЅчlКЁmDВбЪRпtШђH''ы@ЉZЗИЅўБ&МбEEPZtбХЙЯѕр*guAщг‹{ŸъŸРTОъъxtо јsмЈ§k2юЊ,џ�ё_ы/ё5uнTЉптеWтjVЎЉ_)]65k5шЂŠЃ[Š•гЗ#kМ2щ?›QиП‘ёћj*Š˜жVЁкf мX 7+rpu*H�“їџ�5"tžЄ‘ЅЏ%Т agcэŸCзц)Чи~І“oBг!=ввO€у#Ч##ыJўдtЩвњкlD І3Šяџ�)х?Ышh:2йЈтЊа‰ЫZW„‚‚“Т‡Јзo7;тpСю•ав'Cы0нІISБЏЭЇ)'РzSЪ:ю*e%Řь$d„pOЮ‚ХІ,/AurЄpЕ c5:ђTЩчaш<Њ™kдђbM-ШsМ`uЯ_[c]"\S–I?ЊzŠ wЇ_Џ_4кn#к™^з‡­ZŸk#Ÿ.jуЩpдЫr rwњP-5%•љЗ-ЕncоBЉt˜R‘kLdзчvœ@>4к™Sї­Цiu’|GR<Гсš‰ЕщјvнlИЪAюVЦіЁph.zcOBbФмE  $'<sVV—jyЧиAоПр=*КЈH)p@–кBP<Њлk”уА™[Й.…gЮƒEЛ›п•„@аK{БыSM їЅ?Ђ9љж›6Ђg{I Ÿ?*’ Њ‚_™7Ђ€Alу&Н'и^|Ј8”Јј…дYЂр%С)!_|ъсьгmКR‘БYкO_­ЖБНУЕ@sкBhnZЯ€ў&ЙŠѕrwUjRъRR‡БД~Њтj{Д}hНE10™ K (їЛПMСЧи*cА§(ozБ_i*‹Tœ…c ѕЪБі+Œ'@vtФСЋ…СєЏжC`pŸL žъКш›Ќ:]˜ђd“&P'ЃЊЧЛёюЄ%n|j•rlыnанKЪ ЕDV]$eІЯ фwЋРѕNьtІlŒKˆYŒюрйТ†1Š Hкцсз5 жŒ‡S•${иёЋп‹М Ш=AЊЎЁДПrR `aG‡ЁœJ§Юх;;RRpRЏ‡>U І.Ще2eMSG ьJМЦЙXФHбэё!ЁіЪ}ѕ`cжЋБєD:‘ ТKrі^ Pш F—†›ƒ‹–ёA+>ш №iVin!ih#ŸxŠ‚MЅЛnЕ<†\O!Вp*нh~ZэћЇ$%Ьt4]FJ@$дŠЕ)pуZЌ$$)їЈЩћы^ђ4й+ŽРЄрД.lко#л{ ЁгqСЈ)ідZЂАђх[ВEiъk{ЯннYRБwЈю—Н2‡пwбSЮpGж‚zќу6TЉз%ЃzP}Р~Сѓ&‘КFЎ:‘Здзx–UпЪЯКŸЊˆћ+оЊжu3ЈC‡dfЮRиёW™ІЏa8хЭIpcЭnр)СаŸ0IљЈyP^яS“ є[pЛа.2’ЇЄ9‘qяс#хSO=`Бї“šB.’–]“‚•ŽvЃp8у$)x$ЅІроІэщВ§NиЄ<Ёž„мЃ…ёПю`ќTд‰5™бћ.nOJ2РB‚СїO5 wЖБpeIR�^8_ˆЉеЄИйG_Q6ЕЁmnкHР>T TZЎЙn’‚к'ћ2ЎŸ#Z([ЉОю’РdˆJїИч$UžхgЗZд й2}УЯ№Њ­хИ—лДJ†“оoVA xf€НЅдA[‘`:ыk)Ф';|liK›Щ‚У7жгЁ!(мŸ‹хWˆ1ЎPKq• 2"И ˜ІуЫTwPпv ЌPoлЃЂч5ИJГœu№­ МЇ-іту#*�дuГQДьd*k‰myPё мН!f0-ТCюy(tЊ%ЦтфsнЎЫяЈу(GOО™Ћ}ВЯz•€йм9Eд”ьЏkhЧJJГЦ� PЙЖ;4лЊeЊ–�mŒ•§њRлDУvхЊ˜_tЉЅ{ŽЛн' ъsєЏКЯWШе7�NQЂ{ІЩЮOыZkvЅ›ЗD‘ЊюШ ЧhСXъО…Cф8Њ>T[pЂ4[VF_OДИйvS рљЉ]<OаW/]Ў Йм]’Ќрœ$џ�^{RеKМ]ф4•хNЙЙЬx$|(њRц€ЂŠ( (Ђ‚Ч`8€ПѕOр*WuCиŽ!/§Cј “н]ŸOІјд№ЃфGъй—uSІџ�‘ўЊПVЭеR™§іGњŠќjП­зXщх'ДАбEЮ,ХQAdб7ѕX5/ Z€QЂAШ4§эCOБЏЛ?EњRЉа›о­Ѓ$ЄrЁєыђЭrѕ<ћэй[ƒ™l№ Žx№?O‹;[oЖvКЪТгŸšшm#кMЖёnK/‚‡№Ќр№|СёZэЇГTйхEglUљЦ›6ЃхсJЭ=v6KьK†нщiyZY'ƒAд-щшг[іИ…[WёZ‘RЈw–‚ЗaфTі–МФКZ[r#ЈRVШ шЁќъ=ziщ—BєЙ]жOИкUŒŠ ‹™R7ОUpэQœky@XЦGmБ!˜ЭМЌ•ŒЋЦБОq9С№ ЃIг’m‘^qpЁяoЮTk#ЊBo6Йjъыeѕщœ}е5uqяfS‘уІJЧшюЊЭљЋЊЂGžZiПdu/­Щ)OP>”Ш№ЁМCЛyW$ƒRJlЁОщПw‚*БmМВф-…[RrœЕм‘rc сxСPи З’T‰ЯFj ЉЕА6]pс9№ЌЭобпЛ#рV iъr.ЖрЁЪ›9=(+Ш}цƒЎЬZJ‡MиЅ6Жэиkvнj•Ну”Иш9љzдяh ЭДщзriJp„ ”z EћюЙтЕЈќЩ4ЁФ~с1йN8ЎЇУЬšъkXнŸvWœь•-М$у@?fUѓUS{ьб-А5%ёД":ARчщЮOќ?BvЛк—KВФ8m*ТH x$љ ]ЙЙ+|ыKneбФЁYЖС!Д *YрсЋц™KPЃwhNTщї#єчhцыpa›бmВ„)# ZП…6,ї„wЁYрља]п}–RKыBSŒ ЦЂeлš”žёЇЂаzUNы=ЫЭбQ7ЋЛ@мЅ$рJ’вWs"L›^ вЩкдPm‚iўёяё]*ЋrЖ9 p—KЩN2œ+ŠН]Ф8‰ЪыžЙЊ–Џ\[•Ё*Ъ‚•Йœчh94Жц^Икм\œ8Жњ,p~•БІ \г—dM[’@B€їGЮНиSoŒТ%GšLu#†Ш9ЉЫLј“{пeЩюЮf‚;VнХОŽЮKЎ{€Zёcn=Ібэrp’NwуQn:вu3тхРЗxV{ѕъŒИrТX`qТЌ K”ЈВуЂckМ}ѕЯЋjЏkšlБT;ЖЮщ IъЏ§+oRіЄcF~гf=цТR™{На<в<O­- Р—xЙ72Vє‡ж<’Ѓџ�Z §'Іхъ‹ќktT\^ Ч�WIkл”}1Ї i‹Jо„%ДЈ$’N ЯJ>>u‡Mщл_dњ\L|6ѕюC]™ч!тiЎoїIwРћІC+p‰)yI(яIх*NG<Ч>T WѕžХЭ АќчrЉ @рИЎVВp2DфgjR<)—ІEЖР•>vƒтЃщH]к b№‡|Wѕ…+ѓr}еz#їS‚їqTЋSEWИ• Ѕ>Td!ц{ФчiшkЄ-%ФrG\TЦќЭЊР—Vд„dљж]-п bфJQёп…xg ћ(0пЎHcѓIŒЕШ(ШVЬув•ЯСПНЊmѓх(5Лн $|9ѓЇёJj \~ф=соЂ”:гR=Чaз—;дЌ­Пб�ѕ qYЃМР Sя-*N6Јp*Y;”НЙњд‚Bgі”мKЈu�ЅJ<Z˜€Д)ƒВH{ф WWЃћ3­@8ЕJ`ќЏэKd/pЩРMyНкЎ0юыšфЧ^„ЎЌЇТМЕЋ,miЙ)і–Ѓ5’Ѕ,$Œxb‚ЦѓIЖщЇXЛЭуh цЙЏ[ъљвфЩГ3$M8RЅ#єёрO­эEк„ЙЖZЮж7ІQ'qG №>ЕLБXЇъ+Г6ј -чV0N<ЭІ…в35~Ѓ2HFр\s%#ЉњSЧЕMQMщцьа”Ђ*Rпv:dЏ™њд„hЖЎШє—ВХ-Йy}МКђБюzŸ <‰цЙЫSпœОмжщZдаQ ЈђВzЈќш!оyЩ-чTTЕœЈŸ^(Ђ€ЂŠ( (Ђ‚vЪq ъРTŽъ‹ДD_љЯр+uwн2›тc№ЈЯ_д–]еW—§ёџ�ѕјеuVх{{ќъќjГкы<НјqЋKQ\ЂРQEf‹)шr[ТЪlюJ…aЂƒЅћ4э Е~EН†жгƒЛ!г’DчєO№ќ)НЈv:§‘/^ЌЇП€Ѕ•)ЄЇоhGO вŠй$ЅјЮ,}„yzvyл*УvЫШ.3ИQЩHєЯQщ@ЏбКоv™З v••АN Oš|<ДfЇ‰Ќf*ц‡T’Щйн,ћУдZже§й5te^4Ѓ3!~ђ˜A$Ÿ.}гшxђХ%fZ5N‚МЉ[dХŽЊ >№ѕћETʘьО.жsю Юшmжƒ5ЮЖ>зdЊрЯє‰ єTЌ'w ž~”Э‹л6’œЂвЄ@д)э ›рЬ— qBЩЩm\FjкІоќт]yёГxё'ŒTžа4эОш™)И!жнЪT”лGP5Зvя4ФГȘ№PАрyфѓєT3Ѓ-ыsГdGeСНА—02:ŠПйnН@ЬXh[‘йочшчРgФз?ЭеW5!•+сЅџ�jи(+ћ)‹lэЦЫкв ІJBv!))ЯЁЭQ(лgЕ5nК”ИOAž+жЂзvm/jп.KajN;Аw)GШCk.жюšЂ* ЧdDŠT ;ВЕcЇ>TbМпхЄ!ЉКОрЅ­_!даHkMe3YнBі)Јˆ8b89њŸ2iƒйd/мR‹НмЊ,tД•${уЉЦ|=jFіUfвP[ОъьБ–т,чŸ ?OQ=ЁvТcђ]ЁВЬpЅА 3Ž›ˆ№є Аv‡к(ЭБЇ­ZXlИA/!їŸЯ+Гн'ЎД„v,Ž.1 8ђї8с$Јї‡Ч*$фp3€�Рз.[ѓЄЉљ +q^'УаUƒKы[†›’кыЅЄ6+ OЫљPF_Д§ЫMмнsŒЖmXї‡_QR–=orД„ВтЫь'€ФŸЏ;bъ­кmЅИ•Д‰@mDР6”Ÿ˜ш}E*u‡eї чMГ}ТIiд'$ЇщAuгК–-с @Ж>‘2FK‹XС@ёІ†йШгqк;_+tјз 4у№Ѕ%Ф-жlф)9 IЋ|.е5L$%&bк0ъ2~к—Ÿ*иЏМ†D…GVв•qЭQѕЮ,Л+RzJТвNxЯ9Єќвu+k}ЄOaЄЩsrжДd$ž2*=.ZЅ<уЗKдЗ_ЮBлAЦsЯ…bУ9vЅІТŒwVоz6O№І§ 3V€ЕђЌWIИ–ˆL;œх%'€Гн^НеN%)Uђ^г № шобЕŽй oЩyДШlnmЪ”Џ чН]ЎюZЁii@Ч†”€IјНIўВщ}›’$ЬП•“L5й’Жъ[‹6іR\CЄ•рњ: ™вw]WrjВ:œRЮ БТG‰'ЪК2ХІtзdіa"Jš—y)ЩQ#)>žCжЃ'v…ЅєДлДУ,э ТфЉ'+W­јzR;Rы†Ё’щ[ЮwK<•Љц?Т‚йzэ%}T‡чтLd,d6pxIOŠ<ЧŽFrо˜ж˜эvФˆѓ;Јї0Ь<ŽHџ�)ёOЅrKY5ћ„ЙТPKdёєђ ж:ёЂЎ&5Щƒн(žщєђ…0kЭ“]_lm•оЦќЫо№#дSwOvЋiд”йѕ$MРУ…ЃљќЧ5Љћ&p.OбВвѓ$nіgя|‡lЃEдWЈЌъ7+~ђSЩB–:dљSX^ЁоeГп-ОсpЖr1с\С6ЫrВHR.VЧ‘Зƒо!@}­xЗ9vїдь E*=л‡Ѕ\Э‹kН$>ЗдЄ66э�т•ZЪуb~шХЃc--•…ЉJP�tЯ­*иезц#x–†ЩЩJUќkArbК žmї_QЪSМЈјјP9mзДZ\i/OйœИШPњщщVйZіз оЖ­ъmД,eN•šцpІwЌЂ9P?RЩЧйŠњ˜’ŸXKqм9јR~ъ%пЖf"[• об”џ�@тИŸ­'&Ю‘q’Їф/rжЂp�Щ№`Еі{ЈюA. sЬЧ* .ИЉћщnаZSKИ‡Е ФШq8+f9Щћh(:C@о5lє32ћœюG™4ѓaoВ{BбoS2ЎыF’Ђ6Ж<p|Н>п*Ў_ћZЕкьІгЇ`*оЧMШP.8?†|Юi3yПЬН=ЙхД>СШњљš M[Ќ%_х:ђдЪ”TЕЈђсѓ>•VЂŠŠ( (ЂŠ ›ањ—Ww†Чh~[mф)ьЅЖСЪwЌ„юїлœрчЃRh}KЄ{Г|Д?З0іRуdœс;аJw{ЄэЮp3ŒSSЕGwа4ў‡АNr эˆ\™1�eRПw6Ѕяw„јуьКљtэйаšŠ{ѓcПo/F”њїЎ:врС'…9я­ ї•ЧwЗЁржГˆЪџ�9ќnюЈћqФuœўЖїWв:M7ТЧс]–?ŽYwTя.џ�œў55КЁў№яљЯуU>гWXБљŸйыЦLБбEЦІ (Ђ€ЂŠ(  ‚шEPZl= _Ќ!Qх)[>Ч‘ѕІ…ЗЖШWШЉƒЉmБЄЖЎ œH ђ=3ђцдP:юzHъ$*Ušђм'2–Є dќЧђЊЫ_ д"Щ„јOŠ?n*€дЙ �}Фр•*J6ЉМEј&Ќџ�š‚г В=G*@l69>ђЪBxѕЭK'БKњCЏEЮHЄќ*œ{NЎ+‘Š№Нo|YЫ_Д ЛИ8ТCз;rдЅR РњWпќЗХš™~ЗmЪ”…)\њr)r­awXO…cЯ?ЮЕд'r= ЄЁ"ЭOі{aKnۘЉŽŒюCm„$§z§ѕцom6л# ‹Іэ1!€0в–GЉ=~ДŒuїŸ9uеЏќЪ&БаZЕhЭ@ђ—"JЦю ЮN>~V$Ј’I$ѕ&ОQ@QEX’єWCŒ8Іж<Rjщcэ:ёjJ[[ЊR№чю5FЂШіБбкЅД~]ДФЌžщu­! фЈїIЬƒњ*кЌ}”ЋЏ ‘а‘ђ h+Aщв–›фВ@$69ЌЭhЭ ЬŒ=qИИиъB@Э*УЮŽŽ,ц4\=\YљЈа8…›Гhфџ�UИ;ƒЦїJЦЛЖ€ЖьіFЗ|œЄљQWROЬзЪмОе!ХmM[ FŽŸ ŸОЉ—muuК)[œкзЦЊєPdyїd9НзЕy“XшЂ€ЂŠ(>…RH#Ё;lеЗKb†Ч–ЄјŠOк*ŠФзq€ХФ5)А6„LgxЧЬWЗѕ&…œ{й6тŽTZQE)( j33Г••йьџ�y іжFчшF_RлГБнч ’)OE‘НcЄ Ё^ЯЇэa{З-Эќж”ŽгЂ2јr,8m)')-0)QEњык…жр‚Ž§в3РЮбїUJ]ђ|УљЧдЁЈъ(I$“’|MQ@QEQ@QEіˆўБЌ­?;MЉОтJ=цнУŽ(эPс\-'1Gћ;џ�WжW{‹џ�šƒдч%~ыmeЦд7(№žЃЯ‚O‘­{j:~n—‰Ї5іœќЋ ]дIq’ђ 6ЃЊJxN ’Ё”‚$—ўдtќ-//Nh9љ*,цЛЉrфЅ%х •юGUpЌ)GJ�”iHaВ•NxЌп”§U§‚ЃЈЋœw—ƒbЄЦЃ№ѓœU™мЄ(5њЋћh8 ЗЁа’kЭ›е9кХskЗсšуЧQUЭХQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEџй��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/patient9.jpg����������������������������������0000664�0001750�0001750�00000021457�10513205570�024172� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џиџр�JFIF������џл�C�    $.' ",#(7),01444'9=82<.342џл�C  2!!22222222222222222222222222222222222222222222222222џР��й�Е"�џФ��������������џФ�@����!1AQ"aq2R‘ЁБ#BbСб3с$r№CSc‚Ђё’џФ�������������џФ�*���������!1qAQa"‘ЁБСџк� ��?�чњ(Ђ€ЂŠ( (Ђ€ЂЗmі™ЗGB"ВT<дxHњеЙІК%ШžпxuЈЌ$nRх‰зoЇЬŠ v493В3:ЏшI8Љћ~„НOXBZBN6’TЏЩ еВCг=т0Љпф a-ЦdAєяддeзЎWє4Іl6xРe u!KлхЧ § $^‰п\#Хbg>‘іуџ�шжЬŽ‡]йl,14чб(8љрвьюЄk+“ŠіН]%ЄЏ’#,ЖУЂŸдwg^;ѕeед‘ЪжыЇ'г•P2ПбЛыh.ЁЉeВ}гьЅYњЄš_Ÿ /А*`+рAA?ERvўЃъћZYL-Xу4KoђєсC‘NіŸќAнƒf=ўСрЮнЎ*1кUѓrOщAJЪƒ*ЖЩŽуGњвFk^КE:ŸЅ:Х—.4ЅŽ<vі'>›rPGхIz“Ѓђ„хЪмІ†S"ќFШѕ)ю>œPTTVьћTЫjё!ЂOКБЪOжДЈ (Ђ€ЂŠ( (Ђ€ЂŠ( (ЏЉIR‚R $рч@%*Z‚R’Ѕ€�Щ5ah^—]5LП ":ёГ„Ѓчъ~šњgгhЉ€­AЈRQ ОqŒ)гјS№ѕ>}‡™šлЊВ'ЁћNžcьлZЭЌ SŽфња<NдšOЇ)MЏNХnљЈлН)їWь>œѓоЊQЌoz–BЮ Ÿ!чRЅ!0Y;AvŠЕ@П*‡рЧxFs§WТ;ш{еЁв§!jkLЗлCвнR‚‹М”уЫДPцК „ ŸК?цЗЁщ™гe!гЋQРЩр щ?ј" ‰C,6•8F*fгЁс[ G8Ќ>Д-‹vk… ^0ЄƒюŸЯš^ƒйWЅ˜n;ˆejмёG>П:Й5$Й—b2 q6 Рјеkj†Н=­$‡RV—лЮьvчЮƒфоšF‰8ЂTЕr=РšW—Ё.+ (=”ƒ§ЋЂЌыЗjhF‰кѓiїMzЯГ}›yo!#ƒ№ х9 ЩŠЕ522нWЛ…Џ|гn–ж$Уrєэнз<kL€T‡9фЇжІ'XЃ_Џ’ ˆ-ќљд]їЇ3эL™ан.„ Ѓ хчAgСОhnІ2Ју&Ч~PТлu!!Jљ}p{sU~МщeЯKJог%ШъћЋl…|=РвМыЂЎ -НЗ[”Ž €ђ>ПНZ}2ъSЏ-ZoQ‘%—QА"BНе�8 ЯezЧрh) IGљWS:nдv‘|ВaШyi^`ў|x8? ЇT’•ЈAСЪƒхQ@QEQ@U‘в}�ўЊН&SрЗyNэёЄKMЙл­Э˜mJд2@ь+ЅЅИЮ‹вmXЂ„Ваˆ + O(Ч—НGXЕЖQЫfXbi-Ж–Ю2СWзАјgжЋнЇSЛЁЙš;е§fЕRднgЉзс$хеdйДУђЋеЅЏ:y%ЦгэЉ  @™яAfкЃZекл ЅjFжв;†).ЩFšе“ЁЋzxј­zШ­‹WіЋSVгЭž[_dпtыwцZ™j^ ƒA3fšмШС[q# 8Џ{”–#Bqй Уa?ŸТЁtх’eБn*Kƒ` дnЛjcŠŒл{НŸVбч@З/S0ѓю5‚Ђ8їFqKжаєэA-rЃ№г{‡$wЭ3.6›Z,пИ’;ZHkPИЦЃ}—ЂКpRаœ„Žљ4užЩь6e2Jyф:wuДHdЖъ’G"Yѕ<WTаy@y xiaФ%i!IPрцbчЫf|c u|вžЄд-*m˜щм Rк;’8Ї]an2b71*haXєЊкЎ!iK[Zэё BКщHЂд†к—pWМŽI'Н#\ ЬДЩц6уNЇпmd`зOФађ–єчPT€‘МіЅ=uЄрмmO.S!іTквЁG‘ іщюЈcPiЯdК�є)Рšо9m`pрќ§{ŠЏњЅгщZjрdЁ%ШыЪј:ŸSŽЪ.шЛуšoP�ђЪaМCR0{їUє§‰Ўf#:žЪюœ$%D‡`>ЎyЧмЯс#ШAЪ”TЦІВ;bМНh)HQ v ђ>ŸтЁш (Ђ€ЂŠкЗDTћ‹’3т,ђѓ ЕњMІлFЁžл…�0ЦхŸК3щмдS/*‹Л;n; јвU“ЗШ}O?JЕЅРjЩeЕYcћЅ–ƒђ�ѓq@cђЯњее\ЕЬд![‚V–“Žp�?Ўh%К}ц$Љи ю'—V=д/ѓWTNЖФJ. ЈŽUЗ�дvŠћ6О$vлЩKiШЧ9је эЖ,ишёйЪ‚КyQц,ьIBМŠ{Šwв MoR%,–ђ<=ныmЛВ.\№RHч&Бv§nŽАбy9э„žдљ5‹эЁФхIŽЦМ›wzw фwљŠˆ‹Ћ-як[žЩšЩТ™*ц‚#VЦKŒЁ{в•Ž ЧZВіњм;њSпЫoЋЂщh‡uBD„dЇюЈHW^–ЎMЭЉАo4ЖЯмq;“<Z 4‹В‰p;… ~bЌm9DKSlЪVV;јхfВ L@ЪŸSЇ9ЩОU(—šKЁщо—<аlЉД)*HRT0Aє­WббйMFN7a фжЪWЧЯšЭ)BP ’’9‚ЉОj ѕхХ5Џ РRŽ�њyж“=k‚фЛГŽЫWс^v§VрДСIм˜шIј Ц[-Ђ-02|ш9[XЗLrJ")˜ЅXOc?цœ:eЈжйж}Ўё#8O%�іњqєІ}p‰—л|Ћs6Ќn+гbЉ§њ­ђо$eМ?р8ѕe?ЙяVtъukQGm)’‡% Hю?ъіЎ|ЎЙ‚РœмЫ3ŸщЭd„чЩдŒЄў‡ђЎ`еVЅYѕ ˜ЪIH'pЫ=ЧчšZ(Ђ€Ћ+ЂvxжШyФ3>"Вxуš­jџ�шt$СбїЛвВ1юnЬ'§Х-жw2dч‰РR”sл џ�aTчN!5zег.€;w8ПіЇЭk4лД4ЧяЦУCžrОюiGи/ †мЛjМczм*ћРіщЭк&щн;!З!й+>шь3RЃЈЄ -g`QР%T…di/,*D'НАpЅК3Ÿ‘І+ЅБ–"ЅO0 UјбР4 7“7hx‹+a?ЪN*Е›n— ђЬ–фИъJі­Е+€=E{MЂB#Ц‘Д’xЦjrгkzх1 QмиW4kћ6:ж9№ЧJц^ЁiЫЕЏVMОлУЊŽыХруgоhžрзN6т>Ю06Єѓо’ЎбBd:…$x=БA\i.ЛK„лq5KiЃ…Ÿ­XзЌщЋ}Ž=гкy2Bя’;ƒщT'QДѓ6kГr"Є!‰9;dЈwХ.ЫuKВ[YђIu_š‡ј ЖnнmО_–`i›w€Ѕ№>ђёыш*[Ї6{ЕЎњЛХђрыђŸHFТВ œžц :gla›Жhyg*#ШUЅg‡тHKŠByузвхk$“иqH“Е”›mРІIJZ+и3л>”цгž"T•$Є‘ље_sihН9э@…х9ѕЭЬЮЁ<бJYmKQўVаU_XеїЧ›" c5НkД@˜Т]QѓєЌ'EОxХИQал„эє ђjў›\k„ УЫћЎЦj„ъ=Йvm`‹ƒ�КЄКœ~ кЎiб.ьЖЅЈВ•5ћTЎЕz}ТTquЕ; oУiОж‚№qC‡thр­(y'<џ�š­:ѓlLmHддЄЅ2Gˆ2;ю?Ј4ЩЂgІ_N"(‚Ѕ4в™#т“њbЃњђ<K>›’Ѕ-hRAЯ#œі ЃшЂŠКGЇБ§›Ђю”+k8’~;”‘аW7WOXcx&ЕЖG‰%„ž{€z яЋ“PЭЊнm %kpКЏ’F?sS]0КЦ‰`e2кМ1ЪTqСэо“zИшUіCD|ўdеЫЇ4Œ)њIЈE-ЃcHHx§шl“Xžс лк@#‡�Ю+УS]Н„ˆ‡X$‘Yi­3:ФђPЇЫ‘вЋ'• ЌЄKrсрћ#Š@їwиѕ ^rэhžЮјhJ~Э4щ<YTNб€œŽцЂ-q­aXЏ  1MшCIЖ2˜лKJQСˆ Т(T‡д’NяО =iоqЂ\sюcЊJийSЮ/ŒіЏy­7*+Œ8}ХPs‡Vf‡&@ˆ;ЇѓрRЪБlVgж’ћn(gўКГњƒгљ2.qЎHt;)кіП€sлޘ5v—Е\ДЭЎМ6Еу )'юЄ'$ŸNh!:lј{MЦm=аЕ6GЧ5q[Ђ{4tnOНч№Є­ЃА[cЅчќuЛ�`U‚бм‘ЯJ ЫZfяNp0io[Ж|f–†JвЁœ'ЙцЇпIжlч=ЋТћ2<{nО€БГ€h‘|ŸЦсАлŒДЃ’ц@Х=3"T6ЅЁе-р“ШюjПy—nЉJуР+ WlVЕЧ[Hл]Ёдс@Ѕйc9ЯўйђѓО<c�œWoSjœдŸЗэзѕї|Л1о}#ЛyИ\šЇ/6ЁЦqgТCЮїп“пИЈ=jЛ ЫMЪl}Зe•8ŸсЉ9Цр)}єНэ)T”МћЯ/s*ЪЦNJ•žIѓњжcЛЗ\ў)J‰%Cј№OЪЃЦЂѕUSњx•ХЭЇnЕfюoLзDf:DNzc9Ьg˜”ЧGн24ФјЋ<7'№RGї—XЯЃєві„”!JW9Щ!Ђ:,љЎбїpPкРј‚GїЭе6ŒŽŸ[;gqєwиF~ƒѕЉ­aBбE6юЁ?‰@WT5Cщф,-%З\Z@ьv’žJхи.\c$ ’ъzъз”iЛ# RЫ‡я•ёA@uI№юВ(!Јэ ќљ?оŸ-њёЧ 5,w<tЇž8у?ЅVZНЯnзГСїРєк­ :эВН)pЁ‡›Фт‚n%ўўZ [jHў—?­J;­ь_e”ъќ�•№Ђ}*-е"tEЕNЧ AЮ*fсt*rS‰2ЃЖЄa?#A0Ъn ƒл 0иЩ(№дUђЌF#жЈёлГ$XЏ2у7.9iсТ‚“юЈњƒV і˜LИйgƒЭ�аK-Ѕ­Ч=еšв• ј‡ž<Ћи …••qм|kIѕЅ+їz IЏ FЪ“Иƒ)/OЧі+еРrP‡ P’x\дхШН‡6,sй8яKnъ'нn$`нЧž8 Б[p,Є'/*–Šц[ѕ#Ю a:”Ї 9љддPРѓЪkЦ!фŸК0A5Љ,Тэ–Tq„}вpЉ”6Д‚“ќпе%FкЪ+^6ї? ћЕЕqЂ­5LЈ$€Ізк“\lНАльШ(Яˆю@Z•цUРўџ�кЛмžvs:œјK))* dqфGЦЂв[D9-јa-Ќ1œЄŸOћђЈW/YН>W?†ЯЃлї Кпм")ˆˆЮ&}ў#зл3ќБr вЄЉ э%*ŸЅ{0љіwђЖT• Ї єцˆ^ -ŒВсP№Юх$#§OЏqщYАЏ иn!"дwlG‚ЌlѓчƒљдjДѓbПO1љ§—V7zwM<щnSrЊjщSФу>)ыл=б=*uPЕлБ >ћ.6GЉIћВЕТDЭфupЄHV�рѓѓуWшЄmъК тC§СUjъ`WiИ!m­–T—т%cЅ[9ѓœ(ЌœNЧVŸТЂ( оБЁKМF !YЎЊМЄ1аТJI'Яюџ�šцMв^д’Ѓ€\@'аn§ЋЈ5!ZЬ]Ј ЗRŸў˜ ч->к.=MqзЪJЇ];ЛN?qW=ЧDГz-HJAйќ€Œ˜Њ м3Јd’тB–w'ПоЋFЯЊюQ[къз% !(№аwѓѓ q6Щ№‘БИi� qХEЫЛIВИ%Й–‡„žУж›ДюЅz`KoАцеёќTрŠнОiццЖП �ЁС‚šіZƒЉ,СqŠ –ЩP=ъjЧ D[_ џ�v9Јm9ЅM˜Є5ЙЖвsГ9џ�ђ™ЇNfнЩ2к9>tS[xк ЙЈI%jIVEkFе.^ЇЊ/€–PY*9R“ъ�ЏiЖYгпA)Pтc*ёS•Ћф<‡ЮXj„ZZDVж1ќ%#№‚{šL…tNŸvT–V†І�БјG4еЌ4ѕІЫ).Ш‘!YjфcіЄПmЗЃкЏxлПAtйЅЧЙEjC.e$(f…Пx@VF{еsЇ­qЎа“іtЕE�с^ѓЯІ)олUК ššяŠP’S) )#ц(л`с <фќЊ}Œ=t2оpјiф)Mkд}ІФ ѓPДОщiЗ=O?АЄВJFRG4уЈ›-ъKР�ЩZгƒŸuJ$~„VxŒ�€;cПЯ>П*uъV6Ћ‹йGќД”эR†NОC)Ц=vЊ‘Њ‚яŠеЪЂso›:эЋ•ФN";f8ž>'ЇЋ4КтVЅЅХ…+Й“^8уr7Љ{С [‰нД‘€OŸў•с_R’ЅЄЂp�юk5ЬLJe§5(Њ™т&&&cЎ;Ѓєn1е$Жъ’ЕЅOnP9н'"­­Fінn$іŽАsЮх cгŽѕWhЖБеI\чйаў;рm­НGЕzђВžЮВž=C‹ўФVХЧ.3\SLS9‡2ЭgHOЃЊ­Э;n’€џ�еWяEzљmiљF-йЇС } u­тBgшыuЧїаЃ,ЄЇŸўXЎ9iТгЉq=вs]KгЙуSш9VФ-%я�-’|”;ђPMˆжўЈ=ZrЪхЉ >›•”ўр}j№f Kk 1иN;qTŸQc; RFИЁ% u <ŽBаqЯФqVЄkѓї{$y0+qдЌр~tщЙЪR№„!“žљІЭ>‰хЅ9-ртї|R}ЏOнчИ‡Є4Œe@ж›{Жйj/ˆ\лС)>t “ђЊЃЎ7�ЭšЙЉ ‘(l?ШI5kGмЈ­МжJT3кЙѓЎ’k\@mАЃˆоъ{фЈаGh+ЕРыks0вЇЅ8VI%Щ'вЏKЄi’ dуqхYь)KЇZN6—ЖІщs�]$  rZG||ЯJоorч,Ч†к›o<Ћš}whЗ[сЎ\Е%œ,8I$ŸУѕЅЎŸYэЗd96VХowЕ}дќqLнMЖП&ат’Ђ JЧM[%KˆњKŒЉjŠŽ(:v%–ЭgmЗДДкШ ДœвЅюіЦяЖ PЃЪР}ВуjфzRАШёьJnJї!M…'?ŠАГАѓ’VмY.n 8ЪИђ-кЭ6СwDI ИУь,8л‰ЩJˆ?{ыŠщэ-wџ�ˆ4Є ‰{­иќ]ъ)SY†ЉГ.ф3u`ўй?„ќ 0tЦЛvkjiідАЄЋЫо4:Ъ:eiљ1]hИл %@ prа€zчљqUKŒ-@Љ<№{WB\oАR˜t— Ш!#4™tгnAR Љ.%CiIћиє5QІІє|Ўvцін^#š&yі>ЕO_RёŒ} cј КsшžЕ4Ывd<”В‡[;ŽєЈ‚1№ѓ§щo\лгaг%Пh*‘%айТq”ї#хЧыP-шЎEqтшлuŸSшЊвефЬЭsˆ˜˜ыящЧ^Џ.ŽЦT›ѕЪkЙQK!gЬ­Y<§*ЫжjmžŸЦ�сs'ЉCŒЅyљїЄў™Av’Sэ ЊLїIi�rOн@ќљЉЎВмЗ eЈ,ШЦXѓVпяWr хЌ91ѕŽЪqGѕЂМh *жшЎЁћ:њмW)Oˆ1џ�IћТЊšнД\kК1-9ТяQчAsѕЃM­‡f)!EНц|u0ЃќTчрN~DT?L5œhvгm”Sэ “рoо эѓЌчйVМщŽшуЦИСASC.ЄЄћПTљzЄW2A’хšєгХ8\w}рZœIНн™#Х АЕmлДŸО•Kx,њnвМф] АєI!Ф…šeДщЩJP[’мQяЩХдXШf:YBp„Œ�*Кжzi™zін~”а\XqJ‚HрИК X0фfƒn,ЋuЉ~†&лž@PNEОqwЉюI}[›H8ЮЄgL€€ЖT1ЗаRхŠsЖиn-–вTкЪA<€ Gj)NМЖХ'Ф}CчnO4u в;бTЪ.•�кyRИэŠЋlz}›Є–bГг$/t„Јэ FyOЮ­˜–fЁЖW ЊK‡јЎИrЂ}kFЧc\]At{ЧЫюИ•уhђ оbЮЪmЛmЛйK|ђжхŽсK№•=œH>ZнМЉё eh�ЙЗЯжЂmж'aM~dT%яAkGѕzаLъЩˆ№фЁ8qнЙудгmЉ*UБЏœ‘Э'_їo„Б—ЫЉS?ЪЭ>2иn*A8 O9ђЭ{|ЕMЗмœ”�\c“ŒfЁмΘ‘ŠйBїфOšДќH“[S[ат{Niz~žГЧ+qРЄŽћRЌцYНDTСSўряЈvње%ЌЏ*еšЅ˜•Н„/Сdў%ЪПяШUд}IoЖиЄCЉ'ТCyї€=д~BЋnœZоКjШэGl­ѓ”ЕЧ Qм~�d§(/нk?З<ŒAДЖ`Ј№ЇpOгїЊ'Љz…wНU5вВЏ@“фд†*щъmі6–гmи!/ј1™.OМЅРќOsѓЎf“!ЩrћЇ+YЩ4TQEEP^} дb<ЦЂ:юМЧP?SњрRя\tŠ4іБ3bЗЖС>*@%yї‡чЯШŠJв—“fМДъ”CJ (њsСЎ™Пл#ѕ[ІъKehВ7ЖF8pп%зхAIєКћrTяБqВжвуeЬћ˜ючWН‹А’‚Еь�ƒЧc\Њл—3|мёцХpŒ(c‘мщ]гоЃьpллRыx7пAmd4ТžyA)HЪ‰Џ—8—  УЁE<I—лќЗf}˜вJ›XЮсиќMal”Эm)\Љgi9яšQZeZn_jлк2Бџ�0зтЃуPKЗZ. MТ,Ѕ }х6vчт<ЊЬсмZSHq*8ь)џ�Ёэ^#Г\mMљЌЁe ќёо‚Mж _DXoe“Д!Г“ѕјVдhЗ.’™2 Œ–Зх#ŠYЖ]э6[Ъ[‡ y}aАЂйфїгфХЕџ�їHJ_B›9V{Šэ>‡Ыв­wYnHKћЩѕнoe(ЫKs%nBЙPњдFБГЧ“]P)eAjR;GqѓЉ}?c3йnжї‚Їq'rOРљаOiћR’L—Ц]W$šcqП…Ё\n<Wж[JуŽ)~щЉЕн›am|n>frслTЗ ‰)9кMiLз0šЗ;і›АыI%AУ…cсыRК‰ццR”ЖДя'8Й—UпО]žs~шэ,ЅВ?˜gН–ЊП/R_АЁГ„40‘л?WзGДМ})ЅdjЋЂ‡T‚YнфŸ2>*>яШ|jžщОŒ“Ћu$vви1Zq*yDунѓЋ{ЌЕЋT4и`эDX­Є-)ЪЛ% 1AQuR9|МКЌ•:]sžaђ’Ћ7[я-зVВI5…EPQEVчHЕуЖЋ‹PЄ8|4№SŸОO˜яUfгЋaдКвЪƒ”ЈwƒЄКЗгЕ4#ЉДшёfНжrOтQ\эLы-Р:Тм%ГŒŽШњŠИzmез-ыD‰о…œ€OтIђ?:qъL­zъкЋўš ‹‚†T„a!учŸE~џ�­ЇMѕ*uЎЊс M„  ЋЫд|щЪћЃЅOiЗ#L^Р­ЩлШЎi“уЇюЋaдНc )#”Љ$UЉЃКвє&KвI a/ d˜ѕјаZж s–(/MžI)Нъfи—ћwŽвw4Џ#Ш"’Ѕkыuкзс%г—xN|щ‡KЩn,& Eoz ќ€ [дpюЉЖ%жмHЫ.уКБ€>UяЊiZч>ћ~ШЫшQBРСЯЛЯж˜/N6єДФ}„–]CПеIZэјх0lРЅХ•…+žС#ќа9м`*dh№т2„Ч|џ�CгЯѓІ{LVa ГГj8Vп"<ЊИб—ЗcСzЗЮфЄ–ГЩŸJgBзM‡6:Ею'?—ŸR76“яw”ѕ(nT5*fRGпЮ0=kцЁдlбтмфЪB€Й8Њ/Ј=OwR)шх)Ј…КGМрєв‚#Vkйї6ДБ!*ˆ•ЉфŒFoо—,6)кŠшЬ,—Z€�TІа—eqKјъ№7хp”'дŸћЯ•t QtЗGl… ?wSdЉї�Яз№‡sAДФ{_IДhŒСewUЖJмЦ9ќGњGы\бЉяЮ_.n8\Rк $)]жOuнжвvІžђдћŠejЩ*8.|Чє­@QEQ@QEQ@g"Ÿt_SюК^BЗœ[‰œ|Aрв+usDurдѓ[ЏA?Т“ъqиŸ1№<ŠЄѕ.„НigЯЕE.GPїHЪHњRьYВa9О;Ъm_СЇЫU.LiШLˆуЋHRqђ4 pюг  Ё™+JэMіn­п­1ќ6Ф„€T HќЊeЫЇOoэЈЫЖ’Wџ�™ЭœќG9Ѓ4ЛЃ1o‹ю>ћYЂЈ0елмћoБ–™i[В’Ÿ>)}Щб.2§Ўчx–ЗенiI~TжЮƒг)gsзяžС?оЗЃщ-Уj2Ўž_’PвR?: эымц^5жK ’‚Ўуѓ­ЧЕіЈ~В9x|ГŒm#ž*СMЏІŒЉ$CК,œ—R}ƒзžŸBBƒ66”ГŸѕЄ)GђЭXь›ЅхФ!зхKPс)RŠБVщQИЉЉк’{Vј�gjеяœy`зГLЕ[ZKv‹TfT76а$§M'^ЕеођЃт;Б@а]WоЅиtЄZ4ЙCLЁ>ѓщOМтБ‚@ЦIјšЂ5ЅŸЈf-щNЌ Ћ!YњŸSQ ZмQRдTЃцMc@QEQ@QEQ@QEQ@QE} RNRHљљEЈ“!?uїЩfО-ї\ћю­_5^tP}$žфзЪ( (ЂŠŠ( (ЂŠŠ( (ЂŠџй�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/npm.gif���������������������������������������0000664�0001750�0001750�00000017605�10506736214�023222� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aЪ[ї��„‚DDBDдвЬ„‚„dbdІЄІ„Щ‘<><ќўќмbdФJL &l|~|Ќrt������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,����Ъ[�џ�HА Сƒ*\ШАЁУ‡#JœHБЂХ‹3jмШБЃEˆIВЄЩ“(SЊ\ЩВЅЫ—0cЪœIГІЭ›8sъмЩГ'M xJДЈбЃH“*]ЪД)G !JJЕЊеЋXГ2…*t�„Џ`УŠKЖЌйГhгЊ]ЫЖ­лЗpуЪKЗЎнЛxѓъe+ЋРЏL˜0‚Нˆ+^ЬИБуЧ#Kл7ш_8иЬ™3€Щ C‹MКДщЖ/ЄўКѓ�П^]  A‚‘Ж|>ЭЛЗяпРƒ—эК(q…@Y7Lю6`‚šhVр@zuсиГkпЮюё„ЦJџOОВr†Ь+GЙіmюuГV�–>м’EЗП_Ќ~Йџu'р€й}‡PxЇ y't�0Ј^WЯЭ†�З‰ДлHЌХ%вؘˆЈШ!(ІЈтX„`„СШмq&уk<чœlт]˜Ё| rhIѓшŸ ўGd 9$‘F. %}T>)т”Jžˆ_ZVх’+†)f]-єтA2ци`fу”ŽыUиcn№хЖ!—U&Yх|,""|‚ш“ƒъЩЄ“L’ис”Giш‡&J(ЄŠŽiщЅh•Yа™12h`НЙcfеMWъuMrщhЄYт‰'ј]џЩшЁњ™tш­ЕZŸДNљЈŸЙіКjЅ˜kьšшЉ&šžВ *Ž:Z[Tk�mЙ‰dg‡…ВJhЃaQКч|ПђlИАІ{kИ}›ЇЗхЖ*юБєвЋЉ›Ъ&Ш,ДШŠ#ЈЂJћUаuf№ЛЮл*Иѕ;ЎЛТJЪА‰ГлЈТC|nЎ†жыёЅ.jО7BзЌПJ'…PkР VXa‡ЅЪ­”пЂлЇ€Цњm–]> tЯэОjєбьЧL ry#wЅ д3.Їц„—Œ�, Pгw‘ИєYcƒmvpїFmѕyХ]Нrж0P-€айощZі‘{уџэЗi  јр„ЎZсˆЎfр‰#юіŽx=ажwџmљх˜›%Рцœwюљч wўUшЁG'2F€нeюњыА†ulБзnћэВП­еюМїюћяРlТoќёШ'ЏМDФ/яќѓаG/§VвNo§ѕиgЏ§Іеoя§їр‡ЏUѓ •œ‘љтЇЏўњЩ“?[yЂпШГщ+ПBm"tу§ьїяџџ.ъžЩ:%ўэ"м�ШРъŽ€ѕћзГ№Ѓ6Хo‚њЫŒjdAITљs Gx<їy№AёгзВЪ—ПІа!ц{Ё§"HУeё„8Ь!VLЈBв‚œс џ5h2жp†6Ђ—ШФЄ№0†H|mиУђiаˆTЬb1иФ.zq(OМтчGD!"А~cФbKІФ/Кё c=CЈСeuм_QHЧ4rŽ€ Єеж3Н6 ђˆФ—gШD:ђ‘Y$$'IIѕIВ’˜Ь$і.ЉЩNzRyœќЄ(Gщ;и4ю”ЈLЅ*WЩЪVКђ•АŒЅ,gIЫZкђ–ИЬЅ.wЩKUvХ”Є І0‡IЬbѓ˜ШLІ2—ЩЬf:ѓ™аŒІ4ЇIЭj&s=Рє‰6ЗЩЭnzѓ›р Ї8ЧIN’<DZй,Ї:зЩЮvКѓ№ŒчKBТ`bS5ђЬЇ>їЩџЯ~њSž„:Њ›’аFC$9шIhУаq’Ч нlшHŠPšPtЂ0Йш?7ЪбŽЎ$ ш= šPŒšд$е(7SZв•’ДЂ.}‰J=JгšўЄМчH_ЊP‰ОЂ'§цLъŸЕЈЕЉR—кOœšIЄПФgO1:е…6є уAЈt&КUнlЕЋ^Х*P[њгЌjЈЋ э)XЭ*жГЂЕ kEыWлЪVВbѕ­LЭЋ^л R<UЇQ…i[I:SБњ4­0еjEЛP•T•Јˆ…+U'ЫгЩОuЊt…lYƒ*йНzіГр шрИиЪPЖВG],\ZUжЊVAulbнЪи‹џТЖЕ–=­D K[ЭЊѕЋ  Ўp{BШТсЋД8вэCSKиЮžДЖЏ]ЩPUkзЪкvЌƒНЊn›+YЬB4ЛЬЎxЧЫl"ndШ5ЮsП‹оzWБ№хэlЋRшТзЙіНЏvѕЫн§:wНї%Џ€ŒBždvщьw—нА*8ЌЛ],^Zз–šТЈНp…ЕZзжтUОЎe)WKр›X(iг]‚OЬтЛxИN%mTwњтлјЦёqgXћјЧ@vчkV UгљШHNВ6™^ЉкЌсMЩt)<e%[љЪќŒ ŠЕЬх-ЋXЊИхp•-ЪY,›љЬљьВšЛТc#ЏѕџСQЖЩcбLч:ЏsЭxnsr; ољzxАВЏMhnц™ЫMŽ/œ5њоџТР…ŽДЄwrш-{9 †tIС;ц9Oњг ŽIЅзЃgѕЊuбх4•ЁьщPЛње&ЕЅьфГЂ:ЖжmIЋaЭыWЫZ ЅЎЕ`Yд”NXКPюЕВC§ыKtйаŽ6_gMm`гZкиЮvhЋЭэkkћлрцЩЏюr›[&Э&Зˆьж˜Œ™нчŽЗЧl[SПHДМї]тtзлЋ&ѕєЛ“Њo~œМєіv„Q[ь€[Ъe>ИФaмэjYб з,}сŒOќуТMјХ›лчд.ќПџ/8ШWЎT+œЋ.,wЭ`ГќцK9Іažы”ї\КЧЙа9ъђ‘Џ›­Ў-іУЅœьЁ;ш'ЕЗŸNuB}ХUЯ:šuўl­{ЫWяњзЧždЎг˜ьhџqиЯžіЖлиь=vЛм]МіИЯ§ю&†Л‘ёЮwз}я}<ХGMnСўГпѓсЏWНяаŒМ?Џ^Щ[>ЧQgѓд/ЯљІfбXяМшњљТўєяЄ<˜5Ьњdw<Ю(uIыQ?vЧ›кТ‡єЉѓoкg]ѕє9YŸ;p‚kкїOЗНАghF8УKЧ5œ‘яtрCјЗs6іiмшыЏzњдКџђƒŸссc|гмзѕvУ_§Я;{Ї"ГŸНўŸг?§*gџФЧПйђпZаeT>ЧXњ'tж­g[ЎG~э{ oˆsќHiюgz˜61ишvџц"ќїhж[TF[ХїnГ7‚w€Иwoш€5бhХч‚бV‚18sG%€=q]љ‡ƒйƒЙwo=x‚�Жav|Bhn%Ш`P8|vtіg‚'ИkMјmD(ƒ ШYзЅj,aƒY(o:X„<ш|цwrFe…b8†N‚/g†%з†еѕ|эЕ~nXne(aqхz}и…JшX˜‡z‡#GˆMШˆ8‚жЗˆ8џЈˆŽи… hPƒ(SКЦZ5‰9XzџrИ^X(g>Ч‰аЖ…Ьз…vШ2gŠиЖ‡Љиѕ{|„Hh‹Ў8i“X‰€xW ИqЋF…И˜‹Кш‰qШ…Вˆ‡ччƒ@7ŒФXhЈиgыІŒ|Ж}VИƒЯИlА(Кgs3иif˜Н(x‹№І„‡‹&ŽЇhŒ‡ШŽьзˆ№юzѓH{ђxШї„Џ†;qƒї—ŽXVrењ(^ђ8]­˜�ЙioЖqЉq9`ЈwЈ Щ€tX_ц7‘iˆ+І€wе€ТXaО(aюV‡Нgrщ‘ƒuІG…Ю'“”]ЭЗ‰џљg7.љ‘щіŽ4й[_sОHb7„ЗkЃи“ˆWb”нW(™“–јzh˜”yLr љ”е†*aоЅ•– 7ƒ4И•9ч”g'’GbRјa$ioъ7VчHl#tjЙWљИ—’‰~Йx}˜‚Щ–vG˜…љ“ †“z™’сŽBе’˜Ш)(™лч…ъзtMзvлX–ДиŒU—о”‘9™y ~ щўИrGŽвg—Ѕј˜ЂQ5›ГйІЉš@Чš­i˜n†{—E_'ioРYЗјgдe’Œ†t'y‰ЫХ‹ŠЅ™reaЮ9’иеpЦb5™UШ‰_KљuЎœЭџ‡b)_Вh_6Љ‘ьХƒјF‡ЋЅoH€5Щ’гYщдИ_™…w™kуIИхžRIXEyrIШЩ‰ b—,Е“pЙ E‰šg9‹шIrыЇЊШ™] ;ЈŸиX„љ5”а7[З]™%†Hй  ї|ё™„И–}?'–РŒТxw§љ^ПˆЃЪ_зЉhcЉž:кž&Š+Šr!КЃ=КY(*ŠлщŸЩЩŸwQx~дЙ{нѕ–WЩntѕaЫY ЁWи‡*JЂшј€ЯйjyЁ }гЁ‡ѕрщ›Šg|лDšэdЇIЦ›Њ˜b—‰ujўФ˜“&|˜ˆxƒyЈˆ*ЇЗџз˜ŸY›Žj›яд‚ŠzgQъfpj™В'Љ4% •:NOЉšz›xъNCUЊŸ:0ИŸЋeŸ-ш‡жщgqU‹я™‚ƒH‰›ъ™Љ*N:ШЊ_ЃT‰”фйžџ y:bЌжq›ЙЋоD„jи_ж•tLš†Я9ЄфЗЅ :Œ%ЪЌ ЪЈТ6…а•)ZšєyЄ ЌdЊЌ˜Щ­сД…\Ўж:­ыZцњЄKъ€žЪЎ†ц­щЁ­њ[ВjЌgК{У Ѓ§ХЌ'S—ЈЏЭzЉsdЈЪАьdЈ8Б[N‰zБqJx!ЈБhЗ‹ЫњƒкЈK‘ќšŒdіšЌ(Њ% ZЎIŠ*ћ,лВMЩБЧџH #‰АмWАЛuYV šKГ7хАІV­gž>(ЃFЅl8ГBлx'лЅFй`о9Еm8p™њДPЫЇ ›ћyЌєŠ‡"‰—iЉЕL‹УКЃSыЃж ™ekЖ6…ŠЇљЕЖ†­ Ў�'{! З5 “ЫЗтGДјИЩwВ„И\{˜‡{sIЇ1ыŒ2{šŸ Ј�ћЈТКИ&ИЃЪЉЗ)TЙœЈ‰ЗRШɘ+ШŒКъИВКdЩsЇЪS?[К%бˆЕUЙ_КЅUYЙajX+(ЏкsЏkЅ{[К{hC™izЏОu“§ˆ–лЉ™8;ЎWД ыЎDYœШx•iЕІn:ГЮ ­зџZŸЙч_ВkQkДBЪ$z™ЪЫqа[ŸвъОђ  FXО#|"*Єyы^@Џѓ ДY)ЁsИž­[Оу—ПнKS‰Ќ’;АџЛ„ZŠ]ЇЛОEʘ›БЙЩ{ілbыЇEEВьwšТзС$\ˆ‰ћ››ЙЉ9ЭыЅУy—J’—Ж[УЬŠЖд СБщ˜чЙžњ[Сы‹YŸ‹•Yл““ШsрфЖ.œКѓ•eŠœqYZЉЁJ—Ь™ЗZšМЪЩЛ2Ш‚N|„P<Ё€TќЈŠКЊњЋA”TХПFШ†VЉЎ6ЗtЌФJЦпЋХЉкЋ|–tH ОфЩН|œ–ksAЌ”ИџI•SмЧ#LЗ1xЌ4ЙЄ—лДъЩ\цкŠ5:ђgС{Y†О Џњ5ЎG Щ�ьЂОыТЗШв[ЃVќШ Щ&Е|˜ЩX;…iІЮY•^HЖЖŽ•ЙЋ&ŒU|ТA†С7Б™;lЬ}{hШЬч†ЬаЌm:,NћЫ;›ЏŠУ2МИrЛЬaмФ—ЮэUФтъПо|Оx<š,Œrф<€ь›ЌЕIŒХry _ћЎпGУЃ[АћыŒп˜Лh<ЯєЕWJР_9Ÿ?њУтŠОK{аС8Йo,КwФЋЦo:=•ЗEЦџкЂ@П…,šК­ˆ\а6ktOКРѓЩбIŠѓŠЮI‹“џНОЅiбе Ы‚ќЛШЩЏOмЖЦзОфŠг9в;їdkkУ ŠЛћС™Р+Љ›нLУ›Х‡+Эw:Э§fИќЮ\OZжэˆдuЙй,ВЙЊЫК ТdјыЩhМТUжiцŒЮoНMХ+ЮыЩX;Џџ жdmНs‰Г,НПГŠииgšЄгy-nЭ…>}†У –ђ;ЙГ<oћи.AЛy УьНв(вkMдЫйѓdИђiМ/к‚ ПЭ›ЪŒк˜Тs •Nк:jйŒ-гД­з^э–ыдUЊФ1,ЈвGЉЬ9МПкЖ]yЭн‰fЭvб=Ž#\нeэЗ›‡нМFЛ$џ+иЇнУЉ ос­th=зїиŸшm‹uнЮ“)иŒlпKоnјВœЫФяЌКu пх§›­7њЯ7ЉЫФ)Іuh’…ЃбyUnyЋ1\ЗZмa)ОwIЋйIп—žp,Хa‹Ў0­Д-ХњYЌ3jАќЯI:ІaKФTŠˆŽŸКО3\ЂЃ­‚Ё­]ўЊл%^sЃ­)ю™}ЕІžЙЅуДhЌ˜YуŒœ[9.тР{‘Іm–уŒЄЋ=ф‘-йt‰хkьгzŸ­‹іквFžШ|Л Ќё-„о}зхšи†]Žцнд‡эѓ›ЯйН:Щх’KЋ(žй#MˆУмзм}Ьз­ЗƒОu^џ}шЎ6жŠngлРе‰ЊШ-ш˜85'ЧзјТ3 Џi‚iŠRвyУ мЅ~ЊЁОЙЄЎдfЖ‹В­ŒјЕAЫ“Г8оE всѕ‹ Р§ЛŠ ~љzШл‹l)^rVішСгЏЮВБўујњвч\pИ.хЮžфьи- ьŽŠыыДtWш&иu\с|€>[р9ыЯС)хэ=э *ЁFzЧŠ|ЩМ^+оиЎrЖži§wСЭРlZяO>ЖЂЈяRЩтнхчбыФиŽЂе*НЉЬЕоЁє+№ЧЙ›ŒЌц™ы‹}e йъЁkуXЉхЌ МДm‘/Њ’<в№ŒоїNŸ,Ÿа6џЭю'ЭžAКТ7fьІ=с<пЃї „%/ЦS}пOЁоwLѓ%y‡ЗХуљ™ђЌЌ‰№~ћN`џсі'ёЏЪ`ћЋ4 ѕ№Й„nLа3яМЮа­ №d^цў­Ћ&Юэн>нv—Ілl•.œЩjйї е­ђ˜О‰ГщЭHСtЯЫАЛщn}чmЫ|Ч)GС‡Пъ…~юоUш^gŒžљˆ.ї€ЧљХјмЫбœъUMеš}о ŸЙžџxžIН OV5ьсОњ*!ЗEŠ‘ŸЏ–HћыlћЌЏн*мsсX­iQЮє>ŸѕР?Л: ъiŸ~Ц3g3ююмќцtхvџЙи ?ѕeьѕ•ТИОеКБПђVEЙG?щРЖ+Jд/цЂъ№фЊ§їћШNO|>ЮЭ�Ё@ �‚* р`Т…|x0ЂТJŒˆQуFŽ=~RфH’%MžD™RхJ–-7P�SfLš2mpS€ЫŽyўTшPЂEEšTрLІ5€SЇа„>•^ХšUыVЎ]Нjl6ІЮЉ_ЭžE›VэZЖ%ХО+5юЮЖuэоХ›WЏлЇ}ЁЮ-kеcU…U%ЦHиbEС"vмјАFШ ї\|љ"fЩ-GоZєшЅ~MC•‹šngЪ‰7g„нњЕџUŸ…]CLœйumЯyЯЭёїaŠМ‡“Fž\-\Іdчтў(˜6tжв_їЖ§ЖяжЌqOџВёуыБ•ŸG•ЙпЈ9Ÿ›ŸЌ<xйёaЗ||{§‹о{зNИнТГ/=4j=›�{ЯЛкђ‹2ў� ЯИў 0Рт>лŽОс$4Я6Э*BАDR№ЉіЮАь ЂЏ< џыOFcћ;ъfд1Bo<1H!AJё/еXьЉМљ „яG Тя3Щ^|rЦ#2•ВK/=*ВІŒK'cЌЯCь€œ’I§Юф‘Iй,Ь№K;‡,в9еАt0ЗХbTLК,ƒ#”У4џЏЋЬ"A‹kMтzQJнюЄєФ0ѕlЏв•ќгДSO‹Ъ“С=?%ЕTSбКTдLOeЕUW ѕШї^ЅЕV[MJUжQ§C C>§єuФF%”3-DжX?хєM7I“Н5кЎbsзш:DДL+kДЏЯЁфОуЂiмpElRZu‰ЪЕкUyнQ6Б.Rm›D7пеЌГ[щLw]Q<MLUqъW>o/[(!LјMp'зс*ї§їм7fЗрАмE8рШф…1XfЭЅX_Gжр6ПЅqe“aд˜c› Vг;+ˆJ’Cfы$ЮЌс mDљт†іћQп›ŸfЉндџоНЖРŸЉЄзЩ‡ЂœG‰ЖјУ™ЎHЈЯ&вcЇоЙj НWM—уvГцЌc.зтЃFЛoŽЈe{ЕБ…ЛQ“!.TбЎ-9?ХѕCœCNƒлаqh§Ц<эKAІKрЩ3н.Рн5tгO?KjвWEНuзГНЌзgЇ}(ЈnЧ=їVœй$яхюeп{Ь{и–gfОkg&—]ффGњмьщгY-‰#kцП—Ш&нq‡~Vt‹?Љњх­їWCяу~@чПўƒФ_WЮ5~|т KЮЭжр7FѕKд+Хh–2 =hiіƒ ўђW>kаk"Т �яѓ0џpА€v™бЊtО6Œ@Ж9П'СёQj $`Я&rТ9­ oНbплІЁкK€)TaэnB�"ёv.м†ц–AfGe›1с“V†7У§ЌŠ!|T–ЌDк‰ЏˆD\ чІ24ўЭяƒWc`—˜УІaьwzгрЙј:ќ1Œb|ЧD3вftTх ‡@уљlpLЁњци7 рŽx,]JЙHJžŠ…c9"я4YIN6“љƒ$ы:9JдБPwHь)U :Sц•Ћ„eцЂђEZ~Q“б‹e.o&�^ів—ПМe\@9Lbг˜ЧDf2•ЙLf6г™Я„f4Ѕ9MjVџгšзdІЊtЙЭцЌ–пg8Х9Nr–гœчDg:еЙNvЖгя„g<х9Ozж“žУf>ѕЙO~ігŸџh@:аaтГEhBЁ’P†6`Ё EшC!ъаLє …(FЊQ†rTЁЕЈG# в‰ŠєЂ$Э(J7ЊвŽВєЃЅ(LMJQ‚ждІ7ЕІACъв‘Ъ”Ї'ѕiPw*д’ў4ІCEjQ‰šвЅЎДЉ-ѕ)NЅ:UЊSЇJM*SГъд­BЕЋ/§jOУ дБЋgе*ZWZUЖЖЕЊWMk\ЙЊVЏвЌv+^ЩЊWГЪЕЎ~Н+`ѓšRЗжА…ы\ЛзХіUБџ§+d+йСR–Б–uld5;й–жГŸеgb7[йб^ЖД™хljIЋZгВЕЋ…mkcћZйžДЗХm4Eык™іжЈО}*o;мрЮИe=._sЛ\ц*sЗЦ%.rЃЋмщ66Йж­.fЏЋнцvзЛу{nmi;оэžЖМТ-ЎxЯ нє’wИп…ЏwУыоіЎWНй5/~б+нњъКё№rчk_њђзРдэo‚ŒнўиС АяЋ`/˜ЛfА…ѓћ`6ТОА†ї[agИФ!.j‡UЬж‹˜Н.ž0Œ |тќ‚ИГ+Ц1N[Lу›иЧ(ўqeLрљІ;jrМd!ѓјХNŽqŠ<e€т“ЪWЦr–Е\LmrгЫЎгп–Х<f2_yjeFsšе _ЉигЭo†sœх<g:зйЮwЦГ=Йg>їйЯt =hBка‡FtЂНhF7кб†tЄ%нч€��;���������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/meld.jpg��������������������������������������0000664�0001750�0001750�00000035714�10476333252�023366� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џиџр�JFIF��H�H��џл�C�   %# , #&')*)-0-(0%()(џл�C   (((((((((((((((((((((((((((((((((((((((((((((((((((џР��mo"�џФ��������������џФ�F����!1A"Qaq2‘#ЁBRБС$3Cbrб4S‚с№%ƒёs’ЂВТџФ��������������џФ�4������!1AQaq‘№"2БЁбСсё3#BRџк� ��?�ц f3\Ежc1˜њ&Р\œ|Цbў“”Ћ?qK џ�Э‘рOвћŸІ сpЬ’ƒ&qUњЅ иK“њр‰kŒУddz47аЫr%ъYєАЖ -Н”§.9p‹j(гэaќ№EЯииЫN>ъ[e qХЄ\œ?’ВЃЈŽ„АЫЃћоF Оžћяl[аiTоЎDьМЬIГЪJПЎ4TYс'ИФ€2—kѕX_‰WBЄЉR&Ињџ�ёe&™Т,ИЯчЮЋf)йJ‚ж†Еyk]їО2q1ЉЬйX ЦBД‚уЃGўвNУbЭЯ\3]р=,R’ИpЗ“rъюЅ:яќБЧ—ўЧGЯљ%J3?ŽЅGШŠф Ї[Е6’эќєђё2™„5шс™ЂЗAŸoЊ@y”Ÿ?Ыоорb-[&РЂц*;u7V˜nЌъX(ZA№ƒn—Жг8?–ыдЈВ ІщЗФ2ВъwФМ5Ѓ$а$ѕsѓ^†ЊŽFЋAЬД№/hŽ…:‘ъ‘Нў˜TTЉг)’UЁия$PтlpпЏ№з0dšкdezГыž•Z]œJFїUПŸ\аsн‰ЫFWт])˜Еe€мz‹IБ+Жз$мw6ЙцжицsDъ>{ЂцЬфžцLфщx ,$]r№6‘цTvУЬ‡—xiP›+=Љu'vдј,"R-tИOMFЧb7Жзжеk3ё2t:2єjKЄ­˜ Е6Ÿ№нVуuІ-Ю\>t… фL‡—[?э6nјљЈљтQк2-ц С ўЌB•QсГ[…–Ћ/$м‘=”(ђй_Ч и<„ФK= кŒЂŸэЄЛЁЄzиlІыЙ7-бІг)tЩa3п[}ЦŽХ$Љ"§Ж8ЋqћЇчdCњ ъЬ!3$VшRWЗ5iL–Aџ�л$Ж5VИ-1к{•,“XЇцX-KLGAuќHыњaЇŸИyEЅdPьJC—вm:–•~ЩП\,j1dŠ]?0BъPЙ,)MИС=X7"§ЧІNXяŸ”JIqŸ†њ™”Ъйu&Х MˆЦœ=Ёfњ?N_тu=+DђЃж™h2рQщЭHияo/ѕЇџ�uєќЇZžМџ�UmŠl0—YC+ž…|МЏ>–>]ёaR0с!/ВЎR­цЉb=žќЅ“К’“Ѕ>чу†9z‚и^wЮP!>>xPџ�Ќ>“фR‹лъF=VГ]k3УM&Т~•EP!ИPФЬXВ_[‹щXАЩœ ц8˜Y”y:™a?ЕшЏ#щ‡дu0ŠŠAсC@"#šb­njƒm$Ÿ@\О$ЧЂpЊАШј|УWЂОGIаЪUхЉvСЦfсх'/Jƒ –У8–$А”ЅХXю@Ии‹oл*|ЁЬЉ†лfD&›gткЌ,Fн{т#Q+sЋ)ТЅGz%r˜Eў"žъ]kяbmѕЖ.6ЖœRJД›ЈXƒ‡5W*fL5ŒН"Rтс˜ЭУё$lЄž„F'!ЬГХІ‘ ˆд рЄщfCCLIЪПРЃхгЫЎХПvB$N-ђі\ЋfAŠ<х8х 0u•8Q1кЅQЬжђ)j:э:Kћњд“и Ю *9жА‡Ъœ1Ї9G†ЄьЖРOMnЎп•вњEЎ$ОL3) ЉŽ;Lˆдœщ˜Љ48ЄЗ%єЅТ=д§БFYсt4Ѕэƒѓ\*�– Н`/ЙЙMЖБuDр§jГR ЌUЃІI:(W1ђOšеЙћуцmсФJAš]1bL‰їŽчХ�т™P •ЄіилгІ ГѓЭ†ИW’ышЖTЯДч$Ÿ–<ЕO �œgnцl тџ�‚тиOїЭ‚R}CєУ ЉСЧaG-DЋ—ч-Оcqф4…їАПCŠ<ЙŸѓ&M"6яУIv›RQr3ˆ§дjšW^†лєТ2 І‡0ђЭY…žш23O ‰CБгЊ}!УљБЯr?y=wы`N№ђЉkЂ ЉІPO9ХјB@љ‰=€ю}†фтEFNƒтD‘1адV\uУй ОYk‚љЮОЈєХДвЗжя„[ми~ИdЮЭO‡дЇЂdhкœИы ?Xž.з3ИaБЛ–Бёtѕ7ТўН]Ю9е*vDКХB2ЭЙЏ)LЦGљ[E’НёPїПэ;џ� €ІKр…FС™ušKOоХ –ЪH?W1І­РŒп 2ЄGŒ&0ѕБgš ЏŠ2у4ЦхХЊЧCѓm*Šу.й-’ .|ї#ЏlZг цмŸMр‰биеЋу)’д› ўвВ‡n˜Б6#лќІіЉJK|Е>3ŒЌ<Ckљ_БаД~%вГDS‰0ЈТX ў9мˆїиа”:nНјЛУђlІЅРq(в“Э!ЃЉ+Aш ~ЂўуБФ6Іy\ ќб!,Б˜Ьf2ЈYŒЦ`Ї$eW3ЂЇѕЗ;jкЭњ‚-YK)NЬk[Œй˜M:њК@;œ32оIЅRъŒ<„H’ыi'Rˆ6;XŽƒЯTшŒг)in3-ЕЂhGEѓХьfа9вuQЩV”щьLkM7т\ADrнѕ8­FопїФЖ#Љ TУЩв<W-Є„њŒ|n#Š%2цЉLЋfР:IїЗ\Gj-RcЕ&:nyj>2œjEЊъЬЉn–ЩQKD $И|ШЖуЁхЈъ8<ћШ[†R”*хJ"џ�lRц2cЊЋ% В…še ЙB}МёЗЃ Б9З5|Džjк)о˜"(ЛœфУ(s’.„лPњмт‹’ѓN)UD)Ђш!мІи3QX‘ЯЬqЕЅ(ЖД+pOиу'6Љ1›5‡лВ’”њњтRаBЃ8Іжи[dъ� Д‘а=SЊЦЇЦrк€ђХоъe6ш“иzvРšVУS i[bлhвјА‚ыW%2?8ЄИ†ЏЙ.1`vЁ%WцzsЧ0SŸЊMKсАЕ%йi*рuУW‡RтЛJ• †н“КЪBJlmnјUeь­[w<ЄЉж…9mŸ ЪИ&їАЗBn~иqR“—rХYˆIУUYл6ЦЋИЄљд\i^МrxzžЪэ”?'I‹–ъВЄпёywЛŠ7(ККпШ sЗђдKR2ћюЊГд” ўbЏrSъјщо+gv2­! "[вVYSeЭ!MЩ$\оФXzсo’Њ9zrŒЦЉжЎИV,ћЅhЗšMМLlZгИurі§$учEВы:ЂJЎ>ђ=:%FQ‡bХіR_nки>AizлUJ$ ЯAЇœЖЕЂ\�‡Pк|.%>`v#pGг j•Фу^F пФЁЕŸЭopт~ЉV™B}&™T~Ѓ)!Їg Jd l ЩKШь€?ѓ1J гЯnыTgTbѓR#d‚дцyўPKˆhј”Iџ�Ысщё‘NTІ™„яФЄЅЄ Иv#ФzŽПІ:ЗšЈД4УЉьCLеђиSЪвЋ^зџ�\gŒ‡*­Qn­Br’’ёPКOЭИПQєЦnB|A•g бlсbоўЕoчФtkFГЉ |Yё.ХEИєЦќзг`?Г@ъmїФЬЛI‡–’—eЩj;й<Е:4k=“}їђС,љбa”ЎCЈiХ‚”(‹›њbЕ+E~zb”W;ёw†ЦГ—Њ7gЧŽЅ…8„ѕеяНМБU‘gФт—ГдсЌ6УЮлvоžКWkњмсЛ6‘ЃT’™™‘Š”і[.& Ў%�ХCПQз§˜cН“јЙcRb;Ј№)ЈЧРD$ƒcд\+мcЂЩЈи:ыЁŸ…Ч7$'ZЈTшY3дІŒиpи —СtЉ7ѓ `Ы%Ь“$"m`e2•’сH@wјЎЪŽ6ЭuЦф­.GЌ6uДЛ™-Јлї–йJ‰џ�СФиЬH€фGžBб Ѕ;�<БЮИЌъxп^Шсs†buЩеRƒ1щЭЎnАљ7Y№ЋЯЯЇз#RЋB\IoЧyѕ ЁЗZ?0ъ5ya}ФFЂФ­C€ыБг% eC{щ$nz›яєСІC ПNЈ™ŒЪJщЮЕсH;*§ ЛcrрƒH8cpЊ5UTъŠфЧ#T’гe+Œ­‘гИя„^~с%JUnˆ•В†мSЊŽЄ””€IЬcГRТA#ЏžB~mf Ј.!ц"5§Жх)-я}ЧR}1ŽкщѕžD@RцРJq О,pк;мчZЬ’шGЭ(!7‡э))$ЄžЉ6ъ0K”2cyI˜u|КщЊ ƒ–ъмоЦзЙЖуqb0КЃ \;тм8ьЅцi7BRЯbF‚=RЃпБЧIфiMFЌЭЅ! Еb>:+vАmwГ­§ь <”qšГЭШ+ЦOЃSeJ~ЃQІЂ-R2СZвс)#БЙР.}d?›aKЂJˆє„>ВP­яЉ&џ�l5ѓm-љyzL*QCМFЅЇnЇs„…Q˜”МХІ•PgRм[ˆ7P]ЭОиЧjяЦЄњ)v0™Š)Y@O™”е!Јщ6RG–+™.bЈТEb"$ПЪ2№” ƒaыч‚оц ЕШвйЉВуH#Ђ†,3]кr˜Їг›*›-)wїGЎ(кЏeCH Є%rёQс–z,ЖЗиl;v/П1?ДвМСѕУ;>ЫўяЊd$4нКыnTcД›<Щ#v‚ћ4Ѓіё Зз‰5‰Дƒžќ‡ѓЩЛm2.†рЌ№СŠЋД\Х;"ц–Š˜кifї?2‚OЗ'БЯNhж3§ўlЋІšw –ЮU—WЭg0еуЖЩ%Єp4л~јu№Л/=>‚З*‰dС“(hX[r>˜‹ЧjЭQZš1дZuд\|Cj–ПЊ‡Ў:XЫй)иАŠуЗД)]oЖ1\Tw(k5*@IŒяMŒЌыLЃБ—TŠs RЙюsТ§mпш0ЦЬП‡PИrлЮS�Н›вn ”l/шpМ–дЙйš ’цОлVZ’ОЛsє' КƒЌ‡Щ††ъR*мuЙ?LZБхфК з?ч>4ЌІЊХ%х&zTъPn•ї)З№іРџ�ѓЫGћAw.ЬW-Ї\нP=’z žЃзЪрєT8hІфe?–тd:Vџ�Х“Є ›„Œ#x–?‹1БОJ’ІŸj+?+;~eCb1qAbЃDЗтжH‘’3K№ж5ФYжУ xT“И#аŽŸQдcЅ2\˜м[сєœЏUSkЬTvєD‘{—:�{єлзбVЧ;U`=LЈПJlы*)>ОGызc‰њ]ЈBОв ЎЅS ЃeМА‹љzу В§К]5ЈHq-4еьЅЯ™§Oп�М"ЃБ№ъВ›К”ОKK"њз#ъL2шЂ;Ў4ЬЇ–ъвvJЮпLdPЖL”В"ˆЎЪoђеЇФUиўƒЎ6УJъ‰LzЂ z‘сm&УдћуЯ9Ч`�дуR ОњnEБ0М_JЗУЧжяё‚-?„Fqо@ѓehВЭЩёAf\щГPћЮ€кŠ5ƒЄ=Бю-™rмQsњђОdŸю§- ћ,O†Q-oxT6* =~˜"Ж…`Ж“1o…^ЭќФ}qіƒі˜}HGТ,ЌЄwѓЧЖЃУЃFK[‹Xш•ЉgЕъ…Zt}k)‡ е%Є ќФў˜"й]œŠU–"ЕЮ+jЫtxFЪoK\}q>ЁTфгЙDBl›Ќњ[IЈAІ—DЪчЖаpІщ'пЂТёМљˆ™2RŽ RtЅ'гWйz`А%ЬenЄѕHѓЧšЭ9&[sZBNІжƒbпЈ#сŸKŽ4‚”2йCIpмъюN$0Аы+•- ,žƒnŸЎМGЭЪљ:вк&4Є6й&СE_*Нњ§Бu“рЗЧsФfЉE*}[­ећžо­С€ќїЈЯОњЅMy2’БАHB……ћwџ�У‡+,ЄЅ1Чќ>P=G—ыŒ5�HBœWЉЃE2Й(Gv8JЂ?jвTIИR;\OЕЧ|-щ•$вЁў0–YZ0ЅˆЩЙSJ иъђв_ћbџ�ˆuП.ЃH ™ Р?ЌЫ-юЏŒoщчl,gF4Ј№›Ј;ЁoмІ2ЅЄ[Њ‡змcбкZPmЋc ф}aЭ І)ж†vp$тAžЙ BъыЇцšueRTЏtjъ%‡RГаou‡žЦ~A…ЕInІА›‘—*U§.„єЧ;ц&U&% %!*ПЬ5‹[ЯЉ6ЧEeЉ)L%AW[вŠНIЕЧ23Э“ї)8цёjЗЌщп#зЊбЛЄiе яŸ˜ƒŠЙrp Х‡= q˜ф–оlйHrж$І9аfьсУ)•zJЛЎЧm€ЈќСЌ )IIіи‘n—ЧZSивф6яіkQв|К§ёЮYЯ OЊц в§Eі›yШэ3KoPўАAJˆOБIПљБЩ ZAІvZЧЊ)ШybMRM:ŘfШЋVЌKВ+C$‹ ш-‰ќgЌJЏа!ЩЅМє! їЃЮвЏ.!"уіNћŽЛ`ы†дGшйb4IŽ%ЩЩe(Zв>[&ж\еjыuмСG-б›gLЩ�ќЪiWКЖ�jОо˜ш№иuЧˆ>}?Тшpъls‰{d њoћiм?@Щ4™t‘Q*ѓеЬqСБшl]њ`7бхSшH’Є­MОЎdg 7A$“И$tЇjп єњTЅЂ9YеЩQ rзў8œіfjobвdДЗъ€–”ѓЉЙmАЛьO}6NнБшkZ^ 5ъМэsД#эl?’МэЭЗр— y­JЋЗЬ&GHФљNЇЌНS~}2›Q‚„Иъ•bKk^‡>шq_l_ё~­˜iThrВšаg0№uцCэ�n}Чл >дЪxeF™wЈхДЈ#Њƒs[Кћиpцє‡ЉмТ-Ы?Ч&ЋЎ9‚щƒ„ПЂq‹%f:SгЋЌ&иI<Уэkоњ|&люGЎ7хо.šьЇЅгQ„ЩfLЂR]xSб#О9’]}BFn€Т0Жme>›[щs†п џ�“У81kRZˆЪљ€­J !IY7ягo_\mRДЄч€рHїі %М:ЋCДœЦЋэfЃ›ђЦzu9ВЗVјuЈЛ§Aѕ6™iMМ-єHиєиэО3gеQЫ6ЫєjЌJƒЪyјщв”sЅD›’=01TЮPоЩй^LДЧ•>™-Ц].,%ЧЄ\є-яц“є ЄfКˆЄЭ‡-BKNЁE—:–вˆлмwє§1ъ`nšЪЕ(цз”$Hш %‹ˆ$Ы—гГІZ[ЏЈ1Б€а`ьce?‹™Њ&oЩДљŠo“˜b:сMЏЄnБх}Жѓre‰†Ѓ/е™QKŠ~3їр!єhZ~Зls„ˆъT'PЉ˜ъKgY� [ŸЯ юTИSD–Tц˜ыŒ\љˆjciАњ\[зŽ5bЫWrгћNŸТмНЖЉoPx€sOяэ+ Є8УЪієТ/4ъЇq ЌR\м]žљ‚юќКbєЬѓђН?/дЉO)Gš‡Eіq:V4ŸCПщ‚<ЏžhЃ,ЂНЬiЖЃo%л]…џ�ЭБчэšъM‰jœсQЃ1’ЖcЁ…Кœ оиZq?;Сƒ\ќ5ЬиЩќЧ[EЮс HъQПK@Щ\M{ˆ•ќЧDЂЃр˜D5ІЂЂ!@,‘а\‚-ОиWфЪTч*ќ ƒRцЩ[2.m*Q$}Бис1ЕRЕc<‚b`чyэ•Џ}zлWм–s‘ДЧЌі„њЪђч?—fЩ­ЩD'[RЙ|ђ’т[) ›мlNЧЅН1Я<O~‡NЭT\УC™-љLIC’Vэќi ѕі#m­‚КfK8ѓяЭ’мgзЭ -�:AХgБыЗџ�тu6T|Ÿ.<8Oe\вѓЊ uт>›žXЗ-›Њ=”*‡8l MdŸ)нsъ^pцSЃ>#ˆ‘Ѓ[=ЮIœ@rК”Т]ЬДiЁД9љEpЌ^кlт=EШП•№W˜ *Jd>” Џ–EюFуѕТя(TS&ƒ“gЄ•ШaDjБЛбœI?NИeHp'ЎуЅБСИU—dhЙўФT3td䔇™ZYF:Wtџ�-Ансќ1ђъуеoЭRtЋКzaw6cU$Е=зЙYi?—ІфЎŸ УІ:ТМ ь{cbёф064!lйUІАпрiˆЗдQ~[~яѕР3™z<F‚ЅOMžДшCaэE~wО8Ћšз/>Njœ—” џ�VG$и­Фл]ќьIђNNnuшэЂЃ™І*ŠV$ЊсVЖЧКHБм^јя[pƒAЏfЎюГWe*LuA'mФр`gіТ–ЃУЩќq€нar РІвАЋйJMРПN"IЊ;pѓŒzœvЙmTZчiж&ФўЊPџ�ЇѕIъo2б+*u>*“/Љ  Іїв=-Заaƒ§)#ѓrЎ]™ІыCЎ0ЅzЃoџ�1KКкИaЩџ�БеЄъN,rЅШ­0œЃNmДЉQ”иqХm *ё{я‚Щя|ЭђуЄ€p ’ЃЖјс‹†­”XˆЇŽЅЖЎ/{ьz`юA”г1)ёƒKuIжЂГиОИЂФЂЛPФ‰Qж~!Е$,Јн+R­лмуhЄ)ЪФ_ŽynИД( …МБ6e?:\MѕЩ vн/Йў8ёRццEЅ‹Ж-фМо ]-r_oУЁ н~G˜˜лЏНQ~"›m bЪQіЧЕАїтSHј•YhRїИЗAэŠж*ЯuІ'4 МB–NХCST—V—ъ“[дА›4ƒб8ˆgA—MmЪ‚”Š ЫkлЊЄA”ЅHA‘Bщq;ЄzWWž‡QІ<ІкAtІфށ8"ŽЭл 9)іŠ—5@4вGЪ ирŽЭРИnЇaжјдѓLЙI†Ѕ:ZсIя”fdЬuЙй C�щRЭы‚)4єў4Ј4Ї_Ь vG™ХуjD$6„�PЗ /t‘ўИ‚К i%(eВ.Ћ­ˆЉЊ1kYхЅJВ;‹[ њт"Q K(‡ФШeh *ˆЅ›\x…№нІ8CH Ž ичќУ\JЇ~(Р*ЋЖц„ЄІр5}Хџ�ž9&НЁHjqpђєwш6мcQ-R?2уC<ФЈICЋ>!ŽІкpAдHFњa}ЇH8НWЭжE1ВЕGŽлZЙ–и&нюNФп[Ь4†шд„C8РdЩBJtЊї�qt›,"ЂЕ—yяV+Ї–ВЕjeЭ%-)+(ёrвQ)Н€~§qис•ЭjЧkЁЃ”FO\ БьЃŠq–илВЁћД� .ь:m'л*Ѓ8Г&Іѓђ™ЅЎЖ%І.” Ѓ­Х…эa‚L‰!.№г/Ьp-jiQ”RіfHNпK hЉgŠ}J,КE3’˜”ТуЖыIаЕЄІкMЎ.AИѓФ\ЮgƒQ^lўcQф-н’’ ЈЇё!‚Ѓ91МwюДЌ8•џ�Їтоб№Пљ‚:цNКхtЧKqЙmЇJSЗг5Љ1Jސ•‹љщ'ј_йЊЙ+EnЬCMWrl-цOnИцЌэФЩЭMЙKTXJ i`?Д–8іь†Щ[фЎЋЂОЅйФєPщ|*xLU6V*иCЊРtџ�…NxBХМЭяџ�V 26rЄдc4ќWмXU‚‡-^{mА_›ks№dЂЏЪy –Ь`•t,нў[HОРѕЦkZяЕЙ–ДИ;Йc_СЉ$LьЙќ№ђ{t)%ЈЋx%heеXЉFїэЖ§ё}@Ш­ПNn,ЅЉ\Ÿ]’IЙ)НШЗLжYЈT3ѓюЛ Ф‰n%1н|�( ё •РѕAУ:Ѕ5šeЧd–ЃВвn­*цж7loёў#Ф)SЅklCъUШР†3ж4янxЏж<VэЗ4э\шъИ$#жvы“ˆ]№Й‡WУLСOP)K%3ЄѕH #юœtЈ7*–дCэ…„,„ПпŽ0ђ2ŽgikдEB  ”~kG7?|х|ќœжЈ”zL5%цZCo8ЃКt k)Р6MЯSlrы3™§‚ѕ:* ыžЂхб&”ЬHџ� 2:њДЋRДээзмa&ŸF•”фДѕ,L†Ю DlЉ]J“koп5ЎDЎеdдЊymH}wCmЄ+G•дzžчЇІjгЊ<<ЅС†лzДЕ щ'QT“іnу*�AaШЯOн^›Э7‡єJž"e(љ{3qTLmЁдИіъi лpAыy/EŽЪd8Ћj=А№ЎбЁq*UѓU6ЈТ†е.Є0ІBšYџ�”zz№'–hёS@ˆи TфLjХцФsуrўJтР§6ЧБГу 6Ёя—9АЬw/5ЗФxАГ ?Ї jО  1Ж?mNzЅф:$Щ=Јo<е‹…Э$ юnЛaТЗ#ƒ•BкД-‡Є)Ђ?`ЄЅСoЎј/•c™faŸ4Zg!M$ОŸЬЕˆ tѕњ`;ƒK|ЋИтˆ�Jqкъ!Я>%ФЊ_AЈа ˜=5:{.{ъДШМІђ‰Чr7ѓЪѕ§,jЭЙ‘ ЗВёчxMќ ЎЌ+2ЧЧ#…YЕlХшсVєW‹џ�й?|MŸЇХ~$7”й ЖгqвЅ ,ЖJЯЅю~ cЉ2їЈT\œЌД†б_BƒхЯ™т@дЃі:XcŽj6‹CJо‰\ЅСъфкEJЂе1jnTˆчJа.Дщм‘хсЙПkaƒ”Г�fЙ1MФqйЎУ˜§е#Z–Вwё "чНН№1rtючК}M„*M#­‡ ЖЄўгKђ:I рњЏ“MЌShбч:эЙ2}J RqJ �ЌRНў˜ьк>…{wаЈЮiЮ&H:kЦыW‹вmЧ 4љsO6њAMcXЧš“GЬб!PЁГQ› šЊRД8тJSт)КДŸ-№НЯUh•jЋ†=EspИ„P&Р‹[Ї{иbо‡’iгу!йВаІмJюъ_ VЋь@ми{я}К`j~_f•>zАѓ™qWPЖ“cЗзыŽЕНЇ ЖЋUєŒ<‡l#3ыщ:. §3§%ЧEљ2N‘&5 Fг)ЗУЧч ђНBBд)‘Ђ?qЉ=;ь2І2Љ Œyв$“k§Ц0Щk€а‘–—TZц^ЪRЄ,ЇЇЖв!БdКЂŠдъйKjь›дуХWŸ?4]А“Еw“ўє[f1IZЭZ-{^}Аё‚њy м-@Њо‚пъ0Ј@[ЙнЊ“jqЉП4н:oИўxvRв•ЧŠљ!Х†эЌwИўЕиЂT5s=.#вЈдV[y—ЄКЫ‹*х8^ žbGRM‡­А F\i2пJ(HRЎ-~ўg>9Qрeјдњ|$,Іzдїц<lв’nTUk=vиэвкЈ|5ІвcЗ"~`n%^CIuqRШ_,*њFчяuoХ(Влњ‡˜чУFt3ъam№ЛJ–ї•8•Сo+н  Lls‘ЗКRgFžMo4УšД+š”јSОз?Ж<vwё>R%$\Й#š=56бЗиуж|ќ"•ТZх=OЖьвA+*œ%CM‡`<НЮ>ч}№R€вѕйБ=јd\}РטттП‰ДуЪN'u§UУЊ 6ђK> Ю†6$™IŽњœK_Љ6ЖУОЬЧдЬщ/М9ш]›_M’|Лc–c<фi >ЪŠ]mAhPьAИ8pх&Fp^ДДБ*і'IхИ<ћиу ч&sŒSЎ …(Љ6мoŠмЛЉщktЃ–З“Ь�іœDfЛHš\јU2ѓGФЖиREќРטЈ’gƒs”Т†ŸЬщ‚"Ш… Иэ#˜:‘kѕп|TФ‘Zš&Ы V­*ЦˆєшŠ}”FSЉuNуКМJk{_јb[tŠ4‡xАВћ пZЏЈŒhЉП*БШTD!ЈЉ№•Јь}БъD_Ђ˜Ў!>Д„щ@ЕБ)?NЄˆXAО ~\E˜ЗЊЩBЂF}Е|МУЖМ>—HМэ*u‹”žиГ†тІ4уђжуp[BR›\т‘жО:я5H]–ž Ÿ,1P)iЭ ‘ІЩеыч‚)ЌДлѕv[[ƒрљ@Ё#ПЅќёцД•Ыmі„2л”›~еЖЦкt4ЗNmч@x’ЄмєЦЧрќR[ЙтдВž—Ж!ж-=іœfw0‰"ъLѓ<њ}p‘ —ЉёцEiИвu?|ŽЇЬ<–'5XršъƒŠY 2сMДЄоїѕІ9C.ЪŒ№—%mqPRо‹ъ;wиЅWЖJ–љŽhsˆ5jvd;M“ Ъcю‰I(6яqЇеXTќЩM\l­PhЊќзЃ>�S‹� Ђћпolul7˜S ˜оЂсMˆHНЦљЈГMЌВІВ:[NЈŽгкJu›эЉ!$Ѕ@Плг{‚ёЕ֘oд225оg]:‚5Z—\Ї{ œЏd Aѓ˜щзКGб'Ђ‘H™6BC ЁJmВ,TэьЎџ�LДуt>ВгыаљŠмd‹nVъвђ€ѕ ѓŒf0Њўc‹”ш№9nЮЉ .ЦRŠдб;h* nЃcгo<<—–ЎF\ˆЩчEЫ‹)†ЃИ“&ХNКSўbоŸAnиЗНЎgAžыЋsRГ‹iж –�1І:#Шg%!œтˆяV H-%>-хіеnИHgIАш<LaзЉЌЎ(K‰aДщ ИЕРщ{џ� 9„Јs[ ыSŽ-АЂкEдт•€ќй’VЏR>!Зоy+,О;6дШмщ лЯ BдLLН™ƒ0!ЊkOХqЄЌТBг~оG�Uj\†хMnmAЩ:†rWŽ2ƒ‰#X;”zX“киfUIЂF”Е6"6>Vк)жž‚щ1/.акЋЕ=ЩRДЬ„†–гЉй7QВˆ=в ќіТ•fаx­аиЉхsО–Л”ѕщпгTЬйy—щlЪЪъ\–VЎDЅЇBR7ОжщkŽЛљт$КQЇ"UІЬ\d$КЄК�V”‹лQ?)Х%I™”ЉoSZSœЂя-фЕнh6nЄoямЧVЉР‹”dЙ=Чп’„(КВЅѕ|Кzоћћчey6ЖЁЮ!рїgCщщˆX­8YАЈц_‘[E2с0 Aœ‰Di:ІOєPИ%6TУЅЧЂКс$ѕ[ъвК5І џ�ЃюYE;'šУŒ–хд‡0‰-\”§Щ'киБЇх8•‘+ЩbєКSi~rR­œ’SЅ _ИButю7ы‹ЌсхQЬ)"q– d”m>и№/Ј*@uќ,ёIю!WЊQјƒGKЬЮј'œвЄы"ъИJH�эзѕУЮ `W)R ЪX €—арлqвјCжЅЧ›˜)О5MКг…тё^ДiPяНШpгЫ™nЅ&тЕ5%Рт‘k6А$иЭ]­хbAJšЮS)Ш›  УЏхс9З"„ЛЫBдізWЊC'џ�r&wЊФЄДe4мКcn-–TЗд€Ѓe)WмZУЇlgLИ3SЊABnёиоо4›ЇягыŽ}Ыэдђўec.UCiІ) ъl5нiБђ*6ї6=-Ž­Ї‡Ф,]OьЬšШяѓЂкЇlђгV›‰‘ЄЬFAhлpQї3Ъщй^Ї1ѕ*TWRТиЗ�љїРОUŒЊWmMнчfТлЉo<V�ѕв:`cŠaъždЁхж(uРє†šPпaяkэцF”њj•R@(KЈkLљжљ•boд'џ�цЧЎ95\к-цЕ€•ы†|8Ї№ђ›QSЅљђ–ЅЎC‰Ж–ХєЃиu>gй– ъ8ƒBuЪ›Ў0рYцДl‘Ћo/nј1Юѓ%ЦЬŒЁЇнlЉmВnлЃЂ’F‡Mw4вЄˆЮЦuЇ—Y:qЙ­Šаaй”='1eъn|ЩkЇTж\nB5!р•ЁCЂРѓЎŽBFUЎ3—ЊTиЯЅ†ИOiЧДи%^‡ТВ{СЕJЅёЪqtљЅiZt6–M–=�ЦЎ%фњЕC*Ф­Р} ц dE­ЪаQH№›ЋЈУцъ:жlІЧј5 ~5"й‰СZ|BХЗєN>Јњs‰к{$оaІˆYЈУ☹ќХЅiGˆЇЫИ�њ^нБФко^Єф9LRaЕ\ІL@ЪMШ *7оіХ<ЧЮNЎ)C)X>5ЊСDw і>^˜мЫХF\‚„>Јo„Лћ‹pUь‘А?SŽї.є…gCУDާоVЇ уU.(RАp2ЦЩ3эˆєдўSiЈЋЅ№ВMBJŸvЃ"PЕ8” €ЬЌ:*škФкœB”@РlEŸ˜"Ь.„PВыœˆзMЬ™$]n[ЙОїѕ8ЉV№щR YPкіш|Бфъѓ=Рѓ§.ШKЗљŽqJŠй[eЅЅHrщ2§vПп ЈбФdЖ„ЄtQ­о^kR€“wPхљŠRєЋPИ�{0dV&ɘcSр†Ъ@\’Ёroа,MгюPоŸ… *Nk Rs ;рыЌЖфrДщ*:T й*ъ/kvО<dSДжЉ?†І;Ђ;Œ/RДizm{,6ѓ<+”yє~bD‡˜VЏ ‘`ЏpwхJ}1qPуВІ!QY JиRд\uiYщлУ}ПяŽЗщъ"Їжїс‡э#˜D?%›ўRп†–VИ’йа œъvлЊЅт5AКЭ.TД”дфШJ J�ynї [мrœЭ+†ЙfШqХ8њPх AњЅ8\e‰Ю\LašwфRс<P%-$ ЉЭїАБPЙь ёП5'2fЂ† јhiф vHш�їТ№г}ќ8hЯэўеn+SЌѓR“ cQд{Ѕж3ŒЦ5pэN пOC@тŠ=-cў˜x-™ЏHГ ›+Ё>CуKах5&2Ыo4 Д(uaЩAт:u<71 4 }$žщ#зБС\G*QфГЬзr ]зХJbЪЙiŠmuЛ}ЯгLЉq o[„^Ъщы‹Hђпj)ьё-Т‘ы{рŠ*a|=P9(Љцt ^щ*ѓФљЉŸ!qeВЂУIлlTЋ3в]RсЗVгФt*чгbJ‚”!$%)VЪqFфр‹Тп.гкp5Є2ВЅwWž,šфšqmч[AОж;œA*f kmчб%…м”wР}LI…%2#HqQК@7Ађџ�ОœtЗќ4З)Н/щ!$Ц7ЪЉ"55 †ЪœMЕ"і$р‡!ЪŠЖ9…IMЮЇ>Sлlˆoy8‚рНХћћт!ŠrYŸ[ŒЫ(хЅm8уŽЪыз j 5Tкz˜жЗPтЏe,žЛ№І–У”Z2jкV™mО…Gek A<вUњy`ћ*f'Њ !E T†KЌ$+^€�ЖЂ:\žž˜дК{~šŠjђbвiЩmФ—)(MЎIїЧ<qo3Srн УвWWIEќрJT:-@ZУЏђЖ™У5PиЪNЬЬгŽZqIJIќХ-7$u'лЫ“В\О(ч е‡фДлХr%<Н›l”(ѕUМЛœ,цƒK‰ƒ*тЃ˜AaЪ(р5D 5s=O rЁ#T*p?;;В–=@'‘ŸIќ +ј4џ�Yx‹%N“uuыЙћaԘ5lг”˜›УW/К[neў}7xжцћu6щ‰<%у%,виІW-ЪФ‡4:Ђ6u]ˆЗ№Х*г5šN§:|ўъ Т8Ьє1—3тQ[)ЇМ­IMўD‚Hџ� яыПž*ъ•y(ЉCK’CШ(y$сX(ИЗpT0g+7S%I‹{hf4Єr^™ЎрЇИ7РnaІ*.Л3[RYXKэ‹iх:‚-§MŽ3Q{ 6 ЪƒйYЅЩгVлmхTXB5Тyzt+Ї3ЅШъpq12­›W’Tь•ўsЖ>%Ќ`:bƒ'ЛїпЏВžlЉŒžRV›)АинЛџ�šчыŠо,зсSi1Њеƒh„ІЦ˜ПДЕлЂG|`Ј WŠg R0%%8дф*^b’ќ ˜D4HаJўm)#Јѕэ< І%жИ™[[Эгџ�с9€ќЃђлЯNпІВіW­qg2ЫЉШYƒ—ЂЈ—e>ЃЪŽеўDљЊн†yŠ+™п'9Iс|шБса\Ome2eмЉлэтИM‡SПMЕtЎяZ›(#љžхgЏpkrˆ€б ЉУ‰C[АЄi2Е?5Х|ЦBьl=…‡г™’žеA…ВP—гЈ)M‡4ѕŽ9{‡ќ`—Daft:$6В ъM•ЋИXъУУ Lr­=HвPф%…оJ‚ƒЫ==чŽ}JЎ5AXœ(9Ђ—O…"5RU;т 2ШRиQгЄtП\eзPKQЂМ#ШkPвЋ6иэtžўит І™ЄЭ)r#‰YmЦгnbІ›ž„_ЈСAЎŠФtЉЖк”hqОщpя`OНўИV$в˜AЊЗEVѕЇcВыh… жPиЈіО|y‘ +г—5‰KMEеЉ1’ƒ}dюI@oіѓФŽ&ё>K6Ц*3ЪіmЅIUџ�Д=ˆђы…~TЪ5О$K9Ѓ<ЮTЕкЄ:4ѓ?Лe=§џ�Ž-F˜ЃѕЬЯљI;+žS Š—3rKшpGІЖНе"BЖИэЕ‡ŸN˜sdЯ а+гцјцКрyjWBOSыoх…e}-qZф ‘SN4u„SЉ�ђУЈNф…пч$<эзШv›Хкц_Šў_ЮДщ.Мк’…•~[Љ�ю“Б6О§ёbпCЕ1ŽЪ&LNЅБ^vVKšЫCXИЖ }0#›ІАЌЫ‰Rу% ’YlйjКHё|hЩмQЃVкчGЊ0‰r Е ѕ˜эЇЙЩЗ_QŠ$цјыБ1!NSщtШqд›ЅВв§`>ЇЂЧ5аtй Ћ“MЈеiѕHИЩ!е xŽнн/ќ1ЅкѓА'д˜’гЮОјЛ „•#n˜Ёё;%УјЩЏе›‚њд †CœЮiгћ!=МˆТП5ёЙзgJFH‡!Il4dHQZ“bl[OmЖ*(—8‡dwїS+*MezФsNДiђЃ9Ђ–WаэиzyƒгxgMNDЪ*Ьѕ‡Х~М~œU‹M,йO-W z\тЃ+хf˜yyЯŠr”ДЭj ЋќйK5ўъ6щп ХЌЉTN1Х–мŠЏсy…Ї  Ѕђ”� hЇіFТЪэвнЮэjѕ*ЕЌyпžЋ*щц4uO ЊЉ№2mˆюЊ+­/K|zQоўЄ›§q4Р­е(P$†ЄЂЄгЈ DwRЄ‚ 6;tО9еъžyсыb‹™ Hz”—Нx’Є‚хК.,ђиd;ЦьЏUЫџ� –цRІА‚#›eQqзЯс…БЩœўViъŠПM6eIЉKgтдАU i(*лЅИСžOSq!Э‘S[ПлС.КS}CіmnЂжТ1ёR•S ЇjR \жпSW0К ХЏл1ПЄUИ6э> ь„xJXJRлžЖ$§pЌЧЙА€„{]Ћ4ЬЬь9_ждЄ)ЗRnJUаzoŽIЭrdХЋЫІ2щўВШ-*тзЗAмЕќњзЊйЏ‰љ™Ч2Х\VœHIJ@А'ФЅl_Їž,ргђї TњЌˆ•миGф4UћпуWЏ@G|n[н>ж›щгџ�о'Ў? K‰o.г>гќЏГ8KУз)ъRкЪЪXЭ›йѕшUь‘ч„r”TЂЅTMЩ=ёg™+“3 ]њ…Eе8ћЊ*77ЕЭёWŒMl ъЈГŒЦbШГŒЦ`Šе9†Ў—Zsё%M #RЩ�{ИзS­дЊŸёѓ_y=UdњFиЎЦ`‹0{УЉЭЂ ЈЊгЭц‡Ѓе6ЗOCќpБd;єМТЪOB0Dђ…<ОbС ?о)6лдг"‡.япцB›+§0‰c7жй@Bf’б*BOђФЁžыРXJ@‡);`‰й5ЖВь'1бНW‡шGOЎ+dV3ФXƒ—П„TЅ”k ~{{сRЋд*nk-з‘VУиtљЏQ‡џ� >S_фuC‰ЩVg‰љŒE[єIБлi?”†kЬMюl ЗлшqИЕ@ˆьЎХЇАњдсvJй MэsЈс,МЭ[]Ееf›yМqњЕB@Ггd,wУО*ZN ”к{-ej\ѕдј›Zz—Э\8qK$м‚ГАњ_мBтМЊьQ2ьdQrу;7ІуЅдGSъpБ;›žИљ‡ ™9IDY+9VВeQ3ЈSТяуnїBЧ‘8ЌU2o_\@ЪЙ•doxЎџ�1tї|АЅЦbK<лЈ”ъ/ё2 VZƒSbГ’гЭ8лф[Ї_ауэHё75ВUUaIaФЄшч"*IwŸЏa„Ы2gћœoќЊ#еTžЄщTй$zКЏѕТ7!бИOŽNd‡ ­Z†КЃ*Б"ЧЁ$mlT~C5Й™ћ2ЊАЖњC„ђœR‡‘Z…’=АДvT‡E}е%,œiТ2sїІWЉЭQ(Q“FЫЌ -У`и(yЈѕ'дрƒZЈPj-ЮЄЩr<„… кўјЎЦ` "mU3ІZт чSkh5h- Лџ�дMьЏ~ОИ-VЉeg&ч(.ФYПхLTeU![_иœ+qєtР4W§˜Э2ЬvъгшђУCCj›Rц%Дњ�ЋЖ<Ї)O‚•—ѓЭ6žТЭжˆђ_PћПп нjЕЕ*ојјwы‰„Lшф<Њљ“!of™щ:’‡[`+Ь€nЏЉХ>~тMs9)-Ku1щэ -DŽ46„і�иЦb9DЪ)fI%2!>у'ЂаЋ2ZтŸуPZƒžщQЋ6(р)}#бСтТЛ‰ Q0eRђФ`VЊTѕЫO4—РіW„љuђЭ*–ЌМощBїZDTƒЊїР3L?‚сфнйеz…ЏсHC@љn5ck|@B24U'хђCЎпЮъкўЩ[у0„V•кѕJЛ)R*’œ}j%^%/Šд-MЌ) )PмlF<у1(Œш|HЬt–tЬ2"t,>ˆ#ќЊ~˜’Мл—Ї+UW*УSŠUдИХLŸ_”њ`ˆ„LжВ+V[yqе(‘Щ+P#ЫЖ=GЮє:xWсЙ^VMТžТ=Е?L/1˜"5Ўq&НSdАлщ‰Ї)„„'ьщ€з]qч нZ–ГеJ7'1˜"Ьf3‰Eџй����������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/lieber.gif������������������������������������0000664�0001750�0001750�00000020073�10513222764�023661� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aƒ{ї�� ‡E Ќ6eЇžћ§ћљ …[ЄБ]њ[Z]\ќ[­[ ќ[`_`ІІћ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,����ƒ{�џ� HА Сƒ*\ШАЁУ‡#JœHБЂХ‹3jмШБЃЧ CŠIВЄЩ“(SЊ\ЩВЅЫ—0cЪœIГІЭ›$ шЄЈѓСž8ƒ JД(€ЃG}&р€ ЄL>EкДЈеЋXГ†<J �ЈП‚ѕ іЉЯЏUЭj]ЫЖ­[„�К ќЊдiмБO FЭ;pьлП€лќZаЏРЊc§V @АуЧSж[ѕ`тЪd 0ŽЬЙГчŒ“ћb.\yѓцОPSЋ^ЭКЕызАcЫžMЛЖэлИsыоЭ{vШа SMp1fрН“+_ЮМЙѓчаЃћ \ѓшсС7>\јчярQNџeъ`ЊШИЋ“–к˜8пьzл‡ŸOŸ$Uдч™0?зрXБ:qEV\�ЦWпr4fG4^eъ1†”\ h`‚f‘XЃ5ш˜‡†(тOHљ'_` ŽЈЂ†bP~žИтŒѕЕј"Œ‚ЅHуŽпй—ŒщШуљјуcBЉф_Fу’PжЄ“9х•W!uЃeVК•$–`5aC_ЖUf˜hЪt™]šйfšpЖД&›HОч'ЭIч“xіЙ’ž{Vщч yuCgЎ•(ЁŒ^ЈC‹f)jвUjЉJФ!E“f‰i|—†њ\ІmЪщЇXuЊЊЊJjBSFџф*QЊЮZŸ­ЏЇЅEИŠЩъЊJіškЌ {S­П"hlІФ›,­П.ћ™Д„6ыlQл™Ж}Z{-ŸкY‰[ІчЂJуТJaИЙ:{ЎFмЦ„ьBщtЈЙыšДB —эГЏŽЙQМ0ЭЋPН}•/L Ы pІ:њАЏџв{]s=х€\ k\œЦrѕЛŸ‹хмUцњ[@К-vеЏЁы'ШOuE0šKŒэC‰"<zh•ДЁ“U^ЭŽЛ ЦфљЋqбуєгF }2бнЕЫІwньвМ„-v]>“esey‰ѕѓйьЭž\HЏмTУfЫНВ|Qћ‹Wch]џЈѕR0фЕœб6ЦРсˆ3 РaЈŸN5г-7Z:™,y͘7y€škn(… S^ЙуыeЮ™ўgс$ŽјтvЄАдGзЭ8эyS˜ЙTž]rьB :yОлžѕп\r яФ8œPйГЋŒЏh’OЯ8яиПчдмG>єТеЋ>ф‚#‰Ÿ’ѓAž…ћЙ]7ћsЋМћѕ}{ЕБнqGЗПэ‡Я<œІЪЯЮиu0е<`xP‰_ЖРЫЁэ‡IЭѕVuŸMЕfўCžЎЬg>” я ОЋнЪЖwПУ<@„М+сгКІ…эcœ Qx4нцaђG:XЈŠ‰‡"всџqX“вˆ,к•Ihж§ˆPbG˜X>'‰Š’тЁ8#Ю‹єбт(q>J<еdE3ЎqGЈЋ"%Ў{IІ\MЬUхЎ2‚аŽ'йъ8–œQpmќ#УЄзCˆвo,X" R6ћ}юv—ŒйКZ–2єМ ,#+!ЭЩЋHŠh%9ЄGМИ=ЭCKѓPаЪBМЁНВ+T“каШ3ФFЁ2•Іќы*GLьй BшЩпњЊв0юoё“ЫомзKB§˜s\Hƒ РЭn ќI€’‰Ь�-l.ЁМ›Ьжf4b’n•СLP�%™M…lг›мgььEџrтЋz dJYЦsЕЋ…0š№д<щйG:ZŒ’ќѓчк$зМp/fќ‰ЮЉГnЅQ^ё„ЄŸwΘlŸ Ѕ~"ъ9ŽНsUн3оРB:16RP<—/( z!АD\SjЈР ’Вk4MoŠЂI3„S.1!Ъmc1МЊю27CDоiЉL +UЄJЗ€5ЌArъŠЪЪ–ГЂѕ-c[•ЁЬuy#ucšFБ†j3Љp,dЎ)Ьz.X‚‘ђhrздЉ•Ќ‰mъbYlц”^Ћ лЛ™‘ёv!ћ:ь•>‹’Б)ЅБHЭ+‰'B@Vr"O+^ъ8ŠЃ%џ‘6Ў;N HRи"ЏН@MЅлт6qКmЊj)yЈ~)…|Зй з9ЪU2Ћ1фЄЙJGдоdЁ59œТV[Б>6œКТeгвB4YжђjМф'1)AЦжiMSopЅ$№†Wq74ь‘цZЯжU‹ KйAjђ35 Nз z7™rЉПЕЩФ`ПкГ1БˆА€Bѕ}\йъ? 4:sІЯEcГ‹Œ ЗЬœхЈ~л‘[K{8тŽЄr Э96пГkФ".ё>гkЩРљдqЕА1УђŸ~vnЃ’v…Вaј8$ž}ёšxъ!е0шМKž^Ш<іdЫџЧСŠOњх�ђ*э8R6ђŒvœыžЃkVп3пћЭШ9vшС•вв\™№Ыsšё•ЛŸQи,У§ѓˆјмg�kz‡ ’і„cв7Хuвu3№Tе<TIИЎ`Y_Ће‰СG~YE[J—a—hŽTЧ0мљЅЫvъзVu~‡!Ё гwаЙUU†KсVщ]—фZз=ОuG~н!эЌЇ;M“бЉCTmТс']О0uФнm]Й[*Ѕ;ѓrПXйЁз%~ўДFИ§maV'З†Ъ.[%пН.Лћ<сЂНbНqн”(ртЯИЦ1ž€Ž{ їxЧ“ЛЪPC; џŸr…Ы›х'ŠЈт(Q€ыf>sрѓцн$9C 0јќУуW,McњŽd'eљ‡"˜ŸDцŠлИд`ѓoŠќъзЙB~^�Ÿ{Н€… ЭуM"Оj=тzЭгљeкЖЗ}Ш€мс>ф|^ж!\я:ЯѕЎDЇGvрCˆп!ў#Q~9\vћишЮјB'РфNљЪ[žђUЧЙц7Џљy#$я\Я;CУuјвѓ&(]ІљсРљжЛўѕАНь @[u7$є{ч;5“дЋžѕГО№Н™€ШŸРпК§оAŸћбѓО%]VќЙy|ЧЇИњия"ЋpпѓцП„рJЗџрЙЉ)ГsFU^чОіŸџё‡…ќЙіљ“ѕuxпљьW д’�ј;Dўѓ'`љGWvїцчр—|иiМfШ�И-П’~x„г€+Q€˜unˆw˜~ыЇ˜ј<ї"zЭ3q Ш‘‚Ћ5Y!Ј|аb‚'ˆ4ј`ПEс‚Чƒ(ƒбƒьaƒ@„HY:ˆFX�HЈN?Ј€є7‚M8HOhQˆ„kw+л‡…B˜[Hб7~пTƒU8-a˜ƒe8юїўЗAkШ†Lш†oq(;sШ@uh‡"ˆ‡yј{X}8‚~YИ{ƒ…џ˜sˆˆ‰†bX‚ш8ў'‰“Ш„•Шˆ—и™ш№Ч‰шaЁxЃH�фgŠЇˆƒіF„ьЗŠмDPpд†Б˜ŠЂ˜mяg� (WИhWВј|ћ‡§ч‹ 8pИˆ Ѕ‹б…мЄ„­B‰Xh‰Юˆаh�Ј,д8‚жxa„0…%€рј2јфŒцxŽ СSБŽЇDDЬшAУШ{И ђHnЫX шށpфГЪш‰ој�љf*™!-И|щ„ žж"3˜†LˆКЗ‘ј7‘q†кХŠДg[ИШ|щ‘ ‘n[&’ЇŒъзŒ( ]–k,I’whџљ1™’‡c~5™‘y'Й“ќв“Єє“.w“z7†dH”<Щ�G…”зŽNY�p8x$•iЗ[U™> Р‹rh�-Йb(”:й•vё•^††cЙueI‚g‰–ъЄ–Ав‡[Љ\r)c�њ”x™—Tи:žv щє8”D ]|й–"ш0)—ǘ6й˜—;9O’щ—d™“L)Rhi‘‘™I ‹&i™ymЂ9•A™{Љ x%ђ—šwə퇓ˆ �(›ЗЈ”/й‘ €Л††}9šЄiЗ ŽH‹b٘АИ”ѕh—љ‹3–|Иœ“Щ•)гЙ–НX\ї8F(9Дџuqˆs—sЬi^сЙ‚лYžе‰žзљ—�љ…‘z–VчT9ˆєYŸдiˆжЉŸЈ˜Š§9КIœъщŽj ƒ 9ZпYMрИ  њ€ј  ѕїœа‰œьyЊš”™“І™‡ўU”  У™žД‰{YxBхGіЃBWUC/DЃggЂкiЪ&i›@ZvПЈ”"0DJxeшŠўЩaщЃ%ЩšM8MoЖ`)Чd2ѕšЂЄKZ—šЁ;GЂcјkљтiгфѕo ІtIКЃ(ЪЅNz“Ѕљf gюіJlXŠ ZJХhžvŸ_Њ{LЩo(—ŸsRxЁ4ВЇЁџ™ЂˆЁ^њЅ•)Ї…JЇц2tvaЉЧ_:j!Ђ"j‹HЈhZЅ—šЈ(žсшЈЙЂ,Њp…1ІTeІrJІЇЈ*BЁ ЊГ9Eh$S�tЦЉtЌУЊІ ЈЋ œНшЊ€КsнЗˆ 8Yе^эС!Bg­њ6€ЪКЌџ ‰]ЉДщœЃЪWРсt€Вvyњнъ­LZ8у’$ъ›љзЎюъІoЊ‘‚ЪЁ–e‚іzЏl™ЏХY›%Š<џЊМкЋ ё’­ЉF&xЂ‘АЛЙšћ˜љšЯШЊGЉтъ–ЪЏ§Ъ~ŒњŽ+…ћЊлsE„ЋaФІiЁъЌЯXыВџq†НX{Ёš М7В1uю)XїЇВ�F{ДH›ДF›Ѓ8љ– лЁфГс{4Ў7"€dZЋЕLKЎeyœŒ"ЕuЊЧkЧˆO2K АЕlKb]ЋыњЊšQиЊ4bJvwи™+‹uЛБi‹!xы0В|Є5}{8ЫЅ:›E!жИлz_[А~’ИŠћ­№Кg!Ц€›щ˜K*–{}ЪD›!k�œы–@њДP КБ%kЗ32И„KБAJЏ•ћКСЌ\И BЛž'Й`jИфКвЃЎ‹КЙЉЛАPzЛпЧВ‚БЊˆЙ�КМЈлМŸїМНЬЂЛЋџ ГъЛМС+МM[ŸыQžъkВф{ цЋЗЭ —” &b[�S—q ‡�X7Д'ћJ;РI;ПМЕНЉ"НfeГ AЕ3|Бз#m;СйЋНЫКоы'љыРЎСАПoAСm›ЗЕыМа;„ЬР uxtŒ ЇћТЉхБN ЖQЄТ(*ОЄРŽыЖK„)N‹С!‹ ћ‹qA|џ›ФIмПJ ŸAРPХR<ХT\ХV|К<ФЊ›‹ТС‰уСУЦ­'d"\Цf|ЦhœЦl+УŽЅ”}• ^Œ8™'ЦtŒsЎšЕjœЧzМЧgLТZLГ]lНSКaРЄЗŠ– Ѓџ{Ё2KШ…ьУZƒШ-— F(’ЮъШьЧ„ДŸœQЩŠЩТХМ#ЩK‡!žЎ ЪYм.ЄŒvb„ЧјfЧKЇЋA­L%b„HН*aШ‡ќ0і{ПЁЫšПсЫŽ4f)ЬЬЊ–Pl\ШьKЯ"zBœGpŒ•нY!бœЂ<ЪvrтlУœ‘‰,iЬЧМ—(ъЫ‘з|И’‰љ„Ю1Эд,ЉPЬИћђэKіЬ(“ЂОњМЯŸбЯШиЭ'аждТШяЊ‰ xЌаpт*ЭЬёˆ"9Ы*ЁЮы 0СЙЬЊЧИ§ЭрЌ|жќЮи\в0;ŽЅ;Еџвјь‚эLвЏœЂъШУ3Са =Ўаыв[ЁР\и ёшг2дƒТЮAМ­[љІJLэ'ьм|D§VссgYе0qе}В(Ыќ‚І `D}CQбЯ)#-‘ё,^ Љ•ƒЁв+= }8!9г2в6зžбeцЪз1сзЖlдqЫ!ивS˜,!жcиЇ’ЭP™/ŽН'Š­mсA�jЙ%—нЫ|иœ<Н�@—уK™}'›Йѓ'�џљЬCБкqвкHSСt]†Mк€§ Ђл„Э0v}з{лф#мсZзЋŒ<ЖЌР8ЫCQгm-йём`Wк)џAлЕн,0зн`§р}бт]ТœsМ+ЛB‘о{•TVѕПЃl$dЃаЭ$ЖіˆођЏ"СSчtЄdVЄэЋнВ|…(’}lЭ~ІУЯЌu6~5Ѕ\$|EЕV;м-d88СВšЉ№"QЁЗнVfчсэФМ-тљGт WЈ,NNЖитZqm,|ІрТЁe1ќрšOЄ —ЪOн1hвЃрБщЈџНаЃ]уH~уЅZСšт™КпY‘›R~о.рс§XЎф›Zт$ТуVœк  F^о€6Ћ їuѕp^ю)8жр nmХ}нчёЋkўoТ‘"џcлs+КџIнBaнtRг JЅn>[Пƒ­ Оо Q ц Тc^хVўcцz" rZЊA_†r#›Н ŸЎкЂ.сœNПkБ ‹+бqюЭыG^к6AЁ~Ом3омЃўлAЁЋ‹фощО>ЪњъГыВўь1б­впд.шЦЮлЏЛqX РМ~SќИOЈрq‹Б—Ksg‹OФ]Ц[ˆюГЮЭKs  y fЌЩ#>я~$’ШТсТ5Ур(яmОЃяНУљndnмђIбlšьŽNг~‰ПжCЖ‡3Чœз№ХiЬяЁ˜ё-Бq„ЩMў›�§лПА7�pХ2џoД| &ПT ЦВW|t'ђ|\Ц €}C~№ўžШ8пСТW| сѓ??Т€i{Пƒ№A}џєДžVј6˜vчШWѕџШ,‘oљ„Щ_і“ѕЧЅ ОџwёhяUнNˆМиі( +pїрyм&с~}ї бьz_джЎd_‹qіƒѕ<Ћ~&лЁј‹якp ƒСљSŽ’?љ{žР,Ё’GБьoOьœ/Ёj_3‰ЂпН]њ{њ$uЊПњ !јЎ?S… �\‘љVПэЗпQ|O€ЛОo›яњ7\p2Ч_Щ_њЫoWЩ�lOћ •їСŸиEџŸі&с�АЭЏЖП§3<ќ ё‡ђ §вп§^OёйИОmцnўЏпјrс?уŸ�Б @€ D˜PсB† >„QтDŠ-^|��FŽjєбЦ ((HР€!\рRцLš5mоДчN†:yŽр@Iƒ* д$0чRІM6ѕљtgд›4:(`eС•-iТ”VьXВ Љ–uy–Іе’&MXз+ЧuыЦD›Wяо™jљцмˆг*�nM&ˆЛвЃ@Лuџ>†ЙЁ_Щ){мVСƒF�э&hв•MŸц{ЕBе8@4Ѕџb—I ЎЦ{lkнxW|M@ЋСЎ2СіFžќцямЬ%`ђСljДЎ\ћіŽЮW{<ыIт,РЫ]§њˆрOЛg8ИАa‰ЭOdмиnzі§§„ЏВ�r љL >ћ&" ?§ћ/ТџŒЬНшР> ћ,?дoвF MBйЃ2 мpУь@„Лg<1ХЧмгЊ+�јŒФѓ1Hi$RBџяBИVКЊ!лј+2J) :2ЕР&КаЈ&‚pJ/ЃЌr/№†b�1‚rˆБ/з,2LНРЫq%Ќ:ŽM;МХ<!RВИ4•К3а їTЯЛ џ NєeTЯA)bё>EЁlДвомЬЫЛHчbHMK?ESДœЛPСьИ\TUqЕ,ц„3)Ў‡К\ЕV хю7ц3ѕЯлlЖB\Зу€Ж2””Ё:ƒeVЬaЕуЭЗd]hkim6[WŸUЎЕи0Œыд—гЖмQЙMЮ/ж-�wW`�kч7DsяЋUВдКйИˆёW|–Jпнp–У)%Иaž Ю—а~WЪЮS‡/онриIŽХ-€€й}#”L? Xc—2ј5N.�Ј ВйЇœї<kSƒZ~9шЉ4ц((ыJNШЊь”€ЅnњiqџЉ*5Q‹…Ц'}™N ъƒ:Цy#А Љц9ЩЮS'“…{зМkS5ЭфѕJфŽюэJмšчГЉмл*пњоЭЂвоШЊ~ЕСд[Мnˆ™j<o„7ˆђІџ>ШoЫ§ЎМpтQDХ_ЊёЛIчiАЮ$poЬНыи/я\#§тwGнwчНwп>xс‡'ОxуG>yх—gОљцг{rРgз|њЎ5B<€œчО{яП?|ёЧ'џxш'yѓРЇW?sаи^HљчЇП~ћхъ~§їч~ жю_�XПџ а€$QэVЪ•diУ чјFЛ *dЪЙ`r2ˆœџ іІƒ4 ЧB˜’9 †c3kZPђ—Тz-k/ќ’xdGТЋœJd5,JaИCіа‡?b…8D"бˆGД‰Э\Ї—Ђа‚;:[)'3дeŠ ‘тЉxЗDž<Рf4K!хzAо•Х‹;cхњТr‘,&4нзŒ6B”™ŒŽ‘TиHЧƒ< †:ё#�?X?M-љЃЃ 6’!eЬd™ŽYˆЦЊ(NВ)œ]/‡IZ.,S$&б„ЩАˆr‰ $аœ<љF((–< )WЙ/ыСЎuI ЬнИYКЎ}~YЕVЫVЮuќ›w bv 4А4M/SгLi"џЄcVЩ™0‘Н[ТngаєHћЌ(=єSwкœJ3Ч97nО‰šэtfгЮ†LШС“zыгт2јNr†mpѓЇLФљDіTгыДЅ1­˜ЦYVХžE(S JAMњF˜ ]ЪD#zК~4ЁХд$зЬЂЯ™ДЂЄiFљйЭšЁ ЃSчGOgCц…žc+ˆiš‘хАЃKбЉA‚*GЂк Ѕ;Й)ЁjъBOњ’Є7Ij|*Ѓ…ŒžyСfзN ЕЂ-!…єчSPие–MŒЬщKЗiж­ZчŒ�Jп•Ўњ”ЌЪSЊ§Ё":ѕЈЛГ Ўh ЃюЎиЇќе‰мYиЛзХЦnwџ4Хх9Ы’иŠRtnƒ$KgŒ*Ўвф4HBэЌXB[€ЮєqД!;-]7ыО“1ЕcэѕŠDкжжЖЗХmnuЛ[оіжЗПnp…@Р%ХНrЂм0w'Юю” ‹‘щFЄК ЙЎEВ;“эF—Yнex ^ыw)фѕюЊа‹ёЎз!юMЎyг›фЗКі•oAъk_§ђЗПйяtёымэ8ПЪ №‹_ьИ!аe0€ѓ+сƒD˜ТѓЅЏl` ;˜Уу•Џ†C,т 7XУ&q? т/„Й)ОЏyS b gxФ#Ў№;ŒbЋјП9.1{'ќbyЧ>Іџ1]ŒуC˜Щ?NrЩтd(ѓXЩ?6ђ•фї2™ЪQЎВУ[ф-ƒ9Щ&Г”Ї<ф4+™Р †ђ—sь_3+ФСXfs˜бLч2‹8ЫQіs›е–/ЃЙЪoŽsžU|ч:w˜бVДœgмg?7љЦ-†я щ ŸЮVжs‘џ|] gЙаœў3Ѕ—ЛрO/Yгb9ЕЊƒ i.гњЪЄVДЇХlf[sйЭо2ЂЧќjBчZи`vЊu}фF#лдЃцєœ‡}h'wњЭ‚&6S$нbgџКжЂ^1ЎЙ щpЃzХef1Ѓ™эшR;л8‘ѓЂwMэDЯћЮН6Б­ima^_лпцs… ЧЬчLПЛ\7xТЫЋp†зс ‡јМ#>qŠWмт �;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/lesionsum.jpg���������������������������������0000664�0001750�0001750�00000055525�10506733766�024475� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џиџр�JFIF������џл�C�    $.' ",#(7),01444'9=82<.342џл�C  2!!22222222222222222222222222222222222222222222222222џР��й‹"�џФ��������������џФ�E��!1AQa"q2‘ЁС#BRБб3с№$Cbr‚4c’ВёЂТTђџФ�������������џФ�7� �����!1AQaq‘ЁБб2С№"#сёB$Rbr‚џк� ��?�чњ•*QЉRЅJ•*Тйevt"+@œo<'ќў”E_[PэГn )‰ЧqдЄp>g Ї.’№*\Т‡юI,ЗС&BHќд§Hs5П Д0›ДЖЅШ@јX-Yƒiр}"DZќ7Н\ёБ“­6ЇH?AЮ‹­ўоЄ€]eєћИД7љrjъууќЧRЈš_OГЧ$( {эHќiy|ёCZ\н-ЩП8”uй„Є˜ўєDЦG€+mOЊ*нNKPЧрšС7РРФUHmQl хЉŠШМІ”‘nNм^)Л^Їњђъ•ŸФжEID|W™ћЩРJTCDL/џ�]dЧ"4щmC)!іеŸ–qšМxYЈ-.0Мъ6QŸ‘фЦГк|LжZyHP8[ќЌ‚=ЗФSеџ�ˆ ьВЂгэН_ ‘|\Єф~bˆг-ђр/dЈю4{n‘шkZК‘›З†ў?–д–`Щ_ТZZC*<wIјMjd%J~Ъ ћ%;Т™Ч?іЯ§Іˆ‘U*тыІ.ЖuЌIŒНЈ8Q�ф|СфU=J•*QЉWVM-uПО†сЦYJЮŠO?!д§)Гh№QЛt>§*$$$dЊs€_Ла}Nh‰) ЉŠл;ŽŸљS‘WАt-юqHLp‚OC•+№Їgсf˜Ž#ХeыьЄŽ<†Шo>™8N>AT5tџ�Фѓj™БYэіІ ЪIG˜М~IќЈŠъemЬ9xPШ"*БXн№“P4НŠ/ђ§‘gњV9О-kЋоюЅu€Ÿрa)kџ�ŠFзkФgцІ7Њх:ыu.,ЏѕJ† cŸсОЁЗŒНhњ­­ГљŠ™eИСцDGŸц#ђІuЏЧЭkRкЗм[ЮіЖ+џ�ащWэјБЂuT†bъ+–~rЉL+q ї)H8њ"AдЎ…ЙјeІ5UЙW 1w?Œ†ТвЛwіPЇдО^4ыФ9еЇСA хпщDBU+щ$‚#Ј5ђˆЅJ•(ŠTЏm2ыюйmKYш2h’еЂ.WP’…$ЋЃmЇzЯаtЂ!Š”ъВxq”Є-ш%ЖЮrЙnm#ўСЭG№^Щkˆ—.Vc`|JCHBAџ�ЉGš"ц-gјЯЕ|)RzЄ˜ЎŠ›eа\[g\FBvф<…ўIђлЇД ЬЉ зQ–чd—ў`fˆЙжЅtЌПDЦќи“­вZPЫjuЏМ?ъM�ъ?nVАЗ лm#%јЧЯkЄ}сѕЂ%EJГŸb›”‡™ёф˜ъ>ЕYDRЅJ”E*TЉDRЅJ”E*TЉDRЅJ)акJ^ЉН4Ы,)ЦвЁћћІˆЏ|;№ЖсЋп]G• $Ѕ№>ОП*w*f№ъиUХSэЇKЫGdї?$™Њ-oт$-lkOYиKЮВŽїTч}оЃ=}ztЄыЄ›ХФм&ИЉГнVѕp„ŽУ�іЂ#эaтхџ�PАБmyш–№­Њtоѓз#ќЭСЖKОJђэЌ9*Bџ�Х’№јAѕчЅ\шэцЊ–ь™N„Вк№R‘С>‚ž–--0Фf‚žЩOН)cјJшŒ—eL.9ŽR“„Šг™ S •НфГ„w+Q§kЄ X Œ­/Ї ‘РЊЛжˆaиlмтAЩAzˆЙЊEžLfZrTfLbp6 г5ЕЄєФЩђ• (C –їЙЯ=)‘zЖ6‰бЃ`ЪA”#ЁЕьфІ–ЎQфцˆˆп№В#ЖфЉѕКЇБЫ„w йўоэъZэЎ rUзщ]c§ Lp™ їЏ­[ЃШos~[ьЏюИк‚эСіЦзKo\ƒ&йqŽњЫбн%YQ}xЂ­т}ѓKIm*—!ј|6ШРф­9ЕEВЧ 2Ъёр`|CыI놕jZљR[tчi@ЦюxЯО+,TђЬ ЄйeŽ$А^Щ§Tшџ�рЁЇЬАPIJ$0@юžОМЇ њRЏФ/:ЏV‰V7‚‘ацОŽ)TЖgиn-<ЫЫaце–Є4Ђ0GЁ t…О&›ьGb_\@}ББќЄlu'јёиѕЯb9љт ƒbБlŠцітОьŸГЁЅЉьэйŽsM]с#ЗRЋеци„Ч.8чјiяŽz‘јQі бЖ]!ЊSЉeAvUќ‡[ŽFZWT’?‰#‘€FAю@U­ќQ›Ћ$}ЈV+,oƒxЕёХлФШ:v+№ДЉ/y?Лzєњ2€хуŸщэIЋхіяЈю*~хq‘pw<)Тp?щO@>UЛі+œШ\E~=А+>[i8>чћš,с•йзc/k ХXA Ъ€§M[, ”*2 _pžHќ(­ ЅьIu_ўn?!§щ„ЮœsKЎ#…П=MкЌj”Ё>iђтЁ9Стˆ‘гt‹іВћЖшђйIј–’>bЖ!iфъЗ%IЃGejУnьчп�S?Qп­ CсА€кAHю1Tо6ё…”–TIHџ�”š"^^|4ru=№А‘аœgёўє<ю—М4ЮфЖO]„‚iЯЋуIbц˜ъ$6IРѕХPЌ„Ј6NІІш0ЖTCж<‘}?<TНйтлy"њ%}ЗЫ‰ulП&U­yШyА~?LгwOјИ‡jЧЏYfuМќ,нйнш Бљ‘ЯЎjК~‰jљЇфL SnЖЕ`ѕ$Ёц–“ЃJДŸВLA[эWcўu=3т{›ЈзQѓ@шœсЈзN-oс+7пЖtђл™ ды${уяqЯ‘“эвmЯ–Є6R{ЦŒtfЛНhWš•хШЕ8ЌНJ%)=:v>єкМYєїŠњmWk MЗrJ7Л ў^љяјжКРЙЊˆ4ў•—z}ŸФДъЖЖœ­гш‘њеEП"§іGZ/ЙцљlЦ q_ѓz$w>еа4я„hнЎЫKїGЕ!yХcќ6‡№Єw?SиQN•№†пkЗ}ВјДEi#zк j}VГZЗ4^’qШњNнћNqš,ћ*њ}hѓЋnѕЩ2ѕTї­ЖfFшжшр1]ГžМw?LPCwхБf„”p•-;м4Do{ё'Ф щ?iК ,5ьŒŸ,Єеїџ�:^Oэe\ЄLXуzЩ$§Tjі.Žд7Ф§ЅФИАЃШ'ŸЮ­эК:W6\у8—:|g?хDBњ{OE8ЦehŒа\‡з№Їш:жНъЬЋСqZ_N2льЋсPњџ�J'ИAbг~іGYq[ь3ZіЛtKœ‡мœљYJR9Ю(‹œ“./–ЋЈ‘l”ЎкžSi<gБС:9ВxеЌь.†я 3z†‚œ�%`{-#ˆ5Y'Т†ЄDѓЁЪSk#) I Щ оДФ‡#К–“ЕcЊT= tEЊ‡ў*2S& рЇr› М9уюИ?Ѕ.uї„’,Ю.RшФќ2šN§щь}щ~в#нЅљіе˜вw %{F}AьsN_ |Z\ЉIыR‚т‡”ЬЗБ…ŸфsЗ=•јњб?Ь„ќЫ/ЃjК‚:(zƒZѕа>*xoои—"Ъ8ШЯйжzsќІгaПJЃШFеЇ№#д{QНJ•(ŠTЉRˆЅJ•(‹b 'ЎYˆТJœuA"КžЩdgУНмf6Іы%БНЮ…�ѕњўП*[x5bƒmJЕ]ч iЂ*TŸОПѕЭdёKUМмuэt‰sЪ‚yхЖњэЧDtпЋЕЗитІ|Тк9јAј•ѕўдвoУлMЎдпћЉ^с’ЕѕЁІgiшэонi+.Зё#ј“MИŽ4˜э5-€ЖAQ.Ÿm6{уАиAC.'ЬмSZз99BR ыЧZЅМшХИыoЧˆј=Ј†бЇжeљ -ЏЂˆˆƒЛ#—@ “KKЦЏКЪКyvдГ…(œS\bєиOТV’‘эAж§4eфИЌ:ЎЂ [эююьGRˆAчŠH*Ј4ŒHhЕ6њвŸ8Ќ•94yzƒив›Cўd‚rЃќЂƒсни„кSіЉ`СG�ћVx)хœьЦ.VX`’chХедєЋіjœa*.$8Sœѓзл8њтДэЗgЌГS1•@)XФ“СўЃм кГki \R‰lGTvы>X <žПC‘зщуYлкtRc#Ы@аO№%DёŒ r=БVZLMьsЈуФx…;LоЁ†žaЈ'ЧЛХH˜хотуюЙМ•‰=…kнG”ТR=kUЖжYhуg9ыэ^ю(xyJ|ф)9$ƒSQВЁ‘шЕ#ФщуiІnGнЬiЉь9Р�W!gБѕЊ Ээ3ЈуЉ§о|ЗбйH'Јљu* t~їсс9чŠаМ[ ХmКаJWхрѕ9яє5сp@гЕМ §ыAЭ’MЇ<gюКbбvЗ\,ˆqZKiojŽB3аƒќЇŒФcв”|,jйт;АюжžAz)^:“їБ“ŸКЏJЎ№ўєЙœггTЄ?Щ=vwCљSIс+SiВІu5oiфЙhAЁЮъЈ­uГlгЉ‡Ї_‹!Bд“ќ^ЙЁWo3єЄЖš НХ„Ё}бьiŸSzŸGЧИCo`}М­œŸнИ Jг’p FqЮ284И› r^zЉмIјAэDMK*йЙк}і[QщШЌz“Щ6eАЗC(8Ц;JѕЇb9ШУ.ф(ѓŠ зГzрaЖщAЦФуЗЉЂ!KЋh№dЇzqА’IфšгбZ‚D s.8Та†О,Ї…'Еd‘bајSJYSj;*QХlщЋЉЫ{M:RАлa+Fь)іЂ+­_2-д[ЎlцИкšq<`m ўGђ З†й'5opКA’j$eВкГ•Ќ qŽ1ЧOzаЯ˜7'я ЛаG$tЭd‚Ф|Ћm \ШЧъ?=–фkМЇ ЕiŒ[h<T•Љ\g?ду№Њ А•HyiPСНgi.NT’rgP.ДФ+$TЯp7Ь4†6Бюџ�ЗTБЙYхYжуЬЅKˆЎyуаџ�zГаZžUƒRВ!>YmчЭ§Ойі=БЃ яlЖЄ‚œa@ŽДОдЖvэђлz кгЇ?‘^ое^ФАГ�ыcњ}П…]Hим]Ÿž‹ ЏБн§ЮЛвРЧžкШИGлМќ[в:ЄїшpB†ШJjЭCrП_хоoЮ„ЪKž[ЪlvOхЯ|цšъзбfOХ&7ћМјчў"GнV=}ўu_ЏДEЉXW—ŸБd~ё+m;”„IBБш~g�ŽMBЈфКЗйošюjЅ(В„„ёР�tЎ­6ФiН@˜з8hi~ь‹yѕЯzoиlЖЫ,GЃ�nиr~tЈTЉZжлka19-9ъЏJ"*гэ№CS#Щ$`cжЎЏzЫ”нщq)lwЭ[i};Ÿ*у€IоЏnщyЫ|„F?ОXуš"Lk;E–зhuЅмp Ј_rОиЁ‹eЎпkЖЗЯ›)gт8с'ыжГkm/xvhšќЅ- />AуhіЌnE !І„ьHŸP<дЎMDі\ ћЙ­к™#Щxа_ЛšeшvcЯ‰5Е9КQкNvŒЃœмIаm5Џьб^QIšiI*$§в;ŠЌ…%шЈѓuЦн@јV…FF­VЇШrъ™rцИШк3$|ў~ѕП]ƒОIKт#СoTaЯ™нldgЙ ^М;ЙE‡ішэЇx–лGђєў”ђп.yr2IЦWдWG+UАє0пьСЙ#яПMДЋжЖfdH3ЁЖ‡9Z�хЕwњT4д5ЗjFиr>Ъ6Z9тnгл’:№ЇХd„щ-\тiРŒћјZЂŸШŸjХт—†Ідє6Г е`€ЃЯ–ЃќЇЕ$•Ѕ{TvИирчвКOТ]uYщЇ4НљaЩmЗхОЏ#З?Ь?O•j-eЬю6ЖœSn$Ѕi8P=AЏ4Хё3FШВ]ф• љŒђЅc‡šўПcщKЊ"•*TЂ)[vИ.\юqЁ4 SЮёZ”з№/OЂсЉнЛIHћ-Не8чњу№4DЩМDEЊ›KВ”„@m/Щк8.ЋЂ~ƒ'ъ)G) jеRР^XЦBOЧ4жU2T™ЏgЭщqC9Цz РЄ;yVГœщ*Й­DuЦу§ш‹І ЫАФі9ndЙŒќ<•mлД§n…Е3{yШoЅлрТ—З‚Мф”ф+9‹ЬћEХq`КЖƒXѓŸш(‰ап’€бј�Р�№+2T’zЅл_E’?™*R–В8Fr~Е{fдQю„„ )'ђЂ"  xЯ5Ѕ9ЂpЄ #чTzЯTЗЄ-mнЄ6ЕЧC%#'“VMAmджЦч[Є!і9Сх'аŽЦˆzђч6ктcЄ/žOzХЕv.:с{тJP2Oв›к›Уh…Рщ�B}IЋ;6‘ЕXс2УTа�ы[д5І‘ЮpmюхYІq ^щQ?MШДЅŸЖЉ yмЪTЄЄq•cІ{c9чІ*КSЇrжIRГеG’hЗФW[Жпо“:[mЧ,Ёm•ЈЃкЉPQРѕЯ­.џ�i5r§йN%ЅdЁKojˆ=? ЖсѓЖ`ˆ.ЕЭЗ%S\жг‡8ўЋ_.ѕifˆ]J”А“ŽЄћеМ‹$‹ЄB„ЖЄŒ№НЙСŸыж­tєБДуЏGVHТœ�єЋ”\PЅуЇaZX†.иfАў—'ЌФž'&=лвvэbИлхIBай?ё€ЁлфxщZ~RIYQЇ<ф7)В—Itадm˜•;Jig$ЉгЙIŽгШбЗ’‘ƒЄMxЕEСєJ[„ЅYЎ–ћЌ0%+%DЗo{ƒŠuYnьЅћfЇŠЅ–СSЬйћЩ>уŸЈЅВАЮЗFK ›tЩ9?§$sGњlП"Œ’І‹‰ї(ŸщUlX7ЕМАX>|еЁГ2f‰n …eqzcФ'эŒЈ*б|lMЃспЗ$ щOR@КЈсV›zх‰†:<оЙЅŠЄ­Z&%в qЧьвђP…”АЂДЋЎ)=xЯгfCRiі^mжH[n6ЌЅi# ‚8 ŠŽ_Vs‚3ј{PяL~бК§А:?‹#њQR”0qєЌЎМœwЂ%FІЛ1 mІTZŽ A%DP3L6”•!ДЄЋ•дžДmЊцЦmrм1<жтЌ'%CхBЕ&{M9Ѕач3…$њ{дЦј#)�юПЊ”Тн ^L„КыYе-ЗЗоЎ‘„чЎ9Ћ‹ц—M––‚ЗмSз’€xкЖ:Ѕqд4Ы8g†fЮРцf3їS‘=ŽPr?l—™Ѕ–ЪSРХiЂSaСБDЌv &Зcк.7—ЫcЫaЄŒ•Hќ;ѕЋЦt‚Xd%Ї[ Ц ŠNOПѕЌŽž…œsTќSЅPE-Ёp6ёAoЭѓ\ZR•$‚xWЊЎ6уv„ЖTНЊъ@ЁвˆЏКn|g>дШ*Рј€Ns‘ЊTОЄэKiЙЏNdu1ŒС[X~+t7qЯzВо%iЛгsР9BќЉLЉ_тљџ�]Et•—ь‚ШЋSЋ ЗЯHz+ŸШщх'ыўКз9j{aBПhЗ’•ЋkЃuG8ќp fјWq\нcHzх#žBOФ“јч№ЊD‚Sѕ ]эйq ;\ДЦ—n Г> к”’�q!X�ЯУТOЪsЯЧNЮОШ„ѓ‰Я” ОC^uл,Й:  ­�JЦ@*O щзŒ+фІЌ;нЗŒTk ђˆ-Œ}ŠкЬcЪ’9Ё Qzœ&Й:Ыm#Ž;бL?фЈПй8ЯЅ.Џг>цњШјЖчвˆƒu5вшшm”`Ѕхm*=MV:]XlЌх}ШЭ_^!7 ;>r”‡Rw(єцЊДЇa#>ѕaшћFлнП/ПТ•УZ dvќНџ�…Й aВ Ќ%JJ&Ж"ЄЋ8­ y Q@н‘СЭY%й)ИожD –єVдгeN‚БЉlЈ•T‚їŸЅ`Ž3X$lHк”ѕ5хЭЖEdŽFЪЭЁЁBњТи^C7БЩ-џ�ˆДЃс#Œgдж„k‚Ќ7‹~Є€…&3Њјв‘Зi”чзŒбГъkьЪmХ’žžЃв‚юЬ›uБиЎ….ФИСGFоЁєїЊŽ%C$ы5iр,rЌзгѕR яРZЫЃ^j‰z]Ї[ДšoЬaрP}qитЙUX—eЙ/ Љ ­DЈ`ЖЁех§(ПС§^эžњнБЧHiеnc=ћЇфE4<Sг0ЏЖ„оcД™8nAPч№Ј§x?чQKEsJШћFуЇkЈЅCаŠЧDRК[GZгЅ|Jм!nŠАzЇ9?–GжЙкЯэз˜Q{:ђOБ"Кw]ЁL3eГ0SБ–”“Ръ4ED^L[гфЉ(Cm“Ря§ЉCЂу›ЦЉЗ H|/rНдЌуњбŠЗ3ЭккŠW){ж3ќ у‰ќЈLВѕ…ˆhiХ4ћD8VаШqgЉЯp9ЌVtX-.4^*kr”œіЯjЂЊmэOZ SЅЭЉ<ЌћUK7эТгН76”ђB�5ƒNitKm3”ПД‡ HIIˆŽ‰&фј.Ќђ~яa§шзOккЗЋ)Цќr} йтLD”—AOSг4O:Wйc%–•‡\Y…{ж‹ЅЈСuЄ?б‡A–Ж‹+к:уін?%Ф6OяЂ8ЌЁСњ=ЕК—\1]9JОю}}+Fыnr$•'сW њбfžд№Џ‘ї0­Џ#‡YW Aє5Sj8њ~qМ”ё)ŽТz­_к”Џ_й­[m}Вs)EЇ?ˆ™­}OЈгyеГYмCБ”ž‰#œVX"3HиСЕжXb2Ш7ЊKЬ—Ў—Uм./*DŒŠQ8HєHь+UЗmРqЕciѕ­–›+Y*ЯЕ­)N&cJlœGn+ЁRУ ъи,о# E9�d7}г^;ˆ‘kehQPиIы‘Uђcю ”’Ai8PљнiйnЬ6џ�ижвecЏљџ�jЖPVт0>№>ЃЇZц%†z)…Dw�№\ŸЈ"]“•ѓ ‘ЫЌ‹dŸ&SNШi@Љ4И ђ3иШќ+r5ід†ЗЊZм~ыЇ5К–]Žуˆ*BŽwеЈуLЫsШS И’sЕi~ю›ЃьЬ|­ЛПЫdл­aсфО>Аі}љYј‰r‹w‚мJ­|яIјr9�zœџ�Qєд№šьDYж‡ З%aд ta_˜[ъ}+Ԙв˜AжR?Gм’y~НЈ.п0й<H‰!…nLЅ$8€1Тј §yЉ:™bЊ…•p:ь9 ГЫ[ѓКшt4БУDУэЅŽЗдїoЫЙ94~ѓyŸeq#Ы”ЫЌ�GT“џ�Ш}hЋ@мі’‹щ Л*œŠр ! t!:ђF ыšƒ-н_їFIƒ§М№ўн!л3п)л6sŽЖx 9Я|ЄўUЂГ"-UtvХЇ&]XkЭTvTНžЄPŽ‚ёZпЋ‘іi.ў? ўTOЈжW І-ЋpZE1ƒ\п­4‚ДуІыiZлЛ-cщD]3:зrT\e$‘熂е�G„вдЈ$r}i ќ_ЛGзtWкЃ8 иq_y9Џ:ЗЦ‹ЌЗфDДЇьЬ%EЬђpqš"lјuД3eћ4‰ЭЂPq+iАБ•‡#фOх@cз‰ю<юс „œdJБлžКJ ГЫ’њ†ёНDэcњџ�ЎЭkCЮРlЧI e)эъZpўК 24.гСDу8ЌБSіHŽ{ўыQ›ˆШm‘яоВ%gО? е‹pjr–лd…ЃœzQѕЏi$u==ъЉ‰M55OюŸ~JˆцКчoUВтuВ•t4!rвБвJк[ХЇqщДŸТŠƒo­ x# жЃэЪi?й=4Ѓщ[`˜1Цр№[ДЎЊЅМБмЊЛкXz3 шл“а_˜<§+OТKƒЊe[#lЖˆъG#ђЭъ$-6Чœ.ОВFJ“ШJ{ŸУыJ‹:ПcыыLŒх })нг9јIќ Lb‘WФЪЈДЬVўUЯ Ќu\ядzyлUа †n:vэHоPŸДЕИђ zў)Ћ§!шЈyJBР[+*YZ–ІжІї’GUlнэž§jОбё]|ЂRЖ”…dєрўFЖМ>AkGЧJŽT$JчвC•ЄQB‰#=ш>ђ‹}‘k’ щ$а{бk˜-эЯНjшRЅмP…) Œ "]j‹Ы“. СS$Жђї8сщ€2�­ кжюxц­54S1мZNіOТ:œёZЩkЮmH#‘СЋц€ёП/%7„ьЙnѕікJЃžy[)Rў.ЂВлл-!IWQQб‡T=ъЪъ+yэ§І•ёЖШRœPJqŽjžcы|х.ЄvAЩЏO"EвHb88яœUŒkCэЄaм|kу'8щјзЂcgеЊЌзуЂеFtяїCСo-CjЗzs§kы№ŸКAv6ЬЄpЃшsжкАA€dœКЄџ�ФPHљŒўД;э>ф-м'ŒЄ>ИЌO|u1Й€\(ˆё™Ікъ›~WПч$Г[r-$,eahP<ƒ]cЇ^jѕhvжї-\byˆ'Дѓџ�ЖЙЋW­ЙN"CqджUwЯ^>жœ~моsFYц юr)?єЁx#џ�mPЊръ't@шЄкv€6Ев‡Ф Z оPљABžIK ŽŽ э?ЅгЗЧ[H:SЉ<yш=‚Сџ�иRJЕздI P—5ХЅ+HPћB|JшMfІфј‡хrKвH=3’iсLЭзq7(Ѕ-‚wЃ<gѓЇ}§тцЗЙИAe>Ф Z"GјЃ)OъЯ#vPУ H„ђh—HZ[Л!ё%’ДЁ)Hq}3Œa41qўбјЇ!Ыj•Дуœ%~Ÿ2юRг Ж–!)Qq‚ІЦvќХ м,кюLЧˆљJ$:“žєЂ‹6r!.Ф™!jW+c >ИЁ‹ОЂ‰t€]aэ’YPZFpAkІЕњs(\ИЈD`2‡’0Ђ}§Ј‰•jŒь0†ЄИTTwm';@Џoю“!n“Ч?кЕ КeДЫЎ‚ЅlRIѕЋЗцЖœ}Ј‹XХRщЮдп:НwЫЙлоJ p}ыH'�sРыu1#— �žДDŽ‹`КнќEvTі џ�.нЧЏїЏwm9я#Юo-2№УЇљЛqѓЂ/RДѕЂkі…yIKЫ)ШкЎщє5›УЛ„лН‚$ЛВЫя#%(џ�AѓЏ –›…є ТНР•g–bМиKЉШф,zƒмѕCюЌ:ћI^дЅJф€xІGˆqО7�…ЈЉ•>рх?S•~Й–„И‚ДG'Ž•аАйћD ъ}д…\ŽžрlHWТжЅ4‡гЙJЮw$фф{5„уюDiA#z›лŒАo•р•“ŸРz§*квZ“)*%%Н‰OХž1œ|ЊБв†Ј%aеЙњ…Ьц”‰QњO> еpŸ!е–вž‰ŒзЫSбЂG+%>vт Ч8­Y—Ђ˜n-AТP‚JP2NoZаы•qдЅ)еˆ^bž[В•)DрcхпиW:ЁСфЊУчžWь2,єдо'%/LоО^В–ХУ+žѓŽЊ…ђћ zsЭ-АG–ЪB‡c’ љŽ ѓI§_v;§Йм…Ј/ЭCС ‰c#žAc&œлчЖ–нp—9YZ‰р{іљRЧХЦЭТ ћ–‚QЮGХ’yч<ѓзНI`Uѕ.Рv’†V7ШыЧRrWŠЪxшщйn$Мч}4&ін˜м™ё5MJ@R]B’ЁыЙ=(ЃGВ#ЩеI  л‡т<мЕBжЧвЋ}žjхУƒ{VКXО5ОДl:ЃRZuмvЄЋЬЩІH Я§#вЅдZ)ЛЖ‚Ќ ”|@вУX4вєнС/�PQСѕэM5Є-В€HQц”ž"%еиЄEd„КњМДgоЂˆ’/№žЅєqѕ­Yy ыц+­шm!rXФѓУqжZШіЊmQІЎV{ДпДGPl>Ќ(sС9•СWй�Hк2=ГХлІ1>9FNќaI#‘яAіˆЎмпi -�>кV€ЕŽуœzбеВРєЌэNт?›$ењЁ№ьvUœpECкуg^уРшВZ[r4Д;Л‚J:ўРЋІЦїHR…}i„ДаZ“ћРžI=+;ЖЄ)Е%I$sТsЯєЎkг*Ж’ЦsQ40ъ м€тVњТRй[@(q“‘UЦ3ђw1)‚ЙЮ=ЋrCІ<a™D­Y\ј’{єщщYcЫiЦšu@љЋШѕХsћ6‚ОŒ;mHыŽ�YkГdj?яфЋzБ чoi:ЭЩБ–юд’‘ЙgЏ|цКyrZZ0ЂОРšAјЕdi”7r†иKjw„р'qю9ЮOЗЅXz35х‘'hŒИdnyл1ЬoZ e54ЭŽ0 cŸ’pйœХж Рœ>RŸ‡мњVO|џ�А_[}Ч”^ ЁJ$6œ =тЃм“оЉДlЃ&ЧЇЅ)ЪЩPЮ9лŠАаnЩkSjи*p§•ЉФ6 2Ѕ8sŒђŽ:qюjжЗ‘УЇсщјVTа@ZБДw=Ћве”ёв‡u+Я&ЮВЩ9JС8єЂ%ŽЛ–ЏіЅЖBw-j�{ ёkŠќЧQ†”З\V‘оГOyЇЏё^x$ЈЁi;О”РвЗ2ѓыІRл Ѓ)H�”ЂФЛ,EЗ$ЉJўЭhmЩ@гэ2Ќвќ‰iJVД%РЌ№Я#щU/Ж_”˜р‘цЋiЧ\c'ФзБїЧ‡5! двŽ>#‘”§ја-Еjџ�iЃ dЅ_ ‡lUš†ЈЭOз@7фВт5„an™КччšНЗYQ"U%�Кyш~z{жШ-!ТPв‰р§Ь�Aїџ�\U›ШT„’ž6r~U‰ˆ~bЪ7~uCЊщCH‘ЭњZЎ>DГ>юеЫAЛsrW3Й‚7ЏŽl;~<ж ^’Злф­№УJ'”“ЩOЫ?ыŠ —Х`r}*Н yіжкV[$МF{ŠС„є‚ЊЁХ…й{М-эeюq=91И‘t+т„xывю8та…Дrи#%Yь?#ŸjХрфЏ;JHŒЁў ЅђRAўЕч]i5KГH’мчyДхAхdф08Ц3јеO‚ВО+ДCџ�ІшќС§*RЉhikЖ…Нo˜ѕjл€іK5зБ<ЛМ7ѓG^3Цћn‘bqP!и#П;ЄЋѕ5ЭuдКў?л|2dƒў дСєјіЙjЕвkx ЭжХe$„Є1“§Љ™z}0$]fIV…:ъдF8NOѕ oќ;ЦпЈх>Fv6{tЭZxŸqSJтО’_ђAѕ Y'ђDсš<§R§вRR7ц8 QЯ5бQšЖнрЅ…Ѕ){nzYщ;zFGSщJVъ|з‰еиќ†[УDИ‹ѓЃШ%ЕrQщђ4DЎД'иЎ>ЬU œ­-ёлЈшЊФќ7­QŠ’vв8ў"‹aмункnH {C„r(2ћi‘І.цлRт­Xq  џ�Ђ#6e” 0ЌЖ–ј'ОO5m [n+г5UІи2Ё+~v€ЁD!%ˆa+ШY$žhŠGKIVёƒњVвДrаV5ЇШн…p{UяЏтћнJ"�ёUФ+HЪТv€R~uiЂ61І`!(Ш,І†МT”i…ДЅrуЈJGз5s e‰ZbоЖЩј[ WЬphˆк|6nЖgсИTЁ” ЧCаќБ4œЙЦT5Ј% ЩIJКƒм`їЇ<}Й99=h3]i‡^IЛBј“Ні’>яЈcЈю~Їз ДE'Rѓ`tёўVд2Ž­бw*) Ёжм=R6žУЗіќ(˜)= �еUќпўœRіжџ�й$))QHXЯА<QДTы/)JЮчRP�ўЂЖБъPc–CМ|.{ŒвjѓПјYІ•+ Ю+{KXeZЖ–B”ЕљŠЯuœўx!Rйj_j˜@FrщѓїіЂ5H; YJz’zух\nЂМˆOŽ7q№аrЙчрЄpŠWGћŽqмЛѓ>kM6]РSiQ�уѕЅпŒжtЛЄ“% 6З#ОцtRSƒž~?\QЪЮіЫ<(ёС№4 т„›‚є„– RHѓJ†Hфџ�L}kюзA›'ќŠš’g5ьŽ`K‰ЬїяВжб‹r~ˆД<sЙ•Ÿ`Ќj&Д2„xЕ9а ЕŸНмЉMЮƒ|.p$Ј|-HY"іЂ5)дx™cУŠ@•љ-!ЅŒмe)8=Р=ЊђЗS0ЈЙї\њU-ж,9(!шш^оFсœоqвг'<’j­ї‚”ЌžфQЛкє†ЄDЇv‰lљe)щЎ>Еc$РЙjK“[}$4NFB’SJn­Ыды p)І˜и€:šп№ЫQ/іТуJpѓaД•тOOЪˆ‹Е5‘yqчAh&*N„чр8СїфђЋ+~Ђѓ#…Ј[V‘ЯљUхЮ�МZŽž\Ццџ�ъQз‘ѕЁ§(лijD'й@йУˆR9ШыœќЧчVŠZІMEyмЬЙ(n‘Х6ЁЭЙЗчr$CШ~/šй%*NFEfŠєЉ VєЖUюGJеNд! a#ЫPјR‘жЗ™mMЉJ* Тp*љW1щMC$œ1ЙмYDtrОЂэ\!•§Ќмѓ‘№nРЪŠŽ;j-ЖЦLhЉ !Т~"”œрћЅan?z?YN0„Œэя’~~Еx†HRЗ|D’^*Й;ЎWHХjzИкЫfx-)Ю5ч))VмŸ‹=~”тpS:EеЖ1)poчBN ?~#’RK`)dg%\ UјЖЙжћLx.ЉЗд іžUƒ‘єЯчђцЯбщу†1 8nNzчzчqSTšшчн~Bйљ§б‡NІ_‡vџ�9%HlЉ у!.џ�…_щ‡Є@ё2љl R/ИЅПr€1лuYљЈЧ…‡w‡ьџ�Ъћ™љn‰ЃHf/‹+ЇЩ\ш[YO'rŠPВ3лсmG'вЌJиŽШVгŽ‚Њч 9ф+КMc—|ђ5{ZŸ15ъq)ŒсP8<qDIэIЖ4ЦS‚ЕКGcšahy ? KH)sЂ’zфRЧS\Ў+,ВxV —аг3KF Й„uP$бЎО™ >д0М1хЅнИ{*Я^•WЃ›J‘2KЈIZ–<ЕxOzQИЗ6хЇэЛ1!ВЛ$х<c8яœћPў‘ LфЇЫр`юъ“ŸLuЋhkpiEЃ?uЅв9УY2Бф‰’TIR чƒ^rЖеСлŸJј•l'oNѕА”4ы)#!A|ћZхѕN‹Ћ-§G^ ‹^чX;Eсї ˆ;\s8Я_hИїйЦФŒёжЌeН †J[!N(c'œUZк•gzХ‡™6HˆнgФI27l‚@/ЭV“4І$Xђ N№ЁЦмsšXxO DжвЁЅ{›u•ЄcqJ–hяWлeOА”УI BТеŽЄ`Žњџ�ЃJ§ЅAё.UЧяжƒђ)?хWi_;Kѕ:№пsu=бЦ4Bїƒ™:pЗЭ§@jMЋ№ОMЭЬOnхI§\Ћ)TЧ›ўWŸРзUъ1цјasЯќ)i шSжЙr№.ё18ЧяTšњЌIуџ�‡І6Бs’8Уa;Гт?кЊ|K_кZБл&DрOЫЇџ�еј4вai n•�{j•шRкˆЧЬšёЏіЦš[$nL’R РШRh‰“vГкEMЄ• ‘лІ*›Lм‘1&ќ2[€ѕуŒќиfЪK%SМБЇїЉ<€OaXŸN]gЉШЯž<Є~ДE‘ˆжХШF& xШСЂy0cЭh6њД„еDmЇ7ЉеЋœчj§!-a (‹xm0Шe„Ѕ(@ЏВ†TЄŒZ‚с"еmK‘›+un%Ž™яђЊk†­у% FTЧ№7Ѕh>И&ˆЌe:€оRЌЋо‡eK[kЩIЧRj&і‰iЯй$2Ђ?УX MeЈ$8‡-MХšШZœъ�<vХhjiŒkY.ZЁВЇ bJ№щѕ­1Љ#иoMКРх№—ЌяQыšU[o“,’жфU|\‹8і8ЌьП2ё)s_CЏ,rTŸцэ_@$и"ш—я­клItИБ”ЖœdћŸACїKќЛЏРЃфА8 ЖNЮFяSг№ш(Rг=щэ! KЭЁ!EjЮю1ЧсV…){BGХmOуVŒ:šš8Dњ‘ЉсЫЙXшiрdBmO–h–hѓ^u ЉЇ8•ЃЪVr1ЮBHіШ=Аm4”‡D–!JBŽЬŽOПаV§ŽˆЖфмfфк‰N0[ ŒымѓљW4„ЁлЋM„ЫRR“ШHњ§kХ~'”ГмнЁЃ?mќ•KЅ]žZrш[РН­ЊЕ\…В‚ЂIcЗіЌАдЖаBР$œ’ГŸщZrйuЈ œgђЏ vAFО+ЪУ=›ЫзšЇвдіWэ9Ф8~dЌ'Je[�RBњ”œPŸˆXF†ЙЉ J@žл†jчЪ[Ї8іЊ[ч4МдЖЄ…lKƒс<ŽИЉŒ ˜UE#wВГ3еГhf\мљ„7сJМЭthž‚ўСDoЮћїEм aх-:Аqї–Zмx=7чщл­Qј@СN“œс9(уш‘Yѕ”Ї-ж /pk—ЂАЇа’>CЁbЌJъšw X=)ЄШ\аЌзžКЧ–!<Žк zRК%=ёяJk%цхs–U0.Tщю†иF9чга {[tгQ-бсМЂуMrЖЩШq}ЪН}‡J"чЇtnЁОЭzUКг%q ПvтгЩьy­ћМщћьW/Vзй„Е€Ї“Я–{(‘вК?рm=R„$wР�WФ!2м•!h>œ‚(ˆNmиiЧвS%­Лˆ•'љ‡­Pj+д{…Ъ-ъаЄљe ŒNA ў…^єЛ7(JeЅљ+GЦЯЂ=;€zF_oЗ[}ЩM–<%Т‡Z#‚ЏажхPІœ=ТуCрО†Ц№Y(ЛNE: ?О+N7'уž l]2уЯ|+<ЏwQž1єЁэ)ЈбuВЦJмДmBё€>xљp}ѓDОDyhђ]Ž(ЧЏL{UoЅдUPЊ;‡ПЊЏрпщЕЇЈ5ПђЋXЙ~ЭIKL(ЕЦеž мn&ъ$Ѕ {!'qгщоЕ/жљсHn 9Ш'сQuывЉЁЧЛЫuMЁ-g”)wmчžеVl-•›yyЎ–)aЊ‹Ќ sFэHiІ”тHIqJOвэБ%Жи|K|=€ќi—mД.tЗ)Аъ:ўёCрѕугщœвчЦ[Ѓfб ТPЗ‚”ц1œРўоЗАэ^ 3Щз<ЩUЊјЉZіЕЏЛЏp­ОўBчrА№­*џ�a@<;)I?"Дƒ§jёі _,бTтœS(РпдГЙоЋ|0@gEкBЮS„уџ�W?ЅXШёО)Т‚Jу“‘usX'ь)Ўы3w}Hлl%ЙЋКкnЗЋg�šДQЪO_­ пЪфЬC-ф†Ч tЭ*5%КkЗTJH+ F:ѕЃэ+sмІкT Ќ%j ŠЉЛ7)ЙЌ%ЅЇЂ’GЫће§ Њ ”8тw!G€1DFRрЕ5%ФЅIЮpЁ~tБГШJЕИPв журc'сѓм~д‘!ЁЛ-[”лm—O'�gŠQщЧWчБё:„дŽ?ЁЉœ:2њZќќ­<V М:Gкћ6ћн!œф“ѓЏЛŠRR…+СЭOћё_’‘иЋ ХQЊ!gUВжiЉ;ПЕЯXђ С_$BlЦmHф•qЯzРbЈŒЇмКmhfо‚ъFтp?:дyјюЖTкHРцЁ)Бi‰ёS’с­•ЂBр †KTЅŒ'cšPLŠм/`6въV~jЩ?зђІˆлjZБžœRœ\“vёšЬЗв„Ћ9м“Э]0ъй*iо]{ јџ�WYК;ŽЂA|Ж}n>зNћƒ*“сuќw\RHіл§Ћ˜я‘дхтBљјЖŸџ�Q]"ћЧ№ъї#cЎЅ$рcŸЧЕs§бФ"тъw€ž1џ�(Ќъи›ž yЗ[sА№J#Мм’€p:љаЯŠьЊ З‚Uўч1MрѕШџ�ўjЗСJm1мWю^Amc=SG~4кМјSЫI mšPш@сXњdџ�нDV-оўBББРфњŠћІЧй™K’—•фЈў<RŸBМ‹œsSыRуЈ%Жї`z~ДШEŽэ1Ib3ЋmŒ dбйЊPќФФZz№•zQ ј!Y=hsNhфРCoHQS‰ч“Ю}Э-НƒЩЮxЂ%ЗŒŠ]’%E@ Ј­CзЋ‘†ц €ЬщмŒвЙкHЪНГщW>'iЇЏњ~;БŽ^Œцх>њOQYєГijХ•ќ%#є4EђюѕЗMB[СДЦzвкџ�q‘Р§д6!б”=zQўЉВЎђђZхIр`ќш#\0•йŸ‹ў{r=E$eУ–—Ti{Г•цЏ,’г2ЃКЪ’т–— q@рўMctvœ‡іЬ)—€иђн>ЙыЭo\[МHДHCЖјpBJ–МяQРtЌєеЇ”JЭBњгВnЋ#П…ƒЎGБєЋxзоЪъŒ“’ЃїJUŠБNЭсФ(ѓЎˆж k.ЄрЎtDД•…Я\ЙcpОЬ%� ч>И<б†ƒ\)m ­оч$€‘ЯњѕЅ–ЁЗўжŒ‚ШC|€QLŸb;hвЭ6Зќз –Ѕ`}вxЦ{§міЎŽбKOORЦв@З7<Ќ|•{ъу‡iпApљљEы€ДЄИUЧ#жДVœ•ЃажрК8…ЄмцБHn<ідД+c‰ф{з:ђ@рщ\UJxЉчэнŸЕ›”кTRиїЁЎП`вrˆscЎс;sЮsњUйKiYчзЂё>њ.ІэqVЅ"8кА;ЌžG^{vъ*§…TАФ_џ�}п+Jf­oчхЇ­‘П†Щ0ќ<ЈЂ]t{і­тЂK ZmiЎ5ЕЖмl Еš&вP<Ї­6t†a!ЬZ‡Т”62sѓ8ќimЌЏ2Е~Д-Рм_–јBz%#§ышЯТM.‚ђЏrЩaKєнќDJhЯ”bЃрl­jш;xг–†ьЖ8VЦњ0и >ЊюЧЈ™TИ&<g’ИgтС"ˆ“кіљ*ир[ѓVђdЈЄЖž€{˜Ђ] Зa—™И:ђГ№|Б@ў"iЩСЖŸ+S… ЦТ�њV].уfŠuDЉ—”€Ы œлцk=<žN­Ї2ГA ™ћ е=˜м(iК)Иј;r2r}�ъ~”œж‰cPI~[qУ`'јœКПцџ�!я[Rѕ4ЛфАЉЋсKiHТR=‡НjlЌЇ$uЦ*ХM‚ББ‘.n>žъ^ юŸд}<Ÿ…R[nч6*UНДЃr ЮS“гК+ёЇ"˜†МЇ~ђ–­Мwыв•jQuŠІАЄ6™( qЕ$œœђGЁ$Яж˜wЧŠ-mt(ГwјСцЈ],ЇŽЇŠ]3GтжUЊJ&;иl3ѓЬrW LbQBйy\€H##šЪЕЖщe)*ъЎ1“Ÿ^є9Ї$!PVШpЅц•Е[вp{Ÿ­\6ЂЧ%EI5E™Н\…œ­e4PI$yтs^RъW›Чј‰§)1у+ьЃьТ^ Z№:„№3N‡d6г/<UЗ%9уšц‰ѓ&kMvлoЉgЭJЌь@<ў@šБєnКWд-ЭРA~vPЎЅ„T5аŸЇ3Я/Ÿ$єаpvЛ ЕhЉ„яIя№+њеEЅ—.~3МќF‰f<—œw*~R=~% `zњQn˜Nлœ™Ї"=ЖеИvQ§Љ43сbLэq|Й2Аc6СBТ‰оTтСIciYчИїХ­nІ‘FOЅi.+dЉРOR}jСє)m8С тЈšMСІ\ фрэЯ­-ѕZжЭімB”€фн‹ЩуiI8?€І-ˆ— Sh%hрвяR1"UЦf!%j@ђIСХ44­ЙІ-IqЄ€ЇMm]J4Ьєсˆц?іšKІBaн IZw!Ў;bžФmгз.‡§епў‘?ќБљgњUŸ�hsгМлбHG›š3Н0fИр„Ї#ИQQщжВ ЅцаUїЖ%DЇЇ>” eМ\$ЦDLЉФ$э ,Зƒдб„A!2уЁg`I$фŸnЙЌИTQ@bk•ЪjiOv8‹…™šИЏƒПkh§–[j6FrŸѕ§jНL3!хlV юzW“o’Щ%v:€s\–Ў(л!k]ЂкЃžVЗ6m4Ќ6УHuчАrzRB!2|E/„рFejчБJ6џ�Zaыk“а4ФтДўёждЪAѕ)?аd§(#У8 ЉoАоІЁ2RЃ‚ГњеЇcуЁ;Z=зќ‹}Я’БрЃіор2$+ќЇ6І"7„ ”ŸќЩIQ<c9?ЅsэгћfFгЦGa]т§Ъ=ŸO@АДО@Z‡Аџ�]ы™ф<ЉъКЌцЄTЪЭmšхКтФЖЩ m`ёмwЎšmёЌМ;7‡%к“• Х`Їтћ4ZхКsј+ЋŒ эХЁф№Ы™ўCїOаўTDЗАЪM“WГНjKЫY<|9рŸШзViim˜ЊNS№ѓœvЎ~ё—FВњ­OЧюs˜пwлщг№ѕЋџ� ѕЛЎ-6ЉЯeц’e]\GЇЬQB.GšЩR>™ЁЅъ7 K-Ъš'ЈэUз-I%зФjzЈW˜švtї’ЉŽЄ чђhˆнЇZ‘МлЩм“яU&"!КцСЕ*9РьjсдD0п�жЋ­ф’ N(ŠЖ\”E†ѓЪ#)OН. HЙC™“ў!V=i–єv_Ieб”,`ŠИiЯВIRс<“žЈ*СЂ$м[Ї–ZЕЭЗ}ЅЦ^Ru/љjЧ\Vэжl 4y Ъ%*xЉэР vШ<чЅlъkCQѕ%.ъWЦд{еTxJTЇVћj+ъ2žеН‡Rіš†АщЉ№ќЩ|sУyа/^JœQuдсЕЃЂОUё кT�уqХ[q8R„V”ЦМЇB[�nЦ=ЋЂЦw(иц/y.Yиd4ўOт бŽ“šЫ^s(шRAѕуŸ—'ж„”Ау{ |{fЎ­эЈFvB@м‚1Ц#џ�фVc,%Џа­Jђщhіdвљz&Ё dƒШ8ЌhlJЄЕо^u›ъT?†Ў‹ь„’�v*у?/ZЃUбIиикšЊlАК7X­K„Иіц”і|Д ЈЄdѕэHXІэЏœžыi[iSхј‚А~žрœQЇ‰zЈ6в Bs.2ЇШШиу8>чдЯр~“DЙя_ЇЃ§Ъ |ѕdd(Œ”Œ|СWаzж)сbMШсР}љ…tРЈLuв_iўлМѕ№З}rjV™бBд’д7Е‚т Џ„З“ЧSŽHžеНg№цзЇ.Qч6”8ќvж§Єo_ё8A$хGЖN�р ЎгiЧФ'ю“—З!-(ƒ‡И5№xHJ•д ‚;г*Z76пcXтЁКОћVyN1Ÿ3ibФЉ’RDЭёпЯBЎжšЧkmИЧ–G9щ@—љPЂЩLpТ–\8G– ‰њ "д­ОЋ фШVQ‚1лš=и№JYZО5’ЌdчПдbЖ5MЭжМшЩuікQcˆ#ПЉэXv!Rв­мЇhщРЦ*Ѓ№Еѕ{ПФzŸТО™Э;LЃ]<я№М5"b™Ъ8W9ШфWИmИ‡м*м�шт*э0‹­‡AR'oqыX.q„њPRBœlc=БjрЩ;!hСˆ:iƒd7ї[ЖWŠЎQмA'ЫjЧpœЬ€>ДЫИGS.n;AиRFy#ћ Uкц"з%2UИ€‚€‘дчќЉ‰iЛ5>rXQBОщIу8ієтЈн6У%Њ’B3iїZlд˜‹k�Ш�  ZcШ‰)§ЩѓR‚T0Єc=z"Тqё”Єc>п*РЭв3ˆ%[  ќYNљєЌO\X}cz€HщЦs\zfHїІцІЊёЪzй€% ј•xEЏIЩR PуЃЫo)ЮIъ>Ѓ4Ћ№Юнdн•8ІЧ”жy+uЏї­Џu+W[Ћ0"8•3;ˆЮI8њcџ�ж2Ш№wMЂ И\ч�˜–є—JE>FT}і'ž*џ�‡RšJ6Bсg}GФюф�ЫqКХM‹ЮЎ7х љцˆЕKЈбўНo/Э–вдђЧRHјП,ЌўiПіwN(КжЩВд}JJw0‘д'žч’Ђ1œUGекЉльеZэŠ(+у_%Д$Œ‡ RЙ?Т!YАoЎгi>\džЈ­Х(…g=ъЎцЖe2ф_;ЪqC�чšждЋœмЛ {T““CЗ+—gn_IруŠ"Ол•oэŠМЇвrO4ТгWxюЖд&ЮT‘Ю:PnЁBgФ‰($8ркЂ‚x$QF•eдЙНq›m’3цЇкˆ­5uц5ВС-­цTк=Tж‘f)ямЈ:G:врЉѓŠw ЁCзЏљ~4ћ%Х)C?Ћ‡GcйˆМя*EŒxЃ;'ъ>‹-БзY}%qЗmЩрŸЕІCŽЧ.Щрћлх§щ{oxG–ъ—,х#‘ŸJ<ДЭjц—l3fтnп­zщ.’™ћ7.ŽDvЎk-†ч)ЄЅЄcму­Z1! 5•ЅIV9)8ХV72ЏЗ^:PіГдŸБЌЎЁ• Hu ђŠГ№уПQьЙХ УфЋœBС™9їq<†kЭв:As' ?=аŠš“і…м[#;К;.ћЙŸгwфњбЇ…1mKS$0т˜ЕЧT—ˆjњ'> b“vhЏ\Џ,'jоV№Ny*є^tЉu­ЃЂXрѓBLЛŠбќJ?Уњ}]й#`Ž?ЅЙЯ_l†ТРЦЅЏŠwЧn3уЎ…Н%JZ†~т8к?зЅ-Ћnчpvщqz[Чтq\х…jWЅ•JЖг—#lМ2щVждvЏхU5(‹ЈѕП§Л№„J Jч[вWЧ' тœ+щ\ФгяТ–‡™qmHiY Iх*ћ№?ZЖД›<Хђ BЙВOшhЦН'Њм~;KйŸМaxс>ЉЯЈ?–=hˆлУћф§CnSЉ]AиЇ;•wЂ™aыR9рw9**Є>†жЏi)ъм•9 т вžЉ?Ь)ћgНBе4U­Е§з1ЧуDWvН\€УlL*QќAщяDm<дІƒЭ8‚8"‚ю–D[Ѓ$uЋ]$ђ 5Ч…ф'<бЄ„ydдP…ўЎЛ!SKЪчЫпFrsДžД7uгБЎ2Ѕ/kˆюyD7NЗ3K>уџ�О™АЏЬQЪъ>B†aBmшЩqьƒШгОTХb‹:[!kqЅГЪ@zPLT†дћ$pлЪOчŸжЌ ьdЛюД12E=ЧьV6р4Žp{ƒвЊfВЄЯ œ|8 њŽДJATз4…\Г’ ЧдšДSМэXЈќ2яŸdцŒd%Дљ‹<Щ5Нzиm^aVХ'iРэžŸ†ЮА>„$ЅД‚^:UsЫ[™ #6њVЫ€xБоЌ3вБь1<\tw –й О•ƒёž@=jj=FХ’ФЄ<т|чЦЩ9#?ХЯ?•ўжzжЪо/(mO а~]­^/soR–єЇIIVRŽЩ‡гѕ>ІЋ˜œŒЃ"цюдžх\w^6mјїxqQ ™~КДв”Зu|$ЎШWIн#ЃDјS ШхI–7О1‚”уrЧЖ>ак4ЮН ФЦђУ)пЯнЈЯЬЧ 4m}”оВз�ЖЛeН М•(1 ’”э ю PфїBЙЉЙю{‹œnJБIЙWš_ьК>ЮФ9a_ošП:JRsБj�ѕ#сH уƒЗ=шнxS[R2œѓK;SыИ]п‘,н!9;г<‚ьo1Gn?Ѕy_|ЄЇЪqЉ §к†8эC0ДќHoH•іУ!в’Ль(Ѕw_ћ2^ItqZm›pМъ)є<Qtэ,хжџ�ДCA%%<‘@2ы'C…;ЮœЁ&ф”Ъ!Є$сДqJtBЗ&ЇhŒН ЈєЩу>Е;€ЬжLцсkVŠw,~пuwkmЈpдЄ<кЗpy&Д/dЩ–жЌ(њqЧ5Мд_3Ь^HкƒгмЇ/љ’TЃїЉЋ,ї ”F [\У_%ЏpKqŠ�@R€�ўy5qІЪK<GУЛЫгžПыU[\™ф’6 эы‘юAЌI–у›YJ{ЄЅlЙНl[7еXёК'NТШ†I-№Ÿ%)#Љ8 Me­f[K№с­Аи—‘ТТ\gІ;§:fНмѕwиэ.—@�фŸŸПњ•2eЩИЩођдЕЉ\'<}TыЂЇЃovC.џ�…XТ№a†J†§:Мёф­t•‚fЇдБ EAqз’Oу“эмќЋЃЕДИzGFFг–мИП…!АK(іРфЉJэUiЖtV“—Љюл[vKcЫпСлЯцqјPнКџ�Pыщ/Яš„КЩ*iœ”•-\žœ'#§уг�Ќ‰ЇM›^†EЙП-rЯяЅ8о˜ъЙQЮ pHЮдЄvЁлuъU’cQd %’q“пк‰ц]нnЧч[ђсm!Јi[zЉN;sУSЅ>ZЯФяDDZ…‰Hio•АрŽЃ№Ѕ§Гіьш2 Є6ЗuM—sдѕЭ4бfj-qQ'kkћЋQт…ЃfZeкц-зНЮЖU”ЏŸЪˆЈІРЛлэ)vSл‹dŸМjн—Ÿob:”ЁMюK[љСяђЋНl™FЪJбBY%[9яKЧЎlмAw H��z�•Hс”ŒЉ›eњЛC&’в†kmO;5ѕI{j‡А%‚”/xљWиЛ№sЪGOzє^X$)UХЗeЂСY„LА�dI@CN($ф/q“š б­nЩVG[x#>ПJЉ˜–иKЉK€ЈЁ.?„žŸЅcДj&Ё0\‘Д•ŽŒ€њЯJѓ1эЇЋЮъ‰вšgLжˆEЩЫ/яwˆЖ‹{ГfНБ” žъQь�юM uўUњтую-{€”tуАЧ эјѕ$Н[Ћ$ъ[‚—’мD№л^žЇыњJО№Л@?ЋoзРjпHq]}>gќыŸВ&@]еъэOиwoяф††і8іŸѕ{ЛО.eс˜nЭЭ]xl&;ћ2V?Хwџ�Їњ“щ@о#ъ‡Џ7WX.nQ^їЯќн“ђŽМMз1™Š‹}Ÿcp#*#HNGк‘‹ZœZ–Е)G$žЄбKЏ•*TЂ)RЅJ"оД]Г\й›D-ГШѕ•дЖiЖŸ4"­—<Q”Џј’ЁбCмt5Щ”OЃ5tН-umжнRY*ујOЏїEЉЊєМ§)|‘nšЪгхЌ„,ŽžФQџ�„:бЋzХ–bвИЉ…7gЊ~}Х7\kOxЛЇRадцЦьЖA#м2NzW9kMuб7•Б!З<€ЌГ! сCБˆК†э7˜-Щ АVЂyИЏ‹uЖгэеМ7šAiп'5‹eаАЅз/')OИяOлJсПji˜Я ЧRBŠ‚И"ˆЌл˜‰‘PјШ$уЇzа”ћm(%Ч‚О�Qы[0fDyЧ"ХFPЮw(3ZWva<жeЇ^тˆЉпfшЉKмьvтŸКqЩ  › Г_œŒћўh”KШ^�ф“‘њ~ЦDh‘оaK”тASH_ §iwЊ\§Љw’шIУ$6‚8 ŽzжнIІ˜?v‡Сc–1,f3Н}a`vЊЉ н%Х$џ�йЯљжЋ—M­6Œ?а„žUяь+47?нбМГ’GН_!7loZИ- ›QЕ.@/+PоGц{еygСšп.ДаuЩ*JR‚IRŽуB—­PођнЗ;ССxє zќыЭF!+/)Я†ђЇъ#ЛhŸ›*НE!_l1нo VG%XўЦ­4ˆ›ЌoЌFicчsŽ+ ­MЁЎšжьУJSYмуЋ8юIЎ…qЭ?с-…ц"8•мЪ+?wЉєнъ…UPъ‰+Зћ-ЛiзXu}ЮвhАк‚‹ЪosЪ@јˆЧ<zœ}�Ўt‰­/vћ„™1х)BВу'”ўН54КВЮе2n7Іўй%аІлSУ%”žR“См ѕ€U™т_„-=Z‹HНC{Б›9к=SээдMuс{вzЪ%Ю MВ ™МBЯ9ѕЃYК„5gккђВ0о>•ЪэЛ" э­lМƒдFЖWіХй uћЊOЏИЂ&УЯ*вФyˆяЎ­?�ъЌѕІ;%R 4ћщС)Ъ  іћhО=%Џd7эѓЃWo УŠЪСѓœ „‚8ЯJ"Ј7Vя2Ьu…`ЩFG4тcГЊ'Уy@ЎBюpяЧЯћQхкіЭЂjўвcЕ i8Yрц”яLƒyИK˜ФЄуФЃїƒr@шzжеOg—lŒДXjaФш‰Еџ�АЎŸ‘ћ=.0RœAJЧ^ФчЕ „­ЪРRЖ…,…tœ|ыm‰œЎ3фЉ!GzЩ $і?ыџ�Мm­–кyТД„ЅD+#жЏTяoV_|ŽѕЏSО:—4ъ5яВТћќиїљJЃЙнуBI[Š>yЅЎъчђѕЅyдР-mлАА‘ё=Ž}НзZiЉW)a(>њШ$ЈŸ™ЈŠмu‘ƒ>gŽю\}МTхDэл$gьГ\n/]%yŽ'�pлiш‘њšnxAс’&­Z‹P6[ЗЧMЁС€В;œіiсџ�ƒб-“Јu‘KmЃ”Es#…]ўkЧ‰ž)ВZ§—kУqгТG^…@tеU’GHтї›’ДœтуrЎЕeТыЎц9fгLЦ„Сq)р!8j•юHк”ѕъq€HчYбfлn15ЇX˜кЮ№АR Њ/в!MБм<Ч(RзИКžфњгn[кХ&n№ЄDКь Lждœzž˜љў5с|Jэ/тЌыK_fЙ!ršЦдИ“…ш}hяBШГj)RЎ2$ HyмЉЄ/:qA:СЛнЁnЛmм!'”ОЩ {Ш 7cЯДIЪƒБоOE$”‘ѕEиsуСЛ[б /`#юќXщ@beолЈ‹osЭi-…”-]qж’vЯЕ%Ќ€мѕ<ќ/ пŸZпџ�ђeШЫ~ZЃЃЯuJШ�ADMOЉЄЙB—ІDнЗаŒžџ�*jАcЁУЈF@$sзЇуš_Шжi2S%oЃЬGн§k*ѕХйЦЖЧСы№:ЯMPњyDЌд/qШcvаLД’[N6Šћ‘Б\•`dœtЃNЄМ”&s€Рэ^œvћq`!ЧЄИЩў9„ŸІjuјыmњYŸŠš8УClжцŠuVЄa7ќЇ›’Д0–Шg! Њ=ћ}h*MЦTЯjТ сОЇЇz%Аxq|ПHCl0pЃЩ�ѕ$№)Їd№ѓHhЦ~лЈц1:hL6WПŸ|•A:ІRаlвn@бC:G8žєО№ѓУ)њВр—e%Qmшжѓˆ8РэѓІ.ЋеЖ=+aUƒOlm dIBvЉгщžІЈѕЏŠAШГЂиŠƒћЈБШТGmФJONИHИ>]}y=‡aX5ъчpvх1OЙРш„њ гЉRˆЅJ•(ŠTЉRˆЅJ•(ŠћMъЛ†›˜лб^Ф+p�ђ“э] Ї<Dгњівmz…–UИrЕ3ыъ“ю+–ы#Œшu‡VкЧE$рбГWјђRэЧL<™‘UЪB‚—р§? Z5tе:AjŒ‰Ђ д2~GЇхVzХMIaq;&-m‚2Ÿ_˜шh§%iнfЪ#ъHM)ђ6‡б№,жˆЋ4яŽ)ЕZбUЉkx�уJ/дœїЋљ^1iЋД=yЬЋ…4sљqC3ќ=в—mƒЪўэѓјŽ?*бsТGйЏPф%GГЛqѓШЂ-ћŸŠьЩВˆАaИЉm’u\%#зќЈ1›хЭ…*SЕ™N+s6sьhк7ƒ љ Иэўk<”’@њbЖš№†а‡PЗѕ,тк‚M.Љх4З) ?ИŸ Ѕ{^Аu ŠqY€ўєЪwУ-ЅИюЉaj#сBXћЫсѕŸЩqљRe,$—„ЅАxіVќxЅ\qѕL}›Ыоз^ФŽш”ЅЛе§є…]мFNд§�ызчLНрœй76ўŸБлR7­o…Cа$єљž*бяl:q€9lŒгМ5I8=Г§шQx­ЈoЪP\ЅЅГб9р|“аV“очЇ•ёЮsмnS‡Px‹bажЏйzr3(Ci(Њ>ЃКОfЙіџ�ЉЇъ N;%еmZЗ“’ЃъOzЊ~Cв\.>ъœYюЃšХ^W•щЗЫ‰qЕ-'!@рŠfhЇiщ ЂNVо~.Nеџ�д;qK”EањŽбЃ<IЗЖж‘oОœ$„Ѕ<p~tžОh=Ab%oло[сд'pРѕЧJЅƒt™nXTgжŒsЗ<~ubёjэnЫoИTкИPPо“є=(ˆЮmБЯ2 ЇЃЏЙmxЯвЌЄы=C1Ж§бѕ%Ѕ qСѕЃЧѕV†Оз+$TЛЮ\hЉЃ“пвАˆО;Шaф“гEJОЎьк{ЙN˜Д+Ё€=kЙ–Ж>Ыn’кћхмvњбпиМ<mNУyФёЗt ;sљжу"2”ІФЫŽgтS’ПЕ)кšћ XŠуЈ  Ћ?Ї_zі–Ўw–‚eHўTќJІКѕЎŠŒЦгіФ‘Ш•ѓZŽјИ#6ІрХŒРЦ?ну„~uьШђн’rрОэYPи</ЛмGк.I§Ÿ`ЉOЊС=‡ZiZоаžВъс…\юh<Д�”{ŽxљѕЅзФKНЩJУ…!G''’h^Lй2дTћЫY<ђxЏ т`ы?юZ…{tќ9 RF‘пЙї4ИqХКтœqEKQЩQ9&МдЂ)[ІШˆЌВсёкЕъQ­ŸФ{ЕБдЉ2F8ЪUŸЪ‹‰QoQОЯvЗлІюоЄљn~<RzЅ5Umаw]6 фЖ ­е… JЫmN3ЉЩ!З[ учK4Ктт“ђ8Ќэмf5їd/ъs§h‰Ž|;гЭДVuN/JN >љтВВ9С77ќд№Ќ6'лк—BїqOIџ�Б?кАЙq˜щЪф,§h‰ЅнЂрљШ•,e)##пЙўжX-. и 4pW%{ШњN*CЫћЯ,uХDL›з‰ђц%HKфЇђуЇЫEЭОЬ™”ю ѕъ~g­VTЂ)RЅJ"•*TЂ)RЅJ"•*TЂ)RЅJ"•*TЂ)RЅJ"ШлюВrгЋG§*"З|ЙЁ;S5мzfЋъQ™д7U™Žp2Ѓ^?n\Пџ�[ŸWдЂ-х^. 2—єР­Wuяё]Zџ�ъQ5ŽЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅџй���������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/icon.png��������������������������������������0000664�0001750�0001750�00000012434�10476334264�023377� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€���Q���•>9��� pHYs�� �� �šœ��ЮIDATxœэypеЧ?н=‡ni$Yјlc,`Œу`|`;Фй ц(C–ЭЕ!йЭ&й#ЩVЊіЊк?В•MU6›]ВYЊRY6ЧBK‘ №…ё}cŒ%й–ukFsєЛіFЃЙ5’H–oНRНžщ~§њћ}яїћНЃGьрЬь™ЎРџwМ#Р уfя0УxG€†gІ+UŠ€ Ba,B§>Є5ў /Ќ„%аѕP hCњЁ.С[pЬЬ<Exлрз\?ЬК~Ў VЕы–йu-оцjЋЦ‹WkКCчdЯ~йћœ%їЯТь„[Ё:­ ŸЧСВа!P*ўёœƒpNAdкŸ-Ќ8†Ем~йГu`iуезњ–Ећ7;MЦi”2JiЅŒŽgЄQЏE.Пpф/јB;l›Ж6-bю\ЉЈРуIh` B0<ЬаWЎpљ2/20рs^‡}а5“>Š™ ZqзEьh]иTЙс]ўЊЌ*e”2Z™ТЛVFЩ„іўйЉВNx Уlи@}=Žƒm'Rj~тa(Ф… œ=ЫщгІЗЗvУ‹3ЋФLPЁxА“OœПЎeёіЊ­K}‹Е1Ъ(Љ•JДz­H4љ„�ZiЃeрŽЧыЎ�АДƒѕ_ХŽцa<‡6}}=ЪсУцТ…3Цќ^„‘щІbКА ;.ёчoДЯkнQ}ЧbпЂxK—F&эL<“C+iД2Jk-§зьm§фk�4Тv№<‡§hщ$yэ5іяvwПП€7Іi`yП=XcэЌЙkЕ•N%к(iД6Ji4§2Љ‡VЎБї,јт_SМЄЕаЖРў<ЮpAŒчеЩВ8ž]ЛЬсУЧ„x €žVX6х7ёўфMћk'ЖЕЏЈўуѓœЙ%Е”F -Ѕ‘в(iЄ4Rj%ŒZХѓв(ЁхЅXї/+—oК%Yо"№ƒq s c Цђ%Є†nИСZПОХяп|щвz!F sЊCиЉръ0МоВC&№Щ›+зЇ[h‘р]'иOˆЁуz(ЁХ€|ehяЋС“сeпФS•,в‚&0 mЬЏ "WыBe№ћiogгІњккѕ]]ыcБ tN=S,Р—љіСѕ‹Wўi§ЇšœЦ8зТˆDЋOp >ўW%Дьq{wяipOŸ;РМOгђўдR‡@@=Xu˜cT~Z)Вsи6 АiS}Uе†ЎЎеЎл=SСа”љ�Џс+Ї|\ЙЏіž kЁdТЌzкQ+/ЕŒлziTGЄыPшXgє’1ЦУКНTЕMМCДСМЉь+нrf,ЦѓЯ›_м#ФwсJyyš‚9и`>]џ‰Vg^‚њQЦЕЩрicЪ=>sdфxП;ˆБа`, ЖГњћЙ` infж,Цш+œт]w?O==zє1xdЙЈš„yфрЂkZ>YџбЋfŒшdŒ#hъa<:v|фtTE1 - c\џГяШuЛ{с‰DжыЅЁ@€ЦFёћ‹nђЙ;Šmsє(O>y~hш_с\Yи*З�зѓo˜Лє#Ешр$|­т+etЪhK]tЛ†ŽœœзZQŸ�Д…]Х-G№дфКуGрбLfQ]M @ @S�^oўPˆЅr]žzJюлїcxbђ]ЁЌ“qkјіСM7нSГCэj71М2)†о(Ље[БŽ}Сз;ЃvF3Юь$eм’‡}ВNЈC(D(DG€mS_OSSТXежŽ#]ыD>™™x˜<ЭqИї^Яђхї?ёФъ‘‘ЏOв+”/ киЧУ‡Ж6mњ`ѕT"Ў і1ОZОН№ьр ћƒ‡ep”єіXh c1џiX•чОУ‘ќЕ3†h”ў~:;9}šГgщщ!УуСу)eаавТЊUMЗ uMf6ЉL&hsп:МНс=яЋоЗјЉ]™08—wwwF/kуz|“OSbѓ‹дЖчЙѕ№єЄъ^[Ыœ9ДЕ1w.>_qq”ж<ѓŒyѕеЧрJВ•C€›јЮС­›n­кš 1Sg1ƒ*Д+ИчФШ)“Д6у2Y”№Юbћ!,+ЯнзСžЩ>A>­­,ZD[ŽSDфК?O?НKыoAЌи›NкЌтсCkЗUНWh‘4њ‰ЖЏебШ‰—†wЧTl|Ÿhv&hPЛ2?ћІœsЩЎЫЙsœ;GUээ,[FmmfvИz5uu{lV,і*ъІ“ѓ Т|їѕwЗЌИЃњ§qК_KadPŸ|с@шRzBcЯdpRПвsnЇeS>Юрo@•ў!ннœ8Саuuј|љ]Bc#‹5?ОZЪН-ќ^“ ЩхЛкчЗо[ЛC-FЇqт™ЗмŽ'ћжуіŽs­5Ш`њG3WŒњ|uы‚Џ—X§М0†ў~Nbd„І&'ЕЕ,Zдpђф)wО№YЊ�>ЭУ‡ц\_§@нNАЦЂ­Є‘GТЧ1јkW‰ЬЬІ6іt%RZђY*ЏЪSW!з0Й 0†О>ЮœЁЂ‚њњ 3KЉљšЎОКіјёUJН n!х—*РпŸЌйўpн§~Ы?nVYЫ}ЁзwїcђФ9™{C2csн—Rg@3у)xЎ”ъ ЅИpЁ!цЬI,8gK55Ьžнpђф c^*d˜VвО u:wwп]sg•Uщjс*!ДZКJь мz mЅ8Ёc‰єПёˆhьC mсдрoЬ_“ЃЅTПdМљ&Я>K0ˆЙR[лЗЗУч _QŠ�+†љт™-Uя™эЙЪеТеBhсjщjq:rvo№Рx~гˆN•dД7шДC žІќ!АПшъO§§<џ<ЁP‚k)3kАl7мАvц-АHъ$џ|tiЭт•ўЎBKЁ…kЄа"Њb{‚„&ўDf3є†I’} ЇŠЋ~Y04ФЫ/‹!Ў›Ем|3ГgпyFђE №•S mў­UЗ-ьkс*сjёVДsD†ѓ3›УьЄžя-Рўь/уЌpqИr…уЧ3є€дC­йВХђx> Е9Š*F€лКэлzЖWoБ-FyЃр\фќ8fг ЮDГcВtŽxЦЉШ_Ÿ—‹Ј{йqњ4С`Ў 55мxc|*G9 аьђзЇWWЌšх4Ї˜ўИ’1ыŽѕЄ§l­;Э› чАќљЋєBЁuŸ (ХodѕЩоА|9MMauЖr рЫЇЕЋќ+нГ#”tЕp•{%жы*‘ХЧN }Ђ7žш“-_žњaoСlM .\ Ю)Х7Ы6ыS˜�ящЕЖѕо\ЕNiх*7iv†H‰юXoAЬf$MГ”LnќDQt•Rвй™йЄІцfцЬi…[2R€�~Э_ž]т[мh„I№њ“#€>w Ÿщ/F6гŸL2п0ђgEѓ5шъЪгтiљrрp&–PРlшўVНВb…а"ЙSSiпЏЉДZ‰сќГ›й†Фg)TЮјFСЯKЄЌМ‡щыЃЁ!Яti @CУьСС5А;­„|щXQБТ1ЖŸmжJъб§šZ)­†eP)](ГЉJЄвЮtsNf‚ “cЎ|шюІКлFЉq‹iЫ™ 08xkёќб…ъZџBя|WKЅуГќZiЅДR:Б“gРЮвЦгЯо9&žЪUЋŸLŽГВb` БД™КЖœš‹бв‚mЏд:�Љ—чє.ї\\ц_ЂДЕјR(O‰`TЩ eІ2#ћiБ4гŸt‘сЌЕ2№x™Ш+”ЂЏ/W<OЖMCƒkв.ЯйюыЊЊ№Яі\х*‘XeŒw‚xѓO˜##cЖЕЦlf'ѕЬp?ЦdžzN—Пr``€ККЌ yииHџ*јeъЕйЈTьИДа{ݘЕбrд ыЄˆ)з•В fГ™Œо;&6LE}†Š§АмќM##D"ує3 P] ,+5ЪЮ.Р{{=ufЖЇE(Ї>БPыИqotGŠ1§ЙЄд3Ё+№ƒ)!q’JФB@ђАЂЫj0Іњ’fріЫ-ž­вn<ьIщ :‘W*,#cЬNрЗж6­•r^ЅnєъzЏn№jŸ…cсБPЁ,!‰J;(ьСЈнqњ"N_ищ {”ЖюЄyТž”чˆПžїvC0˜ˆ…rЧЃ^ЏхКs `–ЫŠсYЮ|7ћыTШh­•вQщІВ?ПBmnvзмыыХuѕВЩЏ ˜дO‡\ 9]ЮбЎшц71o`Ÿжœtшілќg‰M5„ГB9РugЅ^˜E€}>лW_(™Д6jtќ5кќЕдR(‰Ж–зШћ[#;чEзHЛЪЧУыa~ƒZРa+eшЈ5}ѕСŸк‡с�€7f~2bFFАЌ<и6iГгYX=XoзЩѕуy'ЅЄV1щЎ­џА<ИuVlђМЇСp$ЕHлІљ;іVЩжбOa?М/У^ШЗNbБФ~ьXрMН*“�Жск`•ет*‘віGйW:ю“=ЈКЎїЁ…CeЇ~Ч@ЭŸ `Ця‚n€mА €ьƒри3Cы4Zтѕf югI€:IРѕПЋ’@)mт­>ЎD“W|џн}k‹лV$Bp&ЙiУќ[Ў=g~ися ž…Їс—s<]~И.9Š+Ёiл3 0'jл\-ДжJkЉЕRcцшкšиу7ѕЖUКЅmG-†WЌИ�C˜ozU<�@žС3žКZІ ўi“ЉyЅHk™І"Њ”Ч8B ЁЄЋЄЋ„nb*BЩѕ #ЯnшnЋŒ1ЏбюP˜?Kм E%м Aќ;Ќ.d—ШЄЁдИˆд5Kз а›z~&,а–PR()”pЅpU| Hов4ђПыЎ4xХTЗ§8 ϲטЛг­Бh€‡`/ь!пbлda JХg‡ŒJWˆ˜Q!\ЅTкvтL;у*”u[ЯђJЅЄ’R+ЉЅTjsSј'k{+щ >ўт‡Cс{Vљі—ч цТј(xсp{K†(Œдzи˜a­ЕPЊWЉ3№›дS3ѕ€K:f\)у6G()Є\Q}lM_…=- _уў ЙпІђт'b,oљ­№U8_€Ъђ …A†ˆ@TыЈR)#RFрXšёШ$@Ф1ъ]щJ%]%…”њяњзDЃ‰ IJ%о=//tї{ЈёнŽw7€CП‡Э#<jЪmєZрыp ю*ЇoУPœwˆBd4E‰haBcЪВ9ЗЧЏпл­ДжZ[кzјКeЖH]w–)Q ЅЦЩPШvТ 0ˆc˜ЏСЧ№ў�ћђИ/m\OFйcXхаRв ВЂvТЛсхЩЦЌ†a\ˆ›’’‡gс@кeй_QњP'ї^Ф№ГЂп˜гoLцІВe,+‘rCœЧzОч`~Пn№DЙЯсЫ>Ў/•ТбŸ{уИXФЭNdJуѓx‚iWц|Gь—y ѓЩыЛчFEnв“љoЕ%ѕа }�ычшЇ№Р{ VŒ­Ÿёr‡=~X?y| ўЊˆ)&‘Q[?‘єдO\јtL,"ЯKz  <њХпЪeи6vvоѓf,yЯnьБƒЇ{в–W2Gq?|иЧЛЌђ™ёŸТ‡2мыЈ F K, яi‡1и•mAЖpљsжn{1жœ58­иlЧЮ,٘6.tbХs чжaМƒ8`ƒMzЦbRzк5wС]^nДЫёъљГpзXчНЂ3С+9†‘yиFзGй7ЦT=іœЙиMX xќи6Ц с `uуЙ„ЇGdр:Ѓ�iпкЅъ!ИJГнтV‹­^ц_РОŸС€UяqГsŽчžЬ#Р5ПФ ‰Kц3вšуќ3iyk4 +ЦR‹ЭА жyИЦ.RP;q‚›ш‰n6™3pЖз%ѓПЈ§y^^HOQ<цІ„>‘&v‘zX’&ЭxЌ‚•‹œМїдЕ DrЕїДЏFр-ш€Ы…‡љh$ќq^ )§Іdі3КЂњ‡ЂJqa™Х‹…††Г-jœё#г‡>Bo;уBz zс чйgUš�@‘;йЗ€~Ї`RŠ:­4{•ЃД"э€СVдIš=Эе6UЯ2ыƒ\EТ)ˆqG rєnЅЃапŠА0KИpgЎ"T,AХ6іміЊ„вJа#Ž|sИmJчПŠ§Бs=Kш\Hw#БВјиЉАWЙ3…ыa š;cХ–ТQlдluгвMЫKш‚ГщkfИ™ЁfB5H/І,ЭПIЪ"y2eгУ`щ)^Х)yиb‡Ј?K§йФЁіЋ"RKЄ–H%юh>T<y0ЦƒБ,kдwЦg(*‘ѕˆњё*Nо^XHЖї-*хлU€4и’Ъa*'З7Dћp›ieh! œOШ‡)ЁБ"I!j§šцЉ^�yлќ�лЅт"iŠПч#v5}Kш]JЯB^LQі-c_)Њ{} ПWZ^Ьє?p(5„—в}-нKщЋChЏв.|РN6›)6AП3$a#[щ_NїrК[ёŒЗQ%§Œ*ьГёМА?9ќю SЫШК—бнN_5Њ?ьdбр›,ŒЅг№ ПгŒСAДвǘ+эєДђ”фКDd=Ъ5?тКiйFєћ"@**ЯЇo!} щ›CШ?ъК щTџзcюєАЯяЅ�Љ№›Ха†ц28‹`3‘dš$ Лџ9˜wŠйg:kј{.РhЂ‚˜щAЌ(ž0~‰ьЉалj0 А%ўў)не]ўв„1`›Л����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/tutorial/images/design.gif������������������������������������0000664�0001750�0001750�00000005404�10506736316�023676� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a’Ў�Г��„‚„ФТФќўќDBDдвЬ�Ђ���x„€hцh����€`�hш�����!љ�����,����’Ў�џАШIЋН8ыЭЛџ`(ŽdižhЊЎ'Q p,ЯtmпxЎя|яџР pH,Шф0рАžаЈtJ­ZЏи*ѓU�xПрАxL.›ЯшДzЭnЛп№И|NЏляюТж‰яћџ€‚ƒ„…†zM]‡ŒŽ‘’…=^‰\“š›œžŸxNL—{‹ ЈЉЊЋЌ”Є�˜|Бl­ИЙКЛЂ‹ЕДАВПФМЦЧШЩƒОХД‰ЅŠ—ЇЗЮгДвзЪмно ЬЇеТІв_Здштъцщтп№ёђсФфбиэлРьиюѓ ' ј2щћїЎУ}цJœH Гˆї,Х*Їрv�џ=VI2žЏlФЮкvЎV?{ўЈ•œIѓXН *в‘YГЇЯ]7-фМьЇбЃЊXЪДiSУJ:€еЋXГBхHЕЋW’QПŠ+pX–ГhгЊ]ЫЖ­[ ІоЪKЗЎнЛgутнЫЗЏпПtѕLИАсУ#^ЬИБcЙŠKžLЙђ‰Ш–3kоœ3чЯ Cі,КДщгkIЃ^ЭКѕ еЎcЫž WЫ–bUcцƒni Ÿ9xю Л­ч\[ngЭ‡K'\мхq бЇ,п=;KчгУЎЎ-"єs Ez\мќ5є2еУќнх}њlИQŠп?ЅјСњ�жџ€хЉC €оа‚ЂCпюF_r:и`‚ќeXyжѕa€ Yh` ђєрoј Hч]ђа;#j(Ѓ :—Ђ…7~ %‚ Šќќшуy*2x`3&y™mжuи :Fc =ъх…OЊШ„"rЉф—#дЈe‹тпњfA‹і•9 57ŽY!‚јЅ ц1‰чž|К[Ÿ€ ХŸ‚j( z9ЅшЂŒ6ъшЃ‹щЄ”VjщЅ˜fЊщІœvъщЇ ~Tž\HР„VЈІЊъЊЌЊZЊP­Ц*ыЌДжjы­ИцЊыЎМіъыЎЏf(J;�БСцiьВ1РьџГаF+эДб&‹“LP[У(ШJJЌЖF8 юИф–kюВжТњjЖцrы„Зч!nМєжkяНщV0Ќ �€ЛІОнbРюН:ЬK№С'\lОЄњТюўЅlО`б§*aАТwьБ gДюЗ0dLmQйdK1Щ&[ŒqБ,ѓЬ‡l*Ж$ЛЌ-Sc0№Е1ДŒ„асвlєблlV"ќ"ќ3ЌAз�БЫ^]uЩW]DЬHwэѕЩЃŠьpЮZ?ыюЪQпаoж:SuйCp§ѕмt+ЁєОiŸМЪ№–,5Ф&Џ=Cm#!wнˆ'Фн87­m›-ё-0Ы4оЖрŽчmИџтœwўу#g>-ЪЮHДпoЇюЗхЌУьљыАл�њичо6qпX_m1рiOН{Цp qxьФ#>{FЕ#yѓЛ“=|ёа{}ќђэю§4РЮGЏ}тг3mюЄз+kєѓл—яqїƒ;+ѓЇгLОљ№'іЭЁŒіјёч?3њƒIzшџ™пвŽ†§№€Ьт–в�ШРlŒ � %С Š‚Ь Ÿ0ЈС~‰ƒ Ё†@(Т†‡„&L!mHƒРgЙ@…{bс_У;Щ№[ЈЁ ѕTюP‡?•С”C *щ†‡*Ђg„DC)q‰#ф!†јœюŒ`A$АS žEўџ48;j’šЃEф\ Œрb›”w4NЉ‹Vј"•˜s6^ёŒQP#ˆЖуF1†Žo‘cЯ‘:u„-AЯB‚k, ;fќЃ‚№ШРHqTdŽ™pєЄэHJGђфœ|&кёMЭИЯ"§qHм8ШEdЊф/)Lz`‘(:HœФш!]>0z$%!"/hHFкЃ‘Ž)ЫG  [ъRŒШшЧ}”42ЅџE'`ў#JоќˆО)Щf‚@w,&КфЩђ˜№,’0ЙЩh.SHё$х8йiN ѓŠ(Iф™й#ћ„H7]G7gIЬ7ŽrNёФf{|љЦ~&†џ–<LГ‰œ„кшLжLшвУ )дЂ"јЇc6Ъа,АT/5ЇJcЈЭ*ФT“њAi1jK&жTЇЎ™)žєдеѕ‡EЭQ‰јгЄЂ†…ЁŠЊTЇ >ЇЪ†4ПЪЊVЗ:+ЋЦ…^ kj0*жВЮЌfMЋШJ˜2ЋЉjнiFћвS5ЎЏ`kџfˆз щ0ub_ѕз�ђuА)-Ќ_›ЁЛ"vrsх cНзЧBvВtСlG­гбTжВъ Й3L)hv˜бIг.љтXа6lŒлŒm?pZzF’ДВЕKk]K?бцVŸГѕ@mэЇ&в8Š4(OŒ{SuёVОџЕF\в“ Д‘9ЂђS +‰ђ ќ№n29њ\ы…lДћ Ѕz]в“^`ИФьe/Ћ оuDhЄyќlyUCFoJsНКьфрKЩ­6GU/5ŸА[ођ—žEІx­мZFсMз0‚KЊa,Б СЎ}0’"œa~О3Vnu КЩњЎRЁљiюЫ[›ѓ’КуloŒqМLяЄ/2О(kќу†BЁШr'@ ZДvжД‡ђЕ"Л$UПЯurfЃ,хZ9 _f “-ЋхЙ„йЈXvАbщJе6Л™ЊiёšљТе:лйЮ]žђ™ѓlж2ѓYЭTўГ”§,h2ЯЙаC&єџ~пе=‹FбYОѓЏНHЋйcсы“ЅхœМкАOP›nrЮЦu6G‡&д†яŒe[ІQZ<Ј~ьУtg9tI yЏ>сЁ]БZC‹tИ65h(dЈі лiѕ“—ІєZsЬт™|іщ@ШuЄ‚7jOп`ȘžЮлХЬ•щ ЖиьЩЖvд”NnЃrю7Д“PjРУŸч^#B•ыž&‘”‘Œ\гqUЉт‘rЂњ!Љ=žK~УФKПХžМQЧjыU8ˆГО!ИЅ}+XžE’R‰—c`pœŸх‰f>GIЇiƒН.пiц|Н0IУt<6ƒ5юWއМУСєpЫaџдm ћЗ›№ А;…”r’ВуЫE%‡Ы),ВёKw7QАэ­ѓѓœА>Ч'а­ѕ—ћ{ФbŸњЩС3бЅ/8цўф{Є{бNдеЕэWcHБё!B=юL?ћ>G~і~Н(7qzе™ve†dМUЗ{ŒpоЦЎПцыЅ Л}Ѕлёь:"+ЮЉСq №яИэŽёмУЫyf.§;y•<аr] ЫgѓЅhEЗ_tПїQƒ |ЇRŠХ)u№НчЖT2g”ЏTпSk}ДП‘[QПт~зNŸТЂ‹щ;IїЧЛэ­€Н’ШћtцЫ}№ќO@.яУŸљё#њ/z7іїе§Біп_3љ—nUa„еії|€іц$еWJˆ€тЁ€іЦ]T—Xг!†Aьw€h8ычlиї›‚д1‚чT‚&˜(8H‚ўз‚+хжзw4H/шY˜ƒБб/Œ„*(W6шƒМ!iHh=h„ЌqoШЧ„ykPиLR8…•T…VGX˜…PДAј…`†b8†dX†f(†I˜†jИ†lи†nј†pxg��;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/html/stats.html����������������������������������������������������0000664�0001750�0001750�00000050444�10653654112�020652� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"> <title>MRIcron Statistics Page
MRIcron Statistical Analysis Tutorial
  Introduction

Important note: By default, MRIcron has the lesion drawing tools switched off. To turn on the lesion drawing features of MRIcron, select Help/Preferences and make sure the "Show drawing menu and tools" checkbox is selected.

MRIcron is designed to relate lesion location to behavioral performance. For example, it can help identify brain regions that are crucial to language production. To conduct an analysis, we will need to conduct four steps:

  1. Lesion Mapping: For each individual, we need to map the extent of brain injury.
  2. Specify design: We need to design our experiment, creating a spreadsheet that links each individual's lesion map to their performance
  3. Compute results: We need to conduct a voxelwise statistical analysis.
  4. Viewing results: We need to interpret the results.
This tutorial guides you through a lesion data analysis.
  1. A copy of MRIcron: the version will include a folder named 'example\lesions' with the sample dataset described here.
  2. A copy of NPM for Windows
In this tutorial, I assume the lesion maps and design file are in the folder c:\dataset, but you can extract the files anywhere. Note that by default these are usually installed to c:\program files\mricron\example\lesions. The sample dataset includes simulated lesion maps for 23 patients. This folder also includes .val files that report the performance of these patients on a letter cancellation task.  In this task, patients are asked to mark each occurence of the letter 'A' on a piece of paper that was cluttered with letters. A perfect score on this task is 60 (when all the A's are detected). The file continuous.val lists each patient's performance on this task (a score of 2..60), while the file binomial.val lists performance on this task as binary: patients missing more than 4 items are listed as having failed this task (0), while patients who missed 4 or fewer items are listed as having passed this task (1). We have included both binomial and continuous values to illustrate the statistical analyses available with MRIcron.

Right: A sample lesion map (9.voi) overlayed ontop of the ch2 template showing injury to the left temporal lobe. To view this map, launch MRIcron and choose File/Template/Ch2, then choose Overlay/Add... and choose the image 9.voi included with the sample dataset. patient 9 lesion

Lesion Mapping

MRIcron provides simple tools for drawing a region of brain injury. However, it is crucial that all of our lesion maps are drawn with the same image dimensions and orientation. Therefore, we should either draw all the lesions on a standard template (e.g. File/OpenTemplates/CH2), or we need to first normalize all the scans so they are coregistered and then open each scan using File/Open.

  1. Launch MRIcron and open your scan (File/Open or File/OpenTemplate)
  2. Select your drawing tool (these are listed at the bottom of the Draw menu, e.g. the 'Pen' tool).
  3. Draw your region - for example if you use the 'Autoclose Pen' tool, simply click and draw the border of the brain injury. To fill in an enclosed region, simply shift+click in the center of the region. To erase part of your drawing, hold down the Shift key.
  4. Repeat step 3 for all slices where a lesion is present (e.g. you can adjust the X,Y,Z numbers that appear on the top left to select the desired slice. Note you can also use a mouse scroll-wheel to select slices.
  5. When you are done drawing the region of brain injury, choose Draw/SaveVOI to save a copy of the lesion map.
  6. Repeat steps 1-5 for each individual, save the lesion maps from all the individuals in a single folder.

pen tool closed pen tool fill tool circle tool 3D fill tool
Pen Tool Closed Pen Tool Fill Tool Circle Tool 3D Fill Tool
Left click Draw line Draw closed line Fill region Draw ellipse see web page
Shift+ left click Erase line Erase closed line Erase region Erase ellipse
Ctrl+ left click Draw thick line Draw thick closed line 3D Bubble Fill Draw rectangle
Ctrl+shift+ left click Erase thick line Erase thick closed line Erase 3D region Erase rectangle
right click Fill region Fill region Fill region -
Shift+ right click Erase region Erase region Erase region -
Alt+ left click Change view Change view Change view Change view Change view

Specify the Design

Lets famialize ourselves with the dataset we will analyze.
  1. Launch NPM and open the design window (VLSM/Design...). A speadsheet will appear. Select File/Open and view the file continuous.val. Each row shows the performance of each patient, for example the patient 1 identified 2 items, while patient 2 detected 44 items. Note that with this software higher scores reflect better performance. If you have binomial data (where performance falls into two discrete categoris), you should denote the presence of a deficit with a 0 and healthy performance with a one. Note that the filename listed in the left column and the performance in the right column always correspond to the same patient.
    Design
  2. We need to first describe the lesion maps and name the behavioral performance measures. Select View/Design to bring up the description window.
    design 
    1. Predictors: shows the number of behavioral measures - here we are only examining the letter cancelation performance..
    2. Predictor names: for each predictor, insert an easy to remember name, e.g. 'cancel' for our letter finding task.
    3. You can select the file names of your lesion maps by pressing the 'Select Images' button to select the lesion maps from all your participants. You should select all the images simultaneously, and all the images should be placed in a single folder (e.g. your lesion maps might be C:\dataset\1.voi, C:\dataset\2.voi, etc). The lesion images can be in MRIcron VOI, NIfTI .nii, compressed NIfTI .nii.gz or Analyze (.hdr/.img) format. If you do select images, make sure the filenames match the patient performance, as noted in step 1. 
    4. You can also set an a priori minimum lesion density threshold. For example, setting a value of 10% when you analyze 22 people means that statistics will only be computed for voxels damaged in more than 2 people. A large number for this threshold can increase your statistical power, as you will only compute statistics for voxels that are commonly injured. However, larger values will fail to detect rarely damaged regions that are reliable predictors of deficit. Note that this value is based on the total incidence of lesions in a voxel, regardless of behavioral performance.

Compute results

Next, we we compute our statistical results. You can conduct some statistics by choosing items in the Draw/Statistics menu of MRIcron. However, here we describe using some of the new features in NPM that are not yet available in MRIcron - specifically, NPM can conduct permutation thresholding and the Brunner and Munzel test. To conduct these statistics, you need to download and install npm.exe - this only works on the Windows operating system.

  1. First go to the 'Options' menu and set the permutations to None. Permutation thresholding can be useful, but it will take at least 1000 times longer than a normal False-Discovery Rate corrected threshold, and is typically less sensitive. Therfore, for you first glance at your data, turn this feature off.
  2. For analyzing the continuous data:
    1. Go to 'Option' menu and click 'Tests' - make sure the 'Brunner Munzel' is checked and the t-test is unchecked. Our data is not normally distributed, so we will use a non-parametric test (using the permuted Brunner Munzel rank order statistic).
    2. Click the VLSM/BinaryImagesContinuousGroups command. Select the continuous.val file.
  3. For analyzing the binomial data:
    1. Click the VLSM/BinaryImagesBinaryGroups command. Select the binomial.val file. This will use the Liebermeister measure (a more sensitive binomial test than Chi-Squared or Fisher's Exact test, see Seneta and Phipps, 2001; Phipps, 2003).
      Comparison
  4. NPM will now compute the requested tests. It will create overlap images of all your patients (e.g. sum.nii.gz) and a statistical map (BM.nii.gz for continuous data, L.nii.gz for binomial data).
    NPM

Viewing results

We can open up the statistical maps generated and place them on top of an anatomical scan. If your lesion maps were aligned to stereotaxic MNI space, you can open them on top of one of the standard templates (File/OpenTemplates/ch2). Here is a quick guide:

  1. Launch MRIcron and choose File/OpenTemplates/ch2bet as our background image
  2. Choose Overlay/Add and choose the statistical map created in the previous step (e.g. C:\dataset\binL.nii.gz).
  3. When MRIcron detects a statistical map, it calculates the p-values for each test in order to determine the false discover rate (FDR) threshold - e.g. how much robust signal is present in your data. MRIcron displays a histogram of the Z-scores. Note in the example below, most of the data has positive Z scores suggesting a robust signal (if our data was merely noise, we should see a bell-shaped distribution with a mean of 0, instead the mean Z score is around 2).
    Histogram
  4. Next, MRIcron displays the overlay. Note at the bottom of the screen the software reports the critical values: the p05/p01 values correspond to uncorrected p<0.05 and p<0.01 values that are very liberal (these tests will make many false alarms, e.g. here we have conducted 16082 tests, so p05 should result in many false positives). The fwe05 and fwe01 values correspond to the Bonferroni-corrected values: this test is very conservative, and you will often fail to detect real effects. The FDR05 and FDR01 results reflect the False Discover Rate - e.g. a FDR05 should show around 20 real activations for every false positive. Note that when there is very little or no signal, FDR is as conservative as Bonferroni, but it is adaptive to the actual signal in your dataset. Note that you can select the image thresholding and cutoff for your overlay. Note that by default, my software loads statistical maps with thresholds from FDR05 to FDR01, unless there is insufficient signal, in which case it uses the uncorrected 0.05...0.01 values. Also note that the current overlay is set to appear in a monochromatic red color scheme.
    lesion stats
    The image below shows how changing a threshold can change the appearance of a statistical overlay. Consider the raw statitical map shown in the left panel, while the middle panel has been thresholded to only show voxels with Z-scores greater than 2.5 (with three regions surviving this threshold), the right panel shows a more conservative threshold of Z>4.5 - with only a single peak surviving.
    Thresholding
  5. We can repeat steps 2..4 to load multiple overlays, to compare different statistical tests. For example, clicking on the 'tutorialfmri.bat' icon will launch MRIcron and load to overlapping regions of interest. By using the Overlay/TransparencyOnOtherOverlays command we can view both of these overlays simultaneously.
logo
mricron-0.20120505.1~dfsg.1.orig/html/source.html0000664000175000017500000000564510533457152021021 0ustar michaelmichael MRIcron Source Code Page
MRIcron source code

Introduction

MRIcron is written in Pascal, and can be compiled using Borland's Delphi or the open source Lazarus (Freepascal) software. MRIcron is open source, using the BSD license. Lazarus offers several advantages - it is free, comes complete with all the components required by MRIcron, and offers the potential to easily create native binary code for Windows, Linux, and OSX. However, Lazarus is still beta software. 

  1. Install the compiler. To compile this software, you will need a build of Lazarus created on or after May 1, 2006. This software requires some recent patches that are not available on the current stable release. To get the latest developmental snapshot of Lazarus, click here. There are still a few features that do not work correctly on the Lazarus versions of MRIcron. These are described here.
  2. Get the source code. The source code is available here. The source file includes sample images in the Templates and Example folders. To test this software, compile mricron.lpr. Next use the File/templates menu to open sample images. Alternatively, after compiling the software, you can click on the included .bat files to see sample renderings.
  3. The Lazarus version of this software still has a few bugs. For more details, click here.
logo   Lazarus
mricron-0.20120505.1~dfsg.1.orig/html/peri/0000775000175000017500000000000011660470014017552 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/html/peri/index.html0000664000175000017500000002127410555543346021570 0ustar michaelmichael MRIcron Peristimulus Plots
Peristimulus Plots

Introduction

SPM and FSL are powerful tools for analyzing fMRI data. However, the statistical maps most people generate with these tools can be difficult to interpret. Generating peristimulus plots can allow you to get a better idea of what your data actually looks like, and can help you determine if a region shows an increased amplitude of activity or a more sustained response to a stimuli. To generate peristimulus plots you will need:
  1. MRIcron developmental release.
  2. A 4D fMRI dataset (typically motion corrected and smoothed)
  3. A FSL format 3-column text file for each condition you wish to analyze.
  4. Optional: regions of interest for specific brain regions.
You can also click here to download a sample data set (14mb).

Basic Usage

Here are step-by-step instructions
  1. launching MRIcron. Then choose '4D traces' from the View menu.
  2. Press the 'Open Data' button.
    • You will be asked to load a sample dataset, choose filtered_func_data.nii.gz
    • Optional: You will be asked to load event onset files, choose both L_Tap.txt and R_Tap.txt
    • Optional: You will be asked whether you want to load any regions of interest. These can be hdr/img; nii; or voi files (note you have to pull down the file-type menu to select voi files). Select L.voi and R.voi
  3. MRIcron will now display a timeline for your data. If you have loaded multiple regions, a separate line displays each ROI. If you have not selected any ROIs, you will be shown the currently selected voxel - use MRIcron's main window to select a voxel you want to view and then press the red refresh button in the timeline window to see the timeiline for this voxel. Note that if you have loaded any event onsets, each condition is shown as a unique color of vertical stripes - for example in the example left hand taps are shown as red bars and right taps are shown as green bars. Note with the example datasets that left taps are followed by increases in signal for the right ROI, while right taps are followed by increasing signal in the left hemisphere.
    Timeline
  4. Before generating peristimulus plots, make sure that the TR is accurately set. Our sample data has a TR of 3 seconds, and this is correctly reported in the image file, so MRIcron correctly reports a TR of 3 seconds. If your TR is incorrect, the events will not be correctly aligned with your images.
  5. Press the 'Plot' button to generate phase-locked peristimulus plot. You will want to check the settings for your peristimulus plot
    1. The bin width sets the resolution for plot - smaller bins are more precise but noiser. By default, the bin width is set to your TR, in our example 3 seconds.
    2. The pre-stimulus bins sets the number of baseline bins. In our example we are setting 4 bins (12 seconds).
    3. The number of post-stimulus bins plot signal changes after an event has been presented. Remember that fMRI signals are sluggish, and take 5-6 seconds to peak. For the example, set this to 14 (42 seconds).
    4. If you slice time corrected your data, check the appropriate box. Event times will be adjusted for the acquisition of the middle-slice in your volume (e.g. all of your onsets will be adjusted by 0.5 TR).
    5. The save peristimulus volume button allows you to save a separate 3D dataset for each time bin. This is an advanced feature we will discuss later.
      Settings
  6. MRIcron generates a peristimulus plot. Different colors are used for the different conditions, while different line styles are used for the different regions of interest. For our example, note that the right hemisphere shows a response for left but not right taps, while the reverse is true for the left hemisphere. The peak amplitude is about 1% signal change. While this effect sounds small, note that we are averaging over a large number of voxels which in this case were selected baseed solely on anatomy, rather than post-hoc selecting the single most active voxel. Also note that the error bars are rather small.
periplot

Advanced Usage

  • For statisitcal analysis, you will want the precise values for the effect sizes and standard errors. If you press the 'text' button instead of the plot button, you will be shown the precise values - save these as a .csv (comma separated values) format file to open them and generate nice graphs with Excel or other software.
  • You can save peristimulus volumes to see precisely what is happening for each voxel at a given time point. The image below shows the 8th time bin for both the left and right movement conditions. Note the bright contralateral signal.
    PeriVolume
  • When generating peristimulus plots, you have an option of choosing whether your data has been slice time corrected or not. This will influence how the event times are interpretted. Without STC, my software assumes that the event times are relative to the first slice of the first volume. On the other hand, if STC is checked, all times are relative to the acquisition of the middle slice of the first volume. The image below illustrates this (assuming a 2 second TR): without STC, the first event occurs at 0.5sec, and the second event occurs at 6 seconds. With STC, the first event occurs at -0.5s, and the second event occurs at 5s. Sparse acquisition is useful for auditory studies (as stimuli can be presented while the scanner is silent, and we can then observe the sluggish consequences of this). However, most sparse studies will not yield good peristimulus plots (good plots will required jittered stimulus-scan intervals). In any case, for sparse imaging I suggest making sure STC is NOT selected, and having the origin for event times to be the acquisition of the irst slice. Note that my software does not adjust for differences in slice time acquisition within a volume. The whole 3D volume is assumed to have been collected at a single instant. Therefore, (for axial acquisitions) signals from the cerebellum will appear to have a different lag than signals from the top of the brain. If you want to make comparisons between different brain areas, you may want to slice time correct your data before generating peristimulus plots.
    PeriVolume

Notes

My software gives you a direct view into how your data looks. Also note that a single timepoint can be averaged into a number of bins (e.g. if the events occur rapidly, one scan could show a timepoint which is after a previous event but before one or more others). Furthermore, my software does not attempt to remove data from other conditions. An alternative approach is to fit each condition and then plot the data having regressed out the variability explained by other conditions. A nice implementation of this alternative approach is described here.

logo
mricron-0.20120505.1~dfsg.1.orig/html/peri/images/0000775000175000017500000000000011660470014021017 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/html/peri/images/timeline.png0000664000175000017500000003054210545127032023337 0ustar michaelmichael‰PNG  IHDRvТ”ЗЋѕPLTE‚„ЂќJ\ ў”ќфb„ќœ4Ю<\ќNєк”„‚„ЬvLќŠфŒўЬЪЬœžœœђќ&l ь$"$Ќ4DBD|dbdфўlўdдњђф‚„мкмЄЂЄ424TRTtrtЄ”’”Lє4lќўќŠвќЬммфцфєє4єњLўЌЎЌф"двЬќ |і$ќžќўќЬ$фBDŒŠŒМКМ,*,LJL|ljlњ<:<\Z\|z| ДўЬМќ фьюьєў$ќœм<dФТФ6l„L|фтфЌЊЌДœšœ фф"DДЖДдвдќќЊъќфќŒВќN\ўЌRќєФ цTTЬ^„†„ ЬjlфЂФЄўЬЮЬфЂ„ &l$&$DFD |dfdмў$ю момЄІЄ464TVTtvtЌ”–”фbDЌDњєєLќќ$tєŽ ьъьДВДџџџќЂŒŽŒМОМ,.,LNLlnlў<><\^\|~|ФЦФджд мќњќўф ќ0ѕЂw`д wgaVШnщёww§nўё€w|ЂCџе€w| DкQwpР‚єўк„€w|‚ЏдддЂwwŒ' DеwпШ6Bw$˜щюOјї јїд(Јжщšƒ|№чџ€|Lџ@џ?џwџ$јїџю€|(gджзBwса eД?дЂwwПШ/=ќ?€w|p‚$щўE€|ПНX=кж?ддwww‹жwКmЄЖ IDATxкэн‰cмШž№Ÿ t8žM€р G&Nїrd= "'ѓxА ;!L†cЙ1„Щ‹7№rрvйœ8/‰3\,хЎnuщ(щWUП*]ппюфЕћJЅњHЊC%кE ic›v3‘2ЖЮисрƒ@Є АC КbЗ‰@ E‰нЏў2ВHЬ@ИEЉ­dЛќwѕ%vŸlўСџ№7ўсŸ@N"|vЅ:[љяъ7Šь>йќќўЖЯўёњї7<-1.Ёщq]BхћёЖ.ЋЎ;cџJЗхЦЧэЫЮ"юЧГЃU0и§ъцoџќчхП§ЋЯTќо<ге5yoл‹“шК фJВЪj–Н.o–_gfњЬя_з'зТ.ЫЊŸ†nqљ№АмцwъvGiw5%ЁqAЎ_nYихьЮ^ыKь>љхѓѓЯ?џ›џќŒнgџшзжћбПќ8/€Я.ЋžП˜й ”–RїYѕНхвВЭђ)#x‹3^’šЗ.;D=ЛхцйюLмТ^љ"ѓї§ќѓŸў/џь‚нgОpјмдёќXКјџМих;к(жYAƒёнѕRѕљћЋ%šџ–?3NЇЦљ+_p]ЪVп(Є/п3uцЉ%џМšЊЬ`—6Ib‹ГR лeлыУР:Њ[БYЙD(%ЭШѕЭЭњдeе,4п№:йOƒнЎ>ћUи§§џќ џёўђяјЇAЛћ/›ХН[2ЗYљЄt61/ћ*_2Šj§ЂЪЇвЬ§^ќ%eFz6ЭВV87 м,‰*Џ_џW!ВХйfљrБКЬђюЈћUУVT7ЗЎ:a|ЙœIе кR€]•нђ:ГЬюw§Бџ­тќ?Љй}Vd—eьЊW"NьЪeУ8ьf–rc^[и­k›ev›…oЧќЭКТ[eglDсˆВХvvінaagfMщЌьРЎx9“ЕА›оХhрйю?§Ÿџј/§јOџўпј[Ї†нК\fиU4lVїoэсКTкыОk\жГ3зegW<фWšОьЌ[ЬcWмжГнцfхЕ+ЛšЬh`7С*``нюп§џљOўъŸљ=ё_џЦ?;sїЗЫЅШОЇj/2‹'чBИЙ)ХЎ”žV›5eЇ…нfV`W—Aо[legнuПŠШЎОж1еfЭlwеtйФЮк’Йљ›ъWўСЭfџ§wўЙџїйџњЕТ>+VЅЪ'“JХ:/YёHžQ]Цђ/лEfq‰ХvГMЁАдuСмЌЛЖЋžЊжЇ•Т Š”mь‚ЗИPщ2КМ;ЪПкЬ,W‡uН.YѕЪ А-ЅЖд.ЇнЄRfчаoЇуWўА‚їз~ѓЏ;­ИБЏЌг,ЩЂЅ'ЈžПфШПŠ–йгb2Jesѓ“Oд?џіџўНпэ”йжnАЮ‹AЉsьжгpVjљиЕŒžнV!ЖЫWПQsЖS№~§зЯўE Œиn‰ъ7jя@јdъˆ˜ˆюи!ˆtБdЗ…@ EЮSЈ!њ4№Xo .2ƒ‰ЁГЋЙШD Р.9;щ ‚эjЎЭŸ\О|љЩуЙЬ>ЙЦЮ"_Ућf^д§v=b'›C[Ѕн=П|sЖŠЏЮЭEжЛ™ФRš–ŸљmZk?€н„и=Y›гqs.Аcq v’ЇјнЪђСь:b7_ Лyюђ“'—ЯнќъьѕхЎи™liv?"Љџ+.~Б|АЛnи=9Cg8›_žŸћъл'ѓр5xБ+ІёŒ§T(~T\ќ.и]gьžTЏ)чПД8§= gGЋЮ§Ђњo=;2й§шЇ?]|fвgŽь( ЛЪЛБkкЙэ;>пнsь\щУЧЋЖ•'евdІЏfT`Зр•eЋеыйбъŽФѕйЎH,+§ЏьйnЕЅоg;jљьЫŽšі'>ЃІн­ъu—Ы~ЛTwЙXХЃвzЉБШ­.2=и,єйN†їlЗмDћСьРnз^pьдЩюлђgѓйWпžЋс˜‚]ЁW­rЖ[]jЎўЭВ(g;vЋS&энШи-ПОмЧDE ДšЉ|еЙкн—gГJлЩќБўфƒнzхЋWХTГ[VрИьjњэŒГ]–ПXјЫМЮvы,ng—gŸЛ<3gЛВЫ‹КFWЖБоыTЗЛЯUOvЋ˜нЌ]х:}љСмHBрйЎrЭY8лeц wvЫГ]О­uЛТaФ™­y`7Rv‹_Qх”Д~ЛВдейюВ-iЦ9лхЌŒля"ГіГ;*Жи4ŸэТй­Š"ињlЗ[eg\шXЮvOЌьT­Сn}‚Ћcчб’Yэ.—>лэЎ/ƒcГУEц$.2‹ЛœУnОМ”ЌvŽ_ž}еЮЎэ"“ЮъvфмoЗfQlЩ,7ЉИЙsjЩ fg4ЉьЂIe,ьŒЖЃIХЈW_"ћEцюйHА'—ožЋ9й}Ы8лЕ5ЉxRЁjП]ЪQ*Fе•*Ч+;‡ЛБ+–Пн=Ÿ_^іŒ—Яvgу4Зхrу›!ƒУЈrЖ“Тр0АыЛЧЋ;nжЈЛйžЭMoaL&и—]рю^ођSjWyќеlіеьjКЫqЖЛББ[ор:ŸШцчfсъќиеu—‹нїѓЃ’jАЛVvТг˜Л{~6ьцЙЫ•ОЧњ6ѓoƒoИл’и‘ТЗЙжм]ю—yY”§vНc'?ЁСZнЗГђЭхУї ”­И%лю<РЎЯь&Yф˜lЦ‚и!РьА;Ф”й]\„~ёєщгггSАC Р;АC€]И§§§ЋWЏžœœМxётнЛwъѕнЛwwvvР+Л шy йЛbGФ”тЮ;JиЕkзŽ.]КєьйГ[‹xћіэссЁЊчХZЗСGSФ”Юvщй­7ь`vDlvЊJЇjr/_ОмккКqуЦЧoпО}ttє№сУљ|~ўќyѕІњHеѓоМyvА;ьРv­ЁjlЊоЖЗЗЇœН~§њ‡~јђЫ/іГŸ_Ф/.тгO?}єш‘ЊфЉ пііЖT%O‚нЌђЦ*lПиаQѓVёMЁНГxYx?`‘ukАыžѕЭмXсЪo ю ђчGЕяиЩА+<uЙЅ•wТи•ХbWQv“gЗГГsrrrџў§(pJиo­BсS~БˆяПџ^§ЉъyWЎ\Q•лёћэ­-qћэ–ozєл­4Fc њэРюЮ;WЏ^=88˜ЯчŠ—^дї‹аЛ;UэS™ыUŸ*ЌWЎ\ ”зЦŽJъъКЫ91ѓШлHЛ ЅьњЭn}HЏфнёН`GPv=gчM7ии5нxАeoЁЬN“нгЇO_О|y||ќёуЧМg@ЉвЮВO?§T9гъе;Ѕъ ѕMЕ„‡Оџ^9юžvЉи­Еa[ЧЬ9U‚‹š9ЏƒlGŠuЄHю†XЎЛЇvъь–џkН&tЏз .jцМŽ,СvЄXGŠфnˆхК[j]‹љщщщЩЩЩ­[ЗT­NЙЩ—Ѓ; ”6%ь‡~аЮ4;ѕўз‹0ПЏ˜ЊOе7=zДЕЕuxxшїœА;А;А;А;АЛ§§§>М~§ZзоЬnѕŽbЄ…)v_.BзіОљц›ѓчЯЋOu]07ЊоQ|/\ИАЗЗЇ– v`v`v`v`vdїцЭ›gЯžЉкXоw d‹mNaRЄђAаzрѓЧеПZЊЎе}ГѕОZрёёёЫ—/=І;А;А;А;АЛсВ;==НsчŽ’ёќљsГ>WbЇщЙiK3‡ЉЊžЊлЉOsŽЂzSНPяїнwЏ^Нђ v`v`v`v`vƒfЇL|ј№AЉ2nВSЄ4Л|†ZэOOLЋЋq йЯ‘зіt?ƒђЇЊw‡‡‡`v`v`v`v`7v?љЩOіїїT--џ­9яЌ NIRМє8hszZѕЮЧEш,КЊЇўдAђшшшъеЋЎ}`v`v`v`v`7\v*tнNљШЋ'rШџдoЭkl_ЌBwЬчsэLпЇОЉобуЃе;ъ ZГгZžYлSKО~§КЊо]МxьРьРьРьРьІРющгЇ Фбб‘ВbN–-žšЅ!Њ•9]БгCTєРg==m^™SЏѕЇеq+7nмPеЛ7oо€ииE,J-;АЛьšŸуvSeЇ*vz:ХB@)=DKНауЯ/BOІЇЊеЗмх“„ЉаS;ш Ÿю@Шk{Џ_П>88P•ШiБгћьРьГЫРьР.YQЂ ьРЎ­ї ŸqV6Щw№Х_шQ*9;ГnЇхЉšœ‚ЅйЉаѕЙVЁ;.\Иpяо=~ТhийR v`v`v`v`7VvКї@а1а7вщ꘡™iFzр‰юаяфцA}7žbЇЛ ђQвљrЬ)ФvvvРьРьРьРn$ь(;А+ХХEМyѓfooяіэлšЫї‹аcOђ'ЈзцЈ=ZЫгAѕЉЊЊ…ш>ѕМўїƒj GGG'''“cgI6ии5;А;Аы;;'vЊVЇихг9hFљ]tљУВєУZ•˜|ž†\•йс ыv*єњЉzєtЮW§ћшбЃkзЎ1DwФŽЄŠии]„u4gиŸLQЂ ьРЎОnЗППыж-н{?Ѓu6›щV§ЏОNG>˜ЦЇЅъвЏWЁПЉЇГ§lЙЮызЏ3Ÿ‡0"vѕKЛІЬ;Л.й‘U иеfж8иЉг6инpи5dие ‚VьЖЗЗѓћфfХаКї —”›гїв•ъvšЎл}f„žBLНљ№сCfB‡ь$Šи ˆ]уiьРЎьь™v`ЧЫбЖ;Тй‹ЂЦ?ЧСŽ„ђЊsv‹-и ‘д2ЧA+ŠП\bgQЉэ@анњ1ЗЁи•juyшЇr=x№рйГgœ>А;kf ŒѓuА“f\”Рn8ь(;А Лж;›†ЦЮuXƒ;UЗ3й­ љ(•|(є—FhvљPш|”J•]ž*Е .Јѕі’]ы€.А;ЪРьШЮ’Yƒcчит v}gWЗИГkt: vf!IЧюшшH)ЩЈešгwнivљSЖє`–;s(ДЎ–Дхё§їпЋ/П}ћVе,{Э.Ќ(Qv`7.v”o`)ыђw–/\йЕwqЧgGCdWŸYƒ`G…PpjGЫŽжјreХwЈјёииœ*јяпППrхŠ ]ЛхLЫг#Yд;љŒцЃєœ Й9§ф[ТгWЏ^нЙsЧCWм ”_ ‰ žэќnзхЎƒкзvуaG•–kЪFУNV„ю…ЛxьhjьЬm&*ё cЧhєїfWѓNlv~ЗыNŒe>ь(ŒнЅK—є#ЖlьT(XњоЛ\’О9OЯ4ІпбзЪЧJџж*lьюпПЮЎмЄв#vФ9>Zoі“К; !Лкu ћЊ„&Ы.+ <ЛUКХЦKњмЎ vЌЬ4ЛТН'Cg—C†РŽ1`дьЌyлЪюєєєхЫ—ЊnЇЁ˜ђt.­ч—ељcцКє0g}›ўІvY›0ѕUЗ яЗ;{ЩhЛьи5вFЮŽЂГ (J`7bvЭy;vvц™^ЄЛœгш?v­wы‚]%йŽћЩ—ŠэээызЏы&mХ| Ћ~тž­VO4ЋgtаьtХ.ŸrLп™ЇЛдŸ ЂОЖЗЗзњXзvђƒУфиеюbwGžz-Jš]нšЦЩЎх6^vь;А‹ЦЮ’З`7UvэїГу 'ЛЖнФaЗГГsџў§?ўЂЙ!]QЫЧЊџЬйхѕМ|j‡ќ;ЖЎ=RuЪўнo'W”Рn ь,ЛьРЮ§vнйіzWьZіSы! ь†ЪnУй]иеМхі4Ojъ„ю%ЛкдrиЉ жН{їnмИQЊхЯквUКќЁ[ŠcЉAГЫПЃ'~hЮ .pƒ01vfcЧщѕя!;сЃФ†ыf€]'ьˆCь"Бki–я Ліћ.РЎ_ь*я˜`^•-•\ovћЉ=o‰њY[ŠK‰~jЎэхwе] йbn†_оu {šйЉ/ommНxёьjЎюРь&ЯŽВ)ВЋОщХЮq:и]/йI•уЈьH<ЙIие5УёBWяž?Ў=щ(wжЗмхУœѕ›zИДўH›Ы{ђAац=y:цѓљГgЯZЧAї„_QђaW,Sfч68(ˆeŽь™РnИь\7Дq;РЮ]9`vН`Чk2ђyа’mё}eW“льиййyћіээлЗmwШЉїuUO?СUпœЇ<ЉM‘њ цДaЅЉдї/\Иpїю]NЊГ,J`v`зv Лsь*oћВsiЩЛ1Вѓ*JьЗДљbYІВvЌС9|vЇЇЇ‡‡‡ЧЧЧЅn3ђIђ;ѓє`ѕ=-DЖшX0э–ЦDыЇpх:5v•0)vэ'шЄьJЋŸ5n7ииЙАЃ ьРN†k2и‰БЋ\ Л„ЂАЗЗїнwп™н ѓjœžўѓ+Uџ;88иооVЪСnШь(уm иgQђ`Ч-•`ЧO2иM‹GQaчЖЉ-ЇZ‘ŽА Б+~2kйnђgЇ(М{їnkkKUПž‘ЅCWщt—‚2ЇGL73ЯчjсЊЩ4v`v`'СЮzёRWІУŽ“bА;АЛ†д:Б+ЭЏт/^T,TѕKЩkxюV.IЯ–?СІѓќљѓ>~ўќљw‹PкT•n>Ÿ?|јpkkырр@}Њ„=zєшу"дд—ећ—.]R?W ёNиѕ’e‚yе!Л–ЉАуn7ииљВ3>ЛЁГЋэš4;frпйЯч“хfџюнЛWЏ^U’>|ј Р)gЏ^НR"е;яqэкЕƒEЈїеŸ‡‡‡ЊvшбiаKvМ§/ЯЮakнRDdч˜W`v`vVvmћь†ЦЮZњШŽ]ќ&Ц.џ‰†2Єk{/qяо=ХыфффнЛw/^МP4ЗЁ^sЂv`vSg'yсФ vЛн7=ЛѕРьFЦŽ{i ЮЎ}”j]ћЎˆУ.‹/*J›Њ№)dъЯH+ъ;жўРŽПЙnУС.ЛеWРЎ‡ьj ŠџЈv`зgv ьzТŽГ#тВ3k{Q—vSgg|кЛќ+`‡Л• ьРЎ-Е`v`'ТŽЗвА‹`Чwч6HоŸПeЧŽYвь8і‚]Чь8ћьфй­?;А aЧйvƒdЇПvLvNe ьѓЊпьV_šqїиuЦЮЁžv`v`зК‡vtvэ{ь’Б[wLЖМ<;Ў;З;1СŽљш1r:іщoŽ–­sƒš_ˆБc\э€;;~[V7ь2Л;22ƒЬC’эEЫўw+KСьїq]eiТьˆћ;ЭŽ ГЃиХdW,nf—І‹Л„ь\КЏЦТN•БЅ4&АЛˆь2АЋ4- œэ\ўєšг(хСА[~ЇCvиUZt);Б[їВТ %э€—МaВsИЮ;А;А“H-1жa- œQ>ujbaзЊmьШ)ЋЛeЧоo‚yЕњ–,;rљии u—ЫВsщz;'vŽХьЂАц4оь:cGфXnњЯŽ8ыш;ЧLaзк’н5;З›ЂВcц•;rЅе;—Kb9vЌЎЃЉГЫGЖГ k‰)и‘ѓWeи-.]6–ЏœйбˆиYv`'›WЫяЙЯOП„ZљEoиk"ь‡–ŽžЙeu—ьHАŠуЦЎА(rњХњьњФЮљvнВcџjc§]JШЎpnfЋ;А ;ВWFЎŒл`Чfч8Дд™e=aЧ§йFi0гˆйё†hŒ˜SпћˆйЕTq’АЃњ ЭюlщЬ JЧ.#АsbЧZftv”‰Гѓэ…s vНcGЮKeGŒЌ;/vd{93з{ЩЮ2œŒWГЛёГkЎтБc–ВЮиeФШ\тЎькйЙ №t`зЖриь(;В>%вZЏЛTьHјТЩ­я]’ыˆющВ#^`W9гFfчUй0;оqЗьШЃє‘T^љА#ы“DˆYРуВ#і:FШŽЄрnьИЧ]ЦR'ХŽз;l™[}Ть\ё …у1NьЈCvфSњКdWПЃЈy—ЫБszNi:vЎ‰xыœу<ІмРИK‘„ВЄщ'‚- нАг}W`з-;зdГуwЉНz“y–Оюий*сНaGќuX+CfчО<v‹ mvVЛMзРћъ†уї}Њ8$“WефrTm{’H vќ'i‡ГsЎ_tЪЮчŽ[’ЙuOœуФХ‰и-&@щ€]ѓ(>Аыš9Щ”eчU$и9NкЌToђv?DБйЕvLІaWNсъњŠ,ѓ}:‚ћ}Ж+кЋCсмї?еoХggЯЯ8ьBQЖм™ЛТж“,;чIƒSА+–Бš^J§OЕ[4vЬyˆ{KXЛЊŽХЎ§‹Dь,SJ„–…ВЃъmў~ћП\ ›6 fuJvќ +$‘эŒ,aЬб”Š]§JSa——1ЊЛЫпЛ™€‚ЗЪЅ4VюмoЪсмэаЕФБBIиqђŒнЊpЇ~;]Ц*NТиeЖ›]нгeинЙ_ ‘Ы@ЈёБ;ЋYxŽZNŸиQ3;Ÿ›rjћЉЅv‘YlR‰УŽѕpі”ьјЙ‚{ЯЎБГ-ЄЉ0ОŒbѕлЕLqшЧŽ6œїJ`нŽDйе%—XŠ’Вc— ovюƒр“БЫ"Б[œ№VДнХŸЄMœЅY(&ЛТ€—ьˆЇ(-;йВ0xvmнсц(Egз’cўuT";ТЅЯИRŽСŽ˜EьњСN GЯк мхPь•ЛІЁжс/ВЅЯџrМ)Kl› ЪŽ(0Е`'Ьnеь—„э япЦMмиЦЮ+ŠЧŽиEпg:ЇЖ­ХЪН, Мn'Ѓž‹rxpЎ•РсƒBлкзA–џ Ъvj.R2ьŒћ"Щ?ЕчёВ z$6љ/Ъ‡]&Я.8ЙNьчW‘фЖŒОЏлѕ’ћДcdчД,vОѓœtФЮcрjCr›G_ѕ’M› †]6vЁ% ™л|М/чD2—„S5`v29ЕIХrМ ™чdјьšЏlyћ1Ži`vБшЗЫ7псI"ф–ыНИ”А–…СзэњЬŽЦРNєЂвіЛ2,єщŠBЩMРЎ1Еф—ZvХЩѓѓ0™-шФx­IХкЉ*дhl= Хe'{ˆ’fЧMvћЬaЬg•є‘~цFJvTюeaЧNTBvФЯИ7ЉPGЩэ=;оH˜ОАЫBй…ЕњЇ<л‚]УЂ(fr§й%j&vf˜*Avы \(;ЉЂ$QŽ­ьt=šbщЇГ Ў ЬœWы˜ц–Њрf—­ŠтшйхєDыv­hь;bЄўГ . ]Б3К Bыv=dGќь-;iС)иЕЄ–№Pй5/Š"&—ѓФт№X™+и‰ŸŒщXО\~“18,жУ‰šTв”ŒШmоьќКмšъСЮТЮyMcc'ииFCbч0€`ь‚ЪТРиХ.JbYM#`'<ЊšлшФЎ5ЕфZvu]ЕžњХЮЙnзУХXџ1=ь\{їiаьтЇjp-™}eט )‹бIќ,Ш(нŒА =ІеЎƒМRх>яiяи5UPб’™ˆsr™“цѕљЅjьšV3vQF[Ё%3bjgљXAЯTQыю@нŽЭ.ЮэкQй‘xrЪN UфZІЃВ‹ќ0—еэDй‘џА#пф~сДЫ;oR!ЁT‚gCrvЂ%ЃК ^G+;Џо}8ЛШЉRK&QДlЛЪlКОчщw”Œ~ВыА€š]сИfя.Ÿ; ЮЎ|ЬьHЧђхђ›5ƒУРnšьа’)ЭЮyMcfGЦЂH`;ЦСŽРьbВЫ„‡)нЂrA8ли%fзє АЛ’:ЛŒРьRВ™^h№ь2АЛ„ьdІ;А;оV‚и]Zvj3QЗ;А;А;Дd‚и] v$Д`v`v`v=eGrГzи]œ,;АЛ>‘;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;А;АЛ!А[ЦYbFЎ!ИЈ™ѓ:(СvЄXGŠфnˆхzЇ™+˜Њdь„g€vиM+3–џCх#иДеЖŒtуЖчРЮм{9>*МСІUЖ v=й{љ.[ќЛF8Š‚YмІБm kЯБїFЫ.3Л ь†ПяРn›v`зп­чЦ-PРьРv`‡+hАCЩьdлРьР.Й:єŽ€]wр({”ЧКq„юђQЮёŸ2юNСр0АC &`‡@€vьАC `‡@€hd‡@ вDЮ@Є АC КbЗ5ŽЯ– Цйšн8"уйФxьА;иЁšьшьНEЏТВsaљжђпеЛњ#ѓ{•зЕЫZЦњ“ТПЛљwVW>Ѓuj*пYЎьНWЗU`ЇЫpСšQИ‹яџГ|m,‹Š+-}Rќ…Б42_Sнw(?€ЂпъŠьvЭ‚_ЃЫdaЗa,ЋФЎИ–5Лн"Лт’ЯiН–rzР1u5ьђoўџт-"ѓГГТNЦЙЇxљ—/ЋtYЙ`,Г[_4—–ЏЋДіТZРб{uuuЛТ%цYY.жЭЊчЊМGЅeэюVъvж_д^€џ-гДk9O‚Ђїъъ.2‹”TVSЊu5ГЃнfvДыЬnwЗx‘IХЕ€ЂїъjиQХЦnЁƒ, +uˆj~\јДZ+“тА+,ьCPWhЩ4Къиеtўеп%Ы7Эeи—Д[ЛdГžзИАCє^]Љn7†-;Dпеm‘Zи!]ЈЫ'uIŒgKЃŠ’Bм]Ž@$АC :a‡льˆДБMл"qќ Рl”%Ї‡IENDЎB`‚mricron-0.20120505.1~dfsg.1.orig/html/peri/images/perivol.png0000664000175000017500000001012710545127514023213 0ustar michaelmichael‰PNG  IHDR @ЊUŒPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ЁЁЁЂЂЂЃЃЃЄЄЄЅЅЅІІІЇЇЇЈЈЈЉЉЉЊЊЊЋЋЋЌЌЌ­­­ЎЎЎЏЏЏАААБББВВВГГГДДДЕЕЕЖЖЖЗЗЗИИИЙЙЙКККЛЛЛМММНННОООПППРРРСССТТТУУУФФФХХХЦЦЦЧЧЧШШШЩЩЩЪЪЪЫЫЫЬЬЬЭЭЭЮЮЮЯЯЯааабббвввгггдддееежжжзззииийййккклллмммнннооопппрррссстттуууфффхххцццчччшшшщщщъъъыыыьььэээюююяяя№№№ёёёђђђѓѓѓєєєѕѕѕіііїїїјјјљљљњњњћћћќќќ§§§ўўўџџџтА]} IDATxкэйyp[еЙ№KhhBICР   йHBB‚oё"[^%Ы’ЕoжjIжОZћ.]IжОй–ф=^у%Ž q6:-IJYКЇ€\}фёomЌ^`>ь­Dгэ Н’ч‡„H†ЬWheL\Ы]sёmVO—А…уХRA MЉБй|.ГюиЫ{іРЊ/d.…M •FЈQSШСГЩ„“GХ‘і.›б;8ug BbqtYXе,Н3жayj;hгЉUэˆxй EЋ@n9 ЫѓіК-R2Ѓы\ЗГ AUйнсшШwюС№-jЙJE.‡ѓ-ўhP(V‰ЅzkWи.Єc+і?Y%p3Аю C`{F&:†‡3­™$R9=J&gцЃ•„уЪ№žищщh@k<ЮФDT+a2ф†HЄЫi$lћїyrOРЫх›Жn"у,з€лLR‡.›нТЃа8здЖ№љЪРбу‡›к"SиСХвѕnћрхY—КЇ0jно OЭY%аЕи^Iу‘Pвx€‰цќŸХb“s;јПS/Šи2uЇF.lg“ љyu+ЭшшємиpЏtК“чЎПyўЧWцœF%WhI%MЧЪЃЋІЯy$DœдFc‹…ўKœ•2p"SFhшфы KБJсŠРчСЙ ‹—Їу‰xїр™Х ^У?ќсTи&%0Ь‰”зэдђЋ†LуgМэ№FšˆЧхб%ƒПMЁ…зБ jЙФ ЊX…%PЏФGиŽшаызЇћ#ОБKѓў†‚‰?О3t„|S$==Ÿ;Г&vжZZNQ[cГцњЇћЃcгfфЎGН•rИНZ:гhЯ. **0YEŸ” ЌfМ€)PЕЕˆ~ѓ+Ъž|МL†iТаXzˆŽ.,Р,Œ:lКм506ˆЅе€`ёrŠЛЄ2“ЪJЙЈG ГZJШfЧќяЎыФ*ЁHBe/џњўЅRR—Nh!шl Вk=А№рaдќХЎv†иN=^MегхђgSўD<рэ ˜н‰ОЛšš%аєщтдѕ1лkщє DЂг*8Њс‹‚ј Ў.фaр$6‡вRњ,А,ЙЏцжŸЮ*ђ>ШБ[&Cw@GС  ЃЇнъH НўЧL њЎ­умЯВRЏeкџїфOгщk;Њ…Ъ.З“WVжЃё8l,‘‰iЈƒоl\ЈDgко4Џ€-ћsігэЁ`мn2N§тН!№ŸџkњЫ8}ѕџ&Ъwd.§Сє_–Ооћ№ЭИœ/ф‰T˜яo;PХ“АЩu%ЇŽ<љНyu/oкА аыЩ4Нxv)ƒОнЌ‘`xфщє[1ЏуЧщЏувйС—кџэЋn>‰Ш<_zШ9I‰Бр[n=V_Пя?6/7ITWвОІgRA`K­дvк­жЩLgЗКЛКџхћщ™Џdv“Єчƒtњ‹[гfzјlRЮ$аді†ЇОГљE$Ѓ­рЫ,9=qВ oч2Рџе+“SC!iК’УqƒHh;ћЛєЇ—т}—ОіНГјЦДr/А1єЋПџbиуN\М6Єaš 'ЪЊхюп{‚mЭЭ\Д‡ uEЕ>Вr Pi uЙіоЭ+ѓѓу)eЦ6Вpўѕ3=б…ЏŸ\‰2=ђПW ї„Шo}єЃБЈ;65%! ŠѓŽь{Ж $ПE|uЫsG_кЙЇ žњ­šЎe€9хRџШќеџќјуwЯOŒšŠ ЖАлэГYb~џйчKРY }.K`+%29:иM,,іiи­5%ХЧЬ}сШМ&:ВИRwьЄУŒЧRcЗnХuhТУчoќќЦУсўё‹ЈA%_)UzЧпўЭ/?ј§ЧS^­yхdVР'ђq3и›ŠњќV’?uЊЄјФ‹/юлА ‡"ШэАъ6ГзЊФолы'Ђ.WorфЪ gт ;™ъэь Њш8F‡wіђ•ёЩХ՘б$E—МR˜pЫwKщќN_д˜&‹ŒƒlЌ…жBЪOМќr#ƒУ!ёиVОйd2‰ѕ‰e^uПž5Б‰ЩЫWgцІЧS}3s qаРЁВdБЙ™ Ÿ+>q„№WŸй–нЋю<‡!‘ 8"™J'n'b` HVVIЄ‘Аl[›Xcж™џZјщE‡>qёТХЙГ3ЃГ ™;тч[I|SЌoxа­ѓE}FНR•хЛxk‘ށ7Уq—I"т1ˆњ зˆта[› P2‹ЩЯ ЎQ]nБ№оЗЅoіtwђЕБPhќь|вАЂjсјN‡7олЅБїФ]f]{u­ K`^q3ЉK%Ѓъ,ЎЉЖЖЊ™HF`љbv Š@c2e UЇ —]А^ьющu)\Sawџ™3оN“†РPi]оHOвcpMŒѕФ|j$„šэ‚ѕH…-в№њъJ$+=UШЈ$>‡Хцэ,‰ХЂ•2бЫ?xwa4ъЌёžОј№kЇmЙVЎАФтБ‘ОИGkp'њЛ=fЉМ3[роЎLуѕ&Ў‡!bjOžBˆ;йд6T+ƒХу0щTЖHШРЩ–OšІg’Щ шtvѕФn‡IЇГeЁxїx2ъ0шхЖюб>_p2ћЄ)d4ъ ?`sщ( ^^\ЯаIЭF2‡Яg№x+}ЅЌN*а8\VЇн й$wв!”Г˜6П'дЕzЃ7957'{рЕ€лnЖ‡Ђ †Ч$ръыkыˆI^Ѕ‹д –„ЉmlЗЏTњК•rЙ ŒіDѕtn eЁH­ЙгвлыГЉ ‘Б…ХЉёU”>Lz…HaїZ„T"пŠDљj)“„Њ(nЂuА)2МЁUdX јѓ›~!чIŽєIqђ [OЈCErЅ{Јд-ОЁёљХЋЋЉЭTзЃЩlЙRЪЧЖbШ *š*P)иtZѓЩќ8Џ)ШƒтWЎn]ї‹ъЫQњС!q-UЎUQъ‚‰Ь=‘rЈ\сžОС™UVЗž(lхJ•Rн€b‘[qt›AІрk_Э?šЛcлЗ7чмБ€Iр6=џd a–дqTJrЋXHуJŒ§.Нлш‰ЎК€y ЫЗъ4BEYƒ$ ‰ФfђвіMРэŠ§ЗЉъвъw?–'БД‚‘хEmNqY%з ™U*Љ&viѕ%рй ™I!a‘%ЧЋЫ–VWAk оПXПДuђа]Uљ–бЂF^юуыШЁƒѕы…›МAOGЌtmЊќHQ Є2/gл`ыЎ];Пы3УїТMОлmˆЦ7џќ–ёјвˆo,B<Х pњж(WГVлE;vфПДсЫKњ №uЌпXёЃЛпШБЅг—ЊОjј`F‰ŒMмL‚^ЛёЦЃПьы~єЋпŠšат{fтm}eaNІхaр ілщЗ—9+K`&ЊžЪL‰П]^šЙOnC/sжЪћХ7a№˜xХSВf‚}уRщ ‰wf}‡уЋ.юtмЖЪX-P|xјџјOЉVЊ;Ю$0IENDЎB`‚mricron-0.20120505.1~dfsg.1.orig/html/peri/images/peristimulusplot.png0000664000175000017500000002160310545127214025175 0ustar michaelmichael‰PNG  IHDRvТ”ЗЋѕPLTE‚„ЂќJ\фb„ќœќ4ЮЬŒў ў”<\ ь&lЌ4єк”фўl|ќNўdдњђЄ„‚„Lє4lќўќŠЬммвќєє4єњLўvLф"ќдвЬ |і$ќŠфќžЬ$|фBDњ ДМќ фўЬєў$ќœDBDм<d6l„L|ДфЂ„ фф"DќœђќќЊфќъќŒВќN\RќєФ ц ЬЄўўЌTT &lФТФ |Ь^мў$ю Ќф‚„$tєŽ мєLќњjlфЂФќЂфbDўќўфЌD ќџџџќќњє щы‘|Є ЂщрT0кˆ||1€ƒщ‘|ДџщџџџMишдwpмŒшщкwЋ@7‘|ˆАЧчq7‘| f#@Ђ`ашдw@аШшщŸ§„ў‘€||џ€|АqDћp‚ўк€w|АqдЂw хп6№Bwт˜щШјїјїЈхšƒ|№чџ€|LЪџ@џ?џwџтџ€|дхBс eщ?ЂwПЪ/=ќ?‘€w||p‚$€ўE€|ПX=pж?дwwm‹‘ж|wЖpХ1 pHYsФФ•+ IDATxкэн‡ƒфК]Рqkр„іxДЃзМ э%pТqДа!Ъ†vМGqјџџvg<Ж$Ы–dЫђї—МНн‹ЄЯHЖdЙ{ ЂlМэz‚ JЦыv|љDЩ€AьХюBDЁ0и}ѕK$ AfGDXзJоšЯ—0и}|љОџјѕ?јQR’ ќйчlцпѓ%tv_ўтG~шл>љЃя§›п‰п—œп.БћК†йђљŽЎŸoЛїўдmYЧ”Зныю3цcУьК{xАћъхл?§ќ—ўя/?yŽя§љ?Kк/eЧЕ ТјgJVНeнSy[јtЏюŸКŒўЛ}wиѕ§ќни#6П†,P—Бe‡‘]kЛАКЂа…л‚нШюхїлOƒнЧ_њыЯ?§єЗўќ…н'јЕ)З—ŸрјГычѕзъћ%(ЦZlяЭ_жж_Ь*#њˆ{П]Z?Кbь;ЛсЕЖ{wЕg62ёѓO?џєя~цЪю“ŸжО>/З/ёёЛєњџБи­ы^г ,;­ѕіЧјњ}ъOѓ=Ѕ:UъЏqХЖ=Л/Ёэпx4ъоЉUЫјў|Џz…]ЏRŠ#юдŽk);ІЏ)цGq™5Œ]SR§rБя]?OBѕ…M•§9и=мjПЛпћЇ/ќэ~сЛџьgoюўљЂчЎaю2{ЧЈMдfпl!ЅЈкWeV!Ц‡д|з?ГАgЪў\дВІе Ъ /†(sћЗџ IŽИϘЭХљ:ЭьА}jх(ц‡k;P6iо 5RvsvC;гdї?ќяЯёќc7vŸшьњ~•нМ%ФЮ,ЪзnПPn”ЏWЛщlгdwб–PОѓ/ЖТ;gЇ„іsФЫь–Гcš4F­РNoЮєvчkŒFжvџј__ўђЯљ'~љ[ПёлvSЙь3А›iИЬѓзњum”vлВJЛаЮNнж2;Н[š[й-Б;=;kЛЫeі{(;KbЌА;с)`фЙн?ќЫўЩЏќфўм_}ыO_м§ІYŠ–sЪкШд+ƒрBxЙЄbgь…еХRvь.НЦЮ–@›x‘нbvи>•‘§ЌуЌ—5ћ‡ћЅЫ5v‹W2/пќёЏќўџH)џэ;~ъ?љзЏiyІŸJ™•ЩьФz,НўMоыŸ˜ЏcјkЉ‘ЉЏQПnЂ^Sаж:Ь‹­m7ЏЊІjEл€Ny‰]єлЭh3;ЬO]њ…жЁ­зЅŸЗ Дc1Rxсьђм—TLv§vЗјЪї?УћеoўZа†WћЪvM’>лўDuРћЏ9ѓЇВ%іЙиХŒRЙ\>ўјљЧпџїя~OPb/vƒэ^ ŒЮ=иM ГR+9о-ЭГ{­Х[ѓяљ–кюо7Оёђ“ xыˆљж;>О Ž r7ўФ~ь‚(ЛзAŠ‘SЈDЉ ‘Iћ52 ‚(Ю.u5њvОЅЧwOOOя><&кябgnУoMМЌљ@TФ.ѕZ rOoф=оПzLВ…јxшSЌem§§ЖCыsхq"vя&sЗxѓ˜` ›NeеИВK{ІlЎvФNьЏшоМzzїюще›ї/П?эХN§уѕнG]ЊџщЋПЎvФ>ьоН Sœ=>=ОzџйЛЧш-lbЇяу Люы‰т#}ѕА#vcїnоІ|ќтЕњ{ЯЎыК›Їл/ѓŸvvЪюЃЏ§њžшіwШЎ+УnМЕ v В[Ы\wЦй§ј ь•ёц‡ћЕ•wѓвЄ*Ы6:н•Wпп™џДГяHœj;Xoќ›ЖЖЛщFvѓOvАk…]З–Ÿі^З–нЯчuOц›Ÿ ъžєSМЮиnЗZфюЬ ьЗк. ;пкn8Фх/иСюaЙрxА{Ўь>3п{”я?{eсX‚жЋ6ЋэюMЭћЯОЯRлЅawЏ2Л‡Ўƒ]cь†6пЧ]Їщюѓ!™­Ю{v?I9ЛvђјсіЮ+vгЦя?яХєЦn8ѓegщЗSjЛ~ќхъЏпTлГhxА“oЛ11:jЛйE§†ЮД1хzgЫюWѓЪюђu“гЙнјeЎьBdm7ksjЕ]ЏўЮnЈэ”йlчvкзH0ЛnњЮƒ]ЃьЎyм=˜ьІ—ъnЊэž–6ќEЙАI­Ж ˜‰{[#S‹хкnЛNПbГ^лХГЛ†]Ль4ѓ7ѕk,JvП[dї|жчСnЊрlь6\Щœw—ЇЎэІfpnv42лggдvнƒЛЧЁ)9я’янь\Ьkч\мo7БаЏdš—TТм]ЩŒfЇ\Ryр’J+ь”k)Ъ%хМBYЈ[nd>МŒ{їєЦМ|bЛФЙх’ЪІQ*–~Л’ЃT”Sзnі}хУ.(w)с‡bЇ—‘mй§јј4єŒ›ЕнЫ8ЭŽuјu lfŽRIƒУˆи}Ипy№ЦЂюs%ЮQ*ŒЩ„]›ь"Г{ИхЧИЎђсН”яcЗА…ЅЛœкŽhнpƒыуЃ‚ьё•ŒWЗ­Л<й}?ЊaG8й%žЮ@ЭюЧ—Ё`o^=}xжїсv›љgб7мНNq№‰osЕм]О-ёњ,љ@TЧ.§„“КЯЄysљ‡ј§NхuоФэпю”№šй4њЬAљ"`GА#и;‚€AА#иФЎ'ЂPLь:‚ Ъ„ТŽя ‚(А#иь‚€AРŽ ˆ’ьфь…{,}BмТђ’ўbєAнтњЋіzФ*m[ЁјћГ[|q4І§cОœ№ ЈtлљuжW€G†щ,ЛйСŽh›наж”НкцtАкšЂms*М†Чpuнэлмэ]xћPљР8е{ЗeE‘~ іМи‰сЧ`/!Л“сlЌ‹Ќэ:у?‚Ј„нјSjKЎžл?…uЁ FtŠСvкЪ`GTФюњ›œГГ_Дœ^ИОЙРЮwi?Л’ЙШnщ)A–чСŽЈŸннœЅЖ›WcB7—ЈЖSЎМР.t•НJvDeьV™ Е]ђFІЛЖлФN§vьЪБЃЖ#*e'—ЎdЎ\R)ЏdъOXNФŽ+™ФОьl#СІs;yЋэќћэЎW[Dо~ЛсХ §vЪUхb §vDav^47|Fd:R2›€]9vъˆци­нxАФnэЦƒєЕƒИˆциQŠ“ЎФЦёьјЮ"ˆm`GА#иСŽ `GА#v;‚€ьv;иьvА#иDkьД”?И]{!$IЛXvкмXЪь`GdbзЉ+дІž„ьˆВь:™А#JГыa;vА#`;vАƒ;иАƒьˆzи-v—УvD6vуx0ѕљRАƒ‘•]в-Aь`ЛТцєghАƒнVLўцzхiэь`——нTЧЩwАƒ]vjЛRš/Аƒ]rvЦЩœєЕJРvлиЭ/ ŒMрСvиY/ZJ/Ўь`ЗнRGє№JРvсьV:чЄЖЅvАKТnНC\КШАƒ] ;ч iЅ@ТvQьЖ Ть`ЗнЭжб–ИƒьЖБ‰сLCvА g}Wю`Л@3ВŽuА;ЛDbp;иg‡;иС.@K*/44aЛтьЈ№`;o)2щкиСЮУIJ+fC‡Аƒ]vv •†ьМŒ$ІЁUxАƒьlъвгрNXиСЎ8;&~€ь\:2ааfе$`Ль˜зvА[•‘‰†”љжMРюшъВnvАƒ]Qv<ЅvА+ЎЎчЁ\Аƒ]yvдvАƒнЈю`Лвъ`;иэРŽf&ь`WX3a;иАk_]цАƒ]qu=#Ф`;иАk^]Ж;њиЁЮЕ1мСv'й(ЛSЋƒь`‡;vЇ(ўИƒнiйЩn™€нiйсvgeg-њwьъf'вnœ€]ыьdH"ѕц и5ЭNІ€$вя;иСŽ€]nuйсvgc'г@yv‚€ь`GР.ЇКЂьp;ин 1ўЬЮwА;;щI%hч(2ю ЛІи­51} Ma;иХ–u|n'hfТvБъЪ^RСь` vАƒ]‚rО…НwАƒ]T)пTлсvАлRШE ;ЦfТvъCфм'vАKЋ.еИƒнйm ‘† ь`з2ЛЌх[0Г ь`wЄт;и5Ыnз)њ`ЛБ“Eе‰шН$`з<Лфuю`;Ѕ<*иИƒьŠГ‹оOvэАЋОXуvЭБГъ|з0ЗuссvэГЫкs Жя)ЛVиVѕ AРЎYvѕю+Л6иэRžХЖ}%`з; "…;сЗГьšdWьД.|2[мСЎv{ЉыУЗ+Л6иеR€…пюТvА‹Ц&‚иgTЭЉйцЮ йэ^~УцƒьšcЗg'ЙчЖ%ь`w|vЕЈѓој‘:јa;kN4ЛWrо[пЏ‡Ÿ€]zv;†€ьNУNV3ф9ф!”vАƒ]*x!ю`ЛЃВ“‰’†]PuЛТЙЛ ь*ЈєТš™9йAv™‹WŠG?юБvА;&;Y 8иСvGШX™А;&;ЙЁАgЯXџЮ;~ЌАƒ]5ьъщЙ Щ^иСюˆь†”еTwaзTУЎeТvuБ;fЦvнСv5Љƒь`W\]гаz€ ?\иmƒЛАѓœЛvА;Ђ:qlvў>`W–]`Љ:Л ›K++aї˜Уv5Љ;єЙь`wМ2Л!ёЋ;|РАƒнюъŽЮЮ“ьт ‰АaА;.;qvGEъŸѓB"„нR9ЉчЎђШr!“-; 8НœxжyА[*&`—аьBSWћѓ˜Мђv ХфЈЇtАЫЮNXЋ4m>UWщ]3Ѕ$ъˆ`чУNЌx z!ь`;HЮ Ь†v­‘ц˜ŽЪ.чКеГ5сНДWцРЮ–‘G:БKуvK)ылt&ЛƒЋKєHsиy‚‰Ъи5Ѓ.Mё„нЬ\вСaaи•+"5ьцˆ“‰:и[їЖўcZфsРЎv"іаТf“зйew7„-эG#dщ€uЫk `Їgт1OьЂ/Ћј˜–Rf}'(a—xi9†[РNЯФЃ^N‰­ю|.ЙL%gii•рTаУN4Y]ї[ щЖйЖВ‹/Ђв\ha)xѕЬO-‚он№Ь —Жь6fa[ю–ыЏ4ђЭOЊй(bзэЅ vАsМ•њl-Я˜4ьь§т!­|Œ'ькQ'"Qz‚лЮ.Я}юЂ‚Ѕ‡sй:йU_Њ{=ХZNФvОЭЄэч_ЉeGC"rнRnиoиЕЃЮИе2(Є,є| Ф5i,;Йnїе]и­я_c1EP.”НШ/“­;†ˆ]Зі]ЛMъкBЦN–ю[KvЙf;;їэТ…nћ~УЎQu‹Ѓ&ьЏэбЅ-wew”ѓF9ьЮЬЮ9Ђаофлe$‰”ћАБ3ЎйvvдЕsbч?ŸЂŽIЙtT­Б‰ˆлo™`ь6фо!м‰ ŒиqмdЬ9R0;Лп2ЩE)иЕІЮ}LёMЛ#оS№rЏ›‘{’ъRьZ ?vЕм%Аѕ~…-ІoняѕОMиыELЮk­ЖЛQQЗђп”їчЗСЎхлuЖІ‡;Y„FРzC‡[:РEєp/ЫQz т]р‡Ќ‡Я\7R6/ЗАЛзmiЫЩєэ”ќ)АkГЊt\Г“ѕВAЃC3Юe9>7У№pиЕXй9гЄfvAфrRё"Ц.0лcзъЅзГ^czЫђчЅє<КМьB*о&ихь4= ;rиееvвяиђБ“2у0ЇgзlПЦzLжЮЎї›s+ ЛaZ”ŒirFvЪв­žиyЄIнЬХwEЂœ_—;MЮЭN4м‰яОIГ~vZЌ‹&ЦAMAс+vйЕЌЎ vъ–„дBYкsnЪо1ssЩ[]ЦIJ775ZgЗ:ЁJидBЅП.FLЯUš№:гsѓvqIЪ`ЕЕ]ЁIrиЕ—іЫљй…ъхЋ“лЦdњй;7;сънŽоЙ’Ub>ПiдЩэБsіАsiїКЭ€B$[їlЭb-ЮЬЮЋ{MШIэЅwVЭз;gawР Ђa›ч9ЛЩоТЗˆšмОmЬ>—T|–VžъВpf~‘dс™ Ї@љ№™ˆ†:аoЪ‘jМЬт ЌfЯ5Р~˜3ZъO+Я8І,;џбvТrФѓ 0в н/ЪчxЬrˆanђ WОeр} ‘пЭ= яЗгь]ы/хS&Вѕu'юŠ/Щ.dˆЋX=\Н“]і>Mбщ3хž‹ОЃК>Ќ™шs7dhšLA!Ѓ›SпцЊкЛSлКn™ЊOАdwљЦТ.WУ’і[–ЎYЗЯЮу(чУў…?<П~ЬJ§.ьдН+яЮCњ]XЈœніЅзkјыuOщ™8BиЭЪ\П8ю_nJy&`ь™Э˜оAц…ДћZ\ЗXщŒъœ8;ЗМй2kD“П}Хn*s‹уў=њIgЋkЃ,s_ЩLМДX&У–ЋЄbЗ.O8О‰ЬфЪwЎQ8wп›ыGyokљMЊ7.Н>ѓЅ39ы›ТШн‡<ЋЫи­Ш ыь5ofoŒЧS І†ЅЧQ:ъЏАКбšUЮцќžьхЋ•нЪмŠr}нЗїзв@z&х1й9њЈTAТї(Ѕ1mЉ§LаыKё˜ь<ŠKаЄі‡cgЭ^[ЇœЯЅ^y лЭ.јO“'Ѕwm№BЩ,:мЫч>wП:яˆьzkGКэ Ѕ{zтСJеВ‹ )з––>ы"џQf_z9ƒ:зЪЎЗо‹.§юВђ п;‘d$фђЃ§FpŠЬGYliп)’e‹ьдяБžљЮ;DВ1‚ѕX“офМROяY.ЌЏ[ф>р’KлйЮrзЛ)Я}&рqєА,–ЮГѓ!Vн‡žј›ы:З[-0ыУЌТ. q^ЦdzШКЦЁ qtvкљ…їНAGЉоћ8Џ[[ьLyAЯ<>Л>hNcuК#ШN=яСaGyПїпПŸJdLУНo\ѕ`/›c—јf‘и‰œО_&ј щ9Пqї_:`€§јUUŽ]рт9“гuх-l4S…ш6<Ž%li™oн}Ц§Ю…4l€§sё;%;Џd<;у^ћЌь‚–=*ЛАѓa@œ–ы~4‘ГЛ)cЈ+ЫE#` Й8nmИюЖє‰k;w“8 ;Б%MDжq“'aђ™ы№ФБЮэ,гі„~vлзэŒggчю›9в„GЁ–оъN­ђ<ьМ?sњкЮ=КEЅО‹™–P^& YІžє“љзэwА42=–ЎžхqяЕ\Щ<;ПТ;зчУюEп­8‰ИGE‹>ф0‹ Б'GgчuМАЛНфМ)Жfxж‹hлj$сЛС”gcчQV`чНtХ№"Ÿз‡ЮwrдyЕ‹ ЪvmvKзъ.СТЅи3ыnŒ—ЛТ‘„АS^wЮі[g…—тёŒЉјQЕКЂЗ иљ.э~h}KlŸ0}uщ5]єЮ?Л„KW/QwОѕ1д Т+YWvГwsляU­4dЖuЎрьHƒ&­‡ы}YMЫйAšЮб$MP— JьЪ#нžШИa3ЇЬЛT иАs?ЩЅ|бЫ9лDЬЎ–;ovюyЦЪWxѓОЕRнжkѓЫpхХUЊьќйy,]ИФЭG’Ш]ЖM§]N`ЗКЄtЮ3Ж ;QZЙ}ј­ЄŽЧ›Аs-ыœsЅ|ЦюUкЭWQЗ%ьЂ—aУˆЃГЎ‚“)‘§Xлs'`ДД{&VяЧ3ЖPирbВvщ–EкBлвn7пМLыФхЫm wfv9–˜US›rrз[о@™nАѓcч3“tю)§0ЛJн и…Аѓ)ц™g@Ўhъ@иE&ь<й>v)yn=мv•Лƒ/;_yа…я ьju'`ЦЮу /}'цй ь"“v!ьzП.М„ђ„эЉЛW{А‹ЭUи…Аs–xaс“=Жmяпи„]dPл…Б (БђfŸчмvАѓ(.yТпь`wnvkƒ4…Wё]јЬQчb&`—€]xЇТ=ћќ@buOРЛ“В Л<сЙœВ'Јƒьтф sУž vЇf'7kO~‹xрq4vЅЮЧ.1MžX ;иС.iˆйœ$~=|АƒьШ†’y~HтvАЛRˆ’6pvАƒ]М…РсcЈƒьаAk†ь`W”s~jvgcЗѕд4O '`wJvг^vѕмgGРЎNЩйЩzn*'`wv[зMРюьТ‡*УvАKр.);6 Л3В ю[.ХАƒь<рeД;иСnF2~* v'bЗЈ&’ Zš8ЛахaчI-нgXš€нщи]—!KЛqСvАѓ !ƒ–vQ…ь`Wь`;oОЭFЙaнь`З2НŸ $S6РvЛ"%`ЛtЬeIРnw†w$ь`—›q/:ш`Л’IиСЎ(Йч:OвМ„ьŠг# `;иАƒ;иСŽ€ьиСvь`GРŽ€;иАƒ;иСŽ€ьиСvьvА#иьvА#иь`GА#иСŽ `GАƒAРŽ `GАKЯŽ ˆ!ŠБ#bkэ;‚€AРЮѕљсŸЎДѕьI…Щ3ž…TВCуnT”kE(’н=ћZЎlжГ'&ЯИ•ьPmћ3eYюŠcзMЉVOСЊЧ]eЩ3юG%;d№:ъп2;ХЎыawЈфЉ‹]_ЛЎ?ЛvЧJžњиuАƒн иUUЬЛЎЎъzиСЎyv•эOЙ“Mи‹]•п5]тЉ™н4 v‡*х]}ЉTЛq|%Еь’'OuЕЫљZсiFЉа]~ˆфщъJЅЎЦюђўнх ;Rђ(їЈ08Ь‘eu#v;‚ `GА#и;‚€A‰йQ&FvA” иФ^ь^Зэ бnєЛ6ОDк9Ђн€AРvь`G ЉСюкЇ ќ6ќ=§~ыv:дeд%Ÿџ™~(Џм—бЗdлюƒі!c[к>шћ;ЂzuЏMv^ряwњ+ƒmuЩ‘‚ВЦЎз^АnїA3<лŠК'іyиеЋѓdgО2wBAЉБŽBаЭNљK§ЇSœiKРŽ8’:/vFOѓі жdC{№Acз)џWрЈL/vнƒЮNлŸamА#ЊWЇл]Я—–jЛЮBCЏЯІЯg]гвš‘акNоuкvOТŽЈ^]@#гЪЮhqvЦ;fKгdФЎ›/ ;тˆъ–иuЫьЬ‹,Гѓ-]мLІNkі…н‚:ы^СŽ8‚:k‚й-`љ9,Ќ^кŸ>ЏЌЁы”uЃНЙЖ]m[ aЫ’А#ЊW7яЗ;ќ‘СŽЈ]нkиDiuА#ˆ=д“:4э бT ж‹™IDATЙЛœ ŠьbvмfOeуmї– ˆТёџ‰†.uNщЂIENDЎB`‚mricron-0.20120505.1~dfsg.1.orig/html/peri/images/periset.png0000664000175000017500000000475110545127112023206 0ustar michaelmichael‰PNG  IHDRјзѕlкPLTEќŠ„ЂќJ\ќœ4ЮќRќЬŒў<\ ў” ь&lфўl|ўdЌ4дњдвЬђЄќNLє4lќўЬммвќєєњLўќžvLќ |є4і$„‚„Ь$|њ ДМќ фўЬєў$ќœDBDм<d|„LœђќД фќЊќфќъќєŽ ŒВќN\єФ ц ЬЄўTTўЌ6l |мў$ю ЌЬ^$t мќњќЂjlєLќŠфўќўфЌDќўќ ќќќњєџ0џˆџ|†таЖт‘|˜рВю‘„| Шqы‘|•аqЂр0ˆ|€щДщMдwpŒщкwŒЋш7‘|ˆЊЧч…7ё‘w|` …fёw# 0ѕЂw`д waaVШnщёww§nўё€w|ЂCџе€w| аткwpр‚юўк„€w|‚ЏдддЂww ' Dьеwпт6Bwў˜щзOјї„јїМ€Јцщšƒ|№чџ€|Lџ@џ?џwџўјїџз€|€gдцзBwсаeД?дЂwwПт/=ќ?€w|p‚$щўE€|ПНX=кж?ддwww‹жw њ7“ pHYsФФ•+IDATxкэ‡Жм4†‡Ѕ\mб;XX–„ЁC(Ё^Р„їŽlqe[ВЅЕe§“sіКhuќyFcыїЌC*Mл’ЪRДѕўШЋOќцнaчп}wp*ЬќктЎЭХkџпЛкй}U5ћaСHbи˜wTэё{ ьРїЫЧOОМќѕХfѓі{№еGзѓУk:D'Пц<_сп3шeЈПrБЙи|џќ|ѕ/§•UЋљGюЬЌjZV_дР‹О|Ђ[‚ЋcдРјщвЗ—^zрГŽф?‹уeЈ<дub\ц='ЯЃ]‚пѓиo;{јƒЇŽр+64 цъX‚ч€еМСу?ў}~ўтљ3нzыœШ2‰га Ў…њbt№І1ўЫчПќђOОње­OїфWСЋCяз?ƒ‚9ММ1Ћ/n>}ѕ§ЯЮЮўМћйџVП^ЏrЏ)д™t.o—U Pœ:іэ рзёЃ]}t‡ўњЭ7йа;ЗнЅ|ЙћјюŸїю {‡Ежl+зы- пЁпИБџŒШЖVoaœ-‘qї2а칑Я‡e1‚o‡›ŠМЧSН‹”РѕgE)k=Ф О›f‰Ž ѕO38Х~ЬВbЁўi/чЉQ‡z№„К3И> эЯE *wђ%ЊЖ˜Дmžd[pзы8ЩуЎNЕBRpGЗEОxЙ…TTрzжпУIpЪ‡ЩнT&P9RFЬъn70х'bЃ™ŽТуlЗОG‹?\ЌЩљ:nеbк:Бр/ЯЫ1B†z;7ћыx/№ЪЩSЗПs3€sH#јIB=єНz5Црљ~Ё>ЙЙƒ;оР8л /gN^ˆ8С›NbМWїSИ!x08Р'v|аеЁЋCW‡Ў>cБ‘њ€GЏЋ—bcЈљјЬРgъфъЎКz50˜5NЗ:цadЕN!Рuur'j‹б NЎЩЭYWŸ*8‘л зЛА uR•І–‹шЅ U–=kЫT.чIДЌf=(Х4Kж ё‰Z’›ѓхЬQWзС J"Ь –u’L=hmЋ­$аxwЫъЄ1ˆУfвЙœt7‚ы2f—8{:]НХуЊЫуќ6ƒ‹oжžЯљwде‹Чd~Cˆ§ЁЎ,B= ъ%=;lžмKnZŠЩMё$ЖLn<хљ­Ћ+яjВ№SСС}t]="№€cрŸдёAW‡Ў]Књ|uѕЂ\=1]НžШ |Кz№й„КНШ<ЎЎnlу,ЎїEWЇжЮsо_]м^]зЛЉЋ—5Ќ‰qНчхь„К:S•Gq}Шuм:Ћве™въS\ŸОЎ.н“И>}]н"дћˆызеYrSФЏƒХuшъае{tѕˆРŽ!€р8Рp€|lДж'фup"j›r‘qB6l’fŠЗn˜РUы+n<§ršNоІЌ›С[^ѕ’xC%К"§еB?ч­y/DrKЕ:=ыя8!г[B”QMUвќrџЏ•№сqRšOИ&Ъ*дu№ЂuНКYhѓеъДРыйЬч2шW рњv2фвБСIЕTЂЯ6дIhо|‹1ЙI§ммxI{љК˜‰%ЗйXКрl9)№veГ3€р8Рp€|44G]]йЯ›UhВњVhŸбенј'оCsKœx2е 8ЋвL›Кt扂x^:&8у&YБVВыT—^пзѕvŒ‚+&ЋѓwМ(%kзэывu]U€/\ёФGЕ6uщ­рЦ~O]]—зBнP—ЎKѕ ёc‡:щ?ГсУžjZЙe]:я‡DAќd’лЎDЮ–ЁЋЇо5p€р8Рp€р8Рp€рxфрфЯ"Я<й6:p №hРi№П8С‡?Œ'„њl<Ю t(%ГŸzSRз~НЄЧЛџїЯ™zœTЂяКцЭwŒwTЦЯ8ЋЗћ|Юзё–vИs›Ч-{Чсё(<žъ|<бP_ћБшРЗО,6№Tuѕ№p€р8Рp€р8Рp€м?ј:Iлњ“А#Гл}—яwuYFIENDЎB`‚mricron-0.20120505.1~dfsg.1.orig/html/peri/images/meld.jpg0000664000175000017500000003571410476333252022462 0ustar michaelmichaelџиџрJFIFHHџлC   %# , #&')*)-0-(0%()(џлC   (((((((((((((((((((((((((((((((((((((((((((((((((((џРmo"џФџФF!1A"Qaq2‘#ЁBRБС$3Cbrб4S‚с№%ƒёs’ЂВТџФџФ4!1AQaq‘№"2БЁбСсё3#BRџк ?ц f3\Ежc1˜њ&Р\œ|Цbў“”Ћ?qK џЭ‘рOвћŸІ сpЬ’ƒ&qUњЅ иK“њр‰kŒУddz47аЫr%ъYєАЖ -Н”§.9p‹j(гэaќ№EЯииЫN>ъ[e qХЄ\œ?’ВЃЈŽ„АЫЃћоF Оžћяl[аiTоЎDьМЬIГЪJПЎ4TYс'ИФ€2—kѕX_‰WBЄЉR&Ињџёe&™Т,ИЯчЮЋf)йJ‚ж†Еyk]їО2q1ЉЬйX ЦBД‚уЃGўвNУbЭЯ\3]р=,R’ИpЗ“rъюЅ:яќБЧ—ўЧGЯљ%J3?ŽЅGШŠф Ї[Е6’эќєђё2™„5шс™ЂЗAŸoЊ@y”Ÿ?Ыоорb-[&РЂц*;u7V˜nЌъX(ZA№ƒn—Жг8?–ыдЈВ ІщЗФ2ВъwФМ5Ѓ$а$ѕsѓ^†ЊŽFЋAЬД№/hŽ…:‘ъ‘Нў˜TTЉг)’UЁия$PтlpпЏ№з0dšкdezГыž•Z]œJFїUПŸ\аsн‰ЫFWт])˜Еe€мz‹IБ+Жз$мw6ЙцжицsDъ>{ЂцЬфžцLфщx ,$]r№6‘цTvУЬ‡—xiP›+=Љu'vдј,"R-tИOMFЧb7Жзжеk3ё2t:2єjKЄ­˜ Е6Ÿ№нVуuІ-Ю\>t… фL‡—[?э6nјљЈљтQк2-ц С ўЌB•QсГ[…–Ћ/$м‘=”(ђй_Ч и<„ФK= кŒЂŸэЄЛЁЄzиlІыЙ7-бІг)tЩa3п[}ЦŽХ$Љ"§Ж8ЋqћЇчdCњ ъЬ!3$VшRWЗ5iL–Aџл$Ж5VИ-1к{•,“XЇцX-KLGAuќHыњaЇŸИyEЅdPьJC—вm:–•~ЩП\,j1dŠ]?0BъPЙ,)MИС=X7"§ЧІNXяŸ”JIqŸ†њ™”Ъйu&Х MˆЦœ=Ёfњ?N_тu=+DђЃж™h2рQщЭHияo/ѕЇџuєќЇZžМџUmŠl0—YC+ž…|МЏ>–>]ёaR0с!/ВЎR­цЉb=žќЅ“К’“Ѕ>чу†9z‚и^wЮP!>>xPџЌ>“фR‹лъF=VГ]k3УM&Т~•EP!ИPФЬXВ_[‹щXАЩœ ц8˜Y”y:™a?ЕшЏ#щ‡дu0ŠŠAсC@"#šb­njƒm$Ÿ@\О$ЧЂpЊАШј|УWЂОGIаЪUхЉvСЦfсх'/Jƒ –У8–$А”ЅХXю@Ии‹oл*|ЁЬЉ†лfD&›gткЌ,Fн{т#Q+sЋ)ТЅGz%r˜Eў"žъ]kяbmѕЖ.6ЖœRJД›ЈXƒ‡5W*fL5ŒН"Rтс˜ЭУё$lЄž„F'!ЬГХІ‘ ˆд рЄщfCCLIЪПРЃхгЫЎХПvB$N-ђі\ЋfAŠ<х8х 0u•8Q1кЅQЬжђ)j:э:Kћњд“и Ю *9жА‡Ъœ1Ї9G†ЄьЖРOMnЎп•вњEЎ$ОL3) ЉŽ;Lˆдœщ˜Љ48ЄЗ%єЅТ=д§БFYсt4Ѕэƒѓ\*– Н`/ЙЙMЖБuDр§jГR ЌUЃІI:(W1ђOšеЙћуцmсФJAš]1bL‰їŽчХт™P •ЄіилгІ ГѓЭ†ИW’ышЖTЯДч$Ÿ–<ЕO œgnцl тџ‚тиOїЭ‚R}CєУ ЉСЧaG-DЋ—ч-Оcqф4…їАПCŠ<ЙŸѓ&M"6яУIv›RQr3ˆ§дjšW^†лєТ2 І‡0ђЭY…žш23O ‰CБгЊ}!УљБЯr?y=wы`N№ђЉkЂ ЉІPO9ХјB@љ‰=€ю}†фтEFNƒтD‘1адV\uУй ОYk‚љЮОЈєХДвЗжя„[ми~ИdЮЭO‡дЇЂdhкœИы ?Xž.з3ИaБЛ–Бёtѕ7ТўН]Ю9е*vDКХB2ЭЙЏ)LЦGљ[E’НёPїПэ;џ €ІKр…FС™ušKOоХ –ЪH?W1І­РŒп 2ЄGŒ&0ѕБgš ЏŠ2у4ЦхХЊЧCѓm*Šу.й-’ .|ї#ЏlZг цмŸMр‰биеЋу)’д› ўвВ‡n˜Б6#лќІіЉJK|Е>3ŒЌ2œjEЊъЬЉn–ЩQKD $И|ШЖуЁхЈъ8<ћШ[†R”*хJ"џlRц2cЊЋ% В…še ЙB}МёЗЃ Б9З5|Džjк)о˜"(ЛœфУ(s’.„лPњмт‹’ѓN)UD)Ђш!мІи3QX‘ЯЬqЕЅ(ЖД+pOиу'6Љ1›5‡лВ’”њњтRаBЃ8Іжи[dъ Д‘а=SЊЦЇЦrк€ђХоъe6ш“иzvРšVУS i[bлhвјА‚ыW%2?8ЄИ†ЏЙ.1`vЁ%WцzsЧ0SŸЊMKсАЕ%йi*рuУW‡RтЛJ• †н“КЪBJlmnјUeь­[w<ЄЉж…9mŸ ЪИ&їАЗBn~иqR“—rХYˆIУUYл6ЦЋИЄљд\i^МrxzžЪэ”?'I‹–ъВЄпёywЛŠ7(ККпШ sЗђдKR2ћюЊГд” ўbЏrSъјщо+gv2­! "[вVYSeЭ!MЩ$\оФXzсo’Њ9zrŒЦЉжЎИV,ћЅhЗšMМLlZгИurі§$учEВы:ЂJЎ>ђ=:%FQ‡bХіR_nки>AizлUJ$ ЯAЇœЖЕЂ\‡Pк|.%>`v#pGг j•Фу^F пФЁЕŸЭopт~ЉV™B}&™T~Ѓ)!Їg Jd l ЩKШь€?ѓ1J гЯnыTgTbѓR#d‚дцyўPKˆhј”IџЫсщё‘NTІ™„яФЄЅЄ Иv#ФzŽПІ:ЗšЈД4УЉьCLеђиSЪвЋ^зџ\gŒ‡*­Qn­Br’’ёPКOЭИПQєЦnB|A•g бlсbоўЕoчФtkFГЉ |Yё.ХEИєЦќзг`?Г@ъmїФЬЛI‡–’—eЩj;й<Е:4k=“}їђС,љбa”ЎCЈiХ‚”(‹›њbЕ+E~zb”W;ёw†ЦГ—Њ7gЧŽЅ…8„ѕеяНМБU‘gФт—ГдсЌ6УЮлvоžКWkњмсЛ6‘ЃT’™™‘Š”і[.& Ў%ХCПQз§˜cН“јЙcRb;Ј№)ЈЧРD$ƒcд\+мcЂЩЈи:ыЁŸ…Ч7$'ZЈTшY3дІŒиpи —СtЉ7ѓ `Ы%Ь“$"m`e2•’сH@wјЎЪŽ6ЭuЦф­.GЌ6uДЛ™-Јлї–йJ‰џСФиЬH€фGžBб Ѕ;<БЮИЌъxп^Шсs†buЩеRƒ1щЭЎnАљ7Y№ЋЯЯЇз#RЋB\IoЧyѕ ЁЗZ?0ъ5ya}ФFЂФ­C€ыБг% eC{щ$nz›яєСІC ПNЈ™ŒЪJщЮЕсH;*§ ЛcrрƒH8cpЊ5UTъŠфЧ#T’гe+Œ­‘гИя„^~с%JUnˆ•В†мSЊŽЄ””€IЬcГRТA#ЏžB~mf Ј.!ц"5§Жх)-я}ЧR}1ŽкщѕžD@RцРJq О,pк;мчZЬ’шGЭ(!7‡э))$ЄžЉ6ъ0K”2cyI˜u|КщЊ ƒ–ъмоЦзЙЖуqb0КЃ \;тм8ьЅцi7BRЯbF‚=RЃпБЧIфiMFЌЭЅ! Еb>:+vАmwГ­§ь <”qšГЭШ+ЦOЃSeJ~ЃQІЂ-R2СZвс)#БЙР.}d?›aKЂJˆє„>ВP­яЉ&џl5ѓm-љyzL*QCМFЅЇnЇs„…Q˜”МХІ•PgRм[ˆ7P]ЭОиЧjяЦЄњ)v0™Š)Y@O™”е!Јщ6RG–+™.bЈТEb"$ПЪ2№” ƒaыч‚оц ЕШвйЉВуH#Ђ†,3]кr˜Їг›*›-)wїGЎ(кЏeCH Є%rёQс–z,ЖЗиl;v/П1?ДвМСѕУ;>ЫўяЊd$4нКыnTcД›<Щ#v‚ћ4Ѓіё Зз‰5‰Дƒžќ‡ѓЩЛm2.†рЌ№СŠЋД\Х;"ц–Š˜кifї?2‚OЗ'БЯNhж3§ўlЋІšw –ЮU—WЭg0еуЖЩ%Єp4л~јu№Л/=>‚З*‰dС“(hX[r>˜‹ЧjЭQZš1дZuд\|Cj–ПЊ‡Ў:XЫй)иАŠуЗД)]oЖ1\Tw(k5*@IŒяMŒЌыLЃБ—TŠs RЙюsТ§mпш0ЦЬП‡PИrлЮSН›вn ”l/шpМ–дЙйš ’цОлVZ’ОЛsє' КƒЌ‡Щ††ъR*мuЙ?LZБхфК з?ч>4ЌІЊХ%х&zTъPn•ї)З№іРџѓЫGћAw.ЬW-Ї\нP=’z žЃзЪрєT8hІфe?–тd:VџХ“Є ›„Œ#x–?‹1БОJ’ІŸj+?+;~eCb1qAbЃDЗтжH‘’3K№ж5ФYжУ xT“И#аŽŸQдcЅ2\˜м[сєœЏUSkЬTvєD‘{—:{єлзбVЧ;U`=LЈПJlы*)>ОGызc‰њ]ЈBОв ЎЅS ЃeМА‹љzу В§К]5ЈHq-4еьЅЯ™§OпМ"ЃБ№ъВ›К”ОKK"њз#ъL2шЂ;Ў4ЬЇ–ъвvJЮпLdPЖL”В"ˆЎЪoђеЇФUиўƒЎ6УJъ‰LzЂ z‘сm&УдћуЯ9Ч`дуR ОњnEБ0М_JЗУЧжяё‚-?„Fqо@ѓehВЭЩёAf\щГPћЮ€кŠ5ƒЄ=Бю-™rмQsњђОdŸю§- ћ,O†Q-oxT6* =~˜"Ж…`Ж“1o…^ЭќФ}qіƒі˜}HGТ,ЌЄwѓЧЖЃУЃFK[‹Xш•ЉgЕъ…Zt}k)‡ е%Є ќФў˜"й]œŠU–"ЕЮ+jЫtxFЪoK\}q>ЁTфгЙDBl›Ќњ[IЈAІ—DЪчЖаpІщ'пЂТёМљˆ™2RŽ RtЅ'гWйz`А%ЬenЄѕHѓЧšЭ9&[sZBNІжƒbпЈ#сŸKŽ4‚”2йCIpмъюN$0Аы+•- ,žƒnŸЎМGЭЪљ:вк&4Є6й&СE_*Нњ§Бu“рЗЧsФfЉE*}[­ећžо­С€ќїЈЯОњЅMy2’БАHB……ћwџУ‡+,ЄЅ1Чќ>P=G—ыŒ5HBœWЉЃE2Й(Gv8JЂ?jвTIИR;\OЕЧ|-щ•$вЁў0–YZ0ЅˆЩЙSJ иъђв_ћbџˆuП.ЃH ™ Р?ЌЫ-юЏŒoщчl,gF4Ј№›Ј;ЁoмІ2ЅЄ[Њ‡змcбкZPmЋc ф}aЭ І)ж†vp$тAžЙ BъыЇцšueRTЏtjъ%‡RГаou‡žЦ~A…ЕInІА›‘—*U§.„єЧ;ц&U&% %!*ПЬ5‹[ЯЉ6ЧEeЉ)L%AW[вŠНIЕЧ23Э“ї)8цёjЗЌщп#зЊбЛЄiе яŸ˜ƒŠЙrp Х‡= q˜ф–оlйHrж$І9аfьсУ)•zJЛЎЧm€ЈќСЌ )IIіи‘n—ЧZSивф6яіkQв|К§ёЮYЯ OЊц в§Eі›yШэ3KoPўАAJˆOБIПљБЩ ZAІvZЧЊ)ШybMRM:ŘfШЋVЌKВ+C$‹ ш-‰ќgЌJЏа!ЩЅМє! їЃЮвЏ.!"уіNћŽЛ`ы†дGшйb4IŽ%ЩЩe(Zв>[&ж\еjыuмСG-б›gLЩќЪiWКЖjОо˜ш№иuЧˆ>}?Тшpъls‰{d њoћiм?@Щ4™t‘Q*ѓеЬqСБшl]њ`7бхSшH’Є­MОЎdg 7A$“И$tЇjп єњTЅЂ9YеЩQ rзў8œіfjobвdДЗъ€–”ѓЉЙmАЛьO}6NнБшkZ^ 5ъМэsД#эl?’МэЭЗр— y­JЋЗЬ&GHФљNЇЌНS~}2›Q‚„Иъ•bKk^‡>шq_l_ё~­˜iThrВšаg0№uцCэn}Чл >дЪxeF™wЈхДЈ#Њƒs[Кћиpцє‡ЉмТ-Ы?Ч&ЋЎ9‚щƒ„ПЂq‹%f:SгЋЌ&иI<Уэkоњ|&люGЎ7хо.šьЇЅгQ„ЩfLЂR]xSб#О9’]}BFn€Т0Жme>›[щs†п џ“У81kRZˆЪљ€­J !IY7ягo_\mRДЄч€рHїі %М:ЋCДœЦЋэfЃ›ђЦzu9ВЗVјuЈЛ§Aѕ6™iMМ-єHиєиэО3gеQЫ6ЫєjЌJƒЪyјщв”sЅD›’=01TЮPоЩй^LДЧ•>™-Ц].,%ЧЄ\є-яц“є ЄfКˆЄЭ‡-BKNЁE—:–вˆлмwє§1ъ`nšЪЕ(цз”$Hш %‹ˆ$Ы—гГІZ[ЏЈ1Б€а`ьce?‹™Њ&oЩДљŠo“˜b:сMЏЄnБх}Жѓre‰†Ѓ/е™QKŠ~3їр!єhZ~Зls„ˆъT'PЉ˜ъKgY [ŸЯ юTИSD–Tц˜ыŒ\љˆjciАњ\[зŽ5bЫWrгћNŸТмНЖЉoPx€sOяэ+ Є8УЪієТ/4ъЇq ЌR\м]žљ‚юќКbєЬѓђН?/дЉO)Gš‡Eіq:V4ŸCПщ‚<ЏžhЃ,ЂНЬiЖЃo%л]…џЭБчэšъM‰jœсQЃ1’ЖcЁ…Кœ оиZq?;Сƒ\ќ5ЬиЩќЧ[EЮс HъQПK@Щ\M{ˆ•ќЧDЂЃр˜D5ІЂЂ!@,‘а\‚-ОиWфЪTч*ќ ƒRцЩ[2.m*Q$}Бис1ЕRЕc<‚b`чyэ•Џ}zлWм–s‘ДЧЌі„њЪђч?—fЩ­ЩD'[RЙ|ђ’т[) ›мlNЧЅН1Я›žXЗ-›Њ=”*‡8l MdŸ)нsъ^pцSЃ>#ˆ‘Ѓ[=ЮIœ@rК”Т]ЬДiЁД9љEpЌ^кlт=EШП•№W˜ *Jd>” Џ–EюFуѕТя(TS&ƒ“gЄ•ШaDjБЛбœI?NИeHp'ЎуЅБСИU—dhЙўФT3td䔇™ZYF:Wtџ-Ансќ1ђъуеoЭRtЋКzaw6cU$Е=зЙYi?—ІфЎŸ УІ:ТМ ь{cbёф064!lйUІАпрiˆЗдQ~[~яѕР3™zNjœ—” џVG$и­Фл]ќьIђNNnuшэЂЃ™І*ŠV$ЊсVЖЧКHБм^јя[pƒAЏfЎюГWe*LuA'mФр`gіТ–ЃУЩќq€нar РІвАЋйJMРПN"IЊ;pѓŒzœvЙmTZчiж&ФўЊPџЇѕIъo2б+*u>*“/Љ  Іїв=-Заaƒ§)#ѓrЎ]™ІыCЎ0ЅzЃoџ1KКкИaЩџБеЄъN,rЅШ­0œЃNmДЉQ”иqХm *ё{я‚Щя|ЭђуЄ€p ’ЃЖјс‹†­”XˆЇŽЅЖЎ/{ьz`юA”г1)ёƒKuIжЂГиОИЂФЂЛPФ‰Qж~!Е$,Јн+R­лмуhЄ)ЪФ_ŽynИД( …МБ6e?:\MѕЩ vн/Йў8ёRццEЅ‹Ж-фМо ]-r_oУЁ н~G˜˜лЏНQ~"›m bЪQіЧЕАїтSHј•YhRїИЗAэŠж*ЯuІ'4 МB–NХCST—V—ъ“[дА›4ƒб8ˆgA—MmЪ‚”Š ЫkлЊЄA”ЅHA‘Bщq;ЄzWWž‡QІ<ІкAtІфށ8"ŽЭл 9)іŠ—5@4вGЪ ирŽЭРИnЇaжјдѓLЙI†Ѕ:ZсIя”fdЬuЙй CщRЭы‚)4єў4Ј4Ї_Ь vG™ХуjD$6„PЗ /t‘ўИ‚К i%(eВ.Ћ­ˆЉЊ1kYхЅJВ;‹[ њт"Q K(‡ФШeh *ˆЅ›\x…№нІ8CH Ž ичќУ\JЇ~(Р*ЋЖц„ЄІр5}Хџž9&НЁHjqpђєwш6мcQ-R?2уC<ФЈICЋ>!ŽІкpAдHFњa}ЇH8НWЭжE1ВЕGŽлZЙ–и&нюNФп[Ь4†шд„C8РdЩBJtЊїqt›,"ЂЕ—yяV+Ї–ВЕjeЭ%-)+(ёrвQ)Н€~§qис•ЭjЧkЁЃ”FO\ БьЃŠq–илВЁћД .ь:m'л*Ѓ8Г&Іѓђ™ЅЎЖ%І.” Ѓ­Х…эa‚L‰!.№г/Ьp-jiQ”RіfHNпK hЉgŠ}J,КE3’˜”ТуЖыIаЕЄІкMЎ.AИѓФ\ЮgƒQ^lўcQф-н’’ ЈЇё!‚Ѓ91МwюДЌ8•џЇтоб№Пљ‚:цNКхtЧKqЙmЇJSЗг5Љ1Jސ•‹љщ'ј_йЊЙ+EnЬCMWrl-цOnИцЌэФЩЭMЙKTXJ i`?Д–8іь†Щ[фЎЋЂОЅйФєPщ|*xLU6V*иCЊРtџ…NxBХМЭяџV 26rЄдc4ќWмXU‚‡-^{mА_›ks№dЂЏЪy –Ь`•t,нў[HОРѕЦkZяЕЙ–ДИ;Йc_СЉ$LьЙќ№ђ{t)%ЈЋx%heеXЉFїэЖ§ё}@Ш­ПNn,ЅЉ\Ÿ]’IЙ)НШЗLжYЈT3ѓюЛ Ф‰n%1н|( ё •РѕAУ:Ѕ5šeЧd–ЃВвn­*цж7loёў#Ф)SЅklCъUШР†3ж4янxЏж%ФЊ_AЈа ˜=5:{.{ъДШМІђ‰Чr7ѓЪѕ§,jЭЙ‘ ЗВёчxMќ ЎЌ+2ЧЧ#…YЕlХшсVєW‹џй?|MŸЇХ~$7”й ЖгqвЅ ,ЖJЯЅю~ cЉ2їЈT\œЌД†б_BƒхЯ™т@дЃі:XcŽj6‹CJо‰\ЅСъфкEJЂе1jnTˆчJа.Дщм‘хсЙПkaƒ”ГfЙ1MФqйЎУ˜§е#Z–Вwё "чНН№1rtючК}M„*M#­‡ ЖЄўгKђ:I рњЏ“MЌShбч:эЙ2}J RqJ ЌRНў˜ьк>…{wаЈЮiЮ&H:kЦыW‹вmЧ 4љsO6њAMcXЧš“GЬб!PЁГQ› šЊRД8тJSт)КДŸ-№НЯUh•jЋ†=EspИ„P&Р‹[Ї{иbо‡’iгу!йВаІмJюъ_ VЋь@ми{я}К`j~_f•>zАѓ™qWPЖ“cЗзыŽЕНЇ ЖЋUєŒ<‡l#3ыщ:. §3§%ЧEљ2N‘&5 Fг)ЗУЧч ђНBBд)‘Ђ?qЉ=;ь2І2Љ Œyв$“k§Ц0Щk€а‘–—TZц^ЪRЄ,ЇЇЖв!БdКЂŠдъйKjь›дуХWŸ?4]А“Еw“ўє[f1IZЭZ-{^}Аё‚њy м-@Њо‚пъ0Ј@[ЙнЊ“jqЉП4н:oИўxvRв•ЧŠљ!Х†эЌwИўЕиЂT5s=.#вЈдV[y—ЄКЫ‹*х8^ žbGRM‡­А F\i2пJ(HRЎ-~ўg>9Qрeјдњ|$,ІzдїцR%$\Й#š=56бЗиуж|ќ"•ТZх=OЖьвA+*œ%CM‡`<НЮ>ч}№R€вѕйБ=јd\}РטттП‰ДуЪN'u§UУЊ 6ђK> Ю†6$™IŽњœK_Љ6ЖУОЬЧдЬщ/М9ш]›_M’|Лc–c<фi >ЪŠ]mAhPьAИ8pх&Fp^ДДБ*і'IхИ<ћиу ч&sŒSЎ …(Љ6мoŠмЛЉщktЃ–З“ЬіœDfЛHš\јU2ѓGФЖиREќРטЈ’gƒs”Т†ŸЬщ‚"Ш… Иэ#˜:‘kѕп|TФ‘Zš&Ы V­*ЦˆєшŠ}”FSЉuNуКМJk{_јb[tŠ4‡xАВћ пZЏЈŒhЉП*БШTD!ЈЉ№•Јь}БъD_Ђ˜Ў!>Д„щ@ЕБ)?NЄˆXAО ~\E˜ЗЊЩBЂF}Е|МУЖМ>—HМэ*u‹”žиГ†тІ4уђжуp[BR›\т‘жО:я5H]–ž Ÿ,1P)iЭ ‘ІЩеыч‚)ЌДлѕv[[ƒрљ@Ё#ПЅќёцД•Ыmі„2л”›~еЖЦкt4ЗNmч@x’ЄмєЦЧрќR[ЙтдВž—Ж!ж-=іœfw0‰"ъLѓ<њ}p‘ —ЉёцEiИвu?|ŽЇЬ<–'5XršъƒŠY 2сMДЄоїѕІ9C.ЪŒ№—%mqPRо‹ъ;wиЅWЖJ–љŽhsˆ5jvd;M“ Ъcю‰I(6яqЇеXTќЩM\l­PhЊќзЃ>S‹ Ђћпolul7˜S ˜оЂсMˆHНЦљЈГMЌВІВ:[NЈŽгкJu›эЉ!$Ѕ@Плг{‚ёЕ֘oд225оg]:‚5Z—\Ї{ œЏd Aѓ˜щзКGб'Ђ‘H™6BC ЁJmВ,TэьЎџLДуt>ВгыаљŠмd‹nVъвђ€ѕ ѓŒf0Њўc‹”ш№9nЮЉ .ЦRŠдб;h* nЃcгo<<—–ЎF\ˆЩчEЫ‹)†ЃИ“&ХNКSўbоŸAnиЗНЎgAžыЋsRГ‹iж –1І:#Шg%!œтˆяV H-%>-хіеnИHgIАш!Зоy+,О;6дШмщ лЯ BдLLН™ƒ0!ЊkOХqЄЌТBг~оGUj\†хMnmAЩ:†rWŽ2ƒ‰#X;”zX“киfUIЂF”Е6"6>Vк)жž‚щ1/.акЋЕ=ЩRДЬ„†–гЉй7QВˆ=в ќіТ•fаx­аиЉхsО–Л”ѕщпгTЬйy—щlЪЪъ\–VЎDЅЇBR7ОжщkŽЛљт$КQЇ"UІЬ\d$КЄКV”‹лQ?)Х%I™”ЉoSZSœЂя-фЕнh6nЄoямЧVЉР‹”dЙ=Чп’„(КВЅѕ|Кzоћћчey6ЖЁЮ!рїgCщщˆX­8YАЈц_‘[E2с0 Aœ‰Di:ІOєPИ%6TУЅЧЂКс$ѕ[ъвК5І џЃюYE;'šУŒ–хд‡0‰-\”§Щ'киБЇх8•‘+ЩbєКSi~rR­œ’SЅ _ИButю7ы‹ЌсхQЬ)"q– d”m>и№/Ј*@uќ,ёIю!WЊQјƒGKЬЮј'œвЄы"ъИJHэзѕУЮ `W)R ЪX €—арлqвјCжЅЧ›˜)О5MКг…тё^ДiPяНШpгЫ™nЅ&тЕ5%Рт‘k6А$иЭ]­хbAJšЮS)Ш›  УЏхс9З"„ЛЫBдізWЊC'џr&wЊФЄДe4мКcn-–TЗд€Ѓe)WмZУЇlgLИ3SЊABnёиоо4›ЇягыŽ}Ыэдђўec.UCiІ) ъl5нiБђ*6ї6=-Ž­Ї‡Ф,]OьЬšШяѓЂкЇlђгV›‰‘ЄЬFAhлpQї3Ъщй^Ї1ѕ*TWRТиЗљїРОUŒЊWmMнчfТлЉogй– ъ8ƒBuЪ›Ў0рYцДl‘Ћo/nј1Юѓ%ЦЬŒЁЇнlЉmВnлЃЂ’F‡Mw4вЄˆЮЦuЇ—Y:qЙ­Šаaй”='1eъn|ЩkЇTж\nB5!р•ЁCЂРѓЎŽBFUЎ3—ЊTиЯЅ†ИOiЧДи%^‡ТВ{СЕJЅёЪqtљЅiZt6–M–=ЦЎ%фњЕC*Ф­Р} ц dE­ЪаQH№›ЋЈУцъ:жlІЧј5 ~5"й‰СZ|BХЗєN>Јњs‰к{$оaІˆYЈУ☹ќХЅiGˆЇЫИњ^нБФко^Єф9LRaЕ\ІL@ЪMШ *7оіХ<ЧЮNЎ)C)X>5ЊСDw і>^˜мЫХF\‚„>Јo„Лћ‹pUь‘А?SŽї.є…gCУDާоVЇ уU.(RАp2ЦЩ3эˆєдўSiЈЋЅ№ВMBJŸvЃ"PЕ8” €ЬЌ:*škФкœB”@РlEŸ˜"Ь.„PВыœˆзMЬ™$]n[ЙОїѕ8ЉV№щR YPкіш|Бфъѓ=Рѓ§.ШKЗљŽqJŠй[eЅЅHrщ2§vПп ЈбФdЖ„ЄtQ­о^kR€“wPхљŠRєЋPИ{0dV&ɘcSр†Ъ@\’Ёroа,MгюPоŸ… *Nk Rs ;рыЌЖфrДщ*:T й*ъ/kvОCуKах5&2Ыo4 Д(uaЩAт:u<71 4 }$žщ#зБС\G*QфГЬзr ]зХJbЪЙiŠmuЛ}ЯгLЉq o[„^Ъщы‹Hђпj)ьё-Т‘ы{рŠ*a|=P9(Љцt ^щ*ѓФљЉŸ!qeВЂУIлlTЋ3в]RсЗVгФt*чгbJ‚”!$%)VЪqFфр‹Тп.гкp5Є2ВЅwWž,šфšqmч[AОж;œA*f kmчб%…м”wР}LI…%2#HqQК@7АђџОœtЗќ4З)Н/щ!$Ц7ЪЉ"55 †ЪœMЕ"і$р‡!ЪŠЖ9…IMЮЇ>Sлlˆoy8‚рНХћћт!ŠrYŸ[ŒЫ(хЅm8уŽЪыз j 5Tкz˜жЗPтЏe,žЛ№І–У”Z2jкV™mО…Gek A<вUњy`ћ*f'Њ !E T†KЌ$+^€ЖЂ:\žž˜дК{~šŠjђbвiЩmФ—)(MЎIїЧ%Ќ`:bƒ'ЛїпЏВžlЉŒžRV›)АинЛџšчыŠо,зсSi1Њеƒh„ІЦ˜ПДЕлЂG|`Ј WŠg R0%%8дф*^b’ќ ˜D4HаJўm)#Јѕэ< І%жИ™[[Эгџс9€ќЃђлЯNпІВіW­qg2ЫЉШYƒ—ЂЈ—e>ЃЪŽеўDљЊн†yŠ+™п'9Iс|шБса\Ome2eмЉлэтИM‡SПMЕtЎяZ›(#љžхgЏpkrˆ€б ЉУ‰C[АЄi2Е?5Х|ЦBьl=…‡г™’žеA…ВP—гЈ)M‡4ѕŽ9{‡ќ`—Daft:$6В ъM•ЋИXъУУ Lr­=HвPф%…оJ‚ƒЫ==чŽ}JЎ5AXœ(9Ђ—O…"5RU;т 2ШRиQгЄtП\eзPKQЂМ#ШkPвЋ6иэtžўит І™ЄЭ)r#‰YmЦгnbІ›ž„_ЈСAЎŠФtЉЖк”hqОщpя`OНўИV$в˜AЊЗEVѕЇcВыh… жPиЈіО|y‘ +г—5‰KMEеЉ1’ƒ}dюI@oіѓФŽ&ё>K6Ц*3ЪіmЅIUџД=ˆђы…~TЪ5О$K9Ѓ<ЮTЕкЄ:4ѓ?Лe=§џŽ-F˜ЃѕЬЯљI;+žS Š—3rKшpGІЖНе"BЖИэЕ‡ŸN˜sdЯ а+гцјцКрyjWBOSыoх…e}-qZф ‘SN4u„SЉђУЈNф…пч$<эзШv›Хкц_Šў_ЮДщ.Мк’…•~[Љю“Б6О§ёbпCЕ1ŽЪ&LNЅБ^vVKšЫCXИЖ }0#›ІАЌЫ‰Rу% ’YlйjКHё|hЩмQЃVкчGЊ0‰r Е ѕ˜эЇЙЩЗ_QŠ$цјыБ1!NSщtШqд›ЅВв§`>ЇЂЧ5аtй Ћ“MЈеiѕHИЩ!е xŽнн/ќ1ЅкѓА'д˜’гЮОјЛ „•#n˜Ёё;%УјЩЏе›‚њд †CœЮiгћ!=МˆТП5ёЙзgJFH‡!Il4dHQZ“bl[OmЖ*(—8‡dwїS+*MezФsNДiђЃ9Ђ–WаэиzyƒгxgMNDЪ*Ьѕ‡Х~М~œU‹M,йO-W z\тЃ+хf˜yyЯŠr”ДЭj ЋќйK5ўъ6щп ХЌЉTN1Х–мŠЏсy…Ї  Ѕђ” hЇіFТЪэвнЮэjѕ*ЕЌyпžЋ*щц4uO ЊЉ№2mˆюЊ+­/K|zQоўЄ›§q4Р­е(P$†ЄЂЄгЈ DwRЄ‚ 6;tО9еъžyсыb‹™ Hz”—Нx’Є‚хК.,ђиd;ЦьЏUЫџ –цRІА‚#›eQqзЯс…БЩœўViъŠПM6eIЉKgтдАU i(*лЅИСžOSq!Э‘S[ПлС.КS}CіmnЂжТ1ёR•S ЇjR \жпSW0К ХЏл1ПЄUИ6э> ь„xJXJRлžЖ$§pЌЧЙА€„{]Ћ4ЬЬь9_ждЄ)ЗRnJUаzoŽIЭrdХЋЫІ2щўВШ-*тзЗAмЕќњзЊйЏ‰љ™Ч2Х\VœHIJ@А'ФЅl_Їž,ргђї TњЌˆ•миGф4UћпуWЏ@G|n[н>ж›щгџо'Ў? K‰o.г>гќЏГ8KУз)ъRкЪЪXЭ›йѕшUь‘ч„r”TЂЅTMЩ=ёg™+“3 ]њ…Eе8ћЊ*77ЕЭёWŒMl ъЈГŒЦbШГŒЦ`Šе9†Ў—Zsё%M #RЩ{ИзS­дЊŸёѓ_y=UdњFиЎЦ`‹0{УЉЭЂ ЈЊгЭц‡Ѓе6ЗOCќpБd;єМТЪOB0Dђ…<ОbС ?о)6лдг"‡.япцB›+§0‰c7жй@Bf’б*BOђФЁžыРXJ@‡);`‰й5ЖВь'1бНW‡шGOЎ+dV3ФXƒ—П„TЅ”k ~{{сRЋд*nk-з‘VУиtљЏQ‡џ >S_фuC‰ЩVg‰љŒE[єIБлi?”†kЬMюl ЗлшqИЕ@ˆьЎХЇАњдсvJй MэsЈс,МЭ[]Ееf›yМqњЕB@Ггd,wУО*ZN ”к{-ej\ѕдј›Zz—Э\8qK$м‚ГАњ_мBтМЊьQ2ьdQrу;7ІуЅдGSъpБ;›žИљ‡ ™9IDY+9VВeQ3ЈSТяуnїBЧ‘8ЌU2o_\@ЪЙ•doxЎџ1tї|АЅЦbK<лЈ”ъ/ё2 VZƒSbГ’гЭ8лф[Ї_ауэHё75ВUUaIaФЄшч"*IwŸЏa„Ы2gћœoќЊ#еTžЄщTй$zКЏѕТ7!бИOŽNd‡ ­Z†КЃ*Б"ЧЁ$mlT~C5Й™ћ2ЊАЖњC„ђœR‡‘Z…’=АДvT‡E}е%,œiТ2sїІWЉЭQ(Q“FЫЌ -У`и(yЈѕ'дрƒZЈPj-ЮЄЩr<„… кўјЎЦ` "mU3ІZт чSkh5h- ЛџдMьЏ~ОИ-VЉeg&ч(.ФYПхLTeU![_иœ+qєtР4W§˜Э2ЬvъгшђУCCj›Rц%ДњЋЖ<Ї)O‚•—ѓЭ6žТЭжˆђ_PћПп нjЕЕ*ојјwы‰„Lшф<Њљ“!of™щ:’‡[`+Ь€nЏЉХ>~тMs9)-Ku1щэ -DŽ46„іиЦb9DЪ)fI%2!>у'ЂаЋ2ZтŸуPZƒžщQЋ6(р)}#бСтТЛ‰ Q0eRђФ`VЊTѕЫO4—РіW„љuђЭ*–ЌМощBїZDTƒЊїР3L?‚сфнйеz…ЏсHC@љn5ck|@B24U'хђCЎпЮъкўЩ[у0„V•кѕJЛ)R*’œ}j%^%/Šд-MЌ) )PмlF<у1(Œш|HЬt–tЬ2"t,>ˆ#ќЊ~˜’Мл—Ї+UW*УSŠUдИХLŸ_”њ`ˆ„LжВ+V[yqе(‘Щ+P#ЫЖ=GЮє:xWсЙ^VMТžТ=Е?L/1˜"5Ўq&НSdАлщ‰Ї)„„'ьщ€з]qч нZ–ГеJ7'1˜"Ьf3‰Eџйmricron-0.20120505.1~dfsg.1.orig/html/peri/images/icon.png0000664000175000017500000001243410476334264022473 0ustar michaelmichael‰PNG  IHDR€Q•>9 pHYs  šœЮIDATxœэypеЧ?н=‡ni$Yјlc,`Œу`|`;Фй ц(C–ЭЕ!йЭ&й#ЩVЊіЊк?В•MU6›]ВYЊRY6ЧBK‘ №…ё}cŒ%й–ukFsєЛіFЃЙ5’H–oНRНžщ~§њћ}яїћНЃGьрЬь™ЎРџwМ#Р уfя0УxG€†gІ+UŠ€ Ba,B§>Є5ў /Ќ„%аѕP hCњЁ.С[pЬЬŠ™ ZqзEьh]иTЙс]ўЊЌ*e”2Z™ТЛVFЩ„іўйЉВNx Уlи@}=Žƒm'Rj~тa(Ф… œ=ЫщгІЗЗvУ‹3ЋФLPЁxА“OœПЎeёіЊ­K}‹Е1Ъ(Љ•JДz­H4љ„ZiЃeрŽЧыЎАДƒѕ_ХŽцa<‡6}}=ЪсУцТ…3Цќ^„‘щІbКА ;.ёчoДЯkнQ}ЧbпЂxK—F&эL<“C+iД2Jk-§зьm§фk4Тv№<‡§hщ$yэ5іяvwПП€7Іi`yП=XcэЌЙkЕ•N%к(iД6Ji4§2Љ‡VЎБї,јт_SМЄЕаЖРў<ЮpAŒчеЩВ8ž]ЛЬсУЧ„x €žVX6х7ёўфMћk'ЖЕЏЈўуѓœЙ%Е”F -Ѕ‘в(iЄ4Rj%ŒZХѓв(ЁхЅXї/+—oК%Yо"№ƒq s c Цђ%Є†nИСZПОХяп|щвz!F sЊCиЉръ0МоВC&№Щ›+зЇ[h‘р]'иOˆЁуz(ЁХ€|ehяЋС“сeпФS•,в‚&0 mЬЏ "WыBe№ћiogгІњккѕ]]ыcБ tN=S,Р—љіСѕ‹Wўi§ЇšœЦ8зТˆDЋOp >ўW%Дьq{wяipOŸ;РМOгђўдR‡@@=Xu˜cT~Z)Вsи6 АiS}Uе†ЎЎеЎл=SСа”љЏс+Ї|\ЙЏіž kЁdТЌzкQ+/ЕŒлziTGЄыPшXgє’1ЦУКНTЕMМCДСМЉь+нrf,ЦѓЯ›_м#ФwсJyyš‚9и`>]џ‰Vg^‚њQЦЕЩрicЪ=>sdфxП;ˆБа`, ЖГњћЙ` infж,Цш+œт]w?O==zє1xdЙЈš„yфрЂkZ>YџбЋfŒшdŒ#hъa<:v|фtTE1 - c\џГяШuЛ{с‰DжыЅЁ@€ЦFёћ‹nђЙ;Šmsє(O>y~hш_с\Yи*Ззѓo˜Лє#Ешр$|­т+etЪhK]tЛ†ŽœœзZQŸД…]Х-G№дфКуGрбLfQ]M @ @S^oўPˆЅr]žzJюлїcxbђ]ЁЌ“qkјіСM7нSГCэj71М2)†о(Ље[БŽ}Сз;ЃvF3Юь$eм’‡}ВNЈC(D(DG€mS_OSSТXежŽ#]ыD>™™x˜<ЭqИї^Яђхї?ёФъ‘‘ЏOв+”/ киЧУ‡Ж6mњ`ѕT"Ў і1ОZОН№ьр ћƒ‡ep”єіXh c1џiX•чОУ‘ќЕ3†h”ў~:;9}šГgщщ!УуСу)eаавТЊUMЗ uMf6ЉL&hsп:МНс=яЋоЗјЉ]™08—wwwF/kуz|“OSbѓ‹дЖчЙѕ№єЄъ^[Ыœ9ДЕ1w.>_qq”ж<ѓŒyѕеЧрJВ•C€›јЮС­›n­кš 1Sg1ƒ*Д+ИчФШ)“Д6у2Y”№Юbћ!,+ЯнзСžЩ>A>­­,ZD[ŽSDфК?O?НKыoAЌи›NкЌтсCkЗUНWh‘4њ‰ЖЏебШ‰—†wЧTl|Ÿhv&hPЛ2?ћІœsЩЎЫЙsœ;GUээ,[FmmfvИz5uu{lV,і*ъІ“ѓ Т|їѕwЗЌИЃњ§qК_KadPŸ|с@шRzBcЯdpRПвsnЇeS>Юрo@•ў!ннœ8Саuuј|љ]Bc#‹5?ОZЪН-ќ^“ ЩхЛкчЗо[ЛC-FЇqт™ЗмŽ'ћжуіŽs­5Ш`њG3WŒњ|uы‚Џ—X§М0†ў~Nbd„І&'ЕЕ,Zдpђф)wО№YЊ>ЭУ‡ц\_§@нNАЦЂ­Є‘GТЧ1јkW‰ЬЬІ6іt%RZђY*ЏЪSW!з0Й 0†О>ЮœЁЂ‚њњ 3KЉљšЎОКіјёUJН n!х—*РпŸЌйўpн§~Ы?nVYЫ}ЁзwїcђФ9™{C2csн—Rg@3у)xЎ”ъ ЅИpЁ!цЬI,8gK55Ьžнpђф c^*d˜VвО u:wwп]sg•Uщjс*!ДZКJь мz mЅ8Ёc‰єПёˆhьC mсдрoЬ_“ЃЅTПdМљ&Я>K0ˆЙR[лЗЗУч _QŠ+†љт™-Uя™эЙЪеТеBhсjщjq:rvo№Рx~гˆN•dД7шДC žІќ!АПшъO§§<џ<ЁP‚k)3kАl7мАvц-АHъ$џ|tiЭт•ўЎBKЁ…kЄа"Њb{‚„&ўDf3є†I’} ЇŠЋ~Y04ФЫ/‹!Ў›Ем|3ГgпyFђE №•S mў­UЗ-ьkс*сjёVДsD†ѓ3›УьЄžя-Рўь/уЌpqИr…уЧ3є€дC­йВХђx> Е9Š*F€лКэлzЖWoБ-FyЃр\фќ8fг ЮDГcВtŽxЦЉШ_Ÿ—‹Ј{йqњ4С`Ў 55мxc|*G9 аьђзЇWWЌšх4Ї˜ўИ’1ыŽѕЄ§l­;Э› чАќљЋєBЁuŸ (ХodѕЩоА|9MMauЖr рЫЇЕЋќ+нГ#”tЕp•{%жы*‘ХЧN }Ђ7žш“-_žњaoСlM .\ Ю)Х7Ы6ыS˜ящЕЖѕо\ЕNiх*7iv†H‰юXoAЬf$MГ”LnќDQt•Rвй™йЄІцfцЬi…[2R€~Э_ž]т[мh„I№њ“#€>w Ÿщ/F6гŸL2п0ђgEѓ5шъЪгтiљrрp&–PРlшўVНВb…а"ЙSSiпЏЉДZ‰сќГ›й†Фg)TЮјFСЯKЄЌМ‡щыЃЁ!Яti @CУьСС5А;­„|щXQБТ1ЖŸmжJъб§šZ)­†eP)](ГЉJЄвЮtsNf‚ “cЎ|шюІКлFЉq‹iЫ™ 08xkёќб…ъZџBя|WKЅуГќZiЅДR:Б“gРЮвЦгЯо9&žЪUЋŸLŽГВb` БД™КЖœš‹бв‚mЏд:Љ—чє.ї\\ц_ЂДЕјR(O‰`TЩ eІ2#ћiБ4гŸt‘сЌЕ2№x™Ш+”ЂЏ/W<OЖMCƒkв.ЯйюыЊЊ№Яі\х*‘XeŒw‚xѓO˜##cЖЕЦlf'ѕЬp?ЦdžzN—Пr``€ККЌ yииHџ*јeъЕйЈTьИДа{ݘЕбrд ыЄˆ)з•В fГ™Œо;&6LE}†Š§АмќM##D"ує3 P] ,+5ЪЮ.Р{{=ufЖЇE(Ї>БPыИqotGŠ1§ЙЄд3Ё+№ƒ)!q’JФB@ђАЂЫj0Іњ’fріЫ-ž­вn<ьIщ :‘W*,#cЬNрЗж6­•r^ЅnєъzЏn№jŸ…cсБPЁ,!‰J;(ьСЈнqњ"N_ищ {”ЖюЄyТž”чˆПžїvC0˜ˆ…rЧЃ^ЏхКs `–ЫŠсYЮ|7ћыTШh­•вQщІВ?ПBmnvзмыыХuѕВЩЏ ˜дO‡\ 9]ЮбЎшц71o`Ÿжœtшілќg‰M5„ГB9РugЅ^˜E€}>лW_(™Д6jtќ5кќЕдR(‰Ж–зШћ[#;чEзHЛЪЧУыa~ƒZРa+eшЈ5}ѕСŸк‡с€7f~2bFFАЌ<и6iГгYX=XoзЩѕуy'ЅЄV1щЎ­џА<ИuVlђМЇСp$ЕHлІљ;іVЩжбOa?М/У^ШЗNbБФ~ьXрMН*“Жск`•ет*‘віGйW:ю“=ЈКЎїЁ…CeЇ~Ч@ЭŸ `Ця‚n€mА €ьƒри3Cы4Zтѕf югI€:IРѕПЋ’@)mт­>ЎD“W|џн}k‹лV$Bp&ЙiУќ[Ў=g~ися ž…Їс—s<]~И.9Š+Ёiл3 0'jл\-ДжJkЉЕRcцшкšиу7ѕЖUКЅmG-†WЌИC˜ozU<@žС3žКZІ ўi“ЉyЅHk™І"Њ”Ч8B ЁЄЋЄЋ„nb*BЩѕ #ЯnшnЋŒ1ЏбюP˜?Kм E%м Aќ;Ќ.d—ШЄЁдИˆд5Kз а›z~&,а–PR()”pЅpU| Hов4ђПыЎ4xХTЗ§8 ϲטЛг­Бh€‡`/ь!пbлda JХg‡ŒJWˆ˜Q!\ЅTкvтL;у*”u[ЯђJЅЄ’R+ЉЅTjsSј'k{+щ >ўт‡Cс{Vљі—ч цТј(xсp{K†(Œдzи˜a­ЕPЊWЉ3№›дS3ѕ€K:f\)у6G()Є\Q}lM_…=- _уў ЙпІђт'b,oљ­№U8_€Ъђ …A†ˆ@TыЈR)#RFрXšёШ$@Ф1ъ]щJ%]%…”њяњзDЃ‰ IJ%о=//tї{ЈёнŽw7€CП‡Э#Ў/•ТбŸ{уИXФЭNdJуѓx‚iWц|Gь—y ѓЩыЛчFEnв“љoЕ%ѕа }ычшЇ№Р{ VŒ­Ÿёr‡=~X?y| ўЊˆ)&‘Q[?‘єдO\јtL,"ЯKz  <њХпЪeи6vvоѓf,yЯnьБƒЇ{в–W2Gq?|иЧЛЌђ™ёŸТ‡2мыЈ F K, яi‡1и•mAЖpљsжn{1жœ58­иlЧЮ,٘6.tbХs чжaМƒ8`ƒMzЦbRzк5wС]^nДЫёъљГpзXчНЂ3С+9†‘yиFзGй7ЦT=іœЙиMX xќи6Ц с `uуЙ„ЇGdр:ЃiпкЅъ!ИJГнтV‹­^ц_РОŸС€UяqГsŽчžЬ#Р5ПФ ‰Kц3вšуќ3iyk4 +ЦR‹ЭА жyИЦ.RP;q‚›ш‰n6™3pЖз%ѓПЈ§y^^HOQ<цІ„>‘&v‘zX’&ЭxЌ‚•‹œМїдЕ DrЕїДЏFр-ш€Ы…‡љh$ќq^ )§Іdі3КЂњ‡ЂJqa™Х‹…††Г-jœё#г‡>Bo;уBz zс чйgUš@‘;йЗ€~Ї`RŠ:­4{•ЃД"э€СVдIš=Эе6UЯ2ыƒ\EТ)ˆqG rєnЅЃапŠА0KИpgЎ"T,AХ6іміЊ„вJа#Ž|sИmJчПŠ§Бs=Kш\Hw#БВјиЉАWЙ3…ыa š;cХ–ТQlдluгвMЫKш‚ГщkfИ™ЁfB5H/І,ЭПIЪ"y2eгУ`щ)^Х)yиb‡Ј?K§йФЁіЋ"RKЄ–H%юh>TЎ[RЋ)фZKvŒѕfњ}#bвX?Кx+М–4О–Н`Ќњ@јўm\>ц€йў_›9йямУ–D—и•оМ…5­3FQoў{КŠи‚[ : 5Цz чПЃ^а 1ьк™уŸo?П%‹`Ќѕtзё0дЭ0TFƒЦ:М–иlіуŸТјиšВ)†ЁLRЭYЗŒ‘До уZЈ2ŒZ(:О–4BŸУ*Р0…ŽЋЩGеaЌуaЈЛahяЋ>< ѓБ^M ь-ъЫ?Я0оуTŸЉ4л„ 0ЊЇK‡U‚Ё|І_єёв*ь„‘ВЕ+џžc ы„aУУшч‹ЊЎќЛŽŽO€бutЖ+Œ УЦх1…ты& †b †b ы0xћN^C`ќK†& L˜0 0a`Т0Р„a€ У“О0мŠ‹ЪЌwPА”щВm%ŸiYL=^ fo™Wg6љХђ–vЉŠЯLT]L]U}цuŒдs FуWKRЦ" љ$™3Ѓ ЛС',JвАtы“”,ѓън€ —ЉŒ`щ?,k0Рв­SВЬъ6­6уnЫ%i3Fг`DKqЉ7™FЄ8шT0АћнŸ—-нЪIEЫЌ$&2F5уСRжуŒ`).С0fСЈЗќ ’eГЛЮЫУh›–<ФC60Р2iХ‹–jт,эc5ЫœR~qdЅлф§ТвЉ‡RЦщ0ъсxЃо›xЉс)ІЕЏ^Z(\ш.ѕАЫЮтЪж„с,Б*њlТА fЦУ6 Ъз6зСjа%gЛя§’™Mо2=шŠ>[0\жЏТАѕa{YœуhХЮ’‡RЦЉ02qпUУCq†[ˆ1r|†_.Й УYfZЃМЅЬXSoУА иСЯ"ьJŽі{+yж.G]…‘;!([6z“n0єЈ5C–лЯтян{PЁˆiь[БlБ хaрSdшjsк'b=`HH5aјh[0”чђYЋƒсA(йЄ[вaьIп’Й–†‹~LзК‡‘bК';s-%4JИ•ЄMЛ НЩђЊjтC6ЧБkЅ7 —В3з2мБџ˜оcС6у@зz);s-љŠš0 0ЙуЪЄГ‘у‰a€ˆa€ˆa€ˆaРщ8У€9> ЎfП(ЏЉŒŸWxd.У€1w†С (ŠЛжЌˆa€КРЈLr:lхŒЉІщРВeЫg!lЉІ$а ZжцЄ– Ї=`l>к™ЯMGЌ-З+]D—KГА]`d&fЌЖjjфcˆž}бЖУчˆт1Й' ’4Qƒ`џB3m+Н' hHsЈ~FzOР5кty bj™{ŠI“[й&<БˆtЄ^нл6,ЦТ §Š:ск,šФы8ƒ ƒ˜Xюž€JвTЏmЫЁ0ˆПЁ.с”V„Ѕ‘0ЈiEу’}’VбФХЂЭ@фЈђ—a#аCIh@ЦЁлD 4SЪ‰cЯZјЄі—єfyЬYыё ђбA=щ ]ƒт кж=0шсј єЯˆa€ˆa€ˆa€ž#tœч–:9ЄРЈхВ7 Їsa4O:1іz ЊСЫ'Х00…GУˆЫ{VЇТ0gnТ]ўАГ рДO.јХ[`lВчиИŠKX@›пŸTan1vє/…˜э‹Н„{ЃёJљeЅ№BA|@М†Фцaј n{д‚мЉчСР‹&Ўw1† 4^cйoзџ.]зР \ЛЎЧСАэlїў:Œ}laƒ.ПЎœ›G@ПІzEsaHn`HМOJї’p\e`р hПў™1О;7іЋщMуM1 а›Ц@›zгшx[oЛnђ1 У1 У1 У1 У1 У1 У1 У1 У1 У1 У1 У Ц"…Пь-j<њ\шМџrщ%I7ЅЌ ЃЯЌ™1soЎщ УM•)Џ8(ДЄnУ€ЕвF УЮ"вŸТњглПzщ,щfџуvхО’ісПпв<Л2<8xqж‚pЃўh%0мЃJa§iCgg›сŠцЛЃ~јЏ~ёпИ›I„{№–žПGXТaДlКIј™‡ТіИжФівн,фž=чž“І=†9‹жЃїb›k№№IсзуНЋ SяР№гё–tћm ЗШ=Тžc&3“ UBРleœИžƒлEА‚#РГѓті|* ‚2 WmнфTW@X& ЖaЃ„!Fš”Њ‰UНšь+УPПУмкс'ДCGЈЪе$й^ъZПО~Љk•pж]Ъ‡ *…БлAРX|P'‚сS{$ Œ30їЁЉ;7Qсfˆнv Ч•ƒaJ‚Ч(Wъ0”;IHNдo“ТРэћЕаN˜иVњW‰'jъ‰0XN 4ћС_ГЫ‰ У1 У1 У1 У1 У1 У1 У1 У1 У1 У9џД>s33[4k“в?Џa@зf'F=нf зё0дРш’-’КѓяCM€Бо У”zћ ‹Е~ж-Љеr­%;О–НюŒэ}#bЪЕ~tZ+МЖr6ВCcеТїoуђ1ЬіџZtДvЮEНљяЛV]bWzѓ>Rrж+c­7УаUФќлb†14l[;ѓпW“ŒF3†КЦ?п~~KСXыщЎУk‰Эf?ўIœQ†бЂ1Цz7Œ­):Б†2=JIуkIЃЗ?ЌЦ7ДPeЕPtC a W“jУш—1šњђOaш­њ№0ЬЧz5Q`TЯ+Я0оуT—Гй@NZЛђ/СP>г/:бж/ПN)ЛF­УkIЃоUзс 0#-tu…1a<Й|}B|ЉФ0@ Ф0@ Ф0@зaЬО}‡Ќ!0ўŽ%У@†& L˜0 0a`Т0РЄ/ŒА4IцЎџ‚ЅL/+љLCЇbъnq‚Мe^aрТ,uов, Gђ™ $‹Љ'Ё› #ѕ\‚бјЦ’”БC> Fцd Ую@№ Ks4,н*%ЫМz7 ТeЊ#ZїЌ #ЖЌСKXР1k™еm0ZmЦн0–7Р ZŠkНIкІг'jvПћŸфВЅ_=Ћd™•w.2=I]`T3,e=Ю–т \xы˜zРЈЗќ ’eГЛЮKFйЙC…l4`€eвp-еФYъхв.Рh›–nСp–™ ˜З”ыbъаРXвWP‚A0r1pйВб›t‚aCPd0*4JПwcьA…"Іс^ХВQФ^0єЈ5CVЎЮэБ 0Є Єš0ЌЯ昘Ґ\>Qѓ0ь2Ї~qЯ Чlв-ѓ0ќУ)Ѕ@уёEЄ[вaьЛ[В3звСpЁ щZї02уmїdgЎЅ„FТ?Ћc1є&щHь=й™k`ижТqьZпе€њтКЕлŒ]ыЅьЬЕфЫ‹hТ0Рф:Œ+“ЮFjŒ?$†b †b †b0дХ0Tдd0ЩчEhM…kО/дFCџУ0`|‚ap‰Лжœˆa€ш>•™O‡­œ1е4"IмэЬ^љPІžМ8@ƒjY›4PпяЬ^DЧэЬч&lVŒ‰–лх/ЂЯ$7ЗHfІbfЌЖjШЧай2M†ЁEЬBzзD%щSК †№/4гЖвЛ&І4‡щŽП#НkтšПT€AЬBцЎ‰bвgяy bщ0HНz.'ѓaа~ХpmjM3[D†AЬAюЎ‰JвЇЪ5ё7д%<а€ў$ jьШmЯЄOчхАЈ9"G•П ƒJџ@њ“0Ењ"аSQшЮZј$Т %}97GDЯ gœњs?.шЂaнуqсј/Ša€ˆa€ˆa€ž#є‘чzЫCzŒZ {r:FѓќУЌWР œО@УР #.џэY УœЄ wЅУN$€3<ЙрoБЩ.сЋИ„ХДљнљy@5fђЁАЗуUГн-ыr{ЃёJљ5Ж№š@|@М†Фцaј n{д‚мЉчСРы#Ўw1† 4^cйoзџдV№шІ!п УЖАнsјы0іБ… КќКr‹‚(ьG вŸ›PѓнKТq•“§bpЦјюм<`иЏІ7g4Х0@omъMЃуmНэКЩsФ0@ Ф0@ Ф0@ Ф0@ Ф0@ Ф0@ Ф0@ Ф0@ Ф0@ Ф0@ єTї_1Ъ%*Ђ‹›$еэ“йh•RЩЪ\зњв!]~СдПt‡Ž8Љ#ŒжЄŠS0К\/фl{ZиrЌЖTa$IжЖWfїНщ А’8U†цЉŒхy0Ž6UфU‘к0ќœ њОƒ`;+ФЖЇBзщЬѓZ щЌЊВог<’ЮL€З“oH dI х'Ј„ттэіЩ7oD{˜B !ЭуCIT)gУо–nлSЁŸ‹$Фўy­КЩUю;зњ уa8ЧюбŸсїБ0аПлі„ЭЭЂ=єѓfѕ‹Т’”rfPуЦ4Є:ƒ‹˜ижœрLэУn ­o€ЁIљвшwчXФ-Е{&Yф?кн.С”оh J7"Ф{H“=˜&g,фL ПРЖfіGУ9мrcћ?ЊЦтЬ|’Kl0,G№эЎ?,й ќw™н§а…КZЃs]Ш™єЧЕ€щ}Bж“Щэ> №[j0DъБЦ“чЃн Щgчб Еw"†§‘Ѕ9ѓе`HW/•ТIлTТm!СXі0pї0”Э”Э„0dhu†В †мУˆvw|іsыw0`{†БЁСР-BХ‰Rsџ—a(ьZ0Ж68†ЛO‡jЃhN г2Sa,{А{дŒ”a,ЛЭХjЂ.Уˆ%в)СPt2CMƒaЮJDј ЃтдtnbІM`ШrзЊLэKІтнeш(Ѓ bИіIзjѓ[щZЅ›ЬЛ D›ЊШ]Ѕ A—А; сŽ5{œЛ, f>@ 0EM†№IAKŸТлwAР066шЪчL П:дюн@Лƒ‡уК;О9ѓСД{їŒG‡­iЮП§Вއэеvс8$ђ[Ъ™мб^сЄЬзWсЯ„тњkВ` р]иьš~s:фvмУР5ѕЬ>KЁ=ЏпˆА?Q ѕOˆR>gpЎЕљ юљдqз90–ЖЭ§‰g]ѕвŒ#уЉЕdJ5љ,†b †b †b †b †b †b †b †b †r0ўi}цffЖh0жwPђ0ЊVmџМ†q[Cš<і‚БއЁ~F—l‘дџ†)ѕ?“віqн’ZM!зZВ`Ќ7Уая“ЦњбХ[сЕЄёЕ$РшхАcеТїoуђ1ЬіџкЬйШ~ч6Ж$КФЎєц-|Ќiэœ1ŠzѓпУаUФќлbаaЈ 0жЛ`8џѕ‚NˆaзЮќџ|ћљ-Yc­ЇЛއЁn†ЁЪ04жсЕФfГџЦЧж”M1 ez”jЮКeŒЄѕfпаB•aдBбёЕЄњV†)t\M>ЊcCн C{_ѕс`˜ѕjвh`oQ_ўщx†ё7 њLЅй&L€Q=]:Ќ хC0§Ђ—Va'Œ”­]љї]' >F?_Tuхпut|ŒЎЃГ]aL6.)œ_71 У1 У]‡qріЉ>IЩ^і№#–g œ1 pЦ0РУg œ1 pЦ0РУg}aрњ‰ч“E >qеКУ>)Щі…aяљї+e”-OјДKkœєIIі6Љчы0в~Fцъ2 ыњœOJВPГЫвF№щ?œёIIі.§кŒ0вЦ‰ш!њє7`ˆLSMѓ j7иQяф[`˜lЦˆоФpx>Œ!qЦљvt— tƒ>“іўf~‰тmы’Y]Кž{aŒ ЧБSбЋ) П:ГPИм\ъ!ўhWT]a8ŸWЂZJВ"}ЗkйЙе™нB‡%Л~ёЬ~0ТтzЩсy [Ж—Хe!Y4чaїёF™ёž8У-‡eс ПhqGЮgІнКУ.ћ „qб2П№ЅrGЇQЁ1Fюдс.њд€Q{LщWLлмы0в(љ>ЪУРg'ШаеR2юV”э Cк&Ѓ+ŒLВYбЛЅ.ўpv~l ДЃДŠч„сbгЕюa“ йљю&шr+LћоdyU5ё3? ЧЎ•о€VвšjIq†ƒ;іг{,иfшZ+iMЕЄ8у+jрŒa€Гы0n˜ŒіГмўˆa€ˆa€ˆa€ `*†шйmыq0|Ž(бп|‚!ќ ЭД­јлUCšCѕУ0Dч#M›.ƒALЭ]ђІ$Mn]d›№`Ф"вazuoлА ƒі+ш„kГhЏCт 2 bbтXяDѕкЖ ƒјъh@iEXк ƒšKvJ:L`Ќк „AŽ*1=”дє'aК№@J3Ѕм‘8іЌѕ€OjIo–ЧœЕЯ д“zа5(Ю aнƒŽŠ@џŒˆa€ˆa€шщ0BЧynЉ“CzŒZŠїYоЂЙ0š'{НерРe“b˜ТЃaФхП=ЋSa˜37с.ийpк'ќт-06йsl\Х%Ќ ЭяЮЯЊ‰0З ;њ‚—BЬvЗЌЫэЦC`(х Т ёё>бRx УopлЃфN=^4qН‹љШ0T ёBЫ~Лў‡p шК~хzиu=†m'`Лч№зaьc tљuхм<њ5е+š Cњs“CBjО{I8Ў20pД_џЬп› ћеєІёŒІшMc MНitМ­З]7yŽˆa€фkфFЕвaIENDЎB`‚mricron-0.20120505.1~dfsg.1.orig/html/main.html0000664000175000017500000002373310600525504020433 0ustar michaelmichael MRIcron Introduction Page
MRIcron Introduction

Main Window

I have tried to make the MRIcron main window as useful but simple as possible. While the options may appear confusing at first, I hope over time the software feels intuitive. A sample window is shown below. You can get a similar view by launching the software, choosing File/OpenTemplates/ch2bet to load the background image (shown as a grayscale brain) and then choosing Overlay/Add and opening the image \Template\attention.

the controls on the tool bar offer quick access to the main tools for brain imaging. The X/Y/Z numbers set the slice to view (X refers to Left/Right, Y to anterior/posterior and Z to superior/inferior). Adjusting these values will change the sagittal, coronal and axial slice displayed. The next item is the zoom-factor. Here images are scaled 'to fit' - e.g. each view of the brain is strecthed to fill its panel optimally. Alternatively, you could choose x1 (100%), x2 (200%) or x3 (300%) zoom factors. The next series of buttons refer to the active layer (more on layers in the next section). In the example below, the currently active layer is image 'attention', and this image is being shown as a red gradient with a minimum value of 1.96 to 4. In this example, attention is a statistical Z-score map that has been placed on top of the background image of a brain. Statistical values less than 1.96 are not shown, with the darkest value set to 4.

main mricron view
This image shows a sample rendering. You can view a similar image by running the fmri.bat file that is included with MRIcron. 

Layers

When you use the File menu's Open command (Open, Open recent and Open Templates) you are selecting a background image. What makes MRIcron powerful is its ability to load multiple layers of images. To add additional images on top of your background, simply choose 'Add' from the 'Overlay' menu. For example, launch MRIcron and choose 'File\Open templates\ch2bet', then choose 'Overlay/Add' and select the 'attention.nii.gz' image from the 'Example' folder that (typically, this folder is installed in C:\program files\mricron\examples). Now you should see a brain activation statistical map on top of the background anatomical image. Note that overlay images are scaled to map on top of the background image. You can adjust the appearance of each layer by using the layer panel:

overlay panel

Note that you can click on the leftmost button in the overlay panel to select between the open layers - for example the image above shows settings for the 'Background' image, as well as the overlay image named 'saccades'. Note that the image intensity range for the background is from 45 to 120, using a grayscale color scheme. This means that values of 45 or lower will appear as complete black, and 120 and above will be white, with intermediate intensities appearing as a corresponding gray value. There is also an icon with a color scale and the number zero: this allows you to have the color range set from zero, even if your threshold is greater than zero: for example our statistical map 'saccades' is set to show values from 2.3 to 6: values less than 2.3 will not be shown. However, since the 'color range from zero' button is depressed, a T-score of 2.3 will appear as a dark red (as 2.3 is part way between 0 and 6) instead of a black (if the color range was from 2.3 to 6).

MRIcron allows you to choose different color schemes for each layer. In the example above, the Background image is shown using the 'grayscale' black-and-white colorscheme, while the saccade overlay uses the Red color scheme. You can increase or decrease the colorschemes available by adding or removing files from the 'LUT' folder (this 'look up table' folder is located in the same path as MRIcron). This folder typically contains several *.lut files, with each file storing a different color scheme. For example, the blackbdy.lut' file describes a color scheme that goes from black to orange to yellow and finally white. MRIcron's *.lut files are interchangeable with the *.lut files used by ImageJ, XMedCon, MRIcro. You can copy *.lut files from these programs to MRIcron's LUT folder. Furthermore, you can create your own *.LUT files using ImageJ's LUT panel plugin, ImageJ's LUT Editor or my own LUTmaker.

Note that the 'Overlay' menu also allows you to modify how layers appear. For example, on image 'A' below, I have selected Overlay/TransparencyOnBackground/0%[Opaque], while for image B, I have set the transparency to 50%. Also note that you can load multiple overlays simultaneously. For example, images C and D below show the 'attention'  and  'saccades' files both overlayed on top of ch2bet - with attention shown in green and the saccades shown as red. For image C, I have set the Overlay/TransparencyOnOtherOverlays/50%, while for Figure D this has been set to 'Additive' (so regions with both red and green appear yellow).

Transparency

Render Window

From MRIcron's main window you can select Window/Render to view a volume rendering of your data. You can change the vieiwing angle of the image by adjusting the Aizmuth and Elevation values. The Background menu allows you to adjust therendering of the background image, while the background menu allows you to determine how overlays will appear. Of critical importance, the Overlay/SearchDepth will adjust whether the rendering shows superficial overlays (e.g. a settings of 4 will only look within the first 4 voxels of the background image [e.g. within the first 4mm if your background image hasa 1mm resoultion), while a setting of 'infinite' will show an overlay regardless of its depth. Also criticial is the Background/BehindOverlay menu item - if checked, the software will only start looking for overlays that exist behind the surface of the background. On the other hand, if this value, overlays will not be constrained by the background image (e.g. you will be able to view an overlay that is closer than the background). You can save your preferred settings by selecting File/SaveSettings. This information will be saved in the 'render' folder, and you will be able to select them by choosing File/OpenSettings.


example fmri
This image shows a sample rendering. You can view this image by running the fmri.bat file that is included with MRIcron. 

Multislice Window

From MRIcron's main window you can select Window/Multislice to see the multislice window. You will then be shown a series of slices of the currently open volumes. Within the Multislice form you can use the View meanu to adjust settings - e.g. to select whether you want to see sagittal, coronal or axial images, and to choose the desired slices and overlap between neighboring slices. You can also choose File/SaveSettings to save your favorite views (previous sets will be listed under File/OpenSettings).

This image shows a sample multslice image. You can view this image by running the fmri.bat file that is included with MRIcron. After MRIcron loads, choose Window/Multislice. Note you can adjust the amount of overlap between slices, as well as slice orientation. Forthermore, you can choose which slices to display.
multislice

logo

 

mricron-0.20120505.1~dfsg.1.orig/html/install.html0000664000175000017500000003361210613651164021160 0ustar michaelmichael MRIcron Installation Page
MRIcron Installation

Introduction

MRIcron can run on Windows, Macintosh OSX and Linux computers. Because Macintosh and Linux builds require a beta-release compiler, installation on these operating systems may be somewhat tricky. This software is covered under a variation of the BSD license. In theory, this software should work well on any of these platforms with recent hardware. However, currently Windows offers the optimal platform for four reasons:
  • Graphics are more fluid in the Windows version: uses direct Windows API routines.
  • Rendering is faster with the Windows version if you are using a multi-CPU system: Windows version multi-threads rendering, so rendering is twice as fast on a dual-core system.
  • Windows version recognizes tablets, making it easier to draw volumes of interest (as it can detect stylus pressure, and can detect whether you are using the stylus tip or eraser).
  • Windows version is the most popular, so it has received the most testing from users.
Hopefully, MRIcron should offer reasonable performance on any modern machine. There are a few ways to increase the performance of MRIcron, though these techniques necessarily reduce the quality of the images.
  • In the main MRIcron window, make sure that the option '2D smooth all' in the 'View' menu is unchecked. This displays images with the rapid nearest-neighbor interpolation instead of the much slower bilinear interpolation.
  • In the rendering window, make sure that the option 'Precise interpolation' in the 'View' menu is unchecked. This generates 3D renderings using nearest-neighbor interpolation instead of the slower trilinear interpolation. Renderings are typically three times faster.
  • In the rendering window, you may want to turn off the 'Smooth background' option in the 'View' menu. This displays the raw rendering, instead of applying a 2D blur to the image. Note that this change has much less influence on rendering times than the 'precise interpolation' option (as the precise interpolation is done in all 3 dimensions, while the smooth is only computed in 2 dimensions).
License
Chris Rorden's MRIcron, copyright 2007, all rights reserved.

Redistribution and use in binary forms, with or without modification, are permitted provided inclusion of the copyright notice, this list of conditions and the following disclaimer is provided with the distribution. Neither the name of the copyright owner nor the name of this project (MRIcron) may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Windows

  1. Download the installer.
  2. Unzip and run the installer (double click on the .zip file and run the program InstallMR.exe).
  3. By default, the installer places the programs in C:\program files\mricron, simply double click on mricron.exe to run the software.
  4. You may also double-click on the .bat files, which load example images, for example 'examplefmri.bat' shows two statistical maps on top of a high resolution anatomical scan.
  5. Note: The file dcm2nii.exe is compressed using UPX, which can lead some virus software to generate false alarms (AntiVir PE Premium). This software is generated on a computer that always has the latest update's for Trend Micro's OfficeScan virus detection software.

Linux x86 32bit If anyone finds an easier way to distribute this software for Linux, please contact me. I am still finding it tricky to develop a universal protocol for dealing with the dependencies of different distributions.
 NoteThe Linux-native version of MRIcron was created using a beta release compiler. In many cases the best solution is to run the Windows-native version of MRIcron using Wine or a virtualized Windows environment (e.g. VMware player, QEMU or Xen).

  1. Download the software.
  2. Unzip the software (for modern Linux systems, right click on the file mricronlx.zip and choose to 'extract here').
  3. Open a terminal window.
  4. Change to the folder where you installed mricron, e.g. cd ~/mricron
  5. Launch mricron by typing ./mricron (note you must be in the same folder as the mricron executable.
  6. You can also run the example .bat files, for example ./xfmri.bat shows two statistical maps on top of a high resolution anatomical scan.
    1. In case you receive error messages, check if all the dependencies of the program are installed. In particular, you need
      1. GTK 1.2 (this is called GTK+ by some distributions, and gtk by others)
      2. libgdk_lixbuf2.0
    2. You can see a complete list of .so files needed by the software using the command:
        ldd ./mricron
    3. In case you cannot run the program and it displays a message saying it cannot find one of these libraries (you must run the program from the command line to see error messages), you need to download and install a package for the necessary library:
        • On RPM-based distributions you can find packages here: http://rpm.pbone.net/
        • On Debian-based distributions you can find packages here: http://www.debian.org/distrib/packages

Macintosh PowerPC
 NoteThe Macintosh:PPC -native version of MRIcron was created using a beta release compiler. In many cases the best solution is to run the Windows-native version of MRIcron using VirtualPC.

  1. Download the software.
  2. Unzip the software (double click on the .zip file - a new folder called mricron will be created).
  3. You will need to install X11. 
    1. Check to see if X11 is in the applications\utilities folder.
    2. If X11 is not installed:
      1. OSX 10.4 user can install X11 by using the DVD installer disk
      2. Alternatively, download and run the X11 installer distributed by Apple.
  4. Download and install the correct version of fink for your version of OS X and let it download and install the additional 29 GTK and related packages needed. Here's the required command for my software (all on one line): 
    • sudo fink install gdk-pixbuf gtk+ gtk+-data gtk+-shlibs gtk-doc-1.2-13 gtkglarea gtk-engines
  5. Launch X11 (double click on the X11 icon in the applications\utilitiesfolder). 
  6. Launch an X11 terminal  (from the keyboard, type Apple-N). From the terminal you can do the following
    1. Change to the folder where you installed mricron, e.g. cd ~/Documents/mricron
    2. Launch mricron by typing ./mricron (note you must be in the same folder as the mricron executable.
    3. You can also run the example .bat files, for example ./xfmri.bat shows two statistical maps on top of a high resolution anatomical scan.

Macintosh Intel
 NoteThe Macintosh:Intel -native version of MRIcron was created using a beta release compiler. In many cases the best solution is to run the Windows-native version of MRIcron using VMware Fusion or Parallels Desktop for Mac. .

  1. Download the software.
  2. Unzip the software (double click on the .zip file - a new folder called mricron will be created).
  3. You will need to install X11. 
    1. Check to see if X11 is in the applications\utilities folder.
    2. If X11 is not installed:
      1. OSX 10.4 user can install X11 by using the DVD installer disk
      2. Alternatively, download and run the X11 installer distributed by Apple.
  4. Download and install the correct version of fink for your version of OS X and let it download and install the additional 29 GTK and related packages needed. Here's the required command for my software (all on one line): 
    • sudo fink install gdk-pixbuf gtk+ gtk+-data gtk+-shlibs gtk-doc-1.2-13 gtkglarea gtk-engines
  5. Launch X11 (double click on the X11 icon in the applications\utilitiesfolder). 
  6. Launch an X11 terminal  (from the keyboard, type Apple-N). From the terminal you can do the following
    1. Change to the folder where you installed mricron, e.g. cd ~/Documents/mricron
    2. Launch mricron by typing ./mricron (note you must be in the same folder as the mricron executable.
    3. You can also run the example .bat files, for example ./xfmri.bat shows two statistical maps on top of a high resolution anatomical scan.

Linux x86 64bit While the x86-32bit version may run, in theory it should be possible to create a 64-bit native version by recompiling the source code.
 NoteThe Linux-native version of MRIcron was created using a beta release compiler. In many cases the best solution is to run the Windows-native version of MRIcron using Wine or a virtualized Windows environment (e.g. VMware player, QEMU or Xen).

  1. Install the compiler. To compile this software, you will need a build of Lazarus created on or after May 1, 2006. This software requires some recent patches that are not available on the current stable release. To get the latest developmental snapshot of Lazarus, click here.
  2. Get the source code. The source code is available here. The source file includes sample images in the Templates and Example folders. To test this software, compile mricron.lpr. Next use the File/templates menu to open sample images. Alternatively, after compiling the software, you can click on the included .bat files to see sample renderings.
  3. Linux users:You need to have write access to the folder where you run MRIcron (it will want to create .ini files) I suggest placing this software in your home directory.
logo    Lazarus
mricron-0.20120505.1~dfsg.1.orig/html/index.html0000664000175000017500000000537610653661044020631 0ustar michaelmichael MRIcron Index Page
MRIcron Index
splash screen
logo
mricron-0.20120505.1~dfsg.1.orig/html/images/0000775000175000017500000000000011660470014020060 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/html/images/zhistogram.gif0000664000175000017500000001050010513204254022727 0ustar michaelmichaelGIF89ao№Гњš…ЊќRQRѓдпuчтіŽфVіїѕс§ RќНММ!љ,o№џ№ЩIЋН8ыЭЛџ`(ŽdižhЊ~ФУМp,ЯtmпxЎя|яџР pH,:E‹Бj:ŸаЈtJ­Z7JзuЫэzПр04Ы|ЮшДzЭnЛп№И|NЏляјМ~Яяћџmdk€ˆ‰Š‹ŒŽ‚K„‘–—˜™š›<žg “ZfjœЊЋЌ­ЎyeXŸJЁДЉЃƒІh ЏФХЦЧБJeЮЯЯ“ЖЕЙЛg‡ОПоk3i/hффс Ћ1nщЁ0схяючыmіуђтѕђќњџјЉЛе 4iѕ&8ЃАP.ReајЕ-и7pїкЙ‹ї†žІsџ9ђл(2$Шt'йЄ,ЉqуJ+E Hmжp:œ&ЁaУж(ёвVёЂ7•05škЗЮ>#™\к)КЊ#ч‘ДšNв­YЛ†Эњu&+e˜ѕЬ‰эС е Vђе n‚мŒbŒW•Fд–єR ючR*X5!ыэ‡R*сЧ‰ѓa 86ьSТ•Э~$Иж‚Юjhoъ„ћаaЉ3 ъЊnР@яQ­ˆ•6іg˜фвТ’o“mxђсЈЖkЫќ[lYтКkоњ‚к›lКFњŒ\SЋU?pѓжфяzуўЫr7rЌДMђ/ќpdБС‡П?|љцšЭЂƒfЈѓg\г А@џИ€Ўе'“nу™7Xy/Mж`Е•ѕ yфбGпwŽ'ž}œФbаhхчY[ ‘иаз`cˆ0ЦxQnЧнv™cВБGЃy™‰S#fН™Ѓa'EјЃSŒAbˆ)О5IA#~†KsА(TФЃ!gЁЗф—`2ЧYM<-SZ‹XnЉŽwaЖщf2 Ф)чœs~BчrN‰'žg^љцŸ€к„jшЁˆ&jшŠ*j€•*щЄ”jv]Ѕ˜fЊЉ*з‰сщЇ †*ъЈ"ьBъЉЈІЊъЊM˜ЪъЋАЦ*+ЊЎЮjы­ИцъD­КіъыЏР’VŠ$ІPlАШ&ЋlZByvџNЧv`PаBЗьЕиЫkgдŽ-Зпf+юИЋnk­BжRЧСБЯŠ.Й№Ц+†ЙгV;кЛMі‡nЕђіыЏЇєv ­“{/tјўЋ№Т­6л-C‡`№Оч2lёХ+ 1Пg0ёZc,ђШЅ: ёЦ=§ДСДюђЋ2Щ0Ч\ЅЩ2зl3ЈцоЌѓЮVфЬѓЯ@gLsаD]‚ЯF'­4H/эєвЛD)ѕдTWmѕеXg­ѕж\wэѕз`‡-іиd—НЂP ЁікlЗэілpЧ-їм2HYJкfч­їо|їэїп€Ў7v7C8нˆ'ЎјтŒ7юИx_‡їу”Wnљх˜g~CџфоtИц ‡.њшЄСyдŸ—ЎњъЌЗўјщhЇюњьДзn{Ап-ћэМїю{эЙžіяФo<шСїДћёЬ7я<мЩ{>ќг?Џvѕж§л§фDtŸ=ѕу_oКѕп/_ўњьЗxсЪ‹яўќєŸОќ<р_џцћŸџƒўНЛ_иПаmQŠ4 x@Ж5Pш#œфдWРч%№ЮР`ѕ2XAЬ Я! 7Тjpz&$! KШТКP„/АƒМaн€ИB,џzP‚љМ˜ƒ+"A‹[д _ч?ч}pŒdфу†HEкбŒkУЃёиИ7B.Ž8ру/(Ф5ВёˆdqH9.hT оЈˆ8=&ru‹lc# шAёбб•д$їZ—ЩKnВnЌС'IјHQъ@­„ŸєxJР’zи‹$+wЉЫИYвЗL\)YKNЮ‰"Lц.…щЪ2’ŒЈ f0л7MмШ–]\f(M9JEB3vв,&*glnБ—Оlf Ÿ)K1ўQœ „g<ЙљJvZ‘–ђЄр&йƒjЮm˜§ЬЇ>ЩЯќй3ŒэІ<§YО‚*Tu5h>:>‡жгџ›эLшE*P‹:Ѓї _GGJЯbђ›К чDIJЬ–ž4Ѓ*хшJKКN"4І№Єhіs•ШL›й˜&4Њy|дP[.Ь—^4фЭщU{вˆU3ЅEhWћyжЉtmфOKљд}ЕЏ1 ьZyзЊоtЎ'lЪСšд›3Е~ŸMч;{и_gЃЏыMЇљ?™>юˆ‡/жAџЕ6ЉЎvяэmЯy:ЙŽs*?=э цаЋ^vЈoАяdGњПљnѕm~]фУ•ѓи ?bГoя.?:єиžyП?Ооœ”ќры^yУ'>щŠ?}Ч9пѕ9–;цќ§д{jљЋ#žђь6уэюѕƒ•ВŸ;эM{еk~с;п}ъўyи{6јZЄћЖQџPЬЗОјW~ю™я{чG^ьЃЗ8іoYып~ќ,їrч{џvАќГwd.Ј]вSљzпМіёЯ~џ\К‚аwxђ—Fуe}цguB€ъw}џѕz@ї}‚16фe€ч7}Ц—| xeцG]ЈzuvfJW{ДД(rэїЁТ7€’Tеw((R*H~nчП€0}У7ƒXƒ'ЈuŒ”ƒљ'phz!X|#J(g‚М‡~їЗzHX…/з|‚?(€H€№%…Ы‡TЈ{иx>Ї…Lи…"Xrж=bИ}dhVx†SШ}-иƒёд„tј„к…Dx‡s8ˆ)h‡cиЗ…/1ј…B†X~єg„чs…шyнЇˆяЧˆ@(ƒ$ˆqe€“x…Јkšˆџˆ3ч}\Ш‰^Јn`X‚‘ИUoH‰ˆd‰eˆ‡<ЈŠ‹иOс'}8„ЁX}Ѓ˜w‹gˆrˆŠpі{Ш†Nш†Уx‰­(‹ЯШ€mЦzшx™И†Ќи†*7‹IИqЂ(ˆ„ˆƒЦШЎїwФИŠМ(ЎјˆАŒЁ8зHŽІH‹‡ŽыЇŽRзˆэј‰‡w'hH>ЖH‡Y˜Є8d|(~н(yhо˜ŽYVуИvјHЫИЭи4x‘љ8‘хИ‚МІ† љ>Ьи‡Юи‘)Œт˜€{8’:ˆ‰yЈ‹›ИŽќhrЏŠ-/щzvƒi’y“ћи‰Žш§FH)‰?K]%џ”,Ж„'9IЉ’ Œйљ” ”іИs9(y• Й; ‰}uф’‡“ •a`c9V‰“MЉ“юШ“іЦ•)тXŠ“&•щ4—Љ)y–П‰ЅЦ—––dЙupy’SI˜‡˜‘v٘Ѕ——џИh˜yy~Y™є˜qљo”yŒ–y”™:‰љŽ[ šљ3YŒК&˜›WšцИ‹ЈЩhщœщšJ‰…Бi†Г9š.F”!i”rw—5їšIЧ”Љ ŽŸišЁщ]ƒш–ЧIq.ˆœ2ЇœEЗ“3‡Н‰~ЗЙt`)™ƒiœi˜fщ‹о™LрɘΠ…Сy‹ц™E‰Œџџwx™КЙšiŸ­)žЬy‰Рy Б‡Ÿз‰5yŠЇ™œЉщ‡ш4DфЗ–>й–шщGДЙzЖI’ѕДюY њњ‘фщЁ(њЁ КžC‰љљ лЁ+vъуœѓљ‡Иц˜…“У‰žЕЉždY—ЙЙ‘ЛIqК—7š–: š<*š>ЪЁ@J—8:rмYx"z^YЂNy[K*MJzQКЃB ЁџљžjtЄaїœщІЄ' ›ыtž/š†.К ьщŸD  пYЁUzvгиЅхz+њ˜щYЇ,ZІ1zІWZЃсimњЇoŠ Я7Ј9™cЪЄˆZp}Ъmz Ÿ|ЪІВуІ‚NrjџЇ-к кˆЇXYЄ4ЊІиЊу)Y€šЂЮTЊ,jЉ†ЄSšmьˆ—ПЩJЎЪ@АZ 3*‡ЄJЉ;ŠЋЈZ•ЛŠ›Њšh ЌŸšЄ:Њ€ ІФ™eZŸкЉЉ2š•цЌчD­ВЉ:Љ=:ЇЇš‹zЇCКЊšІгJ ПZЌхyЌщjЊЪЪЎЉњЎˆ­#Š…Z*хj­гйcŽ Ї§lѕW‰‡ЂПАЦ7А]ЩЅцjŸ‚šЏЗZЈrЖЇ6щƒэ„‹ЅEБ}YАcˆЏNЊЎИкБžњБ0ъ­Š:ВŒ*Ÿу}еšВзŠАеГ>Ї2љГB‹]9ДFл?wДJ[AIЛДNKџ?MћДR \ж8ЕV ЕU{ЕZKЕE+I”T@хDPADPY+taЫДзG„ЄЖe‹iM„ДйфEPDFQxФ \ёZ?dЌVVЧЗ…–ЗXфВеЖЩЖ‚лA„‹\]kNh­Š ИгFз#Й Йˆ ^WxЖѕš]‰Л?‹лP†ыЕ{KЗŸ Е–лЗЏE•p‹ЙЈ{VлЌ­KŸ ЛAЛІi‹ИœЙk+ЗЃЛ•ЙЋЛЁ_Н;ИПЛЕШы=Ч›МЬ@ЫлМаK;o$8д[Нж{Ни›Нк›5_ŠАл‹5От;Оф[ОцЋ({’ОъЛОьлОxв+і–jіНWsОі{Пј›эП„тОќлПўЛ'№ћiђ{Zєk5њ{РœРћћП мРьР…жН­ІB,5 |С\ОМС<'\iг[СS“С$\Т‡вС(ьР\’!,ТQbТ0LТ)<УўЛТЏ&С~KС. 1мУ LУ@мО6Ќ„ь];ќТ>œФљФLœОCœ…-|ФR<ХT\ХV|ЖuНZЌК$ЛХ^ьМБћХbЬFa<Цfќ•VtХjМЦlмЦй›_gЧЗгNn\Чv|Чx6ђ4|мЧMгЧ€Ь3YаФ„\Ш†|ШˆœШŠМШŒЌФŽќШЩ’<Щ”LЩ;mricron-0.20120505.1~dfsg.1.orig/html/images/val.gif0000664000175000017500000000771510513203700021333 0ustar michaelmichaelGIF89a§ШїќŠ„ЂќJ\ќœ4ЮќRќЬŒў ў”<\ ь&lєк”фўl|ўdЌ4дњќNђЄLє4lќўvLЬммвќєєњLўќžќдвЬ |є4і$„‚„Ь$|њ ДМќ фўЬєў$ќœDBDм<d6l|„LД|~| фќЊќœђќфќъќєŽ ŒВќN\єФ ц ЬЄўўЌTT &lФТФ |мўЬ^$ю Ќ$tjl мќњќЂєLќŠфўќўфЌD ќќўќќќњєЖf‘%|˜pВг‘…| 0ы‘|Г8ЂрT0кˆ||1€ƒщ‘|ДџщџџџMˆшдwp2Œ†щк‘w|@Ћ7‘|ˆ˜Чч7‘|‹`_#Ђ`@дwашўШƒщ‘|@§ў€| џ€| `fp‚ўк€w|`дЂw $“.РBwъ˜щRИјїјї Јюšƒ|№чџ€|Юџ=џ?џwџъџR€| дюBћ  bщ?ЂwAЪ/;ќ?‘€w||p‚$`ўE€|AX;`ж?дwwm‹‘ж|w!љ,§ШџIHА Сƒ*\ШАЁУ‡#JœHБbХ$МhмШБЃЧ CŠIВЄЩ“(SЊ\ЩВхJНXœIГІЭ›8sъ|3уЮŸ@ƒ JtaO™$(]ЪДЉгЇPЃJJЕЊеЋXГjнЪЕЋUG:НQТЋйГhгЊ]ЫЖэRА1ХКKЗЎ]Е'gфUКW\ŸI—Fр` ‹ю*^Ьx.RЃzТф+y†вПH bAТ€=‘бИДiГн>V)€зАaУЅЬpВ_aп@`E–`Œ>"Aгд'WЎœ*GЇЯљn\ЫмЫщЈЭёVv;іьф_џлђэмJ#”0’eХŠCˆп!d)ђъжЅ[НŸ_џђџЂ•нuP (рvp‚хб– ƒф5x^\ АA{э%с|Уu`_~ќh`ˆ!~Ј‰§IЧпŠ,ўз‘-Šтt&ЪX"[Ћ%дZ‚ ~—Ѓw醙\6@Ё „Аp8BV'уS(њхŒ'Іи\•.і——_bЩхqX2Іj’Р`A к–Ѓšk~7d`PPХU@рNŽpЅ‰7’Yт–eО–b& ЈЂ]f™х€б-7gНyаŽjі(сВiоœJ9Ё 0€ƒX|бB ў)щs”Fџh š‰ЈЃтzfЎЛЦшъ˜дЅgx>ŽсšB–˜ROa"P E|ёЋУЙ`kЙRщЅЂДюjх”cіj˜ч–‰k€Рjї pЙІЉ›сХI^Вш)%E5рРХ_Q]Œ@E}мJiшЖПЮˆŸК*:\ЈУМJ,ё•щоHшЄ)К 'МхqзнНцYjОBUУ‚*(ѓЬŒ™\І9ШкЇЪfЦTƒ)ЅФ40@ѓбH;†ТвL7нД^NGЭtЩRKЭsОNнDєз`s5Уиd—mійh—­Tкi_жГ\PэuиtзmЗS о­їо|уџ§vQ€.јр„пLaсˆ'ЎјтхЦјуGŽИу’Wnљх8QŽљцœw` K“ш“юљщ†ƒЮІw šОPwlfъКAkЖ~“НšЂЎћЩ‡ЧNћDЎзў№8сўћюШ{ЊњxБ;;ѓЋ‹зz„ я<™fџ:єNO}ђœk^ЏlЖџzїФк>|іъЫŽ§ѓя’ŸОі№ƒЯИјиЯ;CУZЏ}CъѓžємW?мСЎ}ѕГŸт№ї?FЄњƒHXО"Ф€Э#–7Ч@"€Оs чї> ђyў3п-зС ~,t@bнƒжїОЉАzм#WШСоёА( ќсфџ|(DЁБˆƒc —ШФKБ‰PŒЂЃHE!NБŠXTрГШХнmБ‹`ьмт’2šёŒhLЃзИŒ dŒБYчИ“žМё‰ ‘#їh;:qy б#Y?ђ фцt 0ђ‘„$!gШд)’Œ+нђ7ЩЂT’ pDЄюixg“Ъ'•wЩ8fВ”œ4жїpИ>‚а~Ћœ“CZi9F:2’#ˆЄBxФZ†0!_.џЖЫWЄeДŒeM dТтвф%/{Ї`“оМ є^8CіЩя{дЬŸs—Мe†r›–[S8QЮу•Gдќр:5HџМtВyюФ#Bр9_>ђŒ ІЪШc:oŸюУg5§WЭz›‡дІ3ы‰Jдsœьг”>'JТŠ Е$DZPŒ ѕшGщgТ Ž”“ЦЛЇEuPQд™0=:m˜NтЄp’ІyšRP є ,}œ/GFU“‹=еш‡ЩUtЕЋ6Y*џrGŸBu…УHZН:ЕŽ(Y]щ[ч*‘И>Ф UЫЋ^їЪзОњѕЏ€ Ќ`KиТЖЉЌ„лЫиЦ:іБЌd'KйЪZіВhгбSщЪйŸ„ВГ ЕШgCKкЦQШАЈM­jWЫкжКіЕzEJn`‚йкџкіЖИЭ­nwЋ[РЬ62ЄEЂкEсЖђДШ%.V‡[Zуf„$Пѕ-pCымр2Wб•эtA[]ъ^З6Ш•ЎrГи]БVфЊ˜s.vУЋнёbБК9Еz/Ї^№JWМЭeюRg2_~Љћ­{Ћп­“ЈЕƒш ы;>•xЛ-02“б ЗoСџ§ѕВЏќЪ‹vђ“Ј,јCWuNіА4)ZсXіЗr ой}лЋтџндТ4}БфbЌйwиК—QЭ™`bX&ыѕqШjь]$лWЛјВŠ§Ъо7йУ‘U2ЮИЋп+;ЄЪK–В”KТс0{љЪI†2ХŒц'ЃџТœэ.—ќ95[yЮ*Nѓ›LE9G8У=ЖГ™ё—цv–WŽP”™шuD)9x•XИaAšі“ЇC™Іy;я˜8x…ЎЩ›ЅљPБз“:eOU„šЙу„Љ)9Л˜`k\Ј‘wHœХйœJХbЦ’І8Ы šЇ•x!жbШ=;ЊEЦй#iX’ДyлЩ›rщv|gc…“%ЩCх‰†$i/#УlкЙ4СŸrIAяI<™гљšGUS%eMЌЩŸЫй›Ђ?4Е“ Ц“цušд™LjdBu›€ГžМЩОu™с™\фЁ§щ "*$ŠE&к –Ђ*J%Ъ 4Ъžs‚—œG8Ъ<БY0*™~љЃС…ŠYЄFzЄHšЄTЦ[LкЄNњЄPЅ;mricron-0.20120505.1~dfsg.1.orig/html/images/transparency.gif0000664000175000017500000011500010416473654023270 0ustar michaelmichaelGIF89aиї’ќ|BŒDBD„‚„Ќ"$ЬBDФТФдфVT|.ќТ|bЄФ24dbdЄЂЄфтфќ‚мNL$"$ќbќžДМ*,єbdЄlќZќцЬ:<TRT”’”дJLдвдь^\trtДВДєђє424|RЄ |rќЎМ"$ьќ’ќrДœмBDфZ\|:Дд64мRTЬ.,ќњ |JLJLŒŠŒЬЪЬќжЄФ64ljlЌЊЌьъьќŠ,*,ќjќІЌ М.,Ь><\Z\œšœмкм|z|МКМќњќ<:<|zД&$дFDф|6ќЪ|jФќfdЌќюфJLќ^\|ZќЖМ&$ќДœєZ\ьRT|F”DFD„†„Д"$дBDФЦФмьVT|2ќЦ|fЌЬ24dfdЄІЄфцфќ†фNL$&$ќ~ќš|ќfќЂќ^TVT”–”дждtvtДЖДєіє464|VЄ |vќВмFD|>ќў  |NLNLŒŽŒЬЮЬlnlЌЎЌьюьќŽ,.,ќnќЊ\^\œžœмом|~|МОМќўќ<><|~ќђМФ*,ќbdЌд:<мJLє^\єЄьZ\фRTЌЬ64Ф.,д><Ф&$М0;дОwœ €@ (э l јыїё`јёїзwѓ™ƒ||џџџџ3?|ўA0эО‚Ъ/ў‘€||P‚0E;|œXыPждwНmкд‘w|!љ,иџQHА Сƒ X˜АЁУ‡#JœHБЂET-V\(@ЃЧ CŠŒˆqЄCŽ&SЊ\Щr`Щ–QТœIГ&ТŒ0eкмЩ“хKš:{ ЊёgN†D“*…hДeаЅPЃтtŠ4ЊUЈMЉvМЪ•hж•OЛŠЅљUeиБhWNey6­л‘eЭV}KWd\“mыъxwdоН€Ў;зт”D8)–'0зО~ W<œxqcЧRоъ‘ВbNŒ1gЎљЂgЫЂБ•<ŠA‚h𓀑˜D,ВhOъ™E–vшЖlкЖqы6ШлїoŸšхrЖX<іькЗsяю§:iжЋџЧЎ|Лѓю)ЃуБˆ‘ ŠJ•R{ЃьaeS>З%Ф†(ЉD`Р|Вz‚Љ—вp ЙŸ|єa~њ ФŸ "Ј ƒ „Iп|ѕн—п~§§ Bx  .HтA&~„тnя­Xс…/jc‡к(ЂŽ;ф pь=d šLТRqJrˆ,€(ˆРmœqа€o,2'ŒДЩˆ6щф“‘MGб”U^™х–ЗuI˜b’iІAhЊЩІ›pЪIP§hžVbЉ%—^:fež)JškКљfœŠ2Њ‘ЃAЊчЄ}VцЅ™КЉЁž&џЊ(tžЅC'0Re'hТ)pl"‚ –єIЬQТl|0 Р€?,’'Tœr TќZФЌДжЉхКkЏП;lБ›ьВs4[ДвRk-ЖкЮ*ЊEр$юМњ ЌАФ‹ЌВЬ: яДе^›-)л†ъ­З6ДoПхŒ.ъмЎСЂD‹№М 7,чУЃFlЪƒ4 'sLаЧs$ВЩ*<бAlXБ šHБ,)™f(0rЪšhФЏ›p{/О&ЃlаЪ-ПѓЬ5п{эЗчОЛНџќ№ ?QiЩK№9ѓЄ›ŽКъЌЛЛвзаƒэИЗЙ}їР$<ёЂ‰/љ3пђD—>шБzя“эфG?эёN ОЫіОЬ=ФF`'F…Ј,YЅР#La…ƒX# Тыў&Qшц ˜€Œv јєЁR B&tфN№TЯёпџџn…A rаƒEHBЂP…Š`Ё Cва†8д!ЃрC ІFˆ)M7иСЮ!„Ra UїФ*­…/Œс ­…Хюp =ќ!zРј1fŒHtлгиD6ІаA€#хxХбeёŽШЃћgA‡LсRцГ@A€РEaŠрDМ4`"Tњ›&PАˆOАСЃР]ЕvgЅ#(Т@иƒPhfb{D[кrIкdr“ќd(GiSЂ2iJ[e+_KЬ2OЖФЅ.yщK`Q˜ЧгAŠ™€c„“žЅ(I gІ2šЌt%,ey ZІ ›ЙмхzЩџ‡_v‡'Й9Э9t*sЭ<х;eOjвгžјмц>ЛљO„dр =C &N§q"i|(ф@І№ž |Rv?ˆо@ž…DœтoБa„ ‚OpЎhT•њPТ {˜!#P‰ѓo-MъfЁ4ъVEјЈ&BКЦ‘–єЄQHiAXъR˜.mІ5Н)#rš'žњЈB%ЊQћЇž h!ЃГ - жб J•Њ!iLъМЌЊ”Š-}Љвb V›JЇ:MYёг ЖI­џœŠR1зЙ>ЕЎQЉH WОЂєЏ\llОJSУ"ЖЌ=e,Z[дŠdIGВ #џhЂ(€&ˆ№сŠ˜€OЁbЄlвцДˆТ $mSN=ЉXM(HЉXЕ–6‚ЕВе “U* †щко6ЗЛ5Ўo+м4З ЧM.4gгмчFwЌ№9BuЏ›нэоЧЛŽљ Т›бpвжЖИе-oзмсёU.}р\шfПдэƒu]эцєП‘-);ђ6ФМ N/„м^FМ—ЗШ•0s)lп OWПцЏ‡Й рР f“-Б‰0йYYiЬD!\„(шJ щйŠ)№awƒen&DG˜тP/Ев•0‚`"x"€ІK`bџІТ№ ˜ІŒ˜ВCІžїьLЩŒP2бф'GyЪUО2LЕЬe/ƒ9Oc.ѓ™гœ€5чгЭp–ѓ"шЌ—ЌљЮ&HF з#'yЩ„vrЯНЕDcЙ>:lє—лцDкЬhV3›­€щ8Яy/FЙ3F…L‘  сиЅž mмBЏкy‰rЋ­ќj ХКЫГ6Є'@f\Sквm~ГЏ7 ьƒxaВ^ИЌˆ•jфYˆ0{а$’аdNTњ“R@СTаƒWŠF0mjГх$Ј`VVqЅ9”љг)в˜Ы7@)2о]`#ЕРЙ(ШC==яY џЈРЛу=zsёоXв7П§ p'€р\>xТKА№†?<т(˜8#*~ёŒo\ЏKV`›QЫB%9Fн†dЏ\о.Зw:ѓНя~[рпЏЯЭs„ЗIс ‡йЯ%Nё=XучxХь‘г"Љ0 kAŽЋЇоXЏ7ЬЙ>ѓЏз\ь87ИйvŸŸтlКл‹wЄЯН+ƒazlеM"ЙЅ`DБFBgТY)`КOˆBичбц„l)PХq% Л]йšл‰XФ~рš ”‚ #˜B0ЮХушєЧЃоy<ы &ЇС p1‰€^єЄoіџщS?еЗўѕБG§ho{Fр^ї{р=-;ё{ж Ÿј(0>ђ•Я|чC_щkqw#Gƒ [Х6T—lп7zЅWуeхЧzЃрzА'{ыW{З—{Лз{ќRС7|Хw|ЩЗ|уH}tQwдW}eYу3|Ї€ЁЧ€т‡zh~ˆ~Ш~ђч{cіјЇ#иœ№|'Јt1`EtQNЅwТvGP s`Jі€М\/SC‡ Ž-\d47wsЇ љ! " AЇ S˜QЄ\Ш&GSЯз6iag#'rgР УЄg/№М08€ЙP Ux…YџИ…]7`bH†vx†ЖЇ†€Р†nјRj0Ўр ВАК М№А k 0‡u86x(z8Mё„ЕQPв-А‹‘а‹“еˆXZШR\иI’†cИeXOg˜†kи†o˜Q>0—P7prH‡‰‹o"‹Иn+rEіцшј‹VŒУХш…0‰•ЈŒ—иŒšШ‰бˆQ1Аа2№йјŠwиГHwu-(€g У4…Тх+2ЃlА:›Ўу28|0Ѓ0 І@ ѕ˜йТ› SR‡e‰№r=BОbЄ`ˆ‚г^€џˆ4а ­А >™ К u щ~%9‘P‘yCYВ‘љ‘!9’%y’Џ!ВŠЂИ5 /`AYВP,щ’R“o2“5щ|ˆQP'А‹-а‹‘0YE‘HЉ”%€‘MЩ‘ ’fxsRi’ј—)‰Qгшеx зx5–іі’ф"“4љ*xбIUŽч˜ŽJU—GI‘™—LЉ‘| •)’Œ@’‚‰’Е1а№2а˜-љ˜e™hI™рr™)…Т–—V˜Ђ*0 #РPv AВh ™Аѕ4/CEa€ pРx ’gА4FУs)vs‰џSА™@‡"3р^0…Іg­ ; z5 ”uœs œФiœШйЪY Ь Ю Жw-гљеy-ƒ•Ў0u0 АА;0 p•ВРЇрр)žфižшЉžWБ––щ–p)—“ХŸўYœЧ™œЫYNњœ—((@ж‰вHжˆХЁкp Zžч™ž@АžKQ™б›/ицјш+Z~§ЉџљЂЃЭIЃfhЃ8ъ йЉќшљЃДЄ03Є"jЄHЊSAу8Жxу5ХqЈ !Єюgf€‹ ЛrЪ JЖб’лHCвЩpџ€џF%} XRмCPЖt Я—#žъЉЄ@p9Iz“ŸAЙРz–/а ї К  “Аu Ї†š~ Ј‚Ъ/„њ2|*ˆ fжЂ ŒъЈЁЃ }ЁcРŠ5 ЋBy•c0Љ•њ˜Њš*ЌњЉQЊЃЪž,xЂ qЇ Ё WpЎЊЎАЎ…Ћ|ЊЋ˜№Ї:Ј…ЌУJkХ:’њЈЪšQTG›˜0Адк—šЉ›К­Ÿъ­ЄšJК›сјф*•А Ы{лЎ{кЇёЪЋє Ќ‡‰ZЌЦКЏЩЉХw’аВАI0[А–z­йЪЉмџк­ЂкА^QsjY IŽvzx:…ЏsCИ5p€žWе єз  “%(]иB/(Р*„yкй Ÿ$\Z }@1FGВgtЄ@ ™`ф7Yyy7ИАЌJip /А9 |KЋkPД<…HЋД{uL›N[ Pл|R;ЕCeЕІ€ЕRpЁu№b Šj€•\+\хW–aK.c[Жf‹ЖjыІ7й–у*ДхzЎWЎЊАЎQ€{ДI{z…{И‰ЛИ‡2ЕT Й’ЋЕѕЏ[;ыЕ +ЖGЖe{ЖІЛЖBёА™ж[Б›Б‹QЕ+ИЗџЛДMћДнШИcхЛ{ЕY›Q,ыВ§ГМŸ ЖЬK Ю[Кi+Н=!YТ6Ѓ0Бy\†k…tЖ†лДKФ Й“0єв&Т…Ћа ђс+ж”—UИ4e+TC…„gП“Д& Бт Ѓ`4Рyv›f И€ іЉ   lСsPРЊЛ М4ŠбР у&\И ˆ•ВФjАФWŠ|СCЅB&U œqŒ мМ#\MёVЗџЫК`ЎшЊЎьŠQ8lR:ЬУŒИ?МРBЌ0DЬ{<МЃАd АћФŠХLХЖaХn‚ХFЇХlлžёГџЦЁНЋ€Б< БwаЎ9LР5dР>ЌL@ЬРв5ФLЧ&ХОЧжВ’№В0ЫЧ,ХШ3ШY,Т;; 9b.Ќa‹И„JЖfk\KЈšœ-Д6Kвщ&•ЖкYWЂ œЊМW%UЈ;LЛSБ#’U[Ж™ П\мЖˆ<zЦz`-œLР ѓЩ“мg uP ЙќЫМмЫПLЈ Тl4ФЌ Ц<:РЌВ№‰њ­ЬНвЬˆЁ+S,ЭзRЭзLйœqл<Нkс‡'<ƒЗ‘ЎЛ Л ˆQяМЫНьЫРЬnr-бЉЯіУЯ#Ц.QЭЬЮŒабџ<Э ­4и ЭЭРСП›Tu•P <дF}дžдв†;вК Ьѕ|Я( їЌ;,M`†е0НЬ§Ь mгЗеа-НПсХwІA+Дк вZСПьЫєїЋ7T %P{—Gѕ„4^и м %Р ‰ž#Р*tCXЂHBp#Y2’7:Kо 0ЇЊк'Гš­€,,p 3€y[ЖP юќжLKЈr}OЪYзw­зgИзЖЇзiЖGŠcаФX)а_PСƒ]и@p艧2RРиЗљи‘š“]й0‘БхtЌБЛcмб§бgџpCGзАэЦВ}C Wлyл}Нл€M`.ЭEм„mиˆЭsЪЭмŽ­мЯ Є@йћыгтJ šЇжaд{д^ Iэ KэкqMоt}оx}л7ЧзК§з#–е†п‚=пЧ]пŠНм-\њmЯанпвнaНиTЊkЫmT/Ѓ_ЏЭД їкцэЕQdѓMЏК†ЋŠs8q—œW‚‘$.\Е§И ’ mТдЉњz  5№Ќzа /€Р, 8а 6Ьк3юЦ|у\›ухЗуВбуIѓу˜œФњл›а=фE~фI. KЎиpЕхhћпџЇ &мншщънi^уРцГ§2o>Xr>чнУ-§вХч@`ф@€ф„ ш$nщ–ўфUхˆЎітBрВЎрJ в&Ѕц6Ўцn>˜žщtЮщX­еŸоDъ~^ъњuъMNшЕБъ‡Юс‡@ЫГ…‹Kу#ЬmЬr]щZ~vdQt[8 й!t0юBўw@А‹$Ы3`{OРM; нcЯ[ЌтІŠn‘}z–хљ)59 ;`3Р4Р/БАФкЎœмЎыц§IђёууО,Hv›G`"?GœФMќЁˆђ_ьюю№~XzкєџJіО%:Эњ.ќэšЁшсe€qМŽ>єЊ€ЧUё:о8žёрЮёs^ю Ÿю0Аююзюяя1?ѓ;>6oХ9Пѓ$ р“Ф–~pіГžі•PlєЛlёJпцLПётўєюROѕЂъђX?яѕZѓјŽѓћояj1Sп‚Ё›нžиKЯa ЬŸєєŒ%ђБм?^–љї*й šР’tp \d|s­ИЭO:?™ЄРOh‹‚6aЂБеT!№М љЙk`№ГЊ АР•8 “0”j љѓ<љ%н^—;wŸпЌm$Šе_ЙœћљЂ*gЃџ_њЅpњyƒХ>Дњ­џњ>ћaпnW PЫ!єDпшFQЩџI‘сp_љšљбOтœ‡бI“‘D@€Р“) Ї Ѕ:Ѕ8RJF8ё‘eDІDЄ,ђ!•)’%MžD™R%TЈLžѓЬ,:ДVšє“ГвNž=}ђ,4ц„#Ž™аЧшб>Mє9ztТ)ЅJIQTB‘”ЊЅІіVцXВ DЈЁCˆ)~ЬИБуЧ#oоХ[вe^Мd§ў% 5ъбN}&\ѕJјЉaЋSЏrЕъе0XБ€Чб$aLI`8!EŠ>%N‰› ŽS‹€BqŠ‘џ„L{јо^й7^Н}ѓЪЁы5uўLЊ‘МFŽVЗђДЊQK–рС…W%ZtёaЏз!7žlЂ– Yх]•уJНњ/э1kцьtбЄMЃжЈšЕkиВiло-@–іЅT%AdPA2Œ‰КЈЌC,;ЃšтЮ1ЎК’,ЉА`АьВЬ6ыŒЃљъ+эДдVkэЕиfЋ­Рнt“ёЄœќј)GŸ‚*#ТСc ;Х0lЬ;“ђАВazDљB-Eќ6b‘ПџЋё6TрВK/П3L–WщŸйu^Ђ‹Ж7я|•NЊ~џ-Mъ‚88с…~8т‰+О8cА=y‘Ы>щlг ЭЙЭёЯуNH ыzо ѓN:i}—ў;ъ/мjЌпšqЏ5–€cШЧ–œђЪГм„мrКІ0Є*ˆ94QЩюъ=zУ"“ЦА_ˆŽPd6R$0‚‘†‚(ћLщŠ"\ћŒ)њ‚‘к0Ad цbrпѕ*ЙРрјc тжƒ.r&Ь`YbhжzдS5˜Рш2оёІ"х1ЯyŒWєОsЏџОM iMЭQВ'эuя{!љFa>єI@}ьsпр'?њйя~–+цж‰ЖСъm(^TŽg˜ф-ЏyŒС`ъŒ4=ЩЦz"дїМЧ–№1b|х;вЗОіН/~ѓЫˆ }‡CaNsaрмO2А•м3‰[вђЄДЅ“­efwњйЁžЖšџЫFу›”ЋKd1S”FЄЏP­AhоyЉђEYт;.Ъ6К•z%ЖПх)Ц–ˆD\™№|oЈPL№ AH@"6э+Ёкj3|г сЈЁKКxld•љAY$\аьћ‚№№ˆуtтхЕИг1^…#‰уёђИТ@.ђ(мф(ˆЪYюr˜Ы<4/ШР ~SŸ:ешв#Z§ъXgзшDь›•ЮtC?+QЯад5nѕгeН0šљШKžˆ“Ч“4+ч йc>sзд\э2КvЖЗнэwЩ цТƒ…с%LX w_Ио>цІgЈ“|ьBuяNръD1ыжџџuЧ‹=ђ/Ÿќй+ŸіяFЊЬRД3Є‰ЛЖoŠјq[‡vКR("+п)RЂZф *g2#@"r’ŸЈЊшC1fMСpXФЁ‘@рYBь]zc'Xє&š­@žы.Yƒ•Q™œiхc@ДњА&‚Окš>шБОР>|й›йуЎxЋЊ#ПёыКЯѓKПѕ{2їƒ?љЃ?И?ЩП•`€Є„<5;РСьъYл‚В˜4Œ|Ошћ&ъЋР tК&ъРэИ›я3Š$ђAњ Aѕc?ŒПљ+œБЕC У@C Cг#„3œА.…џ5T цТІˆ@щУ  :BС@ъqB7т@№ћ-ё‹Т4?…A?+<СїЫТДПтУууЫаКьШК ,$AMHжлЉЋШ цС&ъЉй"Мћ$йQйB @Р+№I*ј—ЇшЂиƒ`ЄR9‘шBщ˜„IШ…РШ‚3€˜=Ј.йœЩщ(:ы˜QЂФyЁ$VЪDˆлDЌp—жХЉ-хыОR\˜SФ‘SEVTŠбxХX$$ZДEю‰(аХyA•ˆA˜AJЈСЬС-иAY+ i$ jœ#ОЙФl+еъDo<šPќОQ\ДЊКџsЬt\ХVdGXМYЌХ[œЧztA/< 0є1 2Є3DC%PC6HӘFыЈ„Ќ$…мЦ†ќФ‡GQфУ#ЃHлCEŒTGWфHYtxЩ\Д 4>GBОПEЋyЋ lžž‘)РФа­и +od( YŒk”q”F@љYХT2<Љ‚yЪšшЅ—S‘I^4ƒIјƒ?Р…\€…ШЊ\р…4`3Р….сГт 3hœJsРЋМ­LЎєJ;Ы‹S"K’ššДдЕЃЖФ=)k„ИdЅЙЌЫ ИЫІ,{L‰|мЧ~Ь.Дф$‹ЧdЇШ$ŠџЩмЪЎфИЦШLЉлL"ъLГœ аMЖLЗ4+И”Ы‡ЁKNАKдРKЭ/ У1,У ;CBHC.aУ6М 7ЂЪѕТŠп$ЪДЬсє*ŽгLžBNэрІЯЂД\Ыt„NгDЭЬ ЮеlMќ{J{D…УŽuБ*pЂ т)KЌЗ'ƒ—Ам МžТ*МУЛхK ‰8ря9ЂЊ#Š™€SH„E…Ex‚>H€‚] €…ЭњƒLО  \ШИ…\PLE/`#­С ЂƒPH Е# = х1 э)GcKQѕA;EQeQM•Qќ#Щ—‹џ|H™ш; RŸ1вњЌ:%%ЂmвMzв‰ЛPR„Ф=ЉИв Qˆлв ѕв]беŠ1бЕЧ3- В0„I5НБш’ xS­:$uPя6 ­Iя˜;š)E+*G+ѕа,%дС+бЋљвDS2uTЇlDЈ|Ф7ъNK !EЙ Bw)a}Р^‹ŒЏZ"ЇРАuaŒ‚Hћ>Ј ŠЎЬŽр X„"F@Ф‹88ЫЋбž[]h=Р“5XŽТdш5аU%QtГDяs@a%жБ2жC;ŒSŠeЕЕuйŽv‰V(Ы8ЄаJЗ<lеVnѕVVт„џpW3 ВPгьВT.Бƒy•ФЃлБ{ЕЦ|эЪ}mЗ"ЋЃ^иТXVяšЉg=иѕIиjeX‡нжn§ж‰WНU™˜TCЈT6х’ №X^ЕD_хР`-Y фзwKйщaV–"—uжУ€Viй…НжlНйˆз%аž5ИGєSI\š{ tA]Œ‡Їё"Ю‰:žВ*K@‹ :mŒЈ˜ іC˜ “ј[R˜ƒУ`„D˜‚"€јй„ŠеNH- РbзVрЙdj™V€@ƒx-лEZ†Ђждi"МUYес$ИM­d Б i ЛEв•ФН}2ЂаЊП]„РмR(мУM\џDXмзt\Ри\г˜hгЮUИЯнЕЕЖ-н|9]ФHндЃлуqн…"Ви­жйѕ[Р\Т5\ФU\Ц‘р•TJА€ @оS О нЕEžЖuлшХLЙН*йj]—Хо^глээлкѕомн]ёѕ]ђХ ’”Њ3…7шk$Хt н#ЋŠ_ВьЫЪеККRХ8ћє@ˆшЎЙM^'< HЋ8‰€Q808@TвR˜‚ГУ„"0€’‚"h\мШ9шXƒ5˜„Ък< \˜~р…Y ХЪі, о5 ЎCNќЊ& 1I ЁО*ї­ЊvВж„^сf%–aЖaџ.плXYЫG#цNbЙYД‰sb"ƒbёЫ<]И!љ`IzYуйОЋ‰P/cva2ЎсЭ@у>г%aУŸuc€c`•уEЋрEЃ_д‘ž<цр@ѓр+ОА,^š-dЋјтDPaCуNd3fфQ`Љrц’JL—}ёTpь;бэ ь%2)ж Nыѓ> ѓИЗВЊž1Kи:­4"af„(8 њ˜FˆЖјQPˆŒш у‹э,‰\\иaD ?€…ЫŽ?Ь]Јх.СeŸбekьЉ^–п]л5aжŠЌ(цжћхy›рf–Їgn2O,iЎцkž џmnіц(чСв’G6ŽСyОх&DŠїХg^ОИ}цcf€† cЎd‚VцбВЩT}…Žц†ІfY‚шlоцnўfzФшqжhЫˆфIѕhЈgji?ХJ(n"~ц”ОЬъшš*Ш—–Є˜ЦН™†f†vhœЦf‰Ішžч‰*ЉJм.=›ZЇ˜c ZХSN"цЙЎC$Nе ­FА>+Ѓ0иwi2ЙтŒ€FащQР„=>`Е 03GЦ ]9p™\Ј:`з\X–ўXаƒГц’ДЕž`L–[Иж hКЦе^>ŠфTЖцk%ћыw™СЮџТ6l‰NьХnl#xьШj5ошьЪGбв]f=m Nэ_^mЙnэжЎkиfРМжтпT л†VРЮэнкэS(ьУўmЦvь‚ юМ gс ‘Ё6хfюМsю%žЬшЧ”ХŠъўчы–юи6КэЎmэИэРoо6oХFoсVяЮ рf„%i иD@kщ~Ѓ„GеІ дйœjm­lцЉИ§Ж>ќн_ц>‚хжeExhЯ0‚S(…гь„Sœ)яJ*р^oМhoLЬЮ1јЫ@  Џ№ яО gY*6ЇЃъћglыуDы3/њfнеe П*џЧŠW?  qЧqŸїёr!ЯhО€p — З№бЦ№ю›ђcЎr:Кђ‡ё-/q/џђ! sК} 2ЇЉТ8ѓЎLѓ5Пё*ШёяёЖ’ѓ пŒ!П rОѓqђ=_ю>ЧЛ?Џф ВђЃСrbq.7ёDЗоВdє€ЭŽиH—q5ч6Зt7‡sMŸѓNз’М†8…%љтё….б„НgфГ4жNо ЏhmцЉCжЈЦхЉi'ПХP(AfLЌ(œгЌ‚*Шf‹№VЏJNPѓ(0Щц‹cgЭ–БџaWЧB eЯ%g‡v‘–і^хg§ОvлћgmqџяісќіЙ wŠ|BrŸЉЂИwS#Pw„awwWЫ}іЏЁw‚Йїт6vdWv`v‚oТЃMR„Я^…'U†З>‡ѕЌце:цйa‹ї@Œ'Xsчјt_їvyx/y9y{Џѓ•gЭ–y.)yOЕз?к„Зі›ЯіNмљˆїyzIВš‹OqГпxtїјЄoїw'yyњ”goМ8RИ+MXE˜ƒПнƒ.)oыдљеCу8/Gж.чymзŠn{ђJїнCхЋЊЙѕ$mВЪќžF`wT@Э{ОйшКБЃO'ЩЛЯ{10–№f‚,т{П|СoыЄ#У/ЏџП@VЦчyЧп`ш!ŠЅ™ќъкК%-hж|‡рќvїќU§})}•иNд‡ёНя{8ј{. ќЭœcл7ДђЪ§ >V/я}žџ§ЧяЄШ'ўЄ|­sn`Уќ9XўNhў*x~з §Œ ~•p‚#EšЮ0lшЁЂ9рь`БDЉ 'pьш‘уЦ>K•’"E‘IE*MJ!IђЄЪ%4)’YS&N”&KJб8сˆШ>BtъDєRЂ„і*дЈШ R4ЭI HЉNUЉ‚ЊJ Ѕ%`$!JЂ(QІl;•낉8Эб8…#š8jЂТ(JMœ2џА(`oK’Ђ~фШXЃbЉ:[ж$Љђ%Ъ’+MЮдTbЅЪЭŠ#3Fš"EбЂJS$z4hЩЯ=4JБЕ+Њм`'hbD*LiI%:ЗmюуrщкХЋ—Џ_Р ЖˆихтЦc—Ьr,ЦБŠ0З„ЩВѓg”ЁuŽйб4ъдЋ[7}Н86ЪŸЕo{еЖїoС WœroСU sеUЪ]yэХ[tQgиuŠ=іw‘є]eт‘ЇйdшкN‘іоЇЅfTQЌ!хTїI!›~ЖqепWџљœpQg‚Щ!Ј`sBї—„„Q(vz”сFюдсeš•ЗйŒšx6Ђџh&КЧ|+Юїb}1іпlћн˜[ŽМэ( Yр( PGRœТfž"ЇЌež3ёрFйRI.eДЁz3’hв iФs\ъYJ\fжQFBy”Љ+Цgд|ѕ}”к§uеШs1Т'Б# • ‚ IЇxJЕgŸyЮЈ S:Ёˆn*Ѓ‰)щ†щMVЉ–˜jzh ЊGbЂЁ>FjRІЪ—*RЋеЊnUР*+­ЖтЊk"Мy ruо™'Б~kYВЫ6ЛЈcаB&эЃ‘Ђd-Kи^šщІнТєэJс.6.ЙJЕxn‹@ЅыЋ]ЙъnЌГжzkџЎЛіњыqњ Ћ'Ÿўz№ 1Л)СŠњtАЃоEЪ0Ѕ–jБЗКЈЈ(’kЎjшЁЎV"ЗћЎЩђІ\яЪnbч^"QDOЭH™ALDЈ  Р#s(ђфГ F&6xьСє'{ЄтпЉМШ"QP!Ќd2ѕ”шvQ1•tЙёбG&ЙMЁжЊШАš Ф"E 2Jp$rV"{ЌŒЏr[Ѓа5os€ виc•}іEiЏнілqы YИ”Щvхx%хНwп>xG'Оѓ“Š/&R8ЙS‘ЇЕШЏNpyц›wў9ZЂШr\ІЃўuиБ‘m6hЋЭЖлp,wюuяtЗџяzѓэˆп€ NИён"ŸИc–ї“ц=/zlЭє(g=ьiŽsžї”>Зˆ/;фc]З\‡>ѕЭЎ}ЖƒЈtgЗ*IсwїЫп№јw“У5&i‹‹Jуšf@з prе[ 0зРэApNЪ)B&$0ИR<­&bйŒBP0 &@ˆ цЖ q'*LФ–#ќ@9*E&Aœ”hn‰ ЪХњ šБ(Ј: ЙlsУ*tЂœРм 6БSAœр„Б‰бѕ ˆBФH Ї$jB‰Lф„Ё(ХїйN#VLЬˆДx.zŒbМ‰Фz†!Qх),rонXЎŒЩё†uџМу"ђИЧ>ў1ƒќщтbШ!&ђˆ:Iт­гФ'FqŠЫ%-ѓ-M*‚“ЧљbЧh8„Е”i\#*лЈЦUЦQtД#ѕШG?RїBа.Y)Ebё$ цa†)IcК$ЩФЂJ˜щЬИ@ѓ“dЄц(бШl:*o|cRZYНW†s–фДЅcŠ вO I28–9№С0d!јШ Mє„)LвŽGZЂХ•”`ЄиФ(’а+є ‹@Ш)„…™gY“yLY BO‰ЊЁ8?] KЂ`€),"ˆ|@‚p #$bІtЫD§8‹Т-Ѓ˜фЈGR‘’4'EiџžLдЉЙІ2эUMoЪˆœFЋvйщщКБRi rEЅR•ЪTЇBUЊT%dВZблaДHG-ђбaЄ%•JбzRžАД­1i\qЊSЭ№>%**љz.ЂкЈz]jS%№дЈNЕЊчL,EЗЪXШ<Ќ’+e-kжЬЂUЅœ]˜gпŠ аЮuД')­ЮШд”НЎrЕгm­Ш^;XйЖЖY;Ž$ ^$Рю+…–вЋ‰x”#А•HбЇЮиЕ;Л-U‘‰QЖ!˜,Fё]>!DсVaц`ЁrЁ#Х–BŽ!иjАтVDцЁP%e^eVneW~%g*‡g–хYvЄHЈЅH–цiТЅjЮ%kжхkњDlтф^жf_ўenхC№ІўљцчSчTNfe&'fjцъ'мм™фз `йTЇiZD\aх‚)А!p˜B`нЄИMчѕ˜‚( œ%$A Ть‘^& Х%єI‰™жт” ‹pE Ym Ќ8F~EщQ`B|Q€хнчлфg™эgcєчHўЇш( џhж Ј‚2ƒ.…<„J(…Z(†j(‡ІLBa~hYŒђаЖEЭ‰JишqХŠ.F‹КЫРЈŒвЈxф:Gшш}шgЏ§(i )‘Љ&i‚.hђ4ш“FщБMh…^Ј)dh§mh"tшCpiˆ*Ъˆ–K‰вбQ h™’ ‹z…šВщŒŽBТisк'~ЂWощG)цЦžіЉ’*9щг@i„ъ”"ЊЂж‡z(ˆђTщ™шЅ’ЉŠnGšОhŒ~jЈоЈ!ЦХ"г"ЙкЌШ—"хIMЬ Ц&AцшŠдп( NH™iТац…џ@Њс$Nт,*G"%С\œТъФˆ#•c2$І’^m™kС)”\d^$EФ!Fы$Еf&ёЄjЖnЋEtыЗeИFСИю—ЙЂkБЋЛњМŠ€МЮkН")ОъЭж€.РТОіыПE ьBЖЂБ6рСžFТ.ь­5Ќ>lФњ ;Rьс(ФTaьЕŽЖJЗz+ИŠ+Й–lж] Ъv‚ЪFZЫО,Нк+Оъ+ПочЮ*Nє8ЅЮaа6 ЯбтQ),У:l --` гNkдZыnЌеv,ж‚Ќж’Ќ)œkзFиКЖЋиЦk†ТЌй&BО>DЮЊmOџьM:уЯТ­mH˜м"lvйэбт-Ф>Ћ[ДЂWP'д+`EюдŽB†%*ПджЙE€ Рл№›ƒ6E)d‚rѕ Ј@fhИjЈpŒeCь+Bl kлВ Šюш"й mE HЙР€[K)шэо†ЅъVьzЙ.ьЪnб.Н Рэfh"ш.яzыя/вШ#ёя%яђAѓ.ъѓ.€шB DpSЏѕЖџ$ЪOЁжКtячкјVј’/˜/њЪЪњŽjъЎnќОn&Ф.Ы=Жиn’ъ/џ žџяЮL_Aё/‚№&0/є*џpЃFЏєžпЋgomяoŠŠЏBUNmˆ0 —— ы-ОясЌ№ќОА§Ъ0ююяюкАятА№ 0АБ;o1;Qc/ђd№tq/яПJ—яљbБњjq\ ъѕСTь @Џр˜,F•‡FY'ќIiB™BPТ#д“ЄjB&Ј@+яPђб$>oZјHШБGИък|iЃ%ЩсЮIёвЂ}…k…žPЌDAD@œ‡!/F"3Т"?82н˜„$3%[ђTdђ&w˜9(‹ђLp)Я+*Ћ)D.4pЭJp+7jИ ЇdџV)ќTѓдrŠођQq….g/Ÿ‚/“Y31яЂ12Чл27rж=2ODѓ4џ2&'щ5{Втlѓ(#Т7ŸrЃІђ8ГВ+Џs,Л3<_j‹иВŠрВ=пP|єђ/їѓ0Ѓp[3"4#7ѓA?s$[Ф$W2C[sp2Dks(OtE Ш`є*q:П2;‡’=б2Š4Яе3ЇюђФщsJѓJ#‡[œР\-ž"#(s&d(H'FuЫLFЅ|‡IЬA˜‚цœ@"œ‚'{DР А  4,ђЋWІВ8Ÿ+Ї3)іщt1š‹Œ^м>ЕЛ”tхи…y њ:+Kџ„VћkFtѕWѓAXСXЇЋF˜ѕ§ІѕќH[Л5EЧѕ\wD]пu^Ш^ЧМ&Т_ЋE`GЭюіnз€xGa“ТacYbЋб1v‹ЏѓјqTПŠdынT‘‚eW$/f6W{5X‹5Yv– ѕd№DjП5kW]л5^ы5_зіmу6)ЖQЖa—zЗ|„^c/їc7ЗЛ<7eKw1З…uo6v{Жv‹ЖcuЗE˜6$‡їjЫ5yЛЖyЧЖrЬv_ліPуЖИЗєўЖmЧ7bЋ”brGёа2ї=яwдL6яUv}Ф(Ш—І(DYR_KРтщ]\EІPH(‰dТ"`џЁ)B\”I…@ˆ‚(B<С!Ф!DŒW…>ћkUј ’ШЊ…ИуЋШR{‹WлДD_8йvРб_ьmмœGЅјЎЩWT˜Y@oД[М8ЊбФz1ЯЋ‹‹Fъј№x‰ЈФ9 y‘?Щ‘KA’/y“?y”Я•Ѓš•я.ІД.#lљYœ…Ш"8˜‹—mSй™Ѓзю*"чЖЙаОљЋј1TЖ’nиЙрљŸЧјŸњ$z‚™ЅЁ#:&)ТЂ 9‘љёIК’3Й“CЙ”gzІ$Р•wК–sЙЈy˜Sю˜ЇК™KЋЋy:ЅЧК™Юњcзџ:WЎыњeџ ŒћљŒЋ пxћхИЖЛ2%{Ѓ/;Є7ћЄCЛЅO{•[;ЇgљЇkЛ—ƒ9 œ:™ЋКИЇЙЋГљЙЧКЛЈћpЮ9nд9”С;VDн^D|КtУд"№Ћ$@‰MХЅСЁ0‘–”ЧщСС"exi‚bтGPAєР@X‚ М#мъŒ@TmdЌ%@ŒgF–Ј х…УџpЗr™ЫжŽŠY|шŽўDSЫQœЯ‘™ЊЩ•U!о`ŽКХШF™ЁРЩBЪЫузЫЧМ0Э|l €ЭуМш6vUй'кЋ}М@л—<мЪЋ|нчIЖРќ§ЊЭѓ§ЭЋспяМрџ|а}б Фб'§т3=M8§L@НxСдЖеcОцo=t}-ƒ=s‡ўœ{SщŸўЎФъП}мЯ§ЪЗќьу}<щ§ŒрОпОvє>с€с? Пт/}уЧЦуG=ѓƒyхЗїх‹@№1Т(ˆ&FјPQ4ЁЯ„# Іh$БJЃ*-^дhБбФŽ5–0’Ю”=˜ЄT™еJ‰8QбЄ)ШA ›~Ј(P$“NA&U4“І&EЅ$YЂ„")R Ž00џN&NЅ&` ŠUJЉЇ]'hђIхЇ"(0…`‚ST8Ё`D%Іvн вЕD‚9š`–ЫШˆУ‡љ 8'ˆ‘L=іy1Eх /ЂК8QтхЬU:1JДhІˆ ŒrЩВхj˜2iкФЉ“ЇO B‰<šTРвІOЃN­z5kат]ПbK6ЅYДjйq W.]ЛxѕђѕЋЉ‰,ƒ 6œ˜ЯтЦ%DžмЉВхŒ˜5WtџОŠцаЃKŸNНUы•ЏgЊI‚›rкЉЇŸŒ*@ЃRЪЎп bD*ЊЌТJЋуМzJЙБЪ:+­Екz+ЎЙъКЋЉьJщыЏР`OМё3џ‚1Ч chНі:Уь3љ:ЃЯ>бH3 5е\ъЯŘ”­РкФmСнdЪЉ'ЮBуИЪЌх:|DщDЌЎDьhвnEС!ьE„bœ=ѕ bЏ=Я@ŠГŽ| Шќ†фo%)Q‘9$X$ЇORХ -a+Mц˜ƒ *ц€R€@ёjNF€ˆLHaD ,3TФЉМJ€JDR:ф(LлCПЈH…СNйЮЈЛц8хЈтТ"ъЎAСˆc(я0$Т$8ЈpЈЪиу Гї$bяQ9Т xу‡B*ўќS PA 5TDe4GГ‚TRJ-ХД)M9ѕџTQI}ЪT)PU•U\…ѕYiЕW]ѓ‚дз+ƒ]JbEVYӘЅТй= •–Z‰*ЛVЃlSиЖЮnП wмrЯ]ЩШ?ѕДаC]ДбG#Дв/”пN? uд­J=•)ƒ[}5жY%u8Э\џкUт_Е"ъ:Œ‘M61Ž›}6к#І•Гк’AТЖmЙѕ\qЩ5з€"г`]МкХ9оыэ_ kк_Ѓ&XщT5YЕi…ŽКи‡ЋŽИWЌƒвzиbЛоX‚Ž?™ь‘­MћфЕSnЛeИaž[ц•ј˜w‚xу‰' 8aF bЈ”МjЪˆж5с ˆŸювфNHџтг(šФђФЃŠŸщ RAє‡Rb„IстЄиЙ&ѕ‹БыfъъТЏО\.NО–€>™ƒ FbF*л#Œtм Яі4вTЄSЈ_€ Œ шZMы;йбЮvИг„юxЧпOxФ“ђ”— цнЦyyžжІWНT\/{л›'МW№EЊ б3ŸqаG0ѕ1‚}‡y_ќцWПћх"ћЃSкў‡Жњє‡€„Ш@КЙ‚Џ3HьfWЛлф‚}и] zїЛКt0Х;^ђ–зМ­–т|шыуїzh˜@‘Dь„щƒФŽ03Žt"%Y$•,B&XдЗT` D ЬвФб^W‚fэa@@С)x3…HL‡( `/ЦaШы B>п„QXa>мЪXоKг\rх/гWМB*Nц1йд"Ls`ХEќˆfтS‘Ќ˜™iФ1SX…0ЩsрJ˜Љ gЮšвЄІ5Б)mzŒ›оgRФINsЂSьФц;#џЯбгžјд'?рЯ4Q! IAЇDKф(Д& C9бH”ЂњЛЈF?УŽ.бЃ )I`RJЂД™xІЂ9Эj‡3BMПЮqЪЏœчLч:лiœ†5•L!ъ=ѓЙЯ[%ѕŸM€@ ђдkFЁиЄхBлwејe5Ђѕ%ž4šQЭˆu"­ЯGC:RяЅS\f[пз—вuvХыMSОюєЏ>uч`уYижЈŠэgc™њXЇBjВ*в0ћ"lVЋ\§ьWEЛбв’ѕДfUmI[ЛК”ЇHRЁ! G,bVДМаPР ˆ+sсMЙb2хџР@0B`ƒr„#dх‹блдy NЙШ`˜J5щ0F:u9•љКЦš„G—усƒїTЄbF8кrд?џU"+гЬN1нР%E8ЉJШkои WНьM€{t1љвзОIС/є ўњР0-Q%,S!8 Юƒќ=€Jи/M€… *U=ІhУт!…‡A,b›8Р)VёGZмШЧx 3цD];ођžwщ]o{iфјЮїѕЅТ}‡‡фs*ЙПџ§Љ€ хЅL9С n№зМдSp™Т_6J˜3шS–й‡hšK|b7їЮС``,cлxџ­8оѓŽћмc@ПWШ„64ЂѓЛш%;к†2SЄЌ*[ۘжr„Лмх к)b5™еTjХЄyФЉns"‘ШbWїжtдЌ•9^#T‡‡Є˜&R! @ Св Ј "ЈЁТэ‘а)8TЅuGI‘Є€2рЌШєЉA8JL1…П№сvœ8LІхчЪ/]N• “ƒam2B ЩтФБ|ш= ˆ@*ˆе‡>ќЛLF;‘M*P|ЋРЬpМюЙДћнёžwНнЙ;Iщ›пў6’N№|І п У!х№R@\тš ИO.Ўх/чŠь_žƒЧu8%фHuф%џџ0ЪuЉr–Лц ™ЙŠУЪ‘Œр\ч<П1ќЫnф]оєЖїV№Эє~—їщИдЉŽp‡\НxŒyxФ'^ёАfь7;кAЎ!‘ЫЯэ'чpƒч7ї—Чќюx­оwšО чyМаk5xxщї^њОџяD;~р™(јe%ЏpЏT^ы\Я<и ƒёЮ—НуŒљ8„жО|выэЇ—{ЫWow<бМN6пЛFr.ггоO)QдŒo˜D`ˆиD"Ј@1+’?јФ > €-WвJb/ G4р`œ"Шh(U& рю‚<4fŸІ†у0№БЊ†к&9 ЌТ6kмчЬџgTр ’`ъю—(Ѓ(>^­"фŒЌњ FР$|ючъц§тЯœшЯў№Oџ"„њяџp P`Aа4ХњFEН!*W2Pу‚`OЅjw@(DHLUаQXа"\0c№=^мj№їРч€x№kцЏўю/џ€eџˆаџ0.P ‚ 7p G`­ћ,АМВ0 ИаpдЮ|РаьФsFа'Ь№SpїЇ Щm‰ьdхаq№яђPў~А…а б бШ†‡Яl $žаЅ0Б KЮkААѓД№M%нKџТp&ЦА ЯpеАQёпP5c[1нRBЌр ŠР2Ё$Ір˜l+j+(nA"Р97"Р\ј€j:mг6 `Ъ`p#ВˆррXоGшNNЉштЫЦnгКьг ъ -d(FE2њ@ь,1H! Ђ@ І  І‰о"Ю^№$uDДтC $`0D &mяУqЫq Ю1EІиqмх‘эНLO§‘МАi(r&в b}kЉВ!% "еЮН&ђšlф"3в}8в#AR$#€$Q O2ЫЯДXв%aR&UтХ‘ЭџџKГЉ'2“J(GряLє)џq)‹Bkž2­Ђ’‡І’DЊRrJВШv‡+-#сB#Ув>2$GrTЮRЮв2%щ"кђ%cRjM%шв&яR'Е‚'лё§r“Ђ“( sћё0ƒЌ)5a1R*В*нТ!Ч‡2=0а.Г"ЩF3{h#;в3Ч24K-г2Ѓш4Ћ 5п’5ув§с @AAЄLСB…^,„“HС@вRсSF€7T рЏ#гФт”gЎьN` AЅВBA Ђ0Ђ v Р˜чVzhŸ"ььЮю-шB–D}‚т№l"џњ`И,n7’уB %’`NЁ‹ %ёЎц!6aЄ2aZЫѓ<гs=MЁ=пSБm>ыѓ>3!?“b?ћ~xh@Ьe@ є@t+gBMє "tBQ BQрB;NC2UУCпIА&cDЃдDЃE3AEYдEaєеrF?ЃFo4GƒGYC%FсGбS=йг=>Gєь?ѕ“?EJtJ є­TA/3KB%4.О”<Тtг0t:6Д†:є+>єЗж”Du‰ п4EWZєE'р—bєёДќєGuдOuP5H ЕH‹уHщ“Q•”IРIџ#ѕ?ЅT@+е@STK9еKСTL3t†LѕLQ5M?tUл” OVч”VmеNO1W5jWљtGЧѓ%иT RЁќёх.C.2a>ATЈТx# оРўCWKsфЧ-еFув?Š@b ˜yиu$И+87/2xƒ# ƒ?8„G_Р„Џ#…WZј…!ќ‰.fxьjи(~žєh‡Ў‡3ˆћ‚xˆSЂˆ8‰З"˜%8PŒ §tf80В8O`% й‹#˜`՘ -ƒAƒMƒ=„E˜„пиTтX…Yи…}†ѓјБъЖoEMЧ‡ ˆ;Lˆ‰8Œ‰CЋ‘џ—8!љ‰'YŠ“ї’a “ЗИ“Л‚СX”)˜”Щи”QY•зИ•нŽQX–щ˜–cЈ0b˜Dіи-tљ=0(|y€й‡‘@‘‘йKs™Щ­‰9Š+йnXФcќёыg 8^/ю,AфmsNŽ7!LсF" bEQ `" о16С*8цGЄІРЄ“ЅkИ|:nь˜ъьjkМBc)ƒОbZR †хn–Cю(Дs;;Š™_№ЇЕЩтюjŠе…la z=5 šЁдЁC,Ђ'њKРЂ1ZЃ9кЃ§/{DšЄEСЄQzJЎˆЅ]К5FІџSv:NСІёТBrкDvк‹дЮЇ:c—ЈЗgš4K“Ќ”Z€˜zS$рЉ“з кžЌ:Ё:щœёЁНк(:Ќ“тЂ3zЃ;šA:­KњЄI!ЅaЎ7сЅa~fˆ!птЎ+Џ L‡№3wЇЇй#А…šw ›pћVћŸ{ЉЮЉИ5$;0ЊЁБњВяЋ!ZЂ9ЌХ:ДЫšДбzЄOЛ­UXлЕ3‡ЎeЛІkЛ)єЗ›BЗџКЗƒК0†š9 {†[]qUБ›Б“ћБF€EсЬiLд“$ЕR›PРžF\ŒoБxCо0aŠ Ѓчи  ^џ-`І€Мќ#Ѓ@ƒGс Z7Љ^wн‹уЦџЂ&в+h‚†fт(ž‚ˆR`Єуєx7 Ra%,Р№‡‘№{Е1>иєБ}Ї5G€РМР<СGeСч СIТЫГ€ТРТ1\УУ–У=ФE| ФсрФS<ФaФзмФQШЦy$%­TL7€ Ж0р N`пtc|ђa ВjРHњыЌрЬ>ьk0gн6­ІЗpЦ<ЭLє)*L 3х†њ &NСXЫ}ћVBС‘‚жѕ;JўWyLЁ5Ѓ l д ў@ &ЁrApсярŒо'Žт%^~Œ т/~2ўk6ОугIF–"џDHофs)хПiЖуьв.r|ЗЅ`цЊцэцЫKчя˜з}žˆƒ~шё;п],П‘^щ} :рор žыўыУўсyЃь)от1ў}и>gнўуу~юыQ>cђžхљўхџ~J?НІ№qёхЛчОё‰^ићGи'щ-Ÿi>04ѓ~ьСсЧ>є'ўьI_эMiQпусо.ф~фKоѕ яWўЎ[Ояa№oџІЋЂvнпї_шƒ?Б‡џш“ој›ž%€2љтLЉ>Є”šPP“ІTQiШш•S*jR$E‘ІSœ89<1Bёsb‚ Ї3'ˆЂЅ'`,ЕбшФ9 5ЙиTa Ms02"TNЪ8dрд„*UPЙ} —-лF)Нm{ЗЯ>#pцмdж­YRjеR#KM?bjшš4А`S) :„(‘ЂEŒ9zœrdЩ“)WЖ|sfЭ›9wіќД(QЃ *eŠ№iT†ЇЈ*МЊ(+LЎ^СŠBж,ZЕlс:G%З ]ЛnёVзЫзoР #ќ™ёфЩG6ˆђТ†}fЎ(рbЦ?†&iЅJ–.aЪЄi“_ЎёсP(џ5лQI-\nэ6UUР ЗUW_…5–YgЅЕ–uЯA'зtwХ…]_9mW–wр‰W^yчMV{˜MŸ|еšHј‘ЖпiўЉ`k<лВЅрm :ѕ ’ў†BZwсqЩ•Е\‡оb]#цЕ—‰Ѕј]x0ДштЅH!Ez%ЬїлU[iпœlЮyбRR”0R™l‚ 'œ0PSАШSˆ%Fpb PЕuелЅ Ш‡žš‰„iQIuuU”GєЁHœ€•г# Ђ! ™”Т–q…иHsЯU1Сœ№БjЄ†Ъ`:˜`‚,Ъ&Ж†-ЖдqаšmџєІFqGgEvюYƒ{іљg ƒzhЂ‹6њЈN’Rњ“ЅH%щЛœ6ЕІ" Т+ЊHC)дрЉЉлъЋБЮZЋ­есЊЋsМњ ,X‹ІXl™,Ђ)Їгю ЇUr*TЇBwvЋ'Ÿ(ј Ј „Šh Š2ъ(ЄыVЪˆІёv5/Bѕо Rmњ–к/ЊЊВ…ЋАš%+­м]Ф+žIqХвК™qg+РЖxz+2Щтž\ЎЪчЖЌюЄ0Ым•МuzѓЛ9КЏЉ>ДРD|4ˆI'Wг KІšєqDеg”РйлБЙžsТwЦ,–k„WЕ Ч''#џ˜2ЪЂ‹С"ЄМЄ ŸŸ`JЄфљT`D Э”™j65ЦIItйPDMЄЩyA0iNЄ$Х l˜ѕƒR, "вtrD')@џV ЅќN)'k–сˆ'ІFљхзQу9ўvфUM^б иВцšSЕUчŸ‡>zщЇ+Є:SА.R5ЈС$`›йб.:XРn‡мimw2ђ]f‚G) ЏxQ8^ђ–W–ц=oWx ѕЌ‡=Зh{aљ^дЪ"ОФUM}z‚ф!9ŽUЄr—ГЪ§8чЋ§‰юЄ3ъ8@ Мv@Q ЈjJi‚Пыж.(<тIРxШSѓœ=џ]™АzзГе %в=z'†ŠЃ!ћn˜CЎёpі‹ў`Dа БˆџKнъZЇФё А‰ МTlW мщЎŠБ №ВШAz1„`$ЁєNXЦ-‘ i$“4qRь6c)9ЇЕ PЮrtд#Ђ p"1a“+Ѓ`€" Т ŸxУ(І Mm$@‚Œ@ јD(ЉQ`bІDFP №вй$" Qъ%XгVŠc<РAe С"pРљ :г‹р”жU!G(ёЂShШ;јd(ЩgОђ­”3ЅFђ—JјдaшгШ+c9ЫZRц•Ймe/L…œџ‚˜Ц4Т$>ЊЬР‹ ЮмT hiІЇšЃТІЈМВЭnr œ'9`NtЊS.ьь„;с Иагž[Ь'јњ JQЂ‰ ы3(*ЕЖЪ>T–Д|гDqЉK^њ˜Тмh1™Lи1“Є]1i4qGЭ|]ѓ!/eDLНЙЏ„Sу,ч9гЙ4žJЧЇyЇ^…ZЯ{beёЇR[ФTƒ.хЉЊм!+ KЊJє–е*FЛЪQАŽ'Єc-)4УЃв‚АT$.uІ[QРMИвRuХщ]wкœНўєЏwЊ`ѕ™"D0B G˜€т`ТІѕ­qљУaUЂ: Ъp"Ÿ†bp!w >dТџ›&FqcЮa+ŒA&FШ3ˆЅFЩpЯк”\Ъ6˜ŠžЦ‰—L€ ЉBHБХHAс !Є 4ЮГЗщCЎКL€&YФ(4єBш–З(@S‡ч 7rЦ%юq+‚>є)—ЙpЎU3нщVїКй5Тv]щ]№~tу}щh[ ЄTЅъE {сх^јЪ—О А/~еЕпўў7Р c =™dрЪSС 6…ƒїYЌ їіЗ'懋‹'фŽиЭеА"RL]ыbWЛмqxk\RѓО НщБѕuŠ ;,Оš˜ЏSŠ|пќJ ЩўА:§іф8zwЁџrƒ >-ћЖjfnœ‡=ЌCЬqЬeю2šWМfЗљЛo&Љх,:OРЮ?Ю3C„мg"Yа„^ђЁх’h)DСNС‚НЯMЈЅ9š ЧJХ‘'&гZL„M,Є№Шц†CО0jd.—FP№ЙE$(”*ooцРVr'>ˆ"’ЂЏн}D‹­1‚s§ьЪ-Ж† XФ&€0‡Nа–KЇŠ`&6=ыѕс#˜B aaЯЗиЈУжPХ@Ю Хxˆ?nqfkKcЯŽіДЋmЧ)e{лю6ЂОюqŸжмHIwHи\wУЛmD™7%uo‚фћD‡ъїПџ>№ƒ!Op'Юp‡CX0'vƒŽ‘d+{q%hvJ.mj[л7[YyЫQvM€лЪ2/7Оjš›gЄнNйЙЮђ<zыФоБЮн=їmt€ <ЖM^њšошЇЇ`с 8–PuŠc]ZWЖШЛFr{š\ь)ЧЖЖСmДУœэфFЭбїuЯ=чuŸрн}Ўo ї}ш€їЗр“"У#О: _|д˜EЬС)WiгБ1RyХe>УуCЙ‚…Eс‹0_NP^q>)ј@9Qf&ˆјТЬЋфљBРкЎЗкT •бЭ2 ђ№Ыїw–"К9I'6џ^šP0AO&„8еCX>Ѕ^&Ѕ ž“KS1ТG|šа&‹1 P>3?Рb№ruА|б|Я}гW}з—}лнр'~jхw~l/ъч`б~ŒSCj"њBАc${њЧАєФ€O~ГWи ш7 јL[РїBh/8iхё8ЩW5%('ˆ(а'}дg}и'K.Ј^Œр}2\4hƒшW!Б;Иœр~?"!„A„„Ю…„|аK(M8" …Ё4…еQ…Ћv…ШrZ(\X|_Hah9[wdh†V‘‚jШ‚mШ}pџƒс7‡фg~v˜ƒyШ~|шƒo„€XV‚шEXˆ дћ‡ˆJ€†у„h€H…ra…˜…ћs@MкЧ–HbH1KС|F‹ ЮЅ:вЗвf p™QТФЁђu8F0* ˆ` DТ]ARCшќтnђ7–!ˆœp<Ўт*цШ %а[Cw:іТIЇ p+~г™uOxб$4јхœ Уђx№ŒбH1ё“  5 Q Ж YP@“ b ‚зPАли~ŽтHŽцHUU!7!A\эјŽё8АcRЁ”U%ьH*ў;™џщ]ўg~ЗE  й‰+tA‘бс™‘[4љ^љx#Љ*%YдX жˆ&иh‚кШо8=Щm?yŽBЉŽEщŽ№(єИ”јш” •§ШSIY‰ й•Јѕ•\‘9–<… fЉ‘iYbk ’„х–в—-Т’tй"vY†xЙ“пXси—хј— 1”ыЈ2ƒ‰”†ЩLщљј”ќ˜9щTi•‘yїФ•^щ˜–‘dй™љ™jщ‘ЃйSА)ŒPmZCЌ”HPЁ 8”Г\;]@0‹АЃ*QL™ K1Ф“‰РДd/|pџ‡l№Q0^$U”mуъC- rMLє‹YLхШ}FСАјNЖвёЁёєkІPЃPk),'eЁЎдA€’АрБАсЉ к˜4“!шqшƒq№ёч™žЮЕžэљžёIfхXŸј‚ŸњЩŸAрŸ* JRʘјБ >Ж~EЁ:ŸšЊЁNСЁдё!Z‘Б5Ђ%zЂз—Ђи)-Ъџпi96:žфiž@€žъЩьщž№)ŸJjmїYNЪ8PњŸ: ЪŸќˆЅ К' кЅђЅо5Ё™ ІъeЊМ…І6! mjџЂ(КˆrZ,tњЂx: z фy}њЇDЈFJЈIJŸ‡šg‰КŸ‹ЅŽJЅНy ›”*HqЉк`JЁJКЁЂъЁбБІ"ZenЊЊ*Ѓр\Fа Ћ‰dO#АДJ9T›€‹/Qd‹h {€зz)‘’pzг&TСE№lp(0вВEыsъ‘‹AFP•@@ŽpˆВ;еƒЛ[ŽЈ€аЁ ‰p ‡ *€ 'АБ{ЙЂЎ7:ЎŒ  ИrP5нЕЙ ЃРЃgД? bьъЎ№*Џ$ё9іŠџЏI ^ћкЏџj(K kАћ ЫАеєАИ!БLy {Б;Г#аБВ";_VВPxВUВ+лВ/Г3ЛwГтjф:рДшЊЎ;ФДяЏ ЕѕzЏЃЏUЫЏў zYыЂ\{А ЛАЖ$Жѕв ekg[лjЫБ›3 З$›WБE–zuЗ,ыВ0+ГЎвЗрѓЗ9[Ў…›Ў|ŠИэЊИOKЏR ЙTЛЏ%AɎŘыЕœДЙ”бЙ›ФК)CК‹БkлЖ›ЊЫWЌлd&ЛNvЋВВЋЗЕKГ%m‰`ЄЋum"pИšv Q0"А џK˜њ‘':"p` `}эЙ 'А EА#(*# L_y˜ZWcK"бF€X F4ьЉБѓ™–ЈеLŠpаyBЃT[bЊвq ™А˜ ŸЂ№E …„CаЖ юK z А ЖP ђ "№А`@!шЃb “P№Бї›ПћлПњП<Р|Р ьo ьР| LСŒС>ЁС[‘gЬ&A м"LТ&мSТхИТ AR. УЈ0зњКpУ9МУ=ќУA<ФkdФHПЋ6Пѕ{^ЌПќЫ.$1ЦDTЦŒР‚КџР ќР<С|СœЌмMœЧЈї#Ќ=~ŒТф(ШЄРТ…ќТuУ‰LУЪNЌУ<ьУ@,Ф5ЫОGќО—ЌyєыЛі‹ПЦ l,ЪLЪh|ЪkЌЪoмЪrќЪuЫwќСДЬЧЗ|Т€ЌЫпХЫ„мНП<=ˆŠЌWŒŒУЧ ЩЪ<Щ6Л№й• АJ_аі*Џ[G9h’БфБ?№ VА‹0 zƒВ GК'аmœP`?€E`LS’9\сЩ'з”3ne ;jРZLQРxX№tй{ЛЇШq!№‘+сpqD аMаИ@џХZ\   Џbё4 ДГf№z№аl И ]ббэЙэб ­Ъ$mв(§IУБвЈС’ёЧЌ1Н*4­ 6­ЫЊг<эгS‘Š'дУ,OE}дІдKMФыдхhаNа бЪжа-2ж™}hmб­бmЭРoв,з'вvэxэв{]2эз€г8БгrRи@и)”І€SŒMРŽ]Ђa’=а”=И–CеVэйUГйхбйMбЁНж]к№љбЇ=в%­кuНwнвц л05г5н7гƒл?}иж“иННиFм й#ЃЙдџЭмЙ*PЭM1ЯM L}' бP oЃŽЅ o№њЋQрt%IаУЉrb/Н Ѓ^"ТГд]Œb}8MŸ P O7…u!)`=9У}“ШвATАKгEмќїпЄ’№,OŒЩЄапџ]Б€qP9’X 9 9 /€Й@рmН]ОЎр юрЇМ>ссh N[nруёх Ор ўрmцžцЮц.џ юсУЙ/œё> `ч_ч(^л+оч/ž+€N‘5nуhшї„шŠqŒŽпŽžмГ Пўп НChbщЎщbощe.с ЎцNъІчЈ>чЋоъ“тyžт›Ъч.>1шИžыИы[дыИѕыe! Щ АjіD І`0Ћšь-P€ ?€ в|Ѓ ŽP=*P?ая" ?А agсˆИp!`ЄР&kЂ5†”Ѕ1Вšp_“R_ё‘жЇЫ›Tрг2ют %д7ЏЋ0Фfm KЗћыуюІя4йЃѓЮіŽяa k ААPžџ’№б zА­€3Р §ўяџМ№o№€№ Я№Pр№/ёџ+б‡ёЯёЁA™c!пгG@ђЄ`ђђЅМђpађ/ят>ѓ’x46O"yЌѓ‰Рѓ!)a@Ÿ}ђДѕ~яљЎ8”~X№яѕŸ№ п№ё?mЏіПёџі O\s_їwПƒ)Нйлїжѓї2у‚OшИW8O#ƒј‹юѓяојУNєяШЎihbљO™і›?іeџљhoёk_њnџёqŸњ#_ђїтЊїХФђ./ћ1Џ™‹6шHѓ„…ŸѓМŸјъkГЄpGъГzNq ‹‚ 0џ ЦO1"o`&фЉT бУв0A‰0 ‘•$*Fm:1) €@E”RЄ(вЄ)A šJ$ •IЃ9Ї$DсcФ&#FЄ€РВг@O ЇJѕщsЄЯЄGR4j”ЂJTOЁЂЂZеЊTЌVЋVIQ*RІŒ%;–jйQЄцЈTЉHЪШR&(’i“…Q фФњ3I™\ИrрPxЦЎV/pЬ@#Ъ` ™1C Aƒ2tQ"E‹5rєR$I“(UВt S&M›FpъфщЈPЂF‘NPЪд)TЉZ…c >МызАeЩž›vm‰ЖoХ[їюЈџ3йЕo?SXїьŽпР Џ§rСƒ 6|qbХ‹7vќrdЩ“)WЖ|sfЭ›rкЉ'8~"ЈЁŠ:*ЉЅšz*Њ…ЛŠИЉДтЪ+АФRцpŽ­м‚K.К$А /№Иѓ.EёШƒСМагlНЮм-Обш3эОдєc­Пз”MРк М-AнєэСт$ЄŠТ Џ:.У 9$ M*EК9жвЄКјbQTHqЛС‹р„=\дD$ :сНMŠРфGF)b“EрШ$ LљQ9E.)J".5 bTЁˆ) јR8с>$'IЁЂЄџSN BЎRZ*X™ЬъЩ(юж#Є ‚RЉ’CT”УRK.Нѓ1ЩT]&™Є=арЅ•є№юРv™с…\жм‹&šhe3р”“Юˆ И“Ђ<їьѓЯ@-єаDЩQHзšДвK3нДгOCˆROе$еU'pѕеXom2B'Ÿ„Т\wэЕЪVсbK:6й2Яд.MюМu3;sчЌS]<ѕфгO@%дPDeпHїЕSM7сдSPE%Е'SQU•UWћ€ѕ7ЎUТ[)ж•W_7Ьxу-GŠєЫ0Ч Yфю KбфђPŽSхtз=Ён—с•yоšэmєбџœ)нй_Ÿzр‚NxaЅnbˆ#ŽњЉŠЉЦ˜, KaMц Т*‚p+#FиФ‘Рћ;№ XЄЭВЯ8ŠFE„7ЌpD+RпЃ!RСцE-p”CBNгЄШ‰b( (b‘)buD61Х€LЂА~„L:#F4‚# FJ*)ЎЂ:i$Ћрˆ{2зкŸю­Ч^ Qљ5cМ”Ш'ЏќђЬm.qаƒ.t‹\PЦ дђЮrЁ=ьтzн4@"@pЇKнъZїКиbvЋГюtgољxТ#IŠwМф-ЏyЯAєІWНыeџлыоNР'>•HЁ|чKŸЌŠSіЙ/.oйM)цW?Œ‹qŽгRџ(g9)`NsœѓЩЖSС“™uЊcы`';к•^'Lся‚7<ЮСxШSѓœ=щQЯzQРžіИчНŠ|G0њŒ!$6J‰№kтG`?ЋIq,њЋЂфЎР-vl^дKЧA2~№Œ"Lуэж‡нѕЮ,$žaXЧтё†{ьуџшУ№ Rˆ„$Ђ7•DЖ/DKŒŸ@ПG.n,SРв}ц€>ЪfUГ ІчF&6эьBЁŠ№Sœ€uˆ˜1…Е‰ *H‚#nЗ‡ " џйУ"ІЗ9„ЄšїСЬЮž˜‚)LСМQЄтŸP& €>№сTЇHAOpŒ€Œ8…—фBШѕ2*M;пA…™Œ Ђ а)Ј№Я™сWРR3љI’gF“ЋВE,tЁ‡ЄЛа.vА RЫZ…СEQqЁMnŽТ›рчШiNtnBьtЇу9OŸ*а'?§ PNЏ =ABка‡J Ђ­(:1ЊQŽz”7iњHŠФ“ІtЅiщKC™FБ,6u&4G M)PsжЬŽЁКЛЉЊЊW=g:зйЮw~•žbuD>GБЯ~т­шџZЊP†:Ђ=X]/šбvД$х+SDъА’–ƒ•@aaŠићIŒХЉc!+YЪ~n;—эц75;ЮrvVЋŸэ*<!ЯбоГДd=­YUPжЊе Џ}ЋlхJ[ŠZєЎЙе+H}ыWЉЅУeщ\zмФZ­,#ищ “"D`œ8t)ыХ"ˆ`=йD* АˆLŒj …рpаž,bIА€ оZ‡ЄnyEœDётEh‚™0@о№ƒ"˜Ђ68шІА‰< l(N$€%vЭн9Дг *Ђр+•›вKЎTЁ}PФW€Р<@-ТУƒŠ‚\…џ6Š™вT9‚Ќ`kтБ.‚š4<‚ЙhE`rрЇъ!ТB…/œa8lX"ё—G\т{5Х~ ”)ZќbۘЦ6ЦБŽ{Туsў8ШC.ђ‘“Мф‹6й"/бЯHІ\eѓ-+Nйr—5цмљШfж№LёЧf7K С np5ŒЭь šТЦА†9ЬhB‹˜Ф&F1"T\щKc:Ц3ЎёsМу‹ZШD62’•L &чnеPŽ‹”Љœ+ЫZ*ДцВ—q-f™•Y`‰іЕrь ЮХžьБA—l /ћаЮ^є‡Ѓ§hjKкк”fБ‹3ЭmNћгсђИKmnџT7OнOnЕЛa}хYkЙоЗ^[ЎѓЭk~пoЭ е рˆEŒpА5Нјн!–Ц(eDЄ"с_І^@['‚ЄЂˆ€‚ъоц=МA–`иЮTМ!*†У|bŠ)4yI‹(Fa €_n^кs-S• $C9BпуMФЊ4ЂЉеЩAџ$ђцеЦHГYќ=bзќц9пy,&с=№"Зр›КƒV0А0ЬС€.tЂ{јшI_ʘiœu+@]ъTЗКБЎuЎ{ьb'Лй „vЕГQo;Nш~Ю&я*й{QќkРSE№„/”ѓ(’ЛФїџdёЧпПiЮ›у\ч<7ЖЯ‘}†г}E_НвЃнtиЫ~ъUХеs—ѕ­w§ы'ћи§TіГГЛб>Зƒ;Й;>TОМkОО#$шƒ˜щуžТГ>Ф эcМ4ыОШПЩПžыЂѓKПд3:‚aНї{НЇ‹КљЋН=ИНќг=ўуНџѓ=РЕk;т;@;JРхг;…q>DЙ ‰@1МыГ#ХУ@_л)ˆ‚ŠК QРЃ#>2…L‘‘ЌЊГˆ(XМMш ь1…MиƒЕГЋ H‚*‚xƒS8<<Љ… шКш“  ‡k2цБ6DhСrЪMџ”Дkх›сQ˜шЛ (y“ŠZ ”ђ=Л‹АTˆkkМхxМerТ‰Т)ЌB3@4X ЪX0ЊH яРиТИѓB0К1,У34…5lУ7„C˜i++ C;ФC=<RшУ&;@DB„CDD;ZФFlо8‚HД/тЈФKм‰LЌN<OьОхE(”Т•ЊТ+,Є&[ьТјB3дE2ќТ^мƒ_ F7ь 8Єˆ9ЌУБИCШУѕcFgФОhФM(ФА8DфSD `ФН{Dn”D,S9EАDQЧмбФrєD5Ћ)uДRlЧАТђ;“xœ…yџФХ{У|4C‚ёE546ќGb,ЦLЦƒ\F><(?„Ц@tHˆCkЄH‹tФmьЦоњF.ѓHL IrќN<Ч*С„Є…C…$ј<Ф=xGЩ:"Ш„A1kУ0љC˜Ыˆ‚РМф&8˜‚чС€:рJеiˆ8Ц … ›‚аЛkžцљшHУM0E€‚z@ h&“ ‚SШ’N@ ЂˆЕЅIn”92RР8h+s$Iх@ЧБрЪT№JАЫCУ8‚W * ŸjХ]№]pРЕdЫDpЫ€KKКДK=ЩЫйЫОќЫLDџЬQ(ЬŽPФ<ЇХ‚ЦД#Ш”LЪДLЬDОмйL~ъЬЯœ€аŒФ)kŠв<Эд\ЭLhЭю„ЭиE Mл ЫБCГDДЄІфlЫЗt‰чмƒЙЬ(щФKLаKОЌ?ьдNюєЮУLЬё,ЯЧŒЬЩќЪ БѕдLЮLЯMбЌЯв4M‘ШOжtMџ, йаЏ$ам,Ы–ФТ…]ЮKЮЛЄNЛPПLСТ4L№єPЦФ>ѓбє4бЬl2ї”јdQњ$ЭЅСOFPЭэЯ5‹3ML8аkњЩњ1828АБ=ј‰0{L›DжЊ>žШ„)ИДиџ)€{Ї+Џ KH…"h#–Л?@шQј L1'Jk2S€”ј''| Eи љ„nT˜H4&PЁТЈБ3§ЯY5ƒWx€Р^ХXЈ]ШС Ю,Ј38•S:ЕSM<нг>§гƒ дA“B=TRRTFэ:xдHАŠКЗбЙдLндNБхUQеRMSEUО‚QVэWх>’еZ-IџTS6­Ќ=ж(˜г7Јг2[жf%ЈgАhКi…j§DХжFнVH•дo­дpХTMхT3W? еQхƒRe„Sнw]езљЁзXUТY•Э4џгз…Ч~­Ld XeХгžаSƒѕS„Е@A%д0T‡НжEXnЅXJ Г‹WѕдsЭUWeW‘uWUе’VMYXЕзZа™*ейWщ’О<€=ŠX„>Л(дMXs*ЛLКLX„TВ2qЭpвsGPКŠ@;3?섇ј@`ƒOГбYП‚šKR`”ЂБщбЈ,й Xщ„\i”‘рžPI„0ЛMИзOЌUА…py&@ƒЂ‚Xh`§3І"[ГдД]лiлЗЕЙЅлr2лŸ`KНх[иq„ПeТt„СТЕˆXѕУEP\+`\Чџ…\x*\ЪЕ\ Р\мк\ЄшмЯm7б•в5]дХWи\]Б]м=лнe[З§р§1сЕлтЭлН Фф]оРu^Т-(щEм&Г^ь}м ’мщy(я_ЭEUђ} ѓ…Љє-ДѕuйЏ л˜=Ыяˆ_нeLЕЅпп[ќ•АсН[уэпОUо…\kм6мщMмХm\Ž\юuрЫхБ№•`x+паЕрвХ`дѕк 91Б„ƒї›aЬBL„НŒ€ ђ„jDп …‚Ш„ИcЭL1€M0Ш@ф“˜:29uу‰™KBБ;‚Ъ@€Р6сYSШž—р„х\I­HŽџ9YШщ9н§4€Р„ѕuМ3Uт:…Ш…ИРV=Ш˜]Д'&Я(žт*Ў‰+ЮтDит.ўт§ у1жПLU^4N5Ucу}у\ГЛ9Ўу;ЮуєтcF№уpКО™ƒAŽФBю NфEnd NbLXт&ўŽOі1j”т) b+ž,ЮˆS~.іb>ZхЙleЏ{х3DY^cŸpcђМe9Іc;Цу=аc_f@ž0AоBцCNцYц Fbg†цFPi–jF_QЮцmжboNхpоЫq&csŽe5ЎлuŽгv3\†ч]žч^Цˆ_ўcaЮg)ичШAfDўgFџЮ`џ„оЖ2€h>ƒИЫу1љВMШ„š№b1 ‚ЩЊ #…DаS ЈžиАмУT ј4kc QЗ‚кЫЖњ„ƒLQp„хЙˆ_fЙ"XžŸH‰Т‰SВS@#р#‹•м„–ndGЎQ˜ю0p‚ :Хњ<\иdOŽ›ж1RШщъхi#№iхг ‹”‹(j/Fъ1љ„Ѕ…І~j{BЅэ ЊF\г1tкА­юъЏЎ\NkВ6ВГf„Д>0ЖvkИУЙffVŽЛ–щ‚nSšьX%lУощžf: nьЁ†ьЃ.ЇЩЎьЫvШЬ–jЮ~bЯОъажърjЏџъАІЛБ3е~)жfЕ~эЗ^MйІыК†Элžщšюmœ1рNlсflЁ~lЃ–lЅЦCЫvjцŽъЭцьŒˆnаЮъбОnА>mэNmГіюж^ыЖяИžm—†M(PЬчЙІ›F%Ё‹яи BЗ [L/ЎЮ—bž@шКх R j•šI(hм8K8„ЏLˆ`ˆ0C;ИcKСДћьЙL;L`дБА€‡„л›Ќ^а№0žP)ЖКвђ0D3ѓЖбкVŽ  з ŽЮ№@х№Т№p^I;3ќ^Ÿ FF0ёiNё‹`qB УgƒŸёŸL‡к‚Тл/›м8rВџ0r.ДKФ=ФŠ`r3дS/Ю0)Ÿђ*O]џЬђ-Пp/п№/Л1q3'ё4зp/'ws‡qЇё2БѓzФѓЏ#№ё>o`!'rt$/є%зp'_єFwєGgпЦ“єQА№.їS ЏžKџp2ё3/qOŸRPosв}ѓЁ‹ѓ97uПs{Ъsou>ђ?—uZЗž$7єNmrE‡ђFWП^З’ŒИ0›р1Ÿ=^0щ”жЬ(Œа№И;N В§W+ЗЖЖKBAЅ=0Hx‚2љ„$`(;?=зЋю‰'чБщй Ж аж'ш0T"Ъ1ы#$`ЁN;џ3<XwH‡MwЗx7yџ2zЗwяШwNиїшїкˆ€xhкK‹8Вƒ7В€ƒ…љ‡x˜ј7Јxuѓ4М%ƒњ ‡Ї‹gr’п“9”o9•wИsy_ŸЉ˜‚™ЏљEИy3МwчyŸя  јјњ‚7zN@јЄ_zЎoz‰ЇјАxЊЯјЋчxцёxљ>,љУ›z#ћЬfyДoцВXћЖпc›ЏїИЯyаїЛЊћЧ{ŒаћЂьОGz…gx‡WˆќЈ/ќЉЏ ФпјЌg|ЎwќЏ{ЩOљЪwž–wљ+L1;'l >ЈžO›Їzяр˜ъTџЂ‰юйЕJ€_ЖмрЂ.ъЖц„х7ЈxfЮ)‹„ЇgмˆW^Ќ,ќКыsі<Ї$E'LА„Вј„ѕczњАЛ1€јёу €‚Aap!У†D… ЂУ"SF‰’(“F|2EФ@„{. HЩЩcG pрDсУHBЂ(d&`Д’JNЄ5Т‰гGSІ"`њс(ФТ€TЈј(Щ'G~ ŠPфФЂ)^Їt]$vŠ8^O`ВД№гЈ'іŒ‘ jЊ7olˆP!ХО~Hќ[а"F=‚Iв$J•,gОŒ9ГцMF9wіќthбЃI—6}ujеЋYЗvџ§vlйГiзЖ}wЎŠКwdИW0я†ЮИБуЧ#Kž‘RРJ>-#ЫЄiЇNF<}M$”h&ЃH•25шЊTЊVБjхњ,XжfЇ Uk­[ИrщкХ›{сюоў Ж‰,b#"CI0F'ŒRФ"ЫСбб)sЬсSG œТˆ‡Ї$ ‰&Ah’‰ЇPA *6@сˆVD• 2Юј‰(O„ Ъ'Еa2ЪE ЖШ ›l‚Z{‹ьaECЂ82—(lєFЅC=Ј№EП8`&И ' >с„)UШШ…&hY‡†8b‰'ІИ" -ОуŒ5B…џЃ:ђш#BЩ•‘H*)“N2Ѕ”V )CXjљ—~ H *Ш ƒ@@(!…bЈЁ›Њ'‰&j‚ЂŠ,b”'Ž|о8уŸ;іјc*AYф‘IЊЇh“OFЉТ”U>DiЅОMдЅІ`v:цЇЁž)@škšЪ!Њ ŠИ*Џо+ŒГўиЇ­€ц:hЏ†ўšЈXУ6ZьБМIКВЫ.дь_Še ‹ E…‰ˆ$V&Ы-’б)š” ЩŠи-‰н–˜Р#т)GAЪO"’7L№&?|ђD‡X№д" 2ŠIŠ9X›ŒHAlPyШSѕўЧ ЉО–ъ џœЂўV№Р/rpJ GБpУ_qЫ™€ХkЬБЧ‹$2Щ4qrЪ+ЗЌТЫ1ЯЌЈЁ^-‚ГЮ№ €Я*эŸаD}4C—њХя—џ:MЖС+ЬАУkЭѕЊ_ovMcƒlЖshЋ­2Ы.У,ѓ4Я}sЮ;їќѓб-јрIОДHMs"АтQ3^ЕуXGŒБж_\9‡b\ЖMg›ŒВчmП-:щ6з}:оЉѓНња­Л‘mС1Т‹"<h \JІdФ‰ф[я№Ad ?ћ RAџ)Їl-"†—аpЦœРaKБФDaкќ`2+Т& E3&§@>xџТ€жЗьUŠp‚сžїќОёЌ|ЫA_д9јЩ C(бћрgПдлŸˆњ7ЂSP€!  Ј@­4№яŠ A(X=†\ƒўб _8ј= ||ц M(1’H…ёkсУ`h?ъ/k ѓ8Р0 \`…И"ФˆTЂр˜и'zт“тгЗ>,Кo…ђsЁНFїёŒ9U(P*дˆfs›GMъRѓѕ—ŒрJЙJ† $‚FАЮјVџXFЌ~&ккжМ? ™шaЎВзњЧ>ХОя2€QQё&ŠЦlˆBв&ФRD8Тl№‘21с@<С>њSEUP„(дѕ/vt^ѕzžО‚ А‚%Ќ K Фњ“–Œmld!ыТЩњВ†%И,-3Ћ“ЭBЁГЋ­F‹$гЂVЕЌ…‚ka+лOаVoЖХmnЗдTоцuЏ…_I!мСІЈИяџ9Ž0"mh ZбŒ†ƒЃ! I3„в@Xr“Ÿ|8DYгsАђJ<эп-‹к–_Іe˜OMц§­•­n3ЌхLg“иЙжzцГŸ-ш^ња‰РЂ5бшGCzџЗЩNђВ-эlhg:#Tž6ЇЋeP™Cк0 MmЫo_,мi^3ЙсlюYпЙЖfwЎw=шx{оѕОЗБ‘mM˜"€ŒD$ ‰2s ZЮ§`ьОъ&мD 7sУkўт”Ц2туCпр$!<А€#ђƒ‰eЂ; D™(ј 8ЫЌ@ињŒЭ}';х+oљЫб)s*аќB\ЛyW!Ћsˆй2ЬњљcƒžE*}FGКв™юtЈIъ†ж‘еБ­sныК5љЩХЎrВЩьe›yJjОv†‡кБ;{ ХG9Xbьюyп{в тїЛ<9E<е ЄУo=ёŠџя иЏђЧ'Єь1Ÿ<к+Џіоa>чAиМзфюљрžБУ{б^њ‚œўЉњд яУ#о]Ÿ§–ў2 „ф%E8XИђ"8d$Ы‘ЎуШЊp/ћвП%КŸз4?RЏАaŒШФSQ€B#BX@@ЄбUˆРœ%їбQэФї…Œп”п"œ_њEСњQћ пћеR-жќ‡ьœћiQ iТўѕпџB`р$ , fКˆ’_Э\ њЅћ5ŒћZЩ‡Œ §г—х_ ђпј `m  ђ… жу„Š_š_Y` џкаv`Ц_"a§•`ž уЈ В  Ra Ю` jсбpс „ЩˆWиDHX ЄœFhрёве8—cхOJq[sQЈ1(‚.qТ"ќ@P*‘МAв…Р<…Ёх!с №!9Ч.B С b"bџ$"лu ђ9" Ab№HтжPЂ%bЂ&њY'С'†@(Žb)fс)т ЎЂ‚Ъ+‚_,ОШ,ж"?йУхb#>ж#>V$ж0VЂН у&#2*Ѓ Ђ):ЃrЁ*іa+N#,ЪbMаbJз-r##ІУёD8њт8A0šc&Ђc„#(Š"џ;2у;ъЁ`,‚),Т№)DA@›E6GDA&',‡ х?) йме­O.UЂ.1‚ИйЮ<XAМ Y@X2A$<іЦDVфEfфF:Чx$HŠdJЄ>™$JЎJjбeEŽK–cLЮ$одфMZNж$OњфOfP<€PZ$FjфeR†фHЁSV"TіŽTОKVЅ>Нd ЪЄ|АСVтdе}eOBXŽ%o˜%QІ%G"%ј)Ѕ[F /ХeћЄdш­$UJŒUТф^вЄMўЅN‚х`цФ#РС№!  hФ`A Ќ„^ ?Е_ХIџУ4Œ.‘йreџH-–Р)ШфCŒ ˆ‚=СЈ@Ь„Іh’%ІiFjђjj#ДцkЦІ>Юц>-Ё`nR eвк•РojЃpBDqЇ$чrŽBsіF*FчiІцjbЇkzФv €ўьRmКЯm:ŽnІoъb Ё'/Љ'q>…q"Їr2Ї|fYжчtочufч~2‚lўч[hxЦдn2Vo"(p.ЈCАчƒТЇ„f’aj_љР&' &   ІЪrxH§DЅџЌ^*‚ р\њЮcŽ‘ќhН$ ТЄТ2Х'‹воs–х‹ZфPЬhТ ŽZўЬ%ŠбџK)€оe.щ‘&iЄ,i“>ЉдIЉ‡Й(Y\ЉŒЂІ–оhJфЈ—і˜>f%ŽЉ‡–iLѕ‘J’*)“:)”О)DЄb•ЪiŒfЉ‡и(ˆpЉŽ~)Ц„ЉŸщ\6Ђ™*š*›*ъЂ:Фsš‚FИH"H€P# '  АjXйШ(Ht•aŸЁ‘†(nтцІъ“‘–Р№С&ЊF5jAœ*СРЊВЊЋТЊЋЮj­Ž ръЏКфЎъ’nњjћyшђБыБ6 •.kЊЎjЋОjЌN+ЇйЊЕNLЎfЋˆ№*Зnр~ЋАŠ+Й–ЋœkГІ+ДВ+OPы­Ц+ЖтЅЖіъџН+ИkБђЋ™+FŒDFќ)ФтиjЎR&ИШxؘЩIeqъ\rЋ-ўh)LLFСіEЌФRЉВRЌtL`eьЦЂ@Ч~lШЊЪXjTžЌIJЪВЌЫОЌы$+˜ТЬZЌЭV$Юъlї№,Хlя­t -бІ`Ы-*Цьв*FгbьгJЧО“ЧJ­eєlеўNя­Ÿj-#pmз"э˜fY ШxЪe‚Њђ…ИHШ€пШ Ћ(ŸI–H§Єдž–@)”ТЖ  'но`ЬФнBСŒРоšBпормрvФ№бSў Ў-n"9.фž‚фRnхj ццэц.Yџчњ-ш юёnщ’Шщ*n™ЉюуiыNюы>ЃхЪЎцrЎчў-šЎG.щ†о.щъЏt­ю№КЎёFЄнšДaЌ)pХїжЊšTШТG€ЯPXFлъ ˆФ`хЈУEœјАїТnЅьСїAјŽoї8ыљ‚ЄњBћЦЩ/НoќЂJЗ›§/ўfьђЏџN$›я;•MњzlЏФOLќжVе/м/ЏўN0ˆo—ЏАЏoЛЏ&Рo/0§К ?0 /QЅŒ!Т“lњ$йE.Ч l LYЌЊ„ зДœ@ŒB…ЇЏАEњ№џтK/bШœe/ёЊ&‚+ˆo [1‰Ч№т"|q Б“БŸqJ(БЈ1Л1РqШёЏjoqыёGА–ˆёяA›1 r71r"/2kёCВ$gаВЩЬlРРШ,‡HHй@QGђзя0ќ@mЧФ(,“)ƒqя*уm’ЙrJР28eфцж2Rо2Хфђ.ЇB/“Т/Г0/Kв.D*Ю*›q2 Р2ЫВ3 4Ѓ.ы2/ћВдeГ6k 7„7k+‹3973-ŸsпІГ4Џs5З30<‹Ір`B|Џџ)€г€Тr‰|LWdB+іmFСз\ ŒР&ќЩ(ˆ/AГA#4Б-t`9є%GєLД„LMИ&F;ŒFs4[|4HoГх6ФA'tI7tJс;ЇF!ўљр§йяНуgЄпЛНфЧ=хЯЇF@,Ч_@W,-ХšТV ХЦњџM ЦrЕш~]•ўщ/qъgљЇААыЋША’ьгОэс;DюЇъЋОяЗ~”П№ћэьƒŠёOшR)П0яГ>№Уў№ѓѕзОѕг^]!L&ађK”БЧ–“(Бbd93—Lu“џтЕзљЇџ5>zћп-ќ+ДйD" P4xaB… 6tјbD…ЈPIДxP@ЦE™ІЧ€) ™€€ГhЯ @JN1e S МxgN)ю„˜QРЦŽCŽ,y2хЪ–/cЮЌщjTЉ+NMtEІИp $‘ES8БŽG–™FDa*ТЇVщжкг.џFZЙОќvlйГiгŽlћ6юмМ‹;ФЛ+пЎХ’5‹V­aЗpх6іќйруМ‘ЗN иђрЬl7'§šqеб­@UЄШжE‹`!kjбІM˜GŒШ” Ю LI`7_,zЖ€кЗsчMђw№сi‹OОмyxЋаыŽ[їuпК…7Ž\9sёѓ}’Їkо6zыНГЗчўў;љш№&йь 6Б"•QTкM)SІ8k“мxѓШ€MР#У‹ьЛ/Ѓl№С B WIC;|БЁЇBPAЫDƒSУaќ‘!ЅЂqФ!dIЧ dqC  1нŠБ^b S6йЃˆс†3i (TPьЩ2…2Ф)ЋtIЉ,Зь28орsЬ2Э4№Р4 ЂвЪ6ЕфвK9щ$гЮЯ„JЪ=зМвЃ?сќrN1 -єE›ыБЊз.Œ?ЫцРO›Є‹ ЏРŒяa­&,Њ ћiьУБ•›,Пфš;kЊМ*ЃГхшПzŽЉiОktВЕ#ƒЬrЫу’ЉБЊњІ\3ЮЗщKjЖožцюЮЏ 4Эе›sЕок,1вTъ|-Њ!Wљ4‹ †втюЪ ШOCДаИЪŠюЦ0? .ЧУЮHЈе8 Vи’•Мз уGлмv‹џiбСЙмДЄ(ћmјсˆ'ЎјтŒ7юјуG.љф”Wnљх˜gЎљцœwюљч ‡.њшЄ—nњщЈЇЎњъЌЗюњыАЧ.ћьДзnћэИчЎћю[хЭ{вПЛќ№ФoќёШ'ЏќђЬ3ю{ѓЏAЏŸєдWo§ѕиgЏ§імw?›ї{џќђ”_ўіцŸЏ}њ€/ћцcПњжЯпОћйOПєњпO}џјуHџі’ёin€ўKŽщX $ЁСf‚L)XA Vƒ^BBŽ„ДЬs˜BzФ•ka3:ъ…-lЭї6‡‰Š01œыa џ8šуЩp˜H&–ˆР%.Q‰L “шAˆДpŠ™QЭхІХєqб‰Y cхОП/>БZZ ž§ЬШEРPjz’cЃСИ™71Žs”ЃwxGм б|ylcё9GуRUdH‰Х"6аqŒ4coиИH~q’ Є%%9МMrФѓфA™HђˆВ‘#L#_ЅS.‘”ЉcuTИ5Wb–бSх,Y 9W‚р—єф/‡ЬM˜Ѕ4ˆ-‰>šРPПdф1Їi1Шˆ-š‡œц1ЋщLжљ’™;yІ†IHmnГ>-#g Э NЯœпlч]l"ЮØSŽь&BCџЯшм“љќх>ihMЧСѓ‹љЅ6ЅГ­€:T›ѕI=зѓаŠ ”ЁЂУІ-jЮˆтŽЃ‚GoR‡Š4™9цFKzЬ‘JдR,ЭЇH]J˜ЦДЃ'ЪDwгŽ‚€ІВ”ЩNЧвSˆц”ˆBENQЇ9S‚v“q@XjK›Z”ЁЖEЄKѕФOg д—кЋEе*WЛZSЬIuЊG=ŠUбVzBЋ xы[ЙЊ”ЕžЅ­}ы/хъ К&ХЎј:Ћ@ЙК†лЭДЄ|}ыц*вТкюАnMьbћкиDF5ІzEkeч“cеfЌx…Ћ6ы‰5˜жД› TRЙйа^vЏь$эiQ ЧџЊЖГ Sмk+кСЮдЖГsэa{;LЙЮvШЅ-pe'\ЌwЏŠ=-rG \Ыю–kfѕYлЦŽ*€хJsЃЊзсЪ•КІnrkћ№~ЖЙкн*yЯ+]ѕЎНюеmvqъмФюЕБЈ]УwgGн™RжРŒэЏ'І›^ѕЂЗНОЏH<сЯwСЩАƒM сrUІc%-_g[лOІŸЌeKM[ZЎЪеХou0rП№…д˜Уœ}j3лВтХJИТ>ЏŒilучx&ž5\w'Ь]зF—Х#ž­€; ;є’иРД­АŒgLc"лX–‹à „oЙЫ^ў˜Сš%—™џТeq}},хSy*с} hЌ|х+WУ3ž.šгМцЊфй){Ўѓќgѕж˜ЫhžqЁЉrшfЄЖ~Б‹ ЋсN+šК3ю]X^єш7ZЙŽNѓ(АjVг˜Ђ Љ3œaЃзЛ‚V5Ћ)ръUЧ:^˜žэ\)›х3ИЮЩЕБЏuЙкЪvДЙhлур†Ч§дocАŽ˜4ЪтП?‘№›џпт6џдбOјЋГп§№чH…h.ёuЙVjжp#7w†ї/ŽwИGuЕ'vД7xU‡|Wч€и~, 6.19WЦ7udЇиЦ№ЅcUVyЉіj7frБчo+Ї~ИBПGxBK&Фla"Xudw„8Јyр€+Ш‚№!€OЈ>8…‰7BhDшjFx„7˜„Kˆu,р„:И}d˜Э‡XТw77r%Ј€Шч€Л—KNХ­зЦА~˜w‚ШGˆ„)И{‚И‚Ќ№tЈC^q‡,‘‡"Ш‡џш‡HIЈ„ЛGˆ†˜[ˆ(q@rѕ^8|r\&~Еx]H‰ƒсzœw_иˆ‘˜r——|Й'‡ƒX‰,PˆЉШKx‡­И‡Џˆ§зˆ)H‰Жˆ‹s!œи{8~чWcЁ˜…[˜y”8f‘†ё…z(ŒЎиј|Ди~ЦŽ–јдXж8и˜|БHщWxВˆyrH‹тx‹@ŽоЧ8ƒ‰;ЈBи‡ЕїˆЯИ…Р˜~J(ŽЛ”n”t[ёw,А{јŽВ‹ВШŽс†–˜ ЩpžwЯW†бН‘кH’Ј„”8…Ј‘йl§б}Ђˆ‘ўˆZh‚‘џј‡ГЈyѓ(…u…c…ŽI‘о˜I8‰9aи”Ќ ‘2р“ИAY•A”иј;9I™‚Й7G_;Ўтh‘нŠЇДzЖ+šЗ?ъUh˜А№Ж­ЪЃB[З…јВ}šЖЌћŸ@ъ<ыЗЋЎђЛВKЛѕhИж)Ѓо@ЁєјБš аыД \p•ы—;ЛЙћЏ_8Бџd_Г&›Ќe›К2;Дw+œ?ъЋшІТKџYМіjМэjПЙ›ЖzЋЗЛЊГП МFР}ЮŸ&1ПAлЇszИЪћжйŸЌ№Ќ НаћДд{НpСк{€pныЏ№Ki<2рЊ1ЏKКН)АѕкЃьЛЗюыН9ёГ$БЋ|Гˆ ЗјkУіŠЗ-ќЇНлЗРЛ LРtЁБ#ѓ ЗP9Й”ZˆМр Ь 9Ї•ъА<­А S{СЬЌЮаСywp\#ЗћYТG*Џ…ЙТДыЇъПŸФ@УБ;Иœа ЭГ -Фm жP E=гF|ЫHlc трЃБ[НypЙтPНзЬˆЙж!=Еј€$э'ms вљАвAав/р/№ 'PœМ%qгƒ{ГјKЛъ›У~ќЧВ,д}[Ш€тxI­дЭмдv,еQ ШќЫU-йAŒеm Реw’†ulb=жј:\0ЕЛж"}+Д]Йs `з;s%є@~эP иЁуxHœи}\Я‹П-œ§+дџ[ШCќК1|дВџ,ЬИЬдœ-Ьрйж}нЄ]кІ] дРE|чPЧdакт€Ѕ:|АХdл%Эc€лБ-зsНН}вdм%PХMњ ЮумƒM€ZG>ам§мzlПНМЛСМГџФйЭƒм&т FанB§нУLо,žа]е@у еZmкЇ§щъе_­t№эч0п­­НЛŠпњ=%mзb-\,ЮОљФpр žрХнр/р P .Р:ОВYБx™§дМ|Џ{ьг6lа]н2nЬ‡ %;оЫан—й о§[оTmоФХŒн5nуЇ] 8ч`.џќуЌ=ŒžЙЫђ№ЩѕЭPв^,ж”юу мхчpsPх њ0YОх]ЎВ_>ў,оw|с~МсO§йр=Ш“§ч†lАБ…эF0ч@œтчНчФnнЁ}ыюц4.ш7ўШРыF§ƒ/№?фкkБч`.ЁŒпАмОш™.РЭщž~Ђ^`^0Я хˆ€WAгФIоэъQ]аК<нPMыьП„ьцX б?Ђwж№ыtоЗч­№˜эЛT}оьИоаЬ>ш„N э}%8эЄЌ€A`БЃlA@ЮAю| юšNюхм€№џ ъыЮюу Ўр ˆ ЫIїШœ§ъћKц=Lы{>ШŸыYкžкыqў’§?чь1^чoнWџсЬЄ-шХіO а‡.бњшњдЎnђ›ћщСЪ'/рђdђ{§ђЎ2џ ŸPѓыою8Џѓ<яСббŽдЯт›нйєў^ьV}еJ_кЛ~ˆE:сM№UячХlѕ /кР{ѕIпа§а`ёaџ?@ірGКцјєСі/р oџёЃLЪtŸ}ЭїРнз{}џђЁP€џ‚/ ТАюp[ЮˆєюЙhџ_‡т.ЮтљAЏчYяЗ^пњšкѓ.•ю)0ѕЧœьєѕі/ёЅ?ёъпњ5ћВ/ћAЭ2‚ D˜PсB† >„и@DŠ'VЄxqсЛg/œiаHЄ†sч4а›S‚žШ s\ (HО5k† UBУЃwŸ„§v@(”\L\1†QщRІMjtUjDЈQЋ"\ašФМ~ѕ@ЌXXc‰‘-;V­йЏ\нr7Т2#uэZУ; XБЋ ћNЬєo`„ƒ•.6РZнeG€ьВжЩZхN–ŒЙБнЛxѓю-іCє .LXuSд„[gŒјЌЃџГ!5а~ЄA_Э•€ш•pI/цo›ŸŒчїь] BŒ‚‘ ‘+RЄќТ^нЂvюлЛЬз-XђkПЎE€МлИэхnЎы9Џоа _З_ћ§Ј‰ёкu,РЬ*#02ŒOОљш M4jЈ…i!?§Лp5ў;aЖкЙэvSIЄнRв$нl*СИOz#Йw*ЉфŠ+œƒŽЪ!%Œ6ЬШ ‡„HШд zlЋЗЦ+МГдsЌЗмs/В= Kњ~XЪH"”Ъ0/ zm/Х8c >#P35зTSAkДЬВСб,MB ЛќђЛ1ЩtшO ;|aCџН№"DРЈ DwЫ)ХHlбИ`LюmМq”`ЂЧ#YыГЛ?9е5ќ OМ%™”’Ћ(з›ђ27“Ю-IsjУџъ*ЕЯTЂцџ~EЭГBаˆХыLWїКЯ[hEТVzХЯƒ§rиŠ:„ŠCuFDgМhQFsƒ6/­ЩвK…чM9НтЕGqGЗ`ƒŸтГ"V[ЅђUЏ&це%Љ,p.КАЄД;Xе34&80!7,жL9;{іMf9“х:ЕZo!ŒА›БніЛ™Нљ }N˜ЉЩЅмq'нBНјЄGmБ/џфЗвK/= }kДбпud{&сВ1ќ.хЩЈtяUW%žИНЪLц˜Ћх8dЊЪKA–ї>ЛHќŠ5VK9ON–ЎhЯtіГ˜ЉД™ЈйfЫЭ“!wцY№Рњ"Dˆ6њшq xс(№щDчэс/ =ŒŸhЌk­OрдыoФ(‡RТі#sуЙ §sЋАSJ1V+f[Iк†+zЙчІЛqЛ5ЦэЄЭвуЦ­)›?1™ЧШ —у№Џduќ9УwПAюI“œц-(ЇаrЫqбх(@Юх­gц њœ в™‹vD)к~т:/H9 o‡ЛџdM_]ѓš€G l`РХS^рВѓEХypЪJХ,CБZяzzг]ъЙШyk оЬDЬ>чхŠ|*\žDЄЂО’ ‘ˆя“#ЦЗCчС,rеВ–іЇХ- #8ћ.Ф@d рЮ(ї9A%P5 Ь ф8 CA ЃЈDP eС MƒИУн\1КoаЁПa9АSјCJИ"ЙŸяа†ЊL•жf+ (YuЛŸƒВјУ ЦX‰ybЎД”BRu‡rы{*whВљ…OŠтœ4Ж>QОR \мТТ1Ь'рЂbDІ*sГ3Ђ‘€Ѓ"+б–!КџТsEЙrQ4TW @>[zю\T}Wlh(e Ўуn ­гЦ|YгšЂЅџІPщJUЁЬЉјOB1ХЌ3MSJНЖšЄ`@O} ƒAцТЃАQQQ[#ш@СЇќЪ@l3АЮvJЕЊ6…,ˆ‡еUlU’zІАpтf‡}/ќф?7Ѓ\OТoAѓу!ЭаWm5ЃЇд(јbЉO‰ wЁЩѓыuЏЙ’ЭВыРƒayXХNГ^tьLЩN–ВN1Іeaњо™ Кмѕ‹wQЕPќT'Дз”#iGwЭдЮёЈDE0j9%л ˆ)С(Чms+ њсНѕ-pSјUС8;MЄ_ЫЗж4)Ћ m•yЅы_ъj+g9#/ЧћИэqo/"Ж‰Wsйfюl4эШџ_с wо0іNјk’ifššъ‰BO &1чk_.п—)bєпЭˆL!+ѓWO7ВЯ„ЌŸ€жš&­Ž\!†~}#СпрЧHkM1|Ѓ_БЅCl-\ SuУV Вбл0Эјœ$]ey8В~ввŸtпіšEў’љЬ—ЋШLёиРжеNЂ1 ;Щ2?sfzЅБ,švЌЃЩГ~зK3ыIBO6АQ _tйО{Ѕˆ*Рf_7{П5Цж‘нY"ЕTх(‡ІЃ>џNŽ}ž­омэwТ36о№І€лCcUNXE ­@>’мЅ ‡8–‰OХђ‹q,џёVShлиЉ/‹ЅуR;”дЉVžg‡РR;2Ѓ>ъГОф<эK#oщ>„Т "1фЩŽџ+Гї‚?љЕS5 H іЃœtxПј#%§#ћУ.ЫП§Г…>Ш< БЏфЛГt;Нƒ4DРџ ЄРzТ†BCН ‹Ї6\Рлš‚;дРђоѓР&X4m рAР1A )СьH*cИ†cС€"М‚СИЕЋAУџ@"Ћ8КуœNtЮв:ОR˜П"<Ѓtш" 9ХшcB'lПSlT ІЪР0ЊЏЩR$и?/єТў›ЌKУJќ4$AQдU?`ЄФ67ФY04дГ{А:ДР;ФFYаУ=ьC?М:m(AшB^фEІА…0Ц' Ч+|<`HЦS0I @IgФ€h, jT@&€FЊТЦ;4!’†>Ь†ќЦ*ЧA\Еq,>еАВэSЧuИSЪЈФˆ.єФ*ЩJДGLД,šЃВмЧ„ P ЪеИA`ћ,B#­фЂЭвЭЉфВKmˆ[ˆMau‚Э& P[ѕл&8аРuТ­} P…УE\Qш;Аƒ”ZD 8-У"d,эгмшS$TD-’ПсдAа ]vM[ызp ШднЏ‘бƒ{ЯьрBк%^dZЙN]км оKшнпEрэ…ЋUе,Œ][@‚унE%]^чЅa8ˆWРсWxђbЙѕоUˆ[аœлб|bJˆт%ІbJ€_AФbљнтaN\ќ§b…хd&c".уiУ/гЕТп,Ъ66)$DG9vHUŒ)а59œ-І<Ж^П|Ю™CнaмЭ VZ фB6фх2hч,L9,hфGŽфy†ЈМОМLvЙёX сO&he^ц„(eŒœ^фMeV…ЫЋџ†AtƒX~Xя=bbbаш(Іbи‡}p`‚-Ж„aЎ‚nPi;ј…_@fƒ†i1nхfц–ЉрYп$ПЦЫ7оS+“c%2~з“[зo6лSv 'рŽ4Уџ%УL&ШЅЄзŠZШKfч}6ЖіT|vфH€”лeШg­Fe[XёЬЫ> е:‚ч%шИуSJц„Јƒ„Оj†оП‡жkЬ#кЉЮ^е€ Šv7PPŒЦh•[ŽІФv‚b щiAKАlЫЎ‚”ОпhщhИс˜m™NУЁlмШ%Eœ&2–cmvHжМYВМЌ,ƒдЁ>кЃжkOJeДНФџЇž9CЖ=›аБъМ\ЌNUЌbU@‚]иˆhыы8ШХфцыNыЕXА‚ИіюPЦсRћe„jлс^k.”оОVя!Fч qаc-lУnl`D4}lЦFlнљ‚ЩОЫЦьЬітˆ†э?hšfЅaYсžmъ Ы4fNwѕ5wъ`“Мй5Xіf1ыжуŽмTдоЭ\XV&эР@o^LыДЮd#ѕчЩZnВ~юш~ae ю`hWkЖоnюіnPF€"ЧaКŠe6oАmёМN^…цкŽrї.эе†ˆoљžowњІя…_Фўђ,‚џџAМlШьЬ6fGp‡sбnp§ЕщюM+Ф2 &=Ы/К™ K=й№цgіKГвЕЧwЛˆ„jVЕСАђW „сFя‡qTнПДжt$P‡n}F‚аquрёііТДЖъ€­цИ.ђ"ЇZx…СЋ–dF€АЅR]ы^—r_зK2Кqi5й-џЩ.Ÿп-щeіј…2/s’]SKр€kЧvhѓ†8їv§№*дL•вНs§ 6ЫyTиN)tOЉˆмpб]л~хZ.М4М0[ѕdЯюM?]œ фЊцuLчtфxLўteИqŠuuˆSGuџЖікЖhˆѕXŸѕYЏѕEФQF€%gѕ&іWвDНЉ С,/€љй‘]і-Ÿп”Ÿя,ŽviЏ‚5…lПvT@…рynяoz9/у§ l‹ёгnєsП9 NxewS˜m}W?nфэѕJ[ qhrF,дY#UMР–t„иPХtЋЯю#§tuHhHSOkuИSGЯMŽxђьdOЎŠ—ѕ‹Ї…[И…"[<šхИўxV^МљФGФџk‡И“…Ьжђ•?VPА‡-wƒ’^y7f‚*8yХyпy‡P§ zg-РЈШэZЗn`э+иА_`­:u*OUCзВM{'ж˜%gЪEIЗх]’ujещ[ЋV‘РЙџЌеVŸEдЉK#)К’е]hV„АжП‹ИшыйsЕаЂyа*}ы4ъШ9hMэ5ЕжЋ3"§йГцмКџfоэЛZ]–yƒЎвИЪhvьtkо­ єЂІOЗdњѕ*Cьш^ ЪР‚Л%Tј№МФ‰йxlяў=q’ШуЇoŸўќ•fЯЖхtш(@рP(˜‚BND§‡ [g••f\уXXxЁWPѓ UoЉХ[jѕчсMeнWW~љеu[_‚VK„}Ж•bŒ]№˜:‚QffЙесBg,Š&ЈyZ+Њ­ж“В­жFHY ‹ИщЖ—oYњмџ‰'ІиeJЪ-чtаQ'J7• %б}W…xqаO7Ы-wУyЅG‘EяљљЇF` Šп СЉ’q}иdN§эфTZN…KS6uЄ’X"‡ˆХЈе„b8ъХpЕпІo5(ЂTЉ>иG—‡ 7ыJU)o…cf‹5s#<9іЋeYzфmC†&e‘GžK’JВжЄOBy-ЬRY%–нІЅo}qYЈHВЎdЎЙ'‰Щ\se:‡fškВYХsєВЩаœ§аiЇxЪёЏKФgŸ€ќ'ЙƒІ›А\_žtXYhШЊNЊh* Ѕ>zщTšІЪщЋjіCЈSВџ…'ŸёЧ-ЗмЉV ЧчАKЖ Єf2ъVDЎ€5гЬ’ьaйАь4cьБAжЁьВ˜vd,аF+э’ВЕp5FЅ•І,ЗUњшѕg0<зЬvu Ю/ПАKІsЮq /œєЖ]ОњЮyПбpРрј-Ојr0с цТ‡›ФXyЂˆr )NЛ WY‹œЩ%Ÿќ9ш'#Г2Ы—›~UЇžжЂ8^`вТѕ7Л хКЙ№ѓГьс‚`.н­fЗ !гM;§є-Q+ягдЋ9яќе-Дrбi[пѕЗиƒF ы^В.б/7ˆяsc.ЧPНєЖйv7јК/Ч jлё џ|лЯЇО”RJс§УSтКg(А€< Ќ†#Ћ­pшt$Вм[<ц2}Њ7šq@ч&К ўрЄ+ъ:ф@ЊЄЮS}ЈЙŒC3DчuL“]gТUЛммhКƒ!;„<О€&4ФSГДvšW(OyИ`^єЎіч ЂЈ`ŸћђЏјЅэ1А_пж#§ёЯvlЯЫ–E!А<уЇ(T№&| JєВmn7ЬрЩ:ШСPЃ,Ёу.з!Lšpuy4IQтBe OШксБКѕЃfА#wЛџЛ™rи5(VƒYЧЃ…‘Š5цM-zЯKтєtšli vK3fЋ4ЄO'”uщЂF;фЩ! aпBђЏ5ІG"їѓлzˆ@Ч;’г#ЬLч;щ“­ZжЦ‡Ѕд!Нх;vАc €Q)Щ–ЗФ%д”Ї‹#"1‰Оti+p!Lд˜ДЂДRojEtFT>э„(PжM/т тГSQѓдё}Q›льІ7ЕрЗЉ†sœхМъFxњж§д.]u A/)BWuŠD˜џ>{cС+Бц5§'\)йšА6Ю vMk#yњаг–Ђ)хЋ(М6РЃІtС№DXq•дЄBtV,Є ]PVМt)fЅзш"jЗH…жњjS’ЖiZЮWж@“ЈЎ­ц ф`TЂ>d›џ‚ъDРЁ€нюVОg)L€есf•lЇэо^SР\E(u Eы]Ѓ›9Ў€Ы[WslJИЦІ5- k]ы*]М6’Ё [Ё}Js<Пт”ЄТKь/Dzб№ ŠХГehQšвШR–В;‰ЉO2{ЕŸрBЉPо-ђ+кЦNЉДD’вqYxgЪ… Ћѕ[4\›сˆшЭЕБѕ0*lџЫ7Јv€ЗМѕэўb`"И.ўH„Е(Јф*W.Ьmюxs|зUЗ/зuЭv) ›эЙZЋoХ+н$_i\ŸЄpI,кб“i п‹fЙОP bhѕ,•і—b, Ає’ФЫŠиГFЪя”‚ШоWДЮR*MŒУКѕLZnџьZјЙV r€Ѓ,МкеšиЗsЄ#‹[ќтIП"ЯШMmk–3 FЧ;V2#ЗвcЯ$ЉID2Њ„Œ'YЌ0$“Пцф+B™$G эœozL!№ Ы‹hРКќх0‹yЬEьo*Ь|цѓ2ІЃЌ›Ѕ5ќNЛС5­Љi,-cџ†ёyЊ#†jРˆjhAбZP@EV[‘о:њбћ‹4Ѕу­эѓb:г-йЁn0cWюЛгЁІюзМuЭV ШЈNѕ“‹MЗКсŸ2!Рwѓ™Z2Гж#3œGлXeѕкзюˆ3мСпybжeдt‘Š•ЇТki6Ьwb‹ўЮДи NpЕСLLѕ>6ѓ6юсжУ†>ћр67†Gо Н"эv4KяxS§чˆЋЗНk…ям<М&Аю:Ф^СЏuMГЮВЉj5е|7п;мзJvаˆ­PшЅOБЋЇоћ34WТ">ЮЌќкњ=9Ъ‘Эr‰Бt(ЮцЩЬћ[DŒ?џv˜<—2БoЁ‹п\О:бЇš[Љњ™єЄяГ§Lмt6<нн]ˆДЄЉ^uЮ_=” Г’–тЎћнЏU{,ЅЕ‚oЕhU—сМзИЄXwZ\$БШЛоЏН^"б‚JPBмZы+ЁЏ™‡lтiЮђd7ЪQk‰<Дu §[WОzХжEЅ­.сУ юѓн'UC_t§ыVѕMwt`ТоФ€ь`ќЩ_У`žБФпёС’•aЯя)бД_“ ƒfЕ]ёM “ёэ”г0˜ хa[Ю9ЭѕaŸі бѕIјЁмdбeБм€ˆљIЫu Ўžќ]„6пJаџ‘Ѓ 85ў)@šиn NEŽV!ьХ" *рK0`ЎФb}‹oD`ЌБšЮ]}FOєR™№q OСЌ‡К)сКAсnэрьO рfЁj!*—~aJЄ!іdЩиэŽ!Žc1Э6k,б2ўRтТgHмNcђ‘с™їLX—ДY#Jл"ZžiЂ"Щ82b#>т Ўм$Rb%BЮ%і Эџ" Bт)OGTмЖ%LдЕоъ)€oM•ЌЂа5дE])Ьты]с-.$>™}аXУ€Ёmh5VЄEc• ‰Ы­Ё/1ЃGТЁГБˆРбсEŽ 2н—ж(Ю(ІB FDZi:хўЬџQы!a‘"фыq&gВX~цч~F)Œ)'ЂŠшD^ЈзT HjЉ—#E!@ƒ:h/Йд$QP<оMdi~щ€:иВb y(&в\ˆšgЭРaњBŠђ—Šк ‹іф:2ц+дXAWYдС+и(‹тhQ:Њј>’‹FРо,)|>Ѕ,š&BjхV>)WJЉЈ6d„љЇЁˆ–f)˜К)ЋВ*I Œˆ[>(šEєќGЋ@QЋ^ЈNž~щ—нбщкщdVfˆоidцdJf Жш f–pg q…Ђ.*Ѓ*fbB*ГЎœбк pD{jхFвQЙ’Ћ’z*”Ž*ЛŠz†џ%„z™ь S›юjВx)пё†ЌЮъe]ЭQ0Ўиšъъ—lNб’єOБЩЬ‰\ыАЖфВЋ. І.˜@Х†hХтhГЊvjDЗHыtFЕj ІЃxB*O’r‰G„ЋИ`Є’жlЇzъЇЖЋЮ†т“Љ“ЕN”ЭkЎбRFоkОjNaшqFыXљkK9оPL…ЎН)œчТ2lУЦЋ6о‡ЕBljЋ#іЦъuЊЧJbGTƒё”зХH5\Фй6+Ж*оЪбэЪ–S6v(зЖGjтьiZjЇZ!-:)ЬЂцЮЎЛ>$љ,mUа*XЊ:и1ъЁ•U­хrMЮ0џ ™Ўд6HMDЎН^ЎТ^­†Ў_ЌиFxьЩjЋјЅ‚ |ш Ў(Ož-кzФХнлТmмЪ-яš-Ё^•в‡Ÿ€*Юњэ/jцч$/т6/Fфу6.аŽц ­ш^/і–_№kПvюЮшаfo†Њ`ѕ^ж*nplэ6*ыbчыжэАњюйОЧl‚`1ў…FЌяьzmяКЈ‹Эiњ ё"/k%ЈАѓ&0Љ~х‰DљNй‚ŠЏ;XEYIAхЎј†ЏхZшъм›œщЂoLДэђя‡ІьјНoя.цќњI§"Y–tDмюnџ>ыЄ9l ћЯА“ть“^+џА3pƒ„ЭAnœѕ]гLАё,ьЋІъ”Ьцcp[( йB-ддх’Ўє…pћaд№тЏФŸœp ГdvЎ1‹вюСˆЁёi ˜№ ›Ќ †ч ЯоєK\е.r rЈb„~1k­zŠDо=ж Ю3Xпy1%Oђ[p'ШФАJkё”бы—yё'khћ‰0єб ‡ЊDсиp;ыЕBцјЙ1сPшpzЦ{д1.П№оGКМиџ20#В0ћ‰є‰№ДсZmxёWrƒАєVЎШш&›•ъЇgk"ё1›/ЮeœЮ‰ђ >№??3лЦ4knљQЬЧ@_`ž@os~usосЉЯEфI ЛВ ПГЧо‘€h№p‹8ћ/Ki3ЁФ-ІfFђ!ч3L›SТK&Бi-œ)Г6oѓK"2янD&ДBѓGCЗ­ŒдDW/E/uNZtcIPšG?ы;_Yb іTУ-”<7Џо~ѕHФДXuBЕ^1u?;2ƒЃ?ЃuAO[{ ѕP{!a…Ј!u˜IД[wГEWІу†ФNuWЌ;cе-0K,Pш, ЩV“5сќ5H8Жd‹ѕМNюџѕ›™\љb6E бD5Џ<Y9NцO5ДЕ7rЖ`^v_ЗЖђаJ 0$4CЦ1…tZ*K,Lіc‹elѓ6pчГЅYіeЋЖqŸrqwv1ЈxіЋ4jwaК6uы’žEiW/j”к6P‡єMэvpЬu‡7y3чE›tЇїj#‰Ўп‚m‹\/ Њ`’ђPtЛЕsVЗQ–gkлEyлбѓЭ+œкxџ71O˜'xg&zЋ7fOžy[r'иєСwXѕлFм1сЗ~WІф…;5‚+јСдмmї*~Ё'‰ѓЌ|ЌИ‹Зыqї ђuД!ињ§`‡ЗЗо5ъ}wZaєџJеx~чј~ЗoKіЕПИŸdі‰GёN76“'ю\LЙ•{eХ§qљфЅ”'КфГL7žЋE/т‰їИЋйuЌ yђЙy&9’KІe~3XЮ\y{\і >ёЭЉј”‡–уЙ рЛn9e~Й„Л9e~x ’9˜bšЁ<‰WВЙЂ7:ХЦ9’‡-Ѓ;нљ oD—џ3љš/(њЇ‡КЊПиqЕv›CјЅ‡Ї_'™ё%…G:зu]Ѕ/Эв8ЭЋ[4™kКАkКuјЊ_ФЈt”‹YЈ/љБ?ћЕzЌыїЃ{Qъјg[јк~ŠлЩZœўКeІŸЕkызТ.ВХљkћБ'џћŽ‡q.5ЛКCЛМїшiM{иŽљИC*ЖЖHK:ђ! ‚ћЌчЛјЩюъв-БЋДМѓЗДЁvСЛIЬЛФїЖVй{ŽжњР“ЛЙ;*˜ѓЛmуmfфяЈЕЇ,vЖrЙmћ*<Д'9в Ф—ФФЯМсTЪУђвkџып‡:ЫНТзЙдЃzF>ш?oНў^ŽЛф#>сS#(FІeЯНфS~,‡чўnt+ушхКx.::Ц|T‡~шЧx xИщoќмЗ№:Ю~Гњ|єQЩНš$†В§˜ъслё 6э‹§#š Д›ќŸ&І 7№Я˜:fяоЋтьёо‹ИSЗИ;wѓгSУFыšО|ЖВk )R=TрН›z%@§Sh@ѕDтЈБ№^кNЛѓм‹ЫМѕŒь; zЊPУ 9LшТA,ŽЇЂШ ­Пб <аЎ;Š%5еКЂџЏ5љжbkЖќ:УЭПЈ€“Ъ@"zK("bX:рŒєm)ЫЌCЪ MЧŸД)D}ЊRЫ-ЛвKЬšя#чžыР)Lё!Њ|яEч“ё5mЄхFы*№Ь#Ёъ­ШWb’H!]Јаˆ”L*ГЫИTŒ9)гг­б”ОФВБI1Э4ЂJ9]АБЫЬ-Щ#‡ќ3ЁAз|4ŽргъОефЄБF;oФQЃ<Љ4Эн$вTA 4XSMQыx ѓ1MiЂkB™Ѕ<ПМ‹жкFЇэDe"SЎѕdHXb…Uh\ˆT]ѕДЌь|Vив’ЕNкlЛMД4ЧНƒ\_ нџf@ЫE(`†ќ(/‘В­іZ”VфOв…вжRЬ Ўx;‰1NіВЯžѕЁqЩэї_€%JW]йuWж•k”­жЗЦМ5в ИрRЫѕdBџЙH fИАяИНЮтхD=šЁŒ‹FNщЇЫXjšюVц)Унm"bўYчCšАцPnWe–cЛЯх—ѓ“PЊI;†.Цѕ7Š(b`І_@ѕŽAю(ТV(шbЯ#кKЈ ёЉ'ўёЧeb\rd1ЛзЌ%*вцЎУЎ;ьР{МУ4”йmэДеІѕхzE#dЭНо&аОнцnМћЖ;яњnл{GшѓФSщNу/!wџкЧ+mВъ “~г/Ÿ—Књ@ьХ:з…†яZXЙѕюні№?Н(;rKuЖNW{mкpŒй^ _Џйoп™Ё№лЃШŸџў™q;рёЏ|нkT>t=ЊBzIJž G=6‚Џ€рфЂoaNxхУяЈЛŠ€!,`шЮг"ЌЌFюsЁъи6\ Ќ~ ћv;tDўг!:vјПџа|ЃкЦ*Ш< bHbI\мЁ( joW‚ѓ иПкM‹$тљRvЅЌe.Ќ“ър?ЫQщuЗу™aо ˆ@dFwXG!b‘ˆ##ЬŽHЃ9bЧcZˆџšDШŠ2ŠЛ` fH †\‘Ž{ф!љЇG–OWTQ!mЬvF­Рm№У“УˆРГ@Q€tД€YYGYЮr–™de§˜"Ÿ8qŠŒуx95_2 ˜4˜Xв:ˆ|Ю–Ќlf35љХ?1ч“ъsекHYJЗŒGB‘zE*u–ПhђшxЅ№ˆ3qГlЇ,щˆЩMі8WЊ^ѕ†‰-djыžпЩ'—fL/=r O™dЁЫZ^R §]рLх”jЎА]йЄUщEЂљyœВЛ#<Ы‰Mhb—4IЊN3ЌГ+ЅЅ<ŠKйŠџм@ИD›jЇ=-šВ jџE„ЦѓЅВ|gWъR˜юp„бˆ­iQ;a4ЃњqлR 0ЛНд–')ROšд•ŽTЌb-*O8šzЊR;ЭNѓрЪVфЙU:qэii™ тxF-jJСjжЅў. y*TKgQЊn“›ЗjJVkgЛГšдЋ(Uч?4ёВ’ДЌ‚UЊ3cк=)ю’ZŒд])sШвц•%х j'ЃZгтдЕ+ 3 KT•ЕГНь` Л“ ~Š],ЬN9ГAхЭnя|'eO ”ЎєееЌЊ›YЭZїКщ<ƒ&AœТЖKwmMЩ+ѓЎз8Н­я„ШNпЮ—КжMъwcšсџ"6ЊS=nќb†ЋхЮбЛХЌt“Z]8p—С ююoЩЩЩœю“r:MяLЂиЯу їТ1Щ№zЯ[)’м0ЄєЋƒ aъЗEФЅЊџЋбь­ЇTЅcUj]8,јКџи1Мcю ™Лeuhљ8UлЙvи$ ў‰’Чф&;™ЖpЩ•16b.vЕОEFё—Л‹п‚нЁХ.ўoŒы5c’|/ шф!}‡Lф љЧuЎsƒqZ=™‰@Бђh7^)OяЎAбŒ•Бhšа>эs•ЁЌ-ЧѓЦ]Гэ|чъоwЉc.3ЯŒQЋЦХ?ТК:хлл9Ус@оqЋэ ыLџИџШFОЅэЖбМ?SйIŒ~ЏŸМk`ћzІРvrЄwТEwbїв˜žЕІУŒЧр}дЁ6%ыfFУŠ”ЅЬvpЏ!ыW‡ћЧс6їЙХMыM vˆBvЇml&ЩЛARІ7•п-iнvљйЯ&wІэћй-FсАœБіqG=?њх‡œѕvƒЧ}npЃ›тЗ3žлЩ?~[3Ў№Н?Юо•xќб 7fО‘Уа;ЛпЌЎИЙяЬiLnƒЬд&нС㘹жyєЃgyЌЯНŠ =шK zИNqu™œx0Шakr@Г–оQ—:Ъ*Йэvе/їЫ•Юc#мцfЦyUїC’ч –џі7вžtsЧюuЗ;К~]=:Rъљgпч ј S№јŽbСъqА_Уюr‡Йия[pЮLўьŒ•пHДкПuj7Ш`oќчAпјЧkZЉQрће§NШ’>фђў‹"WЯњFb=й~TќЫCtX\ђ“ї§ЭCнXЬзЎЭ›їБ‚qŸ{х‡от V*ЦhЁЂUPЎ€ОгЁзРъЫȍлnП|а?ОКНџ§љЯ|~ Ьv+ЫУџљCЬўuЏПбщŸџќ‹я›bC Ф”%zHыо‚Щѕ~‚W EޘЬ'*ФяюXхќ(ђD­Ч$иЏЭH ўтЯює/EpџїџZMГаAЖИЏзiХYА`зЎO'Фчћ7Шy5,5bЭl‡ЌOўH№‘№ўDЯљRњ8NњяZЎЇнэ ЇbІpЇ† Yb‹ ш€№тЪЎ1РШP#ngЄ| н№/ “ ра —PГЌЧ AФZ‰ѕИ0№ю№—I OO ЬрG&Ш№qђа№Єж№I!1%q)1G0щœ/№УАoфєщщ^АЉN В№Е>БЕ PUБЇJJІтћ:HЈ€&iё SaСXЭўBАyБ%‘…nСЖMёIˆ1б1џ,ˆј*)ILjБ)p#шnў|qЙ1E0џai хІ(ьэ№фШб28$ыјнQr4ƒ НH‰ˆЬ€ ЌqcaO CДБВщ/ЛŠТЄ:ЪAжjУFБаfЏвq.F'сёqjнШiњЈUN'јТœ%*‘Tr%Yr%!Б%]rыЏеj3rY’у&7qз+:tђ!#rršфЃ ІHЬ’оŒКzb$)P'rщ."&Ѕr*Љ’gR1Ј‘H2T0!R(зоИв ;ё'ݘ–@Ю8mh)žъЋ1˜’3xт_: ‚*џё2/YВЏђ ЭвiИу/УR0ыMН“оАЎjў­жŠ ТМэ.ƒ)Т Š(Eю@/133-q РВЫR˜p!s‰s4Ѕ&0Dѓ3™‘'{bєœЯФN г г;Ќё2BH"І2ts7[’75 ъЯЎ@б№8 &Hф0'УВ9WБ чOЮšM6DH3@Ћ2b7Нѓ;С3<ѓЁ97N5ЃˆRЬK+ѓ<уб˜дѓ+пkЋЖъŽмV­прЮKx№B2МИ'<t@}&!‘3;Г&=гТ&Ђ=д/-’,T"Д+Е5cO џЭхв­ш– <Пфќџ@oэ„€†@QTOS!RѓНв4ЯвJљŒK—SK]=7ёJIбиШS:ХўаcbЁR^Г#‘r7—єN•4№4OQt%ЗTkЪ<3CХ ƒ~-Aq4ЛLyТйємєMяэз)ogO15S T%A4GrQб4QЧбLН(mRTiK бТƒP‚uџvMŽRюЏv(SuO4Jџt]ЕP2X…SіˆЕ№XЕUѕTџН#JзT_RъˆrнŽЪЏъhIЯ [ЯOГUWu“OC@RУ4TЇN"ЉU­TЋєK/’\бu=е5іј)YM•Xcв'‘иФР1р`sЅ A[VIv[w•IУ•T™U^gДяŽUawPжXW•^=5BПd/SR_/—ЬЈЋ`EvdНU\ЫTAпub9:SѕѕЯX•ъиSb є%Uђb ЁMСP FіgvOб€cїеTe6^W–8ebCnfEQiЁTщЪЭhŒEЉr\г” идыZм!lAdЧ–dёєf#‡U>Э29o2XQчеЯ„­jџБФi'<ЙOC}єхФ6lГѕoЫіg mеі\‹cзMU[–bUгnq—ћ№v^ Эn BиO7PnWB уюGOt—@pMpжpГRsџ’ у–НXЗmOvrЉ#YWscg­–v{8 2ыюtOWdUвДЖXн•wgй4LyсqmїvЃ7wзumгЖQ}їwл№QГQ …wxГ•8зBЋW'пэuеёLЭWBQ‚ІWŠІ—zЖ]3`ѕYнPџvјї{Хw|ЅbбЗ~ХeЭ•€ззЇтsчw€ЩWrБ7VЕ1ч-и‚Mз;ЗsНдйiџ/cщw5?еzз“ЫG›ц‘œЕѓЯ/8†ХVƒG•vWеW…‡“ …WЯƒ™Б%’c8†э4`‘—]닇mg—˜‰W!W7vЫUyЅИRАVc‡x Ё.Xƒ Ж†їŠЁXwп•ŒЫиz|а€X'ЁД*Ѓ23WŒУјzЇгXŒK ѓ8}Ѓ–€ѓэ;х3›”`Г5Uq˜U–‡ЙeпЗ+a ta2I љ Жu’­X“Ѓ—“ЧиbOиŠЭ3Р<+љI[Е•iЊ†ŠЯИ”–k—”з†л˜–Aљ'œДWU™ŽYљ Тж‘H—wй|‹Й‘џynЏN™эxwyљNy@15p‡йнژ8yл6›й=w–П9qЧ™ƒA˜% Vš ”Iі’…Ylu ЪжјyKxXЕLю9„E™Ы™n—й'ДUSПЕяД`w PnžџйX:ŸкфК™Iј™{"  š[ šlУ–)Ђ;zЂС™š™ё|ŸзЃ­ЏŸAnpгЙV[ї—Ѓˆ'QњЁWuіTњ˜kњeUкu-u 6Ѓ_Z`Mї‚‰fЇуXg7Ѕ]uЄSP)ЉЃњЁХvЈ­њзЈёпrš‘_WЊmк•ЯX‘сж'ўіЊ­љ{С‚ЛИ2УƒСЊ§ЂџсšЌй9ЛК‡ЭЋcР7­еZlcИ­S`Aј8Ў?ј99юАљzЏ3Џ‰В ƒ[­‹xкк­§БI“ГУкАйЉ?Л‡%[љЉс‚+;І/›3[Г[ЫГOЎЉ­Џb]PЖ™^ИД…’З'Ч‹e˜Е[ћ‚_;R ЈFВq{Д—›}{5Ÿ{Š=YЛxИ­›­_ЛŒЛА3їЙE[XЗЗНЛЙoYbХ{ЁЩћ3ћК‰;Л3{ЛЙ;qЛyДЅ/К[ТО_–Й#ЗSРНЛКнћН{6сф›0q;КЯП“;Єщњ|”їћ;Р-\Рс›Р7!НёКžџп–z"З}‰v`еЃвеМк‰}™НаqнЦЕНлЁћ'У}Э­ЌкЯНк-Ниџљл’пSжпЅЛнмОwб}оЋ=Vи'сГз]№ўФ#оa^рEœг`&и9ўр-§т!ф5~ф'A$оЗ+>”1от)ўB bф9žиY=цEžф5^рSўЃY^ч›}ч!ОЇџц9~т!цmžф;хs<р§БЕщ'wтgл8l~Њоъ^у“~чЅЧ}^й)ъ;iYD ыоьеоьП~Щ^ь™дџлох[YдžфЯязоьЗ~юoлсžЁыоя1ўXуМіўю5>ёйž№§љ„џЖОып еЃ;ёѓ3ПђяЛЪœ‘0тХŒбжл8ВdАїNОŒЗВeЬœ;{ў :ДшбЄK›>:ЕъеЌ[Л~ ;ЖьйДkлО;ЗюнМ{ћў <И№сФ‹?Ž<ЙђхЬ›;=КєщдЋ[ПŽ=ЛіэмЛ{џ>МјёфЫ›?Џ< ;mricron-0.20120505.1~dfsg.1.orig/html/images/splash.jpg0000664000175000017500000011261010476335144022065 0ustar michaelmichaelџиџрJFIF``џлC   %# , #&')*)-0-(0%()(џлC   (((((((((((((((((((((((((((((((((((((((((((((((((((џР^P"џФџФO !1AQa"q2‘Ё#BСRБб№$3всbr‚’г4SsГТёct%CDUdƒ“ЂЃџФџФ;!1AQ"aq2‘ЁБб#RС5BTr№3CSDbсёџк ?љ‚Š(Џ\g=ѓЂŠwЇZ5мРc? i_Zu‹нH8;=}jпІщVБтлХ!џД€вšuŠЌJU@P01SРw1G$žЊмxёWbPщvУ6Vпџ‰Ъ—ИВв-c qif€іЬK“іЭ6ИеR&йdЋ3љЙЮаsћд`W{“,ФЫ+’jЬX'‘№JSŒzB—-<…,tлD@p$hW'м qљўдеtXTnxbЧ§бSBO.p=zWцhќ поКxtpŠјЙfyJй §™nРјvШ№ щthЬhЦе$§[Љ™‘б„””w‘)XіЊ“’"Ње`uq\ T4]/OHI–Щ=œ-5M* мЩmjAуr‚?ТЌW‹wХ?=ƒЕycp !"Q“ы\вTDЧlЖ ›2вtЧƒїњT”Z5ЪЈ6–QЪp<7‰AЩђsљRыФgH›ё/Їк™]YEq!ZcžЦ†‰ЦtI6ЇyXZgџ„ПхHIЄX`тТлђ…ЪМŠKћ(№ћngБ њѓNluЎ[f|9МуnрћzдyEщТDЁгЖ’Ѓx1$Mь U'Rвю,јŠJzЕі Ч*>џOI‘У(e#Е5*!“—FAEYuОžh7Kj _юеm”ЋУyU‰йŠQqtЮhЂŠdBŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Ššаzvџ[“‘т pdnV•Ёt6—iЕЎ•Ї™y;МЯк€2(эЇ”т8dcьІЄ-tFсі-ДŠљ+)ќышkK8ацЬэJŒšфлю|Х AЉ4‘[єџŒ‰w Jу5 3F(zВJнU"$сUFI<*іфъ3,1 [)Ш$rЧж–ПœЬ ДeJ(#{ч№з ˆ0ƒыэVрЦ›RŸEЙ'ўTz-у…;ЅxчvTMу‘Bч€iлZВЦ[‘]U/хiqБŠ1ЯІ\ђy9т–ЗT ;цjKNВŽцWRv8ЊgЉxјЁЅdB^С8>ѕмїЪ2;љŠq­iтоыi\#дS‘ Б>CC„$S=Иў"їЮЉl Б‚85jv`œ3š(Ђ™ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ‘вtЋНVх!Д‰˜“‚ис}Щ qЦвКЄ`ГБUFI'ШUлЄ::Yн/Еhm”§0АУ6<иУлЯэоѓв]# ДЧ‡˜ЈњŒљ;U‹S…m4щBЏУ$b€hњl1YтлР> ЋЦ*J‚!ˆЧˆчŸІЂДMJЩ4Ф{љ2ŽTžsNэКЇCпЖ7vсI а-ьЮvЂѓлв“лH|мПCв}^цF№єыrїv8§*?[›X№—Т ъђžhЧQМpшR›mбАњTЗвOл4ЇJыuцЕЬЊ„ЅZЂуMSRгZоцVXћ§jтЊњ&‹ЉЫЊмGіЪи2 -ѕшXхqQі4з“Dгbпл8 ˜$зWOf–Ј`•Ѓ™yкЃ@wzyUCЉЕщѕЛјR(Ж$ TюђђЋ›f(еA/ŽXsJЅ‹,v+vz?Х’ssNЂЛзєпš‚Eкq‚ЪАїџ1ЭPКƒЃеlОwK†^лБыƒэZuЭЫТDA7gБІЗ_)ГEО1–+ŽG#п&НПK,аRŠх~Ež1сзyёЎ}L‚ `Šц­§yЅxWТўв3ђЗ П*8хUр5G˜<ЂŠ(ЂŠ(гKZBgP§ўдXњrЬэёHќ\ŠMб8GsЂfТм@ *Bg№TmЩ–L„єчэ]XФЮ’T№ю.AЄў@Ÿ.йЙќъ –joj№ЌCЖIнœфњћвАdЬИњЙЮO Ђ3х†1N-‡ иЎЮ,J1[™ОEпИP>•юiв‚So…‡!ˆяKИ>nпjžYИѓш4†o‚хСњ|щЦ›,цэ|!€џNIЄ­еццCєРѕЇK+DСЂNрsYuOЪ]Ž)й)|хІ‚#н~І>•ъЧѓLV0#…}2i?џBw7­KЌqЄXEМЋšLjl"’pj4шфКu9*ЌфМOњsHлкxrГ’0hЙЈZ<;V5, чiЄэйі7НxХ[PœєкцЮ9Ђф`ћwЉ)4Љ Kф h QпЗ4‚јЖяЕ‰x§ћŠц-ƒ‘!i"ѕѓэnmЎT€у>ѕ ЇЗё@t;XvaоšJZч иIЃ9чГSџс!ЂbбњFѕbxŽр":„‰’hsндZ—ВЙ[Ј@6žC)9СєЈџЈ‰gRQOтѕєІС\ДжвlŸОжЧЁѕ5dс=Ќ›žъpPњЋD1Г\лЏ§р]єћСu!JВЌ‘Џ/ЁYQƒƒфj)г-œтc”TЧPщ­cvЬЃјl};T9Ћ“Г“‹ІyEPD(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂžщVjw№к[тHp3иPЗHшЋоЋЫ4?YэŸa[&—ЇлXЧ­”KЯ‡о“аtˆДН;e+О“ž7:s-ГjSЁV(ŠН—ŽhBљ^гLкP%'M./tџ•˜} 0ЬНщ *еОeбœИC…$цЅсМXoZЙs@і]9gЙЃT,{žе/ЇhvФАDнл'“^iЖвOу2HTГAЄntЫы@гArX#Ш  иЂ†о6Ю8Ь3УrЙ\UЈ]н4NШвm#tMФmШфzёк˜кмjz\љ‰ќTЩ;YF?jК|ЙЦ-Ѓ~Эš;уT\z€OobEЌ{™ОžJtХЌ:~™œс˜dћ“UЭЉц–ђ+}V;tŽL…8*wyчњC<Џ§ЃЊЂAХМ=№x&Њ”eЖJ™Ÿ>žzylШЙъ8>JъпPˆкУpѕІО_SИБaлНЦ{до­k мJ<‰Ј[‡†Ы\ГW“щАxЄPOiэekХ U8ХF\щ04ђOrQ@‹“€Љ5\ъšаѕЋkШ›}„Ь@{!?Э]ъК…іЊгKJ^sШ„{ёšЋѕЖsЈ'іv|#ЫШnуЦ;ѓы\ˆбЯЉ;цЩЂХЇп^L•Pf$q“ЯЫ‚=ЙіЇ7ГB‘јjA8Рб№мq•Ъ?kяџˆїŽ0РœXк)|WCœљKмл $S/жƒЪЁ?к-Ъ3ЁРlфуЫŠšАМŽt"B;{зZZœvЁ&“~‡J/rЁЄаЄї'Ox…уњŽэЗяYWш’hzЃТРјOѕ!Ч—Ѕm‚)й†мЧНU:ца^щ~ ŽIІRZ NIяШ&ЙZ­/ёkэtЛћ'тž№юЯ№п^жdTWr#FьŽe8 љWЭ8!EPіБЇD9<§ЊїeŠ1хUŽ™Зё.Œ„pМUЭW•тЁ&iУ,Nї ЇЙ-ДБ пфd~™ІŒ†<Rm,’ЦБЅPœ~tю$_/ЕmХ9SSтŠыи "9ˆ…)tј‰”уЪ‘uxдoЯ##Ъœ€’ уšКѓЃcш_KŠ+›o .%9ИЉKhRо';ї'ЙЈm6wЖЙ” RO=ЉФВ=ФУslЩфЦЙ™1ИЗЧˆsŽіiŒЈO *ETЧВ+Р„BЅвtž@FрЉЈЛxЂ–IьэРД‘е фчЮ€h№Џ€d“щRsšKR„Cyk,m•lЎъ‹ъ ‹ЛЕњBАŠ>Kg5yЉ]AМq4d—o#э@лР,ДЙeW ЎщZG‹ѕМТ’ЊFуЫ4Іžї3ШБо9‘їЧЌші—ъŽcRЋэ@бUГОДFž3’‹œэ№3чRб™w>=Њ+\А†лTŽжж2АHЛƒyЩШЗы\:НЌjF*;зSВxaЊщєџSнјn\:ŒiaUЕr<жЁ‚m:Fu#EY:x_M 6y еNUеumиxрхq‘Ї“љтІ­КvтвёЅГ•ЃSмyV FhчЪчКњбХџд3^laъ•§т[e}-}Їм>ффЁье &ƒЊuДW—WŸ,уЦ=ъуЋ‡E\>d ŸНAєЖЂ5›O”’)!(s“ЦjЃЮ’šо-пHKc,‹,с?ЉЊgMjзZлУ!Ž9#“d‡8“W][QЖщэ>FžG”€ѓ''’hВЖЁЊ]м„кВJX0|џЮЁ9ЈЃf“I-Dщ.=§‹|ў&Љ{s6§смиЧгйxћH$0[не §ЊBЖЖПQžHІЖ2,Зr8эи]п в,0ydО'џ(їX1,PP]!ХЧ‚vФЪ6З­Vѕ;ЇЪfˆ…јЧ>Е`pВЮлћ'$–Ѕ%!“Ы5~ЃKHШŠарœ~ТБрдyjЈБЋЌ~зѓѓЇФHѓЎ (ц)‚ %†9 gЗ•t<Ьy!Wйh˜ЗКл 2qŸ*|ЅY2 AЦХЂ•1” ~G§…JлА†еUГœWKkhАˆдbgИ&4,нˆЬ[Кчnх#И5+1u‰пkэLZP‡FДщ­ё|‘ХЅЁšRШ`3РяOФВФЅa€)ёчŠWAх™Шp?ЦЄ&hЧв n5Ÿ#ј˜зC хšBHлŽтœКЦGЦІBф[мВm;›Жz>iЇœ#.еЇН@Б’_Ћ8пVХЌxЮAЭ>]™ ЈвЎ\.>ЎрP=д —Ud§ЋЉ‘ЂИ‰sъ)ьъ$M„vг­Ы€l”>Їв 5O IOjc}MBвh]Fц [ПЖ?ЅLЕ”h…фњх=ъRˆ;ШŒ@EќшL”q…5QъИƒк3 Ї5j…ќ]> bƒqИчїЊџP!{)Бn).ЫВs…EtРЋx#ƒ\еІЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Из|ŠОЄ њ Єс[+(c\ВF ~е‹єgƒџI,ўh)wѓvЮ8­юШЅЏ№œ.йf€8ОŽоU{ˆˆWШ FKЅЭqЉлG"PŒ™98рёш9§ХH\Т-o6т#§@/—оМAyhо.AW?Jчѓує4™8ДЎеч№є[Pг !8'яіІЗW6ГЫ жЎэ~*OБЃ_вby—щ nэ]Уђw:iЖЗ№гУ`ъЧ~)sc[6ќџ^ожн-кS€˜Є:rрLГ.ь(bѕнRdафII фiІ—4kЂмЃMс1VS 8ЧО|ЊDгVŽйѕxVйЅy­ЦG|хy!OЉяпœв› …‹`ŒTU…нНПˆ—z1R3ŸaћSЧ Ј•‚н7ШРэP@Яѓі›Q­žЃРзOГоh0тащ”гэ[eЁэр‹KљрƒХ}РЖrpёN[Ћ"љЧЕ$ySИP=)<кdWvЗљŽ5У"БѓкЇњVЭ<‘ ђ1bqVуUЌ“–iIЛЗиЕ€Ие.L— „XЅu-ZЧF2CjŠзлxUL„88,|‡З~i>Ѓъ4›wŽ!Кр№Њ‡ЙЊ†•ЬВ4зSЩѕG™фšЛйfŽ9є§ПчЉПТМ3іЖч?ВПГУyЌ]<ї’xФp7yvь;оTяOгRа4ЇщЮ)hи*Fт|Љ"’˜4Й фŠэ? Сц,žо‡ЊЧŠVиЊBё#Ы!–Fл&Н7–А1‡zlѓ-и>евН]*ъ{q5œqˆл <Ж8ЯжВj<^Іётб<йqiЂЅ’T˜ўа,б3ЋrоTк8Єšш‰_јqўєкоaІ“с’Nи=к“iйЏ!2;-Л02ŽBчŸкДeёLx•.[B§Ђd]Џ†Џkѓ7№мX1Yз!vœgžJАiZРl1DŸэ,лXcЯЮЁьюlэ/˜К9Жё0’ШЁˆaЖуиœŽ}ЉќKmЇѕhW$E(њzфцI— 2;S!’;Ж @ћšeJ2ЗтЅьЭr`99єЌжэлЯc;~љЖ+œn"Š9UFЦЭytТmЈ<ЉxXЗЖ+’LF;s%оgИЩђЭvіpУ:љБЇ $aУЄŒ'З>нЈ\СvСaWНq E№\юіЎ”4іЁ3†Чzцйк)<)‡>Gж€ДбDЛX ‚ FЭmi‚Р– vЇ†и<›Ÿ|Љн€лО3Œy:Xm1 щ;@\Жю}щ„ЗЙЗ№сЩ#ЙєЉ+e1кƒœœs@Ят2;R_'у %[9ЅМ $}в6ШWrЮ"к‹Щ•Ю BЎуЊЅiЌ?ГQTŒЉ`@ђњGыJ [}ъKL€Чgт6?Š|A @І—ЉтЩэœ ^ЅЯь”mb!щcr†І3е съH”cќMEЮСц‘”RФ€;šБtbšЉ1(Ђ™ЂŠ(ЂŠэ#g *“іЭ{‚{W-EгKcw2Ьь7Ш §(ОўєџЉю-–ЪDвt…Šи№.HЩ#иyUž[ЋbГ>Сє5кC$€”F`;рUЗGщ}[UЖСШњw f—дєэKK‚(хВ№уŒa?˜њŸj7л *–zeхр&коIѓИžТъ 6KЋzоЏ:_S^YТ!ГŠЮ(№?œдЯJN5Ў ”пFіf=ƒ(=~е%Ž/д.ŒЎ[;ˆ—2Bъ=HЄ рŒп5Я’‰!Зx#vЬx#ЗНRЕО”ЖЗ“~Э‘9фњfœАћ•™О+ЪАъ§:іѓ8ВfИDќLЃ€}* Hо&+"•#жЉqkБ‰бE€(ЂŠR'hЄWBC)Ш"ЗОŸ"ћAЖЛИlЙEС…5€VГ№зPёє3fЎ‘ŠЗ™СѓХ_-Œ0о}d>№{зzк*ЫmrЩ l0ЫЗш*3ћ"[xОag,€ф{šžв%lџ0Ѓ`цŽЦ›‹ДCI;k—k)ўЬМ?–}ЉСгЁIiъVxq•ь /kue ђ[:ЈИЭ8аЫ-нЫv’  D4зwкœТЮxТё!>UЊиНОЂЖ6ђШ!)™1иŸLеУAW—PК”сюсНjНдsЄCсЋ!LoPмёњbЊЬъў-D•ЋфўЯ‚%ЦбКЌhжщ=дСUэѓѕ`,ѕХF]YЯsl.!FXГ€џо>ƒќћwћTЅО—}5КE$бкл€ЉоГщБЕёHыxоЗ^F'~у§Kфчž4 БцЅnЎ!вДџЅ€rМ вД k тF˜’ЮsUЫлй5[тіЬedb5ЎбцOlguБК<і­ЭЙI8ђЧ?ы>и<щвIunЦгkƒиаyџЎ Y'hšЩЂЗСЯwЂ8Q5ЛАsмЦЌЧ7 nfн/‰fвСуЧей {нГь™dˆKЏlwсЛиS›-*+m*kЋч˜ГЪCA>|p0iОЎЗэcИl!a‘V[ˆ|M&8РмqкˆхШЅЛsПr:ŸЭЈw'_B ЃДи&YnnЁм %|CœŽй#ЕMлj^5јВ‡jGу`*2 EДЬA:эNЪi}–т№.ž ]#$ђO'лm§Nz†Х.нO‡ЙPœБѕўН ќЕc‘ЙIукЄukѕ–іоЗХUgPG‘уПфxіћR9&'нбhёЫg’<іz ЗІсњБ5…^њкGsРСЫ*чРњŽ?_ЕLы:|šbIc –\—№A$ўрд,В tuЙ9G<ЗЅ]z~Хm4{v–=ВaˆаБ#>јцБxžIyъ‰уpЩT'Ÿaš‰‚rбЎруšбЇIYNHгрq§JHяХ(g0ЬЌ€шi%R›з‰ŒЧ<зNx”гн+*К%э[2 gŸ#N/7ЄfBМ dЮГЂ;;рљTкИи|C‘\‰-Ў™4Юэb‰тVnxЭ9v# qLacsЉФNЙРЈ’ЧpАФ7 sJ,Бм рљѓ‰цУБ;S—+њ1эк‚CDёИ_*Zs2˜­ sхЭwk 2o—ё/JCTS,‹ќ$ѓ@ 4Ј|X$мИ“]EraТA'ЪЄ mШЪšиDgy9nиє ‰с3М›GіЏ-еšсŒИЪвБ17Ь2qŠNr#Й.™9ю…šIYŽењ|%тГKЕјЎжyТЊ`{зW1nRРŒт‚#pЩk 3Ў7т•†`бˆT{ёHкЎшЗмH$s^M{  [sŸ!Юh”Ь3:АнЛŠŠОYZоŒŠ ›QWял5)‘ЉEsю}†Ю1ыљSэиъ’Щ,ёџ РЧzJ)o‚ЇџI$Мжlю/рpБgъE$sчŠБjК…ЎЋkЖТђ5bv„—‚Oие–ъгI†ЮK‹‘Eњ‰ kkЁk,ТЮXйПКУk~†šЕХŠауЃД˜ргŒ3”љš„ъ-ЮцVHэиЖyo!OЄщ§KF™ЇбцdЬmЪ7хJшzМїњЃZоРJ‹’с§Х>:aѓ(ƒЅcхДВёѕу†_ѓЊ­ѕŒжSNpTїЁъ†štЦyS%ЊџdkPO&<!%яТ“ЩугНAбHІ4їФЬIŒђ3]kїки2УнŽuSщЎЗгюДˆ Й%њЦ7ЉK8рG'ž<МЊЦЖ‘н^[ЩГФШВ~у<ѓяJљЂ[^но‡F‹fіa9]Ф3S§5јЬX#–Ћ BаI   RšSј2Л/ У?cL‰ФСЌtk…_Ѕд‘Uћ[ыиšL4Њю<ћёЭLkwс­Є€€YЛcЮЋzTГЎОТЭFТ‡Wр``žќњ§FRлFŒ8žMдъ•ў(Нj0јšyE‘Fр=j.cb%ep9_CO6Ш.д‚O"КЗ‰жrbŒG“Ю<ъFrЏїѓVУЦт7ЪЄКjТЪ“yл$ƒž@єуMЕЖѕ Gќм6*mь,Є+#ШмJšTЎЩ)ЩEХ>uk}cxя2Zч"”ƒVf`ХЙTыRе’(жпјЎЃ№ї5QаЎnў-сYоl8р~ф=(rKВpХ9КŠ&uЇ{ЈуСSИmЭN­ЩЗА‰дeˆцЃѕЉCDВ†˜œ y[O[ˆ‡ƒwДІ<2Ё­ЋЧЉ^3мV0NЎцМyЃ1XХєŽ8ІM!†kЅ„wѓћзWSЯЂшБј)т]LћU} ѓ>е^ЧіŠжЕёъяЦМгбdЪс˜Ј!ј$sšЖЦф*Љьj“ЃхbAœРЋ@“tJУ;”sŠЉ›БО ˆЪЖAьjЮнnlЏћРИћћT…Œ™lsчHЭўХxI?Р‰Явоy>§џZђ+VFIЩFYg 1ШЇV№ФртR ѓ<ŠuЈЦ%ƒrМw>Ђšй>Шvх€фоЌм§Ьу§=bУ($Бу'ИЇU†aŽ jNиDбЉN2;вwВЩ;OЅАgк’хђH˜кІЊ8>T„0Ю‰˜œUjс%))‹9QчOэЄCУ=ёQ†žЬ…ФУžiњ(qэLО†жђ[HaД№/ФЛfEэчљеЗЇ:{ўХѓZ•р"эA!РZЎйъ–uE§ЫHОќ-ХŽѕЁE$ЎЫŽЅrh‚лћПжЊАно_мІrо"фўђРџЏ*ЗщКНžЗк@шЬFF;ŠЇYБбzŠэnNуЧ‡і&ІФ‹ЮКz~5FВ-eЗU+яJŠщћБecq­ЭK<яЛh''…ЕZя4єеt  Кі=ъŸбЗ?Qiњ-фlЦорАqјNЏ5KjБE&[К#ZПзuY­цБЖUў„1lcдЭlzgGкI 5т‡+@UœЗz„ВшХЖж“QДЦЧЦEi–№‘nЧ“ы‹Ће8ЅВEБЧTaн*cдzВћMПh%Е‚s)…Ž3Œ§ѓц}ЊСёHг4M7m” КЌЅЏnДЮЛе/Ѓ’BхВXcђЧЇ—ыS§iеЃYБ…UГ#`c<жІЇНIKmUб9вН cд:"]ЮО*EЪТф‘Ÿ?НBjЇ­ѓЌкR0' c%џзОй˜:^pТЇюДЫ9Ѕ24kИVgтer‰yiЋ1шычЗ2Х$БХXnvcŒc'є§+ъЙЖзЏІ`Ii€ŒTљРі„жЈcx•U”ŒVЌќ$МŸЌdЛњЄЕwн,љб‡VВ6иœR2}vG[лєYэйіМŠшўреыRаm5{ю,$Ф‹†ŽDюЈХqжњ=ЧKы“ZХ`naКŒa?ЏЗр*ГІЖЅЅС-оŸтBа6&ГwмИ<фы[Ё5$AЇш!ЋiЇцђА™л vЋџŠЊ=O мiГ–*gAСї­ЦкK^ЁаЂ’Hуg‘yі>‡оГэM$бяфВИ^Ц_Т?IєЪЅ(&…e5Ћщ㘀`#oЈzкЁk+TLyЅпIЇ^Чu Ѓ:ŒƒZяHѕЎЇn‰s$vЗI„ œщŠХыаH9CПCъ I­nл§ЄяЧl5rг-ПˆЈшbЯ<ŠљОзVд-6ќНмШфЧfщžЏдлYЗŠэжц)˜FQ”yља#Oдn Зл<“wyёF‘Јл6ЄfDиЌЙfйЗu{ŸldiJЈ>†”пЖТЋ*dУпЭuq›Dм;gЪИkЋ‹;е[Љ˜eBsMфЛXФ) yХ:…ФЗтVСU DvЏgЈ^нCqoРrєЋ[jfЦYn ByцŸм^мA|Œфј ц; SUЙŽъ5O С4Іщь7WЙ7ВЧЗs9я}џЫЫšeЁiЗKмBБХIмЪrp@Рј?•OIЕЖи\vХGYХ{{+ГЗ…xћT4кfœzЙу„ЂНxk7Ю]ЯƒЮюIіІѓъЌ!ССэи{џ—яSГйщр2мŒMCXщ†i[‰ƒУ@]ЛwpG­F~e­НiV•ТO3{Н+І%gЊ[С‹",— Œ.яёЎэЅ[Љ^yg9 IЩQœу?7д4ћ$Е]Т5•œ*=Ѓž|чЯмљт–AlchЎ—‡`Ы<ОbЊGkСёaqsлЭmЦХffР'Šm<ˆf dўТ”ов2•@н(Šќ]ghЦо§…tЕšШщRsVпЁкЭ9}ˆЂйвjщ­\aЄhEЙldьп‘lрв—ъ^ KфО #IЦ{Ÿ *Бgw)|'–ж|–‰Ж†#GѓЏMО$п љSЭFСoš&й:Ўy =љдD2Д2x3ЃКБю=I;3Ю,veQ*)R›еЯŸЈЉ(СVШJ3MFFdчкИ‘„l6\_5nh"LЂХЫдœЖши–=Нj>ЧRW8,ЙU+ шcњHд Ae(yC‘KG r[№ужМёЃ$+уš ЌnA vљŒа‰4r† ƒƒСФ6ЪЮ\HХНIЏк>DOДњ фCЖ™„‡ЧŒЋо”Еў$‹щ#вЂ>~чФ6тнчp2<5$узКБRєЩёTўt hъr@1В”n4ИЖEцџjц!ЈIќЖŸ ˆ}#yBE;Га^h^мL’БЩH˜aІH9?ыоЂф‰ЧЅшB\ŸхBЁ’WњcO&ЅДmXЯtюN@+јcйѓїќОђк~“mЇnxw<­є™$9cэџлаSЉpчёš‹•š1слЫьŠ”m—yвШ1ƒо–М•#&4С>ЕyuГ9МЈC“ЃЫЭJ; gў&8В~њK§JI$ђр бaВ“Q/$ЪwvOѕЊ'UщІУP8SДїЋ!VdдnqПB ŠђЄД[ПКЛ”^rGzЕ+рФ\К{{kЋ‹зX” AЮьvЋ‡УжkЅy mŠ"Etm•Гщr\н•–фp)H:ІгJАЛ‚%(ЪЌу5Ў<$Eђ)­_Ѓзі7ўСlхPЮоЕ,:~ЬШЈ2q’ь*Йk ЧЄщѓ#`њБцM\l$№-фИnNм д’рO…С[жtьь^щюbИˆяVOjoЇ]ZыšькаUH‘T/ЃcŸЯ9Љ˜uH]nЃ™ƒ;ŸЄ{U/SVбю%ŠsИ{RуFЛq nlmаЄHpљSNЄЖ—І.:kQЙЖTgv’рЇeg9ЉpЖzsДj eё]Мўœ`cяўoеЧЌДWŠр(p>ŠЯšVшq^І‡б:ДzІЦpхW"›mdЯвxЯ~+ј!Ѕъ:fЇ{мІHb>{ кnЄйcrф68=ЛWŸжТВвѕ/‹рљгІЌтзКУ]ВŸyvП$yOё>uZъ”›@ыc•Я€_БэRюцџЌ›я]|Iй›qЩ?ы§зО-єœКЕМz…šfh†X/s]9цPЪ њeujЫ‡GxCAЗXШhтšѕ]кЃKl…†yВ-#Ћ5 &†EuйЦ j=еQkА•—xю aЫЇžМЫ”M4ј3sЈ5ЈЕ"ЌЁњUЧЇzЂцц4iтbЇёdvЋ>БЈhJ`К№Cч‘ŠumЇщзVjl#Уo5Ћ'Јƒ‚п’іd%цŸЇызHnЂVк>–ЌKтїO^шљЙв­„АЬ›;OЁќЋш#Ђ8…ˆaк\ijViЃШWŽEGВ8ЄšwэГу -я,o^{Xф‚tЫЫdЭ”‘}GљеЃ_ЂЩ4q˜ч+$mн[кДoŒЖі Јi… –>AN?/qэXэмšЇm2цвъ5љ‘e>ЕкС™eŽш”Ъ5ЩTk‰4ћ‹Јu ю\„Цм–<фдЛІ|OnББьGjкѕэ7MН 8xš)FCёƒље:уOЕ‚Yєл™TлLЅ rrН*ЩcД Ve4T…ўžівIД‡DlМд}fj‰/ipі—1\Dq$lOИЄ(ЄаZvЇoЏhжїЬЁШіžTљƒJСЁD%3O+1>­кАэ]МаюLЖєЗ ~­*пЏДщ­эСмГЪBКpњчв€.SiА3/‡9ћMФw‘HcDgPp’ёaV'#ОAэN жX'†™'э@M§ЃсТŸZ,є™ƒЃоЭƒ§оТžZ_Шrdрћвз$ХKŸjŒКДhuq0ЏsоЄšO˜кІ_ {qJќ%1э-Чb)‡ЫЧ$ž$’і@ мiL›ЁИ}ыпо˜к,В,‘™v„8 r[.R'Оѓ^K &шнЗч$чНF\L›š+ЕФ d8Ш*оПыїЭBNS{gЙ#њTžЁ3мГF"ržУН{Іщd. "?w5(ež7q“_CnŸ]—LšЧъ2З›P›ёlэŸђЇЖšCёЏe,<TЬ0Хn 3z‘€*+Ј5x4Ћ'И~;<Я Ђr–JолЏpЫтŒЉЉK‡§ я^ъQщкCС ђŠЃгЮВ:“зЕYЕ{іИ›й(ЈЪ‰ˆ(ЂŠ(ЂŠV RЋ‚F8ЋFŸsиƒ•5SѓЇКmСŠPŒ~ƒћM„Љš™?вH?j‘Ž@ј>ўuZгх+ дЭ‹Rчœ ЉЃtdLІqШЈ›хŠYМ&A)юF;•)-Щ[gd9aРЏ,`mЙ<ГrI “wСэЖlЩВHхLџ2Шr?\Š™Дг4ШУт5ЙЯё€mЃаgЫїІЧl6вЪР‘—lwРІ ЊGq4a€lу<Ю*Я##ФђзТ_ЮЎ8EзЉgМгэюрџhd№Ÿ1і=Чjˆ}ю }жѓ‰†IКэ8џНыњRšNЅ C'д˜ре>ЈˆуХSmьŽB‡9№Ц/ ž6нХxЯБьkзЙиЫЬHьнъђАe7))Ды'LЕЛ9$–1.IћтžђЗІіe*;†•Б}cОZŸYнm]Г>yŠ‘КщлY_Ф…ZоLƒ˜Ž?,v§ЉЊh7r•Žтц#oŸЉд&>н‡ыўU-Ш­р’a3DР§цИi ВЗ$mНjN.™ƒФ>-еФ‘ ЅcШy‚|ѓэŠ‘Гв,ьмЩИY<™‰b>Ф“ŽўU4XДђ}ŒњrвHЂšъщJK1Œџ*ЦG‘фўе7Г*ыD#ŒьнЯjтц 2x “PnЭ1ŠŠЃ‚ьzMЎ3чLeО €?jA˜Щ’HкhЁ9{БЮ9о@O*cwєВ'qц)Д’ЄIѕОjPдF л‚эь)ЄBSЄІЁЌLюм/ZkЇФз1ќЭиŸ”SЮ—чUэQe–dё i†еqД…и*АњА<Њ}ХюbњhФŽЧљGоЋџ4зўХљЏчЮIіЋЂX{E.?QЭT~&ы‘&‘ „%|YЙ|y-(їС,Љ,oq”’юjыакpљвв)мЋињ‘хU2пХ“nN>мж‡ЁЗ=Є˜џ|ќŸАэ[qG›9,}гјўЦHиђ\‚>е tЛ[иšнТŒŠae:iВъ?0ИxЄfEџНкИЖДНУ;!“Ј;V•еъ–№щЖж–1HЏ'ˆ8э#3>БxЌэт/ОM"хі§рlрўYЇнOг1СЇ‹<2ЏжИцНЛ?.u(ЄБi3JdiWёDHЦqц8/аЌз–Wк}фж71ЦOrИу5шу%$Q+\”}ON†=* NЦ%e™q,]С>cяYнфF9˜ь( сO•kEdњUх™EЛrћzеCЌ#ВšцГЩ-лрMg3ФућЇПБ­Aј‡ ­†пћФфЪ€/qЧфћг4ќ+эЭU­Д.HЙoќІ uˆ1FЛ4ИLŒGу”p?*Еыњ§Ў”ЛяeфўзЙЌЇЊzŠ}rфdlЖCєG§OНGjк•ЮЋtn.пsіь1 Š( Š( Š( Н#НyEZ4[Ё$#ћУ‚*ЭnYmЦ {жuc9ЗИW:Нк\ќЬH‘€{yUrFЌRД>ЗЅ@Иуw50 D|Э{ifbЖ Т™\\џЕ >UЭ)mDжЁPh7Ѕˆ.жђїкjЅЅuвm3ўєюЯўcN5лЙхŽD@ЬЅ@ђфз]5г№оi–їWw%crлc^ќ?ЅvЃЧ„Ъџ~E2nYвŠє™-hё" rIђЉЫ=^ЩГВ’мr‘Гд Rњ/JЩy".›ЅЫ9рopN*ћЅќ-зfMвјЋ’6ёšрЯ$#ідЖів3феАG|рŒsTЋ§ІЕg[‡w—WН@ђF<‘šŒŒЌT(]ЛЛўUщ<+67ЇЇлЙ8кJ—кх^ЗfLгЙ^цПЛмс5kЛ›p K˜џMиЭх6}лМK§№2ЙћŠ’лd\зВФHIѕЏV[Ю ŽˆЇžйЉ(lЂdFЪшs‚Ї5ЭШ“hH€єЉ”эddЁ=Ы?АрS)ЎЁLvрЛžЪƒ4МкkЩ.gп \БЗгаВ(@ПЉІAиЖЄ?Ь ЋЭІAЪ'’џЮ­†:†*ОІВэ[ЋfIJ[G#kЊмЫ O4Ь\їХ-‘ŽhЧ„jA­л ˜xЋс ССђ‡k—П?ЉЯ8ќŽбžТЙНšyYоGфњвv‘xз˜ЮMYQŸ>w”щћP%‰dcАŸr*сД•„уty8іђ8Ј;( Vђ Т C?§œеš@ВjБ\№BТ5В ‘™œыVk?UCм ‘Рь}*ч>ЗpЦ*—Ћп+j–wvтO єtџћRkmRи\‚Љ(њ Бž*ЗЃЄB%”ЄШг~РНЫNŽА^"?ніїЇWЗv­ёO€ˆ…‰cлбžдА'œргmrЮwэе›2:+bУ?Е ёaVЫ?Т~‹moM–єХДK)nyріє—GhPhZRлТ ѕ1ЧsYзDѕ“гgЁЎб…ЬяZdCa‰ŒІW]ЪЃЬWœз<в{рОиѓP;@>GŠЮ~.йЖ­бз6ŠЬ§=ћW]'з/д]EЊщЎ6­Б%~ТЅѕэBжжвUИu;‡ЏњѕЈ`У,9knбёю—6ЛЅpš2]СlP•А8Яћ§Њu:чЋt JйЅžљфЦ$IукЕnщ‹Д‡ЊЕф’3˜§@Ÿѕ§OЕhђшКђЄWЩHdтКэ=щ‰Я%ЄfњАMiк6ГiЋ@$ЗnЦvчšФ/єxД››•тЯадН…фіOткLc>€жLКHdVИcRhњ dнYзХЮŒ‹Љ4Іšо0n#^уЙЇ§е }jЖї’p;{еК'Qva\Хщr_ќdј’>>KM_M2Z•aГ *у№ŸЉя4X[нШvЛaэ[іЃгš]ќM$ЖЩт0ќ@s_=uў‡/Okц[t"-йR=+Љ‹<5 Цˆ4бєх•ЬWЄˆFfšѕ™§ЏІНЎ@WяX'LuѕункY`7_Cи;IiЗr šхъ0KK%8ВiюрЩњЃЃlДэ[уп4РђkцјЎo:kЋ-ьЧХXп#ёј1_euД‘иiWe7ЩЗ 1šљ­Д{ыDыYI CgƒіЎЖ‡3Щ ЬЎj‹7_Je‚-Ыј‰Я’О›qnЏэЇ[=ќрљV‰ЃuЄsи­ЖЅˆŽм{:œ™aжtiЫЂ(Ч{WQХI&уС…ѕ>›ŸxП(ћэфPъ}BŠЕklвщ’Ь‹•З”ЧŒvъЉYІЉ– ЂŠ*QEQEQEQEQEQEQEQEQEQEтЛˆ1рЯ2cћŽE7ЏhDыzЉ\Nїž;џNєЦ™Њы $—WIn9.вА-ічЗН0щ] ѕ{ХоЗVУмŸJњOсїB F-ё5ИцC… !šЇ.HС№умЗI№Raаd=Њ$˜Сg,“NйmЈБ’NOАяW… бК'У=+Yъ)R[Щ|b ЮHФЮЃАšыт_Ф]/OщнCІњNб эЄ†Y‚ђЪTЉ?Ё<ŸкБMкK‹ ošHЦvЧžдЎkЃЯ/…Kw Ь__ВЧ'y’\pџ4mšЏЧ)T^‘б`q#Ўу§ыšЇъ§{жК›БКжхЗЧ1лƒ˜Z‡–Юk{ T @{(ХX:Vn­Юр€vuЩŽG”‹ЖЦ<•Y$ЛЛ}зКфџw?дзQXЦIптВлЄ9ЈўБ2[jސЌё}N [њЫЦАWЙЬŒGѓ_ZЖˆЉЋф–Цб”!ˆћ]ХЃ\Ќ%ЖЃ0CшФUГЉ4Ј~]ЄёхTm?UКšєй["кKчѕЁn]пйaбњГЌКq@гu™х3ˆЄ>"ќ-‘WЫ1ѕ_NZн‚i њ[2sљbЊwA‚йfмVCЧгиš„ИЕf3Т‘#§ХU,P“ј— в|ЃoВе>ѕi№т˜iЗOТЌџУ§ђWїj_ eH ЦЋC%БRЪЮFв>§ПzРчвc’#.ЋrФc32чїтЕп‡Пm-4иtŽЌБymаЗ)†89ќJ{їяž*нuб:'WТuNдmк7'xSШ>Cдy№@ЃЮxнMRїє”gФИљŸонkVr˜Џ.ЏЃsфвЗ?П4Ъ[ыЉx’цvџН!5є']t\ЖЮlКŠзœ§;zŠФzЃІnД+‚Xm˜ц˜{жЈЭK”fЫ†Pх;Ez•ёdйГФ}ŸнмqIQVBŸi,зЈŒўžэœ`S{ІЁk€УВуwкšь ЦŸ,­І%‰AЙ8Щч ыOЕЈчакežI—uѕь3FВХpW1Њ$`Žп;зBЫЏC&нХmУджКрˆгOг†ŸЌ[јЙ"hВXњље‡VбR{Я3ˆџrg%ЫŠoЌкЭeesЇфЩь|ЧЅ8щ§PолДHWce>FЄ’\ §J…жЕw?/$eˆmО <zр[ЯehвТ92O?еіp[iгI ƒЕЧ>љЋ‡eЅЃ$r*‚WЮЃ\ђЦн+ ~j№[кј3=§ъУЉНЋ\им’хŒр§ƒџ{лњтЉњЯCЯ &#!>@ёPr_ъ61MN3”9ŠSфУЗ56ЃL)7hаc‚kОЂ–es—|žТЌzпS[iКм %Ш(‚ў/jЫcъл›4њрu—“л?~еЮ“вњЏV^-хи1DXюih+Ц1ћжZ$hе"ЧTдЏ,еІЛЛ$$h7пњеЊ.™ъОЌušхХ‹ѓУ†nљќыQZ?УXэєуsЇ_ЪВ цr“їЉ.ŽщЮЖPy-.Ірф|гœоЋ›I6šC,жпД$ЗOy(ŸћтFœcžyЎ&ј=lЃ§‡ЈІŒТИ ѕЇФ(чYЂЙŒy!P?zt'ъЩ%ФzMБє’EЩ§ы-ф|Ќ‹№%ЧБ {№ГЉšX5Л;ХR яR„ў|џЏНVЕ‹ы}4——OK„џьђ†џVЙЇиuZw:vЮљFlSm{Ћюt,џhХm0ŽдC.Vъ-HTŒѕ]wJ˜ЕЮŸw BЯхVю‘јЕ<{эЕBWiТo'ќъщЂќDвЕћбk§…4ŒN7ђ?\UКћЅ4MF%wгтЛ№•,™вЅ–?“НŠхЏФЋ ‰ŒЈ2~ЌПѕЏuэSBзmжПqьн№joў€tнвэŸIДy1ъ›[qPZŸУ.—•rиЩGћI8#иŸѕTC.ŸwТšcІe6іКw^B‡„‚|Цkeе~!кhзжжВ1АŸJІпќKЛ…Иг:ЅLЊrkивќ;&<ћr+ўŽњ2їЉкcЇ$њG#єЈ†fU,$v*ЏЕA=Пж*ч ОвоуМ~F’бњz-*тG ЖьW9I4sg 8ЫД9зє›}BdŒ<ќщЖ…jЖŠ"^ТІxоvU`СЈъ’QЯЅ+ ˜У^PжЮ=TеЅ4ПQv\ф?|V•unГЁSХ!ЄiqYЛ:–9тš|ЁжLmєѕDbШѕЈыЈФ=?•,N у9ѓЋ6ЛЅi2ІxЧ ввщБІžМ{е{sŠ,’eк —ВфАCЮвqQзQ4JЫ a`ЉхOхZTк\ -Г|‰ЊРщљ_Qgc ?нмqA5’ћ(pЦа“ ЪˆŸЅРќ51Ђъ:ПLоІЁгзВBрфјg†№ЫиcХ[/:zIЬ'ЃЮЁ/tylK5Ћ8њ‘ЛђЄе№СSрй:Gтf‰зЖKЂudQиъ,0В1ФR?Ј?Ъ}зАЊПФ.ƒ—B2Ч4?3ЃLHSŒьШ§Ое‘Я–m“—Йђ cѓ­SсЧФчг•zwЎЧЮib4ЙpXФ<ГцWї^•™тxЙЧзЗш4м>žЧЯнcввш“јаf[ ауОЦЊѕѕŸФЎ„‹KqwfEц‡vЛ†п­@>Y<ќХ|щж}0њ%Рžм™l%9§=kХ•MZ(Э…%Оj{ЅШчd8+іїІTЌсЪ­шjхй”гДKМг (ЭБ—чЮ’О{Л9­ЄК„$ФЮ?™OjыЃ.%{ $PXь<Ћ­fєъ- Г!Dg БŽ+_l‰nвю–жЯХP<02F{Uw@М uxсqтLЬОљ4жтkФГOк7ЪЛIЯ—­:{&‚Ю7Жџ}хG˜Љ]БQ%дv­§•l ЧœПєЉћG[=Мc ЃŠ‡гТjё[;> |Rв:,Цб”эuШ4Ф§…Днf;ИŠЪ<НiО­Ѓшкмш'ˆI2Љ ѕЦ{і>еSз#ИгїМ!бFY.grЮмув“ЇРmЎQ­шУІяH"GЕef‚œїЃєХь3ZЌЦ8Є}ПH р~YЈžП†K›HbЫ0эT}їUвРŽ4.Ј9Œў!іѕЊм#|ЂIЖZ>БъM8ЃA=Ж1k–]GНФ‹eПo‚BіЋuПNuUв5і“pвЩWŸоВѓгї6Яy| ‘Ю1R6іZpёpГРЭ?иёі•}ЯŽ NЌеЌtы“§—Ѓп@‡€ц}И§ Dлiz”в|эФЋГЎс™ЗфŸl ж1ъVl&$eтЁњ5$НМўЬдg‘^c'†dqEv-ЭЋivuд“[\MОт ЪіїЉ6шk=>i•ŒxнБŸvkНYрвz†кgR#\ЏDŽ)Ž=ЮЙЌн<ЗaC‡”w#ж­QKЁ6п$$qоtоЏ&ЋЇBnЦGЯ цYЕ+8zQГдќ@-ія8ю(ъщ>[Fž!Љ'Ябњ6ЃsenгK"лВP•XЛфeжБOgp!ЖЦŽeкИџ^•šk’ЌКƒаЦ€ {ŒVЩзmiжёЎeŽeШ№;ж;дW sЌ\K…RЧЊГGЂ.Š)HЃy\$jYYЦq^Н[tžК—hЩЙ‚ЊgжƒЄќ;ГŠб…ч‡т1Ш^>ŸЙяX3јŽ =Л6bбdЩђ1hр–OРŒ~ТЄьzwRП}АAИћАzзzRуA˜\’’йœу№ŠКBj8"г„PHЫ…xЯ?jЭ›Х6ХKД§}‹ёhmMђŒht†Ќe1x($ЫЛšIњSXMлЌœmяZОŸ5Ю2C*ˆЎX‘ОEмћдќз:м‹9гЃК„ђJїЊ%т™“с&ZДšэŸ<\и]л&З•1Ч*iІ+NъRцђэйЯf‡‡ЦED\iЬтСЕџ”Œћ№+ЃYi9Њ2OJ­эeŠЕKвЎmФ‘Бљ7cQ:5м KЦF+D5чг(– ЧДEб]К2ƒŠтЎ) (Ђ€ (Ђ€ (Ђ€$|;/яŸѕљQсй|џЏЪЃшЎЧяXџр‡мџR_Э“КfэвЅ”~;Љ TŸЄћZv—7UщvŸкАшіо3сЌ’ИњN<‡ˆ ?•C|8б]­Ё№гuХгєђ§П­OuцЈёG“ ‡Т‹+ыцj™xМ[Џ"s§MиДЮ0офбUКНеѕ[бw-МrHф…чŒћsOсВъ2ƒf™ЧуПеR§=Єxі%Ÿ(ЬЄЁ№ƒћваЩЈZY,ёЂ(ЗоЋЩтё|-4њ?днЃУоG•ЦKящ‰ю-]#д­ж)‰<‘ўП:ъyO‘ь`If+є+зџqо’šeЙаnяО˜ЖЗy—+С*ЄŒѓэNК.kWІlog‘|IТwкХsпкЙвгЭХыTRŠ’[yЎyЊі7KФqп–флЎ§.ЪЦ“wж–qШmt›6R>#Oџx)эХї^мРQД[ЇЭd\џѓjъіŒЖђЈЛЗcŒTCнъ0Ÿ bsjщЧХcўžs§Nl{цх7ѕЂ’oКУMœtлeo Ю§žЅржКът ёi{'ЎёџЉV‹›yu;ЧВaШЭEhз­c#Сs•чЯЪЄќZџoЙўЅ^KцdіŸ^џќ—OџЮ?ѕkЅеzќvбtџќуџVЅu NрмЕЩ_o:“вюeš,L…\R§щє№ќPђ_ѓ2Вu_ˆ“ЂiќџлњЕще~ АшzqїЧў­]x|†о–ШUоАџСЧѕ#х?цfч_G!‘t; Ÿџ0ъб&ЇзЖЪгО‡Ї.{Ж№Oџ6Д н…u(Yc(у"ŸяXЇ‡мџPђпЛ2сЌuХм˜M:и“фЎџ]7ж5>­@#Ог,Ђ|`n§Є5Ћ[ZЧ € љдVГгУPМIќEТœрћTП{У§<>чњЫџфџ)ЛЖъ;Д_LƒеXHџН1М—XHжођЮ‘….мўЛЋPПхПKkeњcрœTGQиЂЦбЬ8эOїМ?гУюЉbФлћLщЏˆ=YгК4š'Ъи^и\,wЅPŸ%euлыпЪ•ъ.šыЋM"Iѕ^Д]2рН&ŽDі ЌŒц ‘‚ЕЙуnUБZЏСюЖŽпGѕ3‰Д›РbЖ–CФ{П”“ињ}j‰јЊƒп <>|?УŸџGхIu'ј~‡ЮZЖŠtЗ  Т_•!ƒ/ъ3ў5ВЫџxпыђ­їтПCfм\щ ў2эё-fЧчДQщ_…pќ<у>•uБП‹Pгё'еžмв жоQUгЏc›l7 уŽGGuЇI‹ˆ іƒј d;еКm7NŽoАR9ІїКдaлЭIЋTЧ~ХЄoЭЄАъТ‚kн'U…u‰$ЙSЁ‰эїєЋ6ПЃ[пiВоBЊмАDгЂёЃk{…#щ5[Ив$Й,§IЋ;ЧЉ%цсXz:Мt•Ќ:‹ЙБ’Е•D“iк­”—dЩg фgn|ЋWŽx/4Ф’ Р`ыR\іF}QZŠ;w]—ИЕYот>HЁпсЈ*qЃYкщ‰–%‹ђЦŸЅмжјЙ4ь‹гNъK+иMЉРпЦ)yzZТсKХ'„иШцЊК…ŸЩъбI@cИЄѕЭ[PЖ)р№Ьp9Х]пх-Vњ4/томP1ЩЊЗU#щзАkz{ѓa€р2љŠ}Ішš†ЂБЯЈнnNт8ѓжЃ> \­НД|{W{…$v<ц“й#жХ5+ %Жм\2mСѓ'жЄz›ЅmЅГIlЄ\ЦЁ”ЁСVЉък}­Мa№Pmv yRњ їš”КŒЮc€Ж<ђh х"ГЊkГ]tлУzХяVClp?ѕjгяLб<˜Wh! cРЌыX„ЦIОžфКЂїzг§?HT 6ЉyqсуsЈlъ>д.ЩИЁІЁЊЧœњŽ 7^\[p‘=~цГI\Шх›ЙЉЎЎеRдЩЗmЂ#QиMєm&MAЫЂќRпoНdЯ•.[сТN‘Ю‹Є\ъз"(ЭШрVЧг=…А6ёЌ—^m'‘іЃЇДф]0GЂ[Œ њЇqєƒїЉžŽжЎЯЇнFUl |ˆЏ/ЎзdЪš‡ zzН6–ЉЫ–Юѕ >LЪТKї8•lTЖŸЁ^ии‰ІfИИ“’ ќЂКЗO1CџŠп1ю ыЭLСдw3XФD[hн“оЙRmС5ъm\1SЅЏu›r.Ў(ˆЦ?Ю э:]*`tћТvД{ј5'qЊ\NŽІmЋ§мцš‹Є.&eЧpМsN2Ц;SрN1nпg=Wlѓй'Œ8№ёмЛtохГƒХЫ [=šЈ3OnnЃk‰d№дю9цžŽЉŽLлкHј=ИфRq›ŠIt;WeЫ^ЖгoC[ЯFG.TfАюИ†яDЙ/ё<Ѓ,;-^ьЏХІЅтмЬЮ\`n<Š„зa“\ж `­]Ž{ж$ž<—/ВUš;ЃKВПгњЪ­ŽЫиN1ЉоћЂXЖLё0СЎ–0йXиФ­nЙСфєŒчGЛ‘QэуW?OXѕ1”›ŒX–&’M”}CЅ,яєсІ8lў8|СћU/Yщ[ы–ccј@цЕЦаМьж7 žвžт№]'l|yљŸщњагJЩуŽљ$k]2cщэ}LЈV…<qŽ7cќПЪЈI&ГЌo}ФЛЯїjСзš€†кЫI€ŸсЎdЧїz_с§‡‰ €кp‘ф?бЊ"НN†WЮешIщ’ ;WŽеС№х>МTЬк`K[ˆG*y—жt…žт ˆ—ыСЄЕл–Д–7ЮŒeW|•Ё/ ъіэмZLЃэАдЧТщ•К:Т0Уrx™џqЊY!ЌЕејki§гMў_$0“0й\њБЎЪјTПоП&gkјЋщ§ЭAŸbnэŠfкВч/ѕzRvЄв2GУ/ZQєыg”ЛDЛЛїЎ/дЗъ8ŽO0уБц›ник]œЬ€ПЈргƒеТ№=Њ'Wеьt˜ZKл…B?—9cі!`ДЗЖсŸSЭ,$QšЬu_ˆг‰‹iіШ-рiAЫуПјзšwФ+ТЧцЌЂ‘ R9ЦqЦ}щэafЂ$b–WѓоЈP|Bг>ЏšЖИ”с‡вЧєЮjwLъP}о*HNJ6њsJ€Б‘šфЌy5Т’>^UиУнˆЄ!AР4КА#ќ)Й8 з-*DР1С4Ћ<[5ˆO,J ь zІGЃппjїJъЁИŠОЦУž=Ey}ГEВ#З=Э ‚‘™ѕ…И2Œ,‰Ъ0ѕћеbи5Щx$%.cќ'аŠвѕпOЗ)3я—оЈzЅЋЦтњ#Лœ’Z‘|]›NмСё .’хO§*вQwH[ъ˜/сb<ј>јчšљЫтVђїŸ=lпФ‹Œ`іџ?Jбўѕ+єч[щКЂЙKIиAvfF89нўрU‡упK-ЖЉx"\[]ЇФчšІУЩЗбєŽфуї.Sыe9]ьPE5‘9a”•#аŠuІBї4`ПI'=И­ЋГžXn&ИŽжйЗ ;Ѓ0} JZъqIo 1œ{д ›иmЗп ї \ eмФЁкBѓиеЪMЁZjёЫlqЖ@М;T„v6:БИщeUTщY­ЂЖYLЇё<еЇ б&љЈф`Єu5z•ЎHО эŽŒu}IіГ5ДMИў,UРЩgЄDЛpв/эMДk9tёjэ'Ьzд,p5ьїЬwHРЭ QЩmrѕ}0Ъ‰ƒщQњ&ЃђV†l2ŒsO4 ЅDkY†HњH>TЯ\бNZXИћSљЁќ"3j“т0JgЋ[Ehд–˜№ =ЊKЅю!„R№Уƒъ(ъ Rь\ мЃŸН.а_$ЏLл?ЪxS7ˆŒ0AѓЈ.Ђщ‰`‘ЇВЪ09йфkЋ}BюО(п`їЉН7Јэя?sЗyуƒCЇРЙNЪ~™ЈЌо.›ЊCЕˆТюѕІ)wЌtхС]„к“єѓ‘ŠЖu>‡otЪ№dсзИіЊђ н=М+дљ›>A'’EІIrI[jњЦЅДAцAV~œ›XЗПXѕ{№йЌоw6;Ўt{сХsŠquеzТ X“Ф•3ƒХ’ьГJъоЄАЕ.аѓљ5go.ЈтяRo–„~л‚}ЭQ-ukЋ_юf€м7ў№§@{WSн^ъХOЯ'ЉBлF=))Ё(бЈKеі:z-Д#ƒДцЂњБте-"У‰e#ёље ++Ј.[мE#‘ЮOОMy%ѕв]ЉЫ5ФKРијошj)thКœzXIQЧуњ›9чгН]—Ѕ\CtЎФчbэќCژ[_Ama1K–?яH@§sPгѕ &Цxфлт7 pПIz Yъm§Љ6Џ,,СAT‚џ*‡з:šчQC “YчНF]ъK‚"Rм.y'дг ЂYHt=вl%дЕmmЦd‘БіЕЉлшжvoЅ# ё ?‰ze№ПІЇ{WдYL{јY’ћUГSвЬrwf—=ѓ^o_ЌSЩхХѕљ&Ÿl7ЕЫќ‰ƒ/ƒ6–иXё(рН8Зx,šCЉ‘П‡ЫэPВЪa ШpXzš,т›Y˜лЁТЎ7уљAѕЎ/—jлрщnеu…˜xJЌOтc][hкžЊŸТqіпџ*šnƒ‚Ka"Шў:gœдЧF/ШiOгxф?WzHЦ?У7йъZgRA­ЯaI)Aъ053ЄкOaŸлф#€|Нj)ЉXНФвE$ЉŠїХeУ7Pѕ‘Г…Щ€Пе/Zб Я:квI.Y[‚ЧЯvs},){m 7уž vЏz?NZ‡WЙ№У•ЯбTЭnЪ+nИвЌWppеы‹іаКwцЌРмИ<д2Ід#_д”][~„ЅїУ›MJм1y<ч9ђЌOЊьѕ•ъ!ЇС3J’ђ˜юy­ЏЁКхu"v]ИzжeеЖ–ЁзбмЩ‰QˆШfš~\м'вNг!’.Jзр9nŸжEœnзjЅ—;šљkРэф!\vqигžЅўпА‰narёУ!ЕDУе‰uЕ.—@ѕЂЩ8ю5ђєЅК|ЖК„‘Ц#ŸksŽyЈюЅА}dлМn#hў–>uе­ŒZЎЏтС&! ™ѓu`ŸHѓ*G)п)ШСЄчSRcкч}ы>–‘-‹‹љїŒ7TSєФћMФшГDxёT`ИЋuєwк+ГоFZмџ:љ}ыЄдэю4їщxШ$еИѕЃ-щк!,P’кЬ;Sг^гјˆwТNzJŽ5tЛ 5ќжЫhС8тЋzІžж’e~ЈЯojє˜snт]œ\иЖѓˆъ(ЂД™‰T3 X| љчŒљжБ№љЪЮўісб­­яЙ^@ќы.бк/Дћd=фЫ"3œвЕ~А›фКfвЮЁdњШQЯ|cіЎяˆј†?#іxЖлŒWЩR]|§Ыє˜кo'Е§YWYSМšw9–vк€љsWў™‰сš8сЯ†jЗбVPMxLЄ‰@ќќЭhQУНГ5Ы7ѓzWœ46LДƒ!дSJЮЈŒw =Љ )а.IЩмœ)8ІЄFн1ыЊСђ|ЮŠ‘ыйŽšщМ*Io(`8Щкj3Ѕ/І#gj‘’Ѓo?­ЋЗ§е/їЏЩ•н_OюHєзгЏJАрFXvѕЧ5~OЄU'ЇєЙ­ЅkЩœЊойў•m‚юЄнlљлХqdZЧDХxl>ѕѓяQЕэіЕrgWg@еЛДэžќе;Pбm.ЕI.гtBBŒ™pѕіЂ<л3;m2inФ&д–ЦpŠЭпЖFsާНГS–9Љ mbаBч$ИпŽ=<Лg’kBЕ‰-гУ‰Ÿ2;ŸН?ƒ њд›3Ы~“…_{M ~Чgбўщњb&9Iф ЗnJ†$zdŠП˜`Й9‘rў ањ\LЙˆА>ќвБвEмuˆ™АЛ70Ÿ љу<№Ёdа:кЪѕ–пQScyЅ\™єЭAБШ8<*Љ48Е[rW rМЋџCE&&Н=9QиЉэ\\л‰T1ижIб=cqЂ^3YgkMлUЗ4\ує­ŠнЃž5xи WGЬнKС­нЂ љЧмdџ1Е“У™[$ЦЇzю!PЬ<ž;ђjК5Ў/ƒERhНЕЃЭd2ЦИ|ѕяі=ЅмnіюVcЮвqЭ5бфИ"kLЩЧеТЌ:{йj)‘vJ‘Ў)HЈЇЫo%ЌъЎyЧˆЃЋNЂjPЋ\Xъ “ѕ§яНX+HЃ)pъ№уиЈs!Б‘—LКQХ~е%йькўЇќq5Ж Є€вњ}МПк–їq1‘$\8ЉїOСwaФ wbѓ‰–eќkш=*S7Z ы>›Ти^&;ЖcщO•Ы"JѕX[iвhјИњ•GzqЂk‘\л„”†v5жЈлkЖ"тMЋpНъ ъЮ(/ШЩ‹Ф9W^;ѕCљ2_VГˆ_лнZŒ“oojЖ#Сž‚яiу5KŽлV†0Ucžйƒ`в†гVд†ј1јЫf™ЌŸЖЙГК•Ђ†њUS^гв џЉRw1ЃiГщ—ћC—‡<Лљг§b[KЇeТ–”UІFщКМKЧ) G‘4їQ\X–@7‘TЭ^н ЙŠTQяэRКfІvmсИЧ4”ЙІS’йmяf[…Тя;NpБЉЕщвxээ­Ѓ(й+‘GUЩ @ь *ˆв5ћm>A)ГN3ѕ“лђЊokЋ&JоiзWБ™-Ђ\ёИЖЉХВ+м#уМrr)}oЋцд-LD!CпWyџћšŒхA"RKи Њ›Оž99мд_ŒљЮуп4Sv2fзY1ŒЮ;c]ОŸвЂч“Х™м(PЧ8T•{CmэLtО–кЖЋYАЪЂ`sХ}№ус№Дщћm@–’Ю|БщXЅеyGФeŽqмвнeдЖ]Wg’ \(нмS„Œ6н\Ърma~тКx№yziНПЉ’Y7eŠО пXXD>"ieЖ€РžEZ>$щs]єœжіqЌЎW?IЭVў"tѕѕІЕRй–™‚ёчЪД‡§MЇыzjЋЊ›ц\vЌ>’}~ьОћGЮ=ЋЯгz‰†ш4KЛ$0фй,КчD[E–тTYTd–фд—Х.ƒБжДйюmЂH.т•”ЋлŠТКSMЗžk‹}EOˆЄ ЩьkfHтдЇ–\5нСЯArŸF{еšfЖŽЁ`F7cПхXюН Ве.Шэ'ЈЄгюP•р e|Њяб}HњЧTG-мaOЅb‹ЃtФвоO–FњqлšoЇh–kdRТRrU”sИT3ъДљSЈѓеАjхС9екЌ—Љb’.Щ'>uEд:_Pг•fЖ™L/ŸЄљQ:зЯСЎGqxЎ†#Д+pИ53ЌuQM-CЮу Еxrbлхѓ}’”у+пХкTvбjeЎЅРѕ=ўедš6di њЃrOnе)ЊiM. ч?3ŸjŒвЕ&љWГИc’Їa5Г•љ}pбDвћ2ERГkY нГLЊЯдSЌа‹uOЊ"NучUŠюa›œ-œŒбQ•"Э№њ7QFJ–љr?ЮДŸ‰JcžвеŽ*лIЖЮDh˜ђр Ѕ'ё№Џс0щM нhя*ГІтIкjSF3щг­”ЛхOфr?c]t}ЧЪtвЫмX-Є2ЊГЦŠфqEcЛЦ"ЗШvЊcщ—љ’ѕIŠ3ќ4їѕЋ{јŒ0}k‰0Š[ рdт’рHЌѕŽƒBП•ЮцŠкFђТš‚шЅК‡ЇьfŽ">§Є уеgъ;Х›Іѕ3Hђ+хєš‚шй^~‹В†жb“Eтdzхизj?сRџzќ™W§еєўуэš­УHвЉX@ьIЩІ?ЊKms"J„HoB3хRVlŽтсеМѓШЏu;('RаЬЊЧгŠу—QоЙ+ОjlmЩк{ёLДЕ;гLЛчŠSNЗЙ RH’Ф}O4ƒ]І™tЖїИ№фQ=K[Ч—ЫsNЪŒр|јЄ-™\3)ШђЇа(џ*![HОЅЦ)гJ‘Щ‡8ћQ"Љ 1яL.я99#ЮЃйЩ+ˆ{vЧlgU‹˜'`ЫJ”Зджл .pЧєЎ5Qб ˆX}Gг\уƒ)јd"ЛŠэmoИ­р§фї=<бN’ ЦЧгвЁ5§}vн!З8tprG•ЂєЖ’š6oiхWъ>ЇЮ‰> фЈ—xУ/n**щmДЧ{–8fђЭ:дЏ>ZeŸATЙšѓYНУmЮ1ф*)S-к=ёПF}ЛTvЈоЃбуЙЙ[І€Ѓ•Љ;aвь@‘Т<д/Q^Ms:tШШд3Э ОЛр ѕiАЩЦ­ рQ6}ibpLЖŒСsмŒџfGw›”†N>АлГхW‚ZЌv=oqaЂМOљ№мTrЋƒ/ьХў%ТёыъьИWŒ`њ‘œџT+JјЫbmЕ˜рф’Ј'ќЋ5ђ­vŒ™еM“;~і—€x„!уtšк;Йз)#8ЩЌаGЌ:fВ‹mс\МЊыЪВšПы†PЫФz<%qq+ЩžсšЅ,mьm№‰d=БЭU4ЭZ"q<э"џ)ѕЉјu(р Ц›TљЭi‹ЁX~a ЮCLxHЧђŠqФ,dљ€­$ƒ$j ™$J џ3.:’Та˜™М{ƒє€НЉ6‚ŠЖБihnmиЦхЮFxaіЅэЏІж,нlцИ‘ba]лsифS­W]АžнЃž‘Ш8*3ŠКќ%глNбю%hfт@ШЬ~ІLq§jЇп'JЪ^Ÿ{?Ы‹ Wц-%‡Ф]Ѕ‡‘цœЕХжžsk8И‡б›ъы[x/сXЎЂYЎ9рзЯњНьvкд6ЛкrЊYЮ@ЂRкЙНШНмѕˆxŒR‡ЬbНГжmf„Єdvч dж{cЌЕІJA1р–фтМўйt`mб ѕинъ 1*4=V?џg4“GѕШ0ˆ;г;ЫM>гNЭуAp#б|ъq­оЪИљ‰qюеѓHэЙ혜“JYWАPыSЙYЎСg1Žs’i…U-иТŠ(ЄEPEP›сюŸЉекuНРЬ>&ц sŠњчZЙ‹Bщf(0Фb5єЯjљwрѓAUxГВ=ЫИуЬgі­гЊОgЉѕHm­I[X3А>FМЯ‹ЫvuвGoУуX­{”§2кMV§ŸDЫ’;TАеЕkШ n €qZХОo2к@UDgqЧsU‡v–‚ЮітьaкvШ#оАC=FR_$Žвg~ :$QЕЄТ–ЕHйыš_QТњUШ]ь>ŸН<ъ9уЗЖ‰c1KєŽ=jyвї:NГmЉAŸА'ЫЊБэЙК~Œ”­U. wПЙвЅ]"љЩPиŠOUєЅў Y"hž4Й<<рŠ”еДƒЌOЇо( ‘вzц›ќZ_ЄYА ŸљSЦдВBЛОE."ьљх›.UxОŸ4ЖwqO lxЮрднQ‘Въ@'ƒŠP‚=ЋеДšЃŠЏГъ/‡кќ}GЃ@ЗQЋБ]Ў?ЕUю!N‹ыц“aŽЮу”ђљжw№пЊNЋEух­˜ђЃЪЗОЅВВъ~˜šттЄЧК6<8ѕЏ7Ÿ‘‘Х§—љєuqЯЬŠkВz+˜Е­8ЩlщЖ@@=ыч_ˆ%яMky;лШл˜ŽйїЋЧС;ЦЕ[Иfœ•BѓžЧвЅў4ъZєф‰$bF˜эŽЦŒ-тЭЕsщѕ -аОНHя†КШж4†|ШvоДћ_щИЎчŠшТЂDч~<ЊрЬАСгЦ4T2—;<цІ5]G]ЩрйЉ@xБ‘YѓGfi(qЩn6мЄзiК~ћ‚@ чЕgЖšŽЇe}%шџГЩ\Ргm[ZПКжЃƒX€СС<Zьz›J‘…ЃЉÑю–)a1нdwЉОъŽюЎtюІСЖ6;yИ5žk=qІuǘ4Ж­ѕFЅi:>‘iP5ЮžJЧ(ЩQи‘ъ=8м]ArƒsFy4Бъ|‰Tza<^bчВЅa%ОЃbіC;ЪуГЮЈDВНйTуŠНuœ№h:ѕФ„—‰ЖŽоѕдЖКВШ$миЮGmв=’Sf_™NuК.+ДU4xcе.gYёПС ,еBEй#/Ё"ЇЌžKAX–UЯеŽјѓЈ)[tЌGbIЏA‚-Iћpr34тНЫїСД­ЫŸXЧюjџёVRкьцFЯзЗђT/‚юБѕ ќ;уЯъjѕёŽ'Mv§е „И @yKэ—тСєЌ—7ЖП#o"Џ†лВ|§?­[у†kі‹ЩaТЎk+аѕ'гюRцO“Џ­[Џѕ{nі6MƒЙ$‚П2=єZuОgL,2j6+ќщ2ъЧ ХљЗ0nBрwƒ]щЂ'ˆІJœ§JнСЂ„6Мд:~ю$Fн4.џс9Јž–k”в"x €ЊмџhѓS:ХГлi—Ћ€а$лЯс;OojgббgA€ŽK#у?їšЛQџ —ћзфPџъЏЇї\ќФі›оD•‡љз+5ќq)1‰TŽъyЉ!џc–#…eув‡ˆЅ‚„ТБеЦ.Ђ,j’3еLrvУS™ф’[#гqУ#эJлY/Ы–И˜œ’ТЂ:„ЕЌ1М!š2H(о_шБ|>šт§nЬЈы§ЭZB˜Ї;Йч5™єUћX]Ku%ёЉяSкЏY@БIМMѓ8ЪgБџ&Й$Ÿ–щяээфX&ЙŽ)[ЃE§Мв:Х23Ѓs‚эU.GПЖљ‹„oЙ;Ч4У]ВwgЕR&FЩ)С"ŠбkНЎ.YЮ77њmс$7Ю"~ј^јїЊІ­Ћ#Є„Ѓ ќЙќЊWъfИBю$Œ<~•$Н "ЖіDыЗ/q|э!Ю>}…Nќ3длHъЭ:ёАU%иеEЫJќї&ЇњvЪYЏЁ ЄЌQ4>ЈpцVNјEљЉfE Џ|Ьєe&БzзО6ЬŸc$Оѕ'>ШEd"Ѕ‹ь”ъUdhђŠ(Ћ уЛkщ­у(Œ6ргјК†ю4U8ѕЈZї4дšш i5Љч?ЦgЧSŠwЇоiŠъз*Фч'9§ъМkЪjl †Џд6BэДыe† ф nЋ ПХyр‰=>4UN+/Х/2BqOВћ­|IдudŽт 6чЙЊ1f,Ч$œšђМЈЪN]$К (ЂЂEPEPEPEPEP–…vіZЕДёХ\}?оэ_RЄ„Z6› ‹†+4ƒђ;ь+х-=‚^лБь$SћзйНu%ж™ѓf•OвН—^{Ч#ЬдыјlО"+Nе.Ўю&Вž ‹{Єqф}*ЉвЖгЖГЈйŸ§ŸХ.?:ВИž3VКЖc$ЦSИ{*sв– ˜žOІy†Nk‚ЅQkмъ5ЭЏt„›РGMЫнь=Њ>=Nвўіm"Dњ–<фŽе=e<БяљžTqŸZЯДХ2ќEПxЦSУђь>єB)І§6LєіЂЖз’Yd4jћŽiЇХH&}РˆЭИёUЩ5Ћ]/ЏfŠi$И'žЋ\ѕО•’ ГмЦ9ЋЃ†qœ\Uєб J-;fЉ0šЮ5u $?OмT6wsŠ‘Оs*I1РоФтЂйЖіЏM‰pqђ>I^Ÿ…&еэc‘€S Щ?zњЬ[ІЅвik(Œј{8ћWЧ–юёВЪ™ AUЊtNНд:„&;{Я5ТГЩЎw‰a”Ћ%№ZIЏГъ9k ю‚дVVqqdЭ–uŽ|ъљЉ+­њqрK…3мМўP]U,vН8l'“цЏnxяš“јв#Jг>f`лмdœз6SИљэ~3j=О†]gЊЯвzПЫ….QЖШŸНj:.ГqЊF’НЙD#мжaзWvЏжВј‹…r=jдacЁhЈ|Ey1єЊšЛS‰фŒ%ќLЏд\“|!ЯФ­>жчB–с˜GsмицЊ?b:ДLЗЖхЃ+уПчQїZŽЏзW‹*bВ-ЯІ+IЗЖ‹ЅєDЗŠ=Ю Њ?Ї’єј|Љ;“pGј™7Ў—тDkЈшhчL!qИџ-0Зы[§;Ni58>gwH§}1^u<к€б x˜ђЌ.a^F­й•O<ћеIТ8гШЏŸъMюrЈК*ZнІЇ;ЖВ› ’E§ЊЋЌdаv_щХœндœW^Ўг-я!ЖёbXйdШ cJ‹ыЛЛ{*ЫF‰УШЬ3хЇO•9ХСpћ^”U–kОзLЮ$ЛQ/#*Ч)CЂЊЇН\:ГO‹F№™ lе@ŠєZgбщœ}EЉTЛ/ŸУжЅn81ŸмзаџДˆ>rЫQ ДЅЈWR;:(ч?b?JљŸсеЯ­Вvо ч=Ач_XuJoсмg|к|Уyяєі?тЕ џ у/ш]ќ ќыя>oе4[$Ќј-lпЬ<ОєяЇ.ž+Ч…0Щ*–уШŠИ[ЊЬГщїTRЄŸCTXбД]wСК\ЦЄЎ}\“”v4бkДМŒ8ŠXЬr&x~эљгїДŠфЋУєH9рўД‘ŽиBЖ! ўtщ,œЈ(pqœŠeD~БуЧЃпЄИ#хфх<вd“tЎ›)$7ёуИодїWŒŽ›дќr­‹ivŸ0vусцЃtѕŸтѓЛџ —ћзфЪ_§Uєўф А†7'%ЧЕzі6ц5RЄ€{г‚>3Ц=+А„Џ fИЦ‚6цзlJЖы’†ОКјNaƒЅw$О,І1''дWШuОќжVђнДщA3@И<•>XЎ?Œт”Б)ЏFt|:iMХњšЏN"MЇЩтКwfp~єїPšвЦ$W+џd жmZУUЖx.ож`Сг=ˆэKлХhЎзwЗK0 чЕycЗ^ЂZхХэеЖ4ХТмеWЁ‘сдu {ЙJоШймнШ­>mŒЋƒЮ~"YIf‘kiЧ†РюcЯ5f.‡юAКчиŸсJнъѓо]\<‰#$œYџPєщаѕж‚ѕЄ6Ь3З}Ёj >фЭ–t ЯкВџŠ]EЅъšlаф|Ъ}!€э![tКœЏ"ƒЖКњeХ Ў]N џХ*8ЕG74ън&И…š5-}ЯЅ%qŠ›і+аB—Тs%o‘HџX­;рЪ —šпxžѓЌЂоldХ\ОъыІkАHX,DѓŠЫЎЦч†QEкiЅ4ЫЇФ-.яGъ;P–F’”.ЯJй-q}Ђ,~!DtэлЪЂ5Э6ЯЌњwuЄ€ЫмцSn”жЃ{wвю‡n6:7ŸИЎIn„WЗфt’хВЛ­|>гІi0ЌГ7;СЩЌЃЋz2їKIхiиW–Hї'1&GН/%‚н\ЄWeЃиsДdћдKу€Š(D{TЛLу?ЅLљ[Dw|+:RЧJk[cр;Э“œкšы–ВјЊTvчG šRŠЖ0Оъ(эу""XљU^ыYЙИ—,чo|S—гfК•Ф1̘ђ кЅzgЂѕNќл‹9йРм)мGЕ"Іч6E\ъ2!TSfдЅu&FЮ;sVОІгaГ‰-Œ{&„aƒ 0і5C” эZ’І,—DЎ­4r)GdСчiЏЊ?ќ>uZž-Œ—Ўa}ЪЎy*{уэŠљ75lшЎЃўРМŽъ7•fƒ+#cV|+$HЦ[“MŸvљжWз§yЖK7NŠ9`\Ч<Єч$wUжšш?Д}KEožY!М№Ш`˜*N;їVc ЭЅхЬЋnЫОEmЊ<§ЭsДкW75зE˜1|W/шfпzж}QH|4Š$ˆDБЎ@Tѓ''џНeоuЂuпF_Y‡д4ЊЧыT\œvђу§+;5иЦ’\3Љ)ќG”QEL (ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠыЕOєWQMг}AmЈ@NдaНGѓ/WќшЈЮЩ tЩТNR]ЃыщunІ“NдbešФЎьрћг›+NКŸТJЖ3пЕ`џ :†ђТI ‰™ЂBЁф0>^еПиъзц+›f~ y‚=kХk4вгdpОGƒ*Ы$AѕЎЙ&‡Ё‹DSтк•)ЧЋє\V(f1ўјЈŸˆ—аH„FО%Ц#О*GІДј!бэфоrЈ7sU:Xд—vMs*)к<šФїMЁI.ШaрИ=з5`еўкпi’$`,Ќœ5!omq'W%нЊxv 'ћеwКОK[I%“#ћš–LвRR‡Oq(&Љђ`zF—yбњг[koАŸщ2c+эWMGЁЮЋh.4іˆФWWЕYњФCЋєЬПТ$”.2AіЎўцгэšQHЂБ;1уƒщYf­gкЬwqЌ`ДЇpƒЮЎїmwx‚AЗЕЩюj…Ў_лщкЋAxcT!OЎ{ж]eЙэьЛ;Uёјѕ–5ŠТ%П•PКњъ{HЬrlPуГѕ5AнѕœЖї8вгlqЎд-ў5Yдѕ+­JђV‘ќГх]}'‡NS—_‰Ядk"туЦN՘“\бEwIcшИЗj?їTўЇўUє?УЙк’2…l<ёX7BЦH™ї— гПю?Jкt9кжнvc#œеF^x:z5№ђH]ЛЯot(љмѕЮjМX i N‘џYЋЦцЕЛ™— хNAЊФљљЖШруѕЈ#\Чс–P3У.F}EyvЩpXMf§щ"ŒЩCХЖ!r9CЯк™ +šі‰БžюЭˆ(ŒЬ;pЭCh7W6v1Еѓ„R4RЌˆJВœ‚<}аGiеzƒrъ—б GgbИ3‚IЌбыІuќ;*iу}њšŠм[fMФžIЉЎздDіїЫБ§-фE:е-йLwh^2иYqћˆЙАxзƒиЉђЎ>шфŽй#ЃM;EКюўЬЂˆ&\Џmъ­еžЃq‚о˜ё‘эQМЪЌЄМnѓЋŽЉi5ЂЌю™УŽЯ%Љ%dЏzЎ‰ц­*(c]йP*єcOеZыNк oХЏН)m…ŒК\рІAЭLYы>ъз*V\mЫvЉRqnНFеŒeъiь†/,&y ѓUŽ еЕ-KRВЙ{†Ю'Щ'ПоДtдlяdњФNУ‘Š‰еЏ!И‘эR TŒj”2(Лк'§GRˆ/4хЉR €{­‰гкэюUUUљЦ=j8ѕЁЊмУdюЖБ€У#ђЉyfжОNF(*1œU›%ьЫБZ—h’}DЕЗQ,H8ѓъЛд==f–FXcI?ЧjCЅlЕ-JёЏ59нв&њИZїЋuFЗМЗ]vЁ$ЈєЋaЧ.ШЪйтсmѕѕЈДдШŸВ!qњUzпЈя­Єcœф1S=UЊЦзLYKBАЊQя^›M‹|?ˆŽ.Ѓ&йTv‹тЇ Šb$ЈђvЭVѕ­^яXКk‹Щ 9ђђ=ЋЯ:бM‹ИF™DѓфšЉ>(ЂŠИЄ(ЂŠ’Вж/ЌUVжmŠНО…>ўbЅSЎ:… џСўЌцŠT‰ЉЩtЫw§aѕG€aўгўЦWхтђџУM_­5ї}э–эŸ?јjЙF)Rі%цMњПМАŽГз†q}пџЩўѕzг^\тћИСў №еzŠ{Q6^х‰КЯ]kgЏsŠU”У#љiнФЉгєбЌ5‰­tђwm…NэпL€o^G“ іэХThэSміyхЛЏKїњƒ”›ЖЫЗ§guƒiQщвы“Эk$xёЧ#œ’y‘”Лr|ЩРуАЈizГY•З=цуџУOђЈVЂ—H~d’Ћ'_ЊЕ‡]­w•є№“ќЋИzЛ[…JХ{Д№“ўЏбNМЩ{–%ыq_pННсŒџєвуЎњ@QпРўЋбJ—Аќйџ3-cтS cRэџєёУ^џжSч?кC?ўž/јjЅљQE/aљЙ?™§х’ы­uыЇVžѕ—Бљx‡џM7Иъbу§эц~б џP‚НЇH‹Ы'л'уыv%к—лWгСўXы‡џуџŒ№дЉ™/rЧZѕ'1пэ?ќџсЅЯФІ#RуџгХџ U1F(ЅьKЬŸЛћЫнiЏЬ1-ъ7оо/јi(:ЛZЗ›Х†ь,žО gџІ ЈЇH›/rїkёgЌэšпVDfђVч8ћЧPњЗZѕЎj‹Hфь#?ЊЈХW1^RQŠх ѓd§Yы1f,Ф–'$žцИЂŠ‘ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(ЂŠ(Њ’аu{PŠюЭіШ‡$y0є5œWДЅ4у%У%8ЛGвн-з:gTX$.‘^4.qїХIО–‘e ‘MЙкн…|Е­‡™v*qŠ•ЗъM^<=Bу†BEprј%ЩЫЉ{3Љ‹ФUTз&ЧЎлЧk+x.‰EWпPЕЗž&Нr-Г–џ*†бz™яa+vŒdйqЭUњЃP{Лї@6Ц‡Rгш›——?Bмк”ЃО%ЏЋ:Щѕdа[‚И6<{‘л5Ц—ёKUv_GкіЩ5žyб]Eсј6(Ъ6sžГ+–фшб/К№ЭЈ%еДГ[И*­-жём[јз–%Р-њжJC,Ш'daиЉСЊrјfЧjTY ~HЪйєXъi и ЇЭќ‚лxѕоЉЌEmЂм:Л6р~фж:—W ЗчeЧnM%.ЛЉMŽKЇ(F1XПrЛNбЋї”kІ]l:–ђл {tЩхWv*/ЈКЙnЄ&еwIО#пaTЧ‘œхЩ'мз9Ў”48Ѓ-эrc–Вn;QмђМђД’Жчc’i*іМ­Н; (ЂQ@Q@џйmricron-0.20120505.1~dfsg.1.orig/html/images/space.gif0000664000175000017500000001515010630001212021626 0ustar michaelmichaelGIF89alШї„‚„DBDФТФ$"$ЄЂЄdbdфтф”’”TRTдвд424ДВДtrtєђє ŒŠŒLJLЬЪЬ,*,ЌЊЌljlьъьœšœ\Z\мкм<:<МКМ|z|ќњќ„†„DFDФЦФ$&$ЄІЄdfdфцф”–”TVTджд464ДЖДtvtєіє  ŒŽŒLNLЬЮЬ,.,ЌЎЌlnlьюьœžœ\^\мом<><МОМ|~|ќўќџžџџџm‘|…ичё|@F` HN1€o0 t0 €a%l fileщ~ WDР~0ˆA~џРџџ‡џџPџџџџ*џˆџAџ~Р›‡ИPA~у˜еНAE~ИŽ`т ž€|в шцрN|€кl Jу| ›P€иlурNlEеA~єїсауј…ї+ƒ|hюž€||pџџ‘џ|џџ`џžџ€џ|m)IЗ‘’||JшIєр€N|4Hdыƒ|џџџџџџџџ€lДќуф4жdXƒL|Wјмєїф€|рwую0O|€lЗх’|џ4џdџƒџ|PшбурхNу4Еъdџƒџ||ьјˆтфх8чшdрƒN|8ˆ4ddƒƒ||шрN0їЬœuёЊК0џG!љ,lШџHА Сƒ*\ШАЁУ‡#JœHБЂХ‹3jмШБЃЧ CŠIВЄЩ“(SЊ\ЩВЅЫ—0cЪœIГІЭ›8sъмЩГчЮ!@*"„ЯЃH) "ЉгЇ—…J•фВjе ТhеЏIlKЌX­eгbмЪvЋЕpkžЭЗ.ЯЙьъ]ˆЕ­п{ЃФ+И0LТ† Гѕ№Ђq[›&žм1хЫ$-c†bk‹‚ kБЙtдБІSoдЌњ+kЖnMсыкИоЮ}/iƒ.‚ЛшР›їютШOž36W ˜KџБ|zэъжirh B„шйЏЃџ;y˜ќj… сїљЭцп_Ž/Ÿхƒэъ€сООaњў`€(}а~ъIF `.hWƒ–єС 8€рV2DИ„ІХa‡$Mx [ жѕa‰UˆтE#ФBxА•W+’Ѕba‡cI!РAV§”žVГэ˜ЂŽFъuc’ ЕА• ЩЦ$UKN™S•VFЙе)рY–Na &MbŽI [A—Mр%’fю„tжi'рХщгœwо™ЇžНР]?nх =с•_VE"Њ“Ђ‹6ъшB5,К /LњЈЅRjz%ЇDzкP ,XjCІЂоi~’І*гЊъЕџъjA/д`CЉ[й`У ГоєТ Р+ьАЈі*гЏУ&lБЦ"єТаBльДдVkэЕиЎxТwФe{гЖtыmMрŠ;nAdeСЙ5Ѕ РКьЮф.Мё4oН2н‹/LњюляО-§ №JЧ[№Р(ŒАI л№Т#= qHc[ёФ]Œ1GWлёЦ} ђE"7[ђШŒВD*ЯкђЪН sC2‹ZѓЬ нŒ3B:OкѓЮшЊ єG?#Zєа?=Двq2НГг8C Ід0SНВеSb=Вж smЄзƒ=Би5’НАйЃ]ЂкГэЏаmУєFnу[w„w,їм!яџ]oоь~Ўрю­сй".Ÿтз2n­уфAN­фгRnхЦbоЋцЬqюЊчЉ‚^œшž’ЎЉщИЁюЈъFћ­їЛ|гэzь)Я>ИэДGФ: ЛЋж{гИзhФS@яWП›–ќ˜ЫыдVYЭcН•гл”B[)U§dл'й§L*ДЅ‚іС'^~ю4Ÿпс ъ‘{мяЃ_бї1ЭEСVй#ЏўућЫЯsџB‘Ж‚АаO0, t=­\Р[YўтgЗњ lIј„vNQ%ƒzск,XіiЅЙ_V XжХ…‚сI,ƒ—ќAE† yР’‚Й\€Yuб!џIшБ'а НNА DˆHщс%t‚D‘ˆ,9СŽ—TёŠф‰ЙИ“ lЅ ZтE+ХrcDЩpŸHю3ЈcbцЈGžм1Pб€VHPl%сЃБ˜<і1%˜РќШH“<`+исe"9ЩŸTВ$—Ь$T6А 0р”Ј,ЅA8IЩ0о$”šdЩ f0‚шDq˜СxUšYжђ–ŸI.wy$PeeёЅ-s‚K]ђ&шРbйЎ`‚d иmЂ9Mœ ›кќJ Y§€›дЄЩ7Гi“T`7!м*0‚tЊЦ№Д‰<щiџOЇ’œР€B№OkvdžѕФЩ zP7ЪЫ ЙA*аIо,ДЁеtхK$JбВR+ЉHEj‚­ 3!uhО šŽV4''(@ žЩ/–Zф-H€Ѕг™>TЃВЬщNЫВ$„‰ZqтBzJг—м Ї:EЪbа2ІЄn#Aњ‰œЉV5&Xе*WЁbF­ 1!$€BМjе„й”"YнЊS^а‰`oШBƒ—f‡Ўv­)PQВзОЦeœ ЄB ЉD6АwU л ызЄœ 8)KаvY U>—ЭЌK8›ЯжхŸŒbH!ZЭтuА%щьgЋ2џФ В Ы+CP Д`ЌфЉэm7Ћл…№жЗР­Ъ FњH„Œ”M.nKBЖуўV-Е2A–щVи‚ф=0A І[ŸьnWВХ…QxЧл!ѓrї$`ЏxЩћ• D@=HnGМЖ8`ЖВ/~ѕЫБєЄПџ]‘€ѓлну•СŽЫ,`|RзР9€Tp]MИТ№ХА@4ЬaшУЖŠˆ@т ІV №J)†сd@ hj`,у {7Ђ7Ю1“xьW7Шыc?ће^ѕНИы3{й3i@ŒžŠс”р1†|х3ПпЙШѓЃ?§‰UљOw>џЖЙјњ€Wр@ к*Б6У€(§ФЮŸўѕЗоЛю‡Пќ!FѕГП|љfђ)@  %|ƒuh(Р{CC€ˆ€\е0 ш€@˜€Aа€Ц(;|Б7ps `€"0Б‚tb$8;&ˆ‚*Ш7,8‚ иj1}3ш(Y~%0Ы €Дгƒ?„~3„EИ3ƒ„@4aФ„Fш)$ Pме/пІ€Дц?W˜…[и…rѓ…a8†ђS†ZШ…і’††b|“В6€  І/ Ї‡Аƒєxˆ}7И‡‚xA…И‡‡џј>‰ˆ# АюbG@h7ˆшB‰–ˆ‰YЁ‰!Р‰žш„Йs•x‰™И‰ј‰еr…їƒtJ€Pd (ДPЗШЙИ‹НxПh‹Y‹КШ‹дrhэQŒ сŒаYв(дјжh-…:№tХипŽзЈфЈцШ.‘—&zчXэИяЋфˆPођzњHY„.`‡ƒш ЙXіјЉ I™*Я@р&02№#$ШF;™‘YŠ ’"y%Љ‘™’‰Е’гвf?BVt//џP щНH“ y“B““;i ш“6™4AЉ“YС“ГВ. @ ае/№”њШх71N •R‡ёS•\ЉЙГ•W9•r–W)–ŽƒYA%Р,3 Рv|У–љ–ф7rљ#uYv8ƒ—n —|9—9)Е‚(р7W0/PI3‰ЙBŒЙЎѓ˜‘9™+S™Йx™Rˆiš’Љ'0`Ј `i^yu'р p^8sšЉy€Ќ) ѓšБ9›ЊиyЈљ#И‰}С›ЩH›YR}mЉ—Ф™nђ# }Y‰-Ъ™—Vѕ0ЯЉв 3е9˜Э<йнџW#л‚Y>Р™КY>)Œ0Š#Sžч™ž|Чž%рž№ 2ђPєyйїэ™љ‰#Мхžўй'€ѓЩŒѕR Yq -їŸБ у„ž/ЊšњQfЁ К"=˜Œч6Ё1*P(E(Žми”HЂ№†”†Ђ*š,Z-#*›%:w§CЃYБЂ rf00Ÿ#Й—ўlю <Аgь"ЄDšyJHЊKЃЭтЄќYЄ­ SšUъ ѓ*аЁ&у$Ін4.a:ІЩцrgšІ*АІовІdЪЃpŠІ:ЇгiўHЂ2Ї2>J—lh-ЊЃJDƒZ‡йџrЈ P‰Кt?АЈ…њW膑Zzƒё5ЄmЭR’™КЉ˜)Љ?рЉ *ЊЦBЊ ЉB‡ЊЊЊЁjЊЉ1P(bšbiWIqЊ,PПЉ'ИЊЋ*РЋoЅ ёЋYЌУ'ХКЇШЊ;ОЊЇЭ*ЌвA–ЩX}z3  CЊч*к*›мŠpСє­сК—*хЪчJrЪКъšькЇuQ{ZёЊЖъЁѓКžЪ˜ #Ї)њzžАк7Ј Є2А;)[ЊшЖАBвАњА­Q+ИЂ0­БњЏ q!€XЏЊžCF*єшБЕCБ!В$t€ЂБ)jсВћџ ГІa›˜ ,ЏОж+ сj’Я ":kЏ=‹ЏF В ДCЋ‘Eл!GЋI[h,kNЋP[еP!pЃPњ"АіwVкvЩЗЏ_ЫgWkcЛГf›œi{žk[km  @ЖњЗ“a_ц) Рrс47Ћ: В тЗZKcwЋ{†Л‰Ы$Œ И‚ћБ!QИ‡ •[JЕ  ДЭYk™К ЁЫГЃ+RsКŸ™КВК,аКЫДЛ‹)ЛU‘Ѓ`ЛВИзЦ˜šXзч О‹РЋb‘ #-`Мƒ”М ВМЭЋeЯ{Х{МNWКі0џ ™ЋАУ+‡ РЄђН+ОЙ•НqОщЛОg[qО№ыcхєЛі› ›TыbЮлПБ0Д АšЄЛЬ,`Ри‹РzЕР\сРСHKСЎЛb? Р ЌСUq9 ByН!&П бв+ .X&ŒТ ЉТёkСсТЧ 1,3М8`УќЋ:мИ==Фо$гkэМк,Б p`‹œHЩЭџ§мЬLвид]И o’и­н’ЭнЬэмоdз43оYхMIЊ3АыA}бИ&@з­/y PoжН оyЁ›~Бв9qр ОрМє[ЇЭо]n/ўžLЎMЮnО[сx2 #`й<а­мqyШJ}ж!тЩXd3DЎд35~у<ЁуЇ J=№1А №‹,фEnф4nуž”тІМу[буqо0 SЎU>gО)pПЮ#№Ђъ D Ў1>к ЕkŽmо’ч˜ЪЈ’ЄГсп/qчЙџч Бч}Ўф=шKщцДнё"@АМЛR^~/$€dZч)1r,й€Qn{щ&щ.Нщ7хщ . №тшоAъ~СЇЮ‹–ŽщoDпбщŸ~Ї 1ыZЖў^;АˆŽ~'РЦ!ъ)ЅЮPdЭ>DЎ~б>dЎцд>жО(йnлF8ўп.IZцбп?ўЊ3ю(1щы€ы­Ою"Сс?>Д“§јn)ћ>AўŸ/B№D5я2‘lёп$ьŠќЎoё†оBoч &ђ*ŸЄц7Tђaя,џ‘!п.Oя0ЏпZ!'аѓ=ьъM4_ё6OђнЎ…ё8є!ѓ/Aё#џђL@*8ѕZЁєNQ=Uoѕ?ѕсє"бѓ)ѓ!ЧFŸ№qђœbі&Aі&ріі_Џі.Сіm_їoг@.› Q&u іP ѕ&Aщј  2@ѓљ†Ђїda(>љ—Ж.ї?€&k$ѕvЯU_ёЄ_њtŸ›žO”Џ$[’Ыњ{яѕ%БцР`W’іOББ№~Ж/э'aћИoКЏвњvсћ bџSЁ/…rЬ-ФВѕ9џЯЅu~)+Q§з-jЄлЯэбŸNbў ё, ћ•ON(сќЦŸЋЙ9АnŽР@‚ Bј‘PсB† >„Q"У-LԘQуЦ‰. N P№G’%1VpбфJ–QМ„S&Š–$UФ9Т„š=YЂTщSЈФ‚$N(`ЈЦ›9ђ\U"PЉUKІРŠuт„Ќ) Z­JьXВ>S p ‚ŠЏeУZt+ДGЬcЛ№lкЕmѓћW№`Т ŒUІ ЏˆУuй­т˜Œ§J6iѓfЮ5wzѓgбЅMџ%}Z5тдЋ]ПЎйіџlкeзЦ-єvnоИwїўњwpт‡Gољxrц‘—7OўњєМвЉ_k{nэлНы†ќ]<ъ№уЁw7Ÿ~#zѕэЇ–wOœ}|њ чзЏПd§ћлїї/=l@П3№РэTА,œюA›“pBЉ*ДА8 3 nC{ђ№Cюр1РKЬŒDё;qEсTt‘?cќoFДёЦsдA{\№G rШ‹4’B$“МpI&5tђЩЃ”D*Ћ1%,ХkqЫ.З<ьK0wдrLЗФ4ГК+гt Э'нd“,8уkN#эЄГЩ2ѓŒnM>#ТѓO№іtJBE ЕђPDГ jQоэRGSTtвй$НqTШРRо4хдгм@эTTSOE5UUWeЕUW_…5VYgЅЕV[oХ5W]wЅ/ ;mricron-0.20120505.1~dfsg.1.orig/html/images/results.jpg0000664000175000017500000005626410513205402022271 0ustar michaelmichaelџиџрJFIFџлC    $.' ",#(7),01444'9=82<.342џлC  2!!22222222222222222222222222222222222222222222222222џРшж"џФџФN!1AQa"2q‘ЁБ#BRtВСб$345rs6b’с№‚вCDUVc•ЄёSЂТџФџФ/!qA$1Qa#Б"‘Сб№BЁёџк ?чњ(Ђ€ЂŠ( (Ђ€ЂŠ( +vЂс?4G“њda?iтЇсv{zš „ŸF‚œ#ьћш*tSJb7їР+/d~i(§хT€ь№P+'РМШў4 к)—+БыГO–ЬдЛњЊe+ЯиЊˆИіaЈmУ.ЦZGџUЅ7ї‘О‚—EnЭД\-џоЂИк[Oк8­*Š( (ЂŠŠ( (ЂЖc@™-@GŒы™шR“ЖƒZŠžcGоŸNс'бJћГYП з›і7ЗЬ•* н<Н!vOТ†—ўUџ:а~ЫrŒ2ь'@ѓ м>ъ (#­Q@QEQ@QEfb$‰*†pŸеI4hЉ–ДЅхп§ЭHk Vааї’ †y№я(+”UЭ}m;Н(yЅ`дl‹5Ъ %шO$Й4Wв8#жОPQEEPQEEPda‡ЅHj€віkн…љ7}ѓЩ’ІТЛеЇ IЦG‰5kџУ§-џТџќ‡ѕUn^Љ‡ц–‰мxџ*.OД[bНmИћD’6Šyсў–џсўCПњЉ7zŽдKѕЦ3 иЫ2\mДфœ$(€2}+л‹ЮЧЩ™ŠDіћџъOOъј9жšт‰}ѕ§ІZ4QELZ (Ђ€ЂŠ( +4XЏL†# ­Хœ)я ћiˆШКъG=М%*РQљgЇй“с@ЂВhыЕёф!–€Г„ћ…JWЩ#šsщnТТ&ъІйЧМ{м8БєјSїšАъаєюŽЈvИm4ђ“ю'nч>uЧЊˆљRSSv…ЈѕCЮЂыqz0r#Ѓ)'Ш`bХsд=˜шGv­пЪ“‘бДќЄўрЊЕл§ .Ѕ•*УЇк‰ ‡d{п\ YYД}кќЎіOgгОwЊОпсS2;8žиCЏОGJ€эЭ БkЉЮ•~]r8QЮ@Hu}ў‘ъw&+[Iяж9ђИєЮqZi‡`Пнˆ%чЮМ§У"икћДДкањ”P[œЋЪ‚ЭД]lИ‰Mj&Ѕ8Д*@н‘хШЋ§›§Ё.ЁБљgNГ)Ђ.ApƒѕIніqU‹&ƒ>+qпeТРJYѕ­;ЏfSэЮїЖз”ЅЄф№GвЗYі]­н<ІрKsнУшю“ъ=гѕЈ=IиT9ЬЎeŽKO'€б Qљc)WнHћНОя['C!yЯyнћЪљšигњгPщwї[ЎД‘ё4VvŸЅkю‚ОXиќWFBT‚…уќЇјfЋKB›YBвRЁС`ŠщнкЅЇZEќі#7ЌIBQоŸ‚}в|‡КkЏь†ЯЈ#9*ТН’іяіUЋ >ф|ДЯEI^ьsl3зkJBвHŒgєЏ6Л4ЫЛл#4Js‚Гажƒ@Ђ“Р­šwГЫо y)n+ЈIч„+/­3lнžXt%Эg), {ŒŽ^pљсђычІдНЕ]L5СвА›Б[ТR юzљŸ_Z ЋВ+6@•Њ&Т€вFэђIRМ№щšѕ3_v_Іr‹l)7Ч†0JpињЈџѕ4‡•.сw’ЉфH–ђ.:ВГіš”ЗikЕХ#ЛlЅƒ?‡ѓ cНўа—VжЖьКrгЕpсJ#ь)uDЏЖЭ~ђдйŸnŽж1ѕўuЧgГЦVИЪy)Ї~ љV6 к[†ь5ZTх:ЅйђTЋWozІbлeЖр”ф(”­_Tœ}еa‰л.†Кe§$ф'?^2RМŸR6ЋёЊ§™Ыtwб‡rœ–дМЋ5]“І/LKT^хЧ–HкHўTxњ FыxХћ юЏ=•&#л{ж§=яК—zЃВkНŽC‰mЕЇЪT<вЎŸo5Kq‰ЫьНфœ…ЄƒLЭ)кn гV№ќЩMjKОыё_Y/4ЩЯ‡žEіŒъš}Е6тzЅCБзIПЅtŸiж\ДЪкі 2ф'ЕM+ЫЭ>‡ЁєЄvЄв =%H}‡R‘д-8R~cјаWhЂЖ [ф\dc ЈјŸZ P ’|*г`а7ЛђбнEq ЈŒЄ“єІfŠьО OхнE!a фa%CаŸїж‹яnPЌЬ9nаі†лm>яЗIOФ|Т|~ЇщA!Ї;Ё"ьЄ4кх­џ><+z]їВЭ$Kn\(К…cЙ‚УъAкцЄmчTj}Zщ]вс:p$”Д3АD'іV‰)–лJтДТ“ЮїќСўT9}ЛXZгhб-9ЯКф•Є<2OуQovщz­ŒiK"'„­•(чч‘јUнЇІођуi~N8Ъ=3Š‘fЩi‡m}›„gФаМUЪGЇ…кЫлsј‰‹yбб_ЦwМв€*ЩђROЫ­X[эВ§Lћ&H›gx aЦ№йє;J‡з‘ra!ЗZі9KR€ ЯК|ВfUžєъ!VюљЊіњсйm‹TВfY$@—ŒsоЯЬqJ-Qй…ЮУ!ФЁ ;yкFxє5YЖн&YfЅћtЩVЩˆ<) gзўЙЇ%ŸЖ9іјБсы›{7(2.pH ф ˜?:3ЌИУ…ЗPPБдё]!~ьЦЭЋ,ЦяІe7.3ƒ-ьх@јњuЄ-ѓOЬБLq‰ ЋjN7b‚&Š( (ЂŠЄ,_“ПЄ6ЯЪџсžжзЖ|_ияў{сЯN|Њ>ŠўЋИvAЌ&Gv~ВКБ+A˜АЂF[lG@aіsŒрgŸ:‡jVэ чgšsл/3›іkSŸv џ[УMья?6qœ5зgФzxs…Y5&ЕЙj‹5Šз5ˆБeьё”ЪДэBrМЈ‚pишSAxьДуLЩ§Б_ИŠЛюЊ/fjOэЧФUзurмЪo=МОiеыѓй<ВюЎ~д_я5ліЧП|гѓu ѕћЫu§Бяп57ЄзWЗ…ПВёЌйmЖ•{3I'М”O)Њ/Sдњ ВіЗЈк…cbaЈlaЈ­7ЋœŸџtГаšъT*lЕ-1ТА”ЪШўd­o,щqrю}Љd•ф 4є—fЂeлОHVеr3ыч^.:> Ќ‰їw‘д})•ІчЂLVq9J’<ш7тй %ДДи<ЅIЬв^бБaa РШ#ЦЇ-Џ%Ф‚”сšздwцЌpЛеrсјS@ВЛiжэ7G•)е№Љб№dЬj%Е њљ ТЙlyƒќ)Ёк тS.Зl…€ЕЈ$уУ=M`г`C†ќЗVЄ ЉJ?ЄqAЮ7­-:Ьђ’Є•Ч@ѓѕЋgНЉ\ЌЃBЙ8Љ Ж4ђ§ч#ф|Sц“єХX/qП\жIJи8 •,ЕEћLЭъeMЖчQŽєє щmgЃэ§ЃiяjŒ76в SjјИуў‡ш}(qЕ6–ьыLВЖт™Z•$ЅQоoЛмOˆЙфŸ\ŠйьV*TmцйŒ 2АЕ{‹§RЏ,єЯє&Є{`а‘Е%z–Ю‘эMx@9р~†+tеw IvќЏsyйЗп™dЭВ<0:QЩvд“$>Іœ—0 ЫHр'чќ…1єV…0ƒ<ЁЗлyДИУ•юžzUОџjrЭpTыci.ЅМh wƒЫч@ЖБvw5инєіTбBИg}ДdСn>ЧZїлSњ3TEП?мрл• jіХІ7дѓ1—Uc4х[!й­iUСcк\ ЯУK[бˆ­]nr+iqє…•т8СЋоБЗ"uйNI•„$ћЈ ЅХХШЖ]U жђчz‚…Єr@>4 ВЃ`і–š!Фœ+>5ƒM[–˜\чЄmЯЏЅMщ‹ќ ЬўN}(%\ ŽП:—дёж—yЈшJ0pš жСRХ*C;е+ Cчц)?Ј4…ЯLN\ІP\‹žЈcхќ)няљ6 v ­k šQИj6нiјС–WЦв2Ђ=h–{ЌћmйЉі)nDИ$;ГД+GN|Кxщ{`э.lкЅ–у^’”Ш$ц‡ЫЇЪ”кЗGЛiЙЉDЇxR~ќљЋћk­ШLЪjkJv>/ŸЏуAwжšKАъVсЅ юпpд„ф8 Рлыž1сše[ДжьЛO7xе JЄmЫ0ЩRН|Ям+жЛEэ#I7dМ(!ьfŽЅ$r‚O‡=G”§ЃХдfљВѓ*LЕЧФp;‹{G<Žwu>$š ЭOЌцkIbс”ЈЖжŽa[ZJ‡™=1“UИА[7к%6mjќдFјЯЯШ}ѕpбz<˜эмЎЮя=PжxHu!NFWЪ1бљ–№:h-ZsC3>хЗ=гjк”!Šˆд”Вe6b%ФЌЋ Ш"™š.вєЙ?›кjш˜Эn%^ђр‘@ЖbkJщ†YDpЉ %8ш &3ЖЕЉ— r#œƒЧШгЕ­Ёq—*JwЈO…WзЂи™ЉDI.ŸgR ‚R|ОT­%ЎЎšээV‰фG/DY;<О~Ѓšyoг]БиVќмkТPw0Еr}чѓЅ>БьНыCk•kяB9[*фц<ъЁkНЪВ]˜Кл ЃОСФ$р:Ÿ—сA›Uщišfцьy )*кA§хђђ5_Ў”ЙІkZE3Ђ6…^Ѓ3ЙlЄcк=@ђ §џ:чЋЕ­лTТЪђPr[^:цУьL›”ЭM=дэ­)ЭФq8з=ЅHъы›ДЕврЄЅЙSœ ёДЌє!š 5сщкяUpw9>B ђЩѓ'јS{GЯbЩЈ Šu†і)ё^ь“NЦ‰lEЪCШBх{ХJ№@< fKгі›ДЄЩ…9Є:<3AхлEПQЦuPˆcоlдfžБN‹ л\iIл•Ц*ыcА1iJ–$ouc••4’:ч'Я гЕл—•ЋrГсUэYh~сsŽБ§N>Еr№ѓahЮ2Ev™R‚J]Cl%#rQnщ†›ЌtИ’Є!JюзŽ‡jљЎ~Ѕ",‡фуК{єUщгїдVцѕН…Xl~]ˆжV”ŒлЈ>GЏNЕЯš–У:С9QЄ,ї2ˆXR>,gћOлLюЬЕcїR—\?•­Фgqўе9ќ Нš —x*zi/АvЩŒЩ?›9 @PŽЃЈЩ зЋ]ЙЫ5эчI‘ДœŒaBЇцKЃѕDmPвœMšъ…&kiJ•н+Ўv‚2RЎzp“W›ЕŽхА9JгAl’ѓВˆэћƒЉЋ&юя9#Ї5Љ vИЩeМœTz“Z:ŠrсYоq)%jїA Ќ_uJъdl-@ЦЈw'-їФT)aKAR‚AшqХLУГЩŸ!sТP:)_ GѓЊЦІhF”Ф˜lїЅЯyMŒe#Фњ ЅПM.Zš~ЭЄ@QущLшЉЄ6ГИ„€IёЄНІтЅ„:Ф­ЋppE5ьв—&N8A^9>tяp@ek$Rцпkzы­™[H=ЫСVЪЧуЪŸžjјї›bоq8KЃИЙ0шOлŠMъНХлR9|…%л}ФЏvіК„а7ЏvfяJЂ•F<щqdьr=ОћэrœRЖ‚AЯRNMOщa ЅЛfЁZ4{­Ојў~•|[mŒ`ѓж‚:нk‹nhВТHNrwд]л_и-6эF[nм\р2йЩзЪЋкУSЩ–ѓ–k  бOЛ&ZFJ?сO­VДЮц‰-0Љ­ХїŽѕ3ЭЎ;сјЭО8 HV*"щЉэіЇЖH_ОOž+u‰-ˆф„ИО•OдіЎo-Х /žRЏ?: к…РSАRё№Ћ‚*“'TЛ:хљ6b‹.(eВБЪеVœХl% хH+ЈњRЗDмВыˆKx”n{Иx%psѕЧй]ovЕ6-ŠLvRžp‘\БкMйѕ:ЅБюЗ# ~ŠЈ+iэ7 LЂ ]иЧУЩщіŽ*[ГKЂ^в­лVё\‹aю•m7’Z vэїA dЁ]q“XВнMТЭkКВFчP…‘зо‘і‚*ZкшАіšc4—QіСShJс%РIъ xqтЁ‘т†NусŠзкhЁ`(yYrH8šТЃqХ;XD”bЖc‘аєЇ­,ЂЩOє’DeК\ќв?WžE7uCя5oHj9y*>ј’гЏ ЦеM!ˆЛУˆ-: œЉ"‚№ў[hLЈ…яe# џ­]tЄy1эa2R­ЧљV–“vcжтЉhR6n8ЋCDЈєрPfOФyЈkеŠMйфќ%Дž*Xљж`В'Т‚)lСВк­­)фu4ММjHЏШ1­ё›qѕ№п8ѕQ№ІœШQю ЄЗНТЁтщL7‹ЌЦN}@Aйфи6ѕ]X‘КR^й„ѓдJ­vaw­^ˆя+kSRXVzuN~ЃZyыCzyЗš‰8СBBИєЎqМB•hЛЅђв™u.сCсX9џ­L\mЃQi –Ч•= ц22Tп;гџ~•Ы7X Ж\пˆА}Х{ЇЭ'‘їWRщ›АuvЛ›dw2[I_R 3ќў”›эšР›>Є%АBw ѕ)>ђ>” *(Ђ€ЂŠ(=ŸX§Љ_КŠЖnЊ†€8Б?ћJПu5jнQoMк\'R›Щх—u&oуїк§уNдНŽм?isїo†К™Y{?Щ (ЂНнHЇЗћ=лC-^oЊ Ы-” ŸAšDзDіOнDьz§'; ЃЛџ.ћsіа{Ж-r—1рЄ‡UЛyщŽІ”^^ЅеsюЏЅNCadсДd!?_чLћ“ъЖhi’аЂ\1‰Ÿ6вƒM<Жт…„%[y'ž˜ Лi}MvŠтр0XЂFIN3хщYЏbѓ|КE% 1М$ужЖцшпgŠмЛz”г n#<šеЖZЎЗтіТЪXt„ЋnVЅПJ %’б*ЪЧv—;є)[ЗmС˜ЖD8ЈЩіwqЯUДСМАЄ6у…xъВ ќъду A!'оu|‘ф(1KК:фД’G O˜Ќ—"TЫa;фрVaE>ыSжЇQ8aьГЯЅ ы ХZ‰ФаZѕД`{:”ѓћ9aN єЭzэYRЌЖ—ЖGSŠtmyйž Њ|}$ђ;5z JЫяљJЦ}ўЂ‚ЭiŽкaД–ЙžЅDѓŸ^ЂЧUžо$ˆїT|*™й5Вr,H]й>ѓЙ1A‰Џ&Z_.цrK]ф8§ИJŠpЕЇь"Ђ{ОьЄ(sјWЉ“aнiФtє'ž8ыєЃ[Z+YДњ)з97v†RтJЖКw€@љ|Њ>\vDЦУVЦ„t$eефqу’8пXтЈ4лЏ‡С–с ЉТIљu9ыŸњдiŸ!ЇЅ­жђTЖд€ёœpyОЕ=Л G*™qжfўьЯ}DФЮ™npm—pkНm*#iIЪNxЩЊ4ФГ*йp‚”ЇНˆЎѕ.)YЮ8V>czUёФ€T“ЛƒƒгŽгŽ=*ЅrгРВЬuPщкTЁД…`uчЦЕj&№yѕф{гiˆяк=W]rUчBЖгƒs‘sdјШћXч-ЫƘгaЇМ}Л“nѕЅ)PQ<њЅPћ&’Д]Ё(|*ѓўР‡LiM?-Ѕ:гџ–"2Е##(яАЁŸ"•`k 3MЬ%А|ж“ЄiAЊ”&ьИ2”Џ фNe№­йрxU*ђаjRРщд|#Mі…Ј4DеУZЫŒ6­ЋŽсЮЅ7л5Љ:YЋК™_~тЫAŸј€ЩЄзiБšcT anДПŸJ‚t,ihЊСС–цўTа]ЎнЅъmg4[ ЈЦeг№qѓІ6…Ж/K[œCn­Чо;оZŽwTvZЪПШqGоC<}Дя‚ЯxъRHѕ9№ `%юѕ-ž™@8њWЅЗо$x­HЋB“e[сЄnq\sЭРќШPOЪЊкŸUЭГKCMФ)imзЅ^їИ8ЦpœѕЯ=*#Wvь‡иlŽ$ЮШ) џТr ѓђщзЂщчн^щВ‹вф-X*ZŠ”p‰<ёы[M}имЊ9R1лстлЫТтчhw8Й[jъ@ }т• ]Јf) АЖ— JМЛ9РЋ .МР+HeГЩЯёЈэDbІб Є<№Т €мWрG‘џГс^qxžоЏ.SЩ|П,nfуо#Ьэ;йTЯiаСœхQžqМygо_ŸJдК.QIѓэœ№#ИЁї“JNЦžS‘.№ѓбmИЯ#јS2ё*C,щу/kЈМ6Т•А!XBЧ9ъ•(zxs[/ ІTЂ‚z‚)Iк&КИi Ch~:УJвђ< JА~ъiївŠќ ЅПГ7}ДHhо6Ѕ:бђ>4 [-њпЈ­­Ь€њBг’Œђ“хY“n‚™яcŽWU†ЦN+“tЦБЙщ+r;ЇЛ Тк'ƒOДіЇmF|pюžJh/’цGЗC\ЉNЁ–2JИ­}=Ј`jXŠ—mY[)pЕŸ5ЕЬкЛД ŽЏœˆЈqmФZТvšpш–ŽŸГF‹;6Фж'“@бWКvцНƒюŒœж8 r@Ќ‰>”3ЯЅDj;Уіx(}ˆхнЫкЕ€pкv“Ирp8'fЗ.(–иЊ“6KQкЊЮ2pN‰8Э-o]ЄH’ mЂ;eA!O)=т„ђ—ZЬDЃчфWo­ОбŸшШ­{5Р{єGqр!%Dќ…'ћEНDП)—ЁАЄ„$…)C!]>•eR}Тщ$ЈЋr–TO>$ŸšддftЄЕlДћgѓ %@ƒœчЉ“ѓVf!‰д#5ўѕŸHя§}nЬfЎv„Š•ЈЉQдЖ‡Щ'#ю5Ћўа ‡­ж{€<МЯˆ Ят*7БЇ–ЋС„Џ”KB€>ЇТЇ{mgМа7~"‚ЏЇ#?jВsхQ@QE =qcі•~ъjбКЊšтШїэ*§де›u=ЭИžЁ_šП–]дЁМџŽ\?isї6wRšёў7?і—?xгнвЧЁFВ_УJŠ(ЃЅбК2!и|Є’’Љ!#%Y9љТЙШ <ыЊ-ёC}˜ZYBRу ИqЯ‚‹кЄGаŽ6ило-Ж@ђч$}‚ {:гЉ6‡/Ео+y-Ї_іk'kГ@nйnhƒИЉѕџ*1Л:6ƒѓЙ=зН‘бTгЋ Ш&;ŠюеœЏƒšЎБЊгї‡c1лZu}т[IСЩыШІ&Нач[ܘэ‚O)u#}iyЃmщƒЈ$5(ЈМїƒч kёљ К„КŸ}QSёв;І‰Vpj6н2нT†нї’vЩ8Љ†’6Ё ч„Š ‘кW+лСШы[m0s|ШЌъސBs+e=г {Љѓ ˆд-Ц•I ”ДBŠ€Ю*кнўа#Ђ;†“ьыBSœЄsМySBzšЬƒ• з4œЕ0кћ^И,М§H‹CmЦe-ЖwнyЌюДs”рxв„ъT FGžjo{OВRЎO<†FнсЉ=Hђ­eс[Hх ьЉЄВœь#uъ*Ѓ~П3fdЅ+”ДgЇ†OЇуі‘˜‰™д4Щ’Иы7Мъ!K~2уП'Иhї)Z’…/‚ppBFNqЯ>8ѓтЊ†ј˜вb;чПBВДqгŸЕqŽћяЄ4Ёп+rЗdф’yyўЂnЖЈВЏаRг=уЬ‚ЅЄ{ф’}дњѓѕРЇmЬТ“‡3<šФЦЗѕњ/хљmк›(‚Ь‰Ї./Ј<чЏіњДЎе/bš%l-)'‘гžž8Эo.Уwu pк'a$'%…g'>ЩЛ=EIZєКf[%.KЅЖ­ЎЦqМxЄ)*Сыд}еу&oё-=емl9Гѓc5т~ЛяіHпћъ^і<Аnw6N=цRЌCџZdj9r і}7и]юпƒtnC*рэ $р№p 8kZјгŽл$3]лЮ4А•dŒЇŽG8­”•њ Џk;Ђ`"DžхздB I>‘іќы1Ніi’k™Дъ 9}кћ”lУЭД”9Ч;€дsXP‡NBB€ё№ЗЉd—dЅ/žхчА;є •сŽ™№чвД[ŠийЕе’yССуьў5‹лЖмП?‡ђMВо#Nгщ§лIgyх{д<Эa›lpdїэ{ЭћЩXЄќЋa-Олn- ­-5‚тТxNN9>ёXylМЂЄЉ;“œ‘д‘іŽj4S,Я№Њqл6ХёЮІўЪTmks„Ѓэ/8ѓBЧѓ4ЮеђнЄ"ЯŠ_‡uя‡J •)9фq3ŠTщ7Н“Ерœcк вЏTп4ѕtuЙІ&эuХ%/Дта~pRѕыš’њmяDLz˜яЈїkЯ)лгФеъшj$…Џ8JTOШ Зкn?•Ќ№'­’и•ЗЫyнАЉ!XЮqžИFжRQбдmPљцŒЙОSйo8‘„­dѓ57+pа–ўNг1о>‚НЊФdщєЯ@**RџjХЈ4у–ўШ,Rдœ-RTыžcТ‚‹jsКЛDsэy'ч]3oуh)Щ*Ц+—[Qiд/Є…WQшЙIИF‡!ОRІТ‡ЇІ=гaC “[HQЩ;О•Љœg9Ќsf˜PяЇ&eкщгu/БОЪšWIH@уrђ3HћКšЌ–Ъ”’ZЩ851zоЗФЗЅH~C„ь2ИmЮHhч ѓрVЂi IP;ШфФV3eЕb"БЗд­“&лњЯхЎZˆнЦ:?…hj \W­N­фћUЕG;‡ЇЯŽЕ4ЉiС G‡Хт+UзвђамЅГтSž?‡ЬѕЈјч5эЕм,й1ђ)xэяуеигЪnѓt„Ѓ…)ЄЙ"…cјеџЕ™]ŸЦH ЉЗ@O—ЛИ~Иа;m§ЊHŒ”К—“цО? eыHЋV”uХЏ(іЅНН2ŒŸЈЉ.њ'}сЭ•|бW^ЭрйžkXiћ•Трd)MЛТ”†ЖЇ 8uю =T:ШУJдxэ8ѓюЌ!ЖлIR–Ђp’Iу/]‰JдxњP<ћЋmЖмZ”Е€2IЯ-=з?ЂБгэkf ~2Cš eC OTŸ•kj=0ФЈщЙкдPw%cЊ‘є­Ж`Ч’жCШъ•œUŠЩEŠт;Ф8кјкEыMмW"BZpHm}лЩѕѓљS Лr•"1$€R §1^игVіgˆk <уУ5.R•Шш<(4%АЌ…%g5Ѕ!е`u­ч№AQxјдїУ{€фx‘уAЇ=Х%ОМуšPй&6;[ИћуѓHЄХ1oј–л{’%ЋjxŸAJШPйГъ%jY’И{Ы­‚€ *ѓ xDQS\1уS {ЇYШЊ•ЊєЭв+rbaM,xxzДC=рcтƒv;+yY<еkPi6nш‘Аь”а—|<э>Ÿ‡к Ц;{ИF­’ЩфqЖГ1;†™1з%f—Ф‘—8г[ˆнЖкбTR ваGФЂjѕЂД‹vЦLЅ•Ш_ОЗъOZП%ФKЅєВ€z•UC|\•{%{БуXf•ŠV+_Є6я•Ѕ%qЃИOГжЊБWqŽы€9э ,фs‚=+0Е~cНsŽFO5ђЪЄ’’—2@#ж‰зfШWlпy CЉ–вT3ŒЮ=)ЧrG{nМDNтЅEоqމТПџ4 дфЧэ}'t–UŸž8Avљ!’K№_IЩЧ!$К‚CAK“+Fл•!{”Žё Ќю%Х%$€>œѓSRфƒ”Ž1вЋ›Ьj^ŽC …%pпqЇ А”OyЧІ\ƒѓЉ ДЈёRЂЗ“Я€94zЪр щй’ ,Љ(Я™Є$[гі§ЭАъЖHlž|3L.гpTF;рЄwўьxШхjOŠˆЅАгwТДкІ`sЪЈ:7O\šИкbЩiC6“ЧЧ5m„ВІЖуыJЎЮX_єYr›pŽщe/0чЕ#WЛ.ЉЕ='йu,Ы§EŸ‹дPX•)`уЦЋ:эq]†Фi RЖИ AС'`§ЕpC{€P‘ƒХPužК]Е ^2;И- лR=х+чхY‰зб­Ћ[ЧЛhм nЖцюl6™M!I+ъ‰їтуЫЫ#чœV6с{\DFе ЈžэA9pџТ>™$Я9&ЎњQЎаЕ“Ž Ї-жів1њHV*L4ьл—є‚C+і Sjp'.К~њš­XмдА5Џє†UЂrš’ъН wGоm}GйA­,%Xг!Ж–™hoqI§?:mvCqJэ GCЌeЕ$чTыЛ“4ЅХцBоˆЏЮCxЕtдt­M)Ј[гšн.ї‰ю+ўЬјgыAб%JŒŠ„дГ#iK_8ЌleLЁЮ0А<ъƒЌюsmRм‘ ŸшB‚П>4ЈнФ),Ѕo>…-Ї’Ÿ ŽsРђŒё[кvШЬHˆыdЫ $8ћЋ4|Fп?{Œ0…s„сБоЃп"&d тœЮб<‚<*щi\hач) T?i^фœ ЃмJxЮAх9щу[DЦ2№k“/ХЗyпк>ŸoЯv YІQь‘Є[b6вc)Em0ЪpB€ЪЖЩЪSгуœU;[ђлxF}’ПЬК•Щ$`nPрsРЏ­Z}–ѓ<єMaо:ГЏЖvѕ№ЮэНOA[7)LМЅ;&oД) +e)Gv††мtоQч“чРчiдzГ›ю'З­яSѕ?oСЅнYэŠ9pmPуdg=Єџ vj}Ња" S5МcЉїSќщЄоvЖУР5хБxЇfЁwМв—FіўlИŸ{oщŒ ѓMˆˆC˜фЃЛ”ъDЌОŸжЭ5&‚гIЙйь­мѕœд%е<Шjв‚9лН@-в22:Ž€їˆk’Jn’Сџљ—јš–ўыўkОїПѕQ•‘ўЦ{I•!й,Ž<ћЋ+qЧ'АЅ-Dф’K™$žsT{­Ў]–щ"л= Ђ\eьuuЋФnA##ЁрфAЉOщоАџцЛчџq{џUAОћвЄ;"CЎ<ћЋ+qЧTЅЈœ’Iф’yЭЫGœZџ\ўъjУКЋzDтдяњчїSSћЊз 7ŽЇ6>bўYwRЮщў/7§uўёІ>ъ[мџХfЎПо5сЫЎЋ Н"5{xjбE|Ÿв‘§ЛVФl о?5ч];Љœ–†z%Ь$žœ‘ќ+˜ttŸcдб$рэA\џ˜WL^aHn;2фŸzCЮm)*Iћ9 XіC:LH“ƒL•(И•ёŒр SfѓnЕ_ 6nkj4ЇМ“јњRwВЉЩ…vЛAsуjWyƒу‚Aќ*ыu’ќЫы[ иTTсє№ Б3Ђм $1=+gР…ХX-6_Щ-ЌЉтНпLTMКьеІ2w+~~$љUž$цЎ1ѓн>t љuѕЈ$jfеqšУ€6Фel.ŒЋЎOQоQ§ŸуHШšШ^u$›sŒ:SЅHиœŒ?#ХіN­ЖH–Жq!Еƒ„ЌД­‹`Qз;фHQе!чю‚rT†ЩчSДв}˜.SŠЩч`рPZ‚d7ŸEІh џi*–ЕП;xšдБ#1њ%ЄlСђ>uЏ/[LhnкД€=хg%Dtљ зВR§ЬBb0J# ­`uЭT`-ЖЇ2ѓШ J]ISxхCЦ‚яЁѕєvYwыŒъ78zјSофh’Rяv 2ŠЂлUЅѕр*=Вќ aZКхhŒ,P=вћ§ѓ'т Ё)РђјOлWНWлŠЅ4TЈа§ХЅnѕЦ|@ёЅ›qŸ}(i*.))hcѕˆуmtŽšАЧгzv-Е€tœЌутYј‰њаygaЙJ›$ ”0^Zz$б RN=*ПЈЎВ§”Ђи й—V:њ XкЕ=вћZЙ­З+;вП"ЮСZнiДВњСJ”‘ТЧ’‡ˆЅnБЗЏK>$;ц]VbЌdїJЧ(ЯQц)Ћj™)цYmіƒЩ)Ч~ƒзц+%іХёl\)H iСqЪO*џeЇ*ы4iћСћŸно<е>ДкŸHŒЖЗ(nШ№Ў\Нк_вБЇ–BŒђ^р8~!єЎЊ‡!Йжјђ[CЈJ‡ШŒа*юЦ`LyM[дЗдpЅmх_:аoHмюsS)Jv*6Z`у?3N^ЪЪ Џ„% фЉCЅ`‹: ‚/6|€ WGьѕг'Лu/-’r{Х~&ІЎŸ“tьB…Œг•mOгЌW­R-6‹[iј•QЉ.PLДЄ­Мž1@€вN НЌГ!)кƒ)ч1ф0ЃO Ышg@^‚•ŽјЅ чѕ3єЄчf­53_ۘУd0гnИ€|7уMdgГХ:Д*TЄ cЂ’•у@›еzЅїь6э:УŠCKЋxыSЋ @Џ:HЭдз6b0Ќ“о>ё6‘ќ|ЊS.KП:г-—qђ„ фчКЃCidi]4ЬWTЧrKƒХGУф($mvhV{kPЁДгcЉъO™ѕ­эН|дт.5ndЪ’8Iѕ?Ъ–6]{Мj˜bртdхaj;SЯ€ l_4ѕПPлUk #ЊV>$+œ5Цš‘ЇюЊŒѓG 9Cž GвіЋ›В6127vё-? П•Eы­ ЦЋБ;сQ•Ч{Х*ўF‚ицО~ъагЗ ŸaQмWU$uIљSN}Б‹„bгЈљц= ФН7к•В5СЕАђ$wNъћ+ЋА0’G^(r‰axФ‡+ІG1Q3#нЎ™jž…ЩћщЌИэ;ЪлJ™NkVraCŽЇф66Єxh‘єкЂerЎsѕмРћЊIzz#Б;а—6ѕМ'š›zу`”ўVЫЩЩшOedМ?%­Пe8giY&ƒŸЛ?d;кjyю–ђљљќiйЉ–ьоHї“RЎOOЏУJNЫіerœ0Є6Ъ№}TБИjkЂьюк”ю “(ЉCфM6нnВЯџU_jVФѓ›Œ’<]Wтk^€ЂŠ(.PтжяњЧїSSЛЊПЅЮ-ŽЌдоъПуSxk.g™Џo,ЛЉyrџ—ўВџxећuP.?тrџж_тj/QЎЋTЮ•НМ5ЈЂŠЊ]3УbЪC №?*ъыEе:—ГJЩTˆLЁjј rGў]еЩTшьGVЂ ПЩѓ ѓJна%]Ы#ь ЅнЄ?Ї;C”у.wHНхCІеђOачьІ5К4ЖаЗћ’WФЃг5Uэ–ТЋ5сЄ80ІдЄ4qёВI(?Oy'дUŸВ‹š&Yл/Ќ8ЖирWЫЛж{ъя+2>Hщѓ4ЮЕк ВYJВs•кŒы-4”Ѕ!9 бЛ\о‚Д'pёЭњPR›QT4šгКzM“Дžдаљюж9тšжЫУ KgkЈфЂО]­ьЪZe60рф(~ђwћ лrA* GГfм_ЮVЉ$јљS`ЄЇŒxŠЋjљ-ї‘ЁЃоЮjє—еЊ‡Дw”ЉТŒь9сU'мˆЏЇщЯipqпFlm_ЉЖuj–ѕрY/0А[uДѕ  еƒq‚єg]MТ№ЬPЏyn#)cw4 [e=Ў"ЌCn к—н!Y)ѕ4сŽЫ›z!I;d#с>cЪ—NZ%_&\SЮ1Тuiъ‘цqWˆJябдТГƒШjА v)Жy$ї/6R3р|щ/йо“ЛDэaˆ$8–"<ЅМЁаЅ уэЎ‰o lёœšїn…#ЫCCк>ђМ§(7\9Вp­ir[}ЕЧn@CФyє­„$у‘ЩфљерЫыН>уdŒ/ТƒJѓІžCN;>Fі”zю<еJ|Јznй%фH!Д ”ЖNN})šуЭўLR.).4G:JvБ>m-ХД<ыУ ЯМ99њт‚ГdКž}тJИeЕ-J> YџЁІ–ЁЛ‹wg2y!Зя/ЋЛR!„` .ПmTЛ"А*шУŽЗ}Ў{Єр%Є№”gЬђ§UЖѕb=Ѓj)ыH-к­‘ФxЁ9BK„ћЃІHDЪ28 ЋvAk~ёЈМОъQ х8 p№>СO}‰юЪ”F<WєѕŽ>™ВGЕЦ7ё+ѕ•тjПЌ5ШwtDG|–FфqуAЏЊ"]]vGwю ’Hї@њR:жеЪеЉУm'cЅўщJ# фг•.+ а\B‡‰№Њ4їŸЋ6ИRІ;є8Д!<’С mТМІЧ:AKuYPЋœiLЮЗЁђaC‚OCJ 7`Л„wJкЂIЪI bЇ\К;2;qYqA уЦ(3vЃQЊ,N†‘pŒ и_ŸЇфjыЄ˜\M%jeаЄИˆШ є V&Є1$юWt2MJ0ŒFювqСHє ОЛы[шuф„ž2pie$мbIKiLƒ’“СЯЁЉ)ђMžSё&ю(u}pMhwK*C`+$рє4шНK™7%Асш7rGжЈ}ЂоІYmžЫР†Ік‡Š|ёєЋДcw­Q_дзXWз’й‡‡ЪƒVѓzaЙnУCI$€­Ї'ыJ8№œk\"J-<ьЅп9иsђЇmйPюЬИШ Xі:ŠY3Лк|ЧRл[‚ˆъ1Ц­І–ќNШ–сю1ююѓєЉШЗЛt䇂T0О3T›ЦІb=Љ ђCiх)фЈќЊПhƒvнОьŽсЅ’ЄЖŸ‹Ÿ3@СМшыMђутѓ!3#,-ЃЉ№[‡іIфžНjЯи–ЖвыЅХ“дјTЋэ­qЪpЂо—9*nyцV‘ЧЮЋVэNмƒьгТTpsQЬЯ›d”єyH+mJ#$XžИк\QZсЉ=BКPNнєќwу qœ Sі‹Љ$Yl†о„іP-ЅТ~њGtаuƒљ!дEuЮœ+<з9і‹vUчV*3'МDl2€‡“єЅчlКЁmDВбЪRпtШђH''ы@ЉZЗИЅўБ&МбEEPZtбХЙЯѕр*guAщг‹{ŸъŸРTОъъxtо јsмЈ§k2юЊ,џё_ы/ё5uнTЉптеWтjVЎЉ_)]65k5шЂŠЃ[Š•гЗ#kМ2щ?›QиП‘ёћj*Š˜жVЁкf мX 7+rpu*H“їџ5"tžЄ‘ЅЏ%Т agcэŸCзц)Чи~І“oBг!=ввO€у#Ч##ыJўдtЩвњкlD І3Šяџ)х?Ышh:2йЈтЊа‰ЫZW„‚‚“Т‡Јзo7;тpСю•ав'Cы0нІISБЏЭЇ)'РzSЪ:ю*e%Řь$d„pOЮ‚ХІ,/AurЄpЕ c5:ђTЩчaш<Њ™kдђbM-ШsМ`uЯ_[c]"\S–I?ЊzŠ wЇ_Џ_4кn#к™^з‡­ZŸk#Ÿ.jуЩpдЫr rwњP-5%•љЗ-ЕncоBЉt˜R‘kLdзчvœ@>4к™Sї­Цiu’|GR<Гсš‰ЕщјvнlИЪAюVЦіЁph.zcOBbФмE  $'U І.Ще2eMSG ьJМЦЙXФHбэё!ЁіЪ}ѕ`cжЋБєD:‘ ТKrі^ Pш F—†›ƒ‹–ёA+>ш №iVin!ih#ŸxŠ‚MЅЛnЕ<†\O!Вp*нh~ZэћЇ$%Ьt4]FJ@$дŠЕ)pуZЌ$$)їЈЩћы^ђ4й+ŽРЄрД.lко#л{ ЁгqСЈ)ідZЂАђх[ВEiъk{ЯннYRБwЈю—Н2‡пwбSЮpGж‚zќу6TЉз%ЃzP}Р~Сѓ&‘КFЎ:‘Здзx–UпЪЯКŸЊˆћ+оЊжu3ЈC‡dfЮRиёW™ІЏa8хЭIpcЭnр)СаŸ0IљЈyP^яS“ є[pЛа.2’ЇЄ9‘qяс#хSO=`Бї“šB.’–]“‚•ŽvЃp8у$)x$ЅІроІэщВ§NиЄ<Ёž„мЃ…ёПю`ќTд‰5™бћ.nOJ2РB‚СїO5 wЖБpeIR^8_ˆЉеЄИйG_Q6ЕЁmnкHР>T TZЎЙn’‚к'ћ2ЎŸ#Z([ЉОю’РdˆJїИч$UžхgЗZд й2}УЯ№Њ­хИ—лДJ†“оoVA xf€НЅдA[‘`:ыk)Ф';|liK›Щ‚У7жгЁ!(мŸ‹хWˆ1ЎPKq• 2"И ˜ІуЫTwPпv ЌPoлЃЂч5ИJГœu№­ МЇ-іту#*дuГQДьd*k‰myPё мН!f0-ТCюy(tЊ%ЦтфsнЎЫяЈу(GOО™Ћ}ВЯz•€йм9Eд”ьЏkhЧJJГЦ PЙЖ;4лЊeЊ–mŒ•§њRлDУvхЊ˜_tЉЅ{ŽЛн' ъsєЏКЯWШе7NQЂ{ІЩЮOыZkvЅ›ЗD‘ЊюШ ЧhСXъО…Cф8Њ>T[pЂ4[VF_OДИйvS рљЉ]”Ш№ЁМCЛyW$ƒRJlЁОщПw‚*БmМВф-…[RrœЕм‘rc сxСPи З’T‰ЯFj ЉЕА6]pс9№ЌЭобпЛ#рV iъr.ЖрЁЪ›9=(+Ш}цƒЎЬZJ‡MиЅ6Жэиkvнj•Ну”Иш9љzдяh ЭДщзriJp„ ”z EћюЙтЕЈќЩ4ЁФ~с1йN8ЎЇУЬšъkXнŸvWœь•-М$у@?fUѓUS{ьб-А5%ёД":ARчщЮOќ?BvЛк—KВФ8m*ТH x$љ ]ЙЙ+|ыKneбФЁYЖС!Д *YрсЋц™KPЃwhNTщї#єчhцыpa›бmВ„)# ZП…6,ї„wЁYрља]п}–RKыBSŒ ЦЂeлš”žёЇЂаzUNы=ЫЭбQ7ЋЛ@мЅ$рJ’вWs"L›^ вЩкдPm‚iўёяё]*ЋrЖ9 p—KЩN2œ+ŠН]Ф8‰ЪыžЙЊ–Џ\[•Ё*Ъ‚•Йœчh94Жц^Икм\œ8Жњ,p~•БІ \г—dM[’@B€їGЮНиSoŒТ%GšLu#†Ш9ЉЫLј“{пeЩюЮf‚;VнХОŽЮKЎ{€Zёcn=Ібэrp’NwуQn:вu3тхРЗxV{ѕъŒИrТX`qТЌ K”ЈВуЂckМ}ѕЯЋjЏkšlБT;ЖЮщ IъЏ§+oRіЄcF~гf=цТR™{На<в>u‡Mщл_dњ\L|6ѕюC]™ч!тiЎoїIwРћІC+p‰)yI(яIх*NG<Ч>T WѕžХЭ АќчrЉ @рИЎVВp2DфgjR<)—ІEЖР•>vƒтЃщH]к b№‡|Wѕ…+ѓr}еz#їS‚їqTЋSEWИ• Ѕ>Td!ц{ФчiшkЄ-%ФrG\TЦќЭЊР—Vд„dљж]-п bфJQёп…xg ћ(0пЎHcѓIŒЕШ(ШVЬув•ЯСПНЊmѓх(5Лн $|9ѓЇёJj \~ф=соЂ”:гR=Чaз—;дЌ­Пбѕ qYЃМР Sя-*N6Јp*Y;”НЙњд‚Bgі”мKЈuЅJ<Z˜€Д)ƒВH{ф WWЃћ3­@8ЕJ`ќЏэKd/pЩРMyНкЎ0юыšфЧ^„ЎЌЇТМЕЋ,miЙ)і–Ѓ5’Ѕ,$Œxb‚ЦѓIЖщЇXЛЭуh цЙЏ[ъљвфЩГ3$M8RЅ#єёрO­эEк„ЙЖZЮж7ІQ'qG №>ЕLБXЇъ+Г6ј -чV0N<ЭІ…в35~Ѓ2HFр\s%#ЉњSЧЕMQMщцьа”Ђ*Rпv:dЏ™њд„hЖЎШє—ВХ-Йy}МКђБюzŸ <‰цЙЫSпœОмжщZдаQ ЈђВzЈќш!оyЩ-чTTЕœЈŸ^(Ђ€ЂŠ( (Ђ‚vЪq ъРTŽъ‹ДD_љЯр+uwн2›тc№ЈЯ_д–]еW—§ёџѕјеuVх{{ќъќjГкы<НјqЋKQ\ЂРQEf‹)шr[ТЪlюJ…aЂƒЅћ4э Е~EН†жгƒЛ!г’DчєO№ќ)НЈv:§‘/^ЌЇП€Ѕ•)ЄЇоhGO вŠй$ЅјЮ,}„yzvyл*УvЫШ.3ИQЩHєЯQщ@ЏбКоv™З v••АN Oš|<ДfЇ‰Ќf*ц‡T’Щйн,ћУдZже§й5te^4Ѓ3!~ђ˜A$Ÿ.}гшxђХ%fZ5N‚МЉ[dХŽЊ >№ѕћETʘьО.жsю Юшmжƒ5ЮЖ>зdЊрЯє‰ єTЌ'w ž~”Э‹л6’œЂвЄ@д)э ›рЬ— qBЩЩm\FjкІоќт]yёГxё'ŒTžа4эОш™)И!жнЪT”лGP5Зvя4ФГȘ№PАрyфѓєT3Ѓ-ыsГdGeСНА—02:ŠПйnН@ЬXh[‘йочшчРgФз?ЭеW5!•+сЅџjи(+ћ)‹lэЦЫкв ІJBv!))ЯЁЭQ(лgЕ5nК”ИOAž+жЂзvm/jп.KajN;Аw)GШCk.жюšЂ* ЧdDŠT ;ВЕcЇ>TbМпхЄ!ЉКОрЅ­_!даHkMe3YнBі)Јˆ8b89њŸ2iƒйd/мR‹НмЊ,tД•${уЉЦ|=jFіUfвP[ОъьБ–т,чŸ ?OQ=ЁvТcђ]ЁВЬpЅА 3Ž›ˆ№є Аv‡к(ЭБЇ­ZXlИA/!їŸЯ+Гн'ЎД„v,Ž.1 8ђї8с$Јї‡Ч*$фp3€Рз.[ѓЄЉљ +q^'УаUƒKы[†›’кыЅЄ6+ OЫљPF_Д§ЫMмнsŒЖmXї‡_QR–=orД„ВтЫь'€ФŸЏ;bъ­кmЅИ•Д‰@mDР6”Ÿ˜ш}E*u‡eї чMГ}ТIiд'$ЇщAuгК–-с @Ж>‘2FK‹XС@ёІ†йШгqк;_+tјз 4у№Ѕ%Ф-жlф)9 IЋ|.е5L$%&bк0ъ2~к—Ÿ*иЏМ†D…GVв•qЭQѕЮ,Л+RzJТвNxЯ9Єќвu+k}ЄOaЄЩsrжДd$ž2*=.ZЅ<уЗKдЗ_ЮBлAЦsЯ…bУ9vЅІТŒwVоz6O№І§ 3V€ЕђЌWIИ–ˆL;œх%'€Гн^НеN%)Uђ^г № шобЕŽй oЩyДШlnmЪ”Џ чН]ЎюZЁii@Ч†”€IјНIўВщ}›’$ЬП•“L5й’Жъ[‹6іR\CЄ•рњ: ™вw]WrjВ:œRЮ БТG‰'ЪК2ХІtзdіa"Jš—y)ЩQ#)>žCжЃ'v…ЅєДлДУ,э ТфЉ'+W­јzR;Rы†Ё’щ[ЮwK<•Љц?Т‚йzэ%}T‡чтLd,d6pxIOŠ<ЧŽFrо˜ж˜эvФˆѓ;Јї0Ь<ŽHџ)ёOЅrKY5ћ„ЙТPKdёєђ ж:ёЂЎ&5Щƒн(žщєђ…0kЭ“]_lm•оЦќЫо№#дSwOvЋiд”йѕ$MРУ…ЃљќЧ5Љћ&p.OбВвѓ$nіgя|‡lЃEдWЈЌъ7+~ђSЩB–:dљSX^ЁоeГп-ОсpЖr1с\С6ЫrВHR.VЧ‘Зƒо!@}­xЗ9vїдь E*=л‡Ѕ\Э‹kН$>ЗдЄ66эт•ZЪуb~шХЃc--•…ЉJPtЯ­*иезц#x–†ЩЩJUќkArbК žmї_QЪSМЈјјP9mзДZ\i/OйœИШPњщщVйZіз оЖ­ъmД,eN•šцpІwЌЂ9P?RЩЧйŠњ˜’ŸXKqм9јR~ъ%пЖf"[• об”џ@тИŸ­'&Ю‘q’Їф/rжЂpЩ№`Еі{ЈюA. sЬЧ* .ИЉћщnаZSKИ‡Е ФШq8+f9Щћh(:C@о5lє32ћœюG™4ѓaoВ{BбoS2ЎыF’Ђ6Жп*Ў_ћZЕкьІгЇ`*оЧMШP.8?†|Юi3yПЬН=ЙхД>СШњљš M[Ќ%_х:ђдЪ”TЕЈђсѓ>•VЂŠŠ( (ЂŠ ›ањ—Ww†Чh~[mф)ьЅЖСЪwЌ„юїлœрчЃRh}KЄ{Г|Д?З0іRуdœс;аJw{ЄэЮp3ŒSSЕGwа4ў‡АNr эˆ\™1eRПw6Ѕяw„јуьКљtэйаšŠ{ѓcПo/F”њїЎ:врС'…9я­ ї•ЧwЗЁржГˆЪџ9ќnюЈћqФuœўЖїWв:M7ТЧс]–?ŽYwTя.џœў55КЁў№яљЯуU>гWXБљŸйыЦLБбEЦІ (Ђ€ЂŠ(  ‚шEPZl= _Ќ!Qх)[>Ч‘ѕІ…ЗЖШWШЉƒЉmБЄЖЎ œH ђ=3ђцдP:юzHъ$*Ušђм'2–Є dќЧђЊЫ_ д"Щ„јOŠ?n*€дЙ }Фр•*J6ЉМEј&Ќџš‚г В=G*@l69>ђЪBxѕЭK'БKњCЏEЮHЄќ*œ{NЎ+‘Š№Нo|YЫ_Д ЛИ8ТCз;rдЅR РњWпќЗХš™~ЗmЪ”…)\њr)r­awXO…cЯ?ЮЕд'r= ЄЁ"ЭOі{aKnۘЉŽŒюCm„$§z§ѕцom6л# ‹Іэ1!€0в–GЉ=~ДŒuїŸ9uеЏќЪ&БаZЕhЭ@ђ—"JЦю ЮN>~V$Ј’I$ѕ&ОQ@QEX’єWCŒ8Іж…RH#Ё;lеЗKb†Ч–ЄјŠOк*ŠФзq€ХФ5)А6„LgxЧЬWЗѕ&…œ{й6тŽTZQE)( j33Г••йьџy іжFчшF_RлГБнч ’)OE‘НcЄ Ё^ЯЇэa{З-Эќж”ŽгЂ2јr,8m)')-0)QEњык…жр‚Ž§в3РЮбїUJ]ђ|УљЧдЁЈъ(I$“’|MQ@QEQ@QEіˆўБЌ­?;MЉОтJ=цнУŽ(эPс\-'1Gћ;џWжW{‹џšƒдч%~ыmeЦд7(№žЃЯ‚O‘­{j:~n—‰Ї5іœќЋ ]дIq’ђ 6ЃЊJxN ’Ё”‚$—ўдtќ-//Nh9љ*,цЛЉrфЅ%х •юGUpЌ)GJ”iHaВ•NxЌп”§U§‚ЃЈЋœw—ƒbЄЦЃ№ѓœU™мЄ(5њЋћh8 ЗЁа’kЭ›е9кХskЗсšуЧQUЭХQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEQ@QEџйmricron-0.20120505.1~dfsg.1.orig/html/images/renderAAL.gif0000664000175000017500000002052710322465014022350 0ustar michaelmichaelGIF89aю-їšDœž\†Ь^\œв”œF,^”ЄRЬdЬ–”мdž”ЪЬTДдв”\„ЖЬd\ЬЪЄ4œ^4дž\ЬŽЬЬЮЬ”ЪЬ46ЬdfddžЬ &lЬ6„6d:4„:4L.|<<^”<^\$TМЖ|œ~4„^Œ&,d4<:|œЖ|4єєк”Ъ:|<~ЌдЖ|<4\\LМ~\d~|\F4„ž|МвЬМв”œ^\„:\d^\Є6 М~4d:|lЄœ^<\œвЌдвЌМвЌ\ ьМœвЬ<>Ь„fфЄ<„:ќўќќtќLžќќОќмўќмžќќLќўœJќМvќќўDBDќоќМўќvќtОќJќ|двЬœоќ|<<„‚„ќт ќќЮќ|ќ,ќdўќьtvќєЦ М |Мў”єќ<| ќ Мќў4„ўќвОќєўЬќІќў,ќŽМќм|ўќо|ўЌќЊќlњќМžќжќ|ќ.$ўь><О<ќ іќьўќ,О,ќМ$œќќцLvќќŒМ ў„ > ќФќ$ tўќ ў >4О ќ,ўФ,ў$ўќќФўLJќќ< ~4ќlМ!љ,ю-џЯHА Сƒ*\ШАЁУ‡#JœHБЂA0gІhмШБЃЧ CŠIВЄЩ“(SЊ\ЩВ%G6ЇXœIГІЭ›8sъ„™QЇЯŸ@ƒ :ЇЬ3T’*]ЪДЉгЇPЃJJЕЊеЋXГjнКU Q\УŠKЖЌйГh™z –Љ)[xЅKЗЎнЇ'СфMК—ЪкžH—vтRЪPROiім]ЬИqжЃ aBV“oУЪ~Я| œ.‡T•Qъ&‘ж1SЎ8ЖJfŠ—еА•NN(Y €лИqЏЕЬѓпЃJY­њЬХ$ІИ–Š™R%)š)]šЂVmЖ ŽбГЖ~іl„ЕЯфџП› флбk“єw[*‚ˆsy5ЉЉЅ­Ѓ[ЇЮtњYыalasкЙжw—щeлA”7™zъ­зоz€%uI,‹2,ŽhтдIЁ–ЈНfХF#Nчпv^7EHтF2&рT,зj1nZзЩикFЏё8E€ŠBрe}wPx %fГхFoGE+›|с%!yD"GSw(%F€­UБЂk*ІF‹зUqЂjpІ8Хˆ6b$ЊYgg?nБнš^ј9c-.ЩфXN%ƒJeQьeЖYRГxЉщoшJK=Ђд‰UˆAЇm^Aш'ŽИн‰ёџ7 FдСК‘ЊnnЗн›ЎйJы€Э-кd‚GMš^ЄщщFщ„—RaGЁДСH ˆмB‡,… ЂTryJ‚ХkЛІКЊž[ДЪЋц6 -з™xчR„юњъЛJн(ьАН)(Єš—Ќm“bйЌfPbF%}hЁ…+Ѓ(‚Ъ)TИЂRЯHh›hКЦъЛƒjьR7ђиjnЧŠк{/ЃgьЃR"+žБъ ЬgLС‘‰Тœд’JMЅK…­vЊVБF…’{ВГвK…НCvб4 Йx4г.оЉђЪaGЅХК\sЅds…P‘Ђ№'\ЗэЖTe_Љodd'ШьЭRёЁЦл|їџ-€.Ирz nxрd~xЅюсьїу+Цф”Wnљх˜WžTц™пvф ‡~oуЂ—n:lЅњъЌЗNдfЎЧ.ћьДч XэИчЎЛъАяюћяРWд{№ФoМмЗ3D <мД|ѓ@=”єг3ќCУ DУИAа 'XбіИЙС@Ы‡Яѕ ‘ Бя“ќ л б/‘єH„АƒјЌЫошЇПј д+`AЄЇ@эP' ˆdаМ$‰`Cњw> E€ьKѓШg>ха}2_Єp &Dz8Рь€Z№69`žЬ‡Т№ЅM џ>Єр}ф(ИЌр|<šp†H ˆмуЁНЧ<š R€ŸЁЈ!рЯ3x # Ц)"сTМ •.†ЏWр тО%і №сњіШG%–p 1#ќє(Х&X0р9Уё’<ƒd№GHBя…ДbŠПŠ’‘™d_ 5)УU2d•Є\Љ(Ы+ xР>YP„˜ь^AљЩKސ Дž•˜Bёmˆzlž Ѓ9@#|OšEФІњЈйОP^q•`#ЙˆЭѕ1“Ђ$eCЌx8ІoœMЇZ@ 'О,fЗщџ*3›”ž[Pƒfг(h%ЇЩ@kўs› Eц@Цˆ>цНБЛєЇ6 JЭ"0  ЉРю9M 2`Iј)Ч›%SŸwЄd?CљФ6s}S4aѓ6ЙЭ Ўp‘Я+Т (:ЭGV’9 DYаƒšN—yj/([тЯЈдІѕЄК=Оь$A€?Œ6ЩgEе‡BЈВ|АРmJpа"РЋq4э Кš‡ЬГр фz››j{аЄ!]—ЪТњЕ!4+њršФТ2–ЏхрCNЙЬТЂГІ›tыLx=šИВД -jSЗZ‹№š­Mˆ:[KкиџкіЖ8Љ-nwЫ[‰шЖЗР .x\*мтзQФ=Ўr‹ћлх:—ЖЩmтІKнъN7nДГЎvЗЋ8ь DaреBDš˜pюМшMяф’ч;ѓЊїН№nAТK_ё:„Мд‹KVЂ яЪN2ћUIRпњоWО BˆБВрЕLЁŽА„! ƒ“фK&ў€М‘ Г— .p‚>мВšDЉСыy№„W\a“x8УЎл0‡Н[›Fx 7І ‚„тˆœјIz№F"<ф—$frУpBОжcCDЦS€FЦƒ$ƒФ9Цqxmз(ЗL77ЪЎ_*уЙЪ$џЮХ)žeŒg7Ш!ЏѕШ n%?—­Суў8Кє$Пдэ>2РОvщRЫ{!3ЇTЩ_—э! yлџHЅ#дєpмрt^КЪС>muoтИIЩжБ=ёx?§дQgmŒГНb gн#|~Мллщч=ЩЎИAшKЗЉХпuЗћЮK xKЗяЮДЯMxЇ кŽп ф<№рA™ѓ1‡{ГkdУ хѓћеюоw‡z—ЈОэ–ёлulњђnўля…=ыoпјъžцВ?pэѓыnЕg~u­/ОРБ+ћgўјЙЅє_'§†ўљвWОJˆЇ§эŸСЯ џџj7#Жђ›џќшOПњзЯўіЛџ§№ПќупИM‹џўК›вЭьџўЯNџ€%н7€X€x€ћ•`ф'и€ј€Ј| И x˜Жh ˜ј ‚Шш"x‚(˜‚nF‚X*ј‚0˜‚и‚&ƒ6xƒ8ƒХт‚8иƒ>h€:˜`?8„D8‚Иƒ5X„JИ„0w„BШ„P…"„‹&…Vx…A…ˆ…\Ш„ZШƒ]†>ј…I(†fƒdx†jhƒiИ†n(ƒ,ˆ„o8‡"и†tx‡h‡xИ‡Ј‡|ј‡@‡Oˆ„H€~Xˆˆшw‚X…‰иˆŠџш„Œшˆ’и‡8‰–ЈtИ…—И‰˜X`Ш‰ ˆw‹Ј‰ЁXŠQ‰ІŠЈ˜Š›ИŠЌh‰ЎјŠ’‹ВиˆДX‹ˆx‹ИHˆКИ‹и‹ОИ‡РŒw8ŒФ8‡ЦxŒn˜ŒЪЈ†Ьˆ…&вhЧјŒD8и˜вŒжˆƒкјр8Џи7ŽцŽЉHŽ(("pŽюŽS€ђNPNˆъ(‚ьјŽќјђјѓИі8ak˜!И§ИвџXYyЮ8ŠŸиƒь˜‘йŽ Йљ‘‘"9’Щ…й€™’й‘§’.’$“Xx’Ј’щџР’-љ’ “>Y’^h‘eƒY`8‰“:љŽ<љ’?)“A™‰Љ‚‰“Fy”:ЉюИ”Kй”#Й„4I€ьx”P•HйJp–h™–X™Zй–щ0й•Eј•к7•cI_bi•ќЈ–|Љ–гш–€љ–rљƒtщna™—рѕŠ™—bщŽ}љ˜й–Q˜щ“=X˜3&ˆ ^KАŒ™—с™Ђй— ІyšЇI™‚I8ˆ™v”ж™žљ™Gy&pИ9ЃЙ›iљ‘Јљ›“ЉšЋ)‘7шšћ›Z@•Z0›Д‰›Юљœ7Р›в™–РYЈ)œ=Iœh(”)Ъ›Ÿ тџ‰›гYžgiш œђhšЩš*hœ*спI_Щ˜у9žцYžщЙŸе‰ьЙ•ю‰‚№‰ЗœѕUŸyyŸї™ŸвЩŸЊž” ‡P9”X 8)›U    Ъ Ѓљ  z) м ‚ъZ_ЊЁŠŸ ™!Ѓџ ˜@Љ*Й!–ЭзЂфЌ\ф†Н1в7НИм­ѕ-{K Сl<єѕР{­0 `“ВщЛљ§‘Н фYžх,Ў\^‚GЪd-цЧMцe›ВŒ›pшџРПl~ ЬŽчЩy—sюх,›w.ф%Ћv3§Žр"ш‚Ў‹л|V}цъ ‡О‡о™j^Оr.кtNЮ–~щžщnф^.уd-ъ;ц‹;ъєй™…ўœˆ^ьЩ|˜Џ^ДIыЬоЫЖ^н/>у[аM§ы‚nэЋ ЙЅЬЁХnь0{вЕНжЭ^юЯqж-_>пиоюПž‘ноЂпоъKл-nНьхЎечоо]жЮюйN_ю^Ж:†оъ‡юцŽкзEЛеБОя+mВšžю ф3Ўа .жрU№‹[Ћ70яŠNЌМ;Z ё/ёDня.Žы)ёеўыџцё*ђХ‰ЮП пЧљэDЫвZЉђ+OВэ!ѓa.ѓѕEѓ6?iює8шВ—’ѓ~ш!Лв€)єъMєЗўяvуі4ŽэЭзюMшQ?я Ѓц;ЏU_ѕ\Ют­ѕЮNё]Ячнa/іa_№eАъ АgяєoЏісuѓъъѓЪŽяЖMїО§А{NƒGЎї{Пї~oцyУNЊ…_јє…ј‰шђЙјЭMї,пђ^џѕ*•пї—bzћЈВ ђ пљпўљˆ.ШХŽЄ?кŽњЈїнњЏэ__7 ››џЅЖ_јЌ.њl,6ќзфиoю+м.џŸ |_љЧХЬOћЯў ~V\њМŒ§йЏ§Ы§Љ­oќЏOЌg>јш_јъпћ”щўD` D˜PсB b4T0EтDŠ)ž9#0gІ`дшбтH‹LžDЉBхJ–Z\О„ѓх š5mоД9@чNž=}ўTшаЁŒEzУRІM>e:PЊР„^Хк№aC’]%‚миёcFŒ^ЭЂDЫR­ —leОе‚SюЭŸuэі$šЗhвЄP§ў:!ТVБ6шpkDГ#СžсшёqуЎhMjаАV-\Юs=гМЈ^Н‚ђUjєяъР .\0џbФŒ)W|ylШл#-_РœYГJЮp?{|'iцЇQ#]эЗЕрА­ЧІ}еvяЏd!‹ЬтярУ‰—yЙrЁu›7нAtЈгƒXНž?;CёНыЏП‰а*Я<євS'хtjДїˆŠ5 ”ЂƒщђУpП…œАЛєЎУёN*pИcJP.іdТŸЋаТж0ДNУЋ8ь07№BQ"1Ю!O„ #\С—tюEОbМFУQ@%уБЧ).PШ ‡$в%#Ё@rE&™tЦшьЃЖ)ЊвЪџvфMK‰TN3! ѓ%(тROЇ’;Э4џе”.Ъ6g{г 8ћЛrЗВьœТаяћ…‚GПњёMЧƒнљЧПЋљ)b} рє ИСџ …€ЖJ №˜ЮŒА™€§\ЇПќIp‚@Гр1˜Сєqа†7< ABіа‡&аC:[˜Ї ОіяZxAЭїФNб,ДЎ8Ч,.j‹@с' Fм(lUGDЂљ$“42q†Oє€шоИШzР‡rœ#ыH#=Vr‹|єOдТ(Fё‘1oYB!ЩЦ 2RŠQ(рs"ЙЪN2–„%&3 Ц?oyžDтФ–Q>”44e0 ШJb–p L@&ѓЫXЪr"Fфd љЇЫ˜шџВ—шљe)…)ЬU>с ФDf8ХЩLrоб™ГDл&љxKi€0БІсbИl"r›їьЁ7=рM~’Pœџ g9-yN’@““Ы“ц;]‚Фk.Бѕц=%КO~дЂуh ZP?n “ьLh  @ˆЂoЂлМhJ/ЊЧоЦ ˜мРB*Э|ЈЄЄ<ЉUКSqЖRеL7г™"q7hNЃШSІњTћКМCНMvэХO;UЊНv6eЅ*ž„L[–еЖіЕWэьm‹шиоЦ$ИУ-юq/КмшfВКїЬnЙЖ›Ха†їšхНnzПйо§ЮїџїэдєЛп88Н^шЕр‡8ФЮpeKњсЧј&.щ†ће яїЙ7.№Š[М 8іЧ!щ‘sМфоЙDи]–ŸКу5ЧљqožsžЛuч=њFtЂЇћхEGzl‡žtІ‹ьшM‡КаŸuЊ}Ч•ЎzжХИt­wнЫWWЎзХюtАньо›њйе.лДЏнэ_Їtип>wИчбtЧћ3лžwЗ#|р?xТG|тПxЦ7оё‡|уСyЪWођ—Ч|ц5Пy ОЯѓŸ}шEЯ$'sоєЇG}ъUПњ\ГоѕЏ‡}ьY6доіЗЧ}юuП4{оїоїП~№…?|тпјЧG>юСА|ц7пљЯ‡~єЅ?}ъWпњзЧ~іЕП}юwпћб;mricron-0.20120505.1~dfsg.1.orig/html/images/prefs.gif0000664000175000017500000001143510605436666021707 0ustar michaelmichaelGIF89adQГФТФDBDфтф|~|ќўќ@впРкЎдwH`шЎ!љ,dQџ0ШIЋН8ыЭЛџ`(ŽdižhЊRB0Мp,ЯtmпxЎя|яџР pH,/BkАj:ŸаЈtJ­Z•Ў`ЫэzПрАxL.›ЯшДzЭnЛп№И\Р2чјМ~Яяћџ€buKZ‚‡ˆ‰Š‹Œ`<[„YŽ•–—˜™–LJ’v†mЃšЅІЇЈ‹œž“wЃВgЄЉЖЗИЙkЋ’Н­Џ†ЕЕdФКЧШЩЉЋ†Н„Ÿ…[УБееждиВлзгГйФмптрЪчшШЬЁЎР пёуджёѕѓнѕїиіЄЦщЂZзŒТ;iсђ‘›Ѕ!?nўђƒxЭœР‹­ыb0’+xњџИ”ѓBЏЫH“љ…i1ЃЫ—˜ѕzvвЪџJВм‰RžЪЃхš“qйЩИ9"˜юWн~њЉ9 uШцŸ’ЩЉ—+`йЁ ЊЈb‚f@Ј ?ЊwЂ‹VњXqТiІ–vњ^Ѓ<ъщЈH‚Ъ•ІюpJъЊЫЉ*ЈЌЦъœЉ6fЊЋВц ЎАъъыoДfjЋ†П+\А ‹у’ тjьџГW№ŠъЋвъu—ВRЄ”Іx퇋i;'о‹Ќ;гж!-EВ`›ЈИ HюМ’СKцЁаЊЛdКчО*ЛЃИKЂђ~ ­Н“ .ТŠі[лВ]ў АРуђg€>Йg3сїфХ ПЫŸЧрйщ1И“lbСxЖœš%ЋYЉУН†*1ЛџЅ™хњh&ЧCz‹f•iЮЉЃМ;_9ЎЦ?ћ,2•c–H д–вЬяК4%G;ћјrдtzД•й’)Д“_Џlg{RЭѕЖgђeв ?gЕЛЉю p]ёй“-dx)ƒ[Бвq'}xл='ZfгD‹IїЈwзhѕо}г™8џфŠ>ца“? цф]ЎуцfGЮЙъŽ/ZЙЃXуЌѕп*юЇ‘FКЬsэЂлоёяњБ­yЦcsLrЦCЃ-ГывтM­оYSVїгЗ[ѕЪН~ы’8KіТ)lуЯмМхИъяњŽiO,ћ№Гц>Фёз_кќqzoџўсП)џLвљ`Ръf€л3 …Рї-№‹ё_оКdЁ Z№‚вЁ СчEЬZ ЁGHТš№„(Д‹ѓ6ˆ˜ъ+b{‹Ё gHУ깆иСПVШТhэk…—УЁ‡HФ"BDUJр›{xЉЂzFŒЂЇxФ7)‘‰§k §XqГ џи#!T уgз‘+b1‚ZЬєВ‹Њ8DŒpŒтFд”DeN<пС“ѕФG.™СЫ;Ыk_џCˆДбqLфGєЃ:ЪФpV cЪu/|…ЏMƒœ йEzВˆjY иВC™”,1›dёB@8ЫИ0ˆPaHT>IKъаŒЪЅХR&‰лy­ pг˜гv L?­ЭЋ\[Ÿа7:‘€…Œ'пXЫjR‰Ѕ4šр”v6дNdˆkмдТtЂožюœ;š›ц0љЬnВ"9Є4­IЯQ`—ŒЫгЦК)ЮuNЩsb+къR9fzwрKС+БцFАБžЭЁ>їуШЅ /џ—ќT9-z4ЧAэcлG1jКfFfЁkь 9žQkšOѕ: —NŒљs[%9Ѓ–ЪNrыtfФ€Л–е–§Ёc6›ГŸvДеЇ6}WЫњpЈOєЌhC€йбšж\$*Г0ШкжКЖ-•=m—ОњТ7Ѕ№ЖИЭ­nwћXй^–ЖАlЌQoй[пŠ ДЇЎXу[уBѓMЊџmЋr!Ъ\чFИEЕЪBІ+ЦВњыАж5rmTx‚‘ЛRœуtbz/COlмТЃСю„‚ДЊ`М™Т"бл]FТєЏEхт,YЈЧW3ј-#5Ь_9Вe”k№Щ“Ъx%ЬЄ> ^З8Ј›С“С 6"qMМ­’Г—3E1$cЖ2ЉюtMНЄг€В;йЗ 6ы‚ЯbPZбŽmћMANџт'JDюgˆ’,cJRЩ7AŽПKMї˜ˆеjŒ ’гЯTyНфщA™,Ip^ЩЦaъIБ Eѓ^ЙПйњ…„Уf<ž tЃ~У)ыF'ц{љo‹В”ймV6ЮђЭC|)џMць9;wЊ7ЭГ’НЩ:@zІbўІ 7ЌFщ":Žъ-#i—цфЭд_юбU‹DЬИБЋ<=ŸьЪ(Bігpє.!РћA‹fЪЛЦЕ"Гœђ™Чж‹6Ј§Ъы№šг„МЕВЇhит:ЛШю№ДХjэk*лŽЂЌЗQlЮšћм17hР­nШЛн|7М(яyАоі ОѓЭП}ѓл~ўўwќ.pіМрљ:8ТŸЅ№…›‹нП7Ф#Ўя‰SМпП8Р3ЎёїЕ ЙШGNђ’›ќф Ђ­ аЭђ–Лќх09 нqчžЇцЂН9Ю-Ћѓ#Жч>?#аƒџЮФЁ…F?zМгЅєŸ3]­Žr…Ѓ`l 7]ЁOПЄѕn|GЌЄWo_жУ'Ѕ'tУ_‡uиЗФ/zœj+цђLЦб}vЌЦ\'; 3}Ђќя€<1Dд”IvvЕHQцф?sгЯ­ы2мЕ ѓЪ[ўхШmмNя5=-w}*5}лkQЙх3tAЯ| )НЭХ—qy~=A1 КJ}М>=3@ƒљyLkдЫ(шQзе‹у>ЉЇ.ВХќKњУ›яСду–‹–&=юМс‹ђЕoБПІЊwœћkзјУ_*Ž“Uу?џЇЬЏ~OЅП§лa?ќЭGsАЮ?WяПsђЏџџVеПЖ§Ч*ќ€Ф1€x,ь—r˜= (Bxг2b}єbuhыс}дCР–DбvuSf˜S`ii‡Eшa‘9H`Х—G%IZG=€u‚˜ЃkK–'tЦ{\ІUŒГeКT;3ЦTSуƒBШbuЂ Xƒш1aP–jšVdAH5Еч6!%dLy›ѓ„їС•‚˜т{ЇЇv1V{“цІі6UX$ЈЇƒЌ‡tIинсzaЈƒД—OUјTСї8ЖWfЙЗ†DƒpЈgЖЇ‡Ћч||v‡9шM}иgj—…•Д… ѕ\ЩFxdЪ#ˆ.4ЪTS`Ж8FX}•6ЁЇu.“|nШџ…Eх…ДЁ}Љ—€нC>И€ЈеaбХ%‹(ИИ‹Иб‹Оhи,Сˆ€ЈИ/!”3›јˆUŒkvŒžж.c1uђХŒЮ˜Xo(;qИ‚2vw‰Гш((Ш Юc†МyЧФŠСˆкu\vƒя2z№ЈŽЛШŽ”8—І‡€„†-шЯŽyЅmиˆЩcfLХўx\йxлИxRHv„˜ыв0јЈgšїˆ›HИhЊ(‘ТшŠа\ ЉaЩa™•%IРИ’їЃ‹.iŒ'йi1Y-Y“Ÿq“8)@Й“v“>љ‹@”!й“Dщ3mЌ xLщZ$9n'Иџ[R9•T)•нЦoЙmщЅVsYљaZyCФ†s_ieaCcщ•oјg)DКЦ^dЙ–ње–5jfeGБ(%xP§8_ž'ƒ%Р‘M””šДXVA—bidG— X_А–Pй|”€hf‰˜Gє`_@JјD’Т{щuю˜a/i”т(Mл…™{3b „#ѓ‰‰wFLГ‡QЪt›В)˜їЕ ЁšЋљc$i‘ѓT`_H“iNшhНЧ‰ŠWš„iIО9CcЙ5ЂШyІgRШŠЫX›ЋЗТ”f}i’аZ›dhг‰Tq–ŒTЧЩœ”diгJb(œM˜‡”™"qџ™гЉh‹йž#…xd6`eј{˜јS›w„ƒhe™žh‰|ЂІhjbxx$ˆf8ЈK|bPЃ'Ы‡œб  0oй•Ю(КйBМ9ЂъЉmWЩXBkБё•,JЂЬіЂіFЃ5Jеі”оІЃ;JD8:o(n>Wn——Є>аŠІy”ЙиЄN*“х)‰ƒв”VzA>zmQY•\кЅ^ЊC o@ЄіФ•ЭqcJІiљ}+JІUЄWaкn•ЉRќI—%zІ—•ђ–щi—п…—yyvK˜—Tw(КuнAЈтscЙ|кŸŠy—6ш‰Ѓщ™f7}YvжШJjі[PJ^NbОJџapЙЉ‚zGy0Ђщu–ЪJZшЉЯ €бщfѓф Ќ™&cUygŽаGR-Ж|Ж™wЉУЋюЙ4Фгhz9˜SŽ6Ѓ_UЃkZvˆ'8Цщz {џє3XESAVŸBжЉIZњ ­;:­ШзO%‚Шƒg)`HжJŸУѓ5ƒфVЎoTЇgi№uЊfІЎК*<є zБЏlxЏлД­ъDIШЪЌЉežЩVЉйЇ‘њЇоЅSѓIАРЗ;УwQ[­нt U…vФ9‘Гк…nњІŠБЄј2Зi‰•4›iГЉ‰ZИˆ­Щj#Е„K‹[Ћ+ЫВЭА=Ф‘iЄkЊqK{џЎ7šЅЮіД5кЃLšВЉXДCЇъVЄЙ"Ес…ЄJ:Ж*yЄCЅАЁ“h+TЭŽrЅp[!`k][њЅv{ЗМ5З6зІZ›ЋзЧЗEлДЦИ++ИзЈцРДZ‡ДƒћЉљЈyЎъВЭXЉ†ЊЈ—:)нYА[(ie>ёЈЃкЙЫЉŠ…пƒЉю%™д!ЎЦQЎŽЪЏaIЊІjЂІ+‚6ЎuЅК,иЊъЋфъИ ц ‘+­fЊ‚/fЌДщЋzJT(Ќ;HЌOsj'yЩ*w1К›ТЋcћ­,ŠЎ_"ВмЩƒз†лкz˜  ћjђ™†И+Ћm‹’ЯЊ{*ЛZ ОR5џ7ќ8ГeАŸЏr(ЏH$шГ•;š(П49‰сН#ъЏеQКљ˜ Э'{tшx(ѓy_ІАyЩДЉ•РKЅЇ ­ Љ,С TмъСПчd#{ОьПMH и‘ЪŠc„ыІ~КkШЫ51ћІSГ'г3Шє|X(4ЋжПгGГ‰ЊP;ЌІ‹kЂXЄŽTћНРyЕ Ќ”DЋЕ}Е TмИXлf^< VkЖлKeeМЕzk\^++mМ}ьGЖt|Z<ТЮКЖёqЖzЌjлЧпИХ… Ш{œЦ„œЖ||ШЃёЧŠ|ŒмШиhШœŸ\З–|٘œЩšЌ€ГКruќЩ ЪЂьџ"џ7Щ69vІ<+ЈœЪйГЪЌlЎќЪЫВ|,Д\ЫО‘tИЬКМЫПxЫОќЫ\ЬВбЫФ<Ц|Ь3 ЬЪ\ЬЬмЬiћЬ 4Ъ?а@Э>`Э‚,Zq|Rкl‹МќЭBы\н,vPЮ§#Ют8Ь„ЮlwЮс\ЪхЮЄЮ™Я<ЯјмєЬ(і|*ь@§Xџ|нB-,§+> Ђ{y\ ]хЌ3К бђŒXOљЊMZMнЬАРббўа”б™{Y"-ЭQS€љŒбŽйCиВнЩб№\Јuжв)Ьdвz9y“&e)MвнH›Дгвмг1Ў{6Ъfт5д+ 4кчвльY>=СжњО?tЭRвQ@еxь[WM|Z7`§Š8}QG}б€еаЅЈyЅТЉХе] mHMдћГаWећжВХз‰хза‘з‚§ЕжТќвmи#щи6ЃзіCЊ›‘іуџшжЬŽ‡]йl,14чб(8љрвьюЄk+“ŠіН]%ЄЏ’#,ЖУЂŸдwg^;ѕeед‘ЪжыЇ'г•P2ПбЛыh.ЁЉeВ}гьЅYњЄš_Ÿ /А*`+рAA?ERvўЃъћZYL-Xу4KoђєсC‘NіŸќAнƒf=ўСрЮнЎ*1кUѓrOщAJЪƒ*ЖЩŽуGњвFk^КE:ŸЅ:Х—.4ЅŽ›rPGхIz“Ѓђ„хЪмІ†S"ќFШѕ)ю>œPTTVьћTЫjё!ЂOКБЪOжДЈ (Ђ€ЂŠ( (Ђ€ЂŠ( (ЏЉIR‚R $рч@%*Z‚R’Ѕ€Щ5ah^—]5LП ":ёГ„Ѓчъ~šњgгhЉ€­AЈRQ ОqŒ)гјS№ѕ>}‡™šлЊВ'ЁћNžcьлZЭЌ SŽфњаœѓоЊQЌoz–BЮ Ÿ!чRЅ!0Y;AvŠЕ@П*‡рЧxFs§WТ;ш{еЁв§!jkLЗлCвнR‚‹М”уЫДPцК „ ŸК?цЗЁщ™гe!гЋQРЩр щ?ј" ‰C,6•8F*fгЁс[ G8Ќ>Д-‹vk… ^0ЄƒюŸЯš^ƒйWЅ˜n;ˆejмёG>П:Й5$Й—b2 q6 Рјеkj†Н=­$‡RV—лЮьvчЮƒфоšF‰8ЂTЕr=РšW—Ё.+ (=”ƒ§ЋЂЌыЗjhF‰кѓiїMzЯГ}›yo!#ƒ№ х9 ЩŠЕ522нWЛ…Џ|гn–ж$УrєэнзПНZ}2ъSЏ-ZoQ‘%—QА"BНе8 ЯezЧрh) IGљWS:nдv‘|ВaШyi^`ў|x8? ЇT’•ЈAСЪƒхQ@QEQ@U‘в}ўЊН&SрЗyNэёЄKMЙл­Э˜mJд2@ь+ЅЅИЮ‹вmXЂ„Ваˆ + O(Ч—НGXЕЖQЫfXbi-Ж–Ю2СWзАјgжЋнЇSЛЁЙš;е§fЕRднgЉзс$хеdйДУђЋеЅЏ:y%ЦгэЉ  @™яAfкЃZекл ЅjFжв;†).ЩFšе“ЁЋzxј­zШ­‹WіЋSVгЭž[_dпtыwцZ™j^ ƒA3fšмШС[q# 8Џ{”–#Bqй Уa?ŸТЁtх’eБn*Kƒ` дnЛjcŠŒл{НŸVбч@З/S0ѓю5‚Ђ8їFqKжаєэA-rЃ№г{‡$wЭ3.6›Z,пИ’;ZHkPИЦЃ}—ЂКpRаœ„Žљ4užЩь6e2Jyф:wuДHdЖъ’G"YѕЎyЧмЯс#ШAЪ”TЦІВ;bМНh)HQ v ђ>ŸтЁш (Ђ€ЂŠкЗDTћ‹’3т,ђѓ ЕњMІлFЁžл…0ЦхŸК3щмдS/*‹Л;n; јвU“ЗШ}O?JЕЅРjЩeЕYcћЅ–ƒђѓq@cђЯњее\ЕЬд![‚V–“Žp?Ўh%К}ц$Љи ю'—V=д/ѓWTNЖФJ. ЈŽUЗдvŠћ6О$vлЩKiШЧ9је эЖ,ишёйЪ‚КyQц,ьIBМŠ{Šwв MoR%,–ђ<=ныmЛВ.\№RHч&Бv§nŽАбy9э„žдљ5‹эЁФхIŽЦМ›wzw фwљŠˆ‹Ћ-як[žЩšЩТ™*ц‚#VЦKŒЁ{в•Ž ЧZВіњм;њSпЫoЋЂщh‡uBD„dЇюЈHW^–ЎMЭЉАo4ЖЯмq;“<Z 4‹В‰p;… ~bЌm9DKSlЪVV;јхfВ L@ЪŸSЇ9ЩОU(—šKЁщо—<аlЉД)*HRT0Aє­WббйMFN7a фжЪWЧЯšЭ)BP ’’9‚ЉОj ѕхХ5Џ РRŽњyж“=k‚фЛГŽЫWс^v§VрДСIм˜шIј Ц[-Ђ-02|ш9[XЗLrJ")˜ЅXOc?цœ:eЈжйж}Ўё#8O%іњqєІ}p‰—л|Ћs6Ќn+гbЉ§њ­ђо$eМ?р8ѕe?ЙяVtъukQGm)’‡% Hю?ъіЎ|ЎЙ‚РœмЫ3ŸщЭd„чЩдŒЄў‡ђЎ`еVЅYѕ ˜ЪIH'pЫ=ЧчšZ(Ђ€Ћ+ЂvxжШyФ3>"Вxуš­jџшt$СбїЛвВ1юnЬ'§Х-жw2dч‰РR”sл џaTчN!5zег.€;w8ПіЇЭk4лД4ЧяЦУCžrОюiGи/ †мЛjМczм*ћРіщЭк&щн;!З!й+>шь3RЃЈЄ -g`QР%T…di/,*D'НАpЅК3Ÿ‘І+ЅБ–"ЅO0 UјбР4 7“7hx‹+a?ЪN*Е›n— ђЬ–фИъJі­Е+€=E{MЂB#Ц‘Д’xЦjrгkzх1 QмиW4kћ6:ж9№ЧJц^ЁiЫЕЏVMОлУЊŽыХруgоhžрзN6т>Ю06Єѓо’ЎбBd:…$x=БA\i.ЛK„лq5KiЃ…Ÿ­XзЌщЋ}Ž=гкy2Bя’;ƒщT'QДѓ6kГr"Є!‰9;dЈwХ.ЫuKВ[YђIu_š‡ј ЖnнmО_–`i›w€Ѕ№>ђёыш*[Ї6{ЕЎњЛХђрыђŸHFТВ œžц :gla›Жhyg*#ШUЅg‡тHKŠByузвхk$“иqH“Е”›mРІIJZ+и3л>”цгž"T•$Є‘ље_sihН9э@…х9ѕЭЬЮЁ<бJYmKQўVаU_XеїЧ›" c5НkД@˜Т]QѓєЌ'EОxХИQал„эє ђjў›\k„ УЫћЎЦj„ъ=Йvm`‹ƒКЄКœ~ кЎiб.ьЖЅЈВ•5ћTЎЕz}ТTquЕ; oУiОж‚№qC‡thр­(y'<џš­:ѓlLmHддЄЅ2Gˆ2;ю?Ј4ЩЂgІ_N"(‚Ѕ4в™#т“њbЃњђ›’Ѕ-hRAЯ#œі ЃшЂŠКGЇБ§›Ђю”+k8’~;”‘аW7WOXcx&ЕЖG‰%„ž{€z яЋ“PЭЊнm %kpКЏ’F?sS]0КЦ‰`e2кМ1ЪTqСэо“zИшUіCD|ўdеЫЇ4Œ)њIЈE-ЃcHHx§шl“Xžс лк@#‡Ю+УS]Н„ˆ‡X$‘Yi­3:ФђPЇЫ‘вЋ'• ЌЄKrсрћ#Š@їwиѕ ^rэhžЮјhJ~Э4щW?†ЯЃлї Кпм")ˆˆЮ&}ў#зл3ќБr вЄЉ э%*ŸЅ{0љіwђЖT• Ї єцˆ^ -ŒВсP№Юх$#§OЏqщYАЏ иn!"дwlG‚ЌlѓчƒљдjДѓbПO1љ§—V7zwM<щnSrЊjщSФу>)ыл=б=*uPЕлБ >ћ.6GЉIћВЕТDЭфupЄHVрѓѓуWшЄmъК тC§СUjъ`WiИ!m­–T—т%cЅ[9ѓœ(ЌœNЧVŸТЂ( оБЁKМF !YЎЊМЄ1аТJI'ЯюџšцMв^д’Ѓ€\@'аn§ЋЈ5!ZЬ]Ј ЗRŸў˜ ч->к.=MqзЪJЇ];ЛN?qW=ЧDГz-HJAйќ€Œ˜Њ м3Јd’тB–w'ПоЋFЯЊюQ[къз% !(№аwѓѓ q6Щ№‘БИi qХEЫЛIВИ%Й–‡„žУж›ДюЅz`KoАцеёќTрŠнОiццЖП ЁС‚šіZƒЉ,СqŠ –ЩP=ъjЧ D[_ џv9Јm9ЅM˜Є5ЙЖвsГ9џђ™ЇNfнЩ2к9>tS[xк ЙЈI%jIVEkFе.^ЇЊ/€–PY*9R“ъЏiЖYгпA)Pтc*ёS•Ћф<‡ЮXj„ZZDVж1ќ%#№‚{šL…tNŸvT–V†ІБјG4еЌ4ѕІЫ).Ш‘!YjфcіЄПmЗЃкЏxлПAtйЅЧЙEjC.e$(f…Пx@VF{еsЇ­qЎа“іtЕEс^ѓЯІ)олUК ššяŠP’S) )#ц(л`с <фќЊ}Œ=t2оpјiф)Mkд}ІФ ѓPДОщiЗ=O?АЄВJFRG4уЈ›-ъKРЩZгƒŸuJ$~„VxŒ€;cПЯ>П*uъV6Ћ‹йGќД”эR†NОC)Ц=vЊ‘Њ‚яŠеЪЂso›:эЋ•ФN";f8ž>'ЇЋ4КтVЅЅХ…+Й“^8уr7Љ{С [‰нД‘€OŸў•с_R’ЅЄЂpюk5ЬLJe§5(Њ™т&&&cЎ;Ѓєn1е$Жъ’ЕЅOnP9н'"­­Fінn$іŽАsЮх cгŽѕWhЖБеI\чйаў;рm­НGЕzђВžЮВž=C‹ўФVХЧ.3\SLS9‡2ЭgHOЃЊ­Э;n’€џеWяEzљmiљF-йЇС } u­тBgшыuЧїаЃ,ЄЇŸўXЎ9iТгЉq=вs]KгЙуSш9VФ-%я-’|”;ђPMˆжўЈ=ZrЪхЉ >›•”ўр}j№f Kk 1иN;qTŸQc; RFИЁ% u <ŽBаqЯФqVЄkѓї{$y0+qдЌр~tщЙЪR№„!“žљІЭ>‰хЅ9-ртї|R}ЏOнчИ‡Є4Œe@ж›{Жйj/ˆ\лС)>t “ђЊЃЎ7ЭšЙЉ ‘(l?ШI5kGмЈ­МжJT3кЙѓЎ’k\@mАЃˆоъ{фЈаGh+ЕРыks0вЇЅ8VI%Щ'вЏKЄi’ dуqхYь)KЇZN6—ЖІщs]$  rZG||ЯJоorч,Ч†к›o<Ћš}whЗ[сЎ\Е%œ,8I$ŸУѕЅЎŸYэЗd96VХowЕ}дќqLнMЖП&ат’Ђ JЧM[%KˆњKŒЉjŠŽ(:v%–ЭgmЗДДкШ ДœвЅюіЦяЖ PЃЪР}ВуjфzRАШёьJnJї!M…'?ŠАГАѓ’VмY.n 8ЪИђ-кЭ6СwDI ИУь,8л‰ЩJˆ?{ыŠщэ-wџˆ4Є ‰{­иќ]ъ)SY†ЉГ.ф3u`ўй?„ќ 0tЦЛvkjiідАЄЋЫо4:Ъ:eiљ1]hИл %@ prа€zчљqUKŒ-@Љ<№{WB\oАR˜t— Ш!#4™tгnAR Љ.%CiIћиє5QІІє|Ўvцін^#š&yі>ЕO_RёŒ} cј КsшžЕ4Ывd<”В‡[;ŽєЈ‚1№ѓ§щo\лгaг%Пh*‘%айТq”ї#хЧыP-шЎEqтшлuŸSшЊвефЬЭsˆ˜˜ыящЧ^Џ.ŽЦT›ѕЪkЙQK!gЬ­Y<§*ЫжjmžŸЦсs'ЉCŒЅyљїЄў™Av’Sэ ЊLїIirOн@ќљЉЎВмЗ eЈ,ШЦXѓVпяWr хЌ91ѕŽЪqGѕЂМh *жшЎЁћ:њмW)Oˆ1џIћТЊšнД\kК1-9ТяQчAsѕЃM­‡f)!EНц|u0ЃќTчрN~DT?L5œhvгm”Sэ “рoо эѓЌчйVМщŽшуЦИСASC.ЄЄћПTљzЄW2A’хšєгХ8\w}рZœIНн™#Х АЕmлДŸО•Kx,њnвМф] АєI!Ф…šeДщЩJP[’мQяЩХдXШf:YBp„Œ*Кжzi™zін~”а\XqJ‚HрИК X0фfƒn,ЋuЉ~†&лž@PNEОqwЉюI}[›H8ЮЄgL€€ЖT1ЗаRхŠsЖиn-–вTкЪA<€ Gj)NМЖХ'Ф}CчnO4u в;бTЪ.•кyRИэŠЋlz}›Є–bГг$/t„Јэ FyOЮ­˜–fЁЖW ЊK‡јЎИrЂ}kFЧc\]At{ЧЫюИ•уhђ оbЮЪmЛmЛйK|ђжхŽсK№•=œH>ZнМЉё ehЙЗЯжЂmж'aM~dT%яAkGѕzаLъЩˆ№фЁ8qнЙудгmЉ*UБЏœ‘Э'_їo„Б—ЫЉS?ЪЭ>2иn*A8 O9ђЭ{|ЕMЗмœ”\c“ŒfЁмΘ‘ŠйBїфOšДќH“[S[ат{Niz~žГЧ+qРЄŽћRЌцYНDTСSўряЈvње%ЌЏ*еšЅ˜•Н„/Сdў%ЪПяШUд}IoЖиЄCЉ'ТCyї€=д~BЋnœZоКjШэGl­ѓ”ЕЧ Qм~d§(/нk?З<ŒAДЖ`Ј№ЇpOгїЊ'Љz…wНU5вВЏ@“фд†*щъmі6–гmи!/ј1™.OМЅРќOsѓЎf“!ЩrћЇ+YЩ4TQEEP^} дb<ЦЂ:юМЧP?SњрRя\tŠ4іБ3bЗЖС>*@%yї‡чЯШŠJв—“fМДъ”CJ (њsСЎ™Пл#ѕ[ІъKehВ7ЖF8pп%зхAIєКћrTяБqВжвуeЬћ˜ючWН‹А’‚ЕьƒЧc\Њл—3|мёцХpŒ(c‘мщ]гоЃьpллRыx7пAmd4ТžyA)HЪ‰Џ—8—  УЁE<I—лќЗf}˜вJ›XЮсиќMal”Эm)\Љgi9яšQZeZn_jлк2Бџ0зтЃуPKЗZ. MТ,Ѕ }х6vчт<ЊЬсмZSHq*8ь)џЁэ^#Г\mMљЌЁe ќёо‚Mж _DXoe“Д!Г“ѕјVдhЗ.’™2 Œ–Зх#ŠYЖ]э6[Ъ[‡ y}aАЂйфїгфХЕџїHJ_B›9V{Šэ>‡Ыв­wYnHKћЩѕнoe(ЫKs%nBЙPњдFБГЧ“]P)eAjR;GqѓЉ}?c3йnжї‚Їq'rOРљаOiћR’L—Ц]W$šcqП…Ё\nfrслTЗ ‰)9кMiLз0šЗ;і›АыI%AУ…cсыRК‰ццR”ЖДя'8Й—UпО]žs~шэ,ЅВ?˜gН–ЊП/R_АЁГ„40‘л?WзGДМ})ЅdjЋЂ‡T‚YнфŸ2>*>яШ|jžщОŒ“Ћu$vви1Zq*yDунѓЋ{ЌЕЋT4и`эDX­Є-)ЪЛ% 1AQuR9|МКЌ•:]sžaђ’Ћ7[я-зVВI5…EPQEVчHЕуЖЋ‹PЄ8|4№SŸОO˜яUfгЋaдКвЪƒ”ЈwƒЄКЗгЕ4#ЉДшёfНжrOтQ\эLы-Р:Тм%ГŒŽШњŠИzmез-ыD‰о…œ€OтIђ?:qъL­zъкЋўš ‹‚†T„a!учŸE~џ­ЇMѕ*uЎЊс M„  ЋЫд|щЪћЃЅOiЗ#L^Р­ЩлШЎi“уЇюЋaдНc )#”Љ$UЉЃКвє&KвI a/ d˜ѕјаZж s–(/MžI)Нъfи—ћwŽвw4Џ#Ш"’Ѕkыuкзс%г—xN|щ‡KЩn,& Eoz ќ€ [дpюЉЖ%жмHЫ.уКБ€>UяЊiZч>ћ~ШЫшQBРСЯЛЯж˜/N6єДФ}„–]CПеIZэјх0lРЅХ•…+žС#ќа9м`*dh№т2„Ч|џCгЯѓІ{LVa ГГj8Vп"<ЊИб—ЗcСzЗЮфЄ–ГЩŸJgBзM‡6:Ею'?—ŸR76“яw”ѕ(nT5*fRGпЮ0=kцЁдlбтмфЪB€Й8Њ/Ј=OwR)шх)Ј…КGМрєв‚#Vkйї6ДБ!*ˆ•ЉфŒFoо—,6)кŠшЬ,—Z€TІа—eqKјъ№7хp”'дŸћЯ•t QtЗGl… ?wSdЉїЯз№‡sAДФ{_IДhŒСewUЖJмЦ9ќGњGы\бЉяЮ_.n8\Rк $)]жOuнжвvІžђдћŠejЩ*8.|Чє­@QEQ@QEQ@g"Ÿt_SюК^BЗœ[‰œ|Aрв+usDurдѓ[ЏA?Т“ъqиŸ1№<ŠЄѕ.„НigЯЕE.GPїHЪHњRьYВa9О;Ъm_СЇЫU.LiШLˆуЋHRqђ4 pюг  Ё™+JэMіn­п­1ќ6Ф„€T HќЊeЫЇOoэЈЫЖ’Wџ™ЭœќG9Ѓ4ЛЃ1o‹ю>ћYЂЈ0елмћoБ–™i[В’Ÿ>)}Щб.2§Ўчx–ЗенiI~TжЮƒг)gsзяžС?оЗЃщ-Уj2Ўž_’PвR?: эымц^5жK ’‚Ўуѓ­ЧЕіЈ~В9x|ГŒm#ž*СMЏІŒЉ$CК,œ—R}ƒзžŸBBƒ66”ГŸѕЄ)GђЭXь›ЅхФ!зхKPс)RŠБVщQИЉЉк’{Vјgjеяœy`зГLЕ[ZKv‹TfT76а$§M'^ЕеођЃт;Б@а]WоЅиtЄZ4ЙCLЁ>ѓщOМтБ‚@ЦIјšЂ5ЅŸЈf-щNЌ Ћ!YњŸSQ ZмQRдTЃцMc@QEQ@QEQ@QEQ@QE} RNRHљљEЈ“!?uїЩfО-ї\ћю­_5^tP}$žфзЪ( (ЂŠŠ( (ЂŠŠ( (ЂŠџйmricron-0.20120505.1~dfsg.1.orig/html/images/npm.gif0000664000175000017500000001760510506736214021357 0ustar michaelmichaelGIF89aЪ[ї„‚DDBDдвЬ„‚„dbdІЄІ„Щ‘<><ќўќмbdФJL &l|~|Ќrt,Ъ[џHА Сƒ*\ШАЁУ‡#JœHБЂХ‹3jмШБЃEˆIВЄЩ“(SЊ\ЩВЅЫ—0cЪœIГІЭ›8sъмЩГ'M xJДЈбЃH“*]ЪД)G !JJЕЊеЋXГ2…*t„Џ`УŠKЖЌйГhгЊ]ЫЖ­лЗpуЪKЗЎнЛxѓъe+ЋРЏL˜0‚Нˆ+^ЬИБуЧ#Kл7ш_8иЬ™3€Щ C‹MКДщЖ/ЄўКѓП^]  A‚‘Ж|>ЭЛЗяпРƒ—эК(q…@Y7Lю6`‚šhVр@zuсиГkпЮюё„ЦJџOОВr†Ь+GЙіmюuГV–>м’EЗП_Ќ~Йџu'р€й}‡PxЇ y't0Ј^WЯЭ†З‰ДлHЌХ%вؘˆЈШ!(ІЈтX„`„СШмq&уk<чœlт]˜Ё| rhIѓшŸ ўGd 9$‘F. %}T>)т”Jžˆ_ZVх’+†)f]-єтA2ци`fу”ŽыUиcn№хЖ!—U&Yх|,""|‚ш“ƒъЩЄ“L’ис”Giш‡&J(ЄŠŽiщЅh•Yа™12h`НЙcfеMWъuMrщhЄYт‰'ј]џЩшЁњ™tш­ЕZŸДNљЈŸЙіКjЅ˜kьšшЉ&šžВ *Ž:Z[TkmЙ‰dg‡…ВJhЃaQКч|ПђlИАІ{kИ}›ЇЗхЖ*юБєвЋЉ›Ъ&Ш,ДШŠ#ЈЂJћUаuf№ЛЮл*Иѕ;ЎЛТJЪА‰ГлЈТC|nЎ†жыёЅ.jО7BзЌПJ'…PkР VXa‡ЅЪ­”пЂлЇ€Цњm–]> tЯэОjєбьЧL ry#wЅ д3.Їц„—Œ, Pгw‘ИєYcƒmvpїFmѕyХ]Нrж0P-€айощZі‘{уџэЗi  јр„ЎZсˆЎfр‰#юіŽx=ажwџmљх˜›%Рцœwюљч wўUшЁG'2F€нeюњыА†ulБзnћэВП­еюМїюћяРlТoќёШ'ЏМDФ/яќѓаG/§VвNo§ѕиgЏ§Іеoя§їр‡ЏUѓ •œ‘љтЇЏўњЩ“?[yЂпШГщ+ПBm"tу§ьїяџџ.ъžЩ:%ўэ"мШРъŽ€ѕћзГ№Ѓ6Хo‚њЫŒjdAITљs Gx<їy№AёгзВЪ—ПІа!ц{Ё§"HУeё„8Ь!VLЈBв‚œс џ5h2жp†6Ђ—ШФЄ№0†H|mиУђiаˆTЬb1иФ.zq(OМтчGD!"А~cФbKІФ/Кё c=CЈСeuм_QHЧ4rŽ€ Єеж3Н6 ђˆФ—gШD:ђ‘Y$$'IIѕIВ’˜Ь$і.ЉЩNzRyœќЄ(Gщ;и4ю”ЈLЅ*WЩЪVКђ•АŒЅ,gIЫZкђ–ИЬЅ.wЩKUvХ”Є І0‡IЬbѓ˜ШLІ2—ЩЬf:ѓ™аŒІ4ЇIЭj&s=Рє‰6ЗЩЭnzѓ›р Ї8ЧIN’їЩџЯ~њSž„:Њ›’аFC$9шIhУаq’Ч нlшHŠPšPtЂ0Йш?7ЪбŽЎ$ ш= šPŒšд$е(7SZв•’ДЂ.}‰J=JгšўЄМчH_ЊP‰ОЂ'§цLъŸЕЈЕЉR—кOœšIЄПФgO1:е…6є уAЈt&КUнlЕЋ^Х*P[њгЌjЈЋ э)XЭ*жГЂЕ kEыWлЪVВbѕ­LЭЋ^л RИФaмэjYб з,}сŒOќуТMјХ›лчд.ќПџ/8ШWЎT+œЋ.,wЭ`ГќцK9Іažы”ї\КЧЙа9ъђ‘Џ›­Ў-іУЅœьЁ;ш'ЕЗŸNuB}ХUЯ:šuўl­{ЫWяњзЧždЎг˜ьhџqиЯžіЖлиь=vЛм]МіИЯ§ю&†Л‘ёЮwз}я}<ХGMnСўГпѓсЏWНяаŒМ?Џ^Щ[>ЧQgѓд/ЯљІfбXяМшњљТўєяЄ<˜5Ьњdw<Ю(uIыQ?vЧ›кТ‡єЉѓoкg]ѕє9YŸ;p‚kкїOЗНАghF8УKЧ5œ‘яtрCјЗs6іiмшыЏzњдКџђƒŸссc|гмзѕvУ_§Я;{Ї"ГŸНўŸг?§*gџФЧПйђпZаeT>ЧXњ'tж­g[ЎG~э{ oˆsќHiюgz˜61ишvџц"ќїhж[TF[ХїnГ7‚w€Иwoш€5бhХч‚бV‚18sG%€=q]љ‡ƒйƒЙwo=x‚Жav|Bhn%Ш`P8|vtіg‚'ИkMјmD(ƒ ШYзЅj,aƒY(o:X„<ш|цwrFe…b8†N‚/g†%з†еѕ|эЕ~nXne(aqхz}и…JшX˜‡z‡#GˆMШˆ8‚жЗˆ8џЈˆŽи… hPƒ(SКЦZ5‰9XzџrИ^X(g>Ч‰аЖ…Ьз…vШ2gŠиЖ‡Љиѕ{|„Hh‹Ў8i“X‰€xW ИqЋF…И˜‹Кш‰qШ…Вˆ‡ччƒ@7ŒФXhЈиgыІŒ|Ж}VИƒЯИlА(Кgs3иif˜Н(x‹№І„‡‹&ŽЇhŒ‡ШŽьзˆ№юzѓH{ђxШї„Џ†;qƒї—ŽXVrењ(^ђ8]­˜ЙioЖqЉq9`ЈwЈ Щ€tX_ц7‘iˆ+І€wе€ТXaО(aюV‡Нgrщ‘ƒuІG…Ю'“”]ЭЗ‰џљg7.љ‘щіŽ4й[_sОHb7„ЗkЃи“ˆWb”нW(™“–јzh˜”yLr љ”е†*aоЅ•– 7ƒ4И•9ч”g'’GbRјa$ioъ7VчHl#tjЙWљИ—’‰~Йx}˜‚Щ–vG˜…љ“ †“z™’сŽBе’˜Ш)(™лч…ъзtMзvлX–ДиŒU—о”‘9™y ~ щўИrGŽвg—Ѕј˜ЂQ5›ГйІЉš@Чš­i˜n†{—E_'ioРYЗјgдe’Œ†t'y‰ЫХ‹ŠЅ™reaЮ9’иеpЦb5™UШ‰_KљuЎœЭџ‡b)_Вh_6Љ‘ьХƒјF‡ЋЅoH€5Щ’гYщдИ_™…w™kуIИхžRIXEyrIШЩ‰ b—,Е“pЙ E‰šg9‹шIrыЇЊШ™] ;ЈŸиX„љ5”а7[З]™%†Hй  ї|ё™„И–}?'–РŒТxw§љ^ПˆЃЪ_зЉhcЉž:кž&Š+Šr!КЃ=КY(*ŠлщŸЩЩŸwQx~дЙ{нѕ–WЩntѕaЫY ЁWи‡*JЂшј€ЯйjyЁ }гЁ‡ѕрщ›Šg|лDšэdЇIЦ›Њ˜b—‰ujўФ˜“&|˜ˆxƒyЈˆ*ЇЗџз˜ŸY›Žj›яд‚ŠzgQъfpj™В'Љ4% •:NOЉšz›xъNCUЊŸ:0ИŸЋeŸ-ш‡жщgqU‹я™‚ƒH‰›ъ™Љ*N:ШЊ_ЃT‰”фйžџ y:bЌжq›ЙЋоD„jи_ж•tLš†Я9ЄфЗЅ :Œ%ЪЌ ЪЈТ6…а•)ZšєyЄ ЌdЊЌ˜Щ­сД…\Ўж:­ыZцњЄKъ€žЪЎ†ц­щЁ­њ[ВjЌgК{У Ѓ§ХЌ'S—ЈЏЭzЉsdЈЪАьdЈ8Б[N‰zБqJx!ЈБhЗ‹ЫњƒкЈK‘ќšŒdіšЌ(Њ% ZЎIŠ*ћ,лВMЩБЧџH #‰АмWАЛuYV šKГ7хАІV­gž>(ЃFЅl8ГBлx'лЅFй`о9Еm8p™њДPЫЇ ›ћyЌєŠ‡"‰—iЉЕL‹УКЃSыЃж ™ekЖ6…ŠЇљЕЖ†­ Ў'{! З5 “ЫЗтGДјИЩwВ„И\{˜‡{sIЇ1ыŒ2{šŸ ЈћЈТКИ&ИЃЪЉЗ)TЙœЈ‰ЗRШɘ+ШŒКъИВКdЩsЇЪS?[К%бˆЕUЙ_КЅUYЙajX+(ЏкsЏkЅ{[К{hC™izЏОu“§ˆ–лЉ™8;ЎWД ыЎDYœШx•iЕІn:ГЮ ­зџZŸЙч_ВkQkДBЪ$z™ЪЫqа[ŸвъОђ  FXО#|"*Єyы^@Џѓ ДY)ЁsИž­[Оу—ПнKS‰Ќ’;АџЛ„ZŠ]ЇЛОEʘ›БЙЩ{ілbыЇEEВьwšТзС$\ˆ‰ћ››ЙЉ9ЭыЅУy—J’—Ж[УЬŠЖд СБщ˜чЙžњ[Сы‹YŸ‹•Yл““ШsрфЖ.œКѓ•eŠœqYZЉЁJ—Ь™ЗZšМЪЩЛ2Ш‚N|„P<Ё€TќЈŠКЊњЋA”TХПFШ†VЉЎ6ЗtЌФJЦпЋХЉкЋ|–tH ОфЩН|œ–ksAЌ”ИџI•SмЧ#LЗ1xЌ4ЙЄ—лДъЩ\цкŠ5:ђgС{Y†О Џњ5ЎG ЩьЂОыТЗШв[ЃVќШ Щ&Е|˜ЩX;…iІЮY•^HЖЖŽ•ЙЋ&ŒU|ТA†С7Б™;lЬ}{hШЬч†ЬаЌm:,NћЫ;›ЏŠУ2МИrЛЬaмФ—ЮэUФтъПо|Оx<š,Œrф<€ь›ЌЕIŒХry _ћЎпGУЃ[АћыŒп˜Лh<ЯєЕWJР_9Ÿ?њУтŠОK{аС8Йo,КwФЋЦo:=•ЗEЦџкЂ@П…,šК­ˆ\а6ktOКРѓЩбIŠѓŠЮI‹“џНОЅiбе Ы‚ќЛШЩЏOмЖЦзОфŠг9в;їdkkУ ŠЛћС™Р+Љ›нLУ›Х‡+Эw:Э§fИќЮ\OZжэˆдuЙй,ВЙЊЫК ТdјыЩhМТUжiцŒЮoНMХ+ЮыЩX;Џџ жdmНs‰Г,НПГŠииgšЄгy-nЭ…>}†У –ђ;ЙГ<oћи.AЛy УьНв(вkMдЫйѓdИђiМ/к‚ ПЭ›ЪŒк˜Тs •Nк:jйŒ-гД­з^э–ыдUЊФ1,ЈвGЉЬ9МПкЖ]yЭн‰fЭvб=Ž#\нeэЗ›‡нМFЛ$џ+иЇнУЉ ос­th=зїиŸшm‹uнЮ“)иŒlпKоnјВœЫФяЌКu пх§›­7њЯ7ЉЫФ)Іuh’…ЃбyUnyЋ1\ЗZмa)ОwIЋйIп—žp,Хa‹Ў0­Д-ХњYЌ3jАќЯI:ІaKФTŠˆŽŸКО3\ЂЃ­‚Ё­]ўЊл%^sЃ­)ю™}ЕІžЙЅуДhЌ˜YуŒœ[9.тР{‘Іm–уŒЄЋ=ф‘-йt‰хkьгzŸ­‹іквFžШ|Л Ќё-„о}зхšи†]Žцнд‡эѓ›ЯйН:Щх’KЋ(žй#MˆУмзм}Ьз­ЗƒОu^џ}шЎ6жŠngлРе‰ЊШ-ш˜85'ЧзјТ3 Џi‚iŠRвyУ мЅ~ЊЁОЙЄЎдfЖ‹В­ŒјЕAЫ“Г8оE всѕ‹ Р§ЛŠ ~љzШл‹l)^rVішСгЏЮВБўујњвч\pИ.хЮžфьи- ьŽŠыыДtWш&иu\с|€>[р9ыЯС)хэ=э *ЁFzЧŠ|ЩМ^+оиЎrЖži§wСЭРlZяO>ЖЂЈяRЩтнхчбыФиŽЂе*НЉЬЕоЁє+№ЧЙ›ŒЌц™ы‹}e йъЁkуXЉхЌ МДm‘/Њ’<в№ŒоїNŸ,Ÿа6џЭю'ЭžAКТ7fьІ=с<пЃї „%/ЦS}пOЁоwLѓ%y‡ЗХуљ™ђЌЌ‰№~ћN`џсі'ёЏЪ`ћЋ4 ѕ№Й„nLа3яМЮа­ №d^цў­Ћ&Юэн>нv—Ілl•.œЩjйї е­ђ˜О‰ГщЭHСtЯЫАЛщn}чmЫ|Ч)GС‡Пъ…~юоUш^gŒžљˆ.ї€ЧљХјмЫбœъUMеš}о ŸЙžџxžIН OV5ьсОњ*!ЗEŠ‘ŸЏ–HћыlћЌЏн*мsсX­iQЮє>ŸѕР?Л: ъiŸ~Ц3g3ююмќцtхvџЙи ?ѕeьѕ•ТИОеКБПђVEЙG?щРЖ+Jд/цЂъ№фЊ§їћШNO|>ЮЭЁ@ ‚* р`Т…|x0ЂТJŒˆQуFŽ=~RфH’%MžD™RхJ–-7PSfLš2mpS€ЫŽyўTшPЂEEšTрLІ5€SЇа„>•^ХšUыVЎ]Нjl6ІЮЉ_ЭžE›VэZЖ%ХО+5юЮЖuэоХ›WЏлЇ}ЁЮ-kеcU…U%ЦHиbEС"vмјАFШ ї\|љ"fЩ-GоZєшЅ~MC•‹šngЪ‰7g„нњЕџUŸ…]CLœйumЯyЯЭёїaŠМ‡“Fž\-\Іdчтў(˜6tжв_їЖ§ЖяжЌqOџВёуыБ•ŸG•ЙпЈ9Ÿ›ŸЌлŽОс$4Я6Э*BАDR№ЉіЮАь ЂЏ< џыOFcћ;ъfд1Bo<1H!AJё/еXьЉМљ „яG Тя3Щ^|rЦ#2•ВK/=*ВІŒK'cЌЯCь€œ’I§Юф‘Iй,Ь№K;‡,в9еАt0ЗХbTLК,ƒ#”У4џЏЋЬ"A‹kMтzQJнюЄєФ0ѕlЏв•ќгДSO‹Ъ“С=?%ЕTSбКTдLOeЕUW ѕШї^ЅЕV[MJUжQ§C C>§єuФF%”3-DжX?хєM7I“Н5кЎbsзш:DДL+kДЏЯЁфОуЂiмpElRZu‰ЪЕкUyнQ6Б.Rm›D7пеЌГ[щLw]Qo/[(!LјMp'зс*ї§їм7fЗрАмE8рШф…1XfЭЅX_Gжр6ПЅqe“aд˜c› Vг;+ˆJ’Cfы$ЮЌс mDљт†іћQп›ŸfЉндџоНЖРŸЉЄзЩ‡ЂœG‰ЖјУ™ЎHЈЯ&вcЇоЙj НWM—уvГцЌc.зтЃFЛoŽЈe{ЕБ…ЛQ“!.TбЎ-9?ХѕCœCNƒлаqh§Ц<эKAІKрЩ3н.Рн5tгO?KjвWEНuзГНЌзgЇ}(ЈnЧ=їVœй$яхюeп{Ь{и–gfОkg&—]ффGњмьщгY-‰#kцП—Ш&нq‡~Vt‹?Љњх­їWCяу~@чПўƒФ_WЮ5~|т KЮЭжр7FѕKд+Хh–2 =hiіƒ ўђW>kаk"Т яѓ0џpА€v™бЊtО6Œ@Ж9П'СёQj $`Я&rТ9­ oНbплІЁкK€)TaэnB"ёv.м†ц–AfGe›1с“V†7У§ЌŠ!|T–ЌDк‰ЏˆD\ чІ24ўЭяƒWc`—˜УІaьwzгрЙј:ќ1Œb|ЧD3вftTх ‡@уљlpLЁњци7 рŽx,]JЙHJžŠ…c9"я4YIN6“љƒ$ы:9JдБPwHь)U :Sц•Ћ„eцЂђEZ~Q“б‹e.o&^ів—ПМe\@9Lbг˜ЧDf2•ЙLf6г™Я„f4Ѕ9MjVџгšзdІЊtЙЭцЌ–пg8Х9Nr–гœчDg:еЙNvЖгя„g<х9Ozж“žУf>ѕЙO~ігŸџh@:аaтГEhBЁ’P†6`Ё EшC!ъаLє …(FЊQ†rTЁЕЈG# в‰ŠєЂ$Э(J7ЊвŽВєЃЅ(LMJQ‚ждІ7ЕІACъв‘Ъ”Ї'ѕiPw*д’ў4ІCEjQ‰šвЅЎДЉ-ѕ)NЅ:UЊSЇJM*SГъд­BЕЋ/§jOУ дБЋgе*ZWZUЖЖЕЊWMk\ЙЊVЏвЌv+^ЩЊWГЪЕЎ~Н+`ѓšRЗжА…ы\ЛзХіUБџ§+d+йСR–Б–uld5;й–жГŸеgb7[йб^ЖД™хljIЋZгВЕЋ…mkcћZйžДЗХm4Eык™іжЈО}*o;мрЮИe=._sЛ\ц*sЗЦ%.rЃЋмщ66Йж­.fЏЋнцvзЛу{nmi;оэžЖМТ-ЎxЯ нє’wИп…ЏwУыоіЎWНй5/~б+нњъКё№rчk_њђзРдэo‚ŒнўиС АяЋ`/˜ЛfА…ѓћ`6ТОА†ї[agИФ!.j‡UЬж‹˜Н.ž0Œ |тќ‚ИГ+Ц1N[Lу›иЧ(ўqeLрљІ;jrМd!ѓјХNŽqŠїйЯt =hBка‡FtЂНhF7кб†tЄ%нч€;mricron-0.20120505.1~dfsg.1.orig/html/images/nifti.jpg0000664000175000017500000003047710416517300021704 0ustar michaelmichaelџиџрJFIFџлC   %# , #&')*)-0-(0%()(џлC   (((((((((((((((((((((((((((((((((((((((((((((((((((џРм"џФџФB!1"AQaq2‘#BRЁ$3br‚БС№Ђбс4CSƒ’ВёџФџФ7!1AQaq‘Б"2ЁСб#Bс3r№RS‚ёџк ?љRŠ(ЁЂŠ(B*v‰Йеэ"Вœ`Ј9=ў€даєEП‹ЌH}АЦXл'ŒС?Е3;ђFчw+ &Ÿкkb‹Ћ…ќ/ЏбoЈЄМŠƒ$г rs€ЂГ!ЄЏs|Ќf„Љ5с`;‘Q•e”у$ u,ёњ›ЅЙIkоџК%њ…TЬ(љ4їjїх#Чv§ы—j^Yњч‹ѕ EsњŽ>ды's> TсqTы4-qыa=жNуЃ[kЕ­р'>E‘1Ц}XoЅUмєжЇ |@%Eнƒž=чћVјиpєŸ–•ѓљЉLФ$|BЁЉс )5lngіКџCuЫю-n-ЖќФХЛЗˆ…sіЭ3]PЩ<­r>ЂЁмXщЗyљ›8УмYFвOдŒ”мG§ЭђTS№gќ3kбТпQEЭш­ф§'ЇЭНрyЂШђ…`ЪЇ^НVмtmТэљ{ЈЄїёІ>иЮjC+сw;*™јO‡PРсмGЁБњ,­i>ƒЉРžЮB Ч‡?А&ЋІŠHd1ЬƒКИСŠ’йџ„нQЯI=?ѕ˜[тѕHЂŠ)j:(ЂŠŠ(Ђ„"Š(Ё­ŸEDаYO9Яё˜*Œz.yЯм‘јЈZ‹vуTеМЖЃ§T';І>˜ЧІkcaMROƒЫmƒаcгпZƒˆМ6kWСдЮ›ЮṂ|єћ”EJrќ –ЂvZ_к“,‰–v НgЫ‹—Џ2т>iTU4кєK(HЃwSќРSп›є1D][пЇ;љ‹ Lb˜\FьЮш9ЋKНF `AmЮ?”T!ЏC’ @ fЈЕ=бCmоМц—ЅФэ$цЅ hƒ3^ъ‚LjЙеn_ЊН]vй†|)џќїЅ nлП…8џэеlK• qKšH•‚v'ыH0Ч{YJn#W—1xђV#ZДc„}ЧэкЅAsЫЙwbГ7vЋ*ДdњдXЌЄВГШŸюБЅ{4dhlšџZЌŽK=УЛOUЖVW§ ŸБЅ`ћж-mЅЫ%Ую>ЇН8ЗїЖ€x“Г€~єƒI…зRYФ!КЯр‚Ељ>ЃіІоЅю}ЧЋєнYnW ДŸЁчіЋ@UЦG5ЬtfХ]С<5lЬУpЁ=Ќ‘б6~•фw>mВІЇWъ)ЙbI—žўт€ћќI.Ї-ж#nххPuДЭˆQ@"YU>ƒ–уђЂ­‰lћ_Ь‡жВ}ypъвПЂ2ћГпqЦ?ђџz—Gi›гuAФuŽ5єqmуЇЅжZŠ(­ёЄQE!QEEjzcJДŽдыБk|89VўУŠЉщэ8ъšЌPˆGžVў”Эw‡7eЈюъ-mL]3ЃЉKh]ŠxђpsвIn}hBwЂК7ЧhКŸЎ?Ы[EќKM7д€G,0FЯ_Їпчю&{‰хšRYЛ’NOЁѕ?[ЯеКџЪiфДfИЬ=†ъE%ƒ8§žнИЩЛГy|-ЅиЈ]9M‰’їЕƒХzO5”єѓUI $6ўў<Тrђщ-A'—#ŠЭпЩ-бШXcАюЅqq!оPЅ’ ‹мђiˆcььyЋlFЌе—2ф4rъ‰ T;y5"Ц!’чзЋЙЗ_єъЦ№СЕџWвч\[š‘ HuНа4JЙЖт‘ЊAэMA%РrI_z”ћwIž)0їnЄАE!эrиїЊчŒЅи =ъЏˆпФD,G Ћ9u!W$TVИglgжЄFH9œ=ccsLQ:фŸ$Ћ,=љБЈ77І+„y}щ`˜.q€ж—Т‘ЗpIїЇ@зЖ…@|’I`uœвНY.Aрд FрnXСЩ4ЗBБ*OБЈлИ<Ф’)ж5ЃUЊiœбѓIŠ)ЂH„†5Івu}јKŸ+цЊ fэы^E 2Žh–>д{Сn ’№ЛCИфVњ)VAСНМфqXШЕy-›iVhОыOЇ^Хqэ1іѕЊЙЉнМ–ѓЦ`­=§рІ2‡RЌ8ЌџUhs РжяЁK<ќD,7p}HЯ§+BФ*–b’}+OЄъ‡ЎК%ЌЅЗŠ.ЊщЕмˆ‡ $*1Ч|Œ`žј?ЬjnлЙЮYŽ?œ6ЁцI? ?•ѓuеЖIgЌ1vл\(ž!ьг№sTЕvМНQEERЃVwUPK€ЉЁ  ќ=щљu k{kevМж'Б”)>vїє?Еl~8uЕQА”D|OтНМгЅ ОHњTa{yoхmм{дvЛ ЖЉ‘‚ьЉŒŽ№ЂЄ—БEБH}yЉvšМŠЅn€-щЮjD:ЄrГЦЃ=Э&h,ЎIШ§7v4сp:=Њ$qН€>–{їСBърI†ŒlЈwзsх€qšxZД'dш žФvЇтв˜8xЅkƒВaКS›]PоЬ›ѕфB˜0™$Œ—žєИфr E FњеЇ‹ђё€чsvІ™ючџTˆ˜ўЁо›э ЗS=‘Mљ€ќљ*йьLЫ—\7Џ]4#Œž+Bmѕ3уCіХCЙгЏŸ–XŸ§гŠv9­Ё!@ЌУ‹†fFыј~ Ѓc/%ЃSнШŠ‘ 7)тЇнXO|H]~е\-Р$nr=˜джVbЅ•œЂрїў ђйŒЃp9ЯвЄ:Ј]С|УщImг cшsO[ШŽгЯБЎИѓ.BСlŽ:џWЖNВЃ0{sNЧ xN}iЙbёP•qR!‹hл-M8дшXэFЃšО’єЖ‘+6вхvžpxџ­#DеЂаu­#Јy­ч^Т$)уDо˜Шл~ИЊ[ЁtЖ m!’Qфк `р7гзёYV•žICЫ~™Љ1иHцU7WКЎЁqјЯSщeжвІэД}XОšШ1KЛ\GЫм)eѓјdоИѕwžЋИnЏј'вЗА‡{Ћ+Yєћ$ˆ К“џ8џя\ІЌв(ЂŠŠОшЋ_]ŠfRbДцL №НПОцЈkЌ|афдu+DXЫ лФF*фŠ1Нл>ƒєћP…7упр]5гн)ŠгHƒUОи[2M*‚3Ÿ`N8Žщы{§OС{;Y.ZФЈЋrsœіЩффћŠ“ёS[џФџЕнNfo–Iо8у( ЧАЯфзYш ~žщ8uл8Оё/о лИœ8Š ЖЋ­iq •Э5}RIЕ;Ђb0ЫЛo†У Лx§xцгчšDSћд-A lВ$}ъeЪ˜ј0єЌєФŒ*+Ю%›Тš%#о„дH›c/єжЁ ПыЁфzг-mœЌfŸ3 Ё$ИIŸKŽ^`84Тш’‚Hp?4і˜вГ_zžо,ЬQhїЅ™У–ъ,ttЕ-–žA3nЌn4 \­И*Љ1к*œЙ,O|еVЙЈ›d’+t>() ЃЌнJ‘PсGyNVŽ[“ѓRZK{MЦъeї;jŒ§AнрDђЂџ0 і&ЈэmЎЎnщЅ@C+2‚AŽiћЫyaŸХ[hМ3ЩXЫ‚9чБчяŸЕOe4ДŽЙYZœkьѓбУ•NІЪRu4„œ[.ћDуъp IЖъHЗ*]FQ˜d2œЏїСЊШtйЄЗ–і(˜кЛ•лА8кРЧ8>„QP`‰ље№c@_р§ПэRЮ†gЃтьV'нЯПqэbЗ6ЗP^GКW_Qъ?WЊщHсЄˆaў•KdГЎЌ>X( ј9зпћVЫ$ХШСњеTбšY,ТЗјmcqъ<еи§6Z 2ьA мкZл<ЗїoБ™A8‹dњ2пROгŽuЋ[›kйbкT+8єЯєjєэПO|9г.bCu=фK3ЫД.7ћT{ŒэЩяŽ1кИБqЋЉI +эIЦ3ѕ>ме”BЬb+Є2T=ЧЏ№КЇСыQЏ|1ъ‹BeiєySS‚8Юћљkі\Се\aР9ЊЋлI"}а‚TћTуs™VЪ‘ы^‰@U‰ЯЉЌѓ ˜Н~Ё‘T _ц7Tђ[М^rФ§ъuМ5›!lНE™ мф”умгіqEљg^})ї›З]е];K%!ЂЭ:RьРTйъ;еœq•цЋЪїxoQLEv`€УУіcŠiЬ/д+jKfМ+™ЄTLБРЊ яжyY ƒмŠFЇЌЦЊcq ƒџ*Ќгdi\–VЕ= 9kKмn%Œ6Y›'Х[,e†IХ,ШШ1œ§{з‹‘Ц Х3w& W@ЙВKœ#f`ˆВВ‹Gh'3'g ;0ШƒŠnтэDd%­”ЩЕф8§[wэŒр(JgЊЌ,cFж?ЊšЛu‘ЩєžмTИн#^K=WK ю|ŠЗвo--уc,ŒвБмЬЫмд™ѕˆйH„1ЯЌќ1–Ч—z[’ЌcN~ДУ kœ\u*жŸžkF‚Сy;Й<Бц—o Y3ѕЇcДк7NG#"”‘MuДxЅ—‹X(Эљѓ8ђ”ЫЛL@ 1ю)ћH-ŒыЏЖF`мћд†Ha„ЧМgоЅtМКpз­^ўмЭm/ оS€>˜8<ёЧПЦAЗИЖš!A2ЂFN1Ч2ž!@јЈEЃшїЗГJYžVXуAњŸh_џ”ЧVоЭ>Дџ<ЮВ„WєЮXй‡ч5Q№wRВЖёb•Eow$dƒѕЏ­wЩщЊЇ•7‚8ZZУs}tВ›АmЊkЧ…фxY‚Ÿ|U”ŒсNоMe5HoшП„р7cŽ)šhѓ;RЌБЊГ @Е—єфЋЏэІYі•'ƒшjuМrAo›˜nЏѕ-[н\LЋ+…уЖ)Ћ‰oэI„4Ђі"Ќ‰.Г.)БЖъ‚зXэ >}п0ЇкЛ0ў4‹юЃŸкžˆD’ƒ$…sќЌ„TО–BбМœŸzП*Єr §ХWЭ6G–йk№ь0дSВbэњф*W{wЧёьj$зErБљVЏ%ВџљjКŒTdб мIgoЯjC%ŒnЅдPU8к;xmcšђр,r“Юiэvеtы™І|•ТqЦ2sž;ћяЄH-эNефUЗyК§aT.™ !(Єpp^п_ЭLІЫ(`Гxн(0їКCy@пn{xЉ вgОЅЗW‘“Э'фƒић‘пŸЅ9cЄpщ;Ђ=рPN?‘S-u•Г–h…Мl‡DŽ|Мc8§ѓџZаќ?щшuЉЏжъwЖ8Yтi0DHТrrrЄу№=E[/=VВtхХ†–зЗ—іжšBО9kМ6мsƒл?Еs~Њжцъ rчPœ$8=#AТЈњZЏ‹“\kIЇйetЛX• ŒŒsи|з?4!yEP„WвŸgŠO…НNЌЛќ-\– 6“ŸМkЦ=ыцКь_/<}Јtс€ђшзбЎќHUpЃ=‰ѓўд!f:^ƒЇ:ŽшЌjVU+ё‘ИД7аіХXЉ]†HіЊk=1эzъўкCДкД„zюр}Вв5Ј •ђэкЉё Fpо‹бИ>‰ўЪљРј ќ’ јbT!Южє5VxЁ№Ы?ЊЇ\[Єi—$ŸНU2nbREяиšœЏ*УЂвкјЄ–fТЗюz TГЇ”`bhШџmG*киП Оуš[žQbІt†УRЂлТ_A,;гзvф?z›А89ЏfeUЫšdЪKДVMЂ ˆ‡шЉІQЪвmк=jкйЗ +ижGXН’k#"†у#НiДVнlЌiљу-Œ8ЊМ.Б’еО(іе’BЇ’FkЧ§X8к—œђ1QЄo6*Й+Q!kЂ‰xˆZ1ЕГЩф–6•Š(яœдKЩV&<‚=‡zЖБ™EЊЊЉээOИЙ­*ИђО7эб{ilЖбэV-ѕ4ў9ІdИXџWэQЦЅbˆ|оЦ™Ъїj­;h —ЙLbЙ§ъ ПBюИ>_\qPяgk„(Щсћч5жкяУufLцlBзqUгт`i#хшHRЁ“ц™лФ} ёЕЉЎ›ДВКе–уPККŽ’O ŒЏ‘A%Уу#Аvц’|_Qк#!`ЙQШЇДћ)fНK: ..# AoHУ-“ИіэŒряяV”,Б.X>*Љ.lpѕ'эїOkz_N5№[3Z0нŒ ’Мƒќмш9Э?гз‡Іz‚ ЕОš"№Ы!SС;NrШЧnO ПN•љ#&ГqQ –{Y$”ЙС$(ЮlgЄk^$Wђ\Уa5Ю,Ђ5tШ[9Яoе’qяV+ЊО иiњЭТСЇKЙŠ,jЎ”’@~ЁкИєБВ1G]ЎМkЗtхВ]_KЅ”Љу Œ5•ŽШV '”†Јї,`;cžдхлЊ#ђёY`з7W@d”нLУ{‚ДФЋ§›,`fqйZ­ЄЏsт2Œ1уšбBbhтЁYBwІі'hІ5[ЕЩŽ1чЮ2)З“+ƒB•Lиш"tЮчеLšўоЕˆЮqŠzФDгBЋл<-1ЅYэi$™[-Юц­€p8іХ$хкjžŒЭW2{ЗлЈXё~г?ŸЬ>ž• ^ВЎХEЧЁЯ?ЕYjђE фл#ЗО1YДК–F!(Яj|`J.‚ЩUНє2vn“3wљъДнlКŽЖ‰wЫn МŠG•р1 љяWІMЇu,qшё5œlюDЭ aД€A8cъ?IШЧsšЫш^vyэfЛˆœ2•'чШСч9ю8уПЉйjз[-Z]"гnц+7ŠйSА3.<Уд “ž-)лf,>/)’ЄмоРПн^плjкCEЋйЬ5 эЬf2[‰<@љЩюЖю=…НцЗs=Ў.э˜А_/т5џ‡вЙЭЄКЄx 5ф0d)•sДHdйЛЖAўUЂ[MХkЉлЌ­фЉVЎIP T“žќђЌNиZBђњ`Б›ф№ЄДurПХBOЇrn{UХB=RЦЮO–e˜фсВm]НЙю љSэWvк`дn5{Ѕšъ4ћu’ J‚@мXрoOЅPjкх†Йwm%нЋ,(E–kЂ СЮBюџМP…ЬdV йRЇк›­чWХЃмщ1оYЩм ?ФЩcяїџвАМzа„š(ЉњПЭk‘a2`§ˆ‘ћIsƒZ\y'`…гЪи›ЛˆfЫІiб|ЕЄ6хЗЃTнŒg%”0СІНAіЇШВN$›ЏЁ`kZСиiђQ‘№мjp#co/єš\ЩИqŠf'(иєѕЅn4MфuВfh#r|XЪŸu5чLёhЇ+їs*\і>ѕю‰БџfœdŽІŠ'щ#n:џх•,Жї0В*Вњ09ЭTŽVѕЋ‰#aіэUrˆёэє5!/вЪšІš:x:уП’№F йыSэ“У9SХP%й’uU =ѓWуh 3ƒŽѕйZ[ЁHУхŽR\ЮIMї‚‹пЋнЧУˆ7Љю !Нс$JКJЌ@ЯaыMHђЦe u%;jj ях KeФghХQˆ‰Н‡9Э_ЈРЦIћд2™Кg+ŒS1?-еm0—'qNŒŠ№АД‰dкp;гюnєн”7@ kАOrПхfлюЇБЌъщзпЄЊюЛЋdб€9чь)‰ТRтЈ,nPwТ#Њ—Ж‘ФЖЋa№їЇ5ЛmdОатkIЎEХѕШЗN„f^cп$ітŽЈЕЗŽћС“EHIЄk]DHsўЩ?^ўœVЂџЂяу‚&вzšйD0ЌBШf зИ•v ZЗWщSAЄнщЖM™1q#GЫ ##ofеѓEš^M;ƒхs›ЕЪчђjvњMЙ ІO%ЌЎ‚Xм%2dђG _^е3ЇjšђJ–ДЗ ЩhљЬxфqЦcп“W}mбщгŽКі•p†ЦхWУŠн–HwQАcЦb2Чъw7z>­aЊЫm5+@щ$xl€ЬИ>„ЉR>”Євмъ§@жmwaiI Z $A‡кTv9щљЎ{д—Ph?хЂŠх.тю&q"фŽХI$zsћVжнЌяŒw,Œж№џ˜ЏmЅHЯ~ќzіЌХ}=Є)Њy7Œћ‹+ eOаррŽд!sЛ›‰nei'bюЧ$šjŠ(B+Eаа 5w•‘d†ч Фџ-е­Џ@УЖвъ}п­ТmЧmЃ9џЭ§Њ%kђРхУ§О'; Ÿ!qѕВеRу<`в+е85œ+кšlSЇцЂЪЃvAХKІЇPW5Ц›Љ™™ЋиNPR™C 6 3`уагчŽqAаЎЦs3TŠf—0• щS),ѕХ qы’РЧАБУBВи47{\Ž*кHќŠjr§U&^FуIŸ;8яS]!}‰Y˜ЉKž6…*нS**Bхд_CQЌлmИRyЉTсrTW^ъђœЗ фžхTфчЁ,ЌШХА9Ї$bšbO"ŠдO)хАMБ'ŸZ\Xўlз‰—дъ'ІiТTHкIК7њ2+Ш†nЖмюЦ09ч4Ж8 њgЗЕ’UV`  gзž?іЭ9Nмђ4(˜ФўЯG$—и>_Uв-z‘-Ў2ZHIbqƒŒђ1ыЯЎ=ЊўлQY-аСpЛYwŽHПЯя\ъР/’FIм7‰т8\ŽЧуъ*ТУЉЎэ#'y|„Ё$Й=Аr}ѓлѓZEт‹ЃuPФ’ъmѓ7(в‘-pР§ENGИэŽk™ыа[iі6—fiо'‘ЖкЭŒ˜™1œzwћрJВxёGœTьRРŒрЕJдo#ъ=+хЏк-‰пЪ1ƒ“@ї=БмB…гZд:d—ѓ<ЫЖ›–@m ‚УЙт@МcЗ9яW[ЇYGаWВЯЊXФЦR–ЖђЪ в"БЦеSРрqя“ЦsК&™cЄшWАѕЭo,‹ Ž5ŒДЈФ)R=Ск3ь@ћŒ6Е#Ы4m™к“3Œї4!VбE!г:fƒBГG ’›јіbXc\ееK;$ŸjыPФТ‘D6ЦŠFs€8WŠ>ЭkVѓ МђЯацoіKЂŠ*•zZuEzУ ƒMЁСћгД“ЁOДм(шžlŽРгчБІкiъы’c к0)рŠYчН3*с†=kнЬ‹ЩЭшИm%]ЉУ‰бЦqŠіMІž ?{—ijp1О*CMР Ђfd|ŽB•dCЉ>•(D€юORЊтЌ€д‰ Ђ“DЬё‚эдy'šL‘фэRd^29л'фє‘ n™QХ, Bч4сэоКSlВhфœSSCoЕd›УiсQљм9Ч>žЃБЇ˜Rn-Ѕгчё&”ьЙA(чnТ m`'?~{Tќ=ЙЅПE‘у ћ*Я›Ш!ЏЈ ˜Эmq љkQ+FY™JюйŒ ’ѕЗуж˜ЙвЃ9YdH•г-БG<ŽsџxЋ‹Xeдд%Nг%E™B‚FжђЎаT€ЧGfіЎƒaвšEЕљО‰rЁo8СфЗ$OИЧэW‹Ы—.@‚рFтMвFу g>рБ'žџLТМгoЎ_ЋДЫ›ЁЙ|Q†Ѓ!@уЪ?Яў• ыЭjКЅь4}(xЪž‰ђс‚H^}Aрё§ы?бшњ–ЗеЬ+ђЖхф2V<уНшBыŸWi@iЄщЫ{ЛЧ_ЬЁЗ4cŸ7ьkœќBдє=CЇЃ–ЮЩlЎчI(w(^rйю3‘љіЭ•ОЇa=хм—#t  1и.UHэИ<џШW&ЛИk™оBB(ТЎNp Ё Š(Ђ„+>™…gзlбЩ>ў=дмWLЌGABЭs0#bF\БШџѕ5ЗЊIљЅЗ@Нg‚щћ,<Ш{‰љ =AEQUы\НSƒOS#Н=I)шг2у4Ј4™GšˆЮ Эw’@6zSфз мC1&–œ/&‚PБrDјXЯЊљЩляV$ХA˜ S‘Ј5‚їВUƒЄіЉЯЊ‚=ХFЖL&)эŸŠbRЉѓ60цaА`дoу“štЎN4‰!\qХqЖ R—ЛP’ЮqХ<эŠjЪч'4№ЁнЫ‘k”‰Ч'Љкuѓ&eДH›АрeћѓпзЖ9іЭ7`…яb ŠфлXd ђ0sлЖ*кв!lIBоH€:Ў—Ц08qэž~еq†7нs—œёдїš( O™ЗиЌmФЖp]ќП4ЗeЬЫ.Z3ŒЖGэЯАш=!Њ5ЭЃZЮЮЗбХЕЅvтUє#>УgŠ€БNЖЌ‹S&S+Ц оУ‚v^1Œœ}j%ђХўyq U3x˜\ф.ь9эю*бaORZЭuё/]žрG[q*Œ”o sму=ъCЖИ—ЇЄИƘZТŒ]ЊXЮЬHТЛСічщZ  {Xъmfk\ъ,’D“J ЧЛИ'Ањ(ЩЕš;Ÿ„“оЫ$ШˆUx%X№Ѓд§ЮkцЦ9$ћѓB”QEWZКкJH‚к9QЮтsЕГщЯЦ›ŽдМ8&ИRиl‚0ещэL1osХ<НЈ"Шkƒ‰HСь Э-AЭy6iЦС\аJы[Э&;ы{+ˆЭЬоˆ@Uў!ЙПЕъ0ЭfЅнД{МСšуѓнO їф}~ІНгn"n АЕ6Бн+Ъhнw)NЋ{~r>Ежnz7Ѓ~M5лНNг,–QnђнLDlv“…Œ1<§yуяZ*eЗцМgŠ*јœЄl,<†П[ЎZ56 П{Дwaњm2щœЁoЇЏ|{UІЇyg‰^яЧ0$fvќv>оaщы[9сщ­CM[^ŠщX$‚i2u+Ж60r\rqУыYи_Jщ›ыЩeъЖКйц—*ŸщGѓКp š–ГъЂлJъ]іMjдкєšл1q8Ši#lЂ2pУŽGЁЧ+SžїWКЖМъm4˜dŒ3ъбˆфx•˜ьŽ(№_$ћцХd5^Кг4Ц'ЇьтšёАЦъс Є\4…˜ѓЯ|gŸЅsНSQЛе/ЇМПžIю&rююrI&„-]uФšЋitЬк\d(cOЧoЅ`ЈЂ„"Š(ЁЂŠ(B(Ђ—4’* Ы€VН:ŒзёХ№ЯˆFьŒђpAуƒјЏЉО›?ЃэЎe№имLn'ьŽQШE$p ЧŽ9э_;єо—!Ÿ,В9•еe+$‚0Aњ чž2>•єEЊлhz/‡iЧљD6 И§hsњr1Ш>Є`ёB1ъ‹ЈтзЕ Х|C<ž.qŒ WЗІGЕVwRЦ4ѕž‘ElкWЮјŸ1рž;іќд-Bюm­ю-ЎRHн7Ъ6Дx\•<ŸЎxЯ5UyгјnЦu,ЧќТDЮyРШHЧлЖ*m„JСц?4З’Цв[9bэД%лv{Ÿ7aƒШ8ЫO‚7ќM u>)YM§\K›ylЇCќytјЩTžэТ$•ˆ“х ф’<и c89ЦїGКДЇvЗ{uМT™H œp3“Явщ+6Д“B˜Є2\Њ]jBbPqБV<Бс{Iђ;‘OќJ?СtћCr\\:\3ЃЈ"$ŒГ#&пд­Ч'ИэQŸ‡ТэДWtќaˆХёџјВ ŠhЄнрКЩЗƒБХ:9V6hя$fфgܘЩr„њ.}П~=ълKšx5YЄ’kPKИ.\ь#њ‚žн§3>ЕјY§ŽѓWдмvЭЊ!#ћMў†оЊпnZœНizkAwfгM˜[!0ю[T ђ2<ЄчžчœTK­СяШй @hи:‘яїЃвЃ>†fђККЅтЌ2mфЪ{Сѕд}UІsХ N0jЅ”фˆюрd’ђxѕЉRHБХ$„Ўд’OѓQŒOiБWqзSЪвјф]: ЋЎ“{†дe’кhЄ[œ•Wсѓл)…юGПяNuЏVЧІ]Уs­Юu­ECЩ2ЎШ›сЧŒ(\wl“шВšцЕsгіPIdт;щмЩ:А€œG`нGp+œ^]O{u%ХдЏ,вЬюrI­C•ЁЃ’№š‰ŒђКWnтO™КМъДзЕщXпjј?Щ9Xаc8эYвI9$“оМЂ”™EQBEP„QE!QEKGTA–'{жЇFб.$Й‚Ъо%фЯЕГнqЮь§O­UшЖLйИoOг‚=}~ўевњNЦ;K`p$Лtp—+nŒ6‚Iчл8їЁ Wвк47m/Э4k5вфмйС>U-й1ŒўЎHЦ{bяSПИИЗ‚#pї™HкuŒЬ№€фљЗRЙюO]тл,Ж†юкEЗ”ВВГБ†Oхѓgqo\љВ;уŠШЕx`ЗМ–PU ‘0Л"р№7њч>€‘иBЈјЇxБZО™o!MЏуЮ$r™ё7ићчЪqY}&X~J{i h’Г)Qзшrи%дѓœњуžiЭ{Ј/:†A,ї0BАІШ­cˆЄQЎ9уg<і<тЋo—ЕoТѓсТ‰7y€кxЯъlряо„-6›oywЋмAЃym"€’b7И*r@PXі˜ф ‡s$7РзCoЇB6*W,y^рлШ=ˆСяŽ_вu}cЇm-юђ„]Ч$R.S> й ?8_л4ž—бЇзOВ†(ф•eOи)лэNјЫЗ™GЈI8#4!Oшy-ю5KЫ›ЋPіЖрF‘:э!d `F@Я~ry=щОЛН“Oъ‰ьšжк# БЗ+r$O]З Ђœ…/гП5qЃЫйjК‰ŠxІКфiЂ1Хb6“њN6њрŒћ чšЕСдчИ™„вќдсV2y€$cˆ€9єЁ kЃншw›сЙвmс`Ћyе†#9п€2РŸ.їІЇЌДsў%УхфW™д;6SnрОJфЯ$0Ц6;gx„Š…І‚'3м/ d‚3ш.ƒmBТѕ–Ѓў#ЌI&<Ћ…\œэŸ^sT4эдž-ФŽ3†bGуь)ЊEP„QE!QEEQBџйmricron-0.20120505.1~dfsg.1.orig/html/images/meld.jpg0000664000175000017500000003571410476333252021523 0ustar michaelmichaelџиџрJFIFHHџлC   %# , #&')*)-0-(0%()(џлC   (((((((((((((((((((((((((((((((((((((((((((((((((((џРmo"џФџФF!1A"Qaq2‘#ЁBRБС$3Cbrб4S‚с№%ƒёs’ЂВТџФџФ4!1AQaq‘№"2БЁбСсё3#BRџк ?ц f3\Ежc1˜њ&Р\œ|Цbў“”Ћ?qK џЭ‘рOвћŸІ сpЬ’ƒ&qUњЅ иK“њр‰kŒУddz47аЫr%ъYєАЖ -Н”§.9p‹j(гэaќ№EЯииЫN>ъ[e qХЄ\œ?’ВЃЈŽ„АЫЃћоF Оžћяl[аiTоЎDьМЬIГЪJПЎ4TYс'ИФ€2—kѕX_‰WBЄЉR&Ињџёe&™Т,ИЯчЮЋf)йJ‚ж†Еyk]їО2q1ЉЬйX ЦBД‚уЃGўвNУbЭЯ\3]р=,R’ИpЗ“rъюЅ:яќБЧ—ўЧGЯљ%J3?ŽЅGШŠф Ї[Е6’эќєђё2™„5шс™ЂЗAŸoЊ@y”Ÿ?Ыоорb-[&РЂц*;u7V˜nЌъX(ZA№ƒn—Жг8?–ыдЈВ ІщЗФ2ВъwФМ5Ѓ$а$ѕsѓ^†ЊŽFЋAЬД№/hŽ…:‘ъ‘Нў˜TTЉг)’UЁия$PтlpпЏ№з0dšкdezГыž•Z]œJFїUПŸ\аsн‰ЫFWт])˜Еe€мz‹IБ+Жз$мw6ЙцжицsDъ>{ЂцЬфžцLфщx ,$]r№6‘цTvУЬ‡—xiP›+=Љu'vдј,"R-tИOMFЧb7Жзжеk3ё2t:2єjKЄ­˜ Е6Ÿ№нVуuІ-Ю\>t… фL‡—[?э6nјљЈљтQк2-ц С ўЌB•QсГ[…–Ћ/$м‘=”(ђй_Ч и<„ФK= кŒЂŸэЄЛЁЄzиlІыЙ7-бІг)tЩa3п[}ЦŽХ$Љ"§Ж8ЋqћЇчdCњ ъЬ!3$VшRWЗ5iL–Aџл$Ж5VИ-1к{•,“XЇцX-KLGAuќHыњaЇŸИyEЅdPьJC—вm:–•~ЩП\,j1dŠ]?0BъPЙ,)MИС=X7"§ЧІNXяŸ”JIqŸ†њ™”Ъйu&Х MˆЦœ=Ёfњ?N_тu=+DђЃж™h2рQщЭHияo/ѕЇџuєќЇZžМџUmŠl0—YC+ž…|МЏ>–>]ёaR0с!/ВЎR­цЉb=žќЅ“К’“Ѕ>чу†9z‚и^wЮP!>>xPџЌ>“фR‹лъF=VГ]k3УM&Т~•EP!ИPФЬXВ_[‹щXАЩœ ц8˜Y”y:™a?ЕшЏ#щ‡дu0ŠŠAсC@"#šb­njƒm$Ÿ@\О$ЧЂpЊАШј|УWЂОGIаЪUхЉvСЦfсх'/Jƒ –У8–$А”ЅХXю@Ии‹oл*|ЁЬЉ†лfD&›gткЌ,Fн{т#Q+sЋ)ТЅGz%r˜Eў"žъ]kяbmѕЖ.6ЖœRJД›ЈXƒ‡5W*fL5ŒН"Rтс˜ЭУё$lЄž„F'!ЬГХІ‘ ˆд рЄщfCCLIЪПРЃхгЫЎХПvB$N-ђі\ЋfAŠ<х8х 0u•8Q1кЅQЬжђ)j:э:Kћњд“и Ю *9жА‡Ъœ1Ї9G†ЄьЖРOMnЎп•вњEЎ$ОL3) ЉŽ;Lˆдœщ˜Љ48ЄЗ%єЅТ=д§БFYсt4Ѕэƒѓ\*– Н`/ЙЙMЖБuDр§jГR ЌUЃІI:(W1ђOšеЙћуцmсФJAš]1bL‰їŽчХт™P •ЄіилгІ ГѓЭ†ИW’ышЖTЯДч$Ÿ–<ЕO œgnцl тџ‚тиOїЭ‚R}CєУ ЉСЧaG-DЋ—ч-Оcqф4…їАПCŠ<ЙŸѓ&M"6яУIv›RQr3ˆ§дjšW^†лєТ2 І‡0ђЭY…žш23O ‰CБгЊ}!УљБЯr?y=wы`N№ђЉkЂ ЉІPO9ХјB@љ‰=€ю}†фтEFNƒтD‘1адV\uУй ОYk‚љЮОЈєХДвЗжя„[ми~ИdЮЭO‡дЇЂdhкœИы ?Xž.з3ИaБЛ–Бёtѕ7ТўН]Ю9е*vDКХB2ЭЙЏ)LЦGљ[E’НёPїПэ;џ €ІKр…FС™ušKOоХ –ЪH?W1І­РŒп 2ЄGŒ&0ѕБgš ЏŠ2у4ЦхХЊЧCѓm*Šу.й-’ .|ї#ЏlZг цмŸMр‰биеЋу)’д› ўвВ‡n˜Б6#лќІіЉJK|Е>3ŒЌ2œjEЊъЬЉn–ЩQKD $И|ШЖуЁхЈъ8<ћШ[†R”*хJ"џlRц2cЊЋ% В…še ЙB}МёЗЃ Б9З5|Džjк)о˜"(ЛœфУ(s’.„лPњмт‹’ѓN)UD)Ђш!мІи3QX‘ЯЬqЕЅ(ЖД+pOиу'6Љ1›5‡лВ’”њњтRаBЃ8Іжи[dъ Д‘а=SЊЦЇЦrк€ђХоъe6ш“иzvРšVУS i[bлhвјА‚ыW%2?8ЄИ†ЏЙ.1`vЁ%WцzsЧ0SŸЊMKсАЕ%йi*рuУW‡RтЛJ• †н“КЪBJlmnјUeь­[w<ЄЉж…9mŸ ЪИ&їАЗBn~иqR“—rХYˆIУUYл6ЦЋИЄљд\i^МrxzžЪэ”?'I‹–ъВЄпёywЛŠ7(ККпШ sЗђдKR2ћюЊГд” ўbЏrSъјщо+gv2­! "[вVYSeЭ!MЩ$\оФXzсo’Њ9zrŒЦЉжЎИV,ћЅhЗšMМLlZгИurі§$учEВы:ЂJЎ>ђ=:%FQ‡bХіR_nки>AizлUJ$ ЯAЇœЖЕЂ\‡Pк|.%>`v#pGг j•Фу^F пФЁЕŸЭopт~ЉV™B}&™T~Ѓ)!Їg Jd l ЩKШь€?ѓ1J гЯnыTgTbѓR#d‚дцyўPKˆhј”IџЫсщё‘NTІ™„яФЄЅЄ Иv#ФzŽПІ:ЗšЈД4УЉьCLеђиSЪвЋ^зџ\gŒ‡*­Qn­Br’’ёPКOЭИПQєЦnB|A•g бlсbоўЕoчФtkFГЉ |Yё.ХEИєЦќзг`?Г@ъmїФЬЛI‡–’—eЩj;й<Е:4k=“}їђС,љбa”ЎCЈiХ‚”(‹›њbЕ+E~zb”W;ёw†ЦГ—Њ7gЧŽЅ…8„ѕеяНМБU‘gФт—ГдсЌ6УЮлvоžКWkњмсЛ6‘ЃT’™™‘Š”і[.& Ў%ХCПQз§˜cН“јЙcRb;Ј№)ЈЧРD$ƒcд\+мcЂЩЈи:ыЁŸ…Ч7$'ZЈTшY3дІŒиpи —СtЉ7ѓ `Ы%Ь“$"m`e2•’сH@wјЎЪŽ6ЭuЦф­.GЌ6uДЛ™-Јлї–йJ‰џСФиЬH€фGžBб Ѕ;<БЮИЌъxп^Шсs†buЩеRƒ1щЭЎnАљ7Y№ЋЯЯЇз#RЋB\IoЧyѕ ЁЗZ?0ъ5ya}ФFЂФ­C€ыБг% eC{щ$nz›яєСІC ПNЈ™ŒЪJщЮЕсH;*§ ЛcrрƒH8cpЊ5UTъŠфЧ#T’гe+Œ­‘гИя„^~с%JUnˆ•В†мSЊŽЄ””€IЬcГRТA#ЏžB~mf Ј.!ц"5§Жх)-я}ЧR}1ŽкщѕžD@RцРJq О,pк;мчZЬ’шGЭ(!7‡э))$ЄžЉ6ъ0K”2cyI˜u|КщЊ ƒ–ъмоЦзЙЖуqb0КЃ \;тм8ьЅцi7BRЯbF‚=RЃпБЧIфiMFЌЭЅ! Еb>:+vАmwГ­§ь <”qšГЭШ+ЦOЃSeJ~ЃQІЂ-R2СZвс)#БЙР.}d?›aKЂJˆє„>ВP­яЉ&џl5ѓm-љyzL*QCМFЅЇnЇs„…Q˜”МХІ•PgRм[ˆ7P]ЭОиЧjяЦЄњ)v0™Š)Y@O™”е!Јщ6RG–+™.bЈТEb"$ПЪ2№” ƒaыч‚оц ЕШвйЉВуH#Ђ†,3]кr˜Їг›*›-)wїGЎ(кЏeCH Є%rёQс–z,ЖЗиl;v/П1?ДвМСѕУ;>ЫўяЊd$4нКыnTcД›<Щ#v‚ћ4Ѓіё Зз‰5‰Дƒžќ‡ѓЩЛm2.†рЌ№СŠЋД\Х;"ц–Š˜кifї?2‚OЗ'БЯNhж3§ўlЋІšw –ЮU—WЭg0еуЖЩ%Єp4л~јu№Л/=>‚З*‰dС“(hX[r>˜‹ЧjЭQZš1дZuд\|Cj–ПЊ‡Ў:XЫй)иАŠуЗД)]oЖ1\Tw(k5*@IŒяMŒЌыLЃБ—TŠs RЙюsТ§mпш0ЦЬП‡PИrлЮSН›вn ”l/шpМ–дЙйš ’цОлVZ’ОЛsє' КƒЌ‡Щ††ъR*мuЙ?LZБхфК з?ч>4ЌІЊХ%х&zTъPn•ї)З№іРџѓЫGћAw.ЬW-Ї\нP=’z žЃзЪрєT8hІфe?–тd:VџХ“Є ›„Œ#x–?‹1БОJ’ІŸj+?+;~eCb1qAbЃDЗтжH‘’3K№ж5ФYжУ xT“И#аŽŸQдcЅ2\˜м[сєœЏUSkЬTvєD‘{—:{єлзбVЧ;U`=LЈПJlы*)>ОGызc‰њ]ЈBОв ЎЅS ЃeМА‹љzу В§К]5ЈHq-4еьЅЯ™§OпМ"ЃБ№ъВ›К”ОKK"њз#ъL2шЂ;Ў4ЬЇ–ъвvJЮпLdPЖL”В"ˆЎЪoђеЇФUиўƒЎ6УJъ‰LzЂ z‘сm&УдћуЯ9Ч`дуR ОњnEБ0М_JЗУЧжяё‚-?„Fqо@ѓehВЭЩёAf\щГPћЮ€кŠ5ƒЄ=Бю-™rмQsњђОdŸю§- ћ,O†Q-oxT6* =~˜"Ж…`Ж“1o…^ЭќФ}qіƒі˜}HGТ,ЌЄwѓЧЖЃУЃFK[‹Xш•ЉgЕъ…Zt}k)‡ е%Є ќФў˜"й]œŠU–"ЕЮ+jЫtxFЪoK\}q>ЁTфгЙDBl›Ќњ[IЈAІ—DЪчЖаpІщ'пЂТёМљˆ™2RŽ RtЅ'гWйz`А%ЬenЄѕHѓЧšЭ9&[sZBNІжƒbпЈ#сŸKŽ4‚”2йCIpмъюN$0Аы+•- ,žƒnŸЎМGЭЪљ:вк&4Є6й&СE_*Нњ§Бu“рЗЧsФfЉE*}[­ећžо­С€ќїЈЯОњЅMy2’БАHB……ћwџУ‡+,ЄЅ1Чќ>P=G—ыŒ5HBœWЉЃE2Й(Gv8JЂ?jвTIИR;\OЕЧ|-щ•$вЁў0–YZ0ЅˆЩЙSJ иъђв_ћbџˆuП.ЃH ™ Р?ЌЫ-юЏŒoщчl,gF4Ј№›Ј;ЁoмІ2ЅЄ[Њ‡змcбкZPmЋc ф}aЭ І)ж†vp$тAžЙ BъыЇцšueRTЏtjъ%‡RГаou‡žЦ~A…ЕInІА›‘—*U§.„єЧ;ц&U&% %!*ПЬ5‹[ЯЉ6ЧEeЉ)L%AW[вŠНIЕЧ23Э“ї)8цёjЗЌщп#зЊбЛЄiе яŸ˜ƒŠЙrp Х‡= q˜ф–оlйHrж$І9аfьсУ)•zJЛЎЧm€ЈќСЌ )IIіи‘n—ЧZSивф6яіkQв|К§ёЮYЯ OЊц в§Eі›yШэ3KoPўАAJˆOБIПљБЩ ZAІvZЧЊ)ШybMRM:ŘfШЋVЌKВ+C$‹ ш-‰ќgЌJЏа!ЩЅМє! їЃЮвЏ.!"уіNћŽЛ`ы†дGшйb4IŽ%ЩЩe(Zв>[&ж\еjыuмСG-б›gLЩќЪiWКЖjОо˜ш№иuЧˆ>}?Тшpъls‰{d њoћiм?@Щ4™t‘Q*ѓеЬqСБшl]њ`7бхSшH’Є­MОЎdg 7A$“И$tЇjп єњTЅЂ9YеЩQ rзў8œіfjobвdДЗъ€–”ѓЉЙmАЛьO}6NнБшkZ^ 5ъМэsД#эl?’МэЭЗр— y­JЋЗЬ&GHФљNЇЌНS~}2›Q‚„Иъ•bKk^‡>шq_l_ё~­˜iThrВšаg0№uцCэn}Чл >дЪxeF™wЈхДЈ#Њƒs[Кћиpцє‡ЉмТ-Ы?Ч&ЋЎ9‚щƒ„ПЂq‹%f:SгЋЌ&иI<Уэkоњ|&люGЎ7хо.šьЇЅгQ„ЩfLЂR]xSб#О9’]}BFn€Т0Жme>›[щs†п џ“У81kRZˆЪљ€­J !IY7ягo_\mRДЄч€рHїі %М:ЋCДœЦЋэfЃ›ђЦzu9ВЗVјuЈЛ§Aѕ6™iMМ-єHиєиэО3gеQЫ6ЫєjЌJƒЪyјщв”sЅD›’=01TЮPоЩй^LДЧ•>™-Ц].,%ЧЄ\є-яц“є ЄfКˆЄЭ‡-BKNЁE—:–вˆлмwє§1ъ`nšЪЕ(цз”$Hш %‹ˆ$Ы—гГІZ[ЏЈ1Б€а`ьce?‹™Њ&oЩДљŠo“˜b:сMЏЄnБх}Жѓre‰†Ѓ/е™QKŠ~3їр!єhZ~Зls„ˆъT'PЉ˜ъKgY [ŸЯ юTИSD–Tц˜ыŒ\љˆjciАњ\[зŽ5bЫWrгћNŸТмНЖЉoPx€sOяэ+ Є8УЪієТ/4ъЇq ЌR\м]žљ‚юќКbєЬѓђН?/дЉO)Gš‡Eіq:V4ŸCПщ‚<ЏžhЃ,ЂНЬiЖЃo%л]…џЭБчэšъM‰jœсQЃ1’ЖcЁ…Кœ оиZq?;Сƒ\ќ5ЬиЩќЧ[EЮс HъQПK@Щ\M{ˆ•ќЧDЂЃр˜D5ІЂЂ!@,‘а\‚-ОиWфЪTч*ќ ƒRцЩ[2.m*Q$}Бис1ЕRЕc<‚b`чyэ•Џ}zлWм–s‘ДЧЌі„њЪђч?—fЩ­ЩD'[RЙ|ђ’т[) ›мlNЧЅН1Я›žXЗ-›Њ=”*‡8l MdŸ)нsъ^pцSЃ>#ˆ‘Ѓ[=ЮIœ@rК”Т]ЬДiЁД9љEpЌ^кlт=EШП•№W˜ *Jd>” Џ–EюFуѕТя(TS&ƒ“gЄ•ШaDjБЛбœI?NИeHp'ЎуЅБСИU—dhЙўФT3td䔇™ZYF:Wtџ-Ансќ1ђъуеoЭRtЋКzaw6cU$Е=зЙYi?—ІфЎŸ УІ:ТМ ь{cbёф064!lйUІАпрiˆЗдQ~[~яѕР3™zNjœ—” џVG$и­Фл]ќьIђNNnuшэЂЃ™І*ŠV$ЊсVЖЧКHБм^јя[pƒAЏfЎюГWe*LuA'mФр`gіТ–ЃУЩќq€нar РІвАЋйJMРПN"IЊ;pѓŒzœvЙmTZчiж&ФўЊPџЇѕIъo2б+*u>*“/Љ  Іїв=-Заaƒ§)#ѓrЎ]™ІыCЎ0ЅzЃoџ1KКкИaЩџБеЄъN,rЅШ­0œЃNmДЉQ”иqХm *ё{я‚Щя|ЭђуЄ€p ’ЃЖјс‹†­”XˆЇŽЅЖЎ/{ьz`юA”г1)ёƒKuIжЂГиОИЂФЂЛPФ‰Qж~!Е$,Јн+R­лмуhЄ)ЪФ_ŽynИД( …МБ6e?:\MѕЩ vн/Йў8ёRццEЅ‹Ж-фМо ]-r_oУЁ н~G˜˜лЏНQ~"›m bЪQіЧЕАїтSHј•YhRїИЗAэŠж*ЯuІ'4 МB–NХCST—V—ъ“[дА›4ƒб8ˆgA—MmЪ‚”Š ЫkлЊЄA”ЅHA‘Bщq;ЄzWWž‡QІ<ІкAtІфށ8"ŽЭл 9)іŠ—5@4вGЪ ирŽЭРИnЇaжјдѓLЙI†Ѕ:ZсIя”fdЬuЙй CщRЭы‚)4єў4Ј4Ї_Ь vG™ХуjD$6„PЗ /t‘ўИ‚К i%(eВ.Ћ­ˆЉЊ1kYхЅJВ;‹[ њт"Q K(‡ФШeh *ˆЅ›\x…№нІ8CH Ž ичќУ\JЇ~(Р*ЋЖц„ЄІр5}Хџž9&НЁHjqpђєwш6мcQ-R?2уC<ФЈICЋ>!ŽІкpAдHFњa}ЇH8НWЭжE1ВЕGŽлZЙ–и&нюNФп[Ь4†шд„C8РdЩBJtЊїqt›,"ЂЕ—yяV+Ї–ВЕjeЭ%-)+(ёrвQ)Н€~§qис•ЭjЧkЁЃ”FO\ БьЃŠq–илВЁћД .ь:m'л*Ѓ8Г&Іѓђ™ЅЎЖ%І.” Ѓ­Х…эa‚L‰!.№г/Ьp-jiQ”RіfHNпK hЉgŠ}J,КE3’˜”ТуЖыIаЕЄІкMЎ.AИѓФ\ЮgƒQ^lўcQф-н’’ ЈЇё!‚Ѓ91МwюДЌ8•џЇтоб№Пљ‚:цNКхtЧKqЙmЇJSЗг5Љ1Jސ•‹љщ'ј_йЊЙ+EnЬCMWrl-цOnИцЌэФЩЭMЙKTXJ i`?Д–8іь†Щ[фЎЋЂОЅйФєPщ|*xLU6V*иCЊРtџ…NxBХМЭяџV 26rЄдc4ќWмXU‚‡-^{mА_›ks№dЂЏЪy –Ь`•t,нў[HОРѕЦkZяЕЙ–ДИ;Йc_СЉ$LьЙќ№ђ{t)%ЈЋx%heеXЉFїэЖ§ё}@Ш­ПNn,ЅЉ\Ÿ]’IЙ)НШЗLжYЈT3ѓюЛ Ф‰n%1н|( ё •РѕAУ:Ѕ5šeЧd–ЃВвn­*цж7loёў#Ф)SЅklCъUШР†3ж4янxЏж%ФЊ_AЈа ˜=5:{.{ъДШМІђ‰Чr7ѓЪѕ§,jЭЙ‘ ЗВёчxMќ ЎЌ+2ЧЧ#…YЕlХшсVєW‹џй?|MŸЇХ~$7”й ЖгqвЅ ,ЖJЯЅю~ cЉ2їЈT\œЌД†б_BƒхЯ™т@дЃі:XcŽj6‹CJо‰\ЅСъфкEJЂе1jnTˆчJа.Дщм‘хсЙПkaƒ”ГfЙ1MФqйЎУ˜§е#Z–Вwё "чНН№1rtючК}M„*M#­‡ ЖЄўгKђ:I рњЏ“MЌShбч:эЙ2}J RqJ ЌRНў˜ьк>…{wаЈЮiЮ&H:kЦыW‹вmЧ 4љsO6њAMcXЧš“GЬб!PЁГQ› šЊRД8тJSт)КДŸ-№НЯUh•jЋ†=EspИ„P&Р‹[Ї{иbо‡’iгу!йВаІмJюъ_ VЋь@ми{я}К`j~_f•>zАѓ™qWPЖ“cЗзыŽЕНЇ ЖЋUєŒ<‡l#3ыщ:. §3§%ЧEљ2N‘&5 Fг)ЗУЧч ђНBBд)‘Ђ?qЉ=;ь2І2Љ Œyв$“k§Ц0Щk€а‘–—TZц^ЪRЄ,ЇЇЖв!БdКЂŠдъйKjь›дуХWŸ?4]А“Еw“ўє[f1IZЭZ-{^}Аё‚њy м-@Њо‚пъ0Ј@[ЙнЊ“jqЉП4н:oИўxvRв•ЧŠљ!Х†эЌwИўЕиЂT5s=.#вЈдV[y—ЄКЫ‹*х8^ žbGRM‡­А F\i2пJ(HRЎ-~ўg>9Qрeјдњ|$,ІzдїцR%$\Й#š=56бЗиуж|ќ"•ТZх=OЖьвA+*œ%CM‡`<НЮ>ч}№R€вѕйБ=јd\}РטттП‰ДуЪN'u§UУЊ 6ђK> Ю†6$™IŽњœK_Љ6ЖУОЬЧдЬщ/М9ш]›_M’|Лc–c<фi >ЪŠ]mAhPьAИ8pх&Fp^ДДБ*і'IхИ<ћиу ч&sŒSЎ …(Љ6мoŠмЛЉщktЃ–З“ЬіœDfЛHš\јU2ѓGФЖиREќРטЈ’gƒs”Т†ŸЬщ‚"Ш… Иэ#˜:‘kѕп|TФ‘Zš&Ы V­*ЦˆєшŠ}”FSЉuNуКМJk{_јb[tŠ4‡xАВћ пZЏЈŒhЉП*БШTD!ЈЉ№•Јь}БъD_Ђ˜Ў!>Д„щ@ЕБ)?NЄˆXAО ~\E˜ЗЊЩBЂF}Е|МУЖМ>—HМэ*u‹”žиГ†тІ4уђжуp[BR›\т‘жО:я5H]–ž Ÿ,1P)iЭ ‘ІЩеыч‚)ЌДлѕv[[ƒрљ@Ё#ПЅќёцД•Ыmі„2л”›~еЖЦкt4ЗNmч@x’ЄмєЦЧрќR[ЙтдВž—Ж!ж-=іœfw0‰"ъLѓ<њ}p‘ —ЉёцEiИвu?|ŽЇЬ<–'5XršъƒŠY 2сMДЄоїѕІ9C.ЪŒ№—%mqPRо‹ъ;wиЅWЖJ–љŽhsˆ5jvd;M“ Ъcю‰I(6яqЇеXTќЩM\l­PhЊќзЃ>S‹ Ђћпolul7˜S ˜оЂсMˆHНЦљЈГMЌВІВ:[NЈŽгкJu›эЉ!$Ѕ@Плг{‚ёЕ֘oд225оg]:‚5Z—\Ї{ œЏd Aѓ˜щзКGб'Ђ‘H™6BC ЁJmВ,TэьЎџLДуt>ВгыаљŠмd‹nVъвђ€ѕ ѓŒf0Њўc‹”ш№9nЮЉ .ЦRŠдб;h* nЃcгo<<—–ЎF\ˆЩчEЫ‹)†ЃИ“&ХNКSўbоŸAnиЗНЎgAžыЋsRГ‹iж –1І:#Шg%!œтˆяV H-%>-хіеnИHgIАш!Зоy+,О;6дШмщ лЯ BдLLН™ƒ0!ЊkOХqЄЌТBг~оGUj\†хMnmAЩ:†rWŽ2ƒ‰#X;”zX“киfUIЂF”Е6"6>Vк)жž‚щ1/.акЋЕ=ЩRДЬ„†–гЉй7QВˆ=в ќіТ•fаx­аиЉхsО–Л”ѕщпгTЬйy—щlЪЪъ\–VЎDЅЇBR7ОжщkŽЛљт$КQЇ"UІЬ\d$КЄКV”‹лQ?)Х%I™”ЉoSZSœЂя-фЕнh6nЄoямЧVЉР‹”dЙ=Чп’„(КВЅѕ|Кzоћћчey6ЖЁЮ!рїgCщщˆX­8YАЈц_‘[E2с0 Aœ‰Di:ІOєPИ%6TУЅЧЂКс$ѕ[ъвК5І џЃюYE;'šУŒ–хд‡0‰-\”§Щ'киБЇх8•‘+ЩbєКSi~rR­œ’SЅ _ИButю7ы‹ЌсхQЬ)"q– d”m>и№/Ј*@uќ,ёIю!WЊQјƒGKЬЮј'œвЄы"ъИJHэзѕУЮ `W)R ЪX €—арлqвјCжЅЧ›˜)О5MКг…тё^ДiPяНШpгЫ™nЅ&тЕ5%Рт‘k6А$иЭ]­хbAJšЮS)Ш›  УЏхс9З"„ЛЫBдізWЊC'џr&wЊФЄДe4мКcn-–TЗд€Ѓe)WмZУЇlgLИ3SЊABnёиоо4›ЇягыŽ}Ыэдђўec.UCiІ) ъl5нiБђ*6ї6=-Ž­Ї‡Ф,]OьЬšШяѓЂкЇlђгV›‰‘ЄЬFAhлpQї3Ъщй^Ї1ѕ*TWRТиЗљїРОUŒЊWmMнчfТлЉogй– ъ8ƒBuЪ›Ў0рYцДl‘Ћo/nј1Юѓ%ЦЬŒЁЇнlЉmВnлЃЂ’F‡Mw4вЄˆЮЦuЇ—Y:qЙ­Šаaй”='1eъn|ЩkЇTж\nB5!р•ЁCЂРѓЎŽBFUЎ3—ЊTиЯЅ†ИOiЧДи%^‡ТВ{СЕJЅёЪqtљЅiZt6–M–=ЦЎ%фњЕC*Ф­Р} ц dE­ЪаQH№›ЋЈУцъ:жlІЧј5 ~5"й‰СZ|BХЗєN>Јњs‰к{$оaІˆYЈУ☹ќХЅiGˆЇЫИњ^нБФко^Єф9LRaЕ\ІL@ЪMШ *7оіХ<ЧЮNЎ)C)X>5ЊСDw і>^˜мЫХF\‚„>Јo„Лћ‹pUь‘А?SŽї.є…gCУDާоVЇ уU.(RАp2ЦЩ3эˆєдўSiЈЋЅ№ВMBJŸvЃ"PЕ8” €ЬЌ:*škФкœB”@РlEŸ˜"Ь.„PВыœˆзMЬ™$]n[ЙОїѕ8ЉV№щR YPкіш|Бфъѓ=Рѓ§.ШKЗљŽqJŠй[eЅЅHrщ2§vПп ЈбФdЖ„ЄtQ­о^kR€“wPхљŠRєЋPИ{0dV&ɘcSр†Ъ@\’Ёroа,MгюPоŸ… *Nk Rs ;рыЌЖфrДщ*:T й*ъ/kvОCуKах5&2Ыo4 Д(uaЩAт:u<71 4 }$žщ#зБС\G*QфГЬзr ]зХJbЪЙiŠmuЛ}ЯгLЉq o[„^Ъщы‹Hђпj)ьё-Т‘ы{рŠ*a|=P9(Љцt ^щ*ѓФљЉŸ!qeВЂУIлlTЋ3в]RсЗVгФt*чгbJ‚”!$%)VЪqFфр‹Тп.гкp5Є2ВЅwWž,šфšqmч[AОж;œA*f kmчб%…м”wР}LI…%2#HqQК@7АђџОœtЗќ4З)Н/щ!$Ц7ЪЉ"55 †ЪœMЕ"і$р‡!ЪŠЖ9…IMЮЇ>Sлlˆoy8‚рНХћћт!ŠrYŸ[ŒЫ(хЅm8уŽЪыз j 5Tкz˜жЗPтЏe,žЛ№І–У”Z2jкV™mО…Gek A<вUњy`ћ*f'Њ !E T†KЌ$+^€ЖЂ:\žž˜дК{~šŠjђbвiЩmФ—)(MЎIїЧ%Ќ`:bƒ'ЛїпЏВžlЉŒžRV›)АинЛџšчыŠо,зсSi1Њеƒh„ІЦ˜ПДЕлЂG|`Ј WŠg R0%%8дф*^b’ќ ˜D4HаJўm)#Јѕэ< І%жИ™[[Эгџс9€ќЃђлЯNпІВіW­qg2ЫЉШYƒ—ЂЈ—e>ЃЪŽеўDљЊн†yŠ+™п'9Iс|шБса\Ome2eмЉлэтИM‡SПMЕtЎяZ›(#љžхgЏpkrˆ€б ЉУ‰C[АЄi2Е?5Х|ЦBьl=…‡г™’žеA…ВP—гЈ)M‡4ѕŽ9{‡ќ`—Daft:$6В ъM•ЋИXъУУ Lr­=HвPф%…оJ‚ƒЫ==чŽ}JЎ5AXœ(9Ђ—O…"5RU;т 2ШRиQгЄtП\eзPKQЂМ#ШkPвЋ6иэtžўит І™ЄЭ)r#‰YmЦгnbІ›ž„_ЈСAЎŠФtЉЖк”hqОщpя`OНўИV$в˜AЊЗEVѕЇcВыh… жPиЈіО|y‘ +г—5‰KMEеЉ1’ƒ}dюI@oіѓФŽ&ё>K6Ц*3ЪіmЅIUџД=ˆђы…~TЪ5О$K9Ѓ<ЮTЕкЄ:4ѓ?Лe=§џŽ-F˜ЃѕЬЯљI;+žS Š—3rKшpGІЖНе"BЖИэЕ‡ŸN˜sdЯ а+гцјцКрyjWBOSыoх…e}-qZф ‘SN4u„SЉђУЈNф…пч$<эзШv›Хкц_Šў_ЮДщ.Мк’…•~[Љю“Б6О§ёbпCЕ1ŽЪ&LNЅБ^vVKšЫCXИЖ }0#›ІАЌЫ‰Rу% ’YlйjКHё|hЩмQЃVкчGЊ0‰r Е ѕ˜эЇЙЩЗ_QŠ$цјыБ1!NSщtШqд›ЅВв§`>ЇЂЧ5аtй Ћ“MЈеiѕHИЩ!е xŽнн/ќ1ЅкѓА'д˜’гЮОјЛ „•#n˜Ёё;%УјЩЏе›‚њд †CœЮiгћ!=МˆТП5ёЙзgJFH‡!Il4dHQZ“bl[OmЖ*(—8‡dwїS+*MezФsNДiђЃ9Ђ–WаэиzyƒгxgMNDЪ*Ьѕ‡Х~М~œU‹M,йO-W z\тЃ+хf˜yyЯŠr”ДЭj ЋќйK5ўъ6щп ХЌЉTN1Х–мŠЏсy…Ї  Ѕђ” hЇіFТЪэвнЮэjѕ*ЕЌyпžЋ*щц4uO ЊЉ№2mˆюЊ+­/K|zQоўЄ›§q4Р­е(P$†ЄЂЄгЈ DwRЄ‚ 6;tО9еъžyсыb‹™ Hz”—Нx’Є‚хК.,ђиd;ЦьЏUЫџ –цRІА‚#›eQqзЯс…БЩœўViъŠПM6eIЉKgтдАU i(*лЅИСžOSq!Э‘S[ПлС.КS}CіmnЂжТ1ёR•S ЇjR \жпSW0К ХЏл1ПЄUИ6э> ь„xJXJRлžЖ$§pЌЧЙА€„{]Ћ4ЬЬь9_ждЄ)ЗRnJUаzoŽIЭrdХЋЫІ2щўВШ-*тзЗAмЕќњзЊйЏ‰љ™Ч2Х\VœHIJ@А'ФЅl_Їž,ргђї TњЌˆ•миGф4UћпуWЏ@G|n[н>ж›щгџо'Ў? K‰o.г>гќЏГ8KУз)ъRкЪЪXЭ›йѕшUь‘ч„r”TЂЅTMЩ=ёg™+“3 ]њ…Eе8ћЊ*77ЕЭёWŒMl ъЈГŒЦbШГŒЦ`Šе9†Ў—Zsё%M #RЩ{ИзS­дЊŸёѓ_y=UdњFиЎЦ`‹0{УЉЭЂ ЈЊгЭц‡Ѓе6ЗOCќpБd;єМТЪOB0Dђ…<ОbС ?о)6лдг"‡.япцB›+§0‰c7жй@Bf’б*BOђФЁžыРXJ@‡);`‰й5ЖВь'1бНW‡шGOЎ+dV3ФXƒ—П„TЅ”k ~{{сRЋд*nk-з‘VУиtљЏQ‡џ >S_фuC‰ЩVg‰љŒE[єIБлi?”†kЬMюl ЗлшqИЕ@ˆьЎХЇАњдсvJй MэsЈс,МЭ[]Ееf›yМqњЕB@Ггd,wУО*ZN ”к{-ej\ѕдј›Zz—Э\8qK$м‚ГАњ_мBтМЊьQ2ьdQrу;7ІуЅдGSъpБ;›žИљ‡ ™9IDY+9VВeQ3ЈSТяуnїBЧ‘8ЌU2o_\@ЪЙ•doxЎџ1tї|АЅЦbK<лЈ”ъ/ё2 VZƒSbГ’гЭ8лф[Ї_ауэHё75ВUUaIaФЄшч"*IwŸЏa„Ы2gћœoќЊ#еTžЄщTй$zКЏѕТ7!бИOŽNd‡ ­Z†КЃ*Б"ЧЁ$mlT~C5Й™ћ2ЊАЖњC„ђœR‡‘Z…’=АДvT‡E}е%,œiТ2sїІWЉЭQ(Q“FЫЌ -У`и(yЈѕ'дрƒZЈPj-ЮЄЩr<„… кўјЎЦ` "mU3ІZт чSkh5h- ЛџдMьЏ~ОИ-VЉeg&ч(.ФYПхLTeU![_иœ+qєtР4W§˜Э2ЬvъгшђУCCj›Rц%ДњЋЖ<Ї)O‚•—ѓЭ6žТЭжˆђ_PћПп нjЕЕ*ојјwы‰„Lшф<Њљ“!of™щ:’‡[`+Ь€nЏЉХ>~тMs9)-Ku1щэ -DŽ46„іиЦb9DЪ)fI%2!>у'ЂаЋ2ZтŸуPZƒžщQЋ6(р)}#бСтТЛ‰ Q0eRђФ`VЊTѕЫO4—РіW„љuђЭ*–ЌМощBїZDTƒЊїР3L?‚сфнйеz…ЏсHC@љn5ck|@B24U'хђCЎпЮъкўЩ[у0„V•кѕJЛ)R*’œ}j%^%/Šд-MЌ) )PмlF<у1(Œш|HЬt–tЬ2"t,>ˆ#ќЊ~˜’Мл—Ї+UW*УSŠUдИХLŸ_”њ`ˆ„LжВ+V[yqе(‘Щ+P#ЫЖ=GЮє:xWсЙ^VMТžТ=Е?L/1˜"5Ўq&НSdАлщ‰Ї)„„'ьщ€з]qч нZ–ГеJ7'1˜"Ьf3‰Eџйmricron-0.20120505.1~dfsg.1.orig/html/images/main.jpg0000664000175000017500000013537610431074366021532 0ustar michaelmichaelџиџрJFIFџлC   %# , #&')*)-0-(0%()(џлC   (((((((((((((((((((((((((((((((((((((((((((((((((((џРvш"џФ џФc !1AU"QV“”г6SaqsЄСбд#247tu‘’БДЕв358BTrЁЂВГ$RсCbc‚•%'DEƒ„ЃWd…УёТџФџФD !1AQ"2RaqrВв#4s‘’Бб№5S“Ё$BbГСёTc‚ƒстџк ?™mŸjJйЊьШE™›ŠgЖЃХФДQИ–Щт[VsЪ…sŽщй˜sиs{„йHСЧПШVуе)aVІжЮ™ Fь њTыЊ JRaDфєр{јЏ­Ѕhј04с@‘oZи-˜‘лX Ш8;ЃЇН*ЩЏ>ŸUЇŸг№мВкђКОюЕіО]NЅЊS„tи%’н:ьќџЇEдбwQ9т‹vCNъ'„nђќˆ+JљЙ<ЄŽsЭJBЭїuž(Бчhє4юЂsХ<э† 7э•чUi8жrѕ–§ й1йГйЖіbљ4ЅЧ•wРрюlddШйЮЯк ЛLляЙsMщы\Ш0ђћЩh%A/ђŠŽкИД§‘ 8 PQнтЄ,пwQ9т‹vCNъ'ъ'ъ'ъ'ъ'№тz*kЊ/Ж‹,ї=yК@ЗђЮЙЩіT„5ПƒЧwxŒу#8№Šы™б.[9КЫЗJb\W;0рq ТАpЁРр‚?%RЩ<Њі”•Ћfp‚С§#ќЕ‹qз[@ЖР‘6nЮ Е„_ЏАŽї‚rOМ8žŠ§ж:+Oы Љо}‘лћ3Б-ёyГ8оюѓђїОбC9нO?‚Ѓw /gвLkˆ~bErгѕ#•[™YzRIЪЩ<ЩšЇ7ZoiчRXтньл:ˆ§ОPQeе^b4UКЕ їЋ@Pя’ЁФtVЫйfв§4…џЏAўŽьйЫ{>Ї ;—›‹іИ ‹$Й2;ъeжуСB“Ч{8Ро<0sƒћГћЕюvЉˆоК•> ёЊг M­NoћЮЅ PT€1МЩРl„ё%&“ДiкПKk›|л36‰V–лiад†пп+*ЁcМч‚чT#Eџ!ЕПўзѕЛJВ!“TоŠдС§7ьrfv#NrпfmНЭф3ЛіъЮъЙМЧэЛ-кuНРІ,ъ)ш\ж Oфх*фNўY?пњP7uЎюА•dЭ…ŽBSQБ.яШЩw}ЖзМл‘оўSt с’’8W6”•5gl9ђiцВb“‹]Ћ‘[Ў[$кEЦJп“c*RЮp&ЧРџђVTЭœmroЎšЭЪGЎ<ŸfђЗv—й\Ÿђ|І]яїp1НœtU‡БkЈг#Щ~o—Z[љ+[j‰тНдЃ|Є)ќo$   у/Œћ2Ѓ5"3­МУЈ6уj JвFB#ŽjђЩ)yNЪNO$œцэОoжT›ІЮ6ЙweжnЌмЇ4ыТKˆ“wiд­а€€с tхA'{ŸjЫЂvе|ЩбžНГ6fчdШnј„ИўрТ7дЪЗGžaЭV[Xп=ŽиЙrl9Иы-bCќƒIхC{Ыsu[ЉNўё8<a@еŒSю&#†JзищВИэЬ:„р)c“h+GtвJA9P™ZEfweћUvT NУœЙ6є6м7UthЎ29B[<ЎPx€1ŽŠЪ— vЧ2SвІzюќ—тЊЎЛymKr:ŽK*%м–Щ$”žѕw/ЏХЭV8ѓbцMТ*]qpлyа㽘ŽnЉ!q'ВОиЈЅ!)ЪВЂ=Іц)§œmrDСЭЩиKeЈЪŽЛЛJmM4IiВ’ю7PI)O2I8Хlв[q}Ц~n qШы.2Ѕп’Kk)RJ’Kмъ”œŽ…вjЪоnD“ К3rю’PЗZiзK-†аRЕЌ%DV€J‰+1МЄљк5yг КB{юз(Š XIl4TRМЄсіTBЦ@!IKsŠНg\…ыa3rыw)и\•нЄv/)ќЇ'‡{Эьœюу=5х{й~еoв‘*љuЪJKГ.<Д BASЄу$œ{ц­ ]]e–фDЧ–уˆ”†–лТ;МхRкVцюуkPR0…ЃОŽђs… YBЙ\`.вяeкЗژЇ›Žт–Ђб€и*рђМо J“MЬR+MŽэІeCГ:Ф–—uЉь%m­'!I!Ь‚[;3кtiїnић1лƒ/Г/ВЇ2р•+_й{х%{Ў$œсhBИ‘V–лЈmЗ)-GŠћ’т_ ы4тeА­є-  §•Ђ€$,sYЖйБюVшГс9ЪХ”вe{Ѕ;ШP IСт2чІц)Ilhrкт=wK–ФрЈ^[* BJZ<Џx @NŽ \ДиюЩnчыМЦфЁЖпL‹ЫnP…!* tяЉJP˜’G=Z QtzЯhьЈб›”њЄGŒлN:ZISЏ! J‚T@yћSЭZхjјЖч ]HЗ\‚а€Ы*\„;Ъ%Х7ЩЈ r.Є$Є(Љ ф71HЏv­Ж;}§7stЙ&Tir*ълˆ–Иы h<9lЌ$Єc'‡F+жџЅЖе{д†ї%&ІЁчžШо”УхO~†2ё-ЇюцеŒЙj{UБљM\~7c4З–уБ]KJJP\PC›ЛЎ( )[Ј%XJИwЇНлћ;Аћ#ў'ВЛ sq_ЫrОюqфћьѓtg<)ЙŠE[ vЧЬm}wfвЄ-Г ЛЫi`ЁyпO&нСо9у“сЂ4иахЕФzю—-ˆ-СPМЖ T„”Дy^№€œ'mЊ9доД;uiQ9G#[г2* ›Іk…KG"иЧSУxхє dŒЗ1EwN’лŠe9)3u’ткнфяЉ *)I<ЖHk to ­U›e[GДЙ)LiжnTWb<гвиR…Є€H ”ЋuФч™hBПЊ*Юajm'ВпнR]yuд0–о[[я, “–е•/ яW…($ЊВ^еvyчfnЖЫRпYф–pˆЋ ОyПЊЂПб‘MЬR+KZ'mM3–žНЁЈ8ьD&ј€˜јA@фЧ+ос Rxc#˜зЗ@эŽжмfэžЛУn2m„ЧМЖиi PRв—FшR’•9ШѓUЖ­mочыkіФ­цeЪœxЋu,e )Qс§eЅ У*q#ŸЦц(ЌЩв[qLЇ%&n \B[[Ђќѕ!%E)'–Щ­dус5‰mа;cЕЪ›*йыМ93—ЪJv=хЖз!y'yТG*QЩЯ9№е‚^GMЅ3Yi‡>Ы0,vA!ІmЧ![ˆRЙ5Є0rxHlьЇ{jЮЎВЛ%іŒЗ -ц杘юАСSEAФЅеЄ!E;‹$%G‚y’HЬR+C:ll6ћlzюлr% Џ%–Рr@RTPёsy)Vёу”ƒžƒ@эŒJ‹(zю$Х[ЮGwз–їй[Є—TƒЪх%d’Ђ>л'9Ћ [УrѓqeдKjxёTвЗHD—]qR7’–”ѕ€–BЛдœВNЦй­Qgu$ЂfqШвСIyх2кT1”Ћ”BRxЄЄягsŠЦолmЖл~ЛЁЖаУhJo-€”2­цR+Р6ЂT‘§SФbЄК.йЖM"ЬгmВђГe<є•Ы“v+W*т7TсkВC.+њлЮ6Гœœ,D Бю )шŽrЅзX'tŒ-ЕЉЕŽ>%CпЧЉ.~ВщлЅз‘хћ+Вy-эн§ФnчЦ3ƒMЬQVфшБЪГ DЏ]оДЅlBrђк˜F7Щ—wp7F8`x+KкShAђиў’­'Гл—fтBЙРšЯbЛ%зЂIKхВ—BмFJ”ВіS€ 5ч3\@r‡•И-юG}OD{В[y/EmЖљн№Uй ю”d… Ž%ЙŠE_э)Д љlINв›@ъ–Чє•pэ78ЗXЪzм! -­ДЖœmXumЌ$р‚!@ŽЭЈмХПДІа:ƒхБ§%;JmЈ>[вUаЅ71E/э)Д љlINв›@ъ–Чє•t)MЬQKћJmЈ>[вSДІа:ƒхБ§%] SsRўв›@ъ–Чє”э)Д љlIWB”мХПДІа:ƒхБ§%;JmЈ>[вUаЅ71E/э)Д љlINв›@ъ–Чє•t)MЬQKћJmЈ>[вSДІа:ƒхБ§%] SsRўв›@ъ–Чє”э)Д љlIWB”мХПДІа:ƒхБ§%;JmЈ>[вUаЅ71E/э)Д љlINв›@ъ–Чє•t)MЬQKћJmЈ>[вSДІа:ƒхБ§%] SsRўв›@ъ–Чє”э)Д љlIWB”мХПДІа:ƒхБ§%;JmЈ>[вUаЅ71E/э)Д љlINв›@ъ–Чє•t)MЬQKћJmЈ>[вSДІа:ƒхБ§%] SsRўв›@ъ–Чє”э)Д љlIWB”мХПДІа:ƒхБ§%;JmЈ>[вUаЅ71E/э)Д љlINв›@ъ–Чє•t)MЬQKћJmЈ>[вSДІа:ƒхБ§%] SsRўв›@ъ–Чє”э)Д љlIWB”мХПДІа:ƒхБ§%;JmЈ>[вUаЅ71E/э)Д љlINв›@ъ–Чє•t)MЬQKћJmЈ>[вSДІа:ƒхБ§%] SsRўв›@ъ–Чє”э)Д љlIWB”мХПДІа:ƒхБ§%;JmЈ>[вUаЅ71E/э)Д љlINв›@ъ–Чє•t)MЬQСѕm E'–Мш+,в•­mІBт:о9!;ъ$Ї fМ\gjjБ9fkF@mZJ;4ˆ­! œœЈФчсЎ§Jnp;ћKд%ЮЛьіУ.BВŸ0н(NIнdаIсžšФMЋi лІС‡ ­ЃЭHCти.œdЄŒу' ЋJnW§(Ўщ­1mБСгЛ „(ЬМ­чVс'+л ”•я}ЂŽ>иsјi]gi>бo?ѓŠUЂьЋ%гП–OХ7ў„д-ЗЇYЏWХ1`Л\[)CЌ**1–їFћщQўKœЄsуˆ3IпЫ'т›џBkЈXцБі\Ы"%R-“пŒ„ЖsЖ ,nˆб™Qфљ@Bѓ* орЄрѓзAЖФEОн'-Чi Єю% ѕ$ss$:“JX4тЉкqЦэШqЩШ%ЄЁД8Jš}Зн[‚;Ю=њxgp–лS]$Еp˜–э—hhq†м• aж]-Љ@6дЕЋ|)”wХ`aDnžq9Ѕг:э<єт]qјшC .Х%+gŠвР`ЅdУB‚ВBwˆ)WSšR€ŒkчЗ& ы$ r.ŒЁжыIeЦакЪ атyЂ Ђ„R AlqС)VЅ8u ІL{ЭК|)nЪLЙ2%r8’Tп"ъP†^^тL}цFNR•,Tі”АCхhˆЯjз/!6ХЄ5)ХПnCвЖв„Є4ђŽŒ6Ž…@•Є’ |малі{,\›-Fл’ЦPџ}YZwИЖЎЧн[yя’т†№чЉЅ)`ч>Р9_­ЊfŒЮКіKцnУf+&/"ъRз(ЌђˆJ›$+ Ш+P+ЃR”ƒ\C•;N8нЙ91ЙЄД”6‡ SOЖрЋqАGyЧПO уŽай-—•ўЪѕoŸуаћ’]n:qiіЪм‡œvJзМ­ьс7R™э)`Mймyїѓ2kŠЗd8ёT"&М‡šuЕ4Й!РKi0”!9яs[FŒуkžуќМЈЭ,Ш^сOdЩQq\О7АŽ2%їƒ‡йџю'ЪRРЈ~Г†фЋЭЁєXюw |ЊœŠИс+N№Xhђ ‚f;™џ&œ)BІ 9ЪЖtФх‰’Н+•/ЂхljSБвф‡Ÿ h•”!Ф™ IQхЂ„мЪvЯэѓ=qп^;.PxpWийW)Ы3імyNЩ™пsЇВ8&ŒM)KЕК†йыНžD4НШ<­зw{‘y iЭмэеЅ*н<0x[*T#gіёэоОФfeЉVЦ…9ићЭ%ЅЏ%]іPЬaƒЭШф­Dњ\tC73vЩ3\ vlљN)ЖРR“)2RP $‘'эАsЙЭЧ„Т•6ZєЅнћТЏ2я0ukьe5nZG&™(;ш//)”ч2г‚xёоЯэю:…мWйIqЉ"ZSaїSЊ*N”%"TД„фœ<2ЂP“SJїaІдЫŽ:та”Љ)яQМNsяІгжЯZ,ёсЉю]фя8ћћЛМГЫQ[Ўnфюя-JVшр3Р ѓеАtвЗ›{aТЙpža<šRU•ЖЄ№ RA’тPљR‘Н)(О yЯ73BЭХ+)JmІ#џУЖЕ-EJ*Ял(tрЏž]ПьŒ~uџ@1щ^Ш”ЪС)ŠСС ё_8џЭ_\Лйќыў*5\˜NњєЎ{Ёdj e"ічЏыЗІ,Ђ†кj#KHI'oЎIїЮ‘\l—k zсЏ{•+u+‘2N ЦHтp3У=8Я{МjК“ціХ[$­Bє­ѕ(R•ЌЄœ˜ `ЭяЯУ9Nїт4ЕёФя7Ќф-9 9їКїЙПЧ)оЄYƒДŸhЗŸ‰љХ+яiЬђцоњм)†оVМo,с$Јр’rx<R­…Y"ИЭŽно4Й‰OХхлFщя„Д•ѓp.#ѓћЦЂzђрЫњ?QЗв_…†]Р)-ЙКл€gЇНZG‡Т mЕЃ\'лmёšqЗT”J“џЩЅ”nUAТ”Ѕ]щO)М[\Zќ…ЦйЅіб;Ш@ВЇЩЩ'uТђ ЩRЗЗђЂЂЃПО –FђЊК’KгЄє*Еpг‚гwЛЩ|Ђп˜† Z%Х,%gьЩћMь`…nœ‰lАh[ЅКэ.пaд›tЄУTuЎc/Къ›ii mХЅI–@оXBG7Њu6п)нfЙ!ЌТlз7‡zуŽФR3“гœ@РнуЮ3‹n‹tДЫж3šЗіRЅмк•њPЇк"ЖНвxeЗBїA))Iо ‘§=Ђtuщ™_ћх \GЛTI7‹Œ9И—%)(qЕe*# р‚†ЂбZNаVу‹Q›dМуЏ\ЄЅ(HЮI<Ј3“R}žл%[Ён&$˜mK›ЫЧ5ё"R ДƒЫКОQEhYИВPœ€„ы6Ÿ/Ф|ЗaЕп$І8(‰9Жї^Т‰нпZ„dc8ЩH†J9Ў›“ ѕUŽчpгБKц(•ЖфйiRHЮъŠKЙнPЄdp 1выƒKщ˜ ЈІ\Ш=Кw”\<”rъЪŽЌъxв [<КЂїmМ\лйН—LЕЇYDƒŽUЧP{фr ;Љ)С$уxc…nЫЏ,<цЧmЏСiЧ.э(•Д’Ї!0лм(‰$їЅTVd5mœ–оB\HvdЖжШRТ’| €G1—Ї$Ш•jКЏNj’XDЦeДее˜з OœHыšN Ћf•Г@ИЦlXLАљŠ€†K‰@JЗ”фЧЭ\lђ™ВC‘wі fдЌFuеIх˜g•a$ёpo4ВЁУО9ШР'#$C%/лДЕЦзЇчXXBЙмb2ntЃ–жш 8’ШуЬGЄЅ*4UˆЪ,„І:@lюрrg‡ŠхЖU(иємЇ4•ЏL=.ї Ff%фVRк wFSЮœх#ЈKћ™Яўп§ГUdž›+ћKўPгГeiЪЧЎ7kНOГhл\Qyr4Ј6&+ˆd*с4rЉrJ‘МЂк›iНЦї\јQ* Š’v9зБoh;>ц"ЖwАЗЄnК•-\IшJTЃр '˜Щьй_к_ђ†ЙЖвЄЪuEТп)ШвaiлМ–ЪR…)=К“Р+ сŽ)сw[?mLлn:ѓŠt]чЉLЌ$Є-iN B’роЩ!РAн)yR_hбѓюИ„Zž)JжHI/7’3сРќТЅћяGъ]D\ћфЧќRяћЭдЙp=ёЈ§K 1щJT'#TЫbё9ЕлX6Јwіч$ g–.<–wHk“нн €O)œякЛ[žКНlj|Eм™G(ьDМ’ыiсп)Шђx‘в<5‘ЄeЛЌ'\‘ впd\#Ьnъ=šЫmЖЪTШO'іЋф–“і@7]WХ' Rh{Хњфъ$ЪoБœ\МЬTїдRлбпe LеXфsœT0rGі“ _c%‹…€й‹Jхм^D€чѕwн)у•wГУw Ъбзhї­SЋ%Т’м˜ц$4!M№HТзGў|єжй§g!7ибйMБЫRкRо˜nЋJкXц@kŽіr0w‡2ГŒ$+ЦЩx~ыЊu:LВќ6bDф—JлFV­тœ“Ф‘ФћРt Љc{pћОOЦЋѕšаъ Ѓжс˜q›“:tŽЦއ]-7М[Є­a*)ЏIуРFњсї|ŸWы5дЖљrеk—n 9*н(ЩC/И[CЙeжŠJТTS€щVwUмpЮEI=#]TФfНЂ%ЎKВf’eЅmОЕ Є4ЂTOКR•e*Р# >Œ_m’гHЙдАњ! ,ИЅn% їЊ*я@XrlцЃЉИЮ7.LЃ2h}‡йRй(фтДЅЦяТTАр œ.жу&!~Jнm–љdя:ІЩ%#9%$ 9БЧфЭіаїЎвžЗчГ7d і63žSyеsуэO‚ЃЌщIq'лдТр<п*ЇцМъ JдЇз!@7пЇ”^[Ъ’ІHЮѓKJМ щыф}=ж“ldлa" im:ч/%Д–ї^ш1ƒˆks” Ќ(Ж7€н{(З.l4Ч•ыlˆRІ›‚$$Д„АЖ’ЎјpЧйNNxnЩЖЗN‰r†мЛtІ%Хs;0рq С сCС~Jц#gwYЫzBиc”uoЁЁs“!y З­ 2ро0– ЦJ7гКŒTуGYмГТ”$4лOЪ_q ˜ќВт7žxя,сЁ 'ЪУQ{nв#§…TЙp=ёЈ§KЈŽЂінЄў:Gћ Љr>р{уQњ—@R(rcWоЫЮЖиьїОн@\јkЖшл§–’Л[л?їЄ |ѕћЃvƒcК?}‘#L9"`Н|ŽЕ/Fi\ŠА€&ЌЕС$ž;м@С?~ЇнJЮГГнкКлЂ№хJвРмфоRж”‚ЂOzBв0H@уЦД4кљ`UДЄёХОL—ъНYЇЮЕCџh/?i˜гMіk{Ю-L,%)й$ž&ВД7ѓ…ѓ№[gћOTеЉYб–{CVЋtA>d шZ˜œ›*Bд’RAя‰BHц)+8TуBOtzИBmME—жћ-Љ!%([O) €H8^|љžinj‚UШм*њˆюЏpqI#zЙм]IЋŽв^джЇlN•ђ6бЙЫКHc{#œуР 5ю2"Ф b•V2 1Ч>У4b"DѕBGИ"™ВrЎȘх ЧRF8`eG–Жч 8Бу–5iбЯ›nЫцуђƒoЗЛО8~Бь^кѕgї`ЁњЬL7кЃ6OтЃж/mzГћА?а§dы\%’рЋ—4t…з3Зо]ЛЭƒЩnQŒњип\…Ї{uXЮN*YjжZЦфІ-:} џЯ5сњšЎtжЩ5{лŒцу@[R%8њRЉ{Є(zxз@БYѕm­*БСs Ž?ўКщІŽ•Џžd7.УwpКkЈ6+еыn™Tx]–ъS9ђВ†аV ‘Шу8IЦHЏ}6њЄъщяИ[ІЮЕѓdИO ёНHегєЕоаж™‚•\!?•UлƒaЦдьr\qНœpЯ„WІ˜iljЙЌКзѕ Юpƒ^lЫ—Эє%_i=“ќŒOŠ?ыUb:А†дЃа3Yr‘‰ёG§j­uРžЧRŽQkчСRw.ŸгўєОвrKl[5v{†.ЯлžJя'ЫЅIVwС<X­эrTЮjз}ЖN(’‡KЪKЫXУjl№;ОWZ­#Ѕ№3\дЏŸ{Ns|ЛW>г;†j|4%ж/ќ>hч;œнЖз­'>•)˜ЏЉѕЅЩJRВq“Œу‡:wUІк–аmZГOБмФцоnR_*} JJBV:Nr xјOфЊEАU%(е%j"`''€їгрщЧюЋ/oЯДюŽˆu Wg •џfяПсЯ‡ќw—‹ЎŒž94љWqіп%ВрŽЛrcnn\žъЏщ\ўд$э—O:УЈLKЖђвЄ‚ZoЄќLєџ‰чяЗќ m‹OЧ†лK‡uR’pгxч>ћџтxs…tЉ’˜TWТ_hЈЁ@Б’p}џ‡ЇУЯŸВxкЄ2‹sIqцв B”<'ЃПљЯ8]ќ?ќњylсњYsџрŠm_к]л№FџвŠSjўвюп‚7ў”RН11&ќВ~)Пє&Дš’вo–9vРњ#іJB ЋIP@Ш$рq<:?W=Fvї­.:MТЙкˆѓюШb2“) RBK V@J’s”Ÿ pЎшН[еж їЅЊЄњ“eеѕэП ІПрЇЏmјX§5џRЎшН[еж їЅЇt^­ъы{веМb9WзЖќ,~šџ‚ЂКŠаеђфЉŽj ЌNє!,Ф}(mx2С'''$žЊбzЗЋЌ>AяKNшН[еж їЅЇ1ШВЫббBцЈПЉ RU-р?№ѕМK кm№"8\j#ieD•nЅД!9;ЉЩя:TошН[еж їЅЇt^­ъы{вдS&бiQ•дЖkЂЄ4к-ЊueЕ…eТЖЪŒoŸxœ‰‡ЏmјX§5џRЎшН[еж їЅЇt^­ъы{вб&‡"ъњіп…г_№SзЖќ,~šџ‚ЉWt^­ъы{вгК/Vѕu‡Ш=щj|b9rF–eїмyнU.8ЂЕnЪBFIЩР№>_,щ ›D‹§тX‹!Й(iљ)R а ЄфЦGAY{ЂѕoWX|ƒо–бzЗЋЌ>AяKNc‘mf)*МPZBрчј+^ˆЎЅГ]!ІбmSЋ-Ќ+.ЖP cxœћРtфUЎшН[еж їЅЇt^­ъы{вдS&бu}{oТЧщЏј)ыл~?MСTЋК/Vѕu‡Ш=щiнЋzКУфєЕ>1‹Ћыл~?MСPiY—пqчuUќИтŠеЛ) ''GРјV>шН[еж їЅЏЖ}Q:Еo6ƒnБaJс‡Н-_9фš„zЗAДЙ–]!3aШ‘МKd7% ?%*AZœ€Р8Шш"ГЕЮLFB-–ЧЎkYo%ЇPвRŒ•x“У ч3WfzЁЕc2кmі"9иwСёЕунЋzКУфєЕmFŸ&Ÿ,АфыгѕЎL)&­#зЛїŠr|ѕтЇЏwяфљыХUпК/Vѕu‡Ш=щiнЋzКУфєЕЧk&ЫынћХ9>zЧёSзЛїŠr|ѕтЊянЋzКУфєДю‹еН]aђzZmbЫjEжnАEЪ}Ѕл{ Рr>Vћno(И…ЕQ<РєtVўю§йе•ˆ-k qRнZ@Rsю|ŒcЇ<*їt^­ъы{вгК/Vѕu‡Ш=щiLZ,G)ЌГщџ8{ј)ЪkьњЮў Ў§бzЗЋЌ>AяKNшН[еж їЅЅ1eˆх5і}?ч9Mc§ŸOљУпСUпК/Vѕu‡Ш=щiнЋzКУфєДІ,АŽIж(q(-’ЌВdЛŒ0w[$sє№рkѓВuЇUAђ} WЮшН[еж їЅЇt^­ъы{вв…–ВuЇUAђ} ;'ZuT!7адjЕЛ]6#Veˆ—sїXo(BъаJЪК9ѓP­ЃmBщЅЕ$ЈfeйфЙ&am,=Є4лsd0„ИЎ(с,Ї‰Q'4 uЎЩжUШMє4ьiеP|„пCUѓЗЕЯн/оyъ4ээsїKїžAњ(Y`ћ'ZuT!7ажњ.ЏМйхлŸЖФmЙм*C2=ў,з ээsїKїžAњ;{\§в§ч~ЃSDYdяWлГ2b’НЭiІїKС’кTJ‰рЧ qŽz80МjVe.UПHj(2WŽQl„сЬpяЄ”ЈєdŒŽ‚+‚ііЙћЅћЯ §FНЎ~щ~ѓШ?QЅЕjйzЏWк=kд^њфQ)™K*YIШЪИœ|ЌЫ<ЫЅšp­›>МGŒп2Ÿё$ё'пё ­…ОhЗCn, Lшё›ЮыmУ”ЩЩ? $’zI&ЊК6нsTEПЫ_†щЦяeСуЭџьНњЧээsїKїžAњwЭЅЫAфUЙn\з5m_јeT“ш[^Єџ`ЙyЌКzѕ'ћЫЭeеGээsїKїžAњ;{\§в§ч~Ѓ\)–Вмzѕ'ћЫЭeгзЉ?и.^k.Њ?okŸК_Мђдiлкчю—я<ƒѕS[^Єџ`ЙyЌКУК<Хк:XКиЄMa*пKr`Iq!X# (œЧп5Tћ{\§в§ч~ЃNоз?tПyфЈв˜ВЬzЩЇМKџЃ=ќ5™˜6жпEЏNЎ.\1­o Ј‘žї§MUОоз?tПyфЈгЗЕЯн/оyъ4І,Б'k'хОыvxhC‹R’•31E œрžDgсРЏ.ЩжUШMє5_;{\§в§ч~Ѓ] Nы+муЁgЗužЈЗй\›ёe&3›‰LјЬ•ЖЫgОC‹Яƒ#FiBЮƒй:гЊ љ О†“­:Њ›шk‰jнНj‹>ЊМл#@В­ˆS^Œкœe—8Є‚Hp рxj{ЂѕoWX|ƒо–”,А}“­:Њ›шiй:гЊ љ О†Ћчt^­ъы{вгК/Vѕu‡Ш=щiBЫй:гЊ љ О†“­:Њ›шjОwEъоЎАљН-;ЂѕoWX|ƒо–”,я­Фдsoі™—kzb м_ќ4ijRЗ›R1…49>п]ц^Q-Ymn8ЕЌ)ХK% -ч{Ÿ#щЯ ЩнЋzКУфєДю‹еН]aђzZPГЁlџgšЋFо цBf†Ђ*Vž‹%!–Tёx‚RР*Vё'<9ЯltЩжUШMє5_;ЂѕoWX|ƒо–бzЗЋЌ>AяKSDY`ћ'ZuT!7аж,6ЕlYЗ9iЕESѓЛ+,Ьн@h88CoЁЌDCе)XPГCсбЩMЧћUТћЂѕoWX|ƒо–бzЗЋЌ>AяK]a›&5Pm/Y 'дАI‘Ќв0›L=шѓ= cCkVХ›s–›TU?;БТВЬЭдƒƒ€ф3Ч”<1я№рнбzЗЋЌ>AяKNшН[еж їЅЎ\Щ,dыNЊƒф&њvNДъЈ>BoЁЊљнЋzКУфєЕ“+е Њкe…Іпc%Ффх—}яќ_~НД™2тЩš+”)Пъв_хф“KМя]“­:Њ›шkыMлo^ШdNКAZ—" FтCNхD•Жœ AЊѕнЋzКУфєДю‹еН]aђzZѓб6[i?ШФјЃўЕVŽіЫ%4ыЖ љ3U2ыЖkежY“>еjuна‘‡eЅ) %/€9р9Щ<цАћiЯъ[W—›ѕŠО9мaX№ŠУЌЮЪ/0ыrU“Œ уЇСТАъмbxsцZŒ2Нщ7б=Ы“Д›ЋkwWдŒiЅLV}УюXмљ…`V}УюXмљ…uсп@ж{0їтDќИўЛ R•ˆuЅ()JJR€R” /†в}Ђо~'чІв}Ђо~'чЊЧЁ,‚њЏ= л?G§™ЪЉ5mНWžаmŸŒ#ўЬхTšG b”ЅXJR€R” Ѕ()JJR€RПR’ЏЕќ ƒ‚>§љJњ RОд№ ќ ƒ‚>§љ^Б~ъgћуѕз•zХћЉŸяз^в1ћKё"]ыsћЕЯЩњ…bжUЯюз?'ъ‹^ž3ќGQэЫоeqљ д)JViqJR€R” Ѕ()JJR€Дgњ(=јПкЎYъіюЏИ~є›]OLџEП—ћC•Ы=P>неёЗо“jЈ–s*R•b)JJR€R” Ѕ()JJWйmaх нЦsŽХ)J=Ÿц‡џО>jРЌіšўјљЋЖјЯ‘ЅњЅяHчЌНb”Ѕb)JJR€R” at/ѓЧџ sїМJЏUat/ѓЧџ sїМJ†;ДО&Љќk+§хTrЄ{HћтjŸЦВПоUG*PЅ()JJR€R” Ѕ()JJR€V}УюXмљ…`V}УюXмљ…m№я k=˜{ё9OЫыАРЅ)X‡QJR€R” Ѕ()Jјm'к-чт~qJm'к-чт~qJЌzШ/Њѓк Гё„йœЊ“VлеyэйјТ?ьЮUIЄz)JUˆЅ()JJVD(R&К[ŠвœP8ТЁЕlОzєhкZŒwч/Ф’š{U•кчїkŸ“ѕ ХЉіŸвvћмŽVсtnЮДЄ№сг[ WВЗ к}uАM(A;Чwœ’рyЋгЦZ|GP—Ÿ?y‘ sŽ8ЪIЄбЬi^­!Е!вуЛŠJr„ю“Оr8{м2%yVpЅ()JJR€R” Ѕ( AІЂƒпK§ЁЪхžЈnъјл‡яIЕдєЯєP{№)Д9\Геэн_p§щ6Њ‰g2Ѕ)V R” Ѕ()J^Œ2уя!ІSŽЌс(@Щ'РKv юЩѕ˜Ю!ˆ+uЧT2G?žЌvŠа]2”4иŽ%”‚ЇŸRBеяёќД%+шW(;4еSXC­[”Ќ9EЪ5MєўУ&IAUкpk a ŒzrO ГБm,ИЮњ\K‰уп ‚?ТЖmˆHŽ„5]Jq­іEsА4фЈvdT хСid“\ёщ’_ˆгn<ЎEД†’Р`ЁŸЯWŸ[&;M-% e'{рХV]žhЈ:Rн]˜aGChJЙеœœћмдsgzfЏЅђˆ(ћwyЩ>*UЈ6%pŒЋDФH9 ЛоЉGо<епД6‡E…eИnЦQп Љ…Цмв˜х `+НY'щі…u`Б#!a9Ш)$qђWmлЌS7XЦŒЦ7м„„ŒјyG+DжЩ$Лn/&э27r––@ј3ŸšЖјЫё4ПTНщХї4ЛN_Jи_-,“з{aЇˆ)9J‡„‘ZњФ.)JP R””ЅЋ Ё˜v?јkŸНтUzЋ Ё˜v?јkŸНтT0qнЄ}ё5OуY_я*Ѓ•#кGпTў5•ўђЊ9R€Ѕ)@)JP R””ЅЅ)@)JP R”ГюrУўчЬ+ГюrУўчЬ+o‡}YьУп‰Ъ~\]†)JФ:ŠR””ЅЅ)@)JPУi>бo?ѓŠSi>бo?ѓŠUcа–B=VЬ­э mKiо"|sЯўЪЊ'мџЬ>šЕОЋ•ЉиPЅ$њсd№ЮUMь‡НйЯв5ЇЃ—XџдЦn_ёqKќХВ“п~-Н'мџЬ>švŸsџ0њkЫВїg?HгВїg?HзЋѓ2§ш|%>sаzіŸsџ0њiи}ЯќУщЏ.Ш{нœ§#NШ{нœ§#MќЬЫїЁ№œєН'мџЬ>švŸsџ0њkЫВїg?HжзM6g]йbCЎ–Ш$ѓЧ5YхрА‹“†^_ђ‡Тz4КlњЌаСЎM%зДЦ‡m*пe’л;нљN €ї…M­nYэЈPŠВ‚О'!J?q[a(v3ѓž‚ЇЖГЃ#Э[Вя%ДєТМR+QЎv“ЄgЩ-—ŽYcŽ;фўД ъ§щx 4эгŸыТi_­5ЎеЛ6БЪhzз`Д4ЎžNi?р)Пƒy™~є>ѓžƒ‚оѕмМ7иv_&‚к€šЮN> ŽХ[cбK‘Кxпуl†оѕЖSР€Ь—YZpЧIмQI\йрxзМZei™в-—Xц+ёFHняTŽ8ZqЮ7Nk ŽGC8AшЁ“}іИЕі(ЇwUЬ§фЃf\ИВЪ*-];З^›ЊJьСУуs%Ж[šКЃ\щ&ДВн&ф5Жж—›ьwN2ЕФ'5ЯXyЉqC‰Э, ƒ]зfv&цЭmRЎV4‰*JїvjZАЕsЈŒšЏZHeЫ%*nщЅлЮї&ююљžП—2rвщоЧС>”НЊmЎœŽA.Ь‚_бRŽqиЎ№їОвЕєіЭžiюХМЩaеgtђ.Ј$ќ•л/JбэЁEzФвSв ДњkYІ­6+еЫўЧk[9ЧmуѕVўў цeћајOЭ>sаUћХ™1f)љmЮ“КтRЄ{с@qј3X='мџЬ>šВњлg№/rUVэ‰i{ХШŒЅВG€рU|е№UbдS-ЬЫyд0@ RИœ€~zoроf_Н„|ч еіŸsџ0њiи}ЯќУщЏ.Ш{нœ§#NШ{нœ§#MќЬЫїЁ№œєН'мџЬ>švŸsџ0њkЫВїg?HгВїg?Hгѓ2§ш|#ч=Џ`Iї?ѓІ'мџЬ>šђь‡НйЯв4ь‡НйЯв4пСМЬПzљЯAыи}ЯќУщЇ`Iї?ѓІМЛ!яvsє;!яvsє7№o3/о‡Т>sаYэ<кšѕ*>…Œ(B—‘џзrЙnпšqzйE ­C•И Ÿўi6КŽœR—ъRyJ%DТ—ФœџлЙ\Чor^gZЉ-/tn˜ўi6ГА~ШѓП ЙcЗUN^‹К^ГЄЗW.Ї0ьwНХЯб4ьwНХЯб5ыйђ}гќЃшЇgЩїOђЂДvpo?/н‡ФsљЯAхия{‹ŸЂiия{‹ŸЂkзГфћЇљGбNЯ“юŸхE6po?/н‡Ф>sаyv;отчшšv;отчшšѕьљ>щўQєTЃgж+–ЌО7ВЎФACИu>їzlро~_Лˆ|ч вщћЗ‹‚c*Dx(ЦTєЗiOчЦkЁЬйžD шкОоЉ{МЪ’жцїчЮ+­1Г'" и xЅ8+T‡Q№р(ЭZїt^RШjдџЙxчќєйСМќПvљЯAЬіyЉойќй0хцУuaAШюHщ&ЗгVлѕ> fx) Р.'ЅŸяTоеГm=p—И‹a €Iћ;ПХZ)њЮ5|xбЃ”Т ’ы\ЊЮNxч?у\Гiј.h89хћАјФ3№эLu0Œ[]ŽћMжШіŒ›UЦ.Ÿ›.к‹3ЋZЫЯЌ7ШwЄ№^@тqЯљ+ЖHжњBˆ+ЗЭaCu… сФрчRИз.~Lия-—Ъъъ’Є€AќеxЎ %{В§иќG›.<ИЄрщзsЕі˜нŽїИЙњ&ŽїИЙњ&Н{>OК”}ьљ>щўQєTьро~_ЛˆчѓžƒЫБої?DгБої?DзЏgЩїOђЂŸ'н?Ъ>Šlро~_Лˆ|ч ђьwНХЯб5`Д:T‹Ш RDз8ўoИgЩїOђЂЛі‰qNй6@ЕœЈЭs'џхтW“Y Пe”мЏ§Ъ)W>цљє/џю8жв>јšЇёЌЏї•QЪ‘э#я‰ЊЪџyUЌєXR” Ѕ()JJR€R” Ѕ()[!bКš ПиИохwxcУ@kk>сї,?ю|ТА+>сї,?ю|ТЖјwа5žЬ=јœЇхЧѕи`R”ЌCЈЅ)@)JP R””Ѕ|6“эѓё?8Ѕ6“эѓё?8ЅV= dеyэйјТ?ьЮUIЋmъМіƒlќaіg*Єв=Ѕ*Ф R”л-ЉзRкTЃ]'Mй›ЖХB–”™JђЧGМ*9Г[:‡VХƒ Ћ“СYу8#‡јзpк6ˆ:^37;}ouIЖЅqiJ89чžnŒј+СФ1фž?ЇiѕП$5z-6Г§JёŸ(ОФ§]ў’Jќ­ЮгГ5^Ёjз HiНТь‡”@флЮ2IЩ|5ВIF=OжѕšЬZ,2Я™дQЃS­ЄсN$|звRe),FA}чJoŠ”O0l,;в–˜ЌД›<)!Дю•Щe.ЉGЄ’ s[шzvУ J$ТГ[#HoŠf+hZxc#­h№ЊІф~}—хіх(Ч}[ќUнcЛЧаб ъ™)~^чу%ЄџU_ж tрx8у'oЇэЂж—Z ѓнН’ц+ХE\xЎ•*?;Щ7’NoДѓ )`фWЯ*ЁœstзЪЩч9Џ‡RP)хфqю—Р@Xц€НрAЏtФp№P‰RUпЯЭP}­й-їM}—>2‡m’ьwž-Ј4Ѓ~*^’Ol эп§оъ€ уj•ўвЋгЃWЈЧ~rќFчм]їHiћLН ЇЄJ€Ън{–х#Š№ђРЯфTŸSJ-­@ЖжъwRJ6+c‹xиўŸЄoЄH!]#ў!ЪмПЁ7d8ђ\пe)ЏGIqEyѓї˜ŽIЮRmвEvLмПFaщ‹Z]9XшЋ Є-№4ЉЇп<8gЄдnЧІфНЈ{&B†кспjгэž№ьЦSkЖИRПД'šГ%жšЁ™-Am qЮŽsPm=Гhn]МЯO+%ю'”т”ќ Œ›Ž—ћ‹юKo˜Єœ‘]uыВзЅћ  юя'4j›:qЕ)ћ\vQpF•Ё?n{пёЊу%‡c>Жd6ІнAнRT0AЋ›Гk—ВKSЩбо)8ШтЎUДнž?~М‰ y ЁЭєр+Чс 8+:ѓk•gИ; {EЗлјšЇёЌЏї•QЪ‘э#я‰ЊЪџyUЉ@R” Ѕ()JJVsж‹ƒ05и""ўевžєаБй\‡лe”я8т‚<$œ]лMl†и- .ѕЪ;-Cy[‹) їИV“`šQ7ŽнхЖлGqЄџ[ЅCѕUˆŸoT[xR•PZ.Ъ,.\д•ЅўD'Ёч№чžП5^ЧmЬл]А9JSО‚ЕЉAXшу] JC#QЙй %Е/€ жfияBгoІSžIНа†€Ќ›3гЈОъ”G˜АGЧ[P#8цђтКюаеsƒlnŠ(ЗRQМ0cрЈ&У$umХз8­жJП)P5fЃйуЪЗЏ  —Эв—ШmЅo[d“БЇѕfБ.ˆSlХC‰R”ЄЈ`‚1РŠЖь;\їŽwКЎ5Ъcщј7YЛ@bра=-E  [МпšЖјwа5žЬ=јœЇхЧѕиpкR•ˆuЅ()JJR€R” /†в}Ђо~'чІв}Ђо~'чЊЧЁ,‚њЏ= л?G§™ЪЉ5mНWžаmŸŒ#ўЬхTšG b”ЅXYж[d‹НЭˆPкqзV[8щ |ƒ]“де`ь§N§бж‰j"wPНюe+ј вЇщНKdeЁзPч$І€;мz1аxU‘з]е[&”!ЧqйЌ)—KiPJ\J”"A?’ІіmЇЎz†&Ё ЉЉhNV„wЉucэVЁс?xѓ вXvлЏ]‹ЛКЪЙМЙF2qq›Гп—>х†]4vе6›ОiўmAh IШ51й\‡съ 2™B‹]ЩУ{x…uЮХэЗ;дйЌ\фED— Ё†Yl!М8~_ЫRЛV—ЕiЛ$v9$8ˆЭ„ЉХ$т€тЂ “Фжv—A,YwЩђ]БуП+0kє O†/tЋuіW>]ќЭ†—ИؘЮOхХo•Н’ЎZНvЖЏIƒm`nчЁ<ег"Щ[uёКЂ5Ќ~~{Ѓ Ёоžc_.с!*шЭy:с Ыy#СXхХрžЃЅчуЯšёпуƒXNЭiГКы‰оьФ†^ммuЕ(є ь’OС^ЉШуGт?-y4рOœ@{„”єsŠm8йцЈЯUЪџeU# №Ёк‚ЖuЊВ?љ\ЏіU^в1ћKё"]ѕ?'џtЖ%qђќћ‡+ЃЅ\“jЩЪ1ЈЉѕ?ћžгчУйД9SїSџ0Ш№WЇŒџд{rї™\~BѕЛл.?maЇьирMpЩЖ™юnJИ!| т…XV№г„ЯЮ+щl‡uŽІч4œіиуYЅЪчl€ow59)0Щсžšњз7іcGEВ!ћ"ћаљЋЉоt{Б-ы„ЉyXom6ЩtœЈ­rеœpч&ЃzщхЮŽ›TU))#О#ЂЙL"ъˆЦ#ЪћТ”Iщ &ћdг оmИDJЛ*0*HHћtєƒUц­UњѓеduЩЎ6†ЩRG%UйюЖќщАп&вмRљA<JR€R” -™ўŠ~/і‡+–z }ЛЋуnН&зSг?бAяРЅўахrЯTЗu|mУїЄкЊ%œЪ”ЅX^Б™rKэВЪЗ ”Ѕ#$šђЉ†Щйiэo> œЌg Žc@t­ ГЋх‡!нЬy С[iNPG€‚+ЄйяZЂ5С HŒлsrœ…t У.В [ $єдŽkp 6]qЄ tт€ћГКѓАPЗRBШЩВJЪ‘…Œ‰ЕЌ-щw“Ш*MJ$ЧKœЄѓb€іJЙ1Ф’+сN“ŸЭG€љСјј(‡зКž~zдмm‘.ЌŽЭi.€r3бY%4а_*Д 'œЈр Ц/я ю%hPрRr(>г 5Т‘АгiXШHЦjНщx7YWЩђaJ%ЗžммHЩ8ЎуЊэк•цdАА™l-DЇўѕCєUВ§eVхЅIHp 7]\†œ [`rЃŠюVі"ЖгЄ)iH^Qэ-6ъфE*юТZsњ о0щUŽ+–еšUСЛe‰іН Љ+N9Ц8еj–Із)х0ж”Е'Рœ№•)JVBџ0ь№з?{ФЊѕVBџ0ь№з?{ФЈ`уЛHћтjŸЦВПоUG*GДО&Љќk+§хTrЅJR€R” Ѕ( €Г‹цЊƒФЉLяяЏ ШТxрћЧќЕbv—kC[8Й6Ы?jЦP”ЇСŠцžЇ{SЏ^f\€XB9 zwЙџUwэ@мyuЧ}@%H)Wƒ@E6 mDm+km* х2щ'ўёЮ?ЦК~Ё–-ъKn'НPЯУUуgкХН5{zРћћбуЏu‡Oƒ А’B5U0AишщзKЗmіKlЅ+#œ ƒm6вдцЅ4№IK‰8Љœ››SѓB“б\Ÿh:к;vЩ–NђRB:hmБ KMояNуПeу№ЦjЭ]Ђђ:<ДЯ9’*ЖьI’ЛœЅЄЅп ш'І­[ &U”ЕМ•$7…а+ADНЯnFwЙ}ёž‘šешјJИъЃ6J=I8їмzГѕ~ЇŒэНВНђRч€ Эи+K—Њѕђ#В’Ї=уОї§ko‡}YьУп‰Ъ~\]…oжкRn•ЙЊ<Є•0Ђy'qСCщЈхYT$XrЌЭВЪRЉFBС'ЄЈž šЛIйЌZDї“ RyLёZќтkъr*Wю3Žљ@)JP R””Ѕ|6“эѓё?8Ѕ6“эѓё?8ЅV= dеyэйјТ?ьЮUT1šJ[х$n)i Цс<ѕj§WžаmŸŒ#ўЬхU™Л—хJЙ$§Ў1Šкс1dЧ–ycЖЋs’\пќZg,І’1dВXst FA"Мkо[СчBwP”„Є{ес^-zСLж›ШО_ЇЯеeЃtЏЈЋGъ]—kЇKgtЪuхrЃЇ<Уќ1\CezVЙд ˆжQЌ)ї<Р=ѓW3JlцзІтЧ1йCmВs“язБИП]Qlr#i8JеŠїvФФл‹3вB\5Н$]Ўэ€ CG…O­­–рЗЪsуz(Го9ИV“W+zШї>ѕnЄIm3…ЈєX‹фц Жћœ@p|щ,нR"(„Ÿх<5!гšЖюBž‚˜k;ЉЩЮkЉњЧidИ­Œєš‹j <Ф›Ѓ.У m їЂ€›4юFFHШ\§P›Kд:NінЎЬыm6ћeeТ2GСрчЎјЇЫmЁj Ѕ UsѕOщЧ'5ђЩGиђ•єPVЊОЪynПt”ЅЈфѓ]Wдё|Н\ѕЋQž˜ѓЬЅ9;ЪЮ+ŠЩh4цъI#цЛїЉ&“}Ÿ-жШA@Kk#І€ЕrUŽ `6{хФћђЏЖŽšФRв—HЩЦs@mЃЛо„žšаэаv}ЊG†й+§•VС•рTsh*RД6ЄNHHЖI<~)Uщб}#ДП%бžЇЭюдGќGэWAx(ЇЄW+иDеFй-Œ “і}а>=ЪъpюЋ#ВZмЯMzxЯёGЗ/y•Чф/QјпqЏЅЗœqY[Ќ<‘Щ,9ё^N$Жwsљы4Йјй)ЙАо%2pА:}њЁщTЙrmнйzн!GФ#?Ю+ ]ѕі›ДУfdћЋ Въw›нVёXї€ЊRНdЬ–­Z|ПНИbwЙ=;ъљБ@w]]ъ‹ЗВккгPœ”яѕ^};Љ“žЁ=з:УPыизSфЊNeцаpояќИцЎ?oˆьљЌЦa%N8 ‘зV{BXZЕZи‹ оo(*Qч 7W ЬOѕHhїуpIЕИ#˜юJсњЋЖ‘ŽšрЧ]ЛеЅпlmЮ,упDѓWzŒЄКфёЗЦ|/е/zG<}eы2вАІШ5ђД„ЄЇ›Р+ТTШёQіCіЃxќІ‡ЌэхшxЅyЧФ:U<Ѕ  `н­,KeEXOm;ХF<еъ^e–‰ ”xMЬюb0ˆіѓ)qЕ сРе_кц‡N™–‰АAь+?cС<’М№x*юЭD[Œb!К‡8“UЋе m˜ѕŒ­(7нч ћ`zsяPЪ”ЅЋ Ё˜v?јkŸНтUzЋ Ё˜v?јkŸНтT0qнЄ}ё5OуY_я*Ѓ•0к#pŽа59[Юњщ+ žU^ѕGЙ(ючцџЅmC‚NQR№иљџюGѓ9М‹Й§†+?’юю~oњS’юю~oњUПqЯљиПЙЬ ЛŸи`RГљ(ючцџЅ9(ючцџЅ?qЯљиПЙЬxUмўУЖ:yœНТDє-qK€8”I’Оy(ючцџЅuн ЅЕ]В(6}3YЄИ‚В:?э?5?qЯљиПЙЬxUмўУЌщ—lpa!Ћo#Шm #ћеЬіЭqИУ}З!JZЂЏ‚ТUРVТc:эkRгVЄ(t%д‚?ќееoэ6Д]тЖвУu.Ѕ› 4§Ч?чbўф1сWsћ ж‚аАnАcЬPCЏКэюsЦЛЦГ+Nю™K!Е дЇЭTxJдь Ak”L%/)Ы+=8рAІЛ6’кFгѕSЩЇ,SDЁ+Rђ…A’Їв1цЊ~ч–эž§d3ер2јк%ЗПkЏЖЈэЗушr ХžMg;Њ<ТИ&гзbjЯ1+S{›‡ ’kiЉemzщvn•Е2йі'гšф:ЇHjЙ-8хжжZJARЗAЧфп5мsўv/юGѓ<Оw?АйьYћ“v•ˆЈО­вGцЌF‚Eбш“DЌ€Д`tqЊХГнUvГФMКЧп 2ВЃйG Щ==њkЎиіƒДљ эКwO:ГЬžP џљХ?qЯљиПЙЬxUмўУзh-м4ЅО,–Й1*\‚аqi м%YСрsŒ~ZфVљw–ю7‡бq™Ь•tЦtД9QЩ #‡|xtdз^еаuЖЉД-НukdTWь'b:МГ”Ј)kШн<ћЩСЧdу–-ЕЉяœgУŠРтZ­O №кHЪ2ŽEкwTдЙ4ыаЯаОHpн‚–XоLmЗ}j’~ЎЋвhяшЙ=&ІL™hmдИЎYвВ7TIїЋ jKlMI ž›#xЉ–љDруTd‹ЊљьvRа яТВ@№ѓќп’ЄZ_RjhV”D…kЖШŒЁŒЩрUŸйhhx6|˜МmF/юFџЏ3х,tИ5qЩƒтŸU(ИЎUвзFDnZ~;pCъ1Ÿž ’к H[`’q“]GVZo.ZЫ’l№-‘‘•)q$ Јc›Хgђ цхИфОщ?§+Ў›фю|WПQ‰џіGѓ<|k‹hѕЮ/MТŒ V%нмќпєЇ%нмќпєЏWю9џ;ї#љ˜>w?АРЅgђP=нЯЭџJrP=нЯЭџJ~уŸѓБr?˜№ЋЙ§†+?’юю~oњS’юю~oњSїџ‹ћ‘ќЧ…]Яь/в}Ђо~'чІв}Ђо~'чЌ(є;2 ъМіƒlќaіg*І8тœнп9н#рЋgъМіƒlќaіg*Єес9(ИЇЩѕєз1JR GдХ>-ЊХ=§ФІKЏ хž3зV>Ч‹uG&ъв їы“ьїD&&ЮaЧфPмВ€ЅИиЦTG^ОЦяvиЪ[OЈЉ<мhвЭЊ3?eBSЯœзьйIeЎ9HЈЎЯ.ђЎз›МVпњЄ“сІcgtУт€€оЕЊ#оQхdъŽ&ЖW-T§ЋOЛ2Qm.$dg V‘нšъ/_RdЈnœМ/{8}`БsžДХ<эЄ‘šbuB5Ѕ•1)Жп#УРжЦЯ%И oм%ЖГЮ8д%;(rжРEšcюs%JШЌG4FЄх7žžtѓрq %ѓ5ф1pф)ЕнрЎ5Ю=QВy-lo:лы# е_ьЉЈЁ-ЋŠїбішRИ+ђWeГкр]ь‘5 Jф{рС +.„йЭоўЖeЪj,XЋўM—оXЋВн*юšfH˜кЂМ4” *+ЌчЪВмž’†ЪK-ЄедэO.Df|юЉh #п4ЩJ Q5ЈНз”щ­ƒъK`O9­tŽј%\дTbrrkUДfHаZ‘Тp=l“ўвЋiwuE\рTohS]sCъ&кzн#MUщб}#ДП%бš ˆЬa˜X‚Яй/УџЎхthѓЃЫ<š_ђзйj›Y„•oђмнf]HУŽ4~ЦВ=щу?ФuмНцWНGIŽ]ŽсqnЅ џ”Vк<Жц2Ќš‡щЋ›RAaђ9^‚ЃТЖ‹’cI(o 9чN1YЅЭы ТЮz8VX!*­Rn`JгС\јЉ HЪA#ŸУ@yr7?-bNДТИeЧCŠ&Ж+IJx уЂБпБаЅЙР S&Эo…з!9цЭpЭOŘVkБ"0a їЋмсŠАŒЪDЖд2бяW кЦŠЈЮ/А’ћ ”dџћ@p=АэлЉ,т %—]SˆtЈєž qЪ‘j-'wД)їфBZb%dСцсЮ*;@)JPƒLџEП—ћC•ЫЖўЂuМ“‚ИџЊЭЎЃІЂƒпK§ЁЪхžЈnъјл‡яIЕ“‹ЕЩІK9кцШZJTцA=шЌjRН:^}SO<мкяmў%TTz!Vуadйє6€S џQЊV#дыЋZLl@z2ЛбŒкПYЮТМф›хiљ§PѕЩЕЋuо EvјSšГщfeЪ8%<щ5Џл9IZн@NsЦЃ;cœƒhn47@Cmž)4{Pъ9љЫJ%ДЋ'˜VгMi•-дОњp=5 вŒˆіиЪT@ЪЯIЎ­oyиіТѓЋxa8 7ŒЩь;jЪNсмGМ+VЬЅ"Z7”J уЧšОЎ$eІяZ@ќѕ­}%ЩBU€ЃФаeЇН'ї†ЙіОвЪИВу[Iо”G†ЅЭЯфїXѓhГ\Hu AЪH (CњuЦ5в,ЮЖЄoI #Žю~Šялaбpла0оф‘П !ч­ЖдtŒo^"jfBYzЗ–qР~Ђ:^ЃZЊž6шiNЅ ТОиєаНŒш9їyIЙЉ%ЈРюЄЈsјHЋGІЌ1­ЪЈєžŠ№гЖжmАš‡ДЖгC#dr-фŽ$жJНQ:UxШЕœ~I5бт\\CХЭрЋ\Ћ[ИфНОщнЮ хљƒ]8!ГПіеЗЦ|/е/zG<}eы7пј–œфˆУ­№Ў+„ќ9+~1!фtšыХаmф(ёiYо5дёe™+ЫDЁC!Xрkшlі[ЎеrhF”IТЗ;уХ*№TгYЩ>Ж€•їицЭW;•Іu†J‡bJVђ8nЋСRq­; ]uауЊ­ДJ™jеЯщЭH„Iwu‡zTx|Д^Јkуs4т•дЖd:žѕ*СPщј­mxз/32шЅЦ@q ѓ€|5к–Яг6іЇ19Щ’ лˆyYRTyˆ 9…)JVBџ0ь№з?{ФЊѕVBџ0ь№з?{ФЈ`уЛHћтjŸЦВПоUG*WЏ•mXoqp˜FG1х•QJєфгМxa•П*џЧ"ЖаЅ)^rE)JVлдџ|ŸtгБпИ5ŽE|ŠUЛє€8еLB7›q[ш€Х\qТЏ>ЪЌёЂiЫc1аиe*xq@|э KОрrTVк” J’y‰ЎЅсШ{]J…Љœm$)­ѓСC5guœГдя67•љ*П -3YjДнVУMФ№*уг@D&І37Ы›…д;%жТ”МаВјЌ^Хtœ{F‰rj3ь\nM%rљU+$ЅJнТOк№=ћЂ6{ еrUТlfћ‰нZ–эсяƒТК_dДЁИв“оŒ`tW—›Сф–FюЭў%ЦџlвbвB:гыЩY—&т:y\уІ zё(y…­ЃЄRo—m/ЖЌ)5ЮumФAАШ}вHiтНFЧvy лМЬ•=їoВ„Ѓ<~ŠБК#EЕoУр„ЬrM—УЙ5Ївѓ[˜тпJyј)Dз]“GJКвЫэŸ ПкЫГoЃ9oTxHИЩИ]YLw$˜ВyAR*PwЇE]йБD‹[ŒіЩщ№еOбh_ыK7ЁСџдwЈж† V‡U,БЗ}ЊчыжЙюХЕ( ™ѓжшˆ’йl““Ч"Н„я<ъPŸ 8ЏС&;ŒяЖћe'™AB€Ч FiE'ˆщЎM­іє Ѓ{ N4 NJ2 Oum§ы,pѓHЁ\ k”нѕœKЄ‚žРG/вwhaЕ§YйqіХНH‡'М„ЇсЊџ]›n—”Њ[z€ЇЪ,Х8цсяфўjу4”Ѕh4ЯєP{№)Д9\Геэн_p§щ6Кž™ўŠ~/і‡+–z }ЛЋуnН&еQ,цTЅ*Ф ь вь\§Ь­С) ,ЗКЌn№?—?с\~ЅzWЭв“^\F{!Ї€пo$ФŽzЧЯДъhj Ž­фпOЯQM лu ‹с2…„eI Ц№јk{Ёі›&љФR’Єр:вјюzkЂпсЗЌЌˆЄ"`AKˆO~ Јш GЈ_–ˆ,8_ˆ•6Ўaяз|вѓeHƒ!ЉР%;Рg85Яэš?ис]с)P(ZˆТГ]wgёš–у‰PЁ8?ѓшšы~—sЕŽVCCuЦе§o~ЖјЯ‘ЅњЅяHчЌНgЬЙa1нm*Ъз„юєѓŠаъльшЊn+I%ЄЄ[нjЋ{7ЩJЅОBУc™# V_мтлфЙй ЃбX‡CŠmT‚ЫжчbИX.9чЖй6…|›хuunюёe 9 Z}_ЭcsaЛCq“…МЁ№WzйEЖdj›}’„6РFі9Шї{Ь[mНцшТмHтMq-ЛL’ИЖж–њЫkR”Єч<9ќ5аu;Ы!щŽP€TЏЩ\_ъDj[Т$2…Ё†›  (ѓё'8шч #Ѕ(X] ќУБџУ\§яЋеX] ќУБџУ\§яЁƒ“ы’žикЙ*RSНp˜Tp3Ы*Ѓ1Щ$+•i|q„+&ЗЛHћтjŸЦВПоUG+пћd%ІŽ ТмnОпA]ЏuиЅ)^Т”Ѕй6_ВиZЛGЛ=зV&-KKxV0HцщцЎѕВыЂЃBMЎb‡g@УKњУ з/ѕ.ъV9ЌnЁAЦ‰t+ЁI'ыЉ–б-“tоДЈрчАд% tЇ ўКГм"ЦМУ ШРХcYьаэH)e сЬk]cМF“З™Z\mФ…$ƒ^WЛуP˜хœt6”ўs@5ХвDx*1т†Ъ…al§щ2т6ќ••8Дфз8кЛu‹‡X„њТ“ЛОy€=5бv^њ$иbИб)ЄœаWщ6зƒƒќjИmF-џж‰?rхqVX_՘#–IщPЎ1Еsk `8•<ђ ‘вh іЧdФoL[R’Є@ЦG‚К•ЋP[žœ˜ь-ЁшMW‡iWпгЌI\—{%-…pЛЮ”вŒ[_ь… Ў€а с\cjŠv‰Е));з^єŽ‘]ЭЧOzЉі./э/Y&л$Б‹ЛœЁ#•w=m№я k=˜{ё9OЫыАА—;nК2ЄЄ#$VЏGшхXІ)Yžі№уZUмюжr`хЂœДŽ#п­ѓšЮо-хоЭi#9WX‡S#[н[‡ їTpNyљЯ@ЊЏД]r~й?UЮ—іEžS‘Wдt]Л”Zоиi„8-ЬЌ8Ѕ‘ќЁЎлк;Dмoэ9"œb€ЈTЅ()JJR€ОIі‹yјŸœR›Iі‹yјŸœRЋ„В ъМіƒlќaіg*ЄеЖѕ^{AЖ~0ћ3•RiŠR•bйъwжіЭ<ќ˜7‡e+P[.,рв ќиЎхЋЎі…Мнк<€мЖ‘‘КЏЖцЊCR %іBgFnу6Q„œ$Є,рЩ@uнeДuHžФШxZ[ртO9ЏhГ п­ъ2`)JPоJШ&ДкB=Ў§-иал‘й^9ъqjv-Ісы{эn6мpŽ Oƒс #ЭлЎЭГЛm@ џUFВlАя6зŒЉN‡[Xоjyол/-vзг!…ŒЉ‚x|W…ђнЩк€m SdѓљzEЄ“ц{єЖТжЃ”Ї8Эc6ѕѕД‚ьFЌуtЊЗ6д˜iь7T^k‚а•}АOМ}ъїеФ?‰,­H Єїь‰N4ЗdРо[gОJG^n_Ё0а2Д•qH#­пa—%Ц–й( +O€ŠЦеQ›m- ВT€р!DgаЧY3Rс>ZŠ›?жЉЖ—зkЕnУwšŠIт*/O”+—ЖКІ”@;ЃŠj)t“s‡5Ем-Ыпd№yО ŠМыKeЏVYзЪДл‰qјуЭЯ№згійV+ЄЛLщ/–s–ео”д–ЯЌй-%Жф)#Ѕ$sTж"о#хфя“ФЯљ(žЂ€ћf#ЖE$‚ъlwоіk:њщn*п&ђЂ8‘ЭУ^ŽиeG“П[ЅБ§EŒŠѕдHqzZуЪ'*DW8щЏN‹щ§Ѕј‘.ŒцoBН;Ѓmв,ђŸВЕ)”+ъцЉоЪu<Л‹Q‡˜W&Ќž‡5сЁV’…У8х3њjЌ;…гиФх>cх‡Я}Л€sсЏOў#Јіхя2Иќ…ъ,.”ОЗ"RЃe!@pїъYpЙЕk„Зн 3\GAЮCгиœ­цйPо$жяh:2лмeЯАЄxqЦГKžѓ5эТшЇ›†­ЦѓЛТЖ{> MrTЅ•šižF"ЗpЄ§БїЭiuцдкВЩDdЉjQџГgшїшЁЌšЙЫ’ўЕ1бЛЭ\Іѓxдіі{/(І‚И,(ѓfА#mтQCJfzNRœЊЃ—}ВђЏиITђїHќƒ4xбz——ЖІ-чьэ)Юы x|5‰ГШŽЫю8œgТjyГ;iзXИ чМ9ыfюšfNˆ Ї=€Žм%6хЌі^Ъ в’:*+.baDр#usЛŽЈ9Ff–”ЌtЫ‘К †іs@i5вј–еы{Э7У#|fЂzh+UzйЊЇ6г9Ч(;дЄј JфЌ>М“Э\jЖXбn|~ѕЧU… №аKSъЫ*Е:­№'ЖршXVR-sKJi3^^С\І{м`tз5оVііNї‡5шe>QК^^яУ@vш›PЖк5DЖœ—ДœёїЋSmЭk}ХpЁ Q=ђ‡Э\SžКNЪbG[o?Оž\+yР $pл1Ж‰eJ\Y":Лх+'э\ЎЭoИ<†BP[jшиy|Ї№Ў)?dS^жFo(Џ[ЩГž4лNЏ{JYе2 -œxxд MњЁсH‹‹›Keм`œdФ:Жл5Žо†ШOšЏЉmXЫVцьё–&Q*w;ЈїўšЕкџnЊ“mXYs–*н<’„šрзK„ЋЄчfNyOHpхJQ 1)JP R””Ѕ|6“эѓё?8Ѕ6“эѓё?8ЅV= dеyэйјТ?ьЮUIЋmъМіƒlќaіg*Єв=Ѕ*Ф ШЗХTйётЖ@[ю%АOA'_lКЖ]C­(ЁФ()*рŽc@Z}І к-‘У1фЃЪЧސjI>Т—ЅЁ"*Ц1осPS{6ИoB’—Є'x(ёц­Ў›еЮF LШђ”вЗ\NюRhжcњЧr‰}q–p$”†ІіЉ‰}…Ф’­іWаБп'пЄK…ІћžU!—q‚ДŽ”V[zRCЉ›ЈqЄŒЖтO<зL>CВ9D#эйт+ю);ќ“ё”YWл9„Tъеq"ЗŠˆ5ћпяъ1№PгІ%Ѕе­•ёЯHЌ[Ў™—-ІˆHхppyХOШ@ЧE`Лœ“Фs@D&YeЦЗюF`){И8Ў[ЉаmЈ[—‹ьуˆAVЇ‘ПУСQ ЋЬББЄ%›Шk%“о;ис@UOzmR~а[nЄѓ(ћтЅ7^•6˜вHBгЭЧžЙtVг"RPуЉe+†C}№uG?–Ек^џ™ŠЫя€ѓ{љOƒ+$~КШьodQеЫZ9фЭzxЯёGЗ/y•Чф/Q эƒqДРMКЈt5ођЇˆ?hnZЪљp~jТхHГv‡mjе5Ж#[ћ’KйЮљЧQ Э.ndj{гёвУ—Дœ€•nџˆуZ—qїуЮ-ЧЮЅ’IќЕёJJR€R” Ѕ()JаiŸш їрRџhrЙgЊлКО6сћвmu=3§ќ _эW,ѕ@ћwWЦм?zMЊЂYЬЉJUˆ,ййлVЏ†QХЗеЩ-$№Сщќ•ЏІжІж•ЁE*IШ# а—KДТхЁхЏpЄѓцКДkЌ%ДЗ[!#‰&ЉЮ‚кS—Б­Џ!JЙ„…•(@чјxfЇj}XУmc{Є(аіNБГE’˜§’ЂqоŽЙT„8иZ0PFA=5Тє–Ž—.XŸvuHmI<Mfэгm}И#О яAо^ГГ‹Єu.0HptѓfЙŒэ;=…хЦеЛЮNsS-}w’§‰ЉvgrƒХ[П=@ЂъЩ/B-ЪpЅСР…P BЃ3ЩŠ@t' ћѕХ5ѕнmђWxъ'ЧsuЖRŽ№ƒг]]jfЂ4Dp$+xwќšsяЯљk‘оя\pЅ •gq?  =t­эAubg’C„хеpЖк›E=jИ5ЂS‹чт=њ7r”дf˜iв„6ЂЄ”№9>§~.у1ЧƒЫтœET]ТЫ&иъ;(œт8­йЕ9oЄZю.dЅ`АЩЦс?уZ)ї.ЩƒАЇяёYЮOF=ъ˜i˜‘n„!жнiєЖЅЗ! Ь’z8аhŒЊ^МВ4IхCŸЇuкщplгаŒІ:‰qЎGarMПXYžДЁє2IP9)_ЮkЊЙ})ібjRчи­О3фi~Љ{в9уы/Y>а–Ьђ—a”’ЁЭ]9Е);ЉќЕгЊф­Q•€ё@о&ЄPц4№!šБ‡1зњЦѓlЛИЬЉ,Жx„ѓšРДэ*sЉ yрЅt…sŠ˜ъЭ.nђжћJH№ƒТЙnЏбІ;J _"ъ uЅ`Їп 6КыR3qƒЫI !”•(ћиЊqqq\$Кзжъ”Ÿ€“ŠоjKЭщЉS-Rюo>гNд8Ќа R”Ќ.…ўaиџсЎ~ї‰UъЌ.…ўaиџсЎ~ї‰PСЧv‘їФе?eМЊŽTi|MSјжWћЪЈхJ”ЅЅ)@+sЄЗЪдP™М)I„Е€В?9№VšПh +~бњ"Яh3мi‰/w›‘qЧPH'ˆЩј*Д-ocODПи™KLя}‘ЌЅEВ?ЊЌpоїызj—inкg}3˜Yw‰нIЧСЦВхлњ^ uЦљQ…€ЎєƒЯТГВыМm“\Баќ•§уУжЃM4ђ_5б.]=eиEчз TxQ’=№+ЎHJTТ™p’•p&ЊŽУgЫВпQiтNGZ•|ЭšЕН˜г †д‡0сƒkн$r-бv—еi3hђЗW“&вэџЩ)‘Ѓ,ZаЗ­qдз:Rу@рупSѕŒxq5EЩ‹n;ЗHo ž?jСыВФsGf+"=С№ЖšŽлЛќŸFёVъЊЪтдуŠ[„Љj%Dž’kЊiЋF|с,rp—T|в”Љ*)JP R”№кOД[ЯФќт”кOД[ЯФќт•Xє%_UчДgуџГ9U&­ЗЊѓк Гё„йœЊ“Hє R”Ћ)JPїcwд],‚ юцDNѕIVNђ:OO=tЖЂлп{}ЗƒoКЄЌЊcЛKВм[™Т‡PyК<Ќ&•Оњ§h-†79NѕЬž!@рўLа&žой\ŽUАžepПТЅv›„bю4јHO{Фз3wŠXH%Ын?kYЪьЬGiCtЧЄа7ØШO,ЃФdжH^SœЄЇх7ЉŽhJѕ*гг\M­j+Щ@Я&€“/‰V9­T—šŒJŸPHчтkBюЌ–С*мCƒбЮ*Ўѕ<ЕЅW­яG@Ы+бІ_эŒFuе< R2jЇэ“S;Љnщu/#БR†’О#п)Џ}aД7gZŒHYenџ цjQRŠ”I'œšђ”ЏдŒœP№хП афw…{Чјk2<з%LВЙыeЇ4ЧЎЎД—Ѕ%€рШРо8­ќ§+Х j•!.8 ф– V8 ~jєшО‘к_‰шЩ†Яь–љ–fž”УkuЭю*Ny”GЭS(іЖ!$Ѕ”„ ј9Њ ЂЕm–еdb4йifSEY ?РжCкім$ИђюmЊ:FCm •+оХzxЯёGЗ/y•Чф/Qл-ж:”ХЅEі–Zˆрќk—дГhЗ‹UђъЬлOdяЉЏrЩ т9А>§Dы4ИЅ)@)JP R””ЅЅ)@Z 3§ќ _эW,ѕ@ћwWЦм?zMЎЇІЂƒпK§ЁЪхžЈnъјл‡яIЕTK9•)JБ”ЅЙвDYu)юИвЮі<]Z­7ЌрВУ2J˜qЅ€RN5O+нф!’Ъq-e!G( iД=­CjмR™Mpы-(dўA\SKмWЊ5+“f=КЄёис\цLi Х)ю-ШофЩVIн8?у_’гћ№жЄ:Н”œsP/F\ˆŽР•Х…'€Wъ›lыmœДЏ*ВнE*ыeФ…ЖЙ е-J $t^њГY[­›шvZ|й5пЫ@rqi7ZeЉ+<АVђ '#9тzz*'R]_Њ=ђ DK$яo(Ÿ‡‡ P R”ЅšuЋžм§Я’Z`IeIпNIммGёЈKД=ЩJlяЪ,Г)--\Rкў~€ЫаяЎу~„fPЅjO}Ч™$ŠБњ1ˆ}ž’ъRTž)сUоиФKў*žMЁіWz7ŠHЯјŠэV‚ZnTW’ѓ} ф~Zлу>F—ъ—Н#ž>Вѕ’SЊ4ЦaD6ю дчKKх`ЅХžNjНъЋь(Зј ~H [„(яtжТёДћ}Ђни͘фgОOGG7ПYе­П\ц \‹Siћ р('˜ёоЩЯ75{єY^LЉdv|ŸЪ} 4|>Y4pкэ].Юг6;Rіt^D8ІY[XpЖ’Б—~jјŠЫrх­ї I))хЃ(Ж­гЮ28тЃ:&еyКЙ%ИY,ГКЇЯлnр№їјTНhqЇлэ­ЇpЖж0R|Лё78J2‰•ђ#›Qƒ. Щ6пGжЈпNжWйvX–ФЩTTА”ЅRYu|ГИх\рžsŠ„Yrn2ЂTЎW‰јХKІэ OЂ#…ймЖякЁ‘’h„…Ф–yF RљСсЦДDz, '=o­rxр3ЧЂЙ чijC‡ж6HЮћУ›оРњj'Љ5mлPЁИ<žM;аOПЦ€а­Ej*QЩ5ѓJP R”Г2_d‚ЫЮЖAо‹#›5ь%Щ•%ŽЩѓлЋхUŽ#УXuыюІО?]zt_HЧэ/Ф‰tg­Яюз?'ъ‹YW?Л\ќŸЈV-zxЯёGЗ/y•Чф/PЅ)YЅХ)JJR€R” Ѕ()JаiŸш їрRџhrЙgЊлКО6сћвmu=3§ќ _эW,ѕ@ћwWЦм?zMЊЂYЬЉJUˆЅ()JJR€R” Ѕ()JJR€ЯgљЁџяš/+rˆхFBИгЊH?˜бŸц‡џО>jР­О3фi~Љ{в9уы/Yэ*Kђн.ЪyЧœ<ъZЉќІМiJФ: R””ЅЅ)@*Тш_цўчяx•^ЊТш_цўчяx• wi|MSјжWћЪЈхHі‘їФе?eМЊŽT )JP R””ЅЏдЈЅ@ЄG1љJ„тСЉй-G‹(nИl,œа2z>’DžФЗ^i•уX IIЯУ\ŽВсм%CqNGyHZ†yѓYЙјl'nŸј>л…ќЕеiм1ъR”.ž7N]Дu—–лZжp”‚Ђ}сQЎN_Е4(qŸ,ЧuAГНР|“QЧЏwЄ9)Т•сФVН*R…ЈspiЄаxК|й(>V>#`вЇіпWі>„ћIjяb:КbЄШЖЉђкдоz†9јTЃQЫ#XМ§КbeD˜иЂ•ГУw‡М?5ХыбЇœdхЅЉ'о5ыдa№аp>{ƒёУuQдSiv.Vv*Š.ьнІMСn$ЈИё сUEšО\š"[€ЅеХКдgQRж ”OI8у^юУм8~К3vœaџR'бёŸ–дфС—KСЩѓЊчПюm[дШb$ВФDЊ{ЪТd8Й$ѓх#ЁYщчћВ^[в[ЎЌхKYЩ'п5чJѓF**‘ёЙГO<оLŽлЅ*Ч!JR€R” Ѕ( сДŸhЗŸ‰љХ)ДŸhЗŸ‰љХ*БшK ОЋЯh6ЯЦџfrЊM_}ЇшЛvКЖFЖ]о–Ы -™)TUЅ** р•%CYш№W6юtв]c~ђьњ*„вUUЎюtв]c~ђьњ*w:i.БПyv}Nф(Њ4Ћ]мщЄКЦ§хйєTюtв]c~ђьњ*nBŠЃJЕнЮšKЌoо]ŸENчM%ж7я.ЯЂІф(Њ4Ћ]мщЄКЦ§хйєTюtв]c~ђьњ*nBŠЃJЕнЮšKЌoо]ŸENчM%ж7я.ЯЂІф(Њ4Ћ]мщЄКЦ§хйєTюtв]c~ђьњ*nBŠЃJЕнЮšKЌoо]ŸENчM%ж7я.ЯЂІф(Њ4Ћ]мщЄКЦ§хйєTюtв]c~ђьњ*nBŠЃ^Б~ъgћуѕеЉюtв]c~ђьњ*§oдэЄтV.7мЄ‚2ћ>ŠЛiГGhN]Oќтк*еЯюз?'ъ‹VХџSЮ“yе8Ћ…єр}ЏE_ЮšKЌoо]ŸE]јŽІ^\ащ)IЏSm‘Е™TiVЛЙгIuћЫГшЉмщЄКЦ§хйєUтм‹QTiVЛЙгIuћЫГшЉмщЄКЦ§хйєTм…F•kЛ4—XпМЛ>ŠЮšKЌoо]ŸEMШQTiVЛЙгIuћЫГшЉмщЄКЦ§хйєTм…F•kЛ4—XпМЛ>ŠЮšKЌoо]ŸEMШQTiVЛЙгIuћЫГшЉмщЄКЦ§хйєTм…:gњ(=јПкЎYъіюЏИ~є›]џWiШšKa—›%ЙЧн‹л‹}AK;Ы+9 ЮЃбZлІЪ,zъlЫо]Э—кЙ\у%1\m))JЩ BŽrГгрЈOДš*-*зw:i.БПyv};4—XпМЛ>ŠЇr"ŠЃJЕнЮšKЌoо]ŸENчM%ж7я.ЯЂІф(Њ4Ћ]мщЄКЦ§хйєTюtв]c~ђьњ*nBŠЃJЕнЮšKЌoо]ŸENчM%ж7я.ЯЂІф(Њ4Ћ]мщЄКЦ§хйєTюtв]c~ђьњ*nBŠЃJЕнЮšKЌoо]ŸENчM%ж7я.ЯЂІф(Њ4Ћ]мщЄКЦ§хйєTюtв]c~ђьњ*nBŠЃJЕнЮšKЌoо]ŸENчM%ж7я.ЯЂІф(Ќ џ4?§ёѓV[4њžєЂc-‘pОn(фžYЌєс{ехмщЄКЦ§хйєUЇФu˜ЕРЁўШ(П]ЩџмЄ епyTiVЛЙгIuћЫГшЉмщЄКЦ§хйєU™ЙЂЈв­wsІ’ыї—gбSЙгIuћЫГшЉЙ **зw:i.БПyv};4—XпМЛ>Š›ЂЈв­wsІ’ыї—gбSЙгIuћЫГшЉЙ *X] ќУБџУ\§яЅ=ЮšKЌoо]ŸE_w9I_ЖgdЗ8ћБbЭ‹}AK;з(+9 ЮЃбKБEqкGпTў5•ўђЊ9R=Є}ё5OуY_я*Ѓ•d@Ѕ)@)JP R””ЅЅ)@)JP R”ГюrУўчЬ+ГюrУўчЬ+o‡}YьУп‰Ъ~\]†)JФ:ŠR””ЅЅ)@)JPУi>бo?ѓŠSi>бo?ѓŠUcа–KЇ,ŸŠo§ ЌzШќВ~)Пє&Бъ……)J€)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅлоУRўКкщ/ИЎŽЎŸЗПZ­А}ь5/рK­Ў’ћŠчјъщћ{ѕnСкnщJU@Ѕ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЎiДПОЯП oіјвыšm/я…ГяУ[§ОZ=CшU}Є}ё5OуY_я*Ѓ•#кGпTў5•ўђЊ9]AJR€R” Ѕ()JJR€R” Ѕ(gм>х‡§Я˜Vgм>х‡§Я˜VпњГй‡П”ќИўЛ R•ˆuЅ()JJR€R” /†в}Ђо~'чІв}Ђо~'чЊЧЁ,—NўY?пњXѕ‘;љdќSшMcе R•R” Ѕ()JJR€R” Ѕ()JJR€R” Ѕ()JJR€R” Ѕ()JЖН†Ѕќ uЕв_q\џ]?o~Е[`ћиj_Р—[]%їЯёегіїънƒДнв”ЊJR€R” Ѕ()JJR€R” Ѕ()JJR€R” Ѕ()J\гi|-Ÿ~пэ№+Ѕз4к_п gп†Зћ| Дz‡аЊћHћтjŸЦВПоUG*GДО&Љќk+§хTrК"‚”ЅЅ)@)JP R””ЅЅ)@)JP ЯИ}ЫћŸ0Ќ ЯИ}ЫћŸ0­Оє gГ~')љq§vЅ+ъ)JP R””ЅЅ)@_ ЄћEМќOЮ)MЄћEМќOЮ)UBY.ќВ~)Пє&Бы TйЭйшиЛо-М“IўnuІљLЁ?mОкѓŒpЦ9Я?F“иqёЛXyм_ЋU(Б(ЅE§‡Е‡ХњЕ=‡Е‡ХњЕ)QJ‹ћ>7k;‹ѕj{>7k;‹ѕjRЂ•і|nжwъді|nжwъдЄ E*/ь8јнЌ<ю/еЉь8јнЌ<ю/еЉHŠT_иqёЛXyм_ЋSиqёЛXyм_ЋR%ЈПАууvАѓИПVЇАууvАѓИПVЅ J)QaЧЦэaчq~­OaЧЦэaчq~­J@”RЂўУкУЮт§ZžУкУЮт§Z”(ЅE§‡Е‡ХњЕ=‡Е‡ХњЕ)QJ‹ћ>7k;‹ѕj{>7k;‹ѕjRЂ•і|nжwъді|nжwъдЄ E*/ь8јнЌ<ю/еЉь8јнЌ<ю/еЉHŠT_иqёЛXyм_ЋSиqёЛXyм_ЋR%ЈПАууvАѓИПVЇАууvАѓИПVЅ J)QaЧЦэaчq~­OaЧЦэaчq~­J@”RЂўУкУЮт§ZžУкУЮт§Z”ЖН†Ѕќ uЕв_q\џ]?o~Е“4#bЛnЇеr#:зvDEЁcРA‚+O/cКjdЇЅL—w~KыSŽКъ Љn-G%J&.I$’IЉхTAбЉ\гДІ“ї[—’ѕZv”в~ыrђP>ЋJ]фѓ:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]+šv”в~ыrђP>ЋNвšOнn^JеiKМs:]sMЅ§№Ж}јkЗРЇiM'юЗ/%ъЕ‘dZvп! NМХ} J’у)‚…$ЅAI ˆЙШRRG€€z(ЉьсšлdZтхЌяѓсY9XВЎe}–ТwЇЄœфdЯZ^в›@ъ–Чє•j=‡Е‡ХњЕ=‡Е‡ХњЕNсEWэ)Д љlINв›@ъ–Чє•j=‡Е‡ХњЕ=‡Е‡ХњЕ7 *ПiM uЫcњJv”кP|Ж?ЄЋQь8јнЌ<ю/еЉь8јнЌ<ю/еЉИQUћJmЈ>[вSДІа:ƒхБ§%ZaЧЦэaчq~­OaЧЦэaчq~­MТŠЏкShAђиў’Ѕ6д-щ*д{>7k;‹ѕj{>7k;‹ѕjnU~в›@ъ–Чє”э)Д љlIVЃиqёЛXyм_ЋSиqёЛXyм_ЋSpЂЋі”кP|Ж?ЄЇiM uЫcњJЕУкУЮт§ZžУкУЮт§Z›…_ДІа:ƒхБ§%;JmЈ>[вUЈі|nжwъді|nжwъдм(Њ§Ѕ6д-щ+.fЦЕыŒFJ,9(Nџ‡џ~ЌяАууvАѓИПVЇАууvАѓИПVЏ^l№сЩ†5YOЏcO—ѕE\iї_ДІа:ƒхБ§%;JmЈ>[вUЈі|nжwъді|nжwъефмZŠЏкShAђиў’Ѕ6д-щ*д{>7k;‹ѕj{>7k;‹ѕjnU~в›@ъ–Чє”э)Д љlIVЃиqёЛXyм_ЋSиqёЛXyм_ЋSpЂЋі”кP|Ж?ЄЇiM uЫcњJЕУкУЮт§ZžУкУЮт§Z›…_ДІа:ƒхБ§%;JmЈ>[вUЈі|nжwъді|nжwъдм(њкOД[ЯФќт•ЋежsiаЗќня.U‘ќтыNrx?емmЮxч<У›ЅS=ЛОЬTЎD—[e†˜CŽ8т‚R„†С*$№9Јъum Ц[ЅЩhZ”v3_D•юАPP! 9JHТЈЌoЕЎС‰"_ ќžЧŠ—yшпuЭжСнBzTq€:MsіЏЋUеюo^І­˜ЎЈйцr1е вЗPŒЙ••-`вTЪ'щБю0л• ЮQ•фRRA…%I8)P ‚’@ жЇPлnвTФмZТ ˆ+aЦвђ­Ѕ) :Ž)яTžљ<{с˜[mLfсn/^‘kŽэСOВѓ/ИтхИ ЖR’ЇJе Ш”n€1Zшбю‚бЇƒцЭЪЫhEНвcКв,Н!%DUцWЪ)ВЁЩ…qя“• :-лPлm2RФчмBЪ‹(aЧЪ -е%$4Ž я–Ržѕ\{гK}ђйrИЮoœФЉPwD”2НўDЈ­!*#€V[VSЮ1Ф Œѓd#PС—&тН"ьќ ЫLЂ'/\ЦфЫR›Z”к”дmчR”пи–;ює”Э‹9ZЋQ;6ЗmŽљяЪ‡%œ”(do žѕXоЄч@“ж­]euЗ–™n6ŽQ \wR$$Ј$)‚SіpTЄ[оЩZЮњsчЄ"jН—ьŽWdonr?ё-НЛілпiŒWŸ{ђtТлГЁsуђmъUк­vѕА#=(]ЙaјЋd0y1йŸ UСOч’Пп`tXWЛ|Лsѓ‘#’{—2PІЦшо<Ђ\ R;впоyˆ5„[h1–щrZ…ЅŒфб%EAE;ЌBЮR’0…Ÿъ+Hіљг4–З†бЙЭ“yD•ТvtnЧqёиlГпЦвйп ))$'xdeTžу“5Є]JФ™ДХ\d:Ѕ@}х,ЯJЗY(Ј%‘”ЄŽјџЪЌ(Зuu•ІйZЅИPт9EЉнPސЂ’ЇШOиRV sw ŠЦкх6=Жн*|з9(БZ[я/tЋu J8N<еЪožЭЋU2Л|ђц ЗЩbоХo-ЩSм@sь9L–Oйw1Мs‚•cЃ]ћPiлфЙy,­Їс:#a+RЗ V–дМ ЈSœю… * ‹=т5л–ьVЇЗЩc{В П9Ю7yT'{›Ž3Žчч#QZcЩИЧrkeћz\–а дп*Hm8’Е€•ЇОNtКEюJы1шй]C(ы‹r”р“іe;ХёЪ%‰gсмпЅвQo– G~›{ЕЖщ~gdЩ€ы’ Юђђ З›IPBРTДЖлIЁ &j‹;6)w‰3;L‰ ’вй['нSkaD)$$ŒЋy8xgu\oSY/—m%0ЂЙp‚ђфШ&xr4ЙЪлmЅЉ€ж JУ-ю7•2ТСЮTЎПМЈЭ*Jmђ€\Ck+JUŽ (€HЯN|€ѕЅ)P)JJR€R” Ѕ()JJR€R” Ѕ()JJR€R” Ѕ()JJR€R” Ѕ()JJR€R” Ѕ()JJR€R” Ѕ()JJR€R” {B\‚”8Є)іB’ЁG*ŽГыёї#„1ўъ*PДлКО'‘OбOZmн_ШЇшЌъRСƒыMЛЋтy§ѕІнеё<Š~ŠЮЅ,>ДлКО'‘OбOZmн_ШЇшЌъRСƒыMЛЋтy§ѕІнеё<Š~ŠЮЅ,>ДлКО'‘OбOZmн_ШЇшЌъRСƒыMЛЋтy§ѕІнеё<Š~ŠЮЅ,>ДлКО'‘OбOZmн_ШЇшЌъRСƒыMЛЋтy§ѕІнеё<Š~ŠЮЅ,>ДлКО'‘OбOZmн_ШЇшЌъRСк$v#lЮцˆЬЖЪp”Ж‘ŸБёсJѕкoокх§з?ўКUтUй[iЗИё-кeю”ЄЉФ‚@dŽŽnjёэЫЊdљT§ЅNд,vхƒе2|Њ~Švхƒе2|Њ~ŠR›PЖ;rСъ™>U?E;rСъ™>U?E)MЈ[Й`ѕLŸ*ŸЂЙ`ѕLŸ*ŸЂ”Ід-ŽмАzІO•OбNмАzІO•OбJSjЧnX=S'ЪЇшЇnX=S'ЪЇшЅ)Е cЗ,Љ“хSєSЗ,Љ“хSєR”к…Бл–TЩђЉњ)л–TЩђЉњ)JmBиэЫЊdљT§эЫЊdљT§Ѕ6Ёlvхƒе2|Њ~Švхƒе2|Њ~ŠR›PЖ;rСъ™>U?E;rСъ™>U?E)MЈ[Й`ѕLŸ*ŸЂЙ`ѕLŸ*ŸЂ”Ід-ŽмАzІO•OбNмАzІO•OбJSjЧnX=S'ЪЇшЇnX=S'ЪЇшЅ)Е cЗ,Љ“хSєSЗ,Љ“хSєR”к…Бл–TЩђЉњ)л–TЩђЉњ)JmBиэЫЊdљT§эЫЊdљT§Ѕ6Ёlvхƒе2|Њ~Švхƒе2|Њ~ŠR›PЖ;rСъ™>U?E;rСъ™>U?E)MЈ[Й`ѕLŸ*ŸЂЙ`ѕLŸ*ŸЂ”Ід-ŽмАzІO•OбNмАzІO•OбJSjЧnX=S'ЪЇшЇnX=S'ЪЇшЅ)Е cЗ,Љ“хSєSЗ,Љ“хSєR”к…Бл–TЩђЉњ)л–TЩђЉњ)JmBиэЫЊdљT§эЫЊdљT§Ѕ6Ёlvхƒе2|Њ~Švхƒе2|Њ~ŠR›PЖ;rСъ™>U?E;rСъ™>U?E)MЈ[Й`ѕLŸ*ŸЂЙ`ѕLŸ*ŸЂ”Ід-ŽмАzІO•OбNмАzІO•OбJSjЧnX=S'ЪЇшЇnX=S'ЪЇшЅ)Е cЗ,Љ“хSєSЗ,Љ“хSєR”к…Бл–TЩђЉњ)л–TЩђЉњ)JmBиэЫЊdљT§эЫЊdљT§Ѕ6Ёlvхƒе2|Њ~Švхƒе2|Њ~ŠR›PЖ;rСъ™>U?E;rСъ™>U?E)MЈ[Й`ѕLŸ*ŸЂЙ`ѕLŸ*ŸЂ”Ід-ŽмАzІO•Oб_ЃlА2 Г<М@ZЁ‘ФŽ~4Ѕ6ЁlїэсЉењ- ;xEъu~‹_УJRБлТ/SЋєZўv№‹дъ§П†”Ѕ!cЗ„^ЇWшЕќ4эсЉењ- )JBЧoНNЏбkјiлТ/SЋєZўR”…Žоz_Ђз№гЗ„^ЇWшЕќ4Ѕ) М"ѕ:ПEЏсЇoНNЏбkјiJR;xEъu~‹_УNоz_Ђз№в”Є,v№‹дъ§П†М"ѕ:ПEЏсЅ)HXэсЉењ- ;xEъu~‹_УJRГQЋvБџЇІ[=nu’ђ RЁИIЧJRІЈƒџйmricron-0.20120505.1~dfsg.1.orig/html/images/lieber.gif0000664000175000017500000002007310513222764022016 0ustar michaelmichaelGIF89aƒ{ї ‡E Ќ6eЇžћ§ћљ …[ЄБ]њ[Z]\ќ[­[ ќ[`_`ІІћ,ƒ{џ HА Сƒ*\ШАЁУ‡#JœHБЂХ‹3jмШБЃЧ CŠIВЄЩ“(SЊ\ЩВЅЫ—0cЪœIГІЭ›$ шЄЈѓСž8ƒ JД(€ЃG}&р€ ЄL>EкДЈеЋXГ†\јчярQNџeъ`ЊШИЋ“–к˜8пьzл‡ŸOŸ$Uдч™0?зрXБ:qEV\ЦWпr4fG4^eъ1†”\ h`‚f‘XЃ5ш˜‡†(тOHљ'_` ŽЈЂ†bP~žИтŒѕЕј"Œ‚ЅHуŽпй—ŒщШуљјуcBЉф_Fу’PжЄ“9х•W!uЃeVК•$–`5aC_ЖUf˜hЪt™]šйfšpЖД&›HОч'ЭIч“xіЙ’ž{Vщч yuCgЎ•(ЁŒ^ЈC‹f)jвUjЉJФ!E“f‰i|—†њ\ІmЪщЇXuЊЊЊJjBSFџф*QЊЮZŸ­ЏЇЅEИŠЩъЊJіškЌ {S­П"hlІФ›,­П.ћ™Д„6ыlQл™Ж}Z{-ŸкY‰[ІчЂJуТJaИЙ:{ЎFмЦ„ьBщtЈЙыšДB —эГЏŽЙQМ0ЭЋPН}•/L Ы pІ:њАЏџв{]s=х€\ k\œЦrѕЛŸ‹хмUцњ[@К-vеЏЁы'ШOuE0šKŒэC‰"<zh•ДЁ“U^ЭŽЛ ЦфљЋqбуєгF }2бнЕЫІwньвМ„-v]>“esey‰ѕѓйьЭž\HЏмTУfЫНВ|Qћ‹Wch]џЈѕR0фЕœб6ЦРсˆ3 РaЈŸN5г-7Z:™,y͘7y€škn(… S^ЙуыeЮ™ўgс$ŽјтvЄАдGзЭ8эyS˜ЙTž]rьB :yОлžѕп\r яФ8œPйГЋŒЏh’OЯ8яиПчдмG>єТеЋ>ф‚#‰Ÿ’ѓAž…ћЙ]7ћsЋМћѕ}{ЕБнqGЗПэ‡Я<œІЪЯЮиu0е<`xP‰_ЖРЫЁэ‡IЭѕVuŸMЕfўCžЎЬg>” я ОЋнЪЖwПУ<@„М+сгКІ…эcœ Qx4нцaђG:XЈŠ‰‡"всџqX“вˆ,к•Ihж§ˆPbG˜X>'‰Š’тЁ8#Ю‹єбт(q>J<еdE3ЎqGЈЋ"%Ў{IІ\MЬUхЎ2‚аŽ'йъ8–œQpmќ#УЄзCˆвo,X" R6ћ}юv—ŒйКZ–2єМ ,#+!ЭЩЋHŠh%9ЄGМИ=ЭCKѓPаЪBМЁНВ+T“каШ3ФFЁ2•Іќы*GLьй BшЩпњЊв0юoё“ЫомзKB§˜s\Hƒ РЭn ќI€’‰Ь-l.ЁМ›Ьжf4b’n•СLP%™M…lг›мgььEџrтЋz dJYЦsЕЋ…0š№д<щйG:ZŒ’ќѓчк$зМp/fќ‰ЮЉГnЅQ^ё„ЄŸwΘlŸ Ѕ~"ъ9ŽНsUн3оРB:16RP<—/( z!АD\SjЈР ’Вk4MoŠЂI3„S.1!Ъmc1МЊю27CDоiЉL +UЄJЗ€5ЌArъŠЪЪ–ГЂѕ-c[•ЁЬuy#ucšFБ†j3Љp,dЎ)Ьz.X‚‘ђhrздЉ•Ќ‰mъbYlц”^Ћ лЛ™‘ёv!ћ:ь•>‹’Б)ЅБHЭ+‰'B@Vr"O+^ъ8ŠЃ%џ‘6Ў;N HRи"ЏН@MЅлт6qКmЊj)yЈ~)…|Зй з9ЪU2Ћ1фЄЙJGдоdЁ59œТV[Б>6œКТeгвB4YжђjМф'1)AЦжiMSopЅ$№†Wq74ь‘цZЯжU‹ KйAjђ35 Nз z7™rЉПЕЩФ`ПкГ1БˆА€Bѕ}\йъ? 4:sІЯEcГ‹Œ ЗЬœхЈ~л‘[K{8тŽЄr Э96пГkФ".ё>гkЩРљдqЕА1УђŸ~vnЃ’v…Вaј8$ž}ёšxъ!е0шМKž^Ш<іdЫџЧСŠOњхђ*э8R6ђŒvœыžЃkVп3пћЭШ9vшС•вв\™№Ыsšё•ЛŸQи,У§ѓˆјмgkz‡ ’і„cв7Хuвu3№Tеsрѓцн$9C 0јќУуW,McњŽd'eљ‡"˜ŸDцŠлИд`ѓoŠќъзЙB~^Ÿ{Н€… ЭуM"Оj=тzЭгљeкЖЗ}Ш€мс>ф|^ж!\я:ЯѕЎDЇGvрCˆп!ў#Q~9\vћишЮјB'РфNљЪ[žђUЧЙц7Џљy#$я\Я;CУuјвѓ&(]ІљсРљжЛўѕАНь @[u7$є{ч;5“дЋžѕГО№Н™€ШŸРпК§оAŸћбѓО%]VќЙy|ЧЇИњия"ЋpпѓцП„рJЗџрЙЉ)ГsFU^чОіŸџё‡…ќЙіљ“ѕuxпљьW д’ј;Dўѓ'`љGWvїцчр—|иiМfШИ-П’~x„г€+Q€˜unˆw˜~ыЇ˜ј<ї"zЭ3q Ш‘‚Ћ5Y!Ј|аb‚'ˆ4ј`ПEс‚Чƒ(ƒбƒьaƒ@„HY:ˆFXHЈN?Ј€є7‚M8HOhQˆ„kw+л‡…B˜[Hб7~пTƒU8-a˜ƒe8юїўЗAkШ†Lш†oq(;sШ@uh‡"ˆ‡yј{X}8‚~YИ{ƒ…џ˜sˆˆ‰†bX‚ш8ў'‰“Ш„•Шˆ—и™ш№Ч‰шaЁxЃHфgŠЇˆƒіF„ьЗŠмDPpд†Б˜ŠЂ˜mяg (WИhWВј|ћ‡§ч‹ 8pИˆ Ѕ‹б…мЄ„­B‰Xh‰ЮˆаhЈ,д8‚жxa„0…%€рј2јфŒцxŽ СSБŽЇDDЬшAУШ{И ђHnЫX шށpфГЪш‰ојљf*™!-И|щ„ žж"3˜†LˆКЗ‘ј7‘q†кХŠДg[ИШ|щ‘ ‘n[&’ЇŒъзŒ( ]–k,I’whџљ1™’‡c~5™‘y'Й“ќв“Єє“.w“z7†dH”<ЩG…”зŽNYp8x$•iЗ[U™> Р‹rh-Йb(”:й•vё•^††cЙueI‚g‰–ъЄ–Ав‡[Љ\r)cњ”x™—Tи:žv щє8”D ]|й–"ш0)—ǘ6й˜—;9O’щ—d™“L)Rhi‘‘™I ‹&i™ymЂ9•A™{Љ x%ђ—šwə퇓ˆ (›ЗЈ”/й‘ €Л††}9šЄiЗ ŽH‹b٘АИ”ѕh—љ‹3–|Иœ“Щ•)гЙ–НX\ї8F(9Дџuqˆs—sЬi^сЙ‚лYžе‰žзљ—љ…‘z–VчT9ˆєYŸдiˆжЉŸЈ˜Š§9КIœъщŽj ƒ 9ZпYMрИ  њ€ј  ѕїœа‰œьyЊš”™“І™‡ўU”  У™žД‰{YxBхGіЃBWUC/DЃggЂкiЪ&i›@ZvПЈ”"0DJxeшŠўЩaщЃ%ЩšM8MoЖ`)Чd2ѕšЂЄKZ—šЁ;GЂcјkљтiгфѕo ІtIКЃ(ЪЅNz“Ѕљf gюіJlXŠ ZJХhžvŸ_Њ{LЩo(—ŸsRxЁ4ВЇЁџ™ЂˆЁ^њЅ•)Ї…JЇц2tvaЉЧ_:j!Ђ"j‹HЈhZЅ—šЈ(žсшЈЙЂ,Њp…1ІTeІrJІЇЈ*BЁ ЊГ9Eh$StЦЉtЌУЊІ ЈЋ œНшЊ€КsнЗˆ 8Yе^эС!Bg­њ6€ЪКЌџ ‰]ЉДщœЃЪWРсt€Вvyњнъ­LZ8у’$ъ›љзЎюъІoЊ‘‚ЪЁ–e‚іzЏl™ЏХY›%Š<џЊМкЋ ё’­ЉF&xЂ‘АЛЙšћ˜љšЯШЊGЉтъ–ЪЏ§Ъ~ŒњŽ+…ћЊлsE„ЋaФІiЁъЌЯXыВџq†НX{Ёš М7В1uю)XїЇВF{ДH›ДF›Ѓ8љ– лЁфГс{4Ў7"€dZЋЕLKЎeyœŒ"ЕuЊЧkЧˆO2K АЕlKb]ЋыњЊšQиЊ4bJvwи™+‹uЛБi‹!xы0В|Є5}{8ЫЅ:›E!жИлz_[А~’ИŠћ­№Кg!Ц€›щ˜K*–{}ЪD›!kœы–@њДP КБ%kЗ32И„KБAJЏ•ћКСЌ\И BЛž'Й`jИфКвЃЎ‹КЙЉЛАPzЛпЧВ‚БЊˆЙКМЈлМŸїМНЬЂЛЋџ ГъЛМС+МM[ŸыQžъkВф{ цЋЗЭ —” &b[S—q ‡X7Д'ћJ;РI;ПМЕНЉ"НfeГ AЕ3|Бз#m;СйЋНЫКоы'љыРЎСАПoAСm›ЗЕыМа;„ЬР uxtŒ ЇћТЉхБN ЖQЄТ(*ОЄРŽыЖK„)N‹С!‹ ћ‹qA|џ›ФIмПJ ŸAРPХR<ХT\ХV|К<ФЊ›‹ТС‰уСУЦ­'d"\Цf|ЦhœЦl+УŽЅ”}• ^Œ8™'ЦtŒsЎšЕjœЧzМЧgLТZLГ]lНSКaРЄЗŠ– Ѓџ{Ё2KШ…ьУZƒШ-— F(’ЮъШьЧ„ДŸœQЩŠЩТХМ#ЩK‡!žЎ ЪYм.ЄŒvb„ЧјfЧKЇЋA­L%b„HН*aШ‡ќ0і{ПЁЫšПсЫŽ4f)ЬЬЊ–Pl\ШьKЯ"zBœGpŒ•нY!бœЂ<ЪvrтlУœ‘‰,iЬЧМ—(ъЫ‘з|И’‰љ„Ю1Эд,ЉPЬИћђэKіЬ(“ЂОњМЯŸбЯШиЭ'аждТШяЊ‰ xЌаpт*ЭЬёˆ"9Ы*ЁЮы 0СЙЬЊЧИ§ЭрЌ|жќЮи\в0;ŽЅ;Еџвјь‚эLвЏœЂъШУ3Са =Ўаыв[ЁР\и ёшг2дƒТЮAМ­[љІJLэ'ьм|D§VссgYе0qе}В(Ыќ‚І `D}CQбЯ)#-‘ё,^ Љ•ƒЁв+= }8!9г2в6зžбeцЪз1сзЖlдqЫ!ивS˜,!жcиЇ’ЭP™/ŽН'Š­mсAjЙ%—нЫ|иœ<Н@—уK™}'›Йѓ'џљЬCБкqвкHSСt]†Mк€§ Ђл„Э0v}з{лф#мсZзЋŒ<ЖЌР8ЫCQгm-йём`Wк)џAлЕн,0зн`§р}бт]ТœsМ+ЛB‘о{•TVѕПЃl$dЃаЭ$ЖіˆођЏ"СSчtЄdVЄэЋнВ|…(’}lЭ~ІУЯЌu6~5Ѕ\$|EЕV;м-d88СВšЉ№"QЁЗнVfчсэФМ-тљGт WЈ,NNЖитZqm,|ІрТЁe1ќрšOЄ —ЪOн1hвЃрБщЈџНаЃ]уH~уЅZСšт™КпY‘›R~о.рс§XЎф›Zт$ТуVœк  F^о€6Ћ їuѕp^ю)8жр nmХ}нчёЋkўoТ‘"џcлs+КџIнBaнtRг JЅn>[Пƒ­ Оо Q ц Тc^хVўcцz" rZЊA_†r#›Н ŸЎкЂ.сœNПkБ ‹+бqюЭыG^к6AЁ~Ом3омЃўлAЁЋ‹фощО>ЪњъГыВўь1б­впд.шЦЮлЏЛqX РМ~SќИOЈрq‹Б—Ksg‹OФ]Ц[ˆюГЮЭKs  y fЌЩ#>я~$’ШТсТ5Ур(яmОЃяНУљndnмђIбlšьŽNг~‰ПжCЖ‡3Чœз№ХiЬяЁ˜ё-Бq„ЩMў›§лПА7pХ2џoД| &ПT ЦВW|t'ђ|\Ц €}C~№ўžШ8пСТW| сѓ??Т€i{Пƒ№A}џєДžVј6˜vчШWѕџШ,‘oљ„Щ_і“ѕЧЅ ОџwёhяUнNˆМиі( +pїрyм&с~}ї бьz_джЎd_‹qіƒѕ<Ћ~&лЁј‹якp ƒСљSŽ’?љ{žР,Ё’GБьoOьœ/Ёj_3‰ЂпН]њ{њ$uЊПњ !јЎ?S… \‘љVПэЗпQ|O€ЛОo›яњ7\p2Ч_Щ_њЫoWЩlOћ •їСŸиEџŸі&сАЭЏЖП§3<ќ ё‡ђ §вп§^OёйИОmцnўЏпјrс?уŸБ @€ D˜PсB† >„QтDŠ-^|FŽjєбЦ ((HР€!\рRцLš5mоДчN†:yŽр@Iƒ* д$0чRІM6ѕљtgд›4:(`eС•-iТ”VьXВ Љ–uy–Іе’&MXз+ЧuыЦD›Wяо™jљцмˆг*nM&ˆЛвЃ@Лuџ>†ЙЁ_Щ){мVСƒFэ&hв•MŸц{ЕBе8@4Ѕџb—I ЎЦ{lkнxW|M@ЋСЎ2СіFžќцямЬ%`ђСljДЎ\ћіŽЮW{<ыIт,РЫ]§њˆрOЛg8ИАa‰ЭOdмиnzі§§„ЏВr љL >ћ&" ?§ћ/ТџŒЬНшР> ћ,?дoвF MBйЃ2 мpУь@„Лg<1ХЧмгЊ+јŒФѓ1Hi$RBџяBИVКЊ!лј+2J) :2ЕР&КаЈ&‚pJ/ЃЌr/№†b1‚rˆБ/з,2LНРЫq%Ќ:ŽM;МХEЁlДвомЬЫЛHчbHMK?ESДœЛPСьИ\TUqЕ,ц„3)Ў‡К\ЕV хю7ц3ѕЯлlЖB\Зу€Ж2””Ё:ƒeVЬaЕуЭЗd]hkim6[WŸUЎЕи0Œыд—гЖмQЙMЮ/ж-wW`kч7DsяЋUВдКйИˆёW|–Jпнp–У)%Иaž Ю—а~WЪЮS‡/онриIŽХ-€€й}#”L? Xc—2ј5N.Ј ВйЇœїШoЫ§ЎМpтQDХ_ЊёЛIчiАЮ$poЬНыи/я\#§тwGнwчНwп>xс‡'ОxуG>yх—gОљцг{rРgз|њЎ5B<€œчО{яП?|ёЧ'џxш'yѓРЇW?sаи^HљчЇП~ћхъ~§їч~ жю_XПџ а€$QэVЪ•diУ чјFЛ *dЪЙ`r2ˆœџ іІƒ4 ЧB˜’9 †c3kZPђ—Тz-k/ќ’xdGТЋœJd5,JaИCіа‡?b…8D"бˆGД‰Э\Ї—Ђа‚;:[)'3дeŠ ‘тЉxЗDž<Рf4K!хzAо•Х‹;cхњТr‘,&4нзŒ6B”™ŒŽ‘TиHЧƒ< †:ё#?X?M-љЃЃ 6’!eЬd™ŽYˆЦЊ(NВ)œ]/‡IZ.,S$&б„ЩАˆr‰ $аœ<љF((–< )WЙ/ыСЎuI ЬнИYКЎ}~YЕVЫVЮuќ›w bv 4А4M/SгLi"џЄcVЩ™0‘Н[ТngаєHћЌ(=єSwкœJ3Ч97nО‰šэtfгЮ†LШС“zыгт2јNr†mpѓЇLФљDіTгыДЅ1­˜ЦYVХžE(S JAMњF˜ ]ЪD#zК~4ЁХд$зЬЂЯ™ДЂЄiFљйЭšЁ ЃSчGOgCц…žc+ˆiš‘хАЃKбЉA‚*GЂк Ѕ;Й)ЁjъBOњ’Є7Ij|*Ѓ…ŒžyСfзN ЕЂ-!…єчSPие–MŒЬщKЗiж­ZчŒJп•Ўњ”ЌЪSЊ§Ё":ѕЈЛГ Ўh ЃюЎиЇќе‰мYиЛзХЦnwџ4Хх9Ы’иŠRtnƒ$KgŒ*Ўвф4HBэЌXB[€ЮєqД!;-]7ыО“1ЕcэѕŠDкжжЖЗХmnuЛ[оіжЗПnp…@Р%ХНrЂм0w'Юю” ‹‘щFЄК ЙЎEВ;“эF—Yнex ^ыw)фѕюЊа‹ёЎз!юMЎyг›фЗКі•oAъk_§ђЗПйяtёымэ8ПЪ №‹_ьИ!аe0€ѓ+сƒD˜ТѓЅЏl` ;˜Уу•Џ†C,т 7XУ&q? т/„Й)ОЏyS b gxФ#Ў№;ŒbЋјП9.1{'ќbyЧ>Іџ1]ŒуC˜Щ?NrЩтd(ѓXЩ?6ђ•фї2™ЪQЎВУ[ф-ƒ9Щ&Г”Ї<ф4+™Р †ђ—sь_3+ФСXfs˜бLч2‹8ЫQіs›е–/ЃЙЪoŽsžU|ч:w˜бVДœgмg?7љЦ-†я щ ŸЮVжs‘џ|] gЙаœў3Ѕ—ЛрO/Yгb9ЕЊƒ i.гњЪЄVДЇХlf[sйЭо2ЂЧќjBчZи`vЊu}фF#лдЃцєœ‡}h'wњЭ‚&6S$нbgџКжЂ^1ЎЙ щpЃzХef1Ѓ™эшR;л8‘ѓЂwMэDЯћЮН6Б­ima^_лпцs… ЧЬчLПЛ\7xТЫЋp†зс ‡јМ#>qŠWмт ;mricron-0.20120505.1~dfsg.1.orig/html/images/lesionsum.jpg0000664000175000017500000005552510506733766022632 0ustar michaelmichaelџиџрJFIFџлC    $.' ",#(7),01444'9=82<.342џлC  2!!22222222222222222222222222222222222222222222222222џРй‹"џФџФE!1AQa"q2‘ЁС#BRБб3с№$Cbr‚4c’ВёЂТTђџФџФ7 !1AQaq‘ЁБб2С№"#сёB$Rbr‚џк ?чњ•*QЉRЅJ•*Тйevt"+@œo<'ќў”E_[PэГn )‰ЧqдЄp>g Ї.’№*\Т‡юI,ЗС&BHќд§Hs5П Д0›ДЖЅШ@јX-Yƒiр}"DZќ7Н\ёБ“­6ЇH?AЮ‹­ўоЄ€]eєћИД7љrjъууќЧRЈš_OГЧ$( {эHќiy|ёCZ\н-ЩП8”uй„Є˜ўєDЦG€+mOЊ*нNKPЧрšС7РРФUHmQl хЉŠШМІ”‘nNм^)Л^Їњђъ•ŸФжEID|W™ћЩРJTCDL/џ]dЧ"4щmC)!іеŸ–qšМxYЈ-.0Мъ6QŸ‘фЦГк|LжZyHP8[ќЌ‚=ЗФSеџˆ ьВЂгэН_ ‘|\Єф~bˆг-ђр/dЈю4{n‘шkZК‘›З†ў?–д–`Щ_ТZZC*§*$$$dЊs€_Ла}Nh‰) ЉŠл;ŽŸљS‘WАt-юqHLp‚OC•+№Їgсf˜Ž#ХeыьЄŽ<†Шo>™8N>AT5tџФѓj™БYэіІ ЪIG˜М~IќЈŠъemЬ9xPШ"*БXн№“P4НŠ/ђ§‘gњV9О-kЋоюЅu€Ÿрa)kџŠFзkФgцІ7Њх:ыu.,ЏѕJ† cŸсОЁЗŒНhњ­­ГљŠ™eИСцDGŸц#ђІuЏЧЭkRкЗм[ЮіЖ+џащWэјБЂuT†bъ+–~rЉL+q ї)H8њ"AдЎ…ЙјeІ5UЙW 1w?Œ†ТвЛwіPЇдО^4ыФ9еЇСA хпщDBU+щ$‚#Ј5ђˆЅJ•(ŠTЏm2ыюйmKYш2h’еЂ.WP’…$ЋЃmЇzЯаtЂ!Š”ъВxq”Є-ш%ЖЮrЙnm#ўСЭG№^Щkˆ—.Vc`|JCHBAџЉGš"ц-gјЯЕ|)RzЄ˜ЎŠ›eа\[g\FBvф<…ўIђлЇД ЬЉ зQ–чd—ў`fˆЙжЅtЌПDЦќи“­вZPЫjuЏМ?ъMъ?nVАЗ лm#%јЧЯkЄ}сѕЂ%EJГŸb›”‡™ёф˜ъ>ЕYDRЅJ”E*TЉDRЅJ”E*TЉDRЅJ)акJ^ЉН4Ы,)ЦвЁћћІˆЏ|;№ЖсЋп]G• $Ѕ№>ОП*w*f№ъиUХSэЇKЫGdї?$™Њ-oт$-lkOYиKЮВŽїTч}оЃ=}ztЄыЄ›ХФм&ИЉГнVѕp„ŽУіЂ#эaтхџPАБmyш–№­Њtоѓз#ќЭСЖKОJђэЌ9*BџХ’№јAѕчЅ\шэцЊ–ь™N„Вк№R‘С>‚ž–--0Фf‚žЩOН)cјJшŒ—eL.9ŽR“„Šг™ S •НфГ„w+Q§kЄ X Œ­/Ї ‘РЊЛжˆaиlмтAЩAzˆЙЊEžLfZrTfLbp6 г5ЕЄєФЩђ• (C –їЙЯ=)‘zЖ6‰бЃ`ЪA”#ЁЕьфІ–ЎQфцˆˆп№В#ЖфЉѕКЇБЫ„w йўоэъZэЎ rUзщ]c§ Lp™ їЏ­[ЃШos~[ьЏюИк‚эСіЦзKo\ƒ&йqŽњЫбн%YQ}xЂ­т}ѓKIm*—!ј|6ШРф­9ЕEВЧ 2Ъёр`|CыI놕jZљR[tчi@ЦюxЯО+,TђЬ ЄйeŽ$А^Щ§TшџрЁЇЬАPIJ$0@юžОМЇ њRЏФ/:ЏV‰V7‚‘ацОŽ)TЖgиn-<ЫЫaце–Є4Ђ0GЁ t…О&›ьGb_\@}ББќЄlu'јёиѕЯb9љт ƒbБlŠцітОьŸГЁЅЉьэйŽsM]с#ЗRЋеци„Ч.8чјiяŽz‘јQі бЖ]!ЊSЉeAvUќ‡[ŽFZWT’?‰#‘€FAю@U­ќQ›Ћ$}ЈV+,oƒxЕёХлФШ:v+№ДЉ/y?Лzєњ2€хуŸщэIЋхіяЈю*~хq‘pw<)Тp?щO@>UЛі+œШ\E~=А+>[i8>чћš,с•йзc/k ХXA Ъ€§M[, ”*2 _pžHќ(­ ЅьIu_ўn?!§щ„ЮœsKЎ#…П=MкЌj”Ё>iђтЁ9Стˆ‘гt‹іВћЖшђйIј–’>bЖ!iфъЗ%IЃGejУnьчпS?Qп­ CсА€кAHю1Tо6ё…”–TIHџ”š"^^|4ru=№А‘аœgёўє<ю—М4ЮфЖO]„‚iЯЋуIbц˜ъ$6IРѕХPЌ„Ј6NІІш0ЖTCж<‘}?єкМYєїŠњmWk MЗrJ7Л ў^љяјжКРЙЊˆ4ў•—z}ŸФДъЖЖœ­гш‘њеEП"§іGZ/ЙцљlЦ q_ѓz$w>еа4я„hнЎЫKїGЕ!yХcќ6‡№Єw?SиQN•№†пkЗ}ВјДEi#zк j}VГZЗ4^’qШњNнћNqš,ћ*њ}hѓЋnѕЩ2ѕTї­ЖfFшжшр1]ГžМw?LPCwхБf„”p•-;м4Do{ё'Ф щ?iК ,5ьŒŸ,Єеїџ:^Oэe\ЄLXуzЩ$§Tjі.Žд7Ф§ЅФИАЃШ'ŸЮ­эК:W6\у8—:|g?хDBњ{OE8ЦehŒа\‡з№Їш:жНъЬЋСqZ_N2льЋсPњџJ'ИAbг~іGYq[ь3ZіЛtKœ‡мœљYJR9Ю(‹œ“./–ЋЈ‘l”ЎкžSi*xoои—"Ъ8ШЯйжzsќІгaПJЃШFеЇ№#д{QНJ•(ŠTЉRˆЅJ•(‹b 'ЎYˆТJœuA"КžЩdgУНмf6Іы%БНЮ…ѕњўП*[x5bƒmJЕ]ч iЂ*TŸОПѕЭdёKUМмuэt‰sЪ‚yхЖњэЧDtпЋЕЗитІ|Тк9јAј•ѕўдвoУлMЎдпћЉ^с’ЕѕЁІgiшэонi+.Зё#ј“MИŽ4˜э5-€ЖAQ.Ÿm6{уАиAC.'ЬмSZз99BR ыЧZЅМшХИыoЧˆј=Ј†бЇжeљ -ЏЂˆˆƒЛ#—@ “KKЦЏКЪКyvдГ…(œS\bєиOТV’‘эAж§4eфИЌ:ЎЂ [эююьGRˆAчŠH*Ј4ŒHhЕ6њвŸ8Ќ•94yzƒив›Cўd‚rЃќЂƒсни„кSіЉ`СGћVx)хœьЦ.VX`’chХедєЋіjœa*.$8Sœѓзл8њтДэЗgЌГS1•@)XФ“СўЃм кГki \R‰lGTvы>X <žПC‘зщуYлкtRc#Ы@аO№%DёŒ r=БVZLMьsЈуФx…;LоЁ†žaЈ'ЧЛХH˜хотуюЙМ•‰=…kнG”ТR=kUЖжYhуg9ыэ^ю(xyJ|ф)9$ƒSQВЁ‘шЕ#ФщуiІnGнЬiЉь9РW!gБѕЊ Ээ3ЈуЉ§о|ЗбйH'Јљu* t~їсс9чŠаМ[ ХmКаJWхрѕ9яє5сp@гЕМ §ыAЭ’MЇYmчЭ§Ойі=БЃ яlЖЄ‚œa@ŽДОдЖvэђлz кгЇ?‘^ое^ФАГыcњ}П…]Hим]Ÿž‹ ЏБн§ЮЛвРЧžкШИGлМќ[в:ЄїшpB†ШJjЭCrП_хоoЮ„ЪKž[ЪlvOхЯ|цšъзбfOХ&7ћМјчў"GнV=}ўu_ЏДEЉXW—ŸБd~ё+m;”„IBБш~gŽMBЈфКЗйošюjЅ(В„„ёРtЎ­6ФiН@˜з8hi~ь‹yѕЯzoиlЖЫ,GЃnиr~tЈTЉZжлka19-9ъЏJ"*гэ№CS#Щ$`cжЎЏzЫ”нщq)lwЭ[i};Ÿ*у€IоЏnщyЫ|„F?ОXуš"Lk;E–зhuЅмp Ј_rОиЁ‹eЎпkЖЗЯ›)gт8с'ыжГkm/xvhšќЅ- />AуhіЌnE !І„ьHŸP<дЎMDі\ ћЙ­к™#Щxа_ЛšeшvcЯ‰5Е9КQкNvŒЃœмIаm5Џьб^QIšiI*$§в;ŠЌ…%шЈѓuЦн@јV…FF­VЇШrъ™rцИШк3$|ў~ѕП]ƒОIKт#СoTaЯ™нldgЙ ^М;ЙE‡ішэЇx–лGђєў”ђп.yr2IЦWдWG+UАє0пьСЙ#яПMДЋжЖfdH3ЁЖ‡9ZхЕwњT4д5ЗjFиr>Ъ6Z9тnгл’:№ЇХd„щ-\тiРŒћјZЂŸШŸjХт—†Ідє6Г е`€ЃЯ–ЃќЇЕ$•Ѕ{TvИирчвКOТ]uYщЇ4НљaЩmЗхОЏ#З?Ь?O•j-eЬю6ЖœSn$Ѕi8P=AЏ4Хё3FШВ]ф• љŒђЅc‡šўПcщKЊ"•*TЂ)[vИ.\юqЁ4 SЮёZ”з№/OЂсЉнЛIHћ-Не8чњу№4DЩМDEЊ›KВ”„@m/Щк8.ЋЂ~ƒ'ъ)G) jеRР^XЦBOЧ4жU2T™ЏgЭщqC9Цz РЄ;yVГœщ*Й­DuЦу§ш‹І ЫАФі9ndЙŒќ<•mлД§n…Е3{yШoЅлрТ—З‚Мф”ф+9‹ЬћEХq`КЖƒXѓŸш(‰ап’€бјР№+2T’zЅл_E’?™*R–В8Fr~Е{fдQю„„ )'ђЂ"  xЯ5Ѕ9ЂpЄ #чTzЯTЗЄ-mнЄ6ЕЧC%#'“VMAmджЦч[Є!і9Сх'аŽЦˆzђч6ктcЄ/žOzХЕv.:с{тJP2Oв›к›Уh…РщB}IЋ;6‘ЕXс2УTаы[д5І‘ЮpmюхYІq ^щQ?MШДЅŸЖЉ yмЪTЄЄq•cІ{c9чІ*КSЇrжIRГеG’hЗФW[Жпо“:[mЧ,Ёm•ЈЃкЉPQРѕЯ­.џi5r§йN%ЅdЁKojˆ=? ЖсѓЖ`ˆ.ЕЭЗ%S\жг‡8ўЋ_.ѕifˆ]J”А“ŽЄћеМ‹$‹ЄB„ЖЄŒ№НЙСŸыж­tєБДуЏGVHТœєЋ”\PЅуЇaZX†.иfАў—'ЌФž'&=лвvэbИлхIBай?ё€ЁлфxщZ~RIYQЇ<ф7)В—Itадm˜•;Jig$ЉгЙIŽгШбЗ’‘ƒЄMxЕEСєJ[„ЅYЎ–ћЌ0%+%DЗo{ƒŠuYnьЅћfЇŠЅ–СSЬйћЩ>уŸЈЅВАЮЗFK ›tЩ9?§$sGњlП"Œ’І‹‰ї(ŸщUlX7ЕМАX>|еЁГ2f‰n …eqzcФ'эŒЈ*б|lMЃспЗ$ щOR@КЈсV›zх‰†:<оЙЅŠЄ­Z&%в qЧьвђP…”АЂДЋЎ)=xЯгfCRiі^mжH[n6ЌЅi# ‚8 ŠŽ_Vs‚3ј{PяL~бК§А:?‹#њQR”0qєЌЎМœwЂ%FІЛ1 mІTZŽ A%DP3L6”•!ДЄЋ•дžДmЊцЦmrм1<жтЌ'%CхBЕ&{M9Ѕач3…$њ{дЦј#)юПЊ”Тн ^L„КыYе-ЗЗоЎ‘„чЎ9Ћ‹ц—M––‚ЗмSз’€xкЖ:Ѕqд4Ы8g†fЮРцf3їS‘=ŽPr?l—™Ѕ–ЪSРХiЂSaСБDЌv &Зcк.7—ЫcЫaЄŒ•Hќ;ѕЋЦt‚Xd%Ї[ Ц ŠNOПѕЌŽž…œsTќSЅPE-Ёp6ёAoЭѓ\ZR•$‚xWЊЎ6уv„ЖTНЊъ@ЁвˆЏКn|g>дШ*Рј€Ns‘ЊTОЄэKiЙЏNdu1ŒС[X~+t7qЯzВо%iЛгsР9BќЉLЉ_тљџ]Et•—ь‚ШЋSЋ ЗЯHz+ŸШщх'ыўКз9j{aBПhЗ’•ЋkЃuG8ќp fјWq\нcHzх#žBOФ“јч№ЊD‚Sѕ ]эйq ;\ДЦ—n Г> к”’q!XЯУТOЪsЯЧNЮОШ„ѓ‰Я” ОC^uл,Й:  ­JЦ@*O щзŒ+фІЌ;нЗŒTk ђˆ-Œ}ŠкЬcЪ’9Ё Qzœ&Й:Ыm#Ž;бL?фЈПй8ЯЅ.Џг>цњШјЖчвˆƒu5вшшm”`Ѕхm*=MV:]XlЌх}ШЭ_^!7 ;>r”‡Rw(єцЊДЇa#>ѕaшћFлнП/ПТ•УZ dvќНџ…Й aВ Ќ%JJ&Ж"ЄЋ8­ y Q@н‘СЭY%й)ИожD –єVдгeN‚БЉlЈ•T‚їŸЅ`Ž3X$lHк”ѕ5хЭЖEdŽFЪЭЁЁBњТи^C7БЩ-џˆДЃс#Œgдж„k‚Ќ7‹~Є€…&3Њјв‘Зi”чзŒбГъkьЪmХ’žžЃв‚юЬ›uБиЎ….ФИСGFоЁєїЊŽ%C$ы5iр,rЌзгѕR яРZЫЃ^j‰z]Ї[ДšoЬaрP}qитЙUX—eЙ/ Љ ­DЈ`ЖЁех§(ПС§^эžњнБЧHiеnc=ћЇфE4№>ЃЇZц%†z)…Dw№\ŸЈ"]“•ѓ ‘ЫЌ‹dŸ&SNШi@Љ4И ђ3иШќ+r5ід†ЗЊZм~ыЇ5К–]Žуˆ*BŽwеЈуLЫsШS И’sЕi~ю›ЃьЬ|­ЛПЫdл­aсфО>Аі}љYј‰r‹w‚мJ­|яIјr9zœџQєд№šьDYж‡ З%aд ta_˜[ъ}+Ԙв˜AжR?Gм’y~НЈ.п0йAkGЧJŽT$JчвC•ЄQB‰#=ш>ђ‹}‘k’ щ$а{бk˜-эЯНjшRЅмP…) Œ "]j‹Ы“. СS$Жђї8сщ€2­ кжюxц­54S1мZNіOТ:œёZЩkЮmH#‘СЋц€ёП/%7„ьЙnѕікJЃžy[)Rў.ЂВлл-!IWQQб‡T=ъЪъ+yэ§І•ёЖШRœPJqŽjžcы|х.ЄvAЩЏO"EвHb88яœUŒkCэЄaм|kу'8щјзЂcgеЊЌзуЂеFtяїCСo-CjЗzs§kы№ŸКAv6ЬЄpЃшsжкАA€dœКЄџФPHљŒўД;э>ф-м'ŒЄ>ИЌO|u1Й€\(ˆё™Ікъ›~WПч$Г[r-$,eahP<ƒ]cЇ^jѕhvжї-\byˆ'ДѓџЖЙЋW­ЙN"CqджUwЯ^>жœ~моsFYц юr)?єЁx#џmPЊръ't@шЄкv€6Ев‡Ф Z оPљABžIK ŽŽ э?ЅгЗЧ[H:SЉФ Z"GјЃ)OъЯ#vPУ H„ђh—HZ[Л!ё%’ДЁ)Hq}3Œa41qўбјЇ!Ыj•Дуœ%~Ÿ2юRг Ж–!)Qq‚ІЦvќХ м,кюLЧˆљJ$:“žєЂ‹6r!.Ф™!jW+c >ИЁ‹ОЂ‰t€]aэ’YPZFpAkІЕњs(\ИЈD`2‡’0Ђ}§Ј‰•jŒь0†ЄИTTwm';@Џoю“!n“Ч?кЕ КeДЫЎ‚ЅlRIѕЋЗцЖœ}Ј‹XХRщЮдп:НwЫЙлоJ p}ыH'sРыu1#— žДDŽ‹`КнќEvTі џ.нЧЏїЏwm9я#Юo-2№УЇљЛqѓЂ/RДѕЂkі…yIKЫ)ШкЎщє5›УЛ„лН‚$ЛВЫя#%(џAѓЏ –›…є ТНР•g–bМиKЉШф,zƒмѕCюЌ:ћI^дЅJф€xІGˆqО7…ЈЉ•>рх?S•~Й–„И‚ДG'Ž•аАйћD ъ}д…\ŽžрlHWТжЅ4‡гЙJЮw$фф{5„уюDiA#z›лŒАo•р•“ŸРz§*квZ“)*%%Н‰OХž1œ|ЊБв†Ј%aеЙњ…Ьц”‰QњO> еpŸ!е–вž‰ŒзЫSбЂG+%>vт Ч8­Y—Ђ˜n-AТP‚JP2NoZаы•qдЅ)еˆ^bž[В•)DрcхпиW:ЁСфЊУчžWь2,єдо'%/LоО^В–ХУ+žѓŽЊ…ђћ zsЭ-АG–ЪB‡c’ љŽ ѓI§_v;§Йм…Ј/ЭCС ‰c#žAc&œлчЖ–нp—9YZ‰р{іљRЧХЦЭТ ћ–‚QЮGХ’yч<ѓзНI`Uѕ.Рv’†V7ШыЧRrWŠЪxшщйn$Мч}4&ін˜м™ё5MJ@R]B’ЁыЙ=(ЃGВ#ЩеI  л‡т<мЕBжЧвЋ}žjхУƒ{VКXО5ОДl:ЃRZuмvЄЋЬЩІH Я§#вЅдZ)ЛЖ‚Ќ ”|@вУX4вєнС/PQСѕэM5Є-В€HQц”ž"%еиЄEd„КњМДgоЂˆ’/№žЅєqѕ­Yy ыц+­шm!rXФѓУqжZШіЊmQІЎV{ДпДGPl>Ќ(sС9•СWйHк2=ГХлІ1>9FNќaI#‘яAіˆЎмпi ->кV€ЕŽуœzбеВРєЌэNт?›$ењЁ№ьvUœpECкуg^уРшВZ[r4Д;Л‚J:ўРЋІЦїHR…}i„ДаZ“ћРžI=+;ЖЄ)Е%I$sТsЯєЎkг*Ж’ЦsQ40ъ м€тVњТRй[@(q“‘UЦ3ђw1)‚ЙЮ=ЋrCІRŸ‡мњVO|џА_[}Ч”^ ЁJ$6œ =тЃм“оЉДlЃ&ЧЇЅ)ЪЩPЮ9лŠАаnЩkSjи*p§•ЉФ6 2Ѕ8sŒђŽ:qюjжЗ‘УЇсщјVTа@ZБДw=Ћве”ёв‡u+Я&ЮВЩ9JС8єЂ%ŽЛ–ЏіЅЖBw-j{ ёkŠќЧQ†”З\V‘оГOyЇЏё^x$ЈЁi;О”РвЗ2ѓыІRл Ѓ)H”ЂФЛ,EЗ$ЉJўЭhmЩ@гэ2Ќвќ‰iJVД%РЌ№Я#щU/Ж_”˜р‘цЋiЧ\c'ФзБїЧ‡5! двŽ>#‘”§ја-ЕjџiЃ dЅ_ ‡lUš†ЈЭOз@7фВт5„an™КччšНЗYQ"U%Кyш~z{жШ-!ТPв‰р§ЬAїџ\U›ШT„’ž6r~U‰ˆ~bЪ7~uCЊщCH‘ЭњZЎ>DГ>юеЫAЛsrW3Й‚7ЏŽl;~<ж ^’Злф­№УJ'”“ЩOЫ?ыŠ —Х`r}*Н yіжкV[$МF{ŠС„є‚ЊЁХ…й{М-эeюq=91И‘t+т„xывю8та…Дrи#%Yь?#ŸjХрфЏ;JHŒЁў ЅђRAўЕч]i5KГH’мчyДхAхdф08Ц3јеO‚ВО+ДCџІшќС§*RЉhikЖ…Нo˜ѕjл€іK5зБ<ЛМ7ѓG^3Цћn‘bqP!и#П;ЄЋѕ5ЭuдКў?л|2dƒў дСєјіЙjЕвkx ЭжХe$„Є1“§Љ™z}0$]fIV…:ъдF8NOѕ oќ;ЦпЈх>Fv6{tЭZxŸqSJтО’_ђAѕ Y'ђDсš<§R§вRR7ц8 QЯ5бQšЖнрЅ…Ѕ){nzYщ;zFGSщJVъ|з‰еиќ†[УDИ‹ѓЃШ%ЕrQщђ4DЎД'иЎ>ЬU œ­-ёлЈшЊФќ7­QŠ’vв8ў"‹aмункnH {C„r(2ћi‘І.цлRт­Xq  џЂ#6e” 0ЌЖ–ј'ОO5m [n+г5UІи2Ё+~v€ЁD!%ˆa+ШY$žhŠGKIVёƒњVвДrаV5ЇШн…p{UяЏтћнJ"ёUФ+HЪТv€R~uiЂ61І`!(Ш,І†МT”i…ДЅrуЈJGз5s e‰ZbоЖЩј[ WЬphˆк|6nЖgсИTЁ” ЧCаќБ4œЙЦT5Ј% ЩIJКƒм`їЇ<}Й99=h3]i‡^IЛBј“Ні’>яЈcЈю~Їз ДE'Rѓ`tёўVд2Ž­бw*) Ёжм=R6žУЗіќ(˜)= еUќпўœRіжџй$))QHXЯАkM6]РSiQуѕЅпŒжtЛЄ“% 6З#ОцtRSƒž~?\QЪЮіЫ<(ёС№4 т„›‚є„– RHѓJ†HфџL}kюзA›'ќŠš’g5ьŽ`K‰ЬїяВжб‹r~ˆД<sЙ•Ÿ`Ќj&Д2„xЕ9а ЕŸНмЉMЮƒ|.p$Ј|-HY"іЂ5)дx™cУŠ@•љ-!ЅŒмe)8=Р=ЊђЗS0ЈЙї\њU-ж,9(!шш^оFсœоqвг'<’j­ї‚”ЌžфQЛкє†ЄDЇv‰lљe)щЎ>Еc$РЙjK“[}$4NFB’SJn­Ыды p)І˜и€:šп№ЫQ/іТуJpѓaД•тOOЪˆ‹Е5‘yqчAh&*N„чр8СїфђЋ+~Ђѓ#…Ј[V‘ЯљUхЮМZŽž\ЦцџъQз‘ѕЁ§(лijD'й@йУˆR9ШыœќЧчVŠZІMEyмЬЙ(n‘Х6ЁЭЙЗчr$CШ~/šй%*NFEfŠєЉ VєЖUюGJеNд! a#ЫPјR‘жЗ™mMЉJ* Тp*љW1щMC$œ1ЙмYDtrОЂэ\!•§Ќмѓ‘№nРЪŠŽ;j-ЖЦLhЉ !Т~"”œрћЅan?z?YN0„Œэя’~~Еx†HRЗ|D’^*Й;ЎWHХjzИкЫfx-)Ю5ч))VмŸ‹=~”тpS:EеЖ1)poчBN ?~#’RK`)dg%\ UјЖЙжћLx.ЉЗд іžUƒ‘єЯчђцЯбщу†1 8nNzчzчqSTšшчн~Bйљ§б‡NІ_‡vџ9%HlЉ у!.џ…_щ‡Є@ё2љl R/ИЅПr€1лuYљЈЧ…‡w‡ьџЪћ™љn‰ЃHf/‹+ЇЩ\ш[YO'rŠPВ3лсmG'вЌJиŽШVгŽ‚Њч 9ф+КMc—|ђ5{ZŸ15ъq)ŒсP8д0М1хЅнИ{*Я^•WЃ›J‘2KЈIZ–<ЕxOzQИЗ6хЇэЛ1!ВЛ$хИ&ˆЌe:€оRЌЋо‡eK[kЩIЧRj&і‰iЯй$2Ђ?УX MeЈ$8‡-MХšШZœъCЁbЌJъšw X=)ЄШ\аЌзžКЧ–!<Žк zRК%=ёяJk%цхs–U0.Tщю†иF9чга {[tгQ-бсМЂуMrЖЩШq}ЪН}‡J"чЇtnЁОЭzUКг%q ПvтгЩьy­ћМщћьW/Vзй„Е€Ї“Я–{(‘вК?рm=R„$wРWФ!2м•!h>œ‚(ˆNmиiЧвS%­Лˆ•'љ‡­Pj+д{…Ъ-ъаЄљe ŒNA ў…^єЛ7(JeЅљ+GЦЯЂ=;€zF_oЗ[}ЩM–<%Т‡Z#‚ЏажхPІœ=ТуCрО†Ц№Y(ЛNE: ?О+N7'уž l]2уЯ|+<ЏwQž1єЁэ)ЈбuВЦJмДmBё€>xљp}ѓDОDyhђ]Ž(ЧЏL{UoЅдUPЊ;‡ПЊЏрпщЕЇЈ5ПђЋXЙ~ЭIKL(ЕЦеž мn&ъ$Ѕ {!'qгщоЕ/жљсHn 9Ш'сQuывЉЁЧЛЫuMЁ-g”)wmчžеVl-•›yyЎ–)aЊ‹Ќ sFэHiІ”тHIqJOвэБ%Жи|K|=€ќi—mД.tЗ)Аъ:ўёCрѕугщœвчЦ[Ѓfб ТPЗ‚”ц1œРўоЗАэ^ 3Щз<ЩUЊјЉZіЕЏЛЏp­ОўBчrА№­*џa@<;)I?"Дƒ§jёі _,бTтœS(РпдГЙоЋ|0@gEкBЮS„уџW?ЅXШёО)Т‚Jу“‘usX'ь)Ўы3w}Hлl%ЙЋКкnЗЋgšДQЪO_­ пЪфЬC-ф†Ч tЭ*5%КkЗTJH+ F:ѕЃэ+sмІкT Ќ%j ŠЉЛ7)ЙЌ%ЅЇЂ’GЫће§ Њ ”8тw!G€1DFRрЕ5%ФЅIЮpЁ~tБГШJЕИPв журc'сѓм~д‘!ЁЛ-[”лm—O'gŠQщЧWчБё:„дŽ?ЁЉœ:2њZќќ­зNћƒ*“сuќw\RHіл§Ћ˜я‘дхтBљјЖŸџQ]"ћЧ№ъї#cЎЅ$рcŸЧЕs§бФ"тъw€ž1џ(Ќъи›ž yЗ[sА№J#Мм’€p:љаЯŠьЊ З‚Uўч1MрѕШџўjЗСJm1мWю^Amc=SG~4кМјSЫI mšPш@сXњdџнDV-оўBББРфњŠћІЧй™K’—•фЈў'iЇЏњ~;БŽ^Œцх>њOQYєГijХ•ќ%#є4EђюѕЗMB[СДЦzвкџq‘Р§д6!б”=zQўЉВЎђђZхIр`ќш#\0•йŸ‹ў{r=E$eУ–—Ti{Г•цЏ,’г2ЃКЪ’т–— q@рўMctvœ‡іЬ)—€иђн>ЙыЭo\[МHДHCЖјpBJ–МяQРtЌєеЇ”JЭBњгВnЋ#П…ƒЎGБєЋxзоЪъŒ“’ЃїJUŠБNЭсФ(ѓЎˆж k.ЄрЎtDД•…Я\ЙcpОЬ% ч>И<б†ƒ\)m ­оч$€‘ЯњѕЅ–ЁЗўжŒ‚ШC|€QLŸb;hвЭ6Зќз –Ѕ`}вxЦ{§міЎŽбKOORЦв@З7<Ќ|•{ъу‡iпApљљEы€ДЄИUЧ#жДVœ•ЃажрК8…ЄмцБHn<ідД+c‰ф{з:ђ@рщ\UJxЉчэнŸЕ›”кTRиїЁЎП`вrˆscЎс;sЮsњUйKiYчзЂё>њ.ІэqVЅ"8кА;ЌžG^{vъ*§…TАФ_џ}п+Jf­oчхЇ­‘П†Щ0ќ<ЈЂ]t{і­тЂK ZmiЎ5ЕЖмl Еš&вP<Ї­6t†a!ЬZ‡Т”62sѓ8ќimЌЏ2Е~Д-Рм_–јBz%#§ышЯТM.‚ђЏrЩaKєнќDJhЯ”bЃрl­jш;xг–†ьЖ8VЦњ0и >ЊюЧЈ™TИ&žъ^ юŸд}<Ÿ…R[nч6*UНДЃr ЮS“гК+ёЇ"˜†МЇ~ђ–­Мwыв•jQuŠІАЄ6™( qЕ$œœђGЁ$Яж˜wЧŠ-mt(ГwјСцЈ],ЇŽЇŠ]3GтжUЊJ&;иl3ѓЬrW LbQBйy\€H##šЪЕЖщe)*ъЎ1“Ÿ^є9Ї$!PVШpЅц•Е[вp{Ÿ­\6ЂЧ%EI5E™Н\…œ­e4PI$yтs^RъW›Чј‰§)1у+ьЃьТ^ Z№:„№3N‡d6г/” eМ\$ЦDLЉФ$э ,Зƒдб„A!2уЁg`I$фŸnЙЌИTQ@bk•ЪjiOv8‹…™šИЏƒПkh§–[j6FrŸѕ§jНL3!хlV юzW“o’Щ%v:€s\–Ў(л!k]ЂкЃžVЗ6m4Ќ6УHuчАrzRB!2|E/„рFejчБJ6џZaыk“а4ФтДўёждЪAѕ)?аd§(#У8 ЉoАоІЁ2RЃ‚ГњеЇcуЁ;Z=зќ‹}Я’БрЃіор2$+ќЇ6І"7„ ”ŸќЩIQ™ЁЅъ7 K-Ъš'ЈэUз-I%зФjzЈW˜švtї’ЉŽЄ чђhˆнЇZ‘МлЩм“яU&"!КцСЕ*9РьjсдD0пжЋ­ф’ N(ŠЖ\”E†ѓЪ#)OН. HЙC™“ў!V=i–єv_Ieб”,`ŠИiЯВIRс<“žЈ*СЂ$м[Ї–ZЕЭЗ}ЅЦ^Ru/љjЧ\Vэжl 4y Ъ%*xЉэР vШ<чЅlъkCQѕ%.ъWЦд{еTxJTЇVћj+ъ2žеН‡Rіš†АщЉ№ќЩ|sУyа/^JœQuдсЕЃЂОUё кTуqХ[q8R„V”ЦМЇB[nЦ=ЋЂЦw(иц/y.Yиd4ўOт бŽ“šЫ^s(шRAѕуŸ—'ж„”Ау{ |{fЎ­эЈFvB@м‚1Ц#џфVc,%Џа­Jђщhіdвљz&Ё dƒШ8ЌhlJЄЕо^u›ъT?†Ў‹ь„’v*у?/ZЃUбIиикšЊlАК7X­K„Иіц”і|Д ЈЄdѕэHXІэЏœžыi[iSхј‚А~žрœQЇ‰zЈ6в Bs.2ЇШШиу8>чдЯр~“DЙя_ЇЃ§Ъ |ѕdd(Œ”Œ|СWаzж)сbMШсР}љ…tРЈLuв_iўлМѕ№З}rjV™бBд’д7Е‚т Џ„З“ЧSŽHžеНg№цзЇ.Qч6”8ќvж§Єo_ё8A$хGЖNр ЎгiЧФ'ю“—З!-(ƒ‡И5№xHJ•д ‚;г*Z76пcXтЁКОћVyN1Ÿ3ibФЉ’RDЭёпЯBЎжšЧkmИЧ–G9щ@—љPЂЩLpТ–\8G– ‰њ "д­ОЋ фШVQ‚1лš=и№JYZО5’ЌdчПдbЖ5MЭжМшЩuікQcˆ#ПЉэXv!Rв­мЇhщРЦ*Ѓ№Еѕ{ПФzŸТО™Э;LЃ]<я№М5"b™Ъ8W9ШфWИmИ‡м*мшт*э0‹­‡AR'oqыX.q„њPRBœlc=БjрЩ;!hСˆ:iƒd7ї[ЖWŠЎQмA'ЫjЧpœЬ€>ДЫИGS.n;AиRFy#ћ Uкц"з%2UИ€‚€‘дчќЉ‰iЛ5>rXQBОщIу8ієтЈн6У%Њ’B3iїZlд˜‹kШ  ZcШ‰)§ЩѓR‚T0Єc=z"Тqё”Єc>п*РЭв3ˆ%[  ќYNљєЌO\X}cz€HщЦs\zfHїІцІЊёЪzй€% ј•xEЏIЩR PуЃЫo)ЮIъ>Ѓ4Ћ№Юнdн•8ІЧ”жy+uЏї­Џu+W[Ћ0"8•3;ˆЮI8њcџж2Ш№wMЂ И\ч˜–є—JE>FT}і'ž*џ‡RšJ6Bсg}GФюфЫqКХM‹ЮЎ7х љцˆЕKЈбўНo/Э–вдђЧRHјП,ЌўiПіwN(КжЩВд}JJw0‘д'žч’Ђ1œUGекЉльеZэŠ(+у_%Д$Œ‡ RЙ?Т!YАoЎгi>\džЈ­Х(…g=ъЎцЖe2ф_;ЪqCчšждЋœмЛ {T““CЗ+—gn_IруŠ"Ол•oэŠМЇвrO4ТгWxюЖд&ЮT‘Ю:PnЁBgФ‰($8ркЂ‚x$QF•eдЙНq›m’3цЇкˆ­5uц5ВС-­цTк=Tж‘f)ямЈ:G:врЉѓŠw ЁCзЏљ~4ћ%Х)C?Ћ‡GcйˆМя*EŒxЃ;'ъ>‹-БзY}%qЗmЩрŸЕІCŽЧ.Щрћлх§щ{oxG–ъ—,х#‘ŸJ<ДЭjц—l3fтnп­zщ.’™ћ7.ŽDvЎk-†ч)ЄЅЄcму­Z1! 5•ЅIV9)8ХV72ЏЗ^:PіГдŸБЌЎЁ• Hu ђŠГ№уПQьЙХ УфЋœBС™9їq<†kЭв:As' ?=аŠš“і…м[#;К;.ћЙŸгwфњбЇ…1mKS$0т˜ЕЧT—ˆjњ'> b“vhЏ\Џ,'jоV№Ny*є^tЉu­ЃЂXрѓBLЛŠбќJ?Уњ}]й#`Ž?ЅЙЯ_l†ТРЦЅЏŠwЧn3уЎ…Н%JZ†~т8к?зЅ-Ћnчpvщqz[Чтq\х…jWЅ•JЖг—#lМ2щVждvЏхU5(‹ЈѕП§Л№„J Jч[вWЧ' тœ+щ\ФгяТ–‡™qmHiY Iх*ћ№?ZЖД›<Хђ BЙВOшhЦН'Њм~;KйŸМaxс>ЉЯЈ?–=hˆлУћф§CnSЉ]AиЇ;•wЂ™aыR9рw9**Є>†жЏi)ъм•9 т вžЉ?Ь)ћgНBе4U­Е§з1ЧуDWvН\€УlL*QќAщяDm<дІƒЭ8‚8"‚ю–D[Ѓ$uЋ]$ђ 5Ч…ф'<бЄ„ydдP…ўЎЛ!SKЪчЫпFrsДžД7uгБЎ2Ѕ/kˆюyD7NЗ3K>уџО™АЏЬQЪъ>B†aBmшЩqьƒШгОTХb‹:[!kqЅГЪ@zPLT†дћ$pлЪOчŸжЌ ьdЛюД12E=ЧьV6р4Žp{ƒвЊfВЄЯ œ|8 њŽДJATз4…\Г’ ЧдšДSМэXЈќ2яŸdцŒd%Дљ‹<Щ5Нzиm^aVХ'iРэžŸ†ЮА>„$ЅД‚^:UsЫ[™ #6њVЫ€xБоЌ3вБь1<\tw –й О•ƒёž@=jj=FХ’ФЄ<т|чЦЩ9#?ХЯ?•ўжzжЪо/(mO а~]­^/soR–єЇIIVRŽЩ‡гѕ>ІЋ˜œŒЃ"цюдžх\w^6mјїxqQ ™~КДв”Зu|$ЎШWIн#ЃDјS ШхI–7О1‚”уrЧЖ>ак4ЮН ФЦђУ)пЯнЈЯЬЧ 4m}”оВзЖЛeН М•(1 ’”э ю PфїBЙЉЙю{‹œnJБIЙWš_ьК>ЮФ9a_ošП:JRsБjѕ#сH уƒЗ=шнxS[R2œѓK;SыИ]п‘,н!9;г<‚ьo1Gn?Ѕy_|ЄЇЪqЉ §к†8эC0ДќHoH•іУ!в’Ль(Ѕw_ћ2^ItqZm›pМъ)єЕ;€ЬжLцсkVŠw,~пuwkmЈpдЄ<кЗpy&Д/dЩ–жЌ(њqЧ5Мд_3Ь^HкƒгмЇ/љ’TЃїЉЋ,ї ”F [\У_%ЏpKqŠ@R€ўy5qІЪKZЯФяDDZ…‰Hio•АрŽЃ№Ѕ§Гіьш2 Є6ЗuM—sдѕЭ4бfj-qQ'kkћЋQт…ЃfZeкц-зНЮЖU”ЏŸЪˆЈІРЛлэ)vSл‹dŸМjн—Ÿob:”ЁMюK[љСяђЋНl™FЪJбBY%[9яKЧЎlмAw Hz•Hс”ŒЉ›eњЛC&’в†kmO;5ѕI{j‡А%‚”/xљWиЛ№sЪGOzє^X$)UХЗeЂСY„LАdI@CN($ф/q“š б­nЩVG[x#>ПJЉ˜–иKЉK€ЈЁ.?„žŸЅcДj&Ё0\‘Д•ŽŒ€њЯJѓ1эЇЋЮъ‰вšgLжˆEЩЫ/яwˆЖ‹{ГfНБ” žъQьюM uўUњтую-{€”tуАЧ эјѕ$Н[Ћ$ъ[‚—’мD№л^žЇыњJО№Л@?ЋoзРjпHq]}>gќыŸВ&@]еъэOиwoяф††і8іŸѕ{ЛО.eс˜nЭЭ]xl&;ћ2V?ХwџЇњ“щ@о#ъ‡Џ7WX.nQ^їЯќн“ђŽМMз1™Š‹}Ÿcp#*#HNGк‘‹ZœZ–Е)G$žЄбKЏ•*TЂ)RЅJ"оД]Г\й›D-ГШѕ•дЖiЖŸ4"­—•ЪэЛ" э­lМƒдFЖWіХй uћЊOЏИЂ&УЯ*вФyˆяЎ­?ъЌѕІ;%R 4ћщС)Ъ  іћhО=%Џd7эѓЃWo УŠЪСѓœ „‚8ЯJ"Ј7Vя2Ьu…`ЩFG4тcГЊ'Уy@ЎBюpяЧЯћQхкіЭЂjўвcЕ i8Yрц”яLƒyИK˜ФЄуФЃїƒr@шzжеOg—lŒДXjaФш‰ЕџАЎŸ‘ћ=.0RœAJЧ^ФчЕ „­ЪРRЖ…,…tœ|ыm‰œЎ3фЉ!GzЩ $і?ыџМm­–кyТД„ЅD+#жЏTяoV_|ŽѕЏSО:—4ъ5яВТћќиїљJЃЙнуBI[Š>yЅЎъчђѕЅyдР-mлАА‘ё=Ž}НзZiЉW)a(>њШ$ЈŸ™ЈŠмu‘ƒ>gŽю\}МTхDэл$gьГ\n/]%yŽ'pлiш‘њšnxAс’&­Z‹P6[ЗЧMЁС€В;œіiсџƒб-“Јu‘KmЃ”Es#…]ўkЧ‰ž)ВZ§—kУqгТG^…@tеU’GHтї›’ДœтуrЎЕeТыЎц9fгLЦ„Сq)р!8j•юHк”ѕъq€HчYбfлn15ЇX˜кЮ№АR Њ/в!MБм<Ч(RзИКžфњгn[кХ&n№ЄDКь Lждœzž˜љў5с|Jэ/тЌыK_fЙ!ršЦдИ“…ш}hяBШГj)RЎ2$ HyмЉЄ/:qA:СЛнЁnЛmм!'”ОЩ {Ш 7cЯДIЪƒБоOE$”‘ѕEиsуСЛ[б /`#юќXщ@beолЈ‹osЭi-…”-]qж’vЯЕ%Ќ€мѕ<ќ/ пŸZпџђeШЫ~ZЃЃЯuJШADMOЉЄЙB—ІDнЗаŒžџ*jАcЁУЈF@$sзЇуš_Шжi2S%oЃЬGн§k*ѕХйЦЖЧСы№:ЯMPњyDЌд/qШcvаLД’[N6Šћ‘Б\•`dœtЃNЄМ”&s€Рэ^œvћq`!ЧЄИЩў9„ŸІjuјыmњYŸŠš8УClжцŠuVЄa7ќЇ›’Д0–Шg! Њ=ћ}h*MЦTЯjТ сОЇЇz%Аxq|ПHCl0pЃЩѕ$№)Їd№ѓHhЦ~лЈц1:hL6WПŸ|•A:ІRаlвn@бC:G8žєО№ѓУ)њВр—e%Qmшжѓˆ8РэѓІ.ЋеЖ=+aUƒOlm dIBvЉгщžІЈѕЏŠAШГЂиŠƒћЈБШТGmФJONИHИ>]}y=‡aX5ъчpvх1OЙРш„њ гЉRˆЅJ•(ŠTЉRˆЅJ•(ŠћMъЛ†›˜лб^Ф+pђ“э] ЇЃКОfЙіџЉЇъ N;%еmZЗ“’ЃъOzЊ~Cв\.>ъœYюЃšХ^W•щЗЫ‰qЕ-'!@рŠfhЇiщ ЂNVо~.Nеџд;qK”EањŽбЃЫn’кћхмvњбпиМљтВВ9С77ќд№Ќ6'лк—BїqOIџБ?кАЙq˜щЪф,§h‰ЅнЂрљШ•,e)##пЙўжX-. и 4pW%{ШњN*CЫћЯ,uХDL›з‰ђц%HKфЇђуЇЫEЭОЬ™”ю ѕъ~g­VTЂ)RЅJ"•*TЂ)RЅJ"•*TЂ)RЅJ"•*TЂ)RЅJ"ШлюВrгЋG§*"З|ЙЁ;S5мzfЋъQ™д7U™Žp2Ѓ^?n\Пџ[ŸWдЂ-х^. 2—єР­Wuяё]ZџъQ5ŽЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅJ•*QЉRЅџйmricron-0.20120505.1~dfsg.1.orig/html/images/lazarus.gif0000664000175000017500000001405710421735242022240 0ustar michaelmichaelGIF89a}9ї !$)%)!!)!!)!))5FE#A'X"U,g&a1K5 W>d> a@o: oF mDoP%9&-:3S.DJQ_dK/fRH8TxFRqU_ofbn%D&WŽ1ZŒ9ZŒ!Z”)Z”-^”1cŒ=^ˆBZŒF^ˆMdˆRk„Tm‰di‡cvˆ -Є.<В1JЅ7DЕ9JЕ9JН9Z”)Zœ%cœ1Zœ1ZЅ1c”1cœ1cЅ9Zœ9c”BR”BZ”9k”Bg”Jc”Jk”Rc”Rk”9cœBcœJZœZk”BTЊR\ЊJRНZcЙ9kœ9kЅBkœBkЅBsЅJkœJkЅJs”Rs”JsœRkœRsœR{œJsЉRsЅRxЊZkœ`o–Zx™csœc{”hu™k{”k{œZkЅbsЅ^{Ѕg„ k{ЅduЙ`†Бk‡Ў1…U ƒVzV7g-}jFzgV}sW‘bh$q1ŽrKždw1Љu.ЯPwkkwguwostvvwc~ynˆ{k–ym{{{s{„{s„{{„suށ{Žs{œs{Ѕ›…:Ќˆ1†QЈHކdˆˆyЂ_“zПŽ8чЅИ‘MЯЁJУœ^ЦЉkйЕgэЧlw„”~‰–s„ЅwˆЅs„­x‰Њ{Œ­{”­‰Œ•„„Ѕ†ŠЉˆ’Љ™› ЂœСАŽмЩ•s{ЦvЛŠ”БŠ’Ч€Й‘ŸЕŽŸНІЩœŸЏ  БЅЂВ­ЎБЈЊОЗЏНЂГЬЁ­иНН­ННЕЦНЕ­НЮЕЕЮНННННЦССС­СжЕРгКЦжНЦоЦЪвНЮоЦЮоЦжоЮЦ­жЮ­ЮЮНжЫЗоЮ­ыо­цоЙслХЮЮжЮжкжжооооочоячЮячжяяоЦжчЮжчЮочжочжояотчочяччячяячяїяячяяїяїїїїїїїџџџџ,}9ўз HА Сƒ*\ШАЁУ‡ЌћGБЂХ‹3jмШБЃЧ CRФ$ё_Е“(SЊ\ЩВЅЫ—0cЪœIѓЩ‰еЎхмЉГ'ЯŸ>ƒ*Д(бЃF“"]ЊtSЩ“›0E*Е*еЋVГbнЊЕ+зЏ^У‚›еЄЭЇgЈ]ЫЖ­лЗpуЪKЗЎ]И8Яц%щЉo9[ЎlAsЅ•+;ІLбЁcJb8fр1ЃrdЩ–ЇрpќуЧŽ+‚Џ(ž\yF+[цЈуЩŒ(O@зйsЇЮœ:wфЬQcЦ“)bžдHRЃИёуУ‘зАaœЙѓНhљz’хЉі–-uЖќИВНЧŽг[рў<^ ™ёŽЮ?zќ@УУ%SЎPБ"•IєaбQ[#Ї8ЂНfУ UЌЖ…|Ш"K-ДLaУ 7дpC ЬХqХХ`мGgсr.—„ !B]_(Ю" ,wШrЧ‹/кf›'›œrŠ*Ѓр8Š|ЎАтJ+ЎИЂЪ0ВŠЋИrЪv›І†pЬ‘‡'|ф1јќ“=оаrХWŠ#‚ ТH(ŽљA ўBAD€Ё„’J*­И(ЫžЃp'ЬИ@.p‚ѕh#€7шˆ€O68ѓЯќГŒђМЬІr,PŒнђдCТ?. ­ #Ю,DєёЬ0У|СEv>2Ž…щѕ‹Vxр€ŽPŽTс x ш€ јЕŠ Tˆ@)`  Т.ђ–,ђ А `=PC<^vќƒXсў‘Œhя>№о€ ў%шЦ?p…д*"X!’ 2љрv€Aьї `ƒзQA*ри5‚‰`Х/\ЁA\@Ф‘#4P P@ƒ0*б@pрvД€Є^‘ еB%єŠdОi%СШP€7И|pCкs€ўЁ ф Ф†ˆ‚р€џјоЧ„>9:tЈC ‚09ќ}a[pС60 |@Š№@"бŠ1~Ршj„ Сˆ!Q oд€ С:3nи€Ў&€т/wјФjБИвГXœрЇkЄР#0@0ўс!К іXЧ Фщ{ЈcўhУ=дq‹?Ф ы№A– Ри8ё/%Тnі…"pA(Ф v  |NHsФшЬXє€ш%`СD4B˜ƒЈд…\"*H@"Nё„2мц/;(FPYd 0 №аƒА`%H @‚ь#X@ ь A n‚hѕ "`Њp‚%<с sшABƒРж!Рсј@%>‘‚џ­Ž­0*~! tрŒш€Ž– H@И@‘LЈh Ђ P "da rРУЪА†RCЅ IХDЧ P А€$` p p](б‰m}+L с“|m0…(”Ё XЖЩ‡+`! eHƒЪ„% ЁMhV ˜07Јс Oаƒ0zu1`! Np‚ АР'ЫЩb"”[›киaQЉ4ФHa(CН`ЌPEFч‹D€6–€{Рi&‚›P,„Q ]шLkЈяјbЈp €™ˆрЉA 2’nтiNѓ<CТP‡Ÿў`k0aЌЮТа7ŒY0ˆЮЩJ‡п№L№См1 Ф?ќ# 0ЦЌRp€AќГїpгБ­ЫР Т Щ`Ў№ ˜ /@ RS0№~Gˆ№ 2O‚r‰Wn4G –Q~ПQ T@ kРaT` ЕpЌіYССav'іPvР Њї%Pї'‡I8џ7{иБ>р ‹`' М €РПА Ъ   Зр*.Ђа"„ …PОрU0ŠQ.@‚`‚y` В€&jБ&T@fyАRU№|№ ўr0eї•тїf†к3ы“ pHˆDЗIXX0Гз= +p О  Г  Л— ЪР …№ та Ь€ 0(Ёu В3рwЂРЫYXҘV г _ šbіŽ!…wВ ƒW№GТ2yЅuzР‰џUч#$`!g0PopШаВ2Ж№И U { 'vиё*арА йТ Л№…Эа МрхА џИ.Ѕ€ ЗP Г ЅФштН^їŸ–Z)\аdHЧM`VІu|p}ѓ"xr@`їd$nb ўV0DЖ UЅH80Uu  'а@$ РƒU0{)PЅа њ˜ Л|ўи Ы№ЁPуа Ъа ˜@ •Р Ш |P†а SpeР<ЈfX Nа,є6o#RZSps  w  !Y0z€0§U ВP Т€Љj,рi<e`АPeb”ѓx?№p Т† Л€Њјџ аdTƒP‹ ‹№š‹P…@ ГЩšƒа `0ю6tKtї–#bbАn€xа—| dvxЦIrрSЙеGХр hрiNXSў“™iZUU™‚™™`0{*Аš€"ЛА YЈ џј…—p*0ƒАДyГi‰ІЕЄўi‹А `З'ЦsnрЭr;gooЖgPSˆ§u=5xrCn|p|W IџW›Užр“–W0{–PШP`(Їˆ…ЊЈ ”№…`+`Ÿ†p”P ˜P Ѕp‡`€Ÿƒ€ŸЇpяіi@ Чр Ю 1"#|’`"YZe мЙЊnpis€"(‚jexр|рXЦ(eЩ7ž1щD=А™`{y(э… ќX @ ў‡P РЃ<К@šЈ+M+РЃ–p ZZЅ%`'џ@ LPKЖdТEЉІЕџ%nа3Ъr№$siїUab№|ЉŠЊsАЋˆЩW™ЖYuzY€Ї !%u`ВАЁyР%чP ЅP ”@ / в š№=њбjЈ@Šч№”*\b +џа"0;0ƒж’b%QЦ‰0ИЋЁЩЇˆPжЅШ™Њrв3r›5Ђ$ЪЋі‰T`rq&Ё-€“€ ЮКаŠ­ >€­€ @ FJ Їp  :+є-IЖ‚WЁhрў%‚)fŠб‰уyО*˜›UЏy ї‚=ЕЁr@[ЛZTpЋМzPз1p``W7M@ †@ ›`… ­š  Р ^x ЩА­†` –P ‹а­j&В!”.`аїk o s rŠБt§фtš•z@ЅЦW–аO§e ЬP˜Ж ˆ› ЦаOўZ1Ц zрЏ ƒ"˜ƒ€КўЉЯJ ЄЕGњЕЅp Н Ј+ НPК–Р Ї` Оp жiсCВрu uЦ€ ќрsO№кр #ы7Wа ёP BtnРЂњїЮ Ўг ўQТ@ с npо`@,O—|FЛjYš‘—БЪЙ*PЂ@ Ђ Є№Ѓƒ „@ŸƒрŸю[ Є` ‹P –p ЪАpbPЛ>` wАRкјќ№8@г ‡к' 0џ0 , џ`bp1 8€іg+Л +0‘>р ! , џb@ЛР7[N„TР’ЅW€ŠАИ$  P0^Р @ZD‹@ ƒp ”р СPZПљъ@%ы|АЊБЊб@Ш ;р%ќg+jЁТќ*Ь>0%| ;5jAЫАSў‘CIм`TEYхЙ™$ЁTP1 1€?р3№Ф*Ї  ‰РXщB$„Щ„аˆ  Іw?p_Ÿz#[В:PКЅ Ж € Ё рd–%vЃ$№-0з@gCЕ@ЪГ$ ”j Шї"PЛџp S'р‰Š ‡7 2P Џ№ 45uERˆpЮŒpR 0   І@ Ї@ Ѕ€KІ€.€УЧRZ`рЕ+”:PЋWPЅV№лАiLIАx0 „ЌP’ы` uЌ<#pЬьА’;аЬu,Ш"0кCЕр#–ЭЃ3ў ЎЮсь < ‡-аŒpЮˆ 6ПђKЄђ|ЇАkP‘[Ъf#+”,ІWpТр ‹S а PТCP< ќЬ#НЪƒcyШCif!P7Ш@ІхD:7€,нжЈАiS№НƒЁ`гІрЮ { DZК§аKы›Т%\R0дdUn +‚BЗPЧИМк@Щ Ш0 # /€Ь;eН=HVќ№ж?ж-а W&э7”bрDћ<№;m ’ЬЮuнЮЇœз Щ б џаWp…ЊЅ%Ÿ к) Ю'ї oМ 0ыў0ul6.` џp э=ЕђмUб{6"АВXР&џ€ н“к-№нP Ч€NЕš)vаaЇa>№;Љ№ Ћ€@jА;рЊ u ьќ(яl Ор э№ юрz€ЌWрŒšЁЗ Ф0 а[АtЕ  ЬА @ѕЬРЧ!р1)асПќ >0Vr0 N%Г =XPЦраТр;Nr@™ З8 АкйьЏ…ЁпЉ@гƒp‡с 5}лЃ€Фwэ Ња 2і zаSy№%‡ЙДp80V-rTРE p:Žў,А @%#PTpч!№ZЭjБ! O~FY# ВУ;€W€Ђ п4§ Ё?Ахš< …№хHL Ѓр –в О№ bV o@ІZ'P'p,РНЮ›H$OАY2ьООыˆ,rОa' ,0\Р>нщ„$ •Q-Pэi=э#`ZПšЭ=€V№V@ Пƒ‰рўZ?0 ЁLwm эќvЄръра рА!ъ vNXˆ8ЁU§šЖ  FH6\Xа–Б—~Ѓіˆ>fvtл‰?^ˆпйўЋџ*Ђ“ЋŽ#рпБю=0 ЈPи1Ќ,WяэЌw} ђ+ 6ырр сЛа{А(QVА7eж~Ђ8 ˜6_wвi!ІёЄцa›—~wђЉ WjЙƒOц„:‹|WрNДі] ˜і?p ?А(=рьП9ПрНp ар ?џ уАžP9єЊБ*T№g пyš%2ZЖjЅ4\˜'2›—tSџƒМk њiљuRюЏgАђS њ!њы@њaњІПЂњБњЇпњ‘њ!ћЉЯњ ћЂП™"БћМпћОџћAп&AФ_ќЦќШ?*ЯЬЏЮ)пќаџќв§?сы иOкŸ§мП§оп§aqт?ўф_ўцў;mricron-0.20120505.1~dfsg.1.orig/html/images/layers.gif0000664000175000017500000000635410416470540022060 0ustar michaelmichaelGIF89aЯVГ„‚„двЬPQ…˜—іААђrsƒќ§ќCBEќ))@ААЕooИ^^^““­ЯЯњ!љ,ЯVџPШIЋН8ыЭЛџ`(ŽdižhЊЎlыОp,ЯtmпxЎя|яџР pH,ШЄrЩl:ŸаЈtJ­ZЏиЌvЫэzПрАxL.›3ДzЭnЛп№Ић@Џляј|!яћџ€‚ƒ„…†‡ˆ‰Š‹†Dz‘’““-”™š›œžŸ ЁЂЃЄЅІ›ЇЋЌ“ ГГ—gG­КxЏ­˜ЌРЋНЉБИЗЧ ЯбЯЩНШCЬPЪк)—о(р–ФЊиЪс бюю  —ŒјљќqЧъLИM`ІHР8W(+І Вtx@БbХђ `(с‚ џCŠIВЄЩ“(_эKЩВЅK–Ы`M(Г#€›8sъмy3UB ю<А…‰\Gsч*@TZРЂгH•j€‚Ч]<Ј‡u“ж˜`Ѓа рІІЪ{FрХ|Н№є)šЙ ЫKЊД—З ъЅГр,кГ ЏvеДLв­•‹Oz\SьЕЪ8›VъZhюоЦ5ˆ—BнІvэ•ўІЗ!_Ћ~),рєРр:…шЌGškфJ;nі;RXk`ƒ'Kа,ZЕ иК­WnИЇp"H [Йˆ…H_“Ў, Сm:м)МГpпtФЯygћѓхч^@пe№щЗпџ€vрзMї!H`Ч рlЩЭtYešqtЁQ7кOXфŽn8цN_%2žAс‰гЪа"KI`€P 8Аˆ:НGœ‚жw\? (Ÿ’‡„Hd|@2љ#“DFљ$ƒк™™JфeАb /eAs›=чYt"ЂFQuЄyѓŽ; hЧж›$fЦгœsЪuд^$ДиЅ–4ьйAŒ€йбPCM ЬYbѓ9‰‡”P9Ѕ ЊрŽy 9)Є@rкc,ЪQVЉ/њЉ‚ЉшLH–s №Y[žЙaik№ц­ЗаœaЖњъtВк‰"ž#шщЊ+ {Weюе‘џFR}dXН ЃЉ’ŸzкdЇ“цaPУ˜щЖ=jЋ­пЪхЈ§й ,„О№jс˜F#šuрЊяОЛкды…eо{"GxЧЇzо4•&ЌАТBlЌG\1ŒБIа@Ш3еL;gUŒ^ЛЄЃзrЉЃzИtЉИ>’ ГЪ4ЇќЉЫџpрЇФ#ŒАУ їlБЬёК“aH'ОиŠЋЧш+<єkЋOmfPГощZžVЖ;Бƒ —нАйfŸmьw—ч,д ‡|$ѓŒ~Ÿn+ГЙн‚ђrЗ'—+щЪ5с MХ>Ћ]ітdЏъ—™Р!iNрєџ›QыTыˆТ9ЏЋdj-0xФЊјИХŒ/^*кd7{фЋcЬlcD5•м *нSЕљ)Ищр…ŸLiс?Ѕр„л,3КШЎСыБГћй>їw$Х[N/ Њѓ•Ьl~k›8fu…b’^яжhЂўuБ Йф­лOЛьй‡Јz ’ `hБД*d7Y”нbf<О5ЏH“IЪbІ7]”оСВ‡Н§­­Kc{з‰КQ№Е qфгмОаwСЌkє ˜†„EА  œ]ўњЗCў=L‡#ˆQ…RЈѕxF*†бё#$сш‰ТƒЛЎє7”бGIVlЂ”З)џ Gƒ8 ы‡Нжэv’ГдїДt1RAь'+ЬЩ™аC‘ў+†І›сРR‚юYohеKм–А3 R„jдЦЦ№€;л,РUё™мМт@аu/z |,щ­*]LTлцК 9,mќЯIШщН‘Vњb!ЈS‘8љыhIЫхⳘ: 1Р#‘HBKМa';yB*&i™Ь„’В”‚_– h„фYиДw$ХRŽм ]хСЫљэР;Іш!‰GfdеP"4ЃЙЌgЮƒ^ЪYВЌyMU1уa‡4UŽ8$€7iG0РжTsУШ/ ƒ:ЫгH<,рџ€UЙв&я ?HЃtHWжб!`3b(e@WDа‚>уckGSRUR<Д`тљтЈ`#=фц,е(q@ŠГоgдlТIкO€˜яMЁБFMН4,sђeЂiВГ™xТІ†NиєiЪ§,ЅA\Mž ЂЉѕ7ЕaNO40X@ж4єЏѓLj@ќiЪT:є­x‡MлOЏAДlк–vРpo3WьCВ‘ѕч–vL№УДљhM^ТкжКіЕ'Хi;ЫикіЖ!БnwЫ[и:`BoEBлтFŽ­r—Ымц:їЙаџЎtqмъZїКиЭЎvЗЫнюzїЛр ЏxЧKођšїМшMЏzзЫоіКїН№Џ|чKпњкїОјЭЏ~їЫпўњїПА€ќƒщ тNА‚Ьр/Т€Ѕ9"Lс [јТkC2 MЪV–€Tе/‡]Ёлс~DC-…jх:WЌцЕ^г№Њ*E,!нцЃ16JUqкbчUІЕŠЧ<6ЋQтГFж‡`—0>€*&OŽ2”Їќd#„Б$ˆы*_ƒU‰*я$˜GLLf’\ЊЬh афTtдD!еРylC”ЉКѕЗfЭщDАЕЇшn*A­$`ПbOzЩJh3џЈ4CЇFџ.Юјr-ЅЊуОbІЧYŒ`pcЙ%fЎh4™т{Š ЌqјіљЊtРтš›еqšКаДвНМ*egS›9чf7ђtЈ>jшaЏYЉЊr2€`ш>ЫЪІq WАЇ0зVе5yЬ#rК=С6г .‘zмѕ‰Ђ.Ъ§Вn#йnОк›ЧgCZŠBЫЄЋѕ™HЫ$d?гJžйс5КOфйРО­ТHŸL^УYж ˆg’ЄеDgM шeЯћWБ’5Д›V+"@_Ж”ЗЃMУ\aрlЃЗsЇ‘B QŠДУѕVqc')oФŠЧџуюPozp…wЋ™ r{щёоAоWЎь8КІУЏk;fё`юПЖi•цаŠ›Шv"—чЌ)$ЎуUмЃЧV]э6оиUwL‡uШбtoЉћ§ToŸеOЗт<Ÿ h­L<+З6У<,‹<@ЧТ.ЩЙLчh?аbŠz7q?oHњБЄЙјm>žЌюhоп'0HГUШH€жœјWГ^ПєЉњЧ?CŠ ˆфИзпviYž'u P$ЮОЬПM<ѓаŒ{ЛЇ?ЎSбю‹žS.uљшђсЊs9љ\4RшЏЊынщЯЮ=ЂщWиъё>›Tщћ…;g}ŒwЮ{й­% џц—‚а\ё|ўG ‡&z@=9’FЇ7Љї-—гЎGщуgЕ—5Б?…ЗeеФCюзезѓ—em(ДT@" €mЗsІpjwpnŸ7ƒ=ч‡иLжЇSЈwwЫRцReђ оїMN сjИwXgiызGНgFT|uЧ УTPDv№HЎ‚DgСpєБE]1t2ˆEфЂn=—OQx€вєєgwS>D8„S&„#'-t“&Nх'xчwu-—m'P1Œ‡ˆŠЈM‚$FЌБmФ…юI!CIЪTl˜„$FXžtqвGзxІsиGePfџІ VuHи‡Aё‡€Јr:Б}Оѓ„.wСД…zPLбqLЩjТжL_ThХnгd€FаfЇˆ 1q$xˆE#чRчNжцoфЄ~ШHъФN‘рNƒ^u‰Хшs›}>ї†Щo ЂЊИ"C˜#ї&~7ЁPqmW†g˜ѕuypQЛhтhjpGŒ .ŸИJзŽВ ьhŠ№ЈlSS!SCyЁЇg>V=ѕHh˜ЧQœGaЁggІŽЩ=эшŒT‘№zSs‘Љиˆ’]рbˆrj\Ѕ2іc…JPtlЖгЯ˜ŠPЏзo”–Yg™x\ж‘`WxЕ{еWх8b\™ шXзЬ˜”x1 :n…“о#”H–dаE•Вс—•YDІF"ц–pЗj˜фx@Їе–‹Ј—f„™fВ•ZќU˜…љ%щ6€Ў ˜НЅ‘<\K€fv™•\xЙ™œй™žљ™œ‰™Ђ9šЄYšІyšЈ™šЊЙšЌйšЎљšА›В9›Д;mricron-0.20120505.1~dfsg.1.orig/html/images/icon.png0000664000175000017500000001243410476334264021534 0ustar michaelmichael‰PNG  IHDR€Q•>9 pHYs  šœЮIDATxœэypеЧ?н=‡ni$Yјlc,`Œу`|`;Фй ц(C–ЭЕ!йЭ&й#ЩVЊіЊк?В•MU6›]ВYЊRY6ЧBK‘ №…ё}cŒ%й–ukFsєЛіFЃЙ5’H–oНRНžщ~§њћ}яїћНЃGьрЬь™ЎРџwМ#Р уfя0УxG€†gІ+UŠ€ Ba,B§>Є5ў /Ќ„%аѕP hCњЁ.С[pЬЬŠ™ ZqзEьh]иTЙс]ўЊЌ*e”2Z™ТЛVFЩ„іўйЉВNx Уlи@}=Žƒm'Rj~тa(Ф… œ=ЫщгІЗЗvУ‹3ЋФLPЁxА“OœПЎeёіЊ­K}‹Е1Ъ(Љ•JДz­H4љ„ZiЃeрŽЧыЎАДƒѕ_ХŽцa<‡6}}=ЪсУцТ…3Цќ^„‘щІbКА ;.ёчoДЯkнQ}ЧbпЂxK—F&эL<“C+iД2Jk-§зьm§фk4Тv№<‡§hщ$yэ5іяvwПП€7Іi`yП=XcэЌЙkЕ•N%к(iД6Ji4§2Љ‡VЎБї,јт_SМЄЕаЖРў<ЮpAŒчеЩВ8ž]ЛЬсУЧ„x €žVX6х7ёўфMћk'ЖЕЏЈўуѓœЙ%Е”F -Ѕ‘в(iЄ4Rj%ŒZХѓв(ЁхЅXї/+—oК%Yо"№ƒq s c Цђ%Є†nИСZПОХяп|щвz!F sЊCиЉръ0МоВC&№Щ›+зЇ[h‘р]'иOˆЁуz(ЁХ€|ehяЋС“сeпФS•,в‚&0 mЬЏ "WыBe№ћiogгІњккѕ]]ыcБ tN=S,Р—љіСѕ‹Wўi§ЇšœЦ8зТˆDЋOp >ўW%Дьq{wяipOŸ;РМOгђўдR‡@@=Xu˜cT~Z)Вsи6 АiS}Uе†ЎЎеЎл=SСа”љЏс+Ї|\ЙЏіž kЁdТЌzкQ+/ЕŒлziTGЄыPшXgє’1ЦУКНTЕMМCДСМЉь+нrf,ЦѓЯ›_м#ФwсJyyš‚9и`>]џ‰Vg^‚њQЦЕЩрicЪ=>sdфxП;ˆБа`, ЖГњћЙ` infж,Цш+œт]w?O==zє1xdЙЈš„yфрЂkZ>YџбЋfŒшdŒ#hъa<:v|фtTE1 - c\џГяШuЛ{с‰DжыЅЁ@€ЦFёћ‹nђЙ;Šmsє(O>y~hш_с\Yи*Ззѓo˜Лє#Ешр$|­т+etЪhK]tЛ†ŽœœзZQŸД…]Х-G№дфКуGрбLfQ]M @ @S^oўPˆЅr]žzJюлїcxbђ]ЁЌ“qkјіСM7нSГCэj71М2)†о(Ље[БŽ}Сз;ЃvF3Юь$eм’‡}ВNЈC(D(DG€mS_OSSТXежŽ#]ыD>™™x˜<ЭqИї^Яђхї?ёФъ‘‘ЏOв+”/ киЧУ‡Ж6mњ`ѕT"Ў і1ОZОН№ьр ћƒ‡ep”єіXh c1џiX•чОУ‘ќЕ3†h”ў~:;9}šГgщщ!УуСу)eаавТЊUMЗ uMf6ЉL&hsп:МНс=яЋоЗјЉ]™08—wwwF/kуz|“OSbѓ‹дЖчЙѕ№єЄъ^[Ыœ9ДЕ1w.>_qq”ж<ѓŒyѕеЧрJВ•C€›јЮС­›n­кš 1Sg1ƒ*Д+ИчФШ)“Д6у2Y”№Юbћ!,+ЯнзСžЩ>A>­­,ZD[ŽSDфК?O?НKыoAЌи›NкЌтсCkЗUНWh‘4њ‰ЖЏебШ‰—†wЧTl|Ÿhv&hPЛ2?ћІœsЩЎЫЙsœ;GUээ,[FmmfvИz5uu{lV,і*ъІ“ѓ Т|їѕwЗЌИЃњ§qК_KadPŸ|с@шRzBcЯdpRПвsnЇeS>Юрo@•ў!ннœ8Саuuј|љ]Bc#‹5?ОZЪН-ќ^“ ЩхЛкчЗо[ЛC-FЇqт™ЗмŽ'ћжуіŽs­5Ш`њG3WŒњ|uы‚Џ—X§М0†ў~Nbd„І&'ЕЕ,Zдpђф)wО№YЊ>ЭУ‡ц\_§@нNАЦЂ­Є‘GТЧ1јkW‰ЬЬІ6іt%RZђY*ЏЪSW!з0Й 0†О>ЮœЁЂ‚њњ 3KЉљšЎОКіјёUJН n!х—*РпŸЌйўpн§~Ы?nVYЫ}ЁзwїcђФ9™{C2csн—Rg@3у)xЎ”ъ ЅИpЁ!цЬI,8gK55Ьžнpђф c^*d˜VвО u:wwп]sg•Uщjс*!ДZКJь мz mЅ8Ёc‰єПёˆhьC mсдрoЬ_“ЃЅTПdМљ&Я>K0ˆЙR[лЗЗУч _QŠ+†љт™-Uя™эЙЪеТеBhсjщjq:rvo№Рx~гˆN•dД7шДC žІќ!АПшъO§§<џ<ЁP‚k)3kАl7мАvц-АHъ$џ|tiЭт•ўЎBKЁ…kЄа"Њb{‚„&ўDf3є†I’} ЇŠЋ~Y04ФЫ/‹!Ў›Ем|3ГgпyFђE №•S mў­UЗ-ьkс*сjёVДsD†ѓ3›УьЄžя-Рўь/уЌpqИr…уЧ3є€дC­йВХђx> Е9Š*F€лКэлzЖWoБ-FyЃр\фќ8fг ЮDГcВtŽxЦЉШ_Ÿ—‹Ј{йqњ4С`Ў 55мxc|*G9 аьђзЇWWЌšх4Ї˜ўИ’1ыŽѕЄ§l­;Э› чАќљЋєBЁuŸ (ХodѕЩоА|9MMauЖr рЫЇЕЋќ+нГ#”tЕp•{%жы*‘ХЧN }Ђ7žш“-_žњaoСlM .\ Ю)Х7Ы6ыS˜ящЕЖѕо\ЕNiх*7iv†H‰юXoAЬf$MГ”LnќDQt•Rвй™йЄІцfцЬi…[2R€~Э_ž]т[мh„I№њ“#€>w Ÿщ/F6гŸL2п0ђgEѓ5шъЪгтiљrрp&–PРlшўVНВb…а"ЙSSiпЏЉДZ‰сќГ›й†Фg)TЮјFСЯKЄЌМ‡щыЃЁ!Яti @CУьСС5А;­„|щXQБТ1ЖŸmжJъб§šZ)­†eP)](ГЉJЄвЮtsNf‚ “cЎ|шюІКлFЉq‹iЫ™ 08xkёќб…ъZџBя|WKЅуГќZiЅДR:Б“gРЮвЦгЯо9&žЪUЋŸLŽГВb` БД™КЖœš‹бв‚mЏд:Љ—чє.ї\\ц_ЂДЕјR(O‰`TЩ eІ2#ћiБ4гŸt‘сЌЕ2№x™Ш+”ЂЏ/W<OЖMCƒkв.ЯйюыЊЊ№Яі\х*‘XeŒw‚xѓO˜##cЖЕЦlf'ѕЬp?ЦdžzN—Пr``€ККЌ yииHџ*јeъЕйЈTьИДа{ݘЕбrд ыЄˆ)з•В fГ™Œо;&6LE}†Š§АмќM##D"ує3 P] ,+5ЪЮ.Р{{=ufЖЇE(Ї>БPыИqotGŠ1§ЙЄд3Ё+№ƒ)!q’JФB@ђАЂЫj0Іњ’fріЫ-ž­вn<ьIщ :‘W*,#cЬNрЗж6­•r^ЅnєъzЏn№jŸ…cсБPЁ,!‰J;(ьСЈнqњ"N_ищ {”ЖюЄyТž”чˆПžїvC0˜ˆ…rЧЃ^ЏхКs `–ЫŠсYЮ|7ћыTШh­•вQщІВ?ПBmnvзмыыХuѕВЩЏ ˜дO‡\ 9]ЮбЎшц71o`Ÿжœtшілќg‰M5„ГB9РugЅ^˜E€}>лW_(™Д6jtќ5кќЕдR(‰Ж–зШћ[#;чEзHЛЪЧУыa~ƒZРa+eшЈ5}ѕСŸк‡с€7f~2bFFАЌ<и6iГгYX=XoзЩѕуy'ЅЄV1щЎ­џА<ИuVlђМЇСp$ЕHлІљ;іVЩжбOa?М/У^ШЗNbБФ~ьXрMН*“Жск`•ет*‘віGйW:ю“=ЈКЎїЁ…CeЇ~Ч@ЭŸ `Ця‚n€mА €ьƒри3Cы4Zтѕf югI€:IРѕПЋ’@)mт­>ЎD“W|џн}k‹лV$Bp&ЙiУќ[Ў=g~ися ž…Їс—s<]~И.9Š+Ёiл3 0'jл\-ДжJkЉЕRcцшкšиу7ѕЖUКЅmG-†WЌИC˜ozU<@žС3žКZІ ўi“ЉyЅHk™І"Њ”Ч8B ЁЄЋЄЋ„nb*BЩѕ #ЯnшnЋŒ1ЏбюP˜?Kм E%м Aќ;Ќ.d—ШЄЁдИˆд5Kз а›z~&,а–PR()”pЅpU| Hов4ђПыЎ4xХTЗ§8 ϲטЛг­Бh€‡`/ь!пbлda JХg‡ŒJWˆ˜Q!\ЅTкvтL;у*”u[ЯђJЅЄ’R+ЉЅTjsSј'k{+щ >ўт‡Cс{Vљі—ч цТј(xсp{K†(Œдzи˜a­ЕPЊWЉ3№›дS3ѕ€K:f\)у6G()Є\Q}lM_…=- _уў ЙпІђт'b,oљ­№U8_€Ъђ …A†ˆ@TыЈR)#RFрXšёШ$@Ф1ъ]щJ%]%…”њяњзDЃ‰ IJ%о=//tї{ЈёнŽw7€CП‡Э#Ў/•ТбŸ{уИXФЭNdJуѓx‚iWц|Gь—y ѓЩыЛчFEnв“љoЕ%ѕа }ычшЇ№Р{ VŒ­Ÿёr‡=~X?y| ўЊˆ)&‘Q[?‘єдO\јtL,"ЯKz  <њХпЪeи6vvоѓf,yЯnьБƒЇ{в–W2Gq?|иЧЛЌђ™ёŸТ‡2мыЈ F K, яi‡1и•mAЖpљsжn{1жœ58­иlЧЮ,٘6.tbХs чжaМƒ8`ƒMzЦbRzк5wС]^nДЫёъљГpзXчНЂ3С+9†‘yиFзGй7ЦT=іœЙиMX xќи6Ц с `uуЙ„ЇGdр:ЃiпкЅъ!ИJГнтV‹­^ц_РОŸС€UяqГsŽчžЬ#Р5ПФ ‰Kц3вšуќ3iyk4 +ЦR‹ЭА жyИЦ.RP;q‚›ш‰n6™3pЖз%ѓПЈ§y^^HOQ<цІ„>‘&v‘zX’&ЭxЌ‚•‹œМїдЕ DrЕїДЏFр-ш€Ы…‡љh$ќq^ )§Іdі3КЂњ‡ЂJqa™Х‹…††Г-jœё#г‡>Bo;уBz zс чйgUš@‘;йЗ€~Ї`RŠ:­4{•ЃД"э€СVдIš=Эе6UЯ2ыƒ\EТ)ˆqG rєnЅЃапŠА0KИpgЎ"T,AХ6іміЊ„вJа#Ž|sИmJчПŠ§Бs=Kш\Hw#БВјиЉАWЙ3…ыa š;cХ–ТQlдluгвMЫKш‚ГщkfИ™ЁfB5H/І,ЭПIЪ"y2eгУ`щ)^Х)yиb‡Ј?K§йФЁіЋ"RKЄ–H%юh>Tђe qз„ eJ'€MuД•‚NІОЧЖФ; ™Rн)*   •~ƒІI#5щ_ќ9ЗщІ–Y*~kЉйИŒr”џe9чž™'R–Џ uћjeИЈБTЖїЁ—”­уžŠzxЩюz8вМxk|Е[фЬypнn: ‹ 8sДrHЪGAЯх^ОЕйTI NЧCZЗT)-ў4И’…Œ…д|аŒ‰!ЗdGmвлX8”’”gИє>ѕЛfЖ\u%еЈp^}C$žк{ЉGАџ2HшKо™ŽlWK=Он0qЕ„,%>f=*8AœgTя…SUgеo—›ZWф)• ŒшШ#ђЋЛЭeKАжєqЦ^3зТЮIЃСЎдуЗ[Šг-IєшЫmžpIW*==ЧЭEo~ъ/ток.,‹Bƒj:ЅGфє'Їjѕ”КFКД"S‘ИuЎƒ–кЪTиZHЊI<'.3№ф-‰lКУшќMК‚•'Œђ5†Нƒ­єхШъ7Ц#НщPHq9Rы…uЇCэ^}‘сЅю[з)Vш­3oCЋ1RыРЉдdэ ЦyР‹~є”ЅЅ)@)JъщkkWEoЗЩ},0ћЩBмRЖс=Р8>Ђ8u"€хRНkk№‹M"Ф”3oeє­SeNЈуюўЦ}8єЃ{РШЃW}SъSЖЄ/z"КŒ€}”Ќњ’9уёœѓ)…щнLЋЛ.пГп˜\ТsГћ[;ч9щЭGк”ѓHил„'лы?aLЙ[nыzRг*al ЋЁ%8ф§ыЯОiF/—YтькМˆHкЖJŠ\$€| ЊЯ ч5МіыšЈыKRXЮЇœtЮxшŽ1‚ЫN>ђe qз„ )J'мšш]Ќ[CLЛsЗШŒл -hР9ЩžЪрњO?xx+ЅƒЊЏ…јii…Кd…/rЮЩ cg^М{WO§Ѓ HcLПєŠCqыjy=д‚@q§Ђ“лЇхZ&Gš)JP R””ЅЅ)@)JPaе‡|РЂœф{згЯКі<еюЧN1XЉWїЊъЅ­щ–іВ№пVЙ‘Ѕg8Ѕ*‚E)JJR€R” ™йК€‡T‘кАв­Ї^­8Ъ“J\R|~=Hi>&q)№з–;1Œ|V RІЕЭjщ*ГrЦх–оEž$И R•I"”ЅЅ)@)JP R””ЅЅ)@)JP VэІеЕpфKyцауЎ•8ДЖ›Щ;‰zžОєгKЅ КАы@pG5eNt5 з†0„•~•UйѕJb<в6”чАСЋ.˜ЛZwЃ>[Щ#Ž1@T 'QпrBŠиBА„іQяR=cйtы)a8Z$чЕKleЋ[ЊVэљ'Wц­€‰aЗ^eN=ЭфЩўпdG“pњ––Зсo €ѓœє 'јz|еtѓkeеДђлЈQJЁ‚’:‚;ѕ5ўјфgУQ# dWРЈMj^дšЖKЖ›Tе8[iKKRмлщѓ6у)ф3ЩХЅ+жhHж}*лвгSф 9!ТQYчi9<$Мu=Э[ЩаkƒИ;0&eпщ–Е>vЁ@nи9ъyшкл№?FЕ"Ю/ЁHсђU€KhIRN2’NьрєЌћЮ†фIмAz#Ш(VУќ$cƒУиHгVЖЌэЈGм\ ЈхE^УКeиЁљЄ4сЩO=kЉ„Ѕ#h ћз>Ь‡У%Щђ”ћV=CrL`хdс4;S)єОъJ@H5JјV–•Њ5x’цСѕc'пжэYГѕд!я8ЉhNI!9Ц*5Є YОВ|Иь–е1тЗ—ИЈЋ’AСщјJлвQэM Њ ‚оЧ9ы\ЏД еw!­n%З6ю(ъ6ЈдрVц’БХƒ(Ъ‹ 8к L€CЬрє <ѕ+ТлK сЉѓž_'.юР‚ЛtЮxфд?Тя эК†Яz§І—S‘B›p€ЉЄћœЈў z:цќжM}3*; '8Иўiещ+ в}СатЇJ\6cn№2žМєыЧZЬо шЙšJс…;nuD2ў;џa^ЪЯЈюJН‰Њm№u=šS!l>‚•э)=”3ЦAф}ЋЩwы<ЫЭи7МЗлю9JгйI=Сџ\ањR”•ггV‡ЏзиVШЧjф9ДЋƒБ#•+Œс œgœbНlа§2вMЊнћгўЗ;єу сDz@ШыšЖв>KŸЙ—че :в#Ж?|AЯт$a№œ`žppkпUvеё­zj3ЭлавRќЧAZwB•ž…]=#ЩћжKд˜ъЭIPХKќ=БШВYЉ nyЖЮ ъTy&€Ё|cб–Э3ІэBЧ’ћ§:еСSЛ’TTГŒ“”ёиd€1ŒvМбЌNвo?wГЦun:Ї™\†Ѕ)­ЉСЂ?^„аёњEСјь э‰ѕ ƒнK)WљfЎ2kЋe˜ ' Б <нЊtЩ[" Šй)иk!l(ђ rAYр`ф Ч<ЙчЊ45яMЧ'0л‘x y…nJI$r|c3šіИэАљJ`‚ЃќA<бдV˜ю[–™M6[u% iC!I#Eт:TВŠŸyН_"Xв—™ЖИДюuР’М)AдvŸaЧ$qQ™qн‰)швPћ+Sn$œэP8#ѕR””ЅЅ)@)JP R””ЅЅ)@)JP R””ЋDщxze”\ѕl?vXCБ#ЌЈ}7Ї9p љ?„Ž rА%žOјcq›nUТї!6XxVаћdКЂўF^IЯ0sQЉfт‡––Z6vыAE9рp~2~ѕbнnђЎЎЇ>тдЃјwa ј  TвхЉY њдzє#чUг”ъцTу”ИГБ[eЦоiZi7СDиюm8•}27$ф-gфƒ[ЪЗовЦ=ОўLsўU/yQ [# д{ъ_+(BЮТxЋ9ЯK7АУэ"4TЖъ кУ”ч8Ю3дїжЃZnьъB›‰”žўb?­H­Ž-Щ+C„ѓЧJ‘K–хОж†|ЃЛВ§ш щэ;td€ф\аyˆ?чYтщ;м ЂФ,'“ћФё5<Ейч^d6ыA^QфЈіЉТ’н‚нЕєn ТA’жhо8“Й<.%жП<НРмЏ`ѓ§еЋ|гwkm.щ l!УЕ*м• ћ’p~ўЧк­MsпЊBђYVHЕI Чъ5ƒqv#Б iЇ†yТ•щН_Ёь7ждєЦ>žWџЉd„,єый\ rLUKz№ЦtX+“j˜нШ6 [IlЁТ?Щмzёxу$а‚ОЅ)@)JP R””ЅЅ)@zџУшКwKщ˜№лuЇ[uДЉO6ŸKФ—3“зЏS€8ЄPЌЖ/—˜vЏдQѓTпƒMлІщZKХй,-~{%DљdЈ”№z0xу9яš—IR90р-M:ЙJO№ŠцŒмvCq”B0OД•Єє5]йSћ1Ё"dЅ2UЪЋНgдqч>І6Љ=;аœŽыZ[_ФœsжЙZО№,–'ю{ЄGb’$V#Ћ­šВк™VЧ’ЏљŸФƒьEOјŸ6dЪ} c$ѓƒгљЁЎюбšѓ8ўcVЎЊаБ5 )ф3ф+šбVЫВ#%N ЉE^є-}%Nўя9рTўйИPлaЄс V…вэoБ@\Ы›эЦŽкrJђНGєnОЋg,[cȘˆQFїп4шŸa‚+Ÿ{ˆЉжз™i[\Pрџ•lK˜ьЉХ2j"оН†ЋŠЂ”Ёл<аK—‡їK”Ђ^pЖРь’ѓЎЕГMкєь56ѓШ,`ѓЯЙЎŽЂМLR<ЫsШ)Ч яљдZЯrfјг‹s™ ЌЁФ+ЊMMј›iЇdк%"1HУ­эyIJIџт }ыбšПRFЕхƒpмSИАЊЪяf{Ф&IL[xp/їD%n‘ž ƒЧ9ЧИ˜*mЁ<:КjЦФ”­0эхE!їTVFsБУНbДi‡.sб:рЪU! |ЅЉЗžгл#кАъ{cQŽwKgдŒі &š"uЪ[Х›s8одUœB=Iъ8Эrt+ю?gѓG–ГŒŠщ]ю 0ЪОЃ(p“даzёВьыњvS ŒЄЅХ!Eгг…Ž*ъбЅ­…$~ѓБЊЧ l/JЬm)кЅ­В‘№*SЄяВўЂ:ЄF[NЈŒШ4­v}іmnНo' џ:ЇяїKФЋƒ ЯˆkШuаyo^&vЗg w5W!KеhyМ2Ѕэ ZЏл ЯЇ”Л,F\S‹*t ’ˆћ“ŽЕBјЧlИLЛ*тн…l2кvЛ-Ѕoѓ†аrЄŽSЗdќsвН d-<ТлBTтШкA хЭКУžNР”Ј№REукTЃ_iwДхсдЁ UНХnaдЅ[R 8AQў!ƒп‘ƒQzJU‘рЖoRо]—qcЭЗФРJ—]<€xТ€‘žщЮA"€­щ^ЏwDщфПБVKv}„tJрk_ ЌЏС}ш1“rVйie(* р)<€œу8џ:ЮLДуя!ІPЗqA(BTЂxдз^§І/6кrэqлt”Ѕ{’БŸlЄœПБіЋgСн"Ж/3.“#Ѓ-2л1” JJЖсед+гŒёЅuЭtМDЕj]JЫ–ы{p˜ЗюjqХЙŒ0щќ’p:r(=RЅWѕ<:уЖЇ\iГЬЈ9Иg v?/НEh)Jщ (9?šAџћѓзьпїiў•Š•t.kSZa6—ЙВO‰—Я_ГнЇњSЯ_ГнЇњV*V}іукKцШвК|ѕћ7§кЅ<ѕћ7§кЅbЅ;эЧД—Э+ЁвГмф@Й1"9BI (Œdœ …wьjhќ‚Е!ЩkRЙVхЙЩїфзkТ=з’Хўшп˜ВwDeIс8<8Aъ{ŽиСыŒYoZэЮ8Зм…Nœ’Ѕ6 ЭWRъъ\*Щ~lоГЏFƒnЅ5"˜qmЖбW—   рљИ'лѕіыZоaЉiм‡œBЦŸZ9?"Ў+ƒ0т0]n#)PRи*Œн,ŒШŒм‹dvпRВ3№+zЧiNо…g)gўцU{V73R‚ТшFп‡pњ&мKюЈЇ`yJЧ=љічѓЎWа3šLРЄ…qќХK4ЪмђЅДPX%(IўNMtЎVІЏ0№JЧ)PъŠ—ЕœžŠ’Ч-ьжQ]г–іmгњ›uQд3”К PsSЇ`нуG‘ЩU™/#ѓUr™вs]„“p*@ў;}ыniКzLvтМУЇnз2ROЗХaпn=ЄОli] —ээXнЫŸX#+ЉncЩЧшЊхпЎ–)VмwЇ8љ>”ЊcЫСћ)Dўд‡Qмй‘k~<Дљv’NA?БiHS,ш’њJ%,юJСщѓNљqэ%ѓdЄ“Ъ8ёlЋЗлЬљ%ЦмС)къ’PkЏЄэ‰‘o~х ЩѓК ІC‰8ћ…fЛmˆяр]@KˆЦвxJЧХH‹,3n[-!)HIEypЗv’љВe‰7,q+шmЯдRЫм˜дtœ-J–ђ†?ї”jsnвішQM*ЧЉI˜ђ2~ЩP­],аc[ŒЗЙХ-GНd…ЈввKwf— м<Сщ_игОм{I|йŽ•аЂ5мw#ъ;‹брШb|Ё>б;еŽNѕgvHRГžEG<ѕћ7§кЅzІгq‡pSШ`zSз)Р5YЭ№т гVЩD/64-л––ˆк‚z„фp>?ЪіукKцЦ•аЈМѕћ7§кЅ<ѕћ7§кЅX^#јp4м\­r‘8KСт7 “€Ё€ cЈљэ\SОм{I|ивК|ѕћ7§кЅ<ѕћ7§кЅbЅ;эЧД—Э+Ё—Я_ГнЇњWЪмRЦGф€?ТО)XЪъМж™MЕёdщ])J “гш&4”‰лИIuN2q 6Ђ0wmѓœrp}ы#њŠпѓ#qQZ ЮOАЊ“Dо5uЪ"­ж{л 5 БЕЉ%[9ќ$ ’у WsMщ;Хв{Юо/)FХрІ:TГƒЮJp9ЧcžzPЋI“tZTЂЄ!X!пz˜iЫCpK˜ЯŽ€TRСnŸДЫЏ; #Ћю„‚GЮаЧJ›?#щ" =ЮŸо€ндЯ!ыCŒ„ЁрчЁФ‘‘ЗИЊŠ6™M‚ф.nCЄ$хM•eЕь‘SћtВCnЈ”9мі&Бп-ЋaэрaЕt tј ;КSUЧК%gШИ7џ’yћq]K{‹hˆьщЫТ‘еjьRš’чћ\“gkЈx6HъRzŠпеZ‘ЋЎЋЗBtсIcЮ@=7zЮѕ<џЌО•Мrдb} мw5<бАХО:мmЖкŽ‘Д%#Йy™% ~ђN+­zPр†л!)}Юјѕ‡щŸ\рЋdŸJ|е[>йЯпєЎО•e—ryЫeб‡$МЮЁЗBˆQNsЦGыZ–{жщ.=86рtH ћ:‘!‹P}ЄШy— ьF'*Ю:ЧQЭZ›ЦdsъB=Ѓ-ы‘>гПBУ~KBмQЪŠ$ћд…8 €GмŠZtŠt?Q)_' *ЯыSFВ”OВ*6вЂƒƒŒ{зУ‹ЪЙуиљV7UШїя@}КЌ$)x$жКˆ' фWЬчPм)Х…„чяT>“ёMƒW\mїфOЈZRЕuGЋƒіХ7жц{nHyиХищх%$P­›фЅ-Бд8KNэк6šЛ#Шfk~+ЉuЅ ‚0k#gkg`wшћ*C хТ€T{fЖвFЬ(№{fЁ:Џ_Zєф–":ПЈ”ъ‚Ch=2qS&0ы%`фЮz3|,Ž•™+ЧЁыZЉ<фч#“Yш m№х`ОУkWПzгИDL+[Ъ€„!@HьZщ‚@=Ое ж“ЇДђ[KŒ7]œXNр?х@Gв№Ў7Hз[Ъе!и‹.ЧпŒ4HNvз”ƒ•dƒа№1/w2LhpЫЃ RsZЖлЭБјуЭKNlЪщ]K~ІЖo,0”7Ž b€юђЩкŠ ƒЦ0j­ИлІ1~+—НL‘„ŒgœѕЋ5™mЩ#Шq*ЈяYKKo.$)CБ( +o–˜,†‘Бщп5ж“V‰ю ƒГ€*Р'Ї0*ЉЌ.LšЇат6+БV1@TзE#Q]šЖнЂя`ф‘ИŒ€AъzŠЗ4Б‡sдЁШ…@Ўё™З\c;А­iYAђЦO"ЅК{QЅ‚„}Ц 1дQе2аѓh7>;Usb”э€•ЕД4Hмg­Z-.6…Жr… ŒTcWйŸ™хІ#C сD”BаbпY~*OнŒ\‹Ж‰чљ‘оKY?…U&ГE§“i)иш#мћT:ё2ёpRгАž#@qѕnЗЮГ;шІнB†RЄŸSgВв{§G=+Ь:FС'S_Ѓл"…ЬЉЧJJƒhTqњ™$ Œе­тЭПW-нЮ+ЗЏвфfАбшГъ$cгƒжАГ™fчpК>Ь„#ЪK ЌЇ ИЂWƒŽH-ЄpxЩ 8(шšFЭl“KЎКЕyя+[€ў˜ЧžЯ)ЗлPXѓFР?:Щ6з}C_Нƒ!=KH "М=”~Џ0УъhЛ(]Ёьrг1|dІAIї^kfвRYњWэ“Tђ‚Bк‡П+Ў%Ш‡4†Z’ывДэ?˜Љ^2™{kŽјJИ;OмSЗ‡Вец}MrюЖ€тk”є<•'r›оœіРYШЌЊдб.•k–ЗЏРЏ(lЌWдЋФш1”ЗnJR?Zћ=ждмƒЕ.ѕЕnМЂІм%M ѕ іЇoeЋЬ0њ˜К7ЉьŽБ&Ч2TWвPД…ГŽ>ю=QŽ*’ењ.~žRЄМвйЖИя–УЉdH *чƒЯ|vщVЎ‡œє[фћlЄ)’ЅЉЦТ†3іЌ^5?s“f‰kЕA•%VVњйhЏ!8у$ƒž? ;x{(§^a‡дЂ<ЄЯoєWєЇ”љэўŠў•ђыkeеЖъ‡JT• ‘дизХ;x{(§^a‡дЫх#ў{ЂПЅ|­ HШq јџ˜ЏŠV2­ ,*ixП™xЉ7‡VfЏКЖ)L)шЊJд№€JB #7mrzŒз tЕЁЭЄЁ>дЎL–вєЕye.FBT>vурœMPIРдўZэЇЬ-Ј„„—щЩЦzдЋOј~мRЫ‘ІЮѓQŽ%IIЧAЗ<ƒZ-Eэ іTцЧ€р+ƒšћвWћфД„9 „“ЫјТИі4Ёf…"q%У—0„ Ћ9љ­йФШ’Ђž0‘Чa\лL…Ыa•=ЙEuъHХu’А6ŒqЧЕЎдRЇ’ГТG'ч$eЦцВуN63Зэ\є 6„‚r1Ч­Шш ДЇŽqŽh GSиЎ—}#Э)VШЧЬNоw(uЭ}k)6]ўз:,ЉЕЉЮС#лќ*mт бЫEКeЪещфю ) N3Ю~j3с%всzЕЏіГЊк§бQЦмr~є”—fгћуЧ\‰ Fv#ЊњџШv­"…MCдз”ыˆJœB‡)8щљtЎл#ЮdЅ xтА))IRpЎд'+СЦJIЮ2>kbzЩђВЇ–аєћ‘YŸAiмэ Jњ`жБ;ЪРJ–8їЦhA ЛY&ШAT—ŽвNp‚5™еDqЄ<ь“ќэ*ш‚žF>јщ§jO}П-,МуЧvFs[Г4уГ›ИСe+y Ъв+#ћ^чцБ”T–mВЃ5RЦО‘њVДqR`sЕИфїZГњWž|cЕ! jшвpЕŽcПЭNѕхжuЮ{жјтC‘ZкЏ(2ЄЌ№Tнд§КwЈЏŒвJ,ь0’ыИ§cjmе щF2o.„{УfичЦ†ћŠv ‹ ѓЗ„/Ш­­ gИZЅЅ†eyЉAhЮKyфgкИЊц›‹ Е2 Д:‡ p~ Љ…љжиы—J›}аKЇ…“ЮpF:чЗsяVFZѓЃ~YuОХИ­&ДєЩmOH‘m…Ѕ!M€T=ъžё“d– Е`эpЎzU й—=вВЉKпЙ{BrШэЧaU‰e4вyїЗЋдЁщ yў”дДъ9Ъ„н^ЩqЮ –ОЕlЕАЕ7хсk! Ÿ‚~е5О:.жr’у ŽАBно8ыœuтЊ=))ЛГ‘S6C b*’лŠиJIѕR=“яVfЇ6ѕhшLлж–QИœe.Щ9ъkбщrЦуkЙEU/IНјрŽT{Љ‰j}‹tu0ъ“Е‡}INГŽ ЧŽЦ З=ѕ‰\”Љmœ•­\’Ѓд“њдЖеЕеЏ=­=DLw“АRFЎѕ}™kqmлSщ”їžОЦЪ6yŒW=Ўу.ћЂ"ЦjрЕIѓrІќм•`Ју’Sгѓк{bЈлŒCqmИ0ЖЮеqдƒŒећ qлl$Њ#д Х+tTБѕШ^$(„”gЏ#šфйэ EAбЋMЙНЩўмњё8›C`N wšТЫЧЛ‰XвОВƒљЄёЏП=~ЭџvŸщYТ4Zєфгї$џіGšyфbЅeѓзьпїiў•кбіYšЃPFЕУ ЅN’Vсd(6ЩQРўœ23YшЗѕхс^b7–w–йіyЙp†уQюLДфwї$ЅI=ЮHP=;Ж5nЃ?б4•-jz>N;V;ŽŠa6ІМ—ЎFBHТОЙѓЗчыj.‰ЖˆЮ‰\ёсJ§Ё gџžš-§yxW˜o9“ovјіаь†УЩŒѕ&П/r‰mvCО…ЇѓшjЇЛБ;OL)D‰l-Њd8Ÿц u4џˆ,Д№nїћQіcWYIPџї1MўММ+Ь7›–єM“ щиЅФ…†н(є$vі­iЋ{MмwGIT) ШGd/Ўо­(V--­m!ш3Ў)#(Rю/ИЖUџ…k T[Qш)6иr—"Tvжš™N’ЙIWqMўММ+Ь7ŸvЛ‹7XЁФїROjB{іlі-ъѕ6ю|“н>щ5Чhб\KёŒП(ў4ЂSЃ#п!UЛ&Ы іy.Lо“Й 3]QlЋŠhЗѕхс^aМмдПMщЇ,lz;ƒ чЈћWЬ›уг"-:y”П,ЇаЗВ–в~p3ѕЧZв“$DЗћKыЫ*8.‰я”ИпХ|;3ЛXВ*fUеФЮjGџ4[њђ№Џ0оQzЖЭ.Хyr-ЦSf)!зVЫЅЬpЂ@;ЛўcоИеjxЉЇ­–4Wииn’dхkZЗ)iкЂЃƒœђS“ѓѓU‡žПfџЛOєІ‹^^цЬTЌОz§›ўэ?вОVт–0B?$ўŒЃA/FO?јЏ3'yГhŽ™w8Ќ­™O4Ї˜мTюt r­ƒпh?э›RрN†–qќ+Џ=јf bчu~”f"OТЕ• рЧ?кЯjГтЅфИ%C{kJчaх'ф{UœOє0nZЄ0ЧЈŽЈуpЯZйб+Ž›v–кПt<ЕЄŒAяS›eнњ+В2’=*W%5еі7ЌВОО.5ЅЅ=Oѕ $аYŽл,˜Ъ*r‰#ЁХvmР:ЅьЇ­pє_ћкw ь8VБд–мwZаЅ№•Œe#Бфњай—лEЖaf\HhB•Œћр{ў•д›!*AmЮЂАtšaOvUТR.[бЗkьюч# Ъ‰Яud/‘ъС?5Œu>%е•8сSyыўЏˆN щЋ‚@!•džќW ТЌщ8Є'vђsЯ^kkФ™ gL\ŠЩкІШћšхxC$;І[iюejJИ§+"’л€јoљVф‚л‰ РСЎDb’Fхd‘кО/6їЎ‘йj-СшE+Щ-џССљууІ!™E&№о љ›S IпаŠхЉ*VХŠГ№}ZєьЈ^rх]_š•ДR–ж€ryQˆќыюќгŒZme$žДMО$Ю1‹Ф^HгџBЙЉаI*їЋ*б ˜PROЌdŒfЊ;В[—ЧnВбхФiАкЎ юЏƒŽ?:š\uьXRкŠTвBП Ty5&’Lk[ ѓ”РШч„ж4п`yj>zF;Е’е>=кNe tЈьћ ­Qž)VyFh‚uwчЁ†НD№+Ѕ!\‚OЊЛf;vЛ№1T|еЈЙЧzА_%@ђs@r.у,95MтPkЪ мOЇ;€ЧNЕHx–њІ\m№RxГWeцB‚Sј–ЏOJЇюЬ1>ќ‡RTЬ5n'=UB[o‰Ещ†хы›\vкž pС<Ÿ№­-Ц'ˆ4 aЗH}`ŠžшЯ.§G|ЌЕ:‚TOёЈ` чъxУQBвЗЦ0XeЇо„я gІЉeЕ~’[ЯБЏPiЧ\gPB–’ •S‘ЦGlзœn6‘dКCКFFжА\Ювљз 4{,8Уїю-F`lЈq€p1њšБП$‘$gЏ"ИZЂэ"3Шe…m*яэ]А-ВЂ8“ŽеК0§іy[j-4ƒ’МуН7эЮ–р+ŸƒŸТ&К–аS№ехМ–ё‡[х*ўuУeШPуAХH}H(Ш $cѓЌ-j‘v:aЌВ \@сYћђ іmг,“Tу ЉШKVь#ЋfКэj6л ;щ=ђ’*5SЭ§ ІаУŸ)sЁ3ŒФ{Ќ ѓ‘ТxPŠЉ{s[2AШЩЌъWѕХslіцр…љDэ‹ƒ$‘"ГeЖ1 •8уmgx*ф’s€=§Њ1ЌЖЙТ8ЫjуђЉtх‘k# ž;U]Џ.ьўЫ„8RГщHzиK#)96п~i 1neД(€•ИЅ+IЋщи­DсPAXq*lс@Œђ3‘а‘ЯНqtѕЕ ДЂ­›Pœ~•3З 2€œфЇŒѕЈi5†L'(IJ/ ЌЖ.Šг9–’МЅ@ƒл#œѓіЎ‘ЗKИЖ™ УRлpe9RRHїС е‰Љ,,не’œrрдježуni&!м„ €€{VqЉV4ЛЭЈџCИПд7 ;вoћя"t}вk‰fDWc2H>bV’zє<хZš“Сј/Au)“-Їжœ‡ ‚†юЃ ŽF~еmiЉ2dDЬЄmPуЃо!п%[эO~ЮŽd\V #21ъ_brGЉцЕсBр+ЋssrТ|—Ц’уЛSбЄ#cь­MИœƒ…‚8љ†КК‚ЪцCwже{Š/9цФTs‘ЗŽI=8ы\џ)ѓл§§+r%5”зч$Пvs[СŠЏOіuГ&;3Џя![жLfr’=Dsƒ“ёДќе!х#ў{ЂПЅ\о ъmš^k(ŒѕР1 ЋknЁ!ДЌ$ъP И№œg?8ЭкЭsŠ?rWЄ№‹‹ўе2&У‡j‚qРЧНg~њЫ€§6^Я]žЊЎюкžLЇ qmУKˆ!Р•4Е,žљнЧхњћq`?1–Ыqn•Йф`чЈ#}Q*r\уумщQй•j,Нп“ћ–ЖuЧ‹vЈщ_ )чк~јч?жЙ1яrЂЪr\–cМъ†@) {“Ž~+™ѕ4џ –џЉЏўњу\n%(Б+Щ'ЎтŽSќ^е­йз”Аœ|pћпіл:4[ЈžхЧћЕбЋšЄ<сЫAе)*>оТЁ“ЇКђ–хУАЉл}Ц\Vе ‚мпu…,ŽЙчтЄжШQќУ"=ŠQŒєT­JмбШЮOxЧoŠшwJcтмёюK;Šœ,œ|bЛqЏSmВz+ЊBЁЏЛнЄF‚™ўSэ!чPЗБёGю5"р`ˆ˜›\e уžІБихПЅ.Hr)SАV —й$œэ‘PfѕћЊHJ›9ј­yzНkZT {ŒŽiн'ж>(§ЦЄZž,XиŸh§Ѓ IЗ'иїЏ=INХЈnЏНy›pаeЙ6‰влм —PЖBvчъq'љUa|б7g. \(Ѕ‡R—\hњ,гКOЌ|QћHфi I;M^˜—ou@… ЭчвБьE{Х97‹ @'мф3uЈЌэRљм{{зKФлНкФ ;c…ŸШћmRЊ%dfя"k3gТ”т[nХ6 ћюPЇtŸXјЃї‘0Н%гђ)AIђ§D§Хr?n%Ј)ƒІZCг0YARяœлцГъ r$XІ5ћ.c`ЖAR–ЮпfИBн}џГбвЌJ‰$Jд#–оJ”HЧn>ўсн'ж>(§ЦЄqЕ€МM>ї~МљВЃЧSЛ 9ШBIк0@ONУОjЉЋWOзр*>ЁšЖЂЪЫgj…wкT„ёŸlђ3зšљHџžпшЏщNщ>БёGю5#+/”љэўŠў•ђД%#!Ф+рўbБ•ДтВкёEўЬœžЂ№’иыОУK­8…сТ’Rv)Х~ФGИ"ОДœ„EнjœyXFN7#Б—РЛб§krJл1[Jš'?‰Є(Ё;†ŽљфœJцAгЗK†[pДш8ЃљеŸˆbмЅ }RR?ъ5*њf††\ qЌ zуБЃтЅa^rд;W}ІSД4€vЄ`PЁСb#~Td% 'ŸšЪњ0ŒŽzеНЫrнi~SMЉЧœЅ d“\ѕ:Ѓ@m}DвžPŽŸlі :roЫ<ѓгэQйв ЮвIіэQY›хљїЇЦ—:<Б”’’yЯˆўu‹Yjт Cb$ДИїФ с=ШљЌSoŠ-ЉХ-2Ы|}Ч/Y]Ѓп^]†”ћЋNTД/V†™КЕЃnг)‚иxя[ъVy=?*­[ИHД]Vєu)KB+Ш$|жЯжЮдW2B\рЩPlvЌŠJлЄ-Р•Ї ‚>*IfСžП­S~_ЄЋщэ2c/xЮХ•tє9Ћ:Lїр5Н0жГŽ2ЌЬѓ@JиeJH95јѓ  y‰ЪOb*RK‘MKJbЩ?mЋz>>jWbqr­`МНюr:Bјѓ 8хюtl Rr<ЕpДYK’оJ]#ћ#?­mы{dЉ‹jC !Ж“И‘ќ8фš„о#Щ}Ў ъ6а…ЋіdVKPнHнз'“\-Cm—oжРY(ЮTЊЪмцЁmХЉ<Ж“Т]ъEH4ж­ИIyжWфЉ“ЕаЃ”gуо€ЫrКC\Е&€1ЪO КЇ`4ЅИЇšрЩгбoRсO[{бо”Ÿs]=IqgNщљSоТ[ŽбPчА§h чЦMZ›DE@†Д‰ŽvRRjЕВL\xэЧafLЇTR€шOAѓQyВф_//J”Ѕ8ћюЌžмџ•_>ш_ЂŽ‹ХнАЉнйPќ ьЂ=ш їJпбЌY-pм~\ч~Њsƒ€ŸьЃ5‡Ji B‹ыв‘аЃѕ0фn6ђ{ƒвЏ~ќа HС4™gЬ”|ыUй’ЪЖ”КЂ?Нъuр6ЄњЄ›‡Gšа>Vxм‘SMwЄXПТ[Ь4„мPнЏнџIЏ7ОЉЖяšб\iqмШЧ B‡њќш`мЕУuЮђ’S‚ыzЖ\ZCёвaЉР•ђTEYъ1ЊДФyыHЁсьБдзNэl$е:ъ {šoyœ6Q QR‡?jъYuЊmСШ/EHq%d'‘šцЭrртЃ2Ы9VаŽšев­-лВмSiкЗо€щj‹ УъЗZ[@ТK˜ШИ­Ј(ЛDJ<Чк@ў!š’jцe ЖГЙ<-<тЊSxŒ‹м•M–јa8TF{є ЅФЮчQт ПrЖ­ь!`Є•'<{ж%€FьžOЕGtЦЌ…u[q`$–R6ЅX#ќEIж‘ДёЯj“šxg2щ!иічLTЁR0|НугЛЖqЮ*'ЄюїIЗnЮ8­‘ЪЫ.Д”ržЃє?ЮЇ‹l8к|Съ3QнUx6Цал@ш}…bу–žKiеP„Ђтžyє+ЫŒЌпкCшЅЗhў/oŠВє|˜ЏCSqZS{WžѕX™eЫуMЉ=PЅnљЭZ= ˜k%%Jќ^тВ);хL8щTTouD3ѓZ-пaж›И7х‡8 ЮSŸjкМ‡žhЖZ%I>’ZйzммлZ„я)уН™qiˆхdЅ#•РЈНГxК?qqщ˜NЦ3С>цПlz>DyЌ•Hd+їiY8Hэ]‹ЭонdДIuздf+Y ш2xzPaџh/џ>ЄчЌDqэъ]V•пзZ€ъ}Q6шуm: mjЩBРфрw'ЏZрP šјkЋbщuнQ9‡мjsP[8*AС ЃпЗЭBЋэЇгˆqЅЉ …%I8)#Ё„Ї‡”]Кvь‹Ќ?Ўђ]iЕ(ЁВъqЛЮC[lмйKjQXQЭiщpеђ*b'd{‹”Й—09)Я\Œœuыд ж;”VлŒЕ%ІЫ˜ШJ@IЭiЮе7”ЯEmЗЅЁ8ўgдЛ‹’A–кюЃоИз%ImНбгБ’ВyЧNŸoлЧз%JQЫc‚‘кЛЖ;X— {k€>cЉ ТBsЛфѓўЛkа‹rТ:ћRДaGUMынЯќZV{wШe‰nbNцРj§8учпђЎ“]F @qPiNcl“\0e2‡ GLy?Lъ‹)t”ЏaфŸjšЬRфлсИЖеk'ЮIэю3]4šXgˆЉ(ЪNQX]mж<}GujкY*€Ъw%ФЃ8Р еL3{ŽХЙ#z'?„šЖ-LzЅKлЗ 6†ж@OЦ* Ў›ћNщhFŽЪВAрЊЄР“i‹;HŒGa†žšyqтСј5$V–ƒqxHК5ѕЦяjжвбоrRЅ`-ЯPтЄbIe%N$і !šЋУы+­‡eею‘ХAozшв—мвК85аё+[‹†нmi‡Ю5їnз6жєГ0n xLm!Ђ wЯтЭдбw7э1• d*PП„ѕШЏ–чўгЙVЮі­”WчY ‹*г!Dd†ЮI? ЕI™ ŠќС# q $ŸlPЫђdЊ6bHRьZŒiШr&ЮyЫК*Oќ4ЌpeА.BюЌ™2дѓC*'5ЗЅS<ХВ”Ѕp’G'ц€еФ€)h@лм&O“0ьЗХ!=œwњVф›tF~kž”rw чПuv_ћН‘ЏOBщ•Ÿ-“xИЄ1SIТAЏЅЩЛн­m1Іпfн#h}Ц|Х1 œ‡Ј={WУ:ARWs}Ч]W<ЋŠеŒ›…ЎэиУЙЗ(№Ќr‘эš3ЏєuФк$^5Ѕ2Œ6§њMЃ$р$mVI8іЯЊ:Л|xКДХЂ ЁЇ•ѕИq)WZA(gКˆ#с>еIP R”ЁМП!zиHC‘]R7‚T•сDvЅЇђ–щС‡~J†ХИTŸ`žец](ыbюЬyw0 ОvМу”v;rzc$rzdєЏFGГЮђ[km H@$•ЋŸ$§ш ЇmЉ(ŒS”€sвЄъ9Nь“žевК1Qа‡g-jX9;ЙQћдХЦƒiР ћ`аЏnв-zT9kPI>У­E4 фjˆI’єw# ŸRГœ§jžxƒc]ћIHŽТЖЩB‚аOЧoвИ~Цњ+ŒђvЉ>д^sћe>ІвrsUнЮтЉ0eнJB†”:p*yЋmыИЧK)$Œcѕ дАбЯћ5МomЃИЧ( ш‰ВrKЭ+Ь{їЄ$tќЊC .шБNwъ#-Ц]JRUЗcукКК^-СіМвї—"2J+cˆю“ŸЪЛЅ7—Ѓ:ЩЗB”’ЇŠЗ Є&€–лДj4}e~\ЦѓДŽ9Ewєэѕс3ш.‰ `,дУ.РЖA{”З”О=ГVZ!ФЛ+ык—†‡Е^x•V˜ПЉ†гпМmтВBsзŠ›ј)tvуhИ ”„ЛЙ+QЮw šфxУЅПmщt>и&tAЙ=Ъ“мVя€V 6=!.EР).ЪwrRz„ња‰dЦyR‡ћИm^f3јpsгŸвЋGуMvJОЦ ЮнУдž3Ž3вЌЗдЪ!ИСd Ѕc=ˆС7— [›f*I}D‚{а›\—žл*(CXхDcєЎмXЏЉдЃ*W\дbKэХ№сВžЄp?:™ЁцсEmЙrP\ RГхЅ ТрUgу№YаŽmp„§C`э ДZ]i$ƒШСЮj#тnš^ІАLЌ љ‰X>єрЦ“VЂд!љ(?ГЁуЙшЕvOљзЅ.š…КрщТR’*чшН;LXX#pѕ8ОыQъMmj–ХЙЧi.89H#4aт6ЄЙЂоЗТ<ˆHрЖ•zеž„ќ|WЧ†’ц9ЉбЇоЇ–}=zšбжržЛYf5!•…„уІ;цЙ~[CпWє.:ІіФЧAЭ~ByЩq‚žkЪppG_вЊŸ4Ў­ХЉМЭi8yДёцЄwћŠАМ7f<Ю­)FКЎАчmKNЎ2•P‡ћ5IџезhJШq%x?#хW9Ј{{уYьp-ї)ЁFK.Iט1ŸЪКвŸe‘Йе%)'ЊєPžЇЊЦgЂМDYaд…z(ђЪОpIХI5lЩ1\aqŠƒxЩj"FV‡›A(IЧ–œю—ЗjЕrМмй"4сN$Ё'ЊIщЮ#Ÿnj0у GзХP.5iV ђ OтызцЇv‹ГWeЗL%+в=D`Ž;зneЂзrŒг2™C­2pиJŠJqAќОFєѕGПyвйлAйIюЪ2Ї5zqBUЄ7•+ BС(VAъ3зШЧOn*ф5еКb昨›sЦ” c‹RT9N:чЁщѓSжоnC y•%GЈ­ћЊДjгЇ(GпŸгЩЋw]WЌъEa3ю%–жуиђгЩ?М.йzJT$luМрžѕ.’вŽуn ЁI еcw‰nЗОДЖђвн§ыDз8sœњkєDЅ;В•Ї==ЋЎ›ЕР9”=х„ŽюЕРђš“Њb’ЕЉajžШЉ#,[аъW ,зџH\^ЙкC’Gя­Єу­uдщі>ЦДєљŽmmi)kч­tBB•Иі 5“”8\@s?ˆšу5~+лжјЬ— Ѕ­ЦZN[pё”ЄŽSЮz‚1ЦjВењТс/PОдtЉ˜p\W˜лŠєПДрЅ@uO Я ѓVuž-І=VgaK$Ї$žќї­ŠіЕ(Fžэ[Ьу…кј†ЗзŽ[ѕьЋZЅ­P”T€ъˆ рфЄЯLфёРЏЫ_‰Г›Йyw(.ВЪњ8’їџЪП|KгАЁВ/v-ЩЌ(Кћл№TвRr’ž„œў. 'еУГInъЫn*9HX"ДiSЏRПg љ= Е­­нЂвБ8ёјџ'zѓЊнЛъ(Ѓ—ЫJ+rjИ­jѓmьœЉIЦj…зŠZoP.Бу–ŽЄ—ЦюO<їщвЎ5Ћ†ŸeцŽP}ћgЗпоЖ' S–‰Ќ3‰^вЕКRЉ&VкЦ:\дaщ…EЖїcљт кцЧ-ЂркJ"В Ђ’Ѓ“Э_јV™2&­ wиwЈ'‰MД›#ŒЧ(1ПџсšФж3йuќ(ж&AZА‡9Ц*sсіЃџДvѕ>SЗЎаzŒUQ.љmSmФЖmlДHqвкH<sлЎxь1RнЉm–x+ѓY’ыХG*e(к NsŒŒп•c9Њsб=ЬмЇaZ­.к +ѕ;ї=Zˆ•Лt”%)tЄї#Жk…тЭўeКад›ЗЪѓ”7И'y'žOХvЕ–ˆMўhuYUН IСIЊџZшхкXŽЗ&ЩvB‰,%Gx=љш9пš–вYfД!*’QŠЫf—ў‘Е“ Ѕ‹Žœm%c!_\ŒупhЩэU–Й]цE­o^у­Є'нR’•€ЌnыЩцЌ NyтЙЪ YъМœ tИ>%мО‚ЦћLИѓщђ†1’“ТИ?ЮД]g:‰.ЉЇГЁmeRSY“OхШЅЉJVљфХ)J<oС–дЈnЉЇк;Дѕ§vЉеŽйЈ5D%мQ5Ѕ(ЌЖw<”(уў” уЏ|{є"ЋъГ<дБ­ЦEІaB!РфuЈpVF Iї8N?>r@ %vНІЂ ХКО‹–пSGb‘žјТ55гЖєлэЋjs‹LлЫŠHТ•ŒtjжY„­Я€ ђBћƒŠјqѕЬ1›ˆМ”œяPсCл5Ž…\ЫХGOВoбшg“`L•F!№ŒHK­,%E'БїћWrgnqЉkKhOЈ(Џ AZQaІ3aK%ЧTr Кы_7иKБ~•ацВ)87Эcc€куІRйќ $œœђ3UФНA+SпсБЗЫ‹цЄ! {gНjk 2ѕŽcЎ$•CZВкНГиз_СћOзjQ%бћЈуv~h т %-6кRќЋ}VЖѕ_OjERSœрŠћщ#вЂ~ј *ot4йВЎжЄыcдЖЧ)XЯЗcTк‰>ЌїЏRk%6жŒЛН0-Ж ЩЧЗ5хшї;{—фЇ‚*м@BБгрPЖл•ЮаЄНзуw%IШхS+ŽДЕъ+!NЁЗљWf“ћЉБ€§BПЇаз˜Ж†ЏS'Ад”У(q)XЯтЪy?GМJ• џg2ЉoЪZ§jZо m#м8y'уч‘Ц@йгКввлNEŸц66љРU“ЇчZІFi&!h‚‚kЬЕћИэл“З9Хъы•Ж<”Ѓъ[sЭrЎ7лžM•9JBМЁЪШ'„ŽMyщНCxB Eж~мcRрљжђу—œ]Т*Ѕƒ•‡”…ю?Х“OSг­hЯё‰jбаЕ3ќ+u№•;Є?&ЙŸњV}-+eЉП?bжі@=‰FGЦEDч\ьУuЈкuQŸR}&zеАћс@‚>?У­Gш ›Œй7)ЏLœђо’ђЗ-Хu'ќ‡`:ZдЅЅ)@+иž \cЩбі€Ъ‚в"Ж‚JHѕ!;T9і)"МwV'ƒ:ЭZbќ"Ъy лf(o[Š!,Ќ…{xёи“„аЫCњyЃsЏr-вШt…2OђЎuлR:п—мƒНСъ??хPщЗi.Ъ(R–Ц2рt“ŒрpsзќkIEe—QЁRМДгYeСo–дЈЩy-:0~ѕЮ‘ф-ЦгЗw\{ћж(\,Gl 6сkїdрчоКo7а(gyЉM5”aRœЉЩТk  uJмQШ<ѕЊэn&уpšВGЋ#­LЕEЩЋEМ>Ж оbУIovаIђ{pnИЊжсtGдbC Л|ќџќkTŒ^.ЃgZДuSŽQ‘;іdЙ–йА„Иў~ц•цlR эšш\ЅЦiЏІb$ІюrзяїэЩчk_R)Љв[qжгвGЏvрHявБРŽъя*pПц!ОuvьECЋY3Їa^Ѕ^ЫNђЦБ<-Vv#ЪhАтQЮўцЅк1­Анy'-ИЏNj!Ѕ§ЃЈЁG˜ѓЯД НЩqе(!GЙјЉюЅКБІЃРŽУ§њЖЅD„ЁДŒeYџоЯ‘HTRŽЁseR…UIяmgћђ;rKЉqH<(тЗNР”4вB[O8Тг“Up‚З‹Љu9єЉ*ЧЅtnЊ­зТJ”‘ž*УL‚ъM]92fE 1є­КІещ*p„Ћƒ2pHуѕ­x‘вќfЇХmЩ-“ŒЅ*Ю2Fvѕыё\ ’ƒђeМП§ЋЮ+йQЉдQй†эОBиŠ–[ZкЗС$`x'$žНNѕ­“GNЁшoіd!m дVќ,ќŒ—MY. ЕSI)aCљ+R4Y—З>`RЙ)ЯOЙЎ­ž )Ž)oЌЅЭФЌїQюIїЭmЯПЗmxAД4†“нгджЩч‰Eš!‰ni‡х r~keф’„ЈŒжЕ•ЩBJŸPZ•‚šпм ЖЋ„ЋљP CѕKЕ=є*!п`*cПШˆ{О ''#?џ ŸЏ(ZаG^@>ѕеж˜’уЉO”Зž їџЯц€рjц”у*h[n „xЩТ№эfЯkCя $•ЉDvЅo’#ЦSQІЖј-Y5†Шъ|ŸЂp!sRЂвO|ѕћs@|_юRnѓк‰lѓUИКz; щ}>”JArKЎ/vJŠ?•Do6Ыњnё–м,%ЕюJzЄŽ‡идїGОфЙˆhЖЖоkў.GJzЫяg HЎ6ЌЖ=pЗсдУ­w€к+=M|Є+Рї4tнкdf<‰1ќФЃ RsњW6уsYSjb AдqИTвњелЬ+ŒлeБаm5 œ/–ЖŸŠ†ћ\уѓ 6›дBЁСccчJJqŒќзnH›kДFi„•Ич­Х{‹YgчбШDчуЫŽ… Ÿ1#­МsШРћTЦС.фѕЖkГ™Ю[I 8Е&ы9џЎЪJТћuЉ4[Ф Г€к;цЁ‘`нЄм$/Ы ХYХїЌ78hf@kЯ(eД•ОG$Є žœб,‚ЮiдJц2ЌЅ`ре-Љч%›ВтЪmIVѓ‚G­ЋIРЫЌЈЊ7”JЙIƒЯ=ъОё2W[jnАH;ЌuШъ(жЗЙчъfR…„ВЃЧ~œTсЧb6ТЕ*sпоЋXЋnŒWCn)ˆŽžѕeY4кЫТuЪA1P7t ,++)EЊ?—щIFqг­aО§xДЪ§‘х§vЯнy˜Ц{ѕу8Ю3Цqž*5/^YйˆъX”7 ­Љcp1ZЯыH3lЉJx>р;––•ЕМљСчЇќтВЇ™KбYСoaS…ќˆ’є-ђчq ЙФ!/НКCЩuЌ€Ѕz”?$№?*™йлtэKdєЭGкОLŒл+fZARBЪЪ3г#Јћ•j™ѓбІй— ЉOcдќDVенѕKН:№ДюX)Pа№p5VeiqФ*CjhЉnкAЎj+ЇjеС`%Є \у€qŸЮЛг5J•c\‹ЬuДл-—Ѕ'qH'ЅUЖo­RІ<ЭЮ:­эI‹--љ…-ђvИ=I>œђGЖM6е;*б›xIяј›yнjъ—см–Eк–•€Rx5ЭŸoŽ9ЩтПЉтКв™LlVpЄЌЋƒ‚8<‚8і­)ЛЁ |•rVxтНekz7QZжW#кгЉNМs”.:}™Э!і!cАЎNЃњз,ы‰:Q-Ј Х)ТˆЯњэ]pЗ­ ЄЉQњŠхы)­ИŒ6B–Є„ѓžПЮИлJв•ж„wюыѓ5юlЈ\СЉЎН9hCl&‡ž^мЛц0xЦ2ЯНv˜e љХI)GтЈю–‘%ф)Т”р’‘иœ(Š™кЂЉИяА•КI]Ѕ­-ЃGДЋОo‹чю0ВГT)Ј'шšь˜ˆZцвUіЎ}цc–їЈŒ‡BКРcкЛБк,qЛЎ{з \F’Ѕ:ЂЖв =+Џ ŸiCгP[Й›“г№8WНIvŒТDvй@F{ѕћvЊ“PнЛNuN( ''ŽчЕMќWИ6гQ Вёж|й €RІ@с)WОяХŽиИ5ZW˜ЙЌюk:‡/‡нžWjmеvџ?ˆЅ)U1JR€R” : Н]\.ч9@{ОГўuшM jыЇЃЩFТсFз“”88#ЉРю3ЮЏ5жФr KjT7TЬ†•Й OPзjеОiRгƒщ&БЯu)IyIР'П8їчфkZс.*;†kс_RЎZОB7Оњд9У_х@LueРЪqф8ДЛДэѕЯпНMќ"Е§™T’œ8њЗ|‘кЈuKПЫHŒVqГkc&Н?Є!ЛL[#Щк_C(Љ#‚Ќ уŽ™ ;Q\Ыj ћўuњРѓо88РХDЇКЫCі4%Gn3‹­xTv‚HЧ?ˆdЄдgиqb9уњ”}СЭyвЩw›dœ%лž-;ДЖЁйh=RЁмшG ЙьZ•‚.цPВ­ЇrpAіўbЖэюmшF]МsŸw#бlк5СqeЅ oZ-J?ецИ]JAsѓХOcIfc~dw‘ўWZd4ъVд„ЅЉŠ$Ж” эRqяЯ#Ў;TЇE<„)жќбы$žsZ4м\Vžђ5cZ]КФŽХълсЩ–аuВ­и'>рŽEQRиHZ‹ъSnЇвЄ#Ј#Еz@ ђ*Ѓѕ•_ч&\„!В”„!)ЩТA$gмѓзЕQr–3ЬщьIO[§?БЩ‹GqNњЩќ9=lкYmVр…z6чŸœзуCЩ€T p}…gЖ:€Ї[=ПѓЎkLієхaV9 ГптNмЗкlЄЄрр‚ ‘щVьи05Ж*цАTв’—[мJT 2ъ3Ž>*Ќ-ЅC)HЭNДй7н06ЖсЅl„рwp{p>љ­лJ‰њ ѓ~вQХЬ9’WeДFЕ@LxЉ eэ*ъry'цБj ‘`YЅHœЅшO;FI$р {’@ў•ЏЌnnиьэЛ–м}ЧCI ЮбС9 uс8ъ:е_zе3ЏAPх–pм”!CAT{ŠълSUЊ*м{Ž*з Д\тi˜bOšѓ+УNЉN6€@$‘š…ы ЂДлJ}LЂYZМД ИRЂ’A8фŽ€ŒћзPоaY­ўcЎ‘щ;R‘• №?­QЗћьЋм•9%^ФЁvУчŽј­ЋJоR‹ІН%ЧсŽ~ўЂкqЕЗVљєБЙ’m!т]жРЙbRh1!j{bзАЁХЈЄ€p $”уфcœоћGдчђЌБ™у%ПPІуšЬT†ZSЎ:gŠ т>ЄИX NТкIp67ўNHzb ж›§твм…ХžІ‹ф8юќ9ЙGПЈNy=ъKтUж<ЩБэЩh(mљЛПё'ЧѓЭpЖG\`^в >ѕъ65*2 мтž^ќћŽЖЬuщJЃ{ёЙM7ЋzЖПтC™JSч%\;мэЧёЯn•XјЙ­eщЈьТЗJK“dю9_ЋЪoнŒ№Id›„ЧeЭyoЩu[–тЮI?ыЕqіЅлнNœэпЊLхЧ)b\I6€ж’ДЕэй.…I‹,ЋIхjфсGј†OSƒ“žФ_QќYДмm№йƒ?Ы‘!д0†”‚ V0ічќ9я^WЅsЩ=ЗЊ.2 щFф!AN”Hj6ЛrŸ™"o™.\–ТP•mBВ0J€ТpH 7c№ЗФ$ъј’m†‰m Й†СиЄd Œчd я‘м{7YVм­ШЪбnZо@Jбž§ѓœ№:Ю3S ŠœЃ)pЪ7,-Uеxвo ’ Ѕ‘mwшfГхEђƒHкFzrN{ѕ5жв’"\cмЂ•т:ж ъ“QkƒIIYNР>+Г{г3иЛЩ›уАŒ=.ФдJЌjT–‡•ž&озА…•HЈpg&§i‰kOHm”yс”’АФємёвЛо о‰ЄQ*. ЖyўжrJЌМUuјV‹ѓ^О™IwЪн‚­ ’GЧ gцЛў^эњŠЯ1™ъ_эCrCLH Ї)нЛќ\{д>.Ÿу_­ТЬ@гШ%Э‡uЎ§ЊSHˆŸPŽљЌ.ё™9Ÿn+іnŸКљ_Е‰ћ„6VЃц œg%9ЯђЋvvгvЖѓЇњ]Н}wR…=:šFМGžИЯ‘o`yjZаъ”}’OJДžœЈЦYRPДюQW ~UW]мgJZйдW'PC…ЂгLЋ.,(rœ рчЏcUїˆў)ЛЈЁ }™"Уq8}nр8рўЧс>ќфєрg5)J~”ИГХm ‘Љq)C‡ј7|[ё=в:­V)m­DI}БЕ*HШиpz’8ЦH&Њ*RЄг3E}qоKЈЄƒž*ЭЕk”ЦгL-–н ђHN ЧˆЇ9љЮ1л­U”­ыmЁZо:#Н{ЭЋ[ЪЖВеIёљЕ]˜›k.ОЖТ“МЋ$wћcš‚HеV™К­ИэО†Д!C фѓ’}К єягšЋ|з6”яVвrFxЯњ5ёWпm.ѓN ЅЬпИлUkEЦ1QM4љё&КUНьИШOв<ВЂуЄ€књёР'ŒpsРЭYњЂ§ф†BRё;Ž8OЯчўчК§ƒpj‹ Ик6єч&›^­М45Љ.Ыšgˆnл<јСьф…![Gлœѓ\KŸŠo<ЪЬ8%ЙX§гЫw!Ѓ‘ъкЈћdум•[ЄЉj) ЧњрWХ_{Е%]iІДЎewVтОSxO—љ6.dмfН.kЫzKЪмЗдŸѕлЕkв•Ъ9Ђ”ЅЅ)@)JP R”hя­•…ѓЩк ўuб§Г$ЗАЭ{oaфЃњз"”‰сЖŸ™ЈЇ™lЫq ФuЯ28Уƒ9) Я\}В+в­"ЖЦ9*žџgЕ щыšЄ—S+q@>  SƒcƒњjœkcIZ ‰^Й˜ь$сNЋќ€ю{|’ЋџhMEѕwЖ,L+їP€qя—T8;$і8ѕ|UG[7)вnsŸ™=хП)хoqХu'ќ‡ЧAZд”ЅЅ)@)JP R””ЅЅ)@)JP R”Єњќ›щTя•ѕОА瘪`Њ<€zv$ ŒRЁЅ%†gNЄЉMN ЖгgЏ "р‰-Ав2пЬ?‰*Ю pFШ<дЖХgЖТ ‘ТѓRЗgšђž‡ёёЄт.!­ъ$†\$ѓœьW`O$G\`’kгоэїн+UЙцС}8}ђZsЉ r іф`ŽЌa„[uuRъЇiS‰#UњЁ&[ 8B\p$‘г8'ЇZІw4ф'жЄњТqюЯШŒЄКЪЖy›AЫgn9эŽ>чZq$,ЄlжЅФ›xhє;:pэ#,Йcђ5^/yО‚€зsXš_бЭмы™CќgиŠћ[L !Eв*ру]$ЁћЪ;vЖТ•œї*вЕЄЗn;TЇ‰bDЧъіGѓЉ‡PўУ.;х%l;€сЩ?‹ЁЮ<}ЊОЕЯ‚Z>Є§Z [н•gЅMєж—Йн ДьŸ)˜ЏЂ Ю§„ѕIЧJPŒѕf#iзЗT:яsџщ:ЙЉЎй-Km ‡<атR RqСџЪЋwЃnVщь˜ŸQ-—нцАбVy~:ћќ’РдV]%ЈŸГмЇЧ„кZYCю‚‚Hќjу9ЯЯХWў%xц%6Ј:H$‚“1жШќ 89ЩъЁлЁЮkЛk[ЛUU’MЃСЪтЇfшЦONJ—]†уъX.KъKhѓќещR;'„yj7JUs“œœŸ2–лтХ}Дткq4Е!ФЄЉ'$t зХ+ ГBx‡T6XНКдiQ™C%чс№3ъ$ŸХяюyя5єВЖдвгGЕyzЄZwUЯГ5ф6ъŒnp)ч(О­i:Vђи–ЕИаh~ё|œ‘Q]oт VYђ-+I):ŒЃ‘язŒд7^kћІЏ” "4d„„ВиёžЋЦOSЧNœgš‡Vэ ъ”(ЪŒyѓшtcДgJ’ЇKsъo]ю’ЎВдќЧ ”THOdфчДiJд”Ѕ'™<Гžо^XЅ)Xf‹%јЅјЏ8УЩЮзQJ†FчЁЉŽе/XnR}>|y˜њ……:9 J;'# (8"3J†“XfPœЉЩJ/ eЧ_4ˆOXйЛ ЅY=Sзш;Œї5НЉрс$эР#žO—\МrАо,ъ‰rЕм›[ЉУA%\ИgмsмWžiN$Ітђ‹I^(F…угkyEфЧ—!фВqСкG^qЛЋЗЎзЎЋЙЎcтzдTd%e+ЩрŽƒ`vуЅhвЁ$–•J’Љ-SygoNъYі-CѓЫ~\mл€T•nJ’s‚ сGНYз_я/ЦKvл\X‹•:ъј'ž•KR‰cŒЄфѓ'–toЗ›ўтЙїyK•)`$­x pРЎu)R@Ѕ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R””ЅЅ)@)JP R”џйmricron-0.20120505.1~dfsg.1.orig/html/images/examplefmri.jpg0000664000175000017500000002617310431073616023106 0ustar michaelmichaelџиџрJFIFџлC   %# , #&')*)-0-(0%()(џлC   (((((((((((((((((((((((((((((((((((((((((((((((((((џР ,"џФџФ6!1A"Qaq#2ЁB‘С$Rb3БбCџФџФ.!1"AQaq#2‘БСЁб№џк ?ќЈ„!!@B„„!! шœ”Ф+ДєЫvхУ муі[НєжХˆƒэМГ#8н} 'А%v_Ї4aА=yЗъUјzWLŽу †Нию?|]юN‚г[щ!kJ[kєцŒаНаЛn{cТ‹!tCєЮгHњWхОrЅƒєъ8jz—ьznЮ №‡Љ6єŽd…в5?гЇGTЫV]ўAё…•ŸЅѕ№y'ТPЏKЅлŠc‘9ЏСTмвзG!хBB€„ !BB€„ !BB€„ fЅоNy?9щ]кЄсђћ`“ђКE=(Р=*1В(F=јї)јЖd=AЉЂЫžЋ[9ЖŸвїЇЖШцŒБЄђJйУг•)<68ЃœД ЙйюДђTl_ИьртЋX˜‰™q8Ш F_OєjmXЛ’о‹Ь^“ хМ—СgЇЅ†М„OZ6Иџ4v?uЄŠYоѓЗкгиуЅДS$bIxЯ<­<БдІмМЗ!UзнляђTfК=VЈ^г,*>дЃжcГž ёєЌбѕ69ЮіЩѓђЏjњѕJФœ7ќъ˜­>Л4RЙŽk#+aањАШЬ8 %–+ хйЕЃЙ фš]ˆЊНЌvуŽ3с)ŽyjГdрДƒЩ( Бж˜жМэ н­35Ÿъ йхA­ђŽV;х7ЋqЗы;@žЙF&Г^л/ЄџL‚ц|хN(z.kCнZъКЦјёПsл ѓц&И”АЕУЛJЩS(жЇ№IЙJi\ўЪj:5]EўіЕЎђаѕиsхjпVšЮі^ jЛіЮс№V$ckєтЛР qa 7ЎtѕZ]P—€9 ГЭ,ђГ%ЁЇьЊНЮ'Ц JѓЅн2е3‰сsВЄЛ§§6НжК7Фвзq‚?ъ>…’ вб%Э%Ј Йb|Osв8 ЏBB€„ !BB€…ъ6ж4d“€€ѕ Oš@Шк\уЦзщн!ŠўНї–7РюžєoJ§4MЙi МŒ€|-mкђ?вkv†ИћОBнSКХђlЊЗlд#ђ%щњ:ЬŒB@ђяЪжзˆŒМUЂ'”j–Тштvз2КЙЪМ:KIЏNТXеых•gk­кlp5Юk\7лђ­Рё]’Ф#ѕ]Д}‰KєћђiЕЌ2FНЬpіу§'ЩIЉjЯЄm'1ШќrИПWз›ЖO–Pѕ‹n•ГŽЂuн*?N/kˆYНgЇЕKS,М3=‚v5ЅгкшО<*UњІ9}В<5УхfR 4ОŒYѕЌ8ШяКг=ЯгыћCZМVж?В-П”ЇЋ,N);нРС@<г-Ik2JёЗсxЖЪЖXK Я•Ы*ѕБŒ™СНŽJЖugK |rfO@mьtѕy{4 ќ+”hЖ„%­р,‹:Вф[#•ИpљђЉjWrFМЗ 7ИѓЋ.њzЌ~“РvpVžŒ-š“ ˆЩЎTлR]д=yy>љ]B‹§*#bv4у'g{окэј7ЪZЉAќ?є€гtŒёп гg˜8њ‘хПeWcЕ†Р r{Ї.ubжхЭхxh>љ‹ 18ƒфЋKЬШ +ѓе†Hѓ ЂtтFX0PXЈ guNJгИ“И\,ЗZб‘їRњЮєАі{М”SщjWY;мЦВWyј+˜jњЊПіЫЂ‡Л]ЏМO KZ|n…Э1‡<„ч’8# тщњчHAd9ейщIрХs›єхЅaбNвз4у”d!BB€„ !iz3I}ЭI{=Œч‘нCвš1е. рњMф§зYЃNЕкжД1ЃŽ<ЏRmщЄлв#:ŸЙе+уtxЮGћ+Рг!%Я?уьЋ;LичXiЦчmtЪІ} y]N4*Žћu/ЩзєОšБзЉ?ъєU†мЅћ<+’Eћ[Ш$…^FЕГф ,лvн­8 F]1О™W/ К‹гй^лкј\6рЌіЯ^ѓdЧcœ|-Тщ[э$””д{ЌЬУЖBТсо˜“їrОЪЎЙZEr‡SЫhznр8хЭO ’w“УZДJ2ЃLŒnKОSXєJЫdpЮ<-ЧftэUŽЭыШЦу;Z”kZŽЂKшШэм9w>>Јih$=CгбK™XР9 9чMєQš ћ<“ЮІ‘‚Йkл†–ѓ•cЅьО-Dеœф}гОЊЖкдщ‘ИŒ€ЦыZ<6чf%Ѓ<…’ъQl.ul–Щљ]Ї(:oо˜g<ђДvєіфm€сн#ЃKaЇъ$ ƒШZ JŒаCЕ…Ц1ўЎй`вЕ‚qˆмyZXYЈУ€€ч+нu†ˆb-o’Vž*ж›ЯђТвEN6s€т&cм*К…њr3wГ>7uxзJv“с4БEŽfрkZ6Aѕ ч§]@ЛFђЌTЇfшфi+%oЄий\chСљ№ш3E"yц[N“_ŒА~и=жЮ ›€6ѕ{L“qp$-ЃnE RшШпr;tм•‡ъž™”o!ЁГЗБ[;V6dєЖ“ї+ЮЁ›.§ЇPœЏQž”ЮŽhмвгŒсU]ѓVащъИК6ИВх§Mв’щ­|ёбgЗТ&„!!@BšЄБa‘0\pЁ[ЏvfгxhЫrQ„ІѕАt~•бЋщškХxnOŒЂ8TeˆœEvŸ?u+!eгыNб’0жќvd?ЖоW&žл=IkёіŽЃ Ђ$ЃmЏž‰ф{АюЪV *]Ь#9 =ли{˜гР8W“ЖыНшшЕВ;YЮЮIUNfŸ`ёЩTцАу1ЕЯ>p­шю,{Ÿ кт|Јv^ВЎ‰|ђзџhжчЇЄ0†ЇЄТт21и%–м ™ї44‚?+Q Ѓs;ŽRZ˜.Ьdl<;Ј}B˜SOt›idmХщlcг}U#lGZQыХЩsђпьЗq˜,ШXр\Ъ]XтŠжœv’ЦsŸЪoгКќьsЋъ,-v'БT ~YТdЮ›эŽНЋьЊаУ~UAЋ2гŒ,98№Б}g­Э qУ\fYŽ яEirCMГY$Шy$ЏHс%xсдуyсФЊJђ§B(лЫNНDЖЦЗ`ђг”к]:9dcЫApђ€ГІW Єв8QQ§уу)œ -Ÿe–з |6D­ƒ”nІвв G?*цHзЊжПРWъ\†ZsБŸ9XэgЊ.2дБзdMЇ“ўс9№–ЭєcЯ"]АђimIГПd’}X6ЫcЪЬ]зѕ qlЮгžьрЊpUЙ4›н<€Ÿ’ЖЧљПmoћ—HЛ[m#ЅCq“5 ьЄtЭfsŒ,TїLF8 cл)УwgЪѓNуЫ%;Gl…Љ№к~Q_m3ЅіЭhеЩjЋпСCqБˆї0‚Кк$ХСХЮЪП%'ЧžШj"ЉВУŽсEcO #КїЃПщЄ”;ЖTŽИйэ–Р№€_QЌЁl=Ук{Іvuoч•[Pƒ,'$5Дѓfwч-ŸtфTp-=ТЉ­PeЈЬrkЦRCMє.5Ь8aюџygkF@ю€сYгђhіK€Ь.>вГЫЛѕЎŒ5*‰€Z=ЋˆпЇ5.†v–НЇ ШB„Э"ЃюъУw;ВыєДz№К6ˆ†џкХ~œщžЅЇ]“;cў'>WZвdг­5б=яѕфn3Чž ИУК8TЛ'ц^?d\cг ёНk#НПЏ„,Е“lэДpНM;‡ю=зСЅОХвкюpˆ/yЮЋдZEšАeŽ#И ТІЖыЃtьЅщIьЛЇ­уі%6jn1œe %аО{ѓт6ћsЩ!SгKЇk]ЙФј[2ŒuЁcђЇbtћz‹vфШпVkЬ–Љт чьЏІщЇw.*KzhфЗ…9Ÿўчk {Ѓ–w ІЧЧ†=jКзиХGР€Жеy6Цs•,rHI2rJЗЇМЩ#„ПЩZБHm/f? “­`нjѕ+{Kу§žЫ•ЁЏL[ЌЭ&HЄ ЪЧ—ŽРіU5Wе–'ЬAŠSFдU]e“ф6FуwЦ2”j›c‘ћиџрZpBЂЊiХ>~<Ё|Ис’tуЋu lЮѕ"ј§—Fъ-MК.švŽЭу ;њiЂ ЕўЅќЙќхl5j5/Ц[>+i^rЉ šБГ`Иnv1ƒТноъjетk› 9PzoMugˆb`Рю6Ÿ{ЕЦВG@ 7:6Н%Т XрпКmЈАYЎIј^tњTЁŒОjw#ŠЛ‰Р 9ОГЈ[Ѕ$• ШvО/K&вф—œЊšЕЯЈеіз`ф-is оў’зъНп\wBЊƒŸЮЪџвиоЭ VWk<)Ylv=дlˆлЛ+­юз%ЌщR+нЈ$ixsšіђг‚о’†УЊ™­ђРялqюсїYџъЮ”Й­olЈъыsTsР‘юˆ4€Ь№ фГѓёэ›Њ˜­ќВ­tўи+ЗроXдй <…ё–ўЎЪцйе5іЙБeoњZfоœŸШr СсБњfGЛВЇЇFeЕ,Иэй7е„QФтвЃа# Ўщr€–hЫт„ЎЄ~†Ђ9іИіZ4S‚ЦрŽѓZл_Œ€P5(УІyT$S;Ѓ8'КНnSО)ˆіwUѕI[<`ХЯс=jЦhЬя фpИзъ”fВ†‘п Іж’v47sšбу+9њ v4y%sA{{„B€•тtг66Œ—(жЧ Д я_e‡7ЗžGtЛІtіPвZРNчr@9чьЗ•%гЋT‰Ь„5хœ2с§е='DoеЮ"Ч ј?d§šmrq€Jн“rКIЅЄ–—ў“яЫяЊ5CрЁЂчиpфЋЊЋ: ’КgчРW&pвn=чкЮыЋъ3uБщФї6qhoDZj•ж*схŒ:_Mck2MЃqхhЅvKjЕк|LЧ-oІЫ]A+ВУm1Zз}EЂ*D/„B№єТ7z‘уТЉ6__'Т’Ё§Ў“q@М2ё†S˜мЯь‘нЋ,’яoKЯЎЈфk|=J зИ‘ЩXuо‰#јП?хtžйс'œ,oPд3 нpНGрпіŸ%vf,rулрщНЉжŸJ…{wmэžS;дfВ?fL7ьИпO›Mˆх‹.кгN8]_І:†НшC ’qю;џіЕТХ4rY8sЂZhШЭ.‰пмyHє›б]剉РрјNzЇK–ћ6БовoFахбь™A<­„CuyђЧ1œ,nЎЭBоY­+WCPŽУK€рЌК8ђh@aєюŸnЬЮауп—ж™аJцуИŒuб‹бь ›ѕ%i(^~Ц?вv\зwќўЙY:gaх3 шЎйW7§KƒХ™%;]ВЋf)цЦ]С^)яšPї„ъ6 Н–едnЮШ…iЕЧћ:ћ!Њл^DU#cэЧS;]#ƒs…Ї=1YŒhk3ђO•Єz†!БяpxкZ‰љ?eаtЛ,Бъ5Ў.єЮ Чћ*f~XvігуGЯГ3яЩ“…Џ„йBЎ™0уhIoR™Я„р|-Љ`0эjUn‹Ї‹.ђЁLІ­Њ\{C€&?8LєНuІžТvрv*РгіБЬsrгђЁЋЂС);Z3”zке†jnx.єј[ИŒZVШ ˆхQDА– ЅЏѕДрёq№€~цЧшzOСјTЋWlSярVzЎЇfkЛ–АїN'ОзF|Й6Іж4~піYоЁЈЩєЩу—8-%8Ї›VсЃТ—XІгšюи@~r™Л%sG‚М'_EДuiЬmqШЧ„$ ѕ&cњŽ~ш;щtшXppХФњ^ЋmыUЂbхлєo_њ”б‰C ˆm9џъёН![žкј5к_ЕВ9IчН%MHяШa>SVXe§Ч.)OTАMЇ§[x#•щЌCд–ŸЊ[l1u•Q”eиьg MQtБ:д ’G…ЉYАo0; РШ{§й'§ж›дœ}ППFКфwOшdэ—+ёŒЊр"Сc‰ (пН.œrLа!Уpьх{Ѕh9СФwђЏё:Ь\5 uwеrю­эca!п Ko6 \вxV.Ш_АŒЌѓм#˜њМ“йJЮЯtбъСo“l\~Xў-F'ЛœЉlBЫ№BC L”юР€UЈŸ4RЗ“ДwPБџˆkkЖхІzЋяї'СbепБџФЉ-PdЌo$Џ–фkтgu Е+aвЌђ1)ъMНЏ†Œь\"ieё‘З KYUѕьћ^rсhiXtŒїЈ}КСШZЉшидСТKЛ,жыœЩ'Њ У+]c€kCЯ!ЧчьД3BЫоAЙžЈС2GТ{бН@^ЯЄ•мГБqю\aMюИ=Џ?ЗрцКЇIX№ѕЋёПЛбЭRrcЯіPYъWвˆzЬqћ€ЖRУ р8€r”ъњMiЋ89ƒВвPtMl_hss‚ЄъЦЄXР”ЃЇiЄЎо0r}sЉК ЭЉyšrяВЦm(ЖЭи№”ьŒcфAЄЬвOCЂЦpВњK [œ­нƒ'•%т[ъ%ГшєЯдkђyЇeКnЁМЦТ$8.=кк‡гšЃбkXа2VPГБСм‚ўŽБoъžзЩОЙ‚ЇK7ѕVЪIhхКяN-_ѓћ—5{uСўЙZH=)ы‚ЬpgЉZж88wLД\ъEЧŽG6|еžШ# •CMГLзД<ћ@?ьЋъIjыanpJgkNЏ=&2fЬьAС^=ыƒ:ћ;—‚Ќ:Ь.ЋЙЧЯ-!2БЇњЌмBЪiеWZ§Вьvфхl­мl€O„ŽѕЩэНпЫёљ1F”уXš&хЌ/л—4–іLуЏкУŽ<•їPдœјС+у?vШOЛсyшЪлUšвж—їzбUwГЙUЕКXЩТЉ]ŽГkБУSk Еy>ь,'§G‚1R5ПИN \§vўЃвсЙІЬfg`H+‰Ьай\би‡ „G^‡дЮьћpЛ†›FXѕYф{кkЪ7‘œ§—шЃЗЈjŸ§—lеuf‰рЭФ‘•„кKl‘ ,ŸЇ_–>є=yKЅў#ТЮuMљ,NЪ5OэŽр(ЎомœТУп ТГгTп=зкА1žйHMMm ŒiуKВЯ# NžЖ‘$v‰кЯnяђВplИНЮt‡§NфсtKе lnsІŽ7–ž7 у№БUkВЄџЕ!–2бю,кsјW}*P’Rљ3Т„её’\l>еŠзА№штўœ9–7АžлšFSъšБ=“FЌPї1Џ q‘œ(VуЦЮLp:͘kЗ[Fб<…ЙžUщnРЦžC€яЗ”ВœP3WєЌАЕ­vF3љZmoHЏjЎњёˆђ?ўciџ ы;єјъЏ-б&оН9Ыj<šјн_Ч#=зЪю-Ÿ/< бa›ї0рДѓЏзO‡DзHџˆЮЪњыŒЛnі.Б3ыШ‡rуC;u[+K‰+7vГЊYmŠхСЭч#ЪаŸ[щлъ1ЬkГм||Џ4Њ7Sl­ŠV‰рŒƒіUљИєЮjЪ[|џЩљјѓІjOiyџ™з])lsƒЛŽ дкg­\–žс`oR›Ns$.‘НЫF8ZЭћlWk^ь’Е5ЇЃƒ~x3W- žГAј*ЅкŽж-DљZэ­ cЌе`aq…SL’в “сžТrƒю‹гнщјщщfjЌy•Ї'.ЯxY™nouгЄл$D4ї№ЙЅЪ’ЧЊЪ,А5Фч€GйDШЉkhшz6mŽnЙ=”ЌjˆŽШЩ)ПKjЬЎ[ ›Еч’ч? у`a‚Їz‡ДНžзA =6zlЙъ86Нo•рq­ъ1ОVфgТ}ЁOы†‡w 'вє›~МТB]#N9R<ив,ђщg§•š{[G 8ИIЦ^QЊšыJeШIяkN!Ч№М}tšˆk"чЪa Jа–ВP=BН1hж›fы(-p>xO5*ЯБДД˜ЪS­RugЖjэрrpЌвжкjэy€Ц”jк21­>оФŽ^эг-G!5‰йvт<'We†6`|/ѕЩŽ.^ХРЗIГ>7мЪЋ-жMp1йєќ•ю(DЦGŽє+Fш!z`gКуT††–іGф`W‘ло]ђVЯѕ&д‡PЩі7•Š@]в,КІЃЭ8-p]Џы е 2G#\D |хpuЂщuњ|‰ч1’Е](4‰Н:шб‘ЯСеtиXћВ89>ќiэк`Рќ.eЄzїЌFцй#эЙ]bœЬŒ22р ИžыЪ_З_FоЄ›Здo}пурХu+,N?тGІпžъМўи]УŽЎВlLœй‚VI#ВHСхЋ;LОШЬƒ<gбЃ7–зЦ‹ЮeO1офn{ZqўИІ у…шWiE$иДN­Er\Ёh§kcy`„‚GАOчТ{ ˜цЙ ё…ƒЙшnРЦŒœћСј?uЈЅ8$И9ЇБ –ъдКююјg%дм?S%ћўт{ЬZЦр}Є­H’1Tn)>Е]сТhЦp”ЫЈM+›UDmNЌSоkЃрƒм-5Eз р$єДщЛ”њЛDp9Žј@bЕ)›WQ#ку‚<'Qj‘ХWўнЌaw}ЃIК†6ОЫ[їM)i –ЛјCн”цНfй,œЋК1NЮYчђь”цŽŸ#Й_,@жЪјM&“KфŸRЈ,ЧШю=ЖнGQtQœ†ђ0r>ы]&ЂиіŽFѕI)K%нЌ–;рхпe„лZ7б\lюOЮИ§Э}{Rгј>ь,ž ЭB•ƒєэ/j“Єѕf aw`{КйЬиZьЛjЩ4љFЋ+•oЖkLЦазІŒтдnaќ/§†нlvap.Єќ…Ѕž6rжђ“j-ЮхЇђМ”T–™•6Ъ™ЉЧЪгЯ‚8 ео*П? §ж+™ plДіqџ„ЃT3FТй"{sЧ#ЙUЖQ(ШэБ:ЕWU­щza­6ї@[АpэЉзPVа8ЙЃH:fFыНЅЎ.нœqйkujтЭ7l9сYAю;8ЌŠ§;wБ?NA`hŒ Ÿ№ ж  дbqфЌєрШј^9 пQV§Су•‘ЄГЉпIИИ,ў њГ:Gƒ‚rІўЋЋ<ћšНišќn—вiЦ<A”`ка =Њм!ЇЇк›Нh™ЮR:ѕСВЃ-w ЗPА0ШкvљMтЖЦQpi;ШЩЪПj•zУ ”ъk№бЇ,ŽpipР@rОЏДћZдцCЇ$RиЭ3отI'9*$ЇЂаыДі. щŽ-ppр‚€§ SMm.žušЮ#і‡љЯ|ЊpY–ЬОЌВПy9qр§•пв}EšŽ‚Ш$ї–ћNюS.ЋЄjЩр…ЁЁй;F2Ѓн[kq.:vd#bW­яхќіэч8чЙ?хKЅ’шšљ1Нмž2к,В7kˆЮQQГЕф;З…aаѓccЎЯŸ’іЪ юWеђД;aл/хxеіе{Ѓ8v;сEZMђdžљ\ЧФXHхvБ–šdЋ+VTдxz0ЮKb#97'у+Jз}ЙˆŽцr9јIz–Лc–7Цip>ЩїN–)1žБpk@1Иrзy?…YќAјBШј8jJЛкWНь •EЉR‰Б‰т*žГjО#ЦU–иѕДР3Ш •<=адЖ Ї Г%lё}–WNЎщf'>V„е„Дžp€ЬjM2j@xЪwFчгЧ|%/ižіцs‚ЫA“DТ]ЕР ь*wєчXЅЙќИŒ .i2Жz­ч…jzБ2=ы/ЄZu2a“И<'^Ќзl`рљ@SВу3ЯЛк(§LЖMЖVnvЗ•ж.U4уqsЙюWылŒЗЌЛгџG™B€„ ;?шЄьe)š\ВКЉ+Е #…НфЏЮ#­KЄъ,!хБ8сСw§ьжŽЫЮr€БkЅуГщ™rq№pVbѕ&вд%€ДЕ­wЗ>Bшq_ŽR~Ыж’Nнi•кZb|aпФgЙђВЏYsь‡ АщљвЦБ/)ёЁtRJ~eu™xШTі–Зо1їW*’;.Ї л]jЛ^пйкWю}Х{‰#-‘ŸсglWБAэГSp-<ЖS‚b' Є5э!уƒђЇџ\'Ъd<юŸVLvзЛьКЦ KG‰юДп„Ў1$1ШЯ љCэ>sшШр@чyMЄm[‘НаЪЧм4Ў&јЊэ•G'•…f3їxћ!аž1ИŽJ–§y-JZзc%*lтДТ6ž|+ём;ЗЌ†T|Oг,ŒРљO!qЖРь“ZДЩюWДй}Эєћ 2КЃоmипг–Ѓ=И ЧNЗ9Ž.fyИLѕШйЅ,mn@w?'’ОtќбЗQєZ"”чЩ№ЃBЦЇкЫЌŒ8O__в4:~ЋЇг{#ИјNл%}­sXмў#PбчЉ~KM”–укќЋTѕ }^в0Є'П%DтЂ§ЏcэzP*ИДЧ…›щ| o{Лх|д5–I™’ч >˜Ў•Ю™ЦХСi’3/ѓя_FЎ”љ.UlфЮ^ю@ьЉP”ДтBF‹SњЅЌ`[…v5ЏВ ЯZ ŽJ 3„Ащ;Xй}^~‰lК8іœ КЄmдeў9хRе:њvЃ,a­evЙџ•nе–Т гч•Э:ЫЈtыqиŽу;.ŒЌdŸ6е(-ї­ёЧюYъžПmЊЎŠ–w;‚O…Э%‘вШ^ђK$ЏYBB€ї њЅД[єw}"xq=– }ЇД+ѕl1ВE p=ŽU­–ы0Ъйe ЗcŸ+—~ŸъN,5§GoŽVЦр—еlя%ФЄ|/c}˜џЬЋЩ/ЮјЋ<Ўи ‡sЛc*/SmˆЫ˜AЦRњБ€кLbЙp{Љ˜нkОiZЕљ; j’p|fѕC‚Ќщo!O ‰ІSЎч9‘Œ“œžRНOOžИ&"N­.ыи˜сЫ>еН‘§IііяЦЗsNоиUє/FHŒ34Ÿ…wзŽXАђьd6Kкx+гмš`тцЕИ?*8єŠm0эйZЕqЂ юч fžлœ л”нRŒА3иѓ…OŠDАnђЅЛ—С‡w }Y=(žзq№€ћb“N_Xѓп |Гй tn ХKNИgŒЏvчa~p›юЗsЃхЫЭ;VЉ<›MШљ ј•ЏwŒ/RеŽFфс^О ыЅ‘;ч ае"‰јyh#х(жЎЛJвч–2жЎ/wXЙjЬ’Оg‚уи{д:В” й-†Дќef/ѕе ф€яQиуЎ=,ђЪs$Žqћ•$ї( oPѕR'DСщАќ $I''’О!!@B„„!wIЖњwb‘Ž-ч•к4щйv›œЕУКсkЂtВзФк“?опт›Zd‘#rсрЈxЦьLн˜=ќІ­&ю|(u >ˆ|mчШТе:c'П’ЧЉ[эђО…џдрё’2ъ0— ЕІ‡4фp•ЩЇrмю­ŸVЩZQж‘gO[­/|^џл0yхzЉMвПъІЫ#o#œgюГ“Jј@ЮРўщЬŸvЃb–€'Z2sЎЪmKˆ§ѓ:”-‚MѓфtlkиwЮB’{Э1bOђ гЁsCРР/ZЉakpTRў ЌžaФM$Щsn&Л•gIlL‰Є€JЕ%іЕћ\б€€Ž n—л3xћЊZМњeё4Жb{Žм*ђБіGІРNP(:iјнœpОм’ХsУI ž›І§#ЗHxю­Ю`лq”r=IЏ{Y3‹~Х7ŠќEˆ№О[аЃ—hQGЃ–œ =?Pнœ…J{.qкЯ? фК4Žс‡§—кšxЊтfчђ€YдaЌЯнkZ-Ыx)фSТз№бТєы,у |^ŠmВЗлђžiХіЕомwЪП,p8ЦUьCF7Я#Уб’J/ъ4ѕшhrЦю](РќЎy%iњуЈNЕіЩГїYt„!!@B„„!!@ Э rSВЩЂ8sJЌ„eщ. ‹Q…Йpю YŽw7•љыKЛ%l–7€yТэZЋЁI’B№N9 ЬŠv УkўRщщ? hRВРЮЎЦэЭіWP† ynг№МU{+Д-<АЕљпr[5Hˆ8ˆƒ№€žЕІЭWaЅБ’ѓ’RhbєЯВ7Т Єk?с1‚HиЮZЅƒdЇlУŸ•ZYЄqkZ %WПkњd>­—3џ"€З.œцПspЎSБ{qю {Џ(ж- “дџrЇXi2Ц$Эi#Щ@ld“е<ž cМЛJжєЋmqŽг 2І|№И—Ч <ј@56K€UW\бЛ*ЛЄsЛ8(Є wѓx@X‡Uк9v6ЏzЃљwIu‹ѕiЧ™^жœЌДн[N)pгИ}ŠtЩ3эo%TŸS‹O­80ЦRšНUЇZ]3#ЖV#Ўuцъ6gц&ќ :^Їд)б6#O=з+ъ^ЊЕЋўи>œ#Р=ж~KШазШч4x%D€„ !BB€„ !BB€=XБЅN Žп-№–!жД­ЏЈЙБMь“яхl"“cCšrвП=V™аLйpZrК‰з166GqœіШ@tІи+уц;И%4ЕJ—™КМ­#ђЏБРфн#ф? Р~JіЭфИГWзhщь.–Vю†{  Œnї1ЪхџЉHлЊI–7љуЩKК“­,]yŽ“XСћЌsмчИЙФ’|”ТIюŒŸ’О!,V%ˆц9пСL`ъ FьАўR” žЉе3ŸЈrїџUъ&0ЪK‰ў_ >„лкЋињ‰\ь*kтr~Jј„ !BB€„ !BB€„ !BB€ГVэŠЇ0Jцў aRjqА5Ж_й&Bйъ}PŒ}K’Л6ІВђљЄs‰ч’ BB€„ !BB€„ !BB€„ !Bџйmricron-0.20120505.1~dfsg.1.orig/html/images/draw/0000775000175000017500000000000011660470014021015 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/html/images/draw/pen.png0000664000175000017500000000162310433015210022275 0ustar michaelmichael‰PNG  IHDRЬnsRGBЎЮщgAMAБ ќa cHRMz&€„њ€шu0ъ`:˜pœКQ<IDATHKХ–[(dqЧgH‰’ЙМёŠŒI—ƒhЅ”‡hЪУ”ЫгJ<(ёDJцeШ%CюC Ѕ&З9sf];ЛjЩ%Yk\іe7ЕГпэlвЬЮ бNџЇщw>Ппџћћў~чˆїwЖDяї§§Žш§аU [,–’’’РРР­­WоOˆ>66їъћ бišFПsrrоž>22тяяzeeхлгU*oд–––7ІЏЎЎЂ™<}ppаЮY,ОЄ$ыоккъчч4ККММьВЎ­йЛЛ†‡9A;‘щyyyссс ollЫфXіАПџДІцИЁaw~žxeйЄЄ$‰Dzhh(\/  ЖЩЩsцB­>дщђy0)(Š =""Т}‘cwaсЌЊъЊЈh_Џz„@яьь,,,‹Х GEEљBчcуИБёV.ЗšLќ?КFЃa†7LLLŒthbящqЄЅ!СStŽ<=66ж+ЌНййK†ЙЅЈЃЖЖчвшJЅѓЩг…щА&9љВДT`+шzН>K./c˜ЅЅ%Ё9bйoH`яыѓЙv–=ЏЋ{ŒŒ|ˆпnщ'­і^*НU(мћIіћ‘NчьэuЪdN‘Ш!иR~|.**ЄRŒ(g6Л—тЊЬYS“snЮЉPќ‰>wu зт—ŽаqА/НгmууjЕ3?џWXЗЙљбdВMM иЕZ$;joџкм|R_V]~:23Ё аŽддmЃб;иЋ?~J$pёEёЅаš>љ№ў!о’Мп1ЭCCиАЯш^&УLоde]ŸжжbшmЏy{ќлyfѓŽбˆм›žо505Vo_щugН(рџ}щНЈLb№ю€юіј‹IENDЎB`‚mricron-0.20120505.1~dfsg.1.orig/html/images/draw/fill.png0000664000175000017500000000231410433015336022450 0ustar michaelmichael‰PNG  IHDRЬngAMAБ ќaƒIDATHKЭ–kLšW€QІ˜ZуВ%S“-]В%fkpm@мВX-L]‚@эВeѓ’јcХДСзЌ§б˜/?Ќ&шHq+Œ)еj•‹X‹Z ‚8ч ХjеyAЛЕѕћлAьъхSє‡ЩШљїНпѓОч9я{јќz ИЃћAњб-мбЁ=Vўt“ЩTSS“––FЃбŠ‹‹XгjommMIIaŸ;пЂzdД?" ’Р7]"‘HфПVПШсЙУТMQБ˜)dEЉTњLрƒžŸŸ&юьЈHо~чЮУ}њКNѓЛІЭЃгщіOА=//ХNq”ђнAA WMp0чЛœ?g‘•%D(БйlЃбИO‚=щЩLЖГŒяЦуНш~сГ?Б Ў=™Fччђzії9<яаtБX–Ж"ЉvПрE[bоћ№qлєш:5ЬЭ Ы ˆ}сЏЄФ/С^ 0jзjЕd2eЌ]оxг‹&QпlRињzQЫ :nEglШТ†ŸЉ‰y,—Ы1`аГВВТ_&л{ŒЭЪфћЕ6C'кгќŽXаЩ1tvY‚~ьHWЇ9š kк`'н зJІЌzмўўуё?†„ауг\m­@ЇFклƒѕЃ^?ѓO Фх@$т*ƒБћ„_бЛM&kI‰ѓєщYџe<ўЇcЧЈя_О$ЉЏC• №ш!аДƒЮДлˆB?УаЯш†Ÿ9ŸЇЋыЙWрrЙpЄЗюр}ИМж‹]И№Vhhl,G pU§цО_ыnlЊ&аЊZ 0ш7ќєЁVшg|гЯЊYs†sHЃ}NЇg iЕЛОШeрa3hoZ`ък№3€ŽA?“›~жHCН,33›О”˜щгййоЧPbaaсЩ“б<^гН{рA=№јiёјбcљq,!_žџZ*•bгЇИ\HŸМqcыcЕZЭbБbc3~Ў\5‚ц—~КЖљA`џ47u$$$ьщНПЖжэчgл5{№…ђђr"‘”У­’ЫPL?C§+rŒBЁиб”лzЦI"Эed`ЮlчддT*•)й<~{ќ˜MžўщэqбщЩ%%%>њ}ЄДдIЅю5жp"‘шд)вхK|uЫ:ьшG)ЃFŸ)**ксФ й6Mн]]."qшю]ГNзm4Т иIЏзs82‰^\Єњі›Ћ uЧIbŸjF3—šъН№",ьidф*™l_dБцггg.^œИyг"іЊTЕRizz:ŸЯ?а <$?ˆ№оY>М|`№"“ пТмпхošyюК;рёSWЎјОп-••ЎЈ(葇Эa‹лЇќ-i4ізейЎ]ГгщЯNœ@_ўлaцkDЂ-7змйщЛіАsGGŸL6|чŽѕіэё[З&Џ_‡G:VXh-+ЌЎ†-АПqŒŽєљqипп3‡%nџ„‰Н"t-б"IENDЎB`‚mricron-0.20120505.1~dfsg.1.orig/html/images/draw/closedpen.png0000664000175000017500000000156410433015260023500 0ustar michaelmichael‰PNG  IHDRЬngAMAБ ќa+IDATHKХ•[(dqЧgH‰’ЙМёŠŒI—A4ƒRЪƒC4хaЪх‰ФƒOЄa^†\2ф>ФPJnsцX—avvе’KВжИьЫnjgП:s9sfZІў/sЮџџљ§ўппїї;ќЃ§žя~ ћnё|‡~Qх?а CIII``рЮЮЛtcЯ}||< ..ю7cЇKЅRј(''чущЃЃЃўўў WVV~<].—3 аккњСєЕЕ5“Ё ЙвiƒСћЮКЗЕЕљљљЊЎЌЌИ‚v76Ь==Ч##ДvrІчхх…‡‡ƒМЕЕхJчёЌXІѓššгЦЦƒ…Žл8а)ŠJJJ ‡††ТѕNtЭ,@SS—Jх•BaRЋiŠbIХўЄ "((єˆˆw‰3tц-b,.^TUнi4Юйиџяъъ*,,фѓљ GEEБVЯmл€ЇMMїb1]ЉT’$Щ&&&Ц~++є5}Š2їіZв∋ŽФ€ЁЧЦЦкЖкЫm)ЮЭ]“ф=AœДЗЛJяPU™L†ўdш‰‰‰мtXžyHIЙ.+ƒsиeД=…C0XЪЫЫzzz:‡2‡ГГЗ2йT MМr$шййй‡Ё+Š—ёog[АнЭЭЙЙЗrљоъ*wпО)CгtFFFHHабббZ­жмћKKЩЩзЅЅЇ‚]Ѓбd‰Хe$ЙММlKм5}Tя{A˜ћћНЮЂ.ыыŸ##ŸтуЦ֘cюŒјYЅz я%wѕ|=n ~ЂV[ћњЌ"бтXRзЁЩUEХ“PˆЅѕzw7xSцЂЙй:?o•Hў№x_КЛЙЏ тзЮNаБ0/=гЯ …5?џwXНН§i}н8=m4ЋTvвбё­ЅхЌЁсЂКѕДdfB -ЉЉ{:g:v`ЎўLHј%РХСЄЦК€ЖHЅguu№Ч-ч;ќp<<Œ‰K0\€E"єф]VжMqёym-šо89љ/_зСЄзяыthШУ™™­]ГЫі%сЎЭ‹х<юxЯпвџ= в‰DиЇыѕz Й\n,c™žNЇХb1шBЁ0™LВLFЃ …t‘Hд(К~О{<­V :6ЖЬс<>КЏ“‘ШBFКL&њљ5ПжЁ›Эf•JК\.g™NQ”ЩdR*• УkєЬссљђђW‚xЊг а|>;t /''ЕЗSjЕбhфёx ?ыэН ‘МмкЊ}ІqЯyНE>џ<…B‹uTбюtТОФуЄвЃ§§‡бю:;sГГАvЛn^Џіз§§З*еЧёё&щЙЙЙRi&†НЯчГZ­4=гъо,.о …™Tѕ‰ЦH{~d$?ЗKp}.ИџєьlЯ9ч9Ячћ;Пп9Пs=Ц6Lп#шгW0}hГWўяєo:Ошoй=єѕњсЦФ‘†ис/Ÿ:“кпИгиvjђЉOцУйГ=-§ZŸxчЈ ?ыРС#р!№=№ Fk‡zа5рp?XV‚e`)И,wz˜Š•CЕЉmЭw ШгЛкšFjbўAь‹С"АЬѓРзРWС0мfсЗТЈЎцКЁЃmd_ЌБ ЬЕ"^1#И\ †‚!рž‹Њ9x{оWЁ0YпŸŽ+Ч€Я‹РЈ4рg­VžnhoП(({W)Е9ŽRХаYєrYO,:И­RZ[-l?wќИ@_–AРcРp p“pNРuЩК1КЛл§U›§UСЎ ЎИ9Ÿ?|X†~ЁКz,bBц6афТ.ёЄXчЎЗД?G%—<ТфyП$†{9*-ЛМмњЪKeшНххжeuТ  JвЃRЁwгш.Ž\УЬЧљRТ|_OKgІкуbйњw556tРn ЮЊБGа=]є^WСЯе‰л–ѓMэшŽЇчЈ=,›яџЁvП нX_oR*/@g cЁ•ž%шОžzŸПЭєqsК”їдЗEкЗДбVoсФЂрюЧdш†ŽŽ?BBDш"%œјa ААРМЅ‚*Нп}VЙ oЅКљГnf& Ž ]t]ЮЮЮЙ”Щ’LМ HNєTkќTš™jЭlMDрŠш‡жЦ‡юаFГ™ГьjEЁнндеиxЫЧЧЦћš>Œфвpsє•”˜ ЛЮ šСE!\Хє8nMті•,вRЇ1e-xЗbŠ,&ва`ZкиОЗ•ЮёѕdиŒ›Э‘L]hжШˆч†иŸvчк#ђљ]„e0#Ую œшЏтУ\ФХa\aZ>їZёVCGћдљн2BXб[QaI;2^Лдл3е ИџhпJйУoŠGgsѓ@~ў№№Лч!z~ћБ@зедdяьОЇћŒАЫxњtoeх€NwyЫ–ММоВ2уЩ“іыЩжЬxК'лџЕоєвџ5fЯЙ+rIENDЎB`‚mricron-0.20120505.1~dfsg.1.orig/html/images/design.gif0000664000175000017500000000510510653652504022030 0ustar michaelmichaelGIF89aƒЅГФТФDBDфтф|~|џџџ >пЩ кA~(`Щш!љ,ƒЅџ0ШIЋН8ыЭЛџ`(ŽdižhЊЎ˜ p,ЯtmпxЎя|яџР pH,Ш$рАžаЈtJ­ZЏXѓxПрАxL.›ЯшДzЭnЛп№И|NЏляпРж‰яћџ€‚ƒ„…†nzM]‡ŒŽ‘’r=^‰\“š›œžŸiNL—{‹ ЈЉЊЋЌ”Є˜|ЕЕlЗ­КЛМНwЂ‹—‰ЅŠ^ЙЙОЪЫЬЭnРСбФБІЧ_ШЖикймЖзЮсту†аЇБАВ‹ЩЗйДрж№ђяфіїјqцвъеѓєО]ћА Р|*c ЦК‹Зm"@‹jм(кАaгџжЩЛHŒХwѕ8Њ\й Шh3СгVqb=$YъмЉjп…˜Г№$уIДЈ'Ÿ€ž›CаЈгЇ’˜JЕjUKд"BнЪu™€Џ`УŠХ*ВЋйГјЪЂ]ЫvйК,pуЪKЗЎ]ЙІюънЫЗЏпПRђLИАсУx!^ЬИБуЧ?CžLЙВхИ‚/kоЬЙѓ‡ЬžC‹]4щгЈSћ5­КЕызUXУžMЛЖйЖsыо§V˜CБан ѓ!И с]x+_l9r Я…Хu}љщCPЏ>}ќјнчžџx§§—ны%ˆBsПС7 zЩAш |R˜qR(ЁxZиЁt‚hЁqzЈр‰ Дїq>"‰^h}—ДXС‹1VX ‰b˜Š@&%й€7šШЁq.zcŽЧЭhЄ+>X$€GfИ$‘AfЉŠDnXЂ—`YBt8BљЁ—X~$ЅŽkўЈ%Š\*y`vЉ&•2NyŠ{ўе9тXйЇ•ОihИЊшЂ ЩшЃВhЄ”VњŠdVeЊщІœvъЉІH}*ъЈЄ–jъЉЈІЊъЊЌЖъъЋ"ѕІcеjы­ИцŠ+‘щъыЏР+ьАФkьБШ&ЋьВЕђК%џ­E+эДдRЫƒ8‹(ЖеvыэЗрк@Иф–kюЙшІЋюКьЖ+­ЖЦ„ЛцЪšЖ№оKяОдŽЫяП,№Рз’ЏЮЮ[АДііƒoЈм.мЎПWlёХOмpo лT№>ЯЭ{p"ЇKqЩ(ЇЌ2Ц#Яš0З5маK"Cм”5ьЮфюЩ+їьѓЯ­7 {єЩ#wЌГЮщ2Э.Я@G-ѕдгЖ|яЫU,еTcPѕpМ;3ПPSmій>[э0жDМУз‘ЕMг<рЬmї@ћ–іо|[Ќ6Чу]ДайкьqДДа3Sтмˆ­Ўо}G.љПЫИуo\3џиr%8у7ƒ9КOnњщЄk>єсЛ$†У…sЮњтŸ ~јшч–ŽњюМW[љъЖЫь[|Hn;шбЎ|уdїюќѓнўЮ6Ц3#Зyмs/Ž эёмЛЙКC/ўщвгёХ o;і}‡?ўћэЋ>=њ„'јоюУЏПйхы›ёжž‚›$—П§h§ƒ]Ц€ЕОFЎ€Œ ЪH2Дй€Ьрй(HЦ„ЪR м‹ќ€Ё„ж&LЁ WШТК№…JкпBHCKMЊ†8Œд sШCEэА‡@ЬвУ"1.Ђ^†h˜љ0‰JД  уФCm!ŠRteЊhЈ+џb‘=Zœ пфХ/&f†ˆЃ–ЪhFИL‘0j"лшЦ0B&Žч ›œ„6вё ‰ТЎГЧрqњЮ’дЧ9ўv4Qz Yœr‘ˆЬd" уЧGR!ŠМ%ЋуKBG”w"^|^b ё‰?|‚B'=й(Ћ‘g•я!šŽЖЪhдGІ„NvЄ„І+M(D%Jц™ž0KZЪ2’Kqв1ЋЃ$эrDf&YMFv ›ч fƒЂаLgJ š„TŠЁpsкФdŽŒЉ'pЎS™Wг‚iNrЂ“ЫќаšZЭЅ'ž-5jO|.4™Ѓ”a??љO=ёШџЁ}ч4Q(тэI—Ў”dCУIRUFTЂ­ЅНвI'ˆювЄ-%0[sв”3Ѕ'xу˜І€аС 7ХЉMЁљ„šv Їл ЊPG SР u9J]jšњ—Ї*'ЊR§ Q=XCЌfѕRh$bWљљеЁ†Е‰АJЋZз**В–•Љ[] ГцJзКы­) *^їzНђѕЏgД*`ћЬГіАu4,b›И2–œleЋ`CузЧjСЎuU,m*kйлмOkokр‰8лй}VbЊ­‚H[ZœЯbЉеьlXлZТЕ-fєJпЌT› кжіYэАЩїЮUНнЪ6О§­ь„+МW‚фzpџrЌQЉрІщVr“ЁAMЩУKeuќ`зІ"РбJзЇхБB!ЗЋO№ДsЃ8Ÿіpоаї5?ДnGг[…ѕ’™ &•і(_Ђ З^ѕ›Ќgђым…–ŠќЁŽI&\Жђ• ў(IПФH“Цв7ЦpˆEФЄB˜ЙџŠ­‚;У`qbTI~hF3cxЦ}2q|Q;=Щ—6ЎЇmQЗeг­nt‹Лн№юMМчMцwг›мьОї_ѓ­яНђЛпo§7РП*№KЕрџ‹=L€№„їп6Ё%no‡sт–!ХŸmёЩ`М47ЋЙ;ю—wЈб(?ЙЪSЮђ•Л9Щaѓq`g!+гmјЬыbђЩФќВп9cjђО^bWЛФијШ…>œЇоrЬ—ЭyХ™Ђч ›6OЮЯсtЊІчWзЅ?ЅоuЏЦъ(ИeжЕr /ньr{кЃДіЄЫюЃAћ žЮЄnнГeЧ{Щ%Ј{–ьo<єОwUfїПvwЛтC#wЧќ}ЊSŸ|aœ+]ѓЉ|c.oкРƒо.œ?Œчя~њЫ˜МхАЙьcћШs=ё­‚шCz­š>їq`d‡я5Фп2РЌђmeќуSfсЌwў`u.§JQПњ:Ь<і=Йт{џћрПјЧOўђ›љшOПњзЯўіЛџ§№K;mricron-0.20120505.1~dfsg.1.orig/html/images/dcm2niigui.gif0000664000175000017500000001670610630013526022610 0ustar michaelmichaelGIF89aкdГ‚„ќФТФDBDќОМћ§ћќ|ОМ|~ќќ~||~|ќ><<>ќМОќ<žœ!љ,кdџаШIЋН8ыЭЛџ`(ŽdižhЊЎlыОp,ЯtmпxЎя|яџР pHŽШЄrЩl:ŸаЈtJ­ZЏиЌvЫэzПр)ЁШЯшДz=\Œй$sxNЏляјМ~ЯџКсq}ƒ„…†‡ˆ‰ŠG€"r’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋ—ŒoŽ ’fЗЕИМЌОПРСТУФХЦЧ”ЎА!ВЯЙгжШлмнопрЅЏ’уГЫЭЙЙгКёёсіїјљњЈ‚QRnЮ4@Лv§$=‹v­Н\˜$ь›HБЂEb§ ќ‹„Щ•@џ фаŒ–-\КдтhIЂ( ™$КМHГІЭ`ŸlЬф@ЦtGв,ЈŽмШ Э*(8p€С…ˆ^Fѕ9ѕІеЋX}хtВ“ бЁ9г*ђ(в„T-xJЉТЙ ieЮœ$.еЛYѓъныs`BЏ=З&CBЖЈй I+`рдBлЉrПLВхЛsљjоLqk“ЎKОє ДgйУO(p ٘Ћтu9ГіхШœsыОч™ h%Ђ?"lк0j Њ%,eЊРqхЩsi_ЦK9rцниГcєpQсƒ§.њ8rД$РƒѕэЃп–-КьйQqkпЯ_ы№JIќ–Dџp}‰7 Ї™'jа€Ј'„ынчV\јйS}њѕчс‡Ѓќ acˆз yН-Qи: NР`8с{Фwˆ8цXQŠJlЄбh eT‹/:а@„0RxŽL6 Ž D)х”SŽAх•Rކ%–!зЂ‹шIЁGJЈфNІЉf1Дщц›pЦ)ч›’Ь9Ї_R Z|яЙŸKЎ)ш к%Ј`3„&ЊЈš†šЩ"F*щЄ”VJ‹_>jщІœvъщЇ„`J$ –jъЉЈЂ*ъЁЄІъъЋАЦкЧЊŽЖ*ы­ИцЊЋ_y.hk€s,`‡АЛklБДЇi€SЊуьџTіш,БЋтБиf kВЈ-K˜oXP{-#Tˆ+юЗкІЋЎЇмц-ЙР+хчЊ3ЏАѓњcmОјцЛюПвЎYяк{яДшjФяЗј–-Е C№Фы1№QŸqГњZ‹pН\ХлlУ№VlђЩ^\б„нlф7ЙHq ш\[4й—-kТD(lЇ|ЪXЯmSˆсДgŸIЧ}Ж­œ  -ƒ0бsтџЂКt(н0Ъ.^ГЕ(9Ё)RlэвžUќCёvR!фsS-E)vЧбŠХд5хк(чЉœNьІ?xЉЅdJTФ4ДЄЄlьСnŠ—У!…%mщЙр _˜˜І%пHрwФгХц‰•јт‚nјЧЯ%#p/І<[\ФkџГИGФ|гuЭy!Ѓ|яš'З7§о™ šыlVМ‘ГЮ*w™ёeїВ@ХlvЕsœЖ‘Ь5щwoQЯb№“ЇМы[Яњ‹}ЩU>† _ц6nМЧКчНєЛ%Я‘ѕ,7|A/гЙдў|јэKіхОчїељь?>§іwЃvПЧО­QiŠЩ§јЇ Лs\щџg› ў‰“HћwhЗ&6–€Y|шY ј€:qSfiЇ]ћЅ}гvvцnCиHqдV|o†o—]Пѓ,Ј4!X]+€`ЮaD|ћE7-˜ƒ4s]чsВЇЦw‚)јzŒ$іH>8BсW:ЈƒРз}ˆЇ`D…COЖзv,ІoВG{+а„N(ыW{ЧїZc8„2И|\–…тeTЈ^˜ƒOШ\Ъ—xe†bИ~0–vцч}i(qq№†,‡Џ…s&H†|hˆАє|Zˆeˆїxnˆ(ˆхt@Fп&_~–ъ7ƒŽШ}O—y&‰‘† ш‡-€џСѓЂEy ?W@IЦџA?дЗTJŒУ€F1№ŠОє‹Np>ЁЁДHХh"дFџ‹XFz$VЄXŠ7р‹]дGP ŒжhЭ(ЧX\ФŠЎшЪH‚D8К(4РXJYљ3AнИGbБ?В(‹ЖXDADlоJzŽеˆ‹ушŠ€WyбТT/ˆ~—†i“и\Vцl,ЧKŸСdХиŒлШŠ&"A9фHсјE>єŒaTŽфи‘~y’ЗЖ<"‰w]#P‚eјHuШlFP‘т(’{ЄC`„C=ДŠWhx‹эx’DйЧИ’@ D>9Ž&џ6.Љ<8e10‚|ї‘vЄ“УxE>Й’и”}„’DM#"–Р(ŒLIŽљ”$)6SљЄи]је^Йѕ^1Ж‰BЈz}™xш•жјC–YŽ7Є–[Ф‘‰˜љј”&Iy”“љ–x7sщ‚U)‚;ч`‡hbR(ƒTh‡t†“A%˜щVŸДŒФ“ŽIlџИ‘" ›;ДACщ‘‘9kШИ›M)JїИ§(•/Y—ЩcxЧˆ‡ШsЩ9OЪ‡\QSБH)бЉ+гй;УЙSX‰=†œ‹w‚rІœн™IЈ™е))х+ч >зЙ™0X|ЭЗ…ЁЙ•)†ˆ(Ÿщ[%ŠЬГџžЉСm†gђ rц-‡‰Dи\zŸ*’Ÿњ96ќy@XiЁѕœ :9™щLийМh^уYЁbѕ zТш˜ŽъЁsЁb”Ё#: ЇcЂКЂRЦ™œШZI8~ЩхyUзgџ™ 0~лf Иѕ’‘у:sR0щЙ“MYЉЃ\€Ђƒ„ZHf[˜œ%yљVt’7“<†mЧФN- ‚ј•sЄ)™ŒN 2Кf4zƒTкœZi„AЊeсiŠ?Š\rz{ЉQЂšY•ЕIfКЄJšІ:БІїqnZœeXЃnJeƒdvyЃtq†\x .ТЇ:Іy ћh–ѓИšŸ:–РЙ?ъFџЈbЈ!ЖzJжˆ4ˆ|YxsђЖyЕˆйД‰aЄpІ?rd›j٘Œ‰AЯ= ”ІЪЈJsТ^UZsУ”agˆ—Яg№5{ж‡`ŠЉ)ЊЉG‰ž–•йJJЅzЌPКƒ§‰Ј[ъЊЧ7QфЗЎпU~=жЅV ЏGЏzЂ­QЪ­ЙfЌŠy––ЩŽ`ɘ׌ЋлšЎVYƒЪЊ$˜‡кх\ўu­ЭЊмdeяdАTщЇўЎЄд“…й–n‰‘СIЈчк(ЉЪzSЗ~іJx GwрЋ)ЏBPK—Мњ‹Д)›юиБ+єSЊяXKЩЁЂ5‚Ь ЏшŠАZџЈEk%[€”–‰Й>њ7 .OРQPЕЁrДUЛЂLˆŸSа`›.S{ŽdЋЕL›Жћ™БЪf>ЊJ+“\jš8jš{jЖpћ6kKœ| №fo9…‹ЖЕ›:bKЃНRИчF~љŠл#/КИЦИRК^ fБoЗrыg>8Љм—w3ыЈWkЅяЄ—vQЙƒd'ођЕ§C”В‹ЙхвИэ9ˆё™|”КлŸШЛ59м4d>FЎлДs Œц“ЦjЛ—‚ЛzКœ0ЋzpЪ‰ U{%uvH‡оyrж‘МшЛфщМQ Н` Йь9Нп9Ѕ Vˆи{М VgЪYЏtњ\Vџ‹S{АN –ўƒ›џЃГф*ЌГˆŒП‰ОШ*З!кƒєљžйћ™Z)†Л МУKšп+db&ОUKОЄЪБєЉљH’… •аЋО{J{ћžyyFvWL*{МdG“И ПwgМIІПEњ8ќЏ‡i›B9’Ћ)ЌхњЗ&<ЗІFw˜~+І{™лУъ­“ЌœР8ЛО_’Ф.ѕЖLэˆ‘PМЉ<<›niЛEМРcлЖ) СЩВУ№xЎi›ѕHII˜Е[Ёg<ЃѓЇЦFЕФЛЪЏСXХ:%Н| l ˜sЧ‚|yЬІ{\ШШСХhЛШБвШ‡šЦќ‡~LЩ1ЊРzœЩ. СœЌџ-–м[ Œk\<Ъ§DШЇќˆ›ЌŽ›У ЊМЅ,Ђ­|lќ:БлЄЊшKŠŒЙЕŒДЗ<ЩЏ|ХM,АhЪЄКyОГ|ЊžьШУМЦ\М*}сХ#ћМЭxЬмЬVмЇFќШУœЫЮqЩОLЊDДЗˆ›Х:ЧTРшܘЭ$1Эc€‰ЛŒ‹"ыŒ•ЙЮрJТРЬЪђЌЩ J/ѕl“kЖ–_œап(АрXЧBŒD а§є<Єќ@љ\’ћмšSќ“я,б  ‘=Аыl–%Щбљ % в!н#]yжќЖШ›щ<Ќ4ФќбЯ|ЩG|€т Шм<Ш=mЪ/MЬ]5N ЫC=џ,.}д}œдQ€дM-7O еH‘ЪU§5WеLІе[-+№ќгЗ&Ъa-ж]эеШ3Э—{ж0•жj}ЉХЌ4АлpCЬМQ@ЌnmДEmЫqЩsЉЧЌзIZAзьжc ЮЗдƒЭМ…n‡}执зѓиќЛМЩЮ;РєxвџKwнв}-ЬjЭи§Л‘ЁАDХћЇЊ§Ы:й”­Ійиь”Ћ”MХИЭ‘М,кЦќЭГMл1}кЙIАRь­ОZ”Э,лУ§е–НЏ]–ЏНЯ6ДмеMЩЮ§мkнЪ‹ЦŽ]J;+™™нddLД‹Мнм-зR§ЧЧМз‘ЂоыMЄє‚Ш№mџ)ђНоLеї )љЭнfнпЇђпЯр^*>м~рŸ’рГЭЦmЭрŠрр”ЫuЬVк‘=ЛymЦp§зЕ оцлP’œLс ^мBє.‡щ%^е(з!.НЁ‘7эЉОНй•ОЙг;Ѓ1^кmЯ3нo ЌњЌЮш ЎэЄAюетЌ—Ш[ф›ф в›Aœ–ћфXхЈtЯJ>Ц —hЩC-ОЭњщхPдЯЖ,rl™|„фOМанф@ўс2гћжL§›ќјG Й›&ЎnјlгА€l~д!.eO+с)ЃчBюн%г^ щ7&щP.Щ•щЃщ_џжžўжЃЯ{NщЃЮ. оцЂžъеДъŒоъЎўKАўв >ыё]ы!}ыИž7К>бМоы‰АшЖ.ыТ>ьПаАŒЬоьЮўьаэR’ьђмЕѓъоŒЦd}jЧ0lЋпнО.прсЎ.у^рхЎЖбxэLюПДюзююЄ яѓ-я§Dярnя™‹яфЎяШТяш~cюяypю ž2К\у§ŠПНс;љЫбy‘o<ц.•№7ІУTО„­ЬЫœшСHот:тм(—џрŸГxŠŽэёк ђв#ђхМђnё*я)ЯЏиДМ)Ј=>оцМЉзM›,ЦrL˜хMРˆ>џЎš}I'_с9џоCŒхœ б =ТBЯл‰гЃ4ђКЩвfОuѓѕѕЦгСj”ГћБИНлЮшаЙ­šeМі‚ZхsЏх!ЌлeХьюSmL*БЩЯмд­мWюбfюGЃtї ’dЏцтўє)žё*Іс˜љ…_цVNг‰яЯbнNŒЬOѕ‘oS”ъOЊё^ЁšЗШЉцћŽ@?њK)ї;Лј>яјRŒЮОљй’oюЉ?щЋљђ7fпХo1СПщ]РпЫOэљм, ?ЂССП2œ:Б6ЦFЧG 7ГБЅ;Ы-НC+C>NСЯУBЭАIЗЅEШTеU6Щ™JРй'ЎЇкЈ)лк\A­]\a^^@[мм*Ї`e=f;фbтчпъЛa_нцmjэлнkс_№hфдХRVіvїБѓuƒІXЏeZ]уOeпоLKpћhљ•‰пAPŠу0a>‚—џ"X1ЂП€њ№ѕHnр t.дН#YВ+X-œдГ3kФ‰Щž Мt/ЃЖb19к4vcЭ…=ЇЭ'.сУHi^„Щ цOˆ<їљŒ—ш”<“YЕІA k%K‰I%F§ЉšЦЅg“.}њёциВPХЖќЇ“­мЛiцЦе­ щњlPМh[ДHЖБУЕ™Ю LrгЪ‘сфћИГйЯž<јeIz№iдВLˆ1|јшЖo “!-ыъPЕœ‡RыWгœмйEo7sktrp™уhKОѓ˜Ып Б–žžкњVW*MК"„wюс?JЯєШыщKв КќЊTrОЇџџ |†ћ‡ЮVп_ы› мЋo@ 4P“§ёoA’ˆшс@#”pB,Ђ:3l„B;є№У-,4MCзёDSTБ1,ёEТV”qF lF[ЉqG{ q:єr2F‹4ђШnrЩtђЩ'•drJ ДђЪЅЄrK7АєђKЕфrЬ7’0ѓL4гTsM6зL8W’П1ы”d<ѓдsO>ћєѓO<ыˆsPщЌRАN2Ћт’A uT12; ЭcєЭG3Э RI—Є4CK]гtT 8эTШOSъЯ /%ѕеMч<єT&Гk-=&ЬЁЁбpЂыуЛјмџЪТзі6MЅЦTьЕŠ]пДl@Cъв ЁŒПЃшSvй›ѕяˆ—š8Те І­Џк–6ШлtУКЖлїОЗREЕ[]Vё)ч-lŽ›я bš›F^х†kaK.›оЪГї^Х]uƒh1xiЃЮ<КЫ>а.‹ 9l+:(ЃкЬ2х№&Іи?‹е •WФ6Ў 3…œR7фЉžгИ(лX.yZ›Ѓw—_–9пyœ—ŒуuЉ]•esЌ_ŽлVЖЌуЈЭh“Xж •Ю1f\эƒ–_ЊFЫ1œыv/‘oЎњъИхюxk§Шбь‹QјлК\ЕˆысbЋІЉЗџЏр‡!grсzр…?лаВёгŠЉ.›fXЫ{iП]єќ:а&EдвХ;СдW—iлd;vX“Ж}=м§4иyздїпk}RLwљфџ;ЧЪцњшMr№Tы{Џ={˜ЛПtьСg|єI-пќ“вwџљяйg§}њс\_ўUъзпЫћёOeBЉў{D xЄpCd ЈР64P‚4z M4A ІЈ‚фJ=јЁ r№ $!‡B(Т ”P…:! ›ДB&+~.,I mш­в№|7ф!wDдC QBвЁєFЕЈl•K‰KdbјD'ŠџЧBBд_ѕ4H€lQ‰ГƒйЈX?+ЂhYьб И‚ѓДIkdcнјF8Ц1 Џ у‰ЦHX”q‹RœЮ№ќјG@Rƒ$Є щXЄ;JЁљ`$AљHGF’“”dЮX!е1+‡єQ"ЁА„KО' fфЃ&гvDDbuє)[–IS6ˆTЌLз|В5O ”›пŠuЁPŽ–Бt'ЩуKјрR•ŠФбŽ&Ї`&i˜Фd‡1Ё€ e’qdxJ4{сJN“šљ›х-эС0ЧI“км„oњВЧWŽѓ4жќ%ЗRЗlЎђ™з„N3YJy †žпЉ%Q#“Ж“џ„шцМ‰1qД€хфfЛ0c­mZJ›СtfFЩNдITy=Іg№yP…ъГ;`ѓЈ2њ:‘QSД<'7€# уЌSЅбЄЪЮn RкХTІ™Ђi‡rљЂNЈ}ъ&IъРe~rŸ%<УйTэ=5KQеЅ_+ЌжPЋ5:*|v)ЃЊ~ЕT kQйIЎ"U”Єk%ыzзHў3žm-цX)WГz |­І_gTж,@Ž‹eЌЌRТіˆЅЌ›…BfVГsPый ŽjГЃеlЁxZдІЕƒэџОјкBЕVАЅ- >+лжVЗИ-nSИ[рBдЗsnqз:м‰WЙГBЎŽ–Ћмо6—Я]ntЅ[%ъзКзMDv‹Л]юСЛСoxг1^р–зМ0@яnеЛоЪЦWОѓЅo}э{_ќV–­ыmi§ћ_XР&p§Ы_'XС fpƒќ`GXТІp…a;mricron-0.20120505.1~dfsg.1.orig/html/images/autocrop.jpg0000664000175000017500000005650610630004176022430 0ustar michaelmichaelџиџрJFIFџлC    #%$""!&+7/&)4)!"0A149;>>>%.DIC;џР ЌhџФџФR !1"AQUaq‘в256Ss’“”ЁБВбт#BRrtГС№347‚Ђс$TVbДёCcТЃџк?šкЈкИЛ`хЂФЫƘќКдіљмЪд1эЊЅПВvмнyˆQ!<ы,—ŠXR’tъyм8у5%#l{!Х[ z=­<КЗRyE‘ŸЮcPЌь—У<XЬr{%v@RJ…­‚ЪŽъљœнюw?›Эœ№5эЯВNойу"DјBд3П­r’7єPЦ ъ2:ХEїэкz‡шsзЃПnд{д?CžНћvЃоЁњѕшялЕѕачЏG~нЈїЈ~‡=z;іэGНCє9ыбпЗj=ъЁЯ^ާЛQяP§zєwэкz‡шsзЃПnд{д?CžНћvЃоЁњѕшялЕѕачЏG~нЈїЈ~‡=z;іэGНCє9ыбпЗj=ъЁЯ^ާЛQяP§zєwэкz‡шsзЃПnд{д?CžНћvЃоЁњѕшялЕѕачЏG~нЈїЈ~‡=z;іэGНCє9ыбпЗj=ъЁЯ^ާЛQяP§zєwэкz‡шsзЃПnд{д?CžНћvЃоЁњѕшялЕѕачЏG~нЈїЈ~‡=zwkьПЕ;Д8†пm>†wї;ЛЪ8пз_žЕ Ё*ќБ я8„ssє”яо:†Ж;Qн"au!-GSэ—bnЅа F…/ЈdЂŸЪк  ‹%ш†ёRiOnvƒ€ьђиЦtђвrvОђЧcхп™W+5kdЅЃМS—ЦR9ЦVqЏMVo=’іоФђ› VІУ˜ЭЯ§н`дšvЃВYqд6ф–ж uD/*JANЊIZyм8ыЁФaь‘ЗЅ )Ј0оBлфУ‡;РŸgЊА РЭ-o;"ЩmKEЎ*B@8^ј$ƒ\%AGЉ'{†Е пЗj=ъЁЯ^ާЛQяP§zєwэкz‡шsзЃПnд{д?CžНћvЃоЁњѕшялЕѕачЏG~нЈїЈ~‡=z;іэGНCє9ыбпЗj=ъЁЯ^ާЛQяP§zєwэкz‡шsзЃПnд{д?CžНћvЃоЁњѕшялЕѕачЏG~нЈїЈ~‡=z;іэGНCє9ыбпЗj=ъЁЯ^ާЛQяP§zєwэкz‡шsзЃПnд{д?CžНћvЃоЁњѕшялЕѕачЏG~нЈїЈ~‡=z;іэGНCє9ыбпЗj=ъЁЯ^ާЛQяP§zєwэкz‡шsзЃПnд{д?CžНћvЃоЁњѕшялЕѕачЏWНкЈПиbн)Cлп›эWЛКЕ'*?W<+Щ;GЕ1вЕ&J$ТдсfˆJTЄфяHOТtЭpоеmf{ђЎбfУNv“Š%'xсн*ІЄvwh/36Е6ЩђRД2[_цлS{Сm:@§~В=5зyХјq?5ќuЪћђC.mhjŽŒўПP5ъ{чrў…`q8#ЃйаŽФЦвт/ШRTIxBЛ)#*П “Єш?NМˆ‚ŠvВVфт6r4дsќcг]wœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtМХ-ѓуЭbјŽV3Љuб27’AчјЊФжЯпYqЧ{‹Мы‰qy†Ѓ•%[У‹škеMхl•тd7b;|c’uЂбЊЃК“.`p:Љгіь…ИЗ.№ мЮђХЛЊwNЛљсЅ.НŸvFФ9cfqaж_i””j mАB€ЮžЧЏJЋJи)—L3+kг-РВŒ­ѕ‚ЪsПžƒЅ.жРо-эHS[\Іu\ЋЪэ|B‚ВNіšЄ5x6*фТЕЬ„ю€Ц!Ѓ'š7yкv259Хv?ЛЬЁэ­)f)JлЬ` RwПU)NНЃгиyKHRoШRT2GЧЁ=ˆ ”ЄІќ‚PpЁкМ§~Ђ(Waх!%JП!)HЩ&6„і +Юх§ С т6pGGГЏ{Ю/У‰љЏуЎи‘ PJv‰Ѕp>s ?ЏдAѓзCБ.ХљЩ‘кМЮ?OФkоѓ‹№т~kјыƒи‘!+Qк№и%gЕНˆЮyў#ш5пyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќtwœ_‡ѓ_ЧGyХјq?5ќu?cюіјЁГ{Ž[‚TY&"В VёЮз^КrцЮп]IJЏ‘РPPVьE'xpцКЈњkЦvjіЩˆKхф* Зяae!$ŒЏMвjKeь’­›QTЙH\…ЁАc’Jл/cLŸжњ*fѓЙr_eб”‚ˆынPPњЊ.-’!ћЈч{лŸ§дsНэЯˆ~ъѕє%i ЅC чˆ  œ$џ˜Riu Є•Ђ’BIдЄW[уЉ_бО:•ёMуЉ_бО:•ёMуЉ_бО:•ёMуЉ_бО:•ёM{Ю§G>!ћЈч{лŸ§дsНэЯˆ~ъ9оічФ?uyМ7ї7UНЧЇ5я;омј‡юЏ нRV@е‰с^Fўэ+Ѓў0ёј&Њ2^ЮУ–”…)ФaХИJХJЩЭ>z*€ф5)A4Z'‰СІlєgЄ6ѓŽЌЉЕ%@nЇHшсЭyjJC"CEВЂBAєŠ`э†+Њ .:’ХZфјГ‘4аuRGfуЅISOМйJRРgLk >P<•(Ж\uG(’‘ИR4гХF›ˆЇ‹Њuхo%)PоаюуыЦЕ%„Цa,ЅJPNrЅœ•rI>SQ§ЮТТRwд€т\нQомрkб‚љE&6j0$—о$ЄЄЋ›““œч|}ZpЉ(к„бmЂЂ ГЮQ'Ј 5GШйЈRZЪнB–ЂЅn2J”ЏџGЭO­ЖяЩёy$•9’ Vю8@<”яqЊ}сJ€ЩBМЩ&Мч{лŸ§дsНэЯˆ~ъ9оічФ?u ч,Ѓ( Ё<ѕщтЄѓ сkJKj<ѕ@ш1žQ^яŽЅ|SFјъWХ4oŽЅ|SFјъWХ4oŽЅ|SFјъWХ4oŽЅ|SFјъWХ4O,љkоwНЙёнG;омј‡юЃяn|CїWŠVрЪ’ДŒу%WЃ$d!d~СЃяn|CїWPNѕюи@8хж5piРk›ЄОNєф}Ь•ЏCН дч=Z :ќЦМƒ—!E[­:Е-˜‹ZћuРO*wIРг Ž]=Ќ[|)vWfО—Лйnr”ЋЄєo`јСЈTЮн*uД‚ІжтR„Nх’М$”ф‚@=`№Љ+xEЩї^qЗ #Еƒ`HSguХЉ%XOУCбшЅ-LФ›5˜ЏАђЖСp&bЮъˆQР!dxŽО‚0cюыfљ6цїЗVrЛJЦ8aYPачљзW 2#Т-А€В"я•—Nњ9ЇР§zŸ!Їм”1zѕG{Тё5gM§бС\zOЃH^ьАmжеЩlШЪ59–А1‚x•`pЈ тj[p ›ч%љtgx ’ IИњYinИR”!%J;МЄbNLРт›N…R9РЅ*xАЎšqkЙ<’yЉ рt4ЕCЩНЎЉЁж‚кннБIдчЄqœpРЯGiНхз`„Єƒž“Ѓб2:0ЎЊё iж™tАДЁфЅ@фЂ3фууuуwвёa(ŠЖдђ†9B=Žўщѓё8ъёTН%hI]Ў1KJл‚C!Xх1єšЃmХчjэЖL{3–вТ Ъ‚‚ЙpwxЇˆђxъеgg•jJЭЙЇдЉ’A[Œr›„nƒЇ ЉGNЃЧ“‡–wYЂ„‡’•CтођP:jB–IЦ›М{окЃФCЖЈќЊ–ы‰‰”Ј• i”Œ )gQХž_ЕЅ6ОQvШHs”%+uАз0Є(o`qСсРг \&пЛEeФAZ^8loЖГЩ>BˆРШ$ŒєqЇТ 9оГGJƒMЉ)э,я(Ё$Ї†™%_J-ХX-6эЂ?УЎІFЊчЉ<РtгˆыаёЉ8жЦРlАвтœТБt!<ˆ_‚Юю|Еф@‰xфmЭn<Я5ЕхhЫƒ7Ї€сгRRмS1нu+RоJGщ8TPОЅД8V‚шma%ЦРJUœъNt}Cvеё†k8žSп qоЧЇwNВi8л@$ODtХ^ъє ШафчЫІ4т9нU ЧЗ| _iuFUЙііšSяНіdNSM6dd…МGAРсV;U‹Єˆ†ЬYKŠ X*ZyVЧуЉАїkР–щN№LнFuўЩЁЇYёt№Џ !œuф-MŽж)Єn‡ZIцё>ЧO.Н}кл…>рмU2№ m*оLЧВIW_F7OЋ…GнжЬ ђmЭяnЌ,хw•ŒpТ ВЁЁЯѓЅЙU-иаЗ\NG p8A(Z’ Я“М<Фч…8И&%О Є*3Ў-)tr-ЭuD) RA'ŽюSЧgЃ}ІЯkэШќЉ;Є€ье6’tЦTЅh5ЈШr?р\–ођ[!+’\NЙрЁНŸ8щKТSoИ9‡Pыђ–оD•ЅЖ–НJtЮёZщSЖыОlпP’’Ќ‚Ї1Ё#>ЫХўцЊOШBnЯлвTžMА ЎпЫ™ЯK{йЦжЇжwH kбу4ЭW&„ФХHпpЌ!xHТ2’ЁŸ(Iс^ЭuiC[Їwyф3NUС>Oцj>ы5и-0ІR•м!C:nЈщЈз “ЏMU Sˆj2Ъ›x6A#*Фq'QаHЭtoЭђю4–sЩ ,ЈЌVюOPщђk^+h"#ф%kШЇК:ѓƒфЇ№d*TPђ‚A*PЇ#D ф(І|Х‚"Жsўeг}Ќ•vƒчпГЋy‘uљQЭШ<џ“ХуЊОЦ=uИІ,{ЃiuіW-Жљtя%Xd)9€ЏстЋГPлЉ.киыJY=ЇМžйѓ9 ށŽiЇFпI6˜Ћ} Кw;KY ZQƒжp3УЪ)vім›ЩЛjŒЖЪюЏЕwp”чuJцŒGA>AQnD—ŽFмжуЬѓ[^VŒИ8ѓzx4­Ђ!^ЯG|[ЂШYB•*6TГ—I899JuгCз­9i”U2Рм`RЌB )<ЊР#D„ юьуEк€ТЇГНmˆИсjCЉL2•odnRyƒSЉрtњз,Є%ˆvж’JSœЭтqЭOFЇ'oG'oмц :цћЯ^ƒAУ‡šš?s[@Ѓy*Xm) дф (œш2Hр}‰ж“ghye Œя7V˜еXѕјКєЄфэYe De­KHVъH'дyqŸ!агЗŸэ›k/юoМЩн$ўDєŽ5 Жжљw--Фгj s([л…cгЏ…#ТgfœИН3Œ)‚ЄШх‘€sхЋ>ЯŒLДŽ8—#‡‘ъѓh/‹]бдмfGŽЗJCЊЈЇ зЛ"ьє(1т"эIaЄЖЇ5!#>ŠіWd]Ÿ•qП+Тi+щmаз:fЂcmЩDYSW˜љ%JСu o+‰а M=ЗmЦЭлžuжю№O*„#tИ0JˆЧЦњ)№ь™Гщ9+p>'*^гlЌйŠ–эёŽTя`‡QЬ т™…q+hЖFZTtƒМ[фУ…i*HЦ4>sSѓ69ќЅnЮsžSІ›м; ь§Т8awЈЇ{{-К>-sQБv—e`ЕЛѓnЃu SЉнHЮq€$НЌДИ…!wыJ’Ё‚pGЦЎ[к›;)нjљi@гD‚8щu<дЄ}ЊБЖыЏ9~З—ЊРЯFuу^wWiџЉmпёQн]ЇўЅЗ|_ХNтLMщ—;Jч c)цЏu­рQжšЛДPb),Л~З2­ФЈ!I)!*H)г:hAЎ;ЋЖд–ЯыЯGuvЯњ’й§yшkjэ‘šaИћAlHŽ„Ѕ +;йавSЖžлs™\н ДМф`C`Ј€2AЩъtЇж­ДГZу8лwл~ѓЎ­з ]Р*QћА<дїО5ЏУа~[§Јяk№є–џjo3mьW%opж”œ€$”§XЄ"эNЬУ}/Бu‚—A 2TЂ0:|JWІІћАA€‰ттСŠМюМwN3qт4ЯО5ЏУа~[§ЋХvDЕ-%*ОСС?ŸџjEВЁi_хHdЅACzbЮ фq=uу›[kRЩNб[žœрzk“ЕVЕбкШ:GћаЊЕЅ!)к;X`8}4wWlџЉ-ŸзžНcjl­>ыык rмZ”М‚Ђ4щіU§š!зе~ЕШ[’L”—’Щ,ЈЋ)ъдŸHЂсgЙнXqЋЕЉщйJZZQ— о 9Цz*Тf%Њ[ѓ]m Е/yЧЂFk_ДвпЗ7n}ї›ЛС%фЁ$щQЯЅFŸЩ›>“‘rЗтrЁЅэ6ЪݘЉnпхNіuРЎ i8Wgk6`Ик“x†žMmЌ~tdю((чMKwЬАŸЪvќукS[Іиь§щ€гїHсЌ()(X!`шAШ4Ь_6e1”вЎнmdd: Fœ1)нЗmЖrЮЫ­5r‚ыœІщP't'Ьšx;'X@]-р9ўѕvƒdе!R|eN(ЉEдeI8'ЦkЇіЦЮЗIfћmJ:дIњХ7Me…ъбЪ ^Iњ]D=*обкчIb8О[œRžFъЮђ•зЄдуЈ”ЕхЙ Ё`жOЇ5Ч%;ўmЏќUсj~4–Ю|lŸZЃхЭnвVфЛ”ЛХ;ы[E;Х[лЙ9дѓшІел?ъKgѕчЃКЛg§IlўМѕт6ІвлŽК6‚иЗJQЊˆO јщcЕ ЯЗ;nFа[•дд”“Э +ˆЎ ^m6љqžќ­l@Š•Ѕ ‡Т•Œ’I98ЯІІ†оBP%7˜jЧSйўT|kXу}ƒђпэ^+В%Љi)UіСќџћThк-• Jџ*C%* гu#‰ыЉћVб7&о“k–УБcŽH–T€4сеŠlяd {žНCmcŠTюѓbИяk№є–џjc/kvrsмД›Ф5ЏdKR~IЊБ6ЪY‰|З2„’HS…yЩ'‰=dзэ<œKmm ЕkYТR‘’OІ••wo!ro6іKŸЄЄу{<јщПuvЯњ’й§yы•э=ЅндЛДvв€ДЌ€pNъуŸ5Л]6~ыp‰-{E PC{СAA[Є…uъ‘е]ЂчГЮAMЉ[*ЂЈ€#Цс;йі9Ч|ЕhВErжиЪ–к™#wmв~КЭћ7ћЄ‹№kћUšQEQEQEQEj퇧ЊИќ:~ЭQ6Ун Пu‹џŽнBQEQEV–ЯјAі$}ЕжiEQEQS›юЪз№уъ5ЏэoИKїУ+јMV E<…k~j“И‚pA$ј€тMKГdn3ЅЇа9_д)хgT‚<„цКyИQм ЗРшJвєЄєзC.%*Ž„ŒщžTяњOеŠф:к‹…йфлт —yО?e\Г)•(ДB)ЪT\ZBЮxcQA‹ЦK0R:T–ђŸŒ~Šjэ›yЕ;аДƒЈЮ@ѓєyёQЎДу.8‚… ŠцЄіgнUЃїц~иЏЁЈЂГЎЪоз+сЂ§Rk+ЎкiЧнKmЄЉJ8Tмk;1’”йy@d#P“шз3хЉœktТ4§ Т№GŒ$a>œзЬu) КZrŸЭ!о@‘жxSOR0™H 9УЬ'8ђ€ѓтS1ф(Џ‘В4qoюљјњsQ’`ИРп8пы'ЃЫMЋ\ьSю:oяn ›э7К~T§‘QuъRVpMtZPХXі:кЅNUСХ%Іи­ЉЄсцЩѓTнТжХТЪ[hЅЗоCkJJ† Ё$<Ѓ:y:Њ€Ід•”AСЂЙ Ž"Šslіж'УЃэ њNЗ–Я‡_№\ЌЛГКHППЕYЅQEQEQEV­икЋУЇьеl=аЋїXПјэд%QEQEilџ„?bGл]f”QEIй­И­kљa†ё•„яO%wЖ.е9L Є-Е”уy'ЧE1žŠ*sb}йZў}FЕ§­ї ~јe ЊС*nе`vJЙGG9aG m=k=N51&B#6niѕœ^H)qб‚4§DIЂ лХЅщ ŽЄ(ђ-КHЧN=8gŽzЊ,_™”ЉIn;ЈСKщHJuЮŠ:>К†™l‘ oЋum9FеМŸ!ъ>ZцйэЌO‡Gкєœ?o-ŸПрЙYwfџt‘~ jГJ(ЂŠ(ЂŠ(ЂŠ(­[АџЕW‡OйЊ&и{ЁWюБёлЈJ(ЂŠ(ЂŠвйџ"~ФЖКЭ)Ь|Л‹ХИЌ)е$o+:ЩшgЗ[ЌіїWтИМКМтп.ž”ЅЩ>:ьZ,Л@„&илё%Ceœ…d€’д 8єŠEL.Щ=ћ"P_мRyb‘ЁP'єqўБKнBvŠЩRŒЈ” 4u`‘œxЯгIv8 yиЎіИнXx­еt„„ш:ГPврD“smхIJVЈъдЇ=GЄTRаІжPД”Љ'‚*ob}йZў}FЕ§­ї ~јe ЊХ,p—6цкRрƒМF8ѕMY/R жmФ-ШбF\м9хœ8Щ':); ћАC…—"ВЅ8RЂт2ЂzБбVѕБsU­]e KЗИ ЭМƒФSp Р™щ цх€F4TЏsБ\‚Ф5oю1КPAзNдšb$1€ pнЊ#O­ф4уƒ ЧMBнvPШ}й)p9EБЛЮQDU Т˜Rт#лжўђВ Єa(9Ш>j„кVSi™ШГ#•SЩ"N  “Œz?•FLŒЗ`8УИ/FќуJЮwаFOа3ўZiГ>ъ­П3іХ} EvVіЙ_ ъ“Yѕ’([MpJ*7ѕщW@Ћ†ЯXЎFLшыir ‹Ўчџ'ў‡ѕ­[`с–м—­Žх@!Цг’ |`еЖЮF‚ф•Ч lI:ЄpO’ГљV•"ўШ@—Ш,ЁХѓ0Aъѓ§sЗZUаьг1З5JˆШљвmpФ50ѓ ТrS0*‡~‰k}*nJнБ”%#@ER$EXnS HJš!ФЄtt>ŸEh§ŠНЧM§эЯсЂГЅ[G) d•$ ~ШЋюЬlRšйЋœљ!H,0 Bїw–œд7Hђд†Юлl—‹rtДЙ ИЬЕряhаЎƒУ:ѕšЗьіСZ,*2VY.кв0Œnч'Ў4Ю:kП^ ыjЙdБИлdЄ!сŒ)J ѕjЕ&)Kаэ9 Ј+“}ДЅipœЄЈ‚G—w9ёжЋЃmьбVѓ З-иСРP7€ A#'O? „Йьх›e К—жЬЉ.•"4MдЄ~В€ш‰єqЊЌk ЋŒˆaaжaD*p`(g8ЯIr}5Lf"спЃ2АFAF№ЏЂсћylјuџЪЫЛ7ћЄ‹№kћUšQEWIiХћ)XзAJˆ2Я'Кы(ЎŽв{8'Lћ1їзЇ!#<™#ўгŸЊ’)RNђŠђŠ(ЂЕnУўе\~?fЈ›aю…_КХџЧnЁ(Ў›mnЌ!Д)j<FIЉ,r^QI!+PVЏBAЅœйЙmŒ”?ЧіК№Ђ)›іЙ œcxўЎ>ƒƒLШ рŒQEilџ„?bGл]fЉJ– ”‚I8tењнmИл­1œ‹6цђ^lшЅЉ*AV:№ь­>ЃZўжћ„П|2П„еeIДйб!Ёљ„х9:Ž#ШњIYЅЛlн ŽЗ KwиЏжjUˆVљї ѓ`УžЂ ™q9idє…ЂкасЗЁFS G0ЁG<:GŠžГЄq; ­vZъђy)D2PœЏ=dт•KhRr•Ž8жšІLeШ1ЙD‡€ЮяMssЖ*|5ХCх­џвHд‘T]ЄВЧЕ Хэ†нBNG—ЄŸОЊQXS,8уЬясдё iР@зЇ|FЁэqm-Il•2ЙЌЉЅuЇ”Hсц­юŠ+:ь­эrО/е&ЋАЁ&Ъ%jЉђ•+=DфџЄTєЇLXPy>TJi 4ІAчŸше–ЭЕ[JЇZ‰"4NYa8оV™8сVНДМм6zФ&л#7"JT šX$nt?­|USgВuŽыlrсvАЛлQ(PZ’„уziюЬm]Чier‹ЕЕкЌ%„Жrсз‰<1ЧЂŸm-иZV†ЬtМл …o+а1уЊдЛНІ%НNЊ2"­\о2|YЌѕkjLй2’…ж­бО5гM]ћ ЗВw)šрџљЂЉЭТ36эќy"• Œь$'§DVГЕKэ–‹Вьor’кГ‰Р!ЄрхVєе.п%Q˜uЈvол’^5'$№уŸ%?ДЛvЭЛhK<˜yЕЊ3Ў(+’цžh'<ёјєЯЎ—…ГЕІ†›*.%'šгM$јЉфћг6ш&КŽPЧFљiЃ•ЋХU[ged9piЙЖЃ;Ъ:…•gL‘Ziн\Pѓ!.…'xnž#Ud7yEѓ†…*:ƒH!N*Iф=*РW@щж–rчnt юяМHЪP^oN39іŒЧ`ˆу С y5YЛm=ТіђYЕD\–J7TJRжrN•KИlЮв[–ьзт= VTžP+ ыУЫOзГюY&ьЃ’Bž“5Ѕ„Єчwžœ77Яšз(ЂГОЪоз+сЂ§Rj"b’›,t”o6—•бGжk‹}њLXMЧк€JO щIЪ“Р ~Кв6IиlІ(™…Kq@oё$єъ<ѕa“л[n0тоix$ яMAH…kЗ!{9љ2/hМeЃ:ЕЋ]р|DiеЅI1nU‘…4г(ќгA Ш}ДАcЪЗЄЭ'–J'8:чOEg…ЬGRнq7 :yЇEЁ;ъЦ‹ІЂњ]aх/‰#xc Ј§xѓUуБЗЙЋŸяЮ§„UjмД5Е“–­O/8H%9бWmЃ2/Зw DH– –е“–лwХџr‡эfœьfЪКфI)SЛЪmЗ*YаЌ№гЊœэ-и›2У\’VћHPVяuРёёХdзMœLЈ­Я‰%Ї^qХ%жJ‚Tœc 9ђЇЧR{и№о’єч•Ж ЁФRUКЂrz†шєеЧgЁ4ѕеЦнiТ •6лЅ,i]Ѓ‹nŒЬFf‡TYl„nў—^j’ыHЗJџ…w М9‹N… т‹цІлM0ЫО[”uч1Юыс[,?o-ŸПрЙYwfџt‘~ jГJ*~ЯГы’•<шHKS‡hGЄžSšЪ`УЕЧS„с[љТпС8'ѕQІ‰iX'…ЙД n–aЌ”ŸшХ:‡bXƒqБКŒ:ЅЗr’rkдE=Р =•Ќ‚бо§ЈЧЇJ…Г1кƒМгa.КЩH=#JЌСиЩ&фнОсЮl!JoNžГLнйV­ђGlЇž7œRЃPњщ›1_эЇ—!-Ё!\ƒРфрч TЖ€к’Z’љШЊеHN8ƒњIуЇЃ_ЙРDb—уЋ~3Ї˜ЎЃе§#L(­[АџЕW‡OйЊ&и{ЁWюБёлЈћlDЫ“љеАапuCЁ# xЭ\m–й7` sА9Юˆi8аžГЎj^NЯ;enнuŒ”ШфжS!mыœŸ§z \6ІnhdTШ7Я‹ХЏЂЊіˆŒ\fMbJЗ™Ќ7ТwHггiХЧeкБк 1/Оњїт†HЭV/жWЌ№ Агer’œ’”ёр|Uшe юОвйхyЎВx$чEЇХФT#ь–SdчB:GA­Ÿ№‚'ьHћkЈН€|Т%іŠCлхФчЄЅ<бчR€Ћ&?*^ЗHZђЉ(у”Rˆ Ў9ѓеНж#[lЩƒ.(nsЌ ’09ЧCцХSd Вж‡Ѓ‡eр„6‡7w‰%=#txШуšЮ.6ЩpRпŒьp]R_ASхbЖ[чlбK—[SСйŒoE[Š!*њМœj]Vу2YэЗ­ЅЭДЂUЩœ`ŸqфёRВvj3QZŸHaЄД”х'Rчъ0Ћ}Š H(†Ц$6PZRpА8e'є€ъЈЦХЦСД"ЗYg(CњžO'BЃд1ѕTм팘$0УЏЩфГИZз!‰Ч^‡=Їаі’+ћrИEi2Ѕ„ЉЂЄя%$‚BsЁр~Њh‹јЖм&Цuїи™ImLЌр8ž!@єŒdыбUлХўt—cілDю‚•“œkфёuSyюЅ‹[ЛЭr!ц‚YBЈH<~Ž='5YC8Ж— wTъќР’= Мv/$ьЅРž&kŸaV !ЭЁš—М’ћDžК‚jсkЛ›]бщc 0кZIIц§zж…j˜ъЖaћ„†чї‰фS‚s QёфгgmNйЕrЊJаиY Y9 '#|qЌŽ§ ХЎZ„ЈэДС’М`ž8уUJьMк.Я@ ђd:lE^P…,‚NzБVшЂ\m\шлƒ-ЈwГЋZjжюбlвDеОйP!\k;Й5-•іВ›Sn$œ•јЕгЫЅ3wѓГ"(žsoЗІz ГŸЄŠнaћylјuџЪЫЛ7ћЄ‹№kћUšSЋl5Mš†€%9ЪБЧж•pКОфЖЃй­ЭЁlД9I AРqУЎ3тсLьvЩN]f|чт8œ!ВAPшѓUэ­•”mЂ9-r™(ХqG.6Б§ ”В!r”—nr<д4”-j $‹LBЪи1ZZŠ”‚4$ыŸM?nR@Ц01ТКР”јЗБТЃn;/щ%$Ѕhа„œУ5Nю6њЛєЙ‰m !JУnшрž і‚оІйl[вЉ3ZVє™(г:pЇЩPMФЧэ`ЂуsЪ25CУЃХЏбš­RЂ’0AСV­икЋУЇьеl=аЋїXПјэгИ–Е& (i”œцћК~ˆЄzM_э›:љpў@ЙюМXsŽp5љ>ъЗX6rщЧšš–WффѕЋЩбRЗ[JБіЄh |7ŽI НнпOVj‹Гћ7\$@žШРuA„’ ЂsŒŒш3ЧЂЏ?“аУ-А€­жгКуа*њІ GJфE/%gtnЇ5œm Йл„g&7Aa Є€БЮXщХRЇ7˜qžЩ* (_˜œ}FЏŒџ„?bGл]0йv“Є-мŽМNЄœyxz*яГё˜„Іc]bКДNVј–з тzѕЧ@ўБZ юЬФш•ЉITdѓWœœxњјVuй”*;щ†ъ“!С•jw\:‘‘дp]RЅ2ƒ"ъќЦљ aІ[+ R’02tФєUNдGЗ?%чпm–ŠZR–29$ >ASЖћEЙзD6wг p8щзгHmЬђ6† РхUЪ< ж8О!T‹­Ак рИгЉ-КщWГ$kУІЂ6dcn-Ю9@5ёdVЉЕОс/п Џс5Y\nRvЫ ЖЂ]ŠъB1њ=_WгS6­ЅbCLП3œќ6ˆJžrЩгŠxів-›“—ШхгИCDф%ёЯšœПtК_aАг›ЉJёфАJёЏEpФ‰T^У+;чynЗЊ4г9сеТ›н/kЙ.сФ+Ls4'ХЁвžEкq-(j"ЬЖжы2+Oі53ГЗЖ’їфЙёd/-Xэ3нœуLЯ€ф‰ Ј”Ч5дŽЂ%iЖfІЁ‚мХЧ"с*IЄ: JЖЮіwˆ#ЏKI РРV2ЅЮу|ЂШJыWIq•d6 ЕбљTKїДFœ˜ЮЦqHЦVД$Тx ”~"eЦSk u%$ƒ‚2*ЉДЖ„к-LЙmŠ•–Žю јєу‡œжlТU6]е ІЙv‚e %XЩТJY!d­_[iЩПЗ ’Д‘ЊWгщущЈЊеЛћUqјt§šЇ_"‰›hЬu{Б{]Ўй?EYWЩЃia6И[JJ|Њп8џHєSз™ЙНw2!oRW'9пђ Оl;з™rVЙзŸŽвH<ЂwBЯ^:*#ВаэNЯоИйфЩш@mжV€Єяg‰щСШŠg{ь‰Е­3n‰ЬЬ—&BУ‹A9ЯP<1уЭ[іUnнЛJ3С*}cЈžp֘J­\6’sw‡!ЖѓJAQмyЊЮеэ7nG}†!‹h!хpнKИGR-Šmcœ’Uх;йњГщЋcс Oи‘ізM-ŸšЗ…†ЗŠœJ7ЙJћЂЖ­šмШ‚)ЖЅЖY…у)*ѓєгЛѓЊT~гЩЖВV•`ЇtUkœчЁлЈьтCЋK-ЄЄхХКŸПJ­пvяЕpЙˆѓPЃЩ) :[P*9H$ŒE*,—§†f:ІHŠќ'П4KAYdœž :OЂК˜Ь™oсЕЎ;‡ЇVъїЯщiЎ<ѕ2ф{…ЯgЃ‰Њ$Е6‚ё$s‡ѓЊ^в@b%Ÿ‘‰!–жVёZВЂЏ%V, ”mНЌёOm+Œџ:гvЗм%ћс•ќ&Ћйй@ђіХр&X JЩЦтВ9пGЃ4юUžS@Ъ АqmКаБФyўў­^лю0›m!IS€Ѓ\чOРуšš‚ЛSФИ†d!%Dя'‡:R=ГExЧvCŽctr›ЅЪпT;Ф‰&VыЭДЂйцђ9ннЦtє§nь{$;лhюV•\‡›e  œЇ9ЩЏ%=UСыƒŽХЃьЇєШ*o*Ч“а)хЛg$I.Й5Д—йIR‚”Ќъ1ЁHєT_dк‘1–,ЯЉШСАЅеWа<ОzЈE*МЄiВЎД,ŠДМЉї=Ÿqй,6лo6mMДQœ™' љъ fНеZ~gэŠњŠ*й-аУ-КFCrb+xjFнwЙТй˜N[р&dDЫ_,й^№QP:`јЦsLžkПпCaшђAЧЕн[kЙѕчЋЎНк Mв%—“ЖШšч!…Ї) :Ющт*оЯмЎЌЎl—њiN(9јHЩР?зlФk#л/ОюRбЬp9ХЮ†:zє#ЧNэћ=vvх”:т[(ТвwH*д? j^mВlЕ‡nЏ)ЗHZyн48>^ŠŽ[`Мк‹Ž:UЊwњp2GеЅ/qНП&зЩ7,Тe)н*Q**гFNЇЌе›БVЛ7їЧ?†ŠЏЛ+Ецн^Hq’28яnН4ыБ§Ё— K“ )Hu :j0•фŒuф5hV›[LU&в‚lЅчC„с[кєžч\ОЄ\ЎхЩ)JаР q%9ЧЃдН‰Чv~ˆ;ЫDFL4$€ЄрЩƒуаЇбMЄпю­Ќ†ZrЯЋ“}ЗŠTІSЈЩшщŒєkT)Б%OmшahZжTVЕхKџИјШЯє+”ЬvUэІ0Д:І IpŽiVИWЂЉгпmжоmзж•Д9ПЊ­tЏ-ИnнМ%ymЩ2pцНiH$5A\v&K…Щп— J’8PТ”3Х#…3к+<;FЧDqй;зŽя­’0ЁФяy5ЦМsтЊej퇧ЊИќ:~ЭVeЈ#oQ bsЏюШЇW–фНpe†Яy-­Ѕ“‚ w‡)Єт;tUЦ4{ЃkhЅТB”p—04Рg:ыZЂц.1Ÿ‰;ŽВЂ@п#Zzфbќ”ЎB%ІљUДT $d:5д<КЖу“зЪ6йRк}фЭ/xŒ$Ž‚œ Tˆaз!ЅЃЕ[ТЫ‰XчtŸшеnП'ЭJв„eч1M'+ошЦ:jЅ|}цЃВД$Ђ>ш /‘Ы?Л’JБІИЦ5вЁ..ƒn@:жЙш8џzГГўD§‰mu!Гpг&чkŠ@Ruaz№дчZE‹ўфѓSœ“-Ћx-Yаu w2IХЙљC˜ђV‡F:ŠŽкq"lуkŽъЄ>У‰} dѓY? yjZлrЖm%†=С{І3ы J#šДЏAх N•Rь—Д %#f›V$ЩнxЛHЩЧ”юŸNkЩ{oˆ‰dFQpЖTž9ЦДос|16БЖ$ИYШe WЃФšЁпXTW%5,и$ЄчнF›ZZJ6ОЪGH$њ+Cкпp—я†W№šЌ—TУШuЩ"ДћЌЧ'ьЬ{“ %ЖУЊP%$ёщЮОŠЋ‡Š—šЇUХ 9JџЎК‘rzвТP†Cnю’VфсMунž|Њ(;Њqa uд`њ‡M1xIunАу,Ѕ{ЊVsгŒŒеыБМз˜\­—Й!=ЋqAm'9нVШђф}. ˜ [KлЊCыSŠм@оТБЂˆш)=$ѕTŒyŽЁMЏЈЉ8*OГJuЭQуФ“yMХ[.\vп[ P;„Žp><ычЊSvХ;pKImACNžМVФіЦўIйdЩRдŒТ’у$n„5^чЌƒg06ЖгŽМЯлє%Vwй[кх|4_ЊMKі/[7mŽКлпъ CЩ!@n‚5у”M2эЖ24їОqмqIVu#Х’jfc”-K RT^eIH':pутЊ§хЉ{-Щ1qиЪhВђ‡чЋгYYQ’F• Жћ+9—oaд%SŽ аЦRœqРчN>:p\r3-2ыЧuЖЪх8ž9ђЊ Ѕ:м‰kZIQF78žiЮиАеЖг#cxюъМё='вsV>Х>уІўіч№бUЉ,Ў\›ДVF\YЦ:ђ„‘іM?ьw!b3ьvв˜,Й‘ЎЯпƒZs•ЗЭšћJOmЉ%ЖдHQСуŽ8Ј+KЩ‡pžУ И9СФ•SІBЯѕЇ‹cŽћN иС ЅЅЗ˜ЯXшъ>[є?o-ŸПрЙYwfџt‘~ jГJŸн/ьгOЇU0Ѓx€ЃxљЊѓ›|Ы,G$ЉШ—?2Ѕ/|-dhxѕ:ЙFИD e•HG*Д д‚­:ЉеС0™†Й2[Vуc9Aз]4зRœВlzДAЗМуФd)е-IЩшб\jRбћ;Њ]Ђ\ЧцNш?ВЌ`љъXнчН­Цк’„AцЈ$“У)ІŽ=*юЫХAO0ЅIн $чQщзЮ*‰SО.r”QЊa;ЉIг#SœiззOv.йkžšхСуљЕ#ащ єВс2}5ZлЉђЌЭ3b ћC+Rж№+о[У€;пЋЦЋЛ7ѕƒ0>RгOДаFuRжt xАIёf Ў ZцЛЪ8\VёЪ‰у­6­[АџЕW‡OйЊ•п”;d9,…,нQ­Z[ˆЖЕН&1umДQ‘œЈ':ѓеН&6ŠЮћ!Х4є2соuЅŽ‘ќёPVЃwБF}4-Е GyCЋUв4Ю :ЗомˆєЉ2‚РY С Тw€#й Rћ5siіRэ"B%лкІ\sšрЦЇQРŽ:dSI;BрŽЖZ…"ќšyVT2B†Aѓgв‰џ*ЯЩŠэ,2”n%Єч;Ё#тЃАБ…2к‡ з†,sœАбЯ§‚Н\vіlЖЌ~ВAЎTгlЦq-6”’p‘ТВ(/!;{!‡WКллЁGЋ*ЯаiльЗaл'T†”Ы/Є(%C@­ e$жЙ 3WлBe4Є‰ˆHVzКŠЁe[УmКш CфMyt:sч.чr…Зи‚yPюълXмЦs•8tgŽš‰MўEЩЉ%вђI),!EIё’М Єу8rАь}єЁфДВNїнŠтіѓ/ЭќœТKmЗ…ЩeY'ЮI>zgќ ‰ћ>къ:4ніЩo<ДЧщ*IџJAєV—dYк=•‰& ˆo‘Сy+^оЃЩ#GЦ qUk†U%Sх-1ц:я,гNЌяЦž*Зr-NЙGмh%drŽ6ŒрЋЃвMyex;йоьPјHєкуv•ћщўUэQEQEQEQMіт_юь}ЇiнQEQEpїі~ЩњЋОШr&е=!Ѓ…Дт“у {&вьЋki#Ж7y„рЉЗNzŽ€ј№zE/А›HвЃіŒЫƒАdВtN9ЄŽБѕŠЛ­Ÿ‚фЈЯХ2у,9Н8ШщЪO–КИ5лœМ„Мм сW& ИмlŒ‘гЅS`Ъ€•rqох4кC:иRTtёœŽЊёq&ЬКЫRe”eQeD% ПPсPwі!лcм]Sѓ\ЪŠаHѓuтЁЌŒ2У.м$P]!]= OœыфBхпи}d’Й9?Д+ши~о[>СrВюЭўщ"ќўеf•!cЙ9jЙЗ!Вœj‚†AŽjлqйЦŸCЎДлЩNрu•+)ВіПЌ дy|TТн5иjDwcЉO{-№Я“‚|]:Ха­[Я[›m Œ)iмзЇ'†jN4и‰JУPоQхCЄљњšЉу)зЇ%$€T“ЬЮr8kб­\ЛFqД_ЎшŒд‰у%1аБ’O8>(uеlJИЬКЩ–ЅЂ1нRмR RВЁ€8qU†Яca†юGxКЮ,a{И>lы‘ŒчЫВэ№сБ$IQ”–в‚лШньqЩач:цГryйpБGИм,g•yЧЃЏ}‚Ќю$­tёŠЈ8…4тЁ…$рŽЃ\ж­икЋУЇьеvDгlœwсE8ы)eЅџљ­рѕъйyqг"<ы|ІPя"ІТVYРЦюЄdŽ==YY-іЛУNШ•Ў\<ЄЅ у|c…W6зg”gАыRЁИQл qJСаъXгЂЂn[6н†Яё†ІБ!ђŽzT‘Эз<сCNЃMvг8Ђ+bШqKqn)ЬИ”Є ёцЅm›.cПіoЬ6м”Їx7т• uРг9ЇиЂБ”?•qЅ)|ІrGђЈшїA’Lэ•7Э PпCбгЧ‡ ŒкgІ”N–|’VH04Ћ[?сOи‘ізLћ\^zкъГПд“€BАњ‚<€“RMйНЃ^ЯЫZкЕм\!—pqŽ#ЏЌuŠйьЭфщmSь€P$јє4Т$Yr/*~y[/ (Жл( J†FrЏвѓŽš‡кXœ–К4ЪAy8i­м!У$ž'ЭуЅ#‰qvyюD6ћ‰Fшk“IЮїыUp”Л`ИГ—^+P8Rw)ІB@сŽКЏЮDШадоI)ˆ’ ‡о+gЯU›`Cqfно ‘Эlзœ'ЫŠgБЋ.mНЕjтЉњ oQПЛJ§єџ ЊіŠ(ЂŠ(ЂŠ(ЂŠ(ІŒћq/їv>гДюŠ(ЂŠ(ЂИ{ћ?d§Uѓюг{Ё—хOйжЯэ›’ЄібЦШШ#‡ ЗЭŠЬ€ЦвXUН!Ќ)дg9гR~}8"Ќћ/ЕL]%—ф8˜А‚—#ш кpСшЎ.ћKl‹s!ЙчXбАй-ЈgL`g{ ІЂрІnх<ЂТжЏЮЏsx ;OІЅ'эЊ<5ЁLœЈЌ„КBжЃфсUФЧ~ђљ•+yˆ œ€ъ‰Ч‹Ќљ?їL/wvЄa #BЎ•žГQіЯmb|:>аЏЄсћylјuџЪЫЛ7ћЄ‹№kћUšQZVЮОЋюЧvЃE*• dс@‚:jИф:гЊн$aпo9ўМu#lЖЃ8„КвШNB)V3ЧЧеCюю%.5}Њї5OЅIuZѕыЭњ)“аœrDžжT—c6Ж(гtѕёєдŽЮ]ЄьжгG˜ы)RТOВNyРјѕХI\эkaHИAAz;ъхдNъ@(œœ ЧЫOв$6р )ЭIСгv{З83Bc<дVŠджі‹RГФrNqбб\Y6йnЅщвk‘hЁ9^PЅpV@ёŽулЊДr1ЅЌoКJRљ5-\tёU[Гю“ Ѓ•э†cЌЉn~‰зџ?ЈэЂК6P‹\3џСєž“єpшсIьOЛ+_УЈжљћДЏпO№šЏhЂŠ(ЂŠ(ЂŠ(ЂŠhЯЗџwcэ;NшЂŠ(ЂŠ+‡ПАsіOеX6б[g;}’уpЄ- )!IiDhщХF~IЙx>WШЋюЇжЕ_эатЫA8 +њerсђи;†*оRбDxёŒзФ.ЮЪXwRяoL@#и˜ЧxN•Ыі›c*J“*цшЯ8Ї‡™}Uљ’kŽг[J9ђg†œj*тЛѕЩ@= J[%Д0 <˜І’n^•ђ*ћЉЭЖзqMЮ"•HфK*гœ@AЈ :жЋ…МЖ7yљW‹ЇяЊѕщс"я)бŒ)Х-_™џ"~ФЖКЭ)эЊэ&б,?ZƒСCЧщ5pmЋ^д%.л–ˆS€еЕ+E?.}<šп]ЌAЈзKLЅr-”-Ц(•(‘Ю#Lh8Нv@7RуP-oЧ.‡ж€ |@­W`мƒ9ЩnZ„їVwЗ”к‘И­rqŒtёЇRзwИ5Ъ\d& LяЅ!yV:0zМ™ЧN* eогДюŠ(ЂŠ(ЂИ{ћ?d§T•ПкшпЈSŠ(ЂŠ(ЂŠюЗ–Я‡_№\ЌЛГКHППЕYЅU—e/ъЗЉpнеЇFN1ЅXі… 9-YIl>€“Ÿв8аƒфy…B-Срво^уdЄžМCыm BŠP’JБЏ;##Я%;[ЎДыeА]wyEDžЃњсZNокЃ%ауjh?%цRœVшфœўDžН*€ъ&!ЈЪrп% тЅЖ œgЏЋ‘і,qцЩmYs”Цщ!LT‘ЮrG }Œu[ŽЪЙ9 ђ‰Ъ’H )Цs“9ЙЖЫзœh%+F0x`є}ЯTi2”њy[ЫWўБIж­икЋУЇьеl=аЋїXПјэеЃБУ+›cОD“C™FъвtBЏїЉ–тХFв!ф<АщKd ј9ђXo3У)Qп$, BБУNЌюшzGкЛЃˆKkоPpЅУЁЮ уЩж)“=ЎЂъФ‡ŽP€ЖRпцЮ5оЦК§U5&t‡Ѕ!ЧTАЗ€еHзч^ОѕpЈ{“ХаЄ/-ЉN'%YI59Іeђs#•ІњIЯNщЊФ‰ћhьџ„?bGл]f”WЈZ›XZR r8"Ісmю R„Ых[NЁЗ“ОžЎ4э[vYЩ#"*tІ/эeеї”№q 8Б‚ІСIЧІЂп—"RŠŸyK$ффвTTцФћВЕќ8њo‘ПЛJ§єџ ЊіŠ(ЂŠ(ЂŠ(ЂŠ(ІŒћq/їv>гДюŠ(ЂŠ(ЂИ{ћ?d§T•ПкшпЈSŠ(ЂŠ(ЂŠюЗ–Я‡_№\ЌчГІхqкыƒo•)(BТ‹,Љ`юœ Я;™ПјуѓE§дw3№Чц‹ћЈюfџр;ЭїWmlжа%ф+ђФa@џu_нWЉP.HЈЕK*I*RЙsF№Тxuf™?bž['ђ\Ѕ/ТŽ:zЉПфKВš EЎZs‚sxЮƒЋХIЎб.Є~L˜w7Йa_GP­kvљk/"+ХеЮc юBCjI$~ЎOŒе vЋуO5‹|УИ цzМXЧEH],ЗьaИPЃœ›ЉЅХJ ЧpOXtШl…ЦмЙ-ђп%Д([!ЈсЧсєbšпЌзЕ6ДЕlšрZB@Du+:№cбŠ­w3ДИќбЯКŽцoўИќбui}Šэг­жйшDU-ф”‡šR шШЊVгиЏ/=Бе5іW6ыGZ’pУ`рж)m”…Д\+dЙICŸ№Ю'BуЋЃ›=rpTєG\ЇЖ9@?6q€ьу9гB*a.Ю.†Wф!H@%($7‰ЯћєžКЁm6Эмџ+!-B™)ЂоіћlЉA$FƒЎЁтlНщзђЋLдnŒ‚ЈъN}"І™А^™l%шRžmЁК†д \<ќюьbќ–ќќжќ46ќ|іќќŠŒќ zќфўфLJќќ.ЄўќFDžќќ\ЬўЬќў|ќДўl\ќ,0$џHP`Ž dcm2nii DICOM to NIfTI image conversion
dcm2nii DICOM to NIfTI conversion
  Introduction

Important note: dcm2nii is still beta software - please carefully monitor the output from this software. In particular, be aware of potential left-right flipping. This has only been tested with Philips Intera DICOM, Siemens Trio DICOM and Philips Intera PAR/REC images. This software is provided under the BSD license.

DCM2NII attempts to convert images from the proprietary scanner format to the NIfTI format used by FSL, SPM5, MRIcron and many other brain imaging tools. NIfTI is a modern incarnation of the Analyze format, but includes important information like the orientation of the image. DCM2NII is a stand-alone program that is distributed with MRIcron. It is natively compiled for Windows, Linux x86, Mac OSX PPC and Mac OSX x86.


The NIfTI image format standard was designed for scientific analysis of brain images. The format is simple, compact and versatile. The images can be stored as a pair of files (hdr/img, compliant with most Analyze format viewers), or a single file (nii). Programs like FSL and MRIcron can also read compressed (nii.gz) images. One nice feature about NIfTI is that the format attempts to keep spatial orientation information. Therefore, NIfTI software that can read the spatial information (MRIcron and SPM5) should reduce your chance of making left-right errors. Also, software like SPM5 will tend to be more accurate at coregistering images, as all the images from an individual can use the scanner position as a beginning estimate for alignment. For example, here are two scans from the same individual (the sagittal T1 is shown in grayscale, and the coronal FLAIR is shown in reds). Note that the scans were acquired with different orientations (with the FLAIR along the axis of the hippocampus), however MRIcron shows the image orientation correctly. NIfTI image transform

Installation

  1. Follow the instructions to install MRIcron on your hard disk - this should create a program named dcm2nii.exe (Windows) or dcm2nii (Unix).
  2. Double click on dcm2nii.exe - a file named dcm2nii.ini will be created. If you are using Windows, this file is in the same folder as dcm2nii. If you are using Unix (Linux, OSX) then this file is created in your home directory.
  3. Open dcm2nii.ini with a text editor (double click on the file). You will be able to adjust the settings:
    Text Description
    [BOOL]
    AnonymizeSourceDICOM=0 If '=1' then dcm2nii will create anonymized copies of DICOM images (remove name, DOB, patient ID, sex). No other conversion will occur.
    ManualNIfTIConv=1 If '=1' then dcm2nii will prompt user to describe output subformat for every NIfTI image dragged onto the program. Otherwise, subformat will be based on $D, SingleNIIFile,SPM2 settings.
    4D=1 If '=1' then dcm2nii will generate 4D files (FSL style), otherwise output will be 3D (SPM style).
    Anonymize=1 If '=1' then patient name will not be copied to NIfTI header.
    SingleNIIFile=1 If '=1' then dcm2nii will create .nii files (FSL style), otherwise .hdr/.img pairs will be created (SPM style)
    Gzip=0 If '=1' then dcm2nii will create compressed .nii.gz files (FSL style).
    SPM2=0 If '=1' then dcm2nii will create Analyze images (SPM2 style), otherwise headers will be in NIfTI (SPM5/FSL).
    AppendDate=1 If '=1' then output filename will include date of study.
    AppendAcqSeries=1 If '=1' then output filename will include acquisition number.
    AppendProtocolName=1 If '=1' then output filename will include protocol name.
    AppendPatientName=0 If '=1' then output filename will include patient name.
    AppendFilename=0 If '=1' then output filename will include source filename.
    EveryFile=1 If '=1' then all .par/.rec files in the source folder will be converted, otherwise only the file specified will be converted
    [INT]
    BeginClip=0 Specifies number of volumes to be removed from the beginning of a 4D acquisition (e.g. avoid T1 effects)
    LastClip=0 Specifies number of volumes to be removed from the end of a 4D acquisition (e.g. fMRI scanning continued after behavioral paradigm ended).
    MinReorientMatrix=255 Images with a larger matrix size than this value will be reoriented to canonical space (see below).


  4. With each option listed under the heading [BOOL], add a '1' for yes and a '0' for no. For example, if you want to have images saved as .hdr/.img pairs, set SingleNIIFile to 0. If you want to save images a single .nii files, set this to 1. The append options adjust the output filenames. For example, if you had both AppendDate and AppendProtocolName set to 1, the converted images would have names such as 20060331_123456anat1x1x1.nii if the data session was acquired on 31 March 2006 at 12:34:56 and the protocol was called 'anat1x1x1'. The last two values (listed under the heading [INT]) except integer values - for example if you set 'LastClip=8' then the last 8 volumes of every 4-dimensional dataset will not be saved (e.g. if you had an fMRI dataset with 120 volumes, only the first 111 volumes would be converted). A fuller description of these options is in the gray box below.

Running DCM2NII

There are two ways to run dcm2nii

  1. You can either drag and drop files onto the program - this will convert the images using the values in your dcm2nii.ini file (see above).
  2. You can launch dcm2nii from the command line, specifying specifically the options to use.

To use dcm2nii by dragging and dropping:

  1. Place all the DICOM (or Philips PAR/REC) images you wish to convert into a folder where you have write access.
  2. Drag and drop one of the images onto dcm2nii. 
  3. You can now vew the images with MRIcron, SPM5, FSL, or other Analyze/NIfTI viewers.
To see your options for running dcm2nii from the command line, simply execute the program without specifying any files (e.g. just double click on the program to launch it). The available options will the be written to the screen:
dcm2nii 12 May 2007 by Chris Rorden
Either drag and drop or specify command line options:
dcm2nii
OPTIONS:
 -a Anonymize [remove identifying information]: Y,N
   default: Y
 -b Clip beginning volumes from 4D file: 0..1000
   default: 0
 -d Date in filename [filename.dcm -> 20061230122032.nii]: Y,N
   default: N
 -e events (series/acq) in filename [filename.dcm -> s002a003.nii]: Y,N
   default: Y
 -f Source filename [e.g. filename.par -> filename.nii]: Y,N
   default: N
 -g gzip output, filename.nii.gz [ignored if '-n n']: Y,N
   default: Y
 -i ID in filename [filename.dcm -> johndoe.nii]: Y,N
   default: N
 -l Clip last volumes from 4D file: 0..1000
   default: 0
 -n output .nii file [if no, create .hdr/.img pair]: Y,N
   default: Y
 -o Output Directory, e.g. 'C:\TEMP'
   default: source directory
 -p Protocol in filename [filename.dcm -> TFE_T1.nii]: Y,N
   default: Y
 -s SPM2/Analyze not SPM5/NIfTI [ignored if '-n y']: Y,N
   default: N
 -v Convert every PAR file in the directory: Y,N
   default: Y
HINTS
  the combination '-d n -p n -i n -e n' will be ignored.
  You can also set defaults by editing C:\lazarus\mricron\dcm2nii\dcm2nii.ini
EXAMPLE: dcm2nii -a y -o C:\TEMP C:\DICOM\input1.par C:\input2.par


Reorienting to canonical space

The NIfTI format stores spatial transforms so that software can determine the oreintation of the image. This means that MRIcron can display the image with an intuitive orientation. However, many programs ignore these transforms, and display the images as they are saved to disk (e.g. FSLview, MRIcro) - this means that a sagittally acquired scan appears very differently from an axially acquired scan. In fact, the three spatial dimensions (left-right, anterior-posterior, superior-inferior) can be saved in 48 different orthogonal orientations. The drawing below shows just three of these possible orientations. Orthogonal orientations
You can set dcm2nii to reorient all images so they are all aligned to the nearest orthogonal direction to 'canonical space' (i.e. as close as possible to the rotation matrix [1 0 0; 0 1 0; 0 0 1]). This means programs like FSLview and MRIcro will display the images in a sensible orientation, regardless of the acquisition. The NIfTI transform codes the residual oblique orientations, so no information is lost in this tranformation. However, you will only want to orient anatomical scans to canonical space - reorienting fMRI data can disrupt slice timing correction (as the software assumes that the slice order of the stored data is correlated with the time of acquisition). Reorienting can also disrupt analysis of the DTI data (as the diffusion directions are not adjusted for the change in image orientation). Therefore, the "MinReorientMatrix" allows you to adjust which images will be reoriented - a value of 255 ensures that T1/T2 scans (typically with a 256x256 matrix) are reoriented, while fMRI (~64x64) and DTI (~128x128) scans are not. If you do not want any scans reoriented, reset this to a very large value (e.g. 5000).

After reorienting, dcm2nii will attempt to 'autocrop' T1-weighted anatomical images (images with a Echo Time [TE] of less than 20ms). A new copy of the image is created with the prefix 'c' that attempts to remove excess air surrounding the individual as well as parts of the neck below the cerebellum. This excess neck can disrupt normalization of images (as the template images do not have similar neck regions). This new image has a slightly different NIfTI transform - the origin is adjusted to compensate for the removed portions of the image. The image below shows a T1-weighted scan before and after cropping.
Orthogonal orientations
As a final note, reorienting images is useful if you want to create masks for an image to use with SPM or FSL. These programs require that the mask image has precisely the same dimensions as the image it is designed to mask. In these cases, you can not apply the precise spatial transforms to an image (as the oblique orientation corrections means that the resulting drawing will have different dimensions than the original image. Therefore, you will want to draw a mask on on a image that has not used the fine spatial transforms. You can use MRIcro or FSLview to do this (as they ignore these transforms). If yu use MRIcron, select Help/Preferences and uncheck the 'Reorient (reslice) images when loading' option - this will ensure that the raw image is loaded. Regardless of which software you use, having a canonically aligned image will mean that the image will be displayed in a sensible manner.

Diffusion data

Diffusion sequences are sensitive to the random spontaneous motion of water molecules. This movement is anisotropic in fiber bundles - in other words it preferentially moves up and down the fibers whereas motion across the fiber is constrained. Diffusion tensor imaging (DTI) use different gradient directions so that different images are sensitive to specific directions. In order to process this data with medINRIA or FSL, you need to extract the diffusion direction information as well as the images. For these images, dcm2niigui will attempt to generate .bvec and .bval text files. This information is extracted from the DICOM header (for Siemens data the software attempts to read the "B_value" and "DiffusionGradientDirection" fields from the CSA header).

NIfTI Sub-Formats

SPM5 and FSL both support NIfTI format images. However, by default these programs assume your data is in slightly different formats. Most SPM5 users generate a single 3D volume for each timepoint, and each image is saved as both a .hdr and .img file (separating the header information from the raw image data). On the other hand, by default FSL uses a single 4D dataset, with all the data stored in a single .nii file (this single file contains both the header and raw image data). To save disk space, FSL saved these files as compressed gzipped files (.nii.gz). Therefore, you may want to convert your DICOM data to a different NIfTI sub-format depending on how you want to process and analyze your data. You should adjust dcm2nii's settings depending on which software you will use for post-processing. Here are some general guidelines:
  1. FSL/MRIcron: compressed NIfTI (.nii.gz) - SingleNIIFile=1; Gzip=1; SPM2=0
  2. Recent software (SPM5/Voxbo/FSL/MRIcron): NIfTI (.nii) - SingleNIIFile=1; Gzip=0; SPM2=0
  3. Legacy software (SPM2/Analyze/MRIcro): analyze (.hdr/.img) - SingleNIIFile=0; Gzip=0; SPM2=1

Converting between NIfTI Sub-Formats

FSL includes the avwsplit and avwmerge tools for converting between 3D and 4D NIfTI images. This is useful, as FSL likes 4D images while SPM likes 3D images. The latest versions of dcm2nii (since May 2007) can also help you convert between NIfTI subformats. Specifically, if you drag and drop a NIfTI image (.nii, .nii.gz, or .hdr/.img subformats) onto dcm2nii it will ask how you want the data converted. You can convert these files to SPM2 (analyze 3D hdr/img), SPM5 (3D hdr/img), 3D nii, 4D nii, and FSL (NIfTI 4D nii.gz). If ManualNIfTIConv=1 then the user will be prompted for every file to specify the output format, while if this value is ManualNIfTIConv=0 then the files will be converted automatically using the sub-formant specified in the dcm2nii.ini file. Note that this software will both change subformat and/or convert 4D files to 3D files. However, it does not convert 3D files to 4D files (use avwmerge for this).

Anonymizing DICOM images

This software can also 'anonymize' DICOM data - protecting the participants private information. There are a number of free as well as professional programs that can help anonymize DICOM data. My favorite is the free uniPACS viewer can strip all the private tags from a DICOM file (choose File/BatchFileExport and select 'Anonymize' from the file menu). However, it is worth mentioning that some DICOM images store important data in the 'private' tags - for example, Siemens data includes information about the number of slices in a mosaic as well as DICOM diffusion directions. Therefore, use these 'strong' anonymizers with caution. In contrast, dcm2nii provides a 'weak' anonymization: it only anonymizes the patients name (0010:0010), ID (0010:0020), date of birth (0010:0030), sex (0010:0040), age (0010:1010) and weight (0010:1030). The name is replaced with the number of seconds that elapsed between the study time and January 1, 2000 (ensuring that data from different individuals will not be confused). In theory, the participant can still be identified by study time (if you know when people received scans), and some manufacturers may store personal information in other parts of the DICOM file. To use dcm2nii's DICOM anonymizer, simply edit the dcm2nii file to read "AnonymizeSourceDICOM=1". Then just drag and drop DICOM files on the program - an anonymized file will be created (with the same name as the original image, but with the extension '.dcm' appended at the end). Note that in this mode the software will not convert the DICOM files to the NIfTI format. You may want to keep two copies of dcm2nii with different filenames (and hence different .ini files) - for example you could call one 'dcmanon' and another 'dcm2nii' so that one copy generates anonymized files and the other converts files.

dcm2niiGUI

I find dcm2nii very easy to use - just drop the images that you wish to convert onto the program's icon. However, some people prefer programs with a graphical user interface. The Windows distribution of MRIcron includes my dcm2niigui program - which is simply a version of dcm2nii with a graphical interface. Just launch the program, then drag and drop the images you wish to convert. The 'Output format' pulldown menu determines whether the images will be saved in SPM or FSL style NIfTI format. You can also choose help/preferences to more advanced options. In addition, you can use the File/AnonymizeDICOM command to strip personal details from DICOM images. Finally, you can use the File/ModifyNIfTI command to change existing NIfTI images - this command guides you through selecting the images and then choosing how you want to modify the images (remove volumes, changing subformat, reorienting, or changing the order of the 3rd and fourth dimension).
dcm2niigui

Performance

Converting DICOM images is fast compared to the other processing stages common to neuroimaging. However, several people have asked me how to improve dcm2nii's performance. I have tried to design this software to be quick - it attempts to minimize the amount of time writing to disk (by using a large amount of RAM). The table below shows the time required to process a standard neuroimaging dataset (1060 DICOM images [325Mb] with 792 fMRI volumes [36 slices, saved as mosaics], one T1 weighted anatomical scan and a field map). This dataset is typical for a one hour scanning session. The table below shows the time (in seconds) for dcm2nii (and SPM5) to convert these images. The 'GZ' cells reflect times for creating FSL style compressed .nii.gz images, while the other cells report times for creating SPM5 style .hdr/.img pairs. In brief, creating uncompressed images is generally constrained by disk speeds, while creating compressed images is limited by your processing power.
Setup eSata Internal HD USB HD GZ eSata GZ Internal HD GZ USB HD
dcm2nii 2166Mhz CoreDuo Laptop 12
20 41 70 70 73
SPM5 2166Mhz CoreDuo Laptop 94 138 165 - - -
dcm2nii 667Mhz G4 Laptop - 41 - - 229 -

Sample Datasets

Here are some sample images that help show whether images are converted with the correct image orientation:
  1. GE DICOM dataset. Twelve 4D EPI series, each with five volumes: s26692 axial ascending sequentia, s26693: axial ascending interleaved, s26694: axial descending sequentia, s26695: axial descending interleaved, s26696: sagittal right to left sequential, s26697: sagittal right to left interleaved, s26698: sagittal left to right sequential, s26699 sagittal left to right interleaved, s26700: coronal P to A sequential, s26701: coronal P to A interleaved, s26702: coronal A to P sequential, s26703: EPI, coronal A to P interleaved. A water filled fiduical marker is placed over the right temple of the participant. Data were acquired on a GE-SignaHD-Excite scanner at 3 Tesla using an 8 Channel Brain Array Coil. The first volume of each series has been marked with a '1' on the image. (LMU Grosshadern)
  2. Philips DICOM dataset. Six 4D EPI volumes, each with two volumes: sagittal, coronal and axial each with both 'ascending' and 'descending' slice order. The white line added at the bottom should be shorter on the earlier volumes. (MUSC Center for Advanced Imaging Research)
  3. Philips PAR/REC dataset. Five 4D EPI volumes - same raw data as Philips DICOM dataset, but only a single axial volume is included.(MUSC Center for Advanced Imaging Research)
  4. Siemens Trio B12 DICOM dataset. Six 4D EPI volumes, each with two volumes: sagittal, coronal and axial each with both 'ascending' and 'descending' slice order. A saline bag is placed near the participant's left temple. (USC McCausland Center)
  5. Siemens Trio B13 DICOM DTI dataset. From May-2007, dcm2nii attempts to generate FSL and medINRIA compatible descriptions of the B-values (bval) and Diffusion Gradient Directions (bvec). For instructions on using FSL and medINRIA, see my DTI page. These sample images were simply designed to validate dcm2nii's conversion: these protocols are not appropriate for any other use (our standard protocol is described here). This large (33Mb) file includes four 20 direction EPI datasets: the first two are true axial (aligned to scanner bore, not the participant's head) and are identical except that the phase direction is Anterior-Posterior in the first and Right-Left in second. The third volume is identical to the second except that the imaging plane has been rotated: a pitch and yaw have been applied. The final scan is a coronal scan,also taken in plane with the scanner's bore with pahse encoding in the right-left direction. The file also includes a matlab function (dtivecs.m) that illustrates dcm2nii's calculation for correcting the diffusion directions for the imaging plane, using suggestions from dicom2ana (see below) and Paul Morgan. (USC McCausland Center)

Alternatives

Each manufacturer has interpretted the DICOM data standard a bit differently. Therefore, you may want to test several programs to see which one is best suited for your data
  1. LONI Debabeler is a Java applet that can run on just about any computer. It can also read a number of medical imaging formats. Another nice feature is that it reorients the raw data to be approximately aligned with the nearest orthogonal orientation (i.e. coronal and sagittal scans are resliced along the axial plane).
  2. SPM5 includes a DICOM to NIfTI covnerter that works particularly well for Siemens data (requires Matlab).
  3. dicom2nifti is a matlab script for converting DICOM to NIfTI (requires Matlab and the Matlab Image Processing Toolbox). [an alternative version is described here.]
  4. xmedcon offers limited NIfTI writing support for many image formats. It uses the niftilib tools, which look very useful.
  5. MRIconvert is a popular converter for Windows and Linux.
  6. dinifti looks useful.
  7. Here is a script that uses dicom2 and FSL to convert DICOM images to NIfTI.
  8. XMedCon includes the ability to convert between Acr/Nema 2.0, Analyze (SPM), Concorde/µPET, DICOM 3.0, CTI ECAT 6/7, NIfTI-1, InterFile3.3 and PNG or Gif87a/89a formats, as well as an elegant image viewer.
logo
mricron-0.20120505.1~dfsg.1.orig/html/bat.html0000664000175000017500000003136610623047634020266 0ustar michaelmichael MRIcron Batch File Page
MRIcron Advanced Settings

Advanced Options

Command line options   Usage: mricron BackgroundImageFilename [options]

If you launch MRIcron from the command line you can (optionally) include default parameters to specify desired settings. Nice examples of these commands are the batch files that are created in the same folder as the mricron.exe program (you need to include the 'Tutorials' when you install mricron). For example, lets look at simple batch file:
  start /MAX mricron .\templates\ch2bet.nii.gz -c -0 -l 20 -h 140
The terms 'start /MAX mricron' are standard parts of a Windows batch file. This launches MRIcron and ensures that the main window is maximized to fill the entire screen. You could run this from a batch script (a text file with the name '.bat') or from the command line (e.g. choose Start/Run and type 'cmd' to start the Windows command line). Note that this script will only work from the folder where MRIcron is stored. Otherwise, the script will need to specify the location of the software:
  start /MAX c:\mricron\mricron c:\mricron\templates\ch2bet.nii.gz -c -0 -l 20 -h 140 x
Note that after the program name the script specifies the background image that is to be loaded, in this cas the image ch2bet.nii.gz. After this, you can optinally specify additional settings. For example, the "-c -0" sets the image to have a grayscale color scheme. While "-l 20 -h 140" sets the image brightness to be set for the range 20..140 (e.g. voxels with values less than 20 will appear black, voxels greater than 140 will be white, and intermediate values will be linearly scaled for this range). Finally, the 'X' command adjusts the adjusts the proportions of the sagittal, coronal and axial panels so that each of these views will be shown at a similar scale.
This next example shows how you can load an overlay on top of another image:
  start mricron .\templates\ch2.nii.gz -c -0 -l 20 -h 140 -o .\templates\ch2bet.nii.gz -c -1 10 -h 130
Note how this script uses some parameters multiple times - the first set of -c-l-h parameters refer to the background image (ch2), while the second set refer to the overlay image (ch2bet). The parameters that can be adjusted for each image are noted with an asterix in the table below (-c, -l, -h, -z).

Here is a complete list of the parameters you can specify

Parameter Notes  
-b <%> Sets transparency of overlays on background. Supported values are -1,0,20,40,50,60,80,100. A value of -1 signifies additive color blending.  
-c <LUT name> Specify color lookup table. "-c bone" will load bone.lut. You can also specify the index number of the LUT by using the prefix "-". For example, "-c -1" will load the red color scheme, while "-c -0" will load the grayscale color scheme. *
-d Defaults will be saved when the user quits.  
-f Loads image 'flat': the NIfTI orientation matrix is ignored. This is the same effect as editing the .ini file and setting 'Reslice=0'
-h Sets maximum value for image intensity scaling. For example a Z-score statistical map loaded with "-l 1.96 -h 4" will show values near 1.96 as maximal dark and values near 4 as maximal bright. See also -l and -z *
-l Sets minimum value for image intensity scaling. see -h *
-m Will show a multi-slice view using default multislice settings.  
-m <INI name> Will show a multi-slice view using the settings for the file <INI name>. For example "-m c:\mymulti.ini". Multislice settings files can be created by selecting File/SaveSettings in the multislice window.  
-o <overlay name> Will load overlay <overlay name>. For example "-o c:\statmap.hdr".  
-r Will show a rendering using default rendering settings.  
-r <INI name> Will show a rendering using the settings for the file <INI name>. For example "-r c:\myrender.ini". Rendering settings files can be created by selecting File/SaveSettings in the render window.  
-s <v> Settings smoothing. <v> should be a value 0..3. If <v> is odd (1 or 3) then bilinear smoothing is applied to images (otherwise, nearest neighbor is used). If <v> is 2 or 3 then overlays will be scaled using trilinear interpolation (otherwise, nearest neighbor is used).  
-t <%> Sets transparency of overlays with respect to other overlays. Supported values are -1,0,20,40,50,60,80,100. A value of -1 signifies additive color blending.  
-v <drawing name> Will load volume of interest <drawing name>. For example "-o c:\lesion.voi".  
-x Main window will be maximized to fill entire screen. The size of each view (sagittal, coronal and axial) will be proportionally scaled.  
-z Image color scaling will be from zero. For example a Z-score statistical map loaded with "-l 1.96 -h 4 -z" will hide values below 1.96, but will show values near 1.96 as a medium intensity and values near 4 as maximal bright. See also -h *

Default Settings

You can adjust many of MRIcron's settings by choosing Help/Preferences. A window will appear that allows you to edit many of the values from your mricron.ini file. The window is shown below, and the mricron.ini settings are described in the table below.

overlay panel

MRIcron remembers users preferences. Three standard .INI format text files are automatically generated: mricron.ini, \render\default.ini, and \multislice\default.ini. The file mricron.ini saves general settings, while the other files store values specific to the rendering and multislice views respectively. The user can save custom multislice and rendering settings by opening up the render (or multislice view) and creating their desired settings and then choosing File\SaveSettings. Deleting the ini files will return the software to its factory settings.

The mricron.ini file has a few values that can not be adjusted from the program, but can be changed by editing the file with a text editor. Here is a complete list of the parameters you can specify

ParameterNotes
file0...file5=Stores the five most recently viewed images. These will appear in the File/OpenRecent submenu.
reslice=If 1, image will be spatially oriented using the NIfTI transforms, similar to SPM5. If 0, images will be shown as saved to disk (like SPM2 and FSLview). Reslice=1 requires more memory, but hopefully avoids left-right confusions.
ShowDraw=If 1, the 'Draw' menu and drawing tools will be visible.
Smooth=If 1, resliced images will use the slow but relatively precise trilinear interpolation
XBar=If 1, cross-hairs will mark the currently selected voxel.
OverlaySmooth=If 1, overlays will be scaled to background image using smooth trilinear interpolation. If 0, overlays will use nearest neighbor (and the edges may appear jagged).
LRMirror=If 1, images with NIfTI orientation parameters will appear in radiological convention (with left on the right). If 0, images will be in neurological convention (with left on the left).
Yoke=If 1, images in multiple instances of MRIcron will show the same location - changing the selected voxel in one instance will cahange the view in other instances.
MaxDim=If an image is larger than this value in any dimension, the image will be rescaled so that this is the largest dimension. This minimizes memory consumption. For example, if this is set to 256 and you open an image with 512x512x300 voxels, it will be displayed as 256x256x150voxels.
Zoom=Default image scaling. Zero specifies that the image is strecthed to fit the window, 1 for best integer fit to window (e.g. if a 235% scaling is possible, the image will be scaled 200%), 2 for 100%, 3 for 200%, etc.
LUT=Selected color scheme. E.G. if 24, then the 24th color scheme is used.
XBarGap=Empty gap between crosshairs. If 7, then 7 pixels separate crosshairs.
XBarThick=Width of crosshairs.
XBarClr=Color of crosshairs. This is a 24-bit value, with top 8 bytes representing blue, middle 8 representing blue and least significant 8 representing red. So a value of 255 would be a bright, pure red.
VOIClr=Color of volume of interest drawing. Same values as XBarClr.
BGTransPct=Transparency of overlays on background (in percent). 0 for opaque overlays, 50 for a translucent overlay (50% each) and 100 for a completely transparent overlay. -1 specificies additive combination.
OverlayTransPct=Transparency of overlays relative to each other. Same values as BGTransPct
MaxThreads=Maximum number of CPU cores used for rendering. If set to 5, only five cores will be used regardless of the number of CPUs. Higher numbers lead to faster rendering, but can slow other applications. For systems with more than two cores, a good value is the number of cores minus one. For example, with a quad-CPU machine, set this to 3. If you have fewer CPUs than MaxThreads, MRIcron will use all of your available CPUs (e.g. threads will equal the number of CPUs), offering optimal speed.
SigDigits=Number of digits shown after decimal place. Influences the voxel intensity value shown in the bottom-left status label.
TabletPressure=Only used when using a Tablet device (e.g. Wacom tablet or a Tablet PC which pressure sensitive stylus). Threshold for transitioning between a thin (1 voxel) and thick (3 voxel) pen - if pen pressure is double this threshold, a five pixel line will be drawn.. Tablet stylus pressure will range from 0..100. If set to 100, the pen will always draw a thin line, regardless of pressure. If set to 30, light pressure (<30%) will create a thin line, medium pressure (30..60%) will lead to a 3-voxel line and heavy pressure (>60%) will causes a very thick line (5 pixels wide).
TabletErasePressure=Pressure threshold for stylus eraser on Tablet systems. Same comments as TabletPressure.
LesionSmooth=Smoothing Full Width Half Maximum (in mm) This is used by the Draw Menu's "Create SPM5 mask" function.

logo
mricron-0.20120505.1~dfsg.1.orig/hrf.pas0000664000175000017500000001456011326434466017153 0ustar michaelmichaelunit hrf; interface uses define_types, utypes,metagraph; const kHRFdur = 24000; //ms for 'full' HRF - window size for HRF function CreateHRF (lTRsec: double; var lKernelBins: integer; lDefaultsStatsFmriT: integer; var lHRFra, lTDra: doublep): boolean; function ConvolveTimeCourse(var lTimeCourse: PMatrix; var lKernel: doublep; var l4DTrace: T4DTrace; lCond,lCondOut,lnVol,lKernelBins,lDefaultsStatsFmriT,lDefaultsStatsFmriT0: integer; lTRSec: single; lSliceTime: boolean): boolean; implementation uses math {power}, ugamma {gamma},sysutils,dialogs; const kHRFkernelSec = 32; //kDefaultsStatsFmriT = 16; //each TR is supersampled at 16x resolution //from SPM's hrf.m function spm_Gpdf(x,h,l: double): double; //emulates spm_Gpdf begin result := power(l,h)*power(x,(h-1))* exp(-l*x); result := result / gamma(h); end; function fHRF (u,dt: double): double; //emulates spm_hrf.m const //TR = 1; p1= 6; //delay of response p2=16;//delay of undershoot (relative to onset) p3=1; //dispersion of response p4=1; //dispersion of undershoot p5=6; //ratio of response to undershoot p7=kHRFkernelSec;//length of kernel (seconds) begin if u <= 0 then result := 0 else result := spm_Gpdf(u,p1/p3,dt/p3) - spm_Gpdf(u,p2/p4,dt/p4)/p5; end; function CreateHRF (lTRsec: double; var lKernelBins: integer; lDefaultsStatsFmriT: integer; var lHRFra, lTDra: doublep): boolean; //NOTE: if this returns TRUE, you MUST freemem lHRFra, lTDra //returns lHRFra and lTDra with lBins of data - equal to 32sec convolution kernel for //hemodynamic response (HRF) and the HRF's temporal derivative var lDT,lSum,l1sec: double; lI: integer; begin result := false; if lDefaultsStatsFmriT < 1 then exit; lDT := (lTRsec / lDefaultsStatsFmriT); //DeltaTime - width of each sample in sec lKernelBins := round ( kHRFkernelSec / lDT); if lKernelBins < 1 then exit; getmem(lHRFra,lKernelBins*sizeof(double)); //generate whole HRF kernel for lI := 1 to lKernelBins do lHRFra^[lI] := fHRF (lI-1,lDT); //find sum lSum := 0; for lI := 1 to lKernelBins do lSum := lSum + lHRFra^[lI]; //normalize - so sum = 1 for lI := 1 to lKernelBins do lHRFra^[lI] := lHRFra^[lI]/lsum; //next temporal derivative getmem(ltdra,lKernelBins*sizeof(double)); l1sec := 1/lDT; for lI := 1 to lKernelBins do ltdra^[lI] := fHRF((lI-1)-l1sec,lDT); //tdHRF (lI-1,lDT); //find sum lSum := 0; for lI := 1 to lKernelBins do lSum := lSum + ltdra^[lI]; //normalize - so sum = 1 for lI := 1 to lKernelBins do ltdra^[lI] := ltdra^[lI]/lsum; //temporal derivative is difference between normalized TD and normalized HRF for lI := 1 to lKernelBins do ltdra^[lI] := lHRFra^[lI]- ltdra^[lI]; result := true; end; function Convolve(var lTimeCoursePrecise,lKernel: doublep; lEventBin,lnVolPrecise,lKernelBins: integer): boolean; var lVol,lStart,lEnd: integer; begin result := false; if (lEventBin > lnVolPrecise) then exit; //event too late to influence timecourse if ((lEventBin+lKernelBins)< 1) then exit;//event too early to influence timecourse lStart := lEventBin; if lStart < 1 then lStart := 1; lEnd := (lEventBin+lKernelBins-1); if lEnd > lnVolPrecise then lEnd := lnVolPrecise; //lOffset := lEventBin; for lVol := lStart to lEnd do begin lTimeCoursePrecise^[lVol] := lTimeCoursePrecise^[lVol] + lKernel^[lVol -lEventBin+1]; end; result := true; end; function ConvolveTimeCourse(var lTimeCourse: PMatrix; var lKernel: doublep; var l4DTrace: T4DTrace; lCond,lCondOut, lnVol,lKernelBins,lDefaultsStatsFmriT,lDefaultsStatsFmriT0: integer; lTRSec: single; lSliceTime: boolean): boolean; var lnVolPrecise,lEvent,lVol,lVolx,lEventBin,lEventEnd: integer; lDT: double; lTimeCoursePrecise: doublep;//supersampled by kDefaultsStatsFmriT lAllEvents: boolean; begin result := false; if (l4DTrace.Conditions[lCond].Events < 1) or (lnVol < 1) or (lTRSec <= 0) then exit; lnVolPrecise := lnVol * lDefaultsStatsFmriT; getmem(lTimeCoursePrecise,lnVolPrecise * sizeof(double)); for lVol := 1 to lnVolPrecise do lTimeCoursePrecise^[lVol] := 0; lDT := (lTRsec / lDefaultsStatsFmriT); //DeltaTime - width of each sample in sec //spm_fmri_design //X is supersampled at 16 times (fMRI_T) the number of volumes - with (32 bin offset) //k = SPM.nscan(s); //X = X([0:(k - 1)]*fMRI_T + fMRI_T0 + 32,:); for lEvent := 1 to l4DTrace.Conditions[lCond].Events do begin lEventBin := round((l4DTrace.Conditions[lCond].EventRA^[lEvent])/lDT); //incorrect: same dur will have different number of bins due to rounding: //lEventEnd := round((l4DTrace.Conditions[lCond].EventRA^[lEvent]+l4DTrace.Conditions[lCond].DurRA^[lEvent])/lDT); //correct: all stimuli of same duration will have identical number of bins lEventEnd := lEventBin+round(l4DTrace.Conditions[lCond].DurRA^[lEvent]/lDT); //if lEvent = 1 then fx(lEventBin,lEventEnd,l4DTrace.Conditions[lCond].DurRA^[lEvent]); repeat if (lEventBin > 0) and (lEventBin <= lnVolPrecise) then Convolve(lTimeCoursePrecise,lKernel,lEventBin,lnVolPrecise,lKernelBins); inc(lEventBin); until lEventBin > lEventEnd; end; //for each event //output - scaled by reciprocal of DT: e.g. if TR=2, DT=0.125, Scale = 8 //if TR=2.2, DT=0.1375 Scale = 7.2727 //this linear scaling does not change any effects - it simply clones SPM2 lAllEvents := true; for lEvent := 1 to l4DTrace.Conditions[lCond].Events do if l4DTrace.Conditions[lCond].DurRA^[lEvent] > lDT then lAllEvents := false; if lAllEvents then lDT := 1/lDT else lDT := 1; lVolx := lDefaultsStatsFmriT0; for lVol := 1 to lnVol do begin if (lVolx > 0) and (lVolx < lnVolPrecise) then lTimeCourse^[lCondOut]^[lVol] := lDT * lTimeCoursePrecise^[lVolx]; inc(lVolx,lDefaultsStatsFmriT); end; freemem(lTimeCoursePrecise); result := true; end;//func ConvolveTimeCourse end. mricron-0.20120505.1~dfsg.1.orig/histoform.pas0000664000175000017500000000360611326434466020405 0ustar michaelmichaelunit histoform; interface uses {$IFNDEF Unix} Windows,{$ENDIF} {$IFDEF FPC} LResources,{$ENDIF} Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls,ClipBrd; type THistogramForm = class(TForm) HistoPanel: TScrollBox; HistoImage: TImage; MainMenu1: TMainMenu; File1: TMenuItem; Edit1: TMenuItem; Copy1: TMenuItem; Saveasbitmap1: TMenuItem; Closewindow1: TMenuItem; procedure Copy1Click(Sender: TObject); procedure Closewindow1Click(Sender: TObject); procedure Saveasbitmap1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var HistogramForm: THistogramForm; implementation {$IFNDEF FPC} {$R *.DFM} {$ENDIF} uses nifti_img; procedure THistogramForm.Copy1Click(Sender: TObject); {$IFDEF FPC} begin if (HistoImage.Picture.Graphic = nil) then begin //1420z Showmessage('You need to load an image before you can copy it to the clipboard.'); exit; end; HistoImage.Picture.Bitmap.SaveToClipboardFormat(2); end; {$ELSE} var MyFormat : Word; AData: THandle; APalette : HPalette; //For later versions of Delphi: APalette : THandle; begin if (HistoImage.Picture.Graphic = nil) then begin //1420z Showmessage('You need to load an image before you can copy it to the clipboard.'); exit; end; HistoImage.Picture.SaveToClipBoardFormat(MyFormat,AData,APalette); ClipBoard.SetAsHandle(MyFormat,AData) end; {$ENDIF} procedure THistogramForm.Closewindow1Click(Sender: TObject); begin HistogramForm.Close; end; procedure THistogramForm.Saveasbitmap1Click(Sender: TObject); begin {$IFNDEF FPC} SaveImgAsPNGBMP (HistoImage); {$ELSE} SaveImgAsPNGBMP (HistoImage); {$ENDIF} end; {$IFDEF FPC} initialization {$I histoform.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/histoform.lrs0000664000175000017500000000251211266105036020404 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('THistogramForm','FORMDATA',[ 'TPF0'#14'THistogramForm'#13'HistogramForm'#4'Left'#3#239#3#6'Height'#3'P'#1#3 +'Top'#3#16#1#5'Width'#3#209#1#7'Caption'#6#9'Histogram'#12'ClientHeight'#3'=' +#1#11'ClientWidth'#3#209#1#11'Font.Height'#2#245#9'Font.Name'#6#13'MS Sans S' +'erif'#4'Menu'#7#9'MainMenu1'#8'Position'#7#14'poScreenCenter'#10'LCLVersion' +#6#6'0.9.29'#0#10'TScrollBox'#10'HistoPanel'#4'Left'#2#0#6'Height'#3'='#1#3 +'Top'#2#0#5'Width'#3#209#1#5'Align'#7#8'alClient'#12'ClientHeight'#3'9'#1#11 +'ClientWidth'#3#205#1#8'TabOrder'#2#0#0#6'TImage'#10'HistoImage'#6'Cursor'#7 +#7'crCross'#4'Left'#2#0#6'Height'#3'9'#1#3'Top'#2#0#5'Width'#3#205#1#5'Align' +#7#8'alClient'#8'AutoSize'#9#6'Center'#9#0#0#0#9'TMainMenu'#9'MainMenu1'#4'l' +'eft'#2'q'#3'top'#2'3'#0#9'TMenuItem'#5'File1'#7'Caption'#6#4'File'#0#9'TMen' +'uItem'#13'Saveasbitmap1'#7'Caption'#6#17'Save as bitmap...'#8'ShortCut'#3'S' +'@'#7'OnClick'#7#18'Saveasbitmap1Click'#0#0#9'TMenuItem'#12'Closewindow1'#7 +'Caption'#6#12'Close window'#8'ShortCut'#3'W@'#7'OnClick'#7#17'Closewindow1C' +'lick'#0#0#0#9'TMenuItem'#5'Edit1'#7'Caption'#6#4'Edit'#0#9'TMenuItem'#5'Cop' +'y1'#7'Caption'#6#4'Copy'#8'ShortCut'#3'C@'#7'OnClick'#7#10'Copy1Click'#0#0#0 +#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/histoform.lfm0000664000175000017500000000242611266105036020366 0ustar michaelmichaelobject HistogramForm: THistogramForm Left = 1007 Height = 336 Top = 272 Width = 465 Caption = 'Histogram' ClientHeight = 317 ClientWidth = 465 Font.Height = -11 Font.Name = 'MS Sans Serif' Menu = MainMenu1 Position = poScreenCenter LCLVersion = '0.9.29' object HistoPanel: TScrollBox Left = 0 Height = 317 Top = 0 Width = 465 Align = alClient ClientHeight = 313 ClientWidth = 461 TabOrder = 0 object HistoImage: TImage Cursor = crCross Left = 0 Height = 313 Top = 0 Width = 461 Align = alClient AutoSize = True Center = True end end object MainMenu1: TMainMenu left = 113 top = 51 object File1: TMenuItem Caption = 'File' object Saveasbitmap1: TMenuItem Caption = 'Save as bitmap...' ShortCut = 16467 OnClick = Saveasbitmap1Click end object Closewindow1: TMenuItem Caption = 'Close window' ShortCut = 16471 OnClick = Closewindow1Click end end object Edit1: TMenuItem Caption = 'Edit' object Copy1: TMenuItem Caption = 'Copy' ShortCut = 16451 OnClick = Copy1Click end end end end mricron-0.20120505.1~dfsg.1.orig/gzio20.pas0000664000175000017500000011427011326434466017505 0ustar michaelmichaelUnit gzio2; { Pascal unit based on gzio.c -- IO on .gz files Copyright (C) 1995-1998 Jean-loup Gailly. Define NO_DEFLATE to compile this file without the compression code Pascal tranlastion based on code contributed by Francisco Javier Crespo Copyright (C) 1998 by Jacques Nomssi Nzali For conditions of distribution and use, see copyright notice in readme.txt } interface {$I zconf.inc} uses {$ifdef MSDOS} dos, strings, {$else} SysUtils, {$endif} zutil, zbase, gzcrc, zdeflate, zinflate, define_types,dialogs; type gzFile = voidp; type z_off_t = long; procedure GZipBuffer(var FGzipFilename,FFileDestination: String;lxInBuffer: byteP;lInSize: Integer; lOverwritewarn: boolean); procedure UnGZip (var lInFname: string; var lBuf: ByteP; lOffset,lMaxSz: integer); //unzip procedure UnGZipCore (var infile : gzFile; var lBuf: ByteP; lReadBytes: integer; lWrite: boolean); function gzopen (path:ansistring; mode:string) : gzFile; function gzsetparams (f:gzfile; level:int; strategy:int) : int; function gzread (f:gzFile; buf:voidp; len:uInt) : int; function gzgetc (f:gzfile) : int; function gzgets (f:gzfile; buf:PChar; len:int) : PChar; {$ifndef NO_DEFLATE} function gzwrite (f:gzFile; buf:voidp; len:uInt) : int; function gzputc (f:gzfile; c:char) : int; function gzputs (f:gzfile; s:PChar) : int; function gzflush (f:gzFile; flush:int) : int; {$ifdef GZ_FORMAT_STRING} function gzprintf (zfile : gzFile; const format : string; a : array of int); { doesn't compile } {$endif} {$endif} function gzseek (f:gzfile; offset:z_off_t; whence:int) : z_off_t; function gzrewind (f:gzFile) : int; function gztell (f:gzfile) : z_off_t; function gzeof (f:gzfile) : boolean; function gzclose (f:gzFile) : int; function gzerror (f:gzFile; var errnum:Int) : string; const SEEK_SET {: z_off_t} = 0; { seek from beginning of file } SEEK_CUR {: z_off_t} = 1; { seek from current position } SEEK_END {: z_off_t} = 2; implementation const Z_EOF = -1; { same value as in STDIO.H } Z_BUFSIZE = 16384; { Z_PRINTF_BUFSIZE = 4096; } gz_magic : array[0..1] of byte = ($1F, $8B); { gzip magic header } { gzip flag byte } ASCII_FLAG = $01; { bit 0 set: file probably ascii text } HEAD_CRC = $02; { bit 1 set: header CRC present } EXTRA_FIELD = $04; { bit 2 set: extra field present } ORIG_NAME = $08; { bit 3 set: original file name present } COMMENT = $10; { bit 4 set: file comment present } RESERVED = $E0; { bits 5..7: reserved } type gz_stream = record stream : z_stream; z_err : int; { error code for last stream operation } z_eof : boolean; { set if end of input file } gzfile : file; { .gz file } inbuf : pBytef; { input buffer } outbuf : pBytef; { output buffer } crc : uLong; { crc32 of uncompressed data } msg, { error message - limit 79 chars } path : string[79];//: ansistring; { path name for debugging only - limit 79 chars } transparent : boolean; { true if input file is not a .gz file } mode : char; { 'w' or 'r' } startpos : long; { start of compressed data in file (header skipped) } end; type gz_streamp = ^gz_stream; function destroy (var s:gz_streamp) : int; forward; procedure check_header(s:gz_streamp); forward; { GZOPEN ==================================================================== Opens a gzip (.gz) file for reading or writing. As Pascal does not use file descriptors, the code has been changed to accept only path names. The mode parameter defaults to BINARY read or write operations ('r' or 'w') but can also include a compression level ('w9') or a strategy: Z_FILTERED as in 'w6f' or Z_HUFFMAN_ONLY as in 'w1h'. (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to open a file which is not in gzip format; in this case, gzread will directly read from the file without decompression. gzopen returns NIL if the file could not be opened (non-zero IOResult) or if there was insufficient memory to allocate the (de)compression state (zlib error is Z_MEM_ERROR). ============================================================================} function gzopen (path:ansistring; mode:string) : gzFile; var i : uInt; err : int; level : int; { compression level } strategy : int; { compression strategy } s : gz_streamp; {$IFDEF MSDOS} attr : word; { file attributes } {$ENDIF} {$IFNDEF NO_DEFLATE} gzheader : array [0..9] of byte; {$ENDIF} begin if (path='') or (mode='') then begin gzopen := Z_NULL; exit; end; GetMem (s,sizeof(gz_stream)); if not Assigned (s) then begin gzopen := Z_NULL; exit; end; level := Z_DEFAULT_COMPRESSION; strategy := Z_DEFAULT_STRATEGY; s^.stream.zalloc := NIL; { (alloc_func)0 } s^.stream.zfree := NIL; { (free_func)0 } s^.stream.opaque := NIL; { (voidpf)0 } s^.stream.next_in := Z_NULL; s^.stream.next_out := Z_NULL; s^.stream.avail_in := 0; s^.stream.avail_out := 0; s^.z_err := Z_OK; s^.z_eof := false; s^.inbuf := Z_NULL; s^.outbuf := Z_NULL; s^.crc := crc32(0, Z_NULL, 0); s^.msg := ''; s^.transparent := false; s^.path := path; { limit to 255 chars } s^.mode := chr(0); for i:=1 to Length(mode) do begin case mode[i] of 'r' : s^.mode := 'r'; 'w' : s^.mode := 'w'; '0'..'9' : level := Ord(mode[i])-Ord('0'); 'f' : strategy := Z_FILTERED; 'h' : strategy := Z_HUFFMAN_ONLY; end; end; if (s^.mode=chr(0)) then begin destroy(s); gzopen := gzFile(Z_NULL); exit; end; if (s^.mode='w') then begin {$IFDEF NO_DEFLATE} err := Z_STREAM_ERROR; {$ELSE} err := deflateInit2 (s^.stream, level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); { windowBits is passed < 0 to suppress zlib header } GetMem (s^.outbuf, Z_BUFSIZE); s^.stream.next_out := s^.outbuf; {$ENDIF} if (err <> Z_OK) or (s^.outbuf = Z_NULL) then begin destroy(s); gzopen := gzFile(Z_NULL); exit; end; end else begin GetMem (s^.inbuf, Z_BUFSIZE); s^.stream.next_in := s^.inbuf; err := inflateInit2_ (s^.stream, -MAX_WBITS, ZLIB_VERSION, sizeof(z_stream)); { windowBits is passed < 0 to tell that there is no zlib header } if (err <> Z_OK) or (s^.inbuf = Z_NULL) then begin destroy(s); gzopen := gzFile(Z_NULL); exit; end; end; s^.stream.avail_out := Z_BUFSIZE; {$IFOPT I+} {$I-} {$define IOcheck} {$ENDIF} Assign (s^.gzfile, s^.path); {$ifdef MSDOS} GetFAttr(s^.gzfile, Attr); if (DosError <> 0) and (s^.mode='w') then ReWrite (s^.gzfile,1) else Reset (s^.gzfile,1); {$else} if (not FileExists(s^.path)) and (s^.mode='w') then ReWrite (s^.gzfile,1) else Reset (s^.gzfile,1); {$endif} {$IFDEF IOCheck} {$I+} {$ENDIF} if (IOResult <> 0) then begin destroy(s); gzopen := gzFile(Z_NULL); exit; end; if (s^.mode = 'w') then begin { Write a very simple .gz header } {$IFNDEF NO_DEFLATE} gzheader [0] := gz_magic [0]; gzheader [1] := gz_magic [1]; gzheader [2] := Z_DEFLATED; { method } gzheader [3] := 0; { flags } gzheader [4] := 0; { time[0] } gzheader [5] := 0; { time[1] } gzheader [6] := 0; { time[2] } gzheader [7] := 0; { time[3] } gzheader [8] := 0; { xflags } gzheader [9] := 0; { OS code = MS-DOS } blockwrite (s^.gzfile, gzheader, 10); s^.startpos := LONG(10); {$ENDIF} end else begin check_header(s); { skip the .gz header } s^.startpos := FilePos(s^.gzfile) - s^.stream.avail_in; end; gzopen := gzFile(s); end; { GZSETPARAMS =============================================================== Update the compression level and strategy. ============================================================================} function gzsetparams (f:gzfile; level:int; strategy:int) : int; var s : gz_streamp; written: integer; begin s := gz_streamp(f); if (s = NIL) or (s^.mode <> 'w') then begin gzsetparams := Z_STREAM_ERROR; exit; end; { Make room to allow flushing } if (s^.stream.avail_out = 0) then begin s^.stream.next_out := s^.outbuf; blockwrite(s^.gzfile, s^.outbuf^, Z_BUFSIZE, written); if (written <> Z_BUFSIZE) then s^.z_err := Z_ERRNO; s^.stream.avail_out := Z_BUFSIZE; end; gzsetparams := deflateParams (s^.stream, level, strategy); end; { GET_BYTE ================================================================== Read a byte from a gz_stream. Updates next_in and avail_in. Returns EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. ============================================================================} function get_byte (s:gz_streamp) : int; begin if (s^.z_eof = true) then begin get_byte := Z_EOF; exit; end; if (s^.stream.avail_in = 0) then begin {$I-} blockread (s^.gzfile, s^.inbuf^, Z_BUFSIZE, Int(s^.stream.avail_in)); {$I+} if (s^.stream.avail_in = 0) then begin s^.z_eof := true; if (IOResult <> 0) then s^.z_err := Z_ERRNO; get_byte := Z_EOF; exit; end; s^.stream.next_in := s^.inbuf; end; Dec(s^.stream.avail_in); get_byte := s^.stream.next_in^; Inc(s^.stream.next_in); end; { GETLONG =================================================================== Reads a Longint in LSB order from the given gz_stream. ============================================================================} { function getLong (s:gz_streamp) : uLong; var x : array [0..3] of byte; i : byte; c : int; n1 : longint; n2 : longint; begin for i:=0 to 3 do begin c := get_byte(s); if (c = Z_EOF) then s^.z_err := Z_DATA_ERROR; x[i] := (c and $FF) end; n1 := (ush(x[3] shl 8)) or x[2]; n2 := (ush(x[1] shl 8)) or x[0]; getlong := (n1 shl 16) or n2; end; } function getLong(s : gz_streamp) : uLong; var x : packed array [0..3] of byte; c : int; begin { x := uLong(get_byte(s)); - you can't do this with TP, no unsigned long } { the following assumes a little endian machine and TP } x[0] := Byte(get_byte(s)); x[1] := Byte(get_byte(s)); x[2] := Byte(get_byte(s)); c := get_byte(s); x[3] := Byte(c); if (c = Z_EOF) then s^.z_err := Z_DATA_ERROR; GetLong := uLong(longint(x)); end; { CHECK_HEADER ============================================================== Check the gzip header of a gz_stream opened for reading. Set the stream mode to transparent if the gzip magic header is not present. Set s^.err to Z_DATA_ERROR if the magic header is present but the rest of the header is incorrect. IN assertion: the stream s has already been created sucessfully; s^.stream.avail_in is zero for the first time, but may be non-zero for concatenated .gz files ============================================================================} procedure check_header (s:gz_streamp); var method : int; { method byte } flags : int; { flags byte } len : uInt; c : int; begin { Check the gzip magic header } for len := 0 to 1 do begin c := get_byte(s); if (c <> gz_magic[len]) then begin if (len <> 0) then begin Inc(s^.stream.avail_in); Dec(s^.stream.next_in); end; if (c <> Z_EOF) then begin Inc(s^.stream.avail_in); Dec(s^.stream.next_in); s^.transparent := TRUE; end; if (s^.stream.avail_in <> 0) then s^.z_err := Z_OK else s^.z_err := Z_STREAM_END; exit; end; end; method := get_byte(s); flags := get_byte(s); if (method <> Z_DEFLATED) or ((flags and RESERVED) <> 0) then begin s^.z_err := Z_DATA_ERROR; exit; end; for len := 0 to 5 do get_byte(s); { Discard time, xflags and OS code } if ((flags and EXTRA_FIELD) <> 0) then begin { skip the extra field } len := uInt(get_byte(s)); len := len + (uInt(get_byte(s)) shr 8); { len is garbage if EOF but the loop below will quit anyway } while (len <> 0) and (get_byte(s) <> Z_EOF) do Dec(len); end; if ((flags and ORIG_NAME) <> 0) then begin { skip the original file name } repeat c := get_byte(s); until (c = 0) or (c = Z_EOF); end; if ((flags and COMMENT) <> 0) then begin { skip the .gz file comment } repeat c := get_byte(s); until (c = 0) or (c = Z_EOF); end; if ((flags and HEAD_CRC) <> 0) then begin { skip the header crc } get_byte(s); get_byte(s); end; if (s^.z_eof = true) then s^.z_err := Z_DATA_ERROR else s^.z_err := Z_OK; end; { DESTROY =================================================================== Cleanup then free the given gz_stream. Return a zlib error code. Try freeing in the reverse order of allocations. ============================================================================} function destroy (var s:gz_streamp) : int; begin destroy := Z_OK; if not Assigned (s) then begin destroy := Z_STREAM_ERROR; exit; end; if (s^.stream.state <> NIL) then begin if (s^.mode = 'w') then begin {$IFDEF NO_DEFLATE} destroy := Z_STREAM_ERROR; {$ELSE} destroy := deflateEnd(s^.stream); {$ENDIF} end else if (s^.mode = 'r') then begin destroy := inflateEnd(s^.stream); end; end; if (s^.path <> '') then begin {$I-} close(s^.gzfile); {$I+} if (IOResult <> 0) then destroy := Z_ERRNO; end; if (s^.z_err < 0) then destroy := s^.z_err; if Assigned (s^.inbuf) then FreeMem(s^.inbuf, Z_BUFSIZE); if Assigned (s^.outbuf) then FreeMem(s^.outbuf, Z_BUFSIZE); FreeMem(s, sizeof(gz_stream)); end; { GZREAD ==================================================================== Reads the given number of uncompressed bytes from the compressed file. If the input file was not in gzip format, gzread copies the given number of bytes into the buffer. gzread returns the number of uncompressed bytes actually read (0 for end of file, -1 for error). ============================================================================} function gzread (f:gzFile; buf:voidp; len:uInt) : int; var s : gz_streamp; start : pBytef; next_out : pBytef; n : uInt; crclen : uInt; { Buffer length to update CRC32 } filecrc : uLong; { CRC32 stored in GZIP'ed file } filelen : uLong; { Total lenght of uncompressed file } bytes : integer; { bytes actually read in I/O blockread } total_in : uLong; total_out : uLong; begin s := gz_streamp(f); start := pBytef(buf); { starting point for crc computation } if (s = NIL) or (s^.mode <> 'r') then begin gzread := Z_STREAM_ERROR; exit; end; if (s^.z_err = Z_DATA_ERROR) or (s^.z_err = Z_ERRNO) then begin gzread := -1; exit; end; if (s^.z_err = Z_STREAM_END) then begin gzread := 0; { EOF } exit; end; s^.stream.next_out := pBytef(buf); s^.stream.avail_out := len; while (s^.stream.avail_out <> 0) do begin if (s^.transparent = true) then begin { Copy first the lookahead bytes: } n := s^.stream.avail_in; if (n > s^.stream.avail_out) then n := s^.stream.avail_out; if (n > 0) then begin zmemcpy(s^.stream.next_out, s^.stream.next_in, n); inc (s^.stream.next_out, n); inc (s^.stream.next_in, n); dec (s^.stream.avail_out, n); dec (s^.stream.avail_in, n); end; if (s^.stream.avail_out > 0) then begin blockread (s^.gzfile, s^.stream.next_out^, s^.stream.avail_out, bytes); dec (s^.stream.avail_out, uInt(bytes)); end; dec (len, s^.stream.avail_out); inc (s^.stream.total_in, uLong(len)); inc (s^.stream.total_out, uLong(len)); gzread := int(len); exit; end; { IF transparent } if (s^.stream.avail_in = 0) and (s^.z_eof = false) then begin {$I-} blockread (s^.gzfile, s^.inbuf^, Z_BUFSIZE, Int(s^.stream.avail_in)); {$I+} if (s^.stream.avail_in = 0) then begin s^.z_eof := true; if (IOResult <> 0) then begin s^.z_err := Z_ERRNO; break; end; end; s^.stream.next_in := s^.inbuf; end; s^.z_err := inflate(s^.stream, Z_NO_FLUSH); if (s^.z_err = Z_STREAM_END) then begin crclen := 0; next_out := s^.stream.next_out; while (next_out <> start ) do begin dec (next_out); inc (crclen); { Hack because Pascal cannot substract pointers } end; { Check CRC and original size } s^.crc := crc32(s^.crc, start, crclen); start := s^.stream.next_out; filecrc := getLong (s); filelen := getLong (s); if (s^.crc <> filecrc) or (s^.stream.total_out <> filelen) then s^.z_err := Z_DATA_ERROR else begin { Check for concatenated .gz files: } check_header(s); if (s^.z_err = Z_OK) then begin total_in := s^.stream.total_in; total_out := s^.stream.total_out; inflateReset (s^.stream); s^.stream.total_in := total_in; s^.stream.total_out := total_out; s^.crc := crc32 (0, Z_NULL, 0); end; end; {IF-THEN-ELSE} end; if (s^.z_err <> Z_OK) or (s^.z_eof = true) then break; end; {WHILE} crclen := 0; next_out := s^.stream.next_out; while (next_out <> start ) do begin dec (next_out); inc (crclen); { Hack because Pascal cannot substract pointers } end; s^.crc := crc32 (s^.crc, start, crclen); gzread := int(len - s^.stream.avail_out); end; { GZGETC ==================================================================== Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. ============================================================================} function gzgetc (f:gzfile) : int; var c:byte; begin if (gzread (f,@c,1) = 1) then gzgetc := c else gzgetc := -1; end; { GZGETS ==================================================================== Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then Null-terminated. gzgets returns buf, or Z_NULL in case of error. The current implementation is not optimized at all. ============================================================================} function gzgets (f:gzfile; buf:PChar; len:int) : PChar; var b : PChar; { start of buffer } bytes : Int; { number of bytes read by gzread } gzchar : char; { char read by gzread } begin if (buf = Z_NULL) or (len <= 0) then begin gzgets := Z_NULL; exit; end; b := buf; repeat dec (len); bytes := gzread (f, buf, 1); gzchar := buf^; inc (buf); until (len = 0) or (bytes <> 1) or (gzchar = Chr(13)); buf^ := Chr(0); if (b = buf) and (len > 0) then gzgets := Z_NULL else gzgets := b; end; {$IFNDEF NO_DEFLATE} { GZWRITE =================================================================== Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes actually written (0 in case of error). ============================================================================} function gzwrite (f:gzfile; buf:voidp; len:uInt) : int; var s : gz_streamp; written : integer; begin s := gz_streamp(f); if (s = NIL) or (s^.mode <> 'w') then begin gzwrite := Z_STREAM_ERROR; exit; end; s^.stream.next_in := pBytef(buf); s^.stream.avail_in := len; while (s^.stream.avail_in <> 0) do begin if (s^.stream.avail_out = 0) then begin s^.stream.next_out := s^.outbuf; blockwrite (s^.gzfile, s^.outbuf^, Z_BUFSIZE, written); if (written <> Z_BUFSIZE) then begin s^.z_err := Z_ERRNO; break; end; s^.stream.avail_out := Z_BUFSIZE; end; s^.z_err := deflate(s^.stream, Z_NO_FLUSH); if (s^.z_err <> Z_OK) then break; end; {WHILE} s^.crc := crc32(s^.crc, buf, len); gzwrite := int(len - s^.stream.avail_in); end; { =========================================================================== Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). } {$IFDEF GZ_FORMAT_STRING} function gzprintf (zfile : gzFile; const format : string; a : array of int) : int; var buf : array[0..Z_PRINTF_BUFSIZE-1] of char; len : int; begin {$ifdef HAS_snprintf} snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); {$else} sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); {$endif} len := strlen(buf); { old sprintf doesn't return the nb of bytes written } if (len <= 0) return 0; gzprintf := gzwrite(file, buf, len); end; {$ENDIF} { GZPUTC ==================================================================== Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. ============================================================================} function gzputc (f:gzfile; c:char) : int; begin if (gzwrite (f,@c,1) = 1) then {$IFDEF FPC} gzputc := int(ord(c)) {$ELSE} gzputc := int(c) {$ENDIF} else gzputc := -1; end; { GZPUTS ==================================================================== Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. ============================================================================} function gzputs (f:gzfile; s:PChar) : int; begin gzputs := gzwrite (f, voidp(s), strlen(s)); end; { DO_FLUSH ================================================================== Flushes all pending output into the compressed file. The parameter flush is as in the zdeflate() function. ============================================================================} function do_flush (f:gzfile; flush:int) : int; var len : uInt; done : boolean; s : gz_streamp; written : integer; begin done := false; s := gz_streamp(f); if (s = NIL) or (s^.mode <> 'w') then begin do_flush := Z_STREAM_ERROR; exit; end; s^.stream.avail_in := 0; { should be zero already anyway } while true do begin len := Z_BUFSIZE - s^.stream.avail_out; if (len <> 0) then begin {$I-} blockwrite(s^.gzfile, s^.outbuf^, len, written); {$I+} if (written <> len) then begin s^.z_err := Z_ERRNO; do_flush := Z_ERRNO; exit; end; s^.stream.next_out := s^.outbuf; s^.stream.avail_out := Z_BUFSIZE; end; if (done = true) then break; s^.z_err := deflate(s^.stream, flush); { Ignore the second of two consecutive flushes: } if (len = 0) and (s^.z_err = Z_BUF_ERROR) then s^.z_err := Z_OK; { deflate has finished flushing only when it hasn't used up all the available space in the output buffer: } done := (s^.stream.avail_out <> 0) or (s^.z_err = Z_STREAM_END); if (s^.z_err <> Z_OK) and (s^.z_err <> Z_STREAM_END) then break; end; {WHILE} if (s^.z_err = Z_STREAM_END) then do_flush:=Z_OK else do_flush:=s^.z_err; end; { GZFLUSH =================================================================== Flushes all pending output into the compressed file. The parameter flush is as in the zdeflate() function. The return value is the zlib error number (see function gzerror below). gzflush returns Z_OK if the flush parameter is Z_FINISH and all output could be flushed. gzflush should be called only when strictly necessary because it can degrade compression. ============================================================================} function gzflush (f:gzfile; flush:int) : int; var err : int; s : gz_streamp; begin s := gz_streamp(f); err := do_flush (f, flush); if (err <> 0) then begin gzflush := err; exit; end; if (s^.z_err = Z_STREAM_END) then gzflush := Z_OK else gzflush := s^.z_err; end; {$ENDIF} (* NO DEFLATE *) { GZREWIND ================================================================== Rewinds input file. ============================================================================} function gzrewind (f:gzFile) : int; var s:gz_streamp; begin s := gz_streamp(f); if (s = NIL) or (s^.mode <> 'r') then begin gzrewind := -1; exit; end; s^.z_err := Z_OK; s^.z_eof := false; s^.stream.avail_in := 0; s^.stream.next_in := s^.inbuf; if (s^.startpos = 0) then begin { not a compressed file } {$I-} seek (s^.gzfile, 0); {$I+} gzrewind := 0; exit; end; inflateReset(s^.stream); {$I-} seek (s^.gzfile, s^.startpos); {$I+} gzrewind := int(IOResult); exit; end; { GZSEEK ==================================================================== Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes from the beginning of the uncompressed stream. gzseek returns the resulting offset, or -1 in case of error. SEEK_END is not implemented, returns error. In this version of the library, gzseek can be extremely slow. ============================================================================} function gzseek (f:gzfile; offset:z_off_t; whence:int) : z_off_t; var s : gz_streamp; size : uInt; begin s := gz_streamp(f); if (s = NIL) or (whence = SEEK_END) or (s^.z_err = Z_ERRNO) or (s^.z_err = Z_DATA_ERROR) then begin gzseek := z_off_t(-1); exit; end; if (s^.mode = 'w') then begin {$IFDEF NO_DEFLATE} gzseek := z_off_t(-1); exit; {$ELSE} if (whence = SEEK_SET) then dec(offset, s^.stream.total_out); if (offset < 0) then begin; gzseek := z_off_t(-1); exit; end; { At this point, offset is the number of zero bytes to write. } if (s^.inbuf = Z_NULL) then begin GetMem (s^.inbuf, Z_BUFSIZE); zmemzero(s^.inbuf, Z_BUFSIZE); end; while (offset > 0) do begin size := Z_BUFSIZE; if (offset < Z_BUFSIZE) then size := uInt(offset); size := gzwrite(f, s^.inbuf, size); if (size = 0) then begin gzseek := z_off_t(-1); exit; end; dec (offset,size); end; gzseek := z_off_t(s^.stream.total_in); exit; {$ENDIF} end; { Rest of function is for reading only } { compute absolute position } if (whence = SEEK_CUR) then inc (offset, s^.stream.total_out); if (offset < 0) then begin gzseek := z_off_t(-1); exit; end; if (s^.transparent = true) then begin s^.stream.avail_in := 0; s^.stream.next_in := s^.inbuf; {$I-} seek (s^.gzfile, offset); {$I+} if (IOResult <> 0) then begin gzseek := z_off_t(-1); exit; end; s^.stream.total_in := uLong(offset); s^.stream.total_out := uLong(offset); gzseek := z_off_t(offset); exit; end; { For a negative seek, rewind and use positive seek } if (uLong(offset) >= s^.stream.total_out) then dec (offset, s^.stream.total_out) else if (gzrewind(f) <> 0) then begin gzseek := z_off_t(-1); exit; end; { offset is now the number of bytes to skip. } if (offset <> 0) and (s^.outbuf = Z_NULL) then GetMem (s^.outbuf, Z_BUFSIZE); while (offset > 0) do begin size := Z_BUFSIZE; if (offset < Z_BUFSIZE) then size := int(offset); size := gzread (f, s^.outbuf, size); if (size <= 0) then begin gzseek := z_off_t(-1); exit; end; dec(offset, size); end; gzseek := z_off_t(s^.stream.total_out); end; { GZTELL ==================================================================== Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. ============================================================================} function gztell (f:gzfile) : z_off_t; begin gztell := gzseek (f, 0, SEEK_CUR); end; { GZEOF ===================================================================== Returns TRUE when EOF has previously been detected reading the given input stream, otherwise FALSE. ============================================================================} function gzeof (f:gzfile) : boolean; var s:gz_streamp; begin s := gz_streamp(f); if (s=NIL) or (s^.mode<>'r') then gzeof := false else gzeof := s^.z_eof; end; { PUTLONG =================================================================== Outputs a Longint in LSB order to the given file ============================================================================} procedure putLong (var f:file; x:uLong); var n : int; c : byte; begin for n:=0 to 3 do begin c := x and $FF; blockwrite (f, c, 1); x := x shr 8; end; end; { GZCLOSE =================================================================== Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. The return value is the zlib error number (see function gzerror below). ============================================================================} function gzclose (f:gzFile) : int; var err : int; s : gz_streamp; begin s := gz_streamp(f); if (s = NIL) then begin gzclose := Z_STREAM_ERROR; exit; end; if (s^.mode = 'w') then begin {$IFDEF NO_DEFLATE} gzclose := Z_STREAM_ERROR; exit; {$ELSE} err := do_flush (f, Z_FINISH); if (err <> Z_OK) then begin gzclose := destroy (gz_streamp(f)); exit; end; putLong (s^.gzfile, s^.crc); putLong (s^.gzfile, s^.stream.total_in); {$ENDIF} end; gzclose := destroy (gz_streamp(f)); end; { GZERROR =================================================================== Returns the error message for the last error which occured on the given compressed file. errnum is set to zlib error number. If an error occured in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. ============================================================================} function gzerror (f:gzfile; var errnum:int) : string; var m : string; s : gz_streamp; begin s := gz_streamp(f); if (s = NIL) then begin errnum := Z_STREAM_ERROR; gzerror := zError(Z_STREAM_ERROR); end; errnum := s^.z_err; if (errnum = Z_OK) then begin gzerror := zError(Z_OK); exit; end; m := s^.stream.msg; if (errnum = Z_ERRNO) then m := ''; if (m = '') then m := zError(s^.z_err); s^.msg := s^.path+': '+m; gzerror := s^.msg; end; procedure UnGZip (var lInFname: string; var lBuf: ByteP; lOffset,lMaxSz: integer); //unzip const BUFLEN = 16384; var infile : gzFile; lFname : ansistring; lbufsz,len,lI : integer; written : integer; buf : packed array [0..BUFLEN-1] of byte; { Global uses BSS instead of stack } begin lFName := lInFName; //filemode := 1; //if lFName = 'z' then //showmessage('unzip'); //ImgForm.Caption := 'gz'; //ReadIntForm.GetInt('Multi-volume file, please select volume to view.',1,1,3); //infile := gzopenZ (lFName, 'r', 0); infile := gzopen (lFName, 'r'); written := 0; if lOffset > 0 then begin Len := lOffset div BUFLEN; if Len > 0 then for lI := 1 to Len do gzread (infile, @buf, BUFLEN {1388}); Len := lOffset mod BUFLEN; gzread (infile, @buf, Len); end; lbufsz := BUFLEN; if lMaxSz < BUFLEN then lbufsz := lMaxSz; while true do begin len := gzread (infile, @buf, lbufsz); if (len < 0) then begin break end; if (len = 0) then break; if (Written+len) > lMaxSz then begin break; end; Move(buf,lbuf^[Written+1],len); Written := Written + len; end; {WHILE} gzclose (infile); //filemode := 2; end; procedure UnGZipCore (var infile : gzFile; var lBuf: ByteP; lReadBytes: integer; lWrite: boolean); const BUFLEN = 16384; var buf : packed array [0..BUFLEN-1] of byte; { Global uses BSS instead of stack } len,lI,written : integer; begin written := 0; if lReadBytes < 1 then exit; Len := lReadBytes div BUFLEN; if Len > 0 then for lI := 1 to Len do begin gzread (infile, @buf, BUFLEN {1388}); if lWrite then Move(buf,lbuf[Written+1],BUFLEN); Written := Written + BUFLEN; end; Len := lReadBytes mod BUFLEN; if Len = 0 then exit; gzread (infile, @buf, Len); if lWrite then Move(buf,lbuf[Written+1],len); end; //ungzipCore function gz_compress (var infile:file; outfile:gzFile): integer; var len : cardinal; ioerr : integer; buf : packed array [0..Z_BUFSIZE-1] of byte; { Global uses BSS instead of stack } errorcode : byte; fsize, lensize : DWord; begin errorcode := 0; //Progress := 0; fsize := FileSize(infile); lensize := 0; //if FProgressStep > 0 then DoOnProgress; while true do begin {$I-}blockread (infile, buf, Z_BUFSIZE, len);{$I+} ioerr := IOResult; if (ioerr <> 0) then begin errorcode := 1; break end; if (len = 0) then break; {$WARNINGS OFF}{Comparing signed and unsigned types} if (gzwrite (outfile, @buf, len) <> len) then begin {$WARNINGS OFF} errorcode := 2; break end; end; closeFile (infile); if (gzclose (outfile) <> 0{Z_OK}) then errorcode := 3; gz_compress := errorcode; end; // proc gz_compress procedure GZipFile(lSrcName,lDestName: String); var FGzipFilename : string; FGzipComments : string; outmode : string; s,FFileDestination : string; infile : file; outfile : gzFile; FCompressionLevel{,errorcode} : integer; flags : Integer; stream : gz_streamp; //p : PChar; ioerr : integer; begin //FGzipHeader := [zFilename]; FGzipFilename:= lSrcName; FGzipComments := ''; FCompressionLevel := 6; //MainForm.ProgressBar1.position :=1; //Gzip (lFile,lMulti); FFileDestination := lDestName; //result := 2; //return error if user aborts (* if fileexists(FFileDestination) then begin case MessageDlg('Overwrite the file '+FFileDestination+'?', mtConfirmation,[mbYes, mbAbort], 0) of { produce the message dialog box } mrAbort: exit; end; end;*) AssignFile (infile, lSrcName); {$I-} Reset (infile,1); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin // Showmessage('Can''t open: '+lSrcName); //errorcode := 1 end else begin outmode := 'w '; //s := IntToStr(FCompressionLevel); outmode[2] := '6';//s[1]; outmode[3] := ' '; (*case FCompressionType of Standard : outmode[3] := ' '; HuffmanOnly : outmode[3] := 'h'; Filtered : outmode[3] := 'f'; end;*) //flags := 0; //if (zfilename in FGzipHeader) then flags := ORIG_NAME; //if (comment in FGzipHeader) then flags := flags + COMMENT_; outfile := gzopen (lSrcName, outmode); if (outfile = NIL) then begin //Showmessage('Can''t open: '+lSrcName); close( infile); exit; end else begin { if flags are set then write them } stream := gz_streamp(outfile); if {(zfilename in FGzipHeader)} true then begin s := lSrcName;//999 ExtractFilename(lSrcName); //p := PChar(s); blockWrite( stream^.gzfile, {p[0]}s, length(s)+1); stream^.startpos := stream^.startpos + length(s) + 1 end; gz_compress(infile, outfile); end end; end; procedure file_compress2 (filename,outname:string); var infile : file; outfile : gzFile; ioerr : integer; mode : string; begin mode := 'w6 '; Assign (infile, filename); {$I-} Reset (infile,1); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin writeln ('open error: ',ioerr); halt(1); end; outfile := gzopen (outname, mode); if (outfile = NIL) then begin //999 showmessage(' can''t gzopen '+outname); halt(1); end; gz_compress(infile, outfile); erase (infile); end; procedure GZipBuffer(var FGzipFilename,FFileDestination: String;lxInBuffer: byteP;lInSize: Integer; lOverwritewarn: boolean); var lTempName: string; lFdata: file; begin (*if lOverwritewarn and fileexists(FFileDestination) then begin case MessageDlg('Overwrite the file '+FFileDestination+'?', mtConfirmation,[mbYes, mbAbort], 0) of { produce the message dialog box } mrAbort: exit; end; end; //if overwrite *) lTempName := changefileext(FFileDestination,'.tmp'); assignfile(lFdata,lTempName ); filemode := 2; rewrite(lFdata,1); BlockWrite(lFdata,lxInBuffer^,lInSize); closefile(lFdata); file_compress2 (lTempName,FFileDestination ); //GZipFile(lTempName,FFileDestination); //deletefile(lTempname); end;//GZipBuffer end. mricron-0.20120505.1~dfsg.1.orig/graphx.pas0000664000175000017500000011475711425653036017672 0ustar michaelmichaelunit graphx; {$IFDEF FPC} {$mode objfpc}{$H+} {$ENDIF} interface {$DEFINE noFFTs} uses {$IFDEF FFTs} FFTs, {$ENDIF} {$IFDEF FPC} LResources, Spin, {$ELSE} ShlObj,Windows,RXSpin, {$ENDIF} Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, ToolWin, ComCtrls,define_types, ExtCtrls,Text, StdCtrls, perisettings, Menus,ClipBrd,metagraph,periplot,userdir; Type { TGraph4DForm } TGraph4DForm = class(TForm) Image1: TImage; MainMenu1: TMainMenu; MenuItem1: TMenuItem; Edit1: TMenuItem; CopyMenu: TMenuItem; CloseMenu: TMenuItem; FSLBatchMenu: TMenuItem; FFTMenu: TMenuItem; Extract4Drois: TMenuItem; BatchMenu: TMenuItem; SaveMenu: TMenuItem; OpenMenu: TMenuItem; MinEdit: TFloatSpinEdit; MaxEdit: TFloatSpinEdit; HSpeedDrop: TComboBox; PlotBtn: TSpeedButton; TextBtn: TSpeedButton; SelectDirectoryDialog1: TSelectDirectoryDialog; StatusBar1: TStatusBar; TrackBar1: TTrackBar; TREdit: TFloatSpinEdit; FourDBar: TPanel; TRLabel: TLabel; OpenDataBtn: TSpeedButton; RefreshBtn: TSpeedButton; //procedure Plot4DFFT(lStartSample: integer); //function XL: boolean; procedure FormShow(Sender: TObject); function ReadGraf(lFilename: string; lBatch,lTRcritical: boolean): boolean; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure Plot4DTrace(lStartSample: integer); procedure TextBtnClick(Sender: TObject); procedure TrackBar1Change(Sender: TObject); procedure OpenDataClick(Sender: TObject); procedure FormResize(Sender: TObject); procedure PSPlotClick(Sender: TObject); procedure PSTextClick(Sender: TObject); //procedure rfx; procedure Copy1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Closewindow1Click(Sender: TObject); procedure SaveasEMF1Click(Sender: TObject); procedure FFTitemClick(Sender: TObject); procedure RefreshBtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Extract4DroisClick(Sender: TObject); procedure Batchdata1Click(Sender: TObject); procedure RefreshBtnClick(Sender: TObject); procedure FSLbatch1Click(Sender: TObject); procedure FSLtest1Click(Sender: TObject); private public { Public declarations } end; var Graph4DForm: TGraph4DForm; implementation uses nifti_img_view, nifti_img,nifti_hdr, nifti_hdr_view,periutils, reslice_fsl; const //kMaxCond = 6; kMaxLines = kMaxCond* knMaxOverlay; //kClrRA: array [1..kMaxCond] of TColor = (clRed,clBlue,clGreen,clTeal,clAqua,clSilver); //kPenStyleRA: array[1..kVOIOverlayNum] of TPenStyle = (psDot,psDot,psDash,psDashDot,psDashDotDot);//abba //kPenStyleRA: array[1..kVOIOverlayNum] of TPenStyle = (psSolid,psDot,psDash,psDashDot,psDashDotDot); {$IFNDEF FPC} {$R *.DFM} {$ENDIF} var g4DHdr: TMRIcroHdr; g4Ddata: T4DTrace; (*procedure PrepPlot(var lImage: TMetafileCanvas; lL,lT,lR,lB,lWid,lHt,lFontSize: integer); begin lImage.Font.Name := 'Arial'; lImage.Font.Size := 12; lImage.pen.color := clBlack; lImage.Font.color := clBlack; lImage.Brush.Style := bsSolid; lImage.Brush.color := clWhite; lImage.Rectangle(1,1,lWid,lHt); lImage.Rectangle(lL,lT,lR,lB); end; *) {$IFDEF FFTs} procedure ROI2FFT (var l4DHdr: TMRIcroHdr; lROInum: integer; var lFFTLines: SingleP); var lVolSz,lnVol,lVol,lVox,lCount,lVolOffset,lnFFTOut,lP: integer; l16Buf : SmallIntP; lFFT,lFFTOut,l32Buf : SingleP; lFFTsum: doubleP; begin lnVol := l4DHdr.NIFTIhdr.dim[4]; if lnVol < 5 then exit; lVolSz :=l4DHdr.NIFTIhdr.dim[1]*l4DHdr.NIFTIhdr.dim[2]*l4DHdr.NIFTIhdr.dim[3]; Getmem(lFFT,(lnVol) * Sizeof(Single)); lnFFTout := ((lnVol) div 2)-1 ; Getmem(lFFTout,(lnFFTout) * Sizeof(Single)); Getmem(lFFTsum,(lnFFTout) * Sizeof(double)); for lP := 1 to lnFFTout do lFFTSum[lP] := 0; for lP := 1 to lnFFTout do lFFTout[lP] := 0; lVolOffset := lVolSz; //next - compute sum of signal - unrolled loops for each datatype lCount := 0; if (l4DHdr.ImgBufferBPP = 4) then begin l32Buf := SingleP(l4DHdr.ImgBuffer ); for lVox := 1 to lVolSz do begin if gMRIcroOverlay[lROInum].ScrnBuffer[lVox] > 0 then begin for lVol := 1 to lnVol do lFFT[lVol] := l32Buf[lVox+((lVol-1)*lVolOffset)]; FFTPower(lFFT,lFFTout,lnVol); for lP := 1 to lnFFTout do lFFTSum[lP] := lFFTSum[lP]+lFFTout[lP]; inc(lCount); end; //part of ROI end; //for each vox end else if (l4DHdr.ImgBufferBPP = 2) then begin l16Buf := SmallIntP(l4DHdr.ImgBuffer ); for lVox := 1 to lVolSz do begin if gMRIcroOverlay[lROInum].ScrnBuffer[lVox] > 0 then begin for lVol := 1 to lnVol do lFFT[lVol] := l16Buf[lVox+((lVol-1)*lVolOffset)]; FFTPower(lFFT,lFFTout,lnVol); //FFTPower(lFFT,lFFx,lnVol); for lP := 1 to lnFFTout do lFFTSum[lP] := lFFTSum[lP]+lFFTout[lP]; inc(lCount); end; //part of ROI end; //for each vox end else if l4DHdr.ImgBufferBPP = 1 then begin for lVox := 1 to lVolSz do begin if gMRIcroOverlay[lROInum].ScrnBuffer[lVox] > 0 then begin for lVol := 1 to lnVol do lFFT[lVol] := l4DHdr.ImgBuffer[lVox+((lVol-1)*lVolOffset)]; FFTPower(lFFT,lFFTout,lnVol); for lP := 1 to lnFFTout do lFFTSum[lP] := lFFTSum[lP]+lFFTout[lP]; inc(lCount); end; //part of ROI end; //for each vox end else showmessage('Serious error: unknown data size!'); //now compute mean signal if lCount > 0 then begin for lP := 1 to lnFFTout do lFFTSum[lP] := lFFTSum[lP] / lCount; for lP := 1 to lnFFTout do if specialdouble(lFFTSum[lP]) then lFFTSum[lP] := 0; end; for lP := 1 to lnFFTout do lFFTLines[lP] := lFFTSum[lP]; freemem(lFFT); freemem(lFFTout); freemem(lFFTsum); end; procedure Plot4DFFT(lStartSample: integer); var //lDataOut: SingleP; lLines,N,I: Integer; l4DTrace: T4DTrace; begin if (g4dData.lines[1].events < 5) then exit; lLines := 1; for I := 2 to kMaxLines do if g4dData.lines[I].events =g4dData.lines[1].events then inc(lLines); N := g4dData.lines[1].events; N := (N div 2)-1; Create4DTrace ( l4DTrace); Init4DTrace(N,lLines,l4DTrace,false); lLines := 0; for I := 1 to kMaxLines do if g4dData.lines[I].events =g4dData.lines[1].events then begin inc(lLines); l4DTrace.lines[lLines].eLabel := ROIoverlayNameShort(0);// g4dData.lines[I].eLabel; N := g4dData.lines[I].events; FFTPower(g4dData.lines[I].EventRA,l4DTrace.lines[lLines].EventRA,N); end; //events[i] = events[1] MinMax4DTrace(l4dtrace); l4dtrace.HorzMin := 0; //range will be 0.. 1/TR*Nyquist Sec/Cycle if Graph4DForm.TREdit.value = 0 then l4dtrace.HorzWidPerBin := (0.5)/(l4dTrace.lines[1].events-1) else l4dtrace.HorzWidPerBin := ((1/Graph4DForm.TREdit.value)*0.5)/(l4dTrace.lines[1].events-1); CorePlot4DTrace(l4Dtrace,Graph4DForm.Image1,lStartSample,Graph4DForm.HSpeedDrop.ItemIndex,-1,Graph4DForm.TREdit.value,Graph4DForm.MinEdit.value,Graph4DForm.MaxEdit.value,false); Close4DTrace(l4Dtrace,true); end; procedure FFT4ROI (var l4DHdr: TMRIcroHdr); var l4DTrace: T4DTrace; lnROI,lROI,lnVol,lnFFTOut: integer; begin lnVol := l4DHdr.NIFTIhdr.dim[4]; if lnVol < 5 then exit; lnROI := numROI; if lnROI < 1 then begin Plot4DFFT(1); exit; end; Create4DTrace ( l4DTrace); lnFFTout := (lnVol div 2) -1; Init4DTrace(lnFFTout,lnROI,l4DTrace,false); for lROI := 1 to lnROI do begin ROI2FFT(l4DHdr,ROIoverlayNum(lROI),l4DTrace.Lines[lROI].EventRA); l4DTrace.Lines[lROI].elabel := ROIoverlayNameShort(lROI); end; MinMax4DTrace(l4dtrace); l4dtrace.HorzMin := 0; //range will be 0.. 1/TR*Nyquist Sec/Cycle if Graph4DForm.TREdit.value = 0 then l4dtrace.HorzWidPerBin := (0.5)/(l4dTrace.lines[1].events-1) else l4dtrace.HorzWidPerBin := ((1/Graph4DForm.TREdit.value)*0.5)/(l4dTrace.lines[1].events-1); CorePlot4DTrace(l4Dtrace,Graph4DForm.Image1,1,Graph4DForm.HSpeedDrop.ItemIndex,-1,Graph4DForm.TREdit.value,Graph4DForm.MinEdit.value,Graph4DForm.MaxEdit.value,false); Close4DTrace(l4Dtrace,true); end; {$ENDIF} procedure TGraph4DForm.Plot4DTrace(lStartSample: integer); begin g4Ddata.HorzWidPerBin := TREdit.value; CorePlot4DTrace(g4Ddata,Image1,lStartSample,HSpeedDrop.ItemIndex,-1,TREdit.value,MinEdit.value,MaxEdit.value,false); //StatusBar1.Panels[1].Text := 'Offset:'+inttostr(lStartSample); //ShowLegend(g4Ddata,Image1, 50,5); end; procedure TGraph4DForm.TextBtnClick(Sender: TObject); begin end; procedure TextToTrace (var l4DTrace: T4DTrace); var lStr: string; lCond, lnCond,lE: integer; begin lncond := 0; for lCond := 1 to kMaxCond do if l4DTrace.Lines[lCond].Events > 0 then inc(lnCond); if lncond = 0 then exit; for lCond := 1 to kMaxCond do begin if l4DTrace.Lines[lCond].Events > 0 then begin lStr := gMRIcroOverlay[kBGOverlayNum].HdrFileName+kTextSep+l4DTrace.Lines[lCond].ELabel; for lE := 1 to l4DTrace.Lines[lCond].Events do lStr := lStr + kTextSep+ realtostr(l4DTrace.Lines[lCond].EventRA^[lE],4) ; TextForm.MemoT.lines.add(lStr); end; end; end; function TGraph4DForm.ReadGraf(lFilename: string; lBatch,lTRcritical: boolean): boolean; label 666; var lnVol: integer; lReslice : boolean; begin ImgForm.CloseImagesClick(nil); Close4DTrace(g4Ddata,true); FreeImgMemory(g4DHdr); result := false; if not fileexists(lFilename) then exit; Graph4DForm.Caption := 'Viewing: '+lFilename; lReslice := gBGImg.ResliceOnLoad; gBGImg.ResliceOnLoad := false; gBGImg.Prompt4DVolume := false; //if not lBatch then begin //12/2007 ImgForm.OpenAndDisplayImg(lFilename,True); lnVol := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[4]; if (lnVol < 2) then begin showmessage('You need to open a 4D image.'); goto 666; end; if not HdrForm.OpenAndDisplayHdr(lFilename,g4DHdr) then goto 666; if not OpenImg(gBGImg,g4DHdr,false,false,false,false,true {4D!}) then goto 666; TrackBar1.Max := lnVol; if gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.PixDim[4] = 0 then begin beep; ImgForm.StatusLabel.caption := 'Assuming TR = '+floattostr(TREdit.value); end else TREdit.value := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.PixDim[4];//TR if (TREdit.value = 0) and (lTRcritical) then showmessage('Please set the TR value [in seconds]'); result := true; 666: gBGImg.ResliceOnLoad := lReslice; gBGImg.Prompt4DVolume := true; end; procedure TGraph4DForm.FormShow(Sender: TObject); begin end; (*{x$IFDEF FFTs} procedure TGraph4DForm.FormShow(Sender: TObject); var lFilename: string; begin //abba lFilename := 'C:\cygwin\home\mscae\20061220_140508\'; //ReadCond(lFilename+'puls.txt',g4Ddata,1); //ReadCond(lFilename+'resp.txt',g4Ddata,2); HdrForm.OpenHdrDlg.Filename := lFilename+'rachris.nii.gz'; ReadGraf(HdrForm.OpenHdrDlg.Filename ); ImgForm.XViewEdit. value := 43; ImgForm.YViewEdit. value := 37; ImgForm.ZViewEdit. value := 22; PSForm.BinWidthEdit.value := 0.1; PSForm.PreBinEdit.value := 5; PSForm.PostBinEdit.value := 5; lFilename := 'C:\cygwin\home\mscae\20061220_140508\ravoi.voi'; //ImgForm.OverlayOpenCore ( lFilename, kBGOverlayNum+1); RefreshBtnClick(nil); end; {x$ELSE} //no FFT procedure TGraph4DForm.FormShow(Sender: TObject); var lFilename: string; //lReslice : boolean; begin //lReslice :=gReslice; //gReslice := false; ReadCond(extractfiledir(paramstr(0))+'\L_Tap.txt',g4Ddata,1); ReadCond(extractfiledir(paramstr(0))+'\R_Tap.txt',g4Ddata,2); HdrForm.OpenHdrDlg.Filename := extractfiledir(paramstr(0))+'\filtered_func_data.nii.gz'; ReadGraf(HdrForm.OpenHdrDlg.Filename ); ImgForm.XViewEdit. value := 42; ImgForm.YViewEdit. value := 29; ImgForm.ZViewEdit. value := 28; lFilename := extractfiledir(paramstr(0))+'\Left.voi'; ImgForm.OverlayOpenCore ( lFilename, kBGOverlayNum+1); //VR( lFilename, 1); //ImgForm.OpenVOICore(lFilename); lFilename := extractfiledir(paramstr(0))+'\Right.voi'; ImgForm.OverlayOpenCore ( lFilename,kBGOverlayNum+2); //VR(lFilename,2); RefreshBtnClick(nil); //gReslice := lReslice; end; {x$ENDIF} *) procedure TGraph4DForm.FormCreate(Sender: TObject); begin {$IFNDEF FPC} gWmf := TMetafile.Create; gWmf.Enhanced := True; {$ENDIF} Create4DTrace(g4Ddata); Graph4DForm.DoubleBuffered := true; HSpeedDrop.ItemIndex := 0; InitImgMemory(g4DHdr); end; procedure TGraph4DForm.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin Close4DTrace(g4Ddata,true); FreeImgMemory(g4DHdr); //gWmf.Free; end; procedure TGraph4DForm.TrackBar1Change(Sender: TObject); begin Trackbar1.visible := (HSpeedDrop.ItemIndex > 0); Plot4DTrace(TrackBar1.position); end; {$DEFINE notTest4D} procedure TGraph4DForm.OpenDataClick(Sender: TObject); var lI,lCnt: integer; lStr: string; begin Close4DTrace(g4Ddata,true); FreeImgMemory(g4DHdr); {$IFDEF Test4D} if not ReadGraf('C:\tx\20091006\fsl\filtered_func_data.nii.gz',false,true) then exit; ReadCond('C:\tx\20091006\fsl\timing.txt',g4Ddata,1); //ReadCond('C:\fatigue\TD\b.txt',g4Ddata,2); PSPlotClick(nil); exit; if not ReadGraf('C:\fatigue\perisample\filtered_func_data.nii.gz',false,true) then exit; ReadCond('C:\fatigue\perisample\L_Tap.txt',g4Ddata,1); ReadCond('C:\fatigue\perisample\R_Tap.txt',g4Ddata,2); lI := 1; lStr := 'C:\fatigue\perisample\left.voi'; ImgForm.OverlayOpenCore(lStr,lI+kBGOverlayNum); PSPlotClick(nil); exit; {$ENDIF} if not OpenDialogExecute(kImgFilter,'Select 4D image',false) then exit; if not ReadGraf(HdrForm.OpenHdrDlg.Filename,false,true) then exit; ImgForm.XViewEdit.value := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[1] div 2; ImgForm.YViewEdit.value := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[2] div 2; ImgForm.ZViewEdit.value := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[3] div 2; if OpenDialogExecute(kTxtFilter,'Select 3-column event onset time files [optional]',true) then begin if HdrForm.OpenHdrDlg.Files.Count > 0 then begin lCnt := HdrForm.OpenHdrDlg.Files.Count; if lCnt > kMaxCond then begin showmessage('Can only load '+inttostr(kMaxCond)+'conditions'); lCnt := kMaxCond; end; for lI := 1 to lCnt do ReadCond(HdrForm.OpenHdrDlg.Files[lI-1],g4Ddata,lI); end;//if count > 1 end; //if opendialog if OpenDialogExecute(kImgPlusVOIFilter,'Select regions of interest',true) then begin if HdrForm.OpenHdrDlg.Files.Count > 0 then begin lCnt := HdrForm.OpenHdrDlg.Files.Count; //Apr07 if lCnt > (knMaxOverlay-2) then begin showmessage('Can only load '+inttostr(knMaxOverlay-2)+'conditions'); lCnt := knMaxOverlay; end; for lI := 1 to lCnt do begin lStr := HdrForm.OpenHdrDlg.Files[lI-1]; ImgForm.OverlayOpenCore(lStr,lI+kBGOverlayNum); end; end;//if count > 1 end; //if opendialog RefreshBtnMouseDown(nil,mbleft,[],1,1); end; procedure TGraph4DForm.FormResize(Sender: TObject); begin if not Graph4DForm.visible then exit; GraphResize(Image1); Plot4DTrace(TrackBar1.position); end; procedure TGraph4DForm.PSPlotClick(Sender: TObject); var lPSPlot: TPSPlot; {var lTRSec,lBinWidthSec: single; lnNegBins,lnPosBins: integer; lSliceTime, lSavePSVol,lTextOutput,lGraphOutput,lBaselineCorrect,lPctSignal, lRemoveRegressorVariability,lTemporalDeriv,lPlotModel: boolean; } begin if NCond ( g4Ddata) < 1 then begin RefreshBtnMouseDown(nil,mbleft,[],1,1); exit; end; lPSPlot.TRSec := TREdit.value; if not PSForm.GetPeriSettings(lPSPlot) then exit; lPSPlot.TextOutput := false; lPSPlot.GraphOutput := true; lPSPlot.batch := false; CreatePeristimulusPlot (g4DHdr,g4Ddata, lPSPlot); end; procedure TGraph4DForm.PSTextClick(Sender: TObject); var lPSPlot: TPSPlot; begin if NCond ( g4Ddata) < 1 then begin RefreshBtnMouseDown(nil,mbleft,[],1,1); TextForm.MemoT.Lines.Clear;//prepare to report results TextToTrace (g4Ddata); TextForm.show; exit; end; lPSPlot.TRSec := TREdit.value; if not PSForm.GetPeriSettings(lPSPlot) then exit; lPSPlot.TextOutput := true; lPSPlot.GraphOutput := true; lPSPlot.batch := false; CreatePeristimulusPlot (g4DHdr,g4Ddata, lPSPlot); end; procedure TGraph4DForm.Copy1Click(Sender: TObject); {$IFDEF FPC} begin if (Image1.Picture.Graphic = nil) then begin //1420z Showmessage('You need to generate an image before you can copy it to the clipboard.'); exit; end; Image1.Picture.Bitmap.SaveToClipboardFormat(2); end; {$ELSE} var MyFormat : Word; AData: THandle; APalette : HPalette; begin if gWMF.Empty then begin showmessage('Please Open a dataset first.'); exit; end; gWmf.SaveToClipboardFormat(MyFormat,AData,APalette); ClipBoard.SetAsHandle(MyFormat,AData); end; {$ENDIF} procedure TGraph4DForm.FormDestroy(Sender: TObject); begin //gWmf.Free; end; procedure TGraph4DForm.Closewindow1Click(Sender: TObject); begin Graph4DForm.Close; end; procedure TGraph4DForm.SaveasEMF1Click(Sender: TObject); begin {$IFDEF FPC} SaveImgAsPNGBMP (Image1); {$ELSE} if gWMF.Empty then begin showmessage('Please Open a dataset first.'); exit; end; ImgForm.SaveDialog1.Filter := 'Enhanced Metafile|*.emf'; ImgForm.SaveDialog1.DefaultExt := '*.emf'; if not ImgForm.SaveDialog1.Execute then exit; gWmf.SaveToFile (ChangeFileExt(ImgForm.SaveDialog1.FileName,'.emf')); {$ENDIF} end; procedure TGraph4DForm.FFTitemClick(Sender: TObject); begin {$IFDEF FFTs} FFT4ROI (g4DHdr); exit; {$ENDIF} showmessage('FFT not included with this build.'); end; procedure TGraph4DForm.RefreshBtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (g4DHdr.ImgBufferItems = 0) then begin showmessage('You must first load 4D data [Press the ''Open Data'' button.'); exit; end; ConvertToTrace(g4DHdr,g4Ddata,ImgForm.XViewEdit.value,ImgForm.YViewEdit.value,ImgForm.ZViewEdit.value); Plot4DTrace(TrackBar1.position); end; procedure TGraph4DForm.Extract4DroisClick(Sender: TObject); const kMin8bit = 0; kMax8bit = 255; var lROInum,lVol,lnVol,lPos,lROI,lVolSz,lVolOffset: integer; lStr: string; SumRA : array [kMin8bit..kMax8bit] of double; nRA : array [kMin8bit..kMax8bit] of longint; l16Buf : SmallIntP; l32Buf : SingleP; lOutStr: string; begin Close4DTrace(g4Ddata,true); FreeImgMemory(g4DHdr); if not OpenDialogExecute(kImgFilter,'Select 4D image',false) then exit; if not ReadGraf(HdrForm.OpenHdrDlg.Filename,false,true) then exit; ImgForm.XViewEdit.value := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[1] div 2; ImgForm.YViewEdit.value := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[2] div 2; ImgForm.ZViewEdit.value := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[3] div 2; lVolSz := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[1]*gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[2]*gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[3]; if not OpenDialogExecute(kImgPlusVOIFilter,'Select regions of interest',false) then exit; lROInum := 1+kBGOverlayNum; lStr := HdrForm.OpenHdrDlg.Filename; ImgForm.OverlayOpenCore(lStr,lROInum); if gMRIcroOverlay[lROInum].ImgBufferBPP <> 1 then begin showmessage('Overlay must be 8-bit image'); exit; end; if (gMRIcroOverlay[lROInum].ImgBufferItems <> lVolSz) or (lVOlSz < 1) then begin showmessage('Overlay must have identical dimensions as 4D image'); exit; end; lnVol := gMRIcroOverlay[kBGOverlayNum].NIFTIhdr.dim[4]; if lnVol < 2 then begin showmessage('Requires 4D data'); exit; end; if (g4DHdr.ImgBufferItems <> ({lnVol*}lVolSz)) then begin showmessage('4D image not loaded correctly '+inttostr(g4DHdr.ImgBufferItems)+' <> '+inttostr(lVolSz)); exit; end; TextForm.MemoT.Lines.Clear;//prepare to report results //count frequency of each column... for lPos := kMin8Bit to kMax8bit do nRA[lPos] := 0; for lPos := 1 to lVolSz do begin lROI := gMRIcroOverlay[lROInum].ImgBuffer^[lPos]; //ROI must be 8-bit! nRA[lROI] := nRA[lROI] + 1; end; //report detected ROI volumes lOutStr := 'vol'; for lROI := kMin8Bit to kMax8bit do if nRA[lROI] > 0 then lOutStr := lOutStr+kTextSep+inttostr(nRA[lROI]); TextForm.MemoT.lines.add(lOutStr); //report detected ROIs [column labels] lOutStr := 'ROI'; for lROI := kMin8Bit to kMax8bit do if nRA[lROI] > 0 then lOutStr := lOutStr+kTextSep+inttostr(lROI); TextForm.MemoT.lines.add(lOutStr); //compute mean intensity for each ROI at each timepoint l32Buf := SingleP(g4DHdr.ImgBuffer); l16Buf := SmallIntP(g4DHdr.ImgBuffer); for lVol := 1 to lnVol do begin lVolOffset := (lVol-1)*lVolSz; for lPos := kMin8Bit to kMax8bit do //initialize all ROIs for this volume SumRA[lPos] := 0; if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 4) then begin for lPos := 1 to lVolSz do begin lROI := gMRIcroOverlay[lROInum].ImgBuffer^[lPos]; //ROI must be 8-bit! SumRA[lROI] := SumRA[lROI] + l32Buf^[lPos+lVolOffset]; end; end else if (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 2) then begin for lPos := 1 to lVolSz do begin lROI := g4DHdr.ImgBuffer^[lPos]; //ROI must be 8-bit! SumRA[lROI] := SumRA[lROI] + l16Buf^[lPos+lVolOffset]; end; end else if gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP = 1 then begin for lPos := 1 to lVolSz do begin lROI := gMRIcroOverlay[lROInum].ImgBuffer^[lPos]; //ROI must be 8-bit! SumRA[lROI] := SumRA[lROI] + gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[lPos+lVolOffset]; end; end else begin showmessage('Serious error: unsupported datatype!'); exit; end; lOutStr := inttostr(lvol); for lROI := kMin8Bit to kMax8bit do if nRA[lROI] > 0 then lOutStr := lOutStr+kTextSep+realtostr(SumRA[lROI]/nRA[lROI],4); TextForm.MemoT.lines.add(lOutStr); end; //for each volume TextForm.show; RefreshBtnMouseDown(nil,mbleft,[],1,1); end; procedure TGraph4DForm.Batchdata1Click(Sender: TObject); label 111; var lStr: string; l4D,lVectors,lVOI: TStringList; lPSPlot: TPSPlot; lImg,lI: integer; (*lTRSec,lBinWidthSec: single; lI,lImg,lnNegBins,lnPosBins: integer; lSliceTime,lSavePSVol,lTextOutput,lGraphOutput,lBaselineCorrect,lPctSignal, lRemoveRegressorVariability,lTemporalDeriv,lPlotModel: boolean; *) begin ImgForm.CloseImagesClick(nil); Close4DTrace(g4Ddata,true); FreeImgMemory(g4DHdr); if not OpenDialogExecute(kImgFilter,'Select 4D images',true) then exit; l4D := TStringList.Create; lVectors := TStringList.Create;//empty lVOI := TStringList.Create; l4D.AddStrings(HdrForm.OpenHdrDlg.Files); if OpenDialogExecute(kTxtFilter,'Select 3-column event onset time files',true) then begin if HdrForm.OpenHdrDlg.Files.Count > kMaxCond then begin showmessage('Can only load '+inttostr(kMaxCond)+'conditions'); goto 111; end; lVectors.AddStrings(HdrForm.OpenHdrDlg.Files); end; if not OpenDialogExecute(kImgPlusVOIFilter,'Select region[s] of interest',true) then goto 111; if HdrForm.OpenHdrDlg.Files.Count > (knMaxOverlay-2) then begin showmessage('Can only load '+inttostr(knMaxOverlay-2)+'conditions'); goto 111; end; lVOI.AddStrings(HdrForm.OpenHdrDlg.Files); if not ReadGraf(l4D[0],false, (lVectors.count > 0) ) then goto 111; //read first dataset to set TR! //get plot settings.... lPSPlot.TRSec := TREdit.value; if lVectors.count > 0 then if not PSForm.GetPeriSettings(lPSPlot) then goto 111; lPSPlot.TextOutput := true; lPSPlot.GraphOutput := false; lPSPlot.Batch := true; TextForm.MemoT.Lines.Clear;//prepare to report results for lImg := 1 to l4D.Count do begin //showmessage(l4D[lImg-1]); if lImg > 1 then begin//we have already read 1st img Refresh; Close4DTrace(g4Ddata,true); ImgForm.CloseImagesClick(nil); FreeImgMemory(g4DHdr); if not ReadGraf(l4D[lImg-1],true,(lVectors.count > 0)) then goto 111; //read first dataset to set TR! end; //all except 1st image if lVectors.count > 0 then begin for lI := 1 to lVectors.count do ReadCond(lVectors[lI-1],g4Ddata,lI); end;//vectors > 0 if lVOI.count > 0 then begin for lI := 1 to lVOI.count do begin lStr := lVOI[lI-1]; ImgForm.OverlayOpenCore(lStr,lI+kBGOverlayNum); end;//for each VOI end; //VOI > 0 if lVectors.Count > 0 then CreatePeristimulusPlot (g4DHdr,g4Ddata, lPSPlot) else begin // RefreshBtnMouseDown(nil,mbleft,[],1,1); ConvertToTrace(g4DHdr,g4Ddata,ImgForm.XViewEdit.value,ImgForm.YViewEdit.value,ImgForm.ZViewEdit.value); TextToTrace (g4Ddata); RegressTrace(g4Ddata); end; end; TextForm.show; 111: lVOI.Free; lVectors.Free; l4D.Free; end; procedure TGraph4DForm.RefreshBtnClick(Sender: TObject); begin RefreshBtnMouseDown(nil,mbleft,[],1,1); end; function ResliceFSLVOIs(var lFeatDirs,lVOI: TStringList): boolean; //uses reslice var lDir,lV: integer; lMatName,lFuncName,lReslicedVOIName:string; begin result := false; if lFeatDirs.count < 1 then exit; if lVOI.count < 1 then exit; for lDir := 1 to (lFeatDirs.Count) do begin lMatName := FSLMatName (lFeatDirs[lDir-1]); lFuncName := FSLFuncName (lFeatDirs[lDir-1]); for lV := 1 to lVOI.Count do begin lReslicedVOIName := FSLReslicedVOIName (lFeatDirs[lDir-1], lVOI[lV-1]); if not ResliceImg (lFuncName,lVOI[lV-1],lMatName,lReslicedVOIName) then begin Showmessage('graphx reslice FSL failed.'); exit; end; end;//for each VOI end;//for each Dir result := true; end; {$DEFINE notTEST} function FindFEATFolders (var lFeatDirs:TStringList): boolean; var lDir,lFeatPath: string; lSearchRec: TSearchRec; begin result := false; {$IFDEF TEST} lDir := 'C:\cygwin\home\express'; {$ELSE} //lDir := 'C:\cygwin\home\express'; //lDir := SelectDirectory('Choose root folder that contains .feat folders', BIF_RETURNONLYFSDIRS); LDir := UserDataFolder; lDir := GetDirPrompt (lDir); {$ENDIF} if lDir = '' then exit; lFeatDirs := TStringList.Create; if FindFirst(lDir+pathdelim+'*'+'.feat', faAnyFile, lSearchRec) = 0 then begin repeat if (faDirectory and lSearchRec.attr) = faDirectory then begin lFeatPath := lDir+pathdelim+lSearchRec.Name; if Fileexists(FSLMatName(lFeatPath)) and Fileexists(FSLFuncName(lFeatPath)) then lFeatDirs.Add(lFeatPath) else Showmessage('Can not find '+FSLMatName(lFeatPath) +' or '+FSLFuncName(lFeatPath) ); end; until (FindNext(lSearchRec) <> 0); end; FindClose(lSearchRec); if lFeatDirs.Count < 1 then begin Showmessage('Unable to find any feat dirs in path '+lDir); lFeatDirs.free; exit; end; result := true; end; procedure TGraph4DForm.FSLbatch1Click(Sender: TObject); label 111; var lStr: string; lFeatDirs,lVectors,lVOI: TStringList; //lTRSec,lBinWidthSec: single; lI,lImg: integer; lUseFSLEVs: Boolean; lPSPlot: TPSPlot; {lSliceTime,lSavePSVol,lTextOutput,lBaselineCorrect,lPctSignal, lRemoveRegressorVariability,lTemporalDeriv,lUseFSLEVs,lPlotModel: boolean; } begin ImgForm.CloseImagesClick(nil); Close4DTrace(g4Ddata,true); FreeImgMemory(g4DHdr); if not FindFEATFolders (lFeatDirs) then exit; lVectors := TStringList.Create;//empty lVOI := TStringList.Create; {$IFDEF TEST} lUseFSLEVs := false; lFeatDirs.AddStrings(lFeatDirs); lFeatDirs.AddStrings(lFeatDirs); lFeatDirs.AddStrings(lFeatDirs); lFeatDirs.AddStrings(lFeatDirs); lFeatDirs.AddStrings(lFeatDirs); lVectors.Add('C:\cygwin\home\express\20070420_132327fMRIcontin30x30x36s004a001.feat\custom_timing_files\ev1.txt'); lVectors.Add('C:\cygwin\home\express\20070420_132327fMRIcontin30x30x36s004a001.feat\custom_timing_files\ev2.txt'); lVectors.Add('C:\cygwin\home\express\20070420_132327fMRIcontin30x30x36s004a001.feat\custom_timing_files\ev3.txt'); lVOI.Add('C:\fatigue\v1.nii.gz'); lVOI.Add('C:\fatigue\v2.nii.gz'); {$ELSE} FSLEVNames (lFeatDirs[0], lVectors); lUseFSLEVs := false; if lVectors.count > 0 then lUseFSLEVs := OKMsg('Use event vectors from the .FEAT'+pathdelim+'custom_timing_files folder?'); //shows dialog with OK/Cancel returns true if user presses OK if not lUseFSLEVs then begin lVectors.clear; if OpenDialogExecute(kTxtFilter,'Select 3-column event onset time files',true) then begin if HdrForm.OpenHdrDlg.Files.Count > kMaxCond then begin showmessage('Can only load '+inttostr(kMaxCond)+'conditions'); goto 111; end; lVectors.AddStrings(HdrForm.OpenHdrDlg.Files); end; end; //manually select EVs if not OpenDialogExecute(kImgPlusVOIFilter,'Select volume[s] of interest [2mm MNI space]',true) then goto 111; if HdrForm.OpenHdrDlg.Files.Count > (knMaxOverlay-2) then begin showmessage('Can only load '+inttostr(knMaxOverlay-2)+'conditions'); goto 111; end; lVOI.AddStrings(HdrForm.OpenHdrDlg.Files); {$ENDIF} if not ResliceFSLVOIs(lFeatDirs,lVOI) then begin showmessage('Unable to reslice VOIs!'); goto 111; end; lPSPlot.TextOutput := true; lPSPlot.GraphOutput := false; TextForm.MemoT.Lines.Clear;//prepare to report results if not ReadGraf(FSLFuncName (lFeatDirs[0]),false, (lVectors.count > 0) ) then goto 111; //read first dataset to set TR! //la1 := (FreeRAM); //get plot settings.... lPSPlot.TRSec := TREdit.value; if lVectors.count > 0 then if not PSForm.GetPeriSettings(lPSPlot) then goto 111; for lImg := 1 to lFeatDirs.Count do begin if lImg > 1 then begin//we have already read 1st img Refresh; Application.processmessages; Close4DTrace(g4Ddata,true); ImgForm.CloseImagesClick(nil); FreeImgMemory(g4DHdr); //Textform.memo1.lines.add(inttostr(FreeRAM));//rascal if not ReadGraf(FSLFuncName (lFeatDirs[lImg-1]),true,(lVectors.count > 0)) then goto 111; //read first dataset to set TR! if lUseFSLEVs then FSLEVNames (lFeatDirs[lImg-1], lVectors) end; //all except 1st image if lVectors.count > 0 then begin for lI := 1 to lVectors.count do ReadCond(lVectors[lI-1],g4Ddata,lI); end;//vectors > 0 if lVOI.count > 0 then begin for lI := 1 to lVOI.count do begin lStr := FSLReslicedVOIName (lFeatDirs[lImg-1], lVOI[lI-1]); ImgForm.OverlayOpenCore(lStr,lI+kBGOverlayNum); end;//for each VOI end; //VOI > 0 if lVectors.Count > 0 then begin if lImg = lFeatDirs.Count then lPSPlot.GraphOutput := true; CreatePeristimulusPlot (g4DHdr,g4Ddata, lPSPlot) end else begin ConvertToTrace(g4DHdr,g4Ddata,ImgForm.XViewEdit.value,ImgForm.YViewEdit.value,ImgForm.ZViewEdit.value); TextToTrace (g4Ddata); RegressTrace(g4Ddata); end; end; TextForm.show; 111: lVOI.Free; lVectors.Free; lFeatDirs.free; end; {$DEFINE TEST} procedure TGraph4DForm.FSLtest1Click(Sender: TObject); label 111; var lStr: string; lFeatDirs,lVectors,lVOI: TStringList; lI,lImg: integer; lUseFSLEVs: Boolean; lPSPlot: TPSPlot; {lSliceTime,lSavePSVol,lTextOutput,lBaselineCorrect,lPctSignal, lRemoveRegressorVariability,lTemporalDeriv,lUseFSLEVs,lPlotModel: boolean; } begin ImgForm.CloseImagesClick(nil); Close4DTrace(g4Ddata,true); FreeImgMemory(g4DHdr); //x if not FindFEATFolders (lFeatDirs) then //x exit; lVectors := TStringList.Create;//empty lVOI := TStringList.Create; {$IFDEF TEST} lFeatDirs := TStringList.Create; for lI := 1 to 100 do lFeatDirs.Add('C:\mri\fds.feat'); {lUseFSLEVs := true; FSLEVNames (lFeatDirs[0], lVectors); } lUseFSLEVs := false; lVectors.Add('C:\mri\fds.feat\custom_timing_files\ev1.txt'); lVectors.Add('C:\mri\fds.feat\custom_timing_files\ev2.txt'); //lVectors.Add('C:\cygwin\home\express\20070420_132327fMRIcontin30x30x36s004a001.feat\custom_timing_files\ev3.txt'); lVOI.Add('C:\mri\left.voi'); lVOI.Add('C:\mri\right.voi'); lVOI.Add('C:\mri\v1.voi'); {$ELSE} FSLEVNames (lFeatDirs[0], lVectors); lUseFSLEVs := false; if lVectors.count > 0 then lUseFSLEVs := OKMsg('Use event vectors from the .FEAT'+pathdelim+'custom_timing_files folder?'); //shows dialog with OK/Cancel returns true if user presses OK if not lUseFSLEVs then begin lVectors.clear; if OpenDialogExecute(kTxtFilter,'Select 3-column event onset time files',true) then begin if HdrForm.OpenHdrDlg.Files.Count > kMaxCond then begin showmessage('Can only load '+inttostr(kMaxCond)+'conditions'); goto 111; end; lVectors.AddStrings(HdrForm.OpenHdrDlg.Files); end; end; //manually select EVs if not OpenDialogExecute(kImgPlusVOIFilter,'Select volume[s] of interest [2mm MNI space]',true) then goto 111; if HdrForm.OpenHdrDlg.Files.Count > (knMaxOverlay-2) then begin showmessage('Can only load '+inttostr(knMaxOverlay-2)+'conditions'); goto 111; end; lVOI.AddStrings(HdrForm.OpenHdrDlg.Files); {$ENDIF} if not ResliceFSLVOIs(lFeatDirs,lVOI) then begin showmessage('Unable to reslice VOIs!'); goto 111; end; lPSPlot.TextOutput := true; lPSPlot.GraphOutput := false; TextForm.MemoT.Lines.Clear;//prepare to report results if not ReadGraf(FSLFuncName (lFeatDirs[0]),false, (lVectors.count > 0) ) then goto 111; //read first dataset to set TR! //la1 := (FreeRAM); //get plot settings.... lPSPlot.TRSec := TREdit.value; if lVectors.count > 0 then if not PSForm.GetPeriSettings(lPSPlot) then goto 111; for lImg := 1 to lFeatDirs.Count do begin if lImg > 1 then begin//we have already read 1st img Refresh; Application.processmessages; Close4DTrace(g4Ddata,true); ImgForm.CloseImagesClick(nil); FreeImgMemory(g4DHdr); //Textform.memo1.lines.add(inttostr(FreeRAM));//rascal if not ReadGraf(FSLFuncName (lFeatDirs[lImg-1]),true,(lVectors.count > 0)) then goto 111; //read first dataset to set TR! if lUseFSLEVs then FSLEVNames (lFeatDirs[lImg-1], lVectors) end; //all except 1st image if lVectors.count > 0 then begin for lI := 1 to lVectors.count do ReadCond(lVectors[lI-1],g4Ddata,lI); end;//vectors > 0 if lVOI.count > 0 then begin for lI := 1 to lVOI.count do begin lStr := FSLReslicedVOIName (lFeatDirs[lImg-1], lVOI[lI-1]); ImgForm.OverlayOpenCore(lStr,lI+kBGOverlayNum); end;//for each VOI end; //VOI > 0 if lVectors.Count > 0 then begin if lImg = lFeatDirs.Count then lPSPlot.GraphOutput := true; CreatePeristimulusPlot (g4DHdr,g4Ddata, lPSPlot) end else begin ConvertToTrace(g4DHdr,g4Ddata,ImgForm.XViewEdit.value,ImgForm.YViewEdit.value,ImgForm.ZViewEdit.value); TextToTrace (g4Ddata); RegressTrace(g4Ddata); end; end; TextForm.show; 111: lVOI.Free; lVectors.Free; lFeatDirs.free; showmessage('done'); end; //test initialization {$IFDEF FPC} {$I graphx.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/graphx.lrs0000664000175000017500000002771111425653036017700 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TGraph4DForm','FORMDATA',[ 'TPF0'#12'TGraph4DForm'#11'Graph4DForm'#4'Left'#3#230#1#6'Height'#3#173#1#3'T' +'op'#3#156#0#5'Width'#3'I'#4#13'ActiveControl'#7#6'TREdit'#7'Caption'#6#18'4' +'D Timeline Viewer'#12'ClientHeight'#3#154#1#11'ClientWidth'#3'I'#4#4'Menu'#7 +#9'MainMenu1'#7'OnClose'#7#9'FormClose'#8'OnCreate'#7#10'FormCreate'#8'OnRes' +'ize'#7#10'FormResize'#6'OnShow'#7#8'FormShow'#8'Position'#7#14'poScreenCent' +'er'#10'LCLVersion'#6#6'0.9.29'#0#6'TImage'#6'Image1'#4'Left'#2#0#6'Height'#3 +'b'#1#3'Top'#2'$'#5'Width'#3'I'#4#5'Align'#7#8'alClient'#0#0#6'TPanel'#8'Fou' +'rDBar'#4'Left'#2#0#6'Height'#2'$'#3'Top'#2#0#5'Width'#3'I'#4#5'Align'#7#5'a' +'lTop'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'$'#11'ClientWidth'#3'I' +#4#8'TabOrder'#2#0#0#12'TSpeedButton'#11'OpenDataBtn'#4'Left'#2#11#6'Height' +#2#25#3'Top'#2#7#5'Width'#2'_'#7'Caption'#6#9'Open Data'#5'Color'#7#9'clBtnF' +'ace'#9'NumGlyphs'#2#0#7'OnClick'#7#13'OpenDataClick'#0#0#12'TSpeedButton'#10 +'RefreshBtn'#4'Left'#2'p'#6'Height'#2#30#3'Top'#2#4#5'Width'#2#30#5'Color'#7 +#9'clBtnFace'#10'Glyph.Data'#10#218#8#0#0#214#8#0#0'BM'#214#8#0#0#0#0#0#0'6' +#0#0#0'('#0#0#0#24#0#0#0#23#0#0#0#1#0' '#0#0#0#0#0#160#8#0#0'd'#0#0#0'd'#0#0 +#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'/'#0#0#255 +#156#0#0#255#185#0#0#255#202#0#0#255#191#0#0#255#12#255#255#255#0#255#255#255 +#0#255#255#255#0#0#0#255#13#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'2'#0#0#255#164#0#0#255#240 +#0#0#255#255#0#0#255#255#0#0#255#190#0#0#255#25#0#0#255#22#0#0#255'j'#0#0#255 +#153#0#0#255#194#0#0#255'i'#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#0#0#255'c'#0#0#255#229#0#0#255#255#0#0#255#255#0 +#0#255#255#0#0#255#228#0#0#255#8#0#0#255#15#0#0#255#224#0#0#255#255#0#0#255 +#252#0#0#255'a'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#0#0#255#1#0#0#255#136#0#0#255#244#0#0#255#255#0#0#255#255#0#0#255#255 +#0#0#255#255#0#0#255#238#0#0#255#24#255#255#255#0#0#0#255#145#0#0#255#255#0#0 +#255#230#0#0#255#246#0#0#255#167#0#0#255'('#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#0#0#255#151#0#0#255#254#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#255#0#0#255#204#0#0#255'`'#255#255#255#0#255#255#255#0#0#0#255#24#0#0#255 +#231#0#0#255'B'#0#0#255#148#0#0#255#242#0#0#255#234#0#0#255#144#0#0#255#16 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255'e'#0#0#255#248#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#222#0#0#255 +#127#0#0#255#6#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255#162#0#0#255' '#255#255#255#0#0#0#255'G'#0#0#255#203#0#0#255#255#0#0#255 +#218#0#0#255'P'#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'/'#0#0#255 +#226#0#0#255#255#0#0#255#255#0#0#255#252#0#0#255#167#0#0#255#23#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255#15#0#0#255#6#255#255#255#0#255#255#255#0#0#0#255#9#0#0#255#171#0#0#255 +#255#0#0#255#228#0#0#255'B'#255#255#255#0#255#255#255#0#0#0#255#182#0#0#255 +#255#0#0#255#255#0#0#255#238#0#0#255'}'#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255#12#0#0#255#197#0#0#255#255#0#0#255#206#0#0#255#6#0#0#255'&'#0#0#255#242 +#0#0#255#255#0#0#255#245#0#0#255'f'#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#0#0#255'+'#0#0#255#225#0#0#255#255#0#0#255'z'#0#0#255 +#132#0#0#255#255#0#0#255#255#0#0#255#135#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#175#0#0#255#255 +#0#0#255#162#0#0#255#195#0#0#255#255#0#0#255#215#0#0#255#3#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255#142#0#0#255#255#0#0#255#181#0#0#255#201#0#0#255#255#0#0#255#153#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 ,#255#0#255#255#255#0#0#0#255#153#0#0#255#255#0#0#255#201#0#0#255#181#0#0#255 +#255#0#0#255#142#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#0#0#255#3#0#0#255#215#0#0#255#255#0#0#255#195#0 +#0#255#162#0#0#255#255#0#0#255#175#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255#135#0#0#255#255#0#0 +#255#255#0#0#255#132#0#0#255'z'#0#0#255#255#0#0#255#225#0#0#255'+'#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'f'#0#0#255#245#0 +#0#255#255#0#0#255#242#0#0#255'&'#0#0#255#6#0#0#255#206#0#0#255#255#0#0#255 +#197#0#0#255#12#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'}'#0#0#255#238#0#0 +#255#255#0#0#255#255#0#0#255#182#255#255#255#0#255#255#255#0#0#0#255'B'#0#0 +#255#228#0#0#255#255#0#0#255#171#0#0#255#9#255#255#255#0#255#255#255#0#0#0 +#255#6#0#0#255#15#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#0#0#255#23#0#0#255#167#0#0#255#252#0#0#255#255#0#0 +#255#255#0#0#255#226#0#0#255'/'#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255'P'#0#0#255#218#0#0#255#255#0#0#255#203#0#0#255'G'#255#255#255#0#0#0#255 +' '#0#0#255#163#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0 +#255#6#0#0#255#127#0#0#255#222#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255 +#248#0#0#255'e'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#0#0#255#16#0#0#255#144#0#0#255#234#0#0#255#242#0#0#255#148#0#0#255 +'B'#0#0#255#231#0#0#255#24#255#255#255#0#255#255#255#0#0#0#255'`'#0#0#255#204 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#254#0#0#255#151#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#0#0#255'('#0#0#255#167#0#0#255#246#0#0#255 +#230#0#0#255#255#0#0#255#145#255#255#255#0#0#0#255#24#0#0#255#238#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#255#0#0#255#244#0#0#255#136#0#0#255#1#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'a'#0#0 +#255#252#0#0#255#255#0#0#255#224#0#0#255#15#0#0#255#8#0#0#255#228#0#0#255#255 +#0#0#255#255#0#0#255#255#0#0#255#229#0#0#255'c'#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#255'i'#0#0#255#194#0 +#0#255#153#0#0#255'j'#0#0#255#22#0#0#255#25#0#0#255#190#0#0#255#255#0#0#255 +#255#0#0#255#240#0#0#255#164#0#0#255'2'#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#0#0'@'#0#0#7 +#190#0#0#0#171#0#0#0'('#255#255#255#0#0#0#255#13#255#255#255#0#255#255#255#0 +#255#255#255#0#0#0#255#12#0#0#255#191#0#0#255#202#0#0#255#185#0#0#255#156#0#0 +#255'/'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#9'NumGlyphs'#2#0#7'OnClick'#7#15 +'RefreshBtnClick'#11'OnMouseDown'#7#19'RefreshBtnMouseDown'#0#0#6'TLabel'#7 +'TRLabel'#4'Left'#3#152#0#6'Height'#2#14#3'Top'#2#15#5'Width'#2')'#7'Caption' +#6#8'TR (sec)'#11'ParentColor'#8#0#0#12'TSpeedButton'#7'PlotBtn'#4'Left'#3 +#232#1#6'Height'#2#25#3'Top'#2#7#5'Width'#2'?'#7'Caption'#6#4'Plot'#5'Color' +#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClick'#7#11'PSPlotClick'#0#0#12'TSpeedB' +'utton'#7'TextBtn'#4'Left'#3'0'#2#6'Height'#2#25#3'Top'#2#7#5'Width'#2'P'#7 +'Caption'#6#4'Text'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClick'#7#11 +'PSTextClick'#0#0#14'TFloatSpinEdit'#6'TREdit'#4'Left'#3#240#0#6'Height'#2#21 +#3'Top'#2#9#5'Width'#2'R'#13'DecimalPlaces'#2#4#9'Increment'#5#0#0#0#0#0#0#0 +#128#255'?'#8'MaxValue'#5#0#0#0#0#0' '#188#190#25'@'#8'MinValue'#5#0#0#0#0#0 +#0#0#0#0#0#8'TabOrder'#2#0#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#9'TComboBox'#10 +'HSpeedDrop'#4'Left'#3'`'#1#6'Height'#2#21#3'Top'#2#5#5'Width'#2'x'#10'ItemH' +'eight'#2#13#13'Items.Strings'#1#6#6'To Fit'#6#2'x1'#6#2'x2'#6#2'x3'#6#2'x4' +#6#2'x5'#6#2'x6'#6#2'x7'#6#2'x8'#6#2'x9'#6#3'x10'#0#8'OnChange'#7#15'TrackBa' +'r1Change'#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#1#0#0#14'TFloatSpinEd' +'it'#7'MinEdit'#4'Left'#3#144#2#6'Height'#2#21#3'Top'#2#6#5'Width'#2'R'#13'D' +'ecimalPlaces'#2#4#9'Increment'#5#0#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0 +#0#0#0#0#0#200#5'@'#8'MinValue'#5#0#0#0#0#0#0#0#0#0#0#8'TabOrder'#2#2#5'Valu' ,'e'#5#0#0#0#0#0#0#0#0#0#0#0#0#14'TFloatSpinEdit'#7'MaxEdit'#4'Left'#3#0#3#6 +'Height'#2#21#3'Top'#2#6#5'Width'#2'R'#13'DecimalPlaces'#2#4#9'Increment'#5#0 +#0#0#0#0#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0#0#200#5'@'#8'MinValue'#5#0 +#0#0#0#0#0#0#0#0#0#8'TabOrder'#2#3#5'Value'#5#0#0#0#0#0#0#0#0#0#0#0#0#9'TTra' +'ckBar'#9'TrackBar1'#4'Left'#3'`'#3#6'Height'#2#29#3'Top'#2#4#5'Width'#3#204 +#0#8'OnChange'#7#15'TrackBar1Change'#8'Position'#2#0#8'TabOrder'#2#4#7'Visib' +'le'#8#0#0#0#10'TStatusBar'#10'StatusBar1'#4'Left'#2#0#6'Height'#2#20#3'Top' +#3#134#1#5'Width'#3'I'#4#6'Panels'#14#1#5'Width'#3#250#0#0#1#5'Width'#2'2'#0 +#0#11'SimplePanel'#8#0#0#9'TMainMenu'#9'MainMenu1'#4'left'#2#14#3'top'#2#5#0 +#9'TMenuItem'#9'MenuItem1'#7'Caption'#6#4'File'#0#9'TMenuItem'#8'OpenMenu'#7 +'Caption'#6#9'Open data'#8'ShortCut'#3'O@'#7'OnClick'#7#13'OpenDataClick'#0#0 +#9'TMenuItem'#7'FFTMenu'#7'Caption'#6#14'Power spectrum'#7'Visible'#8#7'OnCl' +'ick'#7#12'FFTitemClick'#0#0#9'TMenuItem'#8'SaveMenu'#7'Caption'#6#14'Save a' +'s bitmap'#7'OnClick'#7#15'SaveasEMF1Click'#0#0#9'TMenuItem'#13'Extract4Droi' +'s'#7'Caption'#6#25'Create resting state ROIs'#7'OnClick'#7#18'Extract4Drois' +'Click'#0#0#9'TMenuItem'#9'BatchMenu'#7'Caption'#6#18'Batch process data'#7 +'OnClick'#7#15'Batchdata1Click'#0#0#9'TMenuItem'#12'FSLBatchMenu'#7'Caption' +#6#17'FSL batch process'#7'OnClick'#7#14'FSLbatch1Click'#0#0#9'TMenuItem'#9 +'CloseMenu'#7'Caption'#6#12'Close window'#8'ShortCut'#3'W@'#7'OnClick'#7#17 +'Closewindow1Click'#0#0#0#9'TMenuItem'#5'Edit1'#7'Caption'#6#4'Edit'#0#9'TMe' +'nuItem'#8'CopyMenu'#7'Caption'#6#4'Copy'#7'OnClick'#7#10'Copy1Click'#0#0#0#0 +#22'TSelectDirectoryDialog'#22'SelectDirectoryDialog1'#4'left'#3#184#0#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/graphx.lfm0000664000175000017500000002323511425653036017653 0ustar michaelmichaelobject Graph4DForm: TGraph4DForm Left = 486 Height = 429 Top = 156 Width = 1097 ActiveControl = TREdit Caption = '4D Timeline Viewer' ClientHeight = 410 ClientWidth = 1097 Menu = MainMenu1 OnClose = FormClose OnCreate = FormCreate OnResize = FormResize OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object Image1: TImage Left = 0 Height = 354 Top = 36 Width = 1097 Align = alClient end object FourDBar: TPanel Left = 0 Height = 36 Top = 0 Width = 1097 Align = alTop BevelOuter = bvNone ClientHeight = 36 ClientWidth = 1097 TabOrder = 0 object OpenDataBtn: TSpeedButton Left = 11 Height = 25 Top = 7 Width = 95 Caption = 'Open Data' Color = clBtnFace NumGlyphs = 0 OnClick = OpenDataClick end object RefreshBtn: TSpeedButton Left = 112 Height = 30 Top = 4 Width = 30 Color = clBtnFace Glyph.Data = { D6080000424DD608000000000000360000002800000018000000170000000100 200000000000A008000064000000640000000000000000000000FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF2F0000 FF9C0000FFB90000FFCA0000FFBF0000FF0CFFFFFF00FFFFFF00FFFFFF000000 FF0DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF320000FFA40000FFF00000 FFFF0000FFFF0000FFBE0000FF190000FF160000FF6A0000FF990000FFC20000 FF69FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF000000FF630000FFE50000FFFF0000FFFF0000 FFFF0000FFE40000FF080000FF0F0000FFE00000FFFF0000FFFC0000FF61FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF010000FF880000FFF40000FFFF0000FFFF0000FFFF0000 FFFF0000FFEE0000FF18FFFFFF000000FF910000FFFF0000FFE60000FFF60000 FFA70000FF28FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF970000FFFE0000FFFF0000FFFF0000FFFF0000FFFF0000 FFCC0000FF60FFFFFF00FFFFFF000000FF180000FFE70000FF420000FF940000 FFF20000FFEA0000FF900000FF10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FF650000FFF80000FFFF0000FFFF0000FFFF0000FFDE0000FF7F0000 FF06FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FFA20000FF20FFFFFF000000 FF470000FFCB0000FFFF0000FFDA0000FF50FFFFFF00FFFFFF00FFFFFF000000 FF2F0000FFE20000FFFF0000FFFF0000FFFC0000FFA70000FF17FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF0F0000FF06FFFFFF00FFFF FF000000FF090000FFAB0000FFFF0000FFE40000FF42FFFFFF00FFFFFF000000 FFB60000FFFF0000FFFF0000FFEE0000FF7DFFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF0C0000FFC50000FFFF0000FFCE0000FF060000FF260000 FFF20000FFFF0000FFF50000FF66FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF000000FF2B0000FFE10000FFFF0000FF7A0000FF840000 FFFF0000FFFF0000FF87FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF000000FFAF0000FFFF0000FFA20000FFC30000 FFFF0000FFD70000FF03FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF000000FF8E0000FFFF0000FFB50000FFC90000 FFFF0000FF99FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF000000FF990000FFFF0000FFC90000FFB50000 FFFF0000FF8EFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF000000FF030000FFD70000FFFF0000FFC30000FFA20000 FFFF0000FFAFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF000000FF870000FFFF0000FFFF0000FF840000FF7A0000 FFFF0000FFE10000FF2BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF660000FFF50000FFFF0000FFF20000FF260000FF060000 FFCE0000FFFF0000FFC50000FF0CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF000000FF7D0000FFEE0000FFFF0000FFFF0000FFB6FFFFFF00FFFFFF000000 FF420000FFE40000FFFF0000FFAB0000FF09FFFFFF00FFFFFF000000FF060000 FF0FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF170000 FFA70000FFFC0000FFFF0000FFFF0000FFE20000FF2FFFFFFF00FFFFFF00FFFF FF000000FF500000FFDA0000FFFF0000FFCB0000FF47FFFFFF000000FF200000 FFA3FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF060000FF7F0000FFDE0000 FFFF0000FFFF0000FFFF0000FFF80000FF65FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF000000FF100000FF900000FFEA0000FFF20000FF940000FF420000 FFE70000FF18FFFFFF00FFFFFF000000FF600000FFCC0000FFFF0000FFFF0000 FFFF0000FFFF0000FFFE0000FF97FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF000000FF280000FFA70000FFF60000FFE60000 FFFF0000FF91FFFFFF000000FF180000FFEE0000FFFF0000FFFF0000FFFF0000 FFFF0000FFF40000FF880000FF01FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF610000FFFC0000 FFFF0000FFE00000FF0F0000FF080000FFE40000FFFF0000FFFF0000FFFF0000 FFE50000FF63FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF690000FFC20000FF990000 FF6A0000FF160000FF190000FFBE0000FFFF0000FFFF0000FFF00000FFA40000 FF32FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000 0040000007BE000000AB00000028FFFFFF000000FF0DFFFFFF00FFFFFF00FFFF FF000000FF0C0000FFBF0000FFCA0000FFB90000FF9C0000FF2FFFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } NumGlyphs = 0 OnClick = RefreshBtnClick OnMouseDown = RefreshBtnMouseDown end object TRLabel: TLabel Left = 152 Height = 14 Top = 15 Width = 41 Caption = 'TR (sec)' ParentColor = False end object PlotBtn: TSpeedButton Left = 488 Height = 25 Top = 7 Width = 63 Caption = 'Plot' Color = clBtnFace NumGlyphs = 0 OnClick = PSPlotClick end object TextBtn: TSpeedButton Left = 560 Height = 25 Top = 7 Width = 80 Caption = 'Text' Color = clBtnFace NumGlyphs = 0 OnClick = PSTextClick end object TREdit: TFloatSpinEdit Left = 240 Height = 21 Top = 9 Width = 82 DecimalPlaces = 4 Increment = 1 MaxValue = 100000000 MinValue = 0 TabOrder = 0 Value = 0 end object HSpeedDrop: TComboBox Left = 352 Height = 21 Top = 5 Width = 120 ItemHeight = 13 Items.Strings = ( 'To Fit' 'x1' 'x2' 'x3' 'x4' 'x5' 'x6' 'x7' 'x8' 'x9' 'x10' ) OnChange = TrackBar1Change Style = csDropDownList TabOrder = 1 end object MinEdit: TFloatSpinEdit Left = 656 Height = 21 Top = 6 Width = 82 DecimalPlaces = 4 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 2 Value = 0 end object MaxEdit: TFloatSpinEdit Left = 768 Height = 21 Top = 6 Width = 82 DecimalPlaces = 4 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 3 Value = 0 end object TrackBar1: TTrackBar Left = 864 Height = 29 Top = 4 Width = 204 OnChange = TrackBar1Change Position = 0 TabOrder = 4 Visible = False end end object StatusBar1: TStatusBar Left = 0 Height = 20 Top = 390 Width = 1097 Panels = < item Width = 250 end item Width = 50 end> SimplePanel = False end object MainMenu1: TMainMenu left = 14 top = 5 object MenuItem1: TMenuItem Caption = 'File' object OpenMenu: TMenuItem Caption = 'Open data' ShortCut = 16463 OnClick = OpenDataClick end object FFTMenu: TMenuItem Caption = 'Power spectrum' Visible = False OnClick = FFTitemClick end object SaveMenu: TMenuItem Caption = 'Save as bitmap' OnClick = SaveasEMF1Click end object Extract4Drois: TMenuItem Caption = 'Create resting state ROIs' OnClick = Extract4DroisClick end object BatchMenu: TMenuItem Caption = 'Batch process data' OnClick = Batchdata1Click end object FSLBatchMenu: TMenuItem Caption = 'FSL batch process' OnClick = FSLbatch1Click end object CloseMenu: TMenuItem Caption = 'Close window' ShortCut = 16471 OnClick = Closewindow1Click end end object Edit1: TMenuItem Caption = 'Edit' object CopyMenu: TMenuItem Caption = 'Copy' OnClick = Copy1Click end end end object SelectDirectoryDialog1: TSelectDirectoryDialog left = 184 end end mricron-0.20120505.1~dfsg.1.orig/fx8.pas0000664000175000017500000005305711326434466017105 0ustar michaelmichaelunit fx8; {$DEFINE VFLIP} {$mode objfpc}{$H+} interface uses SysUtils, define_types, Classes,dialogs{, Graphics, Controls, Forms, Dialogs,Menus,ComCtrls, ExtCtrls}; type Tfx8 = RECORD Width,Height,X,Y,PenThick: integer; Img: Bytep; end; procedure CreateFX8(var lFX8: Tfx8); procedure DefineFX8(var lFX8: Tfx8; lWid,lHt: integer); procedure DefineBuffFX8(var lFX8: Tfx8; lWid,lHt: integer; lBuff: ByteP); procedure CopyFX8(var lFX8src, lFX8dest: Tfx8); procedure RectangleFX8(var lFX8: Tfx8; lLin,lTin,lRin,lBin: integer; lClr: byte); procedure FillRectFX8(var lFX8: Tfx8; lLin,lTin,lRin,lBin: integer; lClr: byte); procedure EllipseFX8(var lFX8: Tfx8; lLin,lTin,lRin,lBin: integer; lClr: byte); procedure FillEllipseFX8(var lFX8: Tfx8; lLin,lTin,lRin,lBin: integer; lClr: byte); procedure MoveToFX8(var lFX8: Tfx8; lXin,lYin: integer); procedure LineToFX8(var lFX8: Tfx8; lXin,lYin: integer; lClr: byte); overload; procedure LineToFX8(var lFX8: Tfx8; lXin,lYin: integer; lClr, lLineThick: byte); overload; procedure FloodFillFX8 (var lFX8: Tfx8; lXin, lYin: Integer; lBoundClr,lWriteClr: byte; lfsSurface: boolean); procedure FreeFX8(var lFX8: Tfx8); implementation procedure sortLTRB(var lXoutLow,lYOutLow,lXoutHi,lYOutHi: integer); //left lFX8.width then lX := lFX8.width; if lY < 1 then lY := 1; if lY > lFX8.height then lY := lFX8.height; end; procedure boundrect(var lL,lT,lR,lB: integer; var lFX8: TFX8); begin sortLTRB(lL,lT,lR,lB); bound(lL,lT,lFX8); bound(lR,lB,lFX8); end; procedure MoveToFX8(var lFX8: Tfx8; lXin,lYin: integer); var lX,lY: integer; begin {$IFDEF VFLIP} lX := lXin+1; {$IFDEF UNIX} lX := lX+1; {$ENDIF} lY := lFX8.Height- lYin; {$ELSE} lX := lXin; lY := lYin; {$ENDIF} bound(lX,lY,lFX8); lFX8.X := lX; lFX8.Y := lY; end; procedure HorLine(var lFX8: Tfx8; x1,x2,y: integer; lClr: byte); var x,lStart: integer; begin if lFX8.img = nil then exit; //not defined lStart := (y -1)* lFX8.Width; if x1 < x2 then begin for x := x1 to x2 do lFX8.Img^[lStart+x] := lClr; end else for x := x2 to x1 do lFX8.Img^[lStart+x] := lClr; end; function getpixel(var lFX8: Tfx8; x,y: integer): byte; begin result := lFX8.Img^[(Y -1)* lFX8.Width+x]; end; procedure putpixel(var lFX8: Tfx8; x,y: integer; lClr: byte); begin if (x < 1) or (y < 1) or (x > lFX8.width) or (y > lFX8.height) then exit; //putwidepixel and puttallpixel can have x < 1, x > width, etc... lFX8.Img^[(Y -1)* lFX8.Width+x] := lClr; end; procedure putwidepixel(var lFX8: Tfx8; x,y: integer; lClr, lLineThick: byte); var lBar: integer; begin putpixel(lFX8,x,y,lClr); if lLineThick < 2 then exit; for lBar := 1 to ((lLineThick-1) div 2) do begin putpixel(lFX8,x-lBar,y,lClr); putpixel(lFX8,x+lBar,y,lClr); end; end; procedure puttallpixel(var lFX8: Tfx8; x,y: integer; lClr, lLineThick: byte); var lBar: integer; begin putpixel(lFX8,x,y,lClr); if lLineThick < 2 then exit; for lBar := 1 to ((lLineThick-1) div 2) do begin putpixel(lFX8,x,y-lBar,lClr); putpixel(lFX8,x,y+lBar,lClr); end; end; procedure LineToFX8(var lFX8: Tfx8; lXin,lYin: integer; lClr, lLineThick: byte) ; overload; var lSlope: single; lX2,lY2,lX1,lY1,lP,lCol,lStart,lX,lY: integer; begin lX1 := lFX8.X; lY1 := lFX8.Y; //Bound(lX1,lY1,lFX8); {$IFDEF VFLIP} lX2 := lXin+1; {$IFDEF UNIX} lX2 := lX2+1; {$ENDIF} ; lY2 := lFX8.Height- lYin; {$ELSE} lX2 := lXin; lY2 := lYin; {$ENDIF} Bound(lX2,lY2,lFX8); lFX8.X := lX2; lFX8.Y := lY2; //next: endpoints - required if no line lFX8.Img^[(lY1 -1)* lFX8.Width+lX1] := lClr; lFX8.Img^[(lY2 -1)* lFX8.Width+lX2] := lClr; if (lX1 = lX2) and (lY1 = lY2) then exit; if abs(lY1-lY2) > abs(lX1-lX2) then begin //mostly vertical if lY1 > lY2 then begin lSlope := (lX1-lX2) /(lY1-lY2); for lY := lY2 to lY1 do putwidepixel(lFX8,lX2+round(lSlope*(lY-lY2)),lY, lClr, lLineThick); //lFX8.Img^[((lY -1)* lFX8.Width)+lX2+round(lSlope*(lY-lY2))] := lClr; end else begin lSlope := (lX2-lX1) /(lY2-lY1); for lY := lY1 to lY2 do putwidepixel(lFX8,lX1+round(lSlope*(lY-lY1)),lY, lClr, lLineThick); //lFX8.Img^[((lY -1)* lFX8.Width)+lX1+round(lSlope*(lY-lY1))] := lClr; end; end else begin //mostly horizontal - primary change in X if lX1 > lX2 then begin lSlope := (lY1-lY2) /(lX1-lX2); for lX := lX2 to lX1 do puttallpixel(lFX8,lX,lY2+round(lSlope*(lX-lX2) ) , lClr, lLineThick); //lFX8.Img^[((lY2+round(lSlope*(lX-lX2) ) -1)* lFX8.Width)+lX] := lClr; end else begin lSlope := (lY2-lY1) /(lX2-lX1); for lX := lX1 to lX2 do puttallpixel(lFX8,lX,lY1+round(lSlope*(lX-lX1) ) , lClr, lLineThick); //lFX8.Img^[((lY1+round(lSlope*(lX-lX1) ) -1)* lFX8.Width)+lX] := lClr; end; end; end; //for speed: lSingle could use integer math (*var lSlope: single; lX2,lY2,lX1,lY1,lP,lCol,lStart,lX,lY: integer; begin {$IFDEF VFLIP} lX2 := lXin+1; lY2 := lFX8.Height- lYin; {$ELSE} lX2 := lXin; lY2 := lYin; {$ENDIF} Bound(lX2,lY2,lFX8); lFX8.X := lX2; lFX8.Y := lY2; //next: endpoints - required if no line lFX8.Img^[(lY1 -1)* lFX8.Width+lX1] := lClr; lFX8.Img^[(lY2 -1)* lFX8.Width+lX2] := lClr; if (lX1 = lX2) and (lY1 = lY2) then exit; exit; if abs(lY1-lY2) > abs(lX1-lX2) then begin //mostly vertical if lY1 > lY2 then begin lSlope := (lX1-lX2) /(lY1-lY2); for lY := lY2 to lY1 do putwidepixel(lFX8,lX2+round(lSlope*(lY-lY2)),lY, lClr, lLineThick); end else begin lSlope := (lX2-lX1) /(lY2-lY1); for lY := lY1 to lY2 do putwidepixel(lFX8,lX1+round(lSlope*(lY-lY1)),lY, lClr, lLineThick); //lFX8.Img^[((lY -1)* lFX8.Width)+lX1+round(lSlope*(lY-lY1))] := lClr; end; end else begin //mostly horizontal - primary change in X if lX1 > lX2 then begin lSlope := (lY1-lY2) /(lX1-lX2); for lX := lX2 to lX1 do puttallpixel(lFX8,lX,lY2+round(lSlope*(lX-lX2) ) , lClr, lLineThick); //lFX8.Img^[((lY2+round(lSlope*(lX-lX2) ) -1)* lFX8.Width)+lX] := lClr; end else begin lSlope := (lY2-lY1) /(lX2-lX1); for lX := lX1 to lX2 do puttallpixel(lFX8,lX,lY1+round(lSlope*(lX-lX1) ) , lClr, lLineThick); //lFX8.Img^[((lY1+round(lSlope*(lX-lX1) ) -1)* lFX8.Width)+lX] := lClr; end; end; end;*) procedure LineToFX8(var lFX8: Tfx8; lXin,lYin: integer; lClr: byte); overload; //for speed: lSingle could use integer math var lSlope: single; lX2,lY2,lX1,lY1,lP,lCol,lStart,lX,lY: integer; begin if lFX8.PenThick > 2 then begin LineToFX8(lFX8,lXin,lYin, lClr,lFX8.PenThick); exit; end; lX1 := lFX8.X; lY1 := lFX8.Y; //Bound(lX1,lY1,lFX8); {$IFDEF VFLIP} lX2 := lXin+1; {$IFDEF UNIX} lX2 := lX2+1; {$ENDIF} lY2 := lFX8.Height- lYin; {$ELSE} lX2 := lXin; lY2 := lYin; {$ENDIF} Bound(lX2,lY2,lFX8); lFX8.X := lX2; lFX8.Y := lY2; //next: endpoints - required if no line lFX8.Img^[(lY1 -1)* lFX8.Width+lX1] := lClr; lFX8.Img^[(lY2 -1)* lFX8.Width+lX2] := lClr; if (lX1 = lX2) and (lY1 = lY2) then exit; if abs(lY1-lY2) > abs(lX1-lX2) then begin //mostly vertical if lY1 > lY2 then begin lSlope := (lX1-lX2) /(lY1-lY2); for lY := lY2 to lY1 do lFX8.Img^[((lY -1)* lFX8.Width)+lX2+round(lSlope*(lY-lY2))] := lClr; end else begin lSlope := (lX2-lX1) /(lY2-lY1); for lY := lY1 to lY2 do lFX8.Img^[((lY -1)* lFX8.Width)+lX1+round(lSlope*(lY-lY1))] := lClr; end; end else begin //mostly horizontal - primary change in X if lX1 > lX2 then begin lSlope := (lY1-lY2) /(lX1-lX2); for lX := lX2 to lX1 do lFX8.Img^[((lY2+round(lSlope*(lX-lX2) ) -1)* lFX8.Width)+lX] := lClr; end else begin lSlope := (lY2-lY1) /(lX2-lX1); for lX := lX1 to lX2 do lFX8.Img^[((lY1+round(lSlope*(lX-lX1) ) -1)* lFX8.Width)+lX] := lClr; end; end; end; Procedure FillEllipseDefault(var lFX8: Tfx8; X,Y: smallint;XRadius: word; YRadius:word; lClr: byte); Const ConvFac = Pi/180.0; var j, Delta, DeltaEnd: single; NumOfPixels: longint; TempTerm: single; xtemp, ytemp, xp, yp, xm, ym, xnext, ynext, plxpyp, plxmyp, plxpym, plxmym: smallint; BackupColor, TmpAngle, OldLineWidth: word; Begin If xradius = 0 then inc(xradius); if yradius = 0 then inc(yradius); { check for an ellipse with negligable x and y radius } If (xradius <= 1) and (yradius <= 1) then begin putpixel(lFX8, x,y, lClr); exit; end; { approximate the number of pixels required by using the circumference } { equation of an ellipse. } { Changed this formula a it (trial and error), but the net result is that } { less pixels have to be calculated now } NumOfPixels:=Round(Sqrt(3)*sqrt(sqr(XRadius)+sqr(YRadius))); { Calculate the angle precision required } Delta := 90.0 / NumOfPixels; { for restoring after PatternLine } { removed from inner loop to make faster } { Always just go over the first 90 degrees. Could be optimized a } { bit if StAngle and EndAngle lie in the same quadrant, left as an } { exercise for the reader :) (JM) } j := 0; { calculate stop position, go 1 further than 90 because otherwise } { 1 pixel is sometimes not drawn (JM) } DeltaEnd := 91; { Calculate points } xnext := XRadius; ynext := 0; Repeat xtemp := xnext; ytemp := ynext; { this is used by both sin and cos } TempTerm := (j+Delta)*ConvFac; { Calculate points } xnext := round(XRadius*Cos(TempTerm)); ynext := round(YRadius*Sin(TempTerm+Pi)); xp := x + xtemp; xm := x - xtemp; yp := y + ytemp; ym := y - ytemp; plxpyp := maxsmallint; plxmyp := -maxsmallint-1; plxpym := maxsmallint; plxmym := -maxsmallint-1; plxpyp := xp; PutPixel(lFX8,xp,yp,lClr); plxmyp := xm; PutPixel(lFX8,xm,yp,lClr); plxmym := xm; PutPixel(lFX8,xm,ym,lClr); plxpym := xp; PutPixel(lFX8,xp,ym,lClr); If (ynext <> ytemp) and (xp - xm >= 1) then begin //CurrentColor := FillSettings.Color; HorLine(lFX8,plxmyp+1,plxpyp-1,yp,lClr); HorLine(lFX8,plxmym+1,plxpym-1,ym,lClr); //CurrentColor := BackupColor;*) end; j:=j+Delta; Until j > (DeltaEnd); end; Procedure EllipseDefault(var lFX8: Tfx8; X,Y: smallint;XRadius: word; YRadius:word; lClr: byte); Const ConvFac = Pi/180.0; var j, Delta, DeltaEnd: single; NumOfPixels: longint; TempTerm: single; xtemp, ytemp, xp, yp, xm, ym, xnext, ynext, plxpyp, plxmyp, plxpym, plxmym: smallint; BackupColor, TmpAngle, OldLineWidth: word; Begin If xradius = 0 then inc(xradius); if yradius = 0 then inc(yradius); { check for an ellipse with negligable x and y radius } If (xradius <= 1) and (yradius <= 1) then begin putpixel(lFX8, x,y, lClr); exit; end; { approximate the number of pixels required by using the circumference } { equation of an ellipse. } { Changed this formula a it (trial and error), but the net result is that } { less pixels have to be calculated now } NumOfPixels:=Round(Sqrt(3)*sqrt(sqr(XRadius)+sqr(YRadius))); { Calculate the angle precision required } Delta := 90.0 / NumOfPixels; { for restoring after PatternLine } { removed from inner loop to make faster } { Always just go over the first 90 degrees. Could be optimized a } { bit if StAngle and EndAngle lie in the same quadrant, left as an } { exercise for the reader :) (JM) } j := 0; { calculate stop position, go 1 further than 90 because otherwise } { 1 pixel is sometimes not drawn (JM) } DeltaEnd := 91; { Calculate points } xnext := XRadius; ynext := 0; Repeat xtemp := xnext; ytemp := ynext; { this is used by both sin and cos } TempTerm := (j+Delta)*ConvFac; { Calculate points } xnext := round(XRadius*Cos(TempTerm)); ynext := round(YRadius*Sin(TempTerm+Pi)); xp := x + xtemp; xm := x - xtemp; yp := y + ytemp; ym := y - ytemp; PutPixel(lFX8,xp,yp,lClr); PutPixel(lFX8,xm,yp,lClr); PutPixel(lFX8,xm,ym,lClr); PutPixel(lFX8,xp,ym,lClr); j:=j+Delta; Until j > (DeltaEnd); end; procedure EllipseFX8(var lFX8: Tfx8; lLin,lTin,lRin,lBin: integer; lClr: byte); var lL,lT,lR,lB,lP,lStart: integer; begin if lFX8.img = nil then exit; //not defined {$IFDEF VFLIP} lL := lLIn+1; lR := lRin+1; {$IFDEF UNIX} lL := lL+1;lR := lR+1; {$ENDIF} lT := lFX8.Height- lTin; lB := lFX8.Height- lBin; {$ELSE} lL := lLIn; lR := lRin; lT := lTin; lB := lBin; {$ENDIF} BoundRect(lL,lT,lR,lB,lFX8); EllipseDefault(lFX8, (lL+lR) shr 1,(lT+lB) shr 1, (lR-lL) shr 1, (lB-lT) shr 1,lClr); end; procedure FillEllipseFX8(var lFX8: Tfx8; lLin,lTin,lRin,lBin: integer; lClr: byte); var lL,lT,lR,lB,lP,lStart: integer; begin if lFX8.img = nil then exit; //not defined {$IFDEF VFLIP} lL := lLIn+1; lR := lRin+1; {$IFDEF UNIX} lL := lL+1;lR := lR+1; {$ENDIF} lT := lFX8.Height- lTin; lB := lFX8.Height- lBin; {$ELSE} lL := lLIn; lR := lRin; lT := lTin; lB := lBin; {$ENDIF} BoundRect(lL,lT,lR,lB,lFX8); FillEllipseDefault(lFX8, (lL+lR) shr 1,(lT+lB) shr 1, (lR-lL) shr 1, (lB-lT) shr 1,lClr); end; procedure RectangleFX8(var lFX8: Tfx8; lLin,lTin,lRin,lBin: integer; lClr: byte); var lL,lT,lR,lB,lP,lStart: integer; begin if lFX8.img = nil then exit; //not defined {$IFDEF VFLIP} lL := lLIn+1; lR := lRin+1; {$IFDEF UNIX} lL := lL+1;lR := lR+1; {$ENDIF} lT := lFX8.Height- lTin; lB := lFX8.Height- lBin; {$ELSE} lL := lLIn; lR := lRin; lT := lTin; lB := lBin; {$ENDIF} BoundRect(lL,lT,lR,lB,lFX8); //top line lStart := (lT -1)* lFX8.Width; for lP := lL to lR do lFX8.Img^[lStart+lP] := lClr; //bottom line lStart := (lB -1)* lFX8.Width; for lP := lL to lR do lFX8.Img^[lStart+lP] := lClr; //left and right lines lStart := (lT -1)* lFX8.Width; for lP := lT to lB do begin lFX8.Img^[lStart+lL] := lClr; lFX8.Img^[lStart+lR] := lClr; lStart := lStart + lFX8.Width; end; end; procedure FillRectFX8(var lFX8: Tfx8; lLin,lTin,lRin,lBin: integer; lClr: byte); var lL,lT,lR,lB,lRow,lCol,lStart: integer; begin if lFX8.img = nil then exit; //not defined {$IFDEF VFLIP} lL := lLIn+1; lR := lRin+1; {$IFDEF UNIX} lL := lL+1;lR := lR+1; {$ENDIF} lT := lFX8.Height- lTin; lB := lFX8.Height- lBin; {$ELSE} lL := lLIn; lR := lRin; lT := lTin; lB := lBin; {$ENDIF} BoundRect(lL,lT,lR,lB,lFX8); lStart := (lT -1)* lFX8.Width; for lRow := lT to lB do begin for lCol := lL to lR do lFX8.Img^[lStart+lCol] := lClr; lStart := lStart + lFX8.Width; end; end; procedure DefineFX8(var lFX8: Tfx8; lWid,lHt: integer); begin if (lFX8.img = nil) or (lWid <> lFX8.Width) or (lHt <> lFX8.Height) then begin if lFX8.img <> nil then freemem(lFX8.Img); Getmem(lFX8.img, lWid*lHt); lFX8.Height := lHt; lFX8.Width := lWid; end; fillchar(lFX8.Img^,lWid*lHt,0); lFX8.X := 1; lFX8.Y := 1; end; procedure DefineBuffFX8(var lFX8: Tfx8; lWid,lHt: integer; lBuff: ByteP); begin if lBuff = nil then exit; DefineFX8(lFX8, lWid,lHt); Move(lBuff^,lFX8.Img^,lWid*lHt); end; procedure CopyFX8(var lFX8src, lFX8dest: Tfx8); begin if (lFX8src.Img = nil) then exit; DefineFX8(lFX8dest, lFX8src.Width,lFX8src.Height); Move(lFX8src.Img^,lFX8dest.Img^,lFX8src.Width*lFX8src.Height); end; procedure FloodFillFX8 (var lFX8: Tfx8; lXin, lYin: Integer; lBoundClr,lWriteClr: byte; lfsSurface: boolean); //Written by Chris Rorden //A simple first-in-first-out circular buffer (the queue) for flood-filling contiguous voxels. //This algorithm avoids stack problems associated simple recursive algorithms //http://steve.hollasch.net/cgindex/polygons/floodfill.html const kFill = 0; //pixels we will want to flood fill kFillable = 128; //voxels we might flood fill kUnfillable = 255; //voxels we can not flood fill var lWid,lHt,lQSz,lQHead,lQTail: integer; lQRA: LongIntP; lMaskRA: ByteP; procedure IncQra(var lVal, lQSz: integer);//nested inside FloodFill begin inc(lVal); if lVal >= lQSz then lVal := 1; end; //nested Proc IncQra function Pos2XY (lPos: integer): TPoint; begin result.X := ((lPos-1) mod lWid)+1; //horizontal position result.Y := ((lPos-1) div lWid)+1; //vertical position end; //nested Proc Pos2XY procedure TestPixel(lPos: integer); begin if (lMaskRA^[lPos]=kFillable) then begin lMaskRA^[lPos] := kFill; lQra^[lQHead] := lPos; incQra(lQHead,lQSz); end; end; //nested Proc TestPixel procedure RetirePixel; //nested inside FloodFill var lVal: integer; lXY : TPoint; begin lVal := lQra^[lQTail]; lXY := Pos2XY(lVal); if lXY.Y > 1 then TestPixel (lVal-lWid);//pixel above if lXY.Y < lHt then TestPixel (lVal+lWid);//pixel below if lXY.X > 1 then TestPixel (lVal-1); //pixel to left if lXY.X < lWid then TestPixel (lVal+1); //pixel to right incQra(lQTail,lQSz); //done with this pixel end; //nested proc RetirePixel var lTargetColorVal,lDefaultVal: byte; lX,lY,lPos,x,y: integer; begin //FloodFill {$IFDEF VFLIP} x := lxin+1; {$IFDEF UNIX} lx := lx+1; {$ENDIF} y := lFX8.Height- lyin; {$ELSE} x := lxin; y := lyin; {$ENDIF} if lfsSurface then begin if getpixel(lFX8, x,y) <> lBoundClr then exit; lTargetColorVal := kFillable; lDefaultVal := kUnfillable; end else begin //fsBorder //fill non-target color with brush - bounded by target-color if getpixel(lFX8, x,y) = lBoundClr then exit; lTargetColorVal := kUnfillable; lDefaultVal := kFillable; end; lHt := lFX8.Height; lWid := lFX8.Width; lQSz := lHt * lWid; //Qsz should be more than the most possible simultaneously active pixels //Worst case scenario is a click at the center of a 3x3 image: all 9 pixels will be active simultaneously //for larger images, only a tiny fraction of pixels will be active at one instance. //perhaps lQSz = ((lHt*lWid) div 4) + 32; would be safe and more memory efficient if (lHt < 1) or (lWid < 1) then exit; getmem(lQra,lQSz*sizeof(longint)); //very wasteful - getmem(lMaskRA,lHt*lWid*sizeof(byte)); for lPos := 1 to (lHt*lWid) do if lFX8.Img^[lPos] = lBoundClr then lMaskRA^[lPos] := lTargetColorVal //assume all voxels are non targets else lMaskRA^[lPos] := lDefaultVal; //assume all voxels are non targets lQHead := 2; lQTail := 1; lQra^[lQTail] := ((Y * lWid)+X+1); //NOTE: both X and Y start from 0 not 1 lMaskRA^[lQra^[lQTail]] := kFill; RetirePixel; {for lPos := 1 to 100 do RetirePixel;} while lQHead <> lQTail do RetirePixel; lPos := 0; for lY := 0 to (lHt-1) do for lX := 0 to (lWid-1) do begin lPos := lPos + 1; if lMaskRA^[lPos] = kFill then lFX8.Img^[lPos] := lWriteClr; end; freemem(lMaskRA); freemem(lQra); end;// proc FloodFill procedure CreateFX8(var lFX8: Tfx8); begin lFX8.Img := nil; end; procedure FreeFX8(var lFX8: Tfx8); begin if lFX8.Img <> nil then Freemem(lFX8.Img); lFX8.Img := nil; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/0000775000175000017500000000000011751725164017140 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/uwoolf.pas0000664000175000017500000000554211326434466021166 0ustar michaelmichael{ ****************************************************************** Woolf test ****************************************************************** } unit uwoolf; interface uses utypes; procedure Woolf_Conform(N_cls : Integer; N_estim : Integer; Obs : PIntVector; Calc : PVector; var G : Float; var DoF : Integer); { ------------------------------------------------------------------ Woolf test for conformity ------------------------------------------------------------------ } procedure Woolf_Indep(N_lin : Integer; N_col : Integer; Obs : PIntMatrix; var G : Float; var DoF : Integer); { ------------------------------------------------------------------ Woolf test for independence ------------------------------------------------------------------ } implementation procedure Woolf_Conform(N_cls : Integer; N_estim : Integer; Obs : PIntVector; Calc : PVector; var G : Float; var DoF : Integer); var I : Integer; begin for I := 1 to N_cls do if (Obs^[I] <= 0) or (Calc^[I] <= 0.0) then begin SetErrCode(FSing); Exit end; SetErrCode(FOk); G := 0.0; for I := 1 to N_cls do G := G + Obs^[I] * Ln(Obs^[I] / Calc^[I]); G := 2.0 * G; DoF := N_cls - N_estim - 1; end; procedure Woolf_Indep(N_lin : Integer; N_col : Integer; Obs : PIntMatrix; var G : Float; var DoF : Integer); var SumLin, SumCol : PIntVector; Sum : Integer; Prob, Calc : Float; I, J : Integer; begin for I := 1 to N_lin do for J := 1 to N_col do if Obs^[I]^[J] <= 0 then begin SetErrCode(FSing); Exit end; SetErrCode(FOk); DimIntVector(SumLin, N_lin); DimIntVector(SumCol, N_col); for I := 1 to N_lin do for J := 1 to N_col do SumLin^[I] := SumLin^[I] + Obs^[I]^[J]; for J := 1 to N_col do for I := 1 to N_lin do SumCol^[J] := SumCol^[J] + Obs^[I]^[J]; Sum := 0; for I := 1 to N_lin do Sum := Sum + SumLin^[I]; G := 0.0; for I := 1 to N_lin do begin Prob := SumLin^[I] / Sum; for J := 1 to N_col do begin Calc := SumCol^[J] * Prob; G := G + Obs^[I]^[J] * Ln(Obs^[I]^[J] / Calc); end; end; G := 2.0 * G; DoF := Pred(N_lin) * Pred(N_col); DelIntVector(SumLin, N_lin); DelIntVector(SumCol, N_col); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uwinplot.pas0000664000175000017500000011675111326434466021541 0ustar michaelmichael{ ****************************************************************** Plotting routines for Delphi ****************************************************************** } unit uwinplot; interface uses Classes, Graphics, utypes, umath, uround, uinterv, ustrings; function InitGraphics(Canvas : TCanvas; Width, Height : Integer) : Boolean; { ------------------------------------------------------------------ Enters graphic mode. ------------------------------------------------------------------ The parameters Width and Height refer to the object on which the graphic is plotted. Examples: To draw on a TImage object: InitGraph(Image1.Canvas, Image1.Width, Image1.Height) To print the graphic: InitGraph(Printer.Canvas, Printer.PageWidth, Printer.PageHeight) ------------------------------------------------------------------ } procedure SetWindow(Canvas : TCanvas; X1, X2, Y1, Y2 : Integer; GraphBorder : Boolean); { ------------------------------------------------------------------ Sets the graphic window X1, X2, Y1, Y2 : Window coordinates in % of maximum GraphBorder : Flag for drawing the window border ------------------------------------------------------------------ } procedure AutoScale(X : PVector; Lb, Ub : Integer; Scale : TScale; var XMin, XMax, XStep : Float); { ------------------------------------------------------------------ Finds an appropriate scale for plotting the data in X[Lb..Ub] ------------------------------------------------------------------ } procedure SetOxScale(Scale : TScale; OxMin, OxMax, OxStep : Float); { ------------------------------------------------------------------ Sets the scale on the Ox axis ------------------------------------------------------------------ } procedure SetOyScale(Scale : TScale; OyMin, OyMax, OyStep : Float); { ------------------------------------------------------------------ Sets the scale on the Oy axis ------------------------------------------------------------------ } procedure SetGraphTitle(Title : String); { ------------------------------------------------------------------ Sets the title for the graph ------------------------------------------------------------------ } procedure SetOxTitle(Title : String); { ------------------------------------------------------------------ Sets the title for the Ox axis ------------------------------------------------------------------ } procedure SetOyTitle(Title : String); { ------------------------------------------------------------------ Sets the title for the Oy axis ------------------------------------------------------------------ } procedure PlotOxAxis(Canvas : TCanvas); { ------------------------------------------------------------------ Plots the horizontal axis ------------------------------------------------------------------ } procedure PlotOyAxis(Canvas : TCanvas); { ------------------------------------------------------------------ Plots the vertical axis ------------------------------------------------------------------ } procedure PlotGrid(Canvas : TCanvas; Grid : TGrid); { ------------------------------------------------------------------ Plots a grid on the graph ------------------------------------------------------------------ } procedure WriteGraphTitle(Canvas : TCanvas); { ------------------------------------------------------------------ Writes the title of the graph ------------------------------------------------------------------ } procedure SetMaxCurv(NCurv : Byte); { ------------------------------------------------------------------ Sets the maximum number of curves and re-initializes their parameters ------------------------------------------------------------------ } procedure SetPointParam(CurvIndex, Symbol, Size : Integer; Color : TColor); { ------------------------------------------------------------------ Sets the point parameters for curve # CurvIndex ------------------------------------------------------------------ } procedure SetLineParam(CurvIndex : Integer; Style : TPenStyle; Width : Integer; Color : TColor); { ------------------------------------------------------------------ Sets the line parameters for curve # CurvIndex ------------------------------------------------------------------ } procedure SetCurvLegend(CurvIndex : Integer; Legend : String); { ------------------------------------------------------------------ Sets the legend for curve # CurvIndex ------------------------------------------------------------------ } procedure SetCurvStep(CurvIndex, Step : Integer); { ------------------------------------------------------------------ Sets the step for curve # CurvIndex ------------------------------------------------------------------ } procedure PlotPoint(Canvas : TCanvas; X, Y : Float; CurvIndex : Integer); { ------------------------------------------------------------------ Plots a point on the screen ------------------------------------------------------------------ Input parameters : X, Y = point coordinates CurvIndex = index of curve parameters (Symbol, Size, Color) ------------------------------------------------------------------ } procedure PlotCurve(Canvas : TCanvas; X, Y : PVector; Lb, Ub, CurvIndex : Integer); { ------------------------------------------------------------------ Plots a curve ------------------------------------------------------------------ Input parameters : X, Y = point coordinates Lb, Ub = indices of first and last points CurvIndex = index of curve parameters ------------------------------------------------------------------ } procedure PlotCurveWithErrorBars(Canvas : TCanvas; X, Y, S : PVector; Ns, Lb, Ub, CurvIndex : Integer); { ------------------------------------------------------------------ Plots a curve with error bars ------------------------------------------------------------------ Input parameters : X, Y = point coordinates S = errors Ns = number of SD to be plotted Lb, Ub = indices of first and last points CurvIndex = index of curve parameters ------------------------------------------------------------------ } procedure PlotFunc(Canvas : TCanvas; Func : TFunc; Xmin, Xmax : Float; Npt, CurvIndex : Integer); { ------------------------------------------------------------------ Plots a function ------------------------------------------------------------------ Input parameters: Func = function to be plotted Xmin, Xmax = abscissae of 1st and last point to plot Npt = number of points CurvIndex = index of curve parameters (Width, Style, Color) ------------------------------------------------------------------ The function must be programmed as : function Func(X : Float) : Float; ------------------------------------------------------------------ } procedure WriteLegend(Canvas : TCanvas; NCurv : Integer; ShowPoints, ShowLines : Boolean); { ------------------------------------------------------------------ Writes the legends for the plotted curves ------------------------------------------------------------------ NCurv : number of curves (1 to MaxCurv) ShowPoints : for displaying points ShowLines : for displaying lines ------------------------------------------------------------------ } procedure ConRec(Canvas : TCanvas; Nx, Ny, Nc : Integer; X, Y, Z : PVector; F : PMatrix); { ------------------------------------------------------------------ Contour plot Adapted from Paul Bourke, Byte, June 1987 http://astronomy.swin.edu.au/~pbourke/projection/conrec/ ------------------------------------------------------------------ Input parameters: Nx, Ny = number of steps on Ox and Oy Nc = number of contour levels X[0..Nx], Y[0..Ny] = point coordinates in pixels Z[0..(Nc - 1)] = contour levels in increasing order F[0..Nx, 0..Ny] = function values, such that F[I,J] is the function value at (X[I], Y[I]) ------------------------------------------------------------------ } function Xpixel(X : Float) : Integer; { ------------------------------------------------------------------ Converts user abscissa X to screen coordinate ------------------------------------------------------------------ } function Ypixel(Y : Float) : Integer; { ------------------------------------------------------------------ Converts user ordinate Y to screen coordinate ------------------------------------------------------------------ } function Xuser(X : Integer) : Float; { ------------------------------------------------------------------ Converts screen coordinate X to user abscissa ------------------------------------------------------------------ } function Yuser(Y : Integer) : Float; { ------------------------------------------------------------------ Converts screen coordinate Y to user ordinate ------------------------------------------------------------------ } procedure LeaveGraphics; { ------------------------------------------------------------------ Quits graphic mode ------------------------------------------------------------------ } implementation const MaxSymbol = 9; { Max. number of symbols for plotting curves } MaxCurvColor = 9; { Max. number of colors for curves } Eps = 1.0E-10; { Lower limit for an axis label } MaxColor = $02FFFFFF; { Max. color value for Delphi } const CurvColor : array[1..MaxCurvColor] of TColor = (clRed, clGreen, clBlue, clFuchsia, clAqua, clLime, clNavy, clOlive, clPurple); type TAxis = record { Coordinate axis } Scale : TScale; Min : Float; Max : Float; Step : Float; end; TPointParam = record { Point parameters } Symbol : Integer; { Symbol: 0: point (.) } Size : Integer; { 1: solid circle 2: open circle } Color : TColor; { 3: solid square 4: open square } end; { 5: solid triangle 6: open triangle } { 7: plus (+) 8: multiply (x) } { 9: star (* ) } TLineParam = record { Line parameters } Style : TPenStyle; Width : Integer; Color : TColor; end; TCurvParam = record { Curve parameters } PointParam : TPointParam; LineParam : TLineParam; Legend : Str30; { Legend of curve } Step : Integer; { Plot 1 point every Step points } end; TCurvParamVector = array[1..255] of TCurvParam; PCurvParamVector = ^TCurvParamVector; var Xwin1, Xwin2, Ywin1, Ywin2 : Integer; XminPixel, XmaxPixel : Integer; YminPixel, YmaxPixel : Integer; FactX, FactY : Float; XAxis, YAxis : TAxis; GraphTitle, XTitle, YTitle : String; MaxCurv : Integer; CurvParam : PCurvParamVector; GraphWidth, GraphHeight : Integer; SymbolSizeUnit : Integer; PenWidth : Integer; PenStyle : TPenStyle; PenColor, BrushColor : TColor; BrushStyle : TBrushStyle; procedure DimCurvParamVector(var CurvParam : PCurvParamVector; Ub : Byte); var I : Integer; begin { Allocate vector } GetMem(CurvParam, Ub * SizeOf(TCurvParam)); if CurvParam = nil then Exit; MaxCurv := Ub; { Initialize curve parameters } for I := 1 to Ub do with CurvParam^[I] do begin PointParam.Symbol := (I - 1) mod MaxSymbol + 1; PointParam.Size := 2; PointParam.Color := CurvColor[(I - 1) mod MaxCurvColor + 1]; Legend := 'Curve ' + LTrim(IntStr(I)); LineParam.Width := 1; LineParam.Style := psSolid; LineParam.Color := PointParam.Color; Step := 1; end; end; procedure DelCurvParamVector(var CurvParam : PCurvParamVector; Ub : Byte); begin if CurvParam <> nil then begin FreeMem(CurvParam, Ub * SizeOf(TCurvParam)); CurvParam := nil; MaxCurv := 0; end; end; function InitGraphics(Canvas : TCanvas; Width, Height : Integer) : Boolean; begin GraphWidth := Width; GraphHeight := Height; SymbolSizeUnit := GraphWidth div 250; XmaxPixel := Width; YmaxPixel := Height; XminPixel := 0; YminPixel := 0; XTitle := 'X'; YTitle := 'Y'; GraphTitle := ''; MaxCurv := MaxSymbol; DimCurvParamVector(CurvParam, MaxCurv); InitGraphics := True; end; procedure SetWindow(Canvas : TCanvas; X1, X2, Y1, Y2 : Integer; GraphBorder : Boolean); var R : Float; begin if (X1 >= 0) and (X2 <= 100) and (X1 < X2) then begin Xwin1 := X1; Xwin2 := X2; R := 0.01 * GraphWidth; XminPixel := Round(X1 * R); XmaxPixel := Round(X2 * R); end; if (Y1 >= 0) and (Y2 <= 100) and (Y1 < Y2) then begin Ywin1 := Y1; Ywin2 := Y2; R := 0.01 * GraphHeight; YminPixel := Round(Y1 * R); YmaxPixel := Round(Y2 * R); end; XAxis.Scale := LinScale; XAxis.Min := 0.0; XAxis.Max := 1.0; XAxis.Step := 0.2; YAxis.Scale := LinScale; YAxis.Min := 0.0; YAxis.Max := 1.0; YAxis.Step := 0.2; FactX := (XmaxPixel - XminPixel) / (XAxis.Max - XAxis.Min); FactY := (YmaxPixel - YminPixel) / (YAxis.Max - YAxis.Min); if GraphBorder then Canvas.Rectangle(XminPixel, YminPixel, Succ(XmaxPixel), Succ(YmaxPixel)); end; procedure AutoScale(X : PVector; Lb, Ub : Integer; Scale : TScale; var XMin, XMax, XStep : Float); var I : Integer; X1, X2 : Float; begin { Minimum and maximum of X } X1 := X^[Lb]; X2 := X1; for I := Lb to Ub do if X^[I] < X1 then X1 := X^[I] else if X^[I] > X2 then X2 := X^[I]; { Linear scale } if Scale = LinScale then begin Interval(X1, X2, 2, 6, XMin, XMax, XStep); Exit; end; { Logarithmic scale } XMin := 1.0E-3; XMax := 1.0E+3; XStep := 10.0; if X1 <= 0.0 then Exit; XMin := Int(Log10(X1)); if X1 < 1.0 then XMin := XMin - 1.0; XMax := Int(Log10(X2)); if X2 > 1.0 then XMax := XMax + 1.0; XMin := Exp10(XMin); XMax := Exp10(XMax); end; procedure SetOxScale(Scale : TScale; OxMin, OxMax, OxStep : Float); begin XAxis.Scale := Scale; case Scale of LinScale : begin if OxMin < OxMax then begin XAxis.Min := OxMin; XAxis.Max := OxMax; end; if OxStep > 0.0 then XAxis.Step := OxStep; end; LogScale : begin if (OxMin > 0.0) and (OxMin < OxMax) then begin XAxis.Min := Floor(Log10(OxMin)); XAxis.Max := Ceil(Log10(OxMax)); end; XAxis.Step := 1.0; end; end; FactX := (XmaxPixel - XminPixel) / (XAxis.Max - XAxis.Min); end; procedure SetOyScale(Scale : TScale; OyMin, OyMax, OyStep : Float); begin YAxis.Scale := Scale; case Scale of LinScale : begin if OyMin < OyMax then begin YAxis.Min := OyMin; YAxis.Max := OyMax; end; if OyStep > 0.0 then YAxis.Step := OyStep; end; LogScale : begin if (OyMin > 0.0) and (OyMin < OyMax) then begin YAxis.Min := Floor(Log10(OyMin)); YAxis.Max := Ceil(Log10(OyMax)); end; YAxis.Step := 1.0; end; end; FactY := (YmaxPixel - YminPixel) / (YAxis.Max - YAxis.Min); end; function Xpixel(X : Float) : Integer; var P : Float; begin P := FactX * (X - XAxis.Min); if Abs(P) > 30000 then Xpixel := 30000 else Xpixel := Round(P) + XminPixel; end; function Ypixel(Y : Float) : Integer; var P : Float; begin P := FactY * (YAxis.Max - Y); if Abs(P) > 30000 then Ypixel := 30000 else Ypixel := Round(P) + YminPixel; end; function Xuser(X : Integer) : Float; begin Xuser := XAxis.Min + (X - XminPixel) / FactX; end; function Yuser(Y : Integer) : Float; begin Yuser := YAxis.Max - (Y - YminPixel) / FactY; end; procedure SetGraphTitle(Title : String); begin GraphTitle := Title; end; procedure SetOxTitle(Title : String); begin XTitle := Title; end; procedure SetOyTitle(Title : String); begin YTitle := Title; end; procedure PlotLine(Canvas : TCanvas; X1, Y1, X2, Y2 : Integer); begin Canvas.MoveTo(X1, Y1); Canvas.LineTo(X2, Y2); end; procedure PlotOxAxis(Canvas : TCanvas); var W, X, Z : Float; Wp, Xp, Yp1, Yp2 : Integer; N, I, J : Integer; TickLength : Integer; MinorTickLength : Integer; XLabel : String; begin TickLength := Canvas.TextHeight('M') div 2; MinorTickLength := Round(0.67 * TickLength); PlotLine(Canvas, XminPixel, YmaxPixel, XmaxPixel, YmaxPixel); N := Round((XAxis.Max - XAxis.Min) / XAxis.Step); { Nb of intervals } X := XAxis.Min; { Tick mark position } Yp1 := YmaxPixel + TickLength; { End of tick mark } Yp2 := YmaxPixel + MinorTickLength; { End of minor tick mark (log scale) } for I := 0 to N do { Label axis } begin if (XAxis.Scale = LinScale) and (Abs(X) < Eps) then X := 0.0; Xp := Xpixel(X); PlotLine(Canvas, Xp, YmaxPixel, Xp, Yp1); if XAxis.Scale = LinScale then Z := X else Z := Exp10(X); XLabel := Trim(FloatStr(Z)); Canvas.TextOut(Xp - Canvas.TextWidth(XLabel) div 2, Yp1, XLabel); { Plot minor divisions on logarithmic scale } if (XAxis.Scale = LogScale) and (I < N) then for J := 2 to 9 do begin W := X + Log10(J); Wp := Xpixel(W); PlotLine(Canvas, Wp, YmaxPixel, Wp, Yp2); end; X := X + XAxis.Step; end; { Write axis title } if XTitle <> '' then Canvas.TextOut(XminPixel + (XmaxPixel - XminPixel - Canvas.TextWidth(XTitle)) div 2, YmaxPixel + 4 * TickLength, XTitle); end; procedure PlotOyAxis(Canvas : TCanvas); var W, Y, Z : Float; Wp, Xp1, Xp2, Yp : Integer; N, I, J : Integer; TickLength : Integer; MinorTickLength : Integer; Yoffset : Integer; YLabel : String; begin TickLength := Canvas.TextWidth('M') div 2; MinorTickLength := Round(0.67 * TickLength); Yoffset := Canvas.TextHeight('M') div 2; PlotLine(Canvas, XminPixel, YminPixel, XminPixel, YmaxPixel); N := Round((YAxis.Max - YAxis.Min) / YAxis.Step); Y := YAxis.Min; Xp1 := XminPixel - TickLength; Xp2 := XminPixel - MinorTickLength; for I := 0 to N do begin if (YAxis.Scale = LinScale) and (Abs(Y) < Eps) then Y := 0.0; Yp := Ypixel(Y); PlotLine(Canvas, XminPixel, Yp, Xp1, Yp); if YAxis.Scale = LinScale then Z := Y else Z := Exp10(Y); YLabel := Trim(FloatStr(Z)); Canvas.TextOut(Xp1 - Canvas.TextWidth(YLabel), Yp - Yoffset, YLabel); if (YAxis.Scale = LogScale) and (I < N) then for J := 2 to 9 do begin W := Y + Log10(J); Wp := Ypixel(W); PlotLine(Canvas, XminPixel, Wp, Xp2, Wp); end; Y := Y + YAxis.Step; end; if YTitle <> '' then Canvas.TextOut(XminPixel, YminPixel - 3 * Yoffset, YTitle); end; procedure PlotGrid(Canvas : TCanvas; Grid : TGrid); var X, Y : Float; I, N, Xp, Yp : Integer; var PenStyle : TpenStyle; begin PenStyle := Canvas.Pen.Style; Canvas.Pen.Style := psDot; if Grid in [HorizGrid, BothGrid] then { Horizontal lines } begin N := Round((YAxis.Max - YAxis.Min) / YAxis.Step); { Nb of intervals } for I := 1 to Pred(N) do begin Y := YAxis.Min + I * YAxis.Step; { Origin of line } Yp := Ypixel(Y); PlotLine(Canvas, XminPixel, Yp, XmaxPixel, Yp); end; end; if Grid in [VertiGrid, BothGrid] then { Vertical lines } begin N := Round((XAxis.Max - XAxis.Min) / XAxis.Step); for I := 1 to Pred(N) do begin X := XAxis.Min + I * XAxis.Step; Xp := Xpixel(X); PlotLine(Canvas, Xp, YminPixel, Xp, YmaxPixel); end; end; Canvas.Pen.Style := PenStyle; end; procedure WriteGraphTitle(Canvas : TCanvas); begin if GraphTitle <> '' then with Canvas do TextOut((XminPixel + XmaxPixel - TextWidth(GraphTitle)) div 2, YminPixel - 2 * TextHeight(GraphTitle), GraphTitle); end; procedure SetMaxCurv(NCurv : Byte); begin if NCurv < 1 then Exit; DelCurvParamVector(CurvParam, MaxCurv); MaxCurv := NCurv; DimCurvParamVector(CurvParam, MaxCurv); end; procedure SetPointParam(CurvIndex, Symbol, Size : Integer; Color : TColor); begin if (CurvIndex < 1) or (CurvIndex > MaxCurv) then Exit; if (Symbol >= 0) and (Symbol <= MaxSymbol) then CurvParam^[CurvIndex].PointParam.Symbol := Symbol; if Size > 0 then CurvParam^[CurvIndex].PointParam.Size := Size; if (Color >= 0) and (Color <= MaxColor) then CurvParam^[CurvIndex].PointParam.Color := Color; end; procedure SetLineParam(CurvIndex : Integer; Style : TPenStyle; Width : Integer; Color : TColor); begin if (CurvIndex < 1) or (CurvIndex > MaxCurv) then Exit; CurvParam^[CurvIndex].LineParam.Style := Style; if Width > 0 then CurvParam^[CurvIndex].LineParam.Width := Width; if (Color >= 0) and (Color <= MaxColor) then CurvParam^[CurvIndex].LineParam.Color := Color; end; procedure SetCurvLegend(CurvIndex : Integer; Legend : String); begin if (CurvIndex >= 1) and (CurvIndex <= MaxCurv) then CurvParam^[CurvIndex].Legend := Legend; end; procedure SetCurvStep(CurvIndex, Step : Integer); begin if (CurvIndex >= 1) and (CurvIndex <= MaxCurv) and (Step > 0) then CurvParam^[CurvIndex].Step := Step; end; function XOutOfBounds(X : Integer) : Boolean; { Checks if an absissa is outside the graphic bounds } begin XOutOfBounds := (X < XminPixel) or (X > XmaxPixel); end; function YOutOfBounds(Y : Integer) : Boolean; { Checks if an ordinate is outside the graphic bounds } begin YOutOfBounds := (Y < YminPixel) or (Y > YmaxPixel); end; function CheckPoint(X, Y : Float; var Xp, Yp : Integer) : Boolean; { Computes the pixel coordinates of a point and checks if it is enclosed within the graph limits } begin Xp := Xpixel(X); Yp := Ypixel(Y); CheckPoint := not(XOutOfBounds(Xp) or YOutOfBounds(Yp)); end; procedure PlotSymbol(Canvas : TCanvas; Xp, Yp, CurvIndex : Integer); var Xp1, Xp2, Yp1, Yp2, Size : Integer; begin Size := CurvParam^[CurvIndex].PointParam.Size * SymbolSizeUnit; Xp1 := Xp - Size; Yp1 := Yp - Size; Xp2 := Xp + Size + 1; Yp2 := Yp + Size + 1; with Canvas do case CurvParam^[CurvIndex].PointParam.Symbol of 0 : Pixels[Xp, Yp] := Brush.Color; 1, 2 : Ellipse(Xp1, Yp1, Xp2, Yp2); { Circle } 3, 4 : Rectangle(Xp1, Yp1, Xp2, Yp2); { Square } 5, 6 : Polygon([Point(Xp1, Yp2 - 1), Point(Xp2, Yp2 - 1), Point(Xp, Yp1 - 1)]); { Triangle } 7 : begin { + } PlotLine(Canvas, Xp, Yp1, Xp, Yp2); PlotLine(Canvas, Xp1, Yp, Xp2, Yp); end; 8 : begin { x } PlotLine(Canvas, Xp1, Yp1, Xp2, Yp2); PlotLine(Canvas, Xp1, Yp2 - 1, Xp2, Yp1 - 1); end; 9 : begin { * } PlotLine(Canvas, Xp, Yp1, Xp, Yp2); PlotLine(Canvas, Xp1, Yp, Xp2, Yp); PlotLine(Canvas, Xp1, Yp1, Xp2, Yp2); PlotLine(Canvas, Xp1, Yp2 - 1, Xp2, Yp1 - 1); end; end; end; procedure SetGraphSettings(Canvas : TCanvas; CurvIndex : Integer); { Saves the current graphic properties of the Canvas and sets them to the values of curve # CurvIndex } begin PenColor := Canvas.Pen.Color; PenStyle := Canvas.Pen.Style; PenWidth := Canvas.Pen.Width; BrushColor := Canvas.Brush.Color; BrushStyle := Canvas.Brush.Style; Canvas.Pen.Color := CurvParam^[CurvIndex].LineParam.Color; Canvas.Pen.Style := CurvParam^[CurvIndex].LineParam.Style; Canvas.Pen.Width := CurvParam^[CurvIndex].LineParam.Width; Canvas.Brush.Color := CurvParam^[CurvIndex].PointParam.Color; if CurvParam^[CurvIndex].PointParam.Symbol in [0, 1, 3, 5] then Canvas.Brush.Style := bsSolid else Canvas.Brush.Style := bsClear; end; procedure RestoreGraphSettings(Canvas : TCanvas); begin Canvas.Pen.Color := PenColor; Canvas.Pen.Style := PenStyle; Canvas.Pen.Width := PenWidth; Canvas.Brush.Color := BrushColor; Canvas.Brush.Style := BrushStyle; end; procedure PlotPoint(Canvas : TCanvas; X, Y : Float; CurvIndex : Integer); var Xp, Yp : Integer; begin if XAxis.Scale = LogScale then X := Log10(X); if YAxis.Scale = LogScale then Y := Log10(Y); if not CheckPoint(X, Y, Xp, Yp) then Exit; SetGraphSettings(Canvas, CurvIndex); PlotSymbol(Canvas, Xp, Yp, CurvIndex); RestoreGraphSettings(Canvas); end; procedure PlotErrorBar(Canvas : TCanvas; Y, S : Float; Ns, Xp, Yp, Size : Integer); { Plots an error bar with the current canvas settings } var Delta, Y1 : Float; Yp1 : Integer; PenStyle : TPenStyle; begin Size := Size * SymbolSizeUnit; PenStyle := Canvas.Pen.Style; Canvas.Pen.Style := psSolid; Delta := Ns * S; Y1 := Y - Delta; if YAxis.Scale = LogScale then Y1 := Log10(Y1); Yp1 := Ypixel(Y1); if Yp1 <= YmaxPixel then begin PlotLine(Canvas, Xp - Size, Yp1, Xp + Size + 1, Yp1); PlotLine(Canvas, Xp, Yp, Xp, Yp1); end else PlotLine(Canvas, Xp, Yp, Xp, YmaxPixel); Y1 := Y + Delta; if YAxis.Scale = LogScale then Y1 := Log10(Y1); Yp1 := Ypixel(Y1); if Yp1 >= YminPixel then begin PlotLine(Canvas, Xp - Size, Yp1, Xp + Size + 1, Yp1); PlotLine(Canvas, Xp, Yp, Xp, Yp1); end else PlotLine(Canvas, Xp, Yp, Xp, YminPixel); Canvas.Pen.Style := PenStyle; end; procedure GenPlotCurve(Canvas : TCanvas; X, Y, S : PVector; Ns, Lb, Ub, CurvIndex : Integer; ErrorBars : Boolean); { General curve plotting routine } var X1, Y1, X2, Y2 : Float; Xp1, Yp1, Xp2, Yp2 : Integer; I : Integer; Flag1, Flag2 : Boolean; begin SetGraphSettings(Canvas, CurvIndex); { Plot first point } X1 := X^[Lb]; if XAxis.Scale = LogScale then X1 := Log10(X1); Y1 := Y^[Lb]; if YAxis.Scale = LogScale then Y1 := Log10(Y1); Flag1 := CheckPoint(X1, Y1, Xp1, Yp1); if Flag1 then begin PlotSymbol(Canvas, Xp1, Yp1, CurvIndex); if ErrorBars and (S^[Lb] > 0.0) then PlotErrorBar(Canvas, Y^[Lb], S^[Lb], Ns, Xp1, Yp1, CurvIndex); end; { Plot other points and connect them by lines if necessary } I := Lb + CurvParam^[CurvIndex].Step; while I <= Ub do begin X2 := X^[I]; if XAxis.Scale = LogScale then X2 := Log10(X2); Y2 := Y^[I]; if YAxis.Scale = LogScale then Y2 := Log10(Y2); Flag2 := CheckPoint(X2, Y2, Xp2, Yp2); if Flag2 then begin PlotSymbol(Canvas, Xp2, Yp2, CurvIndex); if ErrorBars and (S^[I] > 0.0) then PlotErrorBar(Canvas, Y^[I], S^[I], Ns, Xp2, Yp2, CurvIndex); if (CurvParam^[CurvIndex].LineParam.Style <> psClear) and Flag1 then PlotLine(Canvas, Xp1, Yp1, Xp2, Yp2); end; Xp1 := Xp2; Yp1 := Yp2; Flag1 := Flag2; Inc(I, CurvParam^[CurvIndex].Step); end; RestoreGraphSettings(Canvas); end; procedure PlotCurve(Canvas : TCanvas; X, Y : PVector; Lb, Ub : Integer; CurvIndex : Integer); begin GenPlotCurve(Canvas, X, Y, nil, 0, Lb, Ub, CurvIndex, False); end; procedure PlotCurveWithErrorBars(Canvas : TCanvas; X, Y, S : PVector; Ns : Integer; Lb, Ub : Integer; CurvIndex : Integer); begin GenPlotCurve(Canvas, X, Y, S, Ns, Lb, Ub, CurvIndex, True); end; procedure PlotFunc(Canvas : TCanvas; Func : TFunc; Xmin, Xmax : Float; Npt : Integer; CurvIndex : Integer); var X1, Y1, X2, Y2, H : Float; Xp1, Yp1, Xp2, Yp2 : Integer; Flag1, Flag2 : Boolean; I : Integer; begin if (Npt < 2) or (CurvParam^[CurvIndex].LineParam.Style = psClear) then Exit; if Xmin >= Xmax then begin Xmin := XAxis.Min; Xmax := XAxis.Max; end; H := (Xmax - Xmin) / Npt; SetGraphSettings(Canvas, CurvIndex); { Check first point } X1 := Xmin; if XAxis.Scale = LinScale then Y1 := Func(X1) else Y1 := Func(Exp10(X1)); if YAxis.Scale = LogScale then Y1 := Log10(Y1); Flag1 := CheckPoint(X1, Y1, Xp1, Yp1); { Check other points and plot lines if possible } for I := 1 to Npt do begin X2 := X1 + H; if XAxis.Scale = LinScale then Y2 := Func(X2) else Y2 := Func(Exp10(X2)); if YAxis.Scale = LogScale then Y2 := Log10(Y2); Flag2 := CheckPoint(X2, Y2, Xp2, Yp2); if Flag1 and Flag2 then PlotLine(Canvas, Xp1, Yp1, Xp2, Yp2); X1 := X2; Xp1 := Xp2; Yp1 := Yp2; Flag1 := Flag2; end; RestoreGraphSettings(Canvas); end; procedure WriteLegend(Canvas : TCanvas; NCurv : Integer; ShowPoints, ShowLines : Boolean); var CharHeight, I, L, Lmax : Integer; N, Nmax, Xp, Xl, Y : Integer; begin N := 0; { Nb of legends to be plotted } Lmax := 0; { Length of the longest legend } for I := 1 to NCurv do if CurvParam^[I].Legend <> '' then begin Inc(N); L := Canvas.TextWidth(CurvParam^[I].Legend); if L > Lmax then Lmax := L; end; if (N = 0) or (Lmax = 0) then Exit; { Character height } CharHeight := Canvas.TextHeight('M'); { Max. number of legends which may be plotted } Nmax := Round((YmaxPixel - YminPixel) / CharHeight) - 1; if N > Nmax then N := Nmax; { Draw rectangle around the legends } Canvas.Rectangle(XmaxPixel + Round(0.02 * GraphWidth), YminPixel, XmaxPixel + Round(0.12 * GraphWidth) + Lmax, YminPixel + (N + 1) * CharHeight); L := Round(0.02 * GraphWidth); { Half-length of line } Xp := XmaxPixel + 3 * L; { Position of symbol } Xl := XmaxPixel + 5 * L; { Position of legend } if NCurv <= Nmax then N := NCurv else N := Nmax; for I := 1 to N do with Canvas do begin SetGraphSettings(Canvas, I); { Plot point and line } Y := YminPixel + I * CharHeight; if ShowPoints then PlotSymbol(Canvas, Xp, Y, I); if ShowLines then PlotLine(Canvas, Xp - L, Y, Xp + L, Y); { Write legend } Brush.Style := bsClear; Canvas.TextOut(Xl, Y - CharHeight div 2, CurvParam^[I].Legend); end; RestoreGraphSettings(Canvas); end; procedure ConRec(Canvas : TCanvas; Nx, Ny, Nc : Integer; X, Y, Z : PVector; F : PMatrix); const { Mapping from vertex numbers to X offsets } Im : array[0..3] of Integer = (0, 1, 1, 0); { Mapping from vertex numbers to Y offsets } Jm : array[0..3] of Integer = (0, 0, 1, 1); { Case switch table } CasTab : array[0..2, 0..2, 0..2] of Integer = (((0,0,8), (0,2,5), (7,6,9)), ((0,3,4), (1,3,1), (4,3,0)), ((9,6,7), (5,2,0), (8,0,0))); var I, J, K, M, M1, M2, M3 : Integer; X1, X2, Y1, Y2 : Float; Fmin, Fmax : Float; Xp, Yp : PIntVector; PrmErr : Boolean; var H : array[0..4] of Float; { Relative heights of the box above contour } Ish : array[0..4] of Integer; { Sign of H() } Xh : array[0..4] of Integer; { X coordinates of box } Yh : array[0..4] of Integer; { Y coordinates of box } label Case0, NoneInTri, NoneInBox; begin { Check the input parameters for validity } PrmErr := False; SetErrCode(MatOk); if (Nx <= 0) or (Ny <= 0) or (Nc <= 0) then PrmErr := True; for K := 1 to Nc - 1 do if Z^[K] <= Z^[K - 1] then PrmErr := True; if PrmErr then begin SetErrCode(MatErrDim); Exit; end; { Convert user coordinates to pixels } DimIntVector(Xp, Nx); DimIntVector(Yp, Ny); for I := 0 to Nx do Xp^[I] := Xpixel(X^[I]); for J := 0 to Ny do Yp^[J] := Ypixel(Y^[J]); { Scan the array, top down, left to right } for J := Ny - 1 downto 0 do begin for I := 0 to Nx - 1 do begin { Find the lowest vertex } if F^[I]^[J] < F^[I]^[J + 1] then Fmin := F^[I]^[J] else Fmin := F^[I]^[J + 1]; if F^[I + 1]^[J] < Fmin then Fmin := F^[I + 1]^[J]; if F^[I + 1]^[J + 1] < Fmin then Fmin := F^[I + 1]^[J + 1]; { Find the highest vertex } if F^[I]^[J] > F^[I]^[J + 1] then Fmax := F^[I]^[J] else Fmax := F^[I]^[J + 1]; if F^[I + 1]^[J] > Fmax then Fmax := F^[I + 1]^[J]; if F^[I + 1]^[J + 1] > Fmax then Fmax := F^[I + 1]^[J + 1]; if (Fmax < Z^[0]) or (Fmin > Z^[Nc - 1]) then goto NoneInBox; { Draw each contour within this box } for K := 0 to Nc - 1 do begin if (Z^[K] < Fmin) or (Z^[K] > Fmax) then goto NoneInTri; for M := 4 downto 0 do begin if M > 0 then begin H[M] := F^[I + Im[M - 1]]^[J + Jm[M - 1]] - Z^[K]; Xh[M] := Xp^[I + Im[M - 1]]; Yh[M] := Yp^[J + Jm[M - 1]]; end; if M = 0 then begin H[0] := (H[1] + H[2] + H[3] + H[4]) / 4; Xh[0] := (Xp^[I] + Xp^[I + 1]) div 2; Yh[0] := (Yp^[J] + Yp^[J + 1]) div 2; end; if H[M] > 0 then Ish[M] := 2; if H[M] < 0 then Ish[M] := 0; if H[M] = 0 then Ish[M] := 1; end; { next M } { Scan each triangle in the box } X1 := 0.0; X2 := 0.0; Y1 := 0.0; Y2 := 0.0; for M := 1 to 4 do begin M1 := M; M2 := 0; M3 := M + 1; if M3 = 5 then M3 := 1; case CasTab[Ish[M1], Ish[M2], Ish[M3]] of 0 : goto Case0; { Line between vertices M1 and M2 } 1 : begin X1 := Xh[M1]; Y1 := Yh[M1]; X2 := Xh[M2]; Y2 := Yh[M2]; end; { Line between vertices M2 and M3 } 2 : begin X1 := Xh[M2]; Y1 := Yh[M2]; X2 := Xh[M3]; Y2 := Yh[M3]; end; { Line between vertices M3 and M1 } 3 : begin X1 := Xh[M3]; Y1 := Yh[M3]; X2 := Xh[M1]; Y2 := Yh[M1]; end; { Line between vertex M1 and side M2-M3 } 4 : begin X1 := Xh[M1]; Y1 := Yh[M1]; X2 := (H[M3] * Xh[M2] - H[M2] * Xh[M3]) / (H[M3] - H[M2]); Y2 := (H[M3] * Yh[M2] - H[M2] * Yh[M3]) / (H[M3] - H[M2]); end; { Line between vertex M2 and side M3-M1 } 5 : begin X1 := Xh[M2]; Y1 := Yh[M2]; X2 := (H[M1] * Xh[M3] - H[M3] * Xh[M1]) / (H[M1] - H[M3]); Y2 := (H[M1] * Yh[M3] - H[M3] * Yh[M1]) / (H[M1] - H[M3]); end; { Line between vertex M3 and side M1-M2 } 6 : begin X1 := Xh[M3]; Y1 := Yh[M3]; X2 := (H[M2] * Xh[M1] - H[M1] * Xh[M2]) / (H[M2] - H[M1]); Y2 := (H[M2] * Yh[M1] - H[M1] * Yh[M2]) / (H[M2] - H[M1]); end; { Line between sides M1-M2 and M2-M3 } 7 : begin X1 := (H[M2] * Xh[M1] - H[M1] * Xh[M2]) / (H[M2] - H[M1]); Y1 := (H[M2] * Yh[M1] - H[M1] * Yh[M2]) / (H[M2] - H[M1]); X2 := (H[M3] * Xh[M2] - H[M2] * Xh[M3]) / (H[M3] - H[M2]); Y2 := (H[M3] * Yh[M2] - H[M2] * Yh[M3]) / (H[M3] - H[M2]); end; { Line between sides M2-M3 and M3-M1 } 8 : begin X1 := (H[M3] * Xh[M2] - H[M2] * Xh[M3]) / (H[M3] - H[M2]); Y1 := (H[M3] * Yh[M2] - H[M2] * Yh[M3]) / (H[M3] - H[M2]); X2 := (H[M1] * Xh[M3] - H[M3] * Xh[M1]) / (H[M1] - H[M3]); Y2 := (H[M1] * Yh[M3] - H[M3] * Yh[M1]) / (H[M1] - H[M3]); end; { Line between sides M3-M1 and M1-M2 } 9 : begin X1 := (H[M1] * Xh[M3] - H[M3] * Xh[M1]) / (H[M1] - H[M3]); Y1 := (H[M1] * Yh[M3] - H[M3] * Yh[M1]) / (H[M1] - H[M3]); X2 := (H[M2] * Xh[M1] - H[M1] * Xh[M2]) / (H[M2] - H[M1]); Y2 := (H[M2] * Yh[M1] - H[M1] * Yh[M2]) / (H[M2] - H[M1]); end; end; { case } Canvas.Pen.Color := CurvParam^[K mod MaxCurv + 1].LineParam.Color; PlotLine(Canvas, Trunc(X1), Trunc(Y1), Trunc(X2), Trunc(Y2)); Case0: end; { next M } NoneInTri: end; { next K } NoneInBox: end; { next I } end; { next J } end; procedure LeaveGraphics; begin DelCurvParamVector(CurvParam, MaxCurv); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/utypes.pas0000664000175000017500000002730611326434466021206 0ustar michaelmichael{ ****************************************************************** Types and constants - Error handling - Dynamic arrays ****************************************************************** The default real type is DOUBLE (8-byte real). Other types may be selected by defining the symbols: SINGLEREAL (Single precision, 4 bytes) EXTENDEDREAL (Extended precision, 12 bytes) ****************************************************************** } unit utypes; interface {$i types.inc} {$ifdef fpc} {$mode delphi} {$endif} { ------------------------------------------------------------------ Error handling ------------------------------------------------------------------ } procedure SetErrCode(ErrCode : Integer); { Sets the error code } function DefaultVal(ErrCode : Integer; DefVal : Float) : Float; { Sets error code and default function value } function MathErr : Integer; { Returns the error code } { ------------------------------------------------------------------ Dynamic arrays ------------------------------------------------------------------ } procedure SetAutoInit(AutoInit : Boolean); { Sets the auto-initialization of arrays } procedure DimVector(var V : PVector; Ub : Integer); { Creates floating point vector V[0..Ub] } procedure DimIntVector(var V : PIntVector; Ub : Integer); { Creates integer vector V[0..Ub] } procedure DimCompVector(var V : PCompVector; Ub : Integer); { Creates complex vector V[0..Ub] } procedure DimBoolVector(var V : PBoolVector; Ub : Integer); { Creates boolean vector V[0..Ub] } procedure DimStrVector(var V : PStrVector; Ub : Integer); { Creates string vector V[0..Ub] } procedure DimMatrix(var A : PMatrix; Ub1, Ub2 : Integer); { Creates floating point matrix A[0..Ub1, 0..Ub2] } procedure DimIntMatrix(var A : PIntMatrix; Ub1, Ub2 : Integer); { Creates integer matrix A[0..Ub1, 0..Ub2] } procedure DimCompMatrix(var A : PCompMatrix; Ub1, Ub2 : Integer); { Creates complex matrix A[0..Ub1, 0..Ub2] } procedure DimBoolMatrix(var A : PBoolMatrix; Ub1, Ub2 : Integer); { Creates boolean matrix A[0..Ub1, 0..Ub2] } procedure DimStrMatrix(var A : PStrMatrix; Ub1, Ub2 : Integer); { Creates string matrix A[0..Ub1, 0..Ub2] } procedure DelVector(var V : PVector; Ub : Integer); { Deletes floating point vector V[0..Ub] } procedure DelIntVector(var V : PIntVector; Ub : Integer); { Deletes integer vector V[0..Ub] } procedure DelCompVector(var V : PCompVector; Ub : Integer); { Deletes complex vector V[0..Ub] } procedure DelBoolVector(var V : PBoolVector; Ub : Integer); { Deletes boolean vector V[0..Ub] } procedure DelStrVector(var V : PStrVector; Ub : Integer); { Deletes string vector V[0..Ub] } procedure DelMatrix(var A : PMatrix; Ub1, Ub2 : Integer); { Deletes floating point matrix A[0..Ub1, 0..Ub2] } procedure DelIntMatrix(var A : PIntMatrix; Ub1, Ub2 : Integer); { Deletes integer matrix A[0..Ub1, 0..Ub2] } procedure DelCompMatrix(var A : PCompMatrix; Ub1, Ub2 : Integer); { Deletes complex matrix A[0..Ub1, 0..Ub2] } procedure DelBoolMatrix(var A : PBoolMatrix; Ub1, Ub2 : Integer); { Deletes boolean matrix A[0..Ub1, 0..Ub2] } procedure DelStrMatrix(var A : PStrMatrix; Ub1, Ub2 : Integer); { Deletes string matrix A[0..Ub1, 0..Ub2] } implementation const gAutoInit : Boolean = True; var gErrCode : Integer; procedure SetErrCode(ErrCode : Integer); begin gErrCode := ErrCode; end; function DefaultVal(ErrCode : Integer; DefVal : Float) : Float; begin SetErrCode(ErrCode); DefaultVal := DefVal; end; function MathErr : Integer; begin MathErr := gErrCode; end; procedure SetAutoInit(AutoInit : Boolean); begin gAutoInit := AutoInit; end; procedure DimVector(var V : PVector; Ub : Integer); var I : Integer; begin { Check bounds } if (Ub < 0) or (Ub > MAX_FLT) then begin V := nil; Exit; end; { Allocate vector } GetMem(V, (Ub + 1) * FltSize); if V = nil then Exit; { Initialize vector } if gAutoInit then for I := 0 to Ub do V^[I] := 0.0; end; procedure DimIntVector(var V : PIntVector; Ub : Integer); var I : Integer; begin { Check bounds } if (Ub < 0) or (Ub > MAX_INT) then begin V := nil; Exit; end; { Allocate vector } GetMem(V, (Ub + 1) * IntSize); if V = nil then Exit; { Initialize vector } if gAutoInit then for I := 0 to Ub do V^[I] := 0; end; procedure DimCompVector(var V : PCompVector; Ub : Integer); var I : Integer; begin { Check bounds } if (Ub < 0) or (Ub > MAX_COMP) then begin V := nil; Exit; end; { Allocate vector } GetMem(V, (Ub + 1) * CompSize); if V = nil then Exit; { Initialize vector } if gAutoInit then for I := 0 to Ub do begin V^[I].X := 0.0; V^[I].Y := 0.0; end; end; procedure DimBoolVector(var V : PBoolVector; Ub : Integer); var I : Integer; begin { Check bounds } if (Ub < 0) or (Ub > MAX_BOOL) then begin V := nil; Exit; end; { Allocate vector } GetMem(V, (Ub + 1) * BoolSize); if V = nil then Exit; { Initialize vector } if gAutoInit then for I := 0 to Ub do V^[I] := False; end; procedure DimStrVector(var V : PStrVector; Ub : Integer); var I : Integer; begin { Check bounds } if (Ub < 0) or (Ub > MAX_STR) then begin V := nil; Exit; end; { Allocate vector } GetMem(V, (Ub + 1) * StrSize); if V = nil then Exit; { Initialize vector } if gAutoInit then for I := 0 to Ub do V^[I] := ''; end; procedure DimMatrix(var A : PMatrix; Ub1, Ub2 : Integer); var I, J : Integer; RowSize : Word; begin if (Ub1 < 0) or (Ub1 > MAX_VEC) or (Ub2 < 0) or (Ub2 > MAX_FLT) then begin A := nil; Exit; end; { Allocate matrix } GetMem(A, (Ub1 + 1) * PtrSize); if A = nil then Exit; { Size of a row } RowSize := (Ub2 + 1) * FltSize; { Allocate each row } for I := 0 to Ub1 do begin GetMem(A^[I], RowSize); if A^[I] = nil then begin A := nil; Exit; end; end; { Initialize matrix } if gAutoInit then for I := 0 to Ub1 do for J := 0 to Ub2 do A^[I]^[J] := 0.0; end; procedure DimIntMatrix(var A : PIntMatrix; Ub1, Ub2 : Integer); var I, J : Integer; RowSize : Word; begin { Check bounds } if (Ub1 < 0) or (Ub1 > MAX_VEC) or (Ub2 < 0) or (Ub2 > MAX_INT) then begin A := nil; Exit; end; { Allocate matrix } GetMem(A, (Ub1 + 1) * PtrSize); if A = nil then Exit; { Size of a row } RowSize := (Ub2 + 1) * IntSize; { Allocate each row } for I := 0 to Ub1 do begin GetMem(A^[I], RowSize); if A^[I] = nil then begin A := nil; Exit; end; end; { Initialize matrix } if gAutoInit then for I := 0 to Ub1 do for J := 0 to Ub2 do A^[I]^[J] := 0; end; procedure DimCompMatrix(var A : PCompMatrix; Ub1, Ub2 : Integer); var I, J : Integer; RowSize : Word; begin { Check bounds } if (Ub1 < 0) or (Ub1 > MAX_VEC) or (Ub2 < 0) or (Ub2 > MAX_COMP) then begin A := nil; Exit; end; { Allocate matrix } GetMem(A, (Ub1 + 1) * PtrSize); if A = nil then Exit; { Size of a row } RowSize := (Ub2 + 1) * CompSize; { Allocate each row } for I := 0 to Ub1 do begin GetMem(A^[I], RowSize); if A^[I] = nil then begin A := nil; Exit; end; end; { Initialize matrix } if gAutoInit then for I := 0 to Ub1 do for J := 0 to Ub2 do begin A^[I]^[J].X := 0.0; A^[I]^[J].Y := 0.0; end; end; procedure DimBoolMatrix(var A : PBoolMatrix; Ub1, Ub2 : Integer); var I, J : Integer; RowSize : Word; begin { Check bounds } if (Ub1 < 0) or (Ub1 > MAX_VEC) or (Ub2 < 0) or (Ub2 > MAX_BOOL) then begin A := nil; Exit; end; { Allocate matrix } GetMem(A, (Ub1 + 1) * PtrSize); if A = nil then Exit; { Size of a row } RowSize := (Ub2 + 1) * BoolSize; { Allocate each row } for I := 0 to Ub1 do begin GetMem(A^[I], RowSize); if A^[I] = nil then begin A := nil; Exit; end; end; { Initialize matrix } if gAutoInit then for I := 0 to Ub1 do for J := 0 to Ub2 do A^[I]^[J] := False; end; procedure DimStrMatrix(var A : PStrMatrix; Ub1, Ub2 : Integer); var I, J : Integer; RowSize : Word; begin { Check bounds } if (Ub1 < 0) or (Ub1 > MAX_VEC) or (Ub2 < 0) or (Ub2 > MAX_STR) then begin A := nil; Exit; end; { Allocate matrix } GetMem(A, (Ub1 + 1) * PtrSize); if A = nil then Exit; { Size of a row } RowSize := (Ub2 + 1) * StrSize; { Allocate each row } for I := 0 to Ub1 do begin GetMem(A^[I], RowSize); if A^[I] = nil then begin A := nil; Exit; end; end; { Initialize matrix } if gAutoInit then for I := 0 to Ub1 do for J := 0 to Ub2 do A^[I]^[J] := ''; end; procedure DelVector(var V : PVector; Ub : Integer); begin if V <> nil then begin FreeMem(V, (Ub + 1) * FltSize); V := nil; end; end; procedure DelIntVector(var V : PIntVector; Ub : Integer); begin if V <> nil then begin FreeMem(V, (Ub + 1) * IntSize); V := nil; end; end; procedure DelCompVector(var V : PCompVector; Ub : Integer); begin if V <> nil then begin FreeMem(V, (Ub + 1) * CompSize); V := nil; end; end; procedure DelBoolVector(var V : PBoolVector; Ub : Integer); begin if V <> nil then begin FreeMem(V, (Ub + 1) * BoolSize); V := nil; end; end; procedure DelStrVector(var V : PStrVector; Ub : Integer); begin if V <> nil then begin FreeMem(V, (Ub + 1) * StrSize); V := nil; end; end; procedure DelMatrix(var A : PMatrix; Ub1, Ub2 : Integer); var I : Integer; RowSize : Word; begin if A <> nil then begin RowSize := (Ub2 + 1) * FltSize; for I := Ub1 downto 0 do FreeMem(A^[I], RowSize); FreeMem(A, (Ub1 + 1) * PtrSize); A := nil; end; end; procedure DelIntMatrix(var A : PIntMatrix; Ub1, Ub2 : Integer); var I : Integer; RowSize : Word; begin if A <> nil then begin RowSize := (Ub2 + 1) * IntSize; for I := Ub1 downto 0 do FreeMem(A^[I], RowSize); FreeMem(A, (Ub1 + 1) * PtrSize); A := nil; end; end; procedure DelCompMatrix(var A : PCompMatrix; Ub1, Ub2 : Integer); var I : Integer; RowSize : Word; begin if A <> nil then begin RowSize := (Ub2 + 1) * CompSize; for I := Ub1 downto 0 do FreeMem(A^[I], RowSize); FreeMem(A, (Ub1 + 1) * PtrSize); A := nil; end; end; procedure DelBoolMatrix(var A : PBoolMatrix; Ub1, Ub2 : Integer); var I : Integer; RowSize : Word; begin if A <> nil then begin RowSize := (Ub2 + 1) * BoolSize; for I := Ub1 downto 0 do FreeMem(A^[I], RowSize); FreeMem(A, (Ub1 + 1) * PtrSize); A := nil; end; end; procedure DelStrMatrix(var A : PStrMatrix; Ub1, Ub2 : Integer); var I : Integer; RowSize : Word; begin if A <> nil then begin RowSize := (Ub2 + 1) * StrSize; for I := Ub1 downto 0 do FreeMem(A^[I], RowSize); FreeMem(A, (Ub1 + 1) * PtrSize); A := nil; end; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/utrigo.pas0000664000175000017500000000542111326434466021160 0ustar michaelmichael{ ****************************************************************** Trigonometric functions ****************************************************************** } unit utrigo; interface uses utypes, uminmax; function Pythag(X, Y : Float) : Float; { Sqrt(X^2 + Y^2) } function FixAngle(Theta : Float) : Float; { Set Theta in -Pi..Pi } function Tan(X : Float) : Float; { Tangent } function ArcSin(X : Float) : Float; { Arc sinus } function ArcCos(X : Float) : Float; { Arc cosinus } function ArcTan2(Y, X : Float) : Float; { Angle (Ox, OM) with M(X,Y) } implementation function Pythag(X, Y : Float) : Float; { Computes Sqrt(X^2 + Y^2) without destructive underflow or overflow } var AbsX, AbsY : Float; begin SetErrCode(FOk); AbsX := Abs(X); AbsY := Abs(Y); if AbsX > AbsY then Pythag := AbsX * Sqrt(1.0 + Sqr(AbsY / AbsX)) else if AbsY = 0.0 then Pythag := 0.0 else Pythag := AbsY * Sqrt(1.0 + Sqr(AbsX / AbsY)); end; function FixAngle(Theta : Float) : Float; begin SetErrCode(FOk); while Theta > Pi do Theta := Theta - TwoPi; while Theta <= - PI do Theta := Theta + TwoPi; FixAngle := Theta; end; function Tan(X : Float) : Float; var SinX, CosX : Float; begin SetErrCode(FOk); SinX := Sin(X); CosX := Cos(X); if CosX = 0.0 then Tan := DefaultVal(FSing, Sgn(SinX) * MaxNum) else Tan := SinX / CosX; end; function ArcSin(X : Float) : Float; begin SetErrCode(FOk); if (X < - 1.0) or (X > 1.0) then ArcSin := DefaultVal(FDomain, 0.0) else if X = 1.0 then ArcSin := PiDiv2 else if X = - 1.0 then ArcSin := - PiDiv2 else ArcSin := ArcTan(X / Sqrt(1.0 - Sqr(X))); end; function ArcCos(X : Float) : Float; begin SetErrCode(FOk); if (X < - 1.0) or (X > 1.0) then ArcCos := DefaultVal(FDomain, 0.0) else if X = 1.0 then ArcCos := 0.0 else if X = - 1.0 then ArcCos := Pi else ArcCos := PiDiv2 - ArcTan(X / Sqrt(1.0 - Sqr(X))); end; function ArcTan2(Y, X : Float) : Float; var Theta : Float; begin SetErrCode(FOk); if X = 0.0 then if Y = 0.0 then ArcTan2 := 0.0 else if Y > 0.0 then ArcTan2 := PiDiv2 else ArcTan2 := - PiDiv2 else begin { 4th/1st quadrant -Pi/2..Pi/2 } Theta := ArcTan(Y / X); { 2nd/3rd quadrants } if X < 0.0 then if Y >= 0.0 then Theta := Theta + Pi { 2nd quadrant: Pi/2..Pi } else Theta := Theta - Pi; { 3rd quadrant: -Pi..-Pi/2 } ArcTan2 := Theta; end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/utrapint.pas0000664000175000017500000000124611326434466021516 0ustar michaelmichael{ ****************************************************************** Trapezoidal integration ****************************************************************** } unit utrapint; interface uses utypes; function TrapInt(X, Y : PVector; N : Integer) : Float; { Integration by trapezoidal rule, from (X^[0], Y^[0]) to (X^[N], Y^[N]) } implementation function TrapInt(X, Y : PVector; N : Integer) : Float; var Sum : Float; I, J : Integer; begin Sum := 0.0; for I := 0 to Pred(N) do begin J := Succ(I); Sum := Sum + 0.5 * (X^[J] - X^[I]) * (Y^[J] + Y^[I]); end; TrapInt := Sum; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/usvdfit.pas0000664000175000017500000001473111326434466021337 0ustar michaelmichael{ ****************************************************************** Multiple linear regression (Singular Value Decomposition) ****************************************************************** } unit usvdfit; interface uses utypes, usvd; procedure SVDFit(X : PMatrix; Y : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; SVDTol : Float; B : PVector; V : PMatrix); { ------------------------------------------------------------------ Multiple linear regression: Y = B(0) + B(1) * X + B(2) * X2 + ... ------------------------------------------------------------------ Input parameters: X = matrix of independent variables Y = vector of dependent variable Lb, Ub = array bounds Nvar = number of independent variables ConsTerm = presence of constant term B(0) Output parameters: B = regression parameters V = inverse matrix ------------------------------------------------------------------ } procedure WSVDFit(X : PMatrix; Y, S : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; SVDTol : Float; B : PVector; V : PMatrix); { ---------------------------------------------------------------------- Weighted multiple linear regression ---------------------------------------------------------------------- S = standard deviations of observations Other parameters as in SVDFit ---------------------------------------------------------------------- } implementation type TRegMode = (UNWEIGHTED, WEIGHTED); procedure GenSVDFit(Mode : TRegMode; X : PMatrix; Y, S : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; SVDTol : Float; B : PVector; V : PMatrix); { ---------------------------------------------------------------------- General multiple linear regression routine (SVD algorithm) ---------------------------------------------------------------------- } var U : PMatrix; { Matrix of independent variables for SVD } Z : PVector; { Vector of dependent variables for SVD } S1 : PVector; { Singular values } S2inv : PVector; { Inverses of squared singular values } V1 : PMatrix; { Orthogonal matrix from SVD } LbU : Integer; { Lower bound of U matrix in both dim. } UbU : Integer; { Upper bound of U matrix in 1st dim. } I, J, K : Integer; { Loop variables } Sigma : Float; { Square root of weight } Sum : Float; { Element of variance-covariance matrix } begin if Ub - Lb < Nvar then begin SetErrCode(MatErrDim); Exit; end; if Mode = WEIGHTED then for K := Lb to Ub do if S^[K] <= 0.0 then begin SetErrCode(MatSing); Exit; end; { ---------------------------------------------------------- Prepare arrays for SVD : If constant term, use U[0..(N - Lb), 0..Nvar] and Z[0..(N - Lb)] else use U[1..(N - Lb + 1), 1..Nvar] and Z[1..(N - Lb + 1)] since the lower bounds of U for the SVD routine must be the same in both dimensions ---------------------------------------------------------- } if ConsTerm then begin LbU := 0; UbU := Ub - Lb; end else begin LbU := 1; UbU := Ub - Lb + 1; end; { Dimension arrays } DimMatrix(U, UbU, Nvar); DimVector(Z, UbU); DimVector(S1, Nvar); DimVector(S2inv, Nvar); DimMatrix(V1, Nvar, Nvar); if Mode = UNWEIGHTED then for I := LbU to UbU do begin K := I - LbU + Lb; Z^[I] := Y^[K]; if ConsTerm then U^[I]^[0] := 1.0; for J := 1 to Nvar do U^[I]^[J] := X^[K]^[J]; end else for I := LbU to UbU do begin K := I - LbU + Lb; Sigma := 1.0 / S^[K]; Z^[I] := Y^[K] * Sigma; if ConsTerm then U^[I]^[0] := Sigma; for J := 1 to Nvar do U^[I]^[J] := X^[K]^[J] * Sigma; end; { Perform singular value decomposition } SV_Decomp(U, LbU, UbU, Nvar, S1, V1); if MathErr = MatOk then begin { Set the lowest singular values to zero } SV_SetZero(S1, LbU, Nvar, SVDTol); { Solve the system } SV_Solve(U, S1, V1, Z, LbU, UbU, Nvar, B); { Compute variance-covariance matrix } for I := LbU to Nvar do if S1^[I] > 0.0 then S2inv^[I] := 1.0 / Sqr(S1^[I]) else S2inv^[I] := 0.0; for I := LbU to Nvar do for J := LbU to I do begin Sum := 0.0; for K := LbU to Nvar do Sum := Sum + V1^[I]^[K] * V1^[J]^[K] * S2inv^[K]; V^[I]^[J] := Sum; V^[J]^[I] := Sum; end; end; DelMatrix(U, UbU, Nvar); DelVector(Z, UbU); DelVector(S1, Nvar); DelVector(S2inv, Nvar); DelMatrix(V1, Nvar, Nvar); end; procedure SVDFit(X : PMatrix; Y : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; SVDTol : Float; B : PVector; V : PMatrix); var S : PVector; begin S := nil; GenSVDFit(UNWEIGHTED, X, Y, S, Lb, Ub, Nvar, ConsTerm, SVDTol, B, V); end; procedure WSVDFit(X : PMatrix; Y, S : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; SVDTol : Float; B : PVector; V : PMatrix); begin GenSVDFit(WEIGHTED, X, Y, S, Lb, Ub, Nvar, ConsTerm, SVDTol, B, V); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/usvd.pas0000664000175000017500000003444311326434466020636 0ustar michaelmichael{ ****************************************************************** Singular value decomposition ****************************************************************** } unit usvd; interface uses utypes, uminmax, utrigo; procedure SV_Decomp(A : PMatrix; Lb, Ub1, Ub2 : Integer; S : PVector; V : PMatrix); { ------------------------------------------------------------------ Singular value decomposition. Factors the matrix A (n x m, with n >= m) as a product U * S * V' where U is a (n x m) column- orthogonal matrix, S a (m x m) diagonal matrix with elements >= 0 (the singular values) and V a (m x m) orthogonal matrix. This routine is used in conjunction with SV_Solve to solve a system of equations. ------------------------------------------------------------------ Input parameters : A = matrix Lb = index of first matrix element Ub1 = index of last matrix element in 1st dim. Ub2 = index of last matrix element in 2nd dim. ------------------------------------------------------------------ Output parameter : A = contains the elements of U S = vector of singular values V = orthogonal matrix ------------------------------------------------------------------ Possible results : MatOk : No error MatNonConv : Non-convergence MatErrDim : Non-compatible dimensions (n < m) ------------------------------------------------------------------ NB : This procedure destroys the original matrix A ------------------------------------------------------------------ } procedure SV_SetZero(S : PVector; Lb, Ub : Integer; Tol : Float); { ------------------------------------------------------------------ Sets the singular values to zero if they are lower than a specified threshold. ------------------------------------------------------------------ Input parameters : S = vector of singular values Tol = relative tolerance Threshold value will be Tol * Max(S) Lb = index of first vector element Ub = index of last vector element ------------------------------------------------------------------ Output parameter : S = modified singular values ------------------------------------------------------------------ } procedure SV_Solve(U : PMatrix; S : PVector; V : PMatrix; B : PVector; Lb, Ub1, Ub2 : Integer; X : PVector); { ------------------------------------------------------------------ Solves a system of equations by singular value decomposition, after the matrix has been transformed by SV_Decomp, and the lowest singular values have been set to zero by SV_SetZero. ------------------------------------------------------------------ Input parameters : U, S, V = vector and matrices from SV_Decomp B = constant vector Lb, Ub1, Ub2 = as in SV_Decomp ------------------------------------------------------------------ Output parameter : X = solution vector = V * Diag(1/s(i)) * U' * B, for s(i) <> 0 ------------------------------------------------------------------ } procedure SV_Approx(U : PMatrix; S : PVector; V : PMatrix; Lb, Ub1, Ub2 : Integer; A : PMatrix); { ------------------------------------------------------------------ Approximates a matrix A by the product USV', after the lowest singular values have been set to zero by SV_SetZero. ------------------------------------------------------------------ Input parameters : U, S, V = vector and matrices from SV_Decomp Lb, Ub1, Ub2 = as in SV_Decomp ------------------------------------------------------------------ Output parameter : A = approximated matrix ------------------------------------------------------------------ } implementation procedure SV_Decomp(A : PMatrix; Lb, Ub1, Ub2 : Integer; S : PVector; V : PMatrix); { ---------------------------------------------------------------------- This procedure is a translation of the EISPACK subroutine SVD This procedure determines the singular value decomposition A = U.S.V' of a real M by N rectangular matrix. Householder bidiagonalization and a variant of the QR algorithm are used. ---------------------------------------------------------------------- This is a crude translation. Many of the original goto's have been kept! ---------------------------------------------------------------------- } var I, J, K, L, I1, K1, L1, Mn, Its : Integer; C, F, G, H, T, X, Y, Z, Tst1, Tst2, Scale : Float; R : PVector; label 190, 210, 270, 290, 360, 390, 430, 460, 475, 490, 520, 540, 565, 580, 650, 700; begin if Ub2 > Ub1 then begin SetErrCode(MatErrDim); Exit end; DimVector(R, Ub2); Scale := 0.0; G := 0.0; X := 0.0; { Householder reduction to bidiagonal form } for I := Lb to Ub2 do begin L := I + 1; R^[I] := Scale * G; G := 0.0; T := 0.0; Scale := 0.0; if I > Ub1 then goto 210; for K := I to Ub1 do Scale := Scale + Abs(A^[K]^[I]); if Scale = 0.0 then goto 210; for K := I to Ub1 do begin A^[K]^[I] := A^[K]^[I] / Scale; T := T + Sqr(A^[K]^[I]); end; F := A^[I]^[I]; G := - DSgn(Sqrt(T), F); H := F * G - T; A^[I]^[I] := F - G; if I = Ub2 then goto 190; for J := L to Ub2 do begin T := 0.0; for K := I to Ub1 do T := T + A^[K]^[I] * A^[K]^[J]; F := T / H; for K := I to Ub1 do A^[K]^[J] := A^[K]^[J] + F * A^[K]^[I]; end; 190: for K := I to Ub1 do A^[K]^[I] := Scale * A^[K]^[I]; 210: S^[I] := Scale * G; G := 0.0; T := 0.0; Scale := 0.0; if (I > Ub1) or (I = Ub2) then goto 290; for K := L to Ub2 do Scale := Scale + Abs(A^[I]^[K]); if Scale = 0.0 then goto 290; for K := L to Ub2 do begin A^[I]^[K] := A^[I]^[K] / Scale; T := T + Sqr(A^[I]^[K]); end; F := A^[I]^[L]; G := - DSgn(Sqrt(T), F); H := F * G - T; A^[I]^[L] := F - G; for K := L to Ub2 do R^[K] := A^[I]^[K] / H; if I = Ub1 then goto 270; for J := L to Ub1 do begin T := 0.0; for K := L to Ub2 do T := T + A^[J]^[K] * A^[I]^[K]; for K := L to Ub2 do A^[J]^[K] := A^[J]^[K] + T * R^[K]; end; 270: for K := L to Ub2 do A^[I]^[K] := Scale * A^[I]^[K]; 290: X := FMax(X, Abs(S^[I]) + Abs(R^[I])); end; { Accumulation of right-hand transformations } for I := Ub2 downto Lb do begin if I = Ub2 then goto 390; if G = 0.0 then goto 360; for J := L to Ub2 do { Double division avoids possible underflow } V^[J]^[I] := (A^[I]^[J] / A^[I]^[L]) / G; for J := L to Ub2 do begin T := 0.0; for K := L to Ub2 do T := T + A^[I]^[K] * V^[K]^[J]; for K := L to Ub2 do V^[K]^[J] := V^[K]^[J] + T * V^[K]^[I]; end; 360: for J := L to Ub2 do begin V^[I]^[J] := 0.0; V^[J]^[I] := 0.0; end; 390: V^[I]^[I] := 1.0; G := R^[I]; L := I; end; { Accumulation of left-hand transformations } Mn := IMin(Ub1, Ub2); for I := Mn downto Lb do begin L := I + 1; G := S^[I]; if I = Ub2 then goto 430; for J := L to Ub2 do A^[I]^[J] := 0.0; 430: if G = 0.0 then goto 475; if I = Mn then goto 460; for J := L to Ub2 do begin T := 0.0; for K := L to Ub1 do T := T + A^[K]^[I] * A^[K]^[J]; { Double division avoids possible underflow } F := (T / A^[I]^[I]) / G; for K := I to Ub1 do A^[K]^[J] := A^[K]^[J] + F * A^[K]^[I]; end; 460: for J := I to Ub1 do A^[J]^[I] := A^[J]^[I] / G; goto 490; 475: for J := I to Ub1 do A^[J]^[I] := 0.0; 490: A^[I]^[I] := A^[I]^[I] + 1.0; end; { Diagonalization of the bidiagonal form } Tst1 := X; for K := Ub2 downto Lb do begin K1 := K - 1; Its := 0; 520: { Test for splitting } for L := K downto Lb do begin L1 := L - 1; Tst2 := Tst1 + Abs(R^[L]); if Tst2 = Tst1 then goto 565; { R^[Lb] is always zero, so there is no exit through the bottom of the loop } Tst2 := Tst1 + Abs(S^[L1]); if Tst2 = Tst1 then goto 540; end; 540: { Cancellation of R^[L] if L greater than 1 } C := 0.0; T := 1.0; for I := L to K do begin F := T * R^[I]; R^[I] := C * R^[I]; Tst2 := Tst1 + Abs(F); if Tst2 = Tst1 then goto 565; G := S^[I]; H := Pythag(F, G); S^[I] := H; C := G / H; T := - F / H; for J := Lb to Ub1 do begin Y := A^[J]^[L1]; Z := A^[J]^[I]; A^[J]^[L1] := Y * C + Z * T; A^[J]^[I] := - Y * T + Z * C; end; end; 565: { Test for convergence } Z := S^[K]; if L = K then goto 650; if Its = 30 then begin SetErrCode(MatNonConv); DelVector(R, Ub2); Exit; end; { Shift from bottom 2 by 2 minor } Its := Its + 1; X := S^[L]; Y := S^[K1]; G := R^[K1]; H := R^[K]; F := 0.5 * (((G + Z) / H) * ((G - Z) / Y) + Y / H - H / Y); G := Pythag(F, 1.0); F := X - (Z / X) * Z + (H / X) * (Y / (F + DSgn(G, F)) - H); { Next QR transformation } C := 1.0; T := 1.0; for I1 := L to K1 do begin I := I1 + 1; G := R^[I]; Y := S^[I]; H := T * G; G := C * G; Z := Pythag(F, H); R^[I1] := Z; C := F / Z; T := H / Z; F := X * C + G * T; G := - X * T + G * C; H := Y * T; Y := Y * C; for J := Lb to Ub2 do begin X := V^[J]^[I1]; Z := V^[J]^[I]; V^[J]^[I1] := X * C + Z * T; V^[J]^[I] := - X * T + Z * C; end; Z := Pythag(F, H); S^[I1] := Z; { Rotation can be arbitrary if Z is zero } if Z = 0.0 then goto 580; C := F / Z; T := H / Z; 580: F := C * G + T * Y; X := - T * G + C * Y; for J := Lb to Ub1 do begin Y := A^[J]^[I1]; Z := A^[J]^[I]; A^[J]^[I1] := Y * C + Z * T; A^[J]^[I] := - Y * T + Z * C; end; end; R^[L] := 0.0; R^[K] := F; S^[K] := X; goto 520; 650: { Convergence } if Z >= 0.0 then goto 700; { S^[K] is made non-negative } S^[K] := - Z; for J := Lb to Ub2 do V^[J]^[K] := - V^[J]^[K]; 700: end; DelVector(R, Ub2); SetErrCode(MatOk); end; procedure SV_SetZero(S : PVector; Lb, Ub : Integer; Tol : Float); var Threshold : Float; I : Integer; begin Threshold := S^[Lb]; for I := Lb + 1 to Ub do if S^[I] > Threshold then Threshold := S^[I]; Threshold := Tol * Threshold; for I := Lb to Ub do if S^[I] < Threshold then S^[I] := 0.0; end; procedure SV_Solve(U : PMatrix; S : PVector; V : PMatrix; B : PVector; Lb, Ub1, Ub2 : Integer; X : PVector); var I, J, K : Integer; Sum : Float; Tmp : PVector; begin DimVector(Tmp, Ub2); for J := Lb to Ub2 do begin Sum := 0.0; if S^[J] > 0.0 then begin for I := Lb to Ub1 do Sum := Sum + U^[I]^[J] * B^[I]; Sum := Sum / S^[J]; end; Tmp^[J] := Sum; end; for J := Lb to Ub2 do begin Sum := 0.0; for K := Lb to Ub2 do Sum := Sum + V^[J]^[K] * Tmp^[K]; X^[J] := Sum; end; DelVector(Tmp, Ub2); end; procedure SV_Approx(U : PMatrix; S : PVector; V : PMatrix; Lb, Ub1, Ub2 : Integer; A : PMatrix); var I, J, K : Integer; begin for I := Lb to Ub1 do for J := Lb to Ub2 do begin A^[I]^[J] := 0.0; for K := Lb to Ub2 do if S^[K] > 0.0 then A^[I]^[J] := A^[I]^[J] + U^[I]^[K] * V^[J]^[K]; end; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ustudind.pas0000664000175000017500000000300211326434466021477 0ustar michaelmichael{ ****************************************************************** Student t-test for independent samples ****************************************************************** } unit ustudind; interface uses utypes; procedure StudIndep(N1, N2 : Integer; M1, M2, S1, S2 : Float; var T : Float; var DoF : Integer); { ------------------------------------------------------------------ Student t-test for independent samples ------------------------------------------------------------------ Input parameters : N1, N2 = samples sizes M1, M2 = samples means S1, S2 = samples SD's (computed with StDev) Output parameters: T = Student's t DoF = degrees of freedom ------------------------------------------------------------------ } implementation procedure StudIndep(N1, N2 : Integer; M1, M2, S1, S2 : Float; var T : Float; var DoF : Integer); var V1, V2 : Float; { Sample variances } VarCom : Float; { Estimate of common variance } begin V1 := Sqr(S1); V2 := Sqr(S2); DoF := N1 + N2 - 2; if (N1 >= 30) and (N2 >= 30) then T := (M1 - M2) / Sqrt(V1 / N1 + V2 / N2) else begin VarCom := ((N1 - 1) * V1 + (N2 - 1) * V2) / DoF; T := (M1 - M2) / Sqrt(VarCom / N1 + VarCom / N2); end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ustrings.pas0000664000175000017500000002050611326434466021526 0ustar michaelmichael{ ****************************************************************** Pascal string routines ****************************************************************** } unit ustrings; interface uses utypes; function LTrim(S : String) : String; { ------------------------------------------------------------------ Removes leading blanks ------------------------------------------------------------------ } function RTrim(S : String) : String; { ------------------------------------------------------------------ Removes trailing blanks ------------------------------------------------------------------ } function Trim(S : String) : String; { ------------------------------------------------------------------ Removes leading and trailing blanks ------------------------------------------------------------------ } function StrChar(N : Byte; C : Char) : String; { ------------------------------------------------------------------ Returns a string made of character C repeated N times ------------------------------------------------------------------ } function RFill(S : String; L : Byte) : String; { ------------------------------------------------------------------ Completes string S with trailing blanks for a total length L ------------------------------------------------------------------ } function LFill(S : String; L : Byte) : String; { ------------------------------------------------------------------ Completes string S with leading blanks for a total length L ------------------------------------------------------------------ } function CFill(S : String; L : Byte) : String; { ------------------------------------------------------------------ Completes string S with leading blanks to center the string on a total length L ------------------------------------------------------------------ } function Replace(S : String; C1, C2 : Char) : String; { ------------------------------------------------------------------ Replaces in string S all the occurences of character C1 by character C2 ------------------------------------------------------------------ } function Extract(S : String; var Index : Byte; Delim : Char) : String; { ------------------------------------------------------------------ Extracts a field from a string. Index is the position of the first character of the field. Delim is the character used to separate fields (e.g. blank, comma or tabulation). Blanks immediately following Delim are ignored. Index is updated to the position of the next field. ------------------------------------------------------------------ } procedure Parse(S : String; Delim : Char; Field : PStrVector; var N : Byte); { ------------------------------------------------------------------ Parses a string into its constitutive fields. Delim is the field separator. The number of fields is returned in N. The fields are returned in Field^[0]..Field^[N - 1]. Field must be dimensioned in the calling program. ------------------------------------------------------------------ } procedure SetFormat(NumLength, MaxDec : Integer; FloatPoint, NSZero : Boolean); { ------------------------------------------------------------------ Sets the numeric format NumLength = Length of numeric field MaxDec = Max. number of decimal places FloatPoint = True for floating point notation NSZero = True to write non significant zero's ------------------------------------------------------------------ } function FloatStr(X : Float) : String; { ------------------------------------------------------------------ Converts a real to a string according to the numeric format ------------------------------------------------------------------ } function IntStr(N : LongInt) : String; { ------------------------------------------------------------------ Converts an integer to a string ------------------------------------------------------------------ } function CompStr(Z : Complex) : String; { ------------------------------------------------------------------ Converts a complex number to a string ------------------------------------------------------------------ } implementation const gNumLength : Integer = 10; gMaxDec : Integer = 4; gFloatPoint : Boolean = False; gNSZero : Boolean = False; function LTrim(S : String) : String; begin if S <> '' then repeat if S[1] = ' ' then Delete(S, 1, 1); until S[1] <> ' '; LTrim := S; end; function RTrim(S : String) : String; var L1 : Byte; begin if S <> '' then repeat L1 := Length(S); if S[L1] = ' ' then Delete(S, L1, 1); until S[L1] <> ' '; RTrim := S; end; function Trim(S : String) : String; begin Trim := LTrim(RTrim(S)); end; function StrChar(N : Byte; C : Char) : String; var I : Byte; S : String; begin S := ''; for I := 1 to N do S := S + C; StrChar := S; end; function RFill(S : String; L : Byte) : String; var L1 : Byte; begin L1 := Length(S); if L1 >= L then RFill := S else RFill := S + StrChar(L - L1, ' '); end; function LFill(S : String; L : Byte) : String; var L1 : Byte; begin L1 := Length(S); if L1 >= L then LFill := S else LFill := StrChar(L - L1, ' ') + S; end; function CFill(S : String; L : Byte) : String; var L1 : Byte; begin L1 := Length(S); if L1 >= L then CFill := S else CFill := StrChar((L - L1) div 2, ' ') + S; end; function Replace(S : String; C1, C2 : Char) : String; var S1 : String; K : Byte; begin S1 := S; K := Pos(C1, S1); while K > 0 do begin S1[K] := C2; K := Pos(C1, S1); end; Replace := S1; end; function Extract(S : String; var Index : Byte; Delim : Char) : String; var I, L : Byte; begin I := Index; L := Length(S); { Search for Delim } while (I <= L) and (S[I] <> Delim) do Inc(I); { Extract field } if I = Index then Extract := '' else Extract := Copy(S, Index, I - Index); { Skip blanks after Delim } repeat Inc(I); until (I > L) or (S[I] <> ' '); { Update Index } Index := I; end; procedure Parse(S : String; Delim : Char; Field : PStrVector; var N : Byte); var I, Index, L : Byte; begin I := 0; Index := 1; L := Length(S); repeat Field^[I] := Extract(S, Index, Delim); Inc(I); until Index > L; N := I; end; procedure SetFormat(NumLength, MaxDec : Integer; FloatPoint, NSZero : Boolean); begin if (NumLength >= 1) and (NumLength <= 80) then gNumLength := NumLength; if (MaxDec >= 0) and (MaxDec <= 20) then gMaxDec := MaxDec; gFloatPoint := FloatPoint; gNSZero := NSZero; end; function RemZero(S : String) : String; var I : Integer; S1, S2 : String; C : Char; begin I := Pos('.', S); if I = 0 then begin RemZero := S; Exit end; I := Pos('E', S); if I = 0 then I := Pos('e', S); if I > 0 then begin S1 := Copy(S, 1, I - 1); S2 := Copy(S, I, Length(S) - I + 1) end else begin S1 := S; S2 := '' end; repeat I := Length(S1); C := S1[I]; if (C = '0') or (C = '.') then S1 := Copy(S1, 1, I - 1) until C <> '0'; RemZero := S1 + S2 end; function FloatStr(X : Float) : String; var S : String; begin if gFloatPoint then begin Str(X:Pred(gNumLength), S); S := ' ' + S; end else Str(X:gNumLength:gMaxDec, S); if not gNSZero then S := RemZero(S); FloatStr := S; end; function IntStr(N : LongInt) : String; var S : String; begin Str(N:(gNumLength - gMaxDec - 1), S); IntStr := S; end; function CompStr(Z : Complex) : String; var S : String; begin if Z.Y >= 0.0 then S := ' + ' else S := ' - '; CompStr := FloatStr(Z.X) + S + FloatStr(Abs(Z.Y)) + ' * i'; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ustdpair.pas0000664000175000017500000000305511326434466021503 0ustar michaelmichael{ ****************************************************************** Student t-test for paired samples ****************************************************************** } unit ustdpair; interface uses utypes, uminmax, umeansd; procedure StudPaired(X, Y : PVector; Lb, Ub : Integer; var T : Float; var DoF : Integer); { ------------------------------------------------------------------ Student t-test for paired samples ------------------------------------------------------------------ Input parameters : X, Y = samples Lb, Ub = lower and upper bounds Output parameters: T = Student's t DoF = degrees of freedom ------------------------------------------------------------------ } implementation procedure StudPaired(X, Y : PVector; Lb, Ub : Integer; var T : Float; var DoF : Integer); var D : PVector; { Differences between samples } MD, SD : Float; { Mean & std.dev. of differences } N : Integer; { Sample size } I : Integer; { Loop variable } begin DimVector(D, Ub); for I := Lb to Ub do D^[I] := X^[I] - Y^[I]; MD := Mean(D, Lb, Ub); SD := StDev(D, Lb, Ub, MD); if SD = 0.0 then begin T := Sgn(MD) * MaxNum; SetErrCode(FSing); end; DoF := Ub - Lb; { N - 1 } N := DoF + 1; T := MD * Sqrt(N) / SD; DelVector(D, Ub); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/usnedeco.pas0000664000175000017500000000261411326434466021455 0ustar michaelmichael{ ****************************************************************** Snedecor's F-test (comparison of two variances) ****************************************************************** } unit usnedeco; interface uses utypes; procedure Snedecor(N1, N2 : Integer; S1, S2 : Float; var F : Float; var DoF1, DoF2 : Integer); { ------------------------------------------------------------------ Snedecor's F-test (comparison of two variances) ------------------------------------------------------------------ Input parameters : N1, N2 = samples sizes S1, S2 = samples SD's (computed with StDev) Output parameters: F = Snedecor's F DoF1, DoF2 = degrees of freedom ------------------------------------------------------------------ } implementation procedure Snedecor(N1, N2 : Integer; S1, S2 : Float; var F : Float; var DoF1, DoF2 : Integer); var V1, V2 : Float; { Sample variances } begin V1 := Sqr(S1); V2 := Sqr(S2); if V1 > V2 then begin F := V1 / V2; DoF1 := N1 - 1; DoF2 := N2 - 1; end else begin F := V2 / V1; DoF1 := N2 - 1; DoF2 := N1 - 1; end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uskew.pas0000664000175000017500000000200111326434466020774 0ustar michaelmichael{ ****************************************************************** Skewness and kurtosis ****************************************************************** } unit uskew; interface uses utypes; function Skewness(X : PVector; Lb, Ub : Integer; M, Sigma : Float) : Float; function Kurtosis(X : PVector; Lb, Ub : Integer; M, Sigma : Float) : Float; implementation function Skewness(X : PVector; Lb, Ub : Integer; M, Sigma : Float) : Float; var S, T : Float; I : Integer; begin S := 0.0; for I := Lb to Ub do begin T := (X^[I] - M) / Sigma; S := S + T * Sqr(T); end; Skewness := S / (Ub - Lb + 1); end; function Kurtosis(X : PVector; Lb, Ub : Integer; M, Sigma : Float) : Float; var S, T : Float; I : Integer; begin S := 0.0; for I := Lb to Ub do begin T := (X^[I] - M) / Sigma; S := S + Sqr(Sqr(T)); end; Kurtosis := S / (Ub - Lb + 1) - 3.0; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/usimplex.pas0000664000175000017500000001541511326434466021521 0ustar michaelmichael{ ****************************************************************** Function minimization by the simplex method ****************************************************************** } unit usimplex; interface uses utypes; procedure SaveSimplex(FileName : string); { ------------------------------------------------------------------ Opens a file to save the Simplex iterations ------------------------------------------------------------------ } procedure Simplex(Func : TFuncNVar; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float); { ------------------------------------------------------------------ Minimization of a function of several variables by the simplex method of Nelder and Mead ------------------------------------------------------------------ Input parameters : Func = objective function X = initial minimum coordinates Lbound, Ubound = indices of first and last variables MaxIter = maximum number of iterations Tol = required precision ------------------------------------------------------------------ Output parameters : X = refined minimum coordinates F_min = function value at minimum ------------------------------------------------------------------ The function MathErr returns one of the following codes: OptOk = no error OptNonConv = non-convergence ------------------------------------------------------------------ } implementation const WriteLogFile : Boolean = False; var LogFile : Text; procedure SaveSimplex(FileName : string); begin Assign(LogFile, FileName); Rewrite(LogFile); WriteLogFile := True; end; procedure Simplex(Func : TFuncNVar; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float); const Step = 1.50; { Step used to construct the initial simplex } var P : PMatrix; { Simplex coordinates } F : PVector; { Function values } Pbar : PVector; { Centroid coordinates } Pstar, P2star : PVector; { New vertices } Ystar, Y2star : Float; { New function values } F0 : Float; { Function value at minimum } N : Integer; { Number of parameters } M : Integer; { Index of last vertex } L, H : Integer; { Vertices with lowest & highest F values } I, J : Integer; { Loop variables } Iter : Integer; { Iteration count } Corr, MaxCorr : Float; { Corrections } Sum : Float; Flag : Boolean; procedure UpdateSimplex(Y : Float; Q : PVector); { Update "worst" vertex and function value } var J : Integer; begin F^[H] := Y; for J := Lb to Ub do P^[H]^[J] := Q^[J]; end; begin { Quit if no iteration required } if MaxIter < 1 then begin F_min := Func(X); SetErrCode(OptOk); Exit; end; if WriteLogFile then begin WriteLn(LogFile, 'Simplex'); WriteLn(LogFile, 'Iter F'); end; N := Ub - Lb + 1; M := Ub + 1; DimMatrix(P, M, Ub); DimVector(F, M); DimVector(Pbar, Ub); DimVector(Pstar, Ub); DimVector(P2star, Ub); Iter := 1; F0 := MaxNum; { Construct initial simplex } for I := Lb to M do for J := Lb to Ub do P^[I]^[J] := X^[J]; for I := Lb to Ub do P^[I]^[I] := P^[I]^[I] * Step; { Evaluate function at each vertex } for I := Lb to M do F^[I] := Func(P^[I]); repeat { Find vertices (L,H) having the lowest and highest function values, i.e. "best" and "worst" vertices } L := Lb; H := Lb; for I := Lb + 1 to M do if F^[I] < F^[L] then L := I else if F^[I] > F^[H] then H := I; if F^[L] < F0 then F0 := F^[L]; if WriteLogFile then WriteLn(LogFile, Iter:4, ' ', F0:12); { Find centroid of points other than P(H) } for J := Lb to Ub do begin Sum := 0.0; for I := Lb to M do if I <> H then Sum := Sum + P^[I]^[J]; Pbar^[J] := Sum / N; end; { Reflect worst vertex through centroid } for J := Lb to Ub do Pstar^[J] := 2.0 * Pbar^[J] - P^[H]^[J]; Ystar := Func(Pstar); { If reflection successful, try extension } if Ystar < F^[L] then begin for J := Lb to Ub do P2star^[J] := 3.0 * Pstar^[J] - 2.0 * Pbar^[J]; Y2star := Func(P2star); { Retain extension or contraction } if Y2star < F^[L] then UpdateSimplex(Y2star, P2star) else UpdateSimplex(Ystar, Pstar); end else begin I := Lb; Flag := False; repeat if (I <> H) and (F^[I] > Ystar) then Flag := True; Inc(I); until Flag or (I > M); if Flag then UpdateSimplex(Ystar, Pstar) else begin { Contraction on the reflection side of the centroid } if Ystar <= F^[H] then UpdateSimplex(Ystar, Pstar); { Contraction on the opposite side of the centroid } for J := Lb to Ub do P2star^[J] := 0.5 * (P^[H]^[J] + Pbar^[J]); Y2star := Func(P2star); if Y2star <= F^[H] then UpdateSimplex(Y2star, P2star) else { Contract whole simplex } for I := Lb to M do for J := Lb to Ub do P^[I]^[J] := 0.5 * (P^[I]^[J] + P^[L]^[J]); end; end; { Test convergence } MaxCorr := 0.0; for J := Lb to Ub do begin Corr := Abs(P^[H]^[J] - P^[L]^[J]); if Corr > MaxCorr then MaxCorr := Corr; end; Inc(Iter); until (MaxCorr < Tol) or (Iter > MaxIter); for J := Lb to Ub do X^[J] := P^[L]^[J]; F_min := F^[L]; DelMatrix(P, M, Ub); DelVector(F, M); DelVector(Pbar, Ub); DelVector(Pstar, Ub); DelVector(P2star, Ub); if WriteLogFile then Close(LogFile); if Iter > MaxIter then SetErrCode(OptNonConv) else SetErrCode(OptOk); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/usimann.pas0000664000175000017500000002326711326434466021331 0ustar michaelmichael{ ****************************************************************** Optimization by Simulated Annealing ****************************************************************** Adapted from Fortran program SIMANN by Bill Goffe: http://www.netlib.org/opt/simann.f ****************************************************************** } unit usimann; interface uses utypes, urandom, umedian; procedure InitSAParams(NT, NS, NCycles : Integer; RT : Float); { ------------------------------------------------------------------ Initialize simulated annealing parameters ------------------------------------------------------------------ NT : Number of loops at constant temperature NS : Number of loops before step adjustment NCycles : Number of cycles RT : Temperature reduction factor ------------------------------------------------------------------ } procedure SA_CreateLogFile(FileName : String); { ------------------------------------------------------------------ Initialize log file ------------------------------------------------------------------ } procedure SimAnn(Func : TFuncNVar; X, Xmin, Xmax : PVector; Lb, Ub : Integer; var F_min : Float); { ------------------------------------------------------------------ Minimization of a function of several var. by simulated annealing ------------------------------------------------------------------ Input parameters : Func = objective function to be minimized X = initial minimum coordinates Xmin = minimum value of X Xmax = maximum value of X Lb, Ub = indices of first and last variables ------------------------------------------------------------------ Output parameter : X = refined minimum coordinates F_min = function value at minimum ------------------------------------------------------------------ } implementation { Log file headers } const Hdr1 = 'Simulated annealing: Cycle '; Hdr2 = 'Iter T F Inc Acc'; const SA_NT : Integer = 5; { Number of loops at constant temperature } SA_NS : Integer = 15; { Number of loops before step adjustment } SA_RT : Float = 0.9; { Temperature reduction factor } SA_NCycles : Integer = 1; { Number of cycles } WriteLogFile : Boolean = False; var LogFile : Text; procedure InitSAParams(NT, NS, NCycles : Integer; RT : Float); begin if NT > 0 then SA_NT := NT; if NS > 0 then SA_NS := NS; if NCycles > 1 then SA_NCycles := NCycles; if (RT > 0.0) and (RT < 1.0) then SA_RT := RT; end; procedure SA_CreateLogFile(FileName : String); begin Assign(LogFile, FileName); Rewrite(LogFile); WriteLogFile := True; end; function InitTemp(Func : TFuncNVar; X, Xmin, Range : PVector; Lb, Ub : Integer) : Float; { ------------------------------------------------------------------ Computes the initial temperature so that the probability of accepting an increase of the function is about 0.5 ------------------------------------------------------------------ } const N_EVAL = 50; { Number of function evaluations } var F, F1 : Float; { Function values } DeltaF : PVector; { Function increases } N_inc : Integer; { Number of function increases } I : Integer; { Index of function evaluation } K : Integer; { Index of parameter } begin DimVector(DeltaF, N_EVAL); N_inc := 0; F := Func(X); { Compute N_EVAL function values, changing each parameter in turn } K := Lb; for I := 1 to N_EVAL do begin X^[K] := Xmin^[K] + RanGen3 * Range^[K]; F1 := Func(X); if F1 > F then begin Inc(N_inc); DeltaF^[N_inc] := F1 - F; end; F := F1; Inc(K); if K > Ub then K := Lb; end; { The median M of these N_inc increases has a probability of 1/2. From Boltzmann's formula: Exp(-M/T) = 1/2 ==> T = M / Ln(2) } if N_inc > 0 then InitTemp := Median(DeltaF, 1, N_inc, False) * InvLn2 else InitTemp := 1.0; DelVector(DeltaF, N_EVAL); end; function Accept(DeltaF, T : Float; var N_inc, N_acc : Integer) : Boolean; { ---------------------------------------------------------------------- Checks if a variation DeltaF of the function at temperature T is acceptable. Updates the counters N_inc (number of increases of the function) and N_acc (number of accepted increases). ---------------------------------------------------------------------- } var X : Float; begin if DeltaF < 0.0 then begin Accept := True; Exit; end; Inc(N_inc); X := DeltaF / T; if X > MaxLog then { Exp(- X) ~ 0 } begin Accept := False; Exit; end; if Exp(- X) > RanGen3 then begin Accept := True; Inc(N_acc); end else Accept := False; end; procedure SimAnnCycle(Func : TFuncNVar; X, Xmin, Xmax : PVector; Lb, Ub : Integer; var F_min : Float); { ------------------------------------------------------------------ Performs one cycle of simulated annealing ------------------------------------------------------------------ } const SFact = 2.0; { Factor for step reduction } MinTemp = 1.0E-30; { Min. temperature } MinFunc = 1.0E-30; { Min. function value } var I, Iter, J, K, N_inc, N_acc : Integer; F, F1, DeltaF, Ratio, T, OldX : Float; Range, DeltaX, Xopt : PVector; Nacc : PIntVector; begin DimVector(Range, Ub); DimVector(DeltaX, Ub); DimVector(Xopt, Ub); DimIntVector(Nacc, Ub); { Determine parameter range, step and optimum } for K := Lb to Ub do begin Range^[K] := Xmax^[K] - Xmin^[K]; DeltaX^[K] := 0.5 * Range^[K]; Xopt^[K] := X^[K]; end; { Initialize function values } F := Func(X); F_min := F; { Initialize temperature and iteration count } T := InitTemp(Func, X, Xmin, Range, Lb, Ub); Iter := 0; repeat N_inc := 0; N_acc := 0; { Perform SA_NT evaluations at constant temperature } for I := 1 to SA_NT do begin for J := 1 to SA_NS do for K := Lb to Ub do begin { Save current parameter value } OldX := X^[K]; { Pick new value, keeping it within Range } X^[K] := X^[K] + (2.0 * RanGen3 - 1.0) * DeltaX^[K]; if (X^[K] < Xmin^[K]) or (X^[K] > Xmax^[K]) then X^[K] := Xmin^[K] + RanGen3 * Range^[K]; { Compute new function value } F1 := Func(X); DeltaF := F1 - F; { Check for acceptance } if Accept(DeltaF, T, N_inc, N_acc) then begin Inc(Nacc^[K]); F := F1; end else { Restore parameter value } X^[K] := OldX; { Update minimum if necessary } if F < F_min then begin Xopt^[K] := X^[K]; F_min := F; end; end; { Ajust step length to maintain an acceptance ratio of about 50% for each parameter } for K := Lb to Ub do begin Ratio := Nacc^[K] / SA_NS; if Ratio > 0.6 then begin { Increase step length, keeping it within Range } DeltaX^[K] := DeltaX^[K] * (1.0 + ((Ratio - 0.6) / 0.4) * SFact); if DeltaX^[K] > Range^[K] then DeltaX^[K] := Range^[K]; end else if Ratio < 0.4 then { Reduce step length } DeltaX^[K] := DeltaX^[K] / (1.0 + ((0.4 - Ratio) / 0.4) * SFact); { Restore counter } Nacc^[K] := 0; end; end; if WriteLogFile then WriteLn(LogFile, Iter:4, ' ', T:12, ' ', F:12, N_inc:6, N_acc:6); { Update temperature and iteration count } T := T * SA_RT; Inc(Iter); until (N_acc = 0) or (T < MinTemp) or (Abs(F_min) < MinFunc); for K := Lb to Ub do X^[K] := Xopt^[K]; DelVector(Range, Ub); DelVector(DeltaX, Ub); DelVector(Xopt, Ub); DelIntVector(Nacc, Ub); end; procedure SimAnn(Func : TFuncNVar; X, Xmin, Xmax : PVector; Lb, Ub : Integer; var F_min : Float); var Cycle : Integer; begin SetErrCode(OptOk); { Initialize the random number generator using the standard Pascal generator } Randomize; InitGen(Trunc(Random * 1.0E+8)); for Cycle := 1 to SA_NCycles do begin if WriteLogFile then begin WriteLn(LogFile, Hdr1, Cycle); WriteLn(LogFile); WriteLn(LogFile, Hdr2); end; SimAnnCycle(Func, X, Xmin, Xmax, Lb, Ub, F_min); end; if WriteLogFile then begin Close(LogFile); WriteLogFile := False; end; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/usecant.pas0000664000175000017500000000212711326434466021311 0ustar michaelmichael{ ****************************************************************** Secant method for nonlinear equation ****************************************************************** } unit usecant; interface uses utypes; procedure Secant (Func : TFunc; var X, Y : Float; MaxIter : Integer; Tol : Float; var F : Float); implementation procedure Secant (Func : TFunc; var X, Y : Float; MaxIter : Integer; Tol : Float; var F : Float); var Iter : Integer; G, Z : Float; begin Iter := 0; SetErrCode(OptOk); repeat F := Func(X); if MaxIter < 1 then Exit; G := Func(Y); Iter := Iter + 1; if (F = G) or (Iter > MaxIter) then begin SetErrCode(OptNonConv); Exit; end; Z := (X * G - Y * F) / (G - F); X := Y; Y := Z; until Abs(X - Y) < Tol * (Abs(X) + Abs(Y)); X := 0.5 * (X + Y); F := Func(X); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/urtpol4.pas0000664000175000017500000000671111326434466021263 0ustar michaelmichael{ ****************************************************************** Quartic equation ****************************************************************** } unit urtpol4; interface uses utypes, urtpol2, urtpol3; function RootPol4(Coef : PVector; Z : PCompVector) : Integer; { ------------------------------------------------------------------ Solves the quartic equation: Coef^[0] + Coef^[1] * X + Coef^[2] * X^2 + Coef^[3] * X^3 + Coef^[4] * X^4 = 0 ------------------------------------------------------------------ } implementation function RootPol4(Coef : PVector; Z : PCompVector) : Integer; var A, AA, B, C, D : Float; Q , R , S : Float; K , KK, L, M : Float; I, N1, N2 : Integer; Cf : PVector; Z1, Z2 : PCompVector; function HighestRealRoot(Deg : Integer; Z : PCompVector) : Float; { Find the highest real root among the roots of a polynomial } var I : Integer; R : Float; begin R := - MaxNum; for I := 1 to Deg do if (Z^[I].Y = 0.0) and (Z^[I].X > R) then R := Z^[I].X; HighestRealRoot := R; end; begin for I := 1 to 4 do begin Z^[I].X := 0.0; Z^[I].Y := 0.0; end; if Coef^[4] = 0 then begin RootPol4 := RootPol3(Coef, Z); Exit; end; DimVector(Cf, 3); if Coef^[0] = 0.0 then begin { 0 is root. Equation becomes cubic } Cf^[0] := Coef^[1]; Cf^[1] := Coef^[2]; Cf^[2] := Coef^[3]; { Solve cubic equation } RootPol4 := RootPol3(Cf, Z) + 1; DelVector(Cf, 3); Exit; end; if Coef^[4] = 1.0 then begin A := Coef^[3] * 0.25; B := Coef^[2]; C := Coef^[1]; D := Coef^[0]; end else begin A := Coef^[3] / Coef^[4] * 0.25; B := Coef^[2] / Coef^[4]; C := Coef^[1] / Coef^[4]; D := Coef^[0] / Coef^[4]; end; AA := A * A; Q := B - 6.0 * AA; R := C + A * (8.0 * AA - 2.0 * B); S := D - A * C + AA * (B - 3.0 * AA); { Compute coefficients of cubic equation } Cf^[3] := 1.0; Cf^[2] := 0.5 * Q; Cf^[1] := 0.25 * (Sqr(Cf^[2]) - S); { Solve cubic equation and set KK = highest real root } if (R = 0.0) and (Cf^[1] < 0.0) then begin { Eq. becomes quadratic with 2 real roots } Cf^[0] := Cf^[1]; Cf^[1] := Cf^[2]; Cf^[2] := 1.0; N1 := RootPol2(Cf, Z); KK := HighestRealRoot(2, Z); end else begin Cf^[0] := - 0.015625 * Sqr(R); N1 := RootPol3(Cf, Z); KK := HighestRealRoot(3, Z); end; K := Sqrt(KK); if K = 0.0 then R := Sqrt(Sqr(Q) - 4.0 * S) else begin Q := Q + 4.0 * KK; R := 0.5 * R / K; end; L := 0.5 * (Q - R); M := 0.5 * (Q + R); { Solve quadratic equation: Y^2 + 2KY + L = 0 } DimCompVector(Z1, 2); Cf^[0] := L; Cf^[1] := 2.0 * K; Cf^[2] := 1.0; N1 := RootPol2(Cf, Z1); { Solve quadratic equation: Z^2 - 2KZ + M = 0 } DimCompVector(Z2, 2); Cf^[0] := M; Cf^[1] := -Cf^[1]; N2 := RootPol2(Cf, Z2); { Transfer roots into vectors Xr and Xi } Z^[1].X := Z1^[1].X - A; Z^[1].Y := Z1^[1].Y; Z^[2].X := Z1^[2].X - A; Z^[2].Y := Z1^[2].Y; Z^[3].X := Z2^[1].X - A; Z^[3].Y := Z2^[1].Y; Z^[4].X := Z2^[2].X - A; Z^[4].Y := Z2^[2].Y; RootPol4 := N1 + N2; DelVector(Cf, 3); DelCompVector(Z1, 2); DelCompVector(Z2, 2); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/urtpol3.pas0000664000175000017500000000507611326434466021265 0ustar michaelmichael{ ****************************************************************** Cubic equation ****************************************************************** } unit urtpol3; interface uses utypes, urtpol2; function RootPol3(Coef : PVector; Z : PCompVector) : Integer; { ------------------------------------------------------------------ Solves the cubic equation: Coef^[0] + Coef^[1] * X + Coef^[2] * X^2 + Coef^[3] * X^3 = 0 ------------------------------------------------------------------ } implementation function RootPol3(Coef : PVector; Z : PCompVector) : Integer; const OneThird = 0.333333333333333333; { 1 / 3 } TwoPiDiv3 = 2.09439510239319549; { 2 Pi / 3 } Sqrt3Div2 = 0.866025403784438647; { Sqrt(3) / 2 } var A, AA, B, C : Float; Q, QQQ, R, RR : Float; S, T, U : Float; I : Integer; Cf : PVector; begin for I := 1 to 3 do begin Z^[I].X := 0.0; Z^[I].Y := 0.0; end; if Coef^[3] = 0.0 then begin RootPol3 := RootPol2(Coef, Z); Exit; end; if Coef^[0] = 0.0 then begin DimVector(Cf, 2); { 0 is root. Equation becomes quadratic } Cf^[0] := Coef^[1]; Cf^[1] := Coef^[2]; Cf^[2] := Coef^[3]; { Solve quadratic equation } RootPol3 := RootPol2(Cf, Z) + 1; DelVector(Cf, 2); Exit; end; if Coef^[3] = 1.0 then begin A := Coef^[2] * OneThird; B := Coef^[1]; C := Coef^[0]; end else begin A := Coef^[2] / Coef^[3] * OneThird; B := Coef^[1] / Coef^[3]; C := Coef^[0] / Coef^[3]; end; AA := A * A; Q := AA - OneThird * B; R := A * (AA - 0.5 * B) + 0.5 * C; RR := Sqr(R); QQQ := Q * Sqr(Q); if RR < QQQ then { 3 real roots } begin RootPol3 := 3; S := Sqrt(Q); T := R / (Q * S); T := PiDiv2 - ArcTan(T / Sqrt(1.0 - T * T)); { ArcCos(T) } T := OneThird * T; S := - 2.0 * S; Z^[1].X := S * Cos(T) - A; Z^[2].X := S * Cos(T + TwoPiDiv3) - A; Z^[3].X := S * Cos(T - TwoPiDiv3) - A; end else { 1 real root } begin RootPol3 := 1; S := Abs(R) + Sqrt(RR - QQQ); if S > 0.0 then S := Exp(OneThird * Ln(S)); if R > 0.0 then S := - S; if S = 0.0 then T := 0.0 else T := Q / S; U := S + T; Z^[1].X := U - A; { Real root } Z^[2].X := - 0.5 * U - A; Z^[2].Y := Sqrt3Div2 * Abs(S - T); Z^[3].X := Z^[2].X; Z^[3].Y := - Z^[2].Y; end; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/urtpol2.pas0000664000175000017500000000367411326434466021266 0ustar michaelmichael{ ****************************************************************** Quadratic equation ****************************************************************** } unit urtpol2; interface uses utypes, urtpol1; function RootPol2(Coef : PVector; Z : PCompVector) : Integer; { ------------------------------------------------------------------ Solves the quadratic equation: Coef^[0] + Coef^[1] * X + Coef^[2] * X^2 = 0 ------------------------------------------------------------------ } implementation function RootPol2(Coef : PVector; Z : PCompVector) : Integer; var Delta, F, Q : Float; begin Z^[1].X := 0.0; Z^[1].Y := 0.0; Z^[2].X := 0.0; Z^[2].Y := 0.0; if Coef^[2] = 0.0 then begin RootPol2 := RootPol1(Coef^[0], Coef^[1], Z^[1].X); Exit; end; if Coef^[0] = 0.0 then begin { 0 is root. Eq. becomes linear } if RootPol1(Coef^[1], Coef^[2], Z^[1].X) = 1 then { Linear eq. has 1 solution } RootPol2 := 2 else { Linear eq. is undetermined or impossible } RootPol2 := 1; Exit; end; Delta := Sqr(Coef^[1]) - 4.0 * Coef^[0] * Coef^[2]; { 2 real roots } if Delta > 0.0 then begin RootPol2 := 2; { Algorithm for minimizing roundoff errors } { See `Numerical Recipes' } if Coef^[1] >= 0.0 then Q := - 0.5 * (Coef^[1] + Sqrt(Delta)) else Q := - 0.5 * (Coef^[1] - Sqrt(Delta)); Z^[1].X := Q / Coef^[2]; Z^[2].X := Coef^[0] / Q; Exit; end; { Double real root } if Delta = 0.0 then begin RootPol2 := 2; Z^[1].X := - 0.5 * Coef^[1] / Coef^[2]; Z^[2].X := Z^[1].X; Exit; end; { 2 complex roots } RootPol2 := 0; F := 0.5 / Coef^[2]; Z^[1].X := - F * Coef^[1]; Z^[1].Y := Abs(F) * Sqrt(- Delta); Z^[2].X := Z^[1].X; Z^[2].Y := - Z^[1].Y; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/urtpol1.pas0000664000175000017500000000164611326434466021262 0ustar michaelmichael{ ****************************************************************** Linear equation ****************************************************************** } unit urtpol1; interface uses utypes; function RootPol1(A, B : Float; var X : Float) : Integer; { ------------------------------------------------------------------ Solves the linear equation A + B * X = 0 Returns 1 if no error (B <> 0) -1 if X is undetermined (A = B = 0) -2 if no solution (A <> 0, B = 0) ------------------------------------------------------------------ } implementation function RootPol1(A, B : Float; var X : Float) : Integer; begin X := 0.0; if B <> 0.0 then begin if A <> 0.0 then X := - A / B; RootPol1 := 1; Exit; end; if A = 0.0 then { 0 + 0X = 0 } RootPol1 := - 1 else { A + 0X = 0 } RootPol1 := - 2; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uround.pas0000664000175000017500000000236111326434466021163 0ustar michaelmichael{ ****************************************************************** Rounding functions Based on FreeBASIC version contributed by R. Keeling ****************************************************************** } unit uround; interface uses utypes, uminmax, umath; function RoundN(X : Float; N : Integer) : Float; { Rounds X to N decimal places } function Ceil(X : Float) : Integer; { Ceiling function } function Floor(X : Float) : Integer; { Floor function } implementation function RoundN (X : Float; N : Integer) : Float; const MaxRoundPlaces = 18; var ReturnAnswer, Dec_Place : Float; I : Integer; begin if (N >= 0) and (N < MaxRoundPlaces) then I := N else I := 0; Dec_Place := Exp10(I); ReturnAnswer := Int((Abs(X) * Dec_Place) + 0.5); RoundN := Sgn(X) * ReturnAnswer / Dec_Place; end; function Ceil(X : Float) : Integer; var ReturnAnswer : Integer; begin ReturnAnswer := Trunc(X); if ReturnAnswer < X then ReturnAnswer := ReturnAnswer + 1; Ceil := ReturnAnswer; end; function Floor(X : Float) : Integer; var ReturnAnswer : Integer; begin ReturnAnswer := Trunc(X); if ReturnAnswer > X then ReturnAnswer := ReturnAnswer - 1; Floor := ReturnAnswer; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/urootpol.pas0000664000175000017500000000312511326434466021531 0ustar michaelmichael{ ****************************************************************** Roots of a polynomial from the companion matrix ****************************************************************** } unit urootpol; interface uses utypes, ubalance, uhqr; function RootPol(Coef : PVector; Deg : Integer; Z : PCompVector) : Integer; { ------------------------------------------------------------------ Solves the polynomial equation: Coef(0) + Coef(1) * Z + Coef(2) * Z^2 + ... + Coef(Deg) * Z^Deg = 0 ------------------------------------------------------------------ } implementation function RootPol(Coef : PVector; Deg : Integer; Z : PCompVector) : Integer; var Lo, Hi : Integer; { Used by Balance } I, J : Integer; { Loop variables } Nr : Integer; { Number of real roots } A : PMatrix; { Companion matrix } Scale : PVector; { Used by Balance } begin { Dimension arrays } DimMatrix(A, Deg, Deg); DimVector(Scale, Deg); { Set up the companion matrix } for J := 1 to Deg do A^[1]^[J] := - Coef^[Deg - J] / Coef^[Deg]; for I := 2 to Deg do for J := 1 to Deg do if I - 1 = J then A^[I]^[J] := 1.0 else A^[I]^[J] := 0.0; { The roots of the polynomial are the eigenvalues of the companion matrix } Balance(A, 1, Deg, Lo, Hi, Scale); Hqr(A, 1, Deg, Lo, Hi, Z); if MathErr <> 0 then begin RootPol := MathErr; Exit; end; { Count real roots } Nr := 0; for I := 1 to Deg do if Z^[I].Y = 0.0 then Nr := Nr + 1; RootPol := Nr end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/urkf.pas0000664000175000017500000005073611326434466020627 0ustar michaelmichael{ ****************************************************************** Numerical integration of a system of differential equations by the Runge-Kutta-Fehlberg (RKF) method. Adapted from a Fortran-90 program available at: http://www.csit.fsu.edu/~burkardt/f_src/rkf45/rkf45.f90 ****************************************************************** } unit urkf; interface uses utypes, uminmax; procedure RKF45(F : TDiffEqs; Neqn : Integer; Y, Yp : PVector; var T : Float; Tout, RelErr, AbsErr : Float; var Flag : Integer); implementation const maxeqn : Integer = 0; flag_save : Integer = -1000; init : Integer = -1000; kflag : Integer = -1000; kop : Integer = -1; nfe : Integer = -1; relerr_save : Float = -1.0; abserr_save : Float = -1.0; h : Float = -1.0; f1 : PVector = nil; f2 : PVector = nil; f3 : PVector = nil; f4 : PVector = nil; f5 : PVector = nil; procedure Fehl(F : TDiffEqs; Neqn : Integer; Y : PVector; T, H : Float; Yp, F1, F2, F3, F4, F5, S : PVector); { ------------------------------------------------------------------ Fehl takes one Fehlberg fourth-fifth order step (double precision). Discussion: This routine integrates a system of Neqn first order ordinary differential equations of the form dY(i)/dT = F(T,Y(1:Neqn)) where the initial values Y and the initial derivatives YP are specified at the starting point T. The routine advances the solution over the fixed step H and returns the fifth order (sixth order accurate locally) solution approximation at T+H in array S. The formulas have been grouped to control loss of significance. The routine should be called with an H not smaller than 13 units of roundoff in T so that the various independent arguments can be distinguished. Modified: 27 March 2004 Author: H A Watts and L F Shampine, Sandia Laboratories, Albuquerque, New Mexico. Reference: E. Fehlberg, Low-order Classical Runge-Kutta Formulas with Stepsize Control, NASA Technical Report R-315. L F Shampine, H A Watts, S Davenport, Solving Non-stiff Ordinary Differential Equations - The State of the Art, SIAM Review, Volume 18, pages 376-411, 1976. Parameters: Input, external F, a user-supplied subroutine to evaluate the derivatives Y'(T), of the form: procedure(X : Float; Y, D : PVector); Input, Neqn, the number of equations to be integrated. Input, Y(Neqn), the current value of the dependent variable. Input, T, the current value of the independent variable. Input, H, the step size to take. Input, YP(Neqn), the current value of the derivative of the dependent variable. Output, F1(Neqn), F2(Neqn), F3(Neqn), F4(Neqn), F5(Neqn), derivative values needed for the computation. Output, S(Neqn), the estimate of the solution at T+H. ------------------------------------------------------------------ } const C1 = 3.0 / 32.0; C2 = 3.0 / 8.0; C3 = 1.0 / 2197.0; C4 = 12.0 / 13.0; C5 = 1.0 / 4104.0; C6 = 1.0 / 20520.0; C7 = 1.0 / 7618050.0; var ch : Float; i : Integer; begin ch := 0.25 * h; for i := 1 to neqn do f5^[i] := y^[i] + ch * yp^[i]; f(t + ch, f5, f1); ch := C1 * h; for i := 1 to neqn do f5^[i] := y^[i] + ch * (yp^[i] + 3.0 * f1^[i]); f(t + C2 * h, f5, f2); ch := C3 * h; for i := 1 to neqn do f5^[i] := y^[i] + ch * (1932.0 * yp^[i] + (7296.0 * f2^[i] - 7200.0 * f1^[i])); f(t + C4 * h, f5, f3); ch := C5 * h; for i := 1 to neqn do f5^[i] := y^[i] + ch * ((8341.0 * yp^[i] - 845.0 * f3^[i]) + (29440.0 * f2^[i] - 32832.0 * f1^[i])); f(t + h, f5, f4); ch := C6 * h; for i := 1 to neqn do f1^[i] := y^[i] + ch * ((-6080.0 * yp^[i] + (9295.0 * f3^[i] - 5643.0 * f4^[i])) + (41040.0 * f1^[i] - 28352.0 * f2^[i])); f(t + 0.5 * h, f1, f5); { Ready to compute the approximate solution at T+H. } ch := C7 * h; for i := 1 to neqn do s^[i] := y^[i] + ch * ((902880.0 * yp^[i] + (3855735.0 * f3^[i] - 1371249.0 * f4^[i])) + (3953664.0 * f2^[i] + 277020.0 * f5^[i])); end; procedure ReDim_Arrays(neqn : Integer); { Redimensions global arrays if necessary } begin DelVector(f1, maxeqn); DelVector(f2, maxeqn); DelVector(f3, maxeqn); DelVector(f4, maxeqn); DelVector(f5, maxeqn); maxeqn := neqn; DimVector(f1, maxeqn); DimVector(f2, maxeqn); DimVector(f3, maxeqn); DimVector(f4, maxeqn); DimVector(f5, maxeqn); end; procedure RKF45(F : TDiffEqs; Neqn : Integer; Y, Yp : PVector; var T : Float; Tout, RelErr, AbsErr : Float; var Flag : Integer); { ------------------------------------------------------------------ RKF45 carries out the Runge-Kutta-Fehlberg method (double precision). Discussion: This routine is primarily designed to solve non-stiff and mildly stiff differential equations when derivative evaluations are inexpensive. It should generally not be used when the user is demanding high accuracy. This routine integrates a system of Neqn first-order ordinary differential equations of the form: dY(i)/dT = F(T,Y(1),Y(2),...,Y(Neqn)) where the Y(1:Neqn) are given at T. Typically the subroutine is used to integrate from T to TOUT but it can be used as a one-step integrator to advance the solution a single step in the direction of TOUT. On return, the parameters in the call list are set for continuing the integration. The user has only to call again (and perhaps define a new value for TOUT). Before the first call, the user must * supply the subroutine F(T,Y,YP) to evaluate the right hand side; and declare F in an EXTERNAL statement; * initialize the parameters: Neqn, Y(1:Neqn), T, TOUT, RELERR, ABSERR, FLAG. In particular, T should initially be the starting point for integration, Y should be the value of the initial conditions, and FLAG should normally be +1. Normally, the user only sets the value of FLAG before the first call, and thereafter, the program manages the value. On the first call, FLAG should normally be +1 (or -1 for single step mode.) On normal return, FLAG will have been reset by the program to the value of 2 (or -2 in single step mode), and the user can continue to call the routine with that value of FLAG. (When the input magnitude of FLAG is 1, this indicates to the program that it is necessary to do some initialization work. An input magnitude of 2 lets the program know that that initialization can be skipped, and that useful information was computed earlier.) The routine returns with all the information needed to continue the integration. If the integration reached TOUT, the user need only define a new TOUT and call again. In the one-step integrator mode, returning with FLAG = -2, the user must keep in mind that each step taken is in the direction of the current TOUT. Upon reaching TOUT, indicated by the output value of FLAG switching to 2, the user must define a new TOUT and reset FLAG to -2 to continue in the one-step integrator mode. In some cases, an error or difficulty occurs during a call. In that case, the output value of FLAG is used to indicate that there is a problem that the user must address. These values include: * 3, integration was not completed because the input value of RELERR, the relative error tolerance, was too small. RELERR has been increased appropriately for continuing. If the user accepts the output value of RELERR, then simply reset FLAG to 2 and continue. * 4, integration was not completed because more than MAXNFE derivative evaluations were needed. This is approximately (MAXNFE/6) steps. The user may continue by simply calling again. The function counter will be reset to 0, and another MAXNFE function evaluations are allowed. * 5, integration was not completed because the solution vanished, making a pure relative error test impossible. The user must use a non-zero ABSERR to continue. Using the one-step integration mode for one step is a good way to proceed. * 6, integration was not completed because the requested accuracy could not be achieved, even using the smallest allowable stepsize. The user must increase the error tolerances ABSERR or RELERR before continuing. It is also necessary to reset FLAG to 2 (or -2 when the one-step integration mode is being used). The occurrence of FLAG = 6 indicates a trouble spot. The solution is changing rapidly, or a singularity may be present. It often is inadvisable to continue. * 7, it is likely that this routine is inefficient for solving this problem. Too much output is restricting the natural stepsize choice. The user should use the one-step integration mode with the stepsize determined by the code. If the user insists upon continuing the integration, reset FLAG to 2 before calling again. Otherwise, execution will be terminated. * 8, invalid input parameters, indicates one of the following: Neqn <= 0; T = TOUT and |FLAG| /= 1; RELERR < 0 or ABSERR < 0; FLAG == 0 or FLAG < -2 or 8 < FLAG. Modified: 27 March 2004 Author: H A Watts and L F Shampine, Sandia Laboratories, Albuquerque, New Mexico. Reference: E. Fehlberg, Low-order Classical Runge-Kutta Formulas with Stepsize Control, NASA Technical Report R-315. L F Shampine, H A Watts, S Davenport, Solving Non-stiff Ordinary Differential Equations - The State of the Art, SIAM Review, Volume 18, pages 376-411, 1976. Parameters: Input, external F, a user-supplied subroutine to evaluate the derivatives Y (T), of the form: sub f ( t as double, y() as double, yp() as double ) Input, Neqn, the number of equations to be integrated. Input/output, Y(Neqn), the current solution vector at T. Input/output, YP(Neqn), the current value of the derivative of the dependent variable. The user should not set or alter this information Input/output, T, the current value of the independent variable. Input, TOUT, the output point at which solution is desired. TOUT = T is allowed on the first call only, in which case the routine returns with FLAG = 2 if continuation is possible. Input, RELERR, ABSERR, the relative and absolute error tolerances for the local error test. At each step the code requires: abs ( local error ) <= RELERR * abs ( Y ) + ABSERR for each component of the local error and the solution vector Y. RELERR cannot be "too small". If the routine believes RELERR has been set too small, it will reset RELERR to an acceptable value and return immediately for user action. Input/output, FLAG, indicator for status of integration. On the first call, set FLAG to +1 for normal use, or to -1 for single step mode. On return, a value of 2 or -2 indicates normal progress, while any other value indicates a problem that should be addressed. ------------------------------------------------------------------ } const remin = 1.0E-12; maxnfe = 3000; var k, mflag : Integer; ae, dt, ee, eeoet, esttol, et : Float; hmin, relerr_min, s, scale, tol, toln, ypk : Float; hfaild, outp : Boolean; label Cont, Done; begin { Check the input parameters. } if (neqn < 1) or (relerr < 0) or (abserr < 0) or ((flag = 0) or (flag > 8) or (flag < -2)) then begin flag := 8; exit; end; mflag := abs(flag); { Is this a continuation call? } if mflag <> 1 then begin if (t = tout) and (kflag <> 3) then begin flag := 8; exit; end; if mflag = 2 then begin if kflag = 3 then begin flag := flag_save; mflag := abs(flag) end else if init = 0 then flag := flag_save else if kflag = 4 then nfe := 0 else if (kflag = 5) and (abserr = 0) then exit else if (kflag = 6) and (relerr <= relerr_save) and (abserr <= abserr_save) then exit; end else { FLAG = 3, 4, 5, 6, 7 or 8. } begin if flag = 3 then begin flag := flag_save; if kflag = 3 then mflag := abs(flag) end else if flag = 4 then begin nfe := 0; flag := flag_save; if kflag = 3 then mflag := abs(flag) end else if (flag = 5) and (abserr > 0) then begin flag := flag_save; if kflag = 3 then mflag := abs(flag) end else { Integration cannot be continued because the user did not } exit; { respond to the instructions pertaining to FLAG = 5,6,7,8 } end; end; { Save the input value of FLAG. } { Set the continuation flag KFLAG for subsequent input checking. } flag_save := flag; kflag := 0; { Save RELERR and ABSERR for checking input on subsequent calls. } relerr_save := relerr; abserr_save := abserr; { Restrict the relative error tolerance to be at least 2 * EPS + REMIN to avoid limiting precision difficulties arising from impossible accuracy requests. } relerr_min := 2 * MachEp + remin; { Is the relative error tolerance too small? } if relerr < relerr_min then begin relerr := relerr_min; flag := 3; kflag := 3; exit end; dt := tout - t; { Initialization: Set the initialization completion indicator, INIT; set the indicator for too many output points, KOP; evaluate the initial derivatives; set the counter for function evaluations, NFE; estimate the starting stepsize. } if mflag = 1 then begin init := 0; kop := 0; f(t, y, yp); nfe := 1; if t = tout then begin flag := 2; exit; end; end; if init = 0 then begin init := 1; h := abs(dt); toln := 0; for k := 1 to neqn do begin tol := relerr * abs (y^[k]) + abserr; if tol > 0 then begin toln := tol; ypk := abs(yp^[k]); if tol < ypk * h * h * h * h * h then h := Exp(0.2 * Ln(tol / ypk)); end end; if toln <= 0 then h := 0; h := FMax(h, 26 * MachEp * FMax(abs(t), abs(dt))); flag_save := sgn(flag) * 2 end; { Set the stepsize for integration in the direction from T to TOUT. } h := sgn(dt) * abs(h); { Test to see if too may output points are being requested. } if 2 * abs(dt) <= abs(h) then kop := kop + 1; { Unnecessary frequency of output. } if kop = 100 then begin kop := 0; flag := 7; exit end; { If we are too close to the output point, then simply extrapolate and return. } if abs(dt) <= 26 * MachEp * abs(t) then begin t := tout; for k := 1 to neqn do y^[k] := y^[k] + dt * yp^[k]; f(t, y, yp); nfe := nfe + 1; flag := 2; exit end; { Initialize the output point indicator. } outp := False; { To avoid premature underflow in the error tolerance function, scale the error tolerances. } scale := 2 / relerr; ae := scale * abserr; { Redimension global arrays if necessary } if neqn > maxeqn then ReDim_Arrays(neqn); { Step by step integration. } repeat hfaild := False; { Set the smallest allowable stepsize. } hmin := 26 * MachEp * abs(t); { Adjust the stepsize if necessary to hit the output point. Look ahead two steps to avoid drastic changes in the stepsize and thus lessen the impact of output points on the code. } dt := tout - t; if 2.0 * abs(h) > abs(dt) then begin { Will the next successful step complete the integration to the output point? } if abs(dt) <= abs(h) then begin outp := True; h := dt end else h := 0.5 * dt; end; { Here begins the core integrator for taking a single step. The tolerances have been scaled to avoid premature underflow in computing the error tolerance function ET. To avoid problems with zero crossings, relative error is measured using the average of the magnitudes of the solution at the beginning and end of a step. The error estimate formula has been grouped to control loss of significance. To distinguish the various arguments, H is not permitted to become smaller than 26 units of roundoff in T. Practical limits on the change in the stepsize are enforced to smooth the stepsize selection process and to avoid excessive chattering on problems having discontinuities. To prevent unnecessary failures, the code uses 9/10 the stepsize it estimates will succeed. After a step failure, the stepsize is not allowed to increase for the next attempted step. This makes the code more efficient on problems having discontinuities and more effective in general since local extrapolation is being used and extra caution seems warranted. Test the number of derivative function evaluations. If okay, try to advance the integration from T to T+H. } repeat { Have we done too much work? } if maxnfe < nfe then begin flag := 4; kflag := 4; exit end; { Advance an approximate solution over one step of length H. } Fehl(f, neqn, y, t, h, yp, f1, f2, f3, f4, f5, f1); nfe := nfe + 5; { Compute and test allowable tolerances versus local error estimates and remove scaling of tolerances. The relative error is measured with respect to the average of the magnitudes of the solution at the beginning and end of the step. } eeoet := 0; for k := 1 to neqn do begin et := abs(y^[k]) + abs(f1^[k]) + ae; if et <= 0 then begin flag := 5; exit end; ee := abs((-2090.0 * yp^[k] + (21970.0 * f3^[k] - 15048.0 * f4^[k])) + (22528.0 * f2^[k] - 27360.0 * f5^[k])); eeoet := FMax(eeoet, ee / et); end; esttol := abs(h) * eeoet * scale / 752400.0; if esttol <= 1 then goto Cont; { Unsuccessful step. Reduce the stepsize, try again. The decrease is limited to a factor of 1/10. } hfaild := True; outp := False; if esttol < 59049.0 then s := 0.9 / Exp(0.2 * Ln(esttol)) else s := 0.1; h := s * h; if abs(h) < hmin then begin flag := 6; kflag := 6; exit; end; until False; { We exited the loop because we took a successful step. Store the solution for T+H, and evaluate the derivative there. } Cont: t := t + h; for k := 1 to neqn do y^[k] := f1^[k]; f(t, y, yp); nfe := nfe + 1; { Choose the next stepsize. The increase is limited to a factor of 5. If the step failed, the next stepsize is not allowed to increase. } if 0.0001889568 < esttol then s := 0.9 / Exp(0.2 * Ln(esttol)) else s := 5.0; if hfaild then s := FMin(s, 1.0); h := sgn(h) * FMax(s * abs(h), hmin); { End of core integrator Should we take another step? } if outp then begin t := tout; flag := 2; exit end; if flag <= 0 then goto Done; until False; { One step integration mode. } Done: flag := -2; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uregtest.pas0000664000175000017500000001242111326434466021507 0ustar michaelmichael{ ****************************************************************** Test of regression ****************************************************************** } unit uregtest; interface uses utypes, umeansd; procedure RegTest(Y, Ycalc : PVector; LbY, UbY : Integer; V : PMatrix; LbV, UbV : Integer; var Test : TRegTest); { ------------------------------------------------------------------ Test of unweighted regression ------------------------------------------------------------------ Input parameters: Y, Ycalc = observed and calculated Y values LbY, UbY = bounds of Y and Ycalc V = inverse matrix LbV, UbV = bounds of V Output parameters: V = variance-covariance matrix Test = test results ------------------------------------------------------------------ } procedure WRegTest(Y, Ycalc, S : PVector; LbY, UbY : Integer; V : PMatrix; LbV, UbV : Integer; var Test : TRegTest); { ------------------------------------------------------------------ Test of weighted regression ------------------------------------------------------------------ Additional input parameter: S = standard deviations of observations ------------------------------------------------------------------ } implementation procedure RegTest(Y, Ycalc : PVector; LbY, UbY : Integer; V : PMatrix; LbV, UbV : Integer; var Test : TRegTest); var Ybar : Float; { Average Y value } D : Float; { Difference } SSt : Float; { Total sum of squares } SSe : Float; { Explained sum of squares } SSr : Float; { Residual sum of squares } Nobs : Integer; { Number of observations } Npar : Integer; { Number of fitted parameters } I, J, K : Integer; { Loop variables } begin Nobs := UbY - LbY + 1; Npar := UbV - LbV + 1; if Nobs <= Npar then begin SetErrCode(MatSing); Exit; end; SetErrCode(MatOk); Ybar := Mean(Y, LbY, UbY); SSt := 0.0; SSe := 0.0; SSr := 0.0; for K := LbY to UbY do begin D := Y^[K] - Ybar; SSt := SSt + Sqr(D); D := Ycalc^[K] - Ybar; SSe := SSe + Sqr(D); D := Y^[K] - Ycalc^[K]; SSr := SSr + Sqr(D); end; with Test do begin Nu1 := Npar - 1; Nu2 := Nobs - Npar; R2 := SSe / SSt; R2a := 1.0 - (1.0 - R2) * (Nobs - 1) / Nu2; Vr := SSr / Nu2; if Vr = 0.0 then F := MaxNum else F := (SSe / Nu1) / Vr; end; { Compute variance-covariance matrix } for I := LbV to UbV do for J := I to UbV do V^[I]^[J] := V^[I]^[J] * Test.Vr; for I := Succ(LbV) to UbV do for J := LbV to Pred(I) do V^[I]^[J] := V^[J]^[I]; end; procedure WRegTest(Y, Ycalc, S : PVector; LbY, UbY : Integer; V : PMatrix; LbV, UbV : Integer; var Test : TRegTest); var Ybar : Float; { Average Y value } D : Float; { Difference } SW, SWY : Float; { Statistical sums } SSt : Float; { Total sum of squares } SSe : Float; { Explained sum of squares } SSr : Float; { Residual sum of squares } Nobs : Integer; { Number of observations } Npar : Integer; { Number of fitted parameters } I, J, K : Integer; { Loop variables } W : PVector; { Weights } begin Nobs := UbY - LbY + 1; Npar := UbV - LbV + 1; if Nobs <= Npar then begin SetErrCode(MatSing); Exit; end; DimVector(W, UbY); SW := 0.0; SWY := 0.0; for K := LbY to UbY do begin if S^[K] <= 0.0 then begin SetErrCode(MatSing); DelVector(W, UbY); Exit; end; W^[K] := 1.0 / Sqr(S^[K]); SW := SW + W^[K]; SWY := SWY + W^[K] * Y^[K]; end; Ybar := SWY / SW; SetErrCode(MatOk); SSt := 0.0; SSe := 0.0; SSr := 0.0; for K := LbY to UbY do begin D := Y^[K] - Ybar; SSt := SSt + W^[K] * Sqr(D); D := Ycalc^[K] - Ybar; SSe := SSe + W^[K] * Sqr(D); D := Y^[K] - Ycalc^[K]; SSr := SSr + W^[K] * Sqr(D); end; with Test do begin Nu1 := Npar - 1; Nu2 := Nobs - Npar; R2 := SSe / SSt; R2a := 1.0 - (1.0 - R2) * (Nobs - 1) / Nu2; Vr := SSr / Nu2; if Vr = 0.0 then F := MaxNum else F := (SSe / Nu1) / Vr; end; { Compute variance-covariance matrix } for I := LbV to UbV do for J := I to UbV do V^[I]^[J] := V^[I]^[J] * Test.Vr; for I := Succ(LbV) to UbV do for J := LbV to Pred(I) do V^[I]^[J] := V^[J]^[I]; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uranuvag.pas0000664000175000017500000000542711326434466021505 0ustar michaelmichael{ ****************************************************************** UVAG The Universal Virtual Array Generator by Alex Hay zenjew@hotmail.com Adapted to TPMath by Jean Debord ****************************************************************** In practice, Cardinal (6-7 times the output of Word) is the IntType of choice, but to demonstrate UVAG's scalability here, IntType can be defined as any integer data type. IRanUVAG globally provides (as rndint) an effectively infinite sequence of IntTypes, uniformly distributed (0, 2^(8*sizeof(IntType))-1). Output (bps) is dependent solely on IntSize=sizeof(IntType) and CPU speed. UVAG cycles at twice the speed of the 64-bit Mersenne Twister in a tenth the memory, tests well in DIEHARD, ENT and NIST and has a huge period. It is suitable for cryptographic purposes in that state(n) is not determinable from state(n+1). Most attractive is that it uses integers of any size and requires an array of only 255 + sizeof(IntType) bytes. Thus it is easily adapted to 128 bits and beyond with negligible memory increase. Lastly, seeding is easy. From near zero entropy (s[]=0, rndint > 0), UVAG bootstraps itself to full entropy in under 300 cycles. Very robust, no bad seeds. ****************************************************************** } unit uranuvag; interface type IntType = LongInt; procedure InitUVAGbyString(KeyPhrase : string); { Initializes the generator with a string } procedure InitUVAG(Seed : IntType); { Initializes the generator with an integer } function IRanUVAG : IntType; { Returns a 32-bit random integer } implementation const IntSize = SizeOf(IntType); type TByteArray = array[0..(255 + IntSize)] of Byte; var s : TByteArray; sp : ^IntType; { Pointer to random IntType somewhere in s } sindex : Byte; rndint : IntType; procedure InitUVAGbyString(KeyPhrase : string); var i, kindex, lk : Word; temp, tot : Byte; begin lk := Length(KeyPhrase); kindex := 1; tot := 0; { Initialize array } for i := 0 to 255 do s[i] := i; for i := 256 to (255 + IntSize) do s[i] := i - 256; { Shuffle array on keyphrase } for i := 0 to (255 + IntSize) do begin tot := tot + Ord(KeyPhrase[kindex]); temp := s[i]; s[i] := s[tot]; s[tot] := temp; kindex := kindex + 1; if kindex > lk then kindex := 1; { wrap around key } end; sindex := s[0]; rndint := 0 end; procedure InitUVAG(Seed : IntType); var S : string; begin Str(Seed, S); InitUVAGbyString(S); end; function IRanUVAG : IntType; begin sindex := sindex + 1; sp := @s[s[sindex]]; sp^ := sp^ + rndint; rndint := rndint + sp^; IRanUVAG := rndint end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uranmwc.pas0000664000175000017500000000225511326434466021325 0ustar michaelmichael{ ****************************************************************** Marsaglia's Multiply-With-Carry random number generator ****************************************************************** } unit uranmwc; interface procedure InitMWC(Seed : LongInt); { ------------------------------------------------------------------ Initializes the 'Multiply with carry' random number generator. ------------------------------------------------------------------ } function IRanMWC : LongInt; { ------------------------------------------------------------------ Returns a 32 bit random number in [-2^31 ; 2^31-1] ------------------------------------------------------------------ } implementation var X1, X2 : LongInt; { Uniform random integers } C1, C2 : LongInt; { Carries } procedure InitMWC(Seed : LongInt); begin X1 := Seed shr 16; X2 := Seed and 65535; C1 := 0; C2 := 0; end; function IRanMWC : LongInt; var Y1, Y2 : LongInt; begin Y1 := 18000 * X1 + C1; X1 := Y1 and 65535; C1 := Y1 shr 16; Y2 := 30903 * X2 + C2; X2 := Y2 and 65535; C2 := Y2 shr 16; IRanMWC := (X1 shl 16) + (X2 and 65535); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uranmult.pas0000664000175000017500000000363711326434466021525 0ustar michaelmichael{ ****************************************************************** Multinormal distribution ****************************************************************** } unit uranmult; interface uses utypes, urangaus; procedure RanMult(M : PVector; L : PMatrix; Lb, Ub : Integer; X : PVector); { ------------------------------------------------------------------ Generates a random vector X from a multinormal distribution. M is the mean vector, L is the Cholesky factor (lower triangular) of the variance-covariance matrix. ------------------------------------------------------------------ } procedure RanMultIndep(M, S : PVector; Lb, Ub : Integer; X : PVector); { ------------------------------------------------------------------ Generates a random vector X from a multinormal distribution with uncorrelated variables. M is the mean vector, S is the vector of standard deviations. ------------------------------------------------------------------ } implementation procedure RanMult(M : PVector; L : PMatrix; Lb, Ub : Integer; X : PVector); var I, J : Integer; U : PVector; begin { Form a vector U of independent standard normal variates } DimVector(U, Ub); for I := Lb to Ub do U^[I] := RanGaussStd; { Form X = M + L * U, which follows the multinormal distribution } for I := Lb to Ub do begin X^[I] := M^[I]; for J := Lb to I do X^[I] := X^[I] + L^[I]^[J] * U^[J] end; DelVector(U, Ub); end; procedure RanMultIndep(M, S : PVector; Lb, Ub : Integer; X : PVector); var I : Integer; begin for I := Lb to Ub do X^[I] := RanGauss(M^[I], S^[I]) end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uranmt.pas0000664000175000017500000001322011326434466021151 0ustar michaelmichael{ ****************************************************************** Mersenne Twister Random Number Generator ****************************************************************** A C-program for MT19937, with initialization improved 2002/1/26. Coded by Takuji Nishimura and Makoto Matsumoto. Adapted for TPMath by Jean Debord - Feb. 2007 Before using, initialize the state by using init_genrand(seed) or init_by_array(init_key, key_length) (respectively InitMT and InitMTbyArray in the TPMath version) Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Any feedback is very welcome. http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) ****************************************************************** } unit uranmt; interface type MTKeyArray = array[0..623] of LongInt; procedure InitMT(Seed : LongInt); { Initializes MT generator with a seed } procedure InitMTbyArray(InitKey : MTKeyArray; KeyLength : Word); { Initialize MT generator with an array InitKey[0..(KeyLength - 1)] } function IRanMT : LongInt; { Generates a Random number on [-2^31 .. 2^31 - 1] interval } implementation const N = 624; M = 397; MATRIX_A = $9908b0df; { constant vector a } UPPER_MASK = $80000000; { most significant w-r bits } LOWER_MASK = $7fffffff; { least significant r bits } mag01 : array[0..1] of LongInt = (0, MATRIX_A); var mt : MTKeyArray; { the array for the state vector } mti : Word; { mti == N+1 means mt[N] is not initialized } procedure InitMT(Seed : LongInt); var i : Word; begin mt[0] := Seed and $ffffffff; for i := 1 to N-1 do begin mt[i] := (1812433253 * (mt[i-1] Xor (mt[i-1] shr 30)) + i); { See Knuth TAOCP Vol2. 3rd Ed. P.106 For multiplier. In the previous versions, MSBs of the seed affect only MSBs of the array mt[]. 2002/01/09 modified by Makoto Matsumoto } mt[i] := mt[i] and $ffffffff; { For >32 Bit machines } end; mti := N; end; procedure InitMTbyArray(InitKey : MTKeyArray; KeyLength : Word); var i, j, k, k1 : Word; begin InitMT(19650218); i := 1; j := 0; if N > KeyLength then k1 := N else k1 := KeyLength; for k := k1 downto 1 do begin mt[i] := (mt[i] Xor ((mt[i-1] Xor (mt[i-1] shr 30)) * 1664525)) + InitKey[j] + j; { non linear } mt[i] := mt[i] and $ffffffff; { for WORDSIZE > 32 machines } i := i + 1; j := j + 1; if i >= N then begin mt[0] := mt[N-1]; i := 1; end; if j >= KeyLength then j := 0; end; for k := N-1 downto 1 do begin mt[i] := (mt[i] Xor ((mt[i-1] Xor (mt[i-1] shr 30)) * 1566083941)) - i; { non linear } mt[i] := mt[i] and $ffffffff; { for WORDSIZE > 32 machines } i := i + 1; if i >= N then begin mt[0] := mt[N-1]; i := 1; end; end; mt[0] := $80000000; { MSB is 1; assuring non-zero initial array } end; function IRanMT : LongInt; var y : LongInt; k : Word; begin if mti >= N then { generate N words at one Time } begin { If IRanMT() has not been called, a default initial seed is used } if mti = N + 1 then InitMT(5489); for k := 0 to (N-M)-1 do begin y := (mt[k] and UPPER_MASK) or (mt[k+1] and LOWER_MASK); mt[k] := mt[k+M] xor (y shr 1) xor mag01[y and $1]; end; for k := (N-M) to (N-2) do begin y := (mt[k] and UPPER_MASK) or (mt[k+1] and LOWER_MASK); mt[k] := mt[k - (N - M)] xor (y shr 1) xor mag01[y and $1]; end; y := (mt[N-1] and UPPER_MASK) or (mt[0] and LOWER_MASK); mt[N-1] := mt[M-1] xor (y shr 1) xor mag01[y and $1]; mti := 0; end; y := mt[mti]; mti := mti + 1; { Tempering } y := y xor (y shr 11); y := y xor ((y shl 7) and $9d2c5680); y := y xor ((y shl 15) and $efc60000); y := y xor (y shr 18); IRanMT := y end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/urangaus.pas0000664000175000017500000000270311326434466021474 0ustar michaelmichael{ ****************************************************************** Gaussian random numbers ****************************************************************** } unit urangaus; interface uses utypes, urandom; function RanGaussStd : Float; { ------------------------------------------------------------------ Computes 2 random numbers from the standard normal distribution, returns one and saves the other for the next call ------------------------------------------------------------------ } function RanGauss(Mu, Sigma : Float) : Float; { ------------------------------------------------------------------ Returns a random number from a Gaussian distribution with mean Mu and standard deviation Sigma ------------------------------------------------------------------ } implementation const GaussSave : Float = 0.0; { Saves a Gaussian number } GaussNew : Boolean = True; { Flags a new calculation } function RanGaussStd : Float; var R, Theta : Float; begin if GaussNew then begin R := Sqrt(-2.0 * Ln(RanGen3)); Theta := TwoPi * RanGen3; RanGaussStd := R * Cos(Theta); { Return 1st number } GaussSave := R * Sin(Theta); { Save 2nd number } end else RanGaussStd := GaussSave; { Return saved number } GaussNew := not GaussNew; end; function RanGauss(Mu, Sigma : Float) : Float; begin RanGauss := Mu + Sigma * RanGaussStd; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/urandom.pas0000664000175000017500000000434211326434466021315 0ustar michaelmichael{ ****************************************************************** Random number generators ****************************************************************** } unit urandom; interface uses utypes, uranmwc, uranmt, uranuvag; procedure SetRNG(RNG : RNG_Type); { Select generator and set default initialization } procedure InitGen(Seed : LongInt); { Initialize generator } function IRanGen : LongInt; { 32-bit random integer in [-2^31 .. 2^31 - 1] } function IRanGen31 : LongInt; { 31-bit random integer in [0 .. 2^31 - 1] } function RanGen1 : Float; { 32-bit random real in [0,1] } function RanGen2 : Float; { 32-bit random real in [0,1) } function RanGen3 : Float; { 32-bit random real in (0,1) } function RanGen53 : Float; { 53-bit random real in [0,1) } implementation const Z = 1.0 / 4294967296.0; { 1 / 2^32 } Z1 = 1.0 / 4294967295.0; { 1 / (2^32 - 1) } Z2 = 1.0 / 9007199254740992.0; var gRNG : RNG_Type; procedure SetRNG(RNG : RNG_Type); var InitMT : MTKeyArray; begin gRNG := RNG; case gRNG of RNG_MWC : InitMWC(118105245); RNG_MT : begin InitMT[0] := $123; InitMT[1] := $234; InitMT[2] := $345; InitMT[3] := $456; InitMTbyArray(InitMT, 4); end; RNG_UVAG : InitUVAGbyString('abcd'); end; end; procedure InitGen(Seed : LongInt); begin case gRNG of RNG_MWC : InitMWC(Seed); RNG_MT : InitMT(Seed); RNG_UVAG : InitUVAG(Seed); end; end; function IRanGen : LongInt; begin case gRNG of RNG_MWC : IRanGen := IRanMWC; RNG_MT : IRanGen := IRanMT; RNG_UVAG : IRanGen := IRanUVAG; end; end; function IRanGen31 : LongInt; begin IRanGen31 := IRanGen shr 1; end; function RanGen1 : Float; begin RanGen1 := (IRanGen + 2147483648.0) * Z1 end; function RanGen2 : Float; begin RanGen2 := (IRanGen + 2147483648.0) * Z end; function RanGen3 : Float; begin RanGen3 := (IRanGen + 2147483648.5) * Z end; function RanGen53 : Float; var A, B : LongInt; begin A := IRanGen shr 5; B := IRanGen shr 6; RanGen53 := (A * 67108864.0 + B) * Z2; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uqsort.pas0000664000175000017500000000401511326434466021202 0ustar michaelmichael{ ****************************************************************** Quick sort ****************************************************************** } unit uqsort; interface uses utypes; procedure QSort(X : PVector; Lb, Ub : Integer); { ------------------------------------------------------------------ Sorts the elements of vector X in increasing order (quick sort) ------------------------------------------------------------------ } procedure DQSort(X : PVector; Lb, Ub : Integer); { ------------------------------------------------------------------ Sorts the elements of vector X in decreasing order (quick sort) ------------------------------------------------------------------ } implementation procedure QSort(X : PVector; Lb, Ub : Integer); { Quick sort in ascending order - Adapted from Borland's BP7 demo } procedure Sort(L, R : Integer); var I, J : Integer; U, V : Float; begin I := L; J := R; U := X^[(L + R) div 2]; repeat while X^[I] < U do I := I + 1; while U < X^[J] do J := J - 1; if I <= J then begin V := X^[I]; X^[I] := X^[J]; X^[J] := V; I := I + 1; J := J - 1; end; until I > J; if L < J then Sort(L, J); if I < R then Sort(I, R); end; begin Sort(Lb, Ub); end; procedure DQSort(X : PVector; Lb, Ub : Integer); { Quick sort in descending order - Adapted from Borland's BP7 demo } procedure Sort(L, R : Integer); var I, J : Integer; U, V : Float; begin I := L; J := R; U := X^[(L + R) div 2]; repeat while X^[I] > U do I := I + 1; while U > X^[J] do J := J - 1; if I <= J then begin V := X^[I]; X^[I] := X^[J]; X^[J] := V; I := I + 1; J := J - 1; end; until I > J; if L < J then Sort(L, J); if I < R then Sort(I, R); end; begin Sort(Lb, Ub); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uqr.pas0000664000175000017500000001077311326434466020464 0ustar michaelmichael{ ****************************************************************** QR decomposition Ref.: 'Matrix Computations' by Golub & Van Loan Pascal implementation contributed by Mark Vaughan ****************************************************************** } unit uqr; interface uses utypes; procedure QR_Decomp(A : PMatrix; Lb, Ub1, Ub2 : Integer; R : PMatrix); { ------------------------------------------------------------------ QR decomposition. Factors the matrix A (n x m, with n >= m) as a product Q * R where Q is a (n x m) column-orthogonal matrix, and R a (m x m) upper triangular matrix. This routine is used in conjunction with QR_Solve to solve a system of equations. ------------------------------------------------------------------ Input parameters : A = matrix Lb = index of first matrix element Ub1 = index of last matrix element in 1st dim. Ub2 = index of last matrix element in 2nd dim. ------------------------------------------------------------------ Output parameter : A = contains the elements of Q R = upper triangular matrix ------------------------------------------------------------------ Possible results : MatOk MatErrDim MatSing ------------------------------------------------------------------ NB : This procedure destroys the original matrix A ------------------------------------------------------------------ } procedure QR_Solve(Q, R : PMatrix; B : PVector; Lb, Ub1, Ub2 : Integer; X : PVector); { ------------------------------------------------------------------ Solves a system of equations by the QR decomposition, after the matrix has been transformed by QR_Decomp. ------------------------------------------------------------------ Input parameters : Q, R = matrices from QR_Decomp B = constant vector Lb, Ub1, Ub2 = as in QR_Decomp ------------------------------------------------------------------ Output parameter : X = solution vector ------------------------------------------------------------------ } implementation procedure QR_Decomp(A : PMatrix; Lb, Ub1, Ub2 : Integer; R : PMatrix); var I, J, K : Integer; Sum : Float; begin if Ub2 > Ub1 then begin SetErrCode(MatErrDim); Exit end; for K := Lb to Ub2 do begin { Compute the "k"th diagonal entry in R } Sum := 0.0; for I := Lb to Ub1 do Sum := Sum + Sqr(A^[I]^[K]); if Sum = 0.0 then begin SetErrCode(MatSing); Exit; end; R^[K]^[K] := Sqrt(Sum); { Divide the entries in the "k"th column of A by the computed "k"th } { diagonal element of R. this begins the process of overwriting A } { with Q . . . } for I := Lb to Ub1 do A^[I]^[K] := A^[I]^[K] / R^[K]^[K]; for J := (K + 1) to Ub2 do begin { Complete the remainder of the row entries in R } Sum := 0.0; for I := Lb to Ub1 do Sum := Sum + A^[I]^[K] * A^[I]^[J]; R^[K]^[J] := Sum; { Update the column entries of the Q/A matrix } for I := Lb to Ub1 do A^[I]^[J] := A^[I]^[J] - A^[I]^[K] * R^[K]^[J]; end; end; SetErrCode(MatOk); end; procedure QR_Solve(Q, R : PMatrix; B : PVector; Lb, Ub1, Ub2 : Integer; X : PVector); var I, J : Integer; Sum : Float; begin { Form Q'B and store the result in X } for J := Lb to Ub2 do begin X^[J] := 0.0; for I := Lb to Ub1 do X^[J] := X^[J] + Q^[I]^[J] * B^[I]; end; { Update X with the solution vector } X^[Ub2] := X^[Ub2] / R^[Ub2]^[Ub2]; for I := (Ub2 - 1) downto Lb do begin Sum := 0.0; for J := (I + 1) to Ub2 do Sum := Sum + R^[I]^[J] * X^[J]; X^[I] := (X^[I] - Sum) / R^[I]^[I]; end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/upolynom.pas0000664000175000017500000000304011326434466021524 0ustar michaelmichael{ ****************************************************************** Polynomials and rational fractions ****************************************************************** } unit upolynom; interface uses utypes; function Poly(X : Float; Coef : PVector; Deg : Integer) : Float; { ------------------------------------------------------------------ Evaluates the polynomial : P(X) = Coef[0] + Coef[1] * X + Coef[2] * X^2 + ... + Coef[Deg] * X^Deg ------------------------------------------------------------------ } function RFrac(X : Float; Coef : PVector; Deg1, Deg2 : Integer) : Float; { ------------------------------------------------------------------ Evaluates the rational fraction : Coef[0] + Coef[1] * X + ... + Coef[Deg1] * X^Deg1 F(X) = ----------------------------------------------------- 1 + Coef[Deg1+1] * X + ... + Coef[Deg1+Deg2] * X^Deg2 ------------------------------------------------------------------ } implementation function Poly(X : Float; Coef : PVector; Deg : Integer) : Float; var I : Integer; P : Float; begin P := Coef^[Deg]; for I := Pred(Deg) downto 0 do P := P * X + Coef^[I]; Poly := P; end; function RFrac(X : Float; Coef : PVector; Deg1, Deg2 : Integer) : Float; var I : Integer; P, Q : Float; begin P := Coef^[Deg1]; for I := Pred(Deg1) downto 0 do P := P * X + Coef^[I]; Q := 0.0; for I := (Deg1 + Deg2) downto Succ(Deg1) do Q := (Q + Coef^[I]) * X; RFrac := P / (1.0 + Q); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/upolutil.pas0000664000175000017500000000566111326434466021532 0ustar michaelmichael{ ****************************************************************** Utility functions to handle roots of polynomials ****************************************************************** } unit upolutil; interface uses utypes, uminmax; function SetRealRoots(Deg : Integer; Z : PCompVector; Tol : Float) : Integer; { ------------------------------------------------------------------ Set the imaginary part of a root to zero if it is less than a fraction Tol of its real part. This root is therefore considered real. The function returns the total number of real roots. ------------------------------------------------------------------ } procedure SortRoots(Deg : Integer; Z : PCompVector); { ------------------------------------------------------------------ Sort roots so that: (1) The Nr real roots are stored in elements [1..Nr] of vector Z, in increasing order. (2) The complex roots are stored in elements [(Nr + 1)..Deg] of vector Z and are unordered. ------------------------------------------------------------------ } implementation function SetRealRoots(Deg : Integer; Z : PCompVector; Tol : Float) : Integer; var I, N : Integer; begin for I := 1 to Deg do if (Z^[I].Y <> 0.0) and (Abs(Z^[I].Y) < Tol * Abs(Z^[I].X)) then Z^[I].Y := 0.0; { Count real roots } N := 0; for I := 1 to Deg do if Z^[I].Y = 0.0 then Inc(N); SetRealRoots := N; end; procedure SortRoots(Deg : Integer; Z : PCompVector); var I, J, K, Nr, Nc : Integer; R, X, Y : PVector; procedure Sort(X : PVector; N : Integer); { Sort vector X (insertion sort) } var I, J, K : Integer; A : Float; begin for I := 1 to Pred(N) do begin K := I; A := X^[I]; for J := Succ(I) to N do if X^[J] < A then begin K := J; A := X^[J]; end; FSwap(X^[I], X^[K]); end; end; begin { Count real and complex roots } Nr := 0; Nc := 0; for I := 1 to Deg do if Z^[I].Y = 0.0 then Inc(Nr) else Inc(Nc); DimVector(R, Nr); DimVector(X, Nc); DimVector(Y, Nc); { Store real roots in R and complex roots in (X,Y) } J := 0; K := 0; for I := 1 to Deg do if Z^[I].Y = 0.0 then begin Inc(J); R^[J] := Z^[I].X; end else begin Inc(K); X^[K] := Z^[I].X; Y^[K] := Z^[I].Y; end; { Sort vector R (insertion sort) } if Nr > 0 then Sort(R, Nr); { Transfer real roots into elements 1..Nr } for I := 1 to Nr do begin Z^[I].X := R^[I]; Z^[I].Y := 0.0; end; { Transfer complex roots into elements (Nr+1)..Deg } for I := 1 to Nc do begin J := I + Nr; Z^[J].X := X^[I]; Z^[J].Y := Y^[I]; end; DelVector(R, Nr); DelVector(X, Nc); DelVector(Y, Nc); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/upolfit.pas0000664000175000017500000001007511326434466021332 0ustar michaelmichael{ ****************************************************************** Polynomial regression : Y = B(0) + B(1) * X + B(2) * X^2 + ... ****************************************************************** } unit upolfit; interface uses utypes, ulineq; procedure PolFit(X, Y : PVector; Lb, Ub, Deg : Integer; B : PVector; V : PMatrix); { ------------------------------------------------------------------ Unweighted polynomial regression ------------------------------------------------------------------ Input parameters: X, Y = point coordinates Lb, Ub = array bounds Deg = degree of polynomial Output parameters: B = regression parameters V = inverse matrix ------------------------------------------------------------------ } procedure WPolFit(X, Y, S : PVector; Lb, Ub, Deg : Integer; B : PVector; V : PMatrix); { ------------------------------------------------------------------ Weighted polynomial regression ------------------------------------------------------------------ Additional input parameter: S = standard deviations of observations ------------------------------------------------------------------ } implementation procedure PolFit(X, Y : PVector; Lb, Ub, Deg : Integer; B : PVector; V : PMatrix); var I, I1, J, K, D1 : Integer; XI, Det : Float; begin if Ub - Lb < Deg then begin SetErrCode(MatErrDim); Exit; end; { Initialize } for I := 0 to Deg do begin for J := 0 to Deg do V^[I]^[J] := 0.0; B^[I] := 0.0; end; V^[0]^[0] := Ub - Lb + 1; for K := Lb to Ub do begin XI := X^[K]; { x^i } B^[0] := B^[0] + Y^[K]; V^[0]^[1] := V^[0]^[1] + XI; B^[1] := B^[1] + XI * Y^[K]; for I := 2 to Deg do begin XI := XI * X^[K]; V^[0]^[I] := V^[0]^[I] + XI; { First line of matrix: 1 --> x^d } B^[I] := B^[I] + XI * Y^[K]; { Constant vector: y --> x^d.y } end; for I := 1 to Deg do begin XI := XI * X^[K]; V^[I]^[Deg] := V^[I]^[Deg] + XI; { Last col. of matrix: x^d --> x^2d } end; end; { Fill lower matrix } D1 := Deg - 1; for I := 1 to Deg do begin I1 := I - 1; for J := 0 to D1 do V^[I]^[J] := V^[I1]^[J + 1]; end; { Solve system } LinEq(V, B, 0, Deg, Det); end; procedure WPolFit(X, Y, S : PVector; Lb, Ub, Deg : Integer; B : PVector; V : PMatrix); var I, I1, J, K, D1 : Integer; W, WXI, Det : Float; begin if Ub - Lb < Deg then begin SetErrCode(MatErrDim); Exit; end; { Initialize } for I := 0 to Deg do begin for J := 0 to Deg do V^[I]^[J] := 0.0; B^[I] := 0.0; end; for K := Lb to Ub do begin if S^[K] <= 0.0 then begin SetErrCode(MatSing); Exit; end; W := 1.0 / Sqr(S^[K]); WXI := W * X^[K]; { w.x^i } V^[0]^[0] := V^[0]^[0] + W; B^[0] := B^[0] + W * Y^[K]; V^[0]^[1] := V^[0]^[1] + WXI; B^[1] := B^[1] + WXI * Y^[K]; for I := 2 to Deg do begin WXI := WXI * X^[K]; V^[0]^[I] := V^[0]^[I] + WXI; { First line of matrix: w --> w.x^d } B^[I] := B^[I] + WXI * Y^[K]; { Constant vector: w.y --> w.x^d.y } end; for I := 1 to Deg do begin WXI := WXI * X^[K]; V^[I]^[Deg] := V^[I]^[Deg] + WXI; { Last col. of matrix: w.x^d --> w.x^2d } end; end; { Fill lower matrix } D1 := Deg - 1; for I := 1 to Deg do begin I1 := I - 1; for J := 0 to D1 do V^[I]^[J] := V^[I1]^[J + 1]; end; { Solve system } LinEq(V, B, 0, Deg, Det); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/upolev.pas0000664000175000017500000000335411326434466021164 0ustar michaelmichael{ ****************************************************************** Polynomial evaluations for special functions. Translated from C code in Cephes library (http://www.moshier.net) ****************************************************************** } unit upolev; interface uses utypes; type TabCoef = array[0..9] of Float; function PolEvl(var X : Float; Coef : TabCoef; N : Integer) : Float; function P1Evl(var X : Float; Coef : TabCoef; N : Integer) : Float; implementation function PolEvl(var X : Float; Coef : TabCoef; N : Integer) : Float; { ------------------------------------------------------------------ Evaluates polynomial of degree N: 2 N y = C + C x + C x +...+ C x 0 1 2 N Coefficients are stored in reverse order: Coef[0] = C , ..., Coef[N] = C N 0 The function P1Evl() assumes that Coef[N] = 1.0 and is omitted from the array. Its calling arguments are otherwise the same as PolEvl(). ------------------------------------------------------------------ } var Ans : Float; I : Integer; begin Ans := Coef[0]; for I := 1 to N do Ans := Ans * X + Coef[I]; PolEvl := Ans; end; function P1Evl(var X : Float; Coef : TabCoef; N : Integer) : Float; { ------------------------------------------------------------------ Evaluate polynomial when coefficient of X is 1.0. Otherwise same as PolEvl. ------------------------------------------------------------------ } var Ans : Float; I : Integer; begin Ans := X + Coef[0]; for I := 1 to N - 1 do Ans := Ans * X + Coef[I]; P1Evl := Ans; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/upoidist.pas0000664000175000017500000000147411326434466021513 0ustar michaelmichael{ ****************************************************************** Poisson distribution ****************************************************************** } unit upoidist; interface uses utypes; function PPoisson(Mu : Float; K : Integer) : Float; { Probability of Poisson distrib. } implementation function PPoisson(Mu : Float; K : Integer) : Float; var P : Float; I : Integer; begin if (Mu <= 0.0) or (K < 0) then PPoisson := DefaultVal(FDomain, 0.0) else if (- Mu) < MinLog then PPoisson := DefaultVal(FUnderflow, 0.0) else if K = 0 then PPoisson := DefaultVal(FOk, Exp(- Mu)) else begin P := Mu; for I := 2 to K do { P = Mu^K / K! } P := P * Mu / I; PPoisson := Exp(- Mu) * P; SetErrCode(FOk); end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uplot.pas0000664000175000017500000011305011326434466021010 0ustar michaelmichael{ ****************************************************************** Plotting routines for TP/FPC/GPC (based on the Graph unit) ****************************************************************** } unit uplot; interface uses graph, utypes, umath, uround, uinterv, ustrings; function InitGraphics(Pilot, Mode : Integer; BGIPath : String) : Boolean; { ------------------------------------------------------------------ Enters graphic mode ------------------------------------------------------------------ } procedure SetWindow(X1, X2, Y1, Y2 : Integer; GraphBorder : Boolean); { ------------------------------------------------------------------ Sets the graphic window X1, X2, Y1, Y2 : Window coordinates in % of maximum GraphBorder : Flag for drawing the window border ------------------------------------------------------------------ } procedure AutoScale(X : PVector; Lb, Ub : Integer; Scale : TScale; var XMin, XMax, XStep : Float); { ------------------------------------------------------------------ Finds an appropriate scale for plotting the data in X[Lb..Ub] ------------------------------------------------------------------ } procedure SetOxScale(Scale : TScale; OxMin, OxMax, OxStep : Float); { ------------------------------------------------------------------ Sets the scale on the Ox axis ------------------------------------------------------------------ } procedure SetOyScale(Scale : TScale; OyMin, OyMax, OyStep : Float); { ------------------------------------------------------------------ Sets the scale on the Oy axis ------------------------------------------------------------------ } procedure SetGraphTitle(Title : String); { ------------------------------------------------------------------ Sets the title for the graph ------------------------------------------------------------------ } procedure SetOxTitle(Title : String); { ------------------------------------------------------------------ Sets the title for the Ox axis ------------------------------------------------------------------ } procedure SetOyTitle(Title : String); { ------------------------------------------------------------------ Sets the title for the Oy axis ------------------------------------------------------------------ } procedure SetTitleFont(FontIndex, Width, Height : Integer); { ------------------------------------------------------------------ Sets the font for the main graph title ------------------------------------------------------------------ } procedure SetOxFont(FontIndex, Width, Height : Integer); { ------------------------------------------------------------------ Sets the font for the Ox axis (title and labels) ------------------------------------------------------------------ } procedure SetOyFont(FontIndex, Width, Height : Integer); { ------------------------------------------------------------------ Sets the font for the Oy axis (title and labels) ------------------------------------------------------------------ } procedure SetLgdFont(FontIndex, Width, Height : Integer); { ------------------------------------------------------------------ Sets the font for the legends ------------------------------------------------------------------ } procedure PlotOxAxis; { ------------------------------------------------------------------ Plots the horizontal axis ------------------------------------------------------------------ } procedure PlotOyAxis; { ------------------------------------------------------------------ Plots the vertical axis ------------------------------------------------------------------ } procedure PlotGrid(Grid : TGrid); { ------------------------------------------------------------------ Plots a grid on the graph ------------------------------------------------------------------ } procedure WriteGraphTitle; { ------------------------------------------------------------------ Writes the title of the graph ------------------------------------------------------------------ } procedure SetClipping(Clip : Boolean); { ------------------------------------------------------------------ Determines whether drawings are clipped at the current viewport boundaries, according to the value of the Boolean parameter Clip ------------------------------------------------------------------ } procedure SetMaxCurv(NCurv : Byte); { ------------------------------------------------------------------ Sets the maximum number of curves and re-initializes their parameters ------------------------------------------------------------------ } procedure SetPointParam(CurvIndex, Symbol, Size, Color : Integer); { ------------------------------------------------------------------ Sets the point parameters for curve # CurvIndex ------------------------------------------------------------------ } procedure SetLineParam(CurvIndex, Style, Width, Color : Integer); { ------------------------------------------------------------------ Sets the line parameters for curve # CurvIndex ------------------------------------------------------------------ } procedure SetCurvLegend(CurvIndex : Integer; Legend : String); { ------------------------------------------------------------------ Sets the legend for curve # CurvIndex ------------------------------------------------------------------ } procedure SetCurvStep(CurvIndex, Step : Integer); { ------------------------------------------------------------------ Sets the step for curve # CurvIndex ------------------------------------------------------------------ } procedure PlotPoint(Xp, Yp, CurvIndex : Integer); { ------------------------------------------------------------------ Plots a point on the screen ------------------------------------------------------------------ Input parameters : Xp, Yp = point coordinates in pixels CurvIndex = index of curve parameters (Symbol, Size, Color) ------------------------------------------------------------------ } procedure PlotCurve(X, Y : PVector; Lb, Ub, CurvIndex : Integer); { ------------------------------------------------------------------ Plots a curve ------------------------------------------------------------------ Input parameters : X, Y = point coordinates Lb, Ub = indices of first and last points CurvIndex = index of curve parameters ------------------------------------------------------------------ } procedure PlotCurveWithErrorBars(X, Y, S : PVector; Ns, Lb, Ub, CurvIndex : Integer); { ------------------------------------------------------------------ Plots a curve with error bars ------------------------------------------------------------------ Input parameters : X, Y = point coordinates S = errors Lb, Ub = indices of first and last points CurvIndex = index of curve parameters ------------------------------------------------------------------ } procedure PlotFunc(Func : TFunc; X1, X2 : Float; CurvIndex : Integer); { ------------------------------------------------------------------ Plots a function ------------------------------------------------------------------ Input parameters: Func = function to be plotted X1, X2 = abscissae of 1st and last point to plot CurvIndex = index of curve parameters (Width, Style, Color) ------------------------------------------------------------------ The function must be programmed as : function Func(X : Float) : Float; ------------------------------------------------------------------ } procedure WriteLegend(NCurv : Integer; ShowPoints, ShowLines : Boolean); { ------------------------------------------------------------------ Writes the legends for the plotted curves ------------------------------------------------------------------ NCurv : number of curves (1 to MaxCurv) ShowPoints : for displaying points ShowLines : for displaying lines ------------------------------------------------------------------ } procedure ConRec(Nx, Ny, Nc : Integer; X, Y, Z : PVector; F : PMatrix); { ------------------------------------------------------------------ Contour plot Adapted from Paul Bourke, Byte, June 1987 http://astronomy.swin.edu.au/~pbourke/projection/conrec/ ------------------------------------------------------------------ Input parameters: Nx, Ny = number of steps on Ox and Oy Nc = number of contour levels X[0..Nx], Y[0..Ny] = point coordinates in pixels Z[0..(Nc - 1)] = contour levels in increasing order F[0..Nx, 0..Ny] = function values, such that F[I,J] is the function value at (X[I], Y[I]) ------------------------------------------------------------------ } function Xpixel(X : Float) : Integer; { ------------------------------------------------------------------ Converts user abscissa X to screen coordinate ------------------------------------------------------------------ } function Ypixel(Y : Float) : Integer; { ------------------------------------------------------------------ Converts user ordinate Y to screen coordinate ------------------------------------------------------------------ } function Xuser(X : Integer) : Float; { ------------------------------------------------------------------ Converts screen coordinate X to user abscissa ------------------------------------------------------------------ } function Yuser(Y : Integer) : Float; { ------------------------------------------------------------------ Converts screen coordinate Y to user ordinate ------------------------------------------------------------------ } procedure LeaveGraphics; { ------------------------------------------------------------------ Quits graphic mode ------------------------------------------------------------------ } implementation const MaxSymbol = 9; { Max. number of symbols for plotting curves } MaxCurvColor = 9; { Max. number of colors for curves } Eps = 1.0E-10; { Lower limit for an axis label } CurvColor : array[1..MaxCurvColor] of Integer = (12, { LightRed } 14, { Yellow } 10, { LightGreen } 9, { LightBlue } 11, { LightCyan } 13, { LightMagenta } 4, { Red } 2, { Green } 1 { Blue }); type TAxis = record { Coordinate axis } Scale : TScale; Min : Float; Max : Float; Step : Float; end; TFont = record { Font for titles and legends } Index : Integer; Width : Integer; Height : Integer; end; TPointParam = record { Point parameters } Symbol : Integer; { Symbol: 0: point (.) } Size : Integer; { 1: solid circle 2: open circle } Color : Integer; { 3: solid square 4: open square } end; { 5: solid triangle 6: open triangle } { 7: plus (+) 8: multiply (x) } { 9: star (* ) } TLineParam = record { Line parameters } Style : Integer; { 0: none, 1: solid, 2: dotted, 3: centered, 4: dashed } Width : Integer; { 1: normal, 3: thick } Color : Integer; end; TCurvParam = record { Curve parameters } PointParam : TPointParam; LineParam : TLineParam; Legend : Str30; { Legend of curve } Step : Integer; { Plot 1 point every Step points } end; TCurvParamVector = array[1..255] of TCurvParam; PCurvParamVector = ^TCurvParamVector; var Xwin1, Xwin2, Ywin1, Ywin2 : Integer; XminPixel, XmaxPixel : Integer; YminPixel, YmaxPixel : Integer; FactX, FactY : Float; XAxis, YAxis : TAxis; GraphTitle, XTitle, YTitle : String; TitleFont, XFont, YFont, LgdFont : TFont; MaxCurv : Integer; CurvParam : PCurvParamVector; procedure DimCurvParamVector(var CurvParam : PCurvParamVector; Ub : Byte); var I : Integer; begin { Allocate vector } GetMem(CurvParam, Ub * SizeOf(TCurvParam)); if CurvParam = nil then Exit; MaxCurv := Ub; { Initialize curve parameters } for I := 1 to Ub do with CurvParam^[I] do begin PointParam.Symbol := (I - 1) mod MaxSymbol + 1; PointParam.Size := 2; PointParam.Color := CurvColor[(I - 1) mod MaxCurvColor + 1]; Legend := 'Curve ' + LTrim(IntStr(I)); LineParam.Width := 1; LineParam.Style := 1; LineParam.Color := PointParam.Color; Step := 1; end; end; procedure DelCurvParamVector(var CurvParam : PCurvParamVector; Ub : Byte); begin if CurvParam <> nil then begin FreeMem(CurvParam, Ub * SizeOf(TCurvParam)); CurvParam := nil; MaxCurv := 0; end; end; function InitGraphics(Pilot, Mode : Integer; BGIPath : String) : Boolean; var P, M : {$IFDEF FPC}Smallint{$ELSE}Integer{$ENDIF}; begin P := Pilot; M := Mode; InitGraph(P, M, BGIPath); if GraphResult <> 0 then begin InitGraphics := False; Exit; end; InitGraphics := True; MaxCurv := MaxSymbol; DimCurvParamVector(CurvParam, MaxCurv); { Obtain info about current mode } XminPixel := 0; XmaxPixel := GetMaxX; YminPixel := 0; YmaxPixel := GetMaxY; end; procedure SetWindow(X1, X2, Y1, Y2 : Integer; GraphBorder : Boolean); var R : Float; begin if (X1 >= 0) and (X2 <= 100) and (X1 < X2) then begin Xwin1 := X1; Xwin2 := X2; R := 0.01 * GetMaxX; XminPixel := Round(X1 * R); XmaxPixel := Round(X2 * R); end; if (Y1 >= 0) and (Y2 <= 100) and (Y1 < Y2) then begin Ywin1 := Y1; Ywin2 := Y2; R := 0.01 * GetMaxY; YminPixel := Round(Y1 * R); YmaxPixel := Round(Y2 * R); end; XAxis.Scale := LinScale; XAxis.Min := 0.0; XAxis.Max := 1.0; XAxis.Step := 0.2; YAxis.Scale := LinScale; YAxis.Min := 0.0; YAxis.Max := 1.0; YAxis.Step := 0.2; FactX := (XmaxPixel - XminPixel) / (XAxis.Max - XAxis.Min); FactY := (YmaxPixel - YminPixel) / (YAxis.Max - YAxis.Min); XTitle := 'X'; XFont.Index := 2; XFont.Width := 150; XFont.Height := 150; YTitle := 'Y'; YFont.Index := 2; YFont.Width := 150; YFont.Height := 150; GraphTitle := ''; TitleFont.Index := 2; TitleFont.Width := 175; TitleFont.Height := 175; LgdFont.Index := 2; LgdFont.Width := 150; LgdFont.Height := 150; if GraphBorder then Rectangle(XminPixel, YminPixel, XmaxPixel, YmaxPixel); end; procedure AutoScale(X : PVector; Lb, Ub : Integer; Scale : TScale; var XMin, XMax, XStep : Float); var I : Integer; X1, X2 : Float; begin { Minimum and maximum of X } X1 := X^[Lb]; X2 := X1; for I := Lb to Ub do if X^[I] < X1 then X1 := X^[I] else if X^[I] > X2 then X2 := X^[I]; { Linear scale } if Scale = LinScale then begin Interval(X1, X2, 2, 6, XMin, XMax, XStep); Exit; end; { Logarithmic scale } XMin := 1.0E-3; XMax := 1.0E+3; XStep := 10.0; if X1 <= 0.0 then Exit; XMin := Int(Log10(X1)); if X1 < 1.0 then XMin := XMin - 1.0; XMax := Int(Log10(X2)); if X2 > 1.0 then XMax := XMax + 1.0; XMin := Exp10(XMin); XMax := Exp10(XMax); end; procedure SetOxScale(Scale : TScale; OxMin, OxMax, OxStep : Float); begin XAxis.Scale := Scale; case Scale of LinScale : begin if OxMin < OxMax then begin XAxis.Min := OxMin; XAxis.Max := OxMax; end; if OxStep > 0.0 then XAxis.Step := OxStep; end; LogScale : begin if (OxMin > 0.0) and (OxMin < OxMax) then begin XAxis.Min := Floor(Log10(OxMin)); XAxis.Max := Ceil(Log10(OxMax)); end; XAxis.Step := 1.0; end; end; FactX := (XmaxPixel - XminPixel) / (XAxis.Max - XAxis.Min); end; procedure SetOyScale(Scale : TScale; OyMin, OyMax, OyStep : Float); begin YAxis.Scale := Scale; case Scale of LinScale : begin if OyMin < OyMax then begin YAxis.Min := OyMin; YAxis.Max := OyMax; end; if OyStep > 0.0 then YAxis.Step := OyStep; end; LogScale : begin if (OyMin > 0.0) and (OyMin < OyMax) then begin YAxis.Min := Floor(Log10(OyMin)); YAxis.Max := Ceil(Log10(OyMax)); end; YAxis.Step := 1.0; end; end; FactY := (YmaxPixel - YminPixel) / (YAxis.Max - YAxis.Min); end; procedure SetGraphTitle(Title : String); begin GraphTitle := Title; end; procedure SetOxTitle(Title : String); begin XTitle := Title; end; procedure SetOyTitle(Title : String); begin YTitle := Title; end; procedure SetFont(Select, Index, Width, Height : Integer); var Font : TFont; begin if Index in [0..10] then Font.Index := Index; if Width > 0 then Font.Width := Width; if Height > 0 then Font.Height := Height; case Select of 0 : TitleFont := Font; 1 : XFont := Font; 2 : YFont := Font; 3 : LgdFont := Font; end; end; procedure SetTitleFont(FontIndex, Width, Height : Integer); begin SetFont(0, FontIndex, Width, Height); end; procedure SetOxFont(FontIndex, Width, Height : Integer); begin SetFont(1, FontIndex, Width, Height); end; procedure SetOyFont(FontIndex, Width, Height : Integer); begin SetFont(2, FontIndex, Width, Height); end; procedure SetLgdFont(FontIndex, Width, Height : Integer); begin SetFont(3, FontIndex, Width, Height); end; function Xpixel(X : Float) : Integer; var P : Float; begin P := FactX * (X - XAxis.Min); if Abs(P) > 30000 then Xpixel := 30000 else Xpixel := Round(P) + XminPixel; end; function Ypixel(Y : Float) : Integer; var P : Float; begin P := FactY * (YAxis.Max - Y); if Abs(P) > 30000 then Ypixel := 30000 else Ypixel := Round(P) + YminPixel; end; function Xuser(X : Integer) : Float; begin Xuser := XAxis.Min + (X - XminPixel) / FactX; end; function Yuser(Y : Integer) : Float; begin Yuser := YAxis.Max - (Y - YminPixel) / FactY; end; procedure PlotOxAxis; var W, X, Z : Float; N, I, J : Integer; begin Line(XminPixel, YmaxPixel, XmaxPixel, YmaxPixel); SetTextStyle(XFont.Index, HorizDir, 1); SetUserCharSize(XFont.Width, 100, XFont.Height, 100); SetTextJustify(CenterText, TopText); N := Round((XAxis.Max - XAxis.Min) / XAxis.Step); { Nb of intervals } X := XAxis.Min; { Tick mark position } for I := 0 to N do { Label axis } begin if (XAxis.Scale = LinScale) and (Abs(X) < Eps) then X := 0.0; MoveTo(Xpixel(X), YmaxPixel); LineRel(0, 5); { Plot tick mark } if XAxis.Scale = LinScale then Z := X else Z := Exp10(X); OutText(Trim(FloatStr(Z))); if (XAxis.Scale = LogScale) and (I < N) then for J := 2 to 9 do { Plot minor divisions } begin { on logarithmic scale } W := X + Log10(J); MoveTo(Xpixel(W), YmaxPixel); LineRel(0, 3); end; X := X + XAxis.Step; end; if XTitle <> '' then { Plot axis title } OutTextXY((XminPixel + XmaxPixel) div 2, YmaxPixel + GetMaxY div 12, XTitle); end; procedure PlotOyAxis; var W, Y, Z : Float; N, I, J : Integer; begin Line(XminPixel, YminPixel, XminPixel, YmaxPixel); SetTextStyle(YFont.Index, HorizDir, 1); SetUserCharSize(YFont.Width, 100, YFont.Height, 100); SetTextJustify(RightText, CenterText); N := Round((YAxis.Max - YAxis.Min) / YAxis.Step); Y := YAxis.Min; for I := 0 to N do begin if (YAxis.Scale = LinScale) and (Abs(Y) < Eps) then Y := 0.0; MoveTo(XminPixel, Ypixel(Y)); LineRel(- 5, 0); MoveRel(- 2, - 2); if YAxis.Scale = LinScale then Z := Y else Z := Exp10(Y); OutText(Trim(FloatStr(Z))); if (YAxis.Scale = LogScale) and (I < N) then for J := 2 to 9 do begin W := Y + Log10(J); MoveTo(XminPixel, Ypixel(W)); LineRel(- 3, 0); end; Y := Y + YAxis.Step; end; if YTitle <> '' then begin SetTextStyle(YFont.Index, VertDir, 1); SetUserCharSize(YFont.Width, 100, YFont.Height, 100); OutTextXY(XminPixel - GetMaxX div 8, (YminPixel + YmaxPixel) div 2, YTitle); end; end; procedure PlotGrid(Grid : TGrid); var X, Y : Float; I, N, Xp, Yp : Integer; begin SetLineStyle(DottedLn, 0, NormWidth); if Grid in [HorizGrid, BothGrid] then { Horizontal lines } begin N := Round((YAxis.Max - YAxis.Min) / YAxis.Step); { Nb of intervals } for I := 1 to Pred(N) do begin Y := YAxis.Min + I * YAxis.Step; { Origin of line } Yp := Ypixel(Y); Line(XminPixel, Yp, XmaxPixel, Yp); end; end; if Grid in [VertiGrid, BothGrid] then { Vertical lines } begin N := Round((XAxis.Max - XAxis.Min) / XAxis.Step); for I := 1 to Pred(N) do begin X := XAxis.Min + I * XAxis.Step; Xp := Xpixel(X); Line(Xp, YminPixel, Xp, YmaxPixel); end; end; SetLineStyle(SolidLn, 0, NormWidth); end; procedure WriteGraphTitle; begin if GraphTitle = '' then Exit; SetTextStyle(TitleFont.Index, HorizDir, 1); SetUserCharSize(TitleFont.Width, 100, TitleFont.Height, 100); SetTextJustify(CenterText, TopText); OutTextXY((XminPixel + XmaxPixel) div 2, YminPixel - GetMaxY div 10, GraphTitle); end; procedure SetClipping(Clip : Boolean); begin if XminPixel = 0 then begin XminPixel := Round(Xwin1 / 100 * GetMaxX); YminPixel := Round(Ywin1 / 100 * GetMaxY); XmaxPixel := Round(Xwin2 / 100 * GetMaxX); YmaxPixel := Round(Ywin2 / 100 * GetMaxY); end; SetViewPort(XminPixel, YminPixel, XmaxPixel, YmaxPixel, Clip); XmaxPixel := XmaxPixel - XminPixel; XminPixel := 0; YmaxPixel := YmaxPixel - YminPixel; YminPixel := 0; end; procedure SetMaxCurv(NCurv : Byte); begin if NCurv < 1 then Exit; DelCurvParamVector(CurvParam, MaxCurv); MaxCurv := NCurv; DimCurvParamVector(CurvParam, MaxCurv); end; procedure SetPointParam(CurvIndex, Symbol, Size, Color : Integer); begin if (CurvIndex < 1) or (CurvIndex > MaxCurv) then Exit; if (Symbol >= 0) and (Symbol <= MaxSymbol) then CurvParam^[CurvIndex].PointParam.Symbol := Symbol; if Size > 0 then CurvParam^[CurvIndex].PointParam.Size := Size; if (Color >= 0) and (Color <= GetMaxColor) then CurvParam^[CurvIndex].PointParam.Color := Color; end; procedure SetLineParam(CurvIndex, Style, Width, Color : Integer); begin if (CurvIndex < 1) or (CurvIndex > MaxCurv) then Exit; if (Style >= 0) and (Style <= 4) then CurvParam^[CurvIndex].LineParam.Style := Style; if (Width = 1) or (Width = 3) then CurvParam^[CurvIndex].LineParam.Width := Width; if (Color >= 0) and (Color <= GetMaxColor) then CurvParam^[CurvIndex].LineParam.Color := Color; end; procedure SetCurvLegend(CurvIndex : Integer; Legend : String); begin if (CurvIndex >= 1) and (CurvIndex <= MaxCurv) then CurvParam^[CurvIndex].Legend := Legend; end; procedure SetCurvStep(CurvIndex, Step : Integer); begin if (CurvIndex >= 1) and (CurvIndex <= MaxCurv) and (Step > 0) then CurvParam^[CurvIndex].Step := Step; end; procedure PlotPoint(Xp, Yp, CurvIndex : Integer); var Xasp, Yasp : {$IFDEF __GPC__}Integer{$ELSE}Word{$ENDIF}; Size : Integer; Xp1, Xp2 : Word; Yp1, Yp2 : Word; Dx, Dy : Word; R : Float; Triangle : array[1..4] of PointType; Square : array[1..5] of PointType; begin GetAspectRatio(Xasp, Yasp); Size := CurvParam^[CurvIndex].PointParam.Size; R := 0.0001 * Size; Dx := Round(R * Yasp); Dy := Round(R * Xasp); Xp1 := Xp - Size; Xp2 := Xp + Size; Yp1 := Yp - Size; Yp2 := Yp + Size; if CurvParam^[CurvIndex].PointParam.Symbol in [3, 4] then begin Square[1].X := Xp1; Square[1].Y := Yp1; Square[2].X := Xp1; Square[2].Y := Yp2; Square[3].X := Xp2; Square[3].Y := Yp2; Square[4].X := Xp2; Square[4].Y := Yp1; Square[5].X := Xp1; Square[5].Y := Yp1; end; if CurvParam^[CurvIndex].PointParam.Symbol in [5, 6] then begin Triangle[1].X := Xp; Triangle[1].Y := Yp1; Triangle[2].X := Xp2; Triangle[2].Y := Yp2; Triangle[3].X := Xp1; Triangle[3].Y := Yp2; Triangle[4].X := Xp; Triangle[4].Y := Yp1; end; MoveTo(Xp, Yp); SetColor(CurvParam^[CurvIndex].PointParam.Color); SetFillStyle(SolidFill, CurvParam^[CurvIndex].PointParam.Color); case CurvParam^[CurvIndex].PointParam.Symbol of 0 : PutPixel(Xp, Yp, GetColor); { . } 1 : PieSlice(Xp, Yp, 0, 360, Dx); { Solid circle } 2 : Ellipse(Xp, Yp, 0, 360, Dx, Dy); { Open circle } 3 : FillPoly(5, Square); { Solid square } 4 : DrawPoly(5, Square); { Open square } 5 : FillPoly(4, Triangle); { Solid triangle } 6 : DrawPoly(4, Triangle); { Open triangle } 7 : begin { + } Line(Xp, Yp1, Xp, Yp2); Line(Xp1, Yp, Xp2, Yp); end; 8 : begin { x } Line(Xp1, Yp1, Xp2, Yp2); Line(Xp1, Yp2, Xp2, Yp1); end; 9 : begin Line(Xp, Yp1, Xp, Yp2); { * } Line(Xp1, Yp, Xp2, Yp); Line(Xp1, Yp1, Xp2, Yp2); Line(Xp1, Yp2, Xp2, Yp1); end; end; end; procedure PlotCurve(X, Y : PVector; Lb, Ub, CurvIndex : Integer); var XI, YI : Float; I, Xp, Yp : Integer; Connect : Boolean; begin Connect := CurvParam^[CurvIndex].LineParam.Style > 0; if Connect then SetLineStyle(Pred(CurvParam^[CurvIndex].LineParam.Style), 0, CurvParam^[CurvIndex].LineParam.Width); I := Lb; repeat XI := X^[I]; if XAxis.Scale = LogScale then XI := Log10(XI); YI := Y^[I]; if YAxis.Scale = LogScale then YI := Log10(YI); Xp := Xpixel(XI); Yp := Ypixel(YI); if Connect then begin SetColor(CurvParam^[CurvIndex].LineParam.Color); if I = Lb then MoveTo(Xp, Yp) else LineTo(Xp, Yp); end; PlotPoint(Xp, Yp, CurvIndex); I := I + CurvParam^[CurvIndex].Step; until I > Ub; end; procedure PlotCurveWithErrorBars(X, Y, S : PVector; Ns, Lb, Ub, CurvIndex : Integer); var Delta, XI, YI, Y1, Y2 : Float; I, Xp, Yp, Yp1, Yp2 : Integer; Connect : Boolean; begin Connect := CurvParam^[CurvIndex].LineParam.Style > 0; SetColor(CurvParam^[CurvIndex].LineParam.Color); I := Lb; repeat XI := X^[I]; if XAxis.Scale = LogScale then XI := Log10(XI); YI := Y^[I]; if YAxis.Scale = LogScale then YI := Log10(YI); Xp := Xpixel(XI); Yp := Ypixel(YI); PlotPoint(Xp, Yp, CurvIndex); if S^[I] > 0 then begin Delta := Ns * S^[I]; Y1 := Y^[I] - Delta; if YAxis.Scale = LogScale then Y1 := Log10(Y1); Y2 := Y^[I] + Delta; if YAxis.Scale = LogScale then Y2 := Log10(Y2); Yp1 := Ypixel(Y1); Yp2 := Ypixel(Y2); SetColor(CurvParam^[CurvIndex].LineParam.Color); SetLineStyle(SolidLn, 0, CurvParam^[CurvIndex].LineParam.Width); Line(Xp - 5, Yp1, Xp + 5, Yp1); Line(Xp - 5, Yp2, Xp + 5, Yp2); Line(Xp, Yp1, Xp, Yp2); end; if Connect then begin SetLineStyle(Pred(CurvParam^[CurvIndex].LineParam.Style), 0, CurvParam^[CurvIndex].LineParam.Width); if I = Lb then MoveTo(Xp, Yp) else LineTo(Xp, Yp); end; I := I + CurvParam^[CurvIndex].Step; until I > Ub; end; procedure PlotFunc(Func : TFunc; X1, X2 : Float; CurvIndex : Integer); var X, Y, H : Float; I, Npt, Xp, Yp : Integer; begin if X1 >= X2 then Exit; if XAxis.Scale = LogScale then begin X1 := Log10(X1); X2 := Log10(X2); end; SetColor(CurvParam^[CurvIndex].LineParam.Color); SetLineStyle(Pred(CurvParam^[CurvIndex].LineParam.Style), 0, CurvParam^[CurvIndex].LineParam.Width); { Nb of points to be plotted = number of pixels between X1 and X2 } Npt := Xpixel(X2) - Xpixel(X1); H := (X2 - X1) / Npt; X := X1; for I := 0 to Npt do begin if XAxis.Scale = LinScale then Y := Func(X) else Y := Func(Exp10(X)); if MathErr = FOk then begin if YAxis.Scale = LogScale then Y := Log10(Y); Xp := Xpixel(X); Yp := Ypixel(Y); if I = 0 then MoveTo(Xp, Yp) else LineTo(Xp, Yp); end; X := X + H; end; end; procedure WriteLegend(NCurv : Integer; ShowPoints, ShowLines : Boolean); var CharHeight, I, L, Lmax : Integer; N, Nmax, Xp, Xl, Yp : Integer; begin SetTextStyle(LgdFont.Index, HorizDir, 1); SetUserCharSize(LgdFont.Width, 100, LgdFont.Height, 100); SetTextJustify(LeftText, CenterText); N := 0; { Nb of legends to be plotted } Lmax := 0; { Length of the longest legend } for I := 1 to NCurv do if CurvParam^[I].Legend <> '' then begin Inc(N); L := TextWidth(CurvParam^[I].Legend); if L > Lmax then Lmax := L; end; if (N = 0) or (Lmax = 0) then Exit; { Character height } CharHeight := TextHeight('M') + 3; { Max. number of legends which may be plotted } Nmax := Round((YmaxPixel - YminPixel) / CharHeight) - 1; if N > Nmax then N := Nmax; { Draw rectangle around the legends } Rectangle(XmaxPixel + Round(0.02 * GetMaxX), YminPixel, XmaxPixel + Round(0.12 * GetMaxX) + Lmax, YminPixel + (N + 1) * CharHeight); L := Round(0.02 * GetMaxX); { Half-length of line } Xp := XmaxPixel + 3 * L; { Position of symbol } Xl := XmaxPixel + 5 * L; { Position of legend } if NCurv <= Nmax then N := NCurv else N := Nmax; for I := 1 to N do begin Yp := YminPixel + I * CharHeight; if ShowLines and (CurvParam^[I].LineParam.Style > 0) then begin SetLineStyle(Pred(CurvParam^[I].LineParam.Style), 0, CurvParam^[I].LineParam.Width); SetColor(CurvParam^[I].LineParam.Color); Line(Xp - L, Yp, Xp + L, Yp); end; if ShowPoints then PlotPoint(Xp, Yp, I); OutTextXY(Xl, Yp, CurvParam^[I].Legend); end; end; procedure ConRec(Nx, Ny, Nc : Integer; X, Y, Z : PVector; F : PMatrix); const { Mapping from vertex numbers to X offsets } Im : array[0..3] of Integer = (0, 1, 1, 0); { Mapping from vertex numbers to Y offsets } Jm : array[0..3] of Integer = (0, 0, 1, 1); { Case switch table } CasTab : array[0..2, 0..2, 0..2] of Integer = (((0,0,8), (0,2,5), (7,6,9)), ((0,3,4), (1,3,1), (4,3,0)), ((9,6,7), (5,2,0), (8,0,0))); var I, J, K, M, M1, M2, M3 : Integer; X1, X2, Y1, Y2 : Float; Fmin, Fmax : Float; Xp, Yp : PIntVector; PrmErr : Boolean; var H : array[0..4] of Float; { Relative heights of the box above contour } Ish : array[0..4] of Integer; { Sign of H() } Xh : array[0..4] of Integer; { X coordinates of box } Yh : array[0..4] of Integer; { Y coordinates of box } label Case0, NoneInTri, NoneInBox; begin { Check the input parameters for validity } PrmErr := False; SetErrCode(MatOk); if (Nx <= 0) or (Ny <= 0) or (Nc <= 0) then PrmErr := True; for K := 1 to Nc - 1 do if Z^[K] <= Z^[K - 1] then PrmErr := True; if PrmErr then begin SetErrCode(MatErrDim); Exit; end; { Convert user coordinates to pixels } DimIntVector(Xp, Nx); DimIntVector(Yp, Ny); for I := 0 to Nx do Xp^[I] := Xpixel(X^[I]); for J := 0 to Ny do Yp^[J] := Ypixel(Y^[J]); { Scan the array, top down, left to right } for J := Ny - 1 downto 0 do begin for I := 0 to Nx - 1 do begin { Find the lowest vertex } if F^[I]^[J] < F^[I]^[J + 1] then Fmin := F^[I]^[J] else Fmin := F^[I]^[J + 1]; if F^[I + 1]^[J] < Fmin then Fmin := F^[I + 1]^[J]; if F^[I + 1]^[J + 1] < Fmin then Fmin := F^[I + 1]^[J + 1]; { Find the highest vertex } if F^[I]^[J] > F^[I]^[J + 1] then Fmax := F^[I]^[J] else Fmax := F^[I]^[J + 1]; if F^[I + 1]^[J] > Fmax then Fmax := F^[I + 1]^[J]; if F^[I + 1]^[J + 1] > Fmax then Fmax := F^[I + 1]^[J + 1]; if (Fmax < Z^[0]) or (Fmin > Z^[Nc - 1]) then goto NoneInBox; { Draw each contour within this box } for K := 0 to Nc - 1 do begin if (Z^[K] < Fmin) or (Z^[K] > Fmax) then goto NoneInTri; for M := 4 downto 0 do begin if M > 0 then begin H[M] := F^[I + Im[M - 1]]^[J + Jm[M - 1]] - Z^[K]; Xh[M] := Xp^[I + Im[M - 1]]; Yh[M] := Yp^[J + Jm[M - 1]]; end; if M = 0 then begin H[0] := (H[1] + H[2] + H[3] + H[4]) / 4; Xh[0] := (Xp^[I] + Xp^[I + 1]) div 2; Yh[0] := (Yp^[J] + Yp^[J + 1]) div 2; end; if H[M] > 0 then Ish[M] := 2; if H[M] < 0 then Ish[M] := 0; if H[M] = 0 then Ish[M] := 1; end; { next M } { Scan each triangle in the box } for M := 1 to 4 do begin M1 := M; M2 := 0; M3 := M + 1; if M3 = 5 then M3 := 1; case CasTab[Ish[M1], Ish[M2], Ish[M3]] of 0 : goto Case0; { Line between vertices M1 and M2 } 1 : begin X1 := Xh[M1]; Y1 := Yh[M1]; X2 := Xh[M2]; Y2 := Yh[M2]; end; { Line between vertices M2 and M3 } 2 : begin X1 := Xh[M2]; Y1 := Yh[M2]; X2 := Xh[M3]; Y2 := Yh[M3]; end; { Line between vertices M3 and M1 } 3 : begin X1 := Xh[M3]; Y1 := Yh[M3]; X2 := Xh[M1]; Y2 := Yh[M1]; end; { Line between vertex M1 and side M2-M3 } 4 : begin X1 := Xh[M1]; Y1 := Yh[M1]; X2 := (H[M3] * Xh[M2] - H[M2] * Xh[M3]) / (H[M3] - H[M2]); Y2 := (H[M3] * Yh[M2] - H[M2] * Yh[M3]) / (H[M3] - H[M2]); end; { Line between vertex M2 and side M3-M1 } 5 : begin X1 := Xh[M2]; Y1 := Yh[M2]; X2 := (H[M1] * Xh[M3] - H[M3] * Xh[M1]) / (H[M1] - H[M3]); Y2 := (H[M1] * Yh[M3] - H[M3] * Yh[M1]) / (H[M1] - H[M3]); end; { Line between vertex M3 and side M1-M2 } 6 : begin X1 := Xh[M3]; Y1 := Yh[M3]; X2 := (H[M2] * Xh[M1] - H[M1] * Xh[M2]) / (H[M2] - H[M1]); Y2 := (H[M2] * Yh[M1] - H[M1] * Yh[M2]) / (H[M2] - H[M1]); end; { Line between sides M1-M2 and M2-M3 } 7 : begin X1 := (H[M2] * Xh[M1] - H[M1] * Xh[M2]) / (H[M2] - H[M1]); Y1 := (H[M2] * Yh[M1] - H[M1] * Yh[M2]) / (H[M2] - H[M1]); X2 := (H[M3] * Xh[M2] - H[M2] * Xh[M3]) / (H[M3] - H[M2]); Y2 := (H[M3] * Yh[M2] - H[M2] * Yh[M3]) / (H[M3] - H[M2]); end; { Line between sides M2-M3 and M3-M1 } 8 : begin X1 := (H[M3] * Xh[M2] - H[M2] * Xh[M3]) / (H[M3] - H[M2]); Y1 := (H[M3] * Yh[M2] - H[M2] * Yh[M3]) / (H[M3] - H[M2]); X2 := (H[M1] * Xh[M3] - H[M3] * Xh[M1]) / (H[M1] - H[M3]); Y2 := (H[M1] * Yh[M3] - H[M3] * Yh[M1]) / (H[M1] - H[M3]); end; { Line between sides M3-M1 and M1-M2 } 9 : begin X1 := (H[M1] * Xh[M3] - H[M3] * Xh[M1]) / (H[M1] - H[M3]); Y1 := (H[M1] * Yh[M3] - H[M3] * Yh[M1]) / (H[M1] - H[M3]); X2 := (H[M2] * Xh[M1] - H[M1] * Xh[M2]) / (H[M2] - H[M1]); Y2 := (H[M2] * Yh[M1] - H[M1] * Yh[M2]) / (H[M2] - H[M1]); end; end; { case } SetColor(CurvParam^[K mod MaxCurv + 1].LineParam.Color); Line(Trunc(X1), Trunc(Y1), Trunc(X2), Trunc(Y2)); Case0: end; { next M } NoneInTri: end; { next K } NoneInBox: end; { next I } end; { next J } end; procedure LeaveGraphics; begin DelCurvParamVector(CurvParam, MaxCurv); CloseGraph; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/upca.pas0000664000175000017500000001705511326434466020605 0ustar michaelmichael{ ****************************************************************** Principal component analysis ****************************************************************** } unit upca; interface uses utypes, ujacobi; procedure VecMean(X : PMatrix; Lb, Ub, Nvar : Integer; M : PVector); { ---------------------------------------------------------------------- Computes the mean vector (M) from matrix X ---------------------------------------------------------------------- Input : X[Lb..Ub, 1..Nvar] = matrix of variables Output : M[1..Nvar] = mean vector ---------------------------------------------------------------------- } procedure VecSD(X : PMatrix; Lb, Ub, Nvar : Integer; M, S : PVector); { ---------------------------------------------------------------------- Computes the vector of standard deviations (S) from matrix X ---------------------------------------------------------------------- Input : X, Lb, Ub, Nvar, M Output : S[1..Nvar] ---------------------------------------------------------------------- } procedure MatVarCov(X : PMatrix; Lb, Ub, Nvar : Integer; M : PVector; V : PMatrix); { ---------------------------------------------------------------------- Computes the variance-covariance matrix (V) from matrix X Input : X, Lb, Ub, Nvar, M Output : V[1..Nvar, 1..Nvar] ---------------------------------------------------------------------- } procedure MatCorrel(V : PMatrix; Nvar : Integer; R : PMatrix); { ---------------------------------------------------------------------- Computes the correlation matrix (R) from the variance-covariance matrix (V) Input : V, Nvar Output : R[1..Nvar, 1..Nvar] ---------------------------------------------------------------------- } procedure PCA(R : PMatrix; Nvar : Integer; MaxIter : Integer; Tol : Float; Lambda : PVector; C, Rc : PMatrix); { ---------------------------------------------------------------------- Performs a principal component analysis of the correlation matrix R ---------------------------------------------------------------------- Input : R[1..Nvar] = Correlation matrix MaxIter = Max. number of iterations Tol = Required precision Output : Lambda[1..Nvar] = Eigenvalues of the correlation matrix (in descending order) C[1..Nvar, 1..Nvar] = Eigenvectors of the correlation matrix (stored as columns) Rc[1..Nvar, 1..Nvar] = Correlations between principal factors and variables (Rc^[I]^[J] is the correlation coefficient between variable I and factor J) ---------------------------------------------------------------------- NB : This procedure destroys the original matrix R ---------------------------------------------------------------------- } procedure ScaleVar(X : PMatrix; Lb, Ub, Nvar : Integer; M, S : PVector; Z : PMatrix); { ---------------------------------------------------------------------- Scales a set of variables by subtracting means and dividing by SD's ---------------------------------------------------------------------- Input : X, Lb, Ub, Nvar, M, S Output : Z[Lb..Ub, 1..Nvar] = matrix of scaled variables ---------------------------------------------------------------------- } procedure PrinFac(Z : PMatrix; Lb, Ub, Nvar : Integer; C, F : PMatrix); { ---------------------------------------------------------------------- Computes principal factors ---------------------------------------------------------------------- Input : Z[Lb..Ub, 1..Nvar] = matrix of scaled variables C[1..Nvar, 1..Nvar] = matrix of eigenvectors from PCA Output : F[Lb..Ub, 1..Nvar] = matrix of principal factors ---------------------------------------------------------------------- } implementation procedure VecMean(X : PMatrix; Lb, Ub, Nvar : Integer; M : PVector); var I, K, Nobs : Integer; Sum : Float; begin Nobs := Ub - Lb + 1; for I := 1 to Nvar do begin Sum := 0.0; for K := Lb to Ub do Sum := Sum + X^[K]^[I]; M^[I] := Sum / Nobs; end; end; procedure VecSD(X : PMatrix; Lb, Ub, Nvar : Integer; M, S : PVector); var I, K, Nobs : Integer; Sum : Float; begin Nobs := Ub - Lb + 1; for I := 1 to Nvar do begin Sum := 0.0; for K := Lb to Ub do Sum := Sum + Sqr(X^[K]^[I] - M^[I]); S^[I] := Sqrt(Sum / Nobs); end; end; procedure MatVarCov(X : PMatrix; Lb, Ub, Nvar : Integer; M : PVector; V : PMatrix); var I, J, K, Nobs : Integer; Sum : Float; begin Nobs := Ub - Lb + 1; for I := 1 to Nvar do for J := I to Nvar do begin Sum := 0.0; for K := Lb to Ub do Sum := Sum + (X^[K]^[I] - M^[I]) * (X^[K]^[J] - M^[J]); V^[I]^[J] := Sum / Nobs; end; for I := 2 to Nvar do for J := 1 to Pred(I) do V^[I]^[J] := V^[J]^[I]; end; procedure MatCorrel(V : PMatrix; Nvar : Integer; R : PMatrix); var I, J : Integer; P : Float; begin for I := 1 to Nvar do begin R^[I]^[I] := 1.0; for J := Succ(I) to Nvar do begin P := V^[I]^[I] * V^[J]^[J]; if P > 0.0 then R^[I]^[J] := V^[I]^[J] / Sqrt(P) else R^[I]^[J] := 0.0; R^[J]^[I] := R^[I]^[J]; end; end; end; procedure PCA(R : PMatrix; Nvar : Integer; MaxIter : Integer; Tol : Float; Lambda : PVector; C, Rc : PMatrix); var I, J : Integer; Rac : Float; begin { Compute eigenvalues and eigenvectors of correlation matrix } Jacobi(R, 1, Nvar, MaxIter, Tol, Lambda, C); if MathErr <> MatOk then Exit; { Compute correlations between principal factors and reduced variables } for J := 1 to Nvar do begin Rac := Sqrt(Lambda^[J]); for I := 1 to Nvar do Rc^[I]^[J] := C^[I]^[J] * Rac; end; end; procedure ScaleVar(X : PMatrix; Lb, Ub, Nvar : Integer; M, S : PVector; Z : PMatrix); var I, J : Integer; begin for I := Lb to Ub do for J := 1 to Nvar do Z^[I]^[J] := (X^[I]^[J] - M^[J]) / S^[J]; end; procedure PrinFac(Z : PMatrix; Lb, Ub, Nvar : Integer; C, F : PMatrix); var I, J, K : Integer; begin for I := Lb to Ub do for J := 1 to Nvar do begin F^[I]^[J] := 0.0; for K := 1 to Nvar do F^[I]^[J] := F^[I]^[J] + Z^[I]^[K] * C^[K]^[J]; end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/unormal.pas0000664000175000017500000000111411326434466021317 0ustar michaelmichael{ ****************************************************************** Density of standard normal distribution ****************************************************************** } unit unormal; interface uses utypes; function DNorm(X : Float) : Float; { Density of standard normal distribution } implementation function DNorm(X : Float) : Float; var Y : Float; begin Y := - 0.5 * X * X; if Y < MinLog then DNorm := DefaultVal(FUnderflow, 0.0) else begin SetErrCode(FOk); DNorm := InvSqrt2Pi * Exp(Y); end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/unonpar.pas0000664000175000017500000001276211326434466021337 0ustar michaelmichael{ ****************************************************************** Non-parametric tests ****************************************************************** } unit unonpar; interface uses utypes; procedure Mann_Whitney(N1, N2 : Integer; X1, X2 : PVector; var U, Eps : Float); { ------------------------------------------------------------------ Mann-Whitney test ------------------------------------------------------------------ } procedure Wilcoxon(X, Y : PVector; Lb, Ub : Integer; var Ndiff : Integer; var T, Eps : Float); { ------------------------------------------------------------------ Wilcoxon test ------------------------------------------------------------------ } procedure Kruskal_Wallis(Ns : Integer; N : PIntVector; X : PMatrix; var H : Float; var DoF : Integer); { ------------------------------------------------------------------ Kruskal-Wallis test ------------------------------------------------------------------ } implementation procedure Ranks(Ns : Integer; N : PIntVector; X : PMatrix; Sr : PVector; var Corr : Float); { ------------------------------------------------------------------ Compute ranks for non-parametric tests ------------------------------------------------------------------ Sr = sum of ranks for each sample Corr = correction for ties = Sum k(k^2 - 1) k = nb of ties ------------------------------------------------------------------ } var I, J, I1, J1, NI, NE : Integer; Y, Z, R : Float; begin if Ns < 2 then begin SetErrCode(MatErrDim); Exit end; SetErrCode(MatOk); Corr := 0.0; for I := 1 to Ns do Sr^[I] := 0; for I := 1 to Ns do for J := 1 to N^[I] do begin Y := X^[J]^[I]; NE := 0; { Nb of values = Y } NI := 0; { Nb of values < Y } for I1 := 1 to Ns do for J1 := 1 to N^[I1] do begin Z := X^[J1]^[I1]; if Z < Y then Inc(NI) else if Z = Y then Inc(NE); end; R := NI + Succ(NE) / 2; { Mean rank of Y } Sr^[I] := Sr^[I] + R; { Sum of ranks for sample I } if NE > 1 then Corr := Corr + NE * (Sqr(NE) - 1); end; end; procedure Mann_Whitney(N1, N2 : Integer; X1, X2 : PVector; var U, Eps : Float); var Nmax, I : Integer; N : PIntVector; X : PMatrix; Sr : PVector; Sum, Prod, Corr : Float; U1, U2, MU, VU : Float; begin if N1 > N2 then Nmax := N1 else Nmax := N2; DimIntVector(N, 2); DimVector(Sr, 2); DimMatrix(X, Nmax, 2); N^[1] := N1; N^[2] := N2; for I := 1 to N1 do { Copy X1 into first column of X } X^[I]^[1] := X1^[I]; for I := 1 to N2 do { Copy X2 into second column of X } X^[I]^[2] := X2^[I]; Ranks(2, N, X, Sr, Corr); Sum := N1 + N2; Prod := N1 * N2; U1 := Prod + N1 * (N1 + 1) / 2 - Sr^[1]; U2 := Prod + N2 * (N2 + 1) / 2 - Sr^[2]; if U1 > U2 then U := U2 else U := U1; MU := Prod / 2; VU := Prod * ((Sum + 1) - Corr / Sum / (Sum - 1)) / 12; Eps := (U - MU) / Sqrt(VU); DelIntVector(N, 2); DelVector(Sr, 2); DelMatrix(X, Nmax, 2); end; procedure Wilcoxon(X, Y : PVector; Lb, Ub : Integer; var Ndiff : Integer; var T, Eps : Float); var J, J1, J2, N : Integer; Diff, MT, VT, Corr : Float; D : PMatrix; ND : PIntVector; Sr : PVector; begin N := Ub - Lb + 1; DimMatrix(D, N, 2); DimIntVector(ND, 2); DimVector(Sr, 2); J1 := 0; J2 := 0; for J := Lb to Ub do begin Diff := X^[J] - Y^[J]; if Diff < 0 then begin Inc(J1); D^[J1]^[1] := Abs(Diff); { Negative difference } end else if Diff > 0 then begin Inc(J2); D^[J2]^[2] := Diff; { Positive difference } end; end; ND^[1] := J1; { Nb of negative differences } ND^[2] := J2; { Nb of positive differences } Ndiff := J1 + J2; { Nb of non-null differences } Ranks(2, ND, D, Sr, Corr); if Sr^[1] > Sr^[2] then T := Sr^[2] else T := Sr^[1]; MT := N * (N + 1) / 4; VT := MT * (2 * N + 1) / 6 - Corr / 48; Eps := (T - MT) / Sqrt(VT); DelMatrix(D, N, 2); DelIntVector(ND, 2); DelVector(Sr, 2); end; procedure Kruskal_Wallis(Ns : Integer; N : PIntVector; X : PMatrix; var H : Float; var DoF : Integer); var I, NT : Integer; S, Corr : Float; Sr : PVector; begin DimVector(Sr, Ns); Ranks(Ns, N, X, Sr, Corr); S := 0.0; NT := 0; for I := 1 to Ns do begin S := S + Sqr(Sr^[I]) / N^[I]; NT := NT + N^[I]; end; H := 12 * S / NT / (NT + 1) - 3 * (NT + 1); H := H / (1 - Corr / NT / (Sqr(NT) - 1)); DoF := Pred(Ns); DelVector(Sr, Ns); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/unlfit.pas0000664000175000017500000004533211326434466021155 0ustar michaelmichael{ ****************************************************************** Nonlinear regression ****************************************************************** } unit unlfit; interface uses utypes, ugausjor, umarq, ubfgs, usimplex, usimann, ugenalg, umcmc, ustrings; procedure SetOptAlgo(Algo : TOptAlgo); { ---------------------------------------------------------------------- Sets the optimization algorithm according to Algo, which must be NL_MARQ, NL_SIMP, NL_BFGS, NL_SA, NL_GA. Default is NL_MARQ ---------------------------------------------------------------------- } procedure SetMaxParam(N : Byte); { ---------------------------------------------------------------------- Sets the maximum number of regression parameters ---------------------------------------------------------------------- } procedure SetParamBounds(I : Byte; ParamMin, ParamMax : Float); { ---------------------------------------------------------------------- Sets the bounds on the I-th regression parameter ---------------------------------------------------------------------- } procedure NLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); { ------------------------------------------------------------------ Unweighted nonlinear regression ------------------------------------------------------------------ Input parameters: RegFunc = regression function DerivProc = procedure to compute derivatives X, Y = point coordinates Lb, Ub = array bounds MaxIter = max. number of iterations Tol = tolerance on parameters B = initial parameter values FirstPar = index of first regression parameter LasttPar = index of last regression parameter Output parameters: B = fitted regression parameters V = inverse matrix ------------------------------------------------------------------ } procedure WNLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y, S : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); { ---------------------------------------------------------------------- Weighted nonlinear regression ---------------------------------------------------------------------- S = standard deviations of observations Other parameters as in NLFit ---------------------------------------------------------------------- } procedure SetMCFile(FileName : String); { ---------------------------------------------------------------------- Set file for saving MCMC simulations ---------------------------------------------------------------------- } procedure SimFit(RegFunc : TRegFunc; X, Y : PVector; Lb, Ub : Integer; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); { ------------------------------------------------------------------ Simulation of unweighted nonlinear regression by MCMC ------------------------------------------------------------------ } procedure WSimFit(RegFunc : TRegFunc; X, Y, S : PVector; Lb, Ub : Integer; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); { ---------------------------------------------------------------------- Simulation of weighted nonlinear regression by MCMC ------------------------------------------------------------------ } implementation type TRegMode = (UNWEIGHTED, WEIGHTED); const MAX_BOUND = 1.0E+6; { Default parameter bound } MAX_FUNC = 1.0E+30; { Max. value for objective function (used to prevent overflow) } const MaxParam : Byte = 10; { Max. index of fitted parameter } OptAlgo : TOptAlgo = NL_MARQ; { Optimization algorithm } MCFile : String = 'mcmc.txt'; { File for saving MCMC simulations } { Global variables used by the nonlinear regression routines } const gLb : Integer = 0; { Index of first point } gUb : Integer = 0; { Index of last point } gX : PVector = nil; { X coordinates } gY : PVector = nil; { Y coordinates } gW : PVector = nil; { Weights } gYcalc : PVector = nil; { Estimated Y values } gR : PVector = nil; { Residuals (Y - Ycalc) } gFirstPar : Integer = 0; { Index of first fitted parameter } gLastPar : Integer = 0; { Index of last fitted parameter } gBmin : PVector = nil; { Lower bounds on parameters } gBmax : PVector = nil; { Higher bounds on parameters } gD : PVector = nil; { Derivatives of regression function } var gRegFunc : TRegFunc; { Regression function } gDerivProc : TDerivProc; { Derivation procedure } procedure SetOptAlgo(Algo : TOptAlgo); begin OptAlgo := Algo; end; procedure SetMaxParam(N : Byte); begin if N < 1 then Exit; DelVector(gBmin, MaxParam); DelVector(gBmax, MaxParam); DimVector(gBmin, N); DimVector(gBmax, N); MaxParam := N; end; procedure SetParamBounds(I : Byte; ParamMin, ParamMax : Float); begin if gBmin = nil then DimVector(gBmin, MaxParam); if gBmax = nil then DimVector(gBmax, MaxParam); if (I < 0) or (I > MaxParam) or (ParamMin >= ParamMax) then Exit; gBmin^[I] := ParamMin; gBmax^[I] := ParamMax; end; procedure SetGlobalVar(Mode : TRegMode; RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y, S : PVector; Lb, Ub : Integer; FirstPar, LastPar : Integer); { Checks the data and sets the global variables } var I, Npar, Npts : Integer; begin if LastPar > MaxParam then begin SetErrCode(NLMaxPar); Exit; end; Npts := Ub - Lb + 1; { Number of points } Npar := LastPar - FirstPar + 1; { Number of parameters } if Npts <= Npar then begin SetErrCode(MatErrDim); Exit; end; if Mode = WEIGHTED then for I := Lb to Ub do if S^[I] <= 0.0 then begin SetErrCode(MatSing); Exit; end; DelVector(gX, gUb); DelVector(gY, gUb); DelVector(gW, gUb); DelVector(gYcalc, gUb); DelVector(gR, gUb); DimVector(gX, Ub); DimVector(gY, Ub); DimVector(gW, Ub); DimVector(gYcalc, Ub); DimVector(gR, Ub); for I := Lb to Ub do begin gX^[I] := X^[I]; gY^[I] := Y^[I]; end; if Mode = WEIGHTED then for I := Lb to Ub do gW^[I] := 1.0 / Sqr(S^[I]); if gBmin = nil then DimVector(gBmin, MaxParam); if gBmax = nil then DimVector(gBmax, MaxParam); for I := FirstPar to LastPar do if gBmin^[I] >= gBmax^[I] then begin gBmin^[I] := - MAX_BOUND; gBmax^[I] := MAX_BOUND; end; DelVector(gD, gLastPar); DimVector(gD, LastPar); gLb := Lb; gUb := Ub; gFirstPar := FirstPar; gLastPar := LastPar; gRegFunc := RegFunc; gDerivProc := DerivProc; SetErrCode(MatOk); end; function OutOfBounds(B : PVector) : Boolean; { Check if the parameters are inside the bounds } var I : Integer; OoB : Boolean; begin I := gFirstPar; repeat OoB := (B^[I] < gBmin^[I]) or (B^[I] > gBmax^[I]); Inc(I); until OoB or (I > gLastPar); OutOfBounds := OoB; end; function OLS_ObjFunc(B : PVector) : Float; { Objective function for unweighted nonlinear regression } var K : Integer; S : Float; begin if OutOfBounds(B) then begin OLS_ObjFunc := MAX_FUNC; Exit; end; S := 0.0; K := gLb; repeat gYcalc^[K] := gRegFunc(gX^[K], B); gR^[K] := gY^[K] - gYcalc^[K]; S := S + Sqr(gR^[K]); Inc(K); until (K > gUb) or (S > MAX_FUNC); if S > MAX_FUNC then S := MAX_FUNC; OLS_ObjFunc := S; end; procedure OLS_Gradient(B, G : PVector); { Gradient for unweighted nonlinear regression } var I, K : Integer; { Loop variables } begin { Initialization } for I := gFirstPar to gLastPar do G^[I] := 0.0; { Compute Gradient } for K := gLb to gUb do begin gDerivProc(gX^[K], gYcalc^[K], B, gD); for I := gFirstPar to gLastPar do G^[I] := G^[I] - gD^[I] * gR^[K]; end; for I := gFirstPar to gLastPar do G^[I] := 2.0 * G^[I]; end; procedure OLS_HessGrad(B, G : PVector; H : PMatrix); { Gradient and Hessian for unweighted nonlinear regression } var I, J, K : Integer; { Loop variables } begin { Initializations } for I := gFirstPar to gLastPar do begin G^[I] := 0.0; for J := I to gLastPar do H^[I]^[J] := 0.0; end; { Compute Gradient & Hessian } for K := gLb to gUb do begin gDerivProc(gX^[K], gYcalc^[K], B, gD); for I := gFirstPar to gLastPar do begin G^[I] := G^[I] - gD^[I] * gR^[K]; for J := I to gLastPar do H^[I]^[J] := H^[I]^[J] + gD^[I] * gD^[J]; end; end; { Fill in symmetric matrix } for I := Succ(gFirstPar) to gLastPar do for J := gFirstPar to Pred(I) do H^[I]^[J] := H^[J]^[I]; end; function WLS_ObjFunc(B : PVector) : Float; { Objective function for weighted nonlinear regression } var K : Integer; S : Float; begin if OutOfBounds(B) then begin WLS_ObjFunc := MAX_FUNC; Exit; end; S := 0.0; K := gLb; repeat gYcalc^[K] := gRegFunc(gX^[K], B); gR^[K] := gY^[K] - gYcalc^[K]; S := S + gW^[K] * Sqr(gR^[K]); Inc(K); until (K > gUb) or (S > MAX_FUNC); if S > MAX_FUNC then S := MAX_FUNC; WLS_ObjFunc := S; end; procedure WLS_Gradient(B, G : PVector); { Gradient for weighted nonlinear regression } var I, K : Integer; { Loop variables } WR : Float; { Weighted residual } begin { Initialization } for I := gFirstPar to gLastPar do G^[I] := 0.0; { Compute Gradient } for K := gLb to gUb do begin WR := gW^[K] * gR^[K]; gDerivProc(gX^[K], gYcalc^[K], B, gD); for I := gFirstPar to gLastPar do G^[I] := G^[I] - gD^[I] * WR; end; for I := gFirstPar to gLastPar do G^[I] := 2.0 * G^[I]; end; procedure WLS_HessGrad(B, G : PVector; H : PMatrix); { Gradient and Hessian for weighted nonlinear regression } var I, J, K : Integer; { Loop variables } WR, WD : Float; { Weighted residual and derivative } begin { Initializations } for I := gFirstPar to gLastPar do begin G^[I] := 0.0; for J := I to gLastPar do H^[I]^[J] := 0.0; end; { Compute Gradient & Hessian } for K := gLb to gUb do begin WR := gW^[K] * gR^[K]; gDerivProc(gX^[K], gYcalc^[K], B, gD); for I := gFirstPar to gLastPar do begin G^[I] := G^[I] - gD^[I] * WR; WD := gW^[K] * gD^[I]; for J := I to gLastPar do H^[I]^[J] := H^[I]^[J] + WD * gD^[J]; end; end; { Fill in symmetric matrix } for I := Succ(gFirstPar) to gLastPar do for J := gFirstPar to Pred(I) do H^[I]^[J] := H^[J]^[I]; end; procedure GenNLFit(Mode : TRegMode; RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y, S : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); { -------------------------------------------------------------------- General nonlinear regression routine -------------------------------------------------------------------- } var F_min : Float; { Value of objective function at minimum } G : PVector; { Gradient vector } Det : Float; { Determinant of Hessian matrix } ObjFunc : TFuncNVar; { Objective function } GradProc : TGradient; { Procedure to compute gradient } HessProc : THessGrad; { Procedure to compute gradient and hessian } begin SetGlobalVar(Mode, RegFunc, DerivProc, X, Y, S, Lb, Ub, FirstPar, LastPar); if MathErr <> MatOk then Exit; if Mode = UNWEIGHTED then begin ObjFunc := {$IFDEF FPC}@{$ENDIF}OLS_ObjFunc; GradProc := {$IFDEF FPC}@{$ENDIF}OLS_Gradient; HessProc := {$IFDEF FPC}@{$ENDIF}OLS_HessGrad; end else begin ObjFunc := {$IFDEF FPC}@{$ENDIF}WLS_ObjFunc; GradProc := {$IFDEF FPC}@{$ENDIF}WLS_Gradient; HessProc := {$IFDEF FPC}@{$ENDIF}WLS_HessGrad; end; DimVector(G, LastPar); case OptAlgo of NL_MARQ : Marquardt(ObjFunc, HessProc, B, FirstPar, LastPar, MaxIter, Tol, F_min, G, V, Det); NL_SIMP : Simplex(ObjFunc, B, FirstPar, LastPar, MaxIter, Tol, F_min); NL_BFGS : BFGS(ObjFunc, GradProc, B, FirstPar, LastPar, MaxIter, Tol, F_min, G, V); NL_SA : SimAnn(ObjFunc, B, gBmin, gBmax, FirstPar, LastPar, F_min); NL_GA : GenAlg(ObjFunc, B, gBmin, gBmax, FirstPar, LastPar, F_min); end; if (OptAlgo <> NL_MARQ) and (MathErr = MatOk) then begin { Compute the Hessian matrix and its inverse } HessProc(B, G, V); GaussJordan(V, FirstPar, LastPar, LastPar, Det); end; DelVector(G, LastPar); end; procedure NLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); begin GenNLFit(UNWEIGHTED, RegFunc, DerivProc, X, Y, nil, Lb, Ub, MaxIter, Tol, B, FirstPar, LastPar, V); end; procedure WNLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y, S : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); begin GenNLFit(WEIGHTED, RegFunc, DerivProc, X, Y, S, Lb, Ub, MaxIter, Tol, B, FirstPar, LastPar, V); end; procedure SetMCFile(FileName : String); begin MCFile := FileName; end; procedure GenSimFit(Mode : TRegMode; RegFunc : TRegFunc; X, Y, S : PVector; Lb, Ub : Integer; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); var ObjFunc : TFuncNVar; { Objective function } NCycles, MaxSim, SavedSim : Integer; { Metropolis-Hastings parameters } Xmat : PMatrix; { Matrix of simulated parameters } F_min : Float; { Value of objective function at minimum } B_min : PVector; { Parameter values at minimum } R : Float; { Range of parameter values } I, J : Integer; { Loop variables } F : Text; { File for storing MCMC simulations } begin SetGlobalVar(Mode, RegFunc, nil, X, Y, S, Lb, Ub, FirstPar, LastPar); if MathErr <> MatOk then Exit; { Initialize variance-covariance matrix } for I := FirstPar to LastPar do begin R := gBmax^[I] - gBmin^[I]; B^[I] := gBmin^[I] + 0.5 * R; for J := FirstPar to LastPar do if I = J then { The parameter range is assumed to cover 6 SD's } V^[I]^[J] := R * R / 36.0 else V^[I]^[J] := 0.0; end; if Mode = UNWEIGHTED then ObjFunc := {$IFDEF FPC}@{$ENDIF}OLS_ObjFunc else ObjFunc := {$IFDEF FPC}@{$ENDIF}WLS_ObjFunc; GetMHParams(NCycles, MaxSim, SavedSim); DimMatrix(Xmat, SavedSim, LastPar); DimVector(B_min, LastPar); Hastings(ObjFunc, 2.0, B, V, FirstPar, LastPar, Xmat, B_min, F_min); if MathErr = MatOk then { Save simulations } begin Assign(F, MCFile); Rewrite(F); for I := 1 to SavedSim do begin Write(F, IntStr(I)); for J := FirstPar to LastPar do Write(F, FloatStr(Xmat^[I]^[J])); Writeln(F); end; Close(F); end; DelMatrix(Xmat, SavedSim, LastPar); end; procedure SimFit(RegFunc : TRegFunc; X, Y : PVector; Lb, Ub : Integer; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); begin GenSimFit(UNWEIGHTED, RegFunc, X, Y, nil, Lb, Ub, B, FirstPar, LastPar, V); end; procedure WSimFit(RegFunc : TRegFunc; X, Y, S : PVector; Lb, Ub : Integer; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); begin GenSimFit(WEIGHTED, RegFunc, X, Y, S, Lb, Ub, B, FirstPar, LastPar, V); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/unewton.pas0000664000175000017500000001145211326434466021347 0ustar michaelmichael{ ****************************************************************** Minimization of a function of several variables by the Newton-Raphson method ****************************************************************** } unit unewton; interface uses utypes, ulineq, ulinmin, ucompvec; procedure SaveNewton(FileName : string); { ------------------------------------------------------------------ Save Newton-Raphson iterations in a file ------------------------------------------------------------------ } procedure Newton(Func : TFuncNVar; HessGrad : THessGrad; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; G : PVector; H_inv : PMatrix; var Det : Float); { ------------------------------------------------------------------ Minimization of a function of several variables by the Newton-Raphson method ------------------------------------------------------------------ Input parameters : Func = objective function Gradient = procedure to compute gradient X = initial minimum coordinates Lb, Ub = indices of first and last variables MaxIter = maximum number of iterations Tol = required precision ------------------------------------------------------------------ Output parameters : X = refined minimum coordinates F_min = function value at minimum G = gradient vector H_inv = inverse hessian matrix Det = determinant of hessian ------------------------------------------------------------------ Possible results : OptOk = no error OptNonConv = non-convergence OptSing = singular hessian matrix ---------------------------------------------------------------------- } implementation const WriteLogFile : Boolean = False; var LogFile : Text; procedure SaveNewton(FileName : string); begin Assign(LogFile, FileName); Rewrite(LogFile); WriteLogFile := True; end; procedure Newton(Func : TFuncNVar; HessGrad : THessGrad; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; G : PVector; H_inv : PMatrix; var Det : Float); var I, Iter : Integer; R : Float; OldX, DeltaX : PVector; procedure Init; { Initializes variables } var I : Integer; begin { Initialize function } F_min := Func(X); { Initialize gradient and hessian (stored in H_inv) } HessGrad(X, G, H_inv); { Initialize search direction } for I := Lb to Ub do DeltaX^[I] := - G^[I]; { Solve system } LinEq(H_inv, DeltaX, Lb, Ub, Det); end; procedure Terminate(ErrCode : Integer); { Set error code and deallocate arrays } begin DelVector(OldX, Ub); DelVector(DeltaX, Ub); SetErrCode(ErrCode); if WriteLogFile then Close(LogFile); end; begin DimVector(OldX, Ub); DimVector(DeltaX, Ub); Init; if MathErr <> MatOk then begin Terminate(OptSing); Exit; end; if MaxIter < 1 then begin Terminate(OptOk); Exit; end; if WriteLogFile then begin WriteLn(LogFile, 'Newton-Raphson'); WriteLn(LogFile, 'Iter F'); end; Iter := 0; repeat { Prepare next iteration } if WriteLogFile then WriteLn(LogFile, Iter:4, ' ', F_min:12); Iter := Iter + 1; if Iter > MaxIter then begin Terminate(OptNonConv); Exit; end; { Save old parameters } for I := Lb to Ub do OldX^[I] := X^[I]; { Minimize along the direction specified by DeltaX } R := 0.1; LinMin(Func, X, DeltaX, Lb, Ub, R, 10, 0.01, F_min); { Compute new gradient and hessian } HessGrad(X, G, H_inv); { Initialize search direction } for I := Lb to Ub do DeltaX^[I] := - G^[I]; { Solve system } LinEq(H_inv, DeltaX, Lb, Ub, Det); if MathErr <> MatOk then begin Terminate(OptSing); Exit; end; until CompVec(X, OldX, Lb, Ub, Tol); Terminate(OptOk); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/unewteqs.pas0000664000175000017500000000662311326434466021527 0ustar michaelmichael{ ****************************************************************** Newton-Raphson solver for system of nonlinear equations ****************************************************************** } unit unewteqs; interface uses utypes, ulineq, ulinminq, ucompvec; procedure NewtEqs(Equations : TEquations; Jacobian : TJacobian; X, F : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float); { ------------------------------------------------------------------ Solves a system of nonlinear equations by Newton's method ------------------------------------------------------------------ Input parameters : Equations = subroutine to compute equations Jacobian = subroutine to compute Jacobian X = initial root MaxIter = maximum number of iterations Tol = required precision ------------------------------------------------------------------ Output parameters : X = refined root F = function values ------------------------------------------------------------------ Possible results : OptOk = no error OptNonConv = non-convergence OptSing = singular jacobian matrix ------------------------------------------------------------------ } implementation procedure NewtEqs(Equations : TEquations; Jacobian : TJacobian; X, F : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float); var I : Integer; { Loop variables } R : Float; { Step for line minimization } Det : Float; { Determinant of Jacobian } Iter : Integer; { Iteration count } Conv : Boolean; { Test convergence } OldX : PVector; { Old parameters } DeltaX : PVector; { New search direction } D : PMatrix; { Jacobian matrix } procedure Terminate(ErrCode : Integer); { Set error code and deallocate arrays } begin DelVector(OldX, Ub); DelVector(DeltaX, Ub); DelMatrix(D, Ub, Ub); SetErrCode(ErrCode); end; begin { Initialize function vector } Equations(X, F); { Quit if no iteration required } if MaxIter < 1 then begin SetErrCode(OptOk); Exit; end; { Dimension arrays } DimVector(OldX, Ub); DimVector(DeltaX, Ub); DimMatrix(D, Ub, Ub); Iter := 0; repeat { Compute Jacobian } Jacobian(X, D); { Solve linear system } LinEq(D, F, Lb, Ub, Det); if MathErr <> MatOk then begin Terminate(OptSing); Exit; end; { Prepare next iteration } Iter := Iter + 1; if Iter > MaxIter then begin Terminate(OptNonConv); Exit; end; { Save current parameters and initialize the direction search } for I := Lb to Ub do begin OldX^[I] := X^[I]; DeltaX^[I] := - F^[I]; end; { Minimize in the direction specified by DeltaX, using an initial step of 0.1 } R := 0.1; LinMinEq(Equations, X, DeltaX, F, Lb, Ub, R, 10, 0.01); { Test for convergence } Conv := CompVec(X, OldX, Lb, Ub, Tol); until Conv; Terminate(OptOk); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/unewteq.pas0000664000175000017500000000445111326434466021341 0ustar michaelmichael{ ****************************************************************** Newton-Raphson solver for nonlinear equation ****************************************************************** } unit unewteq; interface uses utypes; procedure NewtEq (Func, Deriv : TFunc; var X : Float; MaxIter : Integer; Tol : Float; var F : Float); { ------------------------------------------------------------------ Solves a nonlinear equation by Newton's method ------------------------------------------------------------------ Input parameters : Func = function to be solved Deriv = derivative X = initial root MaxIter = maximum number of iterations Tol = required precision ------------------------------------------------------------------ Output parameters : X = refined root F = function value ------------------------------------------------------------------ Possible results : OptOk = no error OptNonConv = non-convergence OptSing = singularity (null derivative) ------------------------------------------------------------------ } implementation procedure NewtEq (Func, Deriv : TFunc; var X : Float; MaxIter : Integer; Tol : Float; var F : Float); var Iter : Integer; { Iteration count } OldX : Float; { Old root } D : Float; { Derivative } Xtol : Float; { Tolerance } begin Iter := 0; SetErrCode(OptOk); F := Func(X); if MaxIter < 1 then Exit; repeat { Compute derivative } D := Deriv(X); if D = 0.0 then begin SetErrCode(OptSing); Exit; end; { Prepare next iteration } Iter := Iter + 1; if Iter > MaxIter then begin SetErrCode(OptNonConv); Exit; end; { Save current root and compute new one } OldX := X; X := X - F / D; F := Func(X); Xtol := Tol * Abs(X); if Xtol < MachEp then Xtol := MachEp; until Abs(OldX - X) < Xtol; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/umulfit.pas0000664000175000017500000001245111326434466021335 0ustar michaelmichael{ ****************************************************************** Multiple linear regression (Gauss-Jordan method) ****************************************************************** } unit umulfit; interface uses utypes, ulineq; procedure MulFit(X : PMatrix; Y : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix); { ------------------------------------------------------------------ Multiple linear regression: Y = B(0) + B(1) * X + B(2) * X2 + ... ------------------------------------------------------------------ Input parameters: X = matrix of independent variables Y = vector of dependent variable Lb, Ub = array bounds Nvar = number of independent variables ConsTerm = presence of constant term B(0) Output parameters: B = regression parameters V = inverse matrix ------------------------------------------------------------------ } procedure WMulFit(X : PMatrix; Y, S : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix); { ---------------------------------------------------------------------- Weighted multiple linear regression ---------------------------------------------------------------------- S = standard deviations of observations Other parameters as in MulFit ---------------------------------------------------------------------- } implementation procedure MulFit(X : PMatrix; Y : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix); var Lb1 : Integer; { Index of first param. (0 if cst term, 1 otherwise) } I, J, K : Integer; { Loop variables } Det : Float; { Determinant } begin if Ub - Lb < Nvar then begin SetErrCode(MatErrDim); Exit; end; { Initialize } for I := 0 to Nvar do begin for J := 0 to Nvar do V^[I]^[J] := 0.0; B^[I] := 0.0; end; { If constant term, set line 0 and column 0 of matrix V } if ConsTerm then begin V^[0]^[0] := Int(Ub - Lb + 1); for K := Lb to Ub do begin for J := 1 to Nvar do V^[0]^[J] := V^[0]^[J] + X^[K]^[J]; B^[0] := B^[0] + Y^[K]; end; for J := 1 to Nvar do V^[J]^[0] := V^[0]^[J]; end; { Set other elements of V } for K := Lb to Ub do for I := 1 to Nvar do begin for J := I to Nvar do V^[I]^[J] := V^[I]^[J] + X^[K]^[I] * X^[K]^[J]; B^[I] := B^[I] + X^[K]^[I] * Y^[K]; end; { Fill in symmetric matrix } for I := 2 to Nvar do for J := 1 to Pred(I) do V^[I]^[J] := V^[J]^[I]; { Solve normal equations } if ConsTerm then Lb1 := 0 else Lb1 := 1; LinEq(V, B, Lb1, Nvar, Det); end; procedure WMulFit(X : PMatrix; Y, S : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix); var Lb1 : Integer; { Index of first param. (0 if cst term, 1 otherwise) } I, J, K : Integer; { Loop variables } W : PVector; { Vector of weights } WX : Float; { W * X } Det : Float; { Determinant } begin if Ub - Lb < Nvar then begin SetErrCode(MatErrDim); Exit; end; for K := Lb to Ub do if S^[K] <= 0.0 then begin SetErrCode(MatSing); Exit; end; DimVector(W, Ub); for K := Lb to Ub do W^[K] := 1.0 / Sqr(S^[K]); { Initialize } for I := 0 to Nvar do begin for J := 0 to Nvar do V^[I]^[J] := 0.0; B^[I] := 0.0; end; { If constant term, set line 0 and column 0 of matrix V } if ConsTerm then begin for K := Lb to Ub do begin V^[0]^[0] := V^[0]^[0] + W^[K]; for J := 1 to Nvar do V^[0]^[J] := V^[0]^[J] + W^[K] * X^[K]^[J]; B^[0] := B^[0] + W^[K] * Y^[K]; end; for J := 1 to Nvar do V^[J]^[0] := V^[0]^[J]; end; { Set other elements of V } for K := Lb to Ub do for I := 1 to Nvar do begin WX := W^[K] * X^[K]^[I]; for J := I to Nvar do V^[I]^[J] := V^[I]^[J] + WX * X^[K]^[J]; B^[I] := B^[I] + WX * Y^[K]; end; { Fill in symmetric matrix } for I := 2 to Nvar do for J := 1 to Pred(I) do V^[I]^[J] := V^[J]^[I]; { Solve normal equations } if ConsTerm then Lb1 := 0 else Lb1 := 1; LinEq(V, B, Lb1, Nvar, Det); DelVector(W, Ub); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uminmax.pas0000664000175000017500000000377111326434466021333 0ustar michaelmichael{ ****************************************************************** Minimum, maximum, sign and exchange ****************************************************************** } unit uminmax; interface uses utypes; function FMin(X, Y : Float) : Float; { Minimum of 2 reals } function FMax(X, Y : Float) : Float; { Maximum of 2 reals } function IMin(X, Y : Integer) : Integer; { Minimum of 2 integers } function IMax(X, Y : Integer) : Integer; { Maximum of 2 integers } function Sgn(X : Float) : Integer; { Sign (returns 1 if X = 0) } function Sgn0(X : Float) : Integer; { Sign (returns 0 if X = 0) } function DSgn(A, B : Float) : Float; { Sgn(B) * |A| } procedure FSwap(var X, Y : Float); { Exchange 2 reals } procedure ISwap(var X, Y : Integer); { Exchange 2 integers } implementation function FMin(X, Y : Float) : Float; begin if X <= Y then FMin := X else FMin := Y; end; function FMax(X, Y : Float) : Float; begin if X >= Y then FMax := X else FMax := Y; end; function IMin(X, Y : Integer) : Integer; begin if X <= Y then IMin := X else IMin := Y; end; function IMax(X, Y : Integer) : Integer; begin if X >= Y then IMax := X else IMax := Y; end; function Sgn(X : Float) : Integer; begin if X >= 0.0 then Sgn := 1 else Sgn := - 1; end; function Sgn0(X : Float) : Integer; begin if X > 0.0 then Sgn0 := 1 else if X = 0.0 then Sgn0 := 0 else Sgn0 := - 1; end; function DSgn(A, B : Float) : Float; begin if B < 0.0 then DSgn := - Abs(A) else DSgn := Abs(A) end; procedure FSwap(var X, Y : Float); var Temp : Float; begin Temp := X; X := Y; Y := Temp; end; procedure ISwap(var X, Y : Integer); var Temp : Integer; begin Temp := X; X := Y; Y := Temp; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uminbrak.pas0000664000175000017500000000244511326434466021462 0ustar michaelmichael{ ****************************************************************** Brackets a minimum of a function ****************************************************************** } unit uminbrak; interface uses utypes, uminmax; procedure MinBrack(Func : TFunc; var A, B, C, Fa, Fb, Fc : Float); implementation procedure MinBrack(Func : TFunc; var A, B, C, Fa, Fb, Fc : Float); { ------------------------------------------------------------------ Given two points (A, B) this procedure finds a triplet (A, B, C) such that: 1) A < B < C 2) A, B, C are within the golden ratio 3) Func(B) < Func(A) and Func(B) < Func(C). The corresponding function values are returned in Fa, Fb, Fc ------------------------------------------------------------------ } begin if A > B then FSwap(A, B); Fa := Func(A); Fb := Func(B); if Fb > Fa then begin FSwap(A, B); FSwap(Fa, Fb); end; C := B + GOLD * (B - A); Fc := Func(C); while Fc < Fb do begin A := B; B := C; Fa := Fb; Fb := Fc; C := B + GOLD * (B - A); Fc := Func(C); end; if A > C then begin FSwap(A, C); FSwap(Fa, Fc); end; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/umedian.pas0000664000175000017500000000156611326434466021277 0ustar michaelmichael{ ****************************************************************** Median ****************************************************************** } unit umedian; interface uses utypes, uqsort; function Median(X : PVector; Lb, Ub : Integer; Sorted : Boolean) : Float; { ------------------------------------------------------------------ Sorts vector X in ascending order (if it's not sorted already) and returns its median value ------------------------------------------------------------------ } implementation function Median(X : PVector; Lb, Ub : Integer; Sorted : Boolean) : Float; var N, N2 : Integer; begin N := Ub - Lb + 1; N2 := N div 2 + Lb - 1; if not Sorted then QSort(X, Lb, Ub); if Odd(N) then Median := X^[N2 + 1] else Median := 0.5 * (X^[N2] + X^[N2 + 1]); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/umeansd.pas0000664000175000017500000000322011326434464021274 0ustar michaelmichael{ ****************************************************************** Mean and standard deviations ****************************************************************** } unit umeansd; interface uses utypes; function Mean(X : PVector; Lb, Ub : Integer) : Float; { Mean of sample X } function StDev(X : PVector; Lb, Ub : Integer; M : Float) : Float; { Standard deviation estimated from sample X } function StDevP(X : PVector; Lb, Ub : Integer; M : Float) : Float; { Standard deviation of population } implementation function Mean(X : PVector; Lb, Ub : Integer) : Float; var SX : Float; I : Integer; begin SX := 0.0; for I := Lb to Ub do SX := SX + X^[I]; Mean := SX / (Ub - Lb + 1); end; function StDev(X : PVector; Lb, Ub : Integer; M : Float) : Float; var D, SD, SD2, V : Float; I, N : Integer; begin N := Ub - Lb + 1; SD := 0.0; { Sum of deviations (used to reduce roundoff error) } SD2 := 0.0; { Sum of squared deviations } for I := Lb to Ub do begin D := X^[I] - M; SD := SD + D; SD2 := SD2 + Sqr(D) end; V := (SD2 - Sqr(SD) / N) / (N - 1); { Variance } StDev := Sqrt(V); end; function StDevP(X : PVector; Lb, Ub : Integer; M : Float) : Float; var D, SD, SD2, V : Float; I, N : Integer; begin N := Ub - Lb + 1; SD := 0.0; { Sum of deviations (used to reduce roundoff error) } SD2 := 0.0; { Sum of squared deviations } for I := Lb to Ub do begin D := X^[I] - M; SD := SD + D; SD2 := SD2 + Sqr(D) end; V := (SD2 - Sqr(SD) / N) / N; { Variance } StDevP := Sqrt(V); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/umcmc.pas0000664000175000017500000002210111326434464020743 0ustar michaelmichael{ ****************************************************************** Simulation by Markov Chain Monte Carlo (MCMC) with the Metropolis-Hastings algorithm. This algorithm simulates the probability density function (pdf) of a vector X. The pdf P(X) is written as: P(X) = C * Exp(- F(X) / T) Simulating P by the Metropolis-Hastings algorithm is equivalent to minimizing F by simulated annealing at the constant temperature T. The constant C is not used in the simulation. The series of random vectors generated during the annealing step constitutes a Markov chain which tends towards the pdf to be simulated. It is possible to run several cycles of the algorithm. The variance-covariance matrix of the simulated distribution is re-evaluated at the end of each cycle and used for the next cycle. ****************************************************************** } unit umcmc; interface uses utypes, ucholesk, urandom, uranmult; procedure InitMHParams(NCycles, MaxSim, SavedSim : Integer); { ------------------------------------------------------------------ Initializes Metropolis-Hastings parameters ------------------------------------------------------------------ } procedure GetMHParams(var NCycles, MaxSim, SavedSim : Integer); { ------------------------------------------------------------------ Returns Metropolis-Hastings parameters ------------------------------------------------------------------ } procedure Hastings(Func : TFuncNVar; T : Float; X : PVector; V : PMatrix; Lb, Ub : Integer; Xmat : PMatrix; X_min : PVector; var F_min : Float); { ------------------------------------------------------------------ Simulation of a probability density function by the Metropolis-Hastings algorithm ------------------------------------------------------------------ Input parameters : Func = Function such that the pdf is P(X) = C * Exp(- Func(X) / T) T = Temperature X = Initial mean vector V = Initial variance-covariance matrix Lb, Ub = Indices of first and last variables ------------------------------------------------------------------ Output parameters : Xmat = Matrix of simulated vectors, stored row-wise, i.e. Xmat[1..MH_SavedSim, Lb..Ub] X = Mean of distribution V = Variance-covariance matrix of distribution X_min = Coordinates of minimum of F(X) (mode of the distribution) F_min = Value of F(X) at minimum ------------------------------------------------------------------ Possible results : MatOk : No error MatNotPD : The variance-covariance matrix is not positive definite ------------------------------------------------------------------ } implementation const MH_NCycles : Integer = 10; { Number of cycles } MH_MaxSim : Integer = 1000; { Max nb of simulations at each cycle } MH_SavedSim : Integer = 1000; { Nb of simulations to be saved } procedure InitMHParams(NCycles, MaxSim, SavedSim : Integer); begin if NCycles > 0 then MH_NCycles := NCycles; if MaxSim > 0 then MH_MaxSim := MaxSim; if (SavedSim > 0) and (SavedSim <= MaxSim) then MH_SavedSim := SavedSim; end; procedure GetMHParams(var NCycles, MaxSim, SavedSim : Integer); begin NCycles := MH_NCycles; MaxSim := MH_MaxSim; SavedSim := MH_SavedSim; end; procedure CalcSD(V : PMatrix; S : PVector; Lb, Ub : Integer); { ------------------------------------------------------------------ Computes the standard deviations for independent random numbers from the variance-covariance matrix. ------------------------------------------------------------------ } var I, ErrCode : Integer; begin I := Lb; ErrCode := MatOk; repeat if V^[I]^[I] > 0.0 then S^[I] := Sqrt(V^[I]^[I]) else ErrCode := MatNotPD; Inc(I); until (ErrCode <> MatOk) or (I > Ub); SetErrCode(ErrCode); end; function Accept(DeltaF, T : Float) : Boolean; { ------------------------------------------------------------------ Checks if a variation DeltaF of the function at temperature T is acceptable. ------------------------------------------------------------------ } var X : Float; begin if DeltaF < 0.0 then begin Accept := True; Exit; end; X := DeltaF / T; if X >= MaxLog then { Exp(- X) ~ 0 } Accept := False else Accept := (Exp(- X) > RanGen3); end; procedure HastingsCycle(Func : TFuncNVar; T : Float; X : PVector; V : PMatrix; Lb, Ub : Integer; Indep : Boolean; Xmat : PMatrix; X_min : PVector; var F_min : Float); { ------------------------------------------------------------------ Performs one cycle of the Metropolis-Hastings algorithm ------------------------------------------------------------------ } var F, F1 : Float; { Function values } DeltaF : Float; { Variation of function } Sum : Float; { Statistical sum } X1 : PVector; { New coordinates } L : PMatrix; { Standard dev. or Cholesky factor } S : PVector; { Standard deviations } I, J, K : Integer; { Loop variables } Iter : Integer; { Iteration count } FirstSavedSim : Integer; { Index of first simulation to be saved } begin { Dimension arrays } DimVector(S, Ub); DimVector(X1, Ub); DimMatrix(L, Ub, Ub); { Compute SD's or Cholesky factor } if Indep then CalcSD(V, S, Lb, Ub) else Cholesky(V, L, Lb, Ub); if MathErr = MatNotPD then Exit; { Compute initial function value } F := Func(X); { Perform MH_MaxSim simulations at constant temperature } FirstSavedSim := MH_MaxSim - MH_SavedSim + 1; Iter := 1; K := 1; repeat { Generate new vector } if Indep then RanMultIndep(X, S, Lb, Ub, X1) else RanMult(X, L, Lb, Ub, X1); { Compute new function value } F1 := Func(X1); DeltaF := F1 - F; { Check for acceptance } if Accept(DeltaF, T) then begin Write('.'); { Only for command-line programs } for I := Lb to Ub do X^[I] := X1^[I]; if Iter >= FirstSavedSim then begin { Save simulated vector into line K of matrix Xmat } for I := Lb to Ub do Xmat^[K]^[I] := X1^[I]; Inc(K); end; if F1 < F_min then begin { Update minimum } for I := Lb to Ub do X_min^[I] := X1^[I]; F_min := F1; end; F := F1; Inc(Iter); end; until Iter > MH_MaxSim; { Update mean vector } for I := Lb to Ub do begin Sum := 0.0; for K := 1 to MH_SavedSim do Sum := Sum + Xmat^[K]^[I]; X^[I] := Sum / MH_SavedSim; end; { Update variance-covariance matrix } for I := Lb to Ub do for J := I to Ub do begin Sum := 0.0; for K := 1 to MH_SavedSim do Sum := Sum + (Xmat^[K]^[I] - X^[I]) * (Xmat^[K]^[J] - X^[J]); V^[I]^[J] := Sum / MH_SavedSim; end; for I := Succ(Lb) to Ub do for J := Lb to Pred(I) do V^[I]^[J] := V^[J]^[I]; DelVector(S, Ub); DelVector(X1, Ub); DelMatrix(L, Ub, Ub); end; procedure Hastings(Func : TFuncNVar; T : Float; X : PVector; V : PMatrix; Lb, Ub : Integer; Xmat : PMatrix; X_min : PVector; var F_min : Float); var K : Integer; Indep : Boolean; begin { Initialize the Marsaglia random number generator using the standard Pascal generator } Randomize; InitGen(Trunc(Random * 1.0E+8)); K := 1; Indep := True; F_min := MaxNum; repeat HastingsCycle(Func, T, X, V, Lb, Ub, Indep, Xmat, X_min, F_min); Indep := False; Inc(K); until (MathErr <> MatOk) or (K > MH_NCycles); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/umath.pas0000664000175000017500000001245711326434464020772 0ustar michaelmichael{ ****************************************************************** Logarithms, exponentials and power ****************************************************************** } unit umath; interface uses utypes, uminmax; function Expo(X : Float) : Float; { Exponential } function Exp2(X : Float) : Float; { 2^X } function Exp10(X : Float) : Float; { 10^X } function Log(X : Float) : Float; { Natural log } function Log2(X : Float) : Float; { Log, base 2 } function Log10(X : Float) : Float; { Decimal log } function LogA(X, A : Float) : Float; { Log, base A } function IntPower(X : Float; N : Integer) : Float; { X^N } function Power(X, Y : Float) : Float; { X^Y, X >= 0 } implementation function Expo(X : Float) : Float; begin SetErrCode(FOk); if X < MinLog then Expo := DefaultVal(FUnderflow, 0.0) else if X > MaxLog then Expo := DefaultVal(FOverflow, MaxNum) else Expo := Exp(X); end; function Exp2(X : Float) : Float; var XLn2 : Float; begin SetErrCode(FOk); XLn2 := X * Ln2; if XLn2 < MinLog then Exp2 := DefaultVal(FUnderflow, 0.0) else if XLn2 > MaxLog then Exp2 := DefaultVal(FOverflow, MaxNum) else Exp2 := Exp(XLn2); end; function Exp10(X : Float) : Float; var XLn10 : Float; begin SetErrCode(FOk); XLn10 := X * Ln10; if XLn10 < MinLog then Exp10 := DefaultVal(FUnderflow, 0.0) else if XLn10 > MaxLog then Exp10 := DefaultVal(FOverflow, MaxNum) else Exp10 := Exp(XLn10); end; function Log(X : Float) : Float; begin SetErrCode(FOk); if X < 0.0 then Log := DefaultVal(FDomain, - MaxNum) else if X = 0.0 then Log := DefaultVal(FSing, - MaxNum) else Log := Ln(X); end; function Log10(X : Float) : Float; begin SetErrCode(FOk); if X < 0.0 then Log10 := DefaultVal(FDomain, - MaxNum) else if X = 0.0 then Log10 := DefaultVal(FSing, - MaxNum) else Log10 := Ln(X) * InvLn10; end; function Log2(X : Float) : Float; begin SetErrCode(FOk); if X < 0.0 then Log2 := DefaultVal(FDomain, - MaxNum) else if X = 0.0 then Log2 := DefaultVal(FSing, - MaxNum) else Log2 := Ln(X) * InvLn2; end; function LogA(X, A : Float) : Float; var Y : Float; begin Y := Log(X); if MathErr = FOk then if A = 1.0 then Y := DefaultVal(FSing, Sgn(Y) * MaxNum) else Y := Y / Log(A); LogA := Y; end; { ---------------------------------------------------------------------- Power functions. Thanks to Volker Walter for suggesting improvements to Power and IntPower ---------------------------------------------------------------------- } function PowerTests(X, Y : Float; var Res : Float) : Boolean; { Tests the cases X=0, Y=0 and Y=1. Returns X^Y in Res } begin if X = 0.0 then begin PowerTests := True; if Y = 0.0 then { 0^0 = lim X^X = 1 } Res := 1.0 { X->0 } else if Y > 0.0 then Res := 0.0 { 0^Y = 0 } else Res := DefaultVal(FSing, MaxNum); end else if Y = 0.0 then begin Res := 1.0; { X^0 = 1 } PowerTests := True; end else if Y = 1.0 then begin Res := X; { X^1 = X } PowerTests := True; end else PowerTests := False; end; function IntPower(X : Float; N : Integer) : Float; { Computes X^N by repeated multiplications } const InverseMaxNum = 1.0 / MaxNum; var T : Float; M : Integer; Invert : Boolean; begin if PowerTests(X, N, T) then begin IntPower := T; Exit; end; Invert := (N < 0); { Test if inverting is needed } if 1.0 < Abs(X) then { Test for 0 ..|x| .. 1 } begin X := 1.0 / X; Invert := not Invert; end; { Legendre's algorithm for minimizing the number of multiplications } T := 1.0; M := Abs(N); while 0 < M do begin if Odd(M) then T := T * X; X := Sqr(X); M := M div 2; end; if Invert then if Abs(T) < InverseMaxNum then { Only here overflow } T := DefaultVal(FOverflow, Sgn(T) * MaxNum) else T := 1.0 / T; IntPower := T; end; function Power(X, Y : Float) : Float; { Computes X^Y = Exp(Y * Ln(X)), for X > 0 Resorts to IntPower if Y is integer } var Res : Float; YLnX : Float; begin if PowerTests(X, Y, Res) then Power := Res else if (Abs(Y) < MaxInt) and (Trunc(Y) = Y) then { Integer exponent } Power := IntPower(X, Trunc(Y)) else if X <= 0.0 then Power := DefaultVal(FDomain, 0.0) else begin YLnX := Y * Ln(X); if YLnX < MinLog then Power := DefaultVal(FUnderflow, 0.0) else if YLnX > MaxLog then Power := DefaultVal(FOverflow, MaxNum) else Power := Exp(YLnX); end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/umarq.pas0000664000175000017500000001520111326434464020767 0ustar michaelmichael{ ****************************************************************** Minimization of a function of several variables by Marquardt's method ****************************************************************** } unit umarq; interface uses utypes, ugausjor, ulinmin, ucompvec; procedure SaveMarquardt(FileName : string); { ------------------------------------------------------------------ Save Marquardt iterations in a file ------------------------------------------------------------------ } procedure Marquardt(Func : TFuncNVar; HessGrad : THessGrad; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; G : PVector; H_inv : PMatrix; var Det : Float); { ------------------------------------------------------------------ Minimization of a function of several variables by Marquardt's method ------------------------------------------------------------------ Input parameters : Func = objective function HessGrad = procedure to compute hessian and gradient X = initial minimum coordinates Lb, Ub = indices of first and last variables MaxIter = maximum number of iterations Tol = required precision ------------------------------------------------------------------ Output parameters : X = refined minimum coordinates F_min = function value at minimum G = gradient vector H_inv = inverse hessian matrix Det = determinant of hessian ------------------------------------------------------------------ Possible results : OptOk = no error OptNonConv = non-convergence OptSing = singular hessian matrix OptBigLambda = too high Marquardt parameter Lambda ---------------------------------------------------------------------- } implementation const WriteLogFile : Boolean = False; var LogFile : Text; procedure SaveMarquardt(FileName : string); begin Assign(LogFile, FileName); Rewrite(LogFile); WriteLogFile := True; end; procedure Marquardt(Func : TFuncNVar; HessGrad : THessGrad; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; G : PVector; H_inv : PMatrix; var Det : Float); const Lambda0 = 1.0E-2; { Initial lambda value } LambdaMax = 1.0E+3; { Highest lambda value } FTol = 1.0E-10; { Tolerance on function decrease } var Ub1, I, J, Iter : Integer; F1, R : Float; OldX, DeltaX : PVector; A, H : PMatrix; Lambda : Float; LambdaOk : Boolean; procedure SolveSystem(Lambda : Float); { Solve the system of linear equations : H' * DeltaX = -G where H' is the modified hessian matrix (diagonal terms multiplied by (1 + Lambda)), and G is the gradient vector, for a given value of Marquardt's Lambda parameter. The whole system is stored in a matrix A = [H'|G] which is transformed by the Gauss-jordan method. The inverse hessian matrix H_inv is then retrieved from the transformed matrix. } var Lambda1 : Float; I, J : Integer; begin if Lambda > 0.0 then begin Lambda1 := 1.0 + Lambda; for I := Lb to Ub do A^[I]^[I] := Lambda1 * H^[I]^[I]; end; GaussJordan(A, Lb, Ub, Ub1, Det); if MathErr = MatOk then for I := Lb to Ub do for J := Lb to Ub do H_inv^[I]^[J] := A^[I]^[J]; end; procedure Terminate(ErrCode : Integer); { Set error code and deallocate arrays } begin DelVector(OldX, Ub); DelVector(DeltaX, Ub); DelMatrix(A, Ub, Ub1); DelMatrix(H, Ub, Ub); SetErrCode(ErrCode); if WriteLogFile then Close(LogFile); end; begin Ub1 := Ub + 1; DimVector(OldX, Ub); DimVector(DeltaX, Ub); DimMatrix(A, Ub, Ub1); DimMatrix(H, Ub, Ub); if WriteLogFile then begin WriteLn(LogFile, 'Marquardt'); WriteLn(LogFile, 'Iter F Lambda'); end; Iter := 0; Lambda := Lambda0; F_min := Func(X); repeat if WriteLogFile then WriteLn(LogFile, Iter:4, ' ', F_min:12, ' ', Lambda:12); { Save old parameters } for I := Lb to Ub do OldX^[I] := X^[I]; { Compute Gradient and Hessian } HessGrad(X, G, H); for I := Lb to Ub do begin for J := Lb to Ub do A^[I]^[J] := H^[I]^[J]; A^[I]^[Ub1] := - G^[I]; end; if MaxIter < 1 then begin SolveSystem(0.0); if MathErr = MatOk then Terminate(OptOk) else Terminate(OptSing); Exit; end; { Prepare next iteration } Iter := Iter + 1; if Iter > MaxIter then begin Terminate(OptNonConv); Exit; end; repeat SolveSystem(Lambda); if MathErr <> MatOk then begin Terminate(OptSing); Exit; end; { Initialize parameters and search direction } for I := Lb to Ub do begin X^[I] := OldX^[I]; DeltaX^[I] := A^[I]^[Ub1]; end; { Minimize along the direction specified by DeltaX } { using an initial step of 0.1 * |DeltaX| } R := 0.1; LinMin(Func, X, DeltaX, Lb, Ub, R, 10, 0.01, F1); { Check that the function has decreased, otherwise } { increase Lambda, without exceeding LambdaMax } LambdaOk := (F1 - F_min) < F_min * FTol; if not LambdaOk then Lambda := 10.0 * Lambda; if Lambda > LambdaMax then begin Terminate(OptBigLambda); Exit; end; until LambdaOk; Lambda := 0.1 * Lambda; F_min := F1; until CompVec(X, OldX, Lb, Ub, Tol); Terminate(OptOk); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ulu.pas0000664000175000017500000001131711326434464020453 0ustar michaelmichael{ ****************************************************************** LU decomposition ****************************************************************** } unit ulu; interface uses utypes, uminmax; procedure LU_Decomp(A : PMatrix; Lb, Ub : Integer); { ---------------------------------------------------------------------- LU decomposition. Factors the square matrix A as a product L * U, where L is a lower triangular matrix (with unit diagonal terms) and U is an upper triangular matrix. This routine is used in conjunction with LU_Solve to solve a system of equations. ---------------------------------------------------------------------- Input parameters : A = matrix Lb = index of first matrix element Ub = index of last matrix element ---------------------------------------------------------------------- Output parameter : A = contains the elements of L and U ---------------------------------------------------------------------- Possible results : MatOk MatSing ---------------------------------------------------------------------- NB : This procedure destroys the original matrix A ---------------------------------------------------------------------- } procedure LU_Solve(A : PMatrix; B : PVector; Lb, Ub : Integer; X : PVector); { ---------------------------------------------------------------------- Solves a system of equations whose matrix has been transformed by LU_Decomp ---------------------------------------------------------------------- Input parameters : A = result from LU_Decomp B = constant vector Lb, Ub = as in LU_Decomp ---------------------------------------------------------------------- Output parameter : X = solution vector ---------------------------------------------------------------------- } implementation const InitDim : Integer = 0; { Initial vector size } Index : PIntVector = nil; { Records the row permutations } procedure LU_Decomp(A : PMatrix; Lb, Ub : Integer); var I, Imax, J, K : Integer; Pvt, T, Sum : Float; V : PVector; begin { Reallocate Index if necessary} if Ub > InitDim then begin DelIntVector(Index, InitDim); DimIntVector(Index, Ub); InitDim := Ub; end; DimVector(V, Ub); for I := Lb to Ub do begin Pvt := 0.0; for J := Lb to Ub do if Abs(A^[I]^[J]) > Pvt then Pvt := Abs(A^[I]^[J]); if Pvt < MachEp then begin DelVector(V, Ub); SetErrCode(MatSing); Exit; end; V^[I] := 1.0 / Pvt; end; for J := Lb to Ub do begin for I := Lb to Pred(J) do begin Sum := A^[I]^[J]; for K := Lb to Pred(I) do Sum := Sum - A^[I]^[K] * A^[K]^[J]; A^[I]^[J] := Sum; end; Imax := 0; Pvt := 0.0; for I := J to Ub do begin Sum := A^[I]^[J]; for K := Lb to Pred(J) do Sum := Sum - A^[I]^[K] * A^[K]^[J]; A^[I]^[J] := Sum; T := V^[I] * Abs(Sum); if T > Pvt then begin Pvt := T; Imax := I; end; end; if J <> Imax then begin for K := Lb to Ub do FSwap(A^[Imax]^[K], A^[J]^[K]); V^[Imax] := V^[J]; end; Index^[J] := Imax; if A^[J]^[J] = 0.0 then A^[J]^[J] := MachEp; if J <> Ub then begin T := 1.0 / A^[J]^[J]; for I := Succ(J) to Ub do A^[I]^[J] := A^[I]^[J] * T; end; end; DelVector(V, Ub); SetErrCode(MatOk); end; procedure LU_Solve(A : PMatrix; B : PVector; Lb, Ub : Integer; X : PVector); var I, Ip, J, K : Integer; Sum : Float; begin for I := Lb to Ub do X^[I] := B^[I]; K := Pred(Lb); for I := Lb to Ub do begin Ip := Index^[I]; Sum := X^[Ip]; X^[Ip] := X^[I]; if K >= Lb then for J := K to Pred(I) do Sum := Sum - A^[I]^[J] * X^[J] else if Sum <> 0.0 then K := I; X^[I] := Sum; end; for I := Ub downto Lb do begin Sum := X^[I]; if I < Ub then for J := Succ(I) to Ub do Sum := Sum - A^[I]^[J] * X^[J]; X^[I] := Sum / A^[I]^[I]; end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ulinminq.pas0000664000175000017500000001146111326434464021502 0ustar michaelmichael{ ****************************************************************** Minimization of a sum of squared functions along a line (Used internally by equation solvers) ****************************************************************** } unit ulinminq; interface uses utypes; procedure LinMinEq(Equations : TEquations; X, DeltaX, F : PVector; Lb, Ub : Integer; R : Float; MaxIter : Integer; Tol : Float); { ------------------------------------------------------------------ Minimizes a sum of squared functions from point X in the direction specified by DeltaX, using golden search as the minimization algo. ------------------------------------------------------------------ Input parameters : SysFunc = system of functions X = starting point DeltaX = search direction Lb, Ub = bounds of X R = initial step, in fraction of |DeltaX| MaxIter = maximum number of iterations Tol = required precision ------------------------------------------------------------------ Output parameters: X = refined minimum coordinates F = function values at minimum R = step corresponding to the minimum ------------------------------------------------------------------ Possible results : OptOk = no error OptNonConv = non-convergence ------------------------------------------------------------------ } implementation procedure LinMinEq(Equations : TEquations; X, DeltaX, F : PVector; Lb, Ub : Integer; R : Float; MaxIter : Integer; Tol : Float); var I, Iter : Integer; A, B, C, Fa, Fb, Fc : Float; R0, R1, R2, R3, F1, F2 : Float; MinTol, Norm : Float; P : PVector; procedure Swap2(var A, B, Fa, Fb : Float); { Exchanges A <--> B, Fa <--> Fb } var Temp : Float; begin Temp := A; A := B; B := Temp; Temp := Fa; Fa := Fb; Fb := Temp; end; function SumSqrFn : Float; { Computes the sum of squared functions F(i)^2 at point P } var Sum : Float; I : Integer; begin Equations(P, F); Sum := 0.0; for I := Lb to Ub do Sum := Sum + Sqr(F^[I]); SumSqrFn := Sum; end; begin DimVector(P, Ub); MinTol := Sqrt(MachEp); if Tol < MinTol then Tol := MinTol; if R <= 0.0 then R := 1.0; Norm := 0.0; for I := Lb to Ub do Norm := Norm + Sqr(DeltaX^[I]); Norm := Sqrt(Norm); { Bracket the minimum } A := 0.0; B := R * Norm; for I := Lb to Ub do P^[I] := X^[I]; Fa := SumSqrFn; for I := Lb to Ub do P^[I] := X^[I] + B * DeltaX^[I]; Fb := SumSqrFn; if Fb > Fa then Swap2(A, B, Fa, Fb); C := B + Gold * (B - A); for I := Lb to Ub do P^[I] := X^[I] + C * DeltaX^[I]; Fc := SumSqrFn; while Fc < Fb do begin A := B; B := C; Fa := Fb; Fb := Fc; C := B + Gold * (B - A); for I := Lb to Ub do P^[I] := X^[I] + C * DeltaX^[I]; Fc := SumSqrFn; end; if A > C then Swap2(A, C, Fa, Fc); { Refine the minimum } R0 := A; R3 := C; if (C - B) > (B - A) then begin R1 := B; R2 := B + CGold * (C - B); F1 := Fb; for I := Lb to Ub do P^[I] := X^[I] + R2 * DeltaX^[I]; F2 := SumSqrFn; end else begin R1 := B - CGold * (B - A); R2 := B; for I := Lb to Ub do P^[I] := X^[I] + R1 * DeltaX^[I]; F1 := SumSqrFn; F2 := Fb; end; Iter := 0; while (Iter <= MaxIter) and (Abs(R3 - R0) > Tol * (Abs(R1) + Abs(R2))) do begin if F2 < F1 then begin R0 := R1; R1 := R2; F1 := F2; R2 := R1 + CGold * (R3 - R1); for I := Lb to Ub do P^[I] := X^[I] + R2 * DeltaX^[I]; F2 := SumSqrFn; end else begin R3 := R2; R2 := R1; F2 := F1; R1 := R2 - CGold * (R2 - R0); for I := Lb to Ub do P^[I] := X^[I] + R1 * DeltaX^[I]; F1 := SumSqrFn end; Iter := Iter + 1; end; if F1 < F2 then R := R1 else R := R2; for I := Lb to Ub do X^[I] := X^[I] + R * DeltaX^[I]; Equations(X, F); if Iter > MaxIter then SetErrCode(OptNonConv) else SetErrCode(OptOk); DelVector(P, Ub); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ulinmin.pas0000664000175000017500000001060511326434464021320 0ustar michaelmichael{ ****************************************************************** Minimization of a function of several variables along a line ****************************************************************** } unit ulinmin; interface uses utypes, uminmax; procedure LinMin(Func : TFuncNVar; X, DeltaX : PVector; Lb, Ub : Integer; var R : Float; MaxIter : Integer; Tol : Float; var F_min : Float); { ------------------------------------------------------------------ Minimizes function Func from point X in the direction specified by DeltaX ------------------------------------------------------------------ Input parameters : Func = objective function X = initial minimum coordinates DeltaX = direction in which minimum is searched Lb, Ub = indices of first and last variables R = initial step, in fraction of |DeltaX| MaxIter = maximum number of iterations Tol = required precision ------------------------------------------------------------------ Output parameters : X = refined minimum coordinates R = step corresponding to the minimum F_min = function value at minimum ------------------------------------------------------------------ Possible results : OptOk OptNonConv ------------------------------------------------------------------ } implementation procedure LinMin(Func : TFuncNVar; X, DeltaX : PVector; Lb, Ub : Integer; var R : Float; MaxIter : Integer; Tol : Float; var F_min : Float); var A, B, C : Float; Fa, Fb, Fc, F1, F2 : Float; MinTol, Norm : Float; R0, R1, R2, R3 : Float; I, Iter : Integer; P : PVector; begin MinTol := Sqrt(MachEp); if Tol < MinTol then Tol := MinTol; if R < 0.0 then R := 1.0; Norm := 0.0; for I := Lb to Ub do Norm := Norm + Sqr(DeltaX^[I]); Norm := Sqrt(Norm); A := 0; B := R * Norm; DimVector(P, Ub); { Bracket the minimum (see procedure MinBrack in unit UMINBRAK) } for I := Lb to Ub do P^[I] := X^[I]; Fa := Func(P); for I := Lb to Ub do P^[I] := X^[I] + B * DeltaX^[I]; Fb := Func(P); if Fb > Fa then begin FSwap(A, B); FSwap(Fa, Fb); end; C := B + Gold * (B - A); for I := Lb to Ub do P^[I] := X^[I] + C * DeltaX^[I]; Fc := Func(P); while Fc < Fb do begin A := B; B := C; Fa := Fb; Fb := Fc; C := B + Gold * (B - A); for I := Lb to Ub do P^[I] := X^[I] + C * DeltaX^[I]; Fc := Func(P); end; if A > C then begin FSwap(A, C); FSwap(Fa, Fc); end; { Refine the minimum (see procedure GoldSearch in unit UGOLDSRC) } R0 := A; R3 := C; if (C - B) > (B - A) then begin R1 := B; R2 := B + CGold * (C - B); F1 := Fb; for I := Lb to Ub do P^[I] := X^[I] + R2 * DeltaX^[I]; F2 := Func(P); end else begin R1 := B - CGold * (B - A); R2 := B; for I := Lb to Ub do P^[I] := X^[I] + R1 * DeltaX^[I]; F1 := Func(P); F2 := Fb; end; Iter := 0; while (Iter <= MaxIter) and (Abs(R3 - R0) > Tol * (Abs(R1) + Abs(R2))) do begin if F2 < F1 then begin R0 := R1; R1 := R2; F1 := F2; R2 := R1 + CGold * (R3 - R1); for I := Lb to Ub do P^[I] := X^[I] + R2 * DeltaX^[I]; F2 := Func(P); end else begin R3 := R2; R2 := R1; F2 := F1; R1 := R2 - CGold * (R2 - R0); for I := Lb to Ub do P^[I] := X^[I] + R1 * DeltaX^[I]; F1 := Func(P); end; Iter := Iter + 1; end; if F1 < F2 then begin R := R1; F_min := F1; end else begin R := R2; F_min := F2; end; for I := Lb to Ub do X^[I] := X^[I] + R * DeltaX^[I]; if Iter > MaxIter then SetErrCode(OptNonConv) else SetErrCode(OptOk); DelVector(P, Ub); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ulinfit.pas0000664000175000017500000000637611326434464021331 0ustar michaelmichael{ ****************************************************************** Linear regression : Y = B(0) + B(1) * X ****************************************************************** } unit ulinfit; interface uses utypes; procedure LinFit(X, Y : PVector; Lb, Ub : Integer; B : PVector; V : PMatrix); { ------------------------------------------------------------------ Unweighted linear regression ------------------------------------------------------------------ Input parameters: X, Y = point coordinates Lb, Ub = array bounds Output parameters: B = regression parameters V = inverse matrix ------------------------------------------------------------------ } procedure WLinFit(X, Y, S : PVector; Lb, Ub : Integer; B : PVector; V : PMatrix); { ------------------------------------------------------------------ Weighted linear regression ------------------------------------------------------------------ Additional input parameter: S = standard deviations of observations ------------------------------------------------------------------ } implementation procedure LinFit(X, Y : PVector; Lb, Ub : Integer; B : PVector; V : PMatrix); var SX, SY, SX2, SXY, D : Float; K, N : Integer; begin N := Ub - Lb + 1; SX := 0.0; SY := 0.0; SX2 := 0.0; SXY := 0.0; for K := Lb to Ub do begin SX := SX + X^[K]; SY := SY + Y^[K]; SX2 := SX2 + Sqr(X^[K]); SXY := SXY + X^[K] * Y^[K]; end; D := N * SX2 - Sqr(SX); if D <= 0.0 then begin SetErrCode(MatSing); Exit; end; SetErrCode(MatOk); V^[0]^[0] := SX2 / D; V^[0]^[1] := - SX / D; V^[1]^[0] := V^[0]^[1]; V^[1]^[1] := N / D; B^[0] := V^[0]^[0] * SY + V^[0]^[1] * SXY; B^[1] := V^[1]^[0] * SY + V^[1]^[1] * SXY; end; procedure WLinFit(X, Y, S : PVector; Lb, Ub : Integer; B : PVector; V : PMatrix); var W, WX, SW, SWX, SWY, SWX2, SWXY, D : Float; K : Integer; begin SW := 0.0; SWX := 0.0; SWY := 0.0; SWX2 := 0.0; SWXY := 0.0; for K := Lb to Ub do begin if S^[K] <= 0.0 then begin SetErrCode(MatSing); Exit; end; W := 1.0 / Sqr(S^[K]); WX := W * X^[K]; SW := SW + W; SWX := SWX + WX; SWY := SWY + W * Y^[K]; SWX2 := SWX2 + WX * X^[K]; SWXY := SWXY + WX * Y^[K]; end; D := SW * SWX2 - Sqr(SWX); if D <= 0.0 then begin SetErrCode(MatSing); Exit; end; SetErrCode(MatOk); V^[0]^[0] := SWX2 / D; V^[0]^[1] := - SWX / D; V^[1]^[0] := V^[0]^[1]; V^[1]^[1] := SW / D; B^[0] := V^[0]^[0] * SWY + V^[0]^[1] * SWXY; B^[1] := V^[1]^[0] * SWY + V^[1]^[1] * SWXY; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ulineq.pas0000664000175000017500000001062011326434464021137 0ustar michaelmichael{ ****************************************************************** Solution of a system of linear equations with a single constant vector by Gauss-Jordan method ****************************************************************** } unit ulineq; interface uses utypes, uminmax; procedure LinEq(A : PMatrix; B : PVector; Lb, Ub : Integer; var Det : Float); { ------------------------------------------------------------------ Solves a linear system according to the Gauss-Jordan method ------------------------------------------------------------------ Input parameters : A = system matrix B = constant vector Lb, Ub = lower and upper array bounds ------------------------------------------------------------------ Output parameters : A = inverse matrix B = solution vector Det = determinant of A ------------------------------------------------------------------ Possible results : MatOk : No error MatSing : Singular matrix ------------------------------------------------------------------ } implementation procedure LinEq(A : PMatrix; B : PVector; Lb, Ub : Integer; var Det : Float); var Pvt : Float; { Pivot } Ik, Jk : Integer; { Pivot's row and column } I, J, K : Integer; { Loop variables } T : Float; { Temporary variable } PRow, PCol : PIntVector; { Stores pivot's row and column } MCol : PVector; { Stores a column of matrix A } procedure Terminate(ErrCode : Integer); { Set error code and deallocate arrays } begin DelIntVector(PRow, Ub); DelIntVector(PCol, Ub); DelVector(MCol, Ub); SetErrCode(ErrCode); end; begin DimIntVector(PRow, Ub); DimIntVector(PCol, Ub); DimVector(MCol, Ub); Det := 1.0; K := Lb; while K <= Ub do begin { Search for largest pivot in submatrix A[K..Ub, K..Ub] } Pvt := A^[K]^[K]; Ik := K; Jk := K; for I := K to Ub do for J := K to Ub do if Abs(A^[I]^[J]) > Abs(Pvt) then begin Pvt := A^[I]^[J]; Ik := I; Jk := J; end; { Store pivot's position } PRow^[K] := Ik; PCol^[K] := Jk; { Update determinant } Det := Det * Pvt; if Ik <> K then Det := - Det; if Jk <> K then Det := - Det; { Too weak pivot ==> quasi-singular matrix } if Abs(Pvt) < MachEp then begin Terminate(MatSing); Exit end; { Exchange current row (K) with pivot row (Ik) } if Ik <> K then begin for J := Lb to Ub do FSwap(A^[Ik]^[J], A^[K]^[J]); FSwap(B^[Ik], B^[K]); end; { Exchange current column (K) with pivot column (Jk) } if Jk <> K then for I := Lb to Ub do FSwap(A^[I]^[Jk], A^[I]^[K]); { Store column K of matrix A into MCol and set this column to zero } for I := Lb to Ub do if I <> K then begin MCol^[I] := A^[I]^[K]; A^[I]^[K] := 0.0; end else begin MCol^[I] := 0.0; A^[I]^[K] := 1.0; end; { Transform pivot row } T := 1.0 / Pvt; for J := Lb to Ub do A^[K]^[J] := T * A^[K]^[J]; B^[K] := T * B^[K]; { Transform other rows } for I := Lb to Ub do if I <> K then begin T := MCol^[I]; for J := Lb to Ub do A^[I]^[J] := A^[I]^[J] - T * A^[K]^[J]; B^[I] := B^[I] - T * B^[K]; end; Inc(K); end; { Exchange lines of inverse matrix and solution vector } for I := Ub downto Lb do begin Ik := PCol^[I]; if Ik <> I then for J := Lb to Ub do FSwap(A^[I]^[J], A^[Ik]^[J]); FSwap(B^[I], B^[Ik]); end; { Exchange columns of inverse matrix } for J := Ub downto Lb do begin Jk := PRow^[J]; if Jk <> J then for I := Lb to Ub do FSwap(A^[I]^[J], A^[I]^[Jk]); end; Terminate(MatOk); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ulambert.pas0000664000175000017500000001115711326434464021463 0ustar michaelmichael{ ****************************************************************** Lambert's function Translated from Fortran code by Barry et al. (http://www.netlib.org/toms/743) ****************************************************************** } unit ulambert; interface uses utypes, umath; function LambertW(X : Float; UBranch, Offset : Boolean) : Float; { ---------------------------------------------------------------------- Lambert's W function: Y = W(X) ==> X = Y * Exp(Y) X >= -1/e ---------------------------------------------------------------------- X = Argument UBranch = TRUE for computing the upper branch (X >= -1/e, W(X) >= -1) FALSE for computing the lower branch (-1/e <= X < 0, W(X) <= -1) Offset = TRUE for computing W(X - 1/e), X >= 0 FALSE for computing W(X) ---------------------------------------------------------------------- } implementation {$IFDEF SINGLEREAL} const NBITS = 23; { MachEp = 2^(-NBITS) } X0 = 0.03507693900966790567; { MachEp^(1/6) / 2 } X1 = -0.30212011943278473033; { - Exp(-1) * (1 - 17 * MachEp^(2/7) } {$ELSE} {$IFDEF EXTENDEDREAL} const NBITS = 63; X0 = 0.0003452669830012439084; X1 = -0.36785558424357094358; {$ELSE} const NBITS = 52; X0 = 0.001230391650287962075; X1 = -0.36766871970031223379; {$ENDIF} {$ENDIF} const EM = -0.36787944117144232160; { - Exp(-1) } EM9 = -0.0001234098040866795495; { - Exp(-9) } C13 = 1.0 / 3.0; C23 = 2.0 * C13; EM2 = 2.0 / EM; D12 = - EM2; AN3 = 8.0 / 3.0; AN4 = 135.0 / 83.0; AN5 = 166.0 / 39.0; AN6 = 3167.0 / 3549.0; S21 = 2.0 * Sqrt2 - 3.0; S22 = 4.0 - 3.0 * Sqrt2; S23 = Sqrt2 - 2.0; function LambertW(X : Float; UBranch, Offset : Boolean) : Float; var I, NITER : Integer; AN2, DELX, ETA, RETA, T, TEMP, TEMP2, TS, WAPR, XX, ZL, ZN : Float; begin SetErrCode(FOk); if Offset then begin DELX := X; if DELX < 0.0 then begin LambertW := DefaultVal(FDomain, 0.0); Exit; end; XX := X + EM; end else begin if X < EM then begin LambertW := DefaultVal(FDomain, 0.0); Exit; end; if X = EM then begin LambertW := - 1.0; Exit; end; XX := X; DELX := XX - EM; end; if UBranch then begin if Abs(XX) <= X0 then begin LambertW := XX / (1.0 + XX / (1.0 + XX / (2.0 + XX / (0.6 + 0.34 * XX)))); Exit; end; if XX <= X1 then begin RETA := Sqrt(D12 * DELX); LambertW := RETA / (1.0 + RETA / (3.0 + RETA / (RETA / (AN4 + RETA / (RETA * AN6 + AN5)) + AN3))) - 1.0; Exit; end; if XX <= 20.0 then begin RETA := Sqrt2 * Sqrt(1.0 - XX / EM); AN2 := 4.612634277343749 * Sqrt(Sqrt(RETA + 1.09556884765625)); WAPR := RETA / (1.0 + RETA / (3.0 + (S21 * AN2 + S22) * RETA / (S23 * (AN2 + RETA)))) - 1.0; end else begin ZL := Ln(XX); WAPR := Ln(XX / Ln(XX / Power(ZL, Exp(- 1.124491989777808 / (0.4225028202459761 + ZL))))); end end else begin if XX >= 0.0 then begin LambertW := DefaultVal(FDomain, 0.0); Exit; end; if XX <= X1 then begin RETA := Sqrt(D12 * DELX); LambertW := RETA / (RETA / (3.0 + RETA / (RETA / (AN4 + RETA / (RETA * AN6 - AN5)) - AN3)) - 1.0) - 1.0; Exit; end; ZL := Ln(- XX); if XX <= EM9 then begin T := - 1.0 - ZL; TS := Sqrt(T); WAPR := ZL - (2.0 * TS) / (SQRT2 + (C13 - T / (2.7E2 + TS * 127.0471381349219)) * TS); end else begin ETA := 2.0 - EM2 * XX; WAPR := Ln(XX / Ln(- XX / ((1.0 - 0.5043921323068457 * (ZL + 1.0)) * (Sqrt(ETA) + ETA / 3.0) + 1.0))); end end; if NBITS < 56 then NITER := 1 else NITER := 2; for I := 1 to NITER do begin ZN := Ln(XX / WAPR) - WAPR; TEMP := 1.0 + WAPR; TEMP2 := TEMP + C23 * ZN; TEMP2 := 2.0 * TEMP * TEMP2; WAPR := WAPR * (1.0 + (ZN / TEMP) * (TEMP2 - ZN) / (TEMP2 - 2.0 * ZN)); end; LambertW := WAPR; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ukhi2.pas0000664000175000017500000000476011326434464020674 0ustar michaelmichael{ ****************************************************************** Khi-2 test ****************************************************************** } unit ukhi2; interface uses utypes; procedure Khi2_Conform(N_cls : Integer; N_estim : Integer; Obs : PIntVector; Calc : PVector; var Khi2 : Float; var DoF : Integer); { ------------------------------------------------------------------ Khi-2 test for conformity ------------------------------------------------------------------ } procedure Khi2_Indep(N_lin : Integer; N_col : Integer; Obs : PIntMatrix; var Khi2 : Float; var DoF : Integer); { ------------------------------------------------------------------ Khi-2 test for independence ------------------------------------------------------------------ } implementation procedure Khi2_Conform(N_cls : Integer; N_estim : Integer; Obs : PIntVector; Calc : PVector; var Khi2 : Float; var DoF : Integer); var I : Integer; begin Khi2 := 0.0; for I := 1 to N_cls do Khi2 := Khi2 + Sqr(Obs^[I] - Calc^[I]) / Calc^[I]; DoF := N_cls - N_estim - 1; end; procedure Khi2_Indep(N_lin : Integer; N_col : Integer; Obs : PIntMatrix; var Khi2 : Float; var DoF : Integer); var SumLin, SumCol : PIntVector; Sum : Integer; Prob, Calc : Float; I, J : Integer; begin DimIntVector(SumLin, N_lin); DimIntVector(SumCol, N_col); for I := 1 to N_lin do for J := 1 to N_col do SumLin^[I] := SumLin^[I] + Obs^[I]^[J]; for J := 1 to N_col do for I := 1 to N_lin do SumCol^[J] := SumCol^[J] + Obs^[I]^[J]; Sum := 0; for I := 1 to N_lin do Sum := Sum + SumLin^[I]; Khi2 := 0.0; for I := 1 to N_lin do begin Prob := SumLin^[I] / Sum; for J := 1 to N_col do begin Calc := SumCol^[J] * Prob; Khi2 := Khi2 + Sqr(Obs^[I]^[J] - Calc) / Calc; end; end; DoF := Pred(N_lin) * Pred(N_col); DelIntVector(SumLin, N_lin); DelIntVector(SumCol, N_col); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ujacobi.pas0000664000175000017500000001207011326434464021257 0ustar michaelmichael{ ****************************************************************** Eigenvalues and eigenvectors of a symmetric matrix ****************************************************************** } unit ujacobi; interface uses utypes, uminmax, utrigo; procedure Jacobi(A : PMatrix; Lb, Ub, MaxIter : Integer; Tol : Float; Lambda : PVector; V : PMatrix); { ------------------------------------------------------------------ Eigenvalues and eigenvectors of a symmetric matrix by the iterative method of Jacobi ------------------------------------------------------------------ Input parameters : A = matrix Lb = index of first matrix element Ub = index of last matrix element MaxIter = maximum number of iterations Tol = required precision ------------------------------------------------------------------ Output parameters : Lambda = eigenvalues in decreasing order V = matrix of eigenvectors (columns) ------------------------------------------------------------------ Possible results : MatOk MatNonConv ------------------------------------------------------------------ The eigenvectors are normalized, with their first component > 0 This procedure destroys the original matrix A ------------------------------------------------------------------ } implementation procedure Jacobi(A : PMatrix; Lb, Ub, MaxIter : Integer; Tol : Float; Lambda : PVector; V : PMatrix); var I, J, K, Im, Jm, Iter : Integer; B, C, C2, Na, Nd, P, Q, S, S2, R, T : Float; begin Iter := 0; Na := 0.0; Nd := 0.0; R := 0.0; for I := Lb to Ub do begin V^[I]^[I] := 1.0; Nd := Nd + Sqr(A^[I]^[I]); if I <> Ub then for J := Succ(I) to Ub do begin R := R + Sqr(A^[I]^[J]); V^[I]^[J] := 0.0; V^[J]^[I] := 0.0; end; end; Na := Nd + 2.0 * R; repeat R := 0.0; for I := Lb to Pred(Ub) do for J := Succ(I) to Ub do begin T := Abs(A^[I]^[J]); if T > R then begin R := T; Im := I; Jm := J; end; end; B := A^[Im]^[Im] - A^[Jm]^[Jm]; if B = 0 then begin C := Sqrt2div2; S := C * Sgn(A^[Im]^[Jm]); end else begin P := 2.0 * A^[Im]^[Jm] * Sgn(B); Q := Abs(B); R := Pythag(P, Q); C := Sqrt(0.5 * (1.0 + Q / R)); S := 0.5 * P / (R * C); end; for K := Lb to Ub do begin R := V^[K]^[Im]; V^[K]^[Im] := C * R + S * V^[K]^[Jm]; V^[K]^[Jm] := C * V^[K]^[Jm] - S * R; end; if Im <> Lb then for K := Lb to Pred(Im) do begin R := A^[K]^[Im]; A^[K]^[Im] := C * R + S * A^[K]^[Jm]; A^[K]^[Jm] := C * A^[K]^[Jm] - S * R; end; if Jm <> Succ(Im) then for K := Succ(Im) to Pred(Jm) do begin R := A^[Im]^[K]; A^[Im]^[K] := C * R + S * A^[K]^[Jm]; A^[K]^[Jm] := C * A^[K]^[Jm] - S * R; end; if Jm <> Ub then for K := Succ(Jm) to Ub do begin R := A^[Im]^[K]; A^[Im]^[K] := C * R + S * A^[Jm]^[K]; A^[Jm]^[K] := C * A^[Jm]^[K] - S * R; end; Nd := Nd + 2.0 * Sqr(A^[Im]^[Jm]); C2 := Sqr(C); S2 := Sqr(S); P := 2.0 * S * C * A^[Im]^[Jm]; R := A^[Im]^[Im]; A^[Im]^[Im] := C2 * R + S2 * A^[Jm]^[Jm] + P; A^[Jm]^[Jm] := S2 * R + C2 * A^[Jm]^[Jm] - P; A^[Im]^[Jm] := 0.0; Inc(Iter); if Iter > MaxIter then begin SetErrCode(MatNonConv); Exit; end; until Abs(1.0 - Na / Nd) < Tol; { The diagonal terms of the transformed matrix are the eigenvalues } for I := Lb to Ub do Lambda^[I] := A^[I]^[I]; { Sort eigenvalues and eigenvectors } for I := Lb to Pred(Ub) do begin K := I; R := Lambda^[I]; for J := Succ(I) to Ub do if Lambda^[J] > R then begin K := J; R := Lambda^[J]; end; FSwap(Lambda^[I], Lambda^[K]); for J := Lb to Ub do FSwap(V^[J]^[I], V^[J]^[K]); end; { Make sure that the first component of each eigenvector is > 0 } for J := Lb to Ub do if V^[Lb]^[J] < 0.0 then for I := Lb to Ub do V^[I]^[J] := - V^[I]^[J]; SetErrCode(MatOk); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uinvnorm.pas0000664000175000017500000001040011326434464021513 0ustar michaelmichael{ ****************************************************************** Inverse of Normal distribution function Translated from C code in Cephes library (http://www.moshier.net) ****************************************************************** } unit uinvnorm; interface uses utypes, uminmax, upolev; function InvNorm(P : Float) : Float; { ------------------------------------------------------------------ Inverse of Normal distribution function Returns the argument, X, for which the area under the Gaussian probability density function (integrated from minus infinity to X) is equal to P. ------------------------------------------------------------------ } implementation function InvNorm(P : Float) : Float; const P0 : TabCoef = ( 8.779679420055069160496E-3, - 7.649544967784380691785E-1, 2.971493676711545292135E0, - 4.144980036933753828858E0, 2.765359913000830285937E0, - 9.570456817794268907847E-1, 1.659219375097958322098E-1, - 1.140013969885358273307E-2, 0, 0); Q0 : TabCoef = ( - 5.303846964603721860329E0, 9.908875375256718220854E0, - 9.031318655459381388888E0, 4.496118508523213950686E0, - 1.250016921424819972516E0, 1.823840725000038842075E-1, - 1.088633151006419263153E-2, 0, 0, 0); P1 : TabCoef = ( 4.302849750435552180717E0, 4.360209451837096682600E1, 9.454613328844768318162E1, 9.336735653151873871756E1, 5.305046472191852391737E1, 1.775851836288460008093E1, 3.640308340137013109859E0, 3.691354900171224122390E-1, 1.403530274998072987187E-2, 1.377145111380960566197E-4); Q1 : TabCoef = ( 2.001425109170530136741E1, 7.079893963891488254284E1, 8.033277265194672063478E1, 5.034715121553662712917E1, 1.779820137342627204153E1, 3.845554944954699547539E0, 3.993627390181238962857E-1, 1.526870689522191191380E-2, 1.498700676286675466900E-4, 0); P2 : TabCoef = ( 3.244525725312906932464E0, 6.856256488128415760904E0, 3.765479340423144482796E0, 1.240893301734538935324E0, 1.740282292791367834724E-1, 9.082834200993107441750E-3, 1.617870121822776093899E-4, 7.377405643054504178605E-7, 0, 0); Q2 : TabCoef = ( 6.021509481727510630722E0, 3.528463857156936773982E0, 1.289185315656302878699E0, 1.874290142615703609510E-1, 9.867655920899636109122E-3, 1.760452434084258930442E-4, 8.028288500688538331773E-7, 0, 0, 0); P3 : TabCoef = ( 2.020331091302772535752E0, 2.133020661587413053144E0, 2.114822217898707063183E-1, - 6.500909615246067985872E-3, - 7.279315200737344309241E-4, - 1.275404675610280787619E-5, - 6.433966387613344714022E-8, - 7.772828380948163386917E-11, 0, 0); Q3 : TabCoef = ( 2.278210997153449199574E0, 2.345321838870438196534E-1, - 6.916708899719964982855E-3, - 7.908542088737858288849E-4, - 1.387652389480217178984E-5, - 7.001476867559193780666E-8, - 8.458494263787680376729E-11, 0, 0, 0); var X, Y, Z, Y2, X0, X1 : Float; Code : Integer; begin if (P <= 0.0) or (P >= 1.0) then begin InvNorm := DefaultVal(FDomain, Sgn(P) * MaxNum); Exit; end; Code := 1; Y := P; if Y > (1.0 - 0.13533528323661269189) then { 0.135... = exp(-2) } begin Y := 1.0 - Y; Code := 0; end; if Y > 0.13533528323661269189 then begin Y := Y - 0.5; Y2 := Y * Y; X := Y + Y * (Y2 * PolEvl(Y2, P0, 7) / P1Evl(Y2, Q0, 7)); X := X * Sqrt2Pi; InvNorm := X; Exit; end; X := Sqrt(- 2.0 * Ln(Y)); X0 := X - Ln(X) / X; Z := 1.0 / X; if X < 8.0 then X1 := Z * PolEvl(Z, P1, 9) / P1Evl(Z, Q1, 9) else if X < 32.0 then X1 := Z * PolEvl(Z, P2, 7) / P1Evl(Z, Q2, 7) else X1 := Z * PolEvl(Z, P3, 7) / P1Evl(Z, Q3, 7); X := X0 - X1; if Code <> 0 then X := - X; InvNorm := X; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uinvgam.pas0000664000175000017500000001000111326434464021301 0ustar michaelmichael{ ****************************************************************** Inverses of incomplete Gamma function and Khi-2 distribution Translated from C code in Cephes library (http://www.moshier.net) ****************************************************************** } unit uinvgam; interface uses utypes, ugamma, uigamma, uinvnorm; function InvGamma(A, P : Float) : Float; { ------------------------------------------------------------------ Given P, the function finds X such that IGamma(A, X) = P It is best valid in the right-hand tail of the distribution, P > 0.5 ------------------------------------------------------------------ } function InvKhi2(Nu : Integer; P : Float) : Float; { ------------------------------------------------------------------ Inverse of Khi-2 distribution function Returns the argument, X, for which the area under the Khi-2 probability density function (integrated from 0 to X) is equal to P. ------------------------------------------------------------------ } implementation function InvGamma(A, P : Float) : Float; var x0, x1, x, Y, yl, yh, y1, d, lgm, dithresh : Float; i, ndir : Integer; label ihalve, cont, cont1, done; begin if P > 0.5 then SetErrCode(FPLoss) else SetErrCode(FOk); Y := 1.0 - P; { Bound the solution } x0 := MaxNum; yl := 0.0; x1 := 0.0; yh := 1.0; dithresh := 5 * MachEp; { Approximation to inverse function } d := 1.0 / (9.0 * a); y1 := 1.0 - d - InvNorm(Y) * sqrt(d); x := a * y1 * y1 * y1; lgm := LnGamma(a); for i := 0 to 9 do begin if (x > x0) or (x < x1) then goto ihalve; y1 := JGamma(a, x); if (y1 < yl) or (y1 > yh) then goto ihalve; if y1 < Y then begin x0 := x; yl := y1 end else begin x1 := x; yh := y1 end; { Compute the derivative of the function at this point } d := (a - 1) * Ln(x) - x - lgm; if d < MinLog then goto ihalve; d := -exp(d); { Compute the step to the next approximation of x } d := (y1 - Y) / d; if abs(d / x) < MachEp then goto done; x := x - d; end; { Resort to interval halving if Newton iteration did not converge } ihalve: d := 0.0625; if x0 = MaxNum then begin if x <= 0 then x := 1; while x0 = MaxNum do begin x := (1 + d) * x; y1 := JGamma(a, x); if y1 < Y then begin x0 := x; yl := y1; goto cont end; d := d + d end end; cont: d := 0.5; ndir := 0; for i := 0 to 399 do begin x := x1 + d * (x0 - x1); y1 := JGamma(a, x); lgm := (x0 - x1) / (x1 + x0); if abs(lgm) < dithresh then goto cont1; lgm := (y1 - Y) / Y; if abs(lgm) < dithresh then goto cont1; if x <= 0 then goto cont1; if y1 >= Y then begin x1 := x; yh := y1; if ndir < 0 then begin ndir := 0; d := 0.5 end else if ndir > 1 then d := 0.5 * d + 0.5 else d := (Y - yl) / (yh - yl); ndir := ndir + 1; end else begin x0 := x; yl := y1; if ndir > 0 then begin ndir := 0; d := 0.5 end else if ndir < -1 then d := 0.5 * d else d := (Y - yl) / (yh - yl); ndir := ndir - 1; end; end; cont1: if x = 0 then SetErrCode(FUnderflow); done: InvGamma := x end; function InvKhi2(Nu : Integer; P : Float) : Float; { ------------------------------------------------------------------ Inverse of Khi-2 distribution function Returns the argument, X, for which the area under the Khi-2 probability density function (integrated from 0 to X) is equal to P. ------------------------------------------------------------------ } begin if (P < 0.0) or (P > 1.0) or (Nu < 1) then InvKhi2 := DefaultVal(FDomain, 0.0) else InvKhi2 := 2.0 * InvGamma(0.5 * Nu, P); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uinvbeta.pas0000664000175000017500000001664711326434464021476 0ustar michaelmichael{ ****************************************************************** Inverses of incomplete Beta function, Student and F-distributions Translated from C code in Cephes library (http://www.moshier.net) ****************************************************************** } unit uinvbeta; interface uses utypes, ugamma, uibeta, uinvnorm; function InvBeta(A, B, Y : Float) : Float; { ------------------------------------------------------------------ Inverse of incomplete Beta function. Given P, the function finds X such that IBeta(A, B, X) = Y ------------------------------------------------------------------ } function InvStudent(Nu : Integer; P : Float) : Float; { ------------------------------------------------------------------ Inverse of Student's t-distribution function Given probability P, finds the argument X such that FStudent(Nu, X) = P ------------------------------------------------------------------ } function InvSnedecor(Nu1, Nu2 : Integer; P : Float) : Float; { ------------------------------------------------------------------ Inverse of Snedecor's F-distribution function Given probability P, finds the argument X such that FSnedecor(Nu1, Nu2, X) = P ------------------------------------------------------------------ } implementation function InvBeta(A, B, Y : Float) : Float; var a1, b1, y0, y1, d, x, x0, x1 : Float; lgm, yp, di, dithresh, yl, yh, xt : Float; i, rflg, ndir, nflg : Integer; label ihalve, newt, under, noconv, done; begin SetErrCode(FOk); if Y <= 0 then begin InvBeta := 0.0; Exit; end; if Y >= 1 then begin InvBeta := 1.0; Exit; end; x0 := 0.0; yl := 0.0; x1 := 1.0; yh := 1.0; nflg := 0; if (A <= 1) or (B <= 1) then begin dithresh := 1e-6; rflg := 0; a1 := A; b1 := B; y0 := Y; x := a1 / (a1 + b1); y1 := IBeta(a1, b1, x); goto ihalve end else dithresh := 1e-4; { approximation to inverse function } yp := - InvNorm(Y); if Y > 0.5 then begin rflg := 1; a1 := B; b1 := A; y0 := 1.0 - Y; yp := -yp; end else begin rflg := 0; a1 := A; b1 := B; y0 := Y; end; lgm := (yp * yp - 3.0) / 6.0; x := 2.0 / (1.0 / (2.0 * a1 - 1.0) + 1.0 / (2.0 * b1 - 1.0)); d := yp * Sqrt(x + lgm) / x - (1.0 / (2.0 * b1 - 1.0) - 1.0 / (2.0 * a1 - 1.0)) * (lgm + 5.0 / 6.0 - 2.0 / (3.0 * x)); d := 2.0 * d; if d < MinLog then goto under; x := a1 / (a1 + b1 * Exp(d)); y1 := IBeta(a1, b1, x); yp := (y1 - y0) / y0; if Abs(yp) < 0.2 then goto newt; { Resort to interval halving if not close enough } ihalve: ndir := 0; di := 0.5; for i := 0 to 99 do begin if i <> 0 then begin x := x0 + di * (x1 - x0); if x = 1.0 then x := 1.0 - MachEp; if x = 0.0 then begin di := 0.5; x := x0 + di * (x1 - x0); if x = 0.0 then goto under end; y1 := IBeta(a1, b1, x); yp := (x1 - x0) / (x1 + x0); if abs(yp) < dithresh then goto newt; yp := (y1 - y0) / y0; if abs(yp) < dithresh then goto newt; end; if y1 < y0 then begin x0 := x; yl := y1; if ndir < 0 then begin ndir := 0; di := 0.5; end else if ndir > 3 then di := 1.0 - Sqr(1.0 - di) else if ndir > 1 then di := 0.5 * di + 0.5 else di := (y0 - y1) / (yh - yl); ndir := ndir + 1; if x0 > 0.75 then begin if rflg = 1 then begin rflg := 0; a1 := A; b1 := B; y0 := Y; end else begin rflg := 1; a1 := B; b1 := A; y0 := 1.0 - Y; end; x := 1.0 - x; y1 := IBeta(a1, b1, x); x0 := 0.0; yl := 0.0; x1 := 1.0; yh := 1.0; goto ihalve end end else begin x1 := x; if (rflg = 1) and (x1 < MachEp) then begin x := 0.0; goto done end; yh := y1; if ndir > 0 then begin ndir := 0; di := 0.5 end else if ndir < -3 then di := di * di else if ndir < -1 then di := 0.5 * di else di := (y1 - y0) / (yh - yl); ndir := ndir - 1; end; end; SetErrCode(FPLoss); if x0 >= 1.0 then begin x := 1.0 - MachEp; goto done end; if x <= 0.0 then begin under: SetErrCode(FUnderflow); x := 0.0; goto done; end; newt: if nflg = 1 then goto done; nflg := 1; lgm := LnGamma(a1 + b1) - LnGamma(a1) - LnGamma(b1); for i := 0 to 7 do begin { Compute the function at this point } if i <> 0 then y1 := IBeta(a1, b1, x); if y1 < yl then begin x := x0; y1 := yl end else if y1 > yh then begin x := x1; y1 := yh end else if y1 < y0 then begin x0 := x; yl := y1 end else begin x1 := x; yh := y1 end; if (x = 1.0) or (x = 0.0) then goto noconv; { Compute the derivative of the function at this point } d := (a1 - 1.0) * Ln(x) + (b1 - 1.0) * Ln(1 - x) + lgm; if d < MinLog then goto done; if d > MaxLog then goto noconv; d := exp(d); { Compute the step to the next approximation of x } d := (y1 - y0) / d; xt := x - d; if xt <= x0 then begin y1 := (x - x0) / (x1 - x0); xt := x0 + 0.5 * y1 * (x - x0); if xt <= 0.0 then goto noconv; end; if xt >= x1 then begin y1 := (x1 - x) / (x1 - x0); xt := x1 - 0.5 * y1 * (x1 - x); if xt >= 1.0 then goto noconv; end; x := xt; if abs(d / x) < 128.0 * MachEp then goto done end; noconv: { Did not converge } dithresh := 256.0 * MachEp; goto ihalve; done: if rflg = 1 then if x <= MachEp then x := 1.0 - MachEp else x := 1.0 - x; InvBeta := x; end; function InvStudent(Nu : Integer; P : Float) : Float; var t, rk, z : Float; rflg : Integer; begin if (Nu < 1) or (P < 0.0) or (P > 1.0) then begin InvStudent := DefaultVal(FDomain, 0.0); Exit; end; if P = 0.5 then begin SetErrCode(FOk); InvStudent := 0.0; Exit; end; rk := Nu; if (P > 0.25) and (P < 0.75) then begin z := 1.0 - 2.0 * P; z := InvBeta(0.5, 0.5 * rk, Abs(z)); t := Sqrt(rk * z / (1 - z)); if P < 0.5 then t := -t; InvStudent := t; Exit; end; if P < 0.5 then begin z := P; rflg := -1 end else begin z := 1.0 - P; rflg := 1 end; z := InvBeta(0.5 * rk, 0.5, 2 * z); if MaxNum * z < rk then begin InvStudent := rflg * MaxNum; Exit; end; t := Sqrt(rk / z - rk); InvStudent := rflg * t; end; function InvSnedecor(Nu1, Nu2 : Integer; P : Float) : Float; var w : Float; begin if (Nu1 < 1) or (Nu2 < 1) or (P < 0.0) or (P > 1.0) then begin InvSnedecor := DefaultVal(FDomain, 0.0); Exit; end; w := InvBeta(0.5 * Nu2, 0.5 * Nu1, 1.0 - P); InvSnedecor := (Nu2 - Nu2 * w) / (Nu1 * w); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uinterv.pas0000664000175000017500000000325411326434464021343 0ustar michaelmichael{ ****************************************************************** Compute an appropriate interval for a set of values ****************************************************************** } unit uinterv; interface uses utypes, umath; procedure Interval(X1, X2 : Float; MinDiv, MaxDiv : Integer; var Min, Max, Step : Float); { ------------------------------------------------------------------ Determines an interval [Min, Max] including the values from X1 to X2, and a subdivision Step of this interval ------------------------------------------------------------------ Input parameters : X1, X2 = min. & max. values to be included MinDiv = minimum nb of subdivisions MaxDiv = maximum nb of subdivisions ------------------------------------------------------------------ Output parameters : Min, Max, Step ------------------------------------------------------------------ } implementation procedure Interval(X1, X2 : Float; MinDiv, MaxDiv : Integer; var Min, Max, Step : Float); var H, R, K : Float; begin if X1 >= X2 then Exit; H := X2 - X1; R := Int(Log10(H)); if H < 1.0 then R := R - 1.0; Step := Exp10(R); repeat K := Int(H / Step); if K < MinDiv then Step := 0.5 * Step; if K > MaxDiv then Step := 2.0 * Step; until (K >= MinDiv) and (K <= MaxDiv); Min := Step * Int(X1 / Step); Max := Step * Int(X2 / Step); while Min > X1 do Min := Min - Step; while Max < X2 do Max := Max + Step; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uigmdist.pas0000664000175000017500000000401211326434464021465 0ustar michaelmichael{ ****************************************************************** Probability functions related to the incomplete Gamma function ****************************************************************** } unit uigmdist; interface uses utypes, uigamma; function FGamma(A, B, X : Float) : Float; { Cumulative probability for Gamma distrib. with param. A and B } function FPoisson(Mu : Float; K : Integer) : Float; { Cumulative probability for Poisson distrib. } function FNorm(X : Float) : Float; { Cumulative probability for standard normal distrib. } function PNorm(X : Float) : Float; { Prob(|U| > X) for standard normal distrib. } function FKhi2(Nu : Integer; X : Float) : Float; { Cumulative prob. for khi-2 distrib. with Nu d.o.f. } function PKhi2(Nu : Integer; X : Float) : Float; { Prob(Khi2 > X) for khi-2 distrib. with Nu d.o.f. } implementation function FGamma(A, B, X : Float) : Float; begin FGamma := IGamma(A, B * X); end; function FPoisson(Mu : Float; K : Integer) : Float; begin if (Mu <= 0.0) or (K < 0) then FPoisson := DefaultVal(FDomain, 0.0) else if K = 0 then if (- Mu) < MinLog then FPoisson := DefaultVal(FUnderflow, 0.0) else FPoisson := DefaultVal(FOk, Exp(- Mu)) else FPoisson := 1.0 - IGamma(K + 1, Mu); end; function FNorm(X : Float) : Float; begin FNorm := 0.5 * (1.0 + Erf(X * Sqrt2div2)); end; function PNorm(X : Float) : Float; var A : Float; begin A := Abs(X); if A = 0.0 then PNorm := DefaultVal(FOk, 1.0) else if A < 1.0 then PNorm := 1.0 - Erf(A * Sqrt2div2) else PNorm := Erfc(A * Sqrt2div2); end; function FKhi2(Nu : Integer; X : Float) : Float; begin if (Nu < 1) or (X <= 0) then FKhi2 := DefaultVal(FDomain, 0.0) else FKhi2 := IGamma(0.5 * Nu, 0.5 * X); end; function PKhi2(Nu : Integer; X : Float) : Float; begin if (Nu < 1) or (X <= 0) then PKhi2 := DefaultVal(FDomain, 0.0) else PKhi2 := 1.0 - IGamma(0.5 * Nu, 0.5 * X); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uigamma.pas0000664000175000017500000000606311326434464021270 0ustar michaelmichael{ ****************************************************************** Incomplete Gamma function and related functions. Translated from C code in Cephes library (http://www.moshier.net) ****************************************************************** } unit uigamma; interface uses utypes, ugamma; function IGamma(A, X : Float) : Float; { Incomplete Gamma function} function JGamma(A, X : Float) : Float; { Complement of incomplete Gamma function } function Erf(X : Float) : Float; { Error function } function Erfc(X : Float) : Float; { Complement of error function } implementation function IGamma(A, X : Float) : Float; var Ans, Ax, C, R : Float; begin SetErrCode(FOk); if (X <= 0.0) or (A <= 0.0) then begin IGamma := 0.0; Exit; end; if (X > 1.0) and (X > A) then begin IGamma := 1.0 - JGamma(A, X); Exit; end; Ax := A * Ln(X) - X - LnGamma(A); if Ax < MinLog then begin IGamma := DefaultVal(FUnderflow, 0.0); Exit; end; Ax := Exp(Ax); { Power series } R := A; C := 1.0; Ans := 1.0; repeat R := R + 1.0; C := C * X / R; Ans := Ans + C; until C / Ans <= MachEp; IGamma := Ans * Ax / A; end; function JGamma(A, X : Float) : Float; const Big = 1.0 / MachEp; var Ans, C, Yc, Ax, Y, Z, R, T, Pk, Pkm1, Pkm2, Qk, Qkm1, Qkm2 : Float; begin SetErrCode(FOk); if (X <= 0.0) or (A <= 0.0) then begin JGamma := 1.0; Exit; end; if (X < 1.0) or (X < A) then begin JGamma := 1.0 - IGamma(A, X); Exit; end; Ax := A * Ln(X) - X - LnGamma(A); if Ax < MinLog then begin JGamma := DefaultVal(FUnderflow, 0.0); Exit; end; Ax := Exp(Ax); { Continued fraction } Y := 1.0 - A; Z := X + Y + 1.0; C := 0.0; Pkm2 := 1.0; Qkm2 := X; Pkm1 := X + 1.0; Qkm1 := Z * X; Ans := Pkm1 / Qkm1; repeat C := C + 1.0; Y := Y + 1.0; Z := Z + 2.0; Yc := Y * C; Pk := Pkm1 * Z - Pkm2 * Yc; Qk := Qkm1 * Z - Qkm2 * Yc; if Qk <> 0.0 then begin R := Pk / Qk; T := Abs((Ans - R) / R); Ans := R; end else T := 1.0; Pkm2 := Pkm1; Pkm1 := Pk; Qkm2 := Qkm1; Qkm1 := Qk; if Abs(Pk) > Big then begin Pkm2 := Pkm2 * MachEp; Pkm1 := Pkm1 * MachEp; Qkm2 := Qkm2 * MachEp; Qkm1 := Qkm1 * MachEp; end; until T <= MachEp; JGamma := Ans * Ax; end; function Erf(X : Float) : Float; begin if X < 0.0 then Erf := - IGamma(0.5, Sqr(X)) else Erf := IGamma(0.5, Sqr(X)); end; function Erfc(X : Float) : Float; begin if X < 0.0 then Erfc := 1.0 + IGamma(0.5, Sqr(X)) else Erfc := JGamma(0.5, Sqr(X)); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uibtdist.pas0000664000175000017500000000471011326434464021474 0ustar michaelmichael{ ****************************************************************** Probability functions related to the incomplete Beta function ****************************************************************** } unit uibtdist; interface uses utypes, umath, uibeta; function FBeta(A, B, X : Float) : Float; { Cumulative probability for Beta distrib. with param. A and B } function FBinom(N : Integer; P : Float; K : Integer) : Float; { Cumulative probability for binomial distrib. } function FStudent(Nu : Integer; X : Float) : Float; { Cumulative probability for Student distrib. with Nu d.o.f. } function PStudent(Nu : Integer; X : Float) : Float; { Prob(|t| > X) for Student distrib. with Nu d.o.f. } function FSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; { Cumulative prob. for Fisher-Snedecor distrib. with Nu1 and Nu2 d.o.f. } function PSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; { Prob(F > X) for Fisher-Snedecor distrib. with Nu1 and Nu2 d.o.f. } implementation function FBeta(A, B, X : Float) : Float; begin FBeta := IBeta(A, B, X); end; function FBinom(N : Integer; P : Float; K : Integer) : Float; begin if (P < 0.0) or (P > 1.0) or (N <= 0) or (N < K) then FBinom := DefaultVal(FDomain, 0.0) else if K = 0 then FBinom := DefaultVal(FOk, Power(1.0 - P, N)) else if K = N then FBinom := DefaultVal(FOk, 1.0) else FBinom := 1.0 - IBeta(K + 1, N - K, P); end; function FStudent(Nu : Integer; X : Float) : Float; var F : Float; begin if Nu < 1 then FStudent := DefaultVal(FDomain, 0.0) else if X = 0 then FStudent := DefaultVal(FOk, 0.5) else begin F := 0.5 * IBeta(0.5 * Nu, 0.5, Nu / (Nu + X * X)); if X < 0.0 then FStudent := F else FStudent := 1.0 - F; end; end; function PStudent(Nu : Integer; X : Float) : Float; begin if Nu < 1 then PStudent := DefaultVal(FDomain, 0.0) else PStudent := IBeta(0.5 * Nu, 0.5, Nu / (Nu + X * X)); end; function FSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; begin if (Nu1 < 1) or (Nu2 < 1) or (X <= 0) then FSnedecor := DefaultVal(FDomain, 0.0) else FSnedecor := 1.0 - IBeta(0.5 * Nu2, 0.5 * Nu1, Nu2 / (Nu2 + Nu1 * X)); end; function PSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; begin if (Nu1 < 1) or (Nu2 < 1) or (X <= 0) then PSnedecor := DefaultVal(FDomain, 0.0) else PSnedecor := IBeta(0.5 * Nu2, 0.5 * Nu1, Nu2 / (Nu2 + Nu1 * X)); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uibeta.pas0000664000175000017500000001617611326434464021127 0ustar michaelmichael{ ****************************************************************** Incomplete Beta function. Translated from C code in Cephes library (http://www.moshier.net) ****************************************************************** } unit uibeta; interface uses utypes, umath, ugamma; function IBeta(A, B, X : Float) : Float; { Incomplete Beta function} implementation const Big = 1.0 / MachEp; function PSeries(A, B, X : Float) : Float; { Power series for incomplete beta integral. Use when B*X is small } var S, T, U, V, T1, Z, Ai : Float; N : Integer; begin Ai := 1.0 / A; U := (1.0 - B) * X; V := U / (A + 1.0); T1 := V; T := U; N := 2; S := 0.0; Z := MachEp * Ai; while Abs(V) > Z do begin U := (N - B) * X / N; T := T * U; V := T / (A + N); S := S + V; N := N + 1; end; S := S + T1; S := S + Ai; U := A * Ln(X); if (A + B < MaxGam) and (Abs(U) < MaxLog) then begin T := Gamma(A + B) / (Gamma(A) * Gamma(B)); S := S * T * Power(X, A); end else begin T := LnGamma(A + B) - LnGamma(A) - LnGamma(B) + U + Ln(S); if T < MinLog then S := 0.0 else S := Exp(T); end; PSeries := S; end; function CFrac1(A, B, X : Float) : Float; { Continued fraction expansion #1 for incomplete beta integral } var Xk, Pk, Pkm1, Pkm2, Qk, Qkm1, Qkm2, K1, K2, K3, K4, K5, K6, K7, K8, R, T, Ans, Thresh : Float; N : Integer; label CDone; begin K1 := A; K2 := A + B; K3 := A; K4 := A + 1.0; K5 := 1.0; K6 := B - 1.0; K7 := K4; K8 := A + 2.0; Pkm2 := 0.0; Qkm2 := 1.0; Pkm1 := 1.0; Qkm1 := 1.0; Ans := 1.0; R := 1.0; N := 0; Thresh := 3.0 * MachEp; repeat Xk := - (X * K1 * K2) / (K3 * K4); Pk := Pkm1 + Pkm2 * Xk; Qk := Qkm1 + Qkm2 * Xk; Pkm2 := Pkm1; Pkm1 := Pk; Qkm2 := Qkm1; Qkm1 := Qk; Xk := (X * K5 * K6) / (K7 * K8); Pk := Pkm1 + Pkm2 * Xk; Qk := Qkm1 + Qkm2 * Xk; Pkm2 := Pkm1; Pkm1 := Pk; Qkm2 := Qkm1; Qkm1 := Qk; if Qk <> 0.0 then R := Pk / Qk; if R <> 0.0 then begin T := Abs((Ans - R) / R); Ans := R; end else T := 1.0; if T < Thresh then goto CDone; K1 := K1 + 1.0; K2 := K2 + 1.0; K3 := K3 + 2.0; K4 := K4 + 2.0; K5 := K5 + 1.0; K6 := K6 - 1.0; K7 := K7 + 2.0; K8 := K8 + 2.0; if Abs(Qk) + Abs(Pk) > Big then begin Pkm2 := Pkm2 * MachEp; Pkm1 := Pkm1 * MachEp; Qkm2 := Qkm2 * MachEp; Qkm1 := Qkm1 * MachEp; end; if (Abs(Qk) < MachEp) or (Abs(Pk) < MachEp) then begin Pkm2 := Pkm2 * Big; Pkm1 := Pkm1 * Big; Qkm2 := Qkm2 * Big; Qkm1 := Qkm1 * Big; end; N := N + 1; until N > 400; SetErrCode(FPLoss); CDone: CFrac1 := Ans; end; function CFrac2(A, B, X : Float) : Float; { Continued fraction expansion #2 for incomplete beta integral } var Xk, Pk, Pkm1, Pkm2, Qk, Qkm1, Qkm2, K1, K2, K3, K4, K5, K6, K7, K8, R, T, Z, Ans, Thresh : Float; N : Integer; label CDone; begin K1 := A; K2 := B - 1.0; K3 := A; K4 := A + 1.0; K5 := 1.0; K6 := A + B; K7 := A + 1.0; K8 := A + 2.0; Pkm2 := 0.0; Qkm2 := 1.0; Pkm1 := 1.0; Qkm1 := 1.0; Z := X / (1.0 - X); Ans := 1.0; R := 1.0; N := 0; Thresh := 3.0 * MachEp; repeat Xk := - (Z * K1 * K2) / (K3 * K4); Pk := Pkm1 + Pkm2 * Xk; Qk := Qkm1 + Qkm2 * Xk; Pkm2 := Pkm1; Pkm1 := Pk; Qkm2 := Qkm1; Qkm1 := Qk; Xk := (Z * K5 * K6) / (K7 * K8); Pk := Pkm1 + Pkm2 * Xk; Qk := Qkm1 + Qkm2 * Xk; Pkm2 := Pkm1; Pkm1 := Pk; Qkm2 := Qkm1; Qkm1 := Qk; if Qk <> 0.0 then R := Pk / Qk; if R <> 0.0 then begin T := Abs((Ans - R) / R); Ans := R; end else T := 1.0; if T < Thresh then goto CDone; K1 := K1 + 1.0; K2 := K2 - 1.0; K3 := K3 + 2.0; K4 := K4 + 2.0; K5 := K5 + 1.0; K6 := K6 + 1.0; K7 := K7 + 2.0; K8 := K8 + 2.0; if Abs(Qk) + Abs(Pk) > Big then begin Pkm2 := Pkm2 * MachEp; Pkm1 := Pkm1 * MachEp; Qkm2 := Qkm2 * MachEp; Qkm1 := Qkm1 * MachEp; end; if (Abs(Qk) < MachEp) or (Abs(Pk) < MachEp) then begin Pkm2 := Pkm2 * Big; Pkm1 := Pkm1 * Big; Qkm2 := Qkm2 * Big; Qkm1 := Qkm1 * Big; end; N := N + 1; until N > 400; SetErrCode(FPLoss); CDone: CFrac2 := Ans; end; function IBeta(A, B, X : Float) : Float; var A1, B1, X1, T, W, Xc, Y : Float; Flag : Boolean; label Done; begin SetErrCode(FOk); if (A <= 0.0) or (B <= 0.0) or (X < 0.0) then begin IBeta := DefaultVal(FDomain, 0.0); Exit; end; if X > 1.0 then begin IBeta := DefaultVal(FDomain, 1.0); Exit; end; if (X = 0.0) or (X = 1.0) then begin IBeta := X; Exit; end; Flag := False; if (B * X <= 1.0) and (X <= 0.95) then begin T := PSeries(A, B, X); goto Done; end; W := 1.0 - X; { Reverse a and b if x is greater than the mean. } if X > A / (A + B) then begin Flag := True; A1 := B; B1 := A; Xc := X; X1 := W; end else begin A1 := A; B1 := B; Xc := W; X1 := X; end; if Flag and (B1 * X1 <= 1.0) and (X1 <= 0.95) then begin T := PSeries(A1, B1, X1); goto Done; end; { Choose expansion for optimal convergence } Y := X1 * (A1 + B1 - 2.0) - (A1 - 1.0); if Y < 0.0 then W := CFrac1(A1, B1, X1) else W := CFrac2(A1, B1, X1) / Xc; { Multiply w by the factor a b _ _ _ x (1-x) | (a+b) / ( a | (a) | (b) ) } Y := A1 * Ln(X1); T := B1 * Ln(Xc); if (A1 + B1 < MaxGam) and (Abs(Y) < MaxLog) and (Abs(T) < MaxLog) then begin T := Power(Xc, B1) ; T := T * Power(X1, A1); T := T / A1; T := T * W; T := T * Gamma(A1 + B1) / (Gamma(A1) * Gamma(B1)); end else begin { Resort to logarithms } Y := Y + T + LnGamma(A1 + B1) - LnGamma(A1) - LnGamma(B1) + Ln(W / A1); if Y < MinLog then T := 0.0 else T := Exp(Y); end; Done: if Flag then if T <= MachEp then T := 1.0 - MachEp else T := 1.0 - T; IBeta := T; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uhyper.pas0000664000175000017500000000506211326434464021162 0ustar michaelmichael{ ****************************************************************** Hyperbolic functions ****************************************************************** } unit uhyper; interface uses utypes, uminmax; function Sinh(X : Float) : Float; { Hyperbolic sine } function Cosh(X : Float) : Float; { Hyperbolic cosine } function Tanh(X : Float) : Float; { Hyperbolic tangent } function ArcSinh(X : Float) : Float; { Inverse hyperbolic sine } function ArcCosh(X : Float) : Float; { Inverse hyperbolic cosine } function ArcTanh(X : Float) : Float; { Inverse hyperbolic tangent } procedure SinhCosh(X : Float; var SinhX, CoshX : Float); { Sinh & Cosh } implementation function Sinh(X : Float) : Float; var ExpX : Float; begin if (X < MinLog) or (X > MaxLog) then Sinh := DefaultVal(FOverflow, Sgn(X) * MaxNum) else begin ExpX := Exp(X); Sinh := 0.5 * (ExpX - 1.0 / ExpX); SetErrCode(FOk); end; end; function Cosh(X : Float) : Float; var ExpX : Float; begin if (X < MinLog) or (X > MaxLog) then Cosh := DefaultVal(FOverflow, MaxNum) else begin ExpX := Exp(X); Cosh := 0.5 * (ExpX + 1.0 / ExpX); SetErrCode(FOk); end; end; procedure SinhCosh(X : Float; var SinhX, CoshX : Float); var ExpX, ExpMinusX : Float; begin if (X < MinLog) or (X > MaxLog) then begin CoshX := DefaultVal(FOverflow, MaxNum); SinhX := Sgn(X) * CoshX; end else begin ExpX := Exp(X); ExpMinusX := 1.0 / ExpX; SinhX := 0.5 * (ExpX - ExpMinusX); CoshX := 0.5 * (ExpX + ExpMinusX); SetErrCode(FOk); end; end; function Tanh(X : Float) : Float; var SinhX, CoshX : Float; begin SinhCosh(X, SinhX, CoshX); Tanh := SinhX / CoshX; end; function ArcSinh(X : Float) : Float; begin SetErrCode(FOk); ArcSinh := Ln(X + Sqrt(Sqr(X) + 1.0)); end; function ArcCosh(X : Float) : Float; begin SetErrCode(FOk); if X < 1.0 then ArcCosh := DefaultVal(FDomain, 0.0) else ArcCosh := Ln(X + Sqrt(Sqr(X) - 1.0)); end; function ArcTanh(X : Float) : Float; begin SetErrCode(FOk); if (X < - 1.0) or (X > 1.0) then ArcTanh := DefaultVal(FDomain, Sgn(X) * MaxNum) else if (X = - 1.0) or (X = 1.0) then ArcTanh := Sgn(X) * DefaultVal(FSing, Sgn(X) * MaxNum) else ArcTanh := 0.5 * Ln((1.0 + X) / (1.0 - X)); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uhqr2.pas0000664000175000017500000003606511326434464020716 0ustar michaelmichael{ ****************************************************************** Eigenvalues and eigenvectors of a real upper Hessenberg matrix ****************************************************************** } unit uhqr2; interface uses utypes, uminmax; procedure Hqr2(H : PMatrix; Lb, Ub, I_low, I_igh : Integer; Lambda : PCompVector; Z : PMatrix); implementation procedure Hqr2(H : PMatrix; Lb, Ub, I_low, I_igh : Integer; Lambda : PCompVector; Z : PMatrix); { ------------------------------------------------------------------ This function is a translation of the EISPACK subroutine hqr2 This procedure finds the eigenvalues and eigenvectors of a real upper Hessenberg matrix by the QR method. On input: H contains the upper Hessenberg matrix. Lb, Ub are the lowest and highest indices of the elements of H I_low and I_igh are integers determined by the balancing subroutine Balance. If Balance has not been used, set I_low=Lb, I_igh=Ub Z contains the transformation matrix produced by Eltran after the reduction by Elmhes, or by Ortran after the reduction by Orthes, if performed. If the eigenvectors of the Hessenberg matrix are desired, Z must contain the identity matrix. On output: H has been destroyed. Wr and Wi contain the real and imaginary parts, respectively, of the eigenvalues. The eigenvalues are unordered except that complex conjugate pairs of values appear consecutively with the eigenvalue having the positive imaginary part first. Z contains the real and imaginary parts of the eigenvectors. If the i-th eigenvalue is real, the i-th column of Z contains its eigenvector. If the i-th eigenvalue is complex with positive imaginary part, the i-th and (i+1)-th columns of Z contain the real and imaginary parts of its eigenvector. The eigenvectors are unnormalized. If an error exit is made, none of the eigenvectors has been found. The function returns an error code: zero for normal return, -j if the limit of 30*N iterations is exhausted while the j-th eigenvalue is being sought (N being the size of the matrix). The eigenvalues should be correct for indices j+1,...,Ub. ------------------------------------------------------------------ Note: This is a crude translation. Many of the original goto's have been kept ! ------------------------------------------------------------------ } procedure Cdiv(Ar, Ai, Br, Bi : Float; var Cr, Ci : Float); { Complex division, (Cr,Ci) = (Ar,Ai)/(Br,Bi) } var S, Ars, Ais, Brs, Bis : Float; begin S := Abs(Br) + Abs(Bi); Ars := Ar / S; Ais := Ai / S; Brs := Br / S; Bis := Bi / S; S := Sqr(Brs) + Sqr(Bis); Cr := (Ars * Brs + Ais * Bis) / S; Ci := (Ais * Brs - Ars * Bis) / S; end; var I, J, K, L, M, N, En, Na, Itn, Its, Mp2, Enm2 : Integer; P, Q, R, S, T, W, X, Y, Ra, Sa, Vi, Vr, Zz, Norm, Tst1, Tst2 : Float; NotLas : Boolean; label 60, 70, 100, 130, 150, 170, 225, 260, 270, 280, 320, 330, 340, 600, 630, 635, 640, 680, 700, 710, 770, 780, 790, 795, 800; begin { Store roots isolated by Balance and compute matrix norm } K := Lb; Norm := 0.0; for I := Lb to Ub do begin for J := K to Ub do Norm := Norm + Abs(H^[I]^[J]); K := I; if (I < I_low) or (I > I_igh) then begin Lambda^[I].X := H^[I]^[I]; Lambda^[I].Y := 0.0; end; end; N := Ub - Lb + 1; Itn := 30 * N; En := I_igh; T := 0.0; 60: { Search for next eigenvalues } if En < I_low then goto 340; Its := 0; Na := En - 1; Enm2 := Na - 1; 70: { Look for single small sub-diagonal element } for L := En downto I_low do begin if L = I_low then goto 100; S := Abs(H^[L - 1]^[L - 1]) + Abs(H^[L]^[L]); if S = 0.0 then S := Norm; Tst1 := S; Tst2 := Tst1 + Abs(H^[L]^[L - 1]); if Tst2 = Tst1 then goto 100; end; 100: { Form shift } X := H^[En]^[En]; if L = En then goto 270; Y := H^[Na]^[Na]; W := H^[En]^[Na] * H^[Na]^[En]; if L = Na then goto 280; if Itn = 0 then begin { Set error -- all eigenvalues have not converged after 30*N iterations } SetErrCode(- En); Exit; end; if (Its <> 10) and (Its <> 20) then goto 130; { Form exceptional shift } T := T + X; for I := I_low to En do H^[I]^[I] := H^[I]^[I] - X; S := Abs(H^[En]^[Na]) + Abs(H^[Na]^[Enm2]); X := 0.75 * S; Y := X; W := - 0.4375 * S * S; 130: Its := Its + 1; Itn := Itn - 1; { Look for two consecutive small sub-diagonal elements } for M := Enm2 downto L do begin Zz := H^[M]^[M]; R := X - Zz; S := Y - Zz; P := (R * S - W) / H^[M + 1]^[M] + H^[M]^[M + 1]; Q := H^[M + 1]^[M + 1] - Zz - R - S; R := H^[M + 2]^[M + 1]; S := Abs(P) + Abs(Q) + Abs(R); P := P / S; Q := Q / S; R := R / S; if M = L then goto 150; Tst1 := Abs(P) * (Abs(H^[M - 1]^[M - 1]) + Abs(Zz) + Abs(H^[M + 1]^[M + 1])); Tst2 := Tst1 + Abs(H^[M]^[M - 1]) * (Abs(Q) + Abs(R)); if Tst2 = Tst1 then goto 150; end; 150: Mp2 := M + 2; for I := Mp2 to En do begin H^[I]^[I - 2] := 0.0; if I <> Mp2 then H^[I]^[I - 3] := 0.0; end; { Double QR step involving rows L to En and columns M to En } for K := M to Na do begin NotLas := (K <> Na); if (K = M) then goto 170; P := H^[K]^[K - 1]; Q := H^[K + 1]^[K - 1]; R := 0.0; if NotLas then R := H^[K + 2]^[K - 1]; X := Abs(P) + Abs(Q) + Abs(R); if X = 0.0 then goto 260; P := P / X; Q := Q / X; R := R / X; 170: S := DSgn(Sqrt(P * P + Q * Q + R * R), P); if K <> M then H^[K]^[K - 1] := - S * X else if L <> M then H^[K]^[K - 1] := - H^[K]^[K - 1]; P := P + S; X := P / S; Y := Q / S; Zz := R / S; Q := Q / P; R := R / P; if NotLas then goto 225; { Row modification } for J := K to Ub do begin P := H^[K]^[J] + Q * H^[K + 1]^[J]; H^[K]^[J] := H^[K]^[J] - P * X; H^[K + 1]^[J] := H^[K + 1]^[J] - P * Y; end; J := Imin(En, K + 3); { Column modification } for I := Lb to J do begin P := X * H^[I]^[K] + Y * H^[I]^[K + 1]; H^[I]^[K] := H^[I]^[K] - P; H^[I]^[K + 1] := H^[I]^[K + 1] - P * Q; end; { Accumulate transformations } for I := I_low to I_igh do begin P := X * Z^[I]^[K] + Y * Z^[I]^[K + 1]; Z^[I]^[K] := Z^[I]^[K] - P; Z^[I]^[K + 1] := Z^[I]^[K + 1] - P * Q; end; goto 260; 225: { Row modification } for J := K to Ub do begin P := H^[K]^[J] + Q * H^[K + 1]^[J] + R * H^[K + 2]^[J]; H^[K]^[J] := H^[K]^[J] - P * X; H^[K + 1]^[J] := H^[K + 1]^[J] - P * Y; H^[K + 2]^[J] := H^[K + 2]^[J] - P * Zz; end; J := Imin(En, K + 3); { Column modification } for I := Lb to J do begin P := X * H^[I]^[K] + Y * H^[I]^[K + 1] + Zz * H^[I]^[K + 2]; H^[I]^[K] := H^[I]^[K] - P; H^[I]^[K + 1] := H^[I]^[K + 1] - P * Q; H^[I]^[K + 2] := H^[I]^[K + 2] - P * R; end; { Accumulate transformations } for I := I_low to I_igh do begin P := X * Z^[I]^[K] + Y * Z^[I]^[K + 1] + Zz * Z^[I]^[K + 2]; Z^[I]^[K] := Z^[I]^[K] - P; Z^[I]^[K + 1] := Z^[I]^[K + 1] - P * Q; Z^[I]^[K + 2] := Z^[I]^[K + 2] - P * R; end; 260: end; goto 70; 270: { One root found } H^[En]^[En] := X + T; Lambda^[En].X := H^[En]^[En]; Lambda^[En].Y := 0.0; En := Na; goto 60; 280: { Two roots found } P := 0.5 * (Y - X); Q := P * P + W; Zz := Sqrt(Abs(Q)); H^[En]^[En] := X + T; X := H^[En]^[En]; H^[Na]^[Na] := Y + T; if Q < 0.0 then goto 320; { Real pair } Zz := P + DSgn(Zz, P); Lambda^[Na].X := X + Zz; Lambda^[En].X := Lambda^[Na].X; if Zz <> 0.0 then Lambda^[En].X := X - W / Zz; Lambda^[Na].Y := 0.0; Lambda^[En].Y := 0.0; X := H^[En]^[Na]; S := Abs(X) + Abs(Zz); P := X / S; Q := Zz / S; R := Sqrt(P * P + Q * Q); P := P / R; Q := Q / R; { Row modification } for J := Na to Ub do begin Zz := H^[Na]^[J]; H^[Na]^[J] := Q * Zz + P * H^[En]^[J]; H^[En]^[J] := Q * H^[En]^[J] - P * Zz; end; { Column modification } for I := Lb to En do begin Zz := H^[I]^[Na]; H^[I]^[Na] := Q * Zz + P * H^[I]^[En]; H^[I]^[En] := Q * H^[I]^[En] - P * Zz; end; { Accumulate transformations } for I := I_low to I_igh do begin Zz := Z^[I]^[Na]; Z^[I]^[Na] := Q * Zz + P * Z^[I]^[En]; Z^[I]^[En] := Q * Z^[I]^[En] - P * Zz; end; goto 330; 320: { Complex pair } Lambda^[Na].X := X + P; Lambda^[En].X := Lambda^[Na].X; Lambda^[Na].Y := Zz; Lambda^[En].Y := - Zz; 330: En := Enm2; goto 60; 340: if Norm = 0.0 then Exit; { All roots found. Backsubstitute to find vectors of upper triangular form } for En := Ub downto Lb do begin P := Lambda^[En].X; Q := Lambda^[En].Y; Na := En - 1; if Q < 0.0 then goto 710 else if Q = 0.0 then goto 600 else goto 800; 600: { Real vector } M := En; H^[En]^[En] := 1.0; if Na < Lb then goto 800; for I := Na downto Lb do begin W := H^[I]^[I] - P; R := 0.0; for J := M to En do R := R + H^[I]^[J] * H^[J]^[En]; if Lambda^[I].Y >= 0.0 then goto 630; Zz := W; S := R; goto 700; 630: M := I; if Lambda^[I].Y <> 0.0 then goto 640; T := W; if T <> 0.0 then goto 635; Tst1 := Norm; T := Tst1; repeat T := 0.01 * T; Tst2 := Norm + T; until Tst2 <= Tst1; 635: H^[I]^[En] := - R / T; goto 680; 640: { Solve real equations } X := H^[I]^[I + 1]; Y := H^[I + 1]^[I]; Q := Sqr(Lambda^[I].X - P) + Sqr(Lambda^[I].Y); T := (X * S - Zz * R) / Q; H^[I]^[En] := T; if Abs(X) > Abs(Zz) then H^[I + 1]^[En] := (- R - W * T) / X else H^[I + 1]^[En] := (- S - Y * T) / Zz; 680: { Overflow control } T := Abs(H^[I]^[En]); if T = 0.0 then goto 700; Tst1 := T; Tst2 := Tst1 + 1.0 / Tst1; if Tst2 > Tst1 then goto 700; for J := I to En do H^[J]^[En] := H^[J]^[En] / T; 700: end; { End real vector } goto 800; { Complex vector } 710: M := Na; { Last vector component chosen imaginary so that eigenvector matrix is triangular } if Abs(H^[En]^[Na]) > Abs(H^[Na]^[En]) then begin H^[Na]^[Na] := Q / H^[En]^[Na]; H^[Na]^[En] := - (H^[En]^[En] - P) / H^[En]^[Na]; end else Cdiv(0.0, - H^[Na]^[En], H^[Na]^[Na] - P, Q, H^[Na]^[Na], H^[Na]^[En]); H^[En]^[Na] := 0.0; H^[En]^[En] := 1.0; Enm2 := Na - 1; if Enm2 < Lb then goto 800; for I := Enm2 downto Lb do begin W := H^[I]^[I] - P; Ra := 0.0; Sa := 0.0; for J := M to En do begin Ra := Ra + H^[I]^[J] * H^[J]^[Na]; Sa := Sa + H^[I]^[J] * H^[J]^[En]; end; if Lambda^[I].Y >= 0.0 then goto 770; Zz := W; R := Ra; S := Sa; goto 795; 770: M := I; if Lambda^[I].Y <> 0.0 then goto 780; Cdiv(- Ra, - Sa, W, Q, H^[I]^[Na], H^[I]^[En]); goto 790; { Solve complex equations } 780: X := H^[I]^[I + 1]; Y := H^[I + 1]^[I]; Vr := Sqr(Lambda^[I].X - P) + Sqr(Lambda^[I].Y) - Sqr(Q); Vi := (Lambda^[I].X - P) * 2.0 * Q; if (Vr = 0.0) and (Vi = 0.0) then begin Tst1 := Norm * (Abs(W) + Abs(Q) + Abs(X) + Abs(Y) + Abs(Zz)); Vr := Tst1; repeat Vr := 0.01 * Vr; Tst2 := Tst1 + Vr; until Tst2 <= Tst1; end; Cdiv(X * R - Zz * Ra + Q * Sa, X * S - Zz * Sa - Q * Ra, Vr, Vi, H^[I]^[Na], H^[I]^[En]); if Abs(X) > Abs(Zz) + Abs(Q) then begin H^[I + 1]^[Na] := (- Ra - W * H^[I]^[Na] + Q * H^[I]^[En]) / X; H^[I + 1]^[En] := (- Sa - W * H^[I]^[En] - Q * H^[I]^[Na]) / X; end else Cdiv(- R - Y * H^[I]^[Na], - S - Y * H^[I]^[En], Zz, Q, H^[I + 1]^[Na], H^[I + 1]^[En]); 790: { Overflow control } T := FMax(Abs(H^[I]^[Na]), Abs(H^[I]^[En])); if T = 0.0 then goto 795; Tst1 := T; Tst2 := Tst1 + 1.0 / Tst1; if Tst2 > Tst1 then goto 795; for J := I to En do begin H^[J]^[Na] := H^[J]^[Na] / T; H^[J]^[En] := H^[J]^[En] / T; end; 795: end; { End complex vector } 800: end; { End back substitution. Vectors of isolated roots } for I := Lb to Ub do if (I < I_low) or (I > I_igh) then for J := I to Ub do Z^[I]^[J] := H^[I]^[J]; { Multiply by transformation matrix to give vectors of original full matrix. } for J := Ub downto I_low do begin M := Imin(J, I_igh); for I := I_low to I_igh do begin Zz := 0.0; for K := I_low to M do Zz := Zz + Z^[I]^[K] * H^[K]^[J]; Z^[I]^[J] := Zz; end; end; SetErrCode(0); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uhqr.pas0000664000175000017500000001640111326434464020624 0ustar michaelmichael{ ****************************************************************** Eigenvalues of a real upper Hessenberg matrix by the QR method ****************************************************************** } unit uhqr; interface uses utypes, uminmax; procedure Hqr(H : PMatrix; Lb, Ub, I_low, I_igh : Integer; Lambda : PCompVector); implementation procedure Hqr(H : PMatrix; Lb, Ub, I_low, I_igh : Integer; Lambda : PCompVector); { ------------------------------------------------------------------ This function is a translation of the EISPACK subroutine hqr. This function finds the eigenvalues of a real upper Hessenberg matrix by the QR method. On input: H contains the upper Hessenberg matrix. Lb, Ub are the lowest and highest indices of the elements of H I_low and I_igh are integers determined by the balancing subroutine Balance. If Balance has not been used, set I_low = Lb, I_igh = Ub On output: H has been destroyed. Wr and Wi contain the real and imaginary parts, respectively, of the eigenvalues. The eigenvalues are unordered except that complex conjugate pairs of values appear consecutively with the eigenvalue having the positive imaginary part first. The function returns an error code: zero for normal return, -j if the limit of 30*N iterations is exhausted while the j-th eigenvalue is being sought. (N being the size of the matrix). The eigenvalues should be correct for indices j+1,...,Ub. ------------------------------------------------------------------ Note: This is a crude translation. Many of the original goto's have been kept ! ------------------------------------------------------------------ } var I, J, K, L, M, N, En, Na, Itn, Its, Mp2, Enm2 : Integer; P, Q, R, S, T, W, X, Y, Z, Norm, Tst1, Tst2 : Float; NotLas : Boolean; label 60, 70, 100, 130, 150, 170, 225, 260, 270, 280, 320, 330; begin { Store roots isolated by Balance and compute matrix norm } K := Lb; Norm := 0.0; for I := Lb to Ub do begin for J := K to Ub do Norm := Norm + Abs(H^[I]^[J]); K := I; if (I < I_low) or (I > I_igh) then begin Lambda^[I].X := H^[I]^[I]; Lambda^[I].Y := 0.0; end; end; N := Ub - Lb + 1; Itn := 30 * N; En := I_igh; T := 0.0; 60: { Search for next eigenvalues } if En < I_low then begin SetErrCode(0); Exit; end; Its := 0; Na := En - 1; Enm2 := Na - 1; 70: { Look for single small sub-diagonal element } for L := En downto I_low do begin if L = I_low then goto 100; S := Abs(H^[L - 1]^[L - 1]) + Abs(H^[L]^[L]); if S = 0.0 then S := Norm; Tst1 := S; Tst2 := Tst1 + Abs(H^[L]^[L - 1]); if Tst2 = Tst1 then goto 100; end; 100: { Form shift } X := H^[En]^[En]; if L = En then goto 270; Y := H^[Na]^[Na]; W := H^[En]^[Na] * H^[Na]^[En]; if L = Na then goto 280; if Itn = 0 then begin { Set error -- all eigenvalues have not converged after 30*N iterations } SetErrCode(- En); Exit; end; if (Its <> 10) and (Its <> 20) then goto 130; { Form exceptional shift } T := T + X; for I := I_low to En do H^[I]^[I] := H^[I]^[I] - X; S := Abs(H^[En]^[Na]) + Abs(H^[Na]^[Enm2]); X := 0.75 * S; Y := X; W := - 0.4375 * S * S; 130: Its := Its + 1; Itn := Itn - 1; { Look for two consecutive small sub-diagonal elements } for M := Enm2 downto L do begin Z := H^[M]^[M]; R := X - Z; S := Y - Z; P := (R * S - W) / H^[M + 1]^[M] + H^[M]^[M + 1]; Q := H^[M + 1]^[M + 1] - Z - R - S; R := H^[M + 2]^[M + 1]; S := Abs(P) + Abs(Q) + Abs(R); P := P / S; Q := Q / S; R := R / S; if M = L then goto 150; Tst1 := Abs(P) * (Abs(H^[M - 1]^[M - 1]) + Abs(Z) + Abs(H^[M + 1]^[M + 1])); Tst2 := Tst1 + Abs(H^[M]^[M - 1]) * (Abs(Q) + Abs(R)); if Tst2 = Tst1 then goto 150; end; 150: Mp2 := M + 2; for I := Mp2 to En do begin H^[I]^[I - 2] := 0.0; if I <> Mp2 then H^[I]^[I - 3] := 0.0; end; { Double QR step involving rows L to En and columns M to En } for K := M to Na do begin NotLas := (K <> Na); if (K = M) then goto 170; P := H^[K]^[K - 1]; Q := H^[K + 1]^[K - 1]; R := 0.0; if NotLas then R := H^[K + 2]^[K - 1]; X := Abs(P) + Abs(Q) + Abs(R); if X = 0.0 then goto 260; P := P / X; Q := Q / X; R := R / X; 170: S := DSgn(Sqrt(P * P + Q * Q + R * R), P); if K <> M then H^[K]^[K - 1] := - S * X else if L <> M then H^[K]^[K - 1] := - H^[K]^[K - 1]; P := P + S; X := P / S; Y := Q / S; Z := R / S; Q := Q / P; R := R / P; if NotLas then goto 225; { Row modification } for J := K to En do begin P := H^[K]^[J] + Q * H^[K + 1]^[J]; H^[K]^[J] := H^[K]^[J] - P * X; H^[K + 1]^[J] := H^[K + 1]^[J] - P * Y; end; J := Imin(En, K + 3); { Column modification } for I := L to J do begin P := X * H^[I]^[K] + Y * H^[I]^[K + 1]; H^[I]^[K] := H^[I]^[K] - P; H^[I]^[K + 1] := H^[I]^[K + 1] - P * Q; end; goto 260; 225: { Row modification } for J := K to En do begin P := H^[K]^[J] + Q * H^[K + 1]^[J] + R * H^[K + 2]^[J]; H^[K]^[J] := H^[K]^[J] - P * X; H^[K + 1]^[J] := H^[K + 1]^[J] - P * Y; H^[K + 2]^[J] := H^[K + 2]^[J] - P * Z; end; J := Imin(En, K + 3); { Column modification } for I := L to J do begin P := X * H^[I]^[K] + Y * H^[I]^[K + 1] + Z * H^[I]^[K + 2]; H^[I]^[K] := H^[I]^[K] - P; H^[I]^[K + 1] := H^[I]^[K + 1] - P * Q; H^[I]^[K + 2] := H^[I]^[K + 2] - P * R; end; 260: end; goto 70; 270: { One root found } Lambda^[En].X := X + T; Lambda^[En].Y := 0.0; En := Na; goto 60; 280: { Two roots found } P := 0.5 * (Y - X); Q := P * P + W; Z := Sqrt(Abs(Q)); X := X + T; if Q < 0.0 then goto 320; { Real pair } Z := P + DSgn(Z, P); Lambda^[Na].X := X + Z; Lambda^[En].X := Lambda^[Na].X; if Z <> 0.0 then Lambda^[En].X := X - W / Z; Lambda^[Na].Y := 0.0; Lambda^[En].Y := 0.0; goto 330; 320: { Complex pair } Lambda^[Na].X := X + P; Lambda^[En].X := X + P; Lambda^[Na].Y := Z; Lambda^[En].Y := - Z; 330: En := Enm2; goto 60; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ugoldsrc.pas0000664000175000017500000000552711326434464021476 0ustar michaelmichael{ ****************************************************************** Minimization of a function of one variable by Golden Search method ****************************************************************** } unit ugoldsrc; interface uses utypes, uminbrak; procedure GoldSearch(Func : TFunc; A, B : Float; MaxIter : Integer; Tol : Float; var Xmin, Ymin : Float); { ------------------------------------------------------------------ Performs a golden search for the minimum of function Func ------------------------------------------------------------------ Input parameters : Func = objective function A, B = two points near the minimum MaxIter = maximum number of iterations Tol = required precision (should not be less than the square root of the machine precision) ------------------------------------------------------------------ Output parameters : Xmin, Ymin = coordinates of minimum ------------------------------------------------------------------ Possible results : OptOk OptNonConv ------------------------------------------------------------------ } implementation procedure GoldSearch(Func : TFunc; A, B : Float; MaxIter : Integer; Tol : Float; var Xmin, Ymin : Float); var C, Fa, Fb, Fc, F1, F2, MinTol, X0, X1, X2, X3 : Float; Iter : Integer; begin MinTol := Sqrt(MachEp); if Tol < MinTol then Tol := MinTol; MinBrack(Func, A, B, C, Fa, Fb, Fc); X0 := A; X3 := C; if (C - B) > (B - A) then begin X1 := B; X2 := B + CGold * (C - B); F1 := Fb; F2 := Func(X2); end else begin X1 := B - CGold * (B - A); X2 := B; F1 := Func(X1); F2 := Fb; end; Iter := 0; while (Iter <= MaxIter) and (Abs(X3 - X0) > Tol * (Abs(X1) + Abs(X2))) do if F2 < F1 then begin X0 := X1; X1 := X2; F1 := F2; X2 := X1 + CGold * (X3 - X1); F2 := Func(X2); Inc(Iter); end else begin X3 := X2; X2 := X1; F2 := F1; X1 := X2 - CGold * (X2 - X0); F1 := Func(X1); Inc(Iter); end; if F1 < F2 then begin Xmin := X1; Ymin := F1; end else begin Xmin := X2; Ymin := F2; end; if Iter > MaxIter then SetErrCode(OptNonConv) else SetErrCode(OptOk); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ugenalg.pas0000664000175000017500000002311611326434464021270 0ustar michaelmichael{ ****************************************************************** Optimization by Genetic Algorithm ****************************************************************** Ref.: E. Perrin, A. Mandrille, M. Oumoun, C. Fonteix & I. Marc Optimisation globale par strategie d'evolution Technique utilisant la genetique des individus diploides Recherche operationnelle / Operations Research 1997, 31, 161-201 Thanks to Magali Camut for her contribution ****************************************************************** } unit ugenalg; interface uses utypes, uminmax, urandom; procedure InitGAParams(NP, NG : Integer; SR, MR, HR : Float); { ------------------------------------------------------------------ Initialize Genetic Algorithm parameters ------------------------------------------------------------------ NP : Population size NG : Max number of generations SR : Survival rate MR : Mutation rate HR : Proportion of homozygotes ------------------------------------------------------------------ } procedure GA_CreateLogFile(LogFileName : String); { ------------------------------------------------------------------ Initialize log file ------------------------------------------------------------------ } procedure GenAlg(Func : TFuncNVar; X, Xmin, Xmax : PVector; Lb, Ub : Integer; var F_min : Float); { ------------------------------------------------------------------ Minimization of a function of several variables by genetic algorithm ------------------------------------------------------------------ Input parameters : Func = objective function to be minimized X = initial minimum coordinates Xmin = minimum value of X Xmax = maximum value of X Lb, Ub = ------------------------------------------------------------------ Output parameters: X = refined minimum coordinates F_min = function value at minimum ------------------------------------------------------------------ } implementation const GA_NP : Integer = 200; { Population size } GA_NG : Integer = 40; { Max number of generations } GA_SR : Float = 0.6; { Survival rate } GA_MR : Float = 0.1; { Mutation rate } GA_HR : Float = 0.5; { Proportion of homozygotes } WriteLogFile : Boolean = False; var LogFile : Text; procedure InitGAParams(NP, NG : Integer; SR, MR, HR : Float); begin if NP > 0 then GA_NP := NP; if NG > 0 then GA_NG := NG; if (SR > 0.0) and (SR < 1.0) then GA_SR := SR; if (MR > 0.0) and (MR < 1.0) then GA_MR := MR; if (HR > 0.0) and (HR < 1.0) then GA_HR := HR; end; procedure GA_CreateLogFile(LogFileName : String); begin Assign(LogFile, LogFileName); Rewrite(LogFile); Writeln(LogFile, 'Genetic Algorithm'); Writeln(LogFile, ' Iter F '); WriteLogFile := True; end; procedure Mutate(I : Integer; C1, C2, D, P : PMatrix; Xmin, Range : PVector; Lb, Ub : Integer); { ------------------------------------------------------------------ Mutate individual I ------------------------------------------------------------------ } var J : Integer; begin for J := Lb to Ub do begin C1^[I]^[J] := Xmin^[J] + RanGen3 * Range^[J]; C2^[I]^[J] := Xmin^[J] + RanGen3 * Range^[J]; D^[I]^[J] := RanGen3; P^[I]^[J] := D^[I]^[J] * C1^[I]^[J] + (1.0 - D^[I]^[J]) * C2^[I]^[J]; end; end; procedure Cross(I1, I2, I : Integer; C1, C2, D, P : PMatrix; Lb, Ub : Integer); { ------------------------------------------------------------------ Cross two individuals I1 and I2 --> new individual I ------------------------------------------------------------------ } var J, K : Integer; begin for J := Lb to Ub do begin if RanGen3 < 0.5 then K := I1 else K := I2; C1^[I]^[J] := C1^[K]^[J]; if RanGen3 < 0.5 then K := I1 else K := I2; C2^[I]^[J] := C2^[K]^[J]; D^[I]^[J] := RanGen3; P^[I]^[J] := D^[I]^[J] * C1^[I]^[J] + (1.0 - D^[I]^[J]) * C2^[I]^[J]; end; end; procedure Homozygote(I : Integer; C1, C2, P : PMatrix; Lb, Ub : Integer); { ------------------------------------------------------------------ Make individual I homozygous ------------------------------------------------------------------ } var J : Integer; begin for J := Lb to Ub do begin C1^[I]^[J] := P^[I]^[J]; C2^[I]^[J] := P^[I]^[J]; end; end; function GA_Func(Func : TFuncNVar; I : Integer; P : PMatrix; Lb, Ub : Integer) : Float; { ------------------------------------------------------------------ Computes objective function for individual I ------------------------------------------------------------------ } var J : Integer; X : PVector; begin DimVector(X, Ub); for J := Lb to Ub do X^[J] := P^[I]^[J]; GA_Func := Func(X); DelVector(X, Ub); end; procedure CompFunc(Func : TFuncNVar; X : PVector; C1, C2, D, P : PMatrix; F : PVector; Lb, Ub : Integer; var Iter : Integer; var F_min : Float); { ------------------------------------------------------------------ Computes function values ------------------------------------------------------------------ } var I, J, K : Integer; A : Float; begin { Compute function values } for I := 1 to GA_NP do F^[I] := GA_Func(Func, I, P, Lb, Ub); { Sort population according to function values } for I := 1 to GA_NP - 1 do begin K := I; A := F^[I]; for J := I + 1 to GA_NP do if F^[J] < A then begin K := J; A := F^[J]; end; FSwap(F^[I], F^[K]); for J := Lb to Ub do begin FSwap(C1^[I]^[J], C1^[K]^[J]); FSwap(C2^[I]^[J], C2^[K]^[J]); FSwap(D^[I]^[J], D^[K]^[J]); FSwap(P^[I]^[J], P^[K]^[J]); end; end; { Update log file if necessary } if WriteLogFile then Writeln(LogFile, Iter:5, F^[1]:12); { Update minimum } if F^[1] < F_min then begin F_min := F^[1]; for J := Lb to Ub do X^[J] := P^[1]^[J]; end; Inc(Iter); end; procedure GenPop(Func : TFuncNVar; NS : Integer; C1, C2, D, P : PMatrix; F, Xmin, Range : PVector; Lb, Ub : Integer); { ------------------------------------------------------------------ Generates new population ------------------------------------------------------------------ } var I, I1, I2 : Integer; F0 : Float; begin for I := NS + 1 to GA_NP do begin I1 := Trunc(RanGen3 * NS) + 1; repeat I2 := Trunc(RanGen3 * NS) + 1 until I2 <> I1; F0 := FMax(F^[I1], F^[I2]); repeat Cross(I1, I2, I, C1, C2, D, P, Lb, Ub); until GA_Func(Func, I, P, Lb, Ub) <= F0; end; for I := 1 to GA_NP do begin if RanGen3 < GA_MR then Mutate(I, C1, C2, D, P, Xmin, Range, Lb, Ub); if RanGen3 < GA_HR then Homozygote(I, C1, C2, P, Lb, Ub); end; end; procedure GenAlg(Func : TFuncNVar; X, Xmin, Xmax : PVector; Lb, Ub : Integer; var F_min : Float); { ------------------------------------------------------------------ Minimization of a function of several variables by genetic algorithm ------------------------------------------------------------------ Input parameters : Func = objective function to be minimized X = initial minimum coordinates Xmin = minimum value of X Xmax = maximum value of X Lb, Ub = ------------------------------------------------------------------ Output parameters: X = refined minimum coordinates F_min = function value at minimum ------------------------------------------------------------------ } var I, NS, Iter : Integer; C1, C2, D, P : PMatrix; Range, F : PVector; begin SetErrCode(OptOk); { Initialize the random number generator using the standard generator } Randomize; InitGen(Trunc(Random * 1.0E+8)); { Dimension arrays } DimMatrix(C1, GA_NP, Ub); DimMatrix(C2, GA_NP, Ub); DimMatrix(D, GA_NP, Ub); DimMatrix(P, GA_NP, Ub); DimVector(F, GA_NP); DimVector(Range, Ub); for I := Lb to Ub do Range^[I] := Xmax^[I] - Xmin^[I]; NS := Trunc(GA_NP * GA_SR); { Number of survivors } Iter := 0; F_min := MaxNum; for I := 1 to GA_NP do Mutate(I, C1, C2, D, P, Xmin, Range, Lb, Ub); CompFunc(Func, X, C1, C2, D, P, F, Lb, Ub, Iter, F_min); for I := 1 to GA_NG do begin GenPop(Func, NS, C1, C2, D, P, F, Xmin, Range, Lb, Ub); CompFunc(Func, X, C1, C2, D, P, F, Lb, Ub, Iter, F_min); end; if WriteLogFile then begin Close(LogFile); WriteLogFile := False; end; DelMatrix(C1, GA_NP, Ub); DelMatrix(C2, GA_NP, Ub); DelMatrix(D, GA_NP, Ub); DelMatrix(P, GA_NP, Ub); DelVector(F, GA_NP); DelVector(Range, Ub); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ugausleg.pas0000664000175000017500000000552511326434464021466 0ustar michaelmichael{ ****************************************************************** Gauss-Legendre integration ****************************************************************** } unit ugausleg; interface uses utypes; function GausLeg(Func : TFunc; A, B : Float) : Float; { Integral from A to B } function GausLeg0(Func : TFunc; B : Float) : Float; { Integral from 0 to B } function Convol(Func1, Func2 : TFunc; T : Float) : Float; { Convolution product at time T } implementation const Npts = 8; { Number of points / 2 } const Root : array[1..Npts] of Float = (0.0950125098376370440185, 0.281603550778258913230, 0.458016777657227386342, 0.617876244402643748447, 0.755404408355003033895, 0.865631202387831743880, 0.944575023073232576078, 0.989400934991649932596); const Weight : array[1..Npts] of Float = (0.189450610455068496285, 0.182603415044923588867, 0.169156519395002538189, 0.149595988816576732081, 0.124628971255533872052, 0.095158511682492784810, 0.062253523938647892863, 0.027152459411754094852); function GausLeg(Func : TFunc; A, B : Float) : Float; { ------------------------------------------------------------------ Computes the integral of function Func from A to B by the Gauss-Legendre method ------------------------------------------------------------------ } var P, Q, Sum, X, Y : Float; I : Integer; begin P := 0.5 * (B + A); Q := 0.5 * (B - A); Sum := 0.0; for I := 1 to Npts do begin X := Q * Root[I]; Y := Func(P + X) + Func(P - X); Sum := Sum + Weight[I] * Y; end; GausLeg := Q * Sum; end; function GausLeg0(Func : TFunc; B : Float) : Float; { ------------------------------------------------------------------ Computes the integral of function Func from 0 to B by the Gauss-Legendre method ------------------------------------------------------------------ } var P, Sum, X, Y : Float; I : Integer; begin P := 0.5 * B; Sum := 0; for I := 1 to Npts do begin X := P * Root[I]; Y := Func(P + X) + Func(P - X); Sum := Sum + Weight[I] * Y; end; GausLeg0 := P * Sum; end; function Convol(Func1, Func2 : TFunc; T : Float) : Float; { ------------------------------------------------------------------ Computes the convolution product of two functions Func1 and Func2 at time T by the Gauss-Legendre method ------------------------------------------------------------------ } var P, PpX, PmX, Sum, X, Y : Float; I : Integer; begin P := 0.5 * T; Sum := 0.0; for I := 1 to Npts do begin X := P * Root[I]; PpX := P + X; PmX := P - X; Y := Func1(T - PpX) * Func2(PpX) + Func1(T - PmX) * Func2(PmX); Sum := Sum + Weight[I] * Y; end; Convol := P * Sum; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ugausjor.pas0000664000175000017500000001046011326434464021503 0ustar michaelmichael{ ****************************************************************** Solution of a system of linear equations by Gauss-Jordan method ****************************************************************** } unit ugausjor; interface uses utypes, uminmax; procedure GaussJordan(A : PMatrix; Lb, Ub1, Ub2 : Integer; var Det : Float); { ------------------------------------------------------------------ Transforms a matrix according to the Gauss-Jordan method ------------------------------------------------------------------ Input parameters : A = system matrix Lb = lower matrix bound in both dim. Ub1, Ub2 = upper matrix bounds ------------------------------------------------------------------ Output parameters: A = transformed matrix Det = determinant of A ------------------------------------------------------------------ Possible results : MatOk : No error MatErrDim : Non-compatible dimensions MatSing : Singular matrix ------------------------------------------------------------------ } implementation procedure GaussJordan(A : PMatrix; Lb, Ub1, Ub2 : Integer; var Det : Float); var Pvt : Float; { Pivot } Ik, Jk : Integer; { Pivot's row and column } I, J, K : Integer; { Loop variables } T : Float; { Temporary variable } PRow, PCol : PIntVector; { Stores pivot's row and column } MCol : PVector; { Stores a column of matrix A } procedure Terminate(ErrCode : Integer); { Set error code and deallocate arrays } begin DelIntVector(PRow, Ub1); DelIntVector(PCol, Ub1); DelVector(MCol, Ub1); SetErrCode(ErrCode); end; begin if Ub1 > Ub2 then begin SetErrCode(MatErrDim); Exit end; DimIntVector(PRow, Ub1); DimIntVector(PCol, Ub1); DimVector(MCol, Ub1); Det := 1.0; K := Lb; while K <= Ub1 do begin { Search for largest pivot in submatrix A[K..Ub1, K..Ub1] } Pvt := A^[K]^[K]; Ik := K; Jk := K; for I := K to Ub1 do for J := K to Ub1 do if Abs(A^[I]^[J]) > Abs(Pvt) then begin Pvt := A^[I]^[J]; Ik := I; Jk := J; end; { Store pivot's position } PRow^[K] := Ik; PCol^[K] := Jk; { Update determinant } Det := Det * Pvt; if Ik <> K then Det := - Det; if Jk <> K then Det := - Det; { Too weak pivot ==> quasi-singular matrix } if Abs(Pvt) < MachEp then begin Terminate(MatSing); Exit end; { Exchange current row (K) with pivot row (Ik) } if Ik <> K then for J := Lb to Ub2 do FSwap(A^[Ik]^[J], A^[K]^[J]); { Exchange current column (K) with pivot column (Jk) } if Jk <> K then for I := Lb to Ub1 do FSwap(A^[I]^[Jk], A^[I]^[K]); { Store column K of matrix A into MCol and set this column to zero } for I := Lb to Ub1 do if I <> K then begin MCol^[I] := A^[I]^[K]; A^[I]^[K] := 0.0; end else begin MCol^[I] := 0.0; A^[I]^[K] := 1.0; end; { Transform pivot row } T := 1.0 / Pvt; for J := Lb to Ub2 do A^[K]^[J] := T * A^[K]^[J]; { Transform other rows } for I := Lb to Ub1 do if I <> K then begin T := MCol^[I]; for J := Lb to Ub2 do A^[I]^[J] := A^[I]^[J] - T * A^[K]^[J]; end; Inc(K); end; { Exchange lines of inverse matrix } for I := Ub1 downto Lb do begin Ik := PCol^[I]; if Ik <> I then for J := Lb to Ub2 do FSwap(A^[I]^[J], A^[Ik]^[J]); end; { Exchange columns of inverse matrix } for J := Ub1 downto Lb do begin Jk := PRow^[J]; if Jk <> J then for I := Lb to Ub1 do FSwap(A^[I]^[J], A^[I]^[Jk]); end; Terminate(MatOk); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ugamma.pas0000664000175000017500000002077511326434464021125 0ustar michaelmichael{ ****************************************************************** Gamma function and related functions. Translated from C code in Cephes library (http://www.moshier.net) ****************************************************************** } unit ugamma; interface uses utypes, upolev; function SgnGamma(X : Float) : Integer; { Sign of Gamma function } function Stirling(X : Float) : Float; { Stirling's formula for the Gamma function } function StirLog(X : Float) : Float; { Approximate Ln(Gamma) by Stirling's formula, for X >= 13 } function Gamma(X : Float) : Float; { Gamma function } function LnGamma(X : Float) : Float; { Logarithm of Gamma function } implementation function SgnGamma(X : Float) : Integer; begin if X > 0.0 then SgnGamma := 1 else if Odd(Trunc(Abs(X))) then SgnGamma := 1 else SgnGamma := - 1; end; function Stirling(X : Float) : Float; { Stirling's formula for the gamma function Gamma(x) = Sqrt(2*Pi) x^(x-.5) exp(-x) (1 + 1/x P(1/x)) where P(x) is a polynomial } const STIR : TabCoef = ( 7.147391378143610789273E-4, - 2.363848809501759061727E-5, - 5.950237554056330156018E-4, 6.989332260623193171870E-5, 7.840334842744753003862E-4, - 2.294719747873185405699E-4, - 2.681327161876304418288E-3, 3.472222222230075327854E-3, 8.333333333333331800504E-2, 0); var W, P : Float; begin W := 1.0 / X; if X > 1024.0 then begin P := 6.97281375836585777429E-5 * W + 7.84039221720066627474E-4; P := P * W - 2.29472093621399176955E-4; P := P * W - 2.68132716049382716049E-3; P := P * W + 3.47222222222222222222E-3; P := P * W + 8.33333333333333333333E-2; end else P := PolEvl(W, STIR, 8); Stirling := Sqrt2Pi * Exp((X - 0.5) * Ln(X) - X) * (1.0 + W * P); end; function GamSmall(X1, Z : Float) : Float; { Gamma function for small values of the argument } const S : TabCoef = ( - 1.193945051381510095614E-3, 7.220599478036909672331E-3, - 9.622023360406271645744E-3, - 4.219773360705915470089E-2, 1.665386113720805206758E-1, - 4.200263503403344054473E-2, - 6.558780715202540684668E-1, 5.772156649015328608253E-1, 1.000000000000000000000E0, 0); SN : TabCoef = ( 1.133374167243894382010E-3, 7.220837261893170325704E-3, 9.621911155035976733706E-3, - 4.219773343731191721664E-2, - 1.665386113944413519335E-1, - 4.200263503402112910504E-2, 6.558780715202536547116E-1, 5.772156649015328608727E-1, - 1.000000000000000000000E0, 0); var P : Float; begin if X1 = 0.0 then begin GamSmall := DefaultVal(FSing, MaxNum); Exit; end; if X1 < 0.0 then begin X1 := - X1; P := PolEvl(X1, SN, 8); end else P := PolEvl(X1, S, 8); GamSmall := Z / (X1 * P); end; function StirLog(X : Float) : Float; { Approximate Ln(Gamma) by Stirling's formula, for X >= 13 } const P : TabCoef = ( 4.885026142432270781165E-3, - 1.880801938119376907179E-3, 8.412723297322498080632E-4, - 5.952345851765688514613E-4, 7.936507795855070755671E-4, - 2.777777777750349603440E-3, 8.333333333333331447505E-2, 0, 0, 0); var Q, W : Float; begin Q := Ln(X) * (X - 0.5) - X; Q := Q + LnSqrt2Pi; if X > 1.0E+10 then StirLog := Q else begin W := 1.0 / Sqr(X); StirLog := Q + PolEvl(W, P, 6) / X; end; end; function Gamma(X : Float) : Float; const P : TabCoef = ( 4.212760487471622013093E-5, 4.542931960608009155600E-4, 4.092666828394035500949E-3, 2.385363243461108252554E-2, 1.113062816019361559013E-1, 3.629515436640239168939E-1, 8.378004301573126728826E-1, 1.000000000000000000009E0, 0, 0); Q : TabCoef = ( - 1.397148517476170440917E-5, 2.346584059160635244282E-4, - 1.237799246653152231188E-3, - 7.955933682494738320586E-4, 2.773706565840072979165E-2, - 4.633887671244534213831E-2, - 2.243510905670329164562E-1, 4.150160950588455434583E-1, 9.999999999999999999908E-1, 0); var SgnGam, N : Integer; A, X1, Z : Float; begin SetErrCode(FOk); SgnGam := SgnGamma(X); if (X = 0.0) or ((X < 0.0) and (Frac(X) = 0.0)) then begin Gamma := DefaultVal(FSing, SgnGam * MaxNum); Exit; end; if X > MaxGam then begin Gamma := DefaultVal(FOverflow, MaxNum); Exit; end; A := Abs(X); if A > 13.0 then begin if X < 0.0 then begin N := Trunc(A); Z := A - N; if Z > 0.5 then begin N := N + 1; Z := A - N; end; Z := Abs(A * Sin(Pi * Z)) * Stirling(A); if Z <= Pi / MaxNum then begin Gamma := DefaultVal(FOverflow, SgnGam * MaxNum); Exit; end; Z := PI / Z; end else Z := Stirling(X); Gamma := SgnGam * Z; end else begin Z := 1.0; X1 := X; while X1 >= 3.0 do begin X1 := X1 - 1.0; Z := Z * X1; end; while X1 < - 0.03125 do begin Z := Z / X1; X1 := X1 + 1.0; end; if X1 <= 0.03125 then Gamma := GamSmall(X1, Z) else begin while X1 < 2.0 do begin Z := Z / X1; X1 := X1 + 1.0; end; if (X1 = 2.0) or (X1 = 3.0) then Gamma := Z else begin X1 := X1 - 2.0; Gamma := Z * PolEvl(X1, P, 7) / PolEvl(X1, Q, 8); end; end; end; end; function LnGamma(X : Float) : Float; const P : TabCoef = ( - 2.163690827643812857640E3, - 8.723871522843511459790E4, - 1.104326814691464261197E6, - 6.111225012005214299996E6, - 1.625568062543700591014E7, - 2.003937418103815175475E7, - 8.875666783650703802159E6, 0, 0, 0); Q : TabCoef = ( - 5.139481484435370143617E2, - 3.403570840534304670537E4, - 6.227441164066219501697E5, - 4.814940379411882186630E6, - 1.785433287045078156959E7, - 3.138646407656182662088E7, - 2.099336717757895876142E7, 0, 0, 0); var N : Integer; A, X1, Z : Float; begin SetErrCode(FOk); if (X = 0.0) or ((X < 0.0) and (Frac(X) = 0.0)) then begin LnGamma := DefaultVal(FSing, MaxNum); Exit; end; if X > MaxLgm then begin LnGamma := DefaultVal(FOverflow, MaxNum); Exit; end; A := Abs(X); if A > 34.0 then begin if X < 0.0 then begin N := Trunc(A); Z := A - N; if Z > 0.5 then begin N := N + 1; Z := N - A; end; Z := A * Sin(Pi * Z); if Z = 0.0 then begin LnGamma := DefaultVal(FOverflow, MaxNum); Exit; end; Z := LnPi - Ln(Z) - StirLog(A); end else Z := StirLog(X); LnGamma := Z; end else if X < 13.0 then begin Z := 1.0; X1 := X; while X1 >= 3 do begin X1 := X1 - 1.0; Z := Z * X1; end; while X1 < 2.0 do begin if Abs(X1) <= 0.03125 then begin LnGamma := Ln(Abs(GamSmall(X1, Z))); Exit; end; Z := Z / X1; X1 := X1 + 1.0; end; if Z < 0.0 then Z := - Z; if X1 = 2.0 then LnGamma := Ln(Z) else begin X1 := X1 - 2.0; LnGamma := X1 * PolEvl(X1, P, 6) / P1Evl(X1, Q, 7) + Ln(Z); end; end else LnGamma := StirLog(X); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ugamdist.pas0000664000175000017500000000637611326434464021474 0ustar michaelmichael{ ****************************************************************** Probability functions related to the Gamma function ****************************************************************** } unit ugamdist; interface uses utypes, ugamma; function DBeta(A, B, X : Float) : Float; { Density of Beta distribution with parameters A and B } function DGamma(A, B, X : Float) : Float; { Density of Gamma distribution with parameters A and B } function DKhi2(Nu : Integer; X : Float) : Float; { Density of Khi-2 distribution with Nu d.o.f. } function DStudent(Nu : Integer; X : Float) : Float; { Density of Student distribution with Nu d.o.f. } function DSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; { Density of Fisher-Snedecor distribution with Nu1 and Nu2 d.o.f. } implementation function DBeta(A, B, X : Float) : Float; var L : Float; begin if (A <= 0.0) or (B <= 0.0) or (X < 0.0) or (X > 1.0) then begin DBeta := DefaultVal(FDomain, 0.0); Exit; end; if X = 0.0 then begin if A < 1.0 then DBeta := DefaultVal(FSing, MaxNum) else DBeta := DefaultVal(FOk, 0.0); Exit; end; if X = 1.0 then begin if B < 1.0 then DBeta := DefaultVal(FSing, MaxNum) else DBeta := DefaultVal(FOk, 0.0); Exit; end; L := LnGamma(A + B) - LnGamma(A) - LnGamma(B) + (A - 1.0) * Ln(X) + (B - 1.0) * Ln(1.0 - X); if L < MinLog then DBeta := DefaultVal(FUnderflow, 0.0) else DBeta := DefaultVal(FOk, Exp(L)); end; function DGamma(A, B, X : Float) : Float; var L : Float; begin if (A <= 0.0) or (B <= 0.0) or (X < 0.0) then begin DGamma := DefaultVal(FDomain, 0.0); Exit; end; if X = 0.0 then begin if A < 1.0 then DGamma := DefaultVal(FSing, MaxNum) else if A = 1.0 then DGamma := DefaultVal(FOk, B) else DGamma := DefaultVal(FOk, 0.0); Exit; end; L := A * Ln(B) - LnGamma(A) + (A - 1.0) * Ln(X) - B * X; if L < MinLog then DGamma := DefaultVal(FUnderflow, 0.0) else DGamma := DefaultVal(FOk, Exp(L)); end; function DKhi2(Nu : Integer; X : Float) : Float; begin DKhi2 := DGamma(0.5 * Nu, 0.5, X) end; function DStudent(Nu : Integer; X : Float) : Float; var L, P, Q : Float; begin if Nu < 1 then begin DStudent := DefaultVal(FDomain, 0.0); Exit; end; P := 0.5 * (Nu + 1); Q := 0.5 * Nu; L := LnGamma(P) - LnGamma(Q) - 0.5 * Ln(Nu * Pi) - P * Ln(1.0 + X * X / Nu); if L < MinLog then DStudent := DefaultVal(FUnderflow, 0.0) else DStudent := DefaultVal(FOk, Exp(L)); end; function DSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; var L, P1, P2, R, S : Float; begin if (Nu1 < 1) or (Nu2 < 1) or (X <= 0.0) then begin DSnedecor := DefaultVal(FDomain, 0.0); Exit; end; R := Nu1 / Nu2; P1 := 0.5 * Nu1; P2 := 0.5 * Nu2; S := P1 + P2; L := LnGamma(S) - LnGamma(P1) - LnGamma(P2) + P1 * Ln(R) + (P1 - 1.0) * Ln(X) - S * Ln(1.0 + R * X); if L < MinLog then DSnedecor := DefaultVal(FUnderflow, 0.0) else DSnedecor := DefaultVal(FOk, Exp(L)); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ufft.pas0000664000175000017500000002375311326434464020621 0ustar michaelmichael(*========================================================================== fourier.pas - Don Cross Modified by Jean Debord for use with TP Math. This is a Turbo Pascal Unit for calculating the Fast Fourier Transform (FFT) and the Inverse Fast Fourier Transform (IFFT). Visit the following URL for the latest version of this code. This page also has a C/C++ version, and a brief discussion of the theory behind the FFT algorithm. http://www.intersrv.com/~dcross/fft.html#pascal Revision history [most recent first]: 2007 December 10 [Jean Debord] Increased the theoretical number of points to about 2^26 for a 32-bit compiler. The exact exponent is returned by function MaxPower. 2007 January 4 [Jean Debord] Modified for new TPMath version. Renamed as ufft.pas Now uses complex arrays. 1996 December 11 [Don Cross] Improved documentation of the procedure CalcFrequency. Fixed some messed up comments in procedure IFFT. 1996 December 6 [Don Cross] Made procedure 'fft_integer' more efficient when buffer size changes in successive calls: the buffer is now only resized when the input has more samples, not a differing number of samples. Also changed the way 'fft_integer_cleanup' works so that it is more "bullet-proof". 1996 December 4 [Don Cross] Adding the procedure 'CalcFrequency', which calculates the FFT at a specific frequency index p=0..n-1, instead of the whole FFT. This is O(n^2) instead of O(n*log(n)). 1996 November 30 [Don Cross] Adding a routine to allow FFT of an input array of integers. It is called 'fft_integer'. 1996 November 18 [Don Cross] Added some comments. 1996 November 17 [Don Cross] Wrote and debugged first version. ==========================================================================*) unit ufft; interface uses utypes, umath; (*--------------------------------------------------------------------------- procedure FFT Calculates the Fast Fourier Transform of the array of complex numbers represented by 'InArray' to produce the output complex numbers in 'OutArray'. ---------------------------------------------------------------------------*) procedure FFT(NumSamples : LongInt; InArray, OutArray : PCompVector); (*--------------------------------------------------------------------------- procedure IFFT Calculates the Inverse Fast Fourier Transform of the array of complex numbers represented by 'InArray' to produce the output complex numbers in 'OutArray'. ---------------------------------------------------------------------------*) procedure IFFT(NumSamples : LongInt; InArray, OutArray : PCompVector); (*--------------------------------------------------------------------------- procedure FFT_Integer Same as procedure FFT, but uses Integer input arrays instead of double. Make sure you call FFT_Integer_Cleanup after the last time you call FFT_Integer to free up memory it allocates. ---------------------------------------------------------------------------*) procedure FFT_Integer(NumSamples : LongInt; RealIn, ImagIn : PIntVector; OutArray : PCompVector); (*-------------------------------------------------------------------------- procedure FFT_Integer_Cleanup If you call the procedure 'FFT_Integer', you must call 'FFT_Integer_Cleanup' after the last time you call 'FFT_Integer' in order to free up dynamic memory. --------------------------------------------------------------------------*) procedure FFT_Integer_Cleanup; (*-------------------------------------------------------------------------- procedure CalcFrequency This procedure calculates the complex frequency sample at a given index directly. Use this instead of 'FFT' when you only need one or two frequency samples, not the whole spectrum. It is also useful for calculating the Discrete Fourier Transform (DFT) of a number of data which is not an integer power of 2. For example, you could calculate the DFT of 100 points instead of rounding up to 128 and padding the extra 28 array slots with zeroes. --------------------------------------------------------------------------*) procedure CalcFrequency(NumSamples, FrequencyIndex : LongInt; InArray : PCompVector; var FT : Complex); implementation const TempArraySize : Integer = 0; { Flag that buffer Temp is not allocated } var Temp : PCompVector; function MaxPower : LongInt; var M : Float; begin M := MAX_COMP; MaxPower := Trunc(Log2(M)); end; function IsPowerOfTwo(X : LongInt) : Boolean; var I, Y : LongInt; begin Y := 2; for I := 1 to MaxPower do begin if X = Y then begin IsPowerOfTwo := True; Exit; end; Y := Y shl 1; end; IsPowerOfTwo := False; end; function NumberOfBitsNeeded(PowerOfTwo : LongInt) : Integer; var I : Integer; begin for I := 0 to MaxPower do begin if (PowerOfTwo and (1 shl I)) <> 0 then begin NumberOfBitsNeeded := I; Exit; end; end; end; function ReverseBits(Index, NumBits : LongInt) : Integer; var I, Rev : Integer; begin Rev := 0; for I := 0 to NumBits - 1 do begin Rev := (Rev shl 1) or (Index and 1); Index := Index shr 1; end; ReverseBits := Rev; end; procedure FourierTransform(AngleNumerator : Float; NumSamples : LongInt; InArray, OutArray : PCompVector); var NumBits, I, J, K, N, BlockSize, BlockEnd : LongInt; Delta_angle, Delta_ar, Alpha, Beta, Tr, Ti, Ar, Ai : Float; begin if not IsPowerOfTwo(NumSamples) or (NumSamples < 2) then begin SetErrCode(-1); Exit; end; SetErrCode(0); NumBits := NumberOfBitsNeeded(NumSamples); for I := 0 to NumSamples - 1 do begin J := ReverseBits(I, NumBits); OutArray^[J].X := InArray^[I].X; OutArray^[J].Y := InArray^[I].Y; end; BlockEnd := 1; BlockSize := 2; while BlockSize <= NumSamples do begin Delta_angle := AngleNumerator / BlockSize; Alpha := Sin(0.5 * Delta_angle); Alpha := 2.0 * Alpha * Alpha; Beta := Sin(Delta_angle); I := 0; while I < NumSamples do begin Ar := 1.0; (* cos(0) *) Ai := 0.0; (* sin(0) *) J := I; for N := 0 to BlockEnd - 1 do begin K := J + BlockEnd; Tr := Ar * OutArray^[K].X - Ai * OutArray^[K].Y; Ti := Ar * OutArray^[K].Y + Ai * OutArray^[K].X; OutArray^[K].X := OutArray^[J].X - Tr; OutArray^[K].Y := OutArray^[J].Y - Ti; OutArray^[J].X := OutArray^[J].X + Tr; OutArray^[J].Y := OutArray^[J].Y + Ti; Delta_ar := Alpha * Ar + Beta * Ai; Ai := Ai - (Alpha * Ai - Beta * Ar); Ar := Ar - Delta_ar; Inc(J); end; I := I + BlockSize; end; BlockEnd := BlockSize; BlockSize := BlockSize shl 1; end; end; procedure FFT(NumSamples : LongInt; InArray, OutArray : PCompVector); begin FourierTransform(2 * PI, NumSamples, InArray, OutArray); end; procedure IFFT(NumSamples : LongInt; InArray, OutArray : PCompVector); var I : Integer; begin FourierTransform(- 2 * PI, NumSamples, InArray, OutArray); if MathErr <> 0 then Exit; { Normalize the resulting time samples } for I := 0 to NumSamples - 1 do begin OutArray^[I].X := OutArray^[I].X / NumSamples; OutArray^[I].Y := OutArray^[I].Y / NumSamples; end; end; procedure FFT_Integer(NumSamples : LongInt; RealIn, ImagIn : PIntVector; OutArray : PCompVector); var I : Integer; begin if NumSamples > TempArraySize then begin FFT_Integer_Cleanup; { free up memory in case we already have some } DimCompVector(Temp, NumSamples); TempArraySize := NumSamples; end; for I := 0 to NumSamples - 1 do begin Temp^[I].X := RealIn^[I]; Temp^[I].Y := ImagIn^[I]; end; FourierTransform(2 * PI, NumSamples, Temp, OutArray); end; procedure FFT_Integer_Cleanup; begin if TempArraySize > 0 then begin DelCompVector(Temp, TempArraySize); TempArraySize := 0; end; end; procedure CalcFrequency(NumSamples, FrequencyIndex : LongInt; InArray : PCompVector; var FT : Complex); var K : Integer; Cos1, Cos2, Cos3 : Float; Sin1, Sin2, Sin3 : Float; Theta, Beta : Float; begin FT.X := 0.0; FT.Y := 0.0; Theta := 2 * PI * FrequencyIndex / NumSamples; Sin1 := Sin(- 2 * Theta); Sin2 := Sin(- Theta); Cos1 := Cos(- 2 * Theta); Cos2 := Cos(- Theta); Beta := 2 * Cos2; for K := 0 to NumSamples - 1 do begin { Update trig values } Sin3 := Beta * Sin2 - Sin1; Sin1 := Sin2; Sin2 := Sin3; Cos3 := Beta * Cos2 - Cos1; Cos1 := Cos2; Cos2 := Cos3; FT.X := FT.X + InArray^[K].X * Cos3 - InArray^[K].Y * Sin3; FT.Y := FT.Y + InArray^[K].Y * Cos3 + InArray^[K].X * Sin3; end; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ufact.pas0000664000175000017500000000277211326434464020755 0ustar michaelmichael{ ****************************************************************** Factorial ****************************************************************** } unit ufact; interface uses utypes, ugamma; function Fact(N : Integer) : Float; implementation const NFact = 33; FactArray : array[0..NFact] of Float = (1.0, 1.0, 2.0, 6.0, 24.0, 120.0, 720.0, 5040.0, 40320.0, 362880.0, 3628800.0, 39916800.0, 479001600.0, 6227020800.0, 87178291200.0, 1307674368000.0, 20922789888000.0, 355687428096000.0, 6402373705728000.0, 121645100408832000.0, 2432902008176640000.0, 51090942171709440000.0, 1124000727777607680000.0, 25852016738884976640000.0, 620448401733239439360000.0, 15511210043330985984000000.0, 403291461126605635584000000.0, 10888869450418352160768000000.0, 304888344611713860501504000000.0, 8841761993739701954543616000000.0, 265252859812191058636308480000000.0, 8222838654177922817725562880000000.0, 263130836933693530167218012160000000.0, 8683317618811886495518194401280000000.0); function Fact(N : Integer) : Float; begin SetErrCode(FOk); if N < 0 then Fact := DefaultVal(FDomain, 1.0) else if N > MaxFac then Fact := DefaultVal(FOverflow, MaxNum) else if N <= NFact then Fact := FactArray[N] else Fact := Gamma(N + 1); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uexpdist.pas0000664000175000017500000000221611326434464021511 0ustar michaelmichael{ ****************************************************************** Exponential distribution ****************************************************************** } unit uexpdist; interface uses utypes; function DExpo(A, X : Float) : Float; { Density of exponential distribution with parameter A } function FExpo(A, X : Float) : Float; { Cumulative probability function for exponential dist. with parameter A } implementation function DExpo(A, X : Float) : Float; var Y : Float; begin if (A <= 0.0) or (X < 0.0) then begin DExpo := DefaultVal(FDomain, 0.0); Exit; end; Y := - A * X; if Y < MinLog then begin DExpo := DefaultVal(FUnderflow, 0.0); Exit; end; SetErrCode(FOk); DExpo := A * Exp(Y); end; function FExpo(A, X : Float) : Float; var Y : Float; begin if (A <= 0.0) or (X < 0.0) then begin FExpo := DefaultVal(FDomain, 0.0); Exit; end; Y := - A * X; if Y < MinLog then begin FExpo := DefaultVal(FUnderflow, 1.0); Exit; end; SetErrCode(FOk); FExpo := 1.0 - Exp(Y); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ueltran.pas0000664000175000017500000000446311326434464021324 0ustar michaelmichael{ ****************************************************************** Save transformations used by ElmHes ****************************************************************** } unit ueltran; interface uses utypes; procedure Eltran(A : PMatrix; Lb, Ub, I_low, I_igh : Integer; I_int : PIntVector; Z : PMatrix); implementation procedure Eltran(A : PMatrix; Lb, Ub, I_low, I_igh : Integer; I_int : PIntVector; Z : PMatrix); { ------------------------------------------------------------------ This procedure is a translation of the EISPACK subroutine Eltran. This procedure accumulates the stabilized elementary similarity transformations used in the reduction of a real general matrix to upper Hessenberg form by Elmhes. On input: A contains the multipliers which were used in the reduction by Elmhes in its lower triangle below the subdiagonal. Lb, Ub are the lowest and highest indices of the elements of A I_low and I_igh are integers determined by the balancing procedure Balance. If Balance has not been used, set I_low=Lb, I_igh=Ub. I_int contains information on the rows and columns interchanged in the reduction by Elmhes. Only elements I_low through I_igh are used. On output: Z contains the transformation matrix produced in the reduction by Elmhes. ------------------------------------------------------------------ } var I, J, Mp, Mp1 : Integer; begin { Initialize Z to identity matrix } for I := Lb to Ub do for J := Lb to Ub do if I = J then Z^[I]^[J] := 1.0 else Z^[I]^[J] := 0.0; if I_igh < I_low then Exit; for Mp := I_igh - 1 downto I_low + 1 do begin Mp1 := Mp + 1; for I := Mp1 to I_igh do Z^[I]^[Mp] := A^[I]^[Mp - 1]; I := I_int^[Mp]; if I <> Mp then begin for J := Mp to I_igh do begin Z^[Mp]^[J] := Z^[I]^[J]; Z^[I]^[J] := 0.0; end; Z^[I]^[Mp] := 1.0; end; end; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uelmhes.pas0000664000175000017500000000607511326434464021315 0ustar michaelmichael{ ****************************************************************** Reduction of a square matrix to upper Hessenberg form ****************************************************************** } unit uelmhes; interface uses utypes; procedure ElmHes(A : PMatrix; Lb, Ub, I_low, I_igh : Integer; I_int : PIntVector); implementation procedure ElmHes(A : PMatrix; Lb, Ub, I_low, I_igh : Integer; I_int : PIntVector); { ------------------------------------------------------------------ This procedure is a translation of the EISPACK subroutine Elmhes Given a real general matrix, this procedure reduces a submatrix situated in rows and columns I_low through I_igh to upper Hessenberg form by stabilized elementary similarity transformations. On input: A contains the input matrix. Lb, Ub are the lowest and highest indices of the elements of A. I_low and I_igh are integers determined by the balancing procedure Balance. If Balance has not been used, set I_low = Lb, I_igh = Ub. On output: A contains the Hessenberg matrix. The multipliers which were used in the reduction are stored in the remaining triangle under the Hessenberg matrix. I_int contains information on the rows and columns interchanged in the reduction. Only elements I_low through I_igh are used. ------------------------------------------------------------------ } var I, J, M, La, Kp1, Mm1, Mp1 : Integer; X, Y : Float; begin La := I_igh - 1; Kp1 := I_low + 1; if La < Kp1 then Exit; for M := Kp1 to La do begin Mm1 := M - 1; X := 0.0; I := M; for J := M to I_igh do if Abs(A^[J]^[Mm1]) > Abs(X) then begin X := A^[J]^[Mm1]; I := J; end; I_int^[M] := I; { Interchange rows and columns of A } if I <> M then begin for J := Mm1 to Ub do begin Y := A^[I]^[J]; A^[I]^[J] := A^[M]^[J]; A^[M]^[J] := Y; end; for J := Lb to I_igh do begin Y := A^[J]^[I]; A^[J]^[I] := A^[J]^[M]; A^[J]^[M] := Y; end; end; if X <> 0.0 then begin Mp1 := M + 1; for I := Mp1 to I_igh do begin Y := A^[I]^[Mm1]; if Y <> 0.0 then begin Y := Y / X; A^[I]^[Mm1] := Y; for J := M to Ub do A^[I]^[J] := A^[I]^[J] - Y * A^[M]^[J]; for J := Lb to I_igh do A^[J]^[M] := A^[J]^[M] + Y * A^[J]^[I]; end; end; end; end; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ueigvec.pas0000664000175000017500000000216611326434464021277 0ustar michaelmichael{ ****************************************************************** Eigenvalues and eigenvectors of a general square matrix ****************************************************************** } unit ueigvec; interface uses utypes, ubalance, uelmhes, ueltran, uhqr2, ubalbak; procedure EigenVect(A : PMatrix; Lb, Ub : Integer; Lambda : PCompVector; V : PMatrix); implementation procedure EigenVect(A : PMatrix; Lb, Ub : Integer; Lambda : PCompVector; V : PMatrix); var I_low, I_igh : Integer; Scale : PVector; I_Int : PIntVector; begin DimVector(Scale, Ub); DimIntVector(I_Int, Ub); Balance(A, Lb, Ub, I_low, I_igh, Scale); ElmHes(A, Lb, Ub, I_low, I_igh, I_int); Eltran(A, Lb, Ub, I_low, I_igh, I_int, V); Hqr2(A, Lb, Ub, I_low, I_igh, Lambda, V); if MathErr = 0 then BalBak(V, Lb, Ub, I_low, I_igh, Scale, Ub); DelVector(Scale, Ub); DelIntVector(I_Int, Ub); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ueigval.pas0000664000175000017500000000160211326434464021276 0ustar michaelmichael{ ****************************************************************** Eigenvalues of a general square matrix ****************************************************************** } unit ueigval; interface uses utypes, ubalance, uelmhes, uhqr; procedure EigenVals(A : PMatrix; Lb, Ub : Integer; Lambda : PCompVector); implementation procedure EigenVals(A : PMatrix; Lb, Ub : Integer; Lambda : PCompVector); var I_low, I_igh : Integer; Scale : PVector; I_int : PIntVector; begin DimVector(Scale, Ub); DimIntVector(I_Int, Ub); Balance(A, Lb, Ub, I_low, I_igh, Scale); ElmHes(A, Lb, Ub, I_low, I_igh, I_int); Hqr(A, Lb, Ub, I_low, I_igh, Lambda); DelVector(Scale, Ub); DelIntVector(I_Int, Ub); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/udistrib.pas0000664000175000017500000000562211326434464021475 0ustar michaelmichael{ ****************************************************************** Statistical distribution ****************************************************************** } unit udistrib; interface uses utypes; procedure DimStatClassVector(var C : PStatClassVector; Ub : Integer); { ------------------------------------------------------------------ Allocates an array of statistical classes: C[0..Ub] ------------------------------------------------------------------ } procedure DelStatClassVector(var C : PStatClassVector; Ub : Integer); { ------------------------------------------------------------------ Deallocates an array of statistical classes: C[0..Ub] ------------------------------------------------------------------ } procedure Distrib(X : PVector; Lb, Ub : Integer; A, B, H : Float; C : PStatClassVector); { ------------------------------------------------------------------ Distributes the values of array X[Lb..Ub] into M classes with equal width H, according to the following scheme: C[1] C[2] C[M] ]-------]-------].......]-------]-------] A A+H A+2H B such that B = A + M * H ------------------------------------------------------------------ } implementation procedure DimStatClassVector(var C : PStatClassVector; Ub : Integer); var I : Integer; begin { Check bounds } if (Ub < 0) or (Ub > MAX_CLS) then begin C := nil; Exit; end; { Allocate vector } GetMem(C, (Ub + 1) * SizeOf(StatClass)); if C = nil then Exit; { Initialize vector } for I := 0 to Ub do with C^[I] do begin Inf := 0.0; Sup := 0.0; N := 0; F := 0.0; D := 0.0; end; end; procedure DelStatClassVector(var C : PStatClassVector; Ub : Integer); begin if C <> nil then begin FreeMem(C, (Ub + 1) * SizeOf(StatClass)); C := nil; end; end; function NumCls(X, A, H : Float) : Integer; { Returns the index of the class containing X A is the lower bound of the first class H is the class width } var Y : Float; I : Integer; begin Y := (X - A) / H; I := Trunc(Y); if Y <> I then Inc(I); NumCls := I; end; procedure Distrib(X : PVector; Lb, Ub : Integer; A, B, H : Float; C : PStatClassVector); var I, K, M, Nt : Integer; begin M := Round((B - A) / H); for K := 1 to M do C^[K].N := 0; for I := Lb to Ub do begin K := NumCls(X^[I], A, H); Inc(C^[K].N); end; Nt := Ub - Lb + 1; for K := 1 to M do with C^[K] do begin Inf := A + (K - 1) * H; Sup := Inf + H; F := N / Nt; D := F / H; end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/udigamma.pas0000664000175000017500000000752211326434464021435 0ustar michaelmichael{ ****************************************************************** DiGamma and TriGamma functions. Contributed by Philip Fletcher (FLETCHP@WESTAT.com) ****************************************************************** } unit udigamma; interface uses utypes; function DiGamma(X : Float ) : Float; function TriGamma(X : Float ) : Float; implementation function DiGamma(X : Float ) : Float; { ------------------------------------------------------------------ Digamma calculates the Digamma or Psi function = d ( LOG ( GAMMA ( X ) ) ) / dX Reference: J Bernardo, Psi ( Digamma ) Function, Algorithm AS 103, Applied Statistics, Volume 25, Number 3, pages 315-317, 1976. Modified: 03 January 2000 Parameters: Input, real X, the argument of the Digamma function. 0 < X. Output, real Digamma, the value of the Digamma function at X. ------------------------------------------------------------------ } const c = 20 ; d1 = -0.57721566490153286061; { DiGamma(1) } s = 0.00001 ; { Sterling coefficient S(n) = B(n) / 2n where B(n) = Bernoulli number } const S2 = 0.08333333333333333333 ; { B(2)/2 } S4 = -0.83333333333333333333E-2 ; { B(4)/4 } S6 = 0.39682539682539682541E-2 ; { B(6)/6 } S8 = -0.41666666666666666666E-2 ; { B(8)/8 } S10 = 0.75757575757575757576E-2 ; { B(10)/10 } S12 = -0.21092796092796092796E-1 ; { B(12)/12 } S14 = 0.83333333333333333335E-1 ; { B(14)/14 } S16 = -0.44325980392156862745 ; { B(16)/16 } var dg, p, r, y : Float ; begin if X <= 0.0 then begin DiGamma := DefaultVal(FSing, MaxNum); Exit; end; SetErrCode(FOk); if X = 1.0 then begin DiGamma := D1; Exit; end; { Use approximation if argument <= S } if X <= s then dg := d1 - 1.0 / x else { Reduce the argument to dg(X + N) where (X + N) >= C } begin dg := 0.0; y := x ; while y < c do begin dg := dg - 1.0 / y; y := y + 1.0; end ; { Use Stirling's (actually de Moivre's) expansion if argument > C } r := 1.0 / sqr ( y ) ; p := (((((((S16 * r + S14) * r + S12) * r + S10) * r + S8) * r + S6) * r + S4) * r + S2) * r ; dg := dg + ln ( y ) - 0.5 / y - p ; end ; DiGamma := dg ; end ; function TriGamma(X : Float) : Float; { ------------------------------------------------------------------ Trigamma calculates the Trigamma or Psi Prime function = d**2 ( LOG ( GAMMA ( X ) ) ) / dX**2 Reference: Algorithm As121 Appl. Statist. (1978) vol 27, no. 1 ******************************************************************** } const a = 1.0E-4 ; b = 20 ; zero = 0 ; one = 1 ; half = 0.5 ; { Bernoulli numbers } const B2 = 0.1666666666666667 ; B4 = -3.333333333333333E-002 ; B6 = 2.380952380952381E-002 ; B8 = -3.333333333333333E-002 ; B10 = 7.575757575757576E-002 ; B12 = -0.2531135531135531 ; var y, z, Res : Float ; begin if X <= 0.0 then begin TriGamma := DefaultVal(FSing, MaxNum); Exit; end; SetErrCode(FOk); Res := 0 ; z := x ; if z <= a then { Use small value approximation } begin TriGamma := one / sqr ( z ) ; Exit ; end ; while z < b do { Increase argument to (x+i) >= b } begin Res := Res + one / sqr ( z ) ; z := z + one ; end ; { Apply asymptotic formula where argument >= b } y := one / sqr ( z ) ; Res := Res + Half * y + (One + y * (B2 + y * (B4 + y * (B6 + y * (B8 + y* (B10 + y * B12)))))) / z; TriGamma := Res; end ; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ucorrel.pas0000664000175000017500000000175711326434464021330 0ustar michaelmichael{ ****************************************************************** Correlation coefficient ****************************************************************** } unit ucorrel; interface uses utypes; function Correl(X, Y : PVector; Lb, Ub : Integer) : Float; { Correlation coefficient between samples X and Y } implementation function Correl(X, Y : PVector; Lb, Ub : Integer) : Float; var SX, SY, Xbar, Ybar, DX, DY, SSX, SSY, SP : Float; N, I : Integer; begin N := Ub - Lb + 1; SX := 0.0; SY := 0.0; for I := Lb to Ub do begin SX := SX + X^[I]; SY := SY + Y^[I]; end; Xbar := SX / N; Ybar := SY / N; SSX := 0.0; SSY := 0.0; SP := 0.0; for I := Lb to Ub do begin DX := X^[I] - Xbar; DY := Y^[I] - Ybar; SSX := SSX + DX * DX; SSY := SSY + DY * DY; SP := SP + DX * DY; end; Correl := SP / Sqrt(SSX * SSY); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ucompvec.pas0000664000175000017500000000216411326434464021467 0ustar michaelmichael{ ****************************************************************** Comparison of two vectors ****************************************************************** } unit ucompvec; interface uses utypes; function CompVec(X, Xref : PVector; Lb, Ub : Integer; Tol : Float) : Boolean; { ------------------------------------------------------------------ Checks if each component of vector X is within a fraction Tol of the corresponding component of the reference vector Xref. In this case, the function returns True, otherwise it returns False ------------------------------------------------------------------ } implementation function CompVec(X, Xref : PVector; Lb, Ub : Integer; Tol : Float) : Boolean; var I : Integer; Ok : Boolean; ITol : Float; begin I := Lb; Ok := True; repeat ITol := Tol * Abs(Xref^[I]); if ITol < MachEp then ITol := MachEp; Ok := Ok and (Abs(X^[I] - Xref^[I]) < ITol); I := I + 1; until (not Ok) or (I > Ub); CompVec := Ok; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ucholesk.pas0000664000175000017500000000276211326434464021467 0ustar michaelmichael{ ****************************************************************** Cholesky factorization of a positive definite symmetric matrix ****************************************************************** } unit ucholesk; interface uses utypes; procedure Cholesky(A, L : PMatrix; Lb, Ub : Integer); { ------------------------------------------------------------------ Cholesky decomposition. Factors the symmetric positive definite matrix A as a product L * L' where L is a lower triangular matrix. This procedure may be used as a test of positive definiteness. ------------------------------------------------------------------ Possible results : MatOk : No error MatNotPD : Matrix not positive definite ------------------------------------------------------------------ } implementation procedure Cholesky(A, L : PMatrix; Lb, Ub : Integer); var I, J, K : Integer; Sum : Float; begin for K := Lb to Ub do begin Sum := A^[K]^[K]; for J := Lb to K - 1 do Sum := Sum - Sqr(L^[K]^[J]); if Sum <= 0.0 then begin SetErrCode(MatNotPD); Exit end; L^[K]^[K] := Sqrt(Sum); for I := K + 1 to Ub do begin Sum := A^[I]^[K]; for J := Lb to K - 1 do Sum := Sum - L^[I]^[J] * L^[K]^[J]; L^[I]^[K] := Sum / L^[K]^[K]; L^[K]^[I] := 0.0; end; end; SetErrCode(MatOk); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ubroyden.pas0000664000175000017500000001237011326434464021475 0ustar michaelmichael{ ****************************************************************** Broyden method for system of nonlinear equations ****************************************************************** } unit ubroyden; interface uses utypes, ulinminq, ucompvec; procedure Broyden(Equations : TEquations; X, F : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float); { ------------------------------------------------------------------ Solves a system of nonlinear equations by Broyden's method ------------------------------------------------------------------ Input parameters : Equations = subroutine to compute equations X = initial roots Lb, Ub = bounds of X MaxIter = maximum number of iterations Tol = required precision ------------------------------------------------------------------ Output parameters : X = refined roots F = function values ------------------------------------------------------------------ Possible results : OptOk = no error OptNonConv = non-convergence ------------------------------------------------------------------ } implementation procedure Broyden(Equations : TEquations; X, F : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float); var I, J, K, Iter : Integer; A, DeltaXmax, Fmax, P, Q, R, S : Float; Conv : Boolean; OldX, DeltaX, dX, OldF, dF, DdF : PVector; Dinv : PMatrix; procedure Terminate(ErrCode : Integer); { Set error code and deallocate arrays } begin DelVector(OldX, Ub); DelVector(DeltaX, Ub); DelVector(dX, Ub); DelVector(OldF, Ub); DelVector(dF, Ub); DelVector(DdF, Ub); DelMatrix(Dinv, Ub, Ub); SetErrCode(ErrCode); end; begin { Initialize function vector } Equations(X, F); { Quit if no iteration required } if MaxIter < 1 then begin SetErrCode(OptOk); Exit; end; { Dimension arrays } DimVector(OldX, Ub); DimVector(DeltaX, Ub); DimVector(dX, Ub); DimVector(OldF, Ub); DimVector(dF, Ub); DimVector(DdF, Ub); DimMatrix(Dinv, Ub, Ub); { Initialize inverse jacobian to unit matrix } for I := Lb to Ub do begin Dinv^[I]^[I] := 1.0; for J := I + 1 to Ub do begin Dinv^[I]^[J] := 0.0; Dinv^[J]^[I] := 0.0 end; end; Iter := 0; { Compute max. function component } Fmax := Abs(F^[Lb]); for I := Lb + 1 to Ub do begin A := Abs(F^[I]); if A > Fmax then Fmax := A; end; { Quit if function vector is already small } if Fmax < MachEp then begin Terminate(OptOk); Exit; end; { Initialize search direction } for I := Lb to Ub do DeltaX^[I] := - F^[I]; repeat { Prepare next iteration } Iter := Iter + 1; if Iter > MaxIter then begin Terminate(OptNonConv); Exit; end; { Normalize search direction to avoid excessive displacements } DeltaXmax := Abs(DeltaX^[Lb]); for I := Lb + 1 to Ub do begin A := Abs(DeltaX^[I]); if A > DeltaXmax then DeltaXmax := A; end; if DeltaXmax > 1.0 then for I := Lb to Ub do DeltaX^[I] := DeltaX^[I] / DeltaXmax; { Save old parameters and functions } for I := Lb to Ub do begin OldX^[I] := X^[I]; OldF^[I] := F^[I]; end; { Minimize along the direction specified by DeltaX, with initial step R = 1, and compute new function } R := 1.0; LinMinEq(Equations, X, DeltaX, F, Lb, Ub, R, 10, 0.01); Equations(X, F); { Compute differences between two successive estimations of parameter vector and function vector } for I := Lb to Ub do begin dX^[I] := X^[I] - OldX^[I]; dF^[I] := F^[I] - OldF^[I]; end; { Multiply by inverse jacobian } for I := Lb to Ub do begin DdF^[I] := 0.0; for J := Lb to Ub do DdF^[I] := DdF^[I] + Dinv^[I]^[J] * dF^[J]; end; { Scalar product in denominator of Broyden formula } P := 0.0; for I := Lb to Ub do P := P + dX^[I] * DdF^[I]; if P = 0.0 then Exit; { Inverse of scalar product } Q := 1.0 / P; { Update inverse jacobian } for I := Lb to Ub do begin A := (dX^[I] - DdF^[I]) * Q; for J := Lb to Ub do begin S := 0.0; for K := Lb to Ub do S := S + dX^[K] * Dinv^[K]^[J]; Dinv^[I]^[J] := Dinv^[I]^[J] + A * S; end; end; { Update search direction } for I := Lb to Ub do begin DeltaX^[I] := 0.0; for J := Lb to Ub do DeltaX^[I] := DeltaX^[I] - Dinv^[I]^[J] * F^[J]; end; { Test for convergence } Conv := CompVec(X, OldX, Lb, Ub, Tol); until Conv; Terminate(OptOk); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ubisect.pas0000664000175000017500000000404411326434464021303 0ustar michaelmichael{ ****************************************************************** Bisection method for nonlinear equation ****************************************************************** } unit ubisect; interface uses utypes; procedure RootBrack(Func : TFunc; var X, Y, FX, FY : Float); { ------------------------------------------------------------------ Expands the interval [X,Y] until it contains a root of Func, i. e. Func(X) and Func(Y) have opposite signs. The corresponding function values are returned in FX and FY. ------------------------------------------------------------------ } procedure Bisect (Func : TFunc; var X, Y : Float; MaxIter : Integer; Tol : Float; var F : Float); implementation procedure RootBrack(Func : TFunc; var X, Y, FX, FY : Float); begin FX := Func(X); FY := Func(Y); while FX * FY > 0 do if Abs(FX) < Abs(FY) then begin X := X + Gold * (X - Y); FX := Func(X) end else begin Y := Y + Gold * (Y - X); FY := Func(Y) end; end; procedure Bisect (Func : TFunc; var X, Y : Float; MaxIter : Integer; Tol : Float; var F : Float); var Iter : Integer; G, Z, FZ : Float; begin Iter := 0; SetErrCode(OptOk); F := Func(X); if MaxIter < 1 then Exit; G := Func(Y); if F * G >= 0 then RootBrack(Func, X, Y, F, G); repeat Iter := Iter + 1; if Iter > MaxIter then begin SetErrCode(OptNonConv); Exit; end; Z := 0.5 * (X + Y); FZ := Func(Z); if F * FZ > 0 then begin X := Z; F := FZ; end else begin Y := Z; G := FZ; end; until Abs(X - Y) < Tol * (Abs(X) + Abs(Y)); X := 0.5 * (X + Y); F := Func(X); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ubinom.pas0000664000175000017500000000251611326434464021140 0ustar michaelmichael{ ****************************************************************** Binomial distribution ****************************************************************** } unit ubinom; interface uses utypes, umath; function Binomial(N, K : Integer) : Float; { Binomial coefficient C(N,K) } function PBinom(N : Integer; P : Float; K : Integer) : Float; { Probability of binomial distribution } implementation function Binomial(N, K : Integer) : Float; var I, N1 : Integer; Prod : Float; begin SetErrCode(FOk); if K < 0 then Binomial := 0.0 else if (K = 0) or (K = N) then Binomial := 1.0 else if (K = 1) or (K = N - 1) then Binomial := N else begin if K > N - K then K := N - K; N1 := Succ(N); Prod := N; for I := 2 to K do Prod := Prod * ((N1 - I) / I); Binomial := Int(0.5 + Prod); end; end; function PBinom(N : Integer; P : Float; K : Integer) : Float; begin SetErrCode(FOk); if (P < 0.0) or (P > 1.0) or (N <= 0) or (N < K) then PBinom := DefaultVal(FDomain, 0.0) else if K = 0 then PBinom := Power(1.0 - P, N) else if K = N then PBinom := Power(P, N) else PBinom := Binomial(N, K) * Power(P, K) * Power(1.0 - P, N - K); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ubfgs.pas0000664000175000017500000001607611326434464020763 0ustar michaelmichael{ ****************************************************************** Minimization of a function of several variables by the Broyden-Fletcher-Goldfarb-Shanno (BFGS) method ****************************************************************** } unit ubfgs; interface uses utypes, ulinmin, ucompvec; procedure SaveBFGS(FileName : string); { ------------------------------------------------------------------ Save BFGS iterations in a file ------------------------------------------------------------------ } procedure BFGS(Func : TFuncNVar; Gradient : TGradient; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; G : PVector; H_inv : PMatrix); { ------------------------------------------------------------------ Minimization of a function of several variables by the Broyden-Fletcher-Goldfarb-Shanno method ------------------------------------------------------------------ Input parameters : Func = objective function Gradient = procedure to compute gradient X = initial minimum coordinates Lb, Ub = indices of first and last variables MaxIter = maximum number of iterations Tol = required precision ------------------------------------------------------------------ Output parameters : X = refined minimum coordinates F_min = function value at minimum G = gradient vector H_inv = inverse hessian matrix ------------------------------------------------------------------ Possible results : OptOk OptNonConv ---------------------------------------------------------------------- } implementation const WriteLogFile : Boolean = False; var LogFile : Text; procedure SaveBFGS(FileName : string); begin Assign(LogFile, FileName); Rewrite(LogFile); WriteLogFile := True; end; procedure BFGS(Func : TFuncNVar; Gradient : TGradient; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; G : PVector; H_inv : PMatrix); var I, J, Iter : Integer; A, DeltaXmax, Gmax, P1, P2, R, R1, R2 : Float; OldX, DeltaX, dX, OldG, dG, HdG, R1dX, R2HdG, U, P2U : PVector; procedure Init; { Initializes Function, Gradient and Inverse Hessian } var I, J : Integer; begin { Initialize function } F_min := Func(X); { Initialize gradient } Gradient(X, G); { Initialize inverse hessian to unit matrix } for I := Lb to Ub do begin H_inv^[I]^[I] := 1.0; for J := I + 1 to Ub do begin H_inv^[I]^[J] := 0.0; H_inv^[J]^[I] := 0.0; end; end; end; procedure Terminate(ErrCode : Integer); { Set error code and deallocate arrays } begin DelVector(OldX, Ub); DelVector(DeltaX, Ub); DelVector(dX, Ub); DelVector(OldG, Ub); DelVector(dG, Ub); DelVector(HdG, Ub); DelVector(R1dX, Ub); DelVector(R2HdG, Ub); DelVector(U, Ub); DelVector(P2U, Ub); SetErrCode(ErrCode); if WriteLogFile then Close(LogFile); end; begin DimVector(OldX, Ub); DimVector(DeltaX, Ub); DimVector(dX, Ub); DimVector(OldG, Ub); DimVector(dG, Ub); DimVector(HdG, Ub); DimVector(R1dX, Ub); DimVector(R2HdG, Ub); DimVector(U, Ub); DimVector(P2U, Ub); Init; if MaxIter < 1 then begin Terminate(OptOk); Exit; end; if WriteLogFile then begin WriteLn(LogFile, 'BFGS'); WriteLn(LogFile, 'Iter F'); end; { Compute max. gradient component } Gmax := Abs(G^[Lb]); for I := Lb + 1 to Ub do begin A := Abs(G^[I]); if A > Gmax then Gmax := A; end; { Quit if gradient is already small } if Gmax < MachEp then begin Terminate(OptOk); Exit; end; { Initialize search direction } for I := Lb to Ub do DeltaX^[I] := - G^[I]; Iter := 0; repeat { Prepare next iteration } if WriteLogFile then WriteLn(LogFile, Iter:4, ' ', F_min:12); Iter := Iter + 1; if Iter > MaxIter then begin Terminate(OptNonConv); Exit; end; { Normalize search direction to avoid excessive displacements } DeltaXmax := Abs(DeltaX^[Lb]); for I := Lb + 1 to Ub do begin A := Abs(DeltaX^[I]); if A > DeltaXmax then DeltaXmax := A; end; if DeltaXmax > 1.0 then for I := Lb to Ub do DeltaX^[I] := DeltaX^[I] / DeltaXmax; { Save old parameters and gradient } for I := Lb to Ub do begin OldX^[I] := X^[I]; OldG^[I] := G^[I]; end; { Minimize along the direction specified by DeltaX } R := 1.0; LinMin(Func, X, DeltaX, Lb, Ub, R, 10, 0.01, F_min); { Compute new gradient } Gradient(X, G); { Compute differences between two successive estimations of parameter vector and gradient vector } for I := Lb to Ub do begin dX^[I] := X^[I] - OldX^[I]; dG^[I] := G^[I] - OldG^[I]; end; { Multiply by inverse hessian } for I := Lb to Ub do begin HdG^[I] := 0.0; for J := Lb to Ub do HdG^[I] := HdG^[I] + H_inv^[I]^[J] * dG^[J]; end; { Scalar products in denominator of BFGS formula } P1 := 0.0; P2 := 0.0; for I := Lb to Ub do begin P1 := P1 + dX^[I] * dG^[I]; P2 := P2 + dG^[I] * HdG^[I]; end; if (P1 = 0.0) or (P2 = 0.0) then Exit; { Inverses of scalar products } R1 := 1.0 / P1; R2 := 1.0 / P2; { Compute BFGS correction terms } for I := Lb to Ub do begin R1dX^[I] := R1 * dX^[I]; R2HdG^[I] := R2 * HdG^[I]; U^[I] := R1dX^[I] - R2HdG^[I]; P2U^[I] := P2 * U^[I]; end; { Update inverse hessian } for I := Lb to Ub do for J := Lb to Ub do H_inv^[I]^[J] := H_inv^[I]^[J] + R1dX^[I] * dX^[J] - R2HdG^[I] * HdG^[J] + P2U^[I] * U^[J]; { Update search direction } for I := Lb to Ub do begin DeltaX^[I] := 0.0; for J := Lb to Ub do DeltaX^[I] := DeltaX^[I] - H_inv^[I]^[J] * G^[J]; end; until CompVec(X, OldX, Lb, Ub, Tol); Terminate(OptOk); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ubeta.pas0000664000175000017500000000170411326434464020745 0ustar michaelmichael{ ****************************************************************** Beta function ****************************************************************** } unit ubeta; interface uses utypes, ugamma; function Beta(X, Y : Float) : Float; implementation function Beta(X, Y : Float) : Float; { Computes Beta(X, Y) = Gamma(X) * Gamma(Y) / Gamma(X + Y) } var Lx, Ly, Lxy : Float; SgnBeta : Integer; begin SetErrCode(FOk); SgnBeta := SgnGamma(X) * SgnGamma(Y) * SgnGamma(X + Y); Lxy := LnGamma(X + Y); if MathErr <> FOk then begin Beta := 0.0; Exit; end; Lx := LnGamma(X); if MathErr <> FOk then begin Beta := SgnBeta * MaxNum; Exit; end; Ly := LnGamma(Y); if MathErr <> FOk then begin Beta := SgnBeta * MaxNum; Exit; end; Beta := SgnBeta * Exp(Lx + Ly - Lxy); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ubartlet.pas0000664000175000017500000000344711326434464021475 0ustar michaelmichael{ ****************************************************************** Bartlett's test (comparison of several variances) ****************************************************************** } unit ubartlet; interface uses utypes; procedure Bartlett(Ns : Integer; N : PIntVector; S : PVector; var Khi2 : Float; var DoF : Integer); { ------------------------------------------------------------------ Input parameters : Ns = number of samples N = samples sizes S = samples SD's (computed with StDev) Output parameters: Khi2 = Bartlett's khi-2 DoF = degrees of freedom ------------------------------------------------------------------ } implementation procedure Bartlett(Ns : Integer; N : PIntVector; S : PVector; var Khi2 : Float; var DoF : Integer); var I, Nt, N1, DoF_r : Integer; SSr, Vr, Vi, SumLog, SumInv : Float; begin if Ns < 2 then begin SetErrCode(MatErrDim); Exit end; Nt := 0; for I := 1 to Ns do Nt := Nt + N^[I]; if Nt <= Ns then begin SetErrCode(MatErrDim); Exit; end; SetErrCode(MatOk); SSr := 0.0; SumLog := 0.0; SumInv := 0.0; for I := 1 to Ns do begin N1 := N^[I] - 1; Vi := Sqr(S^[I]); SSr := SSr + N1 * Vi; SumLog := SumLog + N1 * Ln(Vi); SumInv := SumInv + 1 / N1; end; DoF := Ns - 1; DoF_r := Nt - Ns; Vr := SSr / DoF_r; Khi2 := (DoF_r * Ln(Vr) - SumLog) / (1.0 + (SumInv - 1.0 / DoF_r) / (3.0 * DoF)); end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/ubalbak.pas0000664000175000017500000000502111326434464021242 0ustar michaelmichael{ ****************************************************************** Back transformation of eigenvectors ****************************************************************** } unit ubalbak; interface uses utypes; procedure BalBak(Z : PMatrix; Lb, Ub, I_low, I_igh : Integer; Scale : PVector; M : Integer); implementation procedure BalBak(Z : PMatrix; Lb, Ub, I_low, I_igh : Integer; Scale : PVector; M : Integer); { ------------------------------------------------------------------ This procedure is a translation of the EISPACK subroutine Balbak This procedure forms the eigenvectors of a real general matrix by back transforming those of the corresponding balanced matrix determined by Balance. On input: Z contains the real and imaginary parts of the eigenvectors to be back transformed. Lb, Ub are the lowest and highest indices of the elements of Z I_low and I_igh are integers determined by Balance. Scale contains information determining the permutations and scaling factors used by Balance. M is the index of the latest column of Z to be back transformed. On output: Z contains the real and imaginary parts of the transformed eigenvectors in its columns Lb..M ------------------------------------------------------------------ } var I, J, K : Integer; S : Float; begin if M < Lb then Exit; if I_igh <> I_low then for I := I_low to I_igh do begin S := Scale^[I]; { Left hand eigenvectors are back transformed if the foregoing statement is replaced by S := 1.0 / Scale^[I] } for J := Lb to M do Z^[I]^[J] := Z^[I]^[J] * S; end; for I := (I_low - 1) downto Lb do begin K := Round(Scale^[I]); if K <> I then for J := Lb to M do begin S := Z^[I]^[J]; Z^[I]^[J] := Z^[K]^[J]; Z^[K]^[J] := S; end; end; for I := (I_igh + 1) to Ub do begin K := Round(Scale^[I]); if K <> I then for J := Lb to M do begin S := Z^[I]^[J]; Z^[I]^[J] := Z^[K]^[J]; Z^[K]^[J] := S; end; end; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/ubalance.pas0000664000175000017500000001220411326434464021414 0ustar michaelmichael{ ****************************************************************** Balances a matrix and tries to isolate eigenvalues ****************************************************************** } unit ubalance; interface uses utypes; procedure Balance( A : PMatrix; Lb, Ub : Integer; var I_low, I_igh : Integer; Scale : PVector); implementation procedure Balance( A : PMatrix; Lb, Ub : Integer; var I_low, I_igh : Integer; Scale : PVector); { ------------------------------------------------------------------ This procedure is a translation of the EISPACK procedure Balanc. This procedure balances a real matrix and isolates eigenvalues whenever possible. On input: A contains the input matrix to be balanced. Lb, Ub are the lowest and highest indices of the elements of A. On output: A contains the balanced matrix. I_low and I_igh are two integers such that A[i,j] is equal to zero if (1) i is greater than j and (2) j=Lb,...,I_low-1 or i=I_igh+1,...,Ub. Scale contains information determining the permutations and scaling factors used. Suppose that the principal submatrix in rows I_low through I_igh has been balanced, that P[j] denotes the index interchanged with j during the permutation step, and that the elements of the diagonal matrix used are denoted by D[i,j]. then Scale[j] = P[j], for j = Lb,...,I_low-1 = D[j,j], j = I_low,...,I_igh = P[j] j = I_igh+1,...,Ub. the order in which the interchanges are made is Ub to I_igh+1, then Lb to I_low-1. Note that Lb is returned for I_igh if I_igh is < Lb formally ------------------------------------------------------------------ } const RADIX = 2; { Base used in floating number representation } var I, J, M : Integer; C, F, G, R, S, B2 : Float; Flag, Found, Conv : Boolean; procedure Exchange; { Row and column exchange } var I : Integer; begin Scale^[M] := J; if J = M then Exit; for I := Lb to I_igh do begin F := A^[I]^[J]; A^[I]^[J] := A^[I]^[M]; A^[I]^[M] := F; end; for I := I_low to Ub do begin F := A^[J]^[I]; A^[J]^[I] := A^[M]^[I]; A^[M]^[I] := F; end; end; begin B2 := RADIX * RADIX; I_low := Lb; I_igh := Ub; { Search for rows isolating an eigenvalue and push them down } repeat J := I_igh; repeat I := Lb; repeat Flag := (I <> J) and (A^[J]^[I] <> 0.0); I := I + 1; until Flag or (I > I_igh); Found := not Flag; if Found then begin M := I_igh; Exchange; I_igh := I_igh - 1; end; J := J - 1; until Found or (J < Lb); until (not Found) or (I_igh < Lb); if I_igh < Lb then I_igh := Lb; if I_igh = Lb then Exit; { Search for columns isolating an eigenvalue and push them left } repeat J := I_low; repeat I := I_low; repeat Flag := (I <> J) and (A^[I]^[J] <> 0.0); I := I + 1; until Flag or (I > I_igh); Found := not Flag; if Found then begin M := I_low; Exchange; I_low := I_low + 1; end; J := J + 1; until Found or (J > I_igh); until (not Found); { Now balance the submatrix in rows I_low to I_igh } for I := I_low to I_igh do Scale^[I] := 1.0; { Iterative loop for norm reduction } repeat Conv := True; for I := I_low to I_igh do begin C := 0.0; R := 0.0; for J := I_low to I_igh do if J <> I then begin C := C + Abs(A^[J]^[I]); R := R + Abs(A^[I]^[J]); end; { Guard against zero C or R due to underflow } if (C <> 0.0) and (R <> 0.0) then begin G := R / RADIX; F := 1.0; S := C + R; while C < G do begin F := F * RADIX; C := C * B2; end; G := R * RADIX; while C >= G do begin F := F / RADIX; C := C / B2; end; { Now balance } if (C + R) / F < 0.95 * S then begin G := 1.0 / F; Scale^[I] := Scale^[I] * F; Conv := False; for J := I_low to Ub do A^[I]^[J] := A^[I]^[J] * G; for J := Lb to I_igh do A^[J]^[I] := A^[J]^[I] * F; end; end; end; until Conv; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/uanova2.pas0000664000175000017500000000720711326434464021224 0ustar michaelmichael{ ****************************************************************** Two-way analysis of variance ****************************************************************** } unit uanova2; interface uses utypes; procedure AnOVa2(NA, NB, Nobs : Integer; M, S : PMatrix; V, F : PVector; DoF : PIntVector); { ------------------------------------------------------------------ Input parameters : NA = number of modalities for factor A NB = number of modalities for factor B Nobs = number of observations for each sample M = matrix of means (factor A as lines, factor B as columns) S = matrix of standard deviations Output parameters: V = variances (factor A, factor B, interaction, residual) F = variance ratios (factor A, factor B, interaction) DoF = degrees of freedom (factor A, factor B, interaction, residual) ------------------------------------------------------------------ } implementation procedure AnOVa2(NA, NB, Nobs : Integer; M, S : PMatrix; V, F : PVector; DoF : PIntVector); var I, J, P : Integer; Xbar : Float; { Global mean } D : Float; { Difference of means } Sum : Float; { Intermediate sum } ML, MC : PVector; { Line and columns means } SS : PVector; { Sum of squares } begin if (NA < 2) or (NB < 2) or (Nobs < 1) then begin SetErrCode(MatErrDim); Exit end; DimVector(ML, NA); DimVector(MC, NB); DimVector(SS, 3); SetErrCode(MatOk); { Line means } for I := 1 to NA do begin Sum := 0.0; for J := 1 to NB do Sum := Sum + M^[I]^[J]; ML^[I] := Sum / NB; end; { Column means } for J := 1 to NB do begin Sum := 0.0; for I := 1 to NA do Sum := Sum + M^[I]^[J]; MC^[J] := Sum / NA; end; { Global mean } Sum := 0.0; for I := 1 to NA do Sum := Sum + ML^[I]; Xbar := Sum / NA; { Residual variance } if Nobs = 1 then V^[4] := 0.0 else begin Sum := 0.0; for I := 1 to NA do for J := 1 to NB do Sum := Sum + Sqr(S^[I]^[J]); P := NA * NB; DoF^[4] := P * (Nobs - 1); V^[4] := Sum / P; end; { Factorial sum of squares } Sum := 0.0; for I := 1 to NA do for J := 1 to NB do begin D := M^[I]^[J] - Xbar; Sum := Sum + Sqr(D) end; SS^[0] := Nobs * Sum; { Factorial variance (factor A) } Sum := 0.0; for I := 1 to NA do begin D := ML^[I] - Xbar; Sum := Sum + Sqr(D) end; SS^[1] := NB * Nobs * Sum; DoF^[1] := NA - 1; V^[1] := SS^[1] / DoF^[1]; { Factorial variance (factor B) } Sum := 0.0; for J := 1 to NB do begin D := MC^[J] - Xbar; Sum := Sum + Sqr(D) end; SS^[2] := NA * Nobs * Sum; DoF^[2] := NB - 1; V^[2] := SS^[2] / DoF^[2]; { Factorial variance (interaction) } SS^[3] := SS^[0] - SS^[1] - SS^[2]; DoF^[3] := DoF^[1] * DoF^[2]; V^[3] := SS^[3] / DoF^[3]; { Variance ratios } if Nobs = 1 then begin F^[1] := V^[1] / V^[3]; F^[2] := V^[2] / V^[3] end else begin F^[1] := V^[1] / V^[4]; F^[2] := V^[2] / V^[4]; F^[3] := V^[3] / V^[4]; end; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/uanova1.pas0000664000175000017500000000403711326434464021221 0ustar michaelmichael{ ****************************************************************** One-way analysis of variance ****************************************************************** } unit uanova1; interface uses utypes; procedure AnOVa1(Ns : Integer; N : PIntVector; M, S : PVector; var V_f, V_r, F : Float; var DoF_f, DoF_r : Integer); { ------------------------------------------------------------------ Input parameters : Ns = number of samples N = samples sizes M = samples means S = samples SD's (computed with StDev) Output parameters: V_f, V_r = variances (factorial, residual) F = ratio Vf / Vr DoF_f, DoF_r = degrees of freedom ------------------------------------------------------------------ } implementation procedure AnOVa1(Ns : Integer; N : PIntVector; M, S : PVector; var V_f, V_r, F : Float; var DoF_f, DoF_r : Integer); var I, Nt : Integer; Xbar : Float; { Global mean } SSf, SSr : Float; { Sum of squares } D : Float; { Difference of means } begin if Ns < 2 then begin SetErrCode(MatErrDim); Exit end; Nt := 0; for I := 1 to Ns do Nt := Nt + N^[I]; if Nt <= Ns then begin SetErrCode(MatErrDim); Exit; end; SetErrCode(MatOk); Xbar := 0.0; for I := 1 to Ns do Xbar := Xbar + N^[I] * M^[I]; Xbar := Xbar / Nt; SSf := 0.0; SSr := 0.0; for I := 1 to Ns do begin D := M^[I] - Xbar; SSf := SSf + N^[I] * Sqr(D); SSr := SSr + (N^[I] - 1) * Sqr(S^[I]); end; DoF_f := Ns - 1; DoF_r := Nt - Ns; V_f := SSf / DoF_f; V_r := SSr / DoF_r; F := V_f / V_r; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/types.inc0000664000175000017500000002207311050303534020764 0ustar michaelmichael{ ------------------------------------------------------------------ Floating point type (Default = Double) ------------------------------------------------------------------ } {$IFDEF SINGLEREAL} type Float = Single; {$ELSE} {$IFDEF EXTENDEDREAL} type Float = Extended; {$ELSE} {$DEFINE DOUBLEREAL} type Float = Double; {$ENDIF} {$ENDIF} { ------------------------------------------------------------------ Mathematical constants ------------------------------------------------------------------ } const Pi = 3.14159265358979323846; { Pi } Ln2 = 0.69314718055994530942; { Ln(2) } Ln10 = 2.30258509299404568402; { Ln(10) } LnPi = 1.14472988584940017414; { Ln(Pi) } InvLn2 = 1.44269504088896340736; { 1/Ln(2) } InvLn10 = 0.43429448190325182765; { 1/Ln(10) } TwoPi = 6.28318530717958647693; { 2*Pi } PiDiv2 = 1.57079632679489661923; { Pi/2 } SqrtPi = 1.77245385090551602730; { Sqrt(Pi) } Sqrt2Pi = 2.50662827463100050242; { Sqrt(2*Pi) } InvSqrt2Pi = 0.39894228040143267794; { 1/Sqrt(2*Pi) } LnSqrt2Pi = 0.91893853320467274178; { Ln(Sqrt(2*Pi)) } Ln2PiDiv2 = 0.91893853320467274178; { Ln(2*Pi)/2 } Sqrt2 = 1.41421356237309504880; { Sqrt(2) } Sqrt2Div2 = 0.70710678118654752440; { Sqrt(2)/2 } Gold = 1.61803398874989484821; { Golden Mean = (1 + Sqrt(5))/2 } CGold = 0.38196601125010515179; { 2 - GOLD } { ------------------------------------------------------------------ Machine-dependent constants ------------------------------------------------------------------ } {$IFDEF SINGLEREAL} const MachEp = 1.192093E-7; { Floating point precision: 2^(-23) } MaxNum = 3.402823E+38; { Max. floating point number: 2^128 } MinNum = 1.175495E-38; { Min. floating point number: 2^(-126) } MaxLog = 88.72283; { Max. argument for Exp = Ln(MaxNum) } MinLog = -87.33655; { Min. argument for Exp = Ln(MinNum) } MaxFac = 33; { Max. argument for Factorial } MaxGam = 34.648; { Max. argument for Gamma } MaxLgm = 1.0383E+36; { Max. argument for LnGamma } {$ENDIF} {$IFDEF DOUBLEREAL} const MachEp = 2.220446049250313E-16; { 2^(-52) } MaxNum = 1.797693134862315E+308; { 2^1024 } MinNum = 2.225073858507202E-308; { 2^(-1022) } MaxLog = 709.7827128933840; MinLog = -708.3964185322641; MaxFac = 170; MaxGam = 171.624376956302; MaxLgm = 2.556348E+305; {$ENDIF} {$IFDEF EXTENDEDREAL} const MachEp = 1.08420217248550444E-19; { 2^(-63) } MaxNum = 5.9486574767861588254E+4931; { 2^16383 } MinNum = 6.7242062862241870125E-4932; { 2^(-16381) } MaxLog = 11355.830259113584004; MinLog = -11354.443964752464114; MaxFac = 1754; MaxGam = 1755.455; MaxLgm = 1.04848146839019521E+4928; {$ENDIF} { ------------------------------------------------------------------ Error codes for mathematical functions ------------------------------------------------------------------ } const FOk = 0; { No error } FDomain = - 1; { Argument domain error } FSing = - 2; { Function singularity } FOverflow = - 3; { Overflow range error } FUnderflow = - 4; { Underflow range error } FTLoss = - 5; { Total loss of precision } FPLoss = - 6; { Partial loss of precision } { ------------------------------------------------------------------ Error codes for matrix computations ------------------------------------------------------------------ } const MatOk = 0; { No error } MatNonConv = -1; { Non-convergence } MatSing = -2; { Quasi-singular matrix } MatErrDim = -3; { Non-compatible dimensions } MatNotPD = -4; { Matrix not positive definite } { ------------------------------------------------------------------ Error codes for optimization and nonlinear equations ------------------------------------------------------------------ } const OptOk = 0; { No error } OptNonConv = -1; { Non-convergence } OptSing = -2; { Quasi-singular hessian matrix } OptBigLambda = -5; { Too high Marquardt parameter } { ------------------------------------------------------------------ Error codes for nonlinear regression ------------------------------------------------------------------ } const NLMaxPar = -6; { Max. number of parameters exceeded } { ------------------------------------------------------------------ Complex numbers ------------------------------------------------------------------ } type Complex = record X, Y : Float; end; { ------------------------------------------------------------------ Vectors and matrices. ------------------------------------------------------------------ } const { Maximal array size } {$IFDEF _16BIT} MaxSize = 65536; { 64 kilobytes : 2^16 } {$ELSE} MaxSize = 2147483648; { 2 gigabytes : 2^31 } {$ENDIF} FltSize = SizeOf(Float); CompSize = SizeOf(Complex); IntSize = SizeOf(Integer); BoolSize = SizeOf(Boolean); StrSize = SizeOf(String); PtrSize = SizeOf(Pointer); MAX_FLT = Trunc(MaxSize / FltSize) - 2; MAX_COMP = Trunc(MaxSize / CompSize) - 2; MAX_INT = Trunc(MaxSize / IntSize) - 2; MAX_BOOL = Trunc(MaxSize / BoolSize) - 2; MAX_STR = Trunc(MaxSize / StrSize) - 2; MAX_VEC = Trunc(MaxSize / PtrSize) - 2; type TVector = array[0..MAX_FLT] of Float; TIntVector = array[0..MAX_INT] of Integer; TCompVector = array[0..MAX_COMP] of Complex; TBoolVector = array[0..MAX_BOOL] of Boolean; TStrVector = array[0..MAX_STR] of String; PVector = ^TVector; PIntVector = ^TIntVector; PBoolVector = ^TBoolVector; PCompVector = ^TCompVector; PStrVector = ^TStrVector; type XTMatrix = array[0..MAX_VEC] of PVector; TIntMatrix = array[0..MAX_VEC] of PIntVector; TBoolMatrix = array[0..MAX_VEC] of PBoolVector; TCompMatrix = array[0..MAX_VEC] of PCompVector; TStrMatrix = array[0..MAX_VEC] of PStrVector; PMatrix = ^XTMatrix; PIntMatrix = ^TIntMatrix; PBoolMatrix = ^TBoolMatrix; PCompMatrix = ^TCompMatrix; PStrMatrix = ^TStrMatrix; { ------------------------------------------------------------------ Functional types ------------------------------------------------------------------ } { Function of one variable } type TFunc = function(X : Float) : Float; { Function of several variables } type TFuncNVar = function(X : PVector) : Float; { Nonlinear equation system } type TEquations = procedure(X, F : PVector); { Differential equation system } type TDiffEqs = procedure(X : Float; Y, Yp : PVector); { Jacobian } type TJacobian = procedure(X : PVector; D : PMatrix); { Gradient } type TGradient = procedure(X, G : PVector); { Hessian and Gradient } type THessGrad = procedure(X, G : PVector; H : PMatrix); { ------------------------------------------------------------------ Random number generators ------------------------------------------------------------------ } type RNG_Type = (RNG_MWC, { Multiply-With-Carry } RNG_MT, { Mersenne Twister } RNG_UVAG); { Universal Virtual Array Generator } { ------------------------------------------------------------------ Statistics ------------------------------------------------------------------ } type StatClass = record { Statistical class } Inf : Float; { Lower bound } Sup : Float; { Upper bound } N : Integer; { Number of values } F : Float; { Frequency } D : Float; { Density } end; const MAX_CLS = 1000; { Max. number of statistical classes } type TStatClassVector = array[0..MAX_CLS] of StatClass; PStatClassVector = ^TStatClassVector; { ------------------------------------------------------------------ Curve fit ------------------------------------------------------------------ } type TRegTest = record { Test of regression } Vr : Float; { Residual variance } R2 : Float; { Coefficient of determination } R2a : Float; { Adjusted coeff. of determination } F : Float; { Variance ratio (explained/residual) } Nu1, Nu2 : Integer; { Degrees of freedom } end; { Optimization algorithms for nonlinear regression } type TOptAlgo = ( NL_MARQ, { Marquardt algorithm } NL_SIMP, { Simplex algorithm } NL_BFGS, { BFGS algorithm } NL_SA, { Simulated annealing } NL_GA); { Genetic algorithm } { Regression function } type TRegFunc = function(X : Float; B : PVector) : Float; { Procedure to compute the derivatives of the regression function with respect to the regression parameters } type TDerivProc = procedure(X, Y : Float; B, D : PVector); { ------------------------------------------------------------------ Graphics ------------------------------------------------------------------ } type Str30 = String[30]; TScale = (LinScale, LogScale); TGrid = (NoGrid, HorizGrid, VertiGrid, BothGrid); mricron-0.20120505.1~dfsg.1.orig/fpmath/tpmath.txt0000664000175000017500000000517611326434464021205 0ustar michaelmichael****************************************************************************** * * * TPMATH * * * * MATHEMATICAL LIBRARY FOR PASCAL COMPILERS * * * * Version 0.50 (December 2007) * * * ****************************************************************************** AUTHOR : Dr Jean DEBORD Laboratoire de Pharmacologie, Faculte de Medecine 2 Rue du Docteur Marcland, 87025 Limoges (France) debord.jean@orange.fr jean.debord@unilim.fr ****************************************************************************** This library is distributed under the terms of the GNU Lesser General Public License (LGPL). See file LGPL.TXT for details. ****************************************************************************** INTRODUCTION ============ TPMath is a mathematical library for Pascal compilers. It is entirely written in Pascal and does not depend on external libraries. TPMath provides routines and demo programs for numerical analysis, including mathematical functions, probabilities, matrices, optimization, linear and nonlinear equations, integration, Fast Fourier Transform, random numbers, statistics and graphics. CONTENTS ======== Main directory -------------- TPMATH.TXT : This file LGPL.TXT : License TPMATH.PDF : Documentation of TPMath in PDF format DLL directory ------------- Source files of the library. UNITS directory --------------- Source files of individual units. DEMO directory -------------- Source of demo programs. SYSTEM REQUIREMENTS =================== * PC computer with Windows or Linux * Delphi (32 bits) or Free Pascal. * Should also work (with some restrictions) with Turbo Pascal, Delphi 16 bits or GNU Pascal INSTALLATION AND COMPILATION ============================ See the instructions in file TPMATH.PDF (chapter 1) WEB LINKS ========= TPMath web page: http://www.unilim.fr/pages_perso/jean.debord/tpmath/tpmath.htm SourceForge project page: http://sourceforge.net/projects/tpmath/ Mailing list: http://groups.yahoo.com/group/tpmathlib/ mricron-0.20120505.1~dfsg.1.orig/fpmath/tpmath.pdf0000664000175000017500000150057710730736712021144 0ustar michaelmichael%PDF-1.2 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream xкMŽ1oФ …їќ FŠk;`­ЎNЊt[еЫqъIISq]њя ЄCхС~жїќLk‘р‘Ск ,qb^‡Ї8<ОŒ0M,тЕЃёђ&ущ5}ЈїxЌ€џhBОz4ш:нY=Z”Ыэ\”%™ЪЯОИneNщ>ЋкгВы.ЖѕыЖфrџ ‚ ŒfjA„иЁэh{Ь1ЇЯjцIђYivr+—f­_y№ьEН &pЇyЮЋЊаŽціGэdк`%#Кfžу№ |ЊEбendstream endobj 4 0 obj 209 endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 595.273 841.887] /Parent 8 0 R >> endobj 1 0 obj << /Font << /F17 5 0 R /F18 6 0 R /F19 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 11 0 obj << /Length 12 0 R /Filter /FlateDecode >> stream xк3T0BCcCS=CSKS=SS…ф\.Ї.}7 ˆЁЁžЅЉЉBHXaHJД†‘flˆ—kf‡ jendstream endobj 12 0 obj 62 endobj 10 0 obj << /Type /Page /Contents 11 0 R /Resources 9 0 R /MediaBox [0 0 595.273 841.887] /Parent 8 0 R >> endobj 9 0 obj << /Font << /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 15 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream xкн˜Moг@†я§>n$lіћуJiЈ Aзй&Ж7rкђы™ѕкЉSм*дЦUvуЭЈЯЬь;яšD>$в$1’F’вD2eхЩ›љЩыsЪ"ЪЅU4ПjWЮ?аЉЋf ЃЦТ… f3ћ9џKyD ˆai,UЂk@fБСНЏ6MZi“C€˜)‚вjсoЪ\ЙЮћ'DJЬ a‰„%*ТD1p•!vб ЦТЯЈBMэf1•hБЭB4ЮJfБ€“НІIHˆЯь=эшПUы4ѓ ј•WKH*ЈYYЃPZУVљoПОд‚L”uЄЇУ^ёœлjak+бїМZ8yНЪsњќ@кD№(?ш"oЛz{ }lеzN<чЎY.ык-ыД„XœйуR—|ˆы:oV{dDЦ—yюƒОљЂ*Т'fИЇЭqЏЂT'г–‹…ўД-mg^“9TЦfљІхЃиpƒ;L’щN’ятAтёЇJТL%isК“пЙпЅЗkHU+АžїМp)”п2љљг&€&€=œПE ЪE‘ьН€ЭџtШНИ5УlјQ„щKlе%ЂћС‚ЌђЪЦ ыё5В0Ь‚3ыЅалРЪАŽ`EФqЗњЗЖtїF•a“­Ÿ8p А0Ю [v6?­oУ\ИкV­Е†тУБFD6иn.œюї€тxђЛc˜d5вPl7*Юъкuюn Ђѕы:U\=Ђ l7>цеЋ ŽezЌR8іПН z‘VKPЃІРз—ѓNќ—еsЫи%ТŒ&Ђџ/Ю-ЛУч@%ФDZћЦ~\ИeZƒб/7џtrіЎВAжђД№k89j.еq}ілаљќК}EP‡ЛWD=бЖЅx]яŒЋ&ЈЮ—ЎrЅmКгЪо”3RL€Ћз]гqНыэg}:ГhrˆІŽн™З dД€ћЎ1hО[9ŸjЗX*&э>БwP’tю›Ж+cїв!ЫЖušнЖVBLЃ~оyPм6ƒw)›юш`A]Й>Ъ.-)˜f“h­;г ONЮц'в=ОЏendstream endobj 16 0 obj 834 endobj 14 0 obj << /Type /Page /Contents 15 0 R /Resources 13 0 R /MediaBox [0 0 595.273 841.887] /Parent 8 0 R >> endobj 13 0 obj << /Font << /F23 5 0 R /F24 5 0 R /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 19 0 obj << /Length 20 0 R /Filter /FlateDecode >> stream xкнš]Oм8†яљsЗ‰ДIуogяКъR‰v†оДН3†ZЪыd*шЏЏлa&Щ Њjе1т‚  с<чич}Xdњ ,D)ЯШ‚e(…-жеЩщъфе9Ф вœХъІПuЕљс8Щ3-ятHЌeQъ+†Ѓ›mНюdSЗqс<‚(ўВzћъЧ–’/€SТ‰}b тdYЧDХКkTџTЬГ(’Н˜o<.-:›ћ9€.oŠЊ*tF!2j~ПLф0/cШЂІ|ИѕИdwa€ ФГ„иžŠnRGІЗLи‹—Ь2Ч|ІTЃЦај…BS}QT1фбЕю{,ЊћЃ5`Лe‡yшАЬСОUc |Їš[UT–`jeЉ•Ј=ЅKМFAš"ŽћЋz—ЊЙ.Ўe)ЛсшС‰6Вэ”МоКог*йѓФ тw*ыІВjЊГЛћPН…( ™lfхAиlЧ—mk€ІˆБp– Ÿ%ѕкЖьŠzSЈ•ЕКQ•­*!ч'@ЖQ›КЙІ6)€T+пƒЄвkжП_emЧС1Z?Cйl=НR-kБыFy…кчЅ„‡цuщьўЎзпІv і@'e9J:0KЧ'^rDУPpKtž4ŸŽ?Ѓf‰hppdњ.0cž VЈЎиВ>У;QыоКškбкг­ж=•В…ВзтПmс] Fш™GtpQW­ЌomŽП™> Ьi‚г.ћ7ѕEѕJŽŽ+ЉsS3<дЛт^VОБJБž,ь­ќо2mѕДd–жћЈП{@юe-MW—п ЇW9 д­Kл*ЗvIДж€šм.a'h§Ор†6s АnzоˆžМˆГВ99ŽŠa;ъh •ks5†4V‡jй->gзв ЂСuOœЈЃё;qљPUТXЕ‰m,dIоˆZ(kмXдj›ЋФ˜‰CђлТЗ3Y2ПтРс%ш“_ ŸиcрquBСюЛEЗзFˆ6ЄЖЫєЧў­АŸ67Ю;W>ЎѕН™†ШЯGšMƒtЛфYšwмМ{˜lˆŽЙшšп6ЅћСWg$џ2Џ–HdОв%_лцЖл)V?rлс{НуП~~X•YлВ“wЅ№x?8ЖœyiЮёгQсCQеХеŸіБжЙGН[~Щ9їrnоЕRњПжи† АvVъ“ЇœsїЏњ““ГеЩ}5ЗЪendstream endobj 20 0 obj 1067 endobj 18 0 obj << /Type /Page /Contents 19 0 R /Resources 17 0 R /MediaBox [0 0 595.273 841.887] /Parent 8 0 R >> endobj 17 0 obj << /Font << /F24 5 0 R /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 23 0 obj << /Length 24 0 R /Filter /FlateDecode >> stream xкнYЫrЃFнћ+ДKГ€щїc9NЌTRЩdЪж.Щ‚Hm› а рЩ(_Ÿ†ц)7‘šВа”ЋєРпгчžsOZAћƒVѓˆRЖD˜“е6ЛКо\Н[#ЖB(RŒ­6їЭЉ›нЏ€GіBŽјібЄКќѓ„sАг[“эƒK`ЪЄJL„’ !ƒ№MпЄB€врїЭЖъбˆ3>T/\ѕ7ЩƒЮ,РЇ€1ЇOКЌ`ю иН•‡,гU‘lнз,ЖŸ?Ё"ь Ь&‹Ё`љК‚эYКˆгЖњПžтBOK сbGЋЋNч;WvgH{†=ЌЗ•)Jї›WуБџСєnщЈiCJ#*Щ*ДЮ iŠДь+ШС:P<х[зЇDP%y’%џФю’R@•ЛъD HDŒЉ M"BіO ]Ÿu Qwн#8&oыvKR$ёЉ=BљY4r’aхaXDј4ЮR;F{ЮЦxэЙJ 3ccАСfЛBй~™‰*RрчIC4 ™šќЁўШКоL“šTХЩлc@~~†ъђ?шП+“‡ЗёўБьX#{4жЂ­[лWFЯFђx]]<щж>.jЁя*Зк]нЂЎ›SЕ(Ѕ02УmС\ЏЛтппM9hАЂ–&~@:Уkо%й>еŸСOzŒ`Еd`lo§diПADѓZRѓ§/АсФѕКf%­­Ї3уя ѓPФ™…Ь(НlШ^Ÿ'НЯGй‹&Ж„x!лгзЛўТ‡ї ŽєОПшЁХgжОѓљ_ЊG]Ћ‡JЖd…ˆЦfщbѓ“зн.3k;Єлˆ!$Аfйц›сѕТ%љsщбAzX‰E.Ѓzn4МкЭuRъоeФ40… “зћЭоЦЭ>ЏђЄ…Х‚{ŸCžkl—`FmёЁgЖЩ~“6Ѓ­S4 хЙЉAѓz6h‹цy…3lЯЎ S“pищќ›вЃЬљ"ECfSЄќJSd йЋД!EОrŽ1|f8№ќпH|ЎAGЎ!8~‹ъщ ‹rхc`S‰IЙЩ’8­s QŒЮNхзгЊЯ)k№у qШ.АЁ=+ълЋ~†м6Нр8gрОˆЛ[~”ђ ‡кQмйж­Іšма`пxђ˜{ІФХ ѕј–љж{ЫэЁJЖЊGДйН ‹`А7Џ*kPUђЉ~А =9[JВHЎјlœSЭўВюЯїљ6IгИhИнЗп%—#BюЅ}йAЬk йСвєЉПmУŽ‚yP}Ÿ Ђ<’лnU‘”Вгшђъfsѕ/мM@endstream endobj 24 0 obj 994 endobj 22 0 obj << /Type /Page /Contents 23 0 R /Resources 21 0 R /MediaBox [0 0 595.273 841.887] /Parent 8 0 R >> endobj 21 0 obj << /Font << /F15 7 0 R /F24 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 27 0 obj << /Length 28 0 R /Filter /FlateDecode >> stream xкнYKл6Оoџ„дA пуv-КE‘ЈэЁэAkбQ=RZ ўњ"ЕkЏeзE“X XВ(ЫѓЭ7ѓЭ аНаq™a)’ sВXе7пц7/–ˆ-Ъc‹|=мš—П•Б ')BH—яFAQѕEgк&I f ]ћ#E8иaЉЈТткЋp+% dIЪ ќфЉр"љ3џС™œ"–I!M'бєзm’bкnь|fіЛАZ}hккxыЅЂŸЫоџщХгVRJ3*Щ"Х2c$РDаa ќдзкšер{Ai‚AЇ7vdKP4Ѕ?a 4пhЋн-t&|…§w`жљˆcDWС„НР@"cLэ9С 9лп7‰ѓуЮb).шЧOOЪр‘ц™rМ<їїЧ ф‰D.|Pq џiMТЅG_iІцТУоЋЂпnгѕF7ЅрmћФ+њхMNЇyС!6якСЦї –.гћ`&SтЋLЇI#ћw1н=Gf ЦtЇ•Лџ‰‘FŒКnЃšлжХaэp1JЏ•P2%џЃјюЪ? ђПL‡ХЖ ъя>аіжh?їlбlз­­]Q” Кg ј€К+3„tШпXЛ–Ы<Ќw1„WКь­і]ЁPѓч*&‹Q@W†ЩеFЇ:WqРзЎЙmы ЎБE Џ}ќрЎ  ­ЃЛI@‰Ю=<Šоу“нH3шŸ{В{††сЩŒёkѓopУdіуЇVvWяХ“оЉЎ (<Ф8іГКёƒSа…uпЌbSФž%|  xо„iVЏЬбC\ђYт"ЧpбЙУMdЇ’RI)cRBz)щtZХ6тОА SH˜GХО{[˜&œоЗq˜Š+…­\њ)ЈfТц)Ё7fЧО*:]ЗMЃ‹*4MN‹чЏra4М^tЃ^мV›жšю­ЏЕ^(Њ§YJŒйз8K)|ЂдБН]= P„мџцЃљ.\мјJQt­ѕћќТpр!|I~‚H4+†& ‘S~љ5ANo=EЏаqХц‡'жВЅЉтЮйИmџЕЩ”—™PNуaзS›ƒрФ}_uІim=ю•fлYѓї )Л\Ъ“cІ‹ггЊн<™Яž›Щ –бр3{ 4Ж?’г9XЏb‹}ВЩс’ЯDVщ‘*Ÿљ?QG{ЩдМJx@‚(Я$ЧЎПV™”jРУ§ЪЭЫќц#Жь­endstream endobj 28 0 obj 1014 endobj 26 0 obj << /Type /Page /Contents 27 0 R /Resources 25 0 R /MediaBox [0 0 595.273 841.887] /Parent 8 0 R >> endobj 25 0 obj << /Font << /F15 7 0 R /F24 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 31 0 obj << /Length 32 0 R /Filter /FlateDecode >> stream xкнXIsœFНыWЬ-Pe0Нw'>Ф‹ьx’г’КТРTУ8жПw7M#fX\IД0.U 4BшН~я[С*1_`ХA,(\БХЂUЖ=ћq}іђ5Ф+`~CШj}н<ЙоќFЃрSжЊЊUV…$8Ё с_ы_^ОЄїg€Х„ˆUHЬиО!aD@ќ$ЋLЋ]­>‡вМв ъ͘1Фцй$Yш… ађ6ЧуH"O:’ЏЪэ.еЊ* ЫхЕНВ`+гТPФœEжP„4ЦGbB+'…ТXbП‘…•ВўЁrbжВЊныRЛTБ‘;у#xсo•OЗЛ\Zйy ФЩ,ќ7`wЉвrsЯXћqN™O)FѓE!Ѓ,фд~ЛsАв"Эя*еrpюЂСча€4ЖK‹ЌЋ?’œПП!~A"‚sѓ‰QёРР{‡№uƒКќoрƒlqœР$IC":0yЇšц>bk`МИ vСL#Ч‡$яeЉ­wœ’NИЧ‰gр2ˆф#|ŠF%]Йбi>Д›ЁAЈx\рpФh иэ}YD}К•ЕV™3›ЭOХЩВ+†c‰fЌ†НеоЅE]оЊКw.’\ЦF–%вИ {З]Њ<+­ЏОxП9&РSP gpьKЯНЏўnТ=.CЭ5Wu“rОHN И8ыкX— HА1?iuЕЏ•е‘qВhйШИltОZѕ9кjХбRјаaвшЃ>i\\URЛОёmD{SпЪRЫNNzL•sјP ‡‡оЕ–ЧІlѓ№@Jй“/›Ћ<ЬeлЖМяtyc*-‰/;‰}“ѓИЅ˜Зд`…і&бц#Qж‹'ћ€'{mG9{л8бо5X(m2[шLтЮob(aџ(Aє)}0yјЇ4ЃLŠAМƒЪ=.gH<{ЉwІK]ОB/šVЇ[;M˜Щв‡Љ/в§јG„KЩИˆДбі‡[Uм˜фs"с7У–Nn,№§№ёk_Lз$7ЫьLnіКщФžuря3ъцЭћ4WЭ:яю0ЅЖ•D,Нпw4gЦќŽ3€Э˜Дg~kriгЩКlФюГQю;“ЃЬ„1yJ|мЂн,4–Jй$xЪФ3hс8LcNЁёЁˆ9ч “FЅГŸзg_Ы’4”endstream endobj 32 0 obj 1055 endobj 30 0 obj << /Type /Page /Contents 31 0 R /Resources 29 0 R /MediaBox [0 0 595.273 841.887] /Parent 33 0 R >> endobj 29 0 obj << /Font << /F24 5 0 R /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 36 0 obj << /Length 37 0 R /Filter /FlateDecode >> stream xкн™Mo›@†яљсййŽmк*%ZK=T=`МБWтУХИjњы;ЫЖcpвK#lc„цйyї™58_рeAD„# hШœ4Пz?ЛКОЅмb!œйcsыlёнсљŒ3їn›е:г…J*М ™[ЉeЅ6]цЛp“ba?Ќ+]Єzdц+wг2_у'т–…*{№;C„ ў›Ћєrхб^иTјРФt5šАOШ%”ыb‰&Д-N0б†Щі5jэћaЏN Шl0Чд Ѓ7{}W'bŸŒ№kкљѕlЅЪъ УбД“ѕZоЃ G;+ПDqВSтdVœT^Жўm Q‚ѓ‹Э#?Ё[жщіtCEщT`ФАcВ^”Ц>ЪьЉ(smэE аІ‚ŽЁєMХПš$сџ/№g3ƒЯ"bЭж&ДѓУ}YьІ~ˆ) ё‘/эђ„наљ,'ьr}іхЅlЇУЎŒо•mwцп$UжšжFчцт6ыК5ЩІŒШ`Б5у/6дX2"сnP‹-ў€ЂŸlЁЕxєи}EЯиЙячu­s§ЇЭ˜ё,VeГн)ЯšУ}у> endobj 34 0 obj << /Font << /F24 5 0 R /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 40 0 obj << /Length 41 0 R /Filter /FlateDecode >> stream xкVKл6ОяЅСGˆ‘zQН5iv›-ір`iZ™Ж‰еУ Љ8л_Ÿe{m[0ЉyqјЭ‹b•ТOЌ”рu)WЅЬx^Џкўцнццэ­ЬV2ч•ЊV›]мl?Гї‡цшЕ]'YU1БўВљI^sЅЪ №qpОщКЦ›q ЉfитІ`эиMф€тлл,_‰ŠKQа I)ИЪƒСХ:Bц`oIцэ6RЖк‹:ш №М˜еeЩѓ, њk%™юрD zR1њВd›ћ?xCФ†h=P4ќ™ЖщˆrlкЕЌигК(XГ&*Ж-qя‘зИ(]Х{iыј:Щ3Х~YуФѓуf”DЮѓМўyгы7з‘4ШZДЦщ-‘Ч‘=>сщё6yД5к§MЏhѓЌX*^ЇœŸЂи5pАSYŒЎ?" шц)W"Rg 6кьѕ э ^ЏS2;Nо к-8—’—yоAŠUтzЗЗЭqбНИќЇ{AкД„R(^Vr•d9OЅ ’›CМЪ"Яј!иL„є€n7“DоыaтRIJ*Xз2гЄ5Qи`w2јUwр Qƒw`юv­ГZ_eS№ТVuЬ л_i‘ооП‡E@вШZАЧЩу&e&Ў}ƒfžщЃщмHЛГgЈ„ž}]C JйV;oMЈ/ԌØ`#Ф—ЊОЄћ‹М&Oн ”ђД†[бКСЋN–œ‰v]DyЊ,HПћѓг’@@И#АЮDЪ>zт˜x ]wn2Оyь4}эШЖb=šœ:o’…’ьša?…b—Њ‚и>}o†}РЂ`Ю ­&њб!ьJ…ЪDŠёŽ6ч”ьЖˆ|‰§sї;;і$л „ё ЮžёР›ѓCІP@T8!LyQbGУхrб#є[ИOє9tєu,TE‹ŠAЂaŒbwDЈЈм‘rЎќ84юеФmкV;ФЂЈCБШ"4]\NfЋ‰aсzšˆN\„—…І<ь‘V1їьМюCћmDзC/д_УПХ8aQЂБ3lIЪсŒХŸL›љЅ–CјiчF|нdС \Џ%6 ё(Яs­WЬрh тUЎц”‚fЦ(Щ_FDЇ)\R‹Оo S9y5B˜фt™Дژhš…‹CЩѓхq C!S"ЮkчѕЇ‡'ŒьЇЙЌЪу˜€Mc#иС|E§/S\ЋОyлД8IЁŠЩ ”=ZAи Х}ihЄ’gR\ЕЯœѓ/ќos\8TСы%›ЅБЭœ0АtXаУБвіŽœЁќЏш єBzэ! ‰ЉG2І2БeХд’‹BОˆ€(зтcdЏЉ[cuыG(6xаМškяА0ЁkЙЩ†]з#tum#RФ9Dс‹iј„ўц-<Ў&ЬшЄЮ'I=”B:Bџƒ+Р+Г#ЯxЭq"ؘ…X,%нёi–C‘g<-чwF| 5лэ‹чŒуеђE$!wъљЙl%—iykmг|СžЌ9@ЅgЏ“BH4kўпЩ%ŠŒWЕКœ(xЬ…Lq‰УЯє Љ‘uѓasѓуК Ÿendstream endobj 41 0 obj 1236 endobj 39 0 obj << /Type /Page /Contents 40 0 R /Resources 38 0 R /MediaBox [0 0 595.273 841.887] /Parent 33 0 R >> endobj 38 0 obj << /Font << /F23 5 0 R /F34 5 0 R /F15 7 0 R /F30 42 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 46 0 obj << /Length 47 0 R /Filter /FlateDecode >> stream xкеWKoу6ОчвПрЃ ФŒј&їЖЭ6ŠДXtіає ШrЌж–=ъѕПя Iй–Mя.z+Ф| Щy|ѓЭˆЮRјЃ3Ъ81Љœщ”Іј,пн}ПМ{xтbF5aTЮ–k'К\§‘PТч J™Hы]SnГОЌЋљ‚kš еЊhq(’пЫjUЯ9KінќЯхOOp ЅФЪpз‚ИXИ—›bОR$ЛКы§Ј+wЭ6ЌючL'ў;ј…ОЦ_ž “ЩђуЯYПё›e7Ъ’сЊ2\ŸЁn“ЕХЪЗхk›ЕeсєE Љ B(ЇсK*гЯЯ№CЩ|Сё!Цd’g•_z…“8ЩЊЎТh_Ђj8њPl›MщЧuы=}|$ўžЇЙaЧх>\/’fhщЄюŠ{™єsxЧyЅі2оЦВz‹ЈохmйєpG/ЖTђVўƒ—•Ÿ–•пя!.Zќйю#Џ)I(3гзšfИXJSbœb)hR_KvЏ@ШЕ[.Ою7]<ЙїўD’nЉЈBЂ§w…h}Ыщ’FІ~ЈЯщбт:Њ–"ЦœУˆxз1’)Ї<жM(—Œъ&њ„zœL‚Хr":с Fе‰ЪБJaт6) ЩЙЕЩ‰иЩД!ZyЁ\И–`пс№гЁы‹]ФHЫг#чћ Г )Ф о„Э jяњ‡ы<дžЬФ}Ч’““^ЩЛт\ќф˜ъdП)к№N`YРЏ&Rк ŽC Х@(•tpо= $є#_ЊуqSЗ~п)k™3ьр'чJ€Ь~SцшŒп-У5HџјыuO ŠЌЭёТMЄ_hg 4эЁQ"кшаŠoшŸA+ŸПкО‡HЄPь6V™ђБю]c  ХSvY‘ЛMŒ%8QG@ec ъќш^|ѓи#тФ9 wщ"Sˆ—Б˜;СЁ uB*ZC'nt\;Р“УgH­Thqg,ы8іхGОтљъщc‡ЂcŸЪЯjNFИЦ М!R TгеGЦѕчZ;1OA]ŒƒД…‚?ц4А€Hm CЫ\іщSісвmѕ(єŠбH9˜Ÿ8ѕSЁ=RЁя},;iRПŽ ƒ~ЬА‰зt}­РмRў_9ZOљ ы?ƒ%Ъ_XGbm‰œD*JdЁaŸіˆјНqСЯ(T„&,ЮЯF‚Њc,†Ў}€ч#6 ыђJЩ\’б њПfdєгШШюKhќTrŒьЭ/83ї—кхЈH“wѓ…RтF—­№ЋШqф€s1№ЇЇTѓлŽМ hјоkџіЏ†ХсГЯ;`X7­ЋэСЪЕ?љщ7мџё=†зotС1ШОbъ™Въz I$З0XUŽŸmƒOŒ!рзLc|Ep§ЮнЫЛЭИ9гendstream endobj 47 0 obj 1399 endobj 45 0 obj << /Type /Page /Contents 46 0 R /Resources 44 0 R /MediaBox [0 0 595.273 841.887] /Parent 33 0 R >> endobj 44 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F35 43 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 50 0 obj << /Length 51 0 R /Filter /FlateDecode >> stream xкVKoм6ОћWшРZФbD‘Љі;\ iлSSдВФнЊ•Ђ”дџ>3jЖв…Qф<О™љ† §v(їЋПжПНЛ%ЌЈ +Щr–щ5>рёLЧ§PлE=Оѓxr–ў;K+mѓ4”У3}4НKzƒ7ЄЃЌы l”ДMg!wФЙ;™dyjР'ЭDЁНO`и­ХE<іхИћu!ŠDГTс˜ёЧЪ‘<9КћД‚пБн6]зt[Zѓ0o ~3ДсБI™ЬaГ!зŸW™‰ћ‰іkм.Рђ'аsи5•;aА№ЙуЫёорG^сOЃ'%Ÿњ№MДwqЅЮтћЯЗ7$љxQ8цPBб4Ž+_MЖІ/ЬьХ™;лB`$я{j~}IUк|О5 V ќф’I™{?“5i{•, оѓPъ ˜Ž’Ю2‹mчІС’<ю|Жeъ|m™ЇŠхF]нhЗPо &5ув„mу “} Њ!лкYђдŒ b6<^я‚Ёvyтv§джОŽ Š2ШОˆќщЈ85gˆуeLЄsЏС’+ї––М^FИ}ђИn6ЯД5œб˜юY{ї%хr; 3CЄyŒ+mаоlшнй*™+џЬUыдІ€p/й(+„œ”џˆ“BXZЬЌФs„‘–УP”:Q”1GŠ2ЁѕрM­gЁбgС>œ-iсhп˜“}џЧMfоюшН^™,žЪ\OkŸq_щЊВЅ“§Арм1ШœЅž"ј/^Pї%UФЫVЁ8:3)дɘ KЬхршуё=ь‡*ќм” р^ыЎI.Лšt<šдшk’}у$иЃё‰Rч/И[ЈЫ.‡Рše56_W HnД5Ц Tќ{ї‚Zс=йіГу'ќ_0H$QФ›ћЗФ‡Щ›Oo—шЪOхŠб™,ygБЬ;d'>3юй‡йЂЮЋы+ @%ф1eE –uЗq9OЇз№I˜ЄYpйcЗйјяИ€Ё†ћFЎЯZLрЅjё†­вЙ„(є…–•Ащ˜“‰шЃn[Н2 ~уYКБЄotBђwMŽУrEl уё‰Ђ$ x[фIšs€;w/шэVЖ†ЙрŽS9т к@‰()г@\ž|јЬmпсд,—endstream endobj 51 0 obj 1264 endobj 49 0 obj << /Type /Page /Contents 50 0 R /Resources 48 0 R /MediaBox [0 0 595.273 841.887] /Parent 33 0 R >> endobj 48 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 54 0 obj << /Length 55 0 R /Filter /FlateDecode >> stream xк3T0BCcC#=##cKS=SS…ф\.Ї.}7CSCC=KSS…4АЪ”h C#Эи/.з.}л Щendstream endobj 55 0 obj 65 endobj 53 0 obj << /Type /Page /Contents 54 0 R /Resources 52 0 R /MediaBox [0 0 595.273 841.887] /Parent 33 0 R >> endobj 52 0 obj << /Font << /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 58 0 obj << /Length 59 0 R /Filter /FlateDecode >> stream xк…Vнoл6Я_сGЈX~‹к[Л8C†ЎVАюAЖ›€,’œ4џ}яx”m%"<їM1󹉙ЌДrfEЩJ!fы§ЭчхЭЧ;ЉfRГТГхCф\nўЫ~нU‡Сwѓ\E&чџ/‡м(І­‰ _{п…52иьаљuшCл уЧ;afю2†$цІ`Ѕvёиrz8#eЖžЫ";н"Eцъ*4i{зЮЅЫžˆZbщ§vžVіLсжUM+g,‘|hЛGжэўpЬG•„fZлˆm1-нoВа ОGќЕѕchЖДмyКЧfqџИG”ЋyпѕŒєWz& &ХЈП•LяLЬs!ЄО4 zЯ€JБ‚—dРПў•чЙeVе5YЉ'њ‰іˆ„‹6Уёи{кvOгя\˜ДE­Д(В(z’ЮC:ѓgкё}Rь—tŠёRЄ€љТjО†™А‰ы;7\чЋ(z№tšєCtZ˜q^LМR­м]ЏUfiшУЖ  ‡^W Њv7a†ЎЎ@ЊdFИцЖ=Ўо‚ЬO\й]@Ц[2L‹W№„СQ^ЧЇ_тMgFй‰ЪВWАkІјjёc№ЭЦoЎ€‡ЂИ/8Ђw =DюˆІє@ Ga>EcЗЯшЁз%sР+СT1f8ње”)СлАNtћ@cEУ6<"*пy7›сЫ3ЌИЕi›$‚єHЋё5УЃXГ;д1“iЁоЃшЄh§Ыгц­Ц”|Лџњл—Хп‹O_Ўии Ѓ2йјZ L=†йŸџ|~[’aZŽ9єЖпG.ў].Оо.nпV(ц œor‘фšY(кфЃђь#щ,g,`mƒššЬŒй-Б'›CмХ=41މ3hќ}еЄн:4ТL–jPtгШћZIХ-SjДX~-Ў…a,$KШСвщу>)Ћ С-d y’:е–Н—M›ѕZЩyn„„BмnйЁъ‰Ъ7ƒч†—cь :Щ],јЇДƒ2Џ•ЩЈћXl'qL]ШfїЗ‹ •VOtЙЂ P7иј„{э'\ŒЦ“WbRsМЃЁуCtdЊсзЌP QХЛѕз‚OЁNїЇЖGDuкд‡ыg\‚рђЕ_~3ъ ]Ќtгт~Ÿ = „оyhйў…Е6ўЁ:жCbКдŠ„ |Q‡Ђ ЃjZ”JumвдІWo|КdУ" XвfЋѓЁ"kќкї}е='Dэј: ђуOкай:Ќ:dv*e%Ÿ@§Tї-fJ5PKcА•Б•#ёњЮlМW№š ­$NщgААї`ЄžXb}-b}E’Э+ЦЇХИяЊ= | АLнщuavm|QpEЫXz9vХ№^ы=зg‘š‹ьЉ Уk=№‡†œ\ƒ‹uеlеж•’:ЗVcУhВЛЙ“PCW5ч:}ТЌ§БKГaWЁ?O.С%z^Ђ•qAŒp{тлUщљчFiItL- “Ѓ7t8Z,]хiЉЏіi–^ŠёЕїђщщ—"й9Џ"Hh­ŽтC(мКY,o~ \ђendstream endobj 59 0 obj 1210 endobj 57 0 obj << /Type /Page /Contents 58 0 R /Resources 56 0 R /MediaBox [0 0 595.273 841.887] /Parent 60 0 R >> endobj 56 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F34 5 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 63 0 obj << /Length 64 0 R /Filter /FlateDecode >> stream xк­VЩnл0НЛ?Ё#XŒИ‰R‚^вЦ@ Z4=(c •ECЂГєы;\ь: \Œ‘ЙЭђоМ!I’УIeИЬE"s†iС’Хzr9ŸœЭOˆФ”ˆdўрЖЮ›_ˆbšf„PŽц)#шe“f№Q№_ 4ыtmвпѓog38EЎD8œБЫЪY˜пЌkГ‚%EКЫ яеш‡Е§dR*eј(oŽšя˜"DtЬ)˜бнІ=xлƒЊ;яЌЗ^Жы”–ш\•H #NГ"'шкј- = jєшО Q‹Љ,qYVСнmл/; ЊР!aз4b<LЋ$#s.мОЏz{ЕЦs\ЌA†‘А8fЙ ;ЎžъеФ,UŽш]\ЃЊ™ј!Є _ЬЪВ ˆ,єzгvЕiuяWєЦўС~’•–R&€Ю%ёАшЉEšYЂЉdh3шхPЏэ€ЂЇUЛА”ЌќкvДUA%”йЙЧTTm pŒ~j\щmзјпїОb–mяЧO­ ЦFНVfхRБУЎ§ciWчФ Z№3‰A.j‰M‰P“j Зf6Ƙ/|Ц‘ѕЧz8vєGš ТбЙџИ*Оё /s%C“L0,*DШŽ‹№ авЉчd8KЁ”*€лE8у{aШЂУ8ѕ”зQ5ZШBщwЮ!Нf_+мymGяbзšP„aњAwЖЄ=1жи 3€ч8ѓВQ]Ж }іˆЪ–їQvІ~зЯ#,EйuE)„~Uфх y №Ж§ы˜уH?xMЪшžдёУ~jѕHyŽF0dUС КЫEюTгїkЃF˜$0Х*чШ.™нбІ§Єхˆ7aщЁбЯеCиОl~^y№Ії&aTшdk hІюэQe."СlЫ€жAiшюЦє„‚`"к{Є2%ДdўіšH2Yс\МfЮШiќ( ъщК?QB`H-еqфoK­ЛгxВ–№v,Ѕ[3œЦВХrЬЯЭЉќмшРbR%9’$уЅыW^Ћ"hѕ{НАк„›DeВ ЅVє fŸ-NНЛ*g Њ<.^сVЛзаwџ‚^wјВJм]Дџ{пў2~/%їсК ­ евY'м.MЎц“Є“}Њendstream endobj 64 0 obj 880 endobj 62 0 obj << /Type /Page /Contents 63 0 R /Resources 61 0 R /MediaBox [0 0 595.273 841.887] /Parent 60 0 R >> endobj 61 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 67 0 obj << /Length 68 0 R /Filter /FlateDecode >> stream xкЭXMoу6НЇBG­X‘"Ei‹^КЛ)Zd‹Э!@ЗЦІmЁВфJrжо_п!‡Д%GvМ В Ф29тЬМљztžСh )' ’ŒЩX“$Я‚Fѓ+Ф№G Тѓ<1'2Ю‚щъъЇлЋяЏЉ(%ЙСэмŠоЮў пжUлЉjТВА›D4Žу№ƒVUQ-&нўzѕўі*$—YСaЩYНqл8пkLЦ4~PгхћЕ9§Ш$‘As'uЛд“(a2lWЊ,uл™oiиhUт˜,УЭЪќПŸD№_7ИбnІfq‰ЏwKe_сЧXФЈu`Эc"9uj)‰'‘ Iј­љЇ• D!qoСб•/U‹ЪМD,хDЄм"УyjЅgХ7КбжўНWыFЗnIuE]L.*яˆFсiНZo:яэJЏъfч Цп wР•Ќё@{сtЎ”‰љwтЮCЁ?Kє 7.9Њн4NЖžYчТЂ›bŠ рйДhKmљД,БЯT5b„…аž4ќTtЫGЈ,Šуvыc*j@виТВЖ'ж…OtѓJgNнсŽ&в=#Б|"н!c)дтщО§ вєвt_‹хЙlЯй.O@˜ZЉьa/ПєŒМXiе—јZжЦЬ5tYњ@ЕEчŠЫ qЊюЯ#!ч|%$діІ^МXдяp^Л.p№}ЌСAЋ^хћэкt•;л1›yщ~™ŽCщњPЏ(ыѓРЦѕСЦЕБ•hуќlš Ÿчбf9aљ“iї%`ЅСЄв eГ.ѕЁЃ_0qю№Œ‹ЂСxBђ„_ /§ЌhlЊйз ƒк^CЋўO9_ИŠ\xL˜Т™њВо7ќЙšvuSјЖ0>;<*Ѓuž\RчтIŸV/знGRЊ‚ AљJ!ѓM5эŽчЌИ e^2!nџ#8eНP TТj$.Н|к#™<3RŸ^Ф"D)№t)ђ€JТшCFR х”ё№0=а-9PЊzбŒf‰KJX&њШfУЁ’1Щc‰а_с%k |#”WBбЄNšЈ‰ХTuž&і)йˆ"€>—юхИђ‘&|ОRнrD“&ёфКн`иg0I(yGY'ДЗŽmgXR к%^ЃjЦP_|ЙЈt4гk +4IOЩЬДw/jqI5кя5Ц”r‡чуž•ГwoI%>яzЪn“ХY˜ ЫbУ#U’‹}ЈрK–EлЙuЬгœ‡mёYЛ5›У§Нa…А |NFЇ{|d|И§nq >дbы­юеаBƒfаФумN|Вж˜‡‡‰Ё*7Ц\ѓн˜;АqШNЧСШ т`lJbєŠЧ™ЧЕЙZцD]šќа]в№Ÿ;HІnпј о{їfAЁ„(^ШЫ‘іLAcšœя‚nЦ#I91шJЖgРь.g#[­!= ?йP9КмЁŒ‡\Гьъ1(Б­“є‘xкх тMхœЏУYG GXўгЮђЫBkЩўk№vз| o]h­Žзсь †˜lчм…GяюQ“БœСIСѓѓ@9ЩрEhћ^‡=‘—ŽШ™ye}3oЊОЁ@ЩМЁ}р’„ЄŒŸCЮKТtfЩљ_їœЮuпЌз}сўН)эX3Nр%бџštп)=№щњїЗ}Ž‘†Гzs_ъЃ˜оŒбs3j‘9­_*7…™nЛЕ™E”Š№GГТ‡л1ŽПоя`ЮœHƒ›кјfЄFЇ‚3И‘/:ќКєs[PЎadwјožмщя(ў№ —ЯўrЎдлS` ЖЭ‘41ј8нг„dд^ВLтЏЊТgлП<Џ•endstream endobj 68 0 obj 1433 endobj 66 0 obj << /Type /Page /Contents 67 0 R /Resources 65 0 R /MediaBox [0 0 595.273 841.887] /Parent 60 0 R >> endobj 65 0 obj << /Font << /F15 7 0 R /F35 43 0 R /F34 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 71 0 obj << /Length 72 0 R /Filter /FlateDecode >> stream xк”?OУ0Хї|ŠŒ‰ЊЄїЧgŸЄ ІlРQZ:€дЯ%iKвІˆdАПwП{SАStZ:фдЋ–ŠšЎ6ЩmЬ,)bEвњ­;ZП>eЭъНкх… уь&/(fTs\$F†Њ@ŸПдїІ+ШŒ#ѕњэуїfB/XEm! VЯ G=Квм;}Еп=ƒ€й,?зЖУМ ёzЭ …ЦV QЬуEPВ"” НC&ВЊ@ސMр,ЗkЊЇБZИсЅл0œf–!-UЇžЅ%:GFс4ћщpЮЌ§иjŒ2 Їг[;1($Ьъ  чЏ`К†ЦСќЫi8ІfПhVчЁ˜(jчОem{dX–$8ТbŒеŒСOЗзLL=9ЖХГ}ЅSэї“0ёІ9 иОGБЂz}Ќ-ЪЕIЌ/oŒ‚S8=н$erCГъaЦ,‚ь}@'б9<БЬ8ќ  gћEДxБŒиѓѕз<Љъф{љќendstream endobj 72 0 obj 397 endobj 70 0 obj << /Type /Page /Contents 71 0 R /Resources 69 0 R /MediaBox [0 0 595.273 841.887] /Parent 60 0 R >> endobj 69 0 obj << /Font << /F35 43 0 R /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 75 0 obj << /Length 76 0 R /Filter /FlateDecode >> stream xкХYKл6Оя?шЭG­rјKгЄh‘Acєвє икЕЏМЕ•lїпwHJЖlЫ"эlQˆЕвh8ќОyŠlBё›FЌ‚‰NЄт“љ§ЭГ›oO@mєdvы%g‹?ГзЫтЁ)7гœkёщ_Г_ёA.,1Lx7ЋђОЌЇ`ГІи<99™н~ЉчMЕЎЗNўХ[&' —”2(ЮЅ `•{ЖЌЖјŽeй| :л-fiЖ(ЗѓMѕyšƒЩЪVЈY–сс}—ј_5/VсЮ—k 4ФdЭ6м*ъEx­lmдЦ yЗ!&ˆв›Дз ЊЗџgсдJ‘еЊјМrж€ЬЊк§ъlіс=j%aз\L˜&РК]sKИП'lš3"{нZЭЙГz-PŒhб*УBЗыеjэlyЌъЛ`к"hе1"ј^Бi-^”Ÿ(uЙxщНy3Л‘”pЩp9ЪEvРh‚Ыт]k&›rrы$˜”`’HмIxф‘SA‚ЕІ81T9IF€š‡m­ѕАž™;cаПp%A8#ыhIДDёў˜ШŠе—Вг.aЈ*ЊоZм'‹Љ_ЕcЁUn 1–Wž3cаj' 9€й Xaб)-aкŒ˜3iSвћЏAџэ хC†~ЈvQ6˜ШGд мŠвБ§Ѓ3 †„ВcKy\?Mt_ањПыдJ„1]WЎ,ˆ0JŽЇ-Q’яИw5ьCS Ў#Q‰р1ш(вРёѕaшФ(tрэŽ,АТФФ”ЮvіД_ˆя >ќ=†уОЇ5JДЊ„Œю0DЗ б-%ЁЬЦЖ„SР0ИCŒ/ЩL*†ћ `|*=т˜9˜‹А‘\Ї‚и сg‘a W9"#†ы}q;ˆpМвBŸ„ЙТBЃ.Ъˆ0&)Ь '”&ТћK§ЕщиЄX›ФbЇуј ъЊщŠ-Цclx%1’ЗЯ_ єк—Œ3‰Т.;bњИ$ tjВѕЮš’l= ћXУШІ]­ѓC…=ЅPё„+АГW% Ќ™ЪўW<ЈГЩa†LqHJ5kWbОž=ЎїЙЦ3Ь“ё\ƒ\йhMrэ,gW%l?žDћ=ˆpАЯ4œ*G3 ўХe ИXX­LїCѕSѕu0бˆoO4RSmЏMфRЧЛБœЋA7ЦБРћtйœЧВЙЄщйГљЧП7MЯ…Ÿd­;Сык6 vbp№f{ћщР"Л€УКƒUћDшz`s4ІxќPчx+ƒ“АzŒd“ юgЁv@ЦIБŠXюјѓЃœ@”^nY"-ЕcНЂJAЌФžЊwm A9WЃ. мЫЮхс'шѕ:П-YiCˆГЛС8BІ˜J` ('Рm` 1VŽXSšР‰яœ.Ѓ1Йj/ШјКN@CЌЁœ|Іr|РvxŽЬ!DЌc‚TЪДOЮSпŠ=W‘ТЎ\ž }оёPЖх]ŒђЎpPI‘њЎ>fƒXœѕ№$Ъ:і–_Щ:идiу€зvк&VГ^5{VZe„е”в“š>@Тaя1Шъа‡ЖчЄuЈ.RЌ^4ЮŸЈЄЁCVƒHcue‡PŸДкО†vЪ†вЮуFКѕ>›ћiЩeDфЃ“*!Jqo8yйєzzаЅЧѓВoвEТРЪzќх єЅед!к"{ЖСI,І>К1ЦŽ…†ЙdII“e/hoЂсu}вФЮžбk’І&Ёћџ(Йp  1ƒћ?љрuаџ`p{ЂЂЋ”HЋƒ?ЏW‹ЁOn#њSПИ)†]чхэЊЂ„F}Х™]жс`шїЂЉжсдчUИув(›ц}?X()醹[0Р'И7џфЌotRх™ŒЋ Њ.uаФи‘юXZз.& ™Р >L<xнїС|ю3IJglмluM1UD|’хУ‘™K&В<ќє7ТмH>ўб Чz№>ФкУ‰ˆу.p ДНўD ˜єлК)}TїЅђх4Ч9Ј= ЅЇЇœTДЇœxБmж›rЎЋfЎ€†пЦEхАVККЋ+w,:яN#§эEuW5[т–5йЧѕюЎq'бOў№8ьПќ8Ће*ИоЭмщZ†ШkКмeuЗ,ЗMИЛ(я6eЎзЗсїaSЮЋmЕЎwЯк<ЫўСsˆфŠ”Ю8.б`zzРШжY‹уѓ#ТЈ.Доќг”ѕЂ\ .Ќ?ЗоїI$l•iє,—ї3€1!‘щЮmўС:*endstream endobj 76 0 obj 1725 endobj 74 0 obj << /Type /Page /Contents 75 0 R /Resources 73 0 R /MediaBox [0 0 595.273 841.887] /Parent 60 0 R >> endobj 73 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F34 5 0 R /F35 43 0 R /F27 77 0 R /F30 42 0 R /F36 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 80 0 obj << /Length 81 0 R /Filter /FlateDecode >> stream xкеXлnлF}їKA$nі~Iб‡u j‘ э-Q6Š (Ъ§їЮь.iЩ–IКI€AТЭюpvxцЬйБ…?lЦИ –Њ™Ё‚p-f‹ѕЩѓ“—ЇBޘ!œЉй|хMчЫп0I3ЦИL^7ЭІI3aDr•зЫЊЌ/г?ч?Н<…#NХї2n‰ўхљU/(•ЌvѕЂ-7uxAьП`(QFХнЮѓі іљƒ* йџЪMY4oŠvзд[мC&mиL&E T‰dБI3n’eFГY‡…оИЪЗmѕ1'з)ќ›WЦ0ۘ „ IЄд~ї]Žц$ЭЄЩz­ж)ЗЩnџwсЗЧ­ИN)ŒЏ xшф#šЫ`UЎзХВЬлЂК –љЊ-№ ИJђ0ГzЪЋъе,|Ёњј>Є™b2yѕ]xЎеїыЗQ ћўТЃм†чІ.тР/DЌМa ТВЧыUyбфЭ]X§лG+уV1ЭјžФ№Nп~ьнеaD9ТрЈRО§zЗgрVj–фuxFHM“џХbзl_РŒѓ€тТВXхЛЊ /Ф\яŠА†Hxmл”Лѓ„ѓэ&ЬћЦApР ыщиCмћєO>Эv[^TEH{ЧSШrЯгmXЪ›Ш™РS$РІЊ6HšЈ;Ÿћ“зѓ(i`Ы WrЦЅър3J„ГГІ˜­а‚&Nэ\\Ёy eС8т С’Ёu/ Ъ;T^'HЦОЦbPZAIP1АŸ†§ x:МбoЉх!5б;Є]X;ю>Gr>цўМШы(dшмZЂИ{кyЦ”%жHД0‚LЁF  v DPP+O dю•јXЈX 1LЉˆ љ0хФ‚ЮЦ0 [8@ZЧН‚Оk7цѕЭ&а#Аќ_Nхг[x№p( $rƒрIAœ“}• ƒїуf—ud‘N ЈDCВGО4c=€’8ЭЦ§Bк™Аc~Пo.wkаB(њxœ,УGxЩ8Р•qUЁ‡ˆЫA˜žЌГDw'ѕ—НтQАЬьў€:ŽWfЦЁ:фW‚*1цїхр4нТ7ьЊМ)[„њЎЧ”!IиYЙ#JА€щpЁ#њЦMфълыЂYU››^P%си( y–ыQ`Хs dtиЗзўN—7ІТIHлфѕeqD C…ЦзfЇсЫ Ѕj"ОПжЫУЕзM`.ГŽŽ3W>`EЦеG§$И+•‚3кMRZЊ Ч3wКѓŸс–гk‚ =ЊДаИQEЬдГ•"—Ѓ'р<Еpmѓ* YсxТтŸŸšbQncгсЫ­\‡яTx­pїнS№ЪЯ‡W?›ИxяeюЛд_iлђ!Рf`Ш^NQЧЎbї;k`jiУЧ:^;оѓВ~ ЏLжљm@у‹ЈЖлE*vТ—EьФшa“"Бќ|/ЬМпoŽѕ2 2ЯŽL›; DrМГ…и|?ї"4Qžh—Е‚sЧ>j—Yз.У`]жх3ДУД:ƒY MсЃ:кпЗИЭ6ьЮЭою`LФэпƒЅLАљдšгЧСыДьОA5 дVСхN^ %ѓ%pU”eЂэйT\Mд•\ЅqБ94іW\A\qЁХЩWœ(=œmq‰M?NL„Xj ўэAЃљEP†ЎR|QМJИžМљэDђRЎ‚Ь]ќЩP˜eјЩeсG oБO^œфХQЎ%Џeю?O^LUGо‰Иj™GфU*’Ит„'Џ’Ш ehP"yaтМvˆМRќ?Иы„ъ;ž›ќг=ШьI #ЊЯ žјуžёjqЈЎ0еFЫŸIMzmпƒNџ[шЈ€!ћzи}5ьє9jNЬчPH_8—4И )ИМс Гн-цэчmќendstream endobj 81 0 obj 1511 endobj 79 0 obj << /Type /Page /Contents 80 0 R /Resources 78 0 R /MediaBox [0 0 595.273 841.887] /Parent 60 0 R >> endobj 78 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F35 43 0 R /F30 42 0 R /F27 77 0 R >> /ProcSet [ /PDF /Text ] >> endobj 84 0 obj << /Length 85 0 R /Filter /FlateDecode >> stream xкНYM“лИНЯ!Й$w9) K|љиЊqжЎ8хИRй9И*›-qfX+QŠђЌџ}^ EŽ)Jы]ЇІJ$Рашз§Кс‹|с8ѓF,l.™0rБк^НМНњцЕT n™рzq{$oзџЮ$SзKЮ…ЪОЏюыыџмў‚˜Sш ˆ!JъХR&œ c~Х0б@Œ3'гœЏЏШѕЊ­vнŒCQх˜GG”§ўОў!зљ{ќ№‰iUЮWIЖ)лCSяЏ—R˜ŒЧGuG ;e0Ъђ4ъ§дІ$ѓж$пOmG0У}Ш_ФЕ–skJЫЄW§šKЉMіч‰™aG•wКхlBЙЅа‚СдK!YюФз0y>ksї1ПацaџпžнВl>gXИЈc0Чv‚љ—ыЅАіdvzfхс\ўBШФ,d’;f eФLў˜iTuВпЅ8ЙСО4йЫиxЁшlб6EНП+ ЇœЩк‡2Оь)вёІГн”Y8 Ъ­M“Мœк…f2ямЉнMЭaбD‰›‰)ГЖћЮЎ—žЋьMеЋŽњ6хнЎ)i8,k93Š/–\1ЅtYўїP}Мж:+6e} œл{Лћу„E-9&žhШ`г?аCe7іСвG ˆsЩAЋV8`ю™P>БЈN,њЏнЁ^Wѕ=єА2ЛK№юџ_ФЊEчЇA‘w!ЮƒЯ№ьн ŸБ№о {Њ6„YCL@Ћ5уљl<*ЦеМwHцzЎ|wb о‘ФК\Uл"iѕИ)VхžMLŠЌЇД97iЇј–МхАoуЌˆ5Вфh!–ЕJŽf‚xhiд§”№ЗР,‰К и*rЄ™$ˆузЂєз›нЎ™уtцnŠг+аЫfwмм>ХQƒЊМ/›Щ,  9NЃc ‡iє§dЎCо№B5ЫќЕЌ6_–ьzУдY uжЁL"гЎoфbџ(к‡WMШKЇЪеœIgGЅЧQ—Д%Њџ•§јu›нcSmш 6 GпV<жeШЧФАZ{LуYюmЬ pТPЊ œwOўрј€(BГJЯ-•ЂQЖк–Ыл4žмИЈузеГiуїоЛЇШЇгэђ1=ГœfYэљшž^WХŒ 5ЯЪ"ђKl ЂQѓT|ЄŸнц#…]IСЌEЖ/CoйPНFЂ]№ы.јЉ/`ьиУњЋr}hŽL”ѓБMi(уB˜"гХЂ26yЖqCЯF Б]nют{а!О„ИHŸO0–DІ“NГсL t s2дQ%ц§)јl*ФЃaўVF’ЂИЌhЇyrCЉAизщаEЅFXžŒ="j=Юф(;‚ЋЙЌŒ.ІTVўfUѕg8ъ Pшyи'‰Jj(„“Гi]КГѓ`ЁВдj>Ік^Œ#уй›РzGQp`bсtШ@ЅшЦ™іaGfŠx ЃЃZдљMgр›uф’8K­cЕ„Ч:JьFѓгГђv[Tu|Kžr’/cБ(СeХ6МSo‹цЧј2оTаEŠьjŒIс&…?њUЕŠ‘ =Ы%ЯrСГтByM7С–‰­eрћrЎъP|Фz§й1Їња ” їWЏnЏ,N…4›ђ†IiЛ9P2ФЫЂ)wWШiъ-E~ј’VМЛx5XЬЅsƒОПy}V€OŸbH cCjЉ ŠœYШh&$qаь пESTЃh—ўќ ‡(-Я­№OrЈbП (u9WvЫсPnФще–4ЏђАc‹ M?ˆ˜\OфжЭш @ИЧpЈхћ{я)ЭСbT`у чиЈ­šƒvчl#RЕш–QсЂ‘ шДЎФКtЃtnaœт•‚rjkagtы#Л[­ЗЕюžъ„?Н"ЌЮб `8ндљYЋу š›c…vN9žfxУЧШГ^ ЫлќЌхyў™щ!dQ—NичщВчмвАНp_j{žwы1,зsQЁ@$ЁјЙРј8rнЇлYэpшўbЇ Šp)™е_†i#Юс3…hХШѓъсXnќЯЅo:К§џф9уЉSŒЧХLаc%%sOУŒ’gяјšєl“endstream endobj 85 0 obj 2213 endobj 83 0 obj << /Type /Page /Contents 84 0 R /Resources 82 0 R /MediaBox [0 0 595.273 841.887] /Parent 88 0 R >> endobj 82 0 obj << /Font << /F34 5 0 R /F30 42 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F28 86 0 R /F25 87 0 R >> /ProcSet [ /PDF /Text ] >> endobj 91 0 obj << /Length 92 0 R /Filter /FlateDecode >> stream xкЭYIлFЮ釙snš…˜•кgrШ,Ц8РFF7’5Л[™4(Ж{ќяѓеBŠЄJlc€ ДИ<НѕЋяН*Б Хл0ЩˆаrcЈ \‹ЭўУ‹Пь^|ћšЉ cФ)ЕйнбнэЯХ?ъЎ~Й-…ЃEпnKЎ‹жпZWz|S|ЈЖмŸуЭo1EоД]ИвE§‡§ЁnЖјvx]ўѓё$lб?$бw[(ЈNћъ•ьл ђЖоўКћёлзBOœTmTrѕаM›Х"$ЁŽ'ЉЎ‚ЉЮKmJЁ \oJ&‰”*МяЊ–с*\€Т{Ѓ’pdїюŸа%ю›}h›—ёіЗЧ>^ŒТuзЕ]TАoYпЕЧјрщpЧŒ\Ы^mKЭyБлZB)%sEнœ=‡KN#Љљ‹Рdp тќ}ŸукЛЉ0мЭJ9‹ž–WЕЛŽRA•1бnHtЮ’`D[>76gDEЌМљSЮ”!l €š”"9іkйl1~к*UTЧЧDы4ЙЅЦ…­‰Iˆ4cМъ™њ,єPf+БnЂўSнЧ‹аYб^XЎ‰РmbИM­DЇVbS+йm,КУ}лДъО;ь}+aЫVВІ]фw†Ё}поBбq—z=К"^ŸњЊЙ­Клјxж№™Ош\3М Š’•ќзЁЩ• ЈWУšy™QbеC_ћk›‹Šs№е Оц<с“ŽїCЗпU9_PcЧјш тsУ#<`b œ]ы—зЇУm|'šіx /Ÿв\2Щж+ЏёХпw/ќP‡‘FPJ c~4Б~њ!MДЋ7w ќ$€zцY>МI–&EС‰ КА-fR\ЗїХШ8ixќЪCЬаДBWMќ­ў…2йІ&т“ˆѓЊ’#Ъ!aЯ%$ˆША€жЙЭiq˜0+Ѓ#зuŒf„›8ЫiЕHHЩД&šу‚{Q6цEфђ№…8ДОz(7~>@пЃbХC•Еv "CЭhgBTƒ•гАмІ<жMgГ™З]"LуƒњƒQЎ™ф{Œ2ЩY?hЎXоЋtj™Гьг3Юч˜q$ЂbюUоа6 B:ЫoёнїžmMсГЬГ­l2Сќ;7}Р#НџКаgйyP™„Хіf<УK=PтЪm"Ѕ`щJ—ЫЉ3LO–R&Ё|P ”1”ЈDџГŒ`Њ‹xqt+aжЫtIюЁ QБŽX0&ићДŽhЪhзжУC*ьs„QuћОКD-VЊan’фЙBс™м[жmАє4Ы7‰aЌ0“@йEž?ށцiEЉP7ќŸЉŒ%<[+\ЬФ@1ЮУ_]DЊ1€/}ьwоки Dt;эЮИX6C‹…f}JTœf}е2kЩoФм‘Хру.ŽeжgЭa3јчИмоЃЧ)ЛLgЕ“Щ•M1Ф”#R‡†рLБ%Г~d ЃL,iq;‡ ˆЯѓФ:ЈХŠ5tјщЦувžQ`/P0r8і*€a=ЌžcXž)ЈХTLєЋ+[ЅЯЋэм#ѓЗ3|eПщOhєPЭџw|9‡њАШ™,SN sи-8HSk}1і_HБ:ІжЯцЛЯ§CuŸ=YёŽYяВЛФй…Uf1§3$Ф‚ F‹4cqф/G\˜™Бop" Ъ,€%ЪЙвYш‚‡дrЗЏ”МЪCsDwњ&wr‚tj6?8™Т,…-зТN(*ъЮЙ’< o BD]њ=ˆrЋУ†E‰ѕXІЗЯБц7юЫz“Ю0fєс№ ЊОdC[s”§—=[FХЄ'оЬzЂJ=1vŒk-1ŒњlВSШзћь6зX>Ёšt кеЇЧc?žz„g?gЈ“‡–rбЭnјztёіМкD&]rP2|ўzn+^Р\•0m†Ѓ)пUœSЋ]ХЦžъЛŠCZХЧыУ~hюЕШюЁюЋ8lžя-д т9pќ”ЦІЧи[`иЯl‚špj№-ЯэZѓёŒ~qBоAwO,r•егуОџQe9 /эZƒ.^ёАЗѓбьђ\\l*Єё@aDБЩШ 3љўТs9ЉuёцсI1iѓ-ˆТw\™ИЩа’Ÿ.ѓК9ИСзBВT<йW]_Ÿс7iЛлCSѕс€вэ]њzМ§eв9x| ?UќёX5с—%Љ‹CŠч!ЃЈгѓуЈьXuщW™K€8ў*wJƒ01Jљ3*ЫЂОŸ<ХЪтеїёѓJO§.јCgžD€CFЄo‹Kюfgю^bOћУ^ +–ХцCў,вRчendstream endobj 92 0 obj 2133 endobj 90 0 obj << /Type /Page /Contents 91 0 R /Resources 89 0 R /MediaBox [0 0 595.273 841.887] /Parent 88 0 R >> endobj 89 0 obj << /Font << /F15 7 0 R /F36 6 0 R /F34 5 0 R /F30 42 0 R /F35 43 0 R /F27 77 0 R /F28 86 0 R /F25 87 0 R /F31 93 0 R /F26 94 0 R >> /ProcSet [ /PDF /Text ] >> endobj 97 0 obj << /Length 98 0 R /Filter /FlateDecode >> stream xкнXmуЖОЯћ+ќQЦU пIA6Э! Pр€ю‡z§ ЕЕЗBeЫьKюпч’’%[іЂ ‚Х+™Ю gžyсˆЧŸXyС +WŽ+&­Zmvy|јцƒв+с˜fѕј(ЗџЬ+жЙRg?|=ЌsХГЊ{ЦSdmSo№тtіrкoŽuЛязџzќё›` С$>ЙДLzИ=ОVи"]ів6MЛ–>ћЉоІ%;с~–]•^ж џВ6&+ыІ|nЊ?’˜‡яlС„,VЙбЌ+ixУ™*ќЊЋV/жГB­rа)cгЁ™ж6~ƒA@g—rДЧХ9Ђ=>ЌНЬ’ІƒІ`мшUЎ™RњžЭМС} ­>qЁїѕT‚0‚ё;ђ*hCNЩ%S…д`!`4ч—xHУœЛC0(q›У Cс УG Щ™РAg–ШaqЏр:I”g.йуѕўѕ7ќ џФhrЯИХ~Счї$9Я”+и…ЛQŽ4+Ч 7•2r`Ё‚№и"еЬ„KPxh›\ˆУ4ŽЊYhшL‘LК ™fЦЈФІJп§(€˜˜СРŠЇHЁј„lтДŒ`‰TяфЄЗ™ %n zwЅŠeЦЛДџiсМ№7S-ІўлБžц§‚ћђBсvE , sJЩУЙ JyKпЕ§ЏУ’VўџK3AзXzПŒ%gХя‰%MИƒ%ЏU(DBNА$ѕ–ШУЙ Ъ7АєXўyщJTс@є&”z$П+kA;#дд\$:чL;1 qУa“Ш toсnƒXЙэ˜6њRДPѕцву™Љ€9t№€Е8щССDКрkпpСŸЛЭbuАhc wэ…+qN1уФ[Ййпˆ/?ХясV Б2М_Ъе1r œйЂУpІ _”aжiЕЛ№f";Ÿ`І Ÿы6ё2LcAЃрNu3Э8І<Р|&zПЮЅ”™˜…ŸLP›uгк9К4ЦбЂЁ}D:qt ў—ј%ЈФЏoљ1ЃпєџЅ8ј_;§Пр—:фkџгјпљљ_O§?гnт=Эмѓ3N‰Š(ЧF№АпehЏŸЮ`ž&а ­Ццbw8+Кы[tСD/ю–NSЏ•DњJїš=рfxЦйƒж5H8‡6<+їлИ„Цe\ьыm?5Чr_ЕЇОљJїwЈЋ=>ЦбB˜@аЦ`’ШД+У  >k_"Л6‰bpЂaѕsд_їФёX— KЦœЯTшf\(•&+‚‡бŠТ•з’WLvшкЯ]ЙЛ7I1У$ЅOГ”Д‡~˜ѓиЄiƒN›ђXmуJНЯdэKO;HЂ` > Ѕ_vхёuAK=§аёAAжЖюЊЭБэ‚ИP%ЩR/8KmD!+V`"иAfж…‡+aДTn6ЇЎм|Нa‰dяŸЩз3tЂ;в ‰Ъ%Лbrcк/_Ћ№ј7Њн`gT Ы гЯUSэЪ..СN]‘ЕnЅ0^j;B›ЬЊrC#ВзјkиРЋ2ЩiYdpпюRtŸOAЌЯŽ}м№@t‡:„ўUлФњю#]д|"&юЊћМЇр%&ЊH‡V^g№~ 0&м5qёЬ~е}|–‡CS`тЧБMЯ3Ѓ›и‡ИОјм 6Па1чсCЃъ:В В.‹ИЌŽtшŸТЩЋ Iщ ŠѕYSіЧHХЦе(/)OТЧ]§Йо‡cY;3uќ>№ЌУ-G .кpPёиПЖЇ&ХhRxЖЇ}њ јUaJ1nќТХz^ЧRd–в2К!КАž™ ibлžž›ЄЩ\лУ‹‹Q-Œ взђз2Хѕwг|JХЇЇQ2ќї­i№у‡tГQmа#ЋЁЉмUeъBхQ іJ ф№jsJ вzНK(Дg”ЯЇК9цu"ЄќXс_žbš;f§ Žu $ї1В=ќлЧѕˆЬ&Q ЋQ ;юШFЯхјIЪи6ФVъ§‚Еѕаc~ќјїхФЎbЉТž‡Љ},ЯTУщ7r š>–ЂБњК:ЦЦP|кIё Є§І‹СHл”SEій—˜ЃІU 4iѕѓ1Об”|РчОм PК8ДC3+gAЏГ„4_жчŽЮ,€gCc!k\К& н/YЈё6endstream endobj 98 0 obj 1919 endobj 96 0 obj << /Type /Page /Contents 97 0 R /Resources 95 0 R /MediaBox [0 0 595.273 841.887] /Parent 88 0 R >> endobj 95 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F35 43 0 R /F25 87 0 R /F27 77 0 R /F28 86 0 R /F30 42 0 R /F31 93 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 101 0 obj << /Length 102 0 R /Filter /FlateDecode >> stream xк3T0BCcC#=##cKS=SS…ф\.Ї.}7CSCC=KSS…4АЪ”h ##Эи/.з.}х Ъendstream endobj 102 0 obj 65 endobj 100 0 obj << /Type /Page /Contents 101 0 R /Resources 99 0 R /MediaBox [0 0 595.273 841.887] /Parent 88 0 R >> endobj 99 0 obj << /Font << /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 105 0 obj << /Length 106 0 R /Filter /FlateDecode >> stream xкWKoлFNsєЅAЙ­PsНяGкєа .Z Aы4Щ–(‹€L зџО3ЛK‰ДWNZш@.wvžп|Гт3?>sœz#fFHЊœ-oЯ~[œ]\ 9ŠZgg‹u\Ќ>‘З›rзWнМж5џВј6 хЉу*\э`“jY—[”2d}з,ћКmі(}qЩѕŒƒA­ЃкB+*М g›z?/”d9Ž Іш[UћeW_Я aI•„њM7їЛј=кФ/G›AВDu_чZ“Во–злtЎnЂKrь’№ž2чRМ‹По—§&уЙ4дsžЄшМАЪ“їэОšлuHM!ЅІоћYСUJapћ2Ѓ 8ЗПЂs~Б$X5qYЎ0+\hВюкtюm|,л НТ| tN…МЙjЗ6ЗѕuWvQе5к}ˆBW4>СљM щN% ЧВ|fšeЅЈж2%`гїЛзїїїє6ъЁMеgвЦ!!R‰t 4sšTЋЗT№ Up ˆђшyS”Я Ю…"—sЏHЙьл žE•0TИxюrюIxШ…сЉё*9t Z1мшYFГВдŠ!шЎъя:„˜є,%нyВ>8–€„щ~г6ESн”}}(3Ўš@>q&Zкд7Р }\ њ\B_јАnгЫ§І^Ђ7›И<_лћgˆŸ{Y6‰дpa!Тлн]ф4иТ^ЛЊЊИˆ††љФy|ю(ВЊ&\" –˜B%І‰)~/ooKCъ02ˆ= ~B?ц‘х†ф‹TдxJp#§x‚UДЄœЛ'Ќ‘Ч|УЫˆ8Юг”œЁРЋ˜пHэЁg‚Cњ— К_Љ|‚kŒЬ ˆљxЂIMЂH}EgЊ/C{2˜цn0`кщПSzј pюQИ€ uLvЪ‰а‘`$; Ј.њžѕ† :кFcЉiрш  АG”УŒЃЙcGнђт‰'vтх9J VJєw0P=1 !=rсХ'ЭШ…>ЧЩ0jЭиШ*7[Z4Е Ї&ЇLјб ‘qh€›:!ЌЋЖхЁћіьЦУ,t2аФCŽь9ЗШj’2џШў6%Ž.ѕм<’T@љЃРO‘Мљаi!И‚IРN€ц‘oЭБ­ŒЇV!= P7ЉПъОJrmnBsя(SюЙЄиalBЬR)РtPY6ЋЃю№ђш‚€M/Чa0щё†ЛН d/UК…>ЌЃвЪяэud^эШ}дX'ЭxсvЄнз#'сs>7{Ф,B8žќš1 4eљрK–бfеТMв(=UћЫ7еFG#Рхq@H98!Нrz}IЊЙС#fы>Ньы›&Ђљ~S5еWЬоф8\ЏЌ7ЯЅ_) 8Yvэ~­9R6Щъ №С`нUЈ;цŒ;ИЪwU<ВырOбОк>`ЯБhŽд9T@˜&3ї„{вYG8‘<Уcрi51Ъќ-.‚&'Л—К{(Vтч~Ьггd† ?”јЏф"Б ‰[gяgџхŒмendstream endobj 106 0 obj 1437 endobj 104 0 obj << /Type /Page /Contents 105 0 R /Resources 103 0 R /MediaBox [0 0 595.273 841.887] /Parent 88 0 R >> endobj 103 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F35 43 0 R /F34 5 0 R /F27 77 0 R /F30 42 0 R /F1 107 0 R /F31 93 0 R /F25 87 0 R /F28 86 0 R >> /ProcSet [ /PDF /Text ] >> endobj 110 0 obj << /Length 111 0 R /Filter /FlateDecode >> stream xкЕXMл6Эy{шЉwпЊb†пЄRЄ@Š6E‚=$mzPжZ[€-omy“єзї(ЪRLЏ7Э Ќ)qФ7ѓf)&b"Д`ROWLZ5Й\§rqіш™BŸ`Й1“‹Ћжђbіgі§љ_/=fа‡–W]џГs/Г]}йTы:˜ЊЁЉЮ™хЎГ}3Џ/VЋт=7ќ-ў‰ФиNbiКћ`S6ЛMН=Ÿ*Lв,JjЈl[Эы№j}оt]2k‡ЭЋИЈ№До„FAsNІBbF Ё™жІm^нœKŸ•є‰tйЭЙ1YБмбавв\эjЅЎV3Ё|ЗкЗ)Ј8Гhж4Фyš[fЅšLЅcNЙЬ G+яl_ž†м:@ П„\ч&рЊs›еоKzайr=/6UГX…GrйtЦІsB€YxІy„йЖ3DЧ$бл `Ј{ @Яx=єІЉ6ЫЊžп€œ9=V\_oжŸЊUб”лФN0-bРžФк М]єЭG€x>•Ці ћqžЎ+švЗ,$Ѕ–ЬH;FA}“Т1яѕ8&G Хrg;ƒR№JfE\ЄтIGЫЯягSF ИD€М\ЯO„­•т+рŒў*ZьЧЎ2BŒ\e''L;YŽЭъ‘‹рEМи&‘ДЧ@XюЬЗz,2Цa=о3хмdЊ,(@}-GЕЮ.зѕЖ)jBЌI‚х™Эу’^Ÿ€VbZФЄьcПЈg‰$2dП4 єr~r Yљž ]w+ iEЋlQЭхЖ oћфМ Яm~'Ћ‹ъ’0_t>сšy­Gy>T А,V Ѓ‡еД4LV5лашs9в ЄЩэ5ЈŠjЯnhТrљ™тЛэWйeQ‡?Р aмЫѕъzз”нр|oЪВ](EMиAqн”›7В‹Ÿk†]*“ MA›"&иЏ)N?ЪKqчЎ]Д}оѓцщУ@ˆЃ‰д3й—Ё}%wЂsUMˆ,ЫІ{ŽA3:фa(лГr ЗC~ЁЂeЊі щЯ[c”Vј!ЄєўьЗ‹Гм”ОЌb*Зi~В)'WgЂKН%ђ‡ђЖWKЃНFЕє€€IхdРmЃ zšЫ3зg€ž“œхPh„&sz"e )§бЭтб“;ВІSХ„1УL"Mo2hјb*рQ’vrЕšnБ&уТdЭСdšI|ЂYЎмpOЉhњ cцpАЫŒ M$– сdIы”ьХ–№р`‘УIšФ$Šc‡“Ь]Dn<ЖћьчTїšBЯ@XЦџ„ёЌƒ'ZњЇ†O­6усЦ•zm8ж0ЩхНh"TЖ^тМИ;Ё-W_Z -…ЯWа b:IŽŒ†ЌЇŽЁ^DЙрЦ'ѕb—cuиѓнEОгЙF9IУ@uы1уu€ojћЗа=š9ъпРv{‚эі?А}§Жы‹ќml›Z­A^swdЛ§пиЎэ-l7ƒ%ќ7ЖЛс$Г&сŠPІЁXпlO—ЭbН›/HbјVœK”{<хYљїЎъдHієОY'˜'œbЖЏЅ‚qbœЪІєcj+?JE!ш”ГŒЕс XЕ s_ Иy7# Дл’r"Е: хВ"^]†—ХrОnхNkdh3-љVU]­ЊЪ`ЕYяъйњЛ`Rn6ыЭіфЁNпгЁ.яиѓњцЗwGpЫЁДх—š$1>oK§­Чzо'љэЎSœ-(ЭЂhвЇз+€c" M= ?яКA4I:)b-рwpЅ†ІёЁ@– ЪйьѕЙ’йzљyeдўd›иo]Ђќрh 8ЯB<ь‡‘ЙШc™ч!ЃгяfVІO  NяЫ:uЖbЙwћшUм Џзk’ЦЩу‘ы№яЙцдG=Ѓ;˜щЃSд<;йлЩн>&W>%Wn{Ч“ЯКеѓ*r‰A%иъюˆЧ”Nšф€лe–ІЛ™ яУMG`шБвL\в;л›2icПЫbŒ /:їqR ЂТ[…xЫЭ]< юрuЪъ„фАxЖRэIb$ˆ pФ3о…ј,Q38т R~ПlR ’О‚ъШ"—Agi‘ НeMсїЗЉЃ•DХ0ћtА!лћ&е^NƒЮc#šЪЄBuYayLH”™ў<}'CЅРwJŠієhЅфЯqЄнЦ{•1=Б,in nДTнOш|ьЁžђ§С8з>џЪe7тІ jЈD[ЕH/SеDР…RF4.^П*šEъŽB€e1 ЉВ%Хy,ПV'o˜ˆˆЈGcЙFA”єз(›гc КбщFцЬwё/u я{Ю`endstream endobj 111 0 obj 1804 endobj 109 0 obj << /Type /Page /Contents 110 0 R /Resources 108 0 R /MediaBox [0 0 595.273 841.887] /Parent 88 0 R >> endobj 108 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F1 107 0 R /F28 86 0 R /F25 87 0 R /F31 93 0 R /F34 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 114 0 obj << /Length 115 0 R /Filter /FlateDecode >> stream xкеYKoлFЮй—^кCoъ)nї§h“1 ) єт"N›•e*6ъШ-'ЮПяЗЛмI­d%1Z>˜"GУy~пЬŠM(ўиФ2т4Ÿ*зb2{pxt№нs!'ЬЮдфh$NџЈ$‘гš1.ЋУf5›жТШjqГœЏЮ/—г?~Цз  UјHЁ&5зФ24|Х Ж'ЦˆнžO-Џ†ћЂв‡Qжл№š*zќhZ+ЦЋWјР њЕ"’ГюKmГКi—зАыjuжј “мС­фЮЃјёДyM™\6ЇQюdЪmѕсћ‚ЏЕЂ„Q6Љ…Р ,cSнйт"мє$JёNфxZ#к? ъкTЏ њИ$ZђЕB†/[=щD'йAюм„IB• вПwяVCœё2.”B Мrˆ„pNjфжЬ‰Lљ%ЛqХ`И%ЪФЌ:!›_ ЧW$’Ј;їb$Y–0DYгЙѓ`У@н{ZJЕ$Fpooz1+•І Tѓб{FЮј+кwdє*яJ/ю›Оњ4ЎMyЕсЋ&дGИ:Њ’‘ЋЇ%+сЇЉіCQ„[hKЈeњ`KњОд:bA9%:ЧШЧ`Ћ&M$KЎ–ЊисФ(˜ЯŽИAеRю2„q7QœX “ n'm3YАЦИaQR[HfМ%СиN‡Э.‡,EѓлВ“Ыj_GА`$:с"WюOMлŠWpТrm”@†A€йNрДY^Ўš1тн\]yЄЈšv>ЛnтУ7mгќ//šеЊiуѕ_ЦЏ}Г.ѕќiТж+bЈМЌ вT\/ж? XЯЊУ№_VЧ[0п‹2,fЬGЦHNЋѓхќђэmтƒШўIЄ`гФ$Д:ю/ˆ” `ЪєрЉЪJ€HЄTЏли—uЭб:@сŒAЈ"R„ЅXзkQ$•Ђ:3AгBeуЄЌ<эШІЄŠ Ђ˜кНЫb$š‘>"ЛdŽ7А/Žэ‡o'и–џТyZa!ХNжwŽи›pи]„Ѓя“pK„cя•p!eд0sќX0ZЁњrxK9TФцвЫ•‡f*ЋaіVWАцШсїir„™єќЫR–8б™ЩŽЫyvF5ŒБy­ЁЅB(BЕ„Ј{›KnНXОЂ)ЭhКm‚і0ЅЦєцk„#JЫќщЯУШѕЭ| ШSв'’ЦёЃiгкаmŒС,1yТиk6ьэ%ж0|ŠоЪ32ЬPЭИ%рŽ€SфЊРŒkQLM!мЩŒWщ ‘~(`jД!‘fЄЗу'АŠ^Я‘ч“ЮЏ7ш^Ѓšџщ{ЂПСО5 ё˜ўšлЋuКQ€ARшьуТr8 ŸžAcх{Ў^ьŽэ6­,Cќу 2§ FЃћh1L%–Џ[lОГЧ|U[Œ [Ь_ФБёmГєго*оЛ\Œ„К>фмѕћKлыУ0T:ЬTyІŒ1hMŠuЭ№P жБд›ѓ-}‰ Z§Y})K}Yћ)SЈЦfСљŽЎЬ‚>Яь#zRме“тszвlіdo.ъдЮ=m[шЩbxPў‡=)Ц=9тNШ`~­%Ъб&юдwў2{;u‹еЙzx]:эт§cAЏЭtв­Є^AaЖCgцбъe)јWЉЯѓЛkЁLuю- sFoДЭќќЊН /œЯ.тMпХЉЁУNѓ‡&ЭЂЗЭFХј} uŒѕOФfК-ЯЃZљ %!‚˜qфчЁЮrЯпZUч‹‚ыЖK<ќЁмяд €F(”Д0ƒ­іх–С5Џ{]–меŸўaЅпА]@ЭRˆ1ЇYыvЈѓ&х*9‡vєP–Тƒ8V…DБ+ы|(Ж’3ЃФiк{й6cђBGтaвЫ\бCП0‰PОЏЎЛѓ;Mѕ8к~џ=./:<ЏQдЯ!Ж;CzЕЪ-­Юfзёbх ћНE.ЃмЛЉ’еьтІЙЦЂЮъ4@OTxRЊ fж-љŸрKAv@“BёcЙЙ$W{Ї(D&ѕuŠмY:Ее}л`\>ђЧЏЪO‰Р$ЊЋ“жš-чgхпЏxFЙqђv…„щrDЗ†мќ+!O[ыуO Й§м_\Оoк8s ЭˆtbP’;S ќo&ЩвkLЋў(Pю…œ0;>?DЫASѕ€ЈJa #ЌЫGГіЭЭzЋђwТ<жџеЂ7дсЖ[pѓцz•5‚П%ЧИ֘X“ІЧЪ"iтŠй{#Эѕ<~“Ѓ~Э@mкЏTZўYVџendstream endobj 115 0 obj 1992 endobj 113 0 obj << /Type /Page /Contents 114 0 R /Resources 112 0 R /MediaBox [0 0 595.273 841.887] /Parent 116 0 R >> endobj 112 0 obj << /Font << /F34 5 0 R /F30 42 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F1 107 0 R /F25 87 0 R /F28 86 0 R /F31 93 0 R /F36 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 119 0 obj << /Length 120 0 R /Filter /FlateDecode >> stream xкЭX[ЏлЦЮГѓаП ЗP€Й‡{' ДБЙ!8Aд}рЁ(‰ЈD $eеџ>3;ЛyДr ( т^†Г;3пмШWќјŠ+Ю„ZйL2aфЊ:Оz|zѕ№VТg…жЋЇ­Ѓ|кќ+љЫњпOџ€==лƒQ.§ўЏ}йV{Ђтs*e™…'k†u* ž”№Ш‹фyŠ<щрп$нЁ.[мЭ’Sй—ЧzЌ{ЂКь›j-lВЇwkxч<Œ4C6ЉщХЁіЋcЙЏ9+ИђWyъЯuфКЂ`ТЉЖ]OŒЋю˜"ё*•\ГJЙbJiGv:MЛJ›'уяb‹ф|:9щœ0Fсеї4яЖєœ^иžлjlК–feЛё ЃЂhЮTDy[†˜,R3Q№…,Рdёv‰м0›k/qДt'0ЪЁCХ_№ЯЩKW9˜Пи/)"Р,+> :?mЗhЗrž‚Я‘c9&ѓfяшп#G фUгnšЊєЦэfЛK^0cТ9ПE.Т3ІЬЭEZ:ЃћšPУmп#:Щs&Д№Џс+‚‡pкvЖЏYЎƒЖў34Œ„Э=ѓ@е†eB/€њЎEHf`_”GU9дЏ#GЩ x™8ў3vЄ`ЦZO№>гY„‰bz’ћЗˆb€ЗњŠХчмўiЭзkrћв4šт‡г†szƒk…“ъвŒћШЙ\@(Щь$j;љ{,œ№ƒ /РжЉтEђырP‰Ї: о­a:7 olŽЇОCћрќ-Ї$љ(ЪЊ:їeѕgТ…•йЖ№2•YpЁйОdаяЮЧКХFOтЯhыВиMBд…ўŸ#к@*‘’IKˆ~rB9ˆщ ЙqSKбзП/]О№fюЧoO0E[Єк—~йге~}„`7J‚DaШУaIЗыœ']tDІђ™‚[€БАфЂFQ\њfёRбЎiќXі§GЏsГ@!МЩE%х!†9<8ПqЭEа›Лц~O}xИ\.Ќ­ЧCѓЬК~їy‡gЩqxАJЦ ”#‹Yр!ЈH.8Ѕ)-уД VHщˆГkШB%пжЧ“’BЕЁr†X”АLSЈ˜Шѕ<Ѕ№›”<эgbмА"‰s8еЪ!ТвJ–‹гз`_Y`FD„TмB’С'eўлѓРŸ чm@ої\ЊэБcЕ’QŒOo87M_WcЈШEИеCЕ{ќ'„У™ЩФm"WšЯ‚„и`Реi;xУЫ&cПжU,WCО7Y>Љъ–K“ЩЛЛ\)œІHoњmдI˜вц,ЂYxU_Ђb№Д)Ј>жcљЅ<‚Љпнaђ‡ъ3љЖЙЇ_єDє‡хnЄЬЬ1ьwYAЌхŒЌ;5ф[Rуі"ЇR[™ЯxАА)GŒп9ІcM›Гтmw„+ю№#$ЪКє(( $Иџ/kpЈџЊцфЦБPRXf„љВ˜мГ*\эEuoLe4†рзЁєƒюš˜y$x>ѓ~ЪŽОож}нV~њa­5uЦњщі%—˜<=Х,7вћщЕ^Т…БЃŽEdФahvmѓBGU†т—7ЭŽ2dЖЌr J57‰+Йм(Q d’ ^?”ЇC}Чyƒf†n;NmLйзШ\п3‚ШI}k…#„œюњ\ЃЬЂвD\7Ќ“Az4K—'`Л`aс+,кzUмd'ЫЕpшmДZ(‰hn5 ЈКгIНaС3—yS†F[Yr2NT(œŸ8€nЋТmqю2 ?vOƒчь’ПУС„}к?NџАy…Ћ”ќцъЫшCS 5ХdхбфО8A7~…“ЪЈc•аЋЯу;vѕГŽU*ю;V$,iaбБтТ‚эЕ/uЌ]_zЋ–{M*6цТўŸѕЈљЫu•ЫvJYЅjюЖ…СНWož^§&0мЦendstream endobj 120 0 obj 1924 endobj 118 0 obj << /Type /Page /Contents 119 0 R /Resources 117 0 R /MediaBox [0 0 595.273 841.887] /Parent 116 0 R >> endobj 117 0 obj << /Font << /F30 42 0 R /F35 43 0 R /F15 7 0 R /F27 77 0 R /F36 6 0 R /F34 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 123 0 obj << /Length 124 0 R /Filter /FlateDecode >> stream xк­XлnлFЭГzњьS(дкpяЛ)ђ’Ђв ј!@S ”Dз„uƒHХШпїь…i­d ˆєjvvцЬЬ™YбЌРЭ %VБL1NЄтйtqёњцтХуDнмzЩ›йпљwхК­6Ѓ1з:—ЃnўТca‰ЁТ \oV“rRЯыvФlўе Ъ|V7эІžlлzЕlмІWTfчJДЅ Ь*ЏтцЎnАOА|:b:п(h>Ћš)ЦXЏЂP{W…—лэrN№ВЅлќe$e^жѓr2ЏТrН №ОL2ТАœМЙ~WЖw ;EAЌэЄкUP8]-жл6j_;їЧ—1ГJГ1DщїD`ДЦв!0d4VМШп­š6|ЛК OxИpo,/7UX*зыy=-;wmбВЭ:Р4­ЫyјjPŒ›З,€оДлY]Э ˆ=РOѕ,Се„б.zмeЕW$ )e"]/W‹pИfWг)Рa&рДпЪŒnХ "КЉftўpW-ƒ\эvо•M\1“?8wVaСcђUгд>3мвjл"–Uѓr4TцŸo‘7лMѕ<жЪсЁTўЙйNЇUг2:RАьУпы}|A,W§ГzЏ Љь…>$дАšЎњщNFьЂќ,б‚ЅQ'рwy€…ž uw]І‚BЩuдё!HFЄeЛT@uN\…8кнэфIВОNБЧ\`64(ћ]иNЕГъълйNЃЭлбXэŒšУjw‹žэ Еg;ќ‹сП Ы w}:DєА)№илєИKЙигрŽы?ЪuYЩйiЎГмœр:eѓкн!ИЭ+їХ)ŽЁдLfC’yм•9е9сL<Х1КЧ1бКx9W4яžгr>зS†w59^` І4эŠlК]lчИЫ~q$/ „}„ЯеФ}†№ _м’qhЏBтЪЮeмb‰н`0Г*7Гъ8Г:vУ\ЮСs?dŸC№ъі}‚?wК9 ў€р{TХ0!ЮPh%=ТЯРЙ›У!чшz@є>ѓc•КBr'$z“яЋтА0Э<šвгЭЦЗзltЏй0€ЏНцў№Nk‹:Їе Ї§Ї[Э}BˆQzВеА'[ЭYц>u DДoСwыo …ЗЪБ#fскы„AюZšэEŽT;ЩNOšb7ўџ—ы\ZŒC;ЙпGH ОЫ -vdvЦ]ЉбЉKЭ€(*iXПњт Г<1,ЄпУ]ЕI§Њб}ŸФšХ$@у^hV-WmЛU7ЛпъмѓЊђыЊ-У[Ч–aŽЅд§PуяОўœFІЛ ьŸQP†endstream endobj 124 0 obj 1745 endobj 122 0 obj << /Type /Page /Contents 123 0 R /Resources 121 0 R /MediaBox [0 0 595.273 841.887] /Parent 116 0 R >> endobj 121 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F35 43 0 R /F34 5 0 R /F27 77 0 R /F30 42 0 R /F1 107 0 R /F28 86 0 R /F31 93 0 R /F36 6 0 R /F25 87 0 R >> /ProcSet [ /PDF /Text ] >> endobj 127 0 obj << /Length 128 0 R /Filter /FlateDecode >> stream xк­YIлШіЙ$—‰РЭ)lЄYSћ2ƒЙ‰'ƒ6в™aKl›А–†(йёПЯWEJ%ug0аdщёеЋЗlFёc3&ZЮ „k1›ЏЎў|wѕЭkІfŒЇдью!о-ўUн}hЏkaYЕj›ЕПЃец!Ўьт_ДКяж›Uз,угЂыwлю~Пы6щ…ЎПўїнпОyЭЭhЮLктeќwВ=юЄЮп^g‚(nСOз5ЃЊК-1rФ8™шn “UЗыу >]+U5лЎYЯл ЂZAЌb‰ЧЋD f†8уџ6„Z>“D(xA G˜вГњ@T:S-Œ#R˜YЭ$‘RMЯV3ЁЋЗомЊU\зRЈd6nЊ~зЌЭvсŸTЕh?uM2 Л>С’ліaГmKŠv№cЇЇŸЊ˜IХдV‚Ž 8‘\Я,q4ўб]§ѕюŠ C”QГZ%єp"БсЖ=\БфГaвLій‰ЈєиžЋВ(Вœ1C8‹ІрVцlтˆ,*ТС’q ж‚W›Ўяƒ&˜:§щ~ 5сVb Ђн^Cљ,Х 9oв_їз5ˆг‹ѓЭКя0к">7}Мю2чeЗъv‘CзёЃpХпиВі{ƒruq,†ечэК4X6ЋН`zx<Ысї5xQWБ‚‚#†чƒЧ–GМЙDr[v3ЋљАWСQб2KK§С$ж-Н^ЄJ ТMHuЇ8N”О˜Д(1B^JZЩH?ДИ ŽхˆкЖЋІ[їQм~е,—С\Е€З:e'ЩтgЊhп\s[})iPcь%ka_™ї§}щ„œh–m шMщŒVИl%щВ•ОzjZиA!g!П-љс*oРnЪЕƒвВ&ЂТ ŒЉчŠЪ(ДЯ l…М›‡ )дП+=Ÿj"Лзз–WћѕќQԘVQlmy{“ˆ7џ?іЈrŠбъЭAœi)2Ѓ0йЖЛ§ж;Њm ѓИнм7їн)„;ИRXєy$\яћvћЉ[П?Мќ‘IKЄ$‘X_—ћR]”№+oJЪ€Гf)Л‡ЁNљ›м ЖAС6—"%{№ѓT1мХ=bMD*nІLЎC†ХђНOе_ОGu!•cHЭy yэ—ЂЮrфЛвIuF_N’ЋKКЂФЮЬŽZa‹М8дю2iВ |.ї2*Ш*‰б‚/ ;PhЂ†ј~YŽщƒLБ їKPўЁz“ЛJ„ap pСqЎЙOзDИЃn€b3”ff41д^nžдззЅхVƒQjШЫћМ€•ОхШ>љњџ XšгТћю“Oяm(ј6uSЭї+яЁћ%кЛH NBй?$1orф*h~ZINнпfїWŽ(d1p‚Aх/qџ“Ђ3ИџWeї?dйГц4gнџрy(€L[Яа%яЬьа ;@Ёа„4<0> endobj 125 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F25 87 0 R /F30 42 0 R /F34 5 0 R /F35 43 0 R /F31 93 0 R /F28 86 0 R /F1 107 0 R >> /ProcSet [ /PDF /Text ] >> endobj 131 0 obj << /Length 132 0 R /Filter /FlateDecode >> stream xкХYMлШн\}I,рЋ69„ТZН§ЩюоХц`ьpЦ;AŒФ9pF”G‰FšHдЌ§яѓЊЛI‘bK36&1 XВиЌ~ѕѕЊZL8ў‰‰їLy;Б\1YЊЩѕэГ——ЯО{Ѕ№L0oЬфr$/чџ(~;§чх_О{%LяЎœJЯ_M,іыыfЙYGQееŽyмHВo6ллwм№ЗјOd6Š с’єЖnілѕn:SВ,š›:^\яoЇвћUе,яЇвсО-юЖ›ЋъjЙZ6Sщ‹ёц")і=}k2Г†)'&3Ѕ№ЋУGоqСIЃЈŒД§]*ЦЙMЪМЭСРYiкН…ЭЄuХєc‹ (tbeэ™•:Нјз„Z|!™> |гMВR~ŽjQtт™‡с!(9“оM„fмј §їє97Б N™(<ƒmhёУ•шDfšiМ1žiИ }%rz[fД™8flќк"ЃМe\лƒюY™1эў?d–(Б}йп~~‰ж‰чЙ5D LZ rфЅPŸ;n‡…Ÿ§|љLj…$ЮŒзУ-Ž0s“m=Y<)єZ9-˜ ЖЁ7јpzrd-dА†aVEKќ!DЬ Sъ$Eж—Вј6ўдлХhae Ж™єоyЧuxЫœГƒХпцќ "ЌцeФщЎХЩq&Д›Ш’ @ ‘ЧЅялр›?fŒ0S™—јНQјѕІожPЂЯгСа‘ЏlчЋѕzгд”ЕOiЛІZЯЋэœўrХyЖZХыћЉбEЕ]VWЋ:оd|‰Єј+A№(œV‰ €йє`FЅЊ?\зѕ|—БЗ3p .}SrjSрrзЋЎv›еОIЋЧя­іѕ‹Xъ–l:гЪuњ–ŸatЂ(‹вх’))Юд'Я„їgоGњеmњ§s,‡ЙmJTXзЫвY‡R\2+Z—ВONJ^Џя[ЇК8сTЅAugh‰=˜#ƒ†чЬКђ!sЗ@ьізDpnтКЩ/Ѕ9ЧTJљ|:0X+‚жЖ™Е`{лbбLSЎ—" 1шРN6HСБЬР)RƒдХ/ЭlЊdбќ‰@Дʘ/wЭvyЕ?Xы(Я$Ѕъ˜mгћ НЏЙОю,УYќКœзЋёо~WЯунe’њЅ‡м5ЫыbHK^,(ї…їзќзu”o6ёn йлЊ &&­BєG­‚hЎŠлКZЧЋЭ"ўVёчŽ /6wИЖz.Ж›лдЎКН[ЅЅšъппІѕВЭMмпhQ„~YътђfЈbLPC”wЈ$ё§z='Kp_Ф'ОЈ’Ф2]ПЏЗёЦ]Е­nыf<eьVЯѓn(eы[зеjEЁя57)nTйЯхiВ]oНПНš^MT„W)8OMwпoУГ№п.&iЦK?Р иФУаIœў›кLи ЦUŸˆЧAмDk[пZЗ’oDЫкXdVѕэ‹FњоžУ яшk.HAnКчы\†ч i­РWyF!|+ тNБTйЅщu^]л5JС5mgRJŽ•р–};ЗŠмUtAXU‚š$ШЧr=_о/чћjЕ‹zй2Кˆ‘ЋbСЛЉз9Џ$ІV–gаішЕdO{Z}UmпзёЫdј]E‘ј1—z%Ј™яJ]-['V<%_экИ~FKˆС|мЩsб‹zАмХ QнСзHН!9­>ЦЧѕіR‘кѕа=f#ЫYФ[§ЯфЊ1в<ШEHШFАЃЖН2Iџ5h‘ˆЏаЈЌв-бк*€wl—5ЇЙЩlT нА]a}ГЯ7œ’—ЭП­ыdу "ж^рrе‹єmИПаыDC$‘~Ÿqв2ЉЅЖMСlЩn‹Q›8ЁBKu2VЙр˜™GДчŸЪG&†3/tЎЩFл‰˜š*E” "˜OщГvOVZљЎбhЪ‡‰‘кТЈ”жFДІJоQ–6йЇ2JШŠI‡МїšŒgњэсЫКЉR OЕ0лырVšЇluс4Њlu{ѕIѕYSŒš^TСDu~Oїћu—hSИй›' MОфGЅ8ІG8GЉ‚ћnJ?Ъ|Аœ1_К`}вЈПЩим†:v~в/ќ“њ§УЃ~љˆQП§ќQџџžqќџŽsЇFЬаO,•4FDё•q5Ёgњ1ы‡І„mjБ\фєWЬk5є”!y‡@7іћ:ŸШКS%CеaSŒНHY2cФАню8^ёnЏюQ{uшѓГ[•*Д[EYf›/Д)š‹сŽацРЛ‘|Є‹–;7˜яЇў&ѓ‡"цЯfўЖЛsБcАЃAБ ѓј\ќРM:‡|m\ЕдчІ§жѓѕ(CъwЁ5& ŽI-C6gшg™ЃŸt  …7ё№П“”$Ѕ"MPўД№ŸOCхiЊOВPXЈ|€…šGБа#НДєНрIхВЇY‡Uxа’ЈЩi“Q-ŠѕTs#еžg:“`‰ШМFJЁя9VїiВ˜‰d2БІџVк’гhq’€ЃГс(ЁЫЌVODuDЌŸHuдh’€аILcF#ušЭфFГЂ:ккгGEй<юќIЇ…фє“†зvєэK1•œ1сEGщ8bo чMТф9Зёa2§хЇDЧ.'vлГG^ ь‰І­в‡Ц6$5п&тџ,Њаtendstream endobj 132 0 obj 2534 endobj 130 0 obj << /Type /Page /Contents 131 0 R /Resources 129 0 R /MediaBox [0 0 595.273 841.887] /Parent 116 0 R >> endobj 129 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F1 107 0 R /F28 86 0 R /F31 93 0 R /F34 5 0 R /F36 6 0 R /F25 87 0 R /F29 133 0 R /F26 94 0 R >> /ProcSet [ /PDF /Text ] >> endobj 136 0 obj << /Length 137 0 R /Filter /FlateDecode >> stream xкнZKo#Чо\їтФрcxЫіДћ§Аa GС:РbшАHœE,%дюњпчЋюžйЄFZm4У™bwзЛъ+ŠЧŸ˜ Љ˜чfцИbвЊйтцхg/П9Uz&“ТЬЮ.#щйХ?+УЬI-„депЎ–Е<Љ•SеХrГ]/ЯяЗЫлеЩПЮ~ўц_‚“П[KЫЄзq…ГЋ&бH7 Сy“?eœ‰GЏS8ŽЦ)daЯДГК'ЋVBUЫMКЮщЂЋЭнI-]е,–ѓыєd1п4‰фі2=й^хпмЬгэўТПpУ7M“ОržVНО=Сх=^ FЧе*0'ѕЌšimу_mOjmБd“ЯВКиЄ'Д4]чё*ЋхŠ–л6П6ыєрnОžп4[|мЇšyыВ<П,HKHЦШяЏ– Z§*mЙЬGˆМгMмњўцDњ–Йu>фe{ќ_зMГщFv%З,@C~/Avq{Ув‰žШ1­ Оf˜р‰њГвСѓ*ŸћєФЫъ~Еш O Iu`*ДД?С`%щщѕ§з'ЕЂzKЊ)ьр<ныf{П^‘нижЌЉюжЗчѓѓхѕrK2љ-ННhVzркб†@Н-šМŽq.ŽкМŠ6к|` ж=LГЮЦІ–WYњ&ОZ­4ећхіЊ 6gї­/ОО/щюŒˆ‘(:н+pY–ЖеѓзщгEѓ zе\$Ђѓ(Дo 2Љ іp˜‘Щ/3я$c˜sр‹Й к7ŒШЫYOCš/lЈ™123ђЖФ)gжДœF{љћъћ(c’p<мЛH­щх_Ю^ Ё˜dњR0mэLЦ5d ƒєГu3Л|)к№л‘*ЭЌp]ќн‰Ё|h2€Ср|ВЎI6юмIƒ‘^ЊА?C˜/mяb`јпя,mПњЮЦ;жЇ=Xќ2НШDxI"‰тQоЦ$’пяiг1ѓЌ-ѓ:Œ@$d™Ьpr‹ƒ8@n–У4HЧBяGЛє‡3QЗ—vўC!,$GILАœшw3"qЙБ UD1ЫŠZ,БЈsН™СJЄP‡Е2˜)Й˜ &%ЮТ!7и˜ДC d™ё6_$€@„p€ ”J`Чпш$i‘цУнžЌфшь СШф`єyy+•dKѕЂ99гCяwo[qZЩœ†аp˜аљюО8-Ђƒ&ЅrD1ЩуF6ГIк)‰у‹’8`”0ч!'G"ъLЇVЦV?„•ы.Y№>sФ‡шŠ`/С™цА+ѕ,IдG'ЬДг“ЈC­cі’(’AJЂИYPEКтzО]ОЃ”аЄє0LЎ!цR<МЬ'ќ6e7Я™ЯyТЪ,^Сїb jBЃЇЇ ѕIR.ЎzІ-œЪТ‡jп мШХљЈіхF%MD,ЙD~ OLv#АЎШ™ЙI‘ѓ{Ђ'b"1ЃИиsV“БR&O‰$Zvщм<Њ ЯLгЧ*ѕœjўPXЦBFr(Ѓу.}ёЁ\?ёNап—UЅe“_э ЌX9фw?ёТ§<эг†ŸvD‘ЅyЕёуДdЁYЊХ œy u|)Ђђ$Щ[ьЫеДвХу} М(yЊ]О‹оЃ;*%Ь3 ЧЂ;ЅIE*z|\GШ~ Аз ] ‡j B›лЇf]Њ№‘ЕНpGЕЈ†СщEБЦВHОНІбdмn›q(uhЗ7wзшг‹ЖYЅJ<ЮRЫU[ЪЄ0‚”yŽta(ёdв7гГыwГ…V!ї ЪяЗ\єp{5пЖwХЫ!цIёQИBˆ•ЭWxwbL5_/ччзMюЕС$ƒNЗљА@ Д)…ЋŽ‰q8ЗPKF|кЊ‰Ws,ŸXмi9чpа/Л|в§ВXщДАюБhh‘" ™diт •ЩЋеЛkуе›жPіЩpД6Žu5ПО/ОюК‚ЙЈ?лDАЙoЁrдdАд|ыјЃ”тП Зн…чRТЯn]tбЁI­ ёУZy'`6;Џ &ў}е\4‹лѕŸINOEM‡(ЂрэWIŸH*щ^UЇЫ btн$f‰h хiП№ц~CpннЬ—ЋыпвлэmКRИЇ OЇb,ѕЃ •AісbЕh6фНREиO†]иžа1ш[{ЫŒ№?zасЅ#‘‘]Ј~YШ=Ю cQDTЅ ;›Џ.J[IІŒ;Кг(Ы•Б[єН=Щ$™ “PЎк€ ƒ$шepсPщУ|ГЙт^,члFй‚ГщŽЦ@•zT)&c•М *? сLP<уЁz}/cdSѓЈPyюЗ]m"Ѕ›§і Чи%Д Ў№WH:.%­8}ћ’ДюР( т‚ёТXтD f[qtv7ZvЧ­щ‘,в™•ЬƒЎ=L)=Р” ПЦVдѓ(Ђt‰( вхQ-ЪФбmA(И:х`TИХw…eP­C ƒeJЂб` Х. ŸХти‚ъx?FGQ`ћXwЂVбXЉмЁЃ)ѓZ‡у@н|ŠЊњї'Є.Т‰ЄyœnbW‚‚ЪhˆвyтV‰"J)Ш15•Tё= SюДIк†ŒvmвИp –I#фЛЩ ШA[EГ7‹VOaРDuђЧAЌщфБњƒ+Ъ8NЦјтЉТ'№аkgе^7{(ЉБђ‰ѕŠгd2Fи"ЩlФж:9И‚NиЛ„GЈT—Уўsˆ$Ї–aMTДb.Йџ(ЕG<Ў )(вIѓЖШ#хsэЈ‹іЏSРц1\. jРЋРхЄЮ‡рrxŒ|“аNФFЈ78Ь$ьыE—WDдmdƒusQwGuЫZДюБ?юšhЙЭ›QжЊО*•iiе‡уЃEсŽ{EKЋ№ŽD•PuљџаџиГРC ЅЌѕЗЅp‡:НLОиS`šЌжˆиf4ЗOеz,4Р^ГAЛgƒ]ŠnŸ~ЕПИafЗ4?fл]ЄVЇ8Uі`\Ty\Є-Ђјc\xdVЈ!i 4№сIхСЧŽ.аћ:.ђшB>Ыш я}њєšнIї[ŠЎІ–:џ@jSeаѓнZ;—дЂьјwЃёѕЗHE9>4йј?Ћ'эSG(НU:6‰ФйVЊџЙсˆІсˆќУ‘џKљˆ)Œ|p cЛ)LДБRh№џnЖ]šG‡8іЊ0€я`~u GСZІiŸ2­qSQйЗ\4ЌЈ= Ђp,…зVчgu№Ьћ№јj6_šчЈ0Еђи)ча:xњ™ЯsCGdžќ™NŒ}чуŽ,‹GF*мhЈМ5TW(э–†ЃБQЉ"ФГbњ>e'sj8T-dЉ˜pЌfBF№а(Ва'ЭеN‹);тrќШФЌ‡Ў2мпtв5‚Tё>Я!o5ќoŒ]њіendstream endobj 137 0 obj 2667 endobj 135 0 obj << /Type /Page /Contents 136 0 R /Resources 134 0 R /MediaBox [0 0 595.273 841.887] /Parent 116 0 R >> endobj 134 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F27 77 0 R /F25 87 0 R /F30 42 0 R /F35 43 0 R /F28 86 0 R /F29 133 0 R /F26 94 0 R /F1 107 0 R /F31 93 0 R >> /ProcSet [ /PDF /Text ] >> endobj 140 0 obj << /Length 141 0 R /Filter /FlateDecode >> stream xкЭYKoлFNЎОєR W) мьћ‘ lЄвC` >Ms %!jS†D%щПяЗ\.вJЖ[7(rаz9œљfц†Э(ўБ™sD833TЎХlq{rvyђђ\р#NЉйхu+yЙќ˜§0џtљыЫsІFЯАВЂ{~>З<лж‹ІZеATŒE%RёNітЗК\–‹ењЊшћ-{1Яuйћ-ї+&ВxРRJJŒюДЌЫfЛЎ7ѓ\*‘5ŸЫАИ[ЏЎŠЋъІjцмfХЇEуWМ•ƒоYЮ#œq,$‘RЕЃYѓ\p}™+™ыЊИК)ƒ-мŒlq‚Юћл'Œ„бhlљmQ–ЫMBф„2ж‰}HщЁDc^л*‚ы•эЏЪ.pkяЬ„~•ьЬ%“йЯѓœ“h№K@—юœЩb|ьЬ$ДСЪ‹уD+ѕS'Ђg "Жѕ aШNШ0jZЖЇ"ŠЭ‰з 5š(\dЄ†'n'‰–nЦ‰‹ёOAJЅФCл† pГй›„*N wбн ]Ž0Г#BQޘAђ(2 ŒјPjтtА[3Яу2ћхлbУВU]жsќ6Uqƒ #ВeЕiжееv€уф\ л6МТKE ђјЮ_&шУoаЇЈžъkwЊMxgЛ)—НUvn‹КЋNўЏтююІZўХMxгћ}],ЋUlљ‚R&(„‘>/Zxб ЎЫ[ЈИ есЯЊ.›jБ!„„ nkФЛЦ?5йВ W(ых&ьxƒ§{EјщnИЉpЖ7Г Rы2ъП+жХmй”ыD@ђƒї5њ4сYKŒQ;A5’GcTГOS\p(0{ PЌМ‹OлRТЖУˆа{эF U…J‚ХИн8PПЙ,ып0qcuНѓкFyз дЩICъаЪwб%ИЪОVЭч˜pL.Ю42хH04 Ÿі–e‰J%kYЏ§ЊНЧЋDЈsЇк—sG,qКо+MШE3.pi+Ќєх+ЪЉ;ќ ыŽ;тц™†эЛїн`вЌœєсNьYЊŒЯIэ abГpLrB9чC{BŠhtѓ}­\IЃЏш€я6naОђ™fр9ћD™цDŒСљ#2MБ—i@cH,л[ФэM1-KћˆЭыЮРW!ЗРБ,…яЦъVst31‚*ЪUЁН§ОgИ—uQj|"WНHŽВ‚7r7,O™cар eмїЭшoI5К>@ч ŠeJгp\Lб7љІВ~ћ,Ўи=%СмSьЃJB‚іј&Щ­йЁ=ЖЃ=geу›Й‘џ€цЮтћœю5кв/ГКnЪn+0ПйЌКзЪЭЏЂб= ЪS*лўˆпюЬuQ/WЗ Њx{7’7jVИmЋаDІm]5aЋ |­\wф?<џH}зГ*cŸ@“”б&yЧMi’Qƒr_}ОzmЋ š"Lиn гјСЩ}ЛNMƒš%Б'Ц‰6]№SЊЗqДЎ˜gIN->ЦРЌ%TЦzЉžhКу§0ќжУkмЮк_yА=Иё”0Д•L1ЙKФdGФЄ^kј—pЈ|Sўѕ жЕIб.АnJЭq~A•муDIGv$ŽџŠМyfЈцJћ:vo­ќюєѕYz&vСБџ 'Ю˜…ѕ‰кб|ђЫх‰CN€„хвb0uK \lD4ыrv}ТтЏ(щ0 иG?y%‡Ює`р}—<}=їŽNЊтЙо/ѓtrœ„•8”†=OQТvРŸ8uРЮЅНMС(X/Ђ‰шлЭГ=о ‰ВбЪ”‰%ТyvxžИыиFяЖ”"&эЫVЊoNњяУрГџФЧfАѕ,с cйcœ1Н'xЌчгУ ўЖ4}[УЃЊSЗT™›оvWƒ3;іZEє';4Є•UЫ% zЂ€ЩшСѓЧVz‹>бь+=з4”lПи\жюГ§р…wЭѓ36•юŸхŽд=ё0š+žlАїЯт;Ю Ÿs”ќnѓ€ИwP§<Ь<йЇцЛФ•ЛЯБё.Љ ƒЈЃр=ъОCЏШЭК?’Ÿш5Ж[ц`ѓџуПЩН:фВш{фпђќ1uendstream endobj 141 0 obj 1709 endobj 139 0 obj << /Type /Page /Contents 140 0 R /Resources 138 0 R /MediaBox [0 0 595.273 841.887] /Parent 142 0 R >> endobj 138 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F28 86 0 R /F26 94 0 R /F34 5 0 R /F1 107 0 R /F25 87 0 R /F31 93 0 R >> /ProcSet [ /PDF /Text ] >> endobj 145 0 obj << /Length 146 0 R /Filter /FlateDecode >> stream xк­WMoлFuЎОєиcyЄ€pГпЛlа1RщЉ‚ж=P"•А(CЄћпїэ.I‘вZvŠТ€HяgчуЭ›Y–PќБ„qA,U‰Ё‚p-’ецђъцђнЕ 3„3•мЌНшMљwЊHОШу2§НиlŠE&ŒLЫКэvѕrпелfёЯЭяЎёc$W§Зз„[щ5м|­№•ЃСч АТвК BлuW5AhпVeXьЖAЈЌк>[dмІНв.hЉмЎƒHцЎh2gЌ3I"Ѕіц•л іs>,”L‹]],яœЪ\сИ[Ъdу­ШMъѕB0‰…{‚хЖюъ‡Eo–wUq$‹ЧК%‹LK•~ъТfY…ЏЊІlд.АќЭ§lУТЉњSыћГ8Є‹]БЉКjз†Œp3ЩˆDPлЇєC$eŒmL/P4eDчФhж‹\EtфDцƒ іьFРГ@‡!№м ў3†+zEз $4ЋдФTTЂБd?z„нRE?М]dŠБєЪ?eњ‹,fВ$ж qйUн~з +œ™dЮlzПл.‹e}W#?yњЫЊikŸАЇ юА6ћ,€н% щтD11Gн­\ЅпъюЋ{3'™œ9Ь#”šsЉЄ„*yœЪ™’SЉ SМп№5-ЙєЮџС м4Ф* ъ“ж+Yї‚61Фe~(МeŒ˜\WоЧ aр^Х\v#‡JЂFƒ?ЧƒЂе€€аІПФpŽ#9O,ЁжN4Б= ]!ь! —Пн\2ž СŒ9ˆYPЦr$xЗЩЎJж—ldсATX"ДiјˆJƒЩЯјэJEы3hАГžњ}Z—–H*ёЫ)ѓbo"чИ4иy|'ёшЃ+I.єдСFM„jњЂW &ЛЪVЦLD0mžd‡оD\кX=о"6SьKЁ,13уy>жFІhPœЂDи P"gњ9|*ЊC3ЁtњkL­F2 гg– f0‰C$—џ‘*ъAиЫ~?‘‚‡;&RА]`DїВкogьяŠCЛtыS‚ЕŽOнт–f}:”ф3њtNxюILN”tUˆє›р)zQ€–zО‘/ёHbgјFќgОaYŽЩ+рˆƒрULўŠаЮРІNљЄ„вžL@M–єФшvcђzа—xYОŽ—хkyљ1кhєИ€жГЁ.c:˜Fь†XЧУфCЩ:‰(ZѓЉЫQr1ж|ŸПоcrжц ‰I˜aGюc<ВšXdНžStДWЩqЎћщФ3д„ОO…lѓшдјe™љd"…ѕЃЙЙ›ЃнЃэиUэFOЗВ*к*МЙ1Ш=CбуЅŸљšЉbА‰д:Ь<‘ BЃ(l_№ъмЬJs§кМџˆ9\ŒxЄдн‹ё0эФG`с9}fn‚*ЫЬhтdвІСпмфsгрfGёa˜žоЯ2FбR]Љ dPШўВцsЗ5‘~Ќ6юa”уз/(ЯмгBˆџœЪЭ‡l (tp{Y7л Й/к˜е MФLчЦ<НƒшЊшТш<5сй žfQctЈц^м2!}ˆб№/‡8ЕћЅGfYяЊUЗн=ЙŽї6œЕкn0VWэьdИЖч m‚ДX›RNкTэеH.˜и B,јијВpџ^HшjЛzгGТЩї7Їd§|ož_љЎЏм)16б$g“Љ+гп*ИЄ§Э%юЙw{ч…ли.ЛЂіs=G•&ЙvПйдЭ—№йў~Њ/uSжuЙwю:Y€> endobj 143 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F27 77 0 R /F30 42 0 R /F35 43 0 R /F28 86 0 R /F31 93 0 R /F25 87 0 R /F1 107 0 R >> /ProcSet [ /PDF /Text ] >> endobj 149 0 obj << /Length 150 0 R /Filter /FlateDecode >> stream xкЕWKoлFОћWшИЬ їНtNvR)р @U_h™Ж HЄKRnРџН3;KY’)J(Rш ’;;я›™“~bтЯЌœXЉИБj2_ž\ЬN>\J5‘š;я&Гћ 9ЛћЮ>=цO]бLхГг›йяАшŒ{ЁƒРUо5хМhI"Џю№AГEYyмVќЕЪЛВЎZмўсR˜‰Œ!;‰б\f6(›=–ЈШZ6ŸJЧжЖ­awE;oЪлiп‹(д=є№ддАЛŠЛUгЏ’/Аѕ~UЭЩ>}ŸJЯžЇFГМ\фЗ‹ CГВ"їдІ{JYюс‘Р˜}ƒhЂа‚K/ЃTW˜ tЯ…r“DhЎЕ kOфs_7K4ыРќ0яъfЫkЧ–ь?єБюїŽЇ›`ƒ(X bmН uєЙ}iЛbЂіЌОЇkb@‰IzNƒ—DC0Т#z"—ЂgKe\xФ,гDЉйŸmY= S тQ’тi)bJ 3e0 ЄЭ&Ь‰FяŠЉаUр"#ЦссО^,j$ђoВŒЂ/UО,чє’7 №œБzэ–—ˆb{†.œќ6;†[cСИPмёЪ@ЈJLRЎ2?iŠЩ=Šш "=8W"V$ЋJю„GAХ3эжeЕ(хШѕдЫ5ыЛўѕойŒCbBЕqЅдˆeШ3k№eдфUŸOdЮП3чРТж„2мРкsyЉ‚R3РGJ­^Iюф~c€", NЩ!b‚ˆA)щЦЈIdjyЊBŽ{­зŽЋ!ЧП]/= ‚ (орЉ#!уVк T†•G6•лУЪ­уJЪC_.jшT&ЖšкpнсyЕФd‹ДЁ…ЉIп%ХN ТЄсrги@)+ВQДŠ5у™р>•ћcM„…R“АфЙsйŸТ@я3}гЧќKеmsŠ™юд…uЇ ›ж џ˜R2‚лƒ•єЅBОКтЁX „хvМ~tЪ9 LЉ@ œ^§95ьЇzљДƒІ‚mй/Ћ4Ач‘МуЮлpЂўEa€і}AиО bSЖУ!%7оэш˜OaЮЈ ЧN&ЦjbЧІŒ,Žv8-BXudE\дѕт% ќ7…‘MДЯичbОШДЋЖ'˜–>…qZѕ)<фO`ї dК№agЦB_tŠвшВђ,Чё5\YтЪщвѕ­XjЂv;5)+’‘ж> endobj 147 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F35 43 0 R /F34 5 0 R /F36 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 153 0 obj << /Length 154 0 R /Filter /FlateDecode >> stream xкЅWKoм6ОћапА9E XŒјаЫEвД@…›ДФѕ бJ†ЄЕыпЉ]йt.Е"ЙCrп|3фЋўљŠЇ’%љ*O$™\UЛ“w—'o>№tХ9+гtuЙБ’—ѕutБYЧЂбД54аmлУ(‹*=5}‡‹<Њq)ЬH2]?бњИЏ*cъгu,“фшŒaаkQF4mмЖлц~-ŠШtOЎМ_Ї)мЛ7ыя—п|ЧzJžБЂЬЖ]г’ЬТ^0•fN„­c%TєЅ?EЩU,eЪd*W1WLЉдЪ4 ОQ1 vнYыњqlnZCKSп4šЬ8Й•­Ё]ƒїэtPV(–%м™В#l•Ќ8(&rКAЅ7tћпыBD§ЖAМwxцоІ Ьl8ЅE‰4]н  (впY‚1b—Є=џжS№ЬЦ ІЋмIКГqp“™dPc‘А‚/bZГsюЧИ•yд0о+”Š0Q Ь“”qЉ•\§ИОјШHQ:pn˜d)œШ9ѓуњcшЈ д. 'иt:"Ѕ2ѕ›РЙiVњsЏ^а.Š_ЊK№S–-Щуќњтєу ц–ѓЅŒ€™Lц@Њ‚ƒЁ|†ШЭ"мBDф шЁЃš‘;€ˆмˆїЖлЭЙ‚kO0‚ё‚ЏЅ`Љ/goCѕ˜2ёjrwя”ƒЛртGšЭZUНЃ Кi$У…LqЙ№„ЪвˆюмїPўpъшЇїB=\1xіrд‚љ„фЄDє Ч€OLЫ€Е0TЪ›ћŽŠУ™+чуg™єХqlvw­SkЇ‰ЧР-9d~QЮ—„J…Шbс‡%нПЬutыјjд;GxTŽh|уыn§щЖnuЪб2gy–њф %ущМ ШШ$ЯŸЖ:іМОrЩЈ8w•ъUШ,Т2(Єх5ѓ/‰$Р0K_O"T+QˆрKIlхMM;Žи‰~oмmК}РАh ЩбsTу…ЇЁ9p:ЫмуЬtфdь!pѕ-OУЄюЛзEcяЋG3yЌ2ўЬ?ѕ‘@?Јл;= š]8aЭ44­  dПћЮ ЗSЬмDН ЖFXW–сž$Ќїа/ SuЬЊ!ЖRŒ—я5Д?“ёЉ[І,T;rЎОёД%—#+*M№Kя|щ Њs.ѓ_’',™GJvњj† €ІGNOНЌцКsE‚їœ OЁ^Ї>z‡ŠmбЛB:vV‰Ќ -p0Ч3ƒ>Xи(ЙпцЪŽ3—8)AtДJти)lі­ђnЗПъnшуg8ІЉ2ѕ~РW№sєаи$ЖЧ јЙШY5žМxЏ‡€Ѓ…€{=e7{ь_e"Ђ‡­ЭŽDљFo:Жчд–С n =cчоœ-Йn;m,ŒMћlцZЋ‰бЌ‰иЕe"њЉџЁБg•аˆR'тЧЪJзZЪŒ^Zј{gЊ8а›qдƒЋVW•@ыОhнЄы/mAvT`ŽŸyfЦ}‹вщŒШCЛHПєšщOс(}юЅOщAєщХ—ЩнћХ єE™ХU|ЋцŒ _˜І;ШЌ-ƒ< U( )UЮmv­ф6’ŽЯкаћВ>)ќНуžђ”zn[`/ЃЭFИEгМmlZУ‚хcћƒ@R†*І›!Ё8gP МmУqЄUC^МмТВАЉѕ?€CР/№9оЬДgј 9љуђф?PIV(endstream endobj 154 0 obj 1691 endobj 152 0 obj << /Type /Page /Contents 153 0 R /Resources 151 0 R /MediaBox [0 0 595.273 841.887] /Parent 142 0 R >> endobj 151 0 obj << /Font << /F15 7 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 157 0 obj << /Length 158 0 R /Filter /FlateDecode >> stream xкХXKлFОЯі/шHЃv?йd9иN˜…_XЫо(Љg†ˆD*$хxќыЗЊЋ›"%ЪA€A‚F§(VwU}ѕj1у№'f™`y*g–+&S5[яЎ^,Џžн(=–IafЫ;OЙм|JR&ч !ЄN^_Ы]Б/”UIб4Х\ЉфЇ&iЫoЎ^ўћй |.€П \8dкѓZ>ИљB žь"+Э3b%3dЅyюYеЦэч иpеІЅНКЂЮ3‚…ЃјЅHъ;к.шчЫм8І,Vл№н/мpIї•ffYnёЖ*5ЬX3гLЉЬпXЄB Х2PптHі#RЭ@9гЪЮB3­SвŸ1*%)юM5ŽeђkЙ­a.p&’е\кфБњЭЛКЁAA?"]ЌЪŽЦыzЗ/ЗЎЙЦЉNЮ…2?B‰)!$ЫѕXЯ_ muІRС”Ošђ[їх}1ug/Лд’8a(Л—CцхЙN”$9p)Ъ Q.’ЂкšiМ™q@–•yъ-;кZmuD›8v–&Й™g€††ищA ѕ $g™эˆХЧOœБ7ŸƒIУіP,Мƒ:щїG*YN(иІRјЂ„2Ѕ[+И_[—$xnaиŸ_SАЊШЛ7SхŒЪ–xн—_цоƒш|ВйЩ]РJ;$:l‹&N^ˆ”Hяp…\ъpЏ~ЄпesЈжˆˆяН­ 8й3кФ…ЗwИЛDc‚ xщ‚іхП&ЄYXЦu>:гG™ц!и€™y@ЌuqsSўУ5 /жбJ@ 8MиЈЪT5b~WoЗ5R§^VїИ”ŽЋЖ+шМvJќ2A,3ZzA^?џв]§ММЇБ б%A^!gŠЅ9`‘Љ<›5nvw%BШж)гR ћ˜=ŽЖd§›WS€T)3эyяš(Г,Ы"†nЖuб‘Xpt‚ КuмН(яIО{ћ—o_П{‚ыП„Гu_џnп<…њoЋЮнЛцoИџ‹Зo_=/ъzы(цўХМ_ўч юџОkаЫ'bSІ˜wZЫЌф+ѓLRžЩ(лeb<0јzЙG†›}фG’з`ЙЌшЗЇkD– 7хЮUmYWž™JJŸнdШrтј‘CЭWT:ќ`є1љYCіСhИюъsFn§UTЂRє‚ha(ГРт0Гф>\њ Зњ‡БqBл2ХФuр •aVXЬОLdі2Є‚‚‹g=сwQёёч—Si3cкЄ„бН—$e>JЭ(P„ГтЊкtЄаbлжЈtыu:Ѕ :‡Юmhvзд;ЅбhYВoм—В>ДДLйиb6ОІВЅЯD№љЦ§Т…Ўz\Žѕ™s(?Ѓ,S1jˆоE;хŠх<њШЛК„дL№бŠёо•ЎcV­]аŽIYоkЧаqTu–Јю‰EJЊ“ЛbнбЈ+ƒжЇВ№Knч‘хš–QЦ ЬBeачфЁQЁy>ю\ЪЊьЪb[~+:pА?lanё 6јГВPДbE€зYXфI{XЏлДXі›M ШSЗu;,U m$lћk!ppЁЋщї›kТ+*ъ`BžП№њч#Xю\SЎёy8>O[ЊКЯэo!FB™ @Д› Єœ.Zџx‹, Р'}P№‡e{;œ -˜Nт7ЄI^U0k)њњёшŒу2^„ј†З“уюcxІШЌ‚ќšPT" ЅЖЇ@€5Рtч[P{єBЦиJ;hФ&ЭкPвŒЪSl‹цоЯЃ2ѕЂЗб`pщйлШО§Ем‡Šus1–џ^v@#‚6Ѕ€яКЂ#tMп%Жя]їќаеЗ TЕЗЛ/г'Т%DЅbЬІŽ NkјnIб’b,њ[MФnXj/œ ФХЃ!цšLіЁњмх!BЗ†Ч{~<_ЯздїMБл|РM!?ЭЁЏ§2‡v4џбєп{Ч0ЧN„ZЇQ?€Б yТNLŽЈ}Ягo>xЫSЦ%Сжд  7ѕєћ>ЎMД2ЃŽшŸ“bYРё Dv$'LЮ#ѕЋе;э†˜{"эfldђс"“,Pl\UwRTЭCDЏA]4ДDиЅіћXЫј9y_}№ЏB2Є…ЗВк”kз^ЧиХч/>УаЯБšв4i&ъруЇW+Ц>Ќ>OЕќ9ƒ.1žœаўv р~L‚N АбЙž‡“ЎЉ[О|,9†:qŒ!vJA§m4 XBњdрQ™шС#Ўщ-фУjЪy!gŒ#љЩžŸМФ/=…”ˆ €Hx )XъУе!†дАђ–‡a&ƒgЭyС<|8щaFеЫ‰С€SQнCзPЙsбъ’K–j50Л@S“B9ЊЇrвє2g§ЋаДхЁVKЁVћ–џЏЯ&:есюыкэ)/тдПЏїwnW7ј€›ЊѓŠ›ња•>К 9FњЩ:*ХOхюЃwЩрЧqwh y*JєЦи„l"І5Чz+MЬ•Z@N9|э6‡Ц? i™l|Fч @‹Ј‚\)Ъ> јИ‰ТJќœŒОŽЄс&УКЊџЖЎв\њjЪ+ф]6ДДnˆS‘lЫЖУтЬŠЉЈuєС№~”r№[j&кР˜6ъh+ѓЊ1њЖ#ОНєzИ+Ј|7ЈELЏз4 Ќщ,хбАн†,iŽŸŸЈ>дiH…QО­“Bб#Ж‰нсџ~O)Нendstream endobj 158 0 obj 2127 endobj 156 0 obj << /Type /Page /Contents 157 0 R /Resources 155 0 R /MediaBox [0 0 595.273 841.887] /Parent 142 0 R >> endobj 155 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F25 87 0 R /F35 43 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 161 0 obj << /Length 162 0 R /Filter /FlateDecode >> stream xкнXMл6-zмKџ‚Z`Хpј­9фГhnRд-$9hmmV­-m%9iа?п!)Щ’Э•М zh K‹дpјцЭЬЃ`Aё,€qbЈ\hЪ S|Бкž=Yž=xСХ4a ЫkЗtЙ~)"Яc&ЂчUUVч1зEWйzWѕyФeФгQ,ЪЧašЧљ Ќ ƒš УЯƒŒ“†аB 9цЅ˜ ЛoŒ-њsfкЅuзшѕn“Жuo›6UўgЯjL4Љиššс”9MЌ дЈ“бФbќ,піœОњЬЧbўф1П/ ЪХOЃєі™zЕщZ[ОЭŠ:/‹КЫ#$“ JM4= TeЧœŒщeйМyжCŠiŠяЬCЊˆ–ГˆŠ‚(RkЎ‘y>:(‹Вё$Нu‰_жЙЋ:ЋЌ#Је вR€o{ьИэ z%Цf‚”ˆ†ž“SЊ•SпЇЛКŽ_–екU2TUй&пц2KпнВJ;;?\ћ%L –uкяє$`УЇЌŸO%mmшСAЄь–Дnp:˜зЎћљoяЃЦбzќўШEЃї.ЦKH,цыРyXB˜m‡nёгрy4№љѓ№ЏьЇЕ{Ш5§JЪj:9цЧŒG8іLЎРлпД6dП%щ€ƒp^MЦ{оЅосКмьіЙ0ђNvп.ЊoCQСфfн‚І<€ЂўR7йжœРП›МШвЪЃЫАїRБяюжHіЧЮс_м‘ŒшH§$ф•™NїиBxЃ ІNЄњEЇ€ж~аtwЌu†bШ2ЅАanќl,˜[дL­€vžДИ РЇVѕ ћі<ПЫыЁъRъrЯКЙ|{ЛЩАлY 6Yыvоху(rЋ(t Е|ƒUў&ФЌЙ кUi}€CрЎ9іюa`g<bb"і)c|и].њTДц1B/iНКВрб/WаX;z–5Ў{m-+лНэдWђЯ7йо:B‚nНбў Ў§.DuЬоъ5–Ё,ДX.‡ДђAtљŸ(&Н\=јXrИŸрЎtŒH=Ў.œJBёвЈ.ќЮъ‚Ђ#Є;сНяыК‡\Ф!г0!§ї>ޘЫВЩъЖ‰1q™ №`лС CГTѕ*v›кc|ёЧИBЕgКыъџx‚ЏšВКшh[ђ–#ЋДЮi ЏЉ{ '}%zd?BhЄv/г†… lњ CB—nъвьшH­FзіћU jXБтЊћшё7c€жendstream endobj 162 0 obj 1745 endobj 160 0 obj << /Type /Page /Contents 161 0 R /Resources 159 0 R /MediaBox [0 0 595.273 841.887] /Parent 142 0 R >> endobj 159 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F35 43 0 R /F24 5 0 R /F27 77 0 R /F30 42 0 R /F31 93 0 R /F25 87 0 R /F38 163 0 R >> /ProcSet [ /PDF /Text ] >> endobj 166 0 obj << /Length 167 0 R /Filter /FlateDecode >> stream xк­XMл6НяЅСG-3т7 $)ZЄhl€IZ[оj[[IЮvб?пG‘”%‡VЗHрƒ)‰>gоМ]фјб…Е„[На9'LёХjwётътщkŽg”X)W›~цењcіУхчЋ_ŸОІrє #УУѓЋлђrЩ­ЬъІКЉіХж]ёlWtMѕЗ—‰ёЛЙ"wќлЯSж1:šЏк`§’™ьЫ%гYйм7Uз•{ї@dзюоƒwЫ]S_.™ЪVхња”фrЉDž§ВёїхЊlлЂyИ44{т,–”QЂр’%BіK{kЮJБнVћг7MБs2л9T‡ЖsW:k‹#HЇъ;їфС_еџАъHXœЋХ’sЂї~йteƒiві6ЄщAјQW{ЇёБгД&ŠгрДŸ‹CлўZ7ыbŸ№ЏТTЇ>MЅУ^a|sиЏКЊоЇ–€kЈ я§VtЗЏš&a^hТe4_yд6kЪюаьУќjgйдw3; њ—WюuЖ.Ÿ4ујЄšРУ"‡*?ЊРќћŸ Ф++.œЮОіЇ5@ь-Бˆшu0žнп–€џЕUx혘UoвUФr;9Vю“eлкБшНч{ ž)ТaуšF_ѕуOЙЬясhoуАЏ:џЮК*nj_“0 ”Кk1•†ЅіыЄЇ]РЦJ9acs„=rW Ыbяiуpwз“—GЏNаЫ€оФЌ”!–™ЫQˆс}žВ6к‡Ж+w ЬV‘%ѕ}3R™б8уЧTމсбIˆ ћmыэWуЪЕтЫђГXТ„шѓI‚ЕћC 5˜aPIд ЎцPKC†sQЂэ# ‘дr"ЕьЁIхѕ]в™œ˜yg:X‘ѓ>$aЁHr5СХ"Ў…уф#Jђ FоњУ_ђ\‚Х\чТŸC~т}LидјЛŽvR0ТZ3‡Ь)Чљ“сЬ1j'˜xHђ’АDаGч  з…пŸCє7’0;IЧ!урЙѕiч™жХkЕЛлVŸr*ІВ5JПгДнP1хXЧ&ї9 m™Шъ€ъ'›щќR­ЫіФЮІоўЋЮ‘ mS‚h ЯИjч‘}”tїFu0šЈ№R‚b ћ‚pёъъB[tЇW-DГf ШV‹њD3‹І\l.hш3 JщуФЁб‰Fуe_D].hХаЂСC‹†Eъ}щoz–Г§ђОQ“85Ѓ'ЫŒЫїMЁ§ }\ћ,­<Ј–cоњ'еl0дfѓЙiн‡7oRTшеЧ˜kwдЖ;ѓB>zИйngкЕ 9зп›џf_e‚k stЂKkš›ѓЙрjЧfуФйdx СPŽщџEџ/Цe мyЎИžcШ›AР‡"~upƒѓ:‡gьЌŽЦ^љ7)R‹’xЬlЏ_ЄBУ-'ŸЮuUq­цє‘+йlžю9бЙœЭ€ql%х КІt}”˜ˆЪЅ ЖX…YоЩЙœљЈнnщ\ŒїpыzYg№кWw'>ЪЌиЗЫ@IhШŒU'”дьbu в.рzШжQ€УCюc sfщL|Л j˜ї \Я&j@XЂЁ‚Hс{$Ў#ИлSQ?endstream endobj 167 0 obj 1719 endobj 165 0 obj << /Type /Page /Contents 166 0 R /Resources 164 0 R /MediaBox [0 0 595.273 841.887] /Parent 168 0 R >> endobj 164 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F24 5 0 R /F35 43 0 R /F27 77 0 R /F34 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 171 0 obj << /Length 172 0 R /Filter /FlateDecode >> stream xкНX]oуЦњш—ў=R@4с|Яh/’R$mэИ@€4ДD­‰HЄJRЛuѓчsцƒiИnб ЌHzxчо;чоs.щ*Ч?КЂŒ“Ы•Ю9aŠЏЖЧ›w7_ОчbE5aTЎі~щУюЇLГоPЪDvwПоp-Г]ЙmŽ'\чYгU}едыŸўєх{МG)Б2ООaŠheН‘‡ЇЊУ дfЧВjжІГ{`В}Бэ›Ж 7E\TєmѕЯ`•‰‰U*б:zv›и–rb•Š ŠЙеSы6VйюМэУ“fдсЗiсм‡І.ю^-јa9‘мЦ}юЎ8Bi\№ИFМЯnе T„ЕкPA„СQЗ?<;ŸN>5eюБ{Q8 /ќŒЦтvї)r’ѓaСR& бжтд4ЁT-%XŒ'№Ч”чЩpw)W6дbЉт^2"Єt1ъьPеeуяžЛО<&6Б’ˆ\ 8ј1Б ВXђ““<yw%RGXа?•ёŒqB&s%PvЉ<Вœp#gБннЇ<фœ(њЙDЪ7 Kdnf{}]жM_ерЌЬлю‚IEн<ќ›.>њSi1D О„ldжЊWШ~iG)йм Ї+MЌŽpЄ9] ТЙёKОJэD Ct—EEН ЎЪ}П9КНЯ‡О:žЧˆЃC1zпuІсkўЁЉЭбLXЌФљІ.У17}QеЩІТТ/ї$‰•В хjрЬ’&ЙƒЪeбuЄфіЭ5ї_ђ% 9f‰ВТah зДЩ,)Sг$%cЩџKlтѓБГЙœ…жUѕ6іЅPJО)OБбВПC#Ÿ Ј36nпФ=&]“џЧ9ќ&›№[ѕ]МЈŒ?Ў=t%ё€7KiН4DшšJd‡ЂsœІиа3§SП•тYз‚­]И‹зЧт—PO%”˜€јўJd9›D#%R™$Ѓ• nцОЮЃeшsl)Z]DON˜Ыq#атоЏ CпCIXъpЯ,Еœ{tUЫбЪsЬЫэ’0cbЎ„Д|A+!%j0№EpЮw3wюxюќф,˜ебl4:]-9Ф#ŸЭ97п<мXhд*ШVPn& Зfе–Ћ§ 38  бХЦ…у >Ђѓ(ъЙ.} №JJГя§ЯўіHЧ+Џю]уMЈайa5їБЛJŽ™Ё7ёи C;ЖЩрњ’!]%д/*ЁЊOчўЕрѓЮ‡†bЯnњю‘!2ЌЛc?'ЯLcєTИ˜‡Дё_ мА:›/ЏŠшUšыхС'Я‡T\‡ EфU[Тl~ѓnг­”J}iMЮаЇЇjыPў4/XЄД-q\1”GJхй§WюbјT 'ZЧ№у(Пя§Gž{MТЌЏў№bхѕ‰ F™ЏрэОРvО oйрFЋИю шN‰ 5љ†тRУщ+›эЯѕіђэiю;˜†цуњЪ7m›0яЄV>Ј‚OеŽЖ„˜­У&atКісС…€XjєŒbw2“юTЖm?flуgЏєgЪ=%Р.˜,|4ћ5U( :m.Ё§х—TоQ#лUћ€–К уG№шЕNyтІbbђЗ:€д~]Ѕ$TSітDТ”г5‡ЁОB0тrиэЋ”щWtŒT`дVЋ;Дм)&`T*љ"АŠ‚fБцбIЦА†N>эЊ &Ю0'$hŒц–pЎg ЙJdoц1‰ўєКаЁw> endobj 169 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F24 5 0 R /F31 93 0 R /F36 6 0 R /F27 77 0 R /F30 42 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 175 0 obj << /Length 176 0 R /Filter /FlateDecode >> stream xкНYKЧrд%ЇмybЛп2 A"У1’ьjaРёa–œеLЮlf†Z+ўѓЉъЧїeЗо#ŠЯk-ŠrЌ№QЛjлюрžm_uлЌКќіЋї ŒСl*ЪмpMИ•^ђLW OЩ$ыQ7Ѓ€ўMлlќ|мG}$Sp,œ|U х1ЕњS>BЌˆЫћpТLЧH="_ЗБ>ФŒ)КjЬ&FиKxptrрEа0ЗцЙQnb,{6'урM/ˆš˜АDЊќ(§СЇ!~КВщЇЏ|ѓ%в9ўeдЋoїЧDўѕ˜&ЇЯ_њЁ:фŒЇ`Џxr7?фˆАU!ž"сЩпžШZ,ЈІ™Пз0 }FКВDЙДН?<ЛH8‘$аA„АЯР6IФлŒУ2 !С7ЗN=‹wXЦЯšШ™СЅH<№2%)јФ<ЄrрD‡`xŽфЯЅPo@vxРиQЃDф€GЅŠПДшї>Фb Ё~šwЦмuечК=і70G!ИМЁњ†є=.^J [‡bзпGrXяТ#VЋ0счzWХ7Уm9р”PНпД]xW•[дх6WE'{™qa еSчšoљє@QмЎ>TMШ—Аh.+Л‘ГЊ#вёsF…М=Км!ЧcU[дFNžoйЄЖ`ГЫA 'zЌ‹NДйC„Y'ј~ТRvкНCЮыРЉЄ|ЎFo"!зП_[€l”АиŸЄОMUЦWЇЉ-fПб\yj Цч™Ѓќ ГuDоіrТ6уBC QЙр%6|­ DMђ№"бс~Qp˜ зФO0Љ—0‰-хq–lНќл_KйБ!e PœўAepгюїўу=ц™YћRpЕ;Т|Џr\64ˆ~O- ЉQІZržб{BуфХ7—/œЇ‚œ ,žЏbыœgW]ЕКyСтY $G@iрxXГъD}Ы3GKšzђqТ‘ЭSOLд{F™)Ёјrт\M„eЂ}іY›Šgћ[iP8CЭ1ЙсЕvшйЄTHЏ2&рqщЩn?RQЭ‹ћлznІ4й€ЧXр‰”ИЭ”]ф:…!д@_|&их:onп„4сaHxфцБЏ ЩN=ŠgфžАЖБФiq:œ!‘Yрєiмoˆц<нplŽЯb$ВЎИ96лщќuЉ;Ир˜ъFПщКŒx`q”ІmИЏ“9Кj8vM<ГkЊ№2e7ЅЎ0–l>‚Бqеu>љљ’($ŒЩРuР–иПХ~‚ о&\2єqrw~endstream endobj 176 0 obj 2301 endobj 174 0 obj << /Type /Page /Contents 175 0 R /Resources 173 0 R /MediaBox [0 0 595.273 841.887] /Parent 168 0 R >> endobj 173 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F24 5 0 R /F31 93 0 R /F27 77 0 R /F28 86 0 R /F30 42 0 R /F36 6 0 R /F25 87 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 179 0 obj << /Length 180 0 R /Filter /FlateDecode >> stream xк­XMoфЦEЎ{ЩЩї9RРN›§Щf‚аЦkРЦ: эТˆу5CiˆЬ’Ѓ•œ?яW§С!Ѕэ1цРžюbwuеЋЊWфЋ?ОтЦ0ЁєЊШ%FЎ6‡WoЎ_}§­P+ЮYЉѕъњж‰^oЮў{ёЫѕї_+ѕl І ~ЈЦџэ…ј\H*fŒBЭэХZŠ"k;zъЌюћЎї/-N]ЋЊ­жМdBŠ/VрmпгJhьcЪ“‰­8гF‰ї7"(UЬD„`RЧгўšкCВ0 f/*IзЕ(q’˜N`м!Вo’Йj*еCтєЊ`ш rqlž џ9:. MЪUЖ–фKWрГ&Вд!l]5[ПБs7žЛъD8Н 1 ZёЗw‹g)VЄ‘2m<цЋ$ыБ"6€ЛД(еУ@СfВMƒ№пњcЃB‹уЇT@ёЋЉроEљ$a ’ШcИ~HY>вfІ1ї@хНџ1бЕћЧИєЇTЙ ЊЈ—j]&ЊВхбWHl„šQМЈ-U_ѕЄpч зW ~­ў?4X‹Ф•StчЬˆ2тUхФЧ‡0напоFв K]Љ ІyЪЋ~Sє-5V юЉ/аиѓ95_­ њ#д‰gіЄ6хLќЪјM НЮ€9їuHв§:їEHЊSЗДщіЧC;xю6ebЅYaэчL,'ЕQ§5щјјD•ЖыеЅtЂZдъ,Œщ?KЄ5},\ѕChЗ(КємЕžwŒЁЂь]ЫчKQј<‡&~VЕ–)А\ъ>Ќѕ6UyьЦ~ІЋendstream endobj 180 0 obj 2042 endobj 178 0 obj << /Type /Page /Contents 179 0 R /Resources 177 0 R /MediaBox [0 0 595.273 841.887] /Parent 168 0 R >> endobj 177 0 obj << /Font << /F24 5 0 R /F35 43 0 R /F15 7 0 R /F27 77 0 R /F30 42 0 R /F28 86 0 R /F31 93 0 R /F34 5 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 183 0 obj << /Length 184 0 R /Filter /FlateDecode >> stream xкЭXKл6ОчвПрЃŒFŒј&{(Iб"m/л E’ƒVцЎ•ивV<њы;|Щ’M{] ‡`5ESœ™o^пЏ јУ+­'x% Šˆ Ћjџф‡›'Я^bОТiЮW7wюфЭцMіќn0н:ЇDdЅџЈЪнЮЏ†v§юц—g/щќE)PЁxxћ—Вjokjq=HcN=ѕзнM5дm“И”ST$џЕЖ/К.q+ƒ[E”н™aьšопн6&,ю‚юk"ГOі_ы7LзЕСа Жрccњя‚.ХLHN0hЃ$,в ;aп$”†•ЂџТ!!ЂaЕгMf`žн[EdfzПяд5ЛJiЖ3M@)ŠTСЏUъЗЖљБm>&41‚4ЖЦЂЂъkЂВАѕаym+г}7Kѕ›v№fUрcxі/wїЦйГЪЅD˜DX‰“{Г­УЫўv№йŒ ї›~€mИхKЄ_леїuSїхаеŸН‘„ЭŒ$dŠъ p0—с@Ф]Ў0C”  œ!%Х*ЇvOЛƒС{tcLHі“i+Ћ‰YџїX:ѕeа аJxKФРm9! žœ;Ÿsц~P"‡"гщѕНi^—ЛўmС‹ч€йЋ[З йqёЊмпnJ8ƒSв!е1рTэўaМЏytЫŒфНЭDішэЕqZ@€­r€’Y(сŠ)7ЗСС‰œpƒЏчо\Ц6Х|Tшљ›WЗSpцо%}ЬWdюdЋGBiLыhСlЩГЌjvбmg6vMГКё{ЮЛАэЬgџ№бхrч††‘дбWо QДЮ%W1NиYEЪfl’ Щ‚-0ЏїЅM”ю œ‡?”н`ТЬyУ~z§1ЯB'j%‘–9Т‘вj‘O=DУ60EЌЩЧЬ ’^„Я€„uъ˜(ч—9D6–kЌшЯ„’ AbpLŽ.…† Ф2 Ф“wџ•*– 9kgDZєОўUЎPкв§e­ˆѕУСSjBCЭSФнра ’ecгv€иЋЯЬчЪ< ўаА-яо ФмЛ‡c…-ЛяЧћrpЂСеuзћoЪ‡ iйMG{S3НніЇќыV>(`1щьЗЅ3ЄnюNХB›Љ:[i*kћzйAfБhsоЦЂ_Н-0ыњХ;g9љв"zž80…4хз‘"“Юwэnз:в`[Rю)ƒцњ[‚Љ-бž{|"а ‘œ#*фтАчVЧЯbУMк‘ъFˆнцЎѕ‡jNеюЦ§4уЮшѓЉlиRЪbГ>0інЉК„ФГg‹UЈ`ёдыtБ SˆNU Ц;ЖŒЕŸm.HrA‰A)’’Кў .є уДђ§AešNBяEкЌsЌъЂt žчR§wёоAўZ№Я)†œ@k —0Є yJ?9emN„†A<’Ј4г(ЃР›|ОqFBKf0Ѕ&‡ДрšLSє1Ф„о8)<F šxКр„ю­й|BАу„6‰ПЄ:бє{4Z юH1Я™ЄbгdSЁ7ЊПХ‡Ж1яХpИЬVмэ‡c‡|ъL<€ц„_І$tз“xАwЦ~qFgЁЭщЕqд šјCЮБMmНœЮ“–фTjVЗ+киР,Г/wѕ?fГфѓъJ>OёU?RFŽљМЅB’У„YюŸ Щ%’Юhќ4\%‡O DS’упRon№ѓеŽЧ:mK"\Ї—§%ѕsdр™Ч?Ї9ЇŒЛнгИђ[g$цLЧ‘0Зѕ ЦkПзŽЭ&5w}…Dt•Kя0 ("˜Кo˜Kо'/nžќ 6ЏеЮendstream endobj 184 0 obj 1780 endobj 182 0 obj << /Type /Page /Contents 183 0 R /Resources 181 0 R /MediaBox [0 0 595.273 841.887] /Parent 168 0 R >> endobj 181 0 obj << /Font << /F15 7 0 R /F35 43 0 R /F30 42 0 R /F24 5 0 R /F37 5 0 R /F28 86 0 R /F27 77 0 R /F36 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 187 0 obj << /Length 188 0 R /Filter /FlateDecode >> stream xкХYIsтFЮйџ 7Ё*ъщ}™Њ’JцSм29ЧT!<žŸЏ d5F`ЦЉЉ‰юзoљовяЩЌ јЧ ЦБT† ТЕ(fЋЛ_'w> Y0C8SХф>Nц4al\2œ§V­жуR5кды/ѕtЕџ=љуУ'`Œ8•Ю•‚эd8=yЈЖЮps8ƒ_j4­УВ-СЛГщЎšЧ•Хc|юЊШ_ѓgЦюtвn•>3!Wг]͘U9…,Œ5&бoїџqѓE]ЭvыњлиђIbLС$RћS%€!ЬˆЂT’0Ъ[,HDƒ]UЏгЧБ`ЃFŽІѓˆŒ|єфЗЊ:@`єh}ŸЈ"Эіп}„яС€ч<žм МF3ИHCЌjQй-ŸШfšУCKтlƒпlНкьwР­фŽФУЫќ`Зо6Пlужyлс“џ/кцwНm*в4ЖљЅеДєz7b…Ц‹$ву Мйd\J8|тХ JћќbB(lуГЎЪmŒ!štѕ/Л†g]mїЫ]|џL§њА˜љCqiћАо/г™"сМC–A}келЇ‚jрe]/ОБ%~I—Д… AЕЉЃТаV+j’еЊ К Ѕ"Ќ1­НЖСFБ6QвБЖ*h;]n}žY=ЊžЦ щЗмЧ„ѓKЩБ*љп†\Х‹ЭїГ]Є юХN"Avz Оz]у1Гє/ і„ дўН…кг–,реЧ:€ВvЛYN=ћoСпѓЙОh)х'ŽXЫšКTЯгеf™jM  аbћ1&—ЧеЏ… Tšhkи/™$b‚ШЖЈќœ GЪЉпц]@!щ o­‚Ў"њD7kŠИ”о%л]в%$,ЩŒBœЧYRС’ЫxVHšJ=:•bЩˆ2L}ЅuiŸe”FAœэјълђ њШјЎЈdRš3j5ь’]мл…J(вўЧЬyмzŠЇ}+“іg:v№|ь­№‰SrhуŸ“x\$Gіc‘ЂцЪB1B•;вЅŒІŒІŒІŒ*ЃPЩ… qX*A„ыfdП€љХl6:ƒЋ \pey%Ѓ`іLВ)]рVфЊ%€жtуИл"мє'2ZАGо*Ё‡SНяС^ЁщDЃ/\FУх Мс‰PCЃ8PПћ}rЧŒD‘цh…OsьЅF2#LlQWХ§kКд–RЂ+ƒ№ІM=д4Љ<оœУƒ,­8шяЅЂ:ZЮŽёг I шPn[IЌ50эœ…™ ћК(“CбFE?>|еЂ€8Ї"Љ†”BUШЁЉЮЋV”5щQ8Њc~2нH;ьB{уNcq œŽ]фgюI§=§~‡р7~~ ~ ?Œхр‘ъUн˜Œ0DOх`Р5ƒџ ‘j€Ј—їО5Dpя1˜Љнр*@ли0:(bУО- ~E АпЏФЊд—”6ЮЄYЂКМ(№т—U‘‹г`@\фT+CЇb. F//Цчћ‹ѓqaВaС[Dт†GDМ‚HЄPCњфшNђŸ‰о%$d&$ФMBЂлzJдBF)тнЊїNѕОЯѕФвФJ?пИhљКўЉћЭkКёЃ7Zуч†е4ЖоЏыUЎ=VшIU3ЋŠ›ЖЧјъЕЧ?цкcЭ\xmnт•зєІPsЎ=šxŽАНY‘œтТi<;u ˆті ЋfŒcŽЊqЩ4uY­*ŠыЁ#ЌЩ^вЃ—‘ЧЦkЧшЦЈ&\І0њЁVvgмЗ щ(ю №f +*>–zЇoKЮЇз:Пžцю€пШКшгЬльrTкЙIXt7Ъ&ЙћПѓCrЋЯЛIН‹›‚.ЗqЗЪМ5’^жgХ•nКйзР6›Žю6м0Т‰јЭfšyMџpИлђЭ‚УxРѓаzœ DњDю[чєQЃLћUм&Я7]пЁ­^gendstream endobj 188 0 obj 1548 endobj 186 0 obj << /Type /Page /Contents 187 0 R /Resources 185 0 R /MediaBox [0 0 595.273 841.887] /Parent 168 0 R >> endobj 185 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F35 43 0 R /F37 5 0 R /F24 5 0 R /F1 107 0 R /F30 42 0 R /F27 77 0 R /F31 93 0 R /F25 87 0 R >> /ProcSet [ /PDF /Text ] >> endobj 191 0 obj << /Length 192 0 R /Filter /FlateDecode >> stream xкХYYлFЮОЮЏа#…Ќ:}ќрЮAАX`ч!@6ДФЩ0Ш1ЩБ“ќњ§њ DŠд1{‚†TГКЊКњыКš-(ўиТ2т4_*зbБон|w{ѓЭїТ,˜$BъХэ] Мнќ’iТсЫcœg?”лwЫ• Yбtx•эђЎ)зEЛќѕіЧoОgjjЇTфАтœ0­Ÿџ4ѕoMО‹tbH'-aм&qїцф!Ÿci‘ˆЄ]бv-Д`"ыю џ"ГхmЛњБn6yхGxЖ+КћzЙт&лDкwKМџплzћЁЌ~‹?ђ8Ё-šВh#ЛњЮ+БРтQRрE)у‚Ђ-Р+и‚;šЕЖ]Бk§цЇ†СВZ7Eо)ў7T+В\I.Вџ>ЎН2ї3гяѓ%ЗйџЙˆŸї–Žlю"]XЙИЋ›нЋh2.&ГŽ0М­Ќ кŠ љ›Ы2AЄ1ЩВЏСТ'"|цDrхэ/DdТƒeАЧЬ%dФJ?Іˆ3v:dЎЂzљ‰Л^šQ%чїFƒ ЃŽXсK;-7OФqPPI 5’›ЗЗ7LIb1ЅБV„cП(Ю.šbqwУ’[иjN Иі~a Ѕї qї%FЊ…%–ЛБЬєEЧјi‰Šž“$’фIIђ*IђМЄdzAІ‡“†/М_ њ<Ёжёa№8оJйм6РњŒіŠтܘ9=б@O;бѓпЁpKа˜8\JЈцcСƒЏxкгFТаŽ_W№a[ФXfњpaWеЕћЏf}> Щ# ‰/…3ugт™8“Žhз+Ъ,tdsš&В'"-т6|ќšЅи(%Ё6bO[vŒ=Ё‰b&Єъ<јі”ˆЕŒ]ЦФ5рЯŸМ|тyрSWƒO<|њХР'О(јј—пeHАw>ŸчS/cѕ‹ХXѓecь‹љ>1“ІŒ0г‹Uœ:в'xWŠГ{qO›|œ јC=1ТMЮЪ-ЬEхqцd&r „ЙuOГ˜SЪg< )Ч/яP"{vt&Й—Тљi=І˜ОV6іTA~)Й ˆњ =МїYќ3Ж| Ыжuеvyхл%‰$vMж]нФпџЃŠЖјUlтяВ:bс pЬ№tF(WcмM*sбЗЎО^ЎpФ3nl‚`Ÿp ­жнЯёуФj8юйКо>юЊ§вCв#`-ЭфЈКCЬєрХЙrIХйЮ%LщDt‡Ч—Yщ[`ReХћЧ|ы_EжеёSД^кЧ]$ ›2ќвЭЎMŒЊHГџЖЎ›ІhBяЌЎ6БџілВ*ІьТŠЅ }П™ЏWйЋ™Эc сОЭg†)О™ьŠ%№\1b\єхЗS'ъ7…ЊQ\96!œlОчђz"ˆсlр#X9ХFp:ј"uя‹V Бqѓž№YљЭŠ•М5ёМќ>uвФко[ОfsЖСŠ|~ŽЦЎ6ЭяГ'иУGИNшtњoУNcw[€З+ы*юRиUфжw=u8рxфi04?уД=Œ§2ЋЛ[юWїэŒJŠp)ЧФ@‹Œрќ|ѕДљЃ˜:”?NЧа0ікўбЮYЧ`SdAвˆƒM9xm ЖЪjяёќ`шуйѕTGЭi­ічХПwEЕiгŒкГљш=fоєƒM)?оУљŽY‡vЊОАЪŽejw-YЎ%,ž=Єў№d№ЦmєНQ‚ЇиЛуЩ§зДœuН ЭyOtЬъ8i[ћ5|LLЫш^C?(Зw;xкФУіmtМTžЫуЎhЪЕw{~шЁ)жe`ь[ІpјLІъМ‹~KГфйЪ§ињџ§ОДс€ТBяžQМІXЏ›vFљМ‹Ї"к?М2OVpБјНЉпmгйлk „ЃЫŸе3sИсщ†чшХп№Ф AГЭ+hь\ц/3‚#їбWˆ,н}X žЂящ;!sсNH!]ж}кцУ{vтJH"i§}ŽЗК‡ˆtщ^H:XфM|OЎf*™рФьу§›ŸgЄq№ХјšdЬУ_”єбєЛŽ(нз@€ƒБомuEЮ§9MОнFeаЉuVмiBтOeѕі§Œ@_9є §sFcƒˆ"Ях(&UŸу`Л=†ЛМЌкˆНЎwіeјЭпДipЅѓj3g0­`RwЦbўjJ‹ ш^}mI I^|TАй‘WѕzфЛ‡mq‹є`qiю‚Qу|QП[СžyУЦЁœ›Й`SŸrљtўZЩGŽZ eО”I$тc{>ЎгйN5rbыєИм:8w§vкhzЫs=ZUЊЂ(DѕЂљŒШUd9ћ%Сl† B­н__b žЫ€бА"š†+яб^ qXѓиг2еq"nЁP(7SЅЊOЉр.еfвg‰6дfRЉёy9*Кp8FEзщУтo˜р@A‚VŸ>ѓјlљљУЂУaБю“ЏЃŸvZ4bOK4MђСсО2s Фі*л„М„Ё5ьЂŽћЋБŸмЦx@ќž nOŠˆ6)њnаџ(хƒendstream endobj 192 0 obj 2077 endobj 190 0 obj << /Type /Page /Contents 191 0 R /Resources 189 0 R /MediaBox [0 0 595.273 841.887] /Parent 193 0 R >> endobj 189 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F35 43 0 R /F24 5 0 R /F1 107 0 R /F25 87 0 R /F30 42 0 R /F28 86 0 R /F31 93 0 R /F27 77 0 R >> /ProcSet [ /PDF /Text ] >> endobj 196 0 obj << /Length 197 0 R /Filter /FlateDecode >> stream xкХX[лDцy…Љ™Ю}э•x\ AJŒ ћH>еЕХЄW'|ƒdѓДc5QL‡Ѓ/—Y3 ј5rЫ‚цйЙІpХлзiЪ/фЃН"pпžбЎ>j<њЁ<оћaъЕlЂЂ№6Ад2}Йƒ8„ѓТ8O*нф‡Ž4Иљ‚л2n•"<ЦE\ИЧ5DC№ЄЯЉ тїЫІ‚,юёЉ Q3Г0[ЭэЃ,Ј_Œ•Ы…FcjS;ЙНс n2`8Љ/жD0& г#GѕА!пJ­втc^љŒFяуMтM‹tзд•ЇшієЖ)юЪњдЦ™ЯfŽкE'p8ЕХ#ZZwwМ ЪBо@бc†ъ}пФ0ѕ}Xя+§ИšA@qЦ=T%іљ%:ћ”Э51 \‰іЖЇ!<ши• 4ѕЙрЋ6€PlLCLAсвŒІL.АRœhёdVbvЇд—тdm9БtјЬ„л ДЬ-А4“aG,=iэяГzTš%>8чO|њbнђ%fiћTи—r`*–бŒPІ&*4Aїh•‘1Р§;ОФPюqœ§l—}Žу в#‡`†bЂЄ}І1Ў——ƒ ГИќџƒжыLИ9шйO%~ИъЦvK>)€Л`јCє—žЯРДJWžСwЗOЇђщGхџ’|&оn> ‘Vџu1Хќ\dаЫЁїС7T5њU§ЏEdadњц-~cХ…С/ПљяЖиде­ыъЖDo]Bйt‚лƒswИЊqдПv QI2емж\§p}" Н TJА„ф‰ X–%M‘ьЎXl“hBи2іЩbЉO>œ.4 аlY6`ЎЙЌšhe$еTАqQBOqАыAЩо7$Gg6"l4в\60“|AИ dЦЮв5т1скЛэ%щДsЙГ&ЫћР€Ѕ$Ах8јb—ХэаШpЋ,Т‘IџBVїKnэхvмВЫ= UQМwTблМЩСoїx‡№!!`ƒс\†хpP.Pp№цэ3/n0F/ЈLMВP шєtШ›ˆЫ чЪЇ€DcHAˆ!ѕЬя4EызФ•ЂюWOЩBtгy/ЏCXПЏEћї=†АB˜Хћр:o @DEИяяЙ vpљŒХж!МЋйе vвђ‰ЧЩ0ФХй\=АЮ­УНИŸћЯˆ"И›ЗМBˆ)тки/ЫЮсrhюЋЊ€bЛЃxDсŠGаЏGи>євњЬrЎЉжЮGާШsМдwVm№ќЉ+кГЖWИрДщ–ў›ƒєЦdєѕзЏƒ] Ћ@Ipј/OЄK‚Hѓэr'm3 9ВЇњАРѕс ѕxj;?Л‰zŠZ7хMyФП*ат[(ЉъlцpŠї#)cњ‡endstream endobj 197 0 obj 1650 endobj 195 0 obj << /Type /Page /Contents 196 0 R /Resources 194 0 R /MediaBox [0 0 595.273 841.887] /Parent 193 0 R >> endobj 194 0 obj << /Font << /F15 7 0 R /F24 5 0 R /F1 107 0 R /F37 5 0 R /F35 43 0 R /F27 77 0 R /F30 42 0 R /F31 93 0 R >> /ProcSet [ /PDF /Text ] >> endobj 200 0 obj << /Length 201 0 R /Filter /FlateDecode >> stream xкЭXKsл6ОћєЦ#е†о3гCлIІЩфа™zzi{ %кb#‰*IљёяЛ‹$бЂœ4N:Е$ХОїл…DЦс_deЩŒ™уŠIЋВљњтЧЫ‹—o„Щ„`Ѕ1йхu М\ќž_.ыYЁЄЫыћjН]…›ЏЋЁkюёнфMџjічхЛ—oЄ>:/ЄfVиЌP†qiЏˆn$G(І‹ТОYЩJP,АaZкL*f„ 4i€ОŽЅУšMk–)`†KzJ–`VЊLhVъxЯ ЏdЎТSх’яЙkІ5Љ­"‘ŒDТŒˆ,Љ‰`“ˆф‰-–ƒ'tІѓЦч [мЉ-fТ–BJЩ„EƒЃ%)ёvш)X?-лUнx h]WѓЁэžŒ-•f–qCŽ~?эAЭХ-ЩT †IoЬ^ОQќˆЪ€3hр‰їI.^_^ $муH |З‡lѓYWgз"VУžВL‚O–†Мns7D€ч|BЇ‚R€цхX+ЯkƒЎ2LЭЧє8•+!П­GgЈGrь(wШeВ#ZД[ЕэРСnэB†˜CЁэc†*6!ЎZdšIШ1~ЄХАdврщHPREM&„Vˆ*Ѕ•2Т€Ќ§жљ@t‚ ўЧAxь|(0.а­ŽSM‰НсД#™ѓхyЗGЊblїqКL[gŽdŸрsu :j2х™ №,XєќиЗЌЁnЛЄЭ†žеvлЕ3щѓћ:aь‰зmЗžТVgСёrдпOИ0@ЋŒV~3­V”_­КЈИ;VRше˜LRиiSZ‡­O 4jЎ%‚ЁрfмPŸ)Ь;YzEТф/ЭьS™AРЙѕIѓ БUˆбЃюўLЅ/П–ЦЯafœS†ŸЄ›†YЅ,?VQГKЁћАЈ<œ1рR н/^ !КЉ2нмд›иs;Г*ЏVЛЇѓіŸ&ЏшГXЏk=чєЧаS 9ЮG0‘NПtэMW­ЃfЧtаjЄMѓLJ€Ж­њ žXЧ‘rоЎЗЛu”ZфŽШRsb0ƒёыvfLВ)ЊЭт„GjЫzкACёљsГК‚7Ÿзн@йQЃ| †Яћ?Ис}]гЧіЌБB О&– dœ1ж:f]r №Фќ е~ MЃй"‡ˆ,[xuљ‚Ш‘ПЋцэUУlўыnއ—ёL2€L„!ЭAC:‰ЊC\52КЊ{ ЏfЕ*цэfб MЛЉЬЦчwЫ&qWFхѓjCдWA­šVСEqљКkзєŒРЭesГЄЅЎжј*вёYп5\ ]yt†§кљ”№vќЈn Œ6Ѕ†,ъЁймž+[МОEТРйСЕфюњziJ —EZZV}”ОOѓ–Ь‘Z2Гян”т]ЂzœпУ>Н[Z@_ЏъћCBCСўЕЛI‰—Ѓу=:^“у_Mйю™6p7“œIN-уЮ(э䑇qppёЯC†s\•љЗјаy3QЄЮŸs>ќ…=ЈшЅЧћp{3мЊrВОрЎЮ§iy•O•—дeь &u@ЁфЁƒ˜дAJЪX~œБ1žЁ sнй!vЊОЇAbоX,hёЎСTРЗ=ЎH'ІфNis‡QЈа­њьiЏ  эDWѓyЛ Ќc'вo зэ*6ѓfsC{ cKSB74УЕЖдЙO{šŸЕIwтš .$endstream endobj 201 0 obj 1665 endobj 199 0 obj << /Type /Page /Contents 200 0 R /Resources 198 0 R /MediaBox [0 0 595.273 841.887] /Parent 193 0 R >> endobj 198 0 obj << /Font << /F15 7 0 R /F24 5 0 R /F1 107 0 R /F30 42 0 R /F25 87 0 R /F27 77 0 R /F37 5 0 R /F35 43 0 R /F36 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 204 0 obj << /Length 205 0 R /Filter /FlateDecode >> stream xкХVMoл8НчвП ЃМЉX~ŠdіА‹ыэžF€EšЊУиZШR ЩiŠЂџ}‡к’5mX>˜"‡3oоМ‰%~,a’.MсЙHжЛГ_Wg/.œ1b•JVЗСrus•>[\ЏўxqСдш VFФѓпšн]хз&]7ѕ?ћMб;џЈгЛЂl;ТХмљM”:Œ|Њї~ю… Œуœ0ЯЫƒIЦеJ0‹Ÿ‡З„N§DГPCм§%V7ёТF‚:О‰Ю)чr‰aajš™H9ajZBкpСfƒ *„TXб‰ zz[qˆ5 аF++ŸИЎтuЁЅPЎ+  <ЙDчž, ›+IіЃ%сГ%9}їC$ƒ+вЃрKKцо№ьЭъь__Rдendstream endobj 205 0 obj 1040 endobj 203 0 obj << /Type /Page /Contents 204 0 R /Resources 202 0 R /MediaBox [0 0 595.273 841.887] /Parent 193 0 R >> endobj 202 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F35 43 0 R /F28 86 0 R /F24 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 208 0 obj << /Length 209 0 R /Filter /FlateDecode >> stream xк’OOУ0 Хя§9v xЖc'GЄэРЙ7Ф Mт„€ЯOлЌЌЅб*Хя§^c›Ж/9Тš\Тƒл=WзMЕоuDU]sш•ЭУmэ˜‘YV^‰jПђ-е!‹‰•г‹ю#ѕquзмИЄь< ˆhЯ@РdlЙˆ/Я AД;х)Oі8и9‡!ыќЩ’fљ‡=$ :ГЋeЂМ`oЂѓl`™{ЦцјИљМњи_ѕˆh' •F`џЦD1†ьwяЏo…2Ю)nMŠ*…1юdќ‘v4ыtЉ ŽuЁ “’ŸGџМтМ кЦa і7с—ћё0 QЪВ8ІdfH“вА?"”dйE"ЦЁ+­З4о`вQЛHЗю%ЉSV›ІњТ#­oendstream endobj 209 0 obj 300 endobj 207 0 obj << /Type /Page /Contents 208 0 R /Resources 206 0 R /MediaBox [0 0 595.273 841.887] /Parent 193 0 R >> endobj 206 0 obj << /Font << /F35 43 0 R /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 212 0 obj << /Length 213 0 R /Filter /FlateDecode >> stream xк3T0BCcC#=##cKS=SS…ф\.Ї.}7CSCC=KSS…4АЪ”h  Эи/.з.~/ вendstream endobj 213 0 obj 65 endobj 211 0 obj << /Type /Page /Contents 212 0 R /Resources 210 0 R /MediaBox [0 0 595.273 841.887] /Parent 193 0 R >> endobj 210 0 obj << /Font << /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 216 0 obj << /Length 217 0 R /Filter /FlateDecode >> stream xк­WKoлFюй—ž{)x+…šю{зIv)4@tHб-б‰2(:iњыћэ‹ztнјшА$wvп|;3ЂE- %VБB1NИ)›ГЋљй“kЦ &ˆ6ʘпzСљђђљЊЙлaVq­K=ћsў 6*a‰Ек \ЯЌ(яћХиmћ Ещњnг§гј/8№фšЪ‚ТЄ”As%књуѓUЗУБZ•‹гхd­–хВн-†юfV1SЖQh\ЕссnиbЇкх§vuйєЫpє6:O53Јј8“ВlКusГŽ:К>HЯ_ПjЦU4АM1R8)Єw2FфŽizЄ\Гr{ыжКміq;„uз~t!ЕCГ‚Cч<и‘Y%•-ызŸУљe‹ШЅни-ЂІЛбй­Ž\RоЅv№ц-єyГІ\РЃnйэ2lЌ№шŒX^О#XтdР&Э>yŸКѕ:ь9рс}xйїЫ.iіИСbгo‘!унA.I е„бDAI :aMшЌЂ”‰#.љ№xDW&t@T,˜gSDЩ@Ю_л1š?”a”hЭ"СЏa/Ѓ‡YТ)2{(р_у>Б Мy7БЦЭЁѕ9ЧгaЮ3ЎPЅˆ1&кy›qD*“Џ$ш|йO&отлю˜ЋruфЦБИh.SУ-ЇИь‡ [Ж‹uЈ-Эю"› Њ68oˆQдл”z(пеВ~ы^YyсY^ЏЗЭˆЯєрЋ_Ÿfт­4Љ…ѕV”6БFДžфШ/ЮУАьюBuXto|ѓ>пХ„eЇ–h›; ћЁЊ„њ­ПаNї*™џаѕ*ŸxиšŠ SWу$@f5БšЅ8‚0ŠшА ’NwGнњЎІ"iг OЈ}Ј/Ф‘>Ј9*"щi,ŸV]ИЄ­’ЎеС§№Iѕ)ќЏvЁаKdБФаЌ#Ь€1ТD,И—|эыЗŽѕ;ч№S<ъ§yЛ^Оi›aБrЎ8—ЮAЃк”—чNWq}еќ§Eч<rО]ћ'юЁ9ќФТЌ&Ц&Ѓ‘DC(ПWhz?l €sуBц<ІŠГуічПмxN†ч(ЦЫї!І6Jь\l>?„нM;ЎBЭ^тв ди(§^гOF›ё<<6cЎK41Щ(uйяŽєНр 6z'tПq]2Жл!G6СQГХШf ›jЋїњпп С‘Юњмв…iЉCЦxd д„eКЛ5ЪЖqйЮzB‰`‰tЇxžcЉs=%6#ЇпWЭx a‰bЬФ‚сT ыC4№щАL}Ԙ>*7Ф$Г—ŽOІ|ц]^Й›пLђљШDWLЏeт):ЉђЪe]Ц—,8d€a„pEЁC‰ыOJЯФS&=ѕr.Š‘˜ё}Ж‹Y–КмyЌ{Є%]ˆZ†ўтћ8 }ц*—†Ю˜џ&Œ{JрCрьХќŒжЪd\*CАrЬР„%мšbh‹л3ЇфН$nОІћ9YЭqNЮyш@~ЌƒWдРУšђТV~ЪiсDcB0Є6њыИ2a…F @nŠВm Ю0Љ№PQЌў„ОRO!т„Yі%ˆиAЙШб2‘№ёœbЧО=Ќ(ŒБђЧLшk БшrБsLdу О-@e ўKb\Д­Њ9Њšх„уЩdм“I9ўЏ†ЙКТ}AJИ‚Ћ*— #„RѕъY.>ITяAў.‡!#Š& i& 1zП‘К›&]EMЎ"Ђp’škзŒQ~эaM<™ђі51 0WћєYœAуЮху­ тžЊ$†ВЬPЬˆVєбІž?hJ9Йч&ˆ9ЌBOuџмŽА)ћџ“гЛendstream endobj 217 0 obj 1419 endobj 215 0 obj << /Type /Page /Contents 216 0 R /Resources 214 0 R /MediaBox [0 0 595.273 841.887] /Parent 218 0 R >> endobj 214 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F34 5 0 R /F35 43 0 R /F30 42 0 R /F27 77 0 R >> /ProcSet [ /PDF /Text ] >> endobj 221 0 obj << /Length 222 0 R /Filter /FlateDecode >> stream xк•XKлFNrє%чмt[ ˆ:ьwгAУ8иMD8ТЁ(‹АDNHj<ўї[е/’šžqи$[еѕќъ+вU?КЂ‚ЎФJчœ0ХWещйеійwзTЎ(%…”ЋэоnнюоfлCНо0YdчЁюqeВгšiИннmп­™Щюšп8тэGмгЙ­нoџuOtVїУњніЇяЎљќDj8)ђТŸћТэXшT&ќыВн%D0X уЗ\Ѕ%№pТЧCSЁNЇхЎў3ЇЂ F8ГMізЙmМЅwИЛЎЦЎџŠ^m8вrЕЁ‚!­дЎ]o„2N.орЅШЪћf ыQдЙ_%“ђ‹дDЬk§2aЌДЄ~C3Иїн|dЯЙС>]шq{п—'МбY3ѕqoѕcйыбэ’кntіRU€млЋьqm]еУPі žУ)уЁq%нAœЉЌБfŽuЗ–2+)yASо‚З/О]o$хйеЛ„Б"'††4Ј:'МlкaqЌЮNMлИL=‘ >#ЦPˆ…D*Ієц6Ÿ1НQп)НёЎ<[Э§ЙЗ!ŸщЕЩ …ємА‚pИЂ№ЏгБ2мk]t‚ь8ЁpHЋMЬ c3УdAЙnя ў,ЧІk㕆цЁўWоПcf-TІ… ŠPZmў…вLВlьŽ C[е ”!BЖн1!‚IjБNъЂ*йtк,œўС …XЈwsьь]UŽѕrZатŒйŒ/! Dѕ\ЛЄ0) ѓц)=КѓKG›ћvР›Cѓў€С5d|Vўѕ№їЙь§КwК81кЦoЖЗ€аWхCгњЗ}]5Dжъ—/РхЯ\ц o "%‹бЎЏnн&&WšЗpE Ъ`'‡pу>ъǘИE6†Књс€љ[–Ш%Cr Ш0№M*”ЙаГї’ђьyтџаЏ"ЮЩЄёѕWщ4Ц•??x’FGs5sвм ˆ4ЇLтѕ$чnєГЛыЮ7Ч: ‰1Ф“zlтJV/р#bг­M"•Uѕюмћg}=ž{zj’Ъg[ПkZШў8Аœ’м„(`FНкВˆЫВ?`”КАLkЂYp^€ЁKД5к2,šаіХ~Дe“ГЌt—Њ<qХNЪъ !§Б;ю~ЋЫО:$дSbZ;X#ЭічЖ}%]–’фBЧšЏњ}ёˆё Р]O`tvAp–tЖ€qБwзъ#њЄ $Ч1ЋшКяЛ~Л]=Єк еD`f=l/ќ1ЄўхvќхCЊŠєc6{пq:з?g y­Ю}_яRэC("€˜$КЧS:§мЕ/Лі.хe 6ŠYfЖ]ЛБ->Џў} ЧЩjэД7SІ(•}бљГЦiЌяЋКо “*ЏЩМ+\єhЕl$&AŒJ6р…С›№DвРgUŸ№Їж1І0<2ЮˆмГS\мєЅэ–PБzlкї~Cпмы1Uў Lb!Ži‰ьЪ_SьЂЌc/Ч.ŠмzчюЛўЩaŸaoRХЦНtчгХ,ь€тŽ ь•qƒЈСИіЈЦЮ=)нэRІr(l ПiЏРƒЉ"0*аwH"rHDЭЭП"1MТ‚Д ОZcиэ”ЎєІєqЭТ"uu,{WžАѕѓ-ФM2“0IЉЭh;<ИСс9^dіыя6 AУmЯ}=Лrќўsн#Ž=aШ {s,^aЂ7ЖPqўАШч{ч#э^GˆнЂв?џ^ІЈ˜„~ЏBТюA…MЛ›‚ббCјМУ ”Yђы€1@Щi‡бXВпwеeI/Э‚I‚Ы€o)щX бœщуJb"Ђ„ЧJŒб}Єщ',”œsТ0–Чр[m6ВЦИ r/žНк>ћ? б•`endstream endobj 222 0 obj 1965 endobj 220 0 obj << /Type /Page /Contents 221 0 R /Resources 219 0 R /MediaBox [0 0 595.273 841.887] /Parent 218 0 R >> endobj 219 0 obj << /Font << /F15 7 0 R /F35 43 0 R /F30 42 0 R /F25 87 0 R /F28 86 0 R /F27 77 0 R /F31 93 0 R /F34 5 0 R /F24 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 225 0 obj << /Length 226 0 R /Filter /FlateDecode >> stream xкХY[лЦЎ_§аў=rkТ™см\Єш%йж…ю0WЂМD%rKQіІПОпмxбŽДы‚}рp8{ц\Пs]фјЃ M‰‘lЁrN˜ф‹еющ_Џž~}Ще‚„rqЕq'Џж?eŠ0B/–”2ž}_7ѕЎў_йзmsБфŠfхЖmокe‘•ўБ­›ът—Ћ~}IХ‚т"!<Й%cЄАДAєХЦaХфe„1ЎН ФBЃьgErЃрkw"OмbzБе{ЫUю™ЫГ}_v}э8–&ЛНX2•ЕusСtж‡ƒЭ:мЌfЌQBѓШляЬ "9Ÿѓ>у +Ст#ЎVmЦІ\МЛcеЊoЛgиаyЖѓšЗЌ'ИS9–ј&}{Ёh<аЕЛ„L Ї8Ї~ѓ€њС*'š.–TЅ w.xS&ыo*, ЭКю œs"ћКї†ЈVѕЯ9-ЊЕнЅйЕеСЏ)qeNДфŸbŒžЈ'ЦА\Tџ=дя.y[E[и§ОѕOЫ[ГvЮуЖЃ0хѓАГџqmwВЊK1­sB‹hЃ.С”Ц"|оV–ш=ЅJIђJ-†јщoЪ>q „Šy›И„xОџœ‹tеѓ нБ! #Фa|lПЌ@Н5ЪхЁY‚ЭГ7юЩГoЋm_њ–НМЛ?њE‘НЯяЫЛ}еЙ7š]Елp№ђп;GšІ№cd%HіОоn!+џЖ_@ю‹CЉ"’EsZ7й›"Ш.#ш1#м'.р|,šъЭO/Џ љёњ—T˜РJ<2Q7žk‡v1@{э€KocР ‘”ЮB~РFЎUФFЗ~gyuЙ"e[ JфТю ЯZЪЂŸ“”jС‹1ћ: ЌJЉi–ƒ^j,`СО.­=ЕD*Ўnуv|pNƒg ,suя>%%ЏВw@О„ЌPЫЃCйJЄхШUпnqIГJ)ОЈb ˜І ќ18Ÿ…вA dс™ИЉ7Юƒю%ˆФеˆ9!"зoЗыUeЗКI•(rЉ™ЎцЙлœцЋWПК=єЗ‡ўYтNPсгЇЃ”>A’ЦzІЋњCзьŸ'ђ7’&#ЙŒ™…КѓHзЩ:jй›Х…зOлЁј+ћ*шЯ9“у1— B-шѓw2;i{E ˆ76ЧŽЩ№ˆi‹?ЈШслЈф‡1рекЕэ‘Ёз ,gТЪTZ; sбsЦGЇЧ>’ё!ГЛЗPТG— >BщF5@яЅ=ёєЛЋЇ–Ov‘чШkbmл\I8‹ЎZlžва.3@М@ћ§ђМСѕдwIO]2jHNйЬџВщЬhц`Uщ0ЋОMgs5ч'Ѓb–lџhфЙzI ЪЮљ€]§Эw]7wЫуТЦ НfШрзGŸ_ЗM› ЬMиЈКЮ—)аРаyї›BЄ­ЋШrJd/~uлПњOJіТѕ‡’‘pфj$ѓCлќ­mо=„fЯ‚†šќ}нп$ˆшЁ?)Ц/ˆD‡­ѓЙРбaУТ(ц‡ъ}п6ЫзхэЭоcXЖЋњдhАœРјдš'a/‚МkПсц&{ПvЂЛUŽ—З.гš IЕНlжqД-†ВOšю rр&гŸУРAЅА:ŒмЕФrцe#Œ4фw“0ˆKѓ4ЭоV­тк-аўWяэ‚=N ”-ѕљ9UбЫ‡2зіЙ ?zЄЫъс}ЕЪ/‘­ЊрЏ.Дх"§КIѕT]_ЎюnЫf W„ФІŽ cол0ІVчN(e‡ KйЕ‡aЌ6S‡!rKѓ‰г ~ВˆMќч ~—Ь @SъQƒkzv&Ё>x&ё@/џЅ'$ќAšPwU`<˜f,ћЪ?N\ЭјdЂy—Ј ’UЬЙПKЭ{§ъS™чї˜їЌа’7йxшOif :Ѕє$9Чч<щёк˜xƒYX€_Q@ž&Йі0IcСГDi  F…v‰QaЙЙ_ђŒ'ЅqГхXѓаTЭУмН~xЃ ћР№љ2NЃу4ъ1NЃу4ъQNѓ4T њYЁ ЭNЯ0gьPŸ$ЧПFЉvёпТФїЅE/Њ…уZ:Ъ?Л –Ѓb0Жи'‚г“БNЇъКjZ_ˆXŒ`ёЖ+зѕ№[lђЛŽЗМяЙќ‹џЖѓОЮ :№rkЗrЃ3Aq[~Љˆ#Ÿ}˜ >љk–iэFžuCЋ31Шы'Х Уy…De* Tl~ЛЉіћкжƒvхOWпљЕ•p|їmГнїeŠџчA8{ 'Ž„#vbeаЛЁ–БšВGkїГйЊђУŽ|6ћЦewLлЪЁywГrk€vкovuyНMШќЇaqQ|xвVЮ-Іm‹pO1Тї=жСЧ3„sK• f{l#ЇфиЩxЯŒ?B ЭедgŽ лЇ|m8'{Р9к4Ћ*фм•/%B>Ъ]Я^pкЧ &ш>ЊqY"с~v.ХhЪfЖGцЄ€œ6WюRƒUхgБ;g)f>‡ЉЬЧ™J<кTцуL%ŽL5 Tу‚‘kRPЏ&žˆSu?NEjі&PТк2R˜JтџЧЊk:endstream endobj 226 0 obj 2452 endobj 224 0 obj << /Type /Page /Contents 225 0 R /Resources 223 0 R /MediaBox [0 0 595.273 841.887] /Parent 218 0 R >> endobj 223 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F24 5 0 R /F25 87 0 R /F27 77 0 R /F30 42 0 R /F35 43 0 R /F31 93 0 R /F1 107 0 R /F28 86 0 R /F26 94 0 R >> /ProcSet [ /PDF /Text ] >> endobj 229 0 obj << /Length 230 0 R /Filter /FlateDecode >> stream xкЭZ[лЦn_7@ѓм7>rQsТЙЯФ(ІЭк)šИhеТ@S\‰ВˆHф†ЄМыўњœЙQЄ4’vзЛсqGЃ™sљЮwО'9ќУ С9‚'B DДJц›‹Џg_\–`Œ4чЩliЇЮџI__ўwіз/Ў0}ПчXњ ?фќDiqzriу ,аі“G4Ђ т€=ŸЬl„С"m–"№гr”+ішќ+( „}&ё#w3Ю`iД‰"‡2ѓBє9фч@§е‘“aŠ‘дђЎPŽеsР'“%g@€(ъ8€ТDJa-ў4"O!| Bє)Є‡ qoЉЧ!Hœр‚8№ѕГ‘‚†“3C>№ЭёюcІ+™aŸgы>фљЛz\їљП#`Єo0ШЁ@№ }#ѕ<д7sдс#އFлy4Ÿ$ƒф!ТПђ”)Л‡FxВŠШџ&0їє )’T1k5xќЈs }Ѕ<днсчлeм0™ŸЊЊ{Uчh лўn^y^YpХ;_7]щћЦкиTuЕ1EНнМˆBI!&ФЧРƒЪ1%УПХ ŠrчcзDySp 8qЬ3wё*a!є1j€-й UчJdт(W*Ч 9 N_Ю@“C‡tХ|АЦШ8ПЋРGЄ д{и§ф8ab٘ž”OхŒщeА(ƒICЧfZi[Ьћj^О=‡iZѕnиАљМЖЖьћВuІd™фщЂ„!(звЏќCз—7БFЯs$с<ы<ќ)^38ёvUЭ gЌмš–Њџ•нn/ч—ДС‰!=Дхr[ƒ?MэŠЎЊїfQЕхшћЮ)‰r^§cV.мЄkГї‡АЦV?чnmяЈЮVG8ƒ~Du„%> P“Г№1@vњЄЋуСЮФ КЁќ“&dyŒŠЪ ЬФ=ѓѓhBЇ!ЋюЩчЯ!L5Ф>“3цИRЫ ŸЯ†ѓФ\–уёЃ€*JN1ВЙ {ŠЮfЛlкуKјв>ЏmK0OžЕ­ШŽsn_Kdp&р{v/›ѕК1вяжŸ>MojьnѓrБmK_­trІ5'cЎ]$”Л9јОМэ›кфх zэkyњКьКWp&Етє­owЛЖ,§зЕљЎИћшчЭšЕПњќБЯ$}хєњЧЊ~яЧўRіЃS§$Œc]*G ЭКzжЁƒ8‡њclЦЁШЂІŒsсЛž№!ЩўQмЌКањ6eП2сщ"d‡h”›ы#›oъ]Ћnп•ѕМ oпЄ7_эиЏі˜ЕwWю|цпЭљ™ЯФ|ы+яцeщЄкнЇyKЦтwSмyuмŽ"ъ—!%д­‘А™†z‘§/‡%2„џ4У3:)dі|ёW>?o‹ЎЪ:X{ JзлЛHЈ]j^ЪЛ7ЅœrќАMNДendstream endobj 230 0 obj 2309 endobj 228 0 obj << /Type /Page /Contents 229 0 R /Resources 227 0 R /MediaBox [0 0 595.273 841.887] /Parent 218 0 R >> endobj 227 0 obj << /Font << /F24 5 0 R /F15 7 0 R /F25 87 0 R /F1 107 0 R /F28 86 0 R /F26 94 0 R /F27 77 0 R /F30 42 0 R /F38 163 0 R /F31 93 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 233 0 obj << /Length 234 0 R /Filter /FlateDecode >> stream xкхZнoфЖњx}ъCђЖo‘Q/#~S) ДAюr$-PИ@ІфwWW­Д‘ДgЛ}gHJ+йєэ^|О—Р€E‘Ѓ™сpц7Crщ"…?К0”dŠ-tЪ S|БкНјцъХWЏ˜XP‘rqЕv”WХП“ПюїmsСYr[юђо^,ЙЩІЭ‹вжинcLђК№­эК2Џ/ўsѕ§WЏЈœq\2FЈRžoеo›Уf _I“”ШFfIйСSЅIkWЭngыТ~ oќКїЇvnCcа‡™$0ђњ@cаЧБ]ЗЭЮ Ьы%ЊˆJQA„№Jхе]_Ўђ h˜J л–я.ЄHђž,Klw‰#№Е3 4FЃ0)иЁ:иЮПяђ јч_Ў/–№?PЎ›ƒSš‡ЎЌ7žщO)u9p+Ъплжж+Ss&ОlъюkooІ'іІиЌ_ІЦ}љ—‹%Ьgд/^^Н 4ІfБ4)б K‘ž™Ekы4ИЬH™QЂџш3:т3^ЪmаЩ,4ЩДгˆaL…шŒ;Ъ2т'‚H­Щ2сh~JeX‰9™фAрm„&)L"XPOТг‰б‹/bфФOCRуЭЗŽЫeIяЋЊпЏъФ*Š(Œ"5Š")7‹#ЭЃ ‹HƒœmDŽ'фpТa…Ž4ZŽЅYєY\lЅOЕ{Џеxd635бjz2›GUUOЗX cLRˆ&˜‚CУ'Š0 А”ЩбdChнOЏ ‹Ь@3КW|Y$цf,–”ТNд C>Œ=Ёœ№2ж…sѓЈ2Ф7‰FАYR&‰т 4ІрЭ†(єЂ‡ЦpЄец АырFо‡A(ы{4рЊ‡МЧуTq‹'фo јhФ?ё3аˆ-U‹K4Ш;§єЖy€9Sлœ„Чi›ГzЦfІЪ)ty6$gПvЖaDЇV1Ђг8Ф2C$–7я‡“mіB?GцЫP=ˆЦ•ВчXFaQr‰Xpс <†Џ#Ѕ`už^Э‰G'~?5žЯэmФ $д†цМк=Х)4g Б~іијHh|ВH8.ЅЇљгХ’*[KJLІІьоЦ2?ЎкoЃћ‰_ ”ЯRвђпфbЪEx–ˆ{‚qє9‘pжšВѓK†ГсIхдЇ15{~?ФќЉ2Т u€W"ZG0 ›“ѓыˆhрŸ0Я`›(ЄxMЄСНї„WюРL™ЄЌW­нс‰™Nњˆ:#\fŒ їќCOкэ™Є;ЌPъжПѕл<&_I’2ѓTљRLјs<‹3=xш"€ЮРѕЅoc–‚ВХosP|ШЪDЂ ­rЕ[u”r“%чD#B’ r+eТЄ§хЗEИл Vх`Є“з:~-„дѓЕR%У@ю_§uI[Ž ƒєHу–;ўіmъх?`Z†:і œСW.Ё'ѓЋ‰#GЬr\l@ŒШJQц›ІЦ›ІAКmwа2u˜WKи1осЫ.ялђжSрt\ Z8оьИЪ№8її$:ю`>УB*Э4РV>\Т‰™зHцмVЪЖУJЯ@ТqФњn ‹Xіe^•џѓw~<Щ{џьš Б/a f“щvyVqМ€УWэLjЩФ ˆъŠe†HР „ ь cбrRsюQ,›–д ЕwОЕ њ„dЗ)ыкнљaŸwЗ‘/BmыЏє.бWŽдУџЦ9МjИМГ…З M3—ІЦЙ7Ш(їuОъ›жЗС&юYЎGYиаG-№UBЯ‹.43nƒў37Ѓ> ьPЏ Ю%кСѓnЪn”2 L9К•Ќ‡йЙзcDщјLp™ ^†TћжЃЯЪ‡6HUКqШб|’ЃЩАЕJaџ`№IхЪКА/p ћ†1€АjмЦћI4П™зšц0Іљ<qоЏЋС+dj’з`ЅякDRšќЫ=EђУЕk№фŸзЁчЧќіMя<щЎš*МњЬък,љ.аОўЙЌп…Оom<œЃг %,›ђ)ѕ b5>3Pq— Ї*џы\>2]ћr> œїЎиNЩoќ<&)ž%іveїAЄЧ2ъ*@|E‰~ь …*‚жх Šјье^FєЁдNj8.ћћОџІмќяЎ‹ќ1G9Њ 9ћ9‹Њ1j9јќфFТМ?ДЕї>”­R> endobj 231 0 obj << /Font << /F24 5 0 R /F15 7 0 R /F27 77 0 R /F28 86 0 R /F30 42 0 R /F25 87 0 R /F35 43 0 R /F31 93 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 237 0 obj << /Length 238 0 R /Filter /FlateDecode >> stream xкэY_oфЖOћшњ іQ‹TŒHŠ"uE ф€кwAZ878 )y—ЖhЅЄНГП}g4ЄVкЅзіљ’‡C`РвŠфpц79ф‹ўј‚ ЩLЂ:‘LdrБкœНО<ћц\ъO™LГХхѕ0ѕr§cЄ™`щ2цА(z}О”"КxЗŒЅЮЂэoxMЂѕђ—п}sЮе‚s–+EыcиFф| rykaІHBh"adєSЂ’зmГ&К_л:>ЏlПТ ЗЖ/šj}]ДWёЛлЂЎ˜ЫqїУД5-;zuгУJќ‘D–*ŠЖ,j$п#‹ШH˜Ђ„РTsНŒSЭЃ™KЕˆўm?іMM§&n‚ƒЅјx[‹єй-цРrзсfУзMбЗхО:ФЋэhxЄяЕЕŽtп‰+š`uеlЖЛчKрШоmЋrUіе§ЄfАXЊшmƒšР€I]QЎщKAъ‘йD=<ЫXЦЙSђ/ЛЂ+c'ўБ.5к‰Ÿ;AŸ œЦB&ЙФ–1QИШЇ ‡_EuгДeЛ!ЮvЂ"С„zšoЂыІЊ\ђБЌoќЇvƒ:мUQAМp`ед]пюV=§ь§ž * №зиЖ#ЯИL^ШЁdЉ’{1J9Xј8щЅ@н6ЫЪ”mŠЉ]Э­эaЂoLRpmyк‚WLЭ -8Ыхд‚чтH˜ŽЌSѕ91›’Б|ŒкCF<ц2v’Яэ{FbЪТ <ХKё|Jh{Яь xът)Žём KPќY!їˆEџy> 8ГЏO њ4GФ' #яшЃщS9˜>`_ЖћHдaXšЛ$‹DMн`–n2ЦЙ|f„›ы‡OgX?*‹x?)Ќ=љoYiъgž УњбП~xKУлƒ`э‚ˆчтЙыЇЩ іcЮ„РC ј *sШ\фwЁъ}@LА U'гF>'ЃЯѓd5œДЦЛ;В* bЮємA)5CсzOуЋєіl>fˆeУ№~вЇ&Ц "і„ЬёX§dаг“ѕ=‡“—™`ё„šрQНќjвцiчс™ыЅ™э$€h–Ю}єPЛHbЎ]=Ї йg$0эчŠQБ‚Qбѓ0ёћ‰xа†ќёtqPФЊK˜)и_XсЊС8ЁrPs&0‡…›і‚rPў^~Оr0–hBёЁ—“€Ъ&­+=oVЅЎБ†MЋ]QUїЎЫжэи—УOoЎ•EхкЭЈОьёсVM{MDS™pЈ фg=„M*=•QЅ—œhe\>-=О ž2їe†qз+”iЪФи+”pэЖЅ–ыЪЎw­і3сЙйVvуаєˆЋЉфL­Оз'93‚гыѓ‹wѕљЎ^§u+ЮЃ‹ЖX—Жю‡ŸIє~xІбїWюхПє"Ѓwo{лКe—MхОŸџМ)ыс]Dnб›ŸЫњУ>oЭѕl&•œ›LАкRїrГŒЌЇя[jCr-TzTкCu 7PАEЁ—5Є)Щји=ЁжjюЮЎпъЋ7DelЈn‰‰YzЯП—ЦЂтQ~т3:КѕeS;їф'[зDMybw2-к§}Аˆсc…ТˆњЁэщ‰эeЃэ­эЊ*кЧŒ.ЃV§X\Š%@дг›Zт{gvd7ЏшёŸьЊoZ4 П…№ƒМGWм‚kwАипG ЋЋІmmЗмЈЉзNRЋŠ(mїї ‡ЂiŽ~}yЪj“™СЄ{.!І‹чvZѕW3ЈЪЂ-6<Ъ]Uмƒ‰/ІцЖаСD3mQЛ+/œy”u@ Ёs0/Янƒїrzмd(iˆуIЊ[C‰шл-šŠб] qЙгщш№Й?qFБЏjв$Ь ŸЄІыЪЋЪвЇсJžЖы§.ЙsDќz с‹юЖйUx›'wСЧѓс:oрПVЖCm юl':aАћeWДюн…!OdИЄЩ~юІ w/kїСnЛВ"…УБ$c ЬAN5з BЙйЙ`ЪCЫa) є*x:cјT’Э@Eт†џlЦфЩqEчО$›ДZO–&А…zOa7Э“(]”X7ЛСЕ№}лкUй=NЪ ‘РЬз;k}№п4~eŽЗ ИVn˜ёЂѕрГWз7л‚Ё.S1;јЙdю˜SjЕ[`у*№Ѕ  žђѕ-zT†ЂGЉ<*{њVК1Ай€qЏЗRtУL‹,НuQнїхЊЈ№7![pЅЂбuRв‹­-…ц––њh?xЏ:Ф1УRn0B0c()ЊдŸšўл)Мйendstream endobj 238 0 obj 2143 endobj 236 0 obj << /Type /Page /Contents 237 0 R /Resources 235 0 R /MediaBox [0 0 595.273 841.887] /Parent 218 0 R >> endobj 235 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F36 6 0 R /F24 5 0 R /F31 93 0 R /F25 87 0 R /F28 86 0 R /F27 77 0 R /F30 42 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 241 0 obj << /Length 242 0 R /Filter /FlateDecode >> stream xк•WYл6ЮѓўŠ}[ё’Ј} )’ Р:@ІhИ2m ‘%WЧ§ѕсPЖДЋMPАx 93пœф—1ќјЅс,KФeK&y™.оЌ/^­dzЩ“*Й\o=хzѓg”2СєbЩЙбuq8–ю~Б”ЉŒЎлз0ŒЃЭтЏѕoЏV\_rИXk:ОŠ)јK>Weёm!вШС‘EЧЦнuпв,м$’hгО„%ИВлЪіФVG„ДPo‰ъ“+7ЎЁБ­64јшlmшkщTUw(1Ъњ*E2і-ВLсnзЗ ­"лСW:]Mп’ЎЫmNД08Uq@=ћ[,ЕQбћЊэHи.:њц5Ќ6}о…‹-}vЎ ›"ЗхD>эхћsЕыф˜щ˜иЦYє5 tЋœ–і%П-ЊЭ‘žЬ$в‘™ИLl]Э2c‚Їaџ'№“D|` МQ›ЎШ7—QБс'S§6, f`јЧ:"Aџ|Ѓ 5>)ЖсвУЅЬ 6zу=аЮо•Ч3 …јsвI1лд ъЁГsŠєі„Ь†HЉќjŸљ>ЙЛЎЎ|йNРY›zлl^вў›ž~wІgзчtaœR*В/аи™0šJ}moclЦstЬT2д*АŸR Mc&ж7ƒУДДLe"ђ3xР’№,z{FhшђdrЙЭswьFЗљŒdђ ‚ѓ`h_дPш`XвиЖє-ќ@u Wš"јŽЂp „ˆc&у$ €НYНЛЦW7л]ЫКћюъЙдЩ0–CQB",ры9C"‡ˆІЕжі]}€ЩН[‰ЂьМ"бUbЊ>vХЁјз†’Йћ ЮTБкgѓїЕ{œф6юP‡t‡m-]Н­CbsїнВвE&‡ўœ*’!иИr|šцUТLš†Є'}ЪSPiНЉ: 0Ÿє гЉ UШЕу4tк6AЋ28З=U b„цSр)єqйрˆЩ.•|FšD3%x n{j16EуђЎn0AЬц~ЁKЁYœ&ЩxHўЋEІЂsKˆјРoхh Љ8‘C#їУк№;a3ЃЎJY" гb#УŽvљ4fКДа5рЙHC#RэjxcT4nmч@"пZœ> endobj 239 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F27 77 0 R /F35 43 0 R /F34 5 0 R /F31 93 0 R /F25 87 0 R /F28 86 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 246 0 obj << /Length 247 0 R /Filter /FlateDecode >> stream xкнZKЧжy9ФЩС7">dˆьДћн=|IС1#іbШ:ŒИГкј‘зП>_uї3dsIiх(ˆУ™šъzзWХ#Žb$Єbž›‘уŠIЋF“йе_oЎО}ЉмHhІДнмв›лз…c —/џlчэЌ§ЕоД‹љИTNѕt1G—КЈуЧД7у77?|ћR˜‘Ќ2&В+ЅdТкРє_ЋХЛU=‹tЊOЇZЇГgэœиБeНЮАtœi%iН\Nлf=.ЅQ†p5H,/6‹єyŸHюЖѓIїX‹ЛјXХЏџSдЋЖ~;m‚ #XТ1у,.4г:ъѓ37|SПK_4di‹ЛеbЏшЄЈЈэIя5“Т'щмЮšU;В(о2Мx5жUбŒq5i—єбфlPyІJ\š_ъйrкФSпBW,тџя! ˆїŸG.вѕИ”‚WЬBМR &Ѕмюr&gѓЮ^šг єKzŽPc•ЃЇ–Y#qs• $"ЫТСЏ{š?ы2м№ŠЏlŸ|2;зgЇ268dM+/ОЃwЪ0R3oФG[Fё§•Џzg?ЫШ—Ўт9"HwЄ(2љЏYЅlпlОІГЪ=б_ ž”Їд–)Ё/WOўЋЇОАzЅЌ”вЂьК*yJщXЧ( [*QJэ:ЃВGmб]*_R rЙ„эˆ^d˜&wѕ>ЧР kдЅяЇ\єUШХŠќš4EЫЦЅ6Ўhвчнb5ЏуЧzг,sв Я„ш’v•+РŒлЎŠЇ3Ed@dЉћђr&аh4ŒЮŒЕC–ЏГE0ы.5-џDгvЁШпЄH™Ч.ЈЌaЖ2ƒ.Z*ѕ˜лvеФžz|ЈѕˆлŽыяrB'RлG‹Њg”мз"oŸ‹е{rфНa pУ> ЅжНЌCВ-шС]lV­а§:mньo rkлСWJƒDTŸЫ ‘]вcЩДД„ Mђѓ2Е Ц0žЪ)€b щtѕї›+СQ€$EŠDС0UgW?Z5ЃЛ+бсвЅrLW{`z€$yЊzhуƘ,жG"У YлљїѓЁ+ИЃjƒяИyЦНwПю4QИ‡7$ 8БqT瘌ДHTЅgђŒJ4.ЭdгmњyєžяКXF(:§>UoіƒYИžJwъUzД\!Ќёdгмt”иеѓЭj;|пG<…Gэ: ‹-‰8nrŽ…T^vбqЁO KйозqЦkE†ћЪяfw•fї››ХМ|U/язqz—ХЌймУ)woŸ2В[VљNЦMГоЬqдЉ™нЂ™tњnзa`>љ‡RJa;)aжлDMп„ы†ћєъЋХК™—ЩщRvНўv•тмљўЯ‡vг?}#ћ=‹збЦmzё:3Ы '™ЌК”њлbЖмnафХ,W<ъJ‡*SФЋѓыLїFvЛюЌВЩъvэx9CH8?ъp“ўГњiЊ~Ш ъˆrЯk8. ЮOёђшЌєщp>LRМ?K w\й33луcTі{Sbv"#CШ'Ь›ЙQŸжђЌvц\GњЉОе?Elд{LОєїsdžgюлїƒzъ Šл–’ЙšЊ_Wя›ѕК­чЛ*ћ<ђнбHŠŽ|—еЏђ|„ЪK#Te"єа№шдTЊњSЦw]ЎЂ~ ъ‡ŸegЧ}ба'Г€jАxr˜Гi а<KEСлѕтщЄН3Ђ1ёj(ъщэ‡Œ ’ђ$ЗйЃ”њ‘(=‹вя’gї;&5›fhXGмov •UЏ\mˆ6ž–ЂЎР-“bт]т|БЬ шЩs~ВsкЦ\‚мљдшˆЮ6˜‡lЇЪ5иіT4l`0х2™_ —gЙ+ЛВоќWWжG\ч~нЃ&oоА”5хЬЃ№F\"ЊљQЪ2|„hјјВЧu$ГPсЬгъь(У‡ЋXГ›;Szі~џ фкужg™а6оь\ВxІыП”‡?@VЃ™a†ыН№Дѓ*QњЈl\PUВї3$r”rЄ2ПLЙ ЌЫ]j;љКE§…ЪЩпбЅƒ?гIP,НЋFЈ$ЮŸn$pmЋ >’ŸГЮџѕdW…C'сЗВQџcN;)лšVjЬёVњЕсšжfO0Эˆ0tP­јО%]X€буIиf4Зq=}иДхЩнкЄžNh/ШЦЅUЎјiьEБиЂ$V чщLуŠ _>Д +К3.цqGў"НВн„н!­n*YМ%Ђ‡јB;ŸLЗЗmј[џЬ…ž6™];пЮHi†ЗsНB†uЗЬИЩОёgДYц5 ЩВ/FžБ]шџЪю5oendstream endobj 247 0 obj 2219 endobj 245 0 obj << /Type /Page /Contents 246 0 R /Resources 244 0 R /MediaBox [0 0 595.273 841.887] /Parent 243 0 R >> endobj 244 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F35 43 0 R /F36 6 0 R /F27 77 0 R /F25 87 0 R /F30 42 0 R /F24 5 0 R /F1 107 0 R /F31 93 0 R >> /ProcSet [ /PDF /Text ] >> endobj 250 0 obj << /Length 251 0 R /Filter /FlateDecode >> stream xкQЩjУ0Нћ+tЋБтбžk )JKу[щСБ•Ф4^j)нООВ•C)ц-3z”…Ш](†tЦ)S•MВЬ“љŠk‚rЁPО˜yѕ‚5хT€qќшїv )зїCЗŠЦ‘зќ~О‰ xJ•)c”šєOD~N”@UЦN}МuО)†wкзL5Ї†ёwvХLQ~цЕйюм_^Š &NмЂ­ЎИ1 BС™Ћ›ў?vMнжM§cIЪРрчЮй65(х™ЄFh”†Œ…ˆсl†.5.Iиоn\ШV-№іи–ОюкxћЌ§~Ь<У!§Xz9‹ЁђГXрхŠ0…яж_4жaцƒ§ŠтЦњ}lVЙQf2> endobj 248 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 254 0 obj << /Length 255 0 R /Filter /FlateDecode >> stream xк3T0BCcC#=##cKS=SS…ф\.Ї.}7CSCC=KSS…4АЪ”h S Эи/.з.~9 гendstream endobj 255 0 obj 65 endobj 253 0 obj << /Type /Page /Contents 254 0 R /Resources 252 0 R /MediaBox [0 0 595.273 841.887] /Parent 243 0 R >> endobj 252 0 obj << /Font << /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 258 0 obj << /Length 259 0 R /Filter /FlateDecode >> stream xк•WKoлFОћвП у Ј6ћоeŠš"R m:8Hr %к"J‘.Iљёя3ГГKQ-]Д0`.w†ѓјц)Й№'WAђТЉ•SšKVЛуеЛэе›kЅWЪpќj{9Зћ/ьзCљ0V§zЃНga§mћ6VpeCdјНk›К­ЪФR§u*ЧКkd}s-эJ‚6kIцЦ‚ПлъaНQІ`ЛЕђ,ЋQ&А}5ьњњ^ЋгxЈˆјаwp№lWэO}І–k`}\[УЪК)o›Ф[Зєм~њXއ$ЈЃЛЁkёЋŠЎлЩфЂ4мM=ћДбЮEЉкyжЕU:єDЊGtЅъЫ†`‘ee_ЃE_oЌuьЖy!ъ}еfVЧŽеx Чі‘ЫО"в4зћЊЏі Жр$mй'Tо5/mwЌЃXe/LWŽ=еMCЇлЈ 5РcOћФЧ—шpDФёаVЯ#f‘т_mVвs%s|тЮлhYрrН‘Rі~f„зЄРл„Ÿ7“SІхДQžЫPЄМСЏ„cї]tRX†‰Є…ЁХw -y'В#phgЉ*ЮиJхg*•МPEЊЛЃ<ЂV,1мZ•XžD8ю&:ˆ‘Р~Ц‡gтG0R Ш-<ˆ‚P':pЇOŽU§qH|_…4-%ШFщ‚K_\фIILХг”н]пкн+Pš^џG$rV€У5ЊО+„фB‚9кs#tNŽ”šНЋ‡ŠД‡Ъ• %лП’ /@Šљtб ’ђ9ЛЕ\ŸЌ#E­k№€ГмM|jі9> ћX>`у›bлЎIЇыЂЄdрЦуˆaРЎф4bŽhЃ‹˜у+bŽЯKЬ/Ќ—4НŒ кМЄ?pa“і[Ьњь›>5Ьиэ^|5ьJБ_№Ћ‘ЈUI5N2j"–`  {–9w љасPЄІвк=6Єœ-  ЮOиsЛ”ЇбєЙ-ВœŽј?5ЈDМГЛŒЏц:фјоЄ~^‚Щp'ТEЕЁис”§ХЗёPŽx’ф)^MQŠз‡2™г=<Џ`DДЁОoБЩЃАI!fІp˜јA[=‘гоѓЂИєК|РЁИ<зЧ2EЪKšT^%д§e"С}DЎiŽŒrИž вXўYЗїI\sЌЪ–Xc*’†!—"ЋћМЕ’Jro§ЌгПфВƒj•2џz[‘Лmд}Ц…9ЕЏvMйг d‡ЗKЕSHЎНŒ3CxјD+e4гщ† ћ->,ЛnКrЄФ˜n нўД`ђлЂ]\Ы9ŒZОаъ‚{ sКЈлzLЃкЇѕЅ9UяК~С=%—.'ђЭ‚eR€п&1”э~Iˆ‚5/ЗЌЯ‹ЃINЃ‰“9’qи*\˜FВЛ­vе0”§ бc Qy;PЃ/S}Z*ъ˜hа_hGj–2GqЃГ_І>§mС^#xyHСОe—u^{&­SQJo‚х.ИхœЮQtЫШВ::Эт™3QЬSDpи~`ь‰˜н(ќ‡ЅxIВщ“ЁЧz ‡R$”s]–уd\сSЏ ”Aё0ЕП4т–L–єIR^Ћџgєи5`CЛ[Ф~1шМ&РT]ъŠk›{љS {мYuюбФe,ѓ*ƒrќМm8жЄ%{$о9n]м$B Ÿ1Ж@Тећэеwй0W endstream endobj 259 0 obj 1302 endobj 257 0 obj << /Type /Page /Contents 258 0 R /Resources 256 0 R /MediaBox [0 0 595.273 841.887] /Parent 243 0 R >> endobj 256 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F34 5 0 R /F27 77 0 R /F37 5 0 R /F35 43 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 262 0 obj << /Length 263 0 R /Filter /FlateDecode >> stream xкЕXЭуЖoЏsщЙ7etЬˆпdŠКEнЩЩv‘ф иr,д# $yЧгПО|$-yhЯЄйbБcŠЂяё}ќщЂ„tA%\‰….9aŠ/ж7яюoОКЃrA)БR.юЗ~щ§цЧт~W/WBШтБя–+ІŠuН9єaЎЏЧCпюAу.ЭўTRбж|ќМ”ВЈі‡:ЌыЖЫŸяџѕеŸnЧИ"д˜АщG\1# qAеnrBЁ:.љtI†œШ˜ХіаЎЧІkн—‹/KbфbE5ќ'I•ЬцМ$Lа ћ$§TЪђ#ќЁ B›€4mFхDIХeD€Н$ я "ж–ЉБ%ЖdўЭпЗcн/W\йЂr?ІXWћ=NŒ]f_mЅ*Ш}з ѕzЬlЇeiTіФi;Го™P #тС|[Лoњо™ч‚uЄ%ZGнŸšˆН Ешк'С›P™%3Хг’щЂУ‰КяЛэТРмВдГЃ\;oжХІО€ЫЉѕ5 СŠIТKы?јSю(1<рќ№8~јwЮT‚(Њqhaлжd2€„Ё*Яz}шћz“Д%„e€‰cд[1}зЕџшкЯ9’ c<wmзЎжp~`ШЯЮuџkнЎkH5Ђ70^ Зь№рўўтс{_sgV6р}•sŠ•ЌыКо '1ў|<дьЁ:6 Hї_Bш‰KЁg1Ъ$ї:Оw>џRс•7€ќ0=еї[њ6цS cеMћ+>5о .D~ЮоpЊŒЛџјЂAR^|њ9іŒ0}aƒ'Žiб‚KŒn.аyГŽlюA$l=~бЗ9бз"зCргиТdЇKТ9Ÿ…H}|є9’;CŒјћ‹ƒіŒc—IМЅ8 ЎpюЌJd`j(>eДСї]7ОыЋu.p$œ’в)У­dIЁ5Уt#Ъ‘›{Ј&ш‚Cž bTСщ3igюжД›њ?€кџМ4Ьm,И*оСƒ‡чp:G|nRў8ЋDЮ'`/b›ЋъBЭеч(Ѕ)аaDё)ќоEКћt!=Ў4)… ПЧˆ”ХaР”…ЪУ0т“3—‹ыf6m36•ЫЌLЬJД{Йэ‚щТЅW}JЏ0‘ §!g ЇШєЕК^’’Ыыu-Ўеѕi-МEфOЛfэРэ‚KH‹TЯ+‹ађф+юaJ_ќ;є)7ЦHдтЬћРGŒЁ*СВu9|@ък f=с~еŒСs…ёjLƒ‹žуН-W]%”'ц‘ЕБ"ЌTЏк8•ЉЛ,ybИ|Ъ8@„†МCИ3(ј%…%bBŽp‹ž t‚АЅ{Х‹ъuе.9-œS‚=ъqчмЉ,6™§JясR@ђpB/Ф… >!Ў–уDЕм3c˜Ы?5упЯ\й№шЃУPrBБђhРm'іrex4а1ƒзNЭЙч2(‘,КњsF„!&ЅFŸz<(ТЎˆжC№d`wBЯ=ЙBяhы',П/4Ъ€ЁŽ($†љŸЌB&UŠmп…BR‚rIsЬОњ:ЇЌ№|NИЛВ ГQхПх`r_е ) :Тq›ѓMXeЭ„Ыd$ "%Пb|H"\Dа гF6,љCжІ~їZ\@KG{кc­J)/ЂНљцў†BЂƒќvча0Еа“ВDЄYєѕb{Cc(5бдКфXWЉœ‰`NWˆєыzАWЌЎП е/СTo‡љVsŸ‰X1HFaaT^tyЈx*бUЯg,aƒ“”г: HЅHЈУВ\ЋKЩчф “е‚СЮ)Пqы˜g €з…Абжё<Ї%ЁМИ!9QCIЉцMѓ[ќЏP!”Ю‹!VАпz“xЃБЅQ˜eнр’dˆ6 шыPћТёрўп†тяЙ(4с7ЕaЇ’.Œktєь" 0gX І*6Ё­ дЖyxмзާB–ŒЃЪђл— дзіqЪmiYЄf(pла›љ'рKн>RнЗ0]:aК@ЋОUэ 6œ$МH=Е4љјЊђ эž›@ŽЦ]етЫ,ЩbZ“Taоv/тŽIЈтŸuЗ@ГwЗЁ’Cд 9яCЦиUФ{‚1–іu= Uџ‹p5ž•у”7ЎДЊ†<ёЖVЕОcfв’gл†~ЏГŒ арџчŒFј]§4vэъћъq7јTЇйџР •z!ШЭЭнM$>уР•KюWFвd4е8™ZюL(sHЇ:uм!я@щGбЇšŠsМk(ГЅЩ‚•WЇEHћ–Ї}Ћш)’0ЃцœoDЏЦ‹=јAі'Ъ3E.А?№TUЪ+9Њ”Ne7Е§АЯaРbРSйТuL§0ЎК~ућO˜К_BKT9Яћ.ЬAsкxд€вп. щЖ• ќYЬ*о"ЉГ›Х™в’TїЖy-ЌˆZT}wШs JщІск9š‹чnubuZ”ЃФЮ”у[юъwвў›щЪЋ:Бћ?ч<„yА_Œќ]ЖЋхъuЛЦEXК]Gї—h šЮACkwDЫ^пњ`+ЯvќџщЦ_шvџў1wQ{ъпь/Г- wMW˜ЏRь/Ќ-аFJ[ЇС№Qelhў Нё…Vendstream endobj 263 0 obj 2024 endobj 261 0 obj << /Type /Page /Contents 262 0 R /Resources 260 0 R /MediaBox [0 0 595.273 841.887] /Parent 243 0 R >> endobj 260 0 obj << /Font << /F15 7 0 R /F35 43 0 R /F30 42 0 R /F37 5 0 R /F27 77 0 R /F25 87 0 R /F31 93 0 R >> /ProcSet [ /PDF /Text ] >> endobj 266 0 obj << /Length 267 0 R /Filter /FlateDecode >> stream xкэYKoлFNЎ>ДчоtЄбpУ}яЖшЁH$@ЋC€ЖFZED$R!ЉиюЏяь‹х•-ЧMбC`РЛ\gПзЮŒ№Є€?<бq‚'В ˆ:™­Я~šž=ПФ|‚1вœOІ G9џ‘НXœџ5§ѕљ%‘{/a& (Ў=Сшk\ ЮY ЈКѓœ™uлЏf•ЉЯaкЏnьšШfЋІ3~к7a\OпТ<7§ГцУ"AЂ‚‰№ўЯ‚ & Pв;Ž!Жи“аbД‹’‘Х7)I$А…?aз|—“+ŽД–“œRФ; J#=ьјCJ21ТЧЇ‚g ŸХ3Q8ЙІ"`JŠ*5ЩwDORћ€є˜ž(Tэ#•@ю„K€†RЕwД C’R 7E]]LЯ0ˆU‚8sZ 6 У?­&­™,Юp№Ša7FЗ-ЦGёдžTN(b нc@ ’š’ш"Й{'+rА“Щ$'@Х М$ э6]F']›~щ§nюќ ‘UыЭЪЌ­ћ‚‹šЙ_,Л`ЩєPщкёgš8ўЏЬUёСžіr[Яžчй/І­>К9ЩоИ‘e/ЫыНiнЮІЭЪЭhvЙsПб9ѓННЄ?ЫевД&Š‚LdŒIFJA1!MYЯlErphw„ЪСыUфprV„Шf'кd63ѓmk:Л(w5ГБqщifЭzГэ7|Йм}ед^•LSi'ˆ1> †BВЊЗšЃ8›;œee#Q™yf_а ЖоX˜Х7..УЧVUАixZ–іхG‹ЮјЄaв•ы8ЛЉ-U_^[]!РЫAƒ‘nл™жяКЖTлЎwG(vfЌ\ьFе<\с.ыЋЋО*WСъ6ŽPgзеКŒв8P– U№&мwї ђ№щœ`^ž?.z‡ѓЌєУЌ\­ќ ЎЌ„ѕsˆ‹qcoј) HcЈЌ>А)ї€)‡аушЫВ_^Д­UбЏрЬ"^WU„лš~лж~од&Lс,Ыж„%гЖM‚X˜ЦtЄЅ™7оЙœП 1и(Рћ§-іuJ?Љx‹НоєЏпЇdФQEеТ›Dэв„вйCpІйЖmЭ<)gТEЂ§(qІWM§sSЇм[p8#лЛжъІЮgMНѓ’іЉgЦЉЧGQ‡^э’—mзіџ[пŒM ЌРьœq‡јkЎgЦЬЛЇŸ€d_=ымТљикщ}ЕMEХj0,|SдpщР]с%(O•ряU§.u9э ~ зСеCИтЛpх ‚˜ .špW§mкш€ЬкСсNрХ ѕЉэ& ‘ѓcТВ‹лAЊ’B\Б#Я:ѓёЂˆмњŠd 4A rWхлlwћ Иˆ@гpH‚UіЎБ юоД+6­%рм]ГŠЇБЫeXНщzГіKM2ец4о7u2фjxпдЋЊ6eыЙ›нaЄ:™ЫлtSžИСЖ~_Л}Uw fœB^u_ц’C~ЅНмp2љБймŽц{аœ nжиДиgGŽА##vЗЭ›#ТЂ;?Ел ?HR*AšœQфз{ R"…є2ыMВ Ц%–vNОŸvю rV™h"мбœ^ }ŠюШПЋ;њыŽШЉ ƒAf)йк˜ФЧqњ~]’/КќŸшr|J‹eн‡h?хщ“>O˜”э2mjъЈЉ(œ/Іі™MЭ–QЎ\д'в[Wc b_љЪžЖКі‰pнєю’wсYСTяhгpDGљl‚UЂ'qищбzПWЮv›WЖяPm^фXУ\ћ:L+zXжИQŠ–wє5$ƒт Yz1WШ“})мД(ŒДM.j@‰jzлS‘2гJ„]bI]ЅUРoхfй9Ž’Фf -Вљ‘Оз|/…З‡ЎŒД]™iз—­­яэќЊъ—~Vжaм„JкШЦѓ=‡ІO M;ъХVЙЪuсєQ­IWIф;"з‰Аp 2mюЭ›RkkуŽEяz*œZ(XДЙВyЌа›8TвŒнйŒЦуXnМЕзпnлйњФmњLГЖыѓІћ†…ШІч DъО[Й’“кzЁ­"jsН)ыnЏ)#СUф(ћЂNTјЃsиš]hЦeлlcsjЌG†іUZ‹њ„^*йяЅІТJn;еЎbуФєГ•“№cћиoР?&Нз94•ї‹5…IHіm ДВМC1§ћ -єƒe›А…‡ƒNЉ€ `ž&%ЌЅ|А„G[@%ФЃ ?I ЬЯЋ"š:э$W f{Z)х_Šс†›wШendstream endobj 267 0 obj 1814 endobj 265 0 obj << /Type /Page /Contents 266 0 R /Resources 264 0 R /MediaBox [0 0 595.273 841.887] /Parent 268 0 R >> endobj 264 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F30 42 0 R /F25 87 0 R /F31 93 0 R /F35 43 0 R /F34 5 0 R /F28 86 0 R /F24 5 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 271 0 obj << /Length 272 0 R /Filter /FlateDecode >> stream xкЭZIлFNЎ}˜9ЯMG +ЕА623qВ e` ЩMQi&%“”н=П~^m\Є’дюДЃ\єXѕъ-_}яU“†?2#”!…љLb†Ј`ГbsѕЏХе—з4›‚4чГХЪŠ.–?'_Я]|ѓх5сЃпH†Єв^`YжлЎlч)“<щnKs“%ПчХіІЪkїДЩЛІКsїП`އg–lWюг_0ЩšЖsBЛМщЊ|э–eSНsžф\ЉJЪ!hžr…“ыЙ"ЩЖqЂU}gЉWб\ГŒ[Eл.Џ‹ђ Є"Yй/р&w—іОэЪЙ—N#xGнЅ|Г‡‰ЗЕY"х0…“ъŒ&яцFоЩŠY’7U~Г.лgЮlTŽЭЦ5‚ЮRJP&3ЋдЪЫ7–FŠ#)Ao$5Г$тXЃГAЦи42a†8ЇоMwG $рзу™†˜Ює|ž!#ЃС'JOЇSœЬS*UђТ\d[Fš1„…єvcД§ЫэЦl7ё4vƒQGԘAA†k+ъRтs”’№дЇ  щ>\Ч р.ee‚œŒVоZ#ƒfe' *ж d4VŸ4@:-рФgi@3ІQ­gsœаСІ @J$тЬЅžяbв šyндр†ˆPfDэeОиб}ќ ˆ;-•Евк "XqqѕrqEF‚‚њаˆ3ЈЪ?ƒu7хluE4I‚ bй›•2;EюŽ”‰(r`PУ›o(е—R]H… 1ІЯ“Jp@vTЈ{|@rœрtК и`9r­T &Я;6юTСЃL !ЦN{д‹сG{RgЇ'<)цIњзzR~ OІ@ˆ+;˜Мgšврбдћ*рШ$N;Е—dиџOfЉјXYЊŽMЯž4KON№Y*о#Ki$KйGШRёБВєzR>Ѕ'GЛВЖ;/S(#ЮI,В)ЫуM™G&LЁnAœ”f4s‚ЏVъwXtЪ_ˆџБjБoї+ЊВ6ЬО[п;ЖTЌЗ­ЇQЇћžWЩЄ№МэОˆM/ ,zЎтkПHŸЮ-С(= сMЯ№DDЩ€џˆY"AТизDл-jЂj2Іуwqb˜ѕCОˆй†Ђ ‚oВ.І&ДPгТЩВТ№ыˆ~s7Љg…ѕAoьxЂЯŽTАЛ?Р ˜Vфєcвр˜Л)Іџ<Ђ‰УЎЇЪƒХшЧ.ЦьР•MbьT.@’]“]х*yŒ“Њ3Џ™M_ѓѓЉ ’ВыЪЦ§`ж\—%МкTuщфrїЪў]2)0~жї8ўˆ†wР Џ—;Qе”…щјvpUIYTІХQ.ƒš№ю>–_4#fЪї.ФЅЈ P§јЈ #ќ)GOvŒSŽЭєЩF­zРbисbb@™iD(›Иёё0)ЮТЄz,LЪC˜гˆŸŒыЩФїШOf?2}Њ{i1ьЬf ЩLИ~‘Ћ›Žж.s‡dŒbг… PЦЮ"%k>aY$й9˜nVлfc0бМѓ˜hязЈЭшPmЊџєШwЛuх>Тž ПОѕ Х m‚zПћƒоnћfŸ7n‘ЌіЕХы][`pФlEIъRўЧ( SšПwьˆЧЉ1їЗF _‚A‰!мЎПUБm№ЗдHAFЙŠуѕб8иƘЬЋ|;К:Š0Š” :ПˆІCАa^2щЭЊ“Нй*ВxЈРд‰оьћrauФ…G rNВFЫ тњB)ЫкgFЈ6ewыHџвНp?ˆЄкьжхЦдP„шЪCXБ=ЁMfžcЦџО|зН|cŽ6№Ыpф‡c™|у[Зц‘фЕНfЩЕП~{coXђSИљ.П{щkŸhВиЎGйdЁc5\ЊМЛ-›2Ђ0XTё–эŒФ .Шыed,г`сЁю ‹‹ eЊТŽљ Užh™›/НŠrЙoь”т U˜кэжЩлЭnпОє}rЈi6ч€с4ЧРSбѕчDѕrRїMћщмїг§щ(уё­АGVp•ЄЂ šЇуdЋЦW›їЎвЬяJDАЮXР@в Ќ&ыwKwaб;Х„‹sгІk} 0‘_OлV7kЏVй4” чРeP}ЊБ7bDKMИВщzћВibЬQ›рќ>‹P`(еA{`>†FHсдџ{lR`,ЄгЛю‡U„MЦœ{ЊИrЋЊЗbG wы.Š}cH\D+P=гЬЖђ1&Vъћm§яm§і`LИzН­гТЪ$Є ‰цЗВ.JЧл,)АъЋЁQh|oSк7)š1)UIY1ќЋxњЎ(Ыe; cУХk2сMЉn4q47ќ/ФtdЭ*CJЈољ–(ФLЈ…;Ё ьСцћбdн…8 ^=Лњ”ѓvoЋД…СїымъjЋЂ`;dqOђEпѕџ?Т Lгendstream endobj 272 0 obj 2203 endobj 270 0 obj << /Type /Page /Contents 271 0 R /Resources 269 0 R /MediaBox [0 0 595.273 841.887] /Parent 268 0 R >> endobj 269 0 obj << /Font << /F24 5 0 R /F15 7 0 R /F27 77 0 R /F25 87 0 R /F1 107 0 R /F28 86 0 R /F26 94 0 R /F30 42 0 R /F38 163 0 R /F31 93 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 275 0 obj << /Length 276 0 R /Filter /FlateDecode >> stream xкНЩŽуЦеОЖ9цІ[(8*Гі*Фїxь Ю-Б[œHЄ†ЄzёзћUН"EJЅeК“@–XЏ^Н}#Є№ЃC‰UlЂSN˜т“љњъэЭеWя˜˜Pи‘rrsч!oџJОйlъjЪYђTЌГ6ŸЮИЩ‡l^нY9§їЭпПzGхшмŒ1B•œfІ?-ИJІR&йj›7юПNЊ;|п.s|бЃїЏс`]<ЙЕ„ЕCіŒ`ЗггI83Џж›m›/№ЬЖ)Ъ{\ў’RQp7аъЈЃ‚д-Š/ђ:/чŽ+Р”ˆ-ЊВљdzР Mᆛ€(Еб_І3)’Лm&šXэaQp#б–{ИТA\]п\бT#шdІсдNЈ&F‰IJИ5“:Ÿм]б ЋRkТсК^Y:Ђ,ЄущN„ЁCJ>DT'‰дfb‰ЕТУќ’Ъ4 Z† RВpсS&ЉЕaPPсщФh@ў“1'p’эE+‰жЂнЃ„\я` щг .RDСюбЯмnњ2Цl+юYFюб€тЬ=8bcŽтђeiЇ‚ЯтЄИUњџ‘-џdйю13–эY†тВ5/•­ѓWЩМgвœМ<тfд[ЁТSчЇ{С)dРЭ{IНа:f,aQх„J r7.ЊrЉ’Ђœзљ:/Їъкк’ТіЋ(0Dq9aбрнЭvюЎ]тПv™ХP`,ЦО–f‡Цђ&]Rж‰њї‹5SжE„1QЦэыЌк>9Sd$—Ј"„pЉжŒY!V„д гFцRfйДe!уЕИёИ,‚ž\Вœ1c‰Г&Ÿ2ЅGб,ЋэjсђЅJЪЊХEŸˆ]]хMƒ+PsщV3Л{е|мfuŽЇ зЮрб!qU€{іАыlюH[ex‘ošbU•Ж‹7|–˜†(л1ќ}6_^o‚мdЏ ЎˆЅд9™э.pБ„ PЙ‚ИсЬУ;pP.’EОЎpuШ}­#ќб"‘ю4оцM[жd“5"фsка}ёр„щJ.u”W чIў”­7ЋpПзЋ!ЎgGLаiЖwšр@і}UэrэўRggAExЙTЋ•?іˆюс_е№ _x3…Ї­ѕvо"ђ€хщьXЪ#fˆюГы€\јь: Чt2uц­д&љъљыHnф7лLObќљ6*нЕЉo'Б\Ъ*9ШcвtѕРa„œсі jyЫ†eт#ЦtшKKO  p6T+o"ќ@%XGШNЬYNєiNt„“1ЉРе€дPуSз1A5ˆ„ZHЖ ЮP3Ќbі“C*@лДЎ/эK~‘‹йэежЃУнзФŸХфJ=/чх*Ь+хЊЦФИиrr• WlџѓhqlћЄwNwбж–ї ћ‚žщЅ$ьu‘abSМ+ў|`<a„Ѓ‚кЃВв„+62ЯЃ”X­OЋеžUы%ŽЏіЧ3ш“„ e J,n@zI8i•|ИsSРЃфщЙЦЅж?–З&UH1”їОИСЪш˜0Э%>b_э#тДЈ |DПТG ž€5г>O*…дХх сsчAЭЩDh~46FЋчPмЖYнvEГѓЦQ— ѕр"Lt …r%m(ћŠQc›Ї”Ј~ ђпЩƒмŠЄєTбЇ(ЛЬŽпG5›ІУ1sз^ Ъ мX;шœИуІЧНш6 зwУБ с~!’oqжЄћYSe0(’4ыFНЉїm­ЧUљQ–`^ ZъКШœЖЮ6м)ЅК˜’ћDKC(ƒ иmбAYЅiя#‡Ш4б}zpЈš|~Фё”›гЪу„ѕц„Ѓ9z 6ЧvFR\ІФ@TzQгжјхUuCXгЙгИ š6у!ь;§Тљ  џ)л,?Bwƒ0и„ѓuо 9Ќ –„§ЊŒ }њ,”{ˆ~0Pф 6:xџ†&єaЊжŸ№щ'яƒ62бo,ѕ ŽЃ‚t-:#[•G>ч sВ§v­СЈvйЏvЕ‹'UЉžт4дЮƒС С$Ќxзk§#ЃМendstream endobj 276 0 obj 2312 endobj 274 0 obj << /Type /Page /Contents 275 0 R /Resources 273 0 R /MediaBox [0 0 595.273 841.887] /Parent 268 0 R >> endobj 273 0 obj << /Font << /F24 5 0 R /F15 7 0 R /F27 77 0 R /F28 86 0 R /F30 42 0 R /F35 43 0 R /F25 87 0 R /F37 5 0 R /F31 93 0 R /F1 107 0 R /F34 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 279 0 obj << /Length 280 0 R /Filter /FlateDecode >> stream xкЕV=“л6M}П‚“4рФ\‹OžЧ'v‘Т…G]’‚'ёNŠ%Q!y_џ> €”Ш1Є;7*DЋ‡Хл}o!2N‘ %@•Y.Ь–ЛЋO‹Ћї_„Ю„€RыlqBЋПиmгц…DУз›eŽ–­уЯ~]ћЫVuЛyШЕfUOпши№~г]чџ,ў|џэVH–ыЌ@Š‹ИEŒ“"ГPZe+“)(Ѕ (1ЄwВЩЫa§wBdТ‡e…(KуёУњbфБoяыHmзlяћMГїП4ё˜Ђ‘+pR^ЬЁДуњp‘r€vЬѕ:C-ЂХАnЄГ8Љ@СX;]PTЁ@[R 7 -f…T` †PДC^’}ўяОђяшфVВgР*жеЙЌnЋ­ЁйCn$ЋкMuГ­ЛDЮœЖBЦžFсЈSwВьа6wmЕў+ѕŒY'Цƒєuзя[8TЉmŒ#7е~•@CЪˆ иMЛкŸГдЈ†XŸыОылЊЏcЪ§zxјZ?іЭОˆ§„”ƒCIЅ@y–щЏпЊУКѓнƒЅ i…‡OmуХљМЊУŠcЛК_{:HСн;т•Kжжно„—Ѓ–ЗЯЙlXAc.„qлlЗіqГП‹ЏКчЎЏw1Ю+ВЏО  $_™ЉŽТo›нЩM"{f*]K›ѓы§Žœf™kСBhЮОхЊ$ЛЁЇхцрП’нP:PG)дOеюА„vŽIhОGёћї)у*„)UЪИцU$oА';yб‘>PяЫžPЄM~дјдš~„DxdjАдG?ч­2Ж&—ЎŒ~jчJи…{ьччФ>фя?ю#љЅ}~I=>ё%изЧx|ž,щ“оЇеЙKš=—ъЋ’­Ÿч№ipI=/еŒ щєx‘1ьL#&U/ŒіpЉ^vR/љVѕЂТHЏ{_!%тыюџVЫцfS'с(L5—w‰Žf ЭююЉ љ„ж7І№Г—ЎUЃ,]&,hЧ§ЏЉ+@—оУ)ZрT8ѓ N_šјВыФБ—RЧ*,:;&чћ˜ЇЄ}ЁнOі1нiЦ&œofQМиЧR–3;U‚ИвзCŠђ[ŠTŒ#“з4ЗЙ}ѕ-ЌŸсIp"Т™зЖейЋЈ‡Oнр$Ї ѕшiАPЉ)ЭiAљІ“H7А2v ЛЋЯ‹Ћџ Сн}endstream endobj 280 0 obj 971 endobj 278 0 obj << /Type /Page /Contents 279 0 R /Resources 277 0 R /MediaBox [0 0 595.273 841.887] /Parent 268 0 R >> endobj 277 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F31 93 0 R /F37 5 0 R /F35 43 0 R /F36 6 0 R /F25 87 0 R /F30 42 0 R /F24 5 0 R /F1 107 0 R >> /ProcSet [ /PDF /Text ] >> endobj 283 0 obj << /Length 284 0 R /Filter /FlateDecode >> stream xкНWKoуF FЏОє/ш8ТЎf‡ѓV‹’msшiј`7­-Чl+•Ѕіп—ѓl9у<а бx(’ЩCAЦ№2 Дд<г\P-vГыљьг —дX“ЭW^rОќJ>ЏЋЧЎnѓBCЪќ~ў7ŠQЎJ/№%œ4лŸћfЗЉЖ'ёщThDЉ ЊPЈWr/?_oЈMiВШЙ!ЃzЅШВ>,кЭїМр–дQЈ[зс№Бm№РEНьлсДк/УУЊп/КMГ?сЖоV]Н ›Ў 2ў§ЉЋЮ9TJэ њИ&mхДU[ЗSdеVA; №„ЬРP<ЩЉЖЪk()ф—Џ 7Ъ˜›мraD3ЇТввRш˜•/ЈїSьюc^(рфsSЏтуŸѕž@Т P=ЊЈфJ’jлc fˆ5Цш,RПeмœ(УЈiЊЅєŒjсЉU ˆhгЙœа%ЉR<ŠмЅgTугЈœ{–ќсƒиНЗѕ*/ #_й=n9'Тrv ї1ДlF•1бР/ -ЧѓЄ‡‚  Є-ѓ”e”ёЗйх*3јыI\Є/ 'ТЎ*l‰%: }HF€}tЄ­УbЗІp1ѕL> Ып$…Z+Šхі~А­ЇМtœЇ E iЈцщЩ#=o 7тШ№wЅщэ Њ=ђŽ<Юi8R–_тЌд*xgO;–ёЄЉkЌOw!$ЕPFX)ъђ1ЫяM]з{…ЂЫпRfmИlў3•K̘Œ}ЁДьKL†БДџ'Њ$Бl о†%E!ь@_bГПц3Sb™b€uвм ъQу›ЕuЖšAœAŽыqT8уGpžЫ–7Ž0œУ˜мTŒыЪОw'іщю/иціЌ)OЌ=пZFe‚J%‡ЈѓdwBђwн‰QаCwCwr3 #Mчhn$iVnUюf№–Љт [ТЯnГ№AZВЋЛuˆЬвЉ–%YT{71ђ=,ќкТјФТјффšнcпХуаv№!NeСQдяХЗž [ўДŒЏ7‰сkY?Дuц/IѓB Кmг†盇uŸƒ№сch~œ!Бџ§ШyIb?<ŠЏьмМйКА‹cfи8ДУl‡ CЮ8Ÿ|,…ЁФž8н‰i\ ЬaЮ–‡TUЁМ' Й™ …ёkrDЃVФвzХEУ‡šПmšgBp]њЪп*Œ\ћU’ЛKW ГTšAУЁйbєтмЭ‡ЙЖ›}]ЕсВЉџщЋЃ;“^BPУЪ^ЅБЩГЦ:е~Ž зш;K6hŒ 4=уШ|юЇp•fRUsD—у'‚лYќBшњж.рТВY…uп„Еn[_zјш* ПX}{к.м‡œc›ђuЊеCїаIњŽаS˜ЫžЋrМ5‹‰Ÿ%†'lЃK§~Y#Š ާ…I;‰ХsЙ єИрП(о%“Ш)+ѕшb"‹œJЎЇјЯ5X0gљ@bŒ VХBlc)z ј“ЯюБfћ˜Q,Ю ˆАЗRPzŠiš‘SL/ЄФ{›ВbOцŽпУM•DУކњXС€­[К ЦћжЦЉHЋсжўk4С“endstream endobj 284 0 obj 1221 endobj 282 0 obj << /Type /Page /Contents 283 0 R /Resources 281 0 R /MediaBox [0 0 595.273 841.887] /Parent 268 0 R >> endobj 281 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F34 5 0 R /F35 43 0 R /F27 77 0 R /F30 42 0 R /F25 87 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 287 0 obj << /Length 288 0 R /Filter /FlateDecode >> stream xкЭYKoЧNЎ<$aCHгюїУAŽmЪСЩ2Ак’“,w™™YЩњїљњ5n/I9В№Р~дtWUWеWUЫVlХ$#\Ў „kБкм]ќхътЋW{Œ8ЅVWзђjћЖњухЛЋП~ѕŠЉйFVЄ§W—–WЧ§fhћ>вŠ9­DЉLќїУaјлaЩИ™‘IAЈЮdћТ9š8kгўTбoЭѕЫЫZ1^НСœиTŠmв7 \WлсЖpНФ2ГМ~)2%‚цћџ|Ysc*^8ˆYТKt*1ЭЫД/ (bGu=ѕНLBѕ‡н‡KnЋЦOM5м6qНљЯqэпхkЮЊцLj8šюТпМ,Us}YZНЅя0хМzџ=иeявУЬ ХQHœ5ѓћЂDnмџGIЕ‚ЦAљb^КX1BљчнЫеЪ`5=Ј$N˜@Т Ќ"Ќ[еб‹ЭFFjІuќg2[Kq5бT>*юEqqђ ЪћCйЪ™цs“ЉгhA‚A# Хю(ХUА6ЅЊЮ ЁЋУаћЙЌж]§pшšmЗћј?к(›Ун§Ўљ9N`ХаТє…Р9|Cg М)АЏ SyŸФ'юšѕ..нЏЛСDuИž˜)И2мХŠќRmЂАЃFёN@ЁBи@‘Ы‚%œO‰•lU#2+eŸћрйрЊjћшЗm)юсsЉuњЇЗэ;RrЂEќLa!Х|ЗОiїыю“ŸŽ EёFЦж,ЎќчSW’b”!ёЏіoхtиzДЌЋ§!ОDгuxп јЈ‡Эциѕžg-В]Јъ:aJ~Нсиэћ8I48б›ЫёЮ‡Ої8 А‹ёaЇGW“ЪуEЃл:№Lё4’H™mКmŸе–Д4]Ž‰ЧžšФ ѓ J^чгњПŽ}њ|зў;˜uIеБcФ„Ž%(“ŽpІчКЦI0VXŸgvЦ |зYopАШ(Œ#xD"ЦEѕzh:€С‡K!N]н5У­Zm WB/œ‡јїц ‚H‹ˆЁ—rЬQšКъЛц&рЕ8‹з (L]vрдњЊ™ъ>Офюгўpз†ї…- ю#зZЛsм[ŸH КишY@˜h^уЦ žq+ЅC`˜ЯюљЙР ^—КGўw>ј>Ф)‹c4bЎ Яџ еПŒ>S|{^ќ}RЕїВёэYёKЙ#|C™ЙјKPхЪс0Ж0Яї>b|Z„ёб_БГMБчzrЈPНP'ŠцрВЙTДжњы} ЌДК[][Д.ŒЈ^Fwf5ВS N)1ŠЭрпGqž†CЮF­q^О)=-вT•3™ ŽлцGЪфОIЂG}]8ПжœP” u€"yўAЄ1cF рT˜и$’ы*% ;-;Р…!JФ5з|ђeN—ьГ–Ь/ЁвDЄ%Yі&Э…Я8‹ЌўюФv‘эI'aфŠ‹…—И”K† =Ј0ТЈYдf|N“э$пЁЇMKЩл!в]|uсm@в`ђ.Ћu„zk#ЗuЭъњ‚хZ^СЈоŒJ;VЋ3Aш/?хŸ"W[8шBY0gЇН@ŒЙџ]ёЌ+рЙƒЯЁўeќ=IŸп{Їљ-єѓ0<зYХЉвh\I YŸЪ|ЂДбH­Ю‚;ЂpfAюDѕЋШ ŒABћ”]8§Й"вёm}Ц=%bЂњR".ы&`RШ!k_ћ‹ј5wŒх hЁ8Ќuъй0-|Ъ6Mq.C’€Q wb‹ќ›ІЋйКк”ЏvШЇУЭˆC #HЌЈыЌz|‰сlпјŸљmв\S›~aБй\ьОЁЂ0Ю­Œ ,хЂ€oц€Ь)L=Еd~ е„oЊdЗœ+фЁ5“ёИзƒЯŽ|R“в'?y[+qв#Тьу>N‡лѕG‰ЂiošPW~ИDйИо}§с7|В)лАТrŠsБйОG!ВK”‡И7ž=ЁЩ hх’!D…Ч”N?QэјвъћШЈ]0ъПˆ}Ъп!&Lj*ѕн‹Йр*з>}ˆћ‡}х–K}Г3:%ƒ|– :†d0j§›6j34…\дЂџ?dЪSљЌM"€ь~нїAP†жжoY‡„"—EОќ,HХТtж–TW§qуЯНwУ8=Н№.ыГ‘й“љK~ђгBГоЅф2Ч\)cSябMž­IЇM&N7Ё7@gќђп„_V,‡4ЂпDг ‚7ЙYчћЭMз+vбbDЖ,<ТЦ2AŒнK+TrhЫ/м)лУwЭMЉZАDЊЉЊЅPSщГш|b0z`ьхš%№М??ѕ>1yмЌ%`d4ы7хж-Ÿnй6§ІkSolЌœbЋља5й“0Jš…'ПNЅehкљŸRг‘djкuЭіх‘fmЛ‡Г‘flл™ЬLOЩС/ЕэќhдьˆЇГкг3ЩТ…чЪd&§0~—˜ŒTлcзюoтv ЩєЭКЫŽячзё;Qœ6~Й№9• ­_wОѕ‹‘bвз§™lŒџ/ч ƒЫ&­љГжвурaЕYqш5Ж1з–бh‰Rё…%JХ<оwл8Nf'›Гт$ээ~лnšОh€>у‘ГркЁ JHйaД—оMѓ(›оaт ў'I'ёѕИ?tлߘћžЈіM,kC—вW>дІ†Ї эNY}ГпДЛ]ly>*И?гшдЁS ьЃЗoѕЮVїщХ6 Œ'рЋsеэ:ЂnЬ*> endobj 285 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F25 87 0 R /F28 86 0 R /F37 5 0 R /F36 6 0 R /F24 5 0 R /F1 107 0 R /F29 133 0 R /F32 289 0 R /F26 94 0 R /F34 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 292 0 obj << /Length 293 0 R /Filter /FlateDecode >> stream xк­WKsл6Юй=є/шHM-oЙЕ“фаCІ“јфІF‚-N%RCRŽн_п], ‘6\Л3ЭБXь~ћ„Xpј‰EU1UЙ…уŠIЋы§ХoWo?*иЌ2fqu(Џ6?/џКњ§эGa&{0+UмџИ,eqlзcгЕDЊІЄFР.в~ёуg_я>wн8|х†ПїЗ—Ы•сeqЃPХUЗƒ ‘ЛгrЦ•ŒœънЎ[ЪВј>Р9)‹БУQƒi2n=э4ћњЖiыўy.V8ЪЊZЌ„fZ›РьPїpJYYt74ж4єРUкЂ‹Лx Žџј>Юš@ЏŠ&R4­w~ˆГq[З3ž7}§Vвh&eU(20HЩ\YE’$nPoы]њ„:БЈВsŒ UЖФ<œЎИIІƒ•…ѓуБoZWœtc`+Mб.сЬqџпWјžh‚(АŽ Џо@rp bZК Рћ#2з‚@…БяŽэІћ‰ОяЛ~ИФ…)†ni#ѓ@nцДозш ИI2кYwћУqєкњоŒ[њ^гpЗ J<œDм-ЁRзЛcыЎST=,JЮDA‚5ѕюЌ$ƒŠ’’”ЫАt XWяP]vЈŸЩщх)ЙљЛЅб$ЅGрUI“Ѓp˜тNТ…Н›ћU"jB(БA9јv„Ћ—рЋЭW.4ŽТ –žy(`P?``*[|ЭЧœ)ЂMСc–ЛУМg9љLЮBќ‰iфыMг‡­ 6lЮ›ЙЌ…мKЊ˜и9>gŸ *@ЊЙ‡и}№ˆOа]+W ѕоЧOѕ№7Эъ9–]зtЧ!­‚|—Щ%Гjо$;Цb[(Ь Бш!›$H^‡МŠШЦєРcсД3!_юх€А:е †Ъџs€—Œ—‰6і‘(ŸI~fU|ћ`CиР№4XРЉ#‚xšZƒЭєfuŽet1ыЦS„ЈЈDё+ џ06kъŒuБїу–xmBќЅ[€њt> endobj 290 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F35 43 0 R /F31 93 0 R /F25 87 0 R /F27 77 0 R /F34 5 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 297 0 obj << /Length 298 0 R /Filter /FlateDecode >> stream xк3T0BCcC#=##cKS=SS…ф\.Ї.}7CSCC=KSS…4АЪ”h 3 Эи/.з.~C дendstream endobj 298 0 obj 65 endobj 296 0 obj << /Type /Page /Contents 297 0 R /Resources 295 0 R /MediaBox [0 0 595.273 841.887] /Parent 294 0 R >> endobj 295 0 obj << /Font << /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 301 0 obj << /Length 302 0 R /Filter /FlateDecode >> stream xкЕWIoлFЭй§НёH!х„ГЯЄ№ЅESЄhtH›ц@ITD@]ŠŠэўњОY(‘хиM І8ѓэы#MrќбФPbKcў9п\§0Нzѕ†ё„ ЂNІKO9]МO\ЗmйL2ЎuJѓЩ‡щ/ИЩdNхžтfП)›j^ЌMЕpšЖхЧІhЋzыMZl'ГФу9е7eSn'ЬІmјUZўНїŒ;Ч№ъ • …ЙRЃ2)ˆБкГOWеn’ Івљ„щД3д,ЪнМЉf“ чЅ'вiЛ*УхmSу\хbпtЗХ„™єгDЪДЈжХliсNџ­hWсw[ЛЇtwNЌїД GEч%DхЭ\юЗѓ 0зЫјм–сtŠДh*Їѓ;w$}ДќгфžЛz§ЩйчYtК{иЕхf^:‡`ъ.˜ЌLЂЩEB5aД‹ІрDё`&Э d”2žО=Ia`е œтЮ)ЯЪsb-;АFf–N'–ЇMq hZўSW‹Y‘6{Du4ЉŒkbъВФ9|ї2\ў2И 2№ ЛuyDщмWФЙ:і^rжA)г=Ѕ ž[Tz(ђЗ#f9Ї>ШZD-ХlП†вE0Њ—aМЭœт_CЙвм ъ!˜ˆф,ыfуh!ъѕˆ‰”J‚АA#двОЁ<ябY"аЙСЮoЧсФрР<†˜:ЂЋŸІW”Ђ(ƒL™ыD#!Špk’ІL–W4NŒ#ЅeDрЖ›'™ VАшI4Б:и˜ š0T‰ %sЁMd—Ž‘_.‘‡dбш#„ZХнmF!pg˜gбЧwg&Р+СAB‰APMuІ†a4‰Јц:%UТа‘Пr™$O OƒЄћ3[QИЭ(б–?bJ—е—t$э0Хj•eМ­!џыЙv |vНI{zр1НрЕEБwкЮДIЂ}+<гыгX-{жМїZ+њl;>ыuзг”фЎк8ЪM†RК[aі†y|!4h ЎŸ_њ“ОЧФUzФAŒ.ћпђSбФ uUѓктКYTл8l{ЛЬ‘d#VЃѓCG+‘IhЦJс&ЮХБ|3ŸЩТRЈу|'1'˜‘nV2дг0ЉуТзqс‡ГpgвjsЛ.7qoКю.‹ШxьЁ§њ†1ьQоеиЛъэЖuЉ‡.ižўсŸ"Нщ чФ1kˆ8№“ юІnЃuэЊhƒgœ#OqШсўXзЮш;їЯ4ФSя;бЯЏЮЂi З4"zи8XБпЕс-І№’“ ‹•ЌфqёГИј.іЛ]іkљБм.|iП…9;EЃлПщИЅщІlW!k‹pїНщэ{›GЧp=иїўЪћюУы0—C0 БCEWЉЫБ2D›Р€У„^№6HюT7>ЎУэћEZ}ЧEьпй˜>…ЋHј!V‚‘„й”PуѕйBЄд@Hвeh›?GvВџ6ZbГ т™ˆ‰ “ЁыюœHЌtƒ­m/†McэwCящ‹r "LЦ|0ƒБИ[• [ !ва™Sˆ4‘Ђ•Х BЙИk‹c ƒ•†eAЅEщ„aћ81чK‚’9JћaїLˆ…ЩЧЧЯ1V(q|Е}˜дmщk:O‡Чz0щюL‘›"њ)+ѕvдЅ"SO/ВЏŒN4Šт“  ]фDiі%ˆњО_Z1њПЎџPwVтЉрњхТuЃТ(}ІO+\=ьOk,М`_‚SбфшšЯ CйєyМN JёН/йYЃ3џ)эА—uС’уMŽЯ' Ьќ AB<)D2П Л>RЖгї/ђ: endstream endobj 302 0 obj 1403 endobj 300 0 obj << /Type /Page /Contents 301 0 R /Resources 299 0 R /MediaBox [0 0 595.273 841.887] /Parent 294 0 R >> endobj 299 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F34 5 0 R /F37 5 0 R /F27 77 0 R /F30 42 0 R /F28 86 0 R /F31 93 0 R /F25 87 0 R /F1 107 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 305 0 obj << /Length 306 0 R /Filter /FlateDecode >> stream xкеYнoуЦяЁoзBpмpПЙф!iыMб‡РE“{`ЄЕLTЂ\‘:ŸџћЮььŠЄДђљЇm`Р$—УйљќЭˆ/*ју Ў8“F-l%™0rБкН§юіэW7\/8gNыХэ] Н]џXмоћe)œ.šŸћUлї_~И§ыW7ТNˆ­`ŽЛјХЇHP/,s_fДX”œY'IK$3††ЙJ,FšІ[#cU<.…-|ЛЙЧыаgиЩL­#ћЧ і5œж~1ћƒ'іПі?U\u~MšјИд Žэбїє|З?iC—Mћq)ъТwєиЁмЧўџVр,фе ЖкРbJщРvЗ,Ѕ0ХC мЗнеCЋšiž§їЬ‰xХŒ‘€KАМЖѕЂS‚GЗpЩeБѓУ§>№]у‚(в‹vїАѕ;OВј5-6=нЛеаю;’@N%•cкё(Т_šcџ7ПљЉве |ѓnYъЪпт•Ћт;XчЙS<†Š{ Њ/UС-Гт9MHц”Œп&ЄuLI•oТ+nиВTR7ЫšзЯeЋœ‰ћсY2<˜ЇJ!ŒьВmє|Uће|mMЏšў}†_‰ёО\ •є„нё Њѕј(ŠїxбХЭvп AЋуЊЂеЏ3—–UЪŠ\д tnmИїф›~е6[zЕjњ\Vр•bЏЃОЭwЂШop[[T'v‡Ш0И!*‡.~j‡ЖtХбƒ 'ц~W9оU‡Љu=‹и^Ё“ Nš’ТH=ЄcN ђŠ‰eЩЙХС.R€œ№oП=ŽNt–`Ka˜Је˜fёА+ †фё=&} /4фЁ›ЧUєЃ”+Є YrO Щ;riC€“‘ђЦ]>o8•Ќ†Y8Г‰`ж$m2{ ^’]Щ|шщЇ,JQkOяc*T’qа$dVYЪРhЏ\оcZ‹ЙјВšБ†Кпџ>ѓ}ЭŒTЯˆnX%“zаEЎˆс8J$2л(&€~мmWSђJTTо#СUдdViЈџyQРˆИi=efL$%D-|QrШj5щ//ЕГT ­ЛjЬЩ?gƒcV‡цфc˜]l!?cѕr)†Œ'Vзi‹пхђн= љљc$жЙ= Ÿ‚K;LЌŽеBЮjЎˆQmRTC2Ї7Ђ{@ЗЧоЧŠ<`„ѓ bЉ_Z,$u($@Dљ?<>‡Д]њjлvО9аRџд~GїїОЫœ­„”ЇС)Ї%ђц…бтъ  М„AaЁ GУлОнtX№™ŽW№рсЫvчг~іZ2ƒ˜б•}yJј5И{8nћ№рŠƒЅ2y\кпQОКb\ЭбK,а&š–_2a|cQПŽm`ЉSbƒJіqПM…“ЧЪ‰їтЁŠлkUT)ЦMкЇy@?_§дюš!рfЈ“tjИ 5Я5ŸjžbЌye<6J%цЧІР‘ds)mд,Ьы"М9Ћ‹sЬХиq>uЙcI ТEmœƒ^СъIPеgїЂррЌ9‹p&Nшѕ6_Аљ eSY=гB ОфЛѕСG]кŠеrн“ a=т’QwСЧОбЦ+бьOрЦч UuŽЉdФTjџxp$:ТVўпЧfbЯ,МвSxЅ‹ŽнЦ—п‡Ё)C$јћmъЪ6D‚юўУї7ЅRЈГОH`яЗ чxьщ9de \э!|‡Ш)Ж}ўаЎ'ЋЂп“WГ–>ЊiиOcИŸ=[ ~:єCЙ?Ќ}DхыЈьЬ"зНЬqbJаEэоч ЂаBU&> endobj 303 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F28 86 0 R /F35 43 0 R /F34 5 0 R /F30 42 0 R /F1 107 0 R /F25 87 0 R /F31 93 0 R >> /ProcSet [ /PDF /Text ] >> endobj 309 0 obj << /Length 310 0 R /Filter /FlateDecode >> stream xкнYmoл6оОfТћ&Ѓ#О‹іЁУ,kWБЁh‹AБщXЈ-Й’œ ЖпО#ВeGuтОlХ ЂШуН>wЄЮtРC$ЃpТŒG?ŒŽŽOЉPJŒ”ƒбдSŽ&ЏЂбЬcСDTV[…сŸMЛЖАЭЌЦLGœ—UeыЅŸ*‹Iэfyд”;ћŠ!ЌЏC–F@›FЛ‡Мp$M“Ћкz12‚љ7ЃŸ1еDJOA„^o/ƒъh€EcЋЋЁ”Q6ЧйWnуё)г“• )ьFЛ›@41к- Тр-ІDсIŠ’(Ўšя†1UК‡›!Bг>nrM" хiPчХх­СˆSг‘і† ЃO‡)…€ЕЈ›Ќл‡ю5н8ІЖяVцн‹.maЋЌqžu‹Юi78^яq3У‚}Ÿ$`ГЮW^ЋтвЦOVM“ cЮд Ъ„ыМЦ…‰}PQи0bOzK=OхШˆу›[^•D'НЪїxеьѕЊ{аЋШућ>u@ І›ћыБ%(% V74њхЉ4ISOєі–AЪЏudyЃŽŽЈЂD4b™B~,’ВABИI•Lh( O50QP †{+‚ђqХhjœ ŸTwжъЮ NТЋlЬћgš(цЂЙWcў95ц‡kЬ?­ТъN…MWaБЅАќ4.FP@‚Cђ€№˜1’дћ:ofН-Ј% уђ dпЪЂDђCВu†<щАЛ­ќ_ї–uЃлR<эQBƒЕ-џз‰LzXHAЖїpщ-\Л‡‹ю˜—лхЧ…д{wo§йœUМUœіH… oˆIC\ћЭёЬп“ƒзЌ˜ррiX? єчГlБЬ ‹Г›тЩЛdЮЉu…ž5ЭђфјјњњšŒыМ!гzEьduмhЛЭОП/VелЌš4Чгпыj|\Н џ‡4‰`DІ&щ  [гMYЇ Вт4:kРK КїВ{"ђlЕА“@‚Г>Ÿlу"wэ1ч1+ˆЊЖ_†nFQ]7{9ьIпUѓhХЋюtаd7…ы‡ˆтvя:@жQ‘-Т$?XŽ„фЯкLhEJпuzИц9рк3А\…fžякжЭ кЦ “`љ,ѕЮ‘"5бЁЙ‡ьжЩ6-чѓвЙє:/.qЊ- йХмж(вAeНХ™U#›Ќ sхв>›ЛШє€ |эnQ1pOФJz•Umg…'b+Яь;p‰TвD'X"ЯŠЦ^кЪБ ˆћgŸ­Юc’2ŸfnЮО[љфЋн+ўђ2’-і/Cн}ЙєOй yўЋ7хЎгU1ю0єP‘”GЋќ D]YП’ьˆТdеMV5QEx)—žЙnEžЮЫЌ,‘kож*TЧ8/\ЧмuЫпgб3<9`З8мcno6ѕё>‡хswХ\ГOёѓ ЧуыН]дЋ*8х…У Žї№†=9ЎPйЙw?юЕUUV5Žћ"q:Я.яƒЉЧŽ ˜т–їX1 (•+ЈQ‚RyPPсŒГ{М~6Œ5KюˆцгВ П љкШю%…iТрђиMAж[Ві˜Ц ЦPюЋА4-CI—‹хЊ %CnJ^}hZlŸї“ќ[…S5ЯТe`І'Ё* ИBљТ•†я,Нn/ќTwAendstream endobj 310 0 obj 1828 endobj 308 0 obj << /Type /Page /Contents 309 0 R /Resources 307 0 R /MediaBox [0 0 595.273 841.887] /Parent 294 0 R >> endobj 307 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F28 86 0 R /F25 87 0 R /F30 42 0 R /F1 107 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 313 0 obj << /Length 314 0 R /Filter /FlateDecode >> stream xк…VнOл0я_бGw#Сvт4ёА‰Vb“абЄŠфІn)MB’2Жiџћ|>ї#`†њ`ћОя~w—В!е?6d"№щx8ІЯЃ`˜mŸгСщ4CЦќDˆaК4’щтŽдM•ЉХЖQ#O0F.ѓхrђјƒ š"с ސL‹JvчpШьФž5ђЌШЗя*ыЊFыВѓб}њE;№Xш‡Ё0Žцj•—†ЮИаа2#УœеwььprvіfwќОoщ Ь_{{fu<‡U. ѓtЪњЕ№цs16B&љЕ‚Š<"y ч˜H|Ж:i§RY. dt#“_–Œж{•f<єƒ0АѕNБТ­# cc+ЗЌыp›Дх5:гpiGAЬZ(ЖЭ6с~ШтЁЇН1Ь6№G^'фЊЬ;mў[С›‘Ї‘‰lr9/TkАLHVmъmgКЕНДЊэЭjs"Ы’2YxЛљ: \)† 4%mиёPчї аНЕSЋFvyUj%]Eы/` ƒ'Zж$ б "‹­jё-(ИЌђ'@B•hAZОz–› EЄŸ™Њ;dAАЏёъЗэД+V<іГP§\чˆ"ВћЖэАЙэ ьЅ= $tž €и­–ЛєЎБS{zЬYщ[-xk†ЧlS+kv њ†эіТАЭLђ)’3WšŸцэЄiњi2ŸNМШЕ€oTёžє‘mгїНFrЂœкOРХqЎ:˜ХцЎр‡ž@E„}ЎШYTo5љ' ­Ж]?pуG§Љ-!Е№z‚ЕХ:лBdPгЗьe!ЕНїПcfлG4~Щє‹‰Фз ДJтЧ1Ў’1СС$ќЙ† Дendstream endobj 314 0 obj 784 endobj 312 0 obj << /Type /Page /Contents 313 0 R /Resources 311 0 R /MediaBox [0 0 595.273 841.887] /Parent 294 0 R >> endobj 311 0 obj << /Font << /F35 43 0 R /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 317 0 obj << /Length 318 0 R /Filter /FlateDecode >> stream xк­XKл6юy{шЙ7хbЭ№MiZ4 ДŠ"pmгƒlqГdЩ‘фfг_пЁ†”Ѕ,НЛ@‚e ‡3п|ѓрВ…lUDqЖ2TЎХjИњq{ѕъ–ЉcЄPjЕН%ЗепйЧѕ†›ЌmжСuжйсд…ѕ]зpѕцз[Љnжџlyu+шLЫ†Цх 4iєЈ№› 6? VЙў‰пЦhТпЏћ бŠХ§Ч„І x$ір И4”Ю;Ђauo§"Яў]+••ѕЩіјоосsИ;5ћСЕMј^6еЄСuјл[ЪdзјRйЮЁвž<ЯЂцrHИБ”(ЊW&‰”зЖ= )`В I­^ьm]ОK@Уs2a7CЦлЩСюkлum‡Ы};2ЂВcРбX-1ўnН‘y‘qмpoBeM;WхЗRи\Љц{ФbЯ€g…§ЁЌы„—9#TDоињuз%•”фLЉ)вС@!э‘Oиs№`іўџћСS8EњSЪШ@ДБЖВемYЬTŸ РЛўK —іŒ™uі=ЄЩ`+ќ\юїЇЎмŒ9есCгИиŽи(>‚ц!џcu‘&}њСїUјУЏЇьQњд”Л:œ4Dшкхƒ&Лd ШИ1?v.Ишšуi@ЕЧВ+С6лѕ+WФЈenќьk у˜YŒM™Хh†БіHізў™Й…њћ€(Ќ=шМ„ъмї=Х.(>Д}иН/ћБюРr„žФЎь<С№‚эaј`ˆRХЂ“#Џ§љ,;ѕЎyчOчИŸ–EОћгќ;v Я/Жѓи}Ф/a ЯњгЎƒчš ЌЬožC`ќЮРh”ђЕ9Ё‰Fѓч2EhRА˜O Э+uЎ|„!<цЗv№0™нЄlƒ2+b)ћ%–ƒCPљ$G Ає1Й"‡!<„˜BјЈЌo8Т.dш`пueэXЄ€ э … мїсе9–П‚{9tбТx!”о=л!'€ <ЧІ2bіšyЫ&й м5xР] C(А СxKMш‘@Рё!(с1г8H(h`^\cЁ€ТАŸЪЌ 5Ÿ@юїЇ0еЉКфјŒПHiuЎе•ћкva—+ыаdпc{НIсЂбЯŸš@љžУa?ѓУlah?MMIФЪЇ@zEё kС†„Я“ду L$јЅ2ŸŸCцqLсh_єчЈ…Ъ4ЌcЏЕЖIЈ›ŒNБЊУйъЉD/ЌѕKцI№С їŸ4v5q" Ж•‹ƒ™Ъњ#іаНѓХ3–йаŸRЁрDKёL,є—ЭЏаvДH/PР №`ЄXƒQ˜QЁ;Šь'{№Yd”Ÿj }т:ЦеwёzqoћЋгќЛ€cІ’ršѕ\o=д‰+‡|*"˜є– щlI ƒ 'хS$йЋ'vc]T]Њk…ŽЇйGХX W!ђEЛ;'šЈм> endobj 315 0 obj << /Font << /F15 7 0 R /F30 42 0 R /F35 43 0 R /F24 5 0 R /F1 107 0 R /F28 86 0 R /F27 77 0 R /F31 93 0 R /F34 5 0 R /F25 87 0 R >> /ProcSet [ /PDF /Text ] >> endobj 322 0 obj << /Length 323 0 R /Filter /FlateDecode >> stream xкхYЫnлFmаЛш/pIЃрdоYД@S эЂ(Мjš…bQЖPKrѕHЂПя‡ЄФ‘ФиВ[ Sфех}žsяˆeџXЦ$#\f† ТЕШЎg?^]М|#№ŒЇTv5Љ$ЏЦяђo/п_Н}љ†ЉЮ3\YQ?џmЙИYŽfAJtЅЄ&ЮЪZьfДY­Ш§h•PЇ qке‚уrƘЏжЫбК\]œ™|}[†‹ŸНŽтзђІœ—е=›Oч—"%lXOsSчГr}ЛРЅЩЧФП/+•x›Ш ŽПLWoКђz„ЪЯЃй§]ѕAч“Эќ:hђŸІЕНмtнч†Јшџ$с!TъњљŸTб„ITЃтsB…&ZёVѓоиќuBЇ„;U•u"Œp&XKЈБxЁЖ’љЊVbM”еGŒQ(•­ rYHЁкvВpчя(юU­(sШЎ№j уЕ йP0ЩUšўшуХyVТќЫ[‹ИjD`‰Ф7 цˆD!zЁTŒqЅс—%Њ~йrЕNЈ„CО“ЋДŠ˜ЮqJD#iAтЕЯЖЩkE;m‰l;tэfrП7§еI‡ј‘|;"hьЧя` ч9;рч„щП~ё)$Jу}N˜сЕЗуpС•oY”ŸАDJїXPВԘи-з‹љЧC˜„|0жШЭю7 m mќз}йМф6_мmjдРƒХ$ќ]ћЧŸќ‹p#‚K­щƒД­eoЫUœыp*—Њі‘Яї\фhnІƒnJwаMЉ№qД,S}ущСшgWc}€ѓN%ŽЁЫљ“œ#Šэмh>NYPjу&щђ_‰ЫсжлŠJF…їbTk|J HбоN{ЁИЙуDUанwг9рлћЅ/i7зыšZ‘dНup€€Cбz’G0їдЯПN|пˆх№Гf8”Šz(СwHГІwФ‹Њc”)ўs”НлЄНзb8e>ЂзФnёв1ЎsАїи†‰иДOѕІБ`(pјbі…ТЊb–‚§{dQQY(“ъ4ФWљЮinДЂ[FK–”ЂШƒ|‘tчP XЈШТ Ў9K9mрWœіЫOpЗ=Ћ’ф‡gp шU Ѓ[™sнWQ Г„PЦ$CŸN† Щр'ќтеєќ4Hб?`хЮY наdЩжЪœёмй/YX ЈoXШ/ЃšфЯBwŽDд'XŸ JJМoW*КљНU“0ѓЋC< KњVаHŒk?<1b‘№f} ;G,ЯQ>нaјz‘*сЉ“NDHй„%b@2Фy ыс­Н?ЂrgXь;щ“б‰@_ђЋˆІ~c4Є>БЇЩQэб`јиіэbОПz=QђDЉџ—Dyт7ПBYМЫ N†œ ўДS‹ž 7<тy“9qЋжGlНw€Џ™endstream endobj 323 0 obj 1669 endobj 321 0 obj << /Type /Page /Contents 322 0 R /Resources 320 0 R /MediaBox [0 0 595.273 841.887] /Parent 319 0 R >> endobj 320 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F31 93 0 R /F28 86 0 R /F1 107 0 R /F25 87 0 R >> /ProcSet [ /PDF /Text ] >> endobj 326 0 obj << /Length 327 0 R /Filter /FlateDecode >> stream xкЭVKoл0 оЎљ::РЬŠдƒвa—ыagпКВ‘Ÿ2*-?TФ:Вbm€МQуХр[1ИК&VˆSХl-&7йу№ЖјqumP1Шйё€†•…(џk„NrOˆ\ƒЅЈr†iƒ1 ƒnЧ‚6Є(‰‚љЉ]ЇŠї`ЮQKІщUCк}QУœ8d_{4‘ŠaпЏжX•#p4ˆ=Hz‹Йщ—*rФ–к‘№d2ќйЩАG“сџЯdИ› 4IВ@“Й`6мЧgCœйжАб;'ŒяБ=ђЙЧЄ?јœЌй}ПХqЮœpŽ_dmЯвёrЮиЗ9ѓњ|Ogмћ:ѓŠЬ|ъQвm•єZH—Œе7=LPZЭ"|ЮD7—"ЛNпО`#-Џ­рŒ‰ло|/!B]Й•ё!ЪфС(•FцуrЊfl/юHРVfc@ыžюэ=нНћт…Тй3з|мЬ=.жЅbЄ-Й|О@”ЩЩс4Pџ”Эн07фГВ*›r4OТИЎ&"жеЊЏаƒхчЁ ‡CSіА1`> юц.wsЗЏlи|ˆ%ыЁ‡ŸoЛp–На^"ŠђТR7ЉgŠЛЉИЎ9Л_жП—ЃХZp"”еBжЌвf“P>“UЮгe9N ЋzўАиQgЃjвО•ГИBVЏVхЏљДнk:ЃЃj4lD—АцЙєЊЕщ:ЋЋ)l–бIEЪ”Яm№в)lьКЦј z%qлendstream endobj 327 0 obj 597 endobj 325 0 obj << /Type /Page /Contents 326 0 R /Resources 324 0 R /MediaBox [0 0 595.273 841.887] /Parent 319 0 R >> endobj 324 0 obj << /Font << /F27 77 0 R /F31 93 0 R /F25 87 0 R /F15 7 0 R /F30 42 0 R /F28 86 0 R >> /ProcSet [ /PDF /Text ] >> endobj 330 0 obj << /Length 331 0 R /Filter /FlateDecode >> stream xк3T0BCcC#=##cKS=SS…ф\.Ї.}7CSCC=KSS…4АЪ”h s3Эи/.з.~; гendstream endobj 331 0 obj 65 endobj 329 0 obj << /Type /Page /Contents 330 0 R /Resources 328 0 R /MediaBox [0 0 595.273 841.887] /Parent 319 0 R >> endobj 328 0 obj << /Font << /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 334 0 obj << /Length 335 0 R /Filter /FlateDecode >> stream xкЕXK“лЦжyџAnLr+ТxоЙ|HRйŠsц!+„Ф.QZ‚ Jкяющ ГєЪЖjЋФ ЇЇп§ѕˆ‡?Бђ‚+WVЪеіpїЗЭнwїR­ЄfЮЛец!Rmv?пWЇЁюжЅrЎb§пЭПрKiSЮDŠћuаEеHbщэxюšqЯfTбUmџpьИ§Л{ЅWТ1) TZХ”ŠМ„`b] !UёcЛVЂК#АсХюМšcKћa#3ю—i+’0^^7 ŒGУЋ,šž–+zЊa_УПf[=сŠ(ѕА‡#Ѕ+vDђiпlз№КOŸžŽkщ‹O‘‘.†#1ое`ЅCгжщи}=šJhІЕв=tѕџЯuЛ}FxбŸр _длЁ;hщј@ЯŠЭG<ЌnёU}ѓиFAсг{n8шB(šЖЊv[Я6їЧsЛ2СжЅ–Жиьkb3j]ЮD$o&KљЎ~Я…n›hїИІ"#Xx8ŽжhкGZzG.’nт"˜5zU*Эd№ё˜чŒ'-ЪЅАCэ2œ43F&’‡ ЧИžАшH_ќ(Wb^!фQа››Љџ“BS3€ˆKХ„!гP№—`+щСftžЂіШ)э˜›zf№9ЋВНшsCe•H† АЉœЋ,Ќ-ъЯ'ф'3 С 2vќМŽ…ЈмeљK ЩiЇмvЫ.ЧD(fСДDБt‡`SћЫюПбіїq‡ќ w ›эБ'Џdн!™•jцŽ[ој—œŽ‚9;4™н†?КВoZЪe…ЇKс_+”№LiљE jMˆ}Œ№žАЬƒˆЅS;7|кз]S)Cтњ Нхg‚++ЈЮС“ъœхP^Oчж.%иІ|nЗЉBкTОqgsЈ‘плœmЙeZн(b№ы’pI1iароbk…:пю2ќC`FљQP*vб~жš.5}{<œžъЯєвbчƒоџџ›blЋ№ьЯ—ІdУОrёh9 9EšKJ+‚(E))3Тz( Г|$JеCёщAT?шœ7.!–{њэ0#*РЧМЭ5'СWc4.сv E&АCŒ‹Ь™ŠpЫы"œЅ виу JУ'“PcД4Ц)ІKœТяC…=њ™hіёх#zЏІЯ]M„Ђ8FщУ$`ёук€=чКGЁ}ёOjљ‘ёщощ0 2ЕGЫ/”іYФM‘YЦСI‘3‰<Ўбу*МДH0MЯР"олККЂ77ЩЂLНAk§Jt[“4ЮšЮOч~Ќu@ФLчт€ЙKsќ†РШ~QшаѓЇЎюы˜хCДuИНК­ЛЧgZЌњž@ёЖЉ†zGŸša?юЁ’ЩЇeJшeŠПвЇггq ђX%ЧmЩV vfЊCBсб [-‘žј0ХЄђТbоВ0мЌДœ9>z|Фкё”1Зёœ)hЗKаnhƒЦi№’сю›;` Я•0`ГMg˜АtWЏюDКLAГ€аiз+E7ЛЉ›7‰Іœyh$WNбpџЧ|З608Mѕ|q –_1/ЄБ ЇўЦv7/лн!?ЫзMЋ{г+Оќk‹™ЕџœгN2ЫУLН4аЫЩ@ЏуbА@p6#ЋhZБЩ LB€ЂљфіJšЖxqIN]гnh'qнЧkU\GШjz!ˆ„?цїЩ_мЇае4џ-…G9э и‰Ѓ-RЄМЊbЭМ#ЦцwL]p ЛьRћZVYЗЈЄQёžWЊ>оАуяъщёиЎ>р+Д]0XФz>s85єxсŽЫГіŽ \˜ш‹žNМПпЄ)`r­{юыUс=гТЧ›uŸ‚дЙ1>”Ријendstream endobj 335 0 obj 1883 endobj 333 0 obj << /Type /Page /Contents 334 0 R /Resources 332 0 R /MediaBox [0 0 595.273 841.887] /Parent 319 0 R >> endobj 332 0 obj << /Font << /F23 5 0 R /F34 5 0 R /F15 7 0 R /F27 77 0 R /F1 107 0 R /F31 93 0 R /F25 87 0 R /F30 42 0 R /F28 86 0 R >> /ProcSet [ /PDF /Text ] >> endobj 338 0 obj << /Length 339 0 R /Filter /FlateDecode >> stream xкWYoлFюГ_њєHц†{qwј!Ik EнЈPh‹‚–(›€HЊ<ЛEџ{gі Шx•І…qй™й™oŽЅЋ ~tE':“+•qТrОкжo6/ЎЙXQE•ЋЭо’nvП$”ЖN)œInЛіО+ъКjюзПmОƒjEс"wRN •b:FЈ=Ш’з]WЌ9Mžж)W2йUuйєUлLŒ@$0вKNAA)ŒeДy(зЉ Yr}Нqƒтpпvе№PУ4гIWў1V]йуЬ$УC1„QщЭšЉdЌёџnТй9Fэоэj[YТЁw*15S‰AЄто$MDii-=Aе{Mќ‘ћЧuыA>#ШЬ—хDHНJСЈBHЫъІэJ8Љ“юф%˜хюr8(аДА§дЛЙНци8›юыЖ&Г—;ЗЛяккmežk‹_™ќšЩ,fЅ Ыдв <›Q’ сїПŠ[ЩШ< ФP&р2Й^k–ДSЃjњЁhЖхK/aЮ!eЦxX‹ЭsЫiлТ kCЪЯ„З лќaЌ,ъу"С)Wј‘‰Єье:Эs­“ПpE$oЦ§];I_§Yтˆ'Е5&ŽюJGwl?2є .1їљлъ-Фпяš]љЁ Х$§SЅRЧ€‚J4c&Ј‡‰Ž~~rB+ЧWР4мšiЂ Еb?н9ƒМk0Ÿ.‘MоУыя—NюэлЖ>ўTn‡Ж{С,ŸЛђОjЮ љІЊнyФвLbІ&‹ ћ_yГјћкЧ‹UЭqцwЬQБрnp†}€ў”};gј;э !єJТ`€РЃ2?%'лЄ.ЋК8рDBЈJ Yjє{’чБDQšŸЫ(й,˜vЅK"eГУ@‡kЖ6DUpiСиŒ {ЮЯƒ‰ъŒ(вкЭыŸ‘цтлЭŒфжнђвш'9+#Ц]Йк_P_K љfф‰r*&Ы”юDМ}sЙ*€Šх!yюлЮЇCI7_јЅh0]шљѕpj)|› НЅ"ї5Є9 КДu„&С&ˆЏО,#ЉŽ Ђ)ѕdqџЩp'А‘Ov*7ОЄО“ЫWˆсQƒг8j$#ŠЯѕЯАtRЋЗXМuА4>ч™rn †ѓ…ЁЯ’gAіYAтs ѕJЃІ@am7gЕд$‡О#=UН+IїеєaйИJp‡ъ?-JžB€дH4Šx…ФР5цтштџх•ћnКБйЂkПo№€џ;"]фrШ GчЖ­ыьо—Є„Љ’ Ькјa gщ]5ИЅ-РЎ:”ž jмwзŽw‡вQЛr[aОŒе`Цˆ1ъsШˆЩO^ўX~‰`Ck8лž иЖЕјˆ}˜м)OюЄа+Њ™;Y“)иgюаЋУ†šЩ;W4г:шMn#ЬeR—ї…s:|ж–x{rІч„‚4я9™я9mЎч иtиеаd[юFlŸ‡24Наƒ,КЮЏЯДx!/м"SаЮ1 Pbю n]№šЇЂoK•^Tb6Uт3Pc(?зžхЖ8l!l XˆXќОJY-%_–f‡аБЋ„Lаdƒ ]бє6В`ЩЕЦИхиТ`–qqіЗ>‰кC‘FЛ˜†IРDвАЗA, KˆуPБ5EGoјнИ-Cз,-цWœкуPшq<щŠ“IWmuеVWп}Ц*e‘.Bђ›zІˆвЦ> ‰€ *&4ВњѓpЃџoЪL6§РбЄrЁb€2 CЯдcMq’AјЯcнПZzt‡'pžfˆ\s"—hјu…CгƒgО/fЮ…Х(-YWBvM#__КзОртЁђ<748и(§%рЭЇ–Ц‚—*омзŠqV„A*’‚ &q тNЈ юdЬџ*„DІ–Ъvљ"ўŠ˜FсБ ЊЂ›”vиЖл!ЊИС$aЫ7—0ЕkPЭ№yV ЃХ2pЮ„=пцуZ_н7Ж{…Б˜ТЈrЯёOœ№vSP˜B ЏBx~ЛXR:tБџUН;kendstream endobj 339 0 obj 1573 endobj 337 0 obj << /Type /Page /Contents 338 0 R /Resources 336 0 R /MediaBox [0 0 595.273 841.887] /Parent 319 0 R >> endobj 336 0 obj << /Font << /F34 5 0 R /F37 5 0 R /F15 7 0 R /F27 77 0 R /F30 42 0 R /F35 43 0 R /F28 86 0 R /F25 87 0 R >> /ProcSet [ /PDF /Text ] >> endobj 342 0 obj << /Length 343 0 R /Filter /FlateDecode >> stream xк­XKуИОї%СЗШј#>D‘ь!йIc:‡MАыœv6€ЦІлdЩЃЧtїљяЉb‘ВdkІ'РТ€E‹dБžЩW)ќјЪZ&mОЪSЩ„–ЋнщюЏлЛЗїЦ8ГYЖк<чvџKђ‡ѕЏлППНчйd ZF†ёЖЭz#ђdчіCыˆYN™ГŒхZюћћ-Вм§m{g4ЫКdкђU "™UыV‡;ХL™Ъ-4GГъо=КіCšЅ?ЇŸ‹гЙrн›ѕ&Kѓф'WT5vИHNХcш№фCџ—Ж-^`_8с&7L+ЛкpХ”ЪќFЛцtzзСqe–єGGћЕсIбѕиSдk†Жt-ЖHh‹К;4э‰HMM3Ыz-LтЅ'ТОш ЖоЈT%я]ыЎ6jс0д*ъ=Ъ љД—Џ„ѓ•uбОSІ“sбі(k–'ЭП&, мˆ† П 4КОiнž†Ы:№Ѓ|OkАn3@'JьЇЗ2Нt –—)Pˆ`'ВХ‚ЎЅeжf+эjЅTАЯgч%{.-Ј™хq[АЗ:y:–•УfNZ@ZыКЁB!е+ЉQиFEр7LЩНTю™Јtx›М,H,tЪјшібл„U– OЯТJщьь™a\№еFhјЊп)*aM™нFх†3)Vm™вќЫЁ)˜ЬљШі-ё7P’™T|-ьUЮ”•Џ…§•+ъсМЌQ)ѓРЖЖLœ‰I™PЩЩ l‡Ч ЂьŠЊЂVп,љ"ЯsfВ™+Ю˜ТўмŽу_<'pfL 3r~ЋЏЯ+Y:zкЂР9$впз@fЙ(Њн}ы> ЎоНЬ3ёšЇ‰ЯЙ#ЧCНwЯ>E[8—Œ7>ЁmТЊгД{П§BŽ‚q3к$ЊТЇg Щž"—ˆ…Ю!J@нЮ‹HэЂЧ/G'РюcљѓšЋЉ[ЂФдм—­лѕе цѕ udъ1Qт6J€ЛAњЇ&fbќКO˜чLр8Т7yВѕ"У pћЄ‹~‰§вO–ЏњЁ­}nBjMп>NЛœ:Ÿз8t[Ћ%ыЭ+yяЕ7@ŒЇЗТ4”ќЋУН2 ›zЁ|IшzWьЉЧЛн‹Ї†Yq…nm™1ћtєj‡ѕ^|эТтu… …ЊS;ЏЃЉ‘š–˜f% “{SqˆЋчбл˜AXМAOШCКРЦгБЉBГ;ћЈh‡(%Л=x~MfžЂъpя\%CчCEЃ/! GO-ыG$HПЯДšЗ_qЙb $€фы:|Б–УBО8'ќџHbЖsОPіЪсљŽ4€Ђ ЭŸЧ‹: Ь шќ Ю}4lq‹HМgsЮ‚œZ%юйЋћ Юг уаЎ*„ Z^т™FЙ`cЂ`ѓ'2OS"љPщh4њш­„ЄРVЭPяНE№єУ™Ј}C‡уТDЕьiф\ь/ь$Pн3ˆGSh†š`ЯбU FžЪўHФп\HЖЎ‹щ[­xюqІo]V –&EЙ!rфzУЙЩ;(fфYчЖyl‹гBxЅ>ї[Шю!З_јфUщЬRТriЋԯƘсЌf`ЖЏЭЄ1ЦЏжДУЁgчЂ{­ІЋЈL&UЈHр`%Їт7Dае.ў‚зиƒ–>pЉ!ЄnЗФo#w7PQЎGЌФшŽф§]Ш§&ФЄgБ‹˜…62љ9хѓˆFТФ—*'Ї"ж  LШ#ћАXC”)WU*hЎ|Ќ‹ cІnуЖб+<Ыйћпmtю3E3^1лТ”3фˆ. н:тЇЖЄ‹р8Bч Žж$с2k8qз&j{Б—l…ZфF_ќfБўЙ_Кš @Z€3 ЮР ~Ц6є]Ју32XЂ н& lМџЦЛв—X1ќM†єб>Ѕ‘тїЊž.йЅДћ)ў+Ї4HKМ}]йC–ЅВ“Г,Гs•GkiА ЩХФз"* а›ЏыВЊ ЌeƒЪ~ѓ~Т”ЙшмrФv^-р‹BRУдaAlЌ~6=‹‰™™~#”И(fŽ}ю„AЕ ‚LPт­ШZ3•f‘ EИЧc#Od~O4A“EЖЪф(ФІЦ Ѕр`ќtЛ”bqвМ0!ЬDsРСˆtpѕ~,u ЬR• ТэDфЩћ”Ÿyt4Ѓ/O.ИЪІrцclMС)t‡ьЛ%У0ƒxf\ ПЦЛ-!ьяОЇ/ЇЯ[њL}уЯ@в џCC[ ZвoG­џ.ф‡wїѓ fюцq|иыbRи‰Їbмщўr:|ЙкюЪ6аРТ—[*xЉ„A €@]˜XuфШлкЅ 1†щБ …ЋЦПyјu)D8”œA§ ˆQ—MЪк'1lNKК р ОчзnLŸЌљ:†+XŸ.vMлК y€]ЈЇѓ;FЃMНя‚ДЭ•j(ЧP›nе†F5чМ6WЃтШ„ЂЯЛэ7МЙј-…ŠЏЈАЂ™жы6K“cQhм'5ѕГЅ№ЪY*ѓзŸ7Rк|‰їп€Н"мКрEш Ъыу&VЪŒu0ЭžІ’ФHqNщп) iw/Ї“ы[№Я:цŽŽŠ$:]„47( 7СœyђшjР•SёА)i”Їоа aTO/ћ7уsN–5#Џ#RXбФœКЗЈЬJ;./уD•†Їu$l“зtё5нГt4Љ юaЈw}‰oњиЃžtj'ар~ЖлЁЄCЈO в,V:c†ф6^КўXЊŽ}endstream endobj 343 0 obj 2350 endobj 341 0 obj << /Type /Page /Contents 342 0 R /Resources 340 0 R /MediaBox [0 0 595.273 841.887] /Parent 344 0 R >> endobj 340 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F35 43 0 R /F34 5 0 R /F25 87 0 R /F36 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 347 0 obj << /Length 348 0 R /Filter /FlateDecode >> stream xкНWIoлFzє?шMЗR€5ž•Kкш&Ф’ЂC‹$&тШ"J‘9rьќњО7oH‹ =†ХсЬ[Оy;Х‚УŸXЉXЮЭ"уŠЩT-Ж‡‹7WkaBАҘХfH7х›ЄпЗK™%ћхJ*ёсZмЩэr/Юўе_.WZ№dлvыiЛmЪЊЙ!Bќо‘(Гђ{ZйІЄ3Ž{ЎA%ОЋ\д\5Ыw›_ЏжъЅRS2‹X;њКЮ>сф:Ћr%4гкњЗмp‹тešє4Т*Kv]{ =‚ ‹З\шкЭшАфBF§Лožљ{?ƒ Ьˆ"R‚fСР^Ъ$R’ЭNРу>]Г%KРЁэм3T—т ‚eJС&‚ф'šsPѕ~5L(&€ g<Я‘”`$Мјes!RЭD.€•) ФŒYpІŠ|бЙХюB a•Ѕ+Ѓ™Ъђ/‡•rЉЬX! €"бзsh%KG3JaШF/>‘A2Х TЪ ­NgA(ˆќџj”•aЙ›Hєњ 6с#”џСЂШХдЂPŒK@С.}ˆ7šd_ньi5ц0Оъѓ@ь‰ѓO§РА’aЋЏn[гnШх ]Аu=ЋDЬŒSLR“И%OnmgћЪ;Ш–LЄЩf™ ,=xВвЛŽоFŽкіžVmуА(i}"Ўko:{РRU@Юћ>2G‘Ÿ\W„љTюzН pyš wK—Ў˜œš›уЅckЎIWQlLв9бс2HНЗ ­чWœŠ—‘:Б[P2HVƒЇАЦвЕkыš*x,()@ n(ЉŠœW4Щ‡ ‚рSEd­щuSКћхЪ‘<{ŽOlКcГХŠ€4МHЎ№Ь$?ЏБТ};ьeUЮШzu<МЖ‡лmћeu‡ •Ш9ЏџBЦŠЖGєЃ$™ГМTБлŽє\n’ЅNМш4|ОДїЃB™”d№СR'РоЛjSs‡еŽ„ЁЩ№џšT} GЉ„$#ЕNО‹€Ђ‘ј‘.tчLƒ3OuŸы|ўЙ˜д9X}ЊnМJCХю„Xy6ЮУ5Ž є^B|Е]_…€Iљ(‘ЦРЦ'уц:t6РT–•yЁЋ™Ё1ž„6ХˆВC„>тЃЌ:ЗѕФBA`}@‡lˆ‰FЁkŒћSпЯЭ'ЎЯ8Й>Ј0,рBŽћ@]Ж‘ди№рq$@Wч rŒœ g;ш™цЬЗ 7L‰!ОВѕv=&эчЩaЂ#тЫј9&‹I8гЇ•‚Ђо UH еG1 {z ю;=k“ЪтF“–д5‘ЏmЛЊo#ыЧ*|О СThW35“ЗЄИi›Гъэ!N1˜`1 rшn+8,ЅЩ8ѓПЎВЩ/endstream endobj 348 0 obj 1438 endobj 346 0 obj << /Type /Page /Contents 347 0 R /Resources 345 0 R /MediaBox [0 0 595.273 841.887] /Parent 344 0 R >> endobj 345 0 obj << /Font << /F15 7 0 R /F35 43 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 351 0 obj << /Length 352 0 R /Filter /FlateDecode >> stream xкэWKл6zмKџ‚n‘‘Э7Љ=ЄA“nM‹РImjeюZ‰%9zФM§э>dЫkцu/XKфhц›o’УI4AЙЄ‰Є L“ВОјquБ|FYB9RZ%Ћ['ЙZџž>нЛСt‹Œ)•Кјsѕ ьd:]š‹ƒЎ ІWNХ`Љ†пѕш8‡”RDsтCњлu1l!№-xљЁZ›оЏ ›Юџx$з&„ш”\ЯSNыЙщXр—/žУё_>>с `Š3Јвйеїм№ЄYШu—YVп_зуvЈvлўѕMх}QщгЂы>><ЂИ~cб>="9@ѕ2э­_~nкю.(П.КОИлVŠ Ю<žЬ"љд”h@ б5M^WћЊ‡Bzшпк•J‰šЅD: юЃ…Іiёn|[yБUП Yк~ЩeЈ}И.ойвћМj ў§XЗ.ѕAП5мћ!т$Žl†aїxЙмяїЈ†ьA}YЁMйCpjQ˜Ї#*JєvЗќЗЖя:йхѕjщ0dAс‰ЉДъm„FшbЖšМyЫM4$’ ЬEˆ §†Lт“WMѕСц5„ІињЕзU7ŒўEЅOКЮЕІўѕљ–‡ўнђіъ50 г'VlJzPSЖЎ аЧСЌНќ] КžlЭп‘Шќьi’"O WXž”ЪЪ9@,ТЛ~А/2­ЭАёНlэw} –Ж/ИтЖщсE{ѓ~4Mib•™CiцSдoНU3 rЅТўUи牂UПK$”€Ю§ дDŒ$™LŽ2w‘ˆхH‰ †ЋTР]yRЭk>D[О>iљdЦЕcІhzЯ&х‰œp>ѕаaTzлnЗ­еЙЏšЛа M9vу,МћsRз?ŽАDEњ? ЭПЬ›ГEХ\„щРУ#KmlцЩQЧ– 5ЋъS`O ‹sH ЩАŽ`:1Њс4a3›b–`[’`ЉŒјŽйэиLQ3;Чf^ћљb1Ь ф4О™ЪH AИ‹‡’ђ1§ГЪН5Двs›T#.NBqOaF Jвцš0фь7І3БР2ЈŠіŒCЫАS+екЕo@rЎN 25БкЯ4•ш)Dфdѓ2‚ вIыЯ8P:;yЮСhu˜TœН‰hЂQy<q?њЁurДbнЮ\Ь?‹цўЉє< AJх ЬЄ"Vђ]47ˆ=нB69.у‰ШјW%"џd"цk2;BО‚квQ 3bŒ[ U6ABpэ€щњзЦп82&rтщрR{WŠn№CхоŽЃч.kŒАї\ŸЎ=ьМЏр0((hp‰ХHbђ*v~У BЦКXŒДфГ:bЙАУФЮMІs“7,љьkaЊНТ hЮзЌjъбNоГАФФЩ<ž3k*в@$FŠоƒ{2LфpWјЛ˜;жп)Д4’mX=ЫlFаЯќр,tіxŸK"№@ЮЮЇG>…qВƒn&ск{е„єГ3ЎаЇ3ЫhяœЇUНлšкР ŒI.m˜Аѕь>ЃйM5иgсЦ'=OnЁїПг{э_oBjлgdKиi@Е…ЌЪСFюvсeˆt6,XЂЁпэЏЌк;Ќ-?­.ў‰&Шendstream endobj 352 0 obj 1496 endobj 350 0 obj << /Type /Page /Contents 351 0 R /Resources 349 0 R /MediaBox [0 0 595.273 841.887] /Parent 344 0 R >> endobj 349 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F34 5 0 R /F37 5 0 R /F30 42 0 R /F35 43 0 R /F27 77 0 R /F28 86 0 R /F25 87 0 R /F36 6 0 R /F31 93 0 R >> /ProcSet [ /PDF /Text ] >> endobj 355 0 obj << /Length 356 0 R /Filter /FlateDecode >> stream xкЕXKsл6юєша›nЅf,яGfzШЃvнizHœцф@KХ‰єTгєзw=ŠЖ3эј Xћэул…й„Т›0.ˆЅjbЈ \‹Щ|sітцьт’Љ cФ)5ЙYб›Х‡ЂЊЇмНПѓmw>qУŠЯUПš~Кљѕт’›ƒ†ЃвЎ2­У%Ф\е„I5™ŒA„E‘ЃK-ЁJLі2?с…І`–R CЅ‹В^ \­51L<ўnўјЛu`ІщL2VмЌ1Цyq…жЈц ЏбХ|ƒљы ipŠн%vч#Ц§ž€~Ÿm|ŸmApлХј0Б9 eюKвб€&9яЦ–`‚§ŽtŽ#ƒr/WM…IпёLј=*э ƒGЭ|ъHR0ѓЖщ|Пo3\…Ћњ.›:P:‚†э!шxп=ю$1"ЧЧ[пПљ§ # ~Pњьч›38‘8Ч@qmCЫ ˆ†OJ„Г“жO–g,5’BSЂ­иKцNR u’ЏпПм—Ё##…45Iь|@kр Eј1m ъ>уК$Ўv’'uŸeKdЩqнoNЉЮЁљШ4GРбpiєѕ}‰§IRТ‘%nBQИЯaЬДsХ‹ ЛщЌ†Œ eсЌ3H]lЫф€† Y|х -ŠA˜ xJ %3c )єx‘‚эCEсњMY_aНcŠё‘шbJЫЏ<6Р&вH+ДДчшK^ь&ЬЇvы‡‡UР.Бs№­ olc옟р)ˆ'%О{ 6СІ3р8шЗdЮ”*фХzУs’SDR9тNPдшˆhЬW‡x(‚hЧ)(uЙnЪЧyJ9Љі`иА[фCn ИЇрO`Ё4ьdR:†баzё DфјџЧ AˆМGƒQ€‚е ‘WУ&s‰KšžЬvўеˆnˆЯwm—PФZЌU@я|œЈ-Язџ›[uendstream endobj 356 0 obj 1692 endobj 354 0 obj << /Type /Page /Contents 355 0 R /Resources 353 0 R /MediaBox [0 0 595.273 841.887] /Parent 344 0 R >> endobj 353 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F25 87 0 R /F30 42 0 R /F35 43 0 R /F37 5 0 R /F24 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 359 0 obj << /Length 360 0 R /Filter /FlateDecode >> stream xкНW]oл6}ЯЫў‚Tj–пУіKаm†Цmк>Ш6HфA’;dП~їŠЂ>bzЮ€Ў№ƒhŠ"я=<ч№’Э(ќиЬ2т4Ÿ*зbЖ~8ћiyіъR˜“DH=[nл‘ЫЭЧŒqТˆ˜/у<ЛљsО,ѓытer ŒЪЖћrнЛВž^ўђъ’Љƒљ• Г,И FЊvЎх‡OИЩЖЛћћнœльЏЂМХ.=šЅ§›W>4jXŽ–„яwлnTxм_p2_v}щЋМйUп‡ˆEФ ‘BЭ` БЂъЛDма‚З›§Њкэ›ЂєнtуšсX7ђMY4з^ЂŠоxП'KЬm%D`КO јЄШя‹П=&nDжДAуњУ2}фўe[s^ †g‚/pЅй‚II,Зи Вƒ}U4–Хmщ7ТЂDШы+в~Š[e‰uvДUŒeПЭїї8ЃCД9nUшУ§1™ЏЖЛъЁњVњc.”cTFd}ѓіїЋD’Эu7jНЋ*_‡evхІK4ЛФєЦЦћЩ!šУЉ!GСу˜hBQТ Ÿ€Ц˜eTqЉH‚D‹РŒ[ї,]Ю-Я:Ž'"‡œŒИМy›—РЃ0–8щVљf_Ё`Єk‰€ BЛниŽлэ*/7Лl‹vыMињ№r[…WВe_ ‰sФСЪн.7=!П<ЇDf…‹lyBc@*HhL"wмШ}Н #yIъ:yс‹<<:TƒТ„#Jѓ 4ƒАєнo„ №t‚ЭъёЂЊђG„;~ѕ/ч Eu­п|yлмASC˜K:“t3)ŠЈЕHpmwS’ŒфLwHrfГМФЇcЏђ9wIw`œiЦ Є„`*}№!—<˜ЬІђ9  а!Иz”ЖЛM ЉX`&0кШњeил6„эР9ЪЃЃqЖЁЄrnј‡TдœШој4—dpuЎuрамъСЁЙUЭ­> endobj 357 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F30 42 0 R /F35 43 0 R /F27 77 0 R >> /ProcSet [ /PDF /Text ] >> endobj 363 0 obj << /Length 364 0 R /Filter /FlateDecode >> stream xкеXMoлFэй—ž{г‘BЃЭ~я2A. š6Cэ’h‰В‰HdJJNм_п™§ HyeЙhZ 0`-ЩсЮюЬ›7oЩ&ўи„qA,UCсZLцы“ч'_r9aŒфJM.–Юєbё!{гДыb5 #ГEеmкъrЛЉšzњщтѕу—‚^a†HЁ&3Ю‰QжН§Ѓ7cjhЦˆaі—SЫГm=Ь84•–XL/ъ_‹mзo‰I #вк`zUжe[lЪ–ЭђЌ№?mQ/š5ŽmVOЙЭЖы)7йхtџЫpš-лhВЙ.§­n/­ѓ:™1N‰’HЉœП:ЦˆЋQŒˆ{…BD(aJ:л œ–K=oаћЗййvЕBяxЏX]5mЕЙ^уЅЪЊЮпоvхт LŸУ­Ѕп<7УˆZC˜сaїп‚$˜фŸkЂ‡“ gТR$кˆЩЮ6pХ!yїУтЇ й`NОbPšАэКZBd},Bі\И€I89а>јт8Ѓ]ЃвЮdиOЃ“ч,|ЄŠвTР)‘4ѓibEИŒ^ЬТ!:t•лЌщ7‹7ˆь’ž Ё2КОН“E 5ЧRm‰Ц2;–j(cЭюѕd%=ЩЇEљ‘2Y— м4ю6}ћ$с|Ц,фШD@Ј8О[yЯnЉђk№6Я‚Э$'9А• ГТеоцД9љхт„1A4югцD2>‘”pЃ'РЙДхdyТ"ЋFKFЙГ‰Д:Т_Єе ЭyЖ‡цŒi­ъrЂrё*<M Wƒ Ь›=š˜Х1Q,Ўь'HNИ…э>ђ›œЪ&‡йx@RљwOЊФШтГ{r щџ+™]Uп“L@чУ’ЩŽ%ŠSЁРN0ТЌoљЫfЕj<•Ля)ЏяЃЎOюzІОл3їт<ѓ’aЦф‹}'aaЌмSШіg[`jХhv^]­ dю”#шчZ˜”к^mШкрЉофЂк.J^_h њAo; /|єО‚`№ЃuYЄ6Ы4#BЦхžmS;в„S,А$2Ж(oЊт@<  ъ'pБKx.7бIШѓHsЁ!б‚C›АмеІъ`ФП BЯЗ—mѓеebgИ"™я‚ыq@ 89uП2;Н ƒЗ~ Вї‡аЃ`Јu=š9єРOMГФM9п4m*№@^Н\yŸЌQ%ƒв*рNymЌlцА‰‘^TыВю Д.м№Є=ŒSuЊF}ШЬЦ`}8Н$фэхЇ”>ЪITЙИO0ˆ0†$цЙ‹ўpэЛp +p aйсх0tиЛw RTњсрХuГ*ЛЯЗўjYИ\РXdЭrЯєfЊHкЊЈчх,T4ф[‹БZ;ё?4\@€П%Я SЫœ0fј=ф pуяњиЃzKЁKЦ0зЩЦ‘лШ ГQъqвœщЃх—K’г˜€7щЪSf(АD ‰ъЩdjš вћt=ML0дпяR‹€f/ХnЈЯНйзыВ-“ЬФ%є5:і­“ХMl/ЯВmЂ…‡ОM5]W]ЎJkгxѓБjtOЎKџh|ЈФ;4)ќeŽ{u‚P ШGЅt„›0y AЗv‚ђ”uл9.)кwўП,ИбдeчGЈ(ќh‰йCЋШL8Žїіiыюъ†;ѕ †"В@ЫжЅж†VЦoEПWE3endstream endobj 364 0 obj 1897 endobj 362 0 obj << /Type /Page /Contents 363 0 R /Resources 361 0 R /MediaBox [0 0 595.273 841.887] /Parent 344 0 R >> endobj 361 0 obj << /Font << /F24 5 0 R /F30 42 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F25 87 0 R /F1 107 0 R /F34 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 367 0 obj << /Length 368 0 R /Filter /FlateDecode >> stream xкХY[лЦv^їБ§BћBЁжdю—8аlj8E]­PHѓР•Ј]"Й!)Џ§я{ЮЬ"Ѕ‘vэl[,АфУ™sљЮ9пБ…?6sŽ(Юf† ТŘ­vWп.ЏО|УдŒ1т”š-7~цr§SіЖžs›=ЬЙЩŠїўѓrОвeн]бpЫeV|(лoUVvE“w%LuYхллК)ЛЛ]‹c‘=м•+\щ.||[TјI\*—Жјu_TЋИBН™џМќыlС QЪСU)•—ЏЩЋuН›/„йћЙ‚š2ПйmxДЉМ‘уMqТуЪж ySоьЛВЎТ']Q­уЄƒюyГnП,кВ)тдАЬТ‹IЃ€к –› ЎГ|ц Зm—7]YнтHe›Ц+S†зеv ЏЄ„'џІŠЬ#tvыЏ2лW%шЛƒWŒxIz{qJ3^œх]бЂUL'ьн†WЙїЌГй/UАAŸЗИю—o„A…3Р0яђц—њ§|ЁЈЩVwyYХO&шВ‚HЎу9к7ѓІХЂ`Ь…[2g'6ѕјВ_†emЙCэЗy0д.лн]=_€!qmCГВ WZАR†c§`ЉД~R­д“–ѕ№VdяъЊ+зyГ­ъ.тcаяЎп]?ц­ЦУЭ—рMлЧaО pМsЪ@…Ju- JО qяЫэ6|vп&*|е…WуАtб5ѕНЗcН-лE" ƒ6oѓСм№іж7йњЌj+К`).ЧЖцSџ˜А$SФHл}mВ`ŽU‡ЁŽcШў:рлЯ‰– Љ!ь‚fМхD‰^„"8Т яб‰ -$hЫ/iA SњА •Э‚Cъ›ќІм–њёcxЛ.ЊxрнР5'ТŠ‰6ћj“„r^М{В&‚›`‚ХЧ™ц``M1йљёї[Ѓа*Р• YfщС_ЌЖyл–+CbъAq‡8Ъz_рBˆЈгм8РЫxMQ4д Ъ (bдяя7ѕvЂОљ*рLA!WpC4 {0 ыВыˆШКŸчUИ–Uй•^ мчMш IZЁuъeц41жM§ЬеЬg/P˜'ќšЬ TYіa~"BџЙJ”3TVАь)j#bm•иЖА&ОІZh 9XLl…xЩ#aїяš<РqaКhgUНEі)ф3"ŒŒEo№i„ аœrT§B~Іу5%|ЇПЇwUцёGЎДSWърJ96В`УE˜ш3г‹0hЂА„%1‚ЯыПJШЈ—Нэў•N+BŠqZ ”KТ)ŸDоƒ/,Ї[A,3—і€Е€z… '!y(@ЋbБЊб™уGбЧ9xѓC!RQLaŽH7јчц€Ся7 c”LїŠ6)~Aм№ўu*Ыѓџ8—фйг“| ъ†ШqH;§АФывхŽrљ\ШЯ…м‰ŒфŠKКbM/ц7)Uб%=АXфЫm’$FИe—U6 •!“s^Ї2ќXІ”ЬZТЈœФVѓЁьыL™B0”nЫ{зџ#•„i%Ёnф}š‚2%’іP~•Xdœ5ичƒ7C<|uв$уŠYРc?яЂИгйO‡хчљH_ђg/уcу8џM2‹"Ъ™џ“_€ЌуБВЊ;ЯQa‡K<ис@h-М№<я‹fфmMxсЯ%FМkс03Сi(б„аOє%ћ9|#)$8&"ђ’>?2ŠGuІ@ †;›—е…бƒбўsžБWA№лкSXр <жщ-<–џћžKХТЕЊЋPЃ№4Y•‡Cr’Кч‡ўa“ћPЦLЯ‡Ц}Њ Ї юеy“T‡SёЩщ§БГ„Ъ§@ђ}ЮЛЏ‚)”J(РPR6ПЕ~Ђ ми$ @(юzœ\Ї ‚ОјpЇ€˜xчцPnД?wŠ@Јў`Ž Шчй8ыХ™HVЉЯкџ­'aЮе_–WЮ+ЦЃ†lЦ-‘+"œ5ХlsХbgQ˜ о” ƒOњжоDŸОЕЗLYMƒ›!wђфVpBЦИ™ЭkЬрzŽшXЂћэ№шЁкœУзDЏcЦcІт ј[Ії’ІŸА­в™Ь?€цXцгДŽ aЦ@н48TAШKKAЦxˆАЛ–ыtД’ƒŽœВAPœЮ’Њ­Я/"‚хlэ…Њ:dЫdдУVŽК†‰Ь!e—Ч‰ЪЁЅ&M[myh,тcЈи†ѕщпївœЩО§охUО­o§@ee‡‰VZlлvpZ]щ pгЗЭ(…(˜rХ]l“}Ќђ]Йj_Іˆ38P=Ђ“к}e56§с}tR;эpZ0ьpVщŠн§\QЄ№?яіpeY‘b0ŽгcФІd '&О7sЫГбQПБјuŸНqќх ?ЦІеxІYT—ыЃЬя.GШЯ>Š˜уЯМO="bьBjв‹PБ`bс =|Н‡™ˆ.Xьb?_:sмњќоˆ~ф„)FН‘!Н8Ÿ[ џDOњsKŠхиМP1№~—( ЦЇЈХhж‹3ЙBОHЃ&ФЯзqSХŒЬ№pувE\њF §фђ-‰c{ш&Ъџћє’0|H;ЪЩ0QCCWY їt OГ’Zі`žR=Нsфt>I’ь/м=7‡џo7ЯДhŽhС!2˜Ц_fАN‡Sv[ПœteЭЩЯ@њєъBўnŠ˜зCMŠM{Јpжџ:Єн†šaU4џ1,aХendstream endobj 368 0 obj 2182 endobj 366 0 obj << /Type /Page /Contents 367 0 R /Resources 365 0 R /MediaBox [0 0 595.273 841.887] /Parent 369 0 R >> endobj 365 0 obj << /Font << /F15 7 0 R /F36 6 0 R /F24 5 0 R /F27 77 0 R /F25 87 0 R /F30 42 0 R /F28 86 0 R /F31 93 0 R /F1 107 0 R >> /ProcSet [ /PDF /Text ] >> endobj 372 0 obj << /Length 373 0 R /Filter /FlateDecode >> stream xкНYmуЖnОо—ўЋ=3т›(нх>єmбщ чz@ДДЬЕ…к’#Щй\}g8Є^МZп-ŠV9"‡3ЯЬ<Єљ*…?От2gœЫ•I%™\•ЇWПоМњќžычЌаzЕy№Ђ›н7 gwk•ЩoЭнZ˜ЄщмнZŠ,Б5=ЋКъ+{Є—ГmэЩѕЎХWќp_ИВoкЛя6ќќ^ЈЩ МШ˜Щ‹АЮ‡ ЁW†ЦЇŒkГZsf щeR’™щЙiЦ •AC0m„Aщ_сњ}аДВ}едa!3™ФLЪ,hR/ЌKф&ŒПСёе:ۘ–5LrZілTЇўqZ§З­НyђьE›&) KuДШeAhIЃ‚РCлœhвўœrТй/ЧОЊ›іDNбЩЎъњЖк^ЦЭЫt:ЇЩ™аqї^^UЧну4WLkyхЪ|юЪlъЪЈd4\†~і гƒј‚3RЌЦљп.шЈ™Pбvя—Ж™2ЉфИONŽ–B1‘ а^1@УбЏ\@еg Кˆ‚01ЭsПД UDw 3€€Зf(@#ѕiˆP2LqЕй+dXЅИr‰™у[џ35џOР™Љx œбя|Xšc‚ьЋaл1ТЋDYD‚–2ƒqжŠЋф‹]…ŠVN_Ќ:РзS[IЮDЮo+$Lѕl*ЫЁaVЃЬЛЅд<Хпxж<ХЄЁgAб@jЋX Р8O­’ –‹шяПйz)lС)Š РC“ЇKрK™JcжzЛ0Щ4мљˆ№љ$’'љb9TGKИЯ#Šg‘ЕGI3сu$ЄKh)˜™Dв:чб/smдdЯїt/šхRО/ђx‘џ^ DВЌрГr)C•ўjPоЬ•чммЈЩ˜Ў”|2‹ж‹NЩ„ќи Kн7}CеS„rЏ<œP!яЌКJё‘)Y@з*Бmeыв­Ыtщи…_ЄЩЩBEўqС’8Y~ЋFi–ЅQрфљХGšr Ш“0џЎВћІŽ*A˜QwеwдpGЗІ} м&3Г@>Йк'ЮВЩ2™ž,/ћъq/xДэ>Œа–зBuЪ“ЎЁў`ћиrєйhОLЭЩŠ—ыЮЖšXЏs:SЖuG uЄЧ”Х 6сыв!аР•? ІЂ0Д6ЌАУwœлfпКЕ–Љх‚У|ЛЭМW‘ЩСBu`žjGЬŒы<,Ь,$д‡И Ж›њp˜ЁЋЛГНлQздXИG™&шiЈъ№™С4=nЛ.]pzTQМ O4iтЯГ'њЎ}I= ›ЕAДќXqпиіŠтч^QhиуОiЋўpB#цiђэ+‘OYуЉ!гТ hSе{*П­[; Лу%ЄlEŽ]Н#yЏ1vиW>а›пѓKsЌЄРГT~>Лєё}ƒРы‚Љ|žpЏјHЉЪІЈ‘Е›zGл‘9љŸqЩЃ7аЃ‡x‡ЛRщ`$в,[žsЙХCх„ј{РРL­Нvn‡‰PщBІtЏCЎ( 9Ё{ pУGЏ“‡‡ЄcСaє0D?‘и.|J7ŽŽ№NБ]_•4аœћъT§›NosˆСkV$€T’s DzcVіЕЖ…агЙ ‰эŽМCYдю}wˆhю.ьL8G=ЗŸ"w˜,фKЈТГДu ЈгBЯ&џt]iCџУžЧc"OНS'/}0C7-Є– ‡$'mј Зv[A QxЧBЇћўgЁєw]ФSрзY„˜[рюXЁœОѓ№їЯžPќ ДяБ=žъцЇЉfRОНKшr2ЛђЄ7ЯBЊ]` oŽyk81 =лпЯ—яЫrЯщBъ+hЭЬ–СYUЧаJKї9ууЄшМBИТ|6ипб+Z|чОMЙЊc—эшГЊlзЖvпкѓ_eЛђМ’НgЬ*бщ3WCkž‚Юя?!Љf?Хž“ЙSd™ЖПДnС&yЦr+№fI…"g™ ш—)BЌыmлњјє–zЎFЮЯ|јцЫ-c_oП[6^ђŸfgєљдQAdГфLaŽ$-‹дф}PйG Ofњ_ІTк‘бP%єWbјП„dа\њѓЅН„f>AjŒџЅ 99сЗpPw‹QЧ!AK#g§rЌaоœЇЭaшњH…љpvўDwTK+р .Џ̘'!18\#kfyNЌ#ЯP№ея6Џў0vYbendstream endobj 373 0 obj 2139 endobj 371 0 obj << /Type /Page /Contents 372 0 R /Resources 370 0 R /MediaBox [0 0 595.273 841.887] /Parent 369 0 R >> endobj 370 0 obj << /Font << /F15 7 0 R /F24 5 0 R /F25 87 0 R /F27 77 0 R /F30 42 0 R /F28 86 0 R /F31 93 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 376 0 obj << /Length 377 0 R /Filter /FlateDecode >> stream xк­WKoм6ОЛ‡ќ…=jŠЁ(> єаGм4@@ŒЂ@лƒ,qНBЕ’AicЇПОCЙ–bmjХ–ކ3УoО Пbc )к(Z&ЫM}Ијёътхe {1BlЎvAѓЊљ#{Б§ыъЭЫЫBЬі`ЅЫИпNу6/™Ь>mЯ*зV}mѓzи2эE"‰PщPMЎНїk‘Е=š.І%\АhќЗЈ1w,/4#LГMЮ QЪ<ЩЫъёёУec{и2•ЛjВM Жžc[wU*"L<рw0НтгDQхO*шалгРчkфg\wmoAЙX žQEL‰Бы'…>ээ—QсѓнО­НhsгіэЁ§Ч†UzMeЛc_Oэа%Œ•Є`:ЅТk\МКК`мрz“ CdЊ$в@2{zуьfwQD<2.ˆр'НХ '–y‰&ž›Ъ#pЛcx, Žћbžи†kžosЬ[@аgRЄˆf -—)EЁд$ЏЯц‡•tž–›%Ё†Э@XЮйёv›ƒгCпŒ1 є8PR"(дYС чOТ[M„TЊЁXVŠЉiG(КыЃOЁG5AырŸЂr“—œ˜BуWС \Цu8ФюЋ@"mЌˆ7#Ъx,ЊюfpэДї‰,ЋЋхё}4VУЭ™Щ ]|…;xia‹g;иЄuзі7Иwы†<:Ћ0ч™ЈmstіЛЕЋцDR@})ˆћєЪПіэєіѕ‡ЪU‡бпРЛŸ>зПнц‚ЪьmuџБ=ј‡‚eЋOЖЧX\fЎхf‘ЖЛН}pdQЊ’/t_ЌёиЌ(Ђc+sIŒ”‰є—$!Г>фЯ'ЈЭ-RЃн№–Я@cwеБ›pѓ{ќ+ш9жš(#WЊћl ˜гЕ8 ТŒ˜Ч!Sв7ˆћ6DŠvNЉ„*‡š!0Й@<<иH dЋУ‚jШ.ч)‹nЭvЪ =›ŒјiIшZIŒ`„k3K S‘хќbѕ‚™ТЂє _TОпZДQЏ3ы8ўБrЧЪKБ%6ИLўcЧ~U§ХŒ‰Џ6a,HŒŒlsЉiіОя лrЊ1DПшЊqZ9HCc1ќ љу@Г X‹а9….ъ†Укyaс—!'~БШIтLЩ%j’ѓХє›ЏБ-Эъ#ДфHри бЃ™›ШЛд{>Zнz*Г“uQЉ3ъЅ™ГpyіtЏ^™4БцМ-‡MЦЦГlыЙvj%‘2нЭ/ітXV–0XВ`АrFДђ}кtєъ‡нЪ T~Рd%а\еu(€vњи_ЅЭО†л‡NГJЕ†А"! \fb6„<6 -•*~тНiџЪЙ5Ћ‚шŽякф'мббѕш}˜NН0uћК,Л#&Єєзr<Јгx0Ўѕ#ИWž?ЇНПоџН ˜2нPЛУОв8й[чвŒ‘ оЌ1(Д5nиѓ:Ыєn˜>ќМF0C`KЏfѓїУзPј@Rџѕ4ІИ&Ф‘mlЇ &NX№ЕPp1тр,ЁYЙRьЎЛъЯDЅ‘gz(ниоК ?LєУПks˜uЇЖър3ЁAYшt&M€ ЇЪEYр “2?ЏЏё0ЩмЫВШЦџЇ}8 Єс ўšіиJЖe‘ћ`АіЋ‚‡сzЊр›ЊAЛ,fн”АtН<јЗ(зn8Ђчtс3”АE‚(Д&МаIZcжЕJsўПЮ’шMendstream endobj 377 0 obj 1347 endobj 375 0 obj << /Type /Page /Contents 376 0 R /Resources 374 0 R /MediaBox [0 0 595.273 841.887] /Parent 369 0 R >> endobj 374 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 380 0 obj << /Length 381 0 R /Filter /FlateDecode >> stream xкНX[уDЫCЏФў…МЌ”<ИКnv•а $„ФjЕ $vj’Jт!Б#ЛB3ќzОr•ЛЛ&ЕдОфдЉямОsЪlFёЧfŒ Ђi>ST^ˆйъpїхђюўЅ3ІgљlЙщE—ычŒБШжЬ_U‡…рѓго8Л^dBЩљumЭОЊЗ‹џ/ПН‰ЅŒ‘22^™Ы^_ЬеyБЄlnЮ‹ћЧџбœОњџYxЎ:х ЯіgыЎjъ№Кй„зngУ‹яЌk›у"У.ЭОъВoLч М‹›эЗMцQz\L)‹W[Йн‹ 6иU+q][йЮпђЙkќ•"“ѕ:ОѓћzЙэОymіAрPебЮЈгЃєWЗoУУцTЏ\oˆђvз jЛВ]gкjџ6жРыЌ˜ЩšlˆїqЩ7ЖЕў'PygСЖ5юдЦЗ3­ыТ§ІmсЮ„ЕЛjЛ /~^ф9ъН~ф№ƒ —}гЛyхSР?ћЗсбGwхMй™Ѓ^Њ;—ч%J…’B”Н)МЄѓъpмлPytЦgŒЯG]ЮOН[{‘:\—џљЮx`§;/U2а РuхэX™˜xјЁЯMШ›pyЙаЈЊжЕ&ўŽ„ŠЩ#WnсЩрФDб]\wqш—$Иьыця6мygІcІ`BЦXdœsЧїїЄЖn_Н&MЛНяЊC}3TУ'<QСХЙА‹їT7vяїч†t.”_pя‹ œЋ‘ђœ”JCƒ RГ^УЫ„’p:Эфr$"сФAф‡””АМоЅ”Ю_Фы…6z№Э%YеЌ}] ЩџШoAЩјЄH?IРЬI!ЎС’(=РА!iЖвъЉв‚‰8LДNбA бX3†ЭѕL!^ ‰шƒСˆ*E/‹Sv‰NwpNz‚v FJ9фуˆ6.кjэ”SdN8ч“Ъ[&”IИ—•bђЄ$6ˆ ЧNџїЇ—Н~ьєСТЇ.ЏЃЛё?цj{v§˜A›c‰е…ы щ|удs—РЮ NЪbpё2?%лЊУLВLDUЦJЂоиJŠЩX' ЂšRѕкvЋЖŠЃЦ:.ютцЭ~цŸа‘юОZо =XаœАBЯ„ЂЄдˆ< шYkg›;6 јŠH4иLŽa—ŸNЦѓ3џHq#zШ)ІЋ0Іџšт‰•Ё3LŸ&r” B5Л’Є“жї)"VЈdВCN+5U4Б*+бІ™oзнЄИЩТжЦф5.ЁиK. Pѕю•сэ 'ЖŠ‚аr§d ?фTВ3gHЮ'Е•CІŸ<^ђ_i№ŠН|'Г–Є,‹йEц )›“GвŒiB™ъm†ъАf8žљЇѓ,ŸL'к'ў4сЦ(|\%Pт(ŒˆŽ‰$‘n ЕЦфt4ў[вd­#œc8eў49E`~Z7‘3pњ’сє•ВL‘‚—*€-Cb”Dн‹а'Цgр „цEїЇ/„šЁСцEdG#sZ—mуY1U!UtyK&8&† r‘љ8х“p7ДШLЈФn,GдЯm—ё\ŠRШ‡#љ-ё\5‡уЩ=ЫŽя1FЊы‡†?!м‚(4ŒKИ/ѓшд=pŠIЃ~Ц9ЁЉЦFлsСЛJq‹ІўђмЦІ]їпЁ|љ ЋGп“тLŠоn[?$Щ€ŽШр&џœТk“L :•љUВЩ‘hŠ+з sZ|`Xщ3šzўŒ†сЩGG$М‰Їёј ьmњ˜Ј‰рБAЗuД0nC9˜cї1мэmНuЛФeш‰їр“k=DВqщšАw?шсътѓСTсœczЂѕ§u˜JMНВс}ы?TФЏ2ЬѓЧєФ|fУЌйœbэхєŸЉЬР€Ј8ŸЄ V 6>h=ž‘ @ѕ™ШdŠШр0ЎŠыJийэНѓC }і#пЙEV‚BЪВџ0Эty}: >…NWЅZї\Rо>ЫЅЯ,pя5БЯ}№јmрЭф&ЯхŠЩ[29џ,,[>СсEЅќ%9l= ˜4§&… ЪЎвCњЮtДўёœдF)фАQ4>NБpNѓ3МЇИа;ДVПХХendstream endobj 381 0 obj 1844 endobj 379 0 obj << /Type /Page /Contents 380 0 R /Resources 378 0 R /MediaBox [0 0 595.273 841.887] /Parent 369 0 R >> endobj 378 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F24 5 0 R /F28 86 0 R /F30 42 0 R /F31 93 0 R >> /ProcSet [ /PDF /Text ] >> endobj 384 0 obj << /Length 385 0 R /Filter /FlateDecode >> stream xкХXKл6юy/к?рЃˆ>DŠl‘CњX EY…lkзBlЩхlв_п)KkfГЗТОFУсЬ7/‹‡Ÿ˜9ЧДГ‚+&š­vП..ž] =‚9­g‹OЙXПЯ›ъr. žѕ›Ў:lкэ–ЦfŸ/už•лcuИќИјѓй•,F n™*ВvV0WрЙaжˆй\АТ)OВЋ"šШ “вЭNdeГNм&%у… —=I№ksЮЫпc\і‹ќKЕІEйг(8}ЎФ kз›|–3Ѕœч№CAžЃmфЏxъ!’  ˜Ÿ˜Р{§…эБЃIНлoЋ]е\Ъ"ыЫОn†ŒfsЉsц@€ЙD=Hџѕ O:vСЙ<[ЂВъЖnšКЙХ=™Е7tˆTVїUчЙžт†Ыю6ѕ60ИCЎaNj‚ЪKiщФЯОвёMзю&з+4aНCКую)I. ІЕƒ1g9шп?…Ж2л•Ÿќe\ЊьP5‡ŠІ}K+<пДўMm<,щlSпnhЖякeЙЌЗР7gУЃ‘zЕЊі}йЌ*џV‘нДQдЭСя'РЄtСxžkюЦtLИhэчgXŠ№­œМ№$I.ўX\(#™тr6W єс€D*И‡)gg]5ЛЙС=ТСOЂŽn‰о)ђi–Kф.$9MР‘ВšЩЉ5^‚5rъ8ршmйаЮѕz?дKDnЁaтXЎeюhЇЄсЖўŒF *k ИЕємЊŽша<8vрЭm`БюgмC` ЎяEљљDђUЛл{  “]ЕЎЫ& &‹hдПRjW2€FŒыfеUхСУеёсќциЌа—R7*Ч”ЖсUF’G‰<>‹шUжЂW‚˜ls&Hнзх6DMжи э9ѕе.Јь] сЦ0ЃнНиЌSБ9ї$Љ€f™ьžhA n]Wыу ƒ*.–о'N9г A2Че# Џњ сдAюBfф- аёcт|’H<Q§ ЫсI–qkOXAяƒГ2 n;7`YќH2]$§з“*Œ|NEqrр"•`oг› Ы…I|ŒЇј)ivž>й‡ЋЂN<…(Œи9~щФЋU2>Иp #@ф+,оLiьз"…@—ЕQz „?б-™МјиЄГпЋ›ђИэя%ЙP u„~JЃас ж№h*y‚U-–=сŸэзK+Ш…*ЭWШ'дXpFЋ2ўW)ЂЃwCХуЧёѕ_Q‰:RШѓ№lt0ŠEТџ9iQБЬ†FШʘьџq+eendstream endobj 385 0 obj 1939 endobj 383 0 obj << /Type /Page /Contents 384 0 R /Resources 382 0 R /MediaBox [0 0 595.273 841.887] /Parent 369 0 R >> endobj 382 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F28 86 0 R /F31 93 0 R /F25 87 0 R /F1 107 0 R /F30 42 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 388 0 obj << /Length 389 0 R /Filter /FlateDecode >> stream xкЕXKoфЦЮyЩ_˜лrо~ВIУ9(іЎБAБ€ˆƒˆЫiI„9ф„фHV~}ЊКК9Єдв*€ƒ†§bзћЋ*Š ‡Ÿи-˜ЪѕЦrХdЎ6ѕсЭ/пМџ(ЬFVГЙМіG/їџШ>uлR*ћƒУ‘ЬіЭoыS;бdlІS55}7ОЃsЭDЯCЕ•Eі@Ї>owвfŽvNЃЛ>Е4žz:pЄУu?ТХюnы—Њ–ъ‡Кu#Нж_oџyљЇЭNXfL OЭД6žпщШH%ВЊНщ‡fК=АэNs‘}ЈjМ№w9нFя›ЖЅб8UУDћї№&-† yжЇцаќЧэizЌ†ър&7ŒШЫћjЉ=ЅrV2ш№G:БвoСJnУўѕашR$ц%Sк0[Dбrь8ИЛІ?Ёl%PжfUЗЇч7'wˆ*­ІгVIR8“цаJЏ›3џQтбФGЮŽ$BajЭ‹•fмDƒ.М,КЖ,˜4љЊ™Й№šІhZk'wŒНПсW7аэвЗЇЗЁЋ•zўЌ0 2З2>ЉC‘ФYЭ‰,YQžbщ1љЭ‡Ы7џЩж–endstream endobj 389 0 obj 2062 endobj 387 0 obj << /Type /Page /Contents 388 0 R /Resources 386 0 R /MediaBox [0 0 595.273 841.887] /Parent 369 0 R >> endobj 386 0 obj << /Font << /F15 7 0 R /F35 43 0 R /F30 42 0 R /F34 5 0 R /F27 77 0 R /F24 5 0 R /F36 6 0 R /F25 87 0 R /F28 86 0 R >> /ProcSet [ /PDF /Text ] >> endobj 392 0 obj << /Length 393 0 R /Filter /FlateDecode >> stream xк­XYoлF~ЯKў‚оBУНxшƒ›жN‹Фlа1%бжЂNQT h“YЂЫІeфяОw'р4PФX-^eЗщ6wфќAа›8V[BSЃBї­uЄочЯж›x`[`дєљСЭHпHt§gU6lдSІшу, Вфъђй–ИЏ[ъ†КfНu{Oщ птпб§žЏєЎoкaцIЅMЏДјŽž~ї|Ѕ‡E.Сosмэ№в5/§^О…#ЂGќOXяS–ЪЋЛЮBч;Ї\]Йђц+і=чaП_g§oHvGV­гЯoщЭїен™Э3до O ~]@…8ž“ИmŽ{хel@—<чеŽ–Sњm vm?lыrЇš\ич!ЗИО—Мќ%'гoЃЋMk ъЉГ9[~рГ"rп8д!иfŸИœ‰8іЕв—р€8І3rд‹_Ў_ќ_9endstream endobj 393 0 obj 1710 endobj 391 0 obj << /Type /Page /Contents 392 0 R /Resources 390 0 R /MediaBox [0 0 595.273 841.887] /Parent 394 0 R >> endobj 390 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F24 5 0 R /F28 86 0 R /F30 42 0 R /F25 87 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 397 0 obj << /Length 398 0 R /Filter /FlateDecode >> stream xкНXmлDцѓ§Š„фˆЫт}_ ЉpД „к€Nт$Vћф—з_ЯŒgзБЇ=‚ŠzьЬЮЮЬѓЬьlљ,†?|Ц…d.ж3K&Œœ­7п,oО|!еŒ[&Иž-Зъrѓ{Фгѓ‡5б]v,ч iut_•Л*=жѓ?—?Р:;уŠIehнB &яW3о­бržШ(ЋДЁЂrKЖ~ќm.Eє-НьВ"ЋвІЌШ2ИТ9KДїh!3жv–&МC=eYЂ”wП§ŽkvŸж&-gBrЏzŸЏчТFoыљB$.1ќ‡Ђ‰ЊДи”G’ дiјї Ои(ЋќPBСF›МО?ЄЈёшjі EіWCJн™AbЦ­A1…DŸЫ]+*H‰абCоьQВdE ­ЫЊЪж НМ›kЅ‡6ЋIЋ\5i^d›ёjVƒ{й6m~u^фMžђїi“—›T Vžtљb™0=DВЙЄ1ЬHу5ЊМСl(с"оЈКH‘&лabёЇI7DR‰„T№хДКЪвУйВ!<–†q№bˆхЖBт`ІЗmБЦзaZЧx}ѕ:-^fХD”ЪАФ5tђв’ЬсUШ˜В$Y •OjЗф`[чХюŒiу Фj%“4рЩНьшь+лцОmММЅgГЯk’|СећВ=lшŸWzЉѓc~H+ПИФЇђе•B6Ё[їњ#цъMЄIJХb*hе@]^r!5bљ PЇ Ќ€_~C*Ђчии^>НЬЧ›бvPэЛtw­ГY'іЌ OiaХИ  ОЏЕ6XD,FРт)ъСсЁЌќ8‹ЧмыX$t•dT9žŽТД>бПžг@Š=ѕм€znР-7ф–r w)GЛ)т–%n9фКœьЈЏM0ž„zь№КЦ4RМ`šђL{‘2ЂБLѕЇЪХ\r„‚ь›в?ešcЪyЇq›-l~h OМЎgyw)ЅєXхEZ=’ьВЄ@р›‹UомЅFѕ"j:Т0™ŒљвЋЄђрЈЄŒвšžyббХmY‘а!ТнЋяОўњŽ^|[BY­ˆPјLVdМ;2кк[Ћя‘-QЖЮЗ'Г—T™Ј.тNрPК?Ќм)t<ОKzіabŸљоъxмБ§by Uџƒт!Џ=ё^Іm]чiqN:Єщј“Hї„Г^81hoEYЏБЮ1+&7ХcdŠ“оS”ыєxЌCгjuўоЌАЫм@№6њЇ‰Н9фІп›:#кMЩь.Є‹њZ #A,GD€ёАЉђUлЕQ˜•вDЂЃЗE‰Р?єzЬR/љсZVbZmhх&{—ЇСь№цAО%mШb~Є‚ьэ]R—MЄB1­CŸ>N%"†щ9d 7$‚\• омб‡+ц5&QS CžЙК0я'*АOS |"xo=aћuy„’яzQBН‰ў<ќZ`/кdХк[ эІђ5!§Эк &ЬБtэhя;с„ЦšГ O#‡Ј;YoКћњАGтšhOЏћД&)= ­вU~€ж3щуИgЦЄО'њ=ж‡vуšnAMењЙі4~ƒkDIю>ѓрЬ˜?e=^aОXˆ˜ХJtж?Т˜9ЮqHdZЊ!‘d<$’`. гћ'SL#ЩпHЇїщЉњlТ\tuh-‰™0q(шˆŽХЮžyѓнђ†›Є›КZР”.QS;№ 7ЋВйі†‡{uЏ)уюм_ЌуQ;є]+l@IБœŒ†Ј3УЄБ…иžЎы#џуaУТяŽ;XЇ$Qі+hцЦNW1DЊь ›Хd†Bгы§лЛqŠ„nЎ‘0л СAoœ‡џ;Лg…аeZрЭ,щt>›Ш €–9МцkЭŒџЗ‘х>Џ/JmxnлpЗЯ§љО з‡12Њ+бН‹0L‹шы /ph2Ё_E‰*jOу— :ў’ї7Bх‹№endstream endobj 398 0 obj 1566 endobj 396 0 obj << /Type /Page /Contents 397 0 R /Resources 395 0 R /MediaBox [0 0 595.273 841.887] /Parent 394 0 R >> endobj 395 0 obj << /Font << /F34 5 0 R /F37 5 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F1 107 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 401 0 obj << /Length 402 0 R /Filter /FlateDecode >> stream xкеYЫrфЖЭZ CлйАЫ&Œ7РqyOyЪNEЎTЂђ&“GMItиMЩž‘џ>6ЩnєH3лхв‚ ˆЦ}тоƒ#ЖЂјc+ЫHЁљЪPAИЋыэХwW_ПfХ$RЏЎnќЪЋЭ2Ц‰"z3ЦyvЙo†zзvлВYчТˆlSїCWПйuЛ[џїъя_ПbjХАНRa“œsТДі[§ГkoЛrж‰љ:iHAU”и•ЛэО!їeŸиQ+Be\изл57йО)‡Њ_чМYq~ЈѓQY7;W–ЌsЩevuW…oеCЙНoќ‹Ъj/yхl&…TH"e0„ф™Ш7ѕЖкѕиЪћS _ј™wѕpFƒ“#ЄШnкІiзмтлю6|лVхЎџЪMжхnSvїЦВMѕЖ.нvјьЂKMvnзйuлuUSFЙ\eлŠ<МюуrюhNЈ1Ћ\hТЄёлl^†ХmtѓЗqСЊ@жџ™ЩѕŠ ЂїkјA?C”~NsšT–)YŒh.œШB†В„Б<1'NЃФBК0Ф*;­9RЬœ*ІО№$Q"ŠАW*-”з”ЃhдкЬV)˜.ЂB/ЛрШ+6žэцa8SsЯ>wcў[mќ‡œ#и’ЭBўЏTŠџ>1чšРЊХйШ™f,щHAЁƒyФ“Ѓт\Ёж1J“;ЁLh#žИ“ŠСVˆ6ћДiфtДš…DEЯ ѓNРˆ;С_„EќўБŠЬœхmД}Ё>Љ*aУL?b›§tЖ-œjЁ4 NЂдхИXјSVїщДў€”Цa'ZŽтЇєQS†}pJЯbњ$1–€Vђyb<1ѓчrBоП?ЅжLЮме‚рJу\Miˆ§Ctmщ|ћkxyу"ЋbбЙ ЁˆUxИ+‡dіт. 8 ф.7‹sžBёё щЫžОъOпЃd3Шƒb JŽ+Ÿ‹oсaёћœ“u:9ѓP“h>и2žђЧт~IзcQ"$'x‰Лі‹к„^SI{BЄ5 …*Яб ПL…и%ЙЫ kчЦ.ТlЙZ„й[rё§еЧFŒ1П(‘Šэ8Ж wœЎZн\АH MKУQВbhЁ=j~v‘џ2‘lЫKЪQВЅЗС1šэѓЫ)2EUГ+nЅLчŒВЯЁH"ЋSљК iљйu]эжюц‘"”ЕЃЁьи˜чЪГ~јE:cŒ?h,”sfвЉiЈ~"џ"ЁЯБ•ъЙl%аР)HАшМТa­‚УўšЊ=8^L/ ТGгЯюV§\b™ЋтœSљs 3Іь8е,ыžчi&tIŸœ/{D y3рЈ/ѓ(GЊ Щ"ŠтЋ'fdСP" ІFКƒ]ф Ш.< ІєУм{X0 ѕ~Ќ’gh0Cє: Ь)>в`0б`ьiАЈJДЬј*§~<и‰05av$ТЪюkСВv-8њj.ŒЪ^о•^ #ГKшŠC•П,;”кGYБfИkїЗw.[tvљђђeШ›m…y_F7}˜ёЦЛEЎщќѕC˜яїѕр|сЦяюPp§Оззqƒ]ž›КпŽМœјWasлvш#wRз~ њэZЩЌЌ›ђMSyLLГwыx3Іv„'эћ8’ƒЫjшк{ШF4uŸџPі:QОŽF#™уяŸGЭЂщ&” луgїКTЛяŸЪ‹јeЦмŸХ \—ЋБRЂчлыэѕ9Є pš#26wzУќХгЦЛX!Ц‹жџп †endstream endobj 402 0 obj 2003 endobj 400 0 obj << /Type /Page /Contents 401 0 R /Resources 399 0 R /MediaBox [0 0 595.273 841.887] /Parent 394 0 R >> endobj 399 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F35 43 0 R /F24 5 0 R /F1 107 0 R /F27 77 0 R /F30 42 0 R /F31 93 0 R /F28 86 0 R >> /ProcSet [ /PDF /Text ] >> endobj 405 0 obj << /Length 406 0 R /Filter /FlateDecode >> stream xкхYKoмШоГ9%‡мцHžо~7щР Юу,bС Эд %q1CЮ’{НП>_w5_RK6V6В@ @ьiЋЋЋОЊўŠŽ?БZ0eѕЦqХЄU›нётW_Пf#+Œй\нбЋ§ПГзuз/.ЗZЪь§ЅtY…1Wй]y)ѓьнbfh§Ufћъ[.t3ЮоХСЭЙй uла(|}Й5ДЇЁ>ж?U{vЙЕVgWуГЇЎН.ЏыC=јE?\ўчъo›­pܘWЭД6Си}еє^ЦAfЋЄЭnкŽЅцызв-ЖhsЦЅ‰ћlH`хЫŠмХћл}}єклІ<ЪІэŽуx_їCW_ŸУƒ"ХŠ„,yTѕїФR™qЉoЙсб\НбиЎŠ"ЧФv0’|\уw †I­у§З)8SZЭFк[нПLЌЖ•Š3›ЭV ц” }“аZ0ьўгwіЏДaТи•aвхйЋ€mXюдБЬѓ ќєХŸЎ.rЧИЫ7[­˜Т=Ѓ™А„Љ"пtеццBФ„˜ ХœАН@~,Вс‡Q7нс Ѕ:O)%‰­ŒsѓtŽyЗШTDсa>єЗ ЧРn[,§B:rм(мьYХДбK”ЏРi˜Uaœ„ОO„.”b5Т—иљ>™K†#FНPѕу)ŠЭnbiQ ˜б6H§:iА4yШћQъЋ4htЁ“ИРVQў„b‚јx№%PAb ёЫŸŽ_ˆ†.Аžќдхъk?JŠб_%ФбЊ мЏ$s˜AЁФ џ Eоћ}blЦчі,єіšђYd4зL"њT@EТVЪ!—ЋќвМЖР&ЅвtПIЈй*nьЩHf” ‚oкёкэкn_7ЗўЇ g ŸЎ~РyЇ•ЩА ё"U”fВїw•6?ŸЬхЫЃ*iбfŸЌп†Г•k+a0єЩт-ЙњBХ;љˆRЉ‘•тџ*OьGђD§rѓ 2Š9QšИ œоU~С'тЈё5qє3!œ]G?[вd?”н@)ƒ_яќГеn­K€Ч‡еfНџХaшpp0Wфћ:ЙG О›Y )4.otVvuйьЊэЎЅ3NE_XЫЌQ‘˜RМŽ%шсЉsе179ќmкdK&ЋЇLBpЬЭbОЂРУнV й(;UGУрm.ВўЎѕ1xgяЪaU4(ЗmWwGџ“gЛ2ъкттA EwЅoКіŸ#§'$xžЕuухr•ЬХЪ3;ЏыЎэЋашЌЋхP“ђУšЛ);ъt˜ЪHђCg–і‚БйадIxсѓ1є.jбЛшН‹^Z‘ˆ‘t Hюi\}JOЄљ,іЪ/^d*•ˆ`BO&ЂЯІ”^9г5‘’9+ŸБœ Oсц'Ž*ЩєдSэыђ6ЁіШioО’ žвd!U 4[7ѕP—‡њЇвїy=MЦ `,Вн‡нЁъщЩі†Ў‚ѓxзЛ0;цЧEV•„=o™Џ–к…ХvИсЎъaŽ…%Bs.дŸъни•vч†ўЎz™Bše Фп€я.щђаMŒюеCўюЃo7R1#ф‚sк‹Ђ.нŽsXйбЖtњЈБ20ЎBыхбИ‚IЄясўЫ„D‚Чг -)_'Ž|Ўfљ˜fѕYl^{ч ‚€Ѓ#:ІEюyй=єВI7*тBџSФрФ>I•2џЋиѓŸщЧБюёЂ˜CdV!zЎjIѕыKЈV’?p4Ъ'ђє3E_…KЦ&љЛXyˆС€.цДЦ?RARЈъi@˜Яe8ьVХ`+ЌI+є6ж}b†ЩмU<ЉJƒВИO —Ж.њУЃ?/ЬМШ@1жСЕw*,Ф}тIэHмŸmژL_bŸб‰їіfІ7PэЏxцўФb+W/`ms4јцччŠ-œЅМГ<‹Г.0wџюБАЄ‰ƒРЄ2{в d UшBtі‡ІЉРBšЗТŠЈТ⛇oКіЖ+уAЎVЅcRю1)›†ЪTеЗ0vLЅsяйTХ’ЫxГЄЪA>GГ№“К:?}kђ/ѕщЙ’&ћj Ї0ўъ”П6-zЛzбхОюЄкsял…tнзПк7Уёѓ‚ЇFЈ ž•л>є4%Ь‚YIќ"U…>&6—˜‹;ъгЁŠ3оі’H#Кˆ"{SQзаbAŸ??єчнЎъ{пНиамю9XOЃ`ЎФ-­SŒHмTвЇ rzЇЈЁЉМвВ‹їBџ†ыН>3хс@ƒЅ/LиХve-y’>ЕјеupзФy;ДЁ™Л .:ЯФO5=q[5№ТОЏ€ЦF‹Щ—^G5‘eZЭл@з‘ёвЏYН Ь‘ўоькvdВ ѕІ„Г\Œ9њѓuзžрjт§їѓ/Ъcaf­œгЯу1фпŸБЯЁоХЬ›ZтЧ3Я~,ѓŠžd!Мˆ6ћБЬCэру^ЦocНяљищђЌ/qДˆ:I”Э=Y€ў]ЕSžІXy8"SЉьњьЇtіžк#eB№Щ)˜žој1.ћ  пЩŒ5Рfс§ЇВYЭX‡Ўщ  ПГФКŠoHa52JO­б s"Iƒв2Ї(ЕEѕБъЉщ9ŠЗ№п$”Д…П ќPьўendstream endobj 406 0 obj 2090 endobj 404 0 obj << /Type /Page /Contents 405 0 R /Resources 403 0 R /MediaBox [0 0 595.273 841.887] /Parent 394 0 R >> endobj 403 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F30 42 0 R /F24 5 0 R /F1 107 0 R /F28 86 0 R /F31 93 0 R /F25 87 0 R /F37 5 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 409 0 obj << /Length 410 0 R /Filter /FlateDecode >> stream xкЕW[oл6~ЯЫЖ GXђ№Њyй%Р†PаіAЖхY€/™$'л~§y([r˜ДУ:ˆ%ђшмЯї‘"уј'2'Xi 3 ™дйrwѕУќъѕ-Ш ГЮfѓuœЏ>ф?nЊћОng…Д6rіiў+юš3:HМыЋОщњfйљЭзЗBgѕkMj ­˜цeošnV€uљr6TЊ^енВmў%ЏЃPwиеєtX“TПЉщЁŒV[ZXїЫО9ь;z­Мў‡™жyеlЋХ6~жьщwўллЊпА!Ё˜R&КˆЂRAон“/Ыц#jI‹їэuэќ‹NљХхБ}˜Ыу‡^Мя›§яў•чЭvK1ИјКкЌъЖ^‘2яY0{\tѕЧzяшioHV‘№и1JМT™А Фx%(Є„dbV2џ)$њОofRoЌ>Їѓ™‚aVиQ‚аЁѕaЛ=јИ)V0у"јзЊ­уУe5Оѓ‘є]a7р˜sдZп$МС''csоЮфбfд8Х&еКŒВoыjџ‘k~w=+Д€ќЭ"<Шќ§—EТRi™у*~ож§Бѕ)д†ўa‡JщЩ7ƒџэЊн=vлSg„ЅŽъю>МY0і~ё)aWk&‚зЁц…д& •žВГЊ}ЋэCa~ОХЬ‚›V–Y ˜ZСЄtсу]*Е’iэоЛhM8—9Ц}ђtѕѓќ 8n•ЮЗ†d`TfX‰2œI\lыl}%"иœ%­b Gxc'MFvcСe–•–МЧ2@†О -Ч2"+ЦЄ—)3`а:APsїDК†грsрЌ 2M”б'РжšыFЄR‰ƒЄiAˆ ічC†ŸlСl)Чv&Й.€;&”ТвЪ№ы7 Ћ(т„fhZ9ЮмашMG§аoтєuЭпqdbсЪy+t+KLc ЇЅE?5SV|ЅqфNŸЦqеŒRŒ2<ЈќнЁэые3г)4т„*ŸŒ' у‰XЗ FhcO %p†•уу–™X1Xn8bPКЊ‹8“вЊ™Рёy" *_ #bКq!€њq7 гШ Mѕ'$ф_к_fТu M—ev{м4Ф$фЬfpщЦГhtа]8ибNhќ%пыИ^‘\ ‚‡Yф7\ozJ’8šЮL€ЋкЏЈ§Ђ O#6ЄЕІg˜gЉѓ_ж}\Еm0.UH4c­}Ё’8"\hNБŸ=ЈїdЋ w}1%CїКТFБW Y2mѕ+œ@HgБ›„E„1n.ZЄЬ4Zr~ЉKa6™ЭVЭYыТEд№ъ„ы>g=б0юˆ=O `/BЮK/Šри|і‘•з!EА†ЉРрт№hžЯЇќјB=W#а˜жIXР‰Цv”€m)ўЇBхaЂИ(žЦ˜Už%3Ш%Ш2цAPт@У(Ыg+—I>#" b%3–xёлDVАX:˜бкОдPCUFŸ xЪє^„џЁЅgСL‰\Ч1Uі_ї‰CВЈМУЋhb’Œxy вўћУ‰кŸРббш \ељГ‚ќf4f“Ёп ‹pѓ2п% М”ш+ЬJMxНfХs=xTё75>юˆќОjЋ]нŒ5A_kУдk'l{lдУYЁйЏ№ђж‡ЋjoжєћЦ;<‘ˆ—Шк…A!Мз8BxџJ?йZк#о&Зў2CЩ€Їe=ЁїѕѓЇЅиЩс&•J1дЧѓœ(Яљ;юўа#ё€sž;У-•ЎŽ~Я{.˜t-Ž!‘~C—Z7\ŽнйЫ№ц;хДEљ-“љ-bЃƒIРŸeвxН%žnc.GЬ4тrИKг‘ŽХ FЩ8žR @к‰wŒRГљWќendstream endobj 410 0 obj 1470 endobj 408 0 obj << /Type /Page /Contents 409 0 R /Resources 407 0 R /MediaBox [0 0 595.273 841.887] /Parent 394 0 R >> endobj 407 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F34 5 0 R /F30 42 0 R /F35 43 0 R /F27 77 0 R /F28 86 0 R /F1 107 0 R /F25 87 0 R /F29 133 0 R /F26 94 0 R >> /ProcSet [ /PDF /Text ] >> endobj 413 0 obj << /Length 414 0 R /Filter /FlateDecode >> stream xкэYнoуЦЯГк? /z+ œ6мянyiг+њqH‚sMђ$к&lI.IйчўѕљЭюR"­•э;_лД ˜фr4;3;ѓ›ђY‰?>уZВвЮl)™0rЖXќцьф‹з\Я8g^ыййy <[ўЕxЛiћf}q:м?”КlжtяŠЊ[дыeze‹MЛЌ[МчёБщтѕWдэљІ]еЫИіюTит>о/Њыы*§ІнряъхЖ­OџvіЧ/^ЫБl’{fM~K"’dпН"кй|x=чŠ)ЅбŸпН:k.‹ПМ BІ…•СЫЛЫfAB^žЮeщ‹fus]Џъ5-ѕPLђВш/ыјђяпn‰иWё™ЄљUМ­Ў/6mг_Ўищ\тыѓИОиlлЎ~EŒСVAю(A”к9XbЎМ*VmvOІЄзщ й’lLї›mп5Ы:Roз‹ОйЌ3ІТ0яНпдЫІZgŒ#AХEЂ‚6^ктьВdЂгІkuнmт–UfЏ9œљвMTќ*_южž#‘сwЬЅ‰х8s<‚щB3KК @f ŸЯѓбyuA]|,Јл)Ј{цеА”˜сP9hб9г’ЗL§ž‰ч*И# ЃVtйl1} ёX1WŠŸ ПEdѕ( Лйžц( ы'Y=хЇш'P•И7њ“œюЅ№g™лѕПнДm}=†Пяш=нПQшљ’?„?dЁёOAм‚…X1ўbбЄі.ў"’Лz…­Ÿ6”=QпбПКЮщ…ЂŽ›'jсr‡жРЅlA†pашћ'А7 GU/…уiЕй г ~Œ$б9bUъШу›УаŒХп:kНM‚"T)o\”!kЮ'Ж/ 2љŒ “dS+PЭ3кш}F'`$"hOCю|D-Яx9lwА2MшЅџ§jнчкuЂžjЕЫд#Sбdpр( ДУјl‚иQыqfЛьГwЧ!?ќcŸи|ШјдЕШaIрNЛЧxўGлќ/;іšІе`ЇŸМХџKcŽ№^ГЕ)\ъ4гЌ‡aъD$*З+№?іь}Hv{š]>›lђ™xЁвh—ЌmЕЌз›Оž pL˜эЄyЬƒсŽIУ#н]‰т2?k@ШŸнр•~HєoЏъЛuнuћЇЬЕxщњЖЙXUЧъЧ™2њ обIUКщЎhVwЄ{ЄЧCЇ!wГжg5yлКSwMOCBH†k‡;i‹юТ<2ЮP”vTfуЎUŽњЖœ&‚‰н :˜/7Э.їЃў0фуУытІjЋUнзmм-.Ћ‡mЁ€ЩШњЯm %ФЂЙ3vNБЪѕˆС v‚ч<ыџ4›лг„ŠzХe4^:7эЭ ,і"зцLDŽ mT&Mю(y4ту§йчтУ8Л}!#\ўСЭ"SћŸGjџš‘MьјŽд ehсTПН }L‚ щтщd&фИ6ыeГЈњ№`0ЫSqгнЏ3mГˆ?_W}ј^•Ѕ]6(пm)„йлGaєє`вІК5Х?kњ F+ё+nЊxяŠЧ1уИB'Jc| 9.вѕїеЖыšjMЄOpЮ& }њв5}s3#ёlыюь,Р{]_TuќќЉИ‹’в 0\;›dUм>•("vкHвWЭu\ЈпїщѓжXœд‡nhыаˆ!˘тѕЉp$:}и8=у”–УЇьдћzЅоЕБЗЇ‡sН=–]Нd^ёO<=ѕЛъхOлЖ‡вŸ$Й§С(UшЁŒPХUк,.чѓ*Ажѓs^§иМЊŸЪЋœВ„ј€Мzќ[У>ЏЊ|^Е‡пА„$Ж@R‹b№xbн“*є0‚П ГFйT>Гš˜Yн 3ЋњПŽ>ZeH­f|Q,“дsэ‰žќш(ЃгЃ’єK8ЕbєЦ›СЯ~Ќ€‰$endstream endobj 414 0 obj 2211 endobj 412 0 obj << /Type /Page /Contents 413 0 R /Resources 411 0 R /MediaBox [0 0 595.273 841.887] /Parent 394 0 R >> endobj 411 0 obj << /Font << /F15 7 0 R /F35 43 0 R /F30 42 0 R /F27 77 0 R /F1 107 0 R /F28 86 0 R /F25 87 0 R /F36 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 417 0 obj << /Length 418 0 R /Filter /FlateDecode >> stream xкэZЭ“лЖяy}nrеЭкi…р чаІnнNмУjІ‡І3хJд.‰м”=Ю_пї№!‘DiwэЬЄгйУ‚<М~x›PјcЦсмL „k1YlЎў8Пњъ SаD2Ѕ&ѓ•ы:_ўkњїmгеmй^ЯИ`SџŸOѓ*|WЫr‘wuу?ы•џпнОпї”ЉМЋŠЖэwрБ›.ЫЖkЪлmWжЙžI*Іo;п'ЮљsбдОfчЩЏџ=џ8c’HЉœ ЩЗm[Ђ`BаСИПїUyЕє…ФLaQ]љўJ…Џўž*кэŠ!ЭД*юrз!›аФА,xх;ЛN4J;Љpцид ў€ыС4BMз ›0<4ўЇНЯ›‡—ўЃЛwЋqЅ№уИH‚S}ѕFШ 3„3gБЯРœj2ЁœЙщXјzЦг?囇М)лЧ4м™B9нyе†сЬD(::hЬ~ ТмP|zгm—Eu†~‰ы3bкmчЧsFFЁo jшUTЎ;hЭwiѓЭЌлOzрu3ѓhу&§чЕхhIщє>GS9lЌ…‰,‹г`Н›zuО%Nуz(Л{_jЫŸумћЙ9зDqќО =дФЬ`Л&™Е`\b2сu’D#јdпч 2mЃ1NРЅћУё„>‡W–Ьіm6œ]BЩ†lŽчЄ0gvЩФёУ)"­xткт1o–.f ’аП:Ыт}™cXЅVЊ4БY\i{$š"ŠЩ'.ДMщЭ(ћи…B€)œID‰0дЖлMБє•тЎйњЧіНзB{ŽЈс:ц?:зЏќчЊЉ7ОtaЯщбrЂХPэЖы LAТ#ї”/1nˆц2Јј‹#ЅBЅxb8|‘ kЮЉ8#ЬъоpвЬŠŸЖљкп_+z•,Šl pц?Ёб+ЗПpWjvњcškј`cY8рD‹!пЂ>zPЧўъ?•3aBѕЈ‚ЛЄурnьлgl)хтUbЌ™!LhJ•'4DЩЏSHИЮєФ €v*R$ш`aГž9~“ZО/]IЮюWž_СJAqа”Q’Q61š№iJ~SLVW,šа“S ЈэЭ@: Ю”љйx Ѕот?эD„3:6i M&9ПяFЧ™T*>БJDK%7 +YТ цšсwёАKЇцЖ ™|Ь„Љ0fœЂg |;~И/š”џ A,3gX‡А'чГді"Ћкё"`хЦс›EGnњ T7u`S}„HE™DhX‡ yvFюL˜Й)XwЖяф‚мМ•ѕТ)a<•тІ#—Dш@ЪA„2ЧEŽC‰ЄъqVD6ьєЌчrџЙїмњ`šˆѓІ’кA>ЃBєsВ:pJbЁ№"p<@"ˆR R&f4i’т@—ф8аКŒМMdАIдf—Я3n y™%М gТ‡244P@эБчэъФЮУВчХ%’їљЫoSB‚џк8 €1Рњ™$АаKŸщС(’xœHx–b Љ сиЩ ыаўWuГЩзe‡gоОЋgXа +№&ЎЭМ3оЊіџзuuW4ŸЎ œЪ„Iƒr5pˆм бвiВи`Мh_%Y–pf3ХG™‘aF" ћBf$/Р]љ)˜‘< ‹€8*[ ‘†‹]GIt?гГ'?-vœЧЗа‰QU’nљ`sТфed+ŒŒ#АЛsчX-уŸš+AЗЇЌ€ЊЄЩ‡2аM ЦРOќЦ9уђлѕкGЭ=~} '@Ўж'Н#PЇvZ˜‚Љ(=’4#:vzСyиgЙИБгt;ф;mђsЦEО%{3ОN. №S]~ЊMš€Yрf™ {š _wESэr‡Ођо,qкŽ2<Лмьb  §{)Грѕ0еh\FяеqБXgвGБС”ЇсњR€%РH{•?§Ѓ*f]^ЎуёкчœшNi&“.S№ѓ з<›ёG}ŸopКd"$#Rлs$ќNƒV ЪсПН)~(нЈл %%FїDУw&0цќ>l™Њ2ЩїЬЁЗK pбm њ{јЫіФ+jхШ†g‰бЬe•ђ. >O1%\яі/ён o'Ap4!м4Уы‹eqзХрNCLWPЕФЧ2X™”kЦ@эш}…AdІ$œSq њ™Цt8w‡1. 2‰фъАНmendstream endobj 418 0 obj 2532 endobj 416 0 obj << /Type /Page /Contents 417 0 R /Resources 415 0 R /MediaBox [0 0 595.273 841.887] /Parent 419 0 R >> endobj 415 0 obj << /Font << /F15 7 0 R /F34 5 0 R /F37 5 0 R /F27 77 0 R /F25 87 0 R /F30 42 0 R /F1 107 0 R /F31 93 0 R /F28 86 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 422 0 obj << /Length 423 0 R /Filter /FlateDecode >> stream xкЭYKуЦіyrШ-gнL!aЛьW€=l`/рРЩX9ёТё#Q#к)“дŽ7П>U§HБgF6€БРВе,vWW}UѕU[PјЧŒ bЈ\h*WbБ>м§euїХЁЌ ЂP‹еж‰Ў6пg d_цŒqžНN›ЊY – ŸїЫ\h‘ U?рЈШЖm‡™ЫКЋ6~м—‡уОъ—?ЌўњХ&Œ+Ѕп чœ(mн6_oA^бlиU~?t?ЪgЅН, “џІ’Vd™K!Г‡№FЧrЈAgnВ!ЌvПЬЙЮ*а7ˆ”ЭЦ/_n‡Њ У OW•CŽъЃТ`žЂNсЎЉГД`YЎмцюœ\Ю)5‘Вж†(ч&МЯћдэ‡zэ— ЊЎлCеџ9Б8Ѓ’pS€)-Б‚=ЙшPФ=^ЅжDqЖ0„э„ |jЕпŠpaСD[сd6(sїеъŽяф"WpЅLjх‚aЭЂЋл;Ёg)‘0™kа[Њ3є&ЪDшѕ3$‘Ќ˜ЉШЅЃЯ )˜€+<ЖŽQOФН]0Ml­ˆ5`Rш+НœˆВчѕk†Ю9bїJН–ЛЊKACb VK[<œЖŸvВЁ!\v‘A,Яw‚H3–нbзчw2уК /lжU§€jЈC§УЂк\žсћ"Еа4eуG>ф`€o6eч~ЉlS}Ј!кІїПл­— ЁЕШ?Bщ‰ЪыZџЬлЌ]В Ьх…„ к`‚_‚€<›@%љZlf%Зˆ\'€'яvqYсГT 1"˜О] ~‹7 " i sЮ{:шбyЉjМЩМƒ(=чWnmіa)‹ЌмŸМ]iV7ўyО,дњ‰ГбыT>…DЅ eц™иKMTїояТPЈbтxЏdIH‡ЖёуОў›е;!-Л‰ q+2LЫу•АPƒ^ЫjW,лvэС†]тPрмBnЮе<Ў8ЊчžыВыjg8xнžм[Ј+сэc=ьтja‰КйT!fšM(%ўЭКь+ЗЁєпЙуGmGЇцŠЉu' ЕD>ŸЅЌяGЁј№€7Pa ЈАmxnНsљ\LЬИкЁUарРзqІFФвщ 9Оl‚xєчЖня[ЌиuѓрЇŽ]ыаЛЎ6Ї.ˆ…‚(І…ŽшUI,ѓъ gљ‡ƒ5Zь;0­Є6{OVdпмЛШОН3Ћ0ёeћЦ>‘у/›(eЎ3ќDQuŽжяОџцžoяp;аь}ќrзDЫžџиAaхUьС›3ИЁS№A›й цК*Јж Ї1uъ\юѓВ‡ŽљМO ЭpШwњbcу1сжMТ:Ш:Юg\ЅS=s'_2.­2Їмщ€џ‡мжљ>є5”“‡ЎЊњё$  І6о{sН8 ЮУО„”j@3€Ex‘ А DŸš&•@)­p”ыrПїЃСљŽЛуНшнЅ‚Л'рd{jжXSšR02ёўЗrи}еu)Ž hRб]Н :ДMл д.L@œp-РjТЇŠІяџчвБsЦцLY' RY\+SžБў>… FL<з›З?%ЮœFШXH0Жщ%[еСзMыŸgэT М>uXщцњc! м(М_T№к!Q‹!ќЉ˜ѓ‰ŽIJXXўЋ №uмi5bЏа:ЃЉУZA]„Уъ› (}Y[K €XЬ|!с]ЬЗф€Dp@wdЗя_ZcW"r=M iТ3ШP„#‹№DсЊ-Ю™’DCZƒюp&/=В=ђлІЪБE.—‚g}\6хўc_‡žй…ŠKYЁЋK Џ8ЃœЩ^џ§эRˆьŸKŠМ~ЂMЛч!йFfЁщєx ~ъ›АTXYЂй9i{’ЂЇ$EКs№vЄ78fKБ^EСCzJKFАіНижЗ[$I†Йž"Еg’ъ–оъWяxiYИ2у–eЎШc8en7„ѕS깑6ŽˆБьk„,№.PыћгСQ+†|ЁтЈђƒЫХ ;Nlg(Z:2ъч=џEё‡ђдїЕkл@ЬЃЁ=žіч. f/<zDЋ&‡}Ъ=BBF‰)х3‹ Х/YDЛЛ‹Ь™!T?ŸЪНB#cŒѕЛЎbG№аz1Њђ%йЗЧ2ЭєХ—аЈP§L(1М‰Сф ˆǘцэmJ%и/žЧ1ЇыЎнoвЗA‚CNТzM˜єцTгРџ3ќћ+š‘S NЃѕЄ’$6хР bУpћvлtсЂуxћcКжч’њьv“€ъ’`JэДWІЬYLКхЅ! №6ѕсž2?p,Ф,”pfьџбњЃu4xŸ _А !‹[%\*ˆ1HЗ\Šйб2гЂp`4КGлшf‚У21\_ЭяF˜2f!&њ2ЮђВ›еЦЇ9&\š…ГžЋ pї™ŽжІеЭЉsХXпgњ аЗИвї:8  N0іRGЭЏnlЬг76ѕЩЎлr>ПК‚#Qц*!Nj даs §’Ф‹’#ВЩf6ёwБBM.—&Y €`ИHнdщ˜жJ§ІA|uŽ™sŠODVnИ­ЙхЪ=uэЈц7-ўiБ%_Jр\§2Ж0УПЎтep‰џ\зWk š№л2Žx–,ыOŠљU_ъ/LP#еUC*Џ˜ымэ#гс}™ E!*93š(МPЪ.‚ Ќ‰Дљ/•§мгendstream endobj 423 0 obj 2139 endobj 421 0 obj << /Type /Page /Contents 422 0 R /Resources 420 0 R /MediaBox [0 0 595.273 841.887] /Parent 419 0 R >> endobj 420 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F27 77 0 R /F28 86 0 R /F30 42 0 R /F25 87 0 R /F35 43 0 R /F1 107 0 R /F29 133 0 R >> /ProcSet [ /PDF /Text ] >> endobj 426 0 obj << /Length 427 0 R /Filter /FlateDecode >> stream xкеZ[oужN_н‡О5ЏъЎNЮ§’` ЄHŒЂРК6’  %jЭЌ.IyЛ§ѕ9Š”Ž,йq  ˜‡фшЬœЙ~3\6Ё№Mœ#Т™‰Ё‚p-&ГеХ_o/ОК№ŽЇдфvс)oч?Иќщія_]15xЧ8QА  м І”žўлТ2дэхTpStї.tёaЙЙ+—ИVХЊ*з_уЇ w“ЉDёrжŽ8јyxџжoЬ$aжN,Ё№3||ё§э“Œ()€)%кŠ‰&H(hЯNšjВИ`QЃ=!\Е‘НJGЂ%•ЎЃиvb@ЏEЈžpF˜ 'ћGiСBx.IЌU“)œЇљчС6 ˜”@ТˆМj#ъi8lгŸeШHЁ§ЦŽШє0eФ81т3мHaA3=Эъ№и”pсNэУ5М–ƒжy‡дЭ:цdˆ`шЗNёџgBtЪ5x5рžМOуuЬфM"н\N•…П9tjШВЫЈйЉьРУа ъЁРJАШИлt>І-кэ*,6‹јр—mй\ТЂjГЖWъѓЭ7!Gд]р|_ЖсСTбЬйЅ$мšqфДшˆ–iя/rмУ*0рТПyѕЁЉЊШмЎ x4пЌВЦ rž†…$TВW6ж"›щ„4/3жЂœu›І>e0vФ`œіz‰СR$ЬŒI§Ъ#Y‹)+.^нb!P›ŒшТ+XL>зbбѕ|ŒЦžm4ЉPђW0кБ(“cЃэыpgДё4‘.ОЮšдфbmшˆ‚Т тxШыз›Ю z-ЛДŠ[КИЅэЗєQsВ! ‘’e^ЮчuW?^ТВzшоЖ‘ЩВўx ‚VсyЯ еiЁL)…Q I …MЇђЦЋк…G}ЫHЈ“VВ–Хѓ s2šИ1PcсbqМdЈ|х цœЦ ;Ц–CЪ3њщ†СЩ$‡у@цLHЗ)dЧ т\кр,ЋСuрHЖЈЫѕ,—Jc’HбЯИщ”Щu5ЗwшWŸуЋњБžзыxЕœсЛћ№.фXЗbЩ­іwЁЩ;Y1л4M5 .„Й]ћ€ŽPlж‰ЅХУ`ЇКѓgЋšqв б“QU­™‡лє‰ћПЯ`#ЫG™ДЫкЩšaэ{›36 ~ЮИџ™и;„Љ„ЎDc$:‰ GˆФs=BOЪ)Ј‘ŠГš„_ЋљАГYТOЋі8ЌАФhuJЕИ“;WЕђ€%Њж2‚{Rˆьі‹‡Z Tєieўњ tL™ь„6GGkВˆкBЦ:ЁM ’/ђг&)г8п–DmтV.ЇЭHF_Х7Ÿ—YБЊGCuZЅ,кbв2І>X„ЬЄEш(АШОЌёО\ЯQГУD№лЧKЅ`Їl#)P<„45ѓ• єђѓЅх5KрТayщ/!Н›^№€gлѕАіїФ&%dН_чп„зxшCр‡Р”щЄЬѕ&—ЁG•&!В!*љSЌYš‚јlDЈв}Эђlg›еœ нЌУ& ‡У˜ˆЖъCњЏšХІY…jЄuDћ­Ж]_К|Yt†P“ ьUЖ—с=ž˜Ж]йеmWЯОЮ €˜ mЌ"іш–8ХтrodАзЈыQ}87aњТ`сиюYш…€ИqЙЉсФТХ6ŸŒМ&ЈNИs4;шDŒ­ъѕr,tяЋ:˜ЋM–NЭШьХќј*uк;˜‹@‚pЃYЭ XG№A6Lxг9SЧ8Я!wСЇp$ЗлeЋ||"џr"Й:Ÿ?ŸЯ(‡z>щ<ПЛœ2­УХР%уР\Ъ>хР9ЙэqЙѓiYB{ЫЮњiё™НЦ“ Яp9t@ўш~xmЊŸ!QcЊс\ѕ"#‡†*І]ŸMІ’Щт/ЁmЙ:K`АCЙЂ›@kh лћХm‚Ъ&Ћ§>kzч—aџOїU“Ы‚(Щ~Й™2ПЙœboњ€їХ •*лr[…чXяyqUЗpДщ Д%Д Ба€›:ІGUГ/‘wKЬAы`пІШО/—щ›<šaCiЊє…ЬёљCГЙ+яъeнauћ~ЕиЎЁ–ћъ%БGeє@мp”zшў_F"=Q@dƒB™і!ТЈA;а9S8цNпdЖЭ35м†g]_Co етTˆё3ыdœ“€ѓПХ‹ш†Ž[fлЗД_ф“ую ЗaјЩ#”]Ў$ c fф_8И"ЦЪWЫзњѕАП/ˆ(ѓ1ЫвVg‰ПЦ‘~ќ_P\r­иЁOЅPоgщ&Diљoњ‰шЄ2jQ&дP.?>яю=м•=˜ЈWЫjUyв%ќXЏї>.6ЫхућS$!ю=D™UѓmLФbм_Qpя)аr‡ићv§ї%Ž”ш5ТlХhqэЏВxЏ7ёњў_ ПАjтъ*^Пл\ѕoqнЄyа~=”`PFВ ˆ— шuvH pЯВсwS+Ђš`‘МиЉ‘ -QнpъCоLX"TBз?0BЎлŸrѓ(ŽЪGѓ(Ыw2Дѕќ8ЩЪžk|Ч‘§4u PЕM:I†U'†яž BQ$эЯК %?6-"ћ1А’Xš€ыЭљ Тž4"Ћ2рНЩz^6ўдu‰•ЈMХ:7ЁЗЁKJўџ т$'Ї"ЬЅПщОЋ3BтфU G”1:˜з'ЦОyKјЌЉКmуѕІуtƒяBPЉяВqБыВ‘jд‡Gѕ:чядчЬАЗё_н!ЉњЯТVУk66 ўцОК ^Фv”§џdP™ощШ'2•Вjо98'T‹}1X(jљЈlўKЪ“ђ4йБ%ыЫћ›`8fчћCямш* zWhвГ*(М}WљДOћџ‰І&ЁMOњЄb|RС^Пнчb1€{•Х"оg‚ž†№Оэ†Фй7Ь Nˆ_jтAjсЉнЉфйV?8sжьFГC)!аЇ Џ цSіRу'–1jЕAѕрЃšњэЂѓyн‰Ђ —Yщ›w‡#1Мb:іХСЩл:Ціl†шg1Щhrјwewџ}“VPPвaŸ,P†ЭКŠ‹Eъ>>€2žђПЯ Нz\сбЯšM\{ђгМџўe-‘ ПъсМ2 gœK6њ/‰ёДendstream endobj 427 0 obj 2451 endobj 425 0 obj << /Type /Page /Contents 426 0 R /Resources 424 0 R /MediaBox [0 0 595.273 841.887] /Parent 419 0 R >> endobj 424 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F27 77 0 R /F28 86 0 R /F1 107 0 R /F25 87 0 R /F36 6 0 R /F31 93 0 R /F26 94 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 430 0 obj << /Length 431 0 R /Filter /FlateDecode >> stream xкэZKoуFžГ/{YфЌЃ„ѕіћсХЦии‚b`Hr`$*цŒDЪЄ<3ЮЏOUw“"ЉЖ,й# Ќf?ЋЋОztuГ …?6a’.'† ТŘ,6WзџќF@#NЉЩѕЪїМ^ў0§льЇыџB›ъЕAЩŠиўЭwяCжяС9ЪЦ.?RE)ќcГЙрzZЌТoY…пМЎЋ:Ёў/wu/уТ}ЂцBfэdЮс—FпїEљK‚B˜IkоЃpЮ$њмєG"];ЂLPчˆ–2ЖПJLKЁУћф–ХцП'HfœtгwА…2йsОЭv_зѕП‹MbAхЎЯ#1Ѓ™юnђP‘еu6уnzјВг3(ц­ФЫљЂкlГ]ёѓ:ж-‹M^6EU6‘Pр˜$BjП#k‰вЫ]Qущ`Z"gsЦ8Ÿ^œ 6­ц№#І–яaZЃІY™­я›I1bZ!­F1КеEV.ђФ~)pŽІУBџ›YŽ”sчІYгмmbљ&Џciw“эАdААЩ3и‰oХE{mnкd›э:­Ы| `MЙŒнЫиіџUЁb•-vUн„З‘žвЋR м’Ш- јъѕl.Љ6w ƒ_&R)Љ”`U $t^T lЭжk^U.Q[ТАj?шЫ\ bЁ&`ЃH)qЎе†љ.вВЮжсY„Пo)ИЋ#k2NСlЕVх] АD1е[Y„ ЪЪЇztxЛБ|>oВ&Pš)BЈ$мДŠ5‡л‰!Ю„vТ…ƒ‰q"0(E-”kћ^~џИnГƒbVћ/PљP€ЪTIRАZЕVЁ9 9"ЅФ€žы!$p…Ќš[JWОщ?€%ЁA§‘EкLГuƒv\ЋЈ#ЫP@чЋзы0Ђƒ?~dЈCXиeябLфeЗЊЋMїKvз4 ЉЁ[P–j{ЗіœhЬ}n йbЭћ•лЛ,ЪїУLЩVя›зб\•‘Н‘Tюawп"сёСS62sАЖTќšT іЫ §Ф€лš8лjNЫiРЈeCN_пФЅЗ5 Кkіл ,№дџЌ˜еќвЯХИ'L@LйW 2ч”о*ЫЇ™ дz‰7ajЈGb ьm1V_|}}СЄƒE9аЯ<ђ˜%в*vRч“еыbЖ'ЗФщ.јажхіібА=.ƒcAфлHЄѓ$lE‚Н ŠХ“†–0 Илї:Šа\%ˆВФ ЖўЁOВ=G§^џLј‚Я‰ЋўЈТњ8„e€А>Тu2Гц „_ЬШІВ}”ПJ†UpŽ‹эЌœсƒHЊFAНѕ‡ШъIg2(Ф$CўЙА ч0і$2ТХЯ ”жЕЧdƒ]я™8ЖэAђƒНNmZJлИ8Й„љLБ3щњњA”KыЈ“=EЂэц†г(–uьБ$Y‘Иx<‡ЃШbW„3Щњ~fY{x`BjС‡ЧД2& –ЫO 8ћDF'ъš8Cз.п%=ЫŸJзмЙКЦ;3›в5nє_Wз4і†bЗъ\чv•“gyЗ„_“„‚CђКІОџщрŸ§юTи ч‡zџ№eaz%y’3ў:iK6:д -й?0^хIƒ%ЃљŸ38`gЌV%tннј‹˜ЦЧl#{Aлxp ˜ГРУ‹#ЦП§б_Б&oр-3OˆpGXеBnнŒу=˜>Y/ лhБ:яюšBa—ЎxD —U*\!ЇLsKЌPШ2Т:з0Œx@•ћяР &юw|’Р`В@У !ZXоя`OF›р Ч/xnS.ŠKЎwўˆw*ч§!x ЦіxўPQ(ЅЄЧ—дэЅDЇ` „ы :pМЉЋЙи—й6%3]{2ћ}ЏфŽ‹L€рѕSE64N\ŸљB•S"™ізХE{•мщr|§—ЖеjдЖ.Ъ<ЖuЉEЕОл”Э№Т&леХЇ` ~HY&у|тф™Џ0KобO1ruФЦ7б юТPL5ЁфЩеvŸ)кMы| хМœсЮ‘;Ц=œОТvK#‡4І~ЄLнхј8ЧW„%\LV…ђлз^§‡‰M„„VЁЁ›ˆ;џXл‚0эЧЫџ]^Co|uсЛЗStНкw:пщь'oТњў)."‹[Fяvp$rЈ}‹Р­Œ™:Јl+|ŠЫXбю ‡ѕžaђЮъ№ЎЈ?aяэKКЎН‚Rœ-ЬŒFH52Ћќ8tжжЦїX”Жvц7цbrŠendstream endobj 431 0 obj 2177 endobj 429 0 obj << /Type /Page /Contents 430 0 R /Resources 428 0 R /MediaBox [0 0 595.273 841.887] /Parent 419 0 R >> endobj 428 0 obj << /Font << /F30 42 0 R /F35 43 0 R /F15 7 0 R /F27 77 0 R /F37 5 0 R /F28 86 0 R /F1 107 0 R /F25 87 0 R >> /ProcSet [ /PDF /Text ] >> endobj 434 0 obj << /Length 435 0 R /Filter /FlateDecode >> stream xкеZKл8оsяaР\|”˜#ОЩYфаоIcfєвШВ9Јm96ЦЖz$9Н™_ПU|Ш’M?в,f E‘t‘Ќ*~ѕU)t”У?:В–HFG:ч„)>šmnІ7ппQ9Ђ”X)G 7ѓaў!{X–у g:ћ<–2+ъUБ• v)x+}cVmžvm9нaјq<п•‹Њ.|јчїwLїV˜аœф|4aŠP-нbяУ43вФjœЄˆaІmЙ›rыЇ і ‚ЈbЃ§Єз‰хЈQ|dHnŒ›єn<‘ў. sжћ5oо<мАœH­aЫœp#GАs.F9сжŒъrДИЁAСq„kе)xАŸЈр'ПžїЦ ‘œ†ёПЄŒ-&аФayN„1,Їз*všVЌДіВbі%ŠFХf)Ў‡аkn’Š ѓђѓ*§-ЉRІе%•ЪK*Ѕ_ЇглЄRБт’З‚чHmЏUЊxы^Ћ№sДЊsЂ8OjеЯЫЯ#СПs™'v •ь‚/ГЋ‹а Q-sСФђъ[ƒ+ЅњЄьЂ™eпЬub1M lцМ‘LbьEFЎЃ)`‘Tне Lв”‘уФ?nхmBї–(!ПЪЪ) УЫуЄЇпb&\цD+T…!ЦˆЂъЄКˆд.ы24Зcи­зўm‰o_ž\hЊкeй” N# К6 —СљЕЊј)ŒЫЮT @Ьžsф‰cЂyzњизс—B“€Њ'ъ‡1Фе<пЧэpдЇнКhWежХf™mЪbТєМ zЊкаQњп”лЙQm§РЂ˜ЕUэИЭŒ&Т зe—S@Фљ3ЊmњgRлєџFmЗ_ЋЗxWMTŒЎмlЫдАђ:‘‘Ж8єŒЪrыо.уюЦЊОЏA‰ш`CnхM1УЩЫёD†їм ю9n тГ-ЧXБ§ш@л4pйеі“uлС9ГЊЎЫ&мЮqB"zPMєx{н%4h!А№0>iZpЎІ]Эќ™И„мBvnБ@яaF‚*сРП_%–жѓ+їьЋСpцˆдž&вт4пcpФˆвgЃу`Ё ˜$hc9АŒB}ѓŽТЌUЖ'ЈSšз_Nм-i‰БђšЫ%ЎИ\тЊЫuZљ‡:q’мі Dl oB ѕМj—сДшЅЬ@&VЏРŠЕw(†‰ˆ#{œёyмzWІ9.єР‡фР‡t#ТI!WйŸ”ё0№ i"ћk§№єEqа9жh=џzWŽгЌœ­рTœ6› $”- Фvзѓк?(Iљ4WŽ_љU^РTю†x%И№€]еv§ХїTл0T=6eэцЁ ;ЪзўWMБyZУ…œ@rрЬрэ+аc5пс!8 ЄŠ˜NcєИitі{YWdXжQ&ї2+ЖHV=@YN$Š}Њ8Y aЮ— ЂЅЄєdЫ„э<,=Эƒ”k§Љ‚ ГмрЋШbї aqS†]Ю;*8фx‹jНЎЉ=Л †]Ouхі1+чЛH)Cљ#.pOУЉП^Зл_о 1фўYв<ЛŸК†ШюЪ]“eoCзЛ№|žwюЩГЋЛ=8 ГЯу5Ÿ]9оVў:о~›.i&tЎ? ;Г‘KоO/ЩpЪвБbУ ЊїБ‹Y\3ч&8a]~ЦСrн ћ; ћpИ>жа˜ОJэx9ёЁж“YМтФr1GOДЕ@’ГqБVѓУ#vaЗŠ“"t“мSЮ€tG Й?щ4в–фFšеяЁ7ЎмMѓ Йђ„Сs6Œo?PB‚‡в лгЉDт‡0ƒ= ›mŠЖ^§лЦяћ|R*d~Т‘(Ф"б•Цо}ƒѕCˆcDы!†8Вy†yЪМЈчўm^~^EћLDЎВfs5n—E[шy€dЕG…ЦПф^anхŸ]zmНк<јh‡{Э˜Uын&цёmu˜ЅЋlzїYЉ 0Ѕ:˜ТОКlw5ЪХСT˜^уЛ§оJЗnТm™Ищ"ZMЄ %$Q*їЕќсR§єEџПCњЏt– sЙ2зФKћ2qЗ)yGQѓМ@{Љˆ‹|А_Ф§ј*xОa!Ѓ;Р/І>`і’g5њ~уGWлд…Kг• адžбяvб:Г№Yс’RфœŽlЫQ@+ ‘йbЗѕ„5Ѕ ChW{[ДЫ7uОZEЅt˜‹{p‰Лk,ТІ–Ёˆц$X[sGєћwwШA‘(еБ`;ѓlt>|іРrђFСС}йцoЩћMLїAїю—_S•е~žƒ6їѕG›УŠjЗ=• Яv ч‰ т'hWRљЎ§U;еƒц\mRЎm!YЕН}NјсF{ќОЈыbЬlі%dЫэ§/ži;qe­vѕИ.Ѓ?‚7HBAT šfдЩр'EP:З„ŠPˆт„ЄPЦГјYу*ЭЉEXV|†НXA‘Ѓр0H’€ЯАN ЁN$;Щ;‘э˜Гьџ aДL­q№‘ э@•їК sj GŠЁ*cўБкіО+ья6Œощ_|)аuSmR‰4d-ВЃлЃ*Š"ж Ф4љ5bXэ 8~, pœqжЧЎ(ž"Вuъ‘GЊzф1ы Й/m5GћRЛkNХOu, рXKѓЕЇ"‘4@jdИѓs‹ЌZљЄРџ9гь6юЃ„PC@ŠьЛgr7й0qИјеЅq[пПЈ!АЙжЇbз4рŒ~кё-!DW“: ШУџэ“(уџ†ˆЮє]ЂRœŠрмье4šРPp•‡фЁhWЩbўuoяR>˜rХ*)#ЎЎХ @ хiNуЧіџ_žшГendstream endobj 435 0 obj 2523 endobj 433 0 obj << /Type /Page /Contents 434 0 R /Resources 432 0 R /MediaBox [0 0 595.273 841.887] /Parent 419 0 R >> endobj 432 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F28 86 0 R /F30 42 0 R /F25 87 0 R /F31 93 0 R /F24 5 0 R /F35 43 0 R /F34 5 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 438 0 obj << /Length 439 0 R /Filter /FlateDecode >> stream xкЭYIЧŽЎђ9№!‡4тCšˆXЎ}q C”d˜№Ф `ћа"›š†И КI-љѕyЏ–оXфŒd‚†НTWНzЫїОїŠўXС$#BЫТPAИХjїќенѓЏo˜*#NЉтnу‡о­П/Пнзыzuhл-–‚ыђXwGМ2хЉЋЛpuМЏУЫЭaЛ=,И-п7ћ7сQwЌŽMwlVп,~Мћлз7мŒaBУmБф–М у&Т0N—QЂ—8>%šГТj­МЋ>ќ@ЭЌТ5ТХЏЛ8@†8ƒЏQLЦ„‰ИŸŸKCИўЫЬ ’ ^№p c~ПX2m2ѓ3JŒВзр™MЯ€нy9žџљю9г”X#@q V‘…в  SP"œ-кКиЕqXD1о‰!Tу:І'@†›Кe/KХhyЫ§…(Пeщ"<‘хM|№ЇУ .yђ ™ц–ч ОПЏН„B—CPM„–H›Œy›VЙЭYЃ—ё8дЫр'ЎТ *ъ žtЭ=, 0и&<оUЈі.~К_‡O/Ч, ‰LKŽєsI:v&]П0иПйUhhя,Т™SєsIЄ к‚<Б_W-ЪЄXЙЎп57ћŽрВœ ЇR":€žЕѕёдюq_ŠЧEс"ФaлTћUfmqЪp О–БФJ7Юi"є04— “р§`ІАБлоЧO;ќџкЛnнF\ёіп5ьQ‚–ўW–›xŸ•‘1EЄK2ЂsfФ„tЊЈ‰y>чqљ0MЮЌњЬЦ8 РЄ2ДкЃЈ"–Рќ K фŒѓђ:›ю€ЁmDиВ‘eWП[Њ№ iK‹dЌ.# EФ&ќџ^X^ЂQ /я+Dˆwј/‡Ив‚Eтоц-ъzjбьзѕC0\tТUи(tр&І|ьЃ-ClД‚„œдЛЯрДГч ЌЇЩEx?"PРОG‘bш(Rrb 1ŸЅm;KлŸ(FЄvх_Ѓfš.њО2DіО|ЁъКгсK QRгU.z­тЧ2џКzы­ЙЗ›іА WoЊSз‹Рpe0дссДћїOƒmpє8ўsЪЁQ•ЩХд Oлм8aŽдЗЄDrxмe§)p[6тq>КUD4иС›C`ЊЯŽЧCИФc` +€Rїˆƒ.:QНNbъfJ{єЉ[…НОЊкуЖ>чЌ_ŸГ~ѓЩЌп(BИ Dл ЗWyвo™™’~ €€kщя ёБb˜€Ѕ№o5а›#ФУHи7ьJŒxцaн_FС€:9ў O ˆЗС ПЩнњXB'dOІВXЉN:z”MЮљо4Ф§еeћkвgД™™жхvŸ›  Вї”я2˜ey‹@ІлŒИЦчПaЬ9Ee0xУ€`Љ/%БрKюaЧќчld'X[5“р…0xMйњe.QТƒЂ0і˜™ФU87cе4еhBЁДЁ’p“zОmА0Јб‚]Hˆ№y`Чq0€k}НЮЌ BJ: ІY42ШєSьw† /№€sќЧ ЃгЪŠ'Фˆ{BŒˆЯ Г@vpnfŒѓЪ i™ГLFЏCэU–єs†UжЎьјwq 6ЎГЉGB !+іJр8Рх”‡=M ?= Žb ЫЊБП}•Ћ_ЙЦтR–ОSVЈ`Яи‡1S‰чСn™Їюi€ЯŠф0тŸЙMq_Т,ћAOw6m(;NH}54…R š]M}*“њfЭЃєhЅfZBљYwЭњфЩмщ)2{e€.ЇъїЪфОŽххC џpъЖёžŽ v:ёPюљLиФ‡œ‘……вŒлI} xФ‰Z9HY”›6r"б Ѕь6іЙюёюcdсАЩ.ѕЫšю›0ЌЌAљXЙ ЎŸš^џ’k[Й‰Ёщ…VŸЉ?$Onl™э<аGИџ$wŽј~Jš,ыв†О­ћџмЛ%џщЫѓЇ/?q•ЩђЯХxzЏЯrсl<ібŸu;*ЉДЕЗYир ]FЈ=§РAЅоЂуЩKЮ%xєUяrŸу]/ђXŒhK/W5PNї рЁrъBХW=` |№§2ё\\Њ§„ђќ ЬѕыŒк…чьМу‹(; ZCйж6ЏOXR‡ХSУ[]вЏ“иЏБ&ъд#Ќ‰ЮX/кs+TЁЈšР–o–{єЭ2вƒwaЩžСЗЮу1РZжї$рйkaс:TлXТfђЄwЭЊoЉtŠ-˜24:р"днљ3(‡M<獘9=’Ÿ}Jтс‹Ьn ИЁіввБHиTuLэN(Ÿ|M8єQњlЗ =Oп‰нɘЭЏЋзЭЖ9.И+?†С›г~=ю ћбsNŒnbКU_цЛ-1пЫЇ&œМЮХ\чйЃЅх0(љ-ХњrDH2хю™уP'й+Ц+Ућє1Ÿл4Mі§ђRл\ЧsзћO>Ђ…tз"wсzТX 9 ч.h•е&…7(ЯѕЦnЎzˆЭ2•ч'Б[ѕvв”šgўЄЉK'Mщќ$/§§ОсУБвЇž*хЮ.FЭ›л\ )HMЉбэ1Q$€тЙSŠ№;іј[Е/rG‚zЗп3BnЛsБ œО—1Д{-dˆGWмЪ~ес]ь‡УF№ЩІИsс”€аіgXW$ƒ)"ќЂиљplЗbдx—€c“#*ЫtШ@јйќˆ ŸЅ#*/ПБ`N7мp•L дp{с(HcR ЃCхъVG”су+œ/l.ВvЧhќХУ)CЙЯЗјЛ‰Пy‰АˆьO4СЏsnUщўPЩ/T:ЌліаЈ э BHЎS zвчjз?Њі)ИлœЌPшZšd§УўпUЙђЈQ аЃЕЁe”Їкџ_)`Sendstream endobj 439 0 obj 2571 endobj 437 0 obj << /Type /Page /Contents 438 0 R /Resources 436 0 R /MediaBox [0 0 595.273 841.887] /Parent 419 0 R >> endobj 436 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F25 87 0 R /F31 93 0 R /F28 86 0 R /F35 43 0 R /F37 5 0 R /F1 107 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 442 0 obj << /Length 443 0 R /Filter /FlateDecode >> stream xкЭXKo7юй—žкK.{ЫО-r) )P_jЃ’ ЅuМˆДrwЅщЏяЧЧJЛ6хШn>˜"ЙѓјцуЬЌ јc…eФi^*瀘-~>=zўJШ‚Т™*N/УЮгљ›’ "'ŒqQžЌšЩѕД.Ћu[ЯŽ'Т№r]uыюјнщЏЯ_с;С*}>с–HЎƒл_rчв—Ai9mЋ8иtе<ŽnЎЊЦXЙОJ‹гЎл,ЏзѕЊщЂ„ІЊцq?+/ŽЙ)?%Щ§ГОЉgг…7а›Ф$‘2šдЋЂ|K}?н`ыдыЌМ† SЎЎ7‹iв'/oъѕUUm 4 ?+ №щЌъ ‰E б%Ќ7Ћu\no)“‹E5'Ч‰ЏNЏЊOбПћЎ‰гEЗТ:S%\РgfЁ0+M„e)TэБJЭ/гэŒФR™>ЙŽV3xяэeкƒї)*НёЎкщWtЃ/-tuqИК­i‹‚›Њ{ц',6c­ ^‚M”0ЋЦёИ рsd№Ё џлј…eW->zЛЊŽ$8L)ТK Ќ“Œ0eЗд%,——ПM›fђЧUНn‚F€і0Љ 2NЏjh—ŒХэa4[-AцЊŸїцњСВš6aŽ8Тš75тъf^yrйВТЈё+ыИвM—з яеD[WОNЊЂrо+Ё S3ЩPet,9PkІ‹ећ8БœПЏ7НЪЇ]‚:јфБН\ЕqЊЗаŒ,є+[ Нz$ Ѕ DY™ ЊRœ’TэЯѓ.vqъrЕXЌ,uѓ> ^у”uыzіc 7ƒp0ЁˆC€pВ‰в,h:Ы„qЂxbѕ oП)—uуvFЈаDZ›voвUтŒ_жD#=N1ND&edHb„(v{~бДЩHѓŸP=Ч3і{q| .Є’pZ8\s %к'gЌњг˜CKЋ$v ТД~ w#s,Ёjшн‹\hxH№Х&ЃЧYѓP“CЯ К˜ђц:eМgжоЃЫF]r/4ЛHЩ>R4ы™кђ‘šv^Щфе„#•БžG/OЌ#šЎ{& ХёO”g‹Ж*.XЊњ љаЛŽГЁC шыў­єG‡( :<6 •е@гxПЩСЬ[ћ’tлqEИQŸcZ&хшpнU„MzЋшšѓ=4—‡а\ЩћiЮП^šѓ/FsўHš3ƒbЮ@bJœЛфмvо ЧБлТnu8ЛsўN„„§И­ш3њна1*БhК[љпв0еЌЛв@".јЃj|рЉ§…3Бюc&vqВЋџŽ}ЁІћМХ}ƒHај> ѕ#нН+ ЌRЬтЎШК›М„g›eGЁыаwЫзb‰ї4^lщb‰ѕŽ‡є_Џ/ѓ|5єсeht0vН@мѓ]О§в@0.-ž6ѓ<‘…vNџжЄgйл.n‹*зJI„Т!‰NZОЭWiЗ}gЎ%šГA:>ЫИƒ‘нf•ЯІяћЄ8aœ"лШzTЋЂяџ2yqТЈ#И~њxz›Gzњќј$—Ж˜Х™ Н†4цоFTcЋdс*хДн™};F0U‹‡Рw8‡їЄљ о˜Ў TЇT>5хAЖ%BrЕа” B8ТСф]бљlЇѓ$ЃмощŒЌp€^ :Х3РящЖu•R$цUј‡‡Qg}cuК`špTы{йѓ…cєѕчљЌйџп QАŽpф‡[ЂЙ‚kвњ 0a–Œї• …ЦgЅ^%]сmysћr›|3ŸЖѓјЋYЕЫ№LЦU9ЧП­/6ў9-ЮlšyеЦяїDˆKДш—;исцуFE›XДIђ IЪ—‘ё#Fнн~Хшgj_—щMЄšїя%љ;xрИnWсEeVЭ7mк–’ІЧ™Jюљ†Чч'џjѕgzЕђ(0”1EmyТ§€‰ђ<Ь0Yžї3giтхuзфv&OŠ84zао5 ‰Д}=Щ cИwšОQлVќ‘ЯбgљОOH_FCѓШ˜њнОy уи<оет люHŸГ7Œі.їj‰“‡[|Юƒ(ОWЫ(†.0ЪЧ/ЃЦNЛ‰t*=ЃI“XЃwЌС\[­7mxЦwУ'ЭЇinћ–жM6І0кѕFŸхы w|€PЖѓJЂjY1~ЌюКDђzК=У А}(ПзЬdcЪп_{*€У9ѓ,rQ_S?, 56PкІNQб'ЧBdяaendstream endobj 443 0 obj 1734 endobj 441 0 obj << /Type /Page /Contents 442 0 R /Resources 440 0 R /MediaBox [0 0 595.273 841.887] /Parent 444 0 R >> endobj 440 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F36 6 0 R /F37 5 0 R /F27 77 0 R /F25 87 0 R /F30 42 0 R /F1 107 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 447 0 obj << /Length 448 0 R /Filter /FlateDecode >> stream xкЭY[лЦіѓіЁo}щCљ ‰&œћLƒHбNlКЉИAС]qmТЕ %;ЭЏя77ŠЄFыMS…еˆsц\Оѓ1-*ќЃeœ˜JКт„)^мэЎўtsѕљsЎ *ЊИЙї[o6ЏKЪ‰ lЕІ”БђeЛНлЏ8/иwЋ5зВ<4Уaѕ§Э_>NeA)БR†_Џ#T)/уцm;ЌжLиА+Sоэwuп слсm6ьšК‹ЯіїёнŠщђƒћГъЖo6a=дЛ‡m3еZTЖќњЄДKБнО[C]Нk}{ч v&тДBыЎоюпрLLzХœЉђя‡уІщœтУ'CxьwЋћ}ЩЗ­q Ј&RZh1DU4:ЂqѕDЮqh†ј,МtЂЗлН?tлН‰‚ѕЁэняƒГ™ž8›rN4ЃpyE*ЦƒІLPА2•Žq§ЃuЙkЛVВЪHхŠcтю(Ž!iˆеюЕ"FA%%кŸfdhRQœі|кklW/nа%|HFŒ8'‹ђEP@R="8BTbюNZXžGЬРM‡И4Фd3 1e–9@цТ ЯЗbAa8тЃYє‹ЧЪЩcЙТˆд?+њр2…U> 2ž ЉЮ]Э<“ :Б Jз,Ќџ‘‰1‰d€КЄрнІю#uщі§ЎоДешллуЁѕ4OŽнІщУя/xt+$АзњтЌ­ZЂЌ Э.Ve'ˆцЌ8эq>#ёlŠ“ qœгЉvXђЉєЄu`щ[тgm—ЇZfBЕњНяawЭциЧm“ј‚Œˆа†,0в™уй1˜Бѓа+єIЋђ;џ)Ъon§‚—поЦ'з›іўоЏYy_~ѕ0Є4YТхT]ђ›™aр7FІ@Мz§Э-!по~Ÿ‘ЉvUЪу‘СЬdaRа65Šя>&+Ђч(‚F""pА‡woNМ]YxБлœЏ’ѓэА.›gЌЃoЧОѓЬ&Е`!KыуnuЂ!}иИєSРSсžЮЈ‹а.9r@§ЅRwЫœmR'uД@в8(!ЏŸD;GŒЩЊУйбъдьА7yмЋЄ˜„nNFъaˆIмжcђO+Ї9О‹"Уw(ЖAO&C…УѓZvfЧ†`;њГ;\• ”j‡Eжв@Оm.‚q_ѕЄРMT‡АMцу63ыР..œkЃufшгИУ/d€gЛђ#) .Є…Ж+ ѓ3Š6ьc7О(ънZkІzxAO ŒEОЯЩˆhјŒ0ѕYvrc,}дчfJгкь=ŒдfBгFЫтЌ-Y4%!fV$Б<љ Ї€bљиUswK’ЅпїgчНжъП?М›<ъЃЫбКЄ+й œˆšnYІЗ‚ЯM+’+9И&ЦЊ%+[о+щe —љcRзЭ<ьЉ§Л8E^M1ЭhЦ—ї)й;]БЇ$ЮЌXg2”qк“Лg‰ceа#3o‰‹йd•(ёѓ‹Žд*лъPш,mШŽWч2Ѕ!rфбП;a ч0МИRиГ>m:ŸвмѕIЎдТНС nЅBЭЏ‹.у' йД!{r?ЮfŠTєџy4ѓГоўыЅЇ–Ў\nцЊtyчБWёѓEœХўМў?™ХјШЎГє5СХъu‚z]]€zЁ^W ЈŸ“wЎ=fEхЏ)!зCnv“|BnЮLфјюр‘ пGЭРП—]˜зLZb”™цЋб§ЗИ}tDјm?яілуЎТ5ТZh92^хdЄБ2cА*‹јabёзи˜X 'wп<ѓ.ЮURMюо^ќє/ŸуeКFyКs…џхНџT—Ьqџ!˜0‰џЄ1ЯнcŒг h њ&‘ќJ$~јGйŽendstream endobj 448 0 obj 2150 endobj 446 0 obj << /Type /Page /Contents 447 0 R /Resources 445 0 R /MediaBox [0 0 595.273 841.887] /Parent 444 0 R >> endobj 445 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F27 77 0 R /F25 87 0 R /F31 93 0 R /F30 42 0 R /F1 107 0 R /F35 43 0 R /F28 86 0 R >> /ProcSet [ /PDF /Text ] >> endobj 451 0 obj << /Length 452 0 R /Filter /FlateDecode >> stream xкНX[oл6оs^іќ(/1ЫЋHЕшƒ“4H‡$P(љA–щX€-yВм4іпw(R˜pБГ‡%@D‘дЧsљЮ…! Пd Jb:˜!ГAЖ>9ŸœМЛb|@$ЂD &‹fчd~†ФpDeб—:­ѓmgщj8b’FsxЋђйЎЮЫb8ќњю О%.Фˆ*8I4@у!Мбhл1Ь(пк•]ш*­ѕмОЮ†TFOnœE^<и§ѓДNэt^ ЉŠъвОЙЩ­Ўэ \МЄ6rŽ89ГUКнjСqSЋ•=Е8F‚ФЮ7$5Чл;VвлgЏSgfYEifВžЁ­Kё z2х…’ЙН…ю}Кo3“п—шCTW1"M—БчњХ=™Mž–0Єг&э‚ДїЗS' LФž г‘§щžШў !P^ЌВ‹‰tЌd4>Н6~…ћђј”^›ЃбљЧёщэ/!sFфйЕhвЦўѓМ!КМQiЈ†Хы%:%йЕРЁю #,xзOц§ыa{PъVZUЉqЫ“пк6Э08Žt0ц иw|лЧ@рCUrиШљ) БН&)И•4џЂРТ,ž|šœќ+ #]endstream endobj 452 0 obj 1363 endobj 450 0 obj << /Type /Page /Contents 451 0 R /Resources 449 0 R /MediaBox [0 0 595.273 841.887] /Parent 444 0 R >> endobj 449 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F27 77 0 R /F28 86 0 R /F25 87 0 R /F30 42 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 455 0 obj << /Length 456 0 R /Filter /FlateDecode >> stream xк­YIЧіyrШ)ч№ц& Vj_ш(Бs˜РCh‘MБ’=h’rєяѓНЊjВ›S1ЦSНTПѕ{[QЬ8ўФLHХ<73Ч“VЭ–ЛЛ?нп§сЅgТ1)Ьь~ЗоЏ~Ќ„bvОјІzлэъО=tћљB9YukZuЕjЧО§p:Жнў0џщўo хfB3Ѕm"ЕPœq)Я™ˆ$eѕ§‡Cгš+Q5+"fЊzŸ/Ž›Іы›cЛЌЗ7й@T!X0Yт…”L йќ‘„фМъщ<г™/dеЎžKW}N7А`sкЛŒ*г—єъиЅЕN/'вѓnп 4=кu:ДћљћMCr“ЄАŽ&ы@вuЗнv$рЯqЃ’Ж:ы#Єl—‡зйž|Є(œЄ•ЖюKF§mСИђ*{ё$PSї№нзйvві\™7џ>oBXpєк1Ѕд U!юvžYъВщu•Lˆ<&Вњenм‚ВOpуFЗaг›LЦŸЩ™|˜оDкѓ Э Р=і, уVCfAŽіќыc‹„9Ž{кG"KцЯЖ~#JЮ€]Œœ pЩ<џц†,Є™1ƒ#О$‹gf[цТD” >,уЪЯ.{О*АЩW‰Ял„`ЯD'Х”#>аH<В щ“ у/ЮМћЫ§фš9BŒP‚ЎgF2Ѓ$™;јYпЬжw"',) CЂЈA€sЮX•јsДQ7­Уp€ХB"6yxV\§0їШƒˆnWu[ЄCЧЋb|AnІО-ULЈСЅШqp}9rмm:`dє€DЬ ё32ьЉРэW •CC§‚а˜BЊ›є@|іъ&ЁтѓВgЛ/1“ Ѕ(}xџ‹˜d…ad–Œˆ–ё`БNX8…%ќZh(ЛˆэJ%P+“.?ošО)(­4“4‰uГыR~ЬI’/еЫT#NfФiеьЛ#еc“*hМИ*ы–чЦСјЋЦіTќN;њџ!†jг2•uZ?ЭЎъэЉ‰Б Йc†ЂmTІл}ЊЭЫm}(†И`‚‹Ќz9]†0˜цUЂuУˆˆСsВx(P Ь9—п'‹€VAЫє"*‰ћ(xs`IE‹NžYH~ЮпїDJs™ImЗt'ЊMlfR’ЛC{H/в*oU2<ъєPЫО{”Г(…#0№‚ЊT#ф Tc^ЯЦ›Є9Щ1`СE,а“i‹GO–н~нѕЛ,95r:upйсЦFFЩсfАьGвЄіŽ,I ЗЧd]2BteZŽЭс˜6]њ,ГЦ@ычЁHR{BIdь€юWбiу­юЩFъч˜T?УЄ—ВMxД"NNB\каtщTг}6пЕпЕFžбLњ'кЛ`]j&гІЉG•Qш–1oи*$’0 ЃIХїЬŸпUЎЅТ-Ъ”›И.6яeУ жШ[Mб[ZкB“…Ть‘Q|˜$ЉClh_uy]3ђЌS7Kƒњœ}RD5ŽбІш,;’:СХъœšpQNMxSVЬXѕЎ9ІМlIкvIЛ7щѕІ&аЅOO2™†А`M… kwѕБY%ЫР‡rлШ0ёJЇюЋ‰ц7№ыбcъз0=.aЈ/&з0Б \Єб}dЅ9ЩЃsаЯAЮSnс“дљ†цQp‹КЗы$JrьšzŸЎR%ХтПЊ{КSuјS[ЧјK)гЃЋS+ЇRc‡ЂфЎУй№Ъ—H4ЙОž}IHgЗRх3ІЇTuUqр)RНSМъ›џ4ЫcЌ5*’жTŽА-!З;BєтœEЇT6эЧ Х=;nШіщj вЗЙєац3€ :#5Љ]З‡ъIжЅ“єйІCŠЃсM*}•р.([?ЄŽпл2€†л §vb*‚Bпў[Ъф€27Op>фрімпєрСŠ hІЇ €И;GщфZS(јЊ~xшcХћa2XЛ„slЛџlЈОЮЮ„)ЃIњыqЪсt8елэч,lј(”њЉjз #XeЃui=rм HЗп~ЮНШКT„ЈЕ цeУ1H№q.љ]Й\Z1д[S ‚Жѕ|фрKIйsЛјЅz№ВЎсњЋ6v09œГlVЇ>&_мд}F_Л{и601Ёт8˜Й>ЙMЦuˆ'nЪЇћћІ•япІжŽ’бЛїЫэсљкUяоЧ$FwBаgМRелzЛЬ—єyМ”еŸЛoЮEG>ЄSН: ЊЬФN˜ШY}W=цp=F^“V\‘`ˆtвKФ№цP^M №xЩbr* Х@Йƒ“ьeыљрйchZXв‘ѕ Eš ѓ’Чuщ6ќp–лЇЕДцAшUAIasТ^k)‚Š'ќЖv" †-%Ы'ЕŠ>+aл0уфxІЛ bWщ8Јв)dАШ‘jкѓфžе{мbѕЦР;h (§(ɘKhЉєЗ=^wој%џўTrАG qž'$ФБCY"ИOФГ{ьКoћ ДdДі‹%LЅL™ы eсщЧСФu?:љэРЋщЏдJžr‰QwTЅh/ещ5jФёдяуЏИkї%[Y:нВ2eВFœЁH№ќ?qzа€и‘ЯЂ”Ч$§Й§ЯHUHе2И‰5ЦюмEв0ЃЩДy]чЕЈЈЇ)$‹€|WЊOH:ЦNъ‡ЃДg)z˜їщPUp; щџъc‘Cendstream endobj 456 0 obj 2111 endobj 454 0 obj << /Type /Page /Contents 455 0 R /Resources 453 0 R /MediaBox [0 0 595.273 841.887] /Parent 444 0 R >> endobj 453 0 obj << /Font << /F34 5 0 R /F37 5 0 R /F15 7 0 R /F30 42 0 R /F27 77 0 R /F25 87 0 R /F28 86 0 R /F1 107 0 R /F31 93 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 459 0 obj << /Length 460 0 R /Filter /FlateDecode >> stream xк­YYЧіѓў‰№q˜эОЛG€^GЪШВи†0Kwij†ДЂŸЏЏ9Ш&Ѕѕћ0Wmзб_U}еd3Š?6ГŒ”šЯ „k1[ююў|їнafL!ѕь~э%яW?LMј|СчХПыпц‚u[mч aTбjЇ3ъЁs;>4ыp§mЎTQmOщ?зPХr[u]ЦzNЁ}˜7г,рbгї§`ахZјс~SЦrо*8Ћу’‹Ѓ /\ŠјMfœP)€X\YDЌЄп{ЈUmз8“8œоЛрКј1кЭvоuЧъˆх7Ы.<я*ШЯсЮьУЂ1ІсС%ФщXЧUЋюUЦcGKЧqaоР?E)еР!ф " ”gcL„^_рˆ"-‚‚Р‚Ь!.4+QO„пEЈ–0‡h`єп‹u(J D8#жШёІLцФZїч5Л4ХёjЦБˆ†њ˜3…i~л”%L™‰-П^и"`‹<Гх6mŽэЙ.њ;˜єЬ&єcx‘1dFўžQzе§п_УЄ$ 0v|€Iўвp);зыœУЈ*мЇ`шУя.”90Ъ‰Ы9Л1Ш­Aш+жyеЇђBRBб†"‰еL0\t.—1bP)8UЗ“љ]6QЉєuд%Њ ѓFЂZЎЇЋy$r‘9K-_žЁ.АУc"Ђr 76PpG'ыvз…W›Ш+З›}н=є[gД pšTѓs•ETЫЏї№е iЉ~Ÿ‹&Кh‘лг.л&p_НЎMjьЄ# Š№r2GфK``4ПЌ ИGчРуЖyH…%zgzяЊэіŠ›zXaWЁxў/м_с›­ЋьЫfж8с[(чїˆ: УJ8l'$о_ъ')а<"5›˜izЛфХjqHЙ y+ЈR—%щмdѕL“s”Qћ"љ%“хиф,Кu_йdЯЃI™tЂМœ/%3qвvHpOO~\<„Ёш\Ž€сjЎA€W щoœеЅ,ЧJ3.HИРЯFWѓиo€ЃГ#ЯX>уоLO‚ќ+tА(Оn›]Иы›АЫS‰ž5ЮЙЎкEИћœЂ9œЖ•[аН”ощЭ1ЄЂQЅдщт‡p›Їfз<жћџ1ЬощуfПЊCxkмэ—ѕАOШ"ЅІЛєШИdтZрE‰­5|м@мм#Ÿ/РЈuГн6ЮЫOс9\Т$#Š&p\?8qdЪH]Кƒƒ$4оі`мЇM2ѓJЌ0+ъ~В8d†^ nœњш7љУ+ЭЪtbщТt-$юЬ”ШN4Сuљ,E‰@ТDa&и]\ЈЂ‰зѕMЮЃSЮwБгкppДЌWЇЖNnclv‡mНЋ=ГО$‚bЪ!Љ„P!ъЮ?Ÿ6ќУпЪ]lо}%–ЕХЛшю;єУCчя„—/ПoоєЎКѓ[‹‰=pЫ›fЛЮ­jЎЌњж_хxЩs†5XЮhyЮЏ&>‚_‰вŒл›gƒLjbЉŸfЕOBpд2;кAT€/ЋAД? WBч2cf.EВЂ' “P9„фч†ЂО0эРtе>%‰uИПiТ|ЭЊDzТБzЩвpЦ†сl8ЧэТ—01OЛ0Аљ“MЄю9VєХзa›‹Ђ&Yj„[[оTеEфЮNt5JЅх“бьc–У ‰ыЄdіЪ~Еэ8b„ јс(f#збУЉџ”П„˜c]Jфъ&0АxŒ Пф@€л`Я(-7=ƒФмэЉЇЛN~fqR“6‰ ГfяљйСxп‹Ц}Y˜ЅOэ>­”IBѕ#С’НЎх|В oQЭ;З ш~Zфm~о §)_jпыLjєј`RиЅ+ьИ^ѓIуб„5”НœAhЂ*ѕЗ˜IŽ3?Э†,pˆEICНТš~™3ўw9Q|_яš№ѓњЧc[эЎ§ђ†ŽЎХИчHG­вџрI…ZсnЖБUОгИ7n‘|єуЫдS S‘[СЂŸ™ 9R юнg~w q^mкzylкЯA› ї m˜УJqНџЏ $#гMЊЌ“ђ1шБМˆMуžtПЃ cl> endobj 457 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F36 6 0 R /F24 5 0 R /F27 77 0 R /F28 86 0 R /F25 87 0 R /F1 107 0 R /F30 42 0 R /F35 43 0 R /F34 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 463 0 obj << /Length 464 0 R /Filter /FlateDecode >> stream xкЅWmл6 ў~_іђ­0ЋzЕьюS‹Е@7Да`-аu€ы.F;А{љї#E)qzIзu8рЬH”D>|HQbЦсOЬ„TЌфffЙbВPГеіъХтъщ+egB3Ѕ‹йт:Ј.ъO™PЬ21Я…2ћеЋОйЭэ\ЩЬЯs%D6Œnl†БY ?У€фйЊлю\п ]‹ <ыЎщЛѕЎhkыљчХo3c™*Э,–UJ†oч…Ъ`ЙkW~@ЅЇЏ„™ С*cаА<­‘’IЃТš?њюІw[вVSm]2ceє-e;wnWЃ˜ц:ъэцЙД™яЏЛ~‹ž9њ|u›8оКЭУаD­р)|з~лнlКeƒш gк9l:і.žч‚УсЖA3˜УСcг„J‘…Ѕ№чВЬюpiGƒлю6>j…сЋ8~тИ #4#т0ЯцЙЉЪlБЦ№•2Dk?њЈs[?њ>€xLЭs=ЌбВЪF\Ќ…ЂЎAhккѕ5iдўЖqшN˜ей№Яїw­\-Dе/ћ~ьB0ЬjC†ЅНёрЧцЯ‚хpўx@ЙШоћ:т§d Ёб#IqУGœ#Hђб5_УЈ :P|ук6џАnЦж?LЗAš:щ™€Цд:yŒ{%Cb„ ЫсзСrпЗОіЋЎ—рy,ђњ4=XЌ’ъ˜Є2&it &ч­JЮ[ЅQ0ш† 9QъqZ№яL3УЅ”fhРЅLГ |HР0ƒqD+RшAD†‡ЙcФh 9€rtc Иь‡ІН‰IЅNUц$0_“гЦP|h6ЋЇюЛі‚cFЎC3|glTŒЭЛжчw‡єрŸдˆUHi№iZџGd *™рvЗтBTДeœЋGQQ)йQHѕ[ХBC†>M[{,šeцл„-Э#ЃРkяVцš6ЙkЦ5…Љ2`фi”аYCyъ–ƒя)—BuФcаРІpЄУНh№љлwјыЯЙрeіœЦЈтРžФ3љНпCa‚ђф6љ‡9ЬИЭу€s”yyХMіК=W ыК‰lO(йsyOhIЇ˜дp4ћ|Uшщ…ыЧЧЈ :ђnHз!їrOќWю)>! мжZоР?сHeЂд7jYYј)/ёГ`FUј)+NЈЪJ$~ЂˆŽрœІŸGJИњˆЋЙHДqГI™!jМUuBЭkЗЛžvу‰‰y5ЙUю~.Vvœœ0ВЪž3|‰ a1!№™I2Д Ј'ј#˜яќЏ2‚‰PА"Э љэ‰QХЌ)1r—š(ЭLuО‡в†Ÿвг„…ЩG mЅЮBŽгаWЮЇV s х!{.i †а›˜:ђ˜:цpN[>+Г~ѕЭrŸЮџбТ чкдqЎaЯюЊ‡нЌћ!\–"в^—ІЭІ№j7:’ЎћnK:Л‹fHФЌВгyy)И‚ЇDcv([2ЁN›ипњоБЈЙXёNP„z9E1ФЋŠ?sЩ™ЁDЃеXhй„юSџ6Œ˜П8\cЃКmкPIЅ&‚НoFЗмxRя]{Ej~L*ФИ`… БФОГ‰лЄoX‡њБC#ВE3Ї(^XаS€ЈемзћоŸAМLй”tЏ[pс@9ћ$"eнГ3?+V–˜х–YUœlˆ]юЧП?‰Яxa@~dЁ2П‚Agп4m%ˆю>N|Hc_ќЫЙg4 К G•š† лѕ›=ОDА~Х—‘IЯЅš^D‚гЗї;(фЧ–С№x4mГ |ХУЪ­Л?ކuћ-ў_ž^bЃЕqУ.пЛu“*0ўlт[ћЛЫoS•йНz0LйФKMšЅФ6Ÿr>tDUК=p}TГФифХы‹ў„—тБЛАР@x|uћ!ežп=#?JЉ.BЩ+Ы’J/qюъхтъ @Yendstream endobj 464 0 obj 1535 endobj 462 0 obj << /Type /Page /Contents 463 0 R /Resources 461 0 R /MediaBox [0 0 595.273 841.887] /Parent 444 0 R >> endobj 461 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F35 43 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 467 0 obj << /Length 468 0 R /Filter /FlateDecode >> stream xкVKoу6ОчOдЗв€Ѕˆ‰R{iЖ9и`бm€nДLЧBѕ0$:л§їсPЖДVЗEрˆgОс<љ*?ОтIЇzЅ‹LЎЪццЇч›л™Ў8‹4]=я=чѓюіXжУ:JЙdwяёЋиЏнЉн}Nв/љЩ ‹шєЅЉZ8рИь?){yrіˆдwы?ŸЩWБRЉз№ЁjžœqїЕ†пlщКпoрj’y§з7Гpsp}Еѕ86„‚oЦуцgCјъ†`yGXѓ BўƒAMoшwПзLc2 БoŠ,ИƒƒЅщ§.e;ћV™ нјг }ИlOfэˆ2…{Ѕcј‰$VB†TР d№ ЏНipУйБюм@KT„ч2юЬ‘АnOd7оŸыGЪЗЉ сљКW 7њЭЪ.)u0 х Хj6nЛОЗУ‘тЖнбKx’.|Ч{gqў‘ЪtЈ FђЋmЃWйоPрBр‰Q+,ІС”ћ`тЮЖєHЃыŽ’`VБ…ŠГ$ŸеЋK0Ір‘OЕ{‚/—DЙЃ"љPwЦ]ŠіmO]*Л[ћZЕ"–‰šUѓ $HzOЅїУ#МщЙeаYшGНŠš…bOз”wСяSuсUлнџЌн_ |ьТГIчE(?CзxZ Ђв\F_P„ЪЩB!qх3Я.™ˆЛI& Ѕ} їYР<2ES…2‘|f}Ш‘ Џѕк8х3­ѓ^XАLЪXs˜0Š_РЅЏ‰ГР̘“]ЎMЯЮ9…ыYеѓ–х"NрiЇ–a  sf‰Šцш,Vг$a)†ц#ЄФcч<6уЦU MŠ( JQиЕ€сT†NРЧђ1НZтю&?юlЈъNИъGwЈЇЈqЄ бЮ єЫ,ŽОщСљеh ‹1@рЬa:WZkkL!ј< УЈ_uє5­ЉП6lшщ€К]ЕиИ Ÿ•Ё§8Г­m ђ4V…Р‰‰Ca,(В’o~~ОљѓGАendstream endobj 468 0 obj 1254 endobj 466 0 obj << /Type /Page /Contents 467 0 R /Resources 465 0 R /MediaBox [0 0 595.273 841.887] /Parent 469 0 R >> endobj 465 0 obj << /Font << /F35 43 0 R /F15 7 0 R /F27 77 0 R /F25 87 0 R /F28 86 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 472 0 obj << /Length 473 0 R /Filter /FlateDecode >> stream xк3T0BCcK=#KsKS=SS…ф\.Ї.}7CSCC=KSS…4АЪ”h CCЭи/.з.и endstream endobj 473 0 obj 66 endobj 471 0 obj << /Type /Page /Contents 472 0 R /Resources 470 0 R /MediaBox [0 0 595.273 841.887] /Parent 469 0 R >> endobj 470 0 obj << /Font << /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 476 0 obj << /Length 477 0 R /Filter /FlateDecode >> stream xкеVMуDзЙ№rЃ#pow›@ь@кмX$:qЯФ’лГ;љїT%Юlg'B„rˆэ.ПЊzUЏЪtAрG†тZБ…b3Э›ннwЋЛWo_0Еб‹е}А\5ПЁяЗі0ЙaYq­ЫпW?ТI% ІD‹ŸкНГС@ЁС= nл~я _НЁrAС™”В’KЏ­Жэ/1ƒ6KІбЩ SЈqуfhзЫ ]2šЖЮ_h4єxу]ТйћЅШЖ]w."ДЩ?ŸћgBb ХФVПўlЇm!LAАaйъОЂЃw„Š ?D6>ЇСЖ[ФЈцbQQ…PЃƒp—•  ­}ІЧxн%к•3к№ВвD _ нt6y№уШа A5ъя#Ццqxяќ,Fџц‡ЖыВпъluf›ј,ђх+4‹{|\юЯGЗїQO1сY­Fœ8 Њ1ЃЙЦ‚bЭbŒ.+JGoSœ(--\ЫwЙa˜ТFЋд0ЁИ† Нѓ7Х&"hъуу Д]„іЗщБ“яЫpч М8NСњ‡m“Œ›~ч’‹MзnœЂј›3&Cˆ66Чш[бBБz=Аь%чI“В†)fѕEŠэњ№FуКдЯЉнчЙкћВљЧЙŸќѕI 9гЏ#ЃPŠ3ЃTдXi NЁb:ъїX`ОЦBъ$oJ8 ‹“FlР`CX:џВMЂh2X?ЅN"3‹Šж 3Rb чСђѓ2”с щЉ %РГH™ШФ–яќЦ%qСеМепIЂњ%њУ=КvМFН}‡4šС№‘Шm>…4Умј,$60toЩтXЮ‚№њZ7ч`ЁЯ›Sєъхш!,UЇшoЋННШ eїMxв*ЗЬКмR:`wбѕъ™b4:иСюќ,у\–ѓЪР%ЎыX†oЧёq—T?mэt Gg VЇ їх ЭсЭєЅHуУзЂ€ЬA‘J\і/HKу:ьa…•d ЌыH?-`Ржœm^УаU:їб ЂЌ‹p—ри .ДKЩЋ”Й`Џ 02Ш—dr‚пž;Л’;ћ{ЙГ4ї сјмѓ|ќЬGЄтŸ†ПBѓ@SоР{Ц”ЙЮдО!Бтъ:SцLэ‹хН„ЫC…du’Є7мЛЭдЃвќІmОЪKУgухWGŸ•ЉГч…ЌN;tКЫ3,8i§jtЯ'у|яЫљЫ…Иpфу+ЎNŠЊД:љ|PЯšLbMєKњ2˜РB:лќ{v.ŠЋ_š,•4P!>ФИМ9kіџЩš•ж|&iЎУњ#0еK*О§ЎРjЅслРPvAЊЙNъОШG-ЭCЊљЉЅP§ъUрTI?˜) MwїУъю/є‚ endstream endobj 477 0 obj 1080 endobj 475 0 obj << /Type /Page /Contents 476 0 R /Resources 474 0 R /MediaBox [0 0 595.273 841.887] /Parent 469 0 R >> endobj 474 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F35 43 0 R /F34 5 0 R /F27 77 0 R /F30 42 0 R /F25 87 0 R /F28 86 0 R >> /ProcSet [ /PDF /Text ] >> endobj 480 0 obj << /Length 481 0 R /Filter /FlateDecode >> stream xкЭZ[л6N_њ0ПТh_dlХŠwВEШb[Д})К,t[РБ•ŽQ_В’'“љї=$%‹”Ž,{.Ad,KynќЮwMgќЃ3*(сJЬtС S|Жм^§ыњъыяЉœQJЌ”Гыw~шѕъзьчjžsІВѕ.|n‡j§б]ЫьнОк~3џэњЇЏПg"zзhb,Ÿхд м4їaXВ-ˆ*TГЮKdЪˆ`э€7ЭЮ@e;рa /Ђ1\ЂЧ1˜SЅнEV†(йŒНG&ГФ ж<IЎ&$ж‰ћv‘–MйЅ]Ѕ@fШ™4Ф€mcмн”U‰ЙK2ТЉ™хм€lђ"wQgЁN(f‰0жan ŒЯЉ&’!T{OЋЭ№–No)Т›[3&їШ-ЙA “yхˆ.@7J4DЄB‘‰ђvїѓsgbH€фšХ’™>›чTЉ№Ёсбƒ№ТН#ˆшщaАеƒ%wCР„д:wЩќŽx@= ‡аCH$t8#…PГnа,p8ZŸѕм“J$‰Jт F§у іЧA8(p0CЋЗ5<зI<<ХZhшqJŒ'c/7œу™ˆ )tЈа O*ДС„>БzdФšaФЊ$bѕЉˆН„‡AIљŽік'Т‚0\1‰4Ђ1pѕэp Щ† АcPёK4ТЌ$№LaЈтўш“ЕЮ7eШк”ЛВZlТ—хЂ.П —ЭНŸCЈf{ШђЬd‡:м\TeHєЛ§!Œ/?.–‡Э}јВYяЪU3QНoW\АC…"ЂЅђ™ѓЋzŠќкNRЁF/(‘цW #91TŸ˜ЭnлежuЯsц№­\іUpХў]P•ѕzuЛид˜Е•"RйD:laрTэ Г_1›:Дь)фEІхT†Ds6ыЦ|Рg8›sЮ$д)ЏV7цŒ @!hO3ЎУ1˜ЋhепЩшqрг М –‡M§O<њDkuЃ&CplЇаS;…Цл ~ŸKЃPRLQjеy‘ yСšЩ9ACЮф3№њTra=xцдIƒ%t0%YиE№й Z]ЏпnЪpыр€JвlЙпОП=”(Ћы) ЁЇёрчц№C\%РЂЭ“"іАА{pгѓ5ч4}ПopjxŒ ЬvН[o=фƒЖОю Ћx#d[…d‘-jgCЭГњџЗ‹Ън)ыpcY­eюг$сk“ V­їиЎjc5•+ЛЂ!PФBCBd@?a(vŒ?ЬPаDЯа1P9Ўаэ;†2‡S—lЮj€’@ˆ $ShR˜Ц№Yєі‘Ћ1`V}mgyи›ЙЋащ(mв Г№Цќ[v‰b\œПx/nёvKLѓY aUД†U†^ЂL’>†ŠэPwZ(§;Х^ц:Y@Ёn сЬ3 ‚/‡1MЙєf0OœЖžбвз€s1у%ХЋkзЊ№U%}2УЌQУpи˜gУєБŸ*Іƒзщ‘’Ѕ9Џшy,JщмDœу&#ZшcZFкЎ Й\dNИЁ‘ Q­3]Pј4ТB•Х)‚Аz a_ЯЁЖПƒ @GD,8Ъе!w‚ьжQЈWiФprn9jА„В?а`РQ‹˜ёNјЯ;ЗоkpxЎ˜Ufb:Ни­АrŸEkє‰œђ‰к3щИъВ№Ÿх­ъл­Ѓ4E(„рГу)юЯ*м„4k+$tЫрTmn%!;ёіI‘2Ъзe(Р|ё,`цmyИй{ZЙЊнš-6›НЋšяТW_ЙЙ‹Uy(+`a‹ƒ#FЙжЩŒи•ЛТb‚n2ЂкэpЛ[•Uo­Mщy›hэQж OS’a“VŽчqŽЌxВькMТЄЭ~љћдо§ЎƒœНўяПУХbѓЧоКйжaФЭТхƒгКyї­7IYюТзUYУ2ЭЭUИїО*?ЌїЗѕц~nXж,ўCSiј–OЧ%яМбCPм­7MуЂ>мЎюЛЦХ0RlЬI‚ЇК˜hfЗЏ^мФ ЬЙAЩТ›0aуšёaссOGœрŒњA‹њ&ЩЎы“ ћYјоTэA5kдћЭmˆИИ]а=ОЏ%zjлŒвДi№ъ“œ`,ё p†c#Dю„ к\тMiП:Г=Y—FМОЉJ/$іo€–ZиC˜–И†RŸZ"М ”•іQ]ЈІЌ§ QpˆIKПSaРЯ ƒWгъ5ь‡ЧMfiZ—bzRЌћэПuUeг‹HыWB>u€р}дiЉVДVŸješ^;+5ЭˆЮ1‰}Юt$Dі4vaщ:.Ё,\З=kНєэ‰zM Н&+лІ5ЄžКvyШНжždЛьм€g@I—` д‡ѕ2ДЪЅcxƒj9ЭЗ„вх2ФЙќ)кC„ёъ’QТZŸ#ѓ8в%Я?­YЃ=7Ao7йЩЅФ9KsRwЖ+bRzю:§S3GєЬHyZИЪ”ѕюќcC'Bе„о—ТИВг$Vг 3rx>Œ„ўБЅЁЩiв”QXЛИЄK}Fіѓх!•–ZЧКRœ{ђ=t”!hS uP иŽЎе .“ŒŸJ:zYе d5 1”И3о… ље˜юнЋяЎЏэcи[‚,Ђ9Yюк4U9{wEля‡rЋњјыФЊэЏwvhajyс\Ї7Ѕ'6•Z3огаОwM 9огˆњ\fњяPЧ_Є<g\ќБѓњмoЌИЏбE ŒdЎBf†Žo_NеэпS f/ЕДyj ˜ДQПэХ^=jыЧAЎ ЇK‘ Ь˜(vBё8‚фЉ!Чžњ­8—+Žуu2:JйdЮЎ’bˆа)Dф Ђ‚›Ў‹eСуqЩ•я„> @ˆП@ЈOg5>љуbјs‘OƒC0сУУX†~’оvьцgЂš}?н2Іgšѓ­–r3c"дфO а2Ьƒ;хiL6КЧ@Ы> endobj 478 0 obj << /Font << /F15 7 0 R /F24 5 0 R /F27 77 0 R /F30 42 0 R /F1 107 0 R /F25 87 0 R /F28 86 0 R /F31 93 0 R /F36 6 0 R /F38 163 0 R >> /ProcSet [ /PDF /Text ] >> endobj 484 0 obj << /Length 485 0 R /Filter /FlateDecode >> stream xкэYMoлFэй‡цжГz*…F›§f‹R кC/5ŠMƒ2"Г•)WЂэцпїэ.—"-Ъ–ЇэЁ0`ЎИЃнй™73oV4ујЃ™#–1Г\2aфlyqђЭщЩГ—RЭШ2Azvz$OЫ_2RLЬDBf/šbѕn[oч ieЖ>ѓO•]ЯЬŠM]4ЫjўыщїЯ^bТК[g! “ж…еNЯ+|KиьlНZ­чТe7uѓжП2YѕчUбжыЦвйљzUnПŠ ;X4gЫљeЕ Ћў8_h‡џQиЭ,Ыme<зГ1›Ы йNhh˜Ги —y>ЕЉ`JшЮ$Чo7eЫИ“ƒэОœкг†Мнfb;ŠхфОтšУЋ„'љ/ЬR;f РРЄ7u{>e}‘3Ћ ОТ™2љGДў`XL“wAЎEiКuf9p,НЬBсP 2.jѕѓо:œI%!Bи1Вюdt/#˜ƒsЂнŸг”9‰‘QсQoЮ C)ІuZщнž.šYn‡ІщT‘|d.‡ŽћdвНЬ*зэѓй„ О?Rф–Hкn>AbdџЙ4AHLСТ1RкЛ!Iн‰ uXu*Ф cВзџ26ь}иџ6дбиИ7ЃYxЪќŸ1%cМ>2cмRФM(2кD2щh\sІС#їС3:бBJGС](8хžLŸЪљ!X'ух@ 9 )mф+&ЛЈŠ&ŽяСгOэo“Cл~•ƒл$ѓ_ЯЕЮŠеU™ЮL*&XЌeећчєœ)іс1ѓпЙ™љˆL,ИуфлгСa:ЪсQЋabхіs7лTГГъhуNвІИш‰уHЙD›§АTЬс[':*,н#‡х˜bIha‡aљž1=,ѓЕO:Аi;DшmNзktLT)“ онЩ Сѕ3УPФH&.йЎлbiЭГэеE@ћрп›9еvЗˆi(№з1ъ6ю|^lу‹CЉ M„Гc`ŒŒ˜3ƒС'-?2Љ% й$ьWVo7UЕGц^•ы‹I_IЄуёœЉGѓеa"у˜УŒќ_U]ЎŠКЉМKЪїѓ™@;gЬ=>™rв’lЪ””Ћ{oI™?2ь7“ІTк< і)пУDехUD?Д$А$!C)ёшwŠўzтxєУ9Z2NОYЃ1Я§Аnƒ›,WДiдН,™wKК~Щ№вВdkvЦЂ"JкџюыEYжm}эћъi”џ§jлmВЊџ˜У\U|пo WlЃЖHЄZћњdЉXыгЉ‚{R™$‰.”› ЈКT‰Ч2}—x„ЕЈЊx8;Bzx<Ф!4Юѕуњ?zWp”@J!Щў‚e‚‚K–чyO:вРeайeскf ёZ1л+нљ—WœTS•ёуяЯwнT}]—нeђQБєsчq.Fб”мy{žPAйrНйT‹xN*)хлKя€lн”§§Qу—СF8е›pЖj3ŽŒˆк)вцЭGЈрФŒAђг^’2Ь u_iонfЈУwI aB*fи*З‰Д-јœёu œLЂЩžˆ)жЖх‘hчŽam#'—E„ ~ДuяОPwпд™c ЮдvуЈAЇ‰ЪЖ:BэЛж;дFъ;ћ=В…П• Гh1ь‡‘фјG†‚шВ”чЪЇ+ІЄNijыT—[HtЁяžЄњъAК'AeїЙhЪ(Дй•s’]#/ЁЗ($b’Ј–Ё$aАz7w"c(Z’bмЏ;QСTЭЎмляЎšaQы…mЪxцv{Ї§Ёї9‹аЁкWŠѕT†AЊW6‘‰aЙ§МГЖAƒщМЕ9гFм{ыЕџІХB‰JtщоŒMgЙВ[`i€оДx3Б_фz`ŠtŸ.ёЧь‘3ђ3 %OІсд“Ч]П­†цРB)к—kяјЌњtYWЭ\Hў нџRQVmЕЙЈ›ј+УD 4Ј=Qльѕ”šф/ДшвМь—dмSELXyxЅ§{[d—k9М3{>нУAƒІўНJЈ$РœvрžтJŽ^%G&ЂЩJтсЉ<эBB˜Н3}Ÿ{л);RОЏlNтюa.Й•~sL™„6е%"Б |ЁнzєR„Г\vдaйЭoУDlF’}>(я…&ъˆ@кЬщЮћйЧєЭyЈ“п%ФЂќжЇТ/ЗШЦcZдS)ђ)uSV]&Ф(+Юр*сЭЊBVдDйwнTшЎДЬŠеь",МsЫѕХхІо†Є€1T­Й  jт ˜Д1 РОќo‚_єщU…ЛАqоьZœЁ^mŸЁт#9ы )>Е`ЄкИ Ў"ќЊ•‡Аь„dўпFе@endstream endobj 485 0 obj 1828 endobj 483 0 obj << /Type /Page /Contents 484 0 R /Resources 482 0 R /MediaBox [0 0 595.273 841.887] /Parent 469 0 R >> endobj 482 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F27 77 0 R /F28 86 0 R /F1 107 0 R /F25 87 0 R /F30 42 0 R /F36 6 0 R /F24 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 488 0 obj << /Length 489 0 R /Filter /FlateDecode >> stream xкЕX[oу6n_S §ћbt_d by'еEи.:@ћд‡ (аюŠ­LиR*+3ЭПпй”L'ng"™<:<Зя\ШVlХ$#\Ў „kБкьoОЛНљњР#•RЋл{OyЛ§Ејb§ŸлП~УTВ‡7+тўја 0ыŠh]м&^Цѕ"3Д\Ї8з.gAIOѓeжX w9„z‡Г,‡Љ/Еœ5ЗЮ7RЅБV2!ЋтпНыRоЙ_—J–Dћ Н#ы€T›ьЌЁ…ж‹x^•tЉЬЬMWœЪЅЯрхTp­ь+і’’PЎЏМNиL 95@ьШўžХŸ3 zЉ8Ё”'UDšbлжoћ.Ь ш10vњЎЅЯOr Wщ; 9!-…ёуHc ЙБUбт~шїц§`›?Ъˆvпр9чІЮIІ1žLcqкЌг9ѓilŽ'˜?“KьDх РІЏqъl!A“~>т,бЅмCU!з§>M8ўBСbиFCTСЙB Цez1у$Д–5Ї)gбаMyjsЎWзˆЙˆ6№0{нz:kНŠ#M;‚‡ЊpnИ@F?šЙЎEІ›P ›Џsљї3Ќ§gх i\1ДАхЊ‹{Žэ&ІІДŸї<юуЇP`ВsЕУїb†>ЎuDŸл:ЁяшŽei~Ÿ.ЎЋЬ…ћ4lиљ}к,@И™5‹u6•Т„< ‘pХdЮБnѓX—щ 8N~˜(xе2Z}q…„ш(­§џT’edљдЁD[ЦХ?sбT2›8$ќР‘ьм%‰e/_Ž\ŸFЎ*Xцњt0Ÿ•№Ф(*\Ž#ЕгА$УRWпЕЛі0њŽЪ0Ljў>З‡fLЎшВ“:Mу&^VтYO{HЦUЁкoO% KгXЩ/И”˜YMSєsЦ %h3г‚јlbЧO. уЧdєпм4Nё§ŸdvtБl1> endobj 486 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F24 5 0 R /F27 77 0 R /F28 86 0 R /F34 5 0 R /F31 93 0 R /F25 87 0 R /F1 107 0 R >> /ProcSet [ /PDF /Text ] >> endobj 492 0 obj << /Length 493 0 R /Filter /FlateDecode >> stream xкнZKмИЮ^Н—ф’K.}ГйцВјцЮa =,xШfaMЗЦ#`І5‘д;ыŸ")ЊХћБуФHж‹MжѓЋЏШХАА–H M9aŠ/жЏОЛyѕэ5ШБR.nюќШ›Эп‹ПіЫ•PЂx,—ЬŸТУэrХtQ…‡юОYтгѓ6<іїЅџ ЧЛaD[}lЋЎЋ›aШSй–U_Е]ј#•tљ›яПНfz"SšpeAЪ?-W 4ЎэG&Т‚ТjˆГAXЇlЋАРІюњЖОнѕеЦ§zБтГbБA„aѕКi7ѕіуrХ™,њЦ]UQ†Ыл~ЗЉЖNб>МчєjЙ_<з§НЛгGI”Фм†œNXЂ„Оџ&ЇgИ XPдЫBrG‚j pыЎn­шB.dQwюъЛDЮHФq*­.Tѕ…т4QХ@фWwЈФ, е‚[ Š и<ь†Чц.\Уw‘и8$v/ьДuщёЫE Ч‚у€MЭ6`КŸЃ™ЮхzdjКjI),  вSлм–ЗѕCн/™Х87ЗЂ jќuЖ5”'КыvхУCn.!ˆБтє\œХХо @‚)rЕ f^ЌW™‰АіЫ˜xTКZB–+Ieqsя …Є9`ЧЗїх№й›Ш3ївi ™„фЪШS(Ы}ТX4KjН]*ЛВD$Ф‚хе(ыЁN{яЛ2§ЁowеыPdwUxtQчЎуи‘Г„2KWZe…R>žнЕ|шšpїфйвX`нЋо’ћыо}XЗu_ЏЫ‡зсѕ^В Ѓ˜Њ:Кёz–‹(Ѕ6Sєљ,ќЬ‡ЃЄzR юкцqа1а?Y\зеjЯМ4W ѓzЛ­6ек—{i‰•4‘Xс7—rЛ 7GˆhC,РIІeсбbˆ‘ь€hЁ$žh…Ѕ]ЖpйREQ@єс6фƒЁmWoЃДŠ]йзн`†v ‚'‘zWЎћІ§ЂДО 7D pa./вт|MN}D>b№uN?N`DЄъ—uUmКАœтО~ЌКb\$ ЬЋІх АLY†jЂvŠљe~hњ*GЈиЈV‚Ы=ѕзЦ(ыїъЛ7ѕЖŠl-џMЮ‘™ŸЮ}>;фe•0Ѓ›EŒ5“фx3gАŒц™щoѓ#ЅЏЇ˜’њ|U.+ъSЃ9sA% ШїЛйA†EI%lK8(ХЦ(щH&#6 ФќŽa2^М[Zl'\pVє>ЋДœv—sPЧœА<Ћ}'ФMHPМ–]З{єѓрƒ'Sў.ДАœЧиЧWIђхЊ-В2­ћs†*пшŒ‘уxŠXž‰–Уъ86КШ45НСЙy"ШŠbМЁ$кЗПЧ$СИХNˆ…GуЋЁ7Ь`ŽЧЊьvmДмЉ Ў7{ŽOЫhЊЯYFЃаг–#њoлєCU‘Q$эчњbпш!уXбО‰ху`€ЛXљЛюЪ6` ŠXЎcš(Й2љоHМ hїЫƒСџѕIЈM‚> FыL(LцA_cgЮI0-s“Д\ Ђ˜rYgёcоЯцЁ„Л*„&1: ˆIX1дjЄœZ2М€ Ьѓl!CИ:ыhl\ЬдбGъ;BТиUцCЪdVJ€"4IЖ#,@Tєї9ПSќ§ ~žьKЭa[J—Б–'А˜’<ь˜„pоŒЃ.Ў*›MZ˜ѓС_.ИФйрRчƒЫ\\p\иђ?§Џ‡˜>bьпbrЊz› 1Ѓхџ~Н,Фў;‚ыЇ ƒыAЮЉ|q І[\й82 €pЋЮmqiљж …Ћй‰р› щ„/ј0ьЙН•ЯnѓР“Nз Ні›гДЈ<„~ГЏйР’Ў Š.x3'†ŽгџЕ6„mА‘Yр`жУќqр@ЩЦрШыžЊЯN˜AїH“tЎШЗWcЁЦ€О^Л•сš%Bކ›їMЁмf4•ў6З-EлКSHю!ЦѕX‡у‚—Ё6ЁЧ—Ч_У^Н4_§хц(ЄšкК\СЮ #H ЗжСЁ5‹ЖZмН‚сДВSЧКФђЩyпоœёДя 1єъs’xХ('’К­‰эшЌ/а9с;яr„ЌєЁЮ.вq›-оfVЇDZЇ D{—ѓ5ŠmЂ2ѕс–лІ.?6лАх& ВЖў%мЧ65Хшю*зaX`B~JnmŠИ‡{‚Eї9Щrc„gЄАŸчrЬВђКќ№ RщЬlЎN›NЧŽLЧ“щц„K6žЭх–SсЂГ‡‚•ушсЬ сЖйЄPno5%X{&S% }ˆЕ_Lv€XЛНВŠяТi№ЙWЪ&КW"i„o ф —­П8šћ€МA=У š=>"FёS^HЃб%WŒX’Wƒ?›В—ьпj %Ч“ Ђ4wzŒA0%щ/‘ј`Ю•–ФP•Ш8эЪp~ёK9y пцR яудd+@'зЬЙ(Туик_А!ДЭќ}&ˆYHd2Tvž‰g=оSЏіё,s|8`k…Y)8<i‰зПЉЗѓendstream endobj 493 0 obj 2397 endobj 491 0 obj << /Type /Page /Contents 492 0 R /Resources 490 0 R /MediaBox [0 0 595.273 841.887] /Parent 494 0 R >> endobj 490 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F30 42 0 R /F1 107 0 R /F25 87 0 R /F31 93 0 R /F28 86 0 R /F36 6 0 R /F34 5 0 R /F24 5 0 R /F38 163 0 R >> /ProcSet [ /PDF /Text ] >> endobj 497 0 obj << /Length 498 0 R /Filter /FlateDecode >> stream xк­WЩŽлFЭy.љ€\xЄ€ЈЭоI9и€ч8pŽP5"Ђ!'$х%_ŸWНHф g1ш fwuїЋЊWKѓ$У'\q&Jl&™02Y_=П8{rЮuТ9+ДN.ЖNєbѓ!НиU‹Ѕф:§Да*-ї‡Њїпэvёёт—'чТŽvYЮr%Тж.шФВТвВfТšdЩ™-Є3g(fЅHN2?-–миДЂљё4ž1ЋѓёqсЦ‰"9›œV6›™;…`8=юѓ™S &2ж$иД †јМ6­і{џg‡‘н0леeГЎ–ы–„ЧS$ЄвЋrшъ/ю`ƒ•Š@11L` ˜Rк]ОnЏЎCЕY,…•ю6aс—§Ї8=Чщ„ЧЏџ™щЬk#Г‘6,mл§оe’Я~ЋOe$4 {–]ѓ'вXЇ›КG[(šY0žJИ…ЪAЗЅ‚СіPЬ‚т]ІПuэeW^]еЭeи“(&)ўн6Щ™(NлwEњ{u zЪK‰”rнЕ%]W›f „У„d&7ЃКэNкЏчaеЕаЅЉ‚u(#ћOАT ы}ЙкWOчВЋeJj@ЇЂтЩђ}›ЕRŸПЌ›ѓz h{‡" 9OпЛ•О\ЙLпФСѓАђіDдiаЩrƒТЅa‚~hЈ.јbU_юH‘ѓѲ{ЈZvо•нЩАЗU[rЋaB$_В)ѕ(хўИЉ]vдюѕZЊ‡ЕЬsp7ДщgЃ~fЄŸЙЁЩ2ЦЭд]Grд Š­пw]‚ЇеPuНЗ81ч|d$.T8Э>Ъ>я>М\1іfѕ1'~ЯfDЄоиˆ иѕЮіE}[вFЏўžы­Q&RВоЦVдУ8"BБђц\К.†ц4ѓ w)$чoЪ<ѕњиWо #ЌЃёbJ!ŒБŠžš]3N)$Rї~?fћzйуЦУОtЮEЦ@HюlЉlЮM|9ќь“UЎendstream endobj 498 0 obj 1523 endobj 496 0 obj << /Type /Page /Contents 497 0 R /Resources 495 0 R /MediaBox [0 0 595.273 841.887] /Parent 494 0 R >> endobj 495 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F25 87 0 R /F28 86 0 R /F30 42 0 R /F34 5 0 R /F37 5 0 R /F35 43 0 R /F24 5 0 R /F31 93 0 R >> /ProcSet [ /PDF /Text ] >> endobj 501 0 obj << /Length 502 0 R /Filter /FlateDecode >> stream xк­WYoлF~їKџ‚)РZяЩУAšЖZ4AыЊ*Œ8ДИ’YHЄЪУ‰QєПwfgWІdЪq€Т€Еч›љцкb’ –Хr’pХdЌ&ЫэйлљйХ•J&B3ЅуЩ|хNЮ‹ЌФLNgBH§жч›В›*=Ng*1QНТ_нrЁЛщЧљЯWТLШ7†ЄЬЄd"ŽЌљНТ\GЛМЩЗЖГM‹sѕ­-hЇЋiЅГmчGсЃП \ІŽ;юОЁЪkсжђЦЏ­›КпС0ŽDYбNNSРnf…Хo+86 ж`ЖжЄ5@&б#ЪH"{IFЊc#&Є?ўИГNАLq} j~mзsg™"њtдиeн€nŠЇqє­…Cd$ў6vниЖ-ыŠ>ўї9†q‹DХ\D—$ъjSчнаž/оDзЖ-  “D=фM™WK;|HСЕќВЬяkЛZ•ЫвVNsОзМ@GoЫ*яМђќFю9xфЛтЏОэа“Јъ!ŽЅGгЯаx6Šv5i!^ФZав @‚Кх†лЯЛM^BР\4žKXˆ—с‘WоїтœшxпKxшŸЊЮЎmр‚Ы=јшnлvАmKEН%-e6eЖ*оŒфЂaУP…|Ф<†ИvщЂЄJЗЛоŒЫw>л(цВ WѕfSуЦЇВZг^лпAšuРG„g Е‡&>ОЩ#ЅЪ—Ÿ(HѕЭ9ЭЭ2п,=‰ПмнјбћбbПЗия…‘—%Fh‘Љa&Э<юЊ†є‘"‰њ гўўГхњээ|y˜…O†Єђs„2m&БМОЪў?_$@FПŸSHœ&B-J€›Вф˜ˆЩс№i œб #Ž‚ЈЌ Ь(x†ЭCbё Ђ›@cРЬЧ{СLŽ^’.PˆБtижOW^EWќывХDзŽi—*ІypБxzшЯUЬb–9P1Uб ўШшaj ЫmzЇ*Ь‰ ГUƒeSкТвАрмB?ХyNЮђPУšеЗ”рБєRbI-–``6pнˆЉZУѕ"ѕкП1/fТПЯHтќОDƒbх ђe\Х"кbіиqћŽњ1}Uд•љeˆ^ыƒаpІХaЎя4эЙЮ*aR‰У4ЂИŽсћc(cЦCYNŽ’yLRЦ$,ЦJ‡Щ˜ЋлЏЌ љЂjQЕ№Ѕ#LЧ‚L(Щ(Kћ(“™Џі2УD՘@юСЭ~q›wMљЧtФ5џEUuГХЋŽCЕ>Ъж0ЬrŸlэњІЂжcыIžЕžƒ†RБkjчяЅ-zи`_Ў;аЅ|с1G…'~Б№˜зžНЦxцŒ}Xoі–A:cхsŽйвЕWЪ№pA…эУвф%ФУЬ<,Њ#Iа5§Ъ˜:Р2eћЃД2OŠпmМт{e‡WщРL2.ї€_Шšчо{-1љt•ЇeЊžQФ YІ'"qЩчВ,ЫPџTЦв, OŸФ=|\ЧЖ5Нx фж@m{тБoЅд„kљњщ˜‰pз’бЦoюН&нгDљ7Яˆ;аQ…‚Z€JЗBщeпЌЪюD ­.hЋ(сЕбеЭ#с‘_NтqСxкЯќзwyw?‚3SF0xF+ьД JK—& рN=У"СНГчgџ†Зendstream endobj 502 0 obj 1282 endobj 500 0 obj << /Type /Page /Contents 501 0 R /Resources 499 0 R /MediaBox [0 0 595.273 841.887] /Parent 494 0 R >> endobj 499 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F35 43 0 R /F30 42 0 R /F34 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 505 0 obj << /Length 506 0 R /Filter /FlateDecode >> stream xк­XMoм6эЉџ…\іVmk1ќE)E ZЃ.к hм|Р‰­ЄЕьJ[Ik'§ѕсPZЩІ.Zˆ(j–Оy3ѓhБр№O,„T,сzaИb2V‹|{ђътфљ™2 1Х‹‹Е5Н(.˜1L,C!Є ўЌ—JwK%‚ВКОС—О,–Ё2:иTu™Е8Ž‚ЖМnЫЎЋšzљщт—чgB/„`ЉжДr(%qlзџНmЎлlKvjj6ф,ыГ]жyŒСХT;Ын2”&(лuгn;GASв`Sf]OУюЏ}.вЫG.";Џ‚fMS™3ыл *“Рр1Oa˜ш ЫѓІ-BєhјАќ А(ЂГUѕ5р!у oм=ССКйl\ѕnД)СЃ{сBF,ц рf˜J]ћУ2д" ^вуеGЎ9‡џОЋрЛЩД8L‹Мї€ЦЃдm‘и-.альwDЈьЫ_UpЛD„ѓОБя€U]арvЉ•ЖЪъМ s{>˜Š†)2кf}[}І• 4 РД%„ЬНх€ЊaZЇTmНЪ7№Ћ‚0ЫК'ЂѕcЕ}k=F@^" <АР|o7тГИѕoжKД~;XŸ†‡_CаLL‚c9МФAžm6 Ю[ОцeБ‡У?<‹аšХrHƒ_ЋњЌъ={Ћ˜ЅB:+p4Š8bZгюyГнэћвэйNСя+№‡ћ@ KС‡L!ЁаnіхS_#;Џsтм‹—>b&f>_гЃhьжCŠGГ?€wљехљ'4n`іе%ЗSrфњеЅј4ЁyМПѓ†JЄLi5sјuгc™Аe§0ЊАDŒкХ‰8и"ЛїЖœРчUz)šк­фІ‰иvНЭx9?~<јJ &ЂШ…ѕђњЂь|бУPrЩшР=%yЗ•‹Бщ$є ЮПщї№мэПqEVš)cЩb5PЬчEє7юЛ- vйК,J(“о5MЪ’t8о™gIЁ—ƒ-ИІЃГлС O‚М&ў&€†ŽчUOvгt˜X9ћUЖЊ6MЧ/№Sѕ|8я›нMцЫ; ~<­p/ДўО;џБшяы d‘7СКmЖєœЫvЖТ*ЉЭ<…‚C5фёМFчФѕ!/Юы[ŠdЕ Г‹ЇAHпф)=] КYЮ4 \жиЃ>ЌŒу™g;aлjpžPVыљО.ѕЧйљ>OЌЅ ъZГ‡шУPЅAwг tw}!ЄqОfmQ§mY3аыЋbŸmКS4UЖлnш“mЮ№ФxH*PIRЙ;ІШda:Ж^hfАє а ”x•‹ŸJHЯxqАљЪGvЩ=ؘ+'!‡пЫЃŽ#sТ2•Ш‰#V<м*‚Ж;ьєђ™пйTщCУALяА‰ћќVZ0iцкШЛ(ц­p‹V6Ј 4ЛОЭ` 1^MђuЖ $§Nч8Gр(R”ž§ёдzqАaаAц}ЁЭoћЭшšРqВЈ@)VЋ§ш&iCЊЧF†тJŽЁNц€ѓОWƒ~Е …r0ЎХcЈ s­КB4*vщћЛeгъњвъ 3юœX_yХК‘ŒЋФ/жUЌB0ИГ*гŠoу<‡Y'сq8Jx|q‡ЖЃС3sfS OhC—4I2ƒaTІ~.mЃбвљƒ1ZHePЇЗUF…мг'Бљ <|і€‡1‹Qw8цKR(ѓЉ˜№аžhъOГъЪіTОT€VЭЃyЁ˜'ЗдсїЄ-žЕуЉRк0ЎъЁЗ&LнЃjF]lr-№$b‰ŠшПK\>%ЦГ&™o†œЗуБ›юFN)шqтдšv 9nЎ TVхXєš HІ§№›n;nд—ЛŽ†™{оU§Э=ћ] Œhіn}ЇѕO=7ТЋќœ—;лС­‰ЃЙь|w)шv‡бЛG/pqцi> endobj 503 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F28 86 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 509 0 obj << /Length 510 0 R /Filter /FlateDecode >> stream xкХXKoлFFЏОє/№HЁс†ћ^h-’CЊCЂZЂ#Љ’Tџћ~ћ MJЋXM >PфЮЮ|ѓž1MrќбФPR(–(Ц‰T<йю~\пН}ЯxТбF'ыGGЙоўžўД+Cе­2ЎuJхъѕЯ8ЩDA ŽтУi?дћКЉJGeвЎњдU}_З/›эxсšхkЧЎn6ѕБм{ж›іpФ/–ЖMеЌxžіЛФхrџдзНх№і=• x)=ФL Т ЯoНQ&M7+ІгЖ`yК­њMW?Ќ2|ЏбАЋќaзž€я§[iяўЕ’\яЫ‡} Њ/ŸЯх3Щ ЯM0дњу‡rиE` ќт#еc0Ќ Йх–*s–‚$aB%DщЎŽF}cЭЄвЃSЇн?5эЁvVdrizYг{ъ™Еёъ­mя[k3уЌэшНЕIPW$TFGsѓ‚HцбPIш*Ѓ”ёѓрsžN ‡>ž Ђ@k:Б ŒXњKл|<ˆДњѓTрpХёŒЊFЧWМОPўаBEяя§yнп{fLߘQS+ –œ(юQ=E„DHМј}Œ#Жёe„!&gсќЛJДЂрсs ‰&…чŠ Ђ ю‘Ђ 7EђLsUвe—ДФnФѓk*}/+хK–pAA8Ўp—ўоU]pЏЭиK]ƒ…ГkTХLЊ(Ђ$›ЋRGUa†ЯT)˘$Šрu9DИ ФЉ ъf[љ Ћ№ЋБЩ>x5|qщj[\|ž%™$Я‚Ё8{ŽjfhzЈ†]ы8mэ‡iE‹”Т˜r–Ћ 8Г?ЧЄ$rА їmѓЩK)ћрiИ@O+›70АєazЖKIыŸР;nd~+ыАНЬ#м ˜АчёнчђpФyы9z†@fлітЫШЗБ8ІhAХЋљBл•”$FŒ љеK’zaIЂ/-IьlI:УйЊ/юYWЗДu^МАќdЯDЏБ§ќZќ‹„вТвнН[п§8jendstream endobj 510 0 obj 1330 endobj 508 0 obj << /Type /Page /Contents 509 0 R /Resources 507 0 R /MediaBox [0 0 595.273 841.887] /Parent 494 0 R >> endobj 507 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F35 43 0 R /F34 5 0 R /F37 5 0 R /F27 77 0 R /F25 87 0 R /F30 42 0 R /F28 86 0 R /F24 5 0 R /F1 107 0 R >> /ProcSet [ /PDF /Text ] >> endobj 513 0 obj << /Length 514 0 R /Filter /FlateDecode >> stream xкНZKл6n/=ьЁ§ >ЪHФˆo2E Є@Д‡^К( 4=hm9+@ЖЖ’œtџ}‡ЩЂLљ‘нb™Ђ‡УofО/2ј‡˜aDиBfAЋэЭ/З7ЏоQx‡‘ц|qЛБ3oз'?,џЙ§эе;ЬGярIQџўнR‘Єо7eб,SJDв№мОv?#rє3)•кџю1"W#Ц•џSD&ˆю'ф ЉŒјї/b0’ћ wiщ_Зх.&і ˜Ÿђ_t4г—ЊАА(ЃxЄCŠ…LHD!ˆ`uFЊ˜иЊвУѕ­YHИ ЧтRB8"œ-РЬHIћЋ_A?ЪYвюWK"“{їm•ЗEћžNКћТ вd›wMщечЉA)тьХќ-C˜їЌмЌ—ЫzЙvzу>wuГЭ+ї\ќЛЯЛВоЕБЅ%ьї’пФ–f`:ёIњЄV$Tь'#ѕЊ‹C”j;хчˆ 0Йт‹є0)BJЅBT‰E :1Ц]ьж&ъ˜‡ƒ№d;эђн’ЈЄs#ЭsБъъ&Њ>GXђўЈбњ4‡ œ@ZдI˜@ЭВЬ(brТПиЈ9т`h,­œ›ZV‚љт”й1бqpuvШЄ/‹iФ‘ {Ч1ФіuРƒ gя€іN@E$5• z“цф\tи<ќTГБфdЭІa№]ЬmИ!I:йšеc}ЄiLЇJ4иP&Сˆщg–|`ЩsРђЏ ьМN)†’ŠУYе+U”^;(GяbƒЧ6†МХdР_QgHшsŒLМ{Њ‰uр)*юГ˘ЙАОЮм IvЙѕСмQ=ЦfX9 ‹нс@yLxЇ†ШcьU†(<Ї"C™зьЭ}Ыгє-žJпђ }‡žФ }sЬ@ЧjƒB|Ш}пEЄ(8АЫ]ДŒ­С, ‡I—Ўs†Ѕц]ИŒИ0gSСJ№С™PZTб0?`L™1KcJр/i цчЯe}…iBœЁа cvyКєIТ/uŠє9џрg§CГЙ”ћ зјH@ъоУОDhуIZ„Ъ“чO2›I‹X*}ь;зэDЫT0хлѓЭФСЖ}ыЫі­hRя*#ސОЕD“їpЦiкЮVхЮћžуhb•їГVuЕпюмГkUІхwЎWіыШ|g˜r ˆsэйсHП+ OЕTи“ўxЛ:"Їƒož9РŠѕASM$5<5­,ќ№˜7CGnН_k'фЮlхб_~м—›Ўм}@>*ЅбlљGС[2пp hФ€Р›]^=ЖжcЄяbK ­)mƒђxя™q?[0yo}›лЕ%aUь›Ёя”ЪфОЎж~'Жг67uUYг|§нЛmmСZ—ЦVЮЏ^ЧЮцPн™дFdzњкЈ/VЌ‹џЊœkэмo>}ЇГ…5E;^BЈ›&‡јЧ2х ўŸmвкˆ2‹шЭ%jФМїЙGъ}ЦГx+‰‘>>D0C/эЏО‰ƒЁ‡Ь„aгvŸС!т0ч*№cЭ" ЄЬB№Ї—p№"qЄ†K‘Јmфд6Žx5}?„ТяuWєБ–wІ‰˜["Cв"ЦжыВ+нХŽ ШЮ хЛЬ|Е=ƒ,OЎУюЌу)Ё&„5З*Э ГgŽдљТ|рYOбПљ™нђgѕч л§8{8†Оэ™vТx>ŸNcёу’ѓž§л wAж*bїы8SАЈgС Бѓ?#š"A@б;hЩЦљSМэk.ЊЪ”К˜F|ѓііSa‹З”sj^/Ю”5‹ІXlnpџ' УLЊ†ћ?ZtЪžЭСт.Ь„й0ёŒ РmЂр9 Ў9э].?Zв€+сФ&”Й€е›/“Qh§Мь4Є_$x€/Ѕ;‚™фЅЧqBUЙЧнcзEst6†ztJчHDК‚!JJЧя?КуQ{Œ3№WгqыиД^м˘ˊбeЋуx ЅVбxZ_; l&„e ЅQFфщПИм”„ІжЇ:ЙлwN*TЙ~a—Ј)‰›ІЈ\)щShŠУЋЄ•+ ‹яWeБ3хoƒCБ;dщ&ЊўZЇПєЮЋOfћЙ­Љ=эљ+юvHyШЅ<‚Сќ†c5R>L0ЩzїџšŽЎendstream endobj 514 0 obj 2141 endobj 512 0 obj << /Type /Page /Contents 513 0 R /Resources 511 0 R /MediaBox [0 0 595.273 841.887] /Parent 494 0 R >> endobj 511 0 obj << /Font << /F30 42 0 R /F15 7 0 R /F27 77 0 R /F24 5 0 R /F31 93 0 R /F1 107 0 R /F25 87 0 R /F28 86 0 R /F37 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 517 0 obj << /Length 518 0 R /Filter /FlateDecode >> stream xкЅXKуDF‰Ч?№ GТНюЗi‘БNHŒрHxlЯФKbЖГЫў{ЊКк‰=щdЁеЌюrНКъЋЊцIџxтг‚'6—L™Tћ›ono^Мт:сœ9­“л{Oy[џ–ўаm2щxКп›vSЛkЛІp1O‡цahЦБэЛ/6™ЪM:mк9Œ }зпoўИ§ёХ+aЬЙЫYЮy1 Xц,юkfrž(&Ѕѓ‚(V :Іr‘d'Ђ}ЙEњŽФоm2а7шАoЧ]Sжmї@Ъ…ЭЊ )#а “>zN=Ирn‡ЌрЧдуSЇх0ЕПч\UmЙлНЃЕЖЋ†ІєBсуv \оlДі‡А~7ляeд†Џї§0йе ‰nр­лРвфЯƒЦЦk |QЖхP”‘i?аѓ0[x-щБmЖMи­ё\z&юоu§La›L+оn ‘і'Кх *н UПпMлжЫTi=xŸНН++Єќы‹ˆЊ8jqЦ"gмЬaRжЏуддРдЊДBсЎZp€)ž еo~ПnІfиЗ]9AtFТGpЧxnяSь€‚ЇиПBˆдДмv НЌПŒФsЦ!•И†p”Š9їžЈvв,ЃZGŠ,gpаIfYсQН`≈ŸФч%ъkSNЄ2_;аIŒќ Т+МСяЙЮc\ИdЙk.ы|^ryЖс+EГвЇѓLЪ№ˆ(ЭЌvр‚МАžЌ‹шы˜QъЙF{!7пноˆм0ю №ОfZ‚ƒ-Sи0 ‹C“мп№€ŸGЪТG]):ш3МьЯЧРь0_ P„вLТљg\a  ИfœЩMЦЙщOCSЕˆЬ”sZ<–CЙЧд#~Щ‘/+БЛE,Nž`ЄЋš ђ2…‹–0Жœ†іŸHs#™фsєќ;Щ №7 h P’ЧƒЯvсDZŽєl;zz й–".€k  ™ў0Ъ№Es/œ›qъ‰—d™ ЛЦ‡ Йў|eœŠ`ЦиФяірљЁ­X‚Уќћx ƒшзД-Ї/ci Щ ˜ЪД"љ$нХЌеcрYЗхCп•;Њ$ЛdŸ*ж'Е@'уC#уЬ:IgеЦФ#f›dA5†Т8ыВŒ'Zёб)ЬЂ ЌнЭ™АsˆЩ”Кѓqfг–фC=тЪLHЧrЉР™€с€žчL ъ~”-ќ)е%Ђт…ЙюPЕrшыИ ТКЇ•цЄO,'Ѕ ЕžмŠ=Юж/ЙUЎм ТЪЎŽ0S`Љš+f`*7Oyљ#ЪЈх’PB‹b2G ‚UА?7ЋрПн†–Ћъ‡ЁйQЅїёЭ–pj0іbіKЫ„xRДŠEбV?чp8фљyДŸ№ыдвХ[РlВ ЋЭe]ЬћuЩ™.–™ї2"O@1VжатП…%жHьo—и у ‘@ѕсJФjф‰Rr8zqš2 њ9˜:%ђя™=юр‰` !aKш4%Џзнџ€_Ћя ЬDjсФgјч5єФvŽњ'uкLјƒЦ&ї=дБNЋcюяЪ;˜ЊЦЩWы‹іГЭ№84гЅўu]ЋПЧУоwєЪч{9с›"ˆР%гкњPюFњY ДuHЖЂ11Х=ййœ„DЄЁЂŒPРю|ŒŸїѓeIIЃ „ЎŠ№YвЃы‡=b'dи‰M‘ЂР†-эiОЄян БzyЖ2R… M~№ЧЯгaЖ–бo[XЪљ9–UP›AМу+ŽћбŽO0.ѕ•–BГТ.њtTe=ЛЧ‘,чщЗ}‡ѓ&итё”mЩЊf ŠЛ›‡[шs#W.К<­Ќчa(ь.1\РF Ѕ€C44ъЄR-J)eњg5Д>р>Чп"48џF“CтЬЕ§ейhRЌЅ\TЇvœЯ$ NцЩДJfФLк§(zЭрxrbOЕwйžЂїCПЧ7>зd™ОjGЇГŸЛІn*?uУтYЁфq8—Ѓњш,šg(ш„’!ш№эBаiЩ„“WКXА-П6mbюs9ŠѓщE.ДNFš+Сn™сіJА/х>/жQ›9жUnгя§ƒПiојџФэv(•ЮСИmcqe €9s5АŠ%ШЧK§РК8/ж‹ђ˜ „СOцрј4:;э т1‚ЮlE…O’BЛџoЫЫ3ўvŽCqfNі‡<Х k>‹\  FћЫ0SAƒШБЁ`" VњМJ]?QџЗэwЏкиѕ#0rК8 А(вЏЂwDЬˆyю,Vпy­Хњк‹ХЎC}џuуTкД[Њщ5нR- лћJћЏxгцx,GЮЦЎcзхвnD д КЕсRЏюЁЯ,=ДЛ"НяЛp™kгБн?њыMи ђЮ‹lю5­‡ %C]`д,p…y*CЁ™rаФA Y„[.Žз0џŸТŒ4endstream endobj 518 0 obj 1910 endobj 516 0 obj << /Type /Page /Contents 517 0 R /Resources 515 0 R /MediaBox [0 0 595.273 841.887] /Parent 519 0 R >> endobj 515 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F25 87 0 R /F24 5 0 R /F28 86 0 R /F30 42 0 R /F37 5 0 R /F1 107 0 R /F31 93 0 R >> /ProcSet [ /PDF /Text ] >> endobj 522 0 obj << /Length 523 0 R /Filter /FlateDecode >> stream xк­XYoлF~їKџ‚) кp/}Ћ›m‘ДЌц@šZ\YD)в]’vв_п™%%ЪЋЦцrИЧп|3+Оˆс/И,‹ѕ"%‰\lі—ы‹чЏdКрŠI•,ж[7u]~ŠИfœ%ЫчBDom{c‹§Оjn–ŸзП=Хѕ‚s–kMKVB0%rЗpН3Ы•iДmыК]Š,КЧe JЂnИЖэаWщHPXу8ёnЉUTTuq]›щ ФSІЄ†г2&cщNћСO;жF™єfМъWUџWЌуЯ–+Эyєб=Uєњк dєч8ј§ЎА~јsлtkcї~ЭЅ_ѓ6тˆ$fyцмЖvЙ<†f nИЧІКйЁ…Н)ё[эQ:д+м Ђѕ+ƒТ0Р.}Uƒ› KюБцЦšЎЋк&`/јŸч,еnн‡OЏЏѓ6ёˆ3†f}(ЭЙdR&^ыЊ#Хz jП/z[}ЁqЛЅgе”ц†Yd`фЬыщ „NC4+ ]ї,”Р—ŒaљшЕ щЕ’qЪxžЯмъЩ8'ѕppчмКщбйјŽ*т“Lg вќƒ‚рЩET4e@QkІ’1˜#zjСrЮм‡ЧєИv:ДєП6ECтлВhŒЙЇs+Mo;ЙˆюwеЕпсЋDЧW›ЂЧДСЏ$м*LГ14Ы… Є=6 {G#юќКЩ‘Юр›2™хо”k?ˆ‚х)~W№LAQ–ц”uqРŠЅR,sиrЅ„":РГчћг”Х' wўA'8zаzАІlƒЩƒoU( ИтŒgЉ7т2ј˜ХZљ |З!ŠvЉЧ•эМpЬ‚ѓЧJШЂLј]пŽMзуw`5@†`IŒМІAA§(^{JlёDlWgNN<™р2Эtі€сŽИ-Й-=х6П”тЌПInёЃr"yT”eеУœЂЦUљ+С @‹бWWa,№ј˜ћмјˆчдяGЮОЂj|%yж`†•…-I\šЛЊ№†s†‹ќ„еСяdЕ#ЌcќЕзБTнД Vју 2rгеЛпЁТ.ыЖі№ЙєsЮсeV’Ў N@НV„r(сLLкАC#OєHRCO[’ЂRqдAp†A…rтћz№'—fгюЉ2ДУЩ+ HS”є!ЁШAƒ$ѓdЙІЕ{„žPPќўц!:V3шqqp=8-`ŒЬY–ЋукЋcOы § Бkы’^Јe–†ЧuV$=˜Žъ†аtВ’AЦЩУrЊИ+lю˜оџ5ЖEтNгшзžDуTѓ‹M7Ю,œиi€­-6фU|sиVо œНŽ0]OвIл1лzE [HФlg|~`ТCzЛЃкАœŽpBi Eы!љнrч§iђФЇЩЃЩ#‘<ъ)ЩCDLh#єIU%Иkž<И%%zњ€ ”ЯТ’чŒЁЩгќЖ}|ƒўТмјбЗ\ˆн&4\OщШН}ѕзІнW.гљXšFBї›іAеrв_ ЃB­eЦјЊџгkиhj•ЯtЉp…гщ#Кщљ^ЎŸJRŸ˜Щdu5ЕЪ№qућV[V ѕœ( ыСuЪ5в(д<–M:qЮ”Є*>Йѓь&Рл=<Ј“'њ~Љ~ ХЧДTЇ<_Р#–ъ’а~ œЕP(}F кX3ЖT~ЋcпЭ›k86EЪ— Шюх?mнхBjщ8[У§ Јkє-IкЦјСжж64МЕ‹)‹w<цбvhˆїеx9чMбя^ZЂІ”‰l 5њнL9fЩ–р/!а<јНћxKХA .Mwі—хYУ XєЧпЁвЎX’ŒQmI“І%5&;мl‹х7bрl—Љ'”К џJ3ЋЃZ“ѓї=eмиђрxjyhJхЫHЛju\аO€ђ”цЩ“ЈМЈіa>I~ЮŒТкb }јW’—ео4нЁч.лбВ~2{ƒй9|хр" UјТЇ[,?]М\_ќј›уeendstream endobj 523 0 obj 1574 endobj 521 0 obj << /Type /Page /Contents 522 0 R /Resources 520 0 R /MediaBox [0 0 595.273 841.887] /Parent 519 0 R >> endobj 520 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F30 42 0 R /F35 43 0 R /F27 77 0 R /F25 87 0 R >> /ProcSet [ /PDF /Text ] >> endobj 526 0 obj << /Length 527 0 R /Filter /FlateDecode >> stream xкЭYKуИNrьCn{їQжŒј&'˜Уf&‡`t€`“4Жк­mѕJђЬv~}ЊX”LЕhOOCа@[)ВXЏО*ёU |х8ѓFЌl)™0rЕ=о§сўюw?JЕт– ЎWїaц§юзLЌ7œ Y|шšгЖyЊыДВиЖЧ'И*‹іTŸжR>зEuЊЯ}гЏџuџ'XдЎИbRZt#<ѓ\LK3Х§cнvЯєHРAD­Чw“Ѕ яР4иХыbп9М*књMХƒлwA, BёoЗЬPr ˆŸEвЖ:ъиƒ№‚d7Љь’IИ"qž7жК,vh^lёёCК }F €-&ЭxЈЖЫьƒШ'јѕ}ЊэаvЙХ;oВѕFIизЃ3‚ƒŽ/†3V]MЭiWoH-€ыŒ+ѕЂIrg˜4сЁ0ЯЇ‹wG(IMˆФТКДm‹’I(ўЗў њ~^;!Ѕ$:пЈвУ1їmз GМuE?Th2 }ЧpХЫ+›Ќч'stнT†B6э о…#ЋЁk~ЩИ›їŒы,џ’3žb^Œы'€a Рп*)5S)SХ3сœc4рo2+С•7’—ЬMшŸЧЮКE„QуЙУuОрЄ­ЧjШmІ4„4Ÿ+$ @I™P…ЭЇœD%ѓЅ^%ГаKMЧнG/ ‚Шч~Лm.NoDdlПрѓ†Щq‘””цjjЬeFа”w7ГУ,36Yt.EМъДЃ№јЪоЦ0Ѓ§ыїЮщ@bЖ7…а"Чœ‰БЦіуLQ7{в'‰w8O”!ЕК3Ќ]ьЛE&0Ь —§6cP1ˆ_Ўў^Z™.'^Ем“Xь•ФђнBџxFŸ •4С40ЋЫ$„Ф=ищbWoЛКъ›гžюлnWw#&ђ ПW‘ˆqЌoCб”EЪQ№FƒbЫЧУi[c*Kr(C.ž6ЌЬ˜00“x‹~дt4Џ?*Y3‡jСW*&>I‹Ас‡…b 4Gч <–В Ъ lн1 ~Г№Сœ™ёлœПъЗ‚y6bыM›оŠg†TеTџ|&X$јЫэЕevтhЧ< щ“М кќk‹ŒP‹ФhIТŠ™бbіэЖЋ}ML—"ЭiGЊО'ќм6˜™щ!eNМš2чь№BEЬщF2яG#lh1„‰ХЈ-м+Ї-`’ ПЩ[*‡Мѓr а/-оfеHцХЄіЈdp>ˆЕ п?фBГВђ.~:^O‘$Œ›’-(5и Ÿ%ј ЌŽd GкЌрWЮп’•r< И“pхE‚YZE1ri'^вЊ]ЄUaЉўoвjtЗLѕbznV ѓђ%—PЁRv*йёМo@5Ч€—АЌ–Фгƒ~ФxъCињб?GXгhд‘6p 79тt>(; вљЏ1™К+ф9ы(ЊJ‰ќˆ:57ШфˆЎ2vNоцXРaѕ<2fТHШ\Љ‰?-rXи˜@VЭљЇм§ёўHŠo„E•х(2„“р8]НzИуБ!u™Њ=d;?ЕЄfв–ЏIѓзН"Ф€GPНƒVFЅŒC в{sАХРШя8J%QiZХлЉУ›n†ЎК™„8Маœ>V8јПЮ•ƒ(Б03WУх‘.Up яЄ0…p5МЩA“EОMР`4ёŸГе.Гv”рmnЁд—~ЪСь†[ЯœBжž eЌНъ.‡><Š §SДљкPвЖУлФ.хaШic–эС$csŠг=Xћ0•Л—\.„=д?&xU<•k2%йyœк™4щхЉТŠŽ"јя‹н<Г\чъЖЁ†X)щўUОѕSGф˜Ѓ{˜i/k|Ѓ bf z^Јќ ‚]@ЂЩDљИКЦ!Пф§B|Y}=ШјЖ(`Ю>fЏљиk}5зЈ)УхHГS7рцбОaЇЎžљЛ)ŽuuŠЬqЬГ§—UяvѕчfЌЮ“˜ИF$!ХO=ƒœD(Ж~I$г0™Z‰щСЮкF†xХЕ,тU|деЛѓ–ЂTОhŒ‡ёЧъТНh=–єU еŒёяiшЫcsˆ Lм}lqЅГЄ–šИK›Ча0ўМŽтh…8XОАЦдQ ЂdT.3ЮНОœЭг{щxт'бBh&хМwї>ЙЂ8Ж=š8чЖъыЕуMјксxqhŽ Upи&”Œ№?’ЭŽЈц3]9žш nКњЉЋћK#ШХ^!^–ˆЕSе!УѕД ў7Ц‹vРН„/g†Цв Ќњ>М&ˆдгk]§аvёхјЈяЄРa&~їСЁSН?ЏБ[ьђуeвЛХЊ7q—`юt­щRx˜ 6Џк{Ѕhхдkѓi*Ј mиАсЫnnдŽJТЇ_0PЌŠѕGd,=‹2Л/uѓъ ЎBгyжY6d[5\0ˆ)/=lЇqэ.ш”Џ.п`р•sO~%jЎшЇЋїрY="[jэ1}ёCz~ъ‡КкЭkя Bч” =еБF%чќР мT[Жн№*†} K4џЎёw‚j^‡СHѓFiМЦ2nyТѕXцK*А X‚П|Pёƒъ‡Ўнw帘Џ]r_UБ а цСІ,5М0ƒœ?vэyhN#НšђND>tЋц€V|Cпœf Šu,t\Є.ђGТ№Л> endobj 524 0 obj << /Font << /F34 5 0 R /F37 5 0 R /F15 7 0 R /F27 77 0 R /F24 5 0 R /F25 87 0 R /F30 42 0 R /F28 86 0 R /F36 6 0 R /F1 107 0 R /F29 133 0 R >> /ProcSet [ /PDF /Text ] >> endobj 530 0 obj << /Length 531 0 R /Filter /FlateDecode >> stream xкеXMoлFНћаўi кю'wй[ъФ@ƒ8 lеœф@S”ET"]’rтп™§ H‡Ђхм жrIюЬЮ{ѓf–lFсЭ˜d„Ы™І‚№XЬВэЩ‹“пЮмc$QjЖXй'ЫЯбЏЇ_ярžънƒ‘ўўuž]фiљ…*њщещ\1НПЕ§э"њ№ж~xO2З&ЌЂ)їЋfеі~зцЭщœ3Еы&к‚%7ѕpЪu”gmUљ'&Ќuё™‚|1;”jфlЮ$‘Rй7VuЕ= GлД­‹я#&bEт.Ÿ>ПП%Фя–EцЃDУBю=тюЧ}ЮŒpЬlЮ%aJ Те›=ьќяе!(Д$FЩi(š6-—iНtгЫќЁHлЂ*›1O5#JiПое42&’1GќspŒэ‰кm <їыY>сh’O&!4  ]ŒЌR|TN “TyЈWYКЩЏгz$ЕDРUюqхW]љп›јrъ8Сзє№EыK7~8U*Jы"НнфcЯУŠ}дn^Š(jМ?э$qОр Њ‹ЛЂL7xѕМ7LBFk6A†>\ЏzЖ$Ѕ–Э8УtЬ'8 KxŸa№ђ™Ÿѕ@^мО€tћТЋщтФqˆбеOqт+vœА„№]Є-P№Ќz˜bсˆКШшњК$ ‘1›bŸоc\fљ<Ћ09ћS.ЖaЅ>ы*„0„ЪЯuа #ШЩAБM2$чџYŠџИЋ/ђhœUuoзž=щЙ<Жр„ЋЉQЁ”Р Г+[ъу„:[С•IXюrЂхO4бЪ ј0Ќ„1§А]vсф€ƒfШСiи2оЉаѕЯ #BГ—!ѕёь5btщщ'fњ§Я6”_T?џ>но.Sџќ™ŸМЬК+цїЕ^Uѕ`1?%ЂћК(ГbюБёЏѕБЙGEчЦX^и…Њ2/‘§­›OAѓ›љb  ЌмЌу L ycєa0ИЂ„wI|љ|IРхП­‹ YЛЫрЦ2oккВсб&ъ’ŒVDмЏj“`ФКтђaщxКA yи!ƒ|юVЉŠ( Жщїb‹яЖnЂє№џжУшn` ёЗg}AВзNЋњkжЙ‡7‘DШa•ћwТBhРЌкРZ.kрштчз~ц]šUЗ…oѓv]YќлHш&ЗO&Рš:НЋгћ5^Ци"Y 0|ZЌ]y ƒичХЃ–KсЭUHёФJšuоюъЦЋЂtЗЇЯуЂSc—GSнmbЈ“=Ы”іБDK=С~ž…Ф1”ФZ6о їT97Љ-dеfЗ-w@тя„žjmїшьU‘ХФнЉз<бвF~кьFЪ‡тe6АKЇЋ1Є•щЪ‰‹Д('^ЬSiРИ8Šџ’^bї$rkSЅЫЂМk‚ф{ЮNŸЯ>GZ|љ›eE^>щZі}ъ ‡Б}ЊBcN;О9cі}›WНУ•івyVZЅ™ƒ<ЌсQvЌkѕ\ExQЇїlžЇ(ћєц˜ƒ|Јч‡JПnu…т@ŸїмF2oі†l &њl:СБДƒ ;;ЉЈ? Р ЄbЯ:DLДЬМ5GTwђЗŒљœБcШ[—ћ1ьK№ ŸЪ„зh*yшBЯŽщ>fs# Hk gcдY{НТ‚5—1tBј#"ˆЩЦMД•›-4И‰Xœ˜fmљrИа­EЋ]™йL)kg”Ъ}—Й~[HCК#ƒъЦ9ƒѓЕЮzххКAи†У/ еfуввн5py]лbФ;€џћHR1 Xр >&Ђtlлќз?#лx˜ XnСnY=ёHEЮЁ,лš-ЧП–$ќХН<љ 4#=qBxїe 8жuФi]ЇЇPЊнќВицeућ<Рњ ”Uл5ЧF{=цКf„НиёUyV•c|–„ нѓœЯ9–sзЪ< ї~ЪqU{ЎКчQrB'‚зЁНyЙЖл^Кь>Й%N/#ы;O@яQŸ…?т5ЛлКкЕE™ьг^;я‘Ш@ЮМђQJLCЎ&ФPюŽ:ŠˆS~.Ђ7љБа6#ЁYк6#Ѓ–ЫмИL_И,\юп+ц;IЮЃWъК:˜qл!ч~јьgU$q .}aB—WE;т~$ ‚ёqЉXдVс=л˜ЖGЁн'šХGT“бOŒP4уЁ.ьэсе> endobj 528 0 obj << /Font << /F30 42 0 R /F35 43 0 R /F15 7 0 R /F34 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 534 0 obj << /Length 535 0 R /Filter /FlateDecode >> stream xк•XлŽдFЭ3П—yУpЧ}ѓФCY $VŒа"X$эйБфБ'О,ЏOUWлcя4ЛD+­эvЙК.ЇNU_№ЧW1gI(VQ ™х*;џZі{‡}BLЁніђ4ž›&b…Ѓ/P`J˜‚ЈњVЅ( ЖЁWжya€Л F#рrЛжкKл2нVEї”Єг,kкМЌo№Q{}CЫ§О ›]SUЭZ $zјиC^žЙR, bШN+ژѕqэkЎРpsyљ9аAџ8>KяЩl™Ÿ–У‹іЎцRšЄФ(%&)q.%яшRо•Єы|Gu.Ѕ№#ЈФxJђjCŠМ<эSŠ$žдѕM[фc6lœщrHћЖќцCGкfљЪaX09­ѓ…о[LQ‘СЦнadЬl:ЮU‡Œkaп3˜а‹@ШœЩX.}>ІPnE_Дфј-bŒ6Ї@ŒЦр”\~f`4a–!Y†0/В*ЕAŒМДsaэ””D“ЏЪУcціхSЬh`Њ гќм8,J>xkЖЧ>Ь>xJ[|{(є,@2ёŽ–‘р!єВДЊdŒыІ2Г"РU 4№aЄxQіŽНU`юHЪ™sуdb%оxхж#C–№1ѓШŠcщзdmжŽCoи |"J€eИё-HB Бе昀/СcJуЧ лj(КŸфŒB Ћђ5•єГєШЉH‘Ѕ№zI—М1цp\Њљн7e§Ѓ—хŽ>џГЉЛMб№it7ћnd_>НОІЯFћђ)И&xUWм+ %ы‚нфо›ћнУ~`^Ь=”‹xџ`у;ЫO&гп\ЯЈшю …pљЙM)&cйW 8ёЯ&Ё№цpйєСЁхьг~М+;Мёdz.„иMcoшzzНЅІEyS[Mvbf_a=™f„oЉЂТW””œq5ВпЛтfStЎR№GAb<1gМРЫкr„5OfxІЗЭŽжпїУиqл!fŠ9Щ еXo.+bр”xСёЈЖ.€›жЉ8‘і“ Wп,Sп0 :mmлvDн)rТLr\‡ dшйОщ лг ілt ЃPyќю~15u–?Њу>u‘@.…ЖИЧwв?tгЬqšG†:Cuдvms d\zœК’fƒ`и„xёйl2Њ…Бv^зЗ”ШЛТ…];BŽ%ъѕ­щЦ–“qёМйPq\8іБ™mФэFѓ}Ё)qb пЕЯxj&Д^”хз}сЎ ˜Рƒnуў.Фа'X:I\hЙT%T…hTšSzёІ6Œ`Іl[їm‡o„Љ1”ШYУv ЂЂb3}?Д5ЂXщ`ФŽС/CЭw‘€Л/‡ќњU(ЈЈP.ч%,CфЭГqI= PjдDЛ}ƒF~эшM? ]aMaџз”$ЌР)ЂЬ‡Д2ƒК’fъЎl'nшŠЈq0‚ˆс№5UМ-KУМ”D„Ш0<‹2ДДЁ–#!T§IцГРlšBО8,ёa†LФџ6dЩ†ŒO2fb?пJ1=Э‹_нЦ&г`ec:Ћ‹ЅнЦ0гј=NЅH’м*-; 4% Е&‘Ъ r"ЧХ.xVMюСBЇрMЙŽ†шЕ^dB!ђОгц€ЗЁš ёё@yйСмЛ&3чСcBQ“EЈ-/8рѓх8UУa™ц>}вLMТ#05Y4зW}@ѓŽ ЄeX˜Nй~^Š@ЭјЊNћСАШJРяЧякЂ2гEЗ/ШBрљEUг“ |tž ЉІUДDънгWŽuњOсаЏ#БШb9ѕ)z2B,Чіzgї{QєЭy> 'p?F”ХŠа*kt oшЬпt] Ч{BMф] ;тaF&‘M%JNЇ PŒŒUeMЯЫtќ9eх'1S‘\xhœrьЩрнЖ+Z:цДbO€r>fРгrn’ю\ˆ˜ћо\7ЩpVЩ!tS Ћј$шз–Ѕp3?šHРБЃhО№ёgйlaWУN<џцюј'˜њЧЂE_с&(Dtѓ8Žщw3ЁёнЃП6ўЙXт0endstream endobj 535 0 obj 1767 endobj 533 0 obj << /Type /Page /Contents 534 0 R /Resources 532 0 R /MediaBox [0 0 595.273 841.887] /Parent 519 0 R >> endobj 532 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F28 86 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 538 0 obj << /Length 539 0 R /Filter /FlateDecode >> stream xк­WKo7Оћа§:Ў‹сs zˆ;MQ>јЂэ–hyбеЎВ?ў}f8ЄДkЏˆ\>чёЭЬGБр№ !ЫЙYd\1™ЊХzwrvuђцBe Ё™вщтъЦ/Нкќ“У`еr%„”ЩхRЩЄЉыfWкjЙR™LZЗm]з•MНќяъЯ7Т,„`…1tЪJJ&вдŸuй6лжюhЏг“\‡+сФ=\ТіЖ›92уL2,н/W2K\{гДЛњ*M,6ЦЯфcYЅвIхlзгВюы`Anњј— нГхJs\н:Ь’Ўo‡u?Д…X€2–)t4гšjnpO–єИ;ћ !|˜ЄьАЭ“Л%HткGZв•ЛВВmии`›Цr8Рн•ЭабpSЛSшŠїeћфЎ >l#Aш”–OФ$+§& шlјŒ'RУИRСМмvЦ"gкЄa #№Р4йWv з<–ѕ–n№’*j›Ъб”л0•&5nvј|9]yЗ4:БmiЏ+єж+’ƒƒYЎ"ˆ>пŸЫ.5Ky>’‘wс\hИrІ ?ћ‡kНѕЕ?Tш=Q КАЙCнКoкAO™ШЃ ПЬYP@Lda‡‰фIэмЦmЈяqїtpƒЃ.љцР"&БерТ>яћУш”ѕЦќєМ…ћ€a0QС‹ 8ш820Њ+$@Д^ЃŠ€6U˜ˆ!<ьо+пЂ7 я(Џ ЬЦ ЩДŒv~˜7Ъcл6мВnvћЁG+рзЕЧ]ѓT˜apš„@ПRœzЪ*Эа—Е›K>рr)‚(—MuQі3Ћ”"Ў Ј1K35MШ хзѕхšrHўЦF<“ї№лЋŽЃъјUЧўЮй:ЌF_c{3дыўr'к(.Y‘gGuПрui`mи”p?Хƒ6L=AJYSHЎQЖ[ЛяcЌdHЦЯЌЁ3>Ъ‹)$ЩЊщЛiФ,t|ікузzh)iвюh ?eЋЪgцЧэxdю†ы—ННŠbŽ4Л„э`вKщ‚Iˆn_iЈ-W1БмрЭp[’ihВьB^Д]ч-)пSjЄйl,Ћ_wmšЄŽmїvNяЧ кЬWr”ё(“4ѓŠaЪќB#oБбЩEеиž’ЗїЃ†FпMJEЯЕл–[B2Хѕѓ‘ѕшЄпБUyўкS?;Ѕ‹ЁІрЕяB >? ’жЛGЌ2Цu1Q•ќЉhЌ2ј"Ѓ@С 0ы6Ё’?MжєBЧDє Œ‚XёПiЈXutKнєt-€ГAрогИнlМLФ•@‚`EšKРЁРŠ3VНїiU‹<Й™--:g‚›ƒА/‚V1žъ#h3ССXОа`}W„‚‘ЪTj HhBНПa'ВуZЏ‚ѓЁуЏB™хL™(юй …œz(„”{rNiud™[iЂhŽ‚ФRГ­škЂ5щЄœБ г”зBncЉжGvЋ"ЛmЁю•{r–ђ zYXФзћw>veї нЭОCw ‚pрАkлЛЎ‰ю*ІГyЖЋsуљ4ћЃш:зAt,“uЌџ~ќ КпфЃєйЙШр}9‰џH05qЯБ•WХX?АЛ}хЕџћ^г–›Жйa–Z~ЙЬЅЯЅ0ќзМG?~>џыгљi0W:ЦQ.˜Œ0‚Е&ёzx>ЄЁnйОьњђы~[ЮA+ 3к;ЁУеа•n№‘ъпєxn§Ћ 9жIУ p+0 Џ5€ф§Жmˆ|%:)`уЈ§шˆеVЭ№vžЙj‹+УЇ(r9Ђ сЎБЄ‡BsЈŸ єCg{Їj‡TЦ4Арqžќu>ђrгнSpO5 —OЎџЖѕ&NзG\­=!бЂэлђћє6СГ‰ССdг–PL|˜хљрЏf.#ЗLt\щБўAHўˆ’ юКi[WйXИ‘uR`§В.CИ„ќž$§‘ѕК:ђј€)'M_+п\џ рЎмЂ|љ„DњЙvendstream endobj 539 0 obj 1700 endobj 537 0 obj << /Type /Page /Contents 538 0 R /Resources 536 0 R /MediaBox [0 0 595.273 841.887] /Parent 519 0 R >> endobj 536 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F36 6 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 542 0 obj << /Length 543 0 R /Filter /FlateDecode >> stream xк­TMoл0 НчВПрЫ˜нјл>nРŠaзхЖэ :J,РБЩiзПGQNтЕР6 “т‡јEІбП4jл$oыЈофIVхQw\}кЎююsивЄ-ЫhЛїžлнwёn§sћѕю>-olš<иПшCПŽѓM):c­фЄЭшјD§вnbёagPгџOыЌJdЉФд+Œе=ЪДB<ЎЫBHЋхУ м:kХSЏ;Šэ9@ZХЩ‘ТЊ˜ EQqZ$EQњтіЦЛd•ЭФ‚wъ„bPЄ‘вM q?fŒq†d›іŸ˜јиыИЈ21™№%|$(}рћ­r8{\E[Я.Й$ёхЃ.D…4'ЋЧNŸˆRїВ›ŒuЌ%9>ГђРрlTОРQеMjGЌхТ!Ёb<“” ЋNVЙ™oџnv“#ЛЅ)пГСьY Н„Ї™И‘i@‹FтЖ%"ё7ѓс•fqpЖxYЙ||ФlЈƒq”zžCєШпKК›ДА.Д"`3Џt0љ&O`ыяоы(ўІuЄђ$чB;іGk08дtхРož'п/шOzъYbhœъŒч€(†№Вч{sЖ> P/˜G grІgТ8Н(†EаCW†щ§jЛ{й­ПqкќЇE~ љ–RЈJ‹Œ)%— :‚aP‘@Ўэƒ}†ПBя[УЬСЊЯ БфБТї-дЫь“тzУOšƒ{IUчѓСQ­<ђx?EљМ>qxvg9€Wр9g<|5ѕЬWг„; \љjъ?F ЗхC хгюУЪа#ЇЋд‘OуŽц‹xAОЌ›ъQ›Гуз\чaђƒЅe•dYс†&i+о/iV“qѕyЛњ Ќр+endstream endobj 543 0 obj 688 endobj 541 0 obj << /Type /Page /Contents 542 0 R /Resources 540 0 R /MediaBox [0 0 595.273 841.887] /Parent 544 0 R >> endobj 540 0 obj << /Font << /F30 42 0 R /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 547 0 obj << /Length 548 0 R /Filter /FlateDecode >> stream xк3T0BCcK=#KsKS=SS…ф\.Ї.}7CSCC=KSS…4АЪ”h C# Эи/.з.Ž* endstream endobj 548 0 obj 66 endobj 546 0 obj << /Type /Page /Contents 547 0 R /Resources 545 0 R /MediaBox [0 0 595.273 841.887] /Parent 544 0 R >> endobj 545 0 obj << /Font << /F15 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 551 0 obj << /Length 552 0 R /Filter /FlateDecode >> stream xкэXKoу6о^sшoаQЦV\ёMvQ 4‡E[ьСЗnВCЏиR*)›d}‡Щ’Т8ЮcбKжcDПљfц#q’УNFZDŠИ Щzіыђьн9Ё aH*™,7ЮryёwњлЖИьLГШЈ”)‹–рMЦ4R˜9‹ПъjWVІ6љм˜Ж-ыЪкО;Ч<С0ч~дŒ3DДp_.ЗeЛШ#щzAdкЯФN/LЛnЪе"#*5СЈлџВЉЏ:˜1<.`ѓeСyZ”ЛbЕ Fe˜ŸŽч'œЃ\бАЖхЧ?‹nq“„5 V›:јє)ЧЌƒ‰?ћл} оI№tз:T2Ђ%"’'fˆ1ю>Оо–~m—iб{!вjм^—]Аь.нИfнљ']эm`љeу]MБ7V‹'<=_(œжaАВjЛЂZ›рV0›§Ъмd}јœ‡>~ЖК2•ѕГ+‹XУ‡хy€ˆЄТB€n#jФИ яŠ € bDƒТ„PсD"эш–№=C”*gђ&ŒЁ ИъgXнD\€)Єв@еaЫ6 kƒ+ рбƒЏј№ФOD.ш#‹"$GD NХˆЮїяQX4K0№Лї6`ˆ0 Юи‹ cB!cLнмЦ‹D ‰eќJGЩшМwA.Јю}йў Їў'4yv7‘$ЪYџўSЮѓШ qоgb,Ъ очѓћШїрd=ЯоŒBі‘ЁљиW…(WС№;k'ќ„ŸЙ(вL\ЧЁа)*9Ј!|з[г˜ˆg”B •GаС9Ьб'YЯнТrFсЭUЕю†(з› iЧѕ"ЦZ—(ъх1ЪЗP‡†$О ўвЖW{ы–Фр_aгLшєкжž№t zџ$wk†[›Жѓ7ІэЪ}б™ўU”<$З—=}Š`СG5CЖB;‹8%ЅОŠшРВ1@Ѓб ^„рЛУM0‰бp'rMŽЙцжьЂ П>Ъp1э 0цІ Дj™$єU дuSvfVф–ЖИ0мю\Wg­iJО17—EеWn=‰aЉ0Tшл8Пs:№ЛšqіKЙ.ЋВsNŒi =jы“A $ˆБ C5Ц9БI ЯиѓЊŸЎcЪ!j;•ІbєYЃОѕFocѓ`$žЮ3ъˆїЬ3ъˆYŽТ4)/#ЦO(]С$p+џюњЫGmъH]ІгФšLЃЪћХМ‰Џж^=”™ЧPЕ™IЦЈњм „ФёU0іq|Х#ё]Х\Њ—С—L•Ф<Œ”ŠянZх…ШУјвЃјЮЛƒ–hŠR8Є'?ДЪЈ"aхУEђШTT0ЮdQџЇp!Ї —Sѓ#оЙzЃ‡;зlИxчъžвЙ"uZ Фrmе” ђђеo~ šыбшS$ `Šн ƒбЯаN™чСйяЫ3иљ ,­Fч œАА( t@TЋЄ1Щц ‡Ж5…mЖеѕРі\ікr"оѓб<1Зіо%P4ЏЄ{вaP'L](F9цВN>Ж'ЬЪƒ=ъмНЌsЄS1вeVMй,бDиЪшвфзХNсл*ЮЗж |;U|KЖЩЃl @žЬ6y лфs6‚Гa3 HI=йЮG~Ън“>ДbLР/ ниПсСќ{Utƒдпƒ З(ga“цЮNьNЂ3AЧб“IjвѓoЃтQjzЊИљж:€П$Ч'Hrў*ЩŸ,Щё ’œПJђc’\DKђУ6ќЌы&’Т~МКчў””6я‡Г)qч ђВЉW;ГяЫ›<њ–0vрktЫNДšmйй}yћ! ЈВœРФ:“–§пGЁAOВP9н1-б}ГўБънМendstream endobj 552 0 obj 1440 endobj 550 0 obj << /Type /Page /Contents 551 0 R /Resources 549 0 R /MediaBox [0 0 595.273 841.887] /Parent 544 0 R >> endobj 549 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F35 43 0 R /F27 77 0 R /F31 93 0 R /F28 86 0 R /F34 5 0 R /F30 42 0 R /F25 87 0 R /F24 5 0 R >> /ProcSet [ /PDF /Text ] >> endobj 555 0 obj << /Length 556 0 R /Filter /FlateDecode >> stream xкнZKлШо\}Шo’C8€йюїУ‹ ’ЛЩ:Ш’9ШрHœ"QKJлП>UнMЉ[jdГ‡Р€I5‹неѕјъЋцА…lЦ$#BЫ™Ё‚p-fѓЧWИyѕц{ІfŒЇдьцЮ‹о,ўQ=u›‡ЗWџКyїц{.“чL#ФЌ–šh*НшЇ –Mуw.NuŸУ ƒeqN$W3юˆt^„ЃˆзЬ%”гг˜"ޘу!›i"ŒіC2ЊmRЕ9LЬИ%L­?F)530Ъ(bЈˆqТ‹А "h2‘!ТКй^ц›вbсŽžXG&ЬL!ТцЉпBMС&nVАœL—ЯІЎ%F Eл=ЛЙ7яЩШ—oФ>Л‘вђ5sФ‘nфW5г:\ \ Л‡[ ^Ў™$RъL-›mпІ~\жЗ xЙѕсі3MМ)l0EІJš ”hffJЪ‚ЙD!Ьq2˜уd0ЧЩ  9,8Ё`ННаЛBƒ^\›чSXџЬ)L*ЄА`—Ич\’EgsфX.gуЮKIШQ€n<ќ>ЉˆљLEnDs‘+’1(ТР‘{E.H!~Е,І:kGћ•ьШŸЗЃ>kGћ•ьШŸЗЃ>eG(y€X6ŸCЙ&<ДF%ПТГ‚g(qв”Аэ‹0ЇYVу”PxсВО|­лждsЮЮ…i .–8˜W1B•ћпaЂyYРDPKЩГ(ˆbМ€‰ђГаŽљ˜…`pRЄљuPХ,eQЁГЌ)U0€€c”ЪТ’C=нkpŠБY†№ -фЅЊмА}xlœAы2MЮE7Р2јLb•-D’<#™ћkь‹BНѓ бцщЁкR‘ФВЉ~ž(АVN№иWЕрІк<ФЙ Ы“ЙрNL~~зЬЏ­њлЛŠUЭfш>”тюшdѓзИ‚ЎЦэќ .сзцЁйœЅ0sтѓвъа•LРOPїК\ѕ1Љ‚*ПЛЊ•ЌюJ3ЕЭ$іOЊJ‘,‰RгІ>Љ §Œ)k,),€4Г„5~[ВсR^rіdЪIH8ѕf'єmяуЌA’Шњ|к@ЧЏ$г•“цРœn›`NvЦœзС3Ma*Юa7QЌнЬIЈЅŠЉ‚†Ќ†ЧЬїџ~Н^vѓfгѕз\U§н>)|Д.ЛUл с~hя‡vЃ0ў^њWЧ‡n=FёЖYФлMџЖ\ЯR‚Љ‘Ty!юзм˜4ЦкcФБ,ыГЬq3Ч‰PЏ~[˜ТjНЛ&Ёx„‰§“Ќ„оЩJ’E№Ъъœ\fK(ˆѕT;NУр+mјSQ,шЩ†kgЃРцlВИЊƒоЅF—ўyе_A=uЋ{pw! И еМ†v"Žs[НG9ш‡"]•О<а“qЂ Š=мrщЊn–D€ЧзpБU{ЛlЃ6}ИЮћЧѕv5ЛХ0ƒ„йДCxкŽ›€О‹}БbІmF›rЭafЧV‹1фФZ—зщƒЃJЇї*І …›u34-(=’ЋZШм„'ЖZИM]Э!iУHЏCЛ›…н-pHWл:bг-УЌѓоџяиЊюле<.—Ў8:6‰ywГS)€ЪЮŽ‰рyJ‚CAeЋ*xы!(НcWY-кq>tбEё™п <ћ›­žVaИ‰УхТрM  хЭvылЇMП*олcSјMК™j–ждV?lvŠˆ…D Цe1БЗЭrљоs у ­z  КРэ§ТГUПšРіk0ZїЩ,ђJѓЉўв ?m›aБљЭгНоЎН]э~XДУ„асњи­pЉvт'mЈуі1О‹Тˆ zуƒSЁt аg,ЂвЧ ƒzeсџC u2ЅCЩžlьeЎчPXdHnј‰“@< Šж cџўћб<” jАbFK€ ;ЁЮ5+г,ІтВK вЧj]‘kPЈGЧjЙ:Рф„ џ.wТЦ}О"Я2Е„ФЈЌHr_tz6pPћ)ђТНаŽ0zТŽа1I1щпфф-oŒ-jТк Y™9Јњ†"Х‚Vt Л§ѓЫ(HKp7oЦ3зк˜S0v?4‹Ў]!\mТH@иЄўeмжсSёИ/Ч™p:Љ.~ЮdiMT(mUђЩЉ€К2!сŸJГЋДшР\wлU,нј §юš!юњ xb],ЙEќћ˜!Ўюњх2@Ич ˆ5З,~мgu ’тД…Р‚ЛШИ.EDкю|SX ?Ќи ш–О„nщHЗjц KF—;}ЎK;OўJ •ЛeРM'’hп'€–Uƒ")•ћЊОЩ…ЛшdЪJ-ŒXpћ№ˆ^п.›=УпQKQ'ƒjЧ№RћгЖ{Ѕ ц–m ,qХў`НАR•Т@OўкЌЦЉу J˜ DЦX“‚ь[ЃЄ ‡TwЄKЈJyЅOœћMЛoџ_‡їCINš­ѕаОяњэИSd2Ялhql :~/#ЅП*ћjPЂ­>тЄ2чЄћУЅ"6HH‹iŠ7Р€­ЭС+˜щ,ЩtoТа]уqЮБ7od5v[2=aчфМe|Аи#˜J(Ј!š@' HьЃU‚ѕтa!:ЯКH?)0ўы}‡ ЏП+т&(ЫЯи&=eТ™VHм№ЎY#/П~№ЄcБP \v&€{ЯЦЁd4РдќюiBР…q™эИїуQзlЯЗž/јцѓФS:У> endobj 553 0 obj << /Font << /F15 7 0 R /F24 5 0 R /F1 107 0 R /F27 77 0 R /F25 87 0 R /F30 42 0 R /F28 86 0 R /F31 93 0 R /F36 6 0 R /F38 163 0 R >> /ProcSet [ /PDF /Text ] >> endobj 559 0 obj << /Length 560 0 R /Filter /FlateDecode >> stream xкЭZmлЦічћAО(Э‡RРiГoм]ЖHлˆqZ$‡Aм<‰>ЅЈIХчўњЮь,пЄ=н99;…“Z.їeі™™чžXpј'YЦR)–+&ZЌw/Ў.Оz%в…,KгХе[пѓjѓKrЕ-–+%mвmЙ9фў2ЩЏЫ4MђІЬыuA-eћ—хПЎўўе+i'Уэ˜vБtХ! §мТВЬb/Уœда‡йLљ. u™­Ш2gЭbьѓul:ЫRЅŽqч|Ї—ЋдСџЧ3Š”ё,=™ђт›Ћ a трYЪ4Œ.-гV/8S™[4Хтэ…vzJУДpƒ!gKъ YгŸ<ۘб:<лнQ‡лˆMVi2‹Э˜”Д“wлЂ)"Ѓ)ХЌђўб2f­ ЯЫ–ŽНл†ѓ­—№ыА[J—\/W№баƒ§[КоцMО+КЂi jК#ьі№žM6EХpro6Ў n‚)GијЖƒО.ЅщскveUбэ­{пЖхuUPSЗЧЋNжћнэЁ‹эYЄ–I+ТІЌd:рЌЧХB3Ѕ/2jЅфb5vЪыMd*Љ˜NГ0гЋш8’їЇ} ЯВ$л|‡Ц-њR+nЋ~У…офdh `cђПЊН –”АŠ0аLkуЇИ>€-ЅqxeCЗУћЗMбх]ЙЏБнxsK“%Uб†ЛЖkђђf‹ЧнНн7я№&o6ја&mщW„§ќщтаЯПџާгR№,yNmMQљIкmщё›ŸЎ№ OyФ+4KSьtЕЃs§‰Тh†h‘la&)М§TRя;jпюЋ оЩЖBMѕОЎЪКШjпᛈݖ-W†Ћфлšžt[ТЂLжy[\ЦоBвG@,;1uйхhюї4эЕЧ} мZ2#{‡§[dXЁР”НЧ ю BŒВтщь8^я›bџъби\тФЖ?с4й”Š``ЃНыу“аEЯb>(УŒ§žzфЗЗŸфЎмх]б7oŠv cгV73ЌЄ„f\гћЃˆђcwч№І†щY€–ЦЌq’‚ёJƒu) “Ы•RСоыЅрЋ—ySaXБ`О[*™ФћrУВ|Њ”ТJX2”шm)а3n ЁЖC‡™с„ё№ћХ‡=ќ›И(ŒФАЈbг?ћ3М~љњeФч`’mˆУƒЩж‡Ж-6яЫXžм2aгГ>‰@“hV%SярЗрOZЅ‰гшЇ!ђgŽ9%f‘џЛЂ‹љ–№q‡x!t хм G9рaп!<T„И!@Џ;яќЗx3§OjˆcыѕОй”ѕ >W”o п‹p:8jћчaВm.хЬ5Г:xжмIgŽЅqВЯ`КІa№ыќКЌЪn)3‹'nВС„}ШGˆђМ•1Ž]0тъ`I\8ьЊэї52>*[jП)щъ>e Ей!#чŒаты\… ЁAА+ыœш$ с"є8Д‡МBEƒН:R”{њ…ŠЊИбЉYZшŒЊ[\чеКчљИSt‹Pk„PS€Є –шšbв9єЩCљfпьђЊќ/qYрцkх]^{-q&•;ЖwЪ<СєJТљё9БоЖ‡MkAamѓ‹Ž-mИDЫ'Ћ#ТРV?оg/{ѕ^ар}љВЅ)яqЄEѕђТ)Гм‚ѕС3Бd|†ћ<‹ sаTažЧb‡їх/фWвSWcф1`†В—Ях: зd}є…CtЪS“)@ЫzSЉћ—ћны1ˆ#Mх“ ђ)ѓчm\€$нЯ%3ЖМ+Л-uŸеšOM5зЗŸŸд_@8ѕ@§E3л—јВ>cЅсў?ѕG{ЂЎ}pЩNe…ймЊOŸЪ&rf•„Бœ\€|Ч8=ЉYOˆљJœАd Ь,ѕѓЩ8€]Ѕ%)6SžœŠ6е“оЏХЩ<А4b_zУ5l&`HьgC™Ћз#™dв—И XРрX™‰ИБЇЭЈ’ѓюѓˆЯ#Ц$&ѕX\Їo ŒУњ§Д+ЦKІэЩwп‹Ÿџ##ЇŸ27H‡Ят1ZІжWžщD‘Cœи–g-};![џ)ВE˜JЪYЁзГј„€=Ъ‡GРіlxSgт,WnТЂЫЦЈŸ&Ю~ e9Ц;mјшCBDА„рppб†JКЇ 5†Y`П”‚ќ}@‰‡HЙРяj"GŒ€2бА$: !щЫ/ЂRЦp/ћWЉђšШгСQ*ТGК'Ъ(RsМ№фP—@ vє#ˆ ­ГвЋ…!ѕ€:ТЅюqO”šАЁšžЖ‰} „ГHћ*о‹Шœј§дŒфF;сГб.Ѓ`EfV0?./zЊ|\^ФЦ@9ЁёOИ 7ГduOэЭ~ф\5;kmYOе^Ц>№І<Ѓd&ўdv‡0aƒ ФњQX?I VgуŸ}˜№іXŠ@ќ„їбиХ5fРяФ+и j qVf/ыGФbг—ёP ћС?Ћ€ cвьс? Аsg:,Ъ§m@–S%I:P(ˆУ %8ЭШЮB ЬьƒAъendstream endobj 560 0 obj 2411 endobj 558 0 obj << /Type /Page /Contents 559 0 R /Resources 557 0 R /MediaBox [0 0 595.273 841.887] /Parent 544 0 R >> endobj 557 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F28 86 0 R /F30 42 0 R /F25 87 0 R /F34 5 0 R /F1 107 0 R >> /ProcSet [ /PDF /Text ] >> endobj 563 0 obj << /Length 564 0 R /Filter /FlateDecode >> stream xкХXпoмИюГћєme т‰ПЉ\Џ@\дiŠsъ^ќ–Ke—іЊи•Ж’6NюЏя ‡”VЗВ{:АHj4Ю|ѓЭpљЊ€?ОтŠ3iдЪ’ #Wы§ХенХwз\Џ8gЅжЋЛћ zЗљНm.sЁdжvпсgC‹O‘{Oя†­Ї•?tэЦ6kwuŸџЃъ‡КyшщmЕ{hЛzиюџ sэВ*Ўo|ПюъOс3П!•uCяж—АИ­lўёюŸЋœ[Іu OХ”вСD.˜•RшьХ=Ž-Ј§ЙрЊ 3C6тђ§БYuлМB}п] {rhЃX)AЙŒ[”_“иЬ7%…ŠўљЙаХ‚&VŠQ„Ћ-– ;‰hŽчwйQ6)!6 ' &JЗ’•œi\QЌr26,§5- VК2,§%-ЫJ)ž‹~Х‰i\2'эJfЃд–нP–ёт2чЦdЛ&њТСёJЭЗЮ­4г–T§)ŠшQD3ЎЪsN:ЇЅ<ѓц\ƒсЇО‹Пп]p)x1W+ј†9/˜v~uСSJHЫЌХШV 1ІФ‰ )!ўЖр P, Ёу‚ќ|EЉŠSoЯNЩ ІЙYх’qMШnRИа:њЌ>;Л`Ю%чќР—Ќƒtч%Ш•Qэ3˜MŠОžYЇ™-,€‰YХ‰%3рVHЗšd–`žАЪЦ}ўГ`Gˆ)ХГ†ИCf›H&?1$bц9JRХЄ,#ˆЌuLƒt>Iеї 6CьЌфggФw<—РtЗйUdЕТ18“€џ%Хy)Ю2e“чZ`ДюБF ЎPУ5+Œƒ И”щф€+р}|‹єfœ"z€-ЯъŸ"в$,єе>ŽZ`f­Вџz ЭЯ‰_a=)Э†mGїm‡ƒbвеДЭЎn|ебДѓяћјiъBОРю&X˜*’ИџВі‡!zGuzіФ№TIкcГСj‚oТNS0X^@ŠЪчK­С€…h e™S)ЄWKс`в•оГЈA­р‚Ž…†|а Žq…Wr!ГŸf~йЁƒТ*yЖі›#Мˆe€=trP. ц 9Њb<(йПCНЏЉІˆь§АE…EЖщЌЧ"Ÿ—„–Лл›jи‚уИЫк?њK3m;яiuуС]ћКЉЁЄЏщmK{‚є+иЧёьІъўwЌКЭ€^Кь}Н?ьќ’Ўš ЎЎбљoоѕi 6‚ЖЧeСgЕ?‡R“Y*“В(H†KсЈьЗДа‡іФІЏЩZ|1ГVЫР:ќјИЋЕНnІ€е‡_эђЦч ж6ž”УFЏSoC}ШtльИР՘” №тл™;ЉВхфMœкOьlpСМЃ\яw›~CГOИлW’ијћъИиeДŠч_Єрt]5${А';­x’ц!јKBПU#hpDЉƒ~wю=%XФ№ŒPЁФ:‘ђъНЙш=tY|.Б ш˜Žдчu~AПАЌ(SZЂТeРГ†Л(ГЏ_бz‡УЩgќчiЅmтСкћHЃt‰жЬ0Ы}ЛлЕhм#–"Х}џjЩ\Щ4фxmRjвкHmЧlР‡Ёъ,™š_ш`@”ИM=Œ\jыo^џєяЅВi˜6Љ "‡L@<З?зиœЭНqrВ7Н|вњ)ЏžЕњ§л›лoЖ:‘Яяlѓе51н7й|JЯ­Ÿ3ZПlД~СбЏ‹›бц‘EaibбпйїoО§oќ"›ŸзрмIИSHКЖŒ•XФJ|S}ЉїаR„šо\BA?ю/Ѕ@r…qЈж ›РSg‡ЊƒNkРŠћRО eЋcO56ЏKћТЄ •-D&’zG‡}A`ж„СќФŽРvЁ™љо$€eŸаХBБ0ŠЪЩyQщKŠ˜иUAK‚ІbХЩЌ˜р•КP\zЉ˜h‡ ыІbЮПХ“`5yїD))сZ0рqЛ\F Кгmшнђ­ яЕ$@…UdU,Іdм‰yГВфзфБ9mщ)ДfOє~vМФЩˆИ[„WŠыІ=№ЫИ w5…—щ{Њ№6Ей0ђеCЙЅй?vТЁP РЄкGalы(ZХg@JMИЪr?,мЎЄбЬŒ?–Tпу шЦХ›И4щŠє‘Хp8ївљЕ"$“PЇЩГaK—y~C еžф(+№ƒ–^|XКяY л%ЋŸњ%AˆgїS„XaТ•"eoэњ†|њ~a#Э„RП}Ѓ™мHžnє‘\№И­)•ч. -киZEWс]ŒfЛЊ{=“H,Г}л1э3|БъpиеыpСщ‘‚Є"фžмќтOЫOЛјs_ЪЊ‰mЈCO‘^„!ШЧЮієв8#ЃХ^N1ƒ?MHЮTќЉ()№бUHEdЅЗ5]И,,пд NyЇе—Їк_;;мƒрIўчRЄКљ„Zhendstream endobj 564 0 obj 1901 endobj 562 0 obj << /Type /Page /Contents 563 0 R /Resources 561 0 R /MediaBox [0 0 595.273 841.887] /Parent 544 0 R >> endobj 561 0 obj << /Font << /F15 7 0 R /F27 77 0 R /F1 107 0 R /F30 42 0 R /F28 86 0 R /F25 87 0 R /F34 5 0 R /F37 5 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 567 0 obj << /Length 568 0 R /Filter /FlateDecode >> stream xк­Xнoл6пs^і/јQ*VќІ:`A AVЋлЅhї лJ"Р–U<e‚(„e:2’s1KЉ BHGD[˜J–ѓ”™ЄйзыŽ8vЊ‰”љ,eЩ82П-ПeTдU};OeІ“Ж,6UзW+Л4еœщрИŸK™›Йnšщю,ћeРЭsT2”]W‚ •єUБAxЕFтОГч:C‚jЮхTыњ аЩЪЊpW RжЎfзWлъo8‹x@ѕ іqЛЯO ёсePE8ѓ”RЦ’їMНЉъВhбеmyл‚zUѓHaŒPЅ˜ёNP`Дж# ”м9}Ырй–ырјєО{Я spЬwKiВkН­хzЂпxЛВIаNK™$FPЇжБиЄФ„pzuQѕп2™§Vо^ьые+ {>oЋћmуж4KЎнS$_ќѓjщ^xђiщП@HОпКMЭЦ3œ{њEеv=я+чЬlтЦЋТ“моЯ р­)‘:шэТЫТВwсч€*Ћл;‹ZРъїMРJ И=у€– ЭOBыї(\ц \є \<љ8…MијsАтєˆЁу> 6Ъ9ЩrіЗSГ‡ Ђs3 )Wrcс—f„BIEо“№є(FДŠфJŽЫГЭ‰PЖn`Sяs rІy,f`ђкšеƒ]ЏЖЦ"RЎђg|ЈЭg.5Tл 6eAі лИЦ/o|xošЂџЩОГфм>d |ј\ЎњІuо‰ь84нЄЪЬD‹ЃmŽCm%џ:оцЈžрШŽ\Й6Зs- „7,фHСbоVХrуyє9%ЁY‡ўuўo 'пЛ№ГРркuYўЄnТzWЄ‰ŒцФP=Щ‡аOШ<…К—,ю0PІёЁ“№еaуХе[_‰ЃН[­МЦ‹gb4'ŒЫH,!зФdђE5fЈ%Б'юFГТ`/и!”яјmпaШ Ÿ%"Y5лнОwd>к[Ди~9tСЕUС@Ov1@а9Уы1і…“Ф x™lф K§^ѕwЏѓ.XѕјХ5sи1ˆzœЌ‡ižМѓœжtћe53ьHVOв ›5 @В9@юђкЗМ/˜ІБќіEќэ„c”чџ9Ћ1Ё`ПЅ%™'Е 5ж Ч0Е,С†Н}FНj7=2 ;;аAKˆ…ižfцGЌxђхHязC†и M]тYЊnО™hhMРdзl_—ХЊYVEmOrљ.†|з‘Шšѕ~ z.ы­q4РОx. L"46ё'Fб%ўѕзЋ%!Ÿ–„ ыX0 wЃёЌŸrвYŠБ+БЄq…ѓcгЎЋКш]JЫЃзЉ pW|F(2з—w•Vы‘Ў‡C‹v:ѓ}UибХ€D€^ЃŸЈbбh@'5N•ћДQ&йежТЕпт‡к/рПŸ,Z$Иp…­у5‡ЕПђLdњkˆcB`Мc\Іƒ§џ ’мxcŽ UmљчОjУ„ДkЫUе 3ж07”щ GЏw ЄQcаv’ ч_УИKˆŸtу™“Ђ8fгdЬР6™OQrCД~ќŸuw7•œd †ЊqЄ2ъ/вŒjуFгкЎDъЖшлъСО+WiQ,ŒууIЬЬ„r|щm 3M mY е nЩлгЯкIH™.cѕб Њ>=8IРMž›І(ф’щ"MAЃэќ.rЈ0м ќЅЎ:–ѕь—Хй?ЏгЄЗendstream endobj 568 0 obj 1500 endobj 566 0 obj << /Type /Page /Contents 567 0 R /Resources 565 0 R /MediaBox [0 0 595.273 841.887] /Parent 569 0 R >> endobj 565 0 obj << /Font << /F15 7 0 R /F35 43 0 R /F37 5 0 R /F30 42 0 R /F24 5 0 R /F31 93 0 R /F25 87 0 R >> /ProcSet [ /PDF /Text ] >> endobj 572 0 obj << /Length 573 0 R /Filter /FlateDecode >> stream xкXпoл6оs^і\ьХ PГт/‘*0`KЗ`)кЂXвnУКYfЖœIr›ьЏпT‡v?ˆЂŽфнwwпЭg9ќјŒ ЩlЎg&—LrVЏN.Ž^J3уŠIUЬ..НшХђяŒL2}<ч\ˆь§І=–"мќMе­6ЧsiTж7kœмЎЊЁяџ\М}uЪѕŒsVjM[Э…`ТjПсХЕƒuŠg§ њЁЉЋNфйоКfБѕлј™Э%‰Д&Я:wеЙО<ЛЉКjэзѕєНщУо “0^'ЗЄO œИЃ1юzЂf`БB‹AГЫЭ l6ћжДW (ŠьІ#a]э–[8ј5Y'ѓ‰uм0%5˜hTкшћ 6FVLЯ›ѕi3|ЩuўЛЛ:нЖѕЫуЙЮmі'>ЙЪў Яw ?йЇE˜9 ЇMзЋЮПђь]uџ&ВЯА3OјAJ*F%.7˜ЦЄvюјЧяSLО!jЎЙКЦ'a АLм№9™:Š™œ? ?ž‹ШyАџ]фS„ш$L@†яGF—Lq>A† гˆ~6 С0 ŠoзЎУ(ЖygS> _xПЎ0ќОњ#vD{ЄЉЕЋZ P˜ЎЋ–FMg‚\ЛiWMыЊч-Јм ЋuљРЫ“Єzє/iжнжюfРБСS§HgоЈ„sKЩЪR@?' ч9Ыu№iыїutизc­ГЊkЊЖvѓzƒ€LЇHh]]мВ`•-˜В`–Ш™.Ы еlяЗЋ) "xвa0XAŒаhB„FЁГњЎ^СЊ ƒО"РY>р?Ъ„чЯчoЮ<Šgє§KЮеЪ1ˆC­Мbћ|бzG+~TŸУ5тƒ#к„Цk+wєВ№Gљ/eЖt(зЂfєˆЖ Ћ‘|нкЕИЧp (,SyєЯЙоП9mV3Ÿ@Щ=ЙФЁbX[„•С;вj&Ъ‰DЮе–юВяOЃ…8&$pі'bLРžc­ыuЭ†лh‹B^<RЫA ыšђUMfПИЕ/e#џ 2ВпSФ IPОъk|>Pˆ€ЪЋCеШMHЏP|v­1%шa[‚J_ИTѕЖЛl†„:†3m"}і[ђџВщ\=lКЛc+љЂ>:gЖ(‘кX.ФˆуЁТ˜’†zDєъњGТ!ašфбOА#žРnЊ>mЯ#пPPwРЧЏА&Ћ№QLЉ _WЮg0 єџnСAƒ)Ьc.ЁЈOœpЗД§ІuБўqnY ъLГqh|w‚lC]КUш„™КЏ(щ_[Њzw Ё hьћ1Е`Jш PХ@с3УJЊІ6|ІX)IСяТ&v)˜гoq›аaЮKt›ѕЭХУl„’mж`lзя Б] ъmOQ ”Н!бzГОйn‡ЧпVѕfбxNЄфHb}(зPfЁ/5šь' JE§zqФе}AUdM‰8•pbВДГЮЭ.јинFQh@Р-c{ћрЬиов9UŠЧ Џ+љЬ2ё и'а=)љь€CT­БZ0д„§я q>všїŒ”ƒЗH,ЪєЈЃJQ*…зo. ыУw—т-ˆKpOИЋОHљ@њцоŒ}о”o&іQbт gšg"p4М 4=—I, ЉГќIšПKц'ЌхЅѕ5и†žр {'Yњл™ M:Йˆ”Ф %дќ5цЦ2|па‡-ЖЦ81Й+[К+уvcчущџ9јNJШxчСЉ~p7t‹€Р„т€џ,€ЋЁ}ёЭЋTЄџоЎэendstream endobj 573 0 obj 1710 endobj 571 0 obj << /Type /Page /Contents 572 0 R /Resources 570 0 R /MediaBox [0 0 595.273 841.887] /Parent 569 0 R >> endobj 570 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F30 42 0 R /F35 43 0 R /F34 5 0 R /F27 77 0 R /F31 93 0 R /F28 86 0 R >> /ProcSet [ /PDF /Text ] >> endobj 576 0 obj << /Length 577 0 R /Filter /FlateDecode >> stream xкWKoм6Оћа^њ|ЋЖЈ‘ѕHа1Š4Ѓuр&-б^ЂЛвFвкq}g8ЄvЕ–н$аA| ‡3п<ЩјјqY2%јqžH&2y\­NЮžquЬ9+•:>Пv”чѕeєn{еЕлС6fёсќЗggrŸ(KX’чžђхfгЕŸЯь@„n nф™'ьЭЪTCПˆeZDУвр j=heбf‹o0`_~МL>`ˆНp‚$р˜88“ЫОD†/fp‹sнrrљяКћД…H~Фр)’ЬЛєр‚ ”&ŒЖфжИ†Рмч6гyX`Ѕi›рИ8]лЦЎэПкg*Xммœ)U:№<ЈЗѕЬрf§vM„м- фІ‡@7Ў0jюigm4&ƒ ёSЁ"XИєѕцѕ|œШ„хйžг%ItЖMЖMхдzШV)–‹ТљУмœщœYdЊXš|>…Кб‘9*SoЛ9сsАj2ђЉщьэлЎ­цЫ•Ш‚–%РП6уЇpюiљК]­ZŒ‘Л~Юcу\Ј‰3](Р yPљ‚Vž“ž­Z=МРБˆN№ЇТЮл?]f Њђ№ФУ И2Їn H@щd3 ю. 1Вm?slёИOa%ТўХ.у™[LS’‰ђafѓsŠŒvqpИк’Dящ‚9X|ѕ9PьСѓе`œ>šeQ\э+žђz$ѕ€џ ˜ ГЗ*2Ÿ+Гz8(ЊUлufDzп?šя*kHФC˜њ%ЅЏ†жЁyˆэѕLћ :у9їЩ1є&ЩTі˜qRpчŒ‡ьЪЩ(БT‰яжЭR$ъзЅEѓвљ^y2]ыЭ0m$БS–OлBœЏЩЕЁ!Ё4тЙn Uм<]ЇUЩeУXі>ЉL'сћ9œ8+drwбX:pж@гm˜ *шьЁс_@;:ЬѕЙ)яР3ў<>г6B§ус…уjЬC%bСсѕ'sHVpѕ5j@C4Šъžx3ЕZКЎп‹jЛ~xЋЛЙR-Y^„šю_E‡=‹dа {’зњ1NiЮ2)fž* m(§8“;%ШћкmSћжЯЅ jНЫРгЃeаЛь‹ЊЛЮ{єCб‹Œe* p2gрŸСщзAўЯЋ(/ДŸ_іИO“b8ИЁjз›-НZeБЛщ`Б]Х> endobj 574 0 obj << /Font << /F15 7 0 R /F35 43 0 R /F27 77 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 580 0 obj << /Length 581 0 R /Filter /FlateDecode >> stream xк•U[Oл0~яЏшЉд_“fhЃк&!бЗБ‡)MЊФЖiџ}чј8…^41!зўќя\-ЦўФXHХfмŒSЎ˜LдИX.—Ѓѓ+•Ž…fJ'ухƒ‡.Ыя‘H˜fr !eДh›‰’‘Гё<яъvЋTG}ЕЦЭmЛ Ю,П_ 3‚eЦU,%Iт oКіБЫз„Soq:cЯ‚нuМl“ї'Юf™ @4/Soоі“X' oeiБ™ФpдіЮvUлсžˆЪЊw]uПѕb=Њ}8ИжйЧЮі}№f ОƒA.`Ё™жфЦ&',ƒM%Mє€ќJ&ФЂРьІГOUЛэiлО1m&rЙ*ЏщdнњƒвжЬ›)3&ƒ˜qІЅіЦ–goЋšЧРyh3‰ѓХ|АNД…-З]ИwVк;.tcKњ™яјjH*Ÿћ'ђ“2ЎQWЪT–z]EлєŽDKІИо‹аѕќgQcJю№5ZG‚_`~Ob#ttН]плз” м+ТMмћуљy 6žz‘ПмBк‘Q 3оœR *jюicр‡š хъ№(wt`ѓbEWМ„S ШЙлќЩ–^ƒџ’pНgY[v-юm†Ф„=ew1ПЊPз[ЯЯЈWм‹;Л№б6ƒuТ"—//РЕTyіЊ†Ф@еokї6№‹Œ)ЃіŠ`Wœy§мnЕЦŸ:ЊzкЎš ‹Нњ5”л3`оW__сътЫ ЖZЧ %5< U0%ЕCB&.N%Ь:ŠђьV=tђX -j_:ЎjАO §Ÿ&Ц€чЁƒNwXzЂSя3ќзвЦы@y_lР!˜Ыvл”>:ТЧe†e8ЅdcAў# їeИЯ™юџGˆА ŽuћЇ& ЃвsUЙtšУШKъhrqCЕ__CЋ"Џk[2ш6ІŸœO !p3Є]oЖ.7n %Œр).3і~RЄм№сђг}SЗnH1}рlГЂУ~ECгЗе^’їпФтР‚иA^гІџЬ0 [,a!fєЋЯFŸ—ЃП[. qendstream endobj 581 0 obj 813 endobj 579 0 obj << /Type /Page /Contents 580 0 R /Resources 578 0 R /MediaBox [0 0 595.273 841.887] /Parent 569 0 R >> endobj 578 0 obj << /Font << /F37 5 0 R /F15 7 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 584 0 obj << /Length 585 0 R /Filter /FlateDecode >> stream xкн–Moл0 †яЙь/јшГ*Q’%]WЌ‡Ё+†еЗm7QcўЗУў§(ЫJтЦщZ4иaШ%Rя#RdХ‹4#&…( TЄбЂš}ШfWР#DieЋо2[~‹/зљІГэ<сJХLЭdŸ№ŸD2ТСєЗ][дїо`ѕP/КЂЉЗЮютŠЩˆЁ/)§Š‰”D3№ГšЪтHуm˜у§ќўqЯAХsаqoЌтЛy‚пжжў1_.эвлvџЭО|ЮЛѕ{џPхE]ўЌmЙёЃ :v:чиD &.ФжnЪnKќ^Иˆ˜"РТ^„! §^№=›'ŒГЙсq[TNўTNфРI‚Ы(CxЊћuоMЈ†#ЭaЙaЕC3Ъ =и]gСw*щ-~Б‰E%'ŒыжVSјбIaЗ^иn=а)mОмсЙ+ѓњчРІЈGјŽCbZу0Ф~;!юн%L”p|ЇЭYEјzFК6/ЪAљZ IщГ*pJ 7A…ѓ…П‰ R,щыOB^/п, H Љ–OЄ9L3L",HЉВ‡lƒ!лЎŠВt™&^žiъЭђІX4!2AЏ/ЩX|}BgХpjЇsїаі5NРiypы,еcuЦS;а‹Ік”ЖыЋ!ЎњЋшжnФ Йb— G5oеДрP4ЛМєlK[пуЂЧМ  Еgъ„3Ъ z{YžГ1` ‚ЧW0и'Цѓ,О шwN00ЄЉ#є‚”У?G Я‹рђ?CАZ…|;nжї v 4дF5ъašњŸмуKOу žуАwтчK!I„ ќА…У>Џuoz‚4О> endobj 582 0 obj << /Font << /F23 5 0 R /F15 7 0 R /F34 5 0 R /F30 42 0 R /F35 43 0 R >> /ProcSet [ /PDF /Text ] >> endobj 588 0 obj << /Length 589 0 R /Filter /FlateDecode >> stream xк­X[oл6~ЯЫў‚п&ЫЋ(іБitи‚b6АЂ—ŠLЇТt $ЙKћыwx“х”rRЌ(PKyЎпљЮaШ У?В"”Ё‹•Ф бŒ­Ъцтхітљу+"%bЕнл­лн‡Vи:%p&Йќ\єE9ъ~2Щ’^пеEЉнЎMЦѕЇэoЯЏр0!H /#ЅЂ9З’6‡›О;ŒUЋнV6пša$sъuўщ$Фož­SAHrIьAa™D”"Шs/Т7ЌSŽГЄjня0іU{QЏ8"ŠћГ›Јt„!dnCQзNојYЛ‡n ž&eyшuыЕЪЄлAƒœ ‘ЉUJ8т<Г"Ъ5•ЩЯя  OЏя2ъ/Dg~ЧїђbЌxDtХ*ˆІ~Ч<ї)a,ЮV)SH1€Р=оš„§pŒ%žAс<ѕПФ#š3oХўа–cеЕkЙD‚`МО[G`рфMЛгїЏt]5K№v"Њ “Ј,K їѓЎы{йї]уžACИB„M†ˆІЃˆ€”‰ a*NaŠcoр]Yˆ‘@œмѓЄ*FШ›2№;нcќы‡бНœЂФ.Й8 ! 1гЉPРЁblр—lV›m]0†ЫШ™КH9 э0h“Ъ“Бs+ƒОƒЃvoоЪСэ1иаш­S ЙЉ‹і@ч2)ЛІ)м‘Ю‹‹›C]˜дX? iЭьyi€hЦdR5оU Зўъі]]wkPѓя@„Ь‰Ч‚ФњBŠ^{eЗmзыhьГlFV‹p™K­М™ьР‡[:ŽR)%НяТžВ80Œђ\TXЌ˜O~LZ()Зє5sjH]бЇ”=…юњЮк\ъkŒ)b$дѕ[`Ѕ“ОaƒnŸirUYž*Ўi"GЫ мˆ3РI‹4 1Ъ„zЄwd Qщ ьU^zйЕiШ„@’v‹aЌFшœ_ жLМU>Ё>КйЄ№\m’9>”єйL…]Т$c@эЊМяnћЂAБ cHQљp~ИZ+УЉM1ŽNš$SK !GƒЗјxШZTzѕfwоj !X§ВЖˆѓžGАшЅ„cЎ€tndбH№ч№ƒ‰1diЃЧ+ УMз‡цwноŽŸ С№јGqџJ—ЄъЎпvU;њчzѓ^їн]Q%QЎ‚M;э9„ ЫЇh2аъс|иt_•naoЭ|цP–]ПѓS$ЇгЇ аЁЈЂбаМ‡Б  %s0+GœИьOСˆx'т24К6 г‰пm•….єGўЂвŽ;Н/ЕЧ СЧpž–Ёз8›ЫЮS­ƒн@=І# ѓ99R9НгeеЕ›П­Dэх?`ю?O5yЃk]ŽA5p~ЪИ›КЪ\ЈДn,ŽƒРмиؘH(\ЪB\ѕ c„—ПЉƒ.љЪрТ““SLЛкxЊЃ­sšєе&–рТГVeSЎ9;?Пш_‡€ЇГ^bŠ2fѓmˆ9 3O6 3'ёЉ“9te ZИЂ ѕџ/O0ЪX‹ŒЭи_о-№‰$3вВ<+7uєfRaЎјЭCЏ xЉЬBньŽ5R з%Ќ~бЎŸМ;'Лp?~њВŠЌф&С‘"ђп1еЯљЮр`ѕhyУг†ПSGЩaт;ўЕ P{tоU€Ъ§Ф›џ„|цг№MВЙ4Ьš;š\LцЩјюЧR}O†лD–Ÿ™НFX№Yюlћ˜7ош}€2‚ЄќЁ СЙ№Р 5Yyй5w>>ян]р…бЬ‡Zп/]` йrаИ№Aƒ‡вI2/<: ЧЏ„Lљяу‘Єr^FxnЬ9єuљрn0EЄУXeц4“0BнТrѓётѕіт?" §endstream endobj 589 0 obj 1615 endobj 587 0 obj << /Type /Page /Contents 588 0 R /Resources 586 0 R /MediaBox [0 0 595.273 841.887] /Parent 569 0 R >> endobj 586 0 obj << /Font << /F34 5 0 R /F15 7 0 R /F35 43 0 R /F30 42 0 R >> /ProcSet [ /PDF /Text ] >> endobj 289 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 590 0 R /BaseFont 596 0 R /FontDescriptor 597 0 R >> endobj 590 0 obj [ 963 380 963 639 963 639 963 963 963 963 963 963 963 1222 639 639 963 963 963 963 963 963 963 963 963 963 963 963 1222 1222 963 963 1222 1222 639 639 1222 1222 1222 963 1222 1222 768 768 1222 1222 1222 963 366 1222 833 833 1093 1093 0 0 704 704 833 639 898 898 963 963 768 990 813 678 961 671 880 747 1059 709 846 939 854 1427 1006 973 878 1008 1061 762 711 774 785 1223 884 824 884 833 833 833 833 833 768 768 574 574 574 574 639 639 509 509 380 639 639 768 639 380 1000 924 1028 542 833 833 963 963 574 574 574 768 963 963 963 963 ] endobj 591 0 obj << /Length 592 0 R /Length1 593 0 R /Length2 594 0 R /Length3 595 0 R >> stream %!PS-AdobeFont-1.1: CMSY6 1.0 %%CreationDate: 1991 Aug 15 07:21:34 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY6) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /AAAAAA+CMSY6 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /minus put readonly def /FontBBox{-4 -948 1329 786}readonly def /UniqueID 5000816 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ/ љШ­щйРXИ~›id}S5žQ!gtЄъЁтЕŽУkбJc;•rДNŒ^єЂЌЕŠ ІX€5П.иSyƒŠ– ў+'ъIУqV˜œ…т:Пrуš‰#,йє#Ш ždшBZЃОїож *R’*"7йЈнyнчеќ! ƒž[RпЗ`]{ЅWЬ5жIіыeƒw4К 9лBj$T>єRž-“‘%Еt‚hސEТ$/JњLH—\‘wЭd—ъЭёQЄ_RL@CТ>vя[2‘ЉAX>'пЦ‹’X'Y“ЋћŠЄбb=ajРп1TА'{ш!q+чГ3…чЄ^3pљИўž<ѓр{ŒŸ-“O$е‘У0H}пœььRXФ~K2S”ŠАsљеIЩqА‚ VГ9`СуЅхDЬŠuИWё^rv&Њ{іЌ_­}-z4rдЈ­4ієМт…?Х„ЮЉГЇ"Б•‚P”—( VT€ бЗNЇBе~karЩЊQў”}љ”'Y":О…е(љЧљ6жљѕЅFЫI зQxШхџ@ саuщбёwѕИГGмЏњ|фџtEŸэz›І™ЧЪюSџmь;&KQ•Љ›§ t<WEЧaт2I-eэЃ/E0koЕ,V‚”"Д'}ўˆŸЋцђŽ—€Мlэw‘Ÿ9ъИѓъ~ѓЅ1’Gtѓ]ЛЅMШ ?щmF6(Х*щWУ ›ŠТQъЈЎњ?.„=Ёс0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 592 0 obj 1897 endobj 593 0 obj 766 endobj 594 0 obj 599 endobj 595 0 obj 532 endobj 596 0 obj /AAAAAA+CMSY6 endobj 597 0 obj << /Ascent 750 /CapHeight 683 /Descent 0 /FontName 596 0 R /ItalicAngle -14 /StemV 93 /XHeight 431 /FontBBox [ -4 -948 1329 786 ] /Flags 4 /CharSet (/minus) /FontFile 591 0 R >> endobj 163 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 598 0 R /BaseFont 604 0 R /FontDescriptor 605 0 R >> endobj 598 0 obj [ 735 1021 953 854 817 955 885 953 885 953 885 715 681 681 1021 1021 340 374 613 613 613 613 613 922 544 638 885 953 613 1108 1244 953 340 373 636 1021 613 1021 953 340 476 476 613 953 340 408 340 613 613 613 613 613 613 613 613 613 613 613 340 340 373 953 578 578 953 922 869 885 938 803 769 962 955 459 631 956 735 1159 955 920 835 920 915 681 852 939 922 1263 922 922 749 340 636 340 613 340 340 595 681 544 681 561 374 613 681 340 374 647 340 1021 681 613 681 647 506 483 476 681 647 885 647 647 544 613 1225 613 613 613 ] endobj 599 0 obj << /Length 600 0 R /Length1 601 0 R /Length2 602 0 R /Length3 603 0 R >> stream %!PS-AdobeFont-1.1: CMBX8 1.0 %%CreationDate: 1991 Aug 20 16:36:07 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /UFAAAA+CMBX8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 48 /zero put dup 49 /one put readonly def /FontBBox{-59 -250 1235 750}readonly def /UniqueID 5000766 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ*BgЗNГРгН ƒи‘lІЪKq*оВXњЋšццwќsŠМ|QЭFяq˜еўцv`цšzЙXђšMyхp"їƒыЛЖдєь5OвоЫЉ”YЄХ№ЦыЁP(DTчм!С[vДС›„67XFšlU‡…В&3!R˜qЉˆ4‡нw”’нЯƒ~j‡И+лёoМuњЃ “ў_СšrѕкPŒ0МKѕ,‹Хћна–JmY:8I ЊojЭЯqРhѓЎZ+:mюЖвmМсвœ‚Z›яуІW.pм{`4L> œwЋс€L~жTO J=lvbо…uР{э?mК}dЉШa:ЁRЗJЊйЖnЎэjљб‚6iЅщЃцд‚рgxРЏЊ0шЮЋ‡LMlДшGxdкЧ ;Žдtњ5c“Їt Bі9}/яЦЈй€ШNЙуŽf2Iћ‘еШЅЫІ‹ Br]]BI~ѕЪbь+Ÿ\дж1ŽЛЇЎ(aM-ˆpœ*7ba$ИЁџЧАќКїzиœ5OH‡л'xрЄК}ђЮ %й'ŒэHXNŽkп0ПвB„Кј(Ж7П„ )ЛЮжsrЩяDqТБк4<'ЉtU%Чtѕж9ЗЎС—Юэаoвy#5э @*юЕ4fZG„t)йєЪ› м_aќTц­ЭЁ\ЦŠ{ЧŽЩ#ld [#ЮhЙМ8я>[љрц­єseШаCf CŒ‚юВѓVї‘†ніСЧ—гТx‹gбQxФУш­ТH+Ћ•6Ў„хЯ>сЖх;мтЈ>.H_IjV,ГѕЁ1ЛбхAL†Хљ•Rv46сф'{W[J^tЬ†ёZюŠМwњ›L ы ЗЉ žїУь‘Е5OвТЕ}iž^И)б/‚p+ŸЏМ№сѕu€Ж.k^дBwіЛм ЫфsЕРпZЏ‘ѕ šiм­[ќІ0ЖЈ$žнšbт4FћЁќ†–fх˜q<ФaaaєQкPЙ)ЂЩЎThо*ї5гбЮ€FvонŒ˜“ыЌUwы`4SS+z:_и75ЧБS‹љ$UOQБЬdэM:%20o‹šоНJ[cF`в‰,~ž)ПxХкђ”m0 %ЃvШR3 pѕЗЮж Ѓ’Ѓ†оyъѓunŒЮфnXwRљЮМaR3Z жNOюEžЅ0† ввЈБ"ЦШou‹<гQXч.@6ЗSWЕ_Яl†kcъ>ƒqЬчd=БWhИ`РCОn@р9€+ЪУИiTY €]JlЂBЅ`sц“­YЕQEe"•ps8LЗоnѓЮ‹WTbAZюЗ9“žьžЊ§& Ÿї2њ-SеxCF4ђŒЬБƒ"Iq:єR([ъћuc+ƒfЇhpuьмЮъ]%!tкkP ,іЙAе?AbнЫØJњЋ‘z(FЂюw’XЅЮ/Ѓ@ђcЙ’чЉ"ќ4ŠхК$ѕГ6 ѓъnМ ћ§IЯ$Кh_CБЛyы…ЌЫyчrБ#ЗЙФp?“аX2jЮ€Зчd^ŒWiхZёћ 0umЁиАmeEšiQœЊJЩ˜нЦ‚ЂY!цJ”н"O§2еКмІo,ћЫЯЁффШj{+\McЦн”D0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 600 0 obj 2591 endobj 601 0 obj 775 endobj 602 0 obj 1284 endobj 603 0 obj 532 endobj 604 0 obj /UFAAAA+CMBX8 endobj 605 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName 604 0 R /ItalicAngle 0 /StemV 122 /XHeight 444 /FontBBox [ -59 -250 1235 750 ] /Flags 4 /CharSet (/zero/one) /FontFile 599 0 R >> endobj 133 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 606 0 R /BaseFont 612 0 R /FontDescriptor 613 0 R >> endobj 606 0 obj [ 743 1028 934 859 907 999 952 736 833 781 946 804 698 652 566 523 572 644 590 466 726 736 750 621 572 727 639 716 582 690 742 767 819 780 587 751 1022 639 488 812 1222 1222 1222 1222 380 380 639 639 639 639 639 639 639 639 639 639 639 639 380 380 963 639 963 639 659 924 926 884 998 900 775 953 999 548 682 1026 846 1161 967 934 780 966 922 757 731 838 730 1151 1001 726 838 509 509 509 1222 1222 518 675 548 559 642 589 601 608 726 446 512 661 402 1094 770 612 642 571 580 584 477 737 625 893 698 633 596 446 479 787 639 380 ] endobj 607 0 obj << /Length 608 0 R /Length1 609 0 R /Length2 610 0 R /Length3 611 0 R >> stream %!PS-AdobeFont-1.1: CMMI6 1.100 %%CreationDate: 1996 Jul 23 07:53:52 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI6) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /BMBAAA+CMMI6 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 23 /nu put dup 105 /i put dup 106 /j put dup 110 /n put readonly def /FontBBox{11 -250 1241 750}readonly def /UniqueID 5087381 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ)s™Ї„ЬО…Д™;.ыо;дrЗЯTeђ…jiЋ–эK­/df5рЖA|Ч{S/…иЧ )ЁšSяcы\^ШŸЦТm‰чйфpЗ+як#ѕпvОЏLщ17ЂэŠЉзж§ѓ~kЭрй ˜d#х– ]ŸЛL•eVшпЫњьGoЃoйЅШ\šѕўйТнвkм ™9‹ŸMжЈ№[GЏ•я(ЉХaлм˜Ф|ѕRPщ6nЖ§=: Њbуей9s2m4{~мC‘ЩпD…Иќ˜д%Хx’н№4,ЁC v•ƒjжћ-ФС?x”vф„ynhQЏ`І?Аоfе\ё ж[“BЫhnVGXЩadџЇБшЧ&ѓЧЛDЛвƒšЄgWGпaс0Ѕ^)|Ѕ№*?љZђѕHqr@wЉ8~'‡š–I­_o3PЌЂf4НЮ!ьауYхъ^afRoыУ 0 ŸНСМ/›bяюФƒEЊ˜јаЊTЗЄ€чBfQ†\ŽDNлyŒ~ іхЇэˆez.qТућ‹RCОё3;VЖЉЦemB”ЈA„/уРќІTFЧи_{} З<ˆ ^šЅžni‚ff[+/І^а‡7XYПOй`5-;\Т`‰$,ŽЉ$—wTАvи=Оhоо~+Кљщ,h‚Њ;ђЫ‰CFсRJŒ]ŽќЩЅо?U‹ЕЭ\bJ3нPар'зЎИWCѕЏžчйо),!з4Ы}%hnїDЙпХsE’SЃYИP_˜&§ІйЖЇgУ-TŒјОŠ­АЛšЖ5 еjъСKБ6фŒ}\>VAcНŠFіЋџ‘d ю=Эj — З|~шИq,і7nŒHч.qL™=j>цŽ:B+Z4В658х“)ЃEНsЎ2 ёТGЊiz&W6qђЏ…Вх\ДЈIЎџ$‚œ Пи]ZіFgіTУjЬ>iY§…у”№EзiƒйНЭ‡­5Xx9ЇэЏ lAцУ.‹‡šUсЩ)ЭхPNYяG7=чкP fSY8ЁVЁуф‹9›К”mч[šD0qЋ`д ЊS9Hю/=Ђy{7eЬtM' й&СБƒ?,DЏЩJn[Ђžш9qhNэЈрНЙЖЯВO ЙыѕЧŠ?9/gСц„†%Њ§7‘1фj$Дђ‡Дˆ\%ЖFX’ї€ьэікpŽЅяЧUВ™шБ6eЄJГёТœфТ!І*Ај^Ъ"ВUЖ†Hоќ:•4ВЬtЌ…gх #-s9Еv–cq3P?<lєгмhя Ѕ‰j‚"ŽžпJ9cM*ПЦs}:DОё&Ыухbd™ј0/КХєAGNXO“ёZ—ФЎроЕф 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 608 0 obj 3131 endobj 609 0 obj 812 endobj 610 0 obj 1787 endobj 611 0 obj 532 endobj 612 0 obj /BMBAAA+CMMI6 endobj 613 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 612 0 R /ItalicAngle -14 /StemV 85 /XHeight 431 /FontBBox [ 11 -250 1241 750 ] /Flags 4 /CharSet (/nu/i/j/n) /FontFile 607 0 R >> endobj 107 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 614 0 R /BaseFont 620 0 R /FontDescriptor 621 0 R >> endobj 614 0 obj [ 458 458 417 417 472 472 472 472 583 583 472 472 333 556 578 578 597 597 736 736 528 528 583 583 583 583 750 750 750 750 1044 1044 792 792 583 583 639 639 639 639 806 806 806 806 1278 1278 811 811 875 875 667 667 667 667 667 667 889 889 889 889 889 889 889 667 875 875 875 875 611 611 833 1111 472 556 1111 1511 1111 1511 1111 1511 1056 944 472 833 833 833 833 833 1444 1278 556 1111 1111 1111 1111 1111 944 1278 556 1000 1444 556 1000 1444 472 472 528 528 528 528 667 667 1000 1000 1000 1000 1056 1056 1056 778 667 667 450 450 450 450 778 778 ] endobj 615 0 obj << /Length 616 0 R /Length1 617 0 R /Length2 618 0 R /Length3 619 0 R >> stream %!PS-AdobeFont-1.1: CMEX10 1.00 %%CreationDate: 1992 Jul 23 21:22:48 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.00) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMEX10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /BFLVST+CMEX10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 16 /parenleftBig put dup 17 /parenrightBig put dup 18 /parenleftbigg put dup 19 /parenrightbigg put dup 20 /bracketleftbigg put dup 21 /bracketrightbigg put dup 32 /parenleftBigg put dup 33 /parenrightBigg put dup 34 /bracketleftBigg put dup 35 /bracketrightBigg put dup 40 /braceleftBigg put dup 50 /bracketlefttp put dup 51 /bracketrighttp put dup 52 /bracketleftbt put dup 53 /bracketrightbt put dup 54 /bracketleftex put dup 55 /bracketrightex put dup 56 /bracelefttp put dup 58 /braceleftbt put dup 60 /braceleftmid put dup 62 /braceex put dup 80 /summationtext put dup 82 /integraltext put dup 88 /summationdisplay put dup 89 /productdisplay put dup 90 /integraldisplay put dup 104 /bracketleftBig put dup 105 /bracketrightBig put dup 113 /radicalBig put dup 115 /radicalBigg put dup 116 /radicalbt put dup 117 /radicalvertex put dup 118 /radicaltp put readonly def /FontBBox{-24 -2960 1454 772}readonly def /UniqueID 5000774 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ*BgЗNГРгН ƒи‘lІЪKq*оВXњЋšццwќsŠМ|QЭFяq˜еўцv`цšzЙXђšMyхp"їƒыЛЖдєь5OвоЫЉ”YЄХ№ЦыЁP(DTчм!С[vДС›„67XFšlU‡…В&3!R˜qЉˆ4‡нw”’нЯƒ~j‡И+лёoМuњЃ “ў\ѕИЪЦЇОЕа"vхџЏ*соo$1”а|ЌУ#ѓ`ˆЁнЇ’ѓ2Y†§АЋпШŽK@ч˜‰!еQьgыЪDРVW№м‘>{0Ѕѓс3{i‡ўМEљ‰ШмmР­W~?аеB Ў(Ч4ё0С3Д„"Од†9ЂЗNLђчтJ™ѓGрє9LцNЌЕIWn‰NRъОY[ЩdmŒ+ЋIfN•|=‰ФЧcешпњЌG5‚ЪрyJЉi,dRhŠtЇІЇ­ ИЉx<#^Съ!V&Г1‚qEо1[nСГиЖ{3#їaъєТ#Л!LLk-(PAаh1ŸIƒvияКYˆKЃ1Œ[ЩV„ђрYРбВЄY*ѓaИЌFЎnHМ ˆŽD‡hƒPщ­PtюHH'фЌУŒМ=Г(неГAЏšf(К8J—‹˜H:cќФXауМц§ƒ~ Ал˜zkcЗF8ќŸ!ЅŒhGž…"VpзœнхЌ wѕЉ”Ъp _ёљЦ>§р#5№J У˜Б*рfvУbЊЃ•Эя Iр3YeђћA˜I—™ЮЬШЊ]%RdxLг >‚•ˆŽћТ нзКФZюя›†љ47з• СwЇ˜цЛqЬђc>…yˆ6šб6У|аш‡ `д№Юџ - E>ш` PЯТ5@XПmxхр1b@CDЌжDx3r ЭtЬKљ0…ЃХnє#5~ЌЎ@ГЕмrшђмпS&Н†ƒГ`ІY‹Cl!;§TКџпž{Ё>MX‹‹Ї"_|Л#xw{НUJРCМ31№‹‘IћЗЬВrьЃ•5Wn.H™ЅкЋэX!;&/ђkЉЎ€тC’џCнЂ:фlrЫЫЌг/BОn…Ё\/Хі“№Н^ˆ†€фX’ўжыhл'–ЌР$јро>ъпlЙe€ГOK((œ*ЁІ/ м=xћНЉK"ЏяЄ Ах76RYJсЎHwърEгM”ў\P•B‡ьŸ‹віNСЯъ ›ЭЈjж=дDч}0ZњX`Ј…:ZПcКMC~1 Ѕ!-Ъњ-ё_бАЌэƒ zЯL\Kѓ–2§ŸynЎЌЌ1‚_Й>ИЊS/СД‘иŠоœ9 \њс>‡^вž—[ЧИorКТЇѓ:p$ѓu№Ћ@8kzи\бy4zšи/ЧG]квkО—<й“ъјRŸ“^ЗŠГБѓžАšЗ•РК‡>И_ПLяЦ e,’§5yяе5ЕhKќУ–Гl…ЁгG@ў3ђ‹жIЮЋгЕЁŠ@žŒФрКe C'œxQ ВБГћ јљЯl7\!BЉцЏsєLJ(Iю­ќЊьхkЗЙv(‚ѕчђяїђ…ЯUH‡1.+ЕSЊ ˜EBŽУ й C˜m­mF,ефšч[0>Ч%–>ыaЈШtёдMтгѕ–‚Іžp5в>ј€ђya FƒѓƒтхЈЏлŠEЋfb U•vQ‰ЮDФLЏgц2GŒ­ЉНИўсVйsRпsћЯз"ИŽ˜—.Ž ЧVKЭhж"КџЩ$—zХ#гг4Јз•Ђќ†ЩFYєb~ђeЖ#ЧФ.•ъ€І—D+-ЂЋВЃя†а.Џ>аl#эся^Щ†1,іФ.э|а[ўШ/Єy PєZ;‹‰‹dјл?thš–УŒёJВOЩию‹fzЄТqmxи”‚дВx­пfTtr‰‰nГžIX/СД]чvЎйpnƒ9ышчаŽбKLfУufМœi§Ѓ9m2Лю[‚Hм†Рe2ЈvЏКИ’Б‘Н1кяЙ“œZих0“„Дz{ЪПWРќp‚ZіЎqmјSz…xЧ›РШ3щxЖЎ7Џі(цsёшцт.еFD f(~пКcЋhчЕP„ЪdŠ^JкAЭхЪЖ*ш•YМ;”_ЏV):E№єOЄdЙШОТ{ьъ[s5j„ПБЧЪШ–ЭВlіњыŠ./“к’aКЈуMжO &ЦчєГяиБj’ˆЅA{C(—zг™ŸХј7т}ЃІK №ХмЌПkmИиЦЊш/-И*Б—OŠbdŠœљ}бmЩїi‹–ЧŠЉнъ6ЧЧ@]5лИ рl„МХ*sЦK&)гр‚ЭK"6З§+˜izШ@)ЏZСЈЅRРS-Йдао:Tгццє†g;0w tyW­Ї„авa—@?УЪшuІ%K€С>• >p#Ў@z„нЬ"щ|/‰•7š%Y"млЈокО4ђ(§ЪЛРž^…и2tђвh‚ШЪ myћ…SшЙЈЧЄ§КНe0*;|ЖАS№Nrs+Ж—ќЌiš ~…‚пЁФВ}šˆ^fМ3еVBJЁИФ]тйPзє)P џœОХй7E‡бEdНЬ’х6[Ћ*‡орЕ^Є,?„.­иR‰‹ѓ!нFШœо€ыAЪЩ#9pvвЏHoXšЎіŸи(s5obZДНЪbLhЏ3ФKЮ| R[ Шы‡тOќЕљўЏЅК8O$>-сc3ьЮ‰xw]s4v§›TОˆ‹.ЌL<`юБG‡тИm*А&~›F JІ .М'ъFGU I wЗМ`{aZo і.т”сX\KDM{(@ŒЖ;ђVqcc>.?"qН*‘p#тmшФ\ЉЫак‚D•>т‹ Ÿ˜‹‚ 3є~Й'Щ@ЮGŠъ& hWмF8&6йOћUrЈ§q~\ IfqхоаХ(šС{<ЃСР“JгjЇчž$љ%m8ѓ7лu’œ8ѓ˜С§юNѕ8VЄюА‡іCКЪ:­n}AfgЅ0OпюMiІА4Dћ—є3,OЎr‘фзУ ^8t&iК/ЇЕелbВЧ DsчцттDfbѕЮ=,oўьЕЄ б #у:Дˆа2;ЕvЩ‚•˜Q=3Š"H’ЕяФ{3НЦˆ'f‡-кЛNіќНŽвm2эgD fН -Ѕѓ@xЫИяІA”йѕ*шЋnз“ЅPИє#ir< <рNьуЁМˆ:7aіЖЙуP'hNrqJwЗе“qЈ~”№їsХ .§ГБQьУFЙNLЇвxаWпY­ъNхЊЅS:х( {ЙWa@Џ\џФ™f*cpl^ Ј^ЏC1Ч’e7эYЄ:ВKvоџoпыж]&žњћoŒЇGѓfxJr™г qSЙяЈЩ;EišФЄШRЯue.œ5Г)'Z­Ћ cИ8T–€{ЖГ9БъяŒ_:fpJMњ<‹чI‰nЬSГŽі(#`BњэЬIјХ’˜%ГnСшrѓ\+ŠЁf%Х6ЩўнЫЧToŒћФkЃэђКо;uй”Ж‰тD Ь1>•Лњ‡wю"Q!е‰ЪпЅlьYsщМћН3Єz”0з\­J ­врukѓУйQЮзёJ” ‘ЭŒ>!v+3рA‡ЗdиDnЕдГgžxЪиbИ*&ŠфР•—Э/oЋfBѓžIE…ZhiGH}Н'5L↧ўфЪfœZЖIнFЬ+јGы QТкЕU­›–УЈ)cъtQ”;“лŽ-$Q8‰ЌHˆ<›–‡я–[ kQЎтpQv‚ыzЗтrp‚э/'Rm(ŸЄЇї€їњ œjј•>6  (КюциЈЄЙdnэGгК=KАŠІЦ MrДсOфe›˜Е„Рц=X€ќ—ф|6єѓМд[NЈ(зЌЇ­–б”=Й—[;iИЖю˜щЭPLжаїХ4!L‹œЖuWЦ7­?1ЯгЇ…`DьлйіОУ_ЁЭіT1ˆјРŠxі0|hш­ы2чBŸЧ j•ЙѓгћЗ (ƒUB7ђš=лЦуˆиЉјЭ„Ж'YСюН<r§мaч}AОсјЄ| ЩоФё~NЭг\с|t>лNЂ&Њ­{$КЊPBЛqhR>-)—Вuр8*GчуdїЯ*'?V XўЫ‹їўwj˜ЎQvЃ^1…REЂ *!Мq;ctQд&шP'в$B‚зŸдў<м`vњмъkžЄс]9˜W<ЄГЯООшќбЎёкеФTъЛѓђ’hД;фVз,нЊДl3Џ*fгVn"ШHgmQ?OŸ[жE'ˆ”/Ш †Є нr5ЛPЦ!5AШblщйuЋ$Žрь™W)ОoЎ$u7ѕМ*‚0хСЫ­ч—MЫ‰ћ НОD[аЭ7ЧТќІп?х№Œ}ЊЯ‰Є™“ФL`ЏrЩjМЭйЄRФZnœal/иЬs<ЫS5nr 9МЯйrЅ4f-Wq0H+ЛR{днтыпІЩЬљМЈ{ћЅUNSfЙЩЫьЁчЗаК-‚ѓ_kC:f—“`}Х2F/Є%хC!žОO4#ц€hюŠМЃ/•uкЩ8ЇšЪK’гбyњW hЋwсOъ`u`pєU|kщ™ПбœјиNА˜Ќ_Цх˜4‰‚4еі„4Ш’т~oФg{?[ŸqV˜елžї‡’h>‘ хпЄюђ__щsЛž3žjАuњі”sЅsђw+4‚Ыl№ї@ iЇщXцЬд'1iHСHяЗ%*GЌІХ<-šŒљя2&џИUњW ЪbЕ43Џ9ƒcЪмЮОЎLФQ)Ц!•+HeЅ2HялПУРc™oЪ]цЊy2IцWЭ‰с# ќР‰”†ЉdЯQќtСо”У—W1ЫEš— ѕу‹(–ЇЗMР9qNy$ЏЄУ}ІSш›‰чt’†ыф>Ё‚6M ˜ШlТлх-=м‰)ѓЮ‹нœnЄ‡РИЌ9vRТU‘К%uVњо5:Ьsq~Ћ \ˆ’ЃщђПКš<’љZ№бuГ љgђ\š3ИрфЃa{љ‡™Ѓ|“ч… zБAМщс;|тP#aжoЅ?’œ1ў BЧъL3З0њЂ‘by•ИŽЮэ4voйЈ#@LЎП“7чgПц‡фНрѓ}юƒк€ЉЬoЕЄxъІ…—t\tК>T}щfщпе˜ТюЙѕ”˜жцЂгщ§^ѓkХ‘ЖЃj М!AЂЯmšэ.…I—§aŽъМ‡f^b5€JБЖAy~Dк3O~ŸЎ3Ч‹ŽjAмo xхї i1=q№x.ŒДw[! Р‚9˜QЩ%Аdїй‹8]ŸyщљМj!Уaѓ‡-!Џpх~›JТršoЫ\ МЙˆ‡)[oбqjGMЄsMbš№ŠЇ<щ—}ыІУ>њ4qqYМ=ЬЭŸЉZr ѕ^ТЯBkў’"Aіф6K$в?§pЈЙєзмkvѓ7к‹кg4ЯлN–šХcф`CjGШejy^{6аФТyо9иПwюHЈGv…ЏЏЌ’ђlЛkдƒQMgншяг y$"yШŽ{ щ†ПŒs=(З А5—n^4_Wргc№HзљMъС#tхzСЄYtћc‘шѕ%1сjІšЬQд–>/пš‚v’Zyї)ШЗsЯD[ иъІдз@Рћ*‰хJСfDAbsІюX №jЂ›‰^P@щЗK;J/_‹?АjGWBУiU JЅhђ8o ЈL+єˆЫЕЫ‰дZђdЫ€[p—зШVkдЇуЄЫяћђ/уŽ„Š7t˜МвкўфhlX> ХШwuЕ@žшэjBс0Й4FŸЯЮ‘dk4р012А§Ќлбупэъ”СJ†"lSmы]тдiўЪх‚sьГ]аОФaж*=~Ц'^Ї`zSЋ;Nќц,л;УўиЕekedТžХћЎюY"еsNРБќ{žёХ0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 616 0 obj 7171 endobj 617 0 obj 1613 endobj 618 0 obj 5026 endobj 619 0 obj 532 endobj 620 0 obj /BFLVST+CMEX10 endobj 621 0 obj << /Ascent 40 /CapHeight 0 /Descent -1760 /FontName 620 0 R /ItalicAngle 0 /StemV 47 /XHeight 431 /FontBBox [ -24 -2960 1454 772 ] /Flags 4 /CharSet (/parenleftBig/parenrightBig/parenleftbigg/parenrightbigg/bracketleftbigg/bracketrightbigg/parenleftBigg/parenrightBigg/bracketleftBigg/bracketrightBigg/braceleftBigg/bracketlefttp/bracketrighttp/bracketleftbt/bracketrightbt/bracketleftex/bracketrightex/bracelefttp/braceleftbt/braceleftmid/braceex/summationtext/integraltext/summationdisplay/productdisplay/integraldisplay/bracketleftBig/bracketrightBig/radicalBig/radicalBigg/radicalbt/radicalvertex/radicaltp) /FontFile 615 0 R >> endobj 94 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 622 0 R /BaseFont 628 0 R /FontDescriptor 629 0 R >> endobj 622 0 obj [ 754 1000 935 831 805 896 870 935 870 935 870 736 704 704 1055 1055 352 384 611 611 611 611 611 896 546 611 870 935 611 1078 1207 935 352 352 611 1000 611 1000 935 352 481 481 611 935 352 417 352 611 611 611 611 611 611 611 611 611 611 611 352 352 352 935 579 579 935 896 851 870 916 818 786 942 896 443 624 929 754 1091 896 935 818 935 883 676 870 896 896 1220 896 896 741 352 611 352 611 352 352 611 676 546 676 546 384 611 676 352 384 643 352 1000 676 611 676 643 481 488 481 676 643 870 643 643 546 611 1222 611 611 611 ] endobj 623 0 obj << /Length 624 0 R /Length1 625 0 R /Length2 626 0 R /Length3 627 0 R >> stream %!PS-AdobeFont-1.1: CMR6 1.0 %%CreationDate: 1991 Aug 20 16:39:02 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR6) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /JCBAAA+CMR6 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 43 /plus put dup 48 /zero put dup 49 /one put dup 50 /two put readonly def /FontBBox{-20 -250 1193 750}readonly def /UniqueID 5000789 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ*BgЗNГРгН ƒи‘lІЪKq*оВXњЋšццwќsŠМ|QЭFяq˜еўцv`цšzЙXђšMyхp"їƒыЛЖдєь5OвоЫЉ”YЄХ№ЦыЁP(DTчм!С[vДС›„67XFšlU‡…В&3!R˜qЉˆ4‡нw”’нЯƒ~j‡И+лёoМuњЃ “ў\єщв@[œе6]nЮезhжmlha‹ŒH+4ŒЃŽ›ЙКќњ­œ/?а3Ж&˜nд=œ“a6EИ#’еЪс|Д~.‚мд…ЫЁ}џљ_B$Я~Юф\ПЗШЧ|" 4Pxв>ЫјЭТўP%њ ЬХяРФј~Ыэнп4фєqЦн.C3sш›МqчПˆŸb“y?яZЩн7’№2уz6Lp‘HCїЊ1Dа"Ў28s B ~ ѕатOPQљЭьс їсOё\OѓќЄ}йЭдlы4x<ŸƒџKUћžhЇЩX@јЕK˜юy№жАіQJ@lRJ›>сц… Ю^У;хыC§ї’џT—QыЇЬђ”Ъ[I/Ј=иG6nЛѕ0цX9ƒqŸхч(Cяюkщэ W„ЄЋ0hІ%qЪ~љјYPxŽ*zzЫE<БЉЭ•ю›KfIXЖ ŒнtVY"Ђm1лJ4Ѕ qXуxО*дЄІhhЙ+\Lr HЁA#ЩЈІr3з'Ћ ІВ8­­6КИдrM‘™ŸFќTщ+Е-З1щ'=SТgЭЮ]э’iкжЧП5qшЮ™Љг0ѓїŸ {‰чN‘Ё=XхБIи;JьzyЭй;Џ†В0єгі˜ДV›d4Tp№§/3ђ5шG-_(?˜–DРўHŒіYЏЅeЖu5яЁўуcп‘u('КIFV sтpfўј}‰ћфВhpѓЫ3Узt’Dлp"л1єјЈКй;жsщ"ƒЧ]‡І† Z:*/Їцv”1Б­вГ9Х;( пu…iRЃДЖkOУNЧ”ёдКE]0аyя{Ѕ1SхFх —ЋО!ц_X[Ў№ШгдX~‚в1­ЉhF.”,ынбМpLDР€M:ЯФ(Oњ']z!ъюšЫІЄ8В•Ѓ0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 624 0 obj 2885 endobj 625 0 obj 807 endobj 626 0 obj 1546 endobj 627 0 obj 532 endobj 628 0 obj /JCBAAA+CMR6 endobj 629 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 628 0 R /ItalicAngle 0 /StemV 83 /XHeight 431 /FontBBox [ -20 -250 1193 750 ] /Flags 4 /CharSet (/plus/zero/one/two) /FontFile 623 0 R >> endobj 93 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 630 0 R /BaseFont 636 0 R /FontDescriptor 637 0 R >> endobj 630 0 obj [ 826 295 826 531 826 531 826 826 826 826 826 826 826 1063 531 531 826 826 826 826 826 826 826 826 826 826 826 826 1063 1063 826 826 1063 1063 531 531 1063 1063 1063 826 1063 1063 649 649 1063 1063 1063 826 288 1063 708 708 944 944 0 0 590 590 708 531 767 767 826 826 649 849 695 563 822 561 758 631 904 585 720 807 731 1265 869 842 743 868 907 643 586 663 656 1055 756 706 764 708 708 708 708 708 649 649 472 472 472 472 531 531 413 413 295 531 531 649 531 295 885 796 885 444 708 708 826 826 472 472 472 649 826 826 826 826 ] endobj 631 0 obj << /Length 632 0 R /Length1 633 0 R /Length2 634 0 R /Length3 635 0 R >> stream %!PS-AdobeFont-1.1: CMSY8 1.0 %%CreationDate: 1991 Aug 15 07:22:10 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /AJDAAA+CMSY8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /minus put dup 14 /openbullet put dup 48 /prime put dup 49 /infinity put dup 62 /latticetop put dup 66 /B put dup 112 /radical put readonly def /FontBBox{-30 -955 1185 779}readonly def /UniqueID 5000818 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ/ љШ­щйРXИ~›id}S5žQ!gtЄъЁтЕŽУkбJc;•rДNŒ^єЂЌЕŠ ІX€5П.иSyƒŠ– ў+'ъIУqV˜œ…т:Пrуš‰#,йє#Ш ždшBZЃОїож *R’*"7йЈнyнчеќ! ƒž[RпЛ*|]Ž~Š [ъCжЈэaЏ[#д™ иїЋjY!4иJР‡ІЭ€ѕнйв"ЌБТ3&Їejc\J$Э2Ы§ј62ИЊ6сwѕIaрUЧIЏђrфnЬFB/€а“(Hp%#ћкЬO.,ЪеёsќОnнИt­%\ехРјb9?Ы_\ œ<+Еˆn6ќ<Ь!H<:С“HZFщв+з ”фдZн›ёЬ\іЅ VTЌ рк=ЕcБ8@К0ї.QуМ€~>fЏі S§ІfёЋ/н@Э ­’6›њŠMп+ŠE^oЈ!дL‘~=Gџ‹>"rК -їбgjэ‹‡єЩŸЃг–Ѓ^ŠЩб šyYМЊЯHГтU!Свомšѓя-ѕ‡6Ўv7Zm€“ '§“Ђt‘›mЕjфгКhсžФxЎ‹к˜Р"lд,ЃСt…eš1юџ‹hkИхhя4ˆ8№œ{Ђ­хђяЋдLЕСMХuјПяц0Иy'А\2ЪЗy‹iђWХrFЛЫ0‘bљсCkЗ@ьЭMп‡i@7Ћрщсhr‘jёK]єЖnl­Sє~ Єy„ы*Уrђ ЫІE55МFсЮшGФъ?QcW1\S` =ДYnkNф%’]Ёђ9ДŸWђI#)F=#иŒTк/›ијƒВJЈcGЖЅmћПЂпјВ9ЇylМВ†ŸьЩчeї0ЕшbwПŽž;]’BLcш'4ц)Џ­љGd§опл•“KL5АœR›4БžV_AИ~Eƒh}д` ˆŒaЃ<ЃaЪ4Ф7"ЗС2Œ*K-ўpєj:KoS*DJТ§Ш…‹oІ˜ъPƒa‘J6б]CwQA…3Q$ŽОЁђџфI:ЏшGШэd=6d3‡ZEO:HђAhЁх‚Ю4№…пЙj\I-‡^5bзЬ1Б‘–бцЭ’Œ OПKГЬАЁW\][Е]kЗдŽЋЛ` @БуC?PyмŸЖпƒoMЊЏЎaКR/ Мкx’` ŸПІ@ь“ф…E_Kˆ…3ЌnЗпgоVXŸЦY‹Хр|ŠЌђB›  b<=<Ю=)‡ЇжкЖАДЫЃ“Ю+yЉЙ­е?ЕЏ5žЌ‚їБ„Ѓ“­‘яоК9e†1ž**ю| Џ з4!­еппSж†ž1N•“ъ"ЅOYЬБоП"Gšž“їг%цљn8 У"ІёЪЙаЖTIЮGЗaІ nfБ!o˜GЬEЪйРw"Im‰8ЇVњлњвTТ69нh0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 632 0 obj 2882 endobj 633 0 obj 887 endobj 634 0 obj 1463 endobj 635 0 obj 532 endobj 636 0 obj /AJDAAA+CMSY8 endobj 637 0 obj << /Ascent 750 /CapHeight 683 /Descent 0 /FontName 636 0 R /ItalicAngle -14 /StemV 89 /XHeight 431 /FontBBox [ -30 -955 1185 779 ] /Flags 4 /CharSet (/minus/openbullet/prime/infinity/latticetop/B/radical) /FontFile 631 0 R >> endobj 87 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 638 0 R /BaseFont 644 0 R /FontDescriptor 645 0 R >> endobj 638 0 obj [ 664 885 826 737 708 796 767 826 767 826 767 620 590 590 885 885 295 325 531 531 531 531 531 796 472 531 767 826 531 959 1077 826 295 295 531 885 531 885 826 295 413 413 531 826 295 354 295 531 531 531 531 531 531 531 531 531 531 531 295 295 295 826 502 502 826 796 752 767 811 723 693 834 796 383 545 825 664 973 796 826 723 826 782 590 767 796 796 1091 796 796 649 295 531 295 531 295 295 531 590 472 590 472 325 531 590 295 325 561 295 885 590 531 590 561 414 419 413 590 561 767 561 561 472 531 1063 531 531 531 ] endobj 639 0 obj << /Length 640 0 R /Length1 641 0 R /Length2 642 0 R /Length3 643 0 R >> stream %!PS-AdobeFont-1.1: CMR8 1.0 %%CreationDate: 1991 Aug 20 16:39:40 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /NYVDLX+CMR8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /Gamma put dup 1 /Delta put dup 40 /parenleft put dup 41 /parenright put dup 43 /plus put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 61 /equal put dup 68 /D put dup 78 /N put dup 99 /c put dup 101 /e put dup 103 /g put dup 104 /h put dup 105 /i put dup 110 /n put dup 111 /o put dup 115 /s put readonly def /FontBBox{-36 -250 1070 750}readonly def /UniqueID 5000791 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ*BgЗNГРгН ƒи‘lІЪKq*оВXњЋšццwќsŠМ|QЭFяq˜еўцv`цšzЙXђšMyхp"їƒыЛЖдєь5OвоЫЉ”YЄХ№ЦыЁP(DTчм!С[vДС›„67XFšlU‡…В&3!R˜qЉˆ4‡нw”’нЯƒ~j‡И+лёoМuњЃ “ў\єщв@[œе6]nЮезhжmlha‹ŒH+4ŒЃŽ›ЙКќњ­œ/?а3Ж&˜nд=œ“a6EИ#’еЪс|Д~.‚мд…ЫЁw,ф"Лrƒ­g[eHЇъiЈƒьЊ>žЮu†жЯ ŒеWЧхзЊ>Љ~Кг–бПЯJmdv‡Aэъ [ћП4|мО.зV–zЖлФ_ЂЃ1. FЅ§fЋ |XџюФИ9^Rw] ќзлŠГ31S\DЄЫKZЭW`– фP”Š^ън3ъ ’eлŽШ Э8`2?вl;ˆШŠ!eXxh Dfњ@=$Л—*IИBС€фвXЩд!аWx-b1ƒ Ѓ™ГХђђнC; p™Р}НтhаџэQiМа=HВ№X­bиgŒbmЧЃѓR,™К–>љ_ŠбИАгQ! фТХZиžЖAr“]< Ѓ˜ѓююУQ–jt8я?юB,mN3v еЌЧЕ+э˜Kњ­6я t‹а{фAJc—Q%вrњи?vцџј60ОRmXsХЄ+pњ‘ЧИiё:ўUыsѕ‚ƒ‡“ИЬ)kсмЯP§WЫ\~к;’э” 7 T“.ХN Й„ќЄЋ}.Ё‚Мё&:ЂDА~Ръ’љЏ4ГLDИV­С№5bцŒgфЈAN”гЊкб&зщЖћš+‹Т“ЇФЛ•Щ‚ЖЃЄс?ЬщР ъь\SeаkщЌісЯdфŒVѓPzjmSƒШЌпЄj;-ш0@€3q!Ь,ayШ ,Ъ–`yлЊiЈkЗ9kmosrAћ~}wт‡к‡$ФЄtКѓЏЮтІt—Ўт&px: ЬпJ,‹ьM†eАђю'–зEA"NѓL’Ыў?ˆdFЕЏGлЉНSЇэњC§;Xіn•RЇOIZ„nekg=ы{Здwм/1Цtsy=.яsю ­%Ѓ$Ÿк@OќяB\5]Ћ`єўoY%ˆž`ZЩД‡>`Б",нВ€cЌЅЅТУhщUђЉ~{IЌVЁЊ žs(ХмM'Mgl’MэTФD'‚lЫ‡UdЋјюx,CRЬn”ЇP7вб8$)f^€9,и&N`ѕt““VDAЌjзпгь yYЙfѓBџ‰є`ь‰ЎЕŸFШнwхuqЏ%e`ˆщhС2aљIМ:MєUё#@"IlЂЇМьwИ*шiъщьъ_ѕ`9dRBЩaV'Œ/еŽМфеTpМУ‡ЙfЫэЫ !OZ“›ўNђJodЂНЩќI’,VЙ‚(н7йат‚ВЅld €cYєЎˆyЯќ’YїCу3ШО?ѓвŽd'ŽЪ'TћЙœPФ&ЛgjК [5S‡u*УЕИ ‰Я0ѓѓ:кЕTяšYъУ­.8Sƒм–—  fЫ†ЋM)ФЊЉ§Œ7‘„Б`CdˆB  o=%В_k€чШOФ>зћ{'FоЛvkРгПw‚єЅЫќа7є5§dХwkxH;W“ћЏJаѓњЫVSчЙ)|)ПOяkŒiщЁ+BЪ­їыЙи@HёpЬсП Ж“АЄи~Я;екЕO‚Œжбчѕ7)я4X €?›œуУ›Јаї,2ZаrЬЮ1ЂЛ\"€ЩЛ НђцJfm9k‚шъЪ[ŸЊ`гNа 3:КиМсi^Вхeb$F•&Ы{*ЇJ—@?,01œмІu9>< нUАuŒЃЉtкј­ёШэећЧЧГ#№њl„ЮЧѕ’”Зд6žПЩ Šп"ЋЅnЪЊї*Гв„mЯ+-tс„СmuЉ!,z*СљПЉњ:Ыb).ьи3ј)†№QНЫЈЉVD‹ЪO4}ЂhўCЎWWlЮємL_Б™Fј”ŒBZDŽ“цœвHЦФ„G€ЪІпФD WŽђ_”аAРўw…zуЃ r*ыLАœxІЦГ’ЪьшPлIы|ьBш*шЦ№m8ФўАЇ оdф ™#Dй*—ЏП žњлё˜‹VO†/&ч1?Љ/@ЙзuiЄ4Їбv3jН•Ы‡{бљI‘еmфэџ^ђI"#S>F %gбJˆ).™€Ећ\u *,ђADЯИѕсЄCѓ гДь—ЌлЄ25у_)ікeІЖлЖyЊBŠ|НЮЭ`a§\’Јъ<к№ЮpЋ)-@z–є˜pnЬ>б–SY­$oђŸеn~•UfdУmА„ @ˆй’o™MEh™E“й™-„KmbДМЦС…тЗ2ЉШбЁpмT…—•йAкХ­/Вў‡›Хž—8хэ€ќХƒјSя5tю†Я~D@BЗХиzВ0єЈ€фИ02пVŒ5f№ър,1Чъ; п б*Zgкж%цк­іЫЏIВїџeЁ§гт=|н\dЏсJxš^ocдЮЈ…‘4Кc_)ыц6BhЉХsЩ›.‡а;7ЗЁфБЁъ?І‚’wŠЉPЗ']ШЖЁ є”юуNlЂkИ­ 9з.АУ~ЯYŒtk.евиNzЖЎДЛв Њ6HђЎ?ƒЫЭ‹YVЎM’'…юЕБe–пъѕ[ ќЖ!Ёы­[ёнмХьtМЧ”BzЙ<ЗUŸ'm ”œЦу1yuдБѓA"^•ЉјЉсm B56РХќј§ќ!Œ№К(ЌжУвEHжХ-XQ­р_ їhЅU<ш›Ук_цЩzѓ§L›Ќ“-*шkІж–ѓЉŠІМ}іЇБХыŠ"иДШѕzA[C5ппBЉ:і|щmZ‹2•žТ{œg>”ќA"єЪb^Ђ˜ )І.‡К,ќл­,VдўFѕрRN~оЪ@ЎmxЎ?Ј­сЎ,ШХIЁњ‘”‹6їНЧŸ[ўxm–qz€ы"сYІЋдИеlлщюŽФмФЗ1]zZПйQM4;[ћБm›ЙdБ@Ю=aг“iаЄ„ љгDѓŠкuœ& ФЏ‡юdйPв˜џ…•R_ЧѓšьЧ~Ііљ)\ Slwfё4dЇіИєр€5§}Тz*ж6iДtЎ*_ є;F tќжHZЬевэi™й гь}мŸ]*КnЕгkивS}OKЭЄЖъSEфОь79тќf{YDІяпЫѕцašMSн]hWEoR шН–.Мљ H 419}nрыgDc$„це[9YКВчNš‘CŽŽАš5БКшBЈ-йo!‘Я3яbзРl‡ЖЕО“‡Аˆˆxkšc;џаp.;)„.=”ї%ЮфудоV=6}ИЬХoИ—ЌЎ–Š9*›`a§џm”FжW|$шbТэAмc—Ђі6§RЂzшоч6МdИvЬžЫљнЏPю6?Љ<;ђF и€nwдвся5БF/P”*щйУ|~зn—B8:*!Є7™ч|Ў UЮѕ љA!l˜yш\Uўв3%k.˜!ЋлръЃаёЇ@Ÿз•НЮэФ/fL:AЦёV5~gLР7˜"4;њЯз5]нВгн{•в Dь1іОпRGВiХKHXŸђ˜›qLPїetk ФЦєиХЇт}dў6NE6WВЊБї=‚ФбѕПz+цdŠ^œЎš~кР§a^* п{$ŽБщЫ'jiёMн D&ЪЫ>я&/?s;тпPIY8§б8^ВьЈёнјЛbЎЉУџЯ$F>š§fд{љЫэъ‚АŒZa‹ŽО1Тџ]АaнПќg.|W№ddа;жS%Ќr(OE‰sиgjЗ-—&Fl`HмŒф"ЎЦO7sЊхaEЏATVcз2†І; zr‹3%зЦhsj ,|‹ќЬ„єjИWП 'RлИtEџry ЕЫЬ’У2’ЙЮzƒqOъМЬРзё}–LЫƒR цыбЧg7ъцWsџ@Шj5HSпg)˜ŸM9 lјіƒЮYщ‹! ѓS*d†Ÿ $QаYт„БЃОS8цiЯ[aЖЅ%эфh#пWgнŽbp^,г)cžDђŽ“ЊѓK—AFm/и!гMЙУЦ…­'ЙиEдКФ‚'|b<Œ v;Y:Š&fЛ‚~Y#cšѕЏ]ЃsеђљА:Gз—з Ё…šщ87Ж‘УѓŒFЫqВ†ЈPV‰M%›@fЇїyPœu6в)L’UўP™fA%'xэОjj”даЧL J| гЄЃ„ьўЇжда3U–љ ЇV ( #ŒyЫЯ›–Вi;ядЁ=™tf ЭoебљР‘гl:*p|–v\а”ДјLа“ƒŠ‚‚'‚V(З:v3V&шМ\jQR–ƒ'ЛйM2бЎаšo‰Ц8JЗVabyѓСuёЉа‰п{У-ЏдсѓЁэP ‰›сЬДо‘ЋэхhЩЇцљO}t+т&`q–~Ч„0БЉtоZУ"В‰со{рю,qmh<АЉ1Чц#_,P1ьЉdGў•@ЋљК)МJО{Nц§ќЁ_чCкф*P€хœљ\юЙkшП,:(#†pіЗBwžlXB5WГˆ'wћЫllёДžд[ъїŒГпсЂ‚…ЅпДеь‡ОЄэgk*ЬhŠ-<шHВB ,x"ˆXюѓблW~д]T,2Ц–]ws<цж3оw*{&d$fœnR)ќмBр,Э(qЕ$,З'№ЬKьЪrt!ЋЮŒРq?Q#YЯ b‚xрїі*р!z1e†RLT†!н“H6 ]џŽ &=ТчuЂђc\˜Ъ‚‡ Гк-у›б€МЂChФыUд†FDВ™qТВДЛЇїšЛћœJеp ќђп7аФ&uvjїлМЁЮžщkl"ІЙK!VRБn#Ph8™$0­пDїЫ‹Щѓ$х™Ј{ žAVд"”AOс€_–њУv›гЊ zУ`Pe1Јь‹Œ`К1ЪЕ8j|4мЕкж;1%пљ”итВVъk0мЛŸ>ЊIЪяПE“a‹]СY)‹yёВ‚K1\:Nкн\ддПЉ|}Yцs8­х#_zуыЮQŸйыш%Я0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 640 0 obj 6721 endobj 641 0 obj 1172 endobj 642 0 obj 5017 endobj 643 0 obj 532 endobj 644 0 obj /NYVDLX+CMR8 endobj 645 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 644 0 R /ItalicAngle 0 /StemV 76 /XHeight 431 /FontBBox [ -36 -250 1070 750 ] /Flags 4 /CharSet (/Gamma/Delta/parenleft/parenright/plus/zero/one/two/three/four/five/six/seven/eight/nine/equal/D/N/c/e/g/h/i/n/o/s) /FontFile 639 0 R >> endobj 86 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 646 0 R /BaseFont 652 0 R /FontDescriptor 653 0 R >> endobj 646 0 obj [ 643 885 806 737 783 873 823 620 708 655 817 682 596 547 470 430 467 533 496 376 612 620 639 522 467 610 544 607 472 576 632 660 694 661 491 632 882 544 389 692 1063 1063 1063 1063 295 295 531 531 531 531 531 531 531 531 531 531 531 531 295 295 826 531 826 531 560 796 801 757 872 779 672 828 873 461 580 896 723 1020 843 806 674 836 800 646 619 719 619 1002 874 616 720 413 413 413 1063 1063 434 564 455 460 547 493 510 506 612 362 430 553 317 940 645 514 535 474 479 491 384 615 517 762 598 525 494 350 400 673 531 295 ] endobj 647 0 obj << /Length 648 0 R /Length1 649 0 R /Length2 650 0 R /Length3 651 0 R >> stream %!PS-AdobeFont-1.1: CMMI8 1.100 %%CreationDate: 1996 Jul 23 07:53:54 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI8) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /QIBDBL+CMMI8 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /alpha put dup 12 /beta put dup 22 /mu put dup 23 /nu put dup 25 /pi put dup 58 /period put dup 59 /comma put dup 61 /slash put dup 64 /partialdiff put dup 65 /A put dup 66 /B put dup 67 /C put dup 70 /F put dup 75 /K put dup 78 /N put dup 82 /R put dup 83 /S put dup 84 /T put dup 88 /X put dup 89 /Y put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 109 /m put dup 110 /n put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 120 /x put dup 121 /y put readonly def /FontBBox{-24 -250 1110 750}readonly def /UniqueID 5087383 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ)s™Ї„ЬО…Д™;.ыо;дrЗЯTeђ…jiЋ–эK­/df5рЖA|Ч{S/…иЧ )ЁšSяcы\^ШŸЦТm‰чйфpЗ+як#ѕпvОЏLщ17ЂэŠЉзж§ѓ~kЭрй ˜d#х– ]ŸЛL•eVшпЫњьGoЃoйЅШ\šѕўйТнвkм ™9‹ŸMжЈ№[GЏ•я(ЉХaлм˜Ф|ѕRPщ6nЖ§=: Њbуей9s2m4{~мC‘ЩпD…Иќ˜д%Хx’нїSd,е&ЉjЮкA x"БаŸ—”цmбЌ,+;ЦўХboB|еЎœTЧїbУoIГТхц*ћVмю‡DZЉBСJцбўЉЯŸЊ2a{YŒх‡я0Qт(ї/e@­™ЇAђGЦ€цŒ„щбаП™Њ]w}ˆЇгЮвъgєЎaшМ•чк8.‚нВА нcS,tуО^ХU МЛjГ‚†зq.’o†–ƒrИ!N›]@Сjп §GФ“75uЦЪ‘фmˆо$ц‚оФKWъŠјNWдVF2Pи,KPЫЛ 6™2aƒѓдbw;SГЩцлBжГі{‚ еu&D“CНљњЯhNОу›e^БНL2Ib^ЧžY6ў2йђ"CSђЄl5Xя!okВЃКїRОь6ФD UjяьєTК|ЛЇS{ЫыТG3:‰‰6A…|йѕžК АЃйКJ 3•3kLкKІEnMpњйНЋЗђqМlHйпZoЎxV о|”АИыœЫ]sg‰Ч˜Щд"$ЗЩoЕБЮеъкi}tѕ1† ^гв/ы/j$Ћœд6 BZAИлŽИ'9&%ЙёЭБЬ увl;HеРЫ–5т[ЄЅcdУEёšЩ>qœkZФрмЙ68і‘&пZ- ђ\Џф,h8іУФe0ŠАraР}5цЂ­5к№уQCOrˆЊ€ї/k.2ДЎrЋYЉdЙ.^6–b˜`Єим л ‡ЅyЊЮЖvЁб[ VгЛŠВФU  pвЊ+y’оЦ[rэ3WИ- й^ˆ|q{=ЊЈЮXд­шћ'ђзглrЭo…˜m )и,УяIpŠ‚ОуЌЭБгGщX6пnшEшЎ|Ѕщ7ЧшKsИ~€wС$G:f )їЂ]Т7mјЭ`8Э"ЎdъyIНhбП; Щдœr{œcЯEЅOžžšРlА ЗаsЊ0sИV9ИѓƒYoжДѕџyE@ Рj?Н…чdK MhЗX:~№Ћ”Я:Ё—ЭO–э  њZ]i9>+ь2ЮМЅ:<В*р™ШLз„ЊЋФ8ќЧОV\?ib бхž|ƒ %д7)yь!^&Г"в>ZсИяX"Dѕ…ИТ;icњъ˜ЦЧь~™7‘%їІŽТeЅuPšYѓ6ЪЃkASzаоi‚Wж­Ьn>БєДј™1—I],-цВ‰˜о–ПљCРŒѓэceфя|’C_Oѓ=#d<m|I.ў&Ÿ1@eR!lпо†dЙЊvœ1v‹ђ‡ьNН-†гИ,ёvц˜(QЬі:У7ЪЕO;RJРˆMМFТ3б\TЬžhц…Љ™іщ)ПШПJŽ-\гЯƒг‘ПuŒђƒ†Š6SX›џ„RєZќкLДnпАц„Ц3{  pЩЧ№м;ї ]Цд ЃЖу)РYеЃСИLEмИй—nЄƒ2 Ž’чдˆвPв;е№hvЅVЌЃУ2—1ЩЁяj ѓГM П{рGПСЉ]Лбl†PЁxsЭ1Nѓэ!*ЉзРЖzЪ6/Щ8\DG1–{нтsЄн9ыZЦшьYf€†Ё­BoПЕВаšЈzђсŒM_ЏчŽзЬвч‰іŸБ{GpЁj`# IбљEdткlSлЪЫ ЃІєE5BШDбќЬ0%Uџє>fєТ>Џ„“MEŸН|qZ§F›^Иˆ“xРТФ ‡SпЏE №bяZеtуё6бВuС@ё2иk.(+`eW‰є ж+…- G”Ф_Оv8^аšчSЈ8Ž(ЊЃˆНи~ЂђЇш•іы'VЋЭЁп$Ѕ)!ŽюxЩц1}f0(vЎТЭsЭьпЂуƒw™ѕ—žР*;Љђ(:‚ы№‚  (ЊiŠ4~:ХaиЁOЄc‹ФШьgHs3E02Ќ!уФз~Тў[ЙœЙ„ЌPBHсcюв]№i§Г'ЭaЊW~б,Ѕ<еr’gЂxКоыMм`Sю єQгн_йьpьcљЦБ %рHL7%ЅУс‡–†e2šо<ЅЪSŽо[lVhЃk03L бŒП/ƒ9&ЪЗВСГ~ъvGб9 щNдS(ЂФѓђ'„y•5Œ* @$ŸА^j‡љП•н№а§м•ЁFZи]КI5HЭ;яŸјЫ­^ьomXD V ›ЪЮSTЕ~ЮО…'Ѕ?єT’юП0*МWTЯЃBxDвШ'JлŒqв82`ЫЃе,ВZгVŒTЭ9ŸЛFhuЈЧk'ЮXqLBl šsjM˜лB'Кѓw5ч‚ЭoврЭзXм#|/EМi‘Єe ь ЂЗіЮ] ѓ,Ѕ§š>ХdУ‹pkГџbCЬŒibдз1ё˜!{№„sЭ”;Є‡џСЌяVЮRvKКаћи-ц%Й›'шфКI$R:uIKўЎеœЭПƒ›Я˜№ѕН9•ANНКŸ,[ХЁ„В ƒЇi‰гїз(ІаФ-ЯСўbaв—M<У*vдДСїT§ѕуkяфC-‘фRОЭъўЄј Лё'Mк.јљ8ЛЏЇмN|Т ЬХбЂ`QJKЂk_LuN?ULuC„Sяe[ќѕ§ЎHЛs{EvЪbЬžq!тћ49еWKИ †;q8Gry[…\1Цu=ЅээО8ћ={^ъТw) щЎ‹ёїРџцŸЅ:4y•Уљ G лжа[ФЊ”яЎЪvœ:Я6ˆвŠŒ%B ueW—кhт”ИŠУІ“\Юz+ƒх­„Љ0&†&Е*л›лШ@БГ О@\у” w ч“НB@ОSьiУxЩ|АдЯс‘М…gxœ['ЖЖj'‰йф%Жk3 ф1k…‚gЊ(wcbOг[й1” ZяБO#ЭЩ#Щв3мИ BкMСОsє†.жћNZ јУИa0lЗjз_("Џb_Јы=‚Ме14",GCГ+ntuƒJ§DЖЪš1гЋ™ЮW&z-/pППЩiађxmћаLФ‘ Аєъ oУ‚Ањ’!m_#0@R]Eя,б2”ё™u~џы Ю’-Я”оFf$GыHУn3‰“iыЕ№nˆЃFƒ•КТжђGёФњ$жщь {EjоЬxю/SZ—G—HЈ dE<…нei8’б&П#ЦћЫТDџ˜„PJRlK˜ŸЛ\4 DTBЭ@EcŽzЉdм/мдUФЉСчЃ+гlЧЛG[pc\ыѓ„^™ПЬЊЧры–4JЬ8;ф7дn§яЌ^֘5˜ƒЏxє Ы•%ŠьЖ0x=ће[/‡CЕбѕBiтщЃ„№ФлQ п4Пs^žЊM’дY+у“›CОЭF{Мˆ †aч‚pї›=ХОђN^*5‘Ѓ„4пгœЕVрВЩ№Kp’Zїm Xіо­I7$ўPѕо‹ŠР˜Ч’ЅL=О›˜Ў,СЉOЗDАvЗM”Є[ˆЁWŠ;Ц&ыЏ"и њЋfќO1шЅРžmzйcY…ƒйтp ЪБ)S~ эјІЕA$"UкLНЃЬrсОmї-Ёкљ›Ћrк=‰оœsЌ,jѕ*ођ>‘{Ю)уŠЉ€й=ЃђeхњЎ?ƒ КЧ™ЫZ­— њ2В\пђО§бO”щлјЦW{д:0^ІS3yЫЪ&hцˆёРтRTц§œbг4х…Ёз–ŽSмИя^qд Ђ,Г.iиЈ’аП~2эg*рDуЮщІ7ќОC ФДNіх4 РмяНЃ‘i…DAадЉ2R Ё ˜ц„y~Ќ§шЂzИэылcоеQОzз‹b\ђŒЄу‚кУвTxі№y3awћУicЯІh‚Я›?‚WJЫIо.н!*eЦH4ч_3'ЃfŽ}_­Ћ<8EћwRk–‡Ѓq–}ч }ѕаMыВ 8< ‚ЬтnA"NwgTPuј6GŒ!іЌЄt2ЉђŒCŽЗц;Ао™ЁDw7Z2РІ•4DѕЛ—>Х0ЇKЃ3–xA•Ќх<^4jкš•@#ъŒRXАb§аŒLЏ ЙhъgnЙяБZР†s,MУd"xПHмIС\Žб ЯkzcКp ёЁiњFБэ}§aЏї§ъ‚ —бє3мОnHв,exц Э:кЬЫмjЁpПќЕЗ=ˆЈzЩtž|їGї"ЪЅ~пQ*ІяЦ6Ўпь вЉqИБУcGPІ—ЅэхЫњ8c6wя—ш9( (3–ЬёдЛ.h nХtsG ^iєшO%tA(~њсQУ{р<нwЮЧщ~кЕЯЉhQаTСoqы—uЎirœvDS€HК‰C@УейH‘ЎП‰KЫy1ЫфЩёЋiЦ€нгg?€`лПДPДUOЧРqЫ,JI/RŒc L žT0ЃЮтYд7ЇIЙЅЦыЂVuЧbˆьh%_ чТ‚JэЕбLžА–>œыђ-Э—AћК1#ќw…F(EœпeлхQRэ<’‹ю;ЂжnkБˆЄ‰јЕЬ€Щ},ТŠlQ ‘мІЏнD_кЦ”Ё6y1‡Ђ\“@toДšRѕEvv5Дlя„ŽZКвU ЅhуЪчЛХльаa.UW}†‰\‰6њлQ ІNŠZй.[іў~LбеgŠ’вс‹j$Т|Ѕ)ЙTp›œ-Піп-БўОJАOЉŠxэЭgПO>ю­?кW‹Іѓ1fчлЖкя)иMX=)$ё;КbžBЄц Јт;ГЊ„Ил;§НQŠоэ‚фŸ:d[zР'm›ІmЁ 2zg_дє†œу§aУкјPГš3gMН`:­­НшIфў%1й,IбГИЙТЃQѓEСтд„sjŒˆb4ќŽ3 ›СIгЃ„ь­d4Э)ћ?зŸЦ&[ЉlP/ВiЭЅ^л™кKЊ8Г(pвьЩ#ByАQ<”M І{c†НFgSэ‘kЫWнa ƒ.М"1ГŠЇH6$$‡zњЖ+Йv*†:' б|hj€‹…ЅYCoЈ@џ?tX.R•љЦ' $мФT‹СLBqЏз9ПюЂрјSpkvЇхи3ГYЦ…žƒxКœЎ/РŽUЉ џ#лІNюГёЁП&Ь­їa”Ъ—ъД!:9I š˜ЬєU^EЮјнЌу]y2ШsЧ?ш7Cц7ŠѕїМЪЋDѕcњ!OчœLђ9очіH†Ѕ….цДК™гTг§ћ0уA<П‘Z`з|=#•‰Љ,ђA€ŽЏхoыњSlЪЌhД5Б‘мЌˆC9Ч6CPУЭќЃb-D1^iнqшЇsјyгØv‡„ M—І<ˆ‰ЪdЈ$’вUš§qr&4и•Rлј]У™b РТ0wП[k{O}bыЉ+пзWѓ6Š(3Ђ‹н.GюуО№K№ЖА}кFkЎNEЖ* hŽž•Е;8,т† ўž7- ŠЎu‹ЂЌ $Р|}]vZЧ­ъЩ%?ЩGfv;4D(Ќ/Ќ„З4жќЙЬьСjZщЊK@˜Јњ3o GŒЪ~.ŒZїdП9^u‹ќ?8Ъ3'&gўv‡8•" y@ˆе%"йе[@kS•§-ц”|YЂmЙщА;ВЋDћ“\}ŽEИБш€M:`‚ЉйяЕЕЌБУеЄ7п9hК*Аa4\Oƒbхы7йmЙD”ˆ da œ5­,ЛsѕFaјцlŒE:gWІvI=і›vDSC.†eЩ0кsDЊ•Ц>#~џtХј4џ#нКCŽј›SФV,m‰- <>_'ъkсвszдZйиœ›\jKЌfs*Ў_Gыу&№‰ћнFниўЧhуR “‘іКџРŠлн3‡1Ny„jЏЎh ѓиУя6$gСЎ“–[HЅ бЈАћд%фœо3{3ЩОњє9QР MЮDНЗкЋ(SlC-d+KjŸўvНуFћК!ШWщ.ю-LєUЋЋ%’їрў:і”тЃфэžУж Ї†ёСŽЮП щMёW|?ПІЈsяЖЧ):*зUW†Ё†‹д€ђІ\ї]*ЄЕVYт Ы7н5ЛJїђЁYё#ЮpšћиТ>Ньо]nwцЃ}$0…NBЄ|ўOё@z‹Рй|wо­`M'ч хх9ТžЧі\П"Уs _Ъ/oiъxŠд8Љ0\Ÿr;Уtя/6‰{%e+“џtЦ~І„@Nђс—j>zj2sŒ4Xаx‹UШJ‘“j:€ј3К vИР0z8Ъu$ŸHgjuРтWp}~ЭlBђЪЩ жBBщmwЋ /ВВ_њ’j’SаЋљkYyыƒ”жgvи†MgMњ ћГ…x3’i5к[6)_Є žLт’Œf^Gbо—@ЂаЅ2Kƒz  DуШ2§uЗя ЏЁkєў`Q єЫыБ07Ѓ9n.юcvр№К‘њУћ0ˆэЅšт-иz„Ч€ D‹ћssm'мѕПЖЛG@!дJхYb€лЩŠюьрDыњ, къюо о‡ЫФЈŽ*н Ь”Б/ЭоsXЫ€‘њц4сvХхБLјQ…G iч†lX&'%‰ЦžS}{,Џ\U[Џ{1Э=mvљ}YѕYr5^В­i%Љoсa–)еьшЗ#'ТИƒJ&-М†В{ЮтЩ ЁZ{ZNЮˆђюMе]œ‰ЬіmѓgŸA/;А2Арf‰Чjйкq >‹/ˆK8в€гьŽ49$рЈnфЎ5C–к5W№"†БjW ]ж­‚Ц“JГЌ^^ГтZѓНя %Вщ€HсЩRА~-{ z,LRrЕєw\мЁNІžлЙ6юK$б z}‡пW‡гlжIЖЭО`n 'lќ9<­#@Ž. еGyoъЈkІŸf 2П'к*щBЈyМe~E#НZЦ’"2XЊПМVXGў‚7м7Цsžѓ†ЊJьІсxјmЌ–,~ЭЫnњй!хP$Ў 4nІ"ѕћ)fИsЏ&‡Ѕѕ їlžгхzя_ЏК_`’2Яз %_­Диm9ŽЇ3O б жJз˜”ўXц.лЖ=#П№ыШќK›[XˆіUSbX8ЏаЃNЗНџЗляzъЙDяFЮсве8 )И]‘^ХЬЛ8YL м Чђ1њ8ЭЄ 7В>kЩ? "№тƒL 2ьВЮЇЬfx7 й‹2 Р•ЮИђ ˜ЈHхd‰№uйCkИ&uoРуDdFКєW ѓqћg/_щ‚ˆЄК™"UM зЊLDЁЖ|ьФ іYцBд­R5x;™э '_ЩЕA3—Vћ—№л—ЩŒД <,VСg\bѕОHЖг|„JoЬ5Dvв›__мќPзЙ^ž№сC=Й{iyІФ)ЙђЉ+7Œ‡HО+ю)Awш†LпСФFф*+щ =x >Ч‰S™0\P№ЕšGзбp+QJ™VNј6’D69џ…"H‚tвpљP †эР>}JзяХЬLжЏјV.mUњaш8ЖXn†>\‹›ьљБC;IїsїГwБгФд!wѕНCc)ЬјŠ№E†Ђlя‡€g ОВсій”U3эџ;ІLх„B Ьd0Т>ѓ+qi LVdT№Бо1З€gќЁеМL$TЌYQ№ф+p yDЇкFПјG4Jє˜ox@їђF8V‹ gƒuGѓg‘КэŸ?FЈ™j­QћП<БЦ’ТTCм"є‚Е7;ъqд]e|ш2O*l9х5ДС{Vд›ЎpуfmXАЂћ':'„ƒОХЦEjЌP…. јRx%bh3љдМ:vНн˜šчЎЊuуЪ ˆvЏ‰]Gс‚ВЈКžQ‹ЮRяМ7уj+\хrkSВ&wІн­’$еW\/Kђ${œюzКmVkмЗ™дэ(;KяsGИ›Mwulа Ѓк.2вэЅ&+Ф:^ИršžŽ+@3МSM“Ф№ЉŠJwлŸeƒЌuЋНˆ"е"цPУЙ0Л…ЏnКх%B лpНvЕзмkн*=љ{’жГЉаa6ЕaЁ; LЌg/‰™fXШлё & jTЬј‡тE№О`Ѕm“BЯъГT1!яŸД%шђFщзфog9С›ђХіљN)№[%ўk&эурпЙ ]j ЉЪЌ3Л'иЌ.%ЦЛЖчЅХизa+ЉЂЌKєщт›•žw–,iяЋŽƒPБy•пШFRЈЏХ’2Лпr%ГЂF_ж­TœOщЧЭцФlэМэї =в\И?џ.Т.ђЌч6пŒхy˜Oе а ќ2ЋS'W•кtЏšчљА() 9Š~†’yjDЮђсќ“ё=:ЌkбчэЋоЮ.п,1ЃЊfбї\,qРN"=0gL“xДmщ6х§aВп}шF+Ѓfš)ŽжbŸOЋ•ољЃž(јLBЯTНч}E ŠитрД|шУ2HQGй—O•”kk‹!F(гЖ€C“}ЦйДџmэЩџХI]Ї”Ж‡/Vt-}Tnщ{PŸaЭš`О‚9ŠЏщyiижUнИХ[/ЖО!јŽJC‚XЭЅКMЫАјќjЅо­šžуМmкTЬFXшFчBК#ЯŽ х§ЄoSЭЃUc"K§/_оbЫЧ2dщЛЪїг%#ВьГа…&-жЊєЊкWчЄ~­+EBПŽdК”њpТ–ШД+ЁP)  ь1Ї‚ŸDЭxtdщi GОCыcЖћ*4‡ 68͘`DЯ„BќДЏ.’зr])йWNоЧ,ў(лR)ћЧшш†лz{?=–ПєБpОЭn9иьТw8/т ЬBЂс’ гwЋq БђлnAя>kE!EКO€> r:]IщСяџ<дRъућXЎба:R‘Щп8Џ)џXЫ*œNопжyй!ЧниГwіЎ˜Œ8ц:AЫ wˆ4i0_п#Ї'w2oLЅTъb^!ЈiЙКMЖ*с{…}СВЦB‘8Ё#iЄЊ“i4іЅ&§лс$ЪŒ\fЗ ЙВџ ЫДтљфo Т7л_‹S)7­;У §+ЛбИvЎHJМ€МнˆЬ!@Еv0g<„Кф‘­|;гQСШЅ2'€­{žtC ђцз^’ЂHшM6{ќБЄѓ ‚;ЧЉюjг-S^Уmл0ŽњЎ‚ B…7†3ft"ћВ•еGји,‘њfг~r˜HѕИЭuї(j/zЅБ OќMi&"K šзЛX;u ю,’МцУ~‚E [nї„Ж•2Йо*є\}:}nЩжА‚—Йt%Щ-Ц~“іg€/‡мдАb‚ѕ$,Ў5№Џfн+ПNГпр/№4убk|ДљєBf‰‚с+]бЁедЁlЉЉXrОёЯ)ЌxƒёМ дю#ѕnwЉQ“Ъ0CxћИБы‰ЁšwОШOБЎ‘* pCВO™‰FRgЮоЛŒ˜ЫюУpn YŠЋ˜ŠИСъхj@ *wœNЃЭТ‹8ЏЉА5ЩУЇ nхНфH)ˆђbѕKJ…ЛNuc5Г>wFІГ}kмТ–йЬBŠ№т8е|G‘$*јXiBА]—юAшЂHбsv gf:s;РќRy†Ї1…№і>8Чw­šДќtŽ$бNLї;Еƒ[wЕDЖлЯќqт šяRaоHa5•[/сш‰ xЧlK•Ѕ‘!џTgDWш\Щљ†Ÿ%ЖяU€^Tвx@RЯўЩ%ЛїоQ;]kЎAyЦдаЮ`ŠМS’Ж %ѓ;$ЮЊ:˜ъ­t“ЖfЈЛЫ;дžЈЖcтIЪbIjЗxqo?ьТЬ/3HЄІ|ЄЙ)”фђ Bb^Ѕ„!sФ]ї‡‚вћ№ж}d„шl!Uъ_YP:0q\ФпZu^Сѕ,eŠЕЩёкгЎ­Ыїk‡АLVфI'ˆќяуwХч3ЖЩJБЊ§™Гя"фhПЁѓ/_ЎЯн—€1щОM„јЁ.ЂхRѓUКx|VD,T?_ТуЧў:ВŠC9џ&Р2цЇMЂЎ„љ §dxЪе/‘žъМ/9Ч!<7цIТњ„аЏзАвЊ&пЌнХосa5€"ŠY0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 648 0 obj 11402 endobj 649 0 obj 1363 endobj 650 0 obj 9507 endobj 651 0 obj 532 endobj 652 0 obj /QIBDBL+CMMI8 endobj 653 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 652 0 R /ItalicAngle -14 /StemV 78 /XHeight 431 /FontBBox [ -24 -250 1110 750 ] /Flags 4 /CharSet (/alpha/beta/mu/nu/pi/period/comma/slash/partialdiff/A/B/C/F/K/N/R/S/T/X/Y/a/b/c/d/e/f/h/i/j/k/m/n/p/q/r/s/t/u/x/y) /FontFile 647 0 R >> endobj 77 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 654 0 R /BaseFont 660 0 R /FontDescriptor 661 0 R >> endobj 654 0 obj [ 607 816 748 680 729 811 766 571 653 598 758 623 553 508 434 395 428 483 456 346 564 571 589 484 428 555 505 557 425 528 580 613 637 610 458 577 809 505 354 641 979 979 979 979 272 272 490 490 490 490 490 490 490 490 490 490 490 490 272 272 762 490 762 490 517 734 744 701 813 725 634 772 811 432 541 833 666 947 784 748 631 776 745 602 574 665 571 924 813 568 670 381 381 381 979 979 411 514 416 421 509 454 483 469 564 334 405 509 292 856 584 471 491 434 441 461 354 557 473 700 556 477 455 312 378 623 490 272 ] endobj 655 0 obj << /Length 656 0 R /Length1 657 0 R /Length2 658 0 R /Length3 659 0 R >> stream %!PS-AdobeFont-1.1: CMMI12 1.100 %%CreationDate: 1996 Jul 27 08:57:55 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.100) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /COXKPU+CMMI12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /alpha put dup 12 /beta put dup 13 /gamma put dup 14 /delta put dup 15 /epsilon1 put dup 17 /eta put dup 21 /lambda put dup 22 /mu put dup 23 /nu put dup 25 /pi put dup 27 /sigma put dup 30 /phi put dup 31 /chi put dup 32 /psi put dup 58 /period put dup 59 /comma put dup 60 /less put dup 61 /slash put dup 62 /greater put dup 63 /star put dup 64 /partialdiff put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def /FontBBox{-30 -250 1026 750}readonly def /UniqueID 5087386 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ)s™Ї„ЬО…Д™;.ыо;дrЗЯTeђ…jiЋ–эK­/df5рЖA|Ч{S/…иЧ )ЁšSяcы\^ШŸЦТm‰чйфpЗ+як#ѕпvОЏLщ17ЂэŠЉзж§ѓ~kЭрй ˜d#х– ]ŸЛL•eVшпЫњьGoЃoйЅШ\šѕўйТнвkм ™9‹ŸMжЈ№[GЏ•я(ЉХaлм˜Ф|ѕRPщ6nЖ§=: Њbуей9s2m4{~мC‘ЩпD…Иќ˜д%Хx’мХyDž‘OОžg<Т<ЕAіlчюwез| сЌUЉvЬЌЋi“юб@oЛѓЌžЙ *єь|'<Ѓ/ЅСBoіAДЂћ/Nhc\“лƒW7VЏ„qЫРPxмдф%ЂєхЏFТ4ЯY*шѓžЁВЅ”5V7фt~­M—е№Ј™ДC‡с§“:2:§ІКt4ЅДp\ dzћѓх:‚П2 йgSc›фœ/yЁ˜ˆcя—{€ ЕД 9Т>ИiSq?sъ"џ{ВСй}3§wБНЬ*`Б,ї€\ќХЙРѓ g=љX“ф|ъY2н0V O —T{Э€]m…DUБ:Ms‚Ђ/V-|Uв”НЊ4‚‰BeІgхЩ}•џ%1я—%V7E†]ЁчРХћ|oЗгФ?ы41 ZYћііьmmю єыз w*‹ I„Ц“іЙG”Kт2Yіыd0=bsS;eќŠ`hz9hЖЫДž І‘%^{ДxќО›ŸБјиЪ 'i{]&хс 9c< ищUє6cЌДыоЖ(ёг>OСƒ1™sbЩ>HЪAвžђ#AзЭ‡иi;МyZYДы‘IГG Ђ љ2хoЯg#!Дх\SсR8Љ?SвюЈTGёA'э№”мј Ѕ;%Žaё Ьм%й9Р8ВйЎІњŸ( иУр5EœЅї=цј ЧW"2ыbо'к+Š}ыТЛ*ˆЂ?)bаU‡ТE5JНh ‰ EŒО.ЭЅЂцqС ЌПXщёZЏѕUgŠюѓіT^Кœ.саИ`п}мo>,Шлeœ‚,yh[g •2ZzСn˜[Ѓor Ž<§ŽiDсVыv‚Щ*эоїёт6_.Хе*Э–Ъ“Є˜ЯKу) v+щВэъ6lFЉkнкOЇ"ŸаЦ#ћIЛjЦуi€ ЇaХЪТЈ]ЗB›ТBЂ}ИўКxž” еlsK,C"Жr—FJfГЎp'dЧкОМƒ?К„(чПP2Цг8~hИў‹эEБFвшї”СTocsО„v}Џ—YЊЙбsUCEj/ы{б™ІШ!vЙd'N7ДUћŠАЧƒел\чЇЄњЄЅ<ў“ŒМ6 >_!Ж]‡(lˆВєяИŸХ­Ž=о}:8@|ќд\mУлєlЪ›мяДo<Я’M fYРэ~CN ‘эА€YјЈZДtHщ‹˜ѕџvФMLiѓ„З,Ÿ9Н…Еѕњ‘†!<ШŠ. §:ЅPЫонa•UHQ*xa@Ь=УЬQкwh\}Ѕ\^ ŸnŽ№№Я›$ёEiЖК’j˜ќ\ŸiŽ4 ц#ЧUнФd—upd­qжЬo№TiЙкш€ŒMдne2.ьЄм˜^ЗPўе-„VvДаыуIХѓШѓЫТЌрљŸh)Ш&Хм€X-OŠўјiUpmЈѕˆюІЧ&cBKІ?…Bm”C„бРНW'NЬЊнѕ (?ХчeЁLНџ~ж”Ј+ЁaгhЩќcQлzUo”ё‹^ ЙЩђVыџ+ВІљ1Т/tcpЩѕyА+Х лo}ЅY#oSВ`gЕšжџД=+с’jKгт%wO§єjUІ9]DЧœi7Ђž&Рa4ЮŽJ в:hqЃѕ`ш8J]З л;­хяЮж4­ЗЭы№kЩ*ЗzOqМгВ) ЊоЯЄЬfчїУІЃЯmмPшѕ.ТЗо]ф5СOQюKЭbТЏЫ‰ˆMBСŽШoяїŸГ.+`kAсoypT‰t–ŠrlюТ{Ћщ›гDЃxKђ хP№›Ў„ь5КќJ+›ЭЕ˜-/И4Œ—"+{ŒЈЭпп4цТs)[мюY4Й8в‡Д^aъДv$OYšUЧцас–Ы’(гќІAš;&Љ РИзУзYUмбуS!H^-”/щї”V•ш^:ќaтU--:uH@ѕ6О7ПŠм2–˜Wž$Pѕ›v<ˆкCЧo]7ОчдщДћЊuЬe•ісвtЈ­уўўŒ[›о{‘‡є Аqg‚В[§‚O ^NѕdБћъŸnхї=;З \eШмЁЦё^D[WQ–ьјAQАЃPLKZцКДРg("т+iIьˆ'sБНвэьZ@Xђ_аc:ЏVњ7m@ЛFІие!NXажїУГЬ;OuH`>M ‚ЪЦюBŒ… 5М\йk’1(‘S%a ЄЫž}Ў\кZŽ,д5з P5'АЄОЧt8†tы„ћчQЊњDt*ž_p_§инKŠЗBбtœщо˜хВ›Й–Ж Z  Мыy.ž ЁU fX1ЙЙЁю[Ыs1Ÿ–ЗИКM‹ЧkЧ†“qQ^ЗwmœZQ‡Цї@эПзшŽ›T)ŒDpUй˜ЖьEї]ХЖMO–aрqЂўMЁйІъŽЦМћQ(Ў?‘i/[eП™џ˜оyFц:Ђњъ[ЩaЅLцоЁCЕpЕЬђ… ;$ˆSЃёџ:Ё*ѓя№хД* Ф4UхЌŸн( RНHњ2ўчєqRЏк%Ћ%)ёј”ЖЛдьЂУл4Аю#=†кaБmzё<ТЫ4ш6ЪЦЄПЄв*эЮdЯбЖ§—АIj^odiї?Џе~їмЧЬЗМцЉњђ ёЈ4UыСŠј‰U1*[E “кVD-ЗЊњ]ѓp_P:œ+жы| ЧЉы§ Пt4€"VУwOЧ2œЮ ѓќR+яŒАzi !‘ХZ ѓh}]eФњN‚Ъš|aІyH&гќos?cdіЈ3:[Єњ9Q`ЗY’Щ Ъѓ_Ž(‚Uпге f›%ВЦЉƒNCа!Ђ…šіf:„л•…мwОО8šV(Ѕьi (™ќљD–‚“–Т^Hx“ ОюЉЮE(^ЇŒЁ€ФЯ+\К;бe’š›ш!>kˆуТ(їœA Bœ Žз;XЛаќ3†&Jл4ЛgГЎu<­XЭй„B…XъYДrб‰JIшжk„1kС~0;БƒПKЉшЪ;dк-мcЦжыJ?pУч~]ЧЮбЊ­ћцwys+ЪЈЬ’йZi!ЅцЩ^)юœХсЋъљ픈zAU’сш LkcхнЭЕŠЎŠш™mбT[пў†d?8#г•5EЊ ;аМпсг!ЯЂЬVV Єї}Рэ‹qЁy“lk/Хрг8!~Ы "З\˜]F’Z*Щ• ї^ќ@"I)oжЇ\УkњЯZоTsй9IЄmт§ƒГЅчОг’g=Ѓ]8ѕ€ы(ЁNМењw@йfФ-+šhЃбy›EЯДІ8 dѓБЦ ОOУЌцЇќЅШФIбbМ:-/Ѓк]ё'&кvpѓМ6V‹§74Zї?љЫjќ0лЇЙ>Ub;0EЌџНвхЩЁЧY` ыг;ЖЈСВHЃЈ%ЇШшхЋnЫCЖГ/Q #3Œ;yžАН,СFHѕK+вщwFp’ъЬ”иMPЭ$]…И,ƒХRА•[&]†~ьiўбЏ€ЪБИ:џfЩ_wЃ <ьхЈсЫA~Œау-’эŒКБ OЖaЁщЏ2YЄ‡sНCžaТЦА}}щ8sї№ŒшК2Ј2ŸTHХ"”деСƒАr=gˆ™С{qŠ˜>  Кy‚м€'"PƒОJƒ$Xd[мІмHь5ФCpфof’ЊЃ3Ћij`ьМwpЂСOГi!Тc”>…ЖЕ7jЮЯіxYЭ ЯƒYgзЂD*…>и*{Q.еƒЉfј˜дj‚№6Hш)!ш[ŒGƒ˜>dЫH‘іДЮ—ТЈR+imџB;бyc@ˆБД6­ЉХžсЅКщцЛ|м њ‚–B,ЙмL ˆОп‹Tпви†Ž}iіЩJ,a оœ'uTƒЇйЏk AЙнFnŒO›ЈFПca5[(@ЂiїП4lo`N”i–ѓеєкКl7ЛŠ>зђХ4ǘъ8bIВ­U\зЗъtђиuƒ5йSЮЏІxCWІмCc ѓOј$HfКЌFTЊдFЮŸ" ыgА бŒ8,ъ‘Рkїiщ QU)ќрN>uљ”;ц .цтчЉщ˜С,и™y–šјqP7ў™Ћ}БЈt2"“єhјO0Ÿ|(†H6‚}SНн#$в„ь,$а.ќ­uGG еiЁs7КJ‹ї|2 хalњ~5жš9mЂiŒПЅuSЯЈd˜ћБш§ёM,œ0кK”XHfХјш•Ђhщщ§њрsF%ЮКљ:.И„QHŒ)ЅнНГЋcXУО§ŸЇhT}№ppшІЧЬ“§M@џBўу&ŽXяJ;3‹§ёqwж*ВOъKUP ОDВ%йЧ?T[ЖeXnYƒКAиkЙЮВ FCыћвQт˜NФŸєајw~ЖВѕokUџ‘Ц}-˜=rтёхјGшМ)tЁХbеIкeчю3$ЭGun–зЅУ "’^ІњoуK˜ФЅщ­3Ь2щ Хлє ‹жРыЖA Iц 3 ЫTЊ<вn?T.љgd№.– :в\ЏБaЭS˜NфЪ]Ÿxѕu’ќBѕ#­‚• вqx:b0ѓ }N64=bщ­7*žJ‡щ1‹мrрU3ŽДХ-ыщjІI4’.дn^h6†С9Сџн3zr5ŒВe&ХкУБ7о=hjџB'“ЃъПЃэНVKž…Є†(?Јн.юa6[wГ]ћšAК›2q)Ƙ9‚JІЊ3f,Ћ$фєєtп  ЖoЫЇйUKot—дHsŠ[‰n(cЖх~ЃPш0ђ‹ˆЊq;†К/Šа—ЃВ5q@MЙЩ†з'аBвшзКГ–•щЃ;jЌгgyЂ=гK.%=›И*&œЉRuаЅ.ћд8эћ/ъЏЬžPЖЈжAfцъ5Ѕргъ,ЬnНtі”л@ыvMVц5гS6„=цЗfh† АЉ ЋгŠєЕ†њžєэћZ>цAЯв|ЕЅ:ъwgСЫ_ўODoŽ/N љ*%M@q„UЕЪ\ хфY•)ŠО}ЈŒюб€„Цœˆ ЁЕЖФ |ВЮ #ѓєћ#/jЗQ}кN%>LкшHEоДќš‘ЃHo' ё„Я1šТIѓ0жя0Бб­б$ŒiŽX lwЖ;БХdўђ*EДЖ04И›xВЏьMњѓнОы№Щ‚˜TYŸ]КФ“Ў,6P‘Bј&?UЩ еЁ”ЈuR gˆ6ўЛщh§ЭNє4Z’… єmиxЋѕ= ETяљІ:АŒы‡8Э ‰п—ЮўДTnў|Jнў"| й)q]UrL†љ qє[ўTeг‹-ЁГХaу!IѕИ; s(Ф0~›’ш­Ж Шd‡й†EЇЬлє\}М˘XИЖr/ д)hŒ8AfНj?њ‘vNП &ЁVСсўŽ{Ў-.–[Их\Жф/e„ЏYќ;ъoОu€ŠNйЏ €ЊаŸ{,Saџ{W‡з+љЋЪё*цVЌОEкpœм-UНd<(ЬB§ќŠ.ll#Q ПёвRх?‡ NŠЬ+<Еgлˆ„5%3њ[ёчХ74.Г uщо:н=aO@|-^tR#оlGКPi;ПЏЋйи}FИм4WbЗEсКЋй5‰Œя tmzeДsщ=ˆ[ŠCўИ§ъ TЏ;Ў+™…Ё&ЉЁмнnйrЭ.Ў*JЭ‰rYюSј•…&r’M+’Ї6“"­€yXтTcТяєєєч_DЏ5ЃЪШUa­хЏŒ фЃЁЎощ“єџ<§р€Й:DhўеойР}ј YtN3TЌД•к~8j!ц"щї*ВшЎš˜f>E“д“^Я™ˆ]†ь§э>чt]7%>ПQыях І,йэr:Sƒ$3t‰ќ—&тЮкЦДйl QlбщЫнsm&™!І…;ђEѕ+˜vюОь тrOh%DqГй%ХР–n:1ќ"К7Ћ>2*œƒ43ГІ& Ц2“Tд€озч.Т‚жbЬOэ,wќŒtуG)­Ъ{Й›шзд 5ЎЭЎQ–IНFT˜цpЗЎ€бYВЃШТдїB…`4Cм‚[ъ<ІрM8ўœС хœТAўUwџ{чЩЎЧ0ћFЁ– ")FBt’ўЩB…gЯ 4<Ѓ“™-bT8љё˜#?o~…;\€№ZOяP№пYќ+ИŽ2]RпЬe€ЧбЂG/x ­ољ3ЈупБp“’k=UGmЁ™іЌџаŠa€М;4j3НSр6|4Oт з’щ–ŽЃ!з0€д3о#Ш†>НS юе~С…-ўg=Zc]н`] ŸhвЙ&"ме.ІОЌynQЭ џ‘™WЂџліiuмI#ЫхѓщЅОЕђзXц­!љCŒWБЯbЋШfЌ{ƒŸ.ЉКTб’Mœv_*cМЇeTЈС'"яЦ‰e"њкќR@BIoЏ­‹u?Oz—ŽЧи˜kар/ЦH2д~“eUŠiЇwђ•Е§–№%p8ќОvЄ‡ъвПзШзуƒQюЦgMд}<ƒ§Т…сAШжTƒE `№‹Žfвb‹eБ6„с УL њ=ЁO‘мEРяђЂ•жыcŠGЎEKМОО~0|:u&) щЯ5звyЊgйћ9pRТ’8h\/C—ѕLЦaЯ;гŠBeSЕF#7‰Сeжe9'јd‹OБJBЇЌz?oЮмьNTZ€%'f4њЕ}ЩжJ_…]*­x”шђZХиQ?‡‡XСo˜г§t6№эeГŠЅO”EfЯњл~'гж&dЯѓА ОЁ^ТZLHоо%ОƒЁ_ЯA§1"ьЎKfJмЂЉУ™б)—ъќ•Ќ<Єз#ŠГсЇ:1ЙиKOVэ miрЫeR?C"Y~эŽъUЦ~y№Ф4qЧ]4ЈлТ(r­ЉсфTŸяY"эМp:Б&}го1  o єхЬ;-х}cк \НŸ0ЭкЙ’-UЃh~Z-pМp–™pёьЦЧ„к\МГШЪSŽ 2X9ёГЋ№ћy&Ÿй…y;6дў’ŠЮPм„~Іљ.гвЌ5ЭZ;Љ‹kC OЅХbЏjюˆš^ђБВŒœэеужo9tFіV<“L?Rtš‡эКЄ}Џл1Ю .ЕsH‘uтe}6чі/у§\џе№и<Зімc“?1МŽŽОВќйr­zmjы“–ѓ-@†І—ћ`†yLƒPw‘\y˜eЃФФиЗNН*2Sєn|k].ѓeg1Nй_ѕўŠЂўгвћP]рФеLЧЌЄГ“СЋ…Шёѓщ_щj#Žк`Kш:SЕ^Ž)ДлѓИW™(tŠШBRŠПЗtїf*Ї&nфkaVфц,~ld s‚ЧїuО Мк2•Š>gЋKƒџ5€?іpЩС:|егb^цФ /†ž6mо•? yГФ—;Œ (n­\ыu#ющўk/ю›„ЅЄЇНR$…Къ„Q:”Оцд‚ГСG^ЖўШ y™ж(“›%gђ+@&щы:Чћ8К:K|@Iі +йаGрl€,їŠQDWЋ`#ДХЭ)Жс@S?С* ciЏœŸЈ2MлФ™­^ѕ55м њЬUsХyЉ#RЂqw2oцhL! €Ес CžPgx™мp‰[Ує•ЗkЄ‚RAьлeќЭ№™)$=т–ЫќМY­OыНnˆC‰PФ[Д ZAt}hўˆиЕІюjkC( NЄЭ†ЮіїYЂр1ећn–QBЕ4ќ@[uЯљвУЌЮэ({MяЋкЉ€MŠD-–vTІ›.ЧBхАœЛС*FFти~Жн 9ЮjquWЌЧЯlбLVЎЋжR•9$—L>‚O<_#PцKЕГщ­=Ёю !РktŠ8Z?лO}6є#:О$‘ЙzЌо ~ ЬЩ‚[кF`kџ˜n‘џЌщ‘хF‡мШO/.9В$g(uф№0:ѓЖІб+RЮ?‰в›>8жeJОr@є&,Žа№ЪзОnUbкЩИ>šoЉ0{ЁjФQ Б?з‘NыѓUZВЩmТ­б{ЋЙ+…И\5>nCАВеЅат ЯХШџБк$EbаЃэелаеEC-§eЪŽ„юm<ьчёаНъЯїрЧAйіМЄ`5UМю г6”%WЅ0ˆ—яАЃЙ:ТЃЉЯVТ•лІў‚Rzy§аŒХлДoѕbК<™Ж iFђ:2"%X=чЫ'хДЅЫ,<жЫ! *їECЌUc`MЌWMŽ~Бњ]ЁМенЯЅqі"kТфн ' ђdfoa6гд|вЭOВю Cџи‡;-%цЕ~Цtc (щrЈ%Jс­ы с~ююЙfдd#ЮП•d Ђ~rчO ЊNяБЌКHЭ`AК‹CМеЃНрiu,“%pОУяФ>)6^7‰шЯ™Яc—Ј%УЦшh%”ЫСАшъHќTОд@•жlЯE~š №;Rќ"ƒї їQт.4Щж\s@дUС.sK јЈ ыаŠ>†&:РtБЇLŒа9pЏ9ƒ~$Мыо Co­Ђыћ#A0~œ%Ўв§w›э‘ћъ<ЏkcZСјIfдsCB™ЃєпмыД­Вш_!ыє-1У=Š‘QўЄйЃ[ЯR5!їЄАVŠ.T…o;НŸq'ЌA'Й{+]xГх–,&‡#Љ І™EO8Е`IЋђ§|ЦrчЖ“*ом#_3іЁ L№7Г5”Ї#ІьТ1{!ьŠ*qps_… tЬJ&‚‰ь|ЏЄ4Јq]:м@& љЌOhC[56}4Ъ8Ё4”<,"I –…8)'Џ*ђЩжЋC‡[ШяАиЉОG‹“m`@ЄbxSћƒЄЩh<Ы[~ж^ћuиЮХn˜ŠЃђў }ЙlI§:tџšнѕ)|Њk3сц9Њвƒцw‹Еї\;-Њщєi2Лv‡ЕЊ?Сьnћ:bы]Š]*ž'p№ŸФ0МBЈQP'эе00ry7o{ˆЎ{Юa§?Лѓ…Я$9ІетЉ­иЊПmQ<€ и‚{UлШуд–•qЄ э‡§%ЯксRE-тBœ•ж0ь)Цмƒ[Б`•kѓЃl ˆ†Cya†)1єhŠ!фŒј,nФ,nЏДiƒd&ANh~U/ЛИ—ж•rыKЌ˜<яz6зTб‚0Eч{П‡oКпQ#ЬДž‹9ЈиГpРцњrkСœЊ1ј еВо*сТ71П|Ё-oГt–’~8Yeл–‚ДЪd №JюŽdžЯŸз†РГfзбЬƒbw;яЋkїчЦПŒˆ€Wž,ьјrЇўsк@* иiКŽ‡4DOТ:žTМеO [Š:‡—‹eЌ( сЃ ь@}KЗ _qу FPЊMђЂ‚Ш“њ%ejтєбycƒ ЖKЊІя~Ћ]{вHКсФЅФиПГЫђє9ьZЩaЄ8рєФnЂ~У№ˆDb# z[ь\UC4О|ˆєVœкогxАзР“ЋЛЗєб нЉ:НеШoŠц§КЭ]tЭ!эИљ­кsxРЪ€ИЦхUEŠЧšŠЦMЊЮ ЏUYŠfœ нЩ/vRT} с(ElsZс?Bc‰ЦЃй9.–Х3№А1­(—ђЅєhždљk[ЅЯ–ш68M "д јсгpEаю S`ШЁeїF{'Нд}†/јРќі­;vŒMїVUДc]cqОџТА|… ~Bё/хрй]№†…$z†ћˆх5Vz†Ижм”пБS€< }.4,Ћ‡ўNI›а–p?DЯQЉuЭ№ЁвoтzзdтюУ­ияЬњ!ЏŽЩМEЈ†ЂЗџљнHъˆѓyLГSƒ ŒгˆRН4їХOžp7OЇќ­pвЌV€fЛьѓ8ЛдiŒрШd ыт .[8e{PЛгIИ<ЬMo$њ‚П–y,ƒK\дО5xпˆvЄўŽOB˜>г*‰Чыд!мџ6ЩTГƒ?BЂђЪqЙy§›зЂ‚}†‹дТ| ­Ы Ё•zŽMёћ“О5вќл šк“н1iƒ.+гruжЪ~ИмЧюYdš’bhььš-Ђів•Ря“Ша†aШЅј!Ф‰КŽyОнUJœї=|ђ7ЊјqЬ*5 gЇн•нhЧЌŸѓе9зkБџgŒx-.Щ‹В$ЫЅЎxЩ ФеЖ! 2Р€XхyM9юŸ‹hŽUчSИ"HHfЏC™Ђ.K™;“™[щ1ђьXљ%ебБ"}\`ў*–а™ЅЕXTRT>И“KaVP€Ьb7Т‹B“ќkыжЯрTЋЋjnЈћлщ ›туўЋ‰r/‚?АgЩЕƒ0,§і*mS№ЉZђYx‡€O\;dдкL~:чт№>TАШgZZ$саxЯUTаошR/*{f+п[AVНЌ>й„x…Mcю0 а@ч­бU#ŽДLжђ–: {ovЬАПфЏ"шьј<Тib ›dср!‹wbуќvbZЯРЗ^ЕmС‹fgXхЏјйшP€’E1шЄPЫq(Вп‰mЫ“@”_"дзЌЎjьјMєHCЊ]Wсеј<Љfеž:g?ђf` !}o9Fоa=&Да/ŽЎD§ВФЁjкъЂь&ЄЋdБеC|Kf:БЋt‘bЄ  ЯћЗtWыЭ“oЖ rџОʎеКќг+ђй †Œ‚}!лЋo•MлQ-вђžLK…C№~{г#гЯ€gЃ4 Ьљ'ыwj.}їа3щU3љВДKiOюп›– WtЎuŒm†3MƒЛ_ћКPб;4пДK-ry!’ Ф У‡шY х6}ыхdЉхњўщљbшёP:уу54ў^Ія1bк}E?SЈ—ГБУУe˜A#Ш ^рАЁXсЏн"GPЄ‘П]$"›‘Ђ4‡З>&зkO˜СuE#РZВ‚zHqн5"N;]œЊ5ЕяфљМ O}cPк6с–Мl|иC{Ё™muЛ c,:Яi—&h1уїЙžЈ-ё<ђVщ+mlcЯRgB–јйˆ$NLŠщšРžЕРЯ?B{†ТyщЯ­W1›xі,“2РjІk90к!n!5Ю'fЌ™ Баш’>Ъp•Щœk-ХГƒњйщ#CЊQ &9pЅc|^o9ьј]gШ-V šЦсЮЩыJ&aЖOЅтЛO2ќХ==еKэжJђ’9o••jN†сšSІђЩ^8Œиm v=Фn.њдј'чЊхФ}zф|^ТЈC,Т‘вњдЦW8т“’.K†ЦaЧud3 Д!Й JŒСi˜ќлo|КџК[ЧcЙЮб-ЅлЄs-GНлЅРпSL_oTT§˜п$‘2цXхЂІ10mс‰‹кmP˜vН€:ХюЩќоє4-v№‘ЩTлдitŠЄ тшy ђ@Љi‰TniОЈс{[еёL№RwžяCЎг|šL|OаjсšнWQi‡Пw<uoQљ)аЅ*ЅЮ/„‡yЈ­ЙlЇ|мhRЊœ›еьЂ*Ь%26,|іxд…s8<ЦДмтј™iнмeсbРoŽ^щЫЕ_^Й^кsЯ_ЭЊPmYич;NbЦю$MЕ”Y]жЫжРо4ˆ/Ў4&ЯБЌXЙžЌŸАя|–ю:™ *Ћфn~oœм§2Ыz+УўР9^‹54ьЯш+p/Zpuf]›шу Ѕ.Ю„ oœјшsЗuтtŽщHеNэ0xC={~ЇюUЋж„ID]9m“w rКs§'Ыv&ч.cЭ6IџС%9fmЩУƒВџNn`яыКЁю('7€Sие=є{~Чf5Ћ^f0™–вntфcи_OO%НЃ?hQзЭГј|Ž=ЬH‹џ0Hївс„lљќЪ*Є_PЙЙѓjШ€ЖˆFЁЭьнVЌˆ‚Ќ}PсэТМ&gВ~Ѕ9 пЈЃЌ5;ЦЂ`P&$ODлђ.ЏЖўdНќЈЗc˜†U™ХURаHЉяTУnKDШ2t цЃOОr"ж’Є„­‡3mmгGT дžі­EчMxW3іVЮњ[э?*BF,]rњe›DШrъ,ЫвjІœFG9‰ЇЉУyФ„НAќN?дуh…дruU"Уpo—,ecФ^дрЄМ*…rM[Xђеі?™ %:гЙИ.1Ы… иї іgЋцФwzpZW;ршАлZЅ1DЖѕ7ž­ЮN”—стПќЪі[ЊЯ”&и*ЉЊ ЈqїкŸPkЬы 9›Ф?‘ЎЉšZcлќ8ЛеъАБЇц˜ŸНsC%њQq“5•WкгTАђрп/эѕsсˆИ…tŽтVЧ5wџ99ы5и9tЭSu^%Ъ76Л›F^l/r ”Щyg:уЧJдL=Ѓ{л.СEйBwB[Шо0oЂю]‹ьЎ/ЏРжЪћ]DЧv0 жЯfj ;mC›EjєЂ…ла"`LT]тТFќНђzCFЪЯ7aH[вЪдѓ(Еh ё( УодЩЫFO7MсмџЙЯуyЃ }еЉЊ9Ђ‡ДpЛЗoo2о'YЁT&*єйЯуђ§~ђцEFTЌЄфћагaњbјœ!е”,цћ%[№ЄкUŽЕжtnQиРц~љуWRЭъЏё#щйkЦ”ЬЏЄ&щљ6У6ЯuБb[Z0;+і'ХФя6єё)ЏЇкH„лЉŠК[н­—A.—љЩгЗФЕ_гИ{ьД5<0мо]$$>k'ћn!eрЭііŠ„ €Го`Њр›- ­ 8ЩўSфЅ2Dї!–!ўсшЯЮћžЮЙf І ‰УРЩŒТ64+† чоd㏘лЊ.uv'4g[6*Šт`3]Tуl ђрaKМїŽVjД›SgќˆŸ';и€Ќњ‹Амt'W"Qкј<"l3'iн7Me2€њ}AдЖьIЙ46ДЂ™|О_ьўлI’EOЕѓPVGЉ%ё’=8d@Тژr #ЋeIz’RU†г8мX"§‰4оŒЩ2& чтїг В”Gcwбh†PV‘‰2‰д(c;p)+lб Кџ­иц$Ьp єЩGžфKу*;‰Йn}ыЪ/*Ёl‡Вђƒє˜Ћ>,‚]mЫО„G|І@vc)^cчњ6HCЛLхca!%Ѓ%ьќ‘їџЌR$пЏQC№lлрћдБТY—сјлœ… œ“‡ЃGт5P‹OУmЗR3Žju:SQ]ƒтўHЭ“ЙЈiIФ‚Њ‰V‘rё}дщB "JT{65НыšзGчO р+Ю%—M%6Яп-<оЁвo2ШПУТdˆ†Џ›JЯ6'6дd ьGE4<йID№§ 8ˆ~њ™ |ЂfUžдЭѕЁ м-ЩЕŒџAMoЄ ‡Z@“Ї`’9ФЈ`j`З_ZюVљэ0№НэSгЯ.‘КЋsvшХ™`­Ъ•žТ%сJ#Фмf‡fЮу!3EиNm(RtО‰отькPw ‹ЇЉ‘UНœф+щ%=Ќ,Ьh%AЌђ[‹iЛВ бzP,йr–œвйЭьŠЊ}XRЊлТе&рEЕіЗшК—љЂ.к}­чсщЮЭˆѕ† sl(МЬЪ€!%„-=`•OX.So3xћ|xFЊMџoьaљ›юђРe-x§jм+>іќ%БРН#шD>єdШЭУ*тaњR@Щm‚@€tФ‹r?ЕИW џ0бdЙUj|9oПQIвКA*EАj‰пC|АXІ5 ОзШтIФЙ*1ЮWxT§ ЗbЦѕ!НBя­j§а$јPu КикLгJХ‡9ЇЙэkaЩЛ*W}яuлPЌxт~p#ГC‡nЄp BeЅ>OѓrШэ€ЈTбGяО—­Cй}&uPQї Гp“Ћ8х­иr Z>\9 юА}еME„иLw‘цvмњ№ЬtzЏъЎbчD#€• а-“huЬžцєбв§ИГ gрлU1*Oѓ‹tДэE^‰‹Ebg,Е%FZ%d8М)сUЬJe/дПmECл#a•ВЪМЈьќЉМІ#м‚.6ќСXsШŒЧэ6 ;ђЮhj”ЉЎї-$ЋcЖ† R9і=+bт$ыw4;W=–lhЎИeНВ_Тi{дL0зžД=Ь=І>ёX|?кжhУeл›тЁПОTд„4tирcIˆнр љјS3ЈI/cбаИ§И(ќ>RМŠAзЕЄŸОU)”fІkбуF…Д”яігFh*0ќPЧ6ЄSiOVЁWX‡фtUwнyйхˆуe2уxo@хˆ*э!V>5‰_тЋ‹fnmЮ›жѕLДШѓ с)GяЭ'ЇСwYna>ЭАыСњ.E‡O’$ZпВ4H–їьGК­§ды œжДymЋЈCKŒєЖџ†fј’t#+IЋіЉюF}Oэ_[ј(њЌ[‚эЌ‹Ъ2оЎсC?`–М‘6\бдp7Њ…tЋIЂe/їЕ §t†ѓц6™IykсјbS Ш6€8‘mыщhno­hZcR[4&@cЄRњjЌ Ѓ,Яџ@? ˆ0˜<§ё !ГGЬOє™ТE`w”GuŽЬjЕŸю4йЮЎ1і•ЏП…­ђ|фЁчnЮј8dеЉŠН­•ui.™Ќз’У]š?ЦŠу”љ5Ь`ЈєL“ЮсBСћЁb“€А:f\Юh ’їOБt}[‘,*†­С&љ{+ nр ^:}€u€ѕ MП#Ž$+њk’wУI:џZј~ku IЧЇd?е ЅИyй nS[yЂ!И‰RЛ[ ­ЃЁJ0–цO‚Р#Ј­!AbвђЄыБ•^Ж™МїY;tiy9HF#џL[ЌОxoE§з тЄШNй@6ІŸŽr‚n@ЏМїЏ:­jНРТЛvEе*П*ў>пј№НЗuЉ{БŠСi\4žSуgХs YgС1тзUJжЦМ™fДDЯсpŽ0 Пќ„8S‡Ј UіСZ1УTЕуЁ–1›Хнdи’X(‰0ВэіFd…пfJыЕѓКГв7№Дщ?а‰*˜сеm3ŒtELŒД›€ы>2™šg†8%ммoіЈЎЦfю ЙуЅlФДШSЖl(ИЩѓ™Ѕ ы9 ~ЭPЊуЋЁ@.ŒzEVЊЗŸ 5Н™›cКбG…ф:!І5)§Ћ˜af0Z!БˆгфЎсˆЭ œƒ@x"ЌШЃ\J%6•щЧгwЕѕ+рт‰> ˆ+ŠПy_дт`i…Н­YѕVђ€ѕevpЉГи}в—_с И(гћŸZS‘‚pQєй}nЫŸž0я)н<зHn'#X"п|џ @§VD[7ѓ1Ї„ №dŸi›u|ОЃђъs(ЃО џЫYй%ёЉьЌTЬ+]gд›cя^еГšXJИPа4нХp­™Hnй -Sf‰>‰‚ш"ЖЪЯHшЅьйqQп˜aW,SЫЋеЂŽЭ~Bъю–ТIџБљ~KгвœK™XŒTЋЬьQKG’Ѕ­Ч=ЁФ­цaТѓ†C­ 5tд0С—yЈ€жЋ"V[зар8іЖПВ-? ХќиЬ !8Ж{–OМѕс*@н§rу^OзO牉^ ;a/"тЃЁYЯїџаЛ[9љc8v!СџЌN4Прzл@ЮрЕ X#•ˆФЮ$Ё(Л…З`ЖkтDьь>ў!т… 8Yі“‹й€УЈEŠЊœ<Ц„эє]UЬЭgaыуКWpс :Е<vм™щSВŽ“^s€ё_vмзqасѕdjcтCšeаgЎ  XšїНšЎцŠ~[ЦК\јЎ;Qx8Йъэ Zšюoн@НЪpпN_ЁЏъ№ŽЌu‹няiйQПЋљѕeJŸ[|ˆЮ??ЉєrўОЏ†]Ьrф]ь.vGХ'!р‘‹Р2ŽQяхЅцўHGа› ЧфИ^ ^іƒjмRАЅжЖ›|oЦuыеУ№Ѕ“)|tАF~%ElCgUBg>ћУЋЧцDNTоz4ŠЭQN\1NЉ/щyŽ|$sДXМвўB@Nјсt=лЊn[aˆж+ЇјВК(щс\я­~TЧ&Ю0НI№qОc&–w№’o@ЅУ6B …lEЇiќ‚)Агж+[жr[gЦх„z€К‡ж6d„ytOGR5њ!К62Ž;хУЁ 'ЫkSS­ћQдД{œ1Tш‚ЕZ\рm@Иvэ‹b“rYЂуWЌ‘єajћ]NgOЦ] dюf ЋчQ3—БюыMXVуќ ЁвП…wЬХ Ош/•kяџИЫq‰Ъj> endobj 43 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 662 0 R /BaseFont 668 0 R /FontDescriptor 669 0 R >> endobj 662 0 obj [ 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 515 ] endobj 663 0 obj << /Length 664 0 R /Length1 665 0 R /Length2 666 0 R /Length3 667 0 R >> stream %!PS-AdobeFont-1.1: CMTT12 1.0 %%CreationDate: 1991 Aug 20 16:45:46 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTT12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def end readonly def /FontName /NGSJYE+CMTT12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /exclam put dup 36 /dollar put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 125 /braceright put dup 126 /asciitilde put readonly def /FontBBox{-1 -234 524 695}readonly def /UniqueID 5000833 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ*BgЗNГРгН ƒи‘lІЪKq*оВXњЋšццwќsŠМ|QЭFяq˜еўцv`цšzЙXђšMyхp"їƒыЛЖдєь5OвоЫЉ”YЄХ№ЦыЁP(DTчм!С[vДС›„67XFšlU‡…В&3!R˜qЉˆ4‡нw”’нЯƒ~j‡И+лёoМuњЃ “ў_dЭV`ўџМ œH ЭШ[ќf№I“нs№О Б?SБКyў_aŠOg+Рkу%;ЫY›њ`AћеXGSpж“ЉY%š&™Кn—Я@C[ŽŠKBcCсEпх(др”Е7у@$цЭръšјŠ2` 5еБлSX/ Ћzо)ЯК ’еЉFrпљsѓ›§Wсaх-ЁД3Ш"aфy™}і“]*z•їЂ]ГТЖЊ2k˜,2ЦВXg‡зГŽ1ЃоVŒ71ЇyъЏ Ќ\цХЁ)Ф~Vˆ+€hп7Щ|v”ё1jљ>3џ~ /%'5Ю Ÿ{Юkю–zО ђMЫП™‡Gэ%+g@|Г–xЬ…нќ/EХRК–~AX^бoьФу*ФгГы€Fмн7Щ/пёѓq Ия\ЃXЋЌЃ<~ZЪжП]Х‹пУЯ К*8)EЄС_ё‘oтьG§Ш ыœaѕгUОпЩлX…Gv:Х№БЬвџГ.г~2кœуlT3eU&Ќћ:0VњА№{]‹GhsHоЙo?œSЮVнгЙ=9Э’ЏSћ”a†MИ8‘ pХHsФ,оoˆmБЮ K>ЛCра kч%tЙлh‡1ІЫehљ‰@DŸЙ/Зј!0eбЮЈ‡Ш4МъtўоЮ`н] ЫPДДО(ўѓhЫњkОаёЋХъ4јт>r\Ћї>+сŽТrЏўхИY]Q:иќN"F5HЋFxёš&йОїжы’uЉѕЙb9‚žЄTc_RHbуЄ• љяеRЛџЫЌуџЇЙь ™œzП4Ќ‘&є‚лфа)oЈH•fм Ќ]CПcuFке,P=Тp9Qgђљt• §ѕ}Ь$Ђ™$Dыž0CйЬ•Њт>іmЂЕ§mЈМДќ gе х)Y:bН,ŽЮ<‡Яйoрˆ7Ј]Е ЏGЮ‰ыгC’ы\a(М[vGŒзpM8Є;GРЦК] ТC?Ч‘WGtБYVђ9‰g˜э\(ЅПе’ћ.dvH-Э€Bц…!†Ђр,_—IхџO™)9_м6uЃŠЪpЃTiƒС.Щ•ZЉDIJ” љ7|хX­уk/K+’жю3„Ьщ›пѓњиosВ[Ђћ$IЫУPoUтьЂjЅˆЭTзe+жъvб_$vхƒL(ЧR,аŽd43J$ЗžЩ Wœe(г1šЈ'РŸщ у42kнU(;§:иѓ iФ‚м9;ЄcЁDL!j+ЫЂЬЪ_86&Зеф >wц˜J˜1јЫж–6ЗРу@F $­ЙДЗ—Я‘5ZЈчЈъЊ.TsВЊ“ІіУљГУE>З@$$ъg№*ъчhQyxд86oWЎ;щИPЅkќфцqBH’тu>С=й YуuЫЕŠuI7Fл­6~Oдє1NНж%CЮ!ћТ9Б–Фr3ЪIЬkЈ)“чФЈeB х МA‹Wјš.яР(штЁЮљЗЕ[—щbѓ+Œ~бўa<ЪA 5%€VžgЫЃДU4KЙ!Ъ эЋЕ]щR$\,§9rыІ\Э=нжю`ZэcAoЩ`b­i2sе6XSšfDu}`D-ѕџ~е›—к†Ё"ж˜зЎ){`XM ВŠX/5џ{чц’Wjш[съСl0•ЏlЁЬШЏз[јыДэ‚o~ЁЉ]їиE—ЁЕ3UюкШВ‰с_~Ќ€–й5‡9ФќО\h–sЮв,œСЏ,­ЙЮŽСЄ‹7иђkZк<РХ д7hrjaїуlяo5MCЃkѕA%ЋЉњпї|rxЌpюж1З)оѕ.ї`a-žЉЧН:†ЂѓЛЎфрШ{4сW Ж'‘šћ\лšЕКњг%2Зc™ДыФN‹ЂЮkяtg1[Tъёо6г+{(ИЊ/ ­ЗІШ§ч­kžs\CJз˜Еб€ŸЂлeНgЗf%оќйRў;Љ6Ю„НцОгчєv6мпbq†щ€s SГ‚eЕ€Ј—›я%рRу‚и%ЊМiє9ЂHjЌ(№щџt8/пяD@”ж2ЋGбY‹‹ <ђТ"Ј›ЦRлЕ‚ ,<‰Ш–ЭНТIaП7І)Ї“Э`Ї.иyБl!ЮУпBoыAЯъ @.п<гBёаюз‡Ž4U тH^!M"§ -§KЗ|кЩ(Чo"вн€Ью_(Ћ8Ї4„ХЮ8ЏX%Љ I'F №‡@]єA5ŒBЁxа6ЇРї‹€ТGcЊTsZ2GMeіšЦЪ™љk[QУѕЗЕЊј ,PЦтcоˆ4ёCD”ф ђ3jд ™фйШЃcМœ5ј(–.S\$юO—EqщЭ)ю`ЃS‘$Џ!yЯh|L ъtaZP№јГѓ,‹њt.ц6у§hТgНО/†ЁИ:ХŠcМјoЈТfЮl;нэМTˆМй/ћц}$д—НsЖАf_7@rьЖїІяOЋcM.а у<вьє–№ ;mBЎРТ~>2T R'ньбфєЮыОrТы,†Г‡’2ь'yОГјЎЄ%8ё!ќЎPЦЙбŸCtšв&lfъЈSи{ъХЁЫХ'œ@ŠПK.фЈ•мгbИHдЋ+т| ЯМЇ–I[ а›Гжџ(џH)n/Цнl‘Э—ЉZ^Ш’і@AŠМБчЃН&т\їЧИЫЦNf1hыl@Яя{№fAIчXэи8x pчЃОЃG‰tЎ 0V{ЄQRЙт“˜xw}ђnђІЄ№BйhEж9lr™вИKKЛƒЛ6в4†о@.8›Џaж\šЫўчбЛя—Тp…PeQ“W%oC–RЊX~кћŸРЕ}НУa{WKгž нBуЙfЅЉG lŠУ™‰lнW|œ УЋ*АR,7лћ{cЄпZДУ‘,Gщ~ HCИу~…Шз{Ў08ЬТ№ьSpЉ’SИ%5nџUсјцоhкЊр‰зЄшŸ`аqƒыЌЬЈkуЩШўоXk›ЎЃЄK03B1с-гDTьM—tTТп ŸТ‚Œez]k–гЋ|Гу№_а%йЇП^-`8"[:1ъ‚iўуhF­•зпѕ Ѕ—MJЭњ‰Š–Т|ЙKЌќjСH9 M Žm8а-WЪио,dH а0ћщ›МД•'@Лc>J|вC–"o…‰]F&ЏSЇѕ2|QЛяVуaЉJЖvžUЄiЄ}CРXWПуйˆ9уГЉпШлІsN_ЂСЖВбћF}?‰И5+Ћœљ.:ЋlДуЅœ1лn­к…д‹59Ы…‹Œs‰ш D В†МЧ –~јšŒџЊVŸфZЮUƒЕтсП‰ЛБыЮ[ДшQаbчам<]Ÿ|K dПN77:s ЬвёfЭЯI й$Шq ’gx-DnaЊkшKфnіЖиKеуAхбuЊ&…K‚ЖлЛ!62J(јpjгн$–a…9Я'ШMў$0c:Лtš#Ъ’8LнЗ№иєŠ (5 пDschBaьВжRЊђq4‰уі›R)7 №ђКh q ЯKфЕŸH№‰Э‡fЪЅр_НŒOЩ.YOЬC‰;3ЕћrхS\ zћы4Тч–Ѓ АVh•ƒL­4Ь š6з‘+S{†—$uЗЁѓOu^vСчй‹МŽ7­{лŒ’ІF@’я€dб‡Іп-ѕIѕ^тUіHZ‡)t(ЫMч7ш GГ…Е3гъyR˜4nЬ”ZNq|Pѕ0f’ТvœcKДGГqo’U 1м7ГЬ*а+жЙ€€uёoХ>ЫЄY Aѕ=-šYUSњXвк#q’&Q;Л=Ед&uƒЩБD5ј:зLшЃ/ЫЊ@—eЄ1И^9„чѕQš…аˆЁoЦPfєќј€9ц?˜ЎtоЪЭИУбi‡+лЪ=.ј%юЙ оЄ”rxvЗ!ši"„ljікF€Z]зМŸВQy‚hMЛЋтp•Ж%х;f1Ш'3#|9ДК=ЭФ {MSIЊМHxЩ{У nьpл„йK‰цЯ"бAzИ+ s^н.&Ц•yЌЅЃ№h^ѓї­Kюйјˆi€й„Тћ*(є—8Ў›Зyг‰MДЃeT;-ЦЊС`я0NUР!ёVϘvбТgяю0ВцЗxтЧ‚$$ _ЅСŸЃ,AuдŒъ$о VЂНgާ!чАeЈjѕы'lП6ЊлІЈ (№щ3їФ„ЭЈ6Ьћ^ъЏœDлa|гH6Аe6ДЁЦ—ЌYQўМ@\д{юЁAЯtI(8эћцяX@ѓFЌЄ}œwuЧ Ђ‚N՘НБакІДŸ™CE_8Љ hГ•EXW'СN0т›ћMyi‚sQŒ-2ъjЮМuШˆп:eђЎЭПп*ЮцhЭ 'д ‘Е“L}n!јzzH L Ѓ:к/г,aŸЗTсЦIЩЃD`-и FМСп|K!i†эfv6яJщ_јWLЇ{gzХk5”Яœ!Ш'‡A ERЎlNVбa ›•6xѓэunЪІRРЦ~№>ПєУŠ7{F.>Тй‰й/:яДЮ:OotЏ H›юx„Hіr‘RbжѓdwлT\ŸнэˆЉђЬ#vіћIŠ$еЃЂkjLMЈ‹aj№н]ЊћЌEz~ˆЊгuшнШэtoі+_3SBзЬmˆIбъбЃК‚mDя \Еех шˆќ8Gи<#ˆш гŽ1фЕЊцx{ Г+fcNмЧ7ўАЅ+™‘ ЅЄИуL‹0–9Э—UЂиЅ@‹FЙэ{ХIб 1е§О0db‹ѓ‚ГJЮg(pЭLVEБќ“гГчsXYsВ#ќХЮУ#:ВКVW(“…їJ—љ—Нжq};ЋŠ['кФqЗp=€ ШЏAaЌђhbіž55[^UУ.шжЅrЂёЄйЂїпm75Š:Љў$ЎЭЫ›еЕJbГг Щ|е"Ћ_q=tD–љxўR›™—ЪA;Єo7т ›хм>Б„BѕЪГЪёОMчf`‡з№ZМяS2H„J^‘0џЙaу~йU›еІ ОVіѓЗ^šaјЖt} Ы8ьHЏ•#ўоИx“:*Н‚o­2Ы+ŠЈ{єQ2;Фl VжPa4?‚ћR%™&7ˆЯэˆюsвЖEiHAkL'/j@QЯsžvТГfDїvcHБ>#$R•f?ЦiмкOЕ0f ”ж9*ђdz—юЫсЊYxrтЉm†DœŸяЦЇAPіЦ­xњgG$.ј•MymЕ:Нmг"ЕœвДхsэяд8мЋТГ‚;cр1“=u|?w˜бщУ-&Ц6ьp%иЧDвC-Б’ДЅjЌЃГцP2МZМt# w`ДНW3Z‹ЙЏ; О!C€ g&6+/6ўU{­ѓQ‚О6я3ыnЉ[јВdБŒЄф HЭІ№ъЕ/йLзЮK§бAЌ‰kU–5м—ЄзП1O4yOp’JQѕ С! ДKДљ§ћїЏNПШ§U+)#aЖ хщў QяgъМ:@Я VщО2>Ёb_&шkЯЯ пЁ4@І5 '@„Ќ=9 Пџ#2НuЋЯRъ*2?kxЗчъqr\СL4™З—n"Œбђ'ŠшнГ@^RС;IgОDiИ:mљЬЙƒUшn Х /ІdЌ)­2'+U/т}њ‘VћкЁmž"єqЃ‘@^ nѓ}‚84ЅлvФЌ†Щ‡З }pYЉ34НёА=ЊзяIvшє‘E9цЮЗ ’wд“h3”pЈJгk oЂЉ™fР,2ЫAŸВ9EЋwМсpfъЛбvb_­@0ѓ6LЗ]‹|()[`GNЎ-яІБЏ`)зћТЏ (CєšSXЌzou%VД4РБвЦ&*5ЁђzZRЗгbkХБ„™эжSn{џИхє‡еxœЬKЎ‘tŸ--—5бŠв˜CѕшŸ<иr\AbпЏ†ХдяГШpГыŽќ№рЧуБЂ‰Ц6щŽц 3ˆyЮџшџWŠŒVѓJЯfEw•ќтC*щИпТŸг6™Ф4“ …9!~Š;ж _ЈЕ~m/uTE5€К$}б1ХџwiюQџuеЭ+†WiолЃd]n)‚п„Э‡!GѓN'ZGзЉФ—>nтЬЭyTЪlьMЫ@ XЪЦzљи?)Ъ8ЬQб|ЂKDкЮ—рЉяџ%Мuїђfqз•j.“Я5лю(G‚ йЕ)sОнuќwUR)Щяu п:Б›.фо|жщаІšДј­ЩјsЏБ%0'w<ˆ#вИ7DІ'lЙP<ЄZЎЄзRнoД ‡z&ЈЧ^зќВT:рр:оKЭ{ЩeSэ9ќUH˜I8b&Ÿh4?eгPКUТ;RЮMwФ‡†ГНЮЮй‹uї<ƒ!'#))Х це$O*ЎЃЖƒOеі{T-”т((CД`’ьауYпbќЖБљ%Ÿс dљrЃ"Іu ~š…ŽХŽщŠЙ.mњf;•4‡†BюїU0 ТXLЯєЖAiSЪЇкиžЮМ:Э˜ ЇнcёН юПuс+ЇС7їЂ^tЬ|В—mUО…€GIz iЧ, Ъs`бщуф3‰A†L›аИ47њ_ƒЕф+KZTМУšЎ+Ў“CіхўdуАСФAаЩїѓcКчОЛ-smЈз4iWx+я‚Sцy *ї‚ьрDb†№ЇЃ' „Љ4<…ЛvqDпЁ~#Лмoa”ПТно;s=T”хRЭъhHY•Ёˆѓ œDђњ…Ч“И AžВ!dЇРє&Žh 8Щ!зЇ…ьЙ1>Љw'i?‰Щ’ѓєЅЃ%ьC[Џ pЛь{ ЌZ$А(ЙHJšјЛЁH^Н#€;єƒ[Юp2 Е„ФœБЯˆГп™[їx•ЇˆшДЎaїжЩBдEEЌ@€JPx'oaЇэЗA&)ж7>3йр=&VЉNhGWИ”ФшJ[>zќӘРя_іђп†ЁggЉвЎо’‚ЇпњМ2N ИbэšџMOcfjќ?б,ШРIZ№Vh*"}д$цЬГсш`|ŠrТV“›Ё:Xєnђ zЫмЖщЈyтЏbaоE0 )РAЂ3 ?'mойаьЛ}C3GXјМn~BНы2AЯлФ ЯкvD,“эЗА5~+„:oЙ”†)8’Њ„;бUGИwˆf”йg;ЭŒh=:зlЦ`4EaNІ-К‡чUЕІЌm>JуnЮŸY№ŸgюCtja*i—Vёо›duЃЈжЃ••’MŠыЌ‚7ёž"їхbфŸЕпЌ>МОVЏ^6ј˜Э ѕдц= м_ŠГіDԘY4SŒТXАf…Vљw0Ч’яQпЊ.vžєЭшѓдˆЉX|Я7т™ѕAweђњ€џ•ЌNеz­ѕb6ы‘МJљ­вЌVНO%Q3—Ф*ЏЭ~ф%ЏgƒЬФ sЃ}Х\ЊАЗњЅ‚lШЁ4њFыЪŠO~ТэСп™НhEк“sщЛzдх ЯIїЉ Y™h(‰ЖbbЫŒ%ЛЃ(жOFX‰&Йfж㢘г*t0ѓ|ц7˜ АщуСbЮVŸ~t;qЧ“ТП€‹@M№(‰L^жЃїCМмё2ЙК№ьўЈI(ОќХф_›п.œ”Š,лjВќЕ‡љf!ЈЂyвЭЅђЧGOsјнућŸ15ЮХHД-J€Язљ ЈpЭ‘&7ТН7wQЇ(Њі д4Sq‚Ъa16Ўiіjwuh]њіМЭёmWгЕЖ L‘/!c% эIфѕFпђˆ‚uœрPА8K˜Hb]žбЅЕzЬПР”ЃVKщ2xAЈ.эLУ5ќ8–5Ў#sФМяќ€Йr“&Щ=„oYIуОјі =саС _7ІКqЭн™“ъзвбъюћй‰x‚Aї›bXчQ—™ЅRmuнБ тГ4 эBKЌ(XФZyн3ЅFаѓ №?џU z[N2Ёџм Э;бщЊ&Вртпх6JВЭіЃІЅ[›юєЫРmшНЬnќ№џу’ЊцЂьYЪ ‚Сс0ѕнЁLFм=Ј‡зQ_‚šљАŠCsе§фNVDђVИ<К…Ўё№tAГX:j.Aљ1u™С0b=-=рQ{B XFДџnš8)\ˆ8нЯb @ц™хљЦ–]>ЎG;ЄЄ™јыˆœT*O[“8ŸЮъˆ=Й шџоъ3]ŠQ aћЩёёќюќbI)9lƒмc^‘'.Н№Š7l IЦј ьрO‚‰нЉчЙЏЙФВ–aŠm<1эšI ДџЎgё2Њњ%хOzšпцZєMўцчHМщžqнТжЄо/„ЈъЉЫф ‰ЏъШ<јџnЃ`9ДЛ-с+љ…9”зЫЎѓћ59ŸІѓиS‘"IrЯЃќfеч&ТNd#eф*ƒiЖ яAЖjЭЦ]=ЬщЗє^Цп"q@bЩŽAт=й1—ЎKч“W^ЪbИЯмрѕU ’СŒ€“Њ$9|aыт†8<нa§RІ†Я…ŽU`эм›О „МG_АцhъРє‡UР\RЌ„Ўи˜mеИ^ЉцўgЂWgщV Эю ­4uС№Y‹#SўгЎ„žъ”(М++=Nw Vіƒ З5ћѕЃлѕїзћнzЌ‰3г|зєвы&>yw9Рƒ\-ЈGФ§мІъЊbv<џіЪт;A6,3BД€ё8 ЛвzцЏ~ZунJi0 Ѓ‰ њ–ŒyЂаSІкzЋxiWXB~эyъуФ‘М˜С}ЎтpП-bmN,У‰ф^.ыРхвOЛGplF,Zфjќу„—&B•Y™k燹тE4нПк ББ§{wБ8MПp­gжЧ-„РОРŒТQuуќmќВ —EЏH†н‘$GnJ ’пБЈРŽЄ–пCбyLѓ5ІлKхт”ЪП|œ~œІ ЬuЛвbыhlрFюЃ {•\'‡#ДІ;t`/ukсuБ3L o‘<рмJ2hfЩ&•аХdБѓ–Су~>ПRђф #Н(“@H/<оЋtйjmx>/-#XZBZ,Ып—™•†?JїБл<НСoЁЪ!Ай—§wyЩЭ­ 'cэІФїБ&НћiіЫzСИ} S'к™—аЇсЛБЕ sЂжбЃДР§щТt[V™H'_ЪЬ ))ЊДZЃЄъЧј •kYЩžц)WSЭ%Нw œ€ВфЂRШАЙљNоІ:%#ƒ>#l|КТjІп_ЬІŒћ%єод ^sŽн~Е$ˆв|ѕx{кЇ]ЛЊБЬлЧЋFЁ–;ŽЄй„§“Й(Њ6dF#Ж~ЛРq‡6ј№ѕ., Ю›шYйœsфУ"Й1­ХЫJŠ…?ВD?ЪZr&Чƒ…яЪLhœLxCЋ›ёѓЎб:Yђ…nйЅ‘ŒѓEн4ПUоПиШ\ŒEСая2’§љ-ЦБЈЖС[гtˆ ?ˆJkТз Й ~р­:”=Ж ?М€кЧлsŽEк7цТпо—D€zЏСэЬ *\ƒц[мїё?‹эОпчш˜g—wUZ@2ц;ъ7о§Љ Uр7nџІ‹T`П‚[ZІJ|.цФ%П“М5 рчњЕ„uЁb}.Ъа]……L=9ш-8оxЉЉЫF]2AЖѕё(.МаHsЫYTЊd[@XўбШЏ„]Šж=•Фјz,_рP9Ј4šml=ЅиЊУGlAВf(эїyn` фIV !Е‰зkoЬТ†ЂЁ 1|шrJkоє№Ч HЎŠ(žu•]ір%*фи№:Йл˜Э™ўoKŸЙLDЧю”gфˆ0twФЯ “’pО)awl?ЎkgП3ЇъпЌЏБ˜ŒОЮnfШzЄІ-гѕNCЮ"§Le1k§}%oш…1DС LЂŸКШQ~јЁнмїІ[ћI•‰ŽЗЪZ#0“žМuјW!шhЎSц“Wћs“Ъя˜z™зMcrТНe+ `H‰L’фЭџP­ю м›і ьЛлrЊЖ…ЮTwћыЧfЪhšг"С6ЈLжX_З’­CsХЉCŠбgцћВ… МЧЙҘ‘§іkШA\ŒY?ЅЈбїнсг1ЃkdНpЩЉЗpH•џхйяG(X‹ёЖX#ЩmIj“iЦšЦIEфJŒ жЋр!ј(2З€:ДM“…fЭ“ptѓ‚ž/`|Ві•нIЏ]*zЄн€<аQ Cвњ ЧžюѕN`о€!Kk4hsзВ§‡ќKЧИЁGfНЯћц`&Кр˜у6RТZ–‘щ9S2 ўѕрmMHД†ЉОЏe”K{%эћКw jwВПџЩ‡XА…Ръї%oоx1лEз'Ю•‘і/цWФлHтЌY\dэЬkѓЅќY#`.‹—ЂгMБю• DЩёзušч ЯuˆI„ГbcS z`Fр1 щœ тЈўдО­Шщ–\(a“рSC<Чœ€ЏпЖУџ52 ЫWvе4‰ьхџhDЌ“aи6­x  w/f‹vРUCY•M]žХЅЃŠиn{aСдep|M kЩзмНќЁлнС ŠШШPдйЅМfьР:w<ЬЊ{Pm’Ћž‡Ћ qIЄ2XХ?ёP-nЧхЯ8ЋИГ“Ъv {њG•‹,CмПLњ5ЃfAF…Ь.oиv‰hЂЈЈ’pŒtЫ*Бщ”дсЇ`Яія  Ђвˆ@aжХ Љ/n#љKnЇ™ZS=’ђ;nЏDкѕwЉ|†VTƒt†БDГx„J„сm.ЧБ“ˆPіœмiPШ5}ULЦnˆcЅ=QђфжUDЏr“dd_^в†f+>Е§gO+м%ЅН†š‘ОР L:TƒЈУ‹ЙЕџБСР ыЎбЊк? gФx3ЈZ>рЃљ:ŒиФТЁu_Вe% BЩœ—w FxшхДњfљEўŠ—bYЎd3 ›СЯБhь`uWkŸБ‹š­ЦŸ*АsбЫў5%-CФІЬˆƒьъ†ІY?cŸAеœc$­˜ŽЃзў–U+O+Еdэ„ѓтлт^љ ‰нбZeЪЂO‚‰х!DЅкГЫЇzщд5 Ч…kSLБл~.1€€G! ‹…’СЖ’‡=3ђy  Žс­`?Ї ЭфЌ‚*}OИ”Спa…#…:Ž@/=| FŽгн+œВ?Wмžйцk=G,Л@г­$иЯIЃ-k”7ШзђWѕё˜ŽpJъG(яGpЩь`Ожы#Ц9ъ_А§S!­ з\lШne?"ВБSђ)Біˆ› [бЋг7š:щЈ0—uПHaюљcџЅџсWфБчv‚z&чеМфœ”dhŒ}jЭ0јœ§т›^ЅЙ ’з“сmбгыN`Q„Ъіb§ТCd†“№гІYЁжšо{юмУuж&ѕсєшlЧSfWі=*7сІ,ЪK, Zї…'+”;ІЁ7е* )ЏФ'СWНК=МЗ’+•бІ/%гSAЅ5šяс™Ч§ќвˆщ„_šЖЖ&?%*zP„Ѓ_а єцIдFГрь­с“t?њЖЊв dЖˆŠCЬAО:jF{ЈhO‰ Xd]ДZКkZР,гžtЪЋЁpТ/ђ`RМБ—=%fŸЬ№ЄІњ—q}КО^`ЭЎSЁTЏmтГR)ж#ўRџuюЇЖЭ "s‘ѕk№эŸ№АЩѓw ОFCF YцGГbЋ и ?Щk§і1'мђCђk'Ze8~ЋјВVTš(<`gz№5cЖ СТ‚?Cнœ˜3љ[Eу]ІаФђ4–ЛѓлU’e:0OЋGVЮМ=?Fr; ŽP6ј ї8nьЬь”‚YэлH; ѓ“щrџї›јq$&ƒƒ’œ ауП3HШУw BŽdТƒиз&Љ]Л љ№НТ6ќ“‡tћTьйt№ЕчиХŠї™АwЋЕ"їЙSЩТTŽ˜Фчiкю|ацєŸЃ<ыQ’n; "4tљ4 ўп 5J6ІГPЉвrТrNа 9 œ Щ7TX\Ъ oйP++ЙЪKz=ž§ttbЂќН7ЊЉySKfњ:!.`њ\еž‘uZfфЏ‚Ё7cЁv'ЬЉ ЧУ-djLyKя&kg ћqBэmƒйaш^5LКЋžи+љ—БQпШ‚­ќл098ЭХдA~sр_ŸЬ]kЇщ NSp’7A>Išч—dџЧ‰ЬLЂp'лпЌeЏЄьС |Њ+2јЕ…PШ$РЛ!віXW­LЎ_§ЪcwwnоT_Џ6OQю:є$4Ю ц(ВнЄ­Њђаe  Џњ/‰eќŠlљs(ѕ№п(ъЁ~a0ѕTхxЖVHуEhGЖт|@E:{ЗЁШy‰ђ-)ЭџJshЛОцЎF№т9ŸЁ&”­ЬЇЩlgW}@OiU­fг цae"ЈПSАtкђ~ЇСњСжЪF7Qси'ŒеЂНБ тй0Ќ‡ONџ_iжБЄ`IGЖзС%ўŒЉрaр‹lЮx/ъ-їЕУYЁJœ…p2PEщД6Фс%gњ=ЏА"SF№‘ —œН~г(cЎˆŽ žbш–щ+N?ЌкQ Дї=ИщВcСС"Ќq57б.Ў‡Ѓжv0ЎъиЬcзKIiИ˜У>Ъf‚ ЎR№фXДлщ№pB bQЏ2ЖTтфм‡БшЅž50у#|Еџб—ЧЋдkgŠSxш/}XV‡“Щ/Ы мiчBћ0ˆLыгШSЂ€ЂrRдИ€(м§G9 CЖМvўz)( ]jќЧMѓєтџœцŠ њpЦКk33Чуэmв–іў)GёДЈмЭїїZ‰„фО†EЦJЃC€АГгŸ.Ё•вHšƒOEœI4u*Wu"HгhKП[ѓvVаџ&IsoJKA6N4N8!nсЊ ПЗНЫfЗJ -x<=KEy“™Z"спa“ХЇёєЏyдБюс_Щ{%-YЫтЯTp-œ]•\Œfژ8\ЧўйC^ачв+gМђ9Гu<ЦЁОсЌзнВ O™чщИу§?вЦЛn–­ђЕмфЋfб2?— $‹FЗЪуj@д„wXК<Х:KŠЦŒg’lQю›зl}:ьЏnœЦ#Ѓ1(ЫнКzі~\8ЮHи.Б§—4ˆЏЩЈе}ёСŸ@3ft:F,Ы ЊЎѓIc*tˆ˜…ЧUŠrgыЕŽчљеCосЙ 5X‡`Ш"јџЈIWnк~yГЩ0Б.Бн=‘oќсcА‰ђЇzр"1Ы>АѓљžZ, ЌщњЦ™8mE ‘r@DnœuЏ@=WžђLЗŒ–:ЉC’DРGžиЊš~SЕЄ5s|=_РKЏœGгр^aЁn№я]ИYАšИРyƒšЮ^ @"Tyc~\BUƒЌАVЄpm|иY‰S:№…щЦф0m FUќO` дrШfђѕ}ЧђО ЦХ@Иƒэ[akЉџŽ GИ–ƒtlћ-QуОуC[ oё0В mG 0ˆ=xGНCd—Bљ–ŸњЫVnh”s ВDвИuЉeњњИЛЭw*зŒ-Mt75Оп]}E… 1Нт8Zку6йmgхfШRГЦœОUzHя@_`PsьM6{ŽБFmV\ЧWЁгфŠFx‹щQ№]ЪЊћЯтЄцЅXъMцхr‰WLkz )<Л!Д—Б(Gёˆ{UM(A%i†˜T”Ћс}С 0*жцpїв7лб_тk€ЖэV!С…BV&cиL†gы3MHTsЙ€Rц(зНKC3ЖH7HђОN4kAЄМWNЕŒ…Ыдю,)Xэ!ы‚ќЃдЂzЎŽЦїмпЧдrз,ˆфš-_,‘џБ(Ћ_Љн"8уB5a6]ЎыА§§Ійny”‡ХZ2yоnQл€Bц yž=Бв<}@UHлПDKё~‹иLx6Žк†ВЮЬŸ>%‹&Ы%ƒxIV8FНя^QFИu> кyю)В74ЕО+ маЁмЈжЗŠhLšДћ˜шЊ.hm^ЛЌпlЁ"ёМ‚1fЭ`spїйЕзў,gєQШкэŒЛƒАvЧ›6~Vё-1DСm\Z­qњ _J ЏЁŽ]r6gfбDЌЭФ”џGм{§˜УjШ\‡‘•4d’,Ѕ]‘и&Ѓ%шZOвШѓ_”кMоЎOѕ„&ќ|тжoцЪvч/™Тт;f§_шŽHјН1€PfU^4ЁoЉ Э8[œbtЉ{L›7Лжœ‹{K7pкњKžВЋнujю+—ЯƒКЖm\њ^нн‰rШ\ъМЬкШ`Зtі™МЅ. FгSZЫwБЈŒ—ьы7?ЩМЫ Bбе,§1€&kьЫA 8њˆъї њ@GN<ЌЉ)ВВЕлŒяєя_I?ХuАр№sЁzГх5Dи<Т…‹З§yМЧ+dЃlъ}пKˆЧЎ”Њ~Љ‹§m$IиK(˜ў‘сдCNЬЇ œ&у1‡ПыžєэF}ю§о^dЭk№ьbЮL5є>ДДЎН&нp4J{КШ`уŽm‡жMrrН|€}$Fq"і3D`1тХу?Ђ$:ИхŸtІWBђ- ™KоHѕхЏнАю#V:ЯNЉbоЙi”; 5;[™юуwZhІзbйуY]jˆnXљюex…RB‹XDCфлˆЅžЭzЖиБqЈcaСЄБЋ#.2O87rkOЈЫ€БѕWŽЄ|;щЭ“Œ@xТш-ПИюВбЖ‚:žœ/bї•ж]9š / pp ‰›TЦъzjIрG™Џ\фE]&„ЭvcшЋa Џ„gMѓ~;Xne"$'ЯЈч№`ˆjT#ЦНЅghPg€Л@Mn|Ё:`Œ˜d}нѕbОeDљл_ю[ioЮyMуУmЩи9yК[ЏJжrў лp~УT_ьHНyЉ<ь)ПŠк$W?šи—"аRY'ХВ~џ&=Јv€& ЈЮ…ОаZ:ІЂм*Лoрф"Mн чi…>ЩOBž'ьхoЧoЯSЉюжшTЋ~m6БsєEГОЄrбгиCЩBYrFТ-šŸ•›мЫ†йО\HВœUр[Eџѓ €‘j›в|КыIwnСѕъІpЭ›ј€I(№ˆT’Ъ“S Dсщ…šИbПTЫЧМ]ƒ vяpБ8ЇKуъRа*’_6ЫeIЄ(њw˜ПЇ§oкWXќ Њ —Ќ&TтYЇЏ ВpŒбяоVRŒЎЦЦuш`п‘и™FЊ\ЦfИv.\Uу\ЮwV~ы:€Ы„іе‡вKє`Еч˜Л˜ї'DцДЧїxQ…b]YЧ˜юаEВA+<іЬФы(БУƒjЮОX"§УцRЯ —щnўоєcп–ІO$iрВ0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 664 0 obj 16142 endobj 665 0 obj 2167 endobj 666 0 obj 13443 endobj 667 0 obj 532 endobj 668 0 obj /NGSJYE+CMTT12 endobj 669 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName 668 0 R /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [ -1 -234 524 695 ] /Flags 4 /CharSet (/exclam/dollar/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/braceright/asciitilde) /FontFile 663 0 R >> endobj 42 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 670 0 R /BaseFont 676 0 R /FontDescriptor 677 0 R >> endobj 670 0 obj [ 778 278 778 500 778 500 778 778 778 778 778 778 778 1000 500 500 778 778 778 778 778 778 778 778 778 778 778 778 1000 1000 778 778 1000 1000 500 500 1000 1000 1000 778 1000 1000 611 611 1000 1000 1000 778 275 1000 667 667 889 889 0 0 556 556 667 500 722 722 778 778 611 798 657 527 771 528 719 595 845 545 678 762 690 1201 820 796 696 817 848 606 545 626 613 988 713 668 725 667 667 667 667 667 611 611 444 444 444 444 500 500 389 389 278 500 500 611 500 278 833 750 833 417 667 667 778 778 444 444 444 611 778 778 778 778 ] endobj 671 0 obj << /Length 672 0 R /Length1 673 0 R /Length2 674 0 R /Length3 675 0 R >> stream %!PS-AdobeFont-1.1: CMSY10 1.0 %%CreationDate: 1991 Aug 15 07:20:57 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.035 def /isFixedPitch false def end readonly def /FontName /PGATUH+CMSY10 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /minus put dup 1 /periodcentered put dup 2 /multiply put dup 3 /asteriskmath put dup 5 /diamondmath put dup 6 /plusminus put dup 14 /openbullet put dup 15 /bullet put dup 20 /lessequal put dup 21 /greaterequal put dup 25 /approxequal put dup 32 /arrowleft put dup 33 /arrowright put dup 40 /arrowdblleft put dup 41 /arrowdblright put dup 49 /infinity put dup 50 /element put dup 54 /negationslash put dup 56 /universal put dup 66 /B put dup 76 /L put dup 78 /N put dup 102 /braceleft put dup 103 /braceright put dup 106 /bar put dup 107 /bardbl put dup 112 /radical put dup 120 /section put readonly def /FontBBox{-29 -960 1116 775}readonly def /UniqueID 5000820 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ/ љШ­щйРXИ~›id}S5žQ!gtЄъЁтЕŽУkбJc;•rДNŒ^єЂЌЕŠ ІX€5П.иSyƒŠ– ў+'ъIУqV˜œ…т:Пrуš‰#,йє#Ш ždшBZЃОїож *R’*"7йЈнyнчгђИ—Ч=cюЭкLIPsFŠ'бf> bєaіф ]fvбб+QцAСдштwdќOŒП[xьˆ"‡%ёФSІxѕŠ~{зЪpвˆыЁѕ|O ПBХнаУ„Чт/€GОLШу3hћШ+N–g0о3ВцИЫjфUБЏ1‡џшЅ~јІakœЗ”DьzqЇЛ=їU}.KƘYяЄЛУ жЛ1?дйCљŸ NЬŠ2MuЕі–ИhŽы/хэ4ЬжаGЄу€m&vЈˆ•ќ.ž№dЏЫФ)%\‰щаО ѓР.Џušсџ cы˜(‘$E­­[‘ё ~В‹7Ѕ:ЩПSjќ|И"4ьъФцљЋШ‰ћG%$ћŽŽї6лЄ„чs‹`ЈˆяяŒ”ЪeЩewиСыгфАУ…4(Ћ•Цз›фODЎ4.Waв: к"цпк((№&6кл>чЯ Jо^Q]s`[Mb ќ:сl%і^qc‹fоѕlђ1щ’Q']Šу˜[NТLLњZлeЃBЬеЇV Я§џO”sчV‡Їд Юk$B;ќ>ŽЧkŽЋM@тj НХŸФG•Di#T И)Цs:”8!b*о+у*ЂŸ™^йœ2iмдїцЁfѓŒWњу S†к›”§А$‹\жђТї!оНL­PZРžђЈ"ŠXѕ:хЧqоИ ДсŽ,S>рyЇу Јa џЄaЖX^з!уО:žѓ“T–і~…-‚ŽмБХ:УЮlѓ-QлљrЫ…hДџьmЇaіњ’яbхЫљТRЇёƒаf'x@З[1шЊоzчщЦ{\м~]5g )9pcB)™ГIРˆ8Кy 2CщxЄ­п(Ig•ВŠ+Вw<о Б%Щ8ы]-Ѕц!*]m@лш@ЦŒЙB#›<&эњЉЧˆ‰ЗЎr ыС(2гЩё —мAЙМQŽ™>DђЄАФhЈїРъtOљxЇGм-9КФЕG0шŠFg4MƒъR,SIеІZ;WuЩжРС„…RтšБѕQоЪIM„ј’хb€ЎТ§U,г7Гщып7. (tŒ АEиœMZ2qBўэMш6Л6я\`е …d>НзцљЃWX]$ёиН)ъ—цtС4БЕlе8љ…4юaZsЃиИ(NQъшG*ЯbЏCчІ%J(ЪчОЈŸ8ТйЩ&і§V‚ВГ‘4ге97уP]бЂut†™9–“sыјФ.бCЭёЛу0NeЪ]НАcЉЂcЎя—ѓ р­§`д `H@4=мЄЁLkђ ЯЖ DnЗБLTNё›ЂЫ4?Љ‹ ЬШ.љ”Ш€ШuХш›_јПЧи6ЊЎщ>e#ˆЂООߊΘ ŠI%њp•СiiIмˆп}…ЫЦ2љщШўшЭ Г‰тЌ)@JATyˆ`t™цфПhQfžCћeœ. Эu .Nn>WўЃЭaЭMџe„ц-s"З#И_q eіE@D5агХ№‚AToKs/Mњџ˜v.ВЊJъ§Охяƒч]ѓ@CWыКж!<ЫДббњд‹Ѓ.пUо|•[!›Py rьVbHЧѕn9ЭдЭў€!Cу$5mDRgТ™T(МqhP’ƒŸџsk<ј šƒ”/Ђ’ЈА”жТthЅ5ЕFр з№є‰хцhйz)ыtaб`Е=Ћg?§ЌЕ‰œЈ geЭЯ*З7:ыM˜—-цЕZк„_H‡Њ\3cџ†Wt :цAO1ЗЄD u_ Ў{QЬl0 &JХ]oa{Z@ыP'­ШX@bО”с>їЬf‘јMЩс=РM8Zj=ѕkMчК{xѕљ~;цЋJа€ѕ ўњjьЪз>б“Б#юВ+YуЯ•H$fŽкАЇЩ™,бw™OKeI ЧmQ4aєx wЖ€$з ,Ц№ƒюm[$шU№‹uJкЙThWSrЧWЬZІ†ZЇўVіж.џh•yb№вѓ@fњцdœ(чрŒm&ў`X=y‹ћ+nЄДТ-в†‰Уž# Ј"’RaпіY‚mЋ1… „ХW„ТБoўє)TvЗ8Ея ц=‡тkNAЁћмЉфІ№jњFни.T^З№2I`iЪ‹XЪОМЭ ‚q}вО•є#iMЅAчYГPЗ5YuњьpUBцУюAvЌЋж;этF[ќq‰о#Р.лz*m7уœŠsїч‰"ЂѓЩ@Žљщ!<п„BЙОo`њi:‘j•&+h .dЇЄ&ю ї†ƒžy9u@"PŸ ЗZ•–цI†п-pJ БjўИVьС‡Є8—ЌQш-ї:% ’т8VЃpбрц_оШ,ЬGьžріœ]ЩƒРј–Ддaм щ  `ч §ќноН А4Zw;#\ƒКџнœ(с‹Z_&7ГdНŠnЗчK4;РЬ’я'ЮУ=“{“Ÿ‡2x(~u€гЈ„zr>MјЗ#/ќЇоxAДУ+ЈtBЭXmтHьтx.œtœЦ7Ї†[2Œ ж™КMO Wюށе„(%б6^ГiиАЖЫч†eJўˆdхьтдdд51ЁMK#A3*•с1ЩЕ\Iђ nО–,D>нѓђв$я,nС‰"ЂйЉџЂ5D=“hя*О,#ќKfЃQ4Sg+ў“жщ 2,‘ю',Шяo†=В}~цG^оŸРžanЯЉЇ№*Й”УЅ$]?uд(Ѕфy‰+ UЈK5KЉYШcVі}ёыZ†Яu5"Ѕъ ЌГ KэС*4(Њ0%Fгeaа.’Zž‘ mwаы~_8Єфx—ЬИb,i„2Ї‚2и8myуФ\LђЊjarјчЏr{ŸlW˜Š†Лp21ZyIHOјїџш€ЗЂVi1бљЏ,OJYеЃМд@[Vœџ%]№€!8Сoа‹ву–ЅwGхУ{мл” ЇVАсœЪ‹sЁЊХф 6Л’wŠрLA.ђŠlEGыIн›s M-DА,Ш7тQеЄпrЫCюЁтџ<уЙ‹ Жа›Kљ6 іuЈсQЇгП›ИЯЪТєЩ~яЎъ]ўiV™ЃšЧ–оTxSтc[ЉЪ Œ=TАџc \§ьqiЕ*•[gЦ\няNS KхBКi`CoHf•c$Ј‰!фT*фа3mлb{IЃœцN‰Щ+‰КА%kЊ‡‰–m_ѕƒcЧY[ўTїrs&ѕъМ[@^ƒ˜ эЏokЕіw!ˆZ”RЂ8’-Ф?ЃБ‘=tS в=іAи=єrеЄR„Ё-V„сžРЮХш‡юіЁр-uћ)ЌPъl…џ/иASuИu§Œ7_пэO”NŠnkЇ1у_ђТЗP;p†=Њбxв^—О[­Ћ_\'#Ш_"›нБ}>гвg} OJ~јьь№ь†-ˆэ,O]пDЂgвїЙй?!ЭCˆи,@ьJXˆ*№ЋЋёŽЪ‹6щEГo#б"Х•ЩїkƒЧPPО=]“mšЖу џƒ8СцПOА–§*ћЌ JШuIqиѓп!аЉ€O>@аPо€нvюЂЉЗ0\{ЉБь‡^Žєэ’R@мwЙИцdдq1Hsг ибx?IPяИПЃyT=B>‡ъ”лўкUУйEgR‰ђлšTЪє]Joе т{ЩL§Т%t?Žж“ЕŒUšйF~> ђVJ)м47СлГF—2Y§жщц~%Ж-UJe4QRВ93Е<Д…6&kŸ,}ЕєТ,ъЎйЪžRптB€ƒЃиђJAж:œМJр 2ЃУŸ5њ^ЎЈr˜ІПх€гЌž‘uЋ+iXѓ6Як(лWxOSRоl0чщлй‰1Ц|#.ю№т‚ >Е•мЬgˆ3I^Лj‘БЉ-енФ‰ƒ№jћѓі‘.Ќmэ&l%ЫСуу€•во[єŒ>^Ћъp3ПГЇW"ДeЛСЖœ17ЎёБВjOАP†^†Л]%‹HžШгe XњN~ДЇo0жŠэIеSlюС3A`G…'ЂˆЯKэЩz‡Ч€ѓЗS^8™(sН З@>i~3ћЎл›ю…Ђ'Ÿb7?GьЗƒ=ЬІ4!›y>:є21хУ+@1kТЎ. œ­Q4АЊЙ)ЈdDфю’ЗцyЇйЂ>UщХwтƒДЃз?[lЋє– LrљйхЏ˜APu fгЂѕЪ‰вŠMSСJ pЦ$+žџVgтИбМе˜ОЄžгƒ№+Z ьПМ—М/юн y§ B™ ,cЪK\]r.љФ”СŠЬ’ыъРјЉJŒ\&™,VЗЎоЮpXТяZІX‹ыЮЩ="МšѓІ‹MgYНо™7Y|BKzзЬMЫOе ŽЕМ{ˆ.r–Љ—­ПѓЖ{Вѓh&wйЄц[gјkЕЃQ]ћ]‚шjВ+Нѕ§тяP‰В\‘t-ТТbу/MщM3lћ~;’‚Šim›пЦO+ФgБPDœЅЌЂїшФ3Ўюlђ_ccйdЦоoюпзнОšЦa-.дўhдАЂoІ€,*чhc”Ф*щG"IK,Л“2’P3#*'Smо LЌwˆŽiЖЁgМzaџЭјѕэъ”Яa ]tDё”ЫoDh$„˜‡ˆVя ЃvhŽхъm1Хф}Мj8€e‡оЖfЂНСУЩХ<0ь4СДЛOаH ФИ)YmУ'юТШ†эј%ми\йшѓМ‚а”šЧ–Fz+%‹#^ї/WгИ?‚7%yХјˆі{ифcЮ -—LbТ)#yіБŒŠwmСћА­ъOн"bЭ\МX˜xwyї6$6_ Bљљ$рZžeAПTNK_‚ЧЉxмъЫ]‚˜žt2…>‰Ей\БЗIt7QіEefUвЕŠшh•ЙыZ_щѓьГ4ъшРы-и= 0bIО*нaH­Б4RƒдЁ`фƒтЮъjГЎщЬg‡FУи л8ВыF~кqпNЗЧœ‹еТ[ iи_г@Р‹ХО#<[NлŸsЖдпР№bYDuЃnЦЇЭнNјк"И h%ъSW mЬй^‡їх!єй$uQ1GлGѕ%Nрc(Jt"м‹юŸ“cjЁђ њвŽя^ѓЄјХЗхѓѓLЌGцЧГž•фІфэЄзІeцћSЉр yHЅјкRЦтж‡уЊYхыЇщi €Ы,жОq‚.­ќfШЃ6ƒ?щхьљЅ-ЂГДЖо‰$ц 0P~јМЈЕ{žЫє•Љїe‚ІГ’m ХdeЉM§ Ў-Зq>рќЁИёwЕs|ьѕ]Pдніg(˜Ај?%ƒ^~n Ÿ@h;ђшo1W Џб…ьєѓбдЛglYЕ„Нx6мєћвЦ`фSRlх5Ў.ŽСYQM„“7:їŽ­wАуа<0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 672 0 obj 6693 endobj 673 0 obj 1350 endobj 674 0 obj 4811 endobj 675 0 obj 532 endobj 676 0 obj /PGATUH+CMSY10 endobj 677 0 obj << /Ascent 750 /CapHeight 683 /Descent 0 /FontName 676 0 R /ItalicAngle -14 /StemV 85 /XHeight 431 /FontBBox [ -29 -960 1116 775 ] /Flags 4 /CharSet (/minus/periodcentered/multiply/asteriskmath/diamondmath/plusminus/openbullet/bullet/lessequal/greaterequal/approxequal/arrowleft/arrowright/arrowdblleft/arrowdblright/infinity/element/negationslash/universal/B/L/N/braceleft/braceright/bar/bardbl/radical/section) /FontFile 671 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 678 0 R /BaseFont 684 0 R /FontDescriptor 685 0 R >> endobj 678 0 obj [ 612 816 762 680 653 734 707 762 707 762 707 571 544 544 816 816 272 299 490 490 490 490 490 734 435 490 707 762 490 884 993 762 272 272 490 816 490 816 762 272 381 381 490 762 272 326 272 490 490 490 490 490 490 490 490 490 490 490 272 272 272 762 462 462 762 734 693 707 748 666 639 768 734 353 503 761 612 897 734 762 666 762 721 544 707 734 734 1006 734 734 598 272 490 272 490 272 272 490 544 435 544 435 299 490 544 272 299 517 272 816 544 490 544 517 381 386 381 544 517 707 517 517 435 490 979 490 490 490 ] endobj 679 0 obj << /Length 680 0 R /Length1 681 0 R /Length2 682 0 R /Length3 683 0 R >> stream %!PS-AdobeFont-1.1: CMR12 1.0 %%CreationDate: 1991 Aug 20 16:38:05 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMR12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /PNDTQD+CMR12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 0 /Gamma put dup 1 /Delta put dup 6 /Sigma put dup 8 /Phi put dup 11 /ff put dup 12 /fi put dup 13 /fl put dup 14 /ffi put dup 22 /macron put dup 33 /exclam put dup 37 /percent put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 61 /equal put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 91 /bracketleft put dup 93 /bracketright put dup 94 /circumflex put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def /FontBBox{-34 -251 988 750}readonly def /UniqueID 5000794 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ*BgЗNГРгН ƒи‘lІЪKq*оВXњЋšццwќsŠМ|QЭFяq˜еўцv`цšzЙXђšMyхp"їƒыЛЖдєь5OвоЫЉ”YЄХ№ЦыЁP(DTчм!С[vДС›„67XFšlU‡…В&3!R˜qЉˆ4‡нw”’нЯƒ~j‡И+лёoМuњЃ “ў\єщв@[œе6]nЮезhжmlha‹ŒH+4ŒЃŽ›ЙКќњ­œ/?а3Ж&˜nд=œ“a6EИ#’еЪс|Д~.‚мд…Ы Lw2.ВцЇsмNYС ЂкЛ›ї.,ђVнnЕNьКXЋй3Е|шЃ бk(QзIOs mѕ;мfЛј–Е‡п–C1}_a й˜Io#нр0їВwн™\‹œЎœ™ŠФсPЭќ,fэ’ыДЬ *ЊŒсbGЁ3Zг2кЉPв•Ї8L3џrъЃ[‰vnc_EФРh­~шg9А|ЙM)џ }Yџ™aб•ЉHуи|1‚’•Ѕm!‡[A˜zЁXpPУЧNCUЛ7ђUжВ7Ю–ђTgїЁž…x_єh”œЬyђјЎWеї›ЙХЯ^э]˜WЙ–}›–ЭЯsеж_їZњЛfs@КтdYr ШŸбsy&vJ“аxДы)Œ‡жюЂнБЎˆХ~ЯяKqф 4•м5hЈLЩ#qЇ‰:4pP§Іьї?gв |GJS†nœˆц^i2К‡Ї6†ъА“‰јM˜ Ԙz0э”.ВА ПѕМЧ єтvУ3›1ЖъЛАxCj Л7}0aЂ Й‡–И`~ьМi”EъЈfУŽB wS:лќ;9l[ vЏqoЗ§ Т(Я>сDlqYА?Мkк‘КђŠгтoˆ^т8‡KўшLGЏ7шqЋZ…АCш`ЖDt‹?1Оd1Ајєƒт€ќЛрЛHeЮijQ‘oБg­L0?=Lvє‡sКy3DГОфбWYІdЃпЫаЙCyh—лƒщBМšТ­Л!иж(хНWчNl Ф й™ЃyœтІRъвяc„ЛQсŸm3ѓ}ЇЯ ьˆ#%оWч˜.C§ВГtјыСТs&K,ДєОwн&Т~OXм$ Ў†йћOXъЗž@эйS˜№sTЮf-‹•оШ“/X…™3Po†яI%Гќ /вЕбR KFp cI‘•ˆЧbYђЊЄжд-Ншt+#гЯїdжpХЃuеfkeы^ЫЪг‚‚ЏMЁlŒ<,їƒ Ф‚?nPVQ%Dpе Ј t^Ioэа­ЏKЊ›TЪоЋЪЇызGЯcИ>іЛn*kјчŸ*Он.хЪN-†Њифf‚Ђ|л …eЬwўРь=d!9–oпеЉ”XиаsЭЯњќ”*ј}ђ]HЅЛ†јrЪWкє3зžŒ4т'њ‰вТ]škж€мD#J…љИх/‹œ|,+їРБєЬХ“їx^Ѕ7Ь9‚є^ы‰ŒЛ5К1ѕkYђ=˜ћЎънъ‰F ГІ#їБ(ъЂ‘И€Ёи2:`цЙ8ю™бWФ‚“{ђpећFЗЙяž_ZС>!Г›аГ %ИТвA/2уїU€Е6dГaX /Ї•ŠѕИn„6ЦPкФ&YїšхєYХ9{хFШz7Б˜4і™;ЅПѕуEжпщCaЙЂрЅBЊ3,№Qy+uJг%Еђиnp ю/œs„С/чшяVмк&<ъвѕРG64!~Щ •‘^рП0жBL7<Чм,љCз™Oђюwž~ŸѕСNBN"sLoдЁ ЙRУ›еs…›ŒТѓ•“b]т^љTШkа•фяка;ž.З _ЖLœ5ЛФ7ЄЬ”кдmє~чЧє5:o(UЮ#дfРЙ'EеюА &ўPп(Жe–&ъbю„Ф$Š’Rйš4ЮE<…ю(bYі}z"я5Я‘!:$‡ |ЉŽ IP*ŠЩXaŠЄ3;œ„ИlkX<ПлеЕ“jМk'х \[< ЯVюђђ)nuгN4ТYысTc"k2< љ!№І,Ÿ:т†ЩЩвBЩ\m'СЕo^3a,f6С X CЫ– бЦюe3šG ш›`‘єьаН‹‚ZгЧЃах†а"єŸš”ї­zі_H›Žq‰љэ_ƒ.Ђыhut\€ЧbџёТОию›:щ—Wh$ЂDвdх иэЮXMБЈWs ІwUn…Gbˆо@яБј3вКБŽo*ž ЉЪГ&›Г+oФ’(СwоЭх1МЅыЂNВNdЖqˆp5=~ uyЫ5!ЏO„o+щбˆК™ЅћчXPˆRм[@*ЩЂ/яtнЪ ж)*”Щу‡“9З<ѓŽфS&ђŠ‰aщЎ?Tуž]”- Ч3E&sуT+7љfЃSB єо]zѓЃ–”lчW› Z„Я>! xJXюnS™ЬWUИp:hѕЈ›Qa`й­zл{‘бПŽbviЇk1Щ/W!‘–lцЭ6кбšу'“дŒLxХŽ…’ЏkFŸвŸ9 п‡ёљъДD У‡Ц+„Р“С&В\q­‘јП<о y pz­ЩO3,,жеWq‡Oн ю8L!…`16‡ѕ”7ŽЭ  УЉMlуљ[-šŽFŸQX*lш @‘УЊ`ЯН—7n+Œћ.|$/˜Vлɘ:—ЬBв ЉШMЊ€'“}lšqLšнžЫ^)фR $ †#7$Pу!3ј v2^€У|Лo’iƒi{еjџwДyЊК2Cіл‘,iйЪС8ЂБ&"ОєцXТI€єB™­#{fњh—ТDq#ійДН{Ж’q)œЪљxЎ0ѕKЉfUPyРИ|‰дНžщІgє#™:/ДЛРЎмэИ'ОdЬ­&Mы8#КKŒ`šZnq–žс§/iІЋЈжЕЎО-Ьр˜MšHЇН*‹"§=z4йГЧ@iD‘ц™ЎSv”“?Ь FIЏ†6g:#Ÿr3ƒѕмќбЉГ‘—(иIЌшлŽ”фУDИpžteЎ{›ybЬ>^#ц †НИr?%{UўрАEП!ЯKыy(+ЇЉp-ј@з™ыoU†Вy‹Šр@+”ыdЧЗАиљ@0ŠlЯРv?CPФ‡М„ŒQ—ъГ3§РЖђ§Єb‡qџ ЕPХЅАипсh2aЈ?іёОыМєтp—ьЕZШmp{_ˆ&}HЅ’pдЩ”зФшЂ{‹e}SУ5цeкh“Їi0"šе6Яй \п#фљзјюРВЎІi4ˆ/—АŽў‘-­}–rœYˆe+вЕЌо‰ЭDaМцУШU[3nнДЎй'Нв~&Нњ ,—ЦwЙ§мЌш;сСvЎт(U;мхъ=­ШDb9иlšO™%GNrэU†‡˜J…€Ў2СfMРж'}Ј\щЯј83–zкcђq˜ШП.еУ,oMЂТкс–ѓ“ŽиЊ\XѓKwCМча3єkйoCИrЮ}ƒœAЋу%+Б­ Е_а' [з‘gћ†нчЁеВ~тРWГричlO—)ш /аgkBтВtKd љютŽяYЉ-IтЪНYЖё[Ццhцэ&ЉеCEŒёbNЩ=/UФŸа“№sБ9-‡‰ѓ•/а'3йŒјŽЌZ&>_/†№ѕezˆ‡WOёbоЅгЄ K8;ЎЉх64Ѕo5zeёA”яgю&Џ—оm6gv"Цц.%ЭuL7ѓ†аK:Е§|ШщMfв MHLШOћЎ7„+x|1IшаE?ЎЊ`]ZЊa „OGўЌ+†V†ЮЂ -…с;fŒ•N€x0OЮC8Ѓя‰ЏfТдфњZ­ЊV/zJB4kа)„П*‹3ˆ*ИpKZcЪu)к]ђј9ІУ‹‚1ЪШ] œ§dСžЄa–iўРи ш7jE2ЄТыX.Ш„fzƒ—ЭWi rКя ЦХf.57[qспСЬu…–Z љвщ‘чШЉšаžЊМhWIƒX+uЫYњAёЏЛP *Пws[ё‘X–™ИЕЊf?‰IXњyœ‡і0о­bqСБ†ˆI,rычЗMQЎШ2Dоž;Žd/9(ŒЫРб/џ€ŽrоAд~VЌfьћЏЃY]X8g ЌЮsйьЕ€њђИeRѕЩŽоР ыzGЦжQјn`Pј!>ОБЩЭТ„T$‘џя’’лZІЗЫЩ™кЮжЋk;§8Ш$СПѓЖFc g9‰34Ъls0HUхХ ЬSЭиДЦСЎ Dх/TЛ};фSЛ'vЕƒ FѓПњЛјe:KсЦХm RdЃ>iR)tg• Ц.фƒБdRцМ^ЏI|ukНэӘ…щ%‡I%р*ћB *moџ`(№bTUQЇ. е)­Rk…џЩ^*]ЕY]uШа@tŠbЄљЄ‡^˜4 гrиŽ%лш ˆiPUО ЙЈСŽЉЧM!B’rфіоІКАџ’ч…“t#Ј> ˜ЬˆОЇHGн‹мдјЇ@y—еЅоz2сBЪ%S§тЙЁ‘БjT`ЏZ5 ќ~x‚‹р'c l‡Јљ*…бНfЊ_љТќўА‹Ѓ‡"њЯDЕЙX&iЯЫЩKEЬё1У›_u3вгBёP/ц'мbHybJДЪЕш8уЅRГ?рЊЂ4ЙН-nЪэу‹ Єј8І_жЉIё'н#€ўnцGЉV_mКрдЅowИ-ЌаЈчІoZœЂw.up)UJЋ,——HŒлёzZёВ3љvіЂляКу7PCюLйјK5r6Ь% FФaИ ŠWш‰,Tг-Ž7ўІwKЈЗ tGг†ЅЯ–-Zbг,ЉОлM,Ss…ХЩяЛБ†§Jd;фЧГLЃъЄйŽ ЦAВ-]KДх,л[Цт3Sqмё/§dX–KLЧЫbP‰щД Нe:Œ U7hзџўг8Ќ•aiТ,ьфХ7ђЩв["ЄMœСŒйы*гзc(Pѓч§у’ЊЩдіЃЖм.Mњ'ю„”РБoJMисG6UЊє‚Х‹^>UЗЇЯ!Љ{ВQПЌТ?[ ”ТгLЅ SюЈ№jСuRoўЪpЕWњ§,сЁ§XxџœВВ Y“˜5ŸЛЭФD‘V+  РђХ>& bЭmG Ш сFl >ъ і{тRЏZ‡аFLЋ.њЩз„Ку‘WlJГбяІJБW6qШ[d ЫІ•bq+IођgД‰ВђЃжRKїT;rъPpЂў­віЎ Руќ8NcGsђmСA —Л9H–УxLКWšмхЏгsyзW=š№Ы <ФˆиЗpEL'Ути$шp9aб–љюjсИр{_иЬмІЁўч уж%ЬЈ›0BЪю.МGС(CЭъШR&„acфfxн"тмXбЯSэаfUUc‹FљSќ­$%тКџЇљфЕЅщŸŽ c[ЖL^#ксЈ‚ІJдe  Ћyэр6ЛщЗ*Gdgыž›ŠџНžбЋr”}M|_Е/ѓј5нйСэъаЯ:П1Ш!ПО іŽhœдr_№ћ@[cmТ5–@ :,IяДёpъ|Zв5ВЃ7aOAXЃa/ў4)CђН“,УвmF wv4Ђ0юЙ/ив™ћzєбaё@ IQШˆЬ*uЦАР=я­fdZŽ!рфXрэ„З)oЕыДˆЖѕЈхЎžФцз"c)ЉFZ0ˆќљ‡>ГИўX?2пИS Ш!зšn,OрAйїFЙї‘ƒнЂ_фšeЃ‡30†ЂхлїєЎм?#Чgн|M@3 š—ћEх‰=lTNЖофј‰Т*o…s*ЩЭЅ:ЯњuX(ЇћѓЌџз=U%#[{‚#~Їиї9R`Qx5„ЯьN§hD:$VНFŒЕlЯ90к,§ГР”‹ЗєIѓEUШВЭmЋ›%aа9~c\яавv;vF'-j#ŠИће™љиŸѕЉэŽ"$Pek?ЖИП€Dˆ“ _ Vъ WщєшбЗ§М К—ѓ Н@ѓ”І•ƒчgїпє–йюД9‰€;(”мЮпaњИЋ2vЄ—‘S'уtrfb|еђЉMё;єшв9C€k‰Нэ<џ’дDC!ћxПТъ#SŽ юєйчBИw:‰ЛMЃ6›oŠГ5iКWљТюwіgЇРЯ$Ša$Hl —›`э6яЙюkБ€Х!rЭЫRыZBBЂ§+PХ@hqЖ,ъ.вЬ4vшХв“/`\9…ШuGЛ<œЁо”a‡ѕFiuњZZэЧDЂНЭMпљџЇјx‚f+*џ\^д"ХЮ<Л€ыОŸлбrWgQ§элCŠ8џ+ .OdЊЎУEд}aEqчM0,Пq‹АсŒh ЙbЗтЊ~†ч›ЌЦ -СTАј‹Ъ ‚OЧј+Q5їM•ŸNzШ-žp0е=MaŸШќ[ъxЁ@нКеьއmщFЧщІЯЏеŒ§q,TжєЎЧ@ЉнЦдˆ˜S\ФЊX%і†ю?e!]y Лѕnа љ…‰Kf]v%тt.c†ЙdЌEѓїЫ†фл:{‰8КŸ&fТ^j=1Їђ‹(—Гjк6dz]‡№dЯ эм“5zpkйsBšfkьѓЛ…ГvфFžZ*нe:]sЋЁчіоž‹=&K?XDv)4˜х6' AжЄ ѕЙˆУ.сШ)%vDOВƒилY{ ‘0 ЯohDЪвYd”ИщЛѓ§аYX.wё шƒOwD:‹ŽЎEВNіŽЛq6ў’^OŸэЌрp˜№ЌЕJЏcЄlПВй јW&з’Дј\ˆ0HGrЧx|їа†5YїЊa}7†a№ † ѓ…PЯтQПMЧCЦ.KНВ0г“э/нн„ˆ$[€ˆІЬ7h"yљZжЪФa~jCžƒъГLEг|+RѕУЮЗћxRыё>уs|(BE|(\7ЛЃSЯRЮъ€ўоqц“~9rЈ…2ќyЋƒя‰І&ŒЕKИ’ ЦY-\СЈќ‹CБCўВ8ЁMяшAqЋЂs”я"fžщэф•ўЭ‰• Ё€эeR„Ъk9щЭsИNТsЇлн::Q†џ0€nћ™GЁЦе…фХ;LЫд˜NюЫє_Л;flПћ№Š5 ЃT•йИ?КmjcЬ‚нcf2‡ )tјљЩн2ё-у4Нh+ŸVИІ1|Bі’1Й„ЙнОIXD…†н…q§K]H Зšјџоˆe5Ћ…п2хEИ8-Їt{еЬHЃ5 ’VХэzгAђkŸх}†РLюІXЇb+|AkњA„Циp„ё’1}(:БЗHG/W‰%šФиT^K”•ЮјђгBA@Zћ­)z Р"?cС3Ta™Ж*ЭzН!С]ъеЦ{iђДЮЇЦоЇFв…Дf ьёРaЏRuофТ…œZ<Ÿе­п_„яіw& wі а3SЉч“ЅJ%ў%Z/6пk>Э‚dDХ7Ќ$›№4Aиvp_AуƒХ†1{Џwbev ЉsA^Чиœ†aggJЅчхƒ^†ГPŸkщq*Ѓ.‰вЛЄ_c‡I~цO/ДWфdožђАЗ|•G#ыГWsДbІ8B‹.ƒ„b" •Ѕуь ѕ,ЦMИ—2ЉТЁ+}_ЧžџekС'љ‰jЛDž^eљ›w§vнЭ\КќУАЛ3эЉ7@-ря`/Ф2\ШLBТ‘P9'GпЋ KIэЛu4€4cшŽdu›ъˆъ!6Чш…ЃUьБvOџ‘mЗУbtЉВп… d‹ї.bкˆXИКrUж™§œЭмk[z‰ZўььfС7ш —Q'A„А:ВУEeYЄЧ}ФФ`6ЯўŸmR4W"кDєZ№SіїРЇ‹mˆŽ|N1tœКРf.p7Њ˜ŒцЏš?M= ьзY Ѓ‘нžчнoх~t_9пН‘Хv~фщЗГЃˆAb аЄKюЁпSђmœ$6`№ЭѓWъЉAЌiкЋ>Р ЧCjїтЎ˜ЖtХˆ4Tk*зPйЦRЈе!QnmkuА(iЅкnЖїыAџDІ1з;]zzWБ}ю969@”(нCKЇ—ЛžUц<А{еИ ёйошјіс‡шjљшx 1ВЫ€Z„учЉ‘… ZщўNбCA0sЎ\7CRћŠѓVІžсўј(dИHŽ˜.uF­зКЬьР XR1@ВхР'гG%-еТШ;зј ”,“˜,њ5ЎКv‹1bдk‹';ў&ЕЌŠснaЩCЌZkXмєђAC4i9„\BTд‹НџйЈ}7фцўЄ’ƒeнOlŠ\a@В|ижЕєT)JyїћрvПlкUе‘Wк)и §ЗV3ћљђЕФXŠqzДO‚"ЫОйDв—Ћ 2сЂ nѕy[@Дљ'>уѓk1rџј„U3"ъЈ* ПЏšьЧvŽО|ш„(ъo$&( —Hи@ЅТюиЙF­ ШЄ=§‰n_ыю‘оT~сЫGiх|",‹В‰ŒŽѕ@%$№с0 ДсЛsŸ‚0ŒP5§яt!$њ;]i…?”eŽG­ДvIs!шЂ˜CoЄoGдЂ˜аЏыeЩб$ШTtFшjІяЪЭ.&~“РDСeЕО)МNзZР|ѓТ` Ё—сЎbЩ"ОŸDv\p/­cLО”шF(uLдЪКˆ‰l@ъ(/‡НUh”:йэ]ВШžqFЂTђМ–œФ—цУmU(ƒЪЈksх4]6Фo~нd—Ќ Œz.є џр˜їёН? ›ЇZИ|’ п|'ВЎ‡•ЭъТ`Ь:xZЕ %W˜C5—ЊхУпюёsБє 7охЧц"Kџ^‘зПkRъkЛшНdВю—НГР+оЂМ:Avдtƒ28*э+ 3Š`тЖ>hWз§lнViЙp7&Yџ^DІx!ЄQњ[ЏЏ]њмo Ђ–B1LpВ’ћCпк"бСO&Мќšэj§,јБ‡ъj@фК‹љo4“0m–"з`=ЇЧKЭdпЖ:‰AQДр_ э•R|˜ЁжK(^ЄгЛ-QЇ s~P„ЮšLъ|Г o+)fq/є.Џšw,i|>)FЬј„šМ'Щџє{‰з(vpw0ёv)7"БХ2ъ—§'ч!Ж‹&'0Ч7ѓD7НyЏTХвˆуЌn•WlZ z’Г˜ТєRє?9J MШо/0rPT2l pœ(ЃыnbLOaљ>р—1Cч ШR‹ЪЄђ Vџе^В–gёРИфп†п‘сzƒМinх8%ЗŸ[­№œѓжtg|C/иА•n ]ƒ>џsкѕ43:qkIлМHЈ ‚Bќт&йuЊ­ЦPz˜’**аЭМWЉKњмpd=)Ђкю%tСˆЋ!щЃ•k™AXy<%’И<щЏЎ…ЎD^]к /шЬf:*'TЌТq Ф2 CьAЈšhPvЄЁкЊчаџ"z›с…UPЎ–/|HА™кoC36ёLOђKЙ—я/ЗEчОN;dтBќХqП? КюNИ Ј ŽхнФюXРpˆ‰)JKЪg•rЉbŽЫkœЄвV%ŒrR:]Ц]|˜ЂЯŠCЯ{yљ}ЅћYцЁНщШ@wXфж˜\1(*п;Œ@GRŒГmAucxt›*х> уrˆUnЕм–?\ˆ3‘„@ѕ.ќAzvкo‹oюuЄ][=л№[тʘ‰Iy—Œw˜ XЕІМ„€?rн *ІеЭуoЕчК9+o†QћюА\Js*KЎШњzЅ—мŽџл`ЕВGFH-KwџР7AЬŒ%W?ъakU…‡ž=9‚ŠЮ5дq„/PЯ_ˆ}ƒƒМЉъ1хх§’ъіUшƒ<ЂЇk 6пЋvї>ѓИ†ўЋ„5&'<ПYЌ68ZFЮыњМ™RЃ‰ Џсэa  ўиsТzЌџваGІцЌœ™j17с€т_g[зЧђ—%‚ђ`КQWY6;чD?gTЪt ЅŸЛVиОЇVepІ–ъУ1Ч!эЧќS,ыjMЛЕЋЃsJ’цДQВЎюp†юw”€kР#хёЛŽiu=_ЋЎwКiFЋЅxаPz&L Ът=њSђA˜x0†F‹oHь‚ыd#ВšЂ­Hk€sЈXПlФЏg&(ЩРЖ@я—ћ;Эd№cфАDj6Xя”+Ю jйПЙа*(š;bД—]Ќ>К“Zƒеaн‹‘*уxлИVБЁ…CТиiнЙъПЌмМ№ №чаИ5cц†‚QљЕ_‰dйQђQ"/?ШУtКр*:V”єН?U ‰љqЗx…jw–Ї‡3&+8ох/ыж>œx8O”tŠдЧЭ•bћ(с aYˆjШr]#pкœ$W2лqуЏPі­џ‚›\НнО/[С–QЪШНrлЌeјУТY/ўvф@>‡23[ё є/]w;K ѕ@/ ‹6~цї№ч0‹„аˆЮзёЅе\иnЃвJ'ЃB…ЂыпЅЉЉнn^ТG.яКIb45ˆkrгhя\:­ЩaЪр锉 ЅNєИѓЛ™~ЗPыьЭї7Рыч‡мдЦEЌhzеtџ„уJzўРЅЭКtђБŸ‚CІѕъьi”‡тш’zџ€fяЋм&XХг–? Эђ‹ †i٘ѕБ  дЦzg…šь—(‰МsЈй "fл—‘/Ю_@2ЧЩюz8 ­™$ЄNUЪoЋЖ‡У0ђушХ$D&|ŽЄЯyŽ‹FХД+ЬЩfTŸ/ХО4#Ушh:х†цбжy fdуŠ4Е%‘Љ‘XeЧ L ЮCє”Л’j˜ЪdрЫЈš>VЋwвZšDТЦ7GЂ)\œKmо›АаQт зк FЏл!‚Їф)!О[ЖKщ–уАyFJЏы47W ОёŽЖ]xі- qС!?jьіwб Ь~<ќ•юM}Д…ŸWЙG“„e[}Œ8ѕdzз@т-†•ФјšiКŒ7! oЩYDа]њџbЫЧ,œџРžЇіu˜ВeФп‘sпЃ)ОЪА2’|ЧlяЖЃ‰ щ8ЈO‚]Т,(0-ZчУЇўgёя ќЬM КZ:GюЕHцPЊ§?+5“љQ‹3ђ„И r `UЯБs.уkˆЩа†иЋЎœИ€1зgэјцльјlhЏsі3““4(Е‚Кчйа|В—fF†d‘Џxe•m ЙЋєlŠ5йЌН”щ§aм€Er1№ёр^’MLОЩUЎ™+Ÿ§ `ЛrИPљЮrЩuћsшшўUОNБуCtEў@‘Ф^=Н#СЅH˜ж`Eе3Ў~ыиЖHpэђѓBМІ“€5.ьх‹Fbž"Ьш€\ЙВц*ЁOј”YlWg22ќіт]Ас=pŒ c‡ŸbлоР–Бs‘єŒЖЈѓxЊFŽЬ0c-џк”хJЅU+ЯдZJЋt‘шімГEЁЎ5Р•КФ%žДє‘%RИоЊЁ‚“`щ‚E›•;+•ьь~MцTvNЁѕJГ- љŽ‘ЦхXvfzГБ@Хїтм€=єmЎњsЫ*О_2_гЩР]Iю$†RЧHжƒўзЫk‚л`H„’)$uЛL ГcГЏ7 ‘Ч2д!žе“`lž#UžѕФр‚nб’џ˜(>ЖЯaе†ўƒЊD‰ эєЊJUФд1aю` }Iъ'ыЇ†Бс­Іƒnš‹x ъHюг BDЙьі 1gЁ9…ZuЁ–маRp „#Фšѕ6б›ќЉжвkч[~ъ#ЈS[NЬмєž’лГЄIьr, —<Ђ0 Њ4У"kbпЃMїЇљё%#зПEjЉэ=…ЦYВЕ ›~‹п1U„ЛКbњz§:ЄёC>ЗS?[‡‹фП<ЃЏ'Ћ5Р’Єг!џнМ€_g-$(vЕ*%šAXfёgQ<л˜ыссЌЬ[о ›' :xсч7•жМAIA§*К7Šœ˜„YlшTЋgџєMю^х‘V3Ѕo\tpБа)vзdАQЮ/o<юFjj}yЌ№ЛЗC=#ЦяКИд5.Яо•H (oИ€PТ32exлЩuў+мeЦ G№6˜­`Ч:Т#оnfыб?f_Й\љЩ\IЂeЏBЮ№ђПаО/ТRЭк4TsMЫ—plи9Н›[Ž\HnЊЩЊjK–Пѕ+b Uа$U(И’‚Ш#Ч{.#ЗsHМWЊіЪџїTЛ-Бf ZХ$uи]6s=­№(эжяђ=_Sƒј[ВГ•VСсэюxTDмZ‹,3w&и{UHЪс‚q9єdч}ЮhшDљ||єп<Фgўqў(Oпёс{?#ои#•штžœ'е%Кя›ˆ0ža|‰}5™ЁГѓœbЋб;Хй†тp–ѕOYљјUhvMшИЛ–‚[оїч§=ˆЕFьшГЉсЎЭ3r‹ с'>С+ 8ўњВЮјBЖ:О{ЦdGaыiЈ|ЩчПieЎѕр§-k3ТUЏBЇпРŽ‘ Lcхзу_б'D­+БUO}xc зТ›:MњQ1_ YЂŽ ЮCˆ‰ужwЯђ[˜y˜‚765и}­0Š. >8<Š#42:Ю5RЊХŒesжhЗgРŽЄлP+Ч…ѓГ„#ЄcHœŒDиAOэzФxЎypЧh*ЁшsŠvдЉВьМNш^%‘†ЧЊсR mЦToA&Oc%o&1ьS.дИфЪ‹ГЈ?ї)Ѕw7С|§юyЅхЗ€xViЙ|SB&ДЄw :ЏE†~[К&MИWъѕR`нxљсšWcОc,pоTХ 2-•Кї™›эš7ЏZQЬѕkіЏ08’ЫхЇnIZоZйХvа‘Ÿ•хс1•шQя‘Њ”>ЏfЁЗЏr7‘јƒбнnцядLъR8!U‚к ктсђћэНS-LЭqя‚Вўл!яоЌWЩ!ДРз‹‚zїЎŒ‹Ё‹џп€МŸbоёічjO˜Wa\ КВЙдЮg`JœС$c˜99Ф @Dќ‹ohЃIІ)7j‘)’јЗщ&“ЖDfј0E ZVwF?Y}Еdдш§†Д\nLnvХпˆІ+IОzю%н‹еœК § д'yIЇќuјбЛG}4Ј–г@м.h7LЙЂd™v§|a.kbFЉЌKЏ ›•Ив? ‹7 h•,џ .§^"rРГ3tъtbю.ъŸз єпЪƒ?ЉNА1љkH‘ZCbЙ!@b2НUдŠѓ ђ}eШшU ГEц-TSnац>яIUу№ Д{вUѕГfsЎэHУD€ >фV\d*xЗ)Ÿ­|Тѓˆc †11€BЬЪ†н˜ѓ%a`4у.р%П†ђнШ<ЁžЛЄљѓoЛ УИpдŸЋТЗ?О Ф:‚8РE?†љ.w%TitџбBAškcњШвфдЭ/d'‰x‡р6DКX*иjЉяѕљ)У8эОўѕўЊŸ9;ћv™V ~:ёv[Ѕ`LES’ХХ>•aШlщЂЦЎяЗ‚ёЏхDхœšW;<џ€ЈPю§­йЅYf6bqЉ kXСŽс–co‹?Š+ƒЮњКhœXjЫ2~јЛУœ”жц]žЇKxГ^х­7DzЯН<ђwbˆ˜Ћ ‹гз ђЄшŠ?№сUОFЊ§ъRс šЖŠЋј`кOАЅх(ЧО0XўBчОЏwpbяbЫВs>Ь­С,~ Їњ˜ДдЏ~а‘fЇЌmІm^nЇђGsŠJІ›Дm”c8Ф>дСъљFdo eТIЧЯЮЧ3(Ъа6шЏУЭЭ‚“tS"ГиГlћњRМ#с{ЃUvЎ„[ЛhоViS&ъAwXOЏєяGœfq^vG“4€ўо'&)ЕTг•TdZ§<‘9Ppи›&—[ЉёЙђžF’о-WСQ„ls‚ŒОЕџ-~uИЧЅКA‰бЋжŸ23dpoгŒГхu.b’ЬЮlэЈD~іOО6вC’єƒPНЅ——=A­’ЃЪŒ$5Ё Ю9”ЌKІ Oі$@K0іМ-z‘§ф•.>_\ ŒЕЫЬаДDЄ‰s•ИW.шењЖdњђмЗ1qšEsЬЙЙЗЁ лЇ"Мkдх€вжRF ‹бtŒˆОЭr“„АЊ2жыЕo‘§mс Б•К•™М&xLбŒ‡Н(LжЬuЧBcЎ€ъ™сЦbяРxЈ<‹чРз˜GьЧž›e2љšЕы"—ыSud––мИ­€ }Œ^МWbќS8hГMY>жftЄкР7PU1цХ|"] ЙBpГєкфЈЧ&zRPМ[8”eyї…FогIZ­kЋ^BПыtвЗ]И.Пм?Хфn‹епРWо№Ÿaюпй–~bЇ_и[Al$’" 0нп;[wЈfFнцK‡~;›eХм{К:JNИћЮТњј}/ˆFBЕ‰ЦD{KuдјЭHˆ2КХK&ЎкЁ&Z­Щіћ#˜—t Q-м‰џ§ вHjЦsЈ ‡%ˆО@!rќЇКгйє{ьeм|gvTЌщ“5эс’ ‰ЖпЏœ’ЖП‡(#ѕѓмтf\&JрЊіСі(›ЈSЬОT+зЅД9Ј+ЧўЯ,њoъƒ№˜aPобхeѕЅwћf3nfI„ЉsЅан.кvz]А[EJьСQsObfP<У– ЏІсз Fтd,њ0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 680 0 obj 17450 endobj 681 0 obj 2167 endobj 682 0 obj 14751 endobj 683 0 obj 532 endobj 684 0 obj /PNDTQD+CMR12 endobj 685 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 684 0 R /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [ -34 -251 988 750 ] /Flags 4 /CharSet (/Gamma/Delta/Sigma/Phi/ff/fi/fl/ffi/macron/exclam/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/bracketleft/bracketright/circumflex/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 679 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 686 0 R /BaseFont 692 0 R /FontDescriptor 693 0 R >> endobj 686 0 obj [ 613 800 750 677 650 727 700 750 700 750 700 600 550 575 863 875 300 325 500 500 500 500 500 815 450 525 700 700 500 863 963 750 250 300 500 800 755 800 750 300 400 400 500 750 300 350 300 500 500 500 500 500 500 500 500 500 500 500 300 300 300 750 500 500 750 727 688 700 738 663 638 757 727 377 513 752 613 877 727 750 663 750 713 550 700 727 727 977 727 727 600 300 500 300 500 300 300 500 450 450 500 450 300 450 500 300 300 450 250 800 550 500 500 450 413 400 325 525 450 650 450 475 400 500 1000 500 500 500 ] endobj 687 0 obj << /Length 688 0 R /Length1 689 0 R /Length2 690 0 R /Length3 691 0 R >> stream %!PS-AdobeFont-1.1: CMTI12 1.0 %%CreationDate: 1991 Aug 18 21:06:53 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMTI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def end readonly def /FontName /XRAAXO+CMTI12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 18 /grave put dup 39 /quoteright put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 65 /A put dup 67 /C put dup 71 /G put dup 74 /J put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def /FontBBox{-36 -251 1103 750}readonly def /UniqueID 5000829 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ)s™Ї„ЬО…Д™;.ыо;дrЗЯTeђ…jiЋ–эK­/df5рЖA|Ч{S/…иЧ )ЁšSяcы\^ШŸЦТm‰чйфpЗ+як#ѕпvОЏLщ17ЂэŠЉзж§ѓ~kЭрй ˜d#х– ]ŸЛL•eVшпЫњьGoЃoйЅШ\šѕўйТнвkм ™9‹ŸMжЈ№[GЏ•я(ЉХaлм˜Ф|ѕRPѓлхПВш>fЗљ}н|рюЗZxН’'П5+jлŠХz3ўдяp…БтЙ3о`/їgьеtJу8Џ) &їгhЌo%ЬИ‚л{sCVa’Нh~I"Y‚‚0'гЖg; ЗЇц€І‚Й€#гœЎЅеИg ІlŠ лШ;–ЈO6ЌjyЗgНЬр H@nЮ… l‰Вўм2qТŽwо—Me]ѕџ}Aэўq}’Šˆ_oІЯфвР€Ž“yр–эбЃКg€+JIua; 5mЫКдкГХžpЄpXѕ!cбsфбј|:Jч#Ђ<§y†ќOН9“Gщѕ”cTри`ќDjџ Dѕк'Ьw|–­Гˆбш5нЫс#ћQvyЙЗюZ=нЭ9$ЏXЮ"ъUЗєp1Œo'y‹@їсн1YО™ѓ:онSŠŠ>]хŠіŠTs*цŸ?~XиH VHЫш Т‡­Т9E №;Л—л‰?jK†&г\цЗ…$Ышx! у/‚_lPЎ‹KуЊ1ƒКMgމlЧцЩа"oУ‹œЎ 9б‘Iй‡—›–ЈnЖšXЋBf9)/ѕћя№ЯехŠп8Y•јNw‡wbИ@t’ЏЄЅ:0JаьРћЩHЕГžƒжњЭЎ#СKœW мˆOKqrDфнреg’xšЧЗsПђПдТ@ЪiE@ЛGŒ{’1а/й нЖ‹5ЊzУЏІф]lйъ<-!эг3™к™яЬ’ћJs^ p %rЯУ]Атт~рСзf ъeИL aЪЈkЎойG­CИsюБr2н'Ћ:Ts&Р“ŸyB›К† Еsц Тэ#ЦCWОY2@[у'чl˜*З…І~ЌqПСмtW>фpЃpХi `^T­‚pVJЈ^Ъ&ј4f <•Ћ.7XіpўЖOщњ<Щ3ГЗЁ6№ƒцЁиy^ъќ№§В<щ|ƒŒМ2ц‚§дПƒ+_X™1WnьYџDClрvmщИHk~щщ—m`yЂ?Ј[іП№ввD[AЊœЌ^ŽЪ•л Q_Ящ в­YNнЯЦ’‹}GGщh™{ЪБЛЧк([сП%QўƒЈгŸ ИP HєbбPeЩ7ЈЉ‘]Е #ф€L:нвI0‡ПжRЎРиЗ— wІЕ5H.щK•ЂБfЄ$фНIШ0Мџo&‹ЬЁ>E[ИюЋ§2Dm‡jбМ“R&о˜ЛnсЪє$ЂŒE’gXhя'‘vњњd“• ”S9„"}йќB‚e‰“YOp@ФdH`{K†рƒVŠœCIeŠ7 ",к;ќЛі‚шЗ@šAє^+Ѕz\`ЦЧеЮ9LА&Fƒ˜K({aLЪW#д5‹а 8дж/ХыДЉ‘ПY˜`є™›“|V%ћ Žщ_ќn.т§гFЇ Ыs;љ_P.XР`О&$ЁрeL4HhОz jž[Сц\UЫ/€цA ZХКУk]žцM^Ф6—њ2Ј.`Ау~Ше№h ьЪж†N€фЉѕQъ<МLшЏХЉдеžїТЮ< ZШф-;gц+§jJKюІjЬ($Одъ—”0ƒ8шЅёѓ"LИИІL[з\IрЛЊƒЎ+у!ѓ[Х’Ыr„›ьЭ› œўˆ™Ј…3JуГЙЪ]­…Iѓ„|УЪ)?kяЛJЫR6aрлу™ЧЦѕл УдІЯц6KЩькњHyЬ$\цeО‘њhњтrfNІ,‰QxѕИыЃBЙЎ1<њ˜хE&їAр Jw€}ХušРїЫЮГ€n-Ѕ1•x y}§ЇЕЌЇЅљTЃB4Л?нт‡Nƒуg /~“БЌ?ллыsйз_ŽoЩ\ќјОєUIfќLrTРХпbгA„/шfэƘ‰‹Ќ,BЎиКџQF!Е9jйŽl…!‚>Ъ|›]lMшgћѓ}85v#šА)3>бтY,.Э~BjиAt(ЈьІъlAИb€`а№Хš€љѕг|ЧЇ_/о8—кo[ПЬFWЙžыЯЩЗІKRЅ 0М$у:?eјМ†S›;>MЅdП)SвŽќ`gKѓћR&3ХрhN zЛк•S'Fš[ў/ьШfрFЮDрЁ€Мы”У–јЁ”фC№{1тdZ>Жˆv_=#BшЦ“оv\oТkљˆ‚мъ7.Чiю•имг:œk›яqrXѓМь]GвsаC…?УњVеb…GиВhалуFѕ‰шСYдt2 Щэ;ЃЦњkЋCGšХˆ‘вAdў+дП>Dp˜еW;р•7(УŸ. *‰шƒ А:Gџ€вВѕЊ7sxХ Ъ„Оьeю!т-nƒ˜)gЏa4q‹ѕ\Лб2Ю ЏNcBUkРПіKБ†œxЌђчWОЫ`вЬЁ\MD*zм-9œђ&і\З“–yнL ˜ŸЅВ‹РЬX"ЅLržгJ$џИе@ИУ(RЙ_dnЇРМF S*`БU1'К ›Ћ—ЁВрž?A p3жЇыПкЭžв7B‘˜п…a•ЫE Т1}E ˜ю)pрQ‘U˜ЈФf`Ў†ћаŠЕ>ќЂЏђхYy˜(Ѓ{ПefFаRHs§хџьŠCрšюjсїhіT–ЌУвf­ŸЉ`{мЩкˆЫх\0nкPхіЮ€Œo цi.™рѓќьmПЧїˆъiгяхш8^БЎMЕ\ ­еLbz=aмV“эъAT MHБw­ќqџ ыъ‡ЕcžЊ:lЇц†jœ rH0ж‘ўt2y%А>~‡Ј#Б‹]{Ц$–,•бєў,„ iв‰&‡Wўѓ=УЦeМЪšсM­bЎdZ!bНђšiZзЗ~Йq;‰!№xiK йП-э'Š—kfžњU0aШКэ6aЋМю‚Ю№}‡aŒ№бѓ&№O‚Д<i‰о№h|№Q‹‹дКЌШє+š?Й ъ@‡”1/{™€\ЇgЩ;Gё№‘0пh•хД„0 Ъ?НЂн%ц{r#4ЅЊќЎЭ›} GuщО€ыўiAЦчУuы }‘tа„ќЃгDэKбj‹Ч†­…ж5†o~ЖјГїЊЏЦƒїЉда.’њ1'‚ь„Зm;v‰RF!в†˜Щ›З_l"јТДШ6]?ЦƒМЃЁ#кЗЎрcЇDЄ%еЊ$XˆЃEћoЪфѓеЫp„Ь‚И{™БЛ\nmх&Фrn‚[<ŒŸkW $?ЎіЎЫ(’…r–GvШВВЬ(ѕИ“Ѓ#3€Ќgп^+q”ў0uТ‰=TDS№ѕЫeВ+-)Ќ™œ \Ђžь)06КЅ!чЇПХ!ЫBђHње83щ\’OЌEўЦŽžOuєVЦyпQЩ—LUхbp'bБМ ћYc+Ъžрuz€rcbг:ФХы’тБч7:К;ЇИVыиy>”aOьЂе4XqПўЯrkІ!w^ОT_"#ђCю8џќЬ|ПBw’н OхАnoЇOОNйBцт'зЂ”™bbР~0ЂЪC–Дч‚т$w>ргїFIMђyр…КTь“з‚ЇŸzšыЇG RР"жЉэnЌu,еы"ўїm†4uЎnЖЭYдii›ŽѓХvdXE~ˆy4n8/q?Dя$ТP%!с›*ЃMЯUљ€EўЧЎ–Ђф ъ“aЉ[э€`ЭжХdlŽq\кЅ-z<лК“}Ђк)JФІxћjY)ZЌ&-2‡&mŽЙzкКfА[Ѕv•ёg% оHMy0д`,ўrрœiКOёqFKƒe1*€–љb дфЉЁЮ [dюіvSЕuр@zБЃ…!ђЈГд8ФvфвB2ЌЭГwкџŒ)рOCJЅЇ Щ.ў‡s4ЊИZи7ЏE IЗŒ> †!rCQД”ЎаG‰\З@pшФР‘—ь< еЁЎГ<йH'й˜ЯЃэЋ–ёЙqЛuіъЬHи?Oщ:ж™юЩq{‰сgШ'BŠ№<бБ{2*3 z`^ѓ|ъfцЋшљ“Dvuшбšјƒ+/єkиj”Q љmіŒы/їћаl_ЌCю№\џјV#"н#L‚сЕxIL8гF–О”њжС>цi ŠЎйBy$КGu’D@oй‘ ѕјMЛUЩнwNЭ@Я”,Ь_І[Щдm‘RдNхЇЇQjЗTё МИŽxhiж†ШЬЏ2Ъы mь- уВТ!‹lŒ€qѕ§Ё&Й\~p7вй>@к5&RrƒP’†R= Д'ƒvЛ‰k“С+š 0Лжjъ–ђcѕђтpД‡Вƒo"џMЩQEЃiU7+4ШЫдЊГ>ЬŠSУЄшšЈЬтЛƒc}[?˜wg нgг™N§oњ:.[ьЭ адЊсnшдљeѕЌ‚Oэ‡‹ѕXt8ЃFj2ta–жPE ЄИнg1aЏд+6ц„.жRУž“\˜CОЧжЦnДэƒђ zVKюPыћИ1m”X>~“ВсФро5owsqпЕЫŸ:c™6J6)$->Г(Qю‰ђ7‚hьВ‹dиV"фЭb Ш№{Lююmд%(N-4"ВяyЉф=4Ђ™эgЛGщœ_lˆЯљmD6ЖщЇS•›žБ3ѕbp8Oo‘S2яџp`œ йЇrMЁм'Зц~сu‡sВ„№dAа§fк‡#-ЏЫmpЬОВш}wІ1,Њ1дEТМRд$@"ђ {н§:Мъa[ГюШd^!sЈ‚ќ)6mЏŸй7k аXбыт/чХўЗIД JwO66УЗчД|.yеѕ7Ч(нЭи|нmNѕт{Р"VюAќрЩд‡Sћ2‚к[a-?mб4е-bжVЅЋшx%иw hдf—0  R›?˜Ч sЭcЫ–gњ0wэ)NиDќ ЩЩЊыиєzN‹U+тb‹uK29Fйoь]‚МвSZжŸ_w%ђiжRY‘е ˜вTБ˜ЇћЅr˜Ng):ТЋLћeбV5<щЙш.&цd/еЯЧѕВNf _о.Ы? > Б[РЂЪ†Вх№”­XЊ$љQ4\IЗ№­гŸ€Ай­‹ŒнУ.ђBЫ )й­К:ЏzЬаётWh–“јS#*HнЕ:•‰ђ]-Т†Р6$*>7Е2йDH+œŸ˜#ш“™ С№џСє4ѓоMХŽЅв^KЇ_Х`Š’:pzЗдф.€5л+Ж”юРk|їЛ+/Я‹wˆLoб'y.Їэ ыЈЇу‡H.:ўU7ЪbЮf•+$‚.Žя%Kх>ж)y`AЯŠQw_џЌlЦМMМ󉧊љkaŸzfnѕ9ЙaшHўl^3’7V6И‹x/Q!ЏŸЙРiанyГx7ЇєŠ ьa/s] с‹—ьoUƒџQ7HCгРт’Х;њюgыПэбт[kыцi§чќ"0eѓ•їœ— Зwš69bIьx7БКФВЮТџЪg8яf*{ђгя3Е цMmЙ“Х@ЯPщ‰ЄфžЮƒјя‚Kїc–ФїЇ%Ой>ЧAїNrc№SnмЎЗЋЬ~я“HЂыВO@™nP[PИ J{mньВ]g† і–tпІщдb Єа}0WR^Я~*ЬЬ к˜~<аѕміhІ, œШв›^і’`ыX}Љ6зFјсф,ЧтФЃJ.Дг3<ЙГХ;“яЛДПЭДО•Šк•вНн‰НjЩій7--эQЏ˜фЫа‚ъ*!…ІдУЛГ•ПLEщжcvYЭWБPЫЅЌіПк^˜БŸИеqшgЮ&bџї”пЙDЉhКв(Гшa†\P$|ТE'ЕYГ=‘;вŠt40/ Yт<@гœrэљv sAПІ_Ѕ…”к>ŸuRЇ‡HЌ6ŒЗЦЮ՘Оt—УŽX(p‚O№Ф6Kк [YmHŒІ(\$ћаcњxg+џГПъ”A\`ўчсЃ?u4I.cГбžгѓшб8Ў BПŽа$*Х‹4Т”›јњЧшCВmЬp/ѓgTЬ—yWБхЖ.–-‹(ЮptМъDЯялѕН—љУЧ9+г"з<ЌПrЏќF]Ч,ьзнЂдD/ЁЦWГ6Х‚XэH_dЭ,[mKЅb8zТы’фЇXЃЋќgцzїeУљ{Е“ЫЩeЃ|гцJў˜ыhxб]РtЖЦ“+і RџЛsт+Х†/U ѕі№ џ…ёt{3ЫтbгЙјWХ‘яБpЄBdч‰№lіp›‡LКt;В”kf/‹Ћ\їO}я#ШpnшmKš^SВ†яTtЉЭ{1эЊ1nЭ0ЖCЖ8Ќ[‰‹MXљяєГеЎЬqhѓ7tN$ЉЈ оІРuј%ѓjˆќMUlдў ЩŠYуїЕ;џ?`к™Gg•nё‹hTЕpBнn^’ъ см ЗЩЫ“ }TеЩtРІTйЯ3БЪЉюТќХОV冄ђ |32ш§]єЈ…м0‡Б яVQв ЕIмДРНВ]›"7mНTі–gЁ@‡§ьЗнЄbnXћўWf6‡. t—6ŒYžїЦЈ QЇ‚ŒГКzWŸЪ'“}gД#имПэЃwјУЊх‚I[bЭьh§‘ЅПer ЄљС!Є—ч` ˜aљb-ŠXшŽЗ?ЭТ0ЌtyР7VѓсJЗў„0Йл@iЏРьл:љЯБ›ŒЏВХАй <ЩЋ3–c(ќЋ^ј) xд [Š(ЇšМSyb@xТ—tВЈЇчœ-ЩzGмБ“0У’ћ…ЫBMОРЦL)$I4u €Q\’у7› kзфb.б_qІlЌV O2Мy:UpФЙЌxxэ(!\]mдТ—zFNZГiъњ—хšgэDAѓsщЙ+ШЭСм0RхЈ]ЖљЬп­=JГ[­d7d?БІяцŒхГ0ZngЖ‰ЦІўЯŽ3Žпп жžСuШ№DџА–RDПЏe†чi Е~ДаˆЁШз6?*–'ёЪ˜рь˜<ѓDЗƒљpвЌљv!зл’іѕcў0xоvJ­ё‰0џ­œсЌ<™ƒЅмšXє Уэо/эЋтЅэšЫїVѓ›,:gZb’Ч’YЙЅ„ЈŽ‘ъŽЉ“ђЎЕЌ"ЧўHс.ЩnjМ‹ќц ў–/"Вx:žІ–щmгaZ{*8М ZгS”–mбH-‹ЈМ ёЂтЁВЩ.j˜ƒšЎNнoirМђЦршJ2зДћSˆpPkсщиАNўўA Хяˆ№BXD90(ЃŽ-{ЙC*sкЈѕЬ<*о‚ч‡…+”u'kH"1xЅ›м_АUЃc.О ?Д'S™y!ЙyBЉрˆЕ 'XŠЬ(ч {‘Ё Z~юНfNcAэ|(4b‡'‡RЏVьшQ]ЎЉuПчу=dрl:JKv№7œЋ0МИ ŒюSќKšKРћЫ]6ˆMuЉMЏхѕПAёdт{•xёQaщ„FX%i;ˆ3=Аz‹ xЖtзмJ˜1Є=,№,cm6љ%LpзzЌJ`pњЁ\јѕZUо~_e~B'аљKZ‰Ыф “јyЁPО:иРAfmэ 6=”nZИLо3v’kŠ' šџСcФ@Нцял’лИ@nйhЋg?fЯ$&ŽЂхrїО]Ц"5УGуР_ўxSb&'t“@ћoN ­В9h}Јa­%лX‹E\Њ DќІ=œV- дж=ˆЌb(ЪЅ|RџžTД‡ѓО§zА‚€0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark endstream endobj 688 0 obj 9851 endobj 689 0 obj 1347 endobj 690 0 obj 7972 endobj 691 0 obj 532 endobj 692 0 obj /XRAAXO+CMTI12 endobj 693 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName 692 0 R /ItalicAngle -14 /StemV 63 /XHeight 431 /FontBBox [ -36 -251 1103 750 ] /Flags 4 /CharSet (/grave/quoteright/hyphen/period/slash/A/C/G/J/M/N/O/P/R/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 687 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /FirstChar 0 /LastChar 127 /Widths 694 0 R /BaseFont 700 0 R /FontDescriptor 701 0 R >> endobj 694 0 obj [ 676 938 875 787 750 880 813 875 813 875 813 656 625 625 938 938 313 344 563 563 563 563 563 850 500 574 813 875 563 1019 1144 875 313 343 581 938 563 938 875 313 438 438 563 875 313 375 313 563 563 563 563 563 563 563 563 563 563 563 313 313 343 875 531 531 875 850 800 813 862 738 707 884 880 419 581 881 676 1067 880 845 769 845 839 625 782 865 850 1162 850 850 688 313 581 313 563 313 313 547 625 500 625 513 344 563 625 313 344 594 313 938 625 563 625 594 460 444 438 625 594 813 594 594 500 563 1125 563 563 563 ] endobj 695 0 obj << /Length 696 0 R /Length1 697 0 R /Length2 698 0 R /Length3 699 0 R >> stream %!PS-AdobeFont-1.1: CMBX12 1.0 %%CreationDate: 1991 Aug 20 16:34:54 % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. 11 dict begin /FontInfo 7 dict dup begin /version (1.0) readonly def /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def /FullName (CMBX12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def end readonly def /FontName /YRLTXJ+CMBX12 def /PaintType 0 def /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 14 /ffi put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 61 /equal put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 94 /circumflex put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /endash put readonly def /FontBBox{-53 -251 1139 750}readonly def /UniqueID 5000769 def currentdict end currentfile eexec йжoc;„j—Ж†Љ~EЃаЊ*BgЗNГРгН ƒи‘lІЪKq*оВXњЋšццwќsŠМ|QЭFяq˜еўцv`цšzЙXђšMyхp"їƒыЛЖдєь5OвоЫЉ”YЄХ№ЦыЁP(DTчм!С[vДС›„67XFšlU‡…В&3!R˜qЉˆ4‡нw”’нЯƒ~j‡И+лёoМuњЃ “ў_dЭV`їKю–y уZњЬїБ€]ЈŠуu M™YŽ­ќb[мœ1[lђŒ›д'ѓ,t\™ЎОpкЎдžЄZљO4ЊG‰J7 iŠКНЄ!UБЏ&ЯЗнЂМh`ZNіЬЃжhKGџЕˆz;эрДгŽКП ˜ #1&ыЏ(›)$џJ3K…йж…E§­Д™sБшjFЅЏˆfР"P$ех†-IоЕиьЫ•йBƒХ 6=hЄqDV№<у` EŠkРГЊE“NrraЦŒJGј з~Lђ{6іЖѓЌIŽE6љрЏU'ѕуЬy 0„gK>&)o>2\U]$XWЉч-1fЃХз@ГЋБ'ЯB 1mљW‡= L№л%Ї5tЄо.O-]NŽ CTЯ4л>&wС”vN­XХ…єžёCўŸпйf х ›зЂЈr™М1žfзЙVуCЁ›“Ш–~фqŸ0 ўXf№жк^Х^$гЗяЃ%дG7dщ›ШБ\ђЌ­њlFcш0…]g<щŠЗ_‚ŸЂ&ЋW№{>}N|угЗы 05ХЈйњ4H4§ЈумžlGž>юš TЩ_Єcбœщ6рYŽ1— ЇЛnUЯеяrЎС-š–u$yЃfГЭвOЯƒЙЛ4nŽAy’иКINz+:гЮƒЋЕЮƒаўъ}=Ь|z`Чvй+™D{.є;FW‘LEc6ЮХхoш,Я§ e&иіŽлКHър–аэЮзЊЅО%&e‡Е+к o=—чЭК'Јaч9АмЎ;-Яsg}Жl3ДK?ЫS€ŽEhAr;ВћЁ}5й Миѕы•ЗŽ7_Kп”ZДС‰n+€НЕŸч KЮwЉ$ZˆdыђvдЌ|ЭdЩ-Њ‡МŸI&JaГ OpksYЕlyњSˆў0сjŠДœХЎЄЭ‚№ШЁЪ=CЁчПўМ Ю2V‡Ь_ЌюŠ”Ы]a2ќhŽNhІ!5;*…~ЦŸЦJY<г>ЪEЯ&№@­7‡’ИЄdspfКНlmЙJ‹ф ыК"љ=тъѓУ){дžЋђ§m№ьœR^№ђЁЫ$KНћЛіћ]=I{‹FЧˆЉ'^у=ƒпЩ=цcчмєa1эh m"tЋQ+ycюѓЇ№ѓроџ—п+#”чљуј-%–Ы=ЖљgKшJ|ˆ:ЦЎЯ\ ŠП›Ѓ№ЇЉ§љЌ^№_9žЩrеЙ‚Ћ.В5Ч“G"МѓјЮШŸн№‘х~љ~!ЎїM—ю д^wŒЈБŸљыwЮ—ўОд}-.8ї…?­ŠЃCdВ™„:cєЈ!ЪЛѕ t>Дяfѕy&|eед8ќs3Ѕ”"ыкCлrhC/`л&ŸтU†Ђx†М№<зxьŽf:ЈRЭ<Ў-Ї7­}шЄљ9%š‘Z„хiт}iчіБ:Щ ъ  КWš\‚L\02Y(ЕК:^v–­ЅчžчЮЃЪAЅ6РџєЇ^š&™o"вяњcsцЭа€уЦј˜БеэSSуQЊˆQzwUЂ+eЃЬпч%0сЭ™‹сGxфщІT›К,иŽ$ 1Tгk:+^˜њzзgЋ–б”/ж ч){6@ЉЏ)”zЋј:§EЅ b6сšЬЯ"фb‚§o4ŒСt€B.а.UНШщІІ†ovl‘.ќ‘mн™vЄ* АИІШ•Оо/‚–КкNЎц$r!5ЋŠЇXЙP„P˜^”Yžжlƒћю‡_0Š].ЋЗJйДу!у†Q­|ƒџOщfZѓEцІ яK”ЉЖє•AšPHYУs€-BиЎЧКцоSA,n|`рVжЛРj#цb!‚ё %ЎбЌ—DžЫмщѕ‚Зs‘ZOуC§Њ!‡›_˜5œРGЊ6ЁцBXцЩ]зxh№“fЋ%№оѓЎйRд3EФ7ˆ вЛіяgЇŠТЫmpHэТcbэСй!4GI;NjцYьIЋ§p§DЙЋ(нУ›єƒц0JQNƒДXъффс7ќ <RVР&љЪ]!LяoJ_ˆіmˆЊЁoпСxГ|ŠлЭ$OgpЗшфй"Ж=ЌŠxшУ ‘rьПZѕgOџнŽj МAХ ЯкcА”NQnБсЙB90kpruмњЦЈЧЕ1‹Эrѓ^џksїЩ8qхЊ„03нщjјаu~ѓмtПgБ|wYЕш Ъ%^s“ˆ=ZкnУо”сSŸc~]tОЦa›~X\№(Qwjq8Ъ R)\~њќ—cЏ0A$KŸ><zѓ4q$Ук‡eкЪQ?‘<ПHєяc”_ЮЕ—TЙbAMљГѕ;&њ‹ˆPоЁVијК;Ћ‹?ѓ<ў™Ч(Ћ!CУ…s4†vЏ[%z’кЬљьЫ1Š—е ?кfл1ѕ8G2vš-„ЅcЖšЌ$#јjњƒ>­mЌ†…>гAHИgлг­Х“ьшу pЙ€Р*О_3€ЁЈTЄеЩx>АДhуїГB§uмЇџOХљ…‡ШF“<ЫVџЂЌЇ§S%=ЏЉ€™ЬfjаVJ`пЅf—нl„К„фьіЁдС_Q­р_nTЪЯшpm?яiїeтє_Ÿщ0лLМѓўЯЊХЈQšњaU™–+в„LVЈЙvQ "О+L/ЯђЌW(ЗлUm0ЋIХœчЃuЉŒcЯи3Дt…§Œь?JЦюk‰їZ3Ю14ЋьlьvЕx)ьКХЮ&џЃ<|аЫУЙЦЧ>ъНuk>ЎеcЛ№ЊІmDEТчœЮБHfзbџБIxО&ѓ—ѓ|“д!.Ѕ˜NЋФвL„КyC=}Д”…3люœЌЮkиOБ­D…a{ођП—м†a;ƒтлŸYЦŠFлѕцюД5†1sњЬ§ŒAA змЋхЁ 8ЪзŠИsTё•Pˆˆ‰)йq0•ЌŠkn8#=LDотѕ[ qпwšд‰ЋІm|™uŽ,)ъFз~iф{Д^BЖ`ЕїvEЪм#{UЯ‡`ЦтˆЂћЌx0>Ф ІŸfт@›щYђўvQћьКГrJBWНЋІh–cГ<sBdWeНWн?юPF(Јь‹аБрnIЏз " _Ž!ЁЦmбmоћЌ{ЮЎ‚іћп)ѓ@=ыЋžу/ЮшcћйQў-}HjдŒ‚qчНŒkѕЊў–}‡ИE‰dжУ)3Њћ(=й'юъп ош.(aM т?Ъ[Ї=рЛЏЌщуьjБIvC†ЅE]’=2;Сў*ЉЕ5БbЖJЎЁcв_'дМЗв3№/bЈHJx(6uZ)HŒСWˆѕYэЃГF)xйIŠ’;­А?“їНЪI ВŽ|шф*чфЛѓ1Оц‰’””yYЋлу аЌ<ЮЦП;…ў OZа‰рgУ„ЈГЈмП‹DQыі;Вю$I>—ЯЙsёџЅ\ŠŸщіљ11*^ЙB„Ty -щ;КЯN–џ&Д"œ‘&gНПD5ЄюFт…Ф|CpМ$žЎ-kZРЏмхџ˜Ь‡уТђ…ЧШ‰ЎјБ‘yA‡iv?ьќQžxѕоtX‘6ЕƒП›Z]а~ЕЋЙЪе1ђш-Lр[йc˜%Аa{"ЏFѓ"8­P:љ\xп–}Еr„K‚s Нvвqš3?СеeчJЌЈоРы~PŠКMйV;/М(Л5šЋŸњTwp€iдЕу‹*fтmž…ћљbГО[o”иžйеѕзЦ†ZТО9џH—,}ЌЉАкaЪХНJљ`NЅ†l.Ю`КЇЕnЕY_C…)п™йЃj-@ Б?їшEД”žXyЇЋЮa9tђе8‹пХйœXїm 1™uўжЩKS!к#­r9в?f бўTёАc>UхЋeWXИ№ ХC,Їq‡aІWСЃŠ~w‰‰Ѕ'žhА &м‹SЧš˜"/ьт~ќмщЏїёщ•1‘”WПВ/`t<фЮA–їВСќљ?a^ВЋ†r б^iiєYц—Щ Ј=ž–šOњпчY6™ЋБvлH:юk‡:§3ц2шЅ1SсM0ЁEђќK<A4iV ƒючBмI›Бqрм azооЛ[Q–?›0…\ƒшqэi†šчŸ#Х S0г€YЉ:bXjљ DCИ&•лДЮЌЕ’Цa ћP@$ЫџкС №=Э|m3У]ЌE3ш­гћ`”jЕѓ% Џl<ЪUyЎг2\фЖœД/˜єШШ 3/ЃMX:WЌіЖ9MСЏlЊш!|ыfO V1П~ѕ^=ХФXы‰Л!H%ИGД“^имOoYƒˆќЛЛсіЈWцŠ}ŒПЂЯŒTњ X(kљ)љїж†Е@FgиРQœЅX ЫJгp0:šLДйŽvd|=ўОеЕ/Ќy]LKGІ šTхt…yhƒЬpšШ&њЙ ЬdЅt*вэЗeuFэ™ўЛццЇr~”‡’ЅЄj=i’Яд’Ÿ•gЦEкo|švДUe‘s’•*јљ` ?T’BОCћђнњж5г0оот=ЏKP€сгFR0Ш;GŠВО}M*Lt  œ„B­ŠЦЩ"ЬЅ˜+ё‚lКт}Ў1Ц…Ji&dCыAоV/Мѓљo0зЖаљ›§:ѓЊД^кvмoуQЇѓ ЙŽ:vuq—чВ‹їотпPƒ L#›b6‡.џђt;Ÿ=E -$vТu‚Ѕ_MMЬRB)Иgь~LуЛоZпх]ЁкёCРIч,dИ2Sљ~ЪЧУ§-нжp#>œ ЧsˆК$Ж—юе,фZnq{4VЃ(доЃЄ3ћ№пЧЂrѕћЋЪS/[Ъ#3N`Е–НkУxxвщЈђsБt#&Фб’UГЌ—"%q#›voа' IVеVкЅЩЖбцНт_ˆЕыCхtЯ№| LМ+ЅhPпoХCŒƒХ:BxlФRэ‹`Œ)1tчъ/›§СНчЃи*е|†-‡ƒ+d{(ЊcгЖчб^ ЪёпFьГCУДШ™XфУs•wЏfВђ…f Ы1­МQіУ>$tЉЁpiяu Э\IЯўЖPЅ}ЋУ”N*JG4\Й?э*џъ*Жћi<@Q@‡lu'ћ’і–МњG?' \фБЋ иrfі0ъЂСЫЫ:Ј0R 7iБˆг˜žИ.Лыу"ФЌ81ђЎoЩч@Ј<Нб ˆMŸжЧ(—‡#4 Д8ѓABs .t ˆ@хqцŸzZњп /ю’BВnв(ЬЂ”Й˜x‡хeЇС›–_Ъˆ’Ї(’0^HЕoа>Л\ЙJx3Эx ]б–@'"|†X†-ъЭєJц%x+CœGЉЛыЯіВЉ ѕx‰ ШXлNњЬX*йСjџ~ЉnEС­х§ъ"œЖф‹ЩќqМm#VЦќ3П+Хbk3!z\тQŒП(Ўі/ ‡н!„Cu1pqШјHуЎ™‹AЖЕIДб ‚­ПЕЮgГйЛцЕЧ,BхКœ!дїžЛŽQЩ”FQЦ‡НџЌZc`ЩиuЎ~у „ZџoyГ?*хyШхm0ёwьбЌPz@Z ^!вЕЇзФ\НUtJgџбюфПsОŽЋ†€hTNКг­)tЭЈШ™ЂT”›ШяŠОC@НЙЋGa7(uЭЎФ?z€ЊьOО;OœzHƒ!+~ДŠKGQZ4аJ`%>Љ5—хœ]елЅA Œ›ѓъшtj>й˜jK9 иaжyф3Y:ЪядЃ‘2„twч%R„!:b‰`ˆњ/†wбР‘<ЇІ/њ•@dF:с4ь5G`€ož$uLч2‹МFcŽ|ќЕ№юЉЊќБžФHднWыЯ­Tкў…c{La†“Ѓ8ДЬ№ЄщIGУ“ЎTэ.%;§Јš ’ќ‡зzЖN9ЏY?"эЩіŸ.ыЮЌŠрaЎ1жУФљ‡ќ/™N0I„Б`ь-fžvрщxq@ЇM™ќœДєУэ\щ[щГ7žˆЫzj|0еПRbo6ХюЧ=ь +Зr]sьƒбкўс;†jo|œъbЗšнМWЪ7YщoНš’rЖ1імњеЊKwoє5ŒФD€Ї>yсНŒЮ•Jь\]5Ф[@%ЏœtЦ[еTЉЯSн|S„/]н!вrаžсEън.с'fщѕ"п62ёхޘж,рGкЖ!šл8ЦE˜ј<дR§M6|ф Eш3†ZzЅаЏRжИЛќnФо0Лњ_ЇЗУW-VМГю(•N”аен[‹QmіŸЊЊGгчšм{ЖТ<ЦЛв5šCё@хˆьrS~яјЁMИ3NхнэЦфAuL+•xэЫш3,jЯж{ЩяcкѓЛ m\;œžNЁBтЖЯqOK М/…rjйАGЪПЮk­}нio:В$пœƒГL%ОnіiСд‰Ё}Гq9.*мŽчђПИ~(І’­Фь 0еŠЂs.Ћ“РM|5Іƒ?zЈ™{Кјš8Pk>pxЕ/'VЙа"#:'ю§˜LйuзимAьЕqžЅЃГVкTђРј}žВ†щ~*снeЪ1O’р№гИ—ХЭ•}f”#DФЉіEР{Жк8:йBfDМe~•8˜qYЛЦ7RЎ({TDЫpЉіЦљь‘y{~…‰-K˜јHяІ–žGžа2хмќYчХЎЙЙЪnШ+QX–lъd:ё[ ч`2њF1~^ж;X…@є2г§R6Т‡.ТПы:7фіm У8АЩЂkcКђ7юц5 эюяmо‚ќэ~ѓw+8ппЌЅ3пиЎ‰јю5љщЛЮŸMЌ8™Ё0С|y%ЮьS/­Ma6]ЈЄМ R.&ъ№E|І W8О/є:ыбžиЧ6I:сњdz &Ўw<Ўџ.Ђи ычНm%„ЯЃz:gЪdпRЦ:­ЏєKТuSчBєЩн0ЎЄч)f2љџІЇg 0mДО”Ћ™яqФѓуЋŠЧBг@г Ж!НxЉyhHџ™Гн…Уˆујf9‡šIp˜Œ„уЇєи0) н*qЭЛ'бBрљЎQ:JЪХ>J@ЬpaG‘Kѕiš:dёXуЮ;„Н`ЖгœoNУ7ГЂŒšЗкп!E Š=гy…%œŠ[ЮB–щT–$>?ЧйЯpП0ЩPѓ9žoЏЪЬЕёC;dЭl–gыHё’EћšХфгЦ‰иMŠњ€sФMњЃ№л,BuфкhеХuЁ( 4№k0ъВѕAyT4їОб.цНbђKn[spYѓР‹ю[-Н‚ŒўиqЈP6%e—=врЪdEBФ]rБѓнІєї~­sŸџœaЙю=каm%Ќ@,Щу8АWЮAі)"Cїz`1b€ Сq8љ1мU-’Т ™ Auмc@‡FˆyV(Тo~ыMŽ, (yІ‹Бž бЎЉю[ЕL”FовБнЊf_+-RВa.’”тЎ€ŸBєDC%џzіDю/C­žїy)ъЦюqсmJJZдP;a vY;kяІ…уaЗTбWтR,N6‚œ>eQжЏRюг$ЮsТсж№kь(ZS/ЉCНxцчS#Ълід Іџ™v_jmшО!†Џєe=1<:3t—ЈЮѓЉ6aЪ#жsAМŸв€%[/R ЄcnUj‰‡]6дVц)‘ БІ<љ‡У‚њ iБt’“ё[tЁэAЌAшbкpф‰@}лnœязЃ;œЄЬšЖГМ}IїDГРЕw!™^ћ"ЇBб €R$ЛnгьцuБ1з{Žц'оўŸGп 3#LпЩ•ˆs8˜лйWпЖѕ R†ф<'дŒЬ?З~_чœ6“}hЅЈЖІА{АЊŽ0ЊфПОФоВ4|(мd5Ве  СЂШ>uGkщФŠрнIЧWёђJ."] hœэї“ѓЁŸЯ—ЊєШ˜ŸГ=zИк-{э]oЪЄ…Б’wџuЪ МИu„ы™xvі$€ЧфђєАшKхџyл N‰pCkвYV]MЉ+Cь№(ŸЁ ?J€6Фч5М!!ќЛ€„ёэD–p<№ЇЁJГ4/Œ3-MwСr”мИHЮ‹) oсvџшМноaŠhp6Тr[:кл$муФvЇЅ†^]~Џ< 7фЯˆЁљРrЊžц)KћУM'Ы0u$вSЇ|#ШSїъ:бx.šЉY бў€ћtnnn‰rQќ{г^NЇyВ*в`cкoђ{еУХеУ#cї wfИпнђEГ‘4zЬ;йРѓ#oЊT†џuщƒ/мд‹яtы'ј}yьцХX`ѓї}Uj=™jСф7OxeЖ3ії/…uTC[k9ЁH_ ?Ы#њЉЌ­ђМaЉВNИо[иЌп_ІЖ'‰FGџc.yO›MхЁ­ЯRЫeƒкЦ‘‡ЮPЧВЉSAЁЪžй†\buк_рub§ŠсŠРќbС7Ь€ ќ‰пЋBlбњ‰˜УUЩXЩ<Јšt}*Ё›Т9ƒЬ*АwUЩ№сmxjЅьxсM tшєХ ц)А3}Ђч6АLCшdЎрm•wШў0МлmХФyЕi:MsЅ іж@зIаI№kсHњ"WyтX’BљЫш'b$ƒЮУБпыь/мJЪKЮХV+В|їHхsЄB' Šѕ№ЊC]ЋЭHK/bО4zОФВ„„юЗdПШ–Щш[dњЈђђК бЖћuJн‹/‰р>lЪtВаІPўqЌMw БSžЭК[ћ5wЦFйи_lt][ е/Ÿ PAўe!ЫПрЭ]H‰Xљ}„J–ФЦ'fцВIЃЬƒбЃП`yЎDUъоGСъPЄюŠ\™Ц›ѓ ‰гбёЫ!кЁ<с_@›ЪmТЊadЩЏIyЭZt{$^‹"”ї\‡ Ц(ЅяЧь8эТF‚Žv•”ељ[ћmw`vX˜X­ЕIс ТNєŒњ( ы3ідaУ ауЋ3СAЦ ТCЛ^a&:МhЊjdчэ ЏЁИШГОиkьS ЬУлњaBјКИяЭ­ƒѓ+єощRЇс[\Я PъФ~­%`дœaВй”JUвkТ_”*№Сiбœ]Іоѕ&ЖlЎЂ+cмЏЧ#b lD4bSžLЉeQЖ\ОO†эNТј‡Тў’ „іHЫЌг+GJтNі‰1›Жл0й”+†ƒlУ3ЦŸ‚Q$r”х§j”j№ЬСс[ZХўЕgйKO>Ў†ƒљсти _кЈ•П „f@ŒvЫ[‡"о Iir*Iхё –gГ‹˜ТЕ„Р)зŸ/g3*u™г пќ8žМ3:`2%х`{лщ+ŒЩ ­цьp|лn2žšЏ‘Ћ~K:реЌYб ЎЪБU“њžР<[+Чаc`> .žъ*ЊЏ?!ПЬRђЭ§ТJу^v’„ vGоЪ3ђ Ф’ЯšйŽ!НšУoкю’MMЪмСLwа/УDL Ь‰Р[јхј. _ДОб“юш„–;чаЙўB}(Ж\Oџ-@ФЧ8Ѕ%rXu.TЊ–O4ЎŸ`{X _aќYьŽЎ›H”гЭб™ž Ÿ7оMйџqoс№aŸФ6ЦфВјOb<І#+\“ЇМЃJ1СсЌHьЙb=‰УЋЏ˜ю‡{ІCЭ—Х“:ЅЗxаЋЎѕ§ЋМC=žё8y>qкg™СvaœЋŽ[D|7Оz™§тФєї] ћ( щa ѕo>–ИО`ŒN§љ5“BЖKmЯq5‹‚`mLI'‹ЁШќjЭ1 %ЇŠ Х[Г €Aі%‰с)i9–ъy bGNGБMЈЪDNђмOекцОЄZfБEг“Ž…™—ы8пAPw•‘žл+(„гнчъAЩ“ЉЏ`Pv8 Јkі№љtэп3Dœ‡MђЩPeбфшј„lНаАпH1ва№ >Z ыЕу: А5@ПPe2жиqŽEѕYC•эLЇі"TAћБ›3х)НCIл{уC™ђєъdcкŒКБЄљн.№?&œЦJСbІ:­бdPъ2џ`А#ЩsВ |ѓ…лQїms‰Ўї?Г‚’ž… VАА8|Ж~“у '*`ЙУkЋЖѕљ‡ППZС {?@0žg?аyЈм‹,ž@Х3ЊЈm-С|WЄ žШs?!Ббі)&Ќn‘МgОpФѕ†Ё‚ц№2l”Q%‹АЇ-jП1' Щa#ЁжiнPa5ТнІА[9`ЕєБmЄєдтu3шАr™HЃО) ЗQЪЇQ}4іУD@­јз‘ІнЧ„$IЯ)КМо^дO>E1rЫYРЗkŒ5ЕЬО‹ЖБgg9%К–,VЫŽ\žU4Qѕл­ХdиWс^wїl:їd!b›ђХбЮ›ѕu†€6ІТл€NЖaЦНжЂБ@Bq‘9}•щS`p\з‰zW4TЛ-ТCЗHRЃЁи.ЛЪфЯаLU[вКЋх‡fЛeт1~н DЋVeч%Ч6ИB=Pс™ђЁб7qю№оy:bgLњєaЦВ†ѕ\;k .ц{7–Ф"XЪЙВшНа_б[Ѓjwj]а/в„њtiрњл…ZOэX{27/KЕ:)ѓ[а'тDcЉB’~в…`л-‘ЦФБ ЙOS—ос™ТђŠcƒdViзFоЯۘт{„l›€3эцЇMЗЏ™ T%ЖЫгuфZEд=\Z=OгƒCѕE„#ёолІi,ачН|Д7Xr=ћЖГ,џЋмЏuW-мPВ}Лњuu'eE­YДс…ћM”~…ДНошЖ5'Ыb&FŠ|ю5ХџЩжZ*\6іA1ьШзњлђRLёК(ыpАoсP~ёў0OŠ+s„P,.§*ІущЊАауgxЬ1„3v&ˆnљ‚]G<ШЛR1j4^ћСЦЖіъчп60–цC{‡vє(ЩкытБ|кlX{"f$Wh#$.ЩwjзИ`АђЦmVgл4Кю:ФОш7L1тnzЂmШWевк@œYјyЫ:ЅYuCрIЋ–5дюhq Њ…+ ЭдЪАКй?xмЯWȘ۾G †ѕЏ Ї8u‘›Оu›ЌbTdр3ѓ|ЫNi,Ё=jQцNvСaЪ~eš`€љЪ3WнQ™W–Жме ШФ:ѕ/Ѕd|dМЁXj5*яі†N-БфsП$‚§Ђчtц/[`žtвУЦ~{ВЁ.A.žpеч4tZeч†`OE„НHЖіѓюЙлsi!3–NraћџƒnкеYѓgJдЭ! 2_эŽ5Р aWN"М{2,ОЏ^ОШnы>Ю™TbщJЏТB<>Ю1nбŠЁrœ`пЬВQРnтАк/ц8sSDІ>ы†p>ФЉњнЦїV])њ2„Ђ3‘ЂŠB—їtGР'§ЁАZЗŠtЂє"Юь1…u_ТNкОУХЖ ыљѕv/w[œBЮбЛЛM|ŸчБFq!3eWDАh+НЕв–NмЙоЖž‰є2BcВюрЎтEѕи|јИЃ ђiZŸlжKІо{ТЪTќФ&Ж>]в2m`œЧЇg+ŸgЙчžФ§v tѕ=а2Иуа=ЦГЖ! Љ]‹j)ње$;Ю‹iў~~`хѓГv›fH6ЧбatйZ”љ!Лp`žл-^ЮЬ&РњоEчKщ;bЩ€Œ eгbЎY‡”UЪ}уЈЋkф}тП#і] YЫ=Ф4.%иOjBmЏэNєЮ№QŽ/6БLОX34ƒяLћх"qуФT/иfвЮ!GЮі …B%sE+Ib`P2ъьѕЛь(›kџ_ –SЬ?9ьGmгB‹Ўs"Š6ЕsYdA:lЮQї†РBдjѕnЩъНћЃTЪјtq Њ ­?kށа˜ДBу^8<чМ+иvt-8cL~œЦпчpлƒ2Ы3ax№?мSъМЕAьяEypRоLxбCПЄ7hрaš›Бр˜7њm nъŠZЏ]ZIџ:шYчHЏ(н =lэ6ќTO!wuYцСŠТъ…EoIЪEW‹ѓЈш'iѓдŠ|•4н fг0NŸсКЃщј{хƒ€M9Ђ,=oˆл(YЮEŠмЭmс;џЎ"іРj,ХJHЙжUЪєиьИ;~_…Љ0v5њŽ2тr‘”œЎРr^ВЩхqШ3TЄ‡ъЂ3)/ц9Ь,Cw> endobj 8 0 obj << /Type /Pages /Count 6 /Parent 702 0 R /Kids [2 0 R 10 0 R 14 0 R 18 0 R 22 0 R 26 0 R] >> endobj 33 0 obj << /Type /Pages /Count 6 /Parent 702 0 R /Kids [30 0 R 35 0 R 39 0 R 45 0 R 49 0 R 53 0 R] >> endobj 60 0 obj << /Type /Pages /Count 6 /Parent 702 0 R /Kids [57 0 R 62 0 R 66 0 R 70 0 R 74 0 R 79 0 R] >> endobj 88 0 obj << /Type /Pages /Count 6 /Parent 702 0 R /Kids [83 0 R 90 0 R 96 0 R 100 0 R 104 0 R 109 0 R] >> endobj 116 0 obj << /Type /Pages /Count 6 /Parent 702 0 R /Kids [113 0 R 118 0 R 122 0 R 126 0 R 130 0 R 135 0 R] >> endobj 142 0 obj << /Type /Pages /Count 6 /Parent 702 0 R /Kids [139 0 R 144 0 R 148 0 R 152 0 R 156 0 R 160 0 R] >> endobj 168 0 obj << /Type /Pages /Count 6 /Parent 703 0 R /Kids [165 0 R 170 0 R 174 0 R 178 0 R 182 0 R 186 0 R] >> endobj 193 0 obj << /Type /Pages /Count 6 /Parent 703 0 R /Kids [190 0 R 195 0 R 199 0 R 203 0 R 207 0 R 211 0 R] >> endobj 218 0 obj << /Type /Pages /Count 6 /Parent 703 0 R /Kids [215 0 R 220 0 R 224 0 R 228 0 R 232 0 R 236 0 R] >> endobj 243 0 obj << /Type /Pages /Count 6 /Parent 703 0 R /Kids [240 0 R 245 0 R 249 0 R 253 0 R 257 0 R 261 0 R] >> endobj 268 0 obj << /Type /Pages /Count 6 /Parent 703 0 R /Kids [265 0 R 270 0 R 274 0 R 278 0 R 282 0 R 286 0 R] >> endobj 294 0 obj << /Type /Pages /Count 6 /Parent 703 0 R /Kids [291 0 R 296 0 R 300 0 R 304 0 R 308 0 R 312 0 R] >> endobj 319 0 obj << /Type /Pages /Count 6 /Parent 704 0 R /Kids [316 0 R 321 0 R 325 0 R 329 0 R 333 0 R 337 0 R] >> endobj 344 0 obj << /Type /Pages /Count 6 /Parent 704 0 R /Kids [341 0 R 346 0 R 350 0 R 354 0 R 358 0 R 362 0 R] >> endobj 369 0 obj << /Type /Pages /Count 6 /Parent 704 0 R /Kids [366 0 R 371 0 R 375 0 R 379 0 R 383 0 R 387 0 R] >> endobj 394 0 obj << /Type /Pages /Count 6 /Parent 704 0 R /Kids [391 0 R 396 0 R 400 0 R 404 0 R 408 0 R 412 0 R] >> endobj 419 0 obj << /Type /Pages /Count 6 /Parent 704 0 R /Kids [416 0 R 421 0 R 425 0 R 429 0 R 433 0 R 437 0 R] >> endobj 444 0 obj << /Type /Pages /Count 6 /Parent 704 0 R /Kids [441 0 R 446 0 R 450 0 R 454 0 R 458 0 R 462 0 R] >> endobj 469 0 obj << /Type /Pages /Count 6 /Parent 705 0 R /Kids [466 0 R 471 0 R 475 0 R 479 0 R 483 0 R 487 0 R] >> endobj 494 0 obj << /Type /Pages /Count 6 /Parent 705 0 R /Kids [491 0 R 496 0 R 500 0 R 504 0 R 508 0 R 512 0 R] >> endobj 519 0 obj << /Type /Pages /Count 6 /Parent 705 0 R /Kids [516 0 R 521 0 R 525 0 R 529 0 R 533 0 R 537 0 R] >> endobj 544 0 obj << /Type /Pages /Count 6 /Parent 705 0 R /Kids [541 0 R 546 0 R 550 0 R 554 0 R 558 0 R 562 0 R] >> endobj 569 0 obj << /Type /Pages /Count 6 /Parent 705 0 R /Kids [566 0 R 571 0 R 575 0 R 579 0 R 583 0 R 587 0 R] >> endobj 702 0 obj << /Type /Pages /Count 36 /Parent 706 0 R /Kids [8 0 R 33 0 R 60 0 R 88 0 R 116 0 R 142 0 R] >> endobj 703 0 obj << /Type /Pages /Count 36 /Parent 706 0 R /Kids [168 0 R 193 0 R 218 0 R 243 0 R 268 0 R 294 0 R] >> endobj 704 0 obj << /Type /Pages /Count 36 /Parent 706 0 R /Kids [319 0 R 344 0 R 369 0 R 394 0 R 419 0 R 444 0 R] >> endobj 705 0 obj << /Type /Pages /Count 30 /Parent 706 0 R /Kids [469 0 R 494 0 R 519 0 R 544 0 R 569 0 R] >> endobj 706 0 obj << /Type /Pages /Count 138 /Kids [702 0 R 703 0 R 704 0 R 705 0 R] >> endobj 707 0 obj << /Type /Catalog /Pages 706 0 R >> endobj 708 0 obj << /Creator (TeX) /Producer (pdfTeX-0.13d) /CreationDate (D:20071215104300) >> endobj xref 0 709 0000000000 65535 f 0000000422 00000 n 0000000310 00000 n 0000000009 00000 n 0000000291 00000 n 0000392816 00000 n 0000381773 00000 n 0000362889 00000 n 0000408742 00000 n 0000000782 00000 n 0000000668 00000 n 0000000512 00000 n 0000000649 00000 n 0000001894 00000 n 0000001779 00000 n 0000000850 00000 n 0000001759 00000 n 0000003263 00000 n 0000003148 00000 n 0000001985 00000 n 0000003127 00000 n 0000004547 00000 n 0000004432 00000 n 0000003343 00000 n 0000004412 00000 n 0000005852 00000 n 0000005737 00000 n 0000004627 00000 n 0000005716 00000 n 0000007199 00000 n 0000007083 00000 n 0000005932 00000 n 0000007062 00000 n 0000408850 00000 n 0000008377 00000 n 0000008261 00000 n 0000007279 00000 n 0000008241 00000 n 0000009905 00000 n 0000009789 00000 n 0000008457 00000 n 0000009768 00000 n 0000354840 00000 n 0000337248 00000 n 0000011631 00000 n 0000011515 00000 n 0000010020 00000 n 0000011494 00000 n 0000013211 00000 n 0000013095 00000 n 0000011735 00000 n 0000013074 00000 n 0000013578 00000 n 0000013462 00000 n 0000013303 00000 n 0000013443 00000 n 0000015069 00000 n 0000014953 00000 n 0000013647 00000 n 0000014932 00000 n 0000408960 00000 n 0000016263 00000 n 0000016147 00000 n 0000015172 00000 n 0000016127 00000 n 0000018000 00000 n 0000017884 00000 n 0000016355 00000 n 0000017863 00000 n 0000018700 00000 n 0000018584 00000 n 0000018092 00000 n 0000018564 00000 n 0000020718 00000 n 0000020602 00000 n 0000018781 00000 n 0000020581 00000 n 0000317183 00000 n 0000022579 00000 n 0000022463 00000 n 0000020856 00000 n 0000022442 00000 n 0000025120 00000 n 0000025004 00000 n 0000022695 00000 n 0000024983 00000 n 0000304573 00000 n 0000296652 00000 n 0000409070 00000 n 0000027605 00000 n 0000027489 00000 n 0000025260 00000 n 0000027468 00000 n 0000292623 00000 n 0000288627 00000 n 0000029911 00000 n 0000029795 00000 n 0000027780 00000 n 0000029774 00000 n 0000030354 00000 n 0000030236 00000 n 0000030074 00000 n 0000030216 00000 n 0000032078 00000 n 0000031959 00000 n 0000030423 00000 n 0000031937 00000 n 0000279880 00000 n 0000034276 00000 n 0000034157 00000 n 0000032254 00000 n 0000034135 00000 n 0000036652 00000 n 0000036532 00000 n 0000034441 00000 n 0000036510 00000 n 0000409183 00000 n 0000038971 00000 n 0000038851 00000 n 0000036828 00000 n 0000038829 00000 n 0000041063 00000 n 0000040943 00000 n 0000039099 00000 n 0000040921 00000 n 0000043733 00000 n 0000043613 00000 n 0000041250 00000 n 0000043591 00000 n 0000046651 00000 n 0000046531 00000 n 0000043898 00000 n 0000046509 00000 n 0000275642 00000 n 0000049738 00000 n 0000049618 00000 n 0000046852 00000 n 0000049596 00000 n 0000051856 00000 n 0000051736 00000 n 0000049928 00000 n 0000051714 00000 n 0000409300 00000 n 0000053649 00000 n 0000053529 00000 n 0000052033 00000 n 0000053507 00000 n 0000055353 00000 n 0000055233 00000 n 0000053814 00000 n 0000055211 00000 n 0000057378 00000 n 0000057258 00000 n 0000055468 00000 n 0000057236 00000 n 0000059806 00000 n 0000059686 00000 n 0000057460 00000 n 0000059664 00000 n 0000061887 00000 n 0000061767 00000 n 0000059923 00000 n 0000061745 00000 n 0000271946 00000 n 0000063990 00000 n 0000063870 00000 n 0000062052 00000 n 0000063848 00000 n 0000409417 00000 n 0000066197 00000 n 0000066077 00000 n 0000064118 00000 n 0000066055 00000 n 0000068868 00000 n 0000068748 00000 n 0000066348 00000 n 0000068726 00000 n 0000071304 00000 n 0000071184 00000 n 0000069043 00000 n 0000071162 00000 n 0000073466 00000 n 0000073346 00000 n 0000071467 00000 n 0000073324 00000 n 0000075384 00000 n 0000075264 00000 n 0000073617 00000 n 0000075242 00000 n 0000077855 00000 n 0000077735 00000 n 0000075559 00000 n 0000077713 00000 n 0000409534 00000 n 0000079900 00000 n 0000079780 00000 n 0000078031 00000 n 0000079758 00000 n 0000081936 00000 n 0000081816 00000 n 0000080052 00000 n 0000081794 00000 n 0000083358 00000 n 0000083238 00000 n 0000082099 00000 n 0000083216 00000 n 0000083993 00000 n 0000083873 00000 n 0000083475 00000 n 0000083852 00000 n 0000084357 00000 n 0000084237 00000 n 0000084075 00000 n 0000084217 00000 n 0000086065 00000 n 0000085945 00000 n 0000084427 00000 n 0000085923 00000 n 0000409651 00000 n 0000088377 00000 n 0000088257 00000 n 0000086193 00000 n 0000088235 00000 n 0000091212 00000 n 0000091092 00000 n 0000088541 00000 n 0000091070 00000 n 0000093928 00000 n 0000093808 00000 n 0000091400 00000 n 0000093786 00000 n 0000096959 00000 n 0000096839 00000 n 0000094118 00000 n 0000096817 00000 n 0000099485 00000 n 0000099365 00000 n 0000097123 00000 n 0000099343 00000 n 0000101573 00000 n 0000101453 00000 n 0000099660 00000 n 0000101431 00000 n 0000409768 00000 n 0000104175 00000 n 0000104055 00000 n 0000101737 00000 n 0000104033 00000 n 0000104894 00000 n 0000104774 00000 n 0000104350 00000 n 0000104753 00000 n 0000105269 00000 n 0000105149 00000 n 0000104987 00000 n 0000105129 00000 n 0000106860 00000 n 0000106740 00000 n 0000105339 00000 n 0000106718 00000 n 0000109242 00000 n 0000109122 00000 n 0000106999 00000 n 0000109100 00000 n 0000111416 00000 n 0000111296 00000 n 0000109383 00000 n 0000111274 00000 n 0000409885 00000 n 0000114013 00000 n 0000113893 00000 n 0000111591 00000 n 0000113871 00000 n 0000116734 00000 n 0000116614 00000 n 0000114203 00000 n 0000116592 00000 n 0000118110 00000 n 0000117990 00000 n 0000116921 00000 n 0000117969 00000 n 0000119725 00000 n 0000119605 00000 n 0000118285 00000 n 0000119583 00000 n 0000122292 00000 n 0000122172 00000 n 0000119876 00000 n 0000122150 00000 n 0000268942 00000 n 0000124350 00000 n 0000124230 00000 n 0000122516 00000 n 0000124208 00000 n 0000410002 00000 n 0000124784 00000 n 0000124664 00000 n 0000124502 00000 n 0000124644 00000 n 0000126476 00000 n 0000126356 00000 n 0000124854 00000 n 0000126334 00000 n 0000128841 00000 n 0000128721 00000 n 0000126663 00000 n 0000128699 00000 n 0000131053 00000 n 0000130933 00000 n 0000129006 00000 n 0000130911 00000 n 0000132197 00000 n 0000132077 00000 n 0000131195 00000 n 0000132056 00000 n 0000134074 00000 n 0000133954 00000 n 0000132279 00000 n 0000133932 00000 n 0000410119 00000 n 0000136138 00000 n 0000136018 00000 n 0000134250 00000 n 0000135996 00000 n 0000137107 00000 n 0000136987 00000 n 0000136292 00000 n 0000136966 00000 n 0000137519 00000 n 0000137399 00000 n 0000137237 00000 n 0000137379 00000 n 0000139691 00000 n 0000139571 00000 n 0000137589 00000 n 0000139549 00000 n 0000141647 00000 n 0000141527 00000 n 0000139855 00000 n 0000141505 00000 n 0000144368 00000 n 0000144248 00000 n 0000141799 00000 n 0000144226 00000 n 0000410236 00000 n 0000146153 00000 n 0000146033 00000 n 0000144496 00000 n 0000146011 00000 n 0000147962 00000 n 0000147842 00000 n 0000146247 00000 n 0000147820 00000 n 0000150059 00000 n 0000149939 00000 n 0000148148 00000 n 0000149917 00000 n 0000151701 00000 n 0000151581 00000 n 0000150199 00000 n 0000151559 00000 n 0000153934 00000 n 0000153814 00000 n 0000151818 00000 n 0000153792 00000 n 0000156487 00000 n 0000156367 00000 n 0000154086 00000 n 0000156345 00000 n 0000410353 00000 n 0000159009 00000 n 0000158889 00000 n 0000156651 00000 n 0000158867 00000 n 0000160728 00000 n 0000160608 00000 n 0000159162 00000 n 0000160586 00000 n 0000162885 00000 n 0000162765 00000 n 0000160822 00000 n 0000162743 00000 n 0000165195 00000 n 0000165075 00000 n 0000163037 00000 n 0000165053 00000 n 0000167630 00000 n 0000167510 00000 n 0000165349 00000 n 0000167488 00000 n 0000169722 00000 n 0000169602 00000 n 0000167793 00000 n 0000169580 00000 n 0000410470 00000 n 0000171648 00000 n 0000171528 00000 n 0000169863 00000 n 0000171506 00000 n 0000174010 00000 n 0000173890 00000 n 0000171788 00000 n 0000173868 00000 n 0000176483 00000 n 0000176363 00000 n 0000174174 00000 n 0000176341 00000 n 0000178348 00000 n 0000178228 00000 n 0000176659 00000 n 0000178206 00000 n 0000180967 00000 n 0000180847 00000 n 0000178537 00000 n 0000180825 00000 n 0000183871 00000 n 0000183751 00000 n 0000181120 00000 n 0000183729 00000 n 0000410587 00000 n 0000186405 00000 n 0000186285 00000 n 0000184047 00000 n 0000186263 00000 n 0000189241 00000 n 0000189121 00000 n 0000186571 00000 n 0000189099 00000 n 0000191814 00000 n 0000191694 00000 n 0000189418 00000 n 0000191672 00000 n 0000194709 00000 n 0000194589 00000 n 0000191967 00000 n 0000194567 00000 n 0000197674 00000 n 0000197554 00000 n 0000194884 00000 n 0000197532 00000 n 0000199792 00000 n 0000199672 00000 n 0000197839 00000 n 0000199650 00000 n 0000410704 00000 n 0000202324 00000 n 0000202204 00000 n 0000199955 00000 n 0000202182 00000 n 0000204071 00000 n 0000203951 00000 n 0000202489 00000 n 0000203929 00000 n 0000206542 00000 n 0000206422 00000 n 0000204212 00000 n 0000206400 00000 n 0000209115 00000 n 0000208995 00000 n 0000206718 00000 n 0000208973 00000 n 0000211055 00000 n 0000210935 00000 n 0000209301 00000 n 0000210913 00000 n 0000212633 00000 n 0000212513 00000 n 0000211160 00000 n 0000212491 00000 n 0000410821 00000 n 0000213045 00000 n 0000212925 00000 n 0000212762 00000 n 0000212905 00000 n 0000214414 00000 n 0000214294 00000 n 0000213115 00000 n 0000214272 00000 n 0000217166 00000 n 0000217046 00000 n 0000214566 00000 n 0000217024 00000 n 0000219390 00000 n 0000219270 00000 n 0000217343 00000 n 0000219248 00000 n 0000221661 00000 n 0000221541 00000 n 0000219553 00000 n 0000221519 00000 n 0000224441 00000 n 0000224321 00000 n 0000221825 00000 n 0000224299 00000 n 0000410938 00000 n 0000226371 00000 n 0000226251 00000 n 0000224629 00000 n 0000226229 00000 n 0000228047 00000 n 0000227927 00000 n 0000226546 00000 n 0000227905 00000 n 0000230114 00000 n 0000229994 00000 n 0000228163 00000 n 0000229972 00000 n 0000231792 00000 n 0000231672 00000 n 0000230243 00000 n 0000231650 00000 n 0000234338 00000 n 0000234218 00000 n 0000231978 00000 n 0000234196 00000 n 0000236631 00000 n 0000236511 00000 n 0000234502 00000 n 0000236489 00000 n 0000411055 00000 n 0000238588 00000 n 0000238468 00000 n 0000236795 00000 n 0000238446 00000 n 0000241319 00000 n 0000241199 00000 n 0000238717 00000 n 0000241177 00000 n 0000243487 00000 n 0000243367 00000 n 0000241506 00000 n 0000243345 00000 n 0000245578 00000 n 0000245458 00000 n 0000243592 00000 n 0000245436 00000 n 0000247626 00000 n 0000247506 00000 n 0000245707 00000 n 0000247484 00000 n 0000248660 00000 n 0000248540 00000 n 0000247754 00000 n 0000248519 00000 n 0000411172 00000 n 0000249025 00000 n 0000248905 00000 n 0000248742 00000 n 0000248885 00000 n 0000250754 00000 n 0000250634 00000 n 0000249095 00000 n 0000250612 00000 n 0000253633 00000 n 0000253513 00000 n 0000250929 00000 n 0000253491 00000 n 0000256440 00000 n 0000256320 00000 n 0000253810 00000 n 0000256298 00000 n 0000258701 00000 n 0000258581 00000 n 0000256581 00000 n 0000258559 00000 n 0000260584 00000 n 0000260464 00000 n 0000258865 00000 n 0000260442 00000 n 0000411289 00000 n 0000262653 00000 n 0000262533 00000 n 0000260724 00000 n 0000262511 00000 n 0000264684 00000 n 0000264564 00000 n 0000262805 00000 n 0000264542 00000 n 0000265821 00000 n 0000265701 00000 n 0000264790 00000 n 0000265680 00000 n 0000266887 00000 n 0000266767 00000 n 0000265914 00000 n 0000266746 00000 n 0000268837 00000 n 0000268717 00000 n 0000267003 00000 n 0000268695 00000 n 0000269078 00000 n 0000269631 00000 n 0000271635 00000 n 0000271657 00000 n 0000271678 00000 n 0000271699 00000 n 0000271720 00000 n 0000271751 00000 n 0000272082 00000 n 0000272626 00000 n 0000275324 00000 n 0000275346 00000 n 0000275367 00000 n 0000275389 00000 n 0000275410 00000 n 0000275441 00000 n 0000275778 00000 n 0000276324 00000 n 0000279562 00000 n 0000279584 00000 n 0000279605 00000 n 0000279627 00000 n 0000279648 00000 n 0000279679 00000 n 0000280016 00000 n 0000280580 00000 n 0000287858 00000 n 0000287880 00000 n 0000287902 00000 n 0000287924 00000 n 0000287945 00000 n 0000287977 00000 n 0000288762 00000 n 0000289306 00000 n 0000292298 00000 n 0000292320 00000 n 0000292341 00000 n 0000292363 00000 n 0000292384 00000 n 0000292414 00000 n 0000292758 00000 n 0000293303 00000 n 0000296292 00000 n 0000296314 00000 n 0000296335 00000 n 0000296357 00000 n 0000296378 00000 n 0000296409 00000 n 0000296787 00000 n 0000297323 00000 n 0000304151 00000 n 0000304173 00000 n 0000304195 00000 n 0000304217 00000 n 0000304238 00000 n 0000304268 00000 n 0000304708 00000 n 0000305249 00000 n 0000316758 00000 n 0000316781 00000 n 0000316803 00000 n 0000316825 00000 n 0000316846 00000 n 0000316877 00000 n 0000317318 00000 n 0000317851 00000 n 0000336717 00000 n 0000336740 00000 n 0000336762 00000 n 0000336785 00000 n 0000336806 00000 n 0000336838 00000 n 0000337383 00000 n 0000337916 00000 n 0000354165 00000 n 0000354188 00000 n 0000354210 00000 n 0000354233 00000 n 0000354254 00000 n 0000354286 00000 n 0000354975 00000 n 0000355519 00000 n 0000362319 00000 n 0000362341 00000 n 0000362363 00000 n 0000362385 00000 n 0000362406 00000 n 0000362438 00000 n 0000363023 00000 n 0000363557 00000 n 0000381114 00000 n 0000381137 00000 n 0000381159 00000 n 0000381182 00000 n 0000381203 00000 n 0000381234 00000 n 0000381907 00000 n 0000382441 00000 n 0000392399 00000 n 0000392421 00000 n 0000392443 00000 n 0000392465 00000 n 0000392486 00000 n 0000392518 00000 n 0000392950 00000 n 0000393488 00000 n 0000408183 00000 n 0000408206 00000 n 0000408228 00000 n 0000408251 00000 n 0000408272 00000 n 0000408304 00000 n 0000411406 00000 n 0000411519 00000 n 0000411637 00000 n 0000411755 00000 n 0000411865 00000 n 0000411952 00000 n 0000412005 00000 n trailer << /Size 709 /Root 707 0 R /Info 708 0 R >> startxref 412101 %%EOF mricron-0.20120505.1~dfsg.1.orig/fpmath/regmult.pas0000664000175000017500000001330411326434464021323 0ustar michaelmichael{ ********************************************************************** * Program REGMULT.PAS * * Version 1.1 * * (c) J. Debord, August 2000 * ********************************************************************** This program performs a weighted multiple linear least squares fit : y = b0 + b1 * x1 + b2 * x2 + ... The following parameters are passed on the command line : 1st parameter = name of input file (default extension = .DAT) 2nd parameter = 1 if the equation includes a constant term b0 Input files are ASCII files with the following structure : Line 1 : Title of study Line 2 : Number of variables (must be >= 2 here !) Next lines : Names of variables x1, x2, ..., y Next line : Number of observations (must be > number of variables !) The next lines contain the coordinates (x1, x2, ..., y) of the observations (1 observation by line). The coordinates must be separated by spaces or tabulations. The file INHIB.DAT is an example of data relating the inhibition of an enzyme to the physico-chemical properties of the inhibitors (J. DEBORD, P. N'DIAYE, J. C. BOLLINGER et al, J. Enzyme Inhib., 1997, 12, 13-26). The program parameters are : INHIB 1 The program may be executed from Turbo Pascal's integrated environment, in which case the parameters are entered through the "Parameters" option of the menu, or from DOS (after compilation into an executable file), in which case the parameters are entered on the command line (e.g. REGMULT INHIB 1). ********************************************************************** } unit regmult; interface uses SysUtils,utypes,umulfit,classes,define_types,dialogs; function MultipleRegressionVec (lnObservations,lnFactors: integer; var X: PMatrix; var Y: PVector; var lOutT,lOutSlope: DoubleP0): boolean; function MultipleRegression (lnObservations,lnFactors: integer; var X: PMatrix; var lImgIntensity: DoubleP0; var lOutT: DoubleP0): boolean; implementation uses usvdfit,uregtest; (*procedure WriteResults(NVar: integer; var lOutT,lOutSlope: DoubleP0); var I: integer; lStr: string; begin for I := 0 to Nvar do begin lStr := floattostr(lOutT^[I]) +' '+floattostr(lOutSlope[I]); Form1.memo1.lines.add(lStr); end; end; *) function MultipleRegressionVec (lnObservations,lnFactors: integer; var X: PMatrix; var Y: PVector; var lOutT,lOutSlope: DoubleP0): boolean; var //lmax,lmin: float; XX : PMatrix; { Independent variables } //YY : PVector; { Dependent variable } Ycalc : PVector; { Computed Y values } B : PVector; { Fitted parameters } V : PMatrix; { Variance-covariance matrix } Test : TRegTest; { Statistical tests } lVar : Float; { Variance for t value } Lb,I, J : Integer; { Loop variable } ConsTerm : boolean; { Include a constant term B(0) } begin result := false; ConsTerm := true; { Dimension arrays } DimMatrix(XX, lnObservations, lnFactors); //DimVector(YY, lnObservations); DimVector(Ycalc, lnObservations); DimVector(B, lnFactors); DimMatrix(V, lnFactors, lnFactors); { Read data } for I := 1 to lnObservations do begin for J := 1 to lnFactors do begin XX^[I]^[J] := X^[J]^[I];//Designed to be compatible with old versions of fpmath end; end; (* lmin := X^[1]^[1]; lmax := X^[1]^[1]; for I := 1 to lnFactors do begin for J := 1 to lnObservations do begin if X^[I]^[J] > lmax then lMax := X^[I]^[J]; if X^[I]^[J] < lmin then lMin := X^[I]^[J]; end; end; fx(lmin,lmax);*) { Perform regression } // MulFit(XX, Y, 1, lnObservations, lnFactors, ConsTerm, B, V); SVDFit(XX, Y, 1, lnObservations, lnFactors, ConsTerm, 1.0E-8, B, V); { Compute predicted Y values } for I := 1 to lnObservations do begin if ConsTerm then Ycalc^[I] := B^[0] else Ycalc^[I] := 0.0; for J := 1 to lnFactors do Ycalc^[I] := Ycalc^[I] + B^[J] * XX^[I]^[J]; end; { Update variance-covariance matrix and compute statistical tests } if ConsTerm then Lb := 0 else Lb := 1; RegTest(Y, Ycalc, 1, lnObservations, V, Lb, lnFactors, Test); //output Slopes for I := 0 to (lnFactors-1) do lOutSlope^[I] := B^[I+1];//first parameter is global fit lOutSlope^[lnFactors] := B^[0];//global fit //T scores for I := 0 to (lnFactors-1) do begin lVar :=Sqrt(V^[I+1]^[I+1]); //fx(lVar,B^[I+1]); if lVar <> 0 then lOutT^[I] := B^[I+1] / lVar else lOutT^[I] := 0; end; lvar := Sqrt(V^[0]^[0]); if lvar <> 0 then lOutT^[lnFactors] := B^[0]/ lvar //global fit else lOutT^[lnFactors] := 0; //cleanup DelMatrix(XX, lnObservations, lnFactors); //DelVector(YY, lnObservations); DelVector(Ycalc, lnObservations); DelVector(B, lnFactors); DelMatrix(V, lnFactors,lnFactors); result := true; end; function MultipleRegression (lnObservations,lnFactors: integer; var X: PMatrix; var lImgIntensity: DoubleP0; var lOutT: DoubleP0): boolean; var I: integer; Y : PVector; { Dependent variable } lOutSlope: DoubleP0; begin DimVector(Y, lnObservations); Getmem(lOutSlope,(lnObservations+1)*sizeof(double)); { Read data } for I := 1 to lnObservations do Y^[I] := lImgIntensity^[I-1]; result := MultipleRegressionVec (lnObservations,lnFactors,X, Y, lOutT,lOutSlope); Freemem(lOutslope); DelVector(Y,lnObservations); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/lgpl.txt0000664000175000017500000006446611326434464020655 0ustar michaelmichael GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! mricron-0.20120505.1~dfsg.1.orig/fpmath/filelist.txt0000664000175000017500000005112511326434464021516 0ustar michaelmichaelUnit Routines Description ----------------------------------------------------------------------- utypes SetErrCode Sets error code * DefaultVal Sets error code and default function value * MathErr Returns the error code * SetAutoInit Sets the auto-initialization of arrays * DimVector Allocates a real vector * DimIntVector Allocates an integer vector * DimCompVector Allocates a complex vector * DimBoolVector Allocates a boolean vector * DimStrVector Allocates a string vector * DimMatrix Allocates a real matrix * DimIntMatrix Allocates an integer matrix * DimCompMatrix Allocates a complex matrix * DimBoolMatrix Allocates a boolean matrix * DimStrMatrix Allocates a string matrix * DelVector Deallocates a real vector * DelIntVector Deallocates an integer vector * DelCompVector Deallocates a complex vector * DelBoolVector Deallocates a boolean vector * DelStrVector Deallocates a string vector * DelMatrix Deallocates a real matrix * DelIntMatrix Deallocates an integer matrix * DelCompMatrix Deallocates a complex matrix * DelBoolMatrix Deallocates a boolean matrix * DelStrMatrix Deallocates a string matrix uminmax FMin Minimum of 2 reals * FMax Maximum of 2 reals * IMin Minimum of 2 integers * IMax Maximum of 2 integers * Sgn Sign, Sgn(0) = 1 * Sgn0 Sign, Sgn(0) = 0 * DSgn DSgn(A, B) = Sgn(B) * |A| * FSwap Exchanges 2 reals * ISwap Exchanges 2 integers uround RoundN Rounds a number to N decimal places * Ceil Ceiling function * Floor Floor function umath Expo Exponential (with bound checking) * Exp2 Exponential, base 2 * Exp10 Exponential, base 10 * Log Natural log (with bound checking) * Log2 Log, base 2 * Log10 Log, base 10 * LogA Log, base A * IntPower Power (integer exponent) * Power Power (real exponent) utrigo Pythag Sqrt(X^2 + Y^2) * FixAngle Set argument in -Pi..Pi * Tan Tangent * ArcSin Arc sinus * ArcCos Arc cosinus * ArcTan2 Angle (Ox, OM) with M(X,Y) uhyper Sinh Hyperbolic sine * Cosh Hyperbolic cosine * Tanh Hyperbolic tangent * ArcSinh Inverse hyperbolic sine * ArcCosh Inverse hyperbolic cosine * ArcTanh Inverse hyperbolic tangent * SinhCosh Sinh and Cosh upolev PolEvl Polynomial evaluation (coeff. of x^n <> 1) * P1Evl Polynomial evaluation (coeff. of x^n = 1) ugamma Gamma Gamma function * LnGamma Logarithm of Gamma function * SgnGamma Sign of Gamma function * Stirling Stirling's formula for Gamma * StirLog Stirling's formula for LnGamma udigamma DiGamma DiGamma function * TriGamma TriGamma function uigamma IGamma Incomplete Gamma function * JGamma Complement of incomplete Gamma function * Erf Error function * Erfc Complement of error function ubeta Beta Beta function uibeta IBeta Incomplete Beta function ulambert LambertW Lambert's W-function ufact Fact Factorial ubinom Binomial Binomial coefficient * PBinom Probability of binomial distribution upoidist PPoisson Probability of Poisson distribution uexpdist DExpo Density of exponential distribution * FExpo Cumulative prob. of exponential dist. unormal DNorm Density of standard normal distribution ugamdist DBeta Density of Beta distribution * DGamma Density of Gamma distribution * DKhi2 Density of Khi-2 distribution * DStudent Density of Student's distribution * DSnedecor Density of Fisher-Snedecor distribution uibtdist FBeta Cumulative prob. of Beta distribution * FBinom Cumulative prob. of Binomial distribution * FStudent Cumulative prob. of Student's distribution * PStudent Prob(|t| > X) for Student's distribution * FSnedecor Cumulative prob. of Fisher-Snedecor distribution * PSnedecor Prob(F > X) for Fisher-Snedecor distribution uigmdist FGamma Cumulative prob. of Gamma distribution * FPoisson Cumulative prob. of Poisson distribution * FNorm Cumulative prob. of standard normal distribution * PNorm Prob(|U| > X) for standard normal distribution * FKhi2 Cumulative prob. of Khi-2 distribution * PKhi2 Prob(Khi2 > X) for Khi-2 distribution uinvnorm InvNorm Inverse of normal distribution uinvgam InvGamma Inverse of incomplete Gamma function * InvKhi2 Inverse of khi-2 distribution uinvbeta InvBeta Inverse of incomplete Beta function * InvStudent Inverse of Student's t-distribution * InvSnedecor Inverse of Snedecor's F-distribution ucompvec CompVec Comparison of two vectors ugausjor GaussJordan Linear equation system (Gauss-Jordan method) ulineq LinEq Linear equation system (Gauss-Jordan method) ucholesk Cholesky Cholesky factorization ulu LU_Decomp LU decomposition * LU_Solve Solves a system of equations after LU decomposition uqr QR_Decomp QR decomposition * QR_Solve Solves a system of equations after QR decomposition usvd SV_Decomp Singular value decomposition * SV_Solve Solves a system of equations after SV decomposition * SV_SetZero Sets the lowest singular values to zero * SV_Approx Approximates a matrix from its SV decomposition ubalance Balance Balances a matrix and tries to isolate eigenvalues ubalbak BalBak Back transformation of eigenvectors uelmhes ElmHes Reduction of a square matrix to upper Hessenberg form ueltran Eltran Save transformations used by ElmHes uhqr Hqr Eigenvalues of a real upper Hessenberg matrix by the QR method uhqr2 Hqr2 Eigenvalues and eigenvectors of a real upper Hessenberg matrix ueigval EigenVals Eigenvalues of a general square matrix ueigvec EigenVect Eigenvalues and eigenvectors of a general square matrix ujacobi Jacobi Eigenvalues and eigenvectors of a symmetric matrix uminbrak MinBrack Brackets a minimum of a function ugoldsrc GoldSearch Minimization of a function of 1 variable (Golden Search method) ulinmin LinMin Minimization of a function of several variables along a line unewton Newton Minimization of a function of several var. (Newton's method) * SaveNewton Save Newton iterations in a file umarq Marquardt Minimization of a function of several var. (Marquardt's method) * SaveMarquardt Save Marquardt iterations in a file ubfgs BFGS Minimization of a function of several var. (BFGS method) * SaveBFGS Save BFGS iterations in a file usimplex Simplex Minimization of a function of several var. (simplex method) * SaveSimplex Save simplex iterations in a file ulinminq LinMinEq Minimization of a sum of squared functions along a line ubisect RootBrack Brackets solution of equation * Bisect Nonlinear equation (bisection method) unewteq NewtEq Nonlinear equation (Newton-Raphson method) usecant Secant Nonlinear equation (secant method) unewteqs NewtEqs Nonlinear equation system (Newton-Raphson method) ubroyden Broyden Nonlinear equation system (Broyden's method) upolynom Poly Evaluates a polynomial * RFrac Evaluates a rational fraction urtpol1 RootPol1 Root of linear equation urtpol2 RootPol2 Roots of quadratic equation urtpol3 RootPol3 Roots of cubic equation urtpol4 RootPol4 Roots of quartic equation urootpol RootPol Roots of polynomial from companion matrix upolutil SetRealRoots Set the imaginary part of a root to zero * SortRoots Sorts the roots of a polynomial utrapint TrapInt Integration by trapezoidal rule ugausleg GausLeg Gauss-Legendre integration * GausLeg0 Gauss-Legendre integration (lower bound=0) * Convol Convolution product urkf RKF45 Integration of a system of differential equations ufft FFT Fast Fourier Transform * IFFT Inverse Fast Fourier Transform * FFT_Integer Fast Fourier Transform for integer data * FFT_Integer_Cleanup Clear memory after a call to FFT_Integer * CalcFrequency Direct computation of Fourier Transform urandom SetRNG Select random number generator * InitGen Initialize random number generator * IRanGen 32-bit random integer in [-2^31 .. 2^31 - 1] * IRanGen31 31-bit random integer in [0 .. 2^31 - 1] * RanGen1 32-bit random real in [0,1] * RanGen2 32-bit random real in [0,1) * RanGen3 32-bit random real in (0,1) * RanGen53 53-bit random real in [0,1) uranmwc InitMWC Initialize Multiply-With-Carry generator * IRanMWC 32-bit random integer from MWC generator uranmt InitMT Initialize Mersenne Twister generator with a seed * InitMTbyArray Initialize MT generator with an array * IRanMT 32-bit random integer from MT generator uranuvag InitUVAG Initialize UVAG generator with a seed * InitUVAGbyString Initialize UVAG generator with a string * IRanUVAG 32-bit random integer from UVAG generator urangaus RanGaussStd Random number from standard normal distribution * RanGauss Random number from normal distribution uranmult RanMult Random vector from multinormal distrib. (correlated) * RanMultIndep Random vector from multinormal distrib. (uncorrelated) umcmc InitMHParams Initialize Metropolis-Hastings parameters * GetMHParams Returns Metropolis-Hastings parameters * Hastings Simulation of a p.d.f. by Metropolis-Hastings usimann InitSAParams Initialize Simulated Annealing parameters * SA_CreateLogFile Initialize log file for Simulated Annealing * SimAnn Minimization of a function of several var. by Simulated Annealing ugenalg InitGAParams Initialize Genetic Algorithm parameters * GA_CreateLogFile Initialize log file for Genetic Algorithm * GenAlg Minimization of a function of several var. by Genetic Algorithm umeansd Mean Sample mean * StDev Standard deviation estimated from sample * StDevP Standard deviation of population ucorrel Correl Correlation coefficient umedian Median Sample median uskew Skewness Sample skewness * Kurtosis Sample kurtosis uqsort QSort Quick sort (ascending order) * DQSort Quick sort (descending order) uinterv Interval Determines an interval for a set of values ustudind StudIndep Student t-test for independent samples ustdpair StudPaired Student t-test for paired samples uanova1 AnOVa1 One-way analysis of variance uanova2 AnOVa2 Two-way analysis of variance usnedeco Snedecor Comparison of two variances ubartlet Bartlett Comparison of several variances ukhi2 Khi2_Conform Khi-2 test for conformity * Khi2_Indep Khi-2 test for independence uwoolf Woolf_Conform Woolf's test for conformity * Woolf_Indep Woolf's test for independence unonpar Mann_Whitney Mann-Whitney test * Wilcoxon Wilcoxon test * Kruskal_Wallis Kruskal-Wallis test udistrib DimStatClassVector Allocates an array of statistical classes * DelStatClassVector Deallocates an array of statistical classes * Distrib Distributes an array into statistical classes ulinfit LinFit Linear regression * WLinFit Weighted linear regression upolfit PolFit Polynomial regression * WPolFit Weighted polynomial regression umulfit MulFit Multiple regression (Gauss-Jordan method) * WMulFit Weighted multiple regression (Gauss-Jordan method) usvdfit SVDFit Multiple regression (SVD method) * WSVDFit Weighted multiple regression (SVD method) unlfit SetOptAlgo Selects optimization algorithm for nonlinear regression * SetMaxParam Sets the maximal number of regression parameters * SetParamBounds Sets the bounds on a regression parameter * SetMCFile Set file for saving MCMC simulations * NLFit Nonlinear regression * WNLFit Weighted nonlinear regression * SimFit Simulation of unweighted nonlinear regression by MCMC * WSimFit Simulation of weighted nonlinear regression by MCMC uregtest RegTest Test of unweighted regression * WRegTest Test of weighted regression upca VecMean Computes mean vector } * VecSD Computes vector of standard deviations } * MatVarCov Computes variance-covariance matrix } * MatCorrel Computes correlation matrix } * PCA Principal component analysis of correlation matrix } * ScaleVar Scales a set of variables } * PrinFac Computes principal factors } ustrings LTrim Remove leading blanks * RTrim Remove trailing blanks * Trim Remove leading and trailing blanks * StrChar Generate string by repeating a character * RFill Complete string with trailing blanks * LFill Complete string with leading blanks * CFill Center string * Replace Replace a character * Extract Extract field from string * Parse Parse string into several fields * SetFormat Set numeric format * FloatStr Convert real number to string * IntStr Convert integer to string * CompStr Convert complex number to string uplot InitGraphics Initializes the graphic * SetWindow Sets the graphic window * AutoScale Automatic scale determination * SetOxScale Sets the scale on the Ox axis * SetOyScale Sets the scale on the Oy axis * SetGraphTitle Sets the graph title * SetOxTitle Sets the title for the Ox axis * SetOyTitle Sets the title for the Oy axis * SetTitleFont Sets the font for the main graph title * SetOxFont Sets the font for the Ox axis * SetOyFont Sets the font for the Oy axis * SetLgdFont Sets the font for the legends * PlotOxAxis Plots the Ox axis * PlotOyAxis Plots the Oy axis * WriteGraphTitle Writes title of graph * PlotGrid Plots a grid on the graph * SetClipping Limits the graphic to the current viewport * SetMaxCurv Sets maximum number of curves * SetPointParam Sets point parameters * SetLineParam Sets line parameters * SetCurvLegend Sets curve legend * SetCurvStep Sets curve step * PlotPoint Plots a point * PlotCurve Plots a curve * PlotCurveWithErrorBars Plots a curve with error bars * PlotFunc Plots a function * WriteLegend Writes the legends for the plotted curves * ConRec Contour plot * Xpixel Converts user abscissa X to screen coordinate * Ypixel Converts user ordinate Y to screen coordinate * Xuser Converts screen coordinate X to user abscissa * Yuser Converts screen coordinate Y to user ordinate * LeaveGraphics Quits the graphic mode mricron-0.20120505.1~dfsg.1.orig/fpmath/dll/0000775000175000017500000000000011660470014017701 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/dll/tpmath.pas0000664000175000017500000012630411326434464021721 0ustar michaelmichael{ ****************************************************************** Unit TPMATH - Interface for TPMATH.DLL ****************************************************************** } unit tpmath; interface { ------------------------------------------------------------------ Types and constants ------------------------------------------------------------------ } {$i types.inc} { ------------------------------------------------------------------ Error handling ------------------------------------------------------------------ } procedure SetErrCode(ErrCode : Integer); external 'tpmath'; { Sets the error code } function DefaultVal(ErrCode : Integer; DefVal : Float) : Float; external 'tpmath'; { Sets error code and default function value } function MathErr : Integer; external 'tpmath'; { Returns the error code } { ------------------------------------------------------------------ Dynamic arrays ------------------------------------------------------------------ } procedure SetAutoInit(AutoInit : Boolean); external 'tpmath'; { Sets the auto-initialization of arrays } procedure DimVector(var V : PVector; Ub : Integer); external 'tpmath'; { Creates floating point vector V[0..Ub] } procedure DimIntVector(var V : PIntVector; Ub : Integer); external 'tpmath'; { Creates integer vector V[0..Ub] } procedure DimCompVector(var V : PCompVector; Ub : Integer); external 'tpmath'; { Creates complex vector V[0..Ub] } procedure DimBoolVector(var V : PBoolVector; Ub : Integer); external 'tpmath'; { Creates boolean vector V[0..Ub] } procedure DimStrVector(var V : PStrVector; Ub : Integer); external 'tpmath'; { Creates string vector V[0..Ub] } procedure DimMatrix(var A : PMatrix; Ub1, Ub2 : Integer); external 'tpmath'; { Creates floating point matrix A[0..Ub1, 0..Ub2] } procedure DimIntMatrix(var A : PIntMatrix; Ub1, Ub2 : Integer); external 'tpmath'; { Creates integer matrix A[0..Ub1, 0..Ub2] } procedure DimCompMatrix(var A : PCompMatrix; Ub1, Ub2 : Integer); external 'tpmath'; { Creates complex matrix A[0..Ub1, 0..Ub2] } procedure DimBoolMatrix(var A : PBoolMatrix; Ub1, Ub2 : Integer); external 'tpmath'; { Creates boolean matrix A[0..Ub1, 0..Ub2] } procedure DimStrMatrix(var A : PStrMatrix; Ub1, Ub2 : Integer); external 'tpmath'; { Creates string matrix A[0..Ub1, 0..Ub2] } procedure DelVector(var V : PVector; Ub : Integer); external 'tpmath'; { Deletes floating point vector V[0..Ub] } procedure DelIntVector(var V : PIntVector; Ub : Integer); external 'tpmath'; { Deletes integer vector V[0..Ub] } procedure DelCompVector(var V : PCompVector; Ub : Integer); external 'tpmath'; { Deletes complex vector V[0..Ub] } procedure DelBoolVector(var V : PBoolVector; Ub : Integer); external 'tpmath'; { Deletes boolean vector V[0..Ub] } procedure DelStrVector(var V : PStrVector; Ub : Integer); external 'tpmath'; { Deletes string vector V[0..Ub] } procedure DelMatrix(var A : PMatrix; Ub1, Ub2 : Integer); external 'tpmath'; { Deletes floating point matrix A[0..Ub1, 0..Ub2] } procedure DelIntMatrix(var A : PIntMatrix; Ub1, Ub2 : Integer); external 'tpmath'; { Deletes integer matrix A[0..Ub1, 0..Ub2] } procedure DelCompMatrix(var A : PCompMatrix; Ub1, Ub2 : Integer); external 'tpmath'; { Deletes complex matrix A[0..Ub1, 0..Ub2] } procedure DelBoolMatrix(var A : PBoolMatrix; Ub1, Ub2 : Integer); external 'tpmath'; { Deletes boolean matrix A[0..Ub1, 0..Ub2] } procedure DelStrMatrix(var A : PStrMatrix; Ub1, Ub2 : Integer); external 'tpmath'; { Deletes string matrix A[0..Ub1, 0..Ub2] } { ------------------------------------------------------------------ Minimum, maximum, sign and exchange ------------------------------------------------------------------ } function FMin(X, Y : Float) : Float; external 'tpmath'; { Minimum of 2 reals } function FMax(X, Y : Float) : Float; external 'tpmath'; { Maximum of 2 reals } function IMin(X, Y : Integer) : Integer; external 'tpmath'; { Minimum of 2 integers } function IMax(X, Y : Integer) : Integer; external 'tpmath'; { Maximum of 2 integers } function Sgn(X : Float) : Integer; external 'tpmath'; { Sign (returns 1 if X = 0) } function Sgn0(X : Float) : Integer; external 'tpmath'; { Sign (returns 0 if X = 0) } function DSgn(A, B : Float) : Float; external 'tpmath'; { Sgn(B) * |A| } procedure FSwap(var X, Y : Float); external 'tpmath'; { Exchange 2 reals } procedure ISwap(var X, Y : Integer); external 'tpmath'; { Exchange 2 integers } { ------------------------------------------------------------------ Rounding functions ------------------------------------------------------------------ } function RoundN(X : Float; N : Integer) : Float; external 'tpmath'; { Rounds X to N decimal places } function Ceil(X : Float) : Integer; external 'tpmath'; { Ceiling function } function Floor(X : Float) : Integer; external 'tpmath'; { Floor function } { ------------------------------------------------------------------ Logarithms, exponentials and power ------------------------------------------------------------------ } function Expo(X : Float) : Float; external 'tpmath'; { Exponential } function Exp2(X : Float) : Float; external 'tpmath'; { 2^X } function Exp10(X : Float) : Float; external 'tpmath'; { 10^X } function Log(X : Float) : Float; external 'tpmath'; { Natural log } function Log2(X : Float) : Float; external 'tpmath'; { Log, base 2 } function Log10(X : Float) : Float; external 'tpmath'; { Decimal log } function LogA(X, A : Float) : Float; external 'tpmath'; { Log, base A } function IntPower(X : Float; N : Integer) : Float; external 'tpmath'; { X^N } function Power(X, Y : Float) : Float; external 'tpmath'; { X^Y, X >= 0 } { ------------------------------------------------------------------ Trigonometric functions ------------------------------------------------------------------ } function Pythag(X, Y : Float) : Float; external 'tpmath'; { Sqrt(X^2 + Y^2) } function FixAngle(Theta : Float) : Float; external 'tpmath'; { Set Theta in -Pi..Pi } function Tan(X : Float) : Float; external 'tpmath'; { Tangent } function ArcSin(X : Float) : Float; external 'tpmath'; { Arc sinus } function ArcCos(X : Float) : Float; external 'tpmath'; { Arc cosinus } function ArcTan2(Y, X : Float) : Float; external 'tpmath'; { Angle (Ox, OM) with M(X,Y) } { ------------------------------------------------------------------ Hyperbolic functions ------------------------------------------------------------------ } function Sinh(X : Float) : Float; external 'tpmath'; { Hyperbolic sine } function Cosh(X : Float) : Float; external 'tpmath'; { Hyperbolic cosine } function Tanh(X : Float) : Float; external 'tpmath'; { Hyperbolic tangent } function ArcSinh(X : Float) : Float; external 'tpmath'; { Inverse hyperbolic sine } function ArcCosh(X : Float) : Float; external 'tpmath'; { Inverse hyperbolic cosine } function ArcTanh(X : Float) : Float; external 'tpmath'; { Inverse hyperbolic tangent } procedure SinhCosh(X : Float; var SinhX, CoshX : Float); external 'tpmath'; { Sinh & Cosh } { ------------------------------------------------------------------ Gamma function and related functions ------------------------------------------------------------------ } function Fact(N : Integer) : Float; external 'tpmath'; { Factorial } function SgnGamma(X : Float) : Integer; external 'tpmath'; { Sign of Gamma function } function Gamma(X : Float) : Float; external 'tpmath'; { Gamma function } function LnGamma(X : Float) : Float; external 'tpmath'; { Logarithm of Gamma function } function Stirling(X : Float) : Float; external 'tpmath'; { Stirling's formula for the Gamma function } function StirLog(X : Float) : Float; external 'tpmath'; { Approximate Ln(Gamma) by Stirling's formula, for X >= 13 } function DiGamma(X : Float ) : Float; external 'tpmath'; { Digamma function } function TriGamma(X : Float ) : Float; external 'tpmath'; { Trigamma function } function IGamma(A, X : Float) : Float; external 'tpmath'; { Incomplete Gamma function} function JGamma(A, X : Float) : Float; external 'tpmath'; { Complement of incomplete Gamma function } function InvGamma(A, P : Float) : Float; external 'tpmath'; { Inverse of incomplete Gamma function } function Erf(X : Float) : Float; external 'tpmath'; { Error function } function Erfc(X : Float) : Float; external 'tpmath'; { Complement of error function } { ------------------------------------------------------------------ Beta function and related functions ------------------------------------------------------------------ } function Beta(X, Y : Float) : Float; external 'tpmath'; { Beta function } function IBeta(A, B, X : Float) : Float; external 'tpmath'; { Incomplete Beta function } function InvBeta(A, B, Y : Float) : Float; external 'tpmath'; { Inverse of incomplete Beta function } { ------------------------------------------------------------------ Lambert's function ------------------------------------------------------------------ } function LambertW(X : Float; UBranch, Offset : Boolean) : Float; external 'tpmath'; { ------------------------------------------------------------------ Binomial distribution ------------------------------------------------------------------ } function Binomial(N, K : Integer) : Float; external 'tpmath'; { Binomial coefficient C(N,K) } function PBinom(N : Integer; P : Float; K : Integer) : Float; external 'tpmath'; { Probability of binomial distribution } function FBinom(N : Integer; P : Float; K : Integer) : Float; external 'tpmath'; { Cumulative probability for binomial distrib. } { ------------------------------------------------------------------ Poisson distribution ------------------------------------------------------------------ } function PPoisson(Mu : Float; K : Integer) : Float; external 'tpmath'; { Probability of Poisson distribution } function FPoisson(Mu : Float; K : Integer) : Float; external 'tpmath'; { Cumulative probability for Poisson distrib. } { ------------------------------------------------------------------ Exponential distribution ------------------------------------------------------------------ } function DExpo(A, X : Float) : Float; external 'tpmath'; { Density of exponential distribution with parameter A } function FExpo(A, X : Float) : Float; external 'tpmath'; { Cumulative probability function for exponential dist. with parameter A } { ------------------------------------------------------------------ Standard normal distribution ------------------------------------------------------------------ } function DNorm(X : Float) : Float; external 'tpmath'; { Density of standard normal distribution } function FNorm(X : Float) : Float; external 'tpmath'; { Cumulative probability for standard normal distrib. } function PNorm(X : Float) : Float; external 'tpmath'; { Prob(|U| > X) for standard normal distrib. } function InvNorm(P : Float) : Float; external 'tpmath'; { Inverse of standard normal distribution } { ------------------------------------------------------------------ Student's distribution ------------------------------------------------------------------ } function DStudent(Nu : Integer; X : Float) : Float; external 'tpmath'; { Density of Student distribution with Nu d.o.f. } function FStudent(Nu : Integer; X : Float) : Float; external 'tpmath'; { Cumulative probability for Student distrib. with Nu d.o.f. } function PStudent(Nu : Integer; X : Float) : Float; external 'tpmath'; { Prob(|t| > X) for Student distrib. with Nu d.o.f. } function InvStudent(Nu : Integer; P : Float) : Float; external 'tpmath'; { Inverse of Student's t-distribution function } { ------------------------------------------------------------------ Khi-2 distribution ------------------------------------------------------------------ } function DKhi2(Nu : Integer; X : Float) : Float; external 'tpmath'; { Density of Khi-2 distribution with Nu d.o.f. } function FKhi2(Nu : Integer; X : Float) : Float; external 'tpmath'; { Cumulative prob. for Khi-2 distrib. with Nu d.o.f. } function PKhi2(Nu : Integer; X : Float) : Float; external 'tpmath'; { Prob(Khi2 > X) for Khi-2 distrib. with Nu d.o.f. } function InvKhi2(Nu : Integer; P : Float) : Float; external 'tpmath'; { Inverse of Khi-2 distribution function } { ------------------------------------------------------------------ Fisher-Snedecor distribution ------------------------------------------------------------------ } function DSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; external 'tpmath'; { Density of Fisher-Snedecor distribution with Nu1 and Nu2 d.o.f. } function FSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; external 'tpmath'; { Cumulative prob. for Fisher-Snedecor distrib. with Nu1 and Nu2 d.o.f. } function PSnedecor(Nu1, Nu2 : Integer; X : Float) : Float; external 'tpmath'; { Prob(F > X) for Fisher-Snedecor distrib. with Nu1 and Nu2 d.o.f. } function InvSnedecor(Nu1, Nu2 : Integer; P : Float) : Float; external 'tpmath'; { Inverse of Snedecor's F-distribution function } { ------------------------------------------------------------------ Beta distribution ------------------------------------------------------------------ } function DBeta(A, B, X : Float) : Float; external 'tpmath'; { Density of Beta distribution with parameters A and B } function FBeta(A, B, X : Float) : Float; external 'tpmath'; { Cumulative probability for Beta distrib. with param. A and B } { ------------------------------------------------------------------ Gamma distribution ------------------------------------------------------------------ } function DGamma(A, B, X : Float) : Float; external 'tpmath'; { Density of Gamma distribution with parameters A and B } function FGamma(A, B, X : Float) : Float; external 'tpmath'; { Cumulative probability for Gamma distrib. with param. A and B } { ------------------------------------------------------------------ Matrices and linear equations ------------------------------------------------------------------ } procedure GaussJordan(A : PMatrix; Lb, Ub1, Ub2 : Integer; var Det : Float); external 'tpmath'; { Transforms a matrix according to the Gauss-Jordan method } procedure LinEq(A : PMatrix; B : PVector; Lb, Ub : Integer; var Det : Float); external 'tpmath'; { Solves a linear system according to the Gauss-Jordan method } procedure Cholesky(A, L : PMatrix; Lb, Ub : Integer); external 'tpmath'; { Cholesky factorization of a positive definite symmetric matrix } procedure LU_Decomp(A : PMatrix; Lb, Ub : Integer); external 'tpmath'; { LU decomposition } procedure LU_Solve(A : PMatrix; B : PVector; Lb, Ub : Integer; X : PVector); external 'tpmath'; { Solution of linear system from LU decomposition } procedure QR_Decomp(A : PMatrix; Lb, Ub1, Ub2 : Integer; R : PMatrix); external 'tpmath'; { QR decomposition } procedure QR_Solve(Q, R : PMatrix; B : PVector; Lb, Ub1, Ub2 : Integer; X : PVector); external 'tpmath'; { Solution of linear system from QR decomposition } procedure SV_Decomp(A : PMatrix; Lb, Ub1, Ub2 : Integer; S : PVector; V : PMatrix); external 'tpmath'; { Singular value decomposition } procedure SV_SetZero(S : PVector; Lb, Ub : Integer; Tol : Float); external 'tpmath'; { Set lowest singular values to zero } procedure SV_Solve(U : PMatrix; S : PVector; V : PMatrix; B : PVector; Lb, Ub1, Ub2 : Integer; X : PVector); external 'tpmath'; { Solution of linear system from SVD } procedure SV_Approx(U : PMatrix; S : PVector; V : PMatrix; Lb, Ub1, Ub2 : Integer; A : PMatrix); external 'tpmath'; { Matrix approximation from SVD } procedure EigenVals(A : PMatrix; Lb, Ub : Integer; Lambda : PCompVector); external 'tpmath'; { Eigenvalues of a general square matrix } procedure EigenVect(A : PMatrix; Lb, Ub : Integer; Lambda : PCompVector; V : PMatrix); external 'tpmath'; { Eigenvalues and eigenvectors of a general square matrix } procedure Jacobi(A : PMatrix; Lb, Ub, MaxIter : Integer; Tol : Float; Lambda : PVector; V : PMatrix); external 'tpmath'; { Eigenvalues and eigenvectors of a symmetric matrix } { ------------------------------------------------------------------ Optimization ------------------------------------------------------------------ } procedure MinBrack(Func : TFunc; var A, B, C, Fa, Fb, Fc : Float); external 'tpmath'; { Brackets a minimum of a function } procedure GoldSearch(Func : TFunc; A, B : Float; MaxIter : Integer; Tol : Float; var Xmin, Ymin : Float); external 'tpmath'; { Minimization of a function of one variable (golden search) } procedure LinMin(Func : TFuncNVar; X, DeltaX : PVector; Lb, Ub : Integer; var R : Float; MaxIter : Integer; Tol : Float; var F_min : Float); external 'tpmath'; { Minimization of a function of several variables along a line } procedure Newton(Func : TFuncNVar; HessGrad : THessGrad; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; G : PVector; H_inv : PMatrix; var Det : Float); external 'tpmath'; { Minimization of a function of several variables (Newton's method) } procedure SaveNewton(FileName : string); external 'tpmath'; { Save Newton iterations in a file } procedure Marquardt(Func : TFuncNVar; HessGrad : THessGrad; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; G : PVector; H_inv : PMatrix; var Det : Float); external 'tpmath'; { Minimization of a function of several variables (Marquardt's method) } procedure SaveMarquardt(FileName : string); external 'tpmath'; { Save Marquardt iterations in a file } procedure BFGS(Func : TFuncNVar; Gradient : TGradient; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float; G : PVector; H_inv : PMatrix); external 'tpmath'; { Minimization of a function of several variables (BFGS method) } procedure SaveBFGS(FileName : string); external 'tpmath'; { Save BFGS iterations in a file } procedure Simplex(Func : TFuncNVar; X : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; var F_min : Float); external 'tpmath'; { Minimization of a function of several variables (Simplex) } procedure SaveSimplex(FileName : string); external 'tpmath'; { Save Simplex iterations in a file } { ------------------------------------------------------------------ Nonlinear equations ------------------------------------------------------------------ } procedure RootBrack(Func : TFunc; var X, Y, FX, FY : Float); external 'tpmath'; { Brackets a root of function Func between X and Y } procedure Bisect(Func : TFunc; var X, Y : Float; MaxIter : Integer; Tol : Float; var F : Float); external 'tpmath'; { Bisection method } procedure Secant(Func : TFunc; var X, Y : Float; MaxIter : Integer; Tol : Float; var F : Float); external 'tpmath'; { Secant method } procedure NewtEq(Func, Deriv : TFunc; var X : Float; MaxIter : Integer; Tol : Float; var F : Float); external 'tpmath'; { Newton-Raphson method for a single nonlinear equation } procedure NewtEqs(Equations : TEquations; Jacobian : TJacobian; X, F : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float); external 'tpmath'; { Newton-Raphson method for a system of nonlinear equations } procedure Broyden(Equations : TEquations; X, F : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float); external 'tpmath'; { Broyden's method for a system of nonlinear equations } { ------------------------------------------------------------------ Polynomials and rational fractions ------------------------------------------------------------------ } function Poly(X : Float; Coef : PVector; Deg : Integer) : Float; external 'tpmath'; { Evaluates a polynomial } function RFrac(X : Float; Coef : PVector; Deg1, Deg2 : Integer) : Float; external 'tpmath'; { Evaluates a rational fraction } function RootPol1(A, B : Float; var X : Float) : Integer; external 'tpmath'; { Solves the linear equation A + B * X = 0 } function RootPol2(Coef : PVector; Z : PCompVector) : Integer; external 'tpmath'; { Solves a quadratic equation } function RootPol3(Coef : PVector; Z : PCompVector) : Integer; external 'tpmath'; { Solves a cubic equation } function RootPol4(Coef : PVector; Z : PCompVector) : Integer; external 'tpmath'; { Solves a quartic equation } function RootPol(Coef : PVector; Deg : Integer; Z : PCompVector) : Integer; external 'tpmath'; { Solves a polynomial equation } function SetRealRoots(Deg : Integer; Z : PCompVector; Tol : Float) : Integer; external 'tpmath'; { Set the imaginary part of a root to zero } procedure SortRoots(Deg : Integer; Z : PCompVector); external 'tpmath'; { Sorts the roots of a polynomial } { ------------------------------------------------------------------ Numerical integration and differential equations ------------------------------------------------------------------ } function TrapInt(X, Y : PVector; N : Integer) : Float; external 'tpmath'; { Integration by trapezoidal rule } function GausLeg(Func : TFunc; A, B : Float) : Float; external 'tpmath'; { Integral from A to B } function GausLeg0(Func : TFunc; B : Float) : Float; external 'tpmath'; { Integral from 0 to B } function Convol(Func1, Func2 : TFunc; T : Float) : Float; external 'tpmath'; { Convolution product at time T } procedure RKF45(F : TDiffEqs; Neqn : Integer; Y, Yp : PVector; var T : Float; Tout, RelErr, AbsErr : Float; var Flag : Integer); external 'tpmath'; { Integration of a system of differential equations } { ------------------------------------------------------------------ Fast Fourier Transform ------------------------------------------------------------------ } procedure FFT(NumSamples : LongInt; InArray, OutArray : PCompVector); external 'tpmath'; { Fast Fourier Transform } procedure IFFT(NumSamples : LongInt; InArray, OutArray : PCompVector); external 'tpmath'; { Inverse Fast Fourier Transform } procedure FFT_Integer(NumSamples : LongInt; RealIn, ImagIn : PIntVector; OutArray : PCompVector); external 'tpmath'; { Fast Fourier Transform for integer data } procedure FFT_Integer_Cleanup; external 'tpmath'; { Clear memory after a call to FFT_Integer } procedure CalcFrequency(NumSamples, FrequencyIndex : LongInt; InArray : PCompVector; var FFT : Complex); external 'tpmath'; { Direct computation of Fourier transform } { ------------------------------------------------------------------ Random numbers ------------------------------------------------------------------ } procedure SetRNG(RNG : RNG_Type); external 'tpmath'; { Select generator } procedure InitGen(Seed : LongInt); external 'tpmath'; { Initialize generator } function IRanGen : LongInt; external 'tpmath'; { 32-bit random integer in [-2^31 .. 2^31 - 1] } function IRanGen31 : LongInt; external 'tpmath'; { 31-bit random integer in [0 .. 2^31 - 1] } function RanGen1 : Float; external 'tpmath'; { 32-bit random real in [0,1] } function RanGen2 : Float; external 'tpmath'; { 32-bit random real in [0,1) } function RanGen3 : Float; external 'tpmath'; { 32-bit random real in (0,1) } function RanGen53 : Float; external 'tpmath'; { 53-bit random real in [0,1) } procedure InitMWC(Seed : LongInt); external 'tpmath'; { Initializes the 'Multiply with carry' random number generator } function IRanMWC : LongInt; external 'tpmath'; { Returns a 32 bit random number in [-2^31 ; 2^31-1] } procedure InitMT(Seed : LongInt); external 'tpmath'; { Initializes Mersenne Twister generator with a seed } procedure InitMTbyArray(InitKey : array of LongInt; KeyLength : Word); external 'tpmath'; { Initialize MT generator with an array InitKey[0..(KeyLength - 1)] } function IRanMT : LongInt; external 'tpmath'; { Random integer from MT generator } procedure InitUVAGbyString(KeyPhrase : string); external 'tpmath'; { Initializes the UVAG generator with a string } procedure InitUVAG(Seed : LongInt); external 'tpmath'; { Initializes the UVAG generator with an integer } function IRanUVAG : LongInt; external 'tpmath'; { Random integer from UVAG generator } function RanGaussStd : Float; external 'tpmath'; { Random number from standard normal distribution } function RanGauss(Mu, Sigma : Float) : Float; external 'tpmath'; { Random number from normal distrib. with mean Mu and S. D. Sigma } procedure RanMult(M : PVector; L : PMatrix; Lb, Ub : Integer; X : PVector); external 'tpmath'; { Random vector from multinormal distribution (correlated) } procedure RanMultIndep(M, S : PVector; Lb, Ub : Integer; X : PVector); external 'tpmath'; { Random vector from multinormal distribution (uncorrelated) } procedure InitMHParams(NCycles, MaxSim, SavedSim : Integer); external 'tpmath'; { Initializes Metropolis-Hastings parameters } procedure GetMHParams(var NCycles, MaxSim, SavedSim : Integer); external 'tpmath'; { Returns Metropolis-Hastings parameters } procedure Hastings(Func : TFuncNVar; T : Float; X : PVector; V : PMatrix; Lb, Ub : Integer; Xmat : PMatrix; X_min : PVector; var F_min : Float); external 'tpmath'; { Simulation of a probability density function by Metropolis-Hastings } procedure InitSAParams(NT, NS, NCycles : Integer; RT : Float); external 'tpmath'; { Initializes Simulated Annealing parameters } procedure SA_CreateLogFile(FileName : String); external 'tpmath'; { Initializes log file } procedure SimAnn(Func : TFuncNVar; X, Xmin, Xmax : PVector; Lb, Ub : Integer; var F_min : Float); external 'tpmath'; { Minimization of a function of several var. by simulated annealing } procedure InitGAParams(NP, NG : Integer; SR, MR, HR : Float); external 'tpmath'; { Initializes Genetic Algorithm parameters } procedure GA_CreateLogFile(FileName : String); external 'tpmath'; { Initializes log file } procedure GenAlg(Func : TFuncNVar; X, Xmin, Xmax : PVector; Lb, Ub : Integer; var F_min : Float); external 'tpmath'; { Minimization of a function of several var. by genetic algorithm } { ------------------------------------------------------------------ Statistics ------------------------------------------------------------------ } function Mean(X : PVector; Lb, Ub : Integer) : Float; external 'tpmath'; { Mean of sample X } function Median(X : PVector; Lb, Ub : Integer; Sorted : Boolean) : Float; external 'tpmath'; { Median of sample X } function StDev(X : PVector; Lb, Ub : Integer; M : Float) : Float; external 'tpmath'; { Standard deviation estimated from sample X } function StDevP(X : PVector; Lb, Ub : Integer; M : Float) : Float; external 'tpmath'; { Standard deviation of population } function Correl(X, Y : PVector; Lb, Ub : Integer) : Float; external 'tpmath'; { Correlation coefficient } function Skewness(X : PVector; Lb, Ub : Integer; M, Sigma : Float) : Float; external 'tpmath'; { Skewness of sample X } function Kurtosis(X : PVector; Lb, Ub : Integer; M, Sigma : Float) : Float; external 'tpmath'; { Kurtosis of sample X } procedure QSort(X : PVector; Lb, Ub : Integer); external 'tpmath'; { Quick sort (ascending order) } procedure DQSort(X : PVector; Lb, Ub : Integer); external 'tpmath'; { Quick sort (descending order) } procedure Interval(X1, X2 : Float; MinDiv, MaxDiv : Integer; var Min, Max, Step : Float); external 'tpmath'; { Determines an interval for a set of values } procedure StudIndep(N1, N2 : Integer; M1, M2, S1, S2 : Float; var T : Float; var DoF : Integer); external 'tpmath'; { Student t-test for independent samples } procedure StudPaired(X, Y : PVector; Lb, Ub : Integer; var T : Float; var DoF : Integer); external 'tpmath'; { Student t-test for paired samples } procedure AnOVa1(Ns : Integer; N : PIntVector; M, S : PVector; var V_f, V_r, F : Float; var DoF_f, DoF_r : Integer); external 'tpmath'; { One-way analysis of variance } procedure AnOVa2(NA, NB, Nobs : Integer; M, S : PMatrix; V, F : PVector; DoF : PIntVector); external 'tpmath'; { Two-way analysis of variance } procedure Snedecor(N1, N2 : Integer; S1, S2 : Float; var F : Float; var DoF1, DoF2 : Integer); external 'tpmath'; { Snedecor's F-test (comparison of two variances) } procedure Bartlett(Ns : Integer; N : PIntVector; S : PVector; var Khi2 : Float; var DoF : Integer); external 'tpmath'; { Bartlett's test (comparison of several variances) } procedure Mann_Whitney(N1, N2 : Integer; X1, X2 : PVector; var U, Eps : Float); external 'tpmath'; { Mann-Whitney test} procedure Wilcoxon(X, Y : PVector; Lb, Ub : Integer; var Ndiff : Integer; var T, Eps : Float); external 'tpmath'; { Wilcoxon test } procedure Kruskal_Wallis(Ns : Integer; N : PIntVector; X : PMatrix; var H : Float; var DoF : Integer); external 'tpmath'; { Kruskal-Wallis test } procedure Khi2_Conform(N_cls : Integer; N_estim : Integer; Obs : PIntVector; Calc : PVector; var Khi2 : Float; var DoF : Integer); external 'tpmath'; { Khi-2 test for conformity } procedure Khi2_Indep(N_lin : Integer; N_col : Integer; Obs : PIntMatrix; var Khi2 : Float; var DoF : Integer); external 'tpmath'; { Khi-2 test for independence } procedure Woolf_Conform(N_cls : Integer; N_estim : Integer; Obs : PIntVector; Calc : PVector; var G : Float; var DoF : Integer); external 'tpmath'; { Woolf's test for conformity } procedure Woolf_Indep(N_lin : Integer; N_col : Integer; Obs : PIntMatrix; var G : Float; var DoF : Integer); external 'tpmath'; { Woolf's test for independence } procedure DimStatClassVector(var C : PStatClassVector; Ub : Integer); external 'tpmath'; { Allocates an array of statistical classes: C[0..Ub] } procedure DelStatClassVector(var C : PStatClassVector; Ub : Integer); external 'tpmath'; { Deallocates an array of statistical classes: C[0..Ub] } procedure Distrib(X : PVector; Lb, Ub : Integer; A, B, H : Float; C : PStatClassVector); external 'tpmath'; { Distributes an array X[Lb..Ub] into statistical classes } { ------------------------------------------------------------------ Curve fit ------------------------------------------------------------------ } procedure LinFit(X, Y : PVector; Lb, Ub : Integer; B : PVector; V : PMatrix); external 'tpmath'; { Linear regression : Y = B(0) + B(1) * X } procedure WLinFit(X, Y, S : PVector; Lb, Ub : Integer; B : PVector; V : PMatrix); external 'tpmath'; { Weighted linear regression : Y = B(0) + B(1) * X } procedure PolFit(X, Y : PVector; Lb, Ub, Deg : Integer; B : PVector; V : PMatrix); external 'tpmath'; { Linear regression : Y = B(0) + B(1) * X + B(2) * XВ + ...} procedure WPolFit(X, Y, S : PVector; Lb, Ub, Deg : Integer; B : PVector; V : PMatrix); external 'tpmath'; { Weighted linear regression : Y = B(0) + B(1) * X + B(2) * XВ + ...} procedure MulFit(X : PMatrix; Y : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix); external 'tpmath'; { Multiple linear regression by Gauss-Jordan method } procedure WMulFit(X : PMatrix; Y, S : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; B : PVector; V : PMatrix); external 'tpmath'; { Weighted multiple linear regression by Gauss-Jordan method } procedure SVDFit(X : PMatrix; Y : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; SVDTol : Float; B : PVector; V : PMatrix); external 'tpmath'; { Multiple linear regression by SVD method } procedure WSVDFit(X : PMatrix; Y, S : PVector; Lb, Ub, Nvar : Integer; ConsTerm : Boolean; SVDTol : Float; B : PVector; V : PMatrix); external 'tpmath'; { Weighted multiple linear regression by SVD method } procedure SetOptAlgo(Algo : TOptAlgo); external 'tpmath'; { Sets the optimization algorithm for nonlinear regression } procedure SetMaxParam(N : Byte); external 'tpmath'; { Sets the maximum number of regression parameters for nonlinear regression } procedure SetParamBounds(I : Byte; ParamMin, ParamMax : Float); external 'tpmath'; { Sets the bounds on the I-th regression parameter } procedure NLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); external 'tpmath'; { Unweighted nonlinear regression } procedure WNLFit(RegFunc : TRegFunc; DerivProc : TDerivProc; X, Y, S : PVector; Lb, Ub : Integer; MaxIter : Integer; Tol : Float; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); external 'tpmath'; { Weighted nonlinear regression } procedure SetMCFile(FileName : String); external 'tpmath'; { Set file for saving MCMC simulations } procedure SimFit(RegFunc : TRegFunc; X, Y : PVector; Lb, Ub : Integer; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); external 'tpmath'; { Simulation of unweighted nonlinear regression by MCMC } procedure WSimFit(RegFunc : TRegFunc; X, Y, S : PVector; Lb, Ub : Integer; B : PVector; FirstPar, LastPar : Integer; V : PMatrix); external 'tpmath'; { Simulation of weighted nonlinear regression by MCMC } procedure RegTest(Y, Ycalc : PVector; LbY, UbY : Integer; V : PMatrix; LbV, UbV : Integer; var Test : TRegTest); external 'tpmath'; { Test of unweighted regression } procedure WRegTest(Y, Ycalc, S : PVector; LbY, UbY : Integer; V : PMatrix; LbV, UbV : Integer; var Test : TRegTest); external 'tpmath'; { Test of weighted regression } { ------------------------------------------------------------------ Principal component analysis ------------------------------------------------------------------ } procedure VecMean(X : PMatrix; Lb, Ub, Nvar : Integer; M : PVector); external 'tpmath'; { Computes the mean vector M from matrix X } procedure VecSD(X : PMatrix; Lb, Ub, Nvar : Integer; M, S : PVector); external 'tpmath'; { Computes the vector of standard deviations S from matrix X } procedure MatVarCov(X : PMatrix; Lb, Ub, Nvar : Integer; M : PVector; V : PMatrix); external 'tpmath'; { Computes the variance-covariance matrix V from matrix X } procedure MatCorrel(V : PMatrix; Nvar : Integer; R : PMatrix); external 'tpmath'; { Computes the correlation matrix R from the var-cov matrix V } procedure PCA(R : PMatrix; Nvar : Integer; MaxIter : Integer; Tol : Float; Lambda : PVector; C, Rc : PMatrix); external 'tpmath'; { Performs a principal component analysis of the correlation matrix R } procedure ScaleVar(X : PMatrix; Lb, Ub, Nvar : Integer; M, S : PVector; Z : PMatrix); external 'tpmath'; { Scales a set of variables by subtracting means and dividing by SD's } procedure PrinFac(Z : PMatrix; Lb, Ub, Nvar : Integer; C, F : PMatrix); external 'tpmath'; { Computes principal factors } { ------------------------------------------------------------------ Strings ------------------------------------------------------------------ } function LTrim(S : String) : String; external 'tpmath'; { Removes leading blanks } function RTrim(S : String) : String; external 'tpmath'; { Removes trailing blanks } function Trim(S : String) : String; external 'tpmath'; { Removes leading and trailing blanks } function StrChar(N : Byte; C : Char) : String; external 'tpmath'; { Returns a string made of character C repeated N times } function RFill(S : String; L : Byte) : String; external 'tpmath'; { Completes string S with trailing blanks for a total length L } function LFill(S : String; L : Byte) : String; external 'tpmath'; { Completes string S with leading blanks for a total length L } function CFill(S : String; L : Byte) : String; external 'tpmath'; { Centers string S on a total length L } function Replace(S : String; C1, C2 : Char) : String; external 'tpmath'; { Replaces in string S all the occurences of C1 by C2 } function Extract(S : String; var Index : Byte; Delim : Char) : String; external 'tpmath'; { Extracts a field from a string } procedure Parse(S : String; Delim : Char; Field : PStrVector; var N : Byte); external 'tpmath'; { Parses a string into its constitutive fields } procedure SetFormat(NumLength, MaxDec : Integer; FloatPoint, NSZero : Boolean); external 'tpmath'; { Sets the numeric format } function FloatStr(X : Float) : String; external 'tpmath'; { Converts a real to a string according to the numeric format } function IntStr(N : LongInt) : String; external 'tpmath'; { Converts an integer to a string } function CompStr(Z : Complex) : String; external 'tpmath'; { Converts a complex number to a string } implementation end. mricron-0.20120505.1~dfsg.1.orig/fpmath/dll/tpmath.dpr0000664000175000017500000004057310726475430021727 0ustar michaelmichaellibrary tpmath; uses utypes, uminmax, uround, umath, utrigo, uhyper, ugamma, udigamma, uigamma, ubeta, uibeta, ulambert, ufact, ubinom, upoidist, uexpdist, unormal, ugamdist, uibtdist, uigmdist, uinvnorm, uinvgam, uinvbeta, ugausjor, ulineq, ucholesk, ulu, uqr, usvd, ueigval, ueigvec, ujacobi, uminbrak, ugoldsrc, ulinmin, unewton, umarq, ubfgs, usimplex, ubisect, unewteq, usecant, unewteqs, ubroyden, upolynom, urtpol1, urtpol2, urtpol3, urtpol4, urootpol, upolutil, utrapint, ugausleg, urkf, ufft, urandom, uranmwc, uranmt, uranuvag, urangaus, uranmult, umcmc, usimann, ugenalg, umeansd, ucorrel, uqsort, umedian, uskew, uinterv, ustudind, ustdpair, uanova1, uanova2, usnedeco, ubartlet, ukhi2, uwoolf, unonpar, udistrib, ulinfit, upolfit, umulfit, usvdfit, unlfit, uregtest, upca, ustrings; exports SetErrCode, { Sets error code } DefaultVal, { Sets error code and default function value } MathErr, { Returns the error code } SetAutoInit, { Sets automatic array initialization } DimVector, { Allocates a real vector } DimIntVector, { Allocates an integer vector } DimCompVector, { Allocates a complex vector } DimBoolVector, { Allocates a boolean vector } DimStrVector, { Allocates a string vector } DimMatrix, { Allocates a real matrix } DimIntMatrix, { Allocates an integer matrix } DimCompMatrix, { Allocates a complex matrix } DimBoolMatrix, { Allocates a boolean matrix } DimStrMatrix, { Allocates a string matrix } DelVector, { Deallocates a real vector } DelIntVector, { Deallocates an integer vector } DelCompVector, { Deallocates a complex vector } DelBoolVector, { Deallocates a boolean vector } DelStrVector, { Deallocates a string vector } DelMatrix, { Deallocates a real matrix } DelIntMatrix, { Deallocates an integer matrix } DelCompMatrix, { Deallocates a complex matrix } DelBoolMatrix, { Deallocates a boolean matrix } DelStrMatrix, { Deallocates a string matrix } FMin, { Minimum of 2 reals } FMax, { Maximum of 2 reals } IMin, { Minimum of 2 integers } IMax, { Maximum of 2 integers } Sgn, { Sign, Sgn(0) = 1 } Sgn0, { Sign, Sgn(0) = 0 } DSgn, { DSgn(A, B) = Sgn(B) * |A| } FSwap, { Exchanges 2 reals } ISwap, { Exchanges 2 integers } RoundN, { Rounds a number to N decimal places } Ceil, { Ceiling function } Floor, { Floor function } Expo, { Exponential (with bound checking) } Exp2, { Exponential, base 2 } Exp10, { Exponential, base 10 } Log, { Natural log (with bound checking) } Log2, { Log, base 2 } Log10, { Log, base 10 } LogA, { Log, base A } IntPower, { Power (integer exponent) } Power, { Power (real exponent) } Pythag, { Sqrt(X^2 + Y^2) } FixAngle, { Set argument in -Pi..Pi } Tan, { Tangent } ArcSin, { Arc sinus } ArcCos, { Arc cosinus } ArcTan2, { Angle (Ox, OM) with M(X,Y) } Sinh, { Hyperbolic sine } Cosh, { Hyperbolic cosine } Tanh, { Hyperbolic tangent } ArcSinh, { Inverse hyperbolic sine } ArcCosh, { Inverse hyperbolic cosine } ArcTanh, { Inverse hyperbolic tangent } SinhCosh, { Sinh and Cosh } Gamma, { Gamma function } LnGamma, { Logarithm of Gamma function } SgnGamma, { Sign of Gamma function } Stirling, { Stirling's formula for Gamma } StirLog, { Stirling's formula for LnGamma } DiGamma, { DiGamma function } TriGamma, { TriGamma function } IGamma, { Incomplete Gamma function } JGamma, { Complement of incomplete Gamma function } Erf, { Error function } Erfc, { Complement of error function } Beta, { Beta function } IBeta, { Incomplete Beta function } LambertW, { Lambert's W-function } Fact, { Factorial } Binomial, { Binomial coefficient } PBinom, { Probability of binomial distribution } PPoisson, { Probability of Poisson distribution } DExpo, { Density of exponential distribution } FExpo, { Cumulative prob. of exponential dist. } DNorm, { Density of standard normal distribution } DBeta, { Density of Beta distribution } DGamma, { Density of Gamma distribution } DKhi2, { Density of Khi-2 distribution } DStudent, { Density of Student's distribution } DSnedecor, { Density of Fisher-Snedecor distribution } FBeta, { Cumulative prob. of Beta distribution } FBinom, { Cumulative prob. of Binomial distribution } FStudent, { Cumulative prob. of Student's distribution } PStudent, { Prob(|t| > X) for Student's distribution } FSnedecor, { Cumulative prob. of Fisher-Snedecor distribution } PSnedecor, { Prob(F > X) for Fisher-Snedecor distribution } FGamma, { Cumulative prob. of Gamma distribution } FPoisson, { Cumulative prob. of Poisson distribution } FNorm, { Cumulative prob. of standard normal distribution } PNorm, { Prob(|U| > X) for standard normal distribution } FKhi2, { Cumulative prob. of Khi-2 distribution } PKhi2, { Prob(Khi2 > X) for Khi-2 distribution } InvNorm, { Inverse of normal distribution } InvGamma, { Inverse of incomplete Gamma function } InvKhi2, { Inverse of khi-2 distribution } InvBeta, { Inverse of incomplete Beta function } InvStudent, { Inverse of Student's t-distribution } InvSnedecor, { Inverse of Snedecor's F-distribution } GaussJordan, { Linear equation system (Gauss-Jordan method) } LinEq, { Linear equation system (Gauss-Jordan method) } Cholesky, { Cholesky factorization } LU_Decomp, { LU decomposition } LU_Solve, { Linear equation system (LU method) } QR_Decomp, { QR decomposition } QR_Solve, { Linear equation system (QR method) } SV_Decomp, { Singular value decomposition } SV_Solve, { Linear equation system (SVD method) } SV_SetZero, { Set lowest singular values to zero } SV_Approx, { Matrix approximation from SVD } EigenVals, { Eigenvalues of a general square matrix } EigenVect, { Eigenvalues and eigenvectors of a general square matrix } Jacobi, { Eigenvalues and eigenvectors of a symmetric matrix } MinBrack, { Brackets the minimum of a function } GoldSearch, { Minimization of a function of one variable (golden search) } LinMin, { Minimization of a function of several variables along a line } Newton, { Minimization of a function of several var. (Newton's method) } SaveNewton, { Save Newton iterations in a file } Marquardt, { Minimization of a function of several var. (Marquardt's method) } SaveMarquardt, { Save Marquardt iterations in a file } BFGS, { Minimization of a function of several var. (BFGS method) } SaveBFGS, { Save BFGS iterations in a file } Simplex, { Minimization of a function of several variables (Simplex) } SaveSimplex, { Save Simplex iterations in a file } RootBrack, { Brackets solution of equation } Bisect, { Nonlinear equation (bisection method) } NewtEq, { Nonlinear equation (Newton-Raphson method) } Secant, { Nonlinear equation (secant method) } NewtEqs, { Nonlinear equation system (Newton-Raphson method) } Broyden, { Nonlinear equation system (Broyden's method) } Poly, { Evaluates a polynomial } RFrac, { Evaluates a rational fraction } RootPol1, { Root of linear equation } RootPol2, { Roots of quadratic equation } RootPol3, { Roots of cubic equation } RootPol4, { Roots of quartic equation } RootPol, { Roots of polynomial from companion matrix } SetRealRoots, { Set the imaginary part of a root to zero } SortRoots, { Sorts the roots of a polynomial } TrapInt, { Integration by trapezoidal rule } GausLeg, { Gauss-Legendre integration } GausLeg0, { Gauss-Legendre integration (lower bound=0) } Convol, { Convolution product } RKF45, { Integration of a system of differential equations } FFT, { Fast Fourier Transform } IFFT, { Inverse Fast Fourier Transform } FFT_Integer, { Fast Fourier Transform for integer data } FFT_Integer_Cleanup, { Clear memory after a call to FFT_Integer } CalcFrequency, { Direct computation of Fourier Transform } SetRNG, { Select random number generator } InitGen, { Initialize random number generator } IRanGen, { 32-bit random integer in [-2^31 .. 2^31 - 1] } IRanGen31, { 31-bit random integer in [0 .. 2^31 - 1] } RanGen1, { 32-bit random real in [0,1] } RanGen2, { 32-bit random real in [0,1) } RanGen3, { 32-bit random real in (0,1) } RanGen53, { 53-bit random real in [0,1) } InitMWC, { Initialize Multiply-With-Carry generator } IRanMWC, { 32-bit random integer from MWC generator } InitMT, { Initialize Mersenne Twister generator with a seed } InitMTbyArray, { Initialize MT generator with an array } IRanMT, { 32-bit random integer from MT generator } InitUVAG, { Initialize UVAG generator with a seed } InitUVAGbyString, { Initialize UVAG generator with a string } IRanUVAG, { 32-bit random integer from UVAG generator } RanGaussStd, { Random number from standard normal distribution } RanGauss, { Random number from normal distribution } RanMult, { Random vector from multinormal distrib. (correlated) } RanMultIndep, { Random vector from multinormal distrib. (uncorrelated) } InitMHParams, { Initialize Metropolis-Hastings parameters } GetMHParams, { Returns Metropolis-Hastings parameters } Hastings, { Simulation of a p.d.f. by Metropolis-Hastings } InitSAParams, { Initialize Simulated Annealing parameters } SA_CreateLogFile, { Initialize log file for Simulated Annealing } SimAnn, { Minimization of a function of several var. by Simulated Annealing } InitGAParams, { Initialize Genetic Algorithm parameters } GA_CreateLogFile, { Initialize log file for Genetic Algorithm } GenAlg, { Minimization of a function of several var. by Genetic Algorithm } Mean, { Sample mean } Median, { Sample median } StDev, { Standard deviation estimated from sample } StDevP, { Standard deviation of population } Correl, { Correlation coefficient } Skewness, { Sample skewness } Kurtosis, { Sample kurtosis } QSort, { Quick sort (ascending order) } DQSort, { Quick sort (descending order) } Interval, { Determines an interval for a set of values } StudIndep, { Student t-test for independent samples } StudPaired, { Student t-test for paired samples } AnOVa1, { One-way analysis of variance } AnOVa2, { Two-way analysis of variance } Snedecor, { Comparison of two variances } Bartlett, { Comparison of several variances } Khi2_Conform, { Khi-2 test for conformity } Khi2_Indep, { Khi-2 test for independence } Woolf_Conform, { Woolf's test for conformity } Woolf_Indep, { Woolf's test for independence } Mann_Whitney, { Mann-Whitney test } Wilcoxon, { Wilcoxon test } Kruskal_Wallis, { Kruskal-Wallis test } DimStatClassVector, { Allocates an array of statistical classes } DelStatClassVector, { Deallocates an array of statistical classes } Distrib, { Distributes an array into statistical classes } LinFit, { Linear regression } WLinFit, { Weighted linear regression } PolFit, { Polynomial regression } WPolFit, { Weighted polynomial regression } MulFit, { Multiple linear regression by Gauss-Jordan method } WMulFit, { Weighted multiple linear regression by Gauss-Jordan method } SVDFit, { Multiple linear regression by SVD method } WSVDFit, { Weighted multiple linear regression by SVD method } SetOptAlgo, { Selects optimization algorithm for nonlinear regression } SetMaxParam, { Sets the maximal number of regression parameters } SetParamBounds, { Sets the bounds on a regression parameter } NLFit, { Nonlinear regression } WNLFit, { Weighted nonlinear regression } SetMCFile, { Set file for saving MCMC simulations } SimFit, { Simulation of unweighted nonlinear regression by MCMC } WSimFit, { Simulation of weighted nonlinear regression by MCMC } RegTest, { Test of unweighted regression } WRegTest, { Test of weighted regression } VecMean, { Computes mean vector } VecSD, { Computes vector of standard deviations } MatVarCov, { Computes variance-covariance matrix } MatCorrel, { Computes correlation matrix } PCA, { Principal component analysis of correlation matrix } ScaleVar, { Scales a set of variables } PrinFac, { Computes principal factors } LTrim, { Remove leading blanks } RTrim, { Remove trailing blanks } Trim, { Remove leading and trailing blanks } StrChar, { Generate string by repeating a character } RFill, { Complete string with trailing blanks } LFill, { Complete string with leading blanks } CFill, { Center string } Replace, { Replace a character } Extract, { Extract field from string } Parse, { Parse string into several fields } SetFormat, { Set numeric format } FloatStr, { Convert real number to string } IntStr, { Convert integer to string } CompStr; { Convert complex number to string } begin end. mricron-0.20120505.1~dfsg.1.orig/fpmath/dll/tpgraph.pas0000664000175000017500000001322411326434464022065 0ustar michaelmichael{ ****************************************************************** Unit TPGRAPH - Interface for TPGRAPH.DLL ****************************************************************** } unit tpgraph; interface uses tpmath {$IFDEF DELPHI}, Graphics{$ENDIF}; function InitGraphics {$IFDEF DELPHI} (Canvas : TCanvas; Width, Height : Integer) : Boolean; {$ELSE} (Pilot, Mode : Integer; BGIPath : String) : Boolean; {$ENDIF} external 'tpgraph'; { Enters graphic mode } procedure SetWindow({$IFDEF DELPHI}Canvas : TCanvas;{$ENDIF} X1, X2, Y1, Y2 : Integer; GraphBorder : Boolean); external 'tpgraph'; { Sets the graphic window } procedure AutoScale(X : PVector; Lb, Ub : Integer; Scale : TScale; var XMin, XMax, XStep : Float); external 'tpgraph'; { Finds an appropriate scale for plotting the data in X[Lb..Ub] } procedure SetOxScale(Scale : TScale; OxMin, OxMax, OxStep : Float); external 'tpgraph'; { Sets the scale on the Ox axis } procedure SetOyScale(Scale : TScale; OyMin, OyMax, OyStep : Float); external 'tpgraph'; { Sets the scale on the Oy axis } procedure SetGraphTitle(Title : String); external 'tpgraph'; { Sets the title for the graph } procedure SetOxTitle(Title : String); external 'tpgraph'; { Sets the title for the Ox axis } procedure SetOyTitle(Title : String); external 'tpgraph'; { Sets the title for the Oy axis } {$IFNDEF DELPHI} procedure SetTitleFont(FontIndex, Width, Height : Integer); external 'tpgraph'; { Sets the font for the main graph title } procedure SetOxFont(FontIndex, Width, Height : Integer); external 'tpgraph'; { Sets the font for the Ox axis (title and labels) } procedure SetOyFont(FontIndex, Width, Height : Integer); external 'tpgraph'; { Sets the font for the Oy axis (title and labels) } procedure SetLgdFont(FontIndex, Width, Height : Integer); external 'tpgraph'; { Sets the font for the legends } procedure SetClipping(Clip : Boolean); external 'tpgraph'; { Determines whether drawings are clipped at the current viewport boundaries, according to the value of the Boolean parameter Clip } {$ENDIF} procedure PlotOxAxis{$IFDEF DELPHI}(Canvas : TCanvas){$ENDIF}; external 'tpgraph'; { Plots the horizontal axis } procedure PlotOyAxis{$IFDEF DELPHI}(Canvas : TCanvas){$ENDIF}; external 'tpgraph'; { Plots the vertical axis } procedure PlotGrid({$IFDEF DELPHI}Canvas : TCanvas;{$ENDIF} Grid : TGrid); external 'tpgraph'; { Plots a grid on the graph } procedure WriteGraphTitle{$IFDEF DELPHI}(Canvas : TCanvas){$ENDIF}; external 'tpgraph'; { Writes the title of the graph } procedure SetMaxCurv(NCurv : Byte); external 'tpgraph'; { Sets the maximum number of curves and re-initializes their parameters } procedure SetPointParam {$IFDEF DELPHI} (CurvIndex, Symbol, Size : Integer; Color : TColor); {$ELSE} (CurvIndex, Symbol, Size, Color : Integer); {$ENDIF} external 'tpgraph'; { Sets the point parameters for curve # CurvIndex } procedure SetLineParam {$IFDEF DELPHI} (CurvIndex : Integer; Style : TPenStyle; Width : Integer; Color : TColor); {$ELSE} (CurvIndex, Style, Width, Color : Integer); {$ENDIF} external 'tpgraph'; { Sets the line parameters for curve # CurvIndex } procedure SetCurvLegend(CurvIndex : Integer; Legend : String); external 'tpgraph'; { Sets the legend for curve # CurvIndex } procedure SetCurvStep(CurvIndex, Step : Integer); external 'tpgraph'; { Sets the step for curve # CurvIndex } procedure PlotPoint({$IFDEF DELPHI}Canvas : TCanvas;{$ENDIF} X, Y : Float; CurvIndex : Integer); external 'tpgraph'; { Plots a point on the screen } procedure PlotCurve({$IFDEF DELPHI}Canvas : TCanvas;{$ENDIF} X, Y : PVector; Lb, Ub, CurvIndex : Integer); external 'tpgraph'; { Plots a curve } procedure PlotCurveWithErrorBars({$IFDEF DELPHI}Canvas : TCanvas;{$ENDIF} X, Y, S : PVector; Ns, Lb, Ub, CurvIndex : Integer); external 'tpgraph'; { Plots a curve with error bars } procedure PlotFunc({$IFDEF DELPHI}Canvas : TCanvas;{$ENDIF} Func : TFunc; Xmin, Xmax : Float; {$IFDEF DELPHI}Npt : Integer;{$ENDIF} CurvIndex : Integer); external 'tpgraph'; { Plots a function } procedure WriteLegend({$IFDEF DELPHI}Canvas : TCanvas;{$ENDIF} NCurv : Integer; ShowPoints, ShowLines : Boolean); external 'tpgraph'; { Writes the legends for the plotted curves } procedure ConRec({$IFDEF DELPHI}Canvas : TCanvas;{$ENDIF} Nx, Ny, Nc : Integer; X, Y, Z : PVector; F : PMatrix); external 'tpgraph'; { Contour plot } function Xpixel(X : Float) : Integer; external 'tpgraph'; { Converts user abscissa X to screen coordinate } function Ypixel(Y : Float) : Integer; external 'tpgraph'; { Converts user ordinate Y to screen coordinate } function Xuser(X : Integer) : Float; external 'tpgraph'; { Converts screen coordinate X to user abscissa } function Yuser(Y : Integer) : Float; external 'tpgraph'; { Converts screen coordinate Y to user ordinate } procedure LeaveGraphics; external 'tpgraph'; { Quits graphic mode } implementation end. mricron-0.20120505.1~dfsg.1.orig/fpmath/dll/tpgraph.dpr0000664000175000017500000000410410702674132022057 0ustar michaelmichaellibrary tpgraph; uses {$IFDEF DELPHI} uwinplot; {$ELSE} uplot; {$ENDIF} exports InitGraphics, { Initializes the graphic } SetWindow, { Sets the graphic window } AutoScale, { Automatic scale determination } SetOxScale, { Sets the scale on the Ox axis } SetOyScale, { Sets the scale on the Oy axis } SetGraphTitle, { Sets the graph title } SetOxTitle, { Sets the title for the Ox axis } SetOyTitle, { Sets the title for the Oy axis } {$IFNDEF DELPHI} SetTitleFont, { Sets the font for the main graph title } SetOxFont, { Sets the font for the Ox axis } SetOyFont, { Sets the font for the Oy axis } SetLgdFont, { Sets the font for the legends } SetClipping, { Limits the graphic to the current viewport } {$ENDIF} PlotOxAxis, { Plots the X axis } PlotOyAxis, { Plots the Y axis } WriteGraphTitle, { Writes title of graph } PlotGrid, { Plots a grid on the graph } SetMaxCurv, { Sets maximum number of curves } SetPointParam, { Sets point parameters } SetLineParam, { Sets line parameters } SetCurvLegend, { Sets curve legend } SetCurvStep, { Sets curve step } PlotPoint, { Plots a point } PlotCurve, { Plots a curve } PlotCurveWithErrorBars, { Plots a curve with error bars } PlotFunc, { Plots a function } WriteLegend, { Writes the legends for the plotted curves } ConRec, { Contour plot } Xpixel, { Converts user abscissa X to screen coordinate } Ypixel, { Converts user ordinate Y to screen coordinate } Xuser, { Converts screen coordinate X to user abscissa } Yuser, { Converts screen coordinate Y to user ordinate } LeaveGraphics; { Quits the graphic mode } begin end. mricron-0.20120505.1~dfsg.1.orig/fpmath/dll/fpcompil.sh0000664000175000017500000000022610730740130022042 0ustar michaelmichaelfpc tpmath.dpr -Fu../units -Mdelphi fpc tpmath.dpr -Fi../units -Mdelphi fpc tpgraph.dpr -Fu../units -Mdelphi fpc tpgraph.dpr -Fi../units -Mdelphimricron-0.20120505.1~dfsg.1.orig/fpmath/dll/fpcompil.bat0000664000175000017500000000023010724760312022200 0ustar michaelmichaelfpc tpmath.dpr -Fu..\units -Mdelphi fpc tpmath.pas -Fi..\units -Mdelphi fpc tpgraph.dpr -Fu..\units -Mdelphi fpc tpgraph.pas -Fi..\units -Mdelphi mricron-0.20120505.1~dfsg.1.orig/fpmath/dll/dcompil.bat0000664000175000017500000000025110727470344022027 0ustar michaelmichaeldcc32 tpmath.dpr -U..\units -DDELPHI -$J+ dcc32 tpmath.pas -I..\units -DDELPHI dcc32 tpgraph.dpr -U..\units -DDELPHI -$J+ dcc32 tpgraph.pas -I..\units -DDELPHI mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/0000775000175000017500000000000011660470014020052 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/stat/0000775000175000017500000000000011660470014021025 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/stat/student.pas0000664000175000017500000000441011326434464023227 0ustar michaelmichael{ ****************************************************************** Comparison of means for paired samples ****************************************************************** } program student; uses tpmath; const N = 12; { Number of values } Alpha = 0.05; { Significance level } { First sample } const X : array[1..N] of Float = (9.2, 10, 9, 9.4, 10.1, 9.5, 10, 10.3, 10.2, 10.2, 9.8, 10.1); { Second sample } const Y : array[1..N] of Float = (9.5, 9, 8.8, 9.5, 9.1, 10, 10.1, 9.3, 9, 9.7, 9.1, 9.3); var XX, YY : PVector; { Data } MX, MY : Float; { Means } SX, SY : Float; { Standard deviations } T : Float; { Student's t } WT, Eps : Float; { Wilcoxon's T and assoc. standard normal } Nd : Integer; { Number of nonzero differences } DoF : Integer; { Degrees of freedom } P : Float; { Probability } Tc, Ec : Float; { Critical values } procedure GetData(XX, YY : PVector); { Get data into arrays } var I : Integer; begin for I := 1 to N do begin XX^[I] := X[I]; YY^[I] := Y[I]; end; end; begin DimVector(XX, N); DimVector(YY, N); GetData(XX, YY); { Compute statistical parameters } MX := Mean(XX, 1, N); MY := Mean(YY, 1, N); SX := StDev(XX, 1, N, MX); SY := StDev(YY, 1, N, MY); { Compare means (parametric test) } StudPaired(XX, YY, 1, N, T, DoF); { Compare means (non-parametric test) } Wilcoxon(XX, YY, 1, N, Nd, WT, Eps); { Compute critical values } P := 1.0 - 0.5 * Alpha; Tc := InvStudent(DoF, P); Ec := InvNorm(P); WriteLn(' X Y'); WriteLn; WriteLn('Mean :', MX:10:4, MY:10:4); WriteLn('St. dev. :', SX:10:4, SY:10:4); WriteLn; WriteLn('Comparison of means (paired samples, parametric test)'); WriteLn; WriteLn('Student''s t = ', T:10:4, ' (', DoF, ' DoF)'); WriteLn('Critical value (p = ', Alpha:5:3, ') = ', Tc:10:4); WriteLn; WriteLn('Comparison of means (paired samples, non-parametric test)'); WriteLn; WriteLn('Wilcoxon''s T = ', WT:10:4); WriteLn('Associated standard normal = ', Eps:10:4); WriteLn('Critical value (p = ', Alpha:5:3, ') = ', Ec:10:4); end.mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/stat/stat.pas0000664000175000017500000000623711326434464022525 0ustar michaelmichael{ ****************************************************************** Statistics: Concentration of hemoglobin in blood (mg/L) in men and women. ****************************************************************** } program stat; uses tpmath; const N = 30; { Number of values } Alpha = 0.05; { Significance level } { Concentrations in men } const HbM : array[1..N] of Float = (141, 144, 146, 148, 149, 150, 150, 151, 153, 153, 153, 154, 155, 156, 156, 160, 160, 160, 163, 164, 164, 165, 166, 168, 168, 170, 172, 172, 176, 179); { Concentrations in women } const HbW : array[1..N] of Float = (105, 110, 112, 112, 118, 119, 120, 120, 125, 126, 127, 128, 130, 132, 133, 134, 135, 138, 138, 138, 138, 142, 145, 148, 148, 150, 151, 154, 154, 158); var XX, YY : PVector; { Data } MM, MW, SM, SW : Float; { Means and standard deviations } SkM, SkW, KM, KW : Float; { Skewness and kurtosis } T, F : Float; { Student's t and Snedecor's F } U, Eps : Float; { Mann-Whitney's U and assoc. standard normal } DoF, DoF1, DoF2 : Integer; { Degrees of freedom } Tc, Fc, Ec : Float; { Critical values } P : Float; { Probability } procedure GetData(XX, YY : PVector); { Get data into arrays } var I : Integer; begin for I := 1 to N do begin XX^[I] := HbM[I]; YY^[I] := HbW[I]; end; end; begin DimVector(XX, N); DimVector(YY, N); GetData(XX, YY); { Compute statistical parameters } MM := Mean(XX, 1, N); MW := Mean(YY, 1, N); SM := StDev(XX, 1, N, MM); SW := StDev(YY, 1, N, MW); SkM := Skewness(XX, 1, N, MM, SM); SkW := Skewness(YY, 1, N, MW, SW); KM := Kurtosis(XX, 1, N, MM, SM); KW := Kurtosis(YY, 1, N, MW, SW); { Compare means and variances (parametric tests) } StudIndep(N, N, MM, MW, SM, SW, T, DoF); Snedecor(N, N, SM, SW, F, DoF1, DoF2); { Compare means (non-parametric test) } Mann_Whitney(N, N, XX, YY, U, Eps); { Compute critical values } P := 1.0 - 0.5 * Alpha; Tc := InvStudent(DoF, P); Fc := InvSnedecor(DoF1, DoF2, P); Ec := InvNorm(P); WriteLn('Hemoglobin in blood'); WriteLn; WriteLn(' Men Women'); WriteLn; WriteLn('Mean : ', MM:10:4, MW:10:4); WriteLn('St. dev. : ', SM:10:4, SW:10:4); WriteLn('Skewness : ', SkM:10:4, SkW:10:4); WriteLn('Kurtosis : ', KM:10:4, KW:10:4); WriteLn; WriteLn('Comparison of means (parametric test):'); WriteLn; WriteLn('Student''s t = ', T:10:4, ' (', DoF, ' DoF)'); WriteLn('Critical value (p = ', Alpha:5:3, ') = ', Tc:10:4); WriteLn; WriteLn('Comparison of variances:'); WriteLn; WriteLn('Snedecor''s F = ', F:10:4, ' (', DoF1, ' and ', DoF2, ' DoF)'); WriteLn('Critical value (p = ', Alpha:5:3, ') = ', Fc:10:4); WriteLn; WriteLn('Comparison of means (non-parametric test):'); WriteLn; WriteLn('Mann-Whitney U = ', U:10:4); WriteLn('Associated standard normal = ', Eps:10:4); WriteLn('Critical value (p = ', Alpha:5:3, ') = ', Ec:10:4); WriteLn; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/stat/khi2.pas0000664000175000017500000000531111326434464022377 0ustar michaelmichael{ ****************************************************************** Khi-2 and Woolf's tests ****************************************************************** } program khi2; uses tpmath; const Alpha = 0.05; { Significance level } var K2, K2c, G : Float; DoF : Integer; { ------------------------------------------------------------------ Data for the conformity test ------------------------------------------------------------------ } const N = 4; Obs : array[1..N] of Integer = (104, 76, 18, 2); Calc : array[1..N] of Float = ( 94, 86, 14, 6); { ------------------------------------------------------------------ Data for the independence test ------------------------------------------------------------------ } const Nr = 2; Nc = 3; { Number of rows and columns } T : array[1..Nr, 1..Nc] of Integer = { Contingency table } ((280, 210, 110), (220, 90, 90)); { ------------------------------------------------------------------ Procedures for reading data ------------------------------------------------------------------ } procedure GetDataConf(O : PIntVector; C : PVector); { Get data for conformity test } var I : Integer; begin for I := 1 to N do begin O^[I] := Obs[I]; C^[I] := Calc[I]; end; end; procedure GetDataInd(A : PIntMatrix); { Get data for independence test } var I, J : Integer; begin for I := 1 to Nr do for J := 1 to Nc do A^[I]^[J] := T[I,J]; end; { ------------------------------------------------------------------ Main program ------------------------------------------------------------------ } var O : PIntVector; C : PVector; A : PIntMatrix; begin DimIntVector(O, N); DimVector(C, N); DimIntMatrix(A, Nr, Nc); GetDataConf(O, C); GetDataInd(A); { Tests for conformity } Khi2_Conform(N, 0, O, C, K2, DoF); Woolf_Conform(N, 0, O, C, G, DoF); K2c := InvKhi2(DoF, 1.0 - Alpha); WriteLn('Comparison of two distributions:'); WriteLn; WriteLn('Pearson''s Khi-2 = ', K2:10:4, ' (', DoF, ' DoF)'); WriteLn('Woolf''s G = ', G:10:4, ' (', DoF, ' DoF)'); WriteLn('Critical value (p = ', Alpha:5:3, ') = ', K2c:10:4); WriteLn; WriteLn; { Tests for independence } Khi2_Indep(Nr, Nc, A, K2, DoF); Woolf_Indep(Nr, Nc, A, G, DoF); K2c := InvKhi2(DoF, 1.0 - Alpha); WriteLn('Analysis of contingency table:'); WriteLn; WriteLn('Pearson''s Khi-2 = ', K2:10:4, ' (', DoF, ' DoF)'); WriteLn('Woolf''s G = ', G:10:4, ' (', DoF, ' DoF)'); WriteLn('Critical value (p = ', Alpha:5:3, ') = ', K2c:10:4); end.mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/stat/histo.pas0000664000175000017500000001420611326434464022673 0ustar michaelmichael{ ****************************************************************** Statistical distribution and Histogram ****************************************************************** } program histo; uses tpmath, tpgraph; const N = 30; { Number of values } Alpha = 0.05; { Significance level } { Hemoglobin concentrations in men } const HbM : array[1..N] of Float = (141, 144, 146, 148, 149, 150, 150, 151, 153, 153, 153, 154, 155, 156, 156, 160, 160, 160, 163, 164, 164, 165, 166, 168, 168, 170, 172, 172, 176, 179); var M, S : Float; { Mean and standard deviation } function PltFunc(X : Float) : Float; { ------------------------------------------------------------------ Function to be plotted (density of normal distribution) ------------------------------------------------------------------ } begin PltFunc := DNorm((X - M) / S) / S; end; procedure WriteResults(C : PStatClassVector; Ncls : Integer; Calc : PVector; Khi2, G : Float; DoF : Integer; K2c : Float); { ------------------------------------------------------------------ Writes results to screen ------------------------------------------------------------------ } const Line1 = '-----------------------------'; var Sum : Float; I : Integer; begin Writeln('Statistical distribution'); Writeln(Line1); Writeln(' Inf Sup N Ncalc'); Writeln(Line1); Sum := 0.0; for I := 1 to Ncls do begin Writeln(C^[I].Inf:8:0, C^[I].Sup:7:0, C^[I].N:7, Calc^[I]:7:2); Sum := Sum + Calc^[I]; end; Writeln(Line1); Writeln('Total ', N:5, Sum:7:2); Writeln(Line1); Writeln; Writeln('Comparison with normal distribution:'); Writeln; Writeln('Pearson''s Khi-2 = ', Khi2:10:4, ' (', DoF, ' DoF)'); Writeln('Woolf''s G = ', G:10:4, ' (', DoF, ' DoF)'); Writeln('Critical value (p = ', Alpha:4:2, ') = ', K2c:10:4); end; procedure PlotGraph(C : PStatClassVector; Ncls : Integer; Xmin , Xmax, Xstep : Float); { ------------------------------------------------------------------ Plots histogram and normal curve ------------------------------------------------------------------ } var Ymin, Ymax, Ystep : Float; { Oy scale } Npts : Integer; { Number of points } X, Y : PVector; { Point coordinates } I, J : Integer; { Loop variables } begin if not InitGraphics(9, 2, 'c:\tp\bgi') then { 640x480 16 color } begin Writeln('Unable to set graphic mode'); Exit; end; SetWindow(15, 85, 15, 85, True); { The histogram is plotted as a continuous curve. Each bar of the histogram is defined by 4 points } Npts := 4 * Ncls; DimVector(X, Npts); DimVector(Y, Npts); for I := 1 to Ncls do with C^[I] do begin J := 4 * (I - 1) + 1; X^[J] := Inf; { Y^[J] := 0 } Inc(J); X^[J] := Inf; Y^[J] := D; Inc(J); X^[J] := Sup; Y^[J] := D; Inc(J); X^[J] := Sup; { Y^[J] := 0 } end; { Set scale on Oy, making sure that it starts from 0 } AutoScale(Y, 1, Ncls, LinScale, Ymin, Ymax, Ystep); if Ymin <> 0.0 then Ymin := 0.0; Ymax := Ymax + Ystep; SetOxScale(LinScale, Xmin, Xmax, Xstep); SetOyScale(LinScale, Ymin, Ymax, Ystep); SetGraphTitle('Statistical Distribution'); SetOxTitle('X'); SetOyTitle('Frequency Density'); PlotOxAxis; PlotOyAxis; WriteGraphTitle; SetClipping(True); { Plot histogram and normal curve } SetPointParam(1, 0, 0, 0); { Don't show points on histogram } SetLineParam(1, 1, 3, 1); { Use thick lines } PlotCurve(X, Y, 1, Npts, 1); PlotFunc({$IFDEF FPC}@{$ENDIF}PltFunc, Xmin, Xmax, 2); DelVector(X, Npts); DelVector(Y, Npts); Readln; LeaveGraphics; end; { ****************************************************************** Main program ****************************************************************** } var X : PVector; { Data } C : PStatClassVector; { Statistical classes } Ncls : Integer; { Number of classes } Obs : PIntVector; { Observed frequencies } Calc : PVector; { Calculated frequencies } Khi2 : Float; { Pearson's Khi-2 } G : Float; { Woolf's G } K2c : Float; { Theoretical Khi-2 } DoF : Integer; { Degrees of freedom } T : Float; { Standard normal variable } F0, F : Float; { Cumulative probability } XMin, XMax, XStep : Float; { Scale on Ox } I : Integer; { Loop variable } begin { Read data } DimVector(X, N); for I := 1 to N do X^[I] := HbM[I]; { Sort data if necessary } { QSort(X, 1, N); } { Compute an appropriate interval for the set of values } Interval(X^[1], X^[N], 5, 10, XMin, XMax, XStep); { Compute number of classes and dimension arrays } Ncls := Round((Xmax - Xmin) / XStep); DimStatClassVector(C, Ncls); DimIntVector(Obs, Ncls); DimVector(Calc, Ncls); { Compute distribution } Distrib(X, 1, N, Xmin, Xmax, XStep, C); { Compute mean and S.D. } M := Mean(X, 1, N); S := StDev(X, 1, N, M); { Compute theoretical values } F0 := 0.0; for I := 1 to Ncls do begin if I = Ncls then F := 1.0 else begin T := (C^[I].Sup - M) / S; F := FNorm(T); end; Calc^[I] := N * (F - F0); Obs^[I] := C^[I].N; F0 := F; end; { Perform Khi-2 and Woolf tests } Khi2_Conform(Ncls, 2, Obs, Calc, Khi2, DoF); Woolf_Conform(Ncls, 2, Obs, Calc, G, DoF); { Compute critical value } K2c := InvKhi2(DoF, 1.0 - Alpha); { Print results } WriteResults(C, Ncls, Calc, Khi2, G, DoF, K2c); Readln; { Plot histogram } PlotGraph(C, Ncls, Xmin - Xstep, Xmax + Xstep, Xstep); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/stat/av2a.pas0000664000175000017500000000440411326434464022375 0ustar michaelmichael{ ****************************************************************** Two-way analysis of variance (one observation per sample) ****************************************************************** } program av2a; uses tpmath; const NA = 3; { Number of modalities of factor A } NB = 4; { Number of modalities of factor B } Alpha = 0.05; { Significance level } Prob = 1.0 - Alpha; { Probability } { The samples are stored in a matrix Z, such that Z[I, J] contains the observation for the I-th modality of factor A and the J-th modality of factor B } const Z : array[1..NA, 1..NB] of Float = ((2, 1, 3, 1), (3, 2, 3, 2), (3, 4, 5, 3)); var M : PMatrix; { Means } S : PMatrix; { Standard deviations } { Note: The S matrix does not need to be dimensioned if there is only one observation per sample. However, it must be declared. } V : PVector; { Variances (A, B, interaction) } DoF : PIntVector; { Degrees of freedom (A, B, interaction) } F : PVector; { Variance ratios (A, B) } Fc : PVector; { Critical values } I, J : Integer; { Loop variables } begin DimMatrix(M, NA, NB); { Means } DimMatrix(S, NA, NB); { Standard deviations } DimVector(V, 3); { Variances (A, B, interaction) } DimIntVector(DoF, 3); { Degrees of freedom (A, B, interaction) } DimVector(F, 2); { Variance ratios (A, B) } DimVector(Fc, 2); { Critical values } { Compare means. The matrix of means is equal to the data matrix. The matrix of standard deviations will be ignored. } for I := 1 to NA do for J := 1 to NB do M^[I]^[J] := Z[I,J]; AnOVa2(NA, NB, 1, M, S, V, F, DoF); { Compute critical values } for I := 1 to 2 do Fc^[I] := InvSnedecor(DoF^[I], DoF^[3], Prob); { Print results } WriteLn('Two-way ANOVA'); WriteLn; WriteLn('Source Variance D.o.F. F F(p = ', Alpha:4:2, ')'); WriteLn('--------------------------------------------------------'); WriteLn('Factor A ', V^[1]:10:4, DoF^[1]:10, F^[1]:10:4, Fc^[1]:10:4); WriteLn('Factor B ', V^[2]:10:4, DoF^[2]:10, F^[2]:10:4, Fc^[2]:10:4); WriteLn('Interaction ', V^[3]:10:4, DoF^[3]:10); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/stat/av2.pas0000664000175000017500000000512511326434464022235 0ustar michaelmichael{ ****************************************************************** Two-way analysis of variance (several observations per sample) ****************************************************************** } program av2; uses tpmath; const NA = 2; { Number of modalities of factor A } NB = 2; { Number of modalities of factor B } N = 12; { Number of observations for each sample } Alpha = 0.05; { Significance level } Prob = 1.0 - Alpha; { Probability } { The samples are stored in a 3D array Z, such that Z[I, J, K] contains the K-th observation for the I-th modality of factor A and the J-th modality of factor B } const Z : array[1..NA, 1..NB, 1..N] of Float = (((4.9, 2.9, 2.7, 3.9, 4.6, 3.3, 5.9, 4.8, 4.1, 3.5, 7.2, 6.1), (2.1, 2.2, 1.1, 2.9, 5.0, 3.5, 2.4, 4.4, 2.1, 3.0, 3.9, 5.6)), ((4.5, 6.9, 4.0, 5.4, 1.9, 3.6, 4.8, 3.3, 7.5, 5.8, 4.4, 6.0), (2.4, 3.6, 4.8, 3.9, 5.5, 5.0, 6.8, 2.2, 3.1, 5.0, 4.1, 4.7))); var X : PVector; { Sample } M, S : PMatrix; { Means and SD } V : PVector; { Variances (A, B, interaction, residual) } DoF : PIntVector; { Degrees of freedom (A, B, interaction, residual) } F : PVector; { Variance ratios (A, B, interaction) } Fc : PVector; { Critical values } I, J : Integer; { Loop variables } procedure GetSample(I, J : Integer; X : PVector); { Get sample [I,J] from array Z into vector X } var K : Integer; begin for K := 1 to N do X^[K] := Z[I, J, K]; end; begin DimVector(X, N); DimMatrix(M, NA, NB); DimMatrix(S, NA, NB); DimVector(V, 4); DimIntVector(DoF, 4); DimVector(F, 3); DimVector(Fc, 3); { Compute means and SD's } for I := 1 to NA do for J := 1 to NB do begin GetSample(I, J, X); M^[I]^[J] := Mean(X, 1, N); S^[I]^[J] := StDev(X, 1, N, M^[I]^[J]); end; { Compare means } AnOVa2(NA, NB, N, M, S, V, F, DoF); { Compute critical values } for I := 1 to 3 do Fc^[I] := InvSnedecor(DoF^[I], DoF^[4], Prob); { Print results } WriteLn('Two-way ANOVA'); WriteLn; WriteLn('Source Variance D.o.F. F F(p = ', Alpha:4:2, ')'); WriteLn('--------------------------------------------------------'); WriteLn('Factor A ', V^[1]:10:4, DoF^[1]:10, F^[1]:10:4, Fc^[1]:10:4); WriteLn('Factor B ', V^[2]:10:4, DoF^[2]:10, F^[2]:10:4, Fc^[2]:10:4); WriteLn('Interaction ', V^[3]:10:4, DoF^[3]:10, F^[3]:10:4, Fc^[3]:10:4); WriteLn('Residual ', V^[4]:10:4, DoF^[4]:10); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/stat/av1.pas0000664000175000017500000000702111326434464022231 0ustar michaelmichael{ ****************************************************************** One-way analysis of variance ****************************************************************** } program av1; uses tpmath; const Nsamples = 5; { Number of samples } Nmax = 12; { Max. number of observations per sample } Alpha = 0.05; { Significance level } Prob = 1.0 - Alpha; { Probability } { Sample matrix (one sample per column) } const A : array[1..Nmax, 1..Nsamples] of Float = ((7.2, 4.9, 10.4, 4.6, 6.1), (4.3, 4.8, 4.6, 5.6, 11.4), (5.5, 4.7, 8.4, 8.3, 8.2), (4.6, 5.4, 6.1, 6.9, 5.7), (4.7, 4.7, 8.1, 4.5, 6.6), (5.5, 4.7, 5.4, 4.7, 6.6), (6.6, 6.2, 6.7, 6.7, 6.3), (5.3, 5.6, 7.5, 4.8, 5.9), (5.4, 3.2, 6.4, 5.0, 5.8), (3.9, 6.1, 5.6, 5.0, 4.8), (5.5, 6.7, 6.3, 5.3, 9.1), (2.7, 5.5, 7.7, 7.8, 13.2)); var X : PVector; { Sample } Z : PMatrix; { Sample matrix } N : PIntVector; { Sizes } M : PVector; { Means } S : PVector; { Standard dev. } V_f, V_r, F : Float; { Variances and variance ratio } Khi2 : Float; { Bartlett's khi-2 } H : Float; { Kruskal-Wallis H } Fc, K2c : Float; { Critical values } DoF_f, DoF_r, DoF : Integer; { Degrees of freedom } J : Integer; { Loop variable } procedure GetSample(J : Integer; X : PVector); { Get sample J from matrix A into vector X } var I : Integer; begin for I := 1 to Nmax do X^[I] := A[I, J]; end; procedure GetSampleMatrix(Z : PMatrix); { Get sample matrix into Z } var I, J : Integer; begin for I := 1 to Nmax do for J := 1 to Nsamples do Z^[I]^[J] := A[I, J]; end; begin { Dimension arrays } DimVector(X, Nmax); { Sample } DimMatrix(Z, Nmax, Nsamples); { Sample matrix } DimIntVector(N, Nsamples); { Sizes } DimVector(M, Nsamples); { Means } DimVector(S, Nsamples); { Standard dev. } { Compute sizes, means and SD's } for J := 1 to Nsamples do begin GetSample(J, X); N^[J] := Nmax; M^[J] := Mean(X, 1, N^[J]); S^[J] := StDev(X, 1, N^[J], M^[J]); end; { Compare means and variances (parametric tests) } AnOVa1(Nsamples, N, M, S, V_f, V_r, F, DoF_f, DoF_r); Bartlett(Nsamples, N, S, Khi2, DoF); { Compare means (non-parametric test) } GetSampleMatrix(Z); Kruskal_Wallis(Nsamples, N, Z, H, DoF); { Compute critical values } Fc := InvSnedecor(DoF_f, DoF_r, Prob); K2c := InvKhi2(DoF, Prob); Writeln('Sample Mean St.Dev.'); Writeln('---------------------------'); for J := 1 to Nsamples do Writeln(J:6, M^[J]:10:4, S^[J]:10:4); Writeln; Writeln('Comparison of means (One-way analysis of variance):'); Writeln; Writeln('Factorial variance = ', V_f:10:4, ' (', DoF_f, ' DoF)'); Writeln('Residual variance = ', V_r:10:4, ' (', DoF_r, ' DoF)'); Writeln('Variance ratio = ', F:10:4); Writeln('Critical value (p = ', Alpha:4:2, ') = ', Fc:10:4); Writeln; Writeln('Comparison of variances:'); Writeln; Writeln('Bartlett''s Khi-2 = ', Khi2:10:4, ' (', DoF, ' DoF)'); Writeln('Critical value (p = ', Alpha:4:2, ') = ', K2c:10:4); Writeln; Writeln('Comparison of means (Non-parametric test):'); Writeln; Writeln('Kruskal-Wallis H = ', H:10:4, ' (', DoF, ' DoF)'); Writeln('Critical value (p = ', Alpha:4:2, ') = ', K2c:10:4); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/0000775000175000017500000000000011660470014021332 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/uvag.txt0000664000175000017500000003016011326434464023045 0ustar michaelmichael -288735372 620066422 656890996 -31851389 1960508036 142009603 514143789 -2107429 -1800308481 -1699363169 -473591232 -1142621326 154424346 -1287193680 1349464577 239283230 1482739267 -721447336 452726661 1190579380 1061062035 -595641077 -304148196 -415579904 -539666927 1183284213 1846533827 201571164 991854444 -1675521421 -529758722 -1230516873 1704416205 198057673 -1440946268 -735980797 1316647170 -1391191317 -1067744741 -1032529872 -620835366 -983514451 2018396996 -2034650915 -1728612224 -2087518792 1047315075 -1661175699 606270917 599792862 -1155696013 1373801371 1341489397 1213013460 1957654746 1324879829 486952443 129185128 -1441796891 -843247627 -1719945220 1803471696 829708139 222383317 1808509301 -853315928 -285646612 -912041675 -1400134876 825667450 -1184359389 -2096678096 227908829 -1875037756 4880470 -1960619431 -555914813 711233684 -2045466546 1116199672 -1379723962 -150209393 -1656464527 -122298017 -1854592656 398306950 1025572712 -463682770 1884188205 1699211440 287432606 824753486 793190871 -1236043946 877298131 -1209186320 1098626160 -1996769672 733685717 1263724751 345824283 -1371811506 334864953 -301385731 2117607145 1980024672 -1761004932 -1009340651 -795564227 -839464173 -460549772 -1091231482 1411746307 -157364707 207814538 1469977152 1311856649 -551792972 -988393891 -177744120 1970403618 -625101041 -1648045207 -1147942676 -2036954510 -1570931231 -1812700193 1926460581 -691540555 -1819682029 524015611 -2104354266 -1279382817 -966894581 916830708 -730042271 246591917 2027350344 2103431032 239761354 -503941472 -1226362160 -194807956 1206365081 -1171396889 -2030305542 -1912994125 1076603123 -571684124 1683030600 1479829785 292315932 151631996 532630254 565759005 1445481255 -1370876035 -1631616894 -1073060616 1972891037 1026765709 -1766892525 -1276701738 608262742 -532435141 105986270 1489654911 -2008345045 -1761975366 1710148380 791971501 -74351180 -1201637460 -1719340969 653084543 -1704791604 -468487310 264509028 -648601297 833978407 1445768319 -1553948802 364591000 -1146792420 -2053874503 1122008201 800670383 -1171230071 1516221383 656015272 -1687686577 -2118886633 -153582857 -212011848 1143249825 1138401598 -1690770090 -169665677 1660293526 -1941100619 -525686554 -686193863 -1145263617 -858672548 -1116075358 -2112839759 -96149114 -116213079 -976128984 1154075891 -151460575 380997851 -845520140 -548611611 -221798104 -1670114199 705953218 1451024764 1741369042 1121446700 2114494846 -907385263 -725195957 -1501072527 346696914 -272846653 -1458803631 -203591881 -2051099036 1506460382 1220467922 -789423106 -2088642632 163609642 895960252 624873685 -1476472110 -2045031283 414287886 922784909 -1001151947 993443876 -648140640 1863775843 -1430569005 296184476 -1785050085 1001575270 1491387579 -313875606 -317114224 -144416139 -804261194 1721043347 1379987718 2011312066 310231304 -1404618654 878719444 969099703 -6259379 -392535674 -813652784 829700038 47278448 -326560214 1389219422 479017699 -2096240325 -2107510534 -468914511 549726930 -1797228833 -354255985 -1679078112 1015478129 1513252749 648743528 -507776129 -1373421990 1536853107 -2136185919 1073564532 -971787099 -1644464676 1001196039 -1139652458 1977383651 -500707270 1977863040 -1182048097 1050509454 261063644 -646536167 1845375305 -2075760651 -2134830657 559086437 -1920916880 1108217264 -1303344417 1313330933 810264880 1617291142 1588450014 1638208978 -1678035851 20735793 1922392122 766498476 -628336586 -1931571809 1070182646 539295203 -77303240 -1062206291 -815659296 642858463 -1564401841 1693354483 -119038851 505898400 26893749 1229469233 -992077540 73792687 -1629700080 1862688891 1692926058 -496425499 1930363654 1739072114 -2112224176 -2081058605 -1261955521 1265545702 -674273574 423183479 1290018708 174643922 1925848100 650573107 -1896364029 631822359 -505018595 741166988 -1012429724 1372237482 556357222 1919740706 1195929823 1088624422 -780026592 391212263 767591743 -2130908724 409183169 755421029 370129504 -1042177494 47470940 -512419292 -435389645 -239454897 -747764412 -1149290964 1377568767 -402338121 -1283680893 1617681905 1323062083 1045438658 -833979730 -848837187 -236202105 -1083952578 -1032843187 844605233 1740319857 -1467633379 -202767622 297349724 995456928 -483699586 -183814681 -1178193042 1643961390 -1904319395 1925813970 -623170367 1281845654 2090486514 498640814 1528374584 -321189249 1712769522 1220770986 768359781 -1737608102 -1059667296 396152911 384609001 1515904513 -727336111 -239401145 1369007555 1975007171 445177800 398357064 -583597928 777848781 1717936091 -570496436 -70846443 947955548 46347263 991488182 43807586 1525521920 2112423297 1684033995 691940980 75403362 559249853 -1818890395 1937148483 -1698923369 -1628293907 -521130158 -1669694349 2072066787 -689735173 -462217765 -436500564 1448674617 708815457 276974596 128565484 -517541441 1134632930 572564855 563218040 845966542 -1411393523 2068644189 -929380457 1299365428 -618075493 1593687175 -362638885 -2103566098 1205724624 -2112871834 624359981 1662649652 -2124090629 68618021 -140387383 562056607 700832514 -483420660 -1638545074 -184416649 -953831404 -1418830961 1966653283 423685103 -121850745 1289463846 945638183 -176827274 -328112515 -2061502918 -36510912 -406073931 -699003804 508097093 -2013907353 -1120890986 -1152849456 -64499667 -1123377695 -894830483 -1652523801 -1247783846 938173020 -782666036 1956439682 464462946 463926335 1108215496 -1700738890 -2060973749 -1175133378 1612989163 -664249015 -388410720 -1899286742 -451286784 -1246398986 21744235 -1190315140 -1401706999 -193707251 -1680503662 -786879084 2140460492 296982879 1296409748 269426123 -2108789129 -1846477855 1793294379 1984697040 116852423 463959881 -1629418155 -2050836562 317441466 336252298 -662299334 37148973 -1412498465 1006940595 -1592299550 898976211 2073790717 671787146 284696264 -1527011806 -269932338 -1873441998 -400310276 1589231802 -534386007 348198448 -740573593 690202301 2092534986 1478153732 -259964356 -1921932283 1378541637 336429563 446648007 -460986266 -474704507 1068350388 1379007427 1517627109 817030745 -214787708 -241539116 1979044039 714802948 -1924623800 -884139943 181932989 -165166908 -501192599 204023654 1617367879 296229267 -1366015201 834005536 218737559 -1746057008 -667074756 -1229346604 -1297248966 297245887 118256395 1750304735 1142050580 -818318606 -2062777110 -904382335 -914412840 2130115925 1123659329 2098909546 1239591451 -97415983 111215982 -1672125691 1745767432 1206851028 1603053288 -1754148309 476467421 2089714779 -2081313555 -1111278941 -178113523 -1298327028 579123468 -1272559359 -1943341691 -992342863 1433207397 1951611946 4458856 -112553341 -1494041532 1280132921 -1523731343 860413728 -1881316020 656274218 1572926550 -1043416953 -315246948 1379508738 487653694 -1996179289 -1054827185 1977121579 -2120809547 -1864051860 157853526 -423886524 673009031 2071856129 517213242 743998567 -1363590650 1557755491 -412461491 -1287958028 -306707148 -686320291 -1718255644 -1136252181 1170908620 354010745 445994535 1913695283 -2061259919 -342427826 -1224463269 -957823506 196874980 -1713839257 -1405331539 1803021848 724420502 -596818689 1627671298 1311688183 -605517998 -727608897 -56370696 -1345120059 808964889 -742685804 -1945068769 -1020718703 -1248792458 915346937 -768546174 -1654130764 1006418503 -838445526 814930115 1461562745 159529326 1841010426 615615431 -483528979 1444495304 -308900524 -1939040239 508870608 -1185103901 -1914425497 1047937085 1716261027 1489601276 -405758984 1712111738 797820894 -1688459927 221302447 -168451944 -61008423 847205349 2113627624 -294371799 836644534 -879017244 -290318383 -1288399303 -895317506 398687353 421658866 392954924 1432542478 597556241 -1563847741 1138567872 -717532251 1583956231 1704081383 -520554691 -2131789457 -315630686 -1821760216 161487479 -1663882590 -81428261 -1712744840 1996414338 1768016572 -1191594058 -2111928371 1398652166 1761627480 -1086656569 -2106938168 -231248450 -1250023093 -1164689520 946813613 323879141 1827625687 1441839283 -2000678279 2021564504 -1802749610 1558803466 405093965 365824595 -531369512 236499435 -547282729 1059519473 -1408059403 -1534062784 -534947961 1152631423 -1546553973 1564834664 -794739748 -1862204009 -1376307474 1899329506 1805148048 -369475545 -51683124 741054608 -1944037904 -70085625 1429253285 -1265108978 2096049050 938874601 504128047 -1361434271 -878176241 -1983144695 12694607 1085842058 1761023085 1891906455 -700070075 -1494321608 1077887658 -1154291222 -513930985 436710108 -1172936535 616964638 -1845809059 -1580114985 1250822018 1526165025 -233611615 -1063642878 206585756 -1707856509 -1045388699 -1792246825 -161500439 -1162996637 -239120663 815750133 649143338 2016789549 53857292 -71607210 -1246901786 -919847814 261169813 -1128909900 647067783 -1924588499 -297345559 -1808702977 1146307685 -1870242467 -1786068073 -110172858 -121913045 431354937 427779812 -1935661126 842575577 472009169 -1134863367 229275880 -1613540432 1038151936 1222805411 -1466303263 -2027126958 -2093281523 -1032176149 713884405 -2024726944 1304795426 2048767157 546538749 1467109427 563081653 -757380599 -1268261014 1816271768 -814583207 -173646936 -506534256 1811873879 -1715861511 821968907 690960778 1647615630 -1380428702 -1896005516 1000080132 -1231342034 -1676355183 -995332844 1859288459 356775040 -1946007768 -34556198 1804883435 1914771257 -255383375 -677373545 -345092455 1739232610 -1763693808 1912105039 -2077629754 1855925921 -406044369 2083996910 -1688761543 1961888473 -1281633016 -57082173 -1600609424 1041421096 1113495327 1058943810 -127131775 2010447518 319830015 -1817119139 -1622986330 1099837547 1139995390 1310788984 280812824 -540253497 -1735808016 994144858 -1995322262 -1136023221 -304140801 1950219379 1622879261 1743530114 -868377628 1660967106 -931336758 2066444568 -1071548773 -354376061 1130687511 916779115 826389072 533499496 -397031301 -1821872343 -1282265802 -501744021 462371713 1017215681 -293509836 369635180 -505064016 1782325845 -82648393 1476348876 -1776648624 -1463155351 537414725 472446392 -920081454 160329326 -217624425 460567517 -2106903657 893040801 -261574330 -2021691090 1011659446 -2051336950 376946871 980297599 2134799092 471343393 399318000 366024363 -119294618 -522287216 1174578148 1912896242 1258321310 2138688869 2018206354 -55329963 -1642821413 -20651690 -902840145 833589275 1577797242 679072635 -1942177513 320222042 1195288052 1023449756 1604196330 -1855553974 -1949781618 -817719276 -1700406885 889310621 -1471514790 1020532847 -629718887 -1271695514 -1937554670 461788560 2102950303 -416406808 1078631989 1020004754 -562950235 475670268 -753909113 1909254476 -1100846535 -1501356576 1618057522 180360050 -1631962502 -1033699393 -1300167011 -1700565497 1161903681 -704031236 -1389582985 1913949679 1254539014 -1021216717 868637461 838550529 1272905945 538234140 417057615 -1031775561 -482070700 2049949948 -83768074 -877837254 -853095341 768678214 -1451589078 316521498 1520723031 794057489 818766015 461978832 353837892 1305938893 -173485360 2145076917 -619730459 mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/test_sa.pas0000664000175000017500000002046711326434464023522 0ustar michaelmichael{ ****************************************************************** Optimization by Simulated Annealing ****************************************************************** } program test_sa; uses tpmath; function Func1(X : PVector) : Float; { ------------------------------------------------------------------ Example taken from 'Numerical Recipes' True minimum is at (-2.0, +/-0.89442719) ------------------------------------------------------------------ } var A, AA, B, BB : Float; begin A := Sqr(X^[2]) * (3.0 - X^[1]) - Sqr(X^[1]) * (3.0 + X^[1]); B := 2.0 + X^[1]; AA := Sqr(A); BB := Sqr(B); Func1 := 10.0 * AA + BB / (1.0 + BB); end; function Func2(X : PVector) : Float; { ------------------------------------------------------------------ Example taken from 'Numerical Recipes' True minimum is at (0, 0, 0, 0), F = 1.0 ------------------------------------------------------------------ } const Nvar = 4; Rad = 0.3; Aug = 2.0; Wid : array[1..Nvar] of Float = (1.0, 3.0, 10.0, 30.0); var J : Integer; Q, R, Rad2, Sumd, Sumr : Float; begin Sumd := 0.0; Sumr := 0.0; Rad2 := Sqr(Rad); for J := 1 to Nvar do begin Q := X^[J] * Wid[J]; if Q >= 0 then R := Int(Q + 0.5) else R := Int(Q - 0.5); Sumr := Sumr + Sqr(Q); Sumd := Sumd + Sqr(Q - R); end; if Sumd > Rad2 then Func2 := 1.0 + Sumr * (1.0 + Aug) else Func2 := 1.0 + Sumr * (1.0 + Aug * Sumd / Rad2); end; function Func3(X : PVector) : Float; { ------------------------------------------------------------------ Rosenbrock function. True minimum is at (1, 1), F = 0 Ref: H. Rosenbrock, Comput. J., 1960, 3, 175 ------------------------------------------------------------------ } begin Func3 := 100.0 * Sqr(X^[2] - Sqr(X^[1])) + Sqr(1.0 - X^[1]); end; function Func4(X : PVector) : Float; { ------------------------------------------------------------------ Powell function. True minimum is at (0, 0, 0, 0), F = 0 Ref: M.J.D. Powell, Comput. J., 1962, 5, 147 ------------------------------------------------------------------ } begin Func4 := Sqr(X^[1] + 10.0 * X^[2]) + 5.0 * Sqr(X^[3] - X^[4]) + Sqr(Sqr(X^[2] - 2.0 * X^[3])) + 10.0 * Sqr(Sqr(X^[1] - X^[4])); end; function Func5(X : PVector) : Float; { ------------------------------------------------------------------ Another Powell function. Multiple minima at x1 = x2 = x3 = +/- Sqrt(4*n+1), n integer, F = -3 Ref: M.J.D. Powell, Comput. J., 1964, 7, 155 NB: The original reference maximizes F. Here we shall minimize -F. ------------------------------------------------------------------ } begin Func5 := - 1.0 / (1.0 + Sqr(X^[1] - X^[2])) - Sin(PiDiv2 * X^[2] * X^[3]) - Expo(- Sqr((X^[1] + X^[3]) / X^[2] - 2.0)); end; function Func6(X : PVector) : Float; { ------------------------------------------------------------------ Fletcher & Powell function. True minimum is at (1, 0, 0), F = 0 Ref: R. Fletcher & M.J.D. Powell, Comput. J., 1964, 7, 155 ------------------------------------------------------------------ } var R, Theta : Float; begin R := Pythag(X^[1], X^[2]); Theta := ArcTan2(X^[2], X^[1]) / TwoPi; Func6 := 100.0 * (Sqr(X^[3] - 10.0 * Theta) + Sqr(R - 1.0)) + Sqr(X^[3]); end; function Func7(X : PVector) : Float; { ------------------------------------------------------------------ Colville function (Extension of Rosenbrock function) True minimum is at (1, 1, 1, 1), F = 0 Ref: R. J. Van Iwaarden, PhD Thesis, U. Denver, 1996 ------------------------------------------------------------------ } begin Func7 := 100.0 * Sqr(X^[2] - Sqr(X^[1])) + Sqr(1.0 - X^[1]) + 90.0 * Sqr(X^[4] - Sqr(X^[3])) + Sqr(1.0 - X^[3]) + 10.1 * ((Sqr(X^[2] - 1.0) + Sqr(X^[4] - 1.0))) + 19.8 * (X^[2] - 1.0) * (X^[4] - 1.0); end; function Func8(X : PVector) : Float; { ------------------------------------------------------------------ Griewank function. True minimum is at (0, 0), F = 0 Ref: R. J. Van Iwaarden, PhD Thesis, U. Denver, 1996 ------------------------------------------------------------------ } begin Func8 := (Sqr(X^[1]) + Sqr(X^[2])) / 200.0 - Cos(X^[1]) * Cos(X^[2] / Sqrt2) + 1.0; end; function Func9(X : PVector) : Float; { ------------------------------------------------------------------ Chichinadze function. True minimum is at (5.90133, 0.5), F = -43.3159 Ref: R. J. Van Iwaarden, PhD Thesis, U. Denver, 1996 ------------------------------------------------------------------ } const FivePi = 15.707963267948966193; { 5 * Pi } InvSqrt5 = 0.44721359549995793928; { 1 / Sqrt(5) } begin Func9 := X^[1] * (X^[1] - 12.0) + 11.0 + 10.0 * Cos(PIDIV2 * X^[1]) + 8.0 * Sin(FivePi * X^[1]) - InvSqrt5 * Expo(- 0.5 * Sqr(X^[2] - 0.5)); end; function Func10(X : PVector) : Float; { ------------------------------------------------------------------ Rastrigin function. True minimum is at (0, 0), F = -2 Ref: R. J. Van Iwaarden, PhD Thesis, U. Denver, 1996 ------------------------------------------------------------------ } begin Func10 := Sqr(X^[1]) + Sqr(X^[2]) - Cos(12.0 * X^[1]) - Cos(18.0 * X^[2]); end; procedure Pause; begin WriteLn; Write('Press to continue'); ReadLn; WriteLn; end; const NFunc = 10; { Number of functions } MaxNvar = 4; { Maximum number of variables } const FuncName : array[1..NFunc] of String[70] = ('Numerical Recipes Example 1: Minimum at (-2.0, +/-0.89442719), F = 0 ', 'Numerical Recipes Example 2: Minimum at (0, 0, 0, 0), F = 1 ', 'Rosenbrock function: Minimum at (1, 1), F = 0 ', 'Powell function: Minimum at (0, 0, 0, 0), F = 0 ', 'Another Powell function: Minimum at x1=x2=x3= +/- Sqrt(4*n+1), F = -3', 'Fletcher & Powell function: Minimum at (1, 0, 0), F = 0 ', 'Colville function: Minimum at (1, 1, 1, 1), F = 0 ', 'Griewank function: Minimum at (0, 0), F = 0 ', 'Chichinadze function: Minimum at (5.90133, 0.5), F = -43.3159 ', 'Rastrigin function: Minimum at (0, 0), F = -2 '); const Nvar : array[1..NFunc] of Integer = (2, 4, 2, 4, 3, 3, 4, 2, 2, 2); { Number of variables } var Func : array[1..NFunc] of TFuncNVar; { Functions } X, Xmin, Xmax : PVector; { Variables and limit values } F_min : Float; { Function value at minimum } I, J : Integer; { Loop variables } begin WriteLn; { Initialize function array } Func[ 1] := {$IFDEF FPC}@{$ENDIF}Func1; Func[ 2] := {$IFDEF FPC}@{$ENDIF}Func2; Func[ 3] := {$IFDEF FPC}@{$ENDIF}Func3; Func[ 4] := {$IFDEF FPC}@{$ENDIF}Func4; Func[ 5] := {$IFDEF FPC}@{$ENDIF}Func5; Func[ 6] := {$IFDEF FPC}@{$ENDIF}Func6; Func[ 7] := {$IFDEF FPC}@{$ENDIF}Func7; Func[ 8] := {$IFDEF FPC}@{$ENDIF}Func8; Func[ 9] := {$IFDEF FPC}@{$ENDIF}Func9; Func[10] := {$IFDEF FPC}@{$ENDIF}Func10; { Allocate arrays } DimVector(X, MaxNvar); DimVector(Xmin, MaxNvar); DimVector(Xmax, MaxNvar); { Select random number generator } SetRNG(RNG_MT); for I := 1 to NFunc do begin { Initialize limits and pick starting point } for J := 1 to Nvar[I] do begin Xmin^[J] := - 10.0; Xmax^[J] := 10.0; X^[J] := Xmin^[J] + RanGen3 * (Xmax^[J] - Xmin^[J]); end; { Approximate global minimum with simulated annealing } SA_CreateLogFile('simann.txt'); SimAnn(Func[I], X, Xmin, Xmax, 1, Nvar[I], F_min); { Display results } Writeln(FuncName[I]); Writeln; for J := 1 to Nvar[I] do Writeln('X(', J, ') = ', X^[J]:12:6); Writeln; Writeln('F = ', F_min:10); Writeln; Pause; end; { Deallocate arrays } DelVector(X, MaxNvar); DelVector(Xmin, MaxNvar); DelVector(Xmax, MaxNvar); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/test_ga.pas0000664000175000017500000002033311326434464023476 0ustar michaelmichael{ ****************************************************************** Optimization by Genetic Algorithm ****************************************************************** } program test_ga; uses tpmath; function Func1(X : PVector) : Float; { ------------------------------------------------------------------ Example taken from 'Numerical Recipes' True minimum is at (-2.0, +/-0.89442719) ------------------------------------------------------------------ } var A, AA, B, BB : Float; begin A := Sqr(X^[2]) * (3.0 - X^[1]) - Sqr(X^[1]) * (3.0 + X^[1]); B := 2.0 + X^[1]; AA := Sqr(A); BB := Sqr(B); Func1 := 10.0 * AA + BB / (1.0 + BB); end; function Func2(X : PVector) : Float; { ------------------------------------------------------------------ Example taken from 'Numerical Recipes' True minimum is at (0, 0, 0, 0), F = 1.0 ------------------------------------------------------------------ } const Nvar = 4; Rad = 0.3; Aug = 2.0; Wid : array[1..Nvar] of Float = (1.0, 3.0, 10.0, 30.0); var J : Integer; Q, R, Rad2, Sumd, Sumr : Float; begin Sumd := 0.0; Sumr := 0.0; Rad2 := Sqr(Rad); for J := 1 to Nvar do begin Q := X^[J] * Wid[J]; if Q >= 0 then R := Int(Q + 0.5) else R := Int(Q - 0.5); Sumr := Sumr + Sqr(Q); Sumd := Sumd + Sqr(Q - R); end; if Sumd > Rad2 then Func2 := 1.0 + Sumr * (1.0 + Aug) else Func2 := 1.0 + Sumr * (1.0 + Aug * Sumd / Rad2); end; function Func3(X : PVector) : Float; { ------------------------------------------------------------------ Rosenbrock function. True minimum is at (1, 1), F = 0 Ref: H. Rosenbrock, Comput. J., 1960, 3, 175 ------------------------------------------------------------------ } begin Func3 := 100.0 * Sqr(X^[2] - Sqr(X^[1])) + Sqr(1.0 - X^[1]); end; function Func4(X : PVector) : Float; { ------------------------------------------------------------------ Powell function. True minimum is at (0, 0, 0, 0), F = 0 Ref: M.J.D. Powell, Comput. J., 1962, 5, 147 ------------------------------------------------------------------ } begin Func4 := Sqr(X^[1] + 10.0 * X^[2]) + 5.0 * Sqr(X^[3] - X^[4]) + Sqr(Sqr(X^[2] - 2.0 * X^[3])) + 10.0 * Sqr(Sqr(X^[1] - X^[4])); end; function Func5(X : PVector) : Float; { ------------------------------------------------------------------ Another Powell function. Multiple minima at x1 = x2 = x3 = +/- Sqrt(4*n+1), n integer, F = -3 Ref: M.J.D. Powell, Comput. J., 1964, 7, 155 NB: The original reference maximizes F. Here we shall minimize -F. ------------------------------------------------------------------ } begin Func5 := - 1.0 / (1.0 + Sqr(X^[1] - X^[2])) - Sin(PiDiv2 * X^[2] * X^[3]) - Expo(- Sqr((X^[1] + X^[3]) / X^[2] - 2.0)); end; function Func6(X : PVector) : Float; { ------------------------------------------------------------------ Fletcher & Powell function. True minimum is at (1, 0, 0), F = 0 Ref: R. Fletcher & M.J.D. Powell, Comput. J., 1964, 7, 155 ------------------------------------------------------------------ } var R, Theta : Float; begin R := Pythag(X^[1], X^[2]); Theta := ArcTan2(X^[2], X^[1]) / TwoPi; Func6 := 100.0 * (Sqr(X^[3] - 10.0 * Theta) + Sqr(R - 1.0)) + Sqr(X^[3]); end; function Func7(X : PVector) : Float; { ------------------------------------------------------------------ Colville function (Extension of Rosenbrock function) True minimum is at (1, 1, 1, 1), F = 0 Ref: R. J. Van Iwaarden, PhD Thesis, U. Denver, 1996 ------------------------------------------------------------------ } begin Func7 := 100.0 * Sqr(X^[2] - Sqr(X^[1])) + Sqr(1.0 - X^[1]) + 90.0 * Sqr(X^[4] - Sqr(X^[3])) + Sqr(1.0 - X^[3]) + 10.1 * ((Sqr(X^[2] - 1.0) + Sqr(X^[4] - 1.0))) + 19.8 * (X^[2] - 1.0) * (X^[4] - 1.0); end; function Func8(X : PVector) : Float; { ------------------------------------------------------------------ Griewank function. True minimum is at (0, 0), F = 0 Ref: R. J. Van Iwaarden, PhD Thesis, U. Denver, 1996 ------------------------------------------------------------------ } begin Func8 := (Sqr(X^[1]) + Sqr(X^[2])) / 200.0 - Cos(X^[1]) * Cos(X^[2] / Sqrt2) + 1.0; end; function Func9(X : PVector) : Float; { ------------------------------------------------------------------ Chichinadze function. True minimum is at (5.90133, 0.5), F = -43.3159 Ref: R. J. Van Iwaarden, PhD Thesis, U. Denver, 1996 ------------------------------------------------------------------ } const FivePi = 15.707963267948966193; { 5 * Pi } InvSqrt5 = 0.44721359549995793928; { 1 / Sqrt(5) } begin Func9 := X^[1] * (X^[1] - 12.0) + 11.0 + 10.0 * Cos(PIDIV2 * X^[1]) + 8.0 * Sin(FivePi * X^[1]) - InvSqrt5 * Expo(- 0.5 * Sqr(X^[2] - 0.5)); end; function Func10(X : PVector) : Float; { ------------------------------------------------------------------ Rastrigin function. True minimum is at (0, 0), F = -2 Ref: R. J. Van Iwaarden, PhD Thesis, U. Denver, 1996 ------------------------------------------------------------------ } begin Func10 := Sqr(X^[1]) + Sqr(X^[2]) - Cos(12.0 * X^[1]) - Cos(18.0 * X^[2]); end; procedure Pause; begin WriteLn; Write('Press to continue'); ReadLn; WriteLn; end; const NFunc = 10; { Number of functions } MaxNvar = 4; { Maximum number of variables } const FuncName : array[1..NFunc] of String[70] = ('Numerical Recipes Example 1: Minimum at (-2.0, +/-0.89442719), F = 0 ', 'Numerical Recipes Example 2: Minimum at (0, 0, 0, 0), F = 1 ', 'Rosenbrock function: Minimum at (1, 1), F = 0 ', 'Powell function: Minimum at (0, 0, 0, 0), F = 0 ', 'Another Powell function: Minimum at x1=x2=x3= +/- Sqrt(4*n+1), F = -3', 'Fletcher & Powell function: Minimum at (1, 0, 0), F = 0 ', 'Colville function: Minimum at (1, 1, 1, 1), F = 0 ', 'Griewank function: Minimum at (0, 0), F = 0 ', 'Chichinadze function: Minimum at (5.90133, 0.5), F = -43.3159 ', 'Rastrigin function: Minimum at (0, 0), F = -2 '); const Nvar : array[1..NFunc] of Integer = (2, 4, 2, 4, 3, 3, 4, 2, 2, 2); { Number of variables } var Func : array[1..NFunc] of TFuncNVar; { Functions } X, Xmin, Xmax : PVector; { Variables and limit values } F_min : Float; { Function value at minimum } I, J : Integer; { Loop variables } begin WriteLn; { Initialize function array } Func[ 1] := {$IFDEF FPC}@{$ENDIF}Func1; Func[ 2] := {$IFDEF FPC}@{$ENDIF}Func2; Func[ 3] := {$IFDEF FPC}@{$ENDIF}Func3; Func[ 4] := {$IFDEF FPC}@{$ENDIF}Func4; Func[ 5] := {$IFDEF FPC}@{$ENDIF}Func5; Func[ 6] := {$IFDEF FPC}@{$ENDIF}Func6; Func[ 7] := {$IFDEF FPC}@{$ENDIF}Func7; Func[ 8] := {$IFDEF FPC}@{$ENDIF}Func8; Func[ 9] := {$IFDEF FPC}@{$ENDIF}Func9; Func[10] := {$IFDEF FPC}@{$ENDIF}Func10; { Allocate arrays } DimVector(X, MaxNvar); DimVector(Xmin, MaxNvar); DimVector(Xmax, MaxNvar); { Select random number generator } SetRNG(RNG_MT); for I := 1 to NFunc do begin { Initialize limits } for J := 1 to Nvar[I] do begin Xmin^[J] := - 10.0; Xmax^[J] := 10.0; end; { Approximate global minimum with genetic algorithm } GA_CreateLogFile('genalg.txt'); GenAlg(Func[I], X, Xmin, Xmax, 1, Nvar[I], F_min); { Display results } Writeln(FuncName[I]); Writeln; for J := 1 to Nvar[I] do Writeln('X(', J, ') = ', X^[J]:12:6); Writeln; Writeln('F = ', F_min:10); Writeln; Pause; end; { Deallocate arrays } DelVector(X, MaxNvar); DelVector(Xmin, MaxNvar); DelVector(Xmax, MaxNvar); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/testuvag.pas0000664000175000017500000000116711326434464023716 0ustar michaelmichael{ ****************************************************************** Test of UVAG random number generator By Alex Hay (zenjew@hotmail.com) - Adapted to TPMath by Jean Debord This program prints 1000 random integers, computed with the default initialization. The results should be identical to file uvag.txt ****************************************************************** } program testuvag; uses tpmath; var I : Word; R : LongInt; begin SetRNG(RNG_UVAG); for I := 1 to 1000 do begin R := IRanGen; Write(R:15); if I mod 5 = 0 then Writeln; end; end.mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/testnorm.pas0000664000175000017500000000327011326434464023724 0ustar michaelmichael{ ****************************************************************** Test of Gaussian random number generator. This program picks a random sample of size N from a gaussian distribution with known mean and standard deviation (SD), estimates mean and SD from the sample, and computes a 95% confidence interval (CI) for the mean (i.e. an interval which has a probability of 0.95 to include the true mean). ****************************************************************** } program testnorm; uses tpmath; const Mu = 10.0; { Mean of Gaussian distribution } Sigma = 2.0; { Standard deviation of Gaussian distribution } N = 100; { Sample size, must be > 30 } var X : PVector; { Sample values } M, S : Float; { Sample mean & SD } Delta : Float; { Half-width of CI } M1, M2 : Float; { Bounds of CI } I : Integer; { Loop variable } begin { Select generator } SetRNG(RNG_MT); { Dimension array } DimVector(X, N); { Pick sample values } for I := 1 to N do X^[I] := RanGauss(Mu, Sigma); { Estimate mean and SD from sample } M := Mean(X, 1, N); S := StDev(X, 1, N, M); { Compute 95% CI, assuming that the sample mean is normally distributed. This requires N > 30 } Delta := 1.96 * S / Sqrt(N); M1 := M - Delta; M2 := M + Delta; { Output results } WriteLn; WriteLn('Population mean = ', Mu:10:4); WriteLn('Population SD = ', Sigma:10:4); WriteLn; WriteLn('Sample size = ', N:10); WriteLn('Sample mean = ', M:10:4); WriteLn('Sample SD = ', S:10:4); WriteLn; WriteLn('95% CI of mean = [', M1:10:4, ' , ', M2:10:4, ' ]'); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/testmwc.pas0000664000175000017500000000217011326434464023535 0ustar michaelmichael{ ****************************************************************** This program picks 20000 random numbers and displays the next 6, together with the correct values obtained with the default initialization, ****************************************************************** } program testmwc; uses tpmath; const Correct : array[1..6] of LongInt = (921625997, 1094293978, 115775252, 499820504, -1929018715, 2008943384); var I, R : LongInt; begin WriteLn; Writeln(' Test of Marsaglia random number generator'); WriteLn('---------------------------------------------'); WriteLn(' Correct Actual'); WriteLn('---------------------------------------------'); SetRNG(RNG_MWC); { Pick 20000 random numbers } for I := 1 to 20000 do R := IRanGen; { Display 6 more numbers with correct values } for I := 1 to 6 do begin R := IRanGen; Write(' ', Correct[I]:12, ' ', R:12, ' '); if Correct[I] = R then WriteLn('OK') else WriteLn('BAD'); end; WriteLn('---------------------------------------------'); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/testmt.pas0000664000175000017500000000146211326434464023372 0ustar michaelmichael{ ****************************************************************** Test of 'Mersenne Twister' random number generator This program prints 1000 random numbers, computed with the default initialization. The output of this program should be similar to file mt.txt ****************************************************************** } program testmt; uses tpmath; var I : Word; R : LongInt; X : Float; begin SetRNG(RNG_MT); Writeln('1000 outputs of IRanGen'); for I := 1 to 1000 do begin R := IRanGen; Write(R:15); if i mod 5 = 0 then Writeln; end; Writeln; Writeln('1000 outputs of RanGen2'); for I := 1 to 1000 do begin X := RanGen2; Write(X:15:8); if i mod 5 = 0 then Writeln; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/testmcmc.pas0000664000175000017500000001517711326434464023701 0ustar michaelmichael{ ****************************************************************** This program simulates a multinormal distribution by Markov Chain Monte Carlo (MCMC) using the Hastings-Metropolis algorithm. Although MCMC is best used when there is no direct way to simulate the distribution, it is used here for demonstration purposes since its results can be compared to those of the direct method (program RANMUL.PAS). The pdf P(X) of the multinormal distribution is such that: P(X) = C * Exp(- F(X) / T) where F(X) = (X - M)' * V^(-1) * (X - M) C = 1/sqrt(|V| * (2*Pi)^N) T = 2 M is the mean vector and V the variance-covariance matrix of the distribution. N is the dimension of the distribution. The constant C is not used in the simulation. The mean vector and variance-covariance matrix are stored in a data file with the following structure: Line 1 : Title of study Line 2 : Number of variables (N), e.g. 2 for binormal Line 3 to (N + 2) : Means and standard deviations Next lines : Correlation coefficients, in lower triangular matrix form The file TESTMCMC.DAT is an example data file. The results are stored in the output file TESTMCMC.TXT ****************************************************************** } program testmcmc; uses tpmath; const Temp = 2.0; { Temperature } NCycles = 10; { Number of cycles } MaxSim = 1000; { Max nb of simulations } SavedSim = 1000; { Nb of saved simulations } var Title : String; { Title of study } N : Integer; { Number of variables } M : PVector; { Mean vector of original distribution } V : PMatrix; { Variance-covariance matrix of original distribution } V_inv : PMatrix; { Inverse variance-covariance matrix } Xmat : PMatrix; { Matrix of simulated vectors } Msim : PVector; { Mean of simulated distribution } Vsim : PMatrix; { Variance-covariance matrix of simulated distrib. } X_min : PVector; { Coordinates of the minimum of F(X) = mode of simulated distribution } F_min : Float; { Value of F(X) at minimum } I : Integer; { Loop variable } function ReadParam(FileName : String; var Title : String; var N : Integer; var M : PVector; var V, V_inv : PMatrix) : Integer; var F : Text; { Data file } I, J : Integer; { Loop variables } S : PVector; { Standard deviations } R : Float; { Correlation coefficient } Det : Float; { Determinant of var-cov. matrix } begin Assign(F, FileName); Reset(F); Readln(F, Title); Readln(F, N); DimVector(M, N); DimVector(S, N); DimMatrix(V, N, N); DimMatrix(V_inv, N, N); { Read means and standard deviations. Compute variances } for I := 1 to N do begin Read(F, M^[I], S^[I]); V^[I]^[I] := Sqr(S^[I]); end; { Read correlation coefficients and compute covariances } for I := 2 to N do for J := 1 to Pred(I) do begin Read(F, R); V^[I]^[J] := R * S^[I] * S^[J]; V^[J]^[I] := V^[I]^[J]; end; { Initialize inverse var-cov. matrix } for I := 1 to N do for J := 1 to N do V_inv^[I]^[J] := V^[I]^[J]; { Compute the inverse of the variance-covariance matrix } GaussJordan(V_inv, 1, N, N, Det); ReadParam := MathErr; Close(F); DelVector(S, N); end; function ObjFunc(X : PVector) : Float; { Computes the function F(X) } var Sum1, Sum2 : Float; I, J : Integer; D : PVector; begin DimVector(D, N); for I := 1 to N do D^[I] := X^[I] - M^[I]; Sum1 := 0.0; for I := 1 to N do Sum1 := Sum1 + V_inv^[I]^[I] * Sqr(D^[I]); Sum2 := 0.0; for I := 2 to N do for J := 1 to Pred(I) do Sum2 := Sum2 + V_inv^[I]^[J] * D^[I] * D^[J]; ObjFunc := Sum1 + 2.0 * Sum2; DelVector(D, N); end; procedure WriteResults(Title : String; M : PVector; V : PMatrix; N : Integer); var I, J : Integer; S : PVector; R : Float; begin WriteLn; WriteLn(Title); WriteLn; WriteLn(' Mean S.D.'); WriteLn('--------------------'); DimVector(S, N); for I := 1 to N do begin S^[I] := Sqrt(V^[I]^[I]); Writeln(M^[I]:10:4, S^[I]:10:4); end; WriteLn; WriteLn('Correlation matrix:'); WriteLn; for I := 2 to N do begin for J := 1 to Pred(I) do begin R := V^[I]^[J] / (S^[I] * S^[J]); Write(R:10:4); end; WriteLn; end; DelVector(S, N); end; procedure WriteOutputFile(Title : String; Xmat : PMatrix; N : Integer); var F : Text; I, J : Integer; begin Assign(F, 'testmcmc.txt'); Rewrite(F); WriteLn(F, Title); Write(F, ' Iter'); for I := 1 to N do Write(F, ' X', I); WriteLn(F); for I := 1 to SavedSim do begin Write(F, I:5); for J := 1 to N do Write(F, Xmat^[I]^[J]:10:4); WriteLn(F); end; Close(F); end; begin if ReadParam('testmcmc.dat', Title, N, M, V, V_inv) = MatSing then begin WriteLn('Variance-covariance matrix is singular!'); Exit; end; DimVector(Msim, N); DimVector(X_min, N); DimMatrix(Vsim, N, N); DimMatrix(Xmat, SavedSim, N); { Select random number generator } SetRNG(RNG_MT); { Initialize Metropolis-Hastings parameters } InitMHParams(NCycles, MaxSim, SavedSim); { Initialize the mean vector and the variance-covariance matrix. For the sake of demonstration we start at a distance from the true mean and with enhanced standard deviations. } for I := 1 to N do begin Msim^[I] := 3.0 * M^[I]; Vsim^[I]^[I] := 10.0 * V^[I]^[I]; end; { Perform Metropolis-Hastings simulations } Write('Running. Please wait...'); {$IFDEF FPC} Hastings(@ObjFunc, Temp, Msim, Vsim, 1, N, Xmat, X_min, F_min); {$ELSE} Hastings(ObjFunc, Temp, Msim, Vsim, 1, N, Xmat, X_min, F_min); {$ENDIF} if MathErr = MatOk then begin WriteResults('Original distribution', M, V, N); WriteResults('Simulated distribution', Msim, Vsim, N); WriteOutputFile(Title, Xmat, N); end else WriteLn('Variance-covariance matrix is not positive definite!'); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/ranmull.pas0000664000175000017500000000674011326434464023530 0ustar michaelmichael{ ****************************************************************** This program simulates a multi-lognormal distribution. The mean vector and variance-covariance matrix are stored in a data file with the following structure: Line 1 : Name of distribution. Line 2 : Size of distribution (N), e.g. 2 for bi-lognormal Line 3 to (N + 2) : Means and standard deviations. Next lines : Correlation coefficients, in lower triangular matrix form. The file RANMULL.DAT is an example data file. The results are stored in an output file (one random vector by line) ****************************************************************** } program ranmull; uses tpmath; const NSIM = 400; { Number of simulations } var Name : String; { Name of distribution } N : Integer; { Dimension of distribution } M : PVector; { Mean vector of original lognormal distribution } V : PMatrix; { Variance-covariance matrix of original lognormal dist. } M0 : PVector; { Mean vector of auxiliary normal dist. } V0 : PMatrix; { Variance-covariance matrix of auxiliary normal dist. } L : PMatrix; { Cholesky factor of V0 } Z : PVector; { Random vector from the auxiliary normal dist. } X : PVector; { Random vector from the original lognormal dist. } F : Text; { Output file } I, J : Integer; { Loop variables } procedure ReadParam(FileName : String; var Name : String; var N : Integer; var M : PVector; var V : PMatrix); var F : Text; { Data file } I, J : Integer; { Loop variables } S : PVector; { Standard deviations } R : Float; { Correlation coefficient } begin Assign(F, FileName); Reset(F); Readln(F, Name); Readln(F, N); DimVector(M, N); DimVector(S, N); DimMatrix(V, N, N); { Read means and standard deviations. Compute variances } for I := 1 to N do begin Read(F, M^[I], S^[I]); V^[I]^[I] := Sqr(S^[I]); end; { Read correlation coefficients and compute covariances } for I := 2 to N do for J := 1 to Pred(I) do begin Read(F, R); V^[I]^[J] := R * S^[I] * S^[J]; V^[J]^[I] := V^[I]^[J]; end; Close(F); DelVector(S, N); end; begin { Read parameters of log-normal distribution LN(M, V) } ReadParam('ranmull.dat', Name, N, M, V); DimVector(X, N); DimVector(Z, N); DimVector(M0, N); DimMatrix(V0, N, N); DimMatrix(L, N, N); { Define auxiliary normal distribution N(M0, V0) } for I := 1 to N do begin for J := 1 to N do V0^[I]^[J] := Ln(V^[I]^[J] / (M^[I] * M^[J]) + 1.0); M0^[I] := Ln(M^[I]) - 0.5 * V0^[I]^[I]; end; { Perform Cholesky decomposition of variance-covariance matrix } Cholesky(V0, L, 1, N); if MathErr = MatNotPD then begin WriteLn('Variance-covariance matrix is not positive definite.'); Exit; end; SetRNG(RNG_MT); Assign(F, 'ranmull.out'); Rewrite(F); for I := 1 to NSIM do begin { Pick random vector from auxiliary normal distribution } RanMult(M0, L, 1, N, Z); { Convert to lognormal } for J := 1 to N do X^[J] := Exp(Z^[J]); { Output result to file } for J := 1 to N do Write(F, X^[J]:12:6); Writeln(F); end; Close(F); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/ranmul.pas0000664000175000017500000000527511326434464023356 0ustar michaelmichael{ ****************************************************************** This program simulates a multinormal distribution. The mean vector and the variance-covariance matrix are stored in a data file with the following structure: Line 1 : Name of distribution. Line 2 : Size of distribution (N), e.g. 2 for binormal Line 3 to (N + 2) : Means and standard deviations. Next lines : Correlation coefficients, in lower triangular matrix form. The file RANMUL.DAT is an example data file. The results are stored in an output file (one random vector by line) ****************************************************************** } program ranmul; uses tpmath; const NSIM = 100; { Number of simulations } var Name : String; { Name of distribution } N : Integer; { Size of distribution } M : PVector; { Mean vector } V : PMatrix; { Variance-covariance matrix } L : PMatrix; { Cholesky factor of V } X : PVector; { Random vector } F : Text; { Output file } I, J : Integer; { Loop variables } procedure ReadParam(FileName : String; var Name : String; var N : Integer; var M : PVector; var V : PMatrix); var F : Text; { Data file } I, J : Integer; { Loop variables } S : PVector; { Standard deviations } R : Float; { Correlation coefficient } begin Assign(F, FileName); Reset(F); Readln(F, Name); Readln(F, N); DimVector(M, N); DimVector(S, N); DimMatrix(V, N, N); { Read means and standard deviations. Compute variances } for I := 1 to N do begin Read(F, M^[I], S^[I]); V^[I]^[I] := Sqr(S^[I]); end; { Read correlation coefficients and compute covariances } for I := 2 to N do for J := 1 to Pred(I) do begin Read(F, R); V^[I]^[J] := R * S^[I] * S^[J]; V^[J]^[I] := V^[I]^[J]; end; Close(F); DelVector(S, N); end; begin ReadParam('ranmul.dat', Name, N, M, V); DimVector(X, N); DimMatrix(L, N, N); { Perform Cholesky decomposition of variance-covariance matrix } Cholesky(V, L, 1, N); if MathErr = MatNotPD then begin WriteLn('Variance-covariance matrix is not positive definite.'); Exit; end; SetRNG(RNG_MT); Assign(F, 'ranmul.out'); Rewrite(F); for I := 1 to NSIM do begin { Pick random vector } RanMult(M, L, 1, N, X); { Output result to file } for J := 1 to N do Write(F, X^[J]:12:6); Writeln(F); end; Close(F); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/randfile.pas0000664000175000017500000000150711326434464023636 0ustar michaelmichael{ ****************************************************************** This program generates a binary file of random numbers, to be used with Marsaglia's DIEHARD battery of tests (http://stat.fsu.edu/pub/diehard/) ****************************************************************** } program randfile; uses tpmath; const N = 3000000; { Generate N numbers } var I, R : LongInt; F : file of LongInt; begin { Select a generator } SetRNG(RNG_MWC); { or SetRNG(RNG_MT) or SetRNG(RNG_UVAG) } { Initialize the selected generator with the built-in generator } Randomize; InitGen(Trunc(Random * 2147483647)); { Create file } Assign(F, 'random.dat'); Rewrite(F); for I := 1 to N do begin R := IRanGen; Write(F, R); end; Close(F); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/random/mt.txt0000664000175000017500000007420411326434464022532 0ustar michaelmichael1000 outputs of IRanGen 1067595299 955945823 477289528 -187748513 -65990820 -950634582 -939387601 227628506 810200273 -1703677129 -1734706621 -1052231088 646746669 1479517882 -49495023 1143372638 -431296802 -1073945326 1773610557 1138697238 1421897700 1269916527 -1435033255 1764463362 -420075249 -329647375 72549643 -1910978366 -1694748603 -1057474916 -1502065820 725331109 605841842 271258942 715137098 -996967760 1322965544 -65388187 1395091102 -559269576 2101727825 -564679552 -1344532966 1661921839 -1399387714 -1924455817 1004092106 -2047870615 2111242379 -1057622033 -212542537 219785033 -1840927407 -585384325 835606218 -1883017413 -1559762266 756421180 -2119757592 1873865952 -1532433059 -133159442 -943867956 181129879 -1025075400 776029799 -2076805317 -1293221500 1866825872 2133627728 34862734 1191934573 -1192655942 -1378449533 1012402762 -2110135979 -37567847 -1395470158 -476872234 -1264210562 1282161629 420003642 -1968545819 -1553511579 1278020671 -550787675 271777016 -1668637278 -1734403305 -1238989596 -61439730 1228397661 -699387974 1077915006 -1899035398 1851927286 -1281283790 1999971931 -1288078334 1049781534 1488758959 -803191066 104418065 -1846699999 -1219353181 -422634696 891912190 -358419537 -2025786333 -1661512212 1047636807 -1690354919 -1585661567 1952216715 207593580 -1445069262 670771757 -2084496188 467711165 263046873 -725299381 1042291111 -431450217 1464270005 -1536645944 -504167480 -1993688572 -1188685866 7974801 -1502505660 555991332 621766759 1322453093 853629228 686962251 1455120532 957753161 1802033300 1021534190 -808919985 1902128914 -593829240 -118542633 1795608698 560858864 -557214542 -1153796298 1553553385 -927160022 711546358 -1819841793 262969859 251416325 -1314890302 1806565895 969527843 -765640123 -1558624256 -1307770562 1649016367 -2088791485 -1246792495 -632463743 -1156115684 -1634823492 1663017612 1816683231 411916003 -407505982 -1947923217 1015311755 1203592432 -2124019530 -1725546580 813872093 1105387678 1431142475 220570551 -51334581 -115375441 -1687498165 -1204354055 282341803 1734241730 1391822177 1001254810 827927915 1886687171 -359869949 -1663178582 -389804030 110554195 -1847011650 -577764321 -990174221 -555352817 -1235839828 953919171 -1704843582 1132511021 -499373617 -1506936867 982155079 -822617740 859942552 -1613959905 -1995343243 647443547 233600422 608168955 -605639843 1849778220 1608438222 -326808939 -1601989520 -1443094724 246750393 -712148668 -965314987 -258600386 1012970930 950780808 -335198552 -1756417251 191422718 -1636824921 -1018598285 -1367229812 1234200027 1920815603 -758892607 1535612501 -2110825225 -1018012242 428488088 -1916555312 -235197746 -381222555 -1562828050 64369859 -539297222 842839565 -1475072830 -1880248323 1010060670 1839715346 -1884656160 152774329 -809957816 -192865784 -1442242992 879944024 1785007662 -1546682833 1354768064 -1027182560 -2025839579 -1293726535 -1115170533 895723219 865924942 -3396359 89355264 1471026971 -180786551 -1093027545 -1427490297 -1834101236 -691092725 -2056086864 -986551128 2072246611 -1539313457 -521230048 1709066580 -12235829 -1548797126 -1462398966 433439009 -1119188564 26248366 -1743584495 183214346 -401627780 1928168445 1337157619 -865870742 -1019796396 1782047316 -30563540 1876594403 -5307724 -1071132402 1728705513 -226722562 -1427127009 1147798696 302879820 1730407747 1923824407 1180597908 1569786639 198796327 560793173 2107345620 -1588976980 -846195190 -616593141 758635715 884524671 486356516 1774865603 -413741070 -1659753689 1181121587 1508809820 -1115979055 1594193633 1235154121 326117244 -1990935871 937054774 -1607551351 -1102577956 2003740439 1823766188 -1535423894 10067710 1533252662 -162472312 82378136 420615890 -827404133 541562091 -759017432 -2017648099 -964144443 -1079313122 -181135317 -89970305 -2132718963 -1039873774 -2075878387 -1316688259 255818579 -1435618668 -1197686985 -1725246173 1861951120 -1387887217 -1575500130 998319094 -1773032169 -1890841958 259456032 2086860995 1839848496 1893547357 -1766969771 1489393124 -1434111947 76448234 -2030033261 744914583 -1708176037 1385380501 66529922 1819103258 1899300332 2098173828 1793831094 276463159 360132945 -116755238 595015228 177071838 -1494887006 1573557746 1548998935 378454223 1460534296 1116274283 -1182582233 -585205500 827999348 -714924449 1913901014 614021289 -16439273 1905177404 45407939 -996784062 1184848810 -650040966 -371331837 1627046213 -617090537 969772772 1160524753 1522441192 452369933 1527502551 832490847 1003299676 1071381111 -1403711820 973747308 -208070188 1847554542 -399315698 -2067146957 1621250941 -1413622605 -711401475 -784562798 849362119 862871471 797858058 -1427192364 -1473684684 -1022564150 -296987391 209178708 1805135652 6783381 -1471605873 792580494 -31217526 776439581 -496773473 -1441523202 -1565459822 1071873341 1329010206 1289336450 -967286538 2011491779 80157208 922428856 1158943220 1667230961 -1833944476 -1686122137 387516115 -949615386 1495629111 -196813139 -1138317683 -769268697 -160059259 446713264 2137537399 -677563784 813966752 1157943946 -560274331 1680301658 -1114568823 -785112585 -2066852684 1008102291 486805123 863791847 -1105842006 1050308116 -517625770 -3240795 844061465 1347461791 -1468485715 745465012 2055805750 -34757821 -1908274199 -1314320555 447229436 2077782664 1232942813 -271964564 1399011509 -1154397447 -1715058074 -500109825 900758066 -1407767613 1720257997 -927472365 -1626046067 955539029 -476240864 1105704962 -405760041 -2017597989 -1548482791 1761846513 -1881050512 -1609840211 -54709353 1166726899 -79751581 -1212875229 -334505350 1663304043 2087473241 -132377310 -1787656518 1579665506 767234210 970676017 492207530 1441679602 1314785090 -1032764726 -877875554 1561989210 -1283560516 1146609202 -1032646256 1374872171 1634688712 1280458888 -2064943314 419323804 -1032067496 39783310 1641619040 1700368658 -2087020668 -1723666357 -1870887530 780290914 -1579772200 -904009601 163151474 -1985432754 1860018424 555755123 280320104 1604831083 -1581944913 1728987441 -655011794 623065489 -466336349 -19488246 -778619913 -1951016101 -1864289540 635534992 -426267547 808442435 -1224323227 -12801293 2093181383 2023555632 1568662086 -872594676 -160444946 -1277987753 -1035647062 -1406936567 -1109713420 -36187653 1267304371 1022517473 815943045 929020012 -1299716278 -923684000 -686938247 2018485115 122123397 -1484298146 1411365618 1238391329 1186786476 -1138998205 -2052025986 1765554882 279121160 -15128781 1641578514 -498643281 13351065 103516986 1609694427 551411743 -1801195687 1316337047 -362316440 -105267093 463397996 -1357232230 1855616529 -1668119306 55091862 -471616085 753448970 -249921796 1274127772 1124182256 92039808 2126345552 425973257 386287896 -1705097105 1987762798 -210140323 -2122510611 -928383841 -692000643 -1916163761 -1393202863 -578038290 -584808296 -1641518141 -825224666 -1198522820 -362402643 -1699709863 318974657 -1148764812 853571438 144400272 -526558455 782634401 -2133858293 570039522 1886241521 14249488 -2064163068 1604941699 -366253961 -373024787 -2139160404 134366254 430507376 1924011722 276713377 196481886 -680156304 1610021185 1785757066 851346168 -533818653 -1376131654 -930544911 -1282682830 -559008445 -1651813404 -516359065 1164289832 205853021 -1418855065 -791569014 -1216570295 -822929375 1748894853 -1554105821 316056182 1660426908 168885906 956005527 -310612507 566521563 1001109523 1216710575 -1342682539 -460534215 -452358995 -1827614888 -320526032 -1038365551 1409353924 1329904859 -1987407003 -1169749417 -672047112 -462181612 -412601345 -1986430181 -1635812268 1450441945 -762709693 -1108643102 1225603425 1124246549 175808705 -1285824977 -1498257137 -642977189 160762750 1902254979 1698648476 1134980669 497144426 -992277961 -237481666 -691436533 -207714709 427812652 286876201 823134128 1627554964 -549402969 -1705741204 -92942802 62878473 -1019381402 -307843232 -1503190137 1916869511 -1709105391 1375038919 1403421920 60249114 -483096846 -1273469287 -1681974094 528933105 -1537605975 -953564332 -1673105596 273128190 -279715118 -1200186294 1621621288 -1957356119 1796718448 1258965619 -53054156 2138560392 -1272777073 -120786372 450094611 -1020242716 617150026 -1590306631 1469700689 1341616587 356715071 1188789960 -2016098161 1766569160 -1499070661 57824704 -1401470916 1235723989 1630694347 -367006774 428891364 1814070806 -2006967509 -169026112 -326863407 -746243246 1025597707 1404281500 2002212197 92429143 -1981023352 -1891881216 -1288786662 -732985532 1671860914 1768520622 1803542985 844848113 -1288827375 1410888995 1157749833 2125704913 1789979528 1799263423 741157179 -1889104987 767040434 -1639725906 -631547117 -2122958200 -1783036109 1680542666 231857466 1154981000 157168255 1454112128 -789095197 1929775046 -1985544946 2143329496 -1334250394 407610648 -1356859167 -1713217697 538837155 -1952338429 430543915 740188568 1937713272 -979752164 2085587024 -264201609 766054429 -777325457 689721775 1294158986 1753287754 -92365948 1974852792 33459103 -726879761 -1150289861 1686130825 -160024283 -1289228861 -695673910 426570142 754104406 -634074732 1964545167 829466833 821587464 1746693036 1006492428 1595312919 1256599985 1024482560 1897312280 -1392064095 691790057 1037515867 -1118136088 1968401055 -2121460472 1089055278 1748401123 -1353587214 968412354 1818753861 -1321766430 -419015522 1119354008 -306363157 1647155589 -2062516470 -808909285 -639183253 -535708834 847163678 1082052057 989516446 -1423425541 -1098656226 -365004218 658187585 -630022655 -2119818126 -2091258149 -1538952607 -1838493377 -404699906 1293787864 -1464619312 -1235686365 -136164776 1561677400 -1708396358 783570352 1355506163 31495586 -505529953 -954417867 2092501630 896419368 671715824 -764517215 -691413158 1055991716 -852659077 1499434728 -1164678823 -655460296 17769680 -2035225876 487032199 -67823894 -601196040 1880482820 -370156500 381462353 -277111305 -1842932353 -1558286463 -2085100911 2128986379 437874044 595759426 641721026 1636065708 -395830363 629879088 -703792790 351984326 -1656183752 -1946523015 -1953362636 2123933692 143443325 1525942256 364660499 599149312 939093251 1523003209 106601097 376589484 1346282236 1297387043 764598052 -553749185 933457002 1886424424 -1075336280 525405256 -1280731677 323149677 2038881721 -194838253 -1443252195 -1310939218 1888574695 2014194741 -779773416 -114393766 -833142933 -1652971799 -1115737051 -1392672313 -2077646840 -254115141 1784656905 -983060365 87498458 -1541995478 -1659492999 -1463751930 -612736190 -1374923403 -522037592 -1478592352 309949752 -1911208442 154870719 385111597 1191604312 1840700563 872191186 -1369418595 1310412747 2102066999 1504727249 -720668546 1191230036 -964392030 -1114675199 -755619575 681369118 -989841544 -646733699 950049240 -121709603 1760124957 512151405 681175196 580563018 1169662867 -279933742 -1607186195 699691603 -1621473108 1137221356 123599888 472658308 1053598179 1012713758 -813902453 -535506283 -313509340 -464379634 1877191791 -643970560 988064871 -779505696 -205890064 -2069819848 1249609188 -1651815433 -398763161 -1877971395 1397735321 -834941650 1000 outputs of RanGen2 0.26275443 0.49000644 0.48670464 0.60143112 0.77933125 0.19867227 0.44218740 0.53427201 0.28842173 0.78180608 0.42179002 0.70785655 0.04534773 0.19644020 0.88107718 0.73978165 0.15286910 0.57514568 0.72765211 0.44872929 0.24557914 0.12664415 0.04708246 0.40959343 0.92043116 0.36334511 0.69189126 0.64718544 0.20259889 0.13426346 0.27408121 0.54531601 0.54605807 0.38595519 0.19398270 0.55377184 0.11711170 0.55565708 0.60133577 0.91500776 0.41810699 0.72320679 0.73353705 0.42871862 0.48897234 0.69786706 0.30558809 0.56961067 0.05840445 0.40479405 0.13288060 0.45009721 0.04948447 0.70645042 0.95000959 0.37050869 0.20806991 0.69406895 0.29286390 0.99332866 0.28483914 0.25145146 0.62341941 0.92030252 0.66728160 0.09906494 0.87575460 0.47815160 0.89815952 0.93595080 0.54952478 0.83917805 0.26509902 0.11034321 0.40654701 0.42915732 0.35365931 0.68812377 0.15913428 0.78814566 0.09476081 0.77835931 0.10722542 0.18310435 0.19387186 0.53699800 0.15897714 0.67527003 0.52889304 0.36777366 0.62352068 0.41439461 0.82022990 0.94445731 0.84903686 0.24639273 0.15918367 0.42492794 0.81872642 0.27749724 0.35413832 0.26385624 0.82744211 0.41326300 0.77458185 0.72190155 0.69865383 0.81227402 0.35321225 0.34243342 0.28544200 0.21854080 0.42503892 0.32703064 0.38306297 0.97284073 0.20059042 0.98003761 0.88671694 0.10465770 0.91747204 0.97163243 0.22750808 0.15830223 0.60955369 0.14215401 0.73456345 0.45944940 0.22822249 0.90888451 0.19980355 0.76677428 0.07333635 0.89791582 0.35377858 0.26962816 0.22004885 0.40903087 0.01376506 0.87732665 0.62691640 0.21249738 0.31217908 0.87037313 0.82772374 0.64238259 0.55614811 0.24363008 0.89773267 0.44859135 0.81452454 0.61730313 0.12962618 0.83334237 0.95547255 0.60089665 0.06550662 0.10539371 0.66027624 0.63245301 0.10959939 0.54671662 0.49356286 0.07660859 0.90269560 0.95274629 0.56699735 0.35064246 0.37742744 0.04508392 0.37242982 0.79321385 0.17660627 0.18230715 0.29052073 0.98592054 0.75186266 0.43769755 0.78565487 0.97219067 0.49054882 0.63155240 0.97110470 0.48556600 0.34397623 0.62875246 0.40953202 0.99129015 0.73792727 0.29481194 0.94337770 0.46564297 0.17749118 0.05684872 0.77286897 0.29538393 0.11965356 0.72487929 0.52226018 0.99248200 0.92247006 0.41797788 0.49250134 0.73449967 0.02531508 0.60246337 0.28685622 0.84310922 0.39892996 0.90454552 0.18608407 0.80752487 0.33601319 0.04956031 0.13777550 0.32199797 0.74890696 0.98801123 0.98661910 0.01223987 0.82969635 0.81075073 0.71393155 0.23453207 0.65565705 0.08584522 0.78976728 0.47621478 0.11498701 0.73891470 0.78518540 0.96809591 0.68371914 0.87597910 0.63492176 0.16849449 0.32811466 0.06240330 0.87548956 0.77562998 0.77521910 0.24096121 0.27176757 0.63748143 0.49747138 0.42504502 0.59175241 0.71389176 0.71766512 0.81183245 0.73271221 0.71207367 0.07903312 0.27523344 0.63242613 0.81037988 0.51204835 0.21652949 0.34487594 0.64982178 0.07423142 0.95677888 0.98420169 0.03465428 0.02667473 0.96880526 0.99849733 0.55670710 0.29022476 0.53872047 0.71697212 0.70443086 0.78949326 0.31678186 0.37629474 0.42297064 0.77373097 0.34625273 0.01505586 0.50582792 0.83295971 0.41848412 0.42537226 0.41760033 0.57541125 0.21745848 0.11158698 0.50941650 0.53135554 0.21527471 0.74821915 0.13636652 0.36159918 0.76450229 0.10160194 0.85557725 0.74477500 0.57186456 0.01757096 0.12120362 0.47981062 0.19954667 0.71065616 0.63382753 0.77693186 0.09644095 0.21500764 0.54110751 0.45730081 0.41600724 0.97704678 0.76183479 0.84706971 0.57545431 0.79398385 0.43236070 0.10486023 0.98015011 0.58870451 0.95548581 0.41872718 0.88142712 0.60668643 0.51397541 0.54520355 0.43822273 0.68011940 0.07577277 0.41427606 0.80911399 0.45853475 0.73611214 0.19619891 0.19601980 0.26765372 0.08515930 0.99479057 0.61288752 0.47187699 0.82095365 0.07563608 0.90760618 0.28703383 0.93261152 0.40877651 0.34686346 0.60599030 0.22872803 0.69315490 0.16152912 0.60210518 0.56257876 0.97950688 0.97062066 0.22701157 0.98915116 0.16110261 0.10170685 0.74516994 0.62726050 0.53451185 0.40864994 0.33494878 0.44800035 0.41035206 0.64480751 0.38458997 0.03498312 0.65963215 0.05378627 0.85171349 0.78719791 0.59097957 0.50667896 0.82309622 0.37561479 0.92534520 0.41748977 0.23908457 0.91793223 0.49279792 0.37908370 0.78458072 0.09132853 0.48672190 0.78547393 0.59452165 0.39910674 0.03681109 0.87931425 0.12683489 0.06609740 0.74801549 0.02948179 0.48328855 0.16403523 0.05523786 0.25886666 0.34784685 0.36829981 0.21448906 0.34670080 0.93922919 0.70771016 0.14157936 0.75664246 0.23055695 0.36395782 0.15852932 0.49061803 0.90280575 0.89146298 0.57291005 0.47200603 0.70555729 0.09616495 0.58138254 0.95796388 0.83681125 0.83989127 0.68717090 0.03545811 0.10550838 0.36520709 0.84290701 0.22743276 0.23023855 0.84195926 0.15019733 0.52765254 0.22575740 0.82709576 0.53420866 0.76061893 0.06997511 0.78439072 0.34422744 0.27637570 0.05982168 0.56720327 0.08449067 0.21657369 0.65819609 0.08042821 0.57947911 0.90193792 0.61376012 0.38762938 0.17532159 0.21223735 0.77829114 0.54806073 0.71144026 0.08830274 0.54140071 0.93215628 0.62952729 0.44668759 0.37391019 0.48382450 0.77750768 0.40849647 0.40962737 0.09269720 0.46102026 0.99544979 0.82007095 0.12585546 0.53119821 0.35953001 0.72017528 0.55834068 0.30731217 0.03799961 0.24166948 0.27426600 0.93938444 0.04862081 0.08575513 0.65886492 0.23214332 0.61649057 0.27463977 0.35788827 0.67061997 0.16838056 0.46076133 0.57949296 0.18521946 0.39986254 0.55667410 0.62741385 0.33470977 0.13969104 0.96612929 0.60200126 0.51194925 0.60476340 0.40285217 0.81221221 0.82980614 0.96041971 0.02024973 0.55425470 0.78330912 0.10426543 0.50598243 0.47244013 0.71135841 0.28561597 0.28428734 0.13422849 0.82909934 0.94771136 0.77380750 0.64966697 0.68156268 0.15686758 0.78726350 0.47074787 0.13676171 0.46649494 0.74526295 0.58297372 0.04257548 0.53166785 0.83735355 0.65946671 0.52102971 0.96228045 0.61892296 0.83408336 0.79875681 0.79847692 0.23767569 0.52080745 0.12980060 0.58082293 0.72993106 0.75031439 0.37787525 0.95150053 0.63673441 0.13407612 0.47907688 0.02241942 0.00580158 0.56273902 0.55270283 0.27031811 0.55113352 0.74393329 0.25036441 0.87436336 0.72877652 0.09975358 0.35707591 0.38691457 0.35547165 0.86641027 0.08720133 0.95462835 0.59243817 0.82981586 0.57820411 0.75421519 0.86004706 0.10092307 0.96192412 0.86758683 0.48424170 0.58019934 0.18594024 0.95826386 0.79962317 0.29365413 0.39231296 0.99478547 0.37645944 0.73590734 0.78106737 0.25026285 0.58136314 0.29582424 0.26010628 0.32792971 0.77947652 0.22482861 0.32191216 0.96171689 0.29189752 0.46043686 0.01609668 0.38995725 0.78998963 0.05191845 0.53934737 0.33033700 0.99553013 0.48009549 0.69017594 0.48347750 0.83452066 0.37144372 0.22106301 0.21272114 0.21465963 0.38361677 0.35571283 0.23782329 0.70920458 0.84855153 0.96766817 0.52780062 0.24898344 0.53680650 0.94866557 0.27426312 0.41025891 0.75195236 0.37319953 0.13265037 0.75552148 0.77422476 0.45217406 0.89281839 0.16441573 0.59158900 0.44515992 0.57800798 0.52507888 0.89901462 0.67382573 0.62141278 0.35502334 0.69902911 0.52160210 0.94460522 0.64688742 0.18020336 0.21323733 0.10922473 0.45400380 0.49611159 0.40897777 0.91073520 0.16206647 0.82064685 0.12805003 0.00677209 0.02690101 0.37473387 0.23918362 0.89826974 0.93683919 0.30459118 0.82422684 0.51958019 0.45319576 0.48326137 0.33931735 0.19060863 0.83671416 0.18062550 0.15152380 0.83392969 0.53451730 0.45227244 0.18200635 0.35074171 0.14721009 0.01234433 0.23402047 0.50969637 0.43835057 0.30803854 0.81485260 0.70089527 0.51323282 0.09933780 0.81584602 0.70209563 0.83754800 0.18604181 0.74443049 0.69952227 0.28162632 0.60336988 0.61360736 0.73536740 0.73262256 0.17803776 0.98749791 0.24658435 0.42156640 0.06706407 0.86683221 0.49157136 0.73421374 0.95183767 0.41609720 0.35573315 0.87706276 0.27042618 0.80891908 0.90709595 0.56944866 0.11342849 0.38817388 0.08734506 0.48711323 0.64744128 0.13242656 0.37704136 0.18347125 0.34446569 0.93265239 0.75146321 0.54130111 0.84259839 0.42697368 0.90878778 0.06990338 0.26204273 0.69820348 0.16314909 0.52482844 0.56669207 0.00205581 0.76084093 0.15139159 0.91650223 0.59733904 0.06344203 0.12651696 0.17332139 0.08037374 0.97258086 0.71010758 0.55713135 0.39390629 0.60781246 0.82037450 0.57628388 0.84227964 0.92190597 0.08201860 0.27363549 0.99595133 0.36031236 0.33906769 0.31098161 0.76694195 0.64215941 0.38210306 0.03634237 0.62090720 0.32480459 0.25930318 0.81847147 0.42768077 0.51037616 0.06201727 0.38107122 0.85925856 0.35860762 0.11109408 0.20408301 0.08434977 0.42192494 0.12667915 0.25988365 0.56858761 0.86156496 0.08057195 0.63636150 0.07719713 0.09340255 0.13530602 0.72976282 0.21915530 0.91162531 0.13979565 0.59931342 0.29344045 0.60893790 0.34450224 0.73122236 0.49485593 0.23637397 0.67276368 0.63357764 0.24965804 0.14991737 0.11990341 0.91523170 0.55878239 0.55687301 0.55497131 0.92868366 0.92571090 0.75810502 0.39642955 0.80439758 0.89310223 0.61357431 0.54288255 0.73397550 0.61200634 0.35621396 0.39733974 0.87508865 0.92077265 0.18597384 0.22781399 0.69296476 0.11699087 0.81667128 0.17756410 0.50177323 0.55725176 0.29474693 0.68885238 0.56724856 0.18193156 0.92202167 0.72082041 0.78554673 0.14995708 0.37851940 0.79124547 0.11009521 0.37374537 0.55743712 0.19902994 0.31925115 0.95653873 0.87236821 0.81118709 0.02734307 0.89672836 0.88185294 0.80163915 0.67374510 0.54913278 0.40404879 0.75742801 0.08266467 0.47663209 0.29823377 0.86437958 0.65206043 0.76529938 0.72690047 0.55839021 0.34721160 0.68622435 0.87809403 0.05706977 0.99828704 0.97659049 0.74289680 0.38477595 0.57807463 0.06245739 0.23490635 0.71099431 0.63164942 0.25840044 0.16877037 0.78988183 0.94046090 0.74967434 0.30048356 0.76029740 0.80416821 0.14151867 0.02067892 0.62880774 0.35465381 0.52690525 0.69149288 0.99630295 0.29682619 0.93566145 0.50288078 0.31484193 0.53763639 0.18529083 0.51339574 0.88405386 0.80537067 0.72994703 0.94000045 0.77217985 0.03831243 0.52870435 0.36282045 0.11831306 0.59164956 0.75609707 0.57445781 0.22185784 0.40058883 0.80070608 0.44476583 0.06822213 0.71933909 0.46772793 0.30063440 0.76307906 0.81183306 0.66501252 0.05436179 0.18562285 0.73829083 0.36511559 0.07868991 0.31888344 0.70126869 0.43172350 0.16028129 0.71786948 0.28515828 0.60262106 0.85390326 0.29303876 0.13427924 0.40479631 0.81024934 0.10635447 0.06198079 0.13573813 0.41854197 0.49701497 0.33085849 0.81692291 0.51925964 0.47446405 0.48751283 0.10944293 0.63751018 0.19519957 0.18956636 0.06969015 0.96440193 0.38341765 0.86754434 0.39223647 0.89786427 0.35055280 0.62749961 0.29452122 0.39449784 0.64567830 0.95716830 0.24822309 0.78200437 0.92546044 0.67464886 0.18308746 0.15496587 0.02935411 0.62736159 0.11523955 0.31590528 0.13107864 0.89786553 0.70102294 0.03292914 0.25485590 0.09847044 0.82861691 0.62125866 0.08917183 0.57638293 0.36845380 0.79192617 0.53989733 0.02180460 0.82503407 0.14071852 0.19516575 0.24254998 0.04587026 0.98713246 0.82920155 0.58719954 0.13497059 0.04328459 0.14178757 0.95583809 0.20694291 0.35212760 0.36074305 0.83163422 0.35739792 0.09908488 0.24566046 0.22157152 mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/proba/0000775000175000017500000000000011660470014021155 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/proba/binom.pas0000664000175000017500000000170311326434464022777 0ustar michaelmichael{ ****************************************************************** This program computes the binomial distribution B(N,P). For each value of K (K = 0..N), the probability Prob(X = K) is computed from function PBinom. The cumulative probability Prob(X <= K) is computed either by direct summation or by a call to function FBinom. ****************************************************************** } program Binom; uses tpmath; const N = 10; { Number of repetitions } P = 0.4; { Probability of success } var K : Integer; PK, S : Float; begin WriteLn; WriteLn('Binomial distribution: N = ', N:3, ', P = ', P:6:4); WriteLn; WriteLn(' K Prob(K) Sum FBinom'); WriteLn('-----------------------------------'); S := 0.0; for K := 0 to N do begin PK := PBinom(N, P, K); S := S + PK; WriteLn(K:2, PK:11:4, S:11:4, FBinom(N, P, K):11:4); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/polynom/0000775000175000017500000000000011660470014021547 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/polynom/polyroot.pas0000664000175000017500000000536311326434464024162 0ustar michaelmichael{ ****************************************************************** This program solves a polynomial equation Analytical solutions are used up to degree 4, then the polynomial is solved by the method of the companion matrix. The example polynomial is: 720 - 1764 * X + 1624 * X^2 - 735 * X^3 + 175 * X^4 - 21 * X^5 + X^6 The roots are: X = 1, 2 ... 6 ****************************************************************** } program polyroot; uses tpmath; var Coef : PVector; Z : PCompVector; Deg, I, J, Nc, Nr : Integer; begin { ------------------------------------------------------------------ Define polynomial here, in the form: Coef(0) + Coef(1) * X + Coef(2) * X^2 + ... + Coef(Deg) * X^Deg ------------------------------------------------------------------ } Deg := 6; DimVector(Coef, Deg); DimCompVector(Z, Deg); Coef^[0] := 720; Coef^[1] := -1764; Coef^[2] := 1624; Coef^[3] := -735; Coef^[4] := 175; Coef^[5] := -21; Coef^[6] := 1; { ------------------------------------------------------------------ } Writeln; Writeln('Polynomial:'); Writeln; for I := 0 to Deg do if Coef^[I] <> 0 then begin if Coef^[I] > 0 then Write(' + '); if Coef^[I] < 0 then Write(' - '); Write(Abs(Coef^[I]):12:6, ' '); if I > 0 then Write('X'); if I > 1 then Write('^', I); Writeln; end; Writeln; Writeln; { Solve polynomial. Nr is the number of real roots } case Deg of 1 : Nr := RootPol1(Coef^[0], Coef^[1], Z^[1].X); 2 : Nr := RootPol2(Coef, Z); 3 : Nr := RootPol3(Coef, Z); 4 : Nr := RootPol4(Coef, Z); otherwise Nr := RootPol(Coef, Deg, Z); end; { Case when an error occurs } if Nr < 0 then begin Writeln('Error during root evaluation !'); Halt; end; { Set the small imaginary parts to zero (optional) } Nr := SetRealRoots(Deg, Z, 1.0E-8); { Sort roots: first real roots, in ascending order, then complex roots (unordered) } SortRoots(Deg, Z); { Print real roots } if Nr > 0 then begin Writeln(Nr, ' real root(s):'); Writeln; for I := 1 to Nr do Writeln('X[', I, '] = ', Z^[I].X:12:6); Writeln; end; { Print complex roots } Nc := Deg - Nr; if Nc > 0 then begin Writeln(Nc, ' complex roots:'); Writeln; for I := 1 to Nc do begin J := I + Nr; Write('X[', J, '] = ', Z^[J].X:12:6); if Z^[J].Y > 0.0 then Write(' + ') else Write(' - '); Writeln(Abs(Z^[J].Y):12:6, ' * i'); end; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/polynom/evalpoly.pas0000664000175000017500000000166711326434464024131 0ustar michaelmichael{ ****************************************************************** This program evaluates a polynomial Example polynomial is P(X) = 1 + X + 2*X^2 + 3*X^3 + 4*X^4 ****************************************************************** } program evalpoly; uses tpmath; var Coef : PVector; Deg : Integer; X, Y : Float; begin { ------------------------------------------------------------------ Define polynomial here, in the form: Coef(0) + Coef(1) * X + Coef(2) * X^2 + ... + Coef(Deg) * X^Deg ------------------------------------------------------------------ } Deg := 4; DimVector(Coef, Deg); Coef^[0] := 1; Coef^[1] := 1; Coef^[2] := 2; Coef^[3] := 3; Coef^[4] := 4; { ------------------------------------------------------------------ } repeat Write('X = '); ReadLn(X); Y := Poly(X, Coef, Deg); WriteLn('P(X) = ', Y:12:6); until X = 0; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/polynom/evalfrac.pas0000664000175000017500000000256711326434464024061 0ustar michaelmichael{ ****************************************************************** This program evaluates a rational fraction 1 + X + 2*X^2 + 3*X^3 + 4*X^4 Example fraction is F(X) = ------------------------------- 1 + 2*X - 3*X^2 + 4*X^3 - 5*X^4 ****************************************************************** } program evalfrac; uses tpmath; var Coef : PVector; Deg1, Deg2 : Integer; X, Y : Float; begin { ------------------------------------------------------------------ Define fraction here, in the form: Coef(0) + Coef(1) * X + ... + Coef(Deg1) * X^Deg1 F(X) = ----------------------------------------------------- 1 + Coef(Deg1+1) * X + ... + Coef(Deg1+Deg2) * X^Deg2 Note that the first coefficient of the denominator must be 1 ------------------------------------------------------------------ } Deg1 := 4; Deg2 := 4; DimVector(Coef, Deg1 + Deg2); Coef^[0] := 1; Coef^[1] := 1; Coef^[2] := 2; Coef^[3] := 3; Coef^[4] := 4; Coef^[5] := 2; Coef^[6] := -3; Coef^[7] := 4; Coef^[8] := -5; { ------------------------------------------------------------------ } repeat Write('X = '); ReadLn(X); Y := RFrac(X, Coef, Deg1, Deg2); WriteLn('F(X) = ', Y:12:6); until X = 0; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/optim/0000775000175000017500000000000011660470014021202 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/optim/testsimp.pas0000664000175000017500000000420311326434464023566 0ustar michaelmichael{ ****************************************************************** Minimization of a function of several variables by simplex method. Example: Rosenbrock's function: F(X, Y) = 100 * (Y - X^2)^2 + (1 - X)^2 True minimum is at (1, 1), F = 0 Ref: H. Rosenbrock, Comput. J., 1960, 3, 175 ****************************************************************** } program testsimp; uses tpmath; { ------------------------------------------------------------------ Define number of variables, number of iterations, and precision ------------------------------------------------------------------ } const Nvar = 2; { Number of variables } MaxIter = 1000; { Max number of iterations } Tol = 1.0E-6; { Required precision } { ------------------------------------------------------------------ Define the function to be minimized ------------------------------------------------------------------ } function Func(X : PVector) : Float; begin Func := 100.0 * Sqr(X^[2] - Sqr(X^[1])) + Sqr(1.0 - X^[1]); end; { ------------------------------------------------------------------ Main program ------------------------------------------------------------------ } var X : PVector; { Variables: X^[1] = X, X^[2] = Y } Fmin : Float; { Function value at minimum } I : Integer; { Loop variable } begin DimVector(X, Nvar); X^[1] := 2.0; X^[2] := 2.0; { Save Simplex iterations in a file } SaveSimplex('simplex.txt'); { Perform minimization } {$IFDEF FPC} Simplex(@Func, X, 1, Nvar, MaxIter, Tol, Fmin); {$ELSE} Simplex(Func, X, 1, Nvar, MaxIter, Tol, Fmin); {$ENDIF} if MathErr = OptNonConv then begin Write('Non-convergence!'); Halt; end; WriteLn('Minimization of Rosenbrock''s function (simplex method)'); WriteLn('------------------------------------------------------'); WriteLn; WriteLn('Coordinates of minimum:'); WriteLn; for I := 1 to Nvar do WriteLn('X(', I, ') = ', X^[I]:12:6); WriteLn; WriteLn('Function value:'); WriteLn; WriteLn('Fmin = ', Fmin); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/optim/testnewt.pas0000664000175000017500000001042011326434464023571 0ustar michaelmichael{ ****************************************************************** Minimization of a function of several variables by the Newton- Raphson method. Example: Rosenbrock's function: F(X, Y) = 100 * (Y - X^2)^2 + (1 - X)^2 ( -400 * (Y - X^2) * X - 2 + 2 * X ) Gradient: G = ( ) ( 200 * Y - 200 * X^2 ) ( 1200 * X^2 - 400 * Y + 2 -400 * X ) Hessian: H = ( ) ( -400 * X 200 ) Det(H) = 80000 * (X^2 - Y) + 400 True minimum is at (1, 1), F = 0 The inverse hessian at the minimum is: ( 1/2 1 ) ( 1 401/200 ) Ref: H. Rosenbrock, Comput. J., 1960, 3, 175 ****************************************************************** } program testnewt; uses tpmath; { ------------------------------------------------------------------ Define number of variables, number of iterations, and precision ------------------------------------------------------------------ } const Nvar = 2; { Number of variables } MaxIter = 1000; { Max number of iterations } Tol = 1.0E-6; { Required precision } { ------------------------------------------------------------------ Define the function to be minimized ------------------------------------------------------------------ } function Func(X : PVector) : Float; begin Func := 100.0 * Sqr(X^[2] - Sqr(X^[1])) + Sqr(1.0 - X^[1]); end; { ------------------------------------------------------------------ Define the subroutine which computes the gradient and hessian of the function. It is recommended to use analytical derivatives whenever possible. Otherwise you can use the alternative code provided in numhess.inc ------------------------------------------------------------------ } procedure HessGrad(X, G : PVector; H : PMatrix); var A, B, C : Float; begin C := Sqr(X^[1]); A := X^[2] - C; B := 1.0 - X^[1]; G^[1] := - 400.0 * X^[1] * A - 2.0 * B; G^[2] := 200.0 * A; H^[1]^[1] := 1200.0 * C - 400.0 * X^[2] + 2; H^[1]^[2] := - 400.0 * X^[1]; H^[2]^[1] := H^[1]^[2]; H^[2]^[2] := 200.0; end; { ------------------------------------------------------------------ Alternative code when analytical derivatives are not available ------------------------------------------------------------------ } (* {$i numhess.inc} *) { ------------------------------------------------------------------ Main program ------------------------------------------------------------------ } var X : PVector; { Variables: X^[1] = X, X^[2] = Y } G : PVector; { Gradient vector } H_inv : PMatrix; { Inverse Hessian matrix } F_min : Float; { Function value at minimum } Det : Float; { Determinant of hessian } I, J : Integer; { Loop variables } begin DimVector(X, Nvar); DimVector(G, Nvar); DimMatrix(H_inv, Nvar, Nvar); X^[1] := 2.0; X^[2] := 2.0; { Save Newton-Raphson iterations in a file } SaveNewton('newton.txt'); { Perform minimization } {$IFDEF FPC} Newton(@Func, @HessGrad, X, 1, Nvar, MaxIter, Tol, F_min, G, H_inv, Det); {$ELSE} Newton(Func, HessGrad, X, 1, Nvar, MaxIter, Tol, F_min, G, H_inv, Det); {$ENDIF} case MathErr of OptNonConv : begin Write('Non-convergence!'); Halt; end; OptSing : begin Write('Singular Hessian matrix!'); Halt; end; end; WriteLn('Minimization of Rosenbrock''s function (Newton-Raphson method)'); WriteLn('--------------------------------------------------------------'); WriteLn; WriteLn('Coordinates of minimum:'); WriteLn; for I := 1 to Nvar do WriteLn(X^[I]:12:6); WriteLn; WriteLn('Function value:'); WriteLn; WriteLn('Fmin = ', F_min); WriteLn; WriteLn('Gradient:'); WriteLn; for I := 1 to Nvar do WriteLn(G^[I]:12:6); WriteLn; WriteLn('Inverse Hessian matrix:'); WriteLn; for I := 1 to Nvar do begin for J := 1 to Nvar do Write(H_inv^[I]^[J]:12:6); WriteLn; end; WriteLn; WriteLn('Determinant of Hessian:'); WriteLn; WriteLn(Det:12:6); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/optim/testmarq.pas0000664000175000017500000001134511326434464023563 0ustar michaelmichael{ ****************************************************************** Minimization of a function of several variables by Marquardt's method. Example: Rosenbrock's function: F(X, Y) = 100 * (Y - X^2)^2 + (1 - X)^2 ( -400 * (Y - X^2) * X - 2 + 2 * X ) Gradient: G = ( ) ( 200 * Y - 200 * X^2 ) ( 1200 * X^2 - 400 * Y + 2 -400 * X ) Hessian: H = ( ) ( -400 * X 200 ) Det(H) = 80000 * (X^2 - Y) + 400 True minimum is at (1, 1), F = 0 The inverse hessian at the minimum is: ( 1/2 1 ) ( 1 401/200 ) Ref: H. Rosenbrock, Comput. J., 1960, 3, 175 ****************************************************************** } program testmarq; uses tpmath; { ------------------------------------------------------------------ Define number of variables, number of iterations, and precision ------------------------------------------------------------------ } const Nvar = 2; { Number of variables } MaxIter = 1000; { Max number of iterations } Tol = 1.0E-6; { Required precision } { ------------------------------------------------------------------ Define the function to be minimized ------------------------------------------------------------------ } function Func(X : PVector) : Float; begin Func := 100.0 * Sqr(X^[2] - Sqr(X^[1])) + Sqr(1.0 - X^[1]); end; { ------------------------------------------------------------------ Define the subroutine which computes the gradient and hessian of the function. It is recommended to use analytical derivatives whenever possible. Otherwise you can use the alternative code provided in numhess.inc ------------------------------------------------------------------ } procedure HessGrad(X, G : PVector; H : PMatrix); var A, B, C : Float; begin C := Sqr(X^[1]); A := X^[2] - C; B := 1.0 - X^[1]; G^[1] := - 400.0 * X^[1] * A - 2.0 * B; G^[2] := 200.0 * A; H^[1]^[1] := 1200.0 * C - 400.0 * X^[2] + 2; H^[1]^[2] := - 400.0 * X^[1]; H^[2]^[1] := H^[1]^[2]; H^[2]^[2] := 200.0; end; { ------------------------------------------------------------------ Alternative code when analytical derivatives are not available ------------------------------------------------------------------ } (* {$i numhess.inc} *) { ------------------------------------------------------------------ Main program ------------------------------------------------------------------ } var X : PVector; { Variables: X^[1] = X, X^[2] = Y } G : PVector; { Gradient vector } H_inv : PMatrix; { Inverse Hessian matrix } F_min : Float; { Function value at minimum } Det : Float; { Determinant of hessian } I, J : Integer; { Loop variables } begin DimVector(X, Nvar); DimVector(G, Nvar); DimMatrix(H_inv, Nvar, Nvar); X^[1] := 2.0; X^[2] := 2.0; { Save Marquardt iterations in a file } SaveMarquardt('marquard.txt'); { Perform minimization } {$IFDEF FPC} Marquardt(@Func, @HessGrad, X, 1, Nvar, MaxIter, Tol, F_min, G, H_inv, Det); {$ELSE} Marquardt(Func, HessGrad, X, 1, Nvar, MaxIter, Tol, F_min, G, H_inv, Det); {$ENDIF} { It may be useful to perform one Newton iteration at the end of Marquardt's algorithm, to ensure that the Marquardt parameter Lambda has been effectively set to zero. } {$IFDEF FPC} Newton(@Func, @HessGrad, X, 1, Nvar, 1, Tol, F_min, G, H_inv, Det); {$ELSE} Newton(Func, HessGrad, X, 1, Nvar, 1, Tol, F_min, G, H_inv, Det); {$ENDIF} case MathErr of OptNonConv : begin Write('Non-convergence!'); Halt; end; OptSing : begin Write('Singular Hessian matrix!'); Halt; end; OptBigLambda : begin Write('Too high Marquardt parameter!'); Halt; end; end; WriteLn('Minimization of Rosenbrock''s function (Marquardt''s method)'); WriteLn('----------------------------------------------------------'); WriteLn; WriteLn('Coordinates of minimum:'); WriteLn; for I := 1 to Nvar do WriteLn(X^[I]:12:6); WriteLn; WriteLn('Function value:'); WriteLn; WriteLn('Fmin = ', F_min); WriteLn; WriteLn('Gradient:'); WriteLn; for I := 1 to Nvar do WriteLn(G^[I]:12:6); WriteLn; WriteLn('Inverse Hessian matrix:'); WriteLn; for I := 1 to Nvar do begin for J := 1 to Nvar do Write(H_inv^[I]^[J]:12:6); WriteLn; end; WriteLn; WriteLn('Determinant of Hessian:'); WriteLn; WriteLn(Det:12:6); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/optim/testbfgs.pas0000664000175000017500000000745511326434464023553 0ustar michaelmichael{ ****************************************************************** Minimization of a function of several variables by the Broyden- Fletcher-Goldfarb-Shanno (BFGS) method. Example: Rosenbrock's function: F(X, Y) = 100 * (Y - X^2)^2 + (1 - X)^2 ( -400 * (Y - X^2) * X - 2 + 2 * X ) Gradient: G = ( ) ( 200 * Y - 200 * X^2 ) ( 1200 * X^2 - 400 * Y + 2 -400 * X ) Hessian: H = ( ) ( -400 * X 200 ) True minimum is at (1, 1), F = 0 The inverse hessian at the minimum is: ( 1/2 1 ) ( 1 401/200 ) Ref: H. Rosenbrock, Comput. J., 1960, 3, 175 ****************************************************************** } program testbfgs; uses tpmath; { ------------------------------------------------------------------ Define number of variables, number of iterations, and precision ------------------------------------------------------------------ } const Nvar = 2; { Number of variables } MaxIter = 1000; { Max number of iterations } Tol = 1.0E-6; { Required precision } { ------------------------------------------------------------------ Define the function to be minimized ------------------------------------------------------------------ } function Func(X : PVector) : Float; begin Func := 100.0 * Sqr(X^[2] - Sqr(X^[1])) + Sqr(1.0 - X^[1]); end; { ------------------------------------------------------------------ Define the subroutine which computes the gradient of the function. It is recommended to use analytical derivatives whenever possible. Otherwise you can use the alternative code provided in numgrad.inc ------------------------------------------------------------------ } procedure Gradient(X, G : PVector); var A, B : Float; begin A := X^[2] - Sqr(X^[1]); B := 1.0 - X^[1]; G^[1] := - 400.0 * X^[1] * A - 2.0 * B; G^[2] := 200.0 * A; end; { ------------------------------------------------------------------ Alternative code when analytical derivatives are not available ------------------------------------------------------------------ } (* {$i numgrad.inc} *) { ------------------------------------------------------------------ Main program ------------------------------------------------------------------ } var X : PVector; { Variables: X^[1] = X, X^[2] = Y } G : PVector; { Gradient vector } H_inv : PMatrix; { Inverse Hessian matrix } F_min : Float; { Function value at minimum } I, J : Integer; { Loop variables } begin DimVector(X, Nvar); DimVector(G, Nvar); DimMatrix(H_inv, Nvar, Nvar); X^[1] := 2.0; X^[2] := 2.0; { Save BFGS iterations in a file } SaveBFGS('bfgs.txt'); { Perform minimization } {$IFDEF FPC} BFGS(@Func, @Gradient, X, 1, Nvar, MaxIter, Tol, F_min, G, H_inv); {$ELSE} BFGS(Func, Gradient, X, 1, Nvar, MaxIter, Tol, F_min, G, H_inv); {$ENDIF} if MathErr = OptNonConv then begin Write('Non-convergence!'); Halt; end; WriteLn('Minimization of Rosenbrock''s function (BFGS method)'); WriteLn('----------------------------------------------------'); WriteLn; WriteLn('Coordinates of minimum:'); WriteLn; for I := 1 to Nvar do WriteLn(X^[I]:12:6); WriteLn; WriteLn('Function value:'); WriteLn; WriteLn('Fmin = ', F_min); WriteLn; WriteLn('Gradient:'); WriteLn; for I := 1 to Nvar do WriteLn(G^[I]:12:6); WriteLn; WriteLn('Inverse Hessian matrix:'); WriteLn; for I := 1 to Nvar do begin for J := 1 to Nvar do Write(H_inv^[I]^[J]:12:6); WriteLn; end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/optim/numhess.inc0000664000175000017500000000354610652636502023375 0ustar michaelmichael{ ****************************************************************** Numerical hessian and gradient ****************************************************************** } procedure HessGrad(X, G : PVector; H : PMatrix); const Eta = 1.0E-6; { Relative increment } var Delta, Xminus, Xplus, Fminus, Fplus : PVector; Temp1, Temp2, F, F2plus : Float; I, J : Integer; begin DimVector(Delta, Nvar); { Increments } DimVector(Xminus, Nvar); { X - Delta } DimVector(Xplus, Nvar); { X + Delta } DimVector(Fminus, Nvar); { F(X - Delta) } DimVector(Fplus, Nvar); { F(X + Delta) } F := Func(X); for I := 1 to Nvar do begin if X^[I] <> 0.0 then Delta^[I] := Eta * Abs(X^[I]) else Delta^[I] := Eta; Xplus^[I] := X^[I] + Delta^[I]; Xminus^[I] := X^[I] - Delta^[I]; end; for I := 1 to Nvar do begin Temp1 := X^[I]; X^[I] := Xminus^[I]; Fminus^[I] := Func(X); X^[I] := Xplus^[I]; Fplus^[I] := Func(X); X^[I] := Temp1; end; for I := 1 to Nvar do begin G^[I] := (Fplus^[I] - Fminus^[I]) / (2.0 * Delta^[I]); H^[I]^[I] := (Fplus^[I] + Fminus^[I] - 2.0 * F) / Sqr(Delta^[I]); end; for I := 1 to Pred(Nvar) do begin Temp1 := X^[I]; X^[I] := Xplus^[I]; for J := Succ(I) to Nvar do begin Temp2 := X^[J]; X^[J] := Xplus^[J]; F2plus := Func(X); H^[I]^[J] := (F2plus - Fplus^[I] - Fplus^[J] + F) / (Delta^[I] * Delta^[J]); H^[J]^[I] := H^[I]^[J]; X^[J] := Temp2; end; X^[I] := Temp1; end; DelVector(Delta, Nvar); DelVector(Xminus, Nvar); DelVector(Xplus, Nvar); DelVector(Fminus, Nvar); DelVector(Fplus, Nvar); end; mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/optim/numgrad.inc0000664000175000017500000000163510652636502023345 0ustar michaelmichael{ ****************************************************************** Numerical gradient ****************************************************************** } procedure Gradient(X, G : PVector); const Eta = 1.0E-4; { Relative increment } var I : Integer; { Loop variable } Temp : Float; { Temporary variable } Delta : Float; { Increment } Xm : Float; { X - Delta } Xp : Float; { X + Delta } Fm : Float; { F(X - Delta) } Fp : Float; { F(X + Delta) } begin for I := 1 to Nvar do begin if X^[I] <> 0.0 then Delta := Eta * Abs(X^[I]) else Delta := Eta; Xp := X^[I] + Delta; Xm := X^[I] - Delta; Temp := X^[I]; X^[I] := Xm; Fm := Func(X); X^[I] := Xp; Fp := Func(X); G^[I] := (Fp - Fm) / (2.0 * Delta); X^[I] := Temp end; end; mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/optim/minline.pas0000664000175000017500000000471511326434464023361 0ustar michaelmichael{ ****************************************************************** Minimization of a function of several variables along a line Example taken from "Numerical Recipes": Func = (X(1)-1)^2 + (X(2)-1)^2 + (X(3)-1)^2 The minimum is F = 0 at (1, 1, 1), i. e. for a step R = 1 from X = (0, 0, 0) in the direction DeltaX = (1, 1, 1) The program tries a series of directions: ( Sqrt(2) * Cos [(Pi / 2) * (I / 10)] ) DeltaX = ( Sqrt(2) * Sin [(Pi / 2) * (I / 10)] ) ( 1 ) For each pass, the location of the minimum, and the value of the function at the minimum, are printed. The minimum is at I = 5 ****************************************************************** } program minline; uses tpmath; const Nvar = 3; { Number of variables } MaxIter = 1000; { Max number of iterations } Tol = 1.0E-7; { Required precision } PiDiv20 = 0.1570796326794897; { Pi / 20 } var X : PVector; { Starting point } DeltaX : PVector; { Search direction } R : Float; { Initial step } F_min : Float; { Function value at minimum } I : Integer; { Loop variable } Z : Float; { Auxiliary variable } function Func(X : PVector) : Float; { Function to be minimized } begin Func := Sqr(X^[1] - 1.0) + Sqr(X^[2] - 1.0) + Sqr(X^[3] - 1.0); end; procedure PrintResult(I : Integer; X : PVector; F_min : Float); var J : Integer; begin Write(I:3); for J := 1 to Nvar do Write(X^[J]:12:6); WriteLn(' ', F_min); end; begin WriteLn; WriteLn(' I X(1) X(2) X(3) Fmin'); WriteLn('------------------------------------------------------------------'); DimVector(X, Nvar); DimVector(DeltaX, Nvar); for I := 0 to 10 do begin X^[1] := 0.0; X^[2] := 0.0; X^[3] := 0.0; Z := I * PiDiv20; DeltaX^[1] := Sqrt2 * Cos(Z); DeltaX^[2] := Sqrt2 * Sin(Z); DeltaX^[3] := 1.0; R := 0.1; {$IFDEF FPC} LinMin(@Func, X, DeltaX, 1, Nvar, R, MaxIter, Tol, F_min); {$ELSE} LinMin(Func, X, DeltaX, 1, Nvar, R, MaxIter, Tol, F_min); {$ENDIF} if MathErr = OptOk then PrintResult(I, X, F_min) else WriteLn('Non-convergence!'); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/0000775000175000017500000000000011660470014021661 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/test_svd.pas0000664000175000017500000000430411326434464024232 0ustar michaelmichael{ ****************************************************************** This program solves a system of linear equations (A * X = B) with a single constant vector by singular value decomposition. The system is stored in a data file with the following structure : Line 1 : dimension of the matrix (N) Following lines : first N columns = matrix last column = constant vector The file MATRIX3.DAT is an example data file with N = 4 ****************************************************************** } program test_svd; uses tpmath; procedure WriteMatrix(Title : String; A : PMatrix; N : Integer); var I, J : Integer; begin WriteLn(Title, ' :'); WriteLn; for I := 1 to N do begin for J := 1 to N do Write(A^[I]^[J]:12:6); WriteLn; end; WriteLn; end; procedure WriteVector(Title : String; V : PVector; N : Integer); var I : Integer; begin WriteLn(Title, ' :'); WriteLn; for I := 1 to N do WriteLn(V^[I]:12:6); WriteLn; end; var N : Integer; { Matrix dimension } A : PMatrix; { System matrix } B : PVector; { Constant vector } S : PVector; { Singular values } V : PMatrix; { Matrix from SVD } X : PVector; { Solution vector } F : Text; { Data file } I, J : Integer; { Loop variables } begin { Read matrix from file } Assign(F, 'matrix3.dat'); Reset(F); Read(F, N); DimMatrix(A, N, N); DimVector(B, N); for I := 1 to N do begin for J := 1 to N do Read(F, A^[I]^[J]); Read(F, B^[I]); end; Close(F); { Read and display data } WriteMatrix('System matrix', A, N); WriteVector('Constant vector', B, N); { Perform SV decomposition of A. If successful, solve system } DimVector(S, N); DimMatrix(V, N, N); SV_Decomp(A, 1, N, N, S, V); if MathErr = MatNonConv then begin WriteLn('Non-convergence!'); Halt; end; DimVector(X, N); SV_Solve(A, S, V, B, 1, N, N, X); WriteVector('Solution vector', X, N); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/test_qr.pas0000664000175000017500000000420411326434464024057 0ustar michaelmichael{ ****************************************************************** This program solves a system of linear equations (A * X = B) with a single constant vector by the QR decomposition method. The system is stored in a data file with the following structure : Line 1 : dimension of the matrix (N) Following lines : first N columns = matrix last column = constant vector The file MATRIX3.DAT is an example data file with N = 4 ****************************************************************** } program test_qr; uses tpmath; procedure WriteMatrix(Title : String; A : PMatrix; N : Integer); var I, J : Integer; begin WriteLn(Title, ' :'); WriteLn; for I := 1 to N do begin for J := 1 to N do Write(A^[I]^[J]:12:6); WriteLn; end; WriteLn; end; procedure WriteVector(Title : String; V : PVector; N : Integer); var I : Integer; begin WriteLn(Title, ' :'); WriteLn; for I := 1 to N do WriteLn(V^[I]:12:6); WriteLn; end; var N : Integer; { Matrix dimension } A : PMatrix; { System matrix } B : PVector; { Constant vector } R : PMatrix; { matrix from QR decomp. } X : PVector; { Solution vector } F : Text; { Data file } I, J : Integer; { Loop variables } begin { Read matrix from file } Assign(F, 'matrix3.dat'); Reset(F); Read(F, N); DimMatrix(A, N, N); DimVector(B, N); for I := 1 to N do begin for J := 1 to N do Read(F, A^[I]^[J]); Read(F, B^[I]); end; Close(F); { Read and display data } WriteMatrix('System matrix', A, N); WriteVector('Constant vector', B, N); { Perform QR decomposition of A. If successful, solve system } DimMatrix(R, N, N); QR_Decomp(A, 1, N, N, R); if MathErr = MatSing then begin WriteLn('Singular matrix!'); Halt; end; DimVector(X, N); QR_Solve(A, R, B, 1, N, N, X); WriteVector('Solution vector', X, N); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/test_lu.pas0000664000175000017500000000406011326434464024055 0ustar michaelmichael{ ****************************************************************** This program solves a system of linear equations (A * X = B) with a single constant vector by the LU decomposition method. The system is stored in a data file with the following structure : Line 1 : dimension of the matrix (N) Following lines : first N columns = matrix last column = constant vector The file MATRIX3.DAT is an example data file with N = 4 ****************************************************************** } program test_lu; uses tpmath; procedure WriteMatrix(Title : String; A : PMatrix; N : Integer); var I, J : Integer; begin WriteLn(Title, ' :'); WriteLn; for I := 1 to N do begin for J := 1 to N do Write(A^[I]^[J]:12:6); WriteLn; end; WriteLn; end; procedure WriteVector(Title : String; V : PVector; N : Integer); var I : Integer; begin WriteLn(Title, ' :'); WriteLn; for I := 1 to N do WriteLn(V^[I]:12:6); WriteLn; end; var N : Integer; { Matrix dimension } A : PMatrix; { System matrix } B : PVector; { Constant vector } X : PVector; { Solution vector } F : Text; { Data file } I, J : Integer; { Loop variables } begin { Read matrix from file } Assign(F, 'matrix3.dat'); Reset(F); Read(F, N); DimMatrix(A, N, N); DimVector(B, N); for I := 1 to N do begin for J := 1 to N do Read(F, A^[I]^[J]); Read(F, B^[I]); end; Close(F); { Read and display data } WriteMatrix('System matrix', A, N); WriteVector('Constant vector', B, N); { Perform LU decomposition of A. If successful, solve system } LU_Decomp(A, 1, N); if MathErr = MatSing then begin WriteLn('Singular matrix!'); Halt; end; DimVector(X, N); LU_Solve(A, B, 1, N, X); WriteVector('Solution vector', X, N); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/lineqm.pas0000664000175000017500000000417111326434464023666 0ustar michaelmichael{ ****************************************************************** This program solves a system of linear equations (A * X = B) with several constant vectors by the Gauss-Jordan method. The system is stored in a data file with the following structure : Line 1 : size of matrix (N) and number of constant vectors (P) Following lines : first N columns = matrix other columns = constant vectors The file MATRIX2.DAT is an example data file with N = 4 and P = 5 ****************************************************************** } program lineqm; uses tpmath; procedure WriteMatrix(Title : String; A : PMatrix; N : Integer; Col1, Col2 : Integer); { ------------------------------------------------------------------ Writes a matrix from Col1 to Col2 ------------------------------------------------------------------ } var I, J : Integer; begin WriteLn(Title, ' :'); WriteLn; for I := 1 to N do begin for J := Col1 to Col2 do Write(A^[I]^[J]:12:6); WriteLn; end; WriteLn; end; var A : PMatrix; { System matrix } N, M : Integer; { Matrix dimensions } D : Float; { Determinant } F : Text; { Data file } I, J : Integer; { Loop variables } begin { Read matrix from file } Assign(F, 'matrix2.dat'); Reset(F); Read(F, N, M); DimMatrix(A, N, M); for I := 1 to N do for J := 1 to M do Read(F, A^[I]^[J]); Close(F); { Read and display data } WriteMatrix('System matrix', A, N, 1, N); WriteMatrix('Constant vectors', A, N, N + 1, M); { Solve system } GaussJordan(A, 1, N, M, D); { Write results } case MathErr of MatOk : begin WriteMatrix('Inverse matrix', A, N, 1, N); WriteMatrix('Solution vectors', A, N, N + 1, M); WriteLn('Determinant = ', D:12:6); end; MatSing : WriteLn('Singular matrix!'); MatErrDim : WriteLn('Non-compatible dimensions!'); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/lineq1.pas0000664000175000017500000000413511326434464023572 0ustar michaelmichael{ ****************************************************************** This program solves a system of linear equations (A * X = B) with a single constant vector by the Gauss-Jordan method. The system is stored in a data file with the following structure : Line 1 : dimension of the matrix (N) Following lines : first N columns = matrix last column = constant vector The file MATRIX3.DAT is an example data file with N = 4 ****************************************************************** } program lineq1; uses tpmath; procedure WriteMatrix(Title : String; A : PMatrix; N : Integer); var I, J : Integer; begin WriteLn(Title, ' :'); WriteLn; for I := 1 to N do begin for J := 1 to N do Write(A^[I]^[J]:12:6); WriteLn; end; WriteLn; end; procedure WriteVector(Title : String; V : PVector; N : Integer); var I : Integer; begin WriteLn(Title, ' :'); WriteLn; for I := 1 to N do WriteLn(V^[I]:12:6); WriteLn; end; var N : Integer; { Matrix dimension } A : PMatrix; { System matrix } B : PVector; { Constant vector } D : Float; { Determinant } F : Text; { Data file } I, J : Integer; { Loop variables } begin { Read matrix from file } Assign(F, 'matrix3.dat'); Reset(F); Read(F, N); DimMatrix(A, N, N); DimVector(B, N); for I := 1 to N do begin for J := 1 to N do Read(F, A^[I]^[J]); Read(F, B^[I]); end; Close(F); { Read and display data } WriteMatrix('System matrix', A, N); WriteVector('Constant vector', B, N); { Solve system } LinEq(A, B, 1, N, D); { Write results } case MathErr of MatOk : begin WriteMatrix('Inverse matrix', A, N); WriteVector('Solution vector', B, N); WriteLn('Determinant = ', D:12:6); end; MatSing : WriteLn('Singular matrix!'); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/hilbert.pas0000664000175000017500000000746611326434464024044 0ustar michaelmichael{ ****************************************************************** This program solves a system of linear equations, of the form AX = B, by the method of Gauss-Jordan. The method is demonstrated by solving a series of Hilbert systems of increasing order. Hilbert systems have ill-conditioned matrices (i.e. with determinants close to zero), so that the matrix is considered singular for an order which depends on the numerical precision of the software. The type of real numbers is defined by the compiler directives (see UTYPES.PAS for details). The constant MachEp (defined in UTYPES.PAS) sets the numerical precision which can be obtained with each type. When the determinant falls below this value the matrix is considered singular. ****************************************************************** } program hilbert; uses tpmath; procedure HilbertSystem(N : Integer; var A : PMatrix); { ------------------------------------------------------------------ Generates the Hilbert system of order N A[1..N, 1..N] = system matrix : ( 1 1/2 1/3 1/4 ... 1/N ) ( 1/2 1/3 1/4 1/5 ... 1/(N+1) ) A = ( 1/3 1/4 1/5 1/6 ... 1/(N+2) ) ( ........................................... ) ( 1/N 1/(N+1) 1/(N+2) 1/(N+3) ... 1/(2N-1) ) A[1..N, N+1] = vector of constant terms : N A[i, N+1] = Sum A[i,j] j=1 The solution vector is X = [1 1 1 ... 1] ------------------------------------------------------------------ } var I, J, M : Integer; Sum : Float; begin { First row of matrix } A^[1]^[1] := 1.0; for J := 2 to N do A^[1]^[J] := 1.0 / J; for I := 2 to N do begin { N-th column of matrix } A^[I]^[N] := 1.0 / (N + I - 1); { Fill matrix } for J := 1 to N - 1 do A^[I]^[J] := A^[I - 1]^[J + 1]; end; { Last column = Constant vector } M := N + 1; for I := 1 to N do begin Sum := 0.0; for J := 1 to N do Sum := Sum + A^[I]^[J]; A^[I]^[M] := Sum; end; end; procedure WriteHilbertMatrix(N : Integer; A : PMatrix); var I, J, M : Integer; begin WriteLn('System matrix and constant vector :'); WriteLn; M := N + 1; for I := 1 to N do begin for J := 1 to M do Write(A^[I]^[J]:10:6); WriteLn; end; WriteLn; end; procedure WriteSolution(ErrCode, N : Integer; A : PMatrix; D : Float); var I, M : Integer; begin if ErrCode = MatSing then WriteLn('Determinant <', D:10, ' ==> Quasi-Singular Matrix !') else begin WriteLn('Solution vector :'); WriteLn; M := N + 1; for I := 1 to N do WriteLn(A^[I]^[M]:10:6); WriteLn; WriteLn('Determinant : ', D:10); end; WriteLn; Write('Press ...'); ReadLn; end; var N : Integer; { Order of the system } M : Integer; { N + 1 } ErrCode : Integer; { Error code } A : PMatrix; { System matrix } D : Float; { Determinant } begin { Initialize } N := 1; ErrCode := 0; { Main loop } while ErrCode = 0 do begin { Set system order } Inc(N); M := N + 1; { Allocate matrix } DimMatrix(A, N, M); { Generate Hilbert system of order N } HilbertSystem(N, A); WriteLn; WriteLn('HILBERT SYSTEM OF ORDER ', N); WriteLn; if N < 7 then WriteHilbertMatrix(N, A); { Solve Hilbert system } GaussJordan(A, 1, N, M, D); ErrCode := MathErr; { Write solution } WriteSolution(ErrCode, N, A, D); { Deallocate matrix so that it may be redimensioned at the next iteration } DelMatrix(A, N, M); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/eigenvec.pas0000664000175000017500000000724311326434464024171 0ustar michaelmichael{ ********************************************************************** This program computes the eigenvalues and eigenvectors of a general square matrix. The matrix is stored in a data file with the following structure : Line 1 : dimension of the matrix (N) Lines 2 to (N + 1) : matrix The file MATRIX1.DAT is an example data file with N = 4. ********************************************************************** } program eigenvec; uses tpmath; var A : PMatrix; { Matrix } N : Integer; { Dimension of matrix } Lambda : PCompVector; { Eigenvalues } V : PMatrix; { Eigenvectors } I : Integer; { Loop variable } ErrCode : Integer; { Error code } procedure ReadMatrix(FileName : String; var A : PMatrix; var N : Integer); { ---------------------------------------------------------------------- Reads matrix from file. Note that A is passed as a VAR parameter because it is dimensioned inside the procedure. ---------------------------------------------------------------------- } var F : Text; { Data file } I, J : Integer; { Loop variable } begin Assign(F, FileName); Reset(F); Read(F, N); DimMatrix(A, N, N); for I := 1 to N do for J := 1 to N do Read(F, A^[I]^[J]); Close(F); end; procedure WriteNumber(Re, Im : Float); { ---------------------------------------------------------------------- Writes a real or complex number ---------------------------------------------------------------------- } begin Write(Re:12:6); if Im = 0.0 then WriteLn else if Im > 0.0 then WriteLn(' + ', Im:12:6, ' * i') else WriteLn(' - ', -Im:12:6, ' * i') end; procedure WriteEigenValue(Lambda : PCompVector; I : Integer); { ---------------------------------------------------------------------- Writes the I-th eigenvalue ---------------------------------------------------------------------- } begin WriteLn; Write('Eigenvalue: '); WriteNumber(Lambda^[I].X, Lambda^[I].Y); end; procedure WriteEigenVector(Lambda : PCompVector; V : PMatrix; N, I : Integer); { ---------------------------------------------------------------------- Writes the I-th eigenvector ---------------------------------------------------------------------- } var K : Integer; begin WriteLn; WriteLn('Eigenvector: '); WriteLn; if Lambda^[I].Y = 0.0 then { Eigenvector is in column I of V } for K := 1 to N do WriteNumber(V^[K]^[I], 0.0) else if Lambda^[I].Y > 0.0 then { Real and imag. parts of eigenvector are in columns I and (I+1) } for K := 1 to N do WriteNumber(V^[K]^[I], V^[K]^[I+1]) else { Conjugate of eigenvector is in columns (I-1) and I } for K := 1 to N do WriteNumber(V^[K]^[I-1], - V^[K]^[I]); end; begin ReadMatrix('matrix1.dat', A, N); DimCompVector(Lambda, N); DimMatrix(V, N, N); { Compute eigenvalues and eigenvectors (A is destroyed) } EigenVect(A, 1, N, Lambda, V); { Display results } if MathErr = 0 then for I := 1 to N do begin WriteEigenValue(Lambda, I); WriteEigenVector(Lambda, V, N, I); WriteLn; Write('Press to continue...'); ReadLn; end else begin WriteLn('Unable to find eigenvalues Lambda[1] to Lambda[', -ErrCode, ']'); WriteLn('Eigenvalues Lambda[', 1 - ErrCode, '] to Lambda[', N, ']:'); for I := 1 - ErrCode to N do WriteEigenValue(Lambda, I); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/eigenval.pas0000664000175000017500000000604411326434464024174 0ustar michaelmichael{ ****************************************************************** This program computes the eigenvalues of a general square matrix (see EIGENSYM.PAS for a symmetric matrix). The matrix is stored in a data file with the following structure : Line 1 : dimension of the matrix (N) Lines 2 to (N + 1) : matrix The file MATRIX1.DAT is an example data file with N = 4 ****************************************************************** } program eigenval; uses tpmath; var A : PMatrix; { Matrix } N : Integer; { Dimension of matrix } Lambda : PCompVector; { Eigenvalues } I : Integer; { Loop variable } ErrCode : Integer; { Error code } procedure ReadMatrix(FileName : String; var A : PMatrix; var N : Integer); { ---------------------------------------------------------------------- Reads matrix from file. Note that A is passed as a VAR parameter because it is dimensioned inside the procedure. ---------------------------------------------------------------------- } var F : Text; { Data file } I, J : Integer; { Loop variable } begin Assign(F, FileName); Reset(F); Read(F, N); DimMatrix(A, N, N); for I := 1 to N do for J := 1 to N do Read(F, A^[I]^[J]); Close(F); end; procedure WriteMatrix(Title : String; A : PMatrix; N : Integer); { ---------------------------------------------------------------------- Writes matrix on screen ---------------------------------------------------------------------- } var I, J : Integer; begin WriteLn; WriteLn(Title, ':'); WriteLn; for I := 1 to N do begin for J := 1 to N do Write(A^[I]^[J]:12:6); WriteLn; end; WriteLn; end; procedure WriteEigenValue(Lambda : PCompVector; I : Integer); { ---------------------------------------------------------------------- Writes the I-th eigenvalue ---------------------------------------------------------------------- } begin if Lambda^[I].Y = 0.0 then WriteLn(Lambda^[I].X:12:6) else begin Write(Lambda^[I].X:12:6); if Lambda^[I].Y > 0.0 then Write(' + ') else Write(' - '); WriteLn(Abs(Lambda^[I].Y):12:6, ' * i'); end; end; begin { Read matrix from file } ReadMatrix('matrix1.dat', A, N); WriteMatrix('Original matrix', A, N); { Dimension the vector containing the eigenvalues } DimCompVector(Lambda, N); { Compute eigenvalues } EigenVals(A, 1, N, Lambda); ErrCode := MathErr; if ErrCode = 0 then begin WriteLn('Eigenvalues:'); WriteLn; for I := 1 to N do WriteEigenValue(Lambda, I); end else begin WriteLn('Unable to find eigenvalues Lambda[1] to Lambda[', -ErrCode, ']'); WriteLn('Eigenvalues Lambda[', 1 - ErrCode, '] to Lambda[', N, ']:'); for I := 1 - ErrCode to N do WriteEigenValue(Lambda, I); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/eigensym.pas0000664000175000017500000000742311326434464024224 0ustar michaelmichael{ ****************************************************************** This program computes the eigenvalues and eigenvectors of a symmetric matrix by the iterative method of Jacobi. The method is demonstrated with Hilbert matrices. These matrices are ill-conditioned (i.e. the ratio of the lowest to the highest eigenvalue is very low). The Jacobi method applies a series of rotations to the original matrix in order to transform it into a diagonal matrix. The diagonal terms of this matrix are the eigenvalues. The product of the rotation matrices gives the eigenvectors. The original matrix is destroyed during the process. The parameter Tol defines the tolerance with which an off-diagonal element of the transformed matrix is considered zero (expressed as a fraction of the sum of squared diagonal terms). The parameter MaxIter defines the maximal number of iterations allowed. These two values are linked, i.e. decreasing Tol may need increasing MaxIter to avoid non-convergence of the Jacobi procedure. ****************************************************************** } program eigensym; uses tpmath; const MaxIter = 1000; { Maximum number of iterations } Tol = 1.0E-8; { Required precision } var N : Integer; { Size of matrix } A : PMatrix; { Matrix } Lambda : PVector; { Eigenvalues } V : PMatrix; { Eigenvectors } procedure Hilbert(A : PMatrix; N : Integer); { ------------------------------------------------------------------ Generates the Hilbert matrix of order N ( 1 1/2 1/3 1/4 ... 1/N ) ( 1/2 1/3 1/4 1/5 ... 1/(N+1) ) A = ( 1/3 1/4 1/5 1/6 ... 1/(N+2) ) ( ........................................... ) ( 1/N 1/(N+1) 1/(N+2) 1/(N+3) ... 1/(2N-1) ) ------------------------------------------------------------------ } var I, J : Integer; begin { First row of matrix } A^[1]^[1] := 1.0; for J := 2 to N do A^[1]^[J] := 1.0 / J; for I := 2 to N do begin { Last column of matrix } A^[I]^[N] := 1.0 / (N + I - 1); { Fill matrix } for J := 1 to N - 1 do A^[I]^[J] := A^[I - 1]^[J + 1]; end; end; procedure WriteResults(N : Integer; V : PMatrix; Lambda : PVector); { ------------------------------------------------------------------ Outputs results to screen ------------------------------------------------------------------ } var I, J : Integer; Ch : Char; begin WriteLn; WriteLn('Eigenvalues :'); WriteLn; for I := 1 to N do WriteLn(Lambda^[I]:26); if N < 8 then begin WriteLn; WriteLn('Eigenvectors (columns) :'); WriteLn; for I := 1 to N do begin for J := 1 to N do Write(V^[I]^[J]:10:6); WriteLn; end; end; end; begin repeat WriteLn; Write('Order of Hilbert matrix (1 to end) : '); ReadLn(N); if N > 1 then begin { Allocate vectors and matrices } DimMatrix(A, N, N); DimMatrix(V, N, N); DimVector(Lambda, N); { Generate Hilbert matrix of order N } Hilbert(A, N); { Compute eigenvalues and eigenvectors } Jacobi(A, 1, N, MaxIter, Tol, Lambda, V); case MathErr of MatOk : WriteResults(N, V, Lambda); MatNonConv : WriteLn('Too many iterations!'); end; { Deallocate vectors and matrices so that they may be redimensioned at the next iteration } DelMatrix(A, N, N); DelMatrix(V, N, N); DelVector(Lambda, N); end; until N < 2; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/detinv.pas0000664000175000017500000000460111326434464023670 0ustar michaelmichael{ ****************************************************************** This program computes the determinant and inverse of a square matrix. The matrix is stored in a data file with the following structure : Line 1 : dimension of the matrix (N) Lines 2 to (N + 1) : matrix The file MATRIX1.DAT is an example data file with N = 4 ****************************************************************** } program detinv; uses tpmath; procedure WriteMatrix(Title : String; A : PMatrix; N : Integer); { ------------------------------------------------------------------ Writes a matrix ------------------------------------------------------------------ } var I, J : Integer; begin WriteLn(Title, ' :'); WriteLn; for I := 1 to N do begin for J := 1 to N do Write(A^[I]^[J]:12:6); WriteLn; end; WriteLn; end; procedure WriteMatrixDet(Title : String; A : PMatrix; N : Integer; D : Float); { ------------------------------------------------------------------ Writes a matrix and its determinant ------------------------------------------------------------------ } begin WriteLn('Determinant = ', D:12:6); WriteLn; WriteMatrix(Title, A, N); end; var F : Text; { Data file } N : Integer; { Size of matrix } A : PMatrix; { Matrix } D1, D2 : Float; { Determinants } I, J : Integer; { Loop variable } begin { Read matrix from file } Assign(F, 'matrix1.dat'); Reset(F); Read(F, N); DimMatrix(A, N, N); for I := 1 to N do for J := 1 to N do Read(F, A^[I]^[J]); Close(F); { Write matrix } WriteMatrix('Original matrix', A, N); { Compute inverse matrix and determinant } GaussJordan(A, 1, N, N, D1); case MathErr of MatOk : begin WriteMatrixDet('Inverse matrix', A, N, D1); { Reinvert matrix. D2 = 1/D1 } GaussJordan(A, 1, N, N, D2); if MathErr = MatOk then WriteMatrixDet('Reinverted inverse matrix', A, N, D2); WriteLn('Product of determinants = ', (D1 * D2):12:6); end; MatSing : Write('Singular matrix!'); MatErrDim : Write('Non-compatible dimensions!'); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/matrices/cholesk.pas0000664000175000017500000000544611326434464024037 0ustar michaelmichael{ ****************************************************************** This program computes the Cholesky factorization of a symmetric positive definite matrix. The matrix is stored in a data file with the following structure : Line 1 : dimension of the matrix (N) Lines 2 to (N + 1) : matrix The file MATRIX4.DAT is an example data file with N = 3 ****************************************************************** } program cholesk; uses tpmath; var A, L : PMatrix; { Matrix and its Cholesky factor } B : PMatrix; { Product L * L' } N : Integer; { Dimension of matrix } procedure ReadMatrix(FileName : String; var A : PMatrix; var N : Integer); { ------------------------------------------------------------------ Reads matrix from file. Note that A is passed as a VAR parameter because it is dimensioned inside the procedure. ------------------------------------------------------------------ } var F : Text; { Data file } I, J : Integer; { Loop variables } begin Assign(F, FileName); Reset(F); Read(F, N); DimMatrix(A, N, N); for I := 1 to N do for J := 1 to N do Read(F, A^[I]^[J]); Close(F); end; procedure WriteMatrix(Title : String; A : PMatrix; N : Integer); { ------------------------------------------------------------------ Writes matrix on screen ------------------------------------------------------------------ } var I, J : Integer; begin WriteLn(#10, Title, ' :', #10); for I := 1 to N do begin for J := 1 to N do Write(A^[I]^[J]:12:6); WriteLn; end; end; procedure MulMat(L : PMatrix; N : Integer; B : PMatrix); { ------------------------------------------------------------------ Computes the product B = L * L' ------------------------------------------------------------------ } var I, J, K : Integer; M : Float; begin for I := 1 to N do for J := 1 to I do begin M := 0.0; for K := 1 to J do M := M + L^[I]^[K] * L^[J]^[K]; B^[I]^[J] := M; if I <> J then B^[J]^[I] := M; end; end; begin { Read matrix A from file } ReadMatrix('matrix4.dat', A, N); WriteMatrix('Original matrix', A, N); { Dimension other matrices } DimMatrix(L, N, N); DimMatrix(B, N, N); { Perform Cholesky factorization, then compute the product L * L' which must be equal to the original matrix } Cholesky(A, L, 1, N); case MathErr of MatOk : begin WriteMatrix('Cholesky factor (L)', L, N); MulMat(L, N, B); WriteMatrix('Product L * L''', B, N); end; MatNotPD : Write('Matrix not positive definite'); end; WriteLn; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/integral/0000775000175000017500000000000011660470014021657 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/integral/trap.pas0000664000175000017500000000175611326434464023353 0ustar michaelmichael{ ****************************************************************** This program computes the area under an experimental curve by the trapezoidal rule. The result is compared with the exact value. Data are generated with the function exp(-x) for x = 0..1 The exact integral is: (1 | exp(-x) dx = 1 - exp(-1) ~ 0.6321 )0 ****************************************************************** } program Trap; uses tpmath; const N = 10; var X, Y : PVector; I : Integer; begin DimVector(X, N); DimVector(Y, N); for I := 0 to N do begin X^[I] := 0.1 * I; Y^[I] := Exp(- X^[I]); end; WriteLn(' X Y'); WriteLn('--------------------'); for I := 0 to N do WriteLn(X^[I]:10:4, Y^[I]:10:4); WriteLn('--------------------'); WriteLn; WriteLn('Area under curve:'); WriteLn; WriteLn('TrapInt: ', TrapInt(X, Y, N):10:4); WriteLn('Exact : ', 1.0 - Exp(- 1.0):10:4); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/integral/test_rkf.pas0000664000175000017500000001334711326434464024225 0ustar michaelmichael{ ****************************************************************** Integrate a System of Ordinary Differential Equations By the Runge-Kutta-Fehlberg method (double precision) ----------------------------------------------------------------- REFERENCE: H A Watts and L F Shampine, Sandia Laboratories, Albuquerque, New Mexico. ----------------------------------------------------------------- Basic Release 1.1 By J-P Moreau, Paris. TPMath adaptation by J. Debord Release 1.1: added test #3. ****************************************************************** } program test_rkf; uses crt, tpmath; procedure DiffEq1(T : Float; Y, Yp : PVector); { Differential equation for Test 1 } begin Yp^[1] := 0.25 * Y^[1] * (1 - Y^[1] / 20); end; function Yexact1(T : Float) : Float; { Exact solution of the ODE for Test 1 } begin Yexact1 := 20 / (1 + 19 * Exp(- 0.25 * T)); end; procedure DiffEq2(T : Float; Y, Yp : PVector); { Differential equations for Test 2 } begin Yp^[1] := Y^[2]; Yp^[2] := - Y^[1]; end; procedure Yexact2(T : Float; var Y1, Y2 : Float); { Exact solution of the ODE's for Test 2 } begin Y1 := Cos(T); Y2 := - Sin(T); end; procedure DiffEq3(T : Float; Y, Yp : PVector); { Differential equations for Test 3 } begin Yp^[1] := Y^[2]; Yp^[2] := Y^[3]; Yp^[3] := Y^[4]; Yp^[4] := Y^[5]; Yp^[5] := (45 * Y^[3] * Y^[4] * Y^[5] - 40 * Y^[4] * Sqr(Y^[4])) / (9 * Sqr(Y^[3])); end; var { Global variables used by all test procedures } Neqn : Integer; { Number of equations } Y, Yp : PVector; { Functions and derivatives } Tstart, Tstop : Float; { Integration interval } Nstep : Integer; { Number of steps } StepSize : Float; { Step size } AbsErr, RelErr : Float; { Abs. and relative errors } Flag : Integer; { Error flag } T, Tout : Float; { Integration times } I : Integer; { Loop variable } procedure Test1; var Yc : Float; { Exact solution } begin Neqn := 1; DimVector(Y, Neqn); DimVector(Yp, Neqn); Y^[1] := 1; { Initial condition } Tstart := 0; Tstop := 20; Nstep := 5; StepSize := (Tstop - Tstart) / Nstep; AbsErr := 1.0E-6; RelErr := 1.0E-6; Flag := 1; T := Tstart; WriteLn; WriteLn('TEST01'); WriteLn('Solve a scalar equation:'); WriteLn; WriteLn(' Y'' = 0.25 * Y * ( 1 - Y / 20 )'); WriteLn; WriteLn(' T Y Y exact Error'); WriteLn; Yc := Yexact1(T); WriteLn(T:5:2, Y^[1]:14:4, Yc:14:4, (Y^[1] - Yc):14:4); for I := 1 to Nstep do begin Tout := T + StepSize; {$IFDEF FPC} RKF45(@DiffEq1, Neqn, Y, Yp, T, Tout, RelErr, AbsErr, Flag); {$ELSE} RKF45(DiffEq1, Neqn, Y, Yp, T, Tout, RelErr, AbsErr, Flag); {$ENDIF} Yc := Yexact1(Tout); WriteLn(T:5:2, Y^[1]:14:4, Yc:14:4, (Y^[1] - Yc):14:4); T := Tout; end; DelVector(Y, Neqn); DelVector(Yp, Neqn); end; procedure Test2; var Yc1, Yc2 : Float; { Exact solution } begin Neqn := 2; DimVector(Y, Neqn); DimVector(Yp, Neqn); Y^[1] := 1; { Initial conditions } Y^[2] := 0; Tstart := 0; Tstop := 2 * Pi; Nstep := 12; StepSize := (Tstop - Tstart) / Nstep; AbsErr := 1.0E-6; RelErr := 1.0E-6; Flag := 1; T := Tstart; WriteLn; WriteLn('TEST02'); WriteLn('Solve a vector equation:'); WriteLn; WriteLn(' Y''(1) = Y(2)'); WriteLn(' Y''(2) = - Y(1)'); WriteLn; WriteLn(' T Y1 Y1 exact Y2 Y2 exact'); WriteLn; Yexact2(T, Yc1, Yc2); WriteLn(T:5:2, Y^[1]:14:4, Yc1:14:4, Y^[2]:14:4, Yc2:14:4); for I := 1 to Nstep do begin Tout := T + StepSize; {$IFDEF FPC} RKF45(@DiffEq2, Neqn, Y, Yp, T, Tout, RelErr, AbsErr, Flag); {$ELSE} RKF45(DiffEq2, Neqn, Y, Yp, T, Tout, RelErr, AbsErr, Flag); {$ENDIF} Yexact2(Tout, Yc1, Yc2); WriteLn(T:5:2, Y^[1]:14:4, Yc1:14:4, Y^[2]:14:4, Yc2:14:4); T := Tout; end; DelVector(Y, Neqn); DelVector(Yp, Neqn); end; procedure Test3; begin Neqn := 5; DimVector(Y, Neqn); DimVector(Yp, Neqn); Y^[1] := 1; { Initial conditions } Y^[2] := 1; Y^[3] := 1; Y^[4] := 1; Y^[5] := 1; Tstart := 0; Tstop := 1.5; Nstep := 11; StepSize := (Tstop - Tstart) / Nstep; AbsErr := 1.0E-6; RelErr := 1.0E-6; Flag := 1; T := Tstart; WriteLn; WriteLn('TEST03'); WriteLn('Solve a vector equation:'); WriteLn; WriteLn(' Y''(1) = Y(2)'); WriteLn(' Y''(2) = Y(3)'); WriteLn(' Y''(3) = Y(4)'); WriteLn(' Y''(4) = Y(5)'); WriteLn(' Y''(5) = (45 * Y(3) * Y(4) * Y(5) - 40 * Y(4)^3) / (9 * Y(3)^2)'); WriteLn; WriteLn(' T Y1 Y2 Y3 Y4 Y5'); WriteLn; WriteLn(T:5:2, Y^[1]:14:4, Y^[2]:14:4, Y^[3]:14:4, Y^[4]:14:4, Y^[5]:14:4); for I := 1 to Nstep do begin Tout := T + StepSize; {$IFDEF FPC} RKF45(@DiffEq3, Neqn, Y, Yp, T, Tout, RelErr, AbsErr, Flag); {$ELSE} RKF45(DiffEq3, Neqn, Y, Yp, T, Tout, RelErr, AbsErr, Flag); {$ENDIF} WriteLn(T:5:2, Y^[1]:14:4, Y^[2]:14:4, Y^[3]:14:4, Y^[4]:14:4, Y^[5]:14:4); T := Tout; end; DelVector(Y, Neqn); DelVector(Yp, Neqn); end; procedure Pause; var Ch : Char; begin Writeln; Write('Press a key to continue'); Ch := ReadKey; Writeln; Writeln; end; begin WriteLn; WriteLn('PROGRAM TEST_RKF'); WriteLn('Demonstrate the RKF45 ODE integrator.'); Test1; Pause; Test2; Pause; Test3; Pause; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/integral/gauss.pas0000664000175000017500000000220111326434464023511 0ustar michaelmichael{ ****************************************************************** This program computes an integral by the Gauss-Legendre method. The result is compared with the analytical solution. The example function is: F(x) = x * exp(-x) The analytical solution is: (x G(x) = | F(t) dt = 1 - (x + 1) * exp(-x) )0 ****************************************************************** } program Gauss; uses tpmath; function F(X : Float) : Float; { Function to integrate } begin F := X * Exp(-X); end; function G(X : Float) : Float; { Integral } begin G := 1 - (X + 1) * Exp(-X); end; const N = 10; var X, Y : array[0..N] of Float; I : Integer; begin X[0] := 0.0; Y[0] := 0.0; for I := 1 to N do begin X[I] := I; {$IFDEF FPC} Y[I] := GausLeg0(@F, X[I]); {$ELSE} Y[I] := GausLeg0(F, X[I]); { or GausLeg(F, 0, X[I]) } {$ENDIF} end; WriteLn(' X GausLeg Exact'); WriteLn('------------------------------'); for I := 0 to N do WriteLn(X[I]:10:4, Y[I]:10:4, G(X[I]):10:4); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/integral/conv.pas0000664000175000017500000000233311326434464023342 0ustar michaelmichael{ ****************************************************************** This program computes the convolution product H of two functions F and G by the Gauss-Legendre method. The result is compared with the analytical solution. The example functions are: F(x) = x * exp(-x) G(x) = exp(-2 * x) The analytical solution is: H(x) = (F * G)(x) = (x - 1) * exp(-x) + exp(-2 * x) ****************************************************************** } program Conv; uses tpmath; function F(X : Float) : Float; begin F := X * Exp(-X); end; function G(X : Float) : Float; begin G := Exp(- 2 * X); end; function H(X : Float) : Float; var E : Float; begin E := Exp(-X); H := ((X - 1) + E) * E; end; const N = 10; var X, Y : array[0..N] of Float; I : Integer; begin X[0] := 0.0; Y[0] := 0.0; for I := 1 to N do begin X[I] := 0.1 * I; {$IFDEF FPC} Y[I] := Convol(@F, @G, X[I]); {$ELSE} Y[I] := Convol(F, G, X[I]); {$ENDIF} end; WriteLn(' X Convol Exact'); WriteLn('------------------------------'); for I := 0 to N do WriteLn(X[I]:10:4, Y[I]:10:4, H(X[I]):10:4); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/fourier/0000775000175000017500000000000011660470014021525 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/fourier/testfft.pas0000664000175000017500000001570311326434464023727 0ustar michaelmichael{ ****************************************************************** Fast Fourier Transform (modified from Pascal program by Don Cross) ****************************************************************** The program generates a time signal consisting of a large 200 Hz sine wave added to a small 2000 Hz cosine wave, which is graphed on the screen (Press a key after you are done viewing each graph) Next, it performs the FFT and graphs the resulting complex frequency samples. Then, it filters out all frequency components above 1000 Hz in the transformed data. Finally, it performs the inverse transform to get a filtered time signal back, and graphs the result. In addition, the program compares the FFT with the direct computation, on a set of random data. Results are stored in the output file fftout.txt ****************************************************************** } program testfft; uses tpmath, tpgraph; const PathToBGI = 'c:\tp\bgi'; { Change as necessary } function F(T : Float) : Float; begin F := Sin(200 * 2 * PI * T) + 0.2 * Cos(2000 * 2 * PI * T); end; const NumSamples = 512; { Buffer size (power of 2) } SamplingRate = 22050; { Sampling rate (Hz) } MaxIndex = NumSamples - 1; { Max. array index } MidIndex = NumSamples div 2; DT = 1 / SamplingRate; { Time unit (s) } DF = SamplingRate / NumSamples; { Frequency unit (Hz) } var InArray, OutArray : PCompVector; T, Freq : PVector; OutputListingFile : Text; I, FreqIndex, SymIndex : LongInt; procedure Test_CalcFrequency; var Z : Complex; I : Integer; begin { Fill input buffers with random data } for I := 0 to MaxIndex do begin InArray^[I].X := Random(10000); InArray^[I].Y := Random(10000); end; WriteLn(OutputListingFile); WriteLn(OutputListingFile, '*** Testing procedure CalcFrequency ***'); WriteLn(OutputListingFile); FFT(NumSamples, InArray, OutArray); for I := 0 to MaxIndex do begin CalcFrequency(NumSamples, I, InArray, Z); WriteLn(OutputListingFile, I:4, OutArray^[I].X:15:6, Z.X:15:6, OutArray^[I].Y:20:6, Z.Y:15:6); end; end; procedure ListData(DataArray : PCompVector; Comment : String); var I : LongInt; begin WriteLn(OutputListingFile, '*** ', Comment, ' ***'); WriteLn(OutputListingFile); WriteLn(OutputListingFile, 'index':20, 'real':20, 'imag':20); for I := 1 to NumSamples do begin WriteLn(OutputListingFile, I:20, DataArray^[I].X:20:5, DataArray^[I].Y:20:5); end; WriteLn(OutputListingFile); WriteLn(OutputListingFile, '------------------------------------------------------------------------'); WriteLn(OutputListingFile); end; procedure PlotData(T : PVector; Z : PCompVector; Title : String); var X : PVector; { Real part of Z } Xmin, Xmax, Xstep : Float; { Ox scale } Ymin, Ymax, Ystep : Float; { Oy scale } I : Integer; { Loop variable } begin if not InitGraphics(9, 2, PathToBGI) then begin Writeln('Unable to set graphic mode!'); Exit; end; SetWindow(15, 85, 15, 85, True); DimVector(X, MaxIndex); for I := 0 to MaxIndex do X^[I] := Z^[I].X; AutoScale(T, 0, MaxIndex, LinScale, Xmin, Xmax, Xstep); AutoScale(X, 0, MaxIndex, LinScale, Ymin, Ymax, Ystep); SetOxScale(LinScale, Xmin, Xmax, Xstep); SetOyScale(LinScale, Ymin, Ymax, Ystep); SetOxTitle('Time (s)'); SetOyTitle('Amplitude'); SetGraphTitle(Title); { Set point type to 0 so that only lines will be plotted } SetPointParam(1, 0, 1, 1); PlotOxAxis; PlotOyAxis; PlotGrid(BothGrid); WriteGraphTitle; PlotCurve(T, X, 0, MaxIndex, 1); ReadLn; LeaveGraphics; end; procedure PlotFFT(Freq : PVector; Z : PCompVector; Title : String); var Fq : PVector; { Frequency } X : PVector; { Real part of FFT } Y : PVector; { Imag. part of FFT } Xmin, Xmax, Xstep : Float; { Ox scale } Yr_min, Yr_max, Yr_step : Float; { Oy scale (real part) } Yi_min, Yi_max, Yi_step : Float; { Oy scale (imag. part) } Ymin, Ymax, Ystep : Float; { Oy scale (global) } I : Integer; { Loop variable } begin DimVector(Fq, MidIndex); { Frequency } DimVector(X, MidIndex); { Real part of FFT } DimVector(Y, MidIndex); { Imag. part of FFT } if not InitGraphics(9, 2, PathToBGI) then begin Writeln('Unable to set graphic mode!'); Exit; end; SetWindow(15, 80, 15, 85, True); for I := 0 TO MidIndex do begin Fq^[I] := Freq^[I]; X^[I] := Z^[I].X; Y^[I] := Z^[I].Y; end; AutoScale(Fq, 0, MidIndex, LinScale, Xmin, Xmax, Xstep); AutoScale(X, 0, MidIndex, LinScale, Yr_min, Yr_max, Yr_step); AutoScale(Y, 0, MidIndex, LinScale, Yi_min, Yi_max, Yi_step); Ymin := FMin(Yr_min, Yi_min); Ymax := FMax(Yr_max, Yi_max); Ystep := FMin(Yr_step, Yi_step); SetOxScale(LinScale, Xmin, Xmax, Xstep); SetOyScale(LinScale, Ymin, Ymax, Ystep); SetOxTitle('Frequency (Hz)'); SetOyTitle('FFT'); SetPointParam(1, 0, 1, 1); { Set point type to 0 so that } SetPointParam(2, 0, 1, 1); { only lines will be plotted. } SetCurvLegend(1, 'Real'); SetCurvLegend(2, 'Imag.'); PlotOxAxis; PlotOyAxis; PlotGrid(BothGrid); WriteLegend(2, False, True); PlotCurve(Fq, X, 0, MidIndex, 1); PlotCurve(Fq, Y, 0, MidIndex, 2); ReadLn; LeaveGraphics; end; begin DimCompVector(InArray, MaxIndex); DimCompVector(OutArray, MaxIndex); DimVector(T, MaxIndex); DimVector(Freq, MaxIndex); Assign(OutputListingFile, 'fftout.txt'); Rewrite(OutputListingFile); for I := 0 to MaxIndex do begin T^[I] := I * DT; Freq^[I] := I * DF; InArray^[I].X := F(T^[I]); InArray^[I].Y := 0.0; end; ListData(InArray, 'Time domain data before transform'); PlotData(T, InArray, 'Original signal'); FFT(NumSamples, InArray, OutArray); PlotFFT(Freq, OutArray, 'Fourier Transform'); ListData(OutArray, 'Frequency domain data after transform'); { Filter out everything above 1000 Hz (low-pass) } FreqIndex := Trunc(1000.0 / DF); SymIndex := NumSamples - FreqIndex; for I := 0 to MaxIndex do begin if ((I > FreqIndex) and (I < MidIndex)) or ((I >= MidIndex) and (I < SymIndex)) then begin OutArray^[I].X := 0.0; OutArray^[I].Y := 0.0; end; end; IFFT(NumSamples, OutArray, InArray); ListData(InArray, 'Time domain data after inverse transform'); PlotData(T, InArray, 'Filtered signal'); Test_CalcFrequency; Close(OutputListingFile); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/fmath/0000775000175000017500000000000011660470014021151 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/fmath/testw.pas0000664000175000017500000004006011326434464023034 0ustar michaelmichael{ ****************************************************************** Test of Lamberts's function This program has been translated from a FORTRAN program written by Barry et al. (http://www.netlib.org/toms/743) ****************************************************************** } uses tpmath; { Upper branch, X given as offset from -1/e } const DX1 : array[1..68] of Float = (1.E-40, 2.E-40, 3.E-40, 4.E-40, 5.E-40, 6.E-40, 7.E-40, 8.E-40, 9.E-40, 1.E-39, 1.E-30, 2.E-30, 3.E-30, 4.E-30, 5.E-30, 6.E-30, 7.E-30, 8.E-30, 9.E-30, 1.E-29, 1.E-20, 2.E-20, 3.E-20, 4.E-20, 5.E-20, 6.E-20, 7.E-20, 8.E-20, 9.E-20, 1.E-19, 1.E-10, 2.E-10, 3.E-10, 4.E-10, 5.E-10, 6.E-10, 7.E-10, 8.E-10, 9.E-10, 1.E-9, 1.E-5, 2.E-5, 3.E-5, 4.E-5, 5.E-5, 6.E-5, 7.E-5, 8.E-5, 9.E-5, 1.E-4, 2.E-4, 3.E-4, 4.E-4, 5.E-4, 6.E-4, 7.E-4, 8.E-4, 9.E-4, 1.E-3, 2.E-3, 3.E-3, 4.E-3, 5.E-3, 6.E-3, 7.E-3, 8.E-3, 9.E-3, 1.E-2); const WP1 : array[1..68] of Float = (- 0.9999999999999999999766835601840287579665, - 0.9999999999999999999670255745859974370634, - 0.9999999999999999999596147415871158855702, - 0.9999999999999999999533671203680575159335, - 0.9999999999999999999478628555782056161596, - 0.9999999999999999999428866198325571498809, - 0.9999999999999999999383104987875354650364, - 0.9999999999999999999340511491719948741275, - 0.9999999999999999999300506805520862739007, - 0.9999999999999999999262669432552936235556, - 0.9999999999999976683560184028776088243496, - 0.9999999999999967025574585997473306784697, - 0.9999999999999959614741587115939935280812, - 0.9999999999999953367120368057588420244704, - 0.9999999999999947862855578205706768098859, - 0.9999999999999942886619832557258611080314, - 0.9999999999999938310498787535591888253966, - 0.999999999999993405114917199501910108482, - 0.9999999999999930050680552086436996003626, - 0.9999999999999926266943255293804772564852, - 0.9999999997668356018584094585181033975713, - 0.9999999996702557458962181283375794922681, - 0.9999999995961474159255244922555603070484, - 0.9999999995336712037530626747373742782638, - 0.9999999994786285558726655558473617503914, - 0.9999999994288661984343027719079710168757, - 0.9999999993831049880022078023099082447845, - 0.9999999993405114918649237720678678043098, - 0.9999999993005068056839596486461928553989, - 0.9999999992626694327341550240404575805522, - 0.9999766837414008807143234266407434345965, - 0.9999670259370180970391011806287847685011, - 0.9999596152852334187587360603177913882165, - 0.9999533678452277190993205651165793258207, - 0.9999478637616504968301143759542621752943, - 0.9999428877071168268324462680980110604599, - 0.999938311767283189655618359697592754013, - 0.999934052598878483932035240348113191731, - 0.9999300523114688962155368933174163936848, - 0.9999262687553819399632780281900349826094, - 0.9926447551971221136721993073029112268763, - 0.9896086425917686478635208903220735023288, - 0.9872831094708759013315476674998231771112, - 0.9853253899681719161468126266199947992874, - 0.9836027178149637071691226667555243369797, - 0.9820470029764667038452666345865058694192, - 0.9806177971936827573257045283891513709368, - 0.97928874641099293421931043027104578327, - 0.9780415451927629881943028498821429186059, - 0.9768628655744219140604871252425961901255, - 0.967382626983074241885253344632666448927, - 0.9601485420712594199373375259293860324633, - 0.9540768694875733222057908617314370634111, - 0.9487478690765183543410579996573536771348, - 0.9439462911219380338176477772712853402016, - 0.9395442782590063946376623684916441100361, - 0.9354585313336439336066341889767099608018, - 0.9316311953818583253420613278986500351794, - 0.9280201500545670487600430252549212247489, - 0.8991857663963733198571950343133631348347, - 0.8774287170665477623395641312875506084256, - 0.8593275036837387237312746018678000939451, - 0.8435580020488052057849697812109882706542, - 0.8294416857114015557682843481727604063558, - 0.8165758053803078481644781849709953302847, - 0.8046981564792468915744561969751509934994, - 0.7936267540949175059651534957734689407879, - 0.7832291989812967764330746819464532478021); { Upper branch, X close to 0 } const X2 : array[1..20] of Float = (1.E-9, 2.E-9, 3.E-9, 4.E-9, 5.E-9, 6.E-9, 7.E-9, 8.E-9, 9.E-9, 1.E-8, 1.E-2, 2.E-2, 3.E-2, 4.E-2, 5.E-2, 6.E-2, 7.E-2, 8.E-2, 9.E-2, 1.E-1); const WP2 : array[1..40] of Float = (9.999999990000000014999999973333333385417E-10, 1.9999999960000000119999999573333335E-9, 2.999999991000000040499999784000001265625E-9, 3.999999984000000095999999317333338666667E-9, 4.999999975000000187499998333333349609375E-9, 5.999999964000000323999996544000040499999E-9, 6.99999995100000051449999359733342086979E-9, 7.999999936000000767999989077333503999997E-9, 8.999999919000001093499982504000307546869E-9, 9.999999900000001499999973333333854166656E-9, 9.901473843595011885336326816570107953628E-3, 1.961158933740562729168248268298370977812E-2, 2.913845916787001265458568152535395243296E-2, 3.848966594197856933287598180923987047561E-2, 4.767230860012937472638890051416087074706E-2, 5.669304377414432493107872588796066666126E-2, 6.555812274442272075701853672870305774479E-2, 7.427342455278083997072135190143718509109E-2, 8.284448574644162210327285639805993759142E-2, 9.127652716086226429989572142317956865312E-2, - 1.000000001000000001500000002666666671875E-9, - 2.000000004000000012000000042666666833333E-9, - 3.000000009000000040500000216000001265625E-9, - 4.000000016000000096000000682666672E-9, - 5.000000025000000187500001666666682942709E-9, - 6.000000036000000324000003456000040500001E-9, - 7.000000049000000514500006402666754203126E-9, - 8.000000064000000768000010922666837333336E-9, - 9.000000081000001093500017496000307546881E-9, - 1.000000010000000150000002666666718750001E-8, - 1.010152719853875327292018767138623973671E-2, - 2.041244405580766725973605390749548004159E-2, - 3.094279498284817939791038065611524917276E-2, - 4.170340843648447389872733812553976786256E-2, - 5.270598355154634795995650617915721289428E-2, - 6.396318935617251019529498180168867456393E-2, - 7.548877886579220591933915955796681153525E-2, - 8.729772086157992404091975866027313992649E-2, - 9.940635280454481474353567186786621057821E-2, - 1.118325591589629648335694568202658422726E-1); { Other results } const X3 : array[1..10] of Float = (1.E1, 1.E2, 1.E3, 1.E4, 1.E5, 1.E6, 1.E7, 1.E8, 1.E9, 1.E10); const WP3 : array[1..10] of Float = (1.745528002740699383074301264875389911535, 3.385630140290050184888244364529726867492, 5.249602852401596227126056319697306282521, 7.231846038093372706475618500141253883968, 9.284571428622108983205132234759581939317, 11.38335808614005262200015678158500428903, 13.5143440103060912090067238511621580283, 15.66899671545096218719628189389457073619, 17.84172596742146918254060066535711011039, 20.02868541330495078123430607181488729749); { Lower branch, X close to -1/e } const WM1 : array[1..68] of Float = (- 1.000000000000000000023316439815971242034, - 1.000000000000000000032974425414002562937, - 1.000000000000000000040385258412884114431, - 1.000000000000000000046632879631942484068, - 1.000000000000000000052137144421794383842, - 1.000000000000000000057113380167442850121, - 1.000000000000000000061689501212464534966, - 1.000000000000000000065948850828005125875, - 1.000000000000000000069949319447913726103, - 1.000000000000000000073733056744706376448, - 1.000000000000002331643981597126015551422, - 1.000000000000003297442541400259918073073, - 1.000000000000004038525841288416879599233, - 1.000000000000004663287963194255655478615, - 1.00000000000000521371444217944744506897, - 1.000000000000005711338016744295885146596, - 1.000000000000006168950121246466181805002, - 1.000000000000006594885082800527084897688, - 1.000000000000006994931944791388919781579, - 1.000000000000007373305674470655766501228, - 1.000000000233164398177834299194683872234, - 1.000000000329744254176269387087995047343, - 1.00000000040385258418320678088280150237, - 1.000000000466328796391912356113774800963, - 1.000000000521371444308553232716574598644, - 1.00000000057113380178315977436875260197, - 1.000000000616895012251498501679602643872, - 1.000000000659488508425026289634430354159, - 1.000000000699493194642234170768892572882, - 1.000000000737330567628282553087415117543, - 1.000023316621036696460620295453277856456, - 1.000032974787857057404928311684626421503, - 1.000040385802079313048521250390482335902, - 1.00004663360452259016530661221213359488, - 1.0000521380505373899860247162705706318, - 1.000057114467508637629346787348726350223, - 1.000061690769779852545970707346938004879, - 1.000065950300622136103491886720203687457, - 1.00006995095046930174807034225078340539, - 1.000073734868993836022551364404248563489, - 1.007391489031309264813153180819941418531, - 1.010463846806564696239430620915659099361, - 1.012825626038880105597738761474228363542, - 1.014819592594577564927398399257428492725, - 1.016578512742400177512255407989807698099, - 1.018170476517182636083407324035097024753, - 1.019635932177973215702948823070039007361, - 1.021001233780440980009663527189756124983, - 1.022284686760270309618528459224732558767, - 1.023499619082082348038906498637836105447, - 1.033342436522109918536891072083243897233, - 1.040939194524944844012076988438386306843, - 1.047373634492196231421755878017895964061, - 1.053065496629607111615572634090884988897, - 1.058230030703619902820337106917657189605, - 1.06299509412938704964298950857825124135, - 1.067443986111355120560366087010834293872, - 1.071634561663924136735470389832541413862, - 1.07560894118662498941494486924522316597, - 1.108081880631165502564629660944418191031, - 1.133487001006868638317076487349933855181, - 1.155245851821528613609784258821055266176, - 1.174682608817289477552149783867901714817, - 1.192475850408615960644596781702366026321, - 1.209028378276581220769059281765172085749, - 1.224602449817731587352403997390766826335, - 1.239380103200799714836392811991400433357, - 1.253493791367214516100457405907304877145); { Lower branch, X close to 0 } const WM2 : array[1..68] of Float = (- 96.67475603368003636615083422832414231073, - 95.97433737593292677679699834708774152264, - 95.56459382507349364043974513871359837914, - 95.27386489130628866261760496192716897551, - 95.0483515329550645558378163981346085731, - 94.86408948075132603599669916724611501067, - 94.70829516116125928735505687861553800851, - 94.57333777268864473984718625104978190798, - 94.45429521137271454134108055166168787618, - 94.34780665137385269060032461028588648619, - 73.37311031382297679706747875812087452918, - 72.67033891766978907253811160121558649554, - 72.25920015786413889986246462168541066725, - 71.9674726772681844325410195162521230103, - 71.74117979478106456261839111929684980709, - 71.55627755942675731851469544735603279342, - 71.39993966508440988906136771384270319452, - 71.26450969134836299738230265916604879247, - 71.14504894849287026061378869987876478469, - 71.03818524971357411174259539994036186653, - 49.96298427667447244531514297262540669957, - 49.25557728489066973476436802404294348267, - 48.84167348449764278180827692232244878061, - 48.54795966722336777861228992424053274064, - 48.32011181512544381639923088992262632623, - 48.13392971864323755677656581326964166718, - 47.97650308277095858785998266172487372203, - 47.84012504158555569017852884133421231303, - 47.71982419568730714141619502661365943996, - 47.61220592218922310708330388890925734186, - 26.29523881924692569411012882185491823773, - 25.57429135222126159950976461862116397347, - 25.15218334705420805339928870686463192335, - 24.85251554543232259250342343156454440592, - 24.61997095867949438248843689371454503831, - 24.42989922074834124324823589226341161866, - 24.26914663885402405126372567664280388966, - 24.12985944288624210229238972590881794092, - 24.00697058168597098928369714836882130512, - 23.8970195845316574350263109196222825525, - 14.16360081581018300910955630361089957762, - 13.41624453595298662833544556875899262976, - 12.97753279184081358418630625949303360266, - 12.66551396826200331850774017793451747947, - 12.42304039760186078066171146072124458063, - 12.22461776385387453853455424320739669321, - 12.05663003490708840623665404674007291018, - 11.91094134143842011964821167497982287763, - 11.78229922740701885487699061601349928173, - 11.66711453256635441837882744697047370583, - 10.90655739570090676132157335673785028979, - 10.45921112040100393534625826514848865968, - 10.14059243262036578763968437893562720385, - 9.892699522704254067620287857665824159861, - 9.689637966382397752838283301312347921626, - 9.517569762038614935107630230444563521109, - 9.368222172408836799233763466046500781388, - 9.236251966692597369166416348621131600216, - 9.11800647040274012125833718204681427427, - 8.335081377982507150789361715143483020265, - 7.872521380098708883395239767904984410792, - 7.541940416432904084217222998374802941589, - 7.283997135099081646930521042317118095276, - 7.072162048994701667487346245044653243434, - 6.892241486671583156187212318718730022068, - 6.735741661607793269808533725369490789074, - 6.597171733627119347342347717832724288261, - 6.472775124394004694741057892724488037104); var I, NDT : Integer; W : Float; function NDigits(W_appr : Float; W_exact : Float) : Integer; { Returns the number of correct digits found in W_appr } begin if W_appr = W_exact then NDigits := NDT else NDigits := Round(Log10(Abs(W_exact / (W_appr - W_exact))) + 0.5); end; procedure PrintTitle(Msg : String; Offset : Boolean); { Prints the title for a group of results } var I : Integer; S : String; begin WriteLn; WriteLn(Msg); for I := 1 to Length(Msg) do Write('-'); WriteLn; WriteLn; if Offset then S := ' Offset X' else S := ' X '; WriteLn(S, ' W(X) (appr) W(X) (exact) Digits correct'); end; procedure PrintResult(X, W_appr : Float; W_exact : Float); { Prints one line of results } begin WriteLn(X:17, ' ', W_appr:17, ' ', W_exact:17, ' ', NDigits(W_appr, W_exact):9); end; begin NDT := Round(0.5 - Log10(MachEp)); WriteLn('Lambert''s W-function'); PrintTitle('Upper branch results for X near -1/e', True); for I := 1 to 68 do begin { Check whether underflow occurs } if DX1[I] = 0.0 then W := LambertW(- Exp(- 1.0), True, False) else W := LambertW(DX1[I], True, True); PrintResult(DX1[I], W, WP1[I]); end; PrintTitle('Upper branch results for X near 0', False); for I := 1 to 20 do begin W := LambertW(X2[I], True, False); PrintResult(X2[I], W, WP2[I]); end; for I := 1 to 20 do begin W := LambertW(- X2[I], True, False); PrintResult(- X2[I], W, WP2[20 + I]); end; PrintTitle('Other upper branch results', False); for I := 1 to 10 do begin W := LambertW(X3[I], True, False); PrintResult(X3[I], W, WP3[I]); end; PrintTitle('Lower branch results for X near -1/e', True); for I := 1 to 68 do begin W := LambertW(DX1[I], False, True); PrintResult(DX1[I], W, WM1[I]); end; PrintTitle('Lower branch results for X near 0', False); for I := 1 to 68 do { Check for underflow } if DX1[I] >= 0.0 then begin W := LambertW(- DX1[I], False, False); PrintResult(- DX1[I], W, WM2[I]); end; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/fmath/testmach.pas0000664000175000017500000000312511326434464023477 0ustar michaelmichael{ ****************************************************************** This program displays the floating point type and the machine- dependent constants. ****************************************************************** } program testmach; uses tpmath; var N : Byte; begin writeln; writeln('Integer type = Integer (', sizeof(Integer), ' bytes)'); writeln('Long Integer type = LongInt (', sizeof(LongInt), ' bytes)'); N := sizeof(Float); write('Floating point type = '); if N = sizeof(Single) then write('Single') else if N = sizeof(Double) then write('Double') else if N = sizeof(Extended) then write('Extended') else write('Real'); writeln(' (', N, ' bytes)'); writeln('Complex type = Complex (', sizeof(Complex), ' bytes)'); writeln; writeln('MachEp = ', MachEp); writeln; writeln('MinNum = ', MinNum); writeln('Exp(MinLog) = ', Exp(MinLog)); writeln; writeln('MinLog = ', MinLog); writeln('Ln(MinNum) = ', Ln(MinNum)); writeln; writeln('MaxNum = ', MaxNum); writeln('Exp(MaxLog) = ', Exp(MaxLog)); writeln; writeln('MaxLog = ', MaxLog); writeln('Ln(MaxNum) = ', Ln(MaxNum)); writeln; writeln('MaxFac = ', MaxFac); writeln('Fact(MaxFac) = ', Fact(MaxFac)); writeln; writeln('MaxGam = ', MaxGam); writeln('Gamma(MaxGam) = ', Gamma(MaxGam)); writeln; writeln('MaxLgm = ', MaxLgm); writeln('LnGamma(MaxLgm) = ', LnGamma(MaxLgm)); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/fmath/testfunc.pas0000664000175000017500000001560411326434464023527 0ustar michaelmichael{ ****************************************************************** This program tests the accuracy of the elementary functions. For each function, 20 random arguments are picked, then the function is computed, the reciprocal function is applied to the result, and the relative error between this last result and the original argument is computed. ****************************************************************** } program testfunc; uses crt, tpmath; const NARG = 20; { Number of arguments } BLANK = ' '; { Separator } type TVector = array[1..NARG] of Float; var X, Y : TVector; { Random arguments } procedure Pause; var Ch : Char; begin Writeln; Write('Press a key to continue'); Ch := ReadKey; Writeln; Writeln; end; procedure RanArgs(var X : TVector; Xmin, Xmax : Float); { Fills a table of random arguments between Xmin and Xmax, rounded to 4 decimal places and sorted in increasing order. } var I, J, K : integer; A : Float; begin for I := 1 to NARG do begin A := (Xmax - Xmin) * Random + Xmin; if Abs(A) < 1.0E-4 then A := Sgn(A) * 1.0E-4; X[I] := Int(10000 * A) / 10000; end; { Insertion sort } for I := 1 to Pred(NARG) do begin K := I; A := X[I]; for J := Succ(I) to NARG do if X[J] < A then begin K := J; A := X[J]; end; FSwap(X[I], X[K]); end; end; procedure Test_Exp; var I : Integer; Z, T, R : Float; begin RanArgs(X, -10, 10); WriteLn(' X Y = Expo(X) X = Log(Y) Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to NARG do begin Z := Expo(X[I]); T := Log(Z); R := (X[I] - T) / X[I]; WriteLn(X[I]:8:4, BLANK, Z:26, BLANK, T:26, BLANK, R:10); end; Pause; end; procedure Test_Exp10; var I : Integer; Z, T, R : Float; begin RanArgs(X, -5, 5); WriteLn(' X Y = Exp10(X) X = Log10(Y) Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to NARG do begin Z := Exp10(X[I]); T := Log10(Z); R := (X[I] - T) / X[I]; WriteLn(X[I]:8:4, BLANK, Z:26, BLANK, T:26, BLANK, R:10); end; Pause; end; procedure Test_Exp2; var I : Integer; Z, T, R : Float; begin RanArgs(X, -15, 15); WriteLn(' X Y = Exp2(X) X = Log2(Y) Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to NARG do begin Z := Exp2(X[I]); T := Log2(Z); R := (X[I] - T) / X[I]; WriteLn(X[I]:8:4, BLANK, Z:26, BLANK, T:26, BLANK, R:10); end; Pause; end; procedure Test_Power; var I : Integer; Z, T, R : Float; begin RanArgs(X, 0, 10); RanArgs(Y, -5, 5); WriteLn(' X Y Z = Power(X, Y) Y = Log(Z, X) Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to NARG do begin Z := Power(X[I], Y[I]); { X^Y } T := LogA(Z, X[I]); { Log(X^Y, X) = Y } R := (Y[I] - T) / Y[I]; WriteLn(X[I]:6:4, Y[I]:8:4, ' ', Z:26, ' ', T:26, ' ', R:10); end; Pause; end; procedure Test_Sin; var I : Integer; Z, T, R : Float; begin RanArgs(X, -PiDiv2, PiDiv2); WriteLn(' X Y = Sin(X) X = ArcSin(Y) Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to NARG do begin Z := Sin(X[I]); T := ArcSin(Z); R := (X[I] - T) / X[I]; WriteLn(X[I]:8:4, BLANK, Z:26, BLANK, T:26, BLANK, R:10); end; Pause; end; procedure Test_Cos; var I : Integer; Z, T, R : Float; begin RanArgs(X, 0, PI); WriteLn(' X Y = Cos(X) X = ArcCos(Y) Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to NARG do begin Z := Cos(X[I]); T := ArcCos(Z); R := (X[I] - T) / X[I]; WriteLn(X[I]:8:4, BLANK, Z:26, BLANK, T:26, BLANK, R:10); end; Pause; end; procedure Test_Tan; var I : Integer; Z, T, R : Float; begin RanArgs(X, -PiDiv2, PiDiv2); WriteLn(' X Y = Tan(X) X = ArcTan(Y) Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to NARG do begin Z := Tan(X[I]); T := ArcTan(Z); R := (X[I] - T) / X[I]; WriteLn(X[I]:8:4, BLANK, Z:26, BLANK, T:26, BLANK, R:10); end; Pause; end; procedure Test_Sinh; var I : Integer; Z, T, R : Float; begin RanArgs(X, 0, 5); WriteLn(' X Y = Sinh(X) X = ArcSinh(Y) Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to NARG do begin Z := Sinh(X[I]); T := ArcSinh(Z); R := (X[I] - T) / X[I]; WriteLn(X[I]:8:4, BLANK, Z:26, BLANK, T:26, BLANK, R:10); end; Pause; end; procedure Test_Cosh; var I : Integer; Z, T, R : Float; begin RanArgs(X, 0, 5); WriteLn(' X Y = Cosh(X) X = ArcCosh(Y) Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to NARG do begin Z := Cosh(X[I]); T := ArcCosh(Z); R := (X[I] - T) / X[I]; WriteLn(X[I]:8:4, BLANK, Z:26, BLANK, T:26, BLANK, R:10); end; Pause; end; procedure Test_Tanh; var I : Integer; Z, T, R : Float; begin RanArgs(X, -5, 5); WriteLn(' X Y = Tanh(X) X = ArcTanh(Y) Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to NARG do begin Z := Tanh(X[I]); T := ArcTanh(Z); R := (X[I] - T) / X[I]; WriteLn(X[I]:8:4, BLANK, Z:26, BLANK, T:26, BLANK, R:10); end; Pause; end; begin Test_Exp; Test_Exp10; Test_Exp2; Test_Power; Test_Sin; Test_Cos; Test_Tan; Test_Sinh; Test_Cosh; Test_Tanh; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/fmath/speed.pas0000664000175000017500000000750311326434464022773 0ustar michaelmichael{ ****************************************************************** This program measures the execution times of several standard mathematical functions, as well as some additional functions provided in TPMATH The results are stored in the output file SPEED.OUT The execution time of each function takes into account the computation of random arguments. This corresponds to the execution time of the function Random ****************************************************************** } program Speed; uses dos, tpmath; const NFUNC = 29; { Number of functions } NMAX = 10000000; { Number of evaluations for each function } const FuncName : array[1..NFUNC] of String[8] = ('Ln ', 'Log10 ', 'Log2 ', 'Exp ', 'Exp10 ', 'Exp2 ', 'Power ', 'Sin ', 'Cos ', 'Tan ', 'ArcSin ', 'ArcCos ', 'ArcTan ', 'ArcTan2 ', 'Sinh ', 'Cosh ', 'Tanh ', 'ArcSinh ', 'ArcCosh ', 'ArcTanh ', 'Gamma ', 'DiGamma ', 'TriGamma', 'IGamma ', 'Beta ', 'IBeta ', 'Erf ', 'Erfc ', 'Random '); var F : Text; { Output file } N : Byte; { Function index } T : Float; { Time } function Time : Float; { Returns time in seconds } var H, M, S, C : Word; begin GetTime(H, M, S, C); Time := 3600.0 * H + 60.0 * M + S + 0.01 * C; end; function TimeToEval(N : Byte) : Float; { Returns time to evaluate NMAX functions } var I : LongInt; T0, Y : Float; begin T0 := Time; case N of 1 : for I := 1 to NMAX do Y := Ln(Random); 2 : for I := 1 to NMAX do Y := Log10(Random); 3 : for I := 1 to NMAX do Y := Log2(Random); 4 : for I := 1 to NMAX do Y := Exp(Random); 5 : for I := 1 to NMAX do Y := Exp10(Random); 6 : for I := 1 to NMAX do Y := Exp2(Random); 7 : for I := 1 to NMAX do Y := Power(Random, 0.5); 8 : for I := 1 to NMAX do Y := Sin(Random); 9 : for I := 1 to NMAX do Y := Cos(Random); 10 : for I := 1 to NMAX do Y := Tan(Random); 11 : for I := 1 to NMAX do Y := ArcSin(Random); 12 : for I := 1 to NMAX do Y := ArcCos(Random); 13 : for I := 1 to NMAX do Y := ArcTan(Random); 14 : for I := 1 to NMAX do Y := ArcTan2(Random, 0.5); 15 : for I := 1 to NMAX do Y := Sinh(Random); 16 : for I := 1 to NMAX do Y := Cosh(Random); 17 : for I := 1 to NMAX do Y := Tanh(Random); 18 : for I := 1 to NMAX do Y := ArcSinh(Random); 19 : for I := 1 to NMAX do Y := ArcCosh(Random + 1.0); 20 : for I := 1 to NMAX do Y := ArcTanh(Random); 21 : for I := 1 to NMAX do Y := Gamma(Random); 22 : for I := 1 to NMAX do Y := DiGamma(Random); 23 : for I := 1 to NMAX do Y := TriGamma(Random); 24 : for I := 1 to NMAX do Y := IGamma(Random, 0.5); 25 : for I := 1 to NMAX do Y := Beta(Random, 0.5); 26 : for I := 1 to NMAX do Y := IBeta(Random, 0.5, 0.5); 27 : for I := 1 to NMAX do Y := Erf(Random); 28 : for I := 1 to NMAX do Y := Erfc(Random); 29 : for I := 1 to NMAX do Y := Random; end; TimeToEval := Time - T0; end; begin { Open output file } Assign(F, 'speed.out'); Rewrite(F); Writeln; Writeln('Time in seconds to evaluate ', NMAX, ' functions'); Writeln(F, 'Time in seconds to evaluate ', NMAX, ' functions'); Writeln; Writeln(F); for N := 1 to NFUNC do begin T := TimeToEval(N); Writeln(FuncName[N], T:6:2); Writeln(F, FuncName[N], T:8:2); end; Close(F); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/fmath/specfunc.pas0000664000175000017500000001552111326434464023500 0ustar michaelmichael{ ****************************************************************** This programs tests the accuracy of the special functions. The data file SPECFUNC.DAT has been modified from the 'Numerical Recipes' example file. ****************************************************************** } program specfunc; uses crt, tpmath; const FileName = 'specfunc.dat'; Blank = ' '; procedure Pause; var Ch : Char; begin Writeln; Write('Press a key to continue'); Ch := ReadKey; Writeln; Writeln; end; procedure Test_Fact; var I, M, N : Integer; Y, Ref, R : Float; F : Text; S : String; begin Assign(F, FileName); Reset(F); repeat ReadLn(F, S); until S = 'N-factorial'; ReadLn(F, M); WriteLn(' X Fact(N) Reference Rel.Error'); WriteLn('------------------------------------------------------------------------------'); for I := 1 to M do begin ReadLn(F, N, Ref); Y := Fact(N); R := (Y - Ref) / Ref; WriteLn(N:4, Blank, Y:26, Blank, Ref:26, Blank, R:10); end; Close(F); Pause; end; procedure Test_Binomial; var I, M, N, K : Integer; Y, Ref, R : Float; F : Text; S : String; begin Assign(F, FileName); Reset(F); repeat ReadLn(F, S); until S = 'Binomial Coefficients'; ReadLn(F, M); WriteLn(' N K Binomial(N, K) Reference Rel.Error'); WriteLn('---------------------------------------------------------------'); for I := 1 to M do begin ReadLn(F, N, K, Ref); Y := Binomial(N, K); R := (Y - Ref) / Ref; WriteLn(N:2, K:5, ' ', Y:13:0, ' ', Ref:13:0, ' ', R:10); end; Close(F); Pause; end; procedure Test_Gamma; var I, M : Integer; X, Y, Ref, R : Float; F : Text; S : String; begin Assign(F, FileName); Reset(F); repeat ReadLn(F, S); until S = 'Gamma Function'; ReadLn(F, M); WriteLn(' X Gamma(X) Reference Rel.Error'); WriteLn('------------------------------------------------------------------------------'); for I := 1 to M do begin ReadLn(F, X, Ref); Y := Gamma(X); { To test Gamma } { Y := SgnGamma(X) * Exp(LnGamma(X)); } { To test LnGamma } R := (Y - Ref) / Ref; WriteLn(X:4:1, Blank, Y:26, Blank, Ref:26, Blank, R:10); end; Close(F); Pause; end; procedure Test_IGamma; var I, M : Integer; A, X, Y, R, Ref : Float; F : Text; S : String; begin Assign(F, FileName); Reset(F); repeat ReadLn(F, S); until S = 'Incomplete Gamma Function'; ReadLn(F, M); WriteLn(' A X IGamma(A, X) Reference Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to M do begin ReadLn(F, A, X, Ref); Y := IGamma(A, X); R := (Y - Ref) / Ref; WriteLn(A:4:1, X:12:8, Y:26, Ref:26, ' ', R:10); end; Close(F); Pause; end; procedure Test_Beta; var I, M : Integer; X, Y, Z, R, Ref : Float; F : Text; S : String; begin Assign(F, FileName); Reset(F); repeat ReadLn(F, S); until S = 'Beta Function'; ReadLn(F, M); WriteLn(' X Y Beta(X, Y) Reference Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to M do begin ReadLn(F, X, Y, Ref); Z := Beta(X, Y); R := (Z - Ref) / Ref; WriteLn(X:4:1, ' ', Y:4:1, ' ', Z:26, ' ', Ref:26, ' ', R:10); end; Close(F); Pause; end; procedure Test_IBeta; var I, M : Integer; A, B, X, Y, R, Ref : Float; F : Text; S : String; begin Assign(F, FileName); Reset(F); repeat ReadLn(F, S); until S = 'Incomplete Beta Function'; ReadLn(F, M); WriteLn(' A B X IBeta(A, B, X) Reference Rel.Error'); WriteLn('-------------------------------------------------------------------------------'); for I := 1 to M do begin ReadLn(F, A, B, X, Ref); Y := IBeta(A, B, X); R := (Y - Ref) / Ref; WriteLn(A:4:1, ' ', B:4:1, ' ', X:4:2, ' ', Y:26, ' ', Ref:26, ' ', R:10); end; Close(F); Pause; end; procedure Test_Erf; var I, M : Integer; X, Y, R, Ref : Float; F : Text; S : String; begin Assign(F, FileName); Reset(F); repeat ReadLn(F, S); until S = 'Error Function'; ReadLn(F, M); WriteLn(' X Erf(X) Reference Rel.Error'); WriteLn('------------------------------------------------------------------------------'); for I := 1 to M do begin ReadLn(F, X, Ref); Y := Erf(X); R := (Y - Ref) / Ref; WriteLn(X:4:1, Blank, Y:26, Blank, Ref:26, Blank, R:10); end; Close(F); Pause; end; procedure Test_DiGamma; var I, M : Integer; X, Y, Ref, R : Float; F : Text; S : String; begin Assign(F, FileName); Reset(F); repeat ReadLn(F, S); until S = 'DiGamma Function'; ReadLn(F, M); WriteLn(' X DiGamma(X) Reference Rel.Error'); WriteLn('------------------------------------------------------------------------------'); for I := 1 to M do begin ReadLn(F, X, Ref); Y := DiGamma(X); R := (Y - Ref) / Ref; WriteLn(X:6:2, Blank, Y:25, Blank, Ref:25, Blank, R:10); end; Close(F); Pause; end; procedure Test_TriGamma; var I, M : Integer; X, Y, Ref, R : Float; F : Text; S : String; begin Assign(F, FileName); Reset(F); repeat ReadLn(F, S); until S = 'TriGamma Function'; ReadLn(F, M); WriteLn(' X TriGamma(X) Reference Rel.Error'); WriteLn('------------------------------------------------------------------------------'); for I := 1 to M do begin ReadLn(F, X, Ref); Y := TriGamma(X); R := (Y - Ref) / Ref; WriteLn(X:6:2, Blank, Y:25, Blank, Ref:25, Blank, R:10); end; Close(F); Pause; end; begin Test_Fact; Test_Binomial; Test_Gamma; Test_IGamma; Test_Beta; Test_IBeta; Test_Erf; Test_DiGamma; Test_TriGamma; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/fmath/plot.pas0000664000175000017500000000256511326434464022654 0ustar michaelmichael{ ****************************************************************** This program plots a function in either linear or logarithmic coordinates. ****************************************************************** } program plot; uses tpmath, tpgraph; function Func(X : Float) : Float; { Square root function (becomes linear in log-log coordinates) } begin Func := Sqrt(X) end; begin { Plot in linear coordinates, using default parameter values } if not InitGraphics(9, 2, { 640x480 16 color } 'c:\tp\bgi') then Exit; SetWindow(15, 85, 15, 85, True); PlotOxAxis; PlotOyAxis; PlotGrid(BothGrid); SetGraphTitle('SQUARE ROOT FUNCTION IN LINEAR COORDINATES'); WriteGraphTitle; SetClipping(True); PlotFunc({$IFDEF FPC}@{$ENDIF}Func, 0.0, 1.0, 1); ReadLn; LeaveGraphics; { Plot in logarithmic coordinates } if not InitGraphics(9, 2, { 640x480 16 color } 'c:\tp\bgi') then Exit; SetWindow(15, 85, 15, 85, True); SetOxScale(LogScale, 0.01, 100, 1); SetOyScale(LogScale, 0.1, 10, 1); PlotOxAxis; PlotOyAxis; PlotGrid(BothGrid); SetGraphTitle('SQUARE ROOT FUNCTION IN LOGARITHMIC COORDINATES'); WriteGraphTitle; SetClipping(True); PlotFunc({$IFDEF FPC}@{$ENDIF}Func, 0.01, 100, 2); ReadLn; LeaveGraphics; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/fmath/contour.pas0000664000175000017500000000552111326434464023362 0ustar michaelmichael{ ****************************************************************** Contour plot of a two-dimensional function ****************************************************************** } program contour; uses tpmath, tpgraph; { ****************************************************************** Define here the function to be plotted ****************************************************************** } const FuncName = 'Sin(Sqrt(X^2 + Y^2)) + 0.5 / Sqrt((X + 3.05)^2 + Y^2)'; const Xmin = - TwoPi; Xmax = TwoPi; Xstep = Pi; { Ox scale } Ymin = - TwoPi; Ymax = TwoPi; Ystep = Pi; { Oy scale } const NpX = 60; NpY = 60; { Number of grid points } const Nc = 30; { Number of contours } function Func(X, Y : Float) : Float; const C = 3.05; var X2, Y2, Xc, Xc2 : Float; begin X2 := X * X; Y2 := Y * Y; Xc := X + C; Xc2 := Xc * Xc; Func := Sin(Sqrt(X2 + Y2)) + 0.5 / Sqrt(Xc2 + Y2) end; { ****************************************************************** Main program ****************************************************************** } var Dx, Dy : Float; { Increments of X and Y } Fmin, Fmax : Float; { Min. and max. function values } H : Float; { Increment for levels } X, Y : PVector; { Point coordinates } Z : PVector; { Contour array } F : PMatrix; { Function values } I, J : Integer; { Loop variables } begin { Initialize graphics } if not InitGraphics(9, 2, { 640x480 16 color } 'c:\tp\bgi') then Exit; { Set graphic area so that it will look approximately square } SetWindow(24, 76, 15, 85, True); { Dimension arrays } DimVector(X, NpX); DimVector(Y, NpY); DimVector(Z, Nc - 1); DimMatrix(F, NpX, NpY); { Set scales and plot axes } SetOxScale(LinScale, Xmin, Xmax, Xstep); SetOyScale(LinScale, Ymin, Ymax, Ystep); PlotOxAxis; PlotOyAxis; PlotGrid(BothGrid); SetGraphTitle(FuncName); WriteGraphTitle; { Generate grid points } Dx := (Xmax - Xmin) / NpX; Dy := (Ymax - Ymin) / NpY; X^[0] := Xmin; for I := 1 to NpX do X^[I] := X^[I - 1] + Dx; Y^[0] := Ymin; for J := 1 to NpY do Y^[J] := Y^[J - 1] + Dy; { Compute function values } Fmin := Func(Xmin, Ymin); Fmax := Fmin; for I := 0 to NpX do for J := 0 to NpY do begin F^[I]^[J] := Func(X^[I], Y^[J]); if F^[I]^[J] < Fmin then Fmin := F^[I]^[J] else if F^[I]^[J] > Fmax then Fmax := F^[I]^[J]; end; { Define levels } H := (Fmax - Fmin) / (Nc + 1); for I := 0 to Nc - 1 do Z^[I] := Fmin + (I + 1) * H; { Plot contour } ConRec(NpX, NpY, Nc, X, Y, Z, F); ReadLn; LeaveGraphics; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/equation/0000775000175000017500000000000011660470014021677 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/equation/testsec.pas0000664000175000017500000000311011326434464024061 0ustar michaelmichael{ ****************************************************************** Solution to a nonlinear equation by the secant method. Example: F(X) = X * Ln(X) - 1 = 0 True Solution is X = 1.763222834... ****************************************************************** } program testsec; uses tpmath; { ****************************************************************** Define the function ****************************************************************** } function Func(X : Float) : Float; begin Func := X * Ln(X) - 1 end; { ****************************************************************** Define number of iterations and precision ****************************************************************** } const MaxIter = 1000; { Max number of iterations } Tol = 1E-6; { Required precision } { ****************************************************************** Main program ****************************************************************** } var F, X, Y : Float; begin { Give two starting points near the root } X := 1; Y := 2; {$IFDEF FPC} Secant(@Func, X, Y, MaxIter, Tol, F); {$ELSE} Secant(Func, X, Y, MaxIter, Tol, F); {$ENDIF} if MathErr = OptNonConv then begin writeln('Non-convergence!'); halt; end; writeln; writeln('Solution to nonlinear equation (Secant method)'); writeln('----------------------------------------------'); writeln; writeln('Root: ', X:12:6); writeln; writeln('Function value:', F:12:6); writeln; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/equation/testnr1.pas0000664000175000017500000000351311326434464024016 0ustar michaelmichael{ ****************************************************************** Solution to a nonlinear equation by the Newton-Raphson method. Example: F(X) = X * Ln(X) - 1 = 0 Derivative: F'(X) = Ln(X) + 1 True Solution is X = 1.763222834... ****************************************************************** } program testnr1; uses tpmath; { ****************************************************************** Define the function and its derivative ****************************************************************** } function Func(X : Float) : Float; begin Func := X * Ln(X) - 1 end; function Deriv(X : Float) : Float; begin Deriv := Ln(X) + 1 end; { ****************************************************************** Define number of iterations and precision ****************************************************************** } const MaxIter = 1000; { Max number of iterations } Tol = 1E-6; { Required precision } { ****************************************************************** Main program ****************************************************************** } var F, X : Float; begin { Define a starting point near the root } X := 1; {$IFDEF FPC} NewtEq(@Func, @Deriv, X, MaxIter, Tol, F); {$ELSE} NewtEq(Func, Deriv, X, MaxIter, Tol, F); {$ENDIF} case MathErr of OptNonConv : begin writeln('Non-convergence!'); halt; end; OptSing : begin writeln('Null derivative!'); halt; end; end; writeln; writeln('Solution to nonlinear equation (Newton-Raphson method)'); writeln('------------------------------------------------------'); writeln; writeln('Root: ', X:12:6); writeln; writeln('Function value:', F:12:6); writeln; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/equation/testnr.pas0000664000175000017500000000624111326434464023736 0ustar michaelmichael{ ****************************************************************** Solution to a system of nonlinear equations by the Newton-Raphson method. Example (from Numerical Recipes Example Book): F(X, Y) = X^2 + Y^2 - 2 = 0 G(X, Y) = EXP(X - 1) + Y^3 - 2 = 0 ( 2 * X 2 * Y ) Jacobian: D = ( ) ( EXP(X - 1) 3 * Y^2 ) True Solution is at (1, 1) ****************************************************************** } program testnr; uses tpmath; { ****************************************************************** Define number of variables, number of iterations, and precision ****************************************************************** } const Nvar = 2; { Number of variables } MaxIter = 1000; { Max number of iterations } Tol = 1.0E-6; { Required precision (must be > Sqrt(MachEp)) } { ****************************************************************** Define the system of equations to be solved ****************************************************************** } procedure Equations (X, F : PVector); var X1p2, X2p2, X2p3 : Float; begin X1p2 := X^[1] * X^[1]; X2p2 := X^[2] * X^[2]; X2p3 := X^[2] * X2p2; F^[1] := X1p2 + X2p2 - 2; F^[2] := Exp(X^[1] - 1) + X2p3 - 2; end; { ****************************************************************** Define the subroutine which computes the jacobian of the system. It is recommended to use analytical derivatives whenever possible. Otherwise you can use the alternative code provided in numjac.inc ****************************************************************** } procedure Jacobian(X : PVector; D : PMatrix); begin D^[1]^[1] := 2 * X^[1]; D^[1]^[2] := 2 * X^[2]; D^[2]^[1] := Exp(X^[1] - 1); D^[2]^[2] := 3 * X^[2] * X^[2]; end; { ****************************************************************** Alternative code if the analytical derivatives are not available ****************************************************************** } (* {$i numjac.inc} *) { ****************************************************************** Main program ****************************************************************** } var X, F : PVector; { Variables: X^[1] = X, X^[2] = Y } I : Integer; { Loop variable } begin DimVector(X, Nvar); DimVector(F, Nvar); { Define starting point } X^[1] := 2; X^[2] := 0.5; {$IFDEF FPC} NewtEqs(@Equations, @Jacobian, X, F, 1, Nvar, MaxIter, Tol); {$ELSE} NewtEqs(Equations, Jacobian, X, F, 1, Nvar, MaxIter, Tol); {$ENDIF} if MathErr = OptNonConv then begin writeln('Non-convergence!'); halt; end; writeln; writeln('Solution to nonlinear equation system (Newton-Raphson method)'); writeln('-------------------------------------------------------------'); writeln; writeln('Solution vector:'); writeln; for I := 1 to Nvar do writeln('X(', I, ') = ', X^[I]:10:6); writeln; writeln('Function values:'); writeln; for I := 1 to Nvar do writeln('F(', I, ') = ', F^[I]:10:6); writeln; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/equation/testbrdn.pas0000664000175000017500000000456111326434464024247 0ustar michaelmichael{ ****************************************************************** Solution to a system of nonlinear equations by Broyden's method. Example (from Numerical Recipes Example Book): F(X, Y) = X^2 + Y^2 - 2 = 0 G(X, Y) = EXP(X - 1) + Y^3 - 2 = 0 ( 2 * X 2 * Y ) Jacobian: D = ( ) ( EXP(X - 1) 3 * Y^2 ) True Solution is at (1, 1) ****************************************************************** } program testbrdn; uses tpmath; { ****************************************************************** Define the system of equations to be solved ****************************************************************** } procedure Equations(X, F : PVector); var X1p2, X2p2, X2p3 : Float; begin X1p2 := X^[1] * X^[1]; X2p2 := X^[2] * X^[2]; X2p3 := X^[2] * X2p2; F^[1] := X1p2 + X2p2 - 2; F^[2] := Exp(X^[1] - 1) + X2p3 - 2; end; { ****************************************************************** Define number of variables, number of iterations, and precision ****************************************************************** } const Nvar = 2; { Number of variables } MaxIter = 1000; { Max number of iterations } Tol = 1.0E-6; { Required precision (must be > Sqrt(MachEp)) } var X, F : PVector; { Variables: X^[1] = X, X^[2] = Y } I : Integer; { Loop variable } { ****************************************************************** Main program ****************************************************************** } begin DimVector(X, Nvar); DimVector(F, Nvar); { Define starting point } X^[1] := 2; X^[2] := 0.5; {$IFDEF FPC} Broyden(@Equations, X, F, 1, Nvar, MaxIter, Tol); {$ELSE} Broyden(Equations, X, F, 1, Nvar, MaxIter, Tol); {$ENDIF} if MathErr = OptNonConv then begin writeln('Non-convergence!'); halt; end; writeln; writeln('Solution to nonlinear equation system (Broyden''s method)'); writeln('--------------------------------------------------------'); writeln; writeln('Solution vector:'); writeln; for I := 1 to Nvar do writeln('X(', I, ') = ', X^[I]:10:6); writeln; writeln('Function values:'); writeln; for I := 1 to Nvar do writeln('F(', I, ') = ', F^[I]:10:6); writeln; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/equation/testbis.pas0000664000175000017500000000312111326434464024066 0ustar michaelmichael{ ****************************************************************** Solution to a nonlinear equation by the bisection method. Example: F(X) = X * Ln(X) - 1 = 0 True Solution is X = 1.763222834... ****************************************************************** } program testbis; uses tpmath; { ****************************************************************** Define the function ****************************************************************** } function Func(X : Float) : Float; begin Func := X * Ln(X) - 1 end; { ****************************************************************** Define number of iterations and precision ****************************************************************** } const MaxIter = 1000; { Max number of iterations } Tol = 1E-6; { Required precision } { ****************************************************************** Main program ****************************************************************** } var F, X, Y : Float; begin { Give two starting points near the root } X := 1; Y := 2; {$IFDEF FPC} Bisect(@Func, X, Y, MaxIter, Tol, F); {$ELSE} Bisect(Func, X, Y, MaxIter, Tol, F); {$ENDIF} if MathErr = OptNonConv then begin writeln('Non-convergence!'); halt; end; writeln; writeln('Solution to nonlinear equation (Bisection method)'); writeln('-------------------------------------------------'); writeln; writeln('Root: ', X:12:6); writeln; writeln('Function value:', F:12:6); writeln; end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/equation/numjac.inc0000664000175000017500000000267210652636500023662 0ustar michaelmichael{ ****************************************************************** Numerical jacobian ****************************************************************** } procedure Jacobian(X : PVector; D : PMatrix); const EtaMin = 1E-6; { Relative increment used to compute derivatives } var I, J : Integer; R, Temp : Float; Eta : Float; Delta : PVector; { Increment } Xminus : PVector; { X - Delta } Xplus : PVector; { X + Delta } Fminus : PVector; { F(X - Delta) } Fplus : PVector; { F(X + Delta) } begin DimVector(Delta, Nvar); DimVector(Xminus, Nvar); DimVector(Xplus, Nvar); DimVector(Fminus, Nvar); DimVector(Fplus, Nvar); Eta := Sqrt(MachEp); if Eta < EtaMin then Eta := EtaMin; for I := 1 to Nvar do begin if X^[I] <> 0 then Delta^[I] := Eta * Abs(X^[I]) else Delta^[I] := Eta; Xplus^[I] := X^[I] + Delta^[I]; Xminus^[I] := X^[I] - Delta^[I] end; for J := 1 to Nvar do begin Temp := X^[J]; X^[J] := Xminus^[J]; Equations(X, Fminus); X^[J] := Xplus^[J]; Equations(X, Fplus); R := 1.0 / (2.0 * Delta^[J]); for I := 1 to Nvar do D^[I]^[J] := R * (Fplus^[I] - Fminus^[I]); X^[J] := Temp; end; DelVector(Delta, Nvar); DelVector(Xminus, Nvar); DelVector(Xplus, Nvar); DelVector(Fminus, Nvar); DelVector(Fplus, Nvar); end; mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/curfit/0000775000175000017500000000000011660470014021346 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/fpmath/demo/curfit/wreglin.pas0000664000175000017500000001305611326434464023537 0ustar michaelmichael{ ****************************************************************** This program performs a weighted least squares fit of a straight line: Y = B(0) + B(1) * X ****************************************************************** } program wreglin; uses tpmath, tpgraph; const N = 6; { Number of points } Alpha = 0.05; { Significance level } { Data (S = standard deviations of observed Y values) } const X : array[1..N] of Float = (3.195, 3.247, 3.3, 3.356, 3.413, 3.472); Y : array[1..N] of Float = (1.8, 1.61, 1.38, 0.98, 0.81, 0.56); S : array[1..N] of Float = (0.03, 0.03, 0.02, 0.03, 0.01, 0.06); var B : PVector; { Regression parameters } function PltFunc(X : Float) : Float; { ------------------------------------------------------------------ Function to be plotted ------------------------------------------------------------------ } begin PltFunc := B^[0] + B^[1] * X end; procedure WriteResults(X, Y, S, Ycalc, B : PVector; V : PMatrix; Test : TRegTest; Tc, Fc : Float); { ------------------------------------------------------------------ Writes results to screen ------------------------------------------------------------------ } var Line1, Line2 : String; { Separating lines } Delta : Float; { Residual } Sr : Float; { Residual standard deviation } SB : Float; { Standard deviations of parameters } I : Integer; { Loop variable } begin Line1 := StrChar(73, '-'); Line2 := StrChar(73, '='); WriteLn(Line2); WriteLn('Linear regression: Y = B(0) + B(1) * X'); WriteLn(Line1); WriteLn('Parameter Est.value Std.dev. ', (100 * (1 - Alpha)):2:0, '% Confidence Interval'); WriteLn(Line1); for I := 0 to 1 do begin SB := Sqrt(V^[I]^[I]); WriteLn('B(', I:1, ')', B^[I]:17:8, SB:17:8, (B^[I] - Tc * SB):17:8, ';', (B^[I] + Tc * SB):17:8); end; WriteLn(Line1); WriteLn('Number of observations : n = ', N:5); with Test do begin Sr := Sqrt(Vr); WriteLn('Residual error : s = ', Sr:10:4); WriteLn('Coefficient of correlation : r = ', (Sgn(B^[1]) * Sqrt(R2)):10:4); WriteLn('Coefficient of determination : r2 = ', R2:10:4); WriteLn('Adjusted coeff. of determination : r2a = ', R2a:10:4); WriteLn('Variance ratio (explained/resid.) : F(', Nu1:3, ', ', Nu2:3, ') = ', F:10:4); WriteLn('Critical variance ratio : F(p = ', (1 - Alpha):4:2, ') = ', Fc:10:4); end; WriteLn(Line1); WriteLn(' i Y obs. Y calc. Residual Std.dev. Std.res.'); WriteLn(Line1); for I := 1 to N do begin Delta := Y^[I] - Ycalc^[I]; WriteLn(I:3, Y^[I]:14:4, Ycalc^[I]:14:4, Delta:14:4, S^[I]:14:4, (Delta / S^[I]):14:4); end; WriteLn(Line2); end; procedure PlotGraph(X, Y, S, B : PVector); { ------------------------------------------------------------------ Plots histogram and normal curve ------------------------------------------------------------------ } var Xmin, Xmax, Xstep : Float; { Ox scale } Ymin, Ymax, Ystep : Float; { Oy scale } begin if not InitGraphics(9, 2, 'c:\tp\bgi') then { 640x480 16 color } begin Writeln('Unable to set graphic mode'); Exit; end; SetWindow(15, 85, 15, 85, True); AutoScale(X, 1, N, LinScale, Xmin, Xmax, Xstep); AutoScale(Y, 1, N, LinScale, Ymin, Ymax, Ystep); SetOxScale(LinScale, Xmin, Xmax, Xstep); SetOyScale(LinScale, Ymin, Ymax, Ystep); SetGraphTitle('Weighted Linear Regression'); SetOxTitle('X'); SetOyTitle('Y'); PlotOxAxis; PlotOyAxis; WriteGraphTitle; SetClipping(True); SetPointParam(1, 1, 3, 12); SetLineParam(1, 0, 0, 12); { Don't connect points } PlotCurveWithErrorBars(X, Y, S, 1, 1, N, 1); PlotFunc({$IFDEF FPC}@{$ENDIF}PltFunc, Xmin, Xmax, 1); Readln; LeaveGraphics; end; { ****************************************************************** Main program ****************************************************************** } var XX, YY : PVector; { Data } SS : PVector; { Standard deviations of observed Y values } Ycalc : PVector; { Computed Y values } V : PMatrix; { Variance-covariance matrix } Test : TRegTest; { Statistical tests } Tc : Float; { Critical t value } Fc : Float; { Critical F value } I : Integer; { Loop variable } begin { Dimension arrays } DimVector(XX, N); DimVector(YY, N); DimVector(SS, N); DimVector(Ycalc, N); DimVector(B, 1); DimMatrix(V, 1, 1); { Read data } for I := 1 to N do begin XX^[I] := X[I]; YY^[I] := Y[I]; SS^[I] := S[I]; end; { Perform regression } WLinFit(XX, YY, SS, 1, N, B, V); { Compute predicted Y values } for I := 1 to N do Ycalc^[I] := B^[0] + B^[1] * XX^[I]; { Update variance-covariance matrix and compute statistical tests } WRegTest(YY, Ycalc, SS, 1, N, V, 0, 1, Test); { Compute Student's t and Snedecor's F } Tc := InvStudent(N - 2, 1 - 0.5 * Alpha); Fc := InvSnedecor(1, N - 2, 1 - Alpha); { Write results } WriteResults(XX, YY, SS, Ycalc, B, V, Test, Tc, Fc); Readln; { Plot curve } PlotGraph(XX, YY, SS, B); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/curfit/regpoly.pas0000664000175000017500000001260111326434464023544 0ustar michaelmichael{ ****************************************************************** This program performs a least squares fit of a polynomial: Y = B(0) + B(1) * X + B(2) * X§ + ... ****************************************************************** } program regpoly; uses tpmath, tpgraph; const N = 12; { Number of points } Deg = 2; { Degree of polynomial } Alpha = 0.05; { Significance level } { Data } const X : array[1..N] of Float = (0, 0.0136, 0.023, 0.0352, 0.048, 0.075, 0.1067, 0.1374, 0.1734, 0.2139, 0.2594, 0.3113); Y : array[1..N] of Float = (3.97, 4.03, 4.1, 4.2, 4.28, 4.47, 4.66, 4.83, 4.99, 5.12, 5.25, 5.37); var B : PVector; { Regression parameters } function PltFunc(X : Float) : Float; { ------------------------------------------------------------------ Function to be plotted ------------------------------------------------------------------ } begin PltFunc := Poly(X, B, Deg); end; procedure WriteResults(X, Y, Ycalc, B : PVector; V : PMatrix; Test : TRegTest; Tc, Fc : Float); { ------------------------------------------------------------------ Writes results to screen ------------------------------------------------------------------ } var Line1, Line2 : String; { Separating lines } Delta : Float; { Residual } Sr : Float; { Residual standard deviation } SB : Float; { Standard deviations of parameters } I : Integer; { Loop variable } begin Line1 := StrChar(73, '-'); Line2 := StrChar(73, '='); WriteLn(Line2); WriteLn('Polynomial regression: Y = B(0) + B(1) * X + B(2) * X§ + ...'); WriteLn(Line1); WriteLn('Parameter Est.value Std.dev. ', (100 * (1 - Alpha)):2:0, '% Confidence Interval'); WriteLn(Line1); for I := 0 to Deg do begin SB := Sqrt(V^[I]^[I]); WriteLn('B(', I:1, ')', B^[I]:17:8, SB:17:8, (B^[I] - Tc * SB):17:8, ';', (B^[I] + Tc * SB):17:8); end; WriteLn(Line1); WriteLn('Number of observations : n = ', N:5); with Test do begin Sr := Sqrt(Vr); WriteLn('Residual error : s = ', Sr:10:4); WriteLn('Coefficient of correlation : r = ', (Sqrt(R2)):10:4); WriteLn('Coefficient of determination : r2 = ', R2:10:4); WriteLn('Adjusted coeff. of determination : r2a = ', R2a:10:4); WriteLn('Variance ratio (explained/resid.) : F(', Nu1:3, ', ', Nu2:3, ') = ', F:10:4); WriteLn('Critical variance ratio : F(p = ', (1 - Alpha):4:2, ') = ', Fc:10:4); end; WriteLn(Line1); WriteLn(' i Y obs. Y calc. Residual Std.dev. Std.res.'); WriteLn(Line1); for I := 1 to N do begin Delta := Y^[I] - Ycalc^[I]; WriteLn(I:3, Y^[I]:14:4, Ycalc^[I]:14:4, Delta:14:4, Sr:14:4, (Delta / Sr):14:4); end; WriteLn(Line2); end; procedure PlotGraph(X, Y, B : PVector); { ------------------------------------------------------------------ Plots points and fitted curve ------------------------------------------------------------------ } var Xmin, Xmax, Xstep : Float; { Ox scale } Ymin, Ymax, Ystep : Float; { Oy scale } begin if not InitGraphics(9, 2, 'c:\tp\bgi') then { 640x480 16 color } begin Writeln('Unable to set graphic mode'); Exit; end; SetWindow(15, 85, 15, 85, True); AutoScale(X, 1, N, LinScale, Xmin, Xmax, Xstep); AutoScale(Y, 1, N, LinScale, Ymin, Ymax, Ystep); SetOxScale(LinScale, Xmin, Xmax, Xstep); SetOyScale(LinScale, Ymin, Ymax, Ystep); SetGraphTitle('Polynomial Regression'); SetOxTitle('X'); SetOyTitle('Y'); PlotOxAxis; PlotOyAxis; WriteGraphTitle; SetClipping(True); SetLineParam(1, 0, 0, 0); { Don't connect points } PlotCurve(X, Y, 1, N, 1); PlotFunc({$IFDEF FPC}@{$ENDIF}PltFunc, Xmin, Xmax, 2); Readln; LeaveGraphics; end; { ****************************************************************** Main program ****************************************************************** } var XX, YY : PVector; { Data } Ycalc : PVector; { Computed Y values } V : PMatrix; { Variance-covariance matrix } Test : TRegTest; { Statistical tests } Tc : Float; { Critical t value } Fc : Float; { Critical F value } I : Integer; { Loop variable } begin { Dimension arrays } DimVector(XX, N); DimVector(YY, N); DimVector(Ycalc, N); DimVector(B, Deg); DimMatrix(V, Deg, Deg); { Read data } for I := 1 to N do begin XX^[I] := X[I]; YY^[I] := Y[I]; end; { Perform regression } PolFit(XX, YY, 1, N, Deg, B, V); { Compute predicted Y values } for I := 1 to N do Ycalc^[I] := Poly(XX^[I], B, Deg); { Update variance-covariance matrix and compute statistical tests } RegTest(YY, Ycalc, 1, N, V, 0, Deg, Test); { Compute Student's t and Snedecor's F } Tc := InvStudent(Test.Nu2, 1 - 0.5 * Alpha); Fc := InvSnedecor(Test.Nu1, Test.Nu2, 1 - Alpha); { Write results } WriteResults(XX, YY, Ycalc, B, V, Test, Tc, Fc); { Plot curve } PlotGraph(XX, YY, B); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/curfit/regnlin.pas0000664000175000017500000001616311326434464023530 0ustar michaelmichael{ ****************************************************************** Nonlinear regression ****************************************************************** } program regnlin; uses tpmath, tpgraph; const FuncName = 'Y = B(1) * Exp(- B(2) * X)'; N = 10; { Number of points } FirstPar = 1; { Index of first fitted parameter } LastPar = 2; { Index of last fitted parameter } MaxIter = 1000; { Max. number of iterations } Tol = 1.0E-3; { Required precision } Alpha = 0.05; { Significance level } { Data } const X : array[1..N] of Float = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Y : array[1..N] of Float = (416, 319, 244, 188, 144, 113, 85, 66, 50, 41); var B : PVector; { Regression parameters } procedure ApproxFit(B : PVector); { ------------------------------------------------------------------ Approximate fit of the exponential model by weighted linear regression: Ln(Y) = Ln(B(1)) - B(2) * X ------------------------------------------------------------------ } var P : Integer; { Nb. of points for linear reg. } K : Integer; { Loop variable } X1, Y1 : PVector; { Transformed coordinates } S1 : PVector; { Standard deviations } A : PVector; { Linear regression param. Y = A^[0] + A^[1] * X } V : PMatrix; { Variance-covariance matrix } begin P := 0; { Count the number of points } for K := 1 to N do { which can be transformed } if Y[K] > 0.0 then Inc(P); DimVector(X1, P); DimVector(Y1, P); DimVector(S1, P); DimVector(A, 1); DimMatrix(V, 1, 1); P := 0; for K := 1 to N do if Y[K] > 0.0 then begin Inc(P); X1^[P] := X[K]; Y1^[P] := Ln(Y[K]); S1^[P] := 1.0 / Y[K]; end; WLinFit(X1, Y1, S1, 1, P, A, V); if MathErr = MatOk then begin B^[1] := Exp(A^[0]); B^[2] := - A^[1]; end; DelVector(A, 1); DelMatrix(V, 1, 1); end; function RegFunc(X : Float; B : PVector) : Float; begin RegFunc := B^[1] * Exp(- B^[2] * X); end; procedure DerivProc(X, Y : Float; B, D : PVector); begin D^[1] := Exp(- B^[2] * X); D^[2] := - B^[1] * X * D^[1]; end; procedure WriteResults(X, Y, Ycalc, B : PVector; V : PMatrix; Test : TRegTest; Tc, Fc : Float); { ------------------------------------------------------------------ Writes results to screen ------------------------------------------------------------------ } var Line1, Line2 : String; { Separating lines } Delta : Float; { Residual } Sr : Float; { Residual standard deviation } SB : Float; { Standard deviations of parameters } I : Integer; { Loop variable } begin Line1 := StrChar(73, '-'); Line2 := StrChar(73, '='); WriteLn(Line2); WriteLn('Nonlinear regression: ', FuncName); WriteLn(Line1); WriteLn('Parameter Est.value Std.dev. ', (100 * (1 - Alpha)):2:0, '% Confidence Interval'); WriteLn(Line1); for I := FirstPar to LastPar do begin SB := Sqrt(V^[I]^[I]); WriteLn('B(', I:1, ')', B^[I]:17:8, SB:17:8, (B^[I] - Tc * SB):17:8, ';', (B^[I] + Tc * SB):17:8); end; WriteLn(Line1); WriteLn('Number of observations : n = ', N:5); with Test do begin Sr := Sqrt(Vr); WriteLn('Residual error : s = ', Sr:10:4); if R2 <= 1.0 then begin WriteLn('Coefficient of correlation : r = ', (Sqrt(R2)):10:4); WriteLn('Coefficient of determination : r2 = ', R2:10:4); WriteLn('Adjusted coeff. of determination : r2a = ', R2a:10:4); end; WriteLn('Variance ratio (explained/resid.) : F(', Nu1:3, ', ', Nu2:3, ') = ', F:10:4); WriteLn('Critical variance ratio : F(p = ', (1 - Alpha):4:2, ') = ', Fc:10:4); end; WriteLn(Line1); WriteLn(' i Y obs. Y calc. Residual Std.dev. Std.res.'); WriteLn(Line1); for I := 1 to N do begin Delta := Y^[I] - Ycalc^[I]; WriteLn(I:3, Y^[I]:14:4, Ycalc^[I]:14:4, Delta:14:4, Sr:14:4, (Delta / Sr):14:4); end; WriteLn(Line2); end; function PltFunc(X : Float) : Float; { ------------------------------------------------------------------ Function to be plotted ------------------------------------------------------------------ } begin PltFunc := RegFunc(X, B); end; procedure PlotGraph(X, Y, B : PVector); { ------------------------------------------------------------------ Plots points and fitted curve ------------------------------------------------------------------ } var Xmin, Xmax, Xstep : Float; { Ox scale } Ymin, Ymax, Ystep : Float; { Oy scale } begin if not InitGraphics(9, 2, 'c:\tp\bgi') then { 640x480 16 color } begin Writeln('Unable to set graphic mode'); Exit; end; SetWindow(15, 85, 15, 85, True); AutoScale(X, 1, N, LinScale, Xmin, Xmax, Xstep); AutoScale(Y, 1, N, LinScale, Ymin, Ymax, Ystep); SetOxScale(LinScale, Xmin, Xmax, Xstep); SetOyScale(LinScale, Ymin, Ymax, Ystep); SetGraphTitle('Polynomial Regression'); SetOxTitle('X'); SetOyTitle('Y'); PlotOxAxis; PlotOyAxis; WriteGraphTitle; SetClipping(True); SetLineParam(1, 0, 0, 0); { Don't connect points } PlotCurve(X, Y, 1, N, 1); PlotFunc({$IFDEF FPC}@{$ENDIF}PltFunc, Xmin, Xmax, 2); Readln; LeaveGraphics; end; var XX, YY : PVector; { Data } Ycalc : PVector; { Computed Y values } V : PMatrix; { Variance-covariance matrix } Test : TRegTest; { Statistical tests } Tc : Float; { Critical t value } Fc : Float; { Critical F value } I : Integer; { Loop variable } begin DimVector(XX, N); DimVector(YY, N); DimVector(Ycalc, N); DimVector(B, LastPar); DimMatrix(V, LastPar, LastPar); { Read data } for I := 1 to N do begin XX^[I] := X[I]; YY^[I] := Y[I]; end; ApproxFit(B); NLFit({$IFDEF FPC}@{$ENDIF}RegFunc, {$IFDEF FPC}@{$ENDIF}DerivProc, XX, YY, 1, N, MaxIter, Tol, B, FirstPar, LastPar, V); if MathErr = MatOk then begin { Compute predicted Y values } for I := 1 to N do Ycalc^[I] := RegFunc(XX^[I], B); { Update variance-covariance matrix and compute statistical tests } RegTest(YY, Ycalc, 1, N, V, FirstPar, LastPar, Test); { Compute Student's t and Snedecor's F } Tc := InvStudent(Test.Nu2, 1 - 0.5 * Alpha); Fc := InvSnedecor(Test.Nu1, Test.Nu2, 1 - Alpha); { Write results } WriteResults(XX, YY, Ycalc, B, V, Test, Tc, Fc); { Plot curve } PlotGraph(XX, YY, B); end else Writeln('Unable to fit curve!'); DelVector(XX, N); DelVector(YY, N); DelVector(Ycalc, N); DelVector(B, LastPar); DelMatrix(V, LastPar, LastPar); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/curfit/regmult.pas0000664000175000017500000001466411326434464023555 0ustar michaelmichael{ ****************************************************************** This program performs a multiple linear least squares fit: Y = B(0) + B(1) * X1 + B(2) * X2 + ... ****************************************************************** } program regmult; uses tpmath, tpgraph; const N = 23; { Number of observations } Nvar = 4; { Number of independent variables } Alpha = 0.05; { Significance level } ConsTerm = True; { Include a constant term B(0) } { Data } const X : array[1..N, 1..Nvar] of Float = ((-0.27, 7.327, 0, 0), (-0.55, 7.4 , 0, 0), (-0.53, 7.74 , 0, 0), (-0.57, 7.95 , 0, 0), (-0.87, 7.9 , 0, 0), (-1.36, 7.931, 0, 0), (-0.39, 6.849, 0, 0), (-0.66, 7.508, 0, 0), (-0.33, 7.419, 0, 0), (-1.7 , 7.496, 0, 0), (-0.68, 7.027, 0, 0), (-0.79, 8.15 , 0, 0), (-0.82, 8.822, 0, 0), (-0.66, 8.334, 0, 0), ( 0.02, 7.421, 0, 0), ( 0.06, 7.862, 1, 0), (-0.3 , 8.483, 1, 0), ( 0.07, 9.82 , 0, 0), ( 0 , 7.641, 1, 0), (-0.8 , 7.601, 0, 1), (-1.05, 7.565, 0, 1), (-0.35, 7.993, 0, 0), (-0.11, 7.13 , 0, 0)); const Y : array[1..N] of Float = (3.21, 3.94, 3.66, 3.99, 4.06, 4.09, 3.36, 3.92, 3.58, 4.26, 3.06, 4.13, 4.27, 4.36, 3.72, 3.89, 4.39, 3.92, 3.89, 5.1 , 5.14, 3.68, 3.7); { ****************************************************************** Subprograms ****************************************************************** } procedure WriteResults(Y, Ycalc : PVector; B : PVector; V : PMatrix; Test : TRegTest; Tc, Fc : Float); { ------------------------------------------------------------------ Writes results to screen ------------------------------------------------------------------ } var Line1, Line2 : String; { Separating lines } Delta : Float; { Residual } Sr : Float; { Residual standard deviation } SB : Float; { Standard deviations of parameters } Lb : Integer; { Index of first parameter } I : Integer; { Loop variable } begin Line1 := StrChar(73, '-'); Line2 := StrChar(73, '='); WriteLn(Line2); Write('Multiple linear regression: Y = '); if ConsTerm then Write('B(0) + '); WriteLn('B(1) * X1 + B(2) * X2 + ...'); WriteLn(Line1); WriteLn('Parameter Est.value Std.dev. ', (100 * (1 - Alpha)):2:0, '% Confidence Interval'); WriteLn(Line1); if ConsTerm then Lb := 0 else Lb := 1; for I := Lb to Nvar do begin SB := Sqrt(V^[I]^[I]); WriteLn('B(', I:1, ')', B^[I]:17:8, SB:17:8, (B^[I] - Tc * SB):17:8, ';', (B^[I] + Tc * SB):17:8); end; WriteLn(Line1); WriteLn('Number of observations : n = ', N:5); with Test do begin Sr := Sqrt(Vr); WriteLn('Residual error : s = ', Sr:10:4); WriteLn('Coefficient of correlation : r = ', (Sgn(B^[1]) * Sqrt(R2)):10:4); WriteLn('Coefficient of determination : r2 = ', R2:10:4); WriteLn('Adjusted coeff. of determination : r2a = ', R2a:10:4); WriteLn('Variance ratio (explained/resid.) : F(', Nu1:3, ', ', Nu2:3, ') = ', F:10:4); WriteLn('Critical variance ratio : F(p = ', (1 - Alpha):4:2, ') = ', Fc:10:4); end; WriteLn(Line1); WriteLn(' i Y obs. Y calc. Residual Std.dev. Std.res.'); WriteLn(Line1); for I := 1 to N do begin Delta := Y^[I] - Ycalc^[I]; WriteLn(I:3, Y^[I]:14:4, Ycalc^[I]:14:4, Delta:14:4, Sr:14:4, (Delta / Sr):14:4); end; WriteLn(Line2); end; procedure PlotGraph(Y, Ycalc : PVector); { ------------------------------------------------------------------ Plots observed vs calculated Y values ------------------------------------------------------------------ } var Xmin, Xmax, Xstep : Float; { Ox scale } Ymin, Ymax, Ystep : Float; { Oy scale } begin if not InitGraphics(9, 2, 'c:\tp\bgi') then { 640x480 16 color } begin Writeln('Unable to set graphic mode'); Exit; end; SetWindow(15, 85, 15, 85, True); AutoScale(Y, 1, N, LinScale, Xmin, Xmax, Xstep); AutoScale(Ycalc, 1, N, LinScale, Ymin, Ymax, Ystep); SetOxScale(LinScale, Xmin, Xmax, Xstep); SetOyScale(LinScale, Ymin, Ymax, Ystep); SetGraphTitle('Multiple Linear Regression'); SetOxTitle('Y obs.'); SetOyTitle('Y calc.'); PlotOxAxis; PlotOyAxis; WriteGraphTitle; SetClipping(True); SetLineParam(1, 0, 0, 0); { Don't connect points } PlotCurve(Y, Ycalc, 1, N, 1); Readln; LeaveGraphics; end; { ****************************************************************** Main program ****************************************************************** } var XX : PMatrix; { Independent variables } YY : PVector; { Dependent variable } Ycalc : PVector; { Computed Y values } B : PVector; { Fitted parameters } V : PMatrix; { Variance-covariance matrix } Test : TRegTest; { Statistical tests } Tc : Float; { Critical t value } Fc : Float; { Critical F value } Lb : Integer; { Index of first parameter } I, J : Integer; { Loop variable } begin { Dimension arrays } DimMatrix(XX, N, Nvar); DimVector(YY, N); DimVector(Ycalc, N); DimVector(B, Nvar); DimMatrix(V, Nvar, Nvar); { Read data } for I := 1 to N do begin for J := 1 to Nvar do XX^[I]^[J] := X[I,J]; YY^[I] := Y[I]; end; { Perform regression } { MulFit(XX, YY, 1, N, Nvar, ConsTerm, B, V); } SVDFit(XX, YY, 1, N, Nvar, ConsTerm, 1.0E-8, B, V); { Compute predicted Y values } for I := 1 to N do begin if ConsTerm then Ycalc^[I] := B^[0] else Ycalc^[I] := 0.0; for J := 1 to Nvar do Ycalc^[I] := Ycalc^[I] + B^[J] * XX^[I]^[J]; end; { Update variance-covariance matrix and compute statistical tests } if ConsTerm then Lb := 0 else Lb := 1; RegTest(YY, Ycalc, 1, N, V, Lb, Nvar, Test); { Compute Student's t and Snedecor's F } Tc := InvStudent(Test.Nu2, 1 - 0.5 * Alpha); Fc := InvSnedecor(Test.Nu1, Test.Nu2, 1 - Alpha); { Write results } WriteResults(YY, Ycalc, B, V, Test, Tc, Fc); Readln; { Plot curve } PlotGraph(YY, Ycalc); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/curfit/reglin.pas0000664000175000017500000001226111326434464023345 0ustar michaelmichael{ ****************************************************************** This program performs a least squares fit of a straight line: Y = B(0) + B(1) * X ****************************************************************** } program reglin; uses tpmath, tpgraph; const N = 5; { Number of points } Alpha = 0.05; { Significance level } { Data } const X : array[1..N] of Float = (10, 20, 30, 40, 50); Y : array[1..N] of Float = ( 0.1865, 0.3616, 0.537, 0.7359, 0.9238); var B : PVector; { Regression parameters } function PltFunc(X : Float) : Float; { ------------------------------------------------------------------ Function to be plotted ------------------------------------------------------------------ } begin PltFunc := B^[0] + B^[1] * X end; procedure WriteResults(X, Y, Ycalc, B : PVector; V : PMatrix; Test : TRegTest; Tc, Fc : Float); { ------------------------------------------------------------------ Writes results to screen ------------------------------------------------------------------ } var Line1, Line2 : String; { Separating lines } Delta : Float; { Residual } Sr : Float; { Residual standard deviation } SB : Float; { Standard deviations of parameters } I : Integer; { Loop variable } begin Line1 := StrChar(73, '-'); Line2 := StrChar(73, '='); WriteLn(Line2); WriteLn('Linear regression: Y = B(0) + B(1) * X'); WriteLn(Line1); WriteLn('Parameter Est.value Std.dev. ', (100 * (1 - Alpha)):2:0, '% Confidence Interval'); WriteLn(Line1); for I := 0 to 1 do begin SB := Sqrt(V^[I]^[I]); WriteLn('B(', I:1, ')', B^[I]:17:8, SB:17:8, (B^[I] - Tc * SB):17:8, ';', (B^[I] + Tc * SB):17:8); end; WriteLn(Line1); WriteLn('Number of observations : n = ', N:5); with Test do begin Sr := Sqrt(Vr); WriteLn('Residual error : s = ', Sr:10:4); WriteLn('Coefficient of correlation : r = ', (Sgn(B^[1]) * Sqrt(R2)):10:4); WriteLn('Coefficient of determination : r2 = ', R2:10:4); WriteLn('Adjusted coeff. of determination : r2a = ', R2a:10:4); WriteLn('Variance ratio (explained/resid.) : F(', Nu1:3, ', ', Nu2:3, ') = ', F:10:4); WriteLn('Critical variance ratio : F(p = ', (1 - Alpha):4:2, ') = ', Fc:10:4); end; WriteLn(Line1); WriteLn(' i Y obs. Y calc. Residual Std.dev. Std.res.'); WriteLn(Line1); for I := 1 to N do begin Delta := Y^[I] - Ycalc^[I]; WriteLn(I:3, Y^[I]:14:4, Ycalc^[I]:14:4, Delta:14:4, Sr:14:4, (Delta / Sr):14:4); end; WriteLn(Line2); end; procedure PlotGraph(X, Y, B : PVector); { ------------------------------------------------------------------ Plots histogram and normal curve ------------------------------------------------------------------ } var Xmin, Xmax, Xstep : Float; { Ox scale } Ymin, Ymax, Ystep : Float; { Oy scale } begin if not InitGraphics(9, 2, 'c:\tp\bgi') then { 640x480 16 color } begin Writeln('Unable to set graphic mode'); Exit; end; SetWindow(15, 85, 15, 85, True); AutoScale(X, 1, N, LinScale, Xmin, Xmax, Xstep); AutoScale(Y, 1, N, LinScale, Ymin, Ymax, Ystep); SetOxScale(LinScale, Xmin, Xmax, Xstep); SetOyScale(LinScale, Ymin, Ymax, Ystep); SetGraphTitle('Linear Regression'); SetOxTitle('X'); SetOyTitle('Y'); PlotOxAxis; PlotOyAxis; WriteGraphTitle; SetClipping(True); SetLineParam(1, 0, 0, 0); { Don't connect points } PlotCurve(X, Y, 1, N, 1); PlotFunc({$IFDEF FPC}@{$ENDIF}PltFunc, Xmin, Xmax, 2); Readln; LeaveGraphics; end; { ****************************************************************** Main program ****************************************************************** } var XX, YY : PVector; { Data } Ycalc : PVector; { Computed Y values } V : PMatrix; { Variance-covariance matrix } Test : TRegTest; { Statistical tests } Tc : Float; { Critical t value } Fc : Float; { Critical F value } I : Integer; { Loop variable } begin { Dimension arrays } DimVector(XX, N); DimVector(YY, N); DimVector(Ycalc, N); DimVector(B, 1); DimMatrix(V, 1, 1); { Read data } for I := 1 to N do begin XX^[I] := X[I]; YY^[I] := Y[I]; end; { Perform regression } LinFit(XX, YY, 1, N, B, V); { Compute predicted Y values } for I := 1 to N do Ycalc^[I] := B^[0] + B^[1] * XX^[I]; { Update variance-covariance matrix and compute statistical tests } RegTest(YY, Ycalc, 1, N, V, 0, 1, Test); { Compute Student's t and Snedecor's F } Tc := InvStudent(N - 2, 1 - 0.5 * Alpha); Fc := InvSnedecor(1, N - 2, 1 - Alpha); { Write results } WriteResults(XX, YY, Ycalc, B, V, Test, Tc, Fc); { Plot curve } PlotGraph(XX, YY, B); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/curfit/pcatest.pas0000664000175000017500000000733711326434464023540 0ustar michaelmichael{ ****************************************************************** Correlation and principal component analysis ****************************************************************** Example taken from: P. DAGNELIE, Analyse statistique a plusieurs variables, Presses Agronomiques de Gembloux, Belgique, 1982 ****************************************************************** } program pcatest; uses tpmath; const N = 11; { Number of observations } Nvar = 4; { Number of variables } { Data } const X : array[1..N, 1..Nvar] of Float = (( 87.9, 19.6, 1 , 1661), ( 89.9, 15.2, 90.1, 968), (153 , 19.7, 56.6, 1353), (132.1, 17 , 91 , 1293), ( 88.8, 18.3, 93.7, 1153), (220.9, 17.8, 106.9, 1286), (117.7, 17.8, 65.5, 1104), (109 , 18.3, 41.8, 1574), (156.1, 17.8, 57.4, 1222), (181.5, 16.8, 140.6, 902), (181.4, 17 , 74.3, 1150)); var XX : PMatrix; { Data } M : PVector; { Mean vector } V : PMatrix; { Variance-covariance matrix } R : PMatrix; { Correlation matrix } S : PVector; { Standard deviations } Lambda : PVector; { Eigenvalues of correlation matrix } C : PMatrix; { Eigenvectors of correlation matrix } Rc : PMatrix; { Correlation factors/variables } Z : PMatrix; { Scaled variables } F : PMatrix; { Principal factors } I, J : Integer; { Loop variables } procedure PrintMatrix(Title : String; A : PMatrix; Ub1, Ub2 : Integer); { ------------------------------------------------------------------ Print matrix A[1..Ub1, 1..Ub2] ------------------------------------------------------------------ } var I, J : Integer; begin Writeln; Writeln(Title); Writeln; for I := 1 to Ub1 do begin for J := 1 to Ub2 do Write(A^[I]^[J]:12:4); Writeln; end; end; procedure PrintVector(Title : String; B : PVector; Ub : Integer); { ------------------------------------------------------------------ Print vector B[1..Ub] ------------------------------------------------------------------ } var I : Integer; begin Writeln; Writeln(Title); Writeln; for I := 1 to Ub do Writeln(B^[I]:12:4); end; begin DimMatrix(XX, N, Nvar); DimVector(M, Nvar); DimMatrix(V, Nvar, Nvar); DimMatrix(R, Nvar, Nvar); DimVector(S, Nvar); DimVector(Lambda, Nvar); DimMatrix(C, Nvar, Nvar); DimMatrix(Rc, Nvar, Nvar); DimMatrix(Z, N, Nvar); DimMatrix(F, N, Nvar); { Read data } for I := 1 to N do for J := 1 to Nvar do XX^[I]^[J] := X[I,J]; { Compute mean vector } VecMean(XX, 1, N, Nvar, M); { Compute variance-covariance matrix } MatVarCov(XX, 1, N, Nvar, M, V); { Compute correlation matrix } MatCorrel(V, Nvar, R); { Display results } Writeln; PrintVector('Mean vector', M, Nvar); PrintMatrix('Variance-covariance matrix', V, Nvar, Nvar); PrintMatrix('Correlation matrix', R, Nvar, Nvar); { Compute standard deviations } VecSD(XX, 1, N, Nvar, M, S); { Scale variables } ScaleVar(XX, 1, N, Nvar, M, S, Z); { Perform principal component analysis The original matrix R is destroyed } PCA(R, Nvar, 1000, 1.0E-10, Lambda, C, Rc); if MathErr = MatNonConv then begin Writeln('Non-convergence of eigenvalue computation'); Exit; end; { Compute principal factors } PrinFac(Z, 1, N, Nvar, C, F); { Display results } Writeln; PrintVector('Eigenvalues of correlation matrix', Lambda, Nvar); PrintMatrix('Eigenvectors (columns) of correlation matrix', C, Nvar, Nvar); PrintMatrix('Correlations between factors (columns) and variables (lines)', Rc, Nvar, Nvar); PrintMatrix('Principal factors', F, N, Nvar); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/demo/curfit/mcsim.pas0000664000175000017500000001041311326434464023172 0ustar michaelmichael{ ****************************************************************** Monte-Carlo simulation of the statistical distribution of the regression parameters for the exponential model: Y = B(1) * Exp(- B(2) * X) ****************************************************************** } program mcsim; uses tpmath, tpgraph; const FuncName = 'Y = B(1) * Exp(- B(2) * X)'; const NCycles = 10; { Number of cycles } MaxSim = 1000; { Max nb of simulations at each cycle } SavedSim = 1000; { Nb of simulations to be saved } MCFile = 'mcsim.txt'; { File for storing simulation results } const N = 10; { Number of points } FirstPar = 1; { Index of first fitted parameter } LastPar = 2; { Index of last fitted parameter } { Data } const X : array[1..N] of Float = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Y : array[1..N] of Float = (416, 319, 244, 188, 144, 113, 85, 66, 50, 41); function RegFunc(X : Float; B : PVector) : Float; begin RegFunc := B^[1] * Exp(- B^[2] * X); end; procedure WriteResults(B : PVector; V : PMatrix); { ------------------------------------------------------------------ Writes results to screen ------------------------------------------------------------------ } var Line1, Line2 : String; { Separating lines } SB : Float; { Standard deviations of parameters } I : Integer; { Loop variable } begin Line1 := StrChar(73, '-'); Line2 := StrChar(73, '='); WriteLn(Line2); WriteLn('Monte-Carlo simulation : ', FuncName); WriteLn(Line1); WriteLn('Parameter Est.value Std.dev. '); WriteLn(Line1); for I := FirstPar to LastPar do begin SB := Sqrt(V^[I]^[I]); WriteLn('B(', I:1, ')', B^[I]:17:8, SB:17:8); end; WriteLn(Line2); end; procedure PlotGraph(B1, B2 : PVector); { ------------------------------------------------------------------ Plots simulation results ------------------------------------------------------------------ } var Xmin, Xmax, Xstep : Float; { Ox scale } Ymin, Ymax, Ystep : Float; { Oy scale } begin if not InitGraphics(9, 2, 'c:\tp\bgi') then { 640x480 16 color } begin Writeln('Unable to set graphic mode'); Exit; end; SetWindow(15, 85, 15, 85, True); AutoScale(B1, 1, SavedSim, LinScale, Xmin, Xmax, Xstep); AutoScale(B2, 1, SavedSim, LinScale, Ymin, Ymax, Ystep); SetOxScale(LinScale, Xmin, Xmax, Xstep); SetOyScale(LinScale, Ymin, Ymax, Ystep); SetGraphTitle('Monte-Carlo simulation : ' + FuncName); SetOxTitle('B(1)'); SetOyTitle('B(2)'); SetFormat(10, 4, False, False); PlotOxAxis; PlotOyAxis; WriteGraphTitle; SetClipping(True); SetLineParam(1, 0, 0, 0); { Don't connect points } PlotCurve(B1, B2, 1, SavedSim, 1); Readln; LeaveGraphics; end; var XX, YY : PVector; { Data } B : PVector; { Regression parameters } V : PMatrix; { Variance-covariance matrix } B1, B2 : PVector; { Simulated parameters } F : Text; { Output file } Iter : Integer; { Iteration number } I : Integer; { Loop variable } begin DimVector(XX, N); DimVector(YY, N); DimVector(B, LastPar); DimMatrix(V, LastPar, LastPar); DimVector(B1, SavedSim); DimVector(B2, SavedSim); { Read data } for I := 1 to N do begin XX^[I] := X[I]; YY^[I] := Y[I]; end; { Initialize parameters } SetParamBounds(1, 100, 1000); SetParamBounds(2, 0.1, 1); { Set Metropolis-Hastings parameters } InitMHParams(NCycles, MaxSim, SavedSim); { Set output file and numeric format } SetMCFile(MCFile); SetFormat(10, 4, False, True); { Perform simulation } SimFit({$IFDEF FPC}@{$ENDIF}RegFunc, XX, YY, 1, N, B, FirstPar, LastPar, V); { Retrieve simulation results into vectors B1 and B2 } Assign(F, MCFile); Reset(F); for I := 1 to SavedSim do ReadLn(F, Iter, B1^[I], B2^[I]); Close(F); { Write results } WriteResults(B, V); { Plot curve } PlotGraph(B1, B2); DelVector(XX, N); DelVector(YY, N); DelVector(B, LastPar); DelMatrix(V, LastPar, LastPar); DelVector(B1, SavedSim); DelVector(B2, SavedSim); end. mricron-0.20120505.1~dfsg.1.orig/fpmath/changes.txt0000664000175000017500000000204411326434464021307 0ustar michaelmichaelVersion 0.50 ------------ * Added a compilation script for Linux (fpcompil.sh) * A graphic library (tpgraph) has been added, with two versions: one for Delphi, one for the Graph unit. The Linux version requires SVGAlib installed and functional. * With FPC, the libraries are now compiled in Delphi mode (option -Mdelphi) to ensure that the Integer type is 32 bits. The calling programs should be compiled with the same option (modify the FPC configuration file if necessary). * The number of points which can be handled by the FFT procedures has been increased (up to 2^26 in double precision) * More statistical methods in the main library : - Comparison of means and variances - Analysis of variance - Non-parametric tests (Wilcoxon, Mann-Whitney, Kruskal-Wallis) - Histograms - Comparison of distributions (Khi-2 and Woolf tests) - Linear, multilinear and nonlinear regressions - Monte-Carlo simulation of the distribution of regression parameters - Principal component analysis * Added some string functions mricron-0.20120505.1~dfsg.1.orig/fpc-res.res0000664000175000017500000017017011326472774017745 0ustar michaelmichael џџџџ<LџџLAZ_PIC_DIALOG_TEMPLATE0T,‘PШ‘_STATICЈ џџџџ (0`ёё№ššС~~ВyyДDDž++˜EEЇЇЇгЃЃФххьППлОNNЊ “Ž’š Ї <<СВВЮддшЂЂЯ``Г™‘›ЅЏЕЛСЧба/0кГГУ››МvvЋMM•66Œ‚MM•……Н››Ъ­­еššЯssРGGЎЁ˜ ЌЕМТЧЭвиохы№іžšџ•—ИXYš=>Ž-.ˆ"#‡‡‰ ‹‘–“ЁЅЎЙТЩЮгйпцьёіљћќќ ћUeџОТл8:”y~…”œЄЊЏЖМСШЯжкпхьёіљћќћћ&њ@ј[јnї~љМHˆЭamаnwз‚‚и#ЅŽ ІЋА ЖМСШЮдкрць№ѕјћќќћ)њUљ‰јБљдљѓњџњџєџџџ­ѓсдЦРЙРRRЯŠŠуЮЮ{}и#ZО|ВЃМВСКЧКЬВвЂи†о]х*ы№ѕљћќќќќћ'јvљМљуљџњџќџќџќ§љћѕњџљЪљњіяхжЩЛЏИ;;ФjjЪџбoџbёwнцфзштючєьќђџіџљўћєћШњ~љ3њћћћњ<їЉїђљџњџќџќњќјћњљћїќџ§џўВўџ§ўў§їцзЭЛФ;;шЧЧ;ћ?ћ ћѓЬіќњѓћќ§ќќ§ћќќќќќџћџћџћљњВљSњ љіќљџћџќћћњњќљ§ї§њџџўџџеўeўў§§ќў§ўўёсзХйmm%ў%§§џ+ўнўџ§ѕўљ§њќњ§ќўќ§ћћћњќ§ќџћўњmВљџњљњћј§іўїўњ§џџџў§ўЯџmўџўџўўў§§§ўўњѓээ)§))ў)$§'§ §.§Яўџ§ўўљ§ї§ј§ј§љўљўљћјљјњїЊџњќЗњїћўџўџўџџіўзўœџJџўџўџўџўџўўў§ќўџџ џ++LџL8§72ў2+ў0!§ў §Šќп§џўџўџўџўџўџўџўџўџ§џЬњџўџџњAђўа§ЋўxўEџџўџџџџўџўџўџўџў§ ўўўў11ўШШdўd>ў>AўA;§;1ў5'ў!§§ќO§ќœќАќЛќОќИќЎћ"њ‰эіoўџLћІ-ўўўџџџџџџџџџџџџџўџўџџџ!!џ''џ**џ''џ__/ў/GўGLўL@§?:§=§ўўў§§§ќўќ§6§џћќў§хў"ўўџџџџџџџџџџџџџџўџўў**ў,,ў55ў55ў88ˆџˆGџG[џ[MўMLўL(ў(§§§§ў§ўўўўL§ў§ћњ§§ўcўўџџџџџџџџџџџџџџџџџ((џ66џ88џBBџ;;џ@@MџMRўRbџbXџXAџAџўџўўў§ў§§Z§џўњјўџџЅџџџџџџџџџџџџџџџџџџџ==џAAџFFџMMџIIџIIџMџMlўleўeYўYўџўџџџўџќў`ќџ§ћњ§ўўкўўџџџџџџџџџџџџџџџџ--џKKџLLџUUџMMџQQDџDRџRxџxmџm%џ%ўџўўўўў§§\§ў§њ§§ћџќў?џџџџџџџџџџџџџџџџџNNџUUџXXџaaџRRџ……bџbhџhƒџƒSџSџџџџџўџ§ўM§ўўћўўљџџџuџџџџџџџџџџџџџџџџBBџ``џ]]џjjџ[[џƒƒfџfVџV|џ|…џ…EџEџџџџўў§§6§ў§ћ§§њўўўŸўџџџџџџџџџџџџџ џEEџffџddџrrџjjџ__kџkQџQˆџˆ‰џ‰TџT џ џџ§џ§§!ќьќў§ћћџџўРџџџџџџџџџџџџџ++џZZџllџkkџxxџmmџ\\]џ]^џ^“џ“‘џ‘pџp.џ.џўў§§§Ч§ў§њќўџўкўўџџџџџџџџџ77џXXџooџppџttџ||џssџssuџuQџQ•џ•“џ“‡џ‡bџb#ў#ўџ§§›ќџўјћўџўхў џџџџџџ!!џ99џRRџffџqqџrrџttџџ‚‚џ€€џ‡‡`џ`\џ\џ˜џ˜џˆџˆb§b/ў/ §ўXћќ§њќ§џ§уџўџ('џ::џKKџ[[џffџmmџppџqqџvvџџˆˆџzzџnnџxxˆџˆhџh‰џ‰ џ ”џ”ŒўŒ…џ…lўj7§8ќ гћў§ћ§ўи,ўGEўQRџ\[џaaџddџhhџjjџnnџyyџ„„џ††џ€€џnnџ‘‘rџrRџRhџh’џ’ џ ‘ў‘‰ў‰Šќ…Z§lšќ+џљќџ1ўК]ўLTў][џ``џeeџkkџttџ€€џ‰‰џ€€џttџuuџџЉЉЄџЄuџulўl§˜џ˜•§”“ў’‡ћнџ&џъ ќv\џhmўsrџxxџ}}џџ{{џmmџ__џxxџ™™џЖЖžџžyўyuўuoўpo§lpћxЂъ…іu,§§<:џMMџVVџWWџ__џjjџ’’џЉЉ|ў|!§ §Hћ@ўГТўqp§ ў++џ::џooџААџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРџџџўџџџ№џўџјџррР€€€€€€РРрр№јјќў?џџ€џџРџџрџџјџџўџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ џџџџ ( @……НaaЄ……НЯЯу……НRRЄ55Ÿ›Ё^^РССкххэВВиxxП44ЇžЈГРЩЯ$!иpsЃLP•26ˆ‰45ЂCC­<<ВЌЇЏНЪжпчюѕљ ў€ŽџpkГ!Žˆ˜Ѓ­ГМЦгпшяєјћ&ћJћjї†ћšъН6`ТIZН]qЯˆˆмЛЛ<ЕSЇzКТuЫYе5о чяѕљќќќQћ–њбљёљџіџ§џџџeњщзСИР]]zџgђtыђіу§юџєџјљћкќ–ћAћћљ€їрјџљџїџјџўќџњхљ]њ§ўќюеПЮbbќ §ћБћџќњћјњјўљџљџљќјЙіМ/ѕџїџќћџњџќџ§уў‰ўў§§§ўџљът1§2'§$§§§џ§џўџ§џ§џњџќџ.џџ§оџќ џќќ§сџЇў]џўџџўўўў§ўџџ§^^>ў>;ў=3§2§§@§Œ§Г§ЦќЭќШќМRѕЋ§џŽќcc§8§ ўўўџўўџџўџўўў$$ў$$ўssQўQIўIKўL:ў<ў§§§§§§pњўўњЛ§ўџўџџџџўўџўџџ00џ55ў88WџWZўZWўWўўўўўў§…ќўўњѕў"ўџўџџџџџџўџў11ўAAўGGўEEtўtSџSqџq3џ3џџџџ§§‹ќџњћџџaўџџџџџџџџџџџNNџTTџSSџppiўinўnfўfўўўўў§€§ўљњўўšўўўџџџџџџџџHHџbbџaaџrrbџbџZџZџџџ§§e§ўћћўўС§џџџџџџџџџNNџllџllџ__eџeџqџq!џ!ўў§Dќ§ќўџўмў ўўџџџџџAAџhhџxxџ~~џ||tџt]џ]“џ“џYўY ў ўќцћўў§хўўџџ**џ@@џZZџooџ||џ}}џttџffnџn‘џ‘§ŒџŒb§_§(šњџўњсў@:ўLNў^]џjjџuuџ{{џ{{џxxџ‚‚џ››AџA~ў~ўšў—‹§“‰ћcљџ§ПL§_lўpmўqqџssџrrџssџ‰‰џŸŸ‡ў‡}ў}p§li§xЙщjўiiўiiўYXўiiџ{{џџФФ§}ў}џўiiџџџџџџџџџџџџџџџџџџџџџџџџџџџуџџџџџ№џ№РР€€€€€РРр№јјў?џџџРџџѓџџџџџџџџџџџџџџџџџџџџџШ џџџџ (0ЕПФЯбпръьѓєћд>ЧLЅPЙФћъПёњѕЭќќНќбќтќџ§§§„§џўџџїџџљrњўўџџяџџЙљжћј§ўўџЊќ7Ѕ јўџ;ќ-œЈўџ ЖЈћ!$#œ%-п-ћ!0ьF2ў23ќ(53Ї8џ8:ў3;§?< џ<хџ?1BќIћJJЂNMЕPќPPўRQ§ZTўSYўYYџYZў\\ZЪ^ў`_џ_`іbўbfўfgџgoџНvџvwwГzўy|zК|џ|~ћћ€vАПƒњ…§…††ШџŽўŽŽџќ•ў‘šњ›ў›œuЪŸљ ˆг­ўHЗЗгКїХ Х__Э$абім оњхџюює ѕџїlљ*љVTљЎњ‘њoњдћ‡ћећцќќћќ14ќЙ§§§&§6§§>8§LM§TT§Yg§§Љ2ўўўўўўўўўў ўў77ў::ўLLўPPўQQўUUў]\ўccўpmўttўїўџџџƒџєџњџџџџџџџџџџџ""џ&&џ44џ;џџAAџ[[џaaџccџeeџmmџssџttџyyџ{{џ}}џџƒƒџ††џŠŠџьџўџџџџџwaO@FchkP=0AgL?689<) 3>JsuX2  1Mix„‰‚~{zC+' #"[}ИЙЙЗЖ “|y;5!(!KФМŒ•ž““žЛ—ƒЌIE7*_’…–ЂžЕЁžžžЄЈСšTRH-,oГ†“К ŸЕЕЕЕРЉЊЎVY4%&tжŠ”ІЕЕЕžЃžЊЋ­]`G./qеˆžНЕЛЛЕЕТЧШаUdD$fД‹ЅžžЕЕОУЪЪЦ^l\:NеŽЇŸПСХЩЮЬЭZjnWB€д˜™АЫЯбгrmpev›БВЮвЬbQS‡‘Џœџџџџџџџџџџџџџџџџ№?џ€?Р€€€€€РРр№јќ?џџџџџџџџџџџџџџh џџџџ ( ЪжуЫ ОКђћіќќџ§§ФџџйЋџшџњ§ џксk ;Љ ў ўkKŸ!И&ф џ'џ,->џ/џ!0ђ9ў+;2œM§]PPНWjОY§ZbY f§fhџkiу=jџjlўklџoўooџptџ}nЏ‹џŒўˆŽЮŽљŽљЩџ‘ŒХЄЧЄЇдЌџЎxœГўФџХZnЯ[[клH[уЋBёљњњjњ$њћќќ>5§§§§{§}{ўўўџўўўўBBўKMўNNўPPўddўjjў‚‚ўРўы џџџžџѕџџџ џџ#Ѓџ))џ::џT]џ[[џuuџ‚‚џ‡‡џтџџџ&!0793#$/18A>;) =Scba`C@? 5hFGDENegj% :OITRd`VWY*( <^JM`QUZ[+' 6pHLfilm-2",_KX\no4.BkP]џџџџџџџŸр€€€РрјџџџџџџЈ% џџџџ (0` џ“џ№џџџџџџџџџџџџџџџяџFџџPџСџџџџџџџџџџџџџџџџџџџџџњџ<џџбџџџџџџџџџџџџџџџџџџџџџџџџџџ==џтџ)џшџџџџџџџџџџџџџџџџџџџџџџџџџџџџ##џџhhџџooџџџџџџЊЊџџпџџы џџџ џџџџџџџeџЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLLџџrrџџppџџџџџџџ))DџJHnџ[W‡џmgcџшзџџъ џ џnџЁџеџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhhџџwўџ“oєџџUџoџŒџЦџфџ§џџџ>:џџXTџџXTџџKGьџtnXџџПџ џМџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџtжџхЮџќьџџџџџџџџџџџџџџvџџџvџџџaўџџџџџџџџџџџџџџ џџ)'џџTPџџtnџџrlџџhcџџOMxџџц џџџџ}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,їџГЮџовџїчџјШ§џџZџџџџџџџџџџџџџџџџџџџџџ8џџџwџџџnџџџ9Бџџџџџџџџџџџџџџџџџџ=:џџrlџџtoџџrlџџC@№џœ•&џџџџдџџџџџџџџџџџџџџџџџџџџџџџџ5єџобџ§ђџџџџџџџѕџџлОџџџџџџџџџџџЉџџџџџџџџџџџџџџџџџџ^џџџsџџџVяџџ$џџџџџџџџџџџџџџџџ џџ%#џџlgџџtnџџtoџџUQџџ@= џџц џџќџџџџџџџџџџџџџџ џџзџђтџџџџџџџџџџџџџџџџџџџіџџ§ъџџџџџџџџџџџџџџџџџџџeџџџџџџџџџ*џџџfџџџtџџџ*rџџџџџџџџџџџџџџџџџџџџџџџџOKџџlgџџtnџџjdџџGDџџC>_џшџџџџџџџџџџџџљџќёџџџџџџџџџџџџџџџџџџџџџџџџџЊСџџџџџџџџџџџџџџџџџџџџџџџыџџџ%џџџ/џџџiџџџsџџџcќџџџџџџџџџџџџџџџџџџџџџџџџџџ:8џџc^џџrmџџniџџPLџџ0-šџвџџџџ џџ џџ џџwоџћьџџџџџџџџџџџџџџџџџџџџџџџџџџџџтШџџџџџџџџџџџџџџџџџџџџџџџџџџџМџџџnџџџsџџџ_їџџ(aџџџџџџџџџџџџџџџџџџџџџџџџџџ*(џџZVџџqkџџpjџџSOџџ1-Ѓџџџџtџџ21џџ55џџ=хџ5ўџџ'џџџўџџ џџџ џџџ џџџџџџџџџ#џџџ8џџџGџџџWџџџџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзџџџ7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRNџџojџџoiџџQMџџ53Œџџџ@@џ%00џў~}џџwЬцџvўџџiџџџXўџџHџџџEџџџLџџџTџџџgџџџjџџџlџџџoџџџqџџџtџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћџџявьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ" џџUQџџpjџџlgџџLHџџ73|џџџџџџJJџгžЪђџЊўўџВўџџЈўџџ˜ўџџˆўџџuџџџtџџџtџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџџџџџџџџџяаьџіыOџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,*џџ[WџџqlџџgbџџB?џџSKDџлџџџџћћџ3АўџџУўџџЬўџџРўџџЎўџџšўџџ~џџџyџџџxџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџњџџфЫеџљщEџџџ џџџџџџџџџџєJџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџSOџџnhџџtnџџXTџџ:7Дџџу џџџџџџџљџ.ЉўјџХўџџаўџџФўџџВўџџўџџ€џџџzџџџxџџџuџџџsџџџrџџџoџџџmџџџkџџџѕејџчЫХџјю>џџџџџџџџџџџџџџџџџџџмБџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџd`џџrmџџtnџџMIџџA?rџџЬџџџџџџџџџ+‡§ŽџЕўгџЪўєџСўџџЎўџџ—ўџџvџџџoџќџjџѓџ[џрџRџбџHџЙџ4џ|џ*џZџ џ4џјџ џџџџџџџџџџџџџџџџџџџџџџџџџоцџџџџџџџџџџџџџџџџџџџџџџџџџџџџ84џџojџџtoџџrlџџ<9ѕџz$џџџџџџџџџџџџ uўu冧†џž§žџž§žџ„ў„џcўcџ'џ'џўџ џ џџџџџџџџџџџџџЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ<џџџџџџџџџџџџџџџџџџџџџџ20џџTPџџjeџџtoџџqlџџ`[џџБЈџџџџџџџџџ џѕџВ§Вuuўuў’§’џ § џŽўŽџs§sџ7ў7џ!џ!џўџџџџџџџџџџџџџsџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыwџџџџџџџџџџџџџџџџџџџџџџVQџџkfџџsmџџsnџџjeџџMJџџппџџџџџџџџџџ№џџћџ@}ў}Х€ў€џŸўŸџ™§™џ†ў†џPџPџ8ў8џ$ў$џ џ џџџџџџџџџџџ=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџфŠџџџџџџџџџџџџџџџџџџџџ85џџlgџџsnџџuoџџojџџ[Vџџ=:лџџџџџџџџџџїџџњџ5ЮќЮd‰ў‰џš§šџŸ§Ÿџ‰ў‰џsўsџ[ў[џ/ў/џўџџџџџџџџџџџбџџџџџџџџџџџџџџџџџџџџџџџџџџзІџџџџџџџџџџџџџџџџB>џџ]YџџniџџuoџџtoџџqkџџEB§џOJgџџу џџџџџџџџџџјџ"џџџ9wўwїŒ§Œџœ§œџ§џŽўŽџ{§{џLўLџ7ў7џ%џ%џџџџџџџџџœџџџџџџџџџџџџџџџџџџџџџџџџџџпЃџџџџџџџџџџ џџџџ20џџc^џџojџџtnџџtoџџqlџџd`џџJFxџџш џџџџџџџџџ џђџџјџ%Љ§Љ†vўvќŽ§ŽџЄ§Єџ ў џ•§•џmўmџWўWџAџAџџџџџ џ џџџhџџџџџџџџџџџџџџџџџџџџџџџџџџѕeџџџџџџџџџџ%$џџA>џџZVџџrlџџtoџџuoџџqlџџfaџџJGџџџъ џџџџџџџџџџџџ џљџ(џћџ?І§І‹ŒўŒџўџІўІџЁ§Ёџ”ў”џƒўƒџYўYџDџDџ3ў3џџџџџыџџџџџџџџџў џџџ'џџў)џџў(џэѕџџџџџџџџ2/џџHEџџkfџџrlџџtoџџtoџџsnџџniџџGDџџ=:Ѓџџэџџџџџџџџџџџџџџџ'џџџ=w§wѓ‰ў‰џ›§›џЊ§ЊџІ§Іџœўœџ{ў{џgўgџSўSџ7ў7џ0џ0џЁў.џџў4џџў:џџџ>џџўIџџўHџџўFџчТ4џџ-,џџ-+џџLHџџ\WџџidџџsnџџtoџџtoџџqkџџjdџџXTџџLJkџџџ џџџџџџџџџџџџ џѓџџџџ%Ч§Чkwўwъ„ў„џЄ§ЄџЉўЉџЉ§Љџ—§—џ‡ў‡џvўvџ[ў[џTўTџoўSџџў_џџўgџџўmџџ§uџџ§rџџ§mџџg[џџZWџџ\Xџџkfџџpkџџsnџџtoџџsnџџqlџџ_ZџџKHџџ<:аџџџџџџџџџџџџџџџ џџџџџџ0џћџFx§xѕ…ў…џ”ў”џЄ§ЄџЄўЄџЂ§Ђџšўšџ—ў—џ™§™џў§Ўџџ§Еџџ§Зџџ§­џќ§ЃџєЮ˜џџ…€џџ|wџџxrџџsnџџpjџџjeџџWSџџIEџџ=:цџЫПџџџџџџџџџџџџџџџџџџџџџџљџ*аќаbўШxўxћўџ™§™џўџ ў џ § џ ў џкќЌџџ§Гџџ§Гџ№ђЄџќЌ˜џџ‘Œџџ}wџџvqџџqlџџb]џџWSџџJFџџFC”џb_Fџ№сџџЊџџџџџџџлџџџџ џџџџњџ1џћџAсќс]€ў€р|ў|џ†§†џ§џ‘ў‘џ§џ’ќџМќ”ў№і“ўџŠ…џџ~zџџsnџџ^[џџXTџџQMџџGCЭџNK…џ€w8џџџ џџџџџџџџџџџџџџџџџџ џ№џџєџџљџ*џџџ3џћџ<џћџGџќџIџћџHџћџ=џџџ6џџџ-џџї џџѕџџёџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџјџ&џјџ'џјџ&џџџџѕџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџ џџџ џџџџџџџџџџыџ џџџ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџџџџРџџџ€џџќ>џ№<џ€€€€€€€Рр?р?№ќџќџџџџ€џџџрџџџ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ џџџџ ( @ џ“џџџџџџџџџџџяџџбџџџџџџџџџџџџџџџџ==џтџ)џшџџџџџџџџџџџџџџџџџџ##џџooџџџџџџЊЊџџы џџџ џџџџ џnџеџџџџџџџџџџџџџџџџџџџџџџџџhhџџ“oєџџUџŒџЦџ§џџџXTџџXTџџtnXџџПџМџџџџџџџџџџџџџџџџџџџџџџџџџџtжџхЮџџџџџџџџџџџvџџџaўџџџџџџџџџџ џџTPџџtnџџhcџџOMxџџџџџџџџџџџџџџџџџџџ5єџобџџџџџџџлОџџџџџџџЉџџџџџџџџџџџџ^џџџsџџџ$џџџџџџџџџџџџ%#џџlgџџtoџџUQџџџц џџџџџџџџџџџ џџђтџџџџџџџџџџџџџіџџџџџџџџџџџџџџџeџџџџџџ*џџџtџџџ*rџџџџџџџџџџџџџџџџOKџџtnџџjdџџC>_џџџџ џџ џџћьџџџџџџџџџџџџџџџџџџџтШџџџџџџџџџџџџџџџџџџџnџџџsџџџ(aџџџџџџџџџџџџџџџџџџ*(џџqkџџpjџџ1-Ѓџџџџџ21џџ=хџ5ўџџўџџ џџџ џџџџџџ#џџџ8џџџWџџџџќџџџџџџџџџџџџџџџџџџџзџџџ7џџџџџџџџџџџџџџџџџџџџџџojџџoiџџ53ŒџџџJJџгžЪђџВўџџЈўџџˆўџџuџџџtџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџяаьџџџ џџџџџџџџџџџџџџџџџџџџџџ,*џџqlџџgbџџSKDџлџћћџ3АўџџЬўџџРўџџšўџџ~џџџxџџџwџџџwџџџwџџџwџџџџџџџџњџџфЫеџџџ џџџџџџџєJџџџџџџџџџџџџџџџџџџ џџSOџџtnџџXTџџџу џџџџџџ+‡§ŽџЪўєџСўџџ—ўџџvџџџjџѓџ[џрџHџЙџ4џ|џ џ4џјџ џџџџџџџџџџџџџџџџоцџџџџџџџџџџџџџџџџџџ84џџojџџrlџџ<9ѕџџџџџџџџџ uўuеž§žџž§žџcўcџ'џ'џ џ џџџџџџџџџЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ20џџjeџџtoџџ`[џџБЈџџџџ№џџћџ@€ў€џŸўŸџ†ў†џPџPџ$ў$џ џ џџџџџџџ=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ85џџlgџџuoџџojџџ=:лџџџџџџџїџЮќЮd‰ў‰џŸ§Ÿџ‰ў‰џ[ў[џ/ў/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB>џџniџџuoџџqkџџEB§џџу џџџџџџ џјџ%Љ§Љ†Ž§ŽџЄ§Єџ•§•џmўmџAџAџџџ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџ%$џџZVџџrlџџuoџџqlџџJGџџџъ џџџџџџ џљџ(І§І‹ŒўŒџІўІџЁ§ЁџƒўƒџYўYџ3ў3џџџыџџџџџџў џџџ'џџў(џэѕџџџџџџHEџџkfџџtoџџtoџџniџџGDџџџэџџџџџџ џџџ%Ч§Чk„ў„џЄ§ЄџЉ§Љџ—§—џvўvџ[ў[џoўSџџў_џџўmџџ§uџџ§mџџg[џџ\Xџџkfџџsnџџtoџџqlџџ_Zџџ<:аџџџџџџџџџ џџџџћџFx§xѕ”ў”џЄ§ЄџЂ§Ђџšўšџ™§™џў§Ўџџ§Зџџ§­џєЮ˜џџ…€џџxrџџsnџџjeџџWSџџ=:цџЫПџџџџџџџлџџџџџњџ1сќс]€ў€р†§†џ§џ§џ’ќџ№і“ўџŠ…џџsnџџ^[џџQMџџGCЭџ€w8џџџ џџџџџџџџџџџџ џєџџљџ*џћџ<џћџGџћџHџћџ=џџџ-џџї џџёџџџџџџџџџџџџџџџџџџџџџ џџџџџџџыџ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќџџрџџ€Уј€€€€€Рр№?јџќџџ?џџрџџџџџџџџџџџџџџh џџџџ (  џбџџџџџџџџџnџџџџџџџџџџџџhhџџџUџЦџџџXTџџџПџџџџџџџџобџџџџџџџџџџџџџџџsџџџџџџџџџlgџџUQџџџ џџџџџџџџџџџтШџџџџџџџџџџџsџџџџџџџџџџџ*(џџpjџџџџžЪђџЈўџџuџџџwџџџwџџџџџџџџџџџяаьџџџџџџџџџџџџ,*џџgbџџџџ‡§ŽџСўџџvџџџ[џрџ4џ|џјџ џџџџџџџоцџџџџџџџџџџojџџ<9ѕџџџџћџ@ŸўŸџPџPџ џ џџџ=џџџџџџџџџџџџџџџџџџlgџџojџџџџџџџ Љ§Љ†Є§Єџmўmџџџџџџџџџџџџџџџџџ%$џџrlџџqlџџџъ џџџ Ч§ЧkЄ§Єџ—§—џ[ў[џџў_џџ§uџџg[џџkfџџtoџџ_Zџџџџџлџџњџ1€ў€р§џ’ќџџŠ…џџ^[џџGCЭџџџ џџџџџџџџџџыџ џџџџџџџџџќр€€€Рр№џџџџ џџџџ ((цЎњьюљїњќћ”ћБќ§žўўўќў§ўџџџќџ§ўџўџџўџ(џ(,џ,9џ9AџAIљќJ§WџWZџZhџhlџlnџnxџ{yџy‚џ‚‡џ‡‹џ‹ŒџŒŽџŽЉЦЩњSејж§прѕљўњќћў§џўўљўќўўпў§ўўџџџ2џњџћџќџ§џџџџ џџџ!!џ&&џ,,џ//џDDџEEџIIџLMџQQџWWџZZџ^^џbbџddџiiџjjџooџrrџssџ}}џ††џžžџААџИИџќџ§џџџBDA21,+ .49CE@>7>0, 8EB@>>>>7:H -;>?>>>>>>JM"5bF>>>>>>KON#3c>>>>>>>SV`& /=>>>>>>XZU )>IV\^_(*'6QTW[]Y!%$LRPaџџ№џџ№џџ№џџ№џС№Р№€€€€РРр№0ј№ў№џџ№џџ№џџ№џџ№v0џџMAINICON 00Ј Ј Шh00 Ј%  Ј hЈ џџџџ  (0`ёё№ššС~~ВyyДDDž++˜EEЇЇЇгЃЃФххьППлОNNЊ “Ž’š Ї <<СВВЮддшЂЂЯ``Г™‘›ЅЏЕЛСЧба/0кГГУ››МvvЋMM•66Œ‚MM•……Н››Ъ­­еššЯssРGGЎЁ˜ ЌЕМТЧЭвиохы№іžšџ•—ИXYš=>Ž-.ˆ"#‡‡‰ ‹‘–“ЁЅЎЙТЩЮгйпцьёіљћќќ ћUeџОТл8:”y~…”œЄЊЏЖМСШЯжкпхьёіљћќћћ&њ@ј[јnї~љМHˆЭamаnwз‚‚и#ЅŽ ІЋА ЖМСШЮдкрць№ѕјћќќћ)њUљ‰јБљдљѓњџњџєџџџ­ѓсдЦРЙРRRЯŠŠуЮЮ{}и#ZО|ВЃМВСКЧКЬВвЂи†о]х*ы№ѕљћќќќќћ'јvљМљуљџњџќџќџќ§љћѕњџљЪљњіяхжЩЛЏИ;;ФjjЪџбoџbёwнцфзштючєьќђџіџљўћєћШњ~љ3њћћћњ<їЉїђљџњџќџќњќјћњљћїќџ§џўВўџ§ўў§їцзЭЛФ;;шЧЧ;ћ?ћ ћѓЬіќњѓћќ§ќќ§ћќќќќќџћџћџћљњВљSњ љіќљџћџќћћњњќљ§ї§њџџўџџеўeўў§§ќў§ўўёсзХйmm%ў%§§џ+ўнўџ§ѕўљ§њќњ§ќўќ§ћћћњќ§ќџћўњmВљџњљњћј§іўїўњ§џџџў§ўЯџmўџўџўўў§§§ўўњѓээ)§))ў)$§'§ §.§Яўџ§ўўљ§ї§ј§ј§љўљўљћјљјњїЊџњќЗњїћўџўџўџџіўзўœџJџўџўџўџўџўўў§ќўџџ џ++LџL8§72ў2+ў0!§ў §Šќп§џўџўџўџўџўџўџўџўџ§џЬњџўџџњAђўа§ЋўxўEџџўџџџџўџўџўџўџў§ ўўўў11ўШШdўd>ў>AўA;§;1ў5'ў!§§ќO§ќœќАќЛќОќИќЎћ"њ‰эіoўџLћІ-ўўўџџџџџџџџџџџџџўџўџџџ!!џ''џ**џ''џ__/ў/GўGLўL@§?:§=§ўўў§§§ќўќ§6§џћќў§хў"ўўџџџџџџџџџџџџџџўџўў**ў,,ў55ў55ў88ˆџˆGџG[џ[MўMLўL(ў(§§§§ў§ўўўўL§ў§ћњ§§ўcўўџџџџџџџџџџџџџџџџџ((џ66џ88џBBџ;;џ@@MџMRўRbџbXџXAџAџўџўўў§ў§§Z§џўњјўџџЅџџџџџџџџџџџџџџџџџџџ==џAAџFFџMMџIIџIIџMџMlўleўeYўYўџўџџџўџќў`ќџ§ћњ§ўўкўўџџџџџџџџџџџџџџџџ--џKKџLLџUUџMMџQQDџDRџRxџxmџm%џ%ўџўўўўў§§\§ў§њ§§ћџќў?џџџџџџџџџџџџџџџџџNNџUUџXXџaaџRRџ……bџbhџhƒџƒSџSџџџџџўџ§ўM§ўўћўўљџџџuџџџџџџџџџџџџџџџџBBџ``џ]]џjjџ[[џƒƒfџfVџV|џ|…џ…EџEџџџџўў§§6§ў§ћ§§њўўўŸўџџџџџџџџџџџџџ џEEџffџddџrrџjjџ__kџkQџQˆџˆ‰џ‰TџT џ џџ§џ§§!ќьќў§ћћџџўРџџџџџџџџџџџџџ++џZZџllџkkџxxџmmџ\\]џ]^џ^“џ“‘џ‘pџp.џ.џўў§§§Ч§ў§њќўџўкўўџџџџџџџџџ77џXXџooџppџttџ||џssџssuџuQџQ•џ•“џ“‡џ‡bџb#ў#ўџ§§›ќџўјћўџўхў џџџџџџ!!џ99џRRџffџqqџrrџttџџ‚‚џ€€џ‡‡`џ`\џ\џ˜џ˜џˆџˆb§b/ў/ §ўXћќ§њќ§џ§уџўџ('џ::џKKџ[[џffџmmџppџqqџvvџџˆˆџzzџnnџxxˆџˆhџh‰џ‰ џ ”џ”ŒўŒ…џ…lўj7§8ќ гћў§ћ§ўи,ўGEўQRџ\[џaaџddџhhџjjџnnџyyџ„„џ††џ€€џnnџ‘‘rџrRџRhџh’џ’ џ ‘ў‘‰ў‰Šќ…Z§lšќ+џљќџ1ўК]ўLTў][џ``џeeџkkџttџ€€џ‰‰џ€€џttџuuџџЉЉЄџЄuџulўl§˜џ˜•§”“ў’‡ћнџ&џъ ќv\џhmўsrџxxџ}}џџ{{џmmџ__џxxџ™™џЖЖžџžyўyuўuoўpo§lpћxЂъ…іu,§§<:џMMџVVџWWџ__џjjџ’’џЉЉ|ў|!§ §Hћ@ўГТўqp§ ў++џ::џooџААџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРџџџўџџџ№џўџјџррР€€€€€€РРрр№јјќў?џџ€џџРџџрџџјџџўџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ џџџџ  ( @……НaaЄ……НЯЯу……НRRЄ55Ÿ›Ё^^РССкххэВВиxxП44ЇžЈГРЩЯ$!иpsЃLP•26ˆ‰45ЂCC­<<ВЌЇЏНЪжпчюѕљ ў€ŽџpkГ!Žˆ˜Ѓ­ГМЦгпшяєјћ&ћJћjї†ћšъН6`ТIZН]qЯˆˆмЛЛ<ЕSЇzКТuЫYе5о чяѕљќќќQћ–њбљёљџіџ§џџџeњщзСИР]]zџgђtыђіу§юџєџјљћкќ–ћAћћљ€їрјџљџїџјџўќџњхљ]њ§ўќюеПЮbbќ §ћБћџќњћјњјўљџљџљќјЙіМ/ѕџїџќћџњџќџ§уў‰ўў§§§ўџљът1§2'§$§§§џ§џўџ§џ§џњџќџ.џџ§оџќ џќќ§сџЇў]џўџџўўўў§ўџџ§^^>ў>;ў=3§2§§@§Œ§Г§ЦќЭќШќМRѕЋ§џŽќcc§8§ ўўўџўўџџўџўўў$$ў$$ўssQўQIўIKўL:ў<ў§§§§§§pњўўњЛ§ўџўџџџџўўџўџџ00џ55ў88WџWZўZWўWўўўўўў§…ќўўњѕў"ўџўџџџџџџўџў11ўAAўGGўEEtўtSџSqџq3џ3џџџџ§§‹ќџњћџџaўџџџџџџџџџџџNNџTTџSSџppiўinўnfўfўўўўў§€§ўљњўўšўўўџџџџџџџџHHџbbџaaџrrbџbџZџZџџџ§§e§ўћћўўС§џџџџџџџџџNNџllџllџ__eџeџqџq!џ!ўў§Dќ§ќўџўмў ўўџџџџџAAџhhџxxџ~~џ||tџt]џ]“џ“џYўY ў ўќцћўў§хўўџџ**џ@@џZZџooџ||џ}}џttџffnџn‘џ‘§ŒџŒb§_§(šњџўњсў@:ўLNў^]џjjџuuџ{{џ{{џxxџ‚‚џ››AџA~ў~ўšў—‹§“‰ћcљџ§ПL§_lўpmўqqџssџrrџssџ‰‰џŸŸ‡ў‡}ў}p§li§xЙщjўiiўiiўYXўiiџ{{џџФФ§}ў}џўiiџџџџџџџџџџџџџџџџџџџџџџџџџџџуџџџџџ№џ№РР€€€€€РРр№јјў?џџџРџџѓџџџџџџџџџџџџџџџџџџџџџШ џџџџ  (0ЕПФЯбпръьѓєћд>ЧLЅPЙФћъПёњѕЭќќНќбќтќџ§§§„§џўџџїџџљrњўўџџяџџЙљжћј§ўўџЊќ7Ѕ јўџ;ќ-œЈўџ ЖЈћ!$#œ%-п-ћ!0ьF2ў23ќ(53Ї8џ8:ў3;§?< џ<хџ?1BќIћJJЂNMЕPќPPўRQ§ZTўSYўYYџYZў\\ZЪ^ў`_џ_`іbўbfўfgџgoџНvџvwwГzўy|zК|џ|~ћћ€vАПƒњ…§…††ШџŽўŽŽџќ•ў‘šњ›ў›œuЪŸљ ˆг­ўHЗЗгКїХ Х__Э$абім оњхџюює ѕџїlљ*љVTљЎњ‘њoњдћ‡ћећцќќћќ14ќЙ§§§&§6§§>8§LM§TT§Yg§§Љ2ўўўўўўўўўў ўў77ў::ўLLўPPўQQўUUў]\ўccўpmўttўїўџџџƒџєџњџџџџџџџџџџџ""џ&&џ44џ;џџAAџ[[џaaџccџeeџmmџssџttџyyџ{{џ}}џџƒƒџ††џŠŠџьџўџџџџџwaO@FchkP=0AgL?689<) 3>JsuX2  1Mix„‰‚~{zC+' #"[}ИЙЙЗЖ “|y;5!(!KФМŒ•ž““žЛ—ƒЌIE7*_’…–ЂžЕЁžžžЄЈСšTRH-,oГ†“К ŸЕЕЕЕРЉЊЎVY4%&tжŠ”ІЕЕЕžЃžЊЋ­]`G./qеˆžНЕЛЛЕЕТЧШаUdD$fД‹ЅžžЕЕОУЪЪЦ^l\:NеŽЇŸПСХЩЮЬЭZjnWB€д˜™АЫЯбгrmpev›БВЮвЬbQS‡‘Џœџџџџџџџџџџџџџџџџ№?џ€?Р€€€€€РРр№јќ?џџџџџџџџџџџџџџh џџџџ  ( ЪжуЫ ОКђћіќќџ§§ФџџйЋџшџњ§ џксk ;Љ ў ўkKŸ!И&ф џ'џ,->џ/џ!0ђ9ў+;2œM§]PPНWjОY§ZbY f§fhџkiу=jџjlўklџoўooџptџ}nЏ‹џŒўˆŽЮŽљŽљЩџ‘ŒХЄЧЄЇдЌџЎxœГўФџХZnЯ[[клH[уЋBёљњњjњ$њћќќ>5§§§§{§}{ўўўџўўўўBBўKMўNNўPPўddўjjў‚‚ўРўы џџџžџѕџџџ џџ#Ѓџ))џ::џT]џ[[џuuџ‚‚џ‡‡џтџџџ&!0793#$/18A>;) =Scba`C@? 5hFGDENegj% :OITRd`VWY*( <^JM`QUZ[+' 6pHLfilm-2",_KX\no4.BkP]џџџџџџџŸр€€€РрјџџџџџџЈ% џџџџ  (0` џ“џ№џџџџџџџџџџџџџџџяџFџџPџСџџџџџџџџџџџџџџџџџџџџџњџ<џџбџџџџџџџџџџџџџџџџџџџџџџџџџџ==џтџ)џшџџџџџџџџџџџџџџџџџџџџџџџџџџџџ##џџhhџџooџџџџџџЊЊџџпџџы џџџ џџџџџџџeџЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLLџџrrџџppџџџџџџџ))DџJHnџ[W‡џmgcџшзџџъ џ џnџЁџеџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhhџџwўџ“oєџџUџoџŒџЦџфџ§џџџ>:џџXTџџXTџџKGьџtnXџџПџ џМџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџtжџхЮџќьџџџџџџџџџџџџџџvџџџvџџџaўџџџџџџџџџџџџџџ џџ)'џџTPџџtnџџrlџџhcџџOMxџџц џџџџ}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,їџГЮџовџїчџјШ§џџZџџџџџџџџџџџџџџџџџџџџџ8џџџwџџџnџџџ9Бџџџџџџџџџџџџџџџџџџ=:џџrlџџtoџџrlџџC@№џœ•&џџџџдџџџџџџџџџџџџџџџџџџџџџџџџ5єџобџ§ђџџџџџџџѕџџлОџџџџџџџџџџџЉџџџџџџџџџџџџџџџџџџ^џџџsџџџVяџџ$џџџџџџџџџџџџџџџџ џџ%#џџlgџџtnџџtoџџUQџџ@= џџц џџќџџџџџџџџџџџџџџ џџзџђтџџџџџџџџџџџџџџџџџџџіџџ§ъџџџџџџџџџџџџџџџџџџџeџџџџџџџџџ*џџџfџџџtџџџ*rџџџџџџџџџџџџџџџџџџџџџџџџOKџџlgџџtnџџjdџџGDџџC>_џшџџџџџџџџџџџџљџќёџџџџџџџџџџџџџџџџџџџџџџџџџЊСџџџџџџџџџџџџџџџџџџџџџџџыџџџ%џџџ/џџџiџџџsџџџcќџџџџџџџџџџџџџџџџџџџџџџџџџџ:8џџc^џџrmџџniџџPLџџ0-šџвџџџџ џџ џџ џџwоџћьџџџџџџџџџџџџџџџџџџџџџџџџџџџџтШџџџџџџџџџџџџџџџџџџџџџџџџџџџМџџџnџџџsџџџ_їџџ(aџџџџџџџџџџџџџџџџџџџџџџџџџџ*(џџZVџџqkџџpjџџSOџџ1-Ѓџџџџtџџ21џџ55џџ=хџ5ўџџ'џџџўџџ џџџ џџџ џџџџџџџџџ#џџџ8џџџGџџџWџџџџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзџџџ7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRNџџojџџoiџџQMџџ53Œџџџ@@џ%00џў~}џџwЬцџvўџџiџџџXўџџHџџџEџџџLџџџTџџџgџџџjџџџlџџџoџџџqџџџtџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћџџявьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ" џџUQџџpjџџlgџџLHџџ73|џџџџџџJJџгžЪђџЊўўџВўџџЈўџџ˜ўџџˆўџџuџџџtџџџtџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџџџџџџџџџяаьџіыOџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,*џџ[WџџqlџџgbџџB?џџSKDџлџџџџћћџ3АўџџУўџџЬўџџРўџџЎўџџšўџџ~џџџyџџџxџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџњџџфЫеџљщEџџџ џџџџџџџџџџєJџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџSOџџnhџџtnџџXTџџ:7Дџџу џџџџџџџљџ.ЉўјџХўџџаўџџФўџџВўџџўџџ€џџџzџџџxџџџuџџџsџџџrџџџoџџџmџџџkџџџѕејџчЫХџјю>џџџџџџџџџџџџџџџџџџџмБџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџd`џџrmџџtnџџMIџџA?rџџЬџџџџџџџџџ+‡§ŽџЕўгџЪўєџСўџџЎўџџ—ўџџvџџџoџќџjџѓџ[џрџRџбџHџЙџ4џ|џ*џZџ џ4џјџ џџџџџџџџџџџџџџџџџџџџџџџџџоцџџџџџџџџџџџџџџџџџџџџџџџџџџџџ84џџojџџtoџџrlџџ<9ѕџz$џџџџџџџџџџџџ uўu冧†џž§žџž§žџ„ў„џcўcџ'џ'џўџ џ џџџџџџџџџџџџџЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ<џџџџџџџџџџџџџџџџџџџџџџ20џџTPџџjeџџtoџџqlџџ`[џџБЈџџџџџџџџџ џѕџВ§Вuuўuў’§’џ § џŽўŽџs§sџ7ў7џ!џ!џўџџџџџџџџџџџџџsџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыwџџџџџџџџџџџџџџџџџџџџџџVQџџkfџџsmџџsnџџjeџџMJџџппџџџџџџџџџџ№џџћџ@}ў}Х€ў€џŸўŸџ™§™џ†ў†џPџPџ8ў8џ$ў$џ џ џџџџџџџџџџџ=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџфŠџџџџџџџџџџџџџџџџџџџџ85џџlgџџsnџџuoџџojџџ[Vџџ=:лџџџџџџџџџџїџџњџ5ЮќЮd‰ў‰џš§šџŸ§Ÿџ‰ў‰џsўsџ[ў[џ/ў/џўџџџџџџџџџџџбџџџџџџџџџџџџџџџџџџџџџџџџџџзІџџџџџџџџџџџџџџџџB>џџ]YџџniџџuoџџtoџџqkџџEB§џOJgџџу џџџџџџџџџџјџ"џџџ9wўwїŒ§Œџœ§œџ§џŽўŽџ{§{џLўLџ7ў7џ%џ%џџџџџџџџџœџџџџџџџџџџџџџџџџџџџџџџџџџџпЃџџџџџџџџџџ џџџџ20џџc^џџojџџtnџџtoџџqlџџd`џџJFxџџш џџџџџџџџџ џђџџјџ%Љ§Љ†vўvќŽ§ŽџЄ§Єџ ў џ•§•џmўmџWўWџAџAџџџџџ џ џџџhџџџџџџџџџџџџџџџџџџџџџџџџџџѕeџџџџџџџџџџ%$џџA>џџZVџџrlџџtoџџuoџџqlџџfaџџJGџџџъ џџџџџџџџџџџџ џљџ(џћџ?І§І‹ŒўŒџўџІўІџЁ§Ёџ”ў”џƒўƒџYўYџDџDџ3ў3џџџџџыџџџџџџџџџў џџџ'џџў)џџў(џэѕџџџџџџџџ2/џџHEџџkfџџrlџџtoџџtoџџsnџџniџџGDџџ=:Ѓџџэџџџџџџџџџџџџџџџ'џџџ=w§wѓ‰ў‰џ›§›џЊ§ЊџІ§Іџœўœџ{ў{џgўgџSўSџ7ў7џ0џ0џЁў.џџў4џџў:џџџ>џџўIџџўHџџўFџчТ4џџ-,џџ-+џџLHџџ\WџџidџџsnџџtoџџtoџџqkџџjdџџXTџџLJkџџџ џџџџџџџџџџџџ џѓџџџџ%Ч§Чkwўwъ„ў„џЄ§ЄџЉўЉџЉ§Љџ—§—џ‡ў‡џvўvџ[ў[џTўTџoўSџџў_џџўgџџўmџџ§uџџ§rџџ§mџџg[џџZWџџ\Xџџkfџџpkџџsnџџtoџџsnџџqlџџ_ZџџKHџџ<:аџџџџџџџџџџџџџџџ џџџџџџ0џћџFx§xѕ…ў…џ”ў”џЄ§ЄџЄўЄџЂ§Ђџšўšџ—ў—џ™§™џў§Ўџџ§Еџџ§Зџџ§­џќ§ЃџєЮ˜џџ…€џџ|wџџxrџџsnџџpjџџjeџџWSџџIEџџ=:цџЫПџџџџџџџџџџџџџџџџџџџџџџљџ*аќаbўШxўxћўџ™§™џўџ ў џ § џ ў џкќЌџџ§Гџџ§Гџ№ђЄџќЌ˜џџ‘Œџџ}wџџvqџџqlџџb]џџWSџџJFџџFC”џb_Fџ№сџџЊџџџџџџџлџџџџ џџџџњџ1џћџAсќс]€ў€р|ў|џ†§†џ§џ‘ў‘џ§џ’ќџМќ”ў№і“ўџŠ…џџ~zџџsnџџ^[џџXTџџQMџџGCЭџNK…џ€w8џџџ џџџџџџџџџџџџџџџџџџ џ№џџєџџљџ*џџџ3џћџ<џћџGџќџIџћџHџћџ=џџџ6џџџ-џџї џџѕџџёџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџјџ&џјџ'џјџ&џџџџѕџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџ џџџ џџџџџџџџџџыџ џџџ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџџџџРџџџ€џџќ>џ№<џ€€€€€€€Рр?р?№ќџќџџџџ€џџџрџџџ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ џџџџ ( @ џ“џџџџџџџџџџџяџџбџџџџџџџџџџџџџџџџ==џтџ)џшџџџџџџџџџџџџџџџџџџ##џџooџџџџџџЊЊџџы џџџ џџџџ џnџеџџџџџџџџџџџџџџџџџџџџџџџџhhџџ“oєџџUџŒџЦџ§џџџXTџџXTџџtnXџџПџМџџџџџџџџџџџџџџџџџџџџџџџџџџtжџхЮџџџџџџџџџџџvџџџaўџџџџџџџџџџ џџTPџџtnџџhcџџOMxџџџџџџџџџџџџџџџџџџџ5єџобџџџџџџџлОџџџџџџџЉџџџџџџџџџџџџ^џџџsџџџ$џџџџџџџџџџџџ%#џџlgџџtoџџUQџџџц џџџџџџџџџџџ џџђтџџџџџџџџџџџџџіџџџџџџџџџџџџџџџeџџџџџџ*џџџtџџџ*rџџџџџџџџџџџџџџџџOKџџtnџџjdџџC>_џџџџ џџ џџћьџџџџџџџџџџџџџџџџџџџтШџџџџџџџџџџџџџџџџџџџnџџџsџџџ(aџџџџџџџџџџџџџџџџџџ*(џџqkџџpjџџ1-Ѓџџџџџ21џџ=хџ5ўџџўџџ џџџ џџџџџџ#џџџ8џџџWџџџџќџџџџџџџџџџџџџџџџџџџзџџџ7џџџџџџџџџџџџџџџџџџџџџџojџџoiџџ53ŒџџџJJџгžЪђџВўџџЈўџџˆўџџuџџџtџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџяаьџџџ џџџџџџџџџџџџџџџџџџџџџџ,*џџqlџџgbџџSKDџлџћћџ3АўџџЬўџџРўџџšўџџ~џџџxџџџwџџџwџџџwџџџwџџџџџџџџњџџфЫеџџџ џџџџџџџєJџџџџџџџџџџџџџџџџџџ џџSOџџtnџџXTџџџу џџџџџџ+‡§ŽџЪўєџСўџџ—ўџџvџџџjџѓџ[џрџHџЙџ4џ|џ џ4џјџ џџџџџџџџџџџџџџџџоцџџџџџџџџџџџџџџџџџџ84џџojџџrlџџ<9ѕџџџџџџџџџ uўuеž§žџž§žџcўcџ'џ'џ џ џџџџџџџџџЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ20џџjeџџtoџџ`[џџБЈџџџџ№џџћџ@€ў€џŸўŸџ†ў†џPџPџ$ў$џ џ џџџџџџџ=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ85џџlgџџuoџџojџџ=:лџџџџџџџїџЮќЮd‰ў‰џŸ§Ÿџ‰ў‰џ[ў[џ/ў/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB>џџniџџuoџџqkџџEB§џџу џџџџџџ џјџ%Љ§Љ†Ž§ŽџЄ§Єџ•§•џmўmџAџAџџџ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџ%$џџZVџџrlџџuoџџqlџџJGџџџъ џџџџџџ џљџ(І§І‹ŒўŒџІўІџЁ§ЁџƒўƒџYўYџ3ў3џџџыџџџџџџў џџџ'џџў(џэѕџџџџџџHEџџkfџџtoџџtoџџniџџGDџџџэџџџџџџ џџџ%Ч§Чk„ў„џЄ§ЄџЉ§Љџ—§—џvўvџ[ў[џoўSџџў_џџўmџџ§uџџ§mџџg[џџ\Xџџkfџџsnџџtoџџqlџџ_Zџџ<:аџџџџџџџџџ џџџџћџFx§xѕ”ў”џЄ§ЄџЂ§Ђџšўšџ™§™џў§Ўџџ§Зџџ§­џєЮ˜џџ…€џџxrџџsnџџjeџџWSџџ=:цџЫПџџџџџџџлџџџџџњџ1сќс]€ў€р†§†џ§џ§џ’ќџ№і“ўџŠ…џџsnџџ^[џџQMџџGCЭџ€w8џџџ џџџџџџџџџџџџ џєџџљџ*џћџ<џћџGџћџHџћџ=џџџ-џџї џџёџџџџџџџџџџџџџџџџџџџџџ џџџџџџџыџ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќџџрџџ€Уј€€€€€Рр№?јџќџџ?џџрџџџџџџџџџџџџџџh џџџџ (  џбџџџџџџџџџnџџџџџџџџџџџџhhџџџUџЦџџџXTџџџПџџџџџџџџобџџџџџџџџџџџџџџџsџџџџџџџџџlgџџUQџџџ џџџџџџџџџџџтШџџџџџџџџџџџsџџџџџџџџџџџ*(џџpjџџџџžЪђџЈўџџuџџџwџџџwџџџџџџџџџџџяаьџџџџџџџџџџџџ,*џџgbџџџџ‡§ŽџСўџџvџџџ[џрџ4џ|џјџ џџџџџџџоцџџџџџџџџџџojџџ<9ѕџџџџћџ@ŸўŸџPџPџ џ џџџ=џџџџџџџџџџџџџџџџџџlgџџojџџџџџџџ Љ§Љ†Є§Єџmўmџџџџџџџџџџџџџџџџџ%$џџrlџџqlџџџъ џџџ Ч§ЧkЄ§Єџ—§—џ[ў[џџў_џџ§uџџg[џџkfџџtoџџ_Zџџџџџлџџњџ1€ў€р§џ’ќџџŠ…џџ^[џџGCЭџџџ џџџџџџџџџџыџ џџџџџџџџџќр€€€Рр№џџџџ џџџџ ((цЎњьюљїњќћ”ћБќ§žўўўќў§ўџџџќџ§ўџўџџўџ(џ(,џ,9џ9AџAIљќJ§WџWZџZhџhlџlnџnxџ{yџy‚џ‚‡џ‡‹џ‹ŒџŒŽџŽЉЦЩњSејж§прѕљўњќћў§џўўљўќўўпў§ўўџџџ2џњџћџќџ§џџџџ џџџ!!џ&&џ,,џ//џDDџEEџIIџLMџQQџWWџZZџ^^џbbџddџiiџjjџooџrrџssџ}}џ††џžžџААџИИџќџ§џџџBDA21,+ .49CE@>7>0, 8EB@>>>>7:H -;>?>>>>>>JM"5bF>>>>>>KON#3c>>>>>>>SV`& /=>>>>>>XZU )>IV\^_(*'6QTW[]Y!%$LRPaџџ№џџ№џџ№џџ№џС№Р№€€€€РРр№0ј№ў№џџ№џџ№џџ№џџ№v0џџMAINICON 00Ј Ј Ш h 00 Ј%  Ј hmricron-0.20120505.1~dfsg.1.orig/fpc-res.or0000664000175000017500000017106611326472774017601 0ustar michaelmichaelL ђ.rsrc0ё<lё@РњuZK(€8€h€њuZKИ€а€ш€€€0€H€`€ x€ € Ј€ Р€ и€№€€ €њuZK мњuZK ьњuZK ќњuZK  њuZK њuZK ,њuZK <њuZK LњuZK \њuZK lњuZK |њuZK ŒњuZK œњuZK ЌњuZK МњuZK ЬњuZK˜€P€њuZKмњuZKШ€€€њuZK ьLAZ_PIC_DIALOG_TEMPLATEMAINICONќЈЄ Ј L-Ш4h|9Ј%$_ЈЬoh4tŽ-.ˆ"#‡‡‰ ‹‘–“ЁЅЎЙТЩЮгйпцьёіљћќќ ћUeџОТл8:”y~…”œЄЊЏЖМСШЯжкпхьёіљћќћћ&њ@ј[јnї~љМHˆЭamаnwз‚‚и#ЅŽ ІЋА ЖМСШЮдкрць№ѕјћќќћ)њUљ‰јБљдљѓњџњџєџџџ­ѓсдЦРЙРRRЯŠŠуЮЮ{}и#ZО|ВЃМВСКЧКЬВвЂи†о]х*ы№ѕљћќќќќћ'јvљМљуљџњџќџќџќ§љћѕњџљЪљњіяхжЩЛЏИ;;ФjjЪџбoџbёwнцфзштючєьќђџіџљўћєћШњ~љ3њћћћњ<їЉїђљџњџќџќњќјћњљћїќџ§џўВўџ§ўў§їцзЭЛФ;;шЧЧ;ћ?ћ ћѓЬіќњѓћќ§ќќ§ћќќќќќџћџћџћљњВљSњ љіќљџћџќћћњњќљ§ї§њџџўџџеўeўў§§ќў§ўўёсзХйmm%ў%§§џ+ўнўџ§ѕўљ§њќњ§ќўќ§ћћћњќ§ќџћўњmВљџњљњћј§іўїўњ§џџџў§ўЯџmўџўџўўў§§§ўўњѓээ)§))ў)$§'§ §.§Яўџ§ўўљ§ї§ј§ј§љўљўљћјљјњїЊџњќЗњїћўџўџўџџіўзўœџJџўџўџўџўџўўў§ќўџџ џ++LџL8§72ў2+ў0!§ў §Šќп§џўџўџўџўџўџўџўџўџ§џЬњџўџџњAђўа§ЋўxўEџџўџџџџўџўџўџўџў§ ўўўў11ўШШdўd>ў>AўA;§;1ў5'ў!§§ќO§ќœќАќЛќОќИќЎћ"њ‰эіoўџLћІ-ўўўџџџџџџџџџџџџџўџўџџџ!!џ''џ**џ''џ__/ў/GўGLўL@§?:§=§ўўў§§§ќўќ§6§џћќў§хў"ўўџџџџџџџџџџџџџџўџўў**ў,,ў55ў55ў88ˆџˆGџG[џ[MўMLўL(ў(§§§§ў§ўўўўL§ў§ћњ§§ўcўўџџџџџџџџџџџџџџџџџ((џ66џ88џBBџ;;џ@@MџMRўRbџbXџXAџAџўџўўў§ў§§Z§џўњјўџџЅџџџџџџџџџџџџџџџџџџџ==џAAџFFџMMџIIџIIџMџMlўleўeYўYўџўџџџўџќў`ќџ§ћњ§ўўкўўџџџџџџџџџџџџџџџџ--џKKџLLџUUџMMџQQDџDRџRxџxmџm%џ%ўџўўўўў§§\§ў§њ§§ћџќў?џџџџџџџџџџџџџџџџџNNџUUџXXџaaџRRџ……bџbhџhƒџƒSџSџџџџџўџ§ўM§ўўћўўљџџџuџџџџџџџџџџџџџџџџBBџ``џ]]џjjџ[[џƒƒfџfVџV|џ|…џ…EџEџџџџўў§§6§ў§ћ§§њўўўŸўџџџџџџџџџџџџџ џEEџffџddџrrџjjџ__kџkQџQˆџˆ‰џ‰TџT џ џџ§џ§§!ќьќў§ћћџџўРџџџџџџџџџџџџџ++џZZџllџkkџxxџmmџ\\]џ]^џ^“џ“‘џ‘pџp.џ.џўў§§§Ч§ў§њќўџўкўўџџџџџџџџџ77џXXџooџppџttџ||џssџssuџuQџQ•џ•“џ“‡џ‡bџb#ў#ўџ§§›ќџўјћўџўхў џџџџџџ!!џ99џRRџffџqqџrrџttџџ‚‚џ€€џ‡‡`џ`\џ\џ˜џ˜џˆџˆb§b/ў/ §ўXћќ§њќ§џ§уџўџ('џ::џKKџ[[џffџmmџppџqqџvvџџˆˆџzzџnnџxxˆџˆhџh‰џ‰ џ ”џ”ŒўŒ…џ…lўj7§8ќ гћў§ћ§ўи,ўGEўQRџ\[џaaџddџhhџjjџnnџyyџ„„џ††џ€€џnnџ‘‘rџrRџRhџh’џ’ џ ‘ў‘‰ў‰Šќ…Z§lšќ+џљќџ1ўК]ўLTў][џ``џeeџkkџttџ€€џ‰‰џ€€џttџuuџџЉЉЄџЄuџulўl§˜џ˜•§”“ў’‡ћнџ&џъ ќv\џhmўsrџxxџ}}џџ{{џmmџ__џxxџ™™џЖЖžџžyўyuўuoўpo§lpћxЂъ…іu,§§<:џMMџVVџWWџ__џjjџ’’џЉЉ|ў|!§ §Hћ@ўГТўqp§ ў++џ::џooџААџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРџџџўџџџ№џўџјџррР€€€€€€РРрр№јјќў?џџ€џџРџџрџџјџџўџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ( @……НaaЄ……НЯЯу……НRRЄ55Ÿ›Ё^^РССкххэВВиxxП44ЇžЈГРЩЯ$!иpsЃLP•26ˆ‰45ЂCC­<<ВЌЇЏНЪжпчюѕљ ў€ŽџpkГ!Žˆ˜Ѓ­ГМЦгпшяєјћ&ћJћjї†ћšъН6`ТIZН]qЯˆˆмЛЛ<ЕSЇzКТuЫYе5о чяѕљќќќQћ–њбљёљџіџ§џџџeњщзСИР]]zџgђtыђіу§юџєџјљћкќ–ћAћћљ€їрјџљџїџјџўќџњхљ]њ§ўќюеПЮbbќ §ћБћџќњћјњјўљџљџљќјЙіМ/ѕџїџќћџњџќџ§уў‰ўў§§§ўџљът1§2'§$§§§џ§џўџ§џ§џњџќџ.џџ§оџќ џќќ§сџЇў]џўџџўўўў§ўџџ§^^>ў>;ў=3§2§§@§Œ§Г§ЦќЭќШќМRѕЋ§џŽќcc§8§ ўўўџўўџџўџўўў$$ў$$ўssQўQIўIKўL:ў<ў§§§§§§pњўўњЛ§ўџўџџџџўўџўџџ00џ55ў88WџWZўZWўWўўўўўў§…ќўўњѕў"ўџўџџџџџџўџў11ўAAўGGўEEtўtSџSqџq3џ3џџџџ§§‹ќџњћџџaўџџџџџџџџџџџNNџTTџSSџppiўinўnfўfўўўўў§€§ўљњўўšўўўџџџџџџџџHHџbbџaaџrrbџbџZџZџџџ§§e§ўћћўўС§џџџџџџџџџNNџllџllџ__eџeџqџq!џ!ўў§Dќ§ќўџўмў ўўџџџџџAAџhhџxxџ~~џ||tџt]џ]“џ“џYўY ў ўќцћўў§хўўџџ**џ@@џZZџooџ||џ}}џttџffnџn‘џ‘§ŒџŒb§_§(šњџўњсў@:ўLNў^]џjjџuuџ{{џ{{џxxџ‚‚џ››AџA~ў~ўšў—‹§“‰ћcљџ§ПL§_lўpmўqqџssџrrџssџ‰‰џŸŸ‡ў‡}ў}p§li§xЙщjўiiўiiўYXўiiџ{{џџФФ§}ў}џўiiџџџџџџџџџџџџџџџџџџџџџџџџџџџуџџџџџ№џ№РР€€€€€РРр№јјў?џџџРџџѓџџџџџџџџџџџџџџџџџџџџџ(0ЕПФЯбпръьѓєћд>ЧLЅPЙФћъПёњѕЭќќНќбќтќџ§§§„§џўџџїџџљrњўўџџяџџЙљжћј§ўўџЊќ7Ѕ јўџ;ќ-œЈўџ ЖЈћ!$#œ%-п-ћ!0ьF2ў23ќ(53Ї8џ8:ў3;§?< џ<хџ?1BќIћJJЂNMЕPќPPўRQ§ZTўSYўYYџYZў\\ZЪ^ў`_џ_`іbўbfўfgџgoџНvџvwwГzўy|zК|џ|~ћћ€vАПƒњ…§…††ШџŽўŽŽџќ•ў‘šњ›ў›œuЪŸљ ˆг­ўHЗЗгКїХ Х__Э$абім оњхџюює ѕџїlљ*љVTљЎњ‘њoњдћ‡ћећцќќћќ14ќЙ§§§&§6§§>8§LM§TT§Yg§§Љ2ўўўўўўўўўў ўў77ў::ўLLўPPўQQўUUў]\ўccўpmўttўїўџџџƒџєџњџџџџџџџџџџџ""џ&&џ44џ;џџAAџ[[џaaџccџeeџmmџssџttџyyџ{{џ}}џџƒƒџ††џŠŠџьџўџџџџџwaO@FchkP=0AgL?689<) 3>JsuX2  1Mix„‰‚~{zC+' #"[}ИЙЙЗЖ “|y;5!(!KФМŒ•ž““žЛ—ƒЌIE7*_’…–ЂžЕЁžžžЄЈСšTRH-,oГ†“К ŸЕЕЕЕРЉЊЎVY4%&tжŠ”ІЕЕЕžЃžЊЋ­]`G./qеˆžНЕЛЛЕЕТЧШаUdD$fД‹ЅžžЕЕОУЪЪЦ^l\:NеŽЇŸПСХЩЮЬЭZjnWB€д˜™АЫЯбгrmpev›БВЮвЬbQS‡‘Џœџџџџџџџџџџџџџџџџ№?џ€?Р€€€€€РРр№јќ?џџџџџџџџџџџџџџ( ЪжуЫ ОКђћіќќџ§§ФџџйЋџшџњ§ џксk ;Љ ў ўkKŸ!И&ф џ'џ,->џ/џ!0ђ9ў+;2œM§]PPНWjОY§ZbY f§fhџkiу=jџjlўklџoўooџptџ}nЏ‹џŒўˆŽЮŽљŽљЩџ‘ŒХЄЧЄЇдЌџЎxœГўФџХZnЯ[[клH[уЋBёљњњjњ$њћќќ>5§§§§{§}{ўўўџўўўўBBўKMўNNўPPўddўjjў‚‚ўРўы џџџžџѕџџџ џџ#Ѓџ))џ::џT]џ[[џuuџ‚‚џ‡‡џтџџџ&!0793#$/18A>;) =Scba`C@? 5hFGDENegj% :OITRd`VWY*( <^JM`QUZ[+' 6pHLfilm-2",_KX\no4.BkP]џџџџџџџŸр€€€Ррјџџџџџџ(0` џ“џ№џџџџџџџџџџџџџџџяџFџџPџСџџџџџџџџџџџџџџџџџџџџџњџ<џџбџџџџџџџџџџџџџџџџџџџџџџџџџџ==џтџ)џшџџџџџџџџџџџџџџџџџџџџџџџџџџџџ##џџhhџџooџџџџџџЊЊџџпџџы џџџ џџџџџџџeџЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLLџџrrџџppџџџџџџџ))DџJHnџ[W‡џmgcџшзџџъ џ џnџЁџеџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhhџџwўџ“oєџџUџoџŒџЦџфџ§џџџ>:џџXTџџXTџџKGьџtnXџџПџ џМџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџtжџхЮџќьџџџџџџџџџџџџџџvџџџvџџџaўџџџџџџџџџџџџџџ џџ)'џџTPџџtnџџrlџџhcџџOMxџџц џџџџ}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,їџГЮџовџїчџјШ§џџZџџџџџџџџџџџџџџџџџџџџџ8џџџwџџџnџџџ9Бџџџџџџџџџџџџџџџџџџ=:џџrlџџtoџџrlџџC@№џœ•&џџџџдџџџџџџџџџџџџџџџџџџџџџџџџ5єџобџ§ђџџџџџџџѕџџлОџџџџџџџџџџџЉџџџџџџџџџџџџџџџџџџ^џџџsџџџVяџџ$џџџџџџџџџџџџџџџџ џџ%#џџlgџџtnџџtoџџUQџџ@= џџц џџќџџџџџџџџџџџџџџ џџзџђтџџџџџџџџџџџџџџџџџџџіџџ§ъџџџџџџџџџџџџџџџџџџџeџџџџџџџџџ*џџџfџџџtџџџ*rџџџџџџџџџџџџџџџџџџџџџџџџOKџџlgџџtnџџjdџџGDџџC>_џшџџџџџџџџџџџџљџќёџџџџџџџџџџџџџџџџџџџџџџџџџЊСџџџџџџџџџџџџџџџџџџџџџџџыџџџ%џџџ/џџџiџџџsџџџcќџџџџџџџџџџџџџџџџџџџџџџџџџџ:8џџc^џџrmџџniџџPLџџ0-šџвџџџџ џџ џџ џџwоџћьџџџџџџџџџџџџџџџџџџџџџџџџџџџџтШџџџџџџџџџџџџџџџџџџџџџџџџџџџМџџџnџџџsџџџ_їџџ(aџџџџџџџџџџџџџџџџџџџџџџџџџџ*(џџZVџџqkџџpjџџSOџџ1-Ѓџџџџtџџ21џџ55џџ=хџ5ўџџ'џџџўџџ џџџ џџџ џџџџџџџџџ#џџџ8џџџGџџџWџџџџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзџџџ7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRNџџojџџoiџџQMџџ53Œџџџ@@џ%00џў~}џџwЬцџvўџџiџџџXўџџHџџџEџџџLџџџTџџџgџџџjџџџlџџџoџџџqџџџtџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћџџявьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ" џџUQџџpjџџlgџџLHџџ73|џџџџџџJJџгžЪђџЊўўџВўџџЈўџџ˜ўџџˆўџџuџџџtџџџtџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџџџџџџџџџяаьџіыOџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,*џџ[WџџqlџџgbџџB?џџSKDџлџџџџћћџ3АўџџУўџџЬўџџРўџџЎўџџšўџџ~џџџyџџџxџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџњџџфЫеџљщEџџџ џџџџџџџџџџєJџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџSOџџnhџџtnџџXTџџ:7Дџџу џџџџџџџљџ.ЉўјџХўџџаўџџФўџџВўџџўџџ€џџџzџџџxџџџuџџџsџџџrџџџoџџџmџџџkџџџѕејџчЫХџјю>џџџџџџџџџџџџџџџџџџџмБџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџd`џџrmџџtnџџMIџџA?rџџЬџџџџџџџџџ+‡§ŽџЕўгџЪўєџСўџџЎўџџ—ўџџvџџџoџќџjџѓџ[џрџRџбџHџЙџ4џ|џ*џZџ џ4џјџ џџџџџџџџџџџџџџџџџџџџџџџџџоцџџџџџџџџџџџџџџџџџџџџџџџџџџџџ84џџojџџtoџџrlџџ<9ѕџz$џџџџџџџџџџџџ uўu冧†џž§žџž§žџ„ў„џcўcџ'џ'џўџ џ џџџџџџџџџџџџџЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ<џџџџџџџџџџџџџџџџџџџџџџ20џџTPџџjeџџtoџџqlџџ`[џџБЈџџџџџџџџџ џѕџВ§Вuuўuў’§’џ § џŽўŽџs§sџ7ў7џ!џ!џўџџџџџџџџџџџџџsџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыwџџџџџџџџџџџџџџџџџџџџџџVQџџkfџџsmџџsnџџjeџџMJџџппџџџџџџџџџџ№џџћџ@}ў}Х€ў€џŸўŸџ™§™џ†ў†џPџPџ8ў8џ$ў$џ џ џџџџџџџџџџџ=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџфŠџџџџџџџџџџџџџџџџџџџџ85џџlgџџsnџџuoџџojџџ[Vџџ=:лџџџџџџџџџџїџџњџ5ЮќЮd‰ў‰џš§šџŸ§Ÿџ‰ў‰џsўsџ[ў[џ/ў/џўџџџџџџџџџџџбџџџџџџџџџџџџџџџџџџџџџџџџџџзІџџџџџџџџџџџџџџџџB>џџ]YџџniџџuoџџtoџџqkџџEB§џOJgџџу џџџџџџџџџџјџ"џџџ9wўwїŒ§Œџœ§œџ§џŽўŽџ{§{џLўLџ7ў7џ%џ%џџџџџџџџџœџџџџџџџџџџџџџџџџџџџџџџџџџџпЃџџџџџџџџџџ џџџџ20џџc^џџojџџtnџџtoџџqlџџd`џџJFxџџш џџџџџџџџџ џђџџјџ%Љ§Љ†vўvќŽ§ŽџЄ§Єџ ў џ•§•џmўmџWўWџAџAџџџџџ џ џџџhџџџџџџџџџџџџџџџџџџџџџџџџџџѕeџџџџџџџџџџ%$џџA>џџZVџџrlџџtoџџuoџџqlџџfaџџJGџџџъ џџџџџџџџџџџџ џљџ(џћџ?І§І‹ŒўŒџўџІўІџЁ§Ёџ”ў”џƒўƒџYўYџDџDџ3ў3џџџџџыџџџџџџџџџў џџџ'џџў)џџў(џэѕџџџџџџџџ2/џџHEџџkfџџrlџџtoџџtoџџsnџџniџџGDџџ=:Ѓџџэџџџџџџџџџџџџџџџ'џџџ=w§wѓ‰ў‰џ›§›џЊ§ЊџІ§Іџœўœџ{ў{џgўgџSўSџ7ў7џ0џ0џЁў.џџў4џџў:џџџ>џџўIџџўHџџўFџчТ4џџ-,џџ-+џџLHџџ\WџџidџџsnџџtoџџtoџџqkџџjdџџXTџџLJkџџџ џџџџџџџџџџџџ џѓџџџџ%Ч§Чkwўwъ„ў„џЄ§ЄџЉўЉџЉ§Љџ—§—џ‡ў‡џvўvџ[ў[џTўTџoўSџџў_џџўgџџўmџџ§uџџ§rџџ§mџџg[џџZWџџ\Xџџkfџџpkџџsnџџtoџџsnџџqlџџ_ZџџKHџџ<:аџџџџџџџџџџџџџџџ џџџџџџ0џћџFx§xѕ…ў…џ”ў”џЄ§ЄџЄўЄџЂ§Ђџšўšџ—ў—џ™§™џў§Ўџџ§Еџџ§Зџџ§­џќ§ЃџєЮ˜џџ…€џџ|wџџxrџџsnџџpjџџjeџџWSџџIEџџ=:цџЫПџџџџџџџџџџџџџџџџџџџџџџљџ*аќаbўШxўxћўџ™§™џўџ ў џ § џ ў џкќЌџџ§Гџџ§Гџ№ђЄџќЌ˜џџ‘Œџџ}wџџvqџџqlџџb]џџWSџџJFџџFC”џb_Fџ№сџџЊџџџџџџџлџџџџ џџџџњџ1џћџAсќс]€ў€р|ў|џ†§†џ§џ‘ў‘џ§џ’ќџМќ”ў№і“ўџŠ…џџ~zџџsnџџ^[џџXTџџQMџџGCЭџNK…џ€w8џџџ џџџџџџџџџџџџџџџџџџ џ№џџєџџљџ*џџџ3џћџ<џћџGџќџIџћџHџћџ=џџџ6џџџ-џџї џџѕџџёџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџјџ&џјџ'џјџ&џџџџѕџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџ џџџ џџџџџџџџџџыџ џџџ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџџџџРџџџ€џџќ>џ№<џ€€€€€€€Рр?р?№ќџќџџџџ€џџџрџџџ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ( @ џ“џџџџџџџџџџџяџџбџџџџџџџџџџџџџџџџ==џтџ)џшџџџџџџџџџџџџџџџџџџ##џџooџџџџџџЊЊџџы џџџ џџџџ џnџеџџџџџџџџџџџџџџџџџџџџџџџџhhџџ“oєџџUџŒџЦџ§џџџXTџџXTџџtnXџџПџМџџџџџџџџџџџџџџџџџџџџџџџџџџtжџхЮџџџџџџџџџџџvџџџaўџџџџџџџџџџ џџTPџџtnџџhcџџOMxџџџџџџџџџџџџџџџџџџџ5єџобџџџџџџџлОџџџџџџџЉџџџџџџџџџџџџ^џџџsџџџ$џџџџџџџџџџџџ%#џџlgџџtoџџUQџџџц џџџџџџџџџџџ џџђтџџџџџџџџџџџџџіџџџџџџџџџџџџџџџeџџџџџџ*џџџtџџџ*rџџџџџџџџџџџџџџџџOKџџtnџџjdџџC>_џџџџ џџ џџћьџџџџџџџџџџџџџџџџџџџтШџџџџџџџџџџџџџџџџџџџnџџџsџџџ(aџџџџџџџџџџџџџџџџџџ*(џџqkџџpjџџ1-Ѓџџџџџ21џџ=хџ5ўџџўџџ џџџ џџџџџџ#џџџ8џџџWџџџџќџџџџџџџџџџџџџџџџџџџзџџџ7џџџџџџџџџџџџџџџџџџџџџџojџџoiџџ53ŒџџџJJџгžЪђџВўџџЈўџџˆўџџuџџџtџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџяаьџџџ џџџџџџџџџџџџџџџџџџџџџџ,*џџqlџџgbџџSKDџлџћћџ3АўџџЬўџџРўџџšўџџ~џџџxџџџwџџџwџџџwџџџwџџџџџџџџњџџфЫеџџџ џџџџџџџєJџџџџџџџџџџџџџџџџџџ џџSOџџtnџџXTџџџу џџџџџџ+‡§ŽџЪўєџСўџџ—ўџџvџџџjџѓџ[џрџHџЙџ4џ|џ џ4џјџ џџџџџџџџџџџџџџџџоцџџџџџџџџџџџџџџџџџџ84џџojџџrlџџ<9ѕџџџџџџџџџ uўuеž§žџž§žџcўcџ'џ'џ џ џџџџџџџџџЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ20џџjeџџtoџџ`[џџБЈџџџџ№џџћџ@€ў€џŸўŸџ†ў†џPџPџ$ў$џ џ џџџџџџџ=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ85џџlgџџuoџџojџџ=:лџџџџџџџїџЮќЮd‰ў‰џŸ§Ÿџ‰ў‰џ[ў[џ/ў/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB>џџniџџuoџџqkџџEB§џџу џџџџџџ џјџ%Љ§Љ†Ž§ŽџЄ§Єџ•§•џmўmџAџAџџџ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџ%$џџZVџџrlџџuoџџqlџџJGџџџъ џџџџџџ џљџ(І§І‹ŒўŒџІўІџЁ§ЁџƒўƒџYўYџ3ў3џџџыџџџџџџў џџџ'џџў(џэѕџџџџџџHEџџkfџџtoџџtoџџniџџGDџџџэџџџџџџ џџџ%Ч§Чk„ў„џЄ§ЄџЉ§Љџ—§—џvўvџ[ў[џoўSџџў_џџўmџџ§uџџ§mџџg[џџ\Xџџkfџџsnџџtoџџqlџџ_Zџџ<:аџџџџџџџџџ џџџџћџFx§xѕ”ў”џЄ§ЄџЂ§Ђџšўšџ™§™џў§Ўџџ§Зџџ§­џєЮ˜џџ…€џџxrџџsnџџjeџџWSџџ=:цџЫПџџџџџџџлџџџџџњџ1сќс]€ў€р†§†џ§џ§џ’ќџ№і“ўџŠ…џџsnџџ^[џџQMџџGCЭџ€w8џџџ џџџџџџџџџџџџ џєџџљџ*џћџ<џћџGџћџHџћџ=џџџ-џџї џџёџџџџџџџџџџџџџџџџџџџџџ џџџџџџџыџ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќџџрџџ€Уј€€€€€Рр№?јџќџџ?џџрџџџџџџџџџџџџџџ(  џбџџџџџџџџџnџџџџџџџџџџџџhhџџџUџЦџџџXTџџџПџџџџџџџџобџџџџџџџџџџџџџџџsџџџџџџџџџlgџџUQџџџ џџџџџџџџџџџтШџџџџџџџџџџџsџџџџџџџџџџџ*(џџpjџџџџžЪђџЈўџџuџџџwџџџwџџџџџџџџџџџяаьџџџџџџџџџџџџ,*џџgbџџџџ‡§ŽџСўџџvџџџ[џрџ4џ|џјџ џџџџџџџоцџџџџџџџџџџojџџ<9ѕџџџџћџ@ŸўŸџPџPџ џ џџџ=џџџџџџџџџџџџџџџџџџlgџџojџџџџџџџ Љ§Љ†Є§Єџmўmџџџџџџџџџџџџџџџџџ%$џџrlџџqlџџџъ џџџ Ч§ЧkЄ§Єџ—§—џ[ў[џџў_џџ§uџџg[џџkfџџtoџџ_Zџџџџџлџџњџ1€ў€р§џ’ќџџŠ…џџ^[џџGCЭџџџ џџџџџџџџџџыџ џџџџџџџџџќр€€€Рр№џџџџ((цЎњьюљїњќћ”ћБќ§žўўўќў§ўџџџќџ§ўџўџџўџ(џ(,џ,9џ9AџAIљќJ§WџWZџZhџhlџlnџnxџ{yџy‚џ‚‡џ‡‹џ‹ŒџŒŽџŽЉЦЩњSејж§прѕљўњќћў§џўўљўќўўпў§ўўџџџ2џњџћџќџ§џџџџ џџџ!!џ&&џ,,џ//џDDџEEџIIџLMџQQџWWџZZџ^^џbbџddџiiџjjџooџrrџssџ}}џ††џžžџААџИИџќџ§џџџBDA21,+ .49CE@>7>0, 8EB@>>>>7:H -;>?>>>>>>JM"5bF>>>>>>KON#3c>>>>>>>SV`& /=>>>>>>XZU )>IV\^_(*'6QTW[]Y!%$LRPaџџ№џџ№џџ№џџ№џС№Р№€€€€РРр№0ј№ў№џџ№џџ№џџ№џџ№(0`ёё№ššС~~ВyyДDDž++˜EEЇЇЇгЃЃФххьППлОNNЊ “Ž’š Ї <<СВВЮддшЂЂЯ``Г™‘›ЅЏЕЛСЧба/0кГГУ››МvvЋMM•66Œ‚MM•……Н››Ъ­­еššЯssРGGЎЁ˜ ЌЕМТЧЭвиохы№іžšџ•—ИXYš=>Ž-.ˆ"#‡‡‰ ‹‘–“ЁЅЎЙТЩЮгйпцьёіљћќќ ћUeџОТл8:”y~…”œЄЊЏЖМСШЯжкпхьёіљћќћћ&њ@ј[јnї~љМHˆЭamаnwз‚‚и#ЅŽ ІЋА ЖМСШЮдкрць№ѕјћќќћ)њUљ‰јБљдљѓњџњџєџџџ­ѓсдЦРЙРRRЯŠŠуЮЮ{}и#ZО|ВЃМВСКЧКЬВвЂи†о]х*ы№ѕљћќќќќћ'јvљМљуљџњџќџќџќ§љћѕњџљЪљњіяхжЩЛЏИ;;ФjjЪџбoџbёwнцфзштючєьќђџіџљўћєћШњ~љ3њћћћњ<їЉїђљџњџќџќњќјћњљћїќџ§џўВўџ§ўў§їцзЭЛФ;;шЧЧ;ћ?ћ ћѓЬіќњѓћќ§ќќ§ћќќќќќџћџћџћљњВљSњ љіќљџћџќћћњњќљ§ї§њџџўџџеўeўў§§ќў§ўўёсзХйmm%ў%§§џ+ўнўџ§ѕўљ§њќњ§ќўќ§ћћћњќ§ќџћўњmВљџњљњћј§іўїўњ§џџџў§ўЯџmўџўџўўў§§§ўўњѓээ)§))ў)$§'§ §.§Яўџ§ўўљ§ї§ј§ј§љўљўљћјљјњїЊџњќЗњїћўџўџўџџіўзўœџJџўџўџўџўџўўў§ќўџџ џ++LџL8§72ў2+ў0!§ў §Šќп§џўџўџўџўџўџўџўџўџ§џЬњџўџџњAђўа§ЋўxўEџџўџџџџўџўџўџўџў§ ўўўў11ўШШdўd>ў>AўA;§;1ў5'ў!§§ќO§ќœќАќЛќОќИќЎћ"њ‰эіoўџLћІ-ўўўџџџџџџџџџџџџџўџўџџџ!!џ''џ**џ''џ__/ў/GўGLўL@§?:§=§ўўў§§§ќўќ§6§џћќў§хў"ўўџџџџџџџџџџџџџџўџўў**ў,,ў55ў55ў88ˆџˆGџG[џ[MўMLўL(ў(§§§§ў§ўўўўL§ў§ћњ§§ўcўўџџџџџџџџџџџџџџџџџ((џ66џ88џBBџ;;џ@@MџMRўRbџbXџXAџAџўџўўў§ў§§Z§џўњјўџџЅџџџџџџџџџџџџџџџџџџџ==џAAџFFџMMџIIџIIџMџMlўleўeYўYўџўџџџўџќў`ќџ§ћњ§ўўкўўџџџџџџџџџџџџџџџџ--џKKџLLџUUџMMџQQDџDRџRxџxmџm%џ%ўџўўўўў§§\§ў§њ§§ћџќў?џџџџџџџџџџџџџџџџџNNџUUџXXџaaџRRџ……bџbhџhƒџƒSџSџџџџџўџ§ўM§ўўћўўљџџџuџџџџџџџџџџџџџџџџBBџ``џ]]џjjџ[[џƒƒfџfVџV|џ|…џ…EџEџџџџўў§§6§ў§ћ§§њўўўŸўџџџџџџџџџџџџџ џEEџffџddџrrџjjџ__kџkQџQˆџˆ‰џ‰TџT џ џџ§џ§§!ќьќў§ћћџџўРџџџџџџџџџџџџџ++џZZџllџkkџxxџmmџ\\]џ]^џ^“џ“‘џ‘pџp.џ.џўў§§§Ч§ў§њќўџўкўўџџџџџџџџџ77џXXџooџppџttџ||џssџssuџuQџQ•џ•“џ“‡џ‡bџb#ў#ўџ§§›ќџўјћўџўхў џџџџџџ!!џ99џRRџffџqqџrrџttџџ‚‚џ€€џ‡‡`џ`\џ\џ˜џ˜џˆџˆb§b/ў/ §ўXћќ§њќ§џ§уџўџ('џ::џKKџ[[џffџmmџppџqqџvvџџˆˆџzzџnnџxxˆџˆhџh‰џ‰ џ ”џ”ŒўŒ…џ…lўj7§8ќ гћў§ћ§ўи,ўGEўQRџ\[џaaџddџhhџjjџnnџyyџ„„џ††џ€€џnnџ‘‘rџrRџRhџh’џ’ џ ‘ў‘‰ў‰Šќ…Z§lšќ+џљќџ1ўК]ўLTў][џ``џeeџkkџttџ€€џ‰‰џ€€џttџuuџџЉЉЄџЄuџulўl§˜џ˜•§”“ў’‡ћнџ&џъ ќv\џhmўsrџxxџ}}џџ{{џmmџ__џxxџ™™џЖЖžџžyўyuўuoўpo§lpћxЂъ…іu,§§<:џMMџVVџWWџ__џjjџ’’џЉЉ|ў|!§ §Hћ@ўГТўqp§ ў++џ::џooџААџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРџџџўџџџ№џўџјџррР€€€€€€РРрр№јјќў?џџ€џџРџџрџџјџџўџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ( @……НaaЄ……НЯЯу……НRRЄ55Ÿ›Ё^^РССкххэВВиxxП44ЇžЈГРЩЯ$!иpsЃLP•26ˆ‰45ЂCC­<<ВЌЇЏНЪжпчюѕљ ў€ŽџpkГ!Žˆ˜Ѓ­ГМЦгпшяєјћ&ћJћjї†ћšъН6`ТIZН]qЯˆˆмЛЛ<ЕSЇzКТuЫYе5о чяѕљќќќQћ–њбљёљџіџ§џџџeњщзСИР]]zџgђtыђіу§юџєџјљћкќ–ћAћћљ€їрјџљџїџјџўќџњхљ]њ§ўќюеПЮbbќ §ћБћџќњћјњјўљџљџљќјЙіМ/ѕџїџќћџњџќџ§уў‰ўў§§§ўџљът1§2'§$§§§џ§џўџ§џ§џњџќџ.џџ§оџќ џќќ§сџЇў]џўџџўўўў§ўџџ§^^>ў>;ў=3§2§§@§Œ§Г§ЦќЭќШќМRѕЋ§џŽќcc§8§ ўўўџўўџџўџўўў$$ў$$ўssQўQIўIKўL:ў<ў§§§§§§pњўўњЛ§ўџўџџџџўўџўџџ00џ55ў88WџWZўZWўWўўўўўў§…ќўўњѕў"ўџўџџџџџџўџў11ўAAўGGўEEtўtSџSqџq3џ3џџџџ§§‹ќџњћџџaўџџџџџџџџџџџNNџTTџSSџppiўinўnfўfўўўўў§€§ўљњўўšўўўџџџџџџџџHHџbbџaaџrrbџbџZџZџџџ§§e§ўћћўўС§џџџџџџџџџNNџllџllџ__eџeџqџq!џ!ўў§Dќ§ќўџўмў ўўџџџџџAAџhhџxxџ~~џ||tџt]џ]“џ“џYўY ў ўќцћўў§хўўџџ**џ@@џZZџooџ||џ}}џttџffnџn‘џ‘§ŒџŒb§_§(šњџўњсў@:ўLNў^]џjjџuuџ{{џ{{џxxџ‚‚џ››AџA~ў~ўšў—‹§“‰ћcљџ§ПL§_lўpmўqqџssџrrџssџ‰‰џŸŸ‡ў‡}ў}p§li§xЙщjўiiўiiўYXўiiџ{{џџФФ§}ў}џўiiџџџџџџџџџџџџџџџџџџџџџџџџџџџуџџџџџ№џ№РР€€€€€РРр№јјў?џџџРџџѓџџџџџџџџџџџџџџџџџџџџџ(0ЕПФЯбпръьѓєћд>ЧLЅPЙФћъПёњѕЭќќНќбќтќџ§§§„§џўџџїџџљrњўўџџяџџЙљжћј§ўўџЊќ7Ѕ јўџ;ќ-œЈўџ ЖЈћ!$#œ%-п-ћ!0ьF2ў23ќ(53Ї8џ8:ў3;§?< џ<хџ?1BќIћJJЂNMЕPќPPўRQ§ZTўSYўYYџYZў\\ZЪ^ў`_џ_`іbўbfўfgџgoџНvџvwwГzўy|zК|џ|~ћћ€vАПƒњ…§…††ШџŽўŽŽџќ•ў‘šњ›ў›œuЪŸљ ˆг­ўHЗЗгКїХ Х__Э$абім оњхџюює ѕџїlљ*љVTљЎњ‘њoњдћ‡ћећцќќћќ14ќЙ§§§&§6§§>8§LM§TT§Yg§§Љ2ўўўўўўўўўў ўў77ў::ўLLўPPўQQўUUў]\ўccўpmўttўїўџџџƒџєџњџџџџџџџџџџџ""џ&&џ44џ;џџAAџ[[џaaџccџeeџmmџssџttџyyџ{{џ}}џџƒƒџ††џŠŠџьџўџџџџџwaO@FchkP=0AgL?689<) 3>JsuX2  1Mix„‰‚~{zC+' #"[}ИЙЙЗЖ “|y;5!(!KФМŒ•ž““žЛ—ƒЌIE7*_’…–ЂžЕЁžžžЄЈСšTRH-,oГ†“К ŸЕЕЕЕРЉЊЎVY4%&tжŠ”ІЕЕЕžЃžЊЋ­]`G./qеˆžНЕЛЛЕЕТЧШаUdD$fД‹ЅžžЕЕОУЪЪЦ^l\:NеŽЇŸПСХЩЮЬЭZjnWB€д˜™АЫЯбгrmpev›БВЮвЬbQS‡‘Џœџџџџџџџџџџџџџџџџ№?џ€?Р€€€€€РРр№јќ?џџџџџџџџџџџџџџ( ЪжуЫ ОКђћіќќџ§§ФџџйЋџшџњ§ џксk ;Љ ў ўkKŸ!И&ф џ'џ,->џ/џ!0ђ9ў+;2œM§]PPНWjОY§ZbY f§fhџkiу=jџjlўklџoўooџptџ}nЏ‹џŒўˆŽЮŽљŽљЩџ‘ŒХЄЧЄЇдЌџЎxœГўФџХZnЯ[[клH[уЋBёљњњjњ$њћќќ>5§§§§{§}{ўўўџўўўўBBўKMўNNўPPўddўjjў‚‚ўРўы џџџžџѕџџџ џџ#Ѓџ))џ::џT]џ[[џuuџ‚‚џ‡‡џтџџџ&!0793#$/18A>;) =Scba`C@? 5hFGDENegj% :OITRd`VWY*( <^JM`QUZ[+' 6pHLfilm-2",_KX\no4.BkP]џџџџџџџŸр€€€Ррјџџџџџџ(0` џ“џ№џџџџџџџџџџџџџџџяџFџџPџСџџџџџџџџџџџџџџџџџџџџџњџ<џџбџџџџџџџџџџџџџџџџџџџџџџџџџџ==џтџ)џшџџџџџџџџџџџџџџџџџџџџџџџџџџџџ##џџhhџџooџџџџџџЊЊџџпџџы џџџ џџџџџџџeџЧџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLLџџrrџџppџџџџџџџ))DџJHnџ[W‡џmgcџшзџџъ џ џnџЁџеџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhhџџwўџ“oєџџUџoџŒџЦџфџ§џџџ>:џџXTџџXTџџKGьџtnXџџПџ џМџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџtжџхЮџќьџџџџџџџџџџџџџџvџџџvџџџaўџџџџџџџџџџџџџџ џџ)'џџTPџџtnџџrlџџhcџџOMxџџц џџџџ}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,їџГЮџовџїчџјШ§џџZџџџџџџџџџџџџџџџџџџџџџ8џџџwџџџnџџџ9Бџџџџџџџџџџџџџџџџџџ=:џџrlџџtoџџrlџџC@№џœ•&џџџџдџџџџџџџџџџџџџџџџџџџџџџџџ5єџобџ§ђџџџџџџџѕџџлОџџџџџџџџџџџЉџџџџџџџџџџџџџџџџџџ^џџџsџџџVяџџ$џџџџџџџџџџџџџџџџ џџ%#џџlgџџtnџџtoџџUQџџ@= џџц џџќџџџџџџџџџџџџџџ џџзџђтџџџџџџџџџџџџџџџџџџџіџџ§ъџџџџџџџџџџџџџџџџџџџeџџџџџџџџџ*џџџfџџџtџџџ*rџџџџџџџџџџџџџџџџџџџџџџџџOKџџlgџџtnџџjdџџGDџџC>_џшџџџџџџџџџџџџљџќёџџџџџџџџџџџџџџџџџџџџџџџџџЊСџџџџџџџџџџџџџџџџџџџџџџџыџџџ%џџџ/џџџiџџџsџџџcќџџџџџџџџџџџџџџџџџџџџџџџџџџ:8џџc^џџrmџџniџџPLџџ0-šџвџџџџ џџ џџ џџwоџћьџџџџџџџџџџџџџџџџџџџџџџџџџџџџтШџџџџџџџџџџџџџџџџџџџџџџџџџџџМџџџnџџџsџџџ_їџџ(aџџџџџџџџџџџџџџџџџџџџџџџџџџ*(џџZVџџqkџџpjџџSOџџ1-Ѓџџџџtџџ21џџ55џџ=хџ5ўџџ'џџџўџџ џџџ џџџ џџџџџџџџџ#џџџ8џџџGџџџWџџџџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзџџџ7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRNџџojџџoiџџQMџџ53Œџџџ@@џ%00џў~}џџwЬцџvўџџiџџџXўџџHџџџEџџџLџџџTџџџgџџџjџџџlџџџoџџџqџџџtџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџћџџявьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ" џџUQџџpjџџlgџџLHџџ73|џџџџџџJJџгžЪђџЊўўџВўџџЈўџџ˜ўџџˆўџџuџџџtџџџtџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџџџџџџџџџяаьџіыOџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,*џџ[WџџqlџџgbџџB?џџSKDџлџџџџћћџ3АўџџУўџџЬўџџРўџџЎўџџšўџџ~џџџyџџџxџџџwџџџwџџџwџџџwџџџwџџџwџџџџџџџџџџџџњџџфЫеџљщEџџџ џџџџџџџџџџєJџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџSOџџnhџџtnџџXTџџ:7Дџџу џџџџџџџљџ.ЉўјџХўџџаўџџФўџџВўџџўџџ€џџџzџџџxџџџuџџџsџџџrџџџoџџџmџџџkџџџѕејџчЫХџјю>џџџџџџџџџџџџџџџџџџџмБџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџd`џџrmџџtnџџMIџџA?rџџЬџџџџџџџџџ+‡§ŽџЕўгџЪўєџСўџџЎўџџ—ўџџvџџџoџќџjџѓџ[џрџRџбџHџЙџ4џ|џ*џZџ џ4џјџ џџџџџџџџџџџџџџџџџџџџџџџџџоцџџџџџџџџџџџџџџџџџџџџџџџџџџџџ84џџojџџtoџџrlџџ<9ѕџz$џџџџџџџџџџџџ uўu冧†џž§žџž§žџ„ў„џcўcџ'џ'џўџ џ џџџџџџџџџџџџџЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџѕ<џџџџџџџџџџџџџџџџџџџџџџ20џџTPџџjeџџtoџџqlџџ`[џџБЈџџџџџџџџџ џѕџВ§Вuuўuў’§’џ § џŽўŽџs§sџ7ў7џ!џ!џўџџџџџџџџџџџџџsџџџџџџџџџџџџџџџџџџџџџџџџџџџџџыwџџџџџџџџџџџџџџџџџџџџџџVQџџkfџџsmџџsnџџjeџџMJџџппџџџџџџџџџџ№џџћџ@}ў}Х€ў€џŸўŸџ™§™џ†ў†џPџPџ8ў8џ$ў$џ џ џџџџџџџџџџџ=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџфŠџџџџџџџџџџџџџџџџџџџџ85џџlgџџsnџџuoџџojџџ[Vџџ=:лџџџџџџџџџџїџџњџ5ЮќЮd‰ў‰џš§šџŸ§Ÿџ‰ў‰џsўsџ[ў[џ/ў/џўџџџџџџџџџџџбџџџџџџџџџџџџџџџџџџџџџџџџџџзІџџџџџџџџџџџџџџџџB>џџ]YџџniџџuoџџtoџџqkџџEB§џOJgџџу џџџџџџџџџџјџ"џџџ9wўwїŒ§Œџœ§œџ§џŽўŽџ{§{џLўLџ7ў7џ%џ%џџџџџџџџџœџџџџџџџџџџџџџџџџџџџџџџџџџџпЃџџџџџџџџџџ џџџџ20џџc^џџojџџtnџџtoџџqlџџd`џџJFxџџш џџџџџџџџџ џђџџјџ%Љ§Љ†vўvќŽ§ŽџЄ§Єџ ў џ•§•џmўmџWўWџAџAџџџџџ џ џџџhџџџџџџџџџџџџџџџџџџџџџџџџџџѕeџџџџџџџџџџ%$џџA>џџZVџџrlџџtoџџuoџџqlџџfaџџJGџџџъ џџџџџџџџџџџџ џљџ(џћџ?І§І‹ŒўŒџўџІўІџЁ§Ёџ”ў”џƒўƒџYўYџDџDџ3ў3џџџџџыџџџџџџџџџў џџџ'џџў)џџў(џэѕџџџџџџџџ2/џџHEџџkfџџrlџџtoџџtoџџsnџџniџџGDџџ=:Ѓџџэџџџџџџџџџџџџџџџ'џџџ=w§wѓ‰ў‰џ›§›џЊ§ЊџІ§Іџœўœџ{ў{џgўgџSўSџ7ў7џ0џ0џЁў.џџў4џџў:џџџ>џџўIџџўHџџўFџчТ4џџ-,џџ-+џџLHџџ\WџџidџџsnџџtoџџtoџџqkџџjdџџXTџџLJkџџџ џџџџџџџџџџџџ џѓџџџџ%Ч§Чkwўwъ„ў„џЄ§ЄџЉўЉџЉ§Љџ—§—џ‡ў‡џvўvџ[ў[џTўTџoўSџџў_џџўgџџўmџџ§uџџ§rџџ§mџџg[џџZWџџ\Xџџkfџџpkџџsnџџtoџџsnџџqlџџ_ZџџKHџџ<:аџџџџџџџџџџџџџџџ џџџџџџ0џћџFx§xѕ…ў…џ”ў”џЄ§ЄџЄўЄџЂ§Ђџšўšџ—ў—џ™§™џў§Ўџџ§Еџџ§Зџџ§­џќ§ЃџєЮ˜џџ…€џџ|wџџxrџџsnџџpjџџjeџџWSџџIEџџ=:цџЫПџџџџџџџџџџџџџџџџџџџџџџљџ*аќаbўШxўxћўџ™§™џўџ ў џ § џ ў џкќЌџџ§Гџџ§Гџ№ђЄџќЌ˜џџ‘Œџџ}wџџvqџџqlџџb]џџWSџџJFџџFC”џb_Fџ№сџџЊџџџџџџџлџџџџ џџџџњџ1џћџAсќс]€ў€р|ў|џ†§†џ§џ‘ў‘џ§џ’ќџМќ”ў№і“ўџŠ…џџ~zџџsnџџ^[џџXTџџQMџџGCЭџNK…џ€w8џџџ џџџџџџџџџџџџџџџџџџ џ№џџєџџљџ*џџџ3џћџ<џћџGџќџIџћџHџћџ=џџџ6џџџ-џџї џџѕџџёџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџјџ&џјџ'џјџ&џџџџѕџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџ џџџ џџџџџџџџџџыџ џџџ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџџџџРџџџ€џџќ>џ№<џ€€€€€€€Рр?р?№ќџќџџџџ€џџџрџџџ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ( @ џ“џџџџџџџџџџџяџџбџџџџџџџџџџџџџџџџ==џтџ)џшџџџџџџџџџџџџџџџџџџ##џџooџџџџџџЊЊџџы џџџ џџџџ џnџеџџџџџџџџџџџџџџџџџџџџџџџџhhџџ“oєџџUџŒџЦџ§џџџXTџџXTџџtnXџџПџМџџџџџџџџџџџџџџџџџџџџџџџџџџtжџхЮџџџџџџџџџџџvџџџaўџџџџџџџџџџ џџTPџџtnџџhcџџOMxџџџџџџџџџџџџџџџџџџџ5єџобџџџџџџџлОџџџџџџџЉџџџџџџџџџџџџ^џџџsџџџ$џџџџџџџџџџџџ%#џџlgџџtoџџUQџџџц џџџџџџџџџџџ џџђтџџџџџџџџџџџџџіџџџџџџџџџџџџџџџeџџџџџџ*џџџtџџџ*rџџџџџџџџџџџџџџџџOKџџtnџџjdџџC>_џџџџ џџ џџћьџџџџџџџџџџџџџџџџџџџтШџџџџџџџџџџџџџџџџџџџnџџџsџџџ(aџџџџџџџџџџџџџџџџџџ*(џџqkџџpjџџ1-Ѓџџџџџ21џџ=хџ5ўџџўџџ џџџ џџџџџџ#џџџ8џџџWџџџџќџџџџџџџџџџџџџџџџџџџзџџџ7џџџџџџџџџџџџџџџџџџџџџџojџџoiџџ53ŒџџџJJџгžЪђџВўџџЈўџџˆўџџuџџџtџџџwџџџwџџџwџџџwџџџџџџџџџџџџџџџџџџџяаьџџџ џџџџџџџџџџџџџџџџџџџџџџ,*џџqlџџgbџџSKDџлџћћџ3АўџџЬўџџРўџџšўџџ~џџџxџџџwџџџwџџџwџџџwџџџџџџџџњџџфЫеџџџ џџџџџџџєJџџџџџџџџџџџџџџџџџџ џџSOџџtnџџXTџџџу џџџџџџ+‡§ŽџЪўєџСўџџ—ўџџvџџџjџѓџ[џрџHџЙџ4џ|џ џ4џјџ џџџџџџџџџџџџџџџџоцџџџџџџџџџџџџџџџџџџ84џџojџџrlџџ<9ѕџџџџџџџџџ uўuеž§žџž§žџcўcџ'џ'џ џ џџџџџџџџџЉџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ20џџjeџџtoџџ`[џџБЈџџџџ№џџћџ@€ў€џŸўŸџ†ў†џPџPџ$ў$џ џ џџџџџџџ=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ85џџlgџџuoџџojџџ=:лџџџџџџџїџЮќЮd‰ў‰џŸ§Ÿџ‰ў‰џ[ў[џ/ў/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB>џџniџџuoџџqkџџEB§џџу џџџџџџ џјџ%Љ§Љ†Ž§ŽџЄ§Єџ•§•џmўmџAџAџџџ џ џџџџџџџџџџџџџџџџџџџџџџџџџџџџ%$џџZVџџrlџџuoџџqlџџJGџџџъ џџџџџџ џљџ(І§І‹ŒўŒџІўІџЁ§ЁџƒўƒџYўYџ3ў3џџџыџџџџџџў џџџ'џџў(џэѕџџџџџџHEџџkfџџtoџџtoџџniџџGDџџџэџџџџџџ џџџ%Ч§Чk„ў„џЄ§ЄџЉ§Љџ—§—џvўvџ[ў[џoўSџџў_џџўmџџ§uџџ§mџџg[џџ\Xџџkfџџsnџџtoџџqlџџ_Zџџ<:аџџџџџџџџџ џџџџћџFx§xѕ”ў”џЄ§ЄџЂ§Ђџšўšџ™§™џў§Ўџџ§Зџџ§­џєЮ˜џџ…€џџxrџџsnџџjeџџWSџџ=:цџЫПџџџџџџџлџџџџџњџ1сќс]€ў€р†§†џ§џ§џ’ќџ№і“ўџŠ…џџsnџџ^[џџQMџџGCЭџ€w8џџџ џџџџџџџџџџџџ џєџџљџ*џћџ<џћџGџћџHџћџ=џџџ-џџї џџёџџџџџџџџџџџџџџџџџџџџџ џџџџџџџыџ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќџџрџџ€Уј€€€€€Рр№?јџќџџ?џџрџџџџџџџџџџџџџџ(  џбџџџџџџџџџnџџџџџџџџџџџџhhџџџUџЦџџџXTџџџПџџџџџџџџобџџџџџџџџџџџџџџџsџџџџџџџџџlgџџUQџџџ џџџџџџџџџџџтШџџџџџџџџџџџsџџџџџџџџџџџ*(џџpjџџџџžЪђџЈўџџuџџџwџџџwџџџџџџџџџџџяаьџџџџџџџџџџџџ,*џџgbџџџџ‡§ŽџСўџџvџџџ[џрџ4џ|џјџ џџџџџџџоцџџџџџџџџџџojџџ<9ѕџџџџћџ@ŸўŸџPџPџ џ џџџ=џџџџџџџџџџџџџџџџџџlgџџojџџџџџџџ Љ§Љ†Є§Єџmўmџџџџџџџџџџџџџџџџџ%$џџrlџџqlџџџъ џџџ Ч§ЧkЄ§Єџ—§—џ[ў[џџў_џџ§uџџg[џџkfџџtoџџ_Zџџџџџлџџњџ1€ў€р§џ’ќџџŠ…џџ^[џџGCЭџџџ џџџџџџџџџџыџ џџџџџџџџџќр€€€Рр№џџџџ((цЎњьюљїњќћ”ћБќ§žўўўќў§ўџџџќџ§ўџўџџўџ(џ(,џ,9џ9AџAIљќJ§WџWZџZhџhlџlnџnxџ{yџy‚џ‚‡џ‡‹џ‹ŒџŒŽџŽЉЦЩњSејж§прѕљўњќћў§џўўљўќўўпў§ўўџџџ2џњџћџќџ§џџџџ џџџ!!џ&&џ,,џ//џDDџEEџIIџLMџQQџWWџZZџ^^џbbџddџiiџjjџooџrrџssџ}}џ††џžžџААџИИџќџ§џџџBDA21,+ .49CE@>7>0, 8EB@>>>>7:H -;>?>>>>>>JM"5bF>>>>>>KON#3c>>>>>>>SV`& /=>>>>>>XZU )>IV\^_(*'6QTW[]Y!%$LRPaџџ№џџ№џџ№џџ№џС№Р№€€€€РРр№0ј№ў№џџ№џџ№џџ№џџ№T,‘PШ‘_STATIC00Ј Ј Ш h 00 Ј%  Ј hмьќ ,<L\l|ŒœЌМЬмь.rsrcmricron-0.20120505.1~dfsg.1.orig/fdr.pas0000664000175000017500000000457711326434462017152 0ustar michaelmichaelunit fdr; interface uses define_types; procedure EstimateFDR2(lnTests: integer; var Ps: SingleP; var lFDR05, lFDR01,lnegFDR05, lnegFDR01: double); procedure qsort(lower, upper : integer; var Data:SingleP); implementation procedure qsort(lower, upper : integer; var Data:SingleP); //40ms - very recursive... var left, right : integer; pivot,lswap: single; begin pivot:=Data^[(lower+upper) div 2]; left:=lower; right:=upper; while left<=right do begin while Data^[left] < pivot do left:=left+1; { Parting for left } while Data^[right] > pivot do right:=right-1;{ Parting for right} if left<=right then begin { Validate the change } lswap := Data^[left]; Data^[left] := Data^[right]; Data^[right] := lswap; left:=left+1; right:=right-1; end; //validate end;//while left <=right if right>lower then qsort(lower,right,Data); { Sort the LEFT part } if upper>left then qsort(left ,upper,data); { Sort the RIGHT part } end; procedure EstimateFDR2(lnTests: integer; var Ps: SingleP; var lFDR05, lFDR01,lnegFDR05, lnegFDR01: double); var lInc: integer; lrPs,Qs: SingleP; begin //rank Pvalues //ShaQuickSort(lnTests,Singlep0(Ps[1])); qSort(1,lnTests,Ps); //qcksrt(1,lnTests,Ps); GetMem(Qs,lnTests*sizeof(single)); //next findcrit FDR05 for lInc := 1 to lnTests do Qs^[lInc] := (0.05*lInc)/lnTests; lFDR05 := 0; for lInc := 1 to lnTests do if Ps^[lInc] <= Qs^[lInc] then lFDR05 := Ps^[lInc]; //next findcrit FDR01 for lInc := 1 to lnTests do Qs^[lInc] := (0.01*lInc)/lnTests; lFDR01 := 0; for lInc := 1 to lnTests do if Ps^[lInc] <= Qs^[lInc] then lFDR01 := Ps^[lInc]; //reverse GetMem(lrPs,lnTests*sizeof(single)); for lInc := 1 to lnTests do lrPs^[lInc] := 1- Ps^[lnTests-lInc+1]; for lInc := 1 to lnTests do Qs^[lInc] := (0.05*lInc)/lnTests; lnegFDR05 := 0; for lInc := 1 to lnTests do if lrPs^[lInc] <= Qs^[lInc] then lnegFDR05 := lrPs^[lInc]; //next findcrit FDR01 for lInc := 1 to lnTests do Qs^[lInc] := (0.01*lInc)/lnTests; lnegFDR01 := 0; for lInc := 1 to lnTests do if lrPs^[lInc] <= Qs^[lInc] then lnegFDR01 := lrPs^[lInc]; FreeMem(lrPs); Freemem(Qs); end; end. mricron-0.20120505.1~dfsg.1.orig/fastsmooth.pas0000664000175000017500000003424311647404532020560 0ustar michaelmichaelunit fastsmooth; {$mode delphi} interface uses // LCLIntf,//<- only for gettickcount Classes, SysUtils, define_types, otsuml; procedure DilateSphere (var lImg: Bytep; lXi,lYi,lZi: integer; lVoxDistance: single; lChange: byte ); procedure SmoothFWHM2Vox (var lImg: Bytep; lXi,lYi,lZi: integer); procedure Dilate (var lImg: Bytep; lXi,lYi,lZi,lCycles: integer; lChange: byte ); procedure PreserveLargestCluster (var lImg: Bytep; lXi,lYi,lZi: integer; lClusterValue,ValueForSmallClusters: byte ); procedure MaskBackground (var lImg: Bytep; lXi,lYi,lZi,lOtsuLevels: integer; lDilateVox: single; lOneContiguousObject: boolean ); implementation procedure MaskBackground (var lImg: Bytep; lXi,lYi,lZi,lOtsuLevels: integer; lDilateVox: single; lOneContiguousObject: boolean ); var lMask: ByteP; lX,lY,lZ,lV,lXYZ: integer; begin lXYZ := lXi * lYi * lZi; if (lXi < 3) or (lYi < 3) or (lZi < 1) then exit; getmem(lMask, lXYZ); Move(lImg^[1], lMask^[1],lXYZ); SmoothFWHM2Vox(lMask, lXi,lYi,lZi); ApplyOtsuBinary (lMask, lXYZ,lOtsuLevels); //Dilate (lMask, lXi,lYi,lZi,5,255 ); if lOneContiguousObject then begin PreserveLargestCluster (lMask, lXi,lYi,lZi,255,0 ); //only preserve largest single object if lDilateVox >= 1 then DilateSphere (lMask, lXi,lYi,lZi,lDilateVox,255 ); end else begin if lDilateVox >= 1 then DilateSphere (lMask, lXi,lYi,lZi,lDilateVox,255 ); PreserveLargestCluster (lMask, lXi,lYi,lZi,0,255 ); //only erase outside air end; lV:=0; for lZ := 1 to lZi do for lY := 1 to lYi do for lX := 1 to lXi do begin inc(lV); if (lMask^[lV] = 0) or (lX=1) or (lX=lXi) or (lY=1) or (lY=lYi) or (lZ=1) or (lZ=lZi) then lImg^[lV] := 0; end; freemem(lMask); end; (*procedure MaskBackground (var lImg: Bytep; lXi,lYi,lZi: integer); var lMask: ByteP; lX,lXYZ: integer; begin lXYZ := lXi * lYi * lZi; if (lXi < 3) or (lYi < 3) or (lZi < 1) then exit; getmem(lMask, lXYZ); Move(lImg^[1], lMask^[1],lXYZ); SmoothFWHM2Vox(lMask, lXi,lYi,lZi); ApplyOtsuBinary (lMask, lXYZ); //Dilate (lMask, lXi,lYi,lZi,5,255 ); DilateSphere (lMask, lXi,lYi,lZi,5,255 ); PreserveLargestCluster (lMask, lXi,lYi,lZi,0,255 ); for lX := 1 to lXYZ do if lMask^[lX] = 0 then lImg^[lX] := 0; freemem(lMask); end;*) procedure CountClusterSize (var lImg: Bytep; var lClusterBuff: longintp; lXi,lYi,lZi: integer; lClusterValue: byte); //Given volume lImg, will generate volume lCount with number of connected voxels with value lCluster var lStart: DWord; lTopSlice,lInc,lXY,lXYZ,lClusterSign,lQTail,lQHead,lQSz,lClusterSz,lClusterFillValue: integer; lQra: LongIntP; const kFillValue = -2; Procedure IncQra(var lVal, lQSz: integer); begin inc(lVal); if lVal >= lQSz then lVal := 1; end; //nested incQra procedure Check(lPixel: integer); begin if (lClusterBuff^[lPixel]=lClusterSign) then begin//add item incQra(lQHead,lQSz); inc(lClusterSz); lClusterBuff^[lPixel] := lClusterFillValue; lQra^[lQHead] := lPixel; end; end;//nested Check PROCEDURE RetirePixel; //FIFO cleanup , 1410: added 18-voxel check var lVal: integer; BEGIN lVal := lQra^[lQTail]; if (lVal < lTopSlice) and (lVal > lXY) then begin (* //next code avoids left-right and anterior-posterior wrapping... if lVal = 0 then begin //should never happen: unmarked voxel = increment lQTail so not infinite loop incQra(lQTail,lQSz); //done with this pixel exit; end; lXpos := lVal mod lXi; if lXpos = 0 then lXPos := lXi; lYpos := (1+((lVal-1) div lXi)) mod lYi; if lYPos = 0 then lYPos := lYi; lZpos := ((lVal-1) div lXY)+1; if (lXPos <= 1) or (lXPos >= lXi) or (lYPos <= 1) or (lYPos >= lYi) or (lZPos <= 1) or (lZPos >= lZi) then // retire and exit else begin *) Check(lVal-1); //left Check(lVal+1); //right Check(lVal-lXi); //up Check(lVal+lXi); //down Check(lVal-lXY); //up Check(lVal+lXY); //down (* //check plane above lValX := lVal + lSLiceSz; Check(lValX-1); //left Check(lValX+1); //right Check(lValX-lXDimM); //up Check(lValX+lXDimM); //down //check plane below lValX := lVal - lSLiceSz; Check(lValX-1); //left Check(lValX+1); //right Check(lValX-lXDimM); //up Check(lValX+lXDimM); //down //check diagonals of current plane Check(lVal-lXDimM-1); //up, left Check(lVal-lXDimM+1); //up, right Check(lVal+lXDimM-1); //down, left Check(lVal+lXDimM+1); //down, right *) end;{} //not edge incQra(lQTail,lQSz); //done with this pixel END; procedure FillStart (lPt: integer); {FIFO algorithm: keep memory VERY low} //var lI: integer; begin (*if (lClusterBuff^[lPt]<>lClusterSign) then exit;*) lQHead := 0; lQTail := 1; Check(lPt); RetirePixel; while ((lQHead+1) <> lQTail) do begin//complete until all voxels in buffer have been tested RetirePixel; if (lQHead = lQSz) and (lQTail = 1) then exit; //break condition: avoids possible infinite loop where QTail is being incremented but QHead is stuck at maximum value end; end; procedure SelectClusters (lSign: integer); var lInc,lV: integer; begin for lInc := 1 to lXYZ do begin if lClusterBuff^[lInc] = lSign then begin // measure size of the cluster and fill it with kFillValue lClusterSz := 0; lClusterSign := lSign; lClusterFillValue := kFillValue; FillStart(lInc); // now fill the cluster with its size (=1 if the voxel was isolated) if lClusterSz > 1 then begin for lV := 1 to lXYZ do if lClusterBuff^[lV] = kFillValue then lClusterBuff^[lV] := lClusterSz; end else lClusterBuff^[lInc] := 1; //fill all voxels in cluster with size of voxel end;//target color end; //for each voxel end; //nested SelectClusters begin //proc CountClusterSize if (lXi < 5) or (lYi < 5) or (lZi < 3) then exit; lXY := lXi*lYi; //offset one slice lTopSlice := (lZi-1) * lXY; lXYZ :=lXY*lZi; lQSz := (lXYZ div 4)+8; GetMem(lQra,lQsz * sizeof(longint) ); for lInc := 1 to lXYZ do begin if lImg^[lInc] = lClusterValue then lClusterBuff^[lInc] := -1 //target voxel - will be part of a cluster of size 1..XYZ else lClusterBuff^[lInc] := 0;//not a target, not part of a cluser, size = 0 end; //lStart := GetTickCount; SelectClusters(-1); //for each voxel with intensity=-1, change value to number of connected voxels in cluster //fx(GetTickCount-lStart); //we did not fill bottom slice... for lInc := 1 to lXY do if lImg^[lInc] = lClusterValue then lClusterBuff^[lInc] := lClusterBuff^[lInc+lXY]; //we did not fill top slice for lInc := (lTopSlice+1) to (lTopSlice+lXY) do if lImg^[lInc] = lClusterValue then lClusterBuff^[lInc] := lClusterBuff^[lInc-lXY]; Freemem(lQra); end; //proc CountClusterSize procedure PreserveLargestCluster (var lImg: Bytep; lXi,lYi,lZi: integer; lClusterValue,ValueForSmallClusters: byte ); var lC,lXYZ,lX: integer; lTemp: longintp; begin if (lXi < 5) or (lYi < 5) or (lZi < 1) then exit; lXYZ :=lXi*lYi*lZi; //ensure at least some voxels exist with clusterValue lC := 0; for lX := 1 to lXYZ do if lImg^[lX] = lClusterValue then inc (lC); if lC < 2 then exit;//e.g. if lC = 1 then only a single voxel, which is in fact largest cluster getmem(lTemp,lXYZ*sizeof(longint)); CountClusterSize(lImg,lTemp,lXi,lYi,lZi,lClusterValue); lC := 0; for lX := 1 to lXYZ do if lTemp^[lX] > lC then lC := lTemp^[lX]; if ValueForSmallClusters = 0 then begin for lX := 1 to lXYZ do if (lTemp^[lX] >= 0) and (lTemp^[lX] < lC) then //cluster, but not biggest one... lImg^[lX] := ValueForSmallClusters; end else for lX := 1 to lXYZ do if (lTemp^[lX] > 0) and (lTemp^[lX] < lC) then //cluster, but not biggest one... lImg^[lX] := ValueForSmallClusters; freemem(lTemp); end; procedure Dilate (var lImg: Bytep; lXi,lYi,lZi,lCycles: integer; lChange: byte ); //Dilates Diamonds - neighbor coefficient = 0 //Dilate if Change=1 then all voxels where intensity <> 1 but where any neighbors = 1 will become 1 //Erode if Change=0 then all voxels where intensity <>0 but where any neighbors = 0 will become 0 //step is repeated for lCycles var lC,lX,lY,lZ, lXY,lXYZ,lPos,lOffset,lN: integer; lTemp: bytep; begin if (lXi < 5) or (lYi < 5) or (lZi < 1) then exit; lXY := lXi*lYi; //offset one slice lXYZ :=lXY*lZi; getmem(lTemp,lXYZ); for lC := 1 to lCycles do begin Move(lImg^[1], lTemp^[1],lXYZ); for lZ := 1 to lZi do begin for lY := 1 to lYi do begin lOffset := ((lY-1)*lXi) + ((lZ-1) * lXY); for lX := 1 to lXi do begin lPos := lOffset + lX; if (lTemp^[lPos] <> lChange) then begin if (lX>1) and (lTemp^[lPos-1] = lChange) then lImg^[lPos] := lChange; if (lX1) and (lTemp^[lPos-lXi] = lChange) then lImg^[lPos] := lChange; if (lY1) and (lTemp^[lPos-lXY] = lChange) then lImg^[lPos] := lChange; if (lZ lChange end; end;//Y end; //Z end; freemem(lTemp); end; procedure SmoothFWHM2Vox (var lImg: Bytep; lXi,lYi,lZi: integer); const k0=240;//weight of center voxel k1=120;//weight of nearest neighbors k2=15;//weight of subsequent neighbors kTot=k0+k1+k1+k2+k2; //weight of center plus all neighbors within 2 voxels kWid = 2; //we will look +/- 2 voxels from center var lyPos,lPos,lWSum,lX,lY,lZ,lXi2,lXY,lXY2: integer; lTemp: bytep; begin if (lXi < 5) or (lYi < 5) then exit; lXY := lXi*lYi; //offset one slice lXY2 := lXY * 2; //offset two slices lXi2 := lXi*2;//offset to voxel two lines above or below getmem(lTemp,lXi*lYi*lZi*sizeof(byte)); for lPos := 1 to (lXi*lYi*lZi) do lTemp^[lPos] := lImg^[lPos]; //smooth horizontally for lZ := 1 to lZi do begin for lY := (1) to (lYi) do begin lyPos := ((lY-1)*lXi) + ((lZ-1)*lXY) ; for lX := (1+kWid) to (lXi-kWid) do begin lPos := lyPos + lX; lWSum := lImg^[lPos-2]*k2+lImg^[lPos-1]*k1 +lImg^[lPos]*k0 +lImg^[lPos+1]*k1+lImg^[lPos+2]*k2; lTemp^[lPos] := lWSum div kTot; end; {lX} end; {lY} end; //lZi //smooth vertically for lPos := 1 to (lXi*lYi*lZi) do lImg^[lPos] := lTemp^[lPos];//fill in sides for lZ := 1 to lZi do begin for lX := (1) to (lXi) do begin for lY := (1+kWid) to (lYi-kWid) do begin lPos := ((lY-1)*lXi) + lX + ((lZ-1)*lXY) ; lWSum := lTemp^[lPos-lXi2]*k2+lTemp^[lPos-lXi]*k1 +lTemp^[lPos]*k0 +lTemp^[lPos+lXi]*k1+lTemp^[lPos+lXi2]*k2; lImg^[lPos] := lWSum div kTot; end; {lX} end; //lY end; //lZ //if 3rd dimension.... if lZi >= 5 then begin //smooth across slices for lPos := 1 to (lXi*lYi*lZi) do lTemp^[lPos] := lImg^[lPos]; //fill in sides for lZ := (1+kWid) to (lZi-kWid) do begin for lY := (1) to (lYi) do begin lyPos := ((lY-1)*lXi) + ((lZ-1)*lXY) ; for lX := (1) to (lXi) do begin lPos := lyPos + lX; lWSum := lImg^[lPos-lXY2]*k2+lImg^[lPos-lXY]*k1 +lImg^[lPos]*k0 +lImg^[lPos+lXY]*k1+lImg^[lPos+lXY2]*k2; lTemp^[lPos] := lWSum div kTot; end; {lX} end; {lY} end; //lZi for lPos := 1 to (lXi*lYi*lZi) do lImg^[lPos] := lTemp^[lPos]; end; //at least 5 slices... //free memory freemem(lTemp); end; procedure DilateSphere (var lImg: Bytep; lXi,lYi,lZi: integer; lVoxDistance: single; lChange: byte ); //INPUT: Img is array of bytes 1..XYZ that represents 3D volume, lXi,lYi,lZi are number of voxels in each dimension // lVoxDistance is search radius (in voxels) // lChange is the intensity to be changed - if background color: erosion, if foreground color: dilation //OUTPUT: Eroded/Dilated Img var lDxI,lXY,lXYZ,lZ,lY,lX, lVoxOK,lPos: integer; lDx: single; lSearch: array of integer; lTemp: bytep; function HasNeighbor (lVox: integer): boolean; var s,t: integer; begin result := true; for s := 0 to (lVoxOK-1) do begin t := lVox +lSearch[s]; if (t > 0) and (t <= lXYZ) and (lTemp^[t] = lChange) then exit; end; result := false; end; //nested HasNeighbor begin //proc DilateSphere if lVoxDistance < 1 then exit; if lVoxDistance = 1 then begin //much faster to use classic neighbor dilation Dilate(lImg,Lxi,lYi,lZi,1,lChange); exit; end; if (lXi < 3) or (lYi < 3) or (lZi < 3) then exit; lXY := lXi*lYi; //voxels per slice lXYZ := lXY*lZi; //voxels per volume //next: make 1D array of all voxels within search sphere: store offset from center lDxI := trunc(lVoxDistance); //no voxel will be searched further than DxI from center setlength(lSearch,((lDxI *2)+1)*((lDxI *2)+1)*((lDxI *2)+1) ); lVoxOK := 0; for lZ := -lDxI to lDxI do for lY := -lDxI to lDxI do for lX := -lDxI to lDxI do begin lDx := sqrt( sqr(lX)+ sqr(lY)+ sqr(lZ) ); if (lDx < lVoxDistance) and (lDx > 0) then begin lSearch[lVoxOK] := lX + (lY*lXi)+(lZ * lXY); //offset to center inc(lVoxOK); end; //in range, not center end; //lX getmem(lTemp, lXYZ);//we need a temporary buffer, as we will be dilating the original image Move(lImg^[1], lTemp^[1],lXYZ); lPos := 0; for lX := 1 to lXYZ do begin inc(lPos); if (lTemp^[lPos] <> lChange) and HasNeighbor(lPos) then lImg^[lPos] := lChange; end; //for X, each voxel freemem(lTemp); //free temporary buffer lSearch := nil; //free 1D search space end; //proc DilateSphere end. mricron-0.20120505.1~dfsg.1.orig/extrafpc.cfg0000664000175000017500000000013011316131074020134 0ustar michaelmichael#IFDEF Darwin -k-macosx_version_min -k10.4 -XR/Developer/SDKs/MacOSX10.4u.sdk/ #ENDIFmricron-0.20120505.1~dfsg.1.orig/examplefmri3.bat0000664000175000017500000000017510416516762020747 0ustar michaelmichaelstart mricron .\templates\aal.nii.gz -o .\example\attention.nii.gz -c -0 -l 1.96 -h 5 -z -b 40 -t 50 -r .\example\fmri3r.inimricron-0.20120505.1~dfsg.1.orig/examplefmri2.bat0000664000175000017500000000030010416516722020730 0ustar michaelmichaelstart mricron .\templates\ch2.nii.gz -s 3 -l 0 -h 140 -c pink -o .\templates\ch2bet.nii.gz -c -0 -l 30 -h 200 -o .\example\attention.nii.gz -l 1.96 -h 5 -z -b 40 -t 50 -r .\example\fmri2r.inimricron-0.20120505.1~dfsg.1.orig/examplefmri.bat0000664000175000017500000000030510416517012020644 0ustar michaelmichaelstart /MAX mricron .\templates\ch2bet.nii.gz -s 3 -c -0 -l 20 -h 140 -b 40 -t -1 -r .\example\fmrir.ini -o .\example\saccades.nii.gz -l 1.96 -h 5 -z -o .\example\attention.nii.gz -l 1.96 -h 5 -z -xmricron-0.20120505.1~dfsg.1.orig/examplecut.bat0000664000175000017500000000012710416516666020522 0ustar michaelmichaelstart mricron .\templates\ch2bet.nii.gz -s 3 -c pink -l 40 -h 120 -r .\example\cutr.inimricron-0.20120505.1~dfsg.1.orig/exampleclip.bat0000664000175000017500000000013410416516564020651 0ustar michaelmichaelstart mricron .\templates\ch2bet.nii.gz -s 3 -c pink -l 40 -h 120 -r .\example\clipnearr.inimricron-0.20120505.1~dfsg.1.orig/example/0000775000175000017500000000000011660470014017302 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/example/saccades.nii.gz0000664000175000017500000002003610403405132022162 0ustar michaelmichael‹YыDsaccades.niiьI“уVrЧ1ЖОљ#XG;lOŒУЫСŽ‰‡o$@ЌФћN‚ћRdэU]ъVWKъVKВЖфbл1ž“o:јцЏр‹Яў 6ШZI ѕRн•?…КŠ ’xQxљ™/ŸќБzнw ]gмhл]пБЛгnѕЛШ]фw‘ПB~ќљЩхЫќђћ‹ŸП@_ўђцџљылќып јЧ?ПzѕЗУ?њЛляўпхOšРІЬюŸ9~дЗЛЖѕ7я ољљ;ёгŸ§х_џщ;aђыЯХя]ўœЗsЕ­ѓі_ёХЫлўћ‡х§а[Џ/h§ЩŸ'џўСС‹i'eЉМюмN^w (l#ЏŒбИЛyŸU§i,5Т5GХ‹ €lj4ЧTЉ"ѕ:%љ=_ѕ иА гю?x(ўdКЕ‘ЎёЮўЬRЃн“у‘!0дЕЬЉeэŠuЛлqD}єб':Š #ё‹w|.KN<{Ђ1šЋ‘˜0ќђл3nО ЅyйH~Z ›ЦрЈЅйж|gњ№‹ЩUЛDMгQр3YНй ЃЦЂѕUўzk• i‘чъtЦБЊЌЊ3ы›1F,У&“ТЏ‡ьoјХ!0€Л—ецОŠО€зF•,nSЁ.\ьъХKbуГcXД&ZvђЋЄJ8‚&@ЫБ’н„+qSж'‰Ў 'УšЭn |–Qг•%іnSёŸžŸ6§0ьXuЅ=Ж:+Hв›uТююСŽ%{ЧŸžuEUTY0њ‡ГРр83ншш=3›ЁЃ(сљW'Š2‚$ jkЧвtН•j-ЁТš–"HољЗ‡‰`ЊБЂ,6ТЩXc3JUC”˜h'9є­Хgжb[…LГЁЫ$Щ(—B5ŒVS]0”ТbЄDa„u)H%Pз6V*ЄТб"’ЎwYпTc)4л a§ш›ЙКy‰2-Ђ`ї‰УF{с owЌ~ЧИr*З§@yЫ”’ŸMOœлVдЈйЯмYЛЪUV!9'Lœy%ъї-šе ?Вt'УІГ‰иыЩъ№xgЇiE{П~ЌЪQЗЉ‘„ЊЅEЃ@еќ‡]EŸ=9žХQ†–wђp в”x †у§'OюxВк;?lл^dЩŠе{џљHе еJЕ1кЛгvГх;ZЂдЮ&:ЋО&+ооS=5ћiзUєа%HQе5Y'N!Ьае$=оYо ЌTБЫ FYAфВ5VžKŒуъМa)ŠЎыCЄŸVЌи‰—„cШ5\‘9ŠЬњ‚Ћ’*TЉхwiКŠ)"KxЁрJ7ЄёtБOuљuEЖ,ЛА,ч7Фslю…sЧчlъЮИkиFyGч9„6|оНD5%s_eЧI<ђЦў$4Т8љіу uлqє Ї7Ї*qˆrИпЖ\щz"_gh‚–3ŒТЖŽ!q c“гQKf”`ВЇрМЬ%ЇгѓТtЭаtЯЭlAьc]1LЇчI~Ч­c$ЧЇ*^j8_џгYЧiHf'ЖTгKd†NOЇfдuд@ыД‡ЇГ‰kY†Ђ{–,yУQdjVч№ДћєМзoЅY‘vьЫ‰‘lKтxŽЄэбИч)Šўх}п1RЯЊZONИBИ=уЂљЕФ”Љ+Жэ?;ГЄPZaіІЗУn˜l(Ђ5lЫ9БИR эЅ-ДШ2’ЪйšЃ6–ENбšl5œЙмЛTEй9флЌїH$†љ€Зє ЩLоxАŒ”Љ\PМш JS&B‘љ5()Ъ4)ъvшї`z;m[тнЇЛЯЮЂч“VаФ—–о{зч(yєєыЧ!АGd ПЫУБ˜X (b<:Zu‚3Ќ ЋзkLте’щ eUsЎКЄА^ <‘fш. •јзTњЬзiЁтŽ,УQ?hˆсIK*ЉfК~EЩhћAгБ\гrн/6žфEбэ ђГЇНд 4.lw#ЉІ4c]U•:ЮЛˆ'Vm+ў—чЧQъБ‚І=џ:™AKЄhЎN+nд”p†,ЇЧQКНИŒ#-ЙО8паEЖN`Мcy§§УРP„,1™0›.Ф*\ЈРКую№СР­чC†Ы:TPhмЕГ„южŠі#ВТEV~њІЌh%‰#ХўІСЗъ†зP˜27V"ЏоxФfa“ ЃыRСdŽ.šК@omW­тŠo жєdЗяn?SƒшM[эй{ЯŸ?мLТц.я<(ги?ощФ§щёљччѓmbіёЄжФKœeч[ƒ8є§ А5g”H Ѓ™)iIœ;МШ6њm?lFОžМžЫЙ‘œhzВ–,-dƒф7єаѓк§^лI6P(RD ъЉўŽпђцS–xпw4Eѓ|Чoкє<№EhђЋџ=5гкœœЮ\Ў‚ЧCƒ'XЛ3OЅCЋuљўОKi‡ъ„Tђiб€ЉБbr~DђѕЮsйа*R;8йiZiZЈЂ/%_M ЏЁЧё‰X`Э:ŠгqпU;ХшћRG“"K%WŒn$…ЗvCІ–sw\‹š*Ж8ђтЊ5b7ї6Tв"nŒ“#гэJй6П‚pїaE˜hмCФтQЁ*kл‰Яцd3­ТKœdШДhE‘›ъVЇPaJ1EJž|x6ie–Xƒ cGѕ~ћйљƒЮІ}ХіЂ№Ru:qмъŸ>zјјљГЙЧœW!8n_ЎсЦ§ЩxаŸь$ЏVцИ*Св—‹гTХэЇ;ЬЭ#Hš”9§C•/>ЏJа4ЋЦ{GяžE6wхх RsљДx[ЮОˆWqБ9=x№h|!Iя^ЖІИцBяфdЎбNЂбУЮИ­cдŸєвц%‘СўBjr‰’dUЎЫ–#"1Ž&Ё›Њ.jKЬчеdђ%ЯУeЕE0­о ee›Њош­ь@МБлщфк­ћеsKо•B%рЕQ)^фƒU0}XЇФDŠ/1}Хз ІЏvёЬ*2HQuEЉ jаon­Ox]фЅzn4GгЎВe‹БМФуеКЗћУииф‡^=G]bh9ьŽfЛЛY5ЏшL.5а%YїтйщЛЩЫ0GЏё§ §„0’ЄшЖїwчЂ r9Бў4Џ0з%Ÿ1ОсEё`:эЙsЭRХБц'щйZRуFZqюp<=9пo^wдГвмЮnp}PЮЬŽ?ън””nюэЄ}g§ѓ“+…„qrДћрЩIx#Iмё -О#u&—эЎеyV zгЁЫЬƒ/‹mA7’гЎЦ^~(Эд’N–[днЛьmуЉГ]YPœЙљьЮQ~В[*aЇ„лУцwŽRщ„ `мV‚ЉhV-ћeHЈЭё‚x3'hёИЖjЙ~сљŽќШ+ЁŸ@=№cЉ\ѕjEz7ЧћгОЦnыST%vЮЈђA0lo9"_[„R0šV'Ч{—ЛГf_> КŠTH†nLNgУ5ђ:œG{Wg@`ѓш ыюv_Љ›у] G“ЋФqЅxйяuчсизЌНYКg^?цI–tЯї]}~+œмzіЯnšMUПvM*ВыћЩ84ЎЄ{№нѓ4)Єн„ТH=ъtЦ‡;–xе™UлЇџІjšџіеUЇZWќббйАqг•9эIЊ:}tЬV%ЄpКЋ7_ЌщХZZoШ- $Œ•%сц4ЭЛЕ^oнAœщo2М‚Єт^t E‰2Г8ЉАL‰ŠО$о Д(Ху@R*Ю UM6 kЉ) љˆAёЧјГоw˜rу{WО,ІЮŽШG‘ЅhGн4–Гвй0N+оoЫљ§жmyU•š;5”Я{РžŸHь’›йEPнЊgЮ?ЉL+oQњМvзmЙЎ—‘oXY~ƒdyQ^4LuЌЮ{џ˜^gŒИе4”р зk\u1UчГяЯS”шцwZ1н8VЎЏfунг‡Љ%ф†Oo…ka†JЪЮ7гm№$ЩНnж}дЬw-%жEеО9йU2dƒvћвВвИёHšШ˜СГ\ю Ї–Н‘Œ/ыэЧПTJ ЈƒЛМвЛ!,п“OЎ ^‰лДђуnэRЛ„\lIЕWFЉДеЛy*/C/žЙР0ІI—KvкєЩЂТ„”NTъФvсAykчАээбИё~`n7Ћ&йљJ^(Цm;№v3эЃ‰mЛъm IpЏ`ЫTцPзжR‰^уpuha‹чЛ‰с№ŠйжgПMЪlQ;Њ;K[:Г–џ9бФNДммщJтѕГ§YзЩдв”п9а эсЭq‰E@ˆ"9a0ѓИK@d(Ь›МRRm‹Ц+жЪ‚нм—p&(!€W CХљ–* ˜;УШ’зdM%ПxЗЕз1˜ЕйкЫ+KЦNwRf№нc/OAxiyprаЮЅiWГœ”­›Р 4№šЉ dЉЋo2+cМ5алоk•—šgUцУ)m )ДЖ<ѓVayЈ4№ъбJTЏmЙЪЊЊ6дсъѕНЕ# \ZѕГіяТjч@БF+/–д§фas­з!$3Ъ›ПЯЮДЕ5УЖr6=mFъ_ *Йы‡€W VУЫ‰‘к+S5•ћъ)цшЬрЅVД(ѓЃ|™я)Еђ–CБ2чa–)ыEтю,jqїчЛcsхСN 7йœ<6VЦвшŽ•/…ич Œ•оs51Зц—єЭљp­ўЕщiљ… GўZ„JюДђWХ1)зЮъњЙFщWœMЁRІ4dRJдTяЋ@yKИыљЖЅrЦ^Іђр Ђ №vQЂ'|hЏVдоlЃ…ЪŠЫD57Ѕ’IMkM ш ›?F:шkqЅ!хч't[Э5­Ф;ыл–0эuЉTе^ЎQjJщ–YЈ†ФrрХEŸ€{E)џђўJрярm[г\›чЧдЩЕЎ Х№| йЦš‚Aб Ц§ЁНКфЬќ5gˆNД"єо)”BEіJф\0П <лhМTєНд:gРн ”$ХяФ"kь›\€ VJ›7žыЌЦHlSqˆЃнСЊ€”е<РUм–Зš“.qёФ~СШЯL…b`ё~PЊ‡…Ќ5р­ЅдœЖЦ.АИм5~\b Ъ/БИ4,YќЂ)З:”’_Я)ўnЌW оFЈЅи!o> FУхб6f№бнНЃe-„jЮЦЮLш.їЪ„юmV5јэSЊ!X]W >Аёy%ˆ2ўЌ‡њVP& HQojёЅЙ‡ыjрSf ›їœj†жЯHnБ•’“mИПшйl=,ДёAjя˜0ёB‘П—DЉ~Ъ€@inЏЧА­Ѓz7„'ЗБы=мЙЭр ЖеСШЩчя_Ы,ЦЈЃ5z‹Љ8жч{зЭ3\QRЗvto>юГЎЎ™IB?T•ЭђnŒчш:3~/о+Џd­/ŸгѓЋŽ™UV+гЙЇz;~ёaKе{ЁўZцњqЛй к00zЉЪlY”КRїн]Ет6JЋI#еДЧs5GXс<^ЅєЕ„фЩПAaЭоjёž-Цо­ƒцІ]р.уЃ№ŠiK0GЎxщ@Бц–9ФуЇmѕђPб(иnдƒџѕogЮE`œzќщ‰ЗUа…јњЃЩeэnњгџќfфHлŒ]MтЋибўŸw}gЕГw]šЮ~ї$vнmІ‰юѕsNpуІуœ“TЃ%ГQТa|i#xБўб•2ё1ЖL^К\ЕщмvdеЃЪЖ{“(cњB-SОЗ>zOћш˜йЭ@‹ЧT$Їй-ќ`УЮxѓ~Љ:Эm)'xяѕЈuй“gДт)kœн4иК"ЏпykеъDW-Ѕј`˜Rg#tXj}Й6@YJiЈUРЋЇц{Ц•/>L[5 х`жНа2ьбзЯ[лuП§тƒймчЊ†ПљЏп>йЎ';љњћ0?RХџю‡_=шхзœЛ€zі§oО4П Чп<™єЂ-ЄPуУџјъВH8й:;› ‡[Ќ_фœ~]ўZw{ЧgGЧ›+еaЮ4Иzм3†3~ђx–_=bёщІЧ_{&x]ј›GђEѕџл;ѓчФЭ3Žѓїqи BЗФ}#nƒЙc|b|ЌнѕюzdвtГйNv{Є“4ЄэДщtІгў™Lћ7tZ0^{yx’&“}>?йТЏ%Ы:Опчyоч%ЏwХ r)..z­N›ѓК3гx3чг7D„еšoЈ[Л•Ђ b/5œТоNah­RDџk(нФOе‹шЉjLР=й*u$ЂдRюЉ5єфЯšужжOъaдХ‰›qcЬF"ь‚мё"м$:Ьn^іU ѕ!“Џt›^ѓЗ‡јqT§Я vгcbfUMт„JЂtн|"|b~7”R2lНБй—gЇъ­Ћwъ0^‡Iч›п Ski—лjІnоПSž825Aкf н€Дбѓ’›fyяPŒРРBА8]“љЛї›3rž|дк&•{їЩеаLяgэцп>= 5•ЇЕбЉ$gщ Œ?:+щсa:3еfm)8нсМХНкЈNCюЮе;ЋэњдNu26жкHŽdбКЎЅЉnбщћаŠWяЯЎ1IЏ” ўY,Ёc­Ш(6Ш&lЦqчpQ€ЅЂœтbвЧWV„ЩšбХ 7‡—­ВIУ№шкvг‡8†P'KMR{њRЇE§НŽNХ>ё_l №7EяdЉЧЋ‰a*ѓ#ЋПќbЦРФ8ЧwZЩі“C1Š(Xќ7N“AЌєЫьbXJCЗoќCјXvш…&ч'єОdœЦиjу†тwЯB„\иЦnЅХЗ. лv™gLzbЎTЦuZк—іšMsцe†`<ь™?СƒёЗИd%јєј|\E #S—Н$yа>Y“l>3лJЉŠъЧ§fm чи@ЎY ЯђzжЅvтсЁра„’ЅНоJ(aЯЕЖЛAћ0/D”зЛGћ7еШлш=•Nw#jgeƒ}–іw^|ВŸRjЄ.›йtХЯ '§ъ„гgП§r3d•{Ж– ѕg ТЅИ#о9|ђЂdqf8‘1 ‡' СЫ†МCЎ .дКŸБ„:"ёe{­З›хIУHИЋДZSb?e плFяJ—оъі—!cТ ЦјMСl-—jEхЉt›Ы‘Kы А„сГЈp_ux‹ЎZ-/иЏ„ЉZ=џFСњјЩ.DуnпНз№\;ЛфХwЄ'вLZ:ŠЬїї6Т“н38> љ&|ІŽфд9’†_ГўV/љѓQдЭХРЎH§цГт#ДЖхNVЁUС,мœѕ"^ГwпРјЌpmЋ–Ћ"6жЌГ­џъєкfSPh%Ј‹>^/ѓ8лў№§k– ~}Р*rђUЩTW2ЉJН;ŒТsїE'цЖPsхр(ПзЦњs•(;G‹kЭ№Ђ#МЧGЫСyіuŽJ(ЯўЙdaт§?nДoТ~жŠCq}9SЪc’K7вSЫD†X лїк…в@LгеЕг•Р Љ$LЈьО<ЉdЉЬЙs|№єНещћвpЅ•ƒW‡­ВEЁфVW7|ёЊщ›’рЁ*еЕюоisЃd’)Ы…ЕЇўЖУ1ЂsddѕуZscЗSь%Е2LДŽ>њ}Хц ‰ЭMс>iЏЌ•Т™^\-Uр”+QэD™РЦZт,V_~ђўщŠЯь hbMЅ7YеОзШяЌ8PcЄОўёу–уBžЫ–ещ|-NK7<Јl]mлыю7>DaŒе)ЅW( qЩlЏ•Œ'Ўь•*а_}ЅЅŒ“Н$]~xT\O4ННiqOŒВ›7ѕђЬфьцощ2“іЅ /P6]šџяыФфE| ће{ЈŒ‘™ШќcоEБ0ТdєБ­§kЯšMki†Ёƒwўњ—фјжшrБ‘CВцšqЪVў№гqЌ‰Tю~vЂДˆt йО—TKTЎ =–ЖТ|ЉюуГВѕ "ђЫл/~Й ЗКœŸіvb3=j% –ŒQЃ7 O‘§{?=г Сc]zйЅбЫЬ8hHcя œћЂ’œDН3Lпb/ь4RIЇDb*эR]s5†1жеЯчУFcЈTпмЈg§г'С„—/Z…Š_oŠ—гЃГ;ЉiGЈ„ѕ_Мъ/uы6ŒŒ.GѓЧЏž%щ)ў)нˆ7ŸьхВw ff„ГЋЛ§ebФ‚вЖњzqчlй“=Ю Є;N;“ЕF'Ъ8b"й8,uјхїТ–h|8љгщlёjOА8г"г™ќЅЮЧl ’…s]S ч–FSxE@9<§RФ­]+}Ќ9P^r•|ЃЮ;ž.ё:ТpЅ>1oртїуFѓфК"йЋqФФг$U]“{PaЉ­Š!r#Ѕs–zђџ‡Р-r5QФž€я†ŸЛ–>9 o ЭтеА‹Ие—=ўќыcлLщjЃšCпИJgЁѓ.нžлЉЎџђчEƒŠщpНRЂOdxеUК)XnД_?ипHЁdчзф†у$)“ŸЯм[pGcn_JX§гіŒM 06le,ЃV&QЙ3Їj˜ЙZo=Tцš\ЏЖмb2МsЄЃхŠLod0‚лщ'МBj VьžtŽgfiЦ=xйрЙtBТКcЁьўfк5ЕЊg‹g§„#^ѓшP)“;8mјE mюфJ)ъЕyЕ† чђЭV)j!E›дЪc[•юa5”н*йdjГGX*VJ~‡YL”ып>?ъчќq?‹ ­Aљ эFœwаш")зњцyЦЌX$ЮГšТj–їЛXw:„dq™љЬ•ЈQ{F Є5 Ё’+&#Џ+’НЩЮШLvaеˆ`U‚†1~DЊKFчі I”йKьёЗZјў0н"улкК^В8ептювЃWПН?ЖХr™ˆHlFiпм(ДвКВY–rЇsќх?lЈч„"КnЧЙZ;:|$,ž7tdън­їўѕяпэŠЯФ1sЃ  етp] XNH•—7ї§тихС ЮX9Џ‡”Ъчš“$зXВељWО6жжoБŠЋќ6+ПР;F=g3‹cЙ!В<л]яD`Lžь@X;ќѕЇk3Эт*еˆУ“‰KtlЁл?ыeќS#Аэ Љфj7Jщщ№jЋYЪ’ЈЬХtПUює[ѕV-L‘fG$Mч%TWВ ђџ9­fйœЧЩ:ЦN›бx6ч]. Џ}НыQ<žZ*ЮржЊ=Сxh‹ЎbQ[Ќ<)ЄFыШjЉЕД-,ьЕ™=—ЧЄВйнЄH†@И8Ейz^‹6™RTп9QфPЯѓ#ПEџ1Os7?ч]ъюЃю\ж‰<Šою Š sUЌTй<ћѕъe(3J•Н|ZЃ"КИƒ67гCЫ-Uo“+š_љХ*тGh‰xЯo$)6АB f{ Й” 'ц*Г4SЌзožГOЕJcŽч˜ŽtЮ;[сџgјзŸЯіƒъ`Г]H%Ђ‘У­|ўГ•и c0&КswЃ’р$ўtЙK S ьe„/yєтN1 ФЫЅŒ›їxУТ”u Упд]F:гђК\Ўh­ЖZэЧДRСРўв@Є\И’ нEжыд :‡јТŠ8Х^fJфІ7Ы@rЉHnЕnмЛ(.ІœЄбYd:KcМUЉ Ќ—ї“@u sЊMnЯ=‹Nфћљын ЬSŠh)Л'БД›З^(…ЯЅHБі:5a‹6ŠЃ{ЯЏљEТшJч‚гŽ˜FF‡ЇцИф‹j=…hЮ€„Ф1|юеЌєzB;џНЄФОћE˜јС№>ѕ'}НчНlР/‘д–sСа”њ•вш\Zі8мЩgћcІizъ˜†_+•гУњGтЈэдъ z§Д:AБсКі8N–lв4F‹ъ)іiQsЅхњ‹ЅwЇ­€(ЗWa3ђ?њп3KZYmricron-0.20120505.1~dfsg.1.orig/example/lesionm.ini0000664000175000017500000000015310320256116021445 0ustar michaelmichael[STR] Slices=82,92,102,112,122,132 [BOOL] OrthoView=1 SliceLabel=1 [INT] Orient=1 OverslicePct=-35 mricron-0.20120505.1~dfsg.1.orig/example/fmrir.ini0000664000175000017500000000047010320332714021117 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=0 Trilinear=0 OverlayFromBGSurface=1 ShowCutout=0 FlipLR=0 [INT] BGNearClip=0 OverlayNearClip=0 Azimuth=80 Elevation=45 BGSurface=51 OverlaySurface=1 BGDepth=8 OverlayDepth=12 CutoutLo1=90 CutoutHi1=181 CutoutLo2=108 CutoutHi2=217 CutoutLo3=90 CutoutHi3=181 mricron-0.20120505.1~dfsg.1.orig/example/fmri3r.ini0000664000175000017500000000046710321254420021206 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=1 Trilinear=1 OverlayFromBGSurface=1 ShowCutout=0 FlipLR=0 [INT] BGNearClip=0 OverlayNearClip=0 Azimuth=80 Elevation=45 BGSurface=25 OverlaySurface=1 BGDepth=8 OverlayDepth=8 CutoutLo1=90 CutoutHi1=181 CutoutLo2=118 CutoutHi2=217 CutoutLo3=90 CutoutHi3=181 mricron-0.20120505.1~dfsg.1.orig/example/fmri2r.ini0000664000175000017500000000053610403404316021204 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=1 Trilinear=1 OverlayFromBGSurface=0 ShowCutout=0 FlipLR=0 [INT] BGNearClip=0 OverlayNearClip=0 Azimuth=110 Elevation=45 BGSurface=25 OverlaySurface=1 BGDepth=8 OverlayDepth=8 CutoutLo1=90 CutoutHi1=181 CutoutLo2=118 CutoutHi2=217 CutoutLo3=90 CutoutHi3=181 OverlayFromBGSurface=0 CutoutBias=4 mricron-0.20120505.1~dfsg.1.orig/example/dataset/0000775000175000017500000000000011660470014020727 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/example/dataset/continuous.val0000664000175000017500000000052410513174324023643 0ustar michaelmichael#Version:0 #Covary Volume 0 #Template C:\template.img #CritPct 16 ImageName Cancel 1.voi 2 2.voi 44 3.voi 22 4.voi 24 5.voi 23 6.voi 22 7.voi 18 8.voi 12 9.voi 15 10.voi 41 11.voi 32 12.voi 22 13.voi 60 14.voi 58 15.voi 57 16.voi 57 17.voi 55 18.voi 56 19.voi 60 20.voi 59 21.voi 57 22.voi 58 23.voi 56 24.voi 57mricron-0.20120505.1~dfsg.1.orig/example/dataset/binomial.val0000664000175000017500000000047510513170170023227 0ustar michaelmichael#Version:0 #Covary Volume 0 #Template C:\template.img #CritPct 16 ImageName Cancel 1.voi 0 2.voi 0 3.voi 0 4.voi 0 5.voi 0 6.voi 0 7.voi 0 8.voi 0 9.voi 0 10.voi 0 11.voi 0 12.voi 0 13.voi 1 14.voi 1 15.voi 1 16.voi 1 17.voi 1 18.voi 1 19.voi 1 20.voi 1 21.voi 1 22.voi 1 23.voi 1 24.voi 1mricron-0.20120505.1~dfsg.1.orig/example/dataset/9.voi0000664000175000017500000003517310513166262021632 0ustar michaelmichael‹9.niiьнMŽ,Kž—ao`€XEI *1GB‚m0)ф%ZˆЎBн,€ААкb+Lрffd„˜yxЖтИ§бЯSЊ:™qЎTя5™›{X„dџўЏІiўЛП§нЇщї§чПљуяџгŸџњOПŸџ№_џ№ћ?M_ўvњЧгџšўЯoџІПњќЯк?šўщчŸџэпЌџЛѕ?ўн?ћпџќ_я_џђџnўнљ›п§Ып§с?џЧ?ў‡П§Cяў?§љOќноoѓOІvчДy§ўe§кџ§ЫњŸћяљЗлџЯёЏ^Pќ6€74јЙљ7Ѓ~jŒNlž“#›ПЃГЪчЛб%? њ2Ђ/=EF‡оЪ€вцy№Cѓк=FЯwЃKЮKlž›Їрцб?3ЏŒЎ9Iєe"Ѓ'б1=Ўљјљ.рC`2Рљ7Ѓ~fў2:уGц9Џ:К9ЈzžѓЊgб™ЋWЕiбп?ю9e3?ц­бAgˆОЪo•yбЛЁнsЪ;DЮ9)2zJl^V.љ‰Фцдъ[їшFš?ŒŽј‘yŽkžяF—œ7FЯs^ѕ=ПAtDѕЖYєЏВ‹Јо7'E?~\tТjtS†њб4?ВчДш_MєU"Ѓ#Ÿђ2Ѓ#пЙdОG\Wn9/2zћˆš#2јЁљЫшŒŸ˜яF—œ6g7ЧDЯs^ѕ<чUo›Eџ"Лц„ъФшFГш_Ђ]ОzU)њzdЦMШ9§бЃ›ž}б—IlЮŒŽ|8eОпTŽ9-2:r3яCb3=ѓЇб?1ЯqЭѓУш”Гц№ц”шyЮЋžЗFАkЮŒЎ_нh§+ДšEџ Эштеп‘бŸcЂчЭЏб‰sZєЏЙNПQєшЈЇD_&2:ѓMтЎztЯI‘б™cAOгk‘блw)›рВљЫшŒ˜FЇœ5kОТМ6:ч”90zлQНЎ_нh.нj§ 4›Eџэшкеfб/'њ*ЂЏ"њ*‘б‘wФwŠ]ѕLdtфл­‘б™л5г&{tЬi‰Эг"{tШDF~0}GЎјЉФf*š?Ўј‰љntЩiѓ=Ї7‡TЯ[ЃƒNи5Dя›ыWЗšEџЭfбЏзn§z‰бцкеЂЏ"њ*ЂЏ"њ2ЂЏљФt“иˆЎ[-њ2PбПDcNdD?~ ™гї=ЧЭ0—nžvC›н­[ѕФn4я7Lš›wХбMЯ%6gюN?ЎНЈшЧŠдМ\2ršЇА1~ˆŒ€ІЌѓш?ЬwЃKN[єЦDчђbfфtЯ[ЃƒNи5T7šЫW7›ЋW'FwšKWw›EПVПYєkНWsdєшВЂЏђfб…ЋЂыV‹ОJ+4+zѓтШЎCСбч^­Ѓ=ЂцЄцj=Џ^ZѕЬўRL‹žЇњsугіў’аœЙ§˜нЈ]tFdє§i#ЉyБ65O‹х9Ј9фІВ—и 'ъ”єOaчб˜чИшyŽ‹žѓ›#ЂЗЭ ећцњбцђеЭцъешвеНцве‰б§fб/uа,њЅЃ›E_FєUŽЂЫV‹ОJ'2&zџђЈЈg:3Ёvt'/-њѓЗкЭћI§ѕcщц§њQ|f|йЎЭб‘ћK™б™е‘б‘;Н™{ъїъ)*њ^ВLпмcƒšЇЧCRPђ‡Є!ИЩ:{šТNIџw §&9$zоєм.9 Кб\>Ке\=њmš3ЃkWwšKWw›+WЏ3ПZЋGoG6-zкЮ•бm]SКlєQГшW}‘Фц7ŒЎZ-њ*ЫТEjJє§—Хыcлњж3a§Sѕшеoп? Ь:жŠў~ЂvdюTз-ўЕкнˆОLdubsціcццtfєцFнЈ]tЦ#5ЇyQ§x‚Nj^Tљ™Џљ1Ктя!in@]IŽЩ:ўгМ6:чŒyktа Лц€ъFsѕшVrѕш]k^єнžЕЃ{Э•Ѓ›бпЏŽ.ыыŒmJєўхAIOmš3жМюe(њЕ›EПшЋМMєухбuo=GFWПw/РТЭгЖs1/ъGЏ~Љ<Ъ"Ѓ—ѓc;­ыj_‰ХЋ#Ѓ{еЃГž}б—‰Œ^м#Ѓ“>ћмѕшЂSЖC=КчœѕPЎ9kY=КхЂцѓCdєTљ­!/’voдйю_вNЄŸЖЩблф„ъFsљшVsѕшfsёшvsэшNsщъnsсшФцШш~sJєъеQOlzя?–Ў^ŒђjФ+Яƒ-њЅD_%1њИYєыtSуЂчЩНххо,ztй‘їŠЎ\-њ*‘б™Wbц>^цŽiftф‡oY=:щЙGiPtЃztб‘бЛъб=ч|Ч&5O‘п@ји<еоЄрђрЭ:&§Sмсю3щGАkЎ_нH.нl.нnЎ]нkЎнm§Z§цКбЭ‘бЃгК9ЭЫ'бUnхшўФ(\}t–­NŒ>n§:ЂЏв‹ Œўў‹бuнy‘]Й9ђ/ђMЫЛtftfѕшД‰Эгб›—Ъо'ztдSЂЏјyKhtЃztб їдЄш}ѕш SЇЧД­]sVbѓ4e]…™еЕї–€w—vРjоЉСЧ3„xИћОЙ~uЋЙztГЙxtЛЙvuЏЙrtЗЙptПЙnєAГшWzфEFпЋЇцРхј–nŽМ­^†UЫ›ЋV‹ОЪFЎkыжFFўешКŽЃ™]Еx ЮЌ>ˆЎ[-њ2‘бSшћ€^ѕшЌ'›E_GєU"Ѓ#?кЪŒоW:#2:ё3цi[=КцЌФцФЏz|ЪЌ^}&БXšПŽXёyЇЯœxzїЎЙ~є>Й~uГЙxtЛЙvtЇЙttЏЙrtЗ93КnѕAsйшG_^єіївб›МлЕ››ГcЊў@u§нЎЧы]йюФшуfбЏ“и|є ]ЕїSмдј№fб…ЋЂыVE—­ŽŒ­žBыШMБЬэGбз‰ŒnVnzъ]ЂG'иќбЃ{Юy‡шЬъб9ч$6'~еуSfѕю3˜‰ЭРкМјп_GЋfАwвqр9щЛф€шFsљшVsѕшfsёшvsэшNsщш^sхъ~Гш—к%D7CЂ›/ш9х>Јѕ'Х]жѕwЖj|щEW.o7№ЗŠ.НфqецШ‡вўœvфНЂ+WїЃ WDз­>ŠЮЌнvh—šWНxatзБMuФHGn‹Нй˜к›3?Н}Фц]єшžS›ЯM "‡:2zџ„š Б9ЕКѓЙQ€Шh`%ёŒвя“UcвчлyАєђчюЦeЛ<т8$znнєЬЎ7 К5ЮеЃлЭЕЃ;Э™б•ЋЛЭ…Ћš3Ђ7П–n%Eп_˜Њ?|4'ЧшЈgТ.Р/‰бiKнЇ~tсђЃшВегЃlsф^Џ93Кrѕ›EЎ>ˆV§bдЧŽ^a­ё-нЊЎ?дї…еgѕ‡muљKёSкњё)2К]=:ъЉШшVѕшЄч››wєњ››Я ѕ‰ОJфќˆŒоnVgˆŒn~S_fѕЃ{tЧЯ%6РЏ‘xJi\ђъ0иђеФШяЭQСГds–tФдž›FWk7зŽю4—Žю5WŽю6WЎNŒ>h.}дœН§WзБMLhюDЎzЂ9;FG=v~щG.?Š.[нiў~0:Џ­='Žє\љ§V7zŽŒNœ…:3z_НлЕЉЉ=:ьXЪДXkEзoпG'Œј6:bžd­yп"Ѓ›еЃ›ž}™їˆtJbsуО Б9ДZєe›3Ѓ3оею„WљЉФfRФžxКjр1ЧЫоъѕgDЏЇEЦYOцŒi=7Ў:жnЎнi.]нm.нoЎ}а\З:1:Б92zбМ{Н§PПyёч4?^[v 9+’fGzєTЙК?ЦЙб5ЋЇtбцgб5Ћп1zt^›шЫDFO™okЇЬ]FuФф~Œ†zї6+b‚„Н И‰ŒnVnzNєeо#ztа)‰Э!y[Ђ/#њ2‰Э™бSdtxѕшŽJl Eо™ŸGž(=oŒю9aйšНц€ъVrѕшvsэшNsщъnГшзъ7з>h§J‰Э‘б‰ЭгWмВВ~є=ю™}ЯL˜ЭжтбїКMlDєv„Ku'Кіќ}бW‰Œ~V=:Џ'Б9ѓ-bцЎGцўRЃzљ|]V;:­:b‚ДЋGG=јI@htЋztвs‰Э‘#юЂGчœБ'ЖјЭ‰аш€нщб—‰ŒŽљZ ‘ђЮќЬ;}7№ьyktа ЛцњбћфњеЭцтбэцкбцвенцТб§fб/uа\6:Бљн&ЧшДОишGњё@НNНП6дпuЫаъб­^П\аbPsжViљjбWiuŠў"ЇЧГъбy=Ђ/“и<ѕГGwKы§дh(œ‘[Н™б‘ŸdFНнZHlЮќ1ђѓкщ-ЊGЧœ_=КфœЏЬАш›ШъФцРя]}Hl EоAЅ'ƒ=o:aз\?zŸ\ПКй\<Кн\;Кг\ККл\8Кп,њЅоЉytзЁФшРЙёv?<И ыVП_tбъуц ш))њузЭkƒы:оfzˆўо1КfudtцќˆМ‡>2EОGЬмЊiVNz.q U_(2:mсFєe›3?FмFЮ9)2:Д:ёKТЊo•iб›ъС=чЬгЊzpЭЬ‰пaЪlОUŽр]хњxЮqр‰вѓжш vЭѕЃїЩѕЋ›ЭХЃлЭЕЃ;ЭЅЋЛЭ…ЃћЭЂ_Њ[е\ЙіІ]<;p>^…eГš3ЃЋV'F7‹~7Œ]з!њ*o8Ї3Ѓ3ЋGчЕEFgЎ™Ї‘oЦ3їё2wђBЋчєє^C=:ы‰ШшfѕшІчо$ztбyХT_(-zўў %,zОџНЋœsв=5ЈyК vд@Jlўи @ŒЈsl?ЅssЊ—•)еыЮИшЯвˆъЙgtиnsхъФшƒцКе‰б‡ЭЂ_чИYєы$Fw[Ѓ#GКtsф%r•~ЧшЂеЋР”ъM`^ємxy\йќшyџђРДОо.§dЈ†Н­LŒЎ=ЅV™!Э­эоБ=чl§:ЧЭЂ_чЂяЏЮkъqbtсцШ;ЫFW­^FF7ВGчЕѕSЂчЦыЃВŽѕ&CNєОzXзБШшюЕX;њKиHпЌK_‡K‹Ъкї–ЅGeNѓ#:Ј9хСc#2:ѓ3—Дk7Wсрšs‚†w!iVV <Х6ёРрэбЬ еЛцњбћфњб­цъеэцкбfбЏжkЎинmЎ\}]ЖњЈЙlєћtеjбљKkў ю=˜Vmžnу™3Ъгwь”UНъ ‹nV-;PПА!a`їіеѓуЏ5=ЕŽоЬ№Ёe‡VНўydжSѓrN„ЭяyWхД\“ТгСб%'|gцDЯMЃЋžˆŒnWŽzъMšЫGч7п~ѕдft3ЂћЈЅ-ЋcЂ—йAбЛ%dtЯI‘б‘_Sљ”иќ%Бј–wЌjт)ЖofNЈо5Dя›ыG7šЫW7›‹GЗ›kGПQsdєшЌC‰нkV§jѓAішЖ#‰б‰ѓ#3zњ.Œ‰ў ш[ZN№‡[_dєД/vфћ|ќ’НŒЌќ!ch7Ђ–КoY єЗяШЌъщ{эШœпћЅ$B|uPwиеxTИ\З›3Ѓ3ЋGg=Ёљ‘“czTEOЋЬ”шUuLєЂ4fzLA;yk‰Э9Л5[‘бгfљИHоСЊgя&sx єюь€ш}s§шFsљъfsёшvsэшФц7šЃЋŽ%6gЮш)tАЇvїшІч2Ћ#™ІШ‡гаш”ї.ЗВЏФњЙŸnѓ&Кvѕgр#3ЃzWYОxŠмшШ|oИ]52КЋGNtЏztжпIЭгЃ2(њCfѕДЏNo]Ѓ›žЙE&­!ћ›K§ш^Гш—‹ŒNнbšгѕгІE7ВG=ЕЌŒ‰^VчDOїа ц)юнЫMbѓ”Еv,%6Hlђх­xŠmр1Ч‰J?bsЂН е­цъбЭцтбяг\;:Б9rrd.Sц*=5ГG'‘YљœїY=­ž"ЌЋGзœtOMhўиŒ^Ь†i yўo,х›[бђ–хi5Їsњ;бЕГч^ѕшА#ЭQЎ,њBЮ шЗЮUu§ђFu§ёNœйцвбНцЪбнцЪб‘#9ЇП%6Oльб5ЯЬ‹ƒ˜шѕBJtо{ЎO‘бoБxŒŽ9/БљCb3Р(yТНxЬqтвїиœшХЧD7v/_нjЎнl.нnŽŒ]uь}š‹GGŽtjuоЭхVї•НЫKЈозDЗ„4o*{ЈзrNдКё%mЕл?^[ѕDЮ№ЎlГ3ўZs:5Кru/Йrt`ђ{MшбYODFOНЛUuљђФ‹12Кз\9Кл,ње"ЃПv>вЂo"Ѓѓ>“KœqзсЇШhзсЅ›Їиmоэ*‡вN„ <{7№˜уРЅяБAбЮ‰N<йНб\>Ке\=Кй\<Кн\;:БйфИLbѕуЦSНюЫˆоFF/ЪjЭ‡ъЭSkѕ]tBиЪ1uщвеНцвйћд€шƒЁ]v$1:qR4зЮœгqС›ћеЕг›бѕ<№RЬŒю5WŽю6WŽŽщЬ9§)2:ёѓ‹ШŽŒNœSш–ЭЎztЯI‘б‘пBји РлЫ;|7№˜уРЅПc“Ђ7Эб'Ля“ыGЗšEџЭцтбэцкб‰Э‘бцке‰бЋТШшUіШЊ'‰1Э_їиЪЩSцн№НVщЪй§шТеЂЏ"њ*o=Кь@/Иrsфћ№ў6MэєfuљOМ#ЃЛЭ•Ѓ#G:3К[=КыXdДOЎнШtJdєЖztЮY‰ЭSфЗ>%6№ўтпЭ;ц8№DщФЃЛЯпGPНoЎнh.нjЎнl§zэцкбfбЏжkˆ^ќ=-ЛG6=гj,žœљ ЙHG.нцЪеЂЏ"њ*Ђ/ѓ6бхŸ>ТЦјK'Кxzoz”Ў~›+Б|tфУiftфЦGц^^ftфўtцЇЁлЛъб='EFO‘бЋьб)?§!БЊЩ;ц8№DщРГЛOIO<~лœPНoЎнh.нjЎнl§zэfб/зiЎНќ9Ѕy]˜аœЙ6™?ѕ.УвщншЪеЂЏ"њ*ЂЏ"њ*эмкЭНgашвеНцАъ€+13:ѕm`tфSftфNoцžzчS^bsjѕГiК=<–<ф(xvwт)щчбЯ[ЃƒNи5Dя›ыG7šЫGЗš“ЂЇ”лЫz€CF:rvL™+оBFsЃАzђmhGGќP{щ(ўЏб\:ў{wЗлЈDa”‡­ї†3ё_l Є@Б9kiЄБ}ѕЉUнФј‚ГW‹>ŠшЃˆ>ŠшЃ\$њўYwзЏцWјмЭ“ъчgЭU ц›O^=и‰?žн]ПŠŒўЁКЛjЩeЂЛ›–%6gў0­ююY'2:ѓЙЯъю– "Ѓ‡gwwРЕХ=Q:№йнOI|}tїЌ1nNˆž4DO›Я§ZЏ7нM‹>W7#z4‰Э!—ёбŠшЃDFGžг?Ewg§nЎ6,њѕYoдЂйцГWOЂуІ:цfoтёёCuwд’ФцЬ{І™wЇ3˜TwчЌtЋцSdtЬE|*Б€х=Й;№yуЯЃЏŠ‹ЎЪ‹ЎБю n™iбOЗжАцЛшЯˆhуьшЗї1+:aеg›Я^§sq™\РЂh§чDEєQD%2њ‡ъюЊ3НiбЯšЃЭ5ŸОzд7еCLѓќљбЕ(Бy&КЛhШшIuwЯ:‘бЁеЉїд#Ѓ#GМIl€ЋШ{оxр“нЋтЂЋђЂП{ƒЂŸйїн-[мcГšŸ"ЂГvп]к™q3ŽNˆ5gЌљgtЦЄЬ6ЧD']ЧЃч›EџН EwW-ИPєЩЋE%2zОК;jЩ48/њіQwгВIrРJгфЄъёыS›i>єЬЉз]ДFbsfємaрен1ы%6A—–‘Шh€Mђžь^нМ‚ƒЂуљ&2zkЮл€пЇFRuеGuFњGsШ‚,tژL›Я_=з=кg–=л,zЂ"њ(Ђ=[ннД(Бy=d|u™4g-ѕєНќ-4mЊП_%4Я нAЋ$6ЋЛkжК@uwЬz‰ЭCж‰ї.Б€sЊю€ЭЊтšыІЛbЃФц!ЏЙђ†Ѓ^КK6ЈOн9ЋдXwа “ц„ъФш™fбЛHŒžkНбG}”ge`tфJ‡EGўНt…шЏїнEkLЂЊ#чуэоRPєи<юžu"Ѓ'ч^ˆШшЬza‡Ч›Фf LUwСfиœ]7н›дЛю˜•ЊђЊы б е“fម6‹оGbєLГш]ˆ>ЪЋRєЮ™YуyNGўщљ‡щОфмќШ]ъз‹шсQЕвЗAN!ѓnЭј‰vxМIlр*ЊЊ;aГzшюи ОuЇЌV•W]бUе‰буfб;™4GFw­!њ(щбї7нAk<:_ЭIбCоxМOIwащ1'z\нГNbѓЧ ŒŽК№yRwзЌѕquщŽй"n+fо­"WњKb3№џPѕя_uWlROн!TхUW`tU^u‰>F] К;gќfбћљ(ŒDящ1Шy3§ќ?&zxF\tк‘7$6g~mIч‡Wo\љ№Xђюˆm‡$rВ›ПDF№—ЊЊ;aЃКыЮиЄ*ЏК*ЏКЃ+0КтЃЛcжJŒNl}бGЉс+5Ћyx”fE?ЊгЂЧуж<<7bwч–8"i[ё&2рUеАQнuglRбUyе]сбн)ы%FЇO‡ш]UцЕхYн]БYb3G1АЈўщnиЈ*/КЃ›#ЃKєA*ЙК;cЋРdXЋК.ы?ТЇ‡q{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/8.voi0000664000175000017500000003601110513166224021617 0ustar michaelmichael‹8.niiьнMЎ|ЩзсгРБ K ˜#Ел`тжБhЕКmdїXka№&[щ Tо|;/'ѓЊѓfќОYЯcU§ѓоВфCq^ВЄј/5MѓŸџє›/гoџіџ№ћпўнџіПїПћэІГ?Mџrњпгџ§хЏiњЋЏџЌ§‹щ_§љпџz§зжџќЯџцџќлџИџ§йџЛќљчџіПљїПљнпџзпџЭŸ~зћ/Уўј‡пџfя—ђЏІvчДљ§џњЫњwџє—ѕяќх?mџ7џнxA9?bh>ё=ѓœ­љMr›УЊчФjбяЙ37ъФ;ашSішргЬ'Ѓ#ОeОђ sbtфHGFk~“фц ъyitЬГDПKdє”Й}мF{tЪ7є”yEМVЎјЎШшщД‰|’љltЦ7ЬwЃSž6FЯ‰б‘#9ЇЇФцШшДцЏаРшМНcNЌ§.‰Э™б“шїIlЮЛ ~IlЮŒ|?Il€_ЬgЃ3ОežУЊчЅб1OšчМъ91zJlЮœг'QбзШАшљњgTє)4А9mŠ~—ФшШ9§бЃƒž"њ}"ЃWйЃSž—иœ=%6пnPУ$66пŒ.љŽДшymtЮSfбяБmŽˆžnЁIбW9#}oLjОVцLщEh^tдцнЊєŒРц90:rvˆ~—ФцЬшЏћЅШшаGёФцЬшШ­)Бyљ“$Б†›ЯFg|У|7:хYѓЪшšЇЬs^єЖYєIО}ˆ‰О ‰^ІD/#Cцєbёх,ФнnаœнЌнєœШшЌ›М{_NѓДhЬŠомwЄD_RSЂ[;ошЄЧ’Ѓƒ–сЩ54Љ93њњЈе|•иМК8Il€сцГбп0пNyвМ6:ч)s`єЖ9!zзœ9вgчиАшsuDє=0hz\"Ѓцє~у§3ЃчщОЭЅ4піŽЌшл‡Єш{cdє”вМ~О ‹žз?MzЌ=Дш л‘аМъ)*њ”њѕW@ѓ2:cBЙWчFЮyвjzŒŽyZаДИKыe“xЃљЃОkžƒЊЯЉѓœ=ЏЮyЪœYНЈЭ‰ўrnˆОѕ%Ms`жœожŠў!fб/ЗиšcЂЏyiбЭ-otзЁeddє”=7~*k“бМлЈшeѕШ gДЂGі<'dУX V§У"Ѓ3Ћ#Ѓ37”ћЄШшЛЛ­ШшˆЛЛ–Шh€_‹љdtФw‰~—ЈшKыœ}‹MŠО‰ъ›ˆшkрМ24щЁЙmtжБФшNГшWы5‹~ЕK^Tє50Љyк„FFOyб‹Ёнu(pыXE‡Lшis'Н]†Ѓ{ž’3‘—вЃsЊ#Ѓ3Ћƒ.* ‘е‘б™Г:~Џђ ‘б!7џ;‰Эгэ›€4‰ЭР`sкЙєѓТш–'ЭЭ™б‰ЭСбе‹Ц˜I=ЗŒŽz й\МКг,њеЖЉб‹_Œ;а›хЃЇfћшВ—ОМцeg\єЊztй§œЈпМ›Ы7y­НЎzs'ztе‰ЭБ O;ошЄЧЂцХUжlОЪV§“Т6щ бoјЕХДЌ]ђ‘бЯ†-‰ЭПHl€ŽИУвч…б-OšчИшy§&iЭїФœшэЬHˆn5—ЏnGзЎю4—Žю5‹~БFІшŸpэЫ‹ўњАљ]љшeeк:\Uю:вихтЂЗKВІ]t§qўЌшбYЧ"Ѓ?щ`tе›иˆц§%1Ё9юmЧYduжМл9Ю"Ѓ?b~ŒЮyRdtу™+AbѓВztЩwDFO)7x[‘бЋwcp•w.§М6:чѓжш 'ьšыGя“šЇ}їшІGу\>Кй\<Кнœ]ККз\9КлНњеиЎ#Э‘Эˆ~ц—…4ѓŠGogFФ:мЎТ„цЭ†wџytзЁМ-zЪМ„‹~›ШшЬ•љЈ•]џІєj_=Кш ѓЖztаSВІѓХD‡TЇэw_DПMbsѓ…M€ШшŒЇ№ШшŒ—;‰Эг9{tРЧћ:T:ъ<ьyetЭSц9.z›НOЎнjЎнl.§9ЭЕЃ;ЭЕЋЃЛЭЂ_Ћ™šнќ82ыаrLяc]Лy=вІєъ‡вХ§­ctзЁРэNєEFGо—fFG>f>ˆ/ЂЇœшejNєОztаS6dtЮsВсEzsLuк&§EєлDFGn™б)o6›3Ѓ“юJ—"ЃПВG'ƒew|Ž :Yњ~фxЬyиѓЮшЂЧіЭхЃЩхЃ›ЭХЃлЭЕЃ;ЭЅЃ{ЭЂ_lпZ?К;ЮЂ_ЋS[КЙ{YIˆžЖљЃЛŽЬЩб9‹p§FŸ=:ыШшШ'-бяН{ГНИ ŠоWzЪ&ztЮ—ОЌex)ŒjО§&YsњBєл$6gFO‰ЭSдоMtєшŽя‰ŒЮИ-mHl€‚цИ3šяЙ1еЫГнCЦzоєPЃЙ|tЋЙxt3ЙxtЇYєЋѕš+G7ZЫGЗFИzsrŽю7Fю:’иЙнEF'ЎТЬшШщ1ѕВGW="њ]"Ѓ#ŸiEПЯ=5#њœwO ‰^W'EяцѕрЌcшСUЬЭъСQ] “šя"Ћ#ЃЇШш)*њж˜}ЋNjО§&‰ЭббЃ3О)2:чп=рз&эИуyitЬsцМцUpFѕм0Кщ‘VsѕшfsёшvsэшNsщш^sхшnsсшVlѕцOшђЭvŽwIŒўЈ]К:2:rNO™wx™їв‘-™‡Ђп&-њ+/0К]=:ьШЅ//КY=:ьШ-№ЂGwЛ5OЗТЄшщ}“_=КхЁжД[є„{cNsЋzhЮ“n‘AЭw‰бIГу&Б99ztХw&№+tКћХМ2Кц)s^ѓМ5:ш ЛцњефђеэцкбцвбНцЪбнцШшбaК\ЙљЃvЛве‰б§UXИZєлDFgо-eюд™бэъбQ„EŸг"Ѓ›еcУŽ\ђ>%ztйЙ[=Кь@ttж‹М[ шvяЫižюo ‚šяЂЂoYе­Ѕ8:ъ‘ц2:ъЁ[ddє={hЯs"Ѓw;ШШ–я Ž]ёM‰ЭSb3ПiŸjГŽ•žзFчˆЮЌv$2:r‰МЧЫМ(ІEŸЫВЂЏqyбїWJYбЂЂGЇѕнњ‚šћбЃУŽм ƒЊ#ЃяtУЂяŸ2šO­З1Эїw2IбЅ8:ыvѕшЊ‘9бЫoВrЂЇedLєДhŒi^JlŽљЊv%Бy5П€žМcЅƒNJП8Зц4Џ8­9#їdžѓЂч†бMДšЋWЗ›kGwšKGЗs#Ѓk‹›Sц"ŒŒюэЅЋЛб•Ћћб™еЃЫŽdVOлдРш‘NлЋЯaiбЗЧиœшэв ŠюTŽыЙѕEF'= EnыZЦ4D.;В(ќ€шЪе‹ОœшХ;™œцщzЯ4­ЋG=сTи˜дƒЋш,ХСUЬСеЫЯбгЊ1Єy=…DЏпŸ‡4o$6OЩРЏй<Ї…Н<‘>Ѕњ›гŠ\v`вМЙ\‡TЏѓBЂЇишцєѕШ:1$КПŒЭ:іCНЙВ—Еh\н‚Œ­zфжИјЃ|є>6 љњЅPЦoDFз~йбБw"ЃО]Ј%у є…yetЭSfЭoА8н=Ѕљ\yЫiонєHЋЙztГЙxѕОЖ~ucˆЫGwц†шW;h.}д,њ…›3ЇєQѕшВ#‰ЭSц­Gы‰Ѕrѕ5l]yЈoeIфžн­зЖ]yQбъбymёб'ХšЃGЧѕЌћ2š7WОЈшѕOЂФмЏXѕШК0ЃyГLсб е›cЂчѕ-ШшАCЗЦѕЕЅvєдŽ]ѕШІytЮЗ$GЮјžШшшъбп=‰~›Рd %ю<ьЌCЧЯ4ПСЙ2+њZ™=ЗŒŽz й\<Кн\ЛКз\9Кл\8Кп\7њ Yє+5‹~ЁУцЊб‘S:sЧЫМцнyœУЙ…ЃЏeЛшЪC} KšЗДИшнmFєнЉз–нЈ]зБЬKižVy!Э› _HєQѕШЌc›ОЄшцPЬ:Ж-Œˆоѕ”Нй­ЧvЛ%оџБЇћЎ—д|ъЄцл3WPё—Э­щшœoHlо_Ы[^XFЗ|S^єœ9дq“њ,2КђоЩ№гђŽX:tќ,=9#zо]єиЅ3)z?ЬѕЋлЭЕЃ;ЭЅЃ{Э™б…ЋћЭuЃšEПвQГш:l§J‘блєЉ+ЎyюT;rЩЫщщU} K‹>ЧFЯ‘бъбymсбA›ѕ2/ЅyѕV7Ѕy§*:+К]=4ьа&0*:Ћz˜͘ЛopйUєњ‰`tкkрv›Ўм|ъЈшж—-х›лбЃЃjDNzЦюEТш Їх%/‡ztЫГVз•б1O[­Хб1ЯK\†ЉеSdtтПОє%Б~XоaЅyЧТЦ9>…HЖmЈо'зn5WЏn7зŽю4—Žю5WŽю6‹~­~sншƒцКе‰б‡ЭЂ_Hєл$6OWёSXT№ЩW\кHŸ…UŸЛВЂЏmбsdtЏzt^лН.2КU=КЎcгМŒоV ;ВъKЉžЊ‡†кє%E‡UЏЗМХo*GпЋч]ѕшДОuєђ*3КьР&:aJO§Лгб]‡:бЃГИDfEO­‘нєXужttвГђšчˆ‹Ъкj)ŽŽyZом8ЩЌžвЋG—|KdєtЎ*Э;`5№єюyktаvЭѕЋЩхЃ›ЭХЃлЭЕЃ;ЭЅЃ{Э•ЃЛЭ‘бЃУ$tПЙpѕQtеъУfбЏsм\4:rЄ3тaѕшДЩ™—ёOЋнеqnЫŠОЦ%FїЊGчЕныђЂы7O‹И˜цeє”Q<­ЃcЊз}!е‹uxџБzєтЛŠн&2Дыа­ЏБї NыЛѕЭЛъбi6быAЏj]rœtЊGgЛ4F tя9`tе#ЫхнИD lž.„[yЃ|:жљƒ=:х;›ЇШы ~ZтЉŸЗVƒвгNžwF=Жo._нJЎнnЎнi.§IЭ•Ѓ›#ЃЛЭ…ЃћЭ…ЋЃšЫV'F7‹~ЁШшШн#ѓт’yџДъб]GЫАjєqsёшЈ‡ё{\dtЋzt]Ч2nг[Жљ(КЎUaJѕbJO1еыeИЪvр–ЗлE†fлД.~YИњжЗркЭїъѕ]ЛЙ]}rœфF7nѓFwktёшЉ}k:Къ)йбSLsкŸФЭ‹/yгљ$Г:ŠŒNљŽФцiЪйЃр}ЎЇ~§™woрЁуЛф€шFsѕшVrѕшvsэшNsщш^sхшjŽŒv q ћЭ™бeЋšЫV'F7‹~ШшШ9ЙхM™—ФЬ›Иg€s[Vє5.)њ=ну–ЉЕ›бЋБОП…Ќh9ЂхЇХеЊ1Ѕz1ЅЗЄЎцŒЎ^}Ылm}ƒУ­ЃŸGF=В›ЃƒžбКЖдЗЫнЛ‘нŽ.žн‹._=ХEOэKbёш/сб—ФГэ'4Чм•ЎЅЭцГЬъќ)2:х;›Їкя;`МCVѓNТ;“ўЫ.9 Кб\=К•\=Кн\;Кг\:Кз\9Кл\8:Бйфx“~sсъФшЃцВе‰бЧЭЂ_чЂwџFчuWЎ;6=Ю>*ztWЧ%­3­GзЕнк–ЁблъЉts/zЊмКtuoЄЋWOyб_›—W—˜шѕgDяfE@sкё*m žeVя'v„ФцЉњKрyy'УЦпн8u|tаcЛф€шFsѕшVrѕшvsэшNsщш^sхшnsсшФf“уMњЭ…ЋЃšЫV'FЏ Ѓч§ИЮkKŒо7DяЂПєЋG—щMыб]—ВЮPŽыи‡n(h:-~згоћяЧІѕ5†wОў“‘]‡ж™ЕgХЭК2ЉњќчѕЇ€шsѕzjNzJљЋЩжb‡ ЪоьwеЛ+wBѕ%sžЃВC}йOF—huљё^nдIеW6ЃУ‰ŒNќ>Ўљd;Кщ‘Э№ЦEпЊG7=–5™ЏTПQdtљ7KЩ'yХ№ѓђNYЭ;„wоєи.9 Кб\=К•\=Кн\;Кг\:Кз\9Кл\8:Бйфx“~sftйъEaNѕ*0/z>џ8е hЋшзkOсШшЉtѓt]~эЁзuшЖ‰Ў?;nn• Sњіan{5ѓЖzк~.hnUož–yынЏnѓДюЫhžЖ}Щг­К~шZЦ”иY}+›=#"ћ>ЅƒЊзз“хЅfpиЁFt§нd??&Jdєзќh6WŽžz]:z nПбѕРjxCЂЗs"ЁЙ]=КщБЌxЅњ"ЃsvшЕМтГФfјayЇЌТ;Яqблф€ш}r§шVsёшfrёшNsщш}k§шо8gF;˜9Ю‘3zЛa$EЯS#{t[OЛАxu{\kGw&CNєМћѕИЎCНuW9КЛYО}hЬ1QмУ–‘Е—с"uQY§к2ЏЋ—П,лМмкnŸЊє>КН—дВ™AбЋвЂ{7"хlЦ6!9ђЭю”3‘—rіŒ…]єmџvdНўVыqtкЙ§^Л:2њЋКй\Н:ЎyЪќю"3zѕn,%z=КЭлїyбл+bDsцН^juїUdm‰ЭSЬfЗ˜|’и ?-ю”еР3xO;žwF=ДOЎнjЎнl.нnЎнi.нkЎ§AЭЃГ%Žsdє=0.z^.^нзкейP:К7‡УЂ—г{`иЁmєj+Zжwък єљcхц}Y§К•VНЙ9s3Ђo+pёЋњбsћЎit\Я­..њі!(њў)(К7вЃлКZГЂxђСЛАЈъХЏ‡vjO‹тЄ79ЊGOЛя,ЪЏХюѕАvєј^ЌS,њѕ"Ѓ#ПX?ЌЄ4oBCЂлеЃЃŠ›б_ЖХ Элъб5ЯŠŒx‰з˜|]ќ‰F‰;Џ4я8лРУŽ?р$ь„шЦ‘ухЋ›ЭХЃлЭЕЃ;ЭЅЃ5ПK^ёtъKЋОєEE/ гЂчлOCcžдйТљнЃђщnаб‹.џ`pкЁХŒ^ЯMпБпэ†3aЃоХХDїЊGE=Вн7"†КЙKgD‡=!ЮЭћЛшЈЗзДЄцУ…8К­яЂWПvЄ9Ме‡К9)ЊGOћKЫъQ ЈюѕАptфіqP=Кь@dtПztиЁegJsћеGѕшЭ‹ƒшvѕрІЧтжс—mpBsвЗK‘бAЛнJ`ђIfuаЛtxЋД“?ѓГ <68юьжљнЃ‹KКе\=Кй\<њSšЇтЭ‰ЛнИнн##ЃЇ˜ЛЅѕи&OЎ„я“[}§3&њў@Нъ ЉоєeL‘M]ЦjмЦ%T_тšл^ёшЎбymѓўюЎ~єeЧ‹Œ{Fм_Сы7ЎФбm]лЪМшyѓЫЁeZSЂzsГ:/:aNgFЧ]УПDFЇнxœEFЏgcЂWsdє”НЙ†DGО:Mќвх$ЏјKdtЮnЗ–и<Х|QД“и lх ›woтЭљa‡TGFяЋG=%-њ+0Ћљвг{rэLŠОeцLеНFVѓ54ЃЙqMЉпќЫf——Ноъ2ЂЯ‰aб­ЙQ>њ^™}ЯrЎ-ѓэRxљ#!|О_SІ˜ЛМyu! YŽ5˜=ѕ›ЫF§-,њKdtкœž7ЭE0/zП&GЧѕД†Ж|tkFФEЏFЗuЕїкЭЁWбo“иœv ПXtцDOЫܘшцЫо”ъЙёCey+ё$Бyg!2:ч[ЂЕШшщўrр§ђЮ…Э;68яHщнIиЃ{ž‘zwNѕt.ŒЮ9У{Q;elе‰s9q.KSЂƒ†їf3+Bђw3:ЂЛY];Л\;:09ВYєЛЬ‹[бœ'—хХ;fМ#ЃO:ЩЅЃЛЭЂ_-2:юіc=_яќЏ?4O›ЦŒшmfbtфH‡Dg^Z›3ЃoK?ъ]ЭшЈ‡юAе‹ЪœшеKщДъљўВ7!КЕG'=!Бywg"2:ђЃ)у‹к–ФfрsЄ ›woт ЭсaЧDŸeVO9бЫФцЭTNHо-СњХц€ъFsљъFh§ъц@ю4зЎNŒю6GF;’WœЙuDяЏУасЎ]8?"'udtфєШ\ˆ9б7х›3ЏˆЂпцУЂG—HlўЈg—бU&З‡ztгcЗЮМъћ'е?hйљ­Ыцћ­цА­у&2:i Ў$6№=yG№&žаœwzїIdtфќ8‰‰ОVЮЗBšУVсОЙ~tЃЙ~u3КxuЛЙvtЇ93КruЗYєk%6Gnw]КМ?Љ+WGnд‘б‰г#qN4‹~ЕМшkYRєЅ-l Їtdtф6y=ЬŒўЈ7ЃГLЮ|ez{‡X}§3ІњVWНЙqє„elpѕш ЇЬыьб9ЯJšЮw‘б1_еn%6№]ig№F“~1‹~—ШшЈМчб=Яи6'DяšЊЭхЋ›ЭХЋ;ЭЂ_­з,њХКЭЂ_Ћз[Й9ђКвЎоЎ.?р+ёƒЖкбЭeЃšEПTdєзU$А9r ?!z*пy=ЬŒŽМ]Š|ар*-0yjюzѕ]:ЋЏЊўYїд шekNє4o{tЯsце`ЎyVв\ˆŒОя}a›јxG4gю~6'FGŽєt;Ž>ЂyžуІЦМ5:ш Лц„ьVtѕъfsёшvsэшNsэъOj§bнцИшЉvsяbX:К71Ju'КјЄю/Dб/uа,њЅDПKbѓGD/~1КьР~tЃš3ЖDПЯEЎz$0љњ”}}ŒЋОќVН"Ѓ‹žАHЭ‰оWzЮ=;(z=иЃcžД—"Ѓ‹Пw€0yЇ'ю~u §]dєtHњМіџлЛЃфдq- ЃЌц?†л˜Œ-@юоўЙkеЉS O_Љ6ЖЅ<И:gHлЈ.zoл|ўъ^ѓйЃЛЭЂџ^Пљме‰Э‘бЯšO]им‹>§ѕ“%>uѓ“шФ•>ћP?Пxœ7њEГш?ѕmбеiЯ}Ytuй ‘б‘ІЂ§ЌК:ы5б‡IlŽ<0ЋЇЧіъЂзШДъYм„ќœtdEпSƒЂ7ее=cюs§Иие-у’Цy!2zКнh€џSyЏh~vuУ~9бmЅКgФК9Ёzл|ўшNѓщЃ{Эgю6‹ў{§fбюIѓЙЋПЃ9рйДЛТ'oю?(|ЅŸ-єЉЋŸMtVtТхуЫЂЋЫ^јЎшъАW6ЅЭ‘OЂ#њ(‘б‘{ёШ“šЬsМiy#Liў'xў/,њ*Џ:oЈя;йЈшћў;)њ›НЊЎЎЖ‘ъ”=Ђжј.2 NфЛАпрјBњжrЊлZuа€Ms@єЖљќбцгG?†ІE/Ћ‹›ощ ЧйЃћЭ™бЇЎNlўŽшŸЯЊГ^ъ.pXє§ЃъАWЖбC§ь{(њЏ%6Чe:Ёypщ˜ОbЅENфеуЋ–К:ыЕФцЬ“šЬГЧYdєR8еЗвЈшuuuЮ [lTєяbgE/FЄКd—А\Ž”ј2ьАзЄ_Д–ѕFњЖT3Є­TїŒX7'DošЂяЅ9бџ$.23ЂW‹›н–Пж&НЕ§Šўˆ~Гш?—им}ц‹ОRнѕв“цSWo:aЊŸ|Oнќ4ККыЅФfᇉŒЮЌ}”Шш~uuд;‘бНъъЄ‰ЭSo' В:1z.ЭЌŽи.=VWзŒњ‰ЭŠО-vXєЯŸjУšрЋЄНл§ЂЕАъЖPн2ЈЕИшжђЂ—Е)бПХѓПАш ёи&‹ўˆ^Гшш6‹ў{‰ЭлшљЃъЊ7КЭ'Џо EТ|JdtцУGђгGTrи ќWvuuЧ>бее{eVЧьЕ€џЊЕVАSЛЊЮиЅ‰>JZѓнЊ[†Х6OQЩSZюUfѓтЧ”ўпЮЄЏb{T3FєQD&?К:fXztuЪИФцЬxжcЧ]dthuф^р"Г€?дZЋNиЉЭЊ+іŠŒŽ›ŽKmXђмЗЮsnVsZ.5ВО‹злJднЅ§мСЃГ>D&БYєq›я—ъ,‰Эyћ–ЋШh€/дЊ8-Гќ[­%]Aк5WєЧЕkuVєЕК…FWwь=EFO‰Эq—рcZuРПYнўQнА_dє |ТџЬybq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/7.voi0000664000175000017500000003332510513166146021626 0ustar michaelmichael‹7.niiьнMŽ-л™зс( …%šYє‘Јiа1Z%DйШХcЉLР“@L…мЬмёБVФЮkŸ\я?Яѓиж9;тJўхђ+"ЗёўfYк?ќщ7я–пўнџўїП§ЯќЛ?ќЖ§юП§юЗX>ќiљЇЫџZўЯ/џY–Пyџзж?YўљћŸџ§пmџГїћ/ўїПќЗЧуўпэЯјЏџ›§›п§—џєћџјЇпўсOјУџ№ћп§rцŸ-§Юewќўy{ьџўyћЯ§?џћ§чПњ7…rјKЕйŸе–іfvЦgД—|ž]ё9‰Э‘бoЙiЭќЌZkГ>ЋЕЌшv7;фZ ЌNl^“Ѓ›#Ѓgw|ЦGnVѓ’U{#њЋDFАгZ›№i­ЅUЗжмžfЇМLѓ L~FЯюјŒфfб?и-7Њ9іqcvУЇ‰ў*‰ЭiлЦh~NэГ>Ћ}˜ё ­Ѕ5З–м<ЛфuЩK`rтІБdF'NGтU}ЯMl7oDб_цDЇќлЬŒf`’жf|^{3;тsкЭьŽOh-.Кх5чGѓ˜й8а‘бiЛн[fZѓл#]RюMдпdЭХMи4ˆŒŽœФцэюѓl:ЃЊ7šпCЗg…|JШтюФ ХFЬИšНDF@ ­Э.јМіfvФ'Е–WнZZukЩЭГK^ќ&)љ”МžšђКфшЄ‰Олlхя‰mgvд…ЗТ мYЕwЂПJttTuмжБln+ђђёЋUZђUfNєН­žнtэ0ЫЭQWрJfuв5И§&ГрыДйПF ЌnяfW|Rbtkqе-Џ9-ЙЕœт{aPђ!zjЫЋAЭйбћщ(П‹~џTЩлrя\›]uiœPиwч~—иœНвQеIзпCиОёЎЛуoOlоlЂЌФёшVЯNК–Wќ&2z—=;цe‘бЗпdуЊпEFРЯ­Н›]ё БYйmх—OГs^Г‰NYьGmЫ™ЁШjоLGѕфG^Nђ3:Їxyю9ЩЧшЙ5ЏiЛшЙ5/z„юКtџНt3вх§#ЏЬю:wь­пмžu)Бy J}§UЂfљ&э|зл:Њзїя-ЕЃ›п$4Vzvжб_&Б9є)Џ{{ЉяQдМ<љЮЊО‹Œ^"Ѓ(ЇЕ_ў§fvШ'<šƒВлЦьšз$6яЃ3В[Ы[ыЈф{^Pђђ(ЬIюEЯэyEлGЯЭyЭ3єа\іx–юКђЂяЃлюpQyћ;Kэцnoљц~ѕьІK‰ЭшйE/ШЊНIlN_щœьюUX=›Вц%NjоVOю:uœ†њЭ‡ш€сXѓ§ќrvж…§6НофrЂзгМљ56'zѕ•MТ6§АЛЙЬLљU"Ѓы~№WакћЫшЃоьоf—МюН62zЩЪnkГc^•нZPѕ=/(yyц$/э=7шЧшЙ=ЏXušЫі?CїЭ•W}]Йy9ьЯЯyсцcu@ђ2Јžu%0љлDЯ.zA`ђ>zvЭ‹К;геыЛлtёшРцmfFєqqы7Ѓšб ЭуЫpvзЉШшЭзЛе›ХЃwПf4яОN‰юUOэyЭІ3ЄyY}yКћ{qыъ‰@’ж–œЗКпДГ3>х=8-ћН6,К=ЃsЊoБQб-iЅяэy–~ЖЇЙEзк1znа к1znа+žЧцЊ?@;DoЯЭъ:їHн/tёQi[ыc“ЫЮД‘йaЇђŠ—~єьІk‰ЭЂПЪ7щVї&~знђŠGš+W›ыF6Ÿ$Ч4/ ПuѕVЗzsчaКўBƒшЛ`@євvK›АвЧЪˆшAѕдЄьз6"њА3GD/ЛеM‰^vK=Бф3b–w#2ОјІєжЋп‚гЂп{г–КнV:)њ6аoџЊяоxП –њбx_щŒцMt@ђъvвmЎљКПЌAЭћчџˆцv83-ьд№Ђ+мМєЎУЧёIEз†;Eсц“шIAЏˆŒЎ'щКхfEпї‰Аъ›ШъШшЬъШшвЗюБаъйплъ…у)o–nnцЖМ,?њЃКўKгЗб#гzЮн'т§~№ы{^q mншЂУнЃЅIбиAsЭЁ>‹ЎМ{tЋK_Ц1z8.…ДБйicп,zvй‰я=;ьLbsztяcQћШ„ъNcљшўКжŽЭBхшёќ–>нрšwНdќЊЕ;5Љщвitеь“шТK}r!f4з­м‰ŒŽЎ^Ъ~—дѕXтДЅ~ќ%ЈњўgRєCdudtfudtnѕь€W=_ЭœђŠцісўїЩ5ЏY7ЇDЗ^tѕєCtЋ§ЮєћЊЖudkЛЕ|„ѕыVЗч(tkFЗущ)Y"Ѓ—ГшЊ3}R]і:|ГЏ>›—:іWcBѓЗ‰оп!ыщ­o^t‹ŒЎ?вЫ&2-zџЙrt'1'њъX%ƒY(=œпКбg;E@s'А~sЭТЃ˜ЛпJ§E"Ѓ#g:3zѕ„‘W}ћль˜WmЂГЊ›ѓЊUjNєВ§%kfЩЏYYY=Лсѓ›€Пм§ЭЬ9ohn­­Ѓ#Њл*њЙфS“ЎДvˆnХЧЄЕ^єњ@=эиXОКuЂSLыG?ЯMъ:u]їRŒŒ>Љ.;ЫaBЮ–Об_ЅŸšНм<’ЂSЧ#Њy9Пйr, ŠО:VIПЏtєp"Ѓ ?.nѕ›kvdlЩ[!ї‘жђЊїЭб‘+-њыЌjsЂwпЄЯЎyеj.rЊЗб!еы+0&zНО9KНь~3œXђыDFgVGFgVGFчVЯN€xЏ zkpћpћsvЭKкнSнVЭ›%ŸvЂѕЂk/ј>2!К"ыWЗcєR>КГв›уѓТNЊ—Ъбчk=/ы\;3;nHєWйwЖ%/КЕЖ$Fз_щГц„шЅ_ЏЇн=:)ъмpM GŸ Bйцѓщ­пм ,АЙэEьШ{‰бЛ{_DѕО9ЂZєWYзЦDoŸ”RЂ—ШшЭ“\ZѕуЏ“k^ДОГЂWŸѓЊЭN—T=јPйў щi!ПZjДъЏY]ѕ ~Rэ&ч МmovаЕCr§№cl§ъС2—ЎўnЭeЋ#Ѓ3ч#3zWН$FGЎtHЕшЏвo­нmЎОвыиCїьИсјж>ЙцЪFŸюE›ЯЃ‹ў‚Б#яdмFЖї“‰бЧл`€}tBѕЁ9 Лл\Н:2zй†&GЯŽКВ‰ˆц§D„DяF"$z‰ŒоЮDJu~tRѕ№S]лЪ”ъдшЬъй ŸgЉПLdє’и РЫТ^ОлžRвзЩЫ§ЯккЦуѓьЌ3mhvйа8ЙnєYsйшШ•>­ž6И{|‹ш%ЂњdІыV›шЧ‰ЩmCух­[}2 бНS‚Ў_s‰Э5Ѓ6ЗНˆy'у6В3кщ*nЯ•я*ѕЛ;ЭѕЋЛбеЋћбЕЋw‘бећˆˆ>TFTGF/ƒшЉM—і• Э‡яћ#šk]Пz?Хб‡Ъ”ъ§ч€шНŒЅо‰Œ6_&2:s>j~щР_E {epл›tэY“}XхњйжђеУeNžн6іЭЂg—шчF—_ъя]Зњ,КlѕА5)z{f^з™ГyˆюћњžKэМЙІ„}b/bsлЩи‘ЗRю#‰бУaeНшђй‰Э™елвънъFT&":Кrѕёк‹ŽŽЈ(hP}8PЙ:2z9ŠўQ…ЭЏЂпЦDDФFЯnјДШшК_”ž‰Œ^›јЖ"^‘ОбVfЗМІm“#Ъ[ыUЗЪЏin{ЋУsЫЦЭышЊеЧшб(=ЈЎн|=;mLєWIœщГцВеуܘшУЉIUЮ†ЁjєљќVlnЭEь{‰б;ђVЪ}d#цюЗrlшюGЯŽ^}žuсy7М}NЈ> D@єqŠыGї.Н ъУЁyMз†еѓ’ЎE.ѕ8КpѕItнъГшњеЧ#…Ѓ;зшфXПЙѓНWHєёHѕшуз^ бG‰Э™бeПо=]ђ;i~Vq/РnOГS^еђšлАЙюOpв\vн[Vз–ЖЗ=3БьФ!z<.u$6‹ў2УиТе'+[Зњl"Ђ;''НрќЊЋВUЌФlok‰б§НЙИoPн‰.пнo.оНШ>DЎ?Tэ>.ью'˜—vЂ-Лшeї#Lъ:wск§ІwйUюя1е‡ƒГŠ^вл•cЃKWчЃruїЎ]МКџЈ‘ђјq}АёLŽюB§шоWО93Кїм\?Кѓ]]§цб_&БЙрwв$яЬяЁпKNŠnушВ?FkуъВ‹піЖЇц…9DŸ-}пЏ9%z{j^и™Г…-[}: EЃ/ИbsТEЗВSl|‹fб?ЦБ93К~u/К|v?КxјО3"ћ™АмЧР„1iЬЧ‘ЧЇВб‡цukйъуl‡eJд•Юьn†eBвЅvТП_=єv‰ђен­-5Кtuџ.RМz]ИzpПЎ]=zШ(]нп>–тзтшДtєhJ7жДіB/§'ађб=‰Э™б5Ÿџ€(я•ЬЃЗМжђš[‹‹n+Г[^еЖgЇD]iCKн—МЃ OЬ7‰оœ™™6vЖЎUЃЯg!!Кsњы‹Юe\s;‰бпЂYє’}lЈюEЗэљimCншuhѕшнћЧ™y}ЧхнЈиМš35ЏЏS—P}ќВc5EЃ;паьЎЪIYчŽSАН*ЇD]щŒюІzFгЅгшzПГ|шmUјЉЗI”ЏDзЎюоDЊWїя|ЕЋЗыК7–7ЃgŒвеУЃ€ъСёЏЯyЭ№aЎpѓxIKGЖЗкбƒМкЭ§‡ЙтЩ}‘бРOІњЋЏ;JП‚ОЋЕс›щЫjyбmevЫЋкШЧйЩu}УцїюЊ‹Z]4њЊ9"zrRжЉ‹e­и1 [ѓЛrбm%6ŸE—эOGсeПŠЎXнinЛs3ѓњzбхЋїБrX𾇈шу‘ТбЫEєдОЎgєњPёшeПаЫхsj Сб‡#›П”s\ачч ш%2њљЋlешо3шѓ@бцQѕЄ˜W.uUН§Иzuџ&RМz]ЗztЛ.]=|ЦЈœјђšEFч rѓpIkGђŠGž‹j7„Ъ{‰єшuщ…Ес‹щыj-ЎКЕ]t@|ы™uЁлќ Џ™?Ž~ы.КшЇ“в<ЛчqWрђ]šыWїŒТЦ;]нє‹цšеп3К`ѕusСь}\\єс@@єёH§шу‘ЊЭяOЛДњбoП“ьгъGwО8Hˆ>~C]љЫ›оzо?—ю­чуsйшоzЎЃg$Нр|ЉЇ$Н`МдEП[zsВдuѕЇКvuog‹Œ.МлНмјъоYоŒюжЅЋGq‘бЕЧzWИyМПUn.iщцђyLUњЕш]УївжZ\u{К}œ]t­uЬnКђMšЗч'uŠ[хыuЎ(БљЛ\„хЛGЭЅг/ЂkV_EWЌNl~%К\їnM3VћP–}<нЉžизе Ћ§Ж5ьУDџш}ѕЌДSWбѕЊI:†ею„нŽTm|­t;RДљЙЈ‡Ѓы?ЋyЎщі`[-Ї?ЯъMЏGз4˜нтеKw—ЈКqмєnфKљъA`е;ЫЭ ЏvѕЈЎrєјЃpєЩдmЎ>Н#‰ЭЕч€й_†јкё–ї‚їіpћ4;шэhvв%Э_Cѓзш4зЏюFЯ4з.?.Z}оœ]В:ЏxйD/ћavлаОА].ўИЌIбCЗƒѕцф<КшpїКЂ—C—ш пU,ѕёh­ПІЯ›яcqXбšK|гшЅь`ммЇуxИpѕ zЕЏT4ккъюгњuХЋGq•ЃЧЗьКЭеч` ИzvФЇ%6wюу№!№оoJoЛwв'фЗЃйI—4oв\ОКл\Нz]:ќЄЙnubєis\єьА›Шцe™Нџ\Йњ˜}\ыr§НuнUз[ѕЗ У0TпўКY‘бЧъIuƒЌШшЅrѓсоВ?ў~sŸаuj•жП'uzЄэKG/ЋшЮёве§шŠwУwЯ•>џsFд•бQt? чЖrє}xЧ‹zыжн;–KАлWxЫ{3ЊЋ\=О‘д>}œ+к\§–=˜МдОтЦ"ЃkпЕ‡›тОT:ёуowowГ‹ЎЕŽйMWОKsѕъ~sёъQtхьqsнъФц~єЧ‰йiCaKќaеНЭ ЉоGFFGTыWї s]эш]xћЋБмВww‹ЭжWpVњ[\л›T70шЪˆо{Нє—КрeИыœ˜TuaИ %чтfн;QВњ™6КЇd]E—Ў†u/Я".ЂkŠŒ^#]ЛКПунЯTЭ~ђшц•н=–гЭ­nѕщУ\бцкї‘ЁРфЅђшž‰ŒююгѕEF@_рыЛпюоZ\uЛ{~š\t­ѕЬŽКАЈ>Ўp§ъоX„5g\Œq—рвн9f']JмэЖл[JѕЖ2ЃzQ}HLЈ>жЏю7‘b?@wYwех–НП5oŽ–kОŒ.9пƒЎвЭЃшкеЈўZпџ6'nф…шzжбН“ВЮ=gvпWИz|Ё•Мo.Ѓ+VІ#`>Fб‚^2\Ю€шN`съў6};UэIњсqCl!__єŠГЧЂВеч;rЭцкGc‰Э™б§ЏМШhјNп9žјNњнZ^ukлъmЭІЕГъšџ ДvZ]2КЕ^ѕцќ„Њsэ*КтLяЃ{K=!ыдЁљ˜X6zYчў‘a'6™'s]ЪaЃ Шо'FTЯ7ПŽ}‘беНО}uЕњўЂnЊы-љetХ9tХDЦК\ѓsѓиЕО wб‡ГЊ.Ќ6‰о‰9Q—+=:QбUtЩьatхъёЖ]yЙo§ш AЏxDЧUfс§І3Ѓщвщ3FйХ>н&Š6—Ої%6W|њ|Edtтџ…№+О“ОНœњк’зЕ6Ўў4“Е“ш“џ ІjэЄКht[ыŸPuЎЕгъˆш}`Щш}ѓО0$КЯOjYeіГЫFЏџОЫ.лМ-<пL*и•%$япЭ‡ŽњЭН'ЅњеУ=n}ДZ{oIЫo!нЊтб§ЌкЭЃ‹.'z_§ќыŒВ3їоо€ЬjКєŒюŸ“tm4З5ЇљfxБНпwˆТе'ћZDѕшЬŒЊ §-яyjBв б)_гМмŸчfD]:Ћ^ЊVŸ5з§џЊЎцЉШшŠOŸ/HlјYДбKщ ПЌОЕ~ѕшx­ ъFЧ hmT]7КЕauйшжЦеУЙ™ЌmuNЮщ:гі:g'Ѕ šЗ…Ѓ—]ќюtЕшUSgЕЧ[сTыІоЄTŒо$…4яFЖ~яЛ]YBђёB hюь‘беWб%г{YхЋЧбЇйsuWѓљБ|єЎzѕїagњs[qyWs[r*F[ЭaОюUwŽ7уН8ЃzxfFжЙ“;HBєЈzBдЅЫъ M—кYuй/zOЃЧ_ЕЯѕШ­™7PuЮ%6‡ ZыьЎЂŸз*WЗжЯЋнк z№ГTакЈ:ЂyŸXvЅ[WWm>DЏ+ЋЎєБљ™9К>gЛ7ѕВ‡›ЪlЄюŠзŒюЬBTєИzf`ЧЖ) јMЛЈž˜6ЖOKhEзНЋ,Н'вЧКk}]0МSUПКWѕ8PДyщ-цъcѕш~ѕъбЄŽqtНж‡ўЕVМzАAНяFлZеун0ЎrѕИ­pѕYZrѕ—']]‰ЯГ_]єŠЋъЏюyЩytUiН›рKДйWZл7Ж7sb^г:…Нc•Дж)ь+ЄЕ^uэшжКе1ЭыЪ цghсшcѓ-Е{qжаmЬKлUЭЈО'EFŸVЯM-ЋZ}Оž5›/‡ЗvtЭК‘рЌцВs{.Б~„ЖћињџX%­gvдЙCg@vgmЋWw'"Љy7SУNtЏПЌuЮи=NЃ‹VПe%vЧUпŠW`BєjЗЈНП•tЋ'іѕДў Аtѓ:К_=+ьЬ&ЋW=ЉыЬЎkннЋЎ—}ШJыГшВеЧЊ€щьХЧъImCН;ШіcНцоJWоь>єЏЕтеƒK­vѕ(. zxЂhѕiZеъЪ :Y]ћ’љhЋ\чЅфг№КЖ6;ц%эhvв•Nrѕъ~rэьРфяе\8њYНЌ ƒВЯЊыvGVoђRЂ7е1бЫІЏxє3h\=)mlU4ЊžvbгдЏžvfЕЉ,WНŠ}TwЌЇ”Ћz2ЃьDg_л~,имнKЎюFїbЫˆю‘ѓšA^эъa\хъЪmc‘еБбyй‘е‰ЭoеГ €ŸOЛ›ђЊЖ3Лчћф„ьРц^rBs'|vжЉ{`RєЊ0ЇКЋ woњbВ#ЋлiѕмЖЁvZ=ЗmьДznк‰ГъЙegv…•›зEƒъYчЖMнъ UчvQ§ЕžvfпД­,}Ќо~Њ}˜бЇ":c[ВsЃЛЏUЏюoбну_ђѕИGєW‰œШшу+ЏhГ~…– @]‘ї•Шh€џпњџКЁАВМккq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/6.voi0000664000175000017500000003753510513166110021623 0ustar michaelmichael‹6.niiьнOŽ4Ыzас40@ЌТC„,цHHА &Faa!l#›АжТ6рM ЖТЮзЊ2#оˆЌЖющxпОЯsuяЉЬjщў:NddVѕ ў§ŸGћЛП§г7ЧŸ§хпќе_ќйњ›Пќы?kў_џќЯўњxїЗЧ?>ўзё~ћяqќЩлЎўбёOпўљпўЭѕПНџёяўйџўчџz<џюџ}ќѓяўЫ_§щПќг?џЯџё/ўУпўљь‡ПрЏџцЏџтOGПНѓOŽИѓшЮџЯППžћП§ЙџўїџЖџџќџъPWл№uэнюŒЏhOЛS^W1КЕ‚еЃkе~ЈW||Œєюˆ/Ћ8=Žbзр‡z‹ЧQ4КшВї–Н;`Гжкю„Џjo>^яMyYЛкѓ’жлєŠŠб›E›кЭЇsћr^4TWь~f”˜!У…(њїRБЙftЩЇМЎzwЬы &П+ Адv|UћewФlnG{s^вкЉКє6кt+hN5—ŒонtЋbsНЛш^иœ==ˆЮ?ост‘=zVН;kMєw)]ѓ>^ђі2FяzIЩш_*6§'Х*Ъ@ћЭю†/jяvg|Ekзш ёCs!oзшЅХvg­UŒ.˜<‰оuЇbѓЯ‰Ю^>mЮ\-њЛTl§}~TєюЎЕŠЭ5яуQѕюЄTl~џє].њ]Хц"ŸУ€?F­Ен _доьЎј’іiwШ Эъ[]aЬ[]aІДvЉю‡=Ѕ6З;mNєwЉжћІм(џRqvќЄ9;zб,њiе,њъЇEяN›+=ЏоЖRБЙшcоччиRЭяЙŸџ,§јBЌTєXНЙчEчяiŠ$Р~э7ЛОІ}инё›[ыЃѓчЭFНЕkѕ0ь Е‹сWШЉЭэN›Z4ч­.НЌон6UБYєЗЉ8ЇWЭЂџ€–ЭIЃ+6—>Ц_awнЬPX+zЌоЖL‡ќбAuўцGучЋѓ‰МN.ТСЬШ§˜G‰Ѕу!Јо\єŠaСл›ѓЂkѕо–ЏЈд №кov7|Q{З;у+ZЋ]АЙЕ>:џЏаКшёwHЈЭэN›Z4ЋўУ§]~\єюЖ)бпфЧMщЌбЫцœбыфбУ‰бу™ЄЭсГsЩш#{t˜Н9еьбсАfo^DoKzС,z[аK&WтО —„+ѕЦžїФ­=Џ9‡I> яEЭъBгxзZћ|ЕЕу к›н_вZЙшжъEЗ0:їЏацvЇM-šѓV/ЃkVяŽ›)9дЃ+6‹ў6зТrбУ‰ДбA_њшИ/wєlL‹4З№=Yk‹й[-њ§uЙшпŽв6ЯІGъЕуnХл–Е6ЙS7Яn#uЃw%Н`:ЉЗН`v)n zЩЏОфsxBѕЗ)­њ•Œ Ѕі›їџmЛS^е>k[™ьжЮ­%В[ЛFœмжѓŠжъUЗЙнiS‹цМеЫhеHЂПЩК9gєMsТшV2К ЗУЭQ_ђшЩSGюшщ˜–Œ>ŠDЧomЩZ[MобqѕŽЊѕЃЃъQwZ[eчl^ uжр_Іуœt>ПћQбЉчGђ‡Ѓ‰иZбЧ)КRѕћџЋ~S2КfuЕф]сшšеЛ+~W­Uл’О]эЮyEэNК$ЇЯž4ЇЎž6'Ў^4ч­^Fg­^GзЌо]7Q1КтєИiЮ§[в]sЦшБЏXєњlгКФЭ]uќЮІВЙе<(}”Œ>r6џ„шіvГЙОНЋlЁЎooK›‹Ђ/елЪVюЊSњ1бЛ›ю• ўхЙжŠ~мADџюкхЫц˜—}ЄжŠўМяЋўP7Zѕw(­јЂVmУёvЕ;чmД;щNœ>{вœКzкœИzбœЗzЕzДZєwј•T1њІ9_є]pЦш ЏZєнщ,цu%ЃЭ}^вш›+ЎDєћšнНП-nf\оКЪ„ЭїбG•ш„%ЃkVЧбЩЋRtъєvЯЦBбЧГёœНyŒомѓšghЁшЃфP?х*E?UЎ.–]dО*]z~ьЮјЂŠЭаigЛc^гzЛƒю ЩљГУффйгцФе‹цМеЫшЌеышœе7Э Ѓ[бшrгуWг45qє|x“FЏЇE‰шЛгI,ъJF?пмRЖp3 4ПЏ§ћ{Ъ&ЋЦхЖХЭмFg$њЛФбЩЋRtюъYtъъsd™шѓУgЙЁ>ПЮ}ЬЂSWŸ ‹UŸ^V‹Ў6ЋO/KDŸŸ™ыDŸ?Ќ”iО(НЛуKD›’б9П `ЇrЛбЗою {Crўь09yіД9qѕЂYєвЊ9iѕ:9gѕmsТъ_M?'њѓн„б7ƒ›sЈя&D…цј6„­м^q%ЃЊбп^u#˜г­џ‰-a Г/]шй4:sі48sѕ|”WЏІFкъzњ(}\ƒнaKн,ЎQ=Ю\}M,R]2њ˜G'ЎОжЊОˆў}\њЊD_?V‰О>ЯiО*}Tl.Н;уkJF'§NњNХfрVЕ™ыmоFЛ“юЩйГ'ЩЉГЭiЋ—ЭIЃзЭ9ЃošSVп6'Ќ~ЁЙPєщЭнНЛЁ­=ОПЉmц~њцžќФЗg­UŒОGТЯ7WaNё‚—М}9{Жzеœ6{^›8|š7њhah;НЗ5/жЭ‚ёp_км,њqМ/mЎŸЙйWŽ7%ЃћЯSзх$ЋEtоъ.А•Њю“W—Œ>~@t‘Kё˜GoŒКuЭЋбќ[чѕЈFtЇbsхшн_T2:хзЛЗ*6їk №GЁоЖЬ7Ђo's;ƒюЕ™нa гцМе‹фДеыцœеwЭЃo›3VWŒ^&&Ожббь[ИŸОЂуљіЌЅW–‰lЭ?#:]``l.P>‹ўЬN™?~ЯM9шЋшД3хRW0њrx~gwу`М№GuЂЯЂљЃћЯзћтfЦ90Ь–Me СФэЊїt­7ыT~šG'ЎžNZе­хЯ^F—Љ§Л™_‰‰Ѓћћ^‰цсf]"zјPUЁyјVш^ХfбпЇbsЭшЄY€пQНM™ юшоN>Яь-КецvЇM-šгV/›“Vп4ЇЌОmNНjЬНжœбwS!eѕэєM§Т5—Ўљ~ оЭ_Zм*EЇсOышœйCsю,ћтfЂшgiБшїжrбс,ЯскV.К;L=ЄUˆ>њВhЎьь eЇУ:бчЧчЄЭбшЋ7•-DїZНЇk-šИчеdGг­itЮмwсТ–uйјДŠ.Z5{НњtЂLєx&qspпЋ=~ъ.ам­ 4_Ы”ˆю•ŒЮџјЉН;тЫJFч§žј]мGКu{ЃјZьШ>iЮ<_ЩiГošSVп6'Œ^6&Ожббл[ТnчoТшЎЙќбчѓз{вІІr*˜EЯ'Ы~Csой™Ѓ‡ъyБ њ33яP‡бЅYЃЏѓўT&c›КљшлJFЏV“4†Д’бЧѓАPєщ“JЁшЃdt_Н)maіё4Км.е[Њn„+[ж~˜F'ЎŽo"YŽ-Ќ“DтОфе“МмбГљ›;zВРŽоѓЂyє†˜—MЏУ=9/ŠП”N=(НЛтЋЪFяnјКŠЭFН‚ЛНЏ+lЯмкs—ёv>ШЋЭэN›Z4Ї­^6'­ОiNY}лœ0z˜3њnX3FпЮ…„б/ЬхtЭ/-vйЂošѓ ђ/Qeіъxh“WO&DНшОzwc/l~‡T–sЙ@t\;zsтhH+}џјДп‰ў8%uŠ–НДбЇ{I2oѓуЫмJKѕёyЛnнЉфбЧћG•Ы‰єЭЧ№tш^ХцДOЅРяЄрцЦЇ­ЏЋl‚нBЛЋ–тфдн‹фДй7Э)Ћo›F/гFп kЪшћЩP#КЫ/жœ/їнMtЪьлцšбљЊ_hЮW]1њЅцЬбЧєwи]йщЫ*4C™шпЩX–?:(KпќcЂKUїчJ|въЯ=пм7N‚Bб§Еx~‘K|Х%~eЈ7жMДХВїўj[кТќRЬйћ&jžM#Ў Ч?‘И­TєјрД)ыЦЙmXїrGЗ~UNн<|$ПžоVugН­щ^С>ТЋ.tpйхo>N+єуDўfрмe?ц{3?vТŽіЯЉŽ`sьL‚фp“њL–ЭIЋošSVЯ#ѓF/6iєэlЈбмgЇ‹Ўw?eс(P]1њ…ц|е/E'Ћ~­9otwX"К?Юл Ь€оewц;5?іСŽїLOЉ vн“п›л‘7~кœwШgЩwЖжХцЭGкп—Эя?А'l%ˆЮ˜y6'o_6gЭО‹ЮX}лœАњ…ц|е/EgЋЎ} +нПK=œШ;вcVЩш"?%њўAuЗ0,{ѕ‹бћ#qXш6_іvтКмЭ“1Эн<›5ЊЏgг~Н4™ŸЧщЃЧгяЏі„-Хз[к‹№н::iї$ЎVupƒй–Жа:Ущ­u“шЬпЇ‹Лvцшй&ыНхнtњ&nžџБ3qђQъOДg•ЋwW|AСН™O[JWй^Кv7н)иМJЮПхЄC^pj„ЭйЋуцфщЫшЄеыцœеwЭ5ЃVп7'ЌОIMY}mŒ†7stwј,M8дaтј{lы зZ_pR+ФѕbьпЭр.zx7ƒ(ЋdєњAqWшхйW˜ДЅnžеЅn~)zk`ф'DЧч7іХ&qeЂЧг)ёŽЩ-ё8?'хkžEЇ|К{ZG' ПъєеoС­|gнDы яlŒ›š5Я•/ЁisЪ/=>,foкцм“wNѕїЉYєрgЙь(]cƒщйЕ&—lЮ=iN=kЮ=mN\НhN[НlЮZ]1њІЙdєюМPЉиOчЪ*б]d­шўјњКЃlaHgHКqЧѕz2пl fCw5&œтёьK…YЩ›ИЌRєЂzcтhW2zz>…йžГ5П2в;ѓbГYvjќ2Ы\]2zњ]8њHј0},>Њdх7їѓcOзвdЭ;Ў7˜lк4ЛNt0иЛЪVцЭ‰џZД\’“6'_нІ*WяЎјЊЪc]БzwРзэ(]a‡щЯ}АлЩюІ-Ж;kiвм>ом\›5gŽž6'Žž7^šЛ GЋцЌбЫцJбGђшйј>›ЋD_+ѓ6WК_*‹Tw‘5ЊћФљФNd ЂГхЃ:TЇєh.tељfJ8[`_т(Ћ/!йЃЯыEоцi]щшŒ‹Ч|DO'В5ЯякIgЦ›щМЭ:Ÿ™_l‰ЋчiiзŽc1w7ПНЅkщv~lЉКsYєТUoWйBћiеясякmѕІАЅEѓѓ1йL†И‘L4ФIј$žЬ›b^ЖšyЎоёe›‹+9ф%'7$RqЇрщŽуy—ч6щэфѓxoлЬГВEб)Ћ/EЂЛбНV'n]єQ КЕyѕ‘4КoОЌ!G™шыѕ—1:hО6&Œ›Я‘ ›seŒ|—ЦnДущВ_<А“йEWЊЙgЮуПЋ/ŒщnФЃ‰аUч›&сєЏЦбГ{qZюцй W+zvй[й™Х“GGчп_яЪ‹MЇ@жЉёЫ|о&ЎўЙбйЊgтQfЈg—тІДЙжІйi›‹VЗћъ]isЋшŒї№wЫшДxж>Ÿ­9›УYЇХSЩш Б@єЄzSЬЫъVgіЄ|СXX њ!ћ ЉАn В>#­UlрЧšэЙ›y/оxЇрдЛЯіdЮМWs;ЧЕѓQоъt~Ѕn'—Gїя ‘ж†ъЃ‹окimV§|wg_Єoю ЋD_SFGЭЇЪ”зс32ЬgЬvQсzОьw*}SН7Взw%Я}3жхoЂƒ{zЖіhLЛъ|#~pš„Y…ЂЇзbЖцЩZ‘;zї<ЬOргжОТРl œNІkОNW|,т2WЯлWO.Фю­Mq3m^7њЅЁо”6Зъœw–_кOЈпмSЖFЗЫГгЖЖЙYѕуеОД…KьљTЮмw•ЎРЇiєІžзL–=1/› ѕІšW•ъqe+Q§щбZ-њёW­н1/z.vѕЂпПђиѓВ‹4Ђ=wГoХх%п—~R—ККЭъG?6П.4AZ›VЇnWб{›ЪцZ/xsWлЬа|i,§ШœЎ*{Mšп;g—чfЯЈi}цшeѕюЬЋsT•шkUцўўОї—!Ў@s№ 5'+F4џœў)б7Я" DaЅЂiЅЃЄyёp^NЄkž}8МœЬж|n˜y]ъъщ‘ЙКMЋЧgЉ4кKеЛъfбY?еЎ‡:ч­х—АЙЛ7юj› GњќЂJtиŸЪГЖuœБіSа—vнxXEWЊNŸ|DЬщ“`‰Ш?аG№ _!њсКVoŽyеЃЕФљ№X6 Ew7ѕбѓЯ_Љ=z 5№–3лѓиэ8mдœзsЇрn+ьМйq_юъйв™Ѓg;_gщщ†н‰7ёюЗFoу;ыbCѓ32mtдмЎK^™шг’/zкM—,‚Й>њдT2zUН7ВsЊбм/Фщ{пмFяЭ q%ЃуiН3q4fИƒЊќеQVіц№щџyT(њ|УЩ=žќ<к‰'nжЩќarЕхН™еЅЎ/Фўmuгшд{Q]хћƒЩ›[ЪZXннfvХMEб­Л9n‹›™DŸГЗЕЭеYgХг3№:вЙЛЧКљz’Ц2:uѕx&wsP=јM|/м’ђp]ѕ6ЧМъМќ•Љ~\~щЏУ“жлє‚ЁЙBєPНЛч &№КЧ&Ж%6Гw9NŸ=IЮœНHN[цŽžŒkъшйtШ=›Ц™чєњЬ§BsЭшlеQЃZw—gSЁъSRБцv9ЈНЌўэќоШо}єоОHŸvнДйCиѓDосЋЂЁNVDХећG—%тКZ_Ђ7g^ЕЋЫЙДзbа.![#{сХv=“ЎyВBdЬтшДыЦЛItюъYtъ)ВHЫНNЫZ=ЙЏяn)[ИLъSыљ§Mi QuЛVяJ››Egl}њ,Ђ3wзZЃ?-ЃГfпD'ЎNєѓ<Ё,ѓ?œVхЯцўєh-1дЎ“ЙVtі•уjˆЎP]2њ}Щ.жќPБ`Ћ"[ТŽ[Ї’ГgO’Sg/šГV/““Vkў?БЙftТьšгU4е‹ўќg•ъV:њІzsцХЙЈJѓбТъсийЛFMЊЗКЌеCU…ъБЊ@uэшЗЦыЉыЛ‰ДЋыЙш_DQє%5єpђѓp_`$jОœни6G'ЏŽ›Д Ч›yZ…ъЏНЕY8žнѓгїWн˜]†чƒ Ykгuњљ{Т–‚ъЄ“тЄе‰зOОмЧГvmСшg3„ЕбуЊVЁz2дGюu$щЯ—‚ОфКшmŽyQ‰i1Јpік`wб ЦшšеЛ‹^бК?eьюљЊ‚Щпюs'и:{Тжл28и›9}їЄ9sѕ49qіВ9gѕMrЪшŸзМЛnЂр8пOŽ„й/4чЋ~OЊн†ш№иyё:їŒЋ7g^ЕзЊ7W^“.‰UЂOЅGWНБ0а5ЭЊї†Ј еcдфbми8XDЗn=Щ#ИкТ В5ВзnЊ*бQѕЦФQнЯŠdЭ“шЄsљSмœМzо–И:JkѓЗ’ˆІЦѕН Qw&z[ЯKf оЮІ{уђ‘w.?‹^тK№Cp{™Ќн™<ꆑЮм=„Ее%Ѓ‡uљбš9Кі|ЖfŽ~И\‰Ÿ/7іМрМŽсw%.РAЩъ>КBіи\ДzwвK =Ÿ№екИн{fЗ ŽvgNž&чЮž&'Ю^6'­ОiNНЮ-зœ3јјs#ўv'КвеяEн•—<КѕбЊ+FЗ1:ЌоœyѕКЉо[yu ZVoь]’е;}в92ytыЃ%!j2AіŽ‚ЊИz_т(ИиЎ‡ ›Уu-Њо˜8ŠЂ‡сMж<ЛƒdœOqsђъљтP њrъќЮŽІ[сЬ8НЗЃщж8?вІ>WaоiёiКJяŒК5Ўyб˜ЬИRO–юTC7ћ‘}ъJл=dѕбЋћЌЁ9ct?дЯвЬбG8=ž/7НЎ[ѓ.чВъgХюžзTИў5–Ю]!ћЇTя.zIЛЉ‹Ь=­N}ЊŠЋ7хХ‚YM=q3С б§Й›Џ—Ёпв6Gч§„ѕ&n>’Х4ПЮWg\nEcWЫЫт;тОž—ммZrš-вUЊ‡дНa+уB=YЙSYEЇ­^FЇ§њ1Иƒwv•-єU%ЂЛN}„#}wžМЮЅљЃЏпvƒIЗ>ZsЯф^ыЏ,КLѕюЄW|vVj>њ dPn—у`ћюєнб6иЩ‡;Ю=фФе‹Љ‘ЖњЃ0ЮЮм<ЉNš|œћЪTїГЁbuН;0вї•‹nб;›КжІе9ЃЃљpy;at8‹ЛїSFПPНЉnтдW'ŒžŒь№пнЕt?Вљš/O—SзйPЖЭу1zGйТlЭH­|єю–—=zы$Ї\…я§Œш ПBДDЇяo,eЊ[œЙ{ˆЌP=м\†лMЦјХP~uГ3/6Ь†vЉN:QКЈ6кUЖ~;“=њъYZ/њєВNєљ[…ЭE+с№цoЎvљUОIП –Кй5ЋKNуВX”i€Єjmr| л3яЮyEАЃtњюxьду=лm<ё,yK‹ГгV–км§бU'Э>чUЉчpшОzВіeє]њЗ…­,F5gѕ0ЛЗ3FW_џ~ЪшОzx?[tИв?БЅmЊЯЋѓ5буѓQошEVоц|e ‹ЛJ^m]ѓWYG'§7АjN;mYi›WЗЛœСП$ЫЕш&О1чEчъ2Kі5ВHvY"{hьЊsжїенн&ч˜/Ђ_8эь‹MЇGцщ}ŠšF_џBQЄљЊŸЮеЂ?чu.ЁщЃубЭн<\ѓ;Ѓю”\6TЇŠЭGж'QЈЊиОС%Зf.ЗЁtХцItтіЗФbŽ–кл§XhKњs_•ъўЪ+Q=феŠњВFџМъ”ѓcX3†їѓE?šVC§эU7.ЅЂ—UY›oЊП+цUыHОA~ГМэeНонVRVЏ1в>zЭŸGЫ™ГSXеz{кц–—`ЮфХ“EтцХуPвр_ži™чCЇEейГ[\}^џvЅ-DkєщLцшшsјуpcнD7ДнIннлЕ:wєѕЈГ3oтUЅљЂtєQщyщЬuf~ЏfDъцщЇ•ЬЭёКБЛщ^ЭъJй:ЋиќK™PрїPmgц‚ћI—мЛмжнo…ЕЊ? +ээ~ ,“}ЭЋQ=ф•Œ.AѕїЉV§бY*њ:{Эtx3ћtRфŽњђNёе}/эЅЙК[Ї]_‰NWDх}bКZdc`$hЊЫм<ЛYч ўх™ѕўъz9юiКѕH›Ю†„щЯШИ:чxЗЫ зьMe —Ш!;utє•Чб§F™Œ#ћЌN}9шlЭ›.М бЯJмœ3њ!nЎ}9Hн=]ЇonЇuЙ[Kvf-ЭfqъшщЗџ™› ŸВ"5ЋƒьнE/Љи Pp[цbлIІ–ЊОFWЉўP$њZXc›є.АФцю}`…=щЃМмХЯqннё5ЅЋwg|йГљуUъпalKПpa[іъ8-t—;z6RWO/КЬїёyZтъWЂгUї]-В30аW…ЭЃ‡ЂЃsЙЃƒ'Ѓ[8ђ5ŸOtCпч'l~>‡Цs!хьшПžщ"sNщгђd'Н/‹о::ЊnGкйq WшЄбГљ‘>њљЊJєQБљсZ0њrД;k­Ы,Этьб“K/wtПt_kњїкV*К=КRѕ‡жЮнUњ[owаKjE?ђ 5ŸVŽ бЯА {Sг­sкчыьбзИaЌ”+_ Ћ“/!Cєщц˜<њzдJEїЗ–дбчз5Ђ/5Ђ5ЂЧЎьбqXюшKZ;ŸŸ§> ,ЎЛДНКцŽЋ/7Хн…GV0QвF_О?Јв|Н;oтёэRЁц7х›+|В}гgVЈ&DўшpBЎо—є‚pеHо|TћЦєЁfu‰ЏL€џпоН$ЗŽ$QФbsџkшЂ$Jј$@ЈКM—э>ЉGефXX$`Bў[q?щžј;єЩ‘Э™бЯ•ў п|шlЬTGљЇl<џЕOn}мŠоcўp’]ѕТ*3!њЛmR]vawмЧ‡КЖSуВzщ9яЭLжКcѕБyЂ2pfП Э›‰о\bЂ'"Ђa§ЃgeнЃчmН›Ї‡/2Кћv|}Л„E/Ч}xƒшъОЙИ~Ш+~8?‡еeWібЧ№Ќъ§_ ›^›lDpu]бГыFїцe—]s_hvЦeш#ёїбу~Ž~ьUнph ШžЗі<:Є:dГŸaIбЋЖДшЯМCpгцuщВЭЎЛvR]un{ —нр{њiћюмЮН.эмzЂЯУїSнsо›ЊйЏcѕцЮбgЩ§š3Ѓ—Рэ˜Hˆ>†ѕžЅхDЏЏ’„э8Пhˆў‹Œ~U]7—и|]]нv*Џј!2zџT˜V=§иеЁ2ГzrћзЯёќѕo^f/Фњ7/!oФ&"Ѓ~#ёщЧFuЭуЈ:щ•IrћьIgRѕў•Q/ьGлъgYXѓEuqм™U^NєњFє~šWWWН–UНџ2йF7Mџ‰šœСІ_%Э.xЭЃЯ’;G'5gF‹ŠоFeDяЪЂЂЧй§RЧц‹]н7YиќЊККюDbѓeuuкЙМт‡MgJєюXJі.2Гњ№ЙЇCeBєq'š—WвGЁй44~TЇм5ЖЊsюGеIЏL’ћgяJЋ3f§™§—T§—=Ћэк|V]]ѕRрЄцбн>‹юН&'gБsєUrзцШA?DFŸWW‡M­ЊbЂWq1ЭзWŽІЭя]]w&В:2:ѓы02:ѓ+<Џјa“™Нl2УfН§”V}ќмдnКЭЫnГ›ПёXЩи рЧјQrзиЊЮЙcU'Н4iю_=nŸ§‘V}–лКњ|Ф}›3ЏгъЏџSvщt;њNќ|ЃWŸlGыхžžУю22њ:ЛКэBZsтv$6_GWЧIlЮŒЮЌŽŒОЊЎN;—иўњ`ѕЯўЭ›Л§АъЭ‡„ъэу`Jєю!6$zїf&#љ!eМnХн1Њ~k|ЈЎј•РфЏшъˆ_JlŽмŽ1Vе)ёcЋ:чžШш%БyЩ+~LўŒЎnј2ЋSГ ЛQPъ?LМ9q{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/5.voi0000664000175000017500000003247710513166064021632 0ustar michaelmichael‹5.niiьнMŽlGZЧсгРБ K ˜#!С6˜…E бnдЭXka№&[aЎЏ›ч#ЮGV_gМџєѓXWЎшМЉ‡Ў–Я}QйЩS№3Ѓю—Y=Кр'mtР'ДX-њQЃ[jt\u{7Ку.-Б:БYєу$6яyЃ#юYЙ}lЊ3^РЊ:hьѓIч.—Ќю–X§оћгŸ ъД!П§0‘е‘б!wrрйЕ6Кр~MєƒДФъишИъіntЧ]ZbutєшŽЛ$6чюЃюYЙЈЇЭі‘№ж›^Цф_лmО‰wі=*ЛЕФькЈъ[kLrи„ПˆЮЉ~K л7^Фmv•Д6КрZ`ukе-БК%VЗ˜нЋГЃG‡м#.јEdє$њQ"зЧvяHx ›-/aђ›:bСМ&.'аНЪЛнй‹wЯЕ˜нЋПД&UЯRcšнйaЖ–GЇ\–ИmЄVO)wqрNmtР'ДXнЋ[buKЌn-/ЛЕРъ–XиМ{ŒnИ›шG‰\глъ„зАйёFПйЇ#ЖэuuФнц­oЕ>ЪwЏлfŸG*g/Д•б=—|ЄFF‡ь#яfЉ1Э™wіЈшРMcR§X‰Эя“HеF|Bkе‰б­VЗФъжГ[ Ьn‰е‰ЭСoФбї§(‘блъ„Бй>FПйІ#6Съкй›[bФMђ­n3щъеЋ‡m‘]ЙќІ­КтKhdtФ>ђnšвМКЛTo^,ŠС-WюгvЏнsMfѕњnєД6КрZ`ukе-БК%VЗ˜нЋЃ›ƒЗМб w‹ŽЋоFМ†Эж1љnuѕьЭ>Аooю.З›ншїK%узCmЋъš#_EЕ1Yw ŽО}БћНY„†4Џn‘х›_ƒђ‹М=c ныBЋ3WйZ]pПжЋ[buKЌNŒnF‡мЃ%VЗФъФцШїa№6=:т^ЂfS№"жлGФvВйЅЖээН%сnГi\н#KжяNњ§bЭ™wЖYuе•Вlj[ƒКю№}ћ*,:cЯ~ЕьЬh^OЗxѓl‹Ыя‹Мn н CЋ?vŽЈцЉќf№@­.И_kе-Б:1КЕРъ–XнZ`vKЌ>k.љZNІ\ѓ_СyrНцЃbбт)ј.>КсnuзРeєO_&Мˆѕ‘qЃйЉ^LПœЭhWЗШ’cяLvqЉцbйєлХКбыЧ+Ѓвœ6WŒ^њв™=ћ2,КюgгЕegљшХšИ]­нЖcМЪлшІо=КшŠФЛЪДЙБŒЮЙ*(рчжкш‚ћЕXнZ`ukй-БКV}1ЇбЛ—GЭЅГWецЯVЋоkjsЯ:vUЖљ№†XДxЪМ‹ЏЂC^Рb д]ХKЫШЮ›Џтkш4n_Ч€Ўc{еmv”ЖЏ7ййЕšбыЌхНАъsUе:†Еэ;mЎНpЫŒknл•-3#ЃЋюxоъЖ ЂrѓzлsMоFїBѕ}i jžj~фžA№ ­V'FЗЖ[]їхД§ъъб§МВеэ њ`щŒеNЋы…6ўkh/Ћ>;X7ЊmЉлБSTКywƒ(ќтј†XБxЊ\vфнцj›КЛŒ+ОEdчнWr§є7ЏcHйюdoзŠюzНЩоЎ•Ž^=Ќ|?|uк\4zё "zъ5O;ЛvEЫЮЌш‡еДiЖ-ЏзЫЈЈ3ЛoН шygйцњ?і=KѕшЂKVw–б9W%ЕЮ$6Р/M№ ­uЋлЋGЧ\u]Дz7-2њр™с–AйъжіЋПњЈњб=—ьЗе>XЛЗ'ЊЅНсf_­ъNе—GхЃЗW–Цvt’BЂћWгЂЇMїЃЛ•mžEїVЩЧw<Жщдщ(;щзЊ~|ЩхБ˜фЖЛцš^ŽrГVвЂыnзЂЧіœGэыъНяЊ7Яя9ЭНЯЯѓ‡#гМЕm‡Pн[•Ћ–qNѕњЉQY'ŽЖŒЊЭ§нntгЙЬъmіш KцЕ)ЭSэ}љ@d4Р}"OvŒ~ЉЬnof_DhsЃcКzYѕ›gam~5%њ–]?zQнfз‹FoгZч™bщnЋЋ М§1ољ~=ІnЧ6z>пЂ›ШNѓЦИТŽmRJtџjZєДщ~tзЁ§Ђъб§АВЭ‡ѓ ‰^E–ю НjєдьOОŒKбЃ#зЎDnмК…Х$oc^ЧU›/D.ьxвIgFзЋОY=Кq#БЙћйЎv№‹ў\#ЃГЊ7зЧ…к}лUЎ>и,rЋGeиьzѓ vлVзmНщTd?KѕшЂKвzп$6ПˆŒ~Э7‰Чю&œy.sциЁйНSщKПˆ~pэъƒцКбY“ўR= Ы‹NZгWšKFя–ПЧрФУх<:nЯ| )ЭѓvaЭoЛбењoћЋЃмдїЖѕЂœЙt=л Gw.œD—lО=Кr%0љRєшФ-бr!К^ѕ•шrе‘бЯЛ>F7n$6wЊ—зFчѕѕЧZo.X}Ѕ92ztуZVэЛФцУшбmЛ“=џ–‘‰[зš‹UŸE—\*ЧЫЃшђ>ˆо,”2D?Ъ•шrе—ЂЋU‹~б’иљћƒMѕцкрМОўT‹GяЕvѕюZЉю?1$ъдўŽˆодзюnжЗgЦЖэ;Њ[vdПКВЬъmіш KђŠ_%6Oе?qHlрi%žЭМ“\љь ЙєиїЦ\xБtG/ОТ{‡бW?2§Ќ92zt_Oт O›EчЭѕЊЏ4‹ў.є†5Ўл‘и|=:mз•фrљчЭ‡~]qЅœ-ŠЭ‘ї№ч.W})КZubѓ•ЛxbtСIŸVW\OЛчNьHlю§ъ1,КwqdмЎ~_ёшнОвеЛ3­НW9zЗ}CŽЊ:q‹^/•ТбЗъЭVRЗЙ_нtС“TК&Б9ѓџBx‘Y]ћŽР(№ЬрРГ™ЛчIзюяŸ]{ъ§УЦk/•ЮСюхзїqsЭш“ц’бgЭЃO› F'6wЃwю4eь6.КMЕЃї–qщхБн<КЏ+0љ8ztлЎ ЩѕъO‡\pцЦœНќЩehтжбћАГVjxошjе‰Э™wё+7—z›Ÿ,Кr~bsц/j:Пс ˆю§д}zЕŽК„шн'jFяџDU9zљ_Акњ‡­EWlwŽэѕмт6ЛпАІsл[ЫшЂ+кЦшЂ+2Ћ#>tt&ПШЌ~‘и 0Lи™АЇяnOg.по9QКњШ{'w_(луЦы‰}и\4њИЙfєIsЩшГцŠбЇЭб›ЇЦЕэ9l`tнхБЛ†+Џщнw^сшns›J7?у}et^_`ђaєэ[FіœЮИтШ›Я&]rmОЗsЏсRtЕъШшKеЃ7ђŠЇ ћtE‰ЭЯ4щъй‰oФЬэc§{єМшџoяnВЧЕ(Œ2XЭ Џт0–dCеKtЙwЇV˜j|Ёu-Ы‘ њ+EЃ‡џЪRОzRV;zњя*‘б5_ЎŽЋпѓДm[wCЎzJЗсн?X•є„~›^лѓœ[iё­n'уо‰Œx|EFџHlр)yпм};s§ђю{Аы/ј$ЙtѕМЙnѕЇ5W>l.}”[5њxukFŸLCЩш“Ў9дЧ7^Э;ёh ЫnГ]cћЩтФNbѓd‹ОАКoh]w‘П&ЯЯ§mЛ…Ќ 9_с‚+~]rJއЙшhпˆЂџDПKbѓЩ›VСЫ—ˆ•н ˆ”9~pxVm?к6ъ.ydѕoк­0"њv`nћУ]BtЕpєєнЄtєєЏЙЅЃЋпœђ‚ƒ ywЪ ІеяyЩf~kђƒ{jэ]уQїH\єœŒ'xЇ]ђšП$6№ётО~wџѕЬс]r§ьarёъYsсъyr`ѓъАдМ:ыPRыM~s]ёз8ф„ш}wХ9к7ЪNљiѓвКБƒ….л<ўўoЩфitб%ўutVuо\№w8‹.Й№Ушъћє$КіˆlєъЦЮ‡DїW7vf [ЙyВде%Ьp'фо{4ŽЎо=­ЎœўX}§oLѕ­lПДmnPV?zђrR?zиV:њАњн-Я;Ј~wЪ f“PЙЙђпРнЋ“ђЏееwшнЫжъœч< G›ј „}ѓnki_tмzЋ“Ю ’ЋW“kW&k~“јцћЅЕQ'bw#g"6ЃгnРoqлЦхЌЙhўqѓТА#yГёAЗсъІSЇб‡Г ЏфЪЃлуЧ ѓЦЦбЕg<БљЉъе‰НAa^tы/ЎNь‡!-КэЏЏэŠИё:ƒъњйЃшђсГшкнmДЭ•яmsхЋћ].Љњ2пЖыЅ•V_ЛпѓДƒъЗЗJoЮŒn??Џn:“Жk|ћ”цеMЇ›#Ѓ?e:2ЃлуџА*mnн>_73ŽОЅзœ–Ѓшz3Ђ/хDяЏ­Nь oСДшAѕтТСЭЗЛМ8phR}ћ`iмL]ГѓС : {\]=|ДЭ%tЩЌЮ<[gэ$їДЬъћЅђбУ—ЊъЭ“ЗЊтб—яџъˆз•Ÿ†ЁЬъШЙЪ\ёсЦ ќвОœЙmЌnyNы­N:3HЎ^=NЎ]=m.\§aЭeЃGеЃgЫZ9њhŠ&GWЕПы"ъГіŒaнРфШ“нpЁW7§.Ÿr>TWќЦЭ›ъ€ш‡+?Ÿ/,№юWX8tT} ‰nнЕе#у[0-z_НИoЈ~Ќ^œ71‰ў§deййRзКр™й™еЁЃ}=!…EпDъЪGщ#š";™е%_Н(!р{шЕяŸWk#ЋЃŽ “‹gO› WXsйшaaёшI^щшщ $4њŠ&wСЪ3qЖgќHŒNлП%6'э2Ѓ‡у“Ђ‹WчGoЏ,ю:4XпњЋ=‹ђеУiŽ‹~\ьЂсуъШшъs=Ž.§‚јeR]^fuшrЯfЛИЩFRм‡TЏzNdєUdtѕтLDsDd/Г>FћЕКуmућчеAчкШъЈcУфтйгцТе]fHѓшZхшI\щшщ’Ž>˜оВЭ§#ЅnъMи>ї#n{Оd>UŽЂЫf'6ЇOGў(+o™/гшеYЧіЁ‘бХЯv?CQБGГ\Оz| Џžliбэ~yuмЬ$:Ўњ~}mй‰Qt€Шшдьсdз—™=оGЊ‹Œнќ"ЃEFWўƒ)Рї=єэjuШѓZouвЉAs§ьqtѕъ[їeћЌnšЄ•ЗеŽžХ•oіеoЎМЎФ­nв\;{]7ћЈЙlѕ6/ЅYєЛ<іe4wЇЙђС_Кe hоФуЅ•QgFC\~БЧFёъ.zSН8эРAѕтВ}є§9ГКmj]|ЉћюыеЕUgFЭ"Ѓ3ўЄ4ПкIн™wddudtшX‹ŒЎєјлД–іMєmcuЫ“Zouв3>%{uа+Ђ‡qХЃ'uЅЃЇЃа\zaї]љњasѕюitсьM^NѕC]dєОzeи]^dє%ЁЙ;EFoГfЌkTt7#KУŽДНЭеХis]єІzqк\нn—WЗЭTЏN;=Нgю{х%6‰Œ>јKBiс#ž_НКхy‘бБ{_љCоLb3РчjWЋCžзЌЎyZ‹ьЮЌО<†Џn92ˆ+=Ь+=†ŒцкKћЈѕV'4зП&eoѓbЊы2ЂїyIбуъ…]‡К@бHXПљ2ZзЄшЖпЏ—†i{›Ћ‹гцКшMѕтДЙ>њ~Yн65‰Ў§0_ъеaЧЦK]^dtФГ{ Бљ№№ЪЎЮ ЯМуЋWЇМ БљKdtѕ#кнъ”4йoSнѕTЋGч!ЅЙњъnДНеAOјŽьТ‹Зпъ‚ЊЗuQб›ТˆшО12њ’н_Z˜ul4 е›гЃЛYXubИ3gE_SгЂяе‹ЫЬЃ‡щЃЋw›UWs$}иq‰ŒV§F‰7c~ѕъ’WDFзvкЏе/ЪЬn1й‰еƒШђб­ FЂxѓ6Књњn…fяКcвƒЊЗ…iбƒ№ХaњЅ­п<ˆxކXєŸ0^ufИЩUЏ~мšЗШкЎCmVН6ыи>њVН6ыX]КіWPuКлŠЌŽŒ?bЪKlNњЛвVdtР‰t(rБ#oЦ№ъеЕЌnј7bКw• е­эV7`­лнэвЪžЇД6ШЎ/ГzЗм1щIе•бћЕMhюoС€шС‹ў#FFѕцˆоT/:3~ЂdEЏ§еE'TGF‡Ш%ы|w'њ]›‡яу›#Юў‘ббkZ– <Џ]к?Ж?ззnV—М EV@vBљ=1Їњ!3ЃyПИ ЭЃ|ПА8ъLwћDіŒШшKhєкІSmT]]KЌоGGTwбЊџЄШшOЈ^ѓЌјше-ЯKlО$6пЊWgМ(2:р№?ЙдРпЂ­xQћЕКу­%VoВУЪЃЊя1бЁ!бЛ™ˆhоозŸыvШшKdtРгМ ЊЫk‰еŸ‘нgЏюyVdєEєЛDFwgН‰ЭA/Z[‰Э)яYаiЋ^е~ЌЮx]hwдzпJsЂж7$КЕЧЉˆjŽXс_щб9е‰б­VЗФъІњ]"ЃCЧz—Н:цiщбЋS^иœНКу5‰Э_›>PkmuТП‘“нО]XšђДжЊ3ДРъ–TSнšъ7љ€ш”ъKdєUdtая[XюШyН cŽџPkЋ ^жОЌŽxUbtkе‰б­VЗФъ^НКф™K§#2њ №­­јўbг“q{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/4.voi0000664000175000017500000002414710513166024021620 0ustar michaelmichael‹4.niiьиMЮэVV€aа@Œ"M„"њHH0 :A+Ђ„ЈЅ#`,4`™b*tр;?>ўліБЏ*пкыцyJЩБ}"е{З–З}юпџfтї?}s7|ћлї§Зџєуoј6ОћзяО§axјiјусП†џљјg~sџпв zџќЗПYўГіїgџ§чННў№ЯЯпџЫяОљЫoОћчќў~њnя?Ор‡јў›­oўdhwЋыџљѓђкџўМќяў§чП]џўХ_§Ъ Md|Ј]АКdДљј4Ђ?MЩъЊбЋ€‘№"ъUЧЋКNћН9ЦутуI 1ЬЂЋИе–‹ОЉЗдCѕш*щ1u uЂ_wт}яЫŽЙ"žВ;ЎЉи\sџ "ЛрВИЩŽИ(bЊ.г>‹.ГфїаjеЃ™ХфY9‹­=ZсбИзНVМФJOуuž3‹ъ"Э‹ш* =Nu­цaцBбГр:ЭCЙйL€_ˆь‚ы"ъUGдЋŽ˜ЊЋдЧ,:Њ,zlЋГ“оzfЮчЃџъgфbЊKDЯ?яG™AgŒ‰1ЏNь9%цеуAfаыa.3гѓЉ.§Њœіыў›‡iŸ.Нь-вМЉЮЮ9ЉbsБ›pR0€|‘p]|ШnИ*Ђ^uЬЃЋДЧTQdе#ІдЈR=ЎВдЋŸыъьЌc‹иХ•ŽЕZKD?kкєVlЋkŒЧќf,1г‹=ЏрУЅPtЋ:;щН’блъь S*6‹ьь”+ž[tvРЏVD<>ВC.ˆxTGЁъ˜EWЉŽXTзшоDшŽYiTЉ^„ЉŽ(X͘ŒщBшХA=$енoи›­c̘v$6†ŠббtГКїцVtї НSѕNЩшіНиНŠЭГчJЁцсѕ Џ”|ѓ|€ggРЏ@|ШnИтЕЊŸБЅЊЧи(TclдЉŽЉ5ЪdGЌ—КџьEhЩŽŠеЯТmuvихOWКЎ^ ЦђZЏІuuvrйиx]ЭNлЗ~mийiZеН7‹ў<›kFЗЋГЃоš•–ižЇжiоќтЪЮ9kŒ-”|WЋ€?МИЩŽИ*ŠUп[ЃVѕГЕTѕ+ЕPѕ”uЊЃ`u4ЂЛяŽъžГW™5ЊЧОѕвєі DtcDВЫФVџеш"у!њ”ŒоЏЮ;R2zёЌвМїЦ”ѕF3:;ъ­Ftvв ›шь swbvЬy1Θf‡|т&;тЂˆ‚еQЌњ‘ZЋzL­TuЃче§gЯKЋTЧ"4"*„/+ЃFѕКВBєЋЏЕийq{–ЭѓЃ~›ЧшhШNлзЊ-mЅy%ЃЊГЫTl^>KЊDяП1e‡ZU–h^.u‘…^,u™ццлRvвЋшьœ“ей1<їМь €xШЮИ$^ВKЮК…VЋ~„жŠK+UЧ&КџъYh™ъEhЬe—XTF‘ъи—Жkg‘ћЎ>ŠЮnлѕЬ+T<tvйбŸeoЄћ.ЙвеЂwуй]‡–E–zSYЌzu%3ъ­Eє4лйYo4g:;ъ­Ftvв ›=/;ш”еRgчœіL-T |™ИЩŽИ(žВ;ЎˆIvЪ)їЬЈU§Ь,U§Ъ,=uZъи‘нudЏЙыъ§ш~ЋЧОRеЭЛАJє:З@sEО)xŠў<›їЊГЋоXЄ.OВгі­жЗШzЏ#KF%~с.ЃЧїнМŒžХw=ЬЂч‡йYo4Ђ{Of/еюСЩ*:;чЌй6\ќВт!;у’˜dЇœsЫŒbеБ‘]єоЖЙџьfsчбэцОЋїšЛЎоюЗњ Йпъ1ЏdtЋ:ЛmOЙЩИЉиќuEw]]БЙжN7ZЖN‡}З/ИШŠЏKT7ћn&іоМŠžv=ЬЃѕЩ]ЧЛЧ№ј[…ž5ЖМьЄћtvв ‹БHѓpЋ}~дIžд+€DqsћwvШ1—sJЌeНЗЈ-’ЭшОЋ7ЃQ$Кžv`oЁ{Ў>hюЗКrtГ>ЛmODgЗэ*8GбйeъЅnПЩо:wПHћ^ђеXд”ubЭъЁdєќRfи‘faябЋŸWлƒ>mwчхдЊ7fбѓYщКyіJ]с|)=нv•šЇлЎRѓLНbH7Яь”ГтщysFММŽГ“оŠYє,Пk•юМ:іd‡XMХтА[Л нqєAsПеЃ›;nзgЧэЉИа%їŽƒшьВ{Н]gЯJзЭ%ЂЗЫžЗg•X2z•лЖЋQиtыEДdєьgnЏЫсNЌzЃБyŒзSЛŽЕvМо›Чдщшqкwѓl’ ьб“хXЃyІ`ђMСdШwїь”Гb);чŒиЪNzЋбм}ѕМДJuьDї\нœоЋ+F4ї[]1њАЙзъ1ЎRѓ›•ЮЎлQБYєЇ™ОЫDЧА]іьИ=ЋТ’бЋьдД}РўЃ‡Fрt7цe[Яєт‹ЌЈЗ6їсt=/ъYєz#Iэ:ЖОѕн<ŠХnзwѓtЯUиЃ'cbЅцIСф›‚Щ|E";рЂ˜dЇœKй9gФVvв[цюЋg™eЊч™UжК9НWWŒ>hюЗКbєasЏе_atvнбŸЄфHяНwдˆŽХIЅш*П6}ЏгJбЯK]G­Ix xNв{‹шygЯбУВyqK&VНбиёЦ“мАC­mz9)=j>[КџВц1;ъЌŠЭЭGM “ MLВSЮŠЅьœ3b+;щ­FsїеЏЬBеЭuюМzЗЙчъfmчбЛKмsѕюXtН7Ч]Ous™{ПwіЪбйu;ОТ•ю;zvX':'їѓ~›‡е’–ŒЏ<>гЊоh я4тIMяэнqOЧАx ]wZд[›ЭcuЕK}zш>zиFwОyмЕžˆЇйYЇTx€oUlOёR &@šxШЮИ"–ВsЮˆ­ьЄЗжЙЊ7‹\`­“б}usž{Џnп„}G7šуѕMnкОэ-8ћ&3ь@s‡ЮŸћ]*КНђ]§Y GЯ_ЕнGЧђЌїgтz –бy]‡ЖГ;žілМџфыxЁw_B;žшaQз>ьвfЫ{ЇfklгCч#=мњžыъмЌSжЯя Элъ*6їџ‹eWСdШВЎ‰бу,ЙцœXD—Xђ˜ЯГЃоˆutъˆMut_нˆю~ЉзЭюХvѓуЋФЌc­кёЋŒžSvVyшyBкУБЛј}иŽєюЪїЃdєnuЯ[ѕСw=?žЦЂѓшXžuџ$_пozџ}Ўу…оыКyg њnžEЯ&Ѕѓц[рјYbЛ{ZН#ЉО[= Fп_=В‹ЮиО|TPБyXџхX!ѕŠ SDvСUq—]qIŒЦгмœS"е%жкГ+NXпƒUšcіfZЈљY[dЅW—‚ббїлвdStЪЮЛ^ч*6пLОЋW \й WХнx’šrVФ<КЦšG,ЊЃBѕ=rн{ѕГqнwu#БHѓЊБяфйM˜rХДsЌГћ§cDьUwМјБWнѕФьTї>ц%Ѓ›DбŸЂр3ВNѓМГVsTњщВym*QНy–WˆnTg›ъ jVЗ_і*ЈW аЋˆR;.ˆxEOѕ]ЛUОЊcжпБGуX%ЊW‰QЂzSXБљ1у]Ћ1 +БWнѓ#Ђ™нѕт4WЈn\MJњRЂ?KншьˆЋ FWyHЮ#+5ЯКjžџH.:aі0§фЪnz+b•]/њ^tТЖК‚’бЛoж§ЋW Р/ "В.‹ЛьŠцQЄ:бнW/+6Ћ•яS…uнhЯpп’ізљ\я7wн$њГ”Œю§Fl§9ЊМ3Э+K5ЁХšŸ­šбїмЊейIяХІК‚šе››БŠ‚Щ№й —Х]vХEQБ: WgW\W!Йниyys:‘цWœыš7cЩjбŸFєч(2‹ШяЫWЛ/zё2;ЯMz+цЦ йQяDЌГ DЗЊГ“NиVWP2zиn!Eд+€‡ˆь‚ыт&;тЊˆ‚йQБКbsбЁU /ЙмUЃыU—Œ.;й _ btС•.ё\\EжižuVˆŽЩt!7щНˆuvшeѕ=ЗџцVu5ЋЗwc “€Oй —Х]vХEГ+Ggg\U0yR2НftСъ’Ѓ-њг”l.Ив‹ыgw™цyh…шЉ:^чЙAgDЌВ+D/Њ+є>дЌJF—§й№Е‰й WХCvЦ5QБ:*WggР/ ф\‹fW\щ"˜ee‰цЭгЛBєцMЉBѓЌКFю“ъOTБОXDd'\wйзФ(;ф’zХдQђ S#КфѓЛт›Rеъвййщт&; [5п”Мсќ{p@ шџы~„ ќ…|Oq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/3.voi0000664000175000017500000003142210513165726021621 0ustar michaelmichael‹3.niiьнMЎ4л™–с( …%šYє‘`tŒ–E Q6ЊЊ0ЦB&рI ІBЮЮпјY+2“:оы}ЖЏЫ>пЮЬmЩїYzcED~јїЕ,эяўі7ЫoџњѓћпўЇ?ўѕ~л~їїПћэ–ЋП]ўёђ?—џ§Ы?ЫђW—џl§ЃхŸ^~ўзГ§gяПџЛіПўљП>~~ѕo?џюПќЭoўхo~їŸџуяџУпўnє?ўРўј‡пџцш—пќ“ЅпЙь>џк~іўД§п§З?§л§џчПјWПB9Iкь †іevФgкньdWЯюјˆЅў6ЂПKrєьŒхFЯŽјT`2_ZkГ>дюf‡| 5епEѕ7ИEfGЯ­yO§M•IбЫ.zjЫЧ‚ЃgW|*6zvУчТšУrрІЕ6;сcэjvЦ‡ZbvЫЋnЊПKkIc}l-gЅл1zrбž•9бэ‡DЯ zGdєqІчцМg•™Н’иœy&q‰3‡yЩЌО^PєД›йŸi‰йMѕЗ‰ЌnсеГK^{6†Dя"#šBtFѓвk‰n›7!б›7х›{бS{оrм;fжМi[™бќKчі]btŠЬъX)ћЦJЪ™p+Г:ц эnvШ'ZKЬŽЌnЊПKdtPuЛФо^gDя#šїб‡ї% Ђg&НіЂ#Іc=5щЕŸ=Еш ћЅ H‰мKl­ŽœЬЅ^Ўб [н^ЦН•qЭБ•qУr ќхh­ЭNјP{˜]ђ‰–•}ЋlIйїФT§LlŽZщЇ˜ъvYъАCqНŒŒ^š—УТ&GЯlzх8ТСб3›^DЯLzУq‡ЋпБYФIl­ŽŒЮЌŽŒомLNљTъ~qУr§%Б€ŸЄЕ6;сCэavЩ'ZVіЕВЕЄь{bRѕ#А%Uп&/Aеэ2Y‡тЖ1-њP=9ьФ!22њљбЬЌs…-пМ›—œц}єМЄзFбѓŠоапсj7gьp‰ЭѕКžФцФ№%xЉѓЊ#Ѓ3ЇzY_ўONљPрI&ђlZ8W‰ЭtЕЛй!Ÿh-*ћVй’Вя‰-ЇњиZPіCbsЬPе]џЛфЌєЖ1#zQ}h ˆю-lѕцў4фD>•єZ~k7Ї_Ю.љ€шя’=;тS‘беЗфОмЅŽЋŽŒЮœъѕЗsC>qm;Хd^эѕю_DF‡‡пЋнЬюxз%ДЕЄь{e Ъ~$ƘъU`k!йыЖќшiEЏ§ЗъЫˆо5FFGTГЂћоЬАƒнЂtѓp‹ ‰~|№јХДЈW‹\9іЎ]ОКЛuЬ zGРІ|$њЛЄѕ^ьŽС™)H\щЬљАдп'Б9тФ}t‹›“Џвбн@aЯк ш%2њБ‰D5/їяєЂ’€v5;уmзвж‚Кя™­хd?[RѕC ЩоД…DЗЬшM^Nѓ*1!њи]ПК{и%EЦy]Їібm}:Ÿ›6дiОХжm^VНыї3“^ыѓМžЗ 6މEolв3“^œZf&НжнІ‹7oЃЫ/ёЭГ4­њё"Ѕz}ЬŠŽ(]‹ЌŽŒN8vЏђfжМщQuŽ9|ѕQНЌц"ЈzпН.є—ѕй|vЫ‡“(ЊЕ6;сcэnvШ{n-(ћйZRі]LѕКЎ…Toѓ2Ђw}б‡ТЄцьшњg˜юWЏоGoЯ‹Sг†іЛђцgTєхuнцaєьЎSћФ шУО1БшЕбn71щЕс=БщЅЖѕќlrзЙNu\єЃzvзЉэP\п%D?^$lwлI‰^ж3PКіЂSў ž™Is§5оё2ЄМн~=;ч ЛЫЅŒш§]xFє§p ‹Оˆ ОJlјёкЭьŽДЇй)яИUЖ ьGak1йЋМ˜ъM^HєЎ/"њ},ŒŒю}TKwYУЂЏ?ŠGя6ИлЯФштЭчбГуq‡шйe'†лF§шNѕМЄзŽAбзБ^}2Йыдn‹{žXf‡йGGTяJWлоьВМо’—uЏKj~,uPђs€“šЗеГ[оВЖ;ышЌљxМHЩююѕЋЏfE_эvОй9я8іьЂз•IбЛ[€ц›ФшИ`€џyvoOГSозZTі­Бe?ћrЊл(Кpѕ6/#zп—} Јю5ЗхИѓЭmкG_CkWЗcєз‹вЭ§шт3НKLH~œWњбГуFqлQ.нМьѓ"Ѓ‹oыФЭ=7ым~Г[Њ›]BєЁ5р0мmy)еїИcsщшћЯœцёJOю:з?gWНАй=nЭ-zЧЊzvЪћžѓ3лТМЉNл>n^дF}НDŒYбНП ˜єОА™Оxє5_Єѕ3Х=‹~Y5Їt_"[TіНАe?ђ‚ЂW}1б›Оъ}_Bt'А|ѕІя^™НЋž7абm}š™\7а‹ўхeЪBЖйy}ЇбГуF6Б!бл/.zѓABєmЉW\іЙicЯшѕ˜д]ф‹mєzЊg—иG—Ÿч/УцЪе›/Ѕњб–}пи:Э‘б“УЮJы'/чэƒЭ ЯŽyлfЇžѓЎэ,ЇLJoЛ ЈNлЇoD—ѕн;O.z[иJ_„Эє]^10SтsнуžGmlIйїОЖ77ыдГ.&yYІToћ2ЊyбыМѕЯˆшЖЌ‡ЛvєfкЁzrн@'z="ГѓКv]л™зw=Лn`з˜гМ<8bЅ7ЛХ’=8жО'>{CЂї;uUэАТЩб•ЋЧб…ГOšыVЗч.}ћд|Ћkюluх“CЮл›ѕMŠОџŒ‰ОVG‡Ы`ыP§ч!њлDFwЯцГ›о“77Щ№“Ф=l<яСю_•aЄПЖЄьG_Lё5uѕ2ЂzSR§шЛџPНЊЛНЊнvб›еžvb“wј(ZН…ЖЏžš6дzбЗYŠ6яЖŠЖ5;ndзQНYс%+z_НњYv<жК4нЮђВйѓЊ6РЂЙWЋщј б…ЋOЂ gŸ4з­>kЎ}§3ЊљlЅgЇјЊKi}ZпЇ§ž7Лч=msЉ49ц]ЛЁ~~Xк`“V§gvFМ‰ŒЮК4}ˆŒЮКуZKlОˆ €žРЇЏ‘žб§ЙyА{§ь[сіqєЕГŸSМ­Ўlн˜R§(l‡Й.Ћ­Ђwй“ЫЦVuЯ}#.њљf^д ыE-ПРwл}9#{6‰шGзэо5ЖНй}]›‹Оop‡шŠеЋАЭž—нЖuЋМeogyйœ^Њ6/ћжнT”lGзЬНКчЃ gŸE—­NGхъгцЊбWiЭЧ‰О0ЗыT;\&Э.zЧЁzvа;{оь ЗlОФ›мђ‰у*зџшnХЋGЇ–вб™'ФИ3тUbsиѕєSdє1{vЯ›"Ѓ—„П€wD>Й;-њU§Ш Њ^UЦToCЊя…Здъ›ЖЋžнsт8Ю›KZ/jР_­Cг\<{гйZFі&ГЕˆь]dk н/ЂkfЏc{ЭЃW]§….§|нvW›ёžиГхэЕRецёxћэфМОэ(ŸхЛqtсюбt”Ў>mЎНF_ўˆJО‹Š]КK=;щЕvœъйIoxœќЃ?јEнЎОцНqЎ?(УsKхшДK›Шш~ѕьЈ—›CnУ2ЋїйГsо–и ™ЯэЋОu&E?;sЊз•)еїШ[jHѕEЪЏн7ŽˆъЖŠŒьUfNі*ГЅTo*[Hі&ВЕ]vЭєv]uНї QНšц~sСшmUPtЏz ˆ^ Щў œиГ_жѕђ–Žяt5›яs‘qо WКrі`ЄkWŸЌsсшх$zvм™Ck§фЅS]нёк? КsЧ’PНz™вМЛЁz&зЎяз_ђоPдŸ“сЩЅpsш)1э*я&Б9ц[šФц%яT~Н$}­ч2л§ЌNhП'оЋ–|н—ђtї]`Bђ#К~шFK™‰Аъћd$e?CƒВW™Че.пFбЗfїuэ#fvlъzЭЂ›ЊnsЭшэЛшох]э+НUсВнў–ВЭзшСLTŽ^zГМўm9ЃшЂk|е†лsсъQoщъ“uЎНœDЯ;г‰­žМФœМWŽї‡ бƒъй]чК_‡нЯ8гЊ^ш|і\ќ9IoшЧ’озŸьсйЅpsш91ю2я*Б9яœx˜ќ%Г:ь{ѕ‡Ьjшx<Д;щйнYwП&=•~•SН‰‹iОє­ŽТтС!‹Л3ЧwПDЖНйMЏ<;еeыз•ћъВkОЎмHйIiушКу§:К`ѕК-ЉљБIEoоEVz7ыХмЧcw.л§Л˜Сxџ]Ttэт~.Š‚WУ•.}bvнPbѓ8zvи™ФцШшЮ§a§ъ“mКnјљEоМЎW:_ун_Ю‹:З[вV§jщj7 ›!Ÿ˜ѕBмqx!њл$6/у›—кђŠП$6/Льй1ШЌ€ЃФGŽЇ=”ўИЏ.Ÿ}‘T§Œ‹‰>,oљтe=;ъЅQoнєс*^№Gч!ЛnєЊr_]љ€<ЌlXtПЙtєаьТЃлп^&E?_EЗ§R/лДšётFFп7ЗЏЋ їКы/‹67шŠСЃомшЊе‰ЭgеГЫЮ6'Gъ‘xо=;яФр{МЪбЯƘцmо§Mёша‘NlўI_šVЮЙЅнŠŒ~C][bѓ’љŸ_2Ћ/ђŠјsJ|Rzл›є–CuDvTѕ­эи\ЗКзšй|ћ|vма`u+GfЂђ|l†a]]8њ™жщЌш§€WrXиЄшБй…ЙЭЯW)бЗ Mgљш[лЎ3"њ0‘б…Я-ЃУЏєEо8К=бr^Dзt]Е:Бљ,zvкиO‹.мYљ­ЧЕzјхGQМœцЬ™ŽŒ>НвЋKєЗIl^NoЛ L^ЖеГ[>YНюž]џ qvя<’~vа;бВ}зЖNsсъnmёшce§шСк–ŽMDхш[и!ЛєxмЪЂФі"zv_з--pЁOЬьy5бЃя]IЭ§Уp§vv`ЯhqKW'",КќY|xЖчAZЮ8њR\Вљ‰Эa7ˆ‰ЭЃъйUЏ$6Ї§mЫУ&7#љKд?eЭŒ…=и}щ<’~vа;бйъˆь љJ[%FTыGїЂvєрр+}э:d—nюGщ§Т&4пЂњФьОЎФ…~ЕвГѓКЁЕЋG‹§ќЭдМО“9ЮŠОЧVm>п<Ою *z]г‹žн6”иœЙв?oЈЫVŸGgVЯЎHlн@›гОђИ‹ŒUЯЮz!2:є/."ЃЗпu„$yVч4I 8і`їЅѓHњйAo84GdїЊВ/RЊwiе‡Ф€шЮ—юХЃ_5—>+Ÿнз“ИЮЏЂgчu%6Пˆž]7ня,^=XмкеУ‰ШŠоЏіфРžГcАjѓљцБDFѕуЂgЗ %6ЖМтйЇC]5[єЗ§m~ZєьД‘бУъй]ч"ЃЯn` KlюVЯNzЧЊ6Іy јњ Бzђ8§<њЄьKdPі:.%{л–Qн™цђбчЭ5Ѓ_4‹ўЕ$6џФ‰žзїуšgЧ$.є!zїйьМЎСкжЎNDVє~HfvœƒU›O7л­L=чбE‰ў.‰Э§ъЧ/&З ЭGйъШшxm:;nшЇEЯN;!њл$6Ÿо –и|r R[bѓВКOŠоЎіь–OфР@мГЛѓžGпŽf'Н)*ћQT}ЏK‘NkљъгцЂбчЭ5Ѓ`sdєьМЎФцгшйmC‰бЧЮ€ъот–ЏюODёъб WŽ>9ыVЂGфьРžqє5{v_зytQ‘бgеГгЦ“Oюd+‡Ÿ uhѕьИ‘=ЛmLєЗ‰Œ>Л>-,2zP=Лъ•ФцЌoгŸ›—е xRє№5ЭH`2ќ yOIo{Гƒ^;$зЯОіeew—ЙxѕIsйъз\4њМ92zv]Ÿ…ў&ЩчбГл†Ž™ѕЋ{k[ОК?ХЋ‡ЃœНžэй}]ƒшKm^єЕzv^п8Кh№—=ЛьDbѓјўЛtјЩPз­§m›37НГы•o>Н<-,2:ё ѕхфЎЋДШшб}yyЗжЈц/‘бРDiOЃ_чtЗЃйIЏt’ЫgšKW› WџАцВбgЭUЃO›Eџz›РЮБ§`vлаqmЊ;QОК?ШХЋ‡`\є*{v_з њБЬюыF_{v^пytQушТе‰Эƒ[№кЭЃГKс§юЫЩPз­ŽŒŽМЋЭмє"П\FЯю:˜МєЋg7Н§cЊgН#2њ~›}“иМОЁJJ{Dz[›ѓžЖ7;шЕCr§ьnrёье\ИњЄЙlєYГш_бisbєьЖ‘Рфmtя}EЧЅM‹NЉюrёъб˜§Ќžзеo~fЯюыF_ЗПйy}чбU‰ў.QУ|7Xтк‹=>SЋgЗ EFgnе‰Э'зL•&/УНК8еп'Гzйщ1Лч‰ЭХoУ‡ђŠ>вZкушлжьœwДЃйIЏt’ЫgšKW› G›ыFŸ4—>k§+ LоDoпеM^і‘е‡Ш„ъЮ—}ЕЋG›F^єГzv^_?њ‘=;Џo}Љž7r]–шя–{3м8*зчЃrudtф]mфзЇgђК›Л^y‰ЭЊПSfѕExѕь$6ќEH{}[›ѓžЖ7;шЕCr@vЗЙxѕ ЙtѕАЙpєИЙnЕцo˜Мl#Ѓ—ˆшCcBugыWїПМшUѕьК^єГzv]_Зљ1йГыFбзХž]7p]зOŠžu.БљьТtvкиItfѕьДБФца­:Б9tзKќъq9TЯЮy“ъя“YН$м†wEF/yЛ@QэnvШлкжьœwДЃйI/ušЋWw“‹g› W'6GFџЌцйe'ж‰)бЛФŒъ}aVє3Д|uџ№‹‹^/іьК^єГzvн@7њЋЖpѓ8њыWГуFбe{/~RєьЌџзŽ%ЋŠQeА9џ1tшН (vМ~Y‡^ыGхkGE‘О—иœљІ•}2НHuwи;‘б™S/sьms‡Ož"џ/rоТ_dfgVЏКЛSО‘и џk5ыN9ЋжКsЮЈ­юЄvšGЏоM<ћА92К;ьK5DOлќюВcЋРШшъ9pg—tЧйНћтЂ—енqGЖб‹-вwd/њQннvh7њЗКЛэа~єИНwŠюЎњ Б9ђ\Z}XннѕVdtцдЛТиЛ_шN:!j‰gљеЁйн-_ˆŒј jжrV­uчœБ ШЎ=нQяэ&^}ЁцЁЃšЂwтЛУоXцTЏњBЂз =_‰ˆЎu§јбгыђ&Dзj/ЯW‡ЕЯЯ•яN;Ж§Sн]іЦQєаvЃGЏNl>КЧЖП=FЌŽŒОЙJtwвg‰б‰Э›П—šЇis4Э}ьюўˆЊъNјNЭКSЮJыvV9 ОіtG}p™цСЋšEџiЯРШшзьоЌЗ6}!бЯš/eDЏ–7-zQнšѕжСЈ‹‹ў­ю.{#юБrw™шсЋ›ŽKнUŸьWž]Ё[фш3ИФцХy)0К†?,Эжћ""yŠќя&Г:тхpW`2—RUн пЉИт{rXv-…ь’къNњhЇyјънцбЋЃšЧ~~ ‰~щ ‰о^ ˆžїЦ|iќшњ§˜KG~ДЎЖrFєfj нМ;ЅЛ›>ЛJєје—‰V§_ЙHuwа)жРш)сАД0ЗЦDgэхЇ№ьюŽЏ%6џuз]ё•zК§шЎ9Ї^tїœёкœPНmПzЏyєъ§fбмrдХDПШˆодEDTwДœЖкаѓЅжІыКкƒ7o'^wаaњGкsх.юixГYннt†шПцбšдМxr'EЯ›ГdmgјUн!чеRwЬIUyеѕЊ;ш„Ms@ѕNѓ№б{ЭУWGFOsePєJFє&0 yк&†D?6єѓZ_Ю9-œА+žт†нMоˆž2Ёе‘бЁїbф‹Kfєѓqе‹шГˆ>Mbsц‰˜9{dNyпПКqL}0:dПzltЬNUе‰бumtа‰бГц„jбg}šФцЬшШ13:rЪ›"чщ‹РdјnъЮшŒ#ъСш”нЊђЊЋђЊыкш fЭ е‰б Э§ЋEŸEєYDŸ&Б93:rіШœђ2чщЬЭeŠмnNнqD=ВW=1КfŸЊМъыцˆъФшys@ѕRtїъХцюеЂЯ"њ,ЂO“иœНT=:щy‘бѓъбAЛ$6O‘;тE`2pšК3:уˆњжш’нъБб1;UхUзЕбA;Ьš3ЃћW/4gFwЏ^lю^НнЛz-КuЕшГˆ>Mbsftф‘˜9цen™ћжє${tЪЩ0MUЃ ŽЊF‡ьWŒnйЋ*ЏК*ЏњК9!zжœPНаœн>{9КwѕJsяъешЮеыбЋEŸ&БYєy›3Ѓ—ЋGG=+Б9sw™UЮй+0љНМbОWѕЮш†ƒъƒб!ће#Ѓ[іЊЪЋЎЪЋОnŽЈžGїЏ^h§1,5gFwя^‹n]НнЙz=КqЕшГˆ>MbsfєZѕшЌm‘б™3SфАP=:hŸРф‹Рd€ЮjtРau1:т њжш’нъБб1;UхUзЕбA{ЬЂЊчЭ§Ћ—šE ‰б‹ЭнЛWЃ;WЏG7Ўоˆю[}sбmЋ#Ѓoю?qtкКШшЬ3q­ztжЖШшШAoБztвЩSцGyХРЇЂjtСQuotЧѕ`tЪnUyеUyеumtаГц€ъ…цўеЂOВи,њ#XŽnОнИz#КoѕVtлjбg‰ŒОЙЗбiы"ЃзЋG‡mJlЮœN37ЎЬн6ѓS„‹МbрSQUЃŽЊ{Ѓ;ЈЃSvЋЪЋЎЪЋЎkЃƒі˜ETЯ›Њ—ЂЛW/6‹ўЃ—››‡oDї­оŠn[НнЕz;:ВztмбЇIlЮŒ^ЏЖ%2z­ztж3›ЋG'э˜|˜ќ^^1pTН3Кс К7Куˆz0:eЗЊМъЊМъК6:h‡YsBѕBtћъЅціеЂOВммМz-Кuіztуь­шЖе›б]ЋЗЃ›VGFпр‹ztмšШш­ъбiы"ЃзЋG‡mJl^ЉѕЌФцЬ|ЪќРц"Џ8Њ.FGTїFwPŒnйЋ*ЏК*Ањ::ЁzжPНамПњvЂ›W/77Џ^‹n]Нн9{#КoѕVtлъЭшЎелбMЋEŸ&БYєy›omќЖ)Б9t{ЩмШgеЃsvЫ+Ћ‹бЧдЃCЈЪЋЎЪЋЎ+Ѓ{іИnŽЈžGїЏ^hЮŒю^НимНz%КwѕZtыьѕшЦеб}ЋЗЂлVoFw­ОСшІеЂO“иœ}sgтшД ‰ЭЁ3uфі’ЙмNГьб9{&ЧUеш„ƒъв–]FЇьV•W]•W]зFэ1‹Јž7T/EwЏ^lю^НнЛz-КuѕjtчъѕшЦеб}ЋЗЂлVп^tзъŒŽЌЗ&2њцŽ—бi›CgъШэeБztвЩЩРЇ о}_Œю8т]mUXu=DЧdз“шŒъК6:hYt@ѕМ9 z)К{ѕbsїъ•шоеkб­ЋWЃ;WЏGї­оh­нЖъцЂлVoFw­оŽŽЌЗ&2:ђxЩŒЮœ™2gъШэeБztвЩЩївz€Cъб}ŠЊЫэbtЩ~ѕS]OЮйЅЎкcP=oЮŒn_НдмОz9КyіZtыъешЮе7нИz#КoѕVtлъЭшЎелбMЋ#Ѓo№E=:nUbsftцЬДV=:ы‰ЭЁ‹bц‡г“ьб)йъЩ Uuw_9йѕФшš}ЊЋЏЃЊgЭ е бэЋ—šлW/G7Џ^‰ю]НнКz5КsѕztуъшОе[бmЋ7ЃЛVп`tdѕшИ5‘б7їN=:mCbsшxК\=:ъY‰Эг,{tЮ^ЩџoЧо’Ч( jБЕџ5Œе=~4 J УЁТЅ3#ˆяѓAЂЌЉКОЁъouR{}бн2­*/Л*ЏzлQНЈD/_=j^>ћ zэъЃшЅЋЃWЎ>Ž^ИњAєКеЂ—­~НjudєпюИ#‘б™;ѕХ&ywиC‰ЭенQЯ&пvен9гђŠј1UŸ$ѕ\•U]КKце1/ImtїЬи6GTяЃЊбЫw›Џ>Š^Књ0zхъуш…ЋЏНnѕЃhе?JєЫ$6gFgNђЃъюЌ'›Coћъю 9Щф№SъўTwХ9ѕ\wн!'дЇю”yX]џъЮ™S[нAvЭ еƒшѕЛЧбkW4Џ]}НrѕХЂЎ~­њg=Š^Ж:2њrŸbwк‰Э™б‘gІƒъюЈЇ›oЁ7Ха? З[м~ЗЊћs_sдЇю”iUyеЕбн3eQН‹Јо7dЃWЏG/^}НvѕQєвезŠ^Йњ8zсъб™енiЧDПLbsш$Я<щЊЛ“&$6яЊЛsІх№ЫUwР7TеџKŽњд2ЏЋы_н9SjЋ;hЦ.:ЁzН~іЈyљъqєтеWŠ^ЛњRбKgGЋўaЂ_&БљZѓЅ;ы‰ФцauwвŒРфлІК;ц„Мb~Йъј†ЊК/нЇд‡ю’yUеX]X]елцˆьAєњеЃшхЋЏНzѕ…Ђя>Œ^Йњ8:ВК;ь‘ШшЃъюЌЧ"Ѓ3‡bцIo_н4'0љ.0x‰Њю‚ѓъЭ}щю8Ѓ>t—ЬЋЏКcfU`uU`ѕ6:ЂzPНoЈE/_=Œ^НzНxіQДъ'њe›3Ѓ3чЫЈК;iBbѓЎК;gV`ђyХРKTwР7TU\xНы9Ё*АКЋЋЋ+АКvК‹&ьЃЊбыWЂ—ЏFЏ^=Ž^Мњ :ГК;ыБШш энQO%6ЊЛƒІ$6пBЏ/йнПVUwСyѕцж]яКCЮЈРъЊРъ ЌЎюž)лшˆъ]tBі z§ъQєђеУшеЋЧб‘енQЯDF_fгыNšиМЋюЮ™˜|˜ пQе]p^§б]qNНы9Ё*АКЋЋЋ+БКЖКƒfьЂЊїбеƒшѕЋGб‘енIЯEFgnz™ѓх–иzвћШюЮЎЂЊЛрМњЋ;уœ ЌЎ ЌЎРъЊРъЊРьJЌоFGdяЃ#ЋЛƒfDF_bџшЮ™”и|ћ’нrN`2oЊ;ръЎ;тЄЊМъЊРъJЌЎЏКcfUbu%V‹~™ФцЊЛSNHlЮœфР%UuœVwн'UntXx%V‹~™ФцъюŒ“›>Uw№ƒўфЮk˜q{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/23.voi0000664000175000017500000002633610513167364021713 0ustar michaelmichael‹23.niiьи]Ž,GZЧсрБ K\"dq„лрЦш1BŒЭАVРZИ€ Ь&[сКЛО2ђЃ*ѓŒЯ‰јЗŸЧВ;Ћ|$џъudDVџ§/ІЉ~їля>Lпџъ7Пўхїџє›_§ј}§№Џ?|џуtёлщЇџšўчэяiњХЧ_­?šўєучП§MћївќнŸ§їŸџѕњ§‹џЛўќнПќњЛПќю‡ўЧ_ўУoићУ'ќј›љнклПљ“iЛsZМџŸПoпћппЗюпџЗЫџц_ќеOP№Uя` ѕЎwФ9uг;ф„ЊРъФшЊРjбпJxtя’3›ЇФцKuя~NЊЊwТIuг;ф„ЊМъЊРъ ЌЎ Ќ§,›#ЊE+iНвЃ{Їœ˜<]Ћ{Gœ˜ ?7Uе;сЄКщrFU^vU`uVWVŠшЬъо=‡DFЏВ{ч”нцDЮИюнrTі {‡œ˜<нЊ{Wœ˜ Р0ъ]яˆ“ъЊwЧ)X]X]еUеUйЫhе_Mdє*ЛwЮA‰бA“ОХЭkЧЎi1фоEМWцЌ‹ЋUtя C‚юП‡До‹Фц[uяŠГ“ЈЊо ЇUхUWVWbu%VWbuxtPuUbі'ЈŽщŽŒNY!mfbtЪђиŽЛy'zpŸ$КwбaЙ‰ЭЁпX"ПаОUїЦWo.CNЈКUптTbѕ,:ЇКЋЃЃГЋ;чгFgV‡D7е)‹њ]3}TЭž1зЙkз"2!Кžъ]З'0y;КwгKŸ%КwвЫНЃwЯ!QОKlž›s2|>UН NЈkmUNvU^uеНКbЊgб9еЕuBu%ŽКђЋGŽžwѕ7Sѓъ”ш)*zБ?W3ђ!5‰yЭo‘ЭЋѕ0~ђГшоeOЄѕ~HlоЊю]t@XюU`rћ-+G^1lЉъ]№Њ‚ВoЉ•S§H­JЩž—ІEзьКwвkЕѕје•3ъGзVє ебУzžеT<ъјшІzшшіеЃ:!КнžgњЅНАБ”cš7Њ{Їэj#у’CІйМнЛъ•Рф˜нb!Бy LžТ~ЩOUя€ѓъMя†гЊRВU)еѓЮ”шкˆОКщЌБЋяYMчибЕ=vѕЌ*fдЕ]Ыƒ‰nBЧŽn_нKsЂgЉ7/Ѓзе}ВžkNэЧеаЭWѓФАфХ гœЖ4rŠїš{WНWќ..ј]`ђ4і“ѓОИрwЩyЊwР—Ј ЬЎŒъYфћeDѕ<ВЎzібTVHuSYCWЯ—qJt­ЂЋy1dѕFt5/nЊGŽЎбУUoGWаЄче9бЭЂЖyѕ$—а<­Ђš7є‡Oо’зœ4цѕѓЦ№Щ[]яЄ—>GsяЂзвz/“ЇХкЩSш/э€ŸJѕјЅњ›IЈЎUфјеUееT_.зc0Ћшкš§`кШЪЈn#Žž5•UуV7A1б{ЃNюеЖЋіЊЧnо\е#ЯљeєЯдЋQŽ>хOHУ7oќяПyа<эЌшN5=ђюР…с7чЕИфЪKŽ\ЫSЬ–Б˜<ќžјšЊz|‰ШъR§•дEћVЏ˜ƒЊЋ7ЃGWлеc†EєхчшƒoЃkg№ƒ§ЭЬ++.КvЗ’ЌN’шZММ–ŽлМŒnVђ ЩЏЂ{UНАJ ‹ЎЧ;c7ЯЂяWїћАcж MєјCОˆŽNjž=55_ЂУšW‡`яœcт‚?&OЗу$M`2 Ћz|‰ŠЉž…VFu}˜ПьsHн4яuЫ9ІЖЊWсб9е;бc‚ЭшбЧО=ќbYD‡Ќ№&3ЄЙщИyєЈј YяnэŒGl^EOЫе<`ѓfєрЩгќшИ^ŒŸ<‹ОGŽпМˆО)c?§/Ђkc™gkU =mFїŽzeО’cЂ#Ž“•ˆуd%ЏxкўeЧј“ЇёПЛ\дЛочдUяŽ3ЊђЊ+0К*Аz/zшА=ідkГz№ЕВ=ќпˆџЎ\GпМ^Эз›Ўj?”eгVtЏЖ]ЋЊuuЏД}Эwg№g{W{1rђЊѕv5іЖБ№у­a“ЇЧіёXјІ=E†^Ъ‘бгVtяІ—ц›EJѓra$Omtя–у“ЇБOП}ЩРЌоєn8Ћ*ЏК*ЎК*::ЇКвЃgеc€эшСЧ^[еЃЏ•­шсјFєјwх:zќцѕ˜аМuDђДYн;iЅйиЎ?Fo~ьСЭ7ј#HЛIмoНБPл]т~9іЖБ§ўГoкОeєШЋтaБЈE5›ыЃwдKэf‘њЕp№гoGbѓќO˜ ЃЉъ]p^U`uVWVW`uFW5е—ƒ€Њ­ъСЧО=ќZЉъо]OэE]НŠh^DWФъX:Ђy9ъС“oqIбїКАцэъЮajБ(ю—Couеœ їљіVпИ=ѓТйЮм;ыЙUєРЋт.2КYд1пZкл.ЃЙёѕuяЄrVђLdtЬнзJlN8`tUе;сМЊРьмшК\ѕn9ЌюеI#ПWпу{аŽКЂЂыq5~uеККwг+5ЉЎЊМQoGїЎzЁЖєŽz%Бy#КwбОG^Xѓэ))ЋycдУži/9ЭѓGЛaŸІwюНAkoцїођ$ZГGЙ”ЇЃыЈл›pјццьнr\xtя’3’Ѓ{gœ˜ РчVНО@НщнpZ%VзЕ:*НЎеYЏFяšƒjY^+Н‹ј$бедФш IkўF’’яu9ЭГОАц­ъЮaOДiЭ5Хn,“Ђ›зЦДЈюsTXюUZ/@АzгЛсЌКшqJU`u%VGD_лjCпА'овЖz‡nоŽюѕJm­ŒоQЏlEїn:$2zJlžšьо)'D7E'ЎŽ”лАЩЫHžšТ„рwѓЬˆ)П›…Ц4ЯЖхМфŒ№CbѓЊКwЮ1ЩSЛуХHыVUНh"ыЊ[Э!‹ФJЈ^V@ѕЊ0)њоXуWW-"šлшїЮ€цetBђ^sяЌч›ЏKVѓДБgфD‡œоГЪ„шK\жЄg‹љў:Ёљ~NЭг#Бйђzg=7Џ In;Cš›GЙМцœcp#КwбЩaЯGwYЕWyХРЯVUѕN8Ћ>єЎ8ЇкшˆOPmt-^Љ•Ыз#ЊРшЊeѕъSŒЇ–еЭЯЂ{ЇэЊ}Нгі&яFїЮz.Бy;Кwд+ЗЪЄцљѓнјЭЗКGшјЭг"5ЇyqhоМБ*bšГЖкЌю]ѕТ|К)Э›ч`яІ—“ЇUuяœcђŠп…х^ф?ъpZ}ш]qNFWхUWЕезŸC„ZD'ЬНvЃЎЎeu@t-Ѓ—+|DOЂ{ЇэЊЅ„ћp=~ђ~tяЎЇ>OsяЊВškyњe4/NПс“gЯќiЭ[Ѓю]іФЌ1Іy7Кwзs›еНЃ^™•Ц4omЯН“HlкщцђŠЇKtя†ѓ“јyЈъ]№%*'{–]zWœR•]X][еƒ€ZDзѕнЎQ/TЕеџ}БlEОТ+0КіЃ{Їэ[E6Ќ§шо]O%6яDїЎкRїу.&yў“|O6Ђ{Їэ ^тукuяЌчЖЃ{WН№ШЬiž=х4oэЯН‹L^ХЪ˜љk0Wѕј"”]З茘ьЊМъЊІКoЬAUMu„кˆОПжеУOНжбу/•uєј МjQpWж2:ЏЙ›vьРфншоY[Q9ЭГЃ#&yўšR<=‰юмѕдЃ01:ЈyНјо2Њ{dЮœwЂ{GНtыLj^?к%Hl[Ь7ѕмЛфŒЈXрЇWеЛр„КеVNvе-ЖrЊы^]9е•X=‹ОМьsTЕеГ^G_]еTg,ы6К"ЂЋ‰NhЎFDs-$6W@ѓNtяЊ-ГЊ˜цйyЗЕžЛІэ{ЄLјцQ˜А.ЎіЂ;g=ЗˆŽ8OбM}зЄзюƒGїM: цЫтђFяЄзVї_@sвІ1Нќ~•"0ј™ЋоgTеэЂoШuЋО_ŒЏъ[‰еTНˆЮЈЎФъyjLєМ:rд1ЭЋEнЛчˆКGч5?к‡і‘иМв;jгЃ*ЇyіјЙh7yž6ў€ovЂЧЎ^E_Ў:q~ xєA? gЋbєфЧњHjОEїЭХlШъФцYuя“ђŠrTеѕЂoЧ)u­Ў{§јЊЎЕЅњ+kЃЏОпЗиПњбЗѕШеЫшˆQoDЌъG^;щЎQ‡н&г\ Н{‰kО/‰ЈцЕ1ыjcЧM~œнг2zdЗGчiн9щЕЧR˜­ŒоQЏЌNС€цiѕd—реммƒНSŽЫйшf"ЃƒЖч™ФfОЎЊочеЛыUч”уъ^]едйUпЄ—fЋтzYуW7~D]=+М]ж№еГТлe _=+ЌvдНЫіеУ=vєцІКе;ьЅФцъоA‡ф5Яb’›­nјкэNнN8ЃyЊѕН7|ѓЛЈ!п&н‰k#sq$ЎŽ)рћЩ–ФfОЎъpBеѕGU_cы^‹­{uРЬлшšц3U;рХЬGЕ№ће№бUыQзшеUUЫиб›gб]Лz—=ЃљлhяРŒцхix§НЋž[lЃч~ШZЪšПФцEtШїУД!_„Gї.9!Б9р[е–Мbјџvь%ЙQ ˆЂ(‹Э§ЏЁ-Z] мЩsœ34ЛQ‘ХGUЫiЙPKlUPѕ>zЎОњYєнWќењŽОџœ|k}хww}RЩблъЛGзЦюGJДцЄљ?ЩЊ}њЭб‰Э‘Уqˆюю’иѓІБ˜<э^Ѕs$6g§бПDЭ‡YwЪЈgj­КsFЌЁIбЏвMѓэЛOЂяПм›ѕ ŽЎз”пеkїэЖтН›wи˜|Н>гo,j…‰ЭЧщшиќ=К;gLbѓ”и<&я>U‚$6|ЁїQнзЬЙ5ыNѕL­UwЮˆЕД*'ЛNЂo_}}їъ ЌЎРшmf`ѓ^wи'ПЈЙ;ыГДоY^qfѓa:К{F$6gNЧДЖ%Пc“šГVx РэTu\3чжЌ;eдвZ•“Н–ж[wв?еIєэЋ+Бњ<њжеѕн]Ÿ$6џ-К;ыЃДоYbѓї›\Dѓ!КЛgHмhL™Эяwб цЅzJй‹Ј ИJš Lе|xшNЕДVeЏЉT]‡ш€ъ“шлWз™юЈЯŽЙЗO>FwїŒ›‹ЇнTфEOЫc1@bѓ”иќ~GЪI^Ђчю+›Ї”ЛмNb3РЯЉљ№Ѕ;dмГЖžКcе.:Ѓzm­ ъ:ъNњЇДо‡ИE~ˆnžršЗЗɘцэ%%yž’’_УЈцЄэїннpY`2љЊj>TwШИкъŽTб‰ЭљУб3шU›“МFЯн)у–шЄф)mšgЩKtwФeЩ_бнРЊЊю„‹jеrAU^u`rnsкFЬ[цiюЎИ&0љннpY`2фЈ‡юˆkJѓџ˜<&Ew\єMОM q{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/22.voi0000664000175000017500000002665210513167326021711 0ustar michaelmichael‹22.niiьи_Ž,ЩUРс4№€XХH<"4т ЖСЫ ААиШfЌ€Е№№&[сІКы_fFDf™ЙuЮiŸ5КнY-љwNDUпП§йВДпќњЛЫїПје?§ќћје/~љ}ћс_~јў—ЫЇ_/Иќчђп?ўЗ,?ћјпк,ќёчПўењП­џ›?љЏ?§Ы§ѓOџ{§ѓ7џќOп§љw?ќупџќя~§Уш‡_№Ы_§ђчпэ§јЪ-§Юeѓќ?~Л~і?П]џмП§іЏЗџŸі?A9Р ZtРя ŒnЃ[СшV5:Ксe5›Ѓ ~›€ЏЌЕ№Ђі):у­psЅhЭoR1КbsЩ›Ѓт НLЎјцН\ЂЃ ~ЂxЛvнё‚жъEЗ‚бšпЄxttЩy›эЦЛTl^ &_ЃЃ#^UБYєл”мщЅbѓR0ў_к]tЩimе\ЃЛ­Ђ‹L{3ш‚бEіzЕ%šлzа%šWcЎr л.:Кш„ŠЭХЏшлwС=ЇЌ?p”ŠŽЎx‘шwiЋ[ХъŠЭзъшnZkб Џi7б!чЕі]#М­š—ѓnm3ше­`tПЙTt;Єп\2:КjЎbs?::ъШЊДHѓВnъЭBˆўf6gЏDѓц V!њm*6WЙ1Ж &Zkб Џi7б!чЕчцс­=G瘿Кy)Б%­`t+нЖб.‘mt…›ЏD‡Эєw#wєАЙHєВПќ’Z'Šўfк8:ИlbYЂЙџQ)wђ2ЊŽЎ:Pc‹ЗJFWйу’бU~)Е›шѓкss№ЖiЎ0яж‰N^н6ЭЫѓзYmЃЫ5ЏЂѓfЗItкъqѓ’vдУцЫ7YG=nЮ=Кэю…рОЎIѓЧILНљvѕ8™сB‰nшшМОнСЫŸМЛё _ ЂЃГьЃЃ‹ЮЈБ[%Ѓkќ~ЕW2:щ'#8дnЂCЮkЯЭ5Т[лDШю4gЏnнцмйmНў$Е^ DЗatцKdМв‰g]1z“ќМбiзzмœј,4чЌюЏГшŸо*Oє7ДъЋ‘МНђ*_ ЂЃГŽlЂЃsN{ŠŽN9ЏЦJlдŽŽxYХf~rэ*КуМіpљ&:чŒЖj^JЬЛЕЭ ѓWЗ‘шА‰asтъIsоъmf…ш§lѓWwіЁР‚Ь4zйНVЋюн%бqћађб9ЋšSF5‹ўЩ<х•ižEGЇЭtЂЃ“ЮxŽŽn9­rєRЏЙNя‡ŠЭEўЁ œжZtТKкГш˜sкVtаБMo‰ьн˜ TšSW›WOšгVO›“V4чЌЎ}иœВКфЈ/Оbutн€ш7)Йгб%ЋЃы:‘Йƒ?T˜ьЮ-Wє7іXŒ*бЗЙhєRБ €vrZ[‹Ю9ЃэE'ыDЇЯю6gЏDgЎ%ч­žЇ­>hЮY]1њА9cѕWNX}";КАЇ…Gѕ>zѓ$:ЏЏ7идбЛЙЖћ iЃgЫЕљ3zщGЇЕ.P]5zсeЗЮ-Н”h.wq|ЊиМ$~О™жZtТKкГш˜sкVtаБ]r‰ьnuіь~tђъAtъъQsвъЊqsЮъYoжшУцŒеЃO4­Žnм+Y§uЂ7/D7юL&[*zїZ`^з|ƒ“VЛŒЩKЏ:Кш„ƒQч$њ]ъG~tЌиŒЏ*6/їьшŒWL€$кMtШim-:чŒЖtЄ“œ>{аœМКцЌkV—мatЪъЯЈqsЦъYmжшЭљЊKFзЌўBб›WЂ#Зf“M[=]‡RбЛъШТŽ~єfCB ;FбOйЁ}]уш„Б7%ЃПЮщшІC›П@єЧЗбEg”ёCХцх3;КJjб)'Е­ш cЛфќйнффйУцФе“цДеŸeеЊ?•Ќ.З!•ЂoQЅуЕjжœ.zZАzI§ёiВ%ЃѓVЯЂ—ZблъаФНAє*;4АgАѕn­њЇUБЙдЇЛЛ‚ЩGuRѕŠ—nttв ЯŸЃ[^R0yyќЊБкEtФ+кГш˜Sк^tв‘NrњьAsъъasтъIsкъisвъƒцЄеWЊпЅSš6њждnжъЭPз™™Ѓ‡k\2zЙ|‘Аz}ћ‘ЈКAєІ:Њn`Нъ.Зz,ѕa]Г::nф‹EG—MLОџ›RЉцСЧМшЊНцшІCћшшЂгŠх^е+р j7б!ЇЕЕшœ3к^tв‘NrіьArъьIsкъisвъƒц”е‡ЭЋKFџ˜}ћsзšЙњЊ3пєбнЅШZНЮыWGіѕ\›F0чЈnjбOеС‘[чЂ“UЯЂгŽњ8z)§ЈŽм9Я™QЇS2zXp•яn­2уЗТJЭї[ИRs?::ъHЇ9:щДZЕ7ѕŠјrкCtЪIm+:ши.9v79yіА9qѕЄ9mѕД9iѕAsЪъУцŒе'ЂѓUЯRгF/їІЮ|ѓVпTŒюnrђъўљKНЉTGWntkГzvдGбKЙшЧЈЃ3зЃ—„б'ЋЃ+7ŽЃ*=ЈЮЙЫwї‘V˜№ењРUŠ~|U'њўE‘ц^tpбЋ_ЗBK  іrRлŠ:aз\ Лзœ={аœКzиœЗz’œЖzоœГњЈ9cѕqsТъYjНшчзЂ#ЧЦ“.ПzЖдYЃ‹ХOѓшЄеНшМЃО Ђ—Дбmђy:oєа§ѕшЪЃшЅFєѓгЯ ьйцЎŸGUщ7‰юНsЪ69ѕ€oжЭЙ—тюЉrИ(щ<нlU’—Kыў+рœі,:цЄЖнsЪ6КBіО9vЗ9yѕ 9sѕ09oѕ,9iѕArЪъуц„е“вкбљЊ—]т=4qєM­Q_}‰ш еНЃ˜~ЋїбЯебuЃ;ЭЯебy]нцФб§оMutфж.ѓщсэЫРМЎ^rіИt›гюђUПљў9*ЇAsn›“/я@Хцъш(Ћ=‹Ž9ЉmEВЋЎНЮ_нiN_нmN=*Ю[=+N}œВњИ9aѕ™шtе%Ѓ‡їsюш›нlЫEЏg6ЖпуеУW.КFuчIНk^:Кn`§\]зеI^-Ht_G?љQнЗЗым,HFуУ—Иzз\mвO>ў NлЭ5ѕˆЏ ,У^ЩшьядќОiбЏiЯЂcNi{бIЇ”ЬЎ9ьŠецєй§цЬеЃтЄб“мДеЧЭ ЋЯDзЌŽnьhћ№ѕп%я‡ЈqttйLХънЇnлНў|˜;zйн"ЋGбmCшќеmVм6Д^UЗьšWWHt]_ЏљQ]зеOЮZћa˜œ8zвœ6Кbѓ(::kЎbѓш‚NЎVэ“ŠЭЫGvt?Ёі,:ц”ЖtЄ“œ>ћ3АVѕ­­VѕUНYF›]558Œ)Ѓл№ц­žФц­>]Г:КqЏ[™Оzй‡Џž<о}ђшяCю1–И^єЊ:КАgНdŽ,ѕ’Мzј™4utбъNігурЖ‘щaŒŽш5пГЃуЭi{/†Э‰ЃПRstзTСфЩЛxjѕŠ?д+ўPЏјCСd€7iЯЂcЮi[бAЧvЩљГЛЩЩГ‡Э‰Ћ}•ЊяJЭњSЕ Yf‹]Ж79„yЋПlt‘ъх DЇЋьУњЏЙ5Zтѕ7б•_'zU]и1Œ^GWGіЂsW?HЇŽюe?Ї Эі:КmЄгц~4ЇŽ5—ŒŽюšЉWМ”ќ‡ƒ’џєxQЏјЂ`ђEСd€Зiб)'Е­ш cЛфќйнффйУцФе“цДеOq…ЊяJЭњSЁ ЙvекыimхшtеƒЪ’бЙЋПTєR?:Yu?:љЈЧб—–lб'ЊЃ ;&бKкшЋIupйЬИ:8lbВ!СecуНЮkvгЊ­љMЪ_” ўP0љЂbsўЯF‘кCtЪIm+:ши.9v79yіА9qѕЄ9mѕS_ЁъЛRГўPjC>ЃjэѕДЖrtКъQe§шlеУ}(Н$ŽОK<ъёЄКНЋЎмDo$:smН$m>U\иб;vвœЭw§Q/ЉЃ‡’кW‰Ю_]БЙ]tBЉиOХ&ќЉbsтS“/ъ%Е›шгкZtЮm/:щHыEчЮОдuЃgOšгV?wеЉ~Ј4ыЋb2йщœбГиЌеѓ—ŠўМгŽzОЦIЃЎЙЄе_/zї—HbКдћбЇаonлc#ЗблъиШ­/нVЏGn ЃŸЊƒ;ЎY“‰эыКѕ=Z“юDЯSjъіEF]tТ.::шŒVh+ю*7—ŒŽюxMХцЌяиРд.Ђ#^бžEЧœдЖЂƒЮиEWШюDЈюuGQБКт†єšгWяssWfœИКП™ЃХзжЄегцZбЋ—ы†fЭYG]0њ`;*EЗѕЫ‘ƒцMtВъQt[ПЙ5Œ^WЧFnŠŽMмлЗюЋc ;:ѓЭЙЧ+зОrез?*E_=—–‹~TGаъ,ХƒшЗЉиœѓCшЁ‚ЩябЂSNj[бAgьЂ+dwЂгgw›гW_”ЌЎ8ы}pъ~tђъЮjЄю.tіъў)Ь=И:rztнeŽ5gŽ%gоqsвшо LнO^oGЖшQѓ=ДVt{њиЦ]i/:6qo?о§QLЇГљЋ{‹œ>z[§ќ(:mlГШOебe‡6wFЩшZэъш—”ŒЎrelLx“vrZ[‹Ю9ЃэE'ъ4чЯюGчЎ4чЎFЋўОJѕ’ОК;ц’бйЋ :zt Szxu$Ž6'Ž7чнIsЮшnpюшaВшŸжОs_NgИщ›ЛПƒ‹ўКg/{єЄ:ЖkЊЪ5Зб­NЏdєR2zЉи|QБyЩќ @­Еш„—Дgб1чД­ш cЛфйнцмйЃфЬе“цМегшЄеѓцœеGЭ)Ѓ—[V­ъЋ/ќУШhЬ™ЃЧЛ‘ИZє›LnŽЄбƒтћ [з5L~МэФvl3їбљtF+њ[шэ№’Мy6г^r7Ђ“ЖUчV2КЦЛЩ^ѕъш’—Tlрыi7б!ЇЕЕшœ3к^tв‘NrњьAsъъasтъIsкъisвъƒцœеЃ›3V—ŒЮX}b9ђE/ї-(ГбŸ.aГшМсЃg;дєцдй‡єбЩkn›‡БmCнЮмo^r7/нцЯЧqQG*\o{ЂпІzutЩK*WGWРВДжЂ^вžEЧœгЖЂƒŽэ’ dw›“Wš3WšSW›LЮZ=nОчЌž4Œ:eѕ4:щ‚Ь›“.ШAtТтх8:х‚œˆЮч0:oѕСeTХшђЭ›'Сi#Нбk^GЗє—8urя о‡ЭК/jGпОŽ:Ѓв€яJ­Х]Щш{vt№.э&:фДЖsFл‹N:дiЮ^нMN=hN=jЎИzмœЗzж\3:iѕМЙftЮъЃш”е‡бЋEПYХшNfХцлУаЎ‰С>”jЮ[њPщшн‰~—кбй/ЙguЦћЌbѓEХfрїK{ˆN9Ћ­EчœбіЂ“ušГWw““g›3WWŒž4Їž5‹ў M›KFGЧ ЬДћ0:cЕшw)§ЉZ2zIМп‘ш CЅіјЊжсЛњ2ббM‡*6їЊЃ‹NИ‡щ§T*€oЊ=DЇœежЂsЮh{бI‡:ЭйЋЛЩйГ+F›WOšѓVWŒž6g­ЎUћщ`Ц9лЖЃftЪjбя2ŽM}QeР+ѕЂ ­ђ]ЅѓwWБЙфoZ5ЅэTGQ,їЊV-пXk-:с5э!:хЌЖsFл‹N:дiN_нmN^=hN]=lЮ\]1К•Ќп‰Ѓ'3ЮZ=]zб‰—КbєAsЮъŠЭ1Џ/дœ:КbsЩхшWG7ЊимЉŽ:ЃVэЭGn­dxжZ‹NxM{ˆN9Ћ­EчœбіЂ“ušгWw›“Wš“W—ѕpжб]3ƒодбУ!ч­ž­FЙшдK]1zкœЕњыEGЧ е+^jОоЃ—BЭшЅNsЭпZ:ббEgl$Кч”J~(˜ МY{ˆN9Ћ­EчœвЖЂƒNи5WЈюDчЏюEgЏю6чЎеfŽЯ8quНеX† ;{К[єЛŽож9н+5пЃ—:Щ§шшІcћ§ˆ.:сZЉy;ъшšГ*Е>L8дnЂCЮkЯЂcNj­^uлŠ:aз\ КZяХ*Иjt…ъѕfй^tњьЭЌqGбЉЋEПЫіжЈаМЌZ—"—оfРŠ/vббAg\+K5яFsвц(РяжZtТ‹кMtШyэYtЬIšпЃbѓRЏxп\"}]cрыш{вzбйГ‹FпKЏпˆўИ-VЗGц%ІЛUc'ЖjœП‚яфEЃ‹n5\k-:сEэ&:ф­еЋn­^ѕso•ъѕŒE;ЃЗGАDѕюоЈ]ђх^ёбoSВКфIЌ9ъЅb3…Е‹шˆзД›шд+^jFWl.]ЋКrttЦ‹DПMЩшьш ‹№эС!€ џЏ]a`:цq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/21.voi0000664000175000017500000002541110513167274021702 0ustar michaelmichael‹21.niiьиMЎ,WV†с( …%šYє‘`tŒV‰ЊbŒ€Ба€ д$SЁ>?™‘‘сВsэя№<іѕЭŒs%ПwkХо‘љЗϘІњэoОy7}ћЋ_џг/П§‡_џъћoыЛљюляЇП™ўpњЯщПј5MПxџgщІ?~џ§_џjљыоПџЭŸќзŸўхњњ‡џ§ќ§ЗџќOпќљ7п§упџђя~ѓно>сћ_џЫoж~јЩMлгнѕџјнђкџќnљчўэw}џџќГПј Ъ€Ÿ_НщŽ€ŸHф0Gоƒ‘;Gb3РHЊЊ;сЄКш9Ё*КК;фЄЌш˜аЙœхIšŠ‹Ш[0rуˆŒн=К~ŒШhnЊЊ;сЄКш9ЎfК[§w#оBГЂCJgЂЦтSо=8‰~ЁЯиЄфФ‡Л)4:l0>YjPŸК;ŽЋ›ю”УЊђЊ+0:П9#КDПЦ}sdtwЯ!ЩЂ_'7њѓUsЪqI |Y[н№#$63Ёy#rјф•Н1ТїDПJнКЛSNЪЬN9T–"ЃЇШшЬm$ђhМVwgœ=%6ПUwьЋЊю„SъЊЛфАКзєм*9 {Гy№ъ/дuwœP]yЭЕа]sLU^ѕ}sBїVѓшсЛЭ#W'F?h§SJlŽŒNlž‚žLЧ_ж ‘бгЅЛЛтЌШъф ЋŽŒЮЌЮмїTПLbsє г]qZ^1_OНыЎ8Ѓ*ЎЙ*.КВ›cЊЋђЊkЅЛшЙuѓјй›Эƒ—?hЗњЋ5ЧDЯ/6ЇэкYнШшiфцuєь'Yeмwwт‚пDFOУoo;"Ѓ3Ћ#Ѓ3Ћн‹/­њu"ЃЧ~€о•и РWSяК+ЮЈ‹юу*ЏЙВ›cВы^wаЋц€ъцсГЗ›/=jѕFdXє§еЦЎGі†aфц§c%2zJi6s)БYєЫЬƒsЊЇХ*gVЧ§2‘б™е‘бc?ˆюЪ­юn8-2:щЩ€ЃЊЊ;сœzз]qF]моі=WЭЃGW`tmыЮz(.xкYчюЈ'ЬЦАщ;ЭC/јуц„шеЅоЖ=;Ы:tѓДн<}КьЯoFѓЊК'щЙ„­bEє‹d%wюЃSГЛƒŽXдІDп}ž ‰ž’цт*2z№'К=‘бC?†ю‹ŒЮЌŽŒјs ?VUwСYѕюњІЕх ЊyєМXЕбБЬSšч^VєќuJєќuDѓДёdнVsањitќцЅ˜цеxД•œpнrЪ,3І9яєw™еЏUsн1еНю #VбйЭCWoіŽ]Н_›и<АФшДa~ГюПzsiGЏоˆЁЋwЧ8'њ.Л­ъ‰А]у]м^їf3zєьKbTіnєШезОИш­ъюАGf…ŸЏЦož?d,ЦЛ9ыБК[ълo[L№­КЕщЉUєшСo–{ERєЮЛq-*Cš—Э!ЭЋ•ю+9#Ѕs!fu"ЃЇШh XЭuЧSїКƒž[%ŸН™#ГКoAйЗКœшy]}>|МПn+:`БЂC—Ю ={›c&‹м>ђОК{3ўЉН!рYc[dtшЩРT7н)еRwЮЕв]єд:yќъЛвˆьUb@ѕ:0ІycЁћšžй…б›7” цх„є%=Е5J;Qо­ЯС€ьшсГ7›GяоЙњОє§пС›#7МршщѓWRєхekШ9Ы _Yф˜uЌ\dVџ1ЦVн!‡еBwЭ!зиœшEiHі}eBѕКqќъq>zkПHi^u_г3л›ѓиЭ‰GЪ]sHі*: zнPН=|іvєий{ЭCWo„пМ{В4&=—2 Ђ_%2њѓІ k†2G9ђŒлюоEFРXЊЊ;с”zЎЊœ№[kLѕ"4Ѓz5йЕžусЃЋжеЃGWmT]ЕU=vѓ2zV혺TеNѕШЃя›#Њзбуgo5ŸН=vu~єь}wзCыеЭjЛtFєЫDFo?LGHlžоВЛ Qц\Dоƒ™;Gbѓип№џL}ќЗЊЙуИ[kLuе,5ЃКj=U@vеFucЯUyеUеIЭcЇ^еˆŽЈОoЮŒЈ^7doF^Н=vѕNѓибёC}{знєдFtwвs931Нё BbsЬэw'2њђ5 ,Eѓ№_plŠŒЖqРяЁЊКЮЊŠ‹Ў‹юjІЛхЈЊМъ ŒЎРшЏаœPНnЈоŠНzГyєшаљиЊюN: Б9ђt™Ў­AЭЗш)ЇyіЁ%Ј9ё“Vhtд,_EFGн№Dц0gVП‡Њю‚Гъ]wХ)uе]r\ЭuЧS•]їКƒHlŽŒ^5DпJЃ“VzЃyќъШш)sїШ<3Ѓ—–бн-‡EFG~H:Сoвzп‰~•ШhрЅъ]wХ)uбr\ЭuЧTW]їКƒHlž>2уškі2"z]Ћз#[Lr\tх4OыЏЛч˜ШшШ)БyQнr\bsfє”иœtЌ\%6OЩ‹Gъ ЩРkеEwШq5гнrP-uч“зќ–ќ}}Нш ‰^ŒDЪ|Ь9eЈЗ_ntsа!Гш˜цйL5п‡н1‡%6O‰Э™бSbsttwЦ9‰ЭS`rЬS4РiUеpNнtЇUннqN^qžФО›‹ŒПТт ьХЎ‘r7&.єtЗаН1‡EFпЊƒš/е)7сЇИЅwЩбнчGwWœ”иœЖл}HlјВЊЊ;сœКщN9,ЏјM\p ФŽ‹МляВmtWœ”иœ9вЁЇŠЅ~™р{1­:7К;тЌФцичМюxЉКш9#.˜зHœŠФaм3.бнч$6GNtftpuwУi‘б™е‘SннpZb3ЁоtGРO!q–+№Ќишюˆ“›EПLdtф.YннpZbѓен0МњAwУY]Ббн'%6чFw7œ•и,њu"Ћ›ЇФf€џkŸŽ†aˆeXю?CъtVc/Р_Р‘dЛ`.…б)ŒNatcsх8Z_И0'њšЦцЮhў'й.˜klЎŒnl~›јzузАзq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/20.voi0000664000175000017500000002425710513166704021705 0ustar michaelmichael‹20.niiьиOŠdYЦсhu ЎЂРЁHс\tNJОЦFД[К]€+p-tН q+NД2+ЛКтЦ=ї$ё7|ž$ˆ ˆ‡ї|'~ћйхRп|§цйхэ_§щѓЗјъ‹/пжЛПМ{ћххƒЏ/?МќѓђяїЫхГчПk?ИќјљљЏПК~,§§7?љзOyћњџ}yўцЯzѓѓ7яўјћЯїѕЛб›OјђЋ/?sы§~tYяМ,^џЧЗзЏ§члыї§эл_/?ѓgПx…rhWнР$ЊЊ;сЌњ ;у”ЊМъЊРъФшЊРjбw“иќ}ЩŠў.7ЊљЅ:ЌљI`2ЁъYwХ)UyбUyеuЅЛц  ЌЎЅю #Dп‹ш{}7cƒš#7—EuwЬa‰Э—йнРКЊъN8Ћ^twœQ•W]бu­;чZъ:т&: њЖ9 њaЂЇЏ}/Ђя&Б93:sœ˜ен1‡%6_>fwgќ?ЋїКNЊнgTхUWхUW`t-uqP}лPН=}ѕjєьеыбsWšчŽŽ\iбw§@7ъюЈ]‰ЭЁsоВК;ч ФцЫ'йн!gХ@ ЊъN8ЋžuWœS•W]Ÿшn9Њ*ЏК :ЂћЖ9 z-zњъешЩЋз›'ЏEO]§Xб3WGF?иѕбЖ%2zTнЕ-2:sњXЋюN: Б9єєr•нrJ^1ЏЉЊЛрДzвqNНшю8ЃЃыSн1GU`uU`ѕ2:Ё{ЅyўъешйЋзЃчЎ4Я]=ŒžЙњСЂ'ЎоˆЮЌюN}7‰Э™б‘yftцtyИмdwч˜ќ,Џ`Rеp^=ыЎ8Ї*ЏКЃыJwЭAX]KнAGмDtЏ5O_Н=yѕ zъъQѓдеуш‰Ћ-zоъ­hеЏJєн$6gFЋЛУЖDFgzыенQЛ›/™ЇлЫUvwЪ)yХРуЋЊю„гЊђЊЋђЊЋђЊыZwЮ1XНlŽЈОž?ћЙ1-{mЁЇЏEO]=ŒžЙ:1zмZн6Йд[бгVoFЯZНYн7§p7НюД ‰ЭУъюЌ‰ЭЋенIG&? L~‘ж }ЊК ЮЋЪЋЎЪЋЎРшњг]зКsŽЉРъesDѕƒDЯ_>hžЛz=sѕƒEO\-њ^-zоюэhеЏHєн$6gFgоЊ3ЧгШƒР К;jWbѓ%єчЫ'нн! ЊЛрМzвqRU^uFзїб9нu­;чZъ:т&: њЖ93zў№AєдеЃцЉЋЧбWoDЯ[-њ^DпЭVѕДс;бsVяEGVwч­‹ŒоЎюމŒЮšЦенa››енQћ“Ÿ&?Ы+€.ѕЄ;тЄЊМъЊРъФшКжsLV/›#ЊoЃчЏ^iž?|=uѕ0zцъqєФебѓV‹ОбїВ=mј^ДъWНWнЗ.2zЛК;n$2:sвЫ< ŒЊЛГі&? L~˜ mЊК ЮЋК3NЉЪЋЎьшœђZъ:т&: њЖ9 {=zђьQєЬеУц™Ћ7Ђч­оŠžЖZєНˆО›ШъЭшYУwЃ3ЋЛзDFяUwч­‹ŒЮМыeЮЇ‘'auwжŽФцKшя‹ью˜ђŠxUеpZНшю8Ѓ*А:1КК{YF'Tп4'TЏDOпНоЫVoFЏZННhѕNєšе{бAеЋŒG]Њ_/2zПК;p(Б93zЛК;n*Бљ2ЭюЮк‘и|dwѓЗ5)€wPе]p^нtWœS_КKNЈРъ§KЃЋЋD'”?GGЬЛFКЃі ЃWЏ~ЇшЕЫ7Ђз­оŠ^6{;zбъшЄъе/йуQ‡GЋ~™ншЬъюРЁФцЬшэъюИЉФцЫ4Л;kGbѓeнtP^1я КўA]uGœTŸКCЮЈРъЊРjбПЄо":!Нeк5д]ЕcНxѕ$zэьiєЪйбыVoE/›ННhѕNtfuwоXфЈ#Ѓ3ЋїЂUПNbѓNuwмTbsш 5ѓc`\нЕ/0љ&Џšдн gе‡юŒSъKwЩ X]ЂIbtU`u=W'ДзXwжЖIєкеГшЅГчб WoDЏ[ННlѕfДъWкŽ^Д:2:s?оёYД{/:ВК;oтgчњЭЁзІyuwиІФцЫ0Л;щˆРф›МbшQе]p^нtWœSŸКCЮЈРъ§KЊГ+АКъЙ: §9:bт“шЕЋgбKgЯЃЎоˆ^Зz+ZѕKEFgVзл нis‘ћБ­;o"В:2:ѓдЫztЫ3[aН -zС–]%цŒGztЮ S|євмrHѓюF)5ztвs‰ЭK3ЭЃc^UъгС-oЪ™ŒЛЌ‰ОIŒл;.›3ЇЃоЋGЇМуšНDFI‹Рd€O)7Ѓ;^ѕUZюFчМтж™U}ы Š^з8)њx ŠО§hЋЧ6=Гѕ5еC“žКїхF/Э[bЉ–zlд3}tLsrtа~—НDG,zAЉelв]tШBFnz*БyйBS‚ПЌЅ1Ћ\‹›№ц˜шФцuчˆŠnЖНб1Џкц")z‰ŒО}$kоОЮёЖФцњk J)etТЫЖжr16ц5[hY.zA^t ŒОЎЁ!бk`W=6ъ™­яš]ѕеK=АшЙвF—˜шњВ’]њшВLп|=џBŸEzЂk§Гщ#Eџ\JcIиЄћшˆMzаМєŠн8zIж)xГ…оЯФСEoы‹ћv—}mЭk^ЯХб-Џ*б%1:rЅ›я–FЇМcн њИztд3ћшMm\єњftа+šЉИЭєрЄЄ]Yі›чПћoTgbLt{*fˆлѓОд—˜шЅŽЮЩЎ›cЂ—::Їz§a‰ЭпнѕYєIOЄ/WыЋб9ЏЙG/%"ћЋАєеЃЃž(бѕ(WеƒЋk'9уTМїЕбCЃžЈ5+zm ‰.eW=}sdt9ˆžўzјНЂw=в7gEїG6=%њSъ‘ОЕNп\ŸˆkќќбћъбA/8XщљХMЦEЛФiбѕЛСMOЕ™!бэDЄD7“—˜3БЖ{|iЖщ”шЃяХ”ц ШшЅYш”ш‹ШшА™^EFМ/ьСюЗgбG=’О”К: ћ+Б‹žНњZXюБбЅŽВž~Љя}§R{ ЮлЂ'onЧ7$КмМ”ш)}e@ГшOй5/ѓ7/}rhєќїJG\ZtФ§]НХO]|UzЃƒ^нѕfTwKœБжЛэ#"ЛхЄшГЗГъ#š{+нژщVШюёeЗyDE]Ъя;HTєвMGFєшOIlОHlFЙ<ж=эйюзоœgв_*ЫЖд йЗЦвTŽzЂiЉ.}tРXпЛъС]T}eЋž<К™„ЌшЕБ”і§ЄкЪŒшО2ЁYєЇ”гшбeьЂn—іЛETswhdеcG›ђьЭ‡бГ_СЃ—Љ“ћгpі%о”бEЏHЌо7ЯнчFdя–8Ёz7 бћ›К€ц§Ъ&Ќєюђн‰˜щNЬ^]‹Œў"њSвЂзћбяШЙбЛ К;­%6]žžєœєKч%7цљюЗШћRЯŸН%–ІztжCUaIвE'TЗ}ы›ЙЃзEН%–z­Ї+w‡яЇTv•б‘ -њgr=8ь‘Фшr=8ь‘гшС]ь›gПž\§"Ѓ—Й›3ю3z]tF|ЉЏ9k^Œnz*1z—›PН_т€ъƒБШŠЎ mznњхЬGhTЮO=ћ г1бŸ"њCвvѕžitЧю7zЃKо‘rC пдх!щЃ#оsyBzаƒвЏ™ыѓш#КзЦjЉЇЯ.MtЦRW…MѕиЊЧJ]Кc3jGИЉ\vЎ”УъЌшЅ?Ѓ]є2sdt9іШО92zўщx=Жы‘ѓ‘лѕаAєфз•уцeюф”;чЦб2OOєЇєЇaH~ВшGЭIб1ѓн7/їo@&жœŠїO[ƒЋžи7‡E燆F=uмœнН<К#њ“DLbtфJ‡5oЗLЃCоАнVy_d4ДжŽч<МЛTIщОVVбѓgЏЅЉž:ћXb–К.LЉ.ѕ44?ч.хМztлЉ.z]уœшвнvjН„Ew‡†v+ НœН9?КК*ЮлМ6Я~5<Ž^цN>щщХg\Аwgу›D'дїб‹оE‡LЪaѓьеugЬIyЯlгGw=VOu5"ЃГћЇbЪ­HS™r*6јшJЬІзˆŒN9w"Ѓ3юOw›EJфH@ыњию ‡w_BЗшˆю[ф%Ж”ˆь-БдK=wvезVЭzшИ-uТX7УPšъбiЇJ9Ќ^ІЎ.‡е“ЯЧ.2 љ`eg.Л™О<њp‚go>ZшЩwщущ˜|“ŽŒ^ŽЃ—Й“3.%НФцйwŠ#СЋœU-њSvб љ]tЦЂЗб)“RŽЮzLєЧDNѕсю1{tГЭ…EзЏЂ—цуJJєшЯ‰ŒNќ№u=ћ—ЧDРзЧКч<Мћвy‰.WЃƒž[#з•ШОжK=wviЃKТRзыZЃЫЮЕ‘е%1њaѕшЖc]цѕиьб‡+;ysГ)п#gо'Я>‡[ХфЭЇгqљЭЌЪnУЫ}4дгKlоЊGgМ%o•чПˆhбŸвEgд7б1‹^ŽЮzLєЧ4ЅyбK§офЊЕi^›ЋƒIб›ћ`.yCЮ–W‹ŒЮйЈ;‘бKѓ`‚ЄFN€џАыУЦcžо}ЭМDЇ<“~mЌЂgЯЎ ›ъ™ГыФRі@9žЗКkŒˆюЂЫУЅ]wЌь"VКє‘ ЭЛЭті"%К>2ѓэЧС,ЬМФWЛсXЭzl?в—ЃC›ž;Œž]9^ыЙѕбй;t€шшы­вшš%ЭђMЦЇСVиЎqеGGдЗЭ!ыОПДdW.{ 2z_Н$Eo[ЧєЩЫR-ь§ЧшІЇЖ…НЗ.zEѓХє}SЃ—€ѓя@ФНž=КуM™еЁЇdd4єЂžлНІ^Ÿ6ёxї{b=yvxyUцЏnKepз]cIЈо5FDwKАвЅ,% К<6:яPbs?KамZѕФ~ТЂCЋы}ztи#GћE^єZ=:ь}ѓд›нUUКлќІU•&FяЖО‰ЅVОEtФ_ i–ўš’P}ИOЯ^}ИхХE'ь&‘бћћщ шeЛОјKн\BšЗ{чf8'Н,dЛkEFЧмxє2ЋУГGgМ-2:ы?깉OРŽzкјVz­NhЏžAž<Л”ОКL_]vбeіш>1!КT™mёЬбucЩˆю3Ђ7ЯиМєГї~й54/хДzhжћЮ‹ОW{рhϘ~ЉOv:бpЛЁh>]щб]%6nгЃ›^ВК­&:d@NšЇЎ>mž8К=SvѓцљЃЋвМш%"zwі%ŒGфлэ{ш”“№цZ}Гп5"Ѓ—˜[^dtШЕe'2zЩјOˆ{‘ба‰zкј–КVЯп^?ƒўњjў‡в—>К4)•&z{›]zЃгNь:уЃGЧH\шяж<КэT—™е|yS˜ЗЙiМ†Юп|p-IŒЮя=mus†E/GбЃлNЧƒшбa&/Лъ/КоˆХю9!ћAs@єrtя4ЋуцЩЯЧУн#2zњoФњ)N˜щ>:ЂљСЎбaOэЂGН$fЛkь†$IdtvѕшŒwEF/‰Э™баЩzDњšT]ЅЎ/gO/хVzЋННž:ЛЌбUюії˜Ty`tл™GЭГFЛцIЃ“ЃOТuoЎ^'DWНKFѓ}iЇхбD.{ №,Œо;Ѓ—уњбqg‚ЃГІу›ьxЫєЩgбЃЋžљу‘§(zкъШшуЋЫ2љї4'Э—cЫщЂў;ŒN;З‹eіO[KїЕ]Щ‹.MѓЬбЫсЮ1{ђRWoяF'НЄюŒ‰nЄFчU‹ў”ФцЬhh•ѕˆє[i Ъ.eЋНџѕXЉ4oG‡=PZехбmgО[ѓЌбЩЭgaпйьЃуNlqїм”ш6wішугoоо‹МcyИпN;ї zкъGЭгVЏqyбЫй&2ЉФщј&›ЧВЬ~e9Žž^тtD^[2woГдл/Ц–=pЭ ‹>њ\ЛіH“Л6O>гэЗvї?cЂзв€ш§YаМџZ7Ёy'Б9рцєPdЕшO mЮ‹€ZЙ>З;ъйнЅ5:чЙRvбГg_яЉ йћžПz7ђ yкш>3А9b ""zЭ\њшIЋзЖ{nГјЃѓŽ5'_ЛюгFя&Кž’Y}ЃшЙЋ›ЗЉ]wт`,Ъ}г]wЂ^зЃŸRНЎQбЇFЧ L>ŠОнѕPвoђfcЩќ •Й{|—ЅОџbhи#‘бЇ_пEEWЧGf=БžўDмнR/бЛoСцпђОьOСљ›{ЩЫмŸOEFЯ§­ЧбŸ’и ­ВђКв]ѓЂRВВ/‰Ul@і­А^ущЋЫ.zўщ:#Ђї‹;єбD$Dї1§|T{Eѓfњш-0$КŸшnXFч;ŠО/јшКcUх.zZЧбысIебK;sѕС X§blлЉƒс˜~ыШ>5:юL`ђЩЅevЂ?%ё< ­ў6бы/Ї=pЖЖ9бUшдбgп”EЏ‡fоŒ~їXіпЭПх}йOѓќЭФцљПL?$њc"ЃgПА‹Œ€Nм#вKmtЬ‹Jotа3—ТІwўьЊ3fЅoл9Э[iDі~$цЯ>œуЩЃЛ3pйMЫ„юћЦњgHєxџsъшВНl?&t)ыЗys/JНlб“пwœMядећА:>6э\5б1Згѕ’|м;Кщ)бsкrn;uВІS7ŸTOо|МSЬ}XН?8$цeћeˆюLПK˜џвВ—и<џОq(5:0;ГЃЌF‡МЌTFЗМь›TНі.K•=yzЉЂ›9мѕШ.2 њpe'юwfЖЗЉOОъѕВ,ѓFз›EiџѓGї+=ѓL—УшЩЯУ}t}e]wь yъо‹Уйz4–г{бЉЋlбKNѓR–гшбiчJuEЬ(^F" љђх |tжcхИz™љЏнІЋ7S/x?э>24э“312zъ™>ŽО§btлЙуИЉЇу$zђцУяОІo>‹PђŽ“ёј|Шш˜ўrx Бyњ{ЅCyХ_bЃѓЊ€qвž‘ў#ЗмŒNyе­5)Л,[i)с]fDі>rўъrДВ“GwЭћ:lн^Ž,{`MьЖМRэ'г)ЕлћщЗ>zi|pм‰rЗа“/ђ—УНњd цЎ>ц€шъхќЭѕJ‡Ќn@ѓw‹žЙќДzўшњuLtiп…Dпч8-КЭ8њкvАР37/ЧiSOЧБЩGњP`ђ2ѕХ№TтB‡.ѕмћн‘м­#+:Бй§A™еo(WЃ3^vk-Iнїа”ь.3"{P]gЏnšыж‰ЃЏimєіzhйЙ[b§унФуQЊЬллЅ=4Ÿr=ћюqВа_/КCѓ6nЧs/'“GзЭЅ38э\bѓљJюzЈЮLŒоwцaєЌеСбеЫ€цік’}:8‹^fўдђЃэњчn*fn>3ѕHš§<<л<:т]‰Э™+\=Кс=Б{‡цŸ_^1Р‰Дчб_kЫер–нKcВлЮŒь>ђњvюъzeЋSЏuЉЂы5ŸyBОЁmОП[vЎьњњnтшВ‹юў3кG—щЃKXcлNэкRšЫбБY‹—~Ё//'_цЅ‰.БaTu)Щч+=ЖъБ&3e<ЪЃъYГћЬˆшЧйЃлЮЌy‰бQЭЇб“j9Yу™Ѓ7нLD4їтЂg?hўŒМт%4:Дzцo–Nх-uтоqј=Шќ“˜Uљ2:тe[j‰щn:CЊЛЪ„цj ЊмЙЫлц­uъ)ївRК7cЫш;зЗЭѕт6 >ЃнDдFЧi'!#КOKh>:л&/^кшjя˜:КНFЬЦƒш‘QЯT}1 нLpЬ|Д!ећШДш”љјvбЃлЮѕN}Е_тљ›їz/0zђѓpoўНc/Б9рcЫРфЄяyw†ЖМюžН]ИƒЦc•4вРЊќ0Кс'HЩЮЈl­K[­ёьR7єЯh -›%+zMПЬ”Jн.јœК1n N;W—ЅDwaЭ}євю{sjк2–Й–2Я ф{]аBз‰1йmbHѕО1+zgtлЉГоРшщяK—УыЪдбЕіlšђ“ˆўДцщ7щНљ/,ЂšKsЧ48цUѕE%&:ДzЛFEп;kЅјfЪ—ѕхи”\ ЫЭэѕаЂЇJл|эНКŠ^жіЅЬ]]кшЊzhж‹Jotа+"Ѓћьб5oШ*N\fЭŸДsTq9еmaHѕIbHt]ЧO}ћбGэzUwFmљ)›#Ѓч> Od5'\w’šзЮЄц]ѕшœ­БIЭЫ–›}ыM‹€СЪХшŠї”еѕЭшœ—”Ъхнш WмжxЭЮЈ.muШx—бEЏˆŒюГGзМ!,8p•#G#БЙп;FчМ(ЇКmK‰>Ю›ОњјшдбЧ›#ЃMЧ‡XшЩZшлЅ0#z­ŒИ†onЁQЭЁŸвОюиDF L€‘ЪешŒЗ”Эш’7\rЗьєлЏйеegtб іб ећьбAЏIlО \хШЩШŽщŽŒ^"OХŠшOIŒŽœщФшФцШшФцш[хz%ŒhN§ •иМ„оNпГGwМ-Бј#PVЃC^w­ Ы.MuHvщz‰ъŠŒŽл?šuђЊФЩШчЬН#2:sЌяDHтxЄ6ЇEgn‰Э)б_•їЁ‰nnJSšПХнвш˜зEFРхbtХыJmtЬ‹JQ§)™еK>Кх ЁСQб‘Ѓ‘иК{DF‡Žѕ&1:Д9-:qЂ#OCб“]]QbšяУЈшШOуK•=:˜S)etТ›ЪjtШыJmtЬы2Ћ—-|IЌ]ё†ФщHщФцnгK Œ^RGф&1:А9p:':0YєЯo+ ЋОЕ&EoЕIЩQ‹ Рhю[-њQD?LbГшЧIlЮŒŽ<цeFgЮ[[ееI3“Ÿ&?Ы+ў?Ц“ъˆЛŒWе!ѓЦ[е1sЦ­ъ  Ћц€ъціе›Э™бНЋwšEДНцжйб}ЋЃšлVG7­§(‘бЧееq{іƒCЃЋліЅmgqњйЅЂ#ЋЋГN$6gо!,ЋьъœYЩЯђŠИšQpЇёIuЧЦе)ГЦ;е5sЦJuбЙusџъ­цюелЭЂ?мNsяъФшнцЮеб}ЋЂлV_/КiѕqsгшШ•ОZєгЯЊыvG7­>мM›3Я™бЛее]‡ЎЕд‘ееY'›7ЋЋ“f&? Lў$­€уIuФ]Цgе%гЦ[е1“ЦШЋ+еEчжЭ§ЋЗšЛWo77ЏNŒоkЮŒю\НнЗњ ЙoЕшG9ŒюZ-њQ.нДњ$:ГК:o[`ђzЬлЋ~ўQuлОНшж‹ИЇ/ИЋKlоЌЎNš˜ќ,ЏрAЦе wЏЊCц7Њ[&‘=F^ѕmsBіFsћъЭцюе;б­Ћїš3ЃWя77ЎоlMŒюОдGЛCєG:ŽnZ}Хшžе—ŒV§a.]нЗ-2њ`HŒnм|#uћца11ѓ!ђОfйШЎš˜ќ,Џˆ3^Tgмc|V]2mМU3gмЈю™qлœНjˆ^7toGїЎоi§біš[gDЗ­>jNŠ~ѓЭъК‡+нЕњŠб=ЋE?ЪYtЫъгшŽечб Ћ#Ѓ/КЉЋ7%6gFgžN#ч€ЃъъВ‰Э™WЫЮие_`ђ“Рdјц_T7мg|Rнq‡ёEuЪЌёNuЭœ1ђЊo›ЂWЭбыцўй›ЭнЋЃwš3Ѓ;w4ї­>ŒюZ}ммДњ,КeЕшG9юX}нА:2:ГZєУ$6DњYuрІ“шъМmЛc Žїu[‰Э™з™ЗLKц%фr“]s‡Мbј0уYuХ]ЦЋъyуъ–IуНъœ)уVuа„Us@єКЙєFsџъЭшцелЭЭЋЃїš[wEw­>lюZ}Хшžеgб-ЋE?ЪitЧъѓш†еWюW}й§QИс(Жksfє%zеy;›ЋЋг$6яVWg L~˜ќ$0€ЦFuРЦ‹ъŒ{ŒЯЊKІЗЊc&‘W=Ѓo›ЊзЭ§Ѓ7šлGo5ЗЏоŽю]Нгœн9ќЈЙmѕqtгъ+FїЌNŒ>kЮŒюX}­њƒLDїЋ§(3б‘ее‰k‘б§PЌм”и|R]З+Бљ К:ьPbѓNuuдЙРф'ЩŸЄѕ|т^F?>ЉюИУјЂ:eкqеcфE[еAVЭбыfб_ХFsћъЭfбoЛљ—ъЮх{б­зћ0КkѕqtЯъ“цžе‰Эз\щЬшŽйб§ЊgЂ3ЋЋW.нЎ:2њВНъФ ‰Э™ЇгЬшЬ‘ыЈК:э@bѓ’yЯ”yЃЗdоЌ?‹ ј&фНŠ~|Rнq‡ёEuЪЌёNuЭœ=nUMX5DЏ›ћGo4‹ўЖšлW_І93КyћatгъуцЬшžе‰Э—\щžйчб Ћ'ЂћUЯDЗЋŽŒЮЌ§0‰Э™бчее[ŽrлFgžє2GЎУвWbѓnuuж™Рф'ЩЯђŠОyoЂЏЊCц7Њ[f‘W=F^ѕmsBєЊ9 zЃЙ}єVsїъэfбnЇ92К:ыXтJя5З.§(Œnš}н2ћ<КaѕDtПъ™шvезЮЌЎŽМ%њa›3ЃЯЋЋ7фЖm>YыъИ]‰Эееa‡›wЊЋЃЮ&?Ы+ј&фНˆ~МЊ™7оЈn™5F\ѕИU4aеPНбœнНzГЙyѕNГшЖз,њЃ%F'6яGwЎоn\}нЗћ8КiјytУъЋFїЋž‰nW}ншЬъъШ[Ђ&Б93њМК:pSbsfєquuмЎФц%ѓn,ѓrЩМY’W №-|§xU2oМQн2kŒИъqЋ:hТЊ9 zЃ93К{ѕfsѓъцЬшЮеЛЭЂ?ж~sdtuйФцk=№–ЮѕџћVŸG7ЌОjtПъ™шvезюV}с§QЙ’иœ}^]И)Б93њИК:nWbѓ’y7zušyГОмdWЧ№*№=єуUuШМёFuЫЄё^uЮ”qЋ:hТЊ9 zЃЙ}єVsћъэшое;Э™бЋw›;W'F4‹ўP‰ЭЯŽЦхGлЃmѕitУъѓцаъъФЕШЅž‰nW-њQІЂ3ЋЋ#oEF_іI]И!Б93њЌК:oGbsшаЕwŸзКyЩМю]жйе=“›? ЫИKр{шЧЋъyуъ–YcФU[еAVЭеЭ™бнЋ7››Wя4gFwЎоmю\}амЗZєЃFwэ>‹nY}нБњ<КaѕUЃћUЯDЗЋ§(‘бч‰‰б™KнБ93:ѓЬtV]З-2:s|‰Щ—KШоЩKцѕВЪЎЮ™•и №-Ш{§xU2oМQн2kŒИъqЋ:hТЊ9 zнPНемНzЛЙyѕ^tчънцЮеб}ЋЃš3ЃЛVG7Э>‹nY}нБњ<КaѕUЃћU_6К]ubѓiѕг/T'ЎMDїЋŽмд—}RW'nHlžјПиQdtцЬ•yА›]ubнћєЇНЌEў"БрїњёЊ:dоxЃКeжyе#0zмЊšАjˆ^7їоhnНем>{'КuіnsчъƒшОе‰бGЭmЋ/н4ћ,КeѕitЧъ‹F7ЌžˆюW-њQђŠŸ\3КcјЬІŽЌЎN\‹ŒОцЄ:oGbsшHyљzЯД]]uю68 љYд"аиxQqёYuЩДёVuЬЄ1ђЊЧ­ъ  Ћц€шusџшfб_УVsћ№ншЦећЭЋ/нЕњАЙkѕItЯъГш–езŒюX}нАZєЃDF_єёQИхЂћЃcudєEwuuрІФцЬщхАК:э@bѓnuuж™Рф'ЩЯђŠhiМЈЮИЧјЌКdоqеуНъœ)уVuа„Us@єКYєWБбм>zЋЙ}ї^tчь§цЦе—‹n[}нДњИЙiѕ%Ѓ[VŸFwЌ>nX-њa›E?ЬE7uЧъШшЬ]}V]З-2:sz9ЊЎN;иМьdWGJl^2oжŸХагxV]q—ёЊ:dоxЃКeжyеcфUп6'DЏšЂзЭ§Ѓ7šE [ЭэЫїЃћV4gFЗ­>ŒюZ}Сшžе'Э=ЋOЃ;VGF_tTn§(ЇбЊ?Ъytduuр–ШшШ3Sш 9'TW‡JlоЉЎŽ:˜ќ$0љ“Д^zПЈnИгxQqёYuЩДёVuЬЄ1ђЊЧ­ъ  Ћц€шuГшЏbЃЙѕftѓ№нцЮе‰бЭ}ЋЃЛV_0КiѕItЯъkD/‰б‘+P}ЭшЬъъР-–њa"Ѓ/yќЈЮл‘иœ9reNфЛееYg“Ÿ&? L€4FuСНЦГъŠЛŒWе!ѓЦе-ГЦШЋ#ЏњЖ9!zеНnЮŒn_НемО{/КsѕnsчъƒшОе‰бGЭmЋЃ›V_#zIŒŽ\щ„ъГhеFєУDVGF_ђQ]З#Б9tz‰œwЋЋГN$6/™zЫ’pќп”W пЖёЄ:т>у“ъŽ;Œ/ЊSfwЊkцŒРшqЋ:hТЊ93КѕFsџъЭшцй;ЭНЋwЃWя77ЎО\tлъЭжФшШ•§5ьхЖЎ>\щЎйgб-Ћ#ЃэЧIlЮŒОдчKяшЃъъД‰Э™љ’ycГdоB.‘wд@Ђ1Њ ю5^Tgмc|V]2mŒМш1ђЊЧШЋОmNЈ^7gFЗЏоjnŸНнКzЏЙuЕшйon\}ЙшЖеЂх0КkіIДъ#њaD?LbsfєQuuкФцасvЛК:ъ\`ђ“РфgyХќ_;v‚м8CQP‡Х§Я0ЖМs‘ЩŽnŸ“y‚E€РSд‹ю†sъ]wЧ ѕЅ;хАЊМъЊМъZъ:`еНnЈоŠž^Нй<Нz'zvubє^sfєфъ§шСеЂчV_.zlѕУшЉеЃ‡VGFgV‹~šФцЬшЬё#s<Э\Й"—лЭъюЄ#“яђŠИ”КыЎ8Ѕ>t‡WпtЗU•W]бЕдtРЊ9Ёz#z|ѕVsfє№ъэцЬшйе{бЃЋwЃ'WяGЯ­~а<7:ГњrбcЋFO­~YнЗ'2:ђѓ’93eЮд™+WцFžљУці#Л;хЄД^ЎЅЊЛрЌКыЎ8Ѕ>t‡WпtЗU•W]•WНlŽЈNŒў,MЊ^єќш­цёелбУЋwЂGWя5Ўо\}ЕшЙе‘б™еЂЧVGF_ю§шN{ Б93:sалЎюŽњUbѓm•нsT`ђ]^1№'ЊЊ;сЄzгqF}ъ.9ЌОыŽ9ЈЃЋЋ—б еЋц„ъаЄъƒž_Н=М:1zЇyvѕnєфъ‹EЎŽŒЮЌ§4‰Э™б‘ђЬшэъюЈ_­ƒч7пVйн9G&пхLVUн ЇU…UПцVXuFзЗш”ьњQ]Ыш„ъuєќъквѕ›Эшще‰блЭУЋ/=Кz7zrudєХюGwи#‹вŒшлтx#šїюGwж/›7ЋЛ“LО­ž‰ЭЏђŠрUuœW/КNЉЗцЈъњŒЮЩОЗVVu§ŒŽЈЎЅю #Vбеыц€ъ­шёе›бгЋЃЗ›CЋЛГ§,‘бzЈЛЃ~•и:ч-ЋЛsJlОнвЖ­/qСд‹ю†ГъMwЦ ѕЅ;хАЊМъЊМъКBtBѕЊ9Ёz#z~ѕeЂЧW‹~–ШшЫМyнI$6gNL™ГiцpK\ЗрЅоtgœQбAеѕMwЫQ%њ9jЁЛчetDЕшg§,_БAбЫЃюЮ9&2:ђ“јЃК;хŒРd’UUwТYѕІ;у”ЊМъЊРъФшЊРjбOѓžе|ћ8тЈшлчIw‡œ’vЁп&џHuќџh••Вq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/18.voi0000664000175000017500000002627110513166634021714 0ustar michaelmichael‹18.niiьиMn#U†бj`€XE$†EЬ‘`L‚О-DЇQ7 `Ќ…l 7и Hb'БЫUЎ2аЙї5чDўбЕЅ<.}uуЪзЯ†ЁоМОИ3\ОxѕђљхwЏ^\_жеW—зУЦыс§сЗс›л0<Лћйїо№снуO_ьпЦ~љъЃп?ўќp}уЏэу›^^|zqѕ§ЗЯПy}5їц\ПК~~qшц•†щЮaДўыл§Е?пюПячЗ_Žч'Ÿ§х@€j№oTы€еVыŽSTVW`uU`uztы”&пGЗЎ8U`ђїз8KЕЙЏjмqŠzд:eН ЌЎБжAkˆ~*gнКg•Мт!t››3Ѓ‡Шш!БyиdЗnfUUы„"2:Ьv2*iD6БЕб:fЅкгКfЅ:д:iбDsџеЂŸЪЙDЗNZ–и|н:h•ќшж1Ћ%6яTЗ9Idє№иyЌЮLUЕN8YUZѕmmZє6ЗДZсОГ‚ЊkJыЈ%‰б“ЭНW‹~*‰б3Э‘е­Ћ&OFЗNZ}Xн:hМт[‰ЭЃ/в5„Єѕ0ЊnГ^`ђF\0DЊЊж 'Ћ ЋОЋНiпцжЃжEЫjчЇT?dVхTзДжYGЭ4gFw]=лмsЕшЇ’иœЙуMWЗŽZ˜<нКhРфqєfЅuгВQsШпI’Шs1ѓdŒК>м“W Р;Q­ў‘ъЊЭ§§CBv=фnž'T?dжŽжQK2+ЇКfДю:*1zЎ93Кчъљш~Ћ4ї[}vб­лf%6gюx“е­›%6FЗZ%Бy˜lОyвwўсQ8фЃш9ЩлЇo%6Ё[Ш^vы”“фџ/U­ V{,­”ънаЊŒьнЬЊŒънЬ ‰ЎI­ЋLGї]=гœнsѕlsftЧеGЂЛ­žъ§.LDVєўrУЌуЮЛCЂŸJdє|uЯŸbюTьћаODї?.Ѓ:dЦkZыЌ‰Э“е­“жLО˜|'ЏzPU­жЛO­ŠЩ~,­˜ъGTяtV…Tз”жQ &›{ЏNŒžiюЛz6КуъљцЬш~Ћ'CУЂїW›–13]GЯNqЧЭЃъб ­šEьcч}Гащч86г§ћc[^Hє]gР”Ћ#ЮЬШшЬЫ€Ш ЎЬыёЩъжIk&п LоJы`^нhнp‚MlUPі}jUW`єcjХTз„жMKІš{ЏžnюМ:1zЎЙыъ3‹юЗzІ4+zoЙiйГ#НџJГЊуцНCнАыЈљmЃуљ˜kюzл;ЃшщSГ“CнyГшЇ“иœљхєHuыАЃ›3џѓ1{гЛИр­Фf€ПлЛ—эФ­ ЃzиzџgHК  єJ\чwіиOОд* gа?ЄЊК>RЗфJЪОХVTѕН5*КЖКƒо№в,њПёк<~іnѓреЫS#ІКЋя}‰блдСЋЦ;tєёNEПйuхЅЙFёнюYї]=юVD§”zНseŽ#2њКК;pш“иœ}^нw$2њЌК;эD^ё—Рфщ№ѓЫш“П$6Ilтд—юˆOдSwЩлjЉ;цMUyе%њgl›Ђ_’Њїš‡я>ŠЙњАyфъ{_TtmЃяЗ†9oRєї›ЭQWvЂ‡оŒ›ИƒуЫёq7p§Qєа3џб#V_GX§K—К;pWbsfєyuwм‘ФцаЖYŸЕž“П$6OЋью”O$6Рџ]§бн№™Кыюј@ЭКSоVбUyе%њ'T`єWdmuG]йМ{ЏwјъФшуцЋŸ›в‘›_&ннѓŽн•=~'zќ‰ч]„гiєИэ‡б#Oќ2zФъШшЬъышЋ#ЃщљбИ+Б93њМК;юP`ђtTн]u%ЏјK`ђ—Фцi‘нђЁФfј—д—юˆЯд]wЧ'ЊђЊ+0К*А:?:ЁњЋБТЊo•U]ЛбƒgПцŽ_§LLЊNŒЎ—шчћНagіЧ;єœwЖуљ^wй‰у•ю.;ёzљ%GпйнЗы$zмЏЧРk"њЇ\GgVwюјЅЃюм}UнЗ/2њМК;юP\№M\№MbѓјЧМo‰ЭSцџР€K}щŽјLнuw|Ђ*АКЋ+=:ЂњV]ЏбУg?“Њ+Аzб˜Г!sbХDзkєуUwкБ9z=рЌшљнцВ/л1MЋќ!НlGР…јš}џusпЎЋцМъa—фlЉ‡]эп=ю~\G‡UGюGruwрžШшЋъюМ‰ЭЧен]ч“Їъю З$6OЁь]§ $Lb3РЏїOбзMwХgЊЋ+АКВЃ3Њo•UQйїШЌъgcPѕм˜3ыEcХT/cЂ+tGЎЃУЊЧНХьvFEя5_}А&УЙŽЖњ,О;pOdєї-$ЌљтЌV^ё—Мт/‰ЭгKvwЮЛ"ЃЇс?†ќO%ў3єѕGwУЇЊЋƒЃcЊПCГЂk‘§ ­œьк‰Нz‘Y1е‹ЬJЉЎшшiЙ)c7яEw']њЎ\E?бvfЮVбC|ч Ќе18Ђ:е]w@єOљбcv_5Y§ЂЇ'ЈюФ/о3| ‰ЎueE/w#ЌzoєУxНЂеQЭћЇЃ7п?d%OС7Щг^uwб;2Ћwž2$60Іъј ѕGwУЧВЂяЉQбїжЊ ъGkUPvmЋВŸЁU1еshхT/:cЊ—•ббнM—žл<-.ЩСЭЫ<­я.#Ч/ЎРeєи#9ыVЧHwн:е]w@єO§S.šЧьоюќzаi­УcауWo+‡]ь“ pмЋёь"ЬЋолєa<КЂЂзЯЅ)бїъЌцѓшюИCGбн]чвzятц|“Y§’ннѓЎРdјџЊл—ъЮј@UХEз=њбž –б)нЯ挘ьzОz­ŠЉ^dЦD?g<­Ч#їў: xZЬxJ‹^-ѕу§оА3ЫccОЭ >ё:гwф4zдъ_=hubѓo‰žж#н{g[‹;хh^‡М§mSи™uєfоУюѕЩ%8юеx~| =­#Єњ}Н нЛ›ЯЖК;эФЮRќ1rgднIялЛЬъзью ї&РПЃК>Wt7|ЊЃ+0Кžб9ѕЕNЈžЃЋRЊ_P§ё§ШНПNHоn.КЖИЇ˜›Ь­rs| _KыŸЦ­Ў3нqG~_є ечЭƒFGNњ—D/бvцbДc†o“зщƒŽ{Н™јА{}r Ž{5nFr„œѕ}\п]И'qвбЯ{ёнegюЋєюІkstФяЂжy}ђ”:ЖGkP2ќ;ЊК >WW]•]‹ш”іEsЮФчшŠй“—ц€ъ[уb9BЂo_П_Ц4ПDїНcоц)цМЎћJП~я.;qЫЋuє№[RЧКгŽD[}=lѕiєЈеЂЪ^ш№З™усŽлМ~љuGгЅ—еXЕ:энцGыА{}~| w7пйœшЈI_UwчШ+žЖЖ+оvъ1дezwгЕяЬЭРН‡/,і"bЅПэUw7Нay І4O‹ЄœdјwTu|Ў*ЎК*/Кцш˜єUsJѕГ&_™Ыц„ъEdRєтeLѓтдШŠЛo‘›уcєђКŸїаŠЈ^EЏuЇ;n;њPwлЁГшaЋOЃG­ў%б‹ї{гŽЅ weЏyј№фХМGќ&њхuwпЎeыюYвИчоuи„зт?ap‹+qš†пŒ‡э^dtя\ƒЉенQз^ЊЛƒоДО €‘UUwТЧ*0КЃчцЄєGjрР“жdQНЬЌ”ъяЪяиЊŒьЙ9ЊњіхоZеѓyЋ9ы\dєЭkѓиб;НУg7\}=lѕo‰~Опœv,gМ ‰Э/еѓ[нagŽš‡ќђЪ›ŸїЊЦs˜,cšWЃоNНЛэию~tG]ZwЦUoЎЦюЎsЋk/р:ќЖ_н]uiЇК;щ›ъюœЗхLЈю€Яен ŸЊРшФцХBЖ­і"3fO™5нЃ#ВяЭ•T§lўjM‰ўv­ЈъкшюyOTѓЃ1iвлЕˆШ>ŽИњ$zмъ_}П;эXв€g‰ЭЛЗТсѓoqыGЅёЧ>—=^%,ЫІ/cУwзyєшuѕќzшцuѕzънe'жЛ0ј^<э_ŠНMзы1m/Эq­Œ”ъiЗК;ъвNuwв;6ен9я‹™0ЈЊЛрs]S^sИР-ЙэvFvЭпЊbЊoОkУЊПk+ЋК–КcоUQеШИцДъкЏК{Y)еuЌ;эиItXѕ4њvд„›_Ѓч7ЛгN<кVћ<њачДћЋ„Uйfьїо:E/zј‹{б#ї~лпюЊ+—bkгЕшъХE[нuэЅК;ш=ЋЃЏ;ц#1#јеџ‘ \юЊЌъ[oeUзBwЫћЂЊ•IбsfNѓ":ЈКvЋяЎФъUf…TзЁюВћНc7яFw7]Jlž^ЏСхЛЃzІЭЭ 3жеѓчсЃЗ…ыНiŒhоV?_œ|=vђД=-вЊз?žНЎ Ћ~\ƒбЛ—cwв;6ен9яJй рЉКўBUXuнuw|Ђ*ЉњоYIеЯЮМшŠŠ^„цEзъ‡СЛ+Бzqhф\ЕбМннt-5њё}sŒДfНыхфы:3їэЭ|LлТŒхоTF4япЛЃ.эE'U/ъЎКВюŒXъiЛaеa{НЮЮHўВЊюŽљ@ЪZdЈю€OеMwХ›юЉUAеЕ‰NЈžKEџЗ*БzUšВзЕ ЉЎ§ъюЌsЕЎЮ‹^}`ЩЯbTѓќ`—д<л^н=чцТѕ-І1щв61bOіOъюЊ+ыъŒц§QwG]ŠмЭЕ—Y—§|Bэ.zЫІК;ч] wxЈКЛПPїиЊœъZGgToЃ#Њ+pдЫљЦTWbuе2;dЏ+БКжебВеЕЃЛщкf™#šŸ›ЇхS@јvО пЎEBѓў§ЅЛщво§ЅЛщZфЈwŸšК›Ў­щшэR§2ьцœweоЧsжІњуўЂЙф}UїъzжoR]skNu%VWbu%VзЊК2ЊkЏК;ъJ­Ћ#šзбsžžOIЩГАшЌуюлkl@љv-"цН=8šїю/нEяHЏ~ќд]єŽЭ­%#:эжђYђˆпЊК >W•W]uЏNJ_DЧdWvtPu­GQ]‰е•X]‰ещбїъюЂ7|Ч.О ЊРт†иђЖЌ ?TиfмlНёен)ˆŒž"ЃCЯЄO[ЋЊЛрsUyе§UT^stNu%VЏЂSЊ+БКЋ+БњDG ЎюŽјXXtXюM№:Ї•/Н ьјъю”DFЏŸPƒDFO1ЯxЋКўBU^uU`ubtU`u%VGGGUWbЕшŸ§нн№ЙШш4‰CЮМ #НЊФьјъю”ODF‡>WOЉїr€UнŸЋ ЌNŒЎ ЌЎФъфшЬъюŒEFO‘бЗью„ПЭO\шшЛKXwEfЇWw—|$БљKd4Њ;р/Tft^uU`udtpuwУ_ˆŒјМРL=t‡|DѕJlОIl†TнЃ"ЋрПPЗХКщЎјPWwW|,Г€ŸTUн #4п?#№vq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/17.voi0000664000175000017500000002645210513166612021710 0ustar michaelmichael‹17.niiьиKŽY†сh`€X…%†YЬ‘`LŒ~‹ЂmфfЌ€Е0€ xˆ­0ЊМЦ­Њ"мvžѓЅŸЇлYб–њебЙDфяП†њўУЋƒсѕЗяП{ћњOяП}їКоќѕЭыwУб‡сЧУП†џ<ќ†oџL§hјщсњЗпLџЬ§уw?ћїЯНМєПгѕћП|їъ—Џоќљoџ№сЭSy‡wяпН}Еє№_~2ЌwГћџќ8НїпгПїїПџ?ёЋЯPŸ Zѕ№яƒжЛдIыŽ=*0:Б92:БљRн:cЏРdОFѕ uУ.uбКdЛ ŒЎРш}‰Э™S:rяˆмЄ“рыQ­+іЊЬlxYфМŽŒЮЊЎ‹ж%[еXы˜*0КDпFнAtыœmю КuЭF‰Э“ъж)ћ$6? LИ'uд:c—Кh]ВGdtфќˆ9мЙб™е­#ЖЊБж1U`tU^ubsdєМYє—’и|б­s6z Mk>Jl{V: LnЅЕŽиЉNZwьP8аGЩ‰У8G"WcфrLщšjГIFЯ›ЂЭЂПŒФfб7“и|ЈтЂ‡š wыš›#Ÿ№"_Žе­vЫ+рsЋЊж ЛеAыŠ}ъЌuШ‰ЭУ)ЛuФ'Щ œ"•И+МКuЩqб5е:g‹škДСЂ9 zймєJsdtыЄнЫ@ї}z$Эj>О† єQbsрƒЧЃФцФЗ–KtыŒ}“ф_‘ЊжћеЃж{Uf—ъл9‡Uu]ЕNйЌЃЋЋ#‡:qRWмќЈ…жE/[6їНвм}єZsdtыІ—$6_Ÿ§“Њ›ЕГYв:iЋФцРaнКd‡ФцФїУыЮ—%БјŠTЕ.и­ZWьT‰еYmЌoЄ*-К&ZзlSwYн:g‡ИшМ‘žOщ€шEr@Ец LFЉ1ЭувœЁОd&Ma>Ьб'šo$Б9ёѕp8UЗŽи+Бје:рUbxU`vVWЉО™РъЊ БЎЙжA[,ЂЊ#Ѓ3чЧЂКuЯyеiCИ—Щ§GЏ5ї˜9ŸчЭ­sЖ‰ŠН5хO’SЂO4пH`ђ!КuТW&pМ“Ие:`—ЊуЯЊЌюG5DfЇŽvbuЉўВFЅ1еЕаКhƒet@ѕНDGVЗ.к"2њ"Б:jЌWткюб{єjsчбЋХ7GnвыХ‡ЏoїЃи|Ј^мiђУD6Fg6ЧEg.SЭ!‡јT`2SU5КdЈcmU%eŸR+,ћ,3;ЌњT]зљS]9ЋБVДnz‘ш[‰Œ^ЋnДEfѕE`uжPЮР§c-ЙїшѕцМшЫлLЏV‡Иї‘^›AгcrЇaа&kЭнGЯЇpFѓTШ@OФ6gEGœ†3šo$0yшў1 ˆVuјй:cztЙ„GЧdŸS+*ћдYYеjЄuЫ3ЦmUбЃЖšk˜ЕеЂ9 zЅ93КћъФцдъШЅ8dюzWqеic8ЋЗъефЮЃŸhŽ‹>мlнѕЌ•ю~ WоYњŸУzsчбѓз№ˆцyfHєdЏHiKиЄg"–ЭЗ‘иœИ‡„G V=8][ЇlVuЌ>_#LЃCВk4=bЊчЭ}WOтЊ"ЂЧu5еАъyЃИZhZіœgšћОX‰юПZєЭdVgЎХG‘бyбyC7ЋзіоЃW›;^oю;z57-њ|ЏuзГж“;fЩЭѓc0aГЬцбwQп~,^›жь”qВL„œ†‰Э‰s#sNv>€ЯЊ?ДŽйЈъT}љркT]“щR=чоЋOqу н}єЙЎ–—=­Ѓ‡КN ъб7ЃњЦ2Ћ‡˜cq&/:p~ф­ХЕ ЄїъецЮЃяЂyИ>Иvkm„ГЂЏ7Zg=oНЙѓшa’в<Ќ5‡D?їп<о+BvщБ”“eLѓm$6'ЎС!уєЊ?[gьPзk‚КФUЯЃЊk:;КЏ>ЎОEsзбЇМZj]іДКГшЎЋO—ЄшГ{‰V§…Ќ­ШжMлeV? ŒЮщРYЗƒЌэ|­‹^ВЖW‹ўЙyбЇ;­Ѓ^АœY=њНqдKV›SЂ'ПЕMzйJrџбЃН"Їљ*А9ч4Мв|#‰ЭC`ђёРŸ_U/­CЖЋƒгЕuЬF5‰ЮЈž5gTŸSЋ2ЊOЋoЎuжГŽ}ЫшžЋ+0њ’—V}ОUŸнKtHѕљšS}‘Y=dч#б#7ЋуіНaeУnДAъ“x˜Џ5їНŒ kОмiѕ’ЕфœшёЏm“^6Љ Y†“eг|Гп]хьбWšo#Б9q ЃязрkRŽ—ж)[еDыšmЊЋчбеiб‡ОАшcр"Кыъs_RѕЅnнuѕљšT}\}§”=\“ЊЧ’Ћ[WьT=_s69•&эzYчтЩкг{ѕjsчеO4‹ўьDпЪjlчЭЋпзє>а+Ч`џГcёИ0ЃF‰Ыp*cы˜йюЦRЖш1Э7’иЙзРWW­SЖЊ‰ж5лдDw_}œGw^} \Dw]}ю‹Њ~:КпъJŒОŒtVѕХ84Љzќ9$z"2:ЊzЖДЮйфК“жbмЖЗВU‹ўжšЛЏ^юЛњ‰цОЋEпJdєњЩвyѓњз7Џ}1ж§ьOv§Яш…„e8БuLelw#9{єUbѓи<&‘ћРџлЛ“фЦ‘%ŠЂ\Ќя ?%‘D РjўъŸc–%€šм sц сoЋХь”ЫЊЋ+БКВЊ +ЊКЦб­Ћы,КsubєвWНmŽgvНЖд­3›G?іМУ‡ЭЋGЂЂгм}ЊзrvEаЖїpмЊћW'6GFšлgŸDїЎ>‹n]-њS"ЃGелчеŽ†KмМy[Н|2ЗщŠMdџ‰>HИ w"ЖŽ•˜эnДG?%6g~Й~ LОхэ4UГоS‹й)—UVWXѕwbeUџ$VTuЃ[WзYtуъЅ/.К†‡sЫ^Yѕ­:›GŸє%T?ЬЉЙУœQ§”Гэ-’ю0ЧцўбƒцібЃцій'бНЋЯЂ[W‹ўб3ъM‹О69ъ‚эHLЧNФDo…\†k)[ЧSв~ї љC›o‰Эћл ќŸЈХь”ЫЊЋ+БКВЊГЂ‰IеuнККіеЋƒЎ†Щеs‚.fToЯкЯЧЖ:fYѕem{Яƒ˜ъгцЮбwЧцЬшўйУшцеуfеџб#њcБ§ЃoЧ—‚„цЕŒщи™ш•œЫ№!iыИ‹кююВішЛФцФNм7ОФР?Ђžf—\W•W]V§н˜}ŒZъgcPѕ*ёч ЁњXP=(ь_= l=(LИ71;Ш*pЛэuЎоnziбћцюбЯƒ ъћЈъЃшіеУшюеушЬъйUПљUЯŽње&ДnбЗ]eFє^fsVtЬuИШй;Ђ6МY›єјцшФцШсИ&'|%6˜ @CѕmvХ;ъivЩuUYе?‘YеїШŸишmdЦRяЊ c}LT§/й†l|›Т ‰^oЭ•Н…Eз!КsіysяъћЈъЛЬъo‘бЫm<ЌњyT§}xCˆ}KlŽ‹лЈПЄн\bоЙж’ятšџ]‰Э‰з`цпD|iz”иМz ‹њ2;тMUЙеГ+.YuЦTW`є63#КбнЛ‘Њџ-Їб е›“ЈшЊЌъх(:zvзKџЅ…nн}vЖЏ~|fTяфGЇU‡<Іо=—8Џњvxжn.2њ!БYєgфMtмЭe}Sœ]rYр]<ёЩ#Б9q6"›їŒoђ›7—@јбW%U?B“ЂŸЅ9KНM‰ЎCtџъЊAuїюJЌоGGTGFo#kerзkЋЦ ‹^Ž’ЃggНД4ц,єйDЗнЛњyx кіж"–z/c@v"Ѓ—k3)њЖŽŽЉŽŒ~ЬE\єуgNєC`tжt|IлЇзї—й%—о#Ÿђ4FbsтО1ј–,B`ђmљћкЈЪћЧшЋЂЊR+Љњ™T]Лш„ъui…do;3ЊЋЋїбsН>ќ?45nЮ‰ЎРшJ‰Ў“…ю]ЇбЋ_DїЭ>юw ;ШБ.a­"&d/?:ГzvЬeAбux:m_НZкэСьАsћ{a-PГгЮІЗ–[фœЂп.hу…>iюНyŒкњяx‡Д˜]z‘sgy К>%6'ЮFф5ђ§уA`2ќCъй oјn­JЊОЗVPѕ3ЕrЊWЉ1еЕ. ЉЎк††UoЯЇ6§n4эЃWk[•R=\шобыШ ‰ЎгшОе•Н=ЫЈ^ЮnЧ­ЛA\ТbЄGчTЧG7Џ^*cЂыЬьАЦН­ЋЯж8Ўљё›ЩmgЮЇЗ}ѓЩч‚ЎЧuп;qо&.e“^KlŽXšђ†РфцлѓЙРdј'дГоR?ЭIепЕUIйїжJЊЎ}t@ѕЊ4ІzНЛўТЊW‡§ЋG3н,ѕьœ‹жЏZГ[о˜ ФЈ[}™ёŽZЬNЙЊ6fз\R{Гƒ.84'UЏЊзЁ1еƒ•nНфЉЎ“шЮеuнИњEtпъWбmЋw‰У€шэљѓуЖбЗqZѓљы>еCэЏХЇ™ѕк0ЙwєIrыъѓцОб/š›FПШMlNˆ§юѓ=—МJn}|8ЪxdzL№њМyєnЊ3šO_Ш[7oЋSšь–zvЮEыЉžнr]R+Ћў˜н№žz˜r]­ЬnЙЈvfї\БoŽЈ^•&GЗЏоЬDHєfCІКNЂ[WŸF7ЎЎѓшОеЏЂлVяяG­Ѓmuі‹FЮвZ/ѕ‰юSНVГ‹~s,n_=Nю}жм9њДЙqєysгшWН]ЃїЋК;™wъХ tM~qѓы;бЗу јЯYчЫ№ЫЩPЗnЮ|Mмv†4Ÿ|0;ъw‡ъйAWѕПЇŒ-0Р'ейoЈХь”ЋjcvЭ5UyеЋж˜ъѕњІDзqЁлGз(К{іItыъэІВ…ЄGпvіьДSЋкчљууЖе'mНЃo'iЭЋ*чЦx|l Ј$ЗЏ7їЎ>kю}км4њМ7ЄywWOˆо~rk}л7o~ѕљœkŽбЋЗХiUПйHћЫ№лЖ2ЃљДzvж/†ЛоьЈ_ –zvвЛъй9—Х,0здь€7еньŽ7дbvЪUЕ1Лцš%6Їzпœ]быYŽыatѓъGїЎ>‹ю\НКЇ§Ћq›ЦўбуO{W%EзЮьž іЩбЧфўеУцце'ЭmЃWOw1бЇН)б›ѓГOУU}млч$]а}†бпЧпff§тlЈ;7яЋ3šOо^fG§jАдГ“ЎиUЯЮЙ*e*Ž›јяЈ/Г#оRГCЎЋ•й-=b“ЂŸ­AбЫXф HЃћWЂЛWз0КyѕrцDпѓю™!п(Ўѕ@Т„$EзЮьž+іЭеЧфўеУццеiЭ_m'ЭmЃЯz[GŸ7'›sG7ібѕЛЅYїэTЇLЫІ:Єy[в|;МнЮЮЙjU=;х-Ik ќuѕevФ[ўфVXѕwmVєН6*К6бйKkPѕ1Кѕ3і–T}[vшJЋ^†DЏЉў€Э~=;цšкšsEэЭњн!9 zдмН:Ўyм;zп=ЌЌћŸЖ"Vі`‘П]ъ”E^ˆГЃ~ЕЎNiОmц:%љЫЊzvЪ[’ж @§1Лс-_ЕaбпЕUQе?ЕUIйиЈъgk`ѕm•ŸрYU}{tfU?Јў„Z™нrQU\tU^єО9ЁњимЛzд›к} yj Yм­}sFћ6:eХ=ЛшŠUuNєОzvЮUЋ™ђ–Є5€EЭј ъЫьˆ7|зVVѕOmEU?bЋŸAеŸ9бYђ њ#jevЫEUyбš?Ѓіf§цм?z˜м=њИбѕOоDЯNyУІ9&}ДрKuPєЖzvЬuIKМ pЎў˜н№ŽякЪЊЎ%:ЇКBЋў§ЃTL^u-fЇ\VбщЭ)б]Г‹~uLюпyЎЋg—М#Бy}їNJ.tPѓ-яўUеь„wќдV…eпюЭ™бЊ?!БКЃ+/К*/КDFХEчп2ЏСЬ :єY)юY€|5;рЏЈJЬV§)]•W]yбUСбГ;о‘ИаЩЗ{ѕьˆї%6Рпё?Цгq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/16.voi0000664000175000017500000002637710513166570021720 0ustar michaelmichael‹16.niiьнOŽ$WРс4А@œb$–и#!С5и с1В9'р,,рs ФUиРtwuзПїВВьžŠˆšяГGгЎЩП EОЌЪMџў‹e‰яО}ѓhyће7_љіOп|ѕўmМћыЛЗя—'п.?^ўЕќчуЏeљтёŸc?Z~њјћп~sќыд?~їГџќзчЏ?љпюїяўђѕ›_Оyїч?~љ‡oпЭў№оѓўЫ7ч>~ч'ЫИs9y§ŸŽ_ћя‡у?їїП=§ўтWЏPWˆь€""ВЎВ+Ў ЋЃ]tьeЇlнЃ[VgЇlз2zщимѓ”^ZоФ€ЫтЃь†+ХNvЧ5"V7‹ŽУт&ЭGХЂ?Ѕ8•Д…ш›щим3zщи|Tr†ЩЏ,"ЛрzЭmъїЭё 3eГ—Ьx–šГЭ.2$]ЖkŒшTg\ŽчЩ-Ѓ[Ў‡шOЃeєЈ:;щВ–бчейA›tl>ЉЮŽЙBЧцЅчЧЊˆˆь„­žKуQnЫFћвhS}ийЅzам#zџUш—Ш8”]uAŒeg­ї‹^ъпa&ЭэЊы7пЭ…(њгшим3zx{i cѓiuvЭv›—§EргŠйWйѕЖы~в0;ЂЫ’ь##КTdF—ъaГшз7nn}&;kн$КtіИЗxѕxЦэЂ—Ѓ‹ГЄщr4‹юz%o};›{FOnŠѕul^NГГkЎеБ€ЯY<ШŽИJьeЇlЧВsЖxЈмЅЖЩ>Hl3ыƒЦ>rаиfЏл4Dї9@b"Лkе,Кtі<КnѕJsнъIkЛшхшЌшnжЃ|tЫгCєэtlю=ЋЮЮZз2њё3mЗц]ѕўыЭЫбђ“џр{ŠйW‰Нь”­тXvЮq.;щЂAsљъƒФ6б‰}&НOьГћЦF;=М ‹GЯšKWЯЃ WЏD—­^k.[-њVю0КeuvмŒш›щим3z^ЖІeєЌ:;ы‚ЃЦ&ЭgЯУZ4/йпK“щtэр^DvР•b/;eЋ8–ГEœЩ.КьМЙ~ѕЈЙzѕИЙvєKdЧшN“юи<Ў\=mЎ\Н]Зz-КlѕнD/ХЋW]5њBuvнDЫQ‹О•–бїsP—ОЛЗLйi+žћ:5яЋ_Јн<Ј^ъ7ПlFvЦЕvенК›N{щї|€‰x–ВYЫЮй"Юd]vо\?zа\Оzи\Юк`в\;и\|шЃA—п”ёq'њѕ­G­}+ЂkVп]tvлTЧцЩ[кЭг{vщцхxШХїтEЛ~а2zRНдОзš[Uя_ЮŽ›šЯЙnѓЪ}1;lUЧцeКие5L~а0^_Dd'lѕRбЅњЅ3vrs6йeЦ^vбE1’uСЎБUєsbЇшчФ~ЭЭ6К]№2jЮ.к`ж\9м\|шƒцњ›rжмaПgGїшьКБ;tЫшьК™Л‹Юn›Кш§ЋЩe+f“­мМВйakЎєвєЈ^юY]7г2z­:;mEЧцІOlZ>7]ц@Šk˜Мг­р3вшвG|ќ7Пˆ&йЯ­ћЏЊ‹—дˆ&е1нtЩЈЙzѕИЙvєKcЧшN“ž,GщшŽЭушьЈ ІЩ•г'CЎ=№й”KWŸGз_ющйQИYєЭˆО•ŽЭ=ЃWЋГлІЦЁЕ›ЇїПЪЭkы‘ЖЂхЅИ­њ5ЕЌnН^7еБЙщУž?†ейI[4L~в.рГ№є“ш;§8њ8нВбKnŸьƒЗv d7]2jЎ^=nЎ}z vˆžЬЙvuЧшŽЭ-ЃЇН•Ћg#.=ыЩV”о•1wŠnp-ŠОбЗr‡бйu›ЯЋ^Э [3mхцe0ч В~)ЭОнГ:;oЬЈoЇcѓjuvкŠŽЭ=ŸA.УььЄ-&?ъW №9шїУшу@vЫF§Ђ{ЛtŸ7з>hnГ"gSnP=i.SйesѓfбЏjЅYєЋšеVЎžNИђЌgKQzAV“{DŸНPГzИгЂ?{ŒЮЮыиМ73 -о<џАRЙy]}CЮЂ[ьѕъЅXЕКeє}VgчMtlюљaЅ:;lUЧц•хЕ5L~дЏрѓаё'бЧNvЧvб79ЛуGЩ-ву$ЙУЬЧЭХЋуPrзšYrхшчР8—67ˆ-Нв,њUЭz+GЯ&\zд“ЅЈН у=.ОеЋЩUЋ'зaышьМБ;ŒЮЎ›ши|WwёвЭГї§Е›—YsщiЂ,ЩкЅXЖКetЯ›bЯъ–б=яхMя‹гхЕul^fŸqыыW РџлЛЃхД‘ Ѓzи~џgиcаŒ,ЖїќфœЪ&[јцЫTЋ%ШРП"№›шыЂЛтYЩќeёgBжŸьћЋЏ>u6}ы6БnѕfК Ќ ‰ЎЙюДЙФшƒцШшюДЉз9шеœЦМјY6ЏZ}4гЂRbѓ FwЧЭ$6GоХЂЛЫLZWNоЋo_lЭ:Ж?ш„)9Из­ŽŒЮ|ќxС[yfuwмTbѓ6ЭюЮњFbѓ6} Y]`2Рџ’јю‰пD_•Zнн№МJ<ьЪЈОMЌOA'|EжюЎ#5е]v 1zо,њG%6ЯЂЛГхoУшЏ—ЛуfŽš—­ОЫН†.?(геБpsdtbѓ7енq3/нн6˜<юю:–{˜<ˆОџпюМ‰Ѓ§Бlѕ7б™енyc‘бžš~QbѓAuwиБРф7Щo“ў‰_E_•U]wКkNЙ„FUз@wгwFЭЋW›ЏNŒž5Џ\=o§Ѓ›_eEw'}o–МtўјŒ?єЃф„шкЭJwмЬhyЌоќzбЫVFЏZ§Zбo?ъŽ›Щ:тЋРфm_ннsЪсQ/ћW8˜ъuOў›шЄъЏŸ4зЭ6EMЧЊб™OM™Ÿ#„оЮCячгOї“ №ЏјќFњ uЋ;цœzанsЦcs@є.9 zдМzѕИ93zщъYѓЪбгц•ЋЃ›GбзєvšяТб“фЕЧcžМpѕ`–зПяCЖЧ|с…F/[}НjѕqєЂе/Нєэe~Р GЯ˜ЖЄшлѕe Йі-eџг+q[yЌ›WTпў 5m.2z2жЋo“aѕтЭ[ш‡‡›oaЩБ9Хџ„њаrZнъŽ9Ї*/КuАkЈ4/=j^НzмМvєЄyщъisfєКе‰ЭГ §ѕzgеБirLєУk­aGіЭтCtЦіИ‹LйyƒЗ~ѕqєЂеЂЫ EОо719оДшлз{лІfcМrѓД:,КЎ/7w›MѕЖtљМ:pBжŽЮ|wљ)г–љ!dцЧН™џ№&Џрпї]єѕЅ;хЌКг]sJ=ъ:aзНo^ПzдМzєАyёъIsfєЪегfб?+Б9ђЖ2~фXМ}аМў‰яšЦdоМpѕ}cШ%y—˜ВHv еЂKdє7енu‘G=]j^ЖњqiЄEtзMМ`tfuwн„шпbЈMdєauwлм‹Ew—ЉсгввЩŒKWo~—vвY#§!Б9ѓ_0оФќ3ТОŒў’[•T]7К[NЊ{н9ЇT`єcsBѕОy§шAѓђбЃцеЋЧЭ‹W'FЯš#ЃЛЛŽ {ožмVжnоvСгБMšзю~ŒLИччМpѕ}тшš\а~yDWwЧЭˆў-‘Cm>~ЯЫEwЗЭEF_?мЭjўxЃ’еќ!1:09ѓ or3$6ПIы`MUu§-F}щN9ЋюtзœR•}[›]бГ‘P=j^О:1zмМxubtbѓ‹Ltwб ћр€єIѓкнЛСH”љA‡DЧ\’Ђ‹шпr­њGEFПоTwЗЭEFo—ИАц‘б™ŸшНDtwЮ9‰Э!я[“рЇдEwХ3ъSwЩiUqбuЏ;ч”›м˜шл#N‰ЎЧƒЈЎюІяŒš—ЏGЏ]=iŽŒюЮ:˜<ˆю:c_М~њЄyэьyєТе“нБvЕшп"њзМZєКе‘б™е‘бенeG"ЃпEFВЛ‹ЮˆŒоUwїœ’иљ!ѕE`ђ›МbјgеUwЧъKwЪYuЇЛц”›м˜шЧц„шкщ.њоО9 zНzѕАYєЯKlŽМ у‚пŒŠ—/пGœј~8цdМ1юіђ)ЏўЈю€gеЛюŒgTхE‡6oЭuљЃ;ф y“Бн tPxныЮ9ЇЋEџ’ЧцˆшЫ%nƒМgІE_~K‹NœщWИЛtзœ˜МeОˆ[xTџЊИ`€ѕІ;тI‰Эл[vwСsЙgЃОtЇœWеUе•Xx-^2гЂЏђЂѓ†њсZьŽ9'q{dGъюHlЮ|:нbГ~PеŸ_е]ёœњађŒ ЌЎ ЌŽŒОЫюNyBdєійнёœРЃœФ§‘и9[шъxЯюn€•UUwТгъЂЛт9UеббYе™S}­юŽxVтQuц•˜иМeоШ€ПЃКр—§wд q{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/15.voi0000664000175000017500000002530410513166540021701 0ustar michaelmichael‹15.niiьнAŽ$IZ†a`8EK,jБGB‚kАid#FˆщA3€ppОт*l`"Г*3#мЬУsфэі^Яг*eЖwI§Іщ wЫEќ§/–Ѕ§юЗпНXОџеo~§Ыяџщ7ПњёћіУПў№§ЫЋп.Мќзђ?ПџГ,Пxљчо-њђѕпўцўЯЃџјЛ?ћя?џыѕѕWџїхыяўхзп§хw?ќѓ?ўђ~ћУш/ТПљё—п­§ўПќЩвя\ЎџчOїзўїЇћПїя?§эуџѓ/ўъ€rидfEДжf'|V{5;уSZЫЋn-А:1КЕРjбЇIlЮŒŽмЇ3п—Ш{RЕWГ3>ЃН›В[kyе­V'FЗGГƒіИDєьž].БвЂ.‘б‘ћtftфНGц]оy? пœжf|F{7;eЗжђЊ[ЫЋnfэАjNЈNŒю4зЏNlŽœŽЫЌt§jбЇIlюUЯ.к!0yyЌž]ГWdtф“Ыђ–=;р@mvРgЕЏf‡ьї%7*Лн›ГK{4;h‡Us@uЇЙ~ubtЗЙzѕ…ЂgW=‘ж{9™еЂЯ’иœљŽиžнє\`ђr‘ъй9;%6/‘OуЏт‚`i7Г#>ЇН™]В[Л3ЛfŸжђЊ›ЊзЭхЋ{ЩхЋЃЭЕЋEŸ$Б9r‹ю­єьЄчЇ#3:ГњJбГГž}šШшЬ7˜uѕь ]›—Льй)Ÿ’W PYЛ™ё9эЭь’§кGГcvjfїьђPНJ._н+Ў=hЎ]=lЎ\}Бшйec‰Э;є2ˆЎ~™ё(Y}­шйa›DŸFєi›ЛеГ“іLО L~‘W ќ!кЭьˆЯiof—ьз>šГ[ Ьn-ЏњБЙ|ѕ:И|ѕ ЙtєАЙrubєFГшCi>IbѓеVКpudєхцcvкXdєе6Нйe[DŸ&БyP=;ъЉФцe•=;gЏРфyХ\M›№YэЭь’§кGГcvk‘йQе­ovжІAsщъasftнъfбGкjŽŒžн6”и,њ,‘#Y-њ,ЂO#њ4ЂOљ4>ЈžѕTbѓВЪžГW`ђiН ДЏf‡|BћhvЬ.mevбSыфњенцтеƒцвеУцТбуцЬшВе[ЭЂЄљ$‰Э—‹Ў[-њ,[бeЋEŸFєY"Ѓ/їž8;mCdtфгxцЙGц SЗzvвЩ/ђŠNв^ЭЮј”іnvЪ>эбь чVЩйнцтеƒцвеУцТбуfб‡кh}Є­цРшйeз9rЂЏ6вЂ%њ,‘б™еЂO#њ4ЂOyю‘yТ”y–ЗDžšо&ПШ+"ЕWГ3іjїfчьбжf'=гI._нoЎ]=jЎ\=n}ЈfбGJlЖнek:Ъv_/КjЕшГ\/zvмˆшГDF_ы†)ЗzvлPdtф3bftцƒРИzvиІФц%ђдє&0љ&0XкЭьˆOhЭŽйЇ=šєм*9 Лл\Мzа\:zд\Йzм\7zЃYє‘ЖšУЂ_ЏЯn­q`sтtдЎоn}бg}–ШшыНЙЬnŠŒЮЌŽъы-ѕьЖБШшШsъйa››3OM—Шѓщ›РфyХp˜іnvЪ^эоьœ=ккьЄg:ЩхЋћЭЕЋGЭ•Ѓ‡Э…ЃЧЭЂЕбœ§ѕђьЖЁС—ŽоšŽЊб›ЭUЋEŸEєYDŸEєY›#пХ/tgЊњg}НЉžн6yZ“y.6ЌžѕL`ђM`ђM`2…Ежf'|JћhvЬ>эбь чVЩеНцъе§цкеЃцЪбУцТбуцКбЭIбoWgЇѕ8/Кќxl5W­оn}б'yв,њ0‘б‘3}Хшйu‰Э™б™е‘C}СЅž7y†yZ“y.6ЌžѕDbѓљ›€›Рф/вzО эеьŒ§кНй9{ДЕйIOušЋWw“‹GšKGП7цDˆLŒЮqГшƒ%FoЌtйъ­цЊелЭЂѓЄYєaDŸEєY"Ѓ#пЗЃgЧ\/Zѕ‘"Ѓ3Ї:ђб%3кѓј‰›—Шѓщ%ѓ7Kв9яƒ/‡дГ3ИгОšВ[Л7;gЖ2ЛшЉur§ъnsёш~sэшAsщшQsхъqГшCm4gF—­NŒоlЎZ§ЄYєaDŸEєYDŸ%Б9ѓжу‚бЊ?еы`vмаЧԘш­ъйiю"SЂ—ШшхcdJѓђ–Км/{yЏХй9ЛНЭЧь>hяfЇьдЭzn•P}•цъе§цкбƒцвеУцТбуцКбЭ™бUЋ7›Eh;Кfѕ“fб‡}бg}–+FЯЮыKlЮМ3Э\ъШЁŽ_ъЮ0ЛnЄWX>КW]?њБКEDп7О| ˆ^"Ѓ—›ЧїKбММŽХKgNђGyХзжоЭNйЉ=˜нГУcrBuЇЙzt/ЙzѕkaVє`kW'F›ыFo4gFW­оl} ФшэцЂеЂЯ"њ,ЂЯ"њ,‰Э‘їxЁез‹ЮЌž7r—ИўІЈ‡uЭˆОЏYщNtљ™^>„ОП”^жбѕWњІ=;ъЙ/‘QЭ_%6/я“@ эЋй!ћЕ{Гsіh+Г‹ž[7—Џ~I Ћю-sѕшQsщъФшqsншfбGкj.[иќ$КhѕЃkV‹>‹шГˆ>KbѓvєьИ‘ШшШлщЬшШGФQєXНюŸуŸСR/ѕьАMo1лЧФцќшй-Ÿ˜ №YaŸщјIєэнь”нкЃйAOЕusљъ—ТАъЮ*—5WЎ7‹>дFГш#m5‹>PbѓЃЋVoG­ОbtЩъgЭ%Ѓ#WZєi›#яё2Ѓ#Ÿ[2ЃGеГГЖ%6‡VGFїЋgG=Н|­ЬЊ^ОD†-іы/ˆвFdYЭіьœн“_„х|Jр'бЗwГSіjfэАjЎŸнKЎ^=h.=j.]=nЎНб,њH[Э‘бГлF,єY.ЗвeЋЗЃ‹VП–ХE/™7yб/]aбЁ3}KЫjŽМ™ЮŒЮл9n›3Я,ѕ‰›ћбГЃžŠŒ­ЮœыЫ,іь }“О yEпюЬЎйЅЕМшЧц€ю^rѕъAsщшQsftсъqsншfбGкj}$Э'Й\tйъЭшЊеяyAеыbЂ—ЛК”ш›зКœёX†“QКyУьИ‘Мт›KEЯюк9еушЬъйe[“Ѓюя>ˆŒюWз/œыаСŽzј(Џр›їqєэоьœ=кЃйA;ЌšВ{ЭеЋћЭЕЃЭЅЃGЭ•ЋЧЭuЃ?6&FЧЌєVГш#]­Yє‘6ЃЋV_0Кhѕ]_JєrѓЬ8Wkž6Y8вЁбцу<‘буъйa›т‚_DFwЋы—'Nѕ zvдsЩ/ђŠО yŸFп>šГO{0Лg‡Чф„ь^sѕъ~sэшAsщшQsхъqГшCm4‹>вVГш#]­93КjѕЃ‹VЏ УЂ_Ђ3ЗЋн/ЭNЛкtdFgVЯnŠŒОмў1;mCdtф SЗzvв‰+Z:"йГsvЫ+ј6Ф}}Л3Лf—іhvаЋцњефђе§цкбƒцвбЃцве‰буцКбЭЂДе,њHЂOВй,њ@лбEЋW…iб/‘Э™ЛGц§Rdtфxˆ>Mdudtфі‘љ4ž=ЎžЖЉл[МЙWН”_щe0"ГЃžJl^:)т‚ОiFп>šГO{0Лg‡Чф„ъNsљъnsёш~sэшAsщъasсшqГшCm4‹>вVГш#‰>KbєfsDtїBAЋЅMˆŽœiбЇ}šШъШшШъЬшШ‡ФЬ3„qѕьЎmоњбыъ%`Љ#Яz—оbGLў"­€šкЛй){Е{Гsіh+Г‹žZ'зЏю6‹ўєЃKW’KG› G›EjЃYє‘ЖšEIєYтЃћ Z-m^tрxˆў9EFGо{XъѓDFG>КdFG>ŽЋgwm[чDЏЊ#ЂЛ#2;iРф›Рd8R{5;укGГcіif=ЗJЈю5Wю6ю7зŽ4—Ў6‹>жИYєЁ6šE*1zЋYє‘тЃ/M лвYлЌ•Ž˜шШ}Zєy"Ћ#Ѓ#oЈ3Ѓ#3Я2OkжеKBєъp:ЂљЎ:d_$ЭѓGiН№­kяfЇьеюЭЮйЃ­Ь.zj\ПКл\<Кп\;zа\Л:1zи,њXуfб‡ъЕŠў9$NЧЂяЎЭ лв]мъе‘Ј?3-њPЂOѓи™§ћo.NЌzІ7бѕЧуОњёпЪzo|hЎН|ˆNйѓ–—ъюг@msН<МCšюH3’obІШж^ЭЮј„ібь˜}кЃйAЯ­’Њ{ЭеЃЛЭХЃћЭЕЋGЭЂ6l}ЌqsRєp в[оДцї•ž]ЖЁ;Шiб.N.лА]Зz=г?@EЂO#њ,нЮъбн§-%К-3ЋGп ШнЕ™QЯ!h‰ЮдОšВ[Л7;gЖ2ЛшЙus§ъ^sѕшnsёш~sэшAsэъФшasXєRНy§ѕтьА нЉ(омŽШшРзслЅйic•§Г}–~nёшСƒVBєђЖб}МXззжЈшоSѕтЦ{тьАMy[о бЇ‰Œю? д˜ќ"Џ€MmvР'ЕwГSіjїfчьбVf=ЗnЎнi.нkЎнmЎ^ны Œ~Й8;kS.тЂ#Ї#р…8ŒЎ\=n.ЙвŠЎОщѕ—8/Кўx\ьнevи&бЇ‰ŒTЯЎz&2:ђДf‰<ЫЛ Lў"­€ki7Г#>ЅН›ВWЛ7;g/ЁQбmevбsыцњб‰ЭŽйE;\Ђ93: }]Йzи,њ`ЂЯЙ{ˆ>шгˆ>MdtПzvдS‰ЭKф гM`ђ‹МbрбnfG|J{mNъnwfзьвЭкaеи|с˜ДGbєzЂТћбХЋбЅЋGЭЂіR'њ‘уёV§˜?Лkг[c`tжx\ъ-qvжЂO“им­žДG`ђM`ђ‹МbўП§:ШЂ(ШaѓўgА0є4 hІX˜ф#$`ћ„’ЊxВšuG\Roн)ЃъCwݘЊМъџЁ9!:Бља}жќјjб79o~xuEОъUdtдљcS—=msЂїФФ%/swЩŒщYdtцРОК;gT`ђЗМb˜UwРUѕв2ЎЖКcU`tFя›ЊыЈ;щпNЂ_}ж,њ'œF?Н:2zњшL‰о”bоє[аxЬБЏgNєš™єFюˆ™б™'ІcuwаФцЬФ)r/\ФќE-К3ЎЈЗю”aоœвНoŽЈNŒ>6T‹Ошл,aбЧъцžkh`sмt$FяЋЛs%6Ї­&РoR‹юŒ+ЊђЂ+0К>uчŒIŒЎНю Ђя"њ>‘бГДшZЏ)Ј9t:›ѓz˜ @ВЊъNИЊн—TхUWV'FWV‹ОSbѓЗШш)ЌЙ6ї ‘Ѓќˆъ€V_ѕ ќїq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/14.voi0000664000175000017500000003616310513166502021703 0ustar michaelmichael‹14.niiьн]ŽtЫ™–сlр1 K"dqŽ„грФ(,ZˆЖ‘›0ЦТLР“@L…иѕ—Й~""ГмЕ3о'}]-яяЋ,K}WьwХZ™e)ў§п\.эяџє›w—пўэџюїП§Oќл?ќЖ§юПўюЗИ|јгх_ўзхџќђŸЫхoоџoя]ўщћŸџэпьџsє?ўн?ћпџќ_Ÿ_џ№џ>џќћџђwПљ—ПљнўПџњншПќ ју~џ›Г_ОѓO.§ЮЫсѕџљч§kџїЯћџоџѓП=ўџќџъЪј+вZ[№}­хe'6чFЏnј.ЭO’и|IlО$6wЕ_ЌnјЖжГЃ[ptTubstєъŒябќ$‰ЭБї№?V‡|KлќТІњCbtрЮИ[чŒЕЋ3ОЇ%VGGGU‹ўЕ}FЖшшЕ5:DЏyPлGЏyд+DgdяЃ/елшЏ–—}‘њкюЯАшызб!KНs%онЏ’nфno‚Ђ#g€е~ёЫ?Vg|CЛZ]ђЊŸFєЏэГБeEЗЯ?Ђš?2ЃЃWї<$1КЂWї<ф~ŒŽXэ}єцыЪбKнœшИълптЂG/}z+›Нџ*bІЗb.Ф/л/$КЕМшФцKж§p+0јЖію—?V‡<ЎmЌnyPkyбэНКчя‘aб-0њГ1ЊљвN+НКшОvˆ^нѓCєъœ‡Дˆ^ѓ˜Nt§єstР‚ŸЂІd}ЩŒŽИ[^VtRѕ&12њВщ^XєˆsbbtТJ_‰уqймSR.ФЫЉ7#КWН:щ‰Эчъе=ŠŒћ €{Z[]№]энъŠoiЋ[діVч<ЄF›ЊЯЭѕЃ›/•AС—Як[єъœЧьЃWз<ІНJtљєNtљo§шке‡шыKЋЛІ:+}9/yYЧшˆ{Ьa”3Њ#Ѓ7—]dєѕЋш6Ѕžмшу=Іztяэ–ш_Gbsшћё—Љ^]є˜ФцKфЇНŸђŠрЏZkmuТ7ЕЋ3ОЃ]­.yXлY]ѓvД:шЇц€шsГш_EVэ‡А%ўп]НО]}Щ{{]љAщDзŸю—ˆn OеЇш„Э/:КЛT5ŒЎ\}K Šоnqбэ№eFtвLЋWwMEFЊWgн‘и5TsуšWЧ<*НYєЏЈПiЯяE—_єЮў\~R:7•њу}ŒŽИ&E?KbГшЇy­™Ў§bѓБ:l&2zXНКkЪR?MdєЈzuж‘б§ъеQ‰Œ~§&2:рsЎРd€oШ<‰>ЎКЕИшжЂЂп;[KЊn'Ћ‹юKlОœ‚ЊгжјMbѓEѓ“tІЃ|ќyЋ Xѕѓ0+‰буцТеЏН:mьХЂW—M$6ПVєъЎЉШшЬъ—ŠV§у†б™еЋУf"Ѓ;яЂЯ<&D_ЎыћѕuBє‘шЇ‰^н№+ <дНEпZ\ukyб-)њЃВЕЄшvВКшОИрЫБyuЭƒ4?IzѓWtљјѓvWе‡Э•Ћ_-КlѕЌYєO§,‰Э/Н:m,Б9ђЩc\НКk*rЉ#Ѓ_ьR ­^]6бы,}щ­mFєЏ•}§4‰Э),-№i'бЗWн>­юј†ж‚Ђ?[ ЊўhliЭYС——h^ѓ˜РфШцШшуUпЎ]=hЎн=‰Ў[=‹.[=m§ƒD?ЫыEЏŽ‰ŒžTЏ.›§,‘3Yнџ(,&њќъЂЂGєW5 њбWышжUюKlО~аЮЯ \кЬ+/5;ђ—Е0xюxћА:у;Z‹‹n-(њ3БЕ ъЯФДцƒеEї%6ŸЃW= ЏјиМКцAљ вн‰Ў>ˆ.]=j.]=Ž.м§zбUЋћ•QбЧ—†ЭŒЦAєOы^}abфюб,њy"ЋЛ9б—5н7Xеˆшюы r4ZгвбЃКвЭУ%-]|MGT?Oё[рHfvѕށ„МžФfž"яьРУЛOI:к§ГА%E&ЖЄшжЕКjЎп\Мz]ЙКлНy}aдA3q“4Щ_Т.РЩ™#иќб‡я-ŠКgВЬu~2бЧсШˆnЇяЌЪš;п[6бЯ}ЇzuнР(1$Кї%IMBdtслјe2Н…›'—\сшкs0§"е?ФёbŒˆ>ьж+}ИЇDЯ?M(,ГњВ _ђ-‰ЭqO”Ю;;чРёЏТЄЃнП “ЮЃџ,l-(њ]Йzи\ИzвœН}umйиxu“ЂЗе ЛІfs\5:чклx‰ше=‰o^ѓЈysбc]uэgуQvbN;оцШ‹Ў|mFFпЋ^з—}ўЦЊЌЙёЊŽО ЃыnyГюЂЛпzzЭЃJя#Їшˆ`ВьћЮiiНъђйЉ}иїBЂїїХ”шйGz•EFG~ns §шц]dtЮрKрсЬ‰GJgœнН L9&§˜t §g`;Zн5sŠ ˆ6Ўž4‹ўIНдМшныKг†Ц#!њgЭЃW–ЭЖŒ шн7—uM rkKl§4Ї™о~Qѕщmy_еe—]xfD?ЫЈ1'Кѓ­5UїLF!2Кь>НЋЎНillCЋяu7лЬ№шъйлШјъХUїD_‹;ЋЃюŠŒћеХUdє№бКИШшчКМъ7‰ЭyO”Ž<;рєюS_Р‘уЗРЖЗ6kъ3А­.ыФжЏNŒž5gF­ž7чDo_]зugЁEџ˜јш§#GFtя›Яz@љIшy™шђљ‡­тдПВmhОн™itеAŒОїМ”}ўжЂЌЙй,TmžF—нБ#.М“Є]у*jЏЛU—ЮFgVЏ›БдO”и<Ј^uWbsftЇzuб#"Ѓ“~ЕЕ§ўIG^єЛФf€<х”ює•?ЛгWўєюN_§sвЗЛщ GЗ‰еm#Гfб?hк\Е:1њNГш“}Ь‹žПXШ$Џlѓ,њв}b­ ј єЧ7 ?gŸлGЮ5—^є{ЭбЇo-+›˜^E›чбeMцЃЎюіQ=~Z]9{­њ‡EF‡VЛWgн=|F­-Б93:фгЅƒШшsѕъ ЧDFŸ>EЭ‘и РЗža›x№nрiС';•љWж[лъ о›ˆъcвыЋ>лч3быŸэо&VЗ ЭЂЋVO›EџœyГшŸ“}ЇЙ~tчЅšеУМŒшўЗ$н7ƒђЭ5ћКЮ—\@~а>w“имо}kiнШd™sЂп\”5—6ЯятЎТ7‘лЧјйtuиЬ0Кrudtfѕ8КrvfѕЅїО0 њ}\ы„ёИLŸRыŠŒюUЏNК/2КSНКш‘б™яc>1эЛ5HZeр…Daћ!ьрнwiЇ_6ч>–9Єљ=3Ўљ#zuЧw VЗєЯ0˜‰к пŸфкГнzŠGw›?zыVOЂЫ^ŠƒцК‹ќf]Йz]Зzв\7Лwѕ•Џ–ЎžЌjDtџ{ šюšOoЭцДчўшњ?@жўќ)БЙНКщЎФцNєъЂDЎєш bmƒ=Џvј0:ГzuиЬKEЏюšжяюП)Пм™ЯЈчъ€Щ>П[Lˆ>ЮuТr }ЖЮ|ф‹ŒЮ|K0О;VНЛХЄ4_"џЇя›€“Р“JЯ„ <Ш6ьˆу7iЧ2_vчIЏNyHлН:ч!‰Gvя‚3’wŒьцЬшœђжБКщž^sљъ~tёъAtщьasхьYtйъ~gэьсвVЎžLCDtї{ ’юЋ=М/]ўG8FG,|и]хCbs?zuд=/4ХЋGбЊœшЇ‰ŠНJl~“YљyоыTќЇъˆe?\Гw‹yнЉ^]єˆШшЬ'‘MlLѓўsцаЯЩ.•?у€uђЮќЬ;Љ4ёLиАŽп6Їž$”ydwтсшсЭЋS—нœS8ЯЋ0 Лг\ПК]<{а\Л{]З{]3Л›}z}i^пxRЂ{п[RuЧ)HlЎщuЂЋџ ‡‹АєFwuОЕдoЮ|ЦЫ\ъQtщъCш1КfћiyЂGе_п]™66ŸфЂб‘ŸёОS§D‘б!KGЉџœ6‘ˆeŸнeъjЋ›юKlЮќ5WfєэЩ42њуЏЋsД‹”цвŸ–NdVПIl Dм‘ŸY‡H;тјв9(НОмЃЄsŠ‡vЏЎyLт9уЇУбЊг›WЗ<*l‰?Є Ц›ё<з§ ЮaЛ}keиL'њ3ЖюЌt›ЋOј+F—ЌОз\ВZєГt"п;+GЯзЕfsфч—ФfбOгщы—E˜CєсG(њЏрАйХEwЊ‹FOЋЫ^ЁчЛссX7вЛ‡яњ—•MД^ѕі›KЊю™T—Yuнцw§ьтб‘A^NoVч<(Б9uDNе ѕЧшŒ5oЋ›ю{‘шеEˆŒОмZ#ЃЫ?zl$ХUи8ЪЌОЄм ШwфgкiС—ШунseЮ Оф7ЇD'4~jшю6Џє–Ў­oхшсPTс,ыб%XњZьЅ7ysбъФш{Э™бЋE?ЩМЕfsїQЉdшVн˜§,ГшВ?Ьlc+ћЏ`КW­юнCvojGЗэK›я-KынЏЫGЯ> ‰юUЏЩškуъ”•о5жОм>-8tO6№NЫ=ѓRŽS’а<љlЌДФцШпЧ]К7Ч€јcuЦ’Чmo"Ѓ37ОШшЭGdtсN’Цт&kœПdV—~Я@ММг3Я)M;сјв=&НКМтШцРЛЛgКW/я6Џ4зЎFЎД–Ž-pщЅGншisftЭъ;ЭЂЪНfб?хntСъ;­%›ЛwУ’Ё[ug`"9zuЦїLVКюO3Ž.ќя`ВGFзй/ њ”WwЈЯwюуЗжtMoсчo­*›WчDo" G>ЉЉџTro*uDFG~9Ў^н5–ћ)Б93њTбžw!^BЃ‡ПШ(-2zћf6-zѓœЗ6чAASБ‘5Ю_2Ћ“ЎA"Ѕž™wNiиЧoвe~“WœОЬ1хцђй§цкеЃцЪбУцЪе‰б“цВегfб?gо\Д:;zџUщшs\dє%2zџэчц<фИЄOJOСHbѓ%БyЖвušatхЙюЧ‘б•Ї}|ы§ГЦ)бЛФœшѓъТЖБSu;МО6oр\нv/ЏюшdЎЮB"ЃЇеЋлЦ"Ѓ#?ьЭќѕХь6SXdtЌWGнY}эLЌћ…ѓЕ3/Кў^л~}3šЃЦт&ъМЩЌоl"№+H<>3ь вЄ“Є?&'6я‰nЋ›ющ5WЏю7зŽ4—Ў6WЎNŒž4—­ž6—юіЏЎылеЅTуЂ;m‘б/~}kQзд|Ak7—Œ‰Ž^нё-Џ]їgE—ў7аП§…м[†VіŒ sЂ{Џ/+›Ш_щжy@]72Кђ*7їwт Йх…V‡~†љiMfєДzuлXbѓpП.юšгМ§5mPuыTзяGgVЏЎКЇWНКщЎMgNєюб?&њ№†%Ѓ9i–7‚Ж­Ьъ K€D‰ЇgцљwЖjт!ЖIvjЋ{qlNшю5WЏю7зŽ4—Ў6WЎNŒž4—­>фEEОЌ}Š Šn—ЪVЯк"Ѓ/E›чбE•н‘Фц—‹~БфO3Š.=ы§›vё›KЛkua‡шgщFFFWџ|,p8юEЏЎxСшЊн™е/9"ЋыFТЃ7›’Ж‰1бЛgў”ц§;˜Œт7ЏT]={0жЋГюшWЏЎКЃ; ЋЃюъUЏnКoWš}œŠˆцЄYоŠй6v2Ћџ‡WЩ;<3№˜вРЃUƒNьОjyбэduб}чцњеНцъе§цкбƒцвеУцЬшКе‡Цˆшs^@ѕ9.ЅЙu_ЌнЭЋZ=„њбE{т‚/ѕЏИЎWŒЎљУ Ђk_§ЭЃј–вњ/s,<[]xvПЙ`tфJ‹~š;Н%›яEз7яђ&њЭn‚UџЊЖ}yбнъеu#ЛРИш^ѕъИЁYѕъЖ‰aѕъАЙAѕъЌЙбВКk.rЉћеЋЃющ^ŒЋЃюъUЏnКo?ЭAЃМ“YsюdVЧ\$Ъ;ё3№Lи˜УЏorŽПi{ЋsбЮV'неi._НЭЈ>­n@tg(ЪGw'9(њ№ъВЄЛFлEхшёNQИКќ%зБ%eмHі‚юк7н=ККX}lŽшоЇГ‹ўНѕН~]uнЛcQ}Xzу\~Т{т DЌ§,‰Эгшˆ}КЗФ›7Oгƒёa[˜“=ЏЎкНЫ{•ъеy}m^Н:ЏЏЭЋWч ЬЋWз #ЂчеЋу&і!б‡wт)бЛъШшœп7wЋ7нзЋ^œє€}hFsађюdVGўо(Е:ц €'Щ;Ј4х щ˜#ЛoЖКЇDЗƒе=8&'TяK3ЊЋ›н™ˆђен).=ИєJ7Ђ/•Ѓ‡{\сшœmy#Џ8х>rtзОJ{мxїєцанinлЇІЅq#§шЯкЊЫ>Œn…7№qtс §,їЃ V‹~–ikdtеЛЫqYKХ—УВfdŸІ!"ћNuбь}^HuЛSН8Џя}]ьђяб;б,t†Ёњx\zебoN‘ бЇѕ2Ђе‘б)Ї*#š{е cВИ'‘б|Gо М!Ї_o„œшОеvVз<ІЕИъcrBѕЁ4ЂњДИбНЈнткб9WоFbДц'Щ+О.єъŒя žŽЌЛЫј!Љ№ђŸэЂЂЏЅeЋ{Э_­eЏЯQє/Бu7•qєqФ §,їЃ V'6Ѓ/…Ѕц \ГљzLEЩцЭ]/a˜?ЕIuйю]_LvdugПHŠnЇ"Њ[я‹Вц†ЫZ9zX]:z4 ЕЃчеЫЊ}ўШ "њXбм]ъe1;oеЋJ€52Юdоъœ–^]џŒївкЮъš‡Д–}lЈ>І&DŸWЗ~to ЊGЧ ёжЁ9"ўАаK~n˜•уp$lдЇОШш€ъ^^JєщvXЙК__й6tŒо>0E†Žю5ДFŸ‡МбЯ"њY^*њіЭХ=Ÿ]ƒѕ­=z)йМy˜Ž˜цmV]5{з—Y=К ЋщmхЋ'}uЃ3ЋЧГPx>Це•ЃЧR9zј‘Rэшw§Ѕ^гђЧФˆшЃФfx%ѕЗшГРd€Eђ„-} }Я№hњКкЮъš‡Д–}lNˆ>ДFDŸзЗ~tаH\э“3вїЋœБрЇц€I9ЬFЦІ7l.\нŽЈшŒъs]NєЖЏ|є~кщХЕuэdџъъОЎsє{h^tѕ+ё^ГшŸr7КbЕшgЇжŽОŒ>=Ј=ЎОŽ>мИїе+уFкАКfяЛѓ 'dŸf8Ёњ—Q}Ъ‹ŠюѕUžV—]ъYuншIuсшёУQщшwYу1‘иЬ3$NFн{јDс'ЁвЯKѕђ:“п&Ќ“v lоЩЛGЗ–НыЭˆN[т7Щ{FоAюovЩ!ёЧцЯэЃvћЉ9`Т‡Э…ЋЯУP=kЎНЏЫŠОІEwЌЎы›7‹ў9ЂŸфNsftЩъЛбЋПКвЂ?џ8–ŽОєюнЛњЪИkеWэЉzaмШq]O‹Н2nd;—рЇ]_JѕЁ/Ѓњ”—P]zяіъъЖ‘sѓfнWЧtЂƒRPbєД92zuмH`rdѓэ’TНm‹Що—ж}Mд]§Ўъkн]§сcЄpsеЎ™КЋ9Qx&"Ѓ/злЩтŽoЙн‡ќ%bЇЛmо‰ЏЮyPФоYdє%ЋЙџdyЗƒЋ7/ИE'Ќw;NH§шУН%"Кѕ­ЮК#2КŸНКщ!‘бЩM>ї€ŸyьЎУ‚=‰K{LNјv!gvocЮП&юOt/]ўеx8…ОіzЗЃыЋ‹У&ЦЭ…ЋЛбХЏЧSѓiб §$гцШшеq#ЩЗGвШшKЏ{aзЬ!mw;,[=(Ћ^=xЙtєPdtѕъ8‘‹™9З;ткŽП@ъN‘ZН}YиђИЌ‡гЋМт7QЭПžо Ќ-zШ53):ДњrЌ~џћвЂG|…оЂжЛЊ†фЋ2jГюнЫGїЋWGн}9wЏюyPdєщWsA“жH<6ё лдУ‚гЊ›п%FЎtмx4ўžx:бНvј{фЙЙєrЗЃыЋ‹УfzЩеЏЦс:'EŸWНžYГшŸ”иy^oж‘бнь•]3ћДvxtZuO?-ЁКW;њн({A UФюв‹Ш?эѕWНЛП•Џю}PZ?zЗиея‡7aЇ_Вš[я™zmв]ЗШœц~ѕъІœЋW=Є[]>§3tАр›вПLIїоR=zPНКъЎШшЄkЖ"ЃП€ и АNтaАGи&žЛ›xZpтЧ‰ч2'&оv:њ[у)Йxx;њzquиL'Й|tw˜ЋOіh+GŸ&:aIŒž5‹ўIЉбУ№еmw„E_Ы‚ЊїiяЯˆ>еЅTѓJ7_ъ?gŒdVП‰,пю)љ1Лє‡si@uoisЊO/-+zШvБSІњ2xЮ[u_Xє~ЯИЭЩкЊЙыЂ†Ќё‡NѕъЄœЋW=тДн}МИИъžЯду~Н:kюМл%LIїцR=:є–ї>рKdtяmLŠФf”x„mтСЛG'žЫœx˜t`sтЁнЇЃŸ“Ы‡wЁ/ПмцђбНa.?иЃцЪе‡йШиCкиъДЁIГш•=k.}i“юеms‘б—~їъІ‘C[NєБ.$њдWК9`YћBГЛoФьwno sВ{w•ђеЮЌъу+KЛюЩ›w‰Э—ЌЧМKЯ{џzuиФІ2a‰?}vF5ЧнТ?uЃЫЗwЂVќ1&НmК|tкЭхSdtъжї oWЇРUмЉЛyg'žpœx–t`sт™нЭ‰gЃŸ›ыЇw›ЋWŸ'Ѓ~єy˜ыі`cЂc6‘aѓџoя^’зЁ(Š2и;џ1М’m LE–ЅУ[Ћ“•D56ŠkЩ Я\-њ /š“ЂЏŽnыkVЯ}ЖЎž~<žџ2г­Д„шnї€œ}&_гŽщgЁ-=;Ћ~{ТЬн~ЉkFЯ[нЮ<њћЊGЇНнЭѕF^tГ6Бyz‰Э™бэядЇoD,љ&:bNтіщЋШша§zѓMSŠШшГИ`˜Pоу‚ŸЪј,щРч_&‡7.йoГЮё›uXђЭd$ЬЩ::aК7уН6:ь…nГшпеoЮ‰>E\‰эе<К]={єCdє“Й›;mГGЯ\з1ћцж4џžм’Yн=ШGwНXнKž9Кпœ=oubsцLŸ2?йFF7cgю~тѕNЮP5šDFŸЭљыцŒE_TчLЪ=;jМ“Ю–'‰ЭgЩАјФюРЇŒ'>=ДyёKТXDVEToж9 њVY ЃЋоЈІбUЏЕ›'ЏNŒю5ЇD?ЖЛЩЃ7ЋZЗ—ЧєьвЉ›КљЖВ{_†щЭНMДЭŽ4tNПЙпHѓЬž}љзwїнћ%бПLєaDцЋЂ3ЋGwНдŠНyU=:fЗФцэ}гєЧ/VЭ!‹ўœ4)їЬЌёОІf5Ÿ%ю"g‰Э{мŸхžј`їЊРъœшKc-ŒNzЋF7НеŠžНКй}yitеkЭEމ>=Ÿ,sGw&aішб№Л‚”ЛЄS№Ў=љh.ѓьЫоKŽˆЎЭбe/lo—ЂћеЃУ^}б‡}˜я‰ѕVXюРфгђЫŸFцьДNYѓusDє]оpg6'ЮРgŸы^yOЃЏ ‹ЎgЃcvЉ•б={Ќ›Ђ7ЭеqСg‰б‰Э‹ѓ$ІytќВР­cНсЮйЇе<}}kЇ_ѓ^sVtТtЏя<".ЩШшnѕшЎ—DFєaю•бнбQo%6G~hоы%L>­юќуъ>Й4ФЮIX3РзЫ{}нŒйЏ*.К*.К*/Zѓ1›#Ѓ+1њщЬi†ОР‹0sяhDЯпОXёNsRєуїб]/­ЧCєПнЋѕšшУ,"ЃЂПD?WЧŒЧг|фЬєcЉƒ.Фг­:Ћ9ѓуKж4?&Ÿ-vы‘!'pХ#›˜QUNјT]ŒЎјDнŒй­žŒnйЋђЂ+О92ztЭ>‰ ]‰бS0ЉКЏТѕобоŽžМZєQDEєaО":т^oЛМбля”Dџ+ЫШˆ ёє\В{œб9[ойЕ2ЋљZ§ДSЮй+k‘o›уYoHRUЃ>TЃ+>SV]ЃSvЋЪЋЎРшќцШшб5{§„F5УYзbЕŒŽzЇ={ЕшЃˆ>JbsЛztг[лоДшŸ—Цэqi]LEBєŽW$DЏ.ФгВ2cЫ;ЛUЦьгOr—‡РцИрЛФfОG]ŒЎјLUZu=ŒNй­Ѓ+0:Вљ9{tЬG›сЅЌkБ–[^DѕК8ЂZєQО%ztв{Щ›шб9ћ$6gоM_$6_фУWcт|‘и |Ўўн№™Кё‰ЊМш ŒNl~TюјL^1МЗдТшšj•QНI§ˆ>Jbsр~wНШђ‰Шшг­{tЁFќ… ŒЎJЌ†ЏsНƒЎЧZ]ГOFзкш =DEєa›3ЃWйЃcіKl> L>Klњъыб%{еещоž`б}џGHѕ­ЕђЂяFчь$њ(‘бЫьб-ŸHl>e-ѓЈлЯzљпІTЁбyеYб—иЊЌшŸ`бˆŒ>EFџdŽ`*џH“[иq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/13.voi0000664000175000017500000002374110513166446021707 0ustar michaelmichael‹13.niiьиOŽ4G^Чс`8…%–Yь‘рlŒТb„ЭpNРYXР| ФUи€ЋЛЋЋЋ23*kTПј–ŸЧzнќJў(Yёћћ_-KћнoПyГ|ћыѓ§ЗџєуЏјЖ}їЏп}ћУђюЗЫ/џЕќЯЯ–хWoџ\ћЃхOпОўлп\џЙѕїgџ§чНў§ЛџћјњЛљЭ7љЭwџќпџУoПлћЫјсЧОџfэчџђ'ЫvчrѓћџќщњwџћгѕпћїŸўііџљѕ„r€_V№ћjяЊ3вZ^ukеЂG=Šшa›3пˆ0T;ЉŽxL;Ћy@kyе­хUЗXнnUНЊЎю9"rЅ#Ѓ#OЬшШ7bцgSѕђž^PЊ}ЈюxDkiеэKsLvkyбэVuаЋц„jбЃDFoTWнЙвЂG‰ŒŽ|#оVWзtѕ)Џ:цoБiб›ЈеNЊ#дЮЊCаZXѕЯэJuаэVuаЋц€ъцљЋгЃcЮНЖ=yѕѕІ‰ОйдKbtЦJo&ЯИаЂZ4ПUП‡†Ќђ›Яв˜Эё&k?Ÿ%6ŸфУДwеhчшœьSikYйo•-ЋКн,tBѕ[dkYеЗН бэsЅƒЦТvѓ4WѕЕЯ5Оќ8}ѕзнБ|}*‹ЛКЎЖёѕ—y}]сЋЧБИЋы*zљќ~ішељНё‚Љюъ[НVRЂ?_0_ŸЧЉ]'~}гLlНŸЂЗЊЋ“Hlо<Ќ&Ÿ&РвоUg<Ђ]TЇеЎUчђVнnW: њН1ЋњœU§žиnЋЋГКОцT_sіЧgръ™Ињ#o<tл8ЊЇўќ.(:ѓAмъ.ыЙЎќš^леЗ^лљWzљкœВЇЗшй›3ЃЗЋЋЃюJlŽz~qн›бМ\Ÿ|A›&жNЊ#в.ЊSŽjзЊsiЗЊƒю[%'dŸ гЂпГЊ?“ЊЯIK}Œz?њВЭѓnђшNѓМеЂGIlЮŒОЊ^Ѓ#W:&zПК:Ќ'2zЏК:ыŽФцѕA—Нz$/7Џ˜™е‰Г<р—Ё]TЇеЎUчвnUнЗJШоlžНњ­0,њ\˜T§й—ДжyQЛzч)œЛZє(ЂG=ЪЫEWЗэzЙшШъъД}‘бћееa]‰Э[уƒљЃ7Њчo^6Ў/еA‡\_mЋkŽ [fрїдЮЊCŽk_UЧгnUАjЈоhžОzГyђъцЉЋw›gЎNŒю4Я[нm§DЂG=ŠшQ"Ѓ#пˆ™б‘Ÿђ2Ѓ#o.[еЫєЭеЗёеQw}DF5gN˜–ШYоI`2/ІTG<Є]TЇдnUАjЈоhžОzГyђъцЉЋw›'Ўю4gFO[нm§D‰б§fбЯ#z”ШшШгCє8ЂG‰ŒŽМЙdо3oу™sЬ Sц,я$Џј]^1;кYuШaэZuЮ!эVuа}Ћф€ьЭцЩЋwšЇЎоmžЙ:1КгЩ+Е‹ъ”ƒк­ъ VЭеЭГgo'Я]Нл LЕГъУкЕъœ#кZuв]ЭгWo6O^Нг>–ЗшърЉ]TЇеЎUчвnUнЗJШоlžН:1zЇyъънц™ЋЃ;ЭЂŸJє(ЂGyЕшъД}‰ЭЂЧ‰ЌŽ|—ЯТ цsьэЯs7Џ"#Ђo+#š—Юo>ўр&К:чЈв”U~aкIuФCкEuЪQэZuЮ!эVuа}Ћф„ьФшЭцЩЋwšчЎNŒоmžЙZє fбO%z”Фц§ъъЎЎ—ŠЮЌЎюъJ^ъ/п4_.ёЅE\VіЫJWGнwН?"’—eЙйде9G}йi›цдоUg<Ђ]TЇеЎUчвnUАjЈоhžОzГyіъФшцЙЋЃw›gЎ=ŠшQ›wЃЋЛњD#z˜uo@єњ†а|[§ѓЯеA‡œ7EФvО’иќQ]iяЊ3б.ЊSŽjзЊsiЗЊƒX5To4Я_Нй<{ubєNѓмеЂG=JbѓNtuе=Ђ‡Il^EWї§ее5‡%6Ÿ&УД“ъˆ‡Д‹ъ”УZ‹ЋnЗЊƒŽHŒ^5To4Я_-zЭцйЋп Ѓ7ЊЋГњbЗGXђВU]]t@тBgF‡gЂЧIlЮМ#žф0vVђ€жтЊлЕъœcЃл­ъ VЭе‘KНЎЎю9(/:p{D>ˆЩЂњ(MJ^ЯЛх&К:цИШшШ› 0ЛvRё˜vVђ€жђЊ[ЫЋn-ПККцЈЬъхkxuЩA+ј &6GnŽЬwKц[ќT§Y^ђ€Ф•^"?OРHэ]uЦCZЫЋn-БњDє qл#rO‹&Бљ$БрSЋјџір€@аџзэT€ jшAq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/12.voi0000664000175000017500000003216110513166412021673 0ustar michaelmichael‹12.niiьнMŽ,[–Q+ EJ4JбGB‚iаItR”•‰Њ#`,4`9 ФTшРНсюfчЧЬте{БїŽZ++ѓК™ЛTŸm;nџїЕmэяўіwoЖпџѕŸџцПџOўы?§О§сПўсїко§эіЗџЕ§ŸџнЖПzћЯб?кўщлПџэпџлћџюŸ§яўЏЧѓяўпЧПї_ўцwџђwјЯџёџсoџАzё'ќщЯњуяF?žљ'лМsыЮџЯПЯ§пП_їпџђoћџŸџт_§ хпQ‹ј%ZСъV1Вj-КрhЋKFчƒіњпь‘яsRlZк‡шŽЯЈиќЈŽЎјœŠЭеЎ@ј*­Eќ­buХшжОKuњЗ1FWXћ]cыŽѓк5?…нёllЅЂŸЪ4oУBЧц|Žц/R9::у“ъќjZkб ŸжZСъVБzћmДiuіХŸDчŸ˜1КҘ лS`б ћТV0КLѓ.КNѓ+КPѓ6.tlЯ=›*FWl.ѓБВїб[)ЖжЂ ~ŠЭ‡•.љŠVУ›VpЏk­`uЋXнеЉпШ":љђOЃгЯЬ$0џ wэ).щ†C`+нъEЗ2ЭЏш2Хћ БLђ~ѓ(г<™Žрž{ .єіјFXч*|ї3ГаvїTБљyTЇ ГжZtТgЕ7бŸг7щ?T—YѕChЩъ*ЭйЃЇ}ЂЧРфбѓ :љЎн+ЉГлЂ:uєjЉsGЯЇz55iLђVC“GŸз^ТšЎѕwxšwбэ ЖъТ3АNђnІЋЖМ*ЩћЙLѓl:>Ю6]њэ(§‚б%†ф-БXѓ\ЂyW]шЯ[њшЕšеІЕш‚Ok?EG|Nk]t…70‰ЎS§H­2,ctъ§уФеЯЖ]fішi\K^=K=ЏkЙЋћКїGЩЃћъїGйЃЗYt§cЗAяЮЅЏ~>|ž)Н/ЮНVКHѓ+КLё~<ŠџЈk“шрЊ+ћЬ"Щgб™ыбЙWќкяw‰ЃŸе•šz 4OЋЃ“Ў[k4кЂjVo5ўюР ­}ќѓё €іˆm­Jvл7?џ7ЗіŒо-wpгЕіђ:nКa]ЈzœtУиœЗњеv|”9zз’WqmK=ФЕN`лRз7ЇŒю—КFt7еUЂЇtњшэЛE—XEg{Iўзfбчл–Ž•У*']яiєыЙРВЫшдƒН 6МЌЭлЌЕ@єЖьŽЮКPБyнtэиZЃ9§№ЙтеЕВ~sэуŸbCю{ДЖwб9wМJ[Ћ’§ъl­^ѕGm‘ъэАТUжzлOE™ йЯDіЙ~ЅMšГVЗ}ѕюTцшБ­…•кZўшЁ­o.Q]"К›ъБ9gtЗT‰юїъњбБe'^uUŠЗ]є$9aј[[›E?_XЗаUs‘rDбћgыVЮЂГ6Ћwгo эDtлЉяuЁbѓ4:КщRСф_СgЊ-ђ›zГёІ^1№ІЕpлЃЕН ЎЙхUкЪTПB[ЋVНэЃ TяkыDПЊ ѕьbLл§J›4'­оЅЄЎn‡ъ§ЉМб“ДєЭлWaпыуZ/2nэW$zПњ\,нРŽЭ:ї œ$',яЧUNИм}ф0gd}x>.oЁЋžЌsОцnЈћK0kєOэTtн‰ŠЭЋъшЊ ›ЇббM—*6WКП{§E &oЅnџъРЏІЕЧПэё0ЛgjkeЊ[]Ёњк E?Њ[+UНя­ЕќЕЈиWtжѕо/kw-цнБїмmziG{в–Оy>y›|Vˆюo6ђЧ‡]_ћбйЋ_ЊGЧfzѕM’ѓ•ПЅэЧUNИо}ф0 ›—б‡чуђцКž­sОшa‹;^‚IЃпЭЊ‡ёЮgБтЉ›зеб]ч &ЯЃЃ›.}›шєй›KŽGХцYttв “З*№˜Љж №Ek•~‘ўбкъdПR[™ъWiЋН•Œ~еюЂ Єе|Дzи7К‹28oЊoЌ=NУыDкmфИ[ьЯф]шq_žь|­Ђ;^в№]ѕdKF'Е[е2Эп*њљtXида8KЮЖтышУKТњІњž-sђшщhф‹>Џg%“iєИющЌ–­Žn[Ћи|gџЫЇ`ђѕž’шЏЂљkhў*“Зё>Д@ђOeжwPБˆTыЧнпSK§$§#ЕPt{ЖОmЩглУѓбЧйшАmє8Ж4i~wtмТЌ9ћ59Юѓ1:cѕ.ГЮJя3ч+1{}8ŒNœ)н†Яв;Ђ5‹ЮЄенЅЗШЬл|ќx9О,(oЎ­єЏ ъ›КmІ/Ѓ3^ˆЯЂiєj\‚Нz–kž/zП/д‰оЋи,њЫTlОљё˜Œш/вe–h.і­і]ёцУ‰иЊS“Ы.yё›ёКKŸМтQЩш-нWX ПbПюў^Zъ7щЅЏшєщэбкv+|Хлрy6:milоMJtмТЄ9}єЌ9{єДЙэžˆœКˆŽЮ›+Нк=ž’†фЭ/ФДЫ§\г1:яŒTŒючxˆЮU}МњКШЄбУЎбG–Œ~М*ЈoъћFЇзЃCєzхЃ—мq‰ЖЋЉН'њЋTl.]r:NЊЃЫжКШbбЫљЬж5{є|Њ4ЇО+=ЈqеUlNћіJЭъ”_Мя( пGХŸ/іѓюяЅm/:щЪGeыDgъcлѓmф54?ЃѓVЭљЃ'ЭщЃgЭЂWбIУ/ЂsVŸFЇ’“шМ“=‰оКУtfЭ‰яЦiЮНhnУ“СЇбћ6іVЭЧШdеuЃї‡і„CНЏYЏzВшУНP™шƒŠЭЂПJЅ‘>пѓВ6ЗЩ­FђшЇ>БXєx*0ыФbUKFЇЛYк;™пŠЭy•ŒNћm№œъ/T2zKџ'щЕŠЭ0*їCщ­оЏвЗQtв•IrіъyrюъesтъŠЭп.Кfѕлгб}sЇбYзЛdєщXgэЋцŒб—ЭЩЊ—‘‰Ѓз+›7њlвVŸEwЯFЇОЌЃпdџ‚шд—}ЮйШН\#њp/T&zЏdєyutмJХшJЭ J#§l*Н.ЬлќјPœІ~ЗZеŠЭЛ‘Ячl|+4ч,%омж2oЩk%Ѓ‹ЎѕјЩtOЭъ’;пOеz`ЁмяќEњ!9ѕ,9{ѕЂ9uєЊYєЏ­dєyuжіet{.КojxLЎЂSV—‹О ЮW}/9WєнцLбЗ›Eџ=Н‚ŠEŠDŠTяW‰о§U*E?{jEЗЧПeЂŸI…šgБГгС‘гEЭ§цdQг6oыцч"ЂЎœNoцœ…ЃдХТйі‘зИыUW§uJF_|œчѕјctЅцw›`PячЦ ўДћјsєщЋgЩйЃчЭЂ}‹шіѓ™шЖЅUtъ?NZ}ГКZєUoЪъŠбїšsUпm.нЙЗK*Н\%њp њ7r;:Yѕўq•ъRб JбЯІBбЯІujОшЧJŸ,oкшОЕMœ8Ÿо–3КЯž>Puсb›Hй|Ев[ўцŒ…ЃХF—лЩWЩhе_шћTG7н№žY­zыџfнѓ“ Sю'в'?ItmHЮ_=K.й\3:yњYtкъгшЄечЭЋЏŠ3VпiЮ}Ћ9[uХш›ЭЙЊ+FяŠŠEяhОй;UŠ>Љо?.Нн[шtеЊѓшœеЅЂOWzї’иЪоХЭ=_тCeТшЁzњ‚€ЎSз—\Оц;б_оt)ѓцЖВо5ђКоёЊиМŠ~.Иm­dtЩПЈЏ>цGG]кqЁъ­dєSХцУпЪ І§бзјщюж‹К6$Јž5gž6g/?‰Ю›}Гњ<9eєUrЦъЭщЊo5gЋЎ§Њ*TН‹ЊН{X zпSf>юG‡f•о?Ўа|?:Sѕyhвшя^zp#3_єЊКITоТa(=}ЩзwКqЩ•ŒоВ7gы›КМ ZьxЙлзб‰ЋOЂ[КыяiНЮ™W{=‰ЋЧаglтб>^xнQ\ж•YtтмћШ2б[Я_ЃњЅbѓO›јMћ§ыЖsKыE]’ TЯšГg/šSgЏ›ѓVŸ5gЭОhN}еœБњК9_ѕГЋRѕГj^šВz—Д\нtеЛžRбЛ‡‹9NнNЂг^‹uЃчзaюш{ЂKwюG'Њўžб[ЦХ[ыšЌљgа,|xQЎшmuЋдП$ lэжE—,њVsЖ?•нkЎЫЭёШeО{Лќ,КhѕћНGtтФББЪ‚уkœЖЙ‹оЇЈžцmоњИУКнq\бФSqphЬ<Ыk›гнѕРчДНш˜[к Кшв˜œПzкœМzбœЙz™œИКbѓIttйкG^НцittйZ[FG—xцеIо^ygЭйоУ3чlЅ“­ќbЁЛь\бЋщ˜э[ѕhЫаЬеыХM\}2хЊ‡Ї‚+;'Kї{‹шж}JFgvњ>Yљ 4Oю˜ Do%ЃЗЁЌ@ѓ#В?Юн<~ŸzФfnъž+œЙљ=Г;|џЋuPЯMЧМдsБRБ9§\Р…іr[;ŠЮЙЃЂ“.MšѓgЯЃ“gЏЂSW/ЃWw5Њg•Щ›ЋЬУ^™!~)tх=Ќі‹Ь§ы.oѕц|э—ЭWќnsІш[Уœ­њNѓћЫ‚gnFџxaHомљ@'u6ўNtКь{бЩЊoFчЊО]Г:Кѓ фRaЂЗЁЋ@ѓ=Џm ]š'wЬЂ'пMђ7зŒџњU yђ}Њ@ѓX]ЁyUНЅnоњьЧQъфŸЙcЅb3”Wючбл^tЬ-mtiвœ>{оœМzКzЙzв™ОzНЖi›ы ФSЁ!~(uх}Xю™ћз[]тъoзМ{MhdяЮ2Šю^8SmœК3щœEЇmП/ћVtЖъ{бЊ7ЃsUпNU=t ­ ЃЗЎЙЏ~‡6ЦH?Гшѕ—™‹ŽN[ћn+Зќ2:cіш|еЂПЪ­цlйwV8нbї‘‹шДеУ‰K=žйП˜И•Гш“љЂЗ!КЏNи<‰žl)au+чKГљЮR‡Е­]V‡•™ДЅoОиїЛЮ …šЧъ Эл#su˜жАWЧЅќ†кCtШmэ(:чŽ6ŠNК2INŸНhЮ]НЈm[тъR ќЎжPМЋW\ГЙтGЪйBч} “‹АeПwŽУRБЙdєХtфЌОŠNY}Бњ::aЕшЏrž›Гљ$:КьD—YЎz~œваXЁzLЋѓѕы:Ьu…шО:уЄœ.uжщ>_ъЄбзеaeg&uщ›Ї{sњцгн:АъЪаX љЙФ&Ž&б‡ъЗЧБ‰ЃUєV-Кэžz83ю#kDЗю5Aq+‹шCfЖцnKžfЇ[шўУoXэйˆЧыіќ’LbШ+]т^uЬ+=_ъРАSчK4|—?zrЯŸПљЂ:2ьдВ:2ъвj LКa(,аМ 7 %š“HІЕ№)m/:цžж‹К6$Шž6'Џ^4ЇЎжќ5jTYкЃŠбU†ј ЬЅЗSgПиYьrћƒ|яdЙ7?Ўџњ#ЅVt^“Ж4kю"ѓ]ŸѓшжП$*onНЯЬНэ+OЏЧL‰зЫžУБЋdt‘яЗГNќІЏ+]у{ШЋP=жеЉN”Ј^ H\ж…“$2ыТЂ:2щ†љ|Фѕмг%–hюUlЮјwјЭЕ7бŸбЂkniЃшЄK“цьегффеЕ›Ÿg"sюЉБДGEцс Ъ”ЙєvЎі‹”яуD‰gцђ%уЄ_~‰>F–‰оgŠон†TŠўH]›сv…љ‰ВDџ–nTЧЮteŠЗЫшаЖЕЎЎdtЉъўИDuw˜Нљ|ЉуВ.œ\‹‘Yце‘EЗL7Рž{‰Eš;“€*кб Ÿдъ5ЗЛ5їДWєŸTыBгocs Ѓ[Сшж–еyпF;ЋNzMЖгшЄ3гЎЊCЊЮЕојtLи™!К O•Ѓ•uЂЗMuЂЅГk3Uє[ыьвЬрQИŽO§zT,њbМ3.ЛjбѓъаМ…ЋъаИ•cZцюЄdtЉъуQўцюNПHѓ|ЉГос=ЭЖН-ѓ—ёwѓъь&;H`Э/P0yЫ?Ь_ЌЕш‚Ok­\tkѕЂ 6З&њKДЖЈNќ6к`w6:neŒюњZ‡&Ў>YлДбg‘vЉЯЙTєa‰œ9й7 FO.Ь4ъFoЇc’ЯГKєoьеU,њД:6oaVІљpWє*M}^vfјCќЭО­[ъРЊ+§џsЉЃ‚юОЎ<ЊЃ‚юiЏхNОmьЛuhЮ]н™ђKLр[hбŸз~ˆnјЄVЕЙXtkѕЊ[чy.:ьDпмхчT1њЄ9oѕ<6wєr…3WŸN‡ш_QХш‹цœеeЃЗГішРЉЖЛзЈвќˆ^Uз-”ŽоUoщЃЗgи>4yѓkЉgе‘aЇ^iћѕЭнМ‹оњЅŽ‹КДk;V‡}ЮaЌЃcnЫОзЭ•ŠюЖШ”_Ђ`2№ -:рѓкб ŸдZНші]r_›ŠЎ:7oNž]1zйœЙКbєIsоjб_ЅbєisжъЗВ]d•шmЗо§вGч-Мwэ+ѓ7їб­?HiН‰^TG†н1ЋŽnZ{ІcXu[_нsOWsгЁ::цЎє{нTщъшŒO*˜ QkбŸжоEg|Jл‰nЙЋ Ђ‹ЎЭљГЇЭЩЋЭЙЋ+F/›3W‹ў*‡ЦzбCutкZл•n•>а™хЂебYчкМ::ыТМ:КъBљ•ˆžVG7нQ2њxVi.ГmйЁ;%Ѓ‹ьаН‚Щќƒж~ќ_kбŸв^ЂSnkб5їД^tа CsъIsњъisіъŠбЯЦJеЛЦzбCutиЉCe•шUutжЙnuЫEяЋЃГЮ —_…шiѕ–=zmЫп<Ћ.§ЃБЪ^зЋ]Г::у“JF—ћг№eZkб ŸдЂCюk{б17ЕVЏКѕЂƒnš+TПE‹~T–ЊnГъшЈ+ЛЬrбЕЊеЂйСQ— ]/•vЇRєSЩшЂе[;|ШTR7Кdut|…жZtТ'Е‡шOhMѕWЉV§žYЌњЃГ^єaБЃƒnи—–Љ>ЎoБшЉ;%ЋkmŠэаJFыŸJFoЛјЭЕŸЂ#>ЋЕŠй5Ћ‹MШ3ЕRѕ.ЕTt™жЇZУќЁ№ОQ­Кц]2z;ь{џП=8$єџЕ+lМцxРбq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/11.voi0000664000175000017500000002710510513166342021676 0ustar michaelmichael‹11.niiьнOŽ;ЧuРёvь…‘S№в„ь pЎ‘ŒbБШ>€OГd‘\@—rob‘3$ћOUwSvјо›љ|lс7г@_–^U7ЅХќЫOІЉ§сЛ/ЎІ/ћэяПўђwпўі›/лWќъЫoІ7пM?ў{њпўšІŸ\џЗєwгЯЏўщŸ–­§ч?џ§џќтWлыoўя§Я?ќћяПј‡/ОњЗ§њ7п}5њс'|ѓэ7_БѕУ+?›њгъњ}ПМічя—?їпџz§їќх?ў ЪHЉEќX-:рGh­^uЛŠЎxR+XнюЂKžаZСьVН::хМ’бSХцš‡оTѓІЏвZ‹NxZ+нZСъжъeЗVАКЕ‚й­Ьn­bі‡ЈŽЮ9ЇdєTБyV=ŠžЊ­ђ›’бSЩh ­іƒш†gЕЙш˜“Šх^U[у‹z“1-:КхЌЖsN[‹:c]"МdtЏ::щ„’бc3FїœѓШ-НЌŽŽ9­жdм”ŒžJF—ќЬ@ЈvёЄЖ]sN[‹:aг\ КZяUХшюpdoяDч_pб/SГК›нtЈdєЃz*=ЭRыDoЊЃ{ЮYUGчœ4‹*ЩSЉa~(tnЬ”ŒЎtnЏдZtСгкUtХsкLtЫYm+:щPЇ9}uЗ9{uХшAsюjб/2lЮ\нІYd•ш‹YeшAutеyfЙшEutдЁ^utгБmutб›ъш SЃ\Єy*4Ы %ЋЫv %ЃыvpеZ‹NxVЛŠЎxJ›yПtBы‰Ž:аmЮ^]1zаœЛКbєА9suэшmtка2БHѕ:БDє4‹Зя+D_ŒЊƒГі&$8kп`ЎƒЋŽєЊƒ“NиVВЉю9ЋШ(Џ”ЎŽЮxNщЅ.Y]ёЌŠЭРЇаЂžдЂSЮjKб9gД­шЄCцєенцфеƒцмеЃ‡Э™Ћ?Vsтъya™ъe`шua•ъiЇ:8nЯ2БXєvБƒУv­++4oз6yяU‘1^Q§R%ЃяйбO*]Г:Кт”Ye™fрГiбOjб)gЕЅшœ3кVtвЁNsњъnsђъAsъъasцъŠб›wЂЃЫЦц…eЊл^uжьU`ъu`‰ш‹eaБшЂеm~aJн\ёљ9б-чЉ~Zе‹Ф*бъЈ’'ДMuTЩ3ЊV—Ш\)ZМNЛ‰9­-EчœбЖЂ“ušгWw›“WšSW›Wя4ч­ў`ЭбicРzбmўuіъea‘Х^–ЈожЈо>’цОиЉэYэПшœsжƒœsЮfїї<ЃXѕvѓ…цœѓˆ,TНŠЌНЎЎЁШкЎд­Ў—]Ж::ŠjWбЯh3б-'Е•шžжЩКЛЭЩЋЭЉЋ‡Э‰ЋwšѓVWŒЎW<Эя‚еšлќыќе‹Т*еЋТй›Р ЛБл—ПzZЭѕ4 оJ"ншйЫ)›лAuFыГ.Кч”ЭЁмsЮ-ГTѕіЬˆЌ9iYЁy[]BЩшЉЪ /”й~ …ЋЃ#žVЏ’h7б!чЕЅшœ3кVtв‘NrњьAsъъasтъцМеЃчueЊЧЭз+БqѓѕМЧf^ф‹Ж­žВWЏ‡wБдYЋ7[ЎТ>ьfЯюїЅЏџT/ОЩw™V‹4oUlОЈи\тЕЃb3ќUкMtШim):чŒЖtЄ“œ>{аœКzиœИњоWЈzWЄzлV zм–7zwIГVПw]џпЯ~}г‘ЌkЙ+ямюЈњ\yЫнгQ9'­ћЪ-{™ГdUиЮі.6‰ЫЕЮЙK{ыšўAяž4+Kž<‹žOsюфi^нЯ лГнvГ/“6ЏЮИšеSЩшuuLдЁmєэ!*qu/:ћ™ЗК+nš“F/ˆŠ4oUlžВoУ‘ŠЭ>)ОkЋ?рЧjб)'ЕЕш c›фйнцфеƒцдеУцФеО:е‹К"еыИ е;uyЋw5iє­vИЈ ›чk™sU{ж \!;эVлглїq ):c[–џ”^йДц _FoXrGїіeТЅоЭГГіЌovi#ЌЏЋw7ЬоќиfѓКЬСлвљз9›—'ZЇ:.lЯ2mSжЕkіўmЉЅОUчnюFgпˆы‡‹ьgєЭцќЈQ=џКHѓFХцМwЛъ4_ўЭэЋ*Эгj–k$OcЄJ/Р'бЂSNjkбAЧ6ЩВЛЭЙЋЩЉЋЧЭmЪš=[е:‹Нˆ+НЫ_НS—ЗzQ 4Ї,ь˜ЅжЩ^„ЉоdЮW>&щXgeѓљЮA—8|;=ay]mt'\^ iъэТљЕдбЋ•Н\N?ѓА23н›удбГъЮ3ѕѕлРРžmщДˆъLѓb;Ід;с:G_.ЋЖм;№n•VЂyк]щИЌЛ'thйžюљœ={{шеЈ^~WЁy­Ns›zл14щ„BуXчЌщЫ…mГwq}12mh0 зј)щ˜ьqвс>к{щ›SЎjЧьœ(“Н<8ŠdЏ#+бл#mt“Щd‘ДэФеѓЂ^nЪъyQЉшkXиБъЊ}++=-ŸNЫDяЮEЖцйF,07г7Дh+вМ|Ь[WG†эšзUiонŠСi;'[Џ:kљxЅ/їЮ|фž?T—i^…zПŽО-Eчœбъ7GчœR,їЊ`rэцBбЕ›пЋ+фЏш Ћ~мœ№ .rЦe?ˆN9+{У‘vТ#{[Š~•ŠЭ9:YЕшWљ бŸ˜J-ёMСфншшД›?КфŒпЮКф;е‰Чdg3Іmv„МRХцAutдБ‚ЩWѕŠ>‡zПОЭEЧœгъ5LžЊѕ^h~rУ<­їр=>їшEg_іaѓ-:cќasТ%?бœЏњLs™шо;ШтTsЖjбЏ"њUЦ•%Ѓ'бS‡гœ1Кфё0:КЏЋbѓnutкXСфiT§x90mь 9щ’яUgm>8AЂу†*6Ќ#$wѓдЭŽN:Ѓ`ђUНb€ЯЁмoЃo3б-'5ЭЏP­їЂvsшЖtЛкtЈD‡э6Пggl?lЮИтЧЭљЂO4чЋо›ŽE~&Ђ_фTsЖjбЏrY)zѓr`aЧюJWД3НSЗyИљјЬ‹ьЉи|ќ! Ѕ‚Щг ::ъаnsжўН•ЮЛш{{1kѓсЇлЄ*6Oђ ЩЋZя]Нb€OЂкЏЃowб%ЇЕV.КUnŽyBЙEžГrкbžлуBtзžЖ':nр/эиIrу:EQ.6їП†oй.Е`їЃJ‰Ї8gD›\" фЭцYГїЂgЌоmžБ:1њ@ѓ|еннјтWz™ё[С‘хЭˆ~љ›–ДuЂ'ънъ ›W†њщfkсРж.\ђvбг6oDЯZ|БR=э* L^6ЊЛУЖЄѕўˆŒоЌžЗ}ЌчmнŒ›oѓy%6/ƒью cВjя%60ŸњбqF]u—VyЭЩ‰“ОЮїй_W?DmъЎ[Б=gѕNѓœе‰бЛЭ3V'FhŒюIlоŽюŽ[Гж:oё2ŒюNкw$zКЧ8=]ѓЪF|ќ‹ЎЖUлчЦЄCžиМR}Ћ7ol5zофeуиЖ%­їGbsftцчЬНјYенY{“/n­1Щ9 џD}ыЎ8ЃЎКKЋМцРфФЩ_чЧъ™ŸЁъЙzў•Џmнyc‰б;ЭsV'Fя6GFwŽh~“Фцaєэїнu+bVї^bѓЇD'”GVo7OšПгм™Ж!n6."Ѓ?хды.:Bѕћ ЯНщг?ЈК;jп-4&љтж“ќ-*XъWwЧ Uqб•з˜|п]+б3?Bеkѕє _[КуVl6ЯZНг§u<<ъдј#Бy\ннД+Бy§ѕ2ЕШш­—тМ>dЉCЋЪ3Ћяџ7гМќiН^uчumЭIеЗюŠ3ъЊЛфАЪkLNoŽЉЎзшщŸ 6tЗ­кŠžЕzГyжъФшц9ЋEПIbѓЇD?нh­[БЙА!бЏw[ЊvL№ЋСxд'Wн]Е'094z§Ѕ8ГШhеo”]}w™а} IОxЈюŽ9!ЉръGwЦ uе]rXi~‹ ŒЎzЊhЏн][›зЂю5З­Y[шяоИш™‡$1zЇyЮjбяВ=КзRЕcs"ЂеMЛ^'zоQОŠ:5Ў"Ћ›7?™Ю+БyннДяcЊЛ“ˆŒŽЎОЛŒЈ^žЊ›kŽћ“šS РІъ8Љ~tgœQ]•]бUyе5анД'Б92zд<}ѕ8њ'{жіЕцЉW\єЛЌЅІDюД4эйœ„дъї1џЎœѓ?@иaїc5:ДzтьШш›ъюАMЩKцЎQuwбЗа шяилUJєrћ” §ъKwУ9ѕЋЛу„ЪkЎЪ‹ЎЪЋЎ'н=G<7GT'FП6TЂgЯ7Ož4лyЗцЎ^Џ ˆхЭ=Ќ~{Ю1лn тИxwF_ЌFOYНмsš3Ѓ—•шюЌЃшюІ}ЗЪœцх{НˆiО˜ |ОњвнpN§ъю8Ё*.КюuЧT•W]ŸP§вœ=ŠžНњ™д}+ ZюЛ̘шЧОъ•МˆшQпќбгŽ$Œ№ЋŒ­їфхtNЈ_‰ž<;Вњ}џ%<Іљс?1бУЅn :фuЅ;k{ЊюLљ_“ј[ъKwУ9ѕЋЛу„КщN9Ќ*ЏК*ЏКžu№'3ЊњT]ЃшйГWЂчЎО ŒЉ~ъЫЈ~эћ“<}єФ# г№"eя=Ъ{…/ƒO щУшщГГЊя sЂ—ЛИцхсн—в<Јn+љŸ›—РdШSнgеЏюŽъNwЫQU‰еЊџЕkbxєєе5ŠžНњО0ІњБ0(Кžž§чOЇщч?ўdњѓѓЯп§нупЙпџ§_ќЧ_ўэђѓ‹џўјљлљЭW§е7џќЋoџё‡oўЇ_орЛяПћіЋЅŸўхЯІѕЮiіљ~|ќьП~|ќНћё—ѓџѓЏўцg( DuQUн [еYwХ6]ЂїQббIе‘бсѓЃ;d“ШшШ3"ьЉЮК+6ЉЪ‹ЎРшЊРъФшН“јш˜jб{‰ŒŽ?ЛS6HlОTw7ќdVРЃЮК+6ЉOн!T`tFW`t‰оGbѓDЇTПAtHЕшнˆоMbѓЕК;cЃМq>ЩЌNМGxЂКЖЊнTхEWхUW`tF'6GF'6‹оMbt•ъˆоKdєМК;gLbsцеєCuwЪщен%›$6Ÿ&№ХЋ“юˆMъSwШИКгн2ЊЃ+0КЃKє>›#gtdtbѓ[LщŒъEtBudє›Ью !Ђw“иœyу’y‹јPнВAdє5Л;cЋФf€уЊ“юˆMъSwШИКгн2Ј*/КЃKє>цЭЂ_dбн4"0љ-:4:ЁzP9?2ХШ ІЬѓKцЫ”иZиќPнВEdє”и<]ВЛ€зЋ“юˆMъSwШИКгн2Ј*/КЃ+0zо,њEЭЂ_cйн]4 0љ=:4: z%:ГК;iDdtфЊ—y=yч2ЋюŽ=%6gFGnжLзъюŒ›O› YulTК;6Ј›ю”Qѕ ЛfLFW`єМ9!zб,њ5–ЭЂ_bЅ92К;щЙРфЬЕу]ЂUПLdєчMVXє…шНDFO‰Э‘бЩГ#*:Б9rFOЭ‘у<ЛЛјЂеEwЦuг2Њ*/К*ЏКЃчЭ б‹ц€шeГш—XiŽŠЮ9'&Žtbsфzї.б™енEC2ЋЏDяEєn"ЃЇФшМ‘N\І#Я-šїzс8=.“іQgн[дUwЩАЪkЎн5c*0КЃчЭ еЫfб/Бв,њ[ЃSњMУюЂ‰:д™WгнBU}“9дiб—дЈшЯжШш)Јљ:›“zК;Чt‡l!z5ЛЩxС4ПSŒs'О˜ ЄЉ‹юŒ-ъЊЛdXU\tU^tFW`єМ9Ђ:1zйœ}јъЕfб/и9Ѓ—бнAC2Ћ#Џ<2ЏёђDьЧŒИЭ‹Œ 2›Эб'еЭ1Ѓ’ЃSr?d.д‘бyL8вЎѓіКцM‰ЭгgvwАEtGlRŸКCЦU^sU^tzsJtU^uЭu X4'T‹оKftр‘˜8аyХ™ЭЇ=VO—‘IЩчкЯН!DЮчШшаъШ[­)ђF|ЪЏъЮ?#ЊkЎ;hHdє{Twч JlžRO0a77‰Э№3Љ‹юŒ-ъЊЛdXх5—ц]Є7Їdз\wаˆEtBѕ2:ГКЛhDdєЂКЛgHZѓЙ1Јїфв=3“ІЦtЪ§ќ™г<нBsšgыFwЭ wXЁEПNdє,Л;f\dє[,|н9ц HDudД{ФEFgЎy™›Sот‡ФfŽЋЊК6ЉOн!уЊтЂ+М9%Zѓ>*0КцКƒ,šCЋЛ‹†dVO—вАшыЄ˜шKтgjJѓЉ2e„/‚РЧWG—Szч~RФєgž #Џ<о#К;hDbsьй%qћ чШЪњqќъШшЬЅњ]ЮхнAC"Ѓ3O1‘{Sф7'‘бg‰ЭoЏ*ьqєuе]2Ќ*/КђЂKѓ.*0Ко!:ЁzбœSЙNOCоВEPє]bJѓmFОmИpЌЌwнEю[cЊЁ еЗ‘š +ч№ЬшУWGFg^ухOЂwє.GbhuwгsЂwЙ]“КZGnœf~0E~чr‘и №ў*юqєuе]2Ќ*.К*/КЃ5яЃЃчЭЊ_чT§!(њО0'њЁ2Ј9lB'6ЏDdЏEОZє^о'њшеянѕT\№IbѓкHЄЯЃ#ќ=Eб/y'АЌюybŒќ&р$2zJќv рKPqЃЏ›ю”QUyб]б§Э б‹цаъюЂ1iбзТ ш‡Фцљщ;!9sщX‰>~ѕZєсЋWЃ^-z/Ђї"z/+Н‡oЮЛ(=[FЄ/ІGФ€'‰™б™WЇ™7Ё{‘б‘Лy™ћг™пLQ;L›ОyЃЏ›ю”QUyб•]•=oNˆ^4‹~es@tфHŸ…E_ “šя#3’уцХYфвБ}ќьешЃW‹оЫzєСЋ›Eяц-ЂЯŸtG=ЕуашУWЏMИъˆ#13zЕКЛщ9бЛIlЮм52oЪЋЛ[6ˆŒž>ЛЛ+xTї<њКщNU•]yбUyбѓц„шEГшзX6DGŽє‡Фц“˜цŒЪG‘GсJєёГWЃ^-z/o}№ъФцwŠ>xubѓЪнсё›чб—КЃžZ‹>|ѕЪьˆЋЮ83ЃWЋЛ›ž{“шюЂ‘бkЇ˜‘бЉL‘б)Їp€џПАGЛWХ=ОnКSFUХEWхEW`єМ9!њжšНчЬшюЂ‘б7‰Эг%ЛЛaРЌ2"zeщ8~іjєбЋEяEєNж›9вя}№ъФцхm^єЧ'нQO-fEXєэ}sгs‹Щ‘PИ|ЌWw7=•иœК‡иМvŠIљхХIdєgvw3UqЄЏ›ю”QUyб]yб5з4рЎ48К;h@ЭЃЛƒ<nHєє˜™вќј.ЁњqgˆзЃ0i^œWDПˆшНˆо‹шНЌGМ:БљЂ?>щŽzj1РaбЗїЭMЯЭчFDuт‘ИZн4р=ЂЛƒ†$6gnєN+ч˜‘бГГLŽФf€/AоѓшыЊЛdXU^tU`udєЩ96&њО2Їљ.4Љ9#ѕ*Бy~ŒШŸ tЦЈ?F‡Ь•ЯЪЄ“K­ъЎzBє^ТЃяпuW=1нАшslкHGЮiбЏ=ЏЮИuYŒpXєэ}sгsѓaŽЈОŽ9зюЄ‰Э‹шюž1‘бЉ{І‘бЁе‰пЙœ%6|ђG_Wн%УЊђЂ+1њ:ЃЂЯЙw?Џў—wG•6“OтПщnнИОээђ1ц+ЭЧЏ~ˆN™оЕІ;ъ‰еfб/АШMŒŽiбЏ"z/Ђї’иМ^ннєдЂ7.zŠМ H›ѓзЧ6›бЫЄ;hHbѓМКЛfTdєTwЗlи|’и №%Ш{}}шюирГ8)њ6Ъqбн[Ѕ5зцЄшЊћъіћш”ш”yВв|јшZгѕŒш,rЃ#GZєЋˆо‹шНDFЏVw7=ѕб!›L‹ц„ъyqTѕнۘшлЋˆшхв4$Бy^н]3ъ ЊЛcЦ%6OIЋєЃФf€/AмУшыЌЛb“вМ‹Рц nNŠЎКЋN ЏЙю ‹ц€ъ•fбЏАж,њDяdЕYє ˆо‹шНDFGЎг‘зKя=4ЯЋЇˆ‘Юœїћ49бЗЧ цШ-„•$Bdє|нK=%6O‘ы‰ЭP§ЄЛaЃЊМhЭ{‰‹ЎOн!дЃюœ!5з4`бœ}ќъ•fбЏАж,њDя%1zЕYє м*ƒЂЇршЌщё>бнMO%6ПХ=Р”=дГ—Gw- щхщю=_BBDFO‰ЭSцжщ”КБ?—ЊъNиЊЮК+6)Э;‰kЎн5cЊђЊчЭ™беЫfб/Бв,њжš#ЃЛ›žНб{ЙvFFOyб8ЇГЂ#ЏІ3я[ЋS6™цЭIеЗWYбЙГ:%z^н3(2zŠŒŽК^КИG ?Џъјc;і–мК DQ”ƒэљ!Вѕ HЇаЁяQжђѕЙ еH_V_К#ЎЉдцюˆ‹зЙFн1“ЊђЊ+0њмœP§ГYє[ќMsdtwвПћŒfбя!z•шшуЯ?мАО9б‘чє‡DwMIlŽќЈ=§ї %ќ˜œS§xDЭHф^ŒоŒaб[dtм>|ŠŒоrюрЎnaъІЛсЂвМDэКSfеAwЭœЊРъФшssDubєЯfбo‘иќ)бнEDЏ"z•!5ІyŒЮљЈѓRwЭиЃsFњЧNьЮ™sXщю˜iI+ќ’Wќeh\ѓœ3я[ољq:іКcІEFйн%—DFЇыTwРuз\•йќU”^Ѓю˜IUyе%zssDubєЯfбяёЭЂпCє*{iNѓ˜гМеЉКЛgЮa*BšKуАЛcІ 3н2/p:ЖGuwФeЩЃЌ%юФю”iуыGwЫМ{nXtшݘz`ЇаЋnКЎЊКW'ЕзAwЭœ Œ.бkœ›#ЊE/ђГYє{$6чF?ŸQбЕџ Šў.Эiз7І9k–_ВЮ‡Агю.2:sЊ›ЃшAmyЭ‡ю” "ЃЗзEоrQ%FoЁбР‡Ћ›ћЃЛd^эб1еѕˆ~>дИаQбЏбuœŽЈш—юžчfбя"z•ашч3(њ%)z/ЭiЦ"ЇљИЛcf%6‡VGFoЂ—IlЮК wЩлўкРџ\uќBUTѕ#7Њњ[AеЏдишъЇ#)zа3ЅD/’}n§6у§жМП.ХDПЦ"ЈљИЛcf%6ЊЛSцYъe"ЃГoУЌшЈлp˜ РЎЊЛрКЊаъю„ЋЊВ–њ™š]ЯgNѕЋ5i@ъ1ЮIS]Gн9sD/Rн3)2њ!-њžš§ˆЭkЮŽРшMє2Ђ—‰Œо"ЃУЎ–]b3lUеpU}ыЎИІЃЗМцЪ‹о'#(ћ5ЯAk]Ѓю˜YЂ)б‹DFGЮєCZєН5Ў9o8"Ѓ7бЫDFo‘бqЇє]dtдg А^Uu'\UпК+.вМDтlTptTuэКSцЅGчT'FWbtшPIlŽЛШ3‡Cє2‘б™яyNМ•›>NUwСeЅy‰ЊМъ ŒNl~DgUWVWbЕшu"ЃCOН-А9pЁ3G:2:q<ЖЬwгЬЏ€›ШhрVе]p]FWjtZuU`urtVudtц|lЙбн—FGNGтBo™oL7‘бР?Њю€_Ј ЌNŒЎ ЌНLjtwТ/DFGо.@ГПэ= Шq{lmricron-0.20120505.1~dfsg.1.orig/example/dataset/1.voi0000664000175000017500000004204110513167752021617 0ustar michaelmichael‹1.niiьнAŽ4Išзa†тl[b‰P и"!С5и4ђ#ФtЃР 8 И@_qЎРŠЪЬˆpw3sˆšЊДїџѕѓЬt}‘#ЭяГ~нм3В$ћїЕ,ып§щ7Ÿ–пўЭџіїП§Oќ›?ќv§н§нoџА|љгђзЫџZўЯOџY–ПњќŸeљoџціЭхџўѕ?XўбчWяэџгњџюџяњЏћїПќ“лŸї_ўі7џќ7ПћЯџёїџсOП;ћ?~Уўј‡пџІїгwўс2ю\šїџчŸя§П?џяўћŸџэПќWЧџŸџь_ќхѕЌы:;сMыньЗefWЯŽx[bѓ’иМ$6C#rŒ#ЃсRфm0Д~ІѕЫьŒЗЌ›й)яШЊ~DeяsЂї_ЇD$6/‰ЭŸеГо—и"ri#ЏМЬъШшЬНyмœ#W:1:sЉCŸ8Ў­ŸfWМg}˜]ђŽ52;ЉњQxя Ј>~і&4ЏЭЫˆцМшЅ-Lhю$6w+!Є9$ѓ ѕЪS§=2ю'”ЛЃршАъФцшъй№d]зй ?УњivХл2Г3ЊлТ5 {аWОz˜WМ92Књ ŒŒІ7р/нKlцз“ЗdюzЁех5Fы:krѕьŒ7EV‹ў6‘б?=кF№Ы[?ЬŽxлКFv‡d7…kBvзP=ЪЋ=Ь+}’WКљtЏh.\8НЄоЙъž№#s<Ї:ђZŒмі"7ыШhеп'9Zѕ7HlН-і%TВ~™ёЎ˜ьCтš‘нTњЪ/іА.ЁЙЯKˆVOЈyЭКwќЦЌЄЇжѕДКЎ5Б:2њг-7ЈјSв?„FGЭѓ—ДЋ№Sмоё!2к||ŸШъШшЬъМGІЩеГ+о=њ$@b3?”ѕУьˆЗ­7Г;^ВUЎ)нmbBvXПњоЗЏЌ^НžGЯ‹zb=8М=БъкzНпPЊY[Гƒ^а5‹ўuєЭбї].+њ&Бy Эы/iу‡Ќф=Њž›єдН#њл$6g}фqY=;уM‰Э§Чc›[ПЬЮxгњ0Лф[eLv—X?{TX}ЕзНцн‰Y—ж‹ш‰Y—ж“ш~ЮыXOЃыj›#ЊЃћц€ъ[eTє#2)z{фˆŠ~ˆЌЮ›АфKкОї))њ‘—=ЎžѕФО/&zйзХDя%6Ї}шq“иœ=Лу=‘бЕ?ь8•и|МлpЗ~™ёКugvЫ‹nЁЛъђхлъnЋ\|С‡#Q|NжЃУл3ЛЎЌ­э§Љ]WКцmМч†]5^тOƒо[uнђё"_ьЧЊ6“Q8y[вœyоЯAPѕn{Ы‰о oRєCдRпн[6§n *zt%Џ^зЬш“ъ™UзŽy!бЭO'Э№шй%яˆŽžнё–фшйoŠŒ^›ОУњ“й яXofwМ!Ћігp…kџ5vsБ6яЯ zСzpјЮЌЄgжЮьЂчњц[uсјQѓgvх?‰.=&лВцDo;нq02ЂеKщш}кq*ъ6ŸDпЋ'†]кЇ•П†бхЋ7›]/a‹neмXZAе[]LєО.*њЄzfжЕc^dtЪ§ЅЩЫˆn~оЮhn%GЯЮxшo“и,њћ&Р_ЎѕУьˆЗФŸ-rщПХКЖб_/*/ўz№xkrеЅЕѕxwrи…Ўљ1uЃЭЙнWrhJ=ћiH‰>^xбћВvž#Ђ—­Дtєz=ИCr,лЏoнцістX=)щ‡ДЪЃ|ЊјЖ1АEїn,œшС>]ОњН^DO ЛвфEЗЏЋGw Эн'бэ‡HЭ-бп%2КіЇ4grЃgGМ-2КіЧџ„XwfЗМцQšН}TзN?ŽФ6"•Ѓ›ANьѕдьВsчЭuЋЏšЋFп.ИЈшGZZєіUFє}(лJЂЏ>пЈн†mЅu›—§uјxЙЏž•ѕDSЖЕn^šчИнXдMnэvй)/ЋОE•ПБм 6ъђећОшc_Vtѓ2"К}]ЛyщъЂЛъˆшЧ3Fw1ЮŒzf}<д=^зўНфD/н^=3ц}СбГ+о=Лс‡ИТЁs ?ŒѕnvШЋжжь ЇКтњеЛژьѕ,zvиЙсdОh.}е\5zxљ~ЄEяЪDџše‰ЭУЅžYwЂ лJ 7FњёrПN Лд”mЉ•Ѓ—ІЌYъIQo:Шьšп9NЄGWЎў)юф3ГъRлW§~јЁЭ[ƒЂлзЅЃћИњЭ‡пК{Ѓvєу‘ikЏплрj7—прЦ‚ЃgWМ)БЙўV1”Лдqе‘б™S}јmбм’7~d™мђžм;cXtфJ8~Ф›ФЙˆцР}cIнЈ3oфOћѓ3w\з§ё™GRЎ'fw]8KЎ\}б\ИњЊ{vйаю њ˜шf“лЕж­оGЅЌєнTEFЋЇХшЊЂYѕЃ_ЋžVwцЋjŸVПљk›>Ф4оФЏЂЇЖ]ЙˆžкuэbІgfН!*z?ЂЮz"oЈ?dEЕьSЫЮuK=ИюЪGЏƒш%2zїідИ3'б…џpvйUn>ŸпТЭ]йфЕwŠХїЗ1бп%­їSdtШ/п–њлф.ѕь†ї%GЮIюQєЗHы§’дќи;f‡МcНџў~vШл›EЇаl ”эл”3?:зЃйIOЌcГГЎœ$—Ў>o.ЙвЫ {П•”sЯЌpйъ­ъ$К`ѕ>ЊЎ:еЧЈŒKq ŒюЊ‚ЂЏЋчх ЪъG/}[@є+еSћЦžFO­;wŒK(ўp~%NŒzKФpД2FКw%^ьySЛ.Д б}cљъцВыЋ'їДЭ§\OЭ;‹Ўћѓс‡QtэŸФ—ёM{нЊgІ]8™Œ‰E/ˆŒ>ЉžєŠк{ђ‰тw’БршйяЪNЋN›ч/ЂПMdtТгFoџTš“п§l8Йчeм ъm‰sšї;_JsTь—ћ(ЯюxЧчX$MђCbslt`uкюБIэ€…”ИЭЮyСуДр˜ю[b]8{+LŒTЯnЛ0˜‹ЪЭћѓбSЂYЃмЂеЛЊСз\ыCдpЁыE7USнUE?Yы‰ƒАњбЫ ­~єKеS‡"ЃJЧ7Ъ6ИЅн’—ћуЧp>&VН%?Кvѕйі15ъкЁ0ЂЙmМo€•ЃЛ… AbѕшЕбН;7oЈm~ќ0нўYаxЁwK^Q?uЧbгЯnPtЛд“žьnQб‡ъ™MЯЕЛЧэНЉMOѕ›^}Лд ь]hXєк~Y\аPьDVGFђ^џш11цUэІ—‘=њ§чмЂW=ZƒЂЗдДшЧ бћŸcS’_DђіщЬ§хмœ7dЬD#Б9хђы„fg М*ьєнцШрˆђТОКtісˆуŒь-/(њВzvлЙ­0ЂЙ=lМЭž[7ЖU.ТЊЭыўы&Зfѕq1лшškН^E.+ zаU?zщЫЂ_Њž8де%DПP=9pшQv=ЗюФжм>„”MмЉѓЃ+WЏћЇ„шюCƒЌшQѕдВ ]тc`"š›омЖЧНтыС№HRЪкFwoдг&ўбГ‡F#]ЙїK[˜амEїoд/lPtїМ43ъ™СnНUЯЛвяд)блW[ѕмЌk}tэоOэѕНэpAЭ лђ@duёи7ч іЃБЙ3Fшючš§zvЮ+К›Ьь  ŸAJлw†4ЏН„тЅ‰ŽXц/q §щоДаKцeЩМ‡/iГБ—[Р7J<&qmЭzЂ=о§]ЙЛ;zw‹Ўšнc›1#ћК˜шЋъЙaCMщўыТЭэIєЧWЃїUнЎQ4њ˜е]€%ЋлЕьі бП.+!ziУ"Ђ_Љžк7жд…EŸ<›Ž^ЗЦ„цGєйTO;НЯ ˆnЗЅЉžкvjPX?z§ѕжR8К™р-wнџXSKЛWЌkћN=mcgvрРгцŠбЯЊgч5ГœАлѕ?%Vўш`г5–z^гsћ•=ќ0Йыв`ПШ‹^–КYп„oї$Н=Ш5ŸџZЋВіђЋ_ќa_=Лхe)‹{tŒљ+ь2ƒЦzМLŽz*цЕЭЮ7;чїЮ шСХ8ЙшЉ}fHємœђГжMзœѕРNfѕ‡ШшбеГ3(-є”ФШшюАєКщ‡ВуBз]№uT=њV)MкюeсшгЖšзуюАёю[Uї§ьЎэwъ6ЏЛ/Я_rШjO .Zнd%E7/Œъ‰}C'_щцюєљАшуЩю!бЫiѕьФо#ь^аќˆ>ъЙyc}^dєR?Кћ‘АyЋ~єЈzjмЉІњ33,њ‘нЌ{=ыГћFž5GFЯюк†7ЇyїЃKLrѓѓVЛтSЫ.tyх‹—у‰Ч1™лui—и\’ГЫ.ДбѕzйGЧьћѓrvМхЂЙtєу‹”ц‹•žvщž”|ќДІzыf[йдшŒщXvs7еKПЬюКvђCРьЌW$н]іCВџ="ƒVzM‹>4†4/‰ЭУ{тьЄW8%њАФ1KН—3 ;ЂxIаЙŽwaйо%6/э€”oУі ]vЩЏТ GŸ—•>Џ.yEо“Цm5З‘н&бЧнњ[[›W3Й9јѓpєх01Ѓз&К9ЁЙrѕсХРЬР‘cTRєГЕž8в”E4ЎНuWЯnьtuЭ§Я)‘бmѕмМБA_VuџN@є8{jн‰vYзуsGЭшfYялпavпа:ђЈNŠŽшgЭ‰бГѓЦŽ^XtШSщ—}\џ@=5э\—аМћ!Бюйešш€e^Ў.ФйeЎvйmЇЎvМйmЇЖ§.0zа=ЙьB_Z>y ЙoЗŽ+<ЛцUЧБ˜]ѓЂf–C&eДл%T‡эгwёбїзГ›ž:ЦЦЌє§ЯёиЦЬtbѓЩэevдSЧжŒцЅћї>2ЂbЃ3Ћg7М-2р&чXЧƒФцƒањВй—]uЃ/ТЊF_†Ž>)[KЮєv&ѓ№Л%wПuэЊзУwk6яЮмmО(к|8GuzїіUљшuyœ+§јnёшу)иuФnЂтЂ‡v‡Dom ЭKWїЃDЯnьєu‘бmѕмОБAп]БКЭ щW6ъй…#ЧРA§ьР‘~ioЉ•ЃOэDџв4“{Zdєэ'Џ шћЭpIИ‰/щб!уќiПаЂMчб…Г/šыVЏЛ]:(њіGPѓ}ЅЃšG›Fѕф>zvЯkŽы0;Зи ыpЙјйevиЅЬъГюйUOє­б§ЇЇ!бKШЯZ­ шГг‹GВѕЬ!4#Й˜МџЄ,ˆшo №уˆВjѓк~Йп+ймEяп,}Ј~œЮМ}Л\ѕБщžИџ#$К71pфѕјgLє—амEЋgGЖњКњЭK_зgDПšУѕЗЏ|ѕіGТD/‡Ѕ~МЬˆ^/Ђ+V7}ЛвТбMѕр/0;pф,КђBŸ?кUŽ~в\8њЂ}vпаН,2z9Yёй}Cћш%-њыЯАёШЈНйt~tхь‹шКеЭuЋЏšыF§3Њљ*zrй… дMnєу‹шіcџЩ5/Gљќ“MКvѕYtfѕьЎkƒињбуз'7=зMFBtиOaЭ'Ÿ0ЭЮzЂЙ’qС›SW:1;2 U‚\РЉrƒФњ‡с <И?яѓь›еO)эПћэAЏиRGеEЃ›ъю›поѓ’ѕЂКь…xZ]ђ о-h<ж›—уЂ>ОxМ]1К…ў‹’бƒО§YєlщQєкѓ^Ы.ѓі2р„ї6mP\ЎyщътЂЛwJnxЃшnbъЙЅЫWя/РлŸЃе/ІЎ}~к6ћЋшУЭ%'њи͘н7vЌЮXщfЏШh~Q=0ЛoЄЛƒЂ—“ёЈ§ИƒЇEŸŽЩьР‘[XдH_Џpбц‹нcvй…ѕьQЉrѕEtнъгщЈ\}ОЮ…Ѓ?%6wŸйTOюGzvб vK›НЫžє’GgNђ—~6ъџњ‰ЎПъgЗ–ве‘бЃ‡щђЭgC=ЗщЙІ:bЅг~И Œм<џВD§цЃлЅе\јпўЙYvdы‘ЋЌмрќЩкGRюŽяnПS6ћж5>ьГhє#ѕd­ППшЧуƒЂЯЋ‹F_W—ŽюЊs>+ы™нњіOj:ГMHЭцQѕ6,%Oi>65­U–^‡еkBєnПXшЅ;МŠˆюЊk^‡нJїSа`EыWпгЖ…ЈnЂ›mЃhєВ[с%)њs‰ЗW!бУ­Ѓj№‡cfТ28dfLЧutйъЖГ3;pфitХъuј4Z?zЛ'†DяВFїё’ЭЧЇŽ˜шх4Жvѓщ Wm^жс3iй5ўr]8ћ*КlѕЩDзŽў№CEЯюК–дњa№И4;щЙСCоьЄчю‘QбewumМРе—|0ѕх‡КЗ”ŽО?юяsЫ7ЎХњ =јр1ЌyMи:> ›#Ђ/Њїy)ЭGЁбГ ~†ашРъДqз#Wџ\ЙбYŽЅУл:о}ЋhіўјкОБfєёанСˆLhzn mNГНН71эм~y›уƒ—кбЃълы‰i.Њ nzЧа§зћйž–7ЖjЖЯкšЭOЊЋFїе бэ1єћКpєnKоН,кмпIF/ц&іњбэЋЇŽa{Ћfьн~}wяеЎnЃKЯђн~*іБ!бKГпUvR]Л{x7Q§k8TЎk“]Д§ЙŽЬ.Hю #Ђ/Гgь~?)Ÿš7vЈJ‰~:дГћ†NЂk?ыѕЗТCѕьМЁѕ,КhяЇ‹шКеыщVWЙњjы˜]v!Б9nЂПЄѕ.УЧЅйQЯ ђfG=5x^šѓЊІqн=Ћж­?YмтK>ŠђsrzoЉzG<ўіўѓЫ€шУЦїљ2ЁЙџ-hљцэ‘њі2Ђy§šуяЗцF=5кЂЫGˆў._ЙQЩeџ5ЋKasq“Y jt*bљ“х†g9VЎоŸ:о~Ћhіё0иэмєУ7‹iАmЮgЎ};г6!њАo4еeЧуИoЋ›S›+йWwR.z[о§еИ4егђN4'v?оЊнмž3ў83ИltuишjGЏТћ‹ЊЭ§ф–znс@ПGl/jGwлtџWЉeЗОл[Х›GᇛxIЧшуdOЬКЖ{L*ОМ;уыonгSнV‘НяŒЩ>ОП1;pdЙЭ.XŸVЯ.ЏnљшхЊМъч_ЂVz/'zј T=њУp–‹7Ÿ}ю˜]|Ё/ЖМйiЇЎіщйmч.F#ГzvкЙФцМў”иМ Гg']j>!h>{`ZъўVЋЗ­sщ?‡тS2šтђЃ}ВO—n^.Вg‡Нц›д|Їљ{&GЎsљŸТGТіЛЭп#.јCbsf4@Ўсƒе–ŸŒXИњ#mtpfсяeIЧo]ы§xєŒшCѕў§ЊбgеЕЃећ+sfйШ.uЛяо%нwIе3mMыaСЫŽє:Њо}YБЙ€бRO‹;гЅѕбыNt“ЛvцŽtu!бK{oЉо|ЗЏ‹Œ^BšлЮ„ф%guПŒЏПЙMOэЖ ьѕў4ЗєеUы‡зпКћ[ЬЙˆ.;(§ЪDŸ~дБ§Ef\~HS5њцjБK ‹Оќ$ovм™с,Ч5ўxщ!ђ2Ь+NlОШъйeюIЭiї”/ЂПOфЅxНр(}ЌЛнє•ѓЫАnѓ2Ю.ћщв‰КПѕМ”л<Лт-Щ‘Э‘ѓ\џО2=Лт=‰ ќ!Б`w&л№ИОкGЫœ\љ@М‹ГŽЋF CЊћТл•Ѓе_лHNє=wЉ}_ин@7/ыEoE‡•.}HъЂ‹NG[ЕŸщВбЇџ§Wn^Nг*Gwе§PЯЌ;бmЯй…лЮv{•§e=мcbЊя&5яžюRЂ‡SQ;y9хЌшнлSЛ.ЇЂю||t sйш.2сR<^viбЇf\­qншЯ„EпEFŸWЯ;s9зГуNŒBЋ7ЂЃЫ7ЧѓЧF§#-shєьД ЗОЄфѓЅžнu%q8Ђ‡:Ўњ&*z‹Ы‰оч…EЇЭtbѓrў@=Лы= +нвќђŠ—ЂџтСЅЊџЖФ3‘уQјвVzїГть”ї&Wџ7bžШ;InpшnёПAрБСчG—ю8N‹>ж&VW^ъqѕR5њ‘t^=БnьИ'ІК^єсП§§ХЗe—k>;hЗі–wV;z9iлэᧆWКњ№Ђј||5Ÿ |5эВWъЃ§:—?ХћjІgЗ_€ЂУPбП‚сPдўЬzќ#dІЗДАшИну0О)б7‘беГЫ.фEwѕ›‡‹›0‰Э‘›t`rftbѓуS‚ЄцР[с:‘;оX=;эдН.Ў9rЁУš—ГK‹GпsЋЏєH^sРHЗ.УFФжё№ИS‚?Єlа9ї•Э~—މоэsAбЁSН<~З<ЛуmyХ›§xgЪс­lX\;z_иR9"ЃwŽOmnнш}иWьЖЦeЋзІњіЧсЯjЦЃЛЭGЩюqз~@ FЊїoеЌОЎћWеЃ[ЦвŸнБ[7‘ї˜CcЬq0…›w;\ov쉓квЭmtџ№TбpqЋGЋЫGїS]Лљrу(§ЕЊWеГ кNh^к­"ЃњKbГшяанЖžёЦ‹[<њњ/3zvн™Фцѓшйaзљѓщ#­љіШ”е9вБ3НUFVgЎuJєж\7њьЮRКyYњOЄoћШмЌŸ!5zvТ›Њ_†€­cГ]aЭоˆфСok#„м ;Сеqї•Р…ў˜ .ю”ФсССЕЮ Юh­rёцqrёшЅ‹ˆшхѓ№кМшЖ4 z\=ЕшмжеU—оwЕеUчЃЙкО^Њ+v7]ƒЕ.X=XъfЌЋG7;єZuЉЭћбЎНї8Xї™QЯ юˆѕЃ—CewЏЉjZОyПmєO{ГыNt‘yбkѓофИSkŸ]?њє‡ФЂбн44пѕЃšŸЎєфМЁШщИљЁšEџ‚FеЋЧ‹0‰ЭЯЊgз‰ ў0ќ8НzєrВиГЃžK‹>{6нui™“НŒЉn*ѓЂ#W:<Кья‰О~Wq˜эЉY?Gэ…>кœ]}яh%ьwA{єУ17Ѓyi~K4;ц QГБ‰Œ^"ЃП~8Ÿн@yi'hЦ”О ŸєLПШ еуьйQO.іК ђ­Е~є`iЋ'оноšYє‚бWnІсX]tЉлq8VWн?њK/ њ,њP=ЉэдХ|lЯ ћ†њцуЋ’б;ƒНЃ~t[}ЌЮЛ[gљшGйњxYОЙћi6/К3ЛюD\tЗWdDїS\НљЧŒžн7”иќ%Б91њт*ЌZ=Ш,=\мъеWГ‘=;яDbsф~ї!2њњеХьІЄE?,žНŒЉnњ2ЂO~U?zќnхшБаfбп!Б91Књ&}wЫЬИГм…=/}IlўиМєП ‘иМDюаKн €RтvьЮ§,>(._}в\;њыЪАъ{bѓgщшQcNєкМ5Бщ™бз.ў0ЎžYєŠAѕзБи3ЃЦњ>DзœъС•WПњ$z=М1ЉэTГ[ьЂї7šbЭЧWЃ—Сp4/ Fяœ\†ЕЃ•!+}sЫ,}ЖёUoО0;oшIГш_ЪГцЊб—сГћ†nQбы“•žн77Я›/ЋgЇ]hBЊ‹[Оњђ: ЎYиМ\dзў\,l•o›ЧеГ›žJlўpЬЩю|vЯЋ"Ѓo"ЃЃІzк9в‰Э‘б)гёџлЛлdЕq5 ЃЌц?†0В-И• mz­Tu8ќzЂz-љ@Wyu|Ч4žс‰ЭЅћYB„Рф2эЗс/%6OљПЅР_’іŒФМ^їЯXК{ ŒŒЋ~ЖЕ“Gwзuю•юOУмЭЋъіНEяшTЯ]šяљжЄхЋiиЌѕД[^эUoоSvЌžEЯКдћТчЉ2mtщD—эa>0ЏЏГаыŸfŒ~:šшЉЃЗЛХќ+НохJ9И™Jџ h>4КЎяМyЮшЭSFПjŽŒнз•иЙuœGŽ;˜\~Ё:тЖЃьožЊO/ФIЃ;31tфJ_єяЅWŠL)j‘oВ&c6Юw‰ЭыкМюЌеЮљ@Ќ#2КLњХХ ‰ кœyFFЇŒt{ЄдРшЄ“%Б9їЖ#Бр?*юЙŸ—ШЌgЌо їO†9ћоЗэ?КЉ~О?0ъФс,L=§ъйgКW}}=qsY?ћёжШ ЗдћЪЖK]&_ъв‹ž{Ј/ЖеѓF?‹ю…Лw&Œо­ы#uт•>Œюmн“9iž7zПQ‡EзЭƒЫŽœ GdГшПчМyЮшФfб_“иЙIGо*U.;ГЪ Ќ.[Ї9eNѕqїшЎKXXєMdє>;тƒБmѕшœ—'#ьЋ–‡ФцЋ&7(њpBFwJŒПŸЙѓGяЋGН'В:/z§ёLFѓтY›гМљо%%‰ЭЇеЃгŽ%FџкtЬ9gеЃЫЮˆў’ШёHlŽќUМTŽzSdєіw˜езвФш€пŸV Нл6цюэаГGœ+iЭSї.›ПkYф?фVnјЗjktЬ[ъошЄ:ХѓwGFVю:Г) j~6FE/™їsGїgyђ•ю]}ГЯЧб2‡Ely‘žОљ$ztй бп"њk"Ѓ#oL*ztжЙФцƒъбQoHlОˆŒЮЌ.!ПŠ7jЦя‡Ж4%z=бл pњшўБж’Кг%F‡.5Є.–—ЃcоSnЏGНхвY—џЦ4—f0R’џШ)§-A#ђs-6™9Hннѓ–ФцЬш]ъэ@ŒŠОKl†RяPswЛИшаъдЃ%БВд:Кр3ѕftЧG–тЅ9Ї§'{tќm‰›џ-u1:уѕatЩ'ЂЃGw|&0Й\ЋG'ќЗд‹бЊwЃC>‘иќЈёЁМbxG]ŒЮјPb3џ‡џа=q{lmricron-0.20120505.1~dfsg.1.orig/example/cutr.ini0000664000175000017500000000050710403226754020766 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=1 Trilinear=1 OverlayFromBGSurface=1 ShowCutout=1 FlipLR=0 [INT] BGNearClip=0 OverlayNearClip=0 Azimuth=110 Elevation=45 BGSurface=25 OverlaySurface=1 BGDepth=12 OverlayDepth=8 CutoutLo1=96 CutoutHi1=181 CutoutLo2=118 CutoutHi2=217 CutoutLo3=87 CutoutHi3=181 CutoutBias=3 mricron-0.20120505.1~dfsg.1.orig/example/cut2.ini0000664000175000017500000000051010403303006020642 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=1 Trilinear=1 ShowCutout=0 FlipLR=0 [INT] OverlayFromBGSurface=2 BGNearClip=72 OverlayNearClip=0 Azimuth=70 Elevation=25 BGSurface=25 OverlaySurface=0 BGDepth=12 OverlayDepth=12 CutoutBias=3 CutoutLo1=96 CutoutHi1=181 CutoutLo2=118 CutoutHi2=217 CutoutLo3=87 CutoutHi3=181 mricron-0.20120505.1~dfsg.1.orig/example/clipnearr.ini0000664000175000017500000000051010403412200021741 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=1 Trilinear=1 ShowCutout=0 FlipLR=0 [INT] OverlayFromBGSurface=1 BGNearClip=56 OverlayNearClip=0 Azimuth=110 Elevation=30 BGSurface=25 OverlaySurface=1 BGDepth=12 OverlayDepth=8 CutoutBias=3 CutoutLo1=96 CutoutHi1=181 CutoutLo2=118 CutoutHi2=217 CutoutLo3=87 CutoutHi3=181 mricron-0.20120505.1~dfsg.1.orig/example/attention.nii.gz0000664000175000017500000000743310403405104022426 0ustar michaelmichael‹CыDattention.niiэнй#ер"‰ЂќѓžEЩC$i—ЫхZmW•э*ЗЗђОєцоІ—Ё;3=4Г™a a™Q„ HQ"%R$Є(QЄHМч-/y&^КЇэі­[ukІi~KЛmпЎВнїд9їмйћ8ЎКм;3Фѕъg‹‹Е^Ћ^ыmTjѓ+=nЄЧ}“ћїw?wпС_“ОС}gјuї!Ž{јсЃп{'ђэ…П[z?џгёG??јj$д-ѓмїы­юJ­WЋўфЬъ™Яќ№ў?№РїЮtњ7рю–o|œчёsœџЁ?™МяГO&ŸЇŒ}?2џнм­“€ЛAфCŒQѕhЈƒ…8QbЄЛудAq‰xЗHЄ ФЛщ/•xrpчfяѕ Рщ&Щ!Т“dЮЁ$5k$и1™"Ф"~'-оХEQТŒBˆt‡їњрД‹„ЂЄuЏ`„їќyjsЅ"“вН#Ћ|еіxD&g~†Dr‚Їъ!^nЈЈЁРW“цѕР0l‰C!й4 тƒЇ ЙиLwЫž™—„ыU)•Ў:žёFЬ+R“M‹9Ё% {= ЊS"5Š05„Ї{Mкё\ŒCтg•T’tџшфUђ hКж№ŒМ<ƒ­Нэ’~5˜аЋ ФаŠіЂЄъ|бћє<sы9Џд”7Еe2щЧwеƒ€G‘лˆO'ѓє> QЫuHƒшUf‰)Љ%p’UЮГжШёхr.У8†‹fЬЙ$€ЏіЄAŸь‰P&оQіI9Џ Qrw9rGЗУ5K'няdhЭтЊFˆOЄ’wмш Є\ŽFсDтљQi‚ШœZ˜ЮdjNЦЂЁšЎХ=FХJ Z\sˆ/+“ЁtKEbšЃЕЬvМЪэ(cше}^BДZ€€QЊХЧеa—hЬВ'Л’Х{ЊFЈу':‹О нО’b%™H2oБm{†yЂg,цЬ‹(%“y”РХЩ-юР[DbяuЬ'э)ƒ\§Х‡Љ“2iі§*gf:DЏБПXŽWsц\RLЭ­173ˆЋBŠЙXѕqpЊ„ЉzЪЖЬcтŸ-3+Rш’S2:-ЩІъU;ХzNЛю0PqЃ eЫГьm R…Бm7§H™qMБœ*Rˆ`hЉШ>г?Лф&њ<­hMnе4вщЅЪ^Ž˜Ф€'RнZЇ"в{W.жYу'НёШѕuцT_XoБя™$TmіEШГї8бТtKВЏ…QD“АдФgNžŠ'Їы+EкcйVё“кЛBUЗUТ ѓтЏЏQ’YЊЁŠг ћЏЛ~’иЭъtC{‚:&=ПBЈ+ьНDdl^:чLн[_Й|–‚Zyщq{ъЮі\oжj-ЕМ>§Fд;nЁˆ„ј)й,0G—§w"ЂдНчŒф]іnRЇ1 L‡,“ЌХЮTзЁООOдЙБW:~ŸXюювђ;\чэ_ЙЧяуэЮFš6Hйyez%‘йiа Skгљ­’іIЮ"ж˜І"Y!€аъ!ЦdjSekў;}–SБ†Qpsд1въš{<•А]ъВ$NкМV9~_,с–шЇзz|КПœ^ѕY}eЎMчr’ЎOrŽoNgsт dxNОЉЖў‘ЧEХЩИзŒ„oЯщXњXж*Ў'MПАСJЯ—zЦo§Ž3гmП#х&дЭєљ5ЏмЩAN?В|#!ДŠ8yVwMFPё@{я№!к pRˆРA”'Г9‘ўпОhr|т5х+бQ ?Y@7лMDйsBК~*w Гх.bы'€г)T˜ OD]СЂ)^?”S NœžНфІ‚ ›—f2!v„ љО|‰ј {rŽГ˜7мэ“§6м%ЦС>ПuAšЧqЬэNЂ‚fmй] ѕЛцух˜2|EТЬгbcSЎЈ0?1~ 1k†Шaщ ] ’'ž$‘vOšvЯgЬ„АBЏјэуDј`уЅ.­9 ‡rЧЁЯЫIQeаБ’SЋдZ Skф ЏЂjжkЬŒ [ф_>"иƒдЗ“Ј–уьШЊћRСЧ\1рЄ Г‹Ј:>З ZјІЊGЯTœ€г/!v”HZzРўlcO“ФXРkхcЏ#"ЦЅ@ѕqтx˜еƒMyБ™,R UЅvœт…M­штRnе/­2§ЉhХ… ­€oЧ‘ђўХВE}Ё„EЊбѓюH“ŠI)Yі>НИNшЧи—4ІчЧ•Щ‰0еД]ц`CЪ,ЕЁм\wMц:T{Џ"8яВ€АБ3РЩf UM?З– Жхiм4ЋІєJЗž T‚$іaЂ@VT3hв&[Йƒ>тQ-гЭ@Й={;ЁЊ ;(~Вьл?;7*єо{”bilŽ+xцЦФ3хЪјЬ]5ќ“š!Щ™ёдLЌАрЛЛRСŽqБёOFо87ыwЌФјЉ ^›К~vЉmЊдЗpbž?|fу‘'vѓ™nvЉEЌzЛшxў.Iš’%О^)ЯzZšIќP­jy>я9ЪуwГх:uж`#Зж)šЌ‰!ui3Ч2ЋЖ„эАО03!rсb˜~,ўы!р pi/ш3“•хƒ}ŒŒJkКбmrћђхQoq^Vг7а”внО|a”ЩаMнЎчƒЬFДЭ§еƒЙБZ,vzо3о1љѓчŸGгЅVЏрHттЮюмсѓФдь|#Рь5лнМњшб)%—Жk~ЫjИlйЉlэЭпўžo^НRѕI4шЫkхtБ3ŠX…С›]МВ™Їц­јИY­ооСJtg™пы-ЩћuёЩ”1еІзЋ§ЧZmЗ’Ыx^Wgі(яЂфZУ+зK MЯ>1ьшх;K–чЪ.Э GЯЅљFГъ5ШУL}ОœЭњ~ZЧфžђй>‹DО(‡/Q$ФлгiЁh˜рHТg'IД{}s”–0ч6Ž‘Кoџ§ќ№zЇdU7з(БоеЗ>коЬд—ŸоБƒ r_{џѕ§іpœšЛєњЃAŽ9џўGЏЎ5‡??^иОИZpп~цН?§ютvyxІЉцціЊoж…уsЋ/§ѕЯoЬЇU‚ъЌ\ЛЙ™ї)ЃсЫЕђЪХ'ЎЇ†aЯEgЏ^_їйМw&ПuiБ–Џ•#\$"j§(ВqЎd(ДQбъBgЅ3œЗGЂŠ“мЪTS’ЂRцђЩнFz8Н›EЃQ .ŠšF)%K/.%kŒЪэ4YдАМлUЄŠу9KўшM3ВiЯYЊшU;чƒVvŽЩBtг(„™B‡щь_Ўh˜†I‹=JцќЖ (њэEM аВМ2I,€ ДЧўrixЃМДїдN !|смЧџМ1HDЫ›/ќИфъh§™?ўу­НсFБЩжoўЖяˆjдKџњяЇ7/Ю nЫйЫЏoзSОџƒnќяѓ_xe­RцќЕыъОГыLnюц{ЯН№Ш мM4гЅн7ŸэљеК%чъеее ЖаŸмФIяоКЙœї9TiчБеnЮЩ+б˜‹їЇ_њЙХЌ™ЁЫjwWGAЧ+‰с”-*r‚A­KЬ-ЖooЅgІ№дјNЭ%WјTРЩс]nа‡ЮipG‚ЕV™ЭйьЃмFŽ9-”˜]9№пВ`LБ0Šk$–œЄspyРœetШѓR }јлУЏЦмsќ<аˆТ|№ќХЦрІPxѓ?—ŠB!mуїя>ГЛоЬті“Ÿ>еJњN!4ГyсЪ…эЭвpŒГ№ђ­ѓПP(‘K;Э­нЦ` Є-{ужЭ­ЂЯЁJ[ эееV#1ˆUUъЗў№ќ–ЯlЅ§є~Џž”и`.f8БЕкш.R—3 nз=|ТбfLУЂUxЉГ™Ѓ%№oьi _5ЧГ@‚ŒшdNашцƒ„B“э—6[A"†‰џЮ%ъsчGЫNй§РFvXњч+Љсvf)ЬўиД р pхъъшFёџ6bywcчl37HjШ>{Еэ?$ЊкnчьZЫцщЋљНwпЙмђыа&щfЖ0ЗБ:мЖH6-gѓ—o]лЅ_NДЯЎtКХЄФЂ*FŒ­[Џ>Noќ5ГѓтЂ5œЋ R„.PPмvлg]RЅq8qЄЃќNDЄMњДёDSа+о Рр Гі&’)‡˜ИЇ+ЮјЗх+Эu™‰ТDіvяйн’џЕƒTe"ъ*Ю=в №Їlт)|fv!зЉ˜іят­\­џчžЕ†oил†Е5jёОpБж3|jБЙВо- QвKOНёЦЕCЌR? qgг§I€fgв•• Лg}†tкecpU˜їgpІ#s‘DОб*вп8И&9б2sПˆšЂO=tз>œk№œlš’LODWСŠиіIпNЕ0{шZЕ•` 6ЧЦDTЃHAњБИЕ‰ OЖTHћ_dАЪпjХRХp“ЇcенcŽ).7йРi"њm^zФв5}ИQO> ‘іаиœІTЏ№ўKёgЧ&Of~T`у7œи‹H VЦoO\ЏxЙ§$яM №ѓ€Эђ“ZYmricron-0.20120505.1~dfsg.1.orig/dcm2nii/0000775000175000017500000000000011754254530017203 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/dcm2nii/zconf.inc0000664000175000017500000000127410251424440021007 0ustar michaelmichael{ -------------------------------------------------------------------- } {$DEFINE MAX_MATCH_IS_258} { Compile with -DMAXSEG_64K if the alloc function cannot allocate more than 64k bytes at a time (needed on systems with 16-bit int). } {- $DEFINE MAXSEG_64K} {$IFNDEF WIN32} {$DEFINE UNALIGNED_OK} { requires SizeOf(ush) = 2 ! } {$ENDIF} {$UNDEF DYNAMIC_CRC_TABLE} {$UNDEF FASTEST} {$define patch112} { apply patch from the zlib home page } { -------------------------------------------------------------------- } {$IFDEF FPC} {$DEFINE Use32} {$UNDEF DPMI} {$UNDEF MSDOS} {$UNDEF UNALIGNED_OK} { requires SizeOf(ush) = 2 ! } {$UNDEF MAXSEG_64K} {$ENDIF} mricron-0.20120505.1~dfsg.1.orig/dcm2nii/windowsxp.res0000664000175000017500000000134007374553744021772 0ustar michaelmichael џџџџŸ џџџџ0  Windows Shell mricron-0.20120505.1~dfsg.1.orig/dcm2nii/untar.pas0000664000175000017500000003220411326434462021041 0ustar michaelmichaelunit untar; interface {$IFDEF FPC}{$mode delphi}{$H+}{$ENDIF} uses {$IFDEF FPC} gzio2, {$ELSE} gziod, {$ENDIF} define_types,SysUtils,LibTar, gzio,dialogsx,prefs,sortdicom,classes; function DeTGZ (lFilename: string; lPrefs: TPrefs): boolean; function isTGZ (var lStr: string): boolean; implementation function isTGZ (var lStr: string): boolean; var lExt: string; begin lExt := extractfileext(lStr); lExt := UpperCase(lExt); if (lExt='.TGZ') then Result := true else Result := false; end; (*procedure Extract (var lTarFile: string; lOverwrite: boolean); //extract target VAR TA : TTarArchive; DirRec : TTarDirRec; lPos,lLen,lnumFilesTotal,lnumFilesCompleted,lPct: longint; lStr,lOutDir,lLocalDir,lFileName,lNewDir,lTarName : String; begin lOutDir := extractfiledir(lTarFile); //next Count files for progress bar.... lnumFilesTotal := 0; TA := TTarArchive.Create (lTarFile); TRY TA.Reset; TA.SetFilePos (0); TA.FindNext (DirRec); repeat inc(lnumFilesTotal); until not TA.FindNext (DirRec); FINALLY TA.Free; END; //finished counting files //next: extract files... lnumFilesCompleted := 0; //FProgress := 0; TA := TTarArchive.Create (lTarFile); TRY TA.Reset; TA.SetFilePos (0); TA.FindNext (DirRec); repeat inc(lNumFilesCompleted); {lPct := round(lNumFilesCOmpleted/lNumfilesTotal*100); if lPct > FProgress then begin //only update progress bar 100 times: do not waste time updating screen FProgress := lPct; DoOnProgress; end;} if DirRec.Name <> '' then begin //Screen.Cursor := crHourGlass; TRY //filename change '/' to '\' lTarName := ''; lLen := length(DirRec.name); for lPos := 1 to lLen do begin if (DirRec.Name[lPos]='/') or (DirRec.Name[lPos]='\') then lTarName := lTarName + pathdelim//'\' else if (DirRec.Name[lPos]=':') then else lTarName := lTarName + DirRec.Name[lPos]; end; lFilename := lOutDir+pathdelim+lTarName; lLocalDir := extractfiledir(lFileName); if (DirExists(lLocalDir)) then begin {lProceed := mrYes; if Fileexists(lFileName) then begin if (gmrOverwrite = mrYes) or (gmrOverwrite = mrNo) then begin OverwriteForm.Label1.caption := 'Warning: the file '+lFilename+' already exists.'; gmrOverwrite := OverwriteForm.Showmodal; end; lProceed := gmrOverwrite; end; } if lOverwrite{(lProceed = mrYes) or (lProceed = mrYesToAll)} then begin if (length(lFilename)>2) and ((lFilename[length(lFilename)] = '\') or (lFilename[length(lFilename)] = '/')) then begin lLen := length(lFilename)-1; lStr := lFilename; lFilename := ''; for lPos := 1 to lLen do lFilename := lFilename+lStr[lPos]; if not direxists(lFilename) then begin mkdir (lFilename); end; end else TA.ReadFile (lFileName); end; //proceed end else begin lLen := length(lTarName); lPos := 1; if (lLen >= 1) and ((lTarName[1] = '\') or (lTarName[1] = '/')) then inc(lPos); lNewDir := lOutDir+pathdelim; while lPos <= lLen do begin if (lTarName[lPos] = '\') or (lTarName[lPos] = '/') then begin //showmessage('creating directory:'+lNewDir); if not direxists(lNewDir) then mkdir(lNewDir); lNewDir := lNewDir + pathdelim; end else lNewDir := lNewDir + lTarName[lPos]; inc(lPos); end; if (lFileName[length(lFileName)] <> '/') and(lFileName[length(lFileName)] <> '\') and (DirExists(lLocalDir)) and (not Fileexists(lFileName)) then begin TA.ReadFile (lFileName) end; end; FINALLY //Screen.Cursor := crDefault; END; end; until not TA.FindNext (DirRec); FINALLY TA.Free; END; end;*) procedure Extract (var lTarFile: string; lOverwrite: boolean); //extract target VAR TA : TTarArchive; DirRec : TTarDirRec; lPos,lLen,lnumFilesTotal,lnumFilesCompleted,lPct: longint; lStr,lOutDir,lLocalDir,lFileName,lNewDir,lTarName : String; begin lOutDir := extractfiledir(lTarFile); //next Count files for progress bar.... lnumFilesTotal := 0; TA := TTarArchive.Create (lTarFile); TRY TA.Reset; TA.SetFilePos (0); TA.FindNext (DirRec); repeat inc(lnumFilesTotal); until not TA.FindNext (DirRec); FINALLY TA.Free; END; //finished counting files //next: extract files... lnumFilesCompleted := 0; //FProgress := 0; TA := TTarArchive.Create (lTarFile); TRY TA.Reset; TA.SetFilePos (0); TA.FindNext (DirRec); repeat inc(lNumFilesCompleted); {lPct := round(lNumFilesCOmpleted/lNumfilesTotal*100); if lPct > FProgress then begin //only update progress bar 100 times: do not waste time updating screen FProgress := lPct; DoOnProgress; end;} if DirRec.Name <> '' then begin //Screen.Cursor := crHourGlass; TRY //filename change '/' to '\' lTarName := ''; lLen := length(DirRec.name); for lPos := 1 to lLen do begin if (DirRec.Name[lPos]='/') or (DirRec.Name[lPos]='\') then lTarName := lTarName + pathdelim//'\' else if (DirRec.Name[lPos]=':') then else lTarName := lTarName + DirRec.Name[lPos]; end; lFilename := lOutDir+pathdelim+lTarName; lLocalDir := extractfiledir(lFileName); if (DirExists(lLocalDir)) then begin (*lProceed := mrYes; if Fileexists(lFileName) then begin if (gmrOverwrite = mrYes) or (gmrOverwrite = mrNo) then begin OverwriteForm.Label1.caption := 'Warning: the file '+lFilename+' already exists.'; gmrOverwrite := OverwriteForm.Showmodal; end; lProceed := gmrOverwrite; end; *) if lOverwrite{(lProceed = mrYes) or (lProceed = mrYesToAll)} then begin if (length(lFilename)>2) and (lFilename[length(lFilename)] = pathdelim) then begin lLen := length(lFilename)-1; lStr := lFilename; lFilename := ''; for lPos := 1 to lLen do lFilename := lFilename+lStr[lPos]; if not direxists(lFilename) then begin mkdir (lFilename); end; end else TA.ReadFile (lFileName); end; //proceed end else begin lLen := length(lTarName); lPos := 1; if (lLen >= 1) and (lTarName[1] = pathdelim) then inc(lPos); lNewDir := lOutDir+pathdelim; while lPos <= lLen do begin if (lTarName[lPos] = pathdelim) then begin //showmessage('creating directory:'+lNewDir); if not direxists(lNewDir) then mkdir(lNewDir); lNewDir := lNewDir + pathdelim; end else lNewDir := lNewDir + lTarName[lPos]; inc(lPos); end; if (lFileName[length(lFileName)] <> pathdelim) and (DirExists(lLocalDir)) and (not Fileexists(lFileName)) then begin TA.ReadFile (lFileName) end; end; FINALLY //Screen.Cursor := crDefault; END; end; until not TA.FindNext (DirRec); FINALLY TA.Free; END; end; function FindFile (lDir: String): string; //lDir should include pathdelim, e.g. c:\folder\ var lSearchRec: TSearchRec; begin result := ''; if FindFirst(lDir+'*', faAnyFile-faSysFile-faDirectory, lSearchRec) = 0 then result := lDir +lSearchRec.Name; FindClose(lSearchRec); end; procedure DeleteTreeX (const Path : string; recursive : boolean); var Result : integer; SearchRec : TSearchRec; begin Result := FindFirst(Path + '*', faAnyFile-faDirectory , SearchRec); while Result = 0 do begin if not DeleteFile (Path + SearchRec.name) then begin FileSetAttr (Path + SearchRec.name, 0); { reset all flags } DeleteFile (Path + SearchRec.name); end; Result := FindNext(SearchRec); end; FindClose(SearchRec); if not recursive then exit; Result := FindFirst(Path + '*.*', faDirectory, SearchRec); while Result = 0 do begin if (SearchRec.name <> '.') and (SearchRec.name <> '..') then begin FileSetAttr (Path + SearchRec.name, faDirectory); DeleteTreeX (Path + SearchRec.name + '\', TRUE); RmDir (Path + SearchRec.name); end; Result := FindNext(SearchRec); end; FindClose(SearchRec); end; Procedure copyfile( Const sourcefilename, targetfilename: String ); Var S, T: TFileStream; Begin S := TFileStream.Create( sourcefilename, fmOpenRead ); try T := TFileStream.Create( targetfilename, fmOpenWrite or fmCreate ); try T.CopyFrom(S, S.Size ) ; finally T.Free; end; finally S.Free; end; End; procedure CopyDir ( lSourceDir,lDestDir: string); var Result : integer; SearchRec : TSearchRec; lSrc,lDest: string; begin Result := FindFirst(lSourceDir + '*', faAnyFile-faDirectory , SearchRec); while Result = 0 do begin lSrc := lSourceDir + SearchRec.name; lDest := lDestDir + SearchRec.Name; copyfile(lSrc,lDest); Result := FindNext(SearchRec); end; FindClose(SearchRec); end; function DeTGZ (lFilename: string; lPrefs: TPrefs): boolean; var lPath,lName,lExt,lOutPath,lTempDir,lTarName,lDicomName: string; begin result := false; if (not fileexists(lFilename)) or (not isTGZ(lFilename)) then exit; FilenameParts (lFilename , lPath,lName,lExt); lOutPath := lPath+lName; if direxists(lOutPath) then begin Msg('Unable to extract TGZ file - folder exists '+lOutpath); exit; end; MkDir(lOutPath); lTempDir := lOutPath+pathdelim+'temp'; MkDir(lTempDir); lTarName := lTempDir+Pathdelim+lName+'.tar'; UnGZipFile (lFilename,lTarName); //unzip Extract (lTarName,true); deletefile(lTarName); //now convert files to NIFTI lDICOMName := FindFile(lTempDir+Pathdelim); if (lDICOMName = '') or (not fileexists(lDICOMname)) then exit; LoadFileList(lDICOMName,lOutPath,lPrefs); DeleteTreeX(lTempDir+Pathdelim, true); RmDir(lTempDir); if (lPrefs.BackupDir <> '') and (DirExists(lPrefs.BackupDir)) then begin lTempDir := lPrefs.BackupDir; if lTempDir[length(lTempDir)] <> pathdelim then lTempDir := lTempDir + pathdelim; Msg('Copying to backup folder named '+lTempDir); CopyDir(lOutPath+pathdelim, lTempDir); Msg('Backup completed'); end; //Extract (lFilename,true); result := true; end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/sortdicom.pas0000664000175000017500000004741711544422566021733 0ustar michaelmichaelunit sortdicom; {$H+} {$Include ..\common\isgui.inc} interface uses SysUtils,define_types,classes,dicom,dicomtypes,convert,dicomfast,prefs,userdir; function LoadFileList (var lInFilename, lOutDirname: string; var lPrefs: TPrefs):boolean; function LoadParamFileList (var lInFilename, lOutDirname: string; var lPrefs: TPrefs; lParamNum: integer): boolean; implementation uses dialogsx; function IsRepeat (var lD1,lD2: DicomData) : boolean; begin if (lD1.ImageNum = lD2.ImageNum) and (lD1.AcquNum = lD2.AcquNum) and (lD1.SeriesNum = lD2.SeriesNum) and (lD1.DateTime = lD2.DateTime) then result := true else result := false; end; function IsEqualDT (lI1,lI2: TDateTime; var l1LessThan2: boolean): boolean; begin if lI1 = lI2 then result := true else result := false; if lI1 < lI2 then l1LessThan2 := true else l1LessThan2 := false; end; function IsEqual (lI1,lI2: integer; var l1LessThan2: boolean): boolean; begin if lI1 = lI2 then result := true else result := false; if lI1 < lI2 then l1LessThan2 := true else l1LessThan2 := false; end; function D1LessThanD2 (var lD1,lD2: DicomData) : boolean; begin if not IsEqualDT (lD1.DateTime, lD2.DateTime, result) then exit; //only get here if lD1.DataTime = lD2.DateTime if not IsEqual (lD1.SeriesNum, lD2.SeriesNum, result) then exit; //only get here if lD1.SeriesNum = lD2.SeriesNum if not IsEqual (lD1.AcquNum, lD2.AcquNum, result) then exit; //only get here if lD1.AcquNum = lD2.AcquNum if not IsEqual (lD1.ImageNum, lD2.ImageNum, result) then exit; //only get here if lD1.ImageNum = lD2.ImageNum end; procedure ReportError (l,i: integer; var lDICOMra: TDICOMrap); begin //Msg('Error: these files have the same index '+ lDICOMra^[lPositionRA^[l]].Filename+' = '+lDICOMra^[lPositionRA^[i]].Filename); Msg('Error: these files have the same index '+ DICOMstr(l,lDICOMra)+' = '+DICOMstr(i,lDICOMra)); end; procedure ShellSortDCM (var Items: integer; var lDICOMra: TDICOMrap; var lRepeatedValues: boolean); //Shell sort /- see 'Numerical Recipes in C' for similar sorts: less memory intensive than recursive quicksort label 555; const tiny = 1.0e-5; aln2i = 1.442695022; var inputItems,n,t, nn, m, lognb2, l, k, j, i: longint; lPositionRA,lPositionRA2: LongintP; lTempDICOMra: TDICOMrap; begin inputItems := Items; lRepeatedValues := false; if Items < 2 then exit; Getmem(lPositionRA,Items*sizeof(LongInt)); for i := 1 to items do lPositionRA^[i] := i; n := (Items ); lognb2 := trunc(ln(n) * aln2i + tiny); m := Items; for nn := 1 to lognb2 do begin m := m div 2; k := Items - m; for j := 1 to k do begin i := j; 555: l := i + m; if //identical refs {(lDICOMra^[lPositionRA^[l]].ImageNum = lDICOMra^[lPositionRA^[i]].ImageNum) and (lDICOMra^[lPositionRA^[l]].AcquNum = lDICOMra^[lPositionRA^[i]].AcquNum) and (lDICOMra^[lPositionRA^[l]].SeriesNum = lDICOMra^[lPositionRA^[i]].SeriesNum) and (lDICOMra^[lPositionRA^[l]].DateTime = lDICOMra^[lPositionRA^[i]].DateTime)} IsRepeat(lDICOMra^[lPositionRA^[l]], lDICOMra^[lPositionRA^[i]]) then begin lRepeatedValues := true; ReportError(lPositionRA^[l],lPositionRA^[i],lDICOMra); //Msg('Error: these files have the same index '+ lDICOMra^[lPositionRA^[l]].Filename+' = '+lDICOMra^[lPositionRA^[i]].Filename); end else if D1LessThanD2 (lDICOMra^[lPositionRA^[l]],lDICOMra^[lPositionRA^[i]]) { (lDICOMra^[lPositionRA^[l]].DateTime < lDICOMra^[lPositionRA^[i]].DateTime) or ((lDICOMra^[lPositionRA^[l]].DateTime = lDICOMra^[lPositionRA^[i]].DateTime) and (lDICOMra^[lPositionRA^[l]].SeriesNum < lDICOMra^[lPositionRA^[i]].SeriesNum)) or ((lDICOMra^[lPositionRA^[l]].DateTime = lDICOMra^[lPositionRA^[i]].DateTime) and (lDICOMra^[lPositionRA^[l]].SeriesNum = lDICOMra^[lPositionRA^[i]].SeriesNum) and (lDICOMra^[lPositionRA^[l]].AcquNum < lDICOMra^[lPositionRA^[i]].AcquNum)) or ((lDICOMra^[lPositionRA^[l]].DateTime = lDICOMra^[lPositionRA^[i]].DateTime) and (lDICOMra^[lPositionRA^[l]].SeriesNum = lDICOMra^[lPositionRA^[i]].SeriesNum) and (lDICOMra^[lPositionRA^[l]].AcquNum = lDICOMra^[lPositionRA^[i]].AcquNum) and (lDICOMra^[lPositionRA^[l]].ImageNum < lDICOMra^[lPositionRA^[i]].ImageNum)) } then begin //swap values for i and l t := lPositionRA^[i]; lPositionRA^[i] := lPositionRA^[l]; lPositionRA^[l] := t; i := i - m; if (i >= 1) then goto 555; end end end; //next - remove any repeated values if lRepeatedValues then begin Getmem(lPositionRA2,Items*sizeof(LongInt)); k := 1; lPositionRA2^[1] := lPositionRA^[1]; for i := 2 to Items do begin if not IsRepeat(lDICOMra^[lPositionRA^[i-1]],lDICOMra^[lPositionRA^[i]]) then begin inc(k); lPositionRA2^[k] := lPositionRA^[i]; end; end; Items := k; for i := 1 to Items do lPositionRA^[i] := lPositionRA2^[i]; Freemem(lPositionRA2); end; //Next - created sorted lists based on pointers... //... a quicker way would be to return the pointers, but this is still pretty fast... //... a lower memory solution would be to swap items inside lDICOMra Getmem(lTempDICOMra,InputItems*sizeof({TDICOM}DicomData)); for I := 1 to InputItems do lTempDICOMra^[I] := lDICOMra^[I]; if InputItems <> Items then begin Freemem(lDICOMra); Getmem(lDICOMra,Items*sizeof({TDICOM}DicomData)); end; for I := 1 to Items do lDICOMra^[I] := lTempDICOMra^[lPositionRA^[I]]; Freemem(lTempDICOMra); //finally, cleanup Freemem(lPositionRA); end; //ShellSortDCM const kTolerance = 0.0000095; //assume files are from different series if their orientation differs by more than this value //unfortunately, GE images have a rounding error, so nearby slices often have different values... function SameIDSeriesAcqXYZ( var ld1,ld2: DicomData{TDICOM};var lPrefs: TPrefs): boolean; var lStack: boolean; lI: integer; begin result := false; if (ld1.file4D) then //if previous file is a 4D image, we should convert it separately exit; if (ld1.DateTime = ld2.DateTime) and(ld1.SeriesNum = ld2.SeriesNum) {and (ld1.acquNum = ld2.acquNum)} and(ld1.XYZdim[1] = ld2.XYZdim[1]) and(ld1.XYZdim[2] = ld2.XYZdim[2]) and(ld1.XYZdim[3] = ld2.XYZdim[3]) then //result := true else exit; lStack := lPrefs.Stack3DImagesWithSameAcqNum; if (ld1.Vers0018_1020 >= lPrefs.SiemensDTIStackIf00181020atleast) then lStack := true; //recent Siemens scanners will have different NEx saved as different images and different directions saved as different images if (not lStack) and (ld1.acquNum <> ld2.acquNum) then begin msg('Images not stacked because acquisition number changes. If you want to stack these images set Stack3DImagesWithSameAcqNum=1 in your ini file.'); exit; end; (*if (ld1.PatientIDInt = ld2.PatientIDInt) and(ld1.SeriesNum = ld2.SeriesNum) and (ld1.acquNum = ld2.acquNum) and(ld1.XYZdim[1] = ld2.XYZdim[1]) and(ld1.XYZdim[2] = ld2.XYZdim[2]) and(ld1.XYZdim[3] = ld2.XYZdim[3]) then //result := true else exit;*) for lI := 1 to 6 do begin //if (ld1.orient[lI] <> ld2.orient[lI]) then if abs (ld1.orient[lI] - ld2.orient[lI]) > kTolerance then exit; end; if (ld1.IntenScale <> ld2.IntenScale) or (ld1.IntenIntercept <> ld2.IntenIntercept) then //if previous file is a 4D image, we should convert it separately exit; result := true; end; function ProcessSingleFolderDCM (var lInFilename: string; var lStringList : TStringList): boolean; //assumes lStringList is already created and will be freed later... var lSearchRec: TSearchRec; lPrev,lFilename,lFilepath,lMaskExt,lExt: string; begin result := false; lFilePath := ExtractFileDirWithPathDelim(lInFilename); lExt := string(StrUpper(PChar(ExtractFileExt(lInFilename)))); //.head if (lExt = '.PAR') or (lExt = '.REC') {or (lExt = '.HDR') or (lExt = '.IMG')or (lExt = '.HEAD') or (lExt = '.BRIK')} then {$IFDEF Unix} lMaskExt := '*'+ExtractFileExt(lInFilename) //Linux is case sensitive, these extensions are used by paired files: only read one of pair else lMaskExt := '*'; {$ELSE} lMaskExt := '*'+lExt //these extensions are used by paired files: only read one of pair else lMaskExt := '*.*'; {$ENDIF} //Msg('yyy'+lFilePath+'::'+lMaskExt); lPrev := '.'; Filemode := 0; //readonly if FindFirst(lFilePath{+PathDelim}+lMaskExt, faAnyFile-faSysFile-faDirectory, lSearchRec) = 0 then begin repeat if (length(lSearchRec.Name) < 1) then //do nothing lFilename := '' {$IFDEF Unix} //next two lines would not recognize filename that starts with dor, e.g. \home\cr\.filename.ima // else if (lSearchRec.Name[1] = '.') then // lFilename := '' else if (lSearchRec.Name = '..') then lFilename := '' else if (lSearchRec.Name = '.') then lFilename := '' {$ENDIF} else begin lFilename := lFilePath+lSearchRec.Name; if (lFilename = '') or (length (lFilename) > 255) then begin Msg('Unable to convert images where the file path and name exceed 255 characters.'); Msg('Solution: put images in a folder with a shorter path.'); Msg(lFilename); end else if (lFilename <> lPrev) then begin lStringList.Add(lFileName); //if lFilename = lPrev then // msg(lPrev); lPrev := lFilename; // msg(lFilePath+lMaskExt+' ->'+lSearchRec.Name+'z'+inttostr(lStringList.count)); end; end; until (FindNext(lSearchRec) <> 0); end; //some files found // msg('xxxx'+inttostr( lStringList.Count)); SysUtils.FindClose(lSearchRec); Filemode := 2; //readonly result := true; end; //ProcessSingleFolder procedure ProcessRecursiveFolder (var lFolderNameIn: string; var lStringList : TStringList; lDepth: integer; var lPrefs: TPrefs); var len: integer; lFolderName,lNewDir,lNewName,lFilename,lExt: String; lSearchRec: TSearchRec; begin lFolderName := lFolderNameIn; if not DirExists (lFolderName) then begin lFolderName := ExtractFileDir(lFolderName); end; if (length(lFolderName) > 1) and (lFolderName[length(lFolderName)] <> PathDelim) then lNewDir := lFolderName+PathDelim; if DirExists (lNewDir) then begin {$IFDEF UNIX} if FindFirst(lNewDir+'*',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ELSE} if FindFirst(lNewDir+'*.*',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ENDIF} lFilename := ''; repeat lNewName := lNewDir+lSearchRec.Name; if (lSearchRec.Name <> '.') and (lSearchRec.Name <> '..') then begin if DirExists(lNewName) then begin if lDepth < lPrefs.RecursiveFolderDepth then begin ProcessRecursiveFolder (lNewName, lStringList, lDepth+1, lPrefs); end; //exit;//4/4/2008 end else lFilename := lNewname; end; until (FindNext(lSearchRec) <> 0); end else begin //if directory exists... else we were passed a filename lFilename := lFolderName; end; if lFilename = '' then exit; //Msg('xxxx '+ lFilename); if lFilename <> '' then begin ProcessSingleFolderDCM (lFilename, lStringList); end; end; FindClose(lSearchRec); end; function LoadFileListInner (var lOutDirname: string; var lPrefs: TPrefs; var lStringList : TStringList): boolean; var lPrevDICOM,lDicomData: DicomData; lDICOMra: TDICOMrap; lRepeatLocations,lStartImg,lValidItems, lItems,lInc: integer; lError,lRepeatedValues,lHdrOK,lImgOK: boolean; lFilename,lDynStr: string; begin result := false; lItems := lStringList.Count; if lItems < 1 then begin lStringList.Free; exit; end; Filemode := 2; Msg('Validating '+inttostr(lItems)+' potential DICOM images.'); //START ANON if lPrefs.AnonymizeSourceDICOM then begin for lInc := 1 to lItems do begin lFilename := lStringList.Strings[lInc-1]; fast_read_dicom_data(lDICOMdata, 128, lFileName); //x3 faster! end; lStringList.Free; result := true; Exit; end; //if anonymizeSourceDICOM //END ANON getmem(lDICOMra,lItems*sizeof(DicomData)); lValidItems := 0; for lInc := 1 to lItems do begin lFilename := lStringList.Strings[lInc-1]; read_dicom_data(true,false{not verbose},true,true,true,true,false, lDICOMdata, lHdrOK, lImgOK, lDynStr,lFileName,lPrefs ); if (lHdrOK) and (lImgOK) then begin //valid file inc(lValidItems); lDICOMra^[lValidItems] := lDicomData; end; //if image is OK end; //for each item lStringList.Free; if lValidItems = 0 then begin Msg('Unable to find any DICOM files in the path '+lFileName); freemem(lDICOMra); exit; end; Msg('Found '+inttostr(lValidItems)+' DICOM images.'); ShellSortDCM (lValidItems,lDICOMra,lRepeatedValues); if lRepeatedValues then begin //separate into series Msg('Warning: repeated image indexes in the path '+lFileName); //freemem(lDICOMra); //exit; end; if lPrefs.DebugMode then begin for lInc := 1 to lValidItems do Msg( DICOMstr(lInc,lDICOMra)); exit; end; lStartImg := 1; lRepeatLocations := 0; lPrevDICOM := lDICOMra^[1]; for lInc := 1 to lValidItems do begin //msg(lDICOMra^[lInc].Filename+','+floattostr(lDICOMra^[lInc].PatientPosX)+','+floattostr(lDICOMra^[lInc].PatientPosY)+','+floattostr(lDICOMra^[lInc].PatientPosZ) ); if (lInc > 1) and (not SameIDSeriesAcqXYZ (lPrevDICOM ,lDICOMra^[lInc],lPrefs)) then begin //SameIDSeriesAcqXYZ2 (lPrevDICOM ,lDICOMra^[lInc]); Msg('Converting '+inttostr(lInc-1)+'/'+inttostr(lValidItems)+' '+inttostr(lRepeatLocations)); result := Dicom2NII(lDICOMra,lStartImg,lInc-1,lOutDirname,lPrefs,lRepeatLocations); if not result then lError := true; lPrevDICOM := lDICOMra^[lInc]; lStartImg := lInc; lRepeatLocations := 1; //end else if (lDICOMra^[lInc].location = lPrevDICOM.Location) then begin end else if (lDICOMra^[lInc].PatientPosX = lPrevDICOM.PatientPosX) and (lDICOMra^[lInc].PatientPosY = lPrevDICOM.PatientPosY) and (lDICOMra^[lInc].PatientPosZ = lPrevDICOM.PatientPosZ) then begin //fx(lRepeatLocations,lDICOMra^[lInc].location); inc(lRepeatLocations); end; end; //for each valid //Msg( inttostr(lValidItems-lStartImg+1)+' '+ inttostr(lRepeatLocations)); if (((lValidItems-lStartImg+1) mod lRepeatLocations) <> 0) then begin Msg('*Warning: Number of images in series ('+inttostr(lValidItems-lStartImg+1)+') not divisible by number of volumes ('+inttostr(lRepeatLocations)+')'); Msg('* Perhaps the selected folder only has some of the images'); PartialAcquisitionError; end; if (lPrevDICOM.SlicesPer3DVol > 0) and (not lPrevDICOM.file4D) and ((lValidItems div lRepeatLocations) <> lPrevDICOM.SlicesPer3DVol) then begin Msg('Warning: Number of slices per volume ('+inttostr((lValidItems div lRepeatLocations))+')appears different than reported in DICOM header ('+inttostr(lPrevDICOM.SlicesPer3DVol)+')'); Msg(' Perhaps the selected folder only has some of the images'); end; Msg('Converting '+inttostr(lValidItems)+'/'+inttostr(lValidItems)+' '+inttostr(lRepeatLocations)); Dicom2NII(lDICOMra,lStartImg,lValidItems,lOutDirname,lPrefs,lRepeatLocations); if lError then result := false //at least one error else result := true; freemem(lDICOMra); end; function ReportDICOMHeader (var lInFilename: string; var lPrefs: TPRefs): boolean; var lDicomData: DicomData; lDynStr: string; lHdrOK,lImgOK: boolean; begin read_dicom_data(false,true,false,false,false,false,false, lDICOMdata, lHdrOK, lImgOK, lDynStr,lInFileName,lPrefs ); result := lHdrOK; end; function LoadFileList (var lInFilename, lOutDirname: string; var lPrefs: TPrefs): boolean; var lStringList : TStringList; begin result := false; if lPrefs.Verbose then begin //msg(lInFilename); result := ReportDICOMHeader (lInFilename, lPrefs); exit; end; lStringList := TStringList.Create; if (lPrefs.OutDirMode <> kOutDirModeInput) and (DirExists(lPrefs.OutDir)) then begin //For kOutDirModePrompt one should set OutDir before getting here //This is required so recursive searches do not repetitively prompt the user... lOutDirName := lPrefs.OutDir; end; //1/2010 if lOutDirName = '' then begin if DirExists (lInFilename) then lOutDirName := lInFilename else lOutDirName := extractfiledir(lInFilename); end; if not(DirExists(lOutDirName)) then lOutDirName := UserDataFolder; if lPrefs.CollapseFolders then begin msg('Data will be exported to '+lOutDirname); ProcessRecursiveFolder (lInFilename, lStringList, 0, lPrefs); result := true; end else result := ProcessSingleFolderDCM (lInFilename, lStringList); if (not result) or (lStringList.Count < 1) then begin Msg('+Unable to find any images in the path '+lInFilename); lStringList.Free; end else result := LoadFileListInner (lOutDirName, lPrefs,lStringList) end; function LoadParamFileList (var lInFilename, lOutDirname: string; var lPrefs: TPrefs; lParamNum: integer): boolean; var lStringList : TStringList; lI : integer; begin result := false; if lPrefs.Verbose then begin result := ReportDICOMHeader (lInFilename, lPrefs); exit; end; lStringList := TStringList.Create; lStringList.Add(lInFilename); if ((lParamNum) < ParamCount) then for lI := (lParamNum+1) to ParamCount do lStringList.Add(Paramstr(lI)); msg('Only converting files explicitly specified'); result := LoadFileListInner (lOutDirName, lPrefs,lStringList) end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/SelectFolder.pas0000664000175000017500000000610411326434462022263 0ustar michaelmichaelunit SelectFolder; interface function BrowseForFolder(const browseTitle: String; const initialFolder: String = ''; mayCreateNewFolder: Boolean = False): String; function SelectDirectoryDelphi(const browseTitle: String; var Folder: String; mayCreateNewFolder: Boolean = False): boolean; implementation uses Windows, Forms, shlobj; function SelectDirectoryDelphi(const browseTitle: String; var Folder: String; mayCreateNewFolder: Boolean = False): boolean; var lTemp: string; begin result := false; lTemp := BrowseForFolder(browseTitle, Folder, mayCreateNewFolder); if (lTemp <> '') then begin Folder := lTemp; result := true; end; // end; var lg_StartFolder: String; // With later versions of Delphi you may not need these constants. const BIF_NEWDIALOGSTYLE=$40; BIF_NONEWFOLDERBUTTON=$200; //////////////////////////////////////////////////////////////////////// // Call back function used to set the initial browse directory. //////////////////////////////////////////////////////////////////////// function BrowseForFolderCallBack(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall; begin if uMsg = BFFM_INITIALIZED then SendMessage(Wnd,BFFM_SETSELECTION, 1, Integer(@lg_StartFolder[1])); result := 0; end; //////////////////////////////////////////////////////////////////////// // This function allows the user to browse for a folder // // Arguments:- // browseTitle : The title to display on the browse dialog. // initialFolder : Optional argument. Use to specify the folder // initially selected when the dialog opens. // mayCreateNewFolder : Flag indicating whether the user can create a // new folder. // // Returns: The empty string if no folder was selected (i.e. if the user // clicked cancel), otherwise the full folder path. //////////////////////////////////////////////////////////////////////// function BrowseForFolder(const browseTitle: String; const initialFolder: String =''; mayCreateNewFolder: Boolean = False): String; var browse_info: TBrowseInfo; folder: array[0..MAX_PATH] of char; find_context: PItemIDList; begin //-------------------------- // Initialise the structure. //-------------------------- FillChar(browse_info,SizeOf(browse_info),#0); lg_StartFolder := initialFolder; browse_info.pszDisplayName := @folder[0]; browse_info.lpszTitle := PChar(browseTitle); browse_info.ulFlags := BIF_RETURNONLYFSDIRS or BIF_NEWDIALOGSTYLE; if not mayCreateNewFolder then browse_info.ulFlags := browse_info.ulFlags or BIF_NONEWFOLDERBUTTON; browse_info.hwndOwner := Application.Handle; if initialFolder <> '' then browse_info.lpfn := BrowseForFolderCallBack; find_context := SHBrowseForFolder(browse_info); if Assigned(find_context) then begin if SHGetPathFromIDList(find_context,folder) then result := folder else result := ''; GlobalFreePtr(find_context); end else result := ''; end; end.mricron-0.20120505.1~dfsg.1.orig/dcm2nii/readint.pas0000664000175000017500000000226411326434462021341 0ustar michaelmichaelunit readint; interface uses {$IFDEF FPC}LResources,Buttons,{$ENDIF} {$IFNDEF UNIX} Windows,{$ENDIF} Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin,define_types; type TReadIntForm = class(TForm) ReadIntEdit: TSpinEdit; ReadIntLabel: TLabel; OKBtn: TButton; function GetInt(lStr: string; lMin,lDefault,lMax: integer): integer; procedure OKBtnClick(Sender: TObject); private { Private declarations } public { Public declarations } end; const gPassname: kStr20='NIH'; var ReadIntForm: TReadIntForm; implementation {$IFNDEF FPC}{$R *.DFM} {$ENDIF} function TReadIntForm.GetInt(lStr: string; lMin,lDefault,lMax: integer): integer; begin //result := lDefault; ReadIntLabel.caption := lStr+' ['+inttostr(lMin)+'..'+inttostr(lMax)+']'; ReadIntEdit.MinValue := lMin; ReadIntEdit.MaxValue := lMax; ReadIntEdit.Value := lDefault; ReadIntForm.ShowModal; result := ReadIntEdit.Value; end; procedure TReadIntForm.OKBtnClick(Sender: TObject); begin ReadIntForm.ModalResult := mrOK; end; {$IFDEF FPC} initialization {$I readint.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/readint.lrs0000664000175000017500000000176010577552602021362 0ustar michaelmichaelLazarusResources.Add('TReadIntForm','FORMDATA',[ 'TPF0'#12'TReadIntForm'#11'ReadIntForm'#4'Left'#3'2'#1#6'Height'#2'P'#3'Top'#3 +'*'#2#5'Width'#3#213#1#18'HorzScrollBar.Page'#3#212#1#18'VertScrollBar.Page' +#2'O'#13'ActiveControl'#7#11'ReadIntEdit'#11'BorderStyle'#7#8'bsDialog'#7'Ca' +'ption'#6#16'Integer required'#11'Font.Height'#2#245#9'Font.Name'#6#13'MS Sa' +'ns Serif'#8'OnCreate'#7#10'FormCreate'#8'Position'#7#14'poScreenCenter'#0#6 +'TLabel'#12'ReadIntLabel'#4'Left'#2#16#6'Height'#2#14#3'Top'#2#12#5'Width'#3 +'P'#1#9'Alignment'#7#14'taRightJustify'#8'AutoSize'#8#7'Caption'#6#14'Enter ' +'a number'#5'Color'#7#6'clNone'#11'ParentColor'#8#0#0#9'TSpinEdit'#11'ReadIn' +'tEdit'#4'Left'#3'h'#1#6'Height'#2#22#3'Top'#2#12#5'Width'#2']'#8'MaxValue'#2 +#0#8'TabOrder'#2#0#0#0#7'TButton'#5'OKBtn'#4'Left'#3'p'#1#6'Height'#2#25#3'T' +'op'#2','#5'Width'#2'K'#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#2'OK' +#7'OnClick'#7#10'OKBtnClick'#8'TabOrder'#2#1#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/dcm2nii/readint.dfm0000664000175000017500000000120410621124116021302 0ustar michaelmichaelџ TREADINTFORM0nTPF0 TReadIntForm ReadIntFormLeft9TopК BorderStylebsDialogCaptionInteger required ClientHeightI ClientWidthФColor clBtnFace Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Heightѕ Font.Name MS Sans Serif Font.Style OldCreateOrderPositionpoScreenCenter PixelsPerInch` TextHeight TLabel ReadIntLabelLeftTopWidthKHeight AlignmenttaRightJustifyCaptionEnter a number TSpinEdit ReadIntEditLefthTop WidthYHeightMaxValueMinValueTabOrderValueTButtonOKBtnLeftXTop(WidthKHeightCaptionOK ModalResultTabOrderOnClick OKBtnClickmricron-0.20120505.1~dfsg.1.orig/dcm2nii/pref_form.pas0000664000175000017500000001434511645567612021705 0ustar michaelmichaelunit pref_form; interface uses {$IFDEF FPC}LResources,{$ENDIF} {$IFDEF UNIX}Process, {$ELSE}ShellApi, Windows,{$ENDIF} Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,filename,define_types,dicomtypes,prefs, Spin, Buttons; type {$H+} { TPrefsForm } TPrefsForm = class(TForm) // WritePrefsOnQuit: TCheckBox; // TextEditorBtn: TButton; Stack3DImagesWithSameAcqNum: TCheckBox; OutputCombo: TComboBox; FilenameBox: TGroupBox; DateCheck: TCheckBox; OutDirLabel: TLabel; CollapseCheck: TCheckBox; SeriesCheck: TCheckBox; ProtocolCheck: TCheckBox; PatientNameCheck: TCheckBox; InputNameCheck: TCheckBox; NotAnonymizeCheck: TCheckBox; ReorientCheck: TCheckBox; OKBtn: TButton; CancelBtn: TButton; RecursiveSpin: TSpinEdit; Label1: TLabel; TextEditorBtn: TButton; WritePrefsOnQuit: TCheckBox; //Stack3DImagesWithSameAcqNum: TCheckBox; //CollapseCheck: TCheckBox; procedure FilenameChecks(Sender: TObject); procedure OutputComboMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ReadPrefs(var lPrefs: TPrefs); procedure TextEditorBtnClick(Sender: TObject); procedure WritePrefs(var lPrefs: TPrefs); procedure SetOutDirLabel; procedure OutputComboChange(Sender: TObject); procedure SetOutput; private { Private declarations } public { Public declarations } end; var PrefsForm: TPrefsForm; implementation {$IFNDEF FPC} {$R *.DFM} {$ENDIF} uses gui,userdir; var gPrefs: TPrefs; procedure TPrefsForm.SetOutDirLabel; begin OutDirLabel.visible := (OutputCombo.ItemIndex = kOutDirModeOutDir); end; procedure TPrefsForm.WritePrefs(var lPrefs: TPrefs); begin gPrefs := lPrefs; Stack3DImagesWithSameAcqNum.Checked := lPrefs.Stack3DImagesWithSameAcqNum; DateCheck.Checked := lPrefs.AppendDate; SeriesCheck.Checked := lPrefs.AppendAcqSeries; ProtocolCheck.Checked := lPrefs.AppendProtocolName; PatientNameCheck.Checked := lPrefs.AppendPatientName; InputNameCheck.checked := lPrefs.AppendFilename; CollapseCheck.checked := lPrefs.CollapseFolders; ReorientCheck.Checked := (lPrefs.MinReorientMatrix < 32000); NotAnonymizeCheck.Checked := not lPrefs.Anonymize; RecursiveSpin.Value := lPrefs.RecursiveFolderDepth; OutDirLabel.Caption := lPrefs.OutDir; if (lPrefs.OutDirMode < 0) or (lPrefs.OutDirMode >= OutputCombo.Items.count) then lPrefs.OutDirMode := 0; OutputCombo.ItemIndex := lPrefs.OutDirMode; SetOutDirLabel; end; procedure TPrefsForm.ReadPrefs(var lPrefs: TPrefs); begin lPrefs := gPrefs; lPrefs.Stack3DImagesWithSameAcqNum := Stack3DImagesWithSameAcqNum.checked; lPrefs.AppendDate := DateCheck.Checked; lPrefs.AppendAcqSeries := SeriesCheck.Checked; lPrefs.AppendProtocolName := ProtocolCheck.Checked; lPrefs.AppendPatientName := PatientNameCheck.Checked; lPrefs.AppendFilename := InputNameCheck.checked; //lPrefs.SaveToBaseFolder := SaveToBaseFolderCheck.Checked; lPrefs.CollapseFolders := CollapseCheck.checked; if ReorientCheck.Checked then begin if lPrefs.MinReorientMatrix = MaxInt then lPrefs.MinReorientMatrix := kMinReorientMatrix end else lPrefs.MinReorientMatrix := MaxInt; lPrefs.Anonymize := not NotAnonymizeCheck.Checked; lPrefs.RecursiveFolderDepth := RecursiveSpin.Value; lPrefs.OutDir := OutDirLabel.Caption; lPrefs.OutDirMode := OutputCombo.ItemIndex; lPrefs.WritePrefsOnQuit := WritePrefsOnQuit.Checked; end; procedure TPrefsForm.TextEditorBtnClick(Sender: TObject); {$IFDEF UNIX} var AProcess: TProcess; begin Showmessage('Preferences will be opened in a text editor. The program '+ExtractFilename(paramstr(0))+' will now quit, so that the file will not be overwritten.'); MainForm.SavePrefs; AProcess := TProcess.Create(nil); {$IFDEF UNIX} {$IFDEF Darwin} AProcess.CommandLine := 'open -a TextEdit '+IniName; {$ELSE} AProcess.CommandLine := 'open -a gedit '+IniName; {$ENDIF} {$ELSE} AProcess.CommandLine := 'notepad '+IniName; {$ENDIF} //AProcess.Options := AProcess.Options + [poWaitOnExit]; AProcess.Execute; AProcess.Free; WritePrefsOnQuit.checked := false; MainForm.close; end; {$ELSE} //ShellExecute(Handle,'open', 'c:\windows\notepad.exe','c:\SomeText.txt', nil, SW_SHOWNORMAL) ; begin Showmessage('Preferences will be opened in a text editor. The program '+ExtractFilename(paramstr(0))+' will now quit, so that the file will not be overwritten.'); MainForm.SavePrefs; ShellExecute(Handle,'open', 'notepad.exe',PAnsiChar(AnsiString(IniName)), nil, SW_SHOWNORMAL) ; WritePrefsOnQuit.checked := false; MainForm.close; end; {$ENDIF} procedure TPrefsForm.FilenameChecks(Sender: TObject); var lDICOMImgName: string; lDicomData: DICOMdata; lPrefs: TPrefs; begin Clear_Dicom_Data(lDicomData); SetDefaultPrefs (lPrefs); ReadPrefs(lPrefs); clear_dicom_data(lDicomData); lDICOMImgName:= 'IM_0160'; //lDicomData.StudyDate := '1/1/1970'; lDicomData.PatientName := 'JOHNDOE'; lDicomData.ProtocolName := 'AnatT1'; //FilenameBox.Caption := 'Output Filename ('+ OutputFilename(lDicomImgName,lDicomData,lPrefs.AppendDate,lPrefs.AppendAcqSeries,lPrefs.AppendProtocolName,lPrefs.AppendPatientName,lPrefs.FourD,lPrefs.AppendFilename)+')'; FilenameBox.Caption := 'Output Filename ('+ OutputFilename(lDicomImgName,lDicomData,lPrefs)+')'; end; procedure TPrefsForm.SetOutput; begin SetOutDirLabel; if not (OutputCombo.ItemIndex = kOutDirModeOutDir) then exit; OutDirLabel.Caption := GetDirPrompt(OutDirLabel.Caption); end; procedure TPrefsForm.OutputComboMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); //for OSX begin {$IFDEF Darwin} SetOutput; {$ENDIF} end; procedure TPrefsForm.OutputComboChange(Sender: TObject); //for all OSes except OSX... begin {$IFNDEF Darwin} SetOutput; {$ENDIF} end; initialization {$IFDEF FPC} {$I pref_form.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/pref_form.lrs0000664000175000017500000001027211636102264021701 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TPrefsForm','FORMDATA',[ 'TPF0'#10'TPrefsForm'#9'PrefsForm'#4'Left'#3#145#1#6'Height'#3#168#1#3'Top'#3 +#198#0#5'Width'#3#208#1#18'HorzScrollBar.Page'#3#207#1#18'VertScrollBar.Page' +#3'C'#1#13'ActiveControl'#7#9'DateCheck'#11'BorderIcons'#11#12'biSystemMenu' +#0#7'Caption'#6#11'Preferences'#12'ClientHeight'#3#168#1#11'ClientWidth'#3 +#208#1#21'Constraints.MaxHeight'#3#168#1#20'Constraints.MaxWidth'#3#208#1#21 +'Constraints.MinHeight'#3#133#1#20'Constraints.MinWidth'#3#208#1#8'Position' +#7#15'poDesktopCenter'#10'LCLVersion'#6#6'0.9.30'#0#6'TLabel'#6'Label1'#4'Le' +'ft'#3#129#0#6'Height'#2#17#3'Top'#3'#'#1#5'Width'#3#188#0#7'Caption'#6#29'R' +'ecursive folder search depth'#11'ParentColor'#8#0#0#6'TLabel'#11'OutDirLabe' +'l'#4'Left'#2'+'#6'Height'#2#17#3'Top'#3'`'#1#5'Width'#2#19#7'Caption'#6#3'c' +':\'#11'ParentColor'#8#0#0#9'TGroupBox'#11'FilenameBox'#4'Left'#2#8#6'Height' +#3#160#0#3'Top'#2#8#5'Width'#3#192#1#7'Caption'#6#15'Output Filename'#12'Cli' +'entHeight'#3#138#0#11'ClientWidth'#3#184#1#8'TabOrder'#2#0#0#9'TCheckBox'#9 +'DateCheck'#4'Left'#2#22#6'Height'#2#18#3'Top'#2#8#5'Width'#2'|'#7'Caption'#6 +#16'Acquisition Date'#8'OnChange'#7#14'FilenameChecks'#8'TabOrder'#2#0#0#0#9 +'TCheckBox'#14'InputNameCheck'#4'Left'#2#22#6'Height'#2#18#3'Top'#2'!'#5'Wid' +'th'#2'r'#7'Caption'#6#14'Input Filename'#8'OnChange'#7#14'FilenameChecks'#8 +'TabOrder'#2#1#0#0#9'TCheckBox'#13'ProtocolCheck'#4'Left'#2#22#6'Height'#2#18 +#3'Top'#2'9'#5'Width'#2'q'#7'Caption'#6#13'Protocol Name'#8'OnChange'#7#14'F' +'ilenameChecks'#8'TabOrder'#2#2#0#0#9'TCheckBox'#16'PatientNameCheck'#4'Left' +#2#22#6'Height'#2#18#3'Top'#2'Q'#5'Width'#2'h'#7'Caption'#6#12'Patient Name' +#8'OnChange'#7#14'FilenameChecks'#8'TabOrder'#2#3#0#0#9'TCheckBox'#11'Series' +'Check'#4'Left'#2#22#6'Height'#2#18#3'Top'#2'i'#5'Width'#3#132#0#7'Caption'#6 +#18'Acquisition Series'#8'OnChange'#7#14'FilenameChecks'#8'TabOrder'#2#4#0#0 +#0#7'TButton'#5'OKbtn'#4'Left'#3'h'#1#6'Height'#2#25#3'Top'#3#136#1#5'Width' +#2'K'#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#2'OK'#11'ModalResult'#2 +#1#8'TabOrder'#2#1#0#0#7'TButton'#9'CancelBtn'#4'Left'#3#16#1#6'Height'#2#25 +#3'Top'#3#136#1#5'Width'#2'K'#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6 +#6'Cancel'#11'ModalResult'#2#2#8'TabOrder'#2#2#0#0#9'TCheckBox'#17'NotAnonym' +'izeCheck'#4'Left'#2'#'#6'Height'#2#18#3'Top'#3#172#0#5'Width'#3#233#0#7'Cap' +'tion'#6'!Save patient name in NIfTI header'#8'TabOrder'#2#3#0#0#9'TCheckBox' +#13'ReorientCheck'#4'Left'#2'#'#6'Height'#2#18#3'Top'#3#202#0#5'Width'#3'R'#1 +#7'Caption'#6'1Reorient large images to nearest orthogonal plane'#8'TabOrder' +#2#4#0#0#9'TSpinEdit'#13'RecursiveSpin'#4'Left'#2'&'#6'Height'#2#16#3'Top'#3 +' '#1#5'Width'#2'M'#8'MaxValue'#2#10#8'TabOrder'#2#5#0#0#9'TComboBox'#11'Out' +'putCombo'#4'Left'#2'#'#6'Height'#2#20#3'Top'#3'@'#1#5'Width'#3#253#0#10'Ite' +'mHeight'#2#0#13'Items.Strings'#1#6#21'Save to source folder'#6#29'Prompt us' +'er for output folder'#6#17'Always save to...'#0#8'OnChange'#7#17'OutputComb' +'oChange'#9'OnMouseUp'#7#18'OutputComboMouseUp'#5'Style'#7#14'csDropDownList' +#8'TabOrder'#2#6#0#0#9'TCheckBox'#13'CollapseCheck'#4'Left'#2'#'#6'Height'#2 +#18#4'Hint'#6'_Sort images regardless of source directory. Slower, required ' +'if series segmented across folders'#3'Top'#3#232#0#5'Width'#2'z'#7'Caption' +#6#16'Collapse folders'#8'TabOrder'#2#7#0#0#9'TCheckBox'#27'Stack3DImagesWit' +'hSameAcqNum'#4'Left'#2'#'#6'Height'#2#18#4'Hint'#6'_Sort images regardless ' +'of source directory. Slower, required if series segmented across folders'#3 +'Top'#3#6#1#5'Width'#3'<'#1#7'Caption'#6'+Stack 3D images with same acquisti' +'on number'#8'TabOrder'#2#8#0#0#7'TButton'#13'TextEditorBtn'#4'Left'#2'&'#6 +'Height'#2#25#3'Top'#3#136#1#5'Width'#2'{'#25'BorderSpacing.InnerBorder'#2#4 +#7'Caption'#6#9'Text Edit'#7'OnClick'#7#18'TextEditorBtnClick'#8'TabOrder'#2 +#9#0#0#9'TCheckBox'#16'WritePrefsOnQuit'#4'Left'#3#28#1#6'Height'#2#18#3'Top' +#3#230#0#5'Width'#3#138#0#7'Caption'#6#19'Write prefs on quit'#7'Checked'#9#5 +'State'#7#9'cbChecked'#8'TabOrder'#2#10#7'Visible'#8#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/dcm2nii/pref_form.lfm0000664000175000017500000001000011636102264021644 0ustar michaelmichaelobject PrefsForm: TPrefsForm Left = 401 Height = 424 Top = 198 Width = 464 HorzScrollBar.Page = 463 VertScrollBar.Page = 323 ActiveControl = DateCheck BorderIcons = [biSystemMenu] Caption = 'Preferences' ClientHeight = 424 ClientWidth = 464 Constraints.MaxHeight = 424 Constraints.MaxWidth = 464 Constraints.MinHeight = 389 Constraints.MinWidth = 464 Position = poDesktopCenter LCLVersion = '0.9.30' object Label1: TLabel Left = 129 Height = 17 Top = 291 Width = 188 Caption = 'Recursive folder search depth' ParentColor = False end object OutDirLabel: TLabel Left = 43 Height = 17 Top = 352 Width = 19 Caption = 'c:\' ParentColor = False end object FilenameBox: TGroupBox Left = 8 Height = 160 Top = 8 Width = 448 Caption = 'Output Filename' ClientHeight = 138 ClientWidth = 440 TabOrder = 0 object DateCheck: TCheckBox Left = 22 Height = 18 Top = 8 Width = 124 Caption = 'Acquisition Date' OnChange = FilenameChecks TabOrder = 0 end object InputNameCheck: TCheckBox Left = 22 Height = 18 Top = 33 Width = 114 Caption = 'Input Filename' OnChange = FilenameChecks TabOrder = 1 end object ProtocolCheck: TCheckBox Left = 22 Height = 18 Top = 57 Width = 113 Caption = 'Protocol Name' OnChange = FilenameChecks TabOrder = 2 end object PatientNameCheck: TCheckBox Left = 22 Height = 18 Top = 81 Width = 104 Caption = 'Patient Name' OnChange = FilenameChecks TabOrder = 3 end object SeriesCheck: TCheckBox Left = 22 Height = 18 Top = 105 Width = 132 Caption = 'Acquisition Series' OnChange = FilenameChecks TabOrder = 4 end end object OKbtn: TButton Left = 360 Height = 25 Top = 392 Width = 75 BorderSpacing.InnerBorder = 4 Caption = 'OK' ModalResult = 1 TabOrder = 1 end object CancelBtn: TButton Left = 272 Height = 25 Top = 392 Width = 75 BorderSpacing.InnerBorder = 4 Caption = 'Cancel' ModalResult = 2 TabOrder = 2 end object NotAnonymizeCheck: TCheckBox Left = 35 Height = 18 Top = 172 Width = 233 Caption = 'Save patient name in NIfTI header' TabOrder = 3 end object ReorientCheck: TCheckBox Left = 35 Height = 18 Top = 202 Width = 338 Caption = 'Reorient large images to nearest orthogonal plane' TabOrder = 4 end object RecursiveSpin: TSpinEdit Left = 38 Height = 16 Top = 288 Width = 77 MaxValue = 10 TabOrder = 5 end object OutputCombo: TComboBox Left = 35 Height = 20 Top = 320 Width = 253 ItemHeight = 0 Items.Strings = ( 'Save to source folder' 'Prompt user for output folder' 'Always save to...' ) OnChange = OutputComboChange OnMouseUp = OutputComboMouseUp Style = csDropDownList TabOrder = 6 end object CollapseCheck: TCheckBox Left = 35 Height = 18 Hint = 'Sort images regardless of source directory. Slower, required if series segmented across folders' Top = 232 Width = 122 Caption = 'Collapse folders' TabOrder = 7 end object Stack3DImagesWithSameAcqNum: TCheckBox Left = 35 Height = 18 Hint = 'Sort images regardless of source directory. Slower, required if series segmented across folders' Top = 262 Width = 316 Caption = 'Stack 3D images with same acquistion number' TabOrder = 8 end object TextEditorBtn: TButton Left = 38 Height = 25 Top = 392 Width = 123 BorderSpacing.InnerBorder = 4 Caption = 'Text Edit' OnClick = TextEditorBtnClick TabOrder = 9 end object WritePrefsOnQuit: TCheckBox Left = 284 Height = 18 Top = 230 Width = 138 Caption = 'Write prefs on quit' Checked = True State = cbChecked TabOrder = 10 Visible = False end end mricron-0.20120505.1~dfsg.1.orig/dcm2nii/pref_form.dfm0000664000175000017500000000705611645576556021700 0ustar michaelmichaelџ TPREFSFORM0TPF0 TPrefsForm PrefsFormLeft!Topž BorderStylebsDialogCaptiondcm2nii Preferences ClientHeighta ClientWidth‰Color clBtnFace Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Heightѕ Font.Name MS Sans Serif Font.Style OldCreateOrderPositionpoScreenCenter PixelsPerInch` TextHeight TLabelLabel1LeftxTopмWidth•Height CaptionRecursive Folder Search DepthTLabel OutDirLabelLeft(TopWidth>Height Caption \home\folder TGroupBox FilenameBoxLeftTopWidthyHeightiCaptionOutput FilenameTabOrder TCheckBox DateCheckLeftTopWidthaHeightCaptionAcquisition DateTabOrderOnClickFilenameChecks TCheckBox SeriesCheckLeftTopPWidthHeightCaptionAcquisition SeriesTabOrderOnClickFilenameChecks TCheckBox ProtocolCheckLeftTop0WidthHeightCaption Protocol NameTabOrderOnClickFilenameChecks TCheckBoxPatientNameCheckLeftTop@WidthHeightCaption Patient NameTabOrderOnClickFilenameChecks TCheckBoxInputNameCheckLeftTop WidthHeightCaptionInput FilenameTabOrderOnClickFilenameChecks TCheckBoxNotAnonymizeCheckLeft TopxWidthбHeightHint€If checked, the patient name will be copied from the DICOM file to the NIfTI header. If unchecked, the image will be anonymized.Caption!Save Patient Name in NIfTI headerParentShowHintShowHint TabOrder TCheckBox ReorientCheckLeft TopWidthQHeightHint 'If checked, images with an image matrix greater than 255 will be reoriented to the axial plane. For example, an anatomical image with a 256x256 matrix will be resliced to appear in the axial plane. This allows the images to appear correctly oriented when viewed with FSLview, and can improve normalization with FSL. Images with matrix sizes smaller than 255 are not influenced: reorienting fMRI data (~64x64 matrices) can disrupt slice timing correction and reorienting DTI data (~128x128 matrices) can disrupt interpretation of the prinicple vectors.Caption1Reorient large images to nearest orthogonal planeParentShowHintShowHint TabOrderTButtonOKBtnLeft(Top@WidthKHeightCaptionOK ModalResultTabOrderTButton CancelBtnLeftШTop@WidthKHeightCaptionCancel ModalResultTabOrder TSpinEdit RecursiveSpinLeft TopиWidthQHeightHintСIf this is set to zero, only files directly in the selected folder will be converted. If set to two, then all the files in the selected folder, subfolders and sub-subfolders will be processed. MaxValue'MinValueParentShowHintShowHint TabOrderValue TComboBox OutputComboLeftTopњWidthТHeightStylecsDropDownList ItemHeight TabOrderOnChangeOutputComboChange Items.StringsSave to source folderPrompt user for output folderAlways save to ... TCheckBox CollapseCheckLeft TopЈWidthQHeightHint^If checked, all images are sorted regardless of folder (slower, but required for some systems)CaptionCollapse foldersParentShowHintShowHint TabOrder TCheckBoxStack3DImagesWithSameAcqNumLeft TopРWidthQHeightHint^If checked, all images are sorted regardless of folder (slower, but required for some systems)Caption+Stack 3D images with same acquistion numberParentShowHintShowHint TabOrderTButton TextEditorBtnLeft(Top@WidthHeightCaption Text Edit ModalResultTabOrder OnClickTextEditorBtnClick TCheckBoxWritePrefsOnQuitLeftРTop(WidthaHeightCaptionWritePrefsOnQuitChecked State cbCheckedTabOrder Visiblemricron-0.20120505.1~dfsg.1.orig/dcm2nii/prefs.pas0000664000175000017500000002341711636130430021025 0ustar michaelmichaelunit prefs; {$H+} {$Include ..\common\isgui.inc} interface uses {$IFDEF FPC} {$IFDEF UNIX} BaseUnix,{$ENDIF} {$IFDEF GUI}LResources, {$ENDIF} {$ELSE} SelectFolder, {$ENDIF} inifiles, define_types,SysUtils, userdir, dialogsx; type TPrefs = record WritePrefsOnQuit,OrthoFlipXDim,RecursiveUseNameAppend,AnonymizeSourceDICOM, ManualNIfTIConv,Anonymize, SingleNIIFile,Gzip,SPM2,VOI,enablereorient,createoutputfolder, AppendDate,AppendAcqSeries,AppendProtocolName,AppendPatientName,AppendFilename, everyfile,fourD,Swizzle4D,Stack3DImagesWithSameAcqNum,customRename, CollapseFolders,AutoCrop, UseGE_0021_104F, PhilipsPrecise,Verbose,DebugMode,DebugMode2,UntestedFeatures,UINT16toFLOAT32: boolean; SiemensDTIUse0019If00181020atleast, SiemensDTINoAngulationCorrectionIf00181020atleast, SiemensDTIStackIf00181020atleast, OutDirMode, MinReorientMatrix,MaxReorientMatrix,RecursiveFolderDepth : integer; OutDir, BackupDir,NameAppend: string; end; const kOutDirModeInput = 0;//save output files to source folder kOutDirModePrompt = 1;//prompt user to specify location of output dir kOutDirModeOutDir = 2;//save output to lPrefs.OutDir kMinReorientMatrix = 200; //reorient images with matrices > this value procedure SetOutputFormat (lItemIndex: integer; var lPrefs: TPrefs); procedure SetDefaultPrefs (var lPrefs: TPrefs); procedure CorrectPrefs (var lPrefs: TPrefs); //ensures only usable file types are created function IniFile(lRead: boolean; lFilename: string; var lPrefs: TPrefs): boolean; function DefaultOutputFormat (lPrefs: TPrefs): integer; implementation function DefaultOutputFormat (lPrefs: TPrefs): integer; begin if lPrefs.SPM2 then result := 0 //SPM2 3D hdr/img analyze else if not lPrefs.FourD then begin if not (lPrefs.SingleNIIFile) then result := 1 //SPM5 3D hdr/img else result:= 2; //SPM8 3D nii end else if not lPrefs.SingleNIIFile then result := 3 //?? 4D hdr/img else if not lPrefs.GZip then result := 4 //FSL 4D nii else result := 5; //FSL 4D nii.gz end; procedure SetOutputFormat (lItemIndex: integer; var lPrefs: TPrefs); //SetOutputFormat(n,lPrefs) : 0=SPM2,1=SPM5,2=spm8,3=4D hdr/img,4=fsl(default),5=fsl.gz, 6=.voi begin //next: options for reading; lPrefs.VOI := false; lPrefs.SPM2 := false; lPrefs.fourD := true; lPrefs.SingleNIIFile := true; lPrefs.GZip := false; case lItemIndex of 0: begin//spm2 lPrefs.SPM2 := true; lPrefs.fourD := false; lPrefs.SingleNIIFile := false; end; 1: begin//spm5 lPrefs.fourD := false; lPrefs.SingleNIIFile := false; end; 2: begin//spm8 lPrefs.fourD := false; end; 3: lPrefs.SingleNIIFile := false;//4D Hdr/Img 5: lPrefs.GZip := true;//FSL compressed 6: begin //VOI lPrefs.GZip := true;//FSL compressed lPrefs.VOI := true; end; end;//case end; procedure CorrectPrefs (var lPrefs: TPrefs); //ensures only usable file types are created begin if lPrefs.SingleNIIFile then lPrefs.SPM2 := false; //SPM2 only reads .hdr/.img - loses NIfTI information if not lPrefs.SingleNIIFile then lPrefs.Gzip := false; //nii.gz is OK, but img.gz is not end; procedure SetDefaultPrefs (var lPrefs: TPrefs); begin with lPrefs do begin OutDirMode := kOutDirModeInput; SiemensDTIUse0019If00181020atleast := 15; SiemensDTINoAngulationCorrectionIf00181020atleast := 1000; SiemensDTIStackIf00181020atleast := 15; //IgnoreDTIRotationsIf_0002_0013_atleast := 15; VOI := false; OutDir := UserDataFolder; PhilipsPrecise := false; UseGE_0021_104F := false; CollapseFolders := true; AutoCrop := false; //for dcm2nii - reorient and crop 3D nifti input images... CustomRename := false; createoutputfolder := false; Stack3DImagesWithSameAcqNum := false; RecursiveUseNameAppend := false;//changes paramstrs.pas recursive search to add top level folder name DebugMode := false; DebugMode2 := false; UntestedFeatures := false; Verbose := false; SingleNIIFile := true; Gzip := true; OrthoFlipXDim := false; SPM2 := false; Anonymize := true; AppendDate := true; AppendAcqSeries := true; AppendProtocolName := true; AppendPatientName := false; AppendFilename := false; EveryFile:=true; FourD := true; enablereorient := true; ManualNIfTIConv := true; AnonymizeSourceDICOM := false; Swizzle4D := true; RecursiveFolderDepth := 5; MinReorientMatrix := kMinReorientMatrix; MaxReorientMatrix := 1023; NameAppend := ''; BackupDir := ''; WritePrefsOnQuit := true; UINT16toFLOAT32 := true; end; end; procedure IniInt(lRead: boolean; lIniFile: TCustomIniFile; lIdent: string; var lValue: integer); //read or write an integer value to the initialization file var lStr: string; begin if not lRead then begin lIniFile.WriteString('INT',lIdent,IntToStr(lValue)); exit; end; lStr := lIniFile.ReadString('INT',lIdent, ''); if length(lStr) > 0 then lValue := StrToInt(lStr); end; //IniInt procedure IniBool(lRead: boolean; lIniFile: TCustomIniFile; lIdent: string; var lValue: boolean); //read or write a boolean value to the initialization file var lStr: string; begin if not lRead then begin lIniFile.WriteString('BOOL',lIdent,Bool2Char(lValue)); exit; end; lStr := lIniFile.ReadString('BOOL',lIdent, ''); if length(lStr) > 0 then lValue := Char2Bool(lStr[1]); end; //IniBool procedure IniStr(lRead: boolean; lIniFile: TCustomIniFile; lIdent: string; var lValue: string); //read or write a string value to the initialization file begin if not lRead then begin lIniFile.WriteString('STR',lIdent,lValue); exit; end; lValue := lIniFile.ReadString('STR',lIdent, ''); end; //IniStr function IniFile(lRead: boolean; lFilename: string; var lPrefs: TPrefs): boolean; //Read or write initialization variables to disk var lIniFile: TMemIniFile; begin result := false; if (lRead) and (not Fileexists(lFilename)) then exit; {$IFDEF UNIX} //Uses BaseUnix; if (lRead) and (fpAccess (lFilename,R_OK)<>0) then begin//ensure user has read-access to prefs file... msg('Unable to load preferences: no write access for '+lFilename); exit; end; {$ENDIF} if (lRead) then begin Filemode := 0; //Readonly msg('reading preferences file '+lFilename); end else Filemode := 2; //Read-Write //lIniFile := TIniFile.Create(lFilename); lIniFile := TMemIniFile.Create(lFilename); IniBool(lRead,lIniFile,'DebugMode',lPrefs.DebugMode); IniBool(lRead,lIniFile,'UntestedFeatures',lPrefs.UntestedFeatures); IniBool(lRead,lIniFile,'UINT16toFLOAT32',lPrefs.UINT16toFLOAT32); IniBool(lRead,lIniFile,'Verbose',lPrefs.Verbose); IniBool(lRead,lIniFile,'Anonymize',lPrefs.Anonymize); IniBool(lRead,lIniFile, 'AnonymizeSourceDICOM',lPrefs.AnonymizeSourceDICOM); IniBool(lRead,lIniFile,'AppendAcqSeries',lPrefs.AppendAcqSeries); IniBool(lRead,lIniFile,'AppendDate',lPrefs.AppendDate); IniBool(lRead,lIniFile,'AppendFilename',lPrefs.AppendFilename); IniBool(lRead,lIniFile,'AppendPatientName',lPrefs.AppendPatientName); IniBool(lRead,lIniFile,'AppendProtocolName',lPrefs.AppendProtocolName); IniBool(lRead,lIniFile,'AutoCrop',lPrefs.AutoCrop); IniBool(lRead,lIniFile,'CollapseFolders',lPrefs.CollapseFolders); IniBool(lRead,lIniFile,'createoutputfolder',lPrefs.createoutputfolder); IniBool(lRead,lIniFile,'CustomRename',lPrefs.CustomRename); IniBool(lRead,lIniFile,'enablereorient',lPrefs.enablereorient); IniBool(lRead,lIniFile,'OrthoFlipXDim',lPrefs.OrthoFlipXDim); IniBool(lRead,lIniFile,'EveryFile',lPrefs.EveryFile); IniBool(lRead,lIniFile,'fourD',lPrefs.fourD); IniBool(lRead,lIniFile,'Gzip',lPrefs.Gzip); IniBool(lRead,lIniFile,'ManualNIfTIConv',lPrefs.ManualNIfTIConv); IniBool(lRead,lIniFile,'PhilipsPrecise',lPrefs.PhilipsPrecise); IniBool(lRead,lIniFile,'RecursiveUseNameAppend',lPrefs.RecursiveUseNameAppend); IniBool(lRead,lIniFile,'SingleNIIFile',lPrefs.SingleNIIFile); IniBool(lRead,lIniFile,'SPM2',lPrefs.SPM2); IniBool(lRead,lIniFile,'Stack3DImagesWithSameAcqNum',lPrefs.Stack3DImagesWithSameAcqNum); IniBool(lRead,lIniFile,'Swizzle4D',lPrefs.Swizzle4D); IniBool(lRead,lIniFile,'UseGE_0021_104F',lPrefs.UseGE_0021_104F); IniInt(lRead,lIniFile,'MaxReorientMatrix',lPrefs.MaxReorientMatrix); IniInt(lRead,lIniFile,'MinReorientMatrix',lPrefs.MinReorientMatrix); IniInt(lRead,lIniFile,'RecursiveFolderDepth',lPrefs.RecursiveFolderDepth); IniInt(lRead,lIniFile,'OutDirMode',lPrefs.OutDirMode); IniInt(lRead,lIniFile,'SiemensDTIUse0019If00181020atleast',lPrefs.SiemensDTIUse0019If00181020atleast); IniInt(lRead,lIniFile,'SiemensDTINoAngulationCorrectionIf00181020atleast',lPrefs.SiemensDTINoAngulationCorrectionIf00181020atleast); IniInt(lRead,lIniFile,'SiemensDTIStackIf00181020atleast',lPrefs.SiemensDTIStackIf00181020atleast); lPrefs.BackupDir := lIniFile.ReadString('STR','BackupDir',lPrefs.BackupDir); IniStr(lRead,lIniFile,'OutDir',lPrefs.OutDir); if (lPrefs.OutDirMode < kOutDirModeInput) or (lPrefs.OutDirMode > kOutDirModeOutDir) then lPrefs.OutDirMode := kOutDirModeOutDir; if (lRead) and (not(DirExists(lPrefs.OutDir))) then lPrefs.OutDir := UserDataFolder; if not lRead then lIniFile.UpdateFile; lIniFile.Free; if (lRead) then Filemode := 2; //Read-write end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/PARtoNRRD_Philips_RelX.zip0000664000175000017500000004046211545100524024021 0ustar michaelmichaelPKgK-5\eДCFgpl.txt\]sлFВ}~Х”^,Uбкићq7ёVЊ(‰ВЙ+KZ’ВWo ’CkрХRјяя9н3€ЄœмMm611˜щя>нгШ?ќѕёіС|нŽ&Уsџpq3О4ј{t;%?ШќѕХV.+ ѓ~`ўожМћщЇwIb.ЫэЎЪžжЕ9Н<У§i Ьue­™–Ћњ%­ЌЙ.›b™жи``ЦХт|˜?sMZ|ЫГТLkЌЎц:[еks—e50ЅЋЙўѓаќјўнЛпОћуяЬУt˜˜бГ­v%ЈШœйкj“еЕ]šК4 cвbi–™ЋЋlодж`эGoј0Г.1хЪдkМ™g [8k–хЂйичcНYЌгт)+žLVsћЂЌMšчх‹]ž'‡ШуОВщfž[РЬж6ьфЬЊЌЬt8чпKыВЇB)Ќгoјё%н™]йTЩ Œ/Ы ŸИЕЌёB˜ЋЯЙиюЂЎRњjœ%ЪВ…­вмм7sмxF@nVдЖXъQOM за2п;ŠЯ’@ѓлЗXВ!ЎС2йС\+ŒB, б™ЦС6Ю)‰Ь%}вL -нnsŸ‡‹|DЖo%Ik%o\G‚…p“;SтЪlЋђЉJ7цe]rчІ^—•ƒ”6АЌLЇъIЇгrc§kЏYdЙE sјцЛ$ћЦ:0h^a,+\mгхљ™1eci!МюŒв"’ї;(А,Яi4_зЖ0/ыжІп( j dРG$ЈВ+[Uф№ња$“m…ѓСр]ѓeюРєК*MkEВNŸUСушИŽzЬ}цд›Nѕ$–ˆ;AHЯ8кd+nm^2З>ФЃРЫТfЯмЄЉмz ХT"А' WЋ“№"lьМЪ5оP{Цˆзa{4.”JnR˜ТО(НAюд†ТvпŠђ%юЛ,ЙЇуЮГэЬJОZлE­ž#Ю‰V л‘ee)ЉШщіЦ<[&АUF' гтщў퉄гЂн7}TR+§Жuеy2гwzЇРЃ]žжВљТVu †Бb‹‡й<ЫГ:ѓaˆ;ЋD“ЃэJr@ŠМј7х2[б|Eзx`M7л‹ќŠЃлЙfБ6i9dЕЖєКЊ3сXB†YYl$ч4O™З?XG†­ ‡aЅ•‚Ш•ndhЋчъeђюž9у•8и šZЧМ№4щXіТ$"n “РšM0$† йU џ–UIP }иГи=RX§жvы~6ЇяЮ$-i–ьKf™œО?ƒќрчоL:‰щeAЈ”‘“‡Й}‚›KТs’Œ}Цt5Œ=џ YHди=OЈцЂ.lJIєDИѕЌpW: Rƒo я .л„ЎЋёš‹ЊаhZ”xПbкЩ‘Т]/з@уО-ђ=!>“0Œп7–Їимi.иІˆЧ А }‰ЎkA зЋ ФМу )'–PIVЄљg(KЬ12ћFRiU.›…’!9„к…ur„цœЊЇ:{%>НС‚mSK‚QsЙцу|7CКс‰$еk dnœ…lOYжH!ТНЯ[>Ў™fawŒ­AžЫl)ч/+хљ+˜#œ3UЁЧФI&Вb™=gЫ†D™r.D‰p_ л\ˆЗIZЗлрŸHCЖNЋнЙšА š д,Ц#пЄKbГШmъ)„P|vž|U|cЂ‘U б6їr<%ЄШфВДšо+†IwПЇ\ PЭoѓЦua елХжDЭY!ВAh€Ур|ˆђЖ…П EГЭMйИ\OGЬ‘PлХ/[::ђ ˜ˆр‰ьЎJZOѓ‘Ч3БШгlЉ€шј?˜oжnщДю}Э…„EјУтИ Ею#ѓщмйЇ0•ЗИuТ5‚!лъАƒњЂƒ!+!Аљs’4/Ё]…mэjЈ*jI СЎЦ дЎwЮ‘{ЛVgеšžЄјnчwI=L,З>ТчˆŽ:№‹9їзP—Ь,–ѓОЕяdGхЊ:n0!bњШ–hdУŠFвтFЩ}5|*U;этL э§@шМ9’JІžЙwI:‡пБK˜№іЦZ5хТйNџ™20&=kk€Eк8- "d\eЙІЯd+‚toorВ‡c\Ÿ%ІШ[cŽю"а’Х–7<]uЎtЬшлЄтЖyA8оГ|e‹˜Юm^œхЉрЏЊŽi]~sšъШз^єŠ•=ф=ZП-WЌz€ 1"ѕЇЄ”BАgІ(ёЦЌZЦ]h@Џ!њ•§ХY@юQє!бА+•ЕKэЬHqРцT•2 !Юxцh`;%ЁŠ’6*ЁЉŠ)5DazMO^яl(1+RпgaŸzVšKњyЦUЮџУŽJш€C{‹І–xC@v$§&грqя„†їF@дk С€ 3яSка€Zј4\ %o‰V`ПQќ-З’ъ*э(KмР3 о2—“HХOm 2№>МЖгSјдTгgGь•ЗРnх&­2икBm‹9GСиˆpй!giє'Aмѓœц™n™хˆЮє]vЧИХЮІ•\гДU…р# ЛЧу@МЫвіГKMТ Н &?[ЈэзЕз$a•НьА/ёNŠоWNO‚ћ4џў>М.хфПаСт5ыЪ Š@#EЇdxъГ(HSџо-д+,ЂHѓ,ЭAKЁёЬЃgЋн•4 QFJTmнŽаE`вућ‘ОКЕ~лy…пˆOгhuЌЪ!—JЛ;fкЬCv˜Ћє=rщ]­к Ђ 1ЅE.U›˜9ЙˆWqОOл/Ь OЙН–šЁKД6фЂыыщ‰œЎG†л˜К№;iX*emб‚Т.oœ&Љsх" §0И@JУЗЋЌ Ђe–_ЏqИЪЖzЬ„„ќEт2п&иУўxžЧЄУw[ŽРх'(ў™B'ЖKмжŠЦmРВƒ~Кю"|ЬОЧЛ<Й4Ёг1mїЕSVэк-є;CFs)@ъщЌѕ„MњAXД гSхƒл\Ё‰c?ѓ&ШQ•жЌnчj@7щ11№іљgЁЉ6…рЁ9•xдžz•>s_zHђЋДайЋуМЋёm21tа—`w9кOc:N§EДXƒtЉ=Њ oТu„fRЙЗСѕИ-`T6УƒFpОKіiп{{@€G`Q6OыNlЯќ}Йі87[дLvyŒ„НnQGўдB‘ЖДYƒъOZш _Л Ѕ%5TЏ§uЫ6Ў”O>г‡hоA*МЪd{ FБ­8/ЫW§t†O^*Љ ЪEQк0 д>—1‰dдcявѓYItУ _"hЙŠБU;V"ŒpЧ.кe‚­гŒ—oal!‹PпЕ„‰чˆ–Xн0Pђ– џ[5Й–БРзІmџз7єС_Q ЛAЕлПљаЙМi(Ъ*ЙЁ[gѓŒВ€gцщKМКїuт!?КrKЩ‹щљNoХЄ[бУз{­ћSп^|ЕХ~І­о6.ЂешљЉoщіt\ ~х5ћaФшџsЋЇGђ“=!юU8~Юс/чz‹RgыёЩїўopЬѕБНч@ојY!o - ЗШўIYЕNмя$vnї]№n E5яВл†ОЬТќ„Oƒя[ЎšŠ‘#щM›јЌmЉП1БжєБеБkˆb-\чIп“ќxŠ‚$Жјџѕдz ПPъDcсcЏ ћŸs3^i^'S.я˜PДџЇY>I'O1JЇ8е ч@” Ч†E+ЏЯp{Рv9еЋцMцч §e5мЕБюltЌPААШQ Жsъ‡_Ш”Rр'€еr8Идg!MsЬnЂЭ„Ю{>"іЕѓОЬtСж'Я™ёѕwuоB:оь›еНŽ~щСИуШЬЫe›&‡›ZН*з-‘Cž<ЌlЃ~A”Ўh;ЉgЁKiОw^ѓ™џ@‰DоС0_ё=ч8–”э—z)›\qœЮ‡šЊмЁJиН•y‚Žsw`B8СOQo)38eМ^ѓ,KЄ…ч3’‹ј'T‘*Р‡В(‘Gъ ?юIcUAМs‰иYћPн<'Ыц †МOЏ˜Дb7H”ќђТuЎ|њQјзЕЭ ЄЕMЁNiфiъ•-шŒ‹&OiГjбlœDmpѓ4oCИэnп™BMД'nSТЂЮЅD}˜ž,д„’юБМ?ї:nлІ’vЄхЭ4>?ЫŸдыM;z"И8QJSнљц™tыТ”žoеiп Ћwкчк%вЫж•њ‡ЏS_аЛ…[ЧчЧhШєSхwфњўŒeOХŠљCЋў–бєI4Хou8#XџVђ˜1ŸEЖФњv'yтTмZЃŽ?&Vт/МРЏфД’d—IАv ]О$‘QDЯЫBœoH фTЫЂSВЅKђвпCmЖсp њУВ,TKdŸЅŒ•Ў%їЙЕи С Єї^Џ вшkƒ‘'R"T;-сУ Я„ˆзe&˜pЖч5]3•y8ЪSим—щІ_#Ю!ћЌ0З‡йJГЊk{Хн,їзѓpГЖпЅр˜IгцоЮэH;;СЫƒ0*eQ՘хkSšJkќsэkŠбwЋt б-9$bP”ТЫѕш8Ќ$ ЇЫЅvhаі“хђэZЎЯ{,v&^жє".б8YшXfZї_ЭК_h3Ї АA%Д‚аШб8€]2#z3ЕH5ЙvB10~ ц‰“xо!nЃ эEї8/—#ЂеŸЮe це)tJ*Œ^Tі9“Ћ[U9šŸѕћ —xнП2ŽЎ€ –о„‚Н)yыю!ОCЛD‚ЯлAЛлf•ŒЌk\…=бo§њe)ьфм^XZ˜X.^Їфˆm˜žlkЏdќQАЕпŒЊbw•нFЊ:nР4УbXQ4›Й­кйаPK/g%Ењокƒ:B#egšЮ'кЦnNiUa‡“A[ФIЦmы\~?†ЇУ„˜i‘ЈВђiТєŽ ЖqFц1‡олы Тю˜іЎШvq€Ѕ 0?МТвє85Ч>ЧаЙЅЯv ѓЇяЈp0|"ƒp~ЛЈЮпоѕчч‰олBк#Әтmd7Ь§†фїŽ{Э_?ШчхЦвЩ\"щ Ж]œvіŸh0‡‰мЅ…ЯƒЩ/[Z8.ўTІЙxЗј^ѕЬNQBNЃЃМxПэШOсуž–o–Ю 86e,йљб6,`|‰Џ|yyOg" ›s;КНУЩЃ™Ž&_Ц—”C2нЧ?Є'юrwЋБх§9•+}Ё <молЩшŸрчˆ%pсGX…йб{ђuŒУЉЁ}хфРйЦЗЂ”„ќŠ7'WСŸDЮцz8Оy˜иNОƒЙЅиZTH0Вщй@lРŒЏqдх'Џ=гѓкGѓ ЊИaй№ъۘ‘GЯIр гБ—ЩпСЫ1ЮєУKt§‘щ}ЌсŠO:"5”Zt&эД™ЄќјШx{ Ќу“œЃћФИD^ЭЫ-rГC:яТ+yS?Vс.ѓˆтŸфгW'Ј@ДIжȘ~ДАѓѕ6 ЖЄ#НfЁ˜'sБ"ЩъЄŸ 4Цou8•дkm žбaгxSš‡сcИа­ыдп7ЕШ(ђрЈMHD !—ЎШ)ŽooТb™эЃdњЦ_А№ZPис=К~|Ђѓ‚РЯVѓЅ`wчQZ;h,ѓ;мJіpkiЃЎ W§сO"8œ/|гЪlK)€xі‹Lё Ѓ^9€GВГbўїЃ<х§Кl?dѓxЌЦы)нzŽвceёS!XŠФZ'Т‘Н.{ŸQџcПрй‚I_0Я/zЎTЅёFкѕSџ‡алыkYСoћ]˜l„ŽzћЦИЪv=и'ѕ^ЧIэGњy8$ТдR/§Oћвg‡№љќИКїАО [sЄЇіr˜ nutVѕLШэŒA!Пˆ__ј{Biюц2.Ц9ГЙХ~š†pG–žZБйс;b^‰ЊƒЅЬržuЖеЛvнNQ˜юШїєЧ›1йЫпaЖВќРrЖў;pќ’§їѓѓУ-БIаaMƒАŒшG–ФЫ–ЃjUY€':з6ќGьЫrm|v|po:u"dјЈ$Ѕ(Ћ8а›gп4ž&2§ˆuŸœЬnншDжS},€БŸмџЫOƒ=ІC›О7МН@1с?^Lяn>nЛРљƒX…7Sя`тџ–W_оœЗŽБкь#щРц<‡rн ВƒџŽ*ЖBEіЁ{мтM—s[YяЖЌѓф–ЫФ‰я@Ÿапі>Кэ}Yв+#_§іьn%+ў.Є=O.Ž{œ;і7xу&їС(гЄСаљ№щ(iў;&эгK˜лdSbЫЗ P№Mњ[4˜нИЗoЫЅ–vMІїКёsџ‰gV&ѓј%В,Бˆ)хЏ†оу,В{cЋ3Цх‰cŸыMGЁгьМjЦъ6—1 њЯoNкЏTЩVIСЏф~ЌљЩOЉЇЂицH2B%яаLѕ[‹ЧrW.w…ѕž.—{ѓ]zЮшо<›Ъd“1іЃŒНlъХlпK†и[|і[‡-і“HFїlРSю%ў”э№8у Ы„эыЅy!ћ>ёDЬњ‘7ёЄŒф'Ч<Иg?%‚O`d?N3‘Э3^ћQNу”§ gзў=Х OR‘нГS*eШф˜ђ@ј"Ў ќо 3Щ„7йс.ыД;ыЏЫW2Ће§їеtотСњфШ‹ј&дЫІ!дNТ=рЎ—!ј‘Мсбв]oВЮКšэаЛ†Ъ@Œ…Oрyьg;Џ №ЭѓD|~Вл;лc?єOЯŽџ|ъHš“иQГџaН0•Ь АlЪ™?хў5 ПщEГTŽГ[/с ˜ХН”З+Гв|DњДцЖ40‹цiЦFœЩ˜ЃДёu,ocF’”qК]ŸyHž/AJ~ІI AвьvЪœОEo{}НЉџ_B[ŒУ[“Ф иX„8ЈаМ0„о„svу…sžMШeZ0ŒxхЫ€Г 87ЯdrѕС= xt•—yL&Œѕвz‚X ДѓF†ѓX“0 #ХчhФЩљЩрјtящCrѕхD+*8›rˆM‰—FюЛg}Zt6)ƒџ”"и}ЛA2уwYтБЧ6ѓА›ŒŠDFJzХj/XЇ\‹fsЦ^ФŽвр9Yцж-Dд`З"›"ра hш#ѕ2iEЬE‚•/ђ• BTЉяwIвВuљјŠY+d$Т’ыŽэ™Іzк{їLБœcўŽk™џеŠЇAЂX$ ЭS4ЩцГPzЪ 4œЏєa+H,иSд3дЋЪyТZ ЈB*4ˆО‘™NНЅ) d#0_ƒ g`Ўhф‡5щА5H?а;hTЗЬ ˆ}:ЗєG1 ищљЩЩAoзŽdЌwДЫі~юžьAћЩљйГБУєЩзZчPцhџ†/Ш5цБ@ г‘Щ=s!žЩ(B5ёPоBL^р1ƒЩЖ™ГГљс$‘ `лЧс€мƒоїoлner§,"sЖ`H€Љ;ž‡!ЮуjMч[фЂгh R#Фv{3ПrЗзlуlўPЄйG!>ъе щЙB4Z('…‰ЧAЁScхЙfhъшбcюћ<ѕ`•Ј щ| q  jƒо,‰ал‚B žмX•ЁЪИ$,НO3ЕиЉŒŒЋŒтЮфlzшФIЃŒ‹0LoAˆПхšЅf№7 Xfр;т s хЉ9a1p+RQј^Юa1<]ԘІаи%Д[Jh>^ЅЌ Єуs+ a’ФЊТ­< eyФˆБ.ЫЙŠПŠ1Ё7УРd|e&g,“)ZhŒс'‰ЩЂЩ-ЯДі‘йЉx&ЦШD1 |Ў6њпЄЪŽдF€$[ћh s%К4№њ‰˜eš@ZqАхО•(&/$pš":B›lІт?p$ШEHŽ–ЄdЂbђ34Ц]mЦАФI3Кhi:Щюg-4Ш„В@нˆ`Аї{тRћm"2ўnалХЎћR’7„ŒЌ;!?цiwН&@О`яЄмхeУt*Ці•ЛPИlрž žФt\ "‘s вY ЪЄ[аЬЖз[wЮГF$ьЛО^™ ЁяJ­lxг%ЇД…м&5ЊgїZ ЖqЫŘ-АrsGL…Щ/уAsЁЧ^:jтYр;љ3pш`R/еКпВ=8RAйЙrDFЋЫX:•ѓ0А X%"%ѓ8œšфGэнyhPЋї<]•7Ге)Xш№fУŠА7`LЖГМх#XЂRсп_KmКžЊ_I`вЉ†^ч<Йэrp‹ Аw&Оœ!ЫРє1Ÿrn г8]Ь)o6J Дч}$sEVњAЈW5ъш†0Zссv*С m л-˜АДJ[\_UZE’е@ётЉвJчГY(x@юѓЋ0aуMФ‡ уC•5‚іz“˜УКяВвдЙРŽk§! jН6WБЉ#hJ&&зIu\ŠSHuxьп“•Чї–_•M~?2Zф"3la Mр9`"%,)ЫšяDR§ЩЫжѓ’§унgцњяxІќІІ,lž^ОРе*Њ1ч‡vCbЎљŠж‹ЋvѓЊгФFи—]ТьƒЏYZ;Т9%ьЊ]џxќ^Еnс&<Є.DI“цkjЌM3ќ’8ŸТ>еŸтв["š}-Ає?š >Z…s6ш9ъ;JŒ]CџXоРШЯліїnЃQРтђЭ’Bзщ§мя0А56йУ( !ч™кvKŒp=6R жШ9HР&ыxїЂЭК—m@ы.6+Н4УHтц‹Еpbi6НfŸЗY IЇБЖ(ЛЅ!‡…БMЮ$п:€eљSp67k–VoїЧѓгГўбЛoОљf)CrЪžDиVЭR•ЬwŽЫeоyВЬЭёJ*R_DђћJНS/ѕŽ‘Кєl™ЗџUe^Oиr™Ÿіо=]цэх+ьНыŸЁасщSяBџ},НSoщ/”yї_Uцѕ„U—Њ#YuЅoіy{]Џ"ЇўHЦЋПђDЊг_@›Ь Ўц)™ЊjЬЬкr‚WиРьЂеA­)—ЌЄкєЊJнVЭPhо^ЗЃ3NЙќоlђBШФfЁsQ’ЧД‹$ЭО$Т<n‘Ў”|Ћ бЉBtЋн*DЧ@дЙукY;_aжvyжВCјk] kaVЂ+WI•‰<ФэK“6/П(LъяХIяь‡гГAЦ@LЅfœбЯБ˜ЬaџmЮЖЪg… ш‰ЧЃ“ВЉМХšfѓ@HМз† >KЄЯшo–№ЂђР ЛззN>Deє3/-mЋY№ŽИ@ŒpŒuŽŽŽh Q šяпа­Јv*їRћxВ>уЎйm“<Пm§/<5ЬЂбЇ…XС ф2‹шЉ<Ј;E_ž uРGўт˜›ї­юPЁ[пЂ.Е,,)фАašКFС]!` л€ГŠŸŒG3вOШ ]ZŠТж(mЧЯšНГtі?`ђюВЩџ€Й7jч~tЌ=ЋН-UšfВбќ‰жRю:4“Mќ ћ‡Ї.ШЏ9ŸБ –ч RXoŒѕ'd„аy!SчКMлСiг8–lь:+нжЦиiж/ЇSZЮ"ЊюгQuAЕёtT9*Э`у|Nм<@ЦIщs6ѕ2–№1Є'1ЫfжЭЕPIV^єŸœП•R%—юхњЮ.Р[ѓe{6ЊЎF•—;VЋ›иВ_Ў ДlhПБвFѕZЃZZ йЌЋ€\Ri#~chD_a7РБJqšeГЭЕЕ‰ ~aшЕЎеМзjZиЂOж>_щВШ5Sр0МхЃж4‹B{‚Зz‚ST—дh­§+0uЬЫ6эспщсš ŒѓЈ•Ъyтs=с­˜gkq’k YiњЊ†-lяˆ§АХK&0д ЏŠзŠRЅlіv}оHоpНхгAТ†ОpДъo:”™НЇОп0~BщЈ!ИУг№јXъ* |ЧЇ!ѓя№ Ni„Ѕч иk †щžУч иMa‘БB‹–ЪЗжцвІХJн*ƒПгLЬs)УЧМЁ2р?еЪЇ4,=WРкы NmЬ5 њR…lHЕыЭaез*tЧ^-m†K Ѕ–ъ˜Ў=FэKƒTSu”,№ЁЎ>IУкZЮVЦ(гЃђГъx­&'лмvђќЌ њжЃU27„/m{ЋƒОГi3+щ†K:M2Vн›aЕ• Ѓb<žShЭ)Ќ]Z6“C`тЁ№еќЏпЈЄŽщЄ!Ÿн%щCGх{ыТў[г}ЬFS9вЦM}Zф!Ељ‰œГS‘Ѕ8:Kp@;jEmъPпБёЉ&qћ?cи—2ЋžQNМцй›З–Иd”ОF~] Щš•Щ—’Ћк‘Ю\ЧкъъDбˆш~ЋШКшЏ”5Tа=Шe„uџO™И^D ЬˆачBNzЯ3GŸШ3ХФ'‰ Xџшlo€7ОћчG;X}Ъм@ЊzXШW'xњјDd/_фoЭъIpёT8Œш*pu0v€ѕчfыtœXшІИzHћtЭxЋЎбвC‹їŒОЧє3Ыи‘S’Іх‘w^чявќ R,Ч†Ž}>bыmъ`Ћь|Pіфb!*ІсT:T|~œЧЌ§Ц €”иW' Їšb+i­ŒC 6дЋЋњ5s:Ё^і€Їђо,aЗfШh>ьwьlа[;эН[л9шЋТЯќжSpЕaЬF—кƒ[ЫŸ›Й2ђGЫЧ* МpДФ6СЁ(ŠkRмRї$кУ]яš7^’6щРŸ.ЕŠъ №Н‡V2žv­Б7™“(-бфЬ›ьЋќћ‰ЦуЩq„Ѕ??m1ѕ2сЕОЗ‚юmеЉю?S*•ж0јЦ‰КxЅ‹Щл):’Яc.С9ЬЬвщЅ kТГ›ЕS^щChќнŽќšЎР‚WF>:КFдi"є'+" ЛётООъD№ђОКёћ›cОЏ0ЛžC~`=ЪЙАsГf§УоЛНвKЛ{ћ§Ѓ>=>ъьгЬY""ХЊКTхТ–.–™]вЭcЪћV;pПP"jTжP:†СЯ(єтk@*_ и˜Щ]mЗ7Еmj4˜Z%@їЊбŠxдXluГZqп|*@M$у–%cЅЗ",ъиЪH. И7aГŠЖ…м–зФьІГЙP™ ‚;DE .D†К›•C-‚ RЭВ{Це‰@pјGш†”Ў?ЈXчSУњж§„œJq…ЄƒЄ)АЗГ мj@ќ^; gk3†бп<птDu3T5Ъ Џ˜ wšж|MkЖЊЅеSmЊ8,{Ћ—gц•<ћ с‹zйг!зtYGіsПДL ;ŸфЄЎПЏ(KЄЂїШ›pэI­ЪRUШ_!€i >Й‚с #УX@jY2wc[е•˜v*DRѕˆдЯ4/5kўєБ§ЉщœєwіNЊЮтТёзшЋкђvћЃ™Ї–ЇrЋщ?§cвK -П гаыm!‹Mœ;*W‘bіЄз<ПЬЙ{ё‹Лйhї4…?DcЦѓHUOЩїќ/ЕК‘Дтbp FЉАЪдеВ#­Џ­h“эЊщЪœЉaеЊXЕЪ1гUTЌ—Іѓ(ЏPRЅњВЙхЈŒ[ЭшЧъБТ)Хв0Ќ[ н*бЈ8xЭT;’ЦY^J.Й] Bё0Р+[;Њ`UAl?ŒЫŽўєчwбƒзџщj‰йП‹‰ПHьЪbт/њŸЋšјw2і?a9ё—I§џ}=1ž•ьця•яуVIХШ5%Њ[ТкЫšr&PWz]ЈaЊрVЉ˜бJHАР†8\х& J/ИbдCFxє *`bМTЭˆvд0˜VЉ›~AБOЄѓXџT€ywЈ‚ёЈ!њ•nЊˆ6sЛf”•;б›паП9БЊ^‚R_eшbщMў 0k8?мc”?ГўюЯ—/_œvŠЏ’ИЁЫЦdvЛвm&е;Rjr:8sЏšэM*`6Yдвдl!wЃХSЯU~4(qгlР7Ж\јЊГdШ]ёьžЛэmhh8№pд0ж`~оxg—X ]Ћ‘0™Љ—мB@ufœ/ЏB Ь!­mЕg’ІuЋ ьQъh„"NˆЫ{лЧЯеюжозWЗ›ъїE Ъ}zXЃ_gЅ{яVЩ]ЊГwZ\&e8’w8P§(ŽИвG/‰,СŸЇА Р(~\Ўs­› џU eTz* ЪˆЎ~і&ђюёED”М—.ф“˜­ ЃхдŒkCЇŠџўўа нIџчНіОwpОwњМЙъGсd'ИMœ‰;ъŠ`ƒaA“эŸ@яDЃ~“G иŽX“эт@фJшну96 –1Нp+еЯNњP \Л бџЩŒ,>ƒОеKu‡>ŸeqŠ­aЭ 4‹˜_!ћCфШsЁћ[@ваќЋмBЬžyJёђў6‹>Џ"8F'TЪhч4…ŒэЏtА‰;3шП,ŸЊWЕKšt™K%a `яŸU]OЭ‘e†PhНІљјIЇxіСцдН~Ѕк SфћѕЋ‹мђнТљбOŽтЄе­<ВѕK ллэ†–s-мН*зФѕХЦУи:bУ љ9иКbУMVлg‘вЅЃIЪšсмSšŸ^™ЬЧt"s2ЗmйA‰дX ` Z Й€§s њeYЎV_H1ŒЏ(~Ч:0L•л5Щ Ѓyf ЪфpЪЖ|NЖœMљ{й |Ъ{lFЏqo6œЧЙЕˆНТ._‰evЧWfЁVїХшТЈђъQц-aŸIЗИgЅцљšLлу|[@[a[ާs њЏЬ.•зфЛ”'pъЛЛжп&’$ў§Єћњ 7Юо`H к\Xх ‘Вр3!{’…Fƒ=Nf糘Б№ЗoWѕЋњ53fїФrѓЛњ7ненѕшGUЏИЫцџСу•p[њ№ŠТ†xшЏј—_Wи$Б;ЄЌqТЁŽJдD† Ък.`§|ЧФ ˜А|xC4Ћ^kќщуоЇ4ЙРmъ[ƒdєѓB{\9Ќ2ƒСEУпЂїwІ GCЅяюš:hћ`Тqp3’Ev#ѕF$/„ћаИпwЧьs#ЛШUd %hсDхЎВк…в% ’ЊEЫюMѕkІёЌЋŒ’Ч]BєЙНkwћЫЧb'$.ށTс—š =KЯlёр[ЙA.7\ФўblГИгцŒ>z*”іћыpН‰‰u юb’!иР$ћGaикъ ьб=ЭWx,Gп““HЭЉш.Еђфяђю— &оRВЗx$E{эl;ЦШ8‰!{р’IЙc?Э] ’ђР–№Ёm˜Ћзu uЫ2sћLu№дp"ђџб‚Оˆž1№NUхDЕИ$0Ю“tђ†‹ущJ|€%Iќ ь6љ+8oљBќ1ЭыY™OХњ4Љј“‹4ј­”•ƒІ ‡Cбjў † Е,&ЎёŽъB…7кт9Є]ьЪ$Cјw$‚–1ыWг[ц= Б%дЇ ш=‰WЎ†l<Ццћ|сCйX\Ѕfu•+ЏQvnƒ”пDF „˜ОBѓОръnNІЫ{rТYHЈД2NŸqRЏZчOZДГ~Й™zѓet:оЂY—žО=ВyWб FК (ќ—'ј……QЌЫLа{Њсѕјп/-,Q>МоV$ќ>‚ЅЮVсIP‚kнцђАєх'ѕ„АˆQK?Ч РdЪкTаШ8]™S№‹ќ6&Зu3KEŸ!НѓŒlШ–Сїfѕ+\Hgч/'ђ$ZЪ"mлNž=,­sp9ЃE‰Mь[жp§TФъZZ hАŒd& Ѓ(І#ьj3юЌюu СŸCŸH;jЬђŒ`%CxавВk{ О.‹z‡уkяKЃ%~` Бц=УиqFgcrбн‚ІШ–yпDVњCШYз}pфfЫVFЁ­вsXр‘ЁуЂs(мaР^вЊшjVманGUд–Пгш;ЙJƒсLkпhvlfИїмгЦЖ@§дžХ]QЧїeƒxX4гECИИУlЧХЂGћ †0#ˆј8ЋwJ[­>ZUHЛРq@&ШЪйцЊ И ќš3[лФ0РР.ИЂтУbАџbУ>бхђ23Ѕ}dnFO…бm/—LЕd]къ7ЧЭ8x†ЄпЈДЗЧУ—'ŠдŽ.'ѕфщ+мП‹gѕ•nx Є_] ; wђ_У№BaEРчЫКЬў§uУ'тLМ№œИ9A€ˆR(fxйАNЬ­ŽМймƒOzeЇх.—wOёИйMЪ%šшUЇSЙPSНЙgyW\єЪтЎBЯќEBџЁc„Xьк2БUКPШo‹Kю9ХбӘт}S——œyн•ЃгтVЅЕЕѕ6Г}–^А~q Оъ^‚‘р‘Ёы2оPƒ˜_ ЃЄV—2ЭVыСЪКХCVѕГoзю0‹WеrМ .їЁЫхѕ’;ЫwЕГŒиЕbИ`<І5хОєDЬolDлЫє<ЬnD$ІˆЎЌ"†;ЪёЩ$В0ўћЇ=шІtЏЮЦчьх‰ШмтNŸm В› шєіг$}€Цгbђ{ЩœПџэь~­e\œ›іl•чƒЦЈ"БHwГN—ШЭ#М‡цœјz'ї2Бrpоx№ nМЫгВ"щЛП|2gЩц їрuˆ›ЁŽˆ‹yj.R:m*Иѕ^eЪџчѕщјј™Ь’уФ1xЙТ”„˜ЊТм?™8a(Zœ2нр”‘іІКЕ)W›e*5JoВCC‹ль^ˆa8MБч6EХ$жbЇKqѕ;ФjУ$yUеѕ-ї[aп]б0июѕRЧ$+Qќ„єWжmљфЭŽŽЋ­ Ю'ЦЯВЁ‰i\њЭ€‰ЪпіЉ; _ЧŸGDŒѓПhZŽўI9 IцфШкœ#йBОIЩ%D&Лиg#7?С№fSЌћтШЇ•|ЂТ+Š‘ЦTКœ9NЃwзegћaЊ:‚" %>&*+Vb–АЈљj-lстSЂCЉДJ3_•АŠiцЬм*Цп ­!œоХƒ”kЅ |ЛЌ8UѓkБИхГіb'Х ‡I'…уцсЫФus‘o‹ЉЅ,–ЬKЅЦЂdE—юd{М€C@rиЊgџc R@№‘œёдlq™мX5RV'ЗЩћЭ‹dЃ~]щУˆМ4*BНјшЅVp бж‘c:eOЏЊ ~_ьищќJ™т‰ќ4мSтХDQsк`žЮхХJ”Š,eђмЌ „ V8x’Ђз>{вѓf—+Џ ‘Пp†Hgє@ОЯст‹Ўѓа‹tfqx[БSтѕzŠ)Џ.ћћ{ƒV[lЋпСuyдІ.N™ƒИP„HЩS%‰а›QЉЌ~OЬUXЁtJy-†ПРu:ў9^jUŽŒВ‹hосВ шхœѕw&фгцЂТПwиЅЬ9БvЮTˆпе_й|‘_J'\^Д#Ў•эtrЌr\љ,Ќц=эPхЮVG=)ђMдЙAUJ3ТъEvЕьеѕšЋдіZPЇєP%§юnоЈЎЖD^з§Ч†~+фzжљЌ˜s`Жђbжй-оЮŸ+“М­=9RЫ@№ЅR9їE: ЙжЎ~ї“ qУd%ГxT>/Ъ\­ъНфђ>“Т4.ЯCuР>Н+јпўюёYїЛ MŸwŸХцЎ;ЧCЏ>yо§jCSшxЛr5k3В4•ƒЄ”Уb˜Тjд6Нщ[™j% И4э4С8bj‚cћE[щ–jQX+аk`žс’=д€ЬЉˆ˜ѓgTˆ3i [PAiЙPъMЫХŒ1сёŒє`БХ,ТёАЬiС’1@њїE€—аЭ:]зi=ƒоXЬzѕ†­xлКBQІ )лxkЙђkчб”1”­ЦЈл*`ЪеиU!ѓ[|t™тіЫќbŸZBvCЖгŒФўиf#сЉLŸoЬ,cЭИv9ьВoeІEќ^K"™•ЯдCоq;o‚ы–ЦЕ4VАiU"ZЉšœјв=БliНЮ.ЂС”o…c0K—Ё]ЮіlіИЋйgпNГ‰ішjі‹_ЛйbІ™йJоYNНШr@ ˆ;{HSЧ]ЦйНšWCыЂbšА{2šiз’ЅЕаЌYnЖ/йcvG†jиїtьŸl—ННџ- Иyјѓi\:N`UБ&Ї|фhfTѕжЩ|КVЬK˜. ?$ШјуџЬ9Ы`mPОйsНXЁжФƒми}DиБћp{~|v|!ФFB ћіїОQA.ыЧ Кыёџ27Ж Ю>бџfN|;|јгц„jљ_jЅvKn›E9 >~ёLЂ~:>?Сq:|Ж$ўPKgK-5\eДCF gpl.txtPKМЅe5.œP"’%Еš йPARtoNRRD_Philips_RelX.mPK{Ё@mricron-0.20120505.1~dfsg.1.orig/dcm2nii/parconvert.pas0000664000175000017500000014613611615747414022112 0ustar michaelmichaelunit parconvert; {$H+} interface uses {$IFDEF FPC}gzio2, {$ENDIF} define_types,SysUtils,dicom,dicomtypes,filename,nii_4dto3d,niftiutil,nii_orient, nii_crop,GraphicsMathLibrary,prefs; function LoadFileListPARREC (var lInFilename, lOutDir: string; var lPrefs: TPrefs): boolean; implementation uses dialogsx; procedure PAR2DICOMstudyDate(var lDicomData: DICOMdata); {input: lDicomData.StudyDate = 2002.12.29 / 19:48:58.0000 output: StudyDate = YYYYMMDD StudyTime= hhmmss } var I: integer; lStr: string; begin if length(lDicomData.StudyDate) < 14 then exit; lStr := ''; for I := 1 to length(lDicomData.StudyDate) do if lDicomData.StudyDate[I] in ['0'..'9'] then lStr := lStr+ lDicomData.StudyDate[I]; if length(lStr) < 14 then exit; lDicomData.StudyDate := ''; for I := 1 to 8 do lDicomData.StudyDate := lDicomData.StudyDate+lStr[I]; lDicomData.StudyTime := ''; for I := 9 to 14 do lDicomData.StudyTime := lDicomData.StudyTime+lStr[I]; lDicomData.DateTime := StudyDateTime(lDicomData.StudyDate,lDicomData.StudyTime); end; procedure ShellSortItems (first, last: integer; var lPositionRA: longintp; lIndexRA: int64P; var lRepeatedValues: boolean); {Shell sort chuck uses this- see 'Numerical Recipes in C' for similar sorts.} label 555; const tiny = 1.0e-5; aln2i = 1.442695022; var n,t, nn, m, lognb2, l, k, j, i: longint; begin lRepeatedValues := false; n := abs(last - first + 1); lognb2 := trunc(ln(n) * aln2i + tiny); m := last; for nn := 1 to lognb2 do begin m := m div 2; k := last - m; for j := 1 to k do begin i := j; 555: {<- LABEL} l := i + m; if (lIndexRA^[lPositionRA^[l]] = lIndexRA^[lPositionRA^[i]]) then begin lRepeatedValues := true; exit; end; if (lIndexRA^[lPositionRA^[l]] < lIndexRA^[lPositionRA^[i]]) then begin //swap values for i and l t := lPositionRA^[i]; lPositionRA^[i] := lPositionRA^[l]; lPositionRA^[l] := t; i := i - m; if (i >= 1) then goto 555; end end end end; //shellsort is fast and requires less memory than quicksort function SinDeg(lDeg: double): double; begin result := sin(lDeg*PI/180); end; function CosDeg(lDeg: double): double; begin result := Cos(lDeg*PI/180); end; FUNCTION Matrix3DL (CONST m11,m12,m13, m21,m22,m23, m31,m32,m33: DOUBLE): TMatrix; BEGIN WITH RESULT DO BEGIN matrix[1,1] := m11; matrix[1,2] := m12; matrix[1,3] := m13; matrix[1,4] := 0; matrix[2,1] := m21; matrix[2,2] := m22; matrix[2,3] := m23; matrix[2,4] := 0; matrix[3,1] := m31; matrix[3,2] := m32; matrix[3,3] := m33; matrix[3,4] := 0; matrix[4,1] := 0; matrix[4,2] := 0; matrix[4,3] := 0; matrix[4,4] := 1; size := size3D END END {Matrix3D}; // 'Defuzz' is used for comparisons and to avoid propagation of 'fuzzy', // nearly-zero values. DOUBLE calculations often result in 'fuzzy' values. // The term 'fuzz' was adapted from the APL language. (* FUNCTION Defuzz(CONST x: DOUBLE): DOUBLE; BEGIN IF ABS(x) < fuzz THEN RESULT := 0.0 ELSE RESULT := x END {Defuzz}; *) FUNCTION MultiplyMatrices (CONST a,b: TMatrix): TMatrix; VAR i,j,k: TIndex; temp : DOUBLE; BEGIN RESULT.size := a.size; IF a.size = b.size THEN FOR i := 1 TO a.size DO BEGIN FOR j := 1 TO a.size DO BEGIN temp := 0.0; FOR k := 1 TO a.size DO BEGIN temp := temp + a.matrix[i,k]*b.matrix[k,j]; END; RESULT.matrix[i,j] := Defuzz(temp) END END ELSE Msg('MultiplyMatrices error: '+inttostr(a.size)+' <> '+inttostr(b.size)) END {MultiplyMatrices}; function RealToStr(lR: double {was extended}; lDec: integer): string; begin RealTOStr := FloatToStrF(lR, ffFixed,7,lDec); end; procedure ReportMatrix (lStr: string;lM:TMatrix); begin Msg(lStr); Msg( RealToStr(lM.matrix[1,1],6)+','+RealToStr(lM.matrix[1,2],6)+','+RealToStr(lM.matrix[1,3],6)+','+RealToStr(lM.matrix[1,4],6)); Msg( RealToStr(lM.matrix[2,1],6)+','+RealToStr(lM.matrix[2,2],6)+','+RealToStr(lM.matrix[2,3],6)+','+RealToStr(lM.matrix[2,4],6)); Msg( RealToStr(lM.matrix[3,1],6)+','+RealToStr(lM.matrix[3,2],6)+','+RealToStr(lM.matrix[3,3],6)+','+RealToStr(lM.matrix[3,4],6)); Msg( RealToStr(lM.matrix[4,1],6)+','+RealToStr(lM.matrix[4,2],6)+','+RealToStr(lM.matrix[4,3],6)+','+RealToStr(lM.matrix[4,4],6)); end; FUNCTION Diag3D (CONST m1,m2,m3,m4: DOUBLE): TMatrix; BEGIN WITH RESULT DO BEGIN matrix[1,1] := m1; matrix[1,2] := 0; matrix[1,3] := 0; matrix[1,4] := 0; matrix[2,1] := 0; matrix[2,2] := m2; matrix[2,3] := 0; matrix[2,4] := 0; matrix[3,1] := 0; matrix[3,2] := 0; matrix[3,3] := m3; matrix[3,4] := 0; matrix[4,1] := 0; matrix[4,2] := 0; matrix[4,3] := 0; matrix[4,4] := m4; size := size3D END END {Diag3D}; FUNCTION Matrix3D (CONST m11,m12,m13,m14, m21,m22,m23,m24, m31,m32,m33,m34, m41,m42,m43,m44: DOUBLE): TMatrix; BEGIN WITH RESULT DO BEGIN matrix[1,1] := m11; matrix[1,2] := m12; matrix[1,3] := m13; matrix[1,4] := m14; matrix[2,1] := m21; matrix[2,2] := m22; matrix[2,3] := m23; matrix[2,4] := m24; matrix[3,1] := m31; matrix[3,2] := m32; matrix[3,3] := m33; matrix[3,4] := m34; matrix[4,1] := m41; matrix[4,2] := m42; matrix[4,3] := m43; matrix[4,4] := m44; size := size3D END END {Matrix3D}; function mat44_inverse(var R: Tmatrix ) : TMatrix; var r11,r12,r13,r21,r22,r23,r31,r32,r33,v1,v2,v3 , deti : double; Q: TMatrix; begin r11 := R.matrix[1,1]; r12 := R.matrix[1,2]; r13 := R.matrix[1,3]; //* [ r11 r12 r13 v1 ] */ r21 := R.matrix[2,1]; r22 := R.matrix[2,2]; r23 := R.matrix[2,3]; //* [ r21 r22 r23 v2 ] */ r31 := R.matrix[3,1]; r32 := R.matrix[3,2]; r33 := R.matrix[3,3]; //* [ r31 r32 r33 v3 ] */ v1 := R.matrix[1,4]; v2 := R.matrix[2,4]; v3 := R.matrix[3,4]; //* [ 0 0 0 1 ] */ deti := r11*r22*r33-r11*r32*r23-r21*r12*r33 +r21*r32*r13+r31*r12*r23-r31*r22*r13 ; if( deti <> 0.0 ) then deti := 1.0 / deti ; Q.matrix[1,1] := deti*( r22*r33-r32*r23) ; Q.matrix[1,2] := deti*(-r12*r33+r32*r13) ; Q.matrix[1,3] := deti*( r12*r23-r22*r13) ; Q.matrix[1,4] := deti*(-r12*r23*v3+r12*v2*r33+r22*r13*v3 -r22*v1*r33-r32*r13*v2+r32*v1*r23) ; Q.matrix[2,1] := deti*(-r21*r33+r31*r23) ; Q.matrix[2,2] := deti*( r11*r33-r31*r13) ; Q.matrix[2,3] := deti*(-r11*r23+r21*r13) ; Q.matrix[2,4] := deti*( r11*r23*v3-r11*v2*r33-r21*r13*v3 +r21*v1*r33+r31*r13*v2-r31*v1*r23) ; Q.matrix[3,1] := deti*( r21*r32-r31*r22) ; Q.matrix[3,2] := deti*(-r11*r32+r31*r12) ; Q.matrix[3,3] := deti*( r11*r22-r21*r12) ; Q.matrix[3,4] := deti*(-r11*r22*v3+r11*r32*v2+r21*r12*v3 -r21*r32*v1-r31*r12*v2+r31*r22*v1) ; Q.matrix[4,1] := 0; Q.matrix[4,2] := 0; Q.matrix[4,3] := 0.0 ; Q.matrix[4,4] := 1;// (deti == 0.0l) ? 0.0l : 1.0l ; /* failure flag if deti == 0 */ result := Q ; end; procedure SetLarger (var lA,lB: double); begin if lA > lB then lB := lA else lA := lB; end; procedure matx(var lNHdr: TNiftiHdr; var lDICOMdata: DICOMdata; b,c,a,{b,c,a,}offa,offb,offc,lx,ly,lz,lAPFOV,lFHFOV,lRLFOV: single; lOrient: integer); var lxmm,lymm,lzmm,x,y,z,la,lb,lc: double; dx,dy,dz: single; analyze_to_dicom,base,ra,rb,rc,lmm,patient_to_tal,lZm:TMatrix; begin lNHdr.sform_code := kNIFTI_XFORM_UNKNOWN; if (lZ < 1) or (lY < 1) or (lX < 1) then exit; {a=angle(3,1); b=angle(1,1); c=angle(2,1);} ra := Matrix3DL(1, 0, 0, 0, cos(a*pi/180), -sin(a*pi/180), 0, sin(a*pi/180), cos(a*pi/180)); rb := Matrix3DL(cos(b*pi/180), 0, sin(b*pi/180), 0, 1, 0, -sin(b*pi/180), 0, cos(b*pi/180)); rc := Matrix3DL(cos(c*pi/180), -sin(c*pi/180), 0, sin(c*pi/180), cos(c*pi/180), 0, 0, 0, 1); base.size := size3D; base := MultiplyMatrices(rb,rc); base := MultiplyMatrices(ra,base); if lOrient = 2 then begin //sagittal //Msg('sag'); lmm := Matrix3D ( 0, 0, -1,0, 1, 0, 0, 0, 0, -1, 0,0, 0, 0, 0, 1); lYmm := lAPFOV /lX; lZmm := lFHFOV / lY; //use smallest in plane resolution... SetLarger (lYmm,lZmm); lXmm := lRLFOV /lZ; end else if lOrient = 3 then begin //coronal //Msg('Coronal'); lmm := Matrix3D ( 1, 0, 0,0, 0,0, 1, 0, 0, -1, 0,0, 0, 0, 0, 1); lXmm := lRLFOV /lX; lZmm := lFHFOV / lY; //use smallest in plane resolution... SetLarger (lXmm,lZmm); lYmm := lAPFOV /lZ; end else begin //Msg('Axial '+inttostr(lOrient)); lmm := diag3D(1, 1, 1,1); lXmm := lRLFOV /lX; lYmm := lAPFOV /lY; //use smallest in plane resolution... SetLarger (lXmm,lYmm); lZmm := lFHFOV / lZ; end; lZm := Matrix3D (lxmm,0,0,0, 0,lymm,0,0, 0,0,lZmm,0, 0,0,0,1); patient_to_tal := diag3D(-1, -1, 1,1); analyze_to_dicom := Matrix3D ( 1, 0, 0,0, 0,-1, 0,0, 0, 0, 1,0, 0, 0, 0, 1); //correct- A_tot=patient_to_tal*R_tot*Zm*lmm*analyze_to_dicom; //wrong - A_tot=patient_to_tal*Zm*R_tot*lmm*analyze_to_dicom; {ReportMatrix('Rtot',base); ReportMatrix('zoom',lZm); ReportMatrix('p2tal',patient_to_tal); ReportMatrix('lmm',lmm); ReportMatrix('analyze_to_dicom',analyze_to_dicom);} base := MultiplyMatrices(patient_to_tal,base); base := MultiplyMatrices(base,lZm); base := MultiplyMatrices(base,lmm);//2/2007 suggested by Bas Neggers base:= MultiplyMatrices(base,analyze_to_dicom); x := (lx-1)/2; y := (ly-2)/2; z := (lz-1)/2; la :=(base.matrix[1,1]*x)+(base.matrix[1,2]*y)+(base.matrix[1,3]*z)+base.matrix[1,4]; lb :=(base.matrix[2,1]*x)+(base.matrix[2,2]*y)+(base.matrix[2,3]*z)+base.matrix[2,4]; lc :=(base.matrix[3,1]*x)+(base.matrix[3,2]*y)+(base.matrix[3,3]*z)+base.matrix[3,4]; base.matrix[1,4] := -la-offa; base.matrix[2,4] := -lb-offb; base.matrix[3,4] := -lC+offc; //ReportMatrix('nifti final',base); lNHdr.sform_code := kNIFTI_XFORM_SCANNER_ANAT; lNHdr.srow_x[0] := base.matrix[1,1]; lNHdr.srow_x[1] := base.matrix[1,2]; lNHdr.srow_x[2] := base.matrix[1,3]; lNHdr.srow_x[3] := base.matrix[1,4]; lNHdr.srow_y[0] := base.matrix[2,1]; lNHdr.srow_y[1] := base.matrix[2,2]; lNHdr.srow_y[2] := base.matrix[2,3]; lNHdr.srow_y[3] := base.matrix[2,4]; lNHdr.srow_z[0] := base.matrix[3,1]; lNHdr.srow_z[1] := base.matrix[3,2]; lNHdr.srow_z[2] := base.matrix[3,3]; lNHdr.srow_z[3] := base.matrix[3,4]; lNHdr.qform_code := kNIFTI_XFORM_SCANNER_ANAT; nifti_mat44_to_quatern( base, lNHdr.quatern_b,lNHdr.quatern_c,lNHdr.quatern_d, lNHdr.qoffset_x,lNHdr.qoffset_y,lNHdr.qoffset_z, dx, dy, dz, lNHdr.pixdim[0]{QFac}); end; procedure read_PAR2NII(var lNHdr: TNIftIHdr; var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK,lPrecise:boolean; var lDynStr: string;var lFileName: string; lReadOffsetTables: boolean; var lOffset_pos_table: LongIntp; var lOffsetTableEntries,lRescaleEntries: integer; var lSlopeRA,lInterceptRA: Singlep; var lnum4Ddatasets: integer); label 333; //1384 now reads up to 8 dimensional data.... type tRange = record Min,Val,Max: double; //some vals are ints, others floats end; const UNIXeoln = chr(10); kMaxnSLices = 18000;//delphi 32000 - lazarus fails >15000 kXdim = 1; kYdim = 2; kBitsPerVoxel = 3; kSliceThick = 4; kSliceGap = 5; kXmm = 6; kYmm = 7; kRS = 8; kRI = 9; kSS = 10; //1393 - attempt to use calibrated values kDynTime = 11; kSlice = 12; kEcho = 13; kDyn = 14; kCardiac = 15; kType = 16; kSequence = 17; kASL = 18; kIndex = 19; lIsParVers3: boolean = true; lIsParVers42: boolean = false; lIsParVers41: boolean = false; lRepeatedValues : boolean = false; lSlicesNotInSequence: boolean = false; lMaxSlice : integer = 0; lMaxIndex : integer = 0; lSliceSz: integer = 0; lMatOrient: boolean = false; //lOffsetTablesRequired: boolean = false; var lErrorStr,lInStr,lUpCaseStr,lReportedTRStr{,lUpcase20Str}: string; lAPFOV,lFHFOV,lRLFOV, lScanResX,lScanResY,lAngleA,lAngleB,lAngleC,lOffset1,lOffset2,lOffset3{,lXFOV,lYFOV}: double; lSliceIndexRAx,lSliceSequenceRA,lSortedSliceSequence: int64P; //lSliceIndexRA: array [1..kMaxnSlices] of longint; //lSSx,lRSx,lRIx: array [1..kMaxnSlices] of single; lSlopeRAx,lInterceptRAx: array [1..kMaxnSlices] of single; lSliceHeaderRA: array [1..50] of double; //lRepeatedValues,lSlicesNotInSequence,lIsParVers3: boolean;//,lMissingVolumes,{,lLongRAtooSmall,lMissingVolumes,lConstantScale,lContiguousSlices,} lRangeRA: array [kXdim..kIndex] of tRange; lSliceInfoCount,lPos,lLen,lFileSz,lHdrPos,linPos,lInc,lOrient: integer; fp: file; lCharRA: bytep; procedure MinMaxTRange (var lDimension: tRange; lNewVal: double); //nested begin lDimension.Val := lNewVal; if lSliceInfoCount < 2 then begin lDimension.Min := lDimension.Val; lDimension.Max := lDimension.Val; end; if lNewVal < lDimension.Min then lDimension.Min := lNewVal; if lNewVal > lDimension.Max then lDimension.Max := lNewVal; end; //nested InitTRange proc function readParStr:string;//nested var lStr: string; begin lStr := ''; While (lPos <= lLen) do begin if (lStr <> '') or (linStr[lPos]<>' ') then //strip leading spaces lStr := lStr+(linStr[lPos]); inc(lPos); end; //while lPOs < lLen result := lStr; end; //nested func ReadParStr function readParFloat:double;//nested var lStr: string; begin lStr := ''; result := 1; While (lPos <= lLen) and ((lStr='') or(lInStr[lPos] <> ' ')) do begin if lInStr[lPos] in ['+','-','e','E','.','0'..'9'] then lStr := lStr+(linStr[lPos]); inc(lPos); end; if lStr = '' then exit; try result := strtofloat(lStr); except on EConvertError do begin Msg('read_PAR2NII: Unable to convert the string '+lStr+' to a number'); result := 1; exit; end; end; {except} end; //nested func ReadParFloat begin //Initialize parameters lOrient := 0; lAPFOV := 1; lnum4Ddatasets := 1; lMatOrient := false; lIsParVers3 := true; lIsParVers41 := false; lIsParVers42 := false; lSliceInfoCount := 0; getmem(lSliceIndexRAx, kMaxnSLices* sizeof(int64)); for lInc := kXdim to kIndex do //initialize all values: important as PAR3 will not explicitly report all MinMaxTRange(lRangeRA[lInc],0); lHdrOK := false; lImageFormatOK := false; lRescaleEntries := 0; lOffsetTableEntries := 0; Clear_Dicom_Data(lDicomData); lDynStr := ''; //Read text header to buffer (lCharRA) FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); lFileSz := FileSize(fp); GetMem( lCharRA, lFileSz+1 ); //note: must free dynamic memory: goto 333 if any error GetMem (lSliceSequenceRA, kMaxnSLices*sizeof(int64)); //note: must free dynamic memory: goto 333 if any error BlockRead(fp, lCharRA^, lFileSz, lInpos); if lInPos <> lFileSz then begin Msg('read_PAR2NII: Disk error, unable to read full input file.'); goto 333; end; linPos := 1; CloseFile(fp); FileMode := 2; //set to read/write //Next: read each line of header file... repeat //for each line in file.... linstr := ''; while (linPos < lFileSz) and (lCharRA^[linPos] <> ord(kCR)) and (lCharRA^[linPos] <> ord(UNIXeoln)) do begin lInStr := lInstr + chr(lCharRA^[linPos]); inc(linPos); end; inc(lInPos); //read EOLN lLen := length(lInStr); lPos := 1; lUpcaseStr := ''; if lLen < 1 then //ignore blank lines else if (lInStr[1] = '*') and (not lHdrOK) then //# -> comment //ignore comment lines prior to start of header else if (lInStr[1] = '#') and (lHdrOK) then begin//# -> comment ignore UNLESS it reveals version if (Length(lInStr)> 16) and (lInStr[3] = 'C') and (Copy(lInStr,3,15) = 'CLINICAL TRYOUT') then begin lUpCaseStr := ''; lHdrPos := Length(lInStr); while (lHdrPos > 0) and (UpCase(lInStr[lHdrPos]) <> 'V') do begin if lInStr[lHdrPos] in ['.', '0'..'9'] then lUpCaseStr := UpCase(lInStr[lHdrPos])+lUpCaseStr; dec(lHdrPos); end; if lUpCaseStr = '3' then lIsParVers3 := true else if lUpCaseStr = '4' then lIsParVers3 := false else if lUpCaseStr = '4.1' then begin lIsParVers3 := false; lIsParVers41 := true; Msg('PAR v4.1 not yet fully supported') end else if lUpCaseStr = '4.2' then begin //11/2007 lIsParVers3 := false; lIsParVers41 := true; lIsParVers42 := true; Msg('PAR v4.2 not yet fully supported') end else Msg('Warning: unknown PAR version '+lUpCaseStr); end; end else if (lInStr[1] = '.') or (not lHdrOK) then begin // GENERAL_INFORMATION section (line starts with '.') //Note we also read in lines that do not have '.' if we have HdrOK=false, this allows us to detect the DATADESCRIPTIONFILE signature While (lPos <= lLen) and (lInStr[lPos] <> ':') and ((not lHdrOK) or (lInStr[lPos] <> '#')) do begin if lInStr[lPos] in ['[',']','(',')','/','+','-',{' ',} '0'..'9','a'..'z','A'..'Z'] then lUpCaseStr := lUpCaseStr+upcase(linStr[lPos]); inc(lPos); end; //while reading line inc(lPos); {read equal sign in := statement} lDynStr := lDynStr + lInStr+kCR; //Msg(inttostr(length(lUpCaseStr))); if (not lHdrOK) and (lUpcaseStr = ('DATADESCRIPTIONFILE')) then begin //1389 PAR file lHdrOK := true; lDicomData.little_endian := 1; end; (* if (not lHdrOK) and (length(lUpCaseStr) >= 19) then begin //lUpcase20Str := xx lUpcase20Str := ''; for lInc := 1 to 19 do lUpcase20Str := lUpCase20Str + lUpcaseStr[lInc]; //Msg(lUpcase20Str); if (lUpcase20Str = ('DATADESCRIPTIONFILE')) or (lUpcase20Str = ('EXPERIMENTALPRIDEDA')) then begin //PAR file lHdrOK := true; lDicomData.little_endian := 1; end; end; *) if (lUpCaseStr ='REPETITIONTIME[MSEC]') or (lUpCaseStr ='REPETITIONTIME[MS]') then lDicomData.TR := round(readParFloat); if (lUpCaseStr ='MAXNUMBEROFSLICES/LOCATIONS') then lDicomData.XYZdim[3] := round(readParFloat); if (lUpCaseStr ='SLICETHICKNESS[MM]') then MinMaxTRange(lRangeRA[kSliceThick],readParFloat); if (lUpCaseStr ='SLICEGAP[MM]') then MinMaxTRange(lRangeRA[kSliceGap],readParFloat); if lUpCaseStr = 'FOV(APFHRL)[MM]' then begin lDicomData.XYZmm[2] := (readParFloat); //AP anterior->posterior lDicomData.XYZmm[3] := (readParFloat); //FH foot head lDicomData.XYZmm[1] := (readParFloat); //RL Right-Left lAPFOV := lDicomData.XYZmm[2]; lFHFOV := lDicomData.XYZmm[3]; lRLFOV := lDicomData.XYZmm[1]; end; if lUpCaseStr = 'SCANRESOLUTION(XY)' then begin lScanResX := round(readParFloat); lScanResY := round(readParFloat); end; {if lUpCaseStr = 'SCANPERCENTAGE' then begin lScanPct := round(readParFloat); end; } if lUpCaseStr = 'RECONRESOLUTION(XY)' then begin MinMaxTRange(lRangeRA[kXdim],readParFloat); MinMaxTRange(lRangeRA[kYdim],readParFloat); end; if lUpCaseStr = 'RECONSTRUCTIONNR' then lDicomData.AcquNum := round(readParFloat); if lUpCaseStr = 'ACQUISITIONNR' then lDicomData.SeriesNum := round(readParFloat); if lUpCaseStr = 'MAXNUMBEROFDYNAMICS' then begin lDicomData.XYZdim[4] := round(readParFloat); end; if lUpCaseStr = 'EXAMINATIONDATE/TIME' then begin lDicomData.StudyDate := readParStr; PAR2DICOMstudyDate(lDicomData); end; if (lUpCaseStr ='ANGULATIONMIDSLICE(APFHRL)[DEGR]') then begin lAngleA := (readParFloat); lAngleB := (readParFloat); lAngleC := (readParFloat); end; if (lUpCaseStr ='OFFCENTREMIDSLICE(APFHRL)[MM]') then begin lOffset2 := (readParFloat); lOffset3 := (readParFloat); lOffset1 := (readParFloat); end; if lUpCaseStr = 'PROTOCOLNAME' then lDicomData.ProtocolName := readParStr; if lUpCaseStr = 'PATIENTNAME' then lDicomData.PatientName := readParStr; if lUpCaseStr ='IMAGEPIXELSIZE[8OR16BITS]' then begin MinMaxTRange(lRangeRA[kBitsPerVoxel],readParFloat); end; if not lHdrOK then begin Msg('read_PAR2NII: Error reading header'); goto 333; end; end else begin //SliceInfo: IMAGE_INFORMATION (line does NOT start with '.' or '#') inc(lSliceInfoCount); if (lSliceInfoCount < 2) and (lRangeRA[kBitsPerVoxel].val < 1) then //PARvers3 has imagedepth in general header, only in image header for later versions lIsParVers3 := false; for lHdrPos := 1 to 26 do lSliceHeaderRA[lHdrPos] := readparfloat; //The next few values are in the same location for both PAR3 and PAR4 MinMaxTRange(lRangeRA[kSlice], round(lSliceHeaderRA[1])); MinMaxTRange(lRangeRA[kEcho], round(lSliceHeaderRA[2])); MinMaxTRange(lRangeRA[kDyn], round(lSliceHeaderRA[3])); if not lIsParVers42 then //if 4.2 then we will use combination of Cardiac and ASL for cardiac number MinMaxTRange(lRangeRA[kCardiac], round(lSliceHeaderRA[4])); MinMaxTRange(lRangeRA[kType], round(lSliceHeaderRA[5])); MinMaxTRange(lRangeRA[kSequence], round(lSliceHeaderRA[6])); MinMaxTRange(lRangeRA[kIndex], round(lSliceHeaderRA[7])); if lIsParVers3 then begin //Read PAR3 data MinMaxTRange(lRangeRA[kRI], lSliceHeaderRA[8]);; //8=intercept in PAR3 MinMaxTRange(lRangeRA[kRS],lSliceHeaderRA[9]); //9=slope in PAR3 MinMaxTRange(lRangeRA[kSS],lSliceHeaderRA[10]); //10=lcalibrated slope in PAR3 1393 - attempt to use calibrated values //MinMaxTRange(lRangeRA[kXmm],lSliceHeaderRA[23]); //23 PIXEL SPACING X in PAR3 //MinMaxTRange(lRangeRA[kYmm],lSliceHeaderRA[24]); //24 PIXEL SPACING Y IN PAR3 MinMaxTRange(lRangeRA[kDynTime],(lSliceHeaderRA[26])); //26= dyn_scan_begin_time in PAR3 end else begin //not PAR: assume PAR4 for lHdrPos := 27 to 32 do lSliceHeaderRA[lHdrPos] := readparfloat; MinMaxTRange(lRangeRA[kBitsPerVoxel],lSliceHeaderRA[8]);//8 BITS in PAR4 MinMaxTRange(lRangeRA[kXdim], lSliceHeaderRA[10]); //10 XDim in PAR4 MinMaxTRange(lRangeRA[kYdim], lSliceHeaderRA[11]); //11 YDim in PAR4 MinMaxTRange(lRangeRA[kRI],lSliceHeaderRA[12]); //12=intercept in PAR4 MinMaxTRange(lRangeRA[kRS],lSliceHeaderRA[13]); //13=lslope in PAR4 MinMaxTRange(lRangeRA[kSS],lSliceHeaderRA[14]); //14=lcalibrated slope in PAR4 1393 - attempt to use calibrated values MinMaxTRange(lRangeRA[kDynTime],(lSliceHeaderRA[32]));//32= dyn_scan_begin_time in PAR4 if lIsParVers41 then begin for lHdrPos := 33 to 47 do lSliceHeaderRA[lHdrPos] := readparfloat; if ({diff}lSliceHeaderRA[34]<> 0) and ({grad}lSliceHeaderRA[43]<> 0) then //DTI scan - treat as dynamics MinMaxTRange(lRangeRA[kDyn], ({diff}lSliceHeaderRA[34]*100)+ ({gradient}lSliceHeaderRA[43]) ); if lIsParVers42 then begin for lHdrPos := 48 to 49 do lSliceHeaderRA[lHdrPos] := readparfloat; //fx( lSliceHeaderRA[49]); MinMaxTRange(lRangeRA[kCardiac], ({cardiac}lSliceHeaderRA[49]*100)+ ({asl}lSliceHeaderRA[4]) ); end; //PAR42 end; //PAR41 end; //PAR4 if lSliceInfoCount < kMaxnSlices then begin lSliceSequenceRA^[lSliceInfoCount] := (round(lRangeRA[kSequence].val) shl 48)+(round(lRangeRA[kType].val) shl 40)+(round(lRangeRA[kCardiac].val) shl 32)+(round(lRangeRA[kEcho].val) shl 24)+(round(lRangeRA[kDyn].val) shl 10)+round(lRangeRA[kSlice].val); (*lRSx [lSliceInfoCount] := lRangeRA[kRS].Val; lRIx [lSliceInfoCount] := lRangeRA[kRI].val; lSSx [lSliceInfoCount] := lRangeRA[kSS].Val; *) // fx( lRangeRA[kType].val ,lRangeRA[kEcho].val); PhilipsPrecise (lRangeRA[kRS].Val, lRangeRA[kRI].val,lRangeRA[kSS].Val,lSlopeRAx[lSliceInfoCount],lInterceptRAx[lSliceInfoCount],lPrecise); lSliceIndexRAx^[lSliceInfoCount]:= round(lRangeRA[kIndex].val); end; if (not lMatOrient) and (lSliceHeaderRA[1]=1) and (lSliceHeaderRA[2]=1) {and (lSliceHeaderRA[3]=1)} and (lSliceHeaderRA[4]=1) then begin lMatOrient := true; //first slice/echo/-dynamic/cardiac --- take slice position information from this slice... //par4 - 20,21,22 ; par3 16,17,18 if lIsParVers3 then lOrient := round(lSliceHeaderRA[19]) else lOrient := round(lSliceHeaderRA[26]); matx(lNHdr,lDicomData,lAngleA,lAngleB,lAngleC,lOffset1,lOffset2,lOffset3, lRangeRA[kXdim].Val,lRangeRA[kYdim].Val,lDicomData.XYZdim[3], lAPFOV,lFHFOV,lRLFOV,lOrient); //procedure mat(b,c,a,offa,offb,offc,lx,ly,lz,lxmm,lymm,lzmm: single); end; end; //SliceInfo Line until (linPos >= lFileSz);//until done reading entire file... //describe generic DICOM parameters lDicomData.XYZdim[1] := round(lRangeRA[kXdim].Val); lDicomData.XYZdim[2] := round(lRangeRA[kYdim].Val); lDicomData.XYZdim[3] := 1+round(lRangeRA[kSlice].Max-lRangeRA[kSlice].Min); if (lSliceInfoCount mod lDicomData.XYZdim[3]) <> 0 then Msg('read_PAR2NII: Total number of slices not divisible by number of slices per volume. Reconstruction error?'); if lDicomData.XYZdim[3] > 0 then lDicomData.XYZdim[4] := lSliceInfoCount div lDicomData.XYZdim[3] //nVolumes = nSlices/nSlicePerVol else lDicomData.XYZdim[4] := 1; if lOrient = 2 then begin //sagittal lDicomData.XYZmm[1] := lAPFOV /lDicomData.XYZdim[1]; lDicomData.XYZmm[2] := lFHFOV / lDicomData.XYZdim[2]; lDicomData.XYZmm[3] := lRLFOV /lDicomData.XYZdim[3]; end else if lOrient = 3 then begin //coronal lDicomData.XYZmm[1] := lRLFOV /lDicomData.XYZdim[1]; lDicomData.XYZmm[2] := lFHFOV / lDicomData.XYZdim[2]; lDicomData.XYZmm[3] := lAPFOV /lDicomData.XYZdim[3]; end else begin //axial lDicomData.XYZmm[1] := lRLFOV /lDicomData.XYZdim[1]; lDicomData.XYZmm[2] := lAPFOV /lDicomData.XYZdim[2]; lDicomData.XYZmm[3] := lFHFOV / lDicomData.XYZdim[3]; end; //use smallest in plane resolution... SetLarger (lDicomData.XYZmm[1],lDicomData.XYZmm[2]); lDicomData.Allocbits_per_pixel := round(lRangeRA[kBitsPerVoxel].Val); lDicomData.IntenScale := lRangeRA[kRS].Val; lDicomData.IntenIntercept := lRangeRA[kRI].Val; //Next: report number of Dynamic scans, this allows people to parse DynScans from Type/Cardiac/Echo/Sequence 4D files lnum4Ddatasets := (round(lRangeRA[kDyn].Max - lRangeRA[kDyn].Min)+1)*lDicomData.XYZdim[3]; //slices in each dynamic session if ((lSliceInfoCount mod lnum4Ddatasets) = 0) and ((lSliceInfoCount div lnum4Ddatasets) > 1) then lnum4Ddatasets := (lSliceInfoCount div lnum4Ddatasets) //infer multiple Type/Cardiac/Echo/Sequence else lnum4Ddatasets := 1; //next: Determine actual interscan interval if (lDicomData.XYZdim[4] > 1) and ((lRangeRA[kDynTime].max-lRangeRA[kDynTime].min)> 0) {1384} then begin lReportedTRStr := 'Reported TR: '+floattostrf(lDicomData.TR,ffFixed,8,2)+kCR; lDicomData.TR := (lRangeRA[kDynTime].max-lRangeRA[kDynTime].min) /(lDicomData.XYZdim[4] - 1)*1000; //infer TR in ms end else lReportedTRStr :=''; //next: report header details lDynStr := 'Philips PAR/REC Format' //'PAR/REC Format' +kCR+ 'Patient name:'+lDicomData.PatientName +kCR+ 'XYZ dim: ' +inttostr(lDicomData.XYZdim[1])+'/'+inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) +kCR+'Volumes: ' +inttostr(lDicomData.XYZdim[4]) +kCR+'XYZ mm: '+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2) +kCR+'TR: '+floattostrf(lDicomData.TR,ffFixed,8,2) +kCR+lReportedTRStr+kCR+lDynStr; //if we get here, the header is fine, next steps will see if image format is readable... lHdrOK := true; if lSliceInfoCount < 1 then begin Msg('No valid images found.') ; goto 333; end; //next: see if slices are in sequence lSlicesNotInSequence := false; if lSliceInfoCount > 1 then begin lMaxSlice := lSliceSequenceRA^[1]; lMaxIndex := lSliceIndexRAx^[1]; lInc := 1; repeat inc(lInc); if lSliceSequenceRA^[lInc] < lMaxSlice then //not in sequence if image has lower slice order than previous image lSlicesNotInSequence := true else lMaxSlice := lSliceSequenceRA^[lInc]; if lSliceIndexRAx^[lInc] < lMaxIndex then //not in sequence if image has lower slice index than previous image lSlicesNotInSequence := true else lMaxIndex := lSliceIndexRAx^[lInc]; until (lInc = lSliceInfoCount) or (lSlicesNotInSequence); end; //at least 2 slices //Next: report any errors lErrorStr := ''; if (lSlicesNotInSequence) and (not lReadOffsetTables) then lErrorStr := lErrorStr + ' Slices not saved sequentially [using MRIcro''s ''Philips PAR to Analyze'' command may solve this]'+kCR; if lSliceInfoCount > kMaxnSlices then lErrorStr := lErrorStr + ' Too many slices: >'+inttostr(kMaxnSlices)+kCR; if (lRangeRA[kBitsPerVoxel].min <> lRangeRA[kBitsPerVoxel].max) then //5D file space+time+cardiac lErrorStr := lErrorStr + ' Differing bits per voxel'+kCR; //if (lRangeRA[kCardiac].min <> lRangeRA[kCardiac].max) then //5D file space+time+cardiac // lErrorStr := lErrorStr + 'Multiple cardiac timepoints'+kCR; //if (lRangeRA[kEcho].min <> lRangeRA[kEcho].max) then //5D file space+time+echo // lErrorStr := lErrorStr + 'Multiple echo timepoints'+kCR; if (lRangeRA[kSliceThick].min <> lRangeRA[kSliceThick].max) or (lRangeRA[kSliceGap].min <> lRangeRA[kSliceGap].max) or (lRangeRA[kXdim].min <> lRangeRA[kXdim].max) or (lRangeRA[kYDim].min <> lRangeRA[kYDim].max) or (lRangeRA[kXmm].min <> lRangeRA[kXmm].max) or (lRangeRA[kYmm].min <> lRangeRA[kYmm].max) then lErrorStr := lErrorStr + ' Multiple/varying slice dimensions'+kCR; //if any errors were encountered, report them.... if lErrorStr <> '' then begin Msg('read_PAR2NII: This software can not convert this Philips data:'+kCR+lErrorStr); goto 333; end; //Next sort image indexes here... if (lSliceInfoCount > 1) and(lSlicesNotInSequence) and ( lReadOffsetTables) then begin //sort image order... //ShellSort (first, last: integer; var lPositionRA, lIndexLoRA,lIndexHiRA: LongintP; var lRepeatedValues: boolean) GetMem (lOffset_pos_table, lSliceInfoCount*sizeof(int64)); for lInc := 1 to lSliceInfoCount do lOffset_pos_table^[lInc] := lInc; ShellSortItems (1, lSliceInfoCount,lOffset_pos_table,lSliceSequenceRA, lRepeatedValues); (* if lRepeatedValues then begin Msg('read_PAR2NII: fatal error, slices do not appear to have unique indexes [multiple copies of same slice]'); FreeMem (lOffset_pos_table); goto 333; end; *) lOffsetTableEntries := lSliceInfoCount; end; //sort image order... //Next, generate list of scale slope (*lOffsetTablesRequired := false; if (lSliceInfoCount > 1) and ( (lRangeRA[kSS].min <> lRangeRA[kSS].max) or (lRangeRA[kRS].min <> lRangeRA[kRS].max) or (lRangeRA[kRI].min <> lRangeRA[kRI].max)) then lOffsetTablesRequired := true; *) lDicomData.IntenScale := lSlopeRAx[1]; lDicomData.IntenIntercept := lInterceptRAx[1]; //PhilipsPrecise (lRSx[lInc], lRIx[lInc],lSSx[lInc], lDicomData.IntenScale,lDicomData.IntenIntercept); //if lOffsetTablesRequired then begin // Msg('Image saved as 32-bit data: varying intensity scaling factors or complicated Pixel to Precise transform'); if (lRangeRA[kSS].min = lRangeRA[kSS].max) and (lRangeRA[kRS].min = lRangeRA[kRS].max) and (lRangeRA[kRI].min = lRangeRA[kRI].max) then lRescaleEntries := 0 else begin lRescaleEntries := lSliceInfoCount; getmem (lSlopeRA, lRescaleEntries*sizeof(single)); getmem (lInterceptRA, lRescaleEntries*sizeof(single)); if lOffsetTableEntries = lSliceInfoCount then begin //need to sort slices for lInc := 1 to lSliceInfoCount do begin lSlopeRA^[lInc] := lSlopeRAx[lOffset_pos_table^[lInc]]; lInterceptRA^[lInc] := lInterceptRAx[lOffset_pos_table^[lInc]]; end; end else begin //if sorted, else unsorted for lInc := 1 to lSliceInfoCount do begin lSlopeRA^[lInc] := lSlopeRAx[lInc]; lInterceptRA^[lInc] := lInterceptRAx[lInc]; end; end; //slices sorted end;//read scale factors //Next: now adjust Offsets to point to byte offset instead of slice number lSliceSz := lDicomData.XYZdim[1]*lDicomData.XYZdim[2]*(lDicomData.Allocbits_per_pixel div 8); if lOffsetTableEntries = lSliceInfoCount then for lInc := 1 to lSliceInfoCount do lOffset_pos_table^[lInc] := lSliceSz * (lSliceIndexRAx^[lOffset_pos_table^[lInc]]); //report if 5D/6D/7D file is being saved as 4D if (lRangeRA[kCardiac].min <> lRangeRA[kCardiac].max) or (lRangeRA[kEcho].min <> lRangeRA[kEcho].max) //5D file space+time+echo or (lRangeRA[kType].min <> lRangeRA[kType].max) //5D file space+time+echo or (lRangeRA[kSequence].min <> lRangeRA[kSequence].max) then begin//5D file space+time+echo Msg('Warning: note that this image has more than 4 dimensions (multiple Cardiac/Echo/Type/Sequence)'); Msg('Cardiac min..max '+floattostr(lRangeRA[kCardiac].min)+'..'+floattostr(lRangeRA[kCardiac].max) ); Msg('Echo min..max '+floattostr(lRangeRA[kEcho].min)+'..'+floattostr(lRangeRA[kEcho].max) ); Msg('Type min..max '+floattostr(lRangeRA[kType].min)+'..'+floattostr(lRangeRA[kType].max) ); Msg('Sequence min..max '+floattostr(lRangeRA[kSequence].min)+'..'+floattostr(lRangeRA[kSequence].max) ); end; //if we get here, the Image Format is OK lImageFormatOK := true; lFileName := changefileextX(lFilename,'.rec'); //for Linux: case sensitive extension search '.rec' <> '.REC' 333: //abort clause: skips lHdrOK and lImageFormatOK //next: free dynamically allocated memory FreeMem( lCharRA); FreeMem (lSliceSequenceRA); Freemem(lSliceIndexRAx); end; (*function StudySecSince2KStr (lInSec: integer): string; var days,secs,Y,M,D,H,Min,S, l,n,i,j: integer; begin result := 'DateNA';//bogus days := (lInSec div 86400)+2451547;//+2451547 as we convert to julian //Msg(inttostr(days)); //next convert Y,M,D l := days + 68569; n := trunc(( 4 * l ) / 146097); l := trunc(l - ( 146097 * n + 3 ) / 4); i := trunc(( 4000 * ( l + 1 ) ) / 1461001); l := trunc(l - ( 1461 * i ) / 4 + 31); j := trunc(( 80 * l ) / 2447 ); d := trunc(l - ( 2447 * j ) / 80); l := trunc(j / 11); m := j + 2 - ( 12 * l ); y := 100 * ( n - 49 ) + i + l; //next convert H,Min,Sec if lInSec < 0 then begin//date prior to 2000 -saved as negative secs := (lInSec - ( (lInSec div 86400)*86400)+86400) mod 86400 end else secs := lInSec mod 86400; //value 0..86399 S := secs mod 60; Min := (secs div 60) mod 60; H := (secs div 3600)+1; result := PadStr (Y, 4)+ PadStr (M, 2)+PadStr (D, 2)+'_'+PadStr (H, 2)+ PadStr (Min, 2)+PadStr (S, 2); end;*) function UniqueFileName (var lInStr: string): boolean; var lInc: integer; lPathWName,lExt: string; begin result := true; if not Fileexists(lInStr) then exit; ExtractFileParts(lInStr,lPathWName,lExt); lInc := ord('A'); while (lInc <= ord('Z')) and ( Fileexists(lPathWName+chr(lInc)+lExt)) do inc(lInc); if lInc > ord('Z') then result := false else lInStr := lPathWName+chr(lInc)+lExt; end; function ConvertPhilipsPARtoAnalyze (var lInFilename, lOutDir: string; var lPrefs: TPrefs): boolean; label 678; var //lVaryingScaleFactorsTableEntries, lLines,lColBytes,lRows,lRowsdiv2,lSwap,lInc, l4Doffset,lcurrent4Dvol,lnum4Ddatasets, lSlicePixelsx, lnSlicesx, lSliceSzOutx, lSLiceSzx, lRescaleEntries, lPos,lOffsetTableEntries: longint; lOutF,lInF: File; lNHdr,lAHdr: TNIFTIhdr; lP,lBuffer : Bytep; lFileName,lRECFilename,lOutImgName,lOutHdrName,lDynStr,lOutDirPath: String; lDICOMdata: dicomdata; lScaleFactorVariesInThis4DVolume,lAbort,lHdrOK, lImageFormatOK: boolean; lSlopeRA,lInterceptRA, lSingleBuffer: Singlep; lOffset_pos_table: LongIntp; begin result := false; lFileName := lInFilename; if (lOutDir = '') then lOutDirPath := ExtractFilePath(lFileName)//ExtractFileDirWithPathDelim(lFilename)//ExtractFilePath(lFileName) else if not direxists(lOutDir) then begin Msg('Unable to find output directory '+lOutDir); lOutDirPath := ExtractFilePath(lFileName) end else lOutDirPath := lOutDir; if (length(lOutDirPath) > 0) and (lOutDirPath[length(lOutDirPath)] <> pathdelim) then lOutDirPath := lOutDirPath + pathdelim; lAbort := false; lRecFilename :=ChangeFileExt(lFileName,'.rec'); Msg('input name '+ lInFilename); Msg('input REC name '+lRecFilename); //Apr08 problems with filenames with . in them lRecFilename :=ExtractFilePath(lFileName)+ParseFileName(ExtractFileName(lFileName))+'.rec'; if not fileexists(lRecFilename) then //might be Linux: case sensitive extensions lRecFilename :=ChangeFileExt(lFileName,'.REC'); // lRecFilename :=ExtractFilePath(lFileName)+ParseFileName(ExtractFileName(lFileName))+'.REC'; if not fileexists(lRecFilename) then Msg('Unable to find REC image data file named '+lRecFileName) else if fileexists(lRecFilename) and fileexists(lFilename) then begin //convert read_par2NII(lNHdr,lDICOMdata,lHdrOK,lImageFormatOK,lPRefs.PhilipsPrecise, lDynStr,lFileName,true,lOffset_pos_table,lOffsetTableEntries,lRescaleEntries, lSlopeRA,lInterceptRA,lnum4Ddatasets); if (lnum4Ddatasets > 1) and ((lDicomData.XYZdim[4] mod lnum4Ddatasets) = 0) then //break 5D files into separate 4D files lDicomData.XYZdim[4] := lDicomData.XYZdim[4] div lnum4Ddatasets else lnum4Ddatasets := 1; lRows := lDicomData.XYZdim[2]; lRowsdiv2 := lRows div 2; lColBytes := lDicomData.XYZdim[1]*(lDicomData.Allocbits_per_pixel div 8); lSlicePixelsx := (lDicomData.XYZdim[1]*lDicomData.XYZdim[2]); lSliceSzx := lSlicePixelsx*(lDicomData.Allocbits_per_pixel div 8); lnSlicesx := lDicomData.XYZdim[3] * lDicomData.XYZdim[4]; lcurrent4Dvol := 0; l4DOffset := 0; // exit; //crucial critical test exit if lHdrOK then begin repeat //for each 4D volume inc(lcurrent4Dvol); lOutHdrName :=lOutDirPath+{Pathdelim+}OutputFilename(lRecFilename,lDicomData,lPrefs);//Pathdelim 11/2007 if lnum4Ddatasets > 1 then begin l4DOffset := (lcurrent4Dvol-1)* lnSlicesx; lOutHdrName :=(lOutHdrName)+'x'+inttostr(lcurrent4Dvol)+'.hdr' end else lOutHdrName :=(lOutHdrName)+'.hdr'; lOutImgName :=changefileext(lOutHdrName,'.img'); if lPrefs.SingleNIIFile then begin lOutHdrName := changefileext(lOutHdrName,'.nii'); lOutImgName := lOutHdrName; end; if (lPrefs.SingleNIIFile) and (lPrefs.GZip) then begin lOutHdrName := lOutHdrName+'.gz'; if (not UniqueFileName(lOutHdrName)) then begin Msg('File already exists '+lOutImgName+' '+lOutHdrName); exit; end; //we now need to remove the .gz - not that unique filename may have appended postfix, e.g. filename.nii.gz -> filenameA.nii.gz //StripGZExt(lOutHdrName); lOutImgName := lOutHdrName; end else begin if (not UniqueFileName(lOutHdrName)) or (not UniqueFileName(lOutImgName)) then begin Msg('File already exists '+lOutImgName+' '+lOutHdrName); exit; end; end; Msg(lFileName+' --> '+ lOutImgName); //exit; //trap {$IFDEF LINUX} //perhaps the file is .REC, not .rec if (lSliceSzx * lnSLicesx) > FSize(lFileName) then lRecFilename := changefileext(lFileName,'.REC'); {$ENDIF} if (lSliceSzx * lnSLicesx) > FSize(lRecFilename) then begin Msg('Conversion error: the REC file '+lRecFilename+ ' is not as large as described by the PAR file X*Y*Z*T*BytesPerPixel=' + inttostr(lDicomData.XYZdim[1])+'*'+inttostr(lDicomData.XYZdim[2])+'*'+inttostr(lDicomData.XYZdim[3])+'*'+inttostr(lDicomData.XYZdim[4])+'*'+inttostr(lDicomData.Allocbits_per_pixel div 8) +' = '+ inttostr(lSliceSzx* lnSLicesx)+' <> '+inttostr(FSize(lFileName)) ); {$IFDEF LINUX} Msg(' Suggestion: in UNIX .REC and .rec are different files - check file extension' ); {$ENDIF} lAbort := true; end else if ((sizeof(TNIFTIhdr)+(lSliceSzx*lnSlicesx))> DiskFreeEx(lOutImgName)) then begin Msg('There is not enough free space on the destination disk to save the converted image. '+kCR+ lOutImgName+ kCR+' Bytes Required: '+inttostr(sizeof(TNIFTIhdr)+(lSliceSzx*lnSlicesx)) ); lAbort := true; end else if fileexists(lOutHdrName) or fileexists(lOutImgName) then Msg('Unable to convert images: file already exists named: '+lOutHdrName) else if (not lHdrOK) then msg('Problem with header...') else if (not lImageFormatOK) then msg('Problem with image...') else if (lHdrOK) and (lImageFormatOK) and (lDicomData.XYZdim[3] > 0) and (lSliceSzx > 0) then begin DICOM2AnzHdr(lAHdr,lPrefs.Anonymize,lFilename,lDICOMdata); lSliceSzOutx := lSliceSzx; lScaleFactorVariesInThis4DVolume := false; //check if 4D scale slope changes for this 4D dataset... if lRescaleEntries > 0 then begin lAHdr.scl_slope := lSlopeRA^[l4DOffset+1]; lAHdr.scl_inter := lInterceptRA^[l4DOffset+1]; if lRescaleEntries > 0 then begin for lInc := 1 to lnSlicesx do begin if lAHdr.scl_slope <> lSlopeRA^[l4DOffset+lInc] then lScaleFactorVariesInThis4DVolume := true; if lAHdr.scl_inter <> lInterceptRA^[l4DOffset+lInc] then lScaleFactorVariesInThis4DVolume := true; end; end; if lScaleFactorVariesInThis4DVolume then begin lAHdr.bitpix := 32; lAHdr.DataType := 16; lAHdr.scl_slope := 1; lAHdr.scl_inter := 0; lSliceSzOutx := lSlicePixelsx*sizeof(single); end; end; //end of 4D scale factor variation... lAHdr.sform_code := lNHdr.sform_code; lAHdr.srow_x[0] := lNHdr.srow_x[0]; lAHdr.srow_x[1] := lNHdr.srow_x[1]; lAHdr.srow_x[2] := lNHdr.srow_x[2]; lAHdr.srow_x[3] := lNHdr.srow_x[3]; lAHdr.srow_y[0] := lNHdr.srow_y[0]; lAHdr.srow_y[1] := lNHdr.srow_y[1]; lAHdr.srow_y[2] := lNHdr.srow_y[2]; lAHdr.srow_y[3] := lNHdr.srow_y[3]; lAHdr.srow_z[0] := lNHdr.srow_z[0]; lAHdr.srow_z[1] := lNHdr.srow_z[1]; lAHdr.srow_z[2] := lNHdr.srow_z[2]; lAHdr.srow_z[3] := lNHdr.srow_z[3]; lAHdr.qform_code := lNHdr.qform_code; lAHdr.quatern_b := lNHdr.quatern_b; lAHdr.quatern_c := lNHdr.quatern_c; lAHdr.quatern_d := lNHdr.quatern_d; lAHdr.qoffset_x := lNHdr.qoffset_x; lAHdr.qoffset_y := lNHdr.qoffset_y; lAHdr.qoffset_z := lNHdr.qoffset_z; lAHdr.pixdim[0] := lNHdr.pixdim[0]; {$IFDEF ENDIAN_BIG} if SaveHdr (lOutHdrName,lAHdr, true,lPrefs.SPM2) then begin {$ELSE} if SaveHdr (lOutHdrName,lAHdr, false,lPrefs.SPM2) then begin {$ENDIF} Filemode := 2;//1385: read-write AssignFile(lOutF, lOutImgName); if lPrefs.SingleNIIFile then begin Reset(lOutF,1); Seek(lOutF,352); lAHdr.vox_offset := 352; end else Rewrite(lOutF,1); //setting block size only about 12% speed increase: HD cache must help Filemode := 0;//1385: read-only AssignFile(lInF, lRecFilename); Reset(lInF,lSliceSzx); GetMem(lBuffer,lSliceSzx); if lScaleFactorVariesInThis4DVolume then GetMem(lSingleBuffer,lSliceSzOutx); for lInc := 1 to lnSlicesx do begin //application.ProcessMessages; if lOffsetTableEntries > 1 then //data not contiguous Seek(lInF, (lOffset_pos_table^[lInc+l4DOffset] div lSliceSzx)) else Seek(lInF, (l4DOffset+lInc-1)); Filemode := 0; //ReadONly BlockRead(lInF, lBuffer^, 1); Filemode := 2; //read and write GetMem ( lP , lColBytes); for lLines := 1 to lRowsdiv2 do begin Move(lBuffer[((lLines-1)*lColBytes)+1],lP^,lColBytes); Move(lBuffer[(( lRows-lLines)*lColBytes)+1],lBuffer[((lLines-1)*lColBytes)+1],lColBytes); Move(lP^,lBuffer[(( lRows-lLines)*lColBytes)+1],lColBytes); end; FreeMem(lP); if lScaleFactorVariesInThis4DVolume then begin if lDicomData.Allocbits_per_pixel = 8 then begin for lLines := 1 to lSlicePixelsx do lSingleBuffer^[lLines] := lBuffer^[lLines]*lSlopeRA^[l4DOffset+lInc]+lInterceptRA^[l4DOffset+lInc]; end else if lDicomData.Allocbits_per_pixel = 16 then begin lPos := 1; for lLines := 1 to lSlicePixelsx do begin lSingleBuffer^[lLines] := lBuffer^[lLines]*lSlopeRA^[l4DOffset+lInc]+lInterceptRA^[l4DOffset+lInc]; //lSingleBuffer^[lLines] := lBuffer^[lPos]*lRS+lRI; inc(lPos,2); end; end else Msg('Error: can only convert 8/16bit PAR/REC files with varying scaling values.'); BlockWrite(lOutF, lSingleBuffer^, lSliceSzOutx); end else BlockWrite(lOutF, lBuffer^, lSliceSzOutx); end; CloseFile(lOutF); CloseFile(lInF); freemem(lBuffer); if lScaleFactorVariesInThis4DVolume then FreeMem(lSingleBuffer); end else lAbort := true; //save header failed: probably read only disk, or less than 348 bytes: do not force inidividual to see message for each file //if (lPrefs.StartClip > 0) or (lPrefs.EndClip > 0) then // Clip4D(lOutHdrName, lAHdr, false,lPrefs.SPM2,lPrefs.SingleNIIFile,lPrefs.GZip,true, lPrefs.StartClip,lPrefs.EndClip); (*if (not lPrefs.FourD) and (lAHdr.dim[4] > 1) then begin Convert4Dto3D(lOutImgName, lAHdr, false,lPrefs.SPM2,lPrefs.SingleNIIFile, lPrefs.Gzip); end else if lPrefs.SingleNIIFile and lPrefs.Gzip then GZipFile(lOutImgName,lOutImgName+'.gz',true);*) if ((not lPrefs.FourD) and (lAHdr.dim[4] > 1)) {or ((lPrefs.SingleNIIFile) and (lPrefs.Gzip))} then if ChangeNIfTISubformat(lOutImgName, lAHdr,lPrefs) then begin deleteFile(lOutImgName);//11/2007 : delete original end; end; //file OK until (lcurrent4Dvol>=lnum4Ddatasets) or (lAbort); //for each 4D dataset end; //lHdrOK if lOffsetTableEntries > 0 then begin freemem (lOffset_pos_table); lOffsetTableEntries := 0; end; //slice offset table filled if lRescaleEntries > 0 then begin freemem ( lSlopeRA); freemem (lInterceptRA); end; //slice offset table filled end; //REC exists if lAbort then goto 678; result := true; ExitCode := 0; if (lDicomData.XYZdim[2] > lPrefs.MinReorientMatrix) and (lDicomData.XYZdim[1] > lPrefs.MinReorientMatrix) and (lAHdr.dim[4] < 2) then begin lOutImgName := Reorient(lOutImgName,lAHdr,lPrefs,false,false); if (lOutImgName <> '') {success}and (lDicomData.TE < 25) then //T1 image CropNIfTI(lOutImgName,lPrefs); end; 678: Filemode := 2; //1385 end; function LoadFileListPARREC (var lInFilename, lOutDir: string; var lPrefs: TPrefs): boolean; var lFilePath,lMaskExt,lPARname,lOutDirName: String; lError: boolean; lSearchRec: TSearchRec; begin lOutDirName := lOutDir; if (lPrefs.OutDirMode <> kOutDirModeInput) and (DirExists(lPrefs.OutDir)) then begin //For kOutDirModePrompt one should set OutDir before getting here //This is required so recursive searches do not repetitively prompt the user... lOutDirName := lPrefs.OutDir; end; //1/2010 lOutDirName := ExtractFileDirWithPathDelim(lOutDirName); if not DirWritePermission(lOutDirName) then begin // <- tested with Unix Msg('Error: output directory is read-only: '+lOutDirName); exit; end; lError := false; if lPrefs.EveryFile = true then begin lFilePath := ExtractFileDirWithPathDelim(lInFilename); {$IFDEF Linux} lMaskExt := '*'; {$ELSE} lMaskExt := '*.*'; {$ENDIF} Filemode := 0; //readonly if FindFirst(lFilePath{+PathDelim}+lMaskExt, faAnyFile-faSysFile-faDirectory, lSearchRec) = 0 then begin repeat if UpCaseExt(lSearchRec.Name) = '.PAR' then begin lPARname := (lFilePath+lSearchRec.Name); result := ConvertPhilipsPARtoAnalyze(lPARname, lOutDirName, lPrefs); if not result then lError := true; end; until (FindNext(lSearchRec) <> 0); end else Msg( 'Error: Unable to find PAR files in '+lFilePath{+PathDelim}+lMaskExt); //some files found SysUtils.FindClose(lSearchRec); Filemode := 2; end else begin if FileExists(lInFilename) then begin lError := ConvertPhilipsPARtoAnalyze(lInFilename, lOutDirName, lPrefs); end else Msg( 'Unable to find PAR file named '+lInFilename); //some files found end; if lError then result := false //at least one error else result := true; end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/paramstrs.pas0000664000175000017500000003456711636067066021750 0ustar michaelmichaelunit paramstrs; {$H+} interface uses prefs,define_types; const kVers = 'Chris Rorden''s dcm2nii :: '+kMRIcronvers; {$Include ..\common\isgui.inc} procedure ProcessParamStrs; // procedure Testdcm2nii; procedure RecursiveFolderSearch (lFolderName,lOutDir: string; var lPrefs: TPrefs; lDepth: integer); implementation uses {$IFDEF GUI}gui, {$ENDIF} {$IFNDEF UNIX} Windows,{$ENDIF}dialogsx, Classes, inifiles,SysUtils,convert,sortdicom,dicom,parconvert,filename,dicomtypes, nii_crop,nii_orient,nii_4dto3d,userdir; (*procedure RecursiveFolderSearch (lFolderName,lOutDir: string; var lPrefs: TPrefs; lDepth: integer); var lNewDir,lNewName,lFilename,lExt: String; lSearchRec: TSearchRec; begin if (lPrefs.CollapseFolders) then begin //Convert all folders in single step... LoadFileList(lFolderName,lOutDir,lPrefs); exit; end; lNewDir := lFolderName+PathDelim; {$IFDEF UNIX} if FindFirst(lNewDir+'*',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ELSE} if FindFirst(lNewDir+'*.*',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ENDIF} lFilename := ''; repeat lNewName := lNewDir+lSearchRec.Name; if (lSearchRec.Name <> '.') and (lSearchRec.Name <> '..') then begin if DirExists(lNewName) then begin if lDepth < lPrefs.RecursiveFolderDepth then begin if (lDepth = 0) and (lPrefs.RecursiveUseNameAppend) then begin lPrefs.NameAppend := extractfilename(lNewName)+'_'; Msg('recursive base folder '+lPrefs.NameAppend); end; RecursiveFolderSearch(lNewName,lOutDir,lPrefs,lDepth+1); end; //exit;//4/4/2008 end else lFilename := lNewname; end; until (FindNext(lSearchRec) <> 0); if lFilename <> '' then begin lExt := UpCaseExt(lFilename); if (lExt = '.REC') or (lExt = '.PAR') then LoadFileListPARREC(lFilename,lOutDir,lPrefs) else begin Msg('recursive conversion '+lFilename); LoadFileList(lFilename,lOutDir,lPrefs); end; end; end; FindClose(lSearchRec); end; *) function IsDicom (lFilename: string): boolean; var lDICOMdata: DICOMData; lDynStr: string; lHdrOK,lImgOK: boolean; lPrefs: TPrefs; begin result := false; read_dicom_data(true,false{not verbose},true,true,true,true,false, lDICOMdata, lHdrOK, lImgOK, lDynStr,lFileName,lPrefs ); if (lHdrOK) and (lImgOK) then result := true; end; procedure RecursiveFolderSearch (lFolderName,lOutDir: string; var lPrefs: TPrefs; lDepth: integer); var lNewDir,lFilename,lExt: String; lDirStrings: TStringList; lSearchRec: TSearchRec; lI: integer; begin if (lPrefs.CollapseFolders) then begin //Convert all folders in single step... LoadFileList(lFolderName,lOutDir,lPrefs); exit; end; lNewDir := lFolderName+PathDelim; //first check for deeper folders... {$IFDEF DEBUG}Msg('---Recursively searching '+lfoldername+' depth = '+inttostr(lDepth)); {$ENDIF} if lDepth < lPrefs.RecursiveFolderDepth then begin lDirStrings := TStringList.Create; {$IFDEF UNIX} if FindFirst(lNewDir+'*',faDirectory,lSearchRec) = 0 then begin {$ELSE} if FindFirst(lNewDir+'*.*',faDirectory,lSearchRec) = 0 then begin {$ENDIF} lFilename := ''; repeat if (lSearchRec.Name <> '.') and (lSearchRec.Name <> '..') then begin lFileName := lNewDir+lSearchRec.Name; if DirExists(lFileName) then begin (*if (lDepth = 0) and (lPrefs.RecursiveUseNameAppend) then begin lPrefs.NameAppend := extractfilename(lSearchRec.Name)+'_'; Msg('recursive base folder '+lPrefs.NameAppend); end; *) lDirStrings.Add(lNewDir+lSearchRec.Name); end; end; until (FindNext(lSearchRec) <> 0); end; //findfirst FindClose(lSearchRec); lDirStrings.Sort; if lDirStrings.Count > 0 then for lI := 0 to (lDirStrings.Count-1) do begin if (lDepth = 0) and (lPrefs.RecursiveUseNameAppend) then begin lPrefs.NameAppend := extractfilename(lDirStrings[lI])+'_'; Msg('recursive base folder '+lPrefs.NameAppend); end; RecursiveFolderSearch(lDirStrings[lI],lOutDir,lPrefs,lDepth+1); end; lDirStrings.free; end; //lDepth < lPrefs.RecursiveFolderDepth //next check for files in current folder... {$IFDEF UNIX} if FindFirst(lNewDir+'*',faAnyFile-faSysFile-faHidden,lSearchRec) = 0 then begin {$ELSE} if FindFirst(lNewDir+'*.*',faAnyFile-faSysFile-faHidden,lSearchRec) = 0 then begin {$ENDIF} repeat lFileName := lNewDir+lSearchRec.Name; lExt := UpCaseExt(lFilename); if (lFilename <> '') and (FileExists(lFileName)) and (not DirExists(lFileName)) and (not IsNiftiExt(lExt)) then begin if (lExt = '.REC') or (lExt = '.PAR') then LoadFileListPARREC(lFilename,lOutDir,lPrefs) else if IsDicom (lFilename) then begin Msg('Looking for DICOM files in folder with '+lFilename); LoadFileList(lFilename,lOutDir,lPrefs); end else lFilename := ''; end else lFilename :=''; until (FindNext(lSearchRec) <> 0) or (lFilename <> ''); end; //findfirst FindClose(lSearchRec); end; //RecursiveFolderSearch function Bool2YN (lBool: boolean): char; begin if lBool then result := 'Y' else result := 'N'; end; procedure CharBool (lCh: char; var lBool: boolean); begin if lCh = 'Y' then lBool := true; if lCh = 'N' then lBool := false; end; procedure ShowHelp (var lIniName: string; lPrefs: TPrefs); begin Msg('Either drag and drop or specify command line options:'); Msg(' '+FilenameWOExt(paramstr(0))+' '); Msg('OPTIONS:'); Msg('-a Anonymize [remove identifying information]: Y,N = '+Bool2YN(lPrefs.Anonymize)); Msg('-b load settings from specified inifile, e.g. ''-b C:\set\t1.ini'' '); Msg('-c Collapse input folders: Y,N = '+Bool2YN(lPrefs.CollapseFolders)); Msg('-d Date in filename [filename.dcm -> 20061230122032.nii]: Y,N = '+Bool2YN(lPrefs.AppendDate)); Msg('-e events (series/acq) in filename [filename.dcm -> s002a003.nii]: Y,N = '+Bool2YN(lPrefs.AppendAcqSeries)); Msg('-f Source filename [e.g. filename.par -> filename.nii]: Y,N = '+Bool2YN(lPrefs.AppendFilename)); Msg('-g gzip output, filename.nii.gz [ignored if ''-n n'']: Y,N = '+Bool2YN(lPrefs.Gzip)); Msg('-i ID in filename [filename.dcm -> johndoe.nii]: Y,N = '+Bool2YN(lPrefs.AppendPatientName)); Msg('-m manually prompt user to specify output format [NIfTI input only]: Y,N = '+Bool2YN(lPrefs.ManualNIfTIConv)); Msg('-n output .nii file [if no, create .hdr/.img pair]: Y,N = '+Bool2YN(lPrefs.SingleNIIFile)); Msg('-o Output Directory, e.g. ''C:\TEMP'' (if unspecified, source directory is used)'); Msg('-p Protocol in filename [filename.dcm -> TFE_T1.nii]: Y,N = '+Bool2YN(lPrefs.AppendProtocolName)); Msg('-r Reorient image to nearest orthogonal: Y,N '); Msg('-s SPM2/Analyze not SPM5/NIfTI [ignored if ''-n y'']: Y,N = '+Bool2YN(lPrefs.SPM2)); Msg('-v Convert every image in the directory: Y,N = '+Bool2YN(lPrefs.EveryFile)); Msg('-x Reorient and crop 3D NIfTI images: Y,N = '+Bool2YN(lPrefs.Autocrop)); Msg(' You can also set defaults by editing '+lIniName); {$IFDEF UNIX} Msg('EXAMPLE: '+FilenameWOExt(paramstr(0))+' -a y /Users/Joe/Documents/dcm/IM_0116'); {$ELSE} Msg('EXAMPLE: '+FilenameWOExt(paramstr(0))+' -a y -o C:\TEMP C:\DICOM\input1.par C:\input2.par'); Msg('Hit to exit.'); MyReadLn; {$ENDIF} end; //proc ShowHelp (*procedure Testdcm2nii; var lIniName : string; lPrefs: TPrefs; begin lIniName := IniName;//DefaultsDir('')+ParseFileName(ExtractFilename(paramstr(0) ) )+'.ini'; IniFile(True,lIniName, lPrefs); ModifyAnalyze('C:\4d\4d.nii', lPrefs) end; *) function CustomIni: boolean; //returns true if user specifies a custom ini file var i: integer; lStr: string; begin result := false; if (ParamCount < 1) then exit; for i := 1 to ParamCount do begin lStr := UpcaseStr(ParamStr(I)); if (length(lStr)>1) and (lStr[1] = '-') and (lStr[2] = 'B') then result := true; end; end; procedure ProcessParamStrs; var lDir,lStr,lOutDir,lExt: String; {$IFNDEF UNIX}lStartTime: DWord;{$ENDIF} lHelpShown,lAbort,lSilent: boolean; lCommandChar: Char; lPrefs: TPrefs; P,I: integer; lIniName : string; begin if (ParamCount > 0) then ExitCode := 1;//assume error ... will be set to 0 on successful processing of any files... SetDefaultPrefs (lPrefs); DecimalSeparator := '.'; lHelpShown := false; lAbort := false; lSilent := false; if not CustomIni then begin //if the user specifies a custom ini file, do not load the default file.... lIniName := IniName;//DefaultsDir('')+ParseFileName(ExtractFilename(paramstr(0) ) )+'.ini'; if fileexists (lIniName) then IniFile(True,lIniName, lPrefs) else IniFile(True,changefileext(paramstr(0),'.init'), lPrefs); //this allows an administrator to create default startup end; lOutDir := ''; //dcm2nii will save nii as default, dcm2niiz will default to gzip, dcm2nii3d will make 3d files.. lStr := UpcaseStr(FilenameWOExt(paramstr(0))); I := length(lStr); if I > 1 then begin lCommandChar := lStr[I]; if (lCommandChar = 'G') or (lCommandChar = 'R') then lPrefs.SingleNIIFile := false else if (lCommandChar = 'Z') then lPrefs.Gzip := true; for P := 1 to I do if lStr[P] in ['0'..'9'] then lCommandChar := lStr[P]; if (lCommandChar = '3') then lPrefs.FourD := false end; //now read filename lStr := paramstr(0); lStr := extractfilename(lStr); lStr := string(StrUpper(PChar(lStr))) ; if (ParamCount > 0) then begin I := 0; repeat lStr := ''; repeat inc(I); if I = 1 then lStr := ParamStr(I) else begin if lStr <> '' then lStr := lStr +' '+ ParamStr(I) else lStr := ParamStr(I); end; if (length(lStr)>1) and (lStr[1] = '-') and (ParamCount > I) then begin //special command lCommandChar := UpCase(lStr[2]); inc(I); lStr := ParamStr(I); {$IFDEF UNIX} if (lCommandChar <> 'O') and (lCommandChar <> 'B') then begin lStr := string(StrUpper(PChar(lStr))) ; //do not upcase paths... end; {$ELSE} lStr := string(StrUpper(PChar(lStr))) ; {$ENDIF} case lCommandChar of '4': CharBool(lStr[1],lPrefs.FourD); 'A': CharBool(lStr[1],lPrefs.Anonymize); 'C': CharBool(lStr[1],lPrefs.CollapseFolders); 'D': CharBool(lStr[1],lPrefs.AppendDate); 'E': CharBool(lStr[1],lPrefs.AppendAcqSeries); 'F': CharBool(lStr[1],lPrefs.AppendFilename); 'G': CharBool(lStr[1],lPrefs.Gzip); 'I': CharBool(lStr[1],lPrefs.AppendPatientName); 'M': CharBool(lStr[1],lPrefs.ManualNIfTIConv); 'N': CharBool(lStr[1],lPrefs.SingleNIIFile); 'P': CharBool(lStr[1],lPrefs.AppendProtocolName); 'R': CharBool(lStr[1],lPrefs.enablereorient); 'S': CharBool(lStr[1],lPrefs.SPM2); 'V': CharBool(lStr[1],lPrefs.EveryFile); 'X': CharBool(lStr[1],lPrefs.Autocrop); 'B': begin //load INI file lIniName := lStr; if fileexists(lIniName) then begin IniFile(True,lIniName, lPrefs); end else Msg('0 ERROR: unable to find '+lIniName); end; 'O': begin //output directory lOutDir := ''; if direxists(lStr) then begin lOutDir := lStr; if lOutDir[length(lOutDir)] <> pathdelim then lOutDir := lOutDir + pathdelim; end; end; end; //case lStr[2] lStr := ''; end; //special command until (I=ParamCount) or (fileexists(lStr)) or (lAbort); if (not lPrefs.AppendPatientName) and (not lPrefs.AppendProtocolName) and (not lPrefs.AppendAcqSeries) and (not lPrefs.AppendDate) and (not lPrefs.AppendFilename) then begin lPrefs.AppendPatientName := true; lPrefs.AppendProtocolName := true; lPrefs.AppendDate := true; lPrefs.AppendAcqSeries := true; end; if direxists(lStr) then begin RecursiveFolderSearch(lStr,lOutDir,lPrefs,0); lPrefs.NameAppend := ''; end else if fileexists(lStr) then begin lDir := ExtractFileDir(lStr); if lDir = '' then begin //since fileexists, file is in working directory lDir := GetCurrentDir; Msg('0 files in working directory '+lDir); EnsureDirEndsWithPathDelim(lDir); if fileexists(lDir + lStr) then lStr := lDir+ lStr; end; lExt := UpCaseExt(lStr); if IsNiftiExt(lStr) then begin {$IFDEF GUI} MainForm.ConvertDCM2NII(lStr,lPrefs); //Msg('Please drag and drop NIfTI images onto dcm2niigui to convert them') {$ELSE} ModifyAnalyze(lStr,lPrefs); {$ENDIF} end else if (lExt = '.REC') or (lExt = '.PAR') then begin LoadFileListPARREC(lStr,lOutDir,lPrefs); if lPrefs.everyfile then exit; end else begin {$IFNDEF UNIX}lStartTime := GetTickCount; {$ENDIF} if lPrefs.everyfile then LoadFileList(lStr,lOutDir,lPrefs) else LoadParamFileList(lStr,lOutDir,lPrefs,I); {$IFNDEF UNIX}Msg('Time elapsed '+inttostr( GetTickCount-lStartTime)+'ms'); {$ENDIF} exit; //only process a single file end; end else if not (lSilent) then begin Msg('0 '+paramstr(0)+' ERROR: unable to find '+lStr); if not lHelpShown then Showhelp(lIniName, lPrefs); lHelpShown := true; end; until I >= ParamCount; end else begin //no parameters passed - show help ShowHelp(lIniName, lPrefs); IniFile(False,lIniName, lPrefs);//ensure latest version of preferences file is created... end;//param count > 0 end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/notes.txt0000664000175000017500000002660511546333464021110 0ustar michaelmichaelSiemens DICOM always uses scanner coordinates to specify diffusion directions according to Michael Harms [mharms@conte.wustl.edu] We to specify a custom set of directions using entries in a DiffusionVectors.txt file even for the VB13 and VB17 product ep2d_diff sequence, although I think this capability requires a separately purchased license. (What at one point was probably a WIP-only feature got built into the product sequence already by the time of VB13). Within that DiffusionVectors.txt file, one can specify whether the values are interpreted in a "xyz" or "prs" coordinate system. >From old WIP_ep2d_diff documentation I have the following: ------ For the directive CoordinateSystem two different values are allowed: • "xyz" specifies that this vector set is to be played out in the magnet coordinate system. • "prs" makes the sequence to use the rotation matrix of the current slice, i.e. the phase-read-slice gradient axis system is used. ------ Everyone here at WU that uses custom directions always plays them out in the XYZ coordinate system. HOWEVER, the coordinate system used in playing out the gradients should be irrelevant if one is reading the directions out of the **DICOM**. That is, even if someone specified a custom gradient set to play out in the PRS coordinate system, the directions in the DICOM should still be STORED in the +LPS DICOM coordinate system, meaning that they would still need to be rotated for an oblique acquisition. If your Siemen's contact, or your VD11 Skyra user indicates otherwise, then I think I'll pull my hair out!! Hi Chris, Jolinda, Ok, you guys are really not going to like me, but now that we seem to be reaching a consensus on the issue of rotation for VB13-VB17, I wanted to make sure you were aware of the issue of possibly incorrect bvecs under VB13, which is a completely orthogonal issue. First, I should note that the B_matrix entry in the CSA field of the DICOM is correct for VB13-VB17 (according to Siemens -- see below). These B_matrix entries include the impact of the imaging gradients on the B matrix. Unfortunately, the algorithm that Siemen's used to convert the B_matrix entry into an "equivalent" principle eigendirection yields incorrect results in some instances for VB13. You may have noticed that the 2- norm of DiffusionGradientDirections (thenceforth DGD, as stored in the DICOM) are not necessarily 1.000 for VB13 data. Both dcm2nii and MRIConvert return directions with a norm of exactly 1.0000, so both programs must be re-norming to exactly 1 behind the scenes as a final step prior to output. HOWEVER, norming the magnitude of the direction to 1 is NOT sufficient to recover from the error in Siemen's algorithm. For example, I have a case from a VB13 dataset (using a custom 30 direction set) where the norm for one of the DGD was only 0.16. For that case, I computed the first eigenvector of the B_matrix (using Matlab's 'princomp' function). The resulting direction (which should be the "correct" one) differed from the DGD entry in the DICOM by 12.5 degrees, which indicates that simply re-norming the reported DGD values to 1.0 is indeed NOT SUFFICIENT to guarantee "correct" bvecs for VB13 data. This is a semi-known issue, and is presumably the reason that the DicomToNrrd and Nipy converters include options to re-derive the direction from the B_matrix. i.e., http://mail.scipy.org/pipermail/nipy-devel/2010-September/004768.html and this snippet of email passed on to me by Darren Gitelman: ------- 3) When I corresponded with Mark Scully and Hans Johnson who wrote the dicom2nrrd convertor they suggested that there are standard Siemens tags for the gradients and there are gradients that one obtains from the B matrix. They say the former is wrong. I had written to them that when DTIstudio extracted the gradients from the mosaic image it agreed with dicom2nrrd but only if I did not use the dicom2nrrd option "useBMatrixGradientDirections" which they told me to use. There response was as follows: As to DTIstudio agreeing with the output of DicomToNrrd when run without useBMatrixGradientDirections, I assume DTIstudio is reading the standard tags for direction? If that's the case, it's getting the same wrong data as DicomToNrrd gets when it doesn't use the BMatrix. The whole reason we made it possible to use the BMatrix to calculate the gradients and B values is because the standard tags were wrong in a subset of our Siemens scans. -------- Unfortunately, I have no idea how frequently the DGD entries may be wrong under VB13, and whether or not custom gradient sets are more likely to be affected by the bug than "built-in" gradient sets. I'm actually going to email Mark and Hans next to see if they have a sense for that. Also, I should mention that I was told by Siemen's that the DGD for VB17 are correct, and for VB15 are "correct" up to polarity. Specifically, here is what Stefan Huwer of Siemen's emailed to me regarding this issue: --------- regarding software versions and issues with the diffusion gradient direction: VB13: B_matrix field correct, diffusion_direction sometimes wrong. VB15: B_matrix field correct, diffusion_direction correct (up to polarity). VB17: B_matrix correct, diffusion_direction correct -------- So, why do I bring this all up? First, you (and others) should be aware of the issue, and perhaps I should make some additions to your Word document to explain the issue. That said, I'm not expecting that either MRIConvert or dcm2nii would be modified to include an option to derive the directions from the B_matrix, as that is a rather major software addition. However, it might be appropriate to include a warning message along the lines of the following for VB13 data: "Warning: bvecs are sometimes wrong for VB13 data, due to a bug in the algorithm by which Siemen's converted the B_matrix to a principle eigendirection. The frequency and extent of this problem is unknown at this time". And for VB15 data: "Warning: Polarity of the bvecs may possibly be wrong for VB15 data." cheers, -MH -- Michael Harms, Ph.D. -------------------------------------------------------------------- Conte Center for the Neuroscience of Mental Disorders Washington University School of Medicine Department of Psychiatry, Box 8134 Renard Hospital, Room 6604 Tel: 314-747-6173 660 South Euclid Ave. Fax: 314-747-2182 St. Louis, MO 63110 Email: mharms@wustl.edu -------------------------------------------------------------------- FYI: It sounds like Hans Johnson and Mark Scully (emails in header below) have probably seen just about every "modern" vendor/software combination possible. So, they might be a resource if you wanted to understand GE and Philips better, although it sounds like they might not have much experience with the oblique acquisition issue. cheers, -MH -------- Forwarded Message -------- From: Johnson, Hans J To: Michael Harms , Scully, Mark S Cc: Joy Matsui Subject: Re: DicomToNrrd specifics Date: Thu, 31 Mar 2011 21:30:26 +0000 Michael, We feel your pain. We are working on a 32 site study, and we see just about every kind of data possible. I'm getting this from memory, so take that into consideration. I believe that VB13 had 2 gradients incorrect (gradient 14,15 in our 30 direction scan). The "useBMatrixGradientDirections" does not take scan obliquenss into account, it simply recomputes the values that should have been in the public dicom tags in the first place. I am saying this without every having dealt with oblique DWI scans. ==== Just wait until you get to deal with phillips data :) It is really fun! -- Hans J. Johnson, Ph.D. hans-johnson@uiowa.edu Assistant Professor of Psychiatry University of Iowa Carver College of Medicine W278 GH, 200 Hawkins Drive Iowa City, Iowa 52242 Phone: 319-353-8587 -----Original Message----- From: Michael Harms Date: Thu, 31 Mar 2011 15:29:47 -0500 To: Mark Scully , Hans Johnson Cc: Subject: DicomToNrrd specifics Hello Mark and Hans, I've been conversing with Jolinda Smith (MRIConvert), Chris Rorden (dcm2nii) and others (Darren Gittelman, Fred Tam) regarding some issues with getting bvecs from Siemens VB13, VB15, and VB17 DICOMs. Darren indicated to me that he had the following correspondence with you previously: ---------- 3) When I corresponded with Mark Scully and Hans Johnson who wrote the dicom2nrrd convertor they suggested that there are standard Siemens tags for the gradients and there are gradients that one obtains from the B matrix. They say the former is wrong. I had written to them that when DTIstudio extracted the gradients from the mosaic image it agreed with dicom2nrrd but only if I did not use the dicom2nrrd option "useBMatrixGradientDirections" which they told me to use. There response was as follows: As to DTIstudio agreeing with the output of DicomToNrrd when run without useBMatrixGradientDirections, I assume DTIstudio is reading the standard tags for direction? If that's the case, it's getting the same wrong data as DicomToNrrd gets when it doesn't use the BMatrix. The whole reason we made it possible to use the BMatrix to calculate the gradients and B values is because the standard tags were wrong in a subset of our Siemens scans. -------- It is my understanding, in emails with Stefan Huwer at Siemens, that the issue of possibly incorrect entries in the DiffusionGradientDirection ("DGD") entry in the CSA portion of the Siemen's DICOM, is only for VB13 (although the polarity of the DGD's can be off by 180 degrees for VB15 data). Is that your understanding and experience as well? Do you have any empirical sense of the frequency and extent of this problem under VB13? e.g., What percentage of directions are affected on average? And are certain directions consistently affected across different sessions? Also, on a different different issue, does DicomToNrrd rotate the DGD entries (or alternatively the B_matrix if using the "useBMatrixGradientDirections" option) for oblique acquisitions for VB13-VB17? [I know this latter issue would be easy enough to test, but I've already spent a ton of time on this annoying issue, so I hope you don't mind me just asking you directly, so that I don't have to learn another dicom converter. I'm trying to see if I can't get agreement among various converter developers regarding the necessity of rotating the DGD entries (or B_matrix) for oblique VB13-VB17 acquisitions -- just today I brought Jolinda and Chris around to this position, so I wanted to see what your understanding was of the Siemens/ oblique acquisition/ bvec rotation issue]. Thanks! -MH -- Michael Harms, Ph.D. -------------------------------------------------------------------- Conte Center for the Neuroscience of Mental Disorders Washington University School of Medicine Department of Psychiatry, Box 8134 Renard Hospital, Room 6604 Tel: 314-747-6173 660 South Euclid Ave. Fax: 314-747-2182 St. Louis, MO 63110 Email: mharms@wustl.edu -------------------------------------------------------------------- mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nii_reslice.pas0000664000175000017500000004157311326434462022206 0ustar michaelmichaelunit nii_reslice; interface {$H+} uses niftiutil,define_types,sysutils,dicomtypes,prefs; //function ResliceImgNIfTI (lTargetImgName,lSrcImgName,lOutputName: string): boolean; function Reslice2Targ (lSrcName,lTargetName,lDestName: string; lPrefs: TPrefs):string; implementation uses GraphicsMathLibrary, dialogsx; function Hdr2Mat (lHdr: TNIFTIhdr): TMatrix; begin Result := Matrix3D ( lHdr.srow_x[0],lHdr.srow_x[1],lHdr.srow_x[2],lHdr.srow_x[3], // 3D "graphics" matrix lHdr.srow_y[0],lHdr.srow_y[1],lHdr.srow_y[2],lHdr.srow_y[3], // 3D "graphics" matrix lHdr.srow_z[0],lHdr.srow_z[1],lHdr.srow_z[2],lHdr.srow_z[3], // 3D "graphics" matrix 0,0,0,1); end; (*procedure ReportMatrix (lM:TMatrix); const kCR = chr (13); begin showmessage(RealToStr(lM.matrix[1,1],6)+','+RealToStr(lM.matrix[1,2],6)+','+RealToStr(lM.matrix[1,3],6)+','+RealToStr(lM.matrix[1,4],6)+kCR+ RealToStr(lM.matrix[2,1],6)+','+RealToStr(lM.matrix[2,2],6)+','+RealToStr(lM.matrix[2,3],6)+','+RealToStr(lM.matrix[2,4],6)+kCR+ RealToStr(lM.matrix[3,1],6)+','+RealToStr(lM.matrix[3,2],6)+','+RealToStr(lM.matrix[3,3],6)+','+RealToStr(lM.matrix[3,4],6)+kCR +RealToStr(lM.matrix[4,1],6)+','+RealToStr(lM.matrix[4,2],6)+','+RealToStr(lM.matrix[4,3],6)+','+RealToStr(lM.matrix[4,4],6) ); end; *) (* procedure SPMmat(var lDestMat: TMatrix); //SPM matrices are indexed from 1 //This function is only useful for direct comparisons with SPM var lTemp,lVS: TMatrix; begin lVS := Matrix3D (1,0,0,-1, 0,1,0,-1, 0,0,1,-1, 0,0,0,1);//VoxelShift lTemp := lDestMat; lDestMat := MultiplyMatrices(lTemp,lVS); end;*) procedure Coord(var lV: TVector; var lMat: TMatrix); //transform X Y Z by matrix var lXi,lYi,lZi: single; begin lXi := lV.x; lYi := lV.y; lZi := lV.z; lV.x := (lXi*lMat.matrix[1][1]+lYi*lMat.matrix[1][2]+lZi*lMat.matrix[1][3]+lMat.matrix[1][4]); lV.y := (lXi*lMat.matrix[2][1]+lYi*lMat.matrix[2][2]+lZi*lMat.matrix[2][3]+lMat.matrix[2][4]); lV.z := (lXi*lMat.matrix[3][1]+lYi*lMat.matrix[3][2]+lZi*lMat.matrix[3][3]+lMat.matrix[3][4]); end; procedure Transposemat(var lMat: TMatrix); var lTemp: TMatrix; i,j: integer; begin lTemp := lMat; for i := 1 to lMat.size do for j := 1 to lMat.size do lMat.matrix[i,j] := lTemp.matrix[j,i]; end; PROCEDURE gaussj(VAR a: TMatrix);//Invert a Matrix - see Numerical Recipes VAR big,dum,pivinv: real; n,i,icol,irow,j,k,l,ll: integer; indxc,indxr,ipiv: array [1..4] of integer; BEGIN icol := 1;//not used - avoids compiler warning irow := 1;//not used - avoids compiler warning n := a.size; FOR j := 1 TO n DO BEGIN ipiv[j] := 0 END; FOR i := 1 TO n DO BEGIN big := 0.0; FOR j := 1 TO n DO BEGIN IF (ipiv[j] <> 1) THEN BEGIN FOR k := 1 TO n DO BEGIN IF (ipiv[k] = 0) THEN BEGIN IF (abs(a.matrix[j,k]) >= big) THEN BEGIN big := abs(a.matrix[j,k]); irow := j; icol := k END END ELSE IF (ipiv[k] > 1) THEN BEGIN writeln('pause 1 in GAUSSJ - singular matrix'); readln END END END END; ipiv[icol] := ipiv[icol]+1; IF (irow <> icol) THEN BEGIN FOR l := 1 TO n DO BEGIN dum := a.matrix[irow,l]; a.matrix[irow,l] := a.matrix[icol,l]; a.matrix[icol,l] := dum END; END; indxr[i] := irow; indxc[i] := icol; IF (a.matrix[icol,icol] = 0.0) THEN BEGIN Msg('pause 2 in GAUSSJ - singular matrix'); exit; END; pivinv := 1.0/a.matrix[icol,icol]; a.matrix[icol,icol] := 1.0; FOR l := 1 TO n DO BEGIN a.matrix[icol,l] := a.matrix[icol,l]*pivinv END; FOR ll := 1 TO n DO BEGIN IF (ll <> icol) THEN BEGIN dum := a.matrix[ll,icol]; a.matrix[ll,icol] := 0.0; FOR l := 1 TO n DO BEGIN a.matrix[ll,l] := a.matrix[ll,l]-a.matrix[icol,l]*dum END; END END END; FOR l := n DOWNTO 1 DO BEGIN IF (indxr[l] <> indxc[l]) THEN BEGIN FOR k := 1 TO n DO BEGIN dum := a.matrix[k,indxr[l]]; a.matrix[k,indxr[l]] := a.matrix[k,indxc[l]]; a.matrix[k,indxc[l]] := dum END END END END; procedure SubVec (var lVx: TVector; lV0: TVector); begin lVx.x := lVx.x - lV0.x; lVx.y := lVx.y - lV0.y; lVx.z := lVx.z - lV0.z; end; function Voxel2Voxel (var lDestHdr,lSrcHdr: TNIFTIhdr): TMatrix; //returns matrix for transforming voxels from one image to the other image //results are in VOXELS not mm var lV0,lVx,lVy,lVz: TVector; lDestMat,lSrcMatInv,lSrcMat: TMatrix; begin //Step 1 - compute source coordinates in mm for 4 voxels //the first vector is at 0,0,0, with the //subsequent voxels being left, up or anterior lDestMat := Hdr2Mat(lDestHdr); //SPMmat(lDestMat); lV0 := Vector3D (0,0,0); lVx := Vector3D (1,0,0); lVy := Vector3D (0,1,0); lVz := Vector3D (0,0,1); Coord(lV0,lDestMat); Coord(lVx,lDestMat); Coord(lVy,lDestMat); Coord(lVz,lDestMat); lSrcMat := Hdr2Mat(lSrcHdr); //SPMmat(lSrcMat); lSrcMatInv := lSrcMat; gaussj(lSrcMatInv); //the vectors should be rows not columns.... //therefore we transpose the matrix Transposemat(lSrcMatInv); //the 'transform' multiplies the vector by the matrix lV0 := Transform (lV0,lSrcMatInv); lVx := Transform (lVx,lSrcMatInv); lVy := Transform (lVy,lSrcMatInv); lVz := Transform (lVz,lSrcMatInv); //subtract each vector from the origin // this reveals the voxel-space influence for each dimension SubVec(lVx,lV0); SubVec(lVy,lV0); SubVec(lVz,lV0); result := Matrix3D(lVx.x,lVy.x,lVz.x,lV0.x, lVx.y,lVy.y,lVz.y,lV0.y, lVx.z,lVy.z,lVz.z,lV0.z, 0,0,0,1); end; procedure CopyHdrMat(var lTarg,lDest: TNIfTIHdr); //destination has dimensions and rotations of destination var lI: integer; begin //destination will have dimensions of target lDest.dim[0] := 3; //3D for lI := 1 to 3 do lDest.dim[lI] := lTarg.dim[lI]; lDest.dim[4] := 1; //3D //destination will have pixdim of target for lI := 0 to 7 do lDest.pixdim[lI] := lTarg.pixdim[lI]; lDest.xyzt_units := lTarg.xyzt_units; //e.g. mm and sec lDest.qform_code := lTarg.qform_code; lDest.sform_code := lTarg.sform_code; lDest.quatern_b := lTarg.quatern_b; lDest.quatern_c := lTarg.quatern_c; lDest.quatern_d := lTarg.quatern_d; lDest.qoffset_x := lTarg.qoffset_x; lDest.qoffset_y := lTarg.qoffset_y; lDest.qoffset_z := lTarg.qoffset_z; for lI := 0 to 3 do begin lDest.srow_x[lI] := lTarg.srow_x[lI]; lDest.srow_y[lI] := lTarg.srow_y[lI]; lDest.srow_z[lI] := lTarg.srow_z[lI]; end; end; function Reslice2Targ (lSrcName,lTargetName,lDestName: string; lPrefs: TPrefs):string; var lPos,lXYs,lXYZs,lXs,lYs,lZs,lXi,lYi,lZi,lX,lY,lZ, lXo,lYo,lZo,lMinY,lMinZ,lMaxY,lMaxZ,lSrcOffset,lBPP,lXYZ: integer; lXrM1,lYrM1,lZrM1,lXreal,lYreal,lZreal, lZx,lZy,lZz,lYx,lYy,lYz, lInMinX,lInMinY,lInMinZ, lOutMinX,lOutMinY,lOutMinZ: single; lXx,lXy,lXz: Singlep0; l32fs,l32f : SingleP; l32is,l32i : LongIntP; l16is,l16i : SmallIntP; l8i,l8is,lSrcBuffer,lBuffUnaligned,lBuffAligned: bytep; lMat: TMatrix; lTargHdr,lSrcHdr,lDestHdr: TNIFTIhdr; lByteSwap: boolean; begin result := ''; if not NIFTIhdr_LoadHdr (lSrcname, lSrcHdr, lByteSwap) then exit; if not NIFTIhdr_LoadHdr (lTargetName, lTargHdr, lByteSwap) then exit; case lSrcHdr.datatype of kDT_UNSIGNED_CHAR : lBPP := 1; kDT_SIGNED_SHORT: lBPP := 2; kDT_SIGNED_INT:lBPP := 4; kDT_FLOAT: lBPP := 4; else begin Msg('NII reslice error: datatype not supported.'); exit; end; end; //case lMat := Voxel2Voxel (lTargHdr,lSrcHdr); lDestHdr := lSrcHdr; //destination has the comments and voxel BPP of source CopyHdrMat(lTargHdr,lDestHdr);//destination has dimensions and rotations of destination lXs := lSrcHdr.Dim[1]; lYs := lSrcHdr.Dim[2]; lZs := lSrcHdr.Dim[3]; lXYs:=lXs*lYs; //slicesz lXYZs := lXYs*lZs; lX := lDestHdr.Dim[1]; lY := lDestHdr.Dim[2]; lZ := lDestHdr.Dim[3]; lDestHdr.Dim[4] := 1; //load dataset if not NIFTIhdr_LoadImg (lSrcName, lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap) then exit; NIFTIhdr_UnswapImg(lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap);//interpolation requires data is in native endian l8is := (@lSrcBuffer^[lSrcOffset+1]); GetMem(lBuffUnaligned ,(lBPP*lX*lY*lZ) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := Align(lBuffUnaligned,16); // not commented - check this {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lPos := 1; case lSrcHdr.datatype of kDT_UNSIGNED_CHAR : l8i := @lBuffAligned^[kNIIImgOffset+lPos]; kDT_SIGNED_SHORT: l16i := SmallIntP(@lBuffAligned^[kNIIImgOffset+lPos] ); kDT_SIGNED_INT:l32i := LongIntP(@lBuffAligned^[kNIIImgOffset+lPos] ); kDT_FLOAT: l32f := SingleP(@lBuffAligned^[kNIIImgOffset+lPos] ); end; //case case lSrcHdr.datatype of //kDT_UNSIGNED_CHAR : l8is := l8is; kDT_SIGNED_SHORT: l16is := SmallIntP(l8is ); kDT_SIGNED_INT:l32is := LongIntP(l8is ); kDT_FLOAT: l32fs := SingleP(l8is ); end; //case //next clear image case lSrcHdr.datatype of kDT_UNSIGNED_CHAR : for lPos := 1 to (lX*lY*lZ) do l8i^[lPos] := 0; kDT_SIGNED_SHORT: for lPos := 1 to (lX*lY*lZ) do l16i^[lPos] := 0; kDT_SIGNED_INT:for lPos := 1 to (lX*lY*lZ) do l32i^[lPos] := 0; kDT_FLOAT: for lPos := 1 to (lX*lY*lZ) do l32f^[lPos] := 0; end; //case //now we can apply the transforms... //build lookup table - speed up inner loop getmem(lXx, lX*sizeof(single)); getmem(lXy, lX*sizeof(single)); getmem(lXz, lX*sizeof(single)); for lXi := 0 to (lX-1) do begin lXx^[lXi] := lXi*lMat.matrix[1][1]; lXy^[lXi] := lXi*lMat.matrix[2][1]; lXz^[lXi] := lXi*lMat.matrix[3][1]; end; //compute trilinear interpolation lPos := 0; for lZi := 0 to (lZ-1) do begin //these values are the same for all voxels in the slice // compute once per slice lZx := lZi*lMat.matrix[1][3]; lZy := lZi*lMat.matrix[2][3]; lZz := lZi*lMat.matrix[3][3]; for lYi := 0 to (lY-1) do begin //these values change once per row // compute once per row lYx := lYi*lMat.matrix[1][2]; lYy := lYi*lMat.matrix[2][2]; lYz := lYi*lMat.matrix[3][2]; for lXi := 0 to (lX-1) do begin //compute each column inc(lPos); lXreal := (lXx^[lXi]+lYx+lZx+lMat.matrix[1][4]); lYreal := (lXy^[lXi]+lYy+lZy+lMat.matrix[2][4]); lZreal := (lXz^[lXi]+lYz+lZz+lMat.matrix[3][4]); //need to test Xreal as -0.01 truncates to zero if (lXreal >= 0) and (lYreal >= 0{1}) and (lZreal >= 0{1}) and (lXreal < (lXs -1)) and (lYreal < (lYs -1) ) and (lZreal < (lZs -1)) then begin //compute the contribution for each of the 8 source voxels //nearest to the target lXo := trunc(lXreal); lYo := trunc(lYreal); lZo := trunc(lZreal); lXreal := lXreal-lXo; lYreal := lYreal-lYo; lZreal := lZreal-lZo; lXrM1 := 1-lXreal; lYrM1 := 1-lYreal; lZrM1 := 1-lZreal; lMinY := lYo*lXs; lMinZ := lZo*lXYs; lMaxY := lMinY+lXs; lMaxZ := lMinZ+lXYs; inc(lXo);//images incremented from 1 not 0 case lSrcHdr.datatype of kDT_UNSIGNED_CHAR : begin// l8is := l8is; l8i^[lPos] := round ( {all min} ( (lXrM1*lYrM1*lZrM1)*l8is^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*l8is^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*l8is^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*l8is^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*l8is^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*l8is^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*l8is^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*l8is^[lXo+1+lMaxY+lMaxZ]) ); end; kDT_SIGNED_SHORT: begin l16i^[lPos] := round ( {all min} ( (lXrM1*lYrM1*lZrM1)*l16is^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*l16is^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*l16is^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*l16is^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*l16is^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*l16is^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*l16is^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*l16is^[lXo+1+lMaxY+lMaxZ]) ); end; kDT_SIGNED_INT:begin l32i^[lPos] := round ( {all min} ( (lXrM1*lYrM1*lZrM1)*l32is^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*l32is^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*l32is^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*l32is^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*l32is^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*l32is^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*l32is^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*l32is^[lXo+1+lMaxY+lMaxZ]) ); end; kDT_FLOAT: begin //note - we do not round results - all intensities might be frational... l32f^[lPos] := ( {all min} ( (lXrM1*lYrM1*lZrM1)*l32fs^[lXo+lMinY+lMinZ]) {x+1}+((lXreal*lYrM1*lZrM1)*l32fs^[lXo+1+lMinY+lMinZ]) {y+1}+((lXrM1*lYreal*lZrM1)*l32fs^[lXo+lMaxY+lMinZ]) {z+1}+((lXrM1*lYrM1*lZreal)*l32fs^[lXo+lMinY+lMaxZ]) {x+1,y+1}+((lXreal*lYreal*lZrM1)*l32fs^[lXo+1+lMaxY+lMinZ]) {x+1,z+1}+((lXreal*lYrM1*lZreal)*l32fs^[lXo+1+lMinY+lMaxZ]) {y+1,z+1}+((lXrM1*lYreal*lZreal)*l32fs^[lXo+lMaxY+lMaxZ]) {x+1,y+1,z+1}+((lXreal*lYreal*lZreal)*l32fs^[lXo+1+lMaxY+lMaxZ]) ); end; end; //case end; //if voxel is in source image's bounding box end;//z end;//y end;//z //release lookup tables freemem(lXx); freemem(lXy); freemem(lXz); //check to see if image is empty... lPos := 1; case lSrcHdr.datatype of kDT_UNSIGNED_CHAR : while (lPos <= (lX*lY*lZ)) and (l8i^[lPos] = 0) do inc(lPos); kDT_SIGNED_SHORT: while (lPos <= (lX*lY*lZ)) and (l16i^[lPos] = 0) do inc(lPos); kDT_SIGNED_INT:while (lPos <= (lX*lY*lZ)) and (l32i^[lPos] = 0) do inc(lPos); kDT_FLOAT: while (lPos <= (lX*lY*lZ)) and (l32f^[lPos] = 0) do inc(lPos); end; //case if lPos <= (lX*lY*lZ) then begin //image not empty result := SaveNIfTICore (lDestName, lBuffAligned, kNIIImgOffset+1, lDestHdr, lPrefs,lByteSwap); end else begin Msg('no voxels in output'); end; Freemem(lBuffUnaligned); Freemem(lSrcBuffer); end; (*function ResliceImgNIfTI (lTargetImgName,lSrcImgName,lOutputName: string): boolean; label 666; var lReslice : boolean; lDestHdr,lSrcHdr: TMRIcroHdr; lSrcMat,lDestMat,lSrcMatINv,lDestMatInv,lMat: TMatrix; lOffX,lOffY,lOffZ: single; D: double; begin result := false; if not fileexists(lTargetImgName) then exit; if not fileexists(lSrcImgName) then exit; ImgForm.CloseImagesClick(nil); lReslice := gBGImg.ResliceOnLoad; gBGImg.ResliceOnLoad := false; //if not HdrForm.OpenAndDisplayHdr(lTargetImgName,lDestHdr) then goto 666; if not NIFTIhdr_LoadHdr(lTargetImgName, lDestHdr) then goto 666; if not NIFTIhdr_LoadHdr(lSrcImgName, lSrcHdr) then goto 666; if not ImgForm.OpenAndDisplayImg(lSrcImgName,false) then exit; if not Qx(lDestHdr,lSrcHdr,lOutputName) then goto 666; result := true; 666: if not result then showmessage('Error applying transform '+lSrcImgName+'->'+lTargetImgName); gBGImg.ResliceOnLoad := lReslice; end; *) end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nii_orient.pas0000664000175000017500000007005711531236300022044 0ustar michaelmichaelunit nii_orient; {$H+} //reorients a NIfTI image to canonical space ... //closest to canonical rotation matrix [1 0 0; 0 1 0; 0 0 1] interface uses {$IFDEF FPC}gzio2,{$ENDIF} SysUtils,define_types,dicomtypes,niftiutil,GraphicsMathLibrary,prefs; function Reorient(var lHdrName: string; var lHdr: TNIFTIhdr; lPrefs: TPrefs; lOverwrite,lForce: boolean): string; //function SuperReorient(var lHdrName: string; lPrefs: TPrefs):string; function LRFlip(lFilename: string; lPrefs: TPrefs): boolean; implementation uses dialogsx; (*procedure Mx(var lM: TMatrix); begin Msg('=['+ floattostr(lM.matrix[1,1])+', '+floattostr(lM.matrix[1,2])+', '+floattostr(lM.matrix[1,3])+', '+floattostr(lM.matrix[1,4])+'; '+ floattostr(lM.matrix[2,1])+', '+floattostr(lM.matrix[2,2])+', '+floattostr(lM.matrix[2,3])+', '+floattostr(lM.matrix[2,4])+'; '+ floattostr(lM.matrix[3,1])+', '+floattostr(lM.matrix[3,2])+', '+floattostr(lM.matrix[3,3])+', '+floattostr(lM.matrix[3,4])+'; '+ ' 0, 0, 0, 1]'); end;*) function NIfTIAlignedM (var lM: TMatrix): boolean; //check that diagonals are positive and all other cells are zero //negative diagonals suggests flipping... //non-negative other cells suggests the image is not pure axial var lr,lc: integer; begin result := false; for lr := 1 to 3 do for lc := 1 to 3 do begin if (lr = lc) and (lM.matrix[lr,lc] <= 0) then exit; if (lr <> lc) and (lM.matrix[lr,lc] <> 0) then exit; end; result := true; end; function NIfTIAligned (var lHdr: TNIFTIhdr): boolean; //check that diagonals are positive and all other cells are zero //negative diagonals suggests flipping... //non-negative other cells suggests the image is not pure axial var lM: TMatrix; begin lM := Matrix3D ( lHdr.srow_x[0],lHdr.srow_x[1],lHdr.srow_x[2],lHdr.srow_x[3], lHdr.srow_y[0],lHdr.srow_y[1],lHdr.srow_y[2],lHdr.srow_y[3], lHdr.srow_z[0],lHdr.srow_z[1],lHdr.srow_z[2],lHdr.srow_z[3], 0,0,0,1); result := NIfTIAlignedM(lM); end; procedure FromMatrix (M: TMatrix; var m11,m12,m13, m21,m22,m23, m31,m32,m33: DOUBLE) ; BEGIN m11 := M.Matrix[1,1]; m12 := M.Matrix[1,2]; m13 := M.Matrix[1,3]; m21 := M.Matrix[2,1]; m22 := M.Matrix[2,2]; m23 := M.Matrix[2,3]; m31 := M.Matrix[3,1]; m32 := M.Matrix[3,2]; m33 := M.Matrix[3,3]; END {FromMatrix3D}; function nifti_mat44_orthogx( lR :TMatrix; lPrefs: TPrefs): TMatrix; //returns rotation matrix required to orient image so it is aligned nearest to the identity matrix = // 1 0 0 0 // 0 1 0 0 // 0 0 1 0 // 0 0 0 1 //Therefore, image is approximately oriented in space var lrow,lcol,lMaxRow,lMaxCol,l2ndMaxRow,l2ndMaxCol,l3rdMaxRow,l3rdMaxCol: integer; r11,r12,r13 , r21,r22,r23 , r31,r32,r33, val,lAbsmax,lAbs: double; Q,Flip: TMatrix; //3x3 begin // load 3x3 matrix into local variables FromMatrix(lR,r11,r12,r13,r21,r22,r23,r31,r32,r33); Q := Matrix2D( r11,r12,r13,r21,r22,r23,r31,r32,r33); // normalize row 1 val := Q.matrix[1,1]*Q.matrix[1,1] + Q.matrix[1,2]*Q.matrix[1,2] + Q.matrix[1,3]*Q.matrix[1,3] ; if( val > 0.0 )then begin val := 1.0 / sqrt(val) ; Q.matrix[1,1] := Q.matrix[1,1]*val ; Q.matrix[1,2] := Q.matrix[1,2]*val ; Q.matrix[1,3] := Q.matrix[1,3]*val ; end else begin Q.matrix[1,1] := 1.0 ; Q.matrix[1,2] := 0.0; Q.matrix[1,3] := 0.0 ; end; // normalize row 2 val := Q.matrix[2,1]*Q.matrix[2,1] + Q.matrix[2,2]*Q.matrix[2,2] + Q.matrix[2,3]*Q.matrix[2,3] ; if( val > 0.0 ) then begin val := 1.0 / sqrt(val) ; Q.matrix[2,1] := Q.matrix[2,1]* val ; Q.matrix[2,2] := Q.matrix[2,2] * val ; Q.matrix[2,3] := Q.matrix[2,3] * val ; end else begin Q.matrix[2,1] := 0.0 ; Q.matrix[2,2] := 1.0 ; Q.matrix[2,3] := 0.0 ; end; // normalize row 3 val := Q.matrix[3,1]*Q.matrix[3,1] + Q.matrix[3,2]*Q.matrix[3,2] + Q.matrix[3,3]*Q.matrix[3,3] ; if( val > 0.0 ) then begin val := 1.0 / sqrt(val) ; Q.matrix[3,1] := Q.matrix[3,1] *val ; Q.matrix[3,2] := Q.matrix[3,2] *val ; Q.matrix[3,3] := Q.matrix[3,3] *val ; end else begin Q.matrix[3,1] := Q.matrix[1,2]*Q.matrix[2,3] - Q.matrix[1,3]*Q.matrix[2,2] ; //* cross */ Q.matrix[3,2] := Q.matrix[1,3]*Q.matrix[2,1] - Q.matrix[1,1]*Q.matrix[2,3] ; //* product */ Q.matrix[3,3] := Q.matrix[1,1]*Q.matrix[2,2] - Q.matrix[1,2]*Q.matrix[2,1] ; end; //next - find closest orthogonal coordinates - each matrix cell must be 0,-1 or 1 //First: find axis most aligned to a principal axis lAbsmax := 0; lMaxRow := 1; lMaxCol := 1; for lrow := 1 to 3 do begin for lcol := 1 to 3 do begin lAbs := abs(Q.matrix[lrow,lcol]); if lAbs > lAbsMax then begin lAbsmax := lAbs; lMaxRow := lRow; lMaxCol := lCol; end; end; //for rows end; //for columns //Second - find find axis that is 2nd closest to principal axis lAbsmax := 0; l2ndMaxRow := 2; l2ndMaxCol := 2; for lrow := 1 to 3 do begin for lcol := 1 to 3 do begin if (lrow <> lMaxRow) and (lCol <> lMaxCol) then begin lAbs := abs(Q.matrix[lrow,lcol]); if lAbs > lAbsMax then begin lAbsmax := lAbs; l2ndMaxRow := lRow; l2ndMaxCol := lCol; end; //new max end; //do not check MaxRow/MaxCol end; //for rows end; //for columns //next - no degrees of freedom left: third prinicple axis is the remaining axis if ((lMaxRow = 1) or (l2ndMaxRow = 1)) and ((lMaxRow = 2) or (l2ndMaxRow = 2)) then l3rdMaxRow := 3 else if ((lMaxRow = 1) or (l2ndMaxRow = 1)) and ((lMaxRow = 3) or (l2ndMaxRow = 3)) then l3rdMaxRow := 2 else l3rdMaxRow := 1; if ((lMaxCol = 1) or (l2ndMaxCol = 1)) and ((lMaxCol = 2) or (l2ndMaxCol = 2)) then l3rdMaxCol := 3 else if ((lMaxCol = 1) or (l2ndMaxCol = 1)) and ((lMaxCol = 3) or (l2ndMaxCol = 3)) then l3rdMaxCol := 2 else l3rdMaxCol := 1; //finally, fill in our rotation matrix //cells in the canonical rotation transform can only have values 0,1,-1 result := Matrix3D( 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1); if Q.matrix[lMaxRow,lMaxCol] < 0 then result.matrix[lMaxRow,lMaxCol] := -1 else result.matrix[lMaxRow,lMaxCol] := 1; if Q.matrix[l2ndMaxRow,l2ndMaxCol] < 0 then result.matrix[l2ndMaxRow,l2ndMaxCol] := -1 else result.matrix[l2ndMaxRow,l2ndMaxCol] := 1; if Q.matrix[l3rdMaxRow,l3rdMaxCol] < 0 then result.matrix[l3rdMaxRow,l3rdMaxCol] := -1 else result.matrix[l3rdMaxRow,l3rdMaxCol] := 1; if lPrefs.OrthoFlipXDim then begin Flip := Matrix3D(-1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1); Q := result; result := multiplymatrices(Flip,Q); end; end; FUNCTION QuickInvertMatrix3D (CONST Input:TMatrix): TMatrix; //http://www.cellperformance.com/articles/2006/06/a_4x4_matrix_inverse_1.html //Most of the time in the video games, programmers are not doing a standard inverse matrix. //It is too expensive. Instead, to inverse a matrix, they consider it as orthonormal //and they just do a 3x3 transpose of the rotation part with a dot product for the translation. //Sometimes the full inverse algorithm is necessary.... var i,j: integer; begin result.size := Input.size; for i := 1 to 3 do for j := 1 to 3 do result.matrix[i,j] := input.matrix[j,i]; //next - fill in edge if 3D if result.size <> size3D then exit; //do not fill in final column for 2D matrices for i := 1 to 3 do result.matrix[4,i] := 0; for i := 1 to 3 do result.matrix[i,4] := 0; result.matrix[4,4] := 1; end; procedure FindMatrixPt (lX,lY,lZ: single; var lXout,lYOut,lZOut: single; var lMatrix: TMatrix); begin lXOut := (lX*lMatrix.matrix[1,1])+(lY*lMatrix.matrix[1,2])+(lZ*lMatrix.matrix[1,3])+lMatrix.matrix[1,4]; lYOut := (lX*lMatrix.matrix[2,1])+(lY*lMatrix.matrix[2,2])+(lZ*lMatrix.matrix[2,3])+lMatrix.matrix[2,4]; lZOut := (lX*lMatrix.matrix[3,1])+(lY*lMatrix.matrix[3,2])+(lZ*lMatrix.matrix[3,3])+lMatrix.matrix[3,4]; end; procedure CheckMin(var lX,lY,lZ,lXMin,lYMin,lZMin: single); begin if lX < lXMin then lXMin := lX; if lY < lYMin then lYMin := lY; if lZ < lZMin then lZMin := lZ; end; procedure Mins (var lMatrix: TMatrix; var lHdr: TNIFTIhdr; var lXMin,lYMin,lZMin: single); var lPos,lXc,lYc,lZc: integer; lx,ly,lz: single; begin FindMatrixPt(0,0,0,lX,lY,lZ,lMatrix); lXMin := lX; lYMin := lY; lZMin := lZ; for lPos := 1 to 7 do begin if odd(lPos) then lXc := lHdr.Dim[1]-1 else lXc := 0; if odd(lPos shr 1) then lYc := lHdr.Dim[2]-1 else lYc := 0; if odd(lPos shr 2) then lZc := lHdr.Dim[3]-1 else lZc := 0; FindMatrixPt(lXc,lYc,lZc,lX,lY,lZ,lMatrix); CheckMin(lX,lY,lZ,lXMin,lYMin,lZMin); end; end; function ReorientCore(var lHdrName: string; lPrefix: string; var lHdr: TNIFTIhdr; lPrefs: TPrefs; lOverwrite,lKeepOrigHdr: boolean; var lInMat,lRotMat: TMatrix): string; var lOutHdr: TNIFTIhdr; lOutName: string; lResidualMat: TMatrix; lInMinX,lInMinY,lInMinZ,lOutMinX,lOutMinY,lOutMinZ, dx, dy, dz, QFac: single; lStartX,lStartY,lStartZ, lZ,lY,lX,lB, lOutZ,lOutY, lVol,lNumVol,lXInc, lYInc, lZInc,lBPP: integer; lInPos,lVolBytes,lOutPos,lInOffset: integer; lBufferIn,lBufferOut,lIBuffer,lOBuffer: bytep; lByteSwap,lFlipX,lFlipY,lFlipZ: boolean; lOutF,lInF: File; begin result := ''; lOutHdr := lHdr; //Some software uses negative pixdims to represent a spatial flip - now that the image is canonical, all dimensions are positive lOutHdr.pixdim[1] := abs(lHdr.pixdim[1]); lOutHdr.pixdim[2] := abs(lHdr.pixdim[2]); lOutHdr.pixdim[3] := abs(lHdr.pixdim[3]); //sort out dim1 lFlipX := false; if lRotMat.Matrix[1,2] <> 0 then begin lXinc := lHdr.dim[1]; lOutHdr.dim[1] := lHdr.dim[2]; lOutHdr.pixdim[1] := abs(lHdr.pixdim[2]); if lRotMat.Matrix[1,2] < 0 then lFlipX := true end else if lRotMat.Matrix[1,3] <> 0 then begin lXinc := lHdr.dim[1]*lHdr.dim[2]; lOutHdr.dim[1] := lHdr.dim[3]; lOutHdr.pixdim[1] := abs(lHdr.pixdim[3]); if lRotMat.Matrix[1,3] < 0 then lFlipX := true end else begin lXinc := 1; if lRotMat.Matrix[1,1] < 0 then lFlipX := true end; //sort out dim2 lFlipY := false; if lRotMat.Matrix[2,2] <> 0 then begin lYinc := lHdr.dim[1]; //lOutHdr.dim[2] := lHdr.dim[2]; //lOutHdr.pixdim[2] := lHdr.pixdim[2]; if lRotMat.Matrix[2,2] < 0 then lFlipY := true end else if lRotMat.Matrix[2,3] <> 0 then begin lYinc := lHdr.dim[1]*lHdr.dim[2]; lOutHdr.dim[2] := lHdr.dim[3]; lOutHdr.pixdim[2] := abs(lHdr.pixdim[3]); if lRotMat.Matrix[2,3] < 0 then lFlipY := true end else begin lYinc := 1; lOutHdr.dim[2] := lHdr.dim[1]; lOutHdr.pixdim[2] := abs(lHdr.pixdim[1]); if lRotMat.Matrix[2,1] < 0 then lFlipY := true end; //sort out dim3 lFlipZ := false; if lRotMat.Matrix[3,2] <> 0 then begin lZinc := lHdr.dim[1]; lOutHdr.dim[3] := lHdr.dim[2]; lOutHdr.pixdim[3] := lHdr.pixdim[2]; if lRotMat.Matrix[3,2] < 0 then lFlipZ := true; end else if lRotMat.Matrix[3,3] <> 0 then begin lZinc := lHdr.dim[1]*lHdr.dim[2]; //lOutHdr.dim[3] := lHdr.dim[3]; //lOutHdr.pixdim[3] := lHdr.pixdim[3]; if lRotMat.Matrix[3,3] < 0 then lFlipZ := true; end else begin lZinc := 1; lOutHdr.dim[3] := lHdr.dim[1]; lOutHdr.pixdim[3] := lHdr.pixdim[1]; if lRotMat.Matrix[3,1] < 0 then lFlipZ := true; end; //details for writing... lBPP := (lHdr.bitpix div 8); //bytes per pixel lXinc := lXinc * lBPP; lYinc := lYinc * lBPP; lZinc := lZinc * lBPP; lVolBytes := lHdr.dim[1]*lHdr.dim[2]*lHdr.dim[3]*lBPP; //now write header... //create Matrix of residual orientation... lResidualMat := QuickInvertMatrix3D(lRotMat); //the next steps are inelegant - the translation values are computed by brute force //at the moment, our lResidualMat looks like this //lResidualMat = [ 0 -1 0 0; 0 0 1 0; 1 0 0 0; 0 0 0 1]; //however, it should specify the dimensions in mm of the dimensions that are flipped //However, note that whenever you reverse the direction of //voxel coordinates, you need to include the appropriate offset //in the 'a' matrix. That is: //lResidualMat = [0 0 1 0; -1 0 0 Nx-1; 0 1 0 0; 0 0 0 1] //where Nx is the number of voxels in the x direction. //So, if you took Nx=256, then for your values before, you'd get: //TransRot = [ 0 -1 0 255; 0 0 1 0; 1 0 0 0; 0 0 0 1]; //Because we do not do this, we use the function mins to compute the translations... //I have not implemented refined version yet - require sample volumes to check //Ensure Nx is voxels not mm, etc.... //start of kludge lResidualMat := multiplymatrices(lInMat,lResidualMat); //source lResidualMat.Matrix[1,4] := 0; lResidualMat.Matrix[2,4] := 0; lResidualMat.Matrix[3,4] := 0; Mins (lInMat, lHdr,lInMinX,lInMinY,lInMinZ); Mins (lResidualMat, lOutHdr,lOutMinX,lOutMinY,lOutMinZ); lResidualMat.Matrix[1,4] := lInMinX-lOutMinX; lResidualMat.Matrix[2,4] := lInMinY-lOutMinY; lResidualMat.Matrix[3,4] := lInMinZ-lOutMinZ; //End of kuldge lOutHdr.srow_x[0] := lResidualMat.Matrix[1,1]; lOutHdr.srow_x[1] := lResidualMat.Matrix[1,2]; lOutHdr.srow_x[2] := lResidualMat.Matrix[1,3]; lOutHdr.srow_y[0] := lResidualMat.Matrix[2,1]; lOutHdr.srow_y[1] := lResidualMat.Matrix[2,2]; lOutHdr.srow_y[2] := lResidualMat.Matrix[2,3]; lOutHdr.srow_z[0] := lResidualMat.Matrix[3,1]; lOutHdr.srow_z[1] := lResidualMat.Matrix[3,2]; lOutHdr.srow_z[2] := lResidualMat.Matrix[3,3]; lOutHdr.srow_x[3] := lResidualMat.Matrix[1,4]; lOutHdr.srow_y[3] := lResidualMat.Matrix[2,4]; lOutHdr.srow_z[3] := lResidualMat.Matrix[3,4]; nifti_mat44_to_quatern( lResidualMat, lOutHdr.quatern_b,lOutHdr.quatern_c,lOutHdr.quatern_d, lOutHdr.qoffset_x,lOutHdr.qoffset_y,lOutHdr.qoffset_z, dx, dy, dz,lOutHdr.pixdim[0] {QFac}); //read input if not NIFTIhdr_LoadImg (lHdrName, lHdr, lIBuffer, lInOffset,lByteSwap) then exit; lNumVol := lOutHdr.dim[4]; if lNumVol < 1 then //hopefully this nevee happens lNumVol := 1; GetMem(lOBuffer,lNumVol*lVolBytes+kNIIImgOffset); lBufferIn := (@liBuffer^[lInOffset+1]); lOutPos := 0; lBufferOut := (@loBuffer^[kNIIImgOffset+1+lOutPos]); if lFlipX then lXInc := -lXInc; if lFlipY then lYInc := -lYInc; if lFlipZ then lZInc := -lZInc; for lVol := 1 to lNumVol do begin //convert if lFlipX then lStartX := (lOutHdr.dim[1]-1)*-lXInc else lStartX := 0; if lFlipY then lStartX := lStartX + (lOutHdr.dim[2]-1)*-lYInc; if lFlipZ then lStartX := lStartX + (lOutHdr.dim[3]-1)*-lZInc; lStartX := lStartX + ((lVol-1)*lVolBytes); for lZ := 1 to lOutHdr.dim[3] do begin lOutZ := lStartX + (lZ-1) * lZInc; for lY := 1 to lOutHdr.dim[2] do begin lOutY := ((lY-1) * lYInc) + lOutZ; for lX := 1 to lOutHdr.dim[1] do begin for lB := 1 to lBPP do begin inc(lOutPos); lInPos := ((lX-1) * lXInc) + lOutY + lB; lBufferOut^[lOutPos] := lBufferIn^[lInPos]; end; end; end; //for Y end; //for Z end;//For each volume Freemem(lIBuffer); if lOverwrite then lOutName := lHdrName else lOutName := ChangeFilePrefix (lHdrName,lPrefix); Msg('Reorienting as '+lOutName); if lKeepOrigHdr then result := SaveNIfTICore (lOutName, lOBuffer, kNIIImgOffset+1, lHdr, lPrefs,lByteSwap) else result := SaveNIfTICore (lOutName, lOBuffer, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); Freemem(lOBuffer); end;//ReorientCore (*function ReorientCore(var lHdrName: string; lPrefix: string; var lHdr: TNIFTIhdr; lPrefs: TPrefs; lOverwrite: boolean; var lInMat,lRotMat: TMatrix): string; var lOutHdr: TNIFTIhdr; lOutName: string; lResidualMat: TMatrix; lInMinX,lInMinY,lInMinZ,lOutMinX,lOutMinY,lOutMinZ, dx, dy, dz, QFac: single; lStartX,lStartY,lStartZ, lZ,lY,lX,lB, lOutZ,lOutY, lXInc, lYInc, lZInc,lBPP: integer; lInPos,lVolBytes,lOutPos,lInOffset: integer; lBufferIn,lBufferOut,lIBuffer,lOBuffer: bytep; lByteSwap,lFlipX,lFlipY,lFlipZ: boolean; lOutF,lInF: File; begin result := ''; lOutHdr := lHdr; if lOutHdr.dim[4] > 1 then begin showmessage('Reorient only designed for 3D images.'); exit; end; //Some software uses negative pixdims to represent a spatial flip - now that the image is canonical, all dimensions are positive lOutHdr.pixdim[1] := abs(lHdr.pixdim[1]); lOutHdr.pixdim[2] := abs(lHdr.pixdim[2]); lOutHdr.pixdim[3] := abs(lHdr.pixdim[3]); //sort out dim1 lFlipX := false; if lRotMat.Matrix[1,2] <> 0 then begin lXinc := lHdr.dim[1]; lOutHdr.dim[1] := lHdr.dim[2]; lOutHdr.pixdim[1] := abs(lHdr.pixdim[2]); if lRotMat.Matrix[1,2] < 0 then lFlipX := true end else if lRotMat.Matrix[1,3] <> 0 then begin lXinc := lHdr.dim[1]*lHdr.dim[2]; lOutHdr.dim[1] := lHdr.dim[3]; lOutHdr.pixdim[1] := abs(lHdr.pixdim[3]); if lRotMat.Matrix[1,3] < 0 then lFlipX := true end else begin lXinc := 1; if lRotMat.Matrix[1,1] < 0 then lFlipX := true end; //sort out dim2 lFlipY := false; if lRotMat.Matrix[2,2] <> 0 then begin lYinc := lHdr.dim[1]; //lOutHdr.dim[2] := lHdr.dim[2]; //lOutHdr.pixdim[2] := lHdr.pixdim[2]; if lRotMat.Matrix[2,2] < 0 then lFlipY := true end else if lRotMat.Matrix[2,3] <> 0 then begin lYinc := lHdr.dim[1]*lHdr.dim[2]; lOutHdr.dim[2] := lHdr.dim[3]; lOutHdr.pixdim[2] := abs(lHdr.pixdim[3]); if lRotMat.Matrix[2,3] < 0 then lFlipY := true end else begin lYinc := 1; lOutHdr.dim[2] := lHdr.dim[1]; lOutHdr.pixdim[2] := abs(lHdr.pixdim[1]); if lRotMat.Matrix[2,1] < 0 then lFlipY := true end; //sort out dim3 lFlipZ := false; if lRotMat.Matrix[3,2] <> 0 then begin lZinc := lHdr.dim[1]; lOutHdr.dim[3] := lHdr.dim[2]; lOutHdr.pixdim[3] := lHdr.pixdim[2]; if lRotMat.Matrix[3,2] < 0 then lFlipZ := true; end else if lRotMat.Matrix[3,3] <> 0 then begin lZinc := lHdr.dim[1]*lHdr.dim[2]; //lOutHdr.dim[3] := lHdr.dim[3]; //lOutHdr.pixdim[3] := lHdr.pixdim[3]; if lRotMat.Matrix[3,3] < 0 then lFlipZ := true; end else begin lZinc := 1; lOutHdr.dim[3] := lHdr.dim[1]; lOutHdr.pixdim[3] := lHdr.pixdim[1]; if lRotMat.Matrix[3,1] < 0 then lFlipZ := true; end; //details for writing... lBPP := (lHdr.bitpix div 8); //bytes per pixel lXinc := lXinc * lBPP; lYinc := lYinc * lBPP; lZinc := lZinc * lBPP; lVolBytes := lHdr.dim[1]*lHdr.dim[2]*lHdr.dim[3]*lBPP; //now write header... //create Matrix of residual orientation... lResidualMat := QuickInvertMatrix3D(lRotMat); //the next steps are inelegant - the translation values are computed by brute force //at the moment, our lResidualMat looks like this //lResidualMat = [ 0 -1 0 0; 0 0 1 0; 1 0 0 0; 0 0 0 1]; //however, it should specify the dimensions in mm of the dimensions that are flipped //However, note that whenever you reverse the direction of //voxel coordinates, you need to include the appropriate offset //in the 'a' matrix. That is: //lResidualMat = [0 0 1 0; -1 0 0 Nx-1; 0 1 0 0; 0 0 0 1] //where Nx is the number of voxels in the x direction. //So, if you took Nx=256, then for your values before, you'd get: //TransRot = [ 0 -1 0 255; 0 0 1 0; 1 0 0 0; 0 0 0 1]; //Because we do not do this, we use the function mins to compute the translations... //I have not implemented refined version yet - require sample volumes to check //Ensure Nx is voxels not mm, etc.... //start of kludge lResidualMat := multiplymatrices(lInMat,lResidualMat); //source lResidualMat.Matrix[1,4] := 0; lResidualMat.Matrix[2,4] := 0; lResidualMat.Matrix[3,4] := 0; Mins (lInMat, lHdr,lInMinX,lInMinY,lInMinZ); Mins (lResidualMat, lOutHdr,lOutMinX,lOutMinY,lOutMinZ); lResidualMat.Matrix[1,4] := lInMinX-lOutMinX; lResidualMat.Matrix[2,4] := lInMinY-lOutMinY; lResidualMat.Matrix[3,4] := lInMinZ-lOutMinZ; //End of kuldge lOutHdr.srow_x[0] := lResidualMat.Matrix[1,1]; lOutHdr.srow_x[1] := lResidualMat.Matrix[1,2]; lOutHdr.srow_x[2] := lResidualMat.Matrix[1,3]; lOutHdr.srow_y[0] := lResidualMat.Matrix[2,1]; lOutHdr.srow_y[1] := lResidualMat.Matrix[2,2]; lOutHdr.srow_y[2] := lResidualMat.Matrix[2,3]; lOutHdr.srow_z[0] := lResidualMat.Matrix[3,1]; lOutHdr.srow_z[1] := lResidualMat.Matrix[3,2]; lOutHdr.srow_z[2] := lResidualMat.Matrix[3,3]; lOutHdr.srow_x[3] := lResidualMat.Matrix[1,4]; lOutHdr.srow_y[3] := lResidualMat.Matrix[2,4]; lOutHdr.srow_z[3] := lResidualMat.Matrix[3,4]; nifti_mat44_to_quatern( lResidualMat, lOutHdr.quatern_b,lOutHdr.quatern_c,lOutHdr.quatern_d, lOutHdr.qoffset_x,lOutHdr.qoffset_y,lOutHdr.qoffset_z, dx, dy, dz, QFac); //read input if not NIFTIhdr_LoadImg (lHdrName, lHdr, lIBuffer, lInOffset,lByteSwap) then exit; GetMem(lOBuffer,lVolBytes+kNIIImgOffset); lBufferIn := (@liBuffer^[lInOffset+1]); lOutPos := 0; lBufferOut := (@loBuffer^[kNIIImgOffset+1+lOutPos]); //convert if lFlipX then begin lStartX := (lOutHdr.dim[1]-1)*lXInc; lXInc := -lXInc; end else lStartX := 0; if lFlipY then begin lStartX := lStartX + (lOutHdr.dim[2]-1)*lYInc; lYInc := -lYInc; end; if lFlipZ then begin lStartX := lStartX + (lOutHdr.dim[3]-1)*lZInc; lZInc := -lZInc; end; for lZ := 1 to lOutHdr.dim[3] do begin lOutZ := lStartX + (lZ-1) * lZInc; for lY := 1 to lOutHdr.dim[2] do begin lOutY := ((lY-1) * lYInc) + lOutZ; for lX := 1 to lOutHdr.dim[1] do begin for lB := 1 to lBPP do begin inc(lOutPos); lInPos := ((lX-1) * lXInc) + lOutY + lB; lBufferOut^[lOutPos] := lBufferIn^[lInPos]; end; end; end; //for Y end; //for Z Freemem(lIBuffer); if lOverwrite then lOutName := lHdrName else lOutName := ChangeFilePrefix (lHdrName,lPrefix); Msg('Reorienting as '+lOutName); result := SaveNIfTICore (lOutName, lOBuffer, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); Freemem(lOBuffer); end;//ReorientCore *) (*function SuperReorient(var lHdrName: string; {var lHdr: TNIFTIhdr;} lPrefs: TPrefs): string; //super-reorient generates copies of the source image with different orthogonal rotations //useful for testing viewing software var lRot,lRotMod: integer; lByteSwap: boolean; lInMat,lRotMat,lTempMat,lTransformMat,lNormalMat,lFlipMat: TMatrix; lPrefix: string; lHdr: TNIFTIhdr; begin if not NIFTIhdr_LoadHdr (lHdrName, lHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lHdrName); exit; end; result := ''; lInMat := Matrix3D ( lHdr.srow_x[0],lHdr.srow_x[1],lHdr.srow_x[2],lHdr.srow_x[3], lHdr.srow_y[0],lHdr.srow_y[1],lHdr.srow_y[2],lHdr.srow_y[3], lHdr.srow_z[0],lHdr.srow_z[1],lHdr.srow_z[2],lHdr.srow_z[3], 0,0,0,1); lNormalMat := nifti_mat44_orthogx(lInMat); //lRot := 3; begin for lRot := 1 to 24 do begin lRotMod := lRot mod 6; case lRotMod of 1: lTempMat := Matrix3D(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1); 2: lTempMat := Matrix3D(1,0,0,0, 0,0,1,0, 0,1,0,0, 0,0,0,1); 3: lTempMat := Matrix3D(0,1,0,0, 1,0,0,0, 0,0,1,0, 0,0,0,1); 4: lTempMat := Matrix3D(0,1,0,0, 0,0,1,0, 1,0,0,0, 0,0,0,1); 5: lTempMat := Matrix3D(0,0,1,0, 1,0,0,0, 0,1,0,0, 0,0,0,1); else lTempMat := Matrix3D(0,0,1,0, 0,1,0,0, 1,0,0,0, 0,0,0,1); end; case lRot of 1..6: lFlipMat := Eye3D; 7..12: lFlipMat := Matrix3D(-1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1); 13..18: lFlipMat := Matrix3D(1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,0,0,1); 19..24: lFlipMat := Matrix3D(1,0,0,0, 0,1,0,0, 0,0,-1,0, 0,0,0,1); end; lTransformMat := MultiplyMatrices(lTempMat,lFlipMat); lRotMat := MultiplyMatrices(lNormalMat,lTransformMat); lPrefix := floattostr(lTransformMat.Matrix[1,1])+floattostr(lTransformMat.Matrix[1,2])+floattostr(lTransformMat.Matrix[1,3]) +'_'+floattostr(lTransformMat.Matrix[2,1])+floattostr(lTransformMat.Matrix[2,2])+floattostr(lTransformMat.Matrix[2,3]) +'_'+floattostr(lTransformMat.Matrix[3,1])+floattostr(lTransformMat.Matrix[3,2])+floattostr(lTransformMat.Matrix[3,3]); Msg(lPrefix); result := ReorientCore(lHdrName, lPrefix,lHdr, lPrefs, false, lInMat,lRotMat); end; end;//proc SuperReorient *) function Reorient(var lHdrName: string; var lHdr: TNIFTIhdr; lPrefs: TPrefs; lOverwrite,lForce: boolean): string; //returns output filename if successful //reslice an image so it is in canonical space var lInMat,lRotMat: TMatrix; begin result := ''; if (lHdr.dim[4] > 1) or (lHdr.dim[3] < 2) then begin Msg('Can only orient 3D images '+inttostr(lHdr.dim[3])+' '+inttostr(lHdr.dim[4])); exit; end; if (lHdr.dim[1] > lPrefs.MaxReorientMatrix) or (lHdr.dim[2] > lPrefs.MaxReorientMatrix) or(lHdr.dim[3] > lPrefs.MaxReorientMatrix) then begin Msg('This image will not be reoriented (larger than MaxReorientMatrix= '+inttostr(lPrefs.MaxReorientMatrix)); exit; end; lInMat := Matrix3D ( lHdr.srow_x[0],lHdr.srow_x[1],lHdr.srow_x[2],lHdr.srow_x[3], lHdr.srow_y[0],lHdr.srow_y[1],lHdr.srow_y[2],lHdr.srow_y[3], lHdr.srow_z[0],lHdr.srow_z[1],lHdr.srow_z[2],lHdr.srow_z[3], 0,0,0,1); if (not lForce) and (NIfTIAlignedM (lInMat)) then begin result := lHdrName; Msg('Image is already canonically oriented: '+lHdrName); exit; end; lRotMat := nifti_mat44_orthogx( lInMat,lPrefs); if NIfTIAlignedM (lRotMat) then begin result := lHdrName; Msg('According to header, image is already approximately canonically oriented'); exit; //already as close as possible end; result := ReorientCore(lHdrName, 'o',lHdr, lPrefs, lOverwrite,false, lInMat,lRotMat); end; function LRFlip(lFilename: string; lPrefs: TPrefs): boolean; //function Reorient(var lHdrName: string; var lHdr: TNIFTIhdr; lPrefs: TPrefs; lOverwrite,lForce: boolean): string; //returns output filename if successful //reslice an image so it is in canonical space var lHdr: TNIFTIhdr; lByteSwap: boolean; lInMat,lRotMat: TMatrix; begin result := false; if not NIFTIhdr_LoadHdr (lFilename, lHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; if (lHdr.dim[1] > lPrefs.MaxReorientMatrix) or (lHdr.dim[2] > lPrefs.MaxReorientMatrix) or(lHdr.dim[3] > lPrefs.MaxReorientMatrix) then begin Msg('This image will not be reoriented (larger than MaxReorientMatrix= '+inttostr(lPrefs.MaxReorientMatrix)); exit; end; lInMat := Matrix3D ( lHdr.srow_x[0],lHdr.srow_x[1],lHdr.srow_x[2],lHdr.srow_x[3], lHdr.srow_y[0],lHdr.srow_y[1],lHdr.srow_y[2],lHdr.srow_y[3], lHdr.srow_z[0],lHdr.srow_z[1],lHdr.srow_z[2],lHdr.srow_z[3], 0,0,0,1); lRotMat := Matrix3D( -1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1); result := (ReorientCore(lFilename, 'lr',lHdr, lPrefs, false,true, lInMat,lRotMat)<> ''); end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nii_math.pas0000664000175000017500000005134711477406124021512 0ustar michaelmichaelunit nii_math; interface {$H+} uses //nii_types,nii_write, niftiutil,dicomtypes,prefs, define_types, sysutils, dialogsx,GraphicsMathLibrary; type TNIFTIimg = record HdrName: string; Hdr: TNIFTIhdr; ByteSwap: boolean; Offset: integer; Buffer,i8: bytep; f32: singlep; i32 : longintP; i16 : SmallIntP; end; function RMS3d (lAName,lBName,lMaskName: string; lMaskThresh: single; lSaveOutput: boolean; lPrefs: TPrefs):double; function AddSlices (lAName: string; lSlices: integer; lPrefs: TPrefs):boolean; function ReportMinMax (lAName: string): boolean; function Hounsfield2NormScale (lAName: string; lPrefs: TPrefs):boolean; function ShrinkNII (lAName: string; lPrefs: TPrefs): boolean; implementation procedure CreateNII(var lNII: TNIfTIimg); begin lNII.Buffer := nil; end; procedure FreeNII(var lNII: TNIfTIimg); begin if lNII.Buffer <> nil then Freemem(lNII.Buffer); end; function LoadHdrNII(lFilename: string; var lNII: TNIfTIimg): boolean; begin result := false; lNII.HdrName := lFilename; if not NIFTIhdr_LoadHdr (lNII.HdrName, lNII.Hdr, lNII.ByteSwap) then begin; ShowMsg('Header load error '+lFilename); exit; end; result := true; end; function SubBound (lVal,lMin: integer): integer; begin result := lVal; if result < lMin then result := lMin; end; function NonspatialDimensionsNII (lA: TNIFTIimg): integer; //returns sum of 4th, 5th, 6th and 7th dimension... begin result := SubBound(lA.Hdr.dim[4],1)*SubBound(lA.Hdr.dim[5],1)*SubBound(lA.Hdr.dim[6],1)*SubBound(lA.Hdr.dim[7],1); end; function LoadImgNII(lFilename: string; var lNII: TNIfTIimg): boolean; begin result := false; if not LoadHdrNII(lFilename,lNII) then exit; if not NIFTIhdr_LoadImgRaw (False,lNII.HdrName, lNII.Hdr, lNII.Buffer, lNII.Offset,lNII.ByteSwap) then begin ShowMsg('Image load error '+lFilename); exit; end; NIFTIhdr_UnswapImg(lNII.Hdr,lNII.Buffer,lNII.Offset,lNII.ByteSwap); lNII.f32 := SingleP(@lNII.Buffer^[lNII.Offset+1]); lNII.i32 := LongintP(@lNII.Buffer^[lNII.Offset+1]); lNII.i16 := SmallIntP(@lNII.Buffer^[lNII.Offset+1]); lNII.i8 := ByteP(@lNII.Buffer^[lNII.Offset+1]); result := true; end; procedure Force3DNII (var lNII: TNIFTIimg); begin lNII.Hdr.dim[0] := 3; lNII.Hdr.dim[4] := 1; lNII.Hdr.Dim[5] := 1; lNII.Hdr.Dim[6] := 1; lNII.Hdr.Dim[7] := 1; end; function CreateEmptyImgNII(lHdr: TNIFTIHdr; var lNII: TNIfTIimg): boolean; var lVol,lImgBytes,lFileBytes: integer; begin result := false; //FreeNII ??? lNII.Hdr := lHdr; lNII.Offset := kNIIImgOffset;// (=352) bytes for creating .nii.gz files lVol := NonspatialDimensionsNII(lNiI); //lVol := lHdr.dim[4]+lHdr.dim[5]+lHdr.dim[6]+lHdr.dim[7]; //crepes if lVol < 1 then lVol := 1; lImgBytes := lHdr.dim[1]*lHdr.dim[2]*lHdr.dim[3]*lVol*(lHdr.bitpix div 8); if lImgBytes < 1 then exit; lFileBytes := lImgBytes+ kNIIImgOffset; GetMem(lNII.Buffer,lFileBytes); lNII.f32 := SingleP(@lNII.Buffer^[lNII.Offset+1]); lNII.i32 := LongintP(@lNII.Buffer^[lNII.Offset+1]); lNII.i16 := SmallIntP(@lNII.Buffer^[lNII.Offset+1]); lNII.i8 := ByteP(@lNII.Buffer^[lNII.Offset+1]); result := true; end; function MinMaxNII(var lNII: TNIfTIimg; lVol: integer; ApplyHdrScaling: boolean; var lMin,lMax: double): boolean; //returns min and max intensity in as Volume. //For 4D data, use lVol to specify the volume // if lVol < 1 then all volumes var i,lnVol,lVox,lVoxOffset: integer; begin result := false; if lNII.Buffer = nil then begin showmsg('MinMax Error: image not loaded.'); exit;//image not loaded... end; lnVol := NonspatialDimensionsNII(lNiI); lVox := lNII.Hdr.dim[1]*lNII.Hdr.dim[2]*lNII.Hdr.dim[3]; if (lnVol < 1) or (lVox < 1) then exit; lVoxOffset := 0; if (lVol < 1) or (lVol > lnVol) then lVox := lVox * lnVol else lVoxOffset := (lVol-1)*lVox; case lNII.Hdr.datatype of kDT_UNSIGNED_CHAR: begin lMin := lNII.i8^[lVoxOffset+1]; lMax := lMin; for i := 1 to lVox do if lNII.i8^[lVoxOffset+i] > lMax then lMax := lNII.i8^[lVoxOffset+i]; for i := 1 to lVox do if lNII.i8^[lVoxOffset+i] < lMin then lMin := lNII.i8^[lVoxOffset+i]; end;//CHAR kDT_SIGNED_SHORT: begin lMin := lNII.i16^[lVoxOffset+1]; lMax := lMin; for i := 1 to lVox do if lNII.i16^[lVoxOffset+i] > lMax then lMax := lNII.i16^[lVoxOffset+i]; for i := 1 to lVox do if lNII.i16^[lVoxOffset+i] < lMin then lMin := lNII.i16^[lVoxOffset+i]; end;//kDT_SIGNED_SHORT kDT_SIGNED_INT: begin lMin := lNII.i32^[lVoxOffset+1]; lMax := lMin; for i := 1 to lVox do if lNII.i32^[lVoxOffset+i] > lMax then lMax := lNII.i32^[lVoxOffset+i]; for i := 1 to lVox do if lNII.i32^[lVoxOffset+i] < lMin then lMin := lNII.i32^[lVoxOffset+i]; end;//kDT_SIGNED_INT kDT_FLOAT: begin lMin := lNII.f32^[lVoxOffset+1]; lMax := lMin; for i := 1 to lVox do if lNII.f32^[lVoxOffset+i] > lMax then lMax := lNII.f32^[lVoxOffset+i]; for i := 1 to lVox do if lNII.f32^[lVoxOffset+i] < lMin then lMin := lNII.f32^[lVoxOffset+i]; end;//float end;// datatype if ApplyHdrScaling then begin lMin := (lMin * lNII.hdr.scl_slope)+lNII.hdr.scl_inter; lMax := (lMax * lNII.hdr.scl_slope)+lNII.hdr.scl_inter; end; result := true; end; function SameHdrDimNII (lA,lB: TNIFTIimg; lCheck4D, lCheckDataType: boolean): boolean; begin result := SameHdrDim (lA.Hdr,lB.Hdr, lCheck4D, lCheckDataType); if not result then ShowMsg('Dimensions differ '+lA.Hdrname+' <> '+lB.HdrName); end; function ReportMinMax (lAName: string): boolean; label 666; var lA: TNIfTIimg; lMin,lMax: double; begin result := false; CreateNII(lA); if not LoadImgNII(lAName,lA) then goto 666; if not MinMaxNII(lA,0,true,lMin,lMax) then goto 666; showmsg(lAName+kTab+'Min'+floattostr(lMin)+kTab+'Max:'+floattostr(lMax)); result := true; 666: FreeNII(lA); end; function Hounsfield2NormScale (lAName: string; lPrefs: TPrefs):boolean; //Hounsfield scaled data in the range //Air -1000 //Fat 120 //Water 0 //Muscle ~40 //Contrast +130 //Bone >400 (typically ~1000) //problem 1: SPM assume 0 is dark [zero fills edges] - so we need to make minimum 0 //note the contrast of interest is in the compressed range -100..+200 //http://en.wikipedia.org/wiki/Hounsfield_units const kUninterestingDarkUnits = 900; // e.g. -1000..-100 kInterestingMidUnits = 300; //e.g. -100..+300 kScaleRatio = 2;// increase dynamic range of interesting voxels by 3 label 666; var lA,lOut: TNIfTIimg; lMin,lMax,lRange: double; i,lVox: integer; v16,lExtra,lMin16: SmallInt; //lPrefs: TPrefs; lOName: string; begin result := false; CreateNII(lA); CreateNII(lOut); if not LoadImgNII(lAName,lA) then goto 666; if lA.Hdr.datatype <> kDT_SIGNED_SHORT then begin showmsg('Hounsfield2NormScale Error: Image datatype must be 16-bit integer : '+lAName); goto 666; end; lVox := lA.Hdr.dim[1]*lA.Hdr.dim[2]*lA.Hdr.dim[3]*NonspatialDimensionsNII(lA); if lVox < 1 then goto 666; if not MinMaxNII(lA,0,false,lMin,lMax) then goto 666; lRange := lMax-lMin; if lRange < 1800 then begin //note assume integer data type with scaling... showmsg('Hounsfield2NormScale Error: dark to bright regions of a Hounsfield calibrated CT scan of the brain should exceed 1800 (air=-1000,bone=1000) : '+lAName); goto 666; end; //create output lOut.Hdr := lA.Hdr; force3DNII(lOut); lOut.Hdr.datatype := kDT_SIGNED_SHORT; lOut.Hdr.scl_slope := 1; lOut.Hdr.scl_inter := 0; lOut.ByteSwap := false; CreateEmptyImgNII(lOut.Hdr, lOut); //translate values lMin16 := round(lMin); case lA.Hdr.datatype of kDT_SIGNED_SHORT: begin for i := 1 to lVox do begin v16 := lA.i16^[i]-lMin16; lExtra := v16-kUninterestingDarkUnits; if lExtra > kInterestingMidUnits then lExtra := kInterestingMidUnits; if lExtra > 0 then lExtra := lExtra*kScaleRatio else lExtra := 0; lOut.i16^[i] := v16+lExtra; end; lOut.i16^[1] := 0;//ANTS uses this voxel for background color end;//kDT_SIGNED_SHORT else begin Showmsg('Unsupported datatype'); end;//float end;// datatype //Save data lOName := ChangeFilePrefix(lAName,'x'); //SetDefaultPrefs (lPrefs); //lOName := lAName; //lPrefs.gzip := true; SaveNIfTICore (lOName, lOut.Buffer, kNIIImgOffset+1, lOut.Hdr, lPrefs,lOut.ByteSwap); result := true; 666: FreeNII(lA); FreeNII(lOut); end; function RMS3d (lAName,lBName,lMaskName: string; lMaskThresh: single; lSaveOutput: boolean; lPrefs: TPrefs):double; //Determines Root Mean Square Error between A and B // both A and B are 3D images // Mean for each voxel sqrt(X^2+Y^2+Z^2) //OPTIONAL: Mask image (set name to '' to ignore) const NaN : double = 1/0; kErrorStr = 'RMS'; label 666; var lA,lB,lMask,lOut: TNIfTIimg; lSum,lRMS: double; lV,lVox,lCount,lMaskCount: integer; lUseMask: boolean; //lPrefs: TPrefs; lOName: string; begin result := 0; lUseMask := false; CreateNII(lA); CreateNII(lB); CreateNII(lMask); CreateNII(lOut); if not LoadImgNII(lAName,lA) then goto 666; if not LoadImgNII(lBName,lB) then goto 666; if not SameHdrDimNII(lA,lB,true,true) then goto 666; if NonspatialDimensionsNII(lA) <> 3 then begin ShowMsg('Image must have 3 volumes [not '+inttostr(NonspatialDimensionsNII(lA))+'] ' +lAName); goto 666; end; lVox := lA.Hdr.Dim[1]*lA.Hdr.Dim[2] * lA.Hdr.Dim[3]; if lVox < 1 then goto 666; case lA.Hdr.datatype of kDT_FLOAT:;//lBPP := 4; else begin ShowMsg(kErrorStr+' datatype not supported.'); exit; end; end; //case //next lines: mask.... if (lMaskName <> '') and (not fileexists(lMaskName)) then ShowMsg(kErrorStr+'unable to find mask '+lMaskName) else if (lMaskName <> '') and (fileexists(lMaskName)) then begin lUseMask := true; if not LoadImgNII(lMaskName,lMask) then goto 666; if lMask.Hdr.datatype <> kDT_FLOAT then begin ShowMsg(kErrorStr+'datatype not supported. '+lMaskName); goto 666; end; if not SameHdrDimNII(lA,lMask,true,true) then goto 666; end; //mask //output if lSaveOutput then begin lOut.Hdr := lA.Hdr; force3DNII(lOut); lOut.Hdr.datatype := kDT_FLOAT; lOut.ByteSwap := false; CreateEmptyImgNII(lOut.Hdr, lOut); for lV := 1 to lVox do lOut.f32^[lV] := 0; end; lSum:= 0; lCount := 0; lMaskCount := 0; case lA.Hdr.datatype of kDT_FLOAT: begin for lV := 1 to lVox do begin if (not (lUseMask)) or ((not SpecialSingle(lMask.f32^[lV])) and (lMask.f32^[lV]> lMaskThresh)) then begin inc(lMaskCount); if (not SpecialSingle(lA.f32^[lV])) and (not SpecialSingle(lA.f32^[lV+lVox])) and (not SpecialSingle(lA.f32^[lV+lVox+lVox])) and (not SpecialSingle(lB.f32^[lV])) and (not SpecialSingle(lB.f32^[lV+lVox])) and (not SpecialSingle(lB.f32^[lV+lVox+lVox])) then begin //if true then begin inc(lCount); lRMS := sqrt(sqr(lA.f32^[lV]-lB.f32^[lV])+ sqr(lA.f32^[lV+lVox]-lB.f32^[lV+lVox])+sqr(lA.f32^[lV+lVox+lVox]-lB.f32^[lV+lVox+lVox])); if (lSaveOutput) then begin try //switch from double to single precision... lOut.f32^[lV] := lRMS; except lOut.f32^[lV] := NAN; end; //except end; lSum := lSum + lRMS; end; //not special - i.e. NaN end;//in mask end;//each 3D voxel end; //kDT_FLOAT end;//case of datatype if lMaskCount = 0 then ShowMsg(kErrorStr+' No voxels greater than '+floattostr(lMaskThresh)+' in mask '+lMaskName) else if lCount = 0 then ShowMsg(kErrorStr+' No valid voxels. All NaN?') else if lSaveOutput then begin lOName := ChangeFilePrefix(lAName,'Xrms'); //SetDefaultPrefs (lPrefs); SaveNIfTICore (lOName, lOut.Buffer, kNIIImgOffset+1, lOut.Hdr, lPrefs,lOut.ByteSwap); end; if lCount > 0 then result := lSum/lCount; 666: FreeNII(lA); FreeNII(lB); FreeNII(lMask); FreeNII(lOut); end; function AddSlices (lAName: string; lSlices: integer; lPrefs: TPrefs):boolean; const NaN : double = 1/0; kErrorStr = 'RMS'; label 666; var lA,lOut: TNIfTIimg; lOffset,lV,lS,lI,lVolBytes,lSliceBytes: integer; //lPrefs: TPrefs; lOName: string; begin result := false; if lSlices < 1 then exit; CreateNII(lA); CreateNII(lOut); if not LoadImgNII(lAName,lA) then goto 666; lSliceBytes := lA.hdr.dim[1]*lA.hdr.dim[2]*trunc(((lA.Hdr.bitpix)+7)/8); lVolBytes := lSliceBytes * lA.hdr.dim[3]; if (lSliceBytes < 1) or (lVolBytes < 1) then goto 666; lOut.Hdr := lA.Hdr; force3DNII(lOut); lOut.hdr.dim[3] := lOut.hdr.dim[3] + lSlices; lOut.Hdr.datatype := kDT_FLOAT; lOut.ByteSwap := false; CreateEmptyImgNII(lOut.Hdr, lOut); lI := 0; //lOffset := 0; lOffset := lSliceBytes * 10; for lS :=1 to lSlices do for lV := 1 to (lSliceBytes) do begin inc(lI); //lOut.i8^[lI] := 0; lOut.i8^[lI] := lA.i8^[lV+lOffset] end; lSliceBytes := lSliceBytes * lSlices; for lV := 1 to lVolBytes do lOut.i8^[lV+lSliceBytes] := lA.i8^[lV]; //lOffset := 0; lSliceBytes := lA.hdr.dim[1]*lA.hdr.dim[2]*trunc(((lA.Hdr.bitpix)+7)/8); lI := 0; lOffset := lSliceBytes * 10; for lS :=1 to 18 do for lV := 1 to (lSliceBytes) do begin inc(lI); //lOut.i8^[lI] := 0; lOut.i8^[lI] := lA.i8^[lV+lOffset] end; lOName := ChangeFilePrefix(lAName,'x'); //SetDefaultPrefs (lPrefs); if SaveNIfTICore (lOName, lOut.Buffer, kNIIImgOffset+1, lOut.Hdr, lPrefs,lOut.ByteSwap) <> '' then result := true; 666: FreeNII(lA); FreeNII(lOut); end; procedure RescaleHdr (var lHdr: TNIFTIHdr; lX,lY,lZ: double); var lIn,lScale,lResidualMat: TMatrix; dx, dy, dz: single; begin lIn := Matrix3D ( lHdr.srow_x[0],lHdr.srow_x[1],lHdr.srow_x[2],lHdr.srow_x[3], lHdr.srow_y[0],lHdr.srow_y[1],lHdr.srow_y[2],lHdr.srow_y[3], lHdr.srow_z[0],lHdr.srow_z[1],lHdr.srow_z[2],lHdr.srow_z[3], 0,0,0,1); lScale := Matrix3D (lX,0,0,0, 0,lY,0,0, 0,0,lZ,0, 0,0,0,1); lResidualMat := MultiplyMatrices(lIn,lScale); lHdr.srow_x[0] := lResidualMat.Matrix[1,1]; lHdr.srow_x[1] := lResidualMat.Matrix[1,2]; lHdr.srow_x[2] := lResidualMat.Matrix[1,3]; lHdr.srow_y[0] := lResidualMat.Matrix[2,1]; lHdr.srow_y[1] := lResidualMat.Matrix[2,2]; lHdr.srow_y[2] := lResidualMat.Matrix[2,3]; lHdr.srow_z[0] := lResidualMat.Matrix[3,1]; lHdr.srow_z[1] := lResidualMat.Matrix[3,2]; lHdr.srow_z[2] := lResidualMat.Matrix[3,3]; lHdr.srow_x[3] := lResidualMat.Matrix[1,4]; lHdr.srow_y[3] := lResidualMat.Matrix[2,4]; lHdr.srow_z[3] := lResidualMat.Matrix[3,4]; nifti_mat44_to_quatern( lResidualMat, lHdr.quatern_b,lHdr.quatern_c,lHdr.quatern_d, lHdr.qoffset_x,lHdr.qoffset_y,lHdr.qoffset_z, dx, dy, dz,lHdr.pixdim[0] {QFac}); end; function ShrinkNII(lAName: String; lPrefs: TPrefs): boolean; //Halves X and Y dimensions label 666; var lOName: string; lo,li,lx,lyz: integer; lA,lOut: TNIfTIimg; begin result := false; CreateNII(lA); CreateNII(lOut); if not LoadImgNII(lAName,lA) then goto 666; if odd(lA.hdr.dim[1]) or odd(lA.hdr.dim[2]) then begin ShowMsg('ShrinkNII error X and Y must be divisible by 2 '+inttostr(lA.hdr.dim[1])+' '+inttostr(lA.hdr.dim[2])); goto 666; end; case lA.Hdr.datatype of kDT_UNSIGNED_CHAR,kDT_SIGNED_SHORT , kDT_SIGNED_INT, kDT_FLOAT:;//lBPP := 4; else begin ShowMsg('ShrinkNII datatype not supported.'); exit; end; end; //case lOut.Hdr := lA.Hdr; force3DNII(lOut); lOut.hdr.dim[1] := lOut.hdr.dim[1] div 2; lOut.hdr.dim[2] := lOut.hdr.dim[2] div 2; lOut.hdr.pixdim[1] := lOut.hdr.pixdim[1] * 2; lOut.hdr.pixdim[2] := lOut.hdr.pixdim[2] * 2; RescaleHdr(lOut.hdr,2,2,1); lOut.ByteSwap := false; CreateEmptyImgNII(lOut.Hdr, lOut); case lA.Hdr.datatype of kDT_UNSIGNED_CHAR: begin li := 1; lo := 1; for lyz := 1 to (lOut.hdr.dim[2]*lOut.hdr.dim[3]) do begin for lx := 1 to lOut.hdr.dim[1] do begin lOut.i8^[lo] := (lA.i8^[li]+lA.i8^[li+1]+lA.i8^[li]+lA.i8^[li+1]) div 4; inc(li,2); //skip voxel inc(lo); end;//x inc(li,lA.hdr.dim[1]); //skip line end;//yz end;//CHAR kDT_SIGNED_SHORT: begin li := 1; lo := 1; for lyz := 1 to (lOut.hdr.dim[2]*lOut.hdr.dim[3]) do begin for lx := 1 to lOut.hdr.dim[1] do begin lOut.i16^[lo] := (lA.i16^[li]+lA.i16^[li+1]+lA.i16^[li]+lA.i16^[li+1]) div 4; inc(li,2); //skip voxel inc(lo); end;//x inc(li,lA.hdr.dim[1]); //skip line end;//yz end;//kDT_SIGNED_SHORT kDT_SIGNED_INT: begin li := 1; lo := 1; for lyz := 1 to (lOut.hdr.dim[2]*lOut.hdr.dim[3]) do begin for lx := 1 to lOut.hdr.dim[1] do begin lOut.i32^[lo] := (lA.i32^[li]+lA.i32^[li+1]+lA.i32^[li]+lA.i32^[li+1]) div 4; inc(li,2); //skip voxel inc(lo); end;//x inc(li,lA.hdr.dim[1]); //skip line end;//yz end;//kDT_SIGNED_INT kDT_FLOAT: begin li := 1; lo := 1; for lyz := 1 to (lOut.hdr.dim[2]*lOut.hdr.dim[3]) do begin for lx := 1 to lOut.hdr.dim[1] do begin lOut.f32^[lo] := (lA.f32^[li]+lA.f32^[li+1]+lA.f32^[li]+lA.f32^[li+1]) / 4; inc(li,2); //skip voxel inc(lo); end;//x inc(li,lA.hdr.dim[1]); //skip line end;//yz end;//float end;// datatype lOName := ChangeFilePrefix(lAName,'d'); if SaveNIfTICore (lOName, lOut.Buffer, kNIIImgOffset+1, lOut.Hdr, lPrefs,lOut.ByteSwap) <> '' then result := true; 666: FreeNII(lA); FreeNII(lOut); end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nii_crop.pas0000664000175000017500000011441111464553454021521 0ustar michaelmichaelunit nii_crop; {$H+} //TO DO: ByteSwap, DataTypes, Orthogonality //VENTRAL direction: attempts to remove excess neck ... //OTHER directions: zeros slices where signal intensity is <5% //assumes image is oriented in canonical space, e.g. //closest to rotation matrix [1 0 0; 0 1 0; 0 0 1] //if your image is not rotated in this manner, use nii_orient first interface uses {$IFDEF FPC}gzio2,{$ENDIF} //distr, SysUtils,define_types,dicomtypes,niftiutil,GraphicsMathLibrary,prefs; //function Int16LogPtoZNIfTI32Z(lFilename: string; lPrefs: TPrefs): string; function CropNIfTI(lFilename: string; lPrefs: TPrefs): string;//returns output filename if successful function Float32NIfTI(lFilename: string; lPrefs: TPrefs): string; function FormulaNIfTI(lFilename: string; lPrefs: TPrefs; lScale,lPower: double): string; //function RescaleNIfTI(lFilename: string; lPrefs: TPrefs; lScale: double): string; function RemoveNIfTIscalefactor(lFilename: string; lPrefs: TPrefs): string; function CropNIfTIX(lFilename: string; lPrefs: TPrefs; lDorsalCrop, lVentralCrop, lLCrop,lRCrop, lACrop, lPCrop : integer ): string; function SiemensPhase2RadiansNIfTI(lFilename: string; lPrefs: TPrefs): string; implementation uses dialogsx,math; function RemoveNIfTIscalefactor(lFilename: string; lPrefs: TPrefs): string; //rescale data by lScale var lInHdr,lOutHdr: TNIFTIhdr; lOutname: string; l4DBytes,lInOffset,l1: integer; lInBuffer,lOutBuffer: bytep; lByteSwap: boolean; begin result := ''; //lExt := UpCaseExt(lFilename); if not NIFTIhdr_LoadHdr (lFilename, lInHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; case lInHdr.datatype of kDT_UNSIGNED_CHAR,kDT_SIGNED_SHORT,kDT_UINT16, kDT_SIGNED_INT,kDT_FLOAT:;//Supported else begin Msg('rescaleNIfTI unsupported datatype.'); exit; end; end; Msg('removing scale factor NIfTI/Analyze image '+lFileName); lOutHdr := lInHdr; lOutHdr.scl_slope := 1; lOutHdr.scl_inter := 0; l4DBytes := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]*lInHdr.dim[4]*(lInHdr.bitpix div 8); if not NIFTIhdr_LoadImg (lFileName, lInHdr, lInBuffer, lInOffset,lByteSwap) then exit; GetMem(lOutBuffer,l4DBytes+kNIIImgOffset); //lOutPos := kNIIImgOffset + 1; l1 := 1; Move(lInBuffer^[lInOffset+l1],lOutBuffer^[kNIIImgOffset + l1],l4DBytes); lOutname := ChangeFilePrefix (lFileName,'r'); Msg(lOutName); if SaveNIfTICore (lOutName, lOutBuffer, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap) = '' then begin Msg('Remove scale error'); Freemem(lInBuffer); Freemem(lOutBuffer); exit; end; Freemem(lInBuffer); Freemem(lOutBuffer); result := lOutname; end; function FormulaNIfTI(lFilename: string; lPrefs: TPrefs; lScale,lPower: double): string; //apply formula to dataset, then save results as 32-bit float.... var lInHdr,lOutHdr: TNIFTIhdr; lOutname,lExt: string; lAdj: single; lImgSamples,lInc,lImgOffset,lVol,lnVol,lPos: integer; lSrcBuffer,lBuffer, lBuffUnaligned,lBuffAligned: bytep; l32Buf,lImgBuffer: singlep; l16Buf : SmallIntP; lByteSwap: boolean; begin result := ''; lExt := UpCaseExt(lFilename); if not NIFTIhdr_LoadHdr (lFilename, lInHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; case lInHdr.datatype of kDT_UNSIGNED_CHAR,kDT_SIGNED_SHORT,kDT_UINT16, kDT_SIGNED_INT,kDT_FLOAT:;//Supported else begin Msg('Error with nii_crop: unsupported datatype.'); exit; end; end; Msg('Applying formula to NIfTI/Analyze image'+lFileName); lOutHdr := lInHdr; lOutHdr.datatype := kDT_FLOAT; lOutHdr.bitpix := 32; lImgSamples := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]*lInHdr.dim[4]; if not NIFTIhdr_LoadImg (lFileName, lInHdr, lSrcBuffer, lImgOffset,lByteSwap) then exit; //Msg('Automatically Cropping image'); lBuffer := (@lSrcBuffer^[lImgOffset+1]); GetMem(lBuffUnaligned ,(sizeof(single)*lImgSamples) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := Align(lBuffUnaligned,16); // not commented - check this {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lInc := 1; lImgBuffer := SingleP(@lBuffAligned^[kNIIImgOffset+lInc]); case lInHdr.datatype of kDT_UNSIGNED_CHAR : begin //8 bit for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := lBuffer^[lInc]; end; kDT_SIGNED_SHORT{,kDT_UINT16}: begin //16-bit int l16Buf := SmallIntP(lBuffer ); if lByteSwap then begin for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := Swap(l16Buf^[lInc]); end else begin for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := l16Buf^[lInc]; end; end;//16bit kDT_SIGNED_INT: begin l32Buf := SingleP(lBuffer ); if lByteSwap then //unswap and convert integer to float for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := (Swap4r4i(l32Buf^[lInc])) else //convert integer to float for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := Conv4r4i(l32Buf^[lInc]); end; //32-bit int kDT_FLOAT: begin l32Buf := SingleP(lBuffer); for lInc := 1 to lImgSamples do lImgBuffer[lInc] := l32Buf[lInc]; if lByteSwap then for lInc := 1 to lImgSamples do pswap4r(lImgBuffer^[lInc]); //faster as procedure than function see www.optimalcode.com for lInc := 1 to lImgSamples do if specialsingle(lImgBuffer^[lInc]) then lImgBuffer^[lInc] := 0.0; //invert= for lInc := 1 to lImgSamples do l32Buf[lInc] := -l32Buf[lInc]; end; //32-bit float else begin Msg('Serious error: format not supported by Float32.'); exit; end; end; //case //apply formula lImgSamples := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]; //3D data lnVol := lInHdr.dim[4]; //4th dimension lPos := 0; //fx(lScale,lPower); for lVol := 1 to lnVol do begin lAdj := 1/(lScale* Power(lVol,lPower)); for lInc := 1 to lImgSamples do begin inc(lPos); lImgBuffer^[lPos] := lAdj*lImgBuffer^[lPos]; //lImgBuffer[lPos] := lImgBuffer[lPos] * lScale; end; end; lOutname := ChangeFilePrefix (lFileName,'f'); result := SaveNIfTICore (lOutName, lBuffAligned, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); Freemem(lBuffUnaligned); Freemem(lSrcBuffer); end; function Float32NIfTI(lFilename: string; lPrefs: TPrefs): string; //convert any data format as 32-bit float.... var lInHdr,lOutHdr: TNIFTIhdr; lOutname,lExt: string; lImgSamples,lInc,lImgOffset: integer; lSrcBuffer,lBuffer, lBuffUnaligned,lBuffAligned: bytep; l32Buf,lImgBuffer: singlep; l16Buf : SmallIntP; lByteSwap: boolean; begin result := ''; lExt := UpCaseExt(lFilename); if not NIFTIhdr_LoadHdr (lFilename, lInHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; if lInHdr.datatype = kDT_FLOAT then begin Msg('No need to apply Float32 : data is already 32-bit real: '+lFilename); exit; end; case lInHdr.datatype of kDT_UNSIGNED_CHAR,kDT_SIGNED_SHORT,kDT_UINT16, kDT_SIGNED_INT,kDT_FLOAT:;//Supported else begin Msg('Float32 unsupported datatype.'); exit; end; end; Msg('Converting NIfTI/Analyze image to 32-bit float'+lFileName); lOutHdr := lInHdr; lOutHdr.datatype := kDT_FLOAT; lOutHdr.bitpix := 32; lImgSamples := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]*lInHdr.dim[4]; if not NIFTIhdr_LoadImg (lFileName, lInHdr, lSrcBuffer, lImgOffset,lByteSwap) then exit; //Msg('Automatically Cropping image'); lBuffer := (@lSrcBuffer^[lImgOffset+1]); GetMem(lBuffUnaligned ,(sizeof(single)*lImgSamples) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := align(lBuffUnaligned,16); {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lInc := 1; lImgBuffer := SingleP(@lBuffAligned^[kNIIImgOffset+lInc]); case lInHdr.datatype of kDT_UNSIGNED_CHAR : begin //8 bit for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := lBuffer^[lInc]; end; kDT_SIGNED_SHORT{,kDT_UINT16}: begin //16-bit int l16Buf := SmallIntP(lBuffer ); if lByteSwap then begin for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := Swap(l16Buf^[lInc]); end else begin for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := l16Buf^[lInc]; end; end;//16bit kDT_SIGNED_INT: begin l32Buf := SingleP(lBuffer ); if lByteSwap then //unswap and convert integer to float for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := (Swap4r4i(l32Buf^[lInc])) else //convert integer to float for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := Conv4r4i(l32Buf^[lInc]); end; //32-bit int kDT_FLOAT: begin l32Buf := SingleP(lBuffer); for lInc := 1 to lImgSamples do lImgBuffer[lInc] := l32Buf[lInc]; if lByteSwap then for lInc := 1 to lImgSamples do pswap4r(lImgBuffer^[lInc]); //faster as procedure than function see www.optimalcode.com for lInc := 1 to lImgSamples do if specialsingle(lImgBuffer^[lInc]) then lImgBuffer^[lInc] := 0.0; //invert= for lInc := 1 to lImgSamples do l32Buf[lInc] := -l32Buf[lInc]; end; //32-bit float else begin Msg('Serious error: format not supported by Float32.'); exit; end; end; //case lOutname := ChangeFilePrefix (lFileName,'f'); result := SaveNIfTICore (lOutName, lBuffAligned, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); Freemem(lBuffUnaligned); Freemem(lSrcBuffer); end; (*function LogPtoZ (lLogP: single): single; var lD: double; begin ///lD := Log10(lLogp); lD := Power(10,-lLogP); result := pNormalInv(lD); //fx(lD,lZ); end; function Int16LogPtoZNIfTI32Z(lFilename: string; lPrefs: TPrefs): string; //convert any data format as 32-bit float.... var lInHdr,lOutHdr: TNIFTIhdr; lOutname,lExt: string; lImgSamples,lInc,lImgOffset: integer; lSrcBuffer,lBuffer, lBuffUnaligned,lBuffAligned: bytep; l32Buf,lImgBuffer: singlep; l16Buf : SmallIntP; lByteSwap: boolean; begin result := ''; lExt := UpCaseExt(lFilename); if not NIFTIhdr_LoadHdr (lFilename, lInHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; if lInHdr.datatype = kDT_FLOAT then begin Msg('No need to apply Float32 : data is already 32-bit real: '+lFilename); exit; end; case lInHdr.datatype of kDT_UNSIGNED_CHAR,kDT_SIGNED_SHORT,kDT_UINT16, kDT_SIGNED_INT,kDT_FLOAT:;//Supported else begin Msg('Float32 unsupported datatype.'); exit; end; end; Msg('Converting NIfTI/Analyze image to 32-bit float'+lFileName); lOutHdr := lInHdr; lOutHdr.datatype := kDT_FLOAT; lOutHdr.bitpix := 32; lImgSamples := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]*lInHdr.dim[4]; if not NIFTIhdr_LoadImg (lFileName, lInHdr, lSrcBuffer, lImgOffset,lByteSwap) then exit; //Msg('Automatically Cropping image'); lBuffer := (@lSrcBuffer^[lImgOffset+1]); GetMem(lBuffUnaligned ,(sizeof(single)*lImgSamples) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := align(lBuffUnaligned,16); {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lInc := 1; lImgBuffer := SingleP(@lBuffAligned^[kNIIImgOffset+lInc]); lOutHdr.scl_slope := 1; case lInHdr.datatype of kDT_SIGNED_SHORT{,kDT_UINT16}: begin //16-bit int l16Buf := SmallIntP(lBuffer ); if lByteSwap then begin for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := Swap(l16Buf^[lInc]); end else begin for lInc := 1 to lImgSamples do begin if l16Buf^[lInc] =0 then lImgBuffer^[lInc] := 0 else if l16Buf^[lInc] =32767 then lImgBuffer^[lInc] := 0 else lImgBuffer^[lInc] := LogPtoZ(0.01*l16Buf^[lInc]); end; end; end;//16bit else begin Msg('Serious error: format not supported by Float32.'); exit; end; end; //case lOutname := ChangeFilePrefix (lFileName,'f'); result := SaveNIfTICore (lOutName, lBuffAligned, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); Freemem(lBuffUnaligned); Freemem(lSrcBuffer); end;*) procedure SmoothRA (var lRA: Doublep; lItems: integer); var lRecip: double; lTempRA,lTempRAUnaligned: Doublep; lI: integer; begin if lItems < 3 then exit; GetMem(lTempRAUnaligned,(lItems*sizeof(double))+16); {$IFDEF FPC} lTempRA := align(lTempRAUnaligned,16); {$ELSE} lTempRA := DoubleP($fffffff0 and (integer(lTempRAUnaligned)+15)); {$ENDIF} for lI := 1 to lItems do lTempRA^[lI] := lRA^[lI]; lRecip := 1/3; //multiplies faster than divides for lI := 2 to (lItems-1) do lRA^[lI] := (lTempRA^[lI-1]+lTempRA^[lI]+lTempRA^[lI+1])*lRecip; FreeMem(lTempRAUnaligned); end; function MaxRA (var lRA: Doublep; lStart,lItems: integer): integer; var lMax: double; lI: integer; begin result := lStart; if (lItems < 2) or (lStart >= lItems) or ((lItems-lStart)< 1) then exit; lMax := lRA^[lStart]; for lI := lStart to lItems do if lRA^[lI] > lMax then begin result := lI; lMax := lRA^[lI] end; end; function MinRA (var lRA: Doublep; lStart,lItems: integer): integer; var lMin: double; lI: integer; begin result := lStart; if (lItems < 2) or (lStart >= lItems) or ((lItems-lStart)< 1) then exit; lMin := lRA^[lStart]; for lI := lStart to lItems do if lRA^[lI] < lMin then begin result := lI; lMin := lRA^[lI] end; end; function FindDVCrop2 (var lHdr: TNIFTIhdr; var lDorsalCrop,lVentralCrop: integer): boolean; const kMaxDVmm = 200; var lSliceMM: double; begin result := false; if lHdr.pixdim[3] < 0.0001 then exit; lSliceMM := lHdr.pixdim[3]* (lHdr.Dim[3]-lDorsalCrop-lVentralCrop); if lSliceMM > kMaxDVmm then begin //decide how many more ventral slices to remove lSliceMM := lSliceMM - kMaxDVmm; lSliceMM := lSliceMM / lHdr.pixdim[3]; //msg(inttostr(lVentralCrop)); lVentralCrop := lVentralCrop + round(lSliceMM); //msg(inttostr(lVentralCrop)); end; result := true; end; function FindDVCrop (var lHdr: TNIFTIhdr; var ScrnBuffer: Singlep; var lDorsalCrop,lVentralCrop: integer; lPct: integer): boolean; var lSliceMax: double; lSliceSum,lSliceSumUnaligned: Doublep; lXY,lZ,lSlices,lSliceSz,lSliceStart,lVentralMaxSlice,lMaxSlice,lMinSlice,lGap: integer; begin result := false; lDorsalCrop := 0; lVentralCrop := 0; if (lPct < 1) or (lPct > 100) then exit; lSlices := lHdr.dim[3]; lSliceSz := lHdr.dim[1]*lHdr.dim[2]; GetMem(lSliceSumUnaligned,(lSlices*sizeof(double))+16); {$IFDEF FPC} lSliceSum := align(lSliceSumUnaligned,16); {$ELSE} lSliceSum := DoubleP($fffffff0 and (integer(lSliceSumUnaligned)+15)); {$ENDIF} lSliceMax := 0; for lZ := 1 to lSlices do begin lSliceSum^[lZ] := 0; lSliceStart := (lZ-1)*lSliceSz; for lXY := 1 to lSliceSz do lSliceSum^[lZ] := lSliceSum^[lZ]+ ScrnBuffer^[lXY+lSliceStart]; if lSliceMax < lSliceSum^[lZ] then lSliceMax := lSliceSum^[lZ]; end; //for each slice if lSliceMax = 0 then begin //no data variance Freemem(lSliceSumUnaligned); exit; end; //VolSum = 0 //next: normalize so each slice is normalized to brightest axial slice for lZ := 1 to lSlices do lSliceSum^[lZ] := lSliceSum^[lZ]/lSliceMax; result := true; //next: smooth SmoothRA(lSliceSum,lSlices); //next - top cropping - removing slices that are <5% of maximum slice lZ := lSlices; while (lZ > 1) and (lSliceSum^[lZ] < (lPct/100)) do dec(lZ); lDorsalCrop := lSlices-lZ; //next findMax lMaxSlice := MaxRA(lSliceSum,1,lSlices); //next - ensure there is at least 60mm from max to bottom of an image - enough spine to worry about lVentralMaxSlice := lMaxSlice-round(60/abs(lHdr.pixdim[3])); if lVentralMaxSlice < 1 then exit; lVentralMaxSlice := MaxRA(lSliceSum,1,lVentralMaxSlice); //finally: find minima between these two points... lMinSlice := MinRA(lSliceSum,lVentralMaxSlice,lMaxSlice); lGap := round((lMaxSlice-lMinSlice)*0.9);//add 40% for cerebellum if (lMinSlice-lGap) > 1 then begin result := true; lVentralCrop := lMinSlice-lGap; end; //fx(lVentralCrop,lDorsalCrop); //next show output... {TextForm.Memo1.Lines.Clear; for lZ := 1 to lSlices do TextForm.Memo1.Lines.add(inttostr(lZ)+','+floattostr(lSliceSum^[lZ])); TextForm.Show; } //cleanup Freemem(lSliceSumUnaligned); //next - max 200mm from top of head to spinal column.... //if (lSliceMM > kMaxDVmm end; function FindLRCrop (var lHdr: TNIFTIhdr; var ScrnBuffer: Singlep; var lLCrop,lRCrop:integer; lPct,lDCrop,lVCrop: integer): boolean; //amount of image to crop from left/right for N% signal intensity var lSliceMax: double; lSliceSum,lSliceSumUnaligned: Doublep; lZmin,lZmax,lX,lY,lZ,lSlices,lSliceSz,lSliceStart: integer; begin result := false; lLCrop := 0; lRCrop := 0; if (lPct < 1) or (lPct > 100) then exit; lZMin := lVCrop; lZMax := lHdr.Dim[3]-lDCrop; SortInt(lZMin,lZMax); lZMin := Bound(lZMin,1,lHdr.Dim[3]); lZMax := Bound(lZMax,1,lHdr.Dim[3]); if lZMin >= lZMax then exit; lSlices := lHdr.Dim[1]; lSliceSz := lHdr.Dim[1]*lHdr.Dim[2]; GetMem(lSliceSumUnaligned,(lSlices*sizeof(double))+16); {$IFDEF FPC} lSliceSum := align(lSliceSumUnaligned,16); {$ELSE} lSliceSum := DoubleP($fffffff0 and (integer(lSliceSumUnaligned)+15)); {$ENDIF} lSliceMax := 0; for lX := 1 to lSlices do begin lSliceSum^[lX] := 0; for lZ := {1 to lHdr.Dim[3]} lZMin to lZMax do begin lSliceStart := lX+ ((lZ-1)*lSliceSz); for lY := 1 to lHdr.Dim[2] do begin lSliceSum^[lX] := lSliceSum^[lX]+ ScrnBuffer^[lSliceStart]; lSliceStart := lSliceStart + lHdr.Dim[1]; end; end; //for lYZ := 1 to lSliceSz do // lSliceSum^[lZ] := lSliceSum^[lZ]+ gMRIcroOverlay[kBGOverlayNum].ScrnBuffer[lXY+lSliceStart]; if lSliceMax < lSliceSum^[lX] then lSliceMax := lSliceSum^[lX]; end; //for each slice if lSliceMax = 0 then begin //no data variance Freemem(lSliceSumUnaligned); exit; end; //VolSum = 0 //next: smooth SmoothRA(lSliceSum,lSlices); //next: normalize so each slice is normalized to brightest axial slice for lX := 1 to lSlices do lSliceSum^[lX] := lSliceSum^[lX]/lSliceMax; //next - Left cropping- removing slices that are <5% of maximum slice lX := lSlices; while (lX > 1) and (lSliceSum^[lX] < (lPct/100)) do dec(lX); lRCrop := lSlices-lX; //next - Left cropping- removing slices that are <5% of maximum slice lX := 1; while (lX <= lSlices) and (lSliceSum^[lX] < (lPct/100)) do inc(lX); lLCrop := lX-1; //fx(lLCrop,lRCrop); result := true; Freemem(lSliceSumUnaligned); end; function FindAPCrop (var lHdr: TNIFTIhdr; var ScrnBuffer: Singlep; var lACrop,lPCrop: integer; lPct,lDCrop,lVCrop: integer): boolean; //amount of image to crop from anterior/posterior for 5% signal intensity var lSliceMax: double; lSliceSum,lSliceSumUnaligned: Doublep; lZMin,lZMax,lX,lY,lZ,lSlices,lSliceSz,lSliceStart: integer; begin result := false; lACrop := 0; lPCrop := 0; lZMin := lVCrop; lZMax := lHdr.Dim[3]-lDCrop; SortInt(lZMin,lZMax); lZMin := Bound(lZMin,1,lHdr.Dim[3]); lZMax := Bound(lZMax,1,lHdr.Dim[3]); if lZMin >= lZMax then exit; if (lPct < 1) or (lPct > 100) then exit; lSlices := lHdr.Dim[2]; lSliceSz := lHdr.Dim[1]*lHdr.Dim[2]; //lCoroSliceSz := lHdr.Dim[1]*lHdr.Dim[3]; GetMem(lSliceSumUnaligned,(lSlices*sizeof(double))+16); {$IFDEF FPC} lSliceSum := align(lSliceSumUnaligned,16); {$ELSE} lSliceSum := DoubleP($fffffff0 and (integer(lSliceSumUnaligned)+15)); {$ENDIF} lSliceMax := 0; for lY := 1 to lSlices do begin lSliceSum^[lY] := 0; //lSliceStart := lY; for lZ := {1 to lHdr.Dim[3]} lZMin to lZMax do begin lSliceStart := ((lY-1)* lHdr.Dim[1])+ ((lZ-1)*lSliceSz); //if lSliceStart > (lSliceSz*lHdr.Dim[3]) then // Msg('xx'); for lX := 1 to lHdr.Dim[1] do lSliceSum^[lY] := lSliceSum^[lY]+ ScrnBuffer^[lSliceStart+lX]; end; //for lZ //for lYZ := 1 to lSliceSz do // lSliceSum^[lY] := lSliceSum^[lY]+ gMRIcroOverlay[kBGOverlayNum].ScrnBuffer[lXY+lSliceStart]; if lSliceMax < lSliceSum^[lY] then lSliceMax := lSliceSum^[lY]; end; //for each slice if lSliceMax = 0 then begin //no data variance Freemem(lSliceSumUnaligned); exit; end; //VolSum = 0 //next: smooth SmoothRA(lSliceSum,lSlices); //next: normalize so each slice is normalized to brightest axial slice for lY := 1 to lSlices do lSliceSum^[lY] := lSliceSum^[lY]/lSliceMax; //next - Left cropping- removing slices that are <5% of maximum slice lY := lSlices; while (lY > 1) and (lSliceSum^[lY] < (lPct/100)) do dec(lY); lACrop := lSlices-lY; //next - Left cropping- removing slices that are <5% of maximum slice lY := 1; while (lY <= lSlices) and (lSliceSum^[lY] < (lPct/100)) do inc(lY); lPCrop := lY-1; result := true; Freemem(lSliceSumUnaligned); end; function CropNIfTIX(lFilename: string; lPrefs: TPrefs; lDorsalCrop, lVentralCrop, lLCrop,lRCrop, lACrop, lPCrop : integer ): string; //to do : data swapping (errors on detection and writing zero in reverse order) var lInHdr,lOutHdr: TNIFTIhdr; lOutname,lExt: string; lXmm,lYmm,lZmm: single; lMat: TMatrix; lOutPos,//lInc, //lImgSamples, lX,lY,lZ,lBPP, lB, lVol, lInVol,lInZOffset,lInYOffset,lInSliceSz,lInXSz,lInPos,lImgOffset: integer; lSrcBuffer,lBuffer//, lBuffUnaligned : bytep; //l32Buf,lImgBuffer: singlep; //l16Buf : SmallIntP; //lWordX: Word; //lSPM2: boolean; lOutF,lInF: File; lByteSwap: boolean; begin result := ''; if (lDorsalCrop = 0) and (lVentralCrop = 0) and (lLCrop = 0) and (lRCrop = 0) and (lACrop = 0) and (lPCrop = 0) then begin Msg('Crop slices quitting: no need to delete slices.'); exit; //25 Sept 2008 end; if (lDorsalCrop < 0) or (lVentralCrop < 0) or (lLCrop < 0) or (lRCrop < 0) or (lACrop < 0) or (lPCrop < 0) then begin Msg('Crop slices quitting: negative values should be impossible.'); exit; end; result := ''; lExt := UpCaseExt(lFilename); if not NIFTIhdr_LoadHdr (lFilename, lInHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; //Next create reordered or trimmed image in the correct format case lInHdr.datatype of kDT_UNSIGNED_CHAR,kDT_SIGNED_SHORT,kDT_UINT16, kDT_SIGNED_INT,kDT_FLOAT:;//Supported else begin Msg('Crop 3D unsupported datatype.'); exit; end; end; Msg('Cropping NIfTI/Analyze image '+lFileName); lOutHdr := lInHdr; //lImgSamples := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]; lBPP := (lInHdr.bitpix div 8); //bytes per pixel if not NIFTIhdr_LoadImg (lFileName, lInHdr, lSrcBuffer, lImgOffset,lByteSwap) then exit; //Msg('Automatically Cropping image'); lBuffer := (@lSrcBuffer^[lImgOffset+1]); //next compute size of cropped volume lOutHdr.Dim[1] := lInHdr.Dim[1]-lLCrop-lRCrop; lOutHdr.Dim[2] := lInHdr.Dim[2]-lACrop-lPCrop; lOutHdr.Dim[3] := lInHdr.Dim[3]-lDorsalCrop-lVentralCrop; if (lOutHdr.Dim[1] < 1) or (lOutHdr.Dim[2] <12) or (lOutHdr.Dim[3] < 1) then begin Msg('Requested to crop more slices than available.'); Freemem(lSrcBuffer); exit; end; //lVolBytes := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]*lBPP; //next: readjust origin to take into account removed slices //REQUIRES images to be aligned to nearest orthogonal to canonical space [1 0 0; 0 1 0; 0 0 1] NIFTIhdr_SlicesToCoord (lInHdr,lLCrop,lPCrop,lVentralCrop, lXmm,lYmm,lZmm); lOutHdr.srow_x[3] := lInHdr.srow_x[3] + lXmm; lOutHdr.srow_y[3] := lInHdr.srow_y[3] + lYmm; lOutHdr.srow_z[3] := lInHdr.srow_z[3] + lZmm; lMat := Matrix3D ( lOutHdr.srow_x[0], lOutHdr.srow_x[1], lOutHdr.srow_x[2], lOutHdr.srow_x[3], lOutHdr.srow_y[0], lOutHdr.srow_y[1], lOutHdr.srow_y[2], lOutHdr.srow_y[3], lOutHdr.srow_z[0], lOutHdr.srow_z[1], lOutHdr.srow_z[2], lOutHdr.srow_z[3], 0, 0, 0, 1); nifti_mat44_to_quatern( lMat, lOutHdr.quatern_b,lOutHdr.quatern_c,lOutHdr.quatern_d, lOutHdr.qoffset_x,lOutHdr.qoffset_y,lOutHdr.qoffset_z, lXmm, lYmm, lZmm, lOutHdr.pixdim[0]{QFac}); //note we write and read to the same buffer - we will always SHRINK output //no need to byteswap data - we will save in the save format as stored lOutPos := 0; lInSliceSz := lInHdr.dim[1]*lInHdr.dim[2]*lBPP; lInXSz := lInHdr.dim[1]*lBPP; for lVol := 1 to lOutHdr.dim[4] do begin lInVol := (lVol-1) * (lInSliceSz * lInHdr.dim[3]); //fx(lInVol,lVol); for lZ := 1 to lOutHdr.dim[3] do begin lInZOffset := (lVentralCrop+lZ-1) * lInSliceSz; for lY := 1 to lOutHdr.dim[2] do begin lInYOffset := ((lPCrop+lY-1) * lInXSz) + lInZOffset + (lLCrop*lBPP); for lX := 1 to lOutHdr.dim[1] do begin for lB := 1 to lBPP do begin inc(lOutPos); lInPos := ((lX-1) * lBPP) + lInYOffset + lB; lBuffer^[lOutPos] := lBuffer^[lInPos+lInVol]; end; end; end; //for Y end; //for Z end; //for Vol lOutname := ChangeFilePrefix (lFileName,'c'); result := SaveNIfTICore (lOutName, lSrcBuffer, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); Freemem(lSrcBuffer); end; function CropNIfTI(lFilename: string; lPrefs: TPrefs): string; //to do : data swapping (errors on detection and writing zero in reverse order) var lInHdr,lOutHdr: TNIFTIhdr; lOutname,lExt: string; lXmm,lYmm,lZmm: single; lMat: TMatrix; lOutPos,lImgSamples,lInc, lX,lY,lZ,lBPP, lB, lInZOffset,lInYOffset,lInSliceSz,lInXSz,lInPos,lImgOffset: integer; lSrcBuffer,lBuffer, lBuffUnaligned: bytep; l32Buf,lImgBuffer: singlep; l16Buf : SmallIntP; //lOutF,lInF: File; lACrop,lPCrop,lDorsalCrop,lVentralCrop,lLCrop,lRCrop: integer; lByteSwap: boolean; begin result := ''; lExt := UpCaseExt(lFilename); if not NIFTIhdr_LoadHdr (lFilename, lInHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; if (lInHdr.dim[1] > lPrefs.MaxReorientMatrix) or (lInHdr.dim[2] > lPrefs.MaxReorientMatrix) or(lInHdr.dim[3] > lPrefs.MaxReorientMatrix) then begin Msg('This image will not be cropped (larger than MaxReorientMatrix= '+inttostr(lPrefs.MaxReorientMatrix)); exit; end; //check orthogonal alignment.... if lInHdr.dim[4] > 1 then begin Msg('Only able to Crop 3D images (reorienting 4D could disrupt slice timing and diffusion directions.'); exit; end; //Next create reordered or trimmed image in the correct format case lInHdr.datatype of kDT_UNSIGNED_CHAR,kDT_SIGNED_SHORT,kDT_UINT16, kDT_SIGNED_INT,kDT_FLOAT:;//Supported else begin Msg('Crop 3D unsupported datatype.'); exit; end; end; Msg('Cropping NIfTI/Analyze image '+lFileName); lOutHdr := lInHdr; lImgSamples := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]; lBPP := (lInHdr.bitpix div 8); //bytes per pixel //lVolBytes := lImgSamples*lBPP; if not NIFTIhdr_LoadImg (lFileName, lInHdr, lSrcBuffer, lImgOffset,lByteSwap) then exit; //Msg('Automatically Cropping image'); lBuffer := (@lSrcBuffer^[lImgOffset+1]); GetMem(lBuffUnaligned ,(sizeof(single)*lImgSamples) + 16); {$IFDEF FPC} lImgBuffer :=align(lBuffUnaligned,16); {$ELSE} lImgBuffer := SingleP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} case lInHdr.datatype of kDT_UNSIGNED_CHAR : begin //8 bit for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := lBuffer^[lInc]; end; kDT_SIGNED_SHORT{,kDT_UINT16}: begin //16-bit int l16Buf := SmallIntP(lBuffer ); if lByteSwap then begin for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := Swap(l16Buf^[lInc]); end else begin for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := l16Buf^[lInc]; end; end;//16bit kDT_SIGNED_INT: begin l32Buf := SingleP(lBuffer ); if lByteSwap then //unswap and convert integer to float for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := (Swap4r4i(l32Buf^[lInc])) else //convert integer to float for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := Conv4r4i(l32Buf^[lInc]); end; //32-bit int kDT_FLOAT: begin l32Buf := SingleP(lBuffer); for lInc := 1 to lImgSamples do lImgBuffer[lInc] := l32Buf[lInc]; if lByteSwap then for lInc := 1 to lImgSamples do pswap4r(lImgBuffer^[lInc]); //faster as procedure than function see www.optimalcode.com for lInc := 1 to lImgSamples do if specialsingle(lImgBuffer^[lInc]) then lImgBuffer^[lInc] := 0.0; //invert= for lInc := 1 to lImgSamples do l32Buf[lInc] := -l32Buf[lInc]; end; //32-bit float else begin Msg('Serious error: format not supported by Crop3D.'); exit; end; end; //case FindDVCrop (lInHdr, lImgBuffer, lDorsalCrop,lVentralCrop, 5); FindDVCrop2 (lInHdr, lDorsalCrop,lVentralCrop); FindLRCrop (lInHdr, lImgBuffer, lLCrop,lRCrop,3,lDorsalCrop,lVentralCrop);//3% often sagittal scans near brain FindAPCrop (lInHdr, lImgBuffer, lACrop,lPCrop, 5,lDorsalCrop,lVentralCrop); FreeMem(lBuffUnaligned); if (lDorsalCrop = 0) and (lVentralCrop = 0) and (lLCrop = 0) and (lRCrop = 0) and (lACrop = 0) and (lPCrop = 0) then begin Msg('Crop 3D quitting: no need to delete slices.'); Freemem(lSrcBuffer); exit; //25 Sept 2008 end; if (lDorsalCrop < 0) or (lVentralCrop < 0) or (lLCrop < 0) or (lRCrop < 0) or (lACrop < 0) or (lPCrop < 0) then begin Msg('Crop 3D quitting: negative values should be impossible.'); beep; Freemem(lSrcBuffer); end; //next compute size of cropped volume lOutHdr.Dim[1] := lInHdr.Dim[1]-lLCrop-lRCrop; lOutHdr.Dim[2] := lInHdr.Dim[2]-lACrop-lPCrop; lOutHdr.Dim[3] := lInHdr.Dim[3]-lDorsalCrop-lVentralCrop; //lVolBytes := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]*lBPP; //next: readjust origin to take into account removed slices //REQUIRES images to be aligned to nearest orthogonal to canonical space [1 0 0; 0 1 0; 0 0 1] NIFTIhdr_SlicesToCoord (lInHdr,lLCrop,lPCrop,lVentralCrop, lXmm,lYmm,lZmm); lOutHdr.srow_x[3] := lInHdr.srow_x[3] + lXmm; lOutHdr.srow_y[3] := lInHdr.srow_y[3] + lYmm; lOutHdr.srow_z[3] := lInHdr.srow_z[3] + lZmm; lMat := Matrix3D ( lOutHdr.srow_x[0], lOutHdr.srow_x[1], lOutHdr.srow_x[2], lOutHdr.srow_x[3], lOutHdr.srow_y[0], lOutHdr.srow_y[1], lOutHdr.srow_y[2], lOutHdr.srow_y[3], lOutHdr.srow_z[0], lOutHdr.srow_z[1], lOutHdr.srow_z[2], lOutHdr.srow_z[3], 0, 0, 0, 1); nifti_mat44_to_quatern( lMat, lOutHdr.quatern_b,lOutHdr.quatern_c,lOutHdr.quatern_d, lOutHdr.qoffset_x,lOutHdr.qoffset_y,lOutHdr.qoffset_z, lXmm, lYmm, lZmm, lOutHdr.pixdim[0]{QFac}); //note we write and read to the same buffer - we will always SHRINK output //no need to byteswap data - we will save in the save format as stored lOutPos := 0; lInSliceSz := lInHdr.dim[1]*lInHdr.dim[2]*lBPP; lInXSz := lInHdr.dim[1]*lBPP; for lZ := 1 to lOutHdr.dim[3] do begin lInZOffset := (lVentralCrop+lZ-1) * lInSliceSz; for lY := 1 to lOutHdr.dim[2] do begin lInYOffset := ((lPCrop+lY-1) * lInXSz) + lInZOffset + (lLCrop*lBPP); for lX := 1 to lOutHdr.dim[1] do begin for lB := 1 to lBPP do begin inc(lOutPos); lInPos := ((lX-1) * lBPP) + lInYOffset + lB; lBuffer^[lOutPos] := lBuffer^[lInPos]; end; end; end; //for Y end; //for Z lOutname := ChangeFilePrefix (lFileName,'c'); result := SaveNIfTICore (lOutName, lSrcBuffer, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); Freemem(lSrcBuffer); end; (*function CropNIfTI(lFilename: string; lPrefs: TPrefs): string; var lTempName,lExt,lNameWOExt: string; lHdr: TNIFTIhdr; lByteSwap: boolean; begin result := ''; lExt := UpCaseExt(lFilename); if not NIFTIhdr_LoadHdr (lFilename, lHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; //check orthogonal alignment.... if lHdr.dim[4] > 1 then begin Msg('Only able to Crop 3D images (reorienting 4D could disrupt slice timing and diffusion directions.'); exit; end; //next - determine output format if lExt = '.NII.GZ' then begin //lTempName := lFilename;//ChangeFilePrefixExt (lFileName,'x'); ExtractFileParts (lFileName, lNameWOExt,lExt); lTempName := lNameWOExt+'.nii'; Gunzip(lFileName,lTempName); lFilename := lTempName; end else //not gzip lTempName := ''; //Next create reordered or trimmed image in the correct format result := Crop(lFileName, lHdr,lByteSwap, lPrefs.SPM2,lPrefs.SingleNIIFile, false); if (result <> '') and (lPrefs.GZip) then begin GZipFile(lFileName,lFileName+'.gz',true); result := result +'.gz'; end; if lTempName <> '' then //delete GZip temp deletefile(lTempName); end; *) function SiemensPhase2RadiansNIfTI(lFilename: string; lPrefs: TPrefs): string; //convert any data format as 32-bit float.... var lInHdr,lOutHdr: TNIFTIhdr; lOutname,lExt: string; lMax,lMin,lImgSamples,lInc,lImgOffset: integer; lSrcBuffer,lBuffer, lBuffUnaligned,lBuffAligned: bytep; //l32Buf, lImgBuffer: singlep; l16Buf : SmallIntP; lByteSwap: boolean; begin result := ''; lExt := UpCaseExt(lFilename); if not NIFTIhdr_LoadHdr (lFilename, lInHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; if lInHdr.datatype <> kDT_SIGNED_SHORT then begin Msg('Unable to run SiemensPhase2Radians : input image must be 16-bit NIfTI image with intensities 0..4096 corresponding to -pi..+pi : '+lFilename); exit; end; //Msg('SiemensPhase2Radians converting 16-bit image (0..4095) to 32-bit float (-pi..+pi).'+lFileName); lOutHdr := lInHdr; lOutHdr.datatype := kDT_FLOAT; lOutHdr.bitpix := 32; lOutHdr.scl_slope := 1; lOutHdr.scl_inter := 0; lImgSamples := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]*lInHdr.dim[4]; if not NIFTIhdr_LoadImg (lFileName, lInHdr, lSrcBuffer, lImgOffset,lByteSwap) then exit; lBuffer := (@lSrcBuffer^[lImgOffset+1]); GetMem(lBuffUnaligned ,(sizeof(single)*lImgSamples) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := align(lBuffUnaligned,16); {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lInc := 1; lImgBuffer := SingleP(@lBuffAligned^[kNIIImgOffset+lInc]); l16Buf := SmallIntP(lBuffer ); if lByteSwap then for lInc := 1 to lImgSamples do l16Buf^[lInc] := Swap(l16Buf^[lInc]); lMax := l16Buf^[1]; for lInc := 1 to lImgSamples do if l16Buf^[lInc] > lMax then lMax := l16Buf^[lInc]; lMin := l16Buf^[1]; for lInc := 1 to lImgSamples do if l16Buf^[lInc] < lMin then lMin := l16Buf^[lInc]; if (lMin < 0) or (lMax > 4096) then Msg('Error: SiemensPhase2Radians expects input data with raw intensity ranging from 0..4096 (corresponding to -pi..+pi) - this image''s intensity is not in these bounds'+lFileName) else begin Msg('SiemensPhase2Radians converting 0..4096 to -pi..+pi '+ lFilename); //Excel formula =((A1-2048)/2048)*PI() //fx(lMin,lMax); for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := ((l16Buf^[lInc]-2048)/2048)*pi; lOutname := ChangeFilePrefix (lFileName,'rad'); result := SaveNIfTICore (lOutName, lBuffAligned, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); end; Freemem(lBuffUnaligned); Freemem(lSrcBuffer); end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nii_asl.pas0000664000175000017500000005641411326434462021337 0ustar michaelmichaelunit nii_asl; //tools for Arterial spin labeling... {$H+} interface uses {$IFDEF FPC}gzio2,{$ENDIF} SysUtils,define_types,dicomtypes,niftiutil,prefs; function ASL_subtract(var lHdrName: string; lOverwrite: boolean; lFunction : integer; lPrefs: TPrefs): boolean; //ASL_subtract(var lHdrName: string; lOverwrite: boolean; lFunction : integer; lPrefs: TPrefs) implementation uses dialogsx,gui,dialogs; function Parse (var lNumStr: string; var Val1,Val2: integer): boolean; var lS: string; lLen,lP: integer; begin Val1 := 0; Val2 := 0; result := false; lLen := length(lNumStr); if lLen < 3 then exit; lS := ''; lP := 1; while (lP <= lLen) and (lNumStr[lP] <> ',') do begin lS := lS + lNumStr[lP]; inc(lP); end; if lS = '' then exit; try Val1 := strtoint(lS); except Msg('Error converting text to number '+lS); end; //next number inc(lP); lS := ''; while (lP <= lLen) and (lNumStr[lP] <> ',') do begin lS := lS + lNumStr[lP]; inc(lP); end; if lS = '' then exit; try Val2 := strtoint(lS); except Msg('Error converting text to number '+lS); end; result := true; end; function readCSV (lFilename: string; var lnObservations: integer; var lPosRA,lNegRA: LongIntp): boolean; var lNumStr: string; F: TextFile; R,A,B,C: integer; begin lnObservations := 0; result := false; if not fileexists(lFilename) then exit; AssignFile(F, lFilename); FileMode := 0; //Set file access to read only //First pass: determine column height/width Reset(F); R := 0; while (not Eof(F)) do begin Readln(F,lNumStr); if Parse(lNumStr,A,B) then inc(R); end; if (R < 1) then begin msg('problems reading CSV: must have at least 2 columns and 1 row.'); exit; end; lnObservations := R; Getmem(lPosRA,lnObservations*sizeof(integer)); Getmem(lNegRA,lnObservations*sizeof(integer)); for R := 1 to lnObservations do begin lPosRA^[R] := -1; lNegRA^[R] := -1; end; //second pass Reset(F); C := 0; while (not Eof(F)) and (C 3); result := false; if not NIFTIhdr_LoadHdr (lHdrName, lInHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lHdrName); exit; end; case lInHdr.datatype of {kDT_UNSIGNED_CHAR,kDT_SIGNED_SHORT,kDT_UINT16, kDT_SIGNED_INT,}kDT_FLOAT:;//Supported else begin Msg('Error with ASL_subtract: image format must be 32-bit floating point values.'); exit; end; end;//case headertype if (odd(lInHdr.dim[4])) or (lInHdr.dim[4] < 2) then begin Msg('ASL routines require an even number of volumes'); exit; end; if not NIFTIhdr_LoadImg (lHdrName, lInHdr, lSrcBuffer, lImgOffset,lByteSwap) then exit; lBuffer := (@lSrcBuffer^[lImgOffset+1]); l32Buf := SingleP(lBuffer ); if lOverwrite then lOutImgName := lHdrName else begin if lSplitOddEven then lOutImgName := ChangeFilePrefix (lHdrName,'odd') else if lSubtract then begin if lCustom then lOutImgName := ChangeFilePrefix (lHdrName,'subc') else if lOddMinusEven then lOutImgName := ChangeFilePrefix (lHdrName,'subome') else lOutImgName := ChangeFilePrefix (lHdrName,'subemo') end else lOutImgName := ChangeFilePrefix (lHdrName,'add'); end; lOutHdr := lInHdr; lOutHdr.dim[4] := lInHdr.dim[4] div 2; lOutHdr.pixdim[4] := 2 * lInHdr.pixdim[4]; lImgSamples := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]; l4DVox := lImgSamples * lOutHdr.dim[4]; //l3DBytes := l3DVox*(lOutHdr.bitpix div 8); //l4DBytes := l3DBytes*lOutHdr.dim[4]; if lCustom then lResultStr := 'Custom subtraction' else if lSubtract then begin if lOddMinusEven then lResultStr := 'Subtract Odd-Even' else lResultStr := 'Subtract Even-Odd'; end else lResultStr := 'Add Odd+Even'; Msg('Computing '+lResultStr+' '+lHdrName); lResultStr := ''; //assume error GetMem(lBuffUnaligned ,(sizeof(single)*l4DVox) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := Align(lBuffUnaligned,16); // not commented - check this {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lInc := 1; lImgBuffer := SingleP(@lBuffAligned^[kNIIImgOffset+lInc]); if lByteSwap then for lInc := 1 to l4DVox do pswap4r(l32Buf^[lInc]); //faster as procedure than function see www.optimalcode.com if lSplitOddEven then begin //compute odd for lVol := 1 to lOutHdr.dim[4] do begin lOutVolOffset := (lVol -1) * lImgSamples; //lInVolEvenOffset := ((lVol*2) -1) * lImgSamples; //second, fourth lInVolOddOffset := ((lVol*2) -2) * lImgSamples; //first, thired for lInc := 1 to lImgSamples do begin lOdd := l32Buf^[lInVolOddOffset+lInc]; //lEven := l16Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lOdd; end; //for lImgSamples end; //for lvol lresultStr := SaveNIfTICore (lOutImgName, lBuffAligned, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); lresultStr := SaveMean32 (lOutImgName, lOutHdr, lBuffAligned,lImgBuffer,lPrefs,lByteSwap); //compute even lOutImgName := ChangeFilePrefix (lHdrName,'even'); for lVol := 1 to lOutHdr.dim[4] do begin lOutVolOffset := (lVol -1) * lImgSamples; lInVolEvenOffset := ((lVol*2) -1) * lImgSamples; //second, fourth //lInVolOddOffset := ((lVol*2) -2) * lImgSamples; //first, thired for lInc := 1 to lImgSamples do begin //lOdd := l16Buf^[lInVolOddOffset+lInc]; lEven := l32Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lEven; end; //for lImgSamples end; //for lvol end else if lCustom then begin //not lSplitOddEven .. if Custom Msg('Select a comma separated text file that describes how to subtract images.'); Msg('For example, to subtract a six volume dataset your file could be:'); Msg('1,6'); Msg('2,5'); Msg('3,4'); Msg('The first output volume would be the first input volume minus the sixth'); Msg('The second output volume would be the second input volume minus the fifth'); Msg('The final output volume would be the third input volume minus the fourth'); Msg('Your file should have '+inttostr(lOutHdr.dim[4])+' lines, one for each output volume'); if not MainForm.OpenDialogExecute('Select NIfTI images you wish to modify)',true,false,kTxtFilter) then goto 666; lCSVName := MainForm.OpenHdrDlg.Filename; //MainForm.BrowseDialog('Choose collapase file if not readCSV (lCSVname, lVol, lPosRA,lNegRA) then goto 666; if lVol < lOutHdr.dim[4] then begin Msg ('Only found '+inttostr(lVol)+' contrasts in '+ lCSVName+' a total of '+inttostr(lOutHdr.dim[4])+' required'); freemem(lPosRA); freemem(lNegRA); goto 666; end; for lVol := 1 to lOutHdr.dim[4] do begin lOutVolOffset := (lVol -1) * lImgSamples; lEvenVol := lNegRA^[lVol]; lOddVol := lPosRA^[lVol]; if (lEvenVol > 0) and (lOddVol > 0) and (lEvenVol <= lInHdr.dim[4]) and (lOddVol <= lInHdr.dim[4]) then begin Msg (inttostr(lVol) +' = '+inttostr(lOddVol)+' - '+inttostr(lEvenVol) ); lInVolEvenOffset := (lEvenVol -1) * lImgSamples; lInVolOddOffset := (lOddVol -1) * lImgSamples; for lInc := 1 to lImgSamples do begin lOdd := l32Buf^[lInVolOddOffset+lInc]; lEven := l32Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lOdd - lEven; end; //each voxel in volume end else begin Msg ('Error: volumes out of range '+inttostr(lVol) +' = '+inttostr(lOddVol)+' - '+inttostr(lEvenVol) ); end; end; //for lvol freemem(lPosRA); freemem(lNegRA); end else begin //not custom or lSplitOddEven for lVol := 1 to lOutHdr.dim[4] do begin lOutVolOffset := (lVol -1) * lImgSamples; lInVolEvenOffset := ((lVol*2) -1) * lImgSamples; //second, fourth lInVolOddOffset := ((lVol*2) -2) * lImgSamples; //first, thired if lSubtract then begin if lOddMinusEven then begin for lInc := 1 to lImgSamples do begin lOdd := l32Buf^[lInVolOddOffset+lInc]; lEven := l32Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lOdd - lEven; end; //for lImgSamples end else begin //not lOddMinusEven for lInc := 1 to lImgSamples do begin lOdd := l32Buf^[lInVolOddOffset+lInc]; lEven := l32Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lEven-lOdd; end; //for lImgSamples end; //if else lOddMinusEven end else begin //not subtract... add for lInc := 1 to lImgSamples do begin lOdd := l32Buf^[lInVolOddOffset+lInc]; lEven := l32Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lOdd + lEven; end; //for lImgSamples end; //add end; //for lvol end; lresultStr := SaveNIfTICore (lOutImgName, lBuffAligned, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); //next make mean lresultStr := SaveMean32 (lOutImgName, lOutHdr, lBuffAligned,lImgBuffer,lPrefs,lByteSwap); 666: Freemem(lSrcBuffer); Freemem(lBuffUnaligned); if lResultStr = '' then //error - do not report success exit; result := true; end; //ASL_subtract32 //end 32bit versions function SaveMean (var lHdrName: string;var lInHdr: TNIFTIhdr; lInBuffer : SmallIntP; lPrefs: TPrefs; lByteSwap:boolean ): string; var lOutHdr : TNIFTIhdr; lOutImgName: string; lVol,lOutVolOffset,lInc,lImgSamples: integer; lSum: double; lBuffUnaligned,lBuffAligned: bytep; lImgBuffer: Singlep; begin result := ''; lOutHdr := lInHdr; lImgSamples := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]; if (lImgSamples < 1) or (lInHdr.dim[4] < 1) then exit; GetMem(lBuffUnaligned ,(sizeof(single)*lImgSamples) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := Align(lBuffUnaligned,16); // not commented - check this {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lInc := 1; lImgBuffer := SingleP(@lBuffAligned^[kNIIImgOffset+lInc]); //next make mean lOutImgName := ChangeFilePrefix (lHdrName,'mean'); for lInc := 1 to lImgSamples do begin lSum := 0; lOutVolOffset := 0; for lVol := 1 to lInHdr.dim[4] do begin lSum := lSum+lInBuffer^[lOutVolOffset+lInc]; lOutVolOffset := lOutVolOffset+lImgSamples; end; lImgBuffer^[lInc] := (lSum /lOutHdr.dim[4]); end; lOutHdr.dim[4] := 1; lOutHdr.datatype := kDT_FLOAT; lOutHdr.bitpix := 32; result := SaveNIfTICore (lOutImgName, lBuffAligned, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); freemem( lBuffUnaligned); end; //SaveMean (*function SaveMean (var lHdrName: string;var lInHdr: TNIFTIhdr; lBuffAligned: bytep;lImgBuffer : SmallIntP;lPrefs: TPrefs; lByteSwap:boolean ): string; var lOutHdr : TNIFTIhdr; lOutImgName: string; lVol,lOutVolOffset,lInc,lImgSamples: integer; lSum: double; begin result := ''; lOutHdr := lInHdr; lImgSamples := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]; if (lImgSamples < 1) or (lInHdr.dim[4] < 1) then exit; //next make mean lOutImgName := ChangeFilePrefix (lHdrName,'mean'); for lInc := 1 to lImgSamples do begin lSum := 0; lOutVolOffset := 0; for lVol := 1 to lInHdr.dim[4] do begin lSum := lSum+lImgBuffer^[lOutVolOffset+lInc]; lOutVolOffset := lOutVolOffset+lImgSamples; end; lImgBuffer^[lInc] := round(lSum /lOutHdr.dim[4]); end; lOutHdr.dim[4] := 1; result := SaveNIfTICore (lOutImgName, lBuffAligned, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); end; //SaveMean*) function ASL_subtract(var lHdrName: string; lOverwrite: boolean; lFunction : integer; lPrefs: TPrefs): boolean; //lFunction : //0 = Subtract (even-odd) //1= Subtract (odd-even) //2= Subtract custom //3= Add (odd+even) BOLD //4= Parse OddEven aka SplitOddEven //for odd/even, first scan is odd (1), second scan is even (2) [indexed from 1] label 666; var lPosRA,lNegRA: LongIntp; lImgOffset,lVol,lInVolOddOffset,lInVolEvenOffset,lOutVolOffset, lOddVol,lEvenVol: integer; lImgSamples,l4DVox,lInc: integer; lCSVname,lResultStr,lOutImgName: string; lInHdr, lOutHdr : TNIFTIhdr; lSplitOddEven,lCustom,lSubtract,lOddMinusEven,lByteSwap: boolean; lBuffer,lSrcBuffer, lBuffUnaligned,lBuffAligned: bytep; lOdd,lEven: integer; lImgBuffer,l16Buf : SmallIntP; //lSum: double; begin lSplitOddEven := lFunction = 4; lCustom := lFunction = 2; lOddMinusEven := lFunction = 1; lSubtract := (lFunction <> 3); result := false; if not NIFTIhdr_LoadHdr (lHdrName, lInHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lHdrName); exit; end; case lInHdr.datatype of {kDT_UNSIGNED_CHAR,}kDT_SIGNED_SHORT{,kDT_UINT16, kDT_SIGNED_INT,kDT_FLOAT}:;//Supported kDT_FLOAT: begin result := ASL_subtract32(lHdrName,lOverwrite,lFunction,lPrefs); exit; end;//kDT_FLOAT else begin Msg('Error with ASL_subtract: image format must be 16-bit signed integers.'); exit; end; end;//case headertype if (odd(lInHdr.dim[4])) or (lInHdr.dim[4] < 2) then begin Msg('ASL routines require an even number of volumes'); exit; end; if not NIFTIhdr_LoadImg (lHdrName, lInHdr, lSrcBuffer, lImgOffset,lByteSwap) then exit; lBuffer := (@lSrcBuffer^[lImgOffset+1]); l16Buf := SmallIntP(lBuffer ); if lOverwrite then lOutImgName := lHdrName else begin if lSplitOddEven then lOutImgName := ChangeFilePrefix (lHdrName,'odd') else if lSubtract then begin if lCustom then lOutImgName := ChangeFilePrefix (lHdrName,'subc') else if lOddMinusEven then lOutImgName := ChangeFilePrefix (lHdrName,'subome') else lOutImgName := ChangeFilePrefix (lHdrName,'subemo') end else lOutImgName := ChangeFilePrefix (lHdrName,'add'); end; lOutHdr := lInHdr; lOutHdr.dim[4] := lInHdr.dim[4] div 2; lOutHdr.pixdim[4] := 2 * lInHdr.pixdim[4]; lImgSamples := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]; l4DVox := lImgSamples * lOutHdr.dim[4]; //l3DBytes := l3DVox*(lOutHdr.bitpix div 8); //l4DBytes := l3DBytes*lOutHdr.dim[4]; if lCustom then lResultStr := 'Custom subtraction' else if lSubtract then begin if lOddMinusEven then lResultStr := 'Subtract Odd-Even' else lResultStr := 'Subtract Even-Odd'; end else lResultStr := 'Add Odd+Even'; Msg('Computing '+lResultStr+' '+lHdrName); lResultStr := ''; //assume error GetMem(lBuffUnaligned ,(sizeof(smallint)*l4DVox) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := Align(lBuffUnaligned,16); // not commented - check this {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lInc := 1; lImgBuffer := SmallIntP(@lBuffAligned^[kNIIImgOffset+lInc]); if lByteSwap then for lInc := 1 to l4DVox do l16Buf^[lInc] := Swap(l16Buf^[lInc]) ; if lSplitOddEven then begin //compute odd for lVol := 1 to lOutHdr.dim[4] do begin lOutVolOffset := (lVol -1) * lImgSamples; //lInVolEvenOffset := ((lVol*2) -1) * lImgSamples; //second, fourth lInVolOddOffset := ((lVol*2) -2) * lImgSamples; //first, thired for lInc := 1 to lImgSamples do begin lOdd := l16Buf^[lInVolOddOffset+lInc]; //lEven := l16Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lOdd; end; //for lImgSamples end; //for lvol lresultStr := SaveNIfTICore (lOutImgName, lBuffAligned, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); lresultStr := SaveMean (lOutImgName, lOutHdr, lImgBuffer,lPrefs,lByteSwap); //compute even lOutImgName := ChangeFilePrefix (lHdrName,'even'); for lVol := 1 to lOutHdr.dim[4] do begin lOutVolOffset := (lVol -1) * lImgSamples; lInVolEvenOffset := ((lVol*2) -1) * lImgSamples; //second, fourth //lInVolOddOffset := ((lVol*2) -2) * lImgSamples; //first, thired for lInc := 1 to lImgSamples do begin //lOdd := l16Buf^[lInVolOddOffset+lInc]; lEven := l16Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lEven; end; //for lImgSamples end; //for lvol end else if lCustom then begin //not lSplitOddEven .. if Custom Msg('Select a comma separated text file that describes how to subtract images.'); Msg('For example, to subtract a six volume dataset your file could be:'); Msg('1,6'); Msg('2,5'); Msg('3,4'); Msg('The first output volume would be the first input volume minus the sixth'); Msg('The second output volume would be the second input volume minus the fifth'); Msg('The final output volume would be the third input volume minus the fourth'); Msg('Your file should have '+inttostr(lOutHdr.dim[4])+' lines, one for each output volume'); if not MainForm.OpenDialogExecute('Select NIfTI images you wish to modify)',true,false,kTxtFilter) then goto 666; lCSVName := MainForm.OpenHdrDlg.Filename; //MainForm.BrowseDialog('Choose collapase file if not readCSV (lCSVname, lVol, lPosRA,lNegRA) then goto 666; if lVol < lOutHdr.dim[4] then begin Msg ('Only found '+inttostr(lVol)+' contrasts in '+ lCSVName+' a total of '+inttostr(lOutHdr.dim[4])+' required'); freemem(lPosRA); freemem(lNegRA); goto 666; end; for lVol := 1 to lOutHdr.dim[4] do begin lOutVolOffset := (lVol -1) * lImgSamples; lEvenVol := lNegRA^[lVol]; lOddVol := lPosRA^[lVol]; if (lEvenVol > 0) and (lOddVol > 0) and (lEvenVol <= lInHdr.dim[4]) and (lOddVol <= lInHdr.dim[4]) then begin Msg (inttostr(lVol) +' = '+inttostr(lOddVol)+' - '+inttostr(lEvenVol) ); lInVolEvenOffset := (lEvenVol -1) * lImgSamples; //second, fourth lInVolOddOffset := (lOddVol -1) * lImgSamples; //first, thired for lInc := 1 to lImgSamples do begin lOdd := l16Buf^[lInVolOddOffset+lInc]; lEven := l16Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lOdd - lEven; end; //each voxel in volume end else begin Msg ('Error: volumes out of range '+inttostr(lVol) +' = '+inttostr(lOddVol)+' - '+inttostr(lEvenVol) ); end; end; //for lvol freemem(lPosRA); freemem(lNegRA); end else begin //not custom or lSplitOddEven for lVol := 1 to lOutHdr.dim[4] do begin lOutVolOffset := (lVol -1) * lImgSamples; lInVolEvenOffset := ((lVol*2) -1) * lImgSamples; //second, fourth lInVolOddOffset := ((lVol*2) -2) * lImgSamples; //first, thired if lSubtract then begin if lOddMinusEven then begin for lInc := 1 to lImgSamples do begin lOdd := l16Buf^[lInVolOddOffset+lInc]; lEven := l16Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lOdd - lEven; end; //for lImgSamples end else begin //not lOddMinusEven for lInc := 1 to lImgSamples do begin lOdd := l16Buf^[lInVolOddOffset+lInc]; lEven := l16Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lEven-lOdd; end; //for lImgSamples end; //if else lOddMinusEven end else begin //not subtract... add for lInc := 1 to lImgSamples do begin lOdd := l16Buf^[lInVolOddOffset+lInc]; lEven := l16Buf^[lInVolEvenOffset+lInc]; lImgBuffer^[lOutVolOffset+lInc] := lOdd + lEven; end; //for lImgSamples end; //add end; //for lvol end; lresultStr := SaveNIfTICore (lOutImgName, lBuffAligned, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); //next make mean lresultStr := SaveMean (lOutImgName, lOutHdr, lImgBuffer,lPrefs,lByteSwap); 666: Freemem(lSrcBuffer); Freemem(lBuffUnaligned); if lResultStr = '' then //error - do not report success exit; result := true; end; //ASL_subtract end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nii_4dto3d.pas0000664000175000017500000003633111412137706021652 0ustar michaelmichaelunit nii_4dto3d; {$H+} interface uses {$IFDEF FPC}gzio2,{$ENDIF} SysUtils,define_types,dicomtypes,niftiutil,prefs,nii_orient,nii_crop; //function Convert4Dto3D(var lHdrName: string; var lHdr: TNIFTIhdr; lByteSwap,lSPM2in,lSingleNIIFile,lGZ :boolean ): boolean; //function Clip4D(var lHdrName: string; var lHdr: TNIFTIhdr; lByteSwap,lSPM2in,lSingleNIIFile,lGZ,lOverwrite: boolean; lStartIn,lEndIn: integer ): string; function ModifyAnalyze(lFilename: string; lPrefs: TPrefs): boolean; function Clip4D(var lHdrName: string; var lHdr: TNIFTIhdr;lOverwrite: boolean; lPrefs: TPrefs; lStartIn,lEndIn: integer): string; //function Reorder4D(var lHdrName: string; var lHdr: TNIFTIhdr; lByteSwap,lSPM2in,lSingleNIIFile,lGZ,lOverwrite: boolean): boolean; function Reorder4D(var lHdrName: string; var lHdr: TNIFTIhdr; lOverwrite: boolean; lPrefs: TPrefs): boolean; implementation uses dialogsx; function ModifyAnalyze(lFilename: string; lPrefs: TPrefs): boolean; var lExt,lOutname: string; lHdr: TNIFTIhdr; lFormat,lStartIn,lEndIn: integer; lByteSwap,lReorder: boolean; lPref: TPrefs; begin lPref := lPrefs; result := false; lStartIn := 0; lEndIn := 0; lReorder := false; lExt := UpCaseExt(lFilename); if not NIFTIhdr_LoadHdr (lFilename, lHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; if lPrefs.AutoCrop then begin Msg('Autocrop NIfTI/Analyze image '+lFileName); lOutname := Reorient(lFilename,lHdr, lPrefs,false,false); if lOutname <> '' then CropNIfTI(lOutname,lPrefs); exit; end; Msg('Adjusting NIfTI/Analyze image '+lFileName); //next - determine output format if not lPref.ManualNiFtiConv then begin lStartIn := 0; lEndIn := 0; lReorder := false; end else begin //manually specify conversion parameters lFormat := GetInt('Output: 0=spm2,1=spm5,2=spm8,3=hdr4D,4=fsl,5=fsl.gz ', 0,DefaultOutputFormat (lPrefs),5); SetOutputFormat(lFormat,lPref); //: 0=SPM2,1=SPM5,2=spm8,3=4D hdr/img,4=fsl(default),5=fsl.gz (* if (lFormat <= 0) then lPref.SPM2 := true else lPref.SPM2 := false; if (lFormat <= 1) then //0,1 = hdr/img pairs lPref.singleNIIfile := false else //>1 = .nii lPref.singleNIIfile := true; if (lFormat <= 2) then //0,1,2 = 3D output lPref.fourD := false else //>2 = 4D lPref.fourD := true; if (lFormat >= 4) then lPref.GZip := true else lPref.GZip := false; *) //next - 4D images: clip ends or flip order if lHdr.dim[4] > 1 then begin //4D file if (lHdr.dim[4] > 1) and (lHdr.dim[3] > 1) then begin Msg(' Enter a value of -1 to flip 3rd and 4th dimensions.'); lStartIn := -1; end else lStartIn := 0; lStartIn := GetInt('Enter volumes to remove from start ', lStartIn,0,lHdr.dim[4]); if lStartIn >= 0 then lEndIn := GetInt('Enter volumes to remove from end ' ,0,0,lHdr.dim[4]); if ((lStartIn < 0) or (lEndIn < 0)) and (lHdr.dim[4] > 1) and (lHdr.dim[3] > 1) then lReorder := true else lReorder := false; if lHdr.dim[4] <= (lStartIn+lEndIn) then begin Msg('Clip Analyze aborted: unable to remove this many volumes.'); exit; end; end;(* else begin //not 4D file l4Dto3D := false; lStartIn := 0; lEndIn := 0; lReorder := false; end;//if 4D else *) end; //manual specification of conversion // (* if lExt = '.NII.GZ' then begin //lTempName := lFilename;//ChangeFilePrefixExt (lFileName,'x'); ExtractFileParts (lFileName, lNameWOExt,lExt); lTempName := lNameWOExt+'.nii'; Gunzip(lFileName,lTempName); //Msg('Unzip '+lFilename+'->'+lTempName); lFilename := lTempName; end else //not gzip lTempName := ''; *) //Next create reordered or trimmed image in the correct format if lReorder then begin if not Reorder4D(lFileName, lHdr, false,lPref) then exit; //if not Reorder4D(lFileName, lHdr, lByteSwap,lSPM2,lSingleFile,lGZ, false) then exit; end else if (lStartIn=0) and (lEndIn= 0) then begin if not ChangeNIfTISubformat(lFileName, lHdr,lPref) then begin Msg('Error changing format!'); exit; end; end else begin if Clip4D(lFileName, lHdr, false,lPref,lStartIn,lEndIn)='' then exit; end; result := true; end; function Clip4D(var lHdrName: string; var lHdr: TNIFTIhdr;lOverwrite: boolean; lPrefs: TPrefs; lStartIn,lEndIn: integer): string; var lImgBuffer: byteP; lImgOffset: integer; lOutImgName: string; lByteSwap: boolean; begin result := ''; if not NIFTIhdr_LoadImg (lHdrName, lHdr, lImgBuffer, lImgOffset,lByteSwap) then exit; Msg('4D Clipping '+lHdrName); lOutImgName := ChangeFilePrefix (lHdrName,'f'); result := SaveNIfTICoreCrop (lOutImgName, lImgBuffer, lImgOffset+1,lStartIn,lEndIn, lHdr, lPrefs,lByteSwap); Freemem(lImgBuffer); end; function Reorder4D(var lHdrName: string; var lHdr: TNIFTIhdr; lOverwrite: boolean; lPrefs: TPrefs): boolean; var lInBuffer,lOutBuffer: byteP; lImgOffset,lSliceBytes,lIn3DBytes,l4DBytes,lVol,lInPos,lOutPos,lSlice: integer; lOutImgName: string; lOutHdr : TNIFTIhdr; lByteSwap: boolean; begin result := false; if not NIFTIhdr_LoadImg (lHdrName, lHdr, lInBuffer, lImgOffset,lByteSwap) then exit; if (lHdr.dim[4] < 2) or (lHdr.dim[3] < 2) then exit; if lOverwrite then lOutImgName := lHdrName else lOutImgName := ChangeFilePrefix (lHdrName,'x'); lOutHdr := lHdr; lOutHdr.dim[3] := lHdr.dim[4]; lOutHdr.dim[4] := lHdr.dim[3]; lSliceBytes := lHdr.dim[1]*lHdr.dim[2]*(lHdr.bitpix div 8); lIn3DBytes := lSliceBytes*lHdr.dim[3]; l4DBytes := lIn3DBytes*lHdr.dim[4]; Msg('Changing order of dimensions 3 and 4 of '+lHdrName); GetMem(lOutBuffer,l4DBytes+kNIIImgOffset); lOutPos := kNIIImgOffset + 1; for lVol := 1 to lOutHdr.dim[4] do begin lInPos := ((lVol-1)*lSliceBytes) + lImgOffset+1; for lSlice := 1 to lOutHdr.dim[3] do begin Move(lInBuffer^[lInPos],lOutBuffer^[lOutPos],lSliceBytes); lInPos := lInPos + lIn3DBytes; lOutPos := lOutPos + lSliceBytes; end;//for lslice end; //for lvol Msg(lOutImgName); if SaveNIfTICore (lOutImgName, lOutBuffer, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap) = '' then begin Msg('Reorder Error'); Freemem(lInBuffer); Freemem(lOutBuffer); exit; end; result := true; end; (*function Reorder4D(var lHdrName: string; var lHdr: TNIFTIhdr; lByteSwap,lSPM2in,lSingleNIIFile,lGZ,lOverwrite: boolean): boolean; var lOutHdr: TNIFTIhdr; lInName,lImgName: string; lPos,lSlice,lVol,lInVolBytes,lSliceBytes: integer; lBuffer: bytep; lGZi,lSPM2: boolean; lOutF,lInF: File; begin result := false; lGZi := lGZ; lSPM2 := lSPM2in; if lSingleNIIFIle then lSPM2 := false; if (lHdr.dim[4] < 2) or (lHdr.dim[3] < 2) then exit; lOutHdr := lHdr; lOutHdr.dim[4] := lHdr.dim[3]; lOutHdr.dim[3] := lHdr.dim[4]; lSliceBytes := lHdr.dim[1]*lHdr.dim[2]*(lHdr.bitpix div 8); lInVolBytes := lSliceBytes*lHdr.dim[3]; GetMem(lBuffer,lSliceBytes); if UpCaseExt(lHdrName) ='.HDR' then begin if lOverwrite then deletefile(lHdrName); lInName := changefileext(lHdrName,'.img') end else begin lOutHdr.vox_offset := 352; lInName := lHdrName; end; if not fileexists(lInName) then begin Msg('4Dclip Error: Unable to find '+lInName); exit; end; if FSize (lInName) < ( (lInVolBytes*lHdr.dim[4])+round(lHdr.vox_offset)) then begin Msg('4Dclip Error: File smaller than expected (can not convert compressed) '+lInName); exit; end; Msg('Reordering image'); if not lSingleNiiFile then begin lHdrName := changefileext(lHdrName,'.hdr'); lImgName := changefileext(lHdrName,'.img'); lGZi := false; end else begin lHdrName := changefileext(lHdrName,'.nii'); lImgName := changefileext(lHdrName,'.nii'); end; if lOverwrite then begin renamefile(lInName,changefileext(lInName,'.tmp')); lInName := changefileext(lInName,'.tmp'); end else begin lHdrName := ChangeFilePrefixExt (lHdrName,'x'); lImgName := ChangeFilePrefixExt (lImgName,'x'); Msg('saving as '+lHdrName); end; AssignFile(lInF, lInName); Reset(lInF,1); Seek(lInF,round(lHdr.vox_offset)); SaveHdr (lHdrName,lOutHdr,lByteSwap{ false},lSPM2); AssignFile(lOutF, lImgName); if lSingleNIIFile then begin Reset(lOutF,1); Seek(lOutF,352); end else Rewrite(lOutF,1); for lVol := 1 to lOutHdr.dim[4] do begin lPos := ((lVol-1)*lSliceBytes) + round(lHdr.vox_offset); for lSlice := 1 to lOutHdr.dim[3] do begin Filemode := 0; //ReadONly seek(lInF,lPos); BlockRead(lInF, lBuffer^, lSliceBytes); Filemode := 2; BlockWrite(lOutF, lBuffer^, lSliceBytes); lPos := lPos + lInVolBytes; end;//for lslice end; //for lvol CloseFile(lInF); CloseFile(lOutF); Freemem(lBuffer); if lOverwrite then DeleteFile(lInName); if lGZi then GZipFile(lImgName,lImgName+'.gz',true); result := true; end; *) (*function Clip4D(var lHdrName: string; var lHdr: TNIFTIhdr; lByteSwap,lSPM2in, lSingleNIIFile,lGZ,lOverwrite: boolean; lStartIn,lEndIn: integer ): string; var lOutHdr: TNIFTIhdr; lInName,lImgName: string; lVol,lVolBytes,lStart,lEnd: integer; lBuffer: bytep; lGZi,lSPM2 : boolean; lOutF,lInF: File; begin result := ''; lGZi := lGZ; lSPM2 := lSPM2in; if lSingleNIIFIle then lSPM2 := false; lStart := lStartIn; if lStart < 0 then lStart := 0; lEnd := lEndIn; if lEnd < 0 then lEnd := 0; lOutHdr := lHdr; lOutHdr.dim[4] := lOutHdr.dim[4]-lStart-lEnd; if lOutHdr.dim[4] < 1 then exit; lVolBytes := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]*(lOutHdr.bitpix div 8); GetMem(lBuffer,lVolBytes); if UpCaseExt(lHdrName) ='.HDR' then begin if lOverwrite then deletefile(lHdrName); lInName := changefileext(lHdrName,'.img') end else begin lOutHdr.vox_offset := 352; lInName := lHdrName; end; if not fileexists(lInName) then begin Msg('4Dclip Error: Unable to find '+lInName); exit; end; if FSize (lInName) < ( (lVolBytes*lHdr.dim[4])+round(lHdr.vox_offset)) then begin Msg('4Dclip Error: File smaller than expected (can not convert compressed) '+lInName); exit; end; if (lStart > 0) or (lEnd > 0) then Msg('4D clip - removing first '+inttostr(lStart)+' and last '+inttostr(lEnd) +' volumes') else Msg('Formatting image'); if not lSingleNiiFile then begin lGZi := false; lHdrName := changefileext(lHdrName,'.hdr'); lImgName := changefileext(lHdrName,'.img'); end else begin lHdrName := changefileext(lHdrName,'.nii'); lImgName := changefileext(lHdrName,'.nii'); end; if lOverwrite then begin renamefile(lInName,changefileext(lInName,'.tmp')); lInName := changefileext(lInName,'.tmp'); end else begin lHdrName := ChangeFilePrefixExt (lHdrName,'x'); lImgName := ChangeFilePrefixExt (lImgName,'x'); Msg('Saving clipped as '+lHdrName); end; AssignFile(lInF, lInName); Reset(lInF,1); Seek(lInF,round(lHdr.vox_offset)); SaveHdr (lHdrName,lOutHdr, lByteSwap{false},lSPM2); AssignFile(lOutF, lImgName); if lSingleNIIFile then begin Reset(lOutF,1); Seek(lOutF,352); end else Rewrite(lOutF,1); for lVol := 1 to (lHdr.dim[4]-lEnd) do begin //1st - save header Filemode := 0; //ReadONly BlockRead(lInF, lBuffer^, lVolBytes); if (lVol > lStart) then begin Filemode := 2; BlockWrite(lOutF, lBuffer^, lVolBytes); end; end; CloseFile(lInF); CloseFile(lOutF); Freemem(lBuffer); if lOverwrite then DeleteFile(lInName); if lGZi then begin lHdrName := lImgName+'.gz'; GZipFile(lImgName,lHdrName,true); end; result := lHdrName; end; function Convert4Dto3D(var lHdrName: string; var lHdr: TNIFTIhdr; lByteSwap, lSPM2in,lSingleNIIFile,lGZ: boolean ): boolean; var lOutHdr: TNIFTIhdr; lOutName,lImgName: string; lVol,lVolBytes: integer; lBuffer: bytep; lSPM2,lGZi: boolean; lOutF,lInF: File; begin result := false; lSPM2 := lSPM2in; if lSingleNIIFIle then lSPM2 := false; lGZi := lGZ; if lHdr.dim[4] < 2 then exit; lOutHdr := lHdr; lOutHdr.dim[0] := 3;//3D lOutHdr.dim[4] := 1; lVolBytes := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]*(lOutHdr.bitpix div 8); GetMem(lBuffer,lVolBytes); //lSingleNIIFile := true; if UpCaseExt(lHdrName) ='.HDR' then begin //lSingleNIIFile := false; lImgName := changefileext(lHdrName,'.img') end else lImgName := lHdrName; if not fileexists(lImgName) then begin Msg('4D->3D Error: Unable to find '+lImgName); exit; end; if FSize (lImgName) < ( (lVolBytes*lHdr.dim[4])+round(lHdr.vox_offset)) then begin Msg('4D->3D Error: File smaller than expected (can not convert compressed) '+lImgName); exit; end; //Msg(inttostr(round(lHdr.vox_offset))); AssignFile(lInF, lImgName); Reset(lInF,1); Seek(lInF,round(lHdr.vox_offset)); if not lSingleNiiFile then begin lGZi := false; lHdrName := changefileext(lHdrName,'.hdr'); lImgName := changefileext(lHdrName,'.img'); end else begin lHdrName := changefileext(lHdrName,'.nii'); lImgName := changefileext(lHdrName,'.nii'); end; for lVol := 1 to lHdr.dim[4] do begin //1st - save header lOutName := AddFileNum(lVol,lHdr.dim[4],lHdrName); SaveHdr (lOutName,lOutHdr,lByteSwap {false},lSPM2); Filemode := 0; //ReadONly BlockRead(lInF, lBuffer^, lVolBytes); lOutName := AddFileNum(lVol,lHdr.dim[4],lImgName); Filemode := 2; AssignFile(lOutF, lOutName); if (lSingleNIIFile) and (not lSPM2) then begin Reset(lOutF,1); Seek(lOutF,352); end else Rewrite(lOutF,1); BlockWrite(lOutF, lBuffer^, lVolBytes); CloseFile(lOutF); if lGZi then begin GZipFile(lOutName,lOutName+'.gz',true); //DeleteFile(lOutName); end; end; CloseFile(lInF); Freemem(lBuffer); //if lDeleteOrig then begin DeleteFile(lHdrName); if not lSingleNIIFile then DeleteFile(lImgName); //end; end; *) end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nii_3dto4d.pas0000664000175000017500000003463511511047412021651 0ustar michaelmichaelunit nii_3dto4d; {$H+} interface uses {$IFDEF FPC}gzio2,{$ENDIF} SysUtils,define_types,dicomtypes,niftiutil,prefs,classes; function Stack3Dto4D(var lStr: TStringList; lOverwrite: boolean; lPrefs: TPrefs): boolean; function ExtractNIFTIHdrs(var lStr: TStringList): boolean; implementation uses dialogsx; function LeadingZeroFilename (lInX: string): string; var lIn: string; lC,lnPad,lPos,lnDec,lExtPos,lLen: integer; begin {$IFDEF Unix} lIn := lInX; {$ELSE} lIn := Lowercase(lInX); {$ENDIF} lnPad := 8; lLen := length(lIn); result := lIn; if lLen < 1 then exit; lExtPos := 1; while (lExtPos <= lLen) and (lIn[lExtPos] <> '.') do inc(lExtPos); if lExtPos <= 1 then exit; //lnDec := 0; lPos := lExtPos -1; while (lPos > 0) and ( lIn[lPos] in ['0'..'9']) do dec(lPos); lnDec := (lExtPos-lPos)-1; if (lnDec = 0) or (lnDec >= lnPad) then exit; result := ''; if lPos > 0 then for lC := 1 to lPos do result := result + lIn[lC]; for lC := 1 to (lnPad-lnDec) do result := result + '0'; for lC := (lPos+1) to lLen do result := result+lIn[lC]; end; procedure SortStrPadded (var lStr: TStringList); //file1,file2...file10 not file1,file10..file2 //may be slow: not a great sorting algorithm //may be inefficient: not sure if strings are exchanged or only pointers... var counter, look:integer; temp:Tstrings; begin if lStr.Count < 2 then exit; temp := TStringList.Create; for counter:=0 to lStr.Count-1 do temp.Append(LeadingZeroFilename{LowerCase}(lStr[counter])); for counter:=0 to temp.Count-1 do for look:=counter+1 to temp.Count-1 do if temp[look] kDel) and(lStr[i] <> kTab) and (lStr[i] <> kEsc) and (lStr[i] <> chr(10)) and (lStr[i] <> chr (13)) and (ord(lStr[i]) <> 0) then result := result + lStr[i]; end; result := '"'+result +'"' end; function NIIstr (lFileName: string; lHdr : TNIFTIhdr): string; begin result := lFileName +kTab+'XYZT'+kTab+inttostr(lHdr.Dim[1])+kTab+inttostr(lHdr.Dim[2])+kTab+inttostr(lHdr.Dim[3])+kTab+inttostr(lHdr.Dim[4]) +kTab+'XYZTmm'+kTab+floattostr(lHdr.PixDim[1])+kTab+floattostr(lHdr.PixDim[2])+kTab+floattostr(lHdr.PixDim[3])+kTab+floattostr(lHdr.PixDim[4]) +kTab+'Description'+kTab+PasStr(lHdr.descrip) +kTab+'Data_Type'+kTab+PasStr(lHdr.Data_Type) +kTab+'db_name'+kTab+PasStr(lHdr.db_name) +kTab+'aux_file'+kTab+PasStr(lHdr.aux_file) +kTab+'intent_name'+kTab+PasStr(lHdr.intent_name) ; end; function ExtractNIFTIHdrs(var lStr: TStringList): boolean; var lHdrName: string; lHdr : TNIFTIhdr; lByteSwap: boolean; lVol,lnVol : integer; begin result := false; lnVol := lStr.Count; if lnVol < 1 then exit; SortStrPadded(lStr); NIFTIhdr_LoadHdr (lHdrName, lHdr,lByteSwap); for lVol := 1 to lnVol do begin lHdrName := lStr[lVol-1]; if not NIFTIhdr_LoadHdr (lHdrName, lHdr,lByteSwap) then Msg('Unable to find '+lHdrName) else Msg(NIIstr(lHdrName,lHdr)); //Msg( inttostr(lVol)+': '+lHdrName); end; end; function Stack3Dto4D(var lStr: TStringList; lOverwrite: boolean; lPrefs: TPrefs): boolean; //function Reorder4D(var lHdrName: string; var lHdr: TNIFTIhdr; lOverwrite: boolean; lPrefs: TPrefs): boolean; label 123; var lOutBuffer,lIBuffer: byteP; lInOffset,lnVol,l4DVolBytes,l3DVolBytes,lIn3DBytes,l4DBytes,lVol,lInPos,lOutPos,lSlice: integer; lHdrName,lOutImgName: string; lHdr1,lHdr2,lOutHdr : TNIFTIhdr; lByteSwap: boolean; lPrefs4D: TPrefs; begin result := false; lnVol := lStr.Count; if lnVol < 2 then begin Msg('Stack 3D to 4D requires >1 volume'); exit; end; SortStrPadded(lStr); lHdrName := lStr[0]; NIFTIhdr_LoadHdr (lHdrName, lHdr1,lByteSwap); for lVol := 1 to lnVol do begin lHdrName := lStr[lVol-1]; if not NIFTIhdr_LoadHdr (lHdrName, lHdr2,lByteSwap) then begin Msg('Stack 3D to 4D unable to find '+lHdrName); exit; end; if (lHdr1.dim[4] > 1) then begin Msg('Stack 3D to 4D aborted, image is already 4D: '+lHdrName ); exit; end; if (lHdr1.dim[1] <> lHdr2.dim[1]) or (lHdr1.dim[2] <> lHdr2.dim[2]) or (lHdr1.dim[3] <> lHdr2.dim[3]) or (lHdr1.datatype <> lHdr2.datatype) then begin Msg('Stack 3D to 4D aborted, image dimensions/datatype vary '+lHdrName + ' <> '+lStr[0]); exit; end; //Msg( inttostr(lVol)+': '+lHdrName); end; lOutHdr := lHdr1; lOutHdr.dim[4] := lnVol; l3DVolBytes := lHdr1.dim[1]*lHdr1.dim[2]*lHdr1.dim[3]*(lHdr1.bitpix div 8); l4DVolBytes := l3DVolBytes * lnVol; GetMem(lOutBuffer,l4DVolBytes+kNIIImgOffset); Msg('Order in output file:'); lOutImgName := ChangeFilePrefix (lStr[0],'4D'); lOutPos := kNIIImgOffset + 1; for lVol := 1 to lnVol do begin lHdrName := lStr[lVol-1]; Msg( inttostr(lVol)+': '+lHdrName); if not NIFTIhdr_LoadImg (lHdrName, lHdr2, lIBuffer, lInOffset,lByteSwap) then begin Msg('3D -> 4D error loading image '+lHdrName); goto 123; end; Move(lIBuffer^[lInOffset+1],lOutBuffer^[lOutPos],l3DVolBytes); freemem(lIBuffer); lOutPos := lOutPos + l3DVolBytes; end; lPrefs4D := lPrefs; lPrefs4D.fourD := true; Msg('4D image '+lOutImgName); if SaveNIfTICore (lOutImgName, lOutBuffer, kNIIImgOffset+1, lOutHdr, lPrefs4D,lByteSwap) = '' then begin Msg('3D -> 4D Error'); goto 123; end; freemem(lOutBuffer); result := true; exit; 123: freemem(lOutBuffer); end; (*function Reorder4D(var lHdrName: string; var lHdr: TNIFTIhdr; lByteSwap,lSPM2in,lSingleNIIFile,lGZ,lOverwrite: boolean): boolean; var lOutHdr: TNIFTIhdr; lInName,lImgName: string; lPos,lSlice,lVol,lInVolBytes,lSliceBytes: integer; lBuffer: bytep; lGZi,lSPM2: boolean; lOutF,lInF: File; begin result := false; lGZi := lGZ; lSPM2 := lSPM2in; if lSingleNIIFIle then lSPM2 := false; if (lHdr.dim[4] < 2) or (lHdr.dim[3] < 2) then exit; lOutHdr := lHdr; lOutHdr.dim[4] := lHdr.dim[3]; lOutHdr.dim[3] := lHdr.dim[4]; lSliceBytes := lHdr.dim[1]*lHdr.dim[2]*(lHdr.bitpix div 8); lInVolBytes := lSliceBytes*lHdr.dim[3]; GetMem(lBuffer,lSliceBytes); if UpCaseExt(lHdrName) ='.HDR' then begin if lOverwrite then deletefile(lHdrName); lInName := changefileext(lHdrName,'.img') end else begin lOutHdr.vox_offset := 352; lInName := lHdrName; end; if not fileexists(lInName) then begin Msg('4Dclip Error: Unable to find '+lInName); exit; end; if FSize (lInName) < ( (lInVolBytes*lHdr.dim[4])+round(lHdr.vox_offset)) then begin Msg('4Dclip Error: File smaller than expected (can not convert compressed) '+lInName); exit; end; Msg('Reordering image'); if not lSingleNiiFile then begin lHdrName := changefileext(lHdrName,'.hdr'); lImgName := changefileext(lHdrName,'.img'); lGZi := false; end else begin lHdrName := changefileext(lHdrName,'.nii'); lImgName := changefileext(lHdrName,'.nii'); end; if lOverwrite then begin renamefile(lInName,changefileext(lInName,'.tmp')); lInName := changefileext(lInName,'.tmp'); end else begin lHdrName := ChangeFilePrefixExt (lHdrName,'x'); lImgName := ChangeFilePrefixExt (lImgName,'x'); Msg('saving as '+lHdrName); end; AssignFile(lInF, lInName); Reset(lInF,1); Seek(lInF,round(lHdr.vox_offset)); SaveHdr (lHdrName,lOutHdr,lByteSwap{ false},lSPM2); AssignFile(lOutF, lImgName); if lSingleNIIFile then begin Reset(lOutF,1); Seek(lOutF,352); end else Rewrite(lOutF,1); for lVol := 1 to lOutHdr.dim[4] do begin lPos := ((lVol-1)*lSliceBytes) + round(lHdr.vox_offset); for lSlice := 1 to lOutHdr.dim[3] do begin Filemode := 0; //ReadONly seek(lInF,lPos); BlockRead(lInF, lBuffer^, lSliceBytes); Filemode := 2; BlockWrite(lOutF, lBuffer^, lSliceBytes); lPos := lPos + lInVolBytes; end;//for lslice end; //for lvol CloseFile(lInF); CloseFile(lOutF); Freemem(lBuffer); if lOverwrite then DeleteFile(lInName); if lGZi then GZipFile(lImgName,lImgName+'.gz',true); result := true; end; *) (*function Clip4D(var lHdrName: string; var lHdr: TNIFTIhdr; lByteSwap,lSPM2in, lSingleNIIFile,lGZ,lOverwrite: boolean; lStartIn,lEndIn: integer ): string; var lOutHdr: TNIFTIhdr; lInName,lImgName: string; lVol,lVolBytes,lStart,lEnd: integer; lBuffer: bytep; lGZi,lSPM2 : boolean; lOutF,lInF: File; begin result := ''; lGZi := lGZ; lSPM2 := lSPM2in; if lSingleNIIFIle then lSPM2 := false; lStart := lStartIn; if lStart < 0 then lStart := 0; lEnd := lEndIn; if lEnd < 0 then lEnd := 0; lOutHdr := lHdr; lOutHdr.dim[4] := lOutHdr.dim[4]-lStart-lEnd; if lOutHdr.dim[4] < 1 then exit; lVolBytes := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]*(lOutHdr.bitpix div 8); GetMem(lBuffer,lVolBytes); if UpCaseExt(lHdrName) ='.HDR' then begin if lOverwrite then deletefile(lHdrName); lInName := changefileext(lHdrName,'.img') end else begin lOutHdr.vox_offset := 352; lInName := lHdrName; end; if not fileexists(lInName) then begin Msg('4Dclip Error: Unable to find '+lInName); exit; end; if FSize (lInName) < ( (lVolBytes*lHdr.dim[4])+round(lHdr.vox_offset)) then begin Msg('4Dclip Error: File smaller than expected (can not convert compressed) '+lInName); exit; end; if (lStart > 0) or (lEnd > 0) then Msg('4D clip - removing first '+inttostr(lStart)+' and last '+inttostr(lEnd) +' volumes') else Msg('Formatting image'); if not lSingleNiiFile then begin lGZi := false; lHdrName := changefileext(lHdrName,'.hdr'); lImgName := changefileext(lHdrName,'.img'); end else begin lHdrName := changefileext(lHdrName,'.nii'); lImgName := changefileext(lHdrName,'.nii'); end; if lOverwrite then begin renamefile(lInName,changefileext(lInName,'.tmp')); lInName := changefileext(lInName,'.tmp'); end else begin lHdrName := ChangeFilePrefixExt (lHdrName,'x'); lImgName := ChangeFilePrefixExt (lImgName,'x'); Msg('Saving clipped as '+lHdrName); end; AssignFile(lInF, lInName); Reset(lInF,1); Seek(lInF,round(lHdr.vox_offset)); SaveHdr (lHdrName,lOutHdr, lByteSwap{false},lSPM2); AssignFile(lOutF, lImgName); if lSingleNIIFile then begin Reset(lOutF,1); Seek(lOutF,352); end else Rewrite(lOutF,1); for lVol := 1 to (lHdr.dim[4]-lEnd) do begin //1st - save header Filemode := 0; //ReadONly BlockRead(lInF, lBuffer^, lVolBytes); if (lVol > lStart) then begin Filemode := 2; BlockWrite(lOutF, lBuffer^, lVolBytes); end; end; CloseFile(lInF); CloseFile(lOutF); Freemem(lBuffer); if lOverwrite then DeleteFile(lInName); if lGZi then begin lHdrName := lImgName+'.gz'; GZipFile(lImgName,lHdrName,true); end; result := lHdrName; end; function Convert4Dto3D(var lHdrName: string; var lHdr: TNIFTIhdr; lByteSwap, lSPM2in,lSingleNIIFile,lGZ: boolean ): boolean; var lOutHdr: TNIFTIhdr; lOutName,lImgName: string; lVol,lVolBytes: integer; lBuffer: bytep; lSPM2,lGZi: boolean; lOutF,lInF: File; begin result := false; lSPM2 := lSPM2in; if lSingleNIIFIle then lSPM2 := false; lGZi := lGZ; if lHdr.dim[4] < 2 then exit; lOutHdr := lHdr; lOutHdr.dim[0] := 3;//3D lOutHdr.dim[4] := 1; lVolBytes := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]*(lOutHdr.bitpix div 8); GetMem(lBuffer,lVolBytes); //lSingleNIIFile := true; if UpCaseExt(lHdrName) ='.HDR' then begin //lSingleNIIFile := false; lImgName := changefileext(lHdrName,'.img') end else lImgName := lHdrName; if not fileexists(lImgName) then begin Msg('4D->3D Error: Unable to find '+lImgName); exit; end; if FSize (lImgName) < ( (lVolBytes*lHdr.dim[4])+round(lHdr.vox_offset)) then begin Msg('4D->3D Error: File smaller than expected (can not convert compressed) '+lImgName); exit; end; //Msg(inttostr(round(lHdr.vox_offset))); AssignFile(lInF, lImgName); Reset(lInF,1); Seek(lInF,round(lHdr.vox_offset)); if not lSingleNiiFile then begin lGZi := false; lHdrName := changefileext(lHdrName,'.hdr'); lImgName := changefileext(lHdrName,'.img'); end else begin lHdrName := changefileext(lHdrName,'.nii'); lImgName := changefileext(lHdrName,'.nii'); end; for lVol := 1 to lHdr.dim[4] do begin //1st - save header lOutName := AddFileNum(lVol,lHdr.dim[4],lHdrName); SaveHdr (lOutName,lOutHdr,lByteSwap {false},lSPM2); Filemode := 0; //ReadONly BlockRead(lInF, lBuffer^, lVolBytes); lOutName := AddFileNum(lVol,lHdr.dim[4],lImgName); Filemode := 2; AssignFile(lOutF, lOutName); if (lSingleNIIFile) and (not lSPM2) then begin Reset(lOutF,1); Seek(lOutF,352); end else Rewrite(lOutF,1); BlockWrite(lOutF, lBuffer^, lVolBytes); CloseFile(lOutF); if lGZi then begin GZipFile(lOutName,lOutName+'.gz',true); //DeleteFile(lOutName); end; end; CloseFile(lInF); Freemem(lBuffer); //if lDeleteOrig then begin DeleteFile(lHdrName); if not lSingleNIIFile then DeleteFile(lImgName); //end; end; *) end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nifti_form.pas0000664000175000017500000000575111477174574022067 0ustar michaelmichaelunit nifti_form; interface uses {$IFDEF FPC}LResources, {$ELSE} RXSpin, {$ENDIF} {$IFNDEF UNIX} Windows,{$ENDIF} Buttons, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin, ExtCtrls {, Mask}; {$IFNDEF FPC} type TNIfTIform = class(TForm) ASLCombo: TComboBox; Combo4D: TComboBox; Label1: TLabel; OKBtn: TButton; CancelBtn: TButton; Combo3D: TComboBox; Panel1: TPanel; FormulaPanel: TPanel; StartEdit: TSpinEdit; EndEdit: TSpinEdit; Label2: TLabel; Label3: TLabel; TypeCombo: TComboBox; Label4: TLabel; ASLPanel: TPanel; Label5: TLabel; ScaleEdit: TRxSpinEdit; PowerEdit: TRxSpinEdit; procedure Combo4DChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure OKBtnClick(Sender: TObject); private {$ELSE} type TNIfTIform = class(TForm) ASLCombo: TComboBox; Combo4D: TComboBox; Label1: TLabel; OKBtn: TButton; CancelBtn: TButton; Combo3D: TComboBox; Panel1: TPanel; FormulaPanel: TPanel; StartEdit: TSpinEdit; EndEdit: TSpinEdit; Label2: TLabel; Label3: TLabel; TypeCombo: TComboBox; Label4: TLabel; ASLPanel: TPanel; Label5: TLabel; ScaleEdit: TFloatSpinEdit; PowerEdit: TFloatSpinEdit; procedure Combo4DChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure OKBtnClick(Sender: TObject); private {$ENDIF} {Delphi... ScaleEdit: TRxSpinEdit; PowerEdit: TRxSpinEdit; Lazarus ScaleEdit: TFloatSpinEdit; PowerEdit: TFloatSpinEdit; } { Private declarations } public { Public declarations } end; var NIfTIform: TNIfTIform; implementation {$IFNDEF FPC} {$R *.DFM} {$ENDIF} procedure TNIfTIform.Combo4DChange(Sender: TObject); var lS: string; begin lS := ''; If ((Combo4D.visible) and (Combo4D.ItemIndex = 6)) or ( (not (Combo4D.visible)) and (Combo3D.ItemIndex = 3)) then begin Panel1.visible := true; lS := 'Slices'; end else If (Combo4D.visible) and (Combo4D.ItemIndex = 2) then begin Panel1.visible := true; lS := 'Volumes' end else Panel1.visible := false; if lS <> '' then begin Label2.Caption := lS+' to remove from start'; Label3.Caption := lS+' to remove from end'; end; If (Combo4D.visible) and (Combo4D.ItemIndex = 4) then FormulaPanel.visible := true else FormulaPanel.visible := false; If (Combo4D.visible) and (Combo4D.ItemIndex = 5) then ASLPanel.visible := true else ASLPanel.visible := false; end; procedure TNIfTIform.FormCreate(Sender: TObject); begin Combo3D.ItemIndex := 0; Combo4D.ItemIndex := 0; ASLCombo.ItemIndex := 0; end; procedure TNIfTIform.OKBtnClick(Sender: TObject); begin end; {$IFDEF FPC} initialization {$I nifti_form.lrs} {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nifti_form.lrs0000664000175000017500000001122111477174574022071 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TNIfTIForm','FORMDATA',[ 'TPF0'#10'TNIfTIForm'#9'NIfTIForm'#4'Left'#3#250#0#6'Height'#3#10#1#3'Top'#2 +'b'#5'Width'#3'R'#1#13'ActiveControl'#7#5'OKBtn'#11'BorderIcons'#11#12'biSys' +'temMenu'#0#11'BorderStyle'#7#8'bsDialog'#7'Caption'#6#18'Convert NIfTI File' +#12'ClientHeight'#3#10#1#11'ClientWidth'#3'R'#1#21'Constraints.MaxHeight'#3 +#10#1#20'Constraints.MaxWidth'#3'R'#1#21'Constraints.MinHeight'#3#10#1#20'Co' +'nstraints.MinWidth'#3'R'#1#8'OnCreate'#7#10'FormCreate'#10'LCLVersion'#6#6 +'0.9.29'#0#6'TLabel'#6'Label1'#4'Left'#2#8#6'Height'#2#14#3'Top'#3#168#0#5'W' +'idth'#2'O'#9'Alignment'#7#8'taCenter'#7'Caption'#6#15'Output Format: '#11'P' +'arentColor'#8#0#0#6'TLabel'#6'Label4'#4'Left'#2#8#6'Height'#2#14#3'Top'#2#16 +#5'Width'#2#27#9'Alignment'#7#8'taCenter'#7'Caption'#6#5'Task:'#11'ParentCol' +'or'#8#0#0#7'TButton'#5'OKBtn'#4'Left'#3#200#0#6'Height'#2#25#3'Top'#3#208#0 +#5'Width'#2'K'#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#2'OK'#11'Modal' +'Result'#2#1#7'OnClick'#7#10'OKBtnClick'#8'TabOrder'#2#0#0#0#7'TButton'#9'Ca' +'ncelBtn'#4'Left'#2'h'#6'Height'#2#25#3'Top'#3#208#0#5'Width'#2'K'#25'Border' +'Spacing.InnerBorder'#2#4#7'Caption'#6#6'Cancel'#11'ModalResult'#2#2#8'TabOr' +'der'#2#1#0#0#9'TComboBox'#9'TypeCombo'#4'Left'#2'v'#6'Height'#2#21#3'Top'#3 +#163#0#5'Width'#3#209#0#10'ItemHeight'#2#13#13'Items.Strings'#1#6#24'SPM2 (3' +'D Anlyze hdr/img)'#6#23'SPM5 (3D NIfTI hdr/img)'#6#19'SPM8 (3D NIfTI nii)'#6 +#16'4D NIfTI hdr/img'#6#18'FSL (4D NIfTI nii)'#6#29'Compressed FSL (4D NIfTI' +' nii)'#6#21'MRIcron drawing (voi)'#0#5'Style'#7#14'csDropDownList'#8'TabOrd' +'er'#2#2#0#0#6'TPanel'#6'Panel1'#4'Left'#2'('#6'Height'#2'g'#3'Top'#2'0'#5'W' +'idth'#3#19#1#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'g'#11'ClientWidt' +'h'#3#19#1#8'TabOrder'#2#3#0#6'TLabel'#6'Label2'#4'Left'#2#8#6'Height'#2#14#3 +'Top'#2#15#5'Width'#3#143#0#7'Caption'#6#28'Volumes to remove from start'#11 +'ParentColor'#8#0#0#6'TLabel'#6'Label3'#4'Left'#2#7#6'Height'#2#14#3'Top'#2 +'7'#5'Width'#3#143#0#7'Caption'#6#28'Volumes to remove from start'#11'Parent' +'Color'#8#0#0#9'TSpinEdit'#9'StartEdit'#4'Left'#3#196#0#6'Height'#2#21#3'Top' +#2#6#5'Width'#2'J'#8'TabOrder'#2#0#0#0#9'TSpinEdit'#7'EndEdit'#4'Left'#3#196 +#0#6'Height'#2#21#3'Top'#2'.'#5'Width'#2'J'#8'TabOrder'#2#1#0#0#0#9'TComboBo' +'x'#7'Combo4D'#4'Left'#2'/'#6'Height'#2#21#3'Top'#2#11#5'Width'#3#188#0#10'I' +'temHeight'#2#13#13'Items.Strings'#1#6#13'Change format'#6#23'Flip dimension' +'s 3 and 4'#6#21'Clip 1st/Last Volumes'#6#21'Export as 32-bit real'#6#13'App' +'ly formula'#6#14'ASL conversion'#0#8'OnChange'#7#13'Combo4DChange'#5'Style' +#7#14'csDropDownList'#8'TabOrder'#2#4#0#0#9'TComboBox'#7'Combo3D'#4'Left'#2 +'J'#6'Height'#2#21#3'Top'#2#11#5'Width'#3#188#0#10'ItemHeight'#2#13#13'Items' +'.Strings'#1#6#13'Change format'#6#22'Reorient to orthogonal'#6#17'Reorient ' +'and crop'#0#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#5#0#0#6'TPanel'#8'A' +'SLPanel'#4'Left'#2'('#6'Height'#2'2'#3'Top'#2'('#5'Width'#3#19#1#10'BevelOu' +'ter'#7#6'bvNone'#12'ClientHeight'#2'2'#11'ClientWidth'#3#19#1#8'TabOrder'#2 +#6#0#9'TComboBox'#8'ASLCombo'#4'Left'#2#16#6'Height'#2#21#3'Top'#2#11#5'Widt' +'h'#3#246#0#10'ItemHeight'#2#13#13'Items.Strings'#1#6'#Subtract pairs - firs' +'t image tagged'#6'$Subtract pairs - first image control'#6#15'Subtract Cust' +'om'#6#19'Add (odd+even) BOLD'#0#5'Style'#7#14'csDropDownList'#8'TabOrder'#2 +#0#0#0#0#6'TPanel'#12'FormulaPanel'#4'Left'#2'/'#6'Height'#2'r'#3'Top'#2'%'#5 +'Width'#3#17#1#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'r'#11'ClientWid' +'th'#3#17#1#8'TabOrder'#2#7#0#6'TLabel'#6'Label5'#4'Left'#2#31#6'Height'#2#14 +#3'Top'#2#17#5'Width'#2#26#9'Alignment'#7#8'taCenter'#7'Caption'#6#5'Scale' +#11'ParentColor'#8#0#0#6'TLabel'#6'Label6'#4'Left'#2#31#6'Height'#2#14#3'Top' +#2';'#5'Width'#2#31#9'Alignment'#7#8'taCenter'#7'Caption'#6#5'Power'#11'Pare' +'ntColor'#8#0#0#14'TFloatSpinEdit'#9'ScaleEdit'#4'Left'#2#127#6'Height'#2#21 +#3'Top'#2#11#5'Width'#3#130#0#13'DecimalPlaces'#2#8#9'Increment'#5#0#0#0#0#0 +#0#0#128#255'?'#8'MaxValue'#5#0#0#0#0#0#0#0#200#5'@'#8'MinValue'#5#0#0#0#0#0 +#0#0#0#0#0#8'TabOrder'#2#0#5'Value'#5#0#176#27'l'#160#175#15#161#235'?'#0#0 +#14'TFloatSpinEdit'#9'PowerEdit'#4'Left'#2#127#6'Height'#2#21#3'Top'#2'8'#5 +'Width'#3#130#0#13'DecimalPlaces'#2#8#9'Increment'#5#0#0#0#0#0#0#0#128#255'?' +#8'MaxValue'#5#0#0#0#0#0#0#0#200#5'@'#8'MinValue'#5#0#0#0#0#0#0#0#0#0#0#8'Ta' +'bOrder'#2#1#5'Value'#5#0#176#27'l'#160#175#15#161#235'?'#0#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nifti_form.lfm0000664000175000017500000001113711477174574022055 0ustar michaelmichaelobject NIfTIForm: TNIfTIForm Left = 250 Height = 266 Top = 98 Width = 338 ActiveControl = OKBtn BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Convert NIfTI File' ClientHeight = 266 ClientWidth = 338 Constraints.MaxHeight = 266 Constraints.MaxWidth = 338 Constraints.MinHeight = 266 Constraints.MinWidth = 338 OnCreate = FormCreate LCLVersion = '0.9.29' object Label1: TLabel Left = 8 Height = 14 Top = 168 Width = 79 Alignment = taCenter Caption = 'Output Format: ' ParentColor = False end object Label4: TLabel Left = 8 Height = 14 Top = 16 Width = 27 Alignment = taCenter Caption = 'Task:' ParentColor = False end object OKBtn: TButton Left = 200 Height = 25 Top = 208 Width = 75 BorderSpacing.InnerBorder = 4 Caption = 'OK' ModalResult = 1 OnClick = OKBtnClick TabOrder = 0 end object CancelBtn: TButton Left = 104 Height = 25 Top = 208 Width = 75 BorderSpacing.InnerBorder = 4 Caption = 'Cancel' ModalResult = 2 TabOrder = 1 end object TypeCombo: TComboBox Left = 118 Height = 21 Top = 163 Width = 209 ItemHeight = 13 Items.Strings = ( 'SPM2 (3D Anlyze hdr/img)' 'SPM5 (3D NIfTI hdr/img)' 'SPM8 (3D NIfTI nii)' '4D NIfTI hdr/img' 'FSL (4D NIfTI nii)' 'Compressed FSL (4D NIfTI nii)' 'MRIcron drawing (voi)' ) Style = csDropDownList TabOrder = 2 end object Panel1: TPanel Left = 40 Height = 103 Top = 48 Width = 275 BevelOuter = bvNone ClientHeight = 103 ClientWidth = 275 TabOrder = 3 object Label2: TLabel Left = 8 Height = 14 Top = 15 Width = 143 Caption = 'Volumes to remove from start' ParentColor = False end object Label3: TLabel Left = 7 Height = 14 Top = 55 Width = 143 Caption = 'Volumes to remove from start' ParentColor = False end object StartEdit: TSpinEdit Left = 196 Height = 21 Top = 6 Width = 74 TabOrder = 0 end object EndEdit: TSpinEdit Left = 196 Height = 21 Top = 46 Width = 74 TabOrder = 1 end end object Combo4D: TComboBox Left = 47 Height = 21 Top = 11 Width = 188 ItemHeight = 13 Items.Strings = ( 'Change format' 'Flip dimensions 3 and 4' 'Clip 1st/Last Volumes' 'Export as 32-bit real' 'Apply formula' 'ASL conversion' ) OnChange = Combo4DChange Style = csDropDownList TabOrder = 4 end object Combo3D: TComboBox Left = 74 Height = 21 Top = 11 Width = 188 ItemHeight = 13 Items.Strings = ( 'Change format' 'Reorient to orthogonal' 'Reorient and crop' ) Style = csDropDownList TabOrder = 5 end object ASLPanel: TPanel Left = 40 Height = 50 Top = 40 Width = 275 BevelOuter = bvNone ClientHeight = 50 ClientWidth = 275 TabOrder = 6 object ASLCombo: TComboBox Left = 16 Height = 21 Top = 11 Width = 246 ItemHeight = 13 Items.Strings = ( 'Subtract pairs - first image tagged' 'Subtract pairs - first image control' 'Subtract Custom' 'Add (odd+even) BOLD' ) Style = csDropDownList TabOrder = 0 end end object FormulaPanel: TPanel Left = 47 Height = 114 Top = 37 Width = 273 BevelOuter = bvNone ClientHeight = 114 ClientWidth = 273 TabOrder = 7 object Label5: TLabel Left = 31 Height = 14 Top = 17 Width = 26 Alignment = taCenter Caption = 'Scale' ParentColor = False end object Label6: TLabel Left = 31 Height = 14 Top = 59 Width = 31 Alignment = taCenter Caption = 'Power' ParentColor = False end object ScaleEdit: TFloatSpinEdit Left = 127 Height = 21 Top = 11 Width = 130 DecimalPlaces = 8 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 0 Value = 1.2E-6 end object PowerEdit: TFloatSpinEdit Left = 127 Height = 21 Top = 56 Width = 130 DecimalPlaces = 8 Increment = 1 MaxValue = 100 MinValue = 0 TabOrder = 1 Value = 1.2E-6 end end end mricron-0.20120505.1~dfsg.1.orig/dcm2nii/nifti_form.dfm0000664000175000017500000000534711454071210022025 0ustar michaelmichaelџ TNIFTIFORM0г TPF0 TNIfTIform NIfTIformLeftЗTop~ BorderStylebsDialogCaptionConvert NIfTI file ClientHeightE ClientWidthTColor clBtnFace Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Heightѕ Font.Name MS Sans Serif Font.Style OldCreateOrderPositionpoScreenCenterOnCreate FormCreate PixelsPerInch` TextHeight TLabelLabel1LeftTopWidthHeight CaptionTaskLayouttlCenterTLabelLabel4LeftTopњWidthOHeight Caption Output Format: LayouttlCenter TComboBoxCombo4DLeft7TopWidthHeightStylecsDropDownList ItemHeight Items.Strings Change formatFlip dimensions 3 and 4Clip 1st/Last VolumesExport as 32-bit real Apply formulaASL conversionCrop slices from Z dimensionTabOrderOnChange Combo4DChangeTButtonOKBtnLeftрTopWidthKHeightCaptionOK ModalResultTabOrderOnClick OKBtnClickTButton CancelBtnLeft€TopWidthKHeightCaptionCancel ModalResultTabOrder TComboBoxCombo3DLeftOTopWidthњHeightStylecsDropDownList ItemHeight Items.Strings Change formatReorient to orthogonalReorient and cropCrop slices from Z dimension+Siemens phase map to radians (SPM fieldmap)TabOrderOnChange Combo4DChangeTPanelPanel1Left:Top(WidthHeightITabOrderTLabelLabel2LeftTopWidthˆHeight CaptionVolumes to remove from startLayouttlCenterTLabelLabel3LeftTop&Width†Height CaptionVolumes to remove from endLayouttlCenter TSpinEdit StartEditLeft TopWidthPHeightMaxValueMinValueTabOrderValue TSpinEditEndEditLeft Top#WidthPHeightMaxValueMinValueTabOrderValue TComboBox TypeComboLeftgTopєWidthТHeightStylecsDropDownList ItemHeight Items.StringsSPM2 (3D Anlyze hdr/img)SPM5 (3D NIfTI hdr/img)SPM8 (3D NIfTI nii)4D NIfTI hdr/imgFSL (4D NIfTI nii)Compressed FSL (4D NIfTI nii)MRIcron drawing (voi)TabOrderTPanel FormulaPanelLeft:Top(WidthHeightITabOrderTLabelLabel5LeftTopWidthHeight CaptionScaleLayouttlCenterTLabelLabel6LeftTop&WidthHeight CaptionPowerLayouttlCenter TRxSpinEdit ScaleEditLeftPTopWidthyHeight ButtonKind bkStandardDecimal ValueTypevtFloatValue€џ?TabOrder TRxSpinEdit PowerEditLeftPTop WidthyHeight ButtonKind bkStandardDecimal ValueTypevtFloatTabOrderTPanelASLPanelLeft*Top(WidthHeight)TabOrder TComboBoxASLComboLeftTopWidthъHeightStylecsDropDownList ItemHeight Items.Strings#Subtract pairs - first image tagged$Subtract pairs - first image controlSubtract CustomAdd (odd+even) BOLDParse into odd/even datasetsTabOrdermricron-0.20120505.1~dfsg.1.orig/dcm2nii/niftiutil.pas0000664000175000017500000017333211751724636021736 0ustar michaelmichaelunit niftiutil; interface uses {$IFDEF FPC} gzio2, {$ELSE} gziod, {$ENDIF} SysUtils,Classes,define_types,filename,dicomtypes,prefs; {$H+} const kNIIImgOffset = 352; //header is 348 bytes, but 352 is divisible by 8... function MaskImgs(lC1template, lC1source: string; lPrefs: TPrefs ; lThresh: single): string; function MaskImg(ltemplate, lsource: string; lPrefs: TPrefs; lThresh: single ): string; function Binarize(lC1Name: string; lPrefs: TPrefs ): string; function SameHdrDim (lAHdr,lBHdr: TNIFTIhdr; lCheck4D, lCheckDataType: boolean): boolean; procedure NIFTIhdr_ClearHdr (var lHdr: TNIFTIhdr ); //put sensible default values into header procedure DICOM2AnzHdr (var lBHdr: TNIFTIhdr; lAnonymize: boolean; var lFilename: string; var lDICOMdata: DicomData); procedure CustomFilename (var lFilename: string); function SumTPM (lSrcName,lDestName: string; lPrefs: TPrefs; lTissueTypes2Average: integer):string; //function SameHdrDim (lAHdr,lBHdr: TNIFTIhdr): boolean; function SaveHdr (var lFilename: ANSIstring; var lInHdr: TNIFTIhdr ; lSwap,lSPM2:boolean): boolean; function NIFTIhdr_LoadHdr (var lFilename: string; var lHdr: TNIFTIHdr; var lByteSwap: boolean): boolean; procedure NIFTIhdr_SlicesToCoord (var lHdr: TNIFTIhdr; lXslice,lYslice,lZslice: integer; var lXmm,lYmm,lZmm: single); function ChangeNIfTISubformat(lHdrName: string; var lHdr: TNIFTIhdr; lPrefs: TPrefs): boolean; procedure SaveHdrRAM (var lFilename: ANSIstring; var lInHdr,lOutHdr: TNIFTIhdr ; lSwap,lSPM2:boolean); function SaveNIfTICore (var lOutImgName: string; var lvBuffer: bytep; lVolOffset: integer; var lInHdr: TNIFTIhdr; var lPrefs: TPrefs; var lByteSwap: boolean): string; function SaveNIfTICoreCrop (var lOutImgName: string; var lvBuffer: bytep; lVolOffset,lStartClip,lEndClip: integer; var lInHdr: TNIFTIhdr; var lPrefs: TPrefs; var lByteSwap: boolean): string; function NIFTIhdr_LoadImg (var lFilename: string; var lHdr: TNIFTIHdr; var lImgBuffer: byteP; var lImgOffset: integer; var lByteSwap: boolean): boolean; procedure NIFTIhdr_UnswapImg (var lHdr: TNIFTIHdr; var lImgBuffer: byteP; var lImgOffset: integer; var lByteSwap: boolean); //ensures image data is in native space function NIFTIhdr_LoadImgRaw (LoadHdr: boolean; var lFilename: string; var lHdr: TNIFTIHdr; var lImgBuffer: byteP; var lImgOffset: integer; var lByteSwap: boolean): boolean; function NII_force32 (lSrcName,lDestName: string; lPrefs: TPrefs):string; function Rescale_4Dtissuemaps (lSrcName,lDestName: string; lPrefs: TPrefs; lMakeSym: boolean):string; function Merge4DFiles (lLowSliceName,lHighSliceName,lDestName: string; lNumberofLowSlicesToCopy: integer; lPrefs: TPrefs):string; function Insert3Din4D (l3DSliceName,l4DSliceName,lDestName: string; lVol2Copy: integer; lPrefs: TPrefs):string; function MaskImages(lMaskName: string; lFiles: TStrings; lPrefs: TPrefs; lVol: integer; lSaveThresh: boolean): string; function NonspatialDimensionsNII (lA: TNIFTIhdr): integer; implementation uses dialogsx; function AddFileNum(lVol,lnVol: integer; var lInName: string): string; var lNameWOExt,lExt: string; begin ExtractFileParts (lInName, lNameWOExt,lExt); result := lNameWOExt+'_'+PadStr(lVol,length(inttostr(lnVol))) +lExt; end; procedure NIFTIhdr_UnswapImg (var lHdr: TNIFTIHdr; var lImgBuffer: byteP; var lImgOffset: integer; var lByteSwap: boolean); //ensures image data is in native space //returns data in native endian //sets 'ByteSwap' flag to false. E.G. a big-endian image will be saved as little-endian on little endian machines var lInc,lImgSamples : integer; //2f : SingleP; l32i : LongIntP; l16i : SmallIntP; begin if not lByteSwap then exit; case lHdr.datatype of kDT_UNSIGNED_CHAR : begin lByteSwap := false; //single byte data - no need to byte swap... exit; end; kDT_SIGNED_SHORT,kDT_SIGNED_INT,kDT_FLOAT: ;//supported format else begin Msg('niftiutil UnSwapImg error: datatype not supported.'); exit; end; end; //case lImgSamples := lHdr.Dim[1] *lHdr.Dim[2]*lHdr.Dim[3]*NonspatialDimensionsNII(lHdr); if lImgSamples < 1 then exit; case lHdr.datatype of kDT_SIGNED_SHORT: begin l16i := SmallIntP(@lImgBuffer^[lImgOffset+1]); for lInc := 1 to lImgSamples do l16i^[lInc] := Swap(l16i^[lInc]); end; //l16i kDT_SIGNED_INT,kDT_FLOAT: begin //note: for the purposes of byte swapping, floats and long ints are the same l32i := LongIntP(@lImgBuffer^[lImgOffset+1]); for lInc := 1 to lImgSamples do Swap4(l32i^[lInc]); end;//32i (*kDT_FLOAT: begin l32f := SingleP(@lImgBuffer^[lImgOffset+1]); for lInc := 1 to lImgSamples do pswap4r(l32f^[lInc]); //faster as procedure than function see www.optimalcode.com end; //32f*) end; //case lByteSwap := false; end; procedure NIFTIhdr_SwapBytes (var lAHdr: TNIFTIhdr ); //Swap Byte order for the Analyze type var lInc: integer; begin with lAHdr do begin swap4(hdrsz); swap4(extents); session_error := swap(session_error); for lInc := 0 to 7 do dim[lInc] := swap(dim[lInc]); Xswap4r(intent_p1); Xswap4r(intent_p2); Xswap4r(intent_p3); intent_code:= swap(intent_code); datatype:= swap(datatype); bitpix := swap(bitpix); slice_start:= swap(slice_start); for lInc := 0 to 7 do Xswap4r(pixdim[linc]); Xswap4r(vox_offset); Xswap4r(scl_slope); Xswap4r(scl_inter); slice_end := swap(slice_end); Xswap4r(cal_max); Xswap4r(cal_min); Xswap4r(slice_duration); Xswap4r(toffset); swap4(glmax); swap4(glmin); qform_code := swap(qform_code); sform_code:= swap(sform_code); Xswap4r(quatern_b); Xswap4r(quatern_c); Xswap4r(quatern_d); Xswap4r(qoffset_x); Xswap4r(qoffset_y); Xswap4r(qoffset_z); for lInc := 0 to 3 do begin Xswap4r(srow_x[lInc]); Xswap4r(srow_y[lInc]); Xswap4r(srow_z[lInc]); end; end; //with NIFTIhdr end; //proc NIFTIhdr_Swa (*procedure TestUINT16 (lval: integer); //this procedure demonstrates that words and smallints are identical for values 0..32767, so no need to swap if values are in this range var l16ui : WordP; l16i: SmallIntP; begin getmem(l16ui,1*sizeof(word)); l16ui^[1] := lval; l16i := SmallIntP(@l16ui^[1]); fx(l16i^[1],l16ui^[1]); freemem(l16ui); end;*) procedure Uint16 (var lvBuffer: bytep; lVolOffset: integer; var lInHdr: TNIFTIhdr;var lPrefs: TPrefs; var lByteSwap: boolean); //kDT_UINT16 saves data range 0..65535, but this is an atypical NIfTI format (not included in earlier Analyze format) // this procedure saves the data as kDT_SIGNED_SHORT 0..36767 // if data range is <32767 then saved unchanged, if range is >32767, saved as 15-bit (Least Significant bit clipped). var i,lmax,lv,lnv: integer; lTempB: ByteP; l16ui : WordP; //l16i: SmallIntP; l32f: SingleP; begin lnv := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]*NonspatialDimensionsNII(lInHdr); if (lInHdr.datatype <> kDT_UINT16) or (lnv < 1) then exit; l16ui := WordP(@lvBuffer^[lVolOffset]); if lByteSwap then begin lmax := swap(l16ui^[1]); for lv := 1 to lnv do if swap(l16ui^[lv]) > lmax then lmax := swap(l16ui^[lv]); end else begin lmax := l16ui^[1]; for lv := 1 to lnv do if l16ui^[lv] > lmax then lmax := l16ui^[lv]; end; if lmax < 32768 then begin //lossless: unsigned range <32768 (15 bits), so can be stored in signed 16bit lInHdr.datatype := kDT_SIGNED_SHORT; (*next lines not required, as range 0..32767 is stored identically for WORDS and SMALLINTS, see TestUINT16 l16i := SmallIntP(@lvBuffer^[lVolOffset]); for lv := 1 to lnv do l16i^[lv] := l16ui^[lv]; *) end else if not lPrefs.UINT16toFLOAT32 then begin Msg('Warning: unusual NIFTI format UINT16, range: '+inttostr(lMax) ); Msg(' If you prefer compatibility, edit your preference named UINT16toFLOAT32'); end else begin Msg('Warning: for compatibility, converting UINT16->FLOAT32, range: '+inttostr(lMax) ); Msg(' If you prefer filesize over compatibility, edit your preference named UINT16toFLOAT32'); lInHdr.datatype := kDT_Float; lInHdr.bitpix := 32; lmax := lVolOffset+ (lnv*sizeof(Word)); GetMem(lTempB,lmax); if lByteSwap then begin lByteSwap := false; for lv := 1 to lmax do lTempB^[lv] := swap(lvBuffer^[lv]); Msg(' Swapping data to native byte order (Big vs Little Endian)'); end else begin for lv := 1 to lmax do lTempB^[lv] := lvBuffer^[lv]; end; freemem(lvBuffer); GetMem(lvBuffer,lVolOffset+ (lnv*sizeof(single))); for lv := 1 to lVolOffset do //copy header lvBuffer^[lv] := lTempB^[lv]; l16ui := WordP(@lTempB^[lVolOffset]); l32f := SingleP(@lvBuffer^[lVolOffset]); for lv := 1 to lnv do l32f^[lv] :=l16ui^[lv]; Freemem(lTempB); end;// if range requires conversion to 32-bit float end; //Uint16 function SaveNIfTICore (var lOutImgName: string; var lvBuffer: bytep; lVolOffset: integer; var lInHdr: TNIFTIhdr; var lPrefs: TPrefs; var lByteSwap: boolean): string; //image data should start at lVolOffset - this should be AT LEAST kNIIImgOffset (=352) bytes for creating .nii.gz files //important note - when converting 4D to 3D to .nii format the lvBuffer is changed :: must correct this var lPref : TPrefs; lVol,lVolStart,lVolBytes: integer; lOutF: File; lNoGZName,lHdrName,lImgName: string; l3dHdr,lOutHdr : TNIFTIHdr; lHdrBupRA: bytep; begin lNoGZName := (lOutImgName); StripGZExt(lNoGZName); //we want to convert filename.nii.gz -> filename.hdr not -> filename.nii.hdr StripNIIVOIExt(lNoGZName);//we want to convert filename.nii.voi to filename.hdr lPref := lPrefs; CorrectPrefs(lPref); result := ''; Uint16 (lvBuffer,lVolOffset, lInHdr,lPrefs,lByteSwap); if (not lPref.FourD) and (lInHdr.dim[4] > 1) then begin //4D -> 3D lVolBytes := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]*trunc(((lInHdr.bitpix)+7)/8); lVolStart := lVolOffset; l3dHdr := lInHdr; l3dHdr.dim[4] := 1; for lVol := 1 to lInHdr.dim[4] do begin //1st - save header lHdrName := AddFileNum(lVol,lInHdr.dim[4],lNoGZName); result := SaveNIfTICore (lHdrName, lvBuffer, lVolStart, l3dHdr, lPref,lByteswap); lVolStart := lVolStart + lVolBytes; //SaveNiftiCore new filename, new offset end; //for each vol exit; end; //l4Dto3D Filemode := 2; lVolBytes := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]*lInHdr.dim[4]*trunc(((lInHdr.bitpix)+7)/8); if ((kNIIImgOffset+lVolBytes)> DiskFreeEx(lNoGZName)) then begin Msg('There is not enough free space on the destination disk to save the data. '+kCR+ lNoGZName+ kCR+' Bytes Required: '+inttostr(lVolBytes) ); exit; end; if (lPref.SingleNIIFile) then begin lVolStart := lVolOffset-kNIIImgOffset; lVolBytes := lVolBytes + kNIIImgOffset; if lVolStart < 1 then begin Msg('SaveNIfTICore Error: '+inttostr(lVolStart)); exit; end; getmem(lHdrBupRA,kNIIImgOffset); Move(lvBuffer^[lVolStart],lHdrBupRA^[1],kNIIImgOffset); //bytes 349,350,351,352 should be set to zero lVol := 0; lvBuffer^[kNIIImgOffset-3+lVol] := 0; lvBuffer^[kNIIImgOffset-2+lVol] := 0; lvBuffer^[kNIIImgOffset-1+lVol] := 0; lvBuffer^[kNIIImgOffset+lVol] := 0; //next - create [potentially byte swapped] header and load into buffer lImgName := changefileext(lNoGZName,'.nii'); SaveHdrRAM (lImgName,lInHdr,lOutHdr, lByteSwap,lPrefs.SPM2); Move(lOutHdr,lvBuffer^[lVolStart],sizeof(lOutHdr)); //move 348 byte header in place //finally - write buffer to disk if lPrefs.Gzip then begin if lPrefs.VOI then lImgName := changefileext(lNoGZName,'.voi') else lImgName := changefileext(lNoGZName,'.nii.gz'); Msg('GZip...' + extractfilename(lImgName)); GZipBuffer(lImgName, @lvBuffer^[lVolStart],lVolBytes,true); end else begin //not .nii.gz -> .nii Msg('Saving '+lImgName); AssignFile(lOutF, lImgName); Rewrite(lOutF,1); BlockWrite(lOutF, lvBuffer^[lVolStart], lVolBytes); CloseFile(lOutF); end; //else no GZip Move(lHdrBupRA^[1],lvBuffer^[lVolStart],kNIIImgOffset); //replace data overwritten by header - otherwise 4D->3D corrupts lvBuffer freemem(lHdrBupRA); end else begin //not .nii -> hdr and img lHdrName := changefileext(lNoGZName,'.hdr'); lImgName := changefileext(lNoGZName,'.img'); //next - create [potentially byte swapped] header and save to disk if not SaveHdr (lHdrName,lInHdr, lByteSwap,lPrefs.SPM2) then exit; //finally - write buffer to disk AssignFile(lOutF, lImgName); Rewrite(lOutF,1); BlockWrite(lOutF, lvBuffer^[lVolOffset], lVolBytes); CloseFile(lOutF); end; //else hdr+img result := lImgName; end; function SaveNIfTICoreCrop (var lOutImgName: string; var lvBuffer: bytep; lVolOffset,lStartClip,lEndClip: integer; var lInHdr: TNIFTIhdr; var lPrefs: TPrefs; var lByteSwap: boolean): string; var lVolStart,lVolBytes: integer; lClipName: string; lClipHdr : TNIFTIHdr; begin result := ''; if (lStartClip < 0) or (lEndClip < 0) then exit; //no negative values if (lStartClip <= 0) and (lEndClip <= 0) then exit; //no change if (lStartClip+lEndClip) >= lInHdr.dim[4] then exit; //can not remove this many volumes lVolBytes := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]*trunc(((lInHdr.bitpix)+7)/8); lClipHdr := lInHdr; lClipHdr.dim[4] := lInHdr.dim[4]-lStartClip-lEndClip; lVolStart := lVolOffset + (lStartClip*lVolBytes); lClipName := ChangeFilePrefix (lOutImgName,'x'); result := SaveNIfTICore (lClipName, lvBuffer, lVolStart, lClipHdr, lPrefs,lByteSwap); end; function SubBound (lVal,lMin: integer): integer; begin result := lVal; if result < lMin then result := lMin; end; function NonspatialDimensionsNII (lA: TNIFTIhdr): integer; //returns sum of 4th, 5th, 6th and 7th dimension... begin result := SubBound(lA.dim[4],1)*SubBound(lA.dim[5],1)*SubBound(lA.dim[6],1)*SubBound(lA.dim[7],1); end; function NIFTIhdr_LoadImgRaw (LoadHdr: boolean; var lFilename: string; var lHdr: TNIFTIHdr; var lImgBuffer: byteP; var lImgOffset: integer; var lByteSwap: boolean): boolean; //ImgBuffer always offset by kNIIImgOffset- this allows rapid nii.gz creation //loads img to byteP - if this returns successfully you must freemem(lImgBuffer) var lExt,lImgName: string; lVol,lFileBytes,lImgBytes: integer; lBuf: ByteP; lGZin: boolean; lInF: File; begin result := false; if loadHdr then begin if not NIFTIhdr_LoadHdr (lFilename, lHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; end;//if we load the header from disk... lExt := UpCaseExt(lFilename); lGZin := ExtGZ(lFilename); if lExt = '.VOI' then lGZin := true; lImgOffset := kNIIImgOffset;// (=352) bytes for creating .nii.gz files lVol := NonspatialDimensionsNII(lHdr);//lHdr.dim[4]; if lVol < 1 then lVol := 1; lImgBytes := lHdr.dim[1]*lHdr.dim[2]*lHdr.dim[3]*lVol*(lHdr.bitpix div 8); if lExt ='.HDR' then lImgName := changefileext(lFilename,'.img') else lImgName := lFilename; if not fileexists(lImgName) then begin Msg('LoadImg Error: Unable to find '+lImgName); exit; end; if (not lGZin) and (FSize (lImgName) < ( lImgBytes+round(lHdr.vox_offset))) then begin Msg('LoadImg Error: File smaller than expected '+lImgName); exit; end; lFileBytes := lImgBytes+ lImgOffset; GetMem(lImgBuffer,lFileBytes); if lGZin then begin lBuf := @lImgBuffer^[lImgOffset+1]; UnGZip (lImgName,lBuf, round(lHdr.vox_offset),lImgBytes); end else begin AssignFile(lInF, lImgName); Reset(lInF,1); Seek(lInF,round(lHdr.vox_offset)); Filemode := 0; //ReadONly BlockRead(lInF, lImgBuffer^[lImgOffset+1],lImgBytes); CloseFile(lInF); end; Filemode := 2; //Read/Write result := true; end; //NIFTIhdr_LoadImgRaw function NIFTIhdr_LoadImg (var lFilename: string; var lHdr: TNIFTIHdr; var lImgBuffer: byteP; var lImgOffset: integer; var lByteSwap: boolean): boolean; begin result := NIFTIhdr_LoadImgRaw (true, lFilename, lHdr, lImgBuffer, lImgOffset, lByteSwap); end; (*function NIFTIhdr_LoadImg (var lFilename: string; var lHdr: TNIFTIHdr; var lImgBuffer: byteP; var lImgOffset: integer; var lByteSwap: boolean): boolean; //ImgBuffer always offset by kNIIImgOffset- this allows rapid nii.gz creation //loads img to byteP - if this returns successfully you must freemem(lImgBuffer) var lExt,lImgName: string; lVol,lFileBytes,lImgBytes: integer; lBuf: ByteP; lGZin: boolean; lInF: File; begin result := false; if not NIFTIhdr_LoadHdr (lFilename, lHdr, lByteSwap) then begin Msg('Unable to read as NifTI/Analyze' + lFilename); exit; end; lExt := UpCaseExt(lFilename); lGZin := ExtGZ(lFilename); if lExt = '.VOI' then lGZin := true; lImgOffset := kNIIImgOffset;// (=352) bytes for creating .nii.gz files lVol := lHdr.dim[4]; if lVol < 1 then lVol := 1; lImgBytes := lHdr.dim[1]*lHdr.dim[2]*lHdr.dim[3]*lVol*(lHdr.bitpix div 8); if lExt ='.HDR' then lImgName := changefileext(lFilename,'.img') else lImgName := lFilename; if not fileexists(lImgName) then begin Msg('LoadImg Error: Unable to find '+lImgName); exit; end; if (not lGZin) and (FSize (lImgName) < ( lImgBytes)) then begin Msg('LoadImg Error: File smaller than expected '+lImgName); exit; end; lFileBytes := lImgBytes+ lImgOffset; GetMem(lImgBuffer,lFileBytes); if lGZin then begin lBuf := @lImgBuffer^[lImgOffset+1]; UnGZip (lImgName,lBuf, round(lHdr.vox_offset),lImgBytes); end else begin AssignFile(lInF, lImgName); Reset(lInF,1); Seek(lInF,round(lHdr.vox_offset)); Filemode := 0; //ReadONly BlockRead(lInF, lImgBuffer^[lImgOffset+1],lImgBytes); CloseFile(lInF); end; Filemode := 2; //Read/Write result := true; end; *) procedure CustomFilename (var lFilename: string); var lNew,lPath,lName,lExt: string; begin if not FilenameParts (lFilename, lPath,lName,lExt) then exit; lNew := GetStr('Rename '+lName); if lNew = '' then exit; lFilename := lPath + lNew + lExt; end; function ChangeNIfTISubformat(lHdrName: string; var lHdr: TNIFTIhdr; lPrefs: TPrefs): boolean; var lImgBuffer: byteP; lImgOffset: integer; lOutImgName: string; lByteSwap: boolean; begin result := false; if not NIFTIhdr_LoadImg (lHdrName, lHdr, lImgBuffer, lImgOffset,lByteSwap) then exit; Msg('Changing subformat of '+lHdrName); lOutImgName := ChangeFilePrefix (lHdrName,'f'); if lPrefs.CustomRename then CustomFilename(lOutImgName); if SaveNIfTICore (lOutImgName, lImgBuffer, lImgOffset+1, lHdr, lPrefs,lByteSwap) ='' then exit; Freemem(lImgBuffer); result := true; //11/2007 ExitCode := 0; end; procedure NIFTIhdr_SlicesToCoord (var lHdr: TNIFTIhdr; lXslice,lYslice,lZslice: integer; var lXmm,lYmm,lZmm: single); //ignores origin offset begin lXmm := (lHdr.srow_x[0]*lXslice)+ (lHdr.srow_x[1]*lYslice)+(lHdr.srow_x[2]*lzslice); lYmm := (lHdr.srow_y[0]*lXslice)+ (lHdr.srow_y[1]*lYslice)+(lHdr.srow_y[2]*lzslice); lZmm := (lHdr.srow_z[0]*lXslice)+ (lHdr.srow_z[1]*lYslice)+(lHdr.srow_z[2]*lzslice); end; function NIFTIhdr_LoadHdr (var lFilename: string; var lHdr: TNIFTIHdr; var lByteSwap: boolean): boolean; var lHdrFile: file; {lOri: array [1..3] of single;} lBuff: Bytep; lReportedSz, lSwappedReportedSz,lHdrSz,lFileSz: Longint; lExt: string; //1494 begin Result := false; //assume error if lFilename = '' then exit; lExt := UpCaseExt(lFilename); if lExt = '.IMG' then lFilename := changeFileExt(lFilename,'.hdr'); lHdrSz := sizeof(TniftiHdr); lFileSz := FSize (lFilename); if lFileSz = 0 then begin Msg('Unable to find NIFTI header named '+lFilename); exit; end; if lFileSz < lHdrSz then begin Msg('Error in reading NIFTI header: NIfTI headers need to be at least '+inttostr(lHdrSz)+ ' bytes: '+lFilename); exit; end; FileMode := 0; { Set file access to read only } if (lExt = '.NII.GZ') or (lExt = '.VOI') then begin//1388 lBuff := @lHdr; UnGZip(lFileName,lBuff,0,lHdrSz); //1388 end else begin //if gzip {$I-} AssignFile(lHdrFile, lFileName); FileMode := 0; { Set file access to read only } Reset(lHdrFile, 1); {$I+} if ioresult <> 0 then begin Msg('Error in reading NIFTI header.'+inttostr(IOResult)); FileMode := 2; exit; end; BlockRead(lHdrFile, lHdr, lHdrSz); CloseFile(lHdrFile); end; FileMode := 2; if (IOResult <> 0) then exit; lReportedSz := lHdr.HdrSz; lSwappedReportedSz := lReportedSz; swap4(lSwappedReportedSz); if lReportedSz = lHdrSz then begin lByteSwap := false; end else if lSwappedReportedSz = lHdrSz then begin lByteSwap := true; NIFTIhdr_SwapBytes (lHdr); end else begin Msg('Warning: the header file is not in NIfTi format [the first 4 bytes do not have the value 348]. Assuming big-endian data.'); exit; end; if (lHdr.dim[0] > 7) or (lHdr.dim[0] < 1) then begin //only 1..7 dims, so this Msg('Illegal NIfTI Format Header: this header does not specify 1..7 dimensions.'); exit; end; if lHdr.Dim[4] < 1 then lHdr.Dim[4] := 1; result := true; end; //func Analyzehdr_LoadHdr function SaveHdr (var lFilename: ANSIstring; var lInHdr: TNIFTIhdr ; lSwap,lSPM2:boolean): boolean; var lOutHdr: TNIFTIhdr; lExt: string; lF: File; lLong: LongINt; begin result := false; if ((sizeof(TNIFTIhdr ))> DiskFreeEx(lFilename)) then begin Msg('There is not enough free space on the destination disk to save the header. '+kCR+ lFileName+ kCR+' Bytes Required: '+inttostr(sizeof(TNIFTIhdr )) ); exit; end; if lInHdr.dim[4] > 1 then begin lInHdr.dim[0] := 4; end else begin lInHdr.dim[0] := 3;//3D july2006 lInHdr.dim[4] := 1;//3D july2006 end; {if Fileexists(lFileName) then begin Msg('Error: the file '+lFileName+' already exists.'); exit; end; } result := true; move(lInHdr, lOutHdr, sizeof(lOutHdr)) ; lExt := UpCaseExt(lFileName); if (lExt='.IMG') or (lExt ='.HDR') then begin {$IFDEF obsoleteENDIAN_BIG} //OSX PPC lOutHdr.magic := kswapNIFTI_MAGIC_SEPARATE_HDR; {$ELSE} lOutHdr.magic := kNIFTI_MAGIC_SEPARATE_HDR; {$ENDIF} lOutHdr.vox_offset := 0; if lSPM2 then begin //SPM2 does not recognize NIfTI - origin values will be wrong lOutHdr.magic := 0; lOutHdr.qform_code := 0; lOutHdr.sform_code:= 0; lOutHdr.quatern_b := 0; lOutHdr.quatern_c := 0; lOutHdr.quatern_d := 0; lOutHdr.qoffset_x := 0; lOutHdr.qoffset_y := 0; lOutHdr.qoffset_z := 0; end; end else begin {$IFDEF obsoleteENDIAN_BIG} //OSX PPC lOutHdr.magic := kswapNIFTI_MAGIC_EMBEDDED_HDR; {$ELSE} lOutHdr.magic := kNIFTI_MAGIC_EMBEDDED_HDR; {$ENDIF} lOutHdr.vox_offset := kNIIImgOffset;//352 bytes end; {$IFDEF obsoleteENDIAN_BIG} //OSX PPC if not lSwap then {$ELSE} if lSwap then {$ENDIF} NIFTIhdr_SwapBytes (lOutHdr);{swap to sun format} Filemode := 1; //1366 AssignFile(lF, lFileName); {WIN} if fileexists(lFilename) then Reset(lF,1) else Rewrite(lF,1); BlockWrite(lF,lOutHdr, sizeof(TNIFTIhdr )); if (lExt='.IMG') or (lExt ='.HDR') then begin end else begin lLong := 0; BlockWrite(lF,lLong, 4); end; CloseFile(lF); Filemode := 2; //1366 end; procedure SaveHdrRAM (var lFilename: ANSIstring; var lInHdr,lOutHdr: TNIFTIhdr ; lSwap,lSPM2:boolean); var lExt: string; begin if lInHdr.dim[4] > 1 then begin lInHdr.dim[0] := 4; end else begin lInHdr.dim[0] := 3;//3D july2006 lInHdr.dim[4] := 1;//3D july2006 end; move(lInHdr, lOutHdr, sizeof(lOutHdr)) ; lExt := UpCaseExt(lFileName); if (lExt='.IMG') or (lExt ='.HDR') then begin {$IFDEF obsoleteENDIAN_BIG} //OSX PPC lOutHdr.magic := kswapNIFTI_MAGIC_SEPARATE_HDR; {$ELSE} lOutHdr.magic := kNIFTI_MAGIC_SEPARATE_HDR; {$ENDIF} lOutHdr.vox_offset := 0; if lSPM2 then begin //SPM2 does not recognize NIfTI - origin values will be wrong lOutHdr.magic := 0; lOutHdr.qform_code := 0; lOutHdr.sform_code:= 0; lOutHdr.quatern_b := 0; lOutHdr.quatern_c := 0; lOutHdr.quatern_d := 0; lOutHdr.qoffset_x := 0; lOutHdr.qoffset_y := 0; lOutHdr.qoffset_z := 0; end; end else begin {$IFDEF obsoleteENDIAN_BIG} //OSX PPC lOutHdr.magic := kswapNIFTI_MAGIC_EMBEDDED_HDR; {$ELSE} lOutHdr.magic := kNIFTI_MAGIC_EMBEDDED_HDR; {$ENDIF} lOutHdr.vox_offset := kNIIImgOffset;//352 bytes end; {$IFDEF obsoleteENDIAN_BIG} //OSX PPC if not lSwap then {$ELSE} if lSwap then {$ENDIF} NIFTIhdr_SwapBytes (lOutHdr);{swap to sun format} end; procedure NIFTIhdr_SetIdentityMatrixx (var lHdr: TNIFTIHdr); //create neutral rotation matrix var lInc: integer; begin with lHdr do begin for lInc := 0 to 3 do srow_x[lInc] := 0; for lInc := 0 to 3 do srow_y[lInc] := 0; for lInc := 0 to 3 do srow_z[lInc] := 0; for lInc := 1 to 16 do intent_name[lInc] := chr(0); //next: create identity matrix: if code is switched on there will not be a problem srow_x[0] := 1; srow_y[1] := 1; srow_z[2] := 1; end; end; //proc NIFTIhdr_IdentityMatrix procedure NIFTIhdr_ClearHdr (var lHdr: TNIFTIhdr ); //put sensible default values into header var lInc: byte; begin with lHdr do begin {set to 0} HdrSz := sizeof(TNIFTIhdr); for lInc := 1 to 10 do Data_Type[lInc] := chr(0); for lInc := 1 to 18 do db_name[lInc] := chr(0); extents:=0; session_error:= 0; regular:='r'; dim_info:=(0); dim[0] := 4; for lInc := 1 to 7 do dim[lInc] := 0; intent_p1 := 0; intent_p2 := 0; intent_p3 := 0; intent_code:=0; datatype:=0 ; bitpix:=0; slice_start:=0; for lInc := 1 to 7 do pixdim[linc]:= 1.0; vox_offset:= 0.0; scl_slope := 1.0; scl_inter:= 0.0; slice_end:= 0; slice_code := 0; xyzt_units := 10; cal_max:= 0.0; cal_min:= 0.0; slice_duration:=0; toffset:= 0; glmax:= 0; glmin:= 0; for lInc := 1 to 80 do descrip[lInc] := chr(0);{80 spaces} for lInc := 1 to 24 do aux_file[lInc] := chr(0);{80 spaces} {below are standard settings which are not 0} bitpix := 16;//vc16; {8bits per pixel, e.g. unsigned char 136} DataType := 4;//vc4;{2=unsigned char, 4=16bit int 136} Dim[0] := 3; Dim[1] := 256; Dim[2] := 256; Dim[3] := 128; Dim[4] := 1; {n vols} Dim[5] := 1; Dim[6] := 1; Dim[7] := 1; glMin := 0; glMax := 255; qform_code := kNIFTI_XFORM_UNKNOWN; sform_code:= kNIFTI_XFORM_UNKNOWN; quatern_b := 0; quatern_c := 0; quatern_d := 0; qoffset_x := 0; qoffset_y := 0; qoffset_z := 0; NIFTIhdr_SetIdentityMatrixx(lHdr); magic := kNIFTI_MAGIC_SEPARATE_HDR; end; //with the NIfTI header... end; //proc NIFTIhdr_ClearHdr procedure DICOM2AnzHdr (var lBHdr: TNIFTIhdr; lAnonymize: boolean; var lFilename: string; var lDICOMdata: DicomData); var lInc,lLen: integer; lStr,lFilenameWOPath: string; begin NIFTIhdr_ClearHdr(lBHdr); if not lAnonymize then begin //next: put PatientID into patient_ID array lLen := length(lDICOMdata.ProtocolName); if lLen > 23 then lLen := 23; //24=size of aux_file if lLen > 0 then begin lBHdr.aux_file[1] :='!'; for lInc := 1 to lLen do lBHdr.aux_file[lInc+1] := lDICOMdata.ProtocolName[lInc]; end; (* lLen := length(lDicomData.PatientID); if lLen > 10 then lLen := 10; //10=size of patient_ID array if lLen > 0 then for lInc := 1 to lLen do lBHdr.patient_id[lInc] := lDicomData.PatientID[lInc]; *) //next: put PatientName into Descrip array lLen := length(lDicomData.PatientName); if lLen > 80 then lLen := 80; //80=size of descrip array if lLen > 0 then for lInc := 1 to lLen do lBHdr.descrip[lInc] := lDicomData.PatientName[lInc]; //next: put StudyDate into exp_date array (* lLen := length(lDicomData.StudyDate); if lLen > 10 then lLen := 10; //10=size of exp_date array if lLen > 0 then for lInc := 1 to lLen do lBHdr.exp_date[lInc] := lDicomData.StudyDate[lInc]; *) //next: put AcqTime into exp_time array (*lLen := length(lDicomData.AcqTime); if lLen > 10 then lLen := 10; //10=size of exp_time array if lLen > 0 then for lInc := 1 to lLen do lBHdr.exp_time[lInc] := lDicomData.AcqTime[lInc]; *) //next: put Modality into generated array (*lLen := length(lDicomData.modality); if lLen > 10 then lLen := 10; //10=size of generated array if lLen > 0 then for lInc := 1 to lLen do lBHdr.generated[lInc] := lDicomData.modality[lInc];*) end; //Not anonymized //next: put TR into db_Name array lStr := '?TR:'+floattostrf(lDicomData.TR,ffFixed,8,3)+' TE:'+floattostrf(lDicomData.TE,ffFixed,8,2); lLen := length(lStr); if lLen > 18 then lLen := 18; //10=size of generated array if lLen > 0 then for lInc := 1 to lLen do lBHdr.db_name[lInc] := lStr[lInc]; if lDICOMdata.XYZdim[4] > 1 then lBHdr.Dim[0] := 4 //4D Data June 2006 else lBHdr.Dim[0] := 3; lBHdr.Dim[1] := lDICOMdata.XYZdim[1]; lBHdr.Dim[2] := lDICOMdata.XYZdim[2]; lBHdr.Dim[3] := lDICOMdata.XYZdim[3]; lBHdr.Dim[4] := lDICOMdata.XYZdim[4]; lBHdr.pixdim[1]:= lDICOMdata.XYZmm[1]; lBHdr.pixdim[2]:= lDICOMdata.XYZmm[2]; lBHdr.pixdim[3]:= lDICOMdata.XYZmm[3]; lBHdr.pixdim[4] := lDicomData.TR/1000; //convert MS to second = assumes xyzt = 10 lBHdr.pixdim[7] := lDICOMdata.SecSinceMidnight; if lDICOMdata.IntenScale <> 0 then lBHdr.scl_slope := lDICOMdata.IntenScale else lBHdr.scl_slope := 1; if not specialsingle(lDICOMdata.IntenIntercept) then lBHdr.scl_inter := lDICOMdata.IntenIntercept //1406 else lBHdr.scl_inter := 0; lBHdr.bitpix := 8; //1360 lBHdr.datatype := 2; //1360 if lDicomData.Allocbits_per_pixel <> 8 then begin if lDicomData.Allocbits_per_pixel = 32 then begin lBHdr.bitpix := 32; if lDicomData.Float then lBHdr.datatype := 16 else lBHdr.datatype := 8; end else if lDicomData.Allocbits_per_pixel = 64 then begin lBHdr.bitpix := 64; lBHdr.datatype := 64;; end else begin //16bits per pixel lBHdr.bitpix := 16; lBHdr.datatype := kDT_SIGNED_SHORT; if (not lDicomData.SignedData) and (lDicomData.Allocbits_per_pixel = 16) then begin lBHdr.datatype :=kDT_UINT16; //Msg('NII convert warning: unusual 16-bit UNsigned data format - may not be correctly recognized by all software.'); end; end; end; end; //proc DICOM2AnzHdr function NII_force32 (lSrcName,lDestName: string; lPrefs: TPrefs):string; var lPOs,lSrcOffset,lVol,lVox: integer; l32f : SingleP; l32is : LongIntP; l16is : SmallIntP; l8is,lSrcBuffer,lBuffUnaligned,lBuffAligned: bytep; lSrcHdr,lDestHdr: TNIFTIhdr; lByteSwap: boolean; begin result := ''; if not NIFTIhdr_LoadHdr (lSrcname, lSrcHdr, lByteSwap) then exit; case lSrcHdr.datatype of kDT_UNSIGNED_CHAR : ; kDT_SIGNED_SHORT: ; kDT_SIGNED_INT: ; kDT_FLOAT: begin Msg('NII convert to 32-bit float error: datatype already 32-bit float.'); exit; end; else begin Msg('NII convert to 32-bit float error: datatype not supported.'); exit; end; end; //case lDestHdr := lSrcHdr; //destination has the comments and voxel BPP of source //lDestHdr.dim[4] := 1; lDestHdr.datatype := kDT_FLOAT; lDestHdr.bitpix := 32; lVol := lDestHdr.Dim[4]; lVox := lDestHdr.Dim[1]*lDestHdr.Dim[2]*lDestHdr.Dim[3]*lVol; //load dataset if not NIFTIhdr_LoadImg (lSrcName, lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap) then exit; NIFTIhdr_UnswapImg(lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap);//interpolation requires data is in native endian l8is := (@lSrcBuffer^[lSrcOffset+1]); GetMem(lBuffUnaligned ,(4*lVox) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := Align(lBuffUnaligned,16); // not commented - check this {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lPos := 1; l32f := SingleP(@lBuffAligned^[kNIIImgOffset+lPos] ); case lSrcHdr.datatype of kDT_SIGNED_SHORT: l16is := SmallIntP(l8is ); kDT_SIGNED_INT:l32is := LongIntP(l8is ); //kDT_FLOAT: l32fs := SingleP(l8is ); end; //case if lSrcHdr.datatype = kDT_UNSIGNED_CHAR then begin for lPos := 1 to lVox do l32f^[lPos] := l8is^[lPos]; end else if lSrcHdr.datatype = kDT_SIGNED_SHORT then begin for lPos := 1 to lVox do l32f^[lPos] := l16is^[lPos]; end else if lSrcHdr.datatype = kDT_SIGNED_INT then begin for lPos := 1 to lVox do l32f^[lPos] := l32is^[lPos]; end; result := SaveNIfTICore (lDestName, lBuffAligned, kNIIImgOffset+1, lDestHdr, lPrefs,lByteSwap); Freemem(lBuffUnaligned); Freemem(lSrcBuffer); end; procedure MakeSym (var l32f: SingleP; var lHdr: TNIFTIhdr); var lHalf,lL,lLines,lH,lX,lOffset: integer; lV : single; begin lX := lHdr.Dim[1]; lHalf := lX div 2; //we will not touch middle voxel of odd data... lLines := lHdr.Dim[2]*lHdr.Dim[3]*lHdr.Dim[4]; if (lHalf < 1) or (lLines < 1) then exit; lOffset := 0; for lL := 1 to lLines do begin lOffset := lOffset + lX; for lH := 1 to lHalf do begin lV := (l32f^[lOffset+lH] + l32f^[lOffset+lX-lH+1]) / 2; l32f^[lOffset+lH] := lV; l32f^[lOffset+lX-lH+1] := lV; end; end; end; function Rescale_4Dtissuemaps (lSrcName,lDestName: string; lPrefs: TPrefs; lMakeSym: boolean):string; //takes 4D image where each volume is 8-bit tissue map, saves as 32-bit float, ensures that no voxel has more than kmax or less than kmin intensity const kMaxAllTissues = 0.99; kMinAllTissues = 0.50; //set to 0 to ignore //kMax= 0.85; //kMin = 0.000; var lScale,lSum: double; lV,lPOs,lSrcOffset,lVol,lVox: integer; l32fs,l32f : SingleP; l32is : LongIntP; l16is : SmallIntP; l8is,lSrcBuffer,lBuffUnaligned,lBuffAligned: bytep; lSrcHdr,lDestHdr: TNIFTIhdr; lByteSwap: boolean; lSumName: string; begin result := ''; if not NIFTIhdr_LoadHdr (lSrcname, lSrcHdr, lByteSwap) then exit; case lSrcHdr.datatype of kDT_UNSIGNED_CHAR : ; kDT_SIGNED_SHORT: ; kDT_SIGNED_INT: ; kDT_FLOAT: ; else begin Msg('NII convert to 32-bit float error: datatype not supported.'); exit; end; end; //case lDestHdr := lSrcHdr; //destination has the comments and voxel BPP of source //lDestHdr.dim[4] := 1; lDestHdr.datatype := kDT_FLOAT; lDestHdr.bitpix := 32; lVol := lDestHdr.Dim[4]; lVox := lDestHdr.Dim[1]*lDestHdr.Dim[2]*lDestHdr.Dim[3]*lVol; //load dataset if not NIFTIhdr_LoadImg (lSrcName, lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap) then exit; NIFTIhdr_UnswapImg(lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap);//interpolation requires data is in native endian l8is := (@lSrcBuffer^[lSrcOffset+1]); GetMem(lBuffUnaligned ,(4*lVox) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := Align(lBuffUnaligned,16); // not commented - check this {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lPos := 1; l32f := SingleP(@lBuffAligned^[kNIIImgOffset+lPos] ); case lSrcHdr.datatype of kDT_SIGNED_SHORT: l16is := SmallIntP(l8is ); kDT_SIGNED_INT:l32is := LongIntP(l8is ); kDT_FLOAT: l32fs := SingleP(l8is ); end; //case if lSrcHdr.datatype = kDT_UNSIGNED_CHAR then begin for lPos := 1 to lVox do l32f^[lPos] := l8is^[lPos]; end else if lSrcHdr.datatype = kDT_SIGNED_SHORT then begin for lPos := 1 to lVox do l32f^[lPos] := l16is^[lPos]; end else if lSrcHdr.datatype = kDT_SIGNED_INT then begin for lPos := 1 to lVox do l32f^[lPos] := l32is^[lPos]; end else if lSrcHdr.datatype = kDT_FLOAT then begin for lPos := 1 to lVox do l32f^[lPos] := l32fs^[lPos]; end; if lMakeSym then MakeSym (l32f,lDestHdr); //next - ensure that no voxel has sum probability more than kMaxAllTissues if lVol > 1 then begin //for 4D data... lVox := lDestHdr.Dim[1]*lDestHdr.Dim[2]*lDestHdr.Dim[3]; //this will be done in 3D, not 4D for lPos := 1 to lVox do begin lSum := 0; for lV := 1 to lVol do lSum := lSum+ l32f^[lPos + ((lV-1)*lVox )]; //lookup table could speed this up if (lSum < kMinAllTissues) and (kMinAllTissues > 0) then begin lScale := kMinAllTissues-lSum; //add to 5th volume (soft tissue - non-brain l32f^[lPos + ((5-1)*lVox )] := lScale + l32f^[lPos + ((5-1)*lVox )]; //lookup table could speed this up end else if lSum > kMaxAllTissues then begin lScale := (kMaxAllTissues/lSum); for lV := 1 to lVol do l32f^[lPos + ((lV-1)*lVox )] := lScale * l32f^[lPos + ((lV-1)*lVox )]; //lookup table could speed this up end; end; //each voxel end; //4D (*lVox := lDestHdr.Dim[1]*lDestHdr.Dim[2]*lDestHdr.Dim[3]*lVol; //next - ensure no voxel is more than kmax for lPos := 1 to lVox do if l32f^[lPos] > kMax then l32f^[lPos] := kMax; //next - ensure that no voxel is less than kmin for lPos := 1 to lVox do if l32f^[lPos] < kMin then l32f^[lPos] := kMin; *) result := SaveNIfTICore (lDestName, lBuffAligned, kNIIImgOffset+1, lDestHdr, lPrefs,lByteSwap); //optional ... SumMap if lVol > 1 then begin //for 4D data... lVox := lDestHdr.Dim[1]*lDestHdr.Dim[2]*lDestHdr.Dim[3]; //this will be done in 3D, not 4D for lPos := 1 to lVox do begin lSum := 0; for lV := 1 to lVol do lSum := lSum+ l32f^[lPos + ((lV-1)*lVox )]; //lookup table could speed this up l32f^[lPos ] := lSum; //lookup table could speed this up end; //each voxel end; //4D lDestHdr.Dim[4] := 1; lSumName := ChangeFilePrefix (lDestName,'sum'); result := SaveNIfTICore (lSumName, lBuffAligned, kNIIImgOffset+1, lDestHdr, lPrefs,lByteSwap); //... end SumMap Freemem(lBuffUnaligned); Freemem(lSrcBuffer); end; function SumTPM (lSrcName,lDestName: string; lPrefs: TPrefs; lTissueTypes2Average: integer):string; //Sum of first three tissue types (GM, WM, CSF var //lScale,lSum: double; lPOs,lSrcOffset,lVol,lVox,lnVol: integer; l32fs,l32f : SingleP; l32is : LongIntP; l16is : SmallIntP; l8is,lSrcBuffer,lBuffUnaligned,lBuffAligned: bytep; lSrcHdr,lDestHdr: TNIFTIhdr; lByteSwap: boolean; //lSumName: string; begin result := ''; if not NIFTIhdr_LoadHdr (lSrcname, lSrcHdr, lByteSwap) then exit; case lSrcHdr.datatype of kDT_UNSIGNED_CHAR,kDT_SIGNED_SHORT,kDT_SIGNED_INT,kDT_FLOAT: ; else begin Msg('SumTPM error: datatype not supported.'); exit; end; end; //case lDestHdr := lSrcHdr; //destination has the comments and voxel BPP of source lDestHdr.datatype := kDT_FLOAT; lDestHdr.bitpix := 32; lDestHdr.Dim[4] := 1; lVox := lDestHdr.Dim[1]*lDestHdr.Dim[2]*lDestHdr.Dim[3]; //load dataset if not NIFTIhdr_LoadImg (lSrcName, lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap) then exit; NIFTIhdr_UnswapImg(lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap);//interpolation requires data is in native endian l8is := (@lSrcBuffer^[lSrcOffset+1]); lnVol := NonspatialDimensionsNII(lSrcHdr); if lnVol > lTissueTypes2Average then lnVol := lTissueTypes2Average; if lnVol < 1 then exit; GetMem(lBuffUnaligned ,(4*lVox) + 16+kNIIImgOffset); {$IFDEF FPC} lBuffAligned := Align(lBuffUnaligned,16); // not commented - check this {$ELSE} lBuffAligned := ByteP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} lPos := 1; l32f := SingleP(@lBuffAligned^[kNIIImgOffset+lPos] ); for lPos := 1 to lVox do l32f^[lPos] := 0; if lSrcHdr.datatype = kDT_UNSIGNED_CHAR then begin for lVol := 0 to lnVol -1 do for lPos := 1 to lVox do l32f^[lPos] := l32f^[lPos]+l8is^[lPos+(lVol*lVox)]; end else if lSrcHdr.datatype = kDT_SIGNED_SHORT then begin l16is := SmallIntP(l8is ); for lVol := 0 to lnVol -1 do for lPos := 1 to lVox do l32f^[lPos] := l32f^[lPos]+l16is^[lPos+(lVol*lVox)]; end else if lSrcHdr.datatype = kDT_SIGNED_INT then begin l32is := LongIntP(l8is ); for lVol := 0 to lnVol -1 do for lPos := 1 to lVox do l32f^[lPos] := l32f^[lPos]+l32is^[lPos+(lVol*lVox)]; end else if lSrcHdr.datatype = kDT_FLOAT then begin l32fs := SingleP(l8is ); for lVol := 0 to lnVol -1 do for lPos := 1 to lVox do l32f^[lPos] := l32f^[lPos]+l32fs^[lPos+(lVol*lVox)]; end; result := SaveNIfTICore (lDestName, lBuffAligned, kNIIImgOffset+1, lDestHdr, lPrefs,lByteSwap); lDestHdr.Dim[4] := 1; //result := SaveNIfTICore (lSumName, lBuffAligned, kNIIImgOffset+1, lDestHdr, lPrefs,lByteSwap); //... end SumMap Freemem(lBuffUnaligned); Freemem(lSrcBuffer); end; function SameHdrDim (lAHdr,lBHdr: TNIFTIhdr; lCheck4D, lCheckDataType: boolean): boolean; var i: integer; begin result := true; if (lCheckDataType) and (lAHdr.datatype <> lBHdr.datatype) then result := false; for i := 1 to 3 do if (lAHdr.Dim[i] <> lBHdr.Dim[i]) then result := false; for i := 1 to 3 do if (lAHdr.pixdim[i] <> lBHdr.pixdim[i]) then result := false; if lCheck4D then if (lAHdr.Dim[4] <> lBHdr.Dim[4]) then result := false; if not result then begin fx(1211); msg('Image dimensions or datatype differ'); end; end; function Merge4DFiles (lLowSliceName,lHighSliceName,lDestName: string; lNumberofLowSlicesToCopy: integer; lPrefs: TPrefs):string; //takes 4D image where each volume is 8-bit tissue map, saves as 32-bit float, ensures that no voxel has more than kmax or less than kmin intensity var lVolOffset,lSliceBytes,lV,lLoOffset,lHiOffset,lVol,lVox: integer; l8iHi,l8iLo,lLoBuffer,lHiBuffer {,lBuffUnaligned,lBuffAligned}: bytep; lLoHdr,lHiHdr: TNIFTIhdr; lByteSwapLo,lByteSwapHi: boolean; lBPP: integer; begin result := ''; if not NIFTIhdr_LoadHdr (lLowSliceName, lLoHdr, lByteSwapLo) then exit; if not NIFTIhdr_LoadHdr (lHighSliceName, lHiHdr, lByteSwapHi) then exit; if lNumberofLowSlicesToCopy < 1 then exit; if not SameHdrDim(lLoHdr, lHiHdr,true,true) then exit; case lLoHdr.datatype of kDT_UNSIGNED_CHAR : lBPP := 1; kDT_SIGNED_SHORT: lBPP := 2; kDT_SIGNED_INT:lBPP := 4; kDT_FLOAT: lBPP := 4; else begin Msg('Merge4DFiles error: datatype not supported.'); exit; end; end; //case //lDestHdr.dim[4] := 1; lVol := lHiHdr.Dim[4]; lSliceBytes:= lHiHdr.Dim[1]*lHiHdr.Dim[2] * lBPP; //load dataset if not NIFTIhdr_LoadImg (lLowSliceName, lLoHdr, lLoBuffer, lLoOffset,lByteSwapLo) then exit; NIFTIhdr_UnswapImg(lLoHdr, lLoBuffer, lLoOffset,lByteSwapLo);//interpolation requires data is in native endian if not NIFTIhdr_loadImg (lHighSliceName, lhiHdr, lhiBuffer, lhiOffset,lByteSwaphi) then exit; NIFTIhdr_UnswapImg(lhiHdr, lhiBuffer, lhiOffset,lByteSwaphi);//interpolation requires data is in native endian l8iLo := (@lLoBuffer^[lLoOffset+1]); l8iHi := (@lHiBuffer^[lHiOffset+1]); for lV := 1 to lVol do begin lVolOffset := (lV - 1) * (lSliceBytes*lHiHdr.Dim[3]); for lVox := 1 to (lSliceBytes*lNumberofLowSlicesToCopy) do l8iHi^[lVox+lVolOffset] := l8iLo^[lVox+lVolOffset]; end; result := SaveNIfTICore (lDestName, lhiBuffer, kNIIImgOffset+1, lHiHdr, lPrefs,lByteSwapHi); Freemem(lhiBuffer); Freemem(lloBuffer); end; function Insert3Din4D (l3DSliceName,l4DSliceName,lDestName: string; lVol2Copy: integer; lPrefs: TPrefs):string; //takes 4D image where each volume is 8-bit tissue map, saves as 32-bit float, ensures that no voxel has more than kmax or less than kmin intensity var lVolOffset,lVolBytes,l3DOffset,l4DOffset,lVox: integer; l8i4D,l8i3D,l3DBuffer,l4DBuffer {,lBuffUnaligned,lBuffAligned}: bytep; l3DHdr,l4DHdr: TNIFTIhdr; lByteSwap3D,lByteSwap4D: boolean; lBPP: integer; begin result := ''; if not NIFTIhdr_LoadHdr (l3DSliceName, l3DHdr, lByteSwap3D) then exit; if not NIFTIhdr_LoadHdr (l4DSliceName, l4DHdr, lByteSwap4D) then exit; if lVol2Copy < 1 then exit; if not SameHdrDim(l3DHdr, l4DHdr,false,true) then exit; case l3DHdr.datatype of kDT_UNSIGNED_CHAR : lBPP := 1; kDT_SIGNED_SHORT: lBPP := 2; kDT_SIGNED_INT:lBPP := 4; kDT_FLOAT: lBPP := 4; else begin Msg('Merge4DFiles error: datatype not supported.'); exit; end; end; //case //lDestHdr.dim[4] := 1; // lVol := l4DHdr.Dim[4]; lVolBytes:= l4DHdr.Dim[1]*l4DHdr.Dim[2]*l4DHdr.Dim[3]* lBPP; //load dataset if not NIFTIhdr_LoadImg (l3DSliceName, l3DHdr, l3DBuffer, l3DOffset,lByteSwap3D) then exit; NIFTIhdr_UnswapImg(l3DHdr, l3DBuffer, l3DOffset,lByteSwap3D);//interpolation requires data is in native endian if not NIFTIhdr_loadImg (l4DSliceName, l4DHdr, l4DBuffer, l4DOffset,lByteSwap4D) then exit; NIFTIhdr_UnswapImg(l4DHdr, l4DBuffer, l4DOffset,lByteSwap4D);//interpolation requires data is in native endian l8i3D := (@l3DBuffer^[l3DOffset+1]); l8i4D := (@l4DBuffer^[l4DOffset+1]); lVolOffset := (lVol2Copy - 1) * (lVolBytes); for lVox := 1 to (lVolBytes) do l8i4D^[lVox+lVolOffset] := l8i3D^[lVox]; result := SaveNIfTICore (lDestName, l4DBuffer, kNIIImgOffset+1, l4DHdr, lPrefs,lByteSwap4D); Freemem(l4DBuffer); Freemem(l3DBuffer); end; function NIFTIhdr_LoadImg8bit (var lSrcName: string; var lSrcHdr: TNIFTIHdr; var lSrcBuffer: bytep; var lSrcOffset: integer; var lByteSwap: boolean): boolean; begin result := false; if not NIFTIhdr_LoadImg (lSrcName, lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap) then exit; if lSrcHdr.datatype <> kDT_UNSIGNED_CHAR then begin msg('Only able to read 8-bit data.'); exit; end; //NIFTIhdr_UnswapImg(lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap);//interpolation requires data is in native endian result := true; end; function MaskImages(lMaskName: string; lFiles: TStrings; lPrefs: TPrefs; lVol: integer; lSaveThresh: boolean): string; var lFileOffset,lMaskOffset,lInc,lVox,lPos,lOK: integer; lMaskHdr,lFileHdr: TNIFTIHdr; lMaskSwap,lFileSwap: boolean; lFilename: string; lMaskBuffer,lFileBuffer,l8if: bytep; l32fm,l32fmean, l32fmeanpre: singlep; begin result := ''; if not NIFTIhdr_LoadHdr (lMaskName, lMaskHdr, lMaskSwap) then exit; if lMaskHdr.datatype <> kDT_FLOAT then begin msg('This function only works with 32-bit float data.'); exit; end; lVox := lMaskHdr.Dim[1]*lMaskHdr.Dim[2]*lMaskHdr.Dim[3]; if lFiles.Count < 1 then exit; if not NIFTIhdr_LoadImg (lMaskName, lMaskHdr, lMaskBuffer, lMaskOffset,lMaskSwap) then exit; NIFTIhdr_UnswapImg(lMaskHdr, lMaskBuffer, lMaskOffset,lMaskSwap);//interpolation requires data is in native endian //fx( ((lVol-1)* (lVox*4) ) ); l32fm := SingleP(@lMaskBuffer^[lMaskOffset+1+ ((lVol-1)* (lVox*4) )]); //l32fo := SingleP(@lBuffAligned^[kNIIImgOffset+lPos] ); GetMem(l32fmean ,(4*lVox)); for lPos := 1 to lVox do l32fmean^[lPos] := 0; GetMem(l32fmeanpre ,(4*lVox)); for lPos := 1 to lVox do l32fmeanpre^[lPos] := 0; lOK := 0; for lInc := 1 to lFiles.Count do begin lFilename := lFiles.Strings[lInc-1]; if not NIFTIhdr_LoadImg8bit (lFileName, lFileHdr, lFilebuffer, lFileOffset,lFileSwap) then begin msg('Serious error reading '+lFilename); exit; end; if not (SameHdrDim(lMaskHdr,lFileHdr,false,false)) then //fx(666) //msg('This function only works with data with identical dimensions.') else begin l8if := (@lFilebuffer^[lFileOffset+1]); for lPos := 1 to lVox do begin l32fmeanpre^[lPos] := l32fmeanpre^[lPos] + l8if^[lPos]; if l32fm^[lPos] = 0 then l8if^[lPos] := 0 else l32fmean^[lPos] := l32fmean^[lPos] + l8if^[lPos]; end; lFilename := ChangeFilePrefix (lFilename,'z'); if lSaveThresh then result := SaveNIfTICore (lFilename, lFileBuffer, lFileOffset+1, lFileHdr, lPrefs,lFileSwap); inc(lOK); end; Freemem(lFilebuffer); end; if lOK > 1 then begin lMaskHdr.dim[4] := 1; //save only one volume lMaskHdr.scl_slope := lFileHdr.scl_slope; lMaskHdr.scl_inter := lFileHdr.scl_inter; l32fm := SingleP(@lMaskBuffer^[lMaskOffset+1]); for lPos := 1 to lVox do l32fm^[lPos] := l32fmean^[lPos]/lOK; lFilename := ChangeFilePrefix (lMaskName,'mean'+inttostr(lVol)); result := SaveNIfTICore (lFilename, lMaskBuffer, lMaskOffset+1, lMaskHdr, lPrefs,lMaskSwap); for lPos := 1 to lVox do l32fm^[lPos] := l32fmeanpre^[lPos]/lOK; lFilename := ChangeFilePrefix (lMaskName,'meanpre'+inttostr(lVol)); result := SaveNIfTICore (lFilename, lMaskBuffer, lMaskOffset+1, lMaskHdr, lPrefs,lMaskSwap); end; Freemem(l32fmean); Freemem(lMaskBuffer); end; function lDigitChar (lString: string): integer; //returns position of first number in filename, e.g. c:\x1xx.nii would return 5, since '1' is 5th char var lP, lLen: integer; begin result := 0; lLen := length(lString); if lLen < 1 then exit; for lP := lLen downto 1 do begin if lString[lP] in ['0'..'9'] then result := lP; if lString[lP] in ['/','\'] then exit; end; end; function Binarize(lC1Name: string; lPrefs: TPrefs ): string; const kMaps = 5; kInten: array [1.. kMaps] of integer = ({graymatter}4,{whitematter}5,{csf}3,{bone}2,{soft tissue}1); var //lFileOffset,lMaskOffset,lInc,lVox,lPos,lOK: integer; lHname : array [1..kMaps] of string; lH: array [1..kMaps] of TNIFTIHdr; lMax,lMaxV,lV,lVox,lMap,lCharPos: integer; lHSwap: boolean; //lFilename: string; lHBuffer,lH8i: array [1..kMaps] of bytep; lHOffset: array [1..kMaps] of integer; //l32fm,l32fmean, l32fmeanpre: singlep; begin result := ''; lCharPos := lDigitChar (lC1Name); if lCharPos < 1 then begin msg('Error: number should be in filename.'); exit; end; for lMap := 1 to kMaps do begin lHname[lMap] := lC1Name; lHname[lMap][lCharPos] := inttostr(lMap)[1]; if not fileexists(lHname[lMap]) then begin msg('Can not find '+lHname[lMap]); exit; end; end; for lMap := 1 to kMaps do begin if not NIFTIhdr_LoadImg8bit (lHname[lMap], lH[lMap], lHBuffer[lMap], lHOffset[lMap],lHSwap) then begin msg('Serious error reading '+lHname[lMap]); exit; end; lH8i[lMap] := (@lHBuffer[lMap]^[lHOffset[lMap]+1]); end; lVox := lH[1].Dim[1]*lH[1].Dim[2]*lH[1].Dim[3]; (*for lV := 1 to lVox do begin lMax := lH8i[4]^[lV] * 2; if lMax > 1 {255} then lMax := 255; lH8i[4]^[lV] := 255; end; *) for lV := 1 to lVox do begin lMax := kMaps; lMaxV := lH8i[kMaps]^[lV]; for lMap := (kMaps-1) downto 1 do begin if lH8i[lMap]^[lV] > lMaxV then begin lMax := lMap; lMaxV := lH8i[lMap]^[lV]; end; end; lMax := kInten[lMax]; //if lMax = kMaps then lMax := 0; if lMaxV < 25 then lMax := 0; lH8i[1]^[lV] := lMax; end; lH[1].dim[4] := 1; //save only one volume lH[1].scl_slope := 1; lH[1].scl_inter := 0; lHname[1][lCharPos] := 'b'; result := SaveNIfTICore (lHname[1], lHBuffer[1], lHOffset[1]+1, lH[1], lPrefs,lHSwap); for lMap := 1 to kMaps do Freemem(lHBuffer[lMap]); end; (*function NIFTIhdr_LoadImgAs32float (var lSrcName: string; var lSrcHdr: TNIFTIHdr; var lSrcBuffer: bytep; var l32f: singlep; var lSrcOffset: integer; var lByteSwap: boolean): boolean; //function NIFTIhdr_LoadImgAs32float (var lSrcName: string; var lSrcHdr: TNIFTIHdr; {var lSrcBuffer: bytep;} var l32f: singlep; var lSrcOffset: integer; var lByteSwap: boolean): boolean; var l32is : LongIntP; l16is : SmallIntP; lImgBuffer,l8is: bytep; lPos,lVox: integer; //lSrcBuffer: bytep; begin result := false; if not NIFTIhdr_LoadImg (lSrcName, lSrcHdr, lImgBuffer, lSrcOffset,lByteSwap) then exit; NIFTIhdr_UnswapImg(lSrcHdr, lImgBuffer, lSrcOffset,lByteSwap);//interpolation requires data is in native endian result := true; l8is := (@lImgBuffer^[lSrcOffset+1]); //GetMem(l32f ,4*lVox ); case lSrcHdr.datatype of kDT_SIGNED_SHORT: l16is := SmallIntP(l8is ); kDT_SIGNED_INT:l32is := LongIntP(l8is ); kDT_FLOAT: begin l32f := SingleP(l8is ); lSrcBuffer := lImgBuffer; {<- not sure if this works!} exit; end; end; //case lVox := lSrcHdr.Dim[1]*lSrcHdr.Dim[2]*lSrcHdr.Dim[3]; GetMem(lSrcBuffer ,(4*lVox) +lSrcOffset); l32f := SingleP(@lSrcBuffer^[lSrcOffset+1]); if lSrcHdr.datatype = kDT_UNSIGNED_CHAR then for lPos := 1 to lVox do l32f^[lPos] := l8is^[lPos] else if lSrcHdr.datatype = kDT_SIGNED_SHORT then for lPos := 1 to lVox do l32f^[lPos] := l16is^[lPos] else if lSrcHdr.datatype = kDT_SIGNED_INT then for lPos := 1 to lVox do l32f^[lPos] := l32is^[lPos]; result := true; freemem(lImgBuffer); lSrcHdr.datatype := kDT_FLOAT; end; *) function As32 (lSrcName: string; var lSrcHdr:TNIFTIhdr; var l32f: singlep):boolean; //takes 4D image where each volume is 8-bit tissue map, saves as 32-bit float, ensures that no voxel has more than kmax or less than kmin intensity var (* lScale,lSum: double; lV,lPOs,lSrcOffset,lVol,lVox: integer; l32fs,l32f : SingleP; l32is : LongIntP; l16is : SmallIntP; l8is,lSrcBuffer,lBuffUnaligned,lBuffAligned: bytep; lSrcHdr,lDestHdr: TNIFTIhdr; *) l32is : LongIntP; l32fs : SingleP; l16is : SmallIntP; l8is,lSrcBuffer: bytep; lSrcOffset,lVox,lPos: integer; lByteSwap: boolean; begin result := false; if not NIFTIhdr_LoadHdr (lSrcname, lSrcHdr, lByteSwap) then exit; case lSrcHdr.datatype of kDT_UNSIGNED_CHAR : ; kDT_SIGNED_SHORT: ; kDT_SIGNED_INT: ; kDT_FLOAT: ; else begin Msg('NII convert to 32-bit float error: datatype not supported.'); exit; end; end; //case lVox := lSrcHdr.Dim[1]*lSrcHdr.Dim[2]*lSrcHdr.Dim[3]; //load dataset if not NIFTIhdr_LoadImg (lSrcName, lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap) then exit; NIFTIhdr_UnswapImg(lSrcHdr, lSrcBuffer, lSrcOffset,lByteSwap);//interpolation requires data is in native endian l8is := (@lSrcBuffer^[lSrcOffset+1]); GetMem(l32f ,lVox * sizeof(single)); //lPos := 1; case lSrcHdr.datatype of kDT_SIGNED_SHORT: l16is := SmallIntP(l8is ); kDT_SIGNED_INT:l32is := LongIntP(l8is ); kDT_FLOAT: l32fs := SingleP(l8is ); end; //case if lSrcHdr.datatype = kDT_UNSIGNED_CHAR then begin for lPos := 1 to lVox do l32f^[lPos] := l8is^[lPos]; end else if lSrcHdr.datatype = kDT_SIGNED_SHORT then begin for lPos := 1 to lVox do l32f^[lPos] := l16is^[lPos]; end else if lSrcHdr.datatype = kDT_SIGNED_INT then begin for lPos := 1 to lVox do l32f^[lPos] := l32is^[lPos]; end else if lSrcHdr.datatype = kDT_FLOAT then begin for lPos := 1 to lVox do l32f^[lPos] := l32fs^[lPos]; for lPos := 1 to lVox do if specialsingle(l32f^[lPos]) then l32f^[lPos] := 0; end; freemem(lSrcBuffer); result := true; end; //function MaskImgs(lC1template, lC1source: string; lPrefs: TPrefs ; lThresh: integer): string; function MaskImg(ltemplate, lsource: string; lPrefs: TPrefs; lThresh: single ): string; label 666; var lH,lT: TNIFTIHdr; lV,lVox,lHOffset: integer; lHSwap: boolean; l32fs : SingleP; l8is,lHBuffer: bytep; lOutname: string; begin result := ''; if (not fileexists(lsource)) then begin msg('Can not find '+ lsource); exit; end; if (not fileexists(ltemplate)) then begin msg('Can not find '+ ltemplate); exit; end; //if not NIFTIhdr_LoadImgAs32float (lsource, lH, lHBuffer, lHOffset,lHSwap) then begin if not NIFTIhdr_LoadImg8bit (lsource, lH, lHBuffer, lHOffset,lHSwap) then begin msg('Serious error reading '+lsource); exit; end; //function NIFTIhdr_LoadImgAs32float (var lSrcName: string; var lSrcHdr: TNIFTIHdr; var lSrcBuffer: bytep; var l32f: singlep; var lSrcOffset: integer; var lByteSwap: boolean): boolean; if not As32 (ltemplate, lT, l32fs) then begin msg('Serious error reading '+ltemplate); exit; end; lVox := lH.Dim[1]*lH.Dim[2]*lH.Dim[3]; if not SameHdrDim (lH,lT, false, false) then begin msg('Image dimensions do not match: '+ltemplate+' <> '+lsource); goto 666; end; l8is := (@lHBuffer^[lHOffset+1]); for lV := 1 to lVox do if (l32fs^[lV] < lThresh) then l8is^[lV] := 0; lH.dim[4] := 1; //save only one volume lH.scl_slope := 1; lH.scl_inter := 0; lOutname := ChangeFilePrefix(lsource,'m'); msg(lsource +' masked with '+ltemplate +' = '+lOutname); result := SaveNIfTICore (loutname, lHBuffer, lHOffset+1, lH, lPrefs,lHSwap); 666: Freemem(l32fs); Freemem(lHBuffer); end; function MaskImgs(lC1template, lC1source: string; lPrefs: TPrefs ; lThresh: single): string; const kMaps = 5; var lTName,lSName: string; lMap,lSPos,lTPos: integer; begin result := ''; lSPos := lDigitChar (lC1source); lTPos := lDigitChar (lC1template); if (lSPos < 1) or (lTPos < 1) then begin msg('Error: number should be in filenames: '+lC1template+' '+ lC1source); exit; end; lSname:= lC1source; lTname:= lC1template; for lMap := 1 to kMaps do begin lSname[lSPos] := inttostr(lMap)[1]; lTname[lTPos] := inttostr(lMap)[1]; //msg(lTName+' '+ lSName); if ( fileexists(lTName)) and ( fileexists(lSName)) then result := MaskImg(lTName, lSName, lPrefs, lThresh) ; end; msg('Masking completed'); end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/manifest.res0000664000175000017500000000224710654406674021537 0ustar michaelmichael џџџџg џџџџ Your application description here. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/manifest.or0000664000175000017500000000243410654406052021352 0ustar michaelmichaelL.rsrcР<ќ@P№БF€№БF0€№БFHXg Your application description here. H.rsrcmricron-0.20120505.1~dfsg.1.orig/dcm2nii/lsjpeg.pas0000664000175000017500000011176111326434462021202 0ustar michaelmichaelunit lsjpeg; {//$DEFINE Stream} //rev13: changes by CR and JGS //rev19: uses Lookup table for decoding Huffman table: this doubles the speed interface {$H+} uses dialogsx, {$IFNDEF UNIX} //windows, {$ENDIF} sysutils,define_types,classes; type HufRA = record HufSz,HufCode,HufVal: Integer; end; {$IFDEF Stream} procedure DecodeJPEG(var lStream: TMemoryStream; var lOutSmallRA: SmallIntP0; var lImgRAz: ByteP0;lOutputSz,lCptPosition,lCptSize: integer; lVerbose: boolean); {$ELSE} procedure DecodeJPEG(var infp: file; var lOutSmallRA: SmallIntP0; var lImgRAz: ByteP0;lOutputSz,lCptPosition,lCptSize: integer; lVerbose: boolean); {$ENDIF} implementation {$IFDEF Stream} procedure DecodeJPEG(var lStream: TMemoryStream; var lOutSmallRA: SmallIntP0; var lImgRAz: ByteP0;lOutputSz,lCptPosition,lCptSize: integer; lVerbose: boolean); {$ELSE} procedure DecodeJPEG(var infp: file; var lOutSmallRA: SmallIntP0; var lImgRAz: ByteP0;lOutputSz,lCptPosition,lCptSize: integer; lVerbose: boolean); {$ENDIF} const kmaxFrames = 4; label 666 {EOF}; var lRawRA: bytep; lImgRA: WordP; lHufVal,lAbba,lOffset,lLineStart,lPredicted,lPredictedG,lPredictedB,lRestartSegmentSz, lSz,k,Code,Si,lIncX,lIncY,lInc,lPredA,lPredB,lPredC,lCurrentBitPos,btS1,btS2, btMarkerType, DHTnLi,DHTtcth,SOFprecision,SOSpttrans, SOFnf,SOFarrayPos,SOSns,SOSarrayPos,SOSss,SOSse,SOSahal:integer;//byte; lHufTable,lnHufTables,{lDecode,}lImgStart,lRawSz,lRawPos,lItems,SOFydim, SOFxdim: integer; lMaxHufSi,lMaxHufVal: array [1..kmaxFrames] of integer; DHTLiRA,DHTstartRA: array [1..kmaxFrames,0..31] of integer;//byte; lBitMask: array [1..17] of integer; lSSSSszRA: array [1..kMaxFrames,0..17] of byte; lLookUpRA: array [1..kMaxFrames,0..255] of byte; //lists all possible SSSS with <= 8bits lHufRA: array [1..kMaxFrames,0..31] of HufRA; lFrameCount,lSegmentLength,lSegmentEnd,lI: integer; lImgTypeC3,lHdrOK: boolean; function ReadBit: integer; //Read the next single bit begin result := (lRawRA^[lRawPos] shr (7-lCurrentBitPos)) and 1; lCurrentBitPos := lCurrentBitPos + 1; if (lCurrentBitPos = 8) then begin lRawPos := 1+lRawPos; lCurrentBitPos := 0; end; end; function ReadBits ( lNum: integer): integer; //lNum: bits to read, not to exceed 16 begin result := lRawRA^[lRawPos]; result := result shl 8 + lRawRA^[lRawPos+1]; result := result shl 8 + lRawRA^[lRawPos+2]; result := (result shr (24-lCurrentBitPos-lNum)) and lBitMask[lNum]; //lCurrentBitPos is incremented from 1, so -1 lCurrentBitPos := lCurrentBitPos + lNum; if (lCurrentBitPos > 7) then begin lRawPos := lRawPos+(lCurrentBitPos shr 3); lCurrentBitPos := (lCurrentBitPos and 7); end; end; function DecodePixelDifference( lFrame: integer): integer;//Red/Green/Blue each a separate 'Frame': can have unique huffman tables var lByte,lHufValSSSS,lInput,lInputbits,lDiff,lI: integer; begin // read one byte from the stream, without modifying the pointer lByte := (lRawRA^[lRawPos] shl lCurrentBitPos) + (lRawRA^[lRawPos+1] shr (8-lCurrentBitPos)); lByte := lByte and 255; lHufValSSSS := lLookUpRA[lFrame,lByte]; //lLookUpRA: array [1..kMaxFrames,0..255] of byte; //lists all possible SSSS with <= 8bits if lHufValSSSS < 255 then begin lCurrentBitPos := lSSSSszRA[lFrame,lHufValSSSS] + lCurrentBitPos; lRawPos := lRawPos + (lCurrentBitpos shr 3); lCurrentBitpos := lCurrentBitpos and 7; //AdvanceBitPos(lSSSSszRA[lFrame,lSSSS]), but inlined; end else begin //full SSSS is not in the first 8-bits if (lByte < 0) or (lByte > 255) then msg('lsjeg error'); lInput := lByte; lInputBits := 8; inc(lRawPos); // forward 8 bits = precisely 1 byte repeat Inc(lInputBits); lInput := lInput shl 1 + ReadBit; if DHTLiRA[lFrame,lInputBits] <> 0 then begin //if any entires with this length for lI := DHTstartRA[lFrame,lInputBits] to (DHTstartRA[lFrame,lInputBits]+DHTLiRA[lFrame,lInputBits]-1) do begin if (lInput = lHufRA[lFrame,lI].HufCode) then lHufValSSSS := lHufRA[lFrame,lI].HufVal; end; //check each code end; //if any entires with this length if (lInputBits >= lMaxHufSi[lFrame]) and (lHufValSSSS > 254) then begin//exhausted options CR: added rev13 lHufValSSSS := lMaxHufVal[lFrame]; end; until (lHufValSSSS < 255); end; //answer in first 8 bits //The HufVal is referred to as the SSSS in the Codec, so it is called 'lHufValSSSS' case lHufValSSSS of 0: result:= 0; 1: if ReadBit = 0 then result := -1 else result := 1; (*BELOW only a tiny bit faster to separate 2..15 into 2..9 and 10..15, requires extra procedure and more 2..9: begin //see 10..15 for explanation lDiff := ReadBits2_9(lHufValSSSS); if (lDiff > (lBitMask[lHufValSSSS-1])) then //add result := lDiff else //negation result := lDiff - lBitMask[lHufValSSSS]; end; //2..9 *) 2..15: begin //Osiris includes extra bits after SSSS=16...a violation of the standard See "TABLE H.2 - Difference categories for lossless Huffman coding" of the codec ITU-T81 //According to the Codec H.1.2.2 "No extra bits are appended after SSSS = 16 is encoded." //To patch for Osiris Change case from 2..15 to 2..16 // This will work for Osiris images, but will break non-Osiris images lDiff := ReadBits(lHufValSSSS); if (lDiff > (lBitMask[lHufValSSSS-1])) then //add result := lDiff // this is slightly unintuitive: the positive bit is identical to the offset shown in TABLE H.2, a slower but more intuitive way to do this is: //result := (lDiff and lBitMask[lHufVal-1]) + (1 shl (lHufval-1)); //where you clip off the sign bit and then SHL appropriately else //negation result := lDiff - lBitMask[lHufValSSSS]; //NEXT to lines are a bit more intuitive: //lDiff := lBitMask[lHufVal-1]- lDiff; //result := -(lDiff + (1 shl (lHufval-1)));//negation end; //10..15 else //16, not osiris result := 32768; end; //case HuffVal end; //func DecodePixelDifference procedure ReadByte(var lByte: integer); begin inc(lRawPos); lByte := lRawRA^[lRawPos]; end; function ReadWord: word; var lbtL1, lbtL2: byte; begin inc(lRawPos); lbtL1 := lRawRA^[lRawPos]; inc(lRawPos); lbtL2 := lRawRA^[lRawPos]; result := (256 * lbtL1 + lbtL2) end; //NEXT: main procedure begin lAbba := 4; lnHufTables := 0; lRawSz := lCptSize; lRawPos := 0; lRestartSegmentSz := 0; lImgTypeC3 := false; SOFxdim:= 1; if lRawSz < 32 then goto 666; for lFrameCount := 1 to kMaxFrames do for lInc := 1 to 16 do DHTstartRA[lFrameCount,lInc] := 0; SOFydim := 1; SOSpttrans := 0; lHdrOK := false; SOFnf := 0; SOSns := 0; GetMem( lRawRA, lRawSz); {$IFDEF Stream} lStream.Seek(lCptPosition, soFromBeginning); lStream.readBuffer(lRawRA^, lRawSz); {$ELSE} Seek(infp,lCptPosition); BlockRead(infp, lRawRA^, lRawSz); {$ENDIF} ReadByte(btS1); ReadByte(btS1); repeat repeat if lRawPos <= lRawSz then ReadByte(btS1); if btS1 <> $FF then begin goto 666; end; if lRawPos <= lRawSz then ReadByte( btMarkerType); case btMarkerType of //only process segments with length fields $0,$1,$D0..$D7,$FF: btMarkerType := 0; //0&FF = fillers, $1=TEM,$D0..D7=resync end; until (lRawPos >= lRawSz) or (btMarkerType <> 0); lSegmentLength := ReadWord; lSegmentEnd := lRawPos+(lSegmentLength - 2); if lSegmentEnd > lRawSz then goto 666; if (btMarkerType = $C3) then lImgTypeC3 := true; if lverbose then msg( inttohex(btMarkerType,2)); case btMarkerType of $0: ; //filler - ignore $C0..$C3,$C5..$CB,$CD..$CF: begin //read SOF FrameHeader ReadByte(SOFprecision); SOFydim := ReadWord; SOFxdim:= ReadWord; ReadByte(SOFnf); if lverbose then msg('[precision:'+inttostr(SOFprecision)+' X*Y:'+inttostr(SOFxdim)+'*'+inttostr(SOFydim)+'nFrames:'+inttostr(SOFnf)+'] '); if (not lImgTypeC3) or ((SOFnf <> 1) and (SOFnf <> 3)) then begin msg('Unable to extract this file format.'); end; SOFarrayPos := lRawPos; lRawPos := (lSegmentEnd); end; //SOF FrameHeader $C4: begin //DHT Huffman if lverbose then msg( 'HuffmanLength'+inttostr(lSegmentLength)+':'); //if SOFnf <1 then SOFnf := 1; //we may not know SOFnf yet! lFrameCount := 1; repeat ReadByte( DHTtcth); //msg(inttostr(lFrameCount)+'@'+inttostr(DHTtcth and 15)+'x'+inttostr(DHTtcth )); DHTnLi := 0; for lInc := 1 to 16 do begin ReadByte(DHTliRA[lFrameCount,lInc]); DHTnLi := DHTnLi + DHTliRA[lFrameCount,lInc]; if DHTliRA[lFrameCount,lInc] <> 0 then lMaxHufSi[lFrameCount] := lInc; //msg(inttostr(DHTliRA[lFrameCount,lInc])+'@'+inttostr(lMaxHufSi)); end; if DHTnLi > 17 then begin msg('Huffman table corrupted.'); goto 666; end; lIncY := 0; //frequency for lInc := 0 to 31 do begin lHufRA[lFrameCount, lInc].HufVal := -1; lHufRA[lFrameCount, lInc].HufSz := -1; lHufRA[lFrameCount, lInc].HufCode := -1; end; for lInc := 1 to 16 do begin //set the huffman size values if DHTliRA[lFrameCount,lInc]> 0 then begin DHTstartRA[lFrameCount,lInc] := lIncY+1; for lIncX := 1 to DHTliRA[lFrameCount,lInc] do begin inc(lIncY); ReadByte(btS1); lHufRA[lFrameCount,lIncY].HufVal := btS1; lMaxHufVal[lFrameCount] := btS1; if (btS1 >= 0) and (btS1 <= 16) then lHufRA[lFrameCount,lIncY].HufSz := lInc else begin msg('Huffman size array corrupted.'); goto 666; end; end; end; //Length of size lInc > 0 end; //msg('Max bits:'+inttostr(lMaxHufSi)+' SSSS:'+inttostr(lMaxHufVal)); K := 1; Code := 0; Si := lHufRA[lFrameCount,K].HufSz;//HuffSizeRA[1]; repeat while (Si = lHufRA[lFrameCount,K].HufSz) do begin lHufRA[lFrameCount,K].HufCode := Code; //msg('bits: '+inttostr(Si)+' NthEntry:'+inttostr(K)+' Code:'+inttostr(Code)); Code := Code + 1; Inc(K); end; if K <= DHTnLi then begin while lHufRA[lFrameCount,K].HufSz > Si do begin Code := Code Shl 1; Si := Si + 1; end; //while Si end; //K <= 17 until K > DHTnLi;// JGS added rev13 inc(lFrameCount); until (lSegmentEnd-lRawPos) < 18; lnHufTables := lFrameCount - 1; //msg(inttostr(lnHufTables)); lRawPos := (lSegmentEnd); end; //$C4: DHT Huffman $DD: begin //Define Restart lRestartSegmentSz := Readword; lRawPos := (lSegmentEnd); end; $DA: begin //read SOS Scan Header if SOSns > 0 then goto 666; //multiple SOS! ReadByte(SOSns); //if Ns = 1 then NOT interleaved, else interleaved: see B.2.3 SOSarrayPos := lRawPos; if SOSns > 0 then begin for lInc := 1 to SOSns do begin ReadByte( btS1); //component identifier 1=Y,2=Cb,3=Cr,4=I,5=Q ReadByte(btS2); //horizontal and vertical sampling factors end; end; ReadByte(SOSss); //predictor selection B.3 ReadByte( SOSse); ReadByte( SOSahal); //lower 4bits= pointtransform SOSpttrans := SOSahal and 16; if lverbose then msg('[Predictor: '+inttostr(SOSss)+' PointTransform:'+inttostr(SOSahal)+'] '); lRawPos := (lSegmentEnd); end; //$DA SOS - Scan Header else begin //skip marker segment; lRawPos := (lSegmentEnd); end; end; //case markertype until (lRawPos >= lRawSz) or (btMarkerType = $DA); {hexDA=Start of scan} lHdrOK := true; //errors goto label 666, so are NOT OK lImgStart := lRawPos; 666: if not lHdrOK then begin msg('Unable to read this file - is this really a JPEG image?'); exit; end; if (not lImgTypeC3) then exit; //lossless compressed huffman tables //NEXT: unpad data - delete byte that follows $FF lINc := lRawPos; lIncX := lRawPos; repeat lRawRA^[lIncX] := lRawRA^[lInc]; if lRawRA^[lInc] = 255 then begin if (lRawRA^[lInc+1] = $00) then lInc := lInc+1 else begin //msg(inttostr(lRawRA^[lInc+1])); if (lRawRA^[lInc+1] = $D9) then //end of image lIncX := -666; //end of padding end; end; inc(lInc); inc(lIncX); until lIncX < 0; //End: Data unpadding //NEXT: Create Huffman LookupTable. //We will compute all possible outcomes for an 8-bit value, while less intuitive than //reading Huffman 1 bit at a time, it doubles the decompression speed lBitMask[1]:= 1; lBitMask[2]:= 3; lBitMask[3]:= 7; lBitMask[4]:= 15; lBitMask[5]:= 31; lBitMask[6]:= 63; lBitMask[7]:= 127; lBitMask[8]:= 255; lBitMask[9]:= 511; lBitMask[10]:= 1023; lBitMask[11]:= 2047; lBitMask[12]:= 4095; lBitMask[13]:= 8191; lBitMask[14]:= 16383; lBitMask[15]:= 32767; lBitMask[16]:= 65535; lBitMask[17]:= 131071; //ONLY required for Osiris corrupted images, see DecodePixelDifference for details //NEXT: some RGB images use only a single Huffman table for all 3 colour planes. In this case, replicate the correct values if (lnHufTables < SOFnf) then begin //use single Hufman table for each frame //msg('generating tables'+inttostr(SOFnf)); if lnHufTables < 1 then begin msg('Lossless JPEG decoding error: no Huffman tables.'); exit; end; for lFrameCount := 2 to SOFnf do begin for lInc := 1 to 16 do DHTstartRA[lFrameCount,lInc] := DHTstartRA[1,lInc]; for lInc := 0 to 31 do begin lHufRA[lFrameCount,lInc].HufCode := lHufRA[1,lInc].HufCode; lHufRA[lFrameCount,lInc].HufVal := lHufRA[1,lInc].HufVal; lHufRA[lFrameCount,lInc].HufSz := lHufRA[1,lInc].HufSz; DHTliRA[lFrameCount,lInc] := DHTliRA[1,lInc]; end; //for each table entry end; //for each frame xx end;// if lnHufTables < SOFnf for lFrameCount := 1 to kMaxFrames do for lInc := 0 to 17 do lSSSSszRA[lFrameCount,lInc] := 123; //Impossible value for SSSS, suggests 8-bits can not describe answer for lFrameCount := 1 to kMaxFrames do for lInc := 0 to 255 do lLookUpRA[lFrameCount,lInc] := 255; //Impossible value for SSSS, suggests 8-bits can not describe answer //NEXT fill lookuptable for lFrameCount := 1 to SOFnf do begin lIncY := 0; for lSz := 1 to 8 do begin //set the huffman lookup table for keys with lengths <=8 if DHTliRA[lFrameCount,lSz]> 0 then begin for lIncX := 1 to DHTliRA[lFrameCount,lSz] do begin inc(lIncY); lHufVal := lHufRA[lFrameCount,lIncY].HufVal; //SSSS {if (lHufVal < 0) or (lHufVal > 17) then begin msg('Unknown SSSS =' +inttostr(lHufVal)); lHufVal := 16; end; } lSSSSszRA[lFrameCount,lHufVal] := lSz; k := (lHufRA[lFrameCount,lIncY].HufCode shl (8-lSz )) and 255; //K= most sig bits for hufman table if lSz < 8 then begin //fill in all possible bits that exceed the huffman table lInc := lBitMask[8-lSz]; for lCurrentBitPos := 0 to lInc do begin lLookUpRA[lFrameCount,k+lCurrentBitPos] := lHufVal; end; end else lLookUpRA[lFrameCount,k] := lHufVal; //SSSS {msg('Frame ' + inttostr(lFrameCount) + ' SSSS= '+inttostr(lHufRA[lFrameCount,lIncY].HufVal)+ ' Size= '+inttostr(lHufRA[1,lIncY].HufSz)+ ' Code= '+inttostr(lHufRA[1,lIncY].HufCode)+ ' SHL Code= '+inttostr(k)+ ' EmptyBits= '+inttostr(lInc)); } end; //Set SSSS end; //Length of size lInc > 0 end; //for lInc := 1 to 8 end; //For each frame, e.g. once each for Red/Green/Blue //Next: uncompress data: different loops for different predictors SOFxdim:= SOFnf*SOFxdim; lItems := SOFxdim*SOFydim; //if lVerbose then msg('precision'+inttostr(SOFprecision)); //for timing, multiple decoding loops lRawAbba := lRawPos;for lLoopsAbba := 1 to 100 do begin lRawPos := lRawAbba; //if (lRestartSegmentSz > 0) and ((SOFPrecision<> 8) or (SOSss = 7)) then //add restart support if we ever find any samples to test // msg('This image uses restart markers. Please contact the author. Predictor:Precision '+inttostr(SOSss)+':'+inttostr(SOFPrecision)); inc(lRawPos);//abbax lCurrentBitPos := 0; //read in a new byte //lCurrentBitPos := 1; //read in a new byte lItems := SOFxdim*SOFydim; lPredicted := 1 shl (SOFPrecision-1-SOSpttrans); lInc := 0; if (SOFPrecision<> 8) then begin //start - 16 bit data lImgRA := @lOutSmallRA[0];{set to 1 for MRIcro, else 0} FillChar(lImgRA^,lItems*sizeof(word), 0); //zero array lPredB:= 0; lPredC := 0; case SOSss of //predictors 1,2,3 examine single previous pixel, here we set the relative location 2: lPredA:= SOFxDim-1; //Rb directly above 3: lPredA:= SOFxDim; //Rc UpperLeft:above and to the left 4,5: begin lPredA := 0; lPredB := SOFxDim-1; //Rb directly above lPredC:= SOFxDim; //Rc UpperLeft:above and to the left end; 6: begin lPredB := 0; lPredA := SOFxDim-1; //Rb directly above lPredC:= SOFxDim; //Rc UpperLeft:above and to the left end; else lPredA := 0; //Ra: directly to left end; //case SOSss: predictor offset for lIncX := 1 to SOFxdim do begin inc(lInc); //writenext voxel if lInc > 1 then lPredicted := lImgRA^[lInc-1]; lImgRA^[lInc] := lPredicted+DecodePixelDifference(1); end; //first line: use prev voxel prediction; if lRestartSegmentSz = 0 then begin for lIncY := 2 to SOFyDim do begin inc(lInc); //write next voxel lPredicted := lImgRA^[lInc-SOFxdim]; lImgRA^[lInc] := lPredicted+DecodePixelDifference(1); if SOSss = 4 then begin for lIncX := 2 to SOFxdim do begin lPredicted := lImgRA^[lInc-lPredA]+lImgRA^[lInc-lPredB]-lImgRA^[lInc-lPredC]; inc(lInc); //writenext voxel lImgRA^[lInc] := lPredicted+DecodePixelDifference(1); end; //for lIncX end else if (SOSss = 5) or (SOSss = 6) then begin for lIncX := 2 to SOFxdim do begin lPredicted := lImgRA^[lInc-lPredA]+ ((lImgRA^[lInc-lPredB]-lImgRA^[lInc-lPredC]) shr 1); inc(lInc); //writenext voxel lImgRA^[lInc] := lPredicted+DecodePixelDifference(1); end; //for lIncX end else if SOSss = 7 then begin for lIncX := 2 to SOFxdim do begin inc(lInc); //writenext voxel lPredicted := (lImgRA^[lInc-1]+lImgRA^[lInc-SOFxdim]) shr 1; lImgRA^[lInc] := lPredicted+DecodePixelDifference(1); end; //for lIncX end else begin //SOSss 1,2,3 read single values for lIncX := 2 to SOFxdim do begin lPredicted := lImgRA^[lInc-lPredA]; inc(lInc); //writenext voxel lImgRA^[lInc] := lPredicted+DecodePixelDifference(1); end; //for lIncX end; //SOSss predictor end; //for lIncY end {RestartSegmentSz = 0} else begin {restartsegment} if SOSss > 3 then msg('Unusual 16-bit lossless JPEG with restart segments. Please contact the author:'+inttostr(SOSss)); lSegmentEnd := lRestartSegmentSz; repeat if lSegmentEnd > lItems then lSegmentEnd := lItems; lLineStart := (((lInc div SOFxDim)+1)* SOFxDim){-1}; if lInc > (SOFxDim+1) then lPredicted := 1 shl (SOFPrecision-1-SOSpttrans) else lPredicted := lImgRA^[lInc-SOFxdim]; for lInc := lInc to (lSegmentEnd-1) do begin lImgRA^[lInc] := lPredicted+DecodePixelDifference(1); if lInc+1 = lLineStart then begin//newline lPredicted := lImgRA^[lInc+1-SOFxdim]; lLineStart := lLineStart + SOFxDim; end else lPredicted := lImgRA^[lInc-lPredA]; end; if (lSegmentEnd+1) < lItems then begin dec(lRawPos); repeat while (lRawRA^[lRawPos] <> 255) do inc(lRawPos); inc(lRawPos); until (lRawRA^[lRawPos] >= $D0) and (lRawRA^[lRawPos] <= $D7); lCurrentBitPos := 0; //read in a new byte inc(lRawPos);//abbax end; lSegmentEnd := lSegmentEnd + lRestartSegmentSz; until (lRestartSegmentSz < 1) or ((lSegmentEnd-2) > lItems); end; //restartsegments end else if SOFnf = 3 then begin //>8bit data; 8 bit follows //LOSSLESS JPEG: 7 possible predictors - we will handle all of them lPredB:= 0; lPredC := 0; case SOSss of //predictors 1,2,3 examine single previous pixel, here we set the relative location 2: lPredA:= SOFxDim-3; //Rb directly above 3: lPredA:= SOFxDim; //Rc UpperLeft:above and to the left 5: begin lPredA := 0; lPredB := SOFxDim-3; //Rb directly above lPredC:= SOFxDim; //Rc UpperLeft:above and to the left end; 6: begin lPredB := 0; lPredA := SOFxDim-3; //Rb directly above lPredC:= SOFxDim; //Rc UpperLeft:above and to the left end; else lPredA := 0; //Ra: directly to left end; //case SOSss: predictor offset lPredictedG := lPredicted; lPredictedB := lPredicted; lOffset := 0; lInc := lOffset; for lIncX := 1 to (SOFxdim div 3) do begin //write first line //DecodePixelDifference=RED lImgRAz^[lInc] := lPredicted+DecodePixelDifference(1); lPredicted := lImgRAz^[lInc]; inc(lInc); //writenext voxel //DecodePixelDifference=GREEN lImgRAz^[lInc] := lPredictedG+DecodePixelDifference(2); lPredictedG := lImgRAz^[lInc]; inc(lInc); //writenext voxel //DecodePixelDifference=BLUE lImgRAz^[lInc] := lPredictedB+DecodePixelDifference(3); lPredictedB := lImgRAz^[lInc]; inc(lInc); //writenext voxel end; //first line: use prev voxel prediction; if lRestartSegmentSz = 0 then lSegmentEnd := lItems else lSegmentEnd := lRestartSegmentSz; repeat if lSegmentEnd > lItems then lSegmentEnd := lItems; lLineStart := (((lInc div SOFxDim)+1)* SOFxDim)+lOffset{-1}; if lInc > (SOFxDim+1) then begin lPredicted := 1 shl (SOFPrecision-1-SOSpttrans); lPredictedG := lPredicted; lPredictedB := lPredicted; end else begin lPredicted := lImgRAz^[lInc-SOFxdim+lOffset]; lPredictedG := lImgRAz^[1+lInc-SOFxdim+lOffset]; lPredictedB := lImgRAz^[2+lInc-SOFxdim+lOffset]; end; if SOSss = 4 then begin //predictor = 4 //this is a 24-bit image, so for 512-pixel wid image, SOFxdim will be (3*512=) 1536 while lInc < (lSegmentEnd-1) do begin lImgRAz^[lInc] := lPredicted+DecodePixelDifference(1); //RED inc(lInc); lImgRAz^[lInc] := lPredictedG+DecodePixelDifference(2); //GREEN inc(lInc); lImgRAz^[lInc] := lPredictedB+DecodePixelDifference(3); //BLUE inc(lInc); if lInc = lLineStart then begin//newline lPredicted := lImgRAz^[lInc-SOFxdim]; lPredictedG := lImgRAz^[lInc-SOFxdim+1]; lPredictedB := lImgRAz^[lInc-SOFxdim+2]; lLineStart := lLineStart + (SOFxDim); end else begin lPredicted := lImgRAz^[lInc-3]+lImgRAz^[lInc-3-(SOFxDim-3)]-lImgRAz^[lInc-3-SOFxDim]; lPredictedG := lImgRAz^[lInc-2]+lImgRAz^[lInc-2-(SOFxDim-3)]-lImgRAz^[lInc-2-SOFxDim]; lPredictedB := lImgRAz^[lInc-1]+lImgRAz^[lInc-1-(SOFxDim-3)]-lImgRAz^[lInc-1-SOFxDim]; end; end; //xxx end else if (SOSss = 5) or (SOSss = 6) then begin //predictor = 5 or 6 //this is a 24-bit image, so for 512-pixel wid image, SOFxdim will be (3*512=) 1536 while lInc < (lSegmentEnd-1) do begin lImgRAz^[lInc] := lPredicted+DecodePixelDifference(1); //RED inc(lInc); lImgRAz^[lInc] := lPredictedG+DecodePixelDifference(2); //GREEN inc(lInc); lImgRAz^[lInc] := lPredictedB+DecodePixelDifference(3); //BLUE inc(lInc); if lInc = lLineStart then begin//newline lPredicted := lImgRAz^[lInc-SOFxdim]; lPredictedG := lImgRAz^[lInc-SOFxdim+1]; lPredictedB := lImgRAz^[lInc-SOFxdim+2]; lLineStart := lLineStart + (SOFxDim); end else begin lPredicted := lImgRAz^[lInc-3-lPredA]+((lImgRAz^[lInc-3-lPredB]-lImgRAz^[lInc-3-lPredC])shr 1); lPredictedG := lImgRAz^[lInc-2-lPredA]+((lImgRAz^[lInc-2-lPredB]-lImgRAz^[lInc-2-lPredC])shr 1); lPredictedB := lImgRAz^[lInc-1-lPredA]+((lImgRAz^[lInc-1-lPredB]-lImgRAz^[lInc-1-lPredC])shr 1); end; end; end else if SOSss = 7 then begin //predictor = 7 while lInc < (lSegmentEnd-1) do begin lImgRAz^[lInc] := lPredicted+DecodePixelDifference(1); //RED inc(lInc); lImgRAz^[lInc] := lPredictedG+DecodePixelDifference(2); //GREEN inc(lInc); lImgRAz^[lInc] := lPredictedB+DecodePixelDifference(3); //BLUE inc(lInc); if lInc = lLineStart then begin//newline lPredicted := lImgRAz^[lInc-SOFxdim]; lPredictedG := lImgRAz^[lInc-SOFxdim+1]; lPredictedB := lImgRAz^[lInc-SOFxdim+2]; lLineStart := lLineStart + (SOFxDim); end else begin lPredicted := (lImgRAz^[lInc-3]+lImgRAz^[lInc-3-(SOFxDim-3)])shr 1; lPredictedG := (lImgRAz^[lInc-2]+lImgRAz^[lInc-2-(SOFxDim-3)]) shr 1; lPredictedB := (lImgRAz^[lInc-1]+lImgRAz^[lInc-1-(SOFxDim-3)]) shr 1; end; end; end else begin //predictor in range 1,2,3 //this is a 24-bit image, so for 512-pixel wid image, SOFxdim will be (3*512=) 1536 while lInc < (lSegmentEnd-1) do begin lImgRAz^[lInc] := lPredicted+DecodePixelDifference(1); //RED inc(lInc); lImgRAz^[lInc] := lPredictedG+DecodePixelDifference(2); //GREEN inc(lInc); lImgRAz^[lInc] := lPredictedB+DecodePixelDifference(3); //BLUE inc(lInc); if lInc = lLineStart then begin//newline lPredicted := lImgRAz^[lInc-SOFxdim]; lPredictedG := lImgRAz^[lInc-SOFxdim+1]; lPredictedB := lImgRAz^[lInc-SOFxdim+2]; lLineStart := lLineStart + (SOFxDim); end else begin lPredicted := lImgRAz^[lInc-3-lPredA]; lPredictedG := lImgRAz^[lInc-2-lPredA]; lPredictedB := lImgRAz^[lInc-1-lPredA]; end; end; end; //predictor <> 7 until (lRestartSegmentSz < 1) or ((lSegmentEnd-2) > lItems); // end; //8<>15data type end else begin //previously 12/16/24bit data, 8 bit follows lInc := 0; //LOSSLESS JPEG: 7 possible predictors - we will handle all of them lPredB:= 0; lPredC := 0; case SOSss of //predictors 1,2,3 examine single previous pixel, here we set the relative location 2: lPredA:= SOFxDim-1; //Rb directly above 3: lPredA:= SOFxDim; //Rc UpperLeft:above and to the left 5: begin lPredA := 0; lPredB := SOFxDim-1; //Rb directly above lPredC:= SOFxDim; //Rc UpperLeft:above and to the left end; 6: begin lPredB := 0; lPredA := SOFxDim-1; //Rb directly above lPredC:= SOFxDim; //Rc UpperLeft:above and to the left end; else lPredA := 0; //Ra: directly to left end; //case SOSss: predictor offset //lOffset := -1; for lIncX := 1 to SOFxdim do begin //write first line lImgRAz^[lInc] := lPredicted+DecodePixelDifference(1); inc(lInc); //writenext voxel lPredicted := lImgRAz^[lInc-1]; end; //first line: use prev voxel prediction; if lRestartSegmentSz = 0 then lSegmentEnd := lItems else lSegmentEnd := lRestartSegmentSz; repeat if lSegmentEnd > lItems then lSegmentEnd := lItems; lLineStart := (((lInc div SOFxDim)+1)* SOFxDim){-1}; if lInc > (SOFxDim+1) then lPredicted := 1 shl (SOFPrecision-1-SOSpttrans) else lPredicted := lImgRAz^[lInc-SOFxdim]; if SOSss = 4 then begin //predictor 4 : ABOVE+LEFT-(UPPERLEFT) for lInc := lInc to (lSegmentEnd-1) do begin lImgRAz^[lInc] := lPredicted+DecodePixelDifference(1); if lInc+1 = lLineStart then begin//newline lPredicted := lImgRAz^[lInc+1-SOFxdim]; lLineStart := lLineStart + SOFxDim; end else lPredicted := lImgRAz^[lInc]+lImgRAz^[lInc-(SOFxDim-1)] -lImgRAz^[lInc-SOFxDim] ; end; end else if (SOSss = 5) or (SOSss=6) then begin //predictor 5,6 : comparisons for lInc := lInc to (lSegmentEnd-1) do begin lImgRAz^[lInc] := lPredicted+DecodePixelDifference(1); if lInc+1 = lLineStart then begin//newline lPredicted := lImgRAz^[lInc+1-SOFxdim]; lLineStart := lLineStart + SOFxDim; end else lPredicted := lImgRAz^[lInc-lPredA]+((lImgRAz^[lInc-lPredB]-lImgRAz^[lInc-lPredC]) shr 1) ; end; end else if SOSss = 7 then begin //predictor 7: average above and left for lInc := lInc to (lSegmentEnd-1) do begin lImgRAz^[lInc] := lPredicted+DecodePixelDifference(1); if lInc+1 = lLineStart then begin//newline lPredicted := lImgRAz^[lInc+1-SOFxdim]; lLineStart := lLineStart + SOFxDim; end else lPredA := lImgRAz^[lInc]; lPredB:= lImgRAz^[lInc-SOFxDim+1];//correct lPredicted := (lPredA+lPredB) shr 1; end; end else begin //predictor <> 7 : assume SOSss=1: previous for lInc := lInc to (lSegmentEnd-1) do begin lImgRAz^[lInc] := lPredicted+DecodePixelDifference(1); if lInc+1 = lLineStart then begin//newline lPredicted := lImgRAz^[lInc+1-SOFxdim]; lLineStart := lLineStart + SOFxDim; end else lPredicted := lImgRAz^[lInc-lPredA]; end; end; //predictor <> 7 if (lSegmentEnd+1) < lItems then begin dec(lRawPos); {msg('x'+inttostr(lRawPos)+' '+inttostr(lRawRA^[lRawPos])+':'+ inttostr(lRawRA^[lRawPos+1])+':'+inttostr(lRawRA^[lRawPos+2])+':'+ inttostr(lRawRA^[lRawPos+3])+':');} repeat while (lRawRA^[lRawPos] <> 255) do inc(lRawPos); inc(lRawPos); //msg(inttostr(lRawRA^[lRawPos])); until (lRawRA^[lRawPos] >= $D0) and (lRawRA^[lRawPos] <= $D7); //lCurrentByteVal := 0; //not FF lCurrentBitPos := 0; //read in a new byte //msg('x'); inc(lRawPos);//abbax //lCurrentBitPos := 9; //read in a new byte end; lSegmentEnd := lSegmentEnd + lRestartSegmentSz; until (lRestartSegmentSz < 1) or ((lSegmentEnd-2) > lItems); end; //8<>15data type end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/LibTar.pas0000664000175000017500000010062011326434462021063 0ustar michaelmichael(*Name : LibTar =============================================================================================== Subject : Handling of "tar" files =============================================================================================== Author : Stefan Heymann Eschenweg 3 72076 Tќbingen GERMANY E-Mail: stefan@destructor.de Web: www.destructor.de =============================================================================================== TTarArchive Usage ----------------- - Choose a constructor - Make an instance of TTarArchive TA := TTarArchive.Create (Filename); - Scan through the archive TA.Reset; WHILE TA.FindNext (DirRec) DO BEGIN - Evaluate the DirRec for each file ListBox.Items.Add (DirRec.Name); - Read out the current file TA.ReadFile (DestFilename); (You can ommit this if you want to read in the directory only) END; - You're done TA.Free; TTarWriter Usage ---------------- - Choose a constructor - Make an instance of TTarWriter TW := TTarWriter.Create ('my.tar'); - Add a file to the tar archive TW.AddFile ('foobar.txt'); - Add a string as a file TW.AddString (SL.Text, 'joe.txt', Now); - Destroy TarWriter instance TW.Free; - Now your tar file is ready. Source, Legals ("Licence") -------------------------- The official site to get this code is http://www.destructor.de/ Usage and Distribution of this Source Code is ruled by the "Destructor.de Source code Licence" (DSL) which comes with this file or can be downloaded at http://www.destructor.de/ IN SHORT: Usage and distribution of this source code is free. You use it completely on your own risk. Donateware ---------- If you like this code, you are free to donate http://www.destructor.de/donateware.htm =============================================================================================== !!! All parts of this code which are not finished or known to be buggy are marked with three exclamation marks =============================================================================================== Date Author Changes ----------------------------------------------------------------------------------------------- 2001-04-26 HeySt 0.0.1 Start 2001-04-28 HeySt 1.0.0 First Release 2001-06-19 HeySt 2.0.0 Finished TTarWriter 2001-09-06 HeySt 2.0.1 Bugfix in TTarArchive.FindNext: FBytesToGo must sometimes be 0 2001-10-25 HeySt 2.0.2 Introduced the ClearDirRec procedure 2001-11-13 HeySt 2.0.3 Bugfix: Take out ClearDirRec call from WriteTarHeader Bug Reported by Tony BenBrahim 2001-12-25 HeySt 2.0.4 WriteTarHeader: Fill Rec with zero bytes before filling it 2002-05-18 HeySt 2.0.5 Kylix awareness: Thanks to Kerry L. Davison for the canges 2005-09-03 HeySt 2.0.6 TTarArchive.FindNext: Don't access SourceStream.Size (for compressed streams, which don't know their .Size) 2006-03-13 HeySt 2.0.7 Bugfix in ReadFile (Buffer : POINTER) 2007-05-16 HeySt 2.0.8 Bugfix in TTarWriter.AddFile (Convertfilename in the ELSE branch) Bug Reported by Chris Rorden *) UNIT LibTar; INTERFACE USES {$ifdef fpc} {$MODE Delphi} {$H+} {$endif} {$ifdef Unix} BaseUnix, Unix, {$else} Windows, {$endif} SysUtils, Classes; TYPE // --- File Access Permissions TTarPermission = (tpReadByOwner, tpWriteByOwner, tpExecuteByOwner, tpReadByGroup, tpWriteByGroup, tpExecuteByGroup, tpReadByOther, tpWriteByOther, tpExecuteByOther); TTarPermissions = SET OF TTarPermission; // --- Type of File TFileType = (ftNormal, // Regular file ftLink, // Link to another, previously archived, file (LinkName) ftSymbolicLink, // Symbolic link to another file (LinkName) ftCharacter, // Character special files ftBlock, // Block special files ftDirectory, // Directory entry. Size is zero (unlimited) or max. number of bytes ftFifo, // FIFO special file. No data stored in the archive. ftContiguous, // Contiguous file, if supported by OS ftDumpDir, // List of files ftMultiVolume, // Multi-volume file part ftVolumeHeader); // Volume header. Can appear only as first record in the archive // --- Mode TTarMode = (tmSetUid, tmSetGid, tmSaveText); TTarModes = SET OF TTarMode; // --- Record for a Directory Entry // Adjust the ClearDirRec procedure when this record changes! TTarDirRec = RECORD Name : STRING; // File path and name Size : INT64; // File size in Bytes DateTime : TDateTime; // Last modification date and time Permissions : TTarPermissions; // Access permissions FileType : TFileType; // Type of file LinkName : STRING; // Name of linked file (for ftLink, ftSymbolicLink) UID : INTEGER; // User ID GID : INTEGER; // Group ID UserName : STRING; // User name GroupName : STRING; // Group name ChecksumOK : BOOLEAN; // Checksum was OK Mode : TTarModes; // Mode Magic : STRING; // Contents of the "Magic" field MajorDevNo : INTEGER; // Major Device No. for ftCharacter and ftBlock MinorDevNo : INTEGER; // Minor Device No. for ftCharacter and ftBlock FilePos : INT64; // Position in TAR file END; // --- The TAR Archive CLASS TTarArchive = CLASS PROTECTED FStream : TStream; // Internal Stream FOwnsStream : BOOLEAN; // True if FStream is owned by the TTarArchive instance FBytesToGo : INT64; // Bytes until the next Header Record PUBLIC CONSTRUCTOR Create (Stream : TStream); OVERLOAD; CONSTRUCTOR Create (Filename : STRING; FileMode : WORD = fmOpenRead OR fmShareDenyWrite); OVERLOAD; DESTRUCTOR Destroy; OVERRIDE; PROCEDURE Reset; // Reset File Pointer FUNCTION FindNext (VAR DirRec : TTarDirRec) : BOOLEAN; // Reads next Directory Info Record. FALSE if EOF reached PROCEDURE ReadFile (Buffer : POINTER); OVERLOAD; // Reads file data for last Directory Record PROCEDURE ReadFile (Stream : TStream); OVERLOAD; // -;- PROCEDURE ReadFile (Filename : STRING); OVERLOAD; // -;- FUNCTION ReadFile : STRING; OVERLOAD; // -;- PROCEDURE GetFilePos (VAR Current, Size : INT64); // Current File Position PROCEDURE SetFilePos (NewPos : INT64); // Set new Current File Position END; // --- The TAR Archive Writer CLASS TTarWriter = CLASS PROTECTED FStream : TStream; FOwnsStream : BOOLEAN; FFinalized : BOOLEAN; // --- Used at the next "Add" method call: --- FPermissions : TTarPermissions; // Access permissions FUID : INTEGER; // User ID FGID : INTEGER; // Group ID FUserName : STRING; // User name FGroupName : STRING; // Group name FMode : TTarModes; // Mode FMagic : STRING; // Contents of the "Magic" field CONSTRUCTOR CreateEmpty; PUBLIC CONSTRUCTOR Create (TargetStream : TStream); OVERLOAD; CONSTRUCTOR Create (TargetFilename : STRING; Mode : INTEGER = fmCreate); OVERLOAD; DESTRUCTOR Destroy; OVERRIDE; // Writes End-Of-File Tag PROCEDURE AddFile (Filename : STRING; TarFilename : STRING = ''); PROCEDURE AddStream (Stream : TStream; TarFilename : STRING; FileDateGmt : TDateTime); PROCEDURE AddString (Contents : STRING; TarFilename : STRING; FileDateGmt : TDateTime); PROCEDURE AddDir (Dirname : STRING; DateGmt : TDateTime; MaxDirSize : INT64 = 0); PROCEDURE AddSymbolicLink (Filename, Linkname : STRING; DateGmt : TDateTime); PROCEDURE AddLink (Filename, Linkname : STRING; DateGmt : TDateTime); PROCEDURE AddVolumeHeader (VolumeId : STRING; DateGmt : TDateTime); PROCEDURE Finalize; PROPERTY Permissions : TTarPermissions READ FPermissions WRITE FPermissions; // Access permissions PROPERTY UID : INTEGER READ FUID WRITE FUID; // User ID PROPERTY GID : INTEGER READ FGID WRITE FGID; // Group ID PROPERTY UserName : STRING READ FUserName WRITE FUserName; // User name PROPERTY GroupName : STRING READ FGroupName WRITE FGroupName; // Group name PROPERTY Mode : TTarModes READ FMode WRITE FMode; // Mode PROPERTY Magic : STRING READ FMagic WRITE FMagic; // Contents of the "Magic" field END; // --- Some useful constants CONST FILETYPE_NAME : ARRAY [TFileType] OF STRING = ('Regular', 'Link', 'Symbolic Link', 'Char File', 'Block File', 'Directory', 'FIFO File', 'Contiguous', 'Dir Dump', 'Multivol', 'Volume Header'); ALL_PERMISSIONS = [tpReadByOwner, tpWriteByOwner, tpExecuteByOwner, tpReadByGroup, tpWriteByGroup, tpExecuteByGroup, tpReadByOther, tpWriteByOther, tpExecuteByOther]; READ_PERMISSIONS = [tpReadByOwner, tpReadByGroup, tpReadByOther]; WRITE_PERMISSIONS = [tpWriteByOwner, tpWriteByGroup, tpWriteByOther]; EXECUTE_PERMISSIONS = [tpExecuteByOwner, tpExecuteByGroup, tpExecuteByOther]; FUNCTION PermissionString (Permissions : TTarPermissions) : STRING; FUNCTION ConvertFilename (Filename : STRING) : STRING; FUNCTION FileTimeGMT (FileName : STRING) : TDateTime; OVERLOAD; FUNCTION FileTimeGMT (SearchRec : TSearchRec) : TDateTime; OVERLOAD; PROCEDURE ClearDirRec (VAR DirRec : TTarDirRec); IMPLEMENTATION FUNCTION PermissionString (Permissions : TTarPermissions) : STRING; BEGIN Result := ''; IF tpReadByOwner IN Permissions THEN Result := Result + 'r' ELSE Result := Result + '-'; IF tpWriteByOwner IN Permissions THEN Result := Result + 'w' ELSE Result := Result + '-'; IF tpExecuteByOwner IN Permissions THEN Result := Result + 'x' ELSE Result := Result + '-'; IF tpReadByGroup IN Permissions THEN Result := Result + 'r' ELSE Result := Result + '-'; IF tpWriteByGroup IN Permissions THEN Result := Result + 'w' ELSE Result := Result + '-'; IF tpExecuteByGroup IN Permissions THEN Result := Result + 'x' ELSE Result := Result + '-'; IF tpReadByOther IN Permissions THEN Result := Result + 'r' ELSE Result := Result + '-'; IF tpWriteByOther IN Permissions THEN Result := Result + 'w' ELSE Result := Result + '-'; IF tpExecuteByOther IN Permissions THEN Result := Result + 'x' ELSE Result := Result + '-'; END; FUNCTION ConvertFilename (Filename : STRING) : STRING; // Converts the filename to Unix conventions BEGIN {$IFDEF LINUX} Result := Filename; {$ELSE} Result := StringReplace (Filename, '\', '/', [rfReplaceAll]); {$ENDIF} END; FUNCTION FileTimeGMT (FileName: STRING): TDateTime; // Returns the Date and Time of the last modification of the given File // The Result is zero if the file could not be found // The Result is given in UTC (GMT) time zone VAR SR : TSearchRec; BEGIN Result := 0.0; IF FindFirst (FileName, faAnyFile, SR) = 0 THEN Result := FileTimeGMT (SR); FindClose (SR); END; FUNCTION FileTimeGMT (SearchRec : TSearchRec) : TDateTime; {$IFNDEF UNIX} VAR SystemFileTime: TSystemTime; {$ELSE} VAR TimeVal : TTimeVal; TimeZone : TTimeZone; {$ENDIF} BEGIN Result := 0.0; {$IFNDEF UNIX} {$WARNINGS OFF} IF (SearchRec.FindData.dwFileAttributes AND faDirectory) = 0 THEN IF FileTimeToSystemTime (SearchRec.FindData.ftLastWriteTime, SystemFileTime) THEN Result := EncodeDate (SystemFileTime.wYear, SystemFileTime.wMonth, SystemFileTime.wDay) + EncodeTime (SystemFileTime.wHour, SystemFileTime.wMinute, SystemFileTime.wSecond, SystemFileTime.wMilliseconds); {$WARNINGS ON} {$ELSE} IF SearchRec.Attr AND faDirectory = 0 THEN BEGIN Result := FileDateToDateTime (SearchRec.Time); fpGetTimeOfDay (@TimeVal, @TimeZone); Result := Result + TimeZone.tz_minuteswest / (60 * 24); END; {$ENDIF} end; PROCEDURE ClearDirRec (VAR DirRec : TTarDirRec); // This is included because a FillChar (DirRec, SizeOf (DirRec), 0) // will destroy the long string pointers, leading to strange bugs BEGIN WITH DirRec DO BEGIN Name := ''; Size := 0; DateTime := 0.0; Permissions := []; FileType := TFileType (0); LinkName := ''; UID := 0; GID := 0; UserName := ''; GroupName := ''; ChecksumOK := FALSE; Mode := []; Magic := ''; MajorDevNo := 0; MinorDevNo := 0; FilePos := 0; END; END; CONST RECORDSIZE = 512; NAMSIZ = 100; TUNMLEN = 32; TGNMLEN = 32; CHKBLANKS = #32#32#32#32#32#32#32#32; TYPE TTarHeader = PACKED RECORD Name : ARRAY [0..NAMSIZ-1] OF CHAR; Mode : ARRAY [0..7] OF CHAR; UID : ARRAY [0..7] OF CHAR; GID : ARRAY [0..7] OF CHAR; Size : ARRAY [0..11] OF CHAR; MTime : ARRAY [0..11] OF CHAR; ChkSum : ARRAY [0..7] OF CHAR; LinkFlag : CHAR; LinkName : ARRAY [0..NAMSIZ-1] OF CHAR; Magic : ARRAY [0..7] OF CHAR; UName : ARRAY [0..TUNMLEN-1] OF CHAR; GName : ARRAY [0..TGNMLEN-1] OF CHAR; DevMajor : ARRAY [0..7] OF CHAR; DevMinor : ARRAY [0..7] OF CHAR; END; FUNCTION ExtractText (P : PChar) : STRING; BEGIN Result := STRING (P); END; FUNCTION ExtractNumber (P : PChar) : INTEGER; OVERLOAD; VAR Strg : STRING; BEGIN Strg := Trim (StrPas (P)); P := PChar (Strg); Result := 0; WHILE (P^ <> #32) AND (P^ <> #0) DO BEGIN Result := (ORD (P^) - ORD ('0')) OR (Result SHL 3); INC (P); END; END; FUNCTION ExtractNumber64 (P : PChar) : INT64; OVERLOAD; VAR Strg : STRING; BEGIN Strg := Trim (StrPas (P)); P := PChar (Strg); Result := 0; WHILE (P^ <> #32) AND (P^ <> #0) DO BEGIN Result := (ORD (P^) - ORD ('0')) OR (Result SHL 3); INC (P); END; END; FUNCTION ExtractNumber (P : PChar; MaxLen : INTEGER) : INTEGER; OVERLOAD; VAR S0 : ARRAY [0..255] OF CHAR; Strg : STRING; BEGIN StrLCopy (S0, P, MaxLen); Strg := Trim (StrPas (S0)); P := PChar (Strg); Result := 0; WHILE (P^ <> #32) AND (P^ <> #0) DO BEGIN Result := (ORD (P^) - ORD ('0')) OR (Result SHL 3); INC (P); END; END; FUNCTION ExtractNumber64 (P : PChar; MaxLen : INTEGER) : INT64; OVERLOAD; VAR S0 : ARRAY [0..255] OF CHAR; Strg : STRING; BEGIN StrLCopy (S0, P, MaxLen); Strg := Trim (StrPas (S0)); P := PChar (Strg); Result := 0; WHILE (P^ <> #32) AND (P^ <> #0) DO BEGIN Result := (ORD (P^) - ORD ('0')) OR (Result SHL 3); INC (P); END; END; FUNCTION Records (Bytes : INT64) : INT64; BEGIN Result := Bytes DIV RECORDSIZE; IF Bytes MOD RECORDSIZE > 0 THEN INC (Result); END; PROCEDURE Octal (N : INTEGER; P : PChar; Len : INTEGER); // Makes a string of octal digits // The string will always be "Len" characters long VAR I : INTEGER; BEGIN FOR I := Len-2 DOWNTO 0 DO BEGIN (P+I)^ := CHR (ORD ('0') + ORD (N AND $07)); N := N SHR 3; END; FOR I := 0 TO Len-3 DO IF (P+I)^ = '0' THEN (P+I)^ := #32 ELSE BREAK; (P+Len-1)^ := #32; END; PROCEDURE Octal64 (N : INT64; P : PChar; Len : INTEGER); // Makes a string of octal digits // The string will always be "Len" characters long VAR I : INTEGER; BEGIN FOR I := Len-2 DOWNTO 0 DO BEGIN (P+I)^ := CHR (ORD ('0') + ORD (N AND $07)); N := N SHR 3; END; FOR I := 0 TO Len-3 DO IF (P+I)^ = '0' THEN (P+I)^ := #32 ELSE BREAK; (P+Len-1)^ := #32; END; PROCEDURE OctalN (N : INTEGER; P : PChar; Len : INTEGER); BEGIN Octal (N, P, Len-1); (P+Len-1)^ := #0; END; PROCEDURE WriteTarHeader (Dest : TStream; DirRec : TTarDirRec); VAR Rec : ARRAY [0..RECORDSIZE-1] OF CHAR; TH : TTarHeader ABSOLUTE Rec; Mode : INTEGER; NullDate : TDateTime; Checksum : CARDINAL; I : INTEGER; BEGIN FillChar (Rec, RECORDSIZE, 0); StrLCopy (TH.Name, PChar (DirRec.Name), NAMSIZ); Mode := 0; IF tmSaveText IN DirRec.Mode THEN Mode := Mode OR $0200; IF tmSetGid IN DirRec.Mode THEN Mode := Mode OR $0400; IF tmSetUid IN DirRec.Mode THEN Mode := Mode OR $0800; IF tpReadByOwner IN DirRec.Permissions THEN Mode := Mode OR $0100; IF tpWriteByOwner IN DirRec.Permissions THEN Mode := Mode OR $0080; IF tpExecuteByOwner IN DirRec.Permissions THEN Mode := Mode OR $0040; IF tpReadByGroup IN DirRec.Permissions THEN Mode := Mode OR $0020; IF tpWriteByGroup IN DirRec.Permissions THEN Mode := Mode OR $0010; IF tpExecuteByGroup IN DirRec.Permissions THEN Mode := Mode OR $0008; IF tpReadByOther IN DirRec.Permissions THEN Mode := Mode OR $0004; IF tpWriteByOther IN DirRec.Permissions THEN Mode := Mode OR $0002; IF tpExecuteByOther IN DirRec.Permissions THEN Mode := Mode OR $0001; OctalN (Mode, @TH.Mode, 8); OctalN (DirRec.UID, @TH.UID, 8); OctalN (DirRec.GID, @TH.GID, 8); Octal64 (DirRec.Size, @TH.Size, 12); NullDate := EncodeDate (1970, 1, 1); IF DirRec.DateTime >= NullDate THEN Octal (Trunc ((DirRec.DateTime - NullDate) * 86400.0), @TH.MTime, 12) ELSE Octal (Trunc ( NullDate * 86400.0), @TH.MTime, 12); CASE DirRec.FileType OF ftNormal : TH.LinkFlag := '0'; ftLink : TH.LinkFlag := '1'; ftSymbolicLink : TH.LinkFlag := '2'; ftCharacter : TH.LinkFlag := '3'; ftBlock : TH.LinkFlag := '4'; ftDirectory : TH.LinkFlag := '5'; ftFifo : TH.LinkFlag := '6'; ftContiguous : TH.LinkFlag := '7'; ftDumpDir : TH.LinkFlag := 'D'; ftMultiVolume : TH.LinkFlag := 'M'; ftVolumeHeader : TH.LinkFlag := 'V'; END; StrLCopy (TH.LinkName, PChar (DirRec.LinkName), NAMSIZ); StrLCopy (TH.Magic, PChar (DirRec.Magic + #32#32#32#32#32#32#32#32), 8); StrLCopy (TH.UName, PChar (DirRec.UserName), TUNMLEN); StrLCopy (TH.GName, PChar (DirRec.GroupName), TGNMLEN); OctalN (DirRec.MajorDevNo, @TH.DevMajor, 8); OctalN (DirRec.MinorDevNo, @TH.DevMinor, 8); StrMove (TH.ChkSum, CHKBLANKS, 8); CheckSum := 0; FOR I := 0 TO SizeOf (TTarHeader)-1 DO INC (CheckSum, INTEGER (ORD (Rec [I]))); OctalN (CheckSum, @TH.ChkSum, 8); Dest.Write (TH, RECORDSIZE); END; CONSTRUCTOR TTarArchive.Create (Stream : TStream); BEGIN INHERITED Create; FStream := Stream; FOwnsStream := FALSE; Reset; END; CONSTRUCTOR TTarArchive.Create (Filename : STRING; FileMode : WORD); BEGIN INHERITED Create; FStream := TFileStream.Create (Filename, FileMode); FOwnsStream := TRUE; Reset; END; DESTRUCTOR TTarArchive.Destroy; BEGIN IF FOwnsStream THEN FStream.Free; INHERITED Destroy; END; PROCEDURE TTarArchive.Reset; // Reset File Pointer BEGIN FStream.Position := 0; FBytesToGo := 0; END; FUNCTION TTarArchive.FindNext (VAR DirRec : TTarDirRec) : BOOLEAN; // Reads next Directory Info Record // The Stream pointer must point to the first byte of the tar header VAR Rec : ARRAY [0..RECORDSIZE-1] OF CHAR; CurFilePos : INTEGER; Header : TTarHeader ABSOLUTE Rec; I : INTEGER; HeaderChkSum : WORD; Checksum : CARDINAL; BEGIN // --- Scan until next pointer IF FBytesToGo > 0 THEN FStream.Seek (Records (FBytesToGo) * RECORDSIZE, soFromCurrent); // --- EOF reached? Result := FALSE; CurFilePos := FStream.Position; TRY FStream.ReadBuffer (Rec, RECORDSIZE); if Rec [0] = #0 THEN EXIT; // EOF reached EXCEPT EXIT; // EOF reached, too END; Result := TRUE; ClearDirRec (DirRec); DirRec.FilePos := CurFilePos; DirRec.Name := ExtractText (Header.Name); DirRec.Size := ExtractNumber64 (@Header.Size, 12); DirRec.DateTime := EncodeDate (1970, 1, 1) + (ExtractNumber (@Header.MTime, 12) / 86400.0); I := ExtractNumber (@Header.Mode); IF I AND $0100 <> 0 THEN Include (DirRec.Permissions, tpReadByOwner); IF I AND $0080 <> 0 THEN Include (DirRec.Permissions, tpWriteByOwner); IF I AND $0040 <> 0 THEN Include (DirRec.Permissions, tpExecuteByOwner); IF I AND $0020 <> 0 THEN Include (DirRec.Permissions, tpReadByGroup); IF I AND $0010 <> 0 THEN Include (DirRec.Permissions, tpWriteByGroup); IF I AND $0008 <> 0 THEN Include (DirRec.Permissions, tpExecuteByGroup); IF I AND $0004 <> 0 THEN Include (DirRec.Permissions, tpReadByOther); IF I AND $0002 <> 0 THEN Include (DirRec.Permissions, tpWriteByOther); IF I AND $0001 <> 0 THEN Include (DirRec.Permissions, tpExecuteByOther); IF I AND $0200 <> 0 THEN Include (DirRec.Mode, tmSaveText); IF I AND $0400 <> 0 THEN Include (DirRec.Mode, tmSetGid); IF I AND $0800 <> 0 THEN Include (DirRec.Mode, tmSetUid); CASE Header.LinkFlag OF #0, '0' : DirRec.FileType := ftNormal; '1' : DirRec.FileType := ftLink; '2' : DirRec.FileType := ftSymbolicLink; '3' : DirRec.FileType := ftCharacter; '4' : DirRec.FileType := ftBlock; '5' : DirRec.FileType := ftDirectory; '6' : DirRec.FileType := ftFifo; '7' : DirRec.FileType := ftContiguous; 'D' : DirRec.FileType := ftDumpDir; 'M' : DirRec.FileType := ftMultiVolume; 'V' : DirRec.FileType := ftVolumeHeader; END; DirRec.LinkName := ExtractText (Header.LinkName); DirRec.UID := ExtractNumber (@Header.UID); DirRec.GID := ExtractNumber (@Header.GID); DirRec.UserName := ExtractText (Header.UName); DirRec.GroupName := ExtractText (Header.GName); DirRec.Magic := Trim (ExtractText (Header.Magic)); DirRec.MajorDevNo := ExtractNumber (@Header.DevMajor); DirRec.MinorDevNo := ExtractNumber (@Header.DevMinor); HeaderChkSum := ExtractNumber (@Header.ChkSum); // Calc Checksum CheckSum := 0; StrMove (Header.ChkSum, CHKBLANKS, 8); FOR I := 0 TO SizeOf (TTarHeader)-1 DO INC (CheckSum, INTEGER (ORD (Rec [I]))); DirRec.CheckSumOK := WORD (CheckSum) = WORD (HeaderChkSum); IF DirRec.FileType in [ftLink, ftSymbolicLink, ftDirectory, ftFifo, ftVolumeHeader] THEN FBytesToGo := 0 ELSE FBytesToGo := DirRec.Size; END; PROCEDURE TTarArchive.ReadFile (Buffer : POINTER); // Reads file data for the last Directory Record. The entire file is read into the buffer. // The buffer must be large enough to take up the whole file. VAR RestBytes : INTEGER; BEGIN IF FBytesToGo = 0 THEN EXIT; RestBytes := Records (FBytesToGo) * RECORDSIZE - FBytesToGo; FStream.ReadBuffer (Buffer^, FBytesToGo); FStream.Seek (RestBytes, soFromCurrent); FBytesToGo := 0; END; PROCEDURE TTarArchive.ReadFile (Stream : TStream); // Reads file data for the last Directory Record. // The entire file is written out to the stream. // The stream is left at its current position prior to writing VAR RestBytes : INTEGER; BEGIN IF FBytesToGo = 0 THEN EXIT; RestBytes := Records (FBytesToGo) * RECORDSIZE - FBytesToGo; Stream.CopyFrom (FStream, FBytesToGo); FStream.Seek (RestBytes, soFromCurrent); FBytesToGo := 0; END; PROCEDURE TTarArchive.ReadFile (Filename : STRING); // Reads file data for the last Directory Record. // The entire file is saved in the given Filename VAR FS : TFileStream; BEGIN FS := TFileStream.Create (Filename, fmCreate); TRY ReadFile (FS); FINALLY FS.Free; END; END; FUNCTION TTarArchive.ReadFile : STRING; // Reads file data for the last Directory Record. The entire file is returned // as a large ANSI string. VAR RestBytes : INTEGER; BEGIN IF FBytesToGo = 0 THEN EXIT; RestBytes := Records (FBytesToGo) * RECORDSIZE - FBytesToGo; SetLength (Result, FBytesToGo); FStream.ReadBuffer (PChar (Result)^, FBytesToGo); FStream.Seek (RestBytes, soFromCurrent); FBytesToGo := 0; END; PROCEDURE TTarArchive.GetFilePos (VAR Current, Size : INT64); // Returns the Current Position in the TAR stream BEGIN Current := FStream.Position; Size := FStream.Size; END; PROCEDURE TTarArchive.SetFilePos (NewPos : INT64); // Set new Current File Position BEGIN IF NewPos < FStream.Size THEN FStream.Seek (NewPos, soFromBeginning); END; CONSTRUCTOR TTarWriter.CreateEmpty; VAR TP : TTarPermission; BEGIN INHERITED Create; FOwnsStream := FALSE; FFinalized := FALSE; FPermissions := []; FOR TP := Low (TP) TO High (TP) DO Include (FPermissions, TP); FUID := 0; FGID := 0; FUserName := ''; FGroupName := ''; FMode := []; FMagic := 'ustar'; END; CONSTRUCTOR TTarWriter.Create (TargetStream : TStream); BEGIN CreateEmpty; FStream := TargetStream; FOwnsStream := FALSE; END; CONSTRUCTOR TTarWriter.Create (TargetFilename : STRING; Mode : INTEGER = fmCreate); BEGIN CreateEmpty; FStream := TFileStream.Create (TargetFilename, Mode); FOwnsStream := TRUE; END; DESTRUCTOR TTarWriter.Destroy; BEGIN IF NOT FFinalized THEN BEGIN Finalize; FFinalized := TRUE; END; IF FOwnsStream THEN FStream.Free; INHERITED Destroy; END; PROCEDURE TTarWriter.AddFile (Filename : STRING; TarFilename : STRING = ''); VAR S : TFileStream; Date : TDateTime; BEGIN Date := FileTimeGMT (Filename); IF TarFilename = '' THEN TarFilename := ConvertFilename (Filename) ELSE TarFilename := ConvertFilename (TarFilename); S := TFileStream.Create (Filename, fmOpenRead OR fmShareDenyWrite); TRY AddStream (S, TarFilename, Date); FINALLY S.Free END; END; PROCEDURE TTarWriter.AddStream (Stream : TStream; TarFilename : STRING; FileDateGmt : TDateTime); VAR DirRec : TTarDirRec; Rec : ARRAY [0..RECORDSIZE-1] OF CHAR; BytesToRead : INT64; // Bytes to read from the Source Stream BlockSize : INT64; // Bytes to write out for the current record BEGIN ClearDirRec (DirRec); DirRec.Name := TarFilename; DirRec.Size := Stream.Size - Stream.Position; DirRec.DateTime := FileDateGmt; DirRec.Permissions := FPermissions; DirRec.FileType := ftNormal; DirRec.LinkName := ''; DirRec.UID := FUID; DirRec.GID := FGID; DirRec.UserName := FUserName; DirRec.GroupName := FGroupName; DirRec.ChecksumOK := TRUE; DirRec.Mode := FMode; DirRec.Magic := FMagic; DirRec.MajorDevNo := 0; DirRec.MinorDevNo := 0; WriteTarHeader (FStream, DirRec); BytesToRead := DirRec.Size; WHILE BytesToRead > 0 DO BEGIN BlockSize := BytesToRead; IF BlockSize > RECORDSIZE THEN BlockSize := RECORDSIZE; FillChar (Rec, RECORDSIZE, 0); Stream.Read (Rec, BlockSize); FStream.Write (Rec, RECORDSIZE); DEC (BytesToRead, BlockSize); END; END; PROCEDURE TTarWriter.AddString (Contents : STRING; TarFilename : STRING; FileDateGmt : TDateTime); VAR S : TStringStream; BEGIN S := TStringStream.Create (Contents); TRY AddStream (S, TarFilename, FileDateGmt); FINALLY S.Free END END; PROCEDURE TTarWriter.AddDir (Dirname : STRING; DateGmt : TDateTime; MaxDirSize : INT64 = 0); VAR DirRec : TTarDirRec; BEGIN ClearDirRec (DirRec); DirRec.Name := Dirname; DirRec.Size := MaxDirSize; DirRec.DateTime := DateGmt; DirRec.Permissions := FPermissions; DirRec.FileType := ftDirectory; DirRec.LinkName := ''; DirRec.UID := FUID; DirRec.GID := FGID; DirRec.UserName := FUserName; DirRec.GroupName := FGroupName; DirRec.ChecksumOK := TRUE; DirRec.Mode := FMode; DirRec.Magic := FMagic; DirRec.MajorDevNo := 0; DirRec.MinorDevNo := 0; WriteTarHeader (FStream, DirRec); END; PROCEDURE TTarWriter.AddSymbolicLink (Filename, Linkname : STRING; DateGmt : TDateTime); VAR DirRec : TTarDirRec; BEGIN ClearDirRec (DirRec); DirRec.Name := Filename; DirRec.Size := 0; DirRec.DateTime := DateGmt; DirRec.Permissions := FPermissions; DirRec.FileType := ftSymbolicLink; DirRec.LinkName := Linkname; DirRec.UID := FUID; DirRec.GID := FGID; DirRec.UserName := FUserName; DirRec.GroupName := FGroupName; DirRec.ChecksumOK := TRUE; DirRec.Mode := FMode; DirRec.Magic := FMagic; DirRec.MajorDevNo := 0; DirRec.MinorDevNo := 0; WriteTarHeader (FStream, DirRec); END; PROCEDURE TTarWriter.AddLink (Filename, Linkname : STRING; DateGmt : TDateTime); VAR DirRec : TTarDirRec; BEGIN ClearDirRec (DirRec); DirRec.Name := Filename; DirRec.Size := 0; DirRec.DateTime := DateGmt; DirRec.Permissions := FPermissions; DirRec.FileType := ftLink; DirRec.LinkName := Linkname; DirRec.UID := FUID; DirRec.GID := FGID; DirRec.UserName := FUserName; DirRec.GroupName := FGroupName; DirRec.ChecksumOK := TRUE; DirRec.Mode := FMode; DirRec.Magic := FMagic; DirRec.MajorDevNo := 0; DirRec.MinorDevNo := 0; WriteTarHeader (FStream, DirRec); END; PROCEDURE TTarWriter.AddVolumeHeader (VolumeId : STRING; DateGmt : TDateTime); VAR DirRec : TTarDirRec; BEGIN ClearDirRec (DirRec); DirRec.Name := VolumeId; DirRec.Size := 0; DirRec.DateTime := DateGmt; DirRec.Permissions := FPermissions; DirRec.FileType := ftVolumeHeader; DirRec.LinkName := ''; DirRec.UID := FUID; DirRec.GID := FGID; DirRec.UserName := FUserName; DirRec.GroupName := FGroupName; DirRec.ChecksumOK := TRUE; DirRec.Mode := FMode; DirRec.Magic := FMagic; DirRec.MajorDevNo := 0; DirRec.MinorDevNo := 0; WriteTarHeader (FStream, DirRec); END; PROCEDURE TTarWriter.Finalize; // Writes the End-Of-File Tag // Data after this tag will be ignored // The destructor calls this automatically if you didn't do it before VAR Rec : ARRAY [0..RECORDSIZE-1] OF CHAR; BEGIN FillChar (Rec, SizeOf (Rec), 0); FStream.Write (Rec, RECORDSIZE); FFinalized := TRUE; END; END. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/guii.lrs0000664000175000017500000000514410636052432020661 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TMainForm','FORMDATA',[ 'TPF0'#9'TMainForm'#8'MainForm'#4'Left'#3'#'#1#6'Height'#3','#1#3'Top'#3#149#0 +#5'Width'#3#144#1#18'HorzScrollBar.Page'#3#143#1#18'VertScrollBar.Page'#3#24 +#1#13'ActiveControl'#7#5'Memo1'#7'Caption'#6#7'dcm2nii'#4'Menu'#7#9'MainMenu' +'1'#6'OnShow'#7#8'FormShow'#0#8'TToolBar'#8'ToolBar1'#6'Height'#2#26#5'Width' +#3#144#1#7'Caption'#6#8'ToolBar1'#11'EdgeBorders'#11#0#8'TabOrder'#2#0#0#6'T' +'Label'#6'Label1'#4'Left'#2#1#6'Height'#2#14#5'Width'#2'O'#9'Alignment'#7#8 +'taCenter'#7'Caption'#6#15'Output Format: '#5'Color'#7#6'clNone'#11'ParentCo' +'lor'#8#0#0#9'TComboBox'#9'TypeCombo'#4'Left'#2'P'#6'Height'#2#22#5'Width'#2 +'d'#16'AutoCompleteText'#11#22'cbactEndOfLineComplete'#20'cbactSearchAscendi' +'ng'#0#13'Items.Strings'#1#6#24'SPM2 (3D Anlyze hdr/img)'#6#23'SPM5 (3D NIfT' +'I hdr/img)'#6#16'4D NIfTI hdr/img'#6#18'FSL (4D NIfTI nii)'#6#29'Compressed' +' FSL (4D NIfTI nii)'#0#9'MaxLength'#2#0#5'Style'#7#14'csDropDownList'#8'Tab' +'Order'#2#0#0#0#0#5'TMemo'#5'Memo1'#6'Height'#3#255#0#3'Top'#2#26#5'Width'#3 +#144#1#5'Align'#7#8'alClient'#13'Lines.Strings'#1#6#0#0#8'TabOrder'#2#1#0#0#9 +'TMainMenu'#9'MainMenu1'#4'left'#2'G'#3'top'#2'<'#0#9'TMenuItem'#8'FileMenu' +#7'Caption'#6#4'File'#7'OnClick'#7#13'FileMenuClick'#0#9'TMenuItem'#12'Modif' +'yNifti1'#7'Caption'#6#12'Modify NIfTI'#7'OnClick'#7#17'ModifyNifti1Click'#0 +#0#9'TMenuItem'#9'MenuItem7'#7'Caption'#6#14'DICOM to NIfTI'#7'OnClick'#7#15 +'dcm2niiBtnClick'#0#0#9'TMenuItem'#15'AnonymizeDICOM1'#7'Caption'#6#15'Anony' +'mize DICOM'#7'OnClick'#7#20'AnonymizeDICOM1Click'#0#0#9'TMenuItem'#5'Exit1' +#7'Caption'#6#4'Exit'#7'OnClick'#7#10'Exit1Click'#0#0#0#9'TMenuItem'#9'MenuI' +'tem5'#7'Caption'#6#8'EditMenu'#0#9'TMenuItem'#9'MenuItem6'#7'Caption'#6#4'C' +'opy'#0#0#0#9'TMenuItem'#9'MenuItem2'#7'Caption'#6#4'Edit'#7'OnClick'#7#14'M' +'enuItem2Click'#0#9'TMenuItem'#5'Copy1'#7'Caption'#6#4'Copy'#8'ShortCut'#3'C' +'@'#7'OnClick'#7#10'Copy1Click'#0#0#0#9'TMenuItem'#9'MenuItem1'#7'Caption'#6 +#4'Help'#7'OnClick'#7#14'MenuItem1Click'#0#9'TMenuItem'#9'MenuItem3'#7'Capti' +'on'#6#11'Preferences'#7'OnClick'#7#17'Preferences1Click'#0#0#9'TMenuItem'#9 +'MenuItem4'#7'Caption'#6#5'About'#7'OnClick'#7#11'About1Click'#0#0#0#0#22'TS' +'electDirectoryDialog'#9'DirSelect'#5'Title'#6#16'Select Directory'#11'Filte' +'rIndex'#2#0#4'left'#2'G'#3'top'#2'`'#0#0#11'TOpenDialog'#10'OpenHdrDlg'#5'T' +'itle'#6#18'Open existing file'#11'FilterIndex'#2#0#4'left'#2'H'#3'top'#3#128 +#0#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/dcm2nii/gui.pas0000664000175000017500000011104311645600566020477 0ustar michaelmichaelunit gui; {$IFDEF FPC}{$mode objfpc}{$H+}{$ENDIF} interface uses {$IFDEF FPC}LResources,{$ENDIF} {$IFNDEF UNIX} Windows,ShellAPI,ShlObj, {$ELSE} BaseUnix,LCLType, {$ENDIF} Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ToolWin, ComCtrls, ExtCtrls,IniFiles,define_types,sortdicom,dicom,parconvert, filename, convert,userdir, paramstrs,nifti_hdr,nii_math,dicomtypes,nii_crop, nii_orient, nii_4dto3d,nii_asl,nii_reslice, Menus,nii_3dto4d,prefs, ConvertSimple,GraphicsMathLibrary; {$IFDEF FPC} type { TMainForm } TMainForm = class(TForm) SelectDirectoryDialog1: TSelectDirectoryDialog;//<-Lazarus only - does not exist in Delphi 4 Label1: TLabel; MainMenu1: TMainMenu; File1: TMenuItem; Edit1: TMenuItem; Help1: TMenuItem; About1: TMenuItem; Copy1: TMenuItem; DICOMtoNIfTI1: TMenuItem; AnonymizeDICOM1: TMenuItem; Exit1: TMenuItem; ExtractDICOMdims1: TMenuItem; ExtractDICOMhdr1: TMenuItem; ExtractNIfTIhdrs1: TMenuItem; SumTPM1: TMenuItem; MirrorXdimension1: TMenuItem; UntestedMenu: TMenuItem; NIfTI3D4D1: TMenuItem; ModifyNIfTI1: TMenuItem; Preferences1: TMenuItem; Memo1: TMemo; OpenHdrDlg: TOpenDialog; Panel1: TPanel; TypeCombo: TComboBox; ResliceNIfTI1: TMenuItem; Deletenondcm1: TMenuItem; HalveMenu1: TMenuItem; procedure SavePrefs; procedure ExtractDICOMdims1Click(Sender: TObject); procedure ExtractDICOMhdr1Click(Sender: TObject); procedure ExtractNIfTIhdrs1Click(Sender: TObject); procedure FormClose(Sender: TObject; var vAction: TCloseAction); procedure FormDropFiles(Sender: TObject; const FileNames: array of String); procedure HalveMenu1Click(Sender: TObject); function OpenDialogExecute (lCaption: string;lAllowMultiSelect,lForceMultiSelect: boolean; lFilter: string): boolean; procedure CheckPrefs (var lPrefs: TPrefs; lWrite: boolean); function ConvertDCM2NII (lFilename: string; var lPrefs: TPrefs): boolean; procedure FormCreate(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure Copy1Click(Sender: TObject); procedure About1Click(Sender: TObject); procedure Preferences1Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure SumTPM1Click(Sender: TObject); procedure TypeComboChange(Sender: TObject); procedure AnonymizeDICOM1Click(Sender: TObject); procedure ModifyNIfTI1Click(Sender: TObject); procedure NIfTI3D4D1Click(Sender: TObject); procedure ResliceNIfTI1Click(Sender: TObject); procedure Deletenondcm1Click(Sender: TObject); procedure dcm2niiBtnClick(Sender: TObject); procedure MirrorXdimension1Click(Sender: TObject); function BrowseDialog(const Title: string): string; end; {$ELSE} type TMainForm = class(TForm) Label1: TLabel; MainMenu1: TMainMenu; File1: TMenuItem; Edit1: TMenuItem; Help1: TMenuItem; About1: TMenuItem; Copy1: TMenuItem; DICOMtoNIfTI1: TMenuItem; AnonymizeDICOM1: TMenuItem; Exit1: TMenuItem; ExtractDICOMdims1: TMenuItem; ExtractDICOMhdr1: TMenuItem; ExtractNIfTIhdrs1: TMenuItem; SumTPM1: TMenuItem; MirrorXdimension1: TMenuItem; UntestedMenu: TMenuItem; NIfTI3D4D1: TMenuItem; ModifyNIfTI1: TMenuItem; Preferences1: TMenuItem; Memo1: TMemo; OpenHdrDlg: TOpenDialog; Panel1: TPanel; TypeCombo: TComboBox; ResliceNIfTI1: TMenuItem; Deletenondcm1: TMenuItem; HalveMenu1: TMenuItem; procedure SavePrefs; procedure ExtractDICOMdims1Click(Sender: TObject); procedure ExtractDICOMhdr1Click(Sender: TObject); procedure ExtractNIfTIhdrs1Click(Sender: TObject); procedure FormClose(Sender: TObject; var vAction: TCloseAction); procedure FormDropFiles(Sender: TObject; const FileNames: array of String); procedure HalveMenu1Click(Sender: TObject); function OpenDialogExecute (lCaption: string;lAllowMultiSelect,lForceMultiSelect: boolean; lFilter: string): boolean; procedure CheckPrefs (var lPrefs: TPrefs; lWrite: boolean); function ConvertDCM2NII (lFilename: string; var lPrefs: TPrefs): boolean; procedure FormCreate(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure Copy1Click(Sender: TObject); procedure About1Click(Sender: TObject); procedure Preferences1Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure SumTPM1Click(Sender: TObject); procedure TypeComboChange(Sender: TObject); procedure AnonymizeDICOM1Click(Sender: TObject); procedure ModifyNIfTI1Click(Sender: TObject); procedure NIfTI3D4D1Click(Sender: TObject); procedure ResliceNIfTI1Click(Sender: TObject); procedure Deletenondcm1Click(Sender: TObject); procedure dcm2niiBtnClick(Sender: TObject); procedure MirrorXdimension1Click(Sender: TObject); function BrowseDialog(const Title: string): string; private procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES; //<-Delphi only - does not exist in Lazarus end; {$ENDIF} var MainForm: TMainForm; implementation uses untar,pref_form, nifti_form,niftiutil{$IFNDEF UNIX},ActiveX {$ENDIF}; {$IFNDEF FPC} {$R *.DFM} {$R windowsxp.res} {$ENDIF} procedure MsgX (lStr: string); begin MainForm.Memo1.Lines.Add(lStr); end; function is4D (var lHdr: TNIFTIhdr): boolean; begin if lHdr.dim[4] > 1 then result := true else result := false; end; function SelectProcessNIFTI (var lHdr: TNIFTIhdr; var lFilename: string): integer; begin result := -1; //returns -1 if error if is4D(lHdr) then begin NIfTIForm.Combo3D.visible := false; NIfTIForm.Combo4D.visible := true; end else begin //NIfTIForm.Combo3D.itemIndex := 2; NIfTIForm.Combo3D.visible := true; NIfTIForm.Combo4D.visible := false; end; NiftiForm.Combo4DChange(nil); NIftiForm.caption := extractfilename(lFilename); //next - let user specify task NiftiForm.showmodal; if (NiftiForm.ModalResult = mrCancel) then exit; if is4D(lHdr) then result := NiftiForm.Combo4D.ItemIndex else result := NiftiForm.Combo3D.ItemIndex; end; procedure ProcessNIfTI(lFilenames : TStrings; lPrefs: TPrefs); var l4D, lPrev4D, lByteSwap: boolean; lINc,lProcess: integer; lExt,lFilename,lOutname: string; lHdr: TNIFTIhdr; begin if lFilenames.Count < 1 then exit; lPrev4D := false; //ignored in if statement - set only to avoid compiler warning lProcess := 0; //always set in if statement - set only to avoid compiler warning for lInc := 1 to lFilenames.Count do begin lFilename := lFilenames.Strings[lInc-1]; lExt := UpCaseExt(lFilename); if lExt ='.IMG' then lFilename := changefileext(lFilename,'.hdr'); if not NIFTIhdr_LoadHdr (lFilename, lHdr, lByteSwap) then begin MsgX('Unable to read as NifTI/Analyze' + lFilename); exit; end; l4D := is4D(lHdr); //choose process //fx( lFilenames.Count,777); if (lInc = 1) or (l4D <> lPrev4D) then begin lProcess := SelectProcessNIFTI(lHdr,lFilename); if lProcess < 0 then exit; lPrev4D := l4D; end; //next - convert image as specified SetOutputFormat(NIfTIForm.TypeCombo.ItemIndex,lPrefs); if l4D then begin case lProcess of 0: ChangeNIfTISubformat(lFilename,lHdr,lPrefs); 1: Reorder4D(lFilename, lHdr, lByteSwap,lPrefs); 2: Clip4D(lFilename, lHdr, false,lPrefs,NiftiForm.StartEdit.value, NiftiForm.EndEdit.value); 3: Float32NIfTI(lFilename, lPrefs); 4: FormulaNIfTI(lFilename,lPrefs, NiftiForm.ScaleEdit.value, NiftiForm.PowerEdit.value); 5: ASL_subtract(lFilename,false,{subtract} (NiftiForm.AsLCombo.itemIndex ),lPrefs); 6: CropNIfTIX(lFilename, lPrefs, NiftiForm.EndEdit.value, NiftiForm.StartEdit.value, 0,0,0,0 ); else showmessage('Unknown function'); end; //case combo end else begin //if 4d else 3d //Int16LogPtoZNIfTI32Z(lFilename, lPrefs); case lProcess of 0: ChangeNIfTISubformat(lFilename,lHdr,lPrefs); 1: Reorient(lFilename,lHdr, lPrefs,false,false); 2: begin lOutname := Reorient(lFilename,lHdr, lPrefs,false,false); if lOutname <> '' then CropNIfTI(lOutname,lPrefs); end;//2 3: CropNIfTIX(lFilename, lPrefs, NiftiForm.EndEdit.value, NiftiForm.StartEdit.value, 0,0,0,0 ); 4: SiemensPhase2RadiansNIfTI(lFilename, lPrefs); else showmessage('Unknown function'); end; //case 3d end; //if 4d else 3d end end; //for each image end; procedure PromptOutput (var lPrefs: TPrefs); begin if (lPrefs.OutDirMode = kOutDirModePrompt) then lPrefs.OutDir := GetDirPrompt(lPrefs.OutDir); //GetDirPrompt(lPrefs.OutDir); end; function TMainForm.ConvertDCM2NII (lFilename: string; var lPrefs: TPrefs): boolean; //returns true if files treated as DICOM or PAR/REC - these will search entire folder var lOutDir,lExt: String; lStartTime: DWord; lStrings : TStrings; begin DecimalSeparator := '.'; result := false; if (not Fileexists(lFilename)) and (not DirExists(lFilename)) then exit; PromptOutput ( lPrefs); result := true; //3/2011... do not clear here, so we can look across images... Memo1.lines.clear; MsgX(kVers); refresh; Memo1.lines.add('Converting '+lFilename); lOutDir := extractfiledir(lFilename); {$IFNDEF UNIX}lStartTime := GetTickCount;{$ENDIF} if DirExists(lFilename) then begin RecursiveFolderSearch(lFilename,lFilename,lPrefs,0); lPrefs.NameAppend := ''; end else begin lExt := UpCaseExt(lFilename); {if (lExt = '.FDF') then ConvertSimple2NII(lFilename,lOutDir,lPrefs) else} if (lExt = '.REC') or (lExt = '.PAR') then begin LoadFileListPARREC(lFilename,lOutDir,lPrefs) end else if (lExt = '.TGZ') then DeTGZ(lFilename,lPrefs) else if (IsNiftiExt (lFilename)) or (IsVOIExt (lFilename)) then begin result := false; lStrings := TStringList.Create; lStrings.add(lFilename); ProcessNIfTI(lStrings,lPrefs); lStrings.Free; end else begin if (DirExists(lOutDir)) and (not lPrefs.Verbose) then RecursiveFolderSearch(lOutDir,lOutDir,lPrefs,0) else LoadFileList(lFilename,lOutDir,lPrefs); lPrefs.NameAppend := ''; end; end; {$IFNDEF UNIX}Memo1.lines.add('Conversion completed in '+inttostr(GetTickCount-lStartTime)+' ms'); {$ELSE} Memo1.lines.add('Conversion completed'); {$ENDIF} end; function ShowHeader (lFilename: string): boolean; var lPrefs: TPrefs; begin PrefsForm.ReadPrefs(lPrefs); lPrefs.verbose := true; MainForm.Memo1.lines.add('Location '+lFilename); result := MainForm.ConvertDCM2NII( lFilename,lPrefs); end; procedure ProcessFilenames(lFilenames : TStrings; lPrefs: TPrefs); var i: integer; lAllNII: boolean; begin if lFilenames.Count < 1 then exit; lAllNii := true; for i := 0 to (lFilenames.Count-1) do if (not (IsNiftiExt (lFilenames.Strings[i]))) and (not (IsVOIExt (lFilenames.Strings[i]))) then lAllNii := false; if lAllNii then begin ProcessNiFTI (lFilenames,lPrefs); exit; end; if ssCtrl in KeyDataToShiftState(vk_Shift) then begin for i := 0 to (lFilenames.Count-1) do ShowHeader (lFilenames.Strings[i]) end else MainForm.ConvertDCM2NII( lFilenames.Strings[0],lPrefs); end; {$IFNDEF FPC}//if delphi procedure TMainForm.WMDropFiles(var Msg: TWMDropFiles); var CFileName: array[0..MAX_PATH] of Char; lInc: integer; lPrefs: TPrefs; lStrings: TStrings; begin CheckPrefs(lPrefs,False); //lDone := false; lInc := 0; try lStrings := TStringList.Create; while (DragQueryFile(Msg.Drop, lInc, CFileName, MAX_PATH) > 0) {and (not lDone)} do begin lStrings.add(CFilename); Msg.Result := 0; inc(lInc); end; //while ProcessFilenames(lStrings,lPrefs); lStrings.Free; finally DragFinish(Msg.Drop); end; end; function TMainForm.BrowseDialog(const Title: string): string; var iFlag: integer; lpItemID : PItemIDList; BrowseInfo : TBrowseInfo; DisplayName : array[0..MAX_PATH] of char; TempPath : array[0..MAX_PATH] of char; begin iFlag := BIF_RETURNONLYFSDIRS; //iFlag := BIF_BROWSEINCLUDEFILES; //iFlag := BIF_BROWSEFORCOMPUTER; //iFlag := BIF_BROWSEFORPRINTER; Result:=''; FillChar(BrowseInfo, sizeof(TBrowseInfo), #0); with BrowseInfo do begin hwndOwner := Application.Handle; pszDisplayName := @DisplayName; lpszTitle := PChar(Title); ulFlags := iFlag; end; lpItemID := SHBrowseForFolder(BrowseInfo); if lpItemId <> nil then begin SHGetPathFromIDList(lpItemID, TempPath); Result := TempPath; GlobalFreePtr(lpItemID); end; end; {$ELSE} function TMainForm.BrowseDialog(const Title: string): string; begin result := ''; SelectDirectoryDialog1.title := Title; if not SelectDirectoryDialog1.execute then exit; result := SelectDirectoryDialog1.Filename; end; {$ENDIF} procedure TMainForm.dcm2niiBtnClick(Sender: TObject); var sTitle,lDirName: string; lPrefs: TPrefs; begin CheckPrefs(lPrefs,False); // {$IFNDEF UNIX} sTitle:='Choose a folder with DICOM images'; lDirName := BrowseDialog(sTitle); // {$ELSE} // if not OpenDialogExecute('Select DICOM images you wish to convert)',true,false,kAnyFilter) then // exit; // lDirName := extractfiledir( OpenHdrDlg.Filename); // {$ENDIF} ConvertDCM2NII(lDirName,lPrefs); end; procedure TMainForm.CheckPrefs (var lPrefs: TPrefs; lWrite: boolean); begin if lWrite then begin //showmessage('w'); //options if writing TypeCombo.ItemIndex := DefaultOutputFormat (lPrefs); (* if lPrefs.SPM2 then TypeCombo.ItemIndex := 0 //SPM2 3D hdr/img analyze else if not lPrefs.FourD then begin if not (lPrefs.SingleNIIFile) then TypeCombo.ItemIndex := 1 //SPM5 3D hdr/img else TypeCombo.ItemIndex := 2; //SPM8 3D nii end else if not lPrefs.SingleNIIFile then TypeCombo.ItemIndex := 3 //?? 4D hdr/img else if not lPrefs.GZip then TypeCombo.ItemIndex := 4 //FSL 4D nii else TypeCombo.ItemIndex := 5; //FSL 4D nii.gz *) exit; end; SetDefaultPrefs (lPrefs); PrefsForm.ReadPrefs(lPrefs); SetOutputFormat(TypeCombo.ItemIndex,lPrefs); lPrefs.AnonymizeSourceDICOM := false; end; (*procedure Fz; var lPrefs: TPrefs; lByteSwap: boolean; lExt,lFilename,lOutname,lNameWOExt: string; lHdr: TNIFTIhdr; begin lFilename := 'C:\dti64\rapid\fz3.nii'; lFilename := 'C:\t1\mx.nii'; if not NIFTIhdr_LoadHdr (lFilename, lHdr, lByteSwap) then begin MsgX('Unable to read as NifTI/Analyze' + lFilename); exit; end; MainForm.CheckPrefs(lPrefs,False); Reorient(lFilename, lHdr,lPrefs,false); end; *) (*procedure Fz; var lPrefs: TPrefs; lF: string; begin lF := 'C:\iceland\temp'; SetDefaultPrefs (lPrefs); lPrefs.AnonymizeSourceDICOM := true; MainForm.ConvertDCM2NII(lF,lPrefs); end;*) procedure TMainForm.FormCreate(Sender: TObject); begin {$IFDEF Darwin} Exit1.visible := false; {$ENDIF} {$IFNDEF UNIX}DragAcceptFiles(Handle, True);{$ENDIF} //Memo1.Lines.Add(kVers); DecimalSeparator := '.'; Application.HintHidePause := 30000; end; procedure TMainForm.Exit1Click(Sender: TObject); begin Close; end; procedure TMainForm.Copy1Click(Sender: TObject); begin Memo1.SelectAll; Memo1.CopyToClipboard; end; (*procedure testpermissions; var p,n,x,s: string; begin s:= '/usr/lib64/lazarus/cr/'; inputquery('cap','name',s); FilenameParts (s,p,n,x); if DirWritePermission(p) then showmessage('+'+p+'*'+n+'*'+x) else showmessage('-'+p+'*'+n+'*'+x); end; *) (*procedure testpermissions; var p,n,x,s: string; begin s:= '/usr/lib64/lazarus/test/dcm2niigui.ini'; if fpAccess (s,R_OK)=0 then //ensure user has read-access to prefs file... showmessage('dcm = 0'); s:= '/usr/lib64/lazarus/test/dcx.ini'; if fpAccess (s,R_OK)=0 then //ensure user has read-access to prefs file... showmessage('dcx = 0'); end; *) (*procedure Force32; var lPrefs: TPrefs; lI: integer; begin PrefsForm.ReadPrefs(lPrefs); for lI := 1 to 6 do NII_force32 ('C:\walker\vois\i'+inttostr(lI)+'.nii','C:\walker\vois\ri'+inttostr(lI)+'.nii',lPrefs); end;*) (*procedure Force32; var lPrefs: TPrefs; begin PrefsForm.ReadPrefs(lPrefs); Rescale_4Dtissuemaps ('C:\walker\vois\4Dsri1.nii','C:\walker\vois\TPMQ.nii',lPrefs); end;*) (*procedure Force32; var lPrefs: TPrefs; const kDir = 'C:\walker\i3\'; kTemp = kDir + 'TPM3.nii'; kTempSym = kDir + 'TPM3sym.nii'; begin //exit; PrefsForm.ReadPrefs(lPrefs); //scale_4Dtissuemaps ('C:\walker\vois\4Dsri1.nii','C:\walker\TPMLo.nii',lPrefs); //rge4DFiles ('C:\walker\TPMLo.nii','C:\walker\TPMHi.nii','C:\walker\TPMEX.nii',78,lPrefs); Insert3Din4D (kDir+'m1.nii.gz',kTemp,kTemp,1, lPrefs); Insert3Din4D (kDir+'m2.nii.gz',kTemp,kTemp,2, lPrefs); Insert3Din4D (kDir+'m3.nii.gz',kTemp,kTemp,3, lPrefs); Insert3Din4D (kDir+'m4.nii.gz',kTemp,kTemp,4, lPrefs); Insert3Din4D (kDir+'m5.nii.gz',kTemp,kTemp,5, lPrefs); Insert3Din4D (kDir+'m6.nii.gz',kTemp,kTemp,6, lPrefs); Rescale_4Dtissuemaps(kTemp,kTempSym,lPrefs,true); end; *) (*procedure Force32; var lPrefs: TPrefs; const kDir = 'C:\walker\i4\'; kTemp = kDir + 'TPM4.nii'; kTempSym = kDir + 'TPM4sym.nii'; begin //exit; PrefsForm.ReadPrefs(lPrefs); //scale_4Dtissuemaps ('C:\walker\vois\4Dsri1.nii','C:\walker\TPMLo.nii',lPrefs); //rge4DFiles ('C:\walker\TPMLo.nii','C:\walker\TPMHi.nii','C:\walker\TPMEX.nii',78,lPrefs); Insert3Din4D (kDir+'sm1.nii',kTemp,kTemp,1, lPrefs); Insert3Din4D (kDir+'sm2.nii',kTemp,kTemp,2, lPrefs); Insert3Din4D (kDir+'sm3.nii',kTemp,kTemp,3, lPrefs); Insert3Din4D (kDir+'sm4.nii',kTemp,kTemp,4, lPrefs); Insert3Din4D (kDir+'sm5.nii',kTemp,kTemp,5, lPrefs); Insert3Din4D (kDir+'sm6.nii',kTemp,kTemp,6, lPrefs); Rescale_4Dtissuemaps(kTemp,kTempSym,lPrefs,true); end; *) (*procedure Force32; var lPrefs: TPrefs; lMaskName: string; lHdr: TNIfTIHdr; lByteSwap, lSaveThresh3D: boolean; lV: integer; begin //exit; PrefsForm.ReadPrefs(lPrefs); if not MainForm.OpenDialogExecute('Select the mask image',false,false,kImgFilter) then exit; lMaskName := MainForm.OpenHdrDlg.Filename; if not NIFTIhdr_LoadHdr (lMaskName, lHdr, lByteSwap) then exit; if (lHdr.Dim[4] < 1) then exit; lSaveThresh3D := (MessageDlg('Save thresholded images for each individual?',mtCustom,[mbYes,mbNo], 0)=mrYes); for lV := 1 to lHdr.Dim[4] do if MainForm.OpenDialogExecute('Select NIfTI images you wish to mask with volume '+inttostr(lV),true,false,kImgFilter) then MaskImages(lMaskName, MainForm.OpenHdrDlg.Files,lPrefs,lV, lSaveThresh3D); end; *) (*procedure Force32; var lPrefs: TPrefs; lI: integer; //lMaskName: string; begin //exit; PrefsForm.ReadPrefs(lPrefs); if not MainForm.OpenDialogExecute('Select all the c1 (gray matter) images to binarize. The c2 (gray matter),c3,c4,c5,c6 images should be in th same folder.',true,false,kImgFilter) then exit; //lMaskName := ('C:\Documents and Settings\chris\Desktop\walkerseg\zero\wc120100128_102305t1saghiress002a1001.nii'); //Binarize(lMaskName,lPrefs); if MainForm.OpenHdrDlg.Files.count < 1 then exit; for lI := 0 to (MainForm.OpenHdrDlg.Files.count-1) do Binarize(MainForm.OpenHdrDlg.Files[lI],lPrefs); end; *) {$IFNDEF FPC} procedure MaskVBM; var lPrefs: TPrefs; lI: integer; lMaskName: string; begin PrefsForm.ReadPrefs(lPrefs); if not MainForm.OpenDialogExecute('Select all TEMPLATE c1 (gray matter) image.',false,false,kImgFilter) then exit; lMaskName := MainForm.OpenHdrDlg.Filename; if not MainForm.OpenDialogExecute('Select all the c1 (gray matter) images to binarize. The c2 (gray matter),c3,c4,c5,c6 images should be in th same folder.',true,false,kImgFilter) then exit; if MainForm.OpenHdrDlg.Files.count < 1 then exit; for lI := 0 to (MainForm.OpenHdrDlg.Files.count-1) do MaskImgs(lMaskName, MainForm.OpenHdrDlg.Files[lI],lPrefs, 0.02); end; {$ENDIF} {$IFNDEF FPC} procedure Mask; var lPrefs: TPrefs; lMaskName: string; lHdr: TNIfTIHdr; lByteSwap {, lSaveThresh3D}: boolean; lI,lV: integer; begin PrefsForm.ReadPrefs(lPrefs); if not MainForm.OpenDialogExecute('Select the mask image',false,false,kImgFilter) then exit; lMaskName := MainForm.OpenHdrDlg.Filename; if not NIFTIhdr_LoadHdr (lMaskName, lHdr, lByteSwap) then exit; lV := 1; //lSaveThresh3D := (MessageDlg('Save thresholded images for each individual?',mtCustom,[mbYes,mbNo], 0)=mrYes); //for lV := 1 to lHdr.Dim[4] do if not MainForm.OpenDialogExecute('Select NIfTI images you wish to mask with volume '+inttostr(lV),true,false,kImgFilter) then exit; if MainForm.OpenHdrDlg.Files.count < 1 then exit; for lI := 0 to (MainForm.OpenHdrDlg.Files.count-1) do MaskImg(lMaskName, MainForm.OpenHdrDlg.Files[lI], lPrefs, 1); end; {$ENDIF} function ExtNIIorIMG(lStr: string): boolean; var lExt: string; begin result := false; lExt := UpCaseExt(lStr); if (lExt = '.NII') or (lExt = '.NII.GZ') then result := true; if (lExt = '.IMG') {and (FSize(ChangeFileExt(lStr,'.hdr'))> 0)} then result := true; end; procedure NIIbatch (lDir,lS: string); begin with mainform.Memo1.lines do begin add('subjx = strvcat'+lS+';'); add('subj = cellstr(subjx);'); add('dir = '''+lDir+''';'); add('tic'); add('for i=1:length(subj)'); add(' filename = [dir,filesep,subj{i}];'); add(' nii_16bit(filename);'); add('end;'); add('toc'); end;//with end;//proc NIIbatch procedure NII2Mat; var str,pre,sTitle,lDirName: string; lSearchRec: TSearchRec; begin {$IFNDEF FPC} sTitle:='Choose a folder with DICOM images'; lDirName := MainForm.BrowseDialog(sTitle); {$ELSE} if not MainForm.OpenDialogExecute('Select DICOM images you wish to inspect)',true,false,kAnyFilter) then exit; lDirName := extractfiledir( MainForm.OpenHdrDlg.Filename); {$ENDIF} str := '('; pre := ''; {$IFDEF UNIX} if FindFirst(lDirName+pathdelim+'*',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ELSE} if FindFirst(lDirName+pathdelim+'*.*',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ENDIF} //lFilename := ''; repeat //lNewName := lNewDir+lSearchRec.Name; if (lSearchRec.Name = '.') or (lSearchRec.Name = '..') then begin // end else if (lSearchRec.Name <> '') and (ExtNIIorIMG(lSearchRec.Name)) and (not DirExists(lSearchRec.Name)) then begin str := str +pre+ ''''+extractfilename(lSearchRec.Name)+''''; pre:=',' end; //mainform.Memo1.lines.add(lSearchRec.Name); until (FindNext(lSearchRec) <> 0); end; FindClose(lSearchRec); str := str + ')'; if length(str) > 2 then NIIbatch (lDirName,str)//mainform.Memo1.lines.add(str) else mainform.Memo1.lines.add('No NIfTI images found in '+lDirName) end; (*procedure NII2Mat(lExt: string); var str,pre,sTitle,lDirName: string; lSearchRec: TSearchRec; begin {$IFNDEF FPC} sTitle:='Choose a folder with DICOM images'; lDirName := BrowseDialog(sTitle); {$ELSE} if not OpenDialogExecute('Select DICOM images you wish to inspect)',true,false,kAnyFilter) then exit; lDirName := extractfiledir( OpenHdrDlg.Filename); {$ENDIF} str := '('; pre := ''; {$IFDEF UNIX} if FindFirst(lDirName+pathdelim+'*.img',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ELSE} if FindFirst(lDirName+pathdelim+'*.img',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ENDIF} //lFilename := ''; repeat //lNewName := lNewDir+lSearchRec.Name; if (lSearchRec.Name = '.') or (lSearchRec.Name = '..') then begin // end else if (lSearchRec.Name <> '') and (not DirExists(lSearchRec.Name)) then begin str := str +pre+ ''''+extractfilename(lSearchRec.Name)+''''; pre:=',' end; //mainform.Memo1.lines.add(lSearchRec.Name); until (FindNext(lSearchRec) <> 0); end; FindClose(lSearchRec); str := str + ')'; mainform.Memo1.lines.add(str); end; *) procedure TMainForm.About1Click(Sender: TObject); //var value: int64; begin //fx(VBversion('MR B13 4VB13A')); exit; //NII2Mat;exit; {$IFNDEF FPC} if (ssCtrl in KeyDataToShiftState(vk_Shift)) then begin Mask; exit; end; if (ssShift in KeyDataToShiftState(vk_Shift)) then begin MaskVBM; exit; end; {$ENDIF} //force32; //showmessage(ExtractFileDirWithPathDelim('c:\pas')); //testpermissions; Showmessage(kVers+ kCR+'Fallback ini file: '+ changefileext(paramstr(0),'.ini')); end; procedure TMainForm.Preferences1Click(Sender: TObject); var lPrefs: TPrefs; begin PrefsForm.ReadPrefs(lPrefs); PrefsForm.Showmodal; if (PrefsForm.ModalResult = mrCancel) then PrefsForm.WritePrefs(lPrefs); end; (*procedure ShowDICOM (var lPrefs: TPrefs); var lDICOMdata: DICOMdata; lHdrOK,lImgOK: boolean; lDynStr,lFilename: string; begin lFilename := 'c:\i185386.MRDC.94'; read_dicom_data(true,true{not verbose},true,true,true,true,false, lDICOMdata, lHdrOK, lImgOK, lDynStr,lFileName,lPrefs ); msgX(lDynStr); end;*) procedure TMainForm.FormShow(Sender: TObject); var lPrefs: TPrefs; lIniName: string; begin MsgX(kVers); SetDefaultPrefs(lPrefs); lIniName := IniName;//changefileext(paramstr(0),'.ini'); //showmessage(changefileext(paramstr(0),'.ini')); (*lReadPrefs := true; if (ssShift in KeyDataToShiftState(vk_Shift)) then case MessageDlg('Shift key down during launch: do you want to reset the default preferences?', mtConfirmation, [mbYes, mbNo], 0) of { produce the message dialog box } mrYes: lReadPrefs := false; end; //case *) if not ResetDefaults {lReadPrefs} then begin {$IFNDEF UNIX} if (ParamCount > 0) then ProcessParamStrs else if fileexists (lIniName) then IniFile(True,lIniName, lPrefs) else IniFile(True,changefileext(paramstr(0),'.ini'), lPrefs); //this allows an administrator to create default startup //IniFile(True,lIniName, lPrefs); {$ELSE} if fileexists (lIniName) then IniFile(True,lIniName, lPrefs) else IniFile(True,changefileext(paramstr(0),'.ini'), lPrefs); //this allows an administrator to create default startup {$ENDIF} end; //lReadPrefs CheckPrefs(lPrefs,True); PrefsForm.WritePrefs(lPrefs); NIfTIForm.TypeCombo.ItemIndex := TypeCombo.ItemIndex; UntestedMenu.visible := lPrefs.UntestedFeatures; //ConvertDCM2NII('c:\b17\b17\b17.IMA',lPrefs); end; procedure TMainForm.TypeComboChange(Sender: TObject); begin NIfTIForm.TypeCombo.ItemIndex := TypeCombo.ItemIndex; end; procedure TMainForm.AnonymizeDICOM1Click(Sender: TObject); var sTitle,lDirName: string; lPrefs: TPrefs; begin CheckPrefs(lPrefs,False); lPrefs.AnonymizeSourceDICOM := true; sTitle:='Choose a folder with DICOM images'; lDirName := BrowseDialog(sTitle); ConvertDCM2NII(lDirName,lPrefs); end; function TMainForm.OpenDialogExecute (lCaption: string;lAllowMultiSelect,lForceMultiSelect: boolean; lFilter: string): boolean;//; lAllowMultiSelect: boolean): boolean; var lNumberofFiles: integer; begin OpenHdrDlg.Filter := lFilter;//kAnaHdrFilter;//lFilter; OpenHdrDlg.FilterIndex := 1; OpenHdrDlg.Title := lCaption; if lAllowMultiSelect then OpenHdrDlg.Options := [ofAllowMultiSelect,ofFileMustExist] else OpenHdrDlg.Options := [ofFileMustExist]; result := OpenHdrDlg.Execute; if not result then exit; if lForceMultiSelect then begin lNumberofFiles:= OpenHdrDlg.Files.Count; if lNumberofFiles < 2 then begin Showmessage('Error: This function is designed to overlay MULTIPLE images. You selected less than two images.'); result := false; end; end; end; procedure TMainForm.SavePrefs; var lPrefs: TPrefs; lIniName: string; begin lIniName := IniName;//changefileext(paramstr(0),'.ini'); CheckPrefs(lPrefs,False); if lPrefs.WritePrefsOnQuit then IniFile(False,lIniName, lPrefs); end; procedure TMainForm.FormClose(Sender: TObject; var vAction: TCloseAction); begin SavePrefs; end; procedure TMainForm.FormDropFiles(Sender: TObject; const FileNames: array of String); var lI,lN: integer; lPrefs: TPrefs; //lDone: boolean; lStrings: TStrings;//lFilename: string; begin //lDone := false; CheckPrefs(lPrefs,False); lN := length(FileNames); if lN < 1 then exit; lStrings := TStringList.Create; for lI := 0 to (lN-1) do lStrings.add(Filenames[lI]); ProcessFilenames(lStrings,lPrefs); lStrings.Free; end; procedure TMainForm.HalveMenu1Click(Sender: TObject); var lPrefs: TPrefs; lI: integer; begin PrefsForm.ReadPrefs(lPrefs); if not MainForm.OpenDialogExecute('Select image(s) you wish to LR flip',true,false,kImgFilter) then exit; if MainForm.OpenHdrDlg.Files.count < 1 then exit; for lI := 0 to (MainForm.OpenHdrDlg.Files.count-1) do ShrinkNII(MainForm.OpenHdrDlg.Files[lI], lPrefs); end; procedure TMainForm.ModifyNIfTI1Click(Sender: TObject); var lPrefs: TPrefs; begin if not OpenDialogExecute('Select NIfTI images you wish to modify)',true,false,kImgFilter) then exit; CheckPrefs(lPrefs,False); ProcessNIfTI(OpenHdrDlg.Files,lPrefs); end; //ModifyNIfTI1Click procedure TMainForm.NIfTI3D4D1Click(Sender: TObject); var lStrings: TStringList; lPrefs: TPrefs; begin if not OpenDialogExecute('Select the 3D NIfTI images you wish to stack)',true,false,kImgFilter) then exit; lStrings := TStringList.Create; lStrings.addstrings(OpenHdrDlg.Files); CheckPrefs(lPrefs,False); Stack3Dto4D(lStrings, False, lPrefs); lStrings.Free; end; procedure TMainForm.ResliceNIfTI1Click(Sender: TObject); var lDestName,lSourceName,lTargetName: string; lPos: integer; lPrefs: TPrefs; begin CheckPrefs(lPrefs,False); Memo1.lines.clear; refresh; MsgX(kVers); MsgX('This function reslices source images to match the dimensions of a target image.'); MsgX(' Images are assumed to be coregistered.'); MsgX(' The resulting images will have the orientation, voxel size and bounding box of the target image.'); MsgX(' Resliced images will be given the prefix ''r''.'); MsgX(' This function uses trilinear interpolation - there may be some loss of precision.'); if not OpenDialogExecute('Select target image',true,false,kImgFilter) then exit; lTargetName := OpenHdrDlg.Filename; if not OpenDialogExecute('Select images you wish to reslice to match target)',true,false,kImgFilter) then exit; for lPos := 1 to OpenHdrDlg.Files.Count do begin lSourceName := OpenHdrDlg.Files[lPos-1]; lDestName := ChangeFilePrefix (lSourceName,'r'); MsgX('Reslicing '+lSourceName +' to match dimensions of '+lTargetname+' resliced image = '+lDestName); Reslice2Targ (lSourceName,lTargetName,lDestName, lPrefs ); end; end; procedure DelRecursiveFolderSearch (lFolderName: string; lMaxDepth, lDepth: integer); var lNewDir,lNewName,lFilename,lExt: String; lSearchRec: TSearchRec; begin lNewDir := lFolderName+PathDelim; {$IFDEF UNIX} if FindFirst(lNewDir+'*',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ELSE} if FindFirst(lNewDir+'*.*',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ENDIF} lFilename := ''; repeat lNewName := lNewDir+lSearchRec.Name; if (lSearchRec.Name <> '.') and (lSearchRec.Name <> '..') then begin if DirExists(lNewName) then begin if lDepth < lMaxDepth then begin DelRecursiveFolderSearch(lNewName,lMaxDepth,lDepth+1); end; //exit;//4/4/2008 end else lFilename := lNewname; end; if (lFilename <> '') and (not DirExists(lNewName)) then begin lExt := UpCaseExt(lFilename); if (lExt <> '.DCM') then begin msgx('del '+lFilename); DeleteFile(lFilename); end; end; until (FindNext(lSearchRec) <> 0); end; FindClose(lSearchRec); end; procedure TMainForm.Deletenondcm1Click(Sender: TObject); var sTitle,lDirName: string; begin Showmessage('Warning: this command will delete all files that do not have the extension .dcm') ; sTitle:='Choose a folder with DICOM images'; lDirName := BrowseDialog(sTitle); DelRecursiveFolderSearch(lDirName,32,1); end; procedure TMainForm.MirrorXdimension1Click(Sender: TObject); //UntestedFeatures var lPrefs: TPrefs; lI: integer; begin PrefsForm.ReadPrefs(lPrefs); if not MainForm.OpenDialogExecute('Select image(s) you wish to LR flip',true,false,kImgFilter) then exit; if MainForm.OpenHdrDlg.Files.count < 1 then exit; for lI := 0 to (MainForm.OpenHdrDlg.Files.count-1) do LRFlip(MainForm.OpenHdrDlg.Files[lI], lPrefs); end; procedure TMainForm.SumTPM1Click(Sender: TObject); var lPrefs: TPrefs; lI: integer; begin PrefsForm.ReadPrefs(lPrefs); if not OpenDialogExecute('Select TPM to sum)',true,false,kAnyFilter) then exit; for lI := 1 to 5 do SumTPM(OpenHdrDlg.Filename,ChangeFilePrefix (OpenHdrDlg.Filename,'sum'+inttostr(lI)) ,lPrefs,lI); end; procedure TMainForm.ExtractDICOMdims1Click(Sender: TObject); var sTitle,lDirName: string; lPrefs: TPrefs; begin CheckPrefs(lPrefs,False); lPrefs.DebugMode2 := true; {$IFNDEF FPC} sTitle:='Choose a folder with DICOM images'; lDirName := BrowseDialog(sTitle); {$ELSE} if not OpenDialogExecute('Select DICOM images you wish to inspect)',true,false,kAnyFilter) then exit; lDirName := extractfiledir( OpenHdrDlg.Filename); {$ENDIF} ConvertDCM2NII(lDirName,lPrefs); end; procedure TMainForm.ExtractDICOMhdr1Click(Sender: TObject); var lnVol,lVol: integer; lHdrName: string; begin if not OpenDialogExecute('Select the 3D NIfTI images to inspect)',true,false,kAnyFilter) then exit; lnVol := OpenHdrDlg.Files.count; Memo1.lines.clear; for lVol := 1 to lnVol do ShowHeader (OpenHdrDlg.Files[lVol-1]); end; procedure TMainForm.ExtractNIfTIhdrs1Click(Sender: TObject); var lStrings: TStringList; begin if not OpenDialogExecute('Select the 3D NIfTI images to inspect)',true,false,kImgFilter) then exit; Memo1.lines.clear; lStrings := TStringList.Create; lStrings.addstrings(OpenHdrDlg.Files); ExtractNIFTIHdrs(lStrings); lStrings.Free; end; {$IFDEF UNIX} initialization {$I gui.lrs} {$ELSE} //not unix: windows initialization {$IFDEF FPC} {$I gui.lrs} {$ENDIF} OleInitialize(nil); finalization OleUninitialize {$ENDIF} end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/gui.lrs0000664000175000017500000000667311636131732020522 0ustar michaelmichael{ This is an automatically generated lazarus resource file } LazarusResources.Add('TMainForm','FORMDATA',[ 'TPF0'#9'TMainForm'#8'MainForm'#4'Left'#3'W'#1#6'Height'#3'k'#1#3'Top'#2'{'#5 +'Width'#3'V'#2#13'ActiveControl'#7#6'Panel1'#14'AllowDropFiles'#9#7'Caption' +#6#7'dcm2nii'#12'ClientHeight'#3'k'#1#11'ClientWidth'#3'V'#2#4'Menu'#7#9'Mai' +'nMenu1'#7'OnClose'#7#9'FormClose'#8'OnCreate'#7#10'FormCreate'#11'OnDropFil' +'es'#7#13'FormDropFiles'#6'OnShow'#7#8'FormShow'#10'LCLVersion'#6#6'0.9.30'#0 +#5'TMemo'#5'Memo1'#4'Left'#2#4#6'Height'#3'E'#1#3'Top'#2'"'#5'Width'#3'N'#2#5 +'Align'#7#8'alClient'#18'BorderSpacing.Left'#2#4#19'BorderSpacing.Right'#2#4 +#20'BorderSpacing.Bottom'#2#4#10'ScrollBars'#7#14'ssAutoVertical'#8'TabOrder' +#2#0#0#0#6'TPanel'#6'Panel1'#4'Left'#2#0#6'Height'#2'"'#3'Top'#2#0#5'Width'#3 +'V'#2#5'Align'#7#5'alTop'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'"'#11 +'ClientWidth'#3'V'#2#8'TabOrder'#2#1#0#6'TLabel'#6'Label1'#4'Left'#2#1#6'Hei' +'ght'#2#26#3'Top'#2#5#5'Width'#3#140#0#9'Alignment'#7#14'taRightJustify'#7'A' +'nchors'#11#6'akLeft'#0#8'AutoSize'#8#7'Caption'#6#16'Output Format: '#6'La' +'yout'#7#8'tlCenter'#11'ParentColor'#8#0#0#9'TComboBox'#9'TypeCombo'#4'Left' +#3#160#0#6'Height'#2#20#3'Top'#2#3#5'Width'#3#8#1#10'ItemHeight'#2#0#13'Item' +'s.Strings'#1#6#24'SPM2 (3D Anlyze hdr/img)'#6#23'SPM5 (3D NIfTI hdr/img)'#6 +#19'SPM8 (3D NIfTI nii)'#6#16'4D NIfTI hdr/img'#6#18'FSL (4D NIfTI nii)'#6#29 +'Compressed FSL (4D NIfTI nii)'#0#5'Style'#7#14'csDropDownList'#8'TabOrder'#2 +#0#0#0#0#11'TOpenDialog'#10'OpenHdrDlg'#11'FilterIndex'#2#0#4'left'#2#24#3't' +'op'#2'0'#0#0#9'TMainMenu'#9'MainMenu1'#4'left'#2'X'#3'top'#2'0'#0#9'TMenuIt' +'em'#5'File1'#7'Caption'#6#4'File'#0#9'TMenuItem'#13'DICOMtoNIfTI1'#7'Captio' +'n'#6#14'DICOM to NIfTI'#8'ShortCut'#3'D@'#7'OnClick'#7#15'dcm2niiBtnClick'#0 +#0#9'TMenuItem'#12'ModifyNIfTI1'#7'Caption'#6#12'Modify NIfTI'#7'OnClick'#7 +#17'ModifyNIfTI1Click'#0#0#9'TMenuItem'#10'NIfTI3D4D1'#7'Caption'#6#14'NIfTI' +' 3D -> 4D'#7'OnClick'#7#15'NIfTI3D4D1Click'#0#0#9'TMenuItem'#15'AnonymizeDI' +'COM1'#7'Caption'#6#15'Anonymize DICOM'#7'OnClick'#7#20'AnonymizeDICOM1Click' +#0#0#9'TMenuItem'#5'Exit1'#7'Caption'#6#4'Exit'#7'OnClick'#7#10'Exit1Click'#0 +#0#0#9'TMenuItem'#5'Edit1'#7'Caption'#6#4'Edit'#0#9'TMenuItem'#5'Copy1'#7'Ca' +'ption'#6#4'Copy'#7'OnClick'#7#10'Copy1Click'#0#0#0#9'TMenuItem'#12'Untested' +'Menu'#7'Caption'#6#8'Untested'#0#9'TMenuItem'#17'MirrorXdimension1'#7'Capti' +'on'#6#18'Mirror X-dimension'#7'OnClick'#7#22'MirrorXdimension1Click'#0#0#9 +'TMenuItem'#7'SumTPM1'#7'Caption'#6#7'Sum TPM'#7'OnClick'#7#12'SumTPM1Click' +#0#0#9'TMenuItem'#17'ExtractDICOMdims1'#7'Caption'#6#18'Extract DICOM dims'#7 +'OnClick'#7#22'ExtractDICOMdims1Click'#0#0#9'TMenuItem'#16'ExtractDICOMhdr1' +#7'Caption'#6#20'Extract DICOM header'#7'OnClick'#7#21'ExtractDICOMhdr1Click' +#0#0#9'TMenuItem'#17'ExtractNIfTIhdrs1'#7'Caption'#6#20'Extract NIfTI header' +#7'OnClick'#7#22'ExtractNIfTIhdrs1Click'#0#0#9'TMenuItem'#10'HalveMenu1'#7'C' +'aption'#6#25'Halve dimensions in-plane'#7'OnClick'#7#15'HalveMenu1Click'#0#0 +#0#9'TMenuItem'#5'Help1'#7'Caption'#6#4'Help'#0#9'TMenuItem'#12'Preferences1' +#7'Caption'#6#11'Preferences'#7'OnClick'#7#17'Preferences1Click'#0#0#9'TMenu' +'Item'#6'About1'#7'Caption'#6#4'Help'#7'OnClick'#7#11'About1Click'#0#0#0#0#22 +'TSelectDirectoryDialog'#22'SelectDirectoryDialog1'#4'left'#3#159#0#3'top'#2 +'6'#0#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/dcm2nii/gui.lfm0000664000175000017500000000676511636131732020502 0ustar michaelmichaelobject MainForm: TMainForm Left = 343 Height = 363 Top = 123 Width = 598 ActiveControl = Panel1 AllowDropFiles = True Caption = 'dcm2nii' ClientHeight = 363 ClientWidth = 598 Menu = MainMenu1 OnClose = FormClose OnCreate = FormCreate OnDropFiles = FormDropFiles OnShow = FormShow LCLVersion = '0.9.30' object Memo1: TMemo Left = 4 Height = 325 Top = 34 Width = 590 Align = alClient BorderSpacing.Left = 4 BorderSpacing.Right = 4 BorderSpacing.Bottom = 4 ScrollBars = ssAutoVertical TabOrder = 0 end object Panel1: TPanel Left = 0 Height = 34 Top = 0 Width = 598 Align = alTop BevelOuter = bvNone ClientHeight = 34 ClientWidth = 598 TabOrder = 1 object Label1: TLabel Left = 1 Height = 26 Top = 5 Width = 140 Alignment = taRightJustify Anchors = [akLeft] AutoSize = False Caption = 'Output Format: ' Layout = tlCenter ParentColor = False end object TypeCombo: TComboBox Left = 160 Height = 20 Top = 3 Width = 264 ItemHeight = 0 Items.Strings = ( 'SPM2 (3D Anlyze hdr/img)' 'SPM5 (3D NIfTI hdr/img)' 'SPM8 (3D NIfTI nii)' '4D NIfTI hdr/img' 'FSL (4D NIfTI nii)' 'Compressed FSL (4D NIfTI nii)' ) Style = csDropDownList TabOrder = 0 end end object OpenHdrDlg: TOpenDialog FilterIndex = 0 left = 24 top = 48 end object MainMenu1: TMainMenu left = 88 top = 48 object File1: TMenuItem Caption = 'File' object DICOMtoNIfTI1: TMenuItem Caption = 'DICOM to NIfTI' ShortCut = 16452 OnClick = dcm2niiBtnClick end object ModifyNIfTI1: TMenuItem Caption = 'Modify NIfTI' OnClick = ModifyNIfTI1Click end object NIfTI3D4D1: TMenuItem Caption = 'NIfTI 3D -> 4D' OnClick = NIfTI3D4D1Click end object AnonymizeDICOM1: TMenuItem Caption = 'Anonymize DICOM' OnClick = AnonymizeDICOM1Click end object Exit1: TMenuItem Caption = 'Exit' OnClick = Exit1Click end end object Edit1: TMenuItem Caption = 'Edit' object Copy1: TMenuItem Caption = 'Copy' OnClick = Copy1Click end end object UntestedMenu: TMenuItem Caption = 'Untested' object MirrorXdimension1: TMenuItem Caption = 'Mirror X-dimension' OnClick = MirrorXdimension1Click end object SumTPM1: TMenuItem Caption = 'Sum TPM' OnClick = SumTPM1Click end object ExtractDICOMdims1: TMenuItem Caption = 'Extract DICOM dims' OnClick = ExtractDICOMdims1Click end object ExtractDICOMhdr1: TMenuItem Caption = 'Extract DICOM header' OnClick = ExtractDICOMhdr1Click end object ExtractNIfTIhdrs1: TMenuItem Caption = 'Extract NIfTI header' OnClick = ExtractNIfTIhdrs1Click end object HalveMenu1: TMenuItem Caption = 'Halve dimensions in-plane' OnClick = HalveMenu1Click end end object Help1: TMenuItem Caption = 'Help' object Preferences1: TMenuItem Caption = 'Preferences' OnClick = Preferences1Click end object About1: TMenuItem Caption = 'Help' OnClick = About1Click end end end object SelectDirectoryDialog1: TSelectDirectoryDialog left = 159 top = 54 end end mricron-0.20120505.1~dfsg.1.orig/dcm2nii/gui.dfm0000664000175000017500000000463611612055610020457 0ustar michaelmichaelџ TMAINFORM0‹ TPF0 TMainFormMainFormLeftNTopOWidthДHeightиCaption&Drag and Drop DICOM to NIfTI converterColor clBtnFaceDragMode dmAutomatic Font.CharsetDEFAULT_CHARSET Font.Color clWindowText Font.Heightѕ Font.Name MS Sans Serif Font.Style Menu MainMenu1OldCreateOrderPositionpoScreenCenterOnClose FormCloseOnCreate FormCreateOnShowFormShow PixelsPerInch` TextHeight TMemoMemo1LeftTop!WidthЌHeight‰AlignalClientReadOnly ScrollBars ssVerticalTabOrderTPanelPanel1LeftTopWidthЌHeight!AlignalTop BevelOuterbvNoneTabOrderTLabelLabel1LeftTopWidthOHeight Caption Output Format: LayouttlCenter TComboBox TypeComboLeftOTopWidthТHeightStylecsDropDownList ItemHeight TabOrderOnChangeTypeComboChange Items.StringsSPM2 (3D Anlyze hdr/img)SPM5 (3D NIfTI hdr/img)SPM8 (3D NIfTI nii)4D NIfTI hdr/imgFSL (4D NIfTI nii)Compressed FSL (4D NIfTI nii) TMainMenu MainMenu1LeftАTopP TMenuItemFile1CaptionFile TMenuItem DICOMtoNIfTI1CaptionDICOM to NIfTIShortCutD@OnClickdcm2niiBtnClick TMenuItem ModifyNIfTI1Caption Modify NIfTIOnClickModifyNIfTI1Click TMenuItem NIfTI3D4D1CaptionNIfTI 3D -> 4DOnClickNIfTI3D4D1Click TMenuItemAnonymizeDICOM1CaptionAnonymize DICOMOnClickAnonymizeDICOM1Click TMenuItem ResliceNIfTI1Caption Reslice NIfTIOnClickResliceNIfTI1Click TMenuItemExit1CaptionExitOnClick Exit1Click TMenuItem Deletenondcm1CaptionDelete non .dcmVisibleOnClickDeletenondcm1Click TMenuItemEdit1CaptionEdit TMenuItemCopy1CaptionCopyShortCutC@OnClick Copy1Click TMenuItem UntestedMenuCaptionUntested TMenuItemMirrorXdimension1CaptionMirror X-dimensionOnClickMirrorXdimension1Click TMenuItemSumTPM1CaptionSum TPMOnClick SumTPM1Click TMenuItemExtractDICOMdims1CaptionExtract DICOM dimensionsOnClickExtractDICOMdims1Click TMenuItemExtractDICOMhdr1CaptionExtract DICOM headersOnClickExtractDICOMhdr1Click TMenuItemExtractNIfTIhdrs1CaptionExtract NIfTI headersOnClickExtractNIfTIhdrs1Click TMenuItem HalveMenu1CaptionHalve dimensions inplaneOnClickHalveMenu1Click TMenuItemHelp1CaptionHelp TMenuItem Preferences1CaptionPreferences...ShortCutP@OnClickPreferences1Click TMenuItemAbout1CaptionAbout...ShortCutA@OnClick About1Click TOpenDialog OpenHdrDlgLeft€TopPmricron-0.20120505.1~dfsg.1.orig/dcm2nii/fpc-res.res0000664000175000017500000000321011326413034021240 0ustar michaelmichael џџџџ<LџџLAZ_PIC_DIALOG_TEMPLATE0T,‘PШ‘_STATICш џџџџ ( @€€€€€€€€€€€€РРРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЯџќЬЯќЬџЬЯџџџџџЬЯџќЬЯќЬџЬЯџџџџџЬЯџЬЬЯќЬџЬЯџџџџџЬЯџЬЬЯќЬџЬЯџџџџџЬЯќЯЬЯќЬџЬЯџџџџџЬЯЬЯЬЯќЬџЬЯџџџџџЬЯЬџЬЯџџџџџџџџџџЬЬЬџЬЯќЬџЬЯџџџџџЬЬЯџЬЯќЬџЬЯџџџџџЬЬџџЬЯќЬџЬЯџџџџџџџџџџџџџџџџџџџџџџџљ™™™Ÿџџџџџџџџџџџљ™™™Ÿџџџџџџџџџџџљ™џџџџџџџџџџџџџџџ™Ÿџџџџџџџџџџџџџџљ™Ÿџџџџџџџџџџџџџџљ™џџџџџџџџџџџџџџџ™џџџџџџџџџџџџџџџ™џџџџџџџџџџџџљ™™™џџџџџџџџџџџџљ™™Ÿџџџџџџџџџџџџџџџџџџџџџџџіfoџfџffџfoіofіoіffџfіffіffіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіffџfіffіffіfffoіfoџfџffџfoџfџfџџџџџџџџџџџџџџџџџ0џџMAINICON  шt џџџџ t4VS_VERSION_INFOНяў ?вStringFileInfoЎ040904E4"CompanyName*FileDescription0FileVersion0.9.0.0"InternalName&LegalCopyright*LegalTrademarks*OriginalFilename"ProductName4ProductVersion1.0.0.0CommentsDVarFileInfo$Translation фmricron-0.20120505.1~dfsg.1.orig/dcm2nii/fpc-res.or0000664000175000017500000000363211326413034021077 0ustar michaelmichaelL„.rsrc <\@РZK0€`€€Р€ZKH€ZK 4ZK№€x€ZKDZK €Ј€ZK TZKи€ZK dLAZ_PIC_DIALOG_TEMPLATEMAINICONtш\<˜Ќt( @€€€€€€€€€€€€РРРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЯџќЬЯќЬџЬЯџџџџџЬЯџќЬЯќЬџЬЯџџџџџЬЯџЬЬЯќЬџЬЯџџџџџЬЯџЬЬЯќЬџЬЯџџџџџЬЯќЯЬЯќЬџЬЯџџџџџЬЯЬЯЬЯќЬџЬЯџџџџџЬЯЬџЬЯџџџџџџџџџџЬЬЬџЬЯќЬџЬЯџџџџџЬЬЯџЬЯќЬџЬЯџџџџџЬЬџџЬЯќЬџЬЯџџџџџџџџџџџџџџџџџџџџџџџљ™™™Ÿџџџџџџџџџџџљ™™™Ÿџџџџџџџџџџџљ™џџџџџџџџџџџџџџџ™Ÿџџџџџџџџџџџџџџљ™Ÿџџџџџџџџџџџџџџљ™џџџџџџџџџџџџџџџ™џџџџџџџџџџџџџџџ™џџџџџџџџџџџџљ™™™џџџџџџџџџџџџљ™™ŸџџџџџџџџџџџџџџџџџџџџџџџіfoџfџffџfoіofіoіffџfіffіffіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіffџfіffіffіfffoіfoџfџffџfoџfџfџџџџџџџџџџџџџџџџџT,‘PШ‘_STATIC шt4VS_VERSION_INFOНяў ?вStringFileInfoЎ040904E4"CompanyName*FileDescription0FileVersion0.9.0.0"InternalName&LegalCopyright*LegalTrademarks*OriginalFilename"ProductName4ProductVersion1.0.0.0CommentsDVarFileInfo$Translation ф4DTd.rsrcmricron-0.20120505.1~dfsg.1.orig/dcm2nii/filename.pas0000664000175000017500000001302311473723400021462 0ustar michaelmichaelunit filename; {$IFDEF FPC} {$mode objfpc} {$ENDIF} {$H+} interface uses //{$IFNDEF FPC}FileCtrl,{$ENDIF} Classes, SysUtils,define_types,dicomtypes,prefs; procedure ExtractFileParts (var lFileName, lNameWOExt,lExt: string); function ExtractFileDirWithPathDelim2(lInFilename: string): string; procedure AplhaNumericStr (var lStr: string); procedure AplhaNumericStrExt (var lStr: string); function OutputFilename(var lDicomImgName: string; var lDicomData: dicomData; lPrefs: TPrefs): string; procedure StripNIIVOIExt (var lFilename: string); procedure StripGZExt (var lFilename: string); function FilenameWOExt( lFileName: string): string; function UpcaseStr(lIn: string): string; implementation uses dialogsx; function UpcaseStr(lIn: string): string; var lI: integer; begin result := lIn; if length(result) > 0 then for lI := 1 to length(result) do result[lI] := upcase(result[lI]); end; function FilenameWOExt( lFileName: string): string; var lNameWOExt,lExt : string; begin ExtractFileParts (lFileName, lNameWOExt,lExt); result := extractfilename(lNameWOExt); end; procedure AplhaNumericStr (var lStr: string); var S: integer; lOutStr: string; begin if length(lStr) < 1 then exit; lOutStr := ''; for S := 1 to length (lStr) do if lStr[S] in ['0'..'9','A'..'Z','a'..'z'] then lOutStr := lOutStr+ lStr[S]; lStr := lOutStr; end; procedure AplhaNumericStrExt (var lStr: string); var S: integer; lOutStr: string; begin if length(lStr) < 1 then exit; lOutStr := ''; for S := 1 to length (lStr) do if lStr[S] in ['0'..'9','A'..'Z','a'..'z','_','-','^'] then lOutStr := lOutStr+ lStr[S]; lStr := lOutStr; end; procedure StripNIIVOIExt (var lFilename: string); var lStr: string; lLen,lPos: integer; begin lLen := length(lFilename); if lLen < 8 then exit; lStr := ''; for lPos := (lLen-7) to (lLen) do lStr := lStr +UpCase(lFilename[lPos]); if lStr <> '.NII.VOI' then exit; lStr := ''; for lPos := 1 to (lLen-8) do lStr := lStr + lFilename[lPos]; lStr := lStr + '.VOI'; lFilename := lStr; end; procedure StripGZExt (var lFilename: string); var lStr: string; lLen,lPos: integer; begin lLen := length(lFilename); if lLen < 4 then exit; lStr := ''; for lPos := (lLen-2) to (lLen) do lStr := lStr +UpCase(lFilename[lPos]); if lStr <> '.GZ' then exit; //showmessage(lFilename +' ->'+lStr); lStr := ''; for lPos := 1 to (lLen-3) do lStr := lStr + lFilename[lPos]; lFilename := lStr; //showmessage(lStr); end; function OutputFilename(var lDicomImgName: string; var lDicomData: dicomData; lPrefs: TPrefs): string; var lFile,lStr,lStr2,lExt: string; lAppendDate,lAppendAcqSeries,lAppendProtocolName,lAppendPatientName,lAppendFilename:boolean ; begin lAppendDate := lPrefs.AppendDate; lAppendAcqSeries := lPrefs.AppendAcqSeries; lAppendProtocolName := lPrefs.AppendProtocolName; lAppendPatientName := lPrefs.AppendPatientName; lAppendFilename := lPrefs.AppendFilename; if (not lAppendDate) and (not lAppendAcqSeries) and (not lAppendProtocolName) and (not lAppendPatientName) and (not lAppendFilename) then begin lAppendDate := true; lAppendAcqSeries := true; lAppendProtocolName := true; end; lStr := ''; if lAppendPatientName then begin lStr2 := lDicomData.PatientName; AplhaNumericStrExt(lStr2); lStr := lStr2+lStr; end; if lAppendProtocolName then begin lStr2 := lDicomData.ProtocolName; AplhaNumericStrExt(lStr2); lStr := lStr2+lStr; end; if lAppendFilename then begin lFile := ExtractFilename (lDicomImgName); ExtractFileParts (lFile, lStr2,lExt); AplhaNumericStrExt(lStr2); lStr := lStr2+lStr; end; if lAppendAcqSeries then lStr := lStr+'s'+PadStr(lDicomData.SeriesNum,3)+'a'+PadStr(lDicomData.AcquNum,3); if lAppendDate then lStr := StudyDateTime2Str(lDicomData.DateTime)+lStr; lStr := lPrefs.NameAppend + lStr; result := lStr; end; procedure ExtractFileParts (var lFileName, lNameWOExt,lExt: string); var lI: integer; l2ndExt : string; begin lNameWOExt := ''; lExt := ExtractFileExt(lFileName); if length(lExt) > 0 then for lI := 1 to length(lExt) do lExt[lI] := upcase(lExt[lI]); if (lExt = '.GZ') or (lExt = '.VOI') then begin lI := length(lFileName) - 6; if li < 1 then exit; l2ndExt := upcase(lFileName[lI])+upcase(lFileName[lI+1])+upcase(lFileName[li+2])+upcase(lFileName[li+3]); if (l2ndExt = '.TAR') or (l2ndExt = '.NII') then lExt := l2ndExt+lExt; end; if length(lExt) >= length (lFilename) then exit; for lI := 1 to (length(lFilename)-length(lExt)) do lNameWOExt := lNameWOExt + lFileName[lI]; //next for Unix do not use UpCase extension if length(lExt) >= 0 then begin l2ndExt := ''; for lI := 1 to (length(lExt)) do l2ndExt := lFilename[length(lFilename)-lI+1]+l2ndExt; lExt := l2ndExt; end; //length > 0 //showmessage(lNameWOExt+' '+lExt); end; function ExtractFileDirWithPathDelim2(lInFilename: string): string; //F:\filename.ext -> 'F:\' and F:\dir\filename.ext -> 'F:\dir\' //Despite documentation, Delphi3's ExtractFileDir does not always retain final pathdelim //ensures c:\temp is returned c:\temp\ not c:\ begin if DirExists(lInFilename) then begin result :=(lInFilename); if result[length(result)]<> pathdelim then result := result + pathdelim; exit; end; result := ExtractFileDirWithPathDelim(lInFilename); end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/extrafpc.cfg0000664000175000017500000000013011316131074021461 0ustar michaelmichael#IFDEF Darwin -k-macosx_version_min -k10.4 -XR/Developer/SDKs/MacOSX10.4u.sdk/ #ENDIFmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/0000775000175000017500000000000011660470014020627 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/saccades.nii.gz0000664000175000017500000002003610403565532023522 0ustar michaelmichael‹YыDsaccades.niiьI“уVrЧ1ЖОљ#XG;lOŒУЫСŽ‰‡o$@ЌФћN‚ћRdэU]ъVWKъVKВЖфbл1ž“o:јцЏр‹Яў 6ШZI ѕRн•?…КŠ ’xQxљ™/ŸќБzнw ]gмhл]пБЛгnѕЛШ]фw‘ПB~ќљЩхЫќђћ‹ŸП@_ўђцџљылќып јЧ?ПzѕЗУ?њЛляўпхOšРІЬюŸ9~дЗЛЖѕ7я ољљ;ёгŸ§х_џщ;aђыЯХя]ўœЗsЕ­ѓі_ёХЫлўћ‡х§а[Џ/h§ЩŸ'џўСС‹i'eЉМюмN^w (l#ЏŒбИЛyŸU§i,5Т5GХ‹ €lj4ЧTЉ"ѕ:%љ=_ѕ иА гю?x(ўdКЕ‘ЎёЮўЬRЃн“у‘!0дЕЬЉeэŠuЛлqD}єб':Š #ё‹w|.KN<{Ђ1šЋ‘˜0ќђл3nО ЅyйH~Z ›ЦрЈЅйж|gњ№‹ЩUЛDMгQр3YНй ЃЦЂѕUўzk• i‘чъtЦБЊЌЊ3ы›1F,У&“ТЏ‡ьoјХ!0€Л—ецОŠО€зF•,nSЁ.\ьъХKbуГcXД&ZvђЋЄJ8‚&@ЫБ’н„+qSж'‰Ў 'УšЭn |–Qг•%іnSёŸžŸ6§0ьXuЅ=Ж:+Hв›uТююСŽ%{ЧŸžuEUTY0њ‡ГРр83ншш=3›ЁЃ(сљW'Š2‚$ jkЧвtН•j-ЁТš–"HољЗ‡‰`ЊБЂ,6ТЩXc3JUC”˜h'9є­Хgжb[…LГЁЫ$Щ(—B5ŒVS]0”ТbЄDa„u)H%Pз6V*ЄТб"’ЎwYпTc)4л a§ш›ЙКy‰2-Ђ`ї‰УF{с owЌ~ЧИr*З§@yЫ”’ŸMOœлVдЈйЯмYЛЪUV!9'Lœy%ъї-šе ?Вt'УІГ‰иыЩъ№xgЇiE{П~ЌЪQЗЉ‘„ЊЅEЃ@еќ‡]EŸ=9žХQ†–wђp в”x †у§'OюxВк;?lл^dЩŠе{џљHе еJЕ1кЛгvГх;ZЂдЮ&:ЋО&+ооS=5ћiзUєа%HQе5Y'N!Ьае$=оYо ЌTБЫ FYAфВ5VžKŒуъМa)ŠЎыCЄŸVЌи‰—„cШ5\‘9ŠЬњ‚Ћ’*TЉхwiКŠ)"KxЁрJ7ЄёtБOuљuEЖ,ЛА,ч7Фslю…sЧчlъЮИkиFyGч9„6|оНD5%s_eЧI<ђЦў$4Т8љіу uлqє Ї7Ї*qˆrИпЖ\щz"_gh‚–3ŒТЖŽ!q c“гQKf”`ВЇрМЬ%ЇгѓТtЭаtЯЭlAьc]1LЇчI~Ч­c$ЧЇ*^j8_џгYЧiHf'ЖTгKd†NOЇfдuд@ыД‡ЇГ‰kY†Ђ{–,yУQdjVч№ДћєМзoЅY‘vьЫ‰‘lKтxŽЄэбИч)Šўх}п1RЯЊZONИBИ=уЂљЕФ”Љ+Жэ?;ГЄPZaіІЗУn˜l(Ђ5lЫ9БИR эЅ-ДШ2’ЪйšЃ6–ENбšl5œЙмЛTEй9флЌїH$†љ€Зє ЩLоxАŒ”Љ\PМш JS&B‘љ5()Ъ4)ъvшї`z;m[тнЇЛЯЮЂч“VаФ—–о{зч(yєєыЧ!АGd ПЫУБ˜X (b<:Zu‚3Ќ ЋзkLте’щ eUsЎКЄА^ <‘fш. •јзTњЬзiЁтŽ,УQ?hˆсIK*ЉfК~EЩhћAгБ\гrн/6žфEбэ ђГЇНд 4.lw#ЉІ4c]U•:ЮЛˆ'Vm+ў—чЧQъБ‚І=џ:™AKЄhЎN+nд”p†,ЇЧQКНИŒ#-ЙО8паEЖN`Мcy§§УРP„,1™0›.Ф*\ЈРКую№СР­чC†Ы:TPhмЕГ„южŠі#ВТEV~њІЌh%‰#ХўІСЗъ†зP˜27V"ЏоxФfa“ ЃыRСdŽ.šК@omW­тŠo жєdЗяn?SƒшM[эй{ЯŸ?мLТц.я<(ги?ощФ§щёљччѓmbіёЄжФKœeч[ƒ8є§ А5g”H Ѓ™)iIœ;МШ6њm?lFОžМžЫЙ‘œhzВ–,-dƒф7єаѓк§^лI6P(RD ъЉўŽпђцS–xпw4Eѓ|Чoкє<№EhђЋџ=5гкœœЮ\Ў‚ЧCƒ'XЛ3OЅCЋuљўОKi‡ъ„Tђiб€ЉБbr~DђѕЮsйа*R;8йiZiZЈЂ/%_M ЏЁЧё‰X`Э:ŠгqпU;ХшћRG“"K%WŒn$…ЗvCІ–sw\‹š*Ж8ђтЊ5b7ї6Tв"nŒ“#гэJй6П‚pїaE˜hмCФтQЁ*kл‰Яцd3­ТKœdШДhE‘›ъVЇPaJ1EJž|x6ie–Xƒ cGѕ~ћйљƒЮІ}ХіЂ№Ru:qмъŸ>zјјљГЙЧœW!8n_ЎсЦ§ЩxаŸь$ЏVцИ*Св—‹гTХэЇ;ЬЭ#Hš”9§C•/>ЏJа4ЋЦ{GяžE6wхх RsљДx[ЮОˆWqБ9=x№h|!Iя^ЖІИцBяфdЎбNЂбУЮИ­cдŸєвц%‘СўBjr‰’dUЎЫ–#"1Ž&Ё›Њ.jKЬчеdђ%ЯУeЕE0­о ee›Њош­ь@МБлщфк­ћеsKо•B%рЕQ)^фƒU0}XЇФDŠ/1}Хз ІЏvёЬ*2HQuEЉ jаon­Ox]фЅzn4GгЎВe‹БМФуеКЗћУииф‡^=G]bh9ьŽfЛЛY5ЏшL.5а%YїтйщЛЩЫ0GЏё§ §„0’ЄшЖїwчЂ r9Бў4Џ0з%Ÿ1ОсEё`:эЙsЭRХБц'щйZRуFZqюp<=9пo^wдГвмЮnp}PЮЬŽ?ън””nюэЄ}g§ѓ“+…„qrДћрЩIx#Iмё -О#u&—эЎеyV zгЁЫЬƒ/‹mA7’гЎЦ^~(Эд’N–[днЛьmуЉГ]YPœЙљьЮQ~В[*aЇ„лУцwŽRщ„ `мV‚ЉhV-ћeHЈЭё‚x3'hёИЖjЙ~сљŽќШ+ЁŸ@=№cЉ\ѕjEz7ЧћгОЦnыST%vЮЈђA0lo9"_[„R0šV'Ч{—ЛГf_> КŠTH†nLNgУ5ђ:œG{Wg@`ѓш ыюv_Љ›у] G“ЋФqЅxйяuчсизЌНYКg^?цI–tЯї]}~+œмzіЯnšMUПvM*ВыћЩ84ЎЄ{№нѓ4)Єн„ТH=ъtЦ‡;–xе™UлЇџІjšџіеUЇZWќббйАqг•9эIЊ:}tЬV%ЄpКЋ7_ЌщХZZoШ- $Œ•%сц4ЭЛЕ^oнAœщo2М‚Єт^t E‰2Г8ЉАL‰ŠО$о Д(Ху@R*Ю UM6 kЉ) љˆAёЧјГоw˜rу{WО,ІЮŽШG‘ЅhGн4–Гвй0N+оoЫљ§жmyU•š;5”Я{РžŸHь’›йEPнЊgЮ?ЉL+oQњМvзmЙЎ—‘oXY~ƒdyQ^4LuЌЮ{џ˜^gŒИе4”р зk\u1UчГяЯS”шцwZ1н8VЎЏfунг‡Љ%ф†Oo…ka†JЪЮ7гm№$ЩНnж}дЬw-%жEеО9йU2dƒvћвВвИёHšШ˜СГ\ю Ї–Н‘Œ/ыэЧПTJ ЈƒЛМвЛ!,п“OЎ ^‰лДђуnэRЛ„\lIЕWFЉДеЛy*/C/žЙР0ІI—KvкєЩЂТ„”NTъФvсAykчАээбИё~`n7Ћ&йљJ^(Цm;№v3эЃ‰mЛъm IpЏ`ЫTцPзжR‰^уpuha‹чЛ‰с№ŠйжgПMЪlQ;Њ;K[:Г–џ9бФNДммщJтѕГ§YзЩдв”п9а эсЭq‰E@ˆ"9a0ѓИK@d(Ь›МRRm‹Ц+жЪ‚нм—p&(!€W CХљ–* ˜;УШ’зdM%ПxЗЕз1˜ЕйкЫ+KЦNwRf№нc/OAxiyprаЮЅiWГœ”­›Р 4№šЉ dЉЋo2+cМ5алоk•—šgUцУ)m )ДЖ<ѓVayЈ4№ъбJTЏmЙЪЊЊ6дсъѕНЕ# \ZѕГіяТjч@БF+/–д§фas­з!$3Ъ›ПЯЮДЕ5УЖr6=mFъ_ *Йы‡€W VУЫ‰‘к+S5•ћъ)цшЬрЅVД(ѓЃ|™я)Еђ–CБ2чa–)ыEтю,jqїчЛcsхСN 7йœ<6VЦвшŽ•/…ич Œ•оs51Зц—єЭљp­ўЕщiљ… GўZ„JюДђWХ1)зЮъњЙFщWœMЁRІ4dRJдTяЋ@yKИыљЖЅrЦ^Іђр Ђ №vQЂ'|hЏVдоlЃ…ЪŠЫD57Ѕ’IMkM ш ›?F:шkqЅ!хч't[Э5­Ф;ыл–0эuЉTе^ЎQjJщ–YЈ†ФrрХEŸ€{E)џђўJрярm[г\›чЧдЩЕЎ Х№| йЦš‚Aб Ц§ЁНКфЬќ5gˆNД"єо)”BEіJф\0П <лhМTєНд:gРн ”$ХяФ"kь›\€ VJ›7žыЌЦHlSqˆЃнСЊ€”е<РUм–Зš“.qёФ~СШЯL…b`ё~PЊ‡…Ќ5р­ЅдœЖЦ.АИм5~\b Ъ/БИ4,YќЂ)З:”’_Я)ўnЌW оFЈЅи!o> FУхб6f№бнНЃe-„jЮЦЮLш.їЪ„юmV5јэSЊ!X]W >Аёy%ˆ2ўЌ‡њVP& HQojёЅЙ‡ыjрSf ›їœj†жЯHnБ•’“mИПшйl=,ДёAjя˜0ёB‘П—DЉ~Ъ€@inЏЧА­Ѓz7„'ЗБы=мЙЭр ЖеСШЩчя_Ы,ЦЈЃ5z‹Љ8жч{зЭ3\QRЗvto>юГЎЎ™IB?T•ЭђnŒчш:3~/о+Џd­/ŸгѓЋŽ™UV+гЙЇz;~ёaKе{ЁўZцњqЛй к00zЉЪlY”КRїн]Ет6JЋI#еДЧs5GXс<^ЅєЕ„фЩПAaЭоjёž-Цо­ƒцІ]р.уЃ№ŠiK0GЎxщ@Бц–9ФуЇmѕђPб(иnдƒџѕogЮE`œzќщ‰ЗUа…јњЃЩeэnњгџќfфHлŒ]MтЋибўŸw}gЕГw]šЮ~ї$vнmІ‰юѕsNpуІуœ“TЃ%ГQТa|i#xБўб•2ё1ЖL^К\ЕщмvdеЃЪЖ{“(cњB-SОЗ>zOћш˜йЭ@‹ЧT$Їй-ќ`УЮxѓ~Љ:Эm)'xяѕЈuй“gДт)kœн4иК"ЏпykеъDW-Ѕј`˜Rg#tXj}Й6@YJiЈUРЋЇц{Ц•/>L[5 х`жНа2ьбзЯ[лuП§тƒймчЊ†ПљЏп>йЎ';љњћ0?RХџю‡_=шхзœЛ€zі§oО4П Чп<™єЂ-ЄPуУџјъВH8й:;› ‡[Ќ_фœ~]ўZw{ЧgGЧ›+еaЮ4Иzм3†3~ђx–_=bёщІЧ_{&x]ј›GђEѕџл;ѓчФЭ3Žѓїqи BЗФ}#nƒЙc|b|ЌнѕюzdвtГйNv{Є“4ЄэДщtІгў™Lћ7tZ0^{yx’&“}>?йТЏ%Ы:Опчyоч%ЏwХ r)..z­N›ѓК3гx3чг7D„еšoЈ[Л•Ђ b/5œТоNah­RDџk(нФOе‹шЉjLР=й*u$ЂдRюЉ5єфЯšужжOъaдХ‰›qcЬF"ь‚мё"м$:Ьn^іU ѕ!“Џt›^ѓЗ‡јqT§Я vгcbfUMт„JЂtн|"|b~7”R2lНБй—gЇъ­Ћwъ0^‡Iч›п Ski—лjІnоПSž825Aкf н€Дбѓ’›fyяPŒРРBА8]“љЛї›3rž|дк&•{їЩеаLяgэцп>= 5•ЇЕбЉ$gщ Œ?:+щсa:3еfm)8нсМХНкЈNCюЮе;ЋэњдNu26жкHŽdбКЎЅЉnбщћаŠWяЯЎ1IЏ” ўY,Ёc­Ш(6Ш&lЦqчpQ€ЅЂœтbвЧWV„ЩšбХ 7‡—­ВIУ№шкvг‡8†P'KMR{њRЇE§НŽNХ>ё_l №7EяdЉЧЋ‰a*ѓ#ЋПќbЦРФ8ЧwZЩі“C1Š(Xќ7N“AЌєЫьbXJCЗoќCјXvш…&ч'єОdœЦиjу†тwЯB„\иЦnЅХЗ. лv™gLzbЎTЦuZк—іšMsцe†`<ь™?СƒёЗИd%јєј|\E #S—Н$yа>Y“l>3лJЉŠъЧ§fm чи@ЎY ЯђzжЅvтсЁра„’ЅНоJ(aЯЕЖЛAћ0/D”зЛGћ7еШлш=•Nw#jgeƒ}–іw^|ВŸRjЄ.›йtХЯ '§ъ„гgП§r3d•{Ж– ѕg ТЅИ#о9|ђЂdqf8‘1 ‡' СЫ†МCЎ .дКŸБ„:"ёe{­З›хIУHИЋДZSb?e плFяJ—оъі—!cТ ЦјMСl-—jEхЉt›Ы‘Kы А„сГЈp_ux‹ЎZ-/иЏ„ЉZ=џFСњјЩ.DуnпНз№\;ЛфХwЄ'вLZ:ŠЬїї6Т“н38> љ&|ІŽфд9’†_ГўV/љѓQдЭХРЎH§цГт#ДЖхNVЁUС,мœѕ"^ГwпРјЌpmЋ–Ћ"6жЌГ­џъєкfSPh%Ј‹>^/ѓ8лў№§k– ~}Р*rђUЩTW2ЉJН;ŒТsїE'цЖPsхр(ПзЦњs•(;G‹kЭ№Ђ#МЧGЫСyіuŽJ(ЯўЙdaт§?nДoТ~жŠCq}9SЪc’K7вSЫD†X лїк…в@LгеЕг•Р Љ$LЈьО<ЉdЉЬЙs|№єНещћвpЅ•ƒW‡­ВEЁфVW7|ёЊщ›’рЁ*еЕюоisЃd’)Ы…ЕЇўЖУ1ЂsddѕуZscЗSь%Е2LДŽ>њ}Хц ‰ЭMс>iЏЌ•Т™^\-Uр”+QэD™РЦZт,V_~ђўщŠЯь hbMЅ7YеОзШяЌ8PcЄОўёу–уBžЫ–ещ|-NK7<Јl]mлыю7>DaŒе)ЅW( qЩlЏ•Œ'Ўь•*а_}ЅЅŒ“Н$]~xT\O4ННiqOŒВ›7ѕђЬфьцощ2“іЅ /P6]šџяыФфE| ће{ЈŒ‘™ШќcоEБ0ТdєБ­§kЯšMki†Ёƒwўњ—фјжшrБ‘CВцšqЪVў№гqЌ‰Tю~vЂДˆt йО—TKTЎ =–ЖТ|ЉюуГВѕ "ђЫл/~Й ЗКœŸіvb3=j% –ŒQЃ7 O‘§{?=г Сc]zйЅбЫЬ8hHcя œћЂ’œDН3Lпb/ь4RIЇDb*эR]s5†1жеЯчУFcЈTпмЈg§г'С„—/Z…Š_oŠ—гЃГ;ЉiGЈ„ѕ_Мъ/uы6ŒŒ.GѓЧЏž%щ)ў)нˆ7ŸьхВw ff„ГЋЛ§ebФ‚вЖњzqчlй“=Ю Є;N;“ЕF'Ъ8b"й8,uјхїТ–h|8љгщlёjOА8г"г™ќЅЮЧl ’…s]S ч–FSxE@9<§RФ­]+}Ќ9P^r•|ЃЮ;ž.ё:ТpЅ>1oртїуFѓфК"йЋqФФг$U]“{PaЉ­Š!r#Ѕs–zђџ‡Р-r5QФž€я†ŸЛ–>9 o ЭтеА‹Ие—=ўќыcлLщjЃšCпИJgЁѓ.нžлЉЎџђчEƒŠщpНRЂOdxеUК)XnД_?ипHЁdчзф†у$)“ŸЯм[pGcn_JX§гіŒM 06le,ЃV&QЙ3Їj˜ЙZo=Tцš\ЏЖмb2МsЄЃхŠLod0‚лщ'МBj VьžtŽgfiЦ=xйрЙtBТКcЁьўfк5ЕЊg‹g§„#^ѓшP)“;8mјE mюфJ)ъЕyЕ† чђЭV)j!E›дЪc[•юa5”н*йdjГGX*VJ~‡YL”ып>?ъчќq?‹ ­Aљ эFœwаш")зњцyЦЌX$ЮГšТj–їЛXw:„dq™љЬ•ЈQ{F Є5 Ё’+&#Џ+’НЩЮШLvaеˆ`U‚†1~DЊKFчі I”йKьёЗZјў0н"улкК^В8ептювЃWПН?ЖХr™ˆHlFiпм(ДвКВY–rЇsќх?lЈч„"КnЧЙZ;:|$,ž7tdън­їўѕяпэŠЯФ1sЃ  етp] XNH•—7ї§тихС ЮX9Џ‡”Ъчš“$зXВељWО6жжoБŠЋќ6+ПР;F=g3‹cЙ!В<л]яD`Lžь@X;ќѕЇk3Эт*еˆУ“‰KtlЁл?ыeќS#Аэ Љфj7Jщщ№jЋYЪ’ЈЬХtПUює[ѕV-L‘fG$Mч%TWВ ђџ9­fйœЧЩ:ЦN›бx6ч]. Џ}НыQ<žZ*ЮржЊ=Сxh‹ЎbQ[Ќ<)ЄFыШjЉЕД-,ьЕ™=—ЧЄВйнЄH†@И8Ейz^‹6™RTп9QфPЯѓ#ПEџ1Os7?ч]ъюЃю\ж‰<Šою Š sUЌTй<ћѕъe(3J•Н|ZЃ"КИƒ67гCЫ-Uo“+š_љХ*тGh‰xЯo$)6АB f{ Й” 'ц*Г4SЌзožГOЕJcŽч˜ŽtЮ;[сџgјзŸЯіƒъ`Г]H%Ђ‘У­|ўГ•и c0&КswЃ’р$ўtЙK S ьe„/yєтN1 ФЫЅŒ›їxУТ”u Упд]F:гђК\Ўh­ЖZэЧДRСРўв@Є\И’ нEжыд :‡јТŠ8Х^fJфІ7Ы@rЉHnЕnмЛ(.ІœЄбYd:KcМUЉ Ќ—ї“@u sЊMnЯ=‹Nфћљын ЬSŠh)Л'БД›З^(…ЯЅHБі:5a‹6ŠЃ{ЯЏљEТшJч‚гŽ˜FF‡ЇцИф‹j=…hЮ€„Ф1|юеЌєzB;џНЄФОћE˜јС№>ѕ'}НчНlР/‘д–sСа”њ•вш\Zі8мЩgћcІizъ˜†_+•гУњGтЈэдъ z§Д:AБсКі8N–lв4F‹ъ)іiQsЅхњ‹ЅwЇ­€(ЗWa3ђ?њп3KZYmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/0000775000175000017500000000000011660470014022303 5ustar michaelmichaelmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/continuous.val0000664000175000017500000000052410513212364025214 0ustar michaelmichael#Version:0 #Covary Volume 0 #Template C:\template.img #CritPct 16 ImageName Cancel 1.voi 2 2.voi 44 3.voi 22 4.voi 24 5.voi 23 6.voi 22 7.voi 18 8.voi 12 9.voi 15 10.voi 41 11.voi 32 12.voi 22 13.voi 60 14.voi 58 15.voi 57 16.voi 57 17.voi 55 18.voi 56 19.voi 60 20.voi 59 21.voi 57 22.voi 58 23.voi 56 24.voi 57mricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/binomial.val0000664000175000017500000000047510513177210024605 0ustar michaelmichael#Version:0 #Covary Volume 0 #Template C:\template.img #CritPct 16 ImageName Cancel 1.voi 0 2.voi 0 3.voi 0 4.voi 0 5.voi 0 6.voi 0 7.voi 0 8.voi 0 9.voi 0 10.voi 0 11.voi 0 12.voi 0 13.voi 1 14.voi 1 15.voi 1 16.voi 1 17.voi 1 18.voi 1 19.voi 1 20.voi 1 21.voi 1 22.voi 1 23.voi 1 24.voi 1mricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/9.voi0000664000175000017500000003515610654601742023212 0ustar michaelmichael‹9.niiьн_Ž,Эзср‚eј!‹ С6И1‹blфaЌ`жТlРЛ`+м$owWWхŸˆЌьQŒпЗцy,ћtзy%оPddVTIёŸўfšўіўђЛOгяџюЯџЧпџз?џнŸ~џЗјј§ŸІ/™ўхєІџћлџціŸЕ1§ыЯ?џчП_џwы§Чіы_цлŸџ№пџўwџіwјoџхџљ/ш§У?№Ї?џщПлћэoўедяYОўПџК~эџ§u§Я§у_џУіџѓпќЛ”џŒЭЃр ЭЃ~nўЭш†ŸšЃ›ЇРфШцяшЌђљntЩˆОŒшЫDFO‘бЁЗr ДyžG'ќа<‡6‡EЯбѓнш’ѓ›ЇФц)ИytЦЯЬ+ЃkN}™ШшIєELыDFg>~DО ј˜ p`ўЭш†Ÿ™ПŒЮј‘yЮЋŽnЊžчМъYєEцРъUmZєїЯЃ{NYDчЬyktаЂЏђ[e^єnЈGїœђбЃsNŠŒž›—еЃK~"Б9Ењж=:€‘цЃ#~džуšчЛб%чЭбѓœW=FЯoQНm§ЋьЂЊїЭIбпАн”Ё~tЭь9-њW}•ШшШЇМЬшШw.™язеЃ[Ю‹Œо>ЂцˆŒ~hў2:у'цЛб%ЇЭйЭ1бѓœW=ЯyелfбПШЎ9Ё:1Кб,њ—hE—Џ^UŠў…™qг#rNПAєшІЇD_Fєe›3Ѓ#п#N™oЧ7еЃcN‹ŒŽмЬћи @ЯќitХOЬs\ѓќ0:хЌ9М9%zžѓЊч­бA'ьš3ЃыW7šEџ ­fбПB3Кxѕwcdєуч˜шyѓkFtтœ§ыEFGЎгo=:ъ)б—‰ŒЮ|“ИЋнsRdtцЦXагєZdєіAŠФfјчlў2:уц‡б)gЭšЏ0ЏЮ9eŒо6GTяЃыW7šЫGЗšEџЭfбП@;КvuЇYєЫ‰ОŠшЋˆОJdtфёЂGW=љvыCdtцvЭДЩsZbѓДШђ#‘бLпбЃ+~*Б€ŠцOЃ+~bО]rк<ЧEЯщЭ!еѓжш vЭбћцње­fбП@ГYєыЕ›EП^btЇЙvЕшЋˆОŠшЋˆОŒшЋDFG>1н$6Oльб5g…E'fEяЊ‡цœДЋZsжН2Јy[=ВфŸ"Б€šцпŒnј‰љntЩis^ѓ<чEЯyбѓЮшЂчіЭе‰б­цъбЭfбЏзnŽŒ]uЌ3аЕЋп)ztжЁо@—Ў}•їŠЎ\-њ*Ђ/#њ*‘бгW^XєЗФцАMІEcNtГzlб‹ЪЌшuѕаœ“–)Эгgътч!? @„y]№cѓ‡Џ?FЇœ5/Œn9i^sЪМ5:ш„]s@uЃЙ|uГYєыЕ›EП\ЇYєЋ%6‹ОJbѓ{E—ЎюFWЎ~ГшТеЂЏ§nWтшВЗМЌшћў]lєвМтЦoeЭэъСUЯЌЋ3š7›МЭЮЧъ7КшŒХмђ!Sb#2:lfїC=Кш”эPю9g=дЃkЮZVnљЈљќ=U~kР‹ЄРuЖћ—ДщЇmrDє69ЁКб\>Ке\=Кй\<Кн\;Кг\ККл\8:Б92КпœНzu`д›оћЅЋЃМёЪѓу`F‹~)бWIŒ>n§:ндИшyroyЙ7‹]vфНЂ+W‹ОJdtц•˜Й—Йcšљ!РлDgVNzюQнЈ]tFdєЎztЯ9пБIЭSф7>$6OЕ7ix…МxГŽIџwИ{уLњбA'ьšыW7’ЫG7›‹GЗ›kWїš+Gw›EПVПЙnєAsdєшДЎG`NѓђIt•[9К?1 W]†eЋЃ›EПŽшЋєbЃПџbt]Gw^$FWnŽ|Ф‹|гђn#Y=:э@bѓtєцЅВї‰ѕ”шЋDF'~онЈ]tТ=5)z_=:ш”Рщ1mЋGзœ•и W=:ы‰Фfбз}•ШшШЖ2ЃїеЃƒЮˆŒNќŒyкVЎ9+Б9ёЋŸ2ЋWŸС„Il–цЏ#VGgќ@оЉСЧ3'žоНkЎНOЎ_нl.нnЎнi.нkЎнmЮŒЎ[}а\6њб—Н§Нtє&яіcэцць˜Њ?PG]7+ЧёzWЖ;1њИYєы$6=HчEWэ§75>МYtсъƒшКеGбeЋ#ЃCЋЇаХ:rS,sћQєu"Ѓ›еЃ›žz—шбI'$6ПGєшžsо!:ГztЮ9‰Э‰_ѕј”YНћ &Fb3А6/ў7ФзбЊYЌЦtxNњ.9 Кб\>Ке\=Кй\<Кн\;Кг\:Кз\ЙКп,њЅv‰бЭРшцЫ#zNЙj§Iq—u§н„­_zб•ЫлЭХќ­ЂK/yGc\Е9ђЁД?ЇG‡yЏшЪе§шТебuЋЂ3ЋGЗкЅцU/^нulS1в‘лboіІЖФцЬO/D_'Бy=Кч”ФцЦsS‚ШЁŽŒо?Ё&HlN­ю|n 2XI<Ѓєћd嘺љvь#НМХЙЛ1Gй.8‰žF7=Гы ˆnsѕшvsэшNsftхъnsсъƒцŒшЭЏeЃ[‰AбїІъЭЩ1:ъ™А №KbtкRїЉ]Иќ(КlѕСє(лљ€зkЮŒЎ\§fб…ЋЂUПX#ѕБЃWXk|ЫGЗЊыuу}aѕY§a[]ўRќ”Ж~|ŠŒnWŽz*2КU=:щЙФццНОФцц3H}ЂЏ9?"ЃЗ›е"Ѓ›Рд—Y§шнёs‰Э№k$žR—М: 6Є|512Ц{sTpФ,йœ%1ЕчІбUЧкЭЕЃ;ЭЅЃ{Э•ЃЛЭ•ЋЃšЫF5gDoџFЧulš;бЃЋžhЮŽбQO„]€_њб…ЫЂЫV'FwšПпŒЮkыEЯ‰#=W~Пеž#ЃЇGсЮŒоWяvmjъF;–2-жZбѕлїб #ОŽ˜'YkоЗШшfѕшІчD_ц=ЂG’имИ/Hl­}™ФцЬшŒwЕ;сеЃC~*Б€q‡gžЎxЬёВ7Єz=Рбыi‘1Aж“9cZЯMЃЋŽЕ›kGwšKWw› Gї›ыF4з­NŒNlŽŒоDF4яFo?дo^ќ9ЭWЦ–hЮŠЄй‘=UЎюqntЭъУ)]ДљYtЭъwŒз&њ2‘бSцлк)sзЃQБЙу€ЁоНЭŠ˜ aon"Ѓ›еЃ›ž}™їˆtJbsШFо–шЫˆОLbsfє^=Ку‡›H‘wцgр‘С'JЯЃ{NXЖІDo‡9 К•\=Кн\;Кг\ККл,њЕњЭuЃšEПRbsdtbѓєЗЌЌ}{DцDп3цGГЕxєНnНсвCн‰Ў=?D_EєU"ЃŸUЮыIlЮ|‹˜Йы‘ЙПдЈ^>_—еŽNЋŽ˜ эъбQЯDF'~нЊє\bsфЧˆЛшб9'EFGь‰эEF'~s"4:`wКEєe"ЃcОV@ЄМ3?ѓNп <{оtТЎЙ~є>Й~uГЙxtЛЙvtЇЙtuЗЙptПYєK4—Nl~ЗЩ1:­/6њ‘>ESњKGншУцЬшЂе‰бOš#ЃGчЕНaєшКŽї‹з“8вЧЭЊ_(2њъЂб‘ыЧqѕшЖОФцЬ ІЬ­МаъШшШ§щ^ѕшЊg›3?мЪиФлS}‰хоtLѕ­3/z5кЃƒNY”цDoЋЧЦœі˜ѓ”в<Ѕ]†w™еQ—!yђN§L;yк”>Кц”yktа ЛfбПLXѕW^Vє~fдоЧжnoёцvєTћœєЄ‰ќэЋs^:џб˜Гzl 3Њ›#\<њИYєы$F?i§2‰Э‘ оqєшИžї‹ЎZ}]ДњItЭjбW‰ŒЮМ3WъУъбmG"Ѓ#їђD_'2zYНнП)l5О!Э›ъђлгпrцђR^ѕfЛwtЮ)‹ЉœSНY7’ЂŸl­9+h€—2ГЃцѓCжтq—Y}ыРЛЪ;ѕsqІtJѕ<чEЯбѓжш ГDџb‹Р˜шFcљшжаVnЯукЭх9Њљ–]{vь›?z‹ЏЭштkоQsйъФшуfбЏ“§ЄYєЫ$6G.xЧбЃуzо/Кjѕqtбъ'б5ЋE_EєeЖблMˆцOнъбa‡"Ћ—™)ЭнЁѕDЛztе3Ћацэ&uFs{kН>еWИЅFUпSѓЂCbяВЋe_ ч™c%чo%4Лѕ•x™М3?ѓN*WFзœ3'FGŽєДЮнђдЃ0ЈyйQм>йИzxkFTэжХW~ŠД–чъбѓ^љуЛЭѕWНЃшЊе‡ЭЂ_(1њИYєы$F?i§2‰Э‘ЗУШUњЃ‹V?‰ЎYН ŒnUюkк&FFgьA>ЉзБkLˆўдъбa‡:еЃГŽu&ШшЌ'кеЃЋžYu†4ЗЊ3М+ЊЏАКЗœ{“В.ЏХмNVbnн+™еЁйЋgвœєyž#Ч;Г:яn@–Иу3*M<6ёл91:rv„]†ЦœъeeJѕК3.њГ4Ђzюv л\Й:1њ ЙnubєaГшз9n§:‰бнжРшШ‘.нyg‰\Ѕп1Кhѕ*0Ѕz˜=7^Wv ?zоП<0­Џ7…KG?ъa'DFo+ЃkOщ‡UfHskЛwlЯ9вœцGkRѓ”ѓ)РFTrLшBдпDЮфтЯЂ=быЦ=;$~U3фѓкшœГ"ЃУО<Би @ДУ3Я) <[5ёлШƒ#ЃЇФш9lЈЗН еэцкбцвбНцЪбнцЪе‰бЭuЋЃ›EПЮqГшзyЃшћыЃѓšњCœ]И9ђЮђ†бUЋ—‘бьбymНР”шЙёњЈЌcНЩНЏжu,2К{-жŽў6в7ЋЦвзсвЂВіНeщQ™гќˆjNy№иˆŒЮќЬ%эукЭU8Ицœ с]HšQ“љn]RПЊŽѓХz—4S2o‰ЁїФФ/}Il€_цvŽэшŒDFHl€_&яАЯРЃUOБM<0x{4sBѕЎЙ~є>Й~tЋЙzuЛЙvtЇYєЋѕš+G'6GFw›+WD—­>j.§~#]ЕZєE>Твš?ƒ{ІU›ЇлxцŒђє;eUЏњТЂ›еcЫд/lHиН}ѕќјЋAMO­Ѓ73|hйЁе@Џ™ѕдМœaѓћCоU9-зРЄ№єEptЩ п™9бsгшЊ'"ЃлеЃЃžz“цђбљЭЗпGG=ЕнŒшўjiЫъ˜шevPєn нsRdtфзT>%6IlОхЋšxŠmрСлЃ™ЊwЭбћцњбцђеЭцтбэцкбoд=:ыPт@їšUПк|=КэHbtтќШŒžО cЂ?УТњ––ќсж=эЫ‡љОПЄD/#ЋШкЈЅю[ж§э;2Ћzњ^;2чї~)‰_дv5оU'.зэцЬшЬъбYOhОFфф˜•Aбг*3%zUН(™SаNоZbsЮnЭVdєДYў.’wАjрйЛ‰Ч(Н;; zп\?Кб\ОКй\<Кн\;:Бљ&ЧшЊc‰Э™3z ьЉн=КщЙЬъШGІ)ђс44:хНЫ­ь+Б~юЇ[рМ‰Ў]§јШЬЈоU–/ž"7:2пnWŒюХъ‘нЋѕФwcRѓєЈ ŠўY=эЋТ[зушІgn‘IkШўцR?Кз,њх"ЃSǘцДGНЧЧДiбьСQO-+cЂ—е9бг=4ЈyŠ{їr“ич}VOЋgЇыъб5'нSšП6c€ГašBžџKEљцVt€МeyZЭщœўNtэьЙW=:ьHs”k'‹ОаЃ3(њУ­sU]ПМQ]МgvЇЙttЏЙrtЗЙrtфHgЮщo‰Эг6{tЭ3ѓbч &zН‡їžыSdє[,ЃcЮKlўи 0JоАGяsœx є=6'z1Р1бƒнЫWЗšЋG7›‹GЗ›#ЃGW{Ÿцтб‘#ZwsЙе}e†DяђЊїuб-!Э›ЪпЊЧЕœЕn|I[эЖХзЦV=‘3М+льŒ…жœNЎ\нKЎ˜ќ^ztж‘бгcяnU]О<ёbŒŒю5WŽю6‹~ЕШшЏДш›ШшМЯфgGмuј)2кuxЉФц)v›wЛ РЁДaЯо <ц8№@щ{lPєc€sЂOvo4—n5Wn6n7зŽNl69.“X§ИqчTЏћ2Ђw‘бЫGЇВZѓЁzѓдZ=FЖrLнEКtuЏЙtі>5 њ`ЈG—IŒNœдЭuЃ3чt\№‡Фц~uэєft§М3Ѓ{Э•ЃЛЭ•Ѓ#G:sNŠŒNќќ"r #ЃgЧКeГЋнsRdtфЗ>$6№іђп <ц8№@щяиЄшMsDtрЩюћфњб­fбП@ГЙxtЛЙvtbsdtЇЙvubєЊ02z•=Въ‰FbLѓWч=Жrђ”y7|ЏUКrv?КpЕшЋˆОЪ›E.;а Ўмљ>МПMS;НY]~Р/ХШшnsхшШ‘ЮŒюVю:э“€ыDF7ВGН­sVbѓљ-„O‰ЭМПИУwѓŽ9(E.в‘‹GЗЙrЕшЋˆОŠшЫМMtљЇА1ўв‰.žо›ЅЋпцJ,љpšЙё‘Й——Й?љщEшіЧЎztЯI‘бSdє*{tЪDFHl€jђŽ9W7#z4‰Э!—ёбŠшЃDFGžг?Ewg§nЎ6,њѕYoдЂйцГWOЂуІ:цfoтёёCuwд’ФцЬ{І™wЇ3˜TwчЌtЋцSdtЬE|*Б€х=Й;№yуЯЃЏŠ‹ЎЪ‹ЎБю n™iбOЗжАцЛшЯˆhуьшЗї1+:aеg›Я^§sq™\РЂh§чDEєQD%2њ‡ъюЊ3НiбЯšЃЭ5ŸОzд7еCLѓќљбЕ(Бy&КЛhШшIuwЯ:‘бЁеЉїд#Ѓ#GМIl€ЋШ{оxр“нЋтЂЋђЂП{ƒЂŸйїн-[мcГšŸ"ЂГvп]к™q3ŽNˆ5gЌљgtЦЄЬ6ЧD']ЧЃч›EџН EwW-ИPєЩЋE%2zОК;jЩ48/њіQwгВIrРJгфЄъёыS›i>єЬЉз]ДFbsfємaрен1ы%6A—–‘Шh€Mђžь^нМ‚ƒЂуљ&2zkЮл€пЇFRuеGuFњGsШ‚,tژL›Я_=з=кg–=л,zЂ"њ(Ђ=[ннД(Бy=d|u™4g-ѕєНќ-4mЊП_%4Я нAЋ$6ЋЛkжК@uwЬz‰ЭCж‰ї.Б€sЊю€ЭЊтšыІЛbЃФц!ЏЙђ†Ѓ^КK6ЈOн9ЋдXwа “ц„ъФш™fбЛHŒžkНбG}”ge`tфJ‡EGўНt…шЏїнEkLЂЊ#чуэоRPєи<юžu"Ѓ'ч^ˆШшЬza‡Ч›Фf LUwСfиœ]7н›дЛю˜•ЊђЊы б е“fម6‹оGbєLГш]ˆ>ЪЋRєЮ™YуyNGўщљ‡щОфмќШ]ъз‹шсQЕвЗAN!ѓnЭј‰vxМIlр*ЊЊ;aГzшюи ОuЇЌV•W]бUе‰буfб;™4GFw­!њ(щбї7нAk<:_ЭIбCоxМOIwащ1'z\нГNbѓЧ ŒŽК№yRwзЌѕquщŽй"n+fо­"WњKb3№џPѕя_uWlROн!TхUW`tU^u‰>F] К;gќfбћљ(ŒDящ1Шy3§ќ?&zxF\tк‘7$6g~mIч‡Wo\љ№Xђюˆm‡$rВ›ПDF№—ЊЊ;aЃКыЮиЄ*ЏК*ЏКЃ+0КтЃЛcжJŒNl}бGЉс+5Ћyx”fE?ЊгЂЧуж<<7bwч–8"i[ё&2рUеАQнuglRбUyе]сбн)ы%FЇO‡ш]UцЕхYн]БYb3G1АЈўщnиЈ*/КЃ›#ЃKєA*ЙК;cЋРdXЋК.ы?šxЉq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/8.voi0000664000175000017500000003577310654601740023214 0ustar michaelmichael‹8.niiьн_Ў3ЫНзс>РУШ=B#@‚ipt"Ž'A9 €0.`™SсІй^Жл§ЇЊэ%жыњ}ч‰і~НжŽ”OJUеМЅњ7MџOљн—щїџ№чќуяџѓŸџсOПџћ?ќЗ?ќўOге_І>§ящџќізпнўГѕЯІљѕчџЗлПіўчПoџўjО§љOџѕїЏї‡џђŸўјџђ‡ољўєч?§ёwGП§“1ѕ{жПџ_нўюџўuћпћ§wћџЭѕo~ €_bhОё=ѓœ­љMr›УЊчФjбяЙ37ъФ;ашKішргЬЃ#ОeОђ sbtфHGFk~“фц ъymtЬЋDПKdє”Й},Ѓ=:хzЪМ"оЋGW|WdєtйD>Щ|5:уц‡б)/›ЃчФшШ‘ЮœгSbsdtZѓWh`tоо1'V‹~—ФцЬшIєћ$6ч]П$6gF>‰_$6РoцЋбп2Яaеѓкш˜Эs^ѕœ=%6gЮщ‹Јш{dXє|џ3*њиœЖEПKbtфœўŒшбA/§>‘б›ьб)ЏKlЮŒž›—д0‰Э…Э‹б%п‘=oЮyЩ,њ=іЭбгš}—3вЦЄц{eЮ”^…цEGm‘б­ъбIЏlžЃ#g‡шwIlЮŒўК_ŠŒ}OlЮŒŽ|аš›зO0I›`ИљjtЦ7ЬЃS^5oŒЎyЩ<чEя›Eџ2ЉбЫ‡˜шEHє60%z2ЇW‹/g!vЛ€цЬшfѕшІзDFgнф=њršЇUcVєюО#%њ–šнкёF'=—Д /юЁIЭ™бїG­ЈцЛФцЭХ1Hb3 7_Юј†љatЪ‹ц­б9/™ЃїЭ б‡ц„шШ‘ОКЦ†E_Ћ#ЂAгу5Ї‡ш_#1zžл\JѓВwdE/’Ђ‘бSJѓіљ*,zоў84щЙfєаЂьgDBѓaЈЇЈшKъз_ЭышŒ §хQ=:чE›щ1:цeAгт!­—LрцпŒnјЎyЊОІЮsRєМ5:ч%sbtdѕЊ6'њЫЕ5"zщKšзРЌ9НЏ§‹tšEџИеж}ЯK‹nnyЃЛN­##ЃЇДшЙёSYЛЬˆцуиFEЏЋGНЂ=Вч5!ЦVxДъ_,2:Г:2:sIЙOк‰ŒЙЛл‹ŒŽИЛk‰Œј[1_ŒŽј.бя}k“Ђ—иЄшEдP/"ЂяѓЦаЄЇцЖбYчЃ;ЭЂZЏYєOЛхEEп“šЇ]hdє”Нъб]ЇЗŽMtШ„žЖб1wвћe8Кч%9y-=:Ї:2:Г:шЂВY9Ћуїъб)пrѓи<-пЄIl›гЮЅŸWFЗМhlЮŒОIlŽЈ^5ЦLъЙetдЭцтеfб?mŸНњХшАНЩQ>zjЖ.;qыЫk^wЦEoЊG—8Ю‰њЭ‡Йq“зкыЊ7wЂGW=‘иќбЋ№ЂБуNz.j^мeЭцЛќhеПRи&}#њm"ЃПƘжеЃKО#2:тйА%Бљ7‰ЭаwXњМ2КхEѓ=ЯЂп$­љ‘˜НŸ б­цђеэшкецвбНfб?Ќ‘)њWИїхE}и§Ў|єК2mnЊwiьrqбћ%Yг!Кў8VєшЌs‘бŸє0Къ‰]lDѓё’˜аїЖу*В:k о„эW‘б1?FчМ(2КёЬ• Бy]=Кф;"ЃЇ”МНШшЭЛ1ИЫ;—~оѓŠyotа ЭѕЃЩЭгБ{tг3q.нl.нnЮŒ.]нkЎнmމоќjlз™цШfDПђЫBšyХЃї3#bюWaBѓnУ{ќ<КыTо=e^ТEПMdtцJŒ|дЪЎSzwЌ]є‚y_=:ш%YгљцЂCЊгіЛ/Ђп&БЙљТ&@dtЦSјAdtЦЫƒƒФцщš=Кру}*uіМ1Кц%ѓНOˆ>&зn5Wn6ўœцкбцке‰бнfб?Ћ™šнќ82ыдzLc]Лy;вІєц‡вХ§­ctзЉРэNєEFGо—fFG>f>ˆЏЂЇœшujNєБztаKvdtЮkВсMzsLuк&§EєлDFGn™б)ov›3Ѓ“юJз"ЃПВG'ƒew| :YњqфxЬyиѓСшЂчŽЭхЃЩхЃ›ЭХЃлЭЕЃ;ЭЅЃ{ЭЂиБЕ~twœEџЌNmщцюe%!zкчю:3'Gч,ТIє}RєшЌ'"Ѓ#ŸДDПOdєсЭRDєъ$(њX=:ш%Лшб9OмњВ–с­0Њy!њMВцєшЗIlЮŒž›ЇЈ;МEtєшŽя‰ŒЮИ-mHl€‚цИ3šЙ1еыГнCЦz>єTЃЙ|tЋЙxt3ЙxtЇYєOы5WŽnД–npѕцўф(нoŒнu&Б9rЛ‹ŒN\…™б‘гcъeЎzFєЛDFG>гŠ~ŸGjFє5я‘Н­NŠ>ЬыСYч:бƒЋž˜›еƒЃžК&5?DVGFO‘бSTєв˜НT'5/DПIbstєшŒoŠŒЮљwј[“vмёМ6:ц5s^ѓ&8ЃznнєLЋЙztГЙxtЛЙvtЇЙttЏЙrtЗЙpt+ЖzѓЇ tљf;ЧЛ$FдŒ.]9ЇЇЬ;МЬ{щШ‡–ЬЧCбo“§•нЎvцж—нЌvf ќ„шб]ч–Т цi)LŠžюQб‹ќъб-OЕІѕиЂ<sš[еCs^ДD5?$F'ЭŽEbsrєшŠя Lрo@ащю7ѓЦшš—ЬyЭѓош šыW7’ЫWЗ›kGwšKGїš+Gw›#ЃG‡Hш^pхцкэJW'FїWaсjбoyЗ”ЙSgFЗЋGG=}M‹ŒnV ;sЫћ”шбe'цnѕшВббY/ђ–@бПиЃ/ЇyzМ)j~ˆŠ^ГЊ[Kqtд3Э dtдSKddє#{hЯk"Ѓ;ШШ–я Ž]ёM‰ЭSb3вОдf+=oЮyХЊ5Ѕ9l„ПЬЃ‹ž;6зЯn6n7зŽю4—Žю5WŽnчц5ѕЦEWž2adtwчЈ\н.\}Y=:эLdtфy—yQL‹О–eEпуђЂЏ”ВЂ;EDNы[њ‚šћбЃУЮ< ƒЊ#ЃWяtУЂŸ2š/­Ы‡˜цЧ;™ЄшЮRѕDЛztеЋШœшѕ7Y9бг:2&zZ5Ц4Џ%6Ч|UЛ‘иМ™пРџŸМcЅƒNJПЙЖц4o8­9#їbžѓЂч†бMЯДšЋWЗ›kGwšKGЗs#Ѓk‹›Sц"ŒŒюэЅЋЛб•Ћћб™еЃЫЮdVOћдРш‘NлЋЏaiбЫclNє~щEwЊGЧѕ,}‘бIOgбЃлКV1Э'бЃЫЮЌ ? КrѕЊ/'zѕN&ЇyКп3Mлъ‘A/И6&ѕрЊ':Kqpеspѕњs@єДi iоFO!блїч!Э;‰ЭS`2№ЗlžгŽТ^ŸHŸR}‹Эižзgбg4N‹рЙœ=Ђы—Я­штећц„шCѓЕztжЉFsэр‹VtѕъfsёшvsёьЯŠЎ\нКNхЃ›7K‘еѕ'ШёfКјЌ^Э†˜ЅИAбы нЋ]зёШ‹ŒnTŽыYї}DєшЖЎ“шбi}ыР”цэѕ:%zs;5дыЯйб#ЃžъUlzЊЗЧV=бн?Цf=бЋ[ѕЬЖ12zЪˆ~l 9яІMь§УШœoЩсНШшЈyвŽiŽ9’ўažѓЂуš/‘к”цЈ!Оˆ›гОљ:=F7=3ЂыїОyИКšoЛGXє\~ЄЭх7‘~Гшuв=:­+r #їŽЉŸ=Кы\Ћ6ЎzљешЎžkи!КєЙ—EMыэtjюWЮk;ЬтЄшNѕшМЖMоgDЎыйє…4ŸE.;Б iо]ЎCЊЗy!бSltszŒŒzf›нп?Цfћ€Ёо]йЫZ5nnAЦV=Г4Ўў(}Œ hО)”1Т;‘бЕ_vtEFgЌРƒШш€o—jЩ8(}eо]ѓ’YѓЌNwOiОV.Й1Э{Ѓ›ži5Wn6Џ>жжЏn qљшЮм§гNšЫFŸ5‹ўA‰Э™SњЌztй™Фц)ѓжЃѕФRЙњЖЎ<дKYвyЄХEwЋGчЕэW^TtЇzt^[|tуIБІгшбq=лОŒцн•/*zћ“ш_bюWЌzf[˜бМл?І№ш„ън1бѓіdtиЉЅq{mЉ=ЕЃGW=Гkѓ-ЩбЃ3О'2:КztХwEFOЂп&0h‰;;ыаё+Эop­ЬŠОW&EЯ-ЃЃžh6n7зЎю5WŽю6Žю7з>i§“ЮšEџ гцЊб‘S:sЧЫМцнy\УЙ…Ѓяe‡шЪCН„%Э%-.њ№@›=GFwЊGчЕЅG7ЊGзuЌѓRšЇM^HѓюТ}V=2ымЎ/)К9д#ГЮэ #ЂїC=ЅEяvыБ]ч–ФЧпУЂ3тєиѕ’š—ЁNj^žЙ‚ŠПьnMGч|CbѓёъXоњТ2Кх›ђЂчЬЁŽ›дW‘б•п№žL€_-яˆеЈCЧЏв“3ЂчƒбEЯн:“ЂУ\ПКн\;Кг\:Кзœ]ИКп\7њЄYєO:k§ƒN›EџЄШшРmњвз9.rЃЗyЃЛЮЕGКxєдО5]ѕ’ьш)І9mˆ/тцХ—Мщ|‘Y?EFЇ|Gbѓ4хьб№>їS?ƒЮўЬ;„7№аёCr@tЃЙzt+ЙztЛЙvtЇЙttЏЙrєG5GF;‘8а§цЬшВеgЭeЋЃЯ›EџœШшШ9ЙхM™—ФЬ›Иg€k[Vє=.)њ==тжЉЕ›Wб›Б~М…Ќh=ЂхЇХнІ1Ѕz5ЅїЄЎцŒЎ^НфЖОСaЇЖбЋЯ#Ѓž9LбAЏh][ълЯхˆюУ ŒШnGЯюE—ЏžтЂЇі%Бxє—№ш€Kте~„šcюJЗвfѓUfuўђ‰ЭSэї0Hо!Ћy'a‡IџхнhЎнJЎнnЎнi.нkЎнm.иlrМIПЙpubєYsйъФшѓfб?чЂџFчuœWЎ;‘6=Ў>*ztWЧ-­3­GзЕ-mыаŒш}ѕTКЙ=UnžіЅcяж•1ей1…UOЧztжЙvsэш{п&ЖxѓR2Ц7Ч / ћxmIШОU­УЉ]>ќZxŒ.]нщъеS^є—Фцѕе%&z;Рб‡YаœvAМK[ƒW™еЧ‰!БyЊў’x]оЩАqЧw7Nєм!9 Кб\=К•\=Кн\;Кг\:Кз\9Кл\8:Бйфx“~sсъФшГцВе‰б›ТФшљ8юЃѓкЃбЧЦ„ш/§ъбegzгztWЧ­Ќ3дƒу:ŽЁћ :†NЋЧѕ4†їёћБi}сяџddзЉmfэYБиV&U_џМџ}­оNэбI/)5й[эpAйЛ§.ЂњpхNЈОeЮsTvcЈoћЩшВЭЁ.?оы:ЉКѓЪftи3‘б‰пЧ5ŸlG7=ГоИшЅztгsY“љNѕEF—Гд˜|‘W П^о)Ћy‡№Ю{Ѓƒž;$D7šЋGЗ’ЋGЗ›kGwšKGїš+Gw› G'6›oвoЮŒ.[Н*ЬЉоцEЯзЇњOэq§ѓкS82z*н<н—_{ЈЧuК…эЂыЯŽхУR™0Ѕ—s{мЋ™їегўsAsЋКxѓДЮлю~u›Їm_FѓДя Hž–ъњЁ[Sb'dѕmьіŒˆьЧ”Њо^Oж—šСaЇбѕw“уќ˜(‘б_ѓЃй\9zъ tщш)4К§Fotд›с ‰оЯ‰„цvѕшІчВVръ7ŠŒЮйЁЗђŠЏ›рЫ;e5№оyŽ‹о'D“ыGЗš‹G7“‹GwšKG[ыGїЦ93ztи‰РфШqŽœбћ #)zžйЃлzк…ХЋлуZ;К3rЂчУЏЧuъ­ЛЪбнЭЂxєђЁ1?ЦD=ѓ[Gж^†ЋдUeѕkЫМ­^џВlѓzk[>Uшct{/Љe7=‚Ђ7?ЄEїnDЪйmBrф›н)g"Џхь+‡шeџvfЛў6ыqtк‰Й§^Л:2њЋКй\Н:ЎyЪќю"3zѓn,%z;КЭћїyбћ+bDsцН^juїUdm‰ЭSЬfЗ˜|‘и ПZм)Ћg№žv<Œ.zъ˜\?Ке\=Кй\<Кн\;Кг\:Кз\9њƒšGgJчШшG`\єМ§\МК3ЎЕЋ;ГЁtto‡EЏЇїРАSћшЭV2ДЌявЕшыЧЪЭЧВњu+­zssцfD/+pѕЋњбsћЎit\ЯRН|Š~| ŠюєшЖЎжЌ(ž|ђ.,ЊzѕыЁ]ЇкгЂјщMŽъбгс;‹ђkБ{=Ќ=Оы‹ўy‘б‘_lVRšwЁ!бэъбQOХЭш/ћт„ц}ѕшšWEFМФk LОˆŒ.ўD ЃФWšwœmрaЧpvBtуШёђеЭцтбэцкбцвбšп%ЏxКєЅUпњЂЂW…iбѓђга˜ѕGЖp~wуЈœ„=КчљЇwчTOзвШшœ3МWЕSЦV8—WрК4%:hxЛY’˜бнЭъкйэфкбЩ‘ЭЂпe^нŠц<ЙЌ/о1у}бI.нm§г"Ѓуn?Va1бѓ§ЮџўS@ѓДkЬˆоg&FGŽtHtцЅ%Б93:ёЖєЃоеŒŽzъбTНЊЬ‰оМ”NЋž/{Ђ[‹qtв ›wж)"Ѓ#П1š2ОЈmIl>GкСАyG№&žа~vLєUfѕ”НN iоMх„фУЌ_мhЈn4—Џn„жЏntёшNsэъФшnsdєшА3yХ™[ЧItс№ў: юке‰б‰ѓ#rRGFGNЬ…x“нxsPО9ѓŠ(њm>,ztй‰Фцzv]ѕL`r{ЈG7=ЗtцU?>Љў…ж­1б‘пКьОп iл:‘бIKp#Б€яЩ;‚7ё„цМгЛ/"Ѓ#чЧELєНr^~i[…ЧцњбцњеЭштеэцкбцЬшЪенfб?+Б9rЛћАшвх§I]Й:rЃŽŒNœ‰sњЄYєOЫ‹О—%EпкТ:qJGFGnг‘зУЬшzƒ0:ы‰РфЬWІЫ;єРъћŸ1еKe\ѕюЦitв жБСеЃƒ^2oГGчМ*i:?DFЧ|UЛ—и РwЅСuNњЭ,њ]"ЃЃN№žwFїМbпœ}hЈn4—Џn6Џю4‹ўiНfб?Ќл,њgѕz+7G^WКбЕглехl‰~ŸŠ]ѕL`ђ§)%,њў<W}ћ#Ќz?EFН`•š}ЌєšGvPєvАGЧМ,h ЎEFяaђN;N:м§&ъ@њ‡Шш)шєyktЮKцƒбEЯ›џ_{wДлЈ…a”їiŸ iNjf6ЮZк\}ВvЛœПКз|ішnГшпзo>wubsdєГцSW'6їЂOџ@§d‰Oнќ$:qЅЯ>дЯ/ч~б,њW}Ztuкs]]іBdtфƒЉшУDF?ЋЎЮzMєa›#LчъщБНКhФ52­z7!_'Yбїд шMuuߘћ\E?.vuЫИЄq^ˆŒžn7р*яЭСяТЎnи/'К­TїŒX7'To›Янi>}tЏљьбнfбПЏп,њз=i>wѕg4<›vWјфЭ§Ѕ“ЏєГ…>uѕГ‰ЮŠNИ||Xtuй Ÿ]іЪІ4 9ђЩCєqD%2:r/yR“yŽ7-o„)Э‚чџТЂЏђЊѓ†њО“ŠОяП“ЂяБIбЋъъša‹ЉNй#jя"ЃтDО ;ё о‰/Єo-ЇК­U и4Do›Янi>}єchZєВКИщ'Нс8{tП93њде‰ЭŸ§ѕYuжKн‹ОTіЪ6:`ЈŸ}EџЖФцЯИL'4ЏЂ.гGЌДшї‰Мz|дRWgН–иœyR“yі8‹ŒžтЃSЊЇњVНЎЎЮt‹Šў^ьЌшХˆT—ь– Р‘_†іšє‹жВоHп–Њc†Д•ъžыц„шMs@єН4'њOт"3#zЕИYбmљkmвЖ_Bбoбo§ы›ЛЯaбїOЊЛ^zв|ъъЭB'Lѕ“ясЉ›ŸFWwН”и,њ0‘б™еЂнЏЎŽњIdtЏК:i@bѓдл $ˆЌNŒžK3Ћ#і‡Kее5ЃОbГЂo‹§ѕЇкАfј(iяvПh-ЌК-TЗ j-.КЕМшemJєwёќ/,:h<ЖЩЂпЂз,њ КЭЂ_bѓ6zўЈКънц“Wo†"a>ž4GEg|ћs7Ш/7њфеЂ#њ(‰Э™;Ф^tuв€ФцЬшШУЧMuuޘдЅ~(ЏЮДзZШйе>XTWЇьqлйVwь—и  |!§Зъ’a­ХEпssЂлЃъœm­:hDbєІ9 zл|ўшNГшwш5‹~ƒФцMєќIuдO6бKнŽ шхЏеYЏѕ›cЂsІу3ЎxЙбgЏўœшъЈХGЧ0%.tцЎ6ђј їD 2:ёo ­ŽŒОˆŒžRіZk‘б)+‰Э—ъъ€wk-эєэ[uЩАжтЂ[Ы‹nб-0zнœНiˆо6‹~‹NГшwHlŽœшЭН0ЁК7ЇЏ~,‹žbšћуQѕбG}”ФцЬРуЕ96КИgLрt„FGдdFGžу­ЊЋc†EFGЈЯ"Ѓџрr}ЩЎ.рSДYuХэ[uЩАжђЂ[^tkyб-0zЮ§~ысHˆо6GFW§,БљЂЇˆшЮз№ќеЫдМш)1:s’Ÿ>Ђ’УnрпВЋЋ;і‰ЎЎЮи+Г:fЏќЋжZuТNэЊ:c—&њ(iЭslXt[ЈnлPЋрДЬ№ЗZKК‚ДkЎшЗkзъЌшku Ўюи%2zŠŒž›у.РлДъ€ПYнўЈnи/2zŠŒос?Ро$Нq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/7.voi0000664000175000017500000003331310654601740023177 0ustar michaelmichael‹7.niiьнMŽ-Ыyžб”э†‡СОa{юа!AHƒђ<Х {œ…ЇтNјVеўЩŸˆЬ]—<п[g-’8gg^€OПŒЬкlф§›eљЛљгoо-П§‡?ўѓяћќ‡?ќія~ї?~їл?,ўДќлхџ,џї—џќЭэ_[џfљїяўЯџД§Яоџњ/§укэЯљяџќ›џј›п§гпџўП§щwЃјў№Ч?ќў7GПœљwЫИg}ќџy{ьџ§yћЯ§ыŸџѓўПѓ?ќэ_ЁўRmvРgЕЅН™ё­Х%пЃgW|Nbsdє[nZ3?Ћжкь„Яj-+КнЭљ„жЋ›—РфшцШшйŸё‘›еМdеоˆў*‘бьДжf'|Zkiе­…5ЗЇй)/гќE“ŸбГ;>#ЙYєvЫjŽ}м˜н№iЂПJbsкЖq'€ŸSћХь†Яjfg|BkiЭ­%7Я.y]`ђ˜œИi,™б‰г‘xFFпs›ƒФЭХб_Fє—љб)?С63Ѓ˜ЄЕйŸзоЬŽјœv3ЛуZ‹‹nyЭyХ‘УМ&G6GF'tdtкnї–™жќіH—”{ЕФ7Ysq6Э"Ѓ#ч#БyЛ{Фќ›ЮЈъЭ‡€цїаэЧY!ŸВИ;1CБsn…f/‘бPCkГ >ЏН™ёI­хUЗ–VнZrѓь’ХПIJОG%яЃЇІМ.9:iЂя6[G@љ{bл™uс­0(їCVэшЏUЗu,›лЪЃМ|ќj•ƒ–|•™НGoЋg7];Ьr@sдИ’Yt ЎDFПЩЌј:mvРЏбЋлЛйŸ”нZ\uЫkNKn-Їј^”|ˆžкђЊGgPsvє~:JчяЂп?е_ђЖм;зfW]к'T'6ЧнЙп%6gЏtTuвѕїЖoМыюxХл›7›‡ш+q<КеГ“ЎхП‰ŒоeЯŽyYdєэ7йИъw‘б№skяfW|ТGlVv[љхгьœзlЂSћQлr&фc(Вš7гQ=љ‘—“ќŒЮ)^žЛDNђ1znЭkк.znЭ‹Ёћ….н/нŒtљEџШkГЛЮ{ы7їЃgG]Jl^‚RŸD•ЈYОIЛпѕЖŽъѕ§{KэшФцУї ЭЃ•žuAє—Il}Ъыо^ъ{”5/Я_ОГЊя"Ѓ—ШhЪiэ—П™ђ ц ьЖ1Лц5‰ЭћшŒьжђж:*љž”М< s’{бs{^бібss^ѓ =4—§žЅћ…ЎМшћшЖ;\дGоўЮRЛЙл[ОЙ_=ЛщRbs'zvб Вjo›гW:'Л{VЯ_ХІЌyg‰“šЗе“ЛNЇЁ~ѓ!:`8–У|F?ПœuaПMGDЏ7ЙœшѕDФ4o~Э‰^}e“АM?ьn.3S~•ШшКп‡ќДіў2њЈ7ЛЗ‡й%Џ{ЏŒ^ВВлкь˜W%FЗT}Я J^…9ЩK;FЯ zХ1znЯ+V‡цВ§Яа}sхUEWn^ћѓѓF^ИљXМ ЊgG] Lў6бГ‹^˜Мž]ѓЂФ…юЮtѕњю6]<:Аy›™}\мњЭЧш€цCtBѓј2œнu*2zѓѕn`ѕцCёшнo„ЭЛ/ЄSЂ{еS{^Гщ i^V_žюў^мКzbЄЕ%ч­ю7эУьŒOyNЫ~Џ ‹nЯшœъ[lTtKZщ{`{^‡хЃ…эinбЕvŒžє‚vŒžєŠgчБЙъаблsГКЮ=Rї ]|TкжњифВ3mdvиЉМтЅ=ЛщZbГшЏђMFКеН‰пuЗМтбЃцЪеуцКбЭ'Щ1ЭKТo]Не­омy˜ЎПап њу.НДнв&ЌєБ2"zP=5щћЕˆ>ьЬбЫnuSЂ—нRO,љŒ˜хнˆŒ€яЃО)НЕРъЗрДшїоДЅnЗ•NŠО єлПъЛ7оЏТ„Ѕ~4оW:ЃyМКt›kўЯаNsйU_]~ЛшКГвіv'fЖщEзП(Ћ}XіŠ“бГЃ.%6‹ў*пчBЌž=l.=nЎ}в\5њ,Йjt'2­yћ{yбцѓъЉaЇњ3\;zpй•n]vбЕ/У7гБtЋЫ7ЏЊзG&і|ТЎzbЩ'ьжzbЩgдПњ:"ЃsЋg'PPр{А[ |хxKЌўHЮŠО-ѓ&КќOа’VњVй’Fњо™нЃл>zzBгЅGioЁЫ.|лй™vj]}Т;б…/f?!§iЉ&Бy=Лы\`r?zvгЅФ•ŽœщФЭ#rЫ7з>i.НKŒˆ>–ю/kPѓўљ?ЂЙЮL ;5Мш 7/Ны№q|RбЕсNQИљ$zRа+"ЃыпIКnЙYбї}"Ќњ&В:2:Г:2Кє­{,ДzvРїЖzсxЪ›Ѕл‡л‡Й-/ЫўЈЎџвєmєуШДžsї‰8DПќњžWмB[7КшpЗРшGiRє#vа\sЈЯЂ+янъСв—qŒŽK!mlvки7‹ž]vт{EЯ;“иœнћXд>2ЁКгX>КПЎЕЃGГP9z<ПeЃO7И€цнD/ПjэNMjКt]5ћ$К№RŸ\ˆЭu+w"ЃЃЋ—Вп%u=–8mЉ ЊОџ™§YY[=;рUЯW3ЇМЂЙ}Иџ}rЭkжЭ)б­]=§нjП3§ОЊmйкю@-aНЦКеэ9 ФšбmчxzJж…Шшх,КъLŸT—НпьЋЯцЅŽ§е˜аќmЂїwШzzы›н"ЃыєВ‰L‹оЎнIЬ‰О:VЩ`JGчЗnєйNам Ќп\Г№(цюЗвD‘ШшШ™ЮŒ^=aфUпў6;цU›шЌъЧп&ЧМj•šНlЩšYђыDVGFgVЧFgVЯnјМФfр/w3sЮš[kышˆъЖŠ~.љдЄ+­Ђ[ё1i­Н>PO;6–ЏnшУРгњбЯs“КNEзН#ЃOЊЫŽЧr˜ГЅ/DєWщЇfE/їЄшдёˆj^Юo6… ƒЂЏŽUвя+=œ„ШшТKЇE§цš[ђVШ}dЃЕМъ}sDtфJ‹ў:Ћкœшн7щГk^Еš‹œъmtHѕњ Œ‰^ЏoЮR/Лп '–ќ:‘б™е‘б™е‘бЙеГ оЧы‚ƒом>мўœ]ѓ’vЗФTЗUѓfЩg‡hНшк ОLˆn‡ШњеэН”юЌєцјМАSЃъЅrєљZЯЫ:зЮЬŽ§UіmЩ‹n­-‰бѕWњЌ9!zщпзыщEwNŠ:7\гТб'ƒPЖљ|zы7їKF'ln{;ђ^bєюоQНoŽЈ§UжЕ1бл'Ѕ”ш%2zѓ$—V§јыфš­/РЌшепЇЦМjГг%U>TЖџBzZШЏ–­њkDFgVGFW§‚€ŸTЛЩyoл›tэ\?ќ[ПzАЬЅЋП[sйъШшЬљШŒоU/‰б‘+R-њЋє[kGw›ЋЏє:іа=;n`8ОuЃOЎЙВбЇћDбцѓшЂПрFьШ;З‘­У§$Abєё6`P}hшю6WЏŽŒ^ЖЁЩбГЃЎьF"Ђy?!бЛ‘‰^"ЃЗ3‘RT=ќTзЖ2Ѕz#5:ГzvТчYъ/Н$6№ВА—яЖЇ”єuђrџГЖЖёј<;ыLš]64NЎ}ж\6:rЅOЋgЇEF'юп"z‰Ј>™щКеп&њqbrлаxyыVŸŒDBtяд„ kчз\bsЭш„Эm/bGоЩИьŒvКЪ†лseЧЛJ§юNs§ъntѕъ~tэъ]gdtFѕ~ "Ђ•е‘бЫ zjгЅ}eBѓсћўˆцУкЦFзЏоOqDєЁ2Ѕzџ9 z/cЉw"ЃЭЧ—‰ŒЮœš_:№WбТ^міf]{–ЦdVЙ~vЇЕ|ѕp™SЃgЗ}Гшйe'њЙбх—њЛEз­>‹.[=lMŠоž™зuцlЂ{чООчR;oЎ)aŸи‹имv2vф­”ћШFbє№FXY/К|vbsfѕЖ4ЄzЗК凉ˆŽЎ\}МіЂЃ#Њ‡ G'TTЎŽŒ^…Ђ”Ca@sч+Є„шУЗ1бБбГ>-2КюЅg"Ѓ—ФfО­ˆWЄoД•й-Џiлфˆђжzе­ђkšлоъ№мВБCѓ:Кjѕ1њc4JGЊk7ŸEЯN§UgњЌЙlѕ83&њpjRе…ГaЈ}>П›лEsAћФ^btЦŽМ•rйˆЙћ­›КћбХГуЃWŸgg]xо oŸЊ}œтњбНK/Јњph^гЕaѕМЄk‘K=Ž.\}]Зњ,К~ѕёHсшЮu'њ9жoю|я}›†ˆшЮЩ E/8ПъъEЇl+1ллZbto.ю›DTwЂЫwї›‹wяC#В‘ыUЛ Лћ цЅhЫ.zй§“КЮGИі@Пщ]vеЃћ{ELѕсрЌЂ—єvхишвеУљЈ\нНkЏю?jЄ<~\,d<г…Ѓ{ЃP?КЗС•oЮŒю=7зю|WWПЙGє—Il.ј4$Щ{'sР{шї’“ƒЂл8КьбкИКьтЗНэЉyagбgK_ХїkN‰оžšvцlaЫVŸЮBбш‹Ўиœpбm…ьпЂYєqlЮŒЎ_н‹.Ÿн.ОяŒШ>D&,ї10aLк#ѓqфёЉlєЁyнZЖњ8лa™uЅ3Л›a™tЉЧЃ№яWН]Ђ|uwkK.]нП‹ЏGЎмЏkW2JWGFїЗЅјЕ8z-=„вЭƒ5­НаKџ Д|tObsftЭчрЪ{%ѓш-я…ЕМцжтЂлЪь–WЕ­Уй)QWкаRї%яушТѓMЂ7gfІ­kешѓYHˆюœўњЂsзмNbєЗh§ƒ$F›Њ{бm{~ZлP7zZ=zwрўqf^пqyЗ*6/‡цУРLЭыыд%TПьXЭFбшЮ74ЛЋrRжЙуlЏЪ)QW:ЃЛЉžбtщ4Коя,z›Dе~ъmхЋбЕЋЛ7‘ъе§;_эъСэКюхЭшЃtѕ№С( zpќыs^3|˜+м<^ввбЃэ­vє ЏvsџaЎxr_d4№“ЉўъыŽвЏ яjmјfњВZ^t[™нђЊ6ђqvr]пАљНЛътŸVОjŽˆоŸœ”uъbY+6GЬТVЦќn…\t[‰ЭgбeћЧгQxйЏЂ+VwšлюмЬМО^tљъ}lФ€x§! њxЄpєr=ЕЏыН>T”eEEwЊ'іuuТъGПm ћ0б?D'z_=+эдUtНъ_’ŽaѕЃ;aЗ#U›_+нŽm~.ъсшњЯjžkК=иVgЫщЯСГzFгkЦб5 fЗxѕвн%Њn7НљRОzXѕЮr3ШЋ]=ЊЋ=~Ф(}2u›ЋOяHbsэ9`ЖР—aОvМхНрН=м>ЭzA;štIѓзаќ5:ЭѕЋЛбХГЭЕЫOЃ‹VŸ7gF—ЌЮ+^6бЫўG˜н6Д/ьD—‹?.kRtчаэ`Н99.:мНЎ„шха%њшw^ЃYЅ›G_а.^жбЃ]oVй‰gиqЉћноsЁK}&FFзК\o]wеѕV§-ш0 еЗПnVdєБzRнР +2zЉм|ИЗьПпм'tZЅѕЏХI]ЇiЛРвбЫ*КsМtu?Ктн№нsЅЧпџœueДE]уУЙ­}оСёЂоуzuїŽхуьіођоŒъ*Wo$uЃOчŠ6WПe&/ЕЏИБШшкwэЁФf€8/•N|чxрлнлнуУьЂk­cvг•яв\НКп\Мz]9{м\З:БЙ§qbvкPиXuЦDo3CЊї‘‘беЧФњеНТУ\Wћzоўj,ЗьннbГѕœ•ўзі&е К2ЂїпdD/§Ѕ.xnу:'&U].hЩЙИYGїN”Ќ~ІЎФ)YFбЅЋ‡aнЫГˆ‹шš"Ѓ—СHзЎюяxї3UГпŸ<КyewхtsЋ[}њ0WДЙі}d(0yЉ<Кg"ЃЛћt}‘бајњюФЗЛЗWнюžŸ&]k=ГЃ.ьc#Њ+\ПК7aЭcм%ИtwŽйI—wЛэі–RН­ЬЈоGFTЊ…ѕЋ{…ЧMЄиа]ж]uЙeяoЭ›Ѓхš/ЃKЮї Ћtѓ(Кvѕ#ЊПжїПЭ‰y!КžutяФЄЌsЯ™нїЎ_h%/С›ЫшŠеЃщ˜Qє„ — —3 КXИКПMпNU{’~xм[ШзНтьБЈlѕљŽ\ГЙіУбXbsftЧ+/2О“РwŽ'О“ОFЗ–WнкЖzл_ѓ‡iэЌКцџ­V—Œn­WН9?Ёъ\ЛŠЎ8гћшоROШ:uh>&–^жљ‡dFи‰MцЩ\—rишВї‰е‡ФѓЭЏ†c_dt@uЏo_]­ОПЈ›ъzK~]qN]1бЃБ.зќм_ј!ќ яЄooЇОЖфu­Ћ‡?Эdэ$њфƒЉZ;Љ.нжњg'TkэД:"zX2zпМ/ ‰nЧѓ“кFV™§ьВбыПяВЫ6o Я7“ ve ЩЧћw@sчЁЃ~sяIЉ~ѕp[­жо[вђ[HЗЊxt?ЋvѓшЂЫ‰оW?џ:ЃьЬНЗ7 Гš.=Ѓ;Чч$]ЭmЭiО^lE/ТwуЂpѕЩОQ=:3ЃъBЫ{žšє‚GtЪз4oїФчЙQ—ЮЊ—ЊеgЭuџџЊЋy*2Ктгч ›~mєRњТ/Ћo­_=:^AkƒКбёZUзnmX]6КЕqѕpn&k[“sКЮДНЮйIiC‡цmcсшeП;]-zедYэёV8еКЉ7)Ѓ7I!ЭЛ‘­пћnW–|Маš;ЛCdt@ѕUtЩє^VљъqєщCі\не|~,НЋ^§}Fи™ўмV\о•См–œŠ‡бХVs˜o†;DеуЭx/ЮЈž™‘uюф’=ЊžuщВzBгЅvV]і‹огшёWэs=rkц Ts‰Эaƒ@€жКЛ‡ЋшчЕЪе­ѕѓ*GЗ6Јќ,Д6ЊŽhо'–]щжЦеU›быЪЊ+}l~fŽЎЯйюMНьсІ2л#ЉЛт5Ѓ;Г=ЎžиБm ~г.Њ'ІэгšGбuя*Kя‰єq юZ_G яTеЏюU=m^z‹ЙњX=К_Нz4Љc]ЏѕЁ­ЏlEЏРЛбЖVuчx7ŒЋ\=n+\}––\§хIзFWтѓьWНтЊњЋ{^r]UZя‡ФfјmvР•жіэЭœ˜зДNaяX%­u {Ч i­W];КЕnuLѓК2ЈљZ8њи|Kэ^œ5t›ѓRЦvU3ЊяI‘бЇеsVE1ЭKЛЌ.јЄЗYШчТ–]ф7ЛАghсцУ=яљЙpѕОЌЊ fКR0ћXu\ъrеЧЊњвЛЋgе\T/їчЉRzs[t}ŸК[ѕъўQє МэjЅГ‡qеу3%ЋOЫЊVŸЏgЭцЫс­]Гnф#8ЋЙьмžKl€Ёэ>Жў?VIы™uюанYлъен‰HjоЭЧдАны/k3vгшЂеoY‰нqеЗЂУ˜Нк-ъGяo%нъ‰}=­,нМŽюWЯ ;ГЩъUOъ:ГыZwЦDїЊыeВЦњ,КlѕБ*`@:{ёБzRлPяВ§XЏЙЗв•7Л§k­xѕрRЋ]=Š Јž(Z}šVЕКђ‚ŽEVзОфF>šУЊзy)љtМЎ­ЭŽyI;štЅ“\НКŸ\;;0љ{5Ž~E/ЋТ ьГъКн‘е›М”шMuLєВщ+§ WOJ[Њч„и4ѕЋч„йFm*KGчUяЃ"dеы)ecЧЊо€Ь(;бйзЖ 6wwу’ЋЛбНи2ЂЛGgфМfWЛzWЙКrлXdult^vdubѓ[ѕьрчгюf‡МЊэЬюyС>9!;АЙ—œам Ÿuъ˜Н*ЬЉnуъТн›О˜ьШъvZ=ЗmЈVЯm;­ž›vтЌznй™]aхцuб zFжЙmSЗzBеЙ]T­g„й7m+ GЋЗŸjF&dєЉˆЮи–ьмшюkеЋћD@tїјW‡|F§ю§U"ч#2њx#OPѓётJbsё @mevЫ‹кЮьžь“šњЃ0Ћњ^˜TН ŒЩоєЅ\ЛКЌъбbOm:фНџЕxє /%КѕŽЮЊКв­Ў}Z=-ъ‡ЦЊЭKoїБ^tяв;љ\CoУи}ЌНЏ>љXCТўpP~+юIlЎ9ГW›SЃЋ#Ѓ3Ћѓ6М7‘е7—%tЊxIћ0;уummvЬ‹Z~Дът˜”§ l1й›Оь]]Fѕ(/#њаY]9zX]ЙyX];њЌzRбЋ"Ѓп#їŸ F/НнЧ’ЭWUEЃ+.цЉвwъ‘ишй Ÿ˜Ьз‰ФыАц}њRduшNZ=ЛкЭьŽзЕ•й-Џj-П:5Лvї3/'{SRн­+}’W?њлTз>ЉЎлМŒчКtє2мCІДќejF_EUŒ.М;ŒОчUОS•~ОIl.КЅ2wШъЬ:Гј‹ДЛй!/kkГc^'ћ‡[ѕХTяњ"В‹чuU_гЎђ“а•Y9!Ыaes/Œ9Щ‘›FфV—иyРOЎ§bvУЇЕФъжГ[FvѕОžњЋz0 G  №WЙзEюа‘б‘ЯJР+кь€_Ё%FPWф}%2јџэС € џЏћ*,зxYq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/6.voi0000664000175000017500000003752110654601740023203 0ustar michaelmichael‹6.niiьн_Ž4Kzас4pС2|Х `м В……АlР X Ая‚­pœЏџTeFМYmцtМoЯѓŒfNeVKѓы8‘‘Yеёўь8ўђўўЯпёзї7ѕџљяўњoџт/џ№пў№{МћћуŸџћј?П§їЯ>ўsѕЯŽљіЯџўoЏџэ§ЯŸз>ўљџѕoўќ_џљўЫњЋџјї˜§№ќэп§э_§љшЗwўХ1я9Ÿџ_џx=їџёњsџуџ]џџљЏўЭЁ ЏЖ;рыкЛн_бžvЇМЎbtkЋ+FзЊ§PЏјјщн_VqzХЎСѕЃhtбeя-{wРf­Ен _ео|Мо›ђВvЕ;ч%­З;шЃ+6‹ў6Е›OчіхМhЈЎ0и§Ь(1C† QєяЅbsЭш’Oy]ѕю˜зL~W.`ЉэјЊіЫюˆ/*им><ŽіцМЄЕSu+2шmД;щVаœ>:j.НЛщVХц zwбНА9{zМУХ#{єЌzwжšшяR2Кц}МфэeŒоє’’бПTl>њOŠU” €і›н _доэЮјŠжЎбт‡цCоЎб%&J‹эЮZЋ]0yН;ъNХцŸН|кœЙZєwЉи,њћќЈшн]k›kоЧЃънI/ЈиќўщЛ\єЛŠЭE>‡ŠZkЛОЈНй]ё%эгю/š дЗ.КҘЗ.КТLiэRн{JmnwкœшяR­їMЙQўЅтьјIs:wєЂYєгЊYєеO‹о6W2z^Н;lЅbsбЧМЯЯБЅšпs?џY&њё…XЉшБzsЯ‹ЮпгI€§кov7|MћАЛу+ 6ЗжGчЯš ŒzkзъaиjУЏS›л6ЕhЮ[]2zYНЛmЊbГшoSqNЏšEџ-›“FWl.}ŒПТюК™ЁАVєXН5l%˜љЃƒъќЭЦЯWчy+\„‚™‘?њ1/ŽKЧCPНЙшУ‚З7чEзъН-_QЉрЕпьnјЂіnwЦWДV/К`sk}tў_ЁuбуяP›л6ЕhV§Ч%њЛќИшнmSЂПЩ›вYЃ—Э9ЃзЩЂ‡ЂЧ3I›Уgч’бGіш00{s<ЊйЃУaЭоМˆо–є‚YєЖ —LЎФ}A/ Wъ=/ ю‰[{^s-’|о‹šе…І№ЎЕіљjkЧД7Л+ОЄЕrб­е‹natю_ЁЭэN›Z4ч­^FзЌо7SrЈ+FWl§mЎ…хЂ‡iЃƒОєбq_юшй˜inс;{ВжГЗZєћыrбПЅmžMдkЧнŠЗ-kmr!ІnžнFъFяJzСtRo+zСьRмє’_}Щч№„ъoS2Zѕ7* @Jэ7яџлvЇМЊ}жЖ2й­[KdЗvў8Й­ч­еЋnsЛгІЭyЋ—бЊџ˜D“usЮш›ц„б­dtn‡šЃОфб“ЇŽмбг1-}‰Žпк’ЕЖšМ%ЂуъU7ъGGе;ЂюДЖЪЮйМъЌСПLЧ9щ|~їЃЂSЯфGБЕЂStЅъїџ-V§ІdtЭъj+ШЛТб5ЋwWќЎZЋЖ%}ЛкѓŠ6кt'HNŸ=iN]=mN\НhЮ[НŒЮZНŽЎYНЛnЂbtХщqгœ/њЗЄЛцŒбc_Бшѕй,Іu‰›ЛъјMesЋyP2њ(}фlў бээfs}{WйB \по–6E_ЊЗ•­мUЇєcЂw7н+ќЫs­+§ИƒˆўнЕЫ–Э1/ћH­§yп+V§ЁnДъяP2Z5№E­к†уэjwЮ+кhwв 9}іЄ9uѕД9qѕЂ9oѕ2:kѕ::iЕшя№+ЉbєMsОшЛрŒбA_ЕшЛгYЬыJF5šћМЄб7W\‰шї5Л{[мЬИМu• ›яЃ*б ;/JFзЌŽЃ“WџЄшещь.ž…Ђgу38{ѓНЙч5ЯаBбGЩЁ~>ЪUŠ~Њ\],ЛШ:}U2КєќиёE› гЮvЧМІѕvн’ѓg‡ЩЩГЇЭ‰ЋЭyЋ—бYЋзб9ЋošFЗЂбхІЧЏІijтшљ№&^O‹бwЇ“Xд•Œ~ОЙЅlсfh~_1њїї”-LVЫl‹›ЙЮHєw‰Ѓ“WџЄшмеГшдечШ2бч‡ЯrC}~?њ˜EЇЎ>Ћ>НЌ]mVŸ^–ˆ>?3з‰>X)г|Q:zwЧ—ˆў6%Ѓs~AРNхvЃoНнAї†фќйarђьisтъEГш?ІUsвъurЮълц„еПš~NєчЛ Ѓo7чPпMˆ Эёl[ЙНтJFUЃПНъF0Ї[џ[Тf ^КаГitцьipцъљ('Ў^MДеѕ&єQ>њИўЛУ–КY\ЃzЙњšXЄКdє1N\} ЌU}9§ћИєU‰О~ Ќ}}ž+в|U2њЈи\:zwЦз”ŒNњєŠЭРŸЌj3зл Нv'н ’ГgO’Sg/šгV/›“FЏ›sFп4ЇЌОmNX§BsЁшг›Л{wC[%z|SлЬ§єЭ=љ‰oЯZЋ};9Ž„Ÿ nЎТœт/yћ4:sі":mѕЊ9mіМ6qј"4oєбТаvzok^Ќ›усОДЙYєуx_к\?sГЏoJFїŸЇЎЫIV‹шМе]`+Uн&Џ.}ќ€ш"—т1оuыšWЃљЗЮыQшNХцЪбЛ+ОЈdtЪЏwoUlюз@рOBНm™ nDпNчvнk3ЛУІЭyЋЩiЋзЭ9Ћяš3Fп6gЌЎНLL}7Ќ5ЂЃиЖp?} DЧ?ђэYKЏ,йšFtКРРи\ |§™2§ž›rаWбigЪЅЎ`єх№ќЮюЦСxс=ŽъDŸEѓGї'žЏїХЭŒs`˜-›Ъ‚‰лUящZ &nжЉќ4N\=ЕЊ[ЫŸНŒ.S-њw3ПGїїНЭУЭКDє№ЁЊBѓ№7ЌбНŠЭЂПOХцšбI?ВПЃz›2мбН|žй[tЋЭэN›Z4Ї­^6'­ОiNY}лœ0zе˜5z=Ќ9ЃяІBЪълщ›0њ…k.]ѓ§@'М›ПДИUŠN7ТŸжб9Г‡ц6мYіХЭDбЯвbбя­хЂУYžУЕ­\tw˜8zHЋ}єeб\ййЪN‡uЂЯЯI›Ѓ9аWo*[ˆ&юЕzOзZ4qЯЋЩŽІ[гшœЙяТ…-ыВёi]Д:kі::{ѕщD™шёLтцрОW!zќд] 9И[hП–)н+џё#R7zwФ—•ŒЮћ=/№Л(ИtыіF/№ Ди‘9|вœyО,’гfп4ЇЌОmNНlL}3Ќ5ЂЃЗЗ„-мЮп„б/\sљЃЯчЏїЄMM:хTў0‹žO–§†ц6МГ3/6Fе;ѓbAєgfоЁЃ?JГF_;ч§ЉLЦ6uѓбЗ•Œ^­&i i%ЃчaЁшг'•BбGЩшОzSкТ2:эуitЙ]ЊЗTнWЖЌ#ќ0N\пDВ.ZXў&‰Ф}ЩЋ'yЙЃgѓ7wєd+Н!чEѓш 1/›^‡{r^)ŽгGЯ‡z[мдМњђ"›Лъ]]KЫ ’еќZЬ[NъФw–7as™ъЩщœе“Жмбз‹n|pJъ7,{iЃOї’ўdоцЧ—Й•–ъуѓvнКSЩЃї*—щ›с;шбНŠЭiŸJ€пIСЭO[_WйЛ…vW-ХЩЉЛЩiГošSVп6'Œ^$ІОж”бї“ЁFt—_Ќ9_юЛ›ш”йЗЭ5ЃѓUПаœЏКbєKЭ™ЃщяАЛВг—Uh>†2бП“Б,tP–ОљЧD—ЊюЯ•јЄеŸ{ОЙ-n&œ…Ђћkёќ"—јŠK§ЪPoЌ›h‹eя§еЖД…љЅ˜ГїMд<;›F\Ž"q[ЉшёСiSжsлАюхŽn§ЊœКyјH~=Н­ъЮ"z[гН‚}„W]ўшрВЫп|œVшЧ‰ќЭРŸИЫ~Ь5іf~ь„э?žSСци™Щс&ѕ™,›“Vп4ЇЌžGц^lвшлйPЃЙЯN]я <~ЪТQ Кbє ЭљЊ_ŠNV§ZsошюАDtœЗyˆŽЋЗ&Ž*F]•Ђ‡шRбїЊЛНН10–‰ў„qЩ›—е7ЗF~@єЅњxж'ЯоvЉо˜›\qчъmmsё"‘vсxЗŽЮкЧ%Џ.нUЗХma+­гŸпй67чН!О‹›ГоZ>M&pюшјЩ›уЋ.{ѓd­Hо|˜ НЫюЬ%vj~ьƒя™žRь.К5&П7З#oќД9яЯ’яl­‹Э›Д;О/›п`OиJ1ѓ"lNоОlЮš}БњЖ9aѕ ЭљЊ_ŠЮV]1њV.К?~;—jT_ЯІ§zi2>гGЇп_э [ŠЏЗДсЛutвюI\­ърГ-mЁu†г[ы&&б™ПO?wэЬбГ;Lж{ЫЛщєMм<џcgтфЃдŸhЯ*WяЎј‚‚{3ŸЖ”ЎВНt ьnКSАy•œ5~9ЪI‡Мрд›ГWЧЭЩг—бIЋзЭ9ЋяškF'ЌОoNX}“šВњк oцшю№YšpЈУФёїижЎЕО:сЄVˆыХиП›С]є№nQVЩшѕ'‚тЎ:бЫ ВЏ00iKн<ЋKнќRєжРШOˆŽЯoь‹MтЪDЇS>т“[тq~NЪз<‹NљtїДŽN~3дщЋпƒ[љЮК‰жой75k>ž+_Bгц”_z|XЬоДЭЙ'яœъяSГ:щРЯrйQКЦг-В;j-L.йœ;zвœ:zжœ9zкœИzбœЖzйœЕКbєMsЩшнyЁRБŸЮ•UЂЛШZб§ёѕ!uGйТ8ЮtуŽыѕdОйЬ†юjL8Ху)и—8 Г’7qYЅшEѕЦФб$Ўdєє| Г!=gk~eЄwцХfГ эдјe—ЙКdєєКpє‘№aњX|TЩ:ЪoючЧžЎЅЩšw\o0йДivш`Аw•­Ь›џЕhЙ$'mNОКMUЎо]ёU•ЧКbѕю€ЏлQКТгŸћ`З“нM7ZlwжвЄЙ}МЙЙ.6kЮ=mN=oўМ4wŽVЭYЃ—Э•ЂфбГё}6W‰ОVцmЎtџОTЉю"kTї‰ѓ‰ШDgЫFuЈN7шб\шЊѓЭ”pЗРОФQV):^BВGŸз‹МЭгКвбљˆžNdkžпЕ“ЮŒ7гy›u>џ2ПиWЯгвЎЧbю&n~%zKзвэќиRuчВш…ЋоЎВ…ігЊ3оУпЕлъMaK‹цчbВ™ qџ"™hˆ“№I<™7ХМl5?ђ*\Н;тЫ*6WrШKNnHЄтNСгЧѓў.ЯmвлЩчёоЖ™ge‹ЂSV_:‹DwЃ{­NнКшЃ@tkѓъ#itп|YCŽ2бзы/ctа|mL6Ÿ#6чЪ ;љ.нhЧгeПx`'Г;‹>ЎTsЯœЧW_(г!:нˆGЁЋЮ7MТщ;^Ђg7і,тДмЭГЎVєьГЗВ3‹;&ŽЮППо•›NЌSу—љМM\§sЃГUЯ.ФЃЬPЯ.ХMis­MГг6­nїеЛвцVбяся–бiџ №Ќ}>[s6‡ГN‹Ї’бAbшIѕІ˜—е­ЮьIљ‚БА@єCі:Raнd}FZЋи Р5лs7ѓ^МёNСЉw=žэЩœyЏцvŽkчЃМе-шќ8JнN.'ŽюпA"­ еGНЕ/вкЌњљюЮОHпмV‰О4ІŒŽšO•)ЏУgd˜ޘэЂТѕ|йяU,њІzodЏяJžћfЌЫпDїєlэб˜vељFќ>:с4 Г EOЏХlЭ“Е"wє$юy˜1:žСЇ­}…й8Lз|ЎјXФeЎžЗ%Ўž\ˆн[›тfкМ:oєKCН)mn1д9я,ПДŸPОЙЇl!Œn—gЇmmsГъЧЋ}i —иѓЉœЙя*]OгшM=Џ™,{b^6ъM5Џ*9дуЪVЂњгЃЕZєуЏZЛc^є\ьъEПхБ;цe%;ўdD{юfпŠ7ЪKО/§Є.uu›е%Ž~l~]h‚Д6­NнЎЂї6•ЭЕ^№цЎЖ™ЁљвX(њ‘9]Uіš4ПwЮ.ЯЭžQгњЬбЫън™WчЈ*бзЊЭ§§;}я/C\црA)jNVŒhў9§SЂožEˆТJE?вJGIђтсМœHз<ћpx9™­љ>:н0ѓКдег5"su›VЯRiД—ЊwеЭ,ЂГ~Њ]uЮ[Ы/aswoме6ŽєљE•шА?•gmы8cэЇ /эКёАŠЎT>љˆ™г'С‘ рAПBєУu­оѓЊGk‰ ђсБlŠюnъ5ЂчŸПR{єjрŸ,џfЖч АлqкЈ9ЏчNСнVиyГуОмеГ=Є3GЯvОЮ<вг ЛoтнoоЦw6жХ†цgdкшЈЙ]—М2бЇ%;_єД9š.Ys!}єЉЉdєЊzodчUЃЙ_ˆгїОЙо›тJFЧгzgтhЬ*p!UљЋЃЌьЭсгџѓЈPєљ†“?z<љyД/0OмЌ“љУфjЫ{ў2ЋK]^ˆ§лъ&ІбЉ'іЂКЪї“7З”-ДАКЛЭьŠ›ŠЂ[wsм73‰>gok› ЊГЮŠЇgрuЄswuѓѕ$etъъёLюц :{№›ј^И%хŸрКъmŽyеyљ+S§Иќв_‡'­З;шCs…шЁzwЯLрuMlKlf;юrœ>{’œ9{‘œЖ:.Ь=здбГщ9z63Ящѕ5˜3њ…цšбйЊ?Ђ FЕю.ЯІBеЇЄbЭэrP%zY§лљН‘НћшН}‘>э<КiГ‡Ач‰МУ=VECЌ:ˆŠЋї%Ž.KФuЕОDoЮМjW—siЏХ 9\BЖFіТ‹эz&]ѓd…Ш:™?Фбiзw“шмеГшдSd‘–7z–Еzr^пнRЖp™дЇжѓћ›вЂъv­о•67‹ЮињєY8DgюЎЕFZFgЭО‰N\=œшчy:CYц!~8­ЪŸџЬ§щбZbЈ?\'s­шь+Че]ЁКdєћ’]ЌљЁb3РVEЖ„З N$gЯž$ЇЮ^4g­^&'­жќ=~bsЭш„й/4ЇЋўhЊ§љЯ*е­tєMѕцЬ‹sQ•цЃ…еУ/А7ВwšTo- tY%Њ‡Њ еcUъкбoзSзwiWзsбПˆ ЂшKjўшсфчсОРHд|9ЛБm*ŽN^7iŽ7ѓД е_{kГp<ЛчЇяЏК1Л ЯВжІыєѓ'і„-еI'ХIЋЏŸ}-Иgэк‚бЯfkЂЧU­BѕdЈмыH<вŸ/7}ЩuблѓЂгbPс ьЕСюЂŒб5ЋwНЂuЪинѓU“ОнчNАuі„­ЗepА7sњюIsцъirтьesЮъ›ф”б?ЏywнDСqОŸ Г_hЮW§žT+К бс/А;ѓтtю+VoЮМjЏUoЎМ:']ЋDŸJЎzca kšUя QЊЧЈЩХИБqАˆnнz’GpЕ…dkdЏнTUЂЃъ‰Ѓ0КŸЩš'бIчђЇИ9yѕМ-qu”жцo%Mы{ЂюL&єЖž—ЬМMїЦх#я\~НФ—р‡рі2YЛ3yД #Й{kЊKFыђЃ5stџьљlЭ§pЙ?_nьyСy)0ТяJ\€ƒ’е}t…ьБЙhѕюЄ—z>рŸЊЕqЛїЬ nэЮœ<;LЮ=MNœНlNZ}гœ2z[Ў9g№ёцFќ+ьNtЅ5Њп‹К+/ytыЃ+TWŒnctXН9ѓъtSНЗђъДЌойЛ$-Њw6њЄsdђшжG+JCдd‚ь+UqѕОФQpБ]6‡ыZTН1qEУ›ЌyvЩ8)žтцфеѓХЁ@ѕхдљMЗТ™qzoGг­q~ЄM} ЎТМгтгt•оuk\ѓЂ%0™qЅž,нЉ,†:oі#-њд•Ж{ШъЃ3VїYCsЦш~ЈŸЅ™Ѓpz<_n(z]Зц]ЮeеЯŠн=ЏЉp§ j,1КBіOЉо]є’vyЎоYРяЈиЖw .И9sДЁtђьIrцьinтъХЇ­ўLœeяю‹t“ЁФŒчpьрЪK_нКБ.s‹щњвG•§q‰шЈzoтр#шІzkт l<т3i,гFŸ“VеG}R™9zZ:њTWoЪ‹Г6š {тf‚Ђћ%r7_;/CПЅm*ŽЮћ ыMм|$џŠi~%ЎЮИ8мŠ&ЦЎ–—ХwФ}=/ЙЙЕф4[ЄЋTЈ{УVЦ…zВrЇВŠN[НŒNћѕcpяь*[шЋJDw2њGњюВDіаиUчЌяЋЛЛMЮ1_D?Оpкй›NЬгћ5'ŒОў…ЂHѓU?ЋE'~Юы\BгGЧЃ›ЛyИчwFн)ЙlЈўN›ЌOЂPUБ}ƒKnЭ\nCщŠЭ“шФэo‰Х6џ(,ЕЗћ#Аа–єчО*е§•WЂzШЋєeўyе)чЧАf яч‹~4­†њлЋn\:KE/ЋВ6пTWЬЋж7|ƒќfyлЫz?МЛ­ЄЌ^=bЄ}єš?–3gЇАЊѕіДЭ-/СœЩ‹'‹ФЭ‹ЧЁЄСП<г2Я‡N‹ЊГgЗИњМўэJ[ˆжшг™Ьббч№ЧсЦК‰nhЛ)’4КЛ)ЖkuюшыQggоФ9ЊJѓEщшЃвђв™?:ъЬ§^7ЬˆдЭгO+™›уucwгНšе•ўВuVБљ—2ЁРяЁкЮЬї“.Й vЙ­Лп kUVкл§X&ћšWЃzШ+]‚ъяS­њЃГTє9tі:›щ№fіщЄШѕхтЋћ^кKsuЗNЛ ОЎ:ˆў<ЪћФ4tЕШЦРHаT#::—ЙyvГЮќЫ3ы§еѕrмгtы‘6 гŸ‘quЮёn— Ўй›Ъ.‘Cvъшш+Ѓћ2GіY<њrайš71\xЂŸ7”И9gєCм\%њr<К{КNпмNыrЗ–ьЬZšЭтдбгoџ37>eEjVйЛ‹^RБ рЖЬХЖ“ўL-U}ЎR§ЁHєЕАЦ6щ]`‰ЭнћР {вGyЙ‹ŸуКЛуkJWяЮјВgѓЧЋдПУи–~с8ТЖьеqZўш .wєl"ЄЎž^t™яуѓДФеЏDЇЋюЛZdg` Џ ›3F' DGчrGOGЗpфk>>Ÿш†ОЯNиќ|чBЪйб=гEцœвЇх#ШNz^Н!;utTнŽДГу6ЎаIЃgѓ#}єѓU•шЃbѓУ9Д`єхhwжZ—Y :šХйЃ'—^юш~щxžоuЋмbїЎfѕ˜Н;шE› ЊЙ—tЩ=Аkюм]6:}u_Xaoї10є#0uхеcT“эеsЄ+U?&FЋйпЮvЧМЌBѓX–П:,+Ны AЏˆу’WOтR/!гАЬе}зљŽž=К;ьь ŒМвœ1К;,œЪ§nђa+mѓчJ1œ;—3z=вŽєА*Зѓ{iЃлуE—?zэФтЄК%nžuцo2Љ“7?я,ЅЂ?To>эюZъЗBє8!ђW‡Г8{єф#aђш~ёxœнuЋиjїЉfѕdŽP0рчzп}Ож&єяЕ­Tt{ tЅъ­ЛЋєЗою —дŠ~фj>­ЂŸaAіІІ[чДЯзйЃЏqУX)WОV'_B†шгЭ1yєѕЈ•Šюo-ЉЃЯЏkD_jDjD]йЃуАмб—Дv>?ћ}X\wizu ЬW_nŠЛ Ќ`ЂЄО|PЅљ.zwоФулЅBЭoЪ7WјdћІЯЌPLˆќбс„(\Н/щсЊ‘МљЈіщCЭъ_™ќџ*ЗЅ{Х}ш &—lЎ§џкЛ›Ѕж‘% Ѓzџ—Ўn§”dqу™лНжф`Юф‹Œ,Yв„чJ†o>t6fЊЃЮќ[6ž?э“GЗЂї˜?œdWgНАЪLˆўn›T—†]XЧ7фёЁЎэдИЌ^zЮ{Г“ЕюX}lžЈ œй/GBѓfgcЂ7‡˜ш‰ˆшCXџшYYїшy[яцщс‹ŒюО_п.aбЫqо ККo.nЃђŠЮЯauй•}gDєё<Ћzџ›ТІз&\]WtЧьКбНyйeWЧмšqйњHќћшqŽ~ьUнph ШžЗі<:Є:dГŸaIбЋЖДшЯМCpгцuщВЭЎЛvR]un{ —нр{њiћюмЮН.эмzЂЯУїSнsо›ЊйЏcѕцЮбgЩ§š3Ѓ—Рэ˜Hˆ>†ѕžЅхDЏЏ’„э8Пhˆў?‹Œ~U]7—и|]]нv*Џј!2zџT˜V=§иеЁ2ГzrћзЯёќѕo^f/Фњ7/!oФ&"Ѓ~#ёвъš;ЦQuв+“фій“ЮЄъ§/*Ѓ^:йЖеЯВАц‹ътИ3ЋМœшѕ!Œш§4ЏЎЎz-ЋzџeВnšў59ƒMОJš]№šGŸ%wŽNjЮŒўНЪˆо•EEГћЅŽЭ08ККo.В:БљUuuн‰ФцЫъъДsyХ›Ю”шн+А”ь]dfѕсsO‡Ъ„шуN$4/!ЏЄBГhhќЈNЙklUчм1ŽЊ“^™$їЯо•VgЬњ3-*њ;.Љњ;/1zVлЕљЌККъЅРI?ЬЃЛ|н{MNЮbчшЋфЎЭ‘ƒ~ˆŒ>ЏЎ›ZUХDЏтbšЏЏM›п1ККюLdudtцзadtцWx^ёУ&3%zйd†Эzћ)­њјЙЉнt#š—нf7уБ’БРёЃ:хЎБUsЧ8ЊNziвмПzн>;.њ#/Ќњ,Зuѕљˆћ6g^9Іе_џSvщt;њNќ|ЃWŸlGыхžžУю22њ:ЛКэBZsтv$6_GWЧIlЮŒЮЌŽŒОЊЎN;—иўњ`ѕcџцЭн~XѕцCBѕіq0%zїН{3“‘ќ2^€?7žЊCn[е9ЗŒНъ ЭйГцюеѓцже'Йcщ\5тO‰ЭWб}ыO›ЯќtахькбyЛgЭэddєuuuм™7kЎN;їnб}Ћ#Ѓпn?ЊгЮйП“иќНФ?ќDEЏžQ‚Ђз/ ‚ЊзЯА1Эл'я”fh`|ЊЮј…БVsЯиЋКсаP=in_˜FgДЧУ‰ЭKф“ЫЇИ` Л1FuТoеП˜ќ]ёK‰Э‘л1ЦЊ:%~lUчмН$6/yХЩŸбе џƒЬъдlшnT”њ0gЊУq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/5.voi0000664000175000017500000003246210654601740023201 0ustar michaelmichael‹5.niiьн[ŽlGZ†сеРУ№=B#@‚ipcд-DлШЭcс&рY0nзiч:Ф:dБёщчimЙreI~ѓwdЌЌк-Х?ќnš~џЇŸОy5}ћ‡џј§Зџќу~јіїп§лwпў0НљiњѓщПЇџљхЯяоџЗєgг_Оўѓпџvљgэ?џО§M{џчŸўѕпќѕ7п§Ы?}џ?}ЗїЭwјсЧОџfы—gўbкя™_џЏŸ—зўїчхї§ЧЯЗўwўеп|…r~›кш€Яh-0;4ztС'$6П†6:р3Zbukй-Б:6ztУн›3w€ЯЫмі2Ћ€šкш€Яh‰е-БК%VЗ˜нЋ›cзєш„ћ‰~бYКЊГU?Nb3CDЎ”ШhрWбF|BkеЂЅ%VЗФъжГ“ƒзєш†ЛХFgVnИ[dtfuтн%КztФн"ЃѓEN]єЃDFGў&€п˜6:р3Ѓ[ Ќ§(-БКЕРь–Xи<%6GЇUGFgVGFgVGо^2GZљu.uъyй‰ЭЙЫctУ§"ЃЇШh€кш€Oh-АZєƒ4бзнЋ›E?Ldє”и<хN:-:Г:ј­Z}{80х.ѓAчM=tЕ||ю‹ЪLž‚˜нpПдшШъбПhЃ>ЁЕРjб’нRЃуЊлЛбwi‰е‰ЭЂ'Б9xЯqЏШшЬъШэcSёVеAcŸO:wЙduЗФъїо_ўUЇ љш‡‰ЌŽŒЙ“ЯЎЕбїkЂЄ%VЧFЧUЗwЃ;ювЋЃЃGwм%Б9wїнpЗШшЬъШE=mЖ„—Аоє2&џвиnѓMмИГoьQй­%fдFUпZc’У&ќEltNѕ[jиОё"nГЈЄЕбŸаЋ[ Ќn‰е-БКЕРь–X=:фqС/"Ѓ'бЙ>Ж{GТkиly “пlд ц5q9щ€юUоэЮ^М{ЎЕРь–X§Ѕ5Љz–гьЮўГЕ<:хВФm#ЕzJЙ‹wjЃ>ЁЕРъ–XнЋ[bukyй­VЗФъФцрнctУнD?JфšоV'М†ЭŽ—0њЭ>БmЏЋ#ю6o}ЋѕQО{н6ћ"Ж“Э.Аmoя- w›MуъYВ~wвяkЮМГ}ЬЊЋЎ”eSлдu‡аРшлWaб{іЋegFѓzКХ›g[\Цx_фmtSшZ§БsD5Oх7 €jmtС§Z Ќn‰е‰б­VЗФъжГ[bѕYsЩзr2хšџ Ю“ы5н‹OСwёб wЋЛ,Ѓљ2сEЌ7ˆŒЭNѕbњхlFЛКE–{gВ‹K5ЫюЄп.ж^?^•vрДЙbєв—ЮМшй—aбu?›Ў-;ЫG/жФэjэцАуUоF7ѕ6шбEW$оUІЭetЮUAЉПЖжFмЏЕРъФшжЋ[ Ьn‰еэАКш‹9Ўи}МЈl™]uЧћ№VЗ]•›злЦшœkђ6КЊшKkPѓTѓ#?№ кш€Oh-А:1КЕнъК/ЇэWWюч•­nеKgЌvZ]/ќАљ№?У@{Yэ№йСКQmkLнŽЂвЭЛDйрЧ7ФŠХSхВ#Зш6Pл|днe\ё…,";яО’ыЇзИyCЪt'{ЛVtзыMіv­tєъaхћсЋгцЂб‹бSЏyкйЕ+ZvfEя<ЌІMГmyН^FEй}ыEЯ;Ы6зџЙАяYЊG]ВКГŒЮЙ*Љu&Б~kкш€Oh­[н^=:цЊУшЂеЛi‘бЯ wА ЪVЗЖ_§х‰jхэМКоМГZбъNдэJэшоЕЅ1u;КE‘бгreTk>к‹ыMјУЌЌf`Я-zoЌч={›Ею=НрћpЕн-*nыIn6Й’ЭыQЎіцšƒ>uб;ЫЋEНxPПyБAЧ4ПЄоОš…жŽž6዇ƒЂNэЭЖtѕў*Ю­–uьhЧЈк№saпГT.Кdг\{ƒ;’и №[y}fuBv'Бн<ОчŠnX§ц^YэъНАђбGеюЙdП­nєСкН=Q-§ш 7лјjUwЊО<*ННВ4ЎАЃ“нПš=mКнuш Јlѓ,КЗJ>ОуБMЇNз@йIПVѕуK.Х$Зн5зєr”›Е’]wѓИ=ЖАчœgHє*В|toшUЃЇ~dђe\ŠЙv%ztуж-,&yћƒ€фЉ[§gФNєђђиИ]{+Ђtѕў2Њо<5ЊыиIѕЈЌG;]ецMztдЉЇЉtХЌ6%љEЮ€2Ћ+oqСYСPHм‰у‰‡ЄGžь§VнVЧх\еЖF']Pќѕ’7ћКvѓ,ыжXЛyЙ/п2K7Џw‡ˆъMZ7КXњvžЋъљЅ*КбЏoЃ.ЗJvЂkп^zk:/:gв§ЋaбльЧ—иMЊн+Ћл|4а˜ш=Ѓ3—"ЃЏUŽ\{кшб[yХгYєшК=нвъе;УЭЊ^_Xv`gVWў§уIѕЈЌG{]ецнztдЉЇЉtХ<7"јMа„ч"ЃЇЪ[ПA‰ЧюІp™ЙDr%.’и#щі\аo§ъЉГ&ъG/Ћ‹ЏьYVыvЈ7пКЭяEѓКкСгьm6oЌМмбnЕЃ;З’EѕАА#›Дї‡Ышbэ{wРEtЕ‰oWСvЗ+ЗL6блMКок^7э4зŽštїbѕшгъ!mЛvВBЂчmХНЛ[ˆўкž7ztфЦГFNьШ+žЮЂGзэшwІUЏ.mлЗЗ"JW,cе_йqѕЈЊ31{нТЖ:ЁћYЊG]’жћ&0љUdtцп1№МЯнЭ<т8ГzЪЌž2я^ё>КцЂДsщЗНѕЋ;™Iеы+›ЌGлІюрKщЌˆв‹њ-hžV?њЃhЗЮ­ж—§R4oKˆ~+:ZЬ›\Ўінсj›Жk=ѕ›Ћеoђ:бхf>ЯлYгѕЪbgыUW\нЧ“.њ–\Fe4O›Њ€цiV?љxWmО=КАуI']ЏњJtfѕшЦФцюgЛкС/њsŒЮЊо\vhїmWЙњ`ГШ­•ubГыЭ(иul[]ЗѕІS§,еЃ‹.Iы}“иќ"2њ5{tм$Л›xXpцЙЬ™g`‡fїNЅ/§"њСЕЋšыFgMњKUPє,,/:iM_i.Н[ўўƒ7—ѓшИ=ѓІ4Я?к…5ПюFWыПюЏŽrSпл6ж‹fpцвaєl/нЙp]ВљbєшЪ•РфKбЃЗD?Ъ…шzеWЂЫUGF?яњнИ‘имЉ^^ззkёшЉ]НzwчTwžеuш`ГЈнн@fO ;ДЉžП!G†ъTз§Bѕу$6OЫьб-wHlžjп$6@!‰чGЫМ{vэзБЭЎ>§оyєхЯ§‡НEЃЯ›ыE_h§5\iЮŠ~џ†бkQўи|=:mзЅцj§ЂыM§<КрR9ˆnѓчGw.EwзwЩ™Ÿ№ž6К^ѕ•шrеЯ]­:2њyзЧшЦМтНШъЭг6yqudкХPЛzwЧTїžSuт`ЛЈнйіO ,;В­žџ\;4эРQѕаАCе…=KѕшЂKт‚пDFWџФБ/Б€чxшnтљЦЛЇ2~!;`зяАёт'yїNЃЏ~fњIsЩшglЎ}к\0њМЙ`ubє•цШшбkYЕя›ЃGЗэ L>єќ[F&n]k.V}]rЉ/ЂЫћ zГPЪ§(WЂЫU_ŠЎV-њaD?Jbsфя6е›kƒѓњњS-Н7жкеЛk!ЄКџФЈSћ 8"zS_7КЛYпžлЖяЈzlй‘§ъЪ2ЋЗйЃƒ.Щ+~•иm§uœ7зЋОв,њkИаж<КnGbѓQєшД]W’ЫхŸ7њitХ•rЖ<*6GоУŸ7К\ѕЅшjе‰ЭWют‰б'}Z]qy<эž7:Б#БЙїЋЧАшоХ‘qЛњ}ХЃwћJWяЮДrє~\хшEмі 9ЊъФ-zНT GпЊ7[Iнцў}qtгOR=:шšФцЬџТ‹ЬъкwўŸЯ <›Й{žtэўўиЕЇо?lМіRщь^~}7зŒ>i.}ж\1њДЙ`tbs7zчNSЦоhуЂлT;zo—^;ббЭЃћК“ЃGЗэК\ЏўtШg~aЬ9бЫŸ\†&nН;kЅ†чЎVиœyПrsЉ'БљЩЂ+ч'6gўЂІѓо€шоOнQбЇWыиЉKˆо}ЂfєўOT•Ѓ—ƒеж?l(КbЛslŸЈчЗ駆5лоZF]б6F]‘YёЁЃ#0љEfѕ‹Фf€aТЮ„ <}w{:sљіЮ‰веGо;ЙЛјBй7^џHьУцЂбЧЭ5ЃOšKFŸ5WŒ>mŽˆо<5ЎmЯб`Ѓы.н5\yMяОѓ Gw›лTКљя+Ѓѓњ“Ѓoп22АчtЦGžи|6щ’kћ№}И{ —ЂЋUGF_ЊнИ‘W<]иЇ+Jl~ІIWЯN|#fnыпЃчEoЏюў-KљъВкбЛЏђэнЫ–тИEQўџЇu+€Б$ЊnЂГЩ9;9Тdc…ЦБ,G‡ШшšЏWЧеoŽyкЖ­Л!W=Ѕл№юЌJzBПMЏэyЮ­ДјVЗ“ёяDF<ОЧ"Ѓ$6№”Мя юОЙ~yї=иѕ|’\Кzо\ЗњгšЋF6>Ъ­}МК5ЃOІЁdєЩзъуЏцx4аeЗйЎБ§dqb'БyВEп?Xн74ŽЎЛШ_“ччўЖнBVŽœЏpС?‹.9%ЧУ\tДoDбџ?Ђп%БљфMЋрƒхKФЪю… ФNЪ?8МЋЖmu—<Вњ7эV};0З§с.!КПZ8zњnR:zњзмвб‡еoNyСС„М;хгъw‡Мd3ПЕGљС=ЕіЎёЈ{$ЎzNЦМг.yЭ_›јxq_ПЛџzц€№.Й~і0ЙxѕЌЙpѕ<9Аyuиj^u(Љѕ&ПЙЎјkœNrBєОЛтРэeЇќДyiниСB—mžGџ[2y]t‰н‡U7ќЮЂK.ќ0Књ>=‰Ў=тНКБѓ!б§ХейТVnž,uu 3м ЙїЃЋwOЋ+ЇџЦV_џЉО•у—ЖЭ ЪъGO^NъGлJGVПЛхyеяNyСl*7WўиЁ{uRўЕКњНГ{йZѓМ€‡сHb3Аoоm-э‹Ž[ouв™ArѕъqrэъРdЭoп|ПД6ъDЬтnфLФFbtк ј-nлИœ5Э?n^v$o6>ш6\нtъ4КтяpЖс•\љat{ќxaои8КіŒ'6?UН:Б7(Ь‹n§Хе‰Нё0ЄEЗ§ѕЕ}C7^gP]?{]>|]ЛЛЖЙђнЃmЎ|uПЫ%U_цлv=ЃДђбУъkїлcžvP§і–чЭЋпžђ‚ЩЊ–nЎ? c™еЗЋ8…ЌŽyIdє—Мb(Ін­NyRл[tЎKЎŸ=L.^и˜№ЏŽx]љiЪЌŽЋЬnмР_!эЫ™лЦъ–чДоъЄ3ƒфъеуфкегцТеж\6zдX=zЖЌ•ЃFЁhђqtUћЛ.Ђ>kЯјЖб§LŽ<й zuг)бяђ)їсCuХ_`мМЉˆ~ИђѓљтР‘Ся~…ХCGе—шж][82ОгЂїе‹ћ†њшЧъХy“шпOV–˜-u}ЁсЁ ž™Y:к‘бзRXєM@єЈЎ|є—.1Ђ9 В“Y]ђе€О‡ўQлјўyuаЙ6В:ъи0ЙxіДЙpѕ‡5—žф•ŽžBBѓ ЏhrїЌ<7a{ЦФшДнљ[bsтб.3:q8>)Кxu~єіЪтЎCƒѕ­ПкЃБ(_=œцИшЧХ.>ЎŽŒЎ>зушв/ˆ_&ехeV‡.їlЖ‹›l$Х}Hѕъ чDF_EFW ЮD4GDі2ЋрcД_Ћ;^а6О^tЎЌŽ:6L.ž=m.\нe†4ЎUŽžФ•Žž.iсшƒщ-лм?RъІо„эs?тЖчKцSх(КlvbsњtєчВђ–љ2^ul]ќlїc0ѕ{4ЫхЋЧЗ`ёъЩЦ‘ню—WЧЭLЂуЊязз–EˆŒNЭNv}™йу}ЄКШшаЭ/2њWdtх?˜ќgqпCпЎV‡<ЏѕV'4зЯGWЏОu_ЖПСъІЙAZљшq[эшY\љцa_§цЪыкIмъ&ЭЕГчбuГšЫVoѓRšEПЫc_Fswš+ќЅ[ж€цэ@<^Zuf4Фх{МaЏюЂ7е‹гT/.;аGпŸ3ЋлІ&бХ—КяО^][ufд 2:уOJёЋдyGFVGF‡ŽѕЗШшњG€ПMkiпDп6VЗ<ЉѕV'=уSВWН"!zW"QсљеЋ[žЛї•?фЭ$6|ЎvЕ:фyэСъšЇЕШюЬъЫcјъ–#ƒИђбУМтб“aШhЎНДZouвЉAs§№k`Rі6/ІњБ.#zŸ—=Ў^иuЈ §‡єѕ›/ЃuMŠnћ§ziи‘ЖЗЙК8mЎ‹оT/N›ыЃя‘еmS“шкoѓЅ^vlМдхEFG<Л›/яЁьъЌ№Ьћ1ОzuЪ ›ПDFW?тЁн­NyA“§F1е]_@ѕ(АzєxRšЋЏюFл[є„яШ.Мxћ­.Јz[Н)Œˆю#Ѓ/Iб§Ѕ…YЧFУPН9=К…U'†;sVє55-њ^НИьРњЗzqзБYuu‘б9Gв‰Эчб‘Шhеo”x3цWЏ.yEdt§`Ї§ZнёЂЬь“§˜Q=ˆ,нк`$Š7oЃЋЏяVhіЎ;&=Јz[˜=_v _књЭƒш€чсhˆEџ гш•Qg†›\ѕъЧ­yЛЌэ:дfеkГŽэЃoеkГŽuбЅkѕб еQЇЛ­ШъШшё#ІМФцЄП+mEFœH‡";ђf Џ^нPQћЧъ†#І{W™PнкnuжКнн.­ьyJkƒьњ2ЋwЫ“žT§X™Н_л„цў ˆŒБш?bДaToў€шMѕвЈ3у'JVtёк_]tBudtш€\ВЮwwЂп%Бyј> Б9ть?НжЁеiйРѓкЅ§cћs}эfuЩ Zdѕd'”пsЊ23šї‹›аќ0Ъї ‹ЃЮtЗ_@є`ЯˆŒО„FЏm:еFееЕФъ}tDu­њOŠŒў„ъе1ЯŠ^нђМФцKbѓ­zuЦ‹"Ѓџ#‘K ќ-къ€Е_Ћ;^бZbѕ&;Ќ<Њњо§Н›‰ˆцэx§yqбЙnзˆŒОDF<Эл КМ–X§ бй‘б}іъžgEF_DПKdtwж‹иєЂЕ•иœђžЖ:рUэЧъŒз…vG­ї­4'њa}CЂ[{œŠЈцˆў•SнZ`uKЌnЊп%2:tЌwйЋcž–Н:х‰ЭйбЋ;^“иќ%БрЕжV'ќ9йэлѕ‡Ѕ)OkэЁ:C ЌnйбAещб1е­Љ~“ˆNЉОDF_EFёО…хўˆœчаЛ0цј№ЕЖКрeэЫъˆW%FЗXнZ`uKЌnсеЋK^Йд?"Ѓ/‘бпкъ€џрOЛL_q{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/4.voi0000664000175000017500000002413510654601740023176 0ustar michaelmichael‹4.niiьи]ЮьVV€a7pС0rпB#@‚ipд-D'(ЭA… ˜@fбSсfёеЫл.ћЈѓ­НNžЇ•”эŠдяйZоvўЭ0ќю?}s7|ћћџ№§Зџіуяјіwп§чwпў0<ќ4ќѕ№ПУŸ?ўљЭѓK5ќэ§ѓПўaљЯкџSћњCОљ›aПg~§~^^ћПŸ—џнŸ~ўЧѕџчoџў/Pi";р DЭш‚е%ЃЭЧЇ§iJVW.X ˆь€/QЏ:^еuкяЭ1зшOJˆa]Х­Ж\єMНЅЊGWIqЈcЈ§Кя{_vЬё”нqMХцšћй—ХMvФESu™іYt™%П‡VЋЎ§Ш,6 ЯЪYl…шЁа ЦНюЕт%VzЈѓœYTi^DWYшqЊk5г0ŠžзiЪЭЦЈ`2ќjDd\QЏ:Ђ^uФT]Ѕ>fбQeбc[єж3s>§W?#S]"zўy?Ъ :cLŒyubЯ)1Џ2ƒЮXs™™žOu‰шWхД_їп;nOХ….ЙwDg—иыэ:{VКn.Н]іьИ=ЋФ’бЋьмЖ]ТўЃ[/Ђ%Ѓg?s{Е\wbеЭcМžкuЌЕуѕо<ІNGгО›g“\`ž,oФЭ3“o &@–ИЛdЇœKй9gФVvв[цюЋчЅUЊc'Кчъцlє^]1њ ЙпъŠб‡ЭНVq•šпЌtvнŽŠЭЂ?Э<№uX&:†эВgЧэY–Œ^eЇІэkі=4ЇЛ1/ыиzІ_dEНЕЙЇыyQяЬЂзIjзБmєэЌяцйP,vЛО›Ї{ЎТ=+5O &пLр+йХ$;хЌXЪЮ9#ЖВ“оj4w_=Ы,S=ЯЌВжЭйшНКbєAsПеЃ›{­ў ЃГыvˆў$%GzяНЃFt,N*EWљ-Ащ{VŠ~^ъ:zhMТkРs’о[DЯ;{Ž–Э‹[2БъЦŽ7žф†jmгЫIщQѓйв§п5ˆйQgUln>jJ(˜ ib’rV,eчœ[йIo5šЛЏ~eЊnЎsчеЛЭ=W7k;о]тžЋwЧЂушН9юzЊ›Ымћ­ИГoTŽЮЎлёЎtпбГУ:бБ8ЙŸїл<Ќ–Дdєxхё™VѕFcxЇOjzoяŽыx:†ХKшzИгЂокlЋЋ]jьгCїбУ6КѓЭуЎѕDќ8ЭЮ:ЅТ|ЋbѓАxŠ—R0вФCvЦБ”sFle'НЕЮ­PНYфkн˜ŒюЋ›ѓм{uћ&ь;КбЏorгіmoСй7™ašk:–gН?зcАŒЮы:ДнёДпц§'_Ч НћкёD‹Кіa—6[оы85ыXc›:щсжїќXWчfВ~~WhоVзPБЙџ_,Л &@žјнpMŒgЩ5чФ"КФ’ЧмxžѕFЌЃ TGlЊЃћъFtїKНnЎp/Ж›_%fkеŽ_eєœВГЪCЯвŽнХяУvЄwWО%ЃwЋ{оЊ–Иѓшљё4GЧђЌћ'љњ~ЋАаћяs/єn\зЭ;Sаwѓ,z6)7пЧЯлнгъЉHѕнъyX0њўъ‘]tЦіхЃ‚ŠЭУњ/Ч ЉW ™"В ЎŠЛьŠKb4žццœБЈ.БцБŠЎPБЎюОcн}uДЂ‡О›‡YlчЫ;йЌёьЋŒžSZГёњ&+ъіH?ПЩЫ:ДnЗМЁы пVWИ-їš{ŽŽfі§›nЃзЗоьnь::VЇ§?ЩїгњmонЗЯšЎ4г:onFїоќz-ЊБq,UйЃЖO–ьЂVФ‚бХšлПoћWБљІ`ђ]Нbр’јнpQ<ŒgЉ-'ХЫы4ЙшНˆzебŒюЛ:ъF‹дЭ}7nЌ&cўMFЮ)лž}“дєVу6œОЩŠz'b/Луш§ъЎoЯНъЎЃ‡іниѓFИй1JDя…UŒюЙyчЙWїбž]qТњЌвГ7гBЭЯк"+НzМŒŽОп–&›ъь Svоѕ:WБљІ`ђ]НbрšˆШNИ*юЦ“д”Г"цб5жKoЌˆШЏџёo–хяџщOПЙX~ћќЧпџі?џёў№лПџнћнoџА\§iљ—Ыџ^ўЯ/џќЭэ?[џbљз—Ÿџ§пmџйћŸџЁџљUЛ§ќЇџњПљ7ПљнљOПџЛ?§nє?ўРўј‡пџцш—пќЋeмГўќ§yћйџ§ѓії?ўќяїџŸћo…rўšДй@ эЫьˆЯДЛй!ЩЎžнёK§mD—фшйЪžёЉРdОДжf'|ЈнЭљ@kЊП‹ъop‹ЬŽž[ѓž&њ›<*“Ђ—]єд–GЯЎјTlєь†Я…5‡хР?OkmvТЧкеьŒЕФь–WнT—ж’ЦњйZЮJЗcєфЂ7<+sЂл‰žєŽШшуLЯЭyЯ*3'z%Б93:ђ> Lтgѓ’Y}Н шi7Г;>гГ›ъoYнТЋg—Міl ‰оEF4џ„шŒцЅзн6oBЂ7oЪ7їЂЇіМхИwЬЌyгЖ2Ѓљ—ЮэЛФш™еБRі•”3сVfuЬ6кньOД–˜YнT—Шш ъv‰ННЮˆо5F4яЃяKDЯLzэ'DGLЧ zjвk?'zjбіKЙ—иZ9™KН\ЃЖКНŒ z+уšc+у†х 2јыбZ›№Ёі0Лф-+ћVй’Вя‰-Јњ˜иЕвO1еэВдa‡т&2$zН4/‡…MŽžйєЪq„ƒЃg6Н4ˆž™є†уWП9bГ8ˆ ў’иZYНЙ˜œђЉд§:-:т†х(2њKb3?IkmvТ‡кУь’OДЌьkekIйїФЄъG`KЊО L^‚Њлe<ВХmcZєЁzrи‰CddєѓЃ™Yч: [Оy96/9ЭћшyIЏЂчНЁПУеnЮис›ыu=‰Э‰7рK№RчUGFgNѕВОќŸœђЁР“Lфй<Д:q>Ў›шjwГC>бZTі­В%eп[Nѕ3АЕ ь‡Фц˜ЁўЊЛўwЩYщmcFє>2Ђњан[иъЭ§iШ‰>|:+щЕўќжnNП]ђбп%7zvФЇ"ЃЋoЩ}ЙKW9еыo=ц†|ткwŠЩМкынПˆŒ;ОWЛ™нёЎKhkIйїЪ”§Hl1еЋРжBВзmљбгŠ^ћ%nе—НkŒŒŽЈ>&fEїН™a'ЛEщцс§јрё‹iQЏЙrь]/К|uwы˜єŽ€MљHєwIыНиƒ3S>Ив™ѓaЉПObsФ‰ћш6'_ЅЃЛТžЕAбKdєc‰j^юпщE%эjvЦлЎЅ­uп3[ЫЩ~$ЖЄъ‡’Нi ‰n™б›МœцUbBєБ12К~uїАKŠ>ѓКNэЃлњt>7mЈг|‹­лМЌzзяg&Нжцy=ol‹о0иЄg&Н68ЕЬLz­ЛMoоF—_т›giZѕуEJѕњ ˜QКYp ь8^хЭЌyгЃ2ъsјъ1ЂzYЭEPѕО9"z \ш/ыГљь–&PTkmvТЧкньїм:[Pі#ВЕЄь˘ъu] ЉоцeDяњ"Ђ…IЭйбѕЯ0н Ў^НоžЇІ эwхЭЯЈшЫыКЭУшй]Їі‰Aб‡}cbбkЃнnbвkУ=zbгKmыљйфЎsъИшGѕьЎSлЁИОKˆ~МHию.Ж“НЌg",:ЁtэDЇќ<3“ц:њkМуeHyЛ§zvЮv—KбћЛ№Œшћс}|•и №уЕ›йiOГSоqЋlAйТжbВWy1е›Мш]_Dє!0 њXнћЈ–юВ†E_оmpЗŸ‰бХ›ЯЃgЧ <тбГЫN ЗњбъyIЏƒЂЏcНњdrзЉнї<БЬ;ГŽЈо•ЎЖНйe'yН%/ы^—дќXъ фч'5oЋgЗМ-dmwжбYѓёx‘’нн?ъW_џЬŠОкэ|ГsоqьйEЏ=*“ЂwЗ!Э7‰бqСџ?ђьоžfЇМЏЕЈь[c Ъ~іхTЗQtсъm^FєО/!њPн jnЫqч›л6ДО†жЎnЧшЏЅ›ћбХgz—˜ќ8ЏєЃgЧ<тЖЃ\КyйчEFп6.扛 znжЙ§fЗ$T6Л„шCkРaИлђRЊяqЧцвбїŸ9Эу•žмuЎЮЎzaГ{м>š[єŽUѕь”ї=ч!g<З…ySЖ}мМЈњ.6z‰<ГЂ{09ш}a3}ёш jОHыfŠ{§ВjNщОDЖЈь{a Ъ~фEЏњbЂ7}!ећО„шN`љъMпН2-zW=7n Ђлњ43Йn §ЫЫ”…ў*l;ГѓњNЃgЧlbCЂЗ^\єцƒ„шлRЏ>ИьsгЦžбы1ЉЛШлшѕTЯ.;Б.?Я_†Э•Ћ7;^JѕЃ-)њОБuš#Ѓ'‡9”жO^2Юл›žѓЖЭN=;ц]лYN™”оvPЖOпˆў.ы$&Кw:Ÿ\єЖА•О›щЛМb`ІФчКЧ=ўки’Вя}monжЉg]LђВLЉоіeTђЂзyыŸбmYwэшЭ(ДCѕфКNєzDfчuэКЖ3;ЏяiЎ[}ж\7њњgTѓйJЯN;ёU—вњДОOћ=ovЯ{кцRirЬЛvC§ќАДС&­њ/ 2:эŒxuiњuЧЕ–и| =O_?"=Ѓћ+rѓ`їњйЗТэушkg?Їx[]йК1ЅњQиs]V[EяВ'—­ъžћF\єѓЭМЈж‹Z~яЖћrFіўlб=ŽЎлНkl{ГћК6+}прбЋWa›=/#Кm7ъVyЫоЮђВ9НTm^і­ЛЉ(й<ŽЎ™{uЯ;FЮ>‹.[=œŽЪеЇЭUЃЏвš}џ`nзЉvИLš]єŽCѕь wіМйAoй|‰7ЙхЧUЎџ/ан<ŠWN-ЅЃ3OˆqgФЋФцАыщЇШшcіьž7EF/ яˆ|rwZє54Њњ‘TНЊŒЉо4†Tп oЉ!е7mW=ЛчФqœ7–Д^д€%ОZ‡>ІЙxіІГЕŒьMfkйЛШжК_DзЬ^Чіš+FЏКњ ]<њљ>"КэЎ>6у=9Аg;ЫлkЅЊЭу№ілЩy}лQ(>ЫwушТнЃщ(]}к\7z ŒОќ•|Лt—zvвkэ8еГ“о№8љF№‹ К \}Э{у\P†ч–Ъбi—7‘б§ъйQ/%6‡м†eVяГgчМ-Б:2ŸлV}ыLŠ~vцTЏ+SЊя‘Здъ‹”%^Лoеm3йЋЬœьUfKЉоTЖьMdkЛьšщэ,Къzя6Ђz5Э§ц‚блЊ ш^ѕН’§A99АgПЌых-=ощj6пч"уМЎtхьСHзЎ>YчТбЫIєьИ3‡жњЩKЇККуЕ@uчŽ%Ёzѕ2ЅywCѕLЎ]пЏ+ОфНЁЈ?'У“KсцаSbкUоMbsЬЗ4;‰ЭKоЉќ&2zIњZЮe>ЖћYа~OМW,љК/хщюЛР„фGt§а–2aеїЩHЪ~†eЏ2Ћ]4ОЂoЬюыкGЬьидѕšEџ:6Uнцšблw!бНЫЛкWzЋТeЛ§-e›Џбƒ™ЈНєfy§лrFбEзјЊ ЗчТеЃове'ы\7z9‰žvІ[=y‰9yЏяЂеГЛЮuПЛŸqІUНаљ:ьЙјs’оа+>$Н!Ў?йУГKсцаsbмeоUbsо9ё*0љKfuиїъ™еаёxhwвГЛГя~/Lz*§*/Іzг|щ[…Хƒ/Bw+fŽя~‰l{Г›^yvЊЫжЏ+їеeз|]Й‘В“вЦбuЧћutСъu[Rѓc“ŠоМ Š>Ќєnж‹ЙЧю8\Жћw1ƒ№ўЛЈшк'Ф§\?Џ†+]<њФьКЁФцqєьА3‰Э‘бћУње'лtн№ѓ‹Мy]ЏtОЦЛПœunЗЄ­њевеn6C>1ы…Иу№BєЗIl^Ц7/ЕхIl^vйГc>Y G‰O{(§5p_]>ћ"Љњ}XођХЫ zvдKЃоКщУU.МрЮCvншUхО:/КђyXйАш~sщшЁй…GЗ%ОНLŠ~ОŠnћЅ^Жh5уХŒОџnn_Wюuз_moаƒ/FНЙбUЋ›ЯЊg— lNŽд#ёМ{vо‰Сїx•ЃŸm1ЭлМћ›тбЁ#иќ“О4­sKЛ=ќ†КЖФц%ѓ/>ПdV_ф№—”јЄєЖ7;ш-‡ъˆьЈъ[лБЙnuЏ5ГљіљьИЁСъVŽЭDхљи УККpє3­;вYбћЏфААIбcГ ;r›ŸЏRЂo›ЮђбЗЖ]gDєa""Ѓ Ÿ[F‡_щ‹Мqt{ЂхМˆЎщ4КjubѓYєьДБŸ]И;Г:ѓ[kѕ№ЫЂy9Э™3}zЅW—шo“иМœоv˜МlЋgЗ| Гzн=ЛўYтэоy$§ь wЂeџњЎmцТенктбЧЪњбƒЕ-=šˆЪбЗАCvщёИ•EˆэEєьОЎ[ZрBŸ˜иѓjЂ+FпЛ’šћ‡сњэьРžбт–ЎODXtљГј№lЯƒДœqєЅИdѓyєьИбп%09ѓŽіеюQTdѕЩхсъЬЙNl§}›Уn›GеГЋ^IlNћл–‡MnFђ—Ј5~Ъš  {Аћвy$§ь wЂ#В;ейA3ђ•ЖJŒЈ>6жюDэшССW:њкuШ.нм.>вћ…MhОE.є‰й}]‰ §jЅgчu BkW72њљ›Љy}'sœ}­к|Оy|нTє"КІ=Лm(Б9sЅоP—­>ЮЌž]7иК$6Ї}хq=ЊžѕBdtш_\DFoПыIўђЌЮiў’4p"ьСюKч‘єГƒоphŽШюUd_ЄTяв"Њ‰б1.н=ўŠGПj.}V>ЛЏ'q_EЯЮыJl~=Лn 1КпYМzАИЕЋ‡‘Н_эЩ=gЧ`ецѓЭc‰Œ.ъЧEЯnJlmyХГO‡КjЖшo#њлќДшйi'"Ѓ‡еГЛЮEFŸнР–им­žєŽUmLѓ№ѕџ@b3єф=p<њyєIй—Ш ьu\JіЖ-ЃК3ЭхЃЯ›kFПh§kIlў‰=;ЏяЧ5ЯŽI\шCєюГйy]ƒЕ­]=œˆЌш§Ь.ь8;Ћ6ŸnЗ[™zЮЃ‹§]›ће_Ln:›Ве‘б?№кtvмаO‹žvBєЗIl>Н(,БљфЄЖФцeužН]эй-ŸШ+€Иgwч=ОЭNzSTіЃ.Јњ^—4"жђеЇЭEЃЯ›kFџРцШшйy]‰ЭЇбГл†ЃеНХ-_нŸˆтеЃAЎ}rж­E?ŽШй=ушkіьОЎѓшЂ"ЃЯЊgЇ&ŸмЩV?ъаъйq#?.zvл˜шo}v}ZXdє zvе+‰ЭYпІ?%6/Ћ№Єш%рkš‘Рdјђž’оіfНvHЎŸ}эЫЪю.sёъ“цВе?ЎЙhєysdєьК> §M“ЯЃgЗ 3ыWїжЖ|u"ŠWG9-z=лГћКб—кМшkѕьМОqtбр/?,zvй‰Фцё§wщ№“ЁЎ[-њл$6gnz?fз+п|zyZXdtтъЫЩ]Wi‘бЃћђђn­QЭ_"Ѓ€‰вžFП*ЮщnGГ“^щ$—Я4—Ў6ЎўaЭeЃЯšЋFŸ6‹ўѕ$6џ€cћСьЖЁукTwЂ|u‹WРИшUіьОЎAєc™нз5ŒО.іьМОѓшЂЦб…Ћ›ЗрЕ›Gg—Тћн—“ЁЎ[yW›ЙщE~Й4Œžнu.0yщWЯnz-2њЧTЯ.zGdє§6%,њ&Бy)|C ””іˆєЖ6;ц=movаk‡фњйнфтй?ЊЙpѕIsйшГfбПЂгцФшйm#ЩлшоћŠŽK›RнхтеЃ#0/њY=;ЏЋпќЬžнз5ŒОnГѓњЮЃЋ§]Ђ†љnАФЕ{|$ІVЯnŠŒЮмЊ›OЎ™* L^†{uqЊПOfѕВџвcvЯ'›‹п†х|ЄЕДЧбЗ­й9яhGГ“^щ$—Я4—Ў6Ž7з>i.}ж,њW˜М‰оОЋ›Мь##Њ‘ е).=8њjW6МшgѕьМО~є#{v^п(њR=;nф,К,бп%,їfИqTЎЮGхъШшШЛкШЏNЯфu%6vНђ›UЇЬъ‹№ъй!IlјЋі0њЖ6;ц=movаk‡ф€ьnsёъAsщъasсшqsнjЭп$0yй6FF/б‡Ц„ъЮ зЏюyбЋъйuНшgѕьКОnѓcВgз ŒЂЏ‹=Лnр,КЎŸ=;ы\bѓй…щьДБ“шЬъйic‰ЭЁ[ubsшЎ—јеуrЈžѓ&еп'ГzIИ яŠŒ^ђўv €ЂкньЗЕ­й9яhGГ“^ъ4WЏю&Я6ЎNlŽŒўYЭГЫNЌSЂw‰ећТЌшghљъўсН^ьйuНшgѕьКnєWmсцqєзЏfЧ ЂЫі^ќЄшйYч›3яДВЏLHѕьА3џЏ;ZVТ0ЪћПtOщо(N9пYыFЭеWЉиD#Ѓ3Ї^цилчŸS‹ю”ЋвzЇƒ]ЈЏ#нQo|Mѓре'ЭЂџДG`dєsvoжKЛОшљЕ–ЅŒшЭіІEЏЊ[Г^:uqбПенe/Ф=VюО&zјъФц“ыRwе;ЧеƒgWш9{Ф .Бyu_ ŒЎс/K‹эЙˆHž"џЧЛЩЌŽјqx(0€ЏRUн ŸЉИт{rXv­…œ’кыNzы yјъУцбЋЃOšЧ~М ‰~ъ ‰оЏD/gcY?К~_–вбЃчжЭQЮˆоMЁ›Їtwг{п=~ѕзDЋўЏ|Iuwа%sk`є”pYZYZcЂГЮђCxvwЧЧ›€џКыЎјH=м>tз\SOК{ЎxnNЈо7_}дjО:2zZ*ƒЂ72ЂwЭг>1$z>аЕОœkц#œp*т†нMоˆž2/Ёе‘бЁпХШ.™бЧaTѓ"БрDUu'|Јfн!зеZwЬEUyеѕЌ;ш‚]sBubєAsJєњ}DєіSBєscLє6rјф%zќэ] ›?тЦнMоО‰ЌŽŒŽМ™†)БyњyЖЄ5РПVUн ЊYwШЊђЊЋђЊЋђЊыYwаБбЋЗб›Шœшк~ь љDШо>љЉ ›7yѓюц ЊЛc.KlЮМOпфpW7нŸЉYwШЊЋЃkУЊg‘бЗью‚ЋbBзrЖw-ђ+8ёІЬ'тyї`Hџ.ŸjЉq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/24.voi0000664000175000017500000002253710654601736023271 0ustar michaelmichael‹24.niiьиAŽ$W†б4fР˜іЁА$и“FЖАn#›АжТ6р]АЖРфвй]эЊЪˆaЙун?}NUf•"SЊo•яоќУ'—Ыgп|§т­ЫЫ/Оњђѓ—ўъ‹з/?{ѕЗW/__ољњђщхп—џМЙ}ђ№uЙќ§З^ўћщO.?{ћлѕкгл­ў~§њ;?јљЭ_П|ёЫЏўђЇЯџјѕЋб“x§еыЯ_,НyфЇ—qЯгыџњіљЕџ}ћќyџјіwПўЭѓПљ‹_§хРїPГОЗКšqPU^uU^uU`ЕшГˆ>Mbsцћtц‰lЋwfgR•W]•W]•W]X-њ,ЂЯ"њ4‰Э™'bць‘9хќ№ъjvФ1ѕоь§ъЉй1;UV'Fз­йA{$F/šЊEŸEєi›3Ѓ#OФЬшШ)я9O_&РїSяЬЮ8ЂЭNй­*ЏК*ЏКnЭкaбœPНвмПZєYDŸEєi›3Ѓ#gЬ)/sžЮм\.‘;"РнЉwfgQfЇьUЯЬЎйЇ*ЏњЖ9Ђ:1zйPНнНzЕЙ{ЕшГˆ>‹шг$6gFЏUЯNњАШшeѕь ]›/‘;тU`2pšzgvЦѕй%ЛеSГcvЊЪЋЎ[ГƒvX4gFїЏ^iЮŒю^НкмНzнЛzнКZєYDŸ&Б93:ђHЬŒŽѓ2З€Ь}ыђ,{vЪЩpЙTЭ.8Њо›В_=1ЛeЏЊМъЊМълц„шEsBubєJsftћьѕшоеƒцоеУшЮеушЦеЂO“и,њ<‰Э™быеГЃ>(Б9swYTЯЮй+0љ­Мb~PѕЦь†ƒъНй!ћеГ[іЊЪЋЎЪЋОmŽЈ^FїЏ^i§1Ќ5gFwяEЗЎFwЎG7Ў}бЇIlЮŒUЯЮк93EЎ+еГƒі LО LшЌfVWГ#ЊяЬ.й­žšГSU^uнšДЧ": zймПz­YєЧНкмН{нЙzнИz#КoѕнEЗ­ŽŒОЛџФйic‘б™gтЈzvжЖШшШAoЕzvвЩ—Ь>ЎђŠ€‹ЊйGеƒйGдЃй)ЛUхUWхUз­йA;,šЊWšћW‹>ЩjГш`=Кyј8КqѕFtпъ­шЖеЂЯ}woГгЦ"ЃЧеГУ6%6gNЇ™Wцn›љ)ТU^1№cQUГŽЊГ;ЈGГSvЋЪЋЎЪЋЎ[ГƒіXDT/›ЊзЂЛWЏ6‹ўЃз››‡oDї­оŠn[НнЕz;:Вzvмˆшг$6gFЋg‡m‰ŒUЯЮњ€ФцеъйI{&_&П•W UoЬn8ЈЬю8ЂЭNй­*ЏК*ЏКnЭкaбœPНнОz­Й}Еш“Ќ77ЏEЗЮG7ЮоŠn[НнЕz;КiudєОЈgЧDFoUЯN‹ŒWЯл”и<ЈžѕA‰Э™љ%ѓ›ЋМbрЈКšqP=˜нq@=1ЛeЏЊМъЊРълш„ъEs@ѕJsџъћ‰n^НомМzнКzн9{#КoѕVtлъЭшЎелбMЋEŸ&БYєy›яmќ˜Ж)Б9t{ЩмШеГsvЫ+ЋЋйЧд{ГCЈЪЋЎЪЋЎГ{іИmŽЈ^FїЏ^iЮŒю^НкмНzнЛzн:{нИz#КoѕVtлъЭшЎеwнДZєi›3ЃяюLœЖ!Б9tІŽм^2—лЫ"{vЮ^ЩРqU5;с К6‡eзЃй)ЛUхUWхUз­йA{,ЂЊ—ЭеkбнЋW›ЛWЂ{WЂ[WЃ;WЃWoDї­оŠn[}б]Ћя0:ВzvмHdєн/Гг6$6‡Юд‘лЫjѕьЄ=“Џ“€ƒzѓ}5Луˆ7ЕUaеѕ“]ЯЂ3Њыжь =беЫц€ъЕшюеЋЭнЋбНЋGб­Ћ‡бЋЧб}Ћ7šCЋgЗ н]tлъЭшЎелб‘еГуF"Ѓ#—ЬшЬ™)sІŽм^VЋg'э˜|˜ќ ­8ЄžмЇЈКоЎf—ьWб1еѕмьœ]ъжь =беЫцЬшіеkЭэЋзЃ›gЂ[WЃ;WпYtуъшОе[бmЋ7ЃЛVoG7­ŽŒОУѕьИЁФцЬшЬ™iT=;ы›CХЬ?.ЯВgЇdЋg?2TеЛћЪЩЎgfзьSX}PНhNЈ^‰n_НжмОz=Кyѕ Кwѕ(Кuѕ0Кsѕ8КqѕFtпъ­шЖе›б]Ћя0:ВzvмHdєнНSЯNли:žЎWЯŽњ ФцЫ"{vЮ^ЩРџлБЛхFu Ѓ~џ—юЯœќ [ЄRnmВVКў.@-РšЊ;рЊўV'Езн-гЊђВЋђЊЗЭећш€ъAєђеЃцхГЂзЎ>Š^Књ0zхъуш…ЋDЏ[§(zйъ‡бЋVGF_№§шŽ;ЙS_l’w‡=”и|Pнѕ\`ђmWн3-Џ€SѕїIRoСUYеѕЁЛd^}ѓ’дFwЯŒmsDѕ>: zН|їИyёъЃшЅЋЃWЎ>Ž^ИњjбыV?ŠV§ЃDПLbsftц$?ЊюЮz"Б9є&АЏюš˜ќG^1?ЅюOuWœSoСuзrB}ъN™WеѕЏюœ9Ее4aзœP=ˆ^П{НvѕAѓке‡б+W_,zсъбЊжЃшeЋ#Ѓ/ї)vЇ=иœyf:ЈюŽz*БљzS §“pЛХ§БрwЋК?ї5G}ъN™V•W]н=SЖбеЛш€ъ}s@і0zѕъqєтебkWE/]}­ш•ЋЃЎ~YнvLєЫ$6‡NђЬ“оЈК;iBbѓЎК;gZ^1П\u|CU§ПфЈOн)ѓ*АКўе3ЅЖКƒfьЂЊїбыgš—ЏG/^}ЅшЕЋ/НtіqДъ&њe›Џ5_КГžHlVw'ЭLОmЊЛcNШ+р—Ћю€oЈЊћвqJ}ш.™WX]еUеXНmŽШDЏ_=Š^Оњ:бЋW_(zёюУш•ЋЃ#ЋЛУ‰Œ>ЊюЮz,2:s(fžєіенAs“я“€—Јъ.8Џом—юŽ3ъCwЩМњЊ;fVVWVoЃ#Њwбећц€ъQєђеУшеЋЧб‹gEЋўqЂ_&Б93:sОŒЊЛ“&$6яЊЛsf&џ‘W МDu|CUХ…зЛюЊЋ+АК*АКЋkЇЛhТ>: zН~ѕ(zљъaєъеушХЋЂ3ЋЛГ‹ŒОаўбѕTbѓ К;hJbѓ-єњђ‘н№kUuœWonaнѕЎ;фŒ ЌЎ ЌЎРъкшю™ВŽЈоE'dЂзЏE/_=Œ^НzYнѕLdєe6НюЄ ‰ЭЛъюœYЩwЩ№UнченчдЛюЊЋ+АК*АКЋkЋ;hЦ.:ЁzP=ˆ^ПzYнє\dtцІ—9_n‰ЭЁ'Нью р*ЊК ЮЋПК3ЮЉРъЊРъ ЌЎ ЌЎ ЬЎФъmtDі>:ВК;hFdє%іюœI‰ЭЗ/йн!ч&№ІКОЁюК#NЊЪЋЎ ЌЎФъњЊ;fV%VWbЕш—IlўЇК;х„ФцЬI\RUwСiuзqRхF‡…WbЕш—IlўЈюЮ8)БрSu?ш?cмТYq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/23.voi0000664000175000017500000002632110654601746023264 0ustar michaelmichael‹23.niiьи]Ž,GZЧср‚eј!‹ С6И1š#ФиШУXkс60Л`+мМtw}eфGUцСчDќлЯcйU>’ѕ:2"Ћџс7гєл?ўќн‡щћпџє‡п}џЯ?§ўЧяћУП§№§гХЯгŸOџ=§ЯлпПЙўењГщ/?~ўћпЖ/§чпoПQзŸќз?|їзп§№/џєЛќљ‡Н?|Т?§јЛяжоўЭ_Lћ=ѓїџыOэ{џћЇіЯ§ЧŸўnљпќЋПљЪОБъŒЁоѕŽ8Їnz‡œPX]X-њ[ ю]rFbѓ”и|ЉюнРЏIUѕN8Љnz‡œP•W]X]еUеЂП‘esDЕшo%­їCztя”“Їkuяˆг“рзІЊz'œT7НCЮЈЪЫЎ ЌЎРъЊРъOYнЛчШшUvяœƒЃлм€шРЗбН[ŽЪtя“Ї[uяŠГ“FНыqR]ѕю8ЅЋЋЋ+АК*АК*0{­њЋ‰Œ^eїЮ9(1:hвЗИyэјб5-†мЛш€їЪœuqЕŠюtHа§їж{‘и|Ћю]qV`2РUе;сДЊМъЊРъJЌЎФъJЌЊЎJЬўе1н‘б)+ЄЭLŒNYлБc7яDю“Dї.:",ї"Б9єKфкЗъоРјъЭхЂsШ UЗъ[|€JЌžEчTWbuttvuчœcкшЬъшІ:eQ?ЂыqІЊй3ц:wэZD&DзSНыі&oGїnzщГDїN:`Йwєю9$jТw‰ЭSbsЮB€ЯЇЊwС u­­ЪЩЎЪЋЎКWWLѕ,:ЇК–ЃNЈЎФQW~ѕШбѓ.Ѓўfj^=EE/ічjF>Є&1Џљ-2ЂyЕЦO~нЛь‰До‰Э[еН‹ЫН LnПeхШ+€-UН О@UPі-ЕrЊЉU)йѓвДшš]їNz­жЃПКrF§шкŠДz#zјQЯГšъ‘GнTнОzT'DЗлѓLПД6–rLѓFuяД]md\rШ”#›wЂ{WН˜Г[,$6OЩSи/9рЉъp^НщнpZUJіЃГ*Ѕzо™]бУW75vѕ=Ћщ;КЖЃЧЎžUХŒКЖЂkљb0ёбMшибэЋ{iNє,uрцeєККOжsЭЉ§ИКљjž–МИcšг–FNё^sяЊђŠпХП LžЦ~rоќ.0 OѕјUй•Q=‹|ПŒЈžGжUЯž#šЪ Љn*kшъљ2N‰ЎUt5/†ЌоˆЎцХрбMѕШбu zИъэш šєМ:'КYУ6ЏžфšЇUT@ѓЦƒў№Щ[ђš“ЦМ~о>ykЃыєвчhю]єZZяE`ђДјB›"0y §Ѕ№KЉо_ЂT3 еЕŠПК*АКšъЫхњc f][ГLYеmфРбѓЂІВjмъ&(&zoдщбНкvе^ѕиЭ›Ћzф9ПŒђ™z5ЪбЇќaу iјцџ§у7ЏЃšЇнЉц G^ТИ0ќцМ—\yЩ‘kyŠй2“Ї€п_SUя‚/Y]ЊП’КhпъsPU`ѕfєшjЛzьЯАˆОќ}№mtэ ~0ЂП™yeХEзюV2‚еI]‹—звq›—бЭJ4љUtЏЊViaбѕxgьцYє§ъ~vЬzЁ‰ШббIЭГЇц цKtXѓъьsL\№‡РфщvœЄ L€aUя€/Q1еГаЪЈЎѓ—cЉ›цНn9ЧдVѕр*<:Їz'zьOА=њиЗЂ‡_,‹шоd†477/‚Е4ын­ёˆЭЋшiЙšlоŒыaрпДЇШаKљ!2zкŠюнєв|ГHi^.Œ„тЉюнr\`ђ4іщЗ/0јЋ7НЮЊЪЋЎŠЋЎŠŽЮЉЎєшYѕи`;z№БзVѕшke+zјО=ў]ЙŽПy}'&4/F‘It@ѕ#51:hвšП‘Єф{]NѓЌ/ЌyЋКsиmcZsM1Я㉛\bsфCн#5$њqуЭюСС›—б!ПѓˆZШ7‘бSvtяS›Sv ~=ЊЊwТy•X]ІЌђšщнrXUbvdu-ЋТk­wвŸ$:ГКwб‰ЭЋшо=‡$6ч/ГОЌцkaHђдDf4ЗЃН] МuŽ<}žцоM/iўFжGяЂзВ&|‘и<&O‹ѓ;Ebѓ§WwaђŠјмъMя†гЊђВыЎwЩ 5з;цЈЊРьZU_ОlŽїfєшеŸ(:ВКwд‰ЭЁ{uўБиЛхЉybVѓЕ2­9Єї]`ѓFђшЭ[ЩšyЩ‰wр–{‘н;цЈМтwЩЁб™П$€Сд›о ЇеEяŒSъЎwЩ 5з;ц каЛщЅ­шбЋ7›GЏNŒоiЛ:2:ryDnя“?DF=Ь#/—)ЭY #Бљ“Dї: -љЖQ„%gЏš{чђ š#Ѓ{чќ.Џј]bѓ[uяјЊwРyuб;у”ЊРъzTЧдз†оM/mE^Нй\EŸМнЛыЉЯгмЛъ…ЌцZž~Э‹гoјфй3ZѓжЈ{—=1kŒiоюнѕмfuяЈWfЅ1Э[лsяЄ›ƒvКЙМтщнЛсМРd~Њz|‰ЪЩžЅЦDз‡оЇTхEWVзVѕр бu}Зkд UmѕЧ?G_,[бЃЏ№ ŒЎ§шоiћVбЭkc?КwзS‰Э;бНЋЖд§И‹Iž?‡Ц$пSЇшоiћТЃз‡јИvFн;ыЙэшоU/<2sšgE9Э[ћsяЂ“з_Б2&Gў ЦUНОHeз-Ж*&Л*ЏКЊЉюsPUSЁ6Ђ‡яЏuѕ№SЏuєјKe=ўЏZTм•ЕŒЮkЎФц„;0y7Кwж–GTNѓьшˆIž?‡ІOOЂ;w=ѕ(LŒj^D/ОЗŒъ™3чшоQ/н:“šзv ›УѓЭc=ї.9#*јхUѕ.8ЁnЕ•“]u‹­œъКWWNu%VЯЂ//{ЦUmuЦЌзбуWW5еЫКЎˆшjЂšЋб\ ‰ЭаМнЛjЫЌ*Іyvоm­чЎiћiОy&Ќ‹ЋНшЮYЯ-Ђ#Ю“GtSп5щЕћ`чб}“ЈљВИМб;щЕе§аœДiЬDF/П_ЅL~хЊwРUuЛшrFнЊяуЋКХVbuU/Ђ3Њ+Бzž=ЏŽuLѓjQїю9ЂюбyЭіЁ}$6ЏєŽкєЈЪiž=~.ZЧMžЇ?р›шБЋWб—ЋŽEGмЃ}аТйЊ=љБ>’šoбуп}s1[F#В:БyVн;фЄМb€UuНшлqJ]Ћы^?ОЊkmЉўЪкшСЋяїп-ЖЦЏ~є-F=rѕ2:bдбЋњ‘зNКkдaЗIч4зBяžCтšяK"Њ9dmЬКкиq“gїДŒйэбyšEwNzэБf+Ѓwд+ЋS0 yZ=й%И†F57ї`я”уr6К™Шш эy&Б€ЏЋЊwСyѕюzе9хИКWW@ѕ#uvе7щЅйЊИ^жјеЭ€бCWЯ o—5|ѕЌ№vYУWЯ ЋuяВ}ѕpНЙЉnѕ{)БyЃКwа!yЭГи€фfЋОіCЛгDЗЮhžj}я пќ.jШ7ЩAїпCткШ\‰Ћc ј~В%Б€ЏЋzœPu§QAезиКWФпbы^0ѓ6КІљЬGеx1ѓQ-ќ~5|tеzд5zuUе2vєцYtХDзЎоeЯhў6к;0Ѓyy^?@яЊчлЦшЙВ–ђ…цo#Бyђ§0mШсбНKNHlјVЕ%Џ€џkЧ^–‚( ђџ?]c!Р0šfс)Ў#shwЂЃš‡иЈZNЫE€ZbЋ‚Њїбsѕ§гЯЂяОтЏжwє§чф[ы+ПЛы“JŽоVп=К6v?RЂ5џ ЭџIVэгЏhˆNlŽŽCtwЯФц˜7Рфiї*#Б9ыј%j>ЬКSF=Skе3b MŠ~•nšoп}}џхоЌoptНІќЎ^ЛoЗянМыЌшФцШшРфГшѕ™~cQ+МHl>NGwа€Фцябн9c›ЇФц)0yїЉ$Б9р ИъИfЮ­YwЪЈgj­КsFЌЅU9йu}ћъгшЛWW`uFo3›їКУ>љEЭнYŸЅѕЮђŠ3›гбн3"Б9s:ІЕ5(љ›дœЕТЋШhnЇЊЛрš9Зfн)Ѓ–жЊœьЕДоК“ўЉNЂo_]‰ечбЗЎЎПшюњ$БљoбнYЅѕЮ›Ппф"šбн=CтFcЪl~П‹5/еSЪ\DmРUвTaЊцУCwЪЈЅЕ*({M­ ъ:DTŸDпОКЮtG}vЬН}ђ1КЛgDи\<эІ"/zZ‹›ЇФцї;RNђ§8w‡\‘и<Ѕмхv›~NЭ‡/н!уžЕѕд3ЈvбеkkUзQwв?Ѕѕ>Ф-ђCtѓ”гМНЭХ4o()Щkє””ќzF5'mПЗишю†Ы“ШWUѓЁКCЦеVwЬ  ŒNlЮŽю˜AЏкœф5zОшNЗD'%Oiг< L^ЂЛ#. LўŠю~PUu'\TЋю ЊђЊ“s›г6bо2OktwХ5ЩЯшю†Ы“ G=tG\SšџРф)0љ+К;рЂ?ZЪУZq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/22.voi0000664000175000017500000002663710654601746023275 0ustar michaelmichael‹22.niiьи_Ž,ЩUРс4№Р2цЁ+@‚m№2ШТcdГVРZx€ xl…—`ЊЛўefDd–™[чœіїYЃле’їшDTѕ§‡_,Ы/џЛя>,пџњЗПљеїџќл_џј§/јЗОџqљєЛхЯ—џ^ўчЇџ~q§пкŸ-љёчПџэњП­џќћўѓOэњчяџѕ7п§ѕw?ќЫ?§ъїУш‡_№уoќеw{?НђЫИчљљ§a§ьџАўЙџјУпmџ?џъo~†r€Дш€?B+н FЗ‚б­jttУЫj6Gќ*6_Yk-:сEэStЦ+ZсцJбšпЄbtХц’7GХz)˜\ёЭ{ЙDGќ1D№vэ*Ку­е‹nЃ5ПIёшш’ѓ 6лwЉиМLОFGGМЊbГшЗ)ЙгKХцЅ`2ќПДЛш’гкЊЙFw[E™іfаЃ‹ьѕj;J4Зѕ K4ЏЦ\хЖ]ttб ›‹_бЗя‚{NYр(]ё"бяв*VЗŠе›ЏебмДжЂ^гnЂCЮkэ)КFx[5/%цнкfаЊ[Сш~sЉшwHПЙdttе\Хц~ttд‘Ui‘цe=ме›…§ЭlЮ^‰цЭAЌBєлTlЎrclLДжЂ^гnЂCЮkЯЭ5Т[{ŽЎ1яuѓRbKZСшV0КmЃ+\"лш 7_‰›щяFюшas‘шeљ%ЕN§ЭДqtpйФ&ВDsџЃRюфeT]u Цo•ŒЎВЧ%ЃЋќRj7б!чЕчцсmг\aо­МКmš—чЏГкF—k^EчЭn“шДеуц%эЈ‡Э—oВŽzмœ7ztлнџ С}]“ц“˜j§ГyЪ+г<‹ŽN›щDG'ёнrZхшЅ^sо›‹ќC@9­Еш„—Дgб1чД­ш c›ойЛ1Ј4ЇЎ6'Ўž4Ї­ž6'­>hЮY]1њА9euЩQ_|ХъшКбoRrЇЂKVGз t"sЈ0й[ЎшoьБUЂ nsбшЅb3@э&:фДЖsFл‹N:ж‰NŸнmЮ^=ˆЮ\=JЮ[=)N[}аœГКbєasЦъЏАњDvtaO; (8ъ}єцIt^_oАЉЃwsmївFЯ–!kѓgєвNk] КjєўТЫn[2z)б\ютјTБyIќ|3­Еш„—Дgб1чД­ш cЛфйнъьй§шфеƒшдеЃцЄеUуцœеГоЌб‡ЭЋ+FŸh.ZнИWВњыDo^ˆnм™LЖTєюЕРМЎљ'­>8v“—^utб ЃЮIєЛдўќ6:щXБ_Ul^юйбЏ*˜ IД›шгкZtЮm/:щH'9}і 9yuЭYзЌ.Й!Уш”еŸQуцŒеГкЌб'šѓU—ŒЎY§…Ђ7ЏDGnЭ&›ЖzКЅЂwе‘…§шЭ†„vŒЂŸВCћКЦб coJFвбM‡*6шoЃ‹Ю(5т‡ŠЭЫgvt”дЂSNj[бAЧvЩљГЛЩЩГ‡Э‰Ћ'ЭiЋ?ЫЊU*Y]nC.*EпЂJЦkеЌ9]є8Д`ѕ’њугd!JFч­žE/ЕЂЗеЁ‰{ƒшUvh`Я0:aын$ZѕЯЋbsЉOww“.ъЄъ/ншшЄž?;GЗМЄ`ђђјUbЕ‹шˆWДgб1ЇДНшЄ#фєйƒцдеУцФе“цДегцЄеЭIЋЏTПKЇ4mє­Љ;нЌе›ЁЎ33GзИdєrљ"aѕ<њі#QuƒшMuTнР(zе](:oѕ,:YъУ4КfutмШ‹Ž.›(˜|џ7ЅRЭƒyбUzЭбM‡іббEЇЫНЊW РдnЂCNkkб9gДНшЄ#фьйƒфдй“цДегцЄеЭ)Ћ›3V—Œў)ћічЎ5sѕUgОщЃЛK‘ЕzзЏŽьыЙ6`ЮQнеЂŸЊƒ#ЗЮE'ЋžEЇѕqєR,њQЙs":Ÿ3ЃNЇdєА:с*пн&ZeЦn…•šяЗpЅц~ttд‘NstвiЕjoъ№хД‡ш”“кVtаБ]rўьnrђьasтъIsкъisвъƒц”е‡ЭЋODчЋžЅІ^юMљц­ОЉннффе§ѓ—4zS7ЈŽЎмшжfѕ,:эЈЂ—rбQGgЎF/ ЃOVGWnG'T2zPs—яю#­0сЋѕЋ§јЊNє§‹"ЭНшрЂ3VПn…–@Aэ!:хЄЖtТЎЙ@vЏ9{і 9uѕА9oѕ$9mѕМ9gѕQsЦъуц„еГдzбЯЏEGŽ']*:ѕlЉГF;ŠŸцбIЋ{бyG}-D/iЃлфѓtошЁћыб•GбKшчЇŸ?иГЭ]?Њ:вo.н{! ч”mrъпЌ›s/ХнSхpQвyКйЊ$/—ж§WР9эYtЬIm#Кч”mt…ь}sўьnsђъAsцъarоъYrвъƒф”еЧЭ Ћ'ЅЕЃѓU/ЛФ{hтш›ZЃОњбЊ{G1§VяЃŸЋЃы*FwšŸЋЃѓККЭ‰ЃћН›ъшШ­]цгУл—y]Нфьpщ6ЇнхЋ~ѓ§sTNƒцм*6'_оŠЭеб PV{sRлŠ:eW]!{ПКгœОКлœ:{TœЗzVœ4њ 9eѕqsТъ3бщЊKFячмб7Лй–‹^Я::mlПЧЊ;‡Џ\tъЮ ’>zзМutнР>њЙ:КЎЋ“МZшОŽ~ђЃ:КooзЙYŒЦ‡/qѕЎЙкЄŸ|ќœ6Ж›kъ_X†Н’бйпЉјSгЂ^гžEЧœвіЂ“N)™]sиЋ;ЭщГћЭ™ЋGХIЃ'ЙiЋ›VŸ‰ЎYнибісыПKоQушшВ™ŠеЛ-NнЖ{§љ0wєВЛEVЂл†:бљЋлЌ:ИmhНЊnй5ЏЎшКО^ѓЃ:КЎЋŸœЕіУ09qєЄ9mtХцQttж\Хцб\­к'›—ьш~FэYtЬ)m/:щH'9}іg`­ъ[[­ъЋz+ВŒ6;КjjpSFЗс)Ь[=‰Э[}&Кfutу^З2}ѕВ_=yМћфбп‡мc-qНшUutaЯ(zЩ=Xъ%yѕ№3iъшЂеьЇЧСm#гУ7аkОgGЧ šгі^ ›GЅцшЎЉ‚Щ“wёдъЈWќЁ^ё‡‚ЩoвžEЧœгЖЂƒŽэ’ѓgw““g›W?њ*Uп•šѕЇjВЬ;КlorѓVйш"еЫˆNW=и‡ѕ_!:rkДФыoЂ+7ОNєЊ:КАcН$Ž>ЎŽьEчЎ~NнЫ~<NšэutлHџ0ІЭ§0hN=j.н5SЏx)љ%џщёЂ^ёEСф‹‚ЩoгЂSNj[бAЧvЩљГЛЩЩГ‡Э‰Ћ'ЭiЋŸт Uп•šѕЇBrэЊЕзгкЪбщЊ•%ЃsWЉшЅ~tВъ~tђQЃ/-йЂOTGvLЂ—ДбW“ърВ™qupиФdC‚ЫЦЦ{зь4ІU1Zѓ›” О(ќЁ`ђEХцќŸ"Е‡ш”“кVtаБ]rўьnrђьasтъIsкъЇОBеwЅf§Ёд†|FекыimхшtеЃЪњбйЊ‡ћP2zI=ў|—xдуI'u?zW\Й1ˆо.Htцк,zIк|Њ:ИАЃwьЅ9›яњЃ^RG7$ЕЏПКbs':Кш„RБŸŠMјSХцФ3І &_д+Jj7б!ЇЕЕшœ3к^tв‘ж‹Ю}ЉыF'Юž4Ї­~юЊS§PiжWХ6dВг9ЃgБYЋч.§yІѕ|“F\sIЋП^єю/‘ФtЉїЃOЁпмЖ/ЦFn ЂЗеБ‘[_*К­^ ŽмF?U'v\Г& лзuы{Д&н‰žЇд:еэ‹Œ:Кш„]ttа­аVмUn.нёšŠЭYпБ€/Ј]DGМЂ=‹Ž9ЉmEБ‹Ўн‰.PныŽ.:ЃbuХ щ5ЇЏочцЎЭ8qu/2GŠЏ­IЋЇЭЕЂW/ж ЭšГŽК`єСvTŠnы—#;Э›шdеЃшЖ~96rkНЎŽм:›ИЗoнWЧvtц›sWЎ}хЊЏTŠОz.-§ЈŽ.:ЁеYŠбoSБ9ч‡аC“оЃ=DЇœдЖЂƒЮиEWШюDЇЯю6ЇЏО(Y]qжћре§шфееHн]шье§S˜;zpuфѕшКЫ=jЮ=JЮМуцЄбН˜<КŸМоŽlбЃц{h­шієБ;Лв^tlто~МћЃ˜Ng'ђWї9}єЖњљQtкиf‘ŸЊЃЫmюŒ’б5Дкеб!/)]хЪи(˜ №&э&:фДЖsFл‹N:дiЮŸнЮ]=hЮ]=ŒV§-|•ъ%}uwЬ%ЃГW:uєшІѕ№ъH=lN=nЮЛ“цœбнрмбУdб?Џ}чО:Юpг7w§-tЯ^ішIulзT•knЃ[^ЩшЅdєRБљЂbѓ’љ7€Zkб /iЯЂcЮi[бAЧvЩВЛЭЙГGЩ™Ћ'ЭyЋЇбIЋчЭ9ЋšSF/ЗЌZеW_(:љ‡‘б˜3Gw#qЕш7™мIЃХї<ЖЎk˜ќxл‰ ьиfюЃѓщŒVєЗалс%yѓ4:4lІНфnD'џl7ЊЮ­dtw“Нъеб%/Љи РзгnЂCNkkб9gДНшЄ#фєйƒцдеУцФе“цДегцЄеЭ9Ћ+F6gЌ>,.БњФrф‹^ю[PfЃ?]ТfбyУ FЯv:Љщ9ЬЉГщЃ;“-жм6cл†К+œ;ЙпМфn^КЭŸуЂŽTИоіDПMѕъш’—TЎŽЎ€ei­E'МЄ=‹Ž9ЇmEл%Шю6'Џ5gЎ4ЇЎ6џ”œЕzм|)ЮY=iўuЪъitв™7']ƒш„ХЫqtЪ9ЯatоъƒЫ:ЉŠбх›7O‚гFzЃ-жМŽnщ/qъфоМ=›)t_<дŽО}tFЅп•Z‹Л’бїьш р]кMtШim-:чŒЖtЈгœНК›œмMЁбaƒёЩR@€њднq\нtЇV•W]бљЭб%њ5ю›#ЃЛ{ L§:ЙбŸЏšSŽKZрЋШшЬъШшмъю„Ÿ БрБКш9ЎfК[ŽЊРш ŒЎРшМтЬцќсHЉ^E'Tшю #›ПDtwЮ1qСoт‚п$GЋўљEFO‰Эен ч&РUUu'œSн!ЧUХEWхEWхUЇ7wЗоœR}wfdпGGdЏЃЊЃ›ПШHw’W н%g$6‡ž1‰ЭSЪ#№ЇЋн'дUwЩaUqбЕдsHmыЮzhЇyшшНц‘Ѓw›ŽоoŽŒю.лїХzмшФц№шU~wйОEbB№›ЬЅ”Х]xk‹~Y7 o"ЋoЦа=Dѕ EGwwœн]‘ЊЊ;с”њднqBU\tх5зBwЭ1UyеїЭ н[ЭЃ‡я6\§ YєЗ”ии==™ŽПЌ"ЃЇKwwХY‘еЩVYЙяЉ~™ФцшІЛтДМbОžzз]qFU\sU\te7ЧTWхUзJwбsыцёГ7›/аЖЊЛ“HlŽ<]ІkkPѓ-zЪiž}h jNќЄ5ЫW‘бQw <‘9Ь™еРŸ ЊЛрЌzз]qJ]u—Wsн1ЧTхEзНю ›#ЃWЭбЗвРшЄ•оhП:2zЪм=2ФЬшФЧЅetwЫa‘б‘’N№›ДоwЂ_%2xЉzз]qJ]t‡Wsн1UХUзНю ›ЇЬИцšНŒˆž‡†EзъѕШ“]9ЭгzЧыю9&2:ђСcJl^TwЇ—иœ=%6'+W‰ЭS`ђт‘:H`2№Zuбr\ЭtЗTKн9Чф5ПE†%D__‡D/:CЂ#‘2ѓANъХэ—нtШ,:Іy6AЭwЧawЬa‰ЭSbsfє”инqNbѓ˜ѓ pZUu'œS7н)GUGwwœ“Wœ'qяц"уЏАИC{БkЄм‰ =н-toЬa‘бЗъ цKuЪMј)юAщ]rtwЦ9Сбн'%6Їэv›ОЌЊъN8ЇnКSЫ+~(q#Ч"яіЛlн'%F'6gŽtшЉbЉ_&ј^LЋЮюŽ8+Б9і9Џ;^Њ.КCЮˆ ц5Ї"q˜їŒKtwХ9‰Э‘\ннpZdtfuфTЧFw7œ–и dЈ7н№-$ЮrонqRbГш—‰ŒŽмЅsЃ3ЋЛNKlўБК;†W?ъn8ЋЃ+6К;тЄФцмшю†Г›EПNdubѓ”и ќ_ћtl0 У@,ћ/ЭдщЌЦ:^€ О Ž$лs)ŒNat Ѓ›+ЧбњТэ„9бз46wF№?ЩvС\csetcѓги Рз 0 Ж\q{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/20.voi0000664000175000017500000002424410654601744023261 0ustar michaelmichael‹20.niiьи]ŽcW†aИ`ЙGЈХ`м4JD„H% €0.`™SсfбU]щnŸ}~Є’зўЬѓ”,K.K~Еu|ікўУ—ЫW?|џхГЫ›oОћіы7ўю›woОzћЗЗoо]>јўђѓЫП/џyџјтхякЯ.П|~ўћoЏKџќ§њыдЫѓ§іЫ_љі/њњпПНљ„wпНћњЫ[яџѓ‹ЫИчѓзџѕуѕkџ§ёњ}џјёwЫЯќеo^ЁкUw0‰ЊъN8Ћ>шЮ8Ѕ*ЏК*А:1К*АZєн$6ПD_ВЂЪj~Љk~˜ @Јzж]qJU^tU^u]щЎ9ЈЋkЉ;шбї"њ^DпЭЧи цШЭeQнsXbѓхcvwАЎЊКЮЊнgTхUW`t]ыЮ9Є–КƒŽИ‰ЈОmЈ~˜шщЋEп‹шЛIlЮŒЮмЧ#'ІEuwЬa‰Э—йнџЯъНю†“ъEwЧUyеUyе]KнAGмDTп6TЏEO_Н={ѕzємеƒцЙЃ#WZєнDF?аК;jWbsшœЗЌюЮ9(БљђYvwШYqСЈЊКЮЊgнчTхUзgК[ŽЊЪЋЎˆŽшОmЈ^‹žОz5zђъѕцЩЋGбSW?VєЬе‘бv}t‡m‰ŒUwgm‹ŒЮœ>жЊЛ“Hl=Н\ewЇœ’W РkЊъ.8­žtGœS/К;ЮЈРшњ\wЬQX]XНŒNш^ižПz5zіъѕшЙЋЭsWЃgЎ~Аш‰Ћ7Ђ3ЋЛгЦDпMbsftфFž9Fž.7йн9G&?Ы+˜TuœWЯК+ЮЉЪЋЎРшКв]sPVзRwа7бнkЭгWЏGO^=ˆžКzдFчtзЕюœc*АzйQ§ бѓ—šчЎFЯ\§`бW‹О—G‹žЗ{;Zѕ+}7‰Э™б™ЗъЬё4ђ 0ЈюŽк•и| §љуђYww$Јъ.8ЏžtGœT•W]бѕ):ЇЛЎuчRKнAGмDTп6gFЯ>ˆžКzдj%zњілш€%DЯ]НˆЮИОkЌ;mьбЂч­оŠžЖz3zжъэшIЋwЂчЌ~ШhеЏf7Zѕk‰ŒЮМЊrƒщЮHlЊ‡йнY;›/+йнAЧ&№ъНю†ГъƒюŒSъ“ю”у*АКвЃџз~Н-)В#Qфџ:І . ””—N‡6цў„ёД,,RЉьn9*~апеЫЧЃWŸљStЦЊдTwй†yєКеЭЊ_k3zеъ7Œ^Дz'zЭъНhе/Г­њU"ЃпtЋЛ‡›CoM‘ЗъъюАmЩWЩWЩМƒњанpV}ъЮ8ЅўшN9ЎЋ+=КЛхЈјAЧTПCtFz\џюл2^ЙzНpѕFєКеУшЏrйъЭшUЋЗЃ­о‰^Гz/:Јzѕ/ƒёЈKѕыEFяWw%6gFoWwЧM%6_ІйнY;›/ƒью cОZ“’xUнчеMwХ9ѕЃЛф„ Ќ.бџHbtU`ѕЏш„ђчшˆyзHwдžaєъеяНvљFєКе[бЫfoG/ZНTНњ%{<ъ№hе/ГYн8”иœН]н7•и|™fwgэHlО ВЛƒЪ+рTwР_ЈЋюˆ“ъ[wШX]X-њЉЗˆNHЏG‡v uWэG/^=‰^;{НrіFєКе[бЫfoG/ZНYн79ъШшЬъНhеЏ“иМSн7•иzCЭќWwGэ LОЩ+€&ѕЁЛсЌњдqJ§ш.9ЁЋKє?’]X]Яе э5жЕmНvѕ,zщьyєТебыVoE/[Н­њ•ЖЃ­ŽŒЮмw<@эо‹ŽЌюЮ›јнЙ~sшЕi^нЖ)Бљ2ЬюN:"0љ&ЏzTuœW7нчдЗю3*АКDџ#UйX]ѕ\ў1ёIєкеГшЅГчб WoDЏ[Н­њЅ"Ѓ3ЋыэNюДЙШ§иж7YyъežѓъюАmЩ—auwвЩŸт‚€УЊК ЮЋ›юŠ“ЊђВ+0њ–Ж"&T].'` uWm7/^=‹^Кz­њецб WoDgVwЇmŠЌNŒŽ\Шgq+zньШъФцаG1ђа›VwgэHlО ВЛƒŽ Lў’ж РџЏКўBеѓѕUнbыSwЭAѕЈ;ч˜JЌўPў1яqєтйГшЅЋЇб+WПYДъз‹ЌNœѕЦ‚Ќ[Н­њЅ6ЃW­NlN=Ћ›ЇенY{ђŠo›/йн)№ОЊЊ;сИkk}ыŽ9ЊtзSX=ˆ^?ќ9:bоушХЋ'бkWЯЂ—ЎžFЋ~ЙЬъєН~юя.››яЧТе[бЫVoFgVwЧM%6‡z™—НAuТз@ц‡зSvwЬ yХІЎК#NЈЏфЄьzа]sP%VWbѕяш€ючшˆqЃWЏG/^=‰^ЛzT}IЉОмwЮ:ч§8нъ•ЋЗЂCЊSЎ}o0ъцЗxУ„4_йнAЧ$6_.9рŸЊн 'еЇюŒъNwЫQѕЈ;ч˜JЌ~‹шˆ№QєђйушХЋ'бIе—Фъ˜шЫ8zёъйZЏœ=mV§jб™енi›C_цуъюЈ}yХ7‰ЭWyХРЎЊКNЋ›юŠSъ[wШ uЇЛхАЊРьJЌЎФъчшˆ№QєђеŸ‘‘еqГŽ\ыФQ›WЯŽЌžFЋ~ЙШшYuwжŽФцQuwб!‰ЭWyХoЃЎК#NЊЪЋЎфшЈђ ЌЎzƒъюœcnЅїб сЯбу~оъˆшAuwбОСЄзŸDЋ~НYДъзKlžTwGэJlО„^œВЛSNJыxѕЁЛсЌЊРъФшњ‰*Џн5Ubulє%-њіќХE?nHwЫQO;ў+:aфб)‹RCнU;ЦбЊџ ‰ЭУъюЄ#“Џ“oђŠр”њанpZbtGgЕп5чTп7ЧT?4ЇD_FзНю˜ƒъWtBљSsЦРЃSжЄFКЃі Ѓ3ЋЛЃv§„5_…љK`ђM^1АІЊю‚ѓ*7КВкš“ВяšƒЊяšƒЂ+0К*Ањ9:Ѓќ1:dоПšУЊ/ъ—їЋ9Ј:я-“Ж7‡ѕM^1ЁЊК NЋ›юŠsЊђЊЋђЊ+<:ГК;хИћцœђ?бIѓ~tVuр}-MkўМ}d%Š 6TUwТiuг]qNU^uUtuwШ‘бїKTў5яЛц ъO‰Э‘oFЮЋЊю„гъІЛтЄ ЎюЎ8)xднЇ}GІG6ЏUнЃ*1;2:Дќ‰ђЭЛq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/2.voi0000664000175000017500000003147710654601736023210 0ustar michaelmichael‹2.niiьнOЎєЪ}пa*ёРЫам0„ЌР@МLdXˆDR eYз’AМэТ[ёЄђžю&ЛЊHіŸkнЎњ=pпгЭs}оТEvпџл/–хŸџєЧ_^,Пњэ~ї›_§?ќіїПњч_џя_џъїЫе—џМќыђo?ўљХэ­џДќэхчџљ‡іŸоџ§ЧууWхіѓOџыwПќћ_ўњўїпќг}і/Псїј§o~Йїу7ГœїдЧџпŸлcџўчіпћ—?џзўџѓяўЫ_ рЇ+Ѓ€9”2КрmхЫшˆw‰ўŒr­ёž’Ид?rЃ‹шЯHlЮŒмёШVJ№ІВђŽ’X}ы ЊўšЖШ—30r4т–:1К$юЂ?FєЇ$6oеЃ3о˜М\ю>€Й•RF'МЉЌF‡МЃ”ДьвDgT—’Звзаœо‹knbtвh|§)Ђ?%1:Б9>ztЪ“ЗшбoЪ+ўНDF|;e5:ф Ѕ2КхE%АКtб езЬЌц&ztЫЫJU=КхuзмШЅNŒ: ЏDJbt^sкѕћK‰ѓВРфѕv)Mк*_EFчVNј "Ѓ Rљсў#BЙд–ktHіšЛUпyYRšгrЏъЩнђКИ“№KltjuXє­7,z§)QЭkgRѓЛ$5gGGнyмW8&yЩZсMдЖБ‰ЎёІШшЬ“1ъ;šJd4РДЪЃоTђЂ/НaеЅЄVЧEgVпЃƒЊKbuY=КхuзмАшлhˆў€ЈшЕ2Јљ^šг\­oNs5ЩбKв§RащWIlЎЏ*Aщ‰Э™бYзяMdtвМ}ћ– xW)etТ{ЪftЩЫJ^є%ЕЌŽЎyQiЮyб}ЉsšяЃдм,ѕш”зE.uVє-ёV›QН&-uНdEз˜‘AЏЈ cЂЫQєРž—4Ё!Ээ ‡4яюяBЃGНЂŸб=/ЙdЦ,q-1:lЂЏЃ›3Ѓsю”‘б—ЋJ\єб№ОВ]ђЊRGgd_:Ѓ›ъбAO}–ЮшІз„E_ГšWёбЃ[žй ы dhб ЖФ ш*1g<вЃsn˜тЃ—цvCšw7JЉбЃ“žKl^šiѓЊRп˜nySЮdмeMєMbtиоq‘иœ9ѕ^=:хзмАш%2њKкx\&|JЙнёЊЏвr7:чЗЮЌъ[gPєКЦIбзРKhPєэG[=Жщ™­ЏЉšєдН/7zЩhоKЕдcЃžщЃcš“ЃƒіЛєш%:zdб J-c“юЂCњ0ztгS‰ЭЫšќe-YхZдxм„7ЧD'6Џ;GTtГэŽyе6IбKdєэ#yXѓіuошŒЗ%6з_лQJ)Ѓ^ЖЕ–‹Б1ЏйBЫjtб ђЂK`є%p ‰^ЛъБQЯl}здˆшЊЏ^ъEЯ•6КФDз—•„швG—eњцƒшљњ,zlд]ЃшŸM)њчRKТ&нGGlвћш„ц}єш WьЦytаKВNС›-є~&.zCиX_мЗЛœшkk^ѓz.ŽnyU Œ.‰б‘+н|З4:хыц1Куm‰Э™бKд}ќ…•кг+Ѕ‰NШ.MhFѕТІ3!њИ[ъ‘EЯнЃЂ›ѓЏ{5Ћv}ЗSG7}ћA™SГй…D—RW__DLGЦ4—ЃЗ“ъ"ГЂЯоOIє‡ьG8+Кў1usЕ[ЌёбЧеЃЃžйGhjуЂз7Ѓƒ^бLХmІ'Н эЪВ—и<џнЃ:cЂлS1CмžїЅОИФD/utNvнНдб9е‹шKlјюЎЯЂOz"}ЙZ_ЮyЭ=z)й_…ЅЏѕD ŒЎGЙЊ\ѕX;ЩЇтНЏѕDНЈYбkcHt)Лъщ›#ЃЫAєєзУя=Иы‘О9+К?2Ащ)бŸRє­uњцњD\учоWzССJЯ/n2.к%N‹Ўп nzЊЭ ‰n'"%К˜МФœ‰­ шДнуKГMЇD}/ 4_@†D/ЭBЇD_DF‡Эє*2р}avП=‹>ъ‘єЅдей_‰]єьезТr ˆ.mtФ€”}єєK}яы—zpиuо=ys;О!бхюрэЄDHщ+šEЪЎy™Пyщ“CЃчПW:крвЂ#юяšш-~ътЋвєŠРшЎ7ЃК[тŒЕоmйн('EŸНUзбмЫXщVЦLЗBv/ЛЭ#*:шR~пAЂЂ—n:2ЂoDJbѓEb30ЪхБюiЯvПіц<“ўRYЖЅNШО5–ІztдMsHuщЃЦњиUюzЄъ+[ѕфбЭ$dEЏЅДя'еVfDї• ЭЂ?ЅœF.{`pЛДп-ЂšЛC#Ћ;к”go>Œž§ ~НLмŸ†Г/ёІьŒ.zEbѕОyўш>7"{ЗФ еЛБHˆопд4яW6aЅw—ПˆшNФLwbіъZdєбŸ’НоŒюxGЮо]анi-Бшђ„єЄчЄ_:/Й1ЯwПEо—zўь-Б4еЃГЊ KЪ€”.:ЁКэ[пЬН.ъ-Бдk=8э\Й;|?ЅВЋ ŒŽ\hб?“ѓшСa$F—гшСaœFюzdп<ћЕ№фъНЬнœqŸбыЂ3тK}§ЫYѓr`tгS‰бЛм„ъ§TŒEVtuhhгsћг/g>њCЃr~ВШшйo˜Ž‰ўб’Ж{ЌїLЃ;оpПб]ђŽ”jјІ.IёžЫвƒ”~Э\ŸGбН6VK=}viЂ3–К*lЊЧV=VКшв›Q;ТMѕрВsЅVgE/§ћэЂ—љ›#ЃЫyєиАGіЭ‘бѓOЧƒшБ]œєиЎ‡Ђ'ПЎ7/s'Їм97Ž–yzЂ?Ѕ? Cђ›ш”E?jNŠŽ™яОyЙ2БцTМк\ѕФО9,К>44ъЉуцŒшюэфббŸ$њcЃ#W:ЌyЛeђ†эЖztШћ"Ѓ Е>p<чснЅzLzHїЕВŠž?{m,MѕдйїРГдuaJuЉЇЁљ9ot)чеЃлNuбычD—юРшЖSЛш%,К;4Ды\9XшАшѕрьЭљбеUqоцхАyіЋсqє2wђсHO/.8у‚Н“8п$:ЁОŽXє.:dR›gЏЎ;cNЪ{f›>КыБzЊЋѕи78SnEšЪ”SБЙЦDWb6НFdtЪ‰ИqК“и,њS"GZзЧv=МћКEGtп"/БЅDdo‰Ѕ^ъЙГЋОЖzlжCЗРmЉЦК†вTN;UЪaѕ2uu9Ќž|>v‘Э+;{tйЭєхшфб‡<{ѓбBOОKOЧф›tdєrНЬœq)щ%6ЯОS ^хЌjбŸВ‹NШяЂ3НN™”rltжcЂ?&rЊwйЃ›m.,К~Н4WRЂяDNdtт‡ЏЋШшйПє8&ЦИ>ж=чсн—ЮKtЙємЙЎt@іНА^ъЙГK]–К^зв]vЎЬЈ.‰бЋGЗы2ЏЧf>\йЩ››Mљ9{є>yіс8м*&o>ŽЫofUv^†ФшЃЁž^bѓV=:у-yЋ<џ…ф@ф@‹ў”.:ЃО‰ŽYєrltжcЂ?І)Э‹^ъoє&W­mLѓ’и\}LŠом{tЩrЖМZdtЮFн‰Œ^šџ$5ztќ‡]6ѓєюkц%:х™єkc={vUиTЯœ]'–кшАЪiєМе]cDtп˜].ѕшКceАвЅLhоmЗ)бѕ‘™o?faц%Ок Чzllжcћ‘ОкємaєьЪёZЯ­ŽШ>иЁDG_o•FзМ(i–o2> ЖТvЋ>:ЂОmYї§Ѕ%Лztй‘бћъ%)zл:ІO^–jaя?F7=Е-ьН}pб+š/І—ш›’Нœ"ЖшН№ьбoЪЌ=%#Ѓ ѕмю5ѕњДёˆЧЛпЋшЩГыФЫЋ2u“X*ƒЛшKBѕЎ1"К[ъ„•.md)бхБбy‡›ћсXъм€ціШаЊ'іЃZ]ягЃУ9к/ђЂзъбaь›ЇоьЎЊвнц7­Њ41zЗѕM,(Еђ-Ђ#ўMsШАєз”„ъУ}zіъУ-/.:a7‰ŒопOE/л§шєХ_ъцвМн;7У18щe!л]+2:цЦЃ—Yž=:уm‘бYџб€H|vдгЦЗвkuB{ѕ њ{єфйЅєеeњъВ‹.ГGї‰ бЅЪl‹gŽЎKFtŸ™§ИyЮшФцЅoœНїЫЎ1 y)ЇеCГžиЯp^єНztиGћХєK}Вг‰ў‹л E@ѓщJюz(Бљp›нє‚еm5б!rвю‘бг#жOqТLїбЭ>p{j=:ш%1л]c7$I"ЃГЋGgМ+2zIlЮŒ€Nж#взд ъ*u}9{z)Зв[ээѕдйeЎrЗПЧЄЪЃлЮ‹]ѕЬЗ„ьGбгVGF_]–ЩПЇ9iО[іH7ѕпatкЙ§X,ГкZКЏэJ^tišgŽ^wŽй“—Кz{7:щ%ugLt#5:ЏZєЇ$6gF@Ћ”ЈGЄпJKPv)[э§чшЈЧJЅy;:ьвŠЈ.Œn;ѓнšgL>h8 ћЮfяwb‹ЛчІDЗЙГGŸ~ѓі^фmЫУ§ntкЙбгV?jžЖzЫ‹^Ю6‘I%NЧ7й<–eі+ЫqєєЇ#ђк’Й{|›Ѕо~1ЖьkfXєбчкѕјиАGšмЕyђ™nПЕЛџН–DяЯТ€ц§зК Э;‰Э7Ї‡"ЋEJhs^4дЪѕЙнQЯю.­б9Я•В‹ž=ћšxOMШо/№ќеЛБЭгFї™Э}4бkцвGOZНЖнs›ХwЌ9љкuŸ6z7бѕ”ЬъEЯ]}иМMѕшКcQю›ошКѕК-ј”ъuŠ>5:юL`ђQєѕшшЎ‡’x“7Kц­ЬнуЛ,ѕ§CУ‰Œ>§њ.*К:>2ы‰}єє'тю–z‰ˆо} 6џ–їe Юпм L^цў|x*2zюo=Юˆў”Фfh•ешз•Цшš•’•}IЌbВo…ѕO_]vбѓHзН_мљЃ&"!КŸˆщчЃк+š7гGo!б§DwУ2:яиQє}СGзЋ*wбг:Ž^OЊŽ^Њи™ЋNРъcлN Чє[GnєЉбqg“O.-Г§)‰чahѕЗ‰^18эГЕЭ‰ЎBЇŽ>ћІ4(z=4{єўcьєЛЧВџlў-яЫ~šчoю$6Яџeњ!б=ћ…хXd4tт‘^jЃc^TzЃƒžЙ6НѓgW1+}kмўШiоJ#Вї#1ісOнЫnZ&tп7ж?CЂЗРћŸSG—ршeћ1ЁKYП}Ь›{QЊшe‹žќОуlzЇЎоŸ€еёБiчЊ‰ŽЙЎwИШшфуобMO‰ў˜гц™уЃ'_ђ“Cє_^иНvюd]CVКœКљЌ:5:Ѓњ~dўшўRАх}й F@s+9ztЦ{т‚П$.єфпœJЪнш”W•ИцвF'T_2Ы§Я„ьf…CЊћБH˜’УYžМКьЂыѕлvІ”~šсwЌЪыNФyЃЋМ~ї˜ЖЙ[зm<–™Ѓћц-zћ1ЁЃш™ЯР‹n‰›ƒCУ8;хrЂЛБˆ>я•j€“ЂЗъŒтх`u'яНˆŽИEЊ­ѓдѕЧ“1љ’Юєєs}є‘ktлЉ“5КљЄzђцуbішУъш§С!1/л/s@tgњ]њРќ—–НФцљїCЉбй™еРe5:фeЅ2Кхe—иЄъЕwYЊьЩгKнЬЩрЎGv‘е‡+;ytПk4Г=ИэL}ђUЏ—e™7Ко,Jћ˜?К_щ™gКFO~юЃы+ушКcЭSї^ЮюдЃБœо‹N]§`лˆ^rš—ВœFN;WЊ+bFёr0Э—,хЃГ+ЧеЫЬwxэ6]Н™zСћ‰hї‘Ёiœœ‰‘бSЯєqєэЃлЮЧM='б“7~ї5}ѓYє€’wœŒЧчCўƒDРє—У‰Эгп+Ъ+ўW Œ“іŒєЙхftЪЋn­IйeйJKЩя2#Вї‘ѓW—Ѓ•<КkоϘаaыіrdйkbЗх•j?™NЉноOП}єбKГрƒуN”ЃшИ…ž|‘ПЎшье'c0wѕщ0DW/чoЎW:Єј`ušП[єЬхЇеѓGзЏcЂKћ.$њ>ЧiбmюФбзЖƒžЙy9N›z:ŽM>⇓—Љ/†Ї:tЉчояŽфnYб‰ЭішЪЌxCЙёВ[kIъО‡Іdw™йЛШ€ъrа8{uг\ЗN}MkЃЗзCЫЮнћшя&Reоо.эЁљ”ЃшйwЃш…ўzбšЗљp;žЛx9 œ<Кn.Сiч›ЯWzpзCufbєошИ3Ѓg­ŽЎ^4Зз–”ш㚘јРYє2ѓЇ–mз?wS1sѓ™ЉGњаьчс‘ицбяJlЮ\щръб я‰н;4џќђŠўJЄ=ўZ[ЎЗМш^“нvfdї‘зЗsWз+[§˜z­K]ЏљЬђ5mѓ§ѕиВseПазwG—]tїї˜б>КL]КРвлvjз–в\ŽŽЭZМє }y9љ2/MtщŒ {ЄЊKI>_щБU5™)уQUЯšнgFD?ЮнvfЭKŒŽj>žќSЫЩЯНщf"ЂЙ=ћyxDѓgф/ЁбЁе3Гt*oЉїŽУяAц˜ РЌЪ—б/лRKLwгRнU&4WQхЮ]о6o­SЯHЙ—–вН[і@пЙО hЎЗY№э&Ђ6:юL; б}ZBѓбй6yёвFW{Чдбэ0b6DŒzІъ‹Yшf‚cцЃm ЉоGІEЇЬЧЗ‹нvюЌwъшЋ§ЯпМАа{б“Ÿ‡{ѓя{‰Э[&'}ЯЛћ00Дхuїд шэТ4ЋЄ‘Vх‡б ?AJvFek]кjgџk”Кљ F[hй,Yбkњ}dІTКшvСчдqcpкЙК,%К ‹hюЃ—vп›Sг–БЬЕ”yn%пы‚КNŒЩnCЊїYб;ЃлNѕFO_К^WІŽЎЕgуа”ŸDє‡Є5OПIяЭa9е\š;ІС1ЏЊ/*1бЁелѕ0*њ6иY+ Р7SОЌ/ЧІМрZXnnЏ‡=UкцkяьеUєВЖ/eюъвFWеCГ^TzЃƒ^нgЎyCVqт2kў” ЃŠЫЉn CЊOCЂлؘш:~њшл>zlзЋК3rhЫO‘и=їix"Ћ9сrИ“дМv&5яЊGчМhMj^ЖмЌш[oZ4 V.FWМЇЌЎoFчМЄT.яFНтЖЦkvFuiЋCЦЛьŒ.zEdtŸ=Кц aСЋ9‰Э§о1:чE9еm[JєqоєеЧGЇŽ>–иm:>ФBHжBп.…бkeФ5|s j§іuЧ&2њK`2ŒTЎFgМЅlF—Мс’Лe‡Єп–xЭЮЈ.;Ѓ‹^АNЈоgzMbѓEXpр*GNF~tLwdєy*VDJbtфL'F'6GF'6‡Dп*з+aDsъ­Фц%єvњž=Куm‰ЭР_ВђКkmXviЊCВKotаKTTdtмўбЌѓш”W%NFц8gю‘б™c}'њCЧ#Е9-:sѓHlN‰ўЊМEHtsSšвќ-ю–FЧМ.2~(Ѓ+^WjЃc^TŠъOЩЌ^к№б-o ŽŠŽФцан#2:tЌ7‰бЁЭiб‰yŠў˜œшъŠг|ПFEG~_Њьб!РœJ)ЃоTVЃC^WjЃc^—YНlсKbѕшŠ7$NGтH'6w›^Jxdє’:"7‰бЭг‘8бЩЂ~[iXѕ­5)zЋMJОˆZdцQJ№Ўr3Ку]Њ?Ѓф HљџэвС Ф СєпДя‘4`80 3,B“ŽО.Y˜)nнЌŽ^фSŒю5пQ|tЏјyЃЏж’ббjЂfЎ ЖцuБ2ЌnG7ЋЏCv’бaНЅ{я(^Киќ“€јœoЧТq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/19.voi0000664000175000017500000002551010654601744023266 0ustar michaelmichael‹19.niiьнMŽdIV†ao`Р2jŽP‰ С6˜ъ-DWЁjР X и@э‚­01Ъу'#ТяŸ9ŠєsО›Я“J…RО2Y^Зc“ћПЛ\~џЇ_О{rљў?џёЧяџљч?ќє§яјЗОџщђь—ЫŸ_ўћђ?П§§нЫŸўьђ—O_џ§o?ўНѕŸПў§gухыŸўѕп§ѕw?ќЫ?§јПќАѕЫwјщчŸ~ќnщЗŸќХeЛч§їџызпћп_?ўоќњwЗџц_§Э'”|%Ѓ:hbŒQpЏёЌ:у.cфUX=F`Еш‡IlЮŒŽ|Ng~"^"ЯЄЯЊ3ю1оTЇL#ЏzŒРъФшqЋ:h†шG§(Ђ&Б93:ђь‘yЪЛDžЇр[2žUgмcМЉN™6F^ѕyеуVuа„EsBubєJsџjб"њQD?Lbsftфй#ѓ”—yžЮœ\.‘3"РQpЏёЊ:dоxЏ:fвyеуVuа„Es@ѕJsftїъецюеЂ%1zЃ9ГК:kŸшG‰ŒŽќDЬŒŽ<хežЇ3'—Ьё9?‹ €ЫИЊŽИЫxS2k|T3eмЊšАhˆ^6їЏ^kn_НомМz+Кuubєfsчjб"њa›E?NbsfєzuuдЁФцЬ1sПDо{<Щ+шl\UGмeМЉN™5>ЊЮ™1Њ‹Ž-›ћWЏ5gF7Џ^o§щ6š{goG7ЎNŒоiю[-њQD?LbГшЧIlЮŒŽ<цeFgЮ[kееI3“Џ“ŸфџуЊ:т.уUuШМё^uЬœqЋ:hТЂ9 zЅЙ}ѕjsftяъfбŸmЋЙuіNtпъФшНцЖећбMЋE?Jdє~uuм–эрашъЖmi[уIм†~rЊшШъъЌ‰Э™w—EvuЮЌРф'yХœЭЈИгxQнq‡ёІ:eжј КfЮXЈ.:Жlю_НжмНzНYєЇлhю]НймЙz'Кoѕ^tлъѓE7­оonЙвg‹ОўЌКnУ~tгън­бД9ѓь‘НY]нЕы\KY]u БyЕК:iF`ђU`ђ‹Д^6ŒЋъˆЛŒ/ЊKІїЊc&‘W=Њ‹Ž-›ћWЏ5wЏ^on^НеœнЙz;КoѕNsпjбВнЕZєЃœ0КiѕAtfuuоКРфKш1oЋњщGеmлЖЂ[/vрž>сЎn,БyЕК:iF`ђ“Мb€cT'мiМЊ™7оЉn™4F^єyеЗЭ й+ЭэЋW›ЛWoDЗЎоjЮŒn\НнмИzЕ51КћRяэбŸi?КiѕЃ{VŸ2ZѕЇ9etuпКШш! 1КqѓyŽдэ›CЧФЬ[„ШћšЫJvuаœРф'yХ@œёЌ:уу‹ъ’iуНъ˜9уFuЯŒлц„шEs@єВ9 {=КwѕFГшЯЖем:{'Кmѕ^sRєЛoVзmи]щЎеgŒюY-њQŽЂ[VFwЌ>ŽnX}вM]И*Б93:ѓt9ьUW—эHlЮМњИlŒ]§&_&Р7oќІКс>уEuЧЦ›ъ”Yуƒъš9cфUп6'D/šЂ—Э§ГW›ЛW'Fo4gFwюоiю[НнЕ:1zПЙiѕQtЫjбrнБњ8КaudtfЕш‡Ilо‰~љYuрЊƒшъМuЛу:ьяыЖ›3Џ2o™.™——›ьъ˜;фРЇOЊ+ю2^U‡ЬяTЗLUчLЗЊƒ&,šЂ—Э§ЃWšћWЏF7Џ^on^НемК{/Кkѕnsзъ3FїЌ>ŠnY-њQЃ;VG7Ќ>ktПъШшгюъФ{Б]›3ЃOyаЋЮлиМ[]Ж#БyГК:ыH`ђU`ђU`2ъ€;gеї_T—LяUЧL#ЏzFп6'T/›ћGЏ4З^kn_НнЛzЃ93Кsј^sлъ§шІеgŒюY}дœнБњ8Zѕ'™ˆюW-њQfЂ#ЋЋ—"ЃOњЁXИ*Бљ К:nSbѓNuuиЎФцъъЈcЩWЩ/вzО q/Ѓ/Њ;ю0оTЇL#ЎzŒМшqЋ:hТЂ9 zй,њЋXin_Нк,њѓ­7џVнЙ|+КѕzяFw­оюY}амГ:Бљœ+н1{"К_ѕLtfuuуТiЃлUGFŸіЁWИ"Б9ѓtš9rэUWЇэHlОdо3eош]2oжŸФ|ђ^E?^TwмaМЉN™5>ЈЎ™3ЃЧ­ъ  ‹ц€шesџш•fб_УZsћъг4gF7oпnZНпœнГ:Бљ”+н3ћ8КaѕDtПъ™шvе‘б™еЂ&Б93њИК:pЭ^nлшЬ“^цШЕЛCњJlоЌЎЮ:˜|˜ќ$Џр[ї&њёЊ:dоxЇКeжyеcфUп6'D/šЊWšлGЏ5wЏ^o§щ6š#ЃЋГі%ЎєVsыrбrТшІйGб-ГЃVODїЋž‰nW}ошЬъъШ[Ђ&Б93њИК:pеNnлцƒЕЎŽл”иМS]Ж+БyЃК:ъX`ђ“Мb€oBо‹шЧЋъyуъ–YcФU[еAЭе+Э™бнЋW››Wo4‹ўl[ЭЂ?[btbѓvtчъэшЦе;б}ЛїЃ›†G7Ќ>ktПъ™шvечЮЌЎŽМ%њa›3ЃЋЋW%6gFяWWЧmJlОdоeоB^2oжЏђŠО/ЂЏЊCцwЊ[fW=nUMX4TЏ4gFwЏ^mn^НбœнЙzГYєчкnŽŒЎ.л‘и|ЎоЅs§ЮФОеЧб ЋЯнЏz&К]ѕyЃЛUGFŸxTG.$6gFWWЎJlЮŒоЏЎŽл”и|ЩМ Н:ЭМYПмdWЧ№*№=єуUuШМёNuЫЄёQuЮ”qЋ:hТЂ9 zЅЙ}єZsћъѕшоеЭ™бЋ7›;W'Fя4‹ўT‰Э;ЯŽЦх{лЃmѕatУъуцаъъФЅШЅž‰nW-њQІЂ3ЋЋ#oEFŸіI]И"Б93њЈК:oCbsшаЕuŸзКљ’yн{YfWїLJl~– p—РїаWе!ѓЦ;е-ГЦˆЋЗЊƒ&,šЊWš3ЃЛWЏ67ЏоhЮŒю\НймЙ:1zЇЙoЕшGйюк}нВњ0КcѕqtУъГFїЋž‰nW-њQ"Ѓ?Ѓ3—Кcsftц™щЈК:o]dtцј9’_6.!{'_2ЏЈ/‹ьъœY‰Эп‚МїаWе!ѓЦ;е-ГЦˆЋЗЊƒ&,šЂ—Эе‰бkЭнЋз››WoEwЎоlю\НнЗ:1zЏ93Кkѕ~tгьЃш–е‡бЋЃVŸ5К_ѕiЃлU'6V_Ё:qi"К_uфІ>э“К:qEbѓФџХŽ"Ѓ3gЎЬ{„ЭьъЌЫоыŸіВљMb3Р7 я%єуUuШМёNuЫЌ1ђЊG`єИU4aбНlюНвм>z­Й}іFtыьЭцЮе;б}ЋЃїšлVŸ0КiіQtЫъУшŽе'nX=нЏZєЃф_3КcјЬІŽЌЎN\ŠŒ>чЄ:oCbsшHyљzЯД^]uь68 љIд"аиxVqёEuЩДё^uЬЄ1ђЊЧ­ъ  ‹ц€шesџш•fб_УZsћ№ЭшЦелЭЋOнЕzЗЙkѕAtЯъЃш–ечŒюX}нАZєЃDFŸєёQИцЄћЃcudєIwuuрЊФцЬщeЗК:mGbѓfuuж‘РфЋРф'yХД4žUgмc|Q]2oŒИъёQuЮ”qЋ:hТЂ9 zй,њЋXinНжмО{+КsіvsуъгEЗ­оnZНпмДњ”б-ЋЃ;VG7Ќ§0‰ЭЂцЄ›КcudtцЎ>ЊЎЮ[9НьUWЇэHlОldWGJlОdоЌ?‰  ЇёЄКт.уUuШМёNuЫЌ1ђЊЧШЋОmNˆ^4D/›ћGЏ4‹ўжšл—oGї­оiЮŒn[НнЕњ„б=Ћš{VFwЌŽŒ>щўЈ\#њQЃU–ушШъъР5‘б‘gІаA rNмЉЎл•иМQ]u,0љ*0љEZ/=пT7мi<ЋЮИЧјЂКdкxЏ:fвyеуVuа„Es@єВYєWБвмПz5КyјfsчъФшцОеЛб]ЋOнДњ Кgѕ9Ђ/‰б‘+P}ЮшЬъъР5–њa"ЃOyќЈЮлиœ9reNф›ееYG“Џ“Џ“р3Q]pЏёЄКт.уUuШМёNuЫЌ1ђЊЧШЋОmNˆ^4D/›3ЃлWЏ5ЗяоŠю\НймЙz'Кoubє^sлъ§шІечˆО$FGЎtBѕQДъO#њa"Ћ#ЃOљЈЎЮли:НDЮ‰›ееY›/™z—KТёU^1|лЦUuФ}Ц‹ъŽ;Œ7е)ГЦе5sF`єИU4aбœнПzЅЙѕjtѓьцое›бЋЗ›WŸ.КmѕjkbtфJ‹ўЖr[WяЎtзьЃш–е‘біЧу$6gFŸъѓЅwє^uuкŽФцЬ‰ќ’ycsЩМ…МDоQ‰ЦЈ.ИзxVqёEuЩД1ђЂЧШЋ#ЏњЖ9ЁzйœнОz­Й}іFtыъ­цжеЂdЛЙqѕщЂлV‹~”ншЎйбЊ?ш‡§0‰Э™б{ееi;›C‡лѕъъЈcЩWЩOђŠўЏ;An‰Ё(Јћ_cЫ;™ьш№9™'xQQQ№ѕЂЛсœzзнqB}щN9Ќ*ЏК*ЏК–КƒX5DЏ›ЊЗЂЇWo6OЏо‰ž]Нзœ=Йz?zpѕƒшЙе—‹[§0zjѕушЁе‘б™еЂŸ&Б93:sќШO3WЎШхvГК;щˆРфЛМb.ЅюК+NЉн!Че7н-GUхUW`t-uАjNЈоˆ_Неœ=МzЛ93zvѕ^єшъншЩећбsЋ4ЯЮЌО\єиъ‡бSЋGGVwЧэ‰ŒŽќМdFgЮL™3uцЪ•Й‘gўАЙ§ШюN9)­€kЉъ.8ЋюК+NЉн!Че7н-GUхUWхU/›#ЊЃ?K“Њз=?zЋy|ѕvє№ъшбе{ЭЃЋїЃW_-znudtfѕЃшБе‘б—{?КгHlЮŒЮєЖЋЛЃ~•и|[ewч˜|—W ќ‰ЊъN8ЉоtgœQŸКKЋяКcЊРшЊРъetBѕЊ9Ёњ#4Љzу чWoGЏNŒоiž]Н=ЙњbбƒЋ#Ѓ3ЋE?Mbsftф‡<3zЛК;ъWырљЭЗUvwЮQЩwyХ“UUwТiUaеЏЙV]бѕ-:%Л~FGTз2:Ёz=ПКЖtG§f3zzubєvѓ№ъKEЎоž\}БћбіШЂ4#њЖ8оˆцНћбѕ‹ФцЭъюЄ“oЋ'$EbѓЋМbxUнче‹ю†Sъ­9ЊК>ЃsВя­•U]?Ѓ#ЊkЉ;шˆUt@ѕК9 z+z|ѕfєєъФшэцаъюЌЧD?Kdє…ъюЈ_%6‡ЮyЫъюœƒ›oЗДmыK\0Р#ѕЂЛсЌzгqB}щN9Ќ*ЏК*ЏКЎPНjNЈоˆž_}™шёеЂŸ%2њ2o^wв‰Э™SцlšЙмз-ј_Љ7нgдGtPu}гнrT‰~ŽZшю9dQ-њYD?ЫWlPєђЈЛsމŒŽќ$ўЈюN9#0€dUеpVНщЮ8Ѕ*ЏК*А:1К*АZєгМчF5п>Ž8*њіyвн!ЇЄ]шwЩР?RнСлпгUq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/18.voi0000664000175000017500000002625610654601744023275 0ustar michaelmichael‹18.niiьи_nUЦс)pС2rPФ `мЕЂB4E- `Ќ… и@vСVИљHb'БЧ3žqЁ9ч5ЯљŽ-хчб7'ž|їb^ОwqoИ|§іЭЋЫпООО|yѕЫехѕАёnјtјsјыііbћГя“сѓћЧ_ПоП§ўэєњFmпџќцтЫ‹ЋŸ~xѕ§ЛЋЙ7ŸрњэѕЋ‹CЗЏ|6ЬїьЎџqГПіїЭўћ~Лљfќ;Пјъ?(Tы€ЃZœЈЖZwœЂ*АКЋЋЋгЃ[Їœ 0љ!КuХЉ“‡МП†РYЊЭ}UуŽSд“ж)ыU`uЕZCєs9‹шж=ЋфЁлєиœ=DF‰ЭУ&Лu0ЋЊZ'|ˆШш0лЩЈЄйФжFы˜•jOыš•ъPыЄEЭ§W‹~.чн:iYbѓatы UђЃ[ЧЌ–иМSн:ф$‘бУSsTxфБ83Uе:сdUiеwЕiблмzд:h…‡Ю ЊЎ)­Ѓ–$FO6ї^-њЙ$FЯ4GVЗЎZ˜<н:iYdєauы 5ђŠя$6ОHз’8дУЈКuЬzЩqСЉЊZ'œЌ*ЌњОі!:Є}›[OZ-ЋcœR§˜Y•S]гZg5гœнuubєlsЯеЂŸKbsцŽ7]н:jI`ђTtыЂ5“Чб›•жMЫFЭ!|'9hH"ЯХЬ“1ъњpO^1EЕј !еU›ћ‡‡„ьzЬнŒnДJbѓ0й|ћЄяќУЃpШGб!s’ЗOпIlBЗНьж)'Щ+ў_ЊZЌіTZ)еЛЁUйЛ™UеЛ™]“ZW-˜ŽюЛzІ93КчъйцЬшŽЋDw[=е)њc˜ˆЌш§х†YЧ%œw‡D?—Шшљъž?ХмЉиїЁŸˆю\F;uШŒзДжY ›'Ћ['­˜|'0љ^^1є ЊZ'ЌїZ“§TZ1е5ŽЈощЌ ЉЎ)­ЃL6ї^=гмwѕltЧеѓЭ™б§VO††EяЏ6-;bf"КŽžтŽ›GеЃZ5-Šи-ЦЮ-њvЁгЯqlІћ=іЧЖМшћЮ€)WGœ™‘б™—‘\™зу“е­“жLО˜М•ж РМКеКс›иЊ ь‡д ЊЎРшЇдŠЉЎ ­›–L5ї^=нмyubє\sзеgнoѕLiVєоrгВ#fG"(zџ•fU ЦЭ{‡КaзQѓлFЧѓ1змѕЖwFбгЇf?&‡КѓfбЯ'Б93:ђЫщ‘ъжaG%6gўчcіІwqС[‰ЭР?энЫvтV†QНџKWка] Wт:ПГїРЦxђЅVщH8ƒр‡TUwТGъ–\IйЗиŠЊОЗFEзVwа^šEџ7^›ЧЯоmМzyjФTW`ѕН/1z›:xѕСx‡Ž>о‰ шя7›ЃЎМ4зШ#Ол=ыОЋЧнъƒшБŸRЂwЎЬqDF_Wwю§c›3ЃЯЋЛуŽDFŸUwЇШ+ў˜<~~]`ђ—Фц/‰Э@œњвё‰zъ.y[-uЧМЉ*ЏКDџŒms@єKr@ѕ^ѓ№нGб#W6\}я‹ŠЎmєт§жА3‡уMŠў~Г9ъЪNєа›qwp|9>юЎ?ŠzцП3zФъышЋ#ЃщRwюJlЮŒ>ЏюŽ;’ињб6ыГжS`ђ—Фцi•нђ‰ФfјПЋ?К>SwнЈYwЪл*0К*ЏКDџ„ ŒўŠЌ­юЈ+Лбƒwяѕ_}м”и џ’њвё™КыюјDU^uFWVчG'T5VXѕ­БВЊk7z№ьзмёЋŸ‰Iе‰бѕ§|П7ьЬўx‡žѓЮv<пы.;qМвнe'^/Пфшћ/ЛћvD;№уѕxMDџ”ышЬъюТПtдн{"ЃЏЊЛѓіEFŸWwЧŠ О‰ ОIlžџ˜ї-БyЪќ№oЉ/нŸЉЛюŽOTVW`uЅGGTп"УЊы5zјьgbRuV/s6dNЌ˜шz~МъN;6GЏœ=Пл\vтe;Іi•?Є—эИ_SЃЃяПnюлuеœW=ь’œ-ѕАЋ§лЂЧнышАъШ§HЎюм}Uнw БљИКЛы\`ђДSнє–Фц)єНЋП„Ilјѕтў)њКщЎјLU`uVWvtFѕ­В**ћ™U§l ЊžsfНhЌ˜ъEcLt…GoђЛЫNМF?ояэ:ѕКЯw›ЫŽэnЧш[НэŒИwc“ЃЛл]4Y~=шМOзcи%9ѕЈеЂЪхNЇUЯ#MdєuuwрЎФц‹шюК#yХ_“ЇнъюЄw$6'§Ml%2њKb3Ряјбзн ŸЊЪЋЎ ЌЎФъЪЊОWFU?++'{ŽЌœъ92'zQY1е‹ЪJЉ^6І4я К;щкkєу­YЇvЖc~П7эи<фНcЄЛю@ъЎ;иќ;Ѓ‡ ПˆsмчбƒюШutXѕИǘнЮЈшНцёЋжd8збУVŸХwю‰ŒўО…„5_œеУЪ+ў’Wќ%БyzЩюЮyWdє4ќЧp€џЉФ†ОўшnјTU`uptLѕwhVt­Ђ3ВŸЁ•“];бЃW/2+Іz‘Y)е=-7eьцНшюЄKп•Ћшч/ZУЮЬЙг*zш‘я\Е:GTЇКыˆў)П1zЬюЋц!ЋCєДѓеИухТ{†O!бЕЎЌ шхn„Uя~Џ`@єЃ:ЊyџёtєцћG€Ќф)0ј&0yкЋю.zGfѕЮГS†ФfЦTнЁўшnјXVє=5*њоZT§h­ ЪЎmu@і3Д*Іz­œъEgLѕВ2:КЛщвs›ЇХ%9Иy™ЇѕнeфјХИŒ{ф/gнъщЎ;PЇКыˆў)ЂЪEѓ˜н{У_:эЃux zќъmхА‹}rŽ{5ž]„yе{›>ŒGWTєњЙ4%њ^е|нwш(КЛы\Zя]мœo2Ћ_ВЛ{о˜ џ_uћRнЈЊИшКG?кд2:ЅћйZ“]ЏбУWЯЁU1е‹Ь˜шчŒЇ ѕxфо_O‹OiбЋЅ~МпvfylЬЗ™С'^gКуŽœFZ§ Ѓ­Nlў-бгњqЄ;pЯсlkqЇЭыЗПm ;ГŽоЬ{иН>ЙЧНЯAЃЇѕb„T?ТЂЂЏЄ;pWbѓйVwЇиYъ€?FюŒК;щaЛq—Y§šнєžРdјwTwРчъю†OU`tFз3:ЇОЖб еstUJѕы Њ#ž‚ЂЙїз ЩЛбЭEзWрs“ЙUnŽсуki§гИеuІ;юШя‹ДњМyашШIџ’шх/:УЮ\ŒvЬ№mђ:}аqЏЃ7vЏOЎСqЏЦЭˆCސГосЃыЛ ї$N:њљc/ОЛьЬ=p•онtmŽŽђ]д:Я"ЃOžRЧіh J€GUwСчЊтЊЋђЂkвОhЮ™ј]1{ђвP}k\,GHєэыїЫ˜ц—шо wЬл<Хœзu_щзянe'nyЕŽ~KъXwкБ“шqЋЯЂ‡­>ЕZєOй ў6s<мq›Зб/ПюhКєВЋіAЇНлќhvЏЯЃѓюц;Л‘5щЋъюМyХгіУжbХЛУN=†КLяnКіЙј ї№…Х^DЌєЗНъюІ7,/С”цiё€”“ џŽЊю‚ЯUХUWхEз“ОjNЉžЃsжф+sйœPНˆLŠ^МŒi^œYбaт-rs|Œ^^їГуZеЋшЕюДcЧЭcGъn;t=lѕiєЈеП$zё~oкБ”сЎь5О“М˜їЈƒпDПМююлЕlн=KКїмЛ›‡ŒžuЛбCVя—ŽнzS<ЋюN;6Fфо-ЂЇхУиV‘3юєъеб=К—QwНiqŠtЇРЊъ.ј\U^uFз3:Ї|бœ3яesHѕœY•R]сбSJєНђљ5ЂzQ;=ЋGЯО>S+Ђz3рŠЈ^G/u—9jo5g‹ŒОym;zЇwјьуцЋЯЂ‡­ў-бЯї›гŽхŒw!БљЅz~Ћ;ьЬQѓаƒ_^yѓѓ^@ѕб˜CЂc“E`LѓjдлЉwЗлнюЈKыЮИъЭеинunuэ\‡піЋЛЋ.эTw'НcSнѓЖœ е№ЙњЃЛсSиМXшРі е^dЦьЩ#ГІ{tDіНЙ’ЊŸЭ_­)бпюБU]н=я‰j~4&MzЛйЧбWŸD[§kЂяяwЇK№,БyїV8|ў-n§Ј4ўичВЧЋ„eйєelјю:НЎž_нМЎ^OНЛьФzп‹Ї§KБЗщкb=ІэЅ9Ўѕ‘R=эVwG]кЉюNzЧІК;ч}1Uu|ЎЃkЪkИ%ЗнЮШЎљ[ULѕЭwmXѕwmeUзRwЬЛ*ЊњзœV]ћеCw/#+ЅКŽuЇ;‰ЋžFРŽš№Cbѓkєќfwк‰GлjŸGњœv•А*лРŒ§о[ч шХBџqq/zфоoћћб]uхрRlmК]НИcЋЛЃЎНTwНguєuЧ|$fФ?ЂКр?RЫ]•U}ы­ЌъZшny_TѕЃ2)zЮЬi^DUзnѕрн•XНЪЌъ:д]vbПwьцншюІK‰Эгы5И|wTЯДЙ9aцЯКzў<|єЖ0bН7ЭлъчЋ‘“ЂЧNžЖЇEZѕњЇбГз•aеk0#zїrьNzЧІК;ч])[ќ/UwР_Ј ЋЎЛюŽOT%Uп;+Љњй™]Qб‹аМшZ§0xw%V/œЋБV"Ѓ3šwЃЛ›ЎЅF?ОoŽ‘жЌwНœ|нAgцОН™i[˜Бм›Ъˆц§›bwдЅНшЄъхOнUWжK=mw"Ќ:lЏзйЩ_Vен1HY € е№ЉКщЎxг=Е*ЈК6б еsЉшџV%VЏJSіКVЁ!еЕ_нuЎжеyбыЁ,0љyCŒjžь’šgлЋБЛчм\ИОХ4&]к&FьЩўIн]ue]бМ?ъюЈK‘ћБЙі2ЋѓВŸOЈнEoйTwчМ+сЎUїoїъ[•S]ышŒъmtDuŽz9п˜ъJЌЎZf‡ьu%VзК:0КBЖКvt7]л,sDѓSbѓД|b пЮ7aрлЕHhоППt7]кЛПt7]‹ѕюSSwгЕѕ!Н=BBЊ_†нœѓЎЬћxЮZРTм_4—МЏъ^]Яњё­ЃCЊЃknЭЉЎФъJЌЎФъZUWFuэUwG]ЉuuDѓ::cЮгѓ‰#)yuм}{ (пЎEФМЗGBѓо§ЅЛшщеŸК‹оБЙЕdDЇнZ2ЋSёр[UwСчЊђЊЋюеIщ‹ш˜ьЪŽЊЎѕЈ3Њ+БКЋ+Б:=њ^н]є†яиХСDѕXмЛSо–5с‡ лŒ›ЭЁ"ОК;х‘бSdtш’єi bUu|Ў*ЏКbЃПЊƒЪkŽЮЉЎФъUtJu%VWbu%Vџ‚ш(Сен ‹ЫН ^чДђХЁ”_нђШшѕjШш)цrUwР_ЈЪЋЎ ЌNŒЎ ЌЎФъшшЈъJЌ§“"ЃПГЛ>&qШ™WaфЁW•˜_нђ‰Шшачъ)ѕ^№ЂЊЛрsUе‰бUе•XYнёЁШш)2њ–н№7"Ѓљ  }w ыЎШьєъю’$6‰Œ Quќ…ЪŒЮЋЎ ЌŽŒЎюnј ‘буЯxƒЉ‡юЈўA‰Э7‰ЭРЊ;рoTd5ќ*№ЖX7нЊръюŠeV№“ЊЊ;сo„fућ*Ўp$q{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/17.voi0000664000175000017500000002643710654601744023275 0ustar michaelmichael‹17.niiьиKŽY†сh`Р2hБKДюиЃЃ›#Ѓ›/е­3і Lр[TZ7ьR­KЖЋРш Œ.бЗ‘иœ9Ѕ#їŽШMњ 0ОuаКbЏЪЬ†—EЮыШшЌъКh]ВUЕŽйЈЃKєmдDЗЮйцЂ[зl”и<ЉnВObѓЃРd€{RG­3vЉ‹ж%{DFGЮh‘УYн:bЋkГQFWхU'6GFЯ›E-‰Эwн:gЃЧаДцЃФцАgЅГРdрVъQыˆъЄuЧUб‰}˜|8м‰s$r5F.ЧД‘ЎЉж9›T`єМ9!zб,њыHl}3‰Э‡ъ!.zЈЩpЗЎй!Б9ђ /ђрXнКaЗМbОДЊjА[ДЎиЇЮZ‡ь‘и<œВ[G|’М№Р)R‰kБТЋ[—ь]S­sЖЈЙжA,šЂ—Э§GЏ4GFЗNzбН tџбЇGвЌцуЫaи@%6>xQ%†WfW`u•ъ› ЌЎ ыškДХ":Ё:2:s~,Њ[їь‘W6д+q™мєZsябЩ‘ѓyом:g›Ји‹QsPў$9%њDѓ&Ђ['|cЧ;0€{Q­vЉ:ўЌЪъ~TCdvъh'V—ъЏkTS] ­‹6XFTпKtduыЂ-"Ѓ/ЋЃЦ:p%ЎэНGЏ6wНZмysф&Н^мyјъ№v?к‰Э‡ъХ&!Ÿ'В90:Г9.:уp™ l9ФЇ“˜ЊЊб%CkЋ*)ћ”Zaйg™йaеЇк шКЮч˜ъКШYЕЂuг‹DпJdєZuыЄ-2Ћ/ЋГ†:p~юkЩНGЏ7чE_оfzЕ:ФНєк”š“; ƒ6Ykю>z>…3šЇBz"Ж9+:т4œб|#ЩCїI@ДЊУЯж{дЃЫ%Ф8:&ћœZQйЇЮЪЊ~T#­[ž1nЋЪˆЕе\УЌ­Эе+Э™бнW'6ЇVG.Х!sзЛŠЋNыРYИUЏ&w§Ds\єсfыЎg­ŒpїНђЮвџьж›;žП†G4Я3CЂ'{EJѓXТ&=qАЬhОФцФ58$ŠŒ>Ш‹ЮъМYНЖєНкмyєzsпбЋЙiбч{­ЛžЕžмyє0KŽhžƒ ыp˜e†4ОћˆњіcёТиДfЇŒ“e"ф4œHlNœ™‹pВѓ|QѕшќЁuЬFUЇъЫ‡зж ъšLъй8ї^}ŠOшюЃЯuЕдИьi•=дuzUŸˆОе7–Y=Ф‹3yбѓ#o-Ўm НWЏ6w}ЭУѕСЕ[k#œ}Нб:ыyыЭG“фцa­9$zќЙџцё^ВKЅœ,cšo#Б9q Ї7pPuјй:c‡:И^д%6ЈzP]гйб}ѕqѕ-šЛŽ>хеRыВЇеEw]}К$EŸнKДъЏdmEЖnк.ГњQ`tоHЮъМdmчk]є’ЕНZєWАШЭ‹>нiѕ‚хЄШшбяЃ^Вкœ=љ­mвЫV’ћэ9ЭWЭ9Їс•цIl“‡ˆјђЊъxiВ]œЎ­c6ЊItFѕЌ9ЃњœZ•Q}Z}s­Гžuь[Fї\]б—МДъѓ5Јњь^ЂCЊЯзœъ‹Ьъ!ы8 ŒщМYЗя +vы  R˜ДшФУ|­ЙїшelXѓхNуЈ—Ќ%чDm›єВIeШ2œ,˘цЋ˜§ю*gОв|‰Э‰kp}Пп’ztМДNйЊ&ZзlSX=ŽЈN‹>є…Eб]WŸћ’Њ/uЫшЎЋЯзЄъГръыЇŒшск˜T=–\нКbЏ ъљjlœГЩЉ4iзЫ:Oж˜оЋW›;Џ~ЂYє'њVVc;o^§ОІї^9ћŸ‹Ч€}0JŒX†S[ЧDШv7–ВEiО‘ФцШН>_]ЕNйЊ&ZзlSwн}ѕ!pнyѕ1pнuѕЙ/Њњщш~Ћ+1њ2вYеуаЄъёчш‰ШшЈъйvв:g“ы LZ‹qлоЪV-њkXkюОz=Кяъ'šћЎ}+‘бы'KчЭы_#tоМіХXїГcX<йѕ?Ѓ–сLФж1•БнфьбW‰ЭCbѓ˜‰ю]}нКZєЇDFЊЗЯЋ —ИyѓЖzљdnг›Шў}pюDl+1лн"h~JlЮќr§˜|Ыл7hЊfМЇГS.Ћ ЌЎАъяФЪЊўIЌЈъGЗЎЎГшЦеK_\t ч–НВъ[u6>щKЈ~˜Sr-‡9Ѓњ)gл[$нaŽЭ§ЃЭэЃGЭэГOЂ{WŸEЗЎ§1Ђ?fд›}џlrдл‘˜Žˆ‰о Й зRЖŽЇЄ§юAѓ‡$6п›їЗјЈХь”ЫЊЋ+БКВЊГЂ‰IеuнККіеЋƒЎ†Щеs‚.fToЯкЯЧЖ:fYѕem{Яƒ˜ъгцЮбwЧцЬшўйУшцеуfеџб#њcБ§ЃoЧ—‚„цЕŒщи™ш•œЫ№!iыИ‹кююВішЛФцФNм7ОФРпЂžf—\W•W]V§н˜}ŒZъgcPѕ*ёч ЁњXP=(ь_= l=(LИ71;Ш*pЛэuЎоnziбћцюбЯƒ ъћЈъЃшіеУшюеушЬъйUПљUЯŽње&ДnбЗ]eFє^fsVtЬuИШй;Ђ6МY›єјцшФцШсИ&'|%6˜ @CѕmvХ;ъivЩuUYе?‘YеїШŸишmdЦRяЊ c}LT§й†l|›Т ‰^oЭ•Н…EзП!КsіysяъћЈъЛЬъo‘бЫm<ЌњyT§}xCˆ}KlŽ‹лЈПЄн\bоЙж’ятšџY‰Э‰з`цпD|iz”иМz ‹њ2;тMUЙеГ+.YuЦTW`є63#КбнЛ‘Њџ)Їб е›“ЈшЊЌъх(:zvзKџІ…nн}vЖЏ~|fTяфGЇU‡<Іо=—8Џњvxжn.2њ!БYєgфMtмЭe}Sœ]rYр]<ёЩ#Б9q6"›їŒoђ›7—@јбW%U?B“ЂŸЅ9KНM‰ЎCtџъЊAuїюJЌоGGTGFo#kerзkЋЦ ‹^Ž’ЃggНД4ц,єйDЗнЛњyx кіж"–z/c@v"Ѓ—k3)њЖŽŽЉŽŒ~ЬE\єуgNєC`tжt|IлЇзї—й%—о#Ÿђ4FbsтО1ј–,B`ђmљћкЈЪћЧшЋЂЊR+Љњ™T]Лш„ъui…do;3ЊЋЋїбsН>ќ?45nЮ‰ЎРшJ‰Ў“…ю]ЇбЋ_DїЭ>юw ;ШБ.a­"&d/?:ГzvЬeAбux:m_НZкэСьАsћ{a-PГгЮІЗ–[фœЂп.hу…>iюНyŒкњяx‡Д˜]z‘sgy К>%6'ЮFф5ђ§уA`2ќMъй oјn­JЊОЗVPѕ3ЕrЊWЉ1еЕ. ЉЎк††UoЯЇ6§n4эЃWk[•R=\шобыШ ‰ЎгшОе•Н=ЫЈ^ЮnЧ­ЛA\ТbЄGчTЧG7Џ^*cЂыЬьАЦН­ЋЯж8Ўљё›ЩmgЮЇЗ}ѓЩч‚ЎЧuп;qо&.e“^KlŽXšђ†РфцлѓЙРdј;дГоR?ЭIепЕUIйїжJЊЎ}t@ѕЊ4ІzНЛўТЊW‡§ЋG3н,ѕьœ‹жЏZГ[о˜ ФЈ[}™ёŽZЬNЙЊ6fз\R{Гƒ.84'UЏЊзЁ1еƒ•nНфЉЎ“шЮеuнИњEtпъWбmЋw‰У€шэљѓуЖбЗqZѓљы>еCэЏХЇ™ѕк0ЙwєIrыъѓцОб/š›FПШMlNˆ§юѓ=—МJn}|8ЪxdzL№њМyєnЊ3šO_Ш[7oЋSšь–zvЮEыЉžнr]R+Ћў˜н№žz˜r]­ЬnЙЈvfї\БoŽЈ^•&GЗЏоЬDHєfCІКNЂ[WŸF7ЎЎѓшОеЏЂлVяяG­Ѓmuі‹FЮвZ/ѕ‰юSНVГ‹~s,n_=Nю}жм9њДЙqєysгшWН]ЃїЋК;™wъХ tM~qѓы;бЗу јЯYчЫ№ЫЩPЗnЮ|Mмv†4Ÿ|0;ъw‡ъйAWѕПЇŒ-0Р'ейoЈХь”ЋjcvЭ5UyеЋж˜ъѕњІDзqЁлGз(К{іItыъэІВ…ЄGпvіьДSЋкчљууЖе'mНЃo'iЭЋ*чЦx|l Ј$ЗЏ7їЎ>kю}км4њМ7ЄywWOˆо~rk}л7o~ѕљœkŽбЋЗХiUПйHћЫ№лЖ2ЃљДzvж/†ЛоьЈ_ –zvвЛъй9—Х,0здь€7еньŽ7дbvЪUЕ1Лцš%6Їzпœ]быYŽыatѓъGїЎ>‹ю\НКЇ§Ћq›ЦўбуO{W%EзЮьž іЩбЧфўеУцце'ЭmЃWOw1бЇН)б›ѓГOУU}млч$]а}†бпЧпff§тlЈ;7яЋ3šOо^fG§jАдГ“ЎиUЯЮЙ*e*Ž›јїЈ/Г#оRГCЎЋ•й-=b“ЂŸ­AбЫXф HЃћWЂЛWз0КyѕrцDпѓю™!п(Ўѕ@Т„$EзЮьž+іЭеЧфўеУццеiЭ_m'ЭmЃЯz[GŸ7'›sG7ібѕЛЅYїэTЇLЫІ:Єy[в|;МнЮЮЙjU=;х-Ik ќuѕevФ[ўфVXѕwmVєН6*К6бйKkPѕ1Кѕ3і–T}[vшJЋ^†DЏЉў€Э~=;цšкšsEэЭњн!9 zдмН:Ўyм;zп=ЌЌћŸЖ"Vі`‘П]ъ”E^ˆГЃ~ЕЎNiОmц:%љЫЊzvЪ[’ж @§1Лс-_ЕaбпЕUQе?ЕUIйиЈъgk`ѕm•ŸрYU}{tfU?Јў„Z™нrQU\tU^єО9ЁњимЛzд›к} yj Yм­}sFћ6:eХ=ЛшŠUuNєОzvЮUЋ™ђ–Є5€EЭј ъЫьˆ7|зVVѕOmEU?bЋŸAеŸ9бYђ њ#jevЫEUyбš?Ѓіf§цм?z˜м=њИбѕOоDЯNyУІ9&}ДрKuPєЖzvЬuIKМ pЎў˜н№ŽякЪЊЎ%:ЇКBЋў§ЃTL^u-fЇ\VбщЭ)б]Г‹~uLюпyЎЋg—М#Бy}їNJ.tPѓ-яўƒЊjvТ;~jЋТВoїцЬhеŸX]б•]•]Ђ?ЃтЂѓŠo™з`цњЌї, @Оš№WT%fЋў” ŒЎЪЋЎМшЊршйяH\шРфлНzvФћ›рџё?љБкq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/16.voi0000664000175000017500000002636310654601744023272 0ustar michaelmichael‹16.niiьнOŽYРс`С1МGШтHp 6Fc1BŒf8'р,,рОWaИЛЋЛўН—•5Д+"Ъп7cЙЇквќŠ|Y•›ўУ7Ыђэ?МyДМ§юуїяпўљуwо~ћюoяо~XžќАќ|љїђŸЯПОй§sьgЫ/џћoњчяЧЏ?‰ня?ўѕћ7П~ѓю/zџЧоЭў№>|ќ№ўЭЙЯпљХ2я9|§_ŸŽ_ћяЇу?їOП;§ўъ7ЏPWˆь€џGDd'\+eW\)VGЛшиЫNй,КGЗЌЮNйЎeєвБЙч)НДМ‰—Хgй WŠьŽkD4Ќn‡ХMšŠEIq*;h б7гБЙgєвБљЈ:;х “^YDvСѕšлдя›уAfЪf/™ё,5g›]dH.КlзбЉ:Ю4ИЯ“[FЗ\б_FЫшQuvвe-ЃЯЋГƒ6щи|Rs…ŽЭKЯ/Tй [=—ЦЃм–іЅбІњАГKѕ ЙGєўЋб/‘q(Лъ‚ЫЮZ7 юНдПУLšлUзoО› Qє—бБЙgє№ів@Чцгъьšэ:6/ћŠР—В#ЎВыmз§ЄavD—%йGFtЉ>ШŒ.еУfбЏoмм"њLvжКItщьqoёъёŒлE/GgIгхhнѕJ,о,њv:6їŒžмыыиМœfgз\Ћc3_Гxq•иЫNй*ŽeчlёPЙKm“}иfж}6ф БЭ^4Жi>ˆюs€ФDvзЊYtщьytнъ•цКе“жvбЫб1XбнЌGљш–Ї‡шлщим3zVЕЎeєуgкnЭЛъ§з-š—Ѓф'џРOВ#Ў{й)[ХБьœ-т\vвEƒцђе‰mЂћLzŸиg=іvzxž5—ЎžGЎ^‰.[Нж\ЖZє­мatЫъьИб7гБЙgєМ:;lMЫшYuvжGMšЯž‡Еh^:Г ~’&гшк РНˆь€+Х^vЪVq,;g‹8“]tйys§ъQsѕъqsэш—ШŽб&нБy]Йzк\Йz%КnѕZtйъЛ‰^ŠWЏКjє…ъьК‰–Ѓ}+-Ѓяч .}wo™ВгV<їujоWПPЛyPНдo~йŒьŒkэЊЛu7івяљ4ё,;dГ8–ГEœЩ.КьМЙ~є Й|ѕАЙxєИЙvѕЌЙetvзšŽЭ-ЏТщqW9}­Йlѕ$Кі–ЌЭYєkЎЧб_  {ŒЎY-њfю'КњЁ7›oщшaѕRќЭЧr<й+Н п„–oо%^K‰йЌќX‡ъoУHƒKoЄgu‹3 QDvСтPvЬ6q"ЛgƒгфеƒцђбЃцъбУцтбуцтеЃ;6пЯFgG]2MЎм>‹Ў<ёецЊе“шкЫ=>;Š_‘ЂkV‹О•Kб=ЋГћ†ю%њш;ЉqSнЃC 7?Х]ѓz ЧУ=ќFJЮF•—wЎђщ67>”Ћџ-ї’ъЩŽъ>ЛRўц=б0ш*"ВЎ№иВSЖ‰й=—wЈ5WО›fбЏЏcsЫш†ЩЃшьЂЫІЭ•ыgбЅg>‰ЎН)уГЃј~пctЭjбЗ"њV†™ЛпЫF/+Cm=ўжэƒ6YйнВЭo _zgZЇZF/Гцк§УцђC?mnВ(чwЦђЩ&?h˜ <Šь€Ÿ dG\)ЂWuЪŽй"Ne]tV\?z”\=њNšГ“.ын0ЙуQ7mЎ?ŒЎ>єСJ—п”СбQПя1Кfѕ]F—ЌОЫшьОБЕобЫЎђyЦѕЃ‡пНuЮFХзwьx‡ЛдЗ93ЕŒžр*?o.НŒšыяЩYt‹н\х›—ž–†OЇwњРЋ‹ˆь„ЋEДЋŽьŽэт@vЫ6q,;ч‚ЇФh ЃOc;4ЂГ‹.ыи|ДСЄЙvўАЙјаGƒ.П)ууNєы[.Z-њV.DзЌОЛшьЖЉŽЭ“ЗЕ›ЇїьвЭЫё‹яХ‹v§ eєЄzЉ}9Ў5ЗЊоПœ75Ÿsнц•ћbvиЊŽЭЫtБЋk˜ќ a2МОˆШNиъЅ4ЂKѕKgьфцlВЫŒНьЂ‹b$;ъ‚]cЋшчФNбЯ‰§š›mtЛрeдœ]ДСЌЙrўИЙјаЭѕ7хЌЙУ~ЮŽюбйucw8ш–бйu3wн6uбћW“ЫVЬ&[Йye?ВУж4\щЅщQНнГ:ЛnІeєZuvкŠŽЭMŸиД|nКЬ€з0yЇ[/РWЄбЄјќo<~MВ#ž[ї_U/ЉMЊc Лщ’Qsѕъqsэш—ЦŽб&=YŽвб›ЧбйQL“+ЇO†\{рГ)—Ў>ЎПмгГЃpГш›}+›{FЏVgЗMCk7Oя•›зж#;mEЫKq=ZѕkjYн2zН:;nЊcsг‡= ЋГ“Жh˜ќЄ]0РWсщ'бwњqєq ЛeЃ—м>й#n3ьШnКdд\Нzм\;њєь=™sэъŽб›[FO{+WЯF\zж“­(Н!+cюнрZ}+ЂoхЃГы&:6ŸWМšЖf6кЪЭЫ`Ю d§R,š}!Кguvо˜QпNЧцеъьД›{>ƒ\†ййI[4L~дЏрkая‡бЧь–"њEіvщ>oЎ}амfEЮІм zв\::ІВЫццЭЂ_еJГшW5Ћ­\=pхYЯ–Ђє‚Ќ&їˆ>{ЁfѕpЇEї7жБy=:;nfZМyўaЅrѓ8Књ†œEЗиыеKБjuЫшћЌЮЮ›шимѓ1ТJuvиЊŽЭ+Ыkk˜ќЈ_1РзЁуOЂьŽэЂorvЧ5Ž’[ЄЧIr‡™›‹W6ЦЁфЎ5ГфЪбЯq.;mn[>zЅYєЋšѕVŽžMИєЈ'KQ{AЦ{\|ЋW“ЋVOЎУжбйycw]7бБљЎютЅ›gяћk7/ГцвгD7X’ЕKБluЫшž7Хžе-Ѓ{оЫ›оЇЪkыиМЬ>ужзЏрэнбrкH†QНџKїЦл€fdБхИч'чT6йТ7_ІZ-A.јW~}]tW<+0™Пьa"ўLШњ“}ѕеЇЮІoн&ж­оЌC7U!б5з6—}ан6ѕ:Нњƒгј€?ыУцUЋfZєOJl~СшюИ™ФцШЛјAtwйIыЪЩлcѕэ‹­YЧі0%—тКе‘б™/x+ЯЌюŽ›JlоІйнYпHlоІ!Ћ Lј_Пг=ё›шЋRЋЛžW‰‡]еЗ‰ѕЉ1ш„ЏШКгнuЄІКЫ$FЯ›EџЈФцYtwжЁМтm§ѕrwмЬQѓВеwЙзахeК:nŽŒNlўІК;nцхЂЛлІ“чбн]‡ТrЏ“бїџл7qД?–­ў&:ГК;o,2кSг/Jl>Јю;˜ќ&0љM`2РП"ёЋшЋВЊыNwЭ)—аЈъшnњЮЈyѕъqѓте‰бГц•ЋчЭЂTbѓЋЌшюЄяЭ’—ЮŸёт‡~”œ]ЛYщŽ›-е›_/zйъУшUЋ_+њэGнq3YG|˜МэЋЛ{N9<ъeџ SНюЩT§ѕ“цК™Уц шЏщX5:ѓЉ)ѓs„алyш§|њiТтОbc’ўŸпHŸЁnuЧœSК{Юxlˆо%TšWЏ7gF/]=k^9zкМrubtbѓ(њњƒоЎCгу]8z’МіxЬ“ЎЬђњWт}bШі˜/МашeЋЃW­>Ž^ДњЅЂ—ОНЬxсшљг–}ћЃОЌc!зоƒЃЅБьп`z%n+ѕaѓЊбƒълДІЭEFOЦzѕm2Ќ^Мy §ђpѓ-,0љт#6ЇрŸPКCNЋ[н1чTхEзЃю vЭеƒцхЃGЭЋW›зŽž4/]=mЮŒ^З:БyЖЁГЂП^яЌ:6Mމ~x­5ьШО9рB|ˆЮиw‘);oАёжЏ>Ž^ДZєoyЁшЯзЛѓ&&Ч›}ћzoлдlŒWnžV‡EзѕхцЎcГЉо–.ŸWNШкб™яn#?eк2?„ЬќИ7ѓофќђО‹ООtЇœUwКkNЉGнA'ьšЂїЭыWšW6/^=iЮŒ^Йzк,њg%6GоVЦ‹Зšз?ё]sТ˜Ь›ЎОo Й$яSЩЎ3ЁZєo‰ŒўІКЛn"ђЈЧЁ‹GѓoЮŒ>šъюДЙШшШЯ=2?{Ћо—Пџ 9ь;‰#;#yЭ1oЖvђŠўa_F__КSЮЊ;н5чT^t=ъ:aзP=h^>zдМ|ѕ8zэъIѓвбГцЅЋЃ›'+zщфЩНpэs~ˆО}Ё;ьРДyхъyѓТйGЭЫV?.ДшюК‰ŒЮЌюЎ›§[ ѕЏ‰Œ>Ќюn›{БшюВ#5|ZZ:љбcщъЭявNњ"kЄ?$6gў Ц›И`€Fи—б_rЋ’ЊыFwЫIuЏ;ч” Œ~lNЈо7Џ=h^>zдМzѕИyёъФшYsdtwз‘aятЭ“лЪкЭл.8`:ЖIѓкн‘ зтќœЎОO]“ к/€шуъюИбП%rЈ#ЃЭЧяyЙшюЖЙШшы‡ЛYЭoTВš?$F&gєрMn†Фц7iНЌЉЊЎПХЈ/н)gеюšSЊђЂokSЂ+0њq6ЊGЭЫW'F›ЏNŒNl~‘‰ю.:a>i^Л{7 ƒ2?шш˜KRєo§[ŽЂUџЈШшз›ъюЖЙШшэжќ!2:ѓН—ˆюЮ9'Б9ф}Ы@`2ќ”КшЎxF}ъ.9­*.Кюuчœr“}{Ф)бѕxае5анєQѓђеушЕЋ'Э‘бнY‡“бнAgь‹зOŸ4Џ=^ИzВ;жЎ§[DџšW‹^З:2:Г:2њ КЛьHdєЛШшQvwб‘бЛъюžS›#?ЄОL~“W џЌКъюxB}щN9Ћюtзœr“§иœ];нEпл7TЂWЏ6‹ўy‰Э‘—a\№›Qёђхћш€пGРœŒ—‡шŸ7Ќ ŒŽ<щѕЋEџšШъШшлнa‡>o'Iбя2ЋCпьЊЛ{ЮIlо›/“Зїъюр•Uu<Ћ>t‡<сT§yШAg}эЌ-(њ+4gЊkЏ;щ[ƒцЬшеЋ›#Ї#Бљ1К;чœРфсA/Ÿ?шх}t.?*Ун!њ/x•шЛMВ&бП%2z^нv$БyZнѕЬъ‹Ьъ}vwа)‘б[bѓE`ђЖў3оX^1РпVѕў_ŽЊїцЌъ7§YZ9еŸЅ•];нEпл7Џ=h§7$6яЃЛƒЮШ+ЮlOЧъёЃЋpљ#эŽхeНtѕdхРе№ЌzзёŒЊМшац-АЙ.t‡ЛЛ3žxдѓ‘И?›#‡c ]яйн АВЊъNxZ]tW<Ї*А:::Ћ:sЊЏенЯJ<ъРЁЮМ›ЗЬ9№wTwќВџ–#6Нq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/15.voi0000664000175000017500000002527010654601744023265 0ustar michaelmichael‹15.niiьнAŽ$IZ†a`С1fP‹ С5и4š#Фє pЮТ.0Зр*lŒ‰ЬЊЪˆp3Я‘Злџy=OЋ”йо%ѕ›І?,м-ёПX–_§ляљfљс7ПћэЏјчп§цЇ~ѕуПџјУOЫЛп/ОќЯђПќѓ‹/џ<њГх/пОўЧп>ўyі_пПўЎ}љњoџњл_ўѕ/ќ—њѕ?ўўЧб_ў„Ÿ~їгЏЙіЧџђЫИчўњџсёкџ§сёя§чўюљџљWs@9ljГ€"ZkГ>ЋН›ё)­хUЗXнZ`Ешг$6gFGюг™яˆKфНЉкЛйŸб>ЬNй­ЕМъжЋЃлГйA{\"zvЯ.—Xiб?—ШшШ}:3:ђо#ѓ.o‰МŸ€яNkГ >Ѓ}˜В[kyе­хUЗgГƒvX5'T'FwšыW'6GNЧeVК~Ешг$6їЊgэ˜МЇ}3ЛdЗі`vЭ>­хU?7'TЏ›ЫWї’ЫW'FškW‹>Ibsфн[щйIЏ%NGftfѕ•ЂggН њ4‘б™o0ыъйAЛ$6/йГS>%Џ Вv3;тsк7ГKіkїfЧьдžЬюйх9: z•\ОКW\=zа\Л:1zи\ЙњbбГЫЦ›wшe]=ќ2уQ>:ГњZбГУ6‰>шг$6wЋg'э˜|˜ќ&ЏјSД›йŸгО™]В_Л7;fЗ˜нZ^ѕssљъupљъArщшasхъФшfб‡в|’ФцЋ­tсъШшЫЭЧьДБШшЋmzГЫЖˆ>Mbѓ zvдK‰ЭЫ*{vЮ^ЩoђŠИš6;рГк7ГKіkїfЧьж"ГЃЊ[пьЌMƒцвеУцЬшКеЭЂДе=Лm(БYєY"G:ГZєYDŸFєiDŸ&2:ђi|P=;ъЅФцe•=;gЏРф/вzh_Эљ„vovЬ.mevбKыфњенцтеƒцвеУцТбуцЬшВе[ЭЂЄљ$‰Э—‹Ў[-њ,[бeЋEŸFєY"Ѓ/їž8;mCdtфгxцЙGц SЗzvвЩoђŠNвоЭЮј”іavЪ>эйь зVЩйнцтеƒцвеУцТбуfб‡кh}Є­цРшйeз9rЂЏ6вЂ%њ,‘б™еЂO#њ4ЂOyю‘yТ”y–ЗDžšо&ПЩ+"ЕwГ3іjfчьбжf'НвI._нoЎ]=jЎ\=n}ЈfбGJlЖнek:Ъv_/КjЕшГ\/zvмˆшГDF_ы†)ЗzvлPdtф3bftцƒРИzvиІФц%ђдє&0љ&0XкЭьˆOhїfЧьгžЭzm•нm.^=h.=jЎ\=nЎНб,њH[ЭaбязgЗ ж8А9q:jWo7‹>ŽшГˆ>Kdєѕо\fЗ EFgVGѕѕ–zvлXdtфЙЧFѕьАM‰Э™ЇІKфљєM`ђ›Мb8Lћ0;eЏіhvЮmmvв+фђе§цкеЃцЪбУцТбуfб‡кhЮŠўzyvла`‰KGoMGешЭцЊеЂЯ"њ,ЂЯ"њ,‰Э‘ятК3U§ГˆŒОоTЯn‹ŒŽ<­Щ<VЯЮz%0љ&0љ&0€ТZkГ>Ѕн›ГO{6;шЕUr@uЏЙzuПЙvѕЈЙrєАЙpєИЙnєFsRєЗЋГгЦњ œ]~<ЖšЋVo7‹>Žш“Мh}˜ШшШ™ОbєьКФцЬшЬъШЁОрRЯŽŠŒŽzYGз_щ›nєьЈзОDF5•иМ|L 5ДЏf‡ьзЭЮйЃ­Ь.zmн\Оњ-1ЌКЗЬеЃGЭЅЋЃЧЭuЃ7šEiЋЙlubtbѓ‹шЂеWŒЎY-њ,ЂЯ"њ,‰ЭлбГуF"Ѓ#oЇ3Ѓ#GбK`ѕR<КŽW|>K]$6чGЯnљ„Рd€Я ћLїРOЂofЇьжžЭzЉ­›ЫWП†UwVЙ|єЈЙrѕИYєЁ6šEiЋYє›/]Еz;КhѕЃKVПj.ЙвЂO“иy—љм’=ЊžЕ-Б9Д:2К_=;ъЅШшхkeVѕђ%2lБпA”6"ЫjЖgчь˜ќ&,рS?‰О}˜ВW{6;h‡Us§ь^rѕъAsщшQsщъФшqsншfбGкjŽŒžн6bЁЯrЙ•.[Н]ДњН,.zЩМљШ‹~ы ‹щ[ZVsфЭtftоЮq“иœy~`ЉO”имžѕRdthuц\_fБgэ˜ №]Шћ(њі`vЭ.­хE?7tї’ЋWšKGš3Ѓ W›ыFo4‹>вVГш#i>ЩхЂЫVoFW­ўШ ЊОЏ‹‰^ъRЂoоыrЦcNFщц ГуFђŠo.=ЛkSdtцTЃ3Ћg—m LŽКПЛнЏЎ_9зЁƒѕp/ЏрЛїqєэбьœ=кГйA;ЌšВ{ЭеЋћЭЕЃЭЅЃGЭ•ЋЧЭuЃяЃcVzЋYє‘Ўж,њH›бUЋ/]ДњЁ/%zyˆŽyц Ћ5ЯN‹ŒЮЌщаhѓqžШшqѕьАMqСo"ЃЛеѕЫЇzP=;ъЕРф7yХп‡МOЃoїfЧьгžЬюйс99!Лз\НКп\;zа\:zд\Йzм,њPЭЂДе,њHWkЮŒЎZ}СшЂеыТАшїЦ€шЬэуjїKГгЦЎ6™б™еГл†"Ѓ/ЗЬNлyТд­žДCтJЇV‡ŽШsіьœнђŠОqŸFпЬЎйЅ=›ДУЊЙ~u'Й|uПЙvє ЙtєЈЙtubєИЙnєFГш#m5‹>’ш“l6‹>аvtбъUaZє[d@sцю‘yП9ЂOYЙ}d>gFЋg‡mъіoюU/хWzŒШьЈ—›—ЮAŠИ`€яEк‡бЗ{ГcіiOfїь№œœPнi._нm.нoЎ=h.]=l.=n}ЈfбGкj}$бgIŒоlŽˆю^(hЕД б‘3-њ4ЂOYyCљ˜y†0ЎžнЕ­г[?z]Н,uфYяв[ьЩ_ЄѕPSћ0;eЏіhvЮmevбKыфњенfб?ƒ~tщъArщшasсшqГшCm4‹>вVГш#‰>K|tџBAЋЅЭ‹б?ЇШшШ{K}žШшШG—ЬшШЧёqѕьЎmым€шUuDtwDf'э˜|˜ Gjяfg|BЛ7;fŸіlvаkЋф€ъ^sѕшnsёш~sэшAsщъaГшc›EjЃYєЁЃЗšE)>њљвдА-ЕЭZщШёˆ‰ŽмЇEŸ'В:2:ђ†:3:ђ!1ѓ !ѓДf]Н$DЏЇ#šЊCжљMв<пKы€я]ћ0;eЏіhvЮmevбKыфњенцтб§цкбƒцке‰бУfбЧ7‹>TЏUєЯ!q:Ў§pmnи–ютVЏюŒD§љи˜iб‡}šчЮЌш?~ћtqbе+Н‘ŒЎ?еЯџVжGуSsхшх.:eЯ[оЊЛOЕ=ЯEDєђє i~К#ЭHО‰™ [{7;укНй1ћДgГƒ^[%TїšЋGw›‹Gї›kWšElи,њXуцЄш%рЄЗМiЭ+=ЛlCwгЂя.N.лА]Зz=гO?@EЂO#њ,нЮъбн§-%К-ї™еЃфскЬЈWžЂ#^‰OелЧЭ­/jЯЛiнэzvеK‰Э‘ЇІ7ЏЦй1ŸДФgj_Эй­=šГG[™]єкКЙ~uЏЙztЗЙxtПЙvє ЙvubєА9,zЉоМŽўzqvи†юToюNGdtры№лЅйic•§Г}–~nёшСƒVBєђmЃЛПXззжЈшоSѕтЦ{тьАMy[обЇ‰Œю? д˜ќ&Џ€MmvР'ЕГSіjfчьбVfНЖnЎнi.нkЎнmЎ^ны Œ~Л8;kS.тЂ#Ї#р…8ŒЎ\=n.ЙвŠЎОщѕ—8/Кўx\ьнevи&бЇ‰ŒTЯЎz%2:ђДf‰<ЫЛ Lў"­€ki7Г#>Ѕ}˜ВW{4;g/ЁQбmevбkыцњб‰ЭŽйE;\Ђ93: }]Йzи,њ`ЂЯЙ{ˆ>шгˆ>MdtПzvдK‰ЭKф гM`ђ›МbрOбnfG|J{oNъnfзьвžЭкaеи|с˜ДGbєzЂТћбХЋбЅЋGЭЂіV'њ‘уё­њ9vзІoбYуqЉЗФйY/ˆ>MbsЗzvвЩ7ЩoђŠўП§:ШЂ(Ш§/†žІЭ “ќq„lŸPRUk~|Еш›œ7?МК"_ѕ*2:ъќБЉЫ‰žЖ9б‰{bт’—ЙЛdFŽє,2:ѓ?`_н3*0љ[^1ЬЊ;рЊzщW[н1ƒ*0КЃїЭ еuдєo'бЏ>k§NЃŸ^=}tІDoJ1oњ-h<циз3'zЭLњ#wФЬшЬгБК;hHbsц?тЙ.т‚ўЂнWд[wЪА ŒNoNщо7GT'F›ЊEпFєm–ЦАшcusЯˆ54А9n:Ѓїен9ƒ›гVŽ?“р7ЉEwЦUyб]ŸКsЦ$Fз^wабw}ŸШшYZt­зд:‰ЭyН L YUu'\U‹юŒKЊђЊЋЋЃЋЋEп)Бљ[dєж\›{Шб~Du@Ћ/иwq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/14.voi0000664000175000017500000003614510654601742023265 0ustar michaelmichael‹14.niiьн]ŽlЫ™зсlр‚aј!‹ С4И1j‹ЂmдЭcс&рY0n‚S_™ы#"2ЋЉёўгЯгђйЛВ,ѕЏтМ+жЪ,Kёўцrљлќ‡пНЛќўяўќїќ§ўѓп§щїћ‡џі‡пџщђс.џќђП/џчЗџќЭчџэ§ГЫП|џѓПџл§ŽўчПяПўЁ}ўљџѕяїЏї‡џђŸўјџсЃџђ7ќщЯњуяЮ~ћЮПИŒ{ЖЏџЏПь_ћПйџїўЧ_ўнёџчПњ7?PР_‘жкъ„яk-/;Б97zuУwi~’ФцKbѓ%БИЋ§fuУЗЕ˜н‚ЃЃЊ›ЃЃWg|ц'IlŽН‡ќБ:ф[кцŸ06еЃwОРн:Џ`Ќ}Xё=-Б:::ЊZєЏійЂЃзж<шН6цAmН6цQЏ‘НОdToЃПўY^zєuFъkЛ?УЂЏ_F‡,ѕ^`tЬ•xtOМJК‘ИН ŠŽœ ~TћЭoџXё эjuЩwЈ~бПкgcЫŠnŸD5dFGЏюyHbt;DЏюyШ):!ќБкћшЭз•Ђ3–К79бqеЗПХE^((2њєV6#zџUФLoХ\ˆ_Ж;^Htkyб‰Э—ЌћсV`2№mэнoЌy\лXнђ жђЂл!{uЯ#о#УЂ[`єgcTѓЅVzuб}эНКч!‡ше9i/Н:ч1шњщчш€?E'LЩ>њ’q=ЗМЌшЄъMbdєeгНАшчФФш„•О#ЦуВЙЇЄ\ˆ—SoFtЏzuв›ЯеЋ{іїДЖКрЛкЛепв6VЗ<Јэ­ЮyH Œ>6'TŸ›ыG'6_>*ƒ‚/ŸЕЗше9йGЏЎyL{•шђщшђ оњбЕЋбз—VwMuV:(њr^ђВŽбї˜У(gTGFo.ЛШшыW!бmўJ=ЙбЧ{Lѕшол-бПFbsшћё—Љ^]є˜ФцKфЇНŸђŠрЏZkmuТ7ЕЋ3ОЃ]­.yXлY]ѓvД:шЇц€шsГш_"ЋіCиˆoŽŽЎ^п‹ЎОфННЎќ tЂыOїKDЗ„ЇъStТцннFЊFWЎО%Eo7‹Ишvј2#:iІЧеЋЛІ"ЃGеЋГюHl,ѕъЊ{"Ѓ3?ЏЩќ8яMdєeзН:х{“(ЉЕЖ:сЛZЫ‹n-ЋК}чTЗƒе=86'DŸšЊЙqЭЋc•о,њъoХѓ{бхНГ?—Ÿ”ЮMЅўxЃ#ЎIбЯ’и,њi^kІ+GПи|Ќ›‰ŒVЏюšВдO=Њ^uGdtПzuдC"ЃпDFП‰ŒјмЃ+0р2OЂЋn-.КЕЈшїЮж’ЊлЩъЂћ›/Їр€ъД5~“и|бќ$щ(оъV§МGЬJbєИЙpѕЋEЏN{Бшеe‰ЭЏНКk*2:ГњЅЂUџИatfѕъА™ШшЮЛФ€шѓ б—ыњ~}}$њibЃW7ќB‡КЗРЃш[‹Ћn-/К%ETЖ–нNVн|96ЏЎyц'IoўŠ.оюъЏњАЙrѕЋE—­ž5‹ўIЂŸ%БљхЂWЇ%6G>yŒЋWwME.udє‹]ŠЁеЋЫ&zхЃ/НЕЭˆ~рЕђ"Ѓ/ЂŸ&Б9…ЅўIZрIє­ХUЗOЋ;ОЁЕ шЯЦж‚Њ?[ZsV№х%šWч<&09В92њxFФїЃkWškwOЂыVЯЂЫV'FO›Eџ бЯђzбЋуF"Ѓ'еЋЫ&D?KфLgVGFї? ‹‰>ПКЈш§U ˆ~єе:КuеЃћ›ЏДѓѓ—6ѓЪKЭŽќe-Œž;о>ЌЮјŽжтЂ[ ŠўLl-Јњ31­љ`uб}‰ЭчшеAШ+>6ЏЎyPўB‡twЂы‡ЂKWšKWЃ wП^tеъ~eTєёх…a3Ѓq§гКW_и…Й{D4‹~žШъncNtчхEMї V5"Кћњ‚œжДtєЈЎtѓpIKG_геЯSќ8’™]§c сЏ'Б€ЇШ;;№№юРSвЃŽvџ,lIбŸ‰-)Кu­Ўšы7ЏEWЎюЖ†Eo^_uGаLм$Mђ—А №C`rцH'6ПDєс{‹Ђю™,sн…ŸŒFFєq82Ђлщ;ЋВцЮї–€ЭDєГDFпЉ^]70J ‰ю}cIвF“]ј6~™LoсцЩ%W8КіŒDFПHuЦqМ#ЂЛuЦJnч)бѓO ЫЌОlТW‡|Kb3@œФЅѓЮСЮ9pќЋ0щhїЏТЄѓш? [ Š>ЦFGWЎ6Ўž4чDo_][66^нЄшmѕТЎЉйWЮЙі6^"zuЯCт›WЧzџШ‘нћцѓƒP~z^&К|ўaЋ8ѕЏlšowEgf]uа#Ѓя=/%DŸПЕ(kn6 U›Їбewьˆ я$iзИŠкыЎFеЅГ‡б™еЋУf,ѕ%6ЊWGн•иœнЉ^]єˆШшЄ_mэDFПв‘§.Б Oљ#Ѕ;}хТює•?НЛгWџœєmрю@њТбmbuлШЌYєš6W­NŒОг,њЧ$FѓЂч/2Щ+л<‹ОtŸX+(>}чё ШЯйч6Цб…ѓGЭЅ§^sDєщ[ЫЪ&ІW`бцytY“љЈЋЛ}TE‡VWЮGЋўa‘бЁеУюеYwDFŸQkKlЮŒљtщ 2њ\Н:ш1‘бЇOQs$6№-gи&МxZpр ЧNeўХzk[}С{Q}Lz}еgћ|&z§ГнлФъЖЁYtеъiГшŸ3o§sЃя4зюМTГz˜—нџж‚ЄћІsPОЙf_зљ’ Шкчn›ЛбЛo-­™,sNєё›‹Вцвцљ]мUј&rћ?›Ў›FWЎŽŒЮЌGWЮЮЌОєоD_"Ѓk0—щSj]‘бНъеIїEFwЊW="2:ѓ}LР'І}зт цIЋ МЈ3l?„Мћ.эДрЫцРрСЧ2‡4ПgЦ5DЏюјŽСъ–ў3Q{сћ“\{Ж[OёшnѓGoнъItйKqа\w‘п Ѓ+WЃыVOšыfїЎОђеƒТве“UˆюoAг]ѓщ­йœімџЁ]џШкŸ?%6wЃW7н•им‰^]є€Ш•НAЌmАчеFgVЏ›yЉше]sУктн§70х—;ѓѕ\0йчw‹ бЧЙNиC.ЁЯж™|‘б™o ЦwЧЪ"Ѓwǘ”цKфџtт]b3pxRiт™Ай†qќ&эXцЫю<ще)iћ#АWч<$ёШю]pFrтŽ‘нœSо:V7нгk._н.^=ˆ.=lЎœ=‹.[няЌ=\кЪе“iˆˆю~oAв}Е‡wрeЂЫџЧшˆ…ЛЋ|HlюGЏŽКч…ЦЃxѕ(Zѕ§4QБW‰Эo2Ћ3?Я{ъ€рTБь‡Ћ1cVтn1я"Ѓ;еЋ‹љ$В‰iовњ9йЅђgМАNо™Ÿy'•&ž vТёЛРцд“Єƒ’#ьN<=МyuЪуВ›sЊчЙstwšыWwЃ‹gškwOЂыvЯЃkfw3уЂOЏ/ЭыOCJtя{KЊюИ3‰Э5НNtѕŸсp–ошЎЮЗ–њЭ™Яx™K=Š.]}=Fзl?-oBєЈњыЛ+гЦц“\4:ђ3оwЊŸ(2:фaщЈ3"ѕ€г&БьГЛL]­cuг}‰Э™ПцЪŒО=™FFќuuЮƒЖs‘в\њгв‰Ьъ7‰Э„ˆ;ђ3ыАрiG_:Ѕз—{”tNёёаюе5IќEџ6ЛИшNuбшiuй+є|7<ќ+уFzї№]џВВ‰жЋо~sIе=“ъВу1ЋЎлќЎŸ]<:ђ#ШЫщэРъœ%6ЇŽШЉ:ЁўБц­cuг}/НКш‘б—[kdtљGЄБИ чO™е—”{!™тŽќL;-јyМ{юБЬ9С—ќц”шФƒЦOЭннцтеƒовеЃѕ­=ŠЪ2œхТc=КK_‹ƒЃє2o.Z}Џ93КbЕш'™Зжlю>*• нЊ;ЂŸe]і‡™mleџLwуЊеН{ШюM@эшЖ}iѓНeicНћuљшйЇa!бНъ5Ysm\ВвЛЦКб—лЇ‡юЩ^УiЙGc^ЪqJš'Ÿ•–иљћИKїцЌЮXђИэуMdtцЦНyрˆŒ.ќТIвXмdѓ—ЬъвяYˆ—wzfр9Ѕi'_КЧЄW—WйxbwїLїъхнцтеƒцкеУшТеƒжвбЃ.НдусЈ=mЮŒЎY}ЇYєOЙз,њЇм.X}ЇЕdsїnX2tЋю L$GЏЮјžЩJз§iЦб…џLvуШшКѓ1ЛёDŸђъѕљЮ}ќжšЎЉу-ќќ­Ue3уъœшMdсшб'5ѕŸJЮсуMЅŽШшШ ЧеЋЛцТr?%6gFŸЊ3кѓ.ФKhє№ЅEFoпЬІEožѓжц<(h*6ВЦљKfuв5@ЄДг3ѓЮ) ;рјMкЁЬoђŠг—9ІМг\>Лп\Лzд\9zи\Й:1zв\Жzк,њчЬ›‹VgGяП*}Ž‹ŒОDFяП§мœ‡—ДbуIщ)IlО$6ЯVКюO3ŒЎ<7У§82КђДo}Ђжј1#%z—˜}~B]и6vЊn‡ззц œЋлюхе}ьбеYHdєДzuлXdtф‡Н™ПΘнf ‹ŒюѕъЈЛ"ЋЏ‰еaПpОvцEЗгпkлЏoFsдXмD]‚7™е›M~Фу3У*M:IњS`rbѓюёшжБКщž^sѕъ~sэшAsщъasхъФшIsйъisљшnџъКО]]Jѕ1.!Кг§ётзЗuMЭДvsЩИ‘шшепђjбu–Qtщ§л_ШНehu`ЯЈ0'КїњВВ‰ќ•nд•q#Ѓ+Џrsї(Оа™[^huшg‘ŸжdFOЋWЗ%6їытnЁ9Эл_гUЗNu§№~tfѕъЊ{zеЋ›юкtцDя§cЂoX2š“fy#hлиЪЌКH”xzfо™ŸqgЋ&b›t`їЇvАКчЧц„ю^sѕъ~sэшAsщъasхъФшIsйъC^TєсЫкбЇИ шжyЉlѕЌ-2њRДy]TщбIl~ЙшїKў4ЃшвГоПiПЙДЛVvˆ~–nddtѕЯЧ‡у^єъКŒЎкY§’#ВКn$чTŸуRš[їХъбнМЊегIЈ]4А'.јRџŠыzХшš?Ь Кіейп<Šo)э џR1ЧТГе…gї› FGЎДшЇЙг[Вљ^tMqЃё.oЂпь&Xѕ/ЕэЫ‹юVЏЎйЦEїЊWЧ ЭЊWЗM ЋW‡Э ЊWgЭЖе]s‘KнЏ^uOїb\uWЏzuг}ћЁШhхЬъœ+p'Г:ц  Qо‰ŸgТЦ~}“sЬјMл[ѓˆvЖ:щЎNsљъ}hFѕiuЂ;CQ>К;ЩAб‡W—%н5к.*GwŠТех/ЙŽˆ-љ(уFВtзОщюбеЕРъcsDї>ѕ˜]є'ш­яѕыЊыо‹ъУвчђоЛ_ К`ЕшgIlžFGьгН%ЎиМyšŽŒлТœьyuею]оЋTЏЮыkѓъеy}m^Н:o`^НКnр˜=Џ^7Бo ‰>МO‰оUGFчќОЙ[НИщО^ѕтЄьC3šƒ–w'Г:ђїFЉе1W 5-щGжV]іat+МЃ OИшgЙ]АZєГL[#ЃЋо]ŽЫZz,О–5#ћ4 йwЊ‹fяѓBЊлъХy}ЧРИшыb—о‰ј`Ё3 еЧувЋˆ~sŠLˆ>}Ј—}ЈŽŒNљ8ѕPбмЋ^ѓАХ=‰Œр;ђNр 9§z#фDї­ЖГКц1­ХU“ЊЅеЇХ ˆю DѕшўзŽЮЙђ6Ѓ5?I^ёuЁWg|O№tdн]ЦI…—ќl}--[нkўj-{}ŽЂ‹­ЛЉŒЃ#^ˆшgЙ]А:Бy})ќ(5_рšЭзШ`*J6oюz УќЉMЊЫvяњbВ#Ћ;ћERt;НQнzпX”57\жЪбУъвбЃЉ=Џ^VѕˆШшѓGбЧъˆцюR/‹yиyЋ^UЌ‘q&ѓVчДєъњgМ—жvVз<ЄЕМшcs@ѕ15!њМКѕЃ{Q=:fˆЗЭё‡…ŽXђssРЌ‡#aЃ>ѕEFTїђRЂOЗУЪеэрјњЪЖЁcєі)(њ3ДptЏљЃ50њ<ф…ˆ~бЯђRбЗo.ьљьЌoэшб3HЩцЭУtФ4hГъЊйЛОЬъбYMoУ(_=щЋY=ž…Тѓ1ЎЎ=ЪбУ”jGПы/ѕš–я8&FD%6У+ЉПEŸ&,’w lщcш{†GгзеvVз<ЄЕМшcsBєЁ5"њМОѕЃƒFтjŸœ‘О_хŒ?5LЪa626НasсъўpDEgTŸыrЂЗ}хЃїгаN/Ў­h'ћWWїuЃпCѓЂЋ_‰їšEџ”ЛбЋE?Ы8ЕvєeєщAхшqѕЅpєсЦНЏ^7в†е5{пg8!ћ4У е‡МŒъS^TtЏЏjєДКьRЯЊыFOЊ GŽJGПЫ‰Фfž!q2ъоУ' ?y •~^ъЈџз˜ќ&0`ДaѓNо <тИЕМш]oFtкП Lм3ђrГK‰?6nЕлOЭ>l.\}Ž€ъYsеш}]VєЕ0-Кcu]пМYєЯ§$wš3ЃKVпЎX§е•§љЧБДpєЅwяонаWЦ \ЋОjOе уFŽыzZь•q#лИ?эњRЊ}еЇМ„ътy‘ееGЁ/2њMdє+АъЯЙж‘цчУѕъŒя‰мМƒЂo"Ђ“оНь$6GѓV^1ћzк,њ%F'6OЃWЗ Н\tйъk]Pі.,ЅњuK­Нљ|cћќq)^§хішп6д5ЃЯQЗдКбЇЎэзlюЌfсБјr*ЌНл}8їTЯˆЌŽŒЎЛџ5Ш[xCў4‘бЩеYПНlž?V‡|GРCг—гћУ€шжГ:ъОШшsіъžG…х^&@-a‡'ЩЌљ9“/лф”јMsЬ’›лзп—=римЎ_зtЯW]ЛК~Е6lтГГЕ]єvЭ j3ЋуFЃЇЭ‘бЋуF^ЌyuкиЋEз­оЖХdяУОZ‹WВЎЅЕЋ>KГЂП&&.њі@]4Кгuk-л|Ў.ЛР_К3PНК№рNФFGVЏNјџZ{№X]ђхŸJЛ"Ѓуя>DF‡Wg•зk{sЬ‰>~| њ—‰Œ~}йmг1Эo~'ќuK:ѓњK`rjѓі‹u!пАiЮ9а§Й?…Оtњзсѓ—]ђЅє‚fЖvXчђб{ЗWWЗœ›7ыО:nЄ}”‚ЃЇЭ‘бЋуF“#›oЗЄъm[LіОьДюkЂюъwU_ыОШшъ#…›ЋvЭд]Э‰Т30}ЙоNw|ЫэИ8фŸ"vКлцјъœE<сEF_ВšћA–wћи1ИzѓR€[tТzЗу„д>м["Ђ[пъЌ;"ЃћйЋ›ќифsј ‘Чю:,јзI\кcrТАk 9Г{“sЮј5qЂ{щђЏЦУ)єЕзЛ]_]61n.\н.~=žšO‹^ш'™6GFЏŽ LО=’FF_zн ЛfiЛлaйъAYѕъСЫЅЃ‡"ЃЋ?PЧ‰\ЬЬИнзvќЄюЉелч…-Ыz8НЪ+~еќ[сщ­РкЂ‡\3“ЂCЋ/ЧъїП/-zФWш-:`НлЁ:aHО*Ѓ6ыоБ|tПzuд}‘б—sїъžEFŸ~5$0`Фу`ЯАM=,8­:Бљ]btрJЧGаIуя‰Їнk‡ПGž›K/w;КОК8lІ—\§jЎsRєyеы™5‹ўI‰б‰Э‘—сѕfнЭ^й5ГOk‡GЇEQїєгЊ;qЕЃпВЄPUр@ь.Нˆќг^QеЛћ[љъоЅѕЃw‹]§~xіpњ%ЋЙѕžЉз&нu‹ЬiюWЏnzРЙzuбCКехг?C7б О)§јkР”tя-еЃеЋЋюŠŒNњИf+2z№ ˜‰Эы$x„mтЙЛ‰Ї'qœx.sтaвсЭ!бiЇЃП5ž’‹‡ЗЃЏW‡Эt’ЫGw‡ЙњdжЙrєiЂіФшYГшŸ”= _нvGXєЕ,ЈzŸіўїŒшS]Jѕ1ЏtѓЅўsЦHfѕ›ШђэЎ‘’ГK8—Tї–6ЇњєвВЂ‡l;eЊ/ƒчМеQї…EяїŒлœЌ­šЛ.jШшTЏNzРЙzuб#NлнЧ‹‹ЋюљL=юзЋГцЮЛ]Т”to.еЃCo‰‘бqяОDFїоЦЄHlрA‰Gи&МxФqтЙЬ‰‡I6'кx:њ9Й|xчњђЫнi.нцђƒ=jЎ\}˜Œ=Є­Nš4‹ўQ‰бГцВб—6щ^н6}щwЏn9ДхDыBЂO}Ѕ›–Е/4Лћ6 AЬ~їсіІ0'ЛwW)_нщЬЊ>ОВДыžМљx—и|ЩzЬЛєїМїЏW‡Ml*–јгggTsм-ќS7К|{':`ХOбcвлІЫGЇн\>EFЇn}Џ№fqu \ХК›wVpт Ч‰gI6'žйиœx6њЙЙ~zЗЙzѕy2ъGŸ‡Йўhж9&:f6WЎ§$“цЄшлЋЋлў_{wГœИEa”їщs?Ж%0]iK›Лж$ЊЊcЩћšеГGŸ­ЋЇч‡Ьt+-!Кл= gŸЩзДcњYhKЯЮЊпž0sЗ_ъšбѓVЗs'ўОъбiЏDFwГGgН‘нЌMlž^bsftћ;ѕщубKО‰Ž˜“И}њ*2:tПо|г”"2њ,.&”їИрРЇ2>K:№љзЩсЭЃKілЌs@ќf–|3 sВŽN˜юЭ8GEЏ{Ёл,њwѕ›sЂOWb{u'nWЯ§§dюцNльб3зuЬОЙ5ЭП'ЗdVwђб]ЏVї’gŽю7gFЯ[иœ9гЇЬOЖ‘бЭийЃЛŸИ†FН“3Я›л˜?П1б‹ОЊ™”А}њ&2:uя‹ќsтY`2№?ї\цР`'>Д[ђ!О 9"ЕЬ‹ОŠЬ•ЭlDWлшЌ—:ЭsW'Fw›EџВfхфбE;КsdOн–иЬя‹œƒЩ7ЗЖщЯ‘–іё7ћYž‡yЧxЬНGПYє/}”ШшЬъШшmuФсоZпй›Oц‘бЇFs@ўК9cбе9“rЯŽяЄГхIbѓY`2l>Б;№)у‰OFm^ќ’№‘Uе›uЈОUжТшЊ7ЊitеkэцЩЋЃ{Э)бэnђшЭЊжэх1=ЛtъІnО­ьо—azsomѓŸ# гoю7в<Гg_ўѕFЦНGї~Iє/}б‡љЊшЬъб]/Еbgo^UŽй-Бy{п4§Чё‹UsШЂ?gMЪ=3kМЏЉYЭg‰ЛШYb3РїgЙ'>иН*А:'њвX Ѓ“оЊ†бMoЕЂgЏn6ЧE_^]ѕZs‘cЂOЯ'ЫмбI˜=ztќЎ х.щМkGOўšЫ<ћВї’#ЂkѓA`tй ллЅ€ш~ѕшАWDFєaDц{ЂGGН–ћ#0љДќђуч…‘9;­“Cж|н}—7м™Э‰Г№™ФчКWогшЋТЂыйш˜]jetЯыц„шMs@u\№Ybtbѓт<‰iП,pыXoxЃsіi5O_пZчщзМзœ0ны;ˆK22К[=Кы%б‡}˜{e`tEEЗdtд[‰Э‘šїz “OЋ;џИњ€O. Бsж №ѕђžE_7ЃCіЋŠ‹ЎŠ‹ЎЪ‹ж|ŒФцШшJŒ~:sšЁ/№"Ьм;бѓЗoЃVМгœ§ј}tзKыё§ЏDFїЊGgН&њ0‹ШЈшХ/бЯе1уё493§Xъ  ёtЋЮjЮќј’5ЭЩg‹нzdШп \ёШffTUЃ>UЃ+>Q7ЃCvЋ'Ѓ[іЊМшŠoŽŒ]ГOтBWbєуLj†ЎФЋpНwDДЗЃ'Џ}бG}˜ЏˆŽИзл.o@єі;%бџЪ22тB<=WЇьЇGtЮ–wv­ЬjОV?эдЃsіЪZф›Фцxж’Tеш„еХшŠЯT…UзУш”нЊђЊ+0:П92ztЭ^?ЁQЭ№FжЕX-ЃЃоiFЯ^-њ(Ђ’имЎнєжЖ7-њчЅБE{\ZS‘Ну• быЦ€ ёДЌЬиђЮn•1ћє“œУх!А9.ј.Б€яQЃ+>S•V]ЃSvЋРш ŒŽl~Юѓ‘Фfx)ыZЌх–QН.ŽЈ}”o‰є^`ђ&ztЮ>‰Э™wг‰ЭyХАCре˜И…Ф_$6ŸЋ?F7|ІЎFg|Ђ*/КЃ›еЃ;>“W яФm Е0Кf‡Z%GTo’Eџ#Ђ’иИпEF/ВGЇ|"2њtы]GЈбЁЃЋЋсы\ЏФ ыБFзьSбЕ6:hбG}˜ФцЬшUіш˜§›Я“Я›€ОњуњctЩ^uuКЗ'X4GEпџR}k­МшЛб9;‰>Jdє2{tЫ'›OYg Р<ъіГ^ўЗ)Uht^uVє%Ж*+њ'Xє"ЃO‘б?йЃ#˜Ъ„И%q{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/13.voi0000664000175000017500000002372610654601742023265 0ustar michaelmichael‹13.niiьи_Ž,GZЦср‚eј!‹ С6И1‹bl4УXkс6р]Аn‚Sн]]]•™QYЃ"ОxЫЯcїЩ?…"#+ОјЭВќіјюЭђ§я~ў§пџѓЯПћщћпў№o?|џгђюЫŸ/џНќЯЗ?ПљјчкŸ-љіѕпџіњЯ­џќћэпПk_џјЏПџюЏПћс_ўщЧќУ{љ?§ќгп­}ћ/Бьї|§§§r§Лџ§хњя§Ч/wћџќЋПyB9РЏHЋјSЕwеi-ЏКЕРjбЃˆEє0‰Э™oDЊTG<ІU‡< ЕМъжђЊ[ ЌNŒnЗЊƒŽˆŒ^UWїЙв‘б‘ЇGftф1ѓГЧЉzyOЏ(е>Tw<ЂЕДъіЅ9&ЛЕМшvЋ:ш€UsBЕшQ"Ѓ7ЊЋ‹ю‹\iбЃDFGОoЋЋkКњ”Wѓ€ЗиДш‰Эдj'еjgе!h-Ќњ[gЛRtDЛUtРЊ9 zЃyўъєш˜sЏmFO^}Н)BЂo6ѕ’Бв›ЩГG'.ДшVСЭoеяЁ!ЋќцГ4fsМЩкЯg‰Э'yХР0э]uЦ#к9:'ћTкZVі[eЫЊn7 P§йZVѕmoBtћ\щ ‡ёЃАн<ХU}эs/?N_§uw,_ŸЪтЎЎЋm|§e^_Wјъq,юъКŠ^>ПŸ=zu>‡DoМ`ЊЛњVЏ•”шЯЬзчqjз‰_п4[яч€ш­ъъЄ›7ыЩ'ЩАДwеhе)GЕkе9‡М…†UЗл•Ј~oЬЊ>'FUП'ЖлъъЌЎ/…9е—Рœ§ёИ:@&ЎўШ['Ян6ŽъщЃ?П ŠЮ|ЗК‹УzЎ+ПІзvѕ­зvў•^О6Їьщэ#zіцЬшэъъЈЛ›Ѓ^†_\їf4/з'_Фf€‰Е“ъˆ‡Д‹ъ”ЃкЕъœCк­ъ ћVЩ йЇТДшїФЌъЯРЄъs`вRŸЃžХОЌdѓМ›<Кг&Uі%­ѕG^дЎоy чЎ=ŠшQDђrбеmЛ^.:ВК:m_dє~uuXWbѓжј`ўшъљ›—ыKuа!зWлъšуТ–јЕГъукWе1ЧД[еAЌšЊ7šЇЏоlžМzЇyъънц™ЋЃ;ЭѓV'Fw›E?‘шQD"z”ШшШ7bftфЇМЬшШ›ЫVѕ2}ѓGѕm|uд]‘QЭ™І%r–w˜ Р‹i'еiе)Е[еAЌšЊ7šЇЏоlžМzЇyъънц‰Ћ;Э™бгV'Fw›E?QbtПYєѓˆ%2:ђє=ŽшQ"Ѓ#o.™wФЬлxцм#sТ”9Ы;Щ+~—W РŽvVrXЛVsHЛUtп*9 {ГyђъцЉЋw›gЎNŒю4O[нm§D/з}˜ фiе)Е[еAЌšчЏоHž>{Їyъънц‰Ѓї›'ЎNŒю5Янm§D‰б§цШшъКYЕТжјнnєЬх‰[Zє0ћС‰б‘+=stфЇiбуDFG^Ц3Ѓ_Єњѓ7еa] }˜МdЮЇOђŠ€@эЂ:х vЋ:ш€Us@ѕFѓьйлЩsWя6O\нi§LНцYЋћЭЂŸ'1:Б9ђ1мЎюъкž9{Їyъънц‰Ћ;ЭЂŸЉзЗ.iѓМsiPђЩЗуcy‹Ўў?Е‹ъ”ЃкЕъœCк­ъ ћVЩй›ЭГW'Fя4O]НлЊYНејЛ#7ДіёЯЧƒк#ЖЕ*йmпќќпмк3zЗмСMзкЫы8Ищ†ItЁъ§Apв csоъWлёQцшi\K^=ФЕ-}єз:mK}\пœ2К_ъбнTW‰žnащЃЗя\vbœuюYX$љg\›E?žl[:VЋœtНЇбЏчЫN,ЃSі.tи№В6oГжблВ;:ыBХцittгЕckцє_РчŠWзЪјЭЕ~ˆ ЙябкоEчмё*m­JіЋГЕzеЕEЊЗУ WYыm?e&d?йчњ•6iЮZніеЛS™ЃЧЖvVvbhkљЃ‡ЖОЙDu‰шnЊЧцœбнR%КпЋыGЧ–xеU)оvб“ф„сomm§|A`нBW9ЬEЪYDяŸ Ќ[9‹Юк|Ќо=NПДбmЇОSttж…ŠЭгшшІK“ |ŸЉЖШoъЭЦ›zХР›жZtТmжі.Иц–Wi+S§ m­ZѕЖ.PНЏ­§Њ.4жГ‹1mї+mвœДz—vxККЊїЇђFOвв7oc\…}ЏkНШИЕc\‘ш§RшsБdtџS<:6ым3p’œАМKW9сrї‘У`dœ‘UєсљИМ…ЎzВЮљšЛЁю/СЌб?ЕSбu'*6ЏЊЃЋ.TlžFG7]Њи\щўюEє)˜М•К§?ЈW ПšжџЖЧУьžЉ­•Љn}t…ъgh+§Јn­TѕОЗvtжђзЂ>b_бYз{ПЌнŘwЧоpЗщЅэI[њцItњфmђX!КПйШ?v}эDgЏ~=Њ›uъе7IЮWў–ЖKW9сzї‘У`$l^FžЫ›ыFxЖЮљЂ‡-юx &~7ЋЦ;ŸХŠЇn^WGw+˜<ŽnКєmЂгgWl.9›gббI7LоЊќСcІZ/Р?­UњEњGkЋ“§JmeЊ_Ѕ­NєV2њUЛ‹.>VX№itвъaпш.ЪрМЉОБBє8 ЏiЗ‘уnБ?“wЁЧ}yВѓeДŠ~ьxIУwе“u.дnUЫ4ЋшчгaaSCу,9лŠЏЃ/ ы›ъGxЖЬЩЃЇЃ‘/њМzœ•LІбуКЇГZђдб'ебeg &/ЂЃЃ.UЌў>уQ3:Къ‚цЏQБyqџ‘^Сф7Еj~ЉŠ?эоJ§$§#ЕPѕ+Е•ЉnЯдV&К>NG—]˜GЇ­>sДњ9NYНЋьЋгF‘Уqtтш$КЅ>Є•‰юFwˆN{5о>š“VП–КПТЬЂлѓжКVtR§-t›F'ыя#чЭЙVНЕЎz6йFЅ­є/‰KœИŠNyMžGЯ†%ƒй§?пщЂŸ–у9њД:Кm­bѓ§/Ÿ‚Щз{vJЂПŠцЏЁљЋLоЦћаЩ?•YпAХf R­wO-ѕ“єдBбэйњzД%OoЯGgЃУNДбуttквЄљ5обq Гцьзф8ЯЧшŒеЛЬ:+НЯœЏtЦьyєс0:qІdtџ>?Jgь<ˆўе,:“Vw—о"3oѓёухјВ МЙЖвП*ЈoъVtЖ™ОŒЮx!>‹ІбЋq іъYЎyОш§ОP'zЏbГш/SБљцЧc2ЂПH—YЂЙиЗкwХ›'bЋNM.ЛфХoЦы.}ђVdˆG%ЃЗt_a€ќŠ§Кћ{iЉпЄ”ОЂгЇЗGkл­tђoƒчйшДЅБy7)бq “цєбГцьбгцЖ{":pъ"::oЎdєjїx>Jў‘7Пг.їsMЧшМ3R1КŸу!:Wѕёъы"“FЛFY2њёЊ ОЉяr<^бы•6^r7Ц%кЎІNєžшЏRБЙdtЩщ8ЉŽ.[ы"‹E/Oф3[зьбѓYЈвœњЎє ЦUwTБ9эWи+5ЋS~ёОЃd4|rМиЯЛП—ЖНшЄ+•­uЊmЯЗ‘заќŒЮ[=6чž4Їž5‹ўM\E' ПˆЮY}vHNЂѓNі$zыг™5'ОwЇ9єЂЙ OwœFя_ии[5#“Uзо?кѕОfНъЩЂїBeЂ*6‹ў*•Fњ|ЯЫкм&ЗЩЃŸњФbбуЉРЌ‹U-юfiяd~+6чU2:эЗСsЊПPЩш-§ŸЄз*6РЈмЅЗzПJпFбIW&ЩйЋчЩЙЋ—Э‰Ћ+6ЛшšеoOGїЭFg]я’бЇcuДЏš3F_6'Ћ^F&Ž^ЏlошГqH[}н=њВŽ~§ ЂS_і9go [єўqшУНP™шН’бчебq+Ѓ+5?‚*єГЉPєК0oѓуCq˜6њнjU+6яF>ŸГё­аœГp”xs[ЫМ%Џ•Œ.Кжу'ctа=5ЋKю|?Uы€…rП7^№щ‡фќеГфье‹цдбЋfбПЖ’бчеYл—бэ§ЙшОЉutт1ЙŠNY].њ28_ѕНф\бw›3Eпn§џщT,њpP$њpPЄzџИJєžшЏR)њйS+К=ў-§L*д<‹Žьœ.jжш7'‹šЖy[7<uхtz 4ч,Ѕо(ЮЖМЦ]ЏBИъЏS2њту<ЏЧЃ+5ПЋи ƒz?7^№ЇнЧŸЃO_=KЮ=o§ы[DЗŸЯDЗ-­ЂS/јytвъ‹шœееЂЏzSVWŒОзœЋњnsЩшшЮН]RБш§у*б‡бП‘лбЩЊїЋTя”Š~UŠ~6Š~6­SѓE?VњdyгFї­}thтФљєЖœб}ієщ€Њ лDЪцЋ•ођ7g,-6КмNvшМJFЋўBпЇ:Кщ†їЬjе[џ7›шžЯ(˜ r?‘>љIњш kCrўъYrЩцšбЩгЯЂгVŸF'­>oЮX}UœБњNsЖш[ЭйЊ+FпlЮU]1zWT,zџИ@ѓэшаШоЁЈRєс Hѕўq‘шэоBЇЋ~TGчЌ.}КвЛ—ФVіn,nОшљ*FегtКОфђ5п‰ўђІK™7З•ѕЎ‘зѕŽ—PХцUєћsСmk%ЃKўEНxѕ1?:ъвnŒ Uo%ЃŸ*6ўV5эŒОЦOwЗ^tаЕ!Й@ѕЌ9{єД9{љItоьгшœечЩ)ЃЏ’3VпhNW}Ћ9[uХшWUЁъ]TЕшнУбћž2ѓq?:4ѓЈlєўq…цћб™ЊЯC“Fїъшаƒ™љЂWе§KЂђn CшщKООыдKЎdє–Н9[пдхU˜аbЧЫнОŽN\}нв]OыuЮМкыйH\=†>cіёТыŽтВЎЬЂч~иG–‰оњ{ўе/›Њи РoЊия_ЗНш˜[Z/:шк\ zжœ={бœ:{нœЗњЌ9kіEsЪшЋцŒезЭљЊŸ]•ЊŸUѓв”еЛЄхъІЋоѕ”Šо=\ЬqВшvіZЌ=ПsGп]Кs?:QѕїŒо2~(оZзdЭ?ƒfсУ‹rEoЋ[Ѕў%akЗ.КdбЗšГ§Љь^sЭш\nŽG.Гшєн‹шмхgбEЋпя=Ђ'ŽUќwXуДЭ]є>Е@ѕф0oѓжЧж=ЈшŽуŠ&žŠƒCcцY^ЋиœюЎ>ЇэEЧмвбE—Цфќегцфе‹цЬеЫфФе›OЂЃЫж>ђъ5OЃЃЫжк2:КьФ3ЏNђіЪ;kЮіž9g+lх нeчŠ^MЧDhчСћОq#9Yє]бЉ/ЂПЪНЦ"б“WХЮм…\б‹ъйЫтVю^s™šПOttгЅoнэбQikѓн#яmщ›EєЎ4уРЌЋ_пƒGgб/щбЃniЏF<‰q Do]лq4’6mЏЃФбC[WжuЁ‹лOxPбнŠІ^с—дп o*{˜рBл‹ŽЙЇѕЂƒЎ ЩљЋgЩйЃчЭЙЋ5їОZбyЅšбCutз™G]Ёф—JЩОŠы|1ЙоХ| ‡7jэпwшѓцtsЇVєЏс›EЏŠJн\зб“зEфЭнп’бЉ>я6Їrѓ œG']ї;бљВKVЯЃћъШТ™EѕЃ4guпy<Юй|Јь‡iIЃdєжЇ•ˆ6Ж ЭУб_•egКЖWkтц!nYЦнВЌЮ-ѓWй›JFчfИв^ЂSnjНш kCrъYsіъягœ:њ­ЎXt[F'Ю~OЋTќT0љнrSНEо†сˆЮЙАИїgcgкъƒх№r…п(NЗмЗ›3UWŽ^|>оЃS_–буЫbgюЮBЩшT{оэЫЎDєйЊG[†fЎ^/nтъ“‰(W=<\й9YъМи[DЗюS2:Гг/№ЩЪчq:ЪI›'CP+z8‘Жy9œH=мц—ˆоњДgkтцИйqтц!nTtЧВ:ЈчІc^ъЙXЉиœ~.р\{‰NЙЉѕЂƒЎ ЩВЇЭйЋKFЏЊsgЏЂГVПu-ЃГVџtь,МѕЭ%дˆ—BSќцgрђвKкПо3vзdtdя::сРмЮT}Л9Sѕei­шсUQ‰ЃЛУP2zKд|:гбmKgбiуяDЇЫОЌњftЎъ’б5ЋПAєp"gє6”hžќqЗ@єxѓY yrЧ\ z+Н eš‘§qюцёћд#6sѓPї\сЬЭя™нсћ_­ƒzn:цЅž‹•ŠЭщч.Д‡шлкQtЮmtiвœ?{<{КzИКыЌQ=ЋLо\eіЪ ёKЁ+яaЕ_dю_яtyЋo4чkПlЮИтw›3Eпцlеwšп_8s3њЧ CђцЮ:ЉГшДёwЂгeп‹NV}3:Wѕншšеб%—zЋН ]šЧшyuhуhш*а<Йc.=љn’ПЙfєјзЏЭ“яSšЧъ ЭЋъ-uѓжg?ŽR'џthЬ=+› Мr?оіЂcniЃшЄK“цєйѓцфеЋшдеЫшЬе“ЮєеыЕMл\g ž ёCЉ+яУrПШмПоъWЛцнkB#{w–ЙPtїЊЈР™jуќгщHч,:mћш|йЗЂГUп‹V§+ИЋњntЊъЁkhMНuЭ}ѕу8Дq0@њщ˜EЏПЬфq+:Аoj–?zђ‡ЄќЭГM-ѓЄК@ѓd/.а<Ўu…цсj,б<Ќu‰ц­ћу]‰тw‡ $.(ЃНDЇмдzбAз†фйгцьйЋшде“жєеЫхЭ]h"*MёУwhЎј ,їчЬЫ^Бљ4:КmЅbѓYttккw[щМх—бГoDчЋ§Un5gЫОГТщЛ\DЇ­NXъёЬўmФФ­œEœЬН б}uТцIєdK Ћ[9_ъœЭw–:ЌmэВ:ЌьЬЄ-}ѓХОиun(,а{бœКZѓзЈжћгиšНx;FGЗмUi(ž*FЏЏПФobЖkЄ_јй^—}\;єё 6q4‰>TП=ŽM­ЂЗjбmїдћЃРР™itY#КuЏ Š[YD2Г5w[ђ4;нBї~УjЯF<^ПАч—dC^ЩшїЊc^ЁшљR†:_ъЄс“Иќб“{ўќЭе‘aЇ–е‘Q—V;H`в CaцmИ-б<(˜ @2­Еш„Oi{б1їД^tаЕ!Й@іД9yѕЂ9uЕцЏQЃђЈШвUŒЎ2Фe.Н:ћХЮb—лф{'ЫНљyp§з)ЕЂл№Š˜ДЅYs™яњœGЗў%Qys‹ш}fОшm_yz=frHМ^іŽ]%Ѓ‹|Пpър7}]Щш7иC^…ъБЎNѕpЂDѕb@тВ.œь ‘Yе‘I7Ьч#Ўчž.БDsЏbsЦПРoЎН‰ЎјŒv]sKE']š4gЏž&'ЏЎнќ<™sOЅ=*2U†ј ЬЅЗsЕ_Є|п zLЬ83—Ÿ('§ђsАHє1ВLє>ГPєю6ЄRєGъьк З+МШOф%њЗtЃ:6pІ++PМ]F‡Ж­uu%ЃKUїЧ%ЊЛУьЭчK—uсфZŒЬК0ЏŽ,КeКімsH,вм)˜ Tб~ˆnјЄVЏЙ}иЌЙЇНЂ‡ќЄZš>x›KЈн FЗЖЌЮћ6кYuвkВF'™vURuЎѕЦЇcТЮ бmx:ЈьФ}ЈЌ}ИmЊ§(]› ЌЂпZg—fТu|кшзЃbбуЩpйU‹žW‡ц-\U‡Ц­гj4w %ЃKUђ7wwњEšчKѕяiЖэm™ПŒП›Wg7йAk~‚Щ[ўaјb­E|ZkхЂ[Ћ]АЙ5б_ЂЕEuтЗбЛГбq+ctзŸа:4qѕЩкІ>›ˆДK}6ШЅЂHtрЬЩОQ0zraІQ7z;“|ž]ЂcЏЎbбЇеБy ЛА2Э‡ЛЂWiђшѓъША3ѓшФтoіmнRV]щoќŸKtЧ№uхQtO{-wђmcoм­CsюъvШ”_Ђ`2пB‹јМіCtУ'ЕЊЭХЂ[ЋWн:Яsбa'њц.?ЇŠб'ЭyЋчБЙЃ—+œЙњt:DџŠ*F_4чЌ.НЕGNЕнНF•цGєЊ:ИnЁtєЎzKН=УіЁЩ›_K=ЋŽ ;ѕJлЏoюц]єж/u\дЅ]лБ:Ќшscs[іНnЎTtЗ…DІќ“€OhбŸз~ˆnјЄжъEЗЇш’ћкTtеЙysђьŠбЫцЬеЃOšѓV‹ў*ЃO›ГVП•э"ЋDoЛѕю—>:oсНk_™ПЙn§AJ“ш­HєЂ:2ьŽYutгк3mыРЊлњъшž{Къшœ›еб1wЅпыІJWGg|RСd€ŒZ‹.јДі.:уSкNtЫ]m]tmlЮŸ=mN^НhЮ]]1zйœЙZєW94ж‹ЊЃгжкЎtЋє~Ш,}ЌŽЮ:зцебYцебUњЫЏDєД:КщŽ’бЧ АJs™mуЈШн)]d‡юLрŸЕіуџZ‹Ўј”іr[;ˆЎЙЇѕЂƒnš TOšгWO›ГWWŒ~6VЊо5ж‹ЊЃУN*ЋDЏЊЃГЮuЋ[.z_unИќ*DOЋЗьбУ€l[ўцYuшUіК^хшšебŸT2КмŸ>€/гZ‹NјЄіr_л‹ŽЙЉЕzе­tУа\Ёњ-ВXєЃВTu›UGG]йe–‹ЎU}ьЌ}ШŽКTшњ{ЉДk<•к ŸJF­оксCІ’Кб%ЋЃр+ДжЂ>Љ=D‡|BkЊПJЕъїЬbеѕЂ‹tУОДLѕq}‹EHн)Y]kлјPl‡ўP2КшXџT2z{м…РoЎ§ёY­UЬЎY]lBžЉ•ЊwЉЅЂЫД>ец…їjе5їш’блaпў_{pH шџkWир§•пq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/11.voi0000664000175000017500000002706710654601742023265 0ustar michaelmichael‹11.niiьнMŽ-ЩYЧс40`=GЈХ `LйТBИlР X и@я‚­0 \uы#?"2ѓДЭ‰їяѓи­[•ЇЄўш7"ѓtъ~Б,Пќ§яО{Е|џыпўцWпџѓo§уїПќсп~јўЧх‹п-Оќїђ?јыoџлњГх/_џќїПнўЕїŸпПўE{ћѓїџњ›яўњЛўхŸ~ѕПћaєУјёЗ?ўъЛЃ?МђЫИg}§П~к^ћпŸЖ?ї?§нўяљWѓ'( Є6;рчjГ~†жђЊлЋйjеэУь’Д˜нвЋgЇмН$6gzKцMžЅЕ6;сa-0КЕРъжђВ[ Ќn-0ЛЕРьжГПŠъй9їDF/‰ЭЋъ%(zI[х/"Ѓ—Шh ЌіГежfЧм–ћ*m_фMЦВшй-wЕ­й9їДНйAwЂ#Т#Ѓ{еГ“nˆŒў:6уьž{>sƒЂЗеГcnЫšŒw‘бKdtфg.Іj/fG<ЈmЬЎЙЇэЭКсаPжћ*1К;ел;бѕ\єгdVwГg7]ŠŒўЌ^‚Ђ—UjNєЁzvЯ=Лъй97­Ц"%y‰цOAчЦJdtвЙ96 П™quсgбЯnЙo<OљcМП‡Єц%ыžО˜ №џЇ}1;уmmvЬ=movаЕCr@vЗЙxѕ ЙtѕАЙpѕ:0ЅњP—PнiћИT5КПžЋqy~вЕСМ_+мм.йћjДу oТЭQбЙ>)ъТ№tЋ|тНd-uЭьЗгИj^пцц=;цІу81КіЙМ“дњ)5zT]їнŒЃ+џ3VWїёaY]љшп ЫW^xvЬmМюѕЪFŸ jKl^ТњV“€эгь”Лкжьœ;кбьЄ+фђйƒцвеУцТе'ЭeЋїuеЧЖ+eЃЛ њ~ЁjѕљдŒОмŠЭ§щ(Ўњ)бUўlыЉ"їМЧQбЏТЂпJУЂлЧIб9­њбХпШ`–kŸ‚ЃВвбеЯЎЙiиVПКY§Ш ФNѕіЛ/­Ѕ›їжи)ЭЁŸf–ъ7ФБРdј6Ежf'<Є­ЭŽЙЇэЭКvHШю6Џ4—Ў6Ў^чЅTто/Ўю­шfн'4]:ƒЂбЃ[Гњjpы6 ;Sќdы+ їDF//БiеЋЛШм|Жюџ,ЌГРЁе­zxw–Ћ?™іУ"Ѓ—њбgеOКeTV>КW::ГzиVПzћэчѕЊбЫЁym^ж#›—њwёЁФц%яПcР7Њ}1;уОЖ5;чŽv4;щRЇЙzu7ЙxіАЙpѕIsйъM]JѕЁээBхш“-[}>EЋ/VГdєхl.Нл†jlХуЎзкДшхKldєъћ€ќCcdtЭЛЩV'Бўc^/Њxђ2˜стЭ›Ѕ^НЪЎН§дВК^5њXНО^:z3"Ѓ*9HћМ^5њАпОЏ?е›oъп]–нЧРцЃФц‰ЭЈ‰Э№Giяf‡мжЖfчмбŽf']щ$—Я4—Ў6Ўўш ЊоФ…TлЊЧmuЃO—Дjѕ[зыџћйЯoКRu-Oел‰бЅЯЕ‘/Й‡czVЮMћОИe9Kv…ншjятИ]ыšЛДЗЎхє>’VeХ“WбыiЎМЌЋћйгТЮЗнъЫЂЭЛ3.Гz‰ŒоWЯ‰КtŒ~ˆ*\н‹Ў~цэюЇцЂблЂцЃФцЅњ6IlNјЄјІэў€ŸЋ}šrSл›tэнm.^=h.]=l.\§й—SНЉ ЉоЧ%TŸде­>]дЂбяЕУE-иМ^ЫšЋкГ_р„ьВ[эLo~ŒЫ”Ђ;ŽeѕOщCkЭ№§`є†Ѕvto_\ъCа:Лъ`ЏњV—Іѕuѕю†е›?ЗйКЎr№‹cщњыšЭл­S=/ьЬ6эP=­ыд>ээлЈЅ~ЏЎнмЎОїеЯшw‡ѓ#Ѓz§uHѓAbsнЧЛS9Э/џЦц§Ћ”цe7ЫЩЫч1’в №hŸfЇмдіf];$dw›kW’KW›лR5{ЕЊ9‹Н‰ ‰>ЦеЏ>ЉЋ[}ОЈЭ% ;VЉ9й›аъCцzхч$]ыЌl§!?9ш ‡GЃgZ^Wн З—ІД ѕvсњZщшнЪО\.?ыА˜™юЭqщшUuч™њѕл‰=Чвe=5nЈ3Э›эXRя„ы}ЕькjяРЛДˆцхtЅчe]8=ЁЇ–щžЯеГ‡^FѕіЛ„цНœцЖєЖудЄ‚Цy%0љU^1РЗ ЕИпGпіf];$dw›kW’KGч_ЌsеєэТЖеЛx}qfка`^у—Ђcr>ФE‡ћjя•o.ЙЊЋs"&{{p„dя#Žшу‘6КЩTВIкŒvсъuQ/ЗdѕК(*њЦZO,ьиuЅEП—…D/лЇг˜шгЙЈжМкˆcёюbšчЦ mкBšЗyћъ™aЇжu)ЭЇ[qrк‰Я“­W]Е|Мв…—ћd>ъFЏЊcš7Oе1ЭKи<Hl^"џ›Ы‹Рd€Ÿ%ьwКў:њЖ7;шк!Й~u/Йzu\№2XчйQ:ЕхЋk›=zљЉ17]MqЩ9Iк}яВЮŒ7л##{š’НЋМ<БАуtЅЧЃьLŸTзmGnО>ѓfі$6_()0yTЯŽКtк\ЕџlЅы.њй^Ќк|љщЖЈФцхЋqЅ—ПYоŒш—ПiI[w zТЁо­žАyeЈŸnЖlэТЕ!oЗ=mѓFєЌХ+егЎђЗРфeЃК;lKZяШшЭъyћзЧzоцаЭИљ6ŸWbѓ2Шю:&Ћі^b3ѓЉнgдUwЩa•з˜œ8сы|Ÿ§u5ёCдІюКлбsVя4ЯYНл§ƒЊЛЃінBc’/n­1ЩпЂb€Ѕ~uwœP]yЭЩїЭ1бЕ=ѓ#TНVOП№ЕЅ;nХfѓЌе‰б;ЭsV'Fя6GFwŽ$6JєУя{ужl,эзuHtwЯ!Ѓшщг_Ч#`СЃN?›ЧенMЛ›з_/S‹Œоz)ЮыC–:Д:Ё<Гњўг1ЭЫŸжыUwЮQзжœd Q}ыЎ8ЃЎКKЋМцРфєц˜ъzžў jCwлЊ­шYЋ7›g­NŒоižГZє›$6JєгжК› §zЗЅjGРПŒG@}вЉqѕAбнU{“CЃз_Š3‹ŒV§Fйеw— нЗа˜ф‹‡ъю˜’ZоЈ~tgœPWн%‡•цЗЈРшЊЇъ€іZбнЕ%Бy-њч^sлšЕ…ўю‹žyHЃwšчЌ§.‘!бЃ{-U;6G!"zPнбДыuЂчхЋЈSу*В:Бyѓ“щМ›‡бнMћ>ІК;щ€ШшшъЛЫˆъхЉКЙцИ?Љ9ХlЊю€“ъGwЦUqбUyб]•W]нM{›#ЃGЭгWЃВgm_kžzХEПЫZjJєшNKгžЭIH­~аѓяКСi1џ„v?VЃCЋ'ЮŽŒўАЉюл˜Мd~сUwq ŠўŽН]ЅD/ЗЏБAЩаЏОt7œSПК;NЈМцЊМшЊМъzвнsФssDubєks@ѕ(zіьqѓфщббIГ§wћaюъѕК€шQоќбУъЗчАэ"Ž‹gqgєХjєдй‘е‘бЫ-0Ї93zY‰юЮк1ŠюnкwЋЬi^.Бз‹˜ц{ЩРчЋ/н чдЏюŽЊтЂы^wЬAUyеѕ б е/Э йЃшйЋЏ‘IнЗТ хОЫ‹‰~ь Љ^Щ‹ˆѕЭ=mрHТПЪиzO^Nч„њ•шЩГ#ЋoAбї_Тcšўs=\ъж C^WКГцАЇъЮ”џ%0€ПЅОt7œSПК;NЈ›ю”УЊђЊЋђЊыYwа2ЃЊЏ‘Aе5Šž={%zюъЛИъЇОŒъзО?ЩгGO8’0 /RіоЃМWј2јф‘>Œž>ћ71ЋњЎ0'zЙ Œi^о})ЭƒъЖ’џ)Бy L€<еpV§ъю8ЁюtЗU•X}Ёњ_Л&†GO_]ЃшйЋя cЊ ƒЂыљчЩЃЧ+;wsжAwљЏgнAGМDGt7ІU_ГЊoW1Э›/›р”њбqREfЋ~›шhеџF-w)еO9бOйKHєќ‹ћ *gџ]еƒюšƒъYwаa™еЁГєB|иќ-Бр/Њ/н чUbvЉ~›ШшхЛЛ;сˆZ:CЂ‡Ђ*0ЛnКSŽЋн5ЧeV/‘бwйн!ч$6ŸЉКряЈФYЎ ЬЎJЬЎŠьЎЬюФцх;Л;Ші.вDq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/10.voi0000664000175000017500000002470210654601742023255 0ustar michaelmichael‹10.niiьнOŽьXZЦa70`5GЈФ `L u‰ЂЋP5 `Ќ…l vСV˜|TDdЦлMC…?П‘Яsu•qSК?л'ўЛпLгoџ№г7gгЗПћёїпћ?ўю‡oћнП|їэгХOгŸNџ9§з/ѓёчбŸL~ўљЏ§јwюпџv§ѓ‹њјљ‡ў§7љЭwџєпџ§Oп§Б_ор‡јў›Ѕ_ўхЯІ?оsџљќќјйџќј{џіѓпЬџЯПјЋ_Ё€еDUu'lUgнлT`t‰оGEG'UGF‡ЯюM"Ѓ#ЯˆАЇ:ыЎиЄ*/КЃЋЋЃKєNтЃcЊEя%2:ўHьNй БљRнн№Y _FuWlRŸКC6ЈРш ŒЎРшНФц7ˆNЉ~ƒшjбЛН›ФцkuwЦFyу|’Yx№DulUК;6ЈЪ‹ЎЪЋЎРш ŒNlŽŒNlН›Фш*е;Н—ШшyuwޘФцЬЋщ‡ъю” вЋЛK6Il> LрЫЋ“юˆMъSwШИКгн2ЊЃ+0КЃKє>›#gtdtbѓ[LщŒъEtBudє›Ью !Ђw“иœyу’y‹јPнВAdє5Л;cЋФf€уЊ“юˆMъSwШИКгн2Ј*/КЃKє>цЭЂ_dбн4"0љ-:4:ЁzP9?2ХШ ІЬѓKцЫ”иZиќPнВEdє”и<]ВЛ€зЋ“юˆMъSwШИКгн2Ј*/КЃ+0zо,њEЭЂ_cйн]4 0љ=:4: z%:ГК;iDdtфЊ—y=yч2ЋюŽ=%6gFGnжLзъюŒ›O› YulTК;6Ј›ю”Qѕ ЛfLFW`єМ9!zб,њ5–ЭЂ_bЅ92К;щЙРфЬЕу]ЂUПLdєчMVXє…шНDFO‰Э‘бЩГ#*:Б9rFOЭ‘у<ЛЛјвъЂ;cƒКщNU•]•W]бѓц„шEs@єВYєKЌ4GEчœG:Б9rН{—шЬъюЂ!™еWЂї"z7‘бSbtоH'.г‘чЭ{Н№ˆŒœЩћЈГюŠ-ъЊЛdXх5зƒюš1]бѓц„ъeГш—Xi§ ­б)§&‡awб€ФъЬ+щnЁ‹ЊОIŒŽъДшKjTєgkdєд|ЭI=нcКCЖНƒšнПdHМ`šп)ЦˆŒŽЙ_LвдEwЦuе]2Ќ*.К*/КЃ+0zоQНlЮŒ>|ѕZГшHlŽœбЫшю !™е‘W™зxy"іcFмцEЦ™ЭцŒш“Чъц˜QЩб)Й2ъШшМ І iзyћ‰ŒN]ѓІФцщ3ЛЛиЂNК#6ЉOн!у*ЏЙ*/:Н9%К*ЏКцКƒ,šЊEя%3:№HLшМтЬцгŒžЋЇРKШЄфsэч‹о "чsdthuф­жy#>хWuче5з4$2њ=ЊЛs%6OЉ'˜А›Фfј•дEwЦuе]2ЌђšKѓ.в›SВkЎ;hФ":ЁzYн]4"2zQнн3$­љмд{rщ ‹žЮ™ISc:х~ўЬižnЁ9ЭГuЃЛfа;ЌаЂ_'2z–н3.2њ-Оюœѓ$Ђ:2к=тŽ"Ѓ3зМЬMШ)яFёCb3ЧUUн ›дЇюqUqбоœ­y]sнAЭЁенEC2ЋЇKiXєЧuRLє%ё35ЅљT™2ТСGруЋЃЫ)Нs?)bњ3Я†‘Wян4"Б9іь’И}P‰sde§8~udtцR§.чђю !‘б™Ї˜Ш=Ш)ђ›€“ШшГФf€ЗWі8њКъ.V•]yбЅy]яPНhЮЉŽ\ЇЇ‡!яNй"(њ.1Ѕљ6Ѓ?п6 \8VжЛюЂї­1е‹а„ълHM•sxfєсЋ#Ѓ3ЏёђŠ'б;z—#1ДКЛщ9бЛ‰ŒŽмЎI]­#7N3П ˜"ПsЙHlxї8њКъ.V]•]бšїQбѓfеЏsЊŒ‹ў}_˜§Pд6Ё›WЂВзЂ_-z/я}єъї‰юŽz*.ј$БymЄвчбў‡Ђш—‰ŒЮМXVw ‰ŒЮ<1F~p=%~Л№TмушыІ;eTU^tFW`tFПCsBєЂ9ДКЛhLZєЕ0(њ!1Єy~њNHЮ\:VЂ_Н}јъешЃW‹о‹шНˆоЫJяс›ѓ.JЯ–бщ‹щ1р‰Gbftцеiц@шBdtфn^цўtц7SдгƒФf€/ яqєuг2Њ*/КђЂЋђЂчЭ б‹fбЏБlˆŽщГАшkaRѓ}dFrмМ8‹\:VЂŸН}єjб{Y>xubГшнМEєљ“юЈЇ–c}јъЕщWq$fFЏVw7='z7‰Э™ЛІSцMљcuwЫ‘бгgwwЊтžG_7н)ЃЊђЂ+/К*/zоœНh§Ыц€шШ‘ўи|гœQљ(ђ(\‰>~іjєбЋEяхЂ^иќNбЏNl^Й;<~ѓ<њђQwдSkб‡Џ^™qеGbfєjuwгsoн]4"2zэ“ 2:uƒ)2:х№џіhїЊИвзMwЪЈЊИшЊМш Œž7'DпZsЂуœн]4 2њ&БyКdw7 ˜UFDЏ,ЧЯ^>zЕшНˆоЩzѓСЃ#GњЂ^иММЃЭ‹ўјЄ;ъЉХЌ‹ОНonzn19Њ—ѕъюІЇ›Sї›зN1 "Ѓ#ПМ8‰ŒўЬюЎ`І*юєuг2Њ*/КЃ+/КцКƒм•Gw Јytwа€ЧС ‰ž3Sšп%T?ЮтŒёz&­г‹ѓŠшНб{Н—ѕшƒW'6ПCєЧ'нQO-8,њіОЙщЙљмˆЈN<WЋЛ“МGtwаФцЬоiх!2zv–Щ‘и №ф=ОЎКK†UхEWVGFŸœccЂя+sšяB“š3RЏ›чgСˆќй@gŒњctШ\љЌL:ЙдЊюЊ'Dя%<њў]wеѓб ‹>ЧІtфœ§Z‘бѓъŒ[—Х‡Eпо77=7цˆъћш˜#qmщNиМˆююКgZјЫYb3Рї8њКъ.V•]‰бзщ}ЮНћqxѕПМ;ЊД™|wјMwыЦѕmoЯЧшŒ1_i>~ѕCtЪєЎ5нQOЌ6‹~EnbtфH‹~б{Н—ФцѕъюІЇНqбSф]@ꝘП>ЖйдШˆ^. нAC›чен5Ѓ"Ѓп КЛeƒФц“Фf€Џ яaєѕЁЛcƒЯтЄшл(ЧEwWl•жx^›“ЂЋюЋCкяЃSFќa SцЩJѓсЃkMwд3ЂwВШMŒŽiбЏ"z/ЂїНZннєд;D‡l2-šЊчХQеw/cЂoЏ"Ђ— HwаФцyuwЭЈ7ЈюŽ—и<%­в›О‚И‡бзYwХ&ЅyЭмœ]uW^sнAЭе+ЭЂ_a­Yє+ˆоЩjГшНб{‰ŒŽ\Ї#Џ—о#z hžWO#9?юїirЂoAЭ‘[++H„ШшљК—"2zJlž"7ж/›8 њEwУFUyбšї]ŸКC6ЈGн9CjЎ;hРЂ93њје+ЭЂ_a­Yє+ˆоKbєjГшИUEOСбYгу}ЂЛ›žJl~‹{€)#:zЈg/юZ4вЫ вн3&2zО„„ˆŒž›ЇЬ­г)uc~-UеАUuWlRšwз\КkЦTхUЯ›3ЃЊ—ЭЂ_bЅYє+Ќ5GFw7=%z/ЂїrэŒŒžђЂ+2:qNgEG^MgоЗ7gFTџl§гнєя>ЃYє{ˆ^%:њјѓ7ЌoNtф9§!бнAS›#?jOџ=H ?&чT?Q3ЙЃ7cXєЗŸ"ЃЗœЛИЋл_˜КщnИЈ4/QЛю”Yuа]3Ї*А:1њмQ§ГYє[$6JtwббЋˆ^eHiЃsОъМднA3ішœ‘ўБЛsцVК;fZв Пфšз<чЬћ–w~œŽНю˜i‘бcvwЩ%‘бi‡Р:еp]Х5We6U'ЅзЈ;fRU^u‰^умQ§ГYє{|FГшїНЪ^šг<ІЦ4ouЊюю™s˜ŠцУRЧ8ьФю˜iУLwЇЬ œŽэQнqY`ђ(kЩ‡;Б;eкјњбн2яžz3ІиiЇєЊ›ю†ЋЊюеIэuа]3ЇЃKєчцˆjб‹ќl§‰ЭЙбЯgTtэП‚ЂПKsšЧѕiЮšх—Ќsу!ьДЛ‹ŒЮœъФцЈzP[^ѓсЄ;х‚Шшэu‘w‡\T‰б[h4№съцўш.™W{tLu=ЂŸЯ5.tTєыGFtЇ#*њЅЛgЦЙYєЛˆ^%4њљ Š~IŠоKsš‡БШi>nФю˜Y‰ЭЁе‘б›шe›Г.У]`ђЖП6№?WнПPU§ШЊ~ЦVPѕ+56:ЄКЦщHŠtчL)б‹$FŸ›EПЭxFЧD?…5яЏK1бЏБj>юФю˜Y‰Э‡ъю”y–z™Шшьл0+:ъ6&№ŸЋъ.ИЎ*ДК;сЊЊЌЅ~ІfEзѓ™S§jMzŒsвTзQwЮб‹дDwчLŠŒ~H‹ОЇfE?bѓšѓ†#0zНŒшe"ЃЗШшАЋe—и [Uu'\UпК+ЎЉФш-ЏЙђЂїЩЪ~ЭsаZзЈ;f–шEJє"‘б‘3§}okЮŽШшMє2‘б[dtм)}ѕйЌWUн WеЗюŠ‹4/‘8U]Лю”yщб9е‰б•:д_›у.ђЬсНLdtц{žoЅФf€Sе]pYi^Ђ*ЏКЃ›бYеUе•X-zШшаSo l\шЬ‘ŽŒN-ѓн4ѓ+р&2јƒUu\Wб•V]XU9[ntwФeб‘г‘Иа[цгMd4№Њ;рЊЋЃЋЋE/“н№ ‘б‘З аь/g‘Шpq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/lesions/1.voi0000664000175000017500000004202610654601736023177 0ustar michaelmichael‹1.niiьнQŽ4Kzзс4ц‚p;ї€ сmp3Ш#,„gа˜Ажт иРь‚%Аn’гнU•™‘YUЧчtМџožЧžѓuU[ђя‹y32ЛњHёџjYўіўє›OЫoџюџћпў—?ўн~ћЗПћяПћэ–/ZўzљпЫџљщ?uћŸeљџўіЭхџўѕ?[ўХчWяэџгњЧППџх_оўќ‡џіїПљзПљн§ЯПџOњнйџёў№Ч?ќў7НŸОѓЯ—ѓž§ћџыЯЧїўпŸџwџѓЯџспўЛуџЯѕo~r€zжu№ІѕnvШл2ГƒЋgGМ-БyIl^›Ё9Ц‘бp)ђ6Z ?гњevЦ[жЭь”wdU?"ƒВї‰9бћЏSЂ›—ФцЯъй яKlЙД‘W^fudtцоМFnЮ‘+ЙдЁOзжOГ+оГ>Ь.yЧ™T§(МїT?{šзцeDs^єв&4w›Л•в’yzхЉўї“FЪƒнQptXubstѕьј ВЎыь„Ÿa§4Лтm™йеmс=ш+_=Ь+о]}FFг№—ˆŒю%6ѓыЩл?2wНаъђ# u5ЙzvЦ›"ЋE›ШшŸэЃјх­fGМm]#ЛCВ›Т5!Лы ЈхUц>Щ+н|КW4.ˆŒ^Rям?uЯј‹‘9‰Sy-Fn{‘›udДъя“­њ$6‡оћ*YПЬЮxWLі!qЭШnЊ}х{X—амч%DЋ'дМfн;~cVвSыzZ]зšX§щ–Tќ)i‰BЃЃцљKкUј)nяјm>ОOdudtfuо#г‡фъйoŠŒ} Б€ЪњavФлж›й/й*з”ю61!ЛЌ_}ялWVЏ^ЯЃчE=БоžXum=‰оo(еЌ­йA/шšEџ:њц€шћ.—}“иМ„f‡ѕ—Д‹ёCжr ‹UЯMzj Šо§m›Г>ђИ‹ŽŽЌžёІФцўуБ ‰ЭŒ­_fgМi}˜]ђŠ­2&ЛKЌŸ=*ЌОкы^ѓюФЌKыEєФЌKыIt?чuЌЇбuЕЭе‰б}s@ѕ­2*њ™Н=rDE?DVg ШMиђ%mпћ”§ШЫŠWOzbпНьыbЂї›г>єИIlЮŽžнёžШшкvœJl>оmИ[ПЬЮxнК3ЛхEЗа]uљђmuЗU.ОрУ‘(>'ыбсэ™]WжжіўдЎ+]ѓ6оsУ.Œš /ёЇAя­Кnљx‘‹/іcU›Щ(œМ-iЮ<яч ЈzЗНхDя†7)њ!jЉя‚ю-›~З=К‹WЏkfєIѕЬЊkЧМшцЇ“ŒцFxєь’wDGЯюxKrєьŒ7EF/‰Эпa§Щь†wЌ7Г;оUћiИТЕџЛЙX›їчН`=8|gVв3kgvбs}ѓ­КpќЈљ3ЛђŠŸD—“mYsЂЗю8б‡ъЅtє>э8u›OЂяеУ.эгЪ_€Ушђе›€ЭЎ—АEЗ2n,­ ъ­.&z_}R=3ык1/2:хўвфeD7?og4З’ЃggМGєЗIl§}“р/зњavФ[т‚ЯЙєпb]лшЏ•=xМ5ЙъвкzМ;9ьB睘ŒКбƒцмnШ+94ŽЅž§4ЄD/МŒш}Y;ЯбЫVZ:z=‰м! 9–эзЗnsћpqЌž”є‚CZхQ>U|л иЂ{ 7–NNє`Ÿ._}Ш ‰^/ЂЇ†]iђ‚ЂлзеЃЛGŒ„цю“ŒшіCЄˆц–шя]ћSš3ЙбГ#о]ћуBЌ;Г[^ѓ(Э‰о‡>ЊkЇGb‘ЪбЭ ' іzjvйЙѓцКеWЭUЃo\Tє#--zћ*#z Œ>”mЅбЧWŸoTŽnУЖвКЭЫў:|МмWЯЪzЂ)лZ 7/Эsмn,ъ&Зv;Шь”—UпЂ‡ЪпXюuљъ}_HєБ/+КyнОЎнМtu б]uDєуЃЛgF=Г>ъЏыG ^rЂ—nЏžѓОршйяŠžн№У \саЙˆŒ€Цz7;фUkkvаS]q§ъ]eLіz=;ьмp2ŠG_4—ОjЎ=МќŠG?в‚ЂweЂM‡ВФцсRЯЌ;б„mЅ…›#§xЙпЇ…]jЪЖдЪбKSж,ѕЄЈ7dvЭ‹Šя'вЃ+Wџwr‡™YuЉэЋ~?ќац­Aбэывб}\§цУoнНQ;њёШДЕзoЌl@єзЇE/gбsЋžŽЧмЄ n03s^3ИСLЌyQџгЫЌ’Ÿ+Бљѓa•_YтNsЪMхhM\ъ™еQвЮя^fчМ`™um˜\;њ$Йtѕysйш‹фВб—ЭEЃoe‰Эgе“ыЦve‘бЃъЉmge!бk~є zbлЉЖь‘Z9К}vоR+G/MYFєв”5е“ЂžD—О{YЭУ›љмЄgЖТŒц60ЁКЫ ˆд•Ц%Eo‘бMdэц“›IѕшбfQ|:>.є2и,ЂЛqHh^кЬЈшуЫ‰9ЏYЛљЌ’7dTЖD›Шш/ЛF#dƒ>JŒ~|ђ8;фgШЌў­{Гc^Віf'=3HЎž}’\9њ4ЙpєEsеъЫфЂбЗАФцЈнcзгМVЯl;ГF7aЂ5?Bє z^лЙ“шЅrѓqЫ[еЛ/j:–LЧЇШш›сШфІk[`Hѓ}ГИПJˆnњЂћКњеЃЖ”шѕіѕёЭъбЧЦкЭgлrэшх2zfиЅШшбfQ|:–ЋшЉYODFї;\@ѓ`†ы'w?seHl­ŽŒЮЌ^ЗЧвЙ!oйџ,>9хMѕŸ9Ѓ?{уЊПDF/‰ЭРlЁ;Чšѕа№,э|цЕ5;шЉЎИ~і8Йvѕisнъ‹фВб—ЭEЃ?ЛТЂяYIб[VTѓКџ:!њнt‰ўеДY?HєДДs]XBtWН4н!ЭЧСŽ‰^жЯџН}§щV˜Н†DпЇяЏ2š?ыВЂЛИ€ъGмжX>zД/GFяп[wbН”n>л–“Ѓg†]ћСЂgV=s=ГщЙqєЬЂдо•OФHlо?M‰]ъМъШшЧT'жчmзхŸH‡rяŒqе"Ѓ3o09Ю™[^fѕ’КQќS|ш˜tхк›єФ ИzѕIrщъѓцВеWЩUЃ?ГТЂяYIб[UNєО*%z ŒnЊDџZКЊœшыЅžWwІЫJˆўк=ж‹НzfмЉі‰?ЁљCdє’§ё 7~lšіЬЃ0,њёEPєу‹„цѕъі2+ъ‰[лж=XиђбЭзUOЮF/‘бKэшГЭЂtѓй^QКљlЏ(=о+j'ŸmpЕ›ЫopcСбГ+о”и\ЋЪ]ъИъШшЬЉ>ќЖhnЩ?ВLnyOю1,:rЅ??b‡Mт\DsрОБЄnд™7r€Ђ§yއ;ЎыўјЬˆ#)зГЛ.œ%WЎОh.\}е=Лlhw}LtГЩэZыVяЃRVz ŒnЊ"Ѓ‡егтNtUбƒЌњбЏUOЋ;ѓUЕOЋпќЕMтš?oтWбSлЎ\DOэКv1г3ГоНŽQчF=‘7дВЂПкNіЉeчКЦ€Ѕ\wхЃзAєН{{jм™“шТ?‰8Ль*7ŸЯoсц‹‹Ўlђ‡к;Х‰тћл˜шя’жћ)2:ф—o K§mr—zvУћ’Ѓч$їЮ(њ[Єѕ~Ij~ьГCоБо?;фm‰ЭЂПSh6PЪvŒmЪыбьЄ'жБйYWN’KWŸ7ŽŽ\щeНпJЪЙg VИlѕVu]АzеFWъcTЦЅИFwUAбзеѓђЦeѕЃ—О- њ•ъЉ}cOЃЇж;Ц%8П'FН%b8Z#нŠЮЛ/іМЉ]кЦ„шОБ|usйѕе“ћFкц~ЎЇцEз§љ№У(КіOтЫјІНnе3г.œLЦФЂDFŸTO zEэ=љDё;ЩXpєьŠwхFЇUЇЭѓбп&2:сiЃЗ*ЭЩя~6œмѓВGnPѕЖФ9Эћ/Ѕ9*іЫ}”gwМуs,’&љ!Б96:А:mїиЄvР‹ТNJ\fчМрqZpLї-Б‹.œН&FЊgЗ]ЬEхц§љш)бЌQnбъ]е`‰kЎѕ!jИаѕЂ›ЊˆЉюЊ‚ЂŸЌѕФРAX§шeV?њЅъЉC‘бЧGЅуe›?мвю ЩЫ§ёc8Ћо’]Лњlћ˜uэPбм6о7РЪбнТŒЧ Бzєкшо›7д6?~˜ ‹nџ,hМаЛ%ЏЈƒКcБщg7(К]ъ‰IЯ vЗЈшCѕЬІчкнуіодІЇњMЏО]jPі.4,zmП,.h(v"Ћ#ЃƒFyЏє˜ѓЊvгЫШ§ўsnбЋ­Aб[jZєу‹„ш§ЯБ)Щ‡‹/"yћtцўrnЮ2fЂ‘иœrљuBГ3‡^vњnsdpDљGa_]:ћpФqFі–}Y=ЛэмVбм6оfЯ­лЊFaецuџu“[ÜȘmtЭЕ^ЏЂ‹H—=шЊНєeб/UO ъъЂ_Јž8є(;‰ž[wbknBЪ&юдљб•Ћз§ƒSBtїЁAVєЈzjй….ё10ЭƒMonл‰у^ёѕр?x$)emЃЛ7ъiŒшйCЃ‘ЎмћЅ-LhюЂћ7 ъ6(К{^šѕЬ`Зˆ‹оЊg‡]щwъ”шэЋ­znжЕ>КvяЇіњ‹ˆоvИ ц„my ВКЮј ь›sћбим#tїѓЭ~=;чнMfvа †Я Ѕэ;Cšз^BёвDG,ѓ—И…ўto Zш%ѓЦВdоУ—ДйиЫ-р%“ИЖf=бя~‹ЎмнНЛEWЭюЮБݘ‘}]LєUѕмАЁІtџuсці$њуЋŠбћЊnз(}Ьъ.Р’еэZvћ†ш_H—•НДaбЏTOэkъТЂOžM G/[cBѓ#њlЊЇЦ ŽочDЗлЧвTOm;5(Ќ=HŒŒўzk)нL№–ЛюЌЉЅн+жЕ}ЇžЖБ3;pрisХшgеГѓЦšYNиэњŸ+tАi ƒšK=ЏщЙ§Ъ~ ˜мuiА_фEЏ KнЌoТŽЗ{’ Šоф‚šЯ­UY{ље/ўАЏžнђВ”Х=:F‡ќv™Ac=о@&G=ѓ‹кfч›ѓŠ{gPєрbœ\єд>3$z nNљYыІkNˆŽњ`'ГњCdє‡шъй”zJbdtwXzнєCйqЁы.ј:Њ}Ћ”&mїВpєi[Эыqwиxї­Њ{Ш~vзі;u›зн—ч/ 9dЕЇ­nВ’Ђ›—?FѕФОЁ“‹Џtswњ|XєёdїшхДzvbяvЏ h~DŸNѕмМБ>/2zЉн§HиМU?zT=5юTS§™§H‹nжНžѕ‰й}#Яš#Ѓgї mУ›гМћб%&ЙљyЋ]ёЉeКМђХЫё‡Фу˜ЬэКДKl.ЩйeкшњНьЃcіŽ§‡y9;оrб\:њёEJѓХJOЛtO J>~ZSНuГ­ljtЦt,ЛЙˆ›ъЅп?fw];љ!`vж+’ю.ћ! йџ‘A+НІECš—Фцс=qvв+ œ}Xт˜ЅоЫбМ$ш\ЧЛАƒlя›—v@ЪЦЗaћ….ЛфWa…ЃЯЫЪFŸW—М"яIуЖšлШn“шуŠn}‡­­ЭЋ™мœќy8њr˜˜Šбkнœа\Йњ№b`fрШ1*)њйZЯ iЪ"šзоКŒЋg7vКК€цўч”ШшЖznои /ЋК' zœ=ЕюDЛЌыёЙЃftГЌїЮэя0ЛohyT'EGGHєГцФшйycЧ /,:фЉєЫ>Ў žšvЎKhо§иїьВ MtР2/WтьВ WЛЧьЖSW;оьЖSл~=hŽŒž\vЁ/-ŸМ„мЗ[Чž]ѓЊуXЬЎyQ3Ы!“2кэЊУіщЛјшћыйMOccVњўgШxьcf:Бљфі2;ъЉckFѓв§{бБб™еГо p“sЌуAbѓAh}йьЫЎКбaUЃ/У GŸ”­%gz;“yјн’ЛпКvеысЛ5›wgю6_m>œЃК?Н{ћЊ|єК<Ю•~|ЗxєёьКb7QqбCЛCЂЗЖ„цЅЋћQЂg7vњКШшЖznпи яˆЎXнцŒє+ѕьТ‘cр ~vрHПДЗдЪбЇvЂišПЩ=-2њі“WPє§fИ$мФ—єшqўД_hбПІѓшТйЭuЋзн.}ћ#ЈљОвQЭЃMЃzr=Лч5Чѕ ‹˜Š[lаuИ\ќь2;ьRfѕYїьЊ'њж€шўггш%фg­VPєйЧщХЃ‡?йЮЮzцš‘м LоRDєЗ‰ŒјqDž)—y^сs/ЛъF?Ž…}ѓ[[^Ж‹ю ЋFoеƒЎНU7яз‹юWxYЕymП\я•lюЂїo–>T?NgоО]ЎњиtOмџн›8ђˆzќ3&z‹KhюЂ‡еГ#[}]§цЅЏk‚3Ђ‹_ЭсњлПWОzћ#aЂ—УR?^fDЏбЋ›О]iсшІz№˜8r]yЁЯэ*G?i.}б>Лoш^НœЌјьОЁ}є’§ѕgиxdдоьG:?КrіEtнъ‹цКеWЭuЃПўе|=ЙьBPъ&7њёEHtћБџфšЧЃ|ўЩ&]Лњ,:ГzvзЕAl§шё‡ы“›žы&#!:ьЇ€‡Ац“O˜fg=б\ ЩИр‰ЭЉ+˜ Њ?A.рTЙAb§У№F……мŸїyіЭjŽЇ”іп§і WlЉЃъЂбMuїЭoяyЩzQ]іB<­.yя4ыŠЭЫqQ_<оЎнBџEЩшСпў,zЖє(zэyЏe—y{pТ{›6(.зМtuqбн;%7МQt71ѕмв‰хЋїрэЯбъгGзО?m›Ц§UHєсц’§ь^Ью;VgЌtГWd4?‰ŽЈ˜н7в]AбЫЩxд~мСгЂOЧdvрШ-,jЄЏWИhѓХю1ЛьТzіЈTЙњ"КnѕщtTЎ>_чТбŸ›ЛЯlЊ'ї#=ЛшЛЅM‹оeЯzЩЃ3'љK?ѕџ§Dз_ѕГ[KщъШшбУtљцГЁžлє\SБвi?мFnƒYЂ~ѓбэRŒj.ќoџ\ˆŒЮЌNЛВѕ‡Ше?Vnpўdэ#)wЧwЗп)›}ыіY4њ‘zВжп_є‚уёЦAбчеEЃЏЋKGwе9Ÿ•ѕЬn}ћ„'5й&ЄfѓЈz–’Ї4›šжЊGKЏУъ5!zЗ_,євЦ^EDwе5ЏУnЅћ)hАЂѕЋяiлBT7бЭЖQ4zй­№’§ЙФлЋшсжQ5јУ13a™?23Іу:Кluлй™8ђ4Кbѕ:|­НнCЂwYЃћxЩцуSGLєr[Лљt…Ћ6/ы№™Дь9.œ}]ЖњdЂkGјЁЂgw]Kj§0x\šємр!ovвsїШЈшВПЛК6^ръK>ŒњƒђCн[JGпїїЙх›зb§…|№жМ&l†Эб‡ећМ”цЃашй?Cht`uк8„ы‘ЋЎмш,ЧвЧсэNяОU4{|mпX3њxшю`D&4=З…6Їйоо›˜vnПМЭёСKэшQѕэѕФД е7Нcшўы§lOЫл5[ШgmЭц'еUЃћъ„шіњ§F]8zЗ%я^mюя$Ѓs{§шіеSGƒАНU3іnПОЛїjWЗбЅgљn?ћишЅйя*;ЉЎн=М›Јў5*зЕЩ.к~ˆ\GfЄFїаб—йГ v?ƒŸ”OЭ;TЅD?ъй}C'бЕŸѕњ[сЁzvоаz]ДїгEtнъѕtЋЋ\}ЕuЬ.Ли7б_вz—сувьЈg†yГЃžwL‹.Оа[оьДSWћєьЖsЃ‘Y=;э\bsо@Jl^†йГ“.5ŸF4Ÿ=0-uЋелжЙє‚ŸŒCё)Mqљб>йЇK7/йГУ^sMjОгќ=“#зЙќOс#aћнцяќ!Б93 з№ˆСъGЫOF,\§‘6:8Г№їВЄуŽЗЎѕ~жнПNˆnњЪЧљeXЗyg—§tщDнпz^Ъmž]ё–РфШцШyЎ_ Žž]ёžФ…Ž ўи А‰;“mx\_эЃхNЮ Ў| оХYЧUЃ…!е}сэ‹ЪбƒъЏm$'њžЛдО/ьn ›—ѕЂЗЂУJ—Ž>$uбEЇЃ­кЯtйшгџў+7/Їi•ЃЛъ~ЈgжшЖчЮьТmgЛНJˆўВю11еї?“šwOw)бУЉЈМœЮrVєюэЉ]—ЦSQw>>КN†Йlt™p)/ЛДшSГ ЎжИnєч?ТЂя"ЃЯЋg‡Йœыйq'FЁе›‡б‰бх›уЦљcЃў‘–94zvк…[_RђљRЯюК’8бCW}НХхDяѓТЂгf:Бy9 žнѕž„•niўyХKбёрRе[т™Шё(ќ € i+НћYqvЪ{“ЋџБOф$78tЗјп №ирѓЃŽЫFїЇEkЋ+/ѕИzЉ§H:ЏžX7vм“GS]/њ№пўўтлВЫ5ŸД[{Ы; ЋНœДэіŽ€ш~У+]}xQ|>ОŒšЯОšvйЋѕб~ЫŸт}5гГлЮŒ/@бП‚aЈш_Сp(ъFf=ў2г[ZXtмюqп”ш›Шш‹ъйeђЂЛЮњЭУХЭ‹˜ŽФцШM:093:Бљё)ARsр­p ШяЌžvъ^зЙаaЭЫй‡ЅХЃoŽЙеWz$Џ9`Є[ —a#bыxx\„)СR6шƒœћЪfПKЧDяіЙ шаЉ^П[žнёЖМb€ЭўМŒ3хЦ‡№V6,ЎНЏ l)Ž‘б;ЧЇ6Зnє>ь+v[уВеkS}ћу№g5убнцЃdїИk? ЃGећЗjVп з§Ћъб-cщЯюЮи­›ШŒ{ЬЁ1цЦ8˜ТЭЛЎ7;юФImщц6КxЊhИИеЃ‡ехЃћЉЎн|ЙqўZеЋъй…э'4/эV‘Q§%БYєwшnлЯxуХ-}§ˆ—=ЛюLbѓyєьА ‰ыќљє‘ж|{dЪjŽщи™о*#Ћ3з:%њkЎ}vg)нМ,§'вЗ}dnжЯ=;сMе/УNРжБйЎПАцGoDђрЗЕBn…ръИћJрBLHwJт№рркgg4VЙxѓ8ЙxєвŽEDєђyxm^t[=ЎžZtnыъЊЫFяЛкъЊѓб\m_ЏеЛ›ЎСZЌ,u3жеЃ›z­Кдƒц§hзŒоћ ЌћЬЈgwФњбЫЁВЛзTЕ-пМп6њЇНйu'КШМшЕyorмЉЕЯЎ}њCbбшnšяњQЭOWzrоPфtмќPЭЂAЃЮъеуХ‹˜ФцgеГыЮФ~œ^=z9YьйQЯЅEŸ=›ЮюКД‹ЬЩоGЦT7•yб‘+]іїD_ПЋ8ЬідЌŸЃіBŸmN‹ЎОwДіЛ‡ =њс˜›бМ4П%šѓ†ЈйиDF/‘б_?œЯn МД4уJ_†ЧŽЯNzІ_ф„ъqіьЈЇ{нљжZ?zАДе“GяnoЭ,zСhŒЋF7гpЌ.Кдэ8ЋЋю§ЅP}}Јžдvъb>Жg‰}C}ѓёUЩшСоQ?К­Юˆ>VgŒЧн­Г|єЃl}М,пм§4›н™]w".Кл+2Ђћ)ЎоќcFЯюJlў’иœ}qV­d–.nѕъЋйHžw"Б9rПћ§§ъbvг  Ÿ@ЯоЦT7}б'ПЦЊ=~ЗrєXhГшяиœ]}“ОЛefмYюТž—О$6Hl^њ_€†Hl^"wшЅюП@)q;vч~–—Џ>iЎ§ueXѕ=БљГtєЈ1'zmоšиєЬhˆkWЯ,zХ њыXь™Qc§ ЂkNѕрЪЋ_}Но˜дvЊй-vбћM1ƒцуЋŠбЫ`8š—ЃwN.УкбЧЪ•ОЙe–>лјЊ7_˜7єЄYє/хYsешЫ№й}CЗЈшѕЩJЯю‹›ч‰Э—еГг.4Ё еƒХ-_}y†FзЌNl^.Вk.ЖЪ7‰ЭуъйMO%68цЦdї >ЛчU‘б7‘бQSН mŽ‹ŽщФцШш”щ8мОcšяс‰ЭЫ№Г„џПНЛнU[WЃ0ъћПiŸBјp'РQ‹=йcTкeёыЉѕЦЮ‚-%0ЙLћmјK‰ЭSўo)№—Є=#1яСŸ—Ц§3VЇю^#ЃУЊmэфбнu{Ѕћг0wѓЊК}o`б;:еѓG—fЧ{О5iљj6k=э–W{е›7Ц”ЋgбГ.ѕО№yЊL]:бe{˜Ьыы,єњЇЃŸŽ&zъшэn1џJЏwЙRюFІвПšЎы;ož3њEѓ”бЏš#ЃGїu%6GnчбЃу&—_ЈŽИэ(ћ›ч€ъг qвшЮLЬЙв§{ще‡"SŠZф›ЌЩX„ѓ]bѓХК6Џ;kЕs>ыˆŒ.“~qёBтBЇ6ЇEG^†‘б)#н)50:щdIlЮНэHlјŠ{юч%2ыЋЗТ§“agЮОїm{чnЊŸяŒ:q8 SGПzі™юU__Oм\жС~М52ш-ѕОВэR—Щ—КєЂчъ‹mѕМбЯЂ{сю ЃwыњHxЅЃ{[їdNšчоoдaбuѓЦрВ#gУй,њя9ož3:БYєз$6Gnв‘ЗJgеЃЫЮЌ2ЋKчжiN™S}м=КыР}НЯŽј`l[=:чЅФЩћЊх!БљЊЩ O]юШш2ѓгЏF'.tlГш/ˆŠ^34хMэ™w;}}“и @ŠЌЧ~^+WЯ*>ќЖДu[=sіc6У1tНПlпєЪС#wo2Њъ…ўƒ‚gпCzб_7КL<вWї-Ў}Ѓ”йwъэ(DŒGзсЬбmуцhvЈnDFїЗюЩDFяЮ—Ац[шмбѕt6&Žl~Q=:юHbtфx$6GFGNGц˜\NЊG‡ZUЦUЗЏЇ>œб]ЇЃУ/ХgюќбћъбAя‰ЌЮ‹^<“бМxжц4oОwI Яы›Шш2џWDGЃ:09ВYє?зтaбѕ~ы4Кц™ЇaIl.qУ@ ˜'h6uП<і3сйŸЭ“w›ЧйNн6Ѕ енwПŸђ–ўc‚я#2Њъ…кЋžўyЧшЧў1mєуЬФчў1ДымЃКљЙLП{lЦуyМЬ\Н™ъцкœ6КЎEFoџ sŠŒ>ЋvьЧЂG—ѕЮѓЌб/ЊGзHl>Џнv(1:rWкunze5)бЅЗyŒ.zOdtР†бгDе‡NHд­ЧZbsц%и˜<љ—‡›гЂѓNУЋЧнTѕ#{tЧ‡в–ўНАЇ~^ѕМё&2Є{]Иќ0}іЊяўjюшvjy<ыxъЅЎ›шаќŒЎлw&Ž.лТћы™›ЛбэпSкNCг‰]vBєЗˆўšШшШгŸŠu.Бљ ztд›/"Ѓ3ЋCЃKШЏтšёћaЃ-M‰^EDєіœ>КЌ„5ЯЛˆŒю~*6ПФц‡Шшљ7КЎФf`ЄіHњК5:шЅ]qBїAtfѕшЌsПг}yotеЙю"OОвнрйчc?Ш‰бЭ‡GЫЬб‰ЭЂПGєз$6—]kBєюxIhюЮЧшІ—"ЃПˆŒоVЮyзTŽљDdtЙwЎјTLє*3$z3ЪЭ%mзH< нu|MbsЙяЫaб7‰Э)G РџЏЖFЧМЅюNzЉгYимнєв>xўшЮ*FЬЧЖ41:oЅ#Ч#%њ yюшШ•Žмё~рЮ#c—.Mѕу‘5яJ™‰•е,ЧФЇ]† б_Z]к№б%Ÿ‰Œ.‘б%2:чH\н#ЅD'^i{]фў 7xЃkоНьwiЭ7‰ЭЊawЏWЗП2ЪkЧшІ—zбгWџLєшІз~!:bы ŸщцЇбQЏЌЂѓV:rЮk$6УNтІ‘xЌ$žрсЗЃ;`ˆzu{1:ц=ugtб~#ztа[.iЭЋшб-я[ЂŸ?Lyлz}CжЛЭŒ™’gfаdџЦF{МФ5пЏХАшЛШhшIхДнnЁњ{"ЃCЋSЯУШh€Єюt‰бЁK Љ‹ххш˜їд‡лыбAoЙtжхП1ЭЅŒ”ф?rJKаˆ<Ф\‹MfЮR7FїМ%Б93КDF—z;ЃЂя›с‡дФ;дмн..:Д:ѕhIl€,ЕŽ.јLНнё‘ЅxiЮ)[фEb3œkІ:gяkvъИшZЃkRєrРмšsЂя›аWџн№™Кё™Фцkѕш„ЯEFџЩ[тІРK]ŒЮјD}]ђ‰шшбŸ L.зъб џ-ѕbtФ‡ъншO$6?ЊGg|(ЏоQЃ3>”и Рџс!@9Кq{lmricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/fmrir.ini0000664000175000017500000000047010320276614022452 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=0 Trilinear=0 OverlayFromBGSurface=1 ShowCutout=0 FlipLR=0 [INT] BGNearClip=0 OverlayNearClip=0 Azimuth=80 Elevation=45 BGSurface=51 OverlaySurface=1 BGDepth=8 OverlayDepth=12 CutoutLo1=90 CutoutHi1=181 CutoutLo2=108 CutoutHi2=217 CutoutLo3=90 CutoutHi3=181 mricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/fmri3r.ini0000664000175000017500000000046710321220320022523 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=1 Trilinear=1 OverlayFromBGSurface=1 ShowCutout=0 FlipLR=0 [INT] BGNearClip=0 OverlayNearClip=0 Azimuth=80 Elevation=45 BGSurface=25 OverlaySurface=1 BGDepth=8 OverlayDepth=8 CutoutLo1=90 CutoutHi1=181 CutoutLo2=118 CutoutHi2=217 CutoutLo3=90 CutoutHi3=181 mricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/fmri2r.ini0000664000175000017500000000053610403564716022544 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=1 Trilinear=1 OverlayFromBGSurface=0 ShowCutout=0 FlipLR=0 [INT] BGNearClip=0 OverlayNearClip=0 Azimuth=110 Elevation=45 BGSurface=25 OverlaySurface=1 BGDepth=8 OverlayDepth=8 CutoutLo1=90 CutoutHi1=181 CutoutLo2=118 CutoutHi2=217 CutoutLo3=90 CutoutHi3=181 OverlayFromBGSurface=0 CutoutBias=4 mricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/cutr.ini0000664000175000017500000000050710403407354022310 0ustar michaelmichael[BOOL] SmoothBG=1 SmoothOverlay=1 Trilinear=1 OverlayFromBGSurface=1 ShowCutout=1 FlipLR=0 [INT] BGNearClip=0 OverlayNearClip=0 Azimuth=110 Elevation=45 BGSurface=25 OverlaySurface=1 BGDepth=12 OverlayDepth=8 CutoutLo1=96 CutoutHi1=181 CutoutLo2=118 CutoutHi2=217 CutoutLo3=87 CutoutHi3=181 CutoutBias=3 mricron-0.20120505.1~dfsg.1.orig/dcm2nii/example/attention.nii.gz0000664000175000017500000000743310403565504023766 0ustar michaelmichael‹CыDattention.niiэнй#ер"‰ЂќѓžEЩC$i—ЫхZmW•э*ЗЗђОєцоІ—Ё;3=4Г™a a™Q„ HQ"%R$Є(QЄHМч-/y&^КЇэі­[ukІi~KЛmпЎВнїд9їмйћ8ЎКм;3Фѕъg‹‹Е^Ћ^ыmTjѓ+=nЄЧ}“ћїw?wпС_“ОС}gјuї!Ž{јсЃп{'ђэ…П[z?џгёG??јj$д-ѓмїы­юJ­WЋўфЬъ™Яќ№ў?№РїЮtњ7рю–o|œчёsœџЁ?™МяГO&ŸЇŒ}?2џнм­“€ЛAфCŒQѕhЈƒ…8QbЄЛудAq‰xЗHЄ ФЛщ/•xrpчfяѕ Рщ&Щ!Т“dЮЁ$5k$и1™"Ф"~'-оХEQТŒBˆt‡їњрД‹„ЂЄuЏ`„їќyjsЅ"“вН#Ћ|еіxD&g~†Dr‚Їъ!^nЈЈЁРW“цѕР0l‰C!й4 тƒЇ ЙиLwЫž™—„ыU)•Ў:žёFЬ+R“M‹9Ё% {= ЊS"5Š05„Ї{Mкё\ŒCтg•T’tџшфUђ hКж№ŒМ<ƒ­Нэ’~5˜аЋ ФаŠіЂЄъ|бћє<sы9Џд”7Еe2щЧwеƒ€G‘лˆO'ѓє> QЫuHƒшUf‰)Љ%p’UЮГжШёхr.У8†‹fЬЙ$€ЏіЄAŸь‰P&оQіI9Џ Qrw9rGЗУ5K'няdhЭтЊFˆOЄ’wмш Є\ŽFсDтљQi‚ШœZ˜ЮdjNЦЂЁšЎХ=FХJ Z\sˆ/+“ЁtKEbšЃЕЬvМЪэ(cше}^BДZ€€QЊХЧеa—hЬВ'Л’Х{ЊFЈу':‹О нО’b%™H2oБm{†yЂg,цЬ‹(%“y”РХЩ-юР[DbяuЬ'э)ƒ\§Х‡Љ“2iі§*gf:DЏБПXŽWsц\RLЭ­173ˆЋBŠЙXѕqpЊ„ЉzЪЖЬcтŸ-3+Rш’S2:-ЩІъU;ХzNЛю0PqЃ eЫГьm R…Бm7§H™qMБœ*Rˆ`hЉШ>г?Лф&њ<­hMnе4вщЅЪ^Ž˜Ф€'RнZЇ"в{W.жYу'НёШѕuцT_XoБя™$TmіEШГї8бТtKВЏ…QD“АдФgNžŠ'Їы+EкcйVё“кЛBUЗUТ ѓтЏЏQ’YЊЁŠг ћЏЛ~’иЭъtC{‚:&=ПBЈ+ьНDdl^:чLн[_Й|–‚Zyщq{ъЮі\oжj-ЕМ>§Fд;nЁˆ„ј)й,0G—§w"ЂдНчŒф]іnRЇ1 L‡,“ЌХЮTзЁООOдЙБW:~ŸXюювђ;\чэ_ЙЧяуэЮFš6Hйyez%‘йiа Skгљ­’іIЮ"ж˜І"Y!€аъ!ЦdjSekў;}–SБ†Qpsд1въš{<•А]ъВ$NкМV9~_,с–шЇзz|КПœ^ѕY}eЎMчr’ЎOrŽoNgsт dxNОЉЖў‘ЧEХЩИзŒ„oЯщXњXж*Ў'MПАСJЯ—zЦo§Ž3гmП#х&дЭєљ5ЏмЩAN?В|#!ДŠ8yVwMFPё@{я№!к pRˆРA”'Г9‘ўпОhr|т5х+бQ ?Y@7лMDйsBК~*w Гх.bы'€г)T˜ OD]СЂ)^?”S NœžНфІ‚ ›—f2!v„ љО|‰ј {rŽГ˜7мэ“§6м%ЦС>ПuAšЧqЬэNЂ‚fmй] ѕЛцух˜2|EТЬгbcSЎЈ0?1~ 1k†Шaщ ] ’'ž$‘vOšvЯgЬ„АBЏјэуDј`уЅ.­9 ‡rЧЁЯЫIQeаБ’SЋдZ Skф ЏЂjжkЬŒ [ф_>"иƒдЗ“Ј–уьШЊћRСЧ\1рЄ Г‹Ј:>З ZјІЊGЯTœ€г/!v”HZzРўlcO“ФXРkхcЏ#"ЦЅ@ѕqтx˜еƒMyБ™,R UЅvœт…M­штRnе/­2§ЉhХ… ­€oЧ‘ђўХВE}Ё„EЊбѓюH“ŠI)Yі>НИNшЧи—4ІчЧ•Щ‰0еД]ц`CЪ,ЕЁм\wMц:T{Џ"8яВ€АБ3РЩf UM?З– Жхiм4ЋІєJЗž T‚$іaЂ@VT3hв&[Йƒ>тQ-гЭ@Й={;ЁЊ ;(~Вьл?;7*єо{”bilŽ+xцЦФ3хЪјЬ]5ќ“š!Щ™ёдLЌАрЛЛRСŽqБёOFо87ыwЌФјЉ ^›К~vЉmЊдЗpbž?|fу‘'vѓ™nvЉEЌzЛшxў.Iš’%О^)ЯzZšIќP­jy>я9ЪуwГх:uж`#Зж)šЌ‰!ui3Ч2ЋЖ„эАО03!rсb˜~,ўы!р pi/ш3“•хƒ}ŒŒJkКбmrћђхQoq^Vг7а”внО|a”ЩаMнЎчƒЬFДЭ§еƒЙБZ,vzо3о1љѓчŸGгЅVЏрHттЮюмсѓФдь|#Рь5лнМњшб)%—Жk~ЫjИlйЉlэЭпўžo^НRѕI4шЫkхtБ3ŠX…С›]МВ™Їц­јИY­ооСJtg™пы-ЩћuёЩ”1еІзЋ§ЧZmЗ’Ыx^Wgі(яЂфZУ+зK MЯ>1ьшх;K–чЪ.Э GЯЅљFГъ5ШУL}ОœЭњ~ZЧфžђй>‹DО(‡/Q$ФлгiЁh˜рHТg'IД{}s”–0ч6Ž‘Кoџ§ќ№zЇdU7з(БоеЗ>коЬд—ŸоБƒ r_{џѕ§іpœšЛєњЃAŽ9џўGЏЎ5‡??^иОИZpп~цН?§ютvyxІЉцціЊoж…уsЋ/§ѕЯoЬЇU‚ъЌ\ЛЙ™ї)ЃсЫЕђЪХ'ЎЇ†aЯEgЏ^_їйМw&ПuiБ–Џ•#\$"j§(ВqЎd(ДQбъBgЅ3œЗGЂŠ“мЪTS’ЂRцђЩнFz8Н›EЃQ .ŠšF)%K/.%kŒЪэ4YдАМлUЄŠу9KўшM3ВiЯYЊшU;чƒVvŽЩBtг(„™B‡щь_Ўh˜†I‹=JцќЖ (њэEM аВМ2I,€ ДЧўrixЃМДїдN !|смЧџМ1HDЫ›/ќИфъh§™?ўу­НсFБЩжoўЖяˆjдKџњяЇ7/Ю nЫйЫЏoзSОџƒnќяѓ_xe­RцќЕыъОГыLnюц{ЯН№Ш мM4гЅн7ŸэљеК%чъеее ЖаŸмФIяоКЙœї9TiчБеnЮЩ+б˜‹їЇ_њЙХЌ™ЁЫjwWGAЧ+‰с”-*r‚A­KЬ-ЖooЅgІ№дјNЭ%WјTРЩс]nа‡ЮipG‚ЕV™ЭйьЃмFŽ9-”˜]9№пВ`LБ0Šk$–œЄspyРœetШѓR }јлУЏЦмsќ<аˆТ|№ќХЦрІPxѓ?—ŠB!mуїя>ГЛоЬті“Ÿ>еJњN!4ГyсЪ…эЭвpŒГ№ђ­ѓПP(‘K;Э­нЦ` Є-{ужЭ­ЂЯЁJ[ эееV#1ˆUUъЗў№ќ–ЯlЅ§є~Џž”и`.f8БЕкш.R—3 nз=|ТбfLУЂUxЉГ™Ѓ%№oьi _5ЧГ@‚ŒшdNашцƒ„B“э—6[A"†‰џЮ%ъsчGЫNй§РFvXњч+Љсvf)ЬўиД р pхъъшFёџ6bywcчl37HjШ>{Еэ?$ЊкnчьZЫцщЋљНwпЙмђыа&щfЖ0ЗБ:мЖH6-gѓ—o]лЅ_NДЯЎtКХЄФЂ*FŒ­[Џ>Noќ5ГѓтЂ5œЋ R„.PPмvлg]RЅq8qЄЃќNDЄMњДёDSа+о Рр Гі&’)‡˜ИЇ+ЮјЗх+Эu™‰ТDіvяйн’џЕƒTe"ъ*Ю=в №Їlт)|fv!зЉ˜іят­\­џчžЕ†oил†Е5jёОpБж3|jБЙВо- QвKOНёЦЕCЌR? qgг§I€fgв•• Лg}†tкecpU˜їgpІ#s‘DОб*вп8И&9б2sПˆšЂO=tз>œk№œlš’LODWСŠиіIпNЕ0{шZЕ•` 6ЧЦDTЃHAњБИЕ‰ OЖTHћ_dАЪпjХRХp“ЇcенcŽ).7йРi"њm^zФв5}ИQO> ‘іаиœІTЏ№ўKёgЧ&Of~T`у7œи‹H VЦoO\ЏxЙ§$яM №ѓ€Эђ“ZYmricron-0.20120505.1~dfsg.1.orig/dcm2nii/diskfree.pas0000664000175000017500000002135011326434462021504 0ustar michaelmichaelunit diskfree; { Copyright 2001, by Michael Hopper This unit provides generic functions for finding the number of bytes and available bytes for a given drive volume or path. These functions work for both Linux and Windows systems. Note: In the near future, getmntent should be incorporated into the Linux version of the code rather than reading the /etc/mtab file directly. This is for future compatibility. } interface uses SysUtils; {$IFDEF LINUX} { This function is included (necessary) only in the Linux version because the Windows version is a little more intuitive, i.e., 1=A:, 2=B:, etc. } function GetVolumePath (Volume : integer) : TFileName; {$ENDIF} { This overloaded function returns the number of available bytes for the specified path or volume. I've mimicked DiskFree in that Volume=0 indicates the current directory (or pwd), while values greater than 0 return a value for the drives A: through Z: on Windows systems. For Linux systems, the /etc/mtab file is read, and only those devices mounted under /dev are alphabetized and included. This means that a value of 1 would return the free space on /dev/fd0 if a floppy is mounted, or /dev/hda1 if a floppy is not mounted. Hence the need for the GetVolumePath function to verify that you're getting the right path. } function GetAvailableFreeSpace(path : TFilename) : int64; overload; function GetAvailableFreeSpace(Volume : byte) : int64; overload; { This overloaded function returns the total number of bytes for the volume or path specified. Specification of the path or volume follows the same pattern as for the GetAvailableFreeSpace function. } function GetVolumeBytes(path : TFilename) : int64; overload; function GetVolumeBytes(Volume : byte) : int64; overload; implementation {$IFDEF MSWINDOWS} uses Windows; {$ENDIF} {$IFDEF LINUX} uses Classes,libc; const MAX_PATH = 65536; {$ENDIF} {$IFDEF MSWINDOWS} function oldWindows : boolean; { Use GetVersionEx windows call as defined in SysUtils and explained in the Win32 help file to return true if this is a version of Win95 that is pre-OSR2. Otherwise, return false. } var MyVersionInfo : _OSVERSIONINFOA; begin // Get Windows version information getversionex(MyVersionInfo); // Report TRUE only if Platform is Win9x and BuildNumber is < 1000 (pre-OSR2). with MyVersionInfo do begin result := ((dwPlatformID = VER_PLATFORM_WIN32_WINDOWS) and ((dwBuildNumber and $0000FFFF) < 1000)) end; end; {$ENDIF} {$IFDEF LINUX} function GetVolumePath (Volume : integer) : TFileName; { Return the path of the Volume specified. If Volume = 0, return the present present working directory. } var loop : integer; tempstr : string; mountedDrives : TStringlist; begin // return the present working directory if Volume = 0. if Volume = 0 then result := getenvironmentvariable('PWD') else begin // Get information about currently mounted drives. mountedDrives := tstringlist.create; mountedDrives.LoadFromFile('/etc/mtab'); // Alphabetize mountedDrives.Sort; loop := 0; // Loop to remove entries that are not drives while loop < mountedDrives.Count do begin if pos('/dev/',mountedDrives.Strings[loop]) <> 1 then mountedDrives.Delete(loop) else inc(loop); end; // If there are not enough mounted drives, then return a null string. if Volume > mountedDrives.Count then result := '' else // parse the entry to return the mounted path. begin tempstr := mountedDrives.Strings[Volume-1]; tempstr := copy(tempstr,pos(' ',tempstr) + 1,length(tempstr)); tempstr := copy(tempstr,1,pos(' ',tempstr)-1); result := tempstr; end; end; end; {$ENDIF} function CalculateVolumeSpace(path : pchar; var AvailableBytes : int64; var TotalBytes : int64) : boolean; { This function calculates and returns the number of available bytes and total bytes for a given path. It also returns a true value if successful, or false if unsuccessful at determining the correct values. If the function returns false, then the AvailableBytes and TotalBytes values should be treated as though they are undefined. } var {$IFDEF MSWINDOWS} SectorsPerCluster, BytesPerSector, NumberOfFreeClusters, TotalNumberOfClusters : cardinal; {$ENDIF} {$IFDEF LINUX} myStatFs : Tstatfs; {$ENDIF} begin {$IFDEF MSWINDOWS} // Check for pre-OSR2 Win95 because the GetDiskFreeSpace function was not // available. if not oldWindows then result := GetDiskFreeSpaceEx(path,AvailableBytes,TotalBytes,nil) // If pre-OSR2 Win95, then calculate the free space. else if GetDiskFreeSpace(path,SectorsPerCluster,BytesPerSector,NumberOfFreeClusters,TotalNumberOfClusters) then begin result := true; AvailableBytes := BytesPerSector * SectorsPerCluster * NumberOfFreeClusters; TotalBytes := BytesPerSector * SectorsPerCluster * TotalNumberOfClusters; end // If unsuccessful at either of the previous attempts, report failure. else begin result := false; AvailableBytes := -1; TotalBytes := -1; end; {$ENDIF} {$IFDEF LINUX} // Read information about the volume. if statfs(path,myStatFS) = 0 then begin // Calculate AvailableBytes and TotalBytes. AvailableBytes := int64(myStatFs.f_bAvail) * int64(myStatFs.f_bsize); TotalBytes := int64(myStatFs.f_blocks) * int64(myStatFs.f_bsize); // Report success. result := true; end else // report failure to get information begin AvailableBytes := -1; TotalBytes := -1; result := false; end; {$ENDIF} end; function GetAvailableFreeSpace(path : TFilename) : int64; overload; { Use the CalculateVolumeSpace function to find the free space for the path specified. } var TotalBytes : int64; pathPchar : pchar; begin {$IFDEF MSWINDOWS} if ByteType(path,1) = mbSingleByte then getmem(pathPchar,length(path) + 1) else getmem(pathPchar,2 * (length(path) + 1)); strpcopy(pathpchar,path); if not CalculateVolumeSpace(pathPchar,result,TotalBytes) then result := -1; {$ENDIF} {$IFDEF LINUX} getmem(pathPchar,(length(path) + 1) * sizeof(char)); strpcopy(pathPchar,path); if not CalculateVolumeSpace(pathPchar,result,TotalBytes) then result := -1; // stub {$ENDIF} end; function GetAvailableFreeSpace(Volume : byte) : int64; overload; { Use the CalculateVolumeSpace function to find the free space for the Volume specified. } var volumePath : array [1..MAX_PATH + 1] of char; volumePchar : pchar; TotalSpace : int64; begin {$IFDEF MSWINDOWS} volumePchar := @volumePath; if Volume = 0 then getcurrentdirectory(MAX_PATH + 1,volumePchar) else strPCopy(volumePchar,chr(Volume - 1 + ord('A')) + ':\'); if not CalculateVolumeSpace(volumePchar, result, TotalSpace) then result := -1; {$ENDIF} {$IFDEF LINUX} volumePchar := @volumePath; if Volume = 0 then strPCopy(volumePchar,getEnvironmentVariable('PWD')) else strPCopy(volumePChar,GetVolumePath(Volume)); if not CalculateVolumeSpace(volumePchar, result, TotalSpace) then result := -1; {$ENDIF} end; function GetVolumeBytes(path : TFilename) : int64; overload; { Use the CalculateVolumeSpace function to find the total space for the path specified. } var AvailableBytes : int64; pathPchar : pchar; begin {$IFDEF MSWINDOWS} if ByteType(path,1) = mbSingleByte then getmem(pathPchar,length(path) + 1) else getmem(pathPchar,2 * (length(path) + 1)); strpcopy(pathpchar,path); if not CalculateVolumeSpace(pathPchar,AvailableBytes,result) then result := -1; {$ENDIF} {$IFDEF LINUX} getmem(pathPchar,(length(path) + 1) * sizeof(char)); strpcopy(pathPchar,path); if not CalculateVolumeSpace(pathPchar,AvailableBytes, result) then result := -1; {$ENDIF} end; function GetVolumeBytes(Volume : byte) : int64; overload; { Use the CalculateVolumeSpace function to find the total space for the Volume specified. } var volumePath : array [1..MAX_PATH + 1] of char; volumePchar : pchar; AvailableBytes : int64; begin {$IFDEF MSWINDOWS} volumePchar := @volumePath; if Volume = 0 then getcurrentdirectory(MAX_PATH + 1,volumePchar) else strPCopy(volumePchar,chr(Volume - 1 + ord('A')) + ':\'); if not CalculateVolumeSpace(volumePchar, AvailableBytes, result) then result := -1; {$ENDIF} {$IFDEF LINUX} volumePchar := @volumePath; if Volume = 0 then strPCopy(volumePchar,getEnvironmentVariable('PWD')) else strPCopy(volumePChar,GetVolumePath(Volume)); if not CalculateVolumeSpace(volumePchar, AvailableBytes, result) then result := -1; {$ENDIF} end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dicomtypes.pas0000664000175000017500000006260611633663110022074 0ustar michaelmichaelunit dicomtypes; {$IFDEF FPC} {$mode objfpc} {$ENDIF} {$H+} {$Include ..\common\isgui.inc} interface var kUseDateTimeForID: boolean = false; const kGEID = 1; kPhilipsID = 2; kSiemensID = 3; kMaxDTIDir = 1024;//Maximum DTI directions kMaxOrderVal = 1024; type TDTI = record v1,v2,v3: double; //4=volume, eg time: some EC*T7 images bval: integer end; TDTIRA = array [1..kMaxDTIDir] of TDTI;//TDICOM;//unsigned 8-bit int TOrder= array [1..kMaxOrderVal] of byte; // TOrderScaling= array [1..kMaxOrderVal] of single; //TDTIRAp = ^TDTIRA; //TDTIRA = array [1..1] of TDTI;//TDICOM;//unsigned 8-bit int //TDTIRAp = ^TDTIRA; (*DICOMdata = record XYZdim: array [1..4] of integer; //4=volume, eg time: some EC*T7 images XYZori: array [1..3] of integer; XYZmm: array [1..3] of double; Orient: array [1..6] of double; Rotate180deg,Float,RunLengthEncoding,GenesisCpt,JPEGlosslessCpt, JPEGlossyCpt,ElscintCompress,MinIntensitySet: boolean; PatientPosX,PatientPosY,PatientPosZ,IntenScale,IntenIntercept,kV,mA,TR,TE,spacing,thickness,location: single; SlicesPer3DVol,SiemensInterleaved {0=no,1=yes,2=not defined},SiemensSlices,SiemensMosaicX,SiemensMosaicY,CompressSz,CompressOffset,AcquNum,ImageNum,SeriesNum,Monochrome,SamplesPerPixel,PlanarConfig,ImageStart,little_endian, Allocbits_per_pixel,Storedbits_per_pixel,ImageSz,accession, PatientIDint,VolumeNumber,WindowWidth,WindowCenter,GenesisPackHdr, NamePos,StudyDatePos,MinIntensity,MaxIntensity, RLEredOffset,RLEgreenOffset,RLEblueOffset,RLEredSz,RLEgreenSz,RLEblueSz: integer; {must be 32-bit integer aka longint} ProtocolName,AcqTime,ImgTime,PatientName,PatientID,StudyDate,StudyTime,modality,serietag: String; end;//DICOMdata record *) kDICOMStr = String[32]; DICOMdata = record XYZdim: array [1..4] of integer; XYZori: array [1..3] of integer; XYZmm: array [1..3] of double; Orient: array [1..6] of double; SignedData,SiemensDICOMDTICSA,SiemensDICOMDTI,Float,file4D,JPEGLossyCpt,JPEGLosslessCpt: boolean; SecSinceMidnight,PatientPosX,PatientPosY,PatientPosZ,AngulationAP,AngulationFH,AngulationRL: double; TE, TR,IntenScale,IntenIntercept,location{,DTIv1,DTIv2,DTIv3}: single; {Bval,}SlicesPer3DVol,SiemensInterleaved {0=no,1=yes,2=not defined},SiemensSlices,SiemensMosaicX,SiemensMosaicY, nOrder,nDTIdir,AcquNum,ImageNum,SeriesNum,ImageStart,little_endian,Allocbits_per_pixel,SamplesPerPixel, CSAImageHeaderInfoPos,CSAImageHeaderInfoSz,ManufacturerID,PlanarConfig, //ImplementationVersion, Vers0018_1020, CompressOffset,CompresssZ: integer; DateTime: TDateTime; PatientGender,PatientDoB,PatientPos,PatientName,ProtocolName,StudyDate,StudyTime,PhilipsSliceOrient,PhaseEncoding: kDICOMStr; Filename: string[255]; DTI: TDTIRA; Order: TOrder; //4D datasets //OrderSlope,OrderIntercept: TOrderScaling; //4D datasets end;//DICOMdata record (*TDICOM = record Xdim,Ydim,Zdim,PatientID,Series,Acquisition,Image: integer; Location: single; end;*) TDICOMRA = array [1..1] of DicomData;//TDICOM;//unsigned 8-bit int TDICOMRAp = ^TDICOMRA; TNIFTIhdr = packed record //Next: analyze Format Header structure HdrSz : longint; //MUST BE 348 Data_Type: array [1..10] of char; //unused db_name: array [1..18] of char; //unused extents: longint; //unused session_error: smallint; //unused regular: char; ////unused: in Analyze 7.5 this must be 114 dim_info: byte; //MRI slice order dim: array[0..7] of smallint; //Data array dimensions intent_p1, intent_p2, intent_p3: single; intent_code: smallint; datatype: smallint; bitpix: smallint; slice_start: smallint; pixdim: array[0..7]of single; vox_offset: single; scl_slope: single;//scaling slope scl_inter: single;//scaling intercept slice_end: smallint; slice_code: byte; //e.g. ascending xyzt_units: byte; //e.g. mm and sec cal_max,cal_min: single; //unused slice_duration: single; //time for one slice toffset: single; //time axis to shift glmax, glmin: longint; //UNUSED descrip: array[1..80] of char; aux_file: array[1..24] of char; qform_code, sform_code: smallint; quatern_b,quatern_c,quatern_d, qoffset_x,qoffset_y,qoffset_z: single; srow_x: array[0..3]of single; srow_y: array[0..3]of single; srow_z: array[0..3]of single; intent_name: array[1..16] of char; magic: longint; end; //TNIFTIhdr Header Structure const //nifti kDT_BINARY =1; // binary (1 bit/voxel) kDT_UNSIGNED_CHAR =2; // unsigned char (8 bits/voxel) kDT_SIGNED_SHORT =4; // signed short (16 bits/voxel) kDT_SIGNED_INT =8; // signed int (32 bits/voxel) kDT_FLOAT =16; // float (32 bits/voxel) kDT_COMPLEX =32; // complex (64 bits/voxel) kDT_DOUBLE =64; // double (64 bits/voxel) kDT_RGB =128; // RGB triple (24 bits/voxel) kDT_INT8 =256; // signed char (8 bits) kDT_UINT16 =512; // unsigned short (16 bits) kDT_UINT32 =768; // unsigned int (32 bits) kDT_INT64 =1024; // long long (64 bits) kDT_UINT64 =1280; // unsigned long long (64 bits) kDT_FLOAT128 =1536; // long double (128 bits) kDT_COMPLEX128 =1792; // double pair (128 bits) kDT_COMPLEX256 =2048; // long double pair (256 bits) // slice_code values kNIFTI_SLICE_SEQ_UNKNOWN = 0; kNIFTI_SLICE_SEQ_INC = 1; kNIFTI_SLICE_SEQ_DEC = 2; kNIFTI_SLICE_ALT_INC = 3; kNIFTI_SLICE_ALT_DEC = 4; //xyzt_units values: note 3bit space and 3bit time packed into single byte kNIFTI_UNITS_UNKNOWN = 0; kNIFTI_UNITS_METER = 1; kNIFTI_UNITS_MM = 2; kNIFTI_UNITS_MICRON = 3; kNIFTI_UNITS_SEC = 8; kNIFTI_UNITS_MSEC = 16; kNIFTI_UNITS_USEC = 24; kNIFTI_UNITS_HZ = 32; kNIFTI_UNITS_PPM = 40; //qform_code, sform_code values kNIFTI_XFORM_UNKNOWN = 0; kNIFTI_XFORM_SCANNER_ANAT = 1;//Scanner-based anatomical coordinates kNIFTI_XFORM_ALIGNED_ANAT = 2; //Coordinates aligned to another file e.g. EPI coregistered to T1 kNIFTI_XFORM_TALAIRACH = 3; //Talairach-Tournoux Atlas; (0,0,0)=AC, etc. kNIFTI_XFORM_MNI_152 = 4; //MNI 152 normalized coordinates //Magic values kNIFTI_MAGIC_SEPARATE_HDR = $0031696E;//$6E693100; kNIFTI_MAGIC_EMBEDDED_HDR = $00312B6E;//$6E2B3100; //byte-swapped magic values kswapNIFTI_MAGIC_SEPARATE_HDR = $6E693100; kswapNIFTI_MAGIC_EMBEDDED_HDR = $6E2B3100; //Statistics Intention kNIFTI_INTENT_NONE =0; kNIFTI_INTENT_CORREL =2; kNIFTI_INTENT_TTEST =3; kNIFTI_INTENT_FTEST =4; kNIFTI_INTENT_ZSCORE =5; kNIFTI_INTENT_CHISQ =6; kNIFTI_INTENT_BETA =7; kNIFTI_INTENT_BINOM =8; kNIFTI_INTENT_GAMMA =9; kNIFTI_INTENT_POISSON =10; kNIFTI_INTENT_NORMAL =11; kNIFTI_INTENT_FTEST_NONC =12; kNIFTI_INTENT_CHISQ_NONC =13; kNIFTI_INTENT_LOGISTIC =14; kNIFTI_INTENT_LAPLACE =15; kNIFTI_INTENT_UNIFORM =16; kNIFTI_INTENT_TTEST_NONC =17; kNIFTI_INTENT_WEIBULL =18; kNIFTI_INTENT_CHI =19; kNIFTI_INTENT_INVGAUSS =20; kNIFTI_INTENT_EXTVAL =21; kNIFTI_INTENT_PVAL =22; NIFTI_INTENT_LOGPVAL =23; NIFTI_INTENT_LOG10PVAL =24; kNIFTI_LAST_STATCODE = 24;//kNIFTI_INTENT_PVAL; kNIFTI_INTENT_ESTIMATE =1001; kNIFTI_FIRST_NONSTATCODE = kNIFTI_INTENT_ESTIMATE; kNIFTI_INTENT_LABEL =1002; kNIFTI_INTENT_NEURONAME =1003; kNIFTI_INTENT_GENMATRIX =1004; kNIFTI_INTENT_SYMMATRIX =1005; kNIFTI_INTENT_DISPVECT =1006; kNIFTI_INTENT_VECTOR =1007; kNIFTI_INTENT_POINTSET =1008; kNIFTI_INTENT_TRIANGLE =1009; kNIFTI_INTENT_QUATERNION =1010; const //dicom kCR = chr (13);//PC EOLN kA = ord('A'); kB = ord('B'); kC = ord('C'); kD = ord('D'); kE = ord('E'); kF = ord('F'); kH = ord('H'); kI = ord('I'); kL = ord('L'); kM = ord('M'); kN = ord('N'); kO = ord('O'); kP = ord('P'); kQ = ord('Q'); kS = ord('S'); kT = ord('T'); kU = ord('U'); kW = ord('W'); procedure PhilipsPrecise (lRS, lRI,lSS: single; var lSlope,lIntercept: single; Precise: boolean); procedure clear_dicom_data (var lDicomdata:Dicomdata); function DICOMinterslicedistance(var lDicomdata1,lDicomdata2:Dicomdata): single;//1392 function StudyDateTime (lInStudyDate, lInStudyTime: kDICOMStr): TDateTime; function StudyDateTime2Str (lDateTime: TDateTime):string; function GetCSAImageHeaderInfoDTI (lFilename: string; lStart,lLength: integer; var lBval: integer; var ldti1,ldti2,ldti3: double): boolean; function GetCSAImageHeaderInfo (lFilename: string; lStart,lLength: integer; var lMosaicSlices,lMosaicX,lMosaicY: integer; var lv1,lv2,lv3: double): boolean; procedure AplhaNumericStrDICOM (var lStr: kDICOMStr); procedure PartialAcquisitionError; function DICOMstr (i: integer; var lDICOMra: TDICOMrap;lOutname:string): string; overload; function DICOMstr (i: integer; var lDICOMra: TDICOMrap): string; overload; implementation uses dicom,sysutils,define_types,dialogsx; function YearsOld (lDICOM: DICOMdata): single; var dob: TDateTime; lnoon:string; begin result := 0; if length (lDICOM.PatientDoB) < 8 then exit; //YYYYMMDD try lnoon := '120000'; dob := StudyDateTime (lDICOM.PatientDoB, lnoon); result := (lDICOM.DateTime-dob)/365.2425; except result := 0; end; end; function DICOMstr (i: integer; var lDICOMra: TDICOMrap;lOutname: string): string; overload; var lS: string; begin if lOutname <> '' then lS := kTab+'SuggestedOutput:'+lOutname else lS := ''; result := lDICOMra^[i].Filename +kTab+'SeriesNum:'+kTab+inttostr(lDICOMra^[i].SeriesNum) +kTab+'AcquNum:'+inttostr(lDICOMra^[i].AcquNum) +kTab+'ImageNum:'+inttostr(lDICOMra^[i].ImageNum) +kTab+'Name:'+lDICOMra^[i].PatientName +kTab+'DoB:'+lDICOMra^[i].PatientDoB +kTab+'Gender:'+lDICOMra^[i].PatientGender +kTab+'DateTime:'+DateTimeToStr(lDICOMra^[i].DateTime) +kTab+'Age(Years):'+floattostr(YearsOld(lDICOMra^[i])) +lS ; end; function DICOMstr (i: integer; var lDICOMra: TDICOMrap): string; overload; begin result := DICOMstr (i, lDICOMra,'') end; procedure PartialAcquisitionError; begin Msg('* Potential partial acquisition or improper segmentation of files'); {$IFDEF GUI} Msg('* Possible solution: check ''Collapse folders'' in Help/Preferences and select directory that contains all images in subfolders'); {$ELSE} Msg('* Possible solution: use -c Y and use folder containing subdirectories as input'); Msg('* or change .ini file to read: CollapseFolders=1'); {$ENDIF} end; function PhilipsPreciseVal (lPV, lRS, lRI,lSS: single): single; begin if (lRS*lSS) = 0 then //avoid divide by zero result := 0 else result := (lPV * lRS + lRI) / (lRS * lSS); end; procedure PhilipsPrecise (lRS, lRI,lSS: single; var lSlope,lIntercept: single; Precise: boolean); var l0,l1: single; begin //# === PIXEL VALUES ============================================================= //# PV = pixel value in REC file, FP = floating point value, DV = displayed value on console //# RS = rescale slope, RI = rescale intercept, SS = scale slope //# DV = PV * RS + RI FP = DV / (RS * SS) if not Precise then begin //return DV not FP lSlope := lRS; if lSlope = 0 then lSlope := 1; lIntercept := lRI; exit; end; //if return DV l0 := PhilipsPreciseVal (0, lRS, lRI,lSS); l1 := PhilipsPreciseVal (1, lRS, lRI,lSS); if l0 = l1 then begin lSlope := 1; lIntercept := 0; exit; end; lIntercept := l0; lSlope := l1-l0; end; function SecSinceMidnight(H,Min,S: integer): integer; //86,400 sec per day begin // result := 3600*(H) + 60* Min + S;//H not H-1 as our clock runs from 0..23 not 1..24 end; function BogusDateTime: TDateTime; begin result := EncodeDate(1989,3,23) + (SecSinceMidnight(12,0,0) / 86400); end; function EncodeDateTime (Y,M,D,H,Min,S: integer): TDateTime; begin try result := EncodeDate(Y,M,D) + (SecSinceMidnight(H,Min,S) / 86400); except //impossible date - set to cold fusion date result := BogusDateTime; end; end; procedure DecodeDateTime (lDateTime: TDateTime; var Y,M,D,H,Min,S: word); var secs: integer; begin try DecodeDate(lDateTime, Y, M, D); except //unable to decode date - use cold fusion values Y := 1989; M := 3; D := 23; end; Secs := round(Frac(lDateTime)*86400); S := secs mod 60; Min := (secs div 60) mod 60; H := (secs div 3600); end; function StudyDateTime2Str (lDateTime: TDateTime):string; var Y,M,D,H,Min,S: word; begin DecodeDateTime (lDateTime,Y,M,D,H,Min,S); result := PadStr (Y, 4)+ PadStr (M, 2)+PadStr (D, 2)+'_'+PadStr (H, 2)+ PadStr (Min, 2)+PadStr (S, 2); end; function StudyDateTime (lInStudyDate, lInStudyTime: kDICOMStr): TDateTime; var lStr,lStudyDate, lStudyTime: string; Y,M,D,H,Min,S: integer; begin result := 0; if (length(lInStudyDate) < 8){YYYYMMDD} or (length(lInStudyTime) < 6) {hhmmss} then exit; //next compress string, e.g. Elscint saves time as 16:54:21 lStudyDate :=''; for S := 1 to length (lInStudyDate) do if lInStudyDate[S] in ['0'..'9'] then lStudyDate := lStudyDate + lInStudyDate[S]; lStudyTime :=''; for S := 1 to length (lInStudyTime) do if lInStudyTime[S] in ['0'..'9'] then lStudyTime := lStudyTime + lInStudyTime[S]; if (length(lStudyDate) < 8){YYYYMMDD} or (length(lStudyTime) < 6) {hhmmss} then exit; lStr := lStudyDate[1]+lStudyDate[2]+lStudyDate[3]+lStudyDate[4]; Y := strtoint(lStr); lStr := lStudyDate[5]+lStudyDate[6]; M := strtoint(lStr); lStr := lStudyDate[7]+lStudyDate[8]; D := strtoint(lStr); lStr := lStudyTime[1]+lStudyTime[2]; H := strtoint(lStr); lStr := lStudyTime[3]+lStudyTime[4]; Min := strtoint(lStr); lStr := lStudyTime[5]+lStudyTime[6]; S := strtoint(lStr); result := EncodeDateTime (Y,M,D,H,Min,S); end; procedure AplhaNumericStrDICOM (var lStr: kDICOMStr); var S: integer; lOutStr: string; begin if length(lStr) < 1 then exit; lOutStr := ''; for S := 1 to length (lStr) do if lStr[S] in ['0'..'9','A'..'Z','a'..'z'] then lOutStr := lOutStr+ lStr[S]; lStr := lOutStr; end; function GetCSAImageHeaderInfoRaw (lIsDTI: boolean; lFilename: string; lStart,lLength: integer; var li1,li2,li3: integer; var lf1,lf2,lf3: double): boolean; //returns true if mosaic //will return false for non-mosaics - even if the have DTI information! //valid DTI signified by bval >= 0 const kMaxFloats = 6; var //lZ: integer; lByteRA: Bytep; lNumarisTag: string; lInFile: file; lFloatRA: array [1..kMaxFloats] of double; function Str2FloatLastNum ( lStr: string): boolean; var lFStr: string; lP: integer; begin lFloatRA[1] := 1; result := false; if (length(lStr) < 1) then exit; lFStr := ''; lP := length(lStr); while (lP > 0) and ((lFStr = '') or (lStr[lP] in ['+','-','0'..'9','.','e','E'])) do begin if lStr[lP] in ['+','-','0'..'9','.','e','E'] then lFStr := lStr[lP]+lFStr; dec(lP); end; if (lFStr = '') then exit; try lFloatRA[1] := strtofloat(lFStr); except on EConvertError do lFloatRA[1] := 1; end;//except result := true; end; //function Str2Float function NumarisPos (lStr: string; lStart: integer): integer; //read 16 bit short integer var lP,lLen,lMax,lMatch: integer; begin result := 0; lLen := length(lStr); lMax := lLength-lLen; if (lStart < 1) or (lMax < 1) or (lLen < 1) then exit; for lP := lStart to lMax do begin lMatch := 0; while (lMatch < lLen) and (lStr[lMatch+1] = char( lByteRA[lP+lMatch]) ) do inc(lMatch); if lMatch = lLen then begin if (lP < lMax) and (char( lByteRA[lP+lMatch]) = '"') then begin lMatch := 0;//We want DiffusionGradientDirection, but not "DiffusionGradientDirection" end else begin result := lP; exit; end; end; end; end; //function NumarisPos function Str2FloatNum ( lStr: string; lnFloats: integer): boolean; var lFStr: string; lP,lnF: integer; begin result := false; if (length(lStr) < 1) or (lnFloats < 1) or (lnFloats > kMaxFloats) then exit; for lnF := 1 to lnFloats do lFloatRA[lnF] := 1; lStr := lStr + ' '; //terminator lFStr := ''; lP := 1; lnF:= 0; while lP <= length(lStr) do begin if lStr[lP] in ['+','-','0'..'9','.','e','E'] then lFStr := lFStr + lStr[lP] else if (lFStr <> '') then begin inc(lnF); try lFloatRA[lnF] := strtofloat(lFStr); except on EConvertError do Msg('Unable to interpret '+lNumarisTag+ ' in '+extractfilename(lFilename)); end;//except if lnF = lnFloats then begin result := true; exit; end; lFStr := ''; end; inc(lP); end; end; //function Str2Float function NumarisStr (lStr,lIDStr: string): string; var lP,lI: integer; lPrevNum : boolean; begin result := ''; lP := NumarisPos(lStr,1); if lP <1 then exit; if length(lIDstr) > 0 then begin lP := NumarisPos(lIDstr,lP); if lP <1 then exit; end; result := ''; lI := lP + length(lStr); lPrevNum := false; While (lI < (lLength)) and (lByteRA^[lI] <> $CD) do begin if char(lByteRA[lI]) in ['-','0'..'9','.','p','*'] then begin result := result + char(lByteRA[lI]); lPrevNum := true; end else begin if lPrevNum then result := result + ' '; lPrevNum := false; end; inc(lI); end; end; function NumarisInt1 (lStr,lIDStr: string; var lI1: integer): boolean; begin result := Str2FloatLastNum (NumarisStr(lStr,lIDStr)); if not result then exit; lI1 := round(lFloatRA[1] ); end; function NumarisFloat3 (lStr,lIDStr: string; var lF1,lF2,lF3: double): boolean; begin //showmessage(lStr+' '+NumarisStr(lStr,lIDStr)); result := Str2FloatNum (NumarisStr(lStr,lIDStr),3); if not result then exit; lF1 := (lFloatRA[1]); lF2 := (lFloatRA[2]); lF3 := (lFloatRA[3]); end; //function NumarisFloat3 function NumarisInt2PStar (lStr,lIDStr: string; var lI1,lI2: integer): boolean; var lLen,lPos,lStarPos: integer; lvStr,lpStarStr: string; begin //a 96x96 mosaic is usually saved as '64*64', but in B13 you can see '96p*96' or '.95 96p*96' result := false; lvStr := NumarisStr(lStr,lIDStr); lLen := length(lvStr); if lLen < 4 then exit;//not found lStarPos := 0; for lPos := 1 to (lLen-1) do if (lvStr[lPos] = '*') then lStarPos := lPos; if lStarPos = 0 then exit; lpStarStr := ''; lPos := lStarPos -1; while (lPos >= 1) and ((lpStarStr = '') or (lvStr[lPos] in ['0'..'9'])) do begin lpStarStr := lvStr[lPos] + lpStarStr; dec(lPos); end; lpStarStr := lpStarStr + ' '; lPos := lStarPos+1; while (lPos < lLen) and ((lpStarStr = '') or (lvStr[lPos] in ['0'..'9'])) do begin lpStarStr := lpStarStr+lvStr[lPos]; inc(lPos); end; result := Str2FloatNum (lpStarStr,2); if not result then exit; lI1 := round(lFloatRA[1]); lI2 := round(lFloatRA[2]); //Msg(lvStr+' '+floattostr( lI1)+'x'+inttostr(lI2)); end; begin // GetCSAImageHeaderInfoRaw result := false; if (lLength < 1) then exit; if FSize(lFilename) <= (lStart+lLength) then exit; li1 := -1; //impossible - should be >=0 li2 := 0; li3 := 0; lf1 := 0;//impossible, therefore not DTI - should be -1..1 lf2 := 0;//impossible, therefore not DTI lf3 := 0;//impossible, therefore not DTI GetMem(lByteRA,lLength); AssignFile(lInFile, lFileName); //Msg('fz '+lFilename); FileMode := 0; //Set file access to read only Reset(lInFile, 1); seek(lInFile,lStart); BlockRead(lInFile, lByteRA^[1], lLength); CloseFile(lInFile); FileMode := 2; if lIsDTI then begin result := NumarisInt1 ('B_value','IS',li1); //result := NumarisInt1 ('B_value','LO',li1); if li1 > 0 then begin NumarisFloat3('DiffusionGradientDirection','FD',lf1,lf2,lf3); //vx(lf1,lf2,lf3,123); end; end else begin //get mosaic info //fx(lStart,lLength); result := NumarisInt1 ('NumberOfImagesInMosaic','US',li1); if result then begin NumarisInt2pStar ('AcquisitionMatrixText','SH', li2,li3); NumarisFloat3('SliceNormalVector','FD',lf1,lf2,lf3); end; end; FreeMem(lByteRA); end;//GetCSAImageHeaderInfoRaw function GetCSAImageHeaderInfoDTI (lFilename: string; lStart,lLength: integer; var lBval: integer; var ldti1,ldti2,ldti3: double): boolean; var li2,li3: integer; //not used begin result := GetCSAImageHeaderInfoRaw (TRUE,lFilename, lStart,lLength, lBval,li2,li3, ldti1,ldti2,ldti3); end; function GetCSAImageHeaderInfo (lFilename: string; lStart,lLength: integer; var lMosaicSlices,lMosaicX,lMosaicY: integer; var lv1,lv2,lv3: double): boolean; begin result := GetCSAImageHeaderInfoRaw (FALSE,lFilename, lStart,lLength, lMosaicSlices,lMosaicX,lMosaicY, lv1,lv2,lv3); end; procedure clear_dicom_data (var lDicomdata:Dicomdata); var lI: integer; begin with lDicomData do begin lDicomData.CSAImageHeaderInfoPos := 0; lDicomData.CSAImageHeaderInfoSz := 0; for lI := 1 to 6 do Orient[lI] := 0; DateTime := BogusDateTime; ManufacturerID := 0; //ImplementationVersion := 0; Vers0018_1020 := 0; AngulationFH := 0; AngulationRL := 0; AngulationAP := 0; nDTIdir := 0; nOrder := 0; PhilipsSliceOrient := 'NA'; PhaseEncoding := 'NA'; PatientPos := 'NA'; for lI := 1 to kMaxDTIdir do begin DTI[lI].Bval := -1; DTI[lI].v1 := 0; DTI[lI].v2 := 0; DTI[lI].v3 := 0; (* DTI[lDICOMdata.nDTIdir].Bval := -1; DTI[lDICOMdata.nDTIdir].v1 := 0; DTI[lDICOMdata.nDTIdir].v2 := 0; DTI[lDICOMdata.nDTIdir].v3 := 0; *) end; SiemensDICOMDTI := true; SiemensDICOMDTICSA := false; file4D := false; PatientName := 'NO NAME'; PatientDoB := 'NO DOB'; PatientGender := 'NA'; //PatientID := 'NO ID'; StudyDate := ''; StudyTime := ''; SecSinceMidnight := 0; //AcqTime := ''; //ImgTime := ''; TR := 0; TE := 0; //Echo := 0; //kV := 0; //mA := 0; //Rotate180deg := false; //MaxIntensity := 0; //MinIntensity := 0; //MinIntensitySet := false; Float := false; ImageNum := -1; SlicesPer3DVol := 0; SiemensInterleaved := 2; //0=no,1=yes,2=undefined SiemensSlices := 0; SiemensMosaicX := 1; SiemensMosaicY := 1; IntenScale := 1; IntenIntercept := 0; SeriesNum := 1; AcquNum := 0; ImageNum := 1; //Accession := 1; PlanarConfig:= 0; //only used in RGB values //runlengthencoding := false; //CompressSz := 0; //CompressOffset := 0; SamplesPerPixel := 1; //WindowCenter := 0; //WindowWidth := 0; XYZmm[1] := 1; XYZmm[2] := 1; XYZmm[3] := 1; XYZdim[1] := 1; XYZdim[2] := 1; XYZdim[3] := 1; XYZdim[4] := 1; lDicomData.XYZori[1] := 0; lDicomData.XYZori[2] := 0; lDicomData.XYZori[3] := 0; ImageStart := 0; Little_Endian := 0; Allocbits_per_pixel := 16;//bits //Storedbits_per_pixel:= Allocbits_per_pixel; //StudyDatePos := 0; //Spacing:=0; //Thickness:= 0;//1391 Location:=0; //Modality:='MR'; //ProtocolName := ''; //serietag:=''; PatientPosX := 0;//1392 PatientPosY := 0;//1392 PatientPosZ := 0;//1392 JPEGLossyCpt := false; JPEGLosslessCpt := false; SignedData := true; CompressOffset := 0; CompresssZ := 0; end; end; function DICOMinterslicedistance(var lDicomdata1,lDicomdata2:Dicomdata): single;//1392 begin result := sqrt(sqr(lDICOMdata1.PatientPosX-lDICOMdata2.PatientPosX) +sqr(lDICOMdata1.PatientPosY-lDICOMdata2.PatientPosY) +sqr(lDICOMdata1.PatientPosZ-lDICOMdata2.PatientPosZ)); end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dicomfastread.pas0000664000175000017500000005042411366001642022513 0ustar michaelmichaelunit dicomfastread; {$H+} //this is x3 faster than the dicomcompat routines, but only works with well-behaved Explicit Little-Endian DICOM interface //0008,0070,ManufacturerID //Next values for Philips //Philips - must set 2001,105F length to 8 - allows reading of stack sequence // 2005,1071. Philips AP angulation // 2005,1072. Philips RL angulation // 2005,1073. Philips FH angulation //2001,100B Philips slice orientation (TRANSVERSAL, AXIAL, SAGITTAL) // Next values for GE //0019,10bb (or 0019,a0bb)= X diffusion direction //0019,10bc (or 0019,a0bc)= Y diffusion direction //0019,10bd (or 0019,a0bd)= Z diffusion direction //0018,1312 = phase encoding. uses {$IFNDEF FPC}Controls, {$ENDIF} SysUtils,define_types,classes,dicomtypes; function fast_read_dicom_datax(var lDICOMdata: DICOMdata; lOffset,lFileSz: integer; var lFileName: string): boolean; //x3 faster! procedure read_philips_hidden(var lFilename: string; lOffset,lLength: integer; var lDICOMdata: DICOMdata); function orientation_not_visible( lDICOMdata: DICOMdata) : boolean; implementation uses dialogsx; {$DEFINE notANON} function fast_read_dicom_datax(var lDICOMdata: DICOMdata; lOffset,lFileSz: integer; var lFileName: string): boolean; const kMaxBuf = (256*256)-1; //bytes kMax16bit = (256*256)-1; kImageType = $00080008; kStudyDate = $00210008; kSeriesDate = $00210008; kAcqDate = $00220008; kCreateDate = $00120008; kStudyTime = $00300008; kPatientName = $00100010; {$IFDEF ANON} //position and lengths of tags to anonymize kPatientID = $00200010; kPatientDOB = $00300010; kPatientSex = $00400010; kPatientAge = $10100010; kPatientWt = $10300010; {$ENDIF} kSeq = $00200018; kZThick = $00500018; kTR = $00800018; kTE = $00810018; kEchoNum = $00860018; kZSpacing = $00880018; kProtocolName = $10300018; kPatientPos = $51000018; kSeriesNum = $00110020; kAcquNum = $00120020; kImageNum = $00130020; kOrientation = $00370020; kLocation = $10410020; kDim3 = $00080028; kDim2 = $00100028; kDim1 = $00110028; kXYSpacing = $00300028; kPosition = $00320020; knVol = $01050020; kAlloc = $01000028; kIntercept = $10520028; kSlope = $10530028; kCSAImageHeaderInfo = $10100029; kSlicesPer3DVol = $10182001; kTransferSyntax = $00100002; kImageStart = $00107FE0; kPhilipsPhantom1 = $91130020;//$0020+($9113 shl 16 ); kPhilipsPhantom2 = $91160020; kPhilipsPhantom3 = $91100028; kMaxFloats = 6; var vr : array [1..2] of Char; lByteRA: Bytep; lFloatRA: array [1..kMaxFloats] of double; lBufferSz,lPos,lBuffStart: integer; lInFile: file; lBufferError: boolean; procedure Str2FloatNum ( lStr: string; lnFloats: integer); var lFStr: string; lP,lnF: integer; begin if (length(lStr) < 1) or (lnFloats < 1) or (lnFloats > kMaxFloats) then exit; for lnF := 1 to lnFloats do lFloatRA[lnF] := 1; lStr := lStr + ' '; //terminator lFStr := ''; lP := 1; lnF:= 0; while lP <= length(lStr) do begin if lStr[lP] in ['+','-','0'..'9','.','e','E'] then lFStr := lFStr + lStr[lP] else if (lFStr <> '') then begin inc(lnF); //if lnFloats = 6 then showmessage(lFStr); try lFloatRA[lnF] := strtofloat(lFStr); except on EConvertError do lFloatRA[lnF] := 1; end;//except if lnF = lnFloats then exit; lFStr := ''; end; inc(lP); end; end; //function Str2Float function GetByte (lFilePos: integer): byte; var lBufPos: integer; begin //the following error checking slows down reads a lot! //a simpler alternative would be to make the buffer size the same size as the entire image... //the current strategy saves memory and is faster for large images with small headers if lFilepos > lFileSz then begin lBufferError := true; result := 0; exit; end; lBufPos := lFilepos - lBuffStart+1; if (lBufPos > lBufferSz) or (lBufPos < 1) then begin //reload buffer if lFilePos+kMaxBuf > lFileSz then lBufferSz := lFileSz - (lFilePos) else lBufferSz := kMaxBuf; //read remaining AssignFile(lInFile, lFileName); FileMode := 0; //Set file access to read only Reset(lInFile, 1); seek(lInFile,lFilePos); BlockRead(lInFile, lByteRA^[1], lBufferSz); CloseFile(lInFile); FileMode := 2; lBuffStart := lFilePos; lBufPos := 1; end; result := lByteRA^[lBufPos]; end; function ReadInt4: int64; begin if lDicomData.little_endian = 0 then result := GetByte(lPos+3)+(GetByte(lPos+2) shl 8)+(GetByte(lPos+1) shl 16)+(GetByte(lPos) shl 24) else result := GetByte(lPos)+(GetByte(lPos+1) shl 8)+(GetByte(lPos+2) shl 16)+(GetByte(lPos+3) shl 24); inc(lPos,4); end; //function Read4 function ReadCardinal: int64; begin if lDicomData.little_endian = 0 then result := GetByte(lPos+3)+(GetByte(lPos+2) shl 8)+(GetByte(lPos+1) shl 16)+(GetByte(lPos) shl 24) else result := GetByte(lPos)+(GetByte(lPos+1) shl 8)+(GetByte(lPos+2) shl 16)+(GetByte(lPos+3) shl 24); inc(lPos,4); end; //function Read4 procedure ReadGroupElementLength(var lGroupElement: int64; var lLength: integer); begin lGroupElement := ReadCardinal; VR := 'AA'; vr[1] := chr(GetByte(lPos)); vr[2] := chr(GetByte(lPos+1)); if vr[2] < 'A' then begin //implicit vr with 32-bit length lLength := ReadInt4; exit; end; if (vr = 'OB') or (vr = 'OW') or (vr = 'SQ') then begin {explicit VR with 32-bit length} lPos := lPos + 4; {skip 2 byte string and 2 reserved bytes = 4 bytes = 2 words} lLength := ReadInt4;//Ord4(buf[lPos]) + $100 * (buf[lPos+1] + $100 * (buf[lPos+2] + $100 * buf[lPos+3])) end else begin {explicit VR with 16-bit length} if lDicomData.little_endian = 0 then lLength := (GetByte(lPos+3))+(GetByte(lPos+2) shl 8) else lLength := (GetByte(lPos+2))+(GetByte(lPos+3) shl 8);//GetLength := Ord4(buf[i+2]) + $100 * (buf[i+3]); lPos := lPos + 4; {skip 2 byte string and 2 length bytes = 4 bytes = 2 words} end; if (lGroupElement = kPhilipsPhantom1) or (lGroupElement = kPhilipsPhantom2) or (lGroupElement = kPhilipsPhantom3) then begin //crucial Philips values are nested inside this string... //fx(666); //kX := true; lLength := 8; end; end; //procedure ReadGroupElementLength function DCMStr(lBytes: integer): string; var lC: integer; begin result := ''; if lBytes < 1 then exit; for lC := lPos to (lPos+(lBytes-1)) do result := result + char(GetByte(lC)); for lC := 1 to lBytes do if result[lC] in ['+','-','/','\',' ','0'..'9','a'..'z','A'..'Z','.'] then else result[lC] := ' '; end; //function DCMStr function DCMStr2Int (lBytes: integer): integer; var lErr: integer; lStr: string; begin lStr := DCMStr(lBytes); Val(lStr,result,lErr); end; //function DCMStr2Int procedure DCMStr2FloatNum (lBytes,lnFloats: integer); begin Str2FloatNum (DCMStr(lBytes), lnFloats); end; //function DCMStr2Float function DCMStr2Float (lBytes: integer): single; begin DCMStr2FloatNum (lBytes,1); result := lFloatRA[1]; end; //function DCMStr2Float procedure DCMStr2Float2 (lBytes: integer; var lF1,lF2: double); begin DCMStr2FloatNum (lBytes,3); lF1 := lFloatRA[1]; lF2 := lFloatRA[2]; end; //function DCMStr2Float2 procedure DCMStr2Float3 (lBytes: integer; var lF1,lF2,lF3: double); begin DCMStr2FloatNum (lBytes,3); lF1 := lFloatRA[1]; lF2 := lFloatRA[2]; lF3 := lFloatRA[3]; end; //function DCMStr2Float3 procedure DCMStr2Float6 (lBytes: integer; var lF1,lF2,lF3,lF4,lF5,lF6: double); begin DCMStr2FloatNum (lBytes,6); lF1 := lFloatRA[1]; lF2 := lFloatRA[2]; lF3 := lFloatRA[3]; lF4 := lFloatRA[4]; lF5 := lFloatRA[5]; lF6 := lFloatRA[6]; end; //function DCMStr2Float6 function DCMint (lBytes: integer): integer; //read 16 bit short integer begin if lBytes <= 2 then result := GetByte(lPos)+(GetByte(lPos+1) shl 8) //shortint vs word? else result := GetByte(lPos)+(GetByte(lPos+1) shl 8)+(GetByte(lPos+2) shl 16)+(GetByte(lPos+3) shl 24);; //byte order?? end; //function DCMint {$IFDEF ANON} Type TPosLen = RECORD //peristimulus plot Pos,Len: integer; end; procedure InitPosLen(var lPL: TPOsLen); begin lPL.Pos := 0; lPL.Len := 0; end; procedure SetPosLen(var lPL: TPosLen; lP,lL: integer); begin lPL.Pos := lP; lPL.Len := lL; end; procedure Anonymize(lStr: string; lPL: TPOsLen{lPos,lLen: integer}); var lDCMstr: string; lP,lL: integer; begin if ((lPL.Pos+lPL.Len) > lBufferSz) or (lPL.Len < 1) or (lPL.Pos < 1) then exit; lDCMStr := ''; lL := length(lStr); if lL > lPL.Len then lL := lPL.Len; lP := 1; while lP <= lL do begin lDCMStr := lDCMStr + lStr[lP]; inc(lP); end; while lP <= lPL.Len do begin //pad string lDCMStr := lDCMStr + ' '; inc(lP); end; for lP := 1 to lPL.Len do lByteRA^[lPL.Pos+lP] := Ord(lDCMstr[lP]); end; {$ENDIF} var lTempStr,lStr: string; lGroupElement: int64; lTemp,lLength,lEchoNum,lnVol: integer; lResearchMode: boolean; lThick: double; {$IFDEF ANON} //position and lengths of tags to anonymize lCreateDate,lName,lID,lDOB,lSex,lAge,lWt,lStudyDate,lSeriesDate,lAcqDate: TPosLen; {$ENDIF} begin //function fast_read_dicom_data {$IFDEF ANON} //position and lengths of tags to anonymize InitPosLen(lName); InitPosLen(lID); InitPosLen(lDOB); InitPosLen(lSex); InitPosLen(lAge); InitPosLen(lWt); InitPosLen(lStudyDate); InitPosLen(lSeriesDate); InitPosLen(lAcqDate); InitPosLen(lCreateDate); {$ENDIF} lnVol := 1; lEchoNum := 1; lThick := 0; clear_dicom_data(lDicomData); lDicomData.little_endian := 1; result := false; lResearchMode := false; lBufferError := false; if lFileSz < 1 then lFileSz := FSize(lFilename); lBufferSz := lFileSz-lOffset; if lBufferSz < 512 then begin //showmessage('Error: File too small '+lFilename); exit; end; if lBufferSz > kMaxBuf then lBufferSz := kMaxBuf; GetMem(lByteRA,kMaxBuf); lBufferSz := lBufferSz; AssignFile(lInFile, lFileName); FileMode := 0; //Set file access to read only Reset(lInFile, 1); seek(lInFile,lOffset); BlockRead(lInFile, lByteRA^[1], lBufferSz); CloseFile(lInFile); FileMode := 2; lBuffStart := lOffset; lPos := lOffset; if lOffset = 128 then begin //DICOM files start with DICM at 128, Siemens shadow headers do not if DCMStr(4) <> 'DICM' then begin Msg(DCMStr(4)+ ' <> DICM'); FreeMem(lByteRA); exit; end; lPos := lOffset + 4;//DICM read end;//Offset = 128 //next check VR if not( chr(GetByte(lPos+4)) in ['A'..'Z']) or not( chr(GetByte(lPos+5)) in ['A'..'Z']) then Msg('implicit VR untested'); //next check Endian lTemp := lPos; ReadGroupElementLength(lGroupElement,lLength); if lLength > kMax16bit then Msg('ByteSwapped'); lPos := lTemp; //end VR check result := true; while (lDICOMData.imagestart = 0) and (not lBufferError) do begin ReadGroupElementLength(lGroupElement,lLength); case lGroupElement of kTransferSyntax: begin lTempStr := (DCMStr(lLength)); if (length(lTempStr) >= 19) and (lTempStr[19] = '2') then lDicomData.little_endian := 0; end; kImageType : begin lTempStr := DCMStr(lLength); //read last word - ver\mosaic -> MOSAIC lStr := ''; lTemp := length(lTempStr); while (lTemp > 0) and (lTempStr[lTemp] in ['a'..'z','A'..'Z']) do begin lStr := upcase(lTempStr[lTemp])+lStr; dec(lTemp); end; if lStr = 'MOSAIC' then lDicomData.SiemensMosaicX := 2; //we need to read numaris for details... end; kStudyTime : lDicomData.StudyTime := DCMStr(lLength); {$IFDEF ANON} //position and lengths of tags to anonymize kCreateDate: begin SetPosLen(lCreateDate,lPos,lLength) end; kSeriesDate: begin SetPosLen(lSeriesDate,lPos,lLength) end; kAcqDate: begin SetPosLen(lAcqDate,lPos,lLength) end; kStudyDate: begin SetPosLen(lStudyDate,lPos,lLength) end; kPatientName : begin SetPosLen(lName,lPos,lLength) end; kPatientID : begin SetPosLen(lID,lPos,lLength) end; kPatientDOB : begin SetPosLen(lDOB,lPos,lLength) end; kPatientSex : begin SetPosLen(lSex,lPos,lLength) end; kPatientAge : begin SetPosLen(lAge,lPos,lLength) end; kPatientWt : begin SetPosLen(lWt,lPos,lLength) end; {$ELSE} kPatientName : lDicomData.PatientName := DCMStr(lLength); kStudyDate: lDicomData.StudyDate := DCMStr(lLength); {$ENDIF} kProtocolName : lDicomData.ProtocolName :=DCMStr(lLength); kPatientPos : lDicomData.PatientPos :=DCMStr(lLength); //should be HFS for Siemens = Head First Supine kSeriesNum : lDicomData.SeriesNum := DCMStr2Int(lLength); kAcquNum : lDicomData.AcquNum := DCMStr2Int(lLength); kSeq: begin if DCMStr(lLength) = 'RM' then lResearchMode := True; end; kImageNum : lDicomData.ImageNum := DCMStr2Int(lLength); kDim3 :lDicomData.XYZdim[3] := DCMStr2Int(lLength); kDim2 : lDicomData.XYZdim[2] := DCMint (lLength); kDim1 : lDicomData.XYZdim[1] := DCMint (lLength); kLocation : lDICOMData.Location := DCMStr2Float(lLength); kAlloc: lDicomData.Allocbits_per_pixel := DCMint (lLength); kTR : lDicomData.TR := DCMStr2Float(lLength); kTE: lDicomData.TE := DCMStr2Float(lLength); kEchoNum: lEchoNum := round (DCMStr2Float(lLength)); kSlope : lDICOMData.IntenScale := DCMStr2Float(lLength); kIntercept : lDICOMData.IntenIntercept := DCMStr2Float(lLength); kOrientation : DCMStr2Float6(lLength, lDicomData.Orient[1], lDicomData.Orient[2],lDicomData.Orient[3],lDicomData.Orient[4], lDicomData.Orient[5],lDicomData.Orient[6]); kPosition : DCMStr2Float3 (lLength,lDicomData.PatientPosX, lDicomData.PatientPosY,lDicomData.PatientPosZ); knVol: lnVol := round (DCMStr2Float(lLength)); kZThick: begin lThick := DCMStr2Float(lLength); lDICOMData.XYZmm[3] := lThick; end;//used differently by manufacturers kZSpacing: begin lDICOMData.XYZmm[3] := DCMStr2Float(lLength); if (lThick/2) > lDICOMdata.XYZmm[3] then lDICOMdata.XYZmm[3] := lDICOMdata.XYZmm[3] + lThick end; //used different by different manufacturers kXYSpacing: begin DCMStr2Float2 (lLength, lDICOMdata.XYZmm[2], lDICOMdata.XYZmm[1]); end; kCSAImageHeaderInfo: begin //order ICE,Acq,Num,Vector lDICOMdata.CSAImageHeaderInfoPos := lPos; lDICOMdata.CSAImageHeaderInfoSz := lLength; end; kSlicesPer3DVol: lDICOMData.SlicesPer3DVol := DCMint (lLength); kImageStart: lDICOMData.ImageStart := lPos ; //-1 as indexed from 0.. not 1.. end; //Case lGroupElement //Msg(VR+inttohex(lGroupElement and kMax16bit,4) +':'+inttohex( lGroupElement shr 16,4)+' '+inttostr(lLength)+'@'+inttostr(lPos) ); //msg(inttostr(lPos)+' '+inttostr(lLength)); lPos := lPos + (lLength); end; //while imagestart=0 and not error //clean up lDicomData.DateTime := StudyDateTime(lDicomData.StudyDate,lDicomData.StudyTime); if (lDicomData.SiemensMosaicX > 1) then lDicomData.AcquNum := 1; if (lEchoNum > 1) and (lEchoNum < 16) then lDicomData.AcquNum := lDicomData.AcquNum + (100*lEchoNum); if lResearchMode then lDicomData.SeriesNum := lDicomData.SeriesNum + 100; if (lDICOMData.SlicesPer3DVol > 0) and (lnVol > 1) and (lDicomdata.XYZdim[3] > 1) and (lDicomData.SlicesPer3DVol > 0)and ((lDicomdata.XYZdim[3] mod lDicomData.SlicesPer3DVol) = 0) then lDICOMdata.File4D := true; if not lBufferError then result := true; FreeMem(lByteRA); //Remaining portions only if anonymizing {$IFDEF ANON} Msg('Anonymizing DICOM '+extractfilename(lFilename)); lBufferSz := lFileSz; GetMem(lByteRA,lBufferSz); //read original AssignFile(lInFile, lFileName); FileMode := 0; //Set file access to read only Reset(lInFile, 1); //seek(lInFile,1); BlockRead(lInFile, lByteRA^[1], lBufferSz); CloseFile(lInFile); //anonymize... Anonymize ('ANONYMIZED',lName); Anonymize ('ANONYMIZED',lID); Anonymize('19890323',lDOB); //Cold Fusion YYYYMMDD Anonymize('19890323',lStudyDate); //Cold Fusion YYYYMMDD Anonymize('19890323',lAcqDate); //Cold Fusion YYYYMMDD Anonymize('19890323',lSeriesDate); //Cold Fusion YYYYMMDD Anonymize('19890323',lCreateDate); //Cold Fusion YYYYMMDD Anonymize('M',lSex); Anonymize('18',lAge); Anonymize('100',lWt); //write anonymized data... assignfile(lInFile, lFileName+'.dcm'); Filemode := 2; //read&write Rewrite(lInFile,1); BlockWrite(lInFile, lByteRA^[1],lBufferSz); CloseFile(lInFile); //clean up... FreeMem(lByteRA); {$ENDIF} end; //function fast_read_dicom_data function orientation_not_visible( lDICOMdata: DICOMdata) : boolean; var li : integer; lDICOMdataX: DICOMdata; begin result := false; clear_dicom_data(lDicomDataX); for li := 1 to 2 do //only XY-direction - as philips reports correct Z in header if lDICOMdata.XYZmm[li] <> lDICOMdataX.XYZmm[li] then exit; for li := 1 to 6 do if lDicomData.Orient[li] <> lDicomDataX.Orient[li] then exit; if lDicomData.PatientPosX <> lDicomDataX.PatientPosX then exit; if lDicomData.PatientPosY <> lDicomDataX.PatientPosY then exit; if lDicomData.PatientPosZ <> lDicomDataX.PatientPosZ then exit; result := true; end; procedure read_philips_hidden(var lFilename: string; lOffset,lLength: integer; var lDICOMdata: DICOMdata); var li : integer; lDICOMdataX: DICOMdata; begin if not fast_read_dicom_datax(lDICOMdataX, lOffset+8, lOffset+lLength, lFileName) then exit; //fx(lDICOMdataX.XYZmm[1],lDICOMdataX.XYZmm[2]); for li := 1 to 2 do //only XY-direction - as philips reports correct Z in header lDICOMdata.XYZmm[li] := lDICOMdataX.XYZmm[li]; for li := 1 to 6 do lDicomData.Orient[li] := lDicomDataX.Orient[li]; lDicomData.PatientPosX := lDicomDataX.PatientPosX; lDicomData.PatientPosY := lDicomDataX.PatientPosY; lDicomData.PatientPosZ := lDicomDataX.PatientPosZ; end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dicomfast.pas0000664000175000017500000004643011326434462021667 0ustar michaelmichaelunit dicomfast; {$H+} //this is x3 faster than the dicomcompat routines, but only works with well-behaved Explicit Little-Endian DICOM interface //0008,0070,ManufacturerID //Next values for Philips //Philips - must set 2001,105F length to 8 - allows reading of stack sequence // 2005,1071. Philips AP angulation // 2005,1072. Philips RL angulation // 2005,1073. Philips FH angulation //2001,100B Philips slice orientation (TRANSVERSAL, AXIAL, SAGITTAL) // Next values for GE //0019,10bb (or 0019,a0bb)= X diffusion direction //0019,10bc (or 0019,a0bc)= Y diffusion direction //0019,10bd (or 0019,a0bd)= Z diffusion direction //0018,1312 = phase encoding. uses {$IFNDEF FPC}Controls, {$ENDIF} SysUtils,define_types,classes,dicomtypes; function fast_read_dicom_data(var lDICOMdata: DICOMdata; lOffset: integer; var lFileName: string): boolean; //x3 faster! implementation uses dialogsx; {$DEFINE ANON} function fast_read_dicom_data(var lDICOMdata: DICOMdata; lOffset: integer; var lFileName: string): boolean; label 999; const kMaxBuf = (256*256)-1; //bytes kMax16bit = (256*256)-1; kImageType = $0008+($0008 shl 16 ); kStudyDate = $0008+($0020 shl 16 ); kSeriesDate = $0008+($0021 shl 16 ); kAcqDate = $0008+($0022 shl 16 ); kCreateDate = $0008+($0012 shl 16 ); kStudyTime = $0008+($0030 shl 16 ); kPatientName = $0010+($0010 shl 16 ); {$IFDEF ANON} //position and lengths of tags to anonymize kPatientID = $0010+($0020 shl 16 ); kPatientDOB = $0010+($0030 shl 16 ); kPatientSex = $0010+($0040 shl 16 ); kPatientAge = $0010+($1010 shl 16 ); kPatientWt = $0010+($1030 shl 16 ); {$ENDIF} kSeq = $0018+($0020 shl 16 ); kZThick = $0018+($0050 shl 16 ); kTR = $0018+($0080 shl 16 ); kTE = $0018+($0081 shl 16 ); kEchoNum = $0018+($0086 shl 16 ); kZSpacing = $0018+($0088 shl 16 ); kProtocolName = $0018+($1030shl 16 ); kPatientPos = $0018+($5100 shl 16 ); kSeriesNum = $0020+($0011 shl 16 ); kAcquNum = $0020+($0012 shl 16 ); kImageNum = $0020+($0013 shl 16 ); kOrientation = $0020+($0037 shl 16 ); kLocation = $0020+($1041 shl 16 ); kDim3 = $0028+($0008 shl 16 ); kDim2 = $0028+($0010 shl 16 ); kDim1 = $0028+($0011 shl 16 ); kXYSpacing = $0028+($0030 shl 16 ); kPosition = $0020+($0032 shl 16 ); knVol = $0020+($0105 shl 16 ); kAlloc = $0028+($0100 shl 16 ); kIntercept = $0028+($1052 shl 16 ); kSlope = $0028+($1053 shl 16 ); kCSAImageHeaderInfo = $0029+($1010 shl 16 ); kSlicesPer3DVol = $2001+($1018 shl 16 ); kTransferSyntax = $0002+($0010 shl 16); kImageStart = $7FE0+($0010 shl 16 ); kMaxFloats = 6; var vr : array [1..2] of Char; lFailure: boolean; lByteRA: Bytep; lFloatRA: array [1..kMaxFloats] of double; lBufferSz,lPos,lFileSz,lBuffStart: integer; lInFile: file; lBufferError: boolean; procedure Str2FloatNum ( lStr: string; lnFloats: integer); var lFStr: string; lP,lnF: integer; begin if (length(lStr) < 1) or (lnFloats < 1) or (lnFloats > kMaxFloats) then exit; for lnF := 1 to lnFloats do lFloatRA[lnF] := 1; lStr := lStr + ' '; //terminator lFStr := ''; lP := 1; lnF:= 0; while lP <= length(lStr) do begin if lStr[lP] in ['+','-','0'..'9','.','e','E'] then lFStr := lFStr + lStr[lP] else if (lFStr <> '') then begin inc(lnF); //if lnFloats = 6 then showmessage(lFStr); try lFloatRA[lnF] := strtofloat(lFStr); except on EConvertError do lFloatRA[lnF] := 1; end;//except if lnF = lnFloats then exit; lFStr := ''; end; inc(lP); end; end; //function Str2Float function GetByte (lFilePos: integer): byte; var lBufPos: integer; begin //the following error checking slows down reads a lot! //a simpler alternative would be to make the buffer size the same size as the entire image... //the current strategy saves memory and is faster for large images with small headers if lFilepos > lFileSz then begin lBufferError := true; result := 0; exit; end; lBufPos := lFilepos - lBuffStart+1; if (lBufPos > lBufferSz) or (lBufPos < 1) then begin //reload buffer if (lFilePos < 0) or (lFilePos > lFileSz) then begin lBuffStart := lFilePos; lBufPos := 1; msg(lFileName); lFailure := true; Msg('Error: buffer overrun in DICOM read.'); exit; end; if lFilePos+kMaxBuf > lFileSz then lBufferSz := lFileSz - (lFilePos) else lBufferSz := kMaxBuf; //read remaining //fx(lFilepos,kMaxBuf); AssignFile(lInFile, lFileName); FileMode := 0; //Set file access to read only Reset(lInFile, 1); seek(lInFile,lFilePos); BlockRead(lInFile, lByteRA^[1], lBufferSz); CloseFile(lInFile); FileMode := 2; lBuffStart := lFilePos; lBufPos := 1; end; result := lByteRA^[lBufPos]; end; function ReadInt4: integer; begin if lDicomData.little_endian = 0 then result := GetByte(lPos+3)+(GetByte(lPos+2) shl 8)+(GetByte(lPos+1) shl 16)+(GetByte(lPos) shl 24) else result := GetByte(lPos)+(GetByte(lPos+1) shl 8)+(GetByte(lPos+2) shl 16)+(GetByte(lPos+3) shl 24); inc(lPos,4); end; //function Read4 procedure ReadGroupElementLength(var lGroupElement,lLength: integer); begin lGroupElement := ReadInt4; vr[1] := chr(GetByte(lPos)); vr[2] := chr(GetByte(lPos+1)); //msg(' '+InttoHex(lGroupElement,8)+' '+inttostr(lLength)+' '+VR+ inttostr(GetByte(lPos+2))); if (vr[2] < 'A') then begin //implicit vr with 32-bit length lLength := ReadInt4; exit; end; //if vr = 'UN' then if (vr = 'OB') or (vr = 'OW') or (vr = 'SQ') or (vr = 'UN') then begin {explicit VR with 32-bit length} lPos := lPos + 4; {skip 2 byte string and 2 reserved bytes = 4 bytes = 2 words} lLength := ReadInt4;//Ord4(buf[lPos]) + $100 * (buf[lPos+1] + $100 * (buf[lPos+2] + $100 * buf[lPos+3])) end else begin {explicit VR with 16-bit length} if lDicomData.little_endian = 0 then lLength := (GetByte(lPos+3))+(GetByte(lPos+2) shl 8) else lLength := (GetByte(lPos+2))+(GetByte(lPos+3) shl 8);//GetLength := Ord4(buf[i+2]) + $100 * (buf[i+3]); lPos := lPos + 4; {skip 2 byte string and 2 length bytes = 4 bytes = 2 words} end; // msg(InttoHex(lGroupElement,8)+' '+inttostr(lLength)+' '+VR+ inttostr(GetByte(lPos+2)) + 'x'+inttostr(GetByte(lPos+3)) ); end; //procedure ReadGroupElementLength function DCMStr(lBytes: integer): string; var lC: integer; begin result := ''; if lBytes < 1 then exit; for lC := lPos to (lPos+(lBytes-1)) do result := result + char(GetByte(lC)); for lC := 1 to lBytes do if result[lC] in ['+','-','/','\',' ','0'..'9','a'..'z','A'..'Z','.'] then else result[lC] := ' '; end; //function DCMStr function DCMStr2Int (lBytes: integer): integer; var lErr: integer; lStr: string; begin lStr := DCMStr(lBytes); Val(lStr,result,lErr); end; //function DCMStr2Int procedure DCMStr2FloatNum (lBytes,lnFloats: integer); begin Str2FloatNum (DCMStr(lBytes), lnFloats); end; //function DCMStr2Float function DCMStr2Float (lBytes: integer): single; begin DCMStr2FloatNum (lBytes,1); result := lFloatRA[1]; end; //function DCMStr2Float procedure DCMStr2Float2 (lBytes: integer; var lF1,lF2: double); begin DCMStr2FloatNum (lBytes,3); lF1 := lFloatRA[1]; lF2 := lFloatRA[2]; end; //function DCMStr2Float2 procedure DCMStr2Float3 (lBytes: integer; var lF1,lF2,lF3: double); begin DCMStr2FloatNum (lBytes,3); lF1 := lFloatRA[1]; lF2 := lFloatRA[2]; lF3 := lFloatRA[3]; end; //function DCMStr2Float3 procedure DCMStr2Float6 (lBytes: integer; var lF1,lF2,lF3,lF4,lF5,lF6: double); begin DCMStr2FloatNum (lBytes,6); lF1 := lFloatRA[1]; lF2 := lFloatRA[2]; lF3 := lFloatRA[3]; lF4 := lFloatRA[4]; lF5 := lFloatRA[5]; lF6 := lFloatRA[6]; end; //function DCMStr2Float6 function DCMint (lBytes: integer): integer; //read 16 bit short integer begin if lBytes <= 2 then result := GetByte(lPos)+(GetByte(lPos+1) shl 8) //shortint vs word? else result := GetByte(lPos)+(GetByte(lPos+1) shl 8)+(GetByte(lPos+2) shl 16)+(GetByte(lPos+3) shl 24);; //byte order?? end; //function DCMint {$IFDEF ANON} Type TPosLen = RECORD //peristimulus plot Pos,Len: integer; end; procedure InitPosLen(var lPL: TPOsLen); begin lPL.Pos := 0; lPL.Len := 0; end; procedure SetPosLen(var lPL: TPosLen; lP,lL: integer); begin lPL.Pos := lP; lPL.Len := lL; end; procedure Anonymize(lStr: string; lPL: TPOsLen{lPos,lLen: integer}); var lDCMstr: string; lP,lL: integer; begin if ((lPL.Pos+lPL.Len) > lBufferSz) or (lPL.Len < 1) or (lPL.Pos < 1) then exit; lDCMStr := ''; lL := length(lStr); if lL > lPL.Len then lL := lPL.Len; lP := 1; while lP <= lL do begin lDCMStr := lDCMStr + lStr[lP]; inc(lP); end; while lP <= lPL.Len do begin //pad string lDCMStr := lDCMStr + ' '; inc(lP); end; for lP := 1 to lPL.Len do lByteRA^[lPL.Pos+lP] := Ord(lDCMstr[lP]); end; (*procedure AnonymizeDate(lStr: string; lPos,lLen: integer); var lDCMstr: string; lP,lL,lDateLen: integer; begin Anonymize(lStr, lPos,lLen); //put 19730316 into date field -Lauterbur paper published in Nature lDCMstr := '19730316'; lDateLen := length(lDCMStr); if ((lPos+lLen) > lBufferSz) or (lLen < lDateLen) or (lPos < 1) then exit; for lP := 1 to lDateLen do lByteRA^[lPos+lP] := Ord(lDCMstr[lP]); end;*) {$ENDIF} var lTempStr,lStr: string; lTemp,lGroupElement,lLength,lEchoNum,lnVol: integer; lResearchMode: boolean; lThick: double; {$IFDEF ANON} //position and lengths of tags to anonymize lCreateDate,lName,lID,lDOB,lSex,lAge,lWt,lStudyDate,lSeriesDate,lAcqDate: TPosLen; {$ENDIF} begin //function fast_read_dicom_data {$IFDEF ANON} //position and lengths of tags to anonymize InitPosLen(lName); InitPosLen(lID); InitPosLen(lDOB); InitPosLen(lSex); InitPosLen(lAge); InitPosLen(lWt); InitPosLen(lStudyDate); InitPosLen(lSeriesDate); InitPosLen(lAcqDate); InitPosLen(lCreateDate); {$ENDIF} lFailure := false; lnVol := 1; lEchoNum := 1; lThick := 0; clear_dicom_data(lDicomData); lDicomData.little_endian := 1; result := false; lResearchMode := false; lBufferError := false; lFileSz := FSize(lFilename); lBufferSz := lFileSz-lOffset; if lBufferSz < 512 then begin //showmessage('Error: File too small '+lFilename); exit; end; if lBufferSz > kMaxBuf then lBufferSz := kMaxBuf; GetMem(lByteRA,kMaxBuf); lBufferSz := lBufferSz; AssignFile(lInFile, lFileName); FileMode := 0; //Set file access to read only Reset(lInFile, 1); seek(lInFile,lOffset); BlockRead(lInFile, lByteRA^[1], lBufferSz); CloseFile(lInFile); FileMode := 2; lBuffStart := lOffset; lPos := lOffset; if lOffset = 128 then begin //DICOM files start with DICM at 128, Siemens shadow headers do not if DCMStr(4) <> 'DICM' then begin Msg(DCMStr(4)+ ' <> DICM'); FreeMem(lByteRA); exit; end; lPos := lOffset + 4;//DICM read end;//Offset = 128 //next check VR if not( chr(GetByte(lPos+4)) in ['A'..'Z']) or not( chr(GetByte(lPos+5)) in ['A'..'Z']) then Msg('implicit VR untested'); //next check Endian lTemp := lPos; ReadGroupElementLength(lGroupElement,lLength); if lLength > kMax16bit then Msg('ByteSwapped'); lPos := lTemp; //end VR check while (lDICOMData.imagestart = 0) and (not lBufferError) do begin ReadGroupElementLength(lGroupElement,lLength); if lFailure then goto 999; case lGroupElement of kTransferSyntax: begin lTempStr := (DCMStr(lLength)); if (length(lTempStr) >= 19) and (lTempStr[19] = '2') then lDicomData.little_endian := 0; end; kImageType : begin lTempStr := DCMStr(lLength); //read last word - ver\mosaic -> MOSAIC lStr := ''; lTemp := length(lTempStr); while (lTemp > 0) and (lTempStr[lTemp] in ['a'..'z','A'..'Z']) do begin lStr := upcase(lTempStr[lTemp])+lStr; dec(lTemp); end; if lStr = 'MOSAIC' then lDicomData.SiemensMosaicX := 2; //we need to read numaris for details... end; kStudyTime : lDicomData.StudyTime := DCMStr(lLength); {$IFDEF ANON} //position and lengths of tags to anonymize kCreateDate: begin SetPosLen(lCreateDate,lPos,lLength) end; kSeriesDate: begin SetPosLen(lSeriesDate,lPos,lLength) end; kAcqDate: begin SetPosLen(lAcqDate,lPos,lLength) end; kStudyDate: begin SetPosLen(lStudyDate,lPos,lLength) end; kPatientName : begin SetPosLen(lName,lPos,lLength) end; kPatientID : begin SetPosLen(lID,lPos,lLength) end; kPatientDOB : begin SetPosLen(lDOB,lPos,lLength) end; kPatientSex : begin SetPosLen(lSex,lPos,lLength) end; kPatientAge : begin SetPosLen(lAge,lPos,lLength) end; kPatientWt : begin SetPosLen(lWt,lPos,lLength) end; {$ELSE} kPatientName : lDicomData.PatientName := DCMStr(lLength); kStudyDate: lDicomData.StudyDate := DCMStr(lLength); {$ENDIF} kProtocolName : lDicomData.ProtocolName :=DCMStr(lLength); kPatientPos : lDicomData.PatientPos :=DCMStr(lLength); //should be HFS for Siemens = Head First Supine kSeriesNum : lDicomData.SeriesNum := DCMStr2Int(lLength); kAcquNum : lDicomData.AcquNum := DCMStr2Int(lLength); kSeq: begin if DCMStr(lLength) = 'RM' then lResearchMode := True; end; kImageNum : lDicomData.ImageNum := DCMStr2Int(lLength); kDim3 :lDicomData.XYZdim[3] := DCMStr2Int(lLength); kDim2 : lDicomData.XYZdim[2] := DCMint (lLength); kDim1 : lDicomData.XYZdim[1] := DCMint (lLength); kLocation : lDICOMData.Location := DCMStr2Float(lLength); kAlloc: lDicomData.Allocbits_per_pixel := DCMint (lLength); kTR : lDicomData.TR := DCMStr2Float(lLength); kTE: lDicomData.TE := DCMStr2Float(lLength); kEchoNum: lEchoNum := round (DCMStr2Float(lLength)); kSlope : lDICOMData.IntenScale := DCMStr2Float(lLength); kIntercept : lDICOMData.IntenIntercept := DCMStr2Float(lLength); kOrientation : DCMStr2Float6(lLength, lDicomData.Orient[1], lDicomData.Orient[2],lDicomData.Orient[3],lDicomData.Orient[4], lDicomData.Orient[5],lDicomData.Orient[6]); kPosition : DCMStr2Float3 (lLength,lDicomData.PatientPosX, lDicomData.PatientPosY,lDicomData.PatientPosZ); knVol: lnVol := round (DCMStr2Float(lLength)); kZThick: begin lThick := DCMStr2Float(lLength); lDICOMData.XYZmm[3] := lThick; end;//used differently by manufacturers kZSpacing: begin lDICOMData.XYZmm[3] := DCMStr2Float(lLength); if (lThick/2) > lDICOMdata.XYZmm[3] then lDICOMdata.XYZmm[3] := lDICOMdata.XYZmm[3] + lThick end; //used different by different manufacturers kXYSpacing: DCMStr2Float2 (lLength, lDICOMdata.XYZmm[2], lDICOMdata.XYZmm[1]); kCSAImageHeaderInfo: begin //order ICE,Acq,Num,Vector lDICOMdata.CSAImageHeaderInfoPos := lPos; lDICOMdata.CSAImageHeaderInfoSz := lLength; end; kSlicesPer3DVol: lDICOMData.SlicesPer3DVol := DCMint (lLength); kImageStart: lDICOMData.ImageStart := lPos ; //-1 as indexed from 0.. not 1.. end; //Case lGroupElement //Msg(VR+inttohex(lGroupElement and kMax16bit,4) +':'+inttohex( lGroupElement shr 16,4)+' '+inttostr(lLength)+'@'+inttostr(lPos) ); lPos := lPos + (lLength); end; //while imagestart=0 and not error //clean up lDicomData.DateTime := StudyDateTime(lDicomData.StudyDate,lDicomData.StudyTime); if (lDicomData.SiemensMosaicX > 1) then lDicomData.AcquNum := 1; if (lEchoNum > 1) and (lEchoNum < 16) then lDicomData.AcquNum := lDicomData.AcquNum + (100*lEchoNum); if lResearchMode then lDicomData.SeriesNum := lDicomData.SeriesNum + 100; if (lDICOMData.SlicesPer3DVol > 0) and (lnVol > 1) and (lDicomdata.XYZdim[3] > 1) and (lDicomData.SlicesPer3DVol > 0)and ((lDicomdata.XYZdim[3] mod lDicomData.SlicesPer3DVol) = 0) then lDICOMdata.File4D := true; if not lBufferError then result := true; FreeMem(lByteRA); //Remaining portions only if anonymizing {$IFDEF ANON} Msg('Anonymizing DICOM '+extractfilename(lFilename)); lBufferSz := lFileSz; GetMem(lByteRA,lBufferSz); //read original AssignFile(lInFile, lFileName); FileMode := 0; //Set file access to read only Reset(lInFile, 1); //seek(lInFile,1); BlockRead(lInFile, lByteRA^[1], lBufferSz); CloseFile(lInFile); //anonymize... Anonymize ('ANONYMIZED',lName); Anonymize ('ANONYMIZED',lID); Anonymize('19890323',lDOB); //Cold Fusion YYYYMMDD Anonymize('19890323',lStudyDate); //Cold Fusion YYYYMMDD Anonymize('19890323',lAcqDate); //Cold Fusion YYYYMMDD Anonymize('19890323',lSeriesDate); //Cold Fusion YYYYMMDD Anonymize('19890323',lCreateDate); //Cold Fusion YYYYMMDD Anonymize('M',lSex); Anonymize('18',lAge); Anonymize('100',lWt); //write anonymized data... assignfile(lInFile, lFileName+'.dcm'); Filemode := 2; //read&write Rewrite(lInFile,1); BlockWrite(lInFile, lByteRA^[1],lBufferSz); CloseFile(lInFile); //clean up... 999: FreeMem(lByteRA); {$ENDIF} end; //function fast_read_dicom_data end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dicomcompat.pas0000664000175000017500000075671511751724702022234 0ustar michaelmichaelunit dicomcompat; interface uses {$Define NoTroubleshoot} {$IFDEF FPC} gzio2, {$ELSE} gziod, {$ENDIF} SysUtils,Classes,define_types,filename,dicomtypes,dicomfastread,prefs,convertsimple; {$H+} var kUseDateTimeForID: boolean = false; procedure read_afni_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string; var lRotation1,lRotation2,lRotation3: integer); procedure read_ecat_data(var lDICOMdata: DICOMdata;lVerboseRead,lReadECAToffsetTables:boolean; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); procedure read_siemens_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); procedure read_ge_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); procedure read_interfile_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string); procedure read_voxbo_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string); procedure read_VFF_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string); procedure read_picker_data(lVerboseRead: boolean; var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); procedure read_tiff_data(var lDICOMdata: DICOMdata; var lReadOffsets,lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); procedure read_dicom_data_compat(lReadJPEGtables,lVerboseRead,lAutoDECAT7,lReadECAToffsetTables,lAutodetectInterfile,lAutoDetectGenesis,lReadColorTables: boolean; var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string; var lPrefs: TPrefs); var gSizeMMWarningShown : boolean = false; gECATJPEG_table_entries: integer = 0; gECATJPEG_pos_table,gECATJPEG_size_table : LongIntP; red_table_size : Integer = 0; green_table_size : Integer = 0; blue_table_size : Integer = 0; red_table : ByteP; green_table : ByteP; blue_table : ByteP; implementation uses dialogsx; function SecSinceMidnightFloat (lStr: string): double; var lNumStr: string; sec: double; i,len,dec: integer; begin result := 0;//error if lStr = '' then exit; len := length(lStr); lNumStr := ''; for i := 1 to len do begin if (lStr[i] = '.') or (lStr[i] = ',') then lStr[i] := DecimalSeparator; //make native format, e.g. in Germany 10,123 whereas in USA 10.123 if lStr[i] in ['0'..'9',DecimalSeparator] then lNumStr := lNumStr + lStr[i]; end; if lNumStr = '' then exit; //make sure 6 characters before decimal, in case HHMMSS is written HMMSS dec := length(lNumStr) + 1; for i := length(lNumStr) downto 1 do if lNumStr[i] = DecimalSeparator then dec := i; if dec > 7 then exit; //HHMMSS.??? can only have 6 digits before decimal while dec < 7 do begin lNumStr := '0'+lNumStr; inc(dec); end; //now in HHMMSS.????? format len := length(lNumStr); lStr := lNumStr[1]+lNumStr[2]; //HH sec := 60 * 60 * strtoint(lStr); //60m/h, 60s/m lStr := lNumStr[3]+lNumStr[4]; //MM sec := sec + ( 60 * strtoint(lStr)); //60s/m 1000ms/s lStr := ''; for i := 5 to len do //SS.SSSS lStr := lStr + lNumStr[i]; sec := sec + ( strtofloat(lStr)); //60s/m 1000ms/s result := sec; end; procedure read_ecat_data(var lDICOMdata: DICOMdata;lVerboseRead,lReadECAToffsetTables:boolean; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); label 121,539; const kMaxnSLices = 6000; kStrSz = 40; var lLongRA: LongIntp; lECAT7sigUpcase,lECAT7sig : array [0..6] of Char; lParse,lSPos,lFPos{,lScomplement},lF,lS,lYear,lFrames,lVox,lHlfVox,lJ,lPass,lVolume,lNextDirectory,lSlice,lSliceSz,lVoxelType,lPos,lEntry, lSlicePos,lLongRApos,lLongRAsz,{lSingleRApos,lSingleRAsz,}{lMatri,}lX,lY,lZ,lCacheSz,lImgSz,lSubHeadStart,lMatrixStart,lMatrixEnd,lInt,lInt2,lInt3,lINt4,n,filesz: LongInt; lPlanes,lGates,lAqcType,lFileType: word; lXmm,lYmm,lZmm,lCalibrationFactor, lQuantScale: real; FP: file; lCreateTable,lSwapBytes,lMR,lECAT6: boolean; function xWord(lPos: longint): word; var s: word; begin seek(fp,lPos); BlockRead(fp, s, 2, n); if lSwapBytes then result := swap(s) else result := s; //assign address of s to inguy end; function swap32i(lPos: longint): Longint; type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(Long:LongInt); end; swaptypep = ^swaptype; var s : LongInt; inguy:swaptypep; outguy:swaptype; begin seek(fp,lPos); BlockRead(fp, s, 4, n); inguy := @s; //assign address of s to inguy if not lSwapBytes then begin result := inguy^.long; exit; end; outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); swap32i:=outguy.Long; end; function StrRead (lPos, lSz: longint) : string; var I: integer; tx : array [1..kStrSz] of Char; begin result := ''; if lSz > kStrSz then exit; seek(fp, lPos{-1}); BlockRead(fp, tx, lSz*SizeOf(Char), n); for I := 1 to (lSz-1) do begin if tx[I] in [' ','[',']','+','-','.','\','~','/', '0'..'9','a'..'z','A'..'Z'] then {if (tx[I] <> kCR) and (tx[I] <> UNIXeoln) then} result := result + tx[I]; end; end; function fswap4r (lPos: longint): single; type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(float:single); end; swaptypep = ^swaptype; var s:single; inguy:swaptypep; outguy:swaptype; begin seek(fp,lPos); if not lSwapBytes then begin BlockRead(fp, result, 4, n); exit; end; BlockRead(fp, s, 4, n); inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); fswap4r:=outguy.float; end; function fvax4r (lPos: longint): single; type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(float:single); end; swaptypep = ^swaptype; var s:single; lT1,lT2 : word; inguy:swaptypep; begin seek(fp,lPos); BlockRead(fp, s, 4, n); inguy := @s; if (inguy^.Word1 =0) and (inguy^.Word2 = 0) then begin result := 0; exit; end; lT1 := inguy^.Word1 and $80FF; lT2 := ((inguy^.Word1 and $7F00) +$FF00) and $7F00; inguy^.Word1 := inguy^.Word2; inguy^.Word2 := (lt1+lT2); fvax4r:=inguy^.float; end; begin Clear_Dicom_Data(lDicomData); if gECATJPEG_table_entries <> 0 then begin freemem (gECATJPEG_pos_table); freemem (gECATJPEG_size_table); gECATJPEG_table_entries := 0; end; lHdrOK:= false; lQuantScale:= 1; lCalibrationFactor := 1; lLongRASz := 0; lLongRAPos := 0; lImageFormatOK := false; lVolume := 1; if not fileexists(lFileName) then begin Msg('Unable to find the image '+lFileName); exit; end; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); FileSz := FileSize(fp); if filesz < (2048) then begin Msg('This file is to small to be a ECAT format image.'); goto 539; end; seek(fp, 0); BlockRead(fp, lECAT7Sig, 6*SizeOf(Char){, n}); for lInt4 := 0 to (5) do begin if lECAT7Sig[lInt4] in ['a'..'z','A'..'Z'] then lECAT7SigUpCase[lInt4] := upcase(lECAT7Sig[lInt4]) else lECAT7SigUpCase[lInt4] := ' '; end; if (lECAT7SigUpCase[0]='M') and (lECAT7SigUpCase[1]='A') and (lECAT7SigUpCase[2]='T') and (lECAT7SigUpCase[3]='R') and (lECAT7SigUpCase[4]='I') and (lECAT7SigUpCase[5]='X') then lECAT6 := false else lECAT6 := true; if lEcat6 then begin lSwapBytes := false; lFileType := xWord(27*2); if lFileType > 255 then lSwapBytes := not lSwapBytes; lFileType := xWord(27*2); lAqcType := xWord(175*2); lPlanes := xWord(188*2); lFrames := xword(189*2); lGates := xWord(190*2); lYear := xWord(70); if (lPlanes < 1) or (lFrames < 1) or (lGates < 1) then begin case MsgDlg('Warning: one of the planes/frames/gates values is less than 1 ['+inttostr(lPlanes)+'/'+inttostr(lFrames)+'/'+inttostr(lGates)+']. Is this file really ECAT 6 format? Press abort to cancel conversion. ', mterror,[mbOK,mbAbort], 0) of mrAbort: goto 539; end; //case end else if (lYear < 1940) or (lYear > 3000) then begin case MsgDlg('Warning: the year value appears invalid ['+inttostr(lYear)+']. Is this file really ECAT 6 format? Press abort to cancel conversion. ', mterror,[mbOK,mbAbort], 0) of mrAbort: goto 539; end; //case end; if lVerboseRead then begin lDynStr :='ECAT6 data'; lDynStr :=lDynStr+kCR+('Patient Name:'+StrRead(190,32)); lDynStr :=lDynStr+kCR+('Patient ID:'+StrRead(174,16)); lDynStr :=lDynStr+kCR+('Study Desc:'+StrRead(318,32)); lDynStr := lDynStr+kCR+('Facility: '+StrRead(356,20)); lDynStr := lDynStr+kCR+('Planes: '+inttostr(lPlanes)); lDynStr := lDynStr+kCR+('Frames: '+inttostr(lFrames)); lDynStr := lDynStr+kCR+('Gates: '+inttostr(lGates)); lDynStr := lDynStr+kCR+('Date DD/MM/YY: '+ inttostr(xWord(66))+'/'+inttostr(xWord(68))+'/'+inttostr(lYear)); end; {show summary} end else begin //NOT ECAT6 lSwapBytes := true; lFileType := xWord(50); if lFileType > 255 then lSwapBytes := not lSwapBytes; lFileType := xWord(50); lAqcType := xWord(328); lPlanes := xWord(352); lFrames := xWord(354); lGates := xWord(356); lCalibrationFactor := fswap4r(144); if {(true) or} (lPlanes < 1) or (lFrames < 1) or (lGates < 1) then begin case MsgDlg('Warning: on of the planes/frames/gates values is less than 1 ['+inttostr(lPlanes)+'/'+inttostr(lFrames)+'/'+inttostr(lGates)+']. Is this file really ECAT 7 format? Press abort to cancel conversion. ', mterror,[mbOK,mbAbort], 0) of mrAbort: goto 539; end; //case end; //error if lVerboseRead then begin lDynStr := 'ECAT 7 format'; lDynStr := lDynStr+kCR+('Serial Number:'+StrRead(52,10)); lDynStr := lDynStr+kCR+('Patient Name:'+StrRead(182,32)); lDynStr := lDynStr+kCR+('Patient ID:'+StrRead(166,16)); lDynStr := lDynStr+kCR+('Study Desc:'+StrRead(296,32)); lDynStr := lDynStr+kCR+('Facility: '+StrRead(332,20)); lDynStr := lDynStr+kCR+('Scanner: '+inttostr(xWord(48))); lDynStr := lDynStr+kCR+('Planes: '+inttostr(lPlanes)); lDynStr := lDynStr+kCR+('Frames: '+inttostr(lFrames)); lDynStr := lDynStr+kCR+('Gates: '+inttostr(lGates)); lDynStr := lDynStr+kCR+'Calibration: '+floattostr(lCalibrationFactor); end; {lShow Summary} end; //lECAT7 if lFiletype = 9 then lFiletype := 7; //1364: treat projections as Volume16's if not (lFileType in [1,2,3,4,7]) then begin Msg('This software does not recognize the ECAT file type. Selected filetype: '+inttostr(lFileType)); goto 539; end; lVoxelType := 2; if lFileType = 3 then lVoxelType := 4; if lVerboseRead then begin case lFileType of 1: lDynStr := lDynStr+kCR+('File type: Scan File'); 2: lDynStr := lDynStr+kCR+('File type: Image File'); //x 3: lDynStr := lDynStr+kCR+('File type: Attn File'); 4: lDynStr := lDynStr+kCR+('File type: Norm File'); 7: lDynStr := lDynStr+kCR+('File type: Volume 16'); //x end; //lfiletye case case lAqcType of 1:lDynStr := lDynStr+kCR+('Acquisition type: Blank'); 2:lDynStr := lDynStr+kCR+('Acquisition type: Transmission'); 3:lDynStr := lDynStr+kCR+('Acquisition type: Static Emission'); 4:lDynStr := lDynStr+kCR+('Acquisition type: Dynamic Emission'); 5:lDynStr := lDynStr+kCR+('Acquisition type: Gated Emission'); 6:lDynStr := lDynStr+kCR+('Acquisition type: Transmission Rect'); 7:lDynStr := lDynStr+kCR+('Acquisition type: Emission Rect'); 8:lDynStr := lDynStr+kCR+('Acquisition type: Whole Body Transm'); 9:lDynStr := lDynStr+kCR+('Acquisition type: Whole Body Static'); else lDynStr := lDynStr+kCR+('Acquisition type: Undefined'); end; //case AqcType end; //verbose read if ((lECAT6) and (lFiletype =2)) or ({(not lECAT6) and} (lFileType=7)) then //Kludge else begin Msg('Unusual ECAT filetype. Please contact the author.'); goto 539; end; lHdrOK:= true; lImageFormatOK := true; lLongRASz := kMaxnSlices * sizeof(longint); getmem(lLongRA,lLongRAsz); lPos := 512; //lSingleRASz := kMaxnSlices * sizeof(single); //getmem(lSingleRA,lSingleRAsz); //lMatri := 0; lVolume := 1; lPass := 0; 121: lEntry := 1; lInt := swap32i(lPos); lInt2 := swap32i(lPos+4); lNextDirectory := lInt2; while true do begin inc(lEntry); lPos := lPos + 16; lInt := swap32i(lPos); lInt2 := swap32i(lPos+4); lInt3 := swap32i(lPos+8); lInt4 := swap32i(lPos+12); lInt2 := lInt2 - 1; lSubHeadStart := lINt2 *512; lMatrixStart := ((lInt2) * 512)+512 {add subhead sz}; lMatrixEnd := lInt3 * 512; if (lInt4 = 1) and (lMatrixStart < FileSz) and (lMatrixEnd <= FileSz) then begin if (lFileType= 7) {or (lFileType = 4) } or (lFileType = 2) then begin //Volume of 16-bit integers if lEcat6 then begin lX := xWord(lSubHeadStart+(66*2)); lY := xWord(lSubHeadStart+(67*2)); lZ := 1;//uxWord(lSubHeadStart+8); lXmm := 10*fvax4r(lSubHeadStart+(92*2));// fswap4r(lSubHeadStart+(92*2)); lYmm := lXmm;//read32r(lSubHeadStart+(94*2)); lZmm := 10 * fvax4r(lSubHeadStart+(94*2)); lCalibrationFactor := fvax4r(lSubHeadStart+(194*2)); lQuantScale := fvax4r(lSubHeadStart+(86*2)); if lVerboseRead then lDynStr := lDynStr+kCR+'Plane '+inttostr(lPass+1)+' Calibration/Scale Factor: '+floattostr(lCalibrationFactor)+'/'+floattostr(lQuantScale); end else begin //02 or 07 lX := xWord(lSubHeadStart+4); lY := xWord(lSubHeadStart+6); lZ := xWord(lSubHeadStart+8); //if lFileType <> 4 then begin lXmm := 10*fswap4r(lSubHeadStart+34); lYmm := 10*fswap4r(lSubHeadStart+38); lZmm := 10*fswap4r(lSubHeadStart+42); lQuantScale := fswap4r(lSubHeadStart+26); if lVerboseRead then lDynStr := lDynStr+kCR+'Volume: '+inttostr(lPass+1)+' Scale Factor: '+floattostr(lQuantScale); //end; //filetype <> 4 end; //ecat7 if true then begin //FileMode := 2; //set to read/write inc(lPass); lImgSz := lX * lY * lZ * lVoxelType; {2 bytes per voxel} lSliceSz := lX * lY * lVoxelType; if lZ < 1 then begin lHdrOK := false; goto 539; end; lSlicePos := lMatrixStart; if ((lECAT6) and (lPass = 1)) or ( (not lECAT6)) then begin lDICOMdata.XYZdim[1] := lX; lDICOMdata.XYZdim[2] := lY; lDICOMdata.XYZdim[3] := lZ; lDICOMdata.XYZmm[1] := lXmm; lDICOMdata.XYZmm[2] := lYmm; lDICOMdata.XYZmm[3] := lZmm; case lVoxelType of 1: begin Msg('Error: 8-bit data not supported [yet]. Please contact the author.'); lDicomData.Allocbits_per_pixel := 8; lHdrOK := false; goto 539; end; 4: begin Msg('Error: 32-bit data not supported [yet]. Please contact the author.'); lHdrOK := false; goto 539; end; else begin //16-bit integers lDicomData.Allocbits_per_pixel := 16; end; end; {case lVoxelType} end else begin //if lECAT6 if (lDICOMdata.XYZdim[1] <> lX) or (lDICOMdata.XYZdim[2] <> lY) or (lDICOMdata.XYZdim[3] <> lZ) then begin Msg('Error: different slices in this volume have different slice sizes. Please contact the author.'); lHdrOK := false; goto 539; end; //dimensions have changed //lSlicePos :=((lMatri-1)*lImgSz); end; //ECAT6 lVox := lSliceSz div 2; lHlfVox := lSliceSz div 4; for lSlice := 1 to lZ do begin if (not lECAT6) then lSlicePos := ((lSlice-1)*lSliceSz)+lMatrixStart; if lLongRAPos >= kMaxnSLices then begin lHdrOK := false; goto 539; end; inc(lLongRAPos); lLongRA^[lLongRAPos] := lSlicePos; {inc(lSingleRAPos); if lCalibTableType = 1 then lSingleRA[lSingleRAPos] := lQuantScale else lSingleRA[lSingleRAPos] := lCalibrationFactor *lQuantScale;} end; //slice 1..lZ if not lECAT6 then inc(lVolume); end; //fileexistsex end; //correct filetype end; //matrix start/end within filesz if (lMatrixStart > FileSz) or (lMatrixEnd >= FileSz) then goto 539; if ((lEntry mod 32) = 0) then begin if ((lNextDirectory-1)*512) <= lPos then goto 539; //no more directories lPos := (lNextDirectory-1)*512; goto 121; end; //entry 32 end ; //while true 539: CloseFile(fp); FileMode := 2; //set to read/write lDicomData.XYZdim[3] := lLongRApos; if not lECAT6 then dec(lVolume); //ECAT7 increments immediately before exiting loop - once too often lDicomData.XYZdim[4] :=(lVolume); if lSwapBytes then lDicomData.little_endian := 0 else lDicomData.little_endian := 1; if (lLongRApos > 0) and (lHdrOK) then begin lDicomData.ImageStart := lLongRA^[1]; lCreateTable := false; if (lLongRApos > 1) then begin lFPos := lDICOMdata.ImageStart; for lS := 2 to lLongRApos do begin lFPos := lFPos + lSliceSz; if lFPos <> lLongRA^[lS] then lCreateTable := true; end; if (lCreateTable) and (lReadECAToffsetTables) then begin gECATJPEG_table_entries := lLongRApos; getmem (gECATJPEG_pos_table, gECATJPEG_table_entries*sizeof(longint)); getmem (gECATJPEG_size_table, gECATJPEG_table_entries*sizeof(longint)); for lS := 1 to gECATJPEG_table_entries do gECATJPEG_pos_table^[lS] := lLongRA^[lS] end else if (lCreateTable) then lImageFormatOK := false; //slices are offset within this file end; if (lVerboseRead) and (lHdrOK) then begin lDynStr :=lDynStr+kCR+('XYZdim:'+inttostr(lX)+'/'+inttostr(lY)+'/'+inttostr(gECATJPEG_table_entries)); lDynStr :=lDynStr+kCR+('XYZmm: '+floattostrf(lDicomData.XYZmm[1],ffFixed,7,7)+'/'+floattostrf(lDicomData.XYZmm[2],ffFixed,7,7) +'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,7,7)); //xlDynStr :=lDynStr+kCR+('Bits per voxel: '+inttostr(lDicomData.Storedbits_per_pixel)); lDynStr :=lDynStr+kCR+('Image Start: '+inttostr(lDicomData.ImageStart)); if lCreateTable then lDynStr :=lDynStr+kCR+('Note: staggered slice offsets'); end end; //xlDicomData.Storedbits_per_pixel:= lDicomData.Allocbits_per_pixel; if lLongRASz > 0 then freemem(lLongRA); (*if (lSingleRApos > 0) and (lHdrOK) and (lCalibTableType <> 0) then begin gECAT_scalefactor_entries := lSingleRApos; getmem (gECAT_scalefactor_table, gECAT_scalefactor_entries*sizeof(single)); for lS := 1 to gECAT_scalefactor_entries do gECAT_scalefactor_table[lS] := lSingleRA[lS]; end; if lSingleRASz > 0 then freemem(lSingleRA);*) end; (*procedure write_slc (lFileName: string; var pDICOMdata: DICOMdata;var lSz: integer; lDICOM3: boolean); const kMaxRA = 41; lXra: array [1..kMaxRA] of byte = (7,8,9,21,22,26,27, 35,36,44,45, 50,62,66,78, 81,95, 97,103,104,105,106,111, 113,123,127, 129,139,142, 146,147,148,149,155,156,157, 166,167,168,169,170); var fp: file; lX,lClr,lPos,lRApos: integer; lP: bytep; procedure WriteString(lStr: string; lCR: boolean); var n,lStrLen : Integer; begin lStrLen := length(lStr); for n := 1 to lstrlen do begin lPos := lPos + 1; lP[lPos] := ord(lStr[n]); end; if lCR then begin lPos := lPos + 1; lP[lPos] := ord(kCR); end; end; begin lSz := 0; getmem(lP,2048); lPos := 0; WriteString('11111',true); WriteString(inttostr(pDicomData.XYZdim[1])+' '+inttostr(pDicomData.XYZdim[2])+' '+inttostr(pDicomData.XYZdim[3])+' 8',true); WriteString(floattostrf(pDicomData.XYZmm[1],ffFixed,7,7)+' '+floattostrf(pDicomData.XYZmm[2],ffFixed,7,7)+' '+floattostrf(pDicomData.XYZmm[3],ffFixed,7,7),true); WriteString('1 1 0 0',true); //mmunits,MR,original,nocompress WriteString('16 12 X',false); //icon is 8x8 grid, so 64 bytes for red,green blue for lClr := 1 to 3 do begin lRApos := 1; for lX := 1 to 192 do begin inc(lPos); if (lRApos <= kMaxRA) and (lX = lXra[lRApos]) then begin inc(lRApos); lP[lPos] := 200; end else lP[lPos] := 0; end; {icongrid 1..192} end; {RGB} if lFileName <> '' then begin AssignFile(fp, lFileName); Rewrite(fp, 1); blockwrite(fp,lP^,lPos); close(fp); end; freemem(lP); lSz := lPos; end;*) procedure read_interfile_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string); label 333; const UNIXeoln = chr(10); var lTmpStr, lInStr,lUpCaseStr: string; lHdrEnd,lFloat,lUnsigned: boolean; lPos,lLen,FileSz,linPos: integer; fp: file; lCharRA: bytep; function readInterFloat:real; var lStr: string; begin lStr := ''; While (lPos <= lLen) and (lInStr[lPos] <> ';') do begin if lInStr[lPos] in ['+','-','e','E','.','0'..'9'] then lStr := lStr+(linStr[lPos]); inc(lPos); end; try result := strtofloat(lStr); except on EConvertError do begin Msg('Unable to convert the string '+lStr+' to a number'); result := 1; exit; end; end; {except} end; function readInterStr:string; var lStr: string; begin lStr := ''; While (lPos <= lLen) and (lInStr[lPos] = ' ') do begin inc(lPos); end; While (lPos <= lLen) and (lInStr[lPos] <> ';') do begin if lInStr[lPos] <> ' ' then //1.39 build 6 lStr := lStr+upcase(linStr[lPos]); //zebra upcase inc(lPos); end; result := lStr; end; //interstr func begin lHdrOK := false; lFloat := false; lUnsigned := false; lImageFormatOK := true; Clear_Dicom_Data(lDicomData); lDynStr := ''; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); FileSz := FileSize(fp); lHdrEnd := false; //lDicomData.ImageStart := FileSz; GetMem( lCharRA, FileSz+1 ); BlockRead(fp, lCharRA^, FileSz, linpos); if lInPos <> FileSz then Msg('Disk error: Unable to read full input file.'); linPos := 1; CloseFile(fp); FileMode := 2; //set to read/write repeat linstr := ''; while (linPos < FileSz) and (lCharRA^[linPos] <> ord(kCR)) and (lCharRA^[linPos] <> ord(UNIXeoln)) do begin lInStr := lInstr + chr(lCharRA^[linPos]); inc(linPos); end; inc(lInPos); //read EOLN lLen := length(lInStr); lPos := 1; lUpcaseStr := ''; While (lPos <= lLen) and (lInStr[lPos] <> ';') and (lInStr[lPos] <> '=') and (lUpCaseStr <>'INTERFILE') do begin if lInStr[lPos] in ['[',']','(',')','/','+','-',{' ',} '0'..'9','a'..'z','A'..'Z'] then lUpCaseStr := lUpCaseStr+upcase(linStr[lPos]); inc(lPos); end; inc(lPos); {read equal sign in := statement} if lUpCaseStr ='INTERFILE' then begin lHdrOK := true; lDicomData.little_endian := 0; end; if lUpCaseStr ='DATASTARTINGBLOCK'then lDicomData.ImageStart := 2048 * round(readInterFloat); if lUpCaseStr ='DATAOFFSETINBYTES'then lDicomData.ImageStart := round(readInterFloat); if (lUpCaseStr ='MATRIXSIZE[1]') or (lUpCaseStr ='MATRIXSIZE[X]') then lDicomData.XYZdim[1] := round(readInterFloat); if (lUpCaseStr ='MATRIXSIZE[2]')or (lUpCaseStr ='MATRIXSIZE[Y]')then lDicomData.XYZdim[2] := round(readInterFloat); if (lUpCaseStr ='MATRIXSIZE[3]')or (lUpCaseStr ='MATRIXSIZE[Z]') or (lUpCaseStr ='NUMBEROFSLICES') or (lUpCaseStr ='TOTALNUMBEROFIMAGES') then begin lDicomData.XYZdim[3] := round(readInterFloat); end; if lUpCaseStr ='IMAGEDATABYTEORDER' then begin if readInterStr = 'LITTLEENDIAN' then lDicomData.little_endian := 1; end; if lUpCaseStr ='NUMBERFORMAT' then begin lTmpStr := readInterStr; if (lTmpStr = 'ASCII') or (lTmpStr='BIT') then begin lHdrOK := false; Msg('This software can not convert '+lTmpStr+' data type.'); goto 333; end; if lTmpStr = 'UNSIGNEDINTEGER' then lUnsigned := true; if (lTmpStr='FLOAT') or (lTmpStr='SHORTFLOAT') or (lTmpStr='LONGFLOAT') then begin //1395 lFloat := true; end; end; if lUpCaseStr ='NAMEOFDATAFILE' then lFileName := ExtractFilePath(lFileName)+readInterStr; if lUpCaseStr ='NUMBEROFBYTESPERPIXEL' then lDicomData.Allocbits_per_pixel := round(readInterFloat)*8; if (lUpCaseStr ='SCALINGFACTOR(MM/PIXEL)[1]') or (lUpCaseStr ='SCALINGFACTOR(MM/PIXEL)[X]') then lDicomData.XYZmm[1] := (readInterFloat); if (lUpCaseStr ='SCALINGFACTOR(MM/PIXEL)[2]') or (lUpCaseStr ='SCALINGFACTOR(MM/PIXEL)[Y]')then lDicomData.XYZmm[2] := (readInterFloat); if (lUpCaseStr ='SCALINGFACTOR(MM/PIXEL)[3]')or (lUpCaseStr ='SCALINGFACTOR(MM/PIXEL)[Z]')or (lUpCaseStr ='SLICETHICKNESS')then lDicomData.XYZmm[3] := (readInterFloat); if (lUpCaseStr ='ENDOFINTERFILE') then lHdrEnd := true; if not lHdrOK then goto 333; if lInStr <> '' then lDynStr := lDynStr + lInStr+kCr; lHdrOK := true; until (linPos >= FileSz) or (lHdrEnd){EOF(fp)}; //xlDicomData.Storedbits_per_pixel := lDicomData.Allocbits_per_pixel; lImageFormatOK := true; if (not lFLoat) and (lUnsigned) and ((lDicomData.Allocbits_per_pixel = 16)) then begin Msg('Warning: this Interfile image uses UNSIGNED 16-bit data [values 0..65535]. Analyze specifies SIGNED 16-bit data [-32768..32767]. Some images may not transfer well. [Future versions of MRIcro should fix this].'); lImageFormatOK := false; end else if (not lFLoat) and (lDicomData.Allocbits_per_pixel > 16) then begin Msg('WARNING: The image '+lFileName+' is a '+inttostr(lDicomData.Allocbits_per_pixel)+'-bit integer data type. This software may display this as SIGNED data. Bits per voxel: '+inttostr(lDicomData.Allocbits_per_pixel)); lImageFormatOK := false; end else if (lFloat) then begin //zebra change float check //Msg('WARNING: The image '+lFileName+' uses floating point [real] numbers. The current software can only read integer data type Interfile images.'); lDicomData.Float := true; //lImageFormatOK := false; end; 333: FreeMem( lCharRA); end; //interfile //afni start function ParseFileName (lFilewExt:String): string; var lLen,lInc: integer; lName: String; begin lName := ''; lLen := length(lFilewExt); lInc := lLen+1; if lLen > 0 then repeat dec(lInc); until (lFileWExt[lInc] = '.') or (lInc = 1); if lInc > 1 then for lLen := 1 to (lInc - 1) do lName := lName + lFileWExt[lLen] else lName := lFilewExt; //no extension ParseFileName := lName; end; procedure read_afni_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string; var lRotation1,lRotation2,lRotation3: integer); //label 333; const UNIXeoln = chr(10); kTab = ord(chr(9)); kSpace = ord(' '); var lTmpStr,lInStr,lUpCaseStr: string; lHdrEnd: boolean; lMSBch: char; lOri : array [1..4] of single; lTmpInt,lPos,lLen,FileSz,linPos: integer; fp: file; lCharRA: bytep; procedure readAFNIeoln; begin while (linPos < FileSz) and (lCharRA^[linPos] <> ord(kCR)) and (lCharRA^[linPos] <> ord(UNIXeoln)) do inc(linPos); inc(lInPos); //read EOLN end; function readAFNIFloat:real; var lStr: string; lCh:char; begin lStr := ''; while (linPos < FileSz) and ((lStr='') or ((lCharRA^[lInPos] <> kTab) and (lCharRA^[lInPos] <> kSpace))) do begin lCh:= chr(lCharRA^[linPos]); if lCh in ['+','-','e','E','.','0'..'9'] then lStr := lStr+lCh; inc(linPos); end; if lStr = '' then exit; try result := strtofloat(lStr); except on EConvertError do begin Msg('Unable to convert the string '+lStr+' to a number'); result := 1; exit; end; end; {except} end; begin lHdrOK := false; lImageFormatOK := true; Clear_Dicom_Data(lDicomData); lDynStr := ''; lTmpStr := string(StrUpper(PChar(ExtractFileExt(lFileName)))); if lTmpStr <> '.HEAD' then exit; for lInPos := 1 to 3 do lOri[lInPos] := -6666; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); FileSz := FileSize(fp); lHdrEnd := false; //lDicomData.ImageStart := FileSz; GetMem( lCharRA, FileSz+1 ); BlockRead(fp, lCharRA^, FileSz, linpos); if lInPos <> FileSz then Msg('Disk error: Unable to read full input file.'); linPos := 1; CloseFile(fp); FileMode := 2; //set to read/write repeat linstr := ''; while (linPos < FileSz) and (lCharRA^[linPos] <> ord(kCR)) and (lCharRA^[linPos] <> ord(UNIXeoln)) do begin lInStr := lInstr + chr(lCharRA^[linPos]); inc(linPos); end; inc(lInPos); //read EOLN lLen := length(lInStr); lPos := 1; lUpcaseStr := ''; While (lPos <= lLen) do begin if lInStr[lPos] in ['_','[',']','(',')','/','+','-','=',{' ',} '0'..'9','a'..'z','A'..'Z'] then lUpCaseStr := lUpCaseStr+upcase(linStr[lPos]); inc(lPos); end; inc(lPos); {read equal sign in := statement} if lUpCaseStr ='NAME=DATASET_DIMENSIONS'then begin lImageFormatOK := true; lHdrOK := true; lFileName := parsefilename(lFilename)+'.BRIK'; //always UPPERcase readAFNIeoln; lDICOMdata.XYZdim[1] := round(readAFNIFloat); lDICOMdata.XYZdim[2] := round(readAFNIFloat); lDICOMdata.XYZdim[3] := round(readAFNIFloat); //lDicomData.ImageStart := 2048 * round(readInterFloat); end; if lUpCaseStr ='NAME=BRICK_FLOAT_FACS'then begin readAFNIeoln; lDICOMdata.IntenScale := readAFNIFloat; //1380 read slope of intensity end; if lUpCaseStr ='NAME=DATASET_RANK'then begin readAFNIeoln; //2nd value is number of volumes readAFNIFloat; lDICOMdata.XYZdim[4] := round(readAFNIFloat); end; if lUpCaseStr ='NAME=BRICK_TYPES'then begin readAFNIeoln; lTmpInt := round(readAFNIFloat); case lTmpInt of 0:lDicomData.Allocbits_per_pixel := 8; 1:begin lDicomData.Allocbits_per_pixel := 16; //lDicomData.MaxIntensity := 65535; //Old AFNI were UNSIGNED, new ones are SIGNED??? end; 3:begin lDicomData.Allocbits_per_pixel := 32; lDicomData.Float := true; end; else begin lHdrEnd := true; Msg('Unsupported AFNI BRICK_TYPES: '+inttostr(lTmpInt)); end; end; //case {datatype 0 = byte (unsigned char; 1 byte) 1 = short (2 bytes, signed) 3 = float (4 bytes, assumed to be IEEE format) 5 = complex (8 bytes: real+imaginary parts)} end; if lUpCaseStr ='NAME=BYTEORDER_STRING'then begin readAFNIeoln; if ((linPos+2) < FileSz) then begin lMSBch := chr(lCharRA^[linPos+1]); if lMSBCh = 'L' then lDicomData.Little_Endian := 1; if lMSBCh = 'M' then begin lDicomData.Little_Endian := 0; end; linPos := lInPos + 2; end; //littleendian end; if lUpCaseStr ='NAME=ORIGIN'then begin readAFNIeoln; lOri[1] := (abs(readAFNIFloat)); lOri[2] := (abs(readAFNIFloat)); lOri[3] := (abs(readAFNIFloat)); //Xori,YOri,ZOri end; if lUpCaseStr ='NAME=DELTA'then begin readAFNIeoln; lDICOMdata.XYZmm[1] := abs(readAFNIFloat); lDICOMdata.XYZmm[2] := abs(readAFNIFloat); lDICOMdata.XYZmm[3] := abs(readAFNIFloat); //Xmm,Ymm,Zmm end; if lUpCaseStr ='NAME=ORIENT_SPECIFIC'then begin readAFNIeoln; lRotation1 := round(readAFNIFloat); lRotation2 := round(readAFNIFloat); lRotation3 := round(readAFNIFloat); end; //ORIENT_SPECIFIC rotation details if lInStr <> '' then lDynStr := lDynStr + lInStr+kCr; until (linPos >= FileSz) or (lHdrEnd){EOF(fp)}; //xlDicomData.Storedbits_per_pixel := lDicomData.Allocbits_per_pixel; for lInPos := 1 to 3 do begin if lOri[lInPos] < -6666 then //value not set lDICOMdata.XYZori[lInPos] := round((1.0+lDICOMdata.XYZdim[lInPos])/2) else if lDICOMdata.XYZmm[lInPos] <> 0 then lDICOMdata.XYZori[lInPos] := round(1.5+lOri[lINPos] / lDICOMdata.XYZmm[lInPos]); end; // lDicomData.Float := true; FreeMem( lCharRA); end; //interfile //afni end //voxbo start procedure read_voxbo_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string); label 333; const UNIXeoln = chr(10); kTab = chr(9); var lTmpStr,lInStr,lUpCaseStr: string; lFileTypeKnown,lHdrEnd,lFloat: boolean; lStartPos,lPos,lLen,FileSz,linPos: integer; fp: file; lCharRA: bytep; procedure readVBfloats (var lF1,lF2,lF3: double); // While (lPos <= lLen) and ((lInStr[lPos] = kTab) or (lInStr[lPos] = ' ')) do begin // inc(lPos); var //lDigit : boolean; n,lItemIndex: integer; lStr,lfStr: string; begin lf1 := 1; lf2 := 1; lf3 := 1; n := 0; for lItemIndex := 1 to 3 do begin inc(n); While (lPos <= lLen) and ((lInStr[lPos] = kTab) or (lInStr[lPos] = ' ')) do inc(lPos); if lPos > lLen then exit; lStr := ''; repeat lStr := lStr+upcase(linStr[lPos]); inc(lPos); until (lPos > lLen) or (lInStr[lPos] = kTab) or (lInStr[lPos] = ' '); if lStr <> '' then begin //string to convert try case n of 1: lF1 := strtofloat(lStr); 2: lF2 := strtofloat(lStr); 3: lF3 := strtofloat(lStr); end; except on EConvertError do begin Msg('Unable to convert the string '+lfStr+' to a real number'); exit; end; end; {except} end; //if string to convert end; end; procedure readVBints (var lI1,lI2,lI3: integer); var lF1,lF2,lF3: double; begin readVBfloats (lF1,lF2,lF3); lI1 := round(lF1); lI2 := round(lF2); lI3 := round(lF3); end; function readVBStr:string; var lStr: string; begin lStr := ''; While (lPos <= lLen) and ((lInStr[lPos] = kTab) or (lInStr[lPos] = ' ')) do begin inc(lPos); end; While (lPos <= lLen) {and (lInStr[lPos] <> ';')} do begin lStr := lStr+upcase(linStr[lPos]); //zebra upcase inc(lPos); end; result := lStr; end; //interstr func begin lHdrOK := false; lFloat := false; lImageFormatOK := true; Clear_Dicom_Data(lDicomData); lDynStr := ''; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); FileSz := FileSize(fp); lHdrEnd := false; //lDicomData.ImageStart := FileSz; GetMem( lCharRA, FileSz+1 ); BlockRead(fp, lCharRA^, FileSz, linpos); if lInPos <> FileSz then Msg('Disk error: Unable to read full input file.'); linPos := 1; CloseFile(fp); FileMode := 2; //set to read/write lFileTypeKnown := false; repeat linstr := ''; while (linPos < FileSz) and (lCharRA^[linPos] <> ord(kCR)) and (lCharRA^[linPos] <> ord(UNIXeoln)) do begin lInStr := lInstr + chr(lCharRA^[linPos]); inc(linPos); end; inc(lInPos); //read EOLN lLen := length(lInStr); lPos := 1; lUpcaseStr := ''; While (lPos <= lLen) and (lInStr[lPos] <> ':') do begin if lInStr[lPos] in ['[',']','(',')','/','+','-', '0'..'9','a'..'z','A'..'Z'] then lUpCaseStr := lUpCaseStr+upcase(linStr[lPos]); inc(lPos); end; inc(lPos); {read equal sign in := statement} if (lHdrOK) and (not lFileTypeKnown) and (lUpCaseStr = 'CUB1') then lFileTypeKnown := true; if (lHdrOK) and (not lFileTypeKnown) then begin Msg('This software can not read this kind of VoxBo image. (Type:"'+lUpCaseStr+'")'); lHdrEnd := true; lHdrOK := false; end; if (not lHdrOK) and (lUpCaseStr ='VB98') then begin lDicomData.little_endian := 0;//all VoxBo files are Big Endian! lStartPos := linPos; lFileTypeKnown := true; //test for While Loop while (linPos < FileSz) and lFileTypeKnown do begin if (lCharRA^[linPos-1] = $0C) and (lCharRA^[linPos] = $0A) then begin lFileTypeKnown := false; lDicomData.ImageStart := linPos; FileSz := linPos; //size of VoxBo header end; inc(linPos); end; if lFileTypeKnown then begin //end of file character not found: abort! Msg('Unable to find the end of the VoxBo header.'); lHdrEnd := true end else lHdrOK := true; linPos := lStartPos; //now that we have found the header size, we can start from the beginning of the header end; if not lHdrOK then lHdrEnd := true; if (lUpCaseStr ='BYTEORDER') and (readVBStr = 'LSBFIRST') then lDicomData.little_endian := 1; if lUpCaseStr ='DATATYPE'then begin lTmpStr := readVBStr; if lTmpStr = 'Byte' then lDicomData.Allocbits_per_pixel := 8 else if (lTmpStr = 'INTEGER') or (lTmpStr = 'INT16') then lDicomData.Allocbits_per_pixel := 16 else if (lTmpStr = 'LONG') or (lTmpStr = 'INT32') then lDicomData.Allocbits_per_pixel := 32 else if (lTmpStr = 'FLOAT') then begin lFloat := true; lDicomData.Allocbits_per_pixel := 32; end else if (lTmpStr = 'DOUBLE') then begin lFloat := true; lDicomData.Allocbits_per_pixel := 64; end else begin Msg('Unknown VoxBo data format: '+lTmpStr); end; end; if lUpCaseStr ='VOXDIMS(XYZ)'then readVBints(lDicomData.XYZdim[1],lDicomData.XYZdim[2],lDicomData.XYZdim[3]); if (lUpCaseStr ='VOXSIZES(XYZ)') then readVBfloats(lDicomData.XYZmm[1],lDicomData.XYZmm[2],lDicomData.XYZmm[3]); if (lUpCaseStr ='ORIGIN(XYZ)')then begin readVBints(lDicomData.XYZori[1],lDicomData.XYZori[2],lDicomData.XYZori[3]); inc(lDicomData.XYZori[1]);//1393 inc(lDicomData.XYZori[2]);//1393 inc(lDicomData.XYZori[3]);//1393 end; if not lHdrOK then goto 333; if lInStr <> '' then lDynStr := lDynStr + lInStr+kCr; until (linPos >= FileSz) or (lHdrEnd){EOF(fp)}; //xlDicomData.Storedbits_per_pixel := lDicomData.Allocbits_per_pixel; //xlDicomData.Rotate180deg := true; lImageFormatOK := true; if (lFloat) then begin //zebra change float check lDicomData.Float := true; //lImageFormatOK := false; end; 333: FreeMem( lCharRA); end; //voxbo end procedure read_vff_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string); label 333; const UNIXeoln = chr(10); var lInStr,lUpCaseStr: string; //lHdrEnd: boolean; lPos,lLen,FileSz,linPos: integer; lDummy1,lDummy2,lDummy3 : double; fp: file; lCharRA: bytep; procedure readVFFvals (var lFloat1,lFloat2,lFloat3: double); var lStr: string; lDouble: DOuble; lInc: integer; begin for lInc := 1 to 3 do begin lStr := ''; While (lPos <= lLen) and (lInStr[lPos] = ' ') do begin inc(lPos); end; While (lPos <= lLen) and (lInStr[lPos] <> ';') and (lInStr[lPos] <> ' ') do begin if lInStr[lPos] in ['+','-','e','E','.','0'..'9'] then lStr := lStr+(linStr[lPos]); inc(lPos); end; if lStr <> '' then begin try lDouble := strtofloat(lStr); except on EConvertError do begin Msg('Unable to convert the string '+lStr+' to a number'); exit; end; end; {except} case lInc of 2: lFloat2 := lDouble; 3: lFloat3 := lDouble; else lFloat1 := lDouble; end; end; //lStr <> '' end; //lInc 1..3 end; //interstr func begin lHdrOK := false; lImageFormatOK := true; Clear_Dicom_Data(lDicomData); lDicomData.little_endian := 0; //big-endian lDynStr := ''; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); FileSz := FileSize(fp); if FileSz > 2047 then FileSz := 2047; GetMem( lCharRA, FileSz+1 ); BlockRead(fp, lCharRA^, FileSz, linpos); if lInPos <> FileSz then Msg('Disk error: Unable to read full input file.'); lInPos := 1; while (lCharRA^[lInPos] <> 12) and (lInPos < FileSz) do begin inc(lInPos); end; inc(lInPos); if (lInPos >= FileSz) or (lInPos < 12) then goto 333; //unable to find lDynStr := lDynStr + 'Sun VFF Volume File Format'+kCr; lDicomData.ImageStart := lInPos; FileSz := lInPos-1; linPos := 1; CloseFile(fp); FileMode := 2; //set to read/write repeat linstr := ''; while (linPos < FileSz) and (lCharRA^[linPos] <> ord(kCR)) and (lCharRA^[linPos] <> ord(UNIXeoln)) do begin lInStr := lInstr + chr(lCharRA^[linPos]); inc(linPos); end; inc(lInPos); //read EOLN lLen := length(lInStr); lPos := 1; lUpcaseStr := ''; While (lPos <= lLen) and (lInStr[lPos] <> ';') and (lInStr[lPos] <> '=') and (lUpCaseStr <>'NCAA') do begin if lInStr[lPos] in ['[',']','(',')','/','+','-',{' ',} '0'..'9','a'..'z','A'..'Z'] then lUpCaseStr := lUpCaseStr+upcase(linStr[lPos]); inc(lPos); end; inc(lPos); {read equal sign in := statement} if lUpCaseStr ='NCAA' then begin lHdrOK := true; end; if lUpCaseStr ='BITS' then begin lDummy1 := 8; readVFFvals(lDummy1,lDummy2,lDummy3); lDicomData.Allocbits_per_pixel := round(lDummy1); end; if lUpCaseStr ='SIZE' then begin lDummy1 := 1; lDummy2 := 1; lDummy3 := 1; readVFFvals(lDummy1,lDummy2,lDummy3); lDicomData.XYZdim[1] := round(lDummy1); lDicomData.XYZdim[2] := round(lDummy2); lDicomData.XYZdim[3] := round(lDummy3); end; if lUpCaseStr ='ASPECT' then begin lDummy1 := 1; lDummy2 := 1; lDummy3 := 1; readVFFvals(lDummy1,lDummy2,lDummy3); lDicomData.XYZmm[1] := (lDummy1); lDicomData.XYZmm[2] := (lDummy2); lDicomData.XYZmm[3] := (lDummy3); end; if not lHdrOK then goto 333; if lInStr <> '' then lDynStr := lDynStr + lInStr+kCr; //lHdrOK := true; until (linPos >= FileSz); //xlDicomData.Storedbits_per_pixel := lDicomData.Allocbits_per_pixel; lImageFormatOK := true; 333: FreeMem( lCharRA); end; //******************************************************************** (*procedure ShellSortItems (first, last: integer; var lPositionRA, lIndexRA: LongintP; var lRepeatedValues: boolean); {Shell sort chuck uses this- see 'Numerical Recipes in C' for similar sorts.} label 555; const tiny = 1.0e-5; aln2i = 1.442695022; var n,t, nn, m, lognb2, l, k, j, i: longint; begin lRepeatedValues := false; n := abs(last - first + 1); lognb2 := trunc(ln(n) * aln2i + tiny); m := last; for nn := 1 to lognb2 do begin m := m div 2; k := last - m; for j := 1 to k do begin i := j; 555: {<- LABEL} l := i + m; if (lIndexRA^[lPositionRA^[l]] = lIndexRA^[lPositionRA^[i]]) then begin lRepeatedValues := true; exit; end; if (lIndexRA^[lPositionRA^[l]] < lIndexRA^[lPositionRA^[i]]) then begin //swap values for i and l t := lPositionRA^[i]; lPositionRA^[i] := lPositionRA^[l]; lPositionRA^[l] := t; i := i - m; if (i >= 1) then goto 555; end end end end; //shellsort is fast and requires less memory than quicksort *) (*procedure PAR2DICOMstudyDate(var lDicomData: DICOMdata); {input: lDicomData.StudyDate = 2002.12.29 / 19:48:58.0000 output: StudyDate = YYYYMMDD StudyTime= hhmmss } var I: integer; lStr: string; begin if length(lDicomData.StudyDate) < 14 then exit; lStr := ''; for I := 1 to length(lDicomData.StudyDate) do if lDicomData.StudyDate[I] in ['0'..'9'] then lStr := lStr+ lDicomData.StudyDate[I]; if length(lStr) < 14 then exit; lDicomData.StudyDate := ''; for I := 1 to 8 do lDicomData.StudyDate := lDicomData.StudyDate+lStr[I]; lDicomData.StudyTime := ''; for I := 9 to 14 do lDicomData.StudyTime := lDicomData.StudyTime+lStr[I]; lDicomData.PatientIDInt := StudySecSince2K(lDicomData.StudyDate,lDicomData.StudyTime); end; type tRange = record Min,Val,Max: double; //some vals are ints, others floats end; procedure read_PAR_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK:boolean; var lDynStr: string;var lFileName: string; lReadOffsetTables: boolean; var lOffset_pos_table: LongIntp; var lOffsetTableEntries: integer; lReadVaryingScaleFactors: boolean; var lVaryingScaleFactors_table,lVaryingIntercept_table: Singlep; var lVaryingScaleFactorsTableEntries,lnum4Ddatasets: integer); label 333; //1384 now reads up to 8 dimensional data.... const UNIXeoln = chr(10); kMaxnSLices = 32000; kXdim = 1; kYdim = 2; kBitsPerVoxel = 3; kSliceThick = 4; kSliceGap = 5; kXmm = 6; kYmm = 7; kSlope = 8; kIntercept = 9; kCalibratedSlope = 10; //1393 - attempt to use calibrated values kDynTime = 11; kSlice = 12; kEcho = 13; kDyn = 14; kCardiac = 15; kType = 16; kSequence = 17; kIndex = 18; lIsParVers3x: boolean = true; lRepeatedValues : boolean = false; lSlicesNotInSequence: boolean = false; lMaxSlice : integer = 0; var lErrorStr,lInStr,lUpCaseStr,lReportedTRStr: string; lSliceSequenceRA,lSortedSliceSequence: LongintP; lSliceIndexRA: array [1..kMaxnSlices] of Longint; lSliceSlopeRA,lSliceInterceptRA,lCalibratedSliceSlopeRA: array [1..kMaxnSlices] of single; lSliceHeaderRA: array [1..32] of double; lRangeRA: array [kXdim..kIndex] of tRange; lMaxIndex,lSliceSz,lSliceInfoCount,lPos,lLen,lFileSz,lHdrPos,linPos,lInc: LongInt; fp: file; lCharRA: bytep; procedure MinMaxTRange (var lDimension: tRange; lNewVal: double); //nested begin lDimension.Val := lNewVal; if lSliceInfoCount < 2 then begin lDimension.Min := lDimension.Val; lDimension.Max := lDimension.Val; end; if lNewVal < lDimension.Min then lDimension.Min := lNewVal; if lNewVal > lDimension.Max then lDimension.Max := lNewVal; end; //nested InitTRange proc function readParStr:string;//nested var lStr: string; begin lStr := ''; While (lPos <= lLen) do begin if (lStr <> '') or (linStr[lPos]<>' ') then //strip leading spaces lStr := lStr+(linStr[lPos]); inc(lPos); end; //while lPOs < lLen result := lStr; end; //nested func ReadParStr function readParFloat:double;//nested var lStr: string; begin lStr := ''; result := 1; While (lPos <= lLen) and ((lStr='') or(lInStr[lPos] <> ' ')) do begin if lInStr[lPos] in ['+','-','e','E','.','0'..'9'] then lStr := lStr+(linStr[lPos]); inc(lPos); end; if lStr = '' then exit; try result := strtofloat(lStr); except on EConvertError do begin Msg('read_PAR_data: Unable to convert the string '+lStr+' to a number'); result := 1; exit; end; end; {except} end; //nested func ReadParFloat begin //Initialize parameters lnum4Ddatasets := 1; lSliceInfoCount := 0; for lInc := kXdim to kIndex do //initialize all values: important as PAR3 will not explicitly report all MinMaxTRange(lRangeRA[lInc],0); lHdrOK := false; lImageFormatOK := false; lIsParVers3x := true; lOffsetTableEntries := 0; lVaryingScaleFactorsTableEntries := 0; Clear_Dicom_Data(lDicomData); lDynStr := ''; //Read text header to buffer (lCharRA) FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); lFileSz := FileSize(fp); GetMem( lCharRA, lFileSz+1 ); //note: must free dynamic memory: goto 333 if any error GetMem (lSliceSequenceRA, kMaxnSLices*sizeof(longint)); //note: must free dynamic memory: goto 333 if any error BlockRead(fp, lCharRA^, lFileSz, lInpos); if lInPos <> lFileSz then begin Msg('read_PAR_data: Disk error, unable to read full input file.'); goto 333; end; linPos := 1; CloseFile(fp); FileMode := 2; //set to read/write //Next: read each line of header file... repeat //for each line in file.... linstr := ''; while (linPos < lFileSz) and (lCharRA^[linPos] <> ord(kCR)) and (lCharRA^[linPos] <> ord(UNIXeoln)) do begin lInStr := lInstr + chr(lCharRA^[linPos]); inc(linPos); end; inc(lInPos); //read EOLN lLen := length(lInStr); lPos := 1; lUpcaseStr := ''; if lLen < 1 then //ignore blank lines else if (lInStr[1] = '*') and (not lHdrOK) then //# -> comment //ignore comment lines prior to start of header else if (lInStr[1] = '#') and (lHdrOK) then //# -> comment //ignore comment lines else if (lInStr[1] = '.') or (not lHdrOK) then begin // GENERAL_INFORMATION section (line starts with '.') //Note we also read in lines that do not have '.' if we have HdrOK=false, this allows us to detect the DATADESCRIPTIONFILE signature While (lPos <= lLen) and (lInStr[lPos] <> ':') and ((not lHdrOK) or (lInStr[lPos] <> '#')) do begin if lInStr[lPos] in ['[',']','(',')','/','+','-',{' ',} '0'..'9','a'..'z','A'..'Z'] then lUpCaseStr := lUpCaseStr+upcase(linStr[lPos]); inc(lPos); end; //while reading line inc(lPos); {read equal sign in := statement} lDynStr := lDynStr + lInStr+kCR; if (not lHdrOK) and (lUpcaseStr = ('DATADESCRIPTIONFILE')) then begin //1389 PAR file lHdrOK := true; lDicomData.little_endian := 1; end; if (lUpCaseStr ='REPETITIONTIME[MSEC]') then lDicomData.TR := round(readParFloat); if (lUpCaseStr ='MAXNUMBEROFSLICES/LOCATIONS') then lDicomData.XYZdim[3] := round(readParFloat); if (lUpCaseStr ='SLICETHICKNESS[MM]') then MinMaxTRange(lRangeRA[kSliceThick],readParFloat); if (lUpCaseStr ='SLICEGAP[MM]') then MinMaxTRange(lRangeRA[kSliceGap],readParFloat); if lUpCaseStr = 'RECONRESOLUTION(XY)' then begin MinMaxTRange(lRangeRA[kXdim],readParFloat); MinMaxTRange(lRangeRA[kYdim],readParFloat); end; if lUpCaseStr = 'RECONSTRUCTIONNR' then lDicomData.AcquNum := round(readParFloat); if lUpCaseStr = 'ACQUISITIONNR' then lDicomData.SeriesNum := round(readParFloat); if lUpCaseStr = 'MAXNUMBEROFDYNAMICS' then begin lDicomData.XYZdim[4] := round(readParFloat); end; if lUpCaseStr = 'EXAMINATIONDATE/TIME' then begin lDicomData.StudyDate := readParStr; PAR2DICOMstudyDate(lDicomData); end; //if lUpCaseStr = 'PROTOCOLNAME' then // lDicomData.modality := readParStr; if lUpCaseStr = 'PATIENTNAME' then lDicomData.PatientName := readParStr; if lUpCaseStr ='IMAGEPIXELSIZE[8OR16BITS]' then begin MinMaxTRange(lRangeRA[kBitsPerVoxel],readParFloat); end; if not lHdrOK then begin Msg('read_PAR_data: Error reading header'); goto 333; end; end else begin //SliceInfo: IMAGE_INFORMATION (line does NOT start with '.' or '#') inc(lSliceInfoCount); if (lSliceInfoCount < 2) and (lRangeRA[kBitsPerVoxel].val < 1) then //PARvers3 has imagedepth in general header, only in image header for later versions lIsParVers3x := false; for lHdrPos := 1 to 26 do lSliceHeaderRA[lHdrPos] := readparfloat; //The next few values are in the same location for both PAR3 and PAR4 MinMaxTRange(lRangeRA[kSlice], round(lSliceHeaderRA[1])); MinMaxTRange(lRangeRA[kEcho], round(lSliceHeaderRA[2])); MinMaxTRange(lRangeRA[kDyn], round(lSliceHeaderRA[3])); MinMaxTRange(lRangeRA[kCardiac], round(lSliceHeaderRA[4])); MinMaxTRange(lRangeRA[kType], round(lSliceHeaderRA[5])); MinMaxTRange(lRangeRA[kSequence], round(lSliceHeaderRA[6])); MinMaxTRange(lRangeRA[kIndex], round(lSliceHeaderRA[7])); if lIsParVers3x then begin //Read PAR3 data MinMaxTRange(lRangeRA[kIntercept], lSliceHeaderRA[8]);; //8=intercept in PAR3 MinMaxTRange(lRangeRA[kSlope],lSliceHeaderRA[9]); //9=slope in PAR3 MinMaxTRange(lRangeRA[kCalibratedSlope],lSliceHeaderRA[10]); //10=lcalibrated slope in PAR3 1393 - attempt to use calibrated values MinMaxTRange(lRangeRA[kXmm],lSliceHeaderRA[23]); //23 PIXEL SPACING X in PAR3 MinMaxTRange(lRangeRA[kYmm],lSliceHeaderRA[24]); //24 PIXEL SPACING Y IN PAR3 MinMaxTRange(lRangeRA[kDynTime],(lSliceHeaderRA[26])); //26= dyn_scan_begin_time in PAR3 end else begin //not PAR: assume PAR4 for lHdrPos := 27 to 32 do lSliceHeaderRA[lHdrPos] := readparfloat; MinMaxTRange(lRangeRA[kBitsPerVoxel],lSliceHeaderRA[8]);//8 BITS in PAR4 MinMaxTRange(lRangeRA[kXdim], lSliceHeaderRA[10]); //10 XDim in PAR4 MinMaxTRange(lRangeRA[kYdim], lSliceHeaderRA[11]); //11 YDim in PAR4 MinMaxTRange(lRangeRA[kIntercept],lSliceHeaderRA[12]); //12=intercept in PAR4 MinMaxTRange(lRangeRA[kSlope],lSliceHeaderRA[13]); //13=lslope in PAR4 MinMaxTRange(lRangeRA[kCalibratedSlope],lSliceHeaderRA[14]); //14=lcalibrated slope in PAR4 1393 - attempt to use calibrated values MinMaxTRange(lRangeRA[kSliceThick],lSliceHeaderRA[23]);//23 SLICE THICK in PAR4 MinMaxTRange(lRangeRA[kSliceGap], lSliceHeaderRA[24]); //24 SLICE GAP in PAR4 MinMaxTRange(lRangeRA[kXmm],lSliceHeaderRA[29]); //29 PIXEL SPACING X in PAR4 MinMaxTRange(lRangeRA[kYmm],lSliceHeaderRA[30]); //30 PIXEL SPACING Y in PAR4 MinMaxTRange(lRangeRA[kDynTime],(lSliceHeaderRA[32]));//32= dyn_scan_begin_time in PAR4 end; //PAR4 if lSliceInfoCount < kMaxnSlices then begin lSliceSequenceRA^[lSliceInfoCount] := ( (round(lRangeRA[kSequence].val)+round(lRangeRA[kType].val)+round(lRangeRA[kCardiac].val+lRangeRA[kEcho].val)) shl 24)+(round(lRangeRA[kDyn].val) shl 10)+round(lRangeRA[kSlice].val); lSliceSlopeRA [lSliceInfoCount] := lRangeRA[kSlope].Val; lCalibratedSliceSlopeRA [lSliceInfoCount] := lRangeRA[kCalibratedSlope].Val; lSliceInterceptRA [lSliceInfoCount] := lRangeRA[kIntercept].val; lSliceIndexRA[lSliceInfoCount]:= round(lRangeRA[kIndex].val); end; end; //SliceInfo Line until (linPos >= lFileSz);//until done reading entire file... //describe generic DICOM parameters lDicomData.XYZdim[1] := round(lRangeRA[kXdim].Val); lDicomData.XYZdim[2] := round(lRangeRA[kYdim].Val); lDicomData.XYZdim[3] := 1+round(lRangeRA[kSlice].Max-lRangeRA[kSlice].Min); if (lSliceInfoCount mod lDicomData.XYZdim[3]) <> 0 then Msg('read_PAR_data: Total number of slices not divisible by number of slices per volume. Reconstruction error?'); if lDicomData.XYZdim[3] > 0 then lDicomData.XYZdim[4] := lSliceInfoCount div lDicomData.XYZdim[3] //nVolumes = nSlices/nSlicePerVol else lDicomData.XYZdim[4] := 1; lDicomData.XYZmm[1] := lRangeRA[kXmm].Val; lDicomData.XYZmm[2] := lRangeRA[kYmm].Val; lDicomData.XYZmm[3] := lRangeRA[kSliceThick].Val+lRangeRA[kSliceGap].Val; lDicomData.Allocbits_per_pixel := round(lRangeRA[kBitsPerVoxel].Val); lDicomData.IntenScale := lRangeRA[kSlope].Val; lDicomData.IntenIntercept := lRangeRA[kIntercept].Val; if gPARprecise then begin if (lDicomData.IntenIntercept <> 0) or (lRangeRA[kCalibratedSlope].val = 0) then Msg('Warning: Unable to save calibrated Philips image intensity (non-zero scaling intercept). Turn off Etc/Options/CalibratedScaling to hide warning.'); if (lRangeRA[kSlope].min = lRangeRA[kSlope].max) and (lRangeRA[kIntercept].min = lRangeRA[kIntercept].max) and (lRangeRA[kCalibratedSlope].min = lRangeRA[kCalibratedSlope].max) and (lDicomData.IntenIntercept = 0) and (lRangeRA[kCalibratedSlope].val <> 0) then lDicomData.IntenScale := 1 / lRangeRA[kCalibratedSlope].val; end; //if PARprecise //Next: report number of Dynamic scans, this allows people to parse DynScans from Type/Cardiac/Echo/Sequence 4D files lnum4Ddatasets := (round(lRangeRA[kDyn].Max - lRangeRA[kDyn].Min)+1)*lDicomData.XYZdim[3]; //slices in each dynamic session if ((lSliceInfoCount mod lnum4Ddatasets) = 0) and ((lSliceInfoCount div lnum4Ddatasets) > 1) then lnum4Ddatasets := (lSliceInfoCount div lnum4Ddatasets) //infer multiple Type/Cardiac/Echo/Sequence else lnum4Ddatasets := 1; //next: Determine actual interscan interval if (lDicomData.XYZdim[4] > 1) and ((lRangeRA[kDynTime].max-lRangeRA[kDynTime].min)> 0) {1384} then begin lReportedTRStr := 'Reported TR: '+floattostrf(lDicomData.TR,ffFixed,8,2)+kCR; lDicomData.TR := (lRangeRA[kDynTime].max-lRangeRA[kDynTime].min) /(lDicomData.XYZdim[4] - 1)*1000; //infer TR in ms end else lReportedTRStr :=''; //next: report header details lDynStr := 'Philips PAR/REC Format' //'PAR/REC Format' +kCR+ 'Patient name:'+lDicomData.PatientName +kCR+ 'XYZ dim: ' +inttostr(lDicomData.XYZdim[1])+'/'+inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) +kCR+'Volumes: ' +inttostr(lDicomData.XYZdim[4]) +kCR+'XYZ mm: '+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2) +kCR+'TR: '+floattostrf(lDicomData.TR,ffFixed,8,2) +kCR+lReportedTRStr+kCR+lDynStr; //if we get here, the header is fine, next steps will see if image format is readable... lHdrOK := true; if lSliceInfoCount < 1 then goto 333; //next: see if slices are in sequence lSlicesNotInSequence := false; if lSliceInfoCount > 1 then begin lMaxSlice := lSliceSequenceRA^[1]; lMaxIndex := lSliceIndexRA[1]; lInc := 1; repeat inc(lInc); if lSliceSequenceRA^[lInc] < lMaxSlice then //not in sequence if image has lower slice order than previous image lSlicesNotInSequence := true else lMaxSlice := lSliceSequenceRA^[lInc]; if lSliceIndexRA[lInc] < lMaxIndex then //not in sequence if image has lower slice index than previous image lSlicesNotInSequence := true else lMaxIndex := lSliceIndexRA[lInc]; until (lInc = lSliceInfoCount) or (lSlicesNotInSequence); end; //at least 2 slices //Next: report any errors lErrorStr := ''; if (lSlicesNotInSequence) and (not lReadOffsetTables) then lErrorStr := lErrorStr + ' Slices not saved sequentially [using MRIcro''s ''Philips PAR to Analyze'' command may solve this]'+kCR; if lSliceInfoCount > kMaxnSlices then lErrorStr := lErrorStr + ' Too many slices: >'+inttostr(kMaxnSlices)+kCR; if (not lReadVaryingScaleFactors) and ( (lRangeRA[kSlope].min <> lRangeRA[kSlope].max) or (lRangeRA[kIntercept].min <> lRangeRA[kIntercept].max)) then lErrorStr := lErrorStr + ' Differing intensity slope/intercept [using MRIcro''s ''Philips PAR to Analyze'' command may solve this]'+kCR; if (lRangeRA[kBitsPerVoxel].min <> lRangeRA[kBitsPerVoxel].max) then //5D file space+time+cardiac lErrorStr := lErrorStr + ' Differing bits per voxel'+kCR; //if (lRangeRA^[kCardiac].min <> lRangeRA^[kCardiac].max) then //5D file space+time+cardiac // lErrorStr := lErrorStr + 'Multiple cardiac timepoints'+kCR; //if (lRangeRA^[kEcho].min <> lRangeRA^[kEcho].max) then //5D file space+time+echo // lErrorStr := lErrorStr + 'Multiple echo timepoints'+kCR; if (lRangeRA[kSliceThick].min <> lRangeRA[kSliceThick].max) or (lRangeRA[kSliceGap].min <> lRangeRA[kSliceGap].max) or (lRangeRA[kXdim].min <> lRangeRA[kXdim].max) or (lRangeRA[kYDim].min <> lRangeRA[kYDim].max) or (lRangeRA[kXmm].min <> lRangeRA[kXmm].max) or (lRangeRA[kYmm].min <> lRangeRA[kYmm].max) then lErrorStr := lErrorStr + ' Multiple/varying slice dimensions'+kCR; //if any errors were encountered, report them.... if lErrorStr <> '' then begin Msg('read_PAR_data: This software can not convert this Philips data:'+kCR+lErrorStr); goto 333; end; //Next sort image indexes here... if (lSliceInfoCount > 1) and(lSlicesNotInSequence) and ( lReadOffsetTables) then begin //sort image order... //ShellSort (first, last: integer; var lPositionRA, lIndexLoRA,lIndexHiRA: LongintP; var lRepeatedValues: boolean) GetMem (lOffset_pos_table, lSliceInfoCount*sizeof(longint)); for lInc := 1 to lSliceInfoCount do lOffset_pos_table^[lInc] := lInc; ShellSortItems (1, lSliceInfoCount,lOffset_pos_table,lSliceSequenceRA, lRepeatedValues); if lRepeatedValues then begin Msg('read_PAR_data: fatal error, slices do not appear to have unique indexes [multiple copies of same slice]'); FreeMem (lOffset_pos_table); goto 333; end; lOffsetTableEntries := lSliceInfoCount; end; //sort image order... //Next, generate list of scale slope if (lSliceInfoCount > 1) and (lReadVaryingScaleFactors) and ( (lRangeRA[kSlope].min <> lRangeRA[kSlope].max) or (lRangeRA[kIntercept].min <> lRangeRA[kIntercept].max)) then begin {create offset LUT} lVaryingScaleFactorsTableEntries := lSliceInfoCount; getmem (lVaryingScaleFactors_table, lVaryingScaleFactorsTableEntries*sizeof(single)); getmem (lVaryingIntercept_table, lVaryingScaleFactorsTableEntries*sizeof(single)); if lOffsetTableEntries = lSliceInfoCount then begin //need to sort slices for lInc := 1 to lSliceInfoCount do begin lVaryingScaleFactors_table^[lInc] := lSliceSlopeRA[lOffset_pos_table^[lInc]]; lVaryingIntercept_table^[lInc] := lSliceInterceptRA[lOffset_pos_table^[lInc]]; if gPARprecise then begin if (lVaryingIntercept_table^[lInc] <> 0) or (lCalibratedSliceSlopeRA[lOffset_pos_table^[lInc]]=0) then Msg('Warning: Unable to save calibrated Philips image intensity (non-zero scaling intercept). Turn off Etc/Options/CalibratedScaling to hide warning.') else begin lVaryingScaleFactors_table^[lInc] := 1 / lCalibratedSliceSlopeRA[lOffset_pos_table^[lInc]]; end; end; //if PARprecise end; end else begin //if sorted, else unsorted for lInc := 1 to lSliceInfoCount do begin lVaryingScaleFactors_table^[lInc] := lSliceSlopeRA[lInc]; lVaryingIntercept_table^[lInc] := lSliceInterceptRA[lInc]; if gPARprecise then begin if (lVaryingIntercept_table^[lInc] <> 0) or (lCalibratedSliceSlopeRA[lInc]=0) then Msg('Warning: Unable to save calibrated Philips image intensity (non-zero scaling intercept). Turn off Etc/Options/CalibratedScaling to hide warning.') else lVaryingScaleFactors_table^[lInc] := 1 / lCalibratedSliceSlopeRA[lInc]; end; //if PARprecise end; end; //slices sorted end;//read scale factors //Next: now adjust Offsets to point to byte offset instead of slice number lSliceSz := lDicomData.XYZdim[1]*lDicomData.XYZdim[2]*(lDicomData.Allocbits_per_pixel div 8); if lOffsetTableEntries = lSliceInfoCount then for lInc := 1 to lSliceInfoCount do lOffset_pos_table^[lInc] := lSliceSz * (lSliceIndexRA[lOffset_pos_table^[lInc]]); //report if 5D/6D/7D file is being saved as 4D if (lRangeRA[kCardiac].min <> lRangeRA[kCardiac].max) or (lRangeRA[kEcho].min <> lRangeRA[kEcho].max) //5D file space+time+echo or (lRangeRA[kType].min <> lRangeRA[kType].max) //5D file space+time+echo or (lRangeRA[kSequence].min <> lRangeRA[kSequence].max) then //5D file space+time+echo Msg('Warning: note that this image has more than 4 dimensions (multiple Cardiac/Echo/Type/Sequence)'); //if we get here, the Image Format is OK lImageFormatOK := true; lFileName := changefileextX(lFilename,'.rec'); //for Linux: case sensitive extension search '.rec' <> '.REC' 333: //abort clause: skips lHdrOK and lImageFormatOK //next: free dynamically allocated memory FreeMem( lCharRA); FreeMem (lSliceSequenceRA); end; *) procedure read_ge_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); label 539; var lGap,lSliceThick,lTempFloat: single; lTemp16,lI: word; lSeriesOffset,lTemp32,lExamHdr,lImgHdr,lDATFormatOffset,lHdrOffset,lCompress,linitialoffset,n,filesz: LongInt; tx : array [0..36] of Char; FP: file; lGEodd,lGEFlag,{lSpecial,}lMR: boolean; function GEflag: boolean; begin if (tx[0] = 'I') AND (tx[1]= 'M') AND (tx[2] = 'G')AND (tx[3]= 'F') then result := true else result := false; end; function swap16i(lPos: longint): word; var w : Word; begin seek(fp,lPos-2); BlockRead(fp, W, 2); result := swap(W); end; function swap32i(lPos: longint): Longint; type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(Long:LongInt); end; swaptypep = ^swaptype; var s : LongInt; inguy:swaptypep; outguy:swaptype; begin seek(fp,lPos); BlockRead(fp, s, 4, n); inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); swap32i:=outguy.Long; end; function fswap4r (lPos: longint): single; type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(float:single); end; swaptypep = ^swaptype; var s:single; inguy:swaptypep; outguy:swaptype; begin seek(fp,lPos); BlockRead(fp, s, 4, n); inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); fswap4r:=outguy.float; end; begin lImageFormatOK := true; lSeriesOffset := 0; lSLiceThick := 0; lGap := 0; lHdrOK := false; lHdrOffset := 0; if not fileexists(lFileName) then begin lImageFormatOK := false; exit; end; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); FIleSz := FileSize(fp); lDATFormatOffset := 0; Clear_Dicom_Data(lDicomData); if filesz < (3240) then begin Msg('This file is too small to be a Genesis DAT format image.'); goto 539; end; lDynStr:= ''; //lGEFlag := false; lInitialOffset := 3228;//3240; seek(fp, lInitialOffset); BlockRead(fp, tx, 4*SizeOf(Char), n); lGEflag := GEFlag; if not lGEFlag then begin lInitialOffset := 3240; seek(fp, lInitialOffset); BlockRead(fp, tx, 4*SizeOf(Char), n); lGEflag := GEFlag; end; lGEodd := lGEFlag; if not lGEFlag then begin lInitialOffset := 0; seek(fp, lInitialOffset); BlockRead(fp, tx, 4*SizeOf(Char), n); if not GEflag then begin {DAT format} lDynStr := lDynStr+'GE Genesis Signa DAT tape format'+kCR; seek(fp,114); BlockRead(fp, tx, 4*SizeOf(Char), n); lDynStr := lDynStr + 'Suite: '; for lI := 0 to 3 do lDynStr := lDynStr + tx[lI]; lDynStr := lDynStr + kCR; seek(fp,114+97); BlockRead(fp, tx, 25*SizeOf(Char), n); lDynStr := lDynStr + 'Patient Name: '; for lI := 0 to 24 do lDynStr := lDynStr + tx[lI]; lDynStr := lDynStr + kCR; seek(fp,114+84); BlockRead(fp, tx, 13*SizeOf(Char), n); lDynStr := lDynStr + 'Patient ID: '; for lI := 0 to 12 do lDynStr := lDynStr + tx[lI]; lDynStr := lDynStr + kCR; seek(fp, 114+305); BlockRead(fp, tx, 3*SizeOf(Char), n); if (tx[0]='M') and (tx[1] = 'R') then lMR := true else if (tx[0] = 'C') and(tx[1] = 'T') then lMR := false else begin Msg('Is this a Genesis DAT image? The modality is '+tx[0]+tx[1]+tx[3] +'. Expected ''MR'' or ''CT''.'); goto 539; end; if lMR then lInitialOffset := 3180 else lInitialOffset := 3178; seek(fp, lInitialOffset); BlockRead(fp, tx, 4*SizeOf(Char), n); if (tx[0] <> 'I') OR (tx[1] <> 'M') OR (tx[2] <> 'G') OR (tx[3] <> 'F') then begin Msg('This image does not have the required label ''IMGF''. This is not a Genesis DAT image.'); goto 539; end else lDicomData.ImageNum := swap16i(2158+12); lDicomData.XYZmm[3] := fswap4r (2158+26);// slice thickness mm lDicomData.XYZmm[1] := fswap4r (2158+50);// pixel size- X lDicomData.XYZmm[2] := fswap4r (2158+54);//pixel size - Y lSliceThick := lDicomData.XYZmm[3]; lGap := fswap4r (lHdrOffset+118);//1410 gap thickness mm if lGap > 0 then lDicomData.XYZmm[3] := lDicomData.XYZmm[3] + lGap; lDATFormatOffset := 4; if lMR then begin lTemp32 := swap32i(2158+194); lDynStr := lDynStr +'TR[usec]: '+inttostr(lTemp32) + kCR; lTemp32 := swap32i(2158+198); lDynStr := lDynStr +'TInvert[usec]: '+inttostr(lTemp32) + kCR; lTemp32 := swap32i(2158+202); lDynStr := lDynStr +'TE[usec]: '+inttostr(lTemp32) + kCR; lTemp16 := swap16i(2158+210); lDynStr := lDynStr +'Number of echoes: '+inttostr(lTemp16) + kCR; lTemp16 := swap16i(2158+212); lDynStr := lDynStr +'Echo: '+inttostr(lTemp16) + kCR; lTempFloat := fswap4r (2158+50); //not sure why I changed this to 50... 218 in Clunie's Description lDynStr := lDynStr +'NEX: '+floattostr(lTempFloat) + kCR; seek(fp,2158+308); BlockRead(fp, tx, 33*SizeOf(Char), n); lDynStr := lDynStr + 'Sequence: '; for lI := 0 to 32 do lDynStr := lDynStr + tx[lI]; lDynStr := lDynStr + kCR; seek(fp,2158+362); BlockRead(fp, tx, 17*SizeOf(Char), n); lDynStr := lDynStr + 'Coil: '; for lI := 0 to 16 do lDynStr := lDynStr + tx[lI]; lDynStr := lDynStr + kCR; end; end; {DAT format} end; lDicomData.ImageStart := lDATFormatOffset+linitialoffset + swap32i(linitialoffset+4);//byte displacement to image data lDicomData.XYZdim[1] := swap32i(linitialoffset+8); //width lDicomData.XYZdim[2] := swap32i(linitialoffset+12);//height lDicomData.Allocbits_per_pixel := swap32i(linitialoffset+16);//bits //xlDicomData.Storedbits_per_pixel:= lDicomData.Allocbits_per_pixel; lCompress := swap32i(linitialoffset+20); //compression lExamHdr := swap32i(linitialoffset+136); lImgHdr := swap32i(linitialoffset+152); if (lImgHdr = 0) and (lDicomData.ImageStart = 8432) then begin lDicomData.ImageNum := swap16i(2310+12); lDicomData.XYZmm[3] := fswap4r (2310+26);// slice thickness mm lDicomData.XYZmm[1] := fswap4r (2310+50);// pixel size- X lDicomData.XYZmm[2] := fswap4r (2310+54);//pixel size - Y lSliceThick := lDicomData.XYZmm[3]; lGap := fswap4r (lHdrOffset+118);//1410 gap thickness mm if lGap > 0 then lDicomData.XYZmm[3] := lDicomData.XYZmm[3] + lGap; end else if {(lSpecial = false) and} (lDATFormatOffset = 0) then begin lDynStr := lDynStr+'GE Genesis Signa format'+kCR; if (not lGEodd) and (lExamHdr <> 0) then begin lHdrOffset := swap32i(linitialoffset+132);//x132- int ptr to exam heade //Patient ID seek(fp,lHdrOffset+84); BlockRead(fp, tx, 13*SizeOf(Char), n); lDynStr := lDynStr + 'Patient ID: '; for lI := 0 to 12 do lDynStr := lDynStr + tx[lI]; lDynStr := lDynStr + kCR; //Patient Name seek(fp,lHdrOffset+97); BlockRead(fp, tx, 25*SizeOf(Char), n); lDynStr := lDynStr + 'Patient Name: '; for lI := 0 to 24 do lDynStr := lDynStr + tx[lI]; lDynStr := lDynStr + kCR; //Patient Age lI := swap16i(lHdrOffset+122); lDynStr := lDynStr+'Patient Age: '+inttostr(lI)+kCR; //Modality: MR or CT seek(fp,lHdrOffset+305); BlockRead(fp, tx, 3*SizeOf(Char), n); lDynStr := lDynStr + 'Type: '; for lI := 0 to 1 do lDynStr := lDynStr + tx[lI]; lDynStr := lDynStr + kCR; //Read series header lSeriesOffset := swap32i(linitialoffset+144);//read size of series header: only read if >0 if lSeriesOffset > 12 then begin lSeriesOffset := swap32i(linitialoffset+140);//read size of series header: only read if >0 lI := swap16i(lSeriesOffset+10); //lDynStr := lDynStr+'Series number: '+inttostr(lI)+kCR; lDicomData.SeriesNum := lI; end; //image data lHdrOffset := swap32i(linitialoffset+148);//x148- int ptr to image heade end; if lGEodd then lHdrOffset := 2158+28; if ((lHdrOffset +58) < FileSz) and (lImgHdr <> 0) then begin lDicomData.AcquNum := swap16i(lHdrOffset+12); //note SERIES not IMAGE number, despite what Clunies FAQ says lDicomData.ImageNum := swap16i(lHdrOffset+14); //this is IMAGEnum //lDynStr := lDynStr +'Image number: '+inttostr(lDicomData.ImageNum)+ kCR; lDicomData.XYZmm[3] := fswap4r (lHdrOffset{linitialoffset+lHdrOffset}+26);// slice thickness mm lDicomData.XYZmm[1] := fswap4r (lHdrOffset{linitialoffset+lHdrOffset}+50);// pixel size- X lDicomData.XYZmm[2] := fswap4r (lHdrOffset{linitialoffset+lHdrOffset}+54);//pixel size - Y lSliceThick := lDicomData.XYZmm[3]; lGap := fswap4r (lHdrOffset+118);//1410 gap thickness mm if lGap > 0 then lDicomData.XYZmm[3] := lDicomData.XYZmm[3] + lGap; end; end; if (lCompress = 3) or (lCompress = 4) then begin lImageFormatOK := false;//xlDicomData.GenesisCpt := true; lDynStr := lDynStr+'Compressed data'+kCR; end else ;//xlDicomData.GenesisCpt := false; if (lCompress = 2) or (lCompress = 4) then begin lImageFormatOK := false;//xlDicomData.GenesisPackHdr := swap32i(linitialoffset+64); lDynStr := lDynStr+'Packed data'+kCR; end else //xlDicomData.GenesisPackHdr := 0; lDynStr := lDynStr+'Series Number: '+inttostr(lDicomData.SeriesNum) +kCR+'Acquisition Number: '+inttostr(lDicomData.AcquNum) +kCR+'Image Number: '+inttostr(lDicomData.ImageNum) +kCR+'Slice Thickness/Gap: '+floattostrf(lSliceThick,ffFixed,8,2)+'/'+floattostrf(lGap,ffFixed,8,2) +kCR+'XYZ dim: ' +inttostr(lDicomData.XYZdim[1])+'/'+inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) +kCR+'XYZ mm: '+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2); lHdrOK := true; 539: CloseFile(fp); FileMode := 2; //set to read/write end;//read_ge //start siemens procedure read_siemens_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); label 567; var lI: word; lYear,lMonth,lDay,n,filesz,lFullSz,lMatrixSz,lIHour,lIMin,lISec{,lAHour,lAMin,lASec}: LongInt; lFlipAngle,lGap,lSliceThick: double; tx : array [0..26] of Char; lMagField,lTE,lTR: double; lInstitution,lName, lID,lMinStr,lSecStr{,lAMinStr,lASecStr}: String; FP: file; function swap32i(lPos: longint): Longint; type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(Long:LongInt); end; swaptypep = ^swaptype; var s : LongInt; inguy:swaptypep; outguy:swaptype; begin seek(fp,lPos); BlockRead(fp, s, 4, n); inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); swap32i:=outguy.Long; //swap32i:=inguy.Long; end; function fswap8r (lPos: longint): double; type swaptype = packed record case byte of 0:(Word1,Word2,Word3,Word4 : word); //word is 16 bit 1:(float:double); end; swaptypep = ^swaptype; var s:double; inguy:swaptypep; outguy:swaptype; begin seek(fp,lPos); BlockRead(fp, s, 8, n); inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word4); outguy.Word2 := swap(inguy^.Word3); outguy.Word3 := swap(inguy^.Word2); outguy.Word4 := swap(inguy^.Word1); fswap8r:=outguy.float; end; begin lImageFormatOK := true; lHdrOK := false; if not fileexists(lFileName) then begin lImageFormatOK := false; exit; end; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); FIleSz := FileSize(fp); Clear_Dicom_Data(lDicomData); if filesz < (6144) then begin Msg('This file is to small to be a Siemens Magnetom Vision image.'); goto 567; end; seek(fp, 96); BlockRead(fp, tx, 7*SizeOf(Char), n); if (tx[0] <> 'S') OR (tx[1] <> 'I') OR (tx[2] <> 'E') OR (tx[3] <> 'M') then begin {manufacturer is not SIEMENS} Msg('Is this a Siemens Magnetom Vision image [Manufacturer tag should be ''SIEMENS''].'); goto 567; end; {manufacturer not siemens} seek(fp, 105); BlockRead(fp, Tx, 25*SizeOf(Char), n); lINstitution := ''; for lI := 0 to 24 do begin if tx[lI] in ['/','\','a'..'z','A'..'Z',' ','+','-','.',',','0'..'9'] then lINstitution := lINstitution + tx[lI]; end; seek(fp, 768); BlockRead(fp, Tx, 25*SizeOf(Char), n); lName := ''; for lI := 0 to 24 do begin if tx[lI] in ['/','\','a'..'z','A'..'Z',' ','+','-','.',',','0'..'9'] then lName := lName + tx[lI]; end; seek(fp, 795); BlockRead(fp, Tx, 12*SizeOf(Char), n); lID := ''; for lI := 0 to 11 do begin if tx[lI] in ['/','\','a'..'z','A'..'Z',' ','+','-','.',',','0'..'9'] then lID := lID + tx[lI]; end; lDicomData.ImageStart := 6144; lYear := swap32i(0); lMonth := swap32i(4); lDay := swap32i(8); lIHour := swap32i(68); lIMin := swap32i(72); lISec := swap32i(76); lDicomData.XYZmm[3] := fswap8r (1544); lMagField := fswap8r (2560); lTR := fswap8r (1560); lTE := fswap8r (1568); lDIcomData.AcquNum := swap32i(3212); lMatrixSz := swap32i(2864); lDicomData.SiemensSlices := swap32i(4004); //1366 //lFullSz := swap32i(4008); //lInterleaveIf4 := swap32i(2888); lFullSz := (2*lMatrixSz*lMatrixSz);//16bitdata if ((FileSz - 6144) mod lFullSz) = 0 then begin case ((FileSz-6144) div lFullSz) of 4: lFullSz := 2*lMatrixSz; 9: lFullSz := 3*lMatrixSz; 16: lFullSz := 4*lMatrixSz; 25: lFullSz := 5*lMatrixSz; 36: lFullSz := 6*lMatrixSz; 49: lFullSz := 7*lMatrixSz; 64: lFullSz := 8*lMatrixSz; else lFullSz := lMatrixSz; end; end else lFullSz := lMatrixSz; {3744/3752 are XY FOV in mm!} lDicomData.XYZdim[1] := lFullSz;//lMatrixSz; //width lDicomData.XYZdim[2] := lFullSz;//lMatrixSz;//height {5000/5008 are size in mm, but wrong for mosaics} if lMatrixSz <> 0 then begin lDicomData.XYZmm[2] := fswap8r (3744)/lMatrixSz; lDicomData.XYZmm[1] := fswap8r (3752)/lMatrixSz; if ((lDicomData.XYZdim[1] mod lMatrixSz)=0) then lDicomData.SiemensMosaicX := lDicomData.XYZdim[1] div lMatrixSz; if ((lDicomData.XYZdim[2] mod lMatrixSz)=0) then lDicomData.SiemensMosaicY := lDicomData.XYZdim[2] div lMatrixSz; if lDicomData.SiemensMosaicX < 1 then lDicomData.SiemensMosaicX := 1; //1366 if lDicomData.SiemensMosaicY < 1 then lDicomData.SiemensMosaicY := 1; //1366 end; lFlipAngle := fswap8r (2112); //1414 { lDicomData.XYZmm[2] := fswap8r (5000); lDicomData.XYZmm[1] := fswap8r (5008);} lSliceThick := lDicomData.XYZmm[3]; lGap := fswap8r (4136); //gap as ratio of slice thickness?!?! if {lGap > 0} (lGap=-1) or (lGap=-19222) then //1410: exclusion values: do not ask me why 19222: from John Ashburner else begin //lDicomData.XYZmm[3] := abs(lDicomData.XYZmm[3] * (1+lGap)); lGap := lDicomData.XYZmm[3] * (lGap); lDicomData.XYZmm[3] := abs(lDicomData.XYZmm[3] +lGap); end; lDicomData.Allocbits_per_pixel := 16;//bits //xlDicomData.Storedbits_per_pixel:= lDicomData.Allocbits_per_pixel; //xlDicomData.GenesisCpt := false; //xlDicomData.GenesisPackHdr := 0; lMinStr := inttostr(lIMin); if length(lMinStr) = 1 then lMinStr := '0'+lMinStr; lSecStr := inttostr(lISec); if length(lSecStr) = 1 then lSecStr := '0'+lSecStr; lDynStr := 'Siemens Magnetom Vision Format'+kCR+'Name: '+lName+kCR+'ID: '+lID+kCR+'Institution: '+lInstitution+kCR+ 'Study DD/MM/YYYY: '+inttostr(lDay)+'/'+inttostr(lMonth)+'/'+inttostr(lYear)+kCR+ 'Image Hour/Min/Sec: '+inttostr(lIHour)+':'+lMinStr+':'+lSecStr+kCR+ //'Acquisition Hour/Min/Sec: '+inttostr(lAHour)+':'+lAMinStr+':'+lASecStr+kCR+ 'Magnetic Field Strength: '+ floattostrf(lMagField,ffFixed,8,2)+kCR+ 'Image index: '+inttostr(lDIcomData.AcquNum)+kCR+ 'Time Repitition/Echo [TR/TE]: '+ floattostrf(lTR,ffFixed,8,2)+'/'+ floattostrf(lTE,ffFixed,8,2)+kCR+ 'Flip Angle: '+ floattostrf(lFlipAngle,ffFixed,8,2)+kCR+ 'Slice Thickness/Gap: '+floattostrf(lSliceThick,ffFixed,8,2)+'/'+floattostrf(lGap,ffFixed,8,2)+kCR+ 'XYZ dim:' +inttostr(lDicomData.XYZdim[1])+'/' +inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3])+kCR+ 'XY matrix:' +inttostr(lDicomData.SiemensMosaicX)+'/' +inttostr(lDicomData.SiemensMosaicY)+kCR+ 'XYZ mm:'+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2); lHdrOK := true; //lDIcomData.AcquNum := 0; 567: CloseFile(fp); FileMode := 2; //set to read/write end; //end siemens //begin elscint procedure read_elscint_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); label 539; var //lExamHdr,lImgHdr,lDATFormatOffset,lHdrOffset, {lDate,}lI,lCompress,n,filesz: LongInt; tx : array [0..41] of Char; FP: file; function readStr(lPos,lLen: integer): string; var lStr: string; lStrInc: integer; begin seek(fp,lPos); BlockRead(fp, tx, lLen, n); lStr := ''; for lStrInc := 0 to (lLen-1) do lStr := lStr + tx[lStrInc]; result := lStr end; function read8ch(lPos: integer): char; begin seek(fp,40); BlockRead(fp, result, 1, n); //lDicomData.ImageNum := ord(tx[0]); end; procedure read16i(lPos: longint; var lVal: integer); var lInWord: word; begin seek(fp,lPos); BlockRead(fp, lInWord, 2); lVal := lInWord; end; procedure read32i(lPos: longint; var lVal: integer); var lInINt: integer; begin seek(fp,lPos); BlockRead(fp, lInINt, 4); lVal :=lInINt; end; begin lImageFormatOK := true; lHdrOK := false; if not fileexists(lFileName) then begin lImageFormatOK := false; exit; end; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); FIleSz := FileSize(fp); Clear_Dicom_Data(lDicomData); if filesz < (3240) then begin Msg('This file is too small to be a Elscint format image.'); goto 539; end; lDynStr:= ''; read16i(0, lI); if (lI <> 64206) then begin Msg('Unable to read this file: it does start with the Elscint signature.'); goto 539; end; lDicomdata.little_endian := 1; lDynStr:= 'Elscint Format'+kCR; lDynStr := lDynStr+'Patient Name: '+readstr(4,20)+kCR; lDynStr := lDynStr+'Patient ID: '+readstr(24,13)+kCR; read16i(38,lDicomData.AcquNum); lDicomData.ImageNum := ord(read8Ch(40)); lDynStr := lDynStr+'Doctor & Ward: '+readstr(100,20)+kCR; lDynStr := lDynStr+'Comments: '+readstr(120,40)+kCR; if ord(read8Ch(163)) = 1 then lDynStr := lDynStr + 'Sex: M'+kCR else lDynStr := lDynStr + 'Sex: F'+kCR; read16i(200,lI); lDicomData.XYZmm[3] := lI * 0.1; read16i(370,lDicomData.XYZdim[1]); read16i(372,lDicomData.XYZdim[2]); read16i(374,lI); lDicomData.XYZmm[1] := lI / 256; lDicomData.XYZmm[2] := lDicomData.XYZmm[1]; lCompress := ord(read8Ch(376)); //xlDicomData.ElscintCompress := true; //xread16i(400,lDicomData.WindowWidth); //x read16i(398,lDicomData.WindowCenter); case lCompress of 0: begin lDynStr := lDynStr + 'Compression: None'+kCR; //xlDicomData.ElscintCompress := false; end; 1: lImageFormatOK := false;//xlDynStr := lDynStr + 'Compression: Old'+kCR; 2: lImageFormatOK := false;//xlDynStr := lDynStr + 'Compression: 2400 Elite'+kCR; 22: lImageFormatOK := false;//xlDynStr := lDynStr + 'Compression: Twin'+kCR; else begin lImageFormatOK := false;//xlDynStr := lDynStr + 'Compression: Unknown '+inttostr(lCOmpress)+kCR; //lDicomData.ElscintCompress := false; end; end; //lDicomData.XYZdim[1] := swap32i(linitialoffset+8); //width //lDicomData.XYZdim[2] := swap32i(linitialoffset+12);//height lDicomData.ImageStart := 396; lDicomData.Allocbits_per_pixel := 16; //xlDicomData.Storedbits_per_pixel:= lDicomData.Allocbits_per_pixel; if (lDicomData.XYZdim[1]=160) and (lDicomData.XYZdim[2]= 160) and (FIleSz=52224) then begin lDicomData.ImageStart := 1024; lImageFormatOK := true;//x//xlDicomData.ElscintCompress := False; end; //lDicomData.XYZmm[3] := fswap4r (2310+26);// slice thickness mm lDynStr := lDynStr+'Image/Study Number: '+inttostr(lDicomData.ImageNum)+'/'+ inttostr(lDicomData.AcquNum)+kCR +'XYZ dim: ' +inttostr(lDicomData.XYZdim[1])+'/' +inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) //x+kCR+'Window Center/Width: '+inttostr(lDicomData.WindowCenter)+'/'+inttostr(lDicomData.WindowWidth) +kCR+'XYZ mm: '+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2); lHdrOK := true; lImageFormatOK := true; 539: CloseFile(fp); FileMode := 2; //set to read/write end; //end elscint //start picker procedure read_picker_data(lVerboseRead: boolean; var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); label 423; const kPickerHeader =8192; kRecStart = 280; //is this a constant? var lDataStart,lVal,lDBPos,lPos,lRecSz, lNumRecs,lRec,FileSz,n: Longint; lThkM,lThkN,lSiz: double; tx : array [0..6] of Char; FP: file; lDiskCacheRA: pChar; function ReadRec(lRecNum: integer): boolean; var lNameStr,lValStr: string; lOffset,lLen,lFPOs,lFEnd: integer; function ValStrToFloat: double; var lConvStr: string; lI: integer; begin Result := 0.0; lLen := Length(lValStr); if lLen < 1 then exit; lConvStr := ''; for lI := 1 to lLen do if lValStr[lI] in ['0'..'9'] then lConvStr := lConvStr+ lValStr[lI]; if Length(lConvStr) < 1 then exit; Result := strtofloat(lConvStr); end; begin Result := false; lFPos := ((lRecNum-1) * lRecSz)+ kRecStart; lFEnd := lFpos + 6; lNameStr := ''; for lFPos := lFPos to lFEnd do if ord(lDiskCacheRA[lFPos]) <> 0 then lNameStr := lNameStr +lDiskCacheRA[lFPos]; if (lVerboseRead) or (lNameStr = 'RCNFSIZ') or (lNameStr='SCNTHKM') or (lNameStr='SCNTHKN') then begin lFPos := ((lRecNum-1) * lRecSz)+ kRecStart+8; lFEnd := lFPos+1; lOffset := 0; for lFPos := lFPos to lFend do lOffset := ((lOffset)shl 8)+(ord(lDiskCacheRA[lFPos])); lFPos := ((lRecNum-1) * lRecSz)+ kRecStart+10; lFEnd := lFPos+1; lLen := 0; for lFPos := lFPos to lFend do lLen := ((lLen)shl 8)+(ord(lDiskCacheRA[lFPos])); lOffset := lDataStart+lOffset+1; lFEnd := lOffset+lLen-1; if (lLen < 1) or (lFEnd > kPickerHeader) then exit; lValStr := ''; for lFPos := (lOffset) to lFEnd do begin lValStr := lValStr+lDiskCacheRA[lFPos]; end; if lVerboseRead then lDynStr := lDynStr+kCR+lNameStr+': '+ lValStr; if (lNameStr = 'RCNFSIZ') then lSiz := ValStrToFloat; if (lNameStr='SCNTHKM') then lThkM := ValStrToFloat; if (lNameStr='SCNTHKN') then lThkN := ValStrToFloat; end; //verboseread, or vital value result := true; end; function FindStr(l1,l2,l3,l4,l5: Char; lReadNum: boolean; var lNum: integer): boolean; var //lMarker: integer; lNumStr: String; begin Result := false; repeat if (lDiskCacheRA[lPos-4]=l1) and (lDiskCacheRA[lPos-3]=l2) and (lDiskCacheRA[lPos-2]=l3) and (lDiskCacheRA[lPos-1]=l4) and (lDiskCacheRA[lPos]=l5) then Result := true; inc (lPos); until (Result) or (lPos >= kPickerHeader); if not Result then exit; if not lReadNum then exit; Result := false; lNumStr := ''; repeat if (lDiskCacheRA[lPos] in ['0'..'9']) then lNumStr := lNumStr + lDiskCacheRA[lPos] else if lNumStr <> '' then Result := true; inc(lPos); until (Result) or (lPos = kPickerHeader); lNum := strtoint(lNumStr); end; begin lSiz := 0.0; lThkM := 0.0; lThkN := 0.0; lImageFormatOK := true; lHdrOK := false; if not fileexists(lFileName) then begin lImageFormatOK := false; exit; end; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); FIleSz := FileSize(fp); Clear_Dicom_Data(lDicomData); if filesz < (kPickerHeader) then begin Msg('This file is to small to be a Picker image: '+lFileName ); CloseFile(fp); FileMode := 2; //set to read/write exit; end; seek(fp, 0); BlockRead(fp, tx, 4*SizeOf(Char), n); if (tx[0] <> '*') OR (tx[1] <> '*') OR (tx[2] <> '*') OR (tx[3] <> ' ') then begin {manufacturer is not SIEMENS} Msg('Is this a Picker image? Expected ''***'' at the start of the file.'+ lFileName); CloseFile(fp); FileMode := 2; //set to read/write exit; end; {not picker} if filesz = (kPickerHeader + (1024*1024*2)) then begin lDICOMdata.XYZdim[1] := 1024; lDICOMdata.XYZdim[2] := 1024; lDICOMdata.XYZdim[3] := 1; lDICOMdata.ImageStart := 8192; end else if filesz = (kPickerHeader + (512*512*2)) then begin lDICOMdata.XYZdim[1] := 512; lDICOMdata.XYZdim[2] := 512; lDICOMdata.XYZdim[3] := 1; lDICOMdata.ImageStart := 8192; end else if filesz = (8192 + (256*256*2)) then begin lDICOMdata.XYZdim[1] := 256; lDICOMdata.XYZdim[2] := 256; lDICOMdata.XYZdim[3] := 1; lDICOMdata.ImageStart := 8192; end else begin Msg('This file is the incorrect size to be a Picker image.'); CloseFile(fp); FileMode := 2; //set to read/write exit; end; getmem(lDiskCacheRA,kPickerHeader*sizeof(char)); seek(fp, 0); BlockRead(fp, lDiskCacheRA, kPickerHeader, n); lRecSz := 0; lNumRecs := 0; lPos := 5; if not FindStr('d','b','r','e','c',false, lVal) then goto 423; lDBPos := lPos; if not FindStr('r','e','c','s','z',true, lRecSz) then goto 423; lPos := lDBPos; if not FindStr('n','r','e','c','s',true, lnumRecs) then goto 423; lPos := kRecStart; // IS THIS A CONSTANT??? lDataStart :=kRecStart + (lRecSz*lnumRecs)-1; //file starts at 0, so -1 if (lNumRecs = 0) or (lDataStart> kPickerHeader) then goto 423; lRec := 0; lDynStr := 'Picker Format'; repeat inc(lRec); until (not (ReadRec(lRec))) or (lRec >= lnumRecs); if lSiz <> 0 then begin lDICOMdata.XYZmm[1] := lSiz/lDICOMdata.XYZdim[1]; lDICOMdata.XYZmm[2] := lSiz/lDICOMdata.XYZdim[2]; if lVerboseRead then lDynStr := lDynStr+kCR+'Voxel Size: '+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2) +'x'+ floattostrf(lDicomData.XYZmm[2],ffFixed,8,2); end; if (lThkM <> 0) and (lThkN <> 0) then begin lDICOMdata.XYZmm[3] := lThkN/lThkM; if lVerboseRead then lDynStr := lDynStr+kCR+'Slice Thickness: '+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2); end; 423: freemem(lDiskCacheRA); lHdrOK := true; CloseFile(fp); FileMode := 2; //set to read/write end; //end picker procedure read_minc_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); var // lReal: double; lnOri,lnDim,lStartPosition,nelem0,jj,lDT0,vSizeRA,BeginRA,m,nnelem,nc_type,nc_size,lLen,nelem,j,lFilePosition,lDT,lFileSz,lSignature,lWord: integer; lOri: array [1..3] of double; //tx : array [0..80] of Char; lVarStr,lStr: string; FP: file; function dTypeStr (lV: integer): integer; begin case lV of 1,2: result := 1; 3: result := 2; //int16 4: result := 4; //int32 5: result := 4; //single 6: result := 8; //double end; end; //nested fcn dTypeStr function read32i: Longint; type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(Long:LongInt); end; swaptypep = ^swaptype; var s : LongInt; inguy:swaptypep; outguy:swaptype; begin seek(fp,lFilePosition); lFilePosition := lFilePosition + 4; BlockRead(fp, s, 4); inguy := @s; //assign address of s to inguy if lDICOMdata.Little_Endian = 0 then begin outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); end else outguy.long := inguy^.long; result:=outguy.Long; end; function read64r (lDataType: integer): Double; type swaptype = packed record case byte of 0:(Word1,Word2,Word3,Word4 : word); //word is 16 bit 1:(Long:Double); end; swaptypep = ^swaptype; var s : Double; inguy:swaptypep; outguy:swaptype; begin result := 1; if lDataType <> 6 then begin Msg('Unknown data type: MRIcro is unable to determine the voxel size.'); exit; end; seek(fp,lFilePosition); lFilePosition := lFilePosition + 8; BlockRead(fp, s, 8); inguy := @s; //assign address of s to inguy if lDICOMdata.Little_Endian = 0 then begin outguy.Word1 := swap(inguy^.Word4); outguy.Word2 := swap(inguy^.Word3); outguy.Word3 := swap(inguy^.Word2); outguy.Word4 := swap(inguy^.Word1); end else outguy.long := inguy^.long; result:=outguy.Long; end; function readname: String; var lI,lLen: integer; lCh: char; begin result := ''; seek(fp,lFilePosition); lLen := read32i; if lLen < 1 then begin Msg('Terminal error reading netCDF/MINC header (String length < 1)'); exit; //problem end; for lI := 1 to lLen do begin BlockRead(fp, lCh, 1); result := result + lCh; end; lFilePosition := lFilePosition + (((lLen+3) div 4) * 4); end; begin lImageFormatOK := true; lHdrOK := false; if not fileexists(lFileName) then begin lImageFormatOK := false; exit; end; for lnOri := 1 to 3 do lOri[lnOri] := 0; lnOri := 4; lnDim := 4; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); lFileSz := FileSize(fp); Clear_Dicom_Data(lDicomData); if lFilesz < (77) then exit; //to small to be MINC lFilePosition := 0; lSignature := read32i; if not (lSignature=1128547841) then begin CloseFile(fp); FileMode := 2; //set to read/write Msg('Problem with MINC signature: '+ inttostr(lSignature)); exit; end; //xlDicomData.Rotate180deg := true; lWord := read32i;//numrecs lDT := read32i; while (lDt=10) or (lDT=11) or (lDT=12) do begin if lDT = 10 then begin //DT=10, Dimensions nelem := read32i; for j := 1 to nelem do begin lStr := readname; lLen := read32i; if lStr = 'xspace' then lDicomData.XYZdim[3] := lLen;//DOES MINC always reverse X and Z? see also XYZmm if lStr = 'yspace' then lDicomData.XYZdim[2] := lLen; if lStr = 'zspace' then lDicomData.XYZdim[1] := lLen; end; //for 1..nelem lDT := read32i; end;//DT=10, Dimensions if lDT = 11 then begin //DT=11, Variables nelem := read32i; for j := 1 to nelem do begin lVarStr := readname; nnelem := read32i; for m := 1 to nnelem do lLen := read32i; lDT0 := read32i; if lDT0 = 12 then begin nelem0 := read32i; for jj := 1 to nelem0 do begin lStr := readname; nc_type := read32i; nc_size := dTypeStr(nc_Type); nnelem := read32i; lStartPosition := lFilePosition; if (lStr = 'step') then begin if (lVarStr = 'xspace') or (lVarStr = 'yspace') or (lVarStr = 'zspace') then begin dec(lnDim); if (lnDim < 4) and (lnDim>0) then lDicomData.XYZmm[lnDim] := read64r(nc_Type) end; end else if (lStr = 'start') then begin if (lVarStr = 'xspace') or (lVarStr = 'yspace') or (lVarStr = 'zspace') then begin dec(lnOri); if (lnOri < 4) and (lnOri > 0) then lOri[lnOri] := read64r(nc_Type) end; end; lFilePosition := lStartPosition + ((((nnelem*nc_size)+3) div 4)*4); end; lDT0 := read32i; if lVarStr = 'image' then begin case lDT0 of 1,2: lDicomData.Allocbits_per_pixel := 8; 3: lDicomData.Allocbits_per_pixel := 16; //int16 4: lDicomData.Allocbits_per_pixel := 32; //int32 5: lDicomData.Allocbits_per_pixel := 32; //single 6: lDicomData.Allocbits_per_pixel := 64; //double end; if (lDT0 = 5) or (lDT0 = 6) then lDicomData.Float := true; //xlDicomData.Storedbits_per_pixel := lDicomData.Allocbits_per_pixel; //lImgNC_Type := lDT0; end; end; vSizeRA := read32i; BeginRA := read32i; if lVarStr = 'image' then begin lDICOMdata.ImageStart := BeginRA; end; end; //for 1..nelem lDT := read32i; end;//DT=11 if lDT = 12 then begin //DT=12, Attributes nelem := read32i; for j := 1 to nelem do begin lStr := readname; nc_type := read32i; nc_size := dTypeStr(nc_Type); nnelem := read32i; lFilePosition := lFilePosition + ((((nnelem*nc_size)+3) div 4)*4); end; //for 1..nelem lDT := read32i; end;//DT=12, Dimensions end; //while DT if lOri[1] <> 0 then lDicomData.XYZori[1] := round((-lOri[1])/lDicomData.XYZmm[1])+1; if lOri[2] <> 0 then lDicomData.XYZori[2] := round((-lOri[2])/lDicomData.XYZmm[2])+1; if lOri[3] <> 0 then lDicomData.XYZori[3] := round((-lOri[3])/lDicomData.XYZmm[3])+1; lDynStr := 'MINC image'+kCR+ 'XYZ dim:' +inttostr(lDicomData.XYZdim[1])+'/' +inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) +kCR+'XYZ origin:' +inttostr(lDicomData.XYZori[1])+'/' +inttostr(lDicomData.XYZori[2])+'/'+inttostr(lDicomData.XYZori[3]) +kCR+'XYZ size [mm or micron]:'+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2) +kCR+'Bits per sample/Samples per pixel: '+inttostr( lDICOMdata.Allocbits_per_pixel) +kCR+'Data offset:' +inttostr(lDicomData.ImageStart); lHdrOK := true; lImageFormatOK := true; CloseFile(fp); FileMode := 2; //set to read/write end; //read_minc //start TIF procedure read_tiff_data(var lDICOMdata: DICOMdata; var lReadOffsets, lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); label 566, 564; const kMaxnSLices = 6000; var lLongRA: LongIntP; lStackSameDim,lContiguous: boolean; l1stDicomData: DicomData; //lDouble : double; //lXmm,lYmm,lZmm: double; lSingle: single; lImageDataEndPosition,lStripPositionOffset,lStripPositionType,lStripPositionItems, lStripCountOffset,lStripCountType,lStripCountItems, lItem,lTagItems,lTagItemBytes,lTagPointer,lNumerator, lDenominator, lImage_File_Directory,lTagType,lVal,lDirOffset,lOffset,lFileSz, lnDirectories,lDir,lnSlices: Integer; lTag,lWord,lWord2: word; FP: file; (*FUNCTION longint2single ({var} s:longint): single; //returns true if s is Infinity, NAN or Indeterminate //4byte IEEE: msb[31] = signbit, bits[23-30] exponent, bits[0..22] mantissa //exponent of all 1s = Infinity, NAN or Indeterminate VAR Overlay: Single ABSOLUTE s; BEGIN result := Overlay; END;*) function read64r(lPos: integer):double; type swaptype = packed record case byte of 0:(Word1,Word2,Word3,Word4 : word); //word is 16 bit 1:(float:double); end; swaptypep = ^swaptype; var inguy:swaptypep; outguy:swaptype; s: double; begin seek(fp,lPos); BlockRead(fp, s, 8); inguy := @s; //assign address of s to inguy if lDICOMdata.Little_Endian = 0{false} then begin outguy.Word1 := swap(inguy^.Word4); outguy.Word2 := swap(inguy^.Word3); outguy.Word3 := swap(inguy^.Word2); outguy.Word4 := swap(inguy^.Word1); end else outguy.float := inguy^.float; result:=outguy.float; end; function read32i(lPos: longint): Longint; type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(Long:LongInt); end; swaptypep = ^swaptype; var s : LongInt; inguy:swaptypep; outguy:swaptype; begin seek(fp,lPos); BlockRead(fp, s, 4); inguy := @s; //assign address of s to inguy if lDICOMdata.Little_Endian = 0 then begin outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); end else outguy.long := inguy^.long; result:=outguy.Long; end; function read16(lPos: longint): Longint; var s : word; begin seek(fp,lPos); BlockRead(fp, s, 2); if lDICOMdata.Little_Endian = 0 then result := swap(s) else result := s; end; function read8(lPos: longint): Longint; var s : byte; begin seek(fp,lPos); BlockRead(fp, s, 1); result := s; end; function readItem(lItemNum,lTagTypeI,lTagPointerI: integer): integer; begin if lTagTypeI= 4 then result := read32i(lTagPointerI+((lItemNum-1)*4)) else result := read16(lTagPointerI+((lItemNum-1)*2)); end; begin Clear_Dicom_Data(lDicomData); if gECATJPEG_table_entries <> 0 then begin freemem (gECATJPEG_pos_table); freemem (gECATJPEG_size_table); gECATJPEG_table_entries := 0; end; //lXmm := -1; //not read lImageFormatOK := true; lHdrOK := false; if not fileexists(lFileName) then begin lImageFormatOK := false; exit; end; //lLongRASz := kMaxnSlices * sizeof(longint); getmem(lLongRA,kMaxnSlices*sizeof(longint)); FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); lFileSz := FileSize(fp); Clear_Dicom_Data(lDicomData); //xlDicomData.PlanarConfig:=0; if lFilesz < (28) then begin goto 566; end; //TmpStr := string(StrUpper(PChar(ExtractFileExt(lFileName)))); //if not (TmpStr = '.TIF') or (TmpStr = '.TIFF') then exit; lWord := read16(0); if lWord = $4d4d then lDICOMdata.little_endian := 0 else if lWord = $4949 then lDICOMdata.little_endian := 1; lWord2 := read16(2); //bits per pixel if ((lWord=$4d4d) or (lWord=$4949)) and (lWord2 = $002a) then else goto 566; lOffset := read32i(4); lImage_File_Directory := 0; lContiguous := true; lnSlices := 0; //xlDicomData.SamplesPerPixel := 1; //START while for each image_file_directory while (lOffset > 0) and ((lOffset+2+12+4) < lFileSz) do begin inc(lImage_File_Directory); lnDirectories := read16(lOffset); if (lnDirectories < 1) or ((lOffset+2+(12*lnDirectories)+4) > lFileSz) then goto 566; for lDir := 1 to lnDirectories do begin lDirOffset := lOffset+2+((lDir-1)*12); lTag := read16(lDirOffset); lTagType := read16(lDirOffset+2); lTagItems := read32i(lDirOffset+4); case lTagType of 1: lVal := 1;//bytes 3: lVal := 2;//word 4: lVal := 4;//long 5: lVal := 8;//rational else lVal := 1; //CHAR variable length end; lTagItemBytes := lVal * lTagItems; if lTagItemBytes > 4 then lTagPointer := read32i(lDirOffset+8) else lTagPointer := (lDirOffset+8); case lTagType of 1: lVal := read8(lDirOffset+8); 3: lVal := read16(lDirOffset+8); 4: lVal := read32i(lDirOffset+8); 5: begin //rational: two longs representing numerator and denominator lVal := read32i(lDirOffset+8); lNumerator := read32i(lVal); lDenominator := read32i(lVal+4); if lDenominator <> 0 then lSingle := lNumerator/lDenominator else lSingle := 1; if lSingle <> 0 then lSingle := 1/lSingle; //Xresolution/Yresolution refer to number of pixels per resolution_unit if lTag = 282 then lDicomData.XYZmm[1] := lSingle; if lTag = 283 then lDicomData.XYZmm[2] := lSingle; end; else lVal := 0; end; case lTag of //254: ;//NewSubFileType 256: lDicomData.XYZdim[1] := lVal;//image_width 257: lDicomData.XYZdim[2] := lVal;//image_height 258: begin //bits per sample if lTagItemBytes > 4 then lVal := 8; //if lVal <> 8 then goto 566; lDicomData.Allocbits_per_pixel := lVal;//bits //xlDicomData.Storedbits_per_pixel:= lDicomData.Allocbits_per_pixel; end; 259: begin if lVal <> 1 then begin Msg('TIFF Read Error: Image data is compressed. Currently only uncompressed data is supported.'); goto 566; //compressed data end; end; //x262: if lVal = 0 then lDicomdata.monochrome := 1;//invert colors //photometric_interpretation //MinIsWhite,MinIsBlack,Palette //270: ; //ImageDescription 273: begin //get offset to data lStripPositionOffset := lTagPointer; lStripPositionType := lTagType; lStripPositionItems := lTagItems; if (lImage_File_Directory=1) then lDicomData.ImageStart := readItem(1,lStripPositionType,lStripPositionOffset); end; //StripOffsets //274: ; //orientation 277: begin //xlDicomData.SamplesPerPixel := lVal; //if lVal <> 1 then goto 566; //samples per pixel end; 279: begin lStripCountOffset := lTagPointer; lStripCountType := lTagType; lStripCountItems := lTagItems; end; //278: message('rows:'+inttostr(lVal));//StripByteCount //279: message('count:'+inttostr(lVal));//StripByteCount //282 and 283 are rational values and read separately 284: begin {xif lVal = 1 then lDicomData.PlanarConfig:= 0 else lDicomData.PlanarConfig:= 1;//planarConfig } end; 34412: begin //Zeiss data header //0020h float x size of a pixel (Еm or s) //0024h float y size of a pixel (Еm or s) //0028h float z distance in a sequence (Еm or s) {stream.seek((int)position + 40); VOXELSIZE_X = swap(stream.readDouble()); stream.seek((int)position + 48); VOXELSIZE_Y = swap(stream.readDouble()); stream.seek((int)position + 56); VOXELSIZE_Z = swap(stream.readDouble());} lVal := read16(lTagPointer+2); if lVal = 1024 then begin //LSM510 v2.8 images lDicomData.XYZmm[1]{lXmm} := read64r(lTagPointer+40)*1000000; lDicomData.XYZmm[2]{lYmm} := read64r(lTagPointer+48)*1000000; lDicomData.XYZmm[3]{lZmm} := read64r(lTagPointer+56)*1000000; end; //following may work if lVal = 2, different type of LSM file I have not seen //lXmm := longint2single(read32i(lTagPointer+$0020)); //lYmm := longint2single(read32i(lTagPointer+$0024)); //lZmm := longint2single(read32i(lTagPointer+$0028)); end; //296: ;//resolutionUnit 1=undefined, 2=inch, 3=centimeter //320?? //LEICA: 34412 //SOFTWARE = 305 //DATE_TIME = 306 //ARTIST = 315 //PREDICTOR = 317 //COLORMAP = 320 => essntially custom LookUpTable //EXTRASAMPLES = 338 //SAMPLEFORMAT = 339 //JPEGTABLES = 347 // lDicomData.ImageStart := lVal //else if lImage_File_Directory = 1 then Msg(inttostr(lTag)+'@'+inttostr(lTagPointer)+' value: '+inttostr(lVal)); end; //case lTag end; //For Each Directory in Image_File_Directory lOffset := read32i(lOffset+2+(12*lnDirectories)); //NEXT: check that each slice in 3D slice is the same dimension lStackSameDim := true; if (lImage_File_Directory=1) then begin l1stDicomData := lDICOMdata; lnSlices := 1; //inc(lnSlices); end else begin if lDicomData.XYZdim[1] <> l1stDicomData.XYZdim[1] then lStackSameDim := false; if lDicomData.XYZdim[2] <> l1stDicomData.XYZdim[2] then lStackSameDim := false; if lDicomData.Allocbits_per_pixel <> l1stDicomData.Allocbits_per_pixel then lStackSameDim := false; //xif lDicomData.SamplesPerPixel <> l1stDicomData.SamplesPerPixel then lStackSameDim := false; //xif lDicomData.PlanarConfig <> l1stDicomData.PlanarConfig then lStackSameDim := false; if not lStackSameDim then begin //Msg(inttostr(lDicomData.XYZdim[1])+'x'+inttostr(l1stDicomData.XYZdim[1])); if (lDicomData.XYZdim[1]*lDicomData.XYZdim[2]) > (l1stDicomData.XYZdim[1]*l1stDicomData.XYZdim[2]) then begin l1stDicomData := lDICOMdata; lnSlices := 1; lStackSameDim := true; end; //Msg('TIFF Read Error: Different 2D slices in this 3D stack have different dimensions.'); //goto 566; end else inc(lnSlices); //if not samedim end; //check that each slice is same dimension as 1st //END check each 2D slice in 3D stack is same dimension //NEXT: check if image data is contiguous if (lStripCountItems > 0) and (lStripCountItems = lStripPositionItems) then begin if (lnSlices=1) then lImageDataEndPosition := lDicomData.ImageStart; for lItem := 1 to lStripCountItems do begin lVal := readItem(lItem,lStripPositionType,lStripPositionOffset); if (lVal <> lImageDataEndPosition) then lContiguous := false; //Msg(inttostr(lImage_File_Directory)+'@'+inttostr(lItem)); lImageDataEndPosition := lImageDataEndPosition+readItem(lItem,lStripCountType,lStripCountOffset); if not lcontiguous then begin if (lReadOffsets) and (lStackSameDim) then begin lLongRA^[lnSlices] := lVal; end else if (lReadOffsets) then //not correct size, but do not generate an error as we will read non-contiguous files else begin Msg('TIFF Read Error: Image data is not stored contiguously. '+ 'Solution: convert this image using MRIcro''s ''Convert TIFF/Zeiss to Analyze...'' command [Import menu].'); goto 564; end; end; //if not contiguous end; //for each item end;//at least one StripItem} //END check image data is contiguous end; //END while each Image_file_directory lDicomData := l1stDicomData; lDicomData.XYZdim[3] := lnSlices; if (lReadOffsets) and (lnSlices > 1) and (not lcontiguous) then begin gECATJPEG_table_entries := lnSlices; //Offset tables for TIFF getmem (gECATJPEG_pos_table, gECATJPEG_table_entries*sizeof(longint)); getmem (gECATJPEG_size_table, gECATJPEG_table_entries*sizeof(longint)); gECATJPEG_pos_table^[1] := l1stDicomData.ImageStart; for lVal := 2 to gECATJPEG_table_entries do gECATJPEG_pos_table^[lVal] := lLongRA^[lVal] end; lHdrOK := true; 564: lDynStr := 'TIFF image'+kCR+ 'XYZ dim:' +inttostr(lDicomData.XYZdim[1])+'/' +inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) +kCR+'XYZ size [mm or micron]:'+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2) +kCR+'Bits per sample/Samples per pixel: '+inttostr( lDICOMdata.Allocbits_per_pixel) +kCR+'Data offset:' +inttostr(lDicomData.ImageStart); {if lXmm > 0 then lDynStr := lDynStr +kCR+'Zeiss XYZ mm:'+floattostr(lXmm)+'/' +floattostr(lYmm)+'/' +floattostr(lZmm);} 566: freemem(lLongRA); CloseFile(fp); FileMode := 2; //set to read/write end; procedure read_biorad_data(var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;lFileName: string); var lCh: char; lByte: Byte; lSpaces,liPos,lFileSz,lWord,lNotes,lStart,lEnd: integer; tx : array [0..80] of Char; lInfo,lStr,lTmpStr: string; FP: file; procedure read16(lPos: longint; var lVal: integer); var lInWord: word; begin seek(fp,lPos); BlockRead(fp, lInWord, 2); lVal := lInWord; end; procedure read32(lPos: longint; var lVal: integer); var lInINt: integer; begin seek(fp,lPos); BlockRead(fp, lInINt, 4); lVal :=lInINt; end; begin lImageFormatOK := true; lHdrOK := false; if not fileexists(lFileName) then begin lImageFormatOK := false; exit; end; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); lFileSz := FileSize(fp); Clear_Dicom_Data(lDicomData); if lFilesz < (77) then exit; //to small to be biorad read16(54,lWord); if (lWord=12345) then begin lDicomData.little_endian := 1; read16(0,lDicomData.XYZdim[1]); read16(2,lDicomData.XYZdim[2]); read16(4,lDicomData.XYZdim[3]); read16(14,lWord);//byte format if lWord = 1 then lDicomData.Allocbits_per_pixel := 8 else lDicomData.Allocbits_per_pixel := 16;//bits //xlDicomData.Storedbits_per_pixel:= lDicomData.Allocbits_per_pixel; lDicomData.ImageStart := 76; read32(10,lNotes); lStart := (lDicomData.XYZdim[1]*lDicomData.XYZdim[2]*lDicomData.XYZdim[3])+76; lEnd := lStart + 96; lDynStr := 'BIORAD PIC image'+kCR; while (lNotes > 0) and (lFileSz >= lEnd) do begin read32(lStart+2,lNotes); //final note has bytes 2..5 set to zero //read16(lStart+10,lNoteType); //if lNoteType <> 1 then begin //ignore 'LIVE' notes - they do not include calibration info seek(fp, lStart+16); BlockRead(fp, tx, 80{, n}); lStr := ''; liPos := 0; repeat lCh := tx[liPos]; lByte := ord(lCh); if (lByte >= 32) and (lByte <= 126) then lStr := lStr+lCh else lByte := 0; inc(liPos); until (liPos = 80) or (lByte = 0); if length(lStr) > 6 then begin lInfo := ''; for liPos := 1 to 6 do lInfo := lInfo+upcase(lStr[liPos]); ltmpstr := ''; lSpaces := 0; for liPos := 1 to 80 do begin if lStr[liPos]=' ' then inc(lSpaces) else if lSpaces = 3 then ltmpstr := ltmpstr + lStr[liPos]; end; if ltmpstr = '' then {no value to read} else if lInfo = 'AXIS_2' then lDicomData.XYZmm[1] := strtofloat(ltmpstr) else if lInfo = 'AXIS_3' then lDicomData.XYZmm[2] := strtofloat(ltmpstr) else if linfo = 'AXIS_4' then lDicomData.XYZmm[3] := strtofloat(ltmpstr); lDynStr := lDynStr+lStr+kCR; end; //Str length > 6 //end;//notetype lStart := lEnd; lEnd := lEnd + 96; end; //while notes lHdrOK := true; //lImageFormatOK := true; end;//biorad signature CloseFile(fp); FileMode := 2; //set to read/write lDynStr := 'BioRad image'+kCR+ 'XYZ dim:' +inttostr(lDicomData.XYZdim[1])+'/' +inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) +kCR+'XYZ size [mm or micron]:'+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2) +kCR+'Bits per sample/Samples per pixel: '+inttostr( lDICOMdata.Allocbits_per_pixel) +kCR+'Data offset:' +inttostr(lDicomData.ImageStart); end; //biorad function SiemensVersion (lStr: string): integer; //Convert tag 0018,1020 from DICOM header to Siemens version number (*Returned value: system is in 1000s, last two digits are version Siemens syngo MR 2006T 4VB12T //-> 0012 MR B13 4VB13A //->0013 MR.VB15A123 //->0015 syngo MR B15 //-> 0015 syngo MR B17 //->0017 B= Trio, Verio, Etc syngo MR C11 //->1011 C= Chinese C11 ~ B17 syngo MR D11 //->2011 D= Skyra D11 ~ B17*) label 999; var i,len: integer; begin result := 0; len := length(lStr); if len < 3 then exit; for i := 1 to len-1 do if (upcase(lStr[i]) in ['A'..'Z']) and (lStr[i+1] in ['0'..'9']) then goto 999; exit; //not Siemens format 999: result := strtoint(lStr[i+1]); if lStr[i+2] in ['0'..'9'] then result := (result*10) + strtoint(lStr[i+2]); result := (100*( ord(upcase(lStr[i]))- ord('B'))) + result; end; (* Obsolete - replaced by SiemensVersion function SiemensBversion (lStr: string): integer; //'syngo MR B17' returns 17 //'MR.VB15A123' returns 15 //'syngo MR B15' returns 15 //'MR B13 4VB13A' returns 13 //'syngo MR 2006T 4VB12T' returns 12 var Len,P,B: integer; S: string; begin result := 0; Len := length(lStr); if Len <2 then exit; B := 0; for P := 2 to (Len) do if (upcase(lStr[P-1])='B') and ( lStr[P] in ['0'..'9']) then B := P; if B < 1 then exit; S := ''; while (B<= Len) and (lStr[B] in ['0'..'9']) do begin S := S + lStr[B]; inc(B); end; if length(S) < 1 then exit; result := strtoint(S); end;*) (*function Str2IntDig (lStr: string; lDig: integer): integer; //robust stringtoint that strips out any junk so that "Implementation Version Name=MR.VB15A123" returns 15 // warning, strips out decimals, so 15.3 will return 153! //warning also ignores minus sign so -5.21 will return 521! var Len,P: integer; S: string; begin result := 0; Len := length(lStr); if Len <1 then exit; S := ''; for P := 1 to Len do if (lStr[P] in ['0'..'9']) and (length(S) < lDig) then S := S + lStr[P]; if length(S) < 1 then exit; result := strtoint(S); end; *) procedure read_dicom_data_compat(lReadJPEGtables,lVerboseRead,lAutoDECAT7,lReadECAToffsetTables,lAutoDetectInterfile,lAutoDetectGenesis,lReadColorTables: boolean; var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string; var lPrefs: TPrefs); label 666,777; const kMaxTextBuf = 50000; //maximum for screen output kDiskCache = 16384; //size of disk buffer type dicom_types = (unknown, i8, i16, i32, ui8, ui16, ui32, _string{,_float} ); var // lTextF: TextFile; //abba lDICOMdataBackUp: DICOMdata; lWord,lWord2,lWord3: word; lWordRA: Wordp; lDiskCacheRA: pChar{ByteP}; lRot1,lRot2,lRot3 : integer;//rotation dummies for AFNI FP: file; lT0,lT1,lT2,lT3:byte; lImagePositionPatientRead, lResearchMode,lManufacturerIsPhilips,lManufacturerIsBruker,lMediface0002_0013,lSiemensMosaic0008_0008,lDICM_at_128, lTextOverFlow,lGenesis,lFirstPass,lrOK,lBig,lBigSet,lGrp,explicitVR,first_one : Boolean; lSwitchToImplicitAfterGroup0002, lTestError,lByteSwap,lGELX,time_to_quit,lProprietaryImageThumbnail,lFirstFragment,lOldSiemens_IncorrectMosaicMM : Boolean; group, element, e_len, remaining, tmp : uint32; tmpstr : kDICOMstr; lgrpstr,lStr,info,lDummyStr : string; t : dicom_types; lfloat1,lfloat2,lfloat3,lThickness: double; lTempInt,lEchoNum,lnVol,lnSlicePerVol,lJPEGentries,lErr,liPos,lCacheStart,lCachePos,lDiskCacheSz,n, i,value, Ht,Width, max16,min16,filesz,where,lMatrixSz,lPhaseEncodingSteps,lJunk,lJunk2,lJunk3 : LongInt; tx : array [0..96] of Char; l4DDistanceBetweenSliceCenters,lPhilipsScaleSlope: single; buff: pCHar; lColorRA: bytep; lLongRA: Longintp; lSingleRA,lInterceptRA: Singlep; //lPapyrusnSlices,lPapyrusSlice : integer; //lPapyrusZero,lPapyrus : boolean; procedure ByteSwap (var lInOut: integer); var lWord: word; begin lWord := lInOut; lWord := swap(lWord); lInOut := lWord; end; procedure dReadCache (lFileStart: integer); begin lCacheStart := lFileStart{lCacheStart + lDiskCacheSz};//eliminate old start if lCacheStart < 0 then lCacheStart := 0; if lDiskCacheSz > 0 then freemem(lDiskCacheRA); if (FileSz-(lCacheStart)) < kDiskCache then lDiskCacheSz := FileSz - (lCacheStart) else lDiskCacheSz := kDiskCache; lCachePos := 0; if (lDiskCacheSz < 1) then exit{goto 666}; if (lDiskCacheSz+lCacheStart) > FileSz then exit; Seek(fp, lCacheStart); GetMem(lDiskCacheRA, lDiskCacheSz {bytes}); BlockRead(fp, lDiskCacheRA^, lDiskCacheSz, n); end; function dFilePos (var lInFP: file): integer; begin Result := lCacheStart + lCachePos; end; procedure dSeek (var lInFP: file; lPos: integer); begin if (lPos >= lCacheStart) and (lPos < (lDiskCacheSz+lCacheStart)) then begin lCachePos := lPos-lCacheStart; exit; end; dReadCache(lPos); end; procedure dBlockRead (var lInfp: file; lInbuff: pChar; e_len: integer; var n: integer); var lN: integer; begin N := 0; if e_len < 0 then exit; for lN := 0 to (e_len-1) do begin if lCachePos >= lDiskCacheSz then begin dReadCache(lCacheStart+lDiskCacheSz); if lDiskCacheSz < 1 then exit; lCachePos := 0; end; N := lN; lInBuff[N] := lDiskCacheRA[lCachePos]; inc(lCachePos); end; end; procedure readfloats (var fp: file; remaining: integer; var lOutStr: string; var lf1, lf2: double; var lReadOK: boolean); var lDigit : boolean; li,lLen,n: integer; lfStr: string; begin lf1 := 1; lf2 := 2; if e_len = 0 then begin lReadOK := true; exit; end; if (dFilePos(fp) > (filesz-remaining)) or (remaining < 1) then begin lOutStr := ''; lReadOK := false; exit; end else lReadOK := true; lOutStr := ''; GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); for li := 0 to e_len-1 do if Char(buff[li]) in [{'/','\', delete: rev18}'e','E','+','-','.','0'..'9'] then lOutStr := lOutStr +(Char(buff[li])) else begin lOutStr := lOutStr + ' '; end; FreeMem( buff); lfStr := ''; lLen := length(lOutStr); li := 1; lDigit := false; repeat if (lOutStr[li] in ['+','-','e','E','.','0'..'9']) then lfStr := lfStr + lOutStr[li]; if lOutStr[li] in ['0'..'9'] then lDigit := true; inc(li); until (li > lLen) or (lDigit); if not lDigit then exit; if li <= li then begin repeat if not (lOutStr[li] in ['+','-','e','E','.','0'..'9']) then lDigit := false else begin if lOutStr[li] = 'E' then lfStr := lfStr+'e' else lfStr := lfStr + lOutStr[li]; end; inc(li); until (li > lLen) or (not lDigit); end; //QStr(lfStr); try lf1 := strtofloat(lfStr); except on EConvertError do begin Msg('Unable to convert the string '+lfStr+' to a real number'); lf1 := 1; exit; end; end; {except} lfStr := ''; if li > llen then exit; repeat if (lOutStr[li] in ['+','E','e','.','-','0'..'9']) then begin if lOutStr[li] = 'E' then lfStr := lfStr+'e' else lfStr := lfStr + lOutStr[li]; end; if (lOutStr[li] in ['0'..'9']) then lDigit := true; inc(li); until (li > lLen) or ((lDigit) and (lOutStr[li]=' ')); //second half: rev18 if not lDigit then exit; //QStr(lfStr); try lf2 := strtofloat(lfStr); except on EConvertError do begin Msg('Unable to convert the string '+lfStr+' to a real number'); exit; end; end; end; procedure readfloats3 (var fp: file; remaining: integer; var lOutStr: string; var lf1, lf2,lf3: double; var lReadOK: boolean); var lDigit : boolean; lItem,li,lLen,n: integer; lfTemp: double; lfStr: string; begin lf1 := 0; lf2 := 0; lf3 := 0; lOutStr := ''; if e_len = 0 then begin lReadOK := true; exit; end; if (dFilePos(fp) > (filesz-remaining)) or (remaining < 1) then begin lReadOK := false; exit; end else lReadOK := true; GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); for li := 0 to e_len-1 do if Char(buff[li]) in [{'/','\', delete: rev18}'e','E','+','-','.','0'..'9'] then lOutStr := lOutStr +(Char(buff[li])) else lOutStr := lOutStr + ' '; FreeMem( buff); li := 1; lLen := length(lOutStr); for lItem := 1 to 3 do begin if li > llen then exit; lfStr := ''; lLen := length(lOutStr); lDigit := false; repeat if (lOutStr[li] in ['+','-','e','E','.','0'..'9']) then lfStr := lfStr + lOutStr[li]; if lOutStr[li] in ['0'..'9'] then lDigit := true; inc(li); until (li > lLen) or (lDigit); if not lDigit then exit; if li <= li then begin repeat if not (lOutStr[li] in ['+','-','e','E','.','0'..'9']) then lDigit := false else begin if lOutStr[li] = 'E' then lfStr := lfStr+'e' else lfStr := lfStr + lOutStr[li]; end; inc(li); until (li > lLen) or (not lDigit); end; //QStr(lfStr); try lftemp := strtofloat(lfStr); except on EConvertError do begin Msg('Unable to convert the string '+lfStr+' to a real number'); //lftemp := 0; exit; end; end; {except} case lItem of 2: lf2 := lftemp; 3: lf3 := lftemp; else lf1 := lftemp; end; //case of lItem end; //for each of 3 lItems end; //readfloats3 procedure CheckIntersliceDistance (var lMinDistance: single); var lX,lY,lZ,lDx: double; begin readfloats3 (fp, remaining, lDummyStr, lX, lY,lZ, lROK); e_len := 0; remaining := 0; //compute Distance between current slice and 1st slice... lDx := sqrt( sqr(lX-lDicomData.PatientPosX)+sqr(lY-lDicomData.PatientPosY)+sqr(lZ-lDicomData.PatientPosZ)); if (lDx > 0) and (lDx < lMinDistance) then //if 0 then this is a repeat, not a new slice lMinDistance := lDx; end; procedure readfloats6 (var fp: file; remaining: integer; var lOutStr: string; var lf1, lf2,lf3,lf4,lf5,lf6: double; var lReadOK: boolean); var lDigit : boolean; lItem,li,lLen,n: integer; lfTemp: single; lfStr: string; begin lf1 := 0; lf2 := 0; lf3 := 0; lf4 := 0; lf5 := 0; lf6 := 0; lOutStr := ''; if e_len = 0 then begin lReadOK := true; exit; end; if (dFilePos(fp) > (filesz-remaining)) or (remaining < 1) then begin lReadOK := false; exit; end else lReadOK := true; GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); for li := 0 to e_len-1 do if Char(buff[li]) in [{'/','\', delete: rev18}'e','E','+','-','.','0'..'9'] then lOutStr := lOutStr +(Char(buff[li])) else lOutStr := lOutStr + ' '; FreeMem( buff); li := 1; lLen := length(lOutStr); for lItem := 1 to 6 do begin if li > llen then exit; lfStr := ''; lLen := length(lOutStr); lDigit := false; repeat if (lOutStr[li] in ['+','-','e','E','.','0'..'9']) then lfStr := lfStr + lOutStr[li]; if lOutStr[li] in ['0'..'9'] then lDigit := true; inc(li); until (li > lLen) or (lDigit); if not lDigit then exit; if li <= li then begin repeat if not (lOutStr[li] in ['+','-','e','E','.','0'..'9']) then lDigit := false else begin if lOutStr[li] = 'E' then lfStr := lfStr+'e' else lfStr := lfStr + lOutStr[li]; end; inc(li); until (li > lLen) or (not lDigit); end; //QStr(lfStr); try lftemp := strtofloat(lfStr); except on EConvertError do begin Msg('Unable to convert the string '+lfStr+' to a real number'); //lftemp := 0; exit; end; end; {except} case lItem of 2: lf2 := lftemp; 3: lf3 := lftemp; 4: lf4 := lftemp; 5: lf5 := lftemp; 6: lf6 := lftemp; else lf1 := lftemp; end; //case of lItem end; //for each of 3 lItems end; function read16( var fp : File; var lReadOK: boolean ): uint16; var t1, t2 : uint8; n : Integer; begin if dFilePos(fp) > (filesz-2) then begin read16 := 0; lReadOK := false; exit; end else lReadOK := true; GetMem( buff, 2); dBlockRead(fp, buff{^}, 2, n); T1 := ord(buff[0]); T2 := ord(buff[1]); freemem(buff); if lDICOMdata.little_endian <> 0 then Result := (t1 + t2*256) AND $FFFF else Result := (t1*256 + t2) AND $FFFF; end; function ReadStr(var fp: file; remaining: integer; var lReadOK: boolean; VAR lmaxval:integer) : string; var lInc, lN,Val,n: integer; t1, t2 : uint8; lStr : String; begin lMaxVal := 0; if dFilePos(fp) > (filesz-remaining) then begin lReadOK := false; exit; end else lReadOK := true; Result := ''; lN := remaining div 2; if lN < 1 then exit; lStr := ''; for lInc := 1 to lN do begin GetMem( buff, 2); dBlockRead(fp, buff{^}, 2, n); T1 := ord(buff[0]); T2 := ord(buff[1]); freemem(buff); if lDICOMdata.little_endian <> 0 then Val := (t1 + t2*256) AND $FFFF else Val := (t1*256 + t2) AND $FFFF; if lInc < lN then lStr := lStr + inttostr(Val)+ ', ' else lStr := lStr + inttostr(Val); if Val > lMaxVal then lMaxVal := Val; end; Result := lStr; if odd(remaining) then begin getmem(buff,1); dBlockRead(fp, buff{t1}, SizeOf(uint8), n); freemem(buff); end; end; (*function ReadStrABC(var fp: file; remaining: integer; var lReadOK: boolean; VAR lA,lB,lC:integer) : string; var lInc, lN,Val,n: integer; t1, t2 : uint8; lStr : String; begin lA := 0; lB := 0; lC := 0; if dFilePos(fp) > (filesz-remaining) then begin lReadOK := false; exit; end else lReadOK := true; Result := ''; lN := remaining div 2; if lN < 1 then exit; lStr := ''; for lInc := 1 to lN do begin GetMem( buff, 2); dBlockRead(fp, buff{^}, 2, n); T1 := ord(buff[0]); T2 := ord(buff[1]); freemem(buff); if lDICOMdata.little_endian <> 0 then Val := (t1 + t2*256) AND $FFFF else Val := (t1*256 + t2) AND $FFFF; if lInc < lN then lStr := lStr + inttostr(Val)+ ', ' else lStr := lStr + inttostr(Val); if lInc = 1 then lA := Val; if lInc = 2 then lB := Val; if lInc = 3 then lC := Val; end; Result := lStr; if odd(remaining) then begin getmem(buff,1); dBlockRead(fp, buff{t1}, SizeOf(uint8), n); freemem(buff); end; end; *) function ReadStrHex(var fp: file; remaining: integer; var lReadOK: boolean) : string; var lInc, lN,Val,n: integer; t1, t2 : uint8; lStr : String; begin if dFilePos(fp) > (filesz-remaining) then begin lReadOK := false; exit; end else lReadOK := true; Result := ''; lN := remaining div 2; if lN < 1 then exit; lStr := ''; for lInc := 1 to lN do begin GetMem( buff, 2); dBlockRead(fp, buff, 2, n); T1 := ord(buff[0]); T2 := ord(buff[1]); freemem(buff); if lDICOMdata.little_endian <> 0 then Val := (t1 + t2*256) AND $FFFF else Val := (t1*256 + t2) AND $FFFF; if lInc < lN then lStr := lStr + 'x'+inttohex(Val,4)+ ', ' else lStr := lStr + 'x'+inttohex(Val,4); end; Result := lStr; if odd(remaining) then begin getmem(buff,1); dBlockRead(fp, {t1}buff, SizeOf(uint8), n); freemem(buff); end; end; function SomaTomFloat: double; var lSomaStr: String; begin //dSeek(fp,5992); //Slice Thickness from 5790 "SL 3.0" //dSeek(fp,5841); //Field of View from 5838 "FoV 281" //dSeek(fp,lPos); lSomaStr := ''; tx[0] := 'x'; while (length(lSomaStr) < 64) and (tx[0] <> chr(0)) and (tx[0] <> '/') do begin dBlockRead(fp, tx, 1, n); if tx[0] in ['+','-','.','0'..'9','e','E'] then lSomaStr := lSomaStr + tx[0]; end; if length(lSOmaStr) > 0 then result := StrToFloat(lSomaStr) else result := 0; end; function PGMreadInt: integer; //reads integer from PGM header, disregards comment lines (which start with '#' symbol); var lStr: string; lDigit: boolean; begin Result := 1; lStr := ''; repeat dBlockRead(fp, tx, 1, n); if tx[0] = '#' then begin //comment repeat dBlockRead(fp, tx, 1, n); until (ord(tx[0]) = $0A) or (dFilePos(fp) > (filesz-4)); //eoln indicates end of comment end; //finished reading comment if tx[0] in ['0'..'9'] then begin lStr := lStr + tx[0]; lDigit := true; end else lDigit := false; until ((lStr <> '') and (not lDigit)) or (dFilePos(fp) > (filesz-4)); //read digits until you hit whitespace if lStr <> '' then Result := strtoint(lStr); {lStr := ''; tx[0] := 'x'; while (length(lStr) < 64) and (ord(tx[0]) <> $0A) do begin dBlockRead(fp, tx, 1, n); if tx[0] in ['#','+','-','.','0'..'9','e','E',' ','a'..'z','A'..'Z'] then lStr := lStr + tx[0]; end; result := lStr; } end; function read32 ( var fp : File; var lReadOK: boolean ): uint32; var t1, t2, t3, t4 : byte; n : Integer; begin if dFilePos(fp) > (filesz-4) then begin Read32 := 0; lReadOK := false; exit; end else lReadOK := true; GetMem( buff, 4); dBlockRead(fp, buff{^}, 4, n); T1 := ord(buff[0]); T2 := ord(buff[1]); T3 := ord(buff[2]); T4 := ord(buff[3]); freemem(buff); if lDICOMdata.little_endian <> 0 then Result := t1 + (t2 shl 8) + (t3 shl 16) + (t4 shl 24) else Result := t4 + (t3 shl 8) + (t2 shl 16) + (t1 shl 24) //if lDICOMdata.little_endian <> 0 //then Result := (t1 + t2*256 + t3*256*256 + t4*256*256*256) AND $FFFFFFFF //else Result := (t1*256*256*256 + t2*256*256 + t3*256 + t4) AND $FFFFFFFF; end; function read32r ( var fp : File; var lReadOK: boolean ): single; //1382 type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(float:single); end; swaptypep = ^swaptype; var s:single; inguy:swaptypep; outguy:swaptype; begin if dFilePos(fp) > (filesz-4) then begin read32r := 0; lReadOK := false; exit; end else lReadOK := true; //GetMem( buff, 8); dBlockRead(fp, @s, 4, n); inguy := @s; //assign address of s to inguy if lDICOMdata.little_endian <> 1 then begin outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); end else outguy.float := s; //1382 read64 needs to handle little endian in this way as well... read32r:=outguy.float; end; function read64 ( var fp : File; var lReadOK: boolean ): double; type swaptype = packed record case byte of 0:(Word1,Word2,Word3,Word4 : word); //word is 16 bit 1:(float:double); end; swaptypep = ^swaptype; var s:double; inguy:swaptypep; outguy:swaptype; begin if dFilePos(fp) > (filesz-8) then begin Read64 := 0; lReadOK := false; exit; end else lReadOK := true; //GetMem( buff, 8); dBlockRead(fp, @s, 8, n); inguy := @s; //assign address of s to inguy if lDICOMdata.little_endian <> 1 then begin outguy.Word1 := swap(inguy^.Word4); outguy.Word2 := swap(inguy^.Word3); outguy.Word3 := swap(inguy^.Word2); outguy.Word4 := swap(inguy^.Word1); end else outguy.float := inguy^.float; //1382 read64:=outguy.float; end; //magma function SafeStrToInt(var lInput: string): integer; var li,lLen: integer; begin result := 0; lLen := length(lInput); lStr := ''; if lLen < 1 then exit; for li := 1 to lLen do if lInput[li] in ['+','-','0'..'9'] then lStr := lStr +lInput[li]; Val(lStr,li,lErr); if lErr = 0 then result := lI;//strtoint(lStr); end; procedure DICOMHeaderStringToInt (var lInput: integer); var li: integer; begin t := _string; lStr := ''; if dFilePos(fp) > (filesz-e_len) then exit;//goto 666; GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); for li := 0 to e_len-1 do if Char(buff[li]) in ['+','-','0'..'9'] then lStr := lStr +(Char(buff[li])); FreeMem( buff); Val(lStr,li,lErr); if lErr = 0 then lInput := li;//strtoint(lStr); remaining := 0; tmp := lInput; end; procedure DICOMHeaderString (var lInput: kDICOMStr); var li,lStartPos: integer; begin t := _string; lStartPos := dFilePos(fp); lInput := ''; if e_len < 1 then exit; //DICOM: should always be even GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); for li := 0 to e_len-1 do if Char(buff[li]) in ['+','-','/','\',' ','0'..'9','a'..'z','A'..'Z'] then lInput := lInput +(Char(buff[li])) else {if (buff[i] = 0) then} lInput := lInput +' '; FreeMem( buff); dseek(fp, lStartPos); end; procedure DICOMHeaderStringTime (var lInput: kDICOMstr); var li,lStartPos: integer; begin t := _string; lStartPos := dFilePos(fp); lInput := ''; if e_len < 1 then exit; //DICOM: should always be even GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); for li := 0 to e_len-1 do if Char(buff[li]) in ['+','-','/','\',' ','0'..'9','a'..'z','A'..'Z','.'] then lInput := lInput +(Char(buff[li])) else if li <> (e_len-1) then lInput := lInput +':' else lInput := lInput +' '; FreeMem( buff); dseek(fp, lStartPos); end; begin //Init //for lnVol := 1 to kMaxOrderVal do // lDICOMdata.OrderSlope[lDICOMdata.nOrder] := 0; //show this was not set lSwitchToImplicitAfterGroup0002 := false; lGELX := false; lByteSwap := false; Clear_Dicom_Data(lDicomData); Clear_Dicom_Data(lDICOMdataBackUp); lDicomData.XYZdim[1] := 1; lImagePositionPatientRead := false;// for 4D files, we need first volume l4DDistanceBetweenSliceCenters := maxint; lEchoNum := 0; lThickness := 0; lTestError := false; lPhilipsScaleSlope := 0; lManufacturerIsPhilips := false; lManufacturerIsBruker := false; lnVol := 0; lnSlicePerVol := 0; lResearchMode := false; lMatrixSz := 0; lPhaseEncodingSteps := 0; lSiemensMosaic0008_0008 := false; lMediface0002_0013 := false;//false wblate lOldSiemens_IncorrectMosaicMM := false; lCacheStart := 0; lDiskCacheSz := 0; lDynStr:= ''; lJPEGEntries := 0; first_one := true; info := ''; lGrp:= false; lBigSet := false; lDICM_at_128 := false; //no DICOM signature lFirstFragment := true; lTextOverFlow := false; lImageFormatOK := true; lHdrOK := false; //if lverboseRead then msg('xxx'+lFileName); if not fileexists(lFileName) then begin lImageFormatOK := false; exit; end; //if lverboseRead then msg('zzzzz000000000'); TmpStr := string(StrUpper(PChar(ExtractFileExt(lFileName)))); lStr :=''; if TmpStr = '.FDF' then begin if FDF( lFileName, lDicomData) then begin lHdrOK := true; lImageFormatOK := true; exit; end; end; if (TmpStr = '.REC') then begin //1417z: check in Unix: character upper/lower case may matter lStr := changefileext(lFilename,'.par'); if fileexists(lStr) then lFilename := lStr else begin //Linux is case sensitive 1382... lStr := changefileext(lFilename,'.PAR'); if fileexists(lStr) then lFilename := lStr end; end; if (TmpStr = '.BRIK') then begin //1417z: check in Unix: character upper/lower case may matter lStr := changefileext(lFilename,'.HEAD'); if fileexists(lStr) then lFilename := lStr; end; FileMode := 0; //set to readonly AssignFile(fp, lFileName); Reset(fp, 1); FIleSz := FileSize(fp); if fileSz < 1 then begin lImageFormatOK := false; exit; end; lDICOMdata.Little_Endian := 1; if FileSz > 200 then begin dseek(fp, {0}128); dBlockRead(fp, tx, 4*SizeOf(Char), n); if (tx[0] = 'D') and (tx[1] = 'I') and (tx[2] = 'C') and (tx[3] = 'M') then lDICM_at_128 := true; end;//filesize > 200: check for 'DICM' at byte 128 - DICOM signature if (lAutoDetectGenesis) and (FileSz > (5820{114+35+4})) then begin dseek(fp, 0); if (ord(tx[0])=206) and (ord(tx[1])=250) then begin //Elscint format signature: check height and width to make sure dseek(fp, 370); group := read16(fp,lrOK);//Width dseek(fp, 372); element := read16(fp,lrOK);//Ht if ((Group=160) or(Group =256) or (Group= 340) or (Group=512) or (group =640)) and ((element=160) or (element =256) or (element= 340) or (element=512) ) then begin CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write read_elscint_data(lDICOMdata, lHdrOK, lImageFormatOK,lDynStr,lFileName); exit; end; //confirmed: Elscint end; lGenesis := false; if ((tx[0] <> 'I') OR (tx[1] <> 'M') OR (tx[2] <> 'G') OR (tx[3] <> 'F')) then begin {DAT format} {if (FileSz > 114+305+4) then begin dseek(fp, 114+305); dBlockRead(fp, tx, 3*SizeOf(Char), n); if ((tx[0]='M') and (tx[1] = 'R')) or ((tx[0] = 'C') and(tx[1] = 'T')) then lGenesis := true; end;} end else lGenesis := true; if (not lGenesis) and (FileSz > 3252) then begin dseek(fp, 3240); dBlockRead(fp, tx, 4*SizeOf(Char), n); if ((tx[0] = 'I') AND (tx[1] = 'M')AND (tx[2] = 'G') AND (tx[3] = 'F')) then lGenesis := true; if (not lGenesis) then begin dseek(fp, 3178); dBlockRead(fp, tx, 4*SizeOf(Char), n); if ((tx[0] = 'I') AND (tx[1] = 'M')AND (tx[2] = 'G') AND (tx[3] = 'F')) then lGenesis := true; end; if (not lGenesis) then begin dseek(fp, 3180); dBlockRead(fp, tx, 4*SizeOf(Char), n); if ((tx[0] = 'I') AND (tx[1] = 'M')AND (tx[2] = 'G') AND (tx[3] = 'F')) then lGenesis := true; end; if (not lGenesis) then begin //1499K dseek(fp, 0); dBlockRead(fp, tx, 4*SizeOf(Char), n); if ((tx[0] = 'I') AND (tx[1] = 'M')AND (tx[2] = 'G') AND (tx[3] = 'F')) then lGenesis := true; end; end; if (not lGenesis) and (FileSz > 3252) then begin dseek(fp, 3228); dBlockRead(fp, tx, 4*SizeOf(Char), n); if (tx[0] = 'I') AND (tx[1]= 'M') AND (tx[2] = 'G')AND (tx[3]= 'F') then lGenesis := true; end; if lGenesis then begin CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write read_ge_data(lDICOMdata, lHdrOK, lImageFormatOK,lDynStr,lFileName); exit; end; end; //AutodetectGenesis xxDCIM if (lAutoDetectInterfile) and (FileSz > 256) and (not lDICM_at_128) then begin if Copy(extractfilename(lFileName), 1, 4) = 'COR-' then begin lStr := extractfiledir(lFilename) + '\COR-.info'; TmpStr := extractfiledir(lFilename) + '\COR-128'; if fileexists(lStr) and fileexists(TmpStr) then begin lFilename := TmpStr; lDynStr := 'FreeSurfer COR format' + kCR+'Only displaying image 128'+kCR+'Use MRIcro''s Import menu to convert this image'+kCR; with lDicomData do begin little_endian := 0; // don't care ImageStart := 0; Allocbits_per_pixel := 8; XYZdim[1] := 256; XYZdim[2] := 256; XYZdim[3] := 1; XYZmm[1] := 1; XYZmm[2] := 1; XYZmm[3] := 1; //xStoredbits_per_pixel:= Allocbits_per_pixel; END; //WITH lHdrOK := True; lImageFormatOK := True; exit; end; //COR-.info file exists end; //if filename is COR- //start TIF //TIF IMAGES DO NOT ALWAYS HAVE EXTENSION if (TmpStr = '.TIF') or (TmpStr = '.TIFF') then begin dseek(fp, 0); lWord := read16(fp,lrOK); if lWord = $4d4d then lDICOMdata.little_endian := 0 else if lWord = $4949 then lDICOMdata.little_endian := 1; //dseek(fp, 2); lWord2 := read16(fp,lrOK); //bits per pixel if ((lWord=$4d4d) or (lWord=$4949)) and (lWord2 = $002a) then begin CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write read_tiff_data(lDICOMdata, lReadECAToffsetTables, lHdrOK, lImageFormatOK, lDynStr, lFileName); //if lHdrOk then exit; exit; end;//TIF signature //end; //.TIF extension //end TIF //start BMP 1667 TmpStr := string(StrUpper(PChar(ExtractFileExt(lFileName)))); if TmpStr = '.BMP' then begin dseek(fp, 0); lWord := read16(fp,lrOK); dseek(fp, 28); lWord2 := read16(fp,lrOK); //bits per pixel if (lWord=19778) and (lWord2 = 8) then begin //bitmap signature dseek(fp, 10); lDicomData.ImageStart := read32(fp,lrOK);//1078; dseek(fp, 18); lDicomData.XYZdim[1] := read32(fp,lrOK); //dseek(fp, 22); lDicomData.XYZdim[2] := read32(fp,lrOK); lDicomData.XYZdim[3] := 1;//read16(fp,lrOK); lDicomData.Allocbits_per_pixel := 8;//bits //xlDicomData.Storedbits_per_pixel:= lDicomData.Allocbits_per_pixel; lDynStr := 'BMP format'; CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write lHdrOK := true; lImageFormatOK:= true; exit; end;//bmp signature end; //.BMP extension //end BMP if TmpStr = '.VOL' then begin //start SPACE vol format 1382 dseek(fp, 0); dBlockRead(fp, tx, 6*SizeOf(Char), n); if (tx[0] = 'm') and (tx[1] = 'd') and (tx[2] = 'v') and (tx[3] = 'o') and (tx[4] = 'l') and (tx[5] = '1') then begin lDicomData.ImageStart := read32(fp,lrOK);//1078; lDICOMdata.little_endian := 1; lDicomData.XYZdim[1] := read32(fp,lrOK); lDicomData.XYZdim[2] := read32(fp,lrOK); lDicomData.XYZdim[3] := read32(fp,lrOK); lDicomData.XYZmm[1] := read32r(fp,lrOK); lDicomData.XYZmm[2] := read32r(fp,lrOK); lDicomData.XYZmm[3] := read32r(fp,lrOK); lDicomData.Allocbits_per_pixel := 8;//bits //xlDicomData.Storedbits_per_pixel:= lDicomData.Allocbits_per_pixel; lDynStr := 'Space VOL format'; CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write lHdrOK := true; lImageFormatOK:= true; exit; end;//vol signature end; //.VOL extension //end space .VOL format //start DF3 PovRay DF3 density files if (TmpStr = '.DF3') then begin dseek(fp, 0); lWord := swap (read16(fp,lrOK)); lWord2 := swap (read16(fp,lrOK)); lWord3 := swap (read16(fp,lrOK)); //note: I assume all df3 headers are little endian. is this always true? if not, unswapped values could be tested for filesize lMatrixSz := (lWord*lWord2*lWord3)+6; if (lMatrixSz=FileSz)then begin //df3 signature lDicomData.ImageStart := 6;//1078; lDicomData.XYZdim[1] := lWord; //dseek(fp, 22); lDicomData.XYZdim[2] := lWord2; lDicomData.XYZdim[3] := lWord3; lDicomData.Allocbits_per_pixel := 8;//bits //xlDicomData.Storedbits_per_pixel:= lDicomData.Allocbits_per_pixel; CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write lDynStr := 'PovRay DF3 density format'; lHdrOK := true; lImageFormatOK:= true; exit; end;//df3 signature end; //end df3 //start .PGM if (TmpStr = '.PGM') or (TmpStr = '.PPM') then begin dseek(fp, 0); lWord := read16(fp,lrOK); if (lWord=13648){'P5'=1x8BIT GRAYSCALE} or (lWord=13904) {'P6'=3x8bit RGB} then begin //bitmap signature {repeat PGMreadStr(lDicomData.XYZdim[1],lDicomData.XYZdim[2]); until (lDicomData.XYZdim[2] > 0) ;} lDicomData.XYZdim[1] := PGMreadInt; lDicomData.XYZdim[2] := PGMreadInt; PGMreadInt; //read maximum value lDicomData.XYZdim[3] := 1;//read16(fp,lrOK); lDicomData.Allocbits_per_pixel := 8;//bits //xlDicomData.Storedbits_per_pixel:= lDicomData.Allocbits_per_pixel; lDicomData.ImageStart := dFilepos(fp); if lWord = 13904 then begin//RGB //xlDicomData.SamplesPerPixel := 3; //xlDicomData.PlanarConfig := 0;//RGBRGBRGB..., not RRR..RGGG..GBBB...B end; lDynStr:='PGM/PPM format 8-bit grayscale image [data saved in binary, not ASCII format]'; CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write lHdrOK := true; lImageFormatOK:= true; exit; end else if (lWord=12880){'P2'=1x8BIT ASCII} or (lWord=13136) {'P3'=3x8bit ASCI} then begin Msg('Warning: this image appears to be an ASCII ppm/pgm image. This software can only read binary ppm/pgm images'); end;//pgm/ppm binary signature signature end; //.PPM/PGM extension //end .pgm //start BioRadPIC 1667 if TmpStr = '.PIC' then begin dseek(fp, 54); lWord := read16(fp,lrOK); if (lWord=12345) then begin CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write read_biorad_data(lDICOMdata, lHdrOK, lImageFormatOK,lDynStr,lFileName); exit; end;//biorad signature end; //.PIC extension biorad? //end BIORAD PIC if TmpStr = '.HEAD' then begin read_afni_data(lDICOMdata, lHdrOK, lImageFormatOK, lDynStr, lFileName,lRot1,lRot2,lRot3); if (lHdrOK) and (lImageFormatOK) then begin CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write exit; end; end; dseek(fp, 0); dBlockRead(fp, tx, 20*SizeOf(Char), n); if (tx[0] = 'n') and (tx[1] = 'c') and (tx[2] = 'a') and (tx[3] = 'a') then begin //SUN Vision File Format = .vff CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write read_vff_data(lDICOMdata, lHdrOK, lImageFormatOK, lDynStr, lFileName); exit; end; liPos := 1; lStr :=''; {999 While (liPos <= 20) and (lStr <> 'INTERFILE') do begin if tx[liPos] in ['i','n','t','e','r', 'f','i','l','e','I','N','T','E','R', 'F','I','L','E'] then lStr := lStr+upcase(tx[liPos]); inc(liPos); end; } if lStr = 'INTERFILE' then begin CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write read_interfile_data(lDICOMdata, lHdrOK, lImageFormatOK, lDynStr, lFileName); if lHdrOk then exit; exit; end; //'INTERFILE' in first 20 char end;//detectint // try DICOM part 10 i.e. a 128 byte file preamble followed by "DICM" if filesz <= 300 then goto 666; {begin siemens somatom: DO THIS BEFORE MAGNETOM: BOTH HAVE 'SIEMENS' SIGNATURE, SO CHECK FOR 'SOMATOM'} if filesz = 530432 then begin dseek(fp, 281); dBlockRead(fp, tx, 8*SizeOf(Char), n); if (tx[0] = 'S') and (tx[1] = 'O') and (tx[2] = 'M') and (tx[3] = 'A') and (tx[4] = 'T') and (tx[5] = 'O') and (tx[6] = 'M') then begin lDicomData.ImageStart := 6144; lDicomData.Allocbits_per_pixel := 16; //xlDicomData.Storedbits_per_pixel := 16; lDicomData.little_endian := 0; lDicomData.XYZdim[1] := 512; lDicomData.XYZdim[2] := 512; lDicomData.XYZdim[3] := 1; dSeek(fp,5999); //Study/Image from 5292 "STU/IMA 1070/16" lDicomData.AcquNum := trunc(SomaTomFloat);//Slice Thickness from 5790 "SL 3.0" lDicomData.ImageNum := trunc(SomaTomFloat);//Slice Thickness from 5790 "SL 3.0" dSeek(fp,5792); //Slice Thickness from 5790 "SL 3.0" lDicomData.XYZmm[3] := SomaTomFloat;//Slice Thickness from 5790 "SL 3.0" dSeek(fp,5841); //Field of View from 5838 "FoV 281" lDicomData.XYZmm[1] := SomaTomFloat; //Field of View from 5838 "FoV 281" lDicomData.XYZmm[2] := lDicomData.XYZmm[1]/lDicomData.XYZdim[2];//do mm[2] first before FOV is overwritten lDicomData.XYZmm[1] := lDicomData.XYZmm[1]/lDicomData.XYZdim[1]; if lVerboseRead then lDynStr := 'Siemens Somatom Format'+kCR+ 'Image Series/Number: '+inttostr(lDicomData.AcquNum)+'/'+inttostr(lDicomData.ImageNum)+kCR+ 'XYZ dim:' +inttostr(lDicomData.XYZdim[1])+'/' +inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) +kCR+'XYZ mm:'+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2); CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write lImageFormatOK := true; lHdrOK := true; exit; end; //signature found end; //correctsize for somatom {end siemens somatom} {siemens magnetom} dseek(fp,96); dBlockRead(fp, tx, 7*SizeOf(Char), n); if (tx[0] = 'S') and (tx[1] = 'I') and (tx[2] = 'E') and (tx[3] = 'M') and (tx[4] = 'E') and (tx[5] = 'N') and (tx[6] = 'S') then begin CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write read_siemens_data(lDICOMdata, lHdrOK, lImageFormatOK, lDynStr, lFileName); exit; end; {end siemens magnetom vision} {siemens somatom plus} dseek(fp, 0); dBlockRead(fp, tx, 8*SizeOf(Char), n); if (tx[0] = 'S') and (tx[1] = 'I') and (tx[2] = 'E') and (tx[3] = 'M') and (tx[4] = 'E') and (tx[5] = 'N') and (tx[6] = 'S') then begin lDicomData.ImageStart := 8192; lDicomData.Allocbits_per_pixel := 16; //xlDicomData.Storedbits_per_pixel := 16; lDicomData.little_endian := 0; dseek(fp, 1800); //slice thickness lDicomData.XYZmm[3] := read64(fp,lrOK); dseek(fp, 4100); lDicomData.AcquNum := read32(fp,lrOK); dseek(fp, 4108); lDicomData.ImageNum := read32(fp,lrOK); dseek(fp, 4992); //X FOV lDicomData.XYZmm[1] := read64(fp,lrOK); dseek(fp, 5000); //Y FOV lDicomData.XYZmm[2] := read64(fp,lrOK); dseek(fp, 5340); lDicomData.XYZdim[1] := read32(fp,lrOK); dseek(fp, 5344); lDicomData.XYZdim[2] := read32(fp,lrOK); lDicomData.XYZdim[3] := 1; if lDicomData.XYZdim[1] > 0 then lDicomData.XYZmm[1] := lDicomData.XYZmm[1]/lDicomData.XYZdim[1]; if lDicomData.XYZdim[2] > 0 then lDicomData.XYZmm[2] := lDicomData.XYZmm[2]/lDicomData.XYZdim[2]; if lVerboseRead then lDynStr := 'Siemens Somatom Plus Format'+kCR+ 'Image Series/Number: '+inttostr(lDicomData.AcquNum)+'/'+inttostr(lDicomData.ImageNum)+kCR+ 'XYZ dim:' +inttostr(lDicomData.XYZdim[1])+'/' +inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) +kCR+'XYZ mm:'+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2); CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write lImageFormatOK := true; lHdrOK := true; exit; end; {end siemens somatom plus } {picker} dseek(fp,0); dBlockRead(fp, tx, 8*SizeOf(Char), n); if (tx[0]='C') and (tx[1]='D') and (tx[2]='F') and (ord(tx[3]) = 1) then begin CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write read_minc_data(lDICOMdata, lHdrOK, lImageFormatOK,lDynStr,lFileName); exit; end; if (lAutoDECAT7) and (tx[0]='M') and (tx[1]='A') and (tx[2]='T') and (tx[3]='R') and (tx[4]='I') and (tx[5]='X') then begin CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write read_ecat_data(lDICOMdata, lVerboseRead,lReadECAToffsetTables,lHdrOK, lImageFormatOK, lDynStr, lFileName); exit; end; if (tx[0] = '*') AND (tx[1] = '*') AND (tx[2] = '*') AND (tx[3] = ' ') then begin {picker Standard} CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write read_picker_data(lVerboseRead,lDICOMdata, lHdrOK, lImageFormatOK, lDynStr, lFileName); exit; end; {not picker standard} //Start Picker Prism ljunk := filesz-2048; lDICOMdata.little_endian := 0; //start: read x dseek(fp, 322); Width := read16(fp,lrOK); //start: read y dseek(fp, 326); Ht := read16(fp,lrOK); lMatrixSz := Width * Ht; //check if correct filesize for picker prism if (ord(tx[0]) = 1) and (ord(tx[1])=2) and ((ljunk mod lMatrixSz)=0){128*128*2bytes = 32768} then begin //Picker PRISM lDicomData.little_endian := 0; lDicomData.XYZdim[1] := Width; lDicomData.XYZdim[2] := Ht; lDicomData.XYZdim[3] := (ljunk div 32768); {128*128*2bytes = 32768} lDicomData.Allocbits_per_pixel := 16; //xlDicomData.Storedbits_per_pixel := 16; lDicomData.ImageStart := 2048; //start: read slice thicness dseek(fp,462); dBlockRead(fp, tx, 12*SizeOf(Char), n); lStr := ''; for ljunk := 0 to 11 do if tx[ljunk] in ['0'..'9','.'] then lStr := lStr+ tx[ljunk]; if lStr <> '' then lDicomData.XYZmm[3] := strtofloat(lStr); //start: voxel size dseek(fp,594); dBlockRead(fp, tx, 12*SizeOf(Char), n); lStr := ''; for ljunk := 0 to 11 do if tx[ljunk] in ['0'..'9','.'] then lStr := lStr+ tx[ljunk]; if lStr <> '' then lDicomData.XYZmm[1] := strtofloat(lStr); lDicomData.XYZmm[2] := lDicomData.XYZmm[1]; //end: read voxel sizes //start: patient name dseek(fp,26); dBlockRead(fp, tx, 22*SizeOf(Char), n); lStr := ''; ljunk := 0; while (ljunk < 22) and (ord(tx[ljunk]) <> 0) do begin lStr := lStr+ tx[ljunk]; inc(ljunk); end; lDicomData.PatientName := lStr; //start: patient ID dseek(fp,48); dBlockRead(fp, tx, 15*SizeOf(Char), n); lstr := ''; ljunk := 0; while (ljunk < 15) and (ord(tx[ljunk]) <> 0) do begin lstr := lstr+ tx[ljunk]; inc(ljunk); end; //xlDicomData.PatientID := lStr; //start: scan time dseek(fp,186); dBlockRead(fp, tx, 25*SizeOf(Char), n); lstr := ''; ljunk := 0; while (ljunk < 25) and (ord(tx[ljunk]) <> 0) do begin lstr := lstr+ tx[ljunk]; inc(ljunk); end; //start: scanner type dseek(fp,2); dBlockRead(fp, tx, 25*SizeOf(Char), n); lgrpstr := ''; ljunk := 0; while (ljunk < 25) and (ord(tx[ljunk]) <> 0) do begin lgrpstr := lgrpstr+ tx[ljunk]; inc(ljunk); end; //report results if lVerboseRead then lDynStr := 'Picker Format '+lgrpstr+kCR+ 'Patient Name: '+lDicomData.PatientName+kCR+ //x'Patient ID: '+lDicomData.PatientID+kCR+ 'Scan Time: '+lStr+kCR+ 'XYZ dim:' +inttostr(lDicomData.XYZdim[1])+'/' +inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) +kCR+'XYZ mm:'+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2); CloseFile(fp); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); FileMode := 2; //set to read/write lImageFormatOK := true; lHdrOK := true; exit; end; //end Picker PRISM lMatrixSz := 0; lDICOMdata.little_endian := 1; lBig := false; dseek(fp, {0}128); //where := FilePos(fp); dBlockRead(fp, tx, 4*SizeOf(Char), n); if (tx[0] <> 'D') OR (tx[1] <> 'I') OR (tx[2] <> 'C') OR (tx[3] <> 'M') then begin //if filesz > 132 then begin dseek(fp, 0{128}); //skip the preamble - next 4 bytes should be 'DICM' //where := FilePos(fp); dBlockRead(fp, tx, 4*SizeOf(Char), n); //end; if (tx[0] <> 'D') OR (tx[1] <> 'I') OR (tx[2] <> 'C') OR (tx[3] <> 'M') then begin dseek(fp, 0); group := read16(fp,lrOK); if not lrOK then goto 666; if group > $0008 then begin group := swap(group); lBig := true; end; if NOT (group in [$0000, $0001, $0002,$0003, $0004, $0008]) then // one more group added begin goto 666; end; dseek(fp, 0); //Msg('DICM not at 0 or 128: ' +lFilename); end; end; //else Msg('DICM at 128{0}');; time_to_quit := FALSE; lProprietaryImageThumbnail := false; explicitVR := false; tmpstr := ''; tmp := 0; while NOT time_to_quit do begin t := unknown; where := dFilePos(fp); lFirstPass := true; 777: group := read16(fp,lrOK); if (lSwitchToImplicitAfterGroup0002) and (group > 0002) then begin lSwitchToImplicitAfterGroup0002 := false; explicitVR := false; end; if not lrOK then goto 666; if (lFirstPass) and (group = 2048) then begin if lDicomData.little_endian = 1 then lDicomData.Little_endian := 0 else lDicomData.little_endian := 1; dseek(fp,where); lFirstPass := false; goto 777; end; element := read16(fp,lrOK); if not lrOK then goto 666; e_len:= read32(fp,lrOK); if not lrOK then goto 666; lGrpStr := ''; lt0 := e_len and 255; lt1 := (e_len shr 8) and 255; lt2 := (e_len shr 16) and 255; lt3 := (e_len shr 24) and 255; if (explicitVR) and (lT0=13) and (lT1=0) and (lT2=0) and (lT3=0) then e_len := 10; //hack for some GE Dicom images if explicitVR or first_one then begin if group = $FFFE then else //1384 - ACUSON images switch off ExplicitVR for file image fragments if ((lT0=kO) and (lT1=kB)) or ((lT0=kU) and (lT1=kN)){<-UN added 11/11/2011} or ((lT0=kO) and (lT1=kW)) or ((lT0=kS) and (lT1=kQ)) {11/11 add UT}or ((lT0=kU) and (lT1=kT)) then begin lGrpStr := chr(lT0)+chr(lT1); e_len:= read32(fp,lrOK); if not lrOK then goto 666; if first_one then explicitVR := true; end else if ((lT3=kO) and (lT2=kB)) or ((lT3=kU) and (lT2=kN)){<-UN added 11/11/2011} or((lT3=kO) and (lT2=kW)) or ((lT3=kS) and (lT2=kQ)) or ((lT3=kU) and (lT2=kT))then begin e_len:= read32(fp,lrOK); if not lrOK then goto 666; if first_one then explicitVR := true; end else if ( ((lT0=kA) and (lT1=kE)) or ((lT0=kA) and (lT1=kS)) or ((lT0=kA) and (lT1=kT)) or ((lT0=kC) and (lT1=kS)) or ((lT0=kD) and (lT1=kA)) or ((lT0=kD) and (lT1=kS)) or ((lT0=kD) and (lT1=kT)) or ((lT0=kF) and (lT1=kL)) or ((lT0=kF) and (lT1=kD)) or ((lT0=kI) and (lT1=kS)) or ((lT0=kL) and (lT1=kO))or ((lT0=kL) and (lT1=kT)) or ((lT0=kP) and (lT1=kN)) or ((lT0=kS) and (lT1=kH)) or ((lT0=kS) and (lT1=kL)) or ((lT0=kS) and (lT1=kS)) or ((lT0=kS) and (lT1=kT)) or ((lT0=kT) and (lT1=kM)) or ((lT0=kU) and (lT1=kI)) or ((lT0=kU) and (lT1=kL)) or ((lT0=kU) and (lT1=kS)) or ((lT0=kA) and (lT1=kE)) or ((lT0=kA) and (lT1=kS)) ) then begin lGrpStr := chr(lT0) + chr(lT1); if lDicomData.little_endian = 1 then e_len := (e_len and $ffff0000) shr 16 else e_len := swap((e_len and $ffff0000) shr 16); if first_one then begin explicitVR := true; end; end else if ( ((lT3=kA) and (lT2=kT)) or ((lT3=kC) and (lT2=kS)) or ((lT3=kD) and (lT2=kA)) or ((lT3=kD) and (lT2=kS)) or ((lT3=kD) and (lT2=kT)) or ((lT3=kF) and (lT2=kL)) or ((lT3=kF) and (lT2=kD)) or ((lT3=kI) and (lT2=kS)) or ((lT3=kL) and (lT2=kO))or ((lT3=kL) and (lT2=kT)) or ((lT3=kP) and (lT2=kN)) or ((lT3=kS) and (lT2=kH)) or ((lT3=kS) and (lT2=kL)) or ((lT3=kS) and (lT2=kS)) or ((lT3=kS) and (lT2=kT)) or ((lT3=kT) and (lT2=kM)) or ((lT3=kU) and (lT2=kI)) or ((lT3=kU) and (lT2=kL)) or ((lT3=kU) and (lT2=kS))) then begin if lDicomData.little_endian = 1 then e_len := (256 * lT0) + lT1 else e_len := (lT0) + (256*lT1); if first_one then begin explicitVR := true; end; end; end; //not first_one or explicit if (first_one) and (lDicomdata.little_endian =0) and (e_len = $04000000) then begin Msg('Switching to little endian'); lDicomData.little_endian := 1; dseek(fp, where); first_one := false; goto 777; end else if (first_one) and (lDicomData.little_endian =1) and (e_len = $04000000) then begin Msg('Switching to little endian'); lDicomData.little_endian := 0; dseek(fp, where); first_one := false; goto 777; end; if e_len = ($FFFFFFFF) then begin e_len := 0; end; if lGELX then begin e_len := e_len and $FFFF; end; first_one := false; remaining := e_len; info := '?'; tmpstr := ''; case group of $0001 : // group for normal reading elscint DICOM case element of $0010 : info := 'Name'; $1001 : info := 'Elscint info'; end; $0002 : case element of $00 : info := 'File Meta Elements Group Len'; $01 : info := 'File Meta Info Version'; $02 : info := 'Media Storage SOP Class UID'; $03 : info := 'Media Storage SOP Inst UID'; $10 : begin //lTransferSyntaxReported := true; info := 'Transfer Syntax UID'; TmpStr := ''; if dFilePos(fp) > (filesz-e_len) then goto 666; GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); for i := 0 to e_len-1 do if Char(buff[i]) in ['+','-',' ', '0'..'9','a'..'z','A'..'Z'] then TmpStr := TmpStr +(Char(buff[i])) else TmpStr := TmpStr +('.'); FreeMem( buff); lStr := ''; if TmpStr = '1.2.840.113619.5.2' then begin lGELX := true; LBigSet := true; lBig := true; end; // if length(TmpStr) < 19 then begin //12/2010 assume 1.2.840.10008.1.2 //Raw data, Implicit VR, Little Endian // explicitVR := false; //china lSwitchToImplicitAfterGroup0002 := true; end; if length(TmpStr) >= 19 then begin if TmpStr[19] = '1' then begin lBigSet:= true; explicitVR := true; //duran lBig := false; end else if TmpStr[19] = '2' then begin lBigSet:= true; explicitVR := true; //duran lBig := true; end else if TmpStr[19] = '4' then begin if length(TmpStr) >= 21 then begin //lDicomData.JPEGCpt := true; if not lReadJPEGtables then begin lImageFormatOK := false; end else begin i := strtoint(TmpStr[21]+TmpStr[22]); //if (TmpStr[22] <> '0') or ((TmpStr[21] <> '7') or (TmpStr[21] <> '0')) if (i <> 57) and (i <> 70) then begin lImageFormatOK := false; //lDicomData.JPEGLossyCpt := true end else begin //lImageFormatOK := false;//x lDicomData.JPEGLosslessCpt := true; end; end; end else begin lImageFormatOK := false; end; end else if TmpStr[19] = '5' then begin lImageFormatOK := false;//xlDicomData.RunLengthEncoding := true; end else begin lImageFormatOK := false; end; if not lImageFormatOK then Msg('Unsupported Transfer Syntax '+(TmpStr)+' Solution: use MRIcro'); end; {length} remaining := 0; e_len := 0; {use tempstr} end; $12 : begin info := 'Implementation Class UID'; end; $13 : begin info := 'Implementation Version Name'; if e_len > 4 then begin TmpStr := ''; DICOMHeaderString(TmpStr); //lDicomData.ImplementationVersion := Str2Int(TmpStr); if TmpStr = 'MEDIFACE 1 5' then lMediface0002_0013 := true; //detect MEDIFACE 1.5 error: error in length of two elements 0008:1111 and 0008:1140 end; //length > 4 end; //element 13 $16 : info := 'Source App Entity Title'; $100: info := 'Private Info Creator UID'; $102: info := 'Private Info'; end; $0008 : case element of $00 : begin info := 'Identifying Group Length'; end; $01 : info := 'Length to End'; $05 : info := 'Specific Character Set'; $08 : begin info := 'Image Type'; //Only read last word, e.g. 'TYPE\MOSAIC' will be read as 'MOSAIC' TmpStr := ''; if dFilePos(fp) > (filesz-e_len) then goto 666; GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); i := e_len -1; while (i>-1) and (Char(buff[i]) in ['a'..'z','A'..'Z',' ']) do begin if (Char(buff[i])) <> ' ' then //strip filler characters: DICOM elements must be padded for even length TmpStr := upcase(Char(buff[i]))+TmpStr; dec(i); end; FreeMem( buff); remaining := 0; e_len := 0; {use tempstr} if TmpStr = 'MOSAIC' then begin lSiemensMosaic0008_0008:= true; //if lMatrixSz < 1 then lMatrixSz := 64;//B13 end; end; $10 : info := 'Recognition Code'; $12 : info := 'Instance Creation Date'; $13 : info := 'Instance Creation Time'; $14 : info := 'Instance Creator UID'; $16 : info := 'SOP Class UID'; $18 : info := 'SOP Instance UID'; $20 : begin info := 'Study Date'; //lDicomData.StudyDatePos := dFilePos(fp); DICOMHeaderString(lDicomData.StudyDate); end; $21 : info := 'Series Date'; $22 : info := 'Acquisition Date'; $23 : info := 'Image Date'; $30 : begin info := 'Study Time'; DICOMHeaderStringTime(lDicomData.StudyTime); end; $31 : info := 'Series Time'; $32 : begin info := 'Acquisition Time'; DICOMHeaderStringTime(TmpStr); lDicomData.SecSinceMidnight := SecSinceMidnightFloat(TmpStr); end; $33 : begin info := 'Image Time'; //xxDICOMHeaderStringTime(lDicomData.ImgTime); end; $40 : info := 'Data Set Type'; $41 : info := 'Data Set Subtype'; $50 : begin //xDICOMHeaderStringtoInt(lDicomData.accession); info := 'Accession Number'; end; $60 : begin info := 'Modality'; t := _string; end; $64 : begin info := 'Conversion Type'; t := _string; end; $70 : begin info := 'Manufacturer'; //Only read last word, e.g. 'TYPE\MOSAIC' will be read as 'MOSAIC' TmpStr := ''; if dFilePos(fp) > (filesz-e_len) then goto 666; GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); i := e_len -1; while (i>-1) and (Char(buff[i]) in ['a'..'z','A'..'Z',' ']) do begin if (Char(buff[i])) <> ' ' then //strip filler characters: DICOM elements must be padded for even length TmpStr := upcase(Char(buff[i]))+TmpStr; dec(i); end; FreeMem( buff); remaining := 0; e_len := 0; {use tempstr} if (length(TmpStr) > 3) and (TmpStr[1]='P') and (TmpStr[2]='H') and (TmpStr[3]='I') then lManufacturerIsPhilips := true; if (length(TmpStr) > 3) and (TmpStr[1]='B') and (TmpStr[2]='R') and (TmpStr[3]='U') then lManufacturerIsBruker := true; if lManufacturerIsPhilips then lDicomData.ManufacturerID := kPhilipsID; if (length(TmpStr) > 3) and (TmpStr[1]='G') and (TmpStr[2]='E') then lDicomData.ManufacturerID := kGEID; if (length(TmpStr) > 3) and (TmpStr[1]='S') and (TmpStr[2]='I') and (TmpStr[3]='E') then lDicomData.ManufacturerID := kSiemensID; end; $80 : info := 'Institution Name'; $81 : info := 'City Name'; $90 : info := 'Referring Physician''s Name'; $100: info := 'Code Value'; $102 : begin info := 'Coding Schema Designator'; t := _string; end; $104: info := 'Code Meaning'; $1010: info := 'Station Name'; $1030: begin info := 'Study Description'; t := _string; end; $103e: begin info := 'Series Description'; t := _string; end; $1040: info := 'Institutional Dept. Name'; $1050: info := 'Performing Physician''s Name'; $1060: info := 'Name Phys(s) Read Study'; $1070: begin info := 'Operator''s Name'; t := _string; end; $1080: info := 'Admitting Diagnosis Description'; $1090: begin info := 'Manufacturer''s Model Name';t := _string; end; $1111: begin if lMediface0002_0013 then E_LEN := 8;//+e_len; end; //ABBA: patches error in DICOM images seen from Sheffield 0002,0013=MEDIFACE.1.5; 0002,0016=PICKER.MR.SCU $1140: begin if (lMediface0002_0013) and (E_LEN > 255) then E_LEN := 8; end; //ABBA: patches error in DICOM images seen from Sheffield 0002,0013=MEDIFACE.1.5; 0002,0016=PICKER.MR.SCU $2111: info := 'Derivation Description'; $2120: info := 'Stage Name'; $2122: begin info := 'Stage Number';t := _string; end; $2124: begin info := 'Number of Stages';t := _string; end; $2128: begin info := 'View Number';t := _string; end; $212A: begin info := 'Number of Views in stage';t := _string; end; $2204: info := 'Transducer Orientation'; $9208: begin info := 'ComplexImageComponent'; TmpStr := ''; DICOMHeaderString(TmpStr); i := 0; if length(TmpStr) >= 2 then begin if (TmpStr[1] = 'M') and (TmpStr[2] = 'A') then i := 1; //magnitude if (TmpStr[1] = 'P') and (TmpStr[2] = 'H') then i := 2; //phase if (TmpStr[1] = 'R') and (TmpStr[2] = 'E') then i := 3; //real if (TmpStr[1] = 'I') and (TmpStr[2] = 'M') then i := 4; //imaginary end; //mixed will be followed by subsequent settings, so do not use it here.... if (i > 0) and (lDICOMdata.nOrder < kMaxOrderVal) then begin inc(lDICOMdata.nOrder); //msg(TmpStr); lDICOMdata.order[lDICOMdata.nOrder] := i; end; (*[ magnitude * MAGNITUDE [ phase * PHASE [ real * REAL [ imaginary * IMAGINARY [ mixed * MIXED*) ///xxx xxx end; end; $0009: if element = $0010 then begin if e_len > 4 then begin TmpStr := ''; if dFilePos(fp) > (filesz-e_len) then goto 666; GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); i := e_len -1; while (i>-1) {and (Char(buff[i]) in ['a'..'z','A'..'Z',' '])} do begin if (Char(buff[i])) in ['a'..'z','A'..'Z'] then //strip filler characters: DICOM elements must be padded for even length TmpStr := upcase(Char(buff[i]))+TmpStr; dec(i); end; FreeMem( buff); remaining := 0; if (Length(TmpStr)>4) and (TmpStr[1]='M') and (TmpStr[2]='E') and (TmpStr[3]='R') and (TmpStr[4]='G') then lOldSiemens_IncorrectMosaicMM := true; //detect MERGE technologies mosaics e_len := 0; {use tempstr} end; end; $0010 : case element of $00 : info := 'Patient Group Length'; $10 : begin info := 'Patient''s Name'; t := _string; //xlDicomData.NamePos := dFilePos(fp); DICOMHeaderString(lDicomData.PatientName); end; $20 : begin info := 'Patient ID'; //xDICOMHeaderString(lDicomData.PatientID); //xlDicomData.PatientIDInt := safestrtoint(lDicomData.PatientID); end; //11/2010 //$30: info := 'Date of Birth'; //"Age String" type: e.g 067y for 67 years old, 067d for 67 days $30 : begin info := 'DoB'; t := _string; //xlDicomData.NamePos := dFilePos(fp); //lDicomData.PatientDoB := '1111'; DICOMHeaderString(lDicomData.PatientDoB); end; $32 : info := 'Patient Birth Time'; //$40 : begin info := 'Patient Sex'; t := _string; end; $40 : begin info := 'Gender'; t := _string; //xlDicomData.NamePos := dFilePos(fp); DICOMHeaderString(lDicomData.PatientGender); end; $1000: info := 'Other Patient IDs'; $1001: info := 'Other Patient Names'; $1005: info := 'Patient''s Birth Name'; $1010: begin info := 'Patient Age'; t := _string; end; $1030: info := 'Patient Weight'; $21b0: info := 'Additional Patient History'; $4000: info := 'Patient Comments'; end; $0018 : case element of $00 : info := 'Acquisition Group Length'; $10 : begin info := 'Contrast/Bolus Agent'; t := _string; end; $15: info := 'Body Part Examined'; $20 : begin info := 'Scanning Sequence';t := _string; TmpStr := ''; DICOMHeaderString(TmpStr); if TmpStr = 'RM' then lResearchMode := true; end; $21 : begin info := 'Sequence Variant';t := _string; end; $22 : info := 'Scan Options'; $23 : begin info := 'MR Acquisition Type'; t := _string; end; $24 : info := 'Sequence Name'; $25 : begin info := 'Angio Flag';t := _string; end; $30 : info := 'Radionuclide'; $50 : begin info := 'Slice Thickness'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; lDICOMdata.XYZmm[3] := lfloat1; lThickness := lfloat1;//lDICOMdata.Thickness := lfloat1; //1391b end; //$60: begin info := 'KVP [Peak Output, KV]'; t := _string; end; //aqw $60: begin info := 'KVP [Peak KV]'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; //lDicomData.kV := lFloat1; end; $70: begin t := _string; info := 'Counts Accumulated'; end; $71: begin t := _string; info := 'Acquisition Condition'; end; //$80 : begin info := 'Repetition Time'; t := _string; end; //aqw //$81 : begin info := 'Echo Time'; t := _string; end; //aqw $80 : begin info := 'Repetition Time [TR, ms]'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; lDicomData.TR := lFloat1; end; $81 : begin info := 'Echo Time [TE, ms]'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; lDicomData.TE := lFloat1; end; $82 : begin t := _string; info := 'Inversion Time';end; $83 : begin t := _string; info := 'Number of Averages'; end; $84 : info := 'Imaging Frequency'; $85 : begin info := 'Imaged Nucleus'; t := _string; end; $86 : begin info := 'Echo Number';t := _string; DICOMHeaderStringToInt(lEchoNum); //lDICOMdata.Echo := lEchoNum; end; //qq $87 : info := 'Magnetic Field Strength'; $88 : begin info := 'Spacing Between Slices'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; //1362 some use this for gap size, others for sum of gap and slicethickness! //3333 if (lfloat1 > lDICOMdata.XYZmm[3]) or (lDICOMdata.XYZmm[3]=1) then //lDICOMdata.XYZmm[3] := lfloat1; //fx(lDICOMdata.XYZmm[3],lThickness,lfloat1); if lfloat1 < 0 then lDICOMdata.XYZmm[3] := lFloat1//does not make sense - found in some eFilm images from Marconi P3000 else if ( (lThickness/2) > lfloat1 ) then lDICOMdata.XYZmm[3] := lfloat1+lThickness else lDICOMdata.XYZmm[3] := lfloat1;//1392 //xldicomdata.spacing:=lfloat1; end; $89 : begin // t := _string; info := 'Number of Phase Encoding Steps'; //1499c This is a indirect method for detecting SIemens Mosaics: check if image height is evenly divisible by encoding steps // A real kludge due to Siemens not documenting mosaics explicitly: this workaround may incorrectly think rescaled images are mosaics! readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); lPhaseEncodingSteps := round(lfloat1); //xxxMsg(floattostr(lFloat1)); if not lrOK then goto 666; e_len := 0; remaining := 0; //1362 some use this for gap size, others for sum of gap and slicethickness! //if (lfloat1 > lDICOMdata.XYZmm[3]) or (lDICOMdata.XYZmm[3]=1) then //lDICOMdata.XYZmm[3] := lfloat1; //ldicomdata.spacing:=lfloat1; end; $90 : info := 'Data collection diameter'; $91 : begin info := 'Echo Train Length';t := _string; end; $93: begin info := 'Percent Sampling'; t := _string; end; $94: begin info := 'Percent Phase Field View'; t := _string; end; $95 : begin info := 'Pixel Bandwidth'; t := _string; end; $1000: begin t := _string; info := 'Device Serial Number'; end; $1004: info := 'Plate ID'; $1020: begin info := 'Software Version'; t := _string; if e_len > 2 then begin TmpStr := ''; DICOMHeaderString(TmpStr); lDicomData.Vers0018_1020 := Siemensversion(TmpStr); end; //showmsg(inttostr(lDicomData.Vers0018_1020)+' '+TmpStr); end; $1030: begin info := 'Protocol Name';t := _string; TmpStr := ''; DICOMHeaderString(TmpStr); lDicomData.ProtocolName := TmpStr; AplhaNumericStrDICOM (lDicomData.ProtocolName); end; $1040: info := 'Contrast/Bolus Route'; $1050 : begin t := _string; info := 'Spatial Resolution'; end; $1060: info := 'Trigger Time'; $1062: info := 'Nominal Interval'; $1063: info := 'Frame Time'; $1081: info := 'Low R-R Value'; $1082: info := 'High R-R Value'; $1083: info := 'Intervals Acquired'; $1084: info := 'Intervals Rejected'; $1088: begin info := 'Heart Rate'; t := _string; end; $1090: begin info := 'Cardiac Number of Images'; t := _string; end; $1094: begin info := 'Trigger Window';t := _string; end; $1100: info := 'Reconstruction Diameter'; $1110: info := 'Distance Source to Detector [mm]'; $1111: info := 'Distance Source to Patient [mm]'; $1120: info := 'Gantry/Detector Tilt'; $1130: info := 'Table Height'; $1140: info := 'Rotation Direction'; $1147: info := 'Field of View Shape'; $1149: begin t := _string; info := 'Field of View Dimension[s]'; end; $1150: begin info := 'Exposure Time [ms]'; t := _string; end; $1151: begin info := 'X-ray Tube Current [mA]'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; //xlDicomData.mA := lFloat1; end; $1152 : info := 'Acquisition Device Processing Description'; $1155: info := 'Radiation Setting'; $1160: info := 'Filter Type'; $1164: info :='Imager Pixel Spacing'; $1166: info := 'Grid'; $1170 : info := 'Generator Power'; $1180 : info := 'Collimator/grid Name'; $1190 : begin info := 'Focal Spot[s]'; t := _string; end; $11A0 : begin info := 'Body Part Thickness'; t := _string; end; $11A2 : info := 'Compression Force'; $1200 : info := 'Date of Last Calibration'; $1201 : info := 'Time of Last Calibration'; $1210: info := 'Convolution Kernel'; $1250: begin t := _string; info := 'Receiving Coil'; end; $1251: begin t := _string; info := 'Transmitting Coil'; end; $1260 : begin t := _string; info := 'Plate Type'; end; $1261 : begin t := _string; info := 'Phosphor Type'; end; $1310: begin info := 'Acquisition Matrix'; //Siemens Mosaics converted by Merge can report the incorrect mm //nji2 //NOTE: Matrix Information for MERGE converted images. Used Innocently for other uses by Siemens if (lOldSiemens_IncorrectMosaicMM) or ((lSiemensMosaic0008_0008) and (lMatrixSz < 1){B13}) then begin //TmpStr := ReadStrABC(fp, remaining,lrOK,lA,lB,lC); TmpStr := ReadStr(fp, remaining,lrOK,lMatrixSz); //ss//1362 //fx(remaining); (*kEr := true; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; kEr := false; lMatrixSz := round(lFloat1); msg(TmpStr); fx(lMatrixSz,lFLoat1,lFloat2,4321);*) {fx(lA,lB,lC); lMatrixSz := lB; lMatrixSzY := lC; } end else TmpStr := ReadStr(fp, remaining,lrOK,lJunk);//1362 if not lrOK then goto 666; e_len := 0; remaining := 0; end; $1312: begin t := _string; info := 'Phase Encoding Direction'; TmpStr := ''; DICOMHeaderString(TmpStr); lDicomData.PhaseEncoding := TmpStr; AplhaNumericStrDICOM (lDicomData.PhaseEncoding); end; $1314: begin t := _string; info := 'Flip Angle'; end; $1315: begin t := _string;info := 'Variable Flip Angle Flag'; end; $1316: begin t := _string;info := 'SAR'; end; $1400: info := 'Acquisition Device Processing Description'; $1401: begin info := 'Acquisition Device Processing Code';t := _string; end; $1402: info := 'Cassette Orientation'; $1403: info := 'Cassette Size'; $1404: info := 'Exposures on Plate'; $1405: begin info := 'Relative X-Ray Exposure'; t := _string; end; $1500: info := 'Positioner Motion'; $1508: info := 'Positioner Type'; $1510: begin info := 'Positioner Primary Angle'; t := _string; end; $1511: info := 'Positioner Secondary Angle'; $5020: info := 'Processing Function'; $5100: begin t := _string; info := 'Patient Position'; TmpStr := ''; DICOMHeaderString(TmpStr); lDicomData.PatientPos := TmpStr; AplhaNumericStrDICOM (lDicomData.PatientPos); end; $5101: begin info := 'View Position';t := _string; end; $6000: begin info := 'Sensitivity'; t := _string; end; $7004: info := 'Detector Type'; $7005: begin info := 'Detector Configuration'; t := _string; end; $7006: info := 'Detector Description'; $700A: info := 'Detector ID'; $700C: info := 'Date of Last Detector Calibration'; $700E: info := 'Date of Last Detector Calibration'; $7048: info := 'Grid Period'; $7050: info := 'Filter Material LT'; $7060: info := 'Exposure Control Mode'; end; $0019: begin (*case element of //1362 //3/3/2008 this old method for detecting mosaics has a problem - if image is interpolated x2, you will assume a 2x2 mosaic $1220: begin info := 'Matrix';t := _string; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; if lfloat2 > lfloat1 then lfloat1 := lfloat2; lMatrixSz := round(lfloat1); //if >32767 then there will be wrap around if read as signed value! remaining := 0; end; $14D4: begin info := 'Matrix';t := _string; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; if lfloat2 > lfloat1 then lfloat1 := lfloat2; lMatrixSz := round(lfloat1); //if >32767 then there will be wrap around if read as signed value! remaining := 0; end; end; *) //case element if lDicomData.ManufacturerID = kSiemensID then begin case element of //1362 $000C,$100C: begin info := 'Siemens b-value'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; tmpstr := floattostr(lFloat1); lDICOMdata.DTI[1].bval := round(lFloat1); lDICOMdata.SiemensDICOMDTI := true ; //msgfx( 777,lDICOMdata.DTI[1].bval,lDICOMdata.DTI[1].bval,lDICOMdata.DTI[1].bval); end; // b-values $000E,$100E: begin info := 'Siemens Gradient vector [x,y,z]'; //readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); lDICOMdata.DTI[1].v1 := read64 (fp,lrOK); if not lrOK then goto 666; lDICOMdata.DTI[1].v2 := read64 (fp,lrOK); if not lrOK then goto 666; lDICOMdata.DTI[1].v3 := read64 (fp,lrOK); if not lrOK then goto 666; //msgfx( 666,lDICOMdata.DTI[1].v1,lDICOMdata.DTI[1].v2,lDICOMdata.DTI[1].v3); //readfloats3 (fp, remaining, lDummyStr, lDICOMdata.DTI[1].v1,lDICOMdata.DTI[1].v2,lDICOMdata.DTI[1].v3, lROK); //ShowMsg(lDummyStr); //fx(e_len,lDICOMdata.DTI[1].v1,lDICOMdata.DTI[1].v2,lDICOMdata.DTI[1].v3); e_len := 0; remaining := 0; //lDICOMdata.DTI[1].v1 := lFloat1; end; // X diffusion direction end;//Case element end;//if Siemens if lDicomData.ManufacturerID = kGEID then begin case element of //1362 $10BB,$a0bb: begin info := 'GE Gradient vector [x]'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; lDICOMdata.DTI[1].v1 := lFloat1; end; // X diffusion direction $10BC,$A0BC: begin info := 'GE Gradient vector [y]'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; lDICOMdata.DTI[1].v2 := lFloat1; end;//Y diffusion direction $10BD,$A0BD: begin info := 'GE Gradient vector [z]'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; lDICOMdata.DTI[1].v3 := lFloat1; end;// Z diffusion direction end;//Case element // end;//if GE end;//$0019 $0020 : case element of $00 : info := 'Relationship Group Length'; $0d : info := 'Study Instance UID'; $0e : info := 'Series Instance UID'; $10 : begin info := 'Study ID'; t := _string; end; $11 : begin info := 'Series Number'; DICOMHeaderStringToInt(lDicomData.SeriesNum); end; $12 : // begin info := 'Acquisition Number'; t := _string; end; begin info := 'Acquisition Number'; DICOMHeaderStringToInt(lDicomData.AcquNum); end; $13 : begin info := 'Image Number'; DICOMHeaderStringToInt(lTempInt); if (lDicomData.ImageNum < 2) and (lTempInt >= 0) then lDicomData.ImageNum := lTempInt; //March2008 - some Philips data has multiple image numbers... // 0018,1020,Software Version=1.5.4\1.5.4.3\Gyroscan PMS/DICOM 2.0 MR .Id. datadefs.v 5.27 2004/10/18 06.50 //msg(inttostr(lDicomData.ImageNum)+lDicomData.Filename); end; $20 : begin info := 'Patient Orientation'; t := _string; end; $30 : info := 'Image Position'; $32 : begin info := 'Image Position Patient'; //June 2009 - for Philips new 4D format we want value from the first slice... if not lImagePositionPatientRead then begin readfloats3 (fp, remaining, lDummyStr, lDicomData.PatientPosX, lDicomData.PatientPosY,lDicomData.PatientPosZ, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; lImagePositionPatientRead := true; //we assume Philips reports the slice thickness correctly.... //an alternative would be to read both 1st and 2nd ImagePositionPatient and //compute the function DICOMinterslicedistance end else begin CheckIntersliceDistance(l4DDistanceBetweenSliceCenters); end; end; $35 : info := 'Image Orientation'; $37 : begin //nifti info := 'Image Orientation (Patient)'; readfloats6 (fp, remaining, lDummyStr, lDicomData.Orient[1], lDicomData.Orient[2],lDicomData.Orient[3],lDicomData.Orient[4], lDicomData.Orient[5],lDicomData.Orient[6], lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; end; $50 : info := 'Location'; $52 : info := 'Frame of Reference UID'; $91 : info := 'Echo Train Length'; $70 : info := 'Image Geometry Type'; $60 : info := 'Laterality'; $0105 : begin //Apr2007 DICOMHeaderStringToInt(lnVol); //Number of temporal positions=105 end; $1001: info := 'Acquisitions in Series'; $1002: info := 'Images in Acquisition'; $1020: info := 'Reference'; $1040: begin info := 'Position Reference'; t := _string; end; $1041: begin info := 'Slice Location'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; ldicomdata.location:=lfloat1; end; $1070: begin info := 'Other Study Numbers'; t := _string; end; $3401: info := 'Modifying Device ID'; $3402: info := 'Modified Image ID'; $3403: info := 'Modified Image Date'; $3404: info := 'Modifying Device Mfg.'; $3405: info := 'Modified Image Time'; $3406: info := 'Modified Image Desc.'; $4000: info := 'Image Comments'; $5000: info := 'Original Image ID'; $5002: info := 'Original Image... Nomenclature'; end; $0021:case element of $104F: begin info :='GE Locations in acquisition'; if lPrefs.UseGE_0021_104F then begin //June 2009 - Thomas Stephan sent me a GE image where this was set to 2, but should have been 1 //I hope removing this does not cause problems with other GE images... if e_len = 2 then begin lDicomData.SlicesPer3DVol := read16(fp,lrOK); e_len := 0; remaining := 0; /// fx(9999, lDicomData.SlicesPer3DVol); end; end; //use 0021_104F end; $1341: begin info :='Siemens Mosaic Slice Count'; DICOMHeaderStringToInt(lDicomData.SiemensSlices); end; $134F: begin //1366 info :='Siemens Order of Slices'; t := _string; lDICOMdata.SiemensInterleaved := 0; //0=no,1=yes,2=undefined //look for "INTERLEAVED" lStr := ''; if dFilePos(fp) > (filesz-e_len) then goto 666; GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); for i := 0 to e_len-1 do if Char(buff[i]) in ['?','A'..'Z','a'..'z'] then lStr := lStr +upcase(Char(buff[i])); FreeMem( buff); if(lStr[1]= 'I') then lDICOMdata.SiemensInterleaved := 1; //0=no,1=yes,2=undefined e_len := 0; end; end; $0028 : begin case element of $00 : info := 'Image Presentation Group Length'; $02 : begin info := 'Samples Per Pixel'; tmp := read16(fp,lrOK); if not lrOK then goto 666; lDicomData.SamplesPerPixel :=tmp; if e_len > 255 then begin explicitVR := true; //kludge: switch between implicit and explicitVR end; tmpstr := inttostr(tmp); e_len := 0; remaining := 0; end; $04 : begin info := 'Photometric Interpretation'; TmpStr := ''; if dFilePos(fp) > (filesz-e_len) then goto 666; GetMem( buff, e_len); dBlockRead(fp, buff{^}, e_len, n); for i := 0 to e_len-1 do if Char(buff[i]) in [{'+','-',' ', }'0'..'9','a'..'z','A'..'Z'] then TmpStr := TmpStr +(Char(buff[i])); FreeMem( buff); (*xif TmpStr = 'MONOCHROME1' then lDicomdata.monochrome := 1 else if TmpStr = 'MONOCHROME2' then lDicomdata.monochrome := 2 else if (length(TMpStr)> 0) and (TmpStr[1] = 'Y') then lDICOMdata.monochrome := 4 else lDICOMdata.monochrome := 3; *) remaining := 0; e_len := 0; {use tempstr} end; $05 : info := 'Image Dimensions (ret)'; $06 : begin info := 'Planar Configuration'; tmp := read16(fp,lrOK); if not lrOK then goto 666; lDicomData.PlanarConfig :=tmp; remaining := 0; end; $08 : begin //if lPapyrusnSlices < 1 then // if remaining = 2 then begin // tmp := read16(fp,lrOK); // // end else xx DICOMHeaderStringToInt(lDicomData.XYZdim[3]); if lDicomData.XYZdim[3] < 1 then lDicomData.XYZdim[3] := 1; info := 'Number of Frames'; end; $09: begin info := 'Frame Increment Pointer'; TmpStr := ReadStrHex(fp, remaining,lrOK); if not lrOK then goto 666; e_len := 0; remaining := 0; end; $10 : begin info := 'Rows'; lDicomData.XYZdim[2] := read16(fp,lrOK); if not lrOK then goto 666; tmp := lDicomData.XYZdim[2]; remaining := 0; end; $11 : begin info := 'Columns'; lDicomData.XYZdim[1] := read16(fp,lrOK); if not lrOK then goto 666; tmp := lDicomData.XYZdim[1]; remaining := 0; end; $30 : begin info := 'Pixel Spacing'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; //qq //row spacing [y], then column spacing [x]: see part 3 of DICOM e_len := 0; remaining := 0; lDICOMdata.XYZmm[2] := lfloat1; lDICOMdata.XYZmm[1] := lfloat2; end; $31: info := 'Zoom Factor'; $32: info := 'Zoom Center'; $34: begin info :='Pixel Aspect Ratio';t := _string; end; $40: info := 'Image Format [ret]'; $50 : info := 'Manipulated Image [ret]'; $51: info := 'Corrected Image'; $60: begin info := 'Compression Code [ret]';t := _string; end; $100: begin info := 'Bits Allocated'; if remaining = 4 then tmp := read32(fp,lrOK) else tmp := read16(fp,lrOK); //lWord := read16(fp,lrOK); //lWord := read16(fp,lrOK); if not lrOK then goto 666; if tmp = 8 then lDicomData.Allocbits_per_pixel := 8 else if tmp = 12 then lDicomData.Allocbits_per_pixel := 12 else if tmp = 16 then lDicomData.Allocbits_per_pixel := 16 else if tmp = 24 then begin //xlDicomData.SamplesPerPixel := 3; lDicomData.Allocbits_per_pixel := 8 end else begin lWord := tmp; lWord := swap(lWord); if lWord in [8,12,16,24] then begin lDicomData.Allocbits_per_pixel := tmp; lByteSwap := true; end else begin if lImageFormatOK then Msg('This software only reads 8, 12 and 16 bit DICOM files. This file allocates '+inttostr(tmp)+' bits per voxel.'); lImageFormatOK := false; end; end; //remaining := 2;//remaining; //1371-> remaining := 0 end; $0101: begin info := 'Bits Stored'; if remaining = 4 then tmp := read32(fp,lrOK) else tmp := read16(fp,lrOK); if not lrOK then goto 666; (*if tmp <= 8 then lDicomData.Storedbits_per_pixel := 8 else if tmp <= 16 then lDicomData.Storedbits_per_pixel := 16 else if tmp <= 24 then begin lDicomData.Storedbits_per_pixel := 24; lDicomData.SamplesPerPixel := 3; end else begin lWord := tmp; lWord := swap(lWord); if lWord in [8,12,16] then begin lDicomData.Storedbits_per_pixel := tmp; lByteSwap := true; end else begin if lImageFormatOK then Msg('This software can only read 8, 12 and 16 bit DICOM files. This file stores '+inttostr(tmp)+' bits per voxel.'); lDicomData.Storedbits_per_pixel := tmp; lImageFormatOK := false;{ } end; end;*) remaining := 0; end; $0102: begin info := 'High Bit'; if remaining = 4 then tmp := read32(fp,lrOK) else tmp := read16(fp,lrOK); if not lrOK then goto 666; remaining := 0; end; $0103: begin info := 'Pixel Representation'; if remaining = 2 then begin tmp := read16(fp,lrOK); //1= signed, 0=unsigned... if tmp = 1 then lDicomData.SignedData := true; if tmp = 0 then lDicomData.SignedData := false; remaining := 0; end; end; $0104: info := 'Smallest Valid Pixel Value'; $0105: info := 'Largest Valid Pixel Value'; $0106: begin //xlDicomData.MinIntensitySet:= true; info := 'Smallest Image Pixel Value'; tmp := read16(fp,lrOK); if not lrOK then goto 666; //xlDicomData.Minintensity := tmp; //if >32767 then there will be wrap around if read as signed value! remaining := 0; end; $0107: begin info := 'Largest Image Pixel Value'; if remaining = 4 then tmp := read32(fp,lrOK) else tmp := read16(fp,lrOK); if not lrOK then goto 666; //xlDicomData.Maxintensity := tmp; //if >32767 then there will be wrap around if read as signed value! remaining := 0; end; $120: info := 'Pixel Padding Value'; $200: info := 'Image Location [ret]'; $1040: begin t := _string; info := 'Pixel Intensity Relationship'; end; $1050: begin info := 'Window Center'; if e_len > 0 then begin readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; //xlDICOMdata.WindowCenter := round(lfloat1); end; end;{float} $1051: begin info := 'Window Width'; if e_len > 0 then begin readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; //xlDICOMdata.WindowWidth := round(lfloat1); end; //ignore empty elements, e.g. LeadTech's image6.dic end; $1052: begin t := _string;info :='Rescale Intercept'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; lDICOMdata.intenIntercept := lfloat1; //if (lDICOMdata.nOrder > 0) and (lDICOMdata.nOrder < kMaxOrderVal) then // lDICOMdata.OrderIntercept[lDICOMdata.nOrder] := lfloat1; end; {float} $1053:begin t := _string; info := 'Rescale Slope'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; if lFloat1 < 0.000000001 then begin lFLoat1 := 1; //misused in some images, see IMG000025 end; lDICOMdata.intenScale := lfloat1; //if (lDICOMdata.nOrder > 0) and (lDICOMdata.nOrder < kMaxOrderVal) then // lDICOMdata.OrderSlope[lDICOMdata.nOrder] := lfloat1; end; {float} $1054:begin t := _string; info := 'Rescale Type';end; $1100: info := 'Gray Lookup Table [ret]'; $1101: begin info := 'Red Palette Descriptor'; TmpStr := ReadStr(fp, remaining,lrOK,lJunk); if not lrOK then goto 666; e_len := 0; remaining := 0; end; $1102: begin info := 'Green Palette Descriptor'; TmpStr := ReadStr(fp, remaining,lrOK,lJunk); if not lrOK then goto 666; e_len := 0; remaining := 0; end; $1103: begin info := 'Blue Palette Descriptor'; TmpStr := ReadStr(fp, remaining,lrOK,lJunk); if not lrOK then goto 666; e_len := 0; remaining := 0; end; $1199: begin info := 'Palette Color Lookup Table UID'; end; $1200: info := 'Gray Lookup Data [ret]'; $1201, $1202,$1203: begin case element of $1201: info := 'Red Table'; {future} $1202: info := 'Green Table'; {future} $1203: info := 'Blue Table'; {future} end; if dFilePos(fp) > (filesz-remaining) then goto 666; if not lReadColorTables then begin dSeek(fp, dFilePos(fp) + remaining); end else begin {load color} width := remaining div 2; if width > 0 then begin getmem(lWordRA,width*2); for i := (width) downto 1 do lWordRA^[i] := read16(fp,lrOK); //value := 159; value := lWordRA^[1]; max16 := value; min16 := value; for i := (width) downto 1 do begin value := lWordRA^[i]; if value < min16 then min16 := value; if value > max16 then max16 := value; end; //width..1 if max16 - min16 = 0 then max16 := min16+1; {avoid divide by 0} if (lDicomData.Allocbits_per_pixel <= 8) and (width > 256) then width := 256; //currently only accepts palettes up to 8-bits GetMem( lColorRA, width );(**) for i := width downto 1 do lColorRA^[i] := (lWordRA^[i] shr 8) {and 255}; FreeMem( lWordRA ); case element of $1201: begin red_table_size := width; red_table :=lColorRA;; end; $1202: begin green_table_size := width; green_table :=lColorRA;; end; else {x$1203:} begin blue_table_size := width; blue_table :=lColorRA;; end; {else} end; {case} end; //width > 0; if odd(remaining) then dSeek(fp, dFilePos(fp) + 1{remaining}); end; {load color} tmpstr := 'Custom'; remaining := 0; e_len := 0; {show tempstr} end; $1221, $1222,$1223: begin info := 'Color Palette ['+inttostr(dFilePos(fp))+']'; (*xcase element of $1221: begin lDicomData.RLEredOffset:= dFilePos(fp); lDicomData.RLEredSz:= e_len; end; $1222: begin lDicomData.RLEgreenOffset:= dFilePos(fp); lDicomData.RLEgreenSz:= e_len; end; $1223: begin lDicomData.RLEblueOffset:= dFilePos(fp); lDicomData.RLEblueSz:= e_len; end; end;*)//Case set offset and length tmpstr := inttostr(e_len); dSeek(fp, dFilePos(fp)+ e_LEN); e_len := 0; end; $3002: info := 'LUT Descriptor'; $3003: info := 'LUT Explanation'; $3006: info := 'LUT Data'; $3010: begin info := 'VOI LUT Sequence'; if (explicitVR) and (lT0=kS) and (lT1=kQ) then e_len := 8; end; end; //case end; //$0028 $41: case element of //Papyrus Private Group $1010: begin info := 'Papyrus Icon [bytes skipped]'; dSeek(fp, dFilePos(fp) + e_len); tmpstr := inttostr(e_len); remaining := 0; e_len := 0; end; //element $0041:$1010 $1015: begin info := 'Papyrus Slices'; (*Papyrus format is buggy - see lsjpeg.pas for details, therefore, I have removed extensive support if e_len = 2 then begin lDicomData.XYZdim[3] := read16(fp,lrOK); if not lrOK then goto 666; end; if lDicomData.XYZdim[3] < 1 then lDicomData.XYZdim[3] := 1; if {(false) and }(lDicomData.XYZdim[3] > 1) and (lReadJPEGtables) and (gECATJPEG_table_entries = 0) then begin //Papyrus multislice files keep separate DICOM headers for each slice within a DICOM file lPapyrusnSlices := lDicomData.XYZdim[3]; lPapyrusSlice := 0; //lPapyrusData := lDicomData; gECATJPEG_table_entries := lDICOMdata.XYZDim[3]; getmem (gECATJPEG_pos_table, gECATJPEG_table_entries*sizeof(longint)); getmem (gECATJPEG_size_table, gECATJPEG_table_entries*sizeof(longint)); end else lDicomData.XYZdim[3] := 1; tmpstr := inttostr(lDicomData.XYZdim[3]); remaining := 0; e_len := 0;*) end; //element $0041:$1015 $1050: begin info := 'Papyrus Bizarre Element'; //bizarre osiris problem if (dfilepos(fp)+e_len)= (filesz) then e_len := 8; end; //element $0041:$1050 end; //group $0041: Papyrus $43: begin if lDicomData.ManufacturerID = kGEID then begin case element of $1039,$A039: begin // 0043,1039 (or 0043,a039). b value (as the first number in the string). info := 'GE Bvalue'; if e_len > 0 then begin readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; lDICOMdata.DTI[1].bval := round(lfloat1); lDICOMdata.nDTIdir := 1; end; //e_len>0 end;//1039 or Ao39 end;//Case end; //Manufacturer = GE end;//$0043 - GE bvalues $54: case element of $0: info := 'Nuclear Acquisition Group Length'; $11: info := 'Number of Energy Windows'; $21: info := 'Number of Detectors'; $51: info := 'Number of Rotations'; $80: begin info := 'Slice Vector'; TmpStr := ReadStr(fp, remaining,lrOK,lJunk); if not lrOK then goto 666; e_len := 0; remaining := 0; end; $81: info := 'Number of Slices'; $202: info := 'Type of Detector Motion'; $400: info := 'Image ID'; end; $2010 : case element of $0: info := 'Film Box Group Length'; $100: info := 'Border Density'; end; $4000 : info := 'Text'; $0029 : begin case element of $1010: begin //lSiemensMosaic0029_1010:= true; lDicomData.CSAImageHeaderInfoPos := (dFilePos(fp)); lDicomData.CSAImageHeaderInfoSz := e_len; info := 'Private Sequence Delimiter ['+inttostr(dFilePos(fp))+']'; if not lImageFormatOK //x(lDicomData.RunLengthEncoding) or ( ((lDicomData.JPEGLossycpt) or (lDicomData.JPEGLosslesscpt)) and (gECATJPEG_table_entries >= lDICOMdata.XYZdim[3]))} then time_to_quit := TRUE; dSeek(fp, dFilePos(fp) + e_len); tmpstr := inttostr(e_len); remaining := 0; e_len := 0; {show tempstr} end; $1053: begin info :='Philips Scale Slope'; readfloats (fp, remaining, lDummyStr, lfloat1, lfloat2, lROK); if not lrOK then goto 666; e_len := 0; remaining := 0; lPhilipsScaleSlope := lfloat1; {if e_len = 4 then begin lPhilipsScaleSlope := read32r(fp,lrOK); TmpStr := floattostr(lPhilipsScaleSlope); t := _string; if not lrOK then goto 666; e_len := 0; remaining := 0; end; } end; else begin end; END; END; //gROUP 0029 (* $0045 : begin case element of $103B: begin msg('0045:103B'); end; //element $1010 end; //CASE...element end; //group 0045 *) $0089 : begin case element of $1010: begin e_len := 0; lProprietaryImageThumbnail := true; //lImageFormatOK := false; end; //element $1010 $1020: begin //thoravision files if e_len > 12 then e_len := 0; //lProprietaryImageThumbnail := true; //lImageFormatOK := false; end; //element $1010 end; //CASE...element end; //group 0089 $2001 : begin if lDicomData.ManufacturerID = kPhilipsID then begin case element of $1003: begin //bvalue if e_len = 4 then begin if lDICOMdata.nDTIdir < kMaxDTIdir then inc(lDICOMdata.nDTIdir); lDICOMdata.DTI[lDICOMdata.nDTIdir].bval := round(read32r(fp,lrOK)); TmpStr := inttostr(lDICOMdata.DTI[lDICOMdata.nDTIdir].bval); t := _string; info :='DTI b-val'; if not lrOK then goto 666; e_len := 0; remaining := 0; end; //e_len = 4 end; //element 1003 $100B: begin info := 'philips: slice orientation';t := _string; TmpStr := ''; DICOMHeaderString(TmpStr); lDicomData.PhilipsSliceOrient := TmpStr; AplhaNumericStrDICOM (lDicomData.PhilipsSliceOrient); end;//PhilipsSliceOrient $1018: begin if e_len = 4 then begin info :='number of slices'; lDicomData.SlicesPer3DVol := read32(fp,lrOK); //uninterleave data e_len := 0; remaining := 0; if lResearchMode then lDicomData.SeriesNum := lDicomData.SeriesNum + 50; //do not jumble research recons and normal images end; //e_len = 4 TmpStr := floattostr(lDicomData.SlicesPer3DVol); end; //1018 $102D: begin ///Apr2007 if e_len = 2 then begin lnSlicePerVol := read16(fp,lrOK); e_len := 0; remaining := 0; end; //fx(213,lnSlicePerVol); end; //102D $105F: begin //Philips Stack Sequence if e_len > 8 then e_len := 8; end; //105F end; end; //if manufacturer = Philips end; //2001,1004) $2005 : begin //if lDicomData.ManufacturerID = kPhilipsID then Msg(inttohex(element,4)); if lDicomData.ManufacturerID = kPhilipsID then begin case element of $100E: begin if e_len = 4 then begin lPhilipsScaleSlope := read32r(fp,lrOK); TmpStr := floattostr(lPhilipsScaleSlope); t := _string; info :='Philips Scale Slope'; if not lrOK then goto 666; e_len := 0; remaining := 0; end; end; //element $1010 $1071: begin if e_len = 4 then begin lDicomData.AngulationAP := read32r(fp,lrOK); TmpStr := floattostr(lDicomData.AngulationAP); t := _string; info :='angulation midslice, AP (degrees)'; if not lrOK then goto 666; e_len := 0; remaining := 0; end; end; // Philips AP angulation : -8.74086 $1072: begin if e_len = 4 then begin lDicomData.AngulationFH := read32r(fp,lrOK); TmpStr := floattostr(lDicomData.AngulationFH); t := _string; info :='angulation midslice, FH (degrees)'; if not lrOK then goto 666; e_len := 0; remaining := 0; end; end; // Philips Philips FH angulation : -3.53147 $1073: begin if e_len = 4 then begin lDicomData.AngulationRL := read32r(fp,lrOK); TmpStr := floattostr(lDicomData.AngulationRL); t := _string; info :='angulation midslice, RL (degrees)'; if not lrOK then goto 666; e_len := 0; remaining := 0; end; end; // Philips RL angulation $10b0: begin if e_len = 4 then begin lDICOMdata.DTI[lDICOMdata.nDTIdir].v1 := read32r(fp,lrOK); TmpStr := floattostr(lDICOMdata.DTI[lDICOMdata.nDTIdir].v1); t := _string; info :='Gradient vector [x]'; if not lrOK then goto 666; e_len := 0; remaining := 0; end; //e_len = 4 end; //element 10b0 $10b1: begin if e_len = 4 then begin lDICOMdata.DTI[lDICOMdata.nDTIdir].v2 := read32r(fp,lrOK); TmpStr := floattostr(lDICOMdata.DTI[lDICOMdata.nDTIdir].v2); t := _string; info :='Gradient vector [y]'; if not lrOK then goto 666; e_len := 0; remaining := 0; end; //e_len = 4 end; //element 10b1 $10b2: begin if e_len = 4 then begin lDICOMdata.DTI[lDICOMdata.nDTIdir].v3 := read32r(fp,lrOK); TmpStr := floattostr(lDICOMdata.DTI[lDICOMdata.nDTIdir].v3); t := _string; info :='Gradient vector [z]'; //fx(lDICOMdata.DTI[lDICOMdata.nDTIdir].v1,lDICOMdata.DTI[lDICOMdata.nDTIdir].v2,lDICOMdata.DTI[lDICOMdata.nDTIdir].v3); if not lrOK then goto 666; e_len := 0; remaining := 0; end; //e_len = 4 end; //element 10b2 end; //CASE...element end; //if Manufacturer = Philips end; //group 2005 $5200 : begin case element of $9230: begin if (lDicomData.ManufacturerID = kPhilipsID) and (orientation_not_visible( lDICOMdata))then read_philips_hidden(lFilename, dFilePos(fp),e_len,lDICOMdata); end //element 9230 end; //case element end; //group 5200 $DDFF : begin case element of $00E0: begin //For papyrus multislice format: if (lPapyrusSlice >= lPapyrusnSlices) then time_to_quit := TRUE; end; end; end; $FFFE : begin case element of $E000 : begin (*iif lJPEGEntries > 17 then lTestError := true; if not lProprietaryImageThumbnail then begin f (lReadJPEGtables) and ((lDICOMdata.RunLengthEncoding) or (lDICOMdata.JPEGLossyCpt) or (lDICOMdata.JPEGLosslessCpt)) and (not lFirstFragment) and (e_len > 1024) {1384} and ( (e_len+dFilePos(fp)) <= FileSz) then begin //first fragment is the index table, so the previous line skips the first fragment if (gECATJPEG_table_entries = 0) then begin gECATJPEG_table_entries := lDICOMdata.XYZDim[3]; getmem (gECATJPEG_pos_table, gECATJPEG_table_entries*sizeof(longint)); getmem (gECATJPEG_size_table, gECATJPEG_table_entries*sizeof(longint)); end; if lJPEGentries < gECATJPEG_table_entries then begin inc(lJPEGentries); gECATJPEG_pos_table^[lJPEGEntries] := dFilePos(fp); gECATJPEG_size_table^[lJPEGEntries] := e_len; end; end; if (lDICOMdata.CompressOffset =0) and ( (e_len+dFilePos(fp)) <= FileSz) and (e_len > 1024){ALOKA} then begin lDICOMdata.CompressOffset := dFilePos(fp); lDICOMdata.CompressSz := e_len; end; //if e_len > lDICOMdata.CompressSz then lDICOMdata.CompressSz := e_len; if (e_len > 1024) and (lDICOMdata.CompressSz=0) then begin //ABBA RLE ALOKA //Time_To_Quit := true;//ABBA lDICOMdata.CompressSz := e_len; lDICOMdata.CompressOffset := dFilePos(fp); end; if (lFirstFragment) or ((e_len > lDICOMdata.CompressSz) and not (lDicomData.RunLengthEncoding)) then lDICOMdata.CompressOffset := dFilePos(fp); if (e_len > lDICOMdata.CompressSz) and (e_len > 1024){ALOKA} then lDICOMdata.CompressSz := e_len; lFirstFragment := false; lDICOMdataBackUp := lDICOMData; if (gECATJPEG_table_entries = 1) then begin //updatex gECATJPEG_size_table^[1] := lDICOMdata.CompressSz; gECATJPEG_pos_table^[1] := lDICOMdata.CompressOffset; end; //updatex end; //not proprietaryThumbnail lProprietaryImageThumbnail := false; //1496 *) lFirstFragment := false;//Dec09 lDICOMdataBackUp := lDICOMData;//Dec09 if (e_len >= (lDicomData.XYZdim[1]*lDicomData.XYZdim[2])){Apr 2011} and (lDicomData.XYZdim[1]> 1) then begin lDICOMdata.CompressOffset := dFilePos(fp); lDICOMdata.CompressSz := e_len; Time_To_Quit := true; //msg('abba'+inttostr(lDICOMdata.CompressOffset)+' '+inttostr(lDICOMdata.CompressSz)); end; info := 'Image Fragment ['+inttostr(dFilePos(fp))+']'; if (dFilePos(fp) + e_len) >= filesz then Time_To_Quit := true; dSeek(fp, dFilePos(fp) + e_len); tmpstr := inttostr(e_len); remaining := 0; e_len := 0; end; $E0DD : begin info := 'Sequence Delimiter'; if (lDICOMdata.XYZdim[1]= lDICOMdata.XYZdim[3])) then time_to_quit := TRUE; end; //RLE ABBA if (e_len = 0) then begin //ALOKA explicitVR := true; time_to_quit := FALSE;//RLE16=false end; //END dSeek(fp, dFilePos(fp) + e_len); tmpstr := inttostr(e_len); remaining := 0; e_len := 0; end; end; end; $FFFC : begin dSeek(fp, dFilePos(fp) + e_len); tmpstr := inttostr(e_len); remaining := 0; e_len := 0; end; $72FF : case element of $1041: time_to_quit := TRUE; end; //case 72FF $7FE0 : case element of $00 : begin info := 'Pixel Data Group Length'; if not lImageFormatOK then time_to_quit := TRUE; end; $10 : begin info := 'Pixel Data'; TmpStr := inttostr(e_len); if (lDICOMdata.XYZdim[1]= $6000) AND (group <= $601e) AND ((group AND 1) = 0) then begin info := 'Overlay'+inttostr(dfilepos(fp))+'x'+inttostr(e_len); end; if element = $0000 then info := 'Group Length'; if element = $4000 then info := 'Comments'; end; end; lStr := ''; if (Time_TO_Quit) and (not lImageFormatOK) then begin lHdrOK := true; goto 666; end; //Msg(inttohex(group,4) +':'+inttohex(element,4) +' '+inttostr(e_len)+'@'+ inttostr(dfilepos(fp))); if (e_len + dfilepos(fp)) > FileSz then begin//patch for GE files that only fill top 16-bytes w Random data e_len := e_len and $FFFF; end; if (e_len > 131072) then begin //goto 666; end;//zebra if (NOT time_to_quit) AND (e_len > 0) and (remaining > 0) then begin if (e_len + dfilepos(fp)) > FileSz then begin if not lImageFormatOK(*x(lDICOMdata.GenesisCpt) or (lDICOMdata.JPEGlosslessCpt) or (lDICOMdata.JPEGlossyCpt)*) then lHdrOK := true else begin Msg('dcm Error: not a DICOM image: '+lFilename); {Msg('Diagnostics saved as: c:\dcmcrash.txt'); //diagnostics assignfile(lTextF,'c:\dcmcrash.txt'); Filemode := 0; rewrite(lTextF); Write(lTextF,lDynStr); closefile(lTextF); } //Msg(inttohex(group,4) +':'+inttohex(element,4) +' '+inttostr(e_len)+'@'+ inttostr(dfilepos(fp))); end; goto 666; end; if e_len > 0 then begin GetMem( buff, e_len); dBlockRead(fp, buff, e_len, n); if lVerboseRead then case t of unknown : case e_len of 1 : lStr := ( IntToStr(Integer(buff[0]))); 2 : Begin if lDicomData.little_endian <> 0 then i := Integer(buff[0]) + 256*Integer(buff[1]) else i := Integer(buff[0])*256 + Integer(buff[1]); lStr :=( IntToStr(i)); end; 4 : Begin if lDicomData.little_endian <> 0 then i := Integer(buff[0]) + 256*Integer(buff[1]) + 256*256*Integer(buff[2]) + 256*256*256*Integer(buff[3]) else i := Integer(buff[0])*256*256*256 + Integer(buff[1])*256*256 + Integer(buff[2])*256 + Integer(buff[3]); lStr := (IntToStr(i)); end; else begin if e_len > 0 then begin for i := 0 to e_len-1 do begin if Char(buff[i]) in ['+','-','/','\',' ', '0'..'9','a'..'z','A'..'Z'] then lStr := lStr+(Char(buff[i])) else lStr := lStr+('.'); end; end else lStr := '*NO DATA*'; end; end; i8, i16, i32, ui8, ui16, ui32, _string : for i := 0 to e_len-1 do if Char(buff[i]) in ['+','-','/','\',' ', '0'..'9','a'..'z','A'..'Z'] then lStr := lStr +(Char(buff[i])) else lStr := lStr +('.'); end; FreeMem(buff); end; end else if e_len > 0 then lStr := (IntToStr(tmp)) else begin lStr := TmpStr; end; (*if (lGrp) then if MessageDlg(lStr+'= '+info+' '+IntToHex(where,4)+': ('+IntToHex(group,4)+','+IntToHex(element,4)+')'+IntToStr(e_len)+'. Continue?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then GOTO 666; *) //if (Group > $2005) then // msg(info+' '+IntToStr(where)+': ('+IntToHex(group,4)+','+IntToHex(element,4)+')'+IntToStr(e_len)); {$IFDEF Troubleshoot} Msg( IntToHex(group,4)+','+IntToHex(element,4)+','+Info+'='+lStr);//+' Offset'+inttostr(dfilepos(fp))+' Length'+inttostr(e_len)); {$ENDIF Troubleshoot} if lverboseRead then begin if length(lDynStr) > kMaxTextBuf then begin if not lTextOverFlow then begin lDynStr := lDynStr + 'Only showing the first '+inttostr(kMaxTextBuf) +' characters of this LARGE header'; lTextOverFlow := true; end; //goto 666; end else lDynStr := lDynStr+IntToHex(group,4)+','+IntToHex(element,4)+','+Info+'='+lStr+kCR ; Msg(IntToHex(group,4)+','+IntToHex(element,4)+','+inttostr(e_len)+'@'+inttostr(dfilepos(fp))+','+Info+'='+lStr); end; //not verbose read end; // end for lDicomData.ImageStart := dfilepos(fp); if lBigSet then begin if lBig then lDicomData.little_endian := 0 else lDicomData.little_endian := 1; end; lHdrOK := true; if lByteSwap then begin ByteSwap(lDicomdata.XYZdim[1]); ByteSwap(lDicomdata.XYZdim[2]); if lDicomdata.XYZdim[3] <> 1 then ByteSwap(lDicomdata.XYZdim[3]); //xByteSwap(lDicomdata.SamplesPerPixel); ByteSwap(lDicomData.Allocbits_per_pixel); //xByteSwap(lDicomData.Storedbits_per_pixel); end; if (lDICOMdata.ManufacturerID = kPhilipsID) and (l4DDistanceBetweenSliceCenters <> MaxInt) then //some 3D and 4D Philips files do not correctly report interslice distance in 0018,0088 and 0018,0050... lDICOMdata.XYZmm[3] := (l4DDistanceBetweenSliceCenters); if (lPrefs.PhilipsPrecise) and (lManufacturerIsPhilips) and (lPhilipsScaleSlope <> 0) then begin PhilipsPrecise (lDicomData.IntenScale, lDICOMdata.intenIntercept,lPhilipsScaleSlope, lDicomData.IntenScale, lDICOMdata.intenIntercept,true); end; //if PARprecise if (lDICOMdata.ManufacturerID = kPhilipsID) and (lDICOMdata.nDTIdir > 1) then begin lGELX := true; for i := 1 to lDICOMdata.nDTIdir do if lDICOMdata.DTI[lDICOMdata.nDTIdir].bval <> lDICOMdata.DTI[1].bval then lGELX := false;//multiple B0 directions if lGELX then lDICOMdata.nDTIdir := 1; lGELX := false; end; if (lMatrixSz > 1) and (lDicomData.CSAImageHeaderInfoPos > 0) and (lDicomData.CSAImageHeaderInfoSz > 0) and not (((lDicomdata.XYZdim[1] mod lMatrixSz) = 0) and ((lDicomdata.XYZdim[2] mod lMatrixSz) = 0)) then begin //Slow method for non-square Siemens matrices - 0018:1310 based on phase/freq, so it is easier to read CSA to decode rows/columns GetCSAImageHeaderInfo (lFilename, lDicomData.CSAImageHeaderInfoPos ,lDicomData.CSAImageHeaderInfoSz, lTempInt,lDICOMdata.SiemensMosaicX,lDICOMdata.SiemensMosaicY, lfloat1,lfloat2,lfloat3) end else if (lMatrixSz > 1) and ((lDicomdata.XYZdim[1] mod lMatrixSz) = 0) and ((lDicomdata.XYZdim[2] mod lMatrixSz) = 0) then begin if ((lDicomData.XYZdim[1] mod lMatrixSz)=0) then lDicomData.SiemensMosaicX := lDicomData.XYZdim[1] div lMatrixSz; if ((lDicomData.XYZdim[2] mod lMatrixSz)=0) then lDicomData.SiemensMosaicY := lDicomData.XYZdim[2] div lMatrixSz; if lDicomData.SiemensMosaicX < 1 then lDicomData.SiemensMosaicX := 1; //1366 if lDicomData.SiemensMosaicY < 1 then lDicomData.SiemensMosaicY := 1; //1366 if lOldSiemens_IncorrectMosaicMM then begin //old formats convert size in mm incorrectly - modern versions are correct and include transfer syntax lDicomdata.XYZmm[1] := lDicomdata.XYZmm[1] * (lDicomdata.XYZdim[1] div lMatrixSz); lDicomdata.XYZmm[2] := lDicomdata.XYZmm[2] * (lDicomdata.XYZdim[2] div lMatrixSz); end; end else if (lSiemensMosaic0008_0008) and (lPhaseEncodingSteps > 0) and (lPhaseEncodingSteps < lDicomdata.XYZdim[2]) and ((lDicomdata.XYZdim[2] mod lPhaseEncodingSteps) = 0) and ((lDicomdata.XYZdim[2] mod (lDicomdata.XYZdim[2] div lPhaseEncodingSteps)) = 0) then begin //1499c kludge for detecting new Siemens mosaics: WARNING may cause false positives - Siemens fault not mine! lDicomData.SiemensMosaicY :=lDicomdata.XYZdim[2] div lPhaseEncodingSteps; lDicomData.SiemensMosaicX := lDicomData.SiemensMosaicY; //We also need to assume as many mosaic rows as columns, as Siemens does not save the phase encoding lines in the header... end; // fx(lnSlicePerVol,lnVol, lDicomData.SlicesPer3DVol,lDicomdata.XYZdim[3] ); //fx(lnVol,lnSlicePerVol,lDicomData.SlicesPer3DVol,lDicomdata.XYZdim[3]); //fx(lnSlicePerVol,lDicomData.ManufacturerID,kPhilipsID ); if (lnSlicePerVol > 0) and (lDicomData.ManufacturerID = kPhilipsID) {and (lnVol > 1)} and (lDicomdata.XYZdim[3] > 1) and (lDicomData.SlicesPer3DVol > 0)and ((lDicomdata.XYZdim[3] mod lDicomData.SlicesPer3DVol) = 0) then begin lDICOMdata.File4D := true; lnVol := lDicomdata.XYZdim[3] div lDicomData.SlicesPer3DVol; end; if lManufacturerIsBruker then lDicomData.AcquNum := 1; //Bruker varies this for every image if (lEchoNum > 0) and (lEchoNum < 16) then begin lDicomData.AcquNum := lDicomData.AcquNum + (1000*lEchoNum); end; if lVerboseRead then begin Msg ('DICOM data'); Msg ('Image Series/Number/Xpos/YPos/ZPos:'+kTab+inttostr(lDicomData.AcquNum)+kTab+inttostr(lDicomData.ImageNum)+kTab+floattostr(lDicomData.PatientPosX)+kTab+floattostr(lDicomData.PatientPosY)+kTab+floattostr(lDicomData.PatientPosZ)); Msg ('BPP: '+inttostr(lDicomData.Allocbits_per_pixel)); Msg ('XYZ dim:' +inttostr(lDicomData.XYZdim[1])+'/'+inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) ); Msg ('XYZ mm:'+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2) ); Msg ('DTI bvalue:'+ inttostr(lDICOMdata.DTI[1].bval)); Msg ('DTI bvec:'+floattostrf(lDicomData.DTI[1].v1,ffFixed,8,2)+'/'+floattostrf(lDicomData.DTI[1].v2,ffFixed,8,2)+'/'+floattostrf(lDicomData.DTI[1].v3,ffFixed,8,2) ); end; //msg('abba'+inttostr(lDICOMdata.CompressOffset)+' '+inttostr(lDICOMdata.CompressSz)); 666: //if not lHdrOk then Msg('zx'+lFilename); if lDiskCacheSz > 0 then freemem(lDiskCacheRA); if not lHdrOK then lImageFormatOK := false; CloseFile(fp); FileMode := 2; //set to read/write //if kUseDateTimeForID then lDicomData.DateTime := StudyDateTime(lDicomData.StudyDate,lDicomData.StudyTime); if (lDicomData.SiemensMosaicX > 1) then lDicomData.AcquNum := 1; end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dicom.pas0000664000175000017500000000235211326434462021004 0ustar michaelmichaelunit dicom; {$H+} interface {$DEFINE COMPAT} uses dialogsx,prefs,dicomtypes {$IFDEF COMPAT} ,dicomcompat{,dicomfast}; {$ELSE} ,dicomfast; {$ENDIF} procedure read_dicom_data(lReadJPEGtables,lVerboseRead,lAutoDECAT7,lReadECAToffsetTables,lAutodetectInterfile,lAutoDetectGenesis,lReadColorTables: boolean; var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string; var lPrefs: TPrefs); implementation procedure read_dicom_data(lReadJPEGtables,lVerboseRead,lAutoDECAT7,lReadECAToffsetTables,lAutodetectInterfile,lAutoDetectGenesis,lReadColorTables: boolean; var lDICOMdata: DICOMdata; var lHdrOK, lImageFormatOK: boolean; var lDynStr: string;var lFileName: string; var lPrefs: TPrefs); begin lDICOMdata.Filename := lFilename; lHdrOK := true; lImageFormatOK:=true; {$IFDEF COMPAT} //if not fast_read_dicom_data(lDICOMdata,128, lFileName) then read_dicom_data_compat(lReadJPEGtables,lVerboseRead,lAutoDECAT7,lReadECAToffsetTables,lAutodetectInterfile,lAutoDetectGenesis,lReadColorTables, lDICOMdata, lHdrOK, lImageFormatOK, lDynStr, lFileName,lPrefs); {$ELSE} lHdrOK := fast_read_dicom_data(lDICOMdata,128, lFileName); {$ENDIF} end; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.res0000664000175000017500000004252011660466164021757 0ustar michaelmichael џџџџ>0џџMAINICON00 Ј%  Ј ˆ  hЈ% џџџџ(0` €%ŠŠŠЈЈЈЙЙЙџџџŽŽŽ‘‘‘’‘‘’’’~~€zz{{{{|||~~€€€€€€ƒƒƒƒƒƒ………†††jjjƒƒƒ­­­ВВВ‘‘’‚‚‚‹Š“™˜ЎБœšЪЁŸЮЃ бЂŸа™—У‡†Іvuƒmmnrrqrrrttt}}}lllxxx888€€€“““ЇЇЇkkk zzz———жІІІиЃЃЃиЃЃЃйЂЂЂйЃЃЃйЂЂЂйЂЂЂиІІІл›››Тsss9rrp!pqm#„‚#œ›Д"•“МœšЬЂŸгЄЂжЄЁе›™Ч„ƒІggtPPKSTG]]Ybbbiiibbb___‚‚‚‰‰‰œœœ‰‰‰ЗЗЗЏЏЏHšššвšššџЈЈЈџАААџЎЎЎџЏЏЏџЏЏЏџЎЎЎџЎЎЎџЎЎЎџБББџЏЏЏџ››œ§ГВЗѕЎЎАіЄЄ і””…і‚ƒlёwyY№rtP№stP№xzZ№ƒ„l№’“ƒ№ЁЁž№ЋЋЏ№­­В№ЈЈЉ№ЅЅЃ№ЅЅЅьЇЇЇё“““ХХХЎЎЎ———’’’‰‰‰ŠŠŠŸџЉЉЉџ———њЊЊЊ§ЋЋЋ§ЊЊЊ§ЋЋЋ§ЋЋЋ§ЋЋЋ§ЋЋЋ§ЊЊЊ§ЋЋЋ§ЋЋЌќšš“џŒŽrџlo;џ`dџ_eџekџkqџnuџmtџkqџgmџekџhmџuy=џŽrџЇЇЄџДДЛџААВџЏАЏџЅЅЅя```€€€ЄЄЄЋЋЋ•••ЭЈЈЈџЇЇЇћЄЄЄќ˜˜˜џ­­­ўЋЋЋўЋЋЋџЌЌЌџЌЌЌџЌЌЌџЌЌЌџЋЋЋўЋЋЉўААЖџhj7ўX^§u|§ˆ§‘›§•ž§•ž§•Ÿ§•ž§•Ÿ§•ž§’›§Œ•§Š§t|§qw§„‡S§ЅЅЁ§ВВИњЌЌЊџ††…p­­­ЉЉЉЊЊЋppplll"ЂЂЂјІІІќІІІ§ЁЁЁџšššўЎЎЎџЊЊЊџЌЌЌџЋЋЋџЋЋЋџЋЋЋџЋЋЋџЋЋЋџЋЋЈџЌЌЖџ…Š4џ’œџ•џ‘šџ˜џ˜џ˜џŽ—џ—џ—џ˜џ˜џ™џ’œџ”žџšџ‚‹џxџ‘kћБАИўЃЃЃгЩЪЦЉЊЅОЙцƒƒƒJЃЃЃўЅЅЅ§ІІІўžžžўœœœџЏЏЏџЋЋЋџЌЌЌџЎЎЎџЏЏЏџЏЏЏџЎЎЎџЌЌЌџЋЌЉџЌЋЗџŒ‘;џŽ—џŽ—џ˜џ˜џ˜џ™џ‘™џ‘šџ‘šџ™џ˜џ˜џŽ—џŽ—џ—џ’›џ‘šўŠўƒ†>ќЅЅЉџ}}„I˜”Є•”ƒ‚‰sЅЅЅўЅЅЅћЇЇЇџџ   џЎЎЎџЎЎЎџВВВџГГГџГГГџГГГџГГГџВВВџЏЏ­џЎЎЙџŒ‘Aџ™џ™џ™џ‘šџ™џŒ•џ‰“џ‰“џŠ”џ—џ‘›џ“œџ’›џ‘›џ‘›џ‘šџ™џ”žџ‹•ћƒ‰!ў’’‰В“І›ЋЏ‚‰‰‰ЏЏЏ“““šІІІџЄЄЄњЇЇЇў›››џЂЂЂџВВВџГГГџГГГџГГГџГГГџГГГџГГГџГГГџГГБџЕЕПџ‹Gџ‡‘џŒ•џŒ–џ‰‘џŒ“&џ—›PџžЁiџž lџšeџ”JџƒŠџ‰џˆџ„‹џƒ‰џƒ‰џ‚‰!џˆ&ў…Š,ў‚‡)§nqFљ:F?(dfZllfƒƒƒœœœƒƒƒЗЗЗВВВёёё›››ИІІІџЅЅЅћЊЊЊџœœœџЈЈЈџЖЖЖџВВВџГГГџДДДџГГГџГГГџГГГџГГГџВВВџЖЖИџƒџ…‡jџˆŠdџ„Tџ‚„rџ™˜ џš™ЄџŸžЈџЅЅЎџœІџ—–Ёџ‰‰џyyvџŽŽ’џ””™џ””šџ––žџ——Ÿџ˜˜Ёў˜˜Ђџ—–Ђќ™™ў‡…‡в’‘•ЅІЅzzzЃЃЃдддЫЫЫkkkњњњаЈЈЈџЋЋЋќАААџ   џЊЊЊџЕЕЕџВВВџДДДџГГГџДДДџДДДџГГГџДДГџВВГџЕЕЕџ––˜џ˜˜џššЁџœЅџ——›џ„„ƒџ|џ††„џˆˆ†џ††„џ‡‡…џ}џ——˜џ™™™џ••”џ’’џŽџ‹‹‰џ‡‡…џƒƒ‚ўŽŽŒџŽŽŽќџzzzУv‹‹‹{ˆˆˆ}wwwNЎЎЎФФФ``` (тЋЋЋџ­­­§ЏЏЏџ   џЉЉЉџЕЕЕџГГГџГГГџДДДџДДДџДДДџДДДџГГДџГГВџЖЖЗџ–––џ””’џ›œšџŠŠ‡џttsџ‚‚‚џŒŒŒџџџ’’’џ•••џ‡‡‡џџyyyџzzzџzzzџzzzџ~~~џwwwџ„„„џЎЎЎўЊЊЊџЊЊЊќ­­­џЌЌЌџЋЋЋџЌЌЌџ™™™рАААГГГeeeqqqTЂЂЂь­­­џЌЌЌўАААџЁЁЁџЈЈЈџЖЖЖџГГГџДДДџДДДџДДДџДДДџДДДџДДДџВВВџЗЗЗџ˜˜˜џ‘‘‘џ˜˜˜џƒƒƒџ•••џšššџ™™™ў›››џšššўšššў›››ўˆˆˆўzzzџ†††ў†††џ†††џ‡‡‡џ€€€џ€€€џЅЅЄџЋЌЊџЋЋЉўЋЋЊџЋЋЊ§ЋЋЊћЋЋЊљЌЌЋїЊЊЊћxxxЇTTTЋЋЋ}}}ЉЉЉђ­­­џ­­­§АААџЂЂЂџЇЇЇџЖЖЖџГГГџДДДџДДДџДДДџДДДџДДДџДДДџВВВџЗЗЗџšššў‘‘‘џ›››§ћšššћšššћ˜˜˜њ˜˜˜њ–––њ•••њ•••ћ}}}ќrrrў|||џxxxўyyyџsssџ‚‚џЋЋЌџББЕџЎ­БџЏЏГџЏЏГџЏЎДџАЏГџААВџЎЎЎџААЏџЏЏЏџ‘‘‘О•••‚‚‚ЋЋЋіЎЎЎџ­­­ўАААџЂЂЂџЇЇЇџЖЖЖџГГГџДДДџДДДџДДДџДДДџДДДџДДДџГГГџЕЕЕўЅЅЅџКККўЧЧЧџ†††џxxxџ€€€џ}}}џ|||џzzzџzzzџ{{{џxxxџtttўuuuўwwwџ{{{џuuuџ˜˜™џ  œџ—™†џš›ˆџ™š†џ™š†џ™›„ў•–‚џ’’Œш–•™д––™жŸŸŸвžžžу___ZŠŠŠГЋЋЋљ­­­џЌЌЌўЏЏЏџЂЂЂџЇЇЇџЕЕЕџВВГџГГДџГГГџГГГџГГГџГГГџГГГџВВВџЖЖЖџЄЄЄ§НННўЄЄЄэ‘‘‘ДЉnnn›oooŽnnnjjjtlllgwwwUiii†ЄЄЄџЌЌЌќЎЎЎўБББўДДГџЙЙКџЇЇЂџ€ˆ џ‰’џ‡џˆџŠ“њ‰џciflnurrrŒŒŒЗЋЋЋњЎЎЎџЏЏЏўБББџЁЁЁџЈЈЈџЕЕГџВВАџГГБџГГБџГГБџГГБџГГБџГГВџГГГџЖЖЖўІІІћЕЕЕџŠŠŠ^ЌЌЌІІІˆˆˆ†††wwwuuuЮЮЮллл­­­ШХХХўТТТќТТТџСССџССРџППЩџŽ”1џšџ‘™џ‘šџ™ќ‘›џŽ—ЪŸЈИ48DDD^^^ŒŒŒЗЌЌЌњЌЌЌџ   ўЊЊЊџžžžџЋЋЌџИЗСџЕДПџЖЕСџЕЕРџЖЕРџЕЕРџЕДРџДДЙџАБАџААБ§ЅЅЅџЏЏЏчjjjkkk“““€€€zzzuuuyyyВВВЕЕЕ•••nМММџПППћПППўПППџООМџТСЬџ”—Rџ‹•џ˜џŽ—џ˜§Ž—џ“›тVkY Ј­EЂЈ*ŠŠŠГ­­­љЇЇЇџ”””ўŸŸŸџ’’“џšš•џ’•Xџ“Pџ“Oџ“MџŽ“Kџ“KџŒ‘Dџ“pџЈЈ­џЃЃЂќВВВўЌЌЌШѕѕѕeeevvvŸŸŸŽŽŽ‰‰‰IЛЛЛџРРР§ППП§ПППџППНџУТЬџ–š]џ‹”џ˜џ˜џ™ќŽ—џ’›шЁЈšЄЂЇ*ƒƒƒœ­­­іЇЇЇџŸŸŸ§ВВБџЎЎАџЋЋ џ˜џŒ–џ—џ—џŒ–џŽ—џŠ”џ‘–GџУУЮџРСОќФФФџЋЋЋЮџџџŒŒŒžžžŒŒŒNЛЛЛўРРР§ППП§РРРџООМџТТЬџ•™WџŒ•џ™џŽ—џ™§˜џ’›чБИ)ІЂЋ*{{{yЌЌЌёЉЉЉџ›››ўЏЏЎџЌЌ­џЌ­Љџ“›џ˜џ™џ™џ™џ˜џŽ˜џ’3џННЦџООН§СССўГГГ№EEE```zzzЭЭЭƒƒƒzzzФФФЩЩЩšššПППџПППћПППўПППџППНџПОЩџ”;џŽ˜џ˜џ˜џ˜ќŽ—џ‘šр'>ЂЊ:ЂЊ*^^^JЇЇЇыЊЊЊџ›››§ЏЏЏџ­­ЋџЎЎГџ˜ž.џ—џ™џ™џ™џŽ—џšџ‡ џГГБџТТТўРРПњОООџ–––~ИИИЗЗЗСССZZZ```žžžyyyНННППП ­­­оСССўПППќРРРџОООџСССџЕЕЗџˆџ™џŽ—џ™ўŽ—ћ‘šў›ЃФŽ™ žЇ ЂЋ*ЄЄЄмЌЌЌџššš§ЏЏЏџ­­ЉџЏЎИџЂЇZџ˜џ˜џ˜џ™џ˜џ™џ‰“џœŸuџУТЪўИИЕ§ЙЙЙќБББѕBЏЏЏЏЏЏ‹‹‹ЅЅЅЛЛЛ­­­ŒŒŒЂЕЕЕџДДДћЖЖЖџЛЛЛўООМџФФЫџŸЁџˆ’џ™џ˜џ™ў–њ›ЄўЈЏ4–ЏЕ7ЈА-ЂЂЂУЎЎЎџšššќЎЎЎџЌЌЋџЎ­ЕџЋ­Šџ–Ÿ џŽ—џ™џ™џ™џ˜џ™џ‡Žџ­ЌБўДДГџБББ§ЕЕЕўЊЊЊђЄЄЄlООО ###žžžЉЉЉ.   ЏЗЗЗџГГГќГГГўГГГўБББџККИџИИРџ‰#џ™џ˜џ™ў˜џ—ћЂЊ(џЂЊ-SІ­2ЃЋ)ЦЦЦ™™™ЁЎЎЎўšššњЌЌЌў­­­џ­ЌЎџЎ­ЌџЂЉ8џ™џ˜џ˜џ˜џŽ—џ™џ‹”џ‰NџЕДПўДДБџБББ§ЖЖЖџАААџЏЏЏрІІІЎ———ЁœœœУЌЌЌљЖЖЖџГГГќГГГџГГГџВВГўГГЏџЕДСџŽ’TџŒ•џ™џ˜џ˜џŽ—ќ” §ЅЌ.цНТLЅ­% Ї%ЁЁЁ“““vЎЎЎў›››ћЊЊЊџЎЎЎџЌ­Ћџ­­ЖџЋЎxџ™ЂџŽ–џ™џ˜џ˜џŽ—џ‘šџ‡џŽ‘cџЕДРўЕЕДџВВАўГГГ§ДДДџЕЕЕџЗЗЗџЗЗЗџЕЕЕџВВВќГГДџГГГўВВАўЕЕГџЖЕСџ‘”hџˆ‘џ‘šџ˜џ™ў™ў–ћ›ЃџЈЏ7†ДЛDЇЏ+ŸЇ#”””………HЌЌЌџ§ЇЇЇўЏЏЏџ­­Ќџ­ЌЎџ­­ЊџЇ­Bџ’›џŽ—џ™џ™џ˜џŽ—џ‘šџ‰‘џŒRџЌЌВўИЗОўЕЕДўГГАќВВАћВВБћВВБћВВБ§ГГБўГГАўЕЕГўЗЗНџ­­Еџ‘Xџˆ‘џ‘šџ˜џ™џ™џŽ—ќ’›ўІЎ&цЈА0ЄЌ- Ї. Ј#]]]RRRЉЉЉђЂЂЂџЁЁЁ§ЏЏЏў­­­џ­­Ћџ­­Гџ­ЎŽџЁЉ$џ˜џ˜џ™џ™џ™џ˜џ‘šџŒ•џ†Œ џ˜šzџЌЋАџЕДПџИЗПџИЗМџЗЗЛџИЗМџИЗОџЖЕПџ­ЌВџ˜›џ†Œ%џ‹•џ‘šџ˜џ™џ™џ˜ўŽ—ћ˜ џŒ’6f•$—ž%ЁЈ,хххљљљЂЂЂЬЇЇЇўќАААџЌЌЌџ­Ў­џЌ­ЋџЎ­ЕџЋЏsџІџŽ—џ˜џ™џ˜џ™џ˜џ™џ™џˆ’џ†џŽ’Nџ—™uџŸŠџ  ‘џŸ‹џ—™wџŽ’Rџ†џˆ‘џ™џ™џ˜џ™џ˜џ˜ў˜§“џ˜FьЏЎMnkЃhЅЌ-ЛЛЛСССššš”ЋЋЋў™™™њЎЎЎў­­­џЎЎЎџ­­­џ­­­џ­­ВџЊЎhџœЄџŽ—џ˜џ™џ™џ™џ˜џ˜џ‘šџ‘šџ–џ‰’џ‡џ†џ†џˆ‘џŒ–џšџ‘šџ˜џ˜џ™џ˜ў™ў˜џ—љЁЇJќЁЁЇЊшчИедхty%——— ‡‡‡SЏЏЏџŸŸŸћ­­­ў­­­ў­­­ўЎЎЎџ­­­џ­­­џ­­ВџЊЎmџЅџ™џŽ—џ™џ™џ˜џ™џ˜џ˜џ™џ‘šџ‘šџ‘›џ‘šџ‘šџ™џ˜џ˜џ™џ™ў™ў™џŽ—ў—ћІЋMљКЙМџŒŒŽVš™ЏŸŸžsx‡‡‡yyyrrrЎЎЎїЋЋЋџЌЌЌјГГГњ­­­ћ­­­ќ­­­§Ќ­Ќ§Ќ­Ќў­­ДўЋ­‚ўЁЈ,џ“œўŽ—џ˜џ™џ™џ™џ™џ™џ˜џ˜џ˜џ˜џ˜џ™ў™ў™ў™ў˜§˜њŽ˜ћ” џЉ­gџЕДЛџЌЌ­Ь’“„„~‰‰‰ЗЗЗœœœ„„„QЁЁЁзЃЃЃџЙЙЙџЖЖЖџЖЖЖџДДДџВВВџАААџЎЏ­§ЎЎЖћЌ­ЁћЅЊWћ™Ђћ‘šћŽ—ќŽ—§Ž—§˜§˜ў˜ў™ў™ў˜ў˜ў˜§˜ћ˜ћ™ў‘šџ” џšЁ4џЅЇŽцГВТЁбббJХХТъъы­­ЎŒŒŒTTTПППxxxaaaжжж ‚‚‚k˜ЃЃЃАІІІЩЊЊЊс­­­№АААќАААџААЎџВВДџДДКџГДžџЊЏcџŸЇ-џ˜Ёџ”џ’›џ‘šџ™џ˜џ˜џ™џ‘šџ˜џ“œџ• џ“›џ‘—"р‹ŽW „‚œTŽКЉЈЗЛЛКнннЇЇЇˆˆˆЕЕЕ|||rrrЗЗЗŽŽŽРРРXXXlll-ŽŽŽBŽŽ[™™˜t˜˜–‹žžІЃЃЂЏИЅІœШЁЃtй›ŸKц–/ђ–!љ—Ÿќ™ЁџšЁџ˜ §—ŸђЄЋз˜Ÿ"Џ–(w~ƒ.: џ џџџџКСПбџџџммкццц   ŽŽŽxxxааа‡‡‡БББџџџ??? nnn“““ЃЃЃЕЕЕииь&џaUџb`ˆopS'x|40‰Ž79‹:<~„-0y|8ю№ЕРІ­‚ˆ)]Z„џh[аХУеђђїЊЊЊwwwšššІІІДГДџџџИЙКџџџџџц5#џH2џ_ZЋqrV„8Œ‘<”?…‹0}€9ѓѕЉГІЎ„‹#•,{)w{3{7‡$§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќџџџјџрџРџРџРџ€џ€џ€џ€€јјќќј€ј€№€р€?€?РРРџРџРџрџрџјџџјџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЈ џџџџ( @ €vvv{{{ZZZ”””’’’’’’’’’nnnfffЛЛЛ[[[{{{aaaŒŒŒ‹‹‹cccaa`lko“”yy|Ooq<uxE‹jЅІ™­­­ЋЋЋЌЌЌЎЎЎ•••ЄЄЄІІІŠŠŠЁЁЁSSSoooWWW ……….‰‰‰,‡‡‡-‡‡‡-‡‡‡,†††,\\YYYOnnj‰‰yqrPfh;kmE‚‚kІІЉУСзСРаДДЖДДГ———žžžŸŸŸ‡‡‡O’’’жЇЇЇўЊЊЊўЉЉЉџЊЊЊџЊЊЊ§ЌЌЌџ››ХЄЄЋ™ŸžЃœŽ‰™yyj’ss]“wxd“……|“˜˜“ІІГ“ЈЇА’ЁЁ žžœ“‹‹‹&™™™–––‘‘‘ЃЃЃЄЄЄЄџŸŸŸџЌЌЌўЋЋЋџЌЌЌџЌЌЌџЋЋЊџЏЏАџ››”џ~Yџrv*џsxџu| џv}џv| џv{џy~%џƒ†Kџ˜™„џЌЌАџББЖџœœПППЛЛЛ——œŸŸŸ———ŠЄЄЄџЃЃЃћžžž§­­­ўЊЊЊўЋЋЋўЋЋЋўЊЉЇўБАИў‰Œ_ќu}ћ–ћ’œћ”ћ”žћ”žћ“œћ™ћˆ‘ћ‡ћ‡%љ‰ћЌЋЗё  ž’‘™—–ЉЩЩЩЕЇЇЇќЁЁЁћ   џ­­­ў­­­џАААџАААџ­­ЊџЎЎИџšiџ‘›џ‘šџ™џŽ—џŒ–џ–џ˜џ‘›џ“œџ”џšў…Žћ’–Xџ––œrЃЄžІЇ—ttrєєє   еІІІџ   §ЃЃЃџВВВџВВВџГГГџГГГџВВАџЕДНџšœpџ‡‘џŒ–џ‹”џ’™(џ—œ<џ•›;џŽ”"џ‡џˆ џˆџˆџŒ“ќ…ў}Qзbg;lpAvvtEEE777]]].ЂЂЂшЉЉЉџЃЃЃўЈЈЈџЕЕЕџВВВџГГГџГГГџВВВџЗЗИџžž—џ‰‹lџŒŽeџŽ}џ“’˜џ››Єџš™ЃџŒŒџƒƒ{џ““Žџ“”’џ’’’ў’‘•ў”ќŽŽŒџut~•{zˆ ŠŠ‰ '''LLLџџџ………`ЄЄЄєЏЏЏџЇЇЇ§ЊЊЊџДДДџВВВџДДДџГГГџГГГџЖЖЖџЂЂЃџ˜˜žџ––žџ‚…ў„„‚ў‰‰†ўŠўŠŠ‰ўˆˆŠўˆˆ‰џ„„„ў……„џzzyџŽўЃЃЃ§  џЄЅЂрІІІс””” ХХХ­­­‘ЉЉЉљЏЏЏџЇЇЇўЉЉЉџЕЕЕџГГГџГГГџДДДџВВВџЖЖЖўЃЃЂџўŒŒ‰ћ““’ћœœœћ›››ћŸŸŸќ——–§yyx§~џ€ў}}|џ‹‹‹ўЎ­АџБАДўАЏГќЏЏГџАЏБџЋЋЌџ——™|ššš–––КЌЌЌћЎЎЎџЇЇЇџЈЈЈџЖЖЖџВВГџГГГџГГГџВВВџЕЕЕџЈЈЈџБББџšššџ………џ‡‡‡џ„„„џ{{{џvvvџrrrџwwwџwwwџ~~ўЃЃ џЁЂ”ўŸ “ў Ё’ў§›››хсšš—ь~~~lšššЯ­­­ќАААџЉЉЉўЉЉЈџЖЖДџГГБџДДВџДДВџГГВџЕЕЕўЌЌЌўИИИћ‰‰‰Žmmms|||giiiZЖЖЖKЖЖЖBЁЁЁдВВВџГГВћККМџЌ­Ѓџ… џŠ“ў‹”ќƒ‹ўou Ylr rxlll›››вЌЌЌ§ЈЈЈџЂЂЂџЈЈЊџЕДОџВВЛџГГМџГВЛџВБИџББАњЊЊЊўЈЈЈМлллппп555qqqЗЗЗКККЄЄЄcРРРџТТСњТТРўОНФџ—"џ™џ˜њ‘šџ”y“œ’œppp›››ЫЊЊЊќ›џЁЁЅўœ‡џ–7џ–6џ–4џ•1џ‘•PџЎЎВљГГВўЊЊЊФФФУУУššš~~~››››››———;КККўПППќППН§ООЦџ‘—/џ—ў—ћ˜џ’œˆ‘š‘š˜˜˜ЌЉЉЉћЃЃ џВВЙџЈЉŠџ—џŽ˜џŽ—џŽ˜џŽ–џННТњУУТџЎЎ­БшшшгггНННŠŠŠВВВВВВŸŸŸVОООџПППњРРПўМЛСџŽ•џ˜џ˜њ˜ў’›™™yЉЉЉјЁЁЁџЎЎБўЋЋ џ’› џŽ—џ˜џšџŠ“џЏА §УУЦќЖЖЕі’’’.ІІІЙЙЙxxxбббФФФЋЋЋУМММўННМћУУХџАБЄџ‰’џ™ўŽ—ћ” џЄЋ%_ЁЈ$ŸІmmm=ЈЈЈьЂЂЂџ­­Ќ§ЏЎДџžЄ:џ—џ™џ˜џ–џ•šMџЗЖТќГГЎџЊЊЊрДДДGДДДНННЋЋЋ#›››ЈГГГџВВВќГГЎџОНЩў—œOџŒ•ў™ўŽ—ўЅјЃЈD%БИHЅ­,ссс ЇЇЇиЂЂЂџЌЌЊ§Ў­ЖџЊЌ{џ’œџŽ—џ˜џ™џˆ‘ў›~џЗЗС§ЕЕБџ­­ЋџЄЄЄеЗЗЖЩЏЏЏѓЕЕЕџВВАќГГЏџЗЖТўŸ}џŠ“џ™џŽ—ћ‘šўЃЋ*П|‚ ЂЊ(šЅнннЅЅЅЕЃЃЃўЋЋЊќ­­ЎўЎЎЎџЂЈ8џŽ—џ˜џ˜џ™ў‰’ўšœsџГВН§ИИП§ИИЙџГГВџЖЖЕџЕЕЕћЖЖМџГГНўšuўŠ“џ™ў˜ўŽ—ќ™Ё§ЃЊ7EЏЖ8ЃЊ(ЂЋЌЌЌЂЂЂ„ЃЃЃўЈЈЈћЎЎ­џ­­Гџ­Ў’џ›Ѓџ–џ™џ˜џ™џ‹”ўŽ”7ўŸЁ€ўЊЊІќЏЏГћЏЎВ§ЊЊЇўŸ ў”9ў‹”џ™џ˜џ˜ћšў–(Ж”ІЎ Ј%ЄЌ%œœœ–––IЅЅЅўЄЄЄќЎЎЏў­­Ћў­­ЕўЋЏ€џ˜Ё џ–џ˜џ™џ‘šџŽ˜џŠ“џŠ’ џ‹’џ‹’џŠ‘ џŠ“џŽ˜ў™ў˜ў˜§Œ–јžЄ@џ››Ђ\ЉЊžІЈ„ЃЋ0ššš’’’ЉЉЉєЊЊЊџАААћЌЌЌћЌЌЋћ­ЌЗћЋЎ„ћšЂќ—§Ž—ў˜ў™ў‘šўšџ™ў™ўšў‘šў˜ќ˜ћ˜ў™џЄЉKџВВГђ†…‘ŽЇžœФСССКККЅЅЅgžžžьВВВџГГГџБББџББЏџАЏЗџЏЏŸџЄЉNџ–ž џ™џ˜ў˜ќŽ˜ќŽ—ќŽ—ќŽ˜§˜џ™џ’›џ“›џžЂdйЌЊМŽЇЇВ0… ЁŽ ŸЕ{{{———jjj–––L˜˜˜fЈЈЈЂЂЂЊЊЈЗЊЊЏЭЎ­ЖрЊЌ№ЁІTњ˜Ÿ(џ”œџ“œ џ” џ”œ џ• џ•ё˜Щ‡(ˆy{Y@ljv­ЊЫфуч›œ˜™™™‚‚‚ІІІkkkІІІДДДВВВћќќЪЪЧwrМ”в%••–3‰OCŒ’.P•œ-Y’˜+T•›-<ˆŒ:ruDy|(JUŠЉЕБзззмїї§ЉЉЉ–––ЅЅЅgggЇЇЇИИИЙЙЙџџџШШЧ‡ƒзœ˜е—–’•›E”š+Є*™ )›Ђ.–œ5sv@x{+€ˆtx-СПгккн‘“ƒ‚†•œ5šЁ" Ј"œЄ ™ #Š&џџџџџџџџџџџџџџџџџџџџ№џР€€?€?€`р№рр€Р€€€РР?Рјџџў?џџџџџџџџџџџџџџџџџˆ џџџџ(0 ` ЇЇЇЅЅЅБББГГГГГГЕЕЕСССЗЗЗccc›››‘‘‘   ЁЁЁЁЁЁЃЃЃ‘‘‘ЄЄ­ЦФсџ………{{{LLLИИИŽŽŽЃЃЃ‚‚‚{{{$™™™HšššE™™™E›››HŠ‹Š&ЂЂЊиеџ,V`ккиюющЌЌЌšššЂЂЂ –––~œœœіЋЋЋџЋЋЋџЊЊЊџ­­­џЃЃЄї——з‡‰hиtx;дqu.гuy<г‚…]г—˜ŽгЉЉГбЊЉЎг““’1˜˜—ЈЈЈœ‘ЦЦЦЋЄЄЄџЂЂЂўЌЌЌќЊЊЊ§ЊЊЈ§ЏЏДќ—˜ƒџszџ‚Šџ‰’џ‹”џ‰’џ…џƒŠџ‹AџЃЃ–џІЅЏŸФФШЛЛЛ‘’x“““ЬЬЬ ЃЃЃтЃЃЃќЂЂЂќЎЎЎџАААўЏЏЎўБАЙџž zў™§“§™§™§š§“œ§‘›§‹–ћ‡§’–ZѓЌЉеЇІЩ–˜ƒ“““wwwCЄЄЄяЃЃЃўЇЇЇ§ДДДўГГГџГГВџЗЖЛџЃЄ’џ†Œ%џŠ(џ’–Yџœžvџ“–eџ„ˆ<џŒFџŽ’Oў”Mќ‡ŠPџtti‹yzhƒgЁЁЁ‘‘‘ЈЈЈјЉЉЉџЋЋЋўЕЕЕџВВВџВВВџЖЖЕўЇЇЉџ“’›ўŒ•ќ‡†’ќ™ќšћˆ‡“§Œ˜џ‹‹–ў‚Žў••›ўœџššœБššŸЄ‡‡…———ГЌЌЌќЊЊЊџЊЊЊўДДДџВВГџВВВџЕЕЖџЉЉЉџ••”џ‹‹Šџ••“џ””“џŽџzzxџvvtџttrџŠŠ‰џЏЎКџЏЏЛўЏЎИџЏЏЕџЂЁЉеЁЁЉ,žžžжЎЎЎ§ЋЋЋџЊЊЊџЕЕГџГГБџГГВџЕЕДўЏЏЏџВВВ§•••зzzzЬƒƒƒС———Б‡‡‡ш‘‘џ––™§ЄЅšџ’—Lў”™IўŽ’Jњ_‡ZƒwzMNЁЁЁпЋЋЋўЄЄЄџЉЈЋўДГЛџББЙџВБИџББГћ­­ЌџЈЈЈЃОООЊЊЊРРРЛЛЛЊЊЊ]ТТТџЦЦШќЙЙЕў‹”ў—§Œ–ўˆ.ˆ‘‹”ЃЃЃжЄЄЃ§ЃЂЉџž }џ–)џ‘—*џ”$џ Ђ|ћИЗОўЊЊЇnЗЗЗОООРРРЄЄЄ.МММўПРПўММП§˜џ˜ќ™ў”Q’œ“ŸŸŸАЅЅЃќ­ЌЕџЇЊў–џ˜џ‹•џžЂVћЦХвџББЌБЯЯЯЬЬЬТТТМММЇЇЇnНННџУТХћЖЖАўŒ•ў˜§‘šџ Ї>šЂ˜ЁšššrЄЄЄїЉЉЋџЎЎІў”œџŽ—џ™џŽ•ўГВЖќЖЖИџ›|ŸŸŸ ЈЈЈЊЊЊOААЏ№ГДА§ПОЮ§ЁЄjџ‹•§Ž—ўšЃё™ EВИNЋГ0”””+ЄЄЄъЈЈІџАЏЙ§ЃЈQџ—џ™џ–џ‘–CўГВПўЗЗНџЏЏЎшЎЏ­оААЏџЕЕЖџЗЖХўЃЄџ‹”џ˜ћ‘šџЁЈ&І‰“˜ ЋВ/гггЃЃЃЭІІЅўЎЎВќЎЏЂўšЂџŒ–џ‘™ўŒ–џ•1ўІЇ”§ВВИџДДОџГГНў­­Ќў›žiџ‹“ў™ў—ќ“œіЄ­.%ЂЉ)ЃЋ%ІЎ%ЎЎЎЁЁЁžЅЅЅў­­Ћј­ЌДќЌЎ‰§–Ÿ §Œ–ў™ў˜ў‹”ў– §’˜7ќ‘–0ўŒ”ўŒ•ў™ќŒ–љ“œџŸЂcКБЛKЋБ\ЄЌ)ЎЎЎЇЇЇPЈЈЈџАААџЎЏ­џЏЏЗџЌЎџšЂ$џŽ˜ўŽ—§™ќ˜ћŽ—ћŽ˜ћ™ў™џ™џ”œџЊЌ‡я­ЋФOВАФМНМЃЊ(ЛЛЛЃЃЃ‡‡‡TЇЇЇЃЎЎЎНЊЊЈеЎЎЖщ­­ЉјІЊfџ™ (џ“› џ‘šџ’›џ’šџ’›џ— щŽ•(Џ“–rb—˜‘ЅЅЋ”•ŠММКОООМММЉЉЉКККддеy|H ŠЊІч.ЁЁЄA˜œNS—&b–"k’™#_“$9‚‡(E>’ЖЕПЛ­џЊЉЗ ŸЅНОИЬЬЬuuuДДДЯЯЯBBCŽ‰˜ЌЉеІЇ›› B™ЁšЂ—Ÿ•œ#‚†)][^}„dpУУЧЗЗЙДДГМЛФЎАŠЁЉ'˜ ›Ѓ›ЄŸЇџџџџџџџџџџџџР?€€€<><€€€€Р?џУџџџџџџџџџџh џџџџ(  @ДДДзззААА БББ ЊЊЊЭЭЮЕЖА”•ЇЈЅЉЉЊŸŸŸ˜˜˜ЁЁЁЌЌЌ–––ЇЇЈЇЇІЉЉЎПНфœšЕhf~ŠПЖВџžžžŠŠŠŠŠˆ“““ЄЄЄЈЈЈ“““FЄЄЄdЄЄЃdЁЁЄTДГЫ)ŸА'jh~%‡„А%ЋЇщ&ŸŸЌ"~~w‚„h“^˜˜˜   ЅЂЂЂџЋЋЋџЌЌЎџЃЃџ‡‹BўƒŠ§€† ќ„Š ќ“NњЃЄ˜ј ŸІ8ЇЅК­­Ж˜˜˜\ЂЂЂўІІІќААЏњВБЗњЄЅ‘ћˆ’ў‘šў“›џŽ—џŠ”њ”џ’f ™ŸI•›GћћћЁІІІњЌЌЌўДДДџЕЕЖўЌЌЊџq§Œ}ќ•••ў‰Š}§‹Œ}ў‰Šz§‘…ї’•r{‘“oAššЃЃЃдЌЌЌ§­­­џДДДўДДДџАААџ™™Ÿџ‰‰Œџџ„џzz~џŽўЇЈЁўЅЅЅџžž­фЃЂZЇЇЇыЉЉЈ§ЊЊЌџВВДџББГќААЏўЇЇІŸ››™AЉЉЉ1ЁЁžsЕЕИўВГЂћ• ў‹”ш{%”›ЃЃžсІЅЎўžЁoџ—ў—%њДДАџББДUССЧДДГЊЊЇ)ТТУџКЛГ§—ў™єžЇ šЃ  ™­ЈЈЏќЈЊ€џŽ˜џ‹•§ЊЌ…ўЗЗФЯЛЛК(ИИЕЌЌІАМЛШўЉЋњ‹•ў—Ÿн‰7…Ž™™˜aЅЅЅєЎЎАўšЁ*ў–џŽ–ўЇЉ’џЏЎИїГГНёЕДПџЇЈ’ўŽ–ј˜§šЂ…Š“ •žЃЃЃІІЄц­­ВџЌ­”§•žќŒ–ћŒ•ј—>§›ŸUў•›8јŒ•§Ž˜џ˜Ÿ-§ЄЈ€ААŠЅЉiААА™™™~ЊЊЈшЎЎДїЋ­—џœЂ;џ’› џŽ˜џŽ—џ˜џ˜ћ–œ3ЬІЈ‰kДКЗИŽ–Їџџџssw‘’†"›š­7ЏЎНMŸЃPb‘˜"s•œy•œ^Œ’&+”;™Ё(jW=КЛt аааIIIЁЁšЊЈШГБШŸЃT•–ž”œŒ’)“GЂЈ<}ciЅ­AЛЛЙЗЗМЕЕЉЂЈE • ” ‘𠐗—ŸЅ› Nџџџџуџ€ƒУƒ€€ќ?џџџџmricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.rc0000664000175000017500000000003711540215550021553 0ustar michaelmichaelMAINICON ICON "dcm2niigui.ico" mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.or0000664000175000017500000001634011660465474021612 0ustar michaelmichaelЮњэў(Р8D0fpc.resources__DATA0Dt fpc.reshandles__DATA0Фа P0 0qP`q”(TFINDDIALOGFORMTREPLACEDIALOGFORMTPF0TFindDialogFormFindDialogFormLeftѓHeightƒTop“WidthМ ActiveControl FindButton BorderIcons biSystemMenubiHelpCaptionFind ClientHeightƒ ClientWidthМOnCreate FormCreatePositionpoScreenCenter LCLVersion0.9.27TLabel FindLabelLeftHeightTopWidthFCaption Text to find FocusControlEditFind ParentColorTEditEditFindLeftHHeightTop Width Anchors akTopakLeftakRightOnChangeEditFindChangeTabOrderTextEditFindTButton FindButtonLeft]HeightTopWidth[Anchors akTopakRightCaption Find moreDefault TabOrderTButton CancelButtonLeft]HeightTop(Width[Anchors akTopakRightCancel CaptionCancel ModalResultTabOrder TCheckBoxWholeWordsOnlyCheckBoxLeftHeightTop3Width…CaptionWhole words onlyTabOrder TCheckBoxCaseSensitiveCheckBoxLeftHeightTopNWidthtCaptionCase sensitiveTabOrder TRadioGroupDirectionRadioGroupLeftHeight-Top.WidthХAutoFill Caption DirectionChildSizing.LeftRightSpacingChildSizing.TopBottomSpacingChildSizing.EnlargeHorizontalcrsHomogenousChildResizeChildSizing.EnlargeVerticalcrsHomogenousChildResizeChildSizing.ShrinkHorizontalcrsScaleChildsChildSizing.ShrinkVerticalcrsScaleChildsChildSizing.LayoutcclLeftToRightThenTopToBottomChildSizing.ControlsPerLine ClientHeight ClientWidthСColumns Items.StringsForwardBackwardTabOrderTButton HelpButtonLeft]HeightTopdWidth[Anchors akRightakBottomCaptionHelpTabOrder TCheckBoxEntireScopeCheckBoxLeftHeightTopgWidth„CaptionSearch entire fileTabOrderTPF0TReplaceDialogFormReplaceDialogFormLeftŸHeightЂTop‡WidthА HelpContext ActiveControlEditFind BorderIcons biSystemMenubiHelpCaption Replace textChildSizing.LeftRightSpacingChildSizing.TopBottomSpacingChildSizing.HorizontalSpacingChildSizing.VerticalSpacingChildSizing.ControlsPerLine ClientHeightЂ ClientWidthА Font.Height Font.Style LCLVersion0.9.27TLabel TextLabelLeftHeightTopWidthF HelpContext Alignment taLeftJustifyBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Text to find FocusControlEditFind ParentColorTLabel ReplaceLabelLeftHeightTop0WidthO HelpContext Alignment taLeftJustifyBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Replace with FocusControl EditReplace ParentColorTEditEditFindLeftHHeightTop Width HelpContextAnchors akTopakLeftakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillTabOrderTextEditFindTEdit EditReplaceLeftHHeightTop*Width HelpContextAnchors akTopakLeftakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillTabOrderText EditReplace TCheckBoxWholeWordsOnlyCheckBoxLeftHeightTopPWidth… HelpContextBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionWhole words onlyState cbUncheckedTabOrder UseOnChange TCheckBoxCaseSensitiveCheckBoxLeftHeightTophWidtht HelpContextBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionCase sensitiveState cbUncheckedTabOrder UseOnChangeTButtonFindMoreButtonTagLeftQHeightTop Width[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Find moreDefault TabOrderTButton ReplaceButtonTagLeftQHeightTop(Width[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionReplaceTabOrderTButtonReplaceAllButtonTagLeftPHeightTopDWidth[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption Replace allTabOrderTButton CancelButtonLeftQHeightTop`Width[ HelpContextAnchors akTopakRightBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCancel CaptionCancel ModalResultTabOrderTButton HelpButtonLeftQHeightTopWidth[ HelpContextAnchors akRightakBottomBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionHelpTabOrder TRadioGroupDirectionRadioGroupLeftˆHeight-TopPWidthИ HelpContextAutoFill BorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaption DirectionChildSizing.LeftRightSpacingChildSizing.TopBottomSpacingChildSizing.HorizontalSpacingChildSizing.VerticalSpacingChildSizing.EnlargeHorizontalcrsHomogenousChildResizeChildSizing.EnlargeVerticalcrsHomogenousChildResizeChildSizing.ShrinkHorizontalcrsScaleChildsChildSizing.ShrinkVerticalcrsScaleChildsChildSizing.LayoutcclLeftToRightThenTopToBottomChildSizing.ControlsPerLine ClientHeight ClientWidthДColumnsCtl3D Items.StringsForwardBackwardTabOrder TCheckBoxEntireScopeCheckBoxLeftHeightTop€Width„ HelpContextBorderSpacing.LeftBorderSpacing.TopBorderSpacing.RightBorderSpacing.BottomBorderSpacing.Around!BorderSpacing.CellAlignHorizontalccaFillBorderSpacing.CellAlignVerticalccaFillCaptionSearch entire fileState cbUncheckedTabOrder UseOnChange ,0<@L\lFPC_RESSYMBOLmricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.lrs0000664000175000017500000016150211540215550021754 0ustar michaelmichaelLazarusResources.Add('MAINICON','ICO',[ #0#0#1#0#4#0'00'#0#0#1#0' '#0#168'%'#0#0'F'#0#0#0' '#0#0#1#0' '#0#168#16#0#0 +#238'%'#0#0#24#24#0#0#1#0' '#0#136#9#0#0#150'6'#0#0#16#16#0#0#1#0' '#0'h'#4#0 +#0#30'@'#0#0'('#0#0#0'0'#0#0#0'`'#0#0#0#1#0' '#0#0#0#0#0#128'%'#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#138#138#138#0#143#143#143#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#168#168#168#0#185#185#185#0#0#0#0#1#255#255#255#3#14#14#14#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#141#141#141#2#142 +#142#142#2#145#145#145#2#146#145#145#2#146#146#146#2'~~'#128#2'zz{'#1'{{{'#2 +'|||'#2'~~'#128#2#127#127#129#2#127#127#127#2#128#128#128#2#128#128#129#2#131 +#131#131#2#131#131#131#2#133#133#133#2#134#134#134#1'jjj'#2#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#131#131#131#0#173#173#173#0#178#178#178#2#0#0#0#0#0#0#0#0 +#0#0#0#5#0#0#0#7#0#0#0#6#0#0#0#6#0#0#0#6#0#0#0#6#0#0#0#6#0#0#0#6#0#0#0#8#0#0 +#0#0#143#143#143#0#145#145#146#0#130#130#130#0#139#138#147#0#153#152#174#0 +#143#141#177#0#156#154#202#0#161#159#206#0#163#160#209#0#162#159#208#0#153 +#151#195#0#135#134#166#0'vu'#131#0'mmn'#0'rrq'#0'rrr'#0'ttt'#0'}}}'#0'lll'#0 +'xxx'#0'888'#0#128#128#128#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#147#147#147#0#0#0#0#0#143#143#143#1#167#167#167#2 +#144#144#144#0'kkk'#9'zzz'#129#151#151#151#214#166#166#166#216#163#163#163 +#216#163#163#163#217#162#162#162#217#163#163#163#217#162#162#162#217#162#162 +#162#216#166#166#166#219#155#155#155#194'sss9rrp!pqm#'#132#130#141'#'#156#155 +#180'"'#149#147#188#27#156#154#204#25#162#159#211#25#164#162#214#25#164#161 +#213#25#155#153#199#25#132#131#166#25'ggt'#25'PPK'#25'STG'#25']]Y'#25'bbb'#25 +'iii'#25'bbb'#27'___'#6#23#23#23#0#130#130#130#0#137#137#137#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#157#157#157#0#156#156#156 +#0#137#137#137#0#183#183#183#0#175#175#175'H'#154#154#154#210#154#154#154#255 +#168#168#168#255#176#176#176#255#174#174#174#255#175#175#175#255#175#175#175 +#255#174#174#174#255#174#174#174#255#174#174#174#255#177#177#177#255#175#175 +#175#255#155#155#156#253#179#178#183#245#174#174#176#246#164#164#160#246#148 +#148#133#246#130#131'l'#241'wyY'#240'rtP'#240'stP'#240'xzZ'#240#131#132'l' +#240#146#147#131#240#161#161#158#240#171#171#175#240#173#173#178#240#168#168 +#169#240#165#165#163#240#165#165#165#236#167#167#167#241#147#147#147#143#197 +#197#197#0#174#174#174#1#129#129#129#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#151#151#151#2#146#146#146#0#137#137#137#29#138#138 +#138#159#157#157#157#255#169#169#169#255#151#151#151#250#170#170#170#253#171 +#171#171#253#170#170#170#253#171#171#171#253#171#171#171#253#171#171#171#253 +#171#171#171#253#170#170#170#253#171#171#171#253#171#171#172#252#154#154#147 +#255#140#142'r'#255'lo;'#255'`d'#22#255'_e'#1#255'ek'#0#255'kq'#0#255'nu'#0 +#255'mt'#0#255'kq'#0#255'gm'#0#255'ek'#3#255'hm'#24#255'uy='#255#142#143'r' +#255#167#167#164#255#180#180#187#255#176#176#178#255#175#176#175#255#165#165 ,#165#239#157#157#157#22'```'#0#128#128#128#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#164#164#164#2#171#171#171#5#149#149#149#205 +#168#168#168#255#167#167#167#251#164#164#164#252#152#152#152#255#173#173#173 +#254#171#171#171#254#171#171#171#255#172#172#172#255#172#172#172#255#172#172 +#172#255#172#172#172#255#171#171#171#254#171#171#169#254#176#176#182#255'hj7' +#254'X^'#0#253'u|'#0#253#136#144#0#253#145#155#0#253#149#158#0#253#149#158#1 +#253#149#159#1#253#149#158#1#253#149#159#1#253#149#158#0#253#146#155#0#253 +#140#149#0#253#129#138#0#253't|'#0#253'qw'#17#253#132#135'S'#253#165#165#161 +#253#178#178#184#250#172#172#170#255#134#134#133'p'#173#173#173#0#169#169#169 +#3#170#170#171#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'ppp' +#0'lll"'#162#162#162#248#166#166#166#252#166#166#166#253#161#161#161#255#154 +#154#154#254#174#174#174#255#170#170#170#255#172#172#172#255#171#171#171#255 +#171#171#171#255#171#171#171#255#171#171#171#255#171#171#171#255#171#171#168 +#255#172#172#182#255#133#138'4'#255#146#156#1#255#149#157#3#255#145#154#0#255 +#143#152#0#255#143#152#0#255#143#152#0#255#142#151#0#255#143#151#0#255#143 +#151#0#255#143#152#0#255#143#152#0#255#144#153#0#255#146#156#1#255#148#158#1 +#255#144#154#0#255#130#139#0#255'x'#127#16#255#143#145'k'#251#177#176#184#254 +#163#163#163#211#201#202#198#5#169#170#165#1#190#185#230#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#143#143#143#0#131#131#131'J'#163#163 +#163#254#165#165#165#253#166#166#166#254#158#158#158#254#156#156#156#255#175 +#175#175#255#171#171#171#255#172#172#172#255#174#174#174#255#175#175#175#255 +#175#175#175#255#174#174#174#255#172#172#172#255#171#172#169#255#172#171#183 +#255#140#145';'#255#142#151#0#255#142#151#2#255#143#152#0#255#143#152#0#255 +#143#152#1#255#144#153#2#255#145#153#2#255#145#154#2#255#145#154#2#255#144 +#153#2#255#143#152#1#255#143#152#0#255#142#151#0#255#142#151#1#255#143#151#2 +#255#146#155#4#255#145#154#0#254#129#138#0#254#131#134'>'#252#165#165#169#255 +'}}'#132'I'#152#148#164#0#149#148#157#2#131#130#137#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#157#157#157#0#144#144#144's'#165#165#165#254#165#165 +#165#251#167#167#167#255#157#157#157#255#160#160#160#255#174#174#174#255#174 +#174#174#255#178#178#178#255#179#179#179#255#179#179#179#255#179#179#179#255 +#179#179#179#255#178#178#178#255#175#175#173#255#174#174#185#255#140#145'A' +#255#143#153#0#255#144#153#3#255#144#153#1#255#145#154#0#255#143#153#0#255 +#140#149#0#255#137#147#0#255#137#147#0#255#138#148#0#255#141#151#0#255#145 +#155#0#255#147#156#0#255#146#155#0#255#145#155#0#255#145#155#0#255#145#154#0 +#255#144#153#0#255#148#158#0#255#139#149#0#251#131#137'!'#254#146#146#137#178 +#147#166#155#0#171#175#130#2#0#0#0#0#137#137#137#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#175#175#175#0#147#147#147#154#166#166#166#255#164#164#164#250 +#167#167#167#254#155#155#155#255#162#162#162#255#178#178#178#255#179#179#179 +#255#179#179#179#255#179#179#179#255#179#179#179#255#179#179#179#255#179#179 +#179#255#179#179#179#255#179#179#177#255#181#181#191#255#139#144'G'#255#135 +#145#0#255#140#149#0#255#140#150#0#255#137#145#0#255#140#147'&'#255#151#155 +'P'#255#158#161'i'#255#158#160'l'#255#154#157'e'#255#143#148'J'#255#131#138 +#28#255#129#137#6#255#129#136#18#255#132#139#25#255#131#137#27#255#131#137#30 +#255#130#137'!'#255#129#136'&'#254#133#138','#254#130#135')'#253'nqF'#249':F' +'?(dfZ'#0'llf'#5#131#131#131#3#156#156#156#3#131#131#131#2#183#183#183#0#178 +#178#178#0#0#0#0#0#241#241#241#0#155#155#155#184#166#166#166#255#165#165#165 +#251#170#170#170#255#156#156#156#255#168#168#168#255#182#182#182#255#178#178 +#178#255#179#179#179#255#180#180#180#255#179#179#179#255#179#179#179#255#179 +#179#179#255#179#179#179#255#178#178#178#255#182#182#184#255#141#141#131#255 +#133#135'j'#255#136#138'd'#255#129#132'T'#255#130#132'r'#255#153#152#160#255 +#154#153#164#255#159#158#168#255#165#165#174#255#157#156#166#255#151#150#161 +#255#137#137#143#255'yyv'#255#142#142#146#255#148#148#153#255#148#148#154#255 +#150#150#158#255#151#151#159#255#152#152#161#254#152#152#162#255#151#150#162 +#252#153#153#157#254#135#133#135#210#146#145#149#27#165#166#165#0'zzz'#0#163 +#163#163#0#143#143#143#0#212#212#212#0#203#203#203#0'kkk'#0#250#250#250#4#157 +#157#157#208#168#168#168#255#171#171#171#252#176#176#176#255#160#160#160#255 +#170#170#170#255#181#181#181#255#178#178#178#255#180#180#180#255#179#179#179 +#255#180#180#180#255#180#180#180#255#179#179#179#255#180#180#179#255#178#178 +#179#255#181#181#181#255#150#150#152#255#152#152#157#255#154#154#161#255#157 +#156#165#255#151#151#155#255#132#132#131#255#127#127'|'#255#134#134#132#255 +#136#136#134#255#134#134#132#255#135#135#133#255#127#127'}'#255#151#151#152 +#255#153#153#153#255#149#149#148#255#146#146#144#255#142#143#141#255#139#139 +#137#255#135#135#133#255#131#131#130#254#142#142#140#255#142#142#142#252#144 +#144#144#255'zzz'#195#141#141#141'v'#139#139#139'{'#136#136#136'}wwwN'#174 ,#174#174#0#196#196#196#1'```'#0#11#11#11'('#157#157#157#226#171#171#171#255 +#173#173#173#253#175#175#175#255#160#160#160#255#169#169#169#255#181#181#181 +#255#179#179#179#255#179#179#179#255#180#180#180#255#180#180#180#255#180#180 +#180#255#180#180#180#255#179#179#180#255#179#179#178#255#182#182#183#255#150 +#150#150#255#148#148#146#255#155#156#154#255#138#138#135#255'tts'#255#130#130 +#130#255#140#140#140#255#141#141#141#255#143#143#143#255#146#146#146#255#149 +#149#149#255#135#135#135#255#127#127#127#255'yyy'#255'zzz'#255'zzz'#255'zzz' +#255'~~~'#255'www'#255#132#132#132#255#174#174#174#254#170#170#170#255#170 +#170#170#252#173#173#173#255#172#172#172#255#171#171#171#255#172#172#172#255 +#153#153#153#224#176#176#176#1#179#179#179#1'eee'#2'qqqT'#162#162#162#236#173 +#173#173#255#172#172#172#254#176#176#176#255#161#161#161#255#168#168#168#255 +#182#182#182#255#179#179#179#255#180#180#180#255#180#180#180#255#180#180#180 +#255#180#180#180#255#180#180#180#255#180#180#180#255#178#178#178#255#183#183 +#183#255#152#152#152#255#145#145#145#255#152#152#152#255#131#131#131#255#149 +#149#149#255#154#154#154#255#153#153#153#254#155#155#155#255#154#154#154#254 +#154#154#154#254#155#155#155#254#136#136#136#254'zzz'#255#134#134#134#254#134 +#134#134#255#134#134#134#255#135#135#135#255#128#128#128#255#128#128#128#255 +#165#165#164#255#171#172#170#255#171#171#169#254#171#171#170#255#171#171#170 +#253#171#171#170#251#171#171#170#249#172#172#171#247#170#170#170#251'xxx'#167 +'TTT'#0#171#171#171#0'}}}'#127#169#169#169#242#173#173#173#255#173#173#173 +#253#176#176#176#255#162#162#162#255#167#167#167#255#182#182#182#255#179#179 +#179#255#180#180#180#255#180#180#180#255#180#180#180#255#180#180#180#255#180 +#180#180#255#180#180#180#255#178#178#178#255#183#183#183#255#154#154#154#254 +#145#145#145#255#155#155#155#253#141#141#141#251#154#154#154#251#154#154#154 +#251#152#152#152#250#152#152#152#250#150#150#150#250#149#149#149#250#149#149 +#149#251'}}}'#252'rrr'#254'|||'#255'xxx'#254'yyy'#255'sss'#255#130#130#129 +#255#171#171#172#255#177#177#181#255#174#173#177#255#175#175#179#255#175#175 +#179#255#175#174#180#255#176#175#179#255#176#176#178#255#174#174#174#255#176 +#176#175#255#175#175#175#255#145#145#145#190#149#149#149#23#130#130#130#157 +#171#171#171#246#174#174#174#255#173#173#173#254#176#176#176#255#162#162#162 +#255#167#167#167#255#182#182#182#255#179#179#179#255#180#180#180#255#180#180 +#180#255#180#180#180#255#180#180#180#255#180#180#180#255#180#180#180#255#179 +#179#179#255#181#181#181#254#165#165#165#255#186#186#186#254#199#199#199#255 +#134#134#134#255'xxx'#255#128#128#128#255'}}}'#255'|||'#255'zzz'#255'zzz'#255 +'{{{'#255'xxx'#255'ttt'#254'uuu'#254'www'#255'{{{'#255'uuu'#255#152#152#153 +#255#160#160#156#255#151#153#134#255#154#155#136#255#153#154#134#255#153#154 +#134#255#153#155#132#254#149#150#130#255#146#146#140#232#150#149#153#212#150 +#150#153#214#159#159#159#210#158#158#158#227'___Z'#138#138#138#179#171#171 +#171#249#173#173#173#255#172#172#172#254#175#175#175#255#162#162#162#255#167 +#167#167#255#181#181#181#255#178#178#179#255#179#179#180#255#179#179#179#255 +#179#179#179#255#179#179#179#255#179#179#179#255#179#179#179#255#178#178#178 +#255#182#182#182#255#164#164#164#253#189#189#189#254#164#164#164#237#145#145 +#145#180#141#141#141#169'nnn'#155'ooo'#142'nnn'#129'jjjtlllgwwwUiii'#134#164 +#164#164#255#172#172#172#252#174#174#174#254#177#177#177#254#180#180#179#255 +#185#185#186#255#167#167#162#255#128#136#9#255#137#146#0#255#135#144#0#255 +#136#144#0#255#138#147#0#250#129#137#0#255'ci'#5#157'fl'#0#5'nu'#0#8#0#0#0#6 +#0#0#0#5'rrr'#6#140#140#140#183#171#171#171#250#174#174#174#255#175#175#175 +#254#177#177#177#255#161#161#161#255#168#168#168#255#181#181#179#255#178#178 +#176#255#179#179#177#255#179#179#177#255#179#179#177#255#179#179#177#255#179 +#179#177#255#179#179#178#255#179#179#179#255#182#182#182#254#166#166#166#251 +#181#181#181#255#138#138#138'^'#172#172#172#0#166#166#166#0#136#136#136#0#134 +#134#134#0#127#127#127#0'www'#0'uuu'#0#206#206#206#0#219#219#219#0#173#173 +#173#200#197#197#197#254#194#194#194#252#194#194#194#255#193#193#193#255#193 +#193#192#255#191#191#201#255#142#148'1'#255#144#154#0#255#145#153#1#255#145 +#154#0#255#144#153#0#252#145#155#0#255#142#151#7#202#141#159#0#0#168#184#0#0 +'48'#0#0'DDD'#0'^^^'#0#140#140#140#183#172#172#172#250#172#172#172#255#160 +#160#160#254#170#170#170#255#158#158#158#255#171#171#172#255#184#183#193#255 +#181#180#191#255#182#181#193#255#181#181#192#255#182#181#192#255#181#181#192 +#255#181#180#192#255#180#180#185#255#176#177#176#255#176#176#177#253#165#165 +#165#255#175#175#175#231#30#30#30#16'jjj'#2'kkk'#2#147#147#147#2#128#128#128 +#3'zzz'#3'uuu'#3'yyy'#3#178#178#178#7#181#181#181#0#149#149#149'n'#188#188 +#188#255#191#191#191#251#191#191#191#254#191#191#191#255#190#190#188#255#194 +#193#204#255#148#151'R'#255#139#149#0#255#143#152#2#255#142#151#0#255#143#152 +#0#253#142#151#0#255#147#155#5#226'VkY'#10#168#173'E'#0#162#168'*'#0#0#0#0#0 ,#0#0#0#0#138#138#138#179#173#173#173#249#167#167#167#255#148#148#148#254#159 +#159#159#255#146#146#147#255#154#154#149#255#146#149'X'#255#143#147'P'#255 +#144#147'O'#255#143#147'M'#255#142#147'K'#255#143#147'K'#255#140#145'D'#255 +#144#147'p'#255#168#168#173#255#163#163#162#252#178#178#178#254#172#172#172 +#200#0#0#0#0#245#245#245#0'eee'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'vvv'#0#159 +#159#159#3#142#142#142#0#137#137#137'I'#187#187#187#255#192#192#192#253#191 +#191#191#253#191#191#191#255#191#191#189#255#195#194#204#255#150#154']'#255 +#139#148#0#255#143#152#1#255#143#152#0#255#144#153#0#252#142#151#0#255#146 +#155#1#232#161#168#29#18#154#164#20#0#162#167'*'#0#0#0#0#0#0#0#0#0#131#131 +#131#156#173#173#173#246#167#167#167#255#159#159#159#253#178#178#177#255#174 +#174#176#255#171#171#160#255#143#152#3#255#140#150#0#255#141#151#0#255#141 +#151#0#255#140#150#0#255#142#151#0#255#138#148#0#255#145#150'G'#255#195#195 +#206#255#192#193#190#252#196#196#196#255#171#171#171#206#255#255#255#2#0#0#0 +#0#140#140#140#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#129#129#129#0#158#158#158#3 +#144#144#144#1#140#140#140'N'#187#187#187#254#192#192#192#253#191#191#191#253 +#192#192#192#255#190#190#188#255#194#194#204#255#149#153'W'#255#140#149#0#255 +#144#153#2#255#142#151#0#255#144#153#0#253#143#152#0#255#146#155#2#231#177 +#184')'#18#157#166#25#0#162#171'*'#0#0#0#0#0#0#0#0#0'{{{y'#172#172#172#241 +#169#169#169#255#155#155#155#254#175#175#174#255#172#172#173#255#172#173#169 +#255#147#155#25#255#143#152#2#255#144#153#3#255#144#153#2#255#144#153#2#255 +#144#152#4#255#142#152#2#255#141#146'3'#255#189#189#198#255#190#190#189#253 +#193#193#193#254#179#179#179#240'EEE'#27'```'#1'zzz'#0#205#205#205#0#0#0#0#0 +#0#0#0#0#131#131#131#0'zzz'#0#196#196#196#4#201#201#201#0#154#154#154#129#191 +#191#191#255#191#191#191#251#191#191#191#254#191#191#191#255#191#191#189#255 +#191#190#201#255#143#148';'#255#142#152#0#255#143#152#1#255#143#152#0#255#143 +#152#0#252#142#151#0#255#145#154#4#224'''>'#0#8#162#170':'#0#162#170'*'#0#0#0 +#0#0#0#0#0#0'^^^J'#167#167#167#235#170#170#170#255#155#155#155#253#175#175 +#175#255#173#173#171#255#174#174#179#255#152#158'.'#255#141#151#0#255#144#153 +#1#255#144#153#0#255#144#153#0#255#142#151#0#255#144#154#0#255#135#143#13#255 +#179#179#177#255#194#194#194#254#192#192#191#250#190#190#190#255#150#150#150 +'~'#184#184#184#0#183#183#183#5#193#193#193#1'ZZZ'#0'```'#0#158#158#158#0'yy' +'y'#3#189#189#189#1#191#191#191#13#173#173#173#222#193#193#193#254#191#191 +#191#252#192#192#192#255#190#190#190#255#193#193#193#255#181#181#183#255#136 +#143#18#255#144#153#0#255#142#151#0#255#144#153#0#254#142#151#0#251#145#154#4 +#254#155#163#23#196#142#153#13#0#158#167#11#0#162#171'*'#0#0#0#0#0#0#0#0#0#6 +#6#6#23#164#164#164#220#172#172#172#255#154#154#154#253#175#175#175#255#173 +#173#169#255#175#174#184#255#162#167'Z'#255#143#152#0#255#143#152#1#255#143 +#152#0#255#144#153#0#255#143#152#0#255#144#153#1#255#137#147#0#255#156#159'u' +#255#195#194#202#254#184#184#181#253#185#185#185#252#177#177#177#245#144#144 +#144'B'#175#175#175#0#175#175#175#0#139#139#139#3#0#0#0#3#165#165#165#2#187 +#187#187#0#173#173#173#0#140#140#140#162#181#181#181#255#180#180#180#251#182 +#182#182#255#187#187#187#254#190#190#188#255#196#196#203#255#159#161#127#255 +#136#146#0#255#144#153#1#255#143#152#0#255#144#153#0#254#141#150#0#250#155 +#164#26#254#168#175'4'#150#175#181'7'#0#168#176'-'#2#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#162#162#162#195#174#174#174#255#154#154#154#252#174#174#174#255#172 +#172#171#255#174#173#181#255#171#173#138#255#150#159#10#255#142#151#0#255#144 +#153#0#255#144#153#0#255#144#153#0#255#143#152#0#255#144#153#0#255#135#142#29 +#255#173#172#177#254#180#180#179#255#177#177#177#253#181#181#181#254#170#170 +#170#242#164#164#164'l'#190#190#190#13#4#4#4#0'###'#0#158#158#158#0#169#169 +#169'.'#160#160#160#175#183#183#183#255#179#179#179#252#179#179#179#254#179 +#179#179#254#177#177#177#255#186#186#184#255#184#184#192#255#137#143'#'#255 +#143#153#0#255#143#152#1#255#144#153#0#254#143#152#0#255#143#151#0#251#162 +#170'('#255#162#170'-S'#166#173'2'#0#163#171')'#2#0#0#0#0#0#0#0#0#0#0#0#0#198 +#198#198#0#153#153#153#161#174#174#174#254#154#154#154#250#172#172#172#254 +#173#173#173#255#173#172#174#255#174#173#172#255#162#169'8'#255#144#153#0#255 +#143#152#0#255#143#152#0#255#143#152#0#255#142#151#0#255#144#153#1#255#139 +#148#0#255#137#141'N'#255#181#180#191#254#180#180#177#255#177#177#177#253#182 +#182#182#255#176#176#176#255#175#175#175#224#166#166#166#174#151#151#151#161 +#156#156#156#195#172#172#172#249#182#182#182#255#179#179#179#252#179#179#179 +#255#179#179#179#255#178#178#179#254#179#179#175#255#181#180#193#255#142#146 +'T'#255#140#149#0#255#144#153#1#255#143#152#0#255#143#152#0#255#142#151#0#252 +#148#157#10#253#165#172'.'#230#189#194'L'#16#165#173'%'#0#160#167'%'#0#0#0#0 +#0#0#0#0#0#0#0#0#0#161#161#161#0#147#147#147'v'#174#174#174#254#155#155#155 +#251#170#170#170#255#174#174#174#255#172#173#171#255#173#173#182#255#171#174 ,'x'#255#153#162#14#255#142#150#0#255#144#153#0#255#143#152#0#255#143#152#0 +#255#142#151#0#255#145#154#1#255#135#144#0#255#142#145'c'#255#181#180#192#254 +#181#181#180#255#178#178#176#254#179#179#179#253#180#180#180#255#181#181#181 +#255#183#183#183#255#183#183#183#255#181#181#181#255#178#178#178#252#179#179 +#180#255#179#179#179#254#178#178#176#254#181#181#179#255#182#181#193#255#145 +#148'h'#255#136#145#0#255#145#154#1#255#143#152#0#255#144#153#0#254#144#153#0 +#254#141#150#0#251#155#163#27#255#168#175'7'#134#180#187'D'#0#167#175'+'#2 +#159#167'#'#0#0#0#0#0#0#0#0#0#0#0#0#0#148#148#148#0#133#133#133'H'#172#172 +#172#255#157#157#157#253#167#167#167#254#175#175#175#255#173#173#172#255#173 +#172#174#255#173#173#170#255#167#173'B'#255#146#155#4#255#142#151#0#255#144 +#153#0#255#144#153#0#255#143#152#0#255#142#151#0#255#145#154#1#255#137#145#0 +#255#140#144'R'#255#172#172#178#254#184#183#190#254#181#181#180#254#179#179 +#176#252#178#178#176#251#178#178#177#251#178#178#177#251#178#178#177#253#179 +#179#177#254#179#179#176#254#181#181#179#254#183#183#189#255#173#173#181#255 +#141#145'X'#255#136#145#0#255#145#154#1#255#143#152#0#255#144#153#0#255#144 +#153#0#255#142#151#0#252#146#155#5#254#166#174'&'#230#168#176'0'#22#164#172 +'-'#1#160#167'.'#0#160#168'#'#0#0#0#0#0#0#0#0#0#0#0#0#0']]]'#0'RRR'#28#169 +#169#169#242#162#162#162#255#161#161#161#253#175#175#175#254#173#173#173#255 +#173#173#171#255#173#173#179#255#173#174#142#255#161#169'$'#255#143#152#0#255 +#143#152#0#255#144#153#0#255#144#153#0#255#144#153#0#255#143#152#0#255#145 +#154#1#255#140#149#0#255#134#140' '#255#152#154'z'#255#172#171#176#255#181 +#180#191#255#184#183#191#255#184#183#188#255#183#183#187#255#184#183#188#255 +#184#183#190#255#182#181#191#255#173#172#178#255#152#155#127#255#134#140'%' +#255#139#149#0#255#145#154#0#255#143#152#0#255#144#153#0#255#144#153#0#255 +#143#152#0#254#142#151#0#251#152#160#18#255#140#146'6f'#149#157'$'#0#151#158 +'%'#3#161#168','#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#229#229#229#1#249#249#249 +#2#162#162#162#204#167#167#167#254#157#157#157#252#176#176#176#255#172#172 +#172#255#173#174#173#255#172#173#171#255#174#173#181#255#171#175's'#255#157 +#166#23#255#142#151#0#255#143#152#0#255#144#153#0#255#143#152#0#255#144#153#0 +#255#143#152#0#255#144#153#1#255#144#153#0#255#136#146#0#255#134#141#27#255 +#142#146'N'#255#151#153'u'#255#157#159#138#255#160#160#145#255#157#159#139 +#255#151#153'w'#255#142#146'R'#255#134#141#31#255#136#145#0#255#144#153#0#255 +#144#153#1#255#143#152#0#255#144#153#0#255#143#152#0#255#143#152#0#254#143 +#152#1#253#147#157#1#255#152#157'F'#236#175#174'M'#16'nk'#163#0#141#143'h'#1 +#165#172'-'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#187#187#187#8#193#193#193#0#154 +#154#154#148#171#171#171#254#153#153#153#250#174#174#174#254#173#173#173#255 +#174#174#174#255#173#173#173#255#173#173#173#255#173#173#178#255#170#174'h' +#255#156#164#19#255#142#151#0#255#143#152#0#255#144#153#0#255#144#153#0#255 +#144#153#0#255#143#152#0#255#143#152#1#255#145#154#1#255#145#154#0#255#141 +#150#0#255#137#146#0#255#135#143#0#255#134#143#0#255#134#143#0#255#136#145#0 +#255#140#150#0#255#144#154#0#255#145#154#1#255#143#152#1#255#143#152#0#255 +#144#153#0#255#143#152#0#254#144#153#0#254#143#152#1#255#141#151#0#249#161 +#167'J'#252#161#161#167#170#232#231#184#0#213#212#229#1'ty%'#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#151#151#151#9#143#143#143#0#135#135#135'S'#175#175 +#175#255#159#159#159#251#173#173#173#254#173#173#173#254#173#173#173#254#174 +#174#174#255#173#173#173#255#173#173#173#255#173#173#178#255#170#174'm'#255 +#157#165#24#255#143#153#0#255#142#151#0#255#144#153#0#255#144#153#0#255#143 +#152#0#255#144#153#0#255#143#152#0#255#143#152#1#255#144#153#2#255#145#154#2 +#255#145#154#0#255#145#155#0#255#145#154#0#255#145#154#1#255#144#153#2#255 +#143#152#1#255#143#152#0#255#144#153#0#255#144#153#0#254#144#153#0#254#144 +#153#1#255#142#151#0#254#141#151#0#251#166#171'M'#249#186#185#188#255#140#140 +#142'V'#154#153#175#0#159#159#158#2'sx'#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#135#135#135#3'yyy'#0'rrr'#24#174#174#174#247#171#171#171#255#172#172 +#172#248#179#179#179#250#173#173#173#251#173#173#173#252#173#173#173#253#172 +#173#172#253#172#173#172#254#173#173#180#254#171#173#130#254#161#168','#255 +#147#156#2#254#142#151#0#255#143#152#1#255#144#153#1#255#144#153#0#255#144 +#153#0#255#144#153#0#255#144#153#0#255#143#152#0#255#143#152#0#255#143#152#0 +#255#143#152#0#255#143#152#0#255#144#153#0#254#144#153#0#254#144#153#0#254 +#144#153#0#254#143#152#0#253#143#152#0#250#142#152#0#251#148#157#10#255#169 +#173'g'#255#181#180#187#255#172#172#173#204#146#147#143#16#132#132'~'#0#137 +#137#137#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#21#21#21#0#183#183 +#183#1#156#156#156#0#132#132#132'Q'#161#161#161#215#163#163#163#255#185#185 +#185#255#182#182#182#255#182#182#182#255#180#180#180#255#178#178#178#255#176 +#176#176#255#174#175#173#253#174#174#182#251#172#173#161#251#165#170'W'#251 ,#153#162#21#251#145#154#0#251#142#151#0#252#142#151#0#253#142#151#0#253#143 +#152#0#253#143#152#0#254#143#152#0#254#144#153#0#254#143#153#0#254#143#152#0 +#254#143#152#0#254#143#152#0#253#143#152#0#251#143#152#0#251#144#153#0#254 +#145#154#0#255#148#157#9#255#154#161'4'#255#165#167#142#230#179#178#194#161 +#209#209#209'J'#197#197#194#6#234#234#235#0#173#173#174#0#140#140#140#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'TTT'#0#191#191#191#0'xxx'#1'aaa'#0 +#214#214#214#11#130#130#130'k'#157#157#157#152#163#163#163#176#166#166#166 +#201#170#170#170#225#173#173#173#240#176#176#176#252#176#176#176#255#176#176 +#174#255#178#178#180#255#180#180#186#255#179#180#158#255#170#175'c'#255#159 +#167'-'#255#152#161#15#255#148#157#4#255#146#155#0#255#145#154#0#255#144#153 +#0#255#143#152#0#255#143#152#0#255#144#153#0#255#145#154#0#255#143#152#3#255 +#147#156#7#255#149#157#11#255#147#155#17#255#145#151'"'#224#139#142'W'#160 +#132#130#156'T'#144#142#186#19#169#168#183#0#0#0#0#0#187#187#186#0#221#221 +#221#0#167#167#167#0#136#136#136#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#181#181#181#0'|||'#0'rrr'#2#183#183#183#0#142#142#142#0#192 +#192#192#0#0#0#0#0#0#0#0#0#0#0#0#8'XXX'#25'lll-'#142#142#142'B'#142#142#143 +'['#153#153#152't'#152#152#150#139#158#158#166#163#163#162#175#184#165#166 +#156#200#161#163't'#217#155#159'K'#230#150#157'/'#242#150#157'!'#249#151#159 +#27#252#153#161#26#255#154#161#27#255#152#160#27#253#151#159#29#242#164#171 +#28#215#152#159'"'#175#143#150'(w~'#131'.:'#13#0#255#10#255#255#0#0#255#255 +#186#0#0#0#0#0#193#191#209#2#255#255#255#2#220#220#218#0#230#230#230#0#160 +#160#160#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#142#142#142#0'xxx'#0#208#208#208#0#135#135#135#3#177#177#177#3#255#255 +#255#1'???'#0' '#0'nnn'#0#127#127#127#0#147#147#147#0#163#163#163#0#181#181 +#181#0#0#0#0#0#216#216#236#0#0#0#0#0#0#0#0#0'&'#21#255#7'aU'#255#14'b`'#136 +#26'opS''x|40'#137#142'79'#139#144':<~'#132'-0y|8'#28#238#240#7#6#181#192#3#0 +#166#173#26#0#130#136')'#0']Z'#132#0#0#0#255#2'h['#208#2#0#0#0#0#197#195#213 +#0#242#242#247#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#1#170#170#170#1'www'#2#154#154#154#3#166#166#166#4#180 +#179#180#4#255#255#255#4#184#185#186#4#255#255#255#2#255#255#230#0'5#'#255#0 +'H2'#255#0'_Z'#171#0'qrV'#0#127#132'8'#0#140#145'<'#0#143#148'?'#0#133#139'0' +#0'}'#128'9'#0#243#245#8#0#169#179#3#3#166#174#16#4#132#139'#'#3#0#0#0#1#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#143#149','#1 +'{'#129')'#2'w{3'#2'{'#127'7'#2#129#135'$'#2#0#0#0#1#253#255#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#255#255#255#255#255#255#0#0#255#255#255#255#255#255#0#0#255#255#255#255 +#255#255#0#0#255#255#255#255#255#255#0#0#255#255#255#255#255#255#0#0#255#255 +#255#255#255#255#0#0#255#255#255#255#255#255#0#0#252#0#127#255#255#255#0#0 +#248#0#0#0#7#255#0#0#224#0#0#0#7#255#0#0#192#0#0#0#3#255#0#0#192#0#0#0#3#255 ,#0#0#192#0#0#0#3#255#0#0#128#0#0#0#1#255#0#0#128#0#0#0#1#255#0#0#128#0#0#0#0 +#255#0#0#128#0#0#0#0#15#0#0#128#0#0#0#0#7#0#0#0#0#0#0#0#3#0#0#0#0#0#0#0#1#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#31#0#0#0#0#15#248#0#31#0#0#0#0#31#248#0#31#0#0#0#0 +#31#252#0#31#0#0#0#0#31#252#0#31#0#0#0#0#31#248#0#31#0#0#128#0#15#248#0#31#0 +#0#128#0#15#240#0#31#0#0#128#0#3#224#0#31#0#0#128#0#0#0#0'?'#0#0#128#0#0#0#0 +'?'#0#0#192#0#0#0#0#127#0#0#192#0#0#0#0#127#0#0#192#0#0#0#0#255#0#0#192#0#0#0 +#0#255#0#0#192#0#0#0#0#255#0#0#224#0#0#0#1#255#0#0#224#0#0#0#7#255#0#0#248#0 +#0#0#31#255#0#0#255#248#0#1#255#255#0#0#255#255#255#255#255#255#0#0#255#255 +#255#255#255#255#0#0#255#255#255#255#255#255#0#0#255#255#255#255#255#255#0#0 +#255#255#255#255#255#255#0#0#255#255#255#255#255#255#0#0#255#255#255#255#255 +#255#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1#0' '#0#0#0#0#0#128#16#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0'vvv'#0'{{{'#0'ZZZ'#0#143#143#143#2#148#148#148#2#146#146#146#2 +#146#146#146#2#146#146#146#2'nnn'#2#0#0#0#0#0#0#0#0'fff'#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#187#187#187#0'[[[' +#0'{{{'#2'aaa'#0#141#141#141#0#140#140#140#0#141#141#141#0#141#141#141#0#141 +#141#141#0#139#139#139#0'ccc'#0'aa`'#3'lko'#2#147#148'y'#3'y|O'#3'oq<'#3'uxE' +#3#139#141'j'#3#165#166#153#3#173#173#173#3#171#171#171#3#172#172#172#3#174 +#174#174#3#149#149#149#1#164#164#164#0#166#166#166#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#138#138#138#0#161#161#161#1'SSS'#2'ooo'#0'WWW'#10#133#133 +#133'.'#137#137#137','#135#135#135'-'#135#135#135'-'#135#135#135','#134#134 +#134',\\Y'#2'YYO'#0'nnj'#0#137#137'y'#0'qrP'#0'fh;'#0'kmE'#0#130#130'k'#0#166 +#166#169#0#195#193#215#0#193#192#208#0#180#180#182#0#180#180#179#0#151#151 +#151#0#157#157#157#0#157#157#157#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#141#141#141#1#158#158#158#0#159#159#159#0#135#135#135'O'#146#146#146#214#167 +#167#167#254#170#170#170#254#169#169#169#255#170#170#170#255#170#170#170#253 +#172#172#172#255#155#155#157#197#164#164#171#153#159#158#163#156#142#141#137 +#153'yyj'#146'ss]'#147'wxd'#147#133#133'|'#147#152#152#157#147#166#166#179 +#147#168#167#176#146#161#161#160#144#158#158#156#147#139#139#139'&'#143#143 +#143#0#153#153#153#1#143#143#143#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#150#150 +#150#3#145#145#145#27#163#163#163#164#164#164#164#255#159#159#159#255#172#172 +#172#254#171#171#171#255#172#172#172#255#172#172#172#255#171#171#170#255#175 +#175#176#255#155#155#148#255'~'#129'Y'#255'rv*'#255'sx'#21#255'u|'#12#255'v}' +#8#255'v|'#10#255'v{'#17#255'y~%'#255#131#134'K'#255#152#153#132#255#172#172 +#176#255#177#177#182#255#157#157#156#156#191#191#191#0#187#187#187#2#151#151 +#156#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#159#159#159#0#151#151#151#138#164#164 +#164#255#163#163#163#251#158#158#158#253#173#173#173#254#170#170#170#254#171 +#171#171#254#171#171#171#254#170#169#167#254#177#176#184#254#137#140'_'#252 +'u}'#0#251#141#150#0#251#146#156#0#251#148#157#0#251#148#158#0#251#148#158#0 +#251#147#156#0#251#143#153#0#251#136#145#0#251#127#135#0#251#129#135'%'#249 +#157#157#137#251#172#171#183#241#160#160#158#20#146#145#153#0#151#150#169#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#201#201#201#0#157#157#157#181#167#167#167#252 +#161#161#161#251#160#160#160#255#173#173#173#254#173#173#173#255#176#176#176 +#255#176#176#176#255#173#173#170#255#174#174#184#255#154#157'i'#255#145#155#3 +#255#145#154#5#255#144#153#0#255#142#151#0#255#140#150#0#255#141#150#0#255 +#143#152#0#255#145#155#0#255#147#156#0#255#148#157#0#255#144#154#0#254#133 +#142#0#251#146#150'X'#255#150#150#156'r'#163#164#158#0#166#167#151#3'ttr'#0#0 +#0#0#0#0#0#0#0#0#0#0#0#244#244#244#5#160#160#160#213#166#166#166#255#160#160 +#160#253#163#163#163#255#178#178#178#255#178#178#178#255#179#179#179#255#179 +#179#179#255#178#178#176#255#181#180#189#255#154#156'p'#255#135#145#0#255#140 +#150#0#255#139#148#5#255#146#153'('#255#151#156'<'#255#149#155';'#255#142#148 +'"'#255#135#143#6#255#136#144#11#255#136#144#15#255#136#144#19#255#140#147#22 +#252#133#141#22#254'}'#127'Q'#215'bg;'#2'lpA'#0'vvt'#0'EEE'#0'777'#0#0#0#0#0 +']]].'#162#162#162#232#169#169#169#255#163#163#163#254#168#168#168#255#181 +#181#181#255#178#178#178#255#179#179#179#255#179#179#179#255#178#178#178#255 +#183#183#184#255#158#158#151#255#137#139'l'#255#140#142'e'#255#141#142'}'#255 +#147#146#152#255#155#155#164#255#154#153#163#255#140#140#144#255#131#131'{' ,#255#147#147#142#255#147#148#146#255#146#146#146#254#146#145#149#254#144#144 +#148#252#142#142#140#255'ut~'#149'{z'#136#11#138#138#137#12''''''''#2'LLL'#2 +#255#255#255#1#133#133#133'`'#164#164#164#244#175#175#175#255#167#167#167#253 +#170#170#170#255#180#180#180#255#178#178#178#255#180#180#180#255#179#179#179 +#255#179#179#179#255#182#182#182#255#162#162#163#255#152#152#158#255#150#150 +#158#255#130#129#133#254#132#132#130#254#137#137#134#254#141#141#138#254#138 +#138#137#254#136#136#138#254#136#136#137#255#132#132#132#254#133#133#132#255 +'zzy'#255#143#143#142#254#163#163#163#253#160#160#157#255#164#165#162#224#166 +#166#166#225#148#148#148#160#197#197#197#0#173#173#173#5#141#141#141#145#169 +#169#169#249#175#175#175#255#167#167#167#254#169#169#169#255#181#181#181#255 +#179#179#179#255#179#179#179#255#180#180#180#255#178#178#178#255#182#182#182 +#254#163#163#162#255#143#143#141#254#140#140#137#251#147#147#146#251#156#156 +#156#251#155#155#155#251#159#159#159#252#151#151#150#253'yyx'#253#127#127'~' +#255#127#128#127#254'}}|'#255#139#139#139#254#174#173#176#255#177#176#180#254 +#176#175#179#252#175#175#179#255#176#175#177#255#171#171#172#255#151#151#153 +'|'#154#154#154#6#150#150#150#186#172#172#172#251#174#174#174#255#167#167#167 +#255#168#168#168#255#182#182#182#255#178#178#179#255#179#179#179#255#179#179 +#179#255#178#178#178#255#181#181#181#255#168#168#168#255#177#177#177#255#154 +#154#154#255#133#133#133#255#135#135#135#255#132#132#132#255'{{{'#255'vvv' +#255'rrr'#255'www'#255'www'#255'~~'#127#254#163#163#160#255#161#162#148#254 +#159#160#147#254#160#161#146#254#157#157#144#253#155#155#155#229#157#157#157 +#225#154#154#151#236'~~~l'#154#154#154#207#173#173#173#252#176#176#176#255 +#169#169#169#254#169#169#168#255#182#182#180#255#179#179#177#255#180#180#178 +#255#180#180#178#255#179#179#178#255#181#181#181#254#172#172#172#254#184#184 +#184#251#137#137#137#142'mmms|||giiiZ'#182#182#182'K'#182#182#182'B'#161#161 +#161#212#178#178#178#255#179#179#178#251#186#186#188#255#172#173#163#255#133 +#141#9#255#138#147#2#254#139#148#2#252#131#139#1#254'ou'#13'Ylr'#6#10'rx'#7 +#14'lll'#14#155#155#155#210#172#172#172#253#168#168#168#255#162#162#162#255 +#168#168#170#255#181#180#190#255#178#178#187#255#179#179#188#255#179#178#187 +#255#178#177#184#255#177#177#176#250#170#170#170#254#168#168#168#188#219#219 +#219#0#223#223#223#0'555'#0'qqq'#0#183#183#183#0#186#186#186#0#164#164#164'c' +#192#192#192#255#194#194#193#250#194#194#192#254#190#189#196#255#144#151'"' +#255#143#153#0#255#144#152#0#250#145#154#0#255#148#157#6'y'#147#156#1#0#146 +#156#0#0'ppp'#0#155#155#155#203#170#170#170#252#157#157#155#255#161#161#165 +#254#156#157#135#255#144#150'7'#255#144#150'6'#255#144#150'4'#255#143#149'1' +#255#145#149'P'#255#174#174#178#249#179#179#178#254#170#170#170#144#196#196 +#196#4#195#195#195#5#154#154#154#3'~~~'#3#155#155#155#4#155#155#155#2#151#151 +#151';'#186#186#186#254#191#191#191#252#191#191#189#253#190#190#198#255#145 +#151'/'#255#141#151#0#254#143#151#1#251#143#152#0#255#146#156#3#136#145#154#0 +#0#145#154#0#4#0#0#0#0#152#152#152#172#169#169#169#251#163#163#160#255#178 +#178#185#255#168#169#138#255#141#151#0#255#142#152#0#255#142#151#0#255#142 +#152#0#255#142#150#25#255#189#189#194#250#195#195#194#255#174#174#173#177#232 +#232#232#0#211#211#211#3#189#189#189#0#138#138#138#0#178#178#178#3#178#178 +#178#0#159#159#159'V'#190#190#190#255#191#191#191#250#192#192#191#254#188#187 +#193#255#142#149#30#255#143#152#0#255#143#152#0#250#143#152#0#254#146#155#6 +#129#143#153#0#0#144#153#0#4#0#0#0#0#143#143#143'y'#169#169#169#248#161#161 +#161#255#174#174#177#254#171#171#160#255#146#155#13#255#142#151#2#255#143#152 +#2#255#144#154#2#255#138#147#5#255#175#176#160#253#195#195#198#252#182#182 +#181#246#146#146#146'.'#166#166#166#0#185#185#185#0'xxx'#1#209#209#209#0#196 +#196#196#0#171#171#171#195#188#188#188#254#189#189#188#251#195#195#197#255 +#176#177#164#255#137#146#3#255#144#153#0#254#142#151#0#251#148#157#11#255#164 +#171'%_'#161#168'$'#0#159#166#30#3#0#0#0#0'mmm='#168#168#168#236#162#162#162 +#255#173#173#172#253#175#174#180#255#158#164':'#255#141#151#0#255#144#153#1 +#255#144#152#2#255#141#150#0#255#149#154'M'#255#183#182#194#252#179#179#174 +#255#170#170#170#224#180#180#180'G'#180#180#180#5#189#189#189#0#171#171#171 +'#'#155#155#155#168#179#179#179#255#178#178#178#252#179#179#174#255#190#189 +#201#254#151#156'O'#255#140#149#0#254#144#153#2#254#142#151#0#254#157#165#30 +#248#163#168'D%'#177#184'H'#0#165#173','#1#0#0#0#0#225#225#225#10#167#167#167 +#216#162#162#162#255#172#172#170#253#174#173#182#255#170#172'{'#255#146#156#2 +#255#142#151#1#255#143#152#0#255#144#153#1#255#136#145#1#254#155#157'~'#255 +#183#183#193#253#181#181#177#255#173#173#171#255#164#164#164#213#183#183#182 +#201#175#175#175#243#181#181#181#255#178#178#176#252#179#179#175#255#183#182 +#194#254#157#159'}'#255#138#147#2#255#144#153#1#255#142#151#0#251#145#154#4 +#254#163#171'*'#191'|'#130' '#0#162#170'('#1#154#165#0#0#0#0#0#0#221#221#221 ,#0#165#165#165#181#163#163#163#254#171#171#170#252#173#173#174#254#174#174 +#174#255#162#168'8'#255#142#151#0#255#143#152#1#255#143#152#0#255#144#153#1 +#254#137#146#7#254#154#156's'#255#179#178#189#253#184#184#191#253#184#184#185 +#255#179#179#178#255#182#182#181#255#181#181#181#251#182#182#188#255#179#179 +#189#254#154#157'u'#254#138#147#7#255#144#153#0#254#143#152#0#254#142#151#0 +#252#153#161#16#253#163#170'7E'#175#182'8'#0#163#170'('#2#162#171#25#0#0#0#0 +#0#172#172#172#0#162#162#162#132#163#163#163#254#168#168#168#251#174#174#173 +#255#173#173#179#255#173#174#146#255#155#163#21#255#141#150#0#255#144#153#1 +#255#143#152#0#255#144#153#0#255#139#148#0#254#142#148'7'#254#159#161#128#254 +#170#170#166#252#175#175#179#251#175#174#178#253#170#170#167#254#159#160#129 +#254#143#148'9'#254#139#148#0#255#144#153#0#255#143#152#0#255#143#152#2#251 +#144#154#0#254#150#157'('#182#148#157#25#0#166#174#30#1#160#168'%'#0#164#172 +'%'#0#0#0#0#0#156#156#156#0#150#150#150'I'#165#165#165#254#164#164#164#252 +#174#174#175#254#173#173#171#254#173#173#181#254#171#175#128#255#152#161#13 +#255#141#150#0#255#143#152#1#255#144#153#1#255#145#154#1#255#142#152#0#255 +#138#147#0#255#138#146#12#255#139#146#29#255#139#146#30#255#138#145#13#255 +#138#147#0#255#142#152#0#254#144#153#1#254#143#152#0#254#143#152#0#253#140 +#150#0#248#158#164'@'#255#155#155#162'\'#169#170#158#0#166#168#132#3#163#171 +'0'#0#0#0#0#0#0#0#0#0#154#154#154#0#146#146#146#18#169#169#169#244#170#170 +#170#255#176#176#176#251#172#172#172#251#172#172#171#251#173#172#183#251#171 +#174#132#251#154#162#24#252#141#151#0#253#142#151#0#254#143#152#1#254#144#153 +#1#254#145#154#1#254#144#154#0#255#144#153#0#254#144#153#0#254#144#154#0#254 +#145#154#0#254#144#152#1#252#143#152#0#251#143#152#0#254#143#153#0#255#164 +#169'K'#255#178#178#179#242#134#133#145#19#142#141#167#0#158#156#196#0#0#0#0 +#0#0#0#0#0#0#0#0#0#193#193#193#4#186#186#186#0#165#165#165'g'#158#158#158#236 +#178#178#178#255#179#179#179#255#177#177#177#255#177#177#175#255#176#175#183 +#255#175#175#159#255#164#169'N'#255#150#158#13#255#143#153#0#255#143#152#0 +#254#143#152#0#252#142#152#0#252#142#151#0#252#142#151#0#252#142#152#0#253 +#143#152#0#255#144#153#0#255#146#155#3#255#147#155#27#255#158#162'd'#217#172 +#170#188#142#167#167#178'0'#141#141#133#0#160#161#142#0#160#159#181#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0'{{{'#1#151#151#151#0'jjj'#25#150#150#150'L'#152#152 +#152'f'#168#168#168#129#162#162#162#157#170#170#168#183#170#170#175#205#174 +#173#182#224#170#172#143#240#161#166'T'#250#152#159'('#255#148#156#19#255#147 +#156#12#255#148#157#11#255#148#156#11#255#149#157#13#255#149#157#17#241#144 +#152#21#201#135#141'('#136'y{Y@ljv'#6#173#170#203#0#228#227#231#0#0#0#0#0#155 +#156#152#0#153#153#153#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#130#130#130#0#166 +#166#166#2'kkk'#0#166#166#166#0#180#180#180#0#178#178#178#0#251#252#252#0#202 +#202#199#0#0#0#0#0#18#20#0#8'wr'#188#22#148#144#210'%'#149#149#150'3'#137#141 +'OC'#140#146'.P'#149#156'-Y'#146#152'+T'#149#155'-<'#136#140':'#25'ruD'#0'y|' +'('#0'JU'#0#0#138#169#0#0#181#177#215#3#215#215#220#2#247#247#253#0#169#169 +#169#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#150#150#150#0#165#165#165#0'g' +'gg'#1#167#167#167#3#184#184#184#3#185#185#185#3#255#255#255#2#200#200#199#1 +#0#0#0#0#0#0#0#0#135#131#215#0#156#152#213#0#151#150#146#0#149#155'E'#0#148 +#154'+'#0#157#164'*'#0#153#160')'#0#155#162'.'#0#150#156'5'#0'sv@'#0'x{+'#3 +#128#136#6#2'tx-'#0#193#191#211#0#218#218#221#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#145#144#147#2#131#130#134#2#149#156'5' +#3#154#161'"'#3#160#168'"'#3#156#164' '#3#153#160'#'#2#0#0#0#1#0#0#0#0#138 +#143'&'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#240 +#0#0#255#192#0#0#127#128#0#0#127#128#0#0'?'#128#0#0'?'#128#0#0#31#0#0#0#3#0#0 +#0#1#0#0#0#0#0#0'`'#7#0#7#224#7#0#7#240#7#0#7#224#7#0#7#224#7#128#3#192#15 +#128#0#0#15#128#0#0#31#128#0#0#31#192#0#0#31#192#0#0'?'#192#0#0#127#248#0#3 +#255#255#254'?'#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255'('#0#0#0#24#0#0#0'0'#0#0#0#1#0' '#0#0#0#0#0'`'#9#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#167#167#167 +#0#165#165#165#0#0#0#0#1#177#177#177#2#179#179#179#2#179#179#179#2#181#181 +#181#2#0#0#0#1#193#193#193#0#183#183#183#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'ccc'#0 +#155#155#155#0#145#145#145#2#129#129#129#0#160#160#160#0#161#161#161#0#161 +#161#161#0#163#163#163#0#145#145#145#0#164#164#173#0#198#196#225#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#0#0#133#133#133#0'{{{'#0'LLL'#0#184#184 +#184#0#0#0#0#0#0#0#0#0#0#0#0#0#142#142#142#0#163#163#163#0#130#130#130#0'{{{' +'$'#153#153#153'H'#154#154#154'E'#153#153#153'E'#155#155#155'H'#138#139#138 +'&'#162#162#170#0#216#213#255#0#0#0#0#0#3','#0#0#0#0#0#0#0#0#0#0'V`'#0#0#0#0 +#0#0#0#0#0#0#218#218#216#0#238#238#233#0#172#172#172#0#0#0#0#0#0#0#0#0#0#0#0 +#0#154#154#154#2#162#162#162#11#150#150#150'~'#156#156#156#246#171#171#171 +#255#171#171#171#255#170#170#170#255#173#173#173#255#163#163#164#247#151#151 +#144#215#135#137'h'#216'tx;'#212'qu.'#211'uy<'#211#130#133']'#211#151#152#142 +#211#169#169#179#209#170#169#174#211#147#147#146'1'#152#152#151#0#168#168#168 +#1#156#157#145#0#0#0#0#0#0#0#0#0#198#198#198#0#157#157#157#171#164#164#164 +#255#162#162#162#254#172#172#172#252#170#170#170#253#170#170#168#253#175#175 +#180#252#151#152#131#255'sz'#8#255#130#138#0#255#137#146#0#255#139#148#0#255 +#137#146#0#255#133#141#0#255#131#138#15#255#139#143'A'#255#163#163#150#255 +#166#165#175#159#196#196#200#0#187#187#187#2#145#146'x'#0#147#147#147#0#0#0#0 +#0#204#204#204#13#163#163#163#226#163#163#163#252#162#162#162#252#174#174#174 +#255#176#176#176#254#175#175#174#254#177#176#185#255#158#160'z'#254#143#153#0 +#253#147#157#0#253#144#153#0#253#143#153#0#253#144#154#0#253#147#156#0#253 +#145#155#0#253#139#150#0#251#135#144#0#253#146#150'Z'#243#172#169#213#20#167 +#166#201#2#150#152#131#4#147#147#147#1#0#0#0#0'wwwC'#164#164#164#239#163#163 +#163#254#167#167#167#253#180#180#180#254#179#179#179#255#179#179#178#255#183 +#182#187#255#163#164#146#255#134#140'%'#255#138#144'('#255#146#150'Y'#255#156 +#158'v'#255#147#150'e'#255#132#136'<'#255#140#144'F'#255#142#146'O'#254#143 +#148'M'#252#135#138'P'#255'tti'#139'yzh'#0#129#131'g'#0#129#129#129#0#161#161 +#161#1#145#145#145#127#168#168#168#248#169#169#169#255#171#171#171#254#181 +#181#181#255#178#178#178#255#178#178#178#255#182#182#181#254#167#167#169#255 +#147#146#155#254#141#140#149#252#135#134#146#252#144#144#153#252#144#144#154 +#251#136#135#147#253#141#140#152#255#139#139#150#254#130#129#142#254#149#149 +#155#254#157#157#156#255#154#154#156#177#154#154#159#164#129#129#129#24#135 +#135#133#0#151#151#151#179#172#172#172#252#170#170#170#255#170#170#170#254 +#180#180#180#255#178#178#179#255#178#178#178#255#181#181#182#255#169#169#169 +#255#149#149#148#255#139#139#138#255#149#149#147#255#148#148#147#255#144#144 +#142#255'zzx'#255'vvt'#255'ttr'#255#138#138#137#255#175#174#186#255#175#175 +#187#254#175#174#184#255#175#175#181#255#162#161#169#213#161#161#169','#158 +#158#158#214#174#174#174#253#171#171#171#255#170#170#170#255#181#181#179#255 +#179#179#177#255#179#179#178#255#181#181#180#254#175#175#175#255#178#178#178 +#253#149#149#149#215'zzz'#204#131#131#131#193#151#151#151#177#135#135#135#232 +#145#145#144#255#150#150#153#253#164#165#154#255#146#151'L'#254#148#153'I' +#254#142#146'J'#250#127#129'_'#135#127#129'Z'#131'wzMN'#161#161#161#223#171 +#171#171#254#164#164#164#255#169#168#171#254#180#179#187#255#177#177#185#255 +#178#177#184#255#177#177#179#251#173#173#172#255#168#168#168#163#190#190#190 +#0#170#170#170#0#192#192#192#0#187#187#187#0#170#170#170']'#194#194#194#255 +#198#198#200#252#185#185#181#254#139#148#4#254#141#151#0#253#140#150#0#254 +#136#144#0'.'#136#145#0#0#139#148#0#0#163#163#163#214#164#164#163#253#163#162 +#169#255#158#160'}'#255#144#150')'#255#145#151'*'#255#141#148'$'#255#160#162 +'|'#251#184#183#190#254#170#170#167'n'#183#183#183#0#190#190#190#3#192#192 +#192#3#164#164#164#4#157#157#157'.'#188#188#188#254#191#192#191#254#188#188 +#191#253#144#152#29#255#143#152#2#252#144#153#2#254#148#157#5'Q'#146#156#0#3 +#147#157#0#4#159#159#159#176#165#165#163#252#173#172#181#255#167#170#129#254 +#141#150#0#255#143#152#0#255#139#149#0#255#158#162'V'#251#198#197#210#255#177 +#177#172#177#207#207#207#0#204#204#204#0#194#194#194#0#188#188#188#0#167#167 +#167'n'#189#189#189#255#195#194#197#251#182#182#176#254#140#149#8#254#143#152 +#0#253#145#154#4#255#160#167#27'>'#154#162#20#0#152#161#14#2#154#154#154'r' +#164#164#164#247#169#169#171#255#174#174#166#254#148#156#16#255#142#151#2#255 +#143#153#1#255#142#149#21#254#179#178#182#252#182#182#184#255#157#157#155'|' +#159#159#159#13#168#168#168#5#170#170#170'O'#176#176#175#240#179#180#176#253 +#191#190#206#253#161#164'j'#255#139#149#0#253#142#151#0#254#154#163#24#241 +#153#160'E'#19#178#184'N'#0#171#179'0'#0#148#148#148'+'#164#164#164#234#168 +#168#166#255#176#175#185#253#163#168'Q'#255#141#151#0#255#144#153#2#255#141 ,#150#0#255#145#150'C'#254#179#178#191#254#183#183#189#255#175#175#174#232#174 +#175#173#222#176#176#175#255#181#181#182#255#183#182#197#254#163#164#141#255 +#139#148#8#255#143#152#0#251#145#154#2#255#161#168'&'#166#137#147#20#0#152 +#160#27#2#171#178'/'#0#211#211#211#0#163#163#163#205#166#166#165#254#174#174 +#178#252#174#175#162#254#154#162#25#255#140#150#0#255#145#153#3#254#140#150#0 +#255#143#149'1'#254#166#167#148#253#178#178#184#255#180#180#190#255#179#179 +#189#254#173#173#172#254#155#158'i'#255#139#147#6#254#144#153#0#254#141#151#0 +#252#147#156#8#246#164#173'.%'#162#169')'#0#163#171'%'#1#166#174'%'#0#174#174 +#174#0#161#161#161#158#165#165#165#254#173#173#171#248#173#172#180#252#172 +#174#137#253#150#159#11#253#140#150#0#254#144#153#2#254#143#152#0#254#139#148 +#0#254#143#150' '#253#146#152'7'#252#145#150'0'#254#140#148#16#254#140#149#0 +#254#144#153#0#252#140#150#0#249#147#156#7#255#159#162'c'#186#177#187'K'#0 +#171#177'\'#1#164#172')'#0#0#0#0#0#174#174#174#0#167#167#167'P'#168#168#168 +#255#176#176#176#255#174#175#173#255#175#175#183#255#172#174#143#255#154#162 +'$'#255#142#152#0#254#142#151#0#253#144#153#0#252#143#152#0#251#142#151#0#251 +#142#152#0#251#143#153#0#254#144#153#0#255#143#153#1#255#148#156#28#255#170 +#172#135#239#173#171#196'O'#178#176#196#1#188#189#188#1#163#170'('#0#0#0#0#0 +#187#187#187#1#163#163#163#1#135#135#135'T'#167#167#167#163#174#174#174#189 +#170#170#168#213#174#174#182#233#173#173#169#248#166#170'f'#255#153#160'(' +#255#147#155#13#255#145#154#7#255#146#155#6#255#146#154#7#255#146#155#8#255 +#143#151#13#233#142#149'('#175#147#150'rb'#151#152#145#24#165#165#171#0#148 +#149#138#0#188#188#186#0#0#0#0#0#0#0#0#0#190#190#190#0#188#188#188#0#169#169 +#169#0#186#186#186#0#212#212#213#0#1#1#7#0'y|H'#12#127#127#138#28#170#166#231 +'.'#161#161#164'A'#152#156'NS'#144#151'&b'#150#157'"k'#146#153'#_'#141#147'$' +'9'#130#135'('#15'E>'#146#0#182#181#191#0#187#173#255#0#170#169#183#0#160#159 +#165#0#189#190#184#0#0#0#0#0#0#0#0#0#204#204#204#0#0#0#0#0'uuu'#2#180#180#180 +#2#207#207#207#1'BBC'#0#142#143#137#0#144#143#152#0#172#169#213#0#166#167#155 +#0#155#160'B'#0#153#161#30#0#154#162#28#0#151#159#30#0#149#156'#'#0#130#134 +')'#0'][^'#1'}'#132#22#2'dp'#0#0#195#195#199#0#183#183#185#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#180#180#179 +#1#188#187#196#2#174#176#138#2#161#169''''#2#152#160#27#3#155#163#23#3#155 +#164#24#3#159#167#27#2#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#192#0'?'#0#128#0#31#0#128#0#31#0#128#0 +#15#0#0#0#3#0#0#0#1#0#0#0#1#0#0'<'#7#0#0'>'#3#0#0'<'#7#0#0#28#7#0#128#0#7#0 +#128#0#15#0#128#0#15#0#128#0#31#0#192#0'?'#0#255#195#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0'('#0#0#0#16#0#0#0' '#0#0#0#1#0' '#0#0#0#0#0'@'#4#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#180#180#180#0#215#215#215#0#0#0#0#6#176#176 +#176#9#177#177#177#9#170#170#170#7#205#205#206#4#181#182#176#4#148#149#127#3 +#167#168#165#3#169#169#170#4#0#0#0#3#0#0#0#0#159#159#159#0#152#152#152#0#0#0 +#0#0#161#161#161#0#172#172#172#1#150#150#150#0#167#167#168#0#167#167#166#0 +#169#169#174#0#191#189#228#0#156#154#181#0'hf~'#0#141#138#191#0#182#178#255#0 +#158#158#158#0#138#138#138#0#138#138#136#0#147#147#147#0#0#0#0#0#164#164#164 +#0#168#168#168#0#147#147#147'F'#164#164#164'd'#164#164#163'd'#161#161#164'T' +#180#179#203')'#159#157#176'''jh~%'#135#132#176'%'#171#167#233'&'#159#159#172 +'"~~w'#0#130#132'h'#0#144#147'^'#0#0#0#0#0#152#152#152#17#160#160#160#165#162 +#162#162#255#171#171#171#255#172#172#174#255#163#163#157#255#135#139'B'#254 +#131#138#29#253#128#134#13#252#132#138' '#252#143#147'N'#250#163#164#152#248 +#160#159#166'8'#167#165#186#3#173#173#182#4#0#0#0#0#152#152#152'\'#162#162 +#162#254#166#166#166#252#176#176#175#250#178#177#183#250#164#165#145#251#136 +#146#0#254#145#154#0#254#147#155#16#255#142#151#0#255#138#148#0#250#141#148 +#26#255#143#146'f'#160#153#159'I'#0#149#155'G'#0#251#251#251#2#157#157#157 +#161#166#166#166#250#172#172#172#254#180#180#180#255#181#181#182#254#172#172 +#170#255#141#143'q'#253#140#141'}'#252#149#149#149#254#137#138'}'#253#139#140 +'}'#254#137#138'z'#253#144#145#133#247#146#149'r{'#145#147'oA'#154#154#157#0 +#163#163#163#212#172#172#172#253#173#173#173#255#180#180#180#254#180#180#180 +#255#176#176#176#255#153#153#159#255#137#137#140#255#141#141#141#255#129#129 +#132#255'zz~'#255#141#141#142#254#167#168#161#254#165#165#165#255#158#158#173 +#228#163#162#157'Z'#167#167#167#235#169#169#168#253#170#170#172#255#178#178 +#180#255#177#177#179#252#176#176#175#254#167#167#166#159#155#155#153'A'#169 +#169#169'1'#161#161#158's'#181#181#184#254#178#179#162#251#141#149#13#254#139 +#148#7#232'{'#129#29'%'#148#155#19#29#163#163#158#225#166#165#174#254#158#161 ,'o'#255#143#151#29#254#144#151'%'#250#180#180#176#255#177#177#180'U'#193#193 +#199#0#180#180#179#0#170#170#167')'#194#194#195#255#186#187#179#253#143#151#7 +#254#144#153#0#244#158#167#12#24#154#163#18#0#160#160#153#173#168#168#175#252 +#168#170#128#255#142#152#0#255#139#149#0#253#170#172#133#254#183#183#196#207 +#187#187#186'('#184#184#181#27#172#172#166#176#188#187#200#254#169#171#127 +#250#139#149#0#254#151#159#17#221#137#144'7'#7#133#142#19#2#153#153#152'a' +#165#165#165#244#174#174#176#254#154#161'*'#254#141#150#0#255#142#150#23#254 +#167#169#146#255#175#174#184#247#179#179#189#241#181#180#191#255#167#168#146 +#254#142#150#18#248#143#152#0#253#154#162#26#133#138#147#10#0#149#158#14#8 +#163#163#163#18#166#166#164#230#173#173#178#255#172#173#148#253#149#158#18 +#252#140#150#0#251#140#149#0#248#151#157'>'#253#155#159'U'#254#149#155'8'#248 +#140#149#0#253#142#152#0#255#152#159'-'#253#164#168#128#23#176#176#138#0#165 +#169'i'#2#176#176#176#0#153#153#153'~'#170#170#168#232#174#174#180#247#171 +#173#151#255#156#162';'#255#146#155#12#255#142#152#0#255#142#151#0#255#143 +#152#0#255#143#152#8#251#150#156'3'#204#166#168#137'k'#180#186#144#0#183#184 +#142#1#150#167#0#0#255#255#255#1#0#0#0#0'ssw'#14#145#146#134'"'#155#154#173 +'7'#175#174#189'M'#159#163'Pb'#145#152'"s'#149#156#29'y'#149#156#30'^'#140 +#146'&+'#143#148';'#0#153#161'('#0'jW='#0#186#187't'#0#143#160#0#0#208#208 +#208#0'III'#2#0#0#0#0#161#161#154#0#170#168#200#0#179#177#200#0#159#163'T'#0 +#149#157#17#0#150#158#14#0#148#156#18#0#140#146')'#0#143#147'G'#0#162#168'<' +#3'}ci'#0#165#173'A'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2#187#187#185#4#183#183 +#188#6#181#181#169#8#162#168'E'#9#149#157#9#10#148#157#10#10#145#154#1#9#144 +#151#25#5#151#159#29#0#157#165#28#0#155#160'N'#0#0#0#0#0#0#0#0#0#255#255#0#0 +#255#255#0#0#227#255#0#0#128#15#0#0#0#7#0#0#0#3#0#0#0#0#0#0#1#131#0#0#1#195#0 +#0#1#131#0#0#0#3#0#0#128#7#0#0#128#7#0#0#252'?'#0#0#255#255#0#0#255#255#0#0 ]); mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.lpr0000664000175000017500000000103011477456024021752 0ustar michaelmichaelprogram dcm2niigui; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset Forms { add your units here }, gui, nifti_form, pref_form; {$IFNDEF UNIX} {$IFDEF FPC} {$R manifest.res} {$ELSE} {$R *.res} {$ENDIF} {$ENDIF} //{$R dcm2niigui.res} begin Application.Initialize; Application.CreateForm(TMainForm, MainForm); Application.CreateForm(TNIfTIForm, NIfTIForm); Application.CreateForm(TPrefsForm, PrefsForm); Application.Run; end. mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.lpi0000664000175000017500000003766211660466164021765 0ustar michaelmichael <Icon Value="0"/> <ActiveWindowIndexAtStart Value="0"/> </General> <VersionInfo> <StringTable ProductVersion=""/> </VersionInfo> <BuildModes Count="1"> <Item1 Name="default" Default="True"/> </BuildModes> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <RequiredPackages Count="1"> <Item1> <PackageName Value="LCL"/> </Item1> </RequiredPackages> <Units Count="41"> <Unit0> <Filename Value="dcm2niigui.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="dcm2niigui"/> <EditorIndex Value="5"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="2" Y="1"/> <UsageCount Value="57"/> <Loaded Value="True"/> </Unit0> <Unit1> <Filename Value="gui.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="MainForm"/> <ResourceBaseClass Value="Form"/> <UnitName Value="gui"/> <EditorIndex Value="0"/> <WindowIndex Value="0"/> <TopLine Value="768"/> <CursorPos X="1" Y="770"/> <UsageCount Value="57"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> </Unit1> <Unit2> <Filename Value="dcm2niigui.lrs"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="8"/> </Unit2> <Unit3> <Filename Value="nifti_form.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="NIfTIForm"/> <ResourceBaseClass Value="Form"/> <UnitName Value="nifti_form"/> <TopLine Value="1"/> <CursorPos X="102" Y="2"/> <UsageCount Value="57"/> </Unit3> <Unit4> <Filename Value="pref_form.pas"/> <IsPartOfProject Value="True"/> <ComponentName Value="PrefsForm"/> <ResourceBaseClass Value="Form"/> <UnitName Value="pref_form"/> <EditorIndex Value="1"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="101" Y="146"/> <UsageCount Value="57"/> <Loaded Value="True"/> <LoadedDesigner Value="True"/> </Unit4> <Unit5> <Filename Value="parconvert.pas"/> <UnitName Value="parconvert"/> <TopLine Value="91"/> <CursorPos X="13" Y="93"/> <UsageCount Value="16"/> </Unit5> <Unit6> <Filename Value="pref_form.lrs"/> <TopLine Value="1"/> <CursorPos X="4" Y="36"/> <UsageCount Value="9"/> </Unit6> <Unit7> <Filename Value="..\..\lcl\lresources.pp"/> <UnitName Value="LResources"/> <TopLine Value="2628"/> <CursorPos X="21" Y="2642"/> <UsageCount Value="8"/> </Unit7> <Unit8> <Filename Value="dialogsx.pas"/> <UnitName Value="dialogsx"/> <TopLine Value="1"/> <CursorPos X="33" Y="9"/> <UsageCount Value="9"/> </Unit8> <Unit9> <Filename Value="readint.pas"/> <UnitName Value="readint"/> <TopLine Value="1"/> <CursorPos X="15" Y="7"/> <UsageCount Value="9"/> </Unit9> <Unit10> <Filename Value="readint.lrs"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="9"/> </Unit10> <Unit11> <Filename Value="usr\local\share\lazarus\lcl\nonwin32\messages.pp"/> <UnitName Value="Messages"/> <TopLine Value="1"/> <CursorPos X="90" Y="12"/> <UsageCount Value="8"/> </Unit11> <Unit12> <Filename Value="define_types.pas"/> <UnitName Value="define_types"/> <TopLine Value="1"/> <CursorPos X="40" Y="2"/> <UsageCount Value="9"/> </Unit12> <Unit13> <Filename Value="paramstrs.pas"/> <UnitName Value="paramstrs"/> <EditorIndex Value="4"/> <WindowIndex Value="0"/> <TopLine Value="75"/> <CursorPos X="99" Y="92"/> <UsageCount Value="19"/> <Loaded Value="True"/> </Unit13> <Unit14> <Filename Value="niftiutil.pas"/> <UnitName Value="niftiutil"/> <EditorIndex Value="9"/> <WindowIndex Value="0"/> <TopLine Value="162"/> <CursorPos X="1" Y="155"/> <UsageCount Value="18"/> <Loaded Value="True"/> </Unit14> <Unit15> <Filename Value="prefs.pas"/> <UnitName Value="prefs"/> <EditorIndex Value="3"/> <WindowIndex Value="0"/> <TopLine Value="184"/> <CursorPos X="66" Y="210"/> <UsageCount Value="19"/> <Loaded Value="True"/> </Unit15> <Unit16> <Filename Value="dicom.pas"/> <UnitName Value="dicom"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> <UsageCount Value="8"/> </Unit16> <Unit17> <Filename Value="dicomtypes.pas"/> <UnitName Value="dicomtypes"/> <EditorIndex Value="8"/> <WindowIndex Value="0"/> <TopLine Value="636"/> <CursorPos X="51" Y="673"/> <UsageCount Value="12"/> <Loaded Value="True"/> </Unit17> <Unit18> <Filename Value="filename.pas"/> <UnitName Value="filename"/> <EditorIndex Value="2"/> <WindowIndex Value="0"/> <TopLine Value="118"/> <CursorPos X="55" Y="131"/> <UsageCount Value="13"/> <Loaded Value="True"/> </Unit18> <Unit19> <Filename Value="userdir.pas"/> <UnitName Value="userdir"/> <TopLine Value="32"/> <CursorPos X="64" Y="45"/> <UsageCount Value="8"/> </Unit19> <Unit20> <Filename Value="gzio2.pas"/> <UnitName Value="gzio2"/> <TopLine Value="762"/> <CursorPos X="26" Y="788"/> <UsageCount Value="8"/> </Unit20> <Unit21> <Filename Value="nii_crop.pas"/> <UnitName Value="nii_crop"/> <TopLine Value="36"/> <CursorPos X="1" Y="1"/> <UsageCount Value="8"/> </Unit21> <Unit22> <Filename Value="..\common\userdir.pas"/> <UnitName Value="userdir"/> <TopLine Value="1"/> <CursorPos X="1" Y="15"/> <UsageCount Value="14"/> </Unit22> <Unit23> <Filename Value="..\common\define_types.pas"/> <UnitName Value="define_types"/> <EditorIndex Value="10"/> <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="62" Y="9"/> <UsageCount Value="17"/> <Loaded Value="True"/> </Unit23> <Unit24> <Filename Value="..\common\gziod.pas"/> <UnitName Value="gziod"/> <TopLine Value="311"/> <CursorPos X="98" Y="322"/> <UsageCount Value="8"/> </Unit24> <Unit25> <Filename Value="convert.pas"/> <UnitName Value="convert"/> <IsVisibleTab Value="True"/> <EditorIndex Value="6"/> <WindowIndex Value="0"/> <TopLine Value="91"/> <CursorPos X="88" Y="110"/> <UsageCount Value="16"/> <Loaded Value="True"/> </Unit25> <Unit26> <Filename Value="..\common\gzio2.pas"/> <UnitName Value="gzio2"/> <EditorIndex Value="7"/> <WindowIndex Value="0"/> <TopLine Value="647"/> <CursorPos X="8" Y="667"/> <UsageCount Value="10"/> <Loaded Value="True"/> </Unit26> <Unit27> <Filename Value="nii_asl.pas"/> <UnitName Value="nii_asl"/> <TopLine Value="96"/> <CursorPos X="7" Y="212"/> <UsageCount Value="8"/> </Unit27> <Unit28> <Filename Value="..\common\GraphicsMathLibrary.pas"/> <UnitName Value="GraphicsMathLibrary"/> <TopLine Value="1"/> <CursorPos X="10" Y="27"/> <UsageCount Value="8"/> </Unit28> <Unit29> <Filename Value="..\common\dialogsx.pas"/> <UnitName Value="dialogsx"/> <TopLine Value="1"/> <CursorPos X="33" Y="2"/> <UsageCount Value="16"/> </Unit29> <Unit30> <Filename Value="LibTar.pas"/> <UnitName Value="LibTar"/> <TopLine Value="246"/> <CursorPos X="35" Y="272"/> <UsageCount Value="8"/> </Unit30> <Unit31> <Filename Value="untar.pas"/> <UnitName Value="untar"/> <TopLine Value="8"/> <CursorPos X="38" Y="12"/> <UsageCount Value="8"/> </Unit31> <Unit32> <Filename Value="dicomfastread.pas"/> <UnitName Value="dicomfastread"/> <TopLine Value="427"/> <CursorPos X="15" Y="435"/> <UsageCount Value="8"/> </Unit32> <Unit33> <Filename Value="dicomcompat.pas"/> <UnitName Value="dicomcompat"/> <EditorIndex Value="11"/> <WindowIndex Value="0"/> <TopLine Value="4484"/> <CursorPos X="88" Y="4494"/> <UsageCount Value="18"/> <Loaded Value="True"/> </Unit33> <Unit34> <Filename Value="lsjpeg.pas"/> <UnitName Value="lsjpeg"/> <TopLine Value="4"/> <CursorPos X="92" Y="13"/> <UsageCount Value="16"/> </Unit34> <Unit35> <Filename Value="sortdicom.pas"/> <UnitName Value="sortdicom"/> <TopLine Value="399"/> <CursorPos X="6" Y="411"/> <UsageCount Value="16"/> </Unit35> <Unit36> <Filename Value=""/> <UsageCount Value="10"/> <DefaultSyntaxHighlighter Value="None"/> </Unit36> <Unit37> <Filename Value="nii_orient.pas"/> <UnitName Value="nii_orient"/> <TopLine Value="6"/> <CursorPos X="36" Y="9"/> <UsageCount Value="10"/> </Unit37> <Unit38> <Filename Value="gui.lrs"/> <TopLine Value="1"/> <CursorPos X="1" Y="3"/> <UsageCount Value="10"/> </Unit38> <Unit39> <Filename Value="nii_math.pas"/> <UnitName Value="nii_math"/> <TopLine Value="576"/> <CursorPos X="78" Y="592"/> <UsageCount Value="10"/> </Unit39> <Unit40> <Filename Value="C:\Documents and Settings\chris\Desktop\scripter\unit1.pas"/> <ComponentName Value="Form1"/> <ResourceBaseClass Value="Form"/> <UnitName Value="Unit1"/> <TopLine Value="34"/> <CursorPos X="1" Y="35"/> <UsageCount Value="20"/> </Unit40> </Units> <JumpHistory Count="30" HistoryIndex="29"> <Position1> <Filename Value="gui.pas"/> <Caret Line="336" Column="16" TopLine="306"/> </Position1> <Position2> <Filename Value="gui.pas"/> <Caret Line="395" Column="16" TopLine="365"/> </Position2> <Position3> <Filename Value="pref_form.pas"/> <Caret Line="108" Column="163" TopLine="99"/> </Position3> <Position4> <Filename Value="gui.pas"/> <Caret Line="647" Column="47" TopLine="643"/> </Position4> <Position5> <Filename Value="gui.pas"/> <Caret Line="844" Column="15" TopLine="814"/> </Position5> <Position6> <Filename Value="gui.pas"/> <Caret Line="863" Column="13" TopLine="833"/> </Position6> <Position7> <Filename Value="pref_form.pas"/> <Caret Line="122" Column="43" TopLine="98"/> </Position7> <Position8> <Filename Value="pref_form.pas"/> <Caret Line="130" Column="1" TopLine="106"/> </Position8> <Position9> <Filename Value="gui.pas"/> <Caret Line="46" Column="25" TopLine="20"/> </Position9> <Position10> <Filename Value="gui.pas"/> <Caret Line="817" Column="12" TopLine="795"/> </Position10> <Position11> <Filename Value="gui.pas"/> <Caret Line="5" Column="131" TopLine="1"/> </Position11> <Position12> <Filename Value="pref_form.pas"/> <Caret Line="56" Column="17" TopLine="47"/> </Position12> <Position13> <Filename Value="pref_form.pas"/> <Caret Line="128" Column="15" TopLine="96"/> </Position13> <Position14> <Filename Value="niftiutil.pas"/> <Caret Line="1" Column="172" TopLine="1"/> </Position14> <Position15> <Filename Value="prefs.pas"/> <Caret Line="26" Column="93" TopLine="8"/> </Position15> <Position16> <Filename Value="prefs.pas"/> <Caret Line="143" Column="27" TopLine="117"/> </Position16> <Position17> <Filename Value="niftiutil.pas"/> <Caret Line="174" Column="28" TopLine="154"/> </Position17> <Position18> <Filename Value="niftiutil.pas"/> <Caret Line="169" Column="19" TopLine="151"/> </Position18> <Position19> <Filename Value="gui.pas"/> <Caret Line="12" Column="23" TopLine="1"/> </Position19> <Position20> <Filename Value="gui.pas"/> <Caret Line="785" Column="23" TopLine="755"/> </Position20> <Position21> <Filename Value="gui.pas"/> <Caret Line="771" Column="4" TopLine="753"/> </Position21> <Position22> <Filename Value="gui.pas"/> <Caret Line="775" Column="31" TopLine="757"/> </Position22> <Position23> <Filename Value="convert.pas"/> <Caret Line="6" Column="32" TopLine="2"/> </Position23> <Position24> <Filename Value="..\common\gzio2.pas"/> <Caret Line="9" Column="19" TopLine="1"/> </Position24> <Position25> <Filename Value="..\common\gzio2.pas"/> <Caret Line="98" Column="79" TopLine="85"/> </Position25> <Position26> <Filename Value="dicomcompat.pas"/> <Caret Line="82" Column="17" TopLine="51"/> </Position26> <Position27> <Filename Value="dicomcompat.pas"/> <Caret Line="3155" Column="10" TopLine="3126"/> </Position27> <Position28> <Filename Value="dicomcompat.pas"/> <Caret Line="4511" Column="88" TopLine="4484"/> </Position28> <Position29> <Filename Value="dicomcompat.pas"/> <Caret Line="4520" Column="72" TopLine="4484"/> </Position29> <Position30> <Filename Value="dicomcompat.pas"/> <Caret Line="4538" Column="45" TopLine="4484"/> </Position30> </JumpHistory> </ProjectOptions> <CompilerOptions> <Version Value="9"/> <PathDelim Value="\"/> <Target> <Filename ApplyConventions="False"/> </Target> <SearchPaths> <OtherUnitFiles Value="..\common"/> <SrcPath Value="C:\lazarus\ideintf"/> </SearchPaths> <Parsing> <SyntaxOptions> <UseAnsiStrings Value="False"/> </SyntaxOptions> </Parsing> <Linking> <Debugging> <UseLineInfoUnit Value="False"/> <StripSymbols Value="True"/> </Debugging> </Linking> <Other> <WriteFPCLogo Value="False"/> <CompilerMessages> <UseMsgFile Value="True"/> </CompilerMessages> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> <Debugging> <Exceptions Count="2"> <Item1> <Name Value="ECodetoolError"/> </Item1> <Item2> <Name Value="EFOpenError"/> </Item2> </Exceptions> </Debugging> </CONFIG> ������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.ini���������������������������������������������0000664�0001750�0001750�00000001401�11751725050�021727� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[BOOL] DebugMode=0 UntestedFeatures=0 Verbose=0 Anonymize=1 AnonymizeSourceDICOM=0 AppendAcqSeries=1 AppendDate=1 AppendFilename=0 AppendPatientName=0 AppendProtocolName=1 AutoCrop=0 CollapseFolders=0 createoutputfolder=0 CustomRename=0 enablereorient=1 OrthoFlipXDim=0 EveryFile=1 fourD=1 Gzip=0 ManualNIfTIConv=1 PhilipsPrecise=0 RecursiveUseNameAppend=0 SingleNIIFile=1 SPM2=0 Stack3DImagesWithSameAcqNum=0 Swizzle4D=1 UseGE_0021_104F=0 UINT16toFLOAT32=1 [INT] MaxReorientMatrix=1023 MinReorientMatrix=2147483647 RecursiveFolderDepth=5 OutDirMode=0 SiemensDTIUse0019If00181020atleast=15 SiemensDTINoAngulationCorrectionIf00181020atleast=1000 SiemensDTIStackIf00181020atleast=15 [STR] OutDir=C:\Users\neuropsych\Documents ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.ico���������������������������������������������0000664�0001750�0001750�00000042206�11660466164�021741� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������00��� �Ј%��F��� ��� �Ј��ю%����� �ˆ ��–6����� �h��@��(���0���`���� �����€%��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ŠŠŠ����������������������������������������������������������������������������������������������������������������������������������ЈЈЈ�ЙЙЙ����џџџ������������������������������������ŽŽŽ‘‘‘’‘‘’’’~~€zz{{{{|||~~€€€€€€ƒƒƒƒƒƒ………†††jjj��������������������������������������������������������ƒƒƒ�­­­�ВВВ����������������������������������������‘‘’�‚‚‚�‹Š“�™˜Ў�Б�œšЪ�ЁŸЮ�Ѓ б�ЂŸа�™—У�‡†І�vuƒ�mmn�rrq�rrr�ttt�}}}�lll�xxx�888�€€€�������������������������������������“““�����ЇЇЇ�kkk zzz———жІІІиЃЃЃиЃЃЃйЂЂЂйЃЃЃйЂЂЂйЂЂЂиІІІл›››Тsss9rrp!pqm#„‚#œ›Д"•“МœšЬЂŸгЄЂжЄЁе›™Ч„ƒІggtPPKSTG]]Ybbbiiibbb___�‚‚‚�‰‰‰����������������������������������œœœ�‰‰‰�ЗЗЗ�ЏЏЏHšššвšššџЈЈЈџАААџЎЎЎџЏЏЏџЏЏЏџЎЎЎџЎЎЎџЎЎЎџБББџЏЏЏџ››œ§ГВЗѕЎЎАіЄЄ і””…і‚ƒlёwyY№rtP№stP№xzZ№ƒ„l№’“ƒ№ЁЁž№ЋЋЏ№­­В№ЈЈЉ№ЅЅЃ№ЅЅЅьЇЇЇё“““ХХХ�ЎЎЎ���������������������������������———’’’�‰‰‰ŠŠŠŸџЉЉЉџ———њЊЊЊ§ЋЋЋ§ЊЊЊ§ЋЋЋ§ЋЋЋ§ЋЋЋ§ЋЋЋ§ЊЊЊ§ЋЋЋ§ЋЋЌќšš“џŒŽrџlo;џ`dџ_eџek�џkq�џnu�џmt�џkq�џgm�џekџhmџuy=џŽrџЇЇЄџДДЛџААВџЏАЏџЅЅЅя```�€€€��������������������������������ЄЄЄЋЋЋ•••ЭЈЈЈџЇЇЇћЄЄЄќ˜˜˜џ­­­ўЋЋЋўЋЋЋџЌЌЌџЌЌЌџЌЌЌџЌЌЌџЋЋЋўЋЋЉўААЖџhj7ўX^�§u|�§ˆ�§‘›�§•ž�§•ž§•Ÿ§•ž§•Ÿ§•ž�§’›�§Œ•�§Š�§t|�§qw§„‡S§ЅЅЁ§ВВИњЌЌЊџ††…p­­­�ЉЉЉЊЊЋ�����������������������������ppp�lll"ЂЂЂјІІІќІІІ§ЁЁЁџšššўЎЎЎџЊЊЊџЌЌЌџЋЋЋџЋЋЋџЋЋЋџЋЋЋџЋЋЋџЋЋЈџЌЌЖџ…Š4џ’œџ•џ‘š�џ˜�џ˜�џ˜�џŽ—�џ—�џ—�џ˜�џ˜�џ™�џ’œџ”žџš�џ‚‹�џxџ‘kћБАИўЃЃЃгЩЪЦЉЊЅОЙц������������������������������ƒƒƒJЃЃЃўЅЅЅ§ІІІўžžžўœœœџЏЏЏџЋЋЋџЌЌЌџЎЎЎџЏЏЏџЏЏЏџЎЎЎџЌЌЌџЋЌЉџЌЋЗџŒ‘;џŽ—�џŽ—џ˜�џ˜�џ˜џ™џ‘™џ‘šџ‘šџ™џ˜џ˜�џŽ—�џŽ—џ—џ’›џ‘š�ўŠ�ўƒ†>ќЅЅЉџ}}„I˜”Є�•”ƒ‚‰��������������������������sЅЅЅўЅЅЅћЇЇЇџџ   џЎЎЎџЎЎЎџВВВџГГГџГГГџГГГџГГГџВВВџЏЏ­џЎЎЙџŒ‘Aџ™�џ™џ™џ‘š�џ™�џŒ•�џ‰“�џ‰“�џŠ”�џ—�џ‘›�џ“œ�џ’›�џ‘›�џ‘›�џ‘š�џ™�џ”ž�џ‹•�ћƒ‰!ў’’‰В“І›�ЋЏ‚����‰‰‰���������������������ЏЏЏ�“““šІІІџЄЄЄњЇЇЇў›››џЂЂЂџВВВџГГГџГГГџГГГџГГГџГГГџГГГџГГГџГГБџЕЕПџ‹Gџ‡‘�џŒ•�џŒ–�џ‰‘�џŒ“&џ—›PџžЁiџž lџšeџ”JџƒŠџ‰џˆџ„‹џƒ‰џƒ‰џ‚‰!џˆ&ў…Š,ў‚‡)§nqFљ:F?(dfZ�llfƒƒƒœœœƒƒƒЗЗЗ�ВВВ�����ёёё�›››ИІІІџЅЅЅћЊЊЊџœœœџЈЈЈџЖЖЖџВВВџГГГџДДДџГГГџГГГџГГГџГГГџВВВџЖЖИџƒџ…‡jџˆŠdџ„Tџ‚„rџ™˜ џš™ЄџŸžЈџЅЅЎџœІџ—–Ёџ‰‰џyyvџŽŽ’џ””™џ””šџ––žџ——Ÿџ˜˜Ёў˜˜Ђџ—–Ђќ™™ў‡…‡в’‘•ЅІЅ�zzz�ЃЃЃ��ддд�ЫЫЫ�kkk�њњњаЈЈЈџЋЋЋќАААџ   џЊЊЊџЕЕЕџВВВџДДДџГГГџДДДџДДДџГГГџДДГџВВГџЕЕЕџ––˜џ˜˜џššЁџœЅџ——›џ„„ƒџ|џ††„џˆˆ†џ††„џ‡‡…џ}џ——˜џ™™™џ••”џ’’џŽџ‹‹‰џ‡‡…џƒƒ‚ўŽŽŒџŽŽŽќџzzzУv‹‹‹{ˆˆˆ}wwwNЎЎЎ�ФФФ```� (тЋЋЋџ­­­§ЏЏЏџ   џЉЉЉџЕЕЕџГГГџГГГџДДДџДДДџДДДџДДДџГГДџГГВџЖЖЗџ–––џ””’џ›œšџŠŠ‡џttsџ‚‚‚џŒŒŒџџџ’’’џ•••џ‡‡‡џџyyyџzzzџzzzџzzzџ~~~џwwwџ„„„џЎЎЎўЊЊЊџЊЊЊќ­­­џЌЌЌџЋЋЋџЌЌЌџ™™™рАААГГГeeeqqqTЂЂЂь­­­џЌЌЌўАААџЁЁЁџЈЈЈџЖЖЖџГГГџДДДџДДДџДДДџДДДџДДДџДДДџВВВџЗЗЗџ˜˜˜џ‘‘‘џ˜˜˜џƒƒƒџ•••џšššџ™™™ў›››џšššўšššў›››ўˆˆˆўzzzџ†††ў†††џ†††џ‡‡‡џ€€€џ€€€џЅЅЄџЋЌЊџЋЋЉўЋЋЊџЋЋЊ§ЋЋЊћЋЋЊљЌЌЋїЊЊЊћxxxЇTTT�ЋЋЋ�}}}ЉЉЉђ­­­џ­­­§АААџЂЂЂџЇЇЇџЖЖЖџГГГџДДДџДДДџДДДџДДДџДДДџДДДџВВВџЗЗЗџšššў‘‘‘џ›››§ћšššћšššћ˜˜˜њ˜˜˜њ–––њ•••њ•••ћ}}}ќrrrў|||џxxxўyyyџsssџ‚‚џЋЋЌџББЕџЎ­БџЏЏГџЏЏГџЏЎДџАЏГџААВџЎЎЎџААЏџЏЏЏџ‘‘‘О•••‚‚‚ЋЋЋіЎЎЎџ­­­ўАААџЂЂЂџЇЇЇџЖЖЖџГГГџДДДџДДДџДДДџДДДџДДДџДДДџГГГџЕЕЕўЅЅЅџКККўЧЧЧџ†††џxxxџ€€€џ}}}џ|||џzzzџzzzџ{{{џxxxџtttўuuuўwwwџ{{{џuuuџ˜˜™џ  œџ—™†џš›ˆџ™š†џ™š†џ™›„ў•–‚џ’’Œш–•™д––™жŸŸŸвžžžу___ZŠŠŠГЋЋЋљ­­­џЌЌЌўЏЏЏџЂЂЂџЇЇЇџЕЕЕџВВГџГГДџГГГџГГГџГГГџГГГџГГГџВВВџЖЖЖџЄЄЄ§НННўЄЄЄэ‘‘‘ДЉnnn›oooŽnnnjjjtlllgwwwUiii†ЄЄЄџЌЌЌќЎЎЎўБББўДДГџЙЙКџЇЇЂџ€ˆ џ‰’�џ‡�џˆ�џŠ“�њ‰�џcifl�nu�������rrrŒŒŒЗЋЋЋњЎЎЎџЏЏЏўБББџЁЁЁџЈЈЈџЕЕГџВВАџГГБџГГБџГГБџГГБџГГБџГГВџГГГџЖЖЖўІІІћЕЕЕџŠŠŠ^ЌЌЌ�ІІІ�ˆˆˆ�†††��www�uuu�ЮЮЮ�ллл�­­­ШХХХўТТТќТТТџСССџССРџППЩџŽ”1џš�џ‘™џ‘š�џ™�ќ‘›�џŽ—ЪŸ��ЈИ��48��DDD�^^^�ŒŒŒЗЌЌЌњЌЌЌџ   ўЊЊЊџžžžџЋЋЌџИЗСџЕДПџЖЕСџЕЕРџЖЕРџЕЕРџЕДРџДДЙџАБАџААБ§ЅЅЅџЏЏЏчjjjkkk“““€€€zzzuuuyyyВВВЕЕЕ�•••nМММџПППћПППўПППџООМџТСЬџ”—Rџ‹•�џ˜џŽ—�џ˜�§Ž—�џ“›тVkY Ј­E�ЂЈ*���������ŠŠŠГ­­­љЇЇЇџ”””ўŸŸŸџ’’“џšš•џ’•Xџ“Pџ“Oџ“MџŽ“Kџ“KџŒ‘Dџ“pџЈЈ­џЃЃЂќВВВўЌЌЌШ����ѕѕѕ�eee�����������������vvv�ŸŸŸŽŽŽ�‰‰‰IЛЛЛџРРР§ППП§ПППџППНџУТЬџ–š]џ‹”�џ˜џ˜�џ™�ќŽ—�џ’›шЁЈšЄ�ЂЇ*���������ƒƒƒœ­­­іЇЇЇџŸŸŸ§ВВБџЎЎАџЋЋ џ˜џŒ–�џ—�џ—�џŒ–�џŽ—�џŠ”�џ‘–GџУУЮџРСОќФФФџЋЋЋЮџџџ����ŒŒŒ������������������žžžŒŒŒNЛЛЛўРРР§ППП§РРРџООМџТТЬџ•™WџŒ•�џ™џŽ—�џ™�§˜�џ’›чБИ)І�ЂЋ*���������{{{yЌЌЌёЉЉЉџ›››ўЏЏЎџЌЌ­џЌ­Љџ“›џ˜џ™џ™џ™џ˜џŽ˜џ’3џННЦџООН§СССўГГГ№EEE```zzz�ЭЭЭ���������ƒƒƒ�zzz�ФФФЩЩЩ�šššПППџПППћПППўПППџППНџПОЩџ”;џŽ˜�џ˜џ˜�џ˜�ќŽ—�џ‘šр'>�ЂЊ:�ЂЊ*���������^^^JЇЇЇыЊЊЊџ›››§ЏЏЏџ­­ЋџЎЎГџ˜ž.џ—�џ™џ™�џ™�џŽ—�џš�џ‡ џГГБџТТТўРРПњОООџ–––~ИИИ�ЗЗЗСССZZZ�```�žžž�yyyНННППП ­­­оСССўПППќРРРџОООџСССџЕЕЗџˆџ™�џŽ—�џ™�ўŽ—�ћ‘šў›ЃФŽ™ �žЇ �ЂЋ*���������ЄЄЄмЌЌЌџššš§ЏЏЏџ­­ЉџЏЎИџЂЇZџ˜�џ˜џ˜�џ™�џ˜�џ™џ‰“�џœŸuџУТЪўИИЕ§ЙЙЙќБББѕBЏЏЏ�ЏЏЏ�‹‹‹���ЅЅЅЛЛЛ�­­­�ŒŒŒЂЕЕЕџДДДћЖЖЖџЛЛЛўООМџФФЫџŸЁџˆ’�џ™џ˜�џ™�ў–�њ›ЄўЈЏ4–ЏЕ7�ЈА-����������������ЂЂЂУЎЎЎџšššќЎЎЎџЌЌЋџЎ­ЕџЋ­Šџ–Ÿ џŽ—�џ™�џ™�џ™�џ˜�џ™�џ‡Žџ­ЌБўДДГџБББ§ЕЕЕўЊЊЊђЄЄЄlООО �###�žžž�ЉЉЉ.   ЏЗЗЗџГГГќГГГўГГГўБББџККИџИИРџ‰#џ™�џ˜џ™�ў˜�џ—�ћЂЊ(џЂЊ-SІ­2�ЃЋ)������������ЦЦЦ�™™™ЁЎЎЎўšššњЌЌЌў­­­џ­ЌЎџЎ­ЌџЂЉ8џ™�џ˜�џ˜�џ˜�џŽ—�џ™џ‹”�џ‰NџЕДПўДДБџБББ§ЖЖЖџАААџЏЏЏрІІІЎ———ЁœœœУЌЌЌљЖЖЖџГГГќГГГџГГГџВВГўГГЏџЕДСџŽ’TџŒ•�џ™џ˜�џ˜�џŽ—�ќ” §ЅЌ.цНТLЅ­%� Ї%�������������ЁЁЁ�“““vЎЎЎў›››ћЊЊЊџЎЎЎџЌ­Ћџ­­ЖџЋЎxџ™ЂџŽ–�џ™�џ˜�џ˜�џŽ—�џ‘šџ‡�џŽ‘cџЕДРўЕЕДџВВАўГГГ§ДДДџЕЕЕџЗЗЗџЗЗЗџЕЕЕџВВВќГГДџГГГўВВАўЕЕГџЖЕСџ‘”hџˆ‘�џ‘šџ˜�џ™�ў™�ў–�ћ›ЃџЈЏ7†ДЛD�ЇЏ+ŸЇ#�������������”””�………HЌЌЌџ§ЇЇЇўЏЏЏџ­­Ќџ­ЌЎџ­­ЊџЇ­Bџ’›џŽ—�џ™�џ™�џ˜�џŽ—�џ‘šџ‰‘�џŒRџЌЌВўИЗОўЕЕДўГГАќВВАћВВБћВВБћВВБ§ГГБўГГАўЕЕГўЗЗНџ­­Еџ‘Xџˆ‘�џ‘šџ˜�џ™�џ™�џŽ—�ќ’›ўІЎ&цЈА0ЄЌ- Ї.� Ј#�������������]]]�RRRЉЉЉђЂЂЂџЁЁЁ§ЏЏЏў­­­џ­­Ћџ­­Гџ­ЎŽџЁЉ$џ˜�џ˜�џ™�џ™�џ™�џ˜�џ‘šџŒ•�џ†Œ џ˜šzџЌЋАџЕДПџИЗПџИЗМџЗЗЛџИЗМџИЗОџЖЕПџ­ЌВџ˜›џ†Œ%џ‹•�џ‘š�џ˜�џ™�џ™�џ˜�ўŽ—�ћ˜ џŒ’6f•$�—ž%ЁЈ,�����������������хххљљљЂЂЂЬЇЇЇўќАААџЌЌЌџ­Ў­џЌ­ЋџЎ­ЕџЋЏsџІџŽ—�џ˜�џ™�џ˜�џ™�џ˜�џ™џ™�џˆ’�џ†џŽ’Nџ—™uџŸŠџ  ‘џŸ‹џ—™wџŽ’Rџ†џˆ‘�џ™�џ™џ˜�џ™�џ˜�џ˜�ў˜§“џ˜FьЏЎMnkЃ�hЅЌ-�����������������ЛЛЛССС�ššš”ЋЋЋў™™™њЎЎЎў­­­џЎЎЎџ­­­џ­­­џ­­ВџЊЎhџœЄџŽ—�џ˜�џ™�џ™�џ™�џ˜�џ˜џ‘šџ‘š�џ–�џ‰’�џ‡�џ†�џ†�џˆ‘�џŒ–�џš�џ‘šџ˜џ˜�џ™�џ˜�ў™�ў˜џ—�љЁЇJќЁЁЇЊшчИ�едхty%���������������������——— �‡‡‡SЏЏЏџŸŸŸћ­­­ў­­­ў­­­ўЎЎЎџ­­­џ­­­џ­­ВџЊЎmџЅџ™�џŽ—�џ™�џ™�џ˜�џ™�џ˜�џ˜џ™џ‘šџ‘š�џ‘›�џ‘š�џ‘šџ™џ˜џ˜�џ™�џ™�ў™�ў™џŽ—�ў—�ћІЋMљКЙМџŒŒŽVš™Џ�ŸŸžsx���������������������‡‡‡yyy�rrrЎЎЎїЋЋЋџЌЌЌјГГГњ­­­ћ­­­ќ­­­§Ќ­Ќ§Ќ­Ќў­­ДўЋ­‚ўЁЈ,џ“œўŽ—�џ˜џ™џ™�џ™�џ™�џ™�џ˜�џ˜�џ˜�џ˜�џ˜�џ™�ў™�ў™�ў™�ў˜�§˜�њŽ˜�ћ” џЉ­gџЕДЛџЌЌ­Ь’“„„~�‰‰‰��������������������������ЗЗЗœœœ�„„„QЁЁЁзЃЃЃџЙЙЙџЖЖЖџЖЖЖџДДДџВВВџАААџЎЏ­§ЎЎЖћЌ­ЁћЅЊWћ™Ђћ‘š�ћŽ—�ќŽ—�§Ž—�§˜�§˜�ў˜�ў™�ў™�ў˜�ў˜�ў˜�§˜�ћ˜�ћ™�ў‘š�џ” џšЁ4џЅЇŽцГВТЁбббJХХТъъы�­­Ў�ŒŒŒ�������������������������TTT�ППП�xxxaaa�жжж ‚‚‚k˜ЃЃЃАІІІЩЊЊЊс­­­№АААќАААџААЎџВВДџДДКџГДžџЊЏcџŸЇ-џ˜Ёџ”џ’›�џ‘š�џ™�џ˜�џ˜�џ™�џ‘š�џ˜џ“œџ• џ“›џ‘—"р‹ŽW „‚œTŽКЉЈЗ�����ЛЛК�ннн�ЇЇЇ�ˆˆˆ�����������������������������ЕЕЕ�|||�rrrЗЗЗ�ŽŽŽ�РРР������������XXXlll-ŽŽŽBŽŽ[™™˜t˜˜–‹žžІЃЃЂЏИЅІœШЁЃtй›ŸKц–/ђ–!љ—Ÿќ™ЁџšЁџ˜ §—ŸђЄЋз˜Ÿ"Џ–(w~ƒ.: �џ џџ��џџК�����СПбџџџммк�ццц�   �������������������������������������ŽŽŽ�xxx�ааа�‡‡‡БББџџџ???� �nnn��“““�ЃЃЃ�ЕЕЕ�����ииь���������&џaUџb`ˆopS'x|40‰Ž79‹:<~„-0y|8ю№ЕР�І­�‚ˆ)�]Z„���џh[а����ХУе�ђђї��������������������������������������������������������������������������������ЊЊЊwwwšššІІІДГДџџџИЙКџџџџџц�5#џ�H2џ�_ZЋ�qrV�„8�Œ‘<�”?�…‹0�}€9�ѓѕ�ЉГІЎ„‹#������������������������������������������������������������������������������������������������������������������������������������������������������•,{)w{3{7‡$���§џ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��ќ�џџџ��ј���џ��р���џ��Р���џ��Р���џ��Р���џ��€���џ��€���џ��€����џ��€������€�������������������������������������ј�����ј�����ќ�����ќ�����ј���€�ј���€�№���€�р���€����?��€����?��Р������Р������Р����џ��Р����џ��Р����џ��р���џ��р���џ��ј���џ��џј�џџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��(��� ���@���� �����€������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vvv�{{{�ZZZ�”””’’’’’’’’’nnn��������fff�����������������������������������������������������������������������������ЛЛЛ�[[[�{{{aaa��ŒŒŒ����‹‹‹�ccc�aa`lko“”yy|Ooq<uxE‹jЅІ™­­­ЋЋЋЌЌЌЎЎЎ•••ЄЄЄ�ІІІ���������������������ŠŠŠ�ЁЁЁSSSooo�WWW ……….‰‰‰,‡‡‡-‡‡‡-‡‡‡,†††,\\YYYO�nnj�‰‰y�qrP�fh;�kmE�‚‚k�ІІЉ�УСз�СРа�ДДЖ�ДДГ�———�����������������������žžž�ŸŸŸ�‡‡‡O’’’жЇЇЇўЊЊЊўЉЉЉџЊЊЊџЊЊЊ§ЌЌЌџ››ХЄЄЋ™ŸžЃœŽ‰™yyj’ss]“wxd“……|“˜˜“ІІГ“ЈЇА’ЁЁ žžœ“‹‹‹&�™™™�����������������–––‘‘‘ЃЃЃЄЄЄЄџŸŸŸџЌЌЌўЋЋЋџЌЌЌџЌЌЌџЋЋЊџЏЏАџ››”џ~Yџrv*џsxџu| џv}џv| џv{џy~%џƒ†Kџ˜™„џЌЌАџББЖџœœППП�ЛЛЛ——œ�����������������ŸŸŸ�———ŠЄЄЄџЃЃЃћžžž§­­­ўЊЊЊўЋЋЋўЋЋЋўЊЉЇўБАИў‰Œ_ќu}�ћ–�ћ’œ�ћ”�ћ”ž�ћ”ž�ћ“œ�ћ™�ћˆ‘�ћ‡�ћ‡%љ‰ћЌЋЗё  ž’‘™�—–Љ�����������������ЩЩЩ�ЕЇЇЇќЁЁЁћ   џ­­­ў­­­џАААџАААџ­­ЊџЎЎИџšiџ‘›џ‘šџ™�џŽ—�џŒ–�џ–�џ˜�џ‘›�џ“œ�џ”�џš�ў…Ž�ћ’–Xџ––œrЃЄž�ІЇ—ttr�������������єєє   еІІІџ   §ЃЃЃџВВВџВВВџГГГџГГГџВВАџЕДНџšœpџ‡‘�џŒ–�џ‹”џ’™(џ—œ<џ•›;џŽ”"џ‡џˆ џˆџˆџŒ“ќ…ў}Qзbg;lpA�vvt�EEE�777�����]]].ЂЂЂшЉЉЉџЃЃЃўЈЈЈџЕЕЕџВВВџГГГџГГГџВВВџЗЗИџžž—џ‰‹lџŒŽeџŽ}џ“’˜џ››Єџš™ЃџŒŒџƒƒ{џ““Žџ“”’џ’’’ў’‘•ў”ќŽŽŒџut~•{zˆ ŠŠ‰ '''LLLџџџ………`ЄЄЄєЏЏЏџЇЇЇ§ЊЊЊџДДДџВВВџДДДџГГГџГГГџЖЖЖџЂЂЃџ˜˜žџ––žџ‚…ў„„‚ў‰‰†ўŠўŠŠ‰ўˆˆŠўˆˆ‰џ„„„ў……„џzzyџŽўЃЃЃ§  џЄЅЂрІІІс””” ХХХ�­­­‘ЉЉЉљЏЏЏџЇЇЇўЉЉЉџЕЕЕџГГГџГГГџДДДџВВВџЖЖЖўЃЃЂџўŒŒ‰ћ““’ћœœœћ›››ћŸŸŸќ——–§yyx§~џ€ў}}|џ‹‹‹ўЎ­АџБАДўАЏГќЏЏГџАЏБџЋЋЌџ——™|ššš–––КЌЌЌћЎЎЎџЇЇЇџЈЈЈџЖЖЖџВВГџГГГџГГГџВВВџЕЕЕџЈЈЈџБББџšššџ………џ‡‡‡џ„„„џ{{{џvvvџrrrџwwwџwwwџ~~ўЃЃ џЁЂ”ўŸ “ў Ё’ў§›››хсšš—ь~~~lšššЯ­­­ќАААџЉЉЉўЉЉЈџЖЖДџГГБџДДВџДДВџГГВџЕЕЕўЌЌЌўИИИћ‰‰‰Žmmms|||giiiZЖЖЖKЖЖЖBЁЁЁдВВВџГГВћККМџЌ­Ѓџ… џŠ“ў‹”ќƒ‹ўou Ylr rxlll›››вЌЌЌ§ЈЈЈџЂЂЂџЈЈЊџЕДОџВВЛџГГМџГВЛџВБИџББАњЊЊЊўЈЈЈМллл�ппп�555�qqq�ЗЗЗ�ККК�ЄЄЄcРРРџТТСњТТРўОНФџ—"џ™�џ˜�њ‘š�џ”y“œ�’œ��ppp�›››ЫЊЊЊќ›џЁЁЅўœ‡џ–7џ–6џ–4џ•1џ‘•PџЎЎВљГГВўЊЊЊФФФУУУššš~~~››››››———;КККўПППќППН§ООЦџ‘—/џ—�ў—ћ˜�џ’œˆ‘š��‘š�����˜˜˜ЌЉЉЉћЃЃ џВВЙџЈЉŠџ—�џŽ˜�џŽ—�џŽ˜�џŽ–џННТњУУТџЎЎ­Бшшш�гггННН�ŠŠŠ�ВВВВВВ�ŸŸŸVОООџПППњРРПўМЛСџŽ•џ˜�џ˜�њ˜�ў’›™��™�����yЉЉЉјЁЁЁџЎЎБўЋЋ џ’› џŽ—џ˜џšџŠ“џЏА §УУЦќЖЖЕі’’’.ІІІ�ЙЙЙ�xxxббб�ФФФ�ЋЋЋУМММўННМћУУХџАБЄџ‰’џ™�ўŽ—�ћ” џЄЋ%_ЁЈ$�ŸІ����mmm=ЈЈЈьЂЂЂџ­­Ќ§ЏЎДџžЄ:џ—�џ™џ˜џ–�џ•šMџЗЖТќГГЎџЊЊЊрДДДGДДДННН�ЋЋЋ#›››ЈГГГџВВВќГГЎџОНЩў—œOџŒ•�ў™ўŽ—�ўЅјЃЈD%БИH�Ѕ­,����ссс ЇЇЇиЂЂЂџЌЌЊ§Ў­ЖџЊЌ{џ’œџŽ—џ˜�џ™џˆ‘ў›~џЗЗС§ЕЕБџ­­ЋџЄЄЄеЗЗЖЩЏЏЏѓЕЕЕџВВАќГГЏџЗЖТўŸ}џŠ“џ™џŽ—�ћ‘šўЃЋ*П|‚ �ЂЊ(šЅ������ннн�ЅЅЅЕЃЃЃўЋЋЊќ­­ЎўЎЎЎџЂЈ8џŽ—�џ˜џ˜�џ™ў‰’ўšœsџГВН§ИИП§ИИЙџГГВџЖЖЕџЕЕЕћЖЖМџГГНўšuўŠ“џ™�ў˜�ўŽ—�ќ™Ё§ЃЊ7EЏЖ8�ЃЊ(ЂЋ�����ЌЌЌ�ЂЂЂ„ЃЃЃўЈЈЈћЎЎ­џ­­Гџ­Ў’џ›Ѓџ–�џ™џ˜�џ™�џ‹”�ўŽ”7ўŸЁ€ўЊЊІќЏЏГћЏЎВ§ЊЊЇўŸ ў”9ў‹”�џ™�џ˜�џ˜ћš�ў–(Ж”�ІЎ Ј%�ЄЌ%�����œœœ�–––IЅЅЅўЄЄЄќЎЎЏў­­Ћў­­ЕўЋЏ€џ˜Ё џ–�џ˜џ™џ‘šџŽ˜�џŠ“�џŠ’ џ‹’џ‹’џŠ‘ џŠ“�џŽ˜�ў™ў˜�ў˜�§Œ–�јžЄ@џ››Ђ\ЉЊž�ІЈ„ЃЋ0���������ššš�’’’ЉЉЉєЊЊЊџАААћЌЌЌћЌЌЋћ­ЌЗћЋЎ„ћšЂќ—�§Ž—�ў˜ў™ў‘šўš�џ™�ў™�ўš�ў‘š�ў˜ќ˜�ћ˜�ў™�џЄЉKџВВГђ†…‘ŽЇ�žœФ�������������СССККК�ЅЅЅgžžžьВВВџГГГџБББџББЏџАЏЗџЏЏŸџЄЉNџ–ž џ™�џ˜�ў˜�ќŽ˜�ќŽ—�ќŽ—�ќŽ˜�§˜�џ™�џ’›џ“›џžЂdйЌЊМŽЇЇВ0…� ЁŽ� ŸЕ�����������������{{{———�jjj–––L˜˜˜fЈЈЈЂЂЂЊЊЈЗЊЊЏЭЎ­ЖрЊЌ№ЁІTњ˜Ÿ(џ”œџ“œ џ” џ”œ џ• џ•ё˜Щ‡(ˆy{Y@ljv­ЊЫ�фуч�����›œ˜�™™™�����������������‚‚‚�ІІІkkk�ІІІ�ДДД�ВВВ�ћќќ�ЪЪЧ������wrМ”в%••–3‰OCŒ’.P•œ-Y’˜+T•›-<ˆŒ:ruD�y|(�JU��ŠЉ��ЕБзззмїї§�ЉЉЉ���������������������–––�ЅЅЅ�gggЇЇЇИИИЙЙЙџџџШШЧ��������‡ƒз�œ˜е�—–’�•›E�”š+�Є*�™ )�›Ђ.�–œ5�sv@�x{+€ˆtx-�СПг�ккн������������������������������������������������������������������������‘“ƒ‚†•œ5šЁ" Ј"œЄ ™ #�������Š&���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџ№��џР��€��€��?€��?€��������������`�р�№�р�р€Р€��€��€��Р��Р��?Р��ј�џџў?џџџџџџџџџџџџџџџџџ(������0���� �����` ����������������������������������������������������������������������������������������������������������������������ЇЇЇ�ЅЅЅ����БББГГГГГГЕЕЕ���ССС�ЗЗЗ�����������������������������������������������������ccc�›››�‘‘‘�   �ЁЁЁ�ЁЁЁ�ЃЃЃ�‘‘‘�ЄЄ­�ЦФс�������������������џ�����………�{{{�LLL�ИИИ�������������ŽŽŽ�ЃЃЃ�‚‚‚�{{{$™™™HšššE™™™E›››HŠ‹Š&ЂЂЊ�иеџ�����,����������V`����������кки�юющ�ЌЌЌ�������������šššЂЂЂ –––~œœœіЋЋЋџЋЋЋџЊЊЊџ­­­џЃЃЄї——з‡‰hиtx;дqu.гuy<г‚…]г—˜ŽгЉЉГбЊЉЎг““’1˜˜—�ЈЈЈœ‘���������ЦЦЦ�ЋЄЄЄџЂЂЂўЌЌЌќЊЊЊ§ЊЊЈ§ЏЏДќ—˜ƒџszџ‚Š�џ‰’�џ‹”�џ‰’�џ…�џƒŠџ‹AџЃЃ–џІЅЏŸФФШ�ЛЛЛ‘’x�“““�����ЬЬЬ ЃЃЃтЃЃЃќЂЂЂќЎЎЎџАААўЏЏЎўБАЙџž zў™�§“�§™�§™�§š�§“œ�§‘›�§‹–�ћ‡�§’–ZѓЌЉеЇІЩ–˜ƒ“““����wwwCЄЄЄяЃЃЃўЇЇЇ§ДДДўГГГџГГВџЗЖЛџЃЄ’џ†Œ%џŠ(џ’–Yџœžvџ“–eџ„ˆ<џŒFџŽ’Oў”Mќ‡ŠPџtti‹yzh�ƒg��ЁЁЁ‘‘‘ЈЈЈјЉЉЉџЋЋЋўЕЕЕџВВВџВВВџЖЖЕўЇЇЉџ“’›ўŒ•ќ‡†’ќ™ќšћˆ‡“§Œ˜џ‹‹–ў‚Žў••›ўœџššœБššŸЄ‡‡…�———ГЌЌЌќЊЊЊџЊЊЊўДДДџВВГџВВВџЕЕЖџЉЉЉџ••”џ‹‹Šџ••“џ””“џŽџzzxџvvtџttrџŠŠ‰џЏЎКџЏЏЛўЏЎИџЏЏЕџЂЁЉеЁЁЉ,žžžжЎЎЎ§ЋЋЋџЊЊЊџЕЕГџГГБџГГВџЕЕДўЏЏЏџВВВ§•••зzzzЬƒƒƒС———Б‡‡‡ш‘‘џ––™§ЄЅšџ’—Lў”™IўŽ’Jњ_‡ZƒwzMNЁЁЁпЋЋЋўЄЄЄџЉЈЋўДГЛџББЙџВБИџББГћ­­ЌџЈЈЈЃООО�ЊЊЊ�РРР�ЛЛЛ�ЊЊЊ]ТТТџЦЦШќЙЙЕў‹”ў—�§Œ–�ўˆ�.ˆ‘��‹”��ЃЃЃжЄЄЃ§ЃЂЉџž }џ–)џ‘—*џ”$џ Ђ|ћИЗОўЊЊЇnЗЗЗ�ОООРРРЄЄЄ.МММўПРПўММП§˜џ˜ќ™ў”Q’œ�“�ŸŸŸАЅЅЃќ­ЌЕџЇЊў–�џ˜�џ‹•�џžЂVћЦХвџББЌБЯЯЯ�ЬЬЬ�ТТТ�МММ�ЇЇЇnНННџУТХћЖЖАўŒ•ў˜�§‘šџ Ї>šЂ�˜ЁšššrЄЄЄїЉЉЋџЎЎІў”œџŽ—џ™џŽ•ўГВЖќЖЖИџ›|ŸŸŸ ЈЈЈЊЊЊOААЏ№ГДА§ПОЮ§ЁЄjџ‹•�§Ž—�ўšЃё™ EВИN�ЋГ0�”””+ЄЄЄъЈЈІџАЏЙ§ЃЈQџ—�џ™џ–�џ‘–CўГВПўЗЗНџЏЏЎшЎЏ­оААЏџЕЕЖџЗЖХўЃЄџ‹”џ˜�ћ‘šџЁЈ&І‰“�˜ ЋВ/�ггг�ЃЃЃЭІІЅўЎЎВќЎЏЂўšЂџŒ–�џ‘™ўŒ–�џ•1ўІЇ”§ВВИџДДОџГГНў­­Ќў›žiџ‹“ў™�ў—�ќ“œіЄ­.%ЂЉ)�ЃЋ%ІЎ%�ЎЎЎ�ЁЁЁžЅЅЅў­­Ћј­ЌДќЌЎ‰§–Ÿ §Œ–�ў™ў˜�ў‹”�ў– §’˜7ќ‘–0ўŒ”ўŒ•�ў™�ќŒ–�љ“œџŸЂcКБЛK�ЋБ\ЄЌ)�����ЎЎЎ�ЇЇЇPЈЈЈџАААџЎЏ­џЏЏЗџЌЎџšЂ$џŽ˜�ўŽ—�§™�ќ˜�ћŽ—�ћŽ˜�ћ™�ў™�џ™џ”œџЊЌ‡я­ЋФOВАФМНМЃЊ(�����ЛЛЛЃЃЃ‡‡‡TЇЇЇЃЎЎЎНЊЊЈеЎЎЖщ­­ЉјІЊfџ™ (џ“› џ‘šџ’›џ’šџ’›џ— щŽ•(Џ“–rb—˜‘ЅЅЋ�”•Š�ММК���������ООО�МММ�ЉЉЉ�ККК�дде��y|H ŠЊІч.ЁЁЄA˜œNS—&b–"k’™#_“$9‚‡(E>’�ЖЕП�Л­џ�ЊЉЗ� ŸЅ�НОИ���������ЬЬЬ�����uuuДДДЯЯЯBBC�Ž‰�˜�ЌЉе�ІЇ›�› B�™Ё�šЂ�—Ÿ�•œ#�‚†)�][^}„dp��УУЧ�ЗЗЙ����������������������������������������ДДГМЛФЎАŠЁЉ'˜ ›Ѓ›ЄŸЇ�����������������������������������������������������������������������������������������������������������������������������������џџџ�џџџ�џџџ�џџџ�Р�?�€��€��€������������<��>��<���€��€��€��€��Р�?�џУџ�џџџ�џџџ�џџџ�(������ ���� �����@������������������ДДД�ззз����ААА БББ ЊЊЊЭЭЮЕЖА”•ЇЈЅЉЉЊ�������ŸŸŸ�˜˜˜�����ЁЁЁ�ЌЌЌ–––�ЇЇЈ�ЇЇІ�ЉЉЎ�ПНф�œšЕ�hf~�ŠП�ЖВџ�žžž�ŠŠŠ�ŠŠˆ�“““�����ЄЄЄ�ЈЈЈ�“““FЄЄЄdЄЄЃdЁЁЄTДГЫ)ŸА'jh~%‡„А%ЋЇщ&ŸŸЌ"~~w�‚„h�“^�����˜˜˜   ЅЂЂЂџЋЋЋџЌЌЎџЃЃџ‡‹BўƒŠ§€† ќ„Š ќ“NњЃЄ˜ј ŸІ8ЇЅК­­Ж����˜˜˜\ЂЂЂўІІІќААЏњВБЗњЄЅ‘ћˆ’�ў‘š�ў“›џŽ—�џŠ”�њ”џ’f ™ŸI�•›G�ћћћЁІІІњЌЌЌўДДДџЕЕЖўЌЌЊџq§Œ}ќ•••ў‰Š}§‹Œ}ў‰Šz§‘…ї’•r{‘“oAšš�ЃЃЃдЌЌЌ§­­­џДДДўДДДџАААџ™™Ÿџ‰‰Œџџ„џzz~џŽўЇЈЁўЅЅЅџžž­фЃЂZЇЇЇыЉЉЈ§ЊЊЌџВВДџББГќААЏўЇЇІŸ››™AЉЉЉ1ЁЁžsЕЕИўВГЂћ• ў‹”ш{%”›ЃЃžсІЅЎўžЁoџ—ў—%њДДАџББДUССЧ�ДДГ�ЊЊЇ)ТТУџКЛГ§—ў™�єžЇ šЃ�  ™­ЈЈЏќЈЊ€џŽ˜�џ‹•�§ЊЌ…ўЗЗФЯЛЛК(ИИЕЌЌІАМЛШўЉЋњ‹•�ў—Ÿн‰7…Ž™™˜aЅЅЅєЎЎАўšЁ*ў–�џŽ–ўЇЉ’џЏЎИїГГНёЕДПџЇЈ’ўŽ–ј˜�§šЂ…Š“ �•žЃЃЃІІЄц­­ВџЌ­”§•žќŒ–�ћŒ•�ј—>§›ŸUў•›8јŒ•�§Ž˜�џ˜Ÿ-§ЄЈ€ААŠ�ЅЉiААА�™™™~ЊЊЈшЎЎДїЋ­—џœЂ;џ’› џŽ˜�џŽ—�џ˜�џ˜ћ–œ3ЬІЈ‰kДК�ЗИŽ–Ї��џџџ����ssw‘’†"›š­7ЏЎНMŸЃPb‘˜"s•œy•œ^Œ’&+”;�™Ё(�jW=�КЛt� ��ааа�III����ЁЁš�ЊЈШ�ГБШ�ŸЃT�•�–ž�”œ�Œ’)�“G�ЂЈ<}ci�Ѕ­A����������������ЛЛЙЗЗМЕЕЉЂЈE • ” ‘𠐗—Ÿ�Ѕ�› N���������џџ��џџ��уџ��€������������ƒ��У��ƒ�����€��€��ќ?��џџ��џџ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.dpr���������������������������������������������0000664�0001750�0001750�00000000753�11474411340�021742� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������program dcm2niigui; uses Forms, gui in 'gui.pas' {MainForm}, pref_form in 'pref_form.pas' {PrefsForm}, nifti_form in 'nifti_form.pas' {NIfTIform}, untar in 'untar.pas', convertsimple in 'convertsimple.pas'; {$R *.RES} begin Application.Initialize; Application.Title := 'dcm2niiGUI'; Application.CreateForm(TMainForm, MainForm); Application.CreateForm(TPrefsForm, PrefsForm); Application.CreateForm(TNIfTIform, NIfTIform); Application.Run; end. ���������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.dof���������������������������������������������0000664�0001750�0001750�00000004442�11612055630�021724� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[FileVersion] Version=7.0 [Compiler] A=8 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 V=1 W=0 X=1 Y=1 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; NamespacePrefix= SymbolDeprecated=1 SymbolLibrary=1 SymbolPlatform=1 UnitLibrary=1 UnitPlatform=1 UnitDeprecated=1 HResultCompat=1 HidingMember=1 HiddenVirtual=1 Garbage=1 BoundsError=1 ZeroNilCompat=1 StringConstTruncated=1 ForLoopVarVarPar=1 TypedConstVarPar=1 AsgToTypedConst=1 CaseLabelRange=1 ForVariable=1 ConstructingAbstract=1 ComparisonFalse=1 ComparisonTrue=1 ComparingSignedUnsigned=1 CombiningSignedUnsigned=1 UnsupportedConstruct=1 FileOpen=1 FileOpenUnitSrc=1 BadGlobalSymbol=1 DuplicateConstructorDestructor=1 InvalidDirective=1 PackageNoLink=1 PackageThreadVar=1 ImplicitImport=1 HPPEMITIgnored=1 NoRetVal=1 UseBeforeDef=1 ForLoopVarUndef=1 UnitNameMismatch=1 NoCFGFileFound=1 MessageDirective=1 ImplicitVariants=1 UnicodeToLocale=1 LocaleToUnicode=1 ImagebaseMultiple=1 SuspiciousTypecast=1 PrivatePropAccessor=1 UnsafeType=1 UnsafeCode=1 UnsafeCast=1 [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 RemoteSymbols=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=4194304 ExeDescription= [Directories] OutputDir= UnitOutputDir= PackageDLLOutputDir= PackageDCPOutputDir= SearchPath=..\common\;C:\pas\d4\RX\Units\ Packages=Vcl40;Vclx40;VclSmp40;Qrpt40;Vcldb40;RxCtl4 Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams= HostApplication= Launcher= UseLauncher=0 DebugCWD= [Language] ActiveLang= ProjectLang= RootDir= [Version Info] IncludeVerInfo=1 AutoIncBuild=0 MajorVer=0 MinorVer=9 Release=0 Build=0 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=1033 CodePage=1252 [Version Info Keys] CompanyName= FileDescription= FileVersion=0.9.0.0 InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion=1.0.0.0 Comments= [HistoryLists\hlUnitAliases] Count=1 Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [HistoryLists\hlSearchPath] Count=3 Item0=..\common\;C:\pas\d4\RX\Units\ Item1=..\common\;C:\pas\d4\RX\Units Item2=..\common\ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.cfg���������������������������������������������0000664�0001750�0001750�00000001036�11612055630�021707� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-$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" -U"..\common\;C:\pas\d4\RX\Units\" -O"..\common\;C:\pas\d4\RX\Units\" -I"..\common\;C:\pas\d4\RX\Units\" -R"..\common\;C:\pas\d4\RX\Units\" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.app/��������������������������������������������0000775�0001750�0001750�00000000000�11660470014�022005� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.app/Contents/�����������������������������������0000775�0001750�0001750�00000000000�11660470014�023602� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.app/Contents/Resources/�������������������������0000775�0001750�0001750�00000000000�11660465472�025570� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.app/Contents/PkgInfo����������������������������0000664�0001750�0001750�00000000011�11660465472�025066� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������APPL???? �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.app/Contents/MacOS/�����������������������������0000775�0001750�0001750�00000000000�11660470014�024544� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.app/Contents/MacOS/dcm2niigui�������������������0000664�0001750�0001750�00000000023�11660465472�026530� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������../../../dcm2niigui�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2niigui.app/Contents/Info.plist�������������������������0000664�0001750�0001750�00000002242�11660465472�025566� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>English</string> <key>CFBundleExecutable</key> <string>dcm2niigui</string> <key>CFBundleName</key> <string>dcm2niigui</string> <key>CFBundleIdentifier</key> <string>com.company.dcm2niigui</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleSignature</key> <string>dcm2</string> <key>CFBundleShortVersionString</key> <string>0.1</string> <key>CFBundleVersion</key> <string>1</string> <key>CSResourcesFileMapped</key> <true/> <key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeRole</key> <string>Viewer</string> <key>CFBundleTypeExtensions</key> <array> <string>*</string> </array> <key>CFBundleTypeOSTypes</key> <array> <string>fold</string> <string>disk</string> <string>****</string> </array> </dict> </array> </dict> </plist> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii48.ico����������������������������������������������0000664�0001750�0001750�00000042206�11410365040�021370� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������00��� �Ј%��F��� ��� �Ј��ю%����� �ˆ ��–6����� �h��@��(���0���`���� �����€%��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ŠŠŠ����������������������������������������������������������������������������������������������������������������������������������ЈЈЈ�ЙЙЙ����џџџ������������������������������������ŽŽŽ‘‘‘’‘‘’’’~~€zz{{{{|||~~€€€€€€ƒƒƒƒƒƒ………†††jjj��������������������������������������������������������ƒƒƒ�­­­�ВВВ����������������������������������������‘‘’�‚‚‚�‹Š“�™˜Ў�Б�œšЪ�ЁŸЮ�Ѓ б�ЂŸа�™—У�‡†І�vuƒ�mmn�rrq�rrr�ttt�}}}�lll�xxx�888�€€€�������������������������������������“““�����ЇЇЇ�kkk zzz———жІІІиЃЃЃиЃЃЃйЂЂЂйЃЃЃйЂЂЂйЂЂЂиІІІл›››Тsss9rrp!pqm#„‚#œ›Д"•“МœšЬЂŸгЄЂжЄЁе›™Ч„ƒІggtPPKSTG]]Ybbbiiibbb___�‚‚‚�‰‰‰����������������������������������œœœ�‰‰‰�ЗЗЗ�ЏЏЏHšššвšššџЈЈЈџАААџЎЎЎџЏЏЏџЏЏЏџЎЎЎџЎЎЎџЎЎЎџБББџЏЏЏџ››œ§ГВЗѕЎЎАіЄЄ і””…і‚ƒlёwyY№rtP№stP№xzZ№ƒ„l№’“ƒ№ЁЁž№ЋЋЏ№­­В№ЈЈЉ№ЅЅЃ№ЅЅЅьЇЇЇё“““ХХХ�ЎЎЎ���������������������������������———’’’�‰‰‰ŠŠŠŸџЉЉЉџ———њЊЊЊ§ЋЋЋ§ЊЊЊ§ЋЋЋ§ЋЋЋ§ЋЋЋ§ЋЋЋ§ЊЊЊ§ЋЋЋ§ЋЋЌќšš“џŒŽrџlo;џ`dџ_eџek�џkq�џnu�џmt�џkq�џgm�џekџhmџuy=џŽrџЇЇЄџДДЛџААВџЏАЏџЅЅЅя```�€€€��������������������������������ЄЄЄЋЋЋ•••ЭЈЈЈџЇЇЇћЄЄЄќ˜˜˜џ­­­ўЋЋЋўЋЋЋџЌЌЌџЌЌЌџЌЌЌџЌЌЌџЋЋЋўЋЋЉўААЖџhj7ўX^�§u|�§ˆ�§‘›�§•ž�§•ž§•Ÿ§•ž§•Ÿ§•ž�§’›�§Œ•�§Š�§t|�§qw§„‡S§ЅЅЁ§ВВИњЌЌЊџ††…p­­­�ЉЉЉЊЊЋ�����������������������������ppp�lll"ЂЂЂјІІІќІІІ§ЁЁЁџšššўЎЎЎџЊЊЊџЌЌЌџЋЋЋџЋЋЋџЋЋЋџЋЋЋџЋЋЋџЋЋЈџЌЌЖџ…Š4џ’œџ•џ‘š�џ˜�џ˜�џ˜�џŽ—�џ—�џ—�џ˜�џ˜�џ™�џ’œџ”žџš�џ‚‹�џxџ‘kћБАИўЃЃЃгЩЪЦЉЊЅОЙц������������������������������ƒƒƒJЃЃЃўЅЅЅ§ІІІўžžžўœœœџЏЏЏџЋЋЋџЌЌЌџЎЎЎџЏЏЏџЏЏЏџЎЎЎџЌЌЌџЋЌЉџЌЋЗџŒ‘;џŽ—�џŽ—џ˜�џ˜�џ˜џ™џ‘™џ‘šџ‘šџ™џ˜џ˜�џŽ—�џŽ—џ—џ’›џ‘š�ўŠ�ўƒ†>ќЅЅЉџ}}„I˜”Є�•”ƒ‚‰��������������������������sЅЅЅўЅЅЅћЇЇЇџџ   џЎЎЎџЎЎЎџВВВџГГГџГГГџГГГџГГГџВВВџЏЏ­џЎЎЙџŒ‘Aџ™�џ™џ™џ‘š�џ™�џŒ•�џ‰“�џ‰“�џŠ”�џ—�џ‘›�џ“œ�џ’›�џ‘›�џ‘›�џ‘š�џ™�џ”ž�џ‹•�ћƒ‰!ў’’‰В“І›�ЋЏ‚����‰‰‰���������������������ЏЏЏ�“““šІІІџЄЄЄњЇЇЇў›››џЂЂЂџВВВџГГГџГГГџГГГџГГГџГГГџГГГџГГГџГГБџЕЕПџ‹Gџ‡‘�џŒ•�џŒ–�џ‰‘�џŒ“&џ—›PџžЁiџž lџšeџ”JџƒŠџ‰џˆџ„‹џƒ‰џƒ‰џ‚‰!џˆ&ў…Š,ў‚‡)§nqFљ:F?(dfZ�llfƒƒƒœœœƒƒƒЗЗЗ�ВВВ�����ёёё�›››ИІІІџЅЅЅћЊЊЊџœœœџЈЈЈџЖЖЖџВВВџГГГџДДДџГГГџГГГџГГГџГГГџВВВџЖЖИџƒџ…‡jџˆŠdџ„Tџ‚„rџ™˜ џš™ЄџŸžЈџЅЅЎџœІџ—–Ёџ‰‰џyyvџŽŽ’џ””™џ””šџ––žџ——Ÿџ˜˜Ёў˜˜Ђџ—–Ђќ™™ў‡…‡в’‘•ЅІЅ�zzz�ЃЃЃ��ддд�ЫЫЫ�kkk�њњњаЈЈЈџЋЋЋќАААџ   џЊЊЊџЕЕЕџВВВџДДДџГГГџДДДџДДДџГГГџДДГџВВГџЕЕЕџ––˜џ˜˜џššЁџœЅџ——›џ„„ƒџ|џ††„џˆˆ†џ††„џ‡‡…џ}џ——˜џ™™™џ••”џ’’џŽџ‹‹‰џ‡‡…џƒƒ‚ўŽŽŒџŽŽŽќџzzzУv‹‹‹{ˆˆˆ}wwwNЎЎЎ�ФФФ```� (тЋЋЋџ­­­§ЏЏЏџ   џЉЉЉџЕЕЕџГГГџГГГџДДДџДДДџДДДџДДДџГГДџГГВџЖЖЗџ–––џ””’џ›œšџŠŠ‡џttsџ‚‚‚џŒŒŒџџџ’’’џ•••џ‡‡‡џџyyyџzzzџzzzџzzzџ~~~џwwwџ„„„џЎЎЎўЊЊЊџЊЊЊќ­­­џЌЌЌџЋЋЋџЌЌЌџ™™™рАААГГГeeeqqqTЂЂЂь­­­џЌЌЌўАААџЁЁЁџЈЈЈџЖЖЖџГГГџДДДџДДДџДДДџДДДџДДДџДДДџВВВџЗЗЗџ˜˜˜џ‘‘‘џ˜˜˜џƒƒƒџ•••џšššџ™™™ў›››џšššўšššў›››ўˆˆˆўzzzџ†††ў†††џ†††џ‡‡‡џ€€€џ€€€џЅЅЄџЋЌЊџЋЋЉўЋЋЊџЋЋЊ§ЋЋЊћЋЋЊљЌЌЋїЊЊЊћxxxЇTTT�ЋЋЋ�}}}ЉЉЉђ­­­џ­­­§АААџЂЂЂџЇЇЇџЖЖЖџГГГџДДДџДДДџДДДџДДДџДДДџДДДџВВВџЗЗЗџšššў‘‘‘џ›››§ћšššћšššћ˜˜˜њ˜˜˜њ–––њ•••њ•••ћ}}}ќrrrў|||џxxxўyyyџsssџ‚‚џЋЋЌџББЕџЎ­БџЏЏГџЏЏГџЏЎДџАЏГџААВџЎЎЎџААЏџЏЏЏџ‘‘‘О•••‚‚‚ЋЋЋіЎЎЎџ­­­ўАААџЂЂЂџЇЇЇџЖЖЖџГГГџДДДџДДДџДДДџДДДџДДДџДДДџГГГџЕЕЕўЅЅЅџКККўЧЧЧџ†††џxxxџ€€€џ}}}џ|||џzzzџzzzџ{{{џxxxџtttўuuuўwwwџ{{{џuuuџ˜˜™џ  œџ—™†џš›ˆџ™š†џ™š†џ™›„ў•–‚џ’’Œш–•™д––™жŸŸŸвžžžу___ZŠŠŠГЋЋЋљ­­­џЌЌЌўЏЏЏџЂЂЂџЇЇЇџЕЕЕџВВГџГГДџГГГџГГГџГГГџГГГџГГГџВВВџЖЖЖџЄЄЄ§НННўЄЄЄэ‘‘‘ДЉnnn›oooŽnnnjjjtlllgwwwUiii†ЄЄЄџЌЌЌќЎЎЎўБББўДДГџЙЙКџЇЇЂџ€ˆ џ‰’�џ‡�џˆ�џŠ“�њ‰�џcifl�nu�������rrrŒŒŒЗЋЋЋњЎЎЎџЏЏЏўБББџЁЁЁџЈЈЈџЕЕГџВВАџГГБџГГБџГГБџГГБџГГБџГГВџГГГџЖЖЖўІІІћЕЕЕџŠŠŠ^ЌЌЌ�ІІІ�ˆˆˆ�†††��www�uuu�ЮЮЮ�ллл�­­­ШХХХўТТТќТТТџСССџССРџППЩџŽ”1џš�џ‘™џ‘š�џ™�ќ‘›�џŽ—ЪŸ��ЈИ��48��DDD�^^^�ŒŒŒЗЌЌЌњЌЌЌџ   ўЊЊЊџžžžџЋЋЌџИЗСџЕДПџЖЕСџЕЕРџЖЕРџЕЕРџЕДРџДДЙџАБАџААБ§ЅЅЅџЏЏЏчjjjkkk“““€€€zzzuuuyyyВВВЕЕЕ�•••nМММџПППћПППўПППџООМџТСЬџ”—Rџ‹•�џ˜џŽ—�џ˜�§Ž—�џ“›тVkY Ј­E�ЂЈ*���������ŠŠŠГ­­­љЇЇЇџ”””ўŸŸŸџ’’“џšš•џ’•Xџ“Pџ“Oџ“MџŽ“Kџ“KџŒ‘Dџ“pџЈЈ­џЃЃЂќВВВўЌЌЌШ����ѕѕѕ�eee�����������������vvv�ŸŸŸŽŽŽ�‰‰‰IЛЛЛџРРР§ППП§ПППџППНџУТЬџ–š]џ‹”�џ˜џ˜�џ™�ќŽ—�џ’›шЁЈšЄ�ЂЇ*���������ƒƒƒœ­­­іЇЇЇџŸŸŸ§ВВБџЎЎАџЋЋ џ˜џŒ–�џ—�џ—�џŒ–�џŽ—�џŠ”�џ‘–GџУУЮџРСОќФФФџЋЋЋЮџџџ����ŒŒŒ������������������žžžŒŒŒNЛЛЛўРРР§ППП§РРРџООМџТТЬџ•™WџŒ•�џ™џŽ—�џ™�§˜�џ’›чБИ)І�ЂЋ*���������{{{yЌЌЌёЉЉЉџ›››ўЏЏЎџЌЌ­џЌ­Љџ“›џ˜џ™џ™џ™џ˜џŽ˜џ’3џННЦџООН§СССўГГГ№EEE```zzz�ЭЭЭ���������ƒƒƒ�zzz�ФФФЩЩЩ�šššПППџПППћПППўПППџППНџПОЩџ”;џŽ˜�џ˜џ˜�џ˜�ќŽ—�џ‘šр'>�ЂЊ:�ЂЊ*���������^^^JЇЇЇыЊЊЊџ›››§ЏЏЏџ­­ЋџЎЎГџ˜ž.џ—�џ™џ™�џ™�џŽ—�џš�џ‡ џГГБџТТТўРРПњОООџ–––~ИИИ�ЗЗЗСССZZZ�```�žžž�yyyНННППП ­­­оСССўПППќРРРџОООџСССџЕЕЗџˆџ™�џŽ—�џ™�ўŽ—�ћ‘šў›ЃФŽ™ �žЇ �ЂЋ*���������ЄЄЄмЌЌЌџššš§ЏЏЏџ­­ЉџЏЎИџЂЇZџ˜�џ˜џ˜�џ™�џ˜�џ™џ‰“�џœŸuџУТЪўИИЕ§ЙЙЙќБББѕBЏЏЏ�ЏЏЏ�‹‹‹���ЅЅЅЛЛЛ�­­­�ŒŒŒЂЕЕЕџДДДћЖЖЖџЛЛЛўООМџФФЫџŸЁџˆ’�џ™џ˜�џ™�ў–�њ›ЄўЈЏ4–ЏЕ7�ЈА-����������������ЂЂЂУЎЎЎџšššќЎЎЎџЌЌЋџЎ­ЕџЋ­Šџ–Ÿ џŽ—�џ™�џ™�џ™�џ˜�џ™�џ‡Žџ­ЌБўДДГџБББ§ЕЕЕўЊЊЊђЄЄЄlООО �###�žžž�ЉЉЉ.   ЏЗЗЗџГГГќГГГўГГГўБББџККИџИИРџ‰#џ™�џ˜џ™�ў˜�џ—�ћЂЊ(џЂЊ-SІ­2�ЃЋ)������������ЦЦЦ�™™™ЁЎЎЎўšššњЌЌЌў­­­џ­ЌЎџЎ­ЌџЂЉ8џ™�џ˜�џ˜�џ˜�џŽ—�џ™џ‹”�џ‰NџЕДПўДДБџБББ§ЖЖЖџАААџЏЏЏрІІІЎ———ЁœœœУЌЌЌљЖЖЖџГГГќГГГџГГГџВВГўГГЏџЕДСџŽ’TџŒ•�џ™џ˜�џ˜�џŽ—�ќ” §ЅЌ.цНТLЅ­%� Ї%�������������ЁЁЁ�“““vЎЎЎў›››ћЊЊЊџЎЎЎџЌ­Ћџ­­ЖџЋЎxџ™ЂџŽ–�џ™�џ˜�џ˜�џŽ—�џ‘šџ‡�џŽ‘cџЕДРўЕЕДџВВАўГГГ§ДДДџЕЕЕџЗЗЗџЗЗЗџЕЕЕџВВВќГГДџГГГўВВАўЕЕГџЖЕСџ‘”hџˆ‘�џ‘šџ˜�џ™�ў™�ў–�ћ›ЃџЈЏ7†ДЛD�ЇЏ+ŸЇ#�������������”””�………HЌЌЌџ§ЇЇЇўЏЏЏџ­­Ќџ­ЌЎџ­­ЊџЇ­Bџ’›џŽ—�џ™�џ™�џ˜�џŽ—�џ‘šџ‰‘�џŒRџЌЌВўИЗОўЕЕДўГГАќВВАћВВБћВВБћВВБ§ГГБўГГАўЕЕГўЗЗНџ­­Еџ‘Xџˆ‘�џ‘šџ˜�џ™�џ™�џŽ—�ќ’›ўІЎ&цЈА0ЄЌ- Ї.� Ј#�������������]]]�RRRЉЉЉђЂЂЂџЁЁЁ§ЏЏЏў­­­џ­­Ћџ­­Гџ­ЎŽџЁЉ$џ˜�џ˜�џ™�џ™�џ™�џ˜�џ‘šџŒ•�џ†Œ џ˜šzџЌЋАџЕДПџИЗПџИЗМџЗЗЛџИЗМџИЗОџЖЕПџ­ЌВџ˜›џ†Œ%џ‹•�џ‘š�џ˜�џ™�џ™�џ˜�ўŽ—�ћ˜ џŒ’6f•$�—ž%ЁЈ,�����������������хххљљљЂЂЂЬЇЇЇўќАААџЌЌЌџ­Ў­џЌ­ЋџЎ­ЕџЋЏsџІџŽ—�џ˜�џ™�џ˜�џ™�џ˜�џ™џ™�џˆ’�џ†џŽ’Nџ—™uџŸŠџ  ‘џŸ‹џ—™wџŽ’Rџ†џˆ‘�џ™�џ™џ˜�џ™�џ˜�џ˜�ў˜§“џ˜FьЏЎMnkЃ�hЅЌ-�����������������ЛЛЛССС�ššš”ЋЋЋў™™™њЎЎЎў­­­џЎЎЎџ­­­џ­­­џ­­ВџЊЎhџœЄџŽ—�џ˜�џ™�џ™�џ™�џ˜�џ˜џ‘šџ‘š�џ–�џ‰’�џ‡�џ†�џ†�џˆ‘�џŒ–�џš�џ‘šџ˜џ˜�џ™�џ˜�ў™�ў˜џ—�љЁЇJќЁЁЇЊшчИ�едхty%���������������������——— �‡‡‡SЏЏЏџŸŸŸћ­­­ў­­­ў­­­ўЎЎЎџ­­­џ­­­џ­­ВџЊЎmџЅџ™�џŽ—�џ™�џ™�џ˜�џ™�џ˜�џ˜џ™џ‘šџ‘š�џ‘›�џ‘š�џ‘šџ™џ˜џ˜�џ™�џ™�ў™�ў™џŽ—�ў—�ћІЋMљКЙМџŒŒŽVš™Џ�ŸŸžsx���������������������‡‡‡yyy�rrrЎЎЎїЋЋЋџЌЌЌјГГГњ­­­ћ­­­ќ­­­§Ќ­Ќ§Ќ­Ќў­­ДўЋ­‚ўЁЈ,џ“œўŽ—�џ˜џ™џ™�џ™�џ™�џ™�џ˜�џ˜�џ˜�џ˜�џ˜�џ™�ў™�ў™�ў™�ў˜�§˜�њŽ˜�ћ” џЉ­gџЕДЛџЌЌ­Ь’“„„~�‰‰‰��������������������������ЗЗЗœœœ�„„„QЁЁЁзЃЃЃџЙЙЙџЖЖЖџЖЖЖџДДДџВВВџАААџЎЏ­§ЎЎЖћЌ­ЁћЅЊWћ™Ђћ‘š�ћŽ—�ќŽ—�§Ž—�§˜�§˜�ў˜�ў™�ў™�ў˜�ў˜�ў˜�§˜�ћ˜�ћ™�ў‘š�џ” џšЁ4џЅЇŽцГВТЁбббJХХТъъы�­­Ў�ŒŒŒ�������������������������TTT�ППП�xxxaaa�жжж ‚‚‚k˜ЃЃЃАІІІЩЊЊЊс­­­№АААќАААџААЎџВВДџДДКџГДžџЊЏcџŸЇ-џ˜Ёџ”џ’›�џ‘š�џ™�џ˜�џ˜�џ™�џ‘š�џ˜џ“œџ• џ“›џ‘—"р‹ŽW „‚œTŽКЉЈЗ�����ЛЛК�ннн�ЇЇЇ�ˆˆˆ�����������������������������ЕЕЕ�|||�rrrЗЗЗ�ŽŽŽ�РРР������������XXXlll-ŽŽŽBŽŽ[™™˜t˜˜–‹žžІЃЃЂЏИЅІœШЁЃtй›ŸKц–/ђ–!љ—Ÿќ™ЁџšЁџ˜ §—ŸђЄЋз˜Ÿ"Џ–(w~ƒ.: �џ џџ��џџК�����СПбџџџммк�ццц�   �������������������������������������ŽŽŽ�xxx�ааа�‡‡‡БББџџџ???� �nnn��“““�ЃЃЃ�ЕЕЕ�����ииь���������&џaUџb`ˆopS'x|40‰Ž79‹:<~„-0y|8ю№ЕР�І­�‚ˆ)�]Z„���џh[а����ХУе�ђђї��������������������������������������������������������������������������������ЊЊЊwwwšššІІІДГДџџџИЙКџџџџџц�5#џ�H2џ�_ZЋ�qrV�„8�Œ‘<�”?�…‹0�}€9�ѓѕ�ЉГІЎ„‹#������������������������������������������������������������������������������������������������������������������������������������������������������•,{)w{3{7‡$���§џ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��ќ�џџџ��ј���џ��р���џ��Р���џ��Р���џ��Р���џ��€���џ��€���џ��€����џ��€������€�������������������������������������ј�����ј�����ќ�����ќ�����ј���€�ј���€�№���€�р���€����?��€����?��Р������Р������Р����џ��Р����џ��Р����џ��р���џ��р���џ��ј���џ��џј�џџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��џџџџџџ��(��� ���@���� �����€������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vvv�{{{�ZZZ�”””’’’’’’’’’nnn��������fff�����������������������������������������������������������������������������ЛЛЛ�[[[�{{{aaa��ŒŒŒ����‹‹‹�ccc�aa`lko“”yy|Ooq<uxE‹jЅІ™­­­ЋЋЋЌЌЌЎЎЎ•••ЄЄЄ�ІІІ���������������������ŠŠŠ�ЁЁЁSSSooo�WWW ……….‰‰‰,‡‡‡-‡‡‡-‡‡‡,†††,\\YYYO�nnj�‰‰y�qrP�fh;�kmE�‚‚k�ІІЉ�УСз�СРа�ДДЖ�ДДГ�———�����������������������žžž�ŸŸŸ�‡‡‡O’’’жЇЇЇўЊЊЊўЉЉЉџЊЊЊџЊЊЊ§ЌЌЌџ››ХЄЄЋ™ŸžЃœŽ‰™yyj’ss]“wxd“……|“˜˜“ІІГ“ЈЇА’ЁЁ žžœ“‹‹‹&�™™™�����������������–––‘‘‘ЃЃЃЄЄЄЄџŸŸŸџЌЌЌўЋЋЋџЌЌЌџЌЌЌџЋЋЊџЏЏАџ››”џ~Yџrv*џsxџu| џv}џv| џv{џy~%џƒ†Kџ˜™„џЌЌАџББЖџœœППП�ЛЛЛ——œ�����������������ŸŸŸ�———ŠЄЄЄџЃЃЃћžžž§­­­ўЊЊЊўЋЋЋўЋЋЋўЊЉЇўБАИў‰Œ_ќu}�ћ–�ћ’œ�ћ”�ћ”ž�ћ”ž�ћ“œ�ћ™�ћˆ‘�ћ‡�ћ‡%љ‰ћЌЋЗё  ž’‘™�—–Љ�����������������ЩЩЩ�ЕЇЇЇќЁЁЁћ   џ­­­ў­­­џАААџАААџ­­ЊџЎЎИџšiџ‘›џ‘šџ™�џŽ—�џŒ–�џ–�џ˜�џ‘›�џ“œ�џ”�џš�ў…Ž�ћ’–Xџ––œrЃЄž�ІЇ—ttr�������������єєє   еІІІџ   §ЃЃЃџВВВџВВВџГГГџГГГџВВАџЕДНџšœpџ‡‘�џŒ–�џ‹”џ’™(џ—œ<џ•›;џŽ”"џ‡џˆ џˆџˆџŒ“ќ…ў}Qзbg;lpA�vvt�EEE�777�����]]].ЂЂЂшЉЉЉџЃЃЃўЈЈЈџЕЕЕџВВВџГГГџГГГџВВВџЗЗИџžž—џ‰‹lџŒŽeџŽ}џ“’˜џ››Єџš™ЃџŒŒџƒƒ{џ““Žџ“”’џ’’’ў’‘•ў”ќŽŽŒџut~•{zˆ ŠŠ‰ '''LLLџџџ………`ЄЄЄєЏЏЏџЇЇЇ§ЊЊЊџДДДџВВВџДДДџГГГџГГГџЖЖЖџЂЂЃџ˜˜žџ––žџ‚…ў„„‚ў‰‰†ўŠўŠŠ‰ўˆˆŠўˆˆ‰џ„„„ў……„џzzyџŽўЃЃЃ§  џЄЅЂрІІІс””” ХХХ�­­­‘ЉЉЉљЏЏЏџЇЇЇўЉЉЉџЕЕЕџГГГџГГГџДДДџВВВџЖЖЖўЃЃЂџўŒŒ‰ћ““’ћœœœћ›››ћŸŸŸќ——–§yyx§~џ€ў}}|џ‹‹‹ўЎ­АџБАДўАЏГќЏЏГџАЏБџЋЋЌџ——™|ššš–––КЌЌЌћЎЎЎџЇЇЇџЈЈЈџЖЖЖџВВГџГГГџГГГџВВВџЕЕЕџЈЈЈџБББџšššџ………џ‡‡‡џ„„„џ{{{џvvvџrrrџwwwџwwwџ~~ўЃЃ џЁЂ”ўŸ “ў Ё’ў§›››хсšš—ь~~~lšššЯ­­­ќАААџЉЉЉўЉЉЈџЖЖДџГГБџДДВџДДВџГГВџЕЕЕўЌЌЌўИИИћ‰‰‰Žmmms|||giiiZЖЖЖKЖЖЖBЁЁЁдВВВџГГВћККМџЌ­Ѓџ… џŠ“ў‹”ќƒ‹ўou Ylr rxlll›››вЌЌЌ§ЈЈЈџЂЂЂџЈЈЊџЕДОџВВЛџГГМџГВЛџВБИџББАњЊЊЊўЈЈЈМллл�ппп�555�qqq�ЗЗЗ�ККК�ЄЄЄcРРРџТТСњТТРўОНФџ—"џ™�џ˜�њ‘š�џ”y“œ�’œ��ppp�›››ЫЊЊЊќ›џЁЁЅўœ‡џ–7џ–6џ–4џ•1џ‘•PџЎЎВљГГВўЊЊЊФФФУУУššš~~~››››››———;КККўПППќППН§ООЦџ‘—/џ—�ў—ћ˜�џ’œˆ‘š��‘š�����˜˜˜ЌЉЉЉћЃЃ џВВЙџЈЉŠџ—�џŽ˜�џŽ—�џŽ˜�џŽ–џННТњУУТџЎЎ­Бшшш�гггННН�ŠŠŠ�ВВВВВВ�ŸŸŸVОООџПППњРРПўМЛСџŽ•џ˜�џ˜�њ˜�ў’›™��™�����yЉЉЉјЁЁЁџЎЎБўЋЋ џ’› џŽ—џ˜џšџŠ“џЏА §УУЦќЖЖЕі’’’.ІІІ�ЙЙЙ�xxxббб�ФФФ�ЋЋЋУМММўННМћУУХџАБЄџ‰’џ™�ўŽ—�ћ” џЄЋ%_ЁЈ$�ŸІ����mmm=ЈЈЈьЂЂЂџ­­Ќ§ЏЎДџžЄ:џ—�џ™џ˜џ–�џ•šMџЗЖТќГГЎџЊЊЊрДДДGДДДННН�ЋЋЋ#›››ЈГГГџВВВќГГЎџОНЩў—œOџŒ•�ў™ўŽ—�ўЅјЃЈD%БИH�Ѕ­,����ссс ЇЇЇиЂЂЂџЌЌЊ§Ў­ЖџЊЌ{џ’œџŽ—џ˜�џ™џˆ‘ў›~џЗЗС§ЕЕБџ­­ЋџЄЄЄеЗЗЖЩЏЏЏѓЕЕЕџВВАќГГЏџЗЖТўŸ}џŠ“џ™џŽ—�ћ‘šўЃЋ*П|‚ �ЂЊ(šЅ������ннн�ЅЅЅЕЃЃЃўЋЋЊќ­­ЎўЎЎЎџЂЈ8џŽ—�џ˜џ˜�џ™ў‰’ўšœsџГВН§ИИП§ИИЙџГГВџЖЖЕџЕЕЕћЖЖМџГГНўšuўŠ“џ™�ў˜�ўŽ—�ќ™Ё§ЃЊ7EЏЖ8�ЃЊ(ЂЋ�����ЌЌЌ�ЂЂЂ„ЃЃЃўЈЈЈћЎЎ­џ­­Гџ­Ў’џ›Ѓџ–�џ™џ˜�џ™�џ‹”�ўŽ”7ўŸЁ€ўЊЊІќЏЏГћЏЎВ§ЊЊЇўŸ ў”9ў‹”�џ™�џ˜�џ˜ћš�ў–(Ж”�ІЎ Ј%�ЄЌ%�����œœœ�–––IЅЅЅўЄЄЄќЎЎЏў­­Ћў­­ЕўЋЏ€џ˜Ё џ–�џ˜џ™џ‘šџŽ˜�џŠ“�џŠ’ џ‹’џ‹’џŠ‘ џŠ“�џŽ˜�ў™ў˜�ў˜�§Œ–�јžЄ@џ››Ђ\ЉЊž�ІЈ„ЃЋ0���������ššš�’’’ЉЉЉєЊЊЊџАААћЌЌЌћЌЌЋћ­ЌЗћЋЎ„ћšЂќ—�§Ž—�ў˜ў™ў‘šўš�џ™�ў™�ўš�ў‘š�ў˜ќ˜�ћ˜�ў™�џЄЉKџВВГђ†…‘ŽЇ�žœФ�������������СССККК�ЅЅЅgžžžьВВВџГГГџБББџББЏџАЏЗџЏЏŸџЄЉNџ–ž џ™�џ˜�ў˜�ќŽ˜�ќŽ—�ќŽ—�ќŽ˜�§˜�џ™�џ’›џ“›џžЂdйЌЊМŽЇЇВ0…� ЁŽ� ŸЕ�����������������{{{———�jjj–––L˜˜˜fЈЈЈЂЂЂЊЊЈЗЊЊЏЭЎ­ЖрЊЌ№ЁІTњ˜Ÿ(џ”œџ“œ џ” џ”œ џ• џ•ё˜Щ‡(ˆy{Y@ljv­ЊЫ�фуч�����›œ˜�™™™�����������������‚‚‚�ІІІkkk�ІІІ�ДДД�ВВВ�ћќќ�ЪЪЧ������wrМ”в%••–3‰OCŒ’.P•œ-Y’˜+T•›-<ˆŒ:ruD�y|(�JU��ŠЉ��ЕБзззмїї§�ЉЉЉ���������������������–––�ЅЅЅ�gggЇЇЇИИИЙЙЙџџџШШЧ��������‡ƒз�œ˜е�—–’�•›E�”š+�Є*�™ )�›Ђ.�–œ5�sv@�x{+€ˆtx-�СПг�ккн������������������������������������������������������������������������‘“ƒ‚†•œ5šЁ" Ј"œЄ ™ #�������Š&���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������џџџџџџџџџџџџџџџџџџџџ№��џР��€��€��?€��?€��������������`�р�№�р�р€Р€��€��€��Р��Р��?Р��ј�џџў?џџџџџџџџџџџџџџџџџ(������0���� �����` ����������������������������������������������������������������������������������������������������������������������ЇЇЇ�ЅЅЅ����БББГГГГГГЕЕЕ���ССС�ЗЗЗ�����������������������������������������������������ccc�›››�‘‘‘�   �ЁЁЁ�ЁЁЁ�ЃЃЃ�‘‘‘�ЄЄ­�ЦФс�������������������џ�����………�{{{�LLL�ИИИ�������������ŽŽŽ�ЃЃЃ�‚‚‚�{{{$™™™HšššE™™™E›››HŠ‹Š&ЂЂЊ�иеџ�����,����������V`����������кки�юющ�ЌЌЌ�������������šššЂЂЂ –––~œœœіЋЋЋџЋЋЋџЊЊЊџ­­­џЃЃЄї——з‡‰hиtx;дqu.гuy<г‚…]г—˜ŽгЉЉГбЊЉЎг““’1˜˜—�ЈЈЈœ‘���������ЦЦЦ�ЋЄЄЄџЂЂЂўЌЌЌќЊЊЊ§ЊЊЈ§ЏЏДќ—˜ƒџszџ‚Š�џ‰’�џ‹”�џ‰’�џ…�џƒŠџ‹AџЃЃ–џІЅЏŸФФШ�ЛЛЛ‘’x�“““�����ЬЬЬ ЃЃЃтЃЃЃќЂЂЂќЎЎЎџАААўЏЏЎўБАЙџž zў™�§“�§™�§™�§š�§“œ�§‘›�§‹–�ћ‡�§’–ZѓЌЉеЇІЩ–˜ƒ“““����wwwCЄЄЄяЃЃЃўЇЇЇ§ДДДўГГГџГГВџЗЖЛџЃЄ’џ†Œ%џŠ(џ’–Yџœžvџ“–eџ„ˆ<џŒFџŽ’Oў”Mќ‡ŠPџtti‹yzh�ƒg��ЁЁЁ‘‘‘ЈЈЈјЉЉЉџЋЋЋўЕЕЕџВВВџВВВџЖЖЕўЇЇЉџ“’›ўŒ•ќ‡†’ќ™ќšћˆ‡“§Œ˜џ‹‹–ў‚Žў••›ўœџššœБššŸЄ‡‡…�———ГЌЌЌќЊЊЊџЊЊЊўДДДџВВГџВВВџЕЕЖџЉЉЉџ••”џ‹‹Šџ••“џ””“џŽџzzxџvvtџttrџŠŠ‰џЏЎКџЏЏЛўЏЎИџЏЏЕџЂЁЉеЁЁЉ,žžžжЎЎЎ§ЋЋЋџЊЊЊџЕЕГџГГБџГГВџЕЕДўЏЏЏџВВВ§•••зzzzЬƒƒƒС———Б‡‡‡ш‘‘џ––™§ЄЅšџ’—Lў”™IўŽ’Jњ_‡ZƒwzMNЁЁЁпЋЋЋўЄЄЄџЉЈЋўДГЛџББЙџВБИџББГћ­­ЌџЈЈЈЃООО�ЊЊЊ�РРР�ЛЛЛ�ЊЊЊ]ТТТџЦЦШќЙЙЕў‹”ў—�§Œ–�ўˆ�.ˆ‘��‹”��ЃЃЃжЄЄЃ§ЃЂЉџž }џ–)џ‘—*џ”$џ Ђ|ћИЗОўЊЊЇnЗЗЗ�ОООРРРЄЄЄ.МММўПРПўММП§˜џ˜ќ™ў”Q’œ�“�ŸŸŸАЅЅЃќ­ЌЕџЇЊў–�џ˜�џ‹•�џžЂVћЦХвџББЌБЯЯЯ�ЬЬЬ�ТТТ�МММ�ЇЇЇnНННџУТХћЖЖАўŒ•ў˜�§‘šџ Ї>šЂ�˜ЁšššrЄЄЄїЉЉЋџЎЎІў”œџŽ—џ™џŽ•ўГВЖќЖЖИџ›|ŸŸŸ ЈЈЈЊЊЊOААЏ№ГДА§ПОЮ§ЁЄjџ‹•�§Ž—�ўšЃё™ EВИN�ЋГ0�”””+ЄЄЄъЈЈІџАЏЙ§ЃЈQџ—�џ™џ–�џ‘–CўГВПўЗЗНџЏЏЎшЎЏ­оААЏџЕЕЖџЗЖХўЃЄџ‹”џ˜�ћ‘šџЁЈ&І‰“�˜ ЋВ/�ггг�ЃЃЃЭІІЅўЎЎВќЎЏЂўšЂџŒ–�џ‘™ўŒ–�џ•1ўІЇ”§ВВИџДДОџГГНў­­Ќў›žiџ‹“ў™�ў—�ќ“œіЄ­.%ЂЉ)�ЃЋ%ІЎ%�ЎЎЎ�ЁЁЁžЅЅЅў­­Ћј­ЌДќЌЎ‰§–Ÿ §Œ–�ў™ў˜�ў‹”�ў– §’˜7ќ‘–0ўŒ”ўŒ•�ў™�ќŒ–�љ“œџŸЂcКБЛK�ЋБ\ЄЌ)�����ЎЎЎ�ЇЇЇPЈЈЈџАААџЎЏ­џЏЏЗџЌЎџšЂ$џŽ˜�ўŽ—�§™�ќ˜�ћŽ—�ћŽ˜�ћ™�ў™�џ™џ”œџЊЌ‡я­ЋФOВАФМНМЃЊ(�����ЛЛЛЃЃЃ‡‡‡TЇЇЇЃЎЎЎНЊЊЈеЎЎЖщ­­ЉјІЊfџ™ (џ“› џ‘šџ’›џ’šџ’›џ— щŽ•(Џ“–rb—˜‘ЅЅЋ�”•Š�ММК���������ООО�МММ�ЉЉЉ�ККК�дде��y|H ŠЊІч.ЁЁЄA˜œNS—&b–"k’™#_“$9‚‡(E>’�ЖЕП�Л­џ�ЊЉЗ� ŸЅ�НОИ���������ЬЬЬ�����uuuДДДЯЯЯBBC�Ž‰�˜�ЌЉе�ІЇ›�› B�™Ё�šЂ�—Ÿ�•œ#�‚†)�][^}„dp��УУЧ�ЗЗЙ����������������������������������������ДДГМЛФЎАŠЁЉ'˜ ›Ѓ›ЄŸЇ�����������������������������������������������������������������������������������������������������������������������������������џџџ�џџџ�џџџ�џџџ�Р�?�€��€��€������������<��>��<���€��€��€��€��Р�?�џУџ�џџџ�џџџ�џџџ�(������ ���� �����@������������������ДДД�ззз����ААА БББ ЊЊЊЭЭЮЕЖА”•ЇЈЅЉЉЊ�������ŸŸŸ�˜˜˜�����ЁЁЁ�ЌЌЌ–––�ЇЇЈ�ЇЇІ�ЉЉЎ�ПНф�œšЕ�hf~�ŠП�ЖВџ�žžž�ŠŠŠ�ŠŠˆ�“““�����ЄЄЄ�ЈЈЈ�“““FЄЄЄdЄЄЃdЁЁЄTДГЫ)ŸА'jh~%‡„А%ЋЇщ&ŸŸЌ"~~w�‚„h�“^�����˜˜˜   ЅЂЂЂџЋЋЋџЌЌЎџЃЃџ‡‹BўƒŠ§€† ќ„Š ќ“NњЃЄ˜ј ŸІ8ЇЅК­­Ж����˜˜˜\ЂЂЂўІІІќААЏњВБЗњЄЅ‘ћˆ’�ў‘š�ў“›џŽ—�џŠ”�њ”џ’f ™ŸI�•›G�ћћћЁІІІњЌЌЌўДДДџЕЕЖўЌЌЊџq§Œ}ќ•••ў‰Š}§‹Œ}ў‰Šz§‘…ї’•r{‘“oAšš�ЃЃЃдЌЌЌ§­­­џДДДўДДДџАААџ™™Ÿџ‰‰Œџџ„џzz~џŽўЇЈЁўЅЅЅџžž­фЃЂZЇЇЇыЉЉЈ§ЊЊЌџВВДџББГќААЏўЇЇІŸ››™AЉЉЉ1ЁЁžsЕЕИўВГЂћ• ў‹”ш{%”›ЃЃžсІЅЎўžЁoџ—ў—%њДДАџББДUССЧ�ДДГ�ЊЊЇ)ТТУџКЛГ§—ў™�єžЇ šЃ�  ™­ЈЈЏќЈЊ€џŽ˜�џ‹•�§ЊЌ…ўЗЗФЯЛЛК(ИИЕЌЌІАМЛШўЉЋњ‹•�ў—Ÿн‰7…Ž™™˜aЅЅЅєЎЎАўšЁ*ў–�џŽ–ўЇЉ’џЏЎИїГГНёЕДПџЇЈ’ўŽ–ј˜�§šЂ…Š“ �•žЃЃЃІІЄц­­ВџЌ­”§•žќŒ–�ћŒ•�ј—>§›ŸUў•›8јŒ•�§Ž˜�џ˜Ÿ-§ЄЈ€ААŠ�ЅЉiААА�™™™~ЊЊЈшЎЎДїЋ­—џœЂ;џ’› џŽ˜�џŽ—�џ˜�џ˜ћ–œ3ЬІЈ‰kДК�ЗИŽ–Ї��џџџ����ssw‘’†"›š­7ЏЎНMŸЃPb‘˜"s•œy•œ^Œ’&+”;�™Ё(�jW=�КЛt� ��ааа�III����ЁЁš�ЊЈШ�ГБШ�ŸЃT�•�–ž�”œ�Œ’)�“G�ЂЈ<}ci�Ѕ­A����������������ЛЛЙЗЗМЕЕЉЂЈE • ” ‘𠐗—Ÿ�Ѕ�› N���������џџ��џџ��уџ��€������������ƒ��У��ƒ�����€��€��ќ?��џџ��џџ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii.res������������������������������������������������0000664�0001750�0001750�00000003174�11412132036�021233� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���џџ��џџ������������������ш�� ���џџ�џџ����� ��������(��� ���@����������������������������������€��€���€€�€���€�€�€€��€€€�РРР���џ��џ���џџ�џ���џ�џ�џџ��џџџ�џџџџџџџџџџџџџџџџџџџЬЯџќЬЯќЬџЬЯџџџџџЬЯџќЬЯќЬџЬЯџџџџџЬЯџЬЬЯќЬџЬЯџџџџџЬЯџЬЬЯќЬџЬЯџџџџџЬЯќЯЬЯќЬџЬЯџџџџџЬЯЬЯЬЯќЬџЬЯџџџџџЬЯЬџЬЯџџџџџџџџџџЬЬЬџЬЯќЬџЬЯџџџџџЬЬЯџЬЯќЬџЬЯџџџџџЬЬџџЬЯќЬџЬЯџџџџџџџџџџџџџџџџџџџџџџџљ™™™Ÿџџџџџџџџџџџљ™™™Ÿџџџџџџџџџџџљ™џџџџџџџџџџџџџџџ™Ÿџџџџџџџџџџџџџџљ™Ÿџџџџџџџџџџџџџџљ™џџџџџџџџџџџџџџџ™џџџџџџџџџџџџџџџ™џџџџџџџџџџџџљ™™™џџџџџџџџџџџџљ™™Ÿџџџџџџџџџџџџџџџџџџџџџџџіfoџfџffџfoіofіoіffџfіffіffіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіffџfіffіffіfffoіfoџfџffџfoџfџfџџџџџџџџџџџџџџџџџ�����������������������������������������������������������������������������������������������������������������������������������0���џџ�M�A�I�N�I�C�O�N��������� ������������ ���ш���№�� ���џџ�џџ����� ��������№4���V�S�_�V�E�R�S�I�O�N�_�I�N�F�O�����Няў��� ������ ������?�������������������������N����S�t�r�i�n�g�F�i�l�e�I�n�f�o���*����0�4�0�9�0�4�E�4���:� ��C�o�m�p�a�n�y�N�a�m�e�����C�h�r�i�s� �R�o�r�d�e�n�����`���F�i�l�e�D�e�s�c�r�i�p�t�i�o�n�����D�I�C�O�M� �a�n�d� �P�A�R�/�R�E�C� �c�o�n�v�e�r�t�e�r���0���F�i�l�e�V�e�r�s�i�o�n�����0�.�9�.�0�.�1���"���I�n�t�e�r�n�a�l�N�a�m�e�������<� ��L�e�g�a�l�C�o�p�y�r�i�g�h�t���C�o�p�y�r�i�g�h�t� �Љ���*���L�e�g�a�l�T�r�a�d�e�m�a�r�k�s���������@� ��O�r�i�g�i�n�a�l�F�i�l�e�n�a�m�e���d�c�m�2�n�i�i�.�e�x�e���0���P�r�o�d�u�c�t�N�a�m�e�����d�c�m�2�n�i�i���.���P�r�o�d�u�c�t�V�e�r�s�i�o�n���0�.�0� ��������C�o�m�m�e�n�t�s�������D�����V�a�r�F�i�l�e�I�n�f�o�����$����T�r�a�n�s�l�a�t�i�o�n����� ф����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii.rci������������������������������������������������0000664�0001750�0001750�00000000665�10422253356�021232� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <MainIcon Enabled="True" Filename="C:\lazarus\dcm2nii\dcm2nii.ico"/> <XPManifest Enabled="False"/> <VersionInfo Enabled="True" CompanyName="Chris Rorden" OrigFilename="dcm2nii.exe" FVMajor="0" FVMinor="9" FVBuildMajor="0" FVBuildMinor="0" ProductName="dcm2nii" FileDescription="DICOM and PAR/REC converter" PVMajor="0" PVMinor="0" PVExtra="" Copyright="Copyright Љ" AutoIncrement="False"/> </CONFIG> ���������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii.or�������������������������������������������������0000664�0001750�0001750�00000003530�10633306164�021067� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������L�����B�������.rsrc�����������ш��<���$���������@��P����SpmF����������(��€���X��€���ˆ��€����SpmF����������@��€����SpmF������� ��Ь�������SpmF�������И��€p��€����SpmF������� ��м�������SpmF���������� ��€����SpmF�����������ь����M�A�I�N�I�C�O�N���ќ���ш����������ф�������������ј��№����������(��� ���@����������������������������������€��€���€€�€���€�€�€€��€€€�РРР���џ��џ���џџ�џ���џ�џ�џџ��џџџ�џџџџџџџџџџџџџџџџџџџЬЯџќЬЯќЬџЬЯџџџџџЬЯџќЬЯќЬџЬЯџџџџџЬЯџЬЬЯќЬџЬЯџџџџџЬЯџЬЬЯќЬџЬЯџџџџџЬЯќЯЬЯќЬџЬЯџџџџџЬЯЬЯЬЯќЬџЬЯџџџџџЬЯЬџЬЯџџџџџџџџџџЬЬЬџЬЯќЬџЬЯџџџџџЬЬЯџЬЯќЬџЬЯџџџџџЬЬџџЬЯќЬџЬЯџџџџџџџџџџџџџџџџџџџџџџџљ™™™Ÿџџџџџџџџџџџљ™™™Ÿџџџџџџџџџџџљ™џџџџџџџџџџџџџџџ™Ÿџџџџџџџџџџџџџџљ™Ÿџџџџџџџџџџџџџџљ™џџџџџџџџџџџџџџџ™џџџџџџџџџџџџџџџ™џџџџџџџџџџџџљ™™™џџџџџџџџџџџџљ™™Ÿџџџџџџџџџџџџџџџџџџџџџџџіfoџfџffџfoіofіoіffџfіffіffіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіffџfіffіffіfffoіfoџfџffџfoџfџfџџџџџџџџџџџџџџџџџ������������������������������������������������������������������������������������������������������������������������������������ ���ш���№4���V�S�_�V�E�R�S�I�O�N�_�I�N�F�O�����Няў��� ������ ������?�������������������������N����S�t�r�i�n�g�F�i�l�e�I�n�f�o���*����0�4�0�9�0�4�E�4���:� ��C�o�m�p�a�n�y�N�a�m�e�����C�h�r�i�s� �R�o�r�d�e�n�����`���F�i�l�e�D�e�s�c�r�i�p�t�i�o�n�����D�I�C�O�M� �a�n�d� �P�A�R�/�R�E�C� �c�o�n�v�e�r�t�e�r���0���F�i�l�e�V�e�r�s�i�o�n�����0�.�9�.�0�.�1���"���I�n�t�e�r�n�a�l�N�a�m�e�������<� ��L�e�g�a�l�C�o�p�y�r�i�g�h�t���C�o�p�y�r�i�g�h�t� �Љ���*���L�e�g�a�l�T�r�a�d�e�m�a�r�k�s���������@� ��O�r�i�g�i�n�a�l�F�i�l�e�n�a�m�e���d�c�m�2�n�i�i�.�e�x�e���0���P�r�o�d�u�c�t�N�a�m�e�����d�c�m�2�n�i�i���.���P�r�o�d�u�c�t�V�e�r�s�i�o�n���0�.�0� ��������C�o�m�m�e�n�t�s�������D�����V�a�r�F�i�l�e�I�n�f�o�����$����T�r�a�n�s�l�a�t�i�o�n����� фЬ��������м��������ь��������.rsrc��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii.lpr������������������������������������������������0000664�0001750�0001750�00000002255�11542347460�021253� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������program dcm2nii; {$IFDEF FPC} {$mode objfpc} {$ELSE} {$APPTYPE CONSOLE} {$ENDIF} {$H+} uses {$IFDEF UNIX} {$IFDEF UseCThreads} cthreads, {$ENDIF} {$ELSE} shellAPI, Windows, {$ENDIF} Classes, inifiles, SysUtils, convert, define_types, sortdicom, dicom, parconvert, filename, dicomtypes, nii_crop, nii_4dto3d, prefs, dialogsx, paramstrs; {$IFNDEF UNIX} //{$R laz.res} {$ENDIF} (*var lIn,lOut: string; Start: dword; lPrefs: TPrefs; begin Start := GetTickCount; kUseDateTimeForID := true; SetDefaultPrefs (lPrefs); lPrefs.Gzip := true; lPrefs.Anonymize := true; lPrefs.SingleNIIFile := true; lPrefs.everyfile := true; lPrefs.AppendDate := false; lPrefs.AppendAcqSeries := true; lPrefs.AppendProtocolName := true; lPrefs.AppendPatientName := false; lPrefs.fourD := true; lPrefs.AppendFilename := true; lOut := ''; lIn := 'C:\dti64\rapid\IM_0001.dcm'; LoadFileList(lIn,lOut,lPrefs); Msg('Finished. Elapsed time: '+inttostr(GetTickCount-Start)); readln; end. *) begin Msg(kVers); kUseDateTimeForID := true; ProcessParamStrs; end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii.lpi������������������������������������������������0000664�0001750�0001750�00000031610�11542347460�021237� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?> <CONFIG> <ProjectOptions> <PathDelim Value="\"/> <Version Value="7"/> <General> <Flags> <LRSInOutputDirectory Value="False"/> </Flags> <MainUnit Value="0"/> <TargetFileExt Value=".exe"/> <ActiveEditorIndexAtStart Value="0"/> </General> <PublishOptions> <Version Value="2"/> <IgnoreBinaries Value="False"/> <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/> </PublishOptions> <RunParams> <local> <FormatVersion Value="1"/> <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/> </local> </RunParams> <Units Count="30"> <Unit0> <Filename Value="dcm2nii.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="dcm2nii"/> <CursorPos X="3" Y="32"/> <TopLine Value="19"/> <EditorIndex Value="0"/> <UsageCount Value="118"/> <Loaded Value="True"/> </Unit0> <Unit1> <Filename Value="convert.pas"/> <UnitName Value="convert"/> <CursorPos X="1" Y="10"/> <TopLine Value="1"/> <EditorIndex Value="6"/> <UsageCount Value="57"/> <Loaded Value="True"/> </Unit1> <Unit2> <Filename Value="define_types.pas"/> <UnitName Value="define_types"/> <CursorPos X="1" Y="330"/> <TopLine Value="317"/> <UsageCount Value="57"/> </Unit2> <Unit3> <Filename Value="gzio2.pas"/> <UnitName Value="gzio2"/> <CursorPos X="7" Y="1784"/> <TopLine Value="1765"/> <UsageCount Value="57"/> </Unit3> <Unit4> <Filename Value="dicom.pas"/> <UnitName Value="dicom"/> <CursorPos X="1" Y="1"/> <TopLine Value="1"/> <EditorIndex Value="10"/> <UsageCount Value="57"/> <Loaded Value="True"/> </Unit4> <Unit5> <Filename Value="nodialogs.pas"/> <UnitName Value="nodialogs"/> <CursorPos X="10" Y="5"/> <TopLine Value="1"/> <UsageCount Value="54"/> </Unit5> <Unit6> <Filename Value="lsjpeg.pas"/> <UnitName Value="lsjpeg"/> <CursorPos X="30" Y="741"/> <TopLine Value="711"/> <EditorIndex Value="8"/> <UsageCount Value="56"/> <Loaded Value="True"/> </Unit6> <Unit7> <Filename Value="GraphicsMathLibrary.pas"/> <UnitName Value="GraphicsMathLibrary"/> <CursorPos X="1" Y="66"/> <TopLine Value="61"/> <UsageCount Value="54"/> </Unit7> <Unit8> <Filename Value="sortdicom.pas"/> <UnitName Value="sortdicom"/> <CursorPos X="24" Y="188"/> <TopLine Value="172"/> <UsageCount Value="57"/> </Unit8> <Unit9> <Filename Value="filename.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="filename"/> <CursorPos X="22" Y="11"/> <TopLine Value="1"/> <EditorIndex Value="1"/> <UsageCount Value="118"/> <Loaded Value="True"/> </Unit9> <Unit10> <Filename Value="dicomtypes.pas"/> <IsPartOfProject Value="True"/> <UnitName Value="dicomtypes"/> <CursorPos X="42" Y="320"/> <TopLine Value="307"/> <UsageCount Value="118"/> </Unit10> <Unit11> <Filename Value="parconvert.pas"/> <UnitName Value="parconvert"/> <CursorPos X="44" Y="1199"/> <TopLine Value="1188"/> <UsageCount Value="57"/> </Unit11> <Unit12> <Filename Value="..\..\junk\unit1.pas"/> <ComponentName Value="Form1"/> <HasResources Value="True"/> <UnitName Value="Unit1"/> <CursorPos X="36" Y="7"/> <TopLine Value="1"/> <UsageCount Value="3"/> </Unit12> <Unit13> <Filename Value="nii4Dto3D.pas"/> <UnitName Value="nii4dto3d"/> <CursorPos X="53" Y="125"/> <TopLine Value="114"/> <UsageCount Value="11"/> </Unit13> <Unit14> <Filename Value="dicomfast.pas"/> <UnitName Value="dicomfast"/> <CursorPos X="6" Y="14"/> <TopLine Value="4"/> <EditorIndex Value="9"/> <UsageCount Value="11"/> <Loaded Value="True"/> </Unit14> <Unit15> <Filename Value="dicomcompat.pas"/> <UnitName Value="dicomcompat"/> <CursorPos X="31" Y="5918"/> <TopLine Value="5888"/> <UsageCount Value="11"/> </Unit15> <Unit16> <Filename Value="dialogsx.pas"/> <UnitName Value="dialogsx"/> <CursorPos X="10" Y="2"/> <TopLine Value="1"/> <UsageCount Value="11"/> </Unit16> <Unit17> <Filename Value="nii_4dto3d.pas"/> <UnitName Value="nii_4dto3d"/> <CursorPos X="53" Y="124"/> <TopLine Value="113"/> <UsageCount Value="11"/> </Unit17> <Unit18> <Filename Value="nii_orient.pas"/> <UnitName Value="nii_orient"/> <CursorPos X="65" Y="4"/> <TopLine Value="1"/> <EditorIndex Value="2"/> <UsageCount Value="11"/> <Loaded Value="True"/> </Unit18> <Unit19> <Filename Value="nii_crop.pas"/> <UnitName Value="nii_crop"/> <CursorPos X="6" Y="2"/> <TopLine Value="1"/> <UsageCount Value="11"/> </Unit19> <Unit20> <Filename Value="paramstrs.pas"/> <UnitName Value="paramstrs"/> <CursorPos X="28" Y="18"/> <TopLine Value="1"/> <EditorIndex Value="7"/> <UsageCount Value="11"/> <Loaded Value="True"/> </Unit20> <Unit21> <Filename Value="readint.pas"/> <UnitName Value="readint"/> <CursorPos X="13" Y="6"/> <TopLine Value="1"/> <UsageCount Value="10"/> </Unit21> <Unit22> <Filename Value="userdir.pas"/> <UnitName Value="userdir"/> <CursorPos X="31" Y="13"/> <TopLine Value="1"/> <UsageCount Value="10"/> </Unit22> <Unit23> <Filename Value="..\common\isgui.inc"/> <CursorPos X="12" Y="1"/> <TopLine Value="1"/> <EditorIndex Value="11"/> <UsageCount Value="10"/> <Loaded Value="True"/> </Unit23> <Unit24> <Filename Value="..\common\define_types.pas"/> <UnitName Value="define_types"/> <CursorPos X="45" Y="9"/> <TopLine Value="1"/> <EditorIndex Value="5"/> <UsageCount Value="10"/> <Loaded Value="True"/> </Unit24> <Unit25> <Filename Value="..\common\gzio2.pas"/> <UnitName Value="gzio2"/> <CursorPos X="35" Y="1849"/> <TopLine Value="1809"/> <UsageCount Value="10"/> </Unit25> <Unit26> <Filename Value="..\common\GraphicsMathLibrary.pas"/> <UnitName Value="GraphicsMathLibrary"/> <CursorPos X="35" Y="552"/> <TopLine Value="547"/> <UsageCount Value="10"/> </Unit26> <Unit27> <Filename Value="..\common\dialogsx.pas"/> <UnitName Value="dialogsx"/> <CursorPos X="1" Y="1"/> <TopLine Value="1"/> <UsageCount Value="10"/> </Unit27> <Unit28> <Filename Value="prefs.pas"/> <UnitName Value="prefs"/> <CursorPos X="55" Y="8"/> <TopLine Value="1"/> <EditorIndex Value="3"/> <UsageCount Value="10"/> <Loaded Value="True"/> </Unit28> <Unit29> <Filename Value="..\common\userdir.pas"/> <UnitName Value="userdir"/> <CursorPos X="1" Y="1"/> <TopLine Value="1"/> <EditorIndex Value="4"/> <UsageCount Value="10"/> <Loaded Value="True"/> </Unit29> </Units> <JumpHistory Count="30" HistoryIndex="29"> <Position1> <Filename Value="lsjpeg.pas"/> <Caret Line="209" Column="34" TopLine="195"/> </Position1> <Position2> <Filename Value="lsjpeg.pas"/> <Caret Line="211" Column="21" TopLine="197"/> </Position2> <Position3> <Filename Value="lsjpeg.pas"/> <Caret Line="217" Column="35" TopLine="203"/> </Position3> <Position4> <Filename Value="lsjpeg.pas"/> <Caret Line="222" Column="21" TopLine="203"/> </Position4> <Position5> <Filename Value="lsjpeg.pas"/> <Caret Line="228" Column="25" TopLine="203"/> </Position5> <Position6> <Filename Value="lsjpeg.pas"/> <Caret Line="231" Column="20" TopLine="217"/> </Position6> <Position7> <Filename Value="lsjpeg.pas"/> <Caret Line="253" Column="32" TopLine="239"/> </Position7> <Position8> <Filename Value="lsjpeg.pas"/> <Caret Line="259" Column="21" TopLine="239"/> </Position8> <Position9> <Filename Value="lsjpeg.pas"/> <Caret Line="266" Column="33" TopLine="239"/> </Position9> <Position10> <Filename Value="lsjpeg.pas"/> <Caret Line="280" Column="20" TopLine="266"/> </Position10> <Position11> <Filename Value="lsjpeg.pas"/> <Caret Line="9" Column="118" TopLine="1"/> </Position11> <Position12> <Filename Value="dicomfast.pas"/> <Caret Line="2" Column="6" TopLine="1"/> </Position12> <Position13> <Filename Value="prefs.pas"/> <Caret Line="1" Column="1" TopLine="1"/> </Position13> <Position14> <Filename Value="prefs.pas"/> <Caret Line="6" Column="5" TopLine="1"/> </Position14> <Position15> <Filename Value="prefs.pas"/> <Caret Line="7" Column="26" TopLine="1"/> </Position15> <Position16> <Filename Value="..\common\userdir.pas"/> <Caret Line="1" Column="1" TopLine="1"/> </Position16> <Position17> <Filename Value="filename.pas"/> <Caret Line="202" Column="54" TopLine="163"/> </Position17> <Position18> <Filename Value="dicom.pas"/> <Caret Line="10" Column="46" TopLine="1"/> </Position18> <Position19> <Filename Value="filename.pas"/> <Caret Line="1" Column="1" TopLine="1"/> </Position19> <Position20> <Filename Value="prefs.pas"/> <Caret Line="3" Column="2" TopLine="1"/> </Position20> <Position21> <Filename Value="..\common\userdir.pas"/> <Caret Line="10" Column="39" TopLine="1"/> </Position21> <Position22> <Filename Value="..\common\userdir.pas"/> <Caret Line="35" Column="58" TopLine="1"/> </Position22> <Position23> <Filename Value="..\common\define_types.pas"/> <Caret Line="11" Column="21" TopLine="1"/> </Position23> <Position24> <Filename Value="..\common\define_types.pas"/> <Caret Line="20" Column="45" TopLine="1"/> </Position24> <Position25> <Filename Value="..\common\define_types.pas"/> <Caret Line="2" Column="25" TopLine="1"/> </Position25> <Position26> <Filename Value="..\common\define_types.pas"/> <Caret Line="10" Column="29" TopLine="1"/> </Position26> <Position27> <Filename Value="..\common\define_types.pas"/> <Caret Line="1" Column="1" TopLine="1"/> </Position27> <Position28> <Filename Value="dcm2nii.lpr"/> <Caret Line="16" Column="31" TopLine="1"/> </Position28> <Position29> <Filename Value="paramstrs.pas"/> <Caret Line="13" Column="1" TopLine="4"/> </Position29> <Position30> <Filename Value="dcm2nii.lpr"/> <Caret Line="66" Column="1" TopLine="40"/> </Position30> </JumpHistory> </ProjectOptions> <CompilerOptions> <Version Value="8"/> <PathDelim Value="\"/> <SearchPaths> <OtherUnitFiles Value="..\common\"/> </SearchPaths> <CodeGeneration> <Optimizations> <OptimizationLevel Value="2"/> </Optimizations> </CodeGeneration> <Linking> <Debugging> <UseLineInfoUnit Value="False"/> <StripSymbols Value="True"/> </Debugging> <LinkSmart Value="True"/> </Linking> <Other> <ConfigFile> <CustomConfigFile Value="True"/> </ConfigFile> <CompilerPath Value="$(CompPath)"/> </Other> </CompilerOptions> </CONFIG> ������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii.ini������������������������������������������������0000664�0001750�0001750�00000001573�11633671500�021233� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[BOOL] 4D=1 Anonymize=1 SingleNIIFile=1 Gzip=1 SPM2=0 AppendDate=0 AppendAcqSeries=1 AppendProtocolName=1 AppendPatientName=0 AppendFilename=0 EveryFile=1 ManualNIfTIConv=1 AnonymizeSourceDICOM=0 Swizzle4D=1 Stack3DImagesWithSameAcqNum=0 RecursiveUseNameAppend=0 CustomRename=0 disablereorient=0 enablereorient=1 createoutputfolder=0 CollapseFolders=0 Verbose=0 AutoCrop=0 fourD=1 PhilipsPrecise=0 UseGE_0021_104F=0 DebugMode=0 UntestedFeatures=0 OrthoFlipXDim=0 [INT] BeginClip=0 LastClip=0 MinReorientMatrix=255 RecursiveFolderDepth=5 MaxReorientMatrix=1023 OutDirMode=0 IgnoreDTIRotationsIf_0002_0013_atleast=15 IgnoreDTIRotationsIf_0018_1020_atleast=15 SiemensDTIUse0019If00181020atleast=15 SiemensDTINoAngulationCorrectionIf00181020atleast=1000 SiemensDTIStackIf00181020atleast=15 [STR] BackupDir= OutDir=C:\Users\neuropsych\Documents �������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii.ico������������������������������������������������0000664�0001750�0001750�00000001376�10412641526�021226� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���ш�����(��� ���@����������������������������������€��€���€€�€���€�€�€€��€€€�РРР���џ��џ���џџ�џ���џ�џ�џџ��џџџ�џџџџџџџџџџџџџџџџџџџЬЯџќЬЯќЬџЬЯџџџџџЬЯџќЬЯќЬџЬЯџџџџџЬЯџЬЬЯќЬџЬЯџџџџџЬЯџЬЬЯќЬџЬЯџџџџџЬЯќЯЬЯќЬџЬЯџџџџџЬЯЬЯЬЯќЬџЬЯџџџџџЬЯЬџЬЯџџџџџџџџџџЬЬЬџЬЯќЬџЬЯџџџџџЬЬЯџЬЯќЬџЬЯџџџџџЬЬџџЬЯќЬџЬЯџџџџџџџџџџџџџџџџџџџџџџџљ™™™Ÿџџџџџџџџџџџљ™™™Ÿџџџџџџџџџџџљ™џџџџџџџџџџџџџџџ™Ÿџџџџџџџџџџџџџџљ™Ÿџџџџџџџџџџџџџџљ™џџџџџџџџџџџџџџџ™џџџџџџџџџџџџџџџ™џџџџџџџџџџџџљ™™™џџџџџџџџџџџџљ™™Ÿџџџџџџџџџџџџџџџџџџџџџџџіfoџfџffџfoіofіoіffџfіffіffіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіoіofіoџіofіofіoіffџfіffіffіfffoіfoџfџffџfoџfџfџџџџџџџџџџџџџџџџџ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii.dpr������������������������������������������������0000664�0001750�0001750�00000000705�11473723712�021242� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������program dcm2nii; {$IFDEF FPC} {$mode objfpc} {$ELSE} {$APPTYPE CONSOLE} {$ENDIF} {$H+} uses {$IFDEF UNIX} {$IFDEF UseCThreads} cthreads, {$ENDIF} {$ENDIF} dialogsx,paramstrs,dicomtypes; {$IFNDEF UNIX} {$R *.res} {$ENDIF} begin ShowMsg(kVers); kUseDateTimeForID := true; {$IFNDEF TEST} ProcessParamStrs; {$ELSE} Testdcm2nii; readln; {$ENDIF} end. �����������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii.dof������������������������������������������������0000664�0001750�0001750�00000002454�11473723714�021232� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[Compiler] A=1 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 V=1 W=0 X=1 Y=1 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 RemoteSymbols=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=4194304 ExeDescription= [Directories] OutputDir= UnitOutputDir= PackageDLLOutputDir= PackageDCPOutputDir= SearchPath=..\common\;..\delphionly\ Packages=Vcl40;Vclx40;VclSmp40;Qrpt40;Vcldb40;RxCtl4 Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams= HostApplication= [Version Info] IncludeVerInfo=1 AutoIncBuild=0 MajorVer=0 MinorVer=9 Release=0 Build=1 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=1033 CodePage=1252 [Version Info Keys] CompanyName=Chris Rorden FileDescription=DICOM and PAR/REC converter FileVersion=0.9.0.1 InternalName= LegalCopyright=Copyright Љ LegalTrademarks= OriginalFilename=dcm2nii.exe ProductName=dcm2nii ProductVersion=0.0 Comments= [HistoryLists\hlUnitAliases] Count=1 Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [HistoryLists\hlSearchPath] Count=2 Item0=..\common\;..\delphionly\ Item1=..\common\ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/dcm2nii.cfg������������������������������������������������0000664�0001750�0001750�00000000701�11473723714�021212� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-$A+ -$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 -LN"c:\program files\borland\delphi4\Lib" -U"..\common\;..\delphionly\" -O"..\common\;..\delphionly\" -I"..\common\;..\delphionly\" -R"..\common\;..\delphionly\" ���������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/convertsimple.pas������������������������������������������0000664�0001750�0001750�00000021047�11326434462�022605� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit convertsimple; {$H+} interface uses {$IFDEF FPC}gzio2, {$ENDIF} define_types,SysUtils,dicomtypes,filename,nii_4dto3d,niftiutil,nii_orient, nii_crop,GraphicsMathLibrary,prefs; //function ConvertSimple2NII ({var} lInFilename, lOutDir: string; var lPrefs: TPrefs): boolean; function FDF( lFName: string; var lDcm: DicomData {; var lByteSwap: boolean}): boolean; implementation uses dialogsx; procedure ReadlnX (var F: TextFile; var lResult: string); //Replicates Readln, but works for Unix files... Delphi 4's readln fails for non-MSDOS EOLs var lCh: char; begin lResult := ''; while not Eof(F) do begin Read(F, lCh); if (lCh in [#10,#13]) then begin if lResult <> '' then begin //Showmessage(lResult); exit; end; end else lResult := lResult + lCh; end; end; //ReadlnX function ParseStr(lPattern: string; var lSample: string): integer; begin result := Pos(lPattern,lSample); if result < 1 then exit; //Msg('*'+lPattern+'*'+inttostr(result)+'*'+lSample+'*'); result := result+length(lPattern);//end of pattern lSample := trim(copy(lSample,result,length(lSample)+1-result)); end; procedure ExtractFloats(lSample: string; var V1,V2,V3: double); var lCh: char; lStr: string; lP,lL,lN: integer; procedure RetireStr; begin if lStr = '' then exit; inc(lN); case lN of 1: V1 := strtofloat(lStr); 2: V2 := strtofloat(lStr); 3: V3 := strtofloat(lStr); else exit; end; lStr := ''; end; begin V1:= 1; V2 := 1; V3 := 1; lL := length(lSample); if lL < 1 then exit; decimalseparator := '.'; lP := 1; lN:= 0; lStr := ''; while lP <= lL do begin lCh := lSample[lP]; if lCh in ['-','.','0'..'9'] then lStr := lStr + lCh else retireStr; inc(lP); end; RetireStr; end; procedure ExtractFloats10x(lSample: string; var V1,V2,V3: double); //cm to mm begin ExtractFloats(lSample, V1,V2,V3); V1 := V1 * 10; V2 := V2 * 10; V3 := V3 * 10; end; procedure ExtractInts(lSample: string; var V1,V2,V3: integer); var F1,F2,F3: double; begin //Msg('*'+lSample+'*'); ExtractFloats(lSample, F1,F2,F3); V1 := round(F1); V2 := round(F2); V3 := round(F3); //Msg(inttostr(V1)+','+inttostr(V2)+','+inttostr(V3)); end; procedure ReportHeader (lFormatName: string; var lDicomData: dicomdata); const kCR = '; '; begin Msg (lFormatName +kCR+ ' Slice Number:'+inttostr(lDicomData.ImageNum) +kCR+ 'XYZ dim: ' +inttostr(lDicomData.XYZdim[1])+'/'+inttostr(lDicomData.XYZdim[2])+'/'+inttostr(lDicomData.XYZdim[3]) +kCR+ 'XYZ position: ' +floattostr(lDicomData.PatientPosX)+'/'+floattostr(lDicomData.PatientPosY)+'/'+floattostr(lDicomData.PatientPosZ) +kCR+'Data offset: ' +inttostr(lDicomData.ImageStart) +kCR+'XYZ mm: '+floattostrf(lDicomData.XYZmm[1],ffFixed,8,2)+'/' +floattostrf(lDicomData.XYZmm[2],ffFixed,8,2)+'/'+floattostrf(lDicomData.XYZmm[3],ffFixed,8,2) +kCR+'TR: '+floattostrf(lDicomData.TR,ffFixed,8,2) ); end; function CMFOV2MM( lCMFOV,lMatrix: double): double; begin if lMatrix > 0 then result := lCMFOV*10 / lMatrix; end; (*Reads Varian FDF images (FDF = Flexible Data Format). Varian MRI FDF reader http://www.mathworks.com/matlabcentral/fileexchange/7449 Multi_FDF_Opener.java - http://rsbweb.nih.gov/ij/plugins/multi-opener.html char *spatial_rank = "2dfov"; if 3dfov then matrix will have three elements if 3dfov then span will have three elements int bigendian float matrix[] = {512, 512}; float bits = 32; float span[] = {4.000000, 4.000000}; byte offset of image data is = file.length - xdim*ydim*zdim*bits/8; Appears only 32-bit float data... *) function Deblank (lInStr: string): string; var lLen,lPos: integer; begin result := ''; lLen := length(lInStr); if lLen < 1 then exit; for lPos := 1 to lLen do if lInStr[lPos] in ['=',',','[',']','+','-','.','\','~','/', '0'..'9','a'..'z','A'..'Z'] then result := result +lINStr[lPos]; end; function FDF( lFName: string; var lDcm: DicomData): boolean; //Note - some Varian scanners put in more white space between text than others... // "float bits=" versus "float bits=" //Therefore we deblank the data text to remove whitespace VAR ltextfile: textfile; lLine: string; lFileSz,num: integer; junk1f,junk2f,junk3f: double; junk1,junk2: integer; lDone,lSliceNum: boolean; begin result := false; lFileSz := FSize(lFName); if lFileSz < 1{not fileexists (lFName)} then begin MSG('Can not find file '+lFName); exit; end; FileMode := 0; { Set file access to read only } AssignFile(ltextfile, lFName); Reset(ltextfile); lDone := false; num := 1; lSliceNum := false; repeat readlnx(ltextfile,lLine); //lLine := trim(lLine);//remove leading/following characters lLine := deblank(lLine);//remove leading/following characters //msg(lLine); if ParseStr('floatbits=', lLine) > 0 then ExtractInts(lLine, lDcm.Allocbits_per_pixel ,junk1,junk2); if ParseStr('intslice_no', lLine) > 0 then begin lSliceNum := true; ExtractInts(lLine, lDcm.ImageNum ,junk1,junk2); end; if ParseStr('floatlocation[]=', lLine) > 0 then ExtractFloats10x(lLine, lDcm.PatientPosX,lDcm.PatientPosY,lDcm.PatientPosZ); if ParseStr('floatmatrix[]=', lLine) > 0 then ExtractInts(lLine, lDcm.XYZdim[1],lDcm.XYZdim[2],lDcm.XYZdim[3]); if ParseStr('floatspan[]=', lLine) > 0 then ExtractFloats(lLine, lDCm.XYZmm[1],lDcm.XYZmm[2],lDcm.XYZmm[3]); if ParseStr('floatTR=', lLine) > 0 then begin ExtractFloats(lLine, junk1f,junk2f,junk3f); lDcm.TR := junk1f/1000; //convert TR in msec to time in sec end; {if strmatch('intbigendian', line) then machineformat = 'ieee-le'; % New Linux-based} num := num + 1; if num > 41 then lDone := true; until lDone; if lDcm.Allocbits_per_pixel = 32 then begin result := true; lDcm.float := true; end else begin Msg('Unsupported datatype: '+inttostr( lDcm.Allocbits_per_pixel)+ 'bits per pixel '+lFName); end; if not lSliceNum then begin ExtractInts(lFName, lDcm.ImageNum ,junk1,junk2); end; //next - convert field of view in cm to voxel size in mm... for num := 1 to 3 do lDCm.XYZmm[num] := CMFOV2MM( lDCm.XYZmm[num],lDcm.XYZdim[num]); lDcm.Little_Endian := 0; lDcm.ImageStart := lFileSz - (lDcm.XYZdim[1]*lDcm.XYZdim[2]*lDcm.XYZdim[3]*(round(lDcm.Allocbits_per_pixel/8))); if lDcm.ImageStart < 10 then result := false; if result then ReportHeader('Varian FDF',lDcm); CloseFile(ltextfile); FileMode := 2; end; (*function Raw2NIfTI(lHdrName: string; var lHdr: TNIFTIhdr; lPrefs: TPrefs; lByteSwap: boolean): boolean; //like ChangeNIfTISubformat except we use the passed lHdrdata... var lImgBuffer: byteP; lImgOffset: integer; lOutImgName: string; //lByteSwap: boolean; begin result := false; if not NIFTIhdr_LoadImgRaw (false,lHdrName, lHdr, lImgBuffer, lImgOffset,lByteSwap) then exit; Msg('Converting to NIfTI '+lHdrName); lOutImgName := ChangeFilePrefix (lHdrName,'c'); if lPrefs.CustomRename then CustomFilename(lOutImgName); if SaveNIfTICore (lOutImgName, lImgBuffer, lImgOffset+1, lHdr, lPrefs,lByteSwap) ='' then exit; Freemem(lImgBuffer); result := true; //11/2007 ExitCode := 0; end; function ConvertSimple2NII ({var} lInFilename , lOutDir: string; var lPrefs: TPrefs): boolean; //this is simple, but does not stack 2d slices into 3d volumes... var lDcm: DicomData; lHdr: TNIFTIhdr; lBigEndian: boolean; begin result := false; NIFTIhdr_ClearHdr(lHdr); Msg('WARNING: no image orientation matrix for '+lInFilename); if not FDF (lInFilename,lDcm) then exit; DICOM2AnzHdr (lHdr, false,lInFilename,lDcm); //Raw2NIfTI(lInFilename,lHdr,lPrefs,true); end; *) end. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/dcm2nii/convert.pas������������������������������������������������0000664�0001750�0001750�00000175410�11645601040�021367� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit convert; {$H+} interface uses {$IFNDEF UNIX} Windows, {$ENDIF} {$IFDEF FPC} gzio2, {$ELSE} {$ENDIF} filename,define_types,classes,SysUtils,dicom,dicomtypes, niftiutil,GraphicsMathLibrary, userdir, nii_4dto3d,nii_orient,nii_crop,prefs,lsjpeg; function Dicom2NII(var lDICOMra: TDICOMrap; lFirstDICOM, lLastDICOM: integer; var lOutDirOrig: string; var lPrefs: TPrefs; lVols: integer): boolean; implementation uses sortdicom,dialogsx; function getDeterminant(r: TMatrix): double; var r11,r12,r13,r21,r22,r23,r31,r32,r33: double; begin r11 := r.matrix[1,1];//[0][0]; r12 := r.matrix[1,2];//r[0][1]; r13 := r.matrix[1,3];//r[0][2]; r21 := r.matrix[2,1];//[0][0]; r22 := r.matrix[2,2];//r[0][1]; r23 := r.matrix[2,3];//r[0][2]; r31 := r.matrix[3,1];//[0][0]; r32 := r.matrix[3,2];//r[0][1]; r33 := r.matrix[3,3];//r[0][2]; result := r11*r22*r33 - r11*r32*r23 - r21*r12*r33 + r21*r32*r13 + r31*r12*r23 - r31*r22*r13; end; function RealToStr(lR: double ; lDec: integer): string; begin RealTOStr := FloatToStrF(lR, ffFixed,7,lDec); end; function UniqueFileName (var lInStr: string): boolean; var lInc: integer; lPathWName,lExt: string; begin result := true; if not Fileexists(lInStr) then exit; ExtractFileParts(lInStr,lPathWName,lExt); lInc := ord('A'); while (lInc <= ord('Z')) and ( Fileexists(lPathWName+chr(lInc)+lExt)) do inc(lInc); if lInc > ord('Z') then result := false else lInStr := lPathWName+chr(lInc)+lExt; end; FUNCTION Diag2D (CONST m1,m2,m3: DOUBLE): TMatrix; BEGIN WITH RESULT DO BEGIN matrix[1,1] := m1; matrix[1,2] := 0; matrix[1,3] := 0; matrix[2,1] := 0; matrix[2,2] := m2; matrix[2,3] := 0; matrix[3,1] := 0; matrix[3,2] := 0; matrix[3,3] := m3; size := size2D END END {Diag2D}; FUNCTION Diag3D (CONST m1,m2,m3,m4: DOUBLE): TMatrix; BEGIN WITH RESULT DO BEGIN matrix[1,1] := m1; matrix[1,2] := 0; matrix[1,3] := 0; matrix[1,4] := 0; matrix[2,1] := 0; matrix[2,2] := m2; matrix[2,3] := 0; matrix[2,4] := 0; matrix[3,1] := 0; matrix[3,2] := 0; matrix[3,3] := m3; matrix[3,4] := 0; matrix[4,1] := 0; matrix[4,2] := 0; matrix[4,3] := 0; matrix[4,4] := m4; size := size3D END END {Diag3D}; procedure AdjMosaic (var Q: TMatrix; var lDicomData: DicomData); //Changes suggested by Antonin Skoch" <ansk@medicon.cz<mailto:ansk@medicon.cz>> // September 23, 2011 10:38:05 AM var lFactorX: double; lFactorY: double; begin lFactorX := (lDicomData.XYZdim[1] -(lDicomData.XYZdim[1]/lDicomData.SiemensMosaicX) )/2; lFactorY := (lDicomData.XYZdim[2] -(lDicomData.XYZdim[2]/lDicomData.SiemensMosaicY) )/2; Q.matrix[1,4] :=(Q.matrix[1,1]*lFactorX)+(Q.matrix[1,2]*lFactorY)+Q.matrix[1,4]; Q.matrix[2,4] :=(Q.matrix[2,1]*lFactorX)+(Q.matrix[2,2]*lFactorY)+Q.matrix[2,4]; Q.matrix[3,4] :=(Q.matrix[3,1]*lFactorX)+(Q.matrix[3,2]*lFactorY)+Q.matrix[3,4]; end; (*procedure AdjMosaic (var Q: TMatrix; var lDicomData: DicomData); var lFactor: double; begin lFactor := (lDicomData.XYZdim[1] - (lDicomData.XYZdim[1]/lDicomData.SiemensMosaicX) )/2; Q.matrix[1,4] := (Q.matrix[1,1]*lFactor)+(Q.matrix[1,2]*lFactor){+(Q.matrix[1,3])}+Q.matrix[1,4]; Q.matrix[2,4] := (Q.matrix[2,1]*lFactor)+(Q.matrix[2,2]*lFactor){+(Q.matrix[1,3])}+Q.matrix[2,4]; Q.matrix[3,4] := (Q.matrix[3,1]*lFactor)+(Q.matrix[3,2]*lFactor){+(Q.matrix[1,3])}+Q.matrix[3,4]; end; *) (*procedure get_numaris4_val(lFilename,lTagName1,lTagName2: string; var lnmosaic: integer; var lv1,lv2,lv3:single); // spm_dicom_convert label 121; const kMaxHdrSz = 24000; var lHdr : array [1..kMaxHdrSz] of Char; lTagName,lStr: string; lLoop,lFileSz,lFilePos,lTagLen,lSubLoop,lnSubloop: integer; lFile: file; function IsTag: boolean; var lTagPos: integer; begin result := false; for lTagPos := 1 to lTagLen do if lHdr[lFilePos+lTagPos-1] <> lTagName[lTagPos] then exit; result := true; end; function IsNumber: boolean; begin if lHdr[lFilePos] in ['-','.','0'..'9'] then result := true else result := false; end; begin lnmosaic := 0;//detect if function found header if not fileexists(lFilename) then exit; FileMode := 0; //set to readonly AssignFile(lFile, lFileName); Reset(lFile, 1); lFileSz := FileSize(lFile); if lFileSz > kMaxHdrSz then lFileSz := kMaxHdrSz; if lFilesz < (2000) then begin //to small to be DICOM mosaic CloseFile(lFile); Filemode := 2; exit; end; BlockRead(lFile, lHdr, lFileSz*SizeOf(Char)); FileMode := 0; //set to readonly CloseFile(lFile); lFilePos := 1; for lLoop := 1 to 2 do begin if lLoop = 1 then begin lnSubloop := 1; lTagName := lTagName1; end else begin lnSubloop := 3; lTagName := lTagName2; end; lTagLen := length (lTagName); while (lFilePos < (lFileSz-lTagLen)) and (not (IsTag)) do inc(lFilePos); if (lFilePos >= (lFileSz-lTagLen)) then exit; lFilePos := lFilePos + 72; //lots of space between name and value for lSubloop := 1 to lnSubloop do begin while (lFilePos < (lFileSz)) and (not (IsNumber)) do inc(lFilePos); if (lFilePos >= (lFileSz-lTagLen)) then exit; lStr :='';// lHdr[lFilePos]; while (lFilePos < (lFileSz)) and (IsNumber) do begin lStr := lStr+lHdr[lFilePos]; inc(lFilePos); end; if lStr = '' then exit; if lLoop = 1 then lnmosaic := strtoint(lStr) else begin case lSubloop of 1: lv1 := strtofloat(lStr); 2: lv2 := strtofloat(lStr); 3: lv3 := strtofloat(lStr); end; //case end; //else end; //sublooop end; //loop end; *) function IsNormalMosaic(var lDicomData: DicomData; var lMosaicSlices: integer; var lFilename: string): boolean; var Q: TMatrix; lX,lY,lnmos,lImagesPerRow: integer; lv1,lv2,lv3: double; begin lX := lDICOMdata.SiemensMosaicX; lY := lDICOMdata.SiemensMosaicY; result := false; lMosaicSlices := lDICOMdata.SiemensSlices; if lMosaicSlices = 0 then lMosaicSlices := lDICOMdata.SiemensMosaicX*lDICOMdata.SiemensMosaicY; if (lDICOMdata.SiemensMosaicX < 1) then exit; //not mosaic if (lDICOMdata.SiemensSlices > 0) then exit; //pre-Trio Siemens Mosaic Data if not GetCSAImageHeaderInfo (lFilename, lDicomData.CSAImageHeaderInfoPos ,lDicomData.CSAImageHeaderInfoSz, lnmos,lDicomData.SiemensMosaicX,lDicomData.SiemensMosaicY, lv1,lv2,lv3) then begin lDICOMdata.SiemensMosaicX := lX; lDICOMdata.SiemensMosaicY := lY; lMosaicSlices := lX * lY; exit; end; if lnmos < 1 then exit; //4/4/2008 I used to read AcquisitionMatrixText from CSA Image Header... however this is a problem if the images are interpolated lImagesPerRow := 1; while sqr(lImagesPerRow) < lnMos do inc(lImagesPerRow); lDICOMdata.SiemensMosaicX := lDicomData.XYZdim[1] div lImagesPerRow; lDICOMdata.SiemensMosaicY := lDicomData.XYZdim[2] div lImagesPerRow; //29Sept2008 //fx(lDicomData.XYZdim[1],lDicomData.XYZdim[2],lnmos,lDICOMdata.SiemensMosaicY); lDicomData.SiemensMosaicX := lDicomData.XYZdim[1] div lDICOMdata.SiemensMosaicX; lDicomData.SiemensMosaicY := lDicomData.XYZdim[2] div lDICOMdata.SiemensMosaicY; //get_numaris4_val(lFilename,'NumberOfImagesInMosaic','SliceNormalVector',lnmos,lv1,lv2,lv3); //b13 Q := Matrix2D(lDicomData.Orient[1], lDicomData.Orient[4],lv1, lDicomData.Orient[2],lDicomData.Orient[5],lv2, lDicomData.Orient[3],lDicomData.Orient[6],lv3); if nifti_mat33_determ(Q) < 0 then begin result := true; //lDicomData.SiemensFlipMosaic := true; //reportmatrix('mosaic FLIPPED:'+lFilename,Q); end; lMosaicSlices := lnmos; end; function IsSiemensDTI(var lDicomData: DicomData; var lDTI: TDTI;var lFilename: string; var lPrefs: TPrefs): boolean; begin result := false; if (lDICOMdata.SiemensDICOMDTI) and (lDICOMdata.DTI[1].bval >= 0) and (lDicomData.Vers0018_1020 {ImplementationVersion} >= lPrefs.SiemensDTIUse0019If00181020atleast {IgnoreDTIRotationsIf_0002_0013_atleast}) then begin lDTI.Bval := lDICOMdata.DTI[1].bval; ldti.v1 := lDicomData.DTI[1].v1; ldti.v2 := lDicomData.DTI[1].v2; ldti.v3 := lDicomData.DTI[1].v3; result := true; exit; end; if (lDICOMdata.ManufacturerID <> kSiemensID) then exit; if not GetCSAImageHeaderInfoDTI (lFilename, lDicomData.CSAImageHeaderInfoPos ,lDicomData.CSAImageHeaderInfoSz,lDTI.Bval,ldti.v1,ldti.v2,ldti.v3) then //if not GetCSAImageHeaderInfoDTI (lFilename, lDicomData.CSAImageHeaderInfoPos ,lDicomData.CSAImageHeaderInfoSz, lDTI.Bval, ldti.v1,ldti.v2,ldti.v3) then exit; if lDTI.bval >= 0 then begin result := true; lDicomData.SiemensDICOMDTICSA := true; end; //fx(lDTI.bval); end; procedure dicom_2_nifti(var lDicomData: DicomData; var lHdr: TNiftiHdr ; lMosaicSlices: integer; var lFlipMosaic: boolean); var Q,res,diagVox,patient_to_tal,analyze_to_dicom: TMatrix; lx,ly: integer; val: double; dx,dy,dz: single; lOK: boolean; begin lHdr.sform_code := kNIFTI_XFORM_UNKNOWN; lOK := false; for lx := 1 to 6 do if lDicomData.Orient[lx] <> 0 then lOK := true; if not lOK then exit; Q := Diag3D(1,1,1,1);//set column 4 and row 4 to zeros, except [4,4] Q.matrix[1,1] :=lDicomData.Orient[1] ; Q.matrix[1,2] := lDicomData.Orient[2] ; Q.matrix[1,3] := lDicomData.Orient[3] ; //* load Q */ Q.matrix[2,1] := lDicomData.Orient[4] ; Q.matrix[2,2] := lDicomData.Orient[5] ; Q.matrix[2,3] := lDicomData.Orient[6] ; // normalize row 1 val := Q.matrix[1,1]*Q.matrix[1,1] + Q.matrix[1,2]*Q.matrix[1,2] + Q.matrix[1,3]*Q.matrix[1,3] ; if( val > 0.0 ) then begin val := 1.0 / sqrt(val) ; Q.matrix[1,1] := Q.matrix[1,1]* val ; Q.matrix[1,2] := Q.matrix[1,2]* val ; Q.matrix[1,3] := Q.matrix[1,3]* val ; end else begin Q.matrix[1,1] := 1.0 ; Q.matrix[1,2] := 0.0 ; Q.matrix[1,3] := 0.0 ; end; // normalize row 2 val := Q.matrix[2,1]*Q.matrix[2,1] + Q.matrix[2,2]*Q.matrix[2,2] + Q.matrix[2,3]*Q.matrix[2,3] ; if( val > 0.0 ) then begin val := 1.0 / sqrt(val) ; Q.matrix[2,1] := Q.matrix[2,1]* val ; Q.matrix[2,2] := Q.matrix[2,2]* val ; Q.matrix[2,3] := Q.matrix[2,3]* val ; end else begin Q.matrix[2,1] := 0.0 ; Q.matrix[2,2] := 1.0 ; Q.matrix[2,3] := 0.0 ; end; //row 3 is cross product of previous rows Q.matrix[3,1] := Q.matrix[1,2]*Q.matrix[2,3] - Q.matrix[1,3]*Q.matrix[2,2] ; Q.matrix[3,2] := Q.matrix[1,3]*Q.matrix[2,1] - Q.matrix[1,1]*Q.matrix[2,3] ; Q.matrix[3,3] := Q.matrix[1,1]*Q.matrix[2,2] - Q.matrix[1,2]*Q.matrix[2,1] ; res := Diag3D(1,1,1,1); //set forth column/row //next: transpose matrix for lx := 1 to 3 do for ly := 1 to 3 do res.matrix[lx,ly] := Q.matrix[ly,lx]; Q := res; //next if det(orient)<0, orient(:,3) = -orient(:,3); end; //showmessage(realtostr(getDeterminant(Q),2)); if getDeterminant(Q) < 0 then begin Q.matrix[1,3] := -Q.matrix[1,3]; Q.matrix[2,3] := -Q.matrix[2,3]; Q.matrix[3,3] := -Q.matrix[3,3]; end; //next scale matrix diagVox := Diag2D(lDicomData.XYZmm[1],lDicomData.XYZmm[2],lDicomData.XYZmm[3]); Q.size := size2D; Q := MultiplyMatrices(Q,diagVox); //next - add translations Q.matrix[1,4] := lDicomData.PatientPosX; Q.matrix[2,4] := lDicomData.PatientPosY; Q.matrix[3,4] := lDicomData.PatientPosZ; val := lDicomData.XYZdim[2]; if (lDICOMdata.SiemensMosaicX > 1) or (lDICOMdata.SiemensMosaicY > 1) then begin AdjMosaic(Q,lDICOMdata); val := lDicomData.XYZdim[2]/lDICOMdata.SiemensMosaicY; //lFlipMosaic := IsNormalMosaic(lDicomData,lMosaicSlices,lFilename); end; Q.matrix[4,1] := 0; Q.matrix[4,2] := 0; Q.matrix[4,3] := 0; Q.matrix[4,4] := 1; Q.size := size3D; //Q now equals 'dicom_to_patient' in spm_dicom_convert //result := q; exit; //escape to compare with SPM //next - convert space patient_to_tal := diag3D(-1, -1, 1,1); analyze_to_dicom := Matrix3D ( 1, 0, 0,-1, 0,-1, 0, val, 0, 0, 1,-1, 0, 0, 0, 1); //reportMatrix('d2pat',Q); //reportmatrix('p2tal',patient_to_tal); //reportMatrix('a2d',analyze_to_dicom); Q := MultiplyMatrices(patient_to_tal,Q); Q := MultiplyMatrices(Q,analyze_to_dicom); //reportMatrix('mat',Q); //Q now equals 'mat' in spm_dicom_convert //subasgn.m in SPM5 translates by one voxel... analyze_to_dicom := Matrix3D ( 1, 0, 0,1, 0,1, 0, 1, 0, 0,1,1, 0, 0, 0, 1); Q := MultiplyMatrices(Q,analyze_to_dicom);//not used for flips if ((lDICOMdata.SiemensMosaicX > 1) or (lDICOMdata.SiemensMosaicY > 1)) and (lFlipMosaic) then begin //reportmatrix('QmosaicIn',Q); patient_to_tal := diag3D(1, 1, 1,1); patient_to_tal.matrix[3,4] := 1-lMosaicSlices; Q := MultiplyMatrices(Q,patient_to_tal); //reportmatrix('r',patient_to_tal); //reportmatrix('QmosaicOut',Q); end; //if (lDICOMdata.SiemensMosaicX = 1) and (lDICOMdata.SiemensMosaicY = 1) then //reportmatrix('final',Q); //mat44_to_quatern(Q); *) //reportMatrix('nii',Q); lHdr.sform_code := kNIFTI_XFORM_SCANNER_ANAT; lHdr.srow_x[0] := Q.matrix[1,1]; lHdr.srow_x[1] := Q.matrix[1,2]; lHdr.srow_x[2] := Q.matrix[1,3]; lHdr.srow_x[3] := Q.matrix[1,4]; lHdr.srow_y[0] := Q.matrix[2,1]; lHdr.srow_y[1] := Q.matrix[2,2]; lHdr.srow_y[2] := Q.matrix[2,3]; lHdr.srow_y[3] := Q.matrix[2,4]; lHdr.srow_z[0] := Q.matrix[3,1]; lHdr.srow_z[1] := Q.matrix[3,2]; lHdr.srow_z[2] := Q.matrix[3,3]; lHdr.srow_z[3] := Q.matrix[3,4]; //finally, create Quat from matrix lHdr.qform_code := kNIFTI_XFORM_SCANNER_ANAT; nifti_mat44_to_quatern( Q, lHdr.quatern_b,lHdr.quatern_c,lHdr.quatern_d, lHdr.qoffset_x,lHdr.qoffset_y,lHdr.qoffset_z, dx, dy, dz, lHdr.pixdim[0]{QFac}); //msgq(lHdr.quatern_b,lHdr.quatern_c,lHdr.quatern_d,lHdr.qoffset_x,lHdr.qoffset_y,lHdr.qoffset_z); end; (*function CountOrders(var lDICOMdata: dicomdata): integer; //for 4D files, if you have 'M'agnitude and 'Phase' maps in order M M P P M P this will return 1 1 2 2 1 2 const kTypes = 10; var ltype,i: integer; noveltype: array [1..kTypes] of boolean; begin result := 0; for i := 1 to kTypes do noveltype[i] := true; for i := 1 to lDICOMdata.nOrder do begin ltype := lDICOMdata.order[i]; if (ltype < 1) or (lType > kTypes) then lType := 1; if (noveltype[ltype])then inc(result); //we found a new order... noveltype[ltype] := false; end; end;*) (*function SortOrders(var lDICOMdata: dicomdata; var lImageOrder: bytep): integer; //for 4D files, if you have 'M'agnitude and 'Phase' maps in order M M P P M P this will return 1 1 2 2 1 2 const kTypes = 10; var ltype,i: integer; noveltype: array [1..kTypes] of boolean; begin result := 0; for i := 1 to kTypes do noveltype[i] := true; getmem(lImageOrder,lDICOMdata.nOrder); for i := 1 to lDICOMdata.nOrder do begin ltype := lDICOMdata.order[i]; if (ltype < 1) or (lType > kTypes) then lType := 1; lImageOrder^[i] := lType; if (noveltype[ltype])then inc(result); //we found a new order... noveltype[ltype] := false; end; end; function CountOrders(var lDICOMdata: dicomdata): integer; var lImageOrder: bytep; begin if (lDICOMdata.nOrder < 1) then exit; result := SortOrders(lDICOMdata,lImageOrder); freemem(lImageOrder); end; function ParseOrder(var lDICOMdataAllTypes,lDICOMdataSelectedType: dicomdata; lSelectedType: integer): integer; var lnTypes: integer; lImageOrder: bytep; begin lDICOMdataSelectedType := lDICOMdataAllTypes; if (lDICOMdataAllTypes.nOrder < 1) then exit; lnTypes := SortOrders(lDICOMdataAllTypes,lImageOrder); if lnTypes <= lSelectedType then begin TDTIRA = array [1..kMaxDTIDir] of TDTI;//TDICOM;//unsigned 8-bit int TOrder= array [1..kMaxOrderVal] of byte; end; freemem(lImageOrder); end; *) ///321 function MultiOrder(var lDICOMdata: dicomdata): integer; //how many slices are of the same type [magnitude, phase, etc] //returns 0 if all types are the same var i: integer; begin result := 0; if (lDICOMdata.nOrder < 1) then exit; if (lDicomData.XYZdim[3] > kMaxOrderVal) then exit; result := 0; for i := 1 to lDICOMdata.nOrder do begin if lDICOMdata.order[i] = lDICOMdata.order[1] then inc(result); //count how many have the same order as first... end; if result = lDICOMdata.nOrder then result := 0; //all are like the first end; function CompressMultiOrder(var lDICOMdata: dicomdata): integer; //convert multiorder so values are 1..n, //e.g. if the values were 2,3,4 it would be converted to 1..3 //e.g. if the values are 3,4 it will be converted to 1..2 var min,max,i,j: integer; SlotUsed: boolean; begin result := 1; if (lDICOMdata.nOrder < 1) then exit; if (lDicomData.XYZdim[3] > kMaxOrderVal) then exit; min := lDICOMdata.order[1]; for i := 1 to lDICOMdata.nOrder do if lDICOMdata.order[i] < min then min := lDICOMdata.order[i]; //count how many have the same order as first... max := lDICOMdata.order[1]; for i := 1 to lDICOMdata.nOrder do if lDICOMdata.order[i] > max then max := lDICOMdata.order[i]; //count how many have the same order as first... result := 1; for j := min to max do begin SlotUsed := false; for i := 1 to lDICOMdata.nOrder do begin if lDICOMdata.order[i] = j then begin SlotUsed := true; lDICOMdata.order[i] := result; end; end;//for each value if SLotUsed then inc(result); end; result := result - 1; end; (*procedure msx (a,b,c,d: integer); begin msg(inttostr(a)+'x'+inttostr(b)+'x'+inttostr(c)+'x'+inttostr(d)); end;*) procedure SwapTimeMultiOrder (var lDICOMdata: dicomdata; var lBuffer: bytep); //data is stored X,Y,T,Z+some order effect (e.g. magnitude and phase stroed in the same 4D image) - swap to O,X,Y,Z,T var Order,nOrders,lSlicesPerOrder,lSlice,l4DBytes,lSliceBytes,lZo,lTo,lZmax,lTmax,lOrderVol:integer; lTempBuffer: ByteP; begin lSlicesPerOrder := MultiOrder(lDICOMdata); if (lSlicesPerOrder = 0) then exit; nOrders := CompressMultiOrder(lDICOMdata); Msg('Swizzling with multiple ComplexImageComponents: '+inttostr(lSlicesPerOrder)+' slices per order, total '+inttostr(lDicomData.XYZdim[3])+' slices'); if not lDICOMdata.file4D then exit; lTMax := lDicomData.XYZdim[3] div lDICOMdata.SlicesPer3DVol div nOrders; lZMax := lDICOMdata.SlicesPer3DVol; l4DBytes := lDicomData.XYZdim[1]*lDicomData.XYZdim[2]*lDicomData.XYZdim[3]*trunc(((lDicomData.Allocbits_per_pixel)+7)/8); lSliceBytes := lDicomData.XYZdim[1]*lDicomData.XYZdim[2]*trunc(((lDicomData.Allocbits_per_pixel)+7)/8); GetMem(lTempBuffer,l4DBytes); Move(lBuffer^,lTempBuffer^,l4DBytes); //move(src,dest,sz) fillchar(lBuffer^,l4DBytes,0);//abba lZo := 0; lTo := 0; lOrderVol := 0; //for lSlice := 1 to lDicomData.XYZdim[3] do //msg(inttostr(lDICOMdata.order[lSLice])); for Order := 1 to nOrders do begin for lSlice := 1 to lDicomData.XYZdim[3] do begin if lDICOMdata.order[lSLice] = Order then begin Move(lTempBuffer[((lSlice-1)*lSliceBytes)+1],lBuffer[(lZo*lSliceBytes)+((lOrderVol+lTo)*lZMax*lSliceBytes)+1],lSliceBytes); inc(lTo); if lTo >= lTMax then begin lTo := 0; inc(lZo); end; end; //desired order end; lOrderVol := lOrderVol + lTMax; lZo := 0; end; freemem(lTempBuffer); end; procedure SwapTime (var lDICOMdata: dicomdata; var lBuffer: bytep); //data is stored X,Y,T,Z - swap to X,Y,Z,T var lSlice,l4DBytes,lSliceBytes,lZo,lTo,lZmax,lTmax:integer; lTempBuffer: ByteP; begin if MultiOrder(lDICOMdata) <> 0 then begin SwapTimeMultiOrder (lDICOMdata,lBuffer); exit; end; Msg('Swizzling: XYTZ -> XYZT'); if not lDICOMdata.file4D then exit; lTMax := lDicomData.XYZdim[3] div lDICOMdata.SlicesPer3DVol; lZMax := lDICOMdata.SlicesPer3DVol; l4DBytes := lDicomData.XYZdim[1]*lDicomData.XYZdim[2]*lDicomData.XYZdim[3]*trunc(((lDicomData.Allocbits_per_pixel)+7)/8); lSliceBytes := lDicomData.XYZdim[1]*lDicomData.XYZdim[2]*trunc(((lDicomData.Allocbits_per_pixel)+7)/8); GetMem(lTempBuffer,l4DBytes); Move(lBuffer^,lTempBuffer^,l4DBytes); //move(src,dest,sz) lZo := 0; lTo := 0; for lSlice := 1 to lDicomData.XYZdim[3] do begin Move(lTempBuffer[((lSlice-1)*lSliceBytes)+1],lBuffer[(lZo*lSliceBytes)+(lTo*lZMax*lSliceBytes)+1],lSliceBytes); inc(lTo); if lTo >= lTMax then begin lTo := 0; inc(lZo); end; end; freemem(lTempBuffer); end; procedure FlipTB (var lDICOMdata: dicomdata; var lBuffer: bytep); var l16Buf : SmallIntP; l32Buf : SingleP; lSwap16: SmallInt; lSwap32: Single; lSwap8: byte; lXPos,lYPos,lZPos,lX,lY,lZ,lHlfY,lDecLineOffset,lLineOffset: integer; begin lX := lDicomData.XYZdim[1]; lY := lDicomData.XYZdim[2]; lZ := lDicomData.XYZdim[3]; if lDicomData.SamplesPerPixel = 3 then lZ := lZ * 3; if (lY < 2) then exit; lHlfY := lY div 2; if lDicomData.Allocbits_per_pixel = 8 then begin for lZPos := 1 to lZ do begin lLineOffset := (lZPos-1)*(lX*lY); lDecLineOffset := lLineOffset+(lX*lY)-lX; for lYPos := 1 to lHlfY do begin for lXPos := 1 to lX do begin lSwap8 := lBuffer^[lXPos+lLineOffset]; lBuffer^[lXPos+lLineOffset] := lBuffer^[lXPos+lDecLineOffset]; lBuffer^[lXPos+lDecLineOffset] := lSwap8; end; //for X lLineOffset := lLineOffset + lX; lDecLineOffset := lDecLineOffset - lX; end; //for Y end; //for Z end else if lDicomData.Allocbits_per_pixel = 32 then begin l32Buf := SingleP(lBuffer); for lZPos := 1 to lZ do begin lLineOffset := (lZPos-1)*(lX*lY); lDecLineOffset := lLineOffset+(lX*lY)-lX; for lYPos := 1 to lHlfY do begin for lXPos := 1 to lX do begin lSwap32 := l32Buf^[lXPos+lLineOffset]; l32Buf^[lXPos+lLineOffset] := l32Buf^[lXPos+lDecLineOffset]; l32Buf^[lXPos+lDecLineOffset] := lSwap32; end; //for X lLineOffset := lLineOffset + lX; lDecLineOffset := lDecLineOffset - lX; end; //for Y end; //for Z end else begin l16Buf := SmallIntP(lBuffer); for lZPos := 1 to lZ do begin lLineOffset := (lZPos-1)*(lX*lY); lDecLineOffset := lLineOffset+(lX*lY)-lX; for lYPos := 1 to lHlfY do begin for lXPos := 1 to lX do begin lSwap16 := l16Buf^[lXPos+lLineOffset]; l16Buf^[lXPos+lLineOffset] := l16Buf^[lXPos+lDecLineOffset]; l16Buf^[lXPos+lDecLineOffset] := lSwap16; end; //for X lLineOffset := lLineOffset + lX; lDecLineOffset := lDecLineOffset - lX; end; //for Y end; //for Z end; end; //proc FlipTB procedure MakePlanar (var lBuffer: bytep; var lDicomData: DICOMdata); //data is saved as RGBRGBRGB - convert to RRRR GGGG BBBB var lRA: bytep; lPix,lnPix,lSlice,lI: integer; begin if (lDicomData.XYZdim[1] < 1) or (lDicomData.XYZdim[2] < 1) or (lDicomData.XYZdim[3] < 1) then exit; lnPix := lDicomData.XYZdim[1]*lDicomData.XYZdim[2]; //*lDicomData.XYZdim[3] GetMem(lRA,3*lnPix); //*3 as red, green, blue for lSlice := 1 to lDicomData.XYZdim[3] do begin lI := 1 + ((lSlice-1)* (3*lnPix)); //data from input slice for lPix := 1 to lnPix do begin lRA^[lPix] := lBuffer^[lI]; //red plane inc(lI); lRA^[lPix+lnPix] := lBuffer^[lI]; //green plane inc(lI); lRA^[lPix+lnPix+lnPix] := lBuffer^[lI]; //blue plane inc(lI); end; Move(lRA^,lBuffer^[1 + ((lSlice-1)* (3*lnPix))],3*lnPix); end; Freemem(lRA); end; procedure DeMosaic (var lBuffer: bytep;lmosX,lmosY,lSlices: integer; lFlip: boolean; var lDicomData: DICOMdata); //unMosaic var //lImgBytes, lPos,lH,lW,lnMos,lMos,lMosW,lMosH, lStripBytes,lPanelBytes,lStartOffset: integer; lTempBuffer: ByteP; begin lnMos := lSlices;// lDICOMdata.SiemensMosaicX*lDICOMdata.SiemensMosaicY; if (lmosX < 2) and (lmosY < 2) then exit; if ((lmosX*lmosY) < lSlices) then begin msg('This '+inttostr(lmosx)+'*'+inttostr(lmosy)+' mosaic can not hold '+inttostr(lSlices)+' slices.'); exit; end; lMosW := lDICOMdata.XYZdim[1] div lmosX; lMosH := lDICOMdata.XYZdim[2] div lmosY; lStripBytes := lMosW*trunc(((lDicomData.Allocbits_per_pixel)+7)/8); lPanelBytes := lDICOMdata.XYZdim[1] *trunc(((lDicomData.Allocbits_per_pixel)+7)/8); GetMem(lTempBuffer,lPanelBytes*lDICOMdata.XYZdim[2]); Move(lBuffer^,lTempBuffer^,lPanelBytes*lDICOMdata.XYZdim[2]); //lImgBytes := (lPanelBytes*lDICOMdata.XYZdim[2]); lPos := 0; if lFlip then begin //Msg('...Flip mosaic'); for lMos := lnMos downto 1 do begin lStartOffset := ((lMos-1) mod lmosX)*lStripBytes+ ( ((lMos-1) div lmosX)* (lPanelBytes*lMosH)); for lH := 1 to lMosH do begin for lW := 1 to lStripBytes do begin inc(lPos); lBuffer^[lPos] := lTempBuffer^[lStartOffset+lW ]; end; //lBuffer^[lPos-1] := 255;//crx lStartOffset := lStartOffset + lPanelBytes; end; end; end else begin for lMos := 1 to lnMos do begin lStartOffset := ((lMos-1) mod lmosX)*lStripBytes+ ( ((lMos-1) div lMosX)* (lPanelBytes*lMosH)); for lH := 1 to lMosH do begin for lW := 1 to lStripBytes do begin inc(lPos); lBuffer^[lPos] := lTempBuffer^[lStartOffset+lW ]; end; //lBuffer^[lPos-1] := 255;//crx lStartOffset := lStartOffset + lPanelBytes; end; end; end; FreeMem(lTempBuffer); //FlipTB needs new coordinates lDicomData.XYZdim[1] := lMosW; lDicomData.XYZdim[2] := lMosH; lDicomData.XYZdim[3] := lnMos; FlipTB (lDICOMdata, lBuffer); end; function UnInterleaved (lVal, ln3D,ln4D: integer;lFLip: boolean): integer; var lVol,lSlice,lOut: integer; begin lSlice := ((lVal-1) mod ln3D) ; lVol := ((lVal-1) div ln3D) ; if lFlip then lSlice := ln3D-lSlice-1; lOut := (lSlice*ln4D)+lVol; //if lVol = 1 then Msg(inttostr(lSlice)+' '+inttostr(lVol)+' '+inttostr(lOut)); result := lOut; end; function UnFlip (lVal, ln3D: integer): integer; var lVol: integer; begin lVol := ((lVal-1) div ln3D); result := lVal-((lVol)*ln3d);//{ln3D -} (lVal-((lVol-1)*ln3d)); result := ((lVol+1)*ln3D) - result; end; function CheckSliceDirection( var lD1,lD2: dicomdata):boolean; var lFloat: single; begin result := false; lFloat := (ld2.PatientPosX-ld1.PatientPosX)-(ld2.PatientPosY-ld1.PatientPosY)-(ld2.PatientPosZ-ld1.PatientPosZ); if lFloat > 0 then result := true; //if result then Msg('yikes'+floattostr(ld2.PatientPosX-ld1.PatientPosX)+'y'+floattostr(ld2.PatientPosY-ld1.PatientPosY)+'z'+floattostr(ld2.PatientPosZ-ld1.PatientPosZ) ); end; function Index (lSeries,lFirstDICOM: integer; lInterleaved,lFlip: boolean; var lAHdr: TNIFTIhdr ): integer; begin if lInterleaved then result := UnInterleaved (lSeries, lAHdr.dim[3],lAHdr.dim[4],lFlip) else if not lFlip then result := lSeries-1 else result := UnFlip (lSeries, lAHdr.dim[3]); result := result + lFirstDICOM; end; //Next routines for PhilipsBVec FUNCTION Vector2D (CONST xValue, yValue, zValue: DOUBLE): TVector; BEGIN WITH RESULT DO BEGIN x := xValue; y := yValue; z := zValue; size := size2D END END; //Vector2D // Assume vector contains 'extra' homogeneous coordinate -- ignore it. procedure NormalizeVector2D(var u: TVector); var lSum: double; BEGIN lSum := sqrt((u.x*u.x)+(u.y*u.y)+(u.z*u.z)); if lSum <> 0 then u := Vector2D( u.x/lSum, u.y/lSum, u.z/lSum) END; //NormalizeVector2D FUNCTION revMat (CONST Input:TMatrix): TMatrix;//Transpose Matrix var i,j: integer; begin result.size := Input.size; for i := 1 to Input.size do for j := 1 to Input.size do result.matrix[i,j] := input.matrix[j,i]; end; FUNCTION VecMatMult (CONST u: TVector; CONST a: TMatrix): TVector; VAR i,k : TIndex; temp: DOUBLE; BEGIN RESULT.size := a.size; IF a.size = u.size THEN BEGIN FOR i := 1 TO a.size DO BEGIN temp := 0.0; FOR k := 1 TO a.size DO BEGIN temp := temp + u.vector[k]*a.matrix[i,k]; END; RESULT.vector[i] := Defuzz(temp) END; END ELSE raise EMatrixError.Create('VecMatMult error') END;//VecMatMult (*procedure mx(lstr: string;lm: tmatrix); begin msg(lStr); fx(lm.matrix[1,1],lm.matrix[1,2],lm.matrix[1,3]); fx(lm.matrix[2,1],lm.matrix[2,2],lm.matrix[2,3]); fx(lm.matrix[3,1],lm.matrix[3,2],lm.matrix[3,3]); end;*) procedure PhilipsCorrectBvecs(var lDICOMdata:dicomdata; var lDTIra: TDTIRA; nVec: integer); //Test lIn.x := 0.499997615814209; lIn.y := 0.499997615814209; lIn.z := 0.707110166549683; //Philips DICOM data stored in patient (LPH) space, regardless of settings in Philips user interface //algorithm inspired by CATNAP http://godzilla.kennedykrieger.org/~jfarrell/software_web.htm //http://iacl.ece.jhu.edu/~bennett/catnap/catnap.shtml //0018,5100. patient orientation - 'HFS' //2001,100B Philips slice orientation (TRANSVERSAL, AXIAL, SAGITTAL) //2005,1071. Philips AP angulation : -8.74086 //2005,1072. Philips RL angulation : -3.53147 //2005,1073. Philips FH angulation -0.387372 (* 3/2008: updated to correct for a bug in the Johns Hopkins code: % July 20, 2007 | I corrected a small bug with the rotation matrices for % slice angulation. I had multiplied 3 matrices in the incorrect order. % A colleague (Harsh Agarwal) pointed this out while aligning different % MRI contrasts using the angulation parameters and the transformation % matrices given in the Philips document. %I originally had Tang = Tfh*Tap*Trl % which is now Tang = Trl*Tap*Tfh; %I originally had rev_Tang = rev_Trl*rev_Tap*rev_Tfh; %which is now rev_Tang = rev_Tfh*rev_Tap*rev_Trl; % I double checked the Philips code and this seems to be correct now. % I also double checked the impact on fiber tracking. The fiber tracking % looks good in both instances (even though the gradient tables are % slightly different). If 2 angulation values are zero (i.e. [AP,FH,RL] = % [0,0,20], then the old and new equations give the same result. Only if % two or more elements are non zero is the result different. I did some % testing with very large angulations of 20 degrees [20,20,0], [20,0,20] % and [0,20,20]and found that the fiber tracking results were almost % indistinguishable. THIS FIX ONLY affects yes overplus and % user-defined gradient tables. No overplus tables are not subject to % slice angulation changes *) var lIn,lOut: TVector; ltpp,lrev_tpp,ltpom,lrev_tpom,ltpo,lrev_tpo,ltrl,ltap,ltfh, lmtemp1,lmtemp2 ,ltang,lrev_tang, lrev_trl, lrev_tap, lrev_tfh, lrev_tsom,ldtiextra: TMatrix; lI: Integer; lap,lfh,lrl: double; begin if nVec < 1 then exit; //require HFS - head first supine. See Catnap for alternate body orientations if (length(lDicomData.PatientPos) >= 3) and (lDicomData.PatientPos[1] = 'H') and (lDicomData.PatientPos[2] = 'F') and (lDicomData.PatientPos[3] = 'S') then else begin Msg('DTI vector error: Position is not head first supine'); exit; end; //Assume supine ltpo := Matrix2D (1,0,0, 0,1,0, 0,0,1 ); lrev_tpo := revMat(ltpo); //Assume head first ltpp := Matrix2D (0,1,0, -1,0,0, 0,0,-1); lrev_tpp := revMat(ltpp); ltpom := MultiplyMatrices( ltpo, ltpp); lrev_tpom := MultiplyMatrices( lrev_tpp,lrev_tpo ); lap := lDicomData.AngulationAP * PI /180; lfh := lDicomData.AngulationFH * PI /180; lrl := lDicomData.AngulationRL * PI /180; //lAP:=-0.152557; lFH:=-0.0616358; lRL := -0.00676092; ltrl := Matrix2D (1,0,0, 0,cos(lrl),-sin(lrl), 0,sin(lrl),cos(lrl)); ltap := Matrix2D (cos(lap),0,sin(lap), 0,1,0, -sin(lap),0,cos(lap)); ltfh := Matrix2D (cos(lfh),-sin(lfh),0, sin(lfh),cos(lfh),0, 0,0,1); lrev_trl := revMat(ltrl); lrev_tap := revMat(ltap); lrev_tfh := revMat(ltfh); lmtemp1 := MultiplyMatrices( ltrl, ltap ); ltang := MultiplyMatrices( lmtemp1, ltfh ); lmtemp1 := MultiplyMatrices( lrev_tfh, lrev_tap ); lrev_tang := MultiplyMatrices( lmtemp1, lrev_trl ); if (lDicomData.PhilipsSliceOrient[1] = 'S') then //SAGITTAL lrev_tsom := Matrix2D (0,0,1, 0,-1,0, -1,0,0 ) else if (lDicomData.PhilipsSliceOrient[1] = 'C') then //CORONAL lrev_tsom := Matrix2D (0,0,1, -1,0,0, 0,1,0 ) else //TRANSVERSAL = AXIAL lrev_tsom := Matrix2D (0,-1,0, -1,0,0, 0,0,1 ); ldtiextra := Matrix2D (0,-1,0, -1,0,0, 0,0,1 ); lmtemp2 := MultiplyMatrices( ldtiextra, lrev_tsom ); lmtemp1 := MultiplyMatrices (lmtemp2, lrev_tang); for lI := 1 to nVec do begin if (lDTIra[lI].bval <= 0) or ((lDTIra[lI].v1 = 0) and (lDTIra[lI].v2 = 0) and (lDTIra[lI].v3 = 0)) then begin lDTIra[lI].v1 := 0; lDTIra[lI].v2 := 0; lDTIra[lI].v3 := 0; end else begin //lIn := Vector2D(0.7071, -0.7071, -0.0000); lIn := Vector2D(-lDTIra[lI].v1,-lDTIra[lI].v2,-lDTIra[lI].v3); NormalizeVector2D(lIn); lout := VecMatMult (lin,lmtemp1); NormalizeVector(lout); lDTIra[lI].v1 := lOut.x; if lOut.y = 0 then lDTIra[lI].v2 := lOut.y //people dislike seeing -0 else lDTIra[lI].v2 := -lOut.y; //flip Y component lDTIra[lI].v3 := lOut.z; end; end; //for each vector end; function VV (lLabel: string; var lV: TVector): string; begin result := lLabel +' =['+ floattostr(lV.x)+','+floattostr(lV.y)+','+ floattostr(lV.z)+']'';'; end; procedure VTX (var bvecs_old,slice_dir,read_dir,phase_dir: TVector); var lStr : string; begin lStr := ''; lStr := lStr + VV('bvecs_old',bvecs_old); lStr := lStr + VV('slice_dir',slice_dir); lStr := lStr + VV('read_dir',read_dir); lStr := lStr + VV('phase_dir',phase_dir); msg(lStr); end; procedure SiemensCorrectBvecs (var lDICOMdata:dicomdata; var lDTIra: TDTIra; nVec: integer); //see http://users.fmrib.ox.ac.uk/~robson/internal/Dicom2Nifti111.m var lI: integer; read_vector ,phase_vector,slice_vector,bvecs_old,bvecs_new: TVector; begin if nVec < 1 then exit; if (length(lDicomData.PatientPos) >= 3) and (lDicomData.PatientPos[1] = 'H') and (lDicomData.PatientPos[2] = 'F') and (lDicomData.PatientPos[3] = 'S') then else begin Msg('DTI vector error: Position is not head first supine'); exit; end; //fx(lDTI.v1,lDTI.v2,lDTI.v3); read_vector := Vector3D(lDICOMData.Orient[1],lDICOMData.Orient[2],lDICOMData.Orient[3]); phase_vector := Vector3D(lDICOMData.Orient[4],lDICOMData.Orient[5],lDICOMData.Orient[6]); slice_vector := CrossProduct(read_vector ,phase_vector); NormalizeVector(read_vector); NormalizeVector(phase_vector); NormalizeVector(slice_vector); for lI := 1 to nVec do begin if (lDTIra[lI].bval <= 0) or ((lDTIra[lI].v1 = 0) and (lDTIra[lI].v2 = 0) and (lDTIra[lI].v3 = 0)) then begin lDTIra[lI].v1 := 0; lDTIra[lI].v2 := 0; lDTIra[lI].v3 := 0; end else begin bvecs_old := Vector3D(lDTIra[lI].v1,lDTIra[lI].v2,lDTIra[lI].v3); VTX (bvecs_old,slice_vector,read_vector,phase_vector ); bvecs_new :=Vector3D(DotProduct(bvecs_old,read_vector),DotProduct(bvecs_old,phase_vector),DotProduct(bvecs_old,slice_vector) ); bvecs_new.y := - bvecs_new.y; NormalizeVector(bvecs_new); lDTIra[lI].v1 := bvecs_new.x; lDTIra[lI].v2 := bvecs_new.y; lDTIra[lI].v3 := bvecs_new.z; end; end;//for each bvec end; procedure SiemensFlipYBvecs (var lDTIra: TDTIra; nVec: integer); var lI: integer; V: double; begin if nVec < 1 then exit; for lI := 1 to nVec do begin if lDTIra[lI].v2 <> 0 then //people do not like seeing -0, even though this is a valid ieee value lDTIra[lI].v2 := -lDTIra[lI].v2; end; //next: normalize for lI := 1 to nVec do begin V := sqr(lDTIra[lI].v1)+ sqr(lDTIra[lI].v2)+sqr(lDTIra[lI].v3); if V = 0 then V := 1 else V := sqrt(V); lDTIra[lI].v1 := lDTIra[lI].v1/V; lDTIra[lI].v2 := lDTIra[lI].v2/V; lDTIra[lI].v3 := lDTIra[lI].v3/V; end; end; procedure GECorrectBvecs (var lDICOMdata:dicomdata; var lDTIra: TDTIra; nVec: integer); //0043,1039 (or 0043,a039). b value (as the first number in the string). //0019,10bb (or 0019,a0bb). X diffusion direction //0019,10bc (or 0019,a0bc). Y diffusion direction //0019,10bd (or 0019,a0bd). Z diffusion direction //These directions are relative to freq,phase,slice, so although no //transformations are required, you need to check the direction of the //phase encoding. This is in DICOM message 0018,1312. If this has value //COL then if swap the x and y value and reverse the sign on the z value. //If the phase encoding is not COL, then just reverse the sign on the x value. var lI: integer; lCol: boolean; lSwap: double; begin if nVec < 1 then exit; if (length(lDicomData.PatientPos) >= 3) and (lDicomData.PatientPos[1] = 'H') and (lDicomData.PatientPos[2] = 'F') and (lDicomData.PatientPos[3] = 'S') then else begin Msg('DTI vector error: Position is not head first supine'); exit; end; if (length(lDicomData.PhaseEncoding) >= 3) and (lDicomData.PhaseEncoding[1] = 'C') and (lDicomData.PatientPos[2] = 'O') and (lDicomData.PatientPos[3] = 'L') then lCol := true else lCol := false; for lI := 1 to nVec do begin if (lDTIra[lI].bval <= 0) or ((lDTIra[lI].v1 = 0) and (lDTIra[lI].v2 = 0) and (lDTIra[lI].v3 = 0)) then begin lDTIra[lI].v1 := 0; lDTIra[lI].v2 := 0; lDTIra[lI].v3 := 0; end else begin //if bval=0 or null vector, else real vector if lCol then begin lSwap := lDTIra[lI].v1; lDTIra[lI].v1 := lDTIra[lI].v2; lDTIra[lI].v2 := lSwap; lDTIra[lI].v3 := -lDTIra[lI].v3; end else begin lDTIra[lI].v1 := -lDTIra[lI].v1; lDTIra[lI].v2 := lDTIra[lI].v2; lDTIra[lI].v3 := lDTIra[lI].v3; end; end; //real vector - not 0,0,0 end;//for each bvec end; (*procedure doBVecs; var lDICOMData:dicomdata; lDTI: TDTI; begin lDICOMData.Orient[1] := 0.99872048491662; lDICOMData.Orient[2] := -0.0015021527936; lDICOMData.Orient[3] := -0.0505483584788; lDICOMData.Orient[4] := -1.12378993e-008; lDICOMData.Orient[5] := 0.99955873135595; lDICOMData.Orient[6] := -0.0297042517172; lDTI.v1 := 0.99899346; lDTI.v2 := 0.00503525; lDTI.v3 := -0.00604230; correctBvecs(lDICOMdata, lDTI); end; *) function MkDICOMDir (var lDICOMdata: DICOMdata; var lOutDir: string): boolean; var lBlank,lName: string; lPrefs: TPrefs; begin result := false; if not direxists(lOutDir) then exit; lBlank := ''; lPrefs.AppendDate := true; lPrefs.AppendAcqSeries := false; lPrefs.AppendProtocolName := false; lPrefs.AppendPatientName := true; lPrefs.AppendFilename := false; lName := OutputFilename(lBlank,lDicomData, lPrefs); if lName = '' then exit; lOutDir := lOutDir +lName; Msg('Creating folder '+lOutDir); {$I-} MkDir(lOutDir); if IOResult <> 0 then begin //MessageDlg('Cannot create directory', mtWarning, [mbOk], 0) end; {$I+} lOutDir := lOutDir + pathdelim; result := true; end; procedure afx(lDICOMImgName: string; lDTI:TDTI; Pos: integer); begin msg(extractfilename(lDicomImgName)+':' +floattostr(lDTI.bval)+': ' +floattostr(lDTI.v1)+': ' +floattostr(lDTI.v2)+': ' +floattostr(lDTI.v3)+ ' @ ' +inttostr(Pos)); end; function Dicom2NII(var lDICOMra: TDICOMrap; lFirstDICOM, lLastDICOM: integer; var lOutDirOrig: string; var lPrefs: TPrefs; lVols: integer): boolean; var lPref: TPrefs; lDTIra: TDTIra; lDTIdir,lRGB: integer; lVolGb : double; lAllocSLiceSz, lStart,lEnd,lmosX,lmosY,lIndex,lSecondDICOM,lSeries,lnSeries,lSliceBytes, lBaseBitDepth,lMosaicSlices, lSliceBytesOut,lvolOffset,lvolOffsetInit,lvolBytesOut: integer; lBaseIntenScale,lBaseIntenIntercept,lDX: single; //lDynStr, lDicomImgName,lOutHdrName,lOutImgName,lOutImgNameGZ,lOutDir,lOutDTIname:string; lDICOMData:dicomdata; lFlip,lIntenScaleVaries,lInterleaved,lFlipMosaic,lVolSave,lByteSwap : boolean; lAHdr: TNIFTIhdr; lTextF: TextFile; lOutF,lInF: File; lvBuffer,lsBuffer: bytep; begin result := false; if lPrefs.DebugMode2 then begin Msg( DICOMstr(1,lDICOMra,OutputFilename(lDicomImgName,lDICOMra^[lFirstDICOM],lPref))); result := true; exit; end; lPref := lPrefs; CorrectPrefs(lPref); lmosX := 1; lmosY := 1; lSecondDICOM := lFirstDICOM+1; lIntenScaleVaries := false; lInterleaved := false; lnSeries := (lLastDICOM+1) -lFirstDICOM; //e.g. first=10, last=10 means 1 image if lnSeries < 1 then exit; //next if magnitude and phase maps are saved in the same 4D file, extract to separate files... if (lDICOMra^[lFirstDICOM].file4D) and (MultiOrder(lDICOMra^[lFirstDICOM]) > 0) then lPref.fourD := false; lDicomImgName := lDICOMra^[lFirstDICOM].Filename; lDicomData := lDICOMra^[lFirstDICOM]; if (lDicomData.SamplesPerPixel = 3) then begin Msg('Warning: RGB to NIfTI conversion poorly tested: '+lDicomImgName); end; {$IFDEF ENDIAN_BIG} lByteSwap := odd(lDICOMdata.little_endian); {$ELSE} lByteSwap := not odd(lDICOMdata.little_endian); {$ENDIF} lMosaicSlices := lDicomData.SiemensSlices; lOutDir := ExtractFileDirWithPathDelim2(lOutDirOrig); if (lOutDir = '') then begin lOutDir := ExtractFilePath(lDicomImgName); end; if not DirWritePermission(lOutDir) then begin // <- tested with Unix Msg('Error: output directory is read-only: '+lOutDir); exit; end; if lPref.createoutputfolder then MkDICOMDir(lDICOMdata,lOutDir); if not direxists(lOutDir) then begin Msg('Unable to find output directory '+lOutDir); lOutDir := ExtractFileDirWithPathDelim2(lDicomImgName) end; //else directory exists //lOutHdrName :=lOutDir+OutputFilename(lDicomImgName,lDicomData,lPrefs.AppendDate,lPrefs.AppendAcqSeries,lPrefs.AppendProtocolName,lPrefs.AppendPatientName,lPrefs.FourD,lPrefs.AppendFilename)+'.hdr'; lOutHdrName :=lOutDir+OutputFilename(lDicomImgName,lDicomData,lPref)+'.hdr'; lOutImgName :=changefileext(lOutHdrName,'.img'); if lPref.SingleNIIFile then begin lOutHdrName := changefileext(lOutHdrName,'.nii'); lOutImgName := lOutHdrName; end; if (lPref.SingleNIIFile) and (lPref.GZip) then begin lOutHdrName := lOutHdrName+'.gz'; if (not UniqueFileName(lOutHdrName)) then begin Msg('File already exists '+lOutImgName+' '+lOutHdrName); exit; end; //we now need to remove the .gz - not that unique filename may have appended postfix, e.g. filename.nii.gz -> filenameA.nii.gz StripGZExt(lOutHdrName); lOutImgName := lOutHdrName; end else begin if (not UniqueFileName(lOutHdrName)) or (not UniqueFileName(lOutImgName)) then begin Msg('File already exists '+lOutImgName+' '+lOutHdrName); exit; end; end; Msg(extractfilename(lDicomImgName)+'->'+extractfilename(lOutImgName)); DICOM2AnzHdr(lAHdr,lPref.Anonymize,lDicomImgName,lDICOMdata); if (lVols > 1) and ((lnSeries mod lVols)=0) then lDICOMdata.SlicesPer3DVol := round(lnSeries/lVols); lDTIra[1].bval := -1; //not DTI lDTIdir := 0; IsSiemensDTI(lDicomData,lDTIra[1], lDicomImgName, lPrefs);//see if this is a Siemens DTI image - mosaics in B13, non-mosaic in B12 if (lDICOMdata.SiemensMosaicX > 1) or (lDICOMdata.SiemensMosaicY > 1) then begin lFlipMosaic := IsNormalMosaic(lDicomData,lMosaicSlices, lDicomImgName); lAHdr.dim[1] := lDicomData.XYZdim[1] div lDICOMdata.SiemensMosaicX; lAHdr.dim[2] := lDicomData.XYZdim[2] div lDICOMdata.SiemensMosaicY; lmosX := lDICOMdata.SiemensMosaicX; lmosY := lDICOMdata.SiemensMosaicY; //lSlices := lDICOMdata.SiemensSlices;//(lDicomImgName,'NumberOfImagesInMosaic'); if lMosaicSlices > 1 then lAHdr.dim[3] := lMosaicSlices else lAHdr.dim[3] := lDICOMdata.SiemensMosaicX *lDICOMdata.SiemensMosaicY; lAHdr.dim[4] := lnSeries; if ((lmosX*lmosY) < lAHdr.dim[3]) then begin msg('Aborted '+lDicomData.Filename+ ' : This '+inttostr(lmosx)+'*'+inttostr(lmosy)+' mosaic can not hold '+inttostr(lAHdr.dim[3])+' slices.'); exit; end; end else if lDICOMdata.File4D then begin//(lDicomData.XYZdim[3] > 1) and (lnSeries = 1) and (lDICOMdata.SlicesPer3DVol > 1) and ((lAHdr.dim[3] mod lDICOMdata.SlicesPer3DVol)=0) then begin lAHdr.dim[4] := lAHdr.dim[3] div lDICOMdata.SlicesPer3DVol; lAHdr.dim[3] := lDICOMdata.SlicesPer3DVol; //fx(213,lAHdr.dim[3],lAHdr.dim[4]); end else if (lDicomData.XYZdim[3] > 1) then lAHdr.dim[4] := lnSeries else begin if (lDICOMdata.SlicesPer3DVol > 1) and ((lnSeries mod lDICOMdata.SlicesPer3DVol)=0) then begin lAHdr.dim[3] := lDICOMdata.SlicesPer3DVol; lAHdr.dim[4] := round(lnSeries / lDICOMdata.SlicesPer3DVol); if (lnSeries > 1) and (DICOMinterslicedistance( lDICOMra^[lFirstDICOM], lDICOMra^[lSecondDICOM]) < 0.01) then lInterleaved := true; end else lAHdr.dim[3] := lnSeries; end; lFlip := false; if lnSeries > 1 then begin//check slice order lFlip := CheckSliceDirection(lDICOMra^[lFirstDICOM],lDICOMra^[lLastDICOM]); if lFlip then begin lDicomImgName := lDICOMra^[lLastDICOM].Filename; lDICOMdata := lDICOMra^[lLastDICOM]; end; end; //next compute dx between slices if (lAHdr.dim[3] > 1) and (lnSeries > 1) and (lDICOMdata.SiemensMosaicX <2) then begin lDX := abs(DICOMinterslicedistance( lDICOMra^[ Index (1,lFirstDICOM,lInterleaved,lFlip,lAHdr)], lDICOMra^[ Index (2,lFirstDICOM,lInterleaved,lFlip,lAHdr)]) ); if lDX <> 0 then begin lDicomData.XYZmm[3] := lDX; lAHdr.pixdim[3] := lDX; end; end; dicom_2_nifti(lDICOMdata,lAHdr,lMosaicSlices,lFlipmosaic); lBaseIntenScale := lDICOMdata.IntenScale; lBaseIntenIntercept := lDICOMdata.IntenIntercept; lBaseBitDepth := lDicomData.Allocbits_per_pixel; (* for lSeries := 1 to lnSeries do begin lIndex := Index (lSeries,lFirstDICOM,lInterleaved,lFlip,lAHdr); lDicomData := lDICOMra^[lIndex]; msgfx(lSeries, lDICOMdata.DTI[1].v1,lDICOMdata.DTI[1].v2,lDICOMdata.DTI[1].v3); end; *) //exit;//get out of here - crucial critical -- last chance before data saved to disk if (lAHdr.bitpix = 8) and (lDicomData.SamplesPerPixel = 3) then begin lRGB := 3; lAHdr.datatype := kDT_RGB; lAHdr.bitpix := 24; end else lRGB := 1; lSliceBytes := lDicomData.XYZdim[1]*lDicomData.XYZdim[2]*lDicomData.XYZdim[3]*trunc(((lDicomData.Allocbits_per_pixel)+7)/8)*lRGB; GetMem(lsBuffer,lSliceBytes); //showmessage(inttostr(lSliceBytes)); lSliceBytesOut :=lAHdr.dim[1]*lAHdr.dim[2]*lAHdr.dim[3]*trunc(((lDicomData.Allocbits_per_pixel)+7)/8)*lRGB; lVolBytesOut := lSliceBytesOut * lAHdr.dim[4]; lVolOffset := 1; lVolGB := (lSliceBytesOut/ 1073741824) * lAHdr.dim[4]; //bytes *1024 (kB) *1024 (Mb) * 1024 (Gb) //note.nii files are 352bytes larger than calculated by lVolGb... //Msg(floattostr(lVolGb)+' Gb'); if lVolGb < 0.95 then lVolSave := true else begin Msg('Very large volume: '+floattostr(lVolGb)+' Gb: slice-by-slice conversion required.'); if lPref.GZip then begin lPref.GZip := false; Msg('Unable to automatically GZip such a large file.'); end; lVolSave := false; end; if lVolSave then begin //save entire volume if lPref.SingleNIIFile then begin lVolOffset := kNIIImgOffset+1;// 353; //first 352 bytes empty lVolBytesOut := lVolBytesOut + lVolOffset -1; end else lVolOffset := 1; GetMem(lvBuffer,lVolBytesOut); //showmessage(inttostr(lVolBytesOut)); //we could copy NIfTI header to Buffer, but this would need to be changed for //4D->3D images or images where we swap 3rd and 4th dimension.... end else begin //save slice by slice - slower but low RAM usage... if not SaveHdr (lOutHdrName,lAHdr, false,lPref.SPM2) then begin Msg('Error saving data - do you have permission and space for '+lOutHdrName+'?'); exit; end; Filemode := 2; AssignFile(lOutF, lOutImgName); if lPref.SingleNIIFile then begin Reset(lOutF,1); Seek(lOutF,352); lAHdr.vox_offset := 352; end else Rewrite(lOutF,1); end; //end slice-bylslice Filemode := 0; //set to read only lVolOffsetInit := lVolOffset; for lSeries := 1 to lnSeries do begin lIndex := Index (lSeries,lFirstDICOM,lInterleaved,lFlip,lAHdr); lDicomImgName := lDICOMra^[lIndex].Filename; lDicomData := lDICOMra^[lIndex]; if (lDICOMdata.ManufacturerID = kPhilipsID) and (lDICOMdata.nDTIdir > 1) and (lAHdr.dim[4] < kMaxDTIDir) and (lDICOMdata.nDTIdir >= lAHdr.dim[4]) then begin // Msg('4D Philips DTI data '+inttostr(lDICOMdata.nDTIdir)); for lDTIdir := 1 to lAHdr.dim[4] do begin lDTIra[lDTIdir].bval := lDICOMdata.DTI[lDTIdir].bval; lDTIra[lDTIdir].v1 := lDICOMdata.DTI[lDTIdir].v1; lDTIra[lDTIdir].v2 := lDICOMdata.DTI[lDTIdir].v2; lDTIra[lDTIdir].v3 := lDICOMdata.DTI[lDTIdir].v3; end; lDTIdir := lAHdr.dim[4]; end else if (lDICOMdata.ManufacturerID = kSiemensID) and (lDTIra[1].Bval >= 0) and (lDTIdir < kMaxDTIDir) and ( ((lSeries mod lAHdr.dim[3]) = 1) or((lMosX > 1) or (lMosY > 1))) then begin // inc(lDTIdir); IsSiemensDTI(lDicomData,lDTIra[lDTIdir], lDicomImgName,lPrefs); // msgfx(lSeries, lDTIra[lDTIdir].v1,lDTIra[lDTIdir].v2,lDTIra[lDTIdir].v3); //fx(lDTI.v1,lDTI.v2,lDTI.v3,666); //afx(lDicomImgName, lDTIra[lDTIdir],lDTIdir); end else if (lDICOMdata.nDTIdir = 1) and (lDICOMdata.DTI[1].Bval >= 0) and (lDTIdir < kMaxDTIDir) and ( (lSeries mod lAHdr.dim[3]) = 1) then begin // inc(lDTIdir); lDTIra[lDTIdir].bval := lDICOMdata.DTI[1].bval; lDTIra[lDTIdir].v1 := lDICOMdata.DTI[1].v1; lDTIra[lDTIdir].v2 := lDICOMdata.DTI[1].v2; lDTIra[lDTIdir].v3 := lDICOMdata.DTI[1].v3; end; if lDICOMdata.IntenIntercept <> lBaseIntenIntercept then lIntenscaleVaries := true; //1492 if lDICOMdata.IntenScale <> lBaseIntenScale then lIntenscaleVaries := true; if lDicomData.Allocbits_per_pixel <> lBaseBitDepth then lIntenscaleVaries := true; if (lDicomData.JPEGLosslessCpt) then begin AssignFile(lInF, lDicomImgName); Reset(lInF,1); Filemode := 0; //ReadONly lSliceBytesOut := lSliceBytes; lAllocSLiceSz := (lDICOMdata.XYZdim[1]*lDICOMdata.XYZdim[2]{height * width} * lDICOMdata.Allocbits_per_pixel+7) div 8 ; //fx('name='+lDicomImgName+' allocsz='+inttostr(lAllocSLiceSz)+' offset='+inttostr(lDicomData.CompressOffset)+' sz='+inttostr(lDicomData.CompressSz)); //fx(lAllocSLiceSz,lDicomData.CompressOffset,lDICOMdata.CompressSz); DecodeJPEG(lInF,SmallIntP0(lsBuffer),ByteP0(lsBuffer),lAllocSliceSz,lDicomData.CompressOffset,lDICOMdata.CompressSz,false); CloseFile(lInF); FlipTB(lDICOMdata,lsBuffer); if lVolSave then begin{save entire volume} Move(lsBuffer^,lvBuffer^[lvolOffset],lSliceBytesOut); //Msg(inttostr(lSeries)); lVolOffset := lVolOffset + lSliceBytesOut; end else begin //save slice-by-slice Filemode := 2; //read and write BlockWrite(lOutF, lsBuffer^, lSliceBytesOut); end; end else if (FSize(lDicomImgName) >= (lSliceBytes+lDicomData.imagestart)) then begin Filemode := 0; //ReadONly AssignFile(lInF, lDicomImgName); Reset(lInF,1); Seek(lInF,lDicomData.imagestart); Filemode := 0; //ReadONly BlockRead(lInF, lsBuffer^, lSliceBytes); if (lDICOMdata.file4D) and (lPrefs.Swizzle4D) then SwapTime(lDICOMdata,lsBuffer);//data is stored X,Y,T,Z - swap to X,Y,Z,T lSliceBytesOut := lSliceBytes; if (lDICOMdata.PlanarConfig = 0) and (lDicomData.SamplesPerPixel = 3) then MakePlanar(lsBuffer,lDICOMdata); if (lMosX > 1) or (lMosY > 1) then begin //lBuffer: bytep;lmosX,lmosY,lSlices: integer; lFlip: boolean; var lDicomData: DICOMdata); DeMosaic(lsBuffer,lmosX,lmosY,lMosaicSlices,lFlipMosaic,lDICOMdata); lSliceBytesOut :=lAHdr.dim[1]*lAHdr.dim[2]*lAHdr.dim[3]*trunc(((lDicomData.Allocbits_per_pixel)+7)/8); end else FlipTB(lDICOMdata,lsBuffer); CloseFile(lInF); if lVolSave then begin{save entire volume} //showmessage('volsave'+lDicomImgName+ inttostr(lvolOffset)+':'+inttostr(lSliceBytesOut)); Move(lsBuffer^,lvBuffer^[lvolOffset],lSliceBytesOut); lVolOffset := lVolOffset + lSliceBytesOut; end else begin //save slice-by-slice Filemode := 2; //read and write BlockWrite(lOutF, lsBuffer^, lSliceBytesOut); end; end else begin Msg('Serious error with file '+ extractfilename(lDicomImgName)); (*Msg('Error: file ' + extractfilename(lDicomImgName)+' is '+inttostr(FSize(lDicomImgName))+ ' with an offset of '+inttostr(lDicomData.imagestart) +' should have '+inttostr(lSliceBytes)+' bytes image data!'); Msg(inttostr(lDicomData.XYZdim[1])+' '+inttostr(lDicomData.XYZdim[2])+' '+inttostr(lDicomData.XYZdim[3])); readln;*) end; end; freemem(lsBuffer); Filemode := 2; //read and write lOutImgNameGZ := lOutImgName; if lVolSave then begin{save slice-by-slice} lOutImgNameGZ := SaveNIfTICore (lOutImgName, lvBuffer, lVolOffsetInit, lAHdr, lPref,lByteSwap) end else //data saved slice by slice CloseFile(lOutF); //if (lPref.StartClip > 0) or (lPref.EndClip > 0) then // Clip4D(lOutHdrName, lAHdr, false,lPref.SPM2,lPref.SingleNIIFile,lPref.GZip, true, lPref.StartClip,lPref.EndClip); if lDTIdir > 1 then begin //bvec file lStart := -1;//ensure this is a DTI image - some scans must have a bvalue > 1 for lIndex := 1 to lDTIdir do if lDTIra[lIndex].bval = 0 then lStart := lIndex; if lStart < 1 then begin Msg('* Warning: diffusion acquisition does not have b-0 image'); PartialAcquisitionError; end; lStart := -1;//ensure this is a DTI image - some scans must have a bvalue > 1 for lIndex := 1 to lDTIdir do if lDTIra[lIndex].bval > 0 then lStart := lIndex; if lStart > 0 then begin lStart := 1; lEnd := lDTIdir; lOutDTIname := lOutImgName; Msg('Number of diffusion directions = '+inttostr(lDTIdir)); if lDicomData.ManufacturerID = kSiemensID then begin Msg('Note: detected Siemens Software version [0018:1020] = '+inttostr(lDicomData.Vers0018_1020) ); Msg(' -Will use 0019:000E or 0019:100E instead of 0029:1020 if version >= ' +inttostr(lPrefs.SiemensDTIUse0019If00181020atleast)); Msg(' -Will stack across Acquisitions if version >=' +inttostr(lPrefs.SiemensDTIStackIf00181020atleast)); Msg(' -No slice angulation correction of vectors if version >=' +inttostr(lPRefs.SiemensDTINoAngulationCorrectionIf00181020atleast)); Msg(' To adjust, edit '+IniName ); if lDicomData.Vers0018_1020 = 13 then Msg(' *Warning: some Siemens VB13 set DiffusionGradientDirection incorrectly. Please check manually validate'); if lDicomData.Vers0018_1020 >= lPrefs.SiemensDTINoAngulationCorrectionIf00181020atleast then SiemensFlipYBvecs(lDTIra,lDTIdir) else SiemensCorrectBvecs(lDicomData,lDTIra,lDTIdir); end else if lDicomData.ManufacturerID = kPhilipsID then begin PhilipsCorrectBvecs(lDicomData,lDTIra,lDTIdir); //next: philips scans can include DWI images with bval>0 and v1=0,v2=0,v3=0 - we want to exclude these for lIndex := lDTIdir downto 1 do if (lDTIra[lIndex].bval = 0) or (lDTIra[lIndex].v1 <> 0) or (lDTIra[lIndex].v2 <> 0) or (lDTIra[lIndex].v3 <> 0) then lStart := lIndex; for lIndex := 1 to lDTIdir do if (lDTIra[lIndex].bval = 0) or (lDTIra[lIndex].v1 <> 0) or (lDTIra[lIndex].v2 <> 0) or (lDTIra[lIndex].v3 <> 0) then lEnd := lIndex; if ((lStart >1) or (lEnd < lDTIdir)) and (lStart <= lEnd) then begin if lVolSave then {save slice-by-slice} lOutDTIname := SaveNIfTICoreCrop (lOutImgName, lvBuffer, lVolOffsetInit,lStart-1,lDTIdir-lEnd, lAHdr, lPref,lByteSwap) else lOutDTIname := Clip4D(lOutHdrName, lAHdr, false,lPref, lStart-1,lDTIdir-lEnd); //lOutDTIname := Clip4D(lOutHdrName, lAHdr, false,lPref.SPM2,lPref.SingleNIIFile,lPref.GZip, false, lStart-1,lDTIdir-lEnd); //Msg(lOutDTIName); Msg('Removed DWI from DTI scan - saving volumes '+inttostr(lStart)+'..'+inttostr(lEnd)); end;//exclude scans end else if lDicomData.ManufacturerID = kGEID then GECorrectBvecs(lDicomData,lDTIra,lDTIdir) else Msg('WARNING: Unkown manufacturer - DTI BVecs are probably incorrect.');//beta software if lStart <= lEnd then begin //create output vectors if lOutDTIname <> '' then begin //image file created lOutDTIname := changefileextX(lOutDTIname,'.bvec'); assignfile(lTextF,lOutDTIname); Filemode := 0; rewrite(lTextF); for lSeries := lStart to lEnd do Write(lTextF,floattostr(lDTIra[lSeries].v1)+ ' '); Writeln(lTextF); for lSeries := lStart to lEnd do Write(lTextF,floattostr(lDTIra[lSeries].v2)+ ' '); Writeln(lTextF); for lSeries := lStart to lEnd do Write(lTextF,floattostr(lDTIra[lSeries].v3)+ ' '); Writeln(lTextF); closefile(lTextF); //create bvals lOutDTIname := changefileextX(lOutDTIname,'.bval'); assignfile(lTextF,lOutDTIname); Filemode := 0; rewrite(lTextF); for lSeries := lStart to lEnd do Write(lTextF,inttostr(lDTIra[lSeries].bval)+' '); Writeln(lTextF); closefile(lTextF); end;// if lOutDTIname <> '' then begin //image file created end; //lStart <= lEnd end; //some bvals > 0 end; //DTIdir if lVolSave then //do this AFTER DTI extraction - allows rapid cropping of Philips DTI Freemem ( lvBuffer) else begin if ((not lPref.FourD) and (lAHdr.dim[4] > 1)) or ((lPref.SingleNIIFile) and (lPref.Gzip)) then begin ChangeNIfTISubformat(lOutHdrName, lAHdr,lPref) ; end; end; //slice-by-slice if lIntenscaleVaries then begin beep; Msg('Intensity scale/slope or bit-depth varies across slices: perhaps convert with MRIcro.'); end; if (lPref.enablereorient) and (lDicomData.XYZdim[2] > lPref.MinReorientMatrix) and (lDicomData.XYZdim[1] > lPref.MinReorientMatrix) and (lAHdr.dim[3] > 64) and (lAHdr.dim[4] < 2) then begin lOutImgName := Reorient(lOutImgNameGZ,lAHdr,lPref,false,false); if (lOutImgName <> '') and (lDicomData.TE < 25) and (lDicomData.TE > 0) then //T1 image CropNIfTI(lOutImgName,lPref); end; result := true; Filemode := 0; //ReadONly ExitCode := 0; end; end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/cutout.pas���������������������������������������������������������0000664�0001750�0001750�00000013012�11450366176�017706� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit cutout; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Spin; const kMaxFrac = 1000;//e.g. if 100 then cutouts are done by percent, if 1000 then 0.001 type { TCutoutForm } TCutoutForm = class(TForm) CutoutBiasDrop: TComboBox; CutoutLUTDrop: TComboBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; PreviewBtn: TButton; DefBtn: TButton; OKBtn: TButton; CutoutBox: TGroupBox; PreviewBtn1: TButton; RenderCutoutCheck: TCheckBox; XLo: TSpinEdit; XHi: TSpinEdit; YLo: TSpinEdit; YHi: TSpinEdit; ZLo: TSpinEdit; ZHi: TSpinEdit; procedure Prep; procedure DefBtnClick(Sender: TObject); procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormShow(Sender: TObject); procedure OKBtnClick(Sender: TObject); procedure PreviewBtn1Click(Sender: TObject); procedure PreviewClick(Sender: TObject); procedure RenderCutoutCheckClick(Sender: TObject); private { private declarations } public { public declarations } end; var CutoutForm: TCutoutForm; implementation {$DEFINE REND} //if you define "REND" render form will be interactively adjusted uses render_composite{grender}, nifti_img_view {LUTdrop},define_types {sortcutout} {$IFDEF REND}, render {$ENDIF}{azimuth,elevation,timer} ; var gInit: boolean = false; { TCutoutForm } procedure TCutoutForm.Prep; begin gInit := true; CutoutForm.caption := 'Cutouts: '+inttostr(kMaxFrac)+'= 100%'; cutoutlutdrop.Items := ImgForm.LUTdrop.items; if (gRender.cutoutLUTindex < 1) or (gRender.cutoutLUTindex > cutoutlutdrop.Items.Count) then cutoutlutdrop.itemindex := 0 else cutoutlutdrop.itemindex := gRender.cutoutLUTindex; if gRender.CutoutFrac.Lo[1] < 0 then SliceToFrac(gBGImg); SortCutout(gRender.CutoutFrac); Xlo.maxValue := kMaxFrac;//gBGImg.ScrnDim[1]; Xhi.maxValue := kMaxFrac;//gBGImg.ScrnDim[1]; Ylo.maxValue := kMaxFrac;//gBGImg.ScrnDim[2]; Yhi.maxValue := kMaxFrac;//gBGImg.ScrnDim[2]; Zlo.maxValue := kMaxFrac;//gBGImg.ScrnDim[3]; Zhi.maxValue := kMaxFrac;//gBGImg.ScrnDim[3]; Xlo.Value := gRender.CutoutFrac.Lo[1]; Xhi.Value := gRender.CutoutFrac.Hi[1]; Ylo.Value := gRender.CutoutFrac.Lo[2]; Yhi.Value := gRender.CutoutFrac.Hi[2]; Zlo.Value := gRender.CutoutFrac.Lo[3]; Zhi.Value := gRender.CutoutFrac.Hi[3]; //OverlayClipEdit.value := gRender.OverlayNearClipFrac; //BGClipEdit.value := gRender.BGNearClipFrac; RenderCutoutCheck.checked := gRender.ShowCutout; CutoutBiasDrop.ItemIndex:=( gRender.CutoutBias); RenderCutoutCheckClick(nil); gInit := false; end; procedure ReadCutoutForm; begin with CutoutForm do begin gRender.CutoutFrac.Lo[1] := round(Xlo.Value); gRender.CutoutFrac.Hi[1] := round(Xhi.Value); gRender.CutoutFrac.Lo[2] := round(Ylo.Value); gRender.CutoutFrac.Hi[2] := round(Yhi.Value); gRender.CutoutFrac.Lo[3] := round(Zlo.Value); gRender.CutoutFrac.Hi[3] := round(Zhi.Value); SortCutout(gRender.CutoutFrac); gRender.ShowCutout := RenderCutoutCheck.checked; gRender.CutoutBias := CutoutBiasDrop.ItemIndex; gRender.cutoutLUTindex := cutoutlutdrop.itemindex; //gRender.OverlayNearClipFrac := round(OverlayClipEdit.value); // gRender.BGNearClipFrac := round(BGClipEdit.value); end; end; procedure TCutoutForm.RenderCutoutCheckClick(Sender: TObject); begin CutoutBox.visible := RenderCutoutCheck.Checked; PreviewClick(nil); end; procedure TCutoutForm.PreviewClick(Sender: TObject); begin if gInit then exit; ReadCutoutForm; {$IFDEF REND} gZoom := 0.5; RenderForm.RenderRefreshTimer.Tag := -1; //force a new rotation matrix to be generated RenderForm.RenderRefreshTimer.enabled := true; {$ENDIF} end; procedure TCutoutForm.DefBtnClick(Sender: TObject); begin gInit := true; Ylo.Value := kMaxFrac shr 1; Yhi.Value := kMaxFrac ; Zlo.Value := kMaxFrac shr 1; Zhi.Value := kMaxFrac ; //OverlayClipEdit.value := 0; //BGClipEdit.value := 0; RenderCutoutCheck.checked := true; CutoutLUTdrop.ItemIndex := 0; CutoutBiasDrop.ItemIndex:= 3; {$IFDEF REND} if renderForm.FlipLRcheck.checked then begin Xlo.Value := 0; Xhi.Value := kMaxFrac shr 1; end else begin Xlo.Value := kMaxFrac shr 1; Xhi.Value := kMaxFrac ; end; RenderForm.AzimuthEdit.value := 120; RenderForm.ElevationEdit.value := 45; {$ELSE} Xlo.Value := 0; Xhi.Value := kMaxFrac shr 1; {$ENDIF} gInit := false; RenderCutoutCheckClick(nil);//PreviewClick(nil); end; procedure TCutoutForm.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin ReadCutoutForm; //note: exit if no changes {$IFDEF REND} RenderForm.RenderRefreshTimer.Tag := -1; //force a new rotation matrix to be generated RenderForm.RenderRefreshTimer.enabled := true; {$ENDIF} end; procedure TCutoutForm.FormShow(Sender: TObject); begin Prep; end; procedure TCutoutForm.OKBtnClick(Sender: TObject); begin CutoutForm.close; end; procedure TCutoutForm.PreviewBtn1Click(Sender: TObject); begin ReadCutoutForm; RenderForm.RenderRefreshTimer.Tag := -1; //force a new rotation matrix to be generated RenderForm.RenderRefreshTimer.enabled := true; end; initialization {$I cutout.lrs} end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/cutout.lrs���������������������������������������������������������0000664�0001750�0001750�00000007613�11450366176�017735� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ This is an automatically generated lazarus resource file } LazarusResources.Add('TCutoutForm','FORMDATA',[ 'TPF0'#11'TCutoutForm'#10'CutoutForm'#4'Left'#3#128#1#6'Height'#3'N'#1#3'Top' +#3#175#0#5'Width'#3'N'#1#18'HorzScrollBar.Page'#3'O'#1#18'VertScrollBar.Page' +#3'<'#1#13'ActiveControl'#7#17'RenderCutoutCheck'#11'BorderIcons'#11#12'biSy' +'stemMenu'#10'biMinimize'#0#11'BorderStyle'#7#8'bsSingle'#7'Caption'#6#7'Cut' +'outs'#12'ClientHeight'#3'N'#1#11'ClientWidth'#3'N'#1#21'Constraints.MaxHeig' +'ht'#3'N'#1#20'Constraints.MaxWidth'#3'N'#1#21'Constraints.MinHeight'#3'N'#1 +#20'Constraints.MinWidth'#3'N'#1#7'OnClose'#7#9'FormClose'#6'OnShow'#7#8'For' +'mShow'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29'#0#9'TChe' +'ckBox'#17'RenderCutoutCheck'#4'Left'#2#16#6'Height'#2#17#3'Top'#2#8#5'Width' +#2'P'#7'Caption'#6#11'Show cutout'#7'OnClick'#7#22'RenderCutoutCheckClick'#8 +'TabOrder'#2#0#0#0#9'TGroupBox'#9'CutoutBox'#4'Left'#2#16#6'Height'#3#224#0#3 +'Top'#2' '#5'Width'#3'0'#1#12'ClientHeight'#3#206#0#11'ClientWidth'#3','#1#8 +'TabOrder'#2#5#0#6'TLabel'#6'Label1'#4'Left'#2#14#6'Height'#2#14#3'Top'#2#8#5 +'Width'#2':'#7'Caption'#6#12'X [low=left]'#11'ParentColor'#8#0#0#6'TLabel'#6 +'Label2'#4'Left'#2#14#6'Height'#2#14#3'Top'#2'0'#5'Width'#2'U'#7'Caption'#6 +#17'Y [low=posterior]'#11'ParentColor'#8#0#0#6'TLabel'#6'Label3'#4'Left'#2#14 +#6'Height'#2#14#3'Top'#2'X'#5'Width'#2'L'#7'Caption'#6#15'Z [low=ventral]'#11 +'ParentColor'#8#0#0#6'TLabel'#6'Label4'#4'Left'#2#14#6'Height'#2#14#3'Top'#3 +#135#0#5'Width'#2'7'#7'Caption'#6#11'Cutout Tint'#11'ParentColor'#8#0#0#6'TL' +'abel'#6'Label5'#4'Left'#2#14#6'Height'#2#14#3'Top'#3#175#0#5'Width'#2'>'#7 +'Caption'#6#12'Cutout Color'#11'ParentColor'#8#0#0#9'TSpinEdit'#3'XLo'#4'Lef' +'t'#2'v'#6'Height'#2#21#3'Top'#2#0#5'Width'#2'R'#8'MaxValue'#3#232#3#8'OnCha' +'nge'#7#12'PreviewClick'#8'TabOrder'#2#0#0#0#9'TSpinEdit'#3'XHi'#4'Left'#3 +#206#0#6'Height'#2#21#3'Top'#2#0#5'Width'#2'R'#8'MaxValue'#3#232#3#8'OnChang' +'e'#7#12'PreviewClick'#8'TabOrder'#2#1#0#0#9'TSpinEdit'#3'YLo'#4'Left'#2'v'#6 +'Height'#2#21#3'Top'#2'('#5'Width'#2'R'#8'MaxValue'#3#232#3#8'OnChange'#7#12 +'PreviewClick'#8'TabOrder'#2#2#0#0#9'TSpinEdit'#3'YHi'#4'Left'#3#206#0#6'Hei' +'ght'#2#21#3'Top'#2'('#5'Width'#2'R'#8'MaxValue'#3#232#3#8'OnChange'#7#12'Pr' +'eviewClick'#8'TabOrder'#2#3#0#0#9'TSpinEdit'#3'ZLo'#4'Left'#2'v'#6'Height'#2 +#21#3'Top'#2'X'#5'Width'#2'R'#8'MaxValue'#3#232#3#8'OnChange'#7#12'PreviewCl' +'ick'#8'TabOrder'#2#4#0#0#9'TSpinEdit'#3'ZHi'#4'Left'#3#206#0#6'Height'#2#21 +#3'Top'#2'X'#5'Width'#2'R'#8'MaxValue'#3#232#3#8'OnChange'#7#12'PreviewClick' +#8'TabOrder'#2#5#0#0#9'TComboBox'#14'CutoutBiasDrop'#4'Left'#2'v'#6'Height'#2 +#19#3'Top'#3#128#0#5'Width'#3#170#0#10'ItemHeight'#2#13#13'Items.Strings'#1#6 +#8'0.1 Dark'#6#3'0.2'#6#3'0.3'#6#3'0.4'#6#3'0.5'#6#3'0.6'#6#3'0.7'#6#3'0.8'#6 +#9'0.9 Light'#0#8'OnChange'#7#12'PreviewClick'#5'Style'#7#16'csOwnerDrawFixe' +'d'#8'TabOrder'#2#6#0#0#9'TComboBox'#13'CutoutLUTDrop'#4'Left'#2'v'#6'Height' +#2#19#3'Top'#3#168#0#5'Width'#3#170#0#10'ItemHeight'#2#13#8'OnChange'#7#12'P' +'reviewClick'#5'Style'#7#16'csOwnerDrawFixed'#8'TabOrder'#2#7#0#0#0#7'TButto' +'n'#10'PreviewBtn'#4'Left'#3#128#0#6'Height'#2#25#3'Top'#3'0'#1#5'Width'#2'K' +#7'Caption'#6#7'Preview'#7'OnClick'#7#12'PreviewClick'#8'TabOrder'#2#2#7'Vis' +'ible'#8#0#0#7'TButton'#6'DefBtn'#4'Left'#3#128#0#6'Height'#2#25#3'Top'#3#16 +#1#5'Width'#2'K'#7'Caption'#6#8'Defaults'#7'OnClick'#7#11'DefBtnClick'#8'Tab' +'Order'#2#3#0#0#7'TButton'#5'OKBtn'#4'Left'#3#237#0#6'Height'#2#25#3'Top'#3 +#16#1#5'Width'#2'K'#7'Caption'#6#2'OK'#7'OnClick'#7#10'OKBtnClick'#8'TabOrde' +'r'#2#4#0#0#7'TButton'#11'PreviewBtn1'#4'Left'#2#16#6'Height'#2#25#3'Top'#3 +#16#1#5'Width'#2'K'#7'Caption'#6#7'Preview'#7'OnClick'#7#16'PreviewBtn1Click' +#8'TabOrder'#2#1#0#0#0 ]); ���������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/cutout.lfm���������������������������������������������������������0000664�0001750�0001750�00000010064�11450366176�017705� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object CutoutForm: TCutoutForm Left = 384 Height = 334 Top = 175 Width = 334 HorzScrollBar.Page = 335 VertScrollBar.Page = 316 ActiveControl = RenderCutoutCheck BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'Cutouts' ClientHeight = 334 ClientWidth = 334 Constraints.MaxHeight = 334 Constraints.MaxWidth = 334 Constraints.MinHeight = 334 Constraints.MinWidth = 334 OnClose = FormClose OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object RenderCutoutCheck: TCheckBox Left = 16 Height = 17 Top = 8 Width = 80 Caption = 'Show cutout' OnClick = RenderCutoutCheckClick TabOrder = 0 end object CutoutBox: TGroupBox Left = 16 Height = 224 Top = 32 Width = 304 ClientHeight = 206 ClientWidth = 300 TabOrder = 5 object Label1: TLabel Left = 14 Height = 14 Top = 8 Width = 58 Caption = 'X [low=left]' ParentColor = False end object Label2: TLabel Left = 14 Height = 14 Top = 48 Width = 85 Caption = 'Y [low=posterior]' ParentColor = False end object Label3: TLabel Left = 14 Height = 14 Top = 88 Width = 76 Caption = 'Z [low=ventral]' ParentColor = False end object Label4: TLabel Left = 14 Height = 14 Top = 135 Width = 55 Caption = 'Cutout Tint' ParentColor = False end object Label5: TLabel Left = 14 Height = 14 Top = 175 Width = 62 Caption = 'Cutout Color' ParentColor = False end object XLo: TSpinEdit Left = 118 Height = 21 Top = 0 Width = 82 MaxValue = 1000 OnChange = PreviewClick TabOrder = 0 end object XHi: TSpinEdit Left = 206 Height = 21 Top = 0 Width = 82 MaxValue = 1000 OnChange = PreviewClick TabOrder = 1 end object YLo: TSpinEdit Left = 118 Height = 21 Top = 40 Width = 82 MaxValue = 1000 OnChange = PreviewClick TabOrder = 2 end object YHi: TSpinEdit Left = 206 Height = 21 Top = 40 Width = 82 MaxValue = 1000 OnChange = PreviewClick TabOrder = 3 end object ZLo: TSpinEdit Left = 118 Height = 21 Top = 88 Width = 82 MaxValue = 1000 OnChange = PreviewClick TabOrder = 4 end object ZHi: TSpinEdit Left = 206 Height = 21 Top = 88 Width = 82 MaxValue = 1000 OnChange = PreviewClick TabOrder = 5 end object CutoutBiasDrop: TComboBox Left = 118 Height = 19 Top = 128 Width = 170 ItemHeight = 13 Items.Strings = ( '0.1 Dark' '0.2' '0.3' '0.4' '0.5' '0.6' '0.7' '0.8' '0.9 Light' ) OnChange = PreviewClick Style = csOwnerDrawFixed TabOrder = 6 end object CutoutLUTDrop: TComboBox Left = 118 Height = 19 Top = 168 Width = 170 ItemHeight = 13 OnChange = PreviewClick Style = csOwnerDrawFixed TabOrder = 7 end end object PreviewBtn: TButton Left = 128 Height = 25 Top = 304 Width = 75 Caption = 'Preview' OnClick = PreviewClick TabOrder = 2 Visible = False end object DefBtn: TButton Left = 128 Height = 25 Top = 272 Width = 75 Caption = 'Defaults' OnClick = DefBtnClick TabOrder = 3 end object OKBtn: TButton Left = 237 Height = 25 Top = 272 Width = 75 Caption = 'OK' OnClick = OKBtnClick TabOrder = 4 end object PreviewBtn1: TButton Left = 16 Height = 25 Top = 272 Width = 75 Caption = 'Preview' OnClick = PreviewBtn1Click TabOrder = 1 end end ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/cropedges.pas������������������������������������������������������0000664�0001750�0001750�00000013514�11450366124�020336� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit CropEdges; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, Spin, Buttons,nifti_img,define_types; type { TCropEdgeForm } TCropEdgeForm = class(TForm) ApplyBtn: TSpeedButton; CropFileSzBtn: TSpeedButton; CancelBtn: TSpeedButton; Timer1: TTimer; DEdit: TSpinEdit; PEdit: TSpinEdit; AEdit: TSpinEdit; VEdit: TSpinEdit; REdit: TSpinEdit; LEdit: TSpinEdit; procedure ApplyCrop; procedure ApplyCrop2Img; procedure ApplyBtnClick(Sender: TObject); procedure CancelBtnClick(Sender: TObject); procedure CropEditChange(Sender: TObject); procedure CropFileSzBtnClick(Sender: TObject); procedure FormHide(Sender: TObject); procedure FormShow(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { private declarations } public { public declarations } end; var CropEdgeForm: TCropEdgeForm; implementation uses nifti_img_view, crop; { TCropEdgeForm } procedure TCropEdgeForm.ApplyBtnClick(Sender: TObject); begin CropEdgeForm.ModalResult := mrOK; CropEdgeForm.close; end; procedure TCropEdgeForm.CancelBtnClick(Sender: TObject); begin CropEdgeForm.close; end; procedure TCropEdgeForm.CropEditChange(Sender: TObject); begin if not CropEdgeForm.visible then exit; Timer1.Enabled := true; end; procedure TCropEdgeForm.CropFileSzBtnClick(Sender: TObject); var lV,lD,lA,lP,lL,lR: integer; begin lV := VEdit.value; lD := DEdit.value; lL := LEdit.value; lR := REdit.value; lA := AEdit.value; lP := PEdit.value; CropNIfTI(lL,lR,lA,lP,lD,lV); end; procedure TCropEdgeForm.FormHide(Sender: TObject); begin UndoVolVOI; if not (CropEdgeForm.ModalResult = mrCancel) then ApplyCrop2Img else ImgForm.RefreshImagesTimer.Enabled := true; end; procedure TCropEdgeForm.FormShow(Sender: TObject); begin EnsureVOIOpen; CreateUndoVol; CropEdgeForm.ModalResult := mrCancel; CropEditChange(nil); end; procedure TCropEdgeForm.ApplyCrop2Img; var lZLo,lZHi,lXLo,lXHi,lYLo,lYHi,lPos,lX,lY,lZ: integer; l32Buf : SingleP; l16Buf : SmallIntP; begin if (gMRIcroOverlay[kBGOverlayNum].ImgBufferItems<1) then exit; if (gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]*gBGImg.ScrnDim[3]) <> gMRIcroOverlay[kBGOverlayNum].ImgBufferItems then begin Showmessage('Can not crop edges of a rotated image.'); exit; end; lXlo := round(LEdit.value); lXHi := gBGImg.ScrnDim[1] - round(REdit.value); lYlo := round(PEdit.value); lYHi := gBGImg.ScrnDim[2] - round(AEdit.value); lZLo := round(VEdit.value); lZHi := gBGImg.ScrnDim[3] - round(DEdit.value); lPos := 0; case gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP of 1: begin for lZ := 1 to gBGImg.ScrnDim[3] do for lY := 1 to gBGImg.ScrnDim[2] do for lX := 1 to gBGImg.ScrnDim[1] do begin inc(lPos); if (lZ >= lZHi) or (lZ <= lZLo) or(lY >= lYHi) or (lY <= lYLo) or (lX >= lXHi) or (lX <= lXLo) then gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[lPos] := 0; end; //for X end; 2: begin l16Buf := SmallIntP(gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); for lZ := 1 to gBGImg.ScrnDim[3] do for lY := 1 to gBGImg.ScrnDim[2] do for lX := 1 to gBGImg.ScrnDim[1] do begin inc(lPos); if (lZ >= lZHi) or (lZ <= lZLo) or(lY >= lYHi) or (lY <= lYLo) or (lX >= lXHi) or (lX <= lXLo) then l16Buf^[lPos] := 0; end; //for X end; 4: begin l32Buf := SingleP(gMRIcroOverlay[kBGOverlayNum].ImgBuffer ); for lZ := 1 to gBGImg.ScrnDim[3] do for lY := 1 to gBGImg.ScrnDim[2] do for lX := 1 to gBGImg.ScrnDim[1] do begin inc(lPos); if (lZ >= lZHi) or (lZ <= lZLo) or(lY >= lYHi) or (lY <= lYLo) or (lX >= lXHi) or (lX <= lXLo) then l32Buf^[lPos] := 0; end; //for X end; else begin showmessage('Unsupported data type'); end end; //case ImgForm.RescaleImagesTimer.Enabled := true; end; procedure TCropEdgeForm.ApplyCrop; var lZLo,lZHi,lXLo,lXHi,lYLo,lYHi,lPos,lX,lY,lZ: integer; begin if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems<1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems<>gBGImg.VOIUndoVolItems) then exit; if gBGImg.VOIUndoVolItems <> gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems then exit; if (gBGImg.ScrnDim[1]*gBGImg.ScrnDim[2]*gBGImg.ScrnDim[3]) <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems then exit; //CreateUndoVol; //Move(gBGImg.VOIUndoVol^,gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,gBGImg.VOIUndoVolItems); FillChar(gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,gBGImg.VOIUndoVolItems,0); lXlo := round(LEdit.value); lXHi := gBGImg.ScrnDim[1] - round(REdit.value); lYlo := round(PEdit.value); lYHi := gBGImg.ScrnDim[2] - round(AEdit.value); lZLo := round(VEdit.value); lZHi := gBGImg.ScrnDim[3] - round(DEdit.value); lPos := 0; for lZ := 1 to gBGImg.ScrnDim[3] do begin for lY := 1 to gBGImg.ScrnDim[2] do begin for lX := 1 to gBGImg.ScrnDim[1] do begin inc(lPos); if (lZ >= lZHi) or (lZ <= lZLo) or(lY >= lYHi) or (lY <= lYLo) or (lX >= lXHi) or (lX <= lXLo) then gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lPos] := kVOI8bit; end; //for X end; //for Y end; //for Z //gBGImg.VOIchanged := true; ImgForm.RefreshImagesTimer.enabled := true; end; procedure TCropEdgeForm.Timer1Timer(Sender: TObject); begin Timer1.Enabled := false; ApplyCrop; end; initialization {$I cropedges.lrs} end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/cropedges.lrs������������������������������������������������������0000664�0001750�0001750�00000004575�11450366124�020362� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ This is an automatically generated lazarus resource file } LazarusResources.Add('TCropEdgeForm','FORMDATA',[ 'TPF0'#13'TCropEdgeForm'#12'CropEdgeForm'#4'Left'#3'A'#1#6'Height'#3#139#0#3 +'Top'#3#20#1#5'Width'#3#142#1#13'ActiveControl'#7#5'DEdit'#11'BorderIcons'#11 +#12'biSystemMenu'#0#11'BorderStyle'#7#8'bsDialog'#7'Caption'#6#10'Crop Edges' +#12'ClientHeight'#3#139#0#11'ClientWidth'#3#142#1#21'Constraints.MaxHeight'#3 +'A'#1#20'Constraints.MaxWidth'#3#142#1#21'Constraints.MinHeight'#3'A'#1#20'C' +'onstraints.MinWidth'#3#142#1#6'OnHide'#7#8'FormHide'#6'OnShow'#7#8'FormShow' +#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29'#0#12'TSpeedButt' +'on'#9'CancelBtn'#4'Left'#3'@'#1#6'Height'#2#25#3'Top'#2'h'#5'Width'#2'A'#7 +'Caption'#6#6'Cancel'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClick'#7 +#14'CancelBtnClick'#0#0#12'TSpeedButton'#8'ApplyBtn'#4'Left'#3#0#1#6'Height' +#2#25#3'Top'#2'h'#5'Width'#2'A'#7'Caption'#6#5'Apply'#5'Color'#7#9'clBtnFace' +#9'NumGlyphs'#2#0#7'OnClick'#7#13'ApplyBtnClick'#0#0#12'TSpeedButton'#13'Cro' +'pFileSzBtn'#4'Left'#3#136#0#6'Height'#2#25#3'Top'#2'h'#5'Width'#2'i'#7'Capt' +'ion'#6#12'Save Cropped'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClick' +#7#18'CropFileSzBtnClick'#0#0#9'TSpinEdit'#5'DEdit'#4'Left'#2'9'#6'Height'#2 +#21#3'Top'#2#8#5'Width'#2'H'#8'MaxValue'#3#255#0#8'OnChange'#7#14'CropEditCh' +'ange'#8'TabOrder'#2#0#5'Value'#2#8#0#0#9'TSpinEdit'#5'PEdit'#4'Left'#2#8#6 +'Height'#2#21#3'Top'#2')'#5'Width'#2'H'#8'MaxValue'#3#255#0#8'OnChange'#7#14 +'CropEditChange'#8'TabOrder'#2#1#5'Value'#2#8#0#0#9'TSpinEdit'#5'AEdit'#4'Le' +'ft'#2'h'#6'Height'#2#21#3'Top'#2')'#5'Width'#2'H'#8'MaxValue'#3#255#0#8'OnC' +'hange'#7#14'CropEditChange'#8'TabOrder'#2#2#5'Value'#2#8#0#0#9'TSpinEdit'#5 +'VEdit'#4'Left'#2'9'#6'Height'#2#21#3'Top'#2'I'#5'Width'#2'H'#8'MaxValue'#3 +#255#0#8'OnChange'#7#14'CropEditChange'#8'TabOrder'#2#3#5'Value'#2#8#0#0#9'T' +'SpinEdit'#5'REdit'#4'Left'#3'7'#1#6'Height'#2#21#3'Top'#2')'#5'Width'#2'H'#8 +'MaxValue'#3#255#0#8'OnChange'#7#14'CropEditChange'#8'TabOrder'#2#4#5'Value' +#2#8#0#0#9'TSpinEdit'#5'LEdit'#4'Left'#3#224#0#6'Height'#2#21#3'Top'#2')'#5 +'Width'#2'H'#8'MaxValue'#3#255#0#8'OnChange'#7#14'CropEditChange'#8'TabOrder' +#2#5#5'Value'#2#8#0#0#6'TTimer'#6'Timer1'#7'Enabled'#8#8'Interval'#3#150#0#7 +'OnTimer'#7#11'Timer1Timer'#4'left'#3'H'#1#3'top'#2'H'#0#0#0 ]); �����������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/cropedges.lfm������������������������������������������������������0000664�0001750�0001750�00000004367�11450366124�020337� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object CropEdgeForm: TCropEdgeForm Left = 321 Height = 139 Top = 276 Width = 398 ActiveControl = DEdit BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Crop Edges' ClientHeight = 139 ClientWidth = 398 Constraints.MaxHeight = 321 Constraints.MaxWidth = 398 Constraints.MinHeight = 321 Constraints.MinWidth = 398 OnHide = FormHide OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.29' object CancelBtn: TSpeedButton Left = 320 Height = 25 Top = 104 Width = 65 Caption = 'Cancel' Color = clBtnFace NumGlyphs = 0 OnClick = CancelBtnClick end object ApplyBtn: TSpeedButton Left = 256 Height = 25 Top = 104 Width = 65 Caption = 'Apply' Color = clBtnFace NumGlyphs = 0 OnClick = ApplyBtnClick end object CropFileSzBtn: TSpeedButton Left = 136 Height = 25 Top = 104 Width = 105 Caption = 'Save Cropped' Color = clBtnFace NumGlyphs = 0 OnClick = CropFileSzBtnClick end object DEdit: TSpinEdit Left = 57 Height = 21 Top = 8 Width = 72 MaxValue = 255 OnChange = CropEditChange TabOrder = 0 Value = 8 end object PEdit: TSpinEdit Left = 8 Height = 21 Top = 41 Width = 72 MaxValue = 255 OnChange = CropEditChange TabOrder = 1 Value = 8 end object AEdit: TSpinEdit Left = 104 Height = 21 Top = 41 Width = 72 MaxValue = 255 OnChange = CropEditChange TabOrder = 2 Value = 8 end object VEdit: TSpinEdit Left = 57 Height = 21 Top = 73 Width = 72 MaxValue = 255 OnChange = CropEditChange TabOrder = 3 Value = 8 end object REdit: TSpinEdit Left = 311 Height = 21 Top = 41 Width = 72 MaxValue = 255 OnChange = CropEditChange TabOrder = 4 Value = 8 end object LEdit: TSpinEdit Left = 224 Height = 21 Top = 41 Width = 72 MaxValue = 255 OnChange = CropEditChange TabOrder = 5 Value = 8 end object Timer1: TTimer Enabled = False Interval = 150 OnTimer = Timer1Timer left = 328 top = 72 end end �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/crop.pas�����������������������������������������������������������0000664�0001750�0001750�00000017042�11326434462�017331� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit crop; interface function CropNIfTI(lL,lR,lA,lP,lD,lV: integer):boolean; implementation uses nifti_hdr, nifti_img,define_types, GraphicsMathLibrary,dialogs, nifti_img_view; procedure NIFTIhdr_SlicesToCoord (var lHdr: TNIFTIhdr; lXslice,lYslice,lZslice: integer; var lXmm,lYmm,lZmm: single); //ignores origin offset begin lXmm := (lHdr.srow_x[0]*lXslice)+ (lHdr.srow_x[1]*lYslice)+(lHdr.srow_x[2]*lzslice); lYmm := (lHdr.srow_y[0]*lXslice)+ (lHdr.srow_y[1]*lYslice)+(lHdr.srow_y[2]*lzslice); lZmm := (lHdr.srow_z[0]*lXslice)+ (lHdr.srow_z[1]*lYslice)+(lHdr.srow_z[2]*lzslice); end; function CropNIfTI(lL,lR,lA,lP,lD,lV: integer):boolean; //to do : data swapping (errors on detection and writing zero in reverse order) var lInHdr,lOutHdr: TNIFTIhdr; lOutname,lExt: string; lXmm,lYmm,lZmm: single; lMat: TMatrix; lOutPos,lSlice,lVol,lVolBytes,lImgSamples,lInc, lX,lY,lZ,lBPP, lB, lInZOffset,lInYOffset,lInSliceSz,lInXSz,lInPos,lImgOffset: integer; lBuffer: bytep; (*lSrcBuffer,lBuffer, lBuffUnaligned: bytep; l32Buf,lImgBuffer: singlep; l16Buf : SmallIntP; l32BufI : LongIntP;*) lWordX: Word; lSPM2: boolean; lOutF,lInF: File; lACrop,lPCrop,lDorsalCrop,lVentralCrop,lLCrop,lRCrop: integer; lByteSwap: boolean; begin result := false; if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1) or (gBGImg.ScrnDim[3] < 2) or (gBGImg.ScrnMM[3] = 0) then begin showmessage('Please load a 3D background image for neck removal.'); exit; end; if (gBGImg.Resliced) then begin showmessage('You must switch reslicing OFF (Help/Preferences) for image cropping.'); exit; end; lInHdr := gMRIcroOverlay[kBGOverlayNum].NIFTIHdr; //check orthogonal alignment.... if lInHdr.dim[4] > 1 then begin Showmessage('Only able to Crop 3D images (reorienting 4D could disrupt slice timing and diffusion directions.'); exit; end; //Next create reordered or trimmed image in the correct format case lInHdr.datatype of kDT_UNSIGNED_CHAR,kDT_SIGNED_SHORT,kDT_UINT16, kDT_SIGNED_INT,kDT_FLOAT:;//Supported else begin Showmessage('Crop 3D unsupported datatype.'); exit; end; end; //Msg('Cropping NIfTI/Analyze image '+lFileName); lOutHdr := lInHdr; lImgSamples := lInHdr.dim[1]*lInHdr.dim[2]*lInHdr.dim[3]; lBPP := (lInHdr.bitpix div 8); //bytes per pixel (*lVolBytes := lImgSamples*lBPP; //Msg('Automatically Cropping image'); lBuffer := (@lSrcBuffer^[lImgOffset+1]); GetMem(lBuffUnaligned ,(sizeof(single)*lImgSamples) + 16); {$IFDEF FPC} lImgBuffer := align(lBuffUnaligned,16); {$ELSE} lImgBuffer := SingleP($fffffff0 and (integer(lBuffUnaligned)+15)); {$ENDIF} case lInHdr.datatype of kDT_UNSIGNED_CHAR : begin //8 bit for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := lBuffer^[lInc]; end; kDT_SIGNED_SHORT{,kDT_UINT16}: begin //16-bit int l16Buf := SmallIntP(lBuffer ); if lByteSwap then begin for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := Swap(l16Buf^[lInc]); end else begin for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := l16Buf^[lInc]; end; end;//16bit kDT_SIGNED_INT: begin l32Buf := SingleP(lBuffer ); if lByteSwap then //unswap and convert integer to float for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := (Swap4r4i(l32Buf^[lInc])) else //convert integer to float for lInc := 1 to lImgSamples do lImgBuffer^[lInc] := Conv4r4i(l32Buf^[lInc]); end; //32-bit int kDT_FLOAT: begin l32Buf := SingleP(lBuffer); for lInc := 1 to lImgSamples do lImgBuffer[lInc] := l32Buf[lInc]; if lByteSwap then for lInc := 1 to lImgSamples do pswap4r(lImgBuffer^[lInc]); //faster as procedure than function see www.optimalcode.com for lInc := 1 to lImgSamples do if specialsingle(lImgBuffer^[lInc]) then lImgBuffer^[lInc] := 0.0; //invert= for lInc := 1 to lImgSamples do l32Buf[lInc] := -l32Buf[lInc]; end; //32-bit float else begin Showmessage('Serious error: format not supported by Crop3D.'); exit; end; end; //case *) lDorsalCrop := lD; lVentralCrop := lV; lLCrop := lL; lRCrop := lR; lACrop := lA; lPCrop := lP; //FreeMem(lBuffUnaligned); if (lDorsalCrop = 0) and (lVentralCrop = 0) and (lLCrop = 0) and (lRCrop = 0) and (lACrop = 0) and (lPCrop = 0) then begin Showmessage('Crop 3D quitting: no need to delete slices.'); //Freemem(lSrcBuffer); end; if (lDorsalCrop < 0) or (lVentralCrop < 0) or (lLCrop < 0) or (lRCrop < 0) or (lACrop < 0) or (lPCrop < 0) then begin Showmessage('Crop 3D quitting: negative values should be impossible.'); //Freemem(lSrcBuffer); end; //next compute size of cropped volume lOutHdr.Dim[1] := lInHdr.Dim[1]-lLCrop-lRCrop; lOutHdr.Dim[2] := lInHdr.Dim[2]-lACrop-lPCrop; lOutHdr.Dim[3] := lInHdr.Dim[3]-lDorsalCrop-lVentralCrop; lVolBytes := lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3]*lBPP; //next: readjust origin to take into account removed slices //REQUIRES images to be aligned to nearest orthogonal to canonical space [1 0 0; 0 1 0; 0 0 1] NIFTIhdr_SlicesToCoord (lInHdr,lLCrop,lPCrop,lVentralCrop, lXmm,lYmm,lZmm); lOutHdr.srow_x[3] := lInHdr.srow_x[3] + lXmm; lOutHdr.srow_y[3] := lInHdr.srow_y[3] + lYmm; lOutHdr.srow_z[3] := lInHdr.srow_z[3] + lZmm; lMat := Matrix3D ( lOutHdr.srow_x[0], lOutHdr.srow_x[1], lOutHdr.srow_x[2], lOutHdr.srow_x[3], lOutHdr.srow_y[0], lOutHdr.srow_y[1], lOutHdr.srow_y[2], lOutHdr.srow_y[3], lOutHdr.srow_z[0], lOutHdr.srow_z[1], lOutHdr.srow_z[2], lOutHdr.srow_z[3], 0, 0, 0, 1); nifti_mat44_to_quatern( lMat, lOutHdr.quatern_b,lOutHdr.quatern_c,lOutHdr.quatern_d, lOutHdr.qoffset_x,lOutHdr.qoffset_y,lOutHdr.qoffset_z, lXmm, lYmm, lZmm, lOutHdr.pixdim[0]{QFac}); //note we write and read to the same buffer - we will always SHRINK output //no need to byteswap data - we will save in the save format as stored lOutPos := 0; lInSliceSz := lInHdr.dim[1]*lInHdr.dim[2]*lBPP; lInXSz := lInHdr.dim[1]*lBPP; GetMem(lBuffer,lVolBytes); //Move(gMRIcroOverlay[kBGOverlayNum].ImgBuffer^,lTempBuf^,gBGImg.VOIUndoVolItems); for lZ := 1 to lOutHdr.dim[3] do begin lInZOffset := (lVentralCrop+lZ-1) * lInSliceSz; for lY := 1 to lOutHdr.dim[2] do begin lInYOffset := ((lPCrop+lY-1) * lInXSz) + lInZOffset + (lLCrop*lBPP); for lX := 1 to lOutHdr.dim[1] do begin for lB := 1 to lBPP do begin inc(lOutPos); lInPos := ((lX-1) * lBPP) + lInYOffset + lB; lBuffer^[lOutPos] := gMRIcroOverlay[kBGOverlayNum].ImgBuffer^[lInPos]; end; end; end; //for Y end; //for Z lOutname := ChangeFilePrefix (gMRIcroOverlay[kBGOverlayNum].HdrFileName,'c'); //result := SaveNIfTICore (lOutName, lSrcBuffer, kNIIImgOffset+1, lOutHdr, lPrefs,lByteSwap); SaveAsVOIorNIFTI (lBuffer,lOutHdr.dim[1]*lOutHdr.dim[2]*lOutHdr.dim[3], lBPP,1, false, lOutHdr, lOutname); result := true; Freemem(lBuffer); end; end.����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/������������������������������������������������������������0000775�0001750�0001750�00000000000�11754254530�017146� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/userdir.pas�������������������������������������������������0000664�0001750�0001750�00000014152�11326434462�021332� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit userdir; //returns directory where user has read/write permissions... {$IFDEF FPC} {$mode delphi}{$H+} {$ENDIF} interface //returns number of cores: a computer with two dual cores will report 4 function IniName: string; function DefaultsDir (lSubFolder: string): string; function UserDataFolder: string; //uses shlobj implementation {$Include isgui.inc} {$IFDEF UNIX} uses Process, SysUtils,classes,IniFiles, {$IFDEF GUI}dialogs;{$ELSE} dialogsx;{$ENDIF} function UserDataFolder: string; begin result :=expandfilename('~/'); end; function FileNameNoExt (lFilewExt:String): string; //remove final extension var lLen,lInc: integer; lName: String; begin lName := ''; lLen := length(lFilewExt); lInc := lLen+1; if lLen > 0 then begin repeat dec(lInc); until (lFileWExt[lInc] = '.') or (lInc = 1); end; if lInc > 1 then for lLen := 1 to (lInc - 1) do lName := lName + lFileWExt[lLen] else lName := lFilewExt; //no extension Result := lName; end; function DefaultsDir (lSubFolder: string): string; //for Linux: DefaultsDir is ~/appname/SubFolder/, e.g. /home/username/mricron/subfolder/ //Note: Final character is pathdelim const pathdelim = '/'; var lBaseDir: string; begin lBaseDir := GetEnvironmentVariable ('HOME')+pathdelim+'.'+ FileNameNoExt(ExtractFilename(paramstr(0) ) ); if not DirectoryExists(lBaseDir) then begin {$I-} MkDir(lBaseDir); if IOResult <> 0 then begin //Msg('Unable to create new folder '+lBaseDir); end; {$I+} end; lBaseDir := lBaseDir+pathdelim; if lSubFolder <> '' then begin lBaseDir := lBaseDir + lSubFolder; if not DirectoryExists(lBaseDir) then begin {$I-} MkDir(lBaseDir); if IOResult <> 0 then begin //you may want to show an error, e.g. showmessage('Unable to create new folder '+lBaseDir); exit; end; {$I+} end; result := lBaseDir + pathdelim; end else result := lBaseDir; end; function IniName: string; begin result := DefaultsDir('')+FileNameNoExt(extractfilename(paramstr(0)))+'.ini'; end; {$ELSE} //If UNIX ELSE NOT Unix uses SysUtils, Windows,shlobj; //for administrators, we can write to folder with executable, otherwise we will save data to the user's AppDataFolder function AppDataFolder: string; //uses shlobj {$IFDEF FPC} const CSIDL_APPDATA = 26; {$ENDIF} var Path : pchar; idList : PItemIDList; begin GetMem(Path, MAX_PATH); SHGetSpecialFolderLocation(0, CSIDL_APPDATA , idList); SHGetPathFromIDList(idList, Path); Result := string(Path); FreeMem(Path); end; function UserDataFolder: string; //uses shlobj var PIDL : PItemIDList; Folder : array[0..MAX_PATH] of Char; const CSIDL_PERSONAL = $0005; begin SHGetSpecialFolderLocation(0, CSIDL_PERSONAL, PIDL); SHGetPathFromIDList(PIDL, Folder); result :=Folder; end; (*function UserDataFolder: string; //uses shlobj var Path : pchar; idList : PItemIDList; begin GetMem(Path, MAX_PATH); SHGetSpecialFolderLocation(0, csidl_Personal , idList); SHGetPathFromIDList(idList, Path); Result := string(Path); FreeMem(Path); end; *) function IsAdmin: Boolean; const SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)); SECURITY_BUILTIN_DOMAIN_RID = $00000020; DOMAIN_ALIAS_RID_ADMINS = $00000220; var hAccessToken: THandle; ptgGroups: PTokenGroups; dwInfoBufferSize: DWORD; psidAdministrators: PSID; x: Integer; bSuccess: BOOL; LastError: integer; begin if Win32Platform <> VER_PLATFORM_WIN32_NT then begin Result := True; exit; end; Result := False; bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken); if not bSuccess then begin if GetLastError = ERROR_NO_TOKEN then bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken); end; if bSuccess then begin GetMem(ptgGroups, 1024); {$IFDEF FPC} bSuccess := GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, 1024, @dwInfoBufferSize); {$ELSE} bSuccess := GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, 1024, dwInfoBufferSize); {$ENDIF} LastError := GetLastError; if not bSuccess then begin //you may want to show an error message.. //showmessage(format('GetLastError %d',[LastError])); end; CloseHandle(hAccessToken); if bSuccess then begin AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdministrators); {$R-} for x := 0 to ptgGroups.GroupCount - 1 do if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then begin Result := True; break; end; {$R+} FreeSid(psidAdministrators); end; FreeMem(ptgGroups); end; end; function IniName: string; //only administrators can write to c:\program files -use AppDataFolder for non-Administrators begin if isAdmin then result := changefileext(paramstr(0),'.ini') else result := AppDataFolder+'\'+changefileext(extractfilename(paramstr(0)),'.ini'); end; function DefaultsDir (lSubFolder: string): string; const pathdelim = '\'; //for Administrators: DefaultsDir is in the location of the executable, e.g. c:\program files\mricron\subfolder\ //for non-Administrators, the AppDataFolder is returned //Note: Final character is pathdelim begin result := extractfilepath(IniName); if length(result) < 1 then exit; if result[length(result)] <> pathdelim then result := result + pathdelim; if lSubFolder = '' then exit; result := result + lSubFolder; if result[length(result)] <> pathdelim then result := result + pathdelim; end; {$ENDIF} end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/notgui.inc��������������������������������������������������0000664�0001750�0001750�00000000157�11017217572�021146� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{$DEFINE notGUI} //use GUI if you are using a graphic user interface - anything else for console applications �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/nifti_hdr.pas�����������������������������������������������0000664�0001750�0001750�00000161120�11530735124�021615� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit nifti_hdr; interface {$H+} {$Include isgui.inc} uses {$IFNDEF FPC} DiskSpaceKludge,gziod, {$ELSE} gzio2, {$ENDIF} {$IFNDEF Unix} Windows, {$ENDIF} define_types,SysUtils,GraphicsMathLibrary, {$IFDEF GUI}dialogs;{$ELSE} dialogsx;{$ENDIF} type int64_t= int64; TNIFTIhdr2 = packed record //Next: analyze Format Header structure HdrSz : longint; //MUST BE 348 Data_Type: array [1..10] of char; //unused db_name: array [1..18] of char; //unused extents: longint; //unused session_error: smallint; //unused ` regular: char; ////unused: in Analyze 7.5 this must be 114 dim_info: byte; //MRI slice order dim: array[0..7] of int64_t; //Data array dimensions intent_p1, intent_p2, intent_p3: single; intent_code: smallint; datatype: smallint; bitpix: smallint; slice_start: smallint; pixdim: array[0..7]of single; vox_offset: int64_t; scl_slope: single;//scaling slope scl_inter: single;//scaling intercept slice_end: smallint; slice_code: byte; //e.g. ascending xyzt_units: byte; //e.g. mm and sec cal_max,cal_min: single; //unused slice_duration: single; //time for one slice toffset: single; //time axis to shift glmax, glmin: longint; //UNUSED descrip: array[1..80] of char; aux_file: array[1..24] of char; qform_code, sform_code: smallint; quatern_b,quatern_c,quatern_d, qoffset_x,qoffset_y,qoffset_z: double; srow_x, srow_y,srow_z: array[0..3]of double; intent_name: array[1..16] of char; magic: longint; unused_str: array[1..4] of char; end; //TNIFTIhdr Header Structure TNIFTIhdr1 = packed record //Next: analyze Format Header structure HdrSz : longint; //MUST BE 348 Data_Type: array [1..10] of char; //unused db_name: array [1..18] of char; //unused extents: longint; //unused session_error: smallint; //unused ` regular: char; ////unused: in Analyze 7.5 this must be 114 dim_info: byte; //MRI slice order dim: array[0..7] of smallint; //Data array dimensions intent_p1, intent_p2, intent_p3: single; intent_code: smallint; datatype: smallint; bitpix: smallint; slice_start: smallint; pixdim: array[0..7]of single; vox_offset: single; scl_slope: single;//scaling slope scl_inter: single;//scaling intercept slice_end: smallint; slice_code: byte; //e.g. ascending xyzt_units: byte; //e.g. mm and sec cal_max,cal_min: single; //unused slice_duration: single; //time for one slice toffset: single; //time axis to shift glmax, glmin: longint; //UNUSED descrip: array[1..80] of char; aux_file: array[1..24] of char; qform_code, sform_code: smallint; quatern_b,quatern_c,quatern_d, qoffset_x,qoffset_y,qoffset_z: single; srow_x: array[0..3]of single; srow_y: array[0..3]of single; srow_z: array[0..3]of single; intent_name: array[1..16] of char; magic: longint; end; //TNIFTIhdr Header Structure TNIFTIhdr = TNIFTIhdr1; //Next: analyze Format Header structure TAnalyzeHdrSection = packed record //Next: analyze Format Header structure Pad: array [1..253] of byte; originator: array [1..5] of smallint; end;//TAnalyzeHdrSection Structure TMRIcroHdr = record //Next: analyze Format Header structure NIFTIhdr : TNIFTIhdr; AutoBalMinUnscaled,AutoBalMaxUnscaled ,WindowScaledMin,WindowScaledMax ,GlMinUnscaledS,GlMaxUnscaledS,Zero8Bit,Slope8bit: single; //brightness and contrast NIfTItransform,DiskDataNativeEndian,UsesCustomPalette,LutFromZero: boolean; HdrFileName,ImgFileName: string; NIFTIVersion,LUTindex,ScrnBufferItems,ImgBufferItems,RenderBufferItems,ImgBufferBPP,RenderDim,Index: longint; ImgBufferUnaligned: Pointer; //raw address of Image Buffer: address may not be aligned ScrnBuffer,ImgBuffer,RenderBuffer: Bytep; LUTinvisible: TRGBQuad;//DWord; LUT: array[0..255] of TRGBQuad; Mat: TMatrix; end; //TNIFTIhdr Header Structure const //DataTypes kDT_BINARY =1; // binary (1 bit/voxel) kDT_UNSIGNED_CHAR =2; // unsigned char (8 bits/voxel) kDT_SIGNED_SHORT =4; // signed short (16 bits/voxel) kDT_SIGNED_INT =8; // signed int (32 bits/voxel) kDT_FLOAT =16; // float (32 bits/voxel) kDT_COMPLEX =32; // complex (64 bits/voxel) kDT_DOUBLE =64; // double (64 bits/voxel) kDT_RGB =128; // RGB triple (24 bits/voxel) kDT_INT8 =256; // signed char (8 bits) kDT_UINT16 =512; // unsigned short (16 bits) kDT_UINT32 =768; // unsigned int (32 bits) kDT_INT64 =1024; // long long (64 bits) kDT_UINT64 =1280; // unsigned long long (64 bits) kDT_FLOAT128 =1536; // long double (128 bits) kDT_COMPLEX128 =1792; // double pair (128 bits) kDT_COMPLEX256 =2048; // long double pair (256 bits) // slice_code values kNIFTI_SLICE_SEQ_UNKNOWN = 0; kNIFTI_SLICE_SEQ_INC = 1; kNIFTI_SLICE_SEQ_DEC = 2; kNIFTI_SLICE_ALT_INC = 3; kNIFTI_SLICE_ALT_DEC = 4; //xyzt_units values: note 3bit space and 3bit time packed into single byte kNIFTI_UNITS_UNKNOWN = 0; kNIFTI_UNITS_METER = 1; kNIFTI_UNITS_MM = 2; kNIFTI_UNITS_MICRON = 3; kNIFTI_UNITS_SEC = 8; kNIFTI_UNITS_MSEC = 16; kNIFTI_UNITS_USEC = 24; kNIFTI_UNITS_HZ = 32; kNIFTI_UNITS_PPM = 40; //qform_code, sform_code values kNIFTI_XFORM_UNKNOWN = 0; kNIFTI_XFORM_SCANNER_ANAT = 1;//Scanner-based anatomical coordinates kNIFTI_XFORM_ALIGNED_ANAT = 2; //Coordinates aligned to another file e.g. EPI coregistered to T1 kNIFTI_XFORM_TALAIRACH = 3; //Talairach-Tournoux Atlas; (0,0,0)=AC, etc. kNIFTI_XFORM_MNI_152 = 4; //MNI 152 normalized coordinates //Magic values kNIFTI_MAGIC_SEPARATE_HDR = $0031696E;//$6E693100; kNIFTI_MAGIC_EMBEDDED_HDR = $00312B6E;//$6E2B3100; kNIFTI2_MAGIC_SEPARATE_HDR = $0032696E;//$6E693100; kNIFTI2_MAGIC_EMBEDDED_HDR = $00322B6E;//$6E2B3100; kNIFTI_MAGIC_DCM = $0044434D; //byte-swapped magic values kswapNIFTI_MAGIC_SEPARATE_HDR = $6E693100; kswapNIFTI_MAGIC_EMBEDDED_HDR = $6E2B3100; kswapNIFTI2_MAGIC_SEPARATE_HDR = $6E693200; kswapNIFTI2_MAGIC_EMBEDDED_HDR = $6E2B3200; //Statistics Intention kNIFTI_INTENT_NONE =0; kNIFTI_INTENT_CORREL =2; kNIFTI_INTENT_TTEST =3; kNIFTI_INTENT_FTEST =4; kNIFTI_INTENT_ZSCORE =5; kNIFTI_INTENT_CHISQ =6; kNIFTI_INTENT_BETA =7; kNIFTI_INTENT_BINOM =8; kNIFTI_INTENT_GAMMA =9; kNIFTI_INTENT_POISSON =10; kNIFTI_INTENT_NORMAL =11; kNIFTI_INTENT_FTEST_NONC =12; kNIFTI_INTENT_CHISQ_NONC =13; kNIFTI_INTENT_LOGISTIC =14; kNIFTI_INTENT_LAPLACE =15; kNIFTI_INTENT_UNIFORM =16; kNIFTI_INTENT_TTEST_NONC =17; kNIFTI_INTENT_WEIBULL =18; kNIFTI_INTENT_CHI =19; kNIFTI_INTENT_INVGAUSS =20; kNIFTI_INTENT_EXTVAL =21; kNIFTI_INTENT_PVAL =22; NIFTI_INTENT_LOGPVAL =23; NIFTI_INTENT_LOG10PVAL =24; kNIFTI_LAST_STATCODE = 24;//kNIFTI_INTENT_PVAL; kNIFTI_INTENT_ESTIMATE =1001; kNIFTI_FIRST_NONSTATCODE = kNIFTI_INTENT_ESTIMATE; kNIFTI_INTENT_LABEL =1002; kNIFTI_INTENT_NEURONAME =1003; kNIFTI_INTENT_GENMATRIX =1004; kNIFTI_INTENT_SYMMATRIX =1005; kNIFTI_INTENT_DISPVECT =1006; kNIFTI_INTENT_VECTOR =1007; kNIFTI_INTENT_POINTSET =1008; kNIFTI_INTENT_TRIANGLE =1009; kNIFTI_INTENT_QUATERNION =1010; function NII1_2_NII2 ( lS: TNIfTIHdr1; var lD: TNIfTIHdr2): boolean; function IsVOIROIExt (var lFName: string):boolean; function ComputeImageDataBytes (var lHdr: TMRIcroHdr): longint; //size of image data in bytes function ComputeImageDataBytes8bpp (var lHdr: TMRIcroHdr): longint; //size of image as 32-bit per voxel data in bytes function ComputeImageDataBytes32bpp (var lHdr: TMRIcroHdr): longint; //size of image as 32-bit per voxel data in bytes procedure NIFTIhdr_SwapBytes (var lAHdr: TNIFTIhdr); //Swap Byte order for the Analyze type procedure NIFTIhdr_ClearHdr (var lHdr: TMRIcroHdr); //set all values of header to something reasonable function NIFTIhdr_LoadHdr (var lFilename: string; var lHdr: TMRIcroHdr): boolean; function NIFTIhdr_SaveHdr (var lFilename: string; var lHdr: TMRIcroHdr; lAllowOverwrite: boolean): boolean; overload; function NIFTIhdr_SaveHdr (var lFilename: string; var lHdr: TNIFTIHdr; lAllowOverwrite,lSPM2: boolean): boolean; overload; procedure NIFTIhdr_SetIdentityMatrix (var lHdr: TMRIcroHdr); //create neutral rotation matrix function IsNIfTIHdrExt (var lFName: string):boolean; //1494 function IsNifTiMagic (var lHdr: TNIFTIhdr): boolean; //procedure NearestOrtho(var lHdr: TMRIcroHdr); //function nifti_mat44_orthog( lR :TMatrix; lImm,lJmm,lKmm: double): TMatrix; function CopyNiftiHdr (var lInHdr,lOutHdr: TNIFTIhdr): boolean; procedure WriteNiftiMatrix (var lHdr: TNIFTIhdr; m11,m12,m13,m14, m21,m22,m23,m24, m31,m32,m33,m34: Single); procedure nifti_mat44_to_quatern( lR :TMatrix; var qb, qc, qd, qx, qy, qz, dx, dy, dz, qfac : single); implementation uses dicomhdr;//2/2208 function CopyNiftiHdr (var lInHdr,lOutHdr: TNIFTIhdr): boolean; begin move(lInHdr,lOutHdr,sizeof(TNIFTIhdr)); result := true; end; procedure WriteNiftiMatrix (var lHdr: TNIFTIhdr; m11,m12,m13,m14, m21,m22,m23,m24, m31,m32,m33,m34: Single); begin with lHdr do begin srow_x[0] := m11; srow_x[1] := m12; srow_x[2] := m13; srow_x[3] := m14; srow_y[0] := m21; srow_y[1] := m22; srow_y[2] := m23; srow_y[3] := m24; srow_z[0] := m31; srow_z[1] := m32; srow_z[2] := m33; srow_z[3] := m34; end; //with lHdr end; function IsNifTi2Magic (var lHdr: TNIFTIhdr): boolean; begin if (lHdr.magic =kNIFTI2_MAGIC_SEPARATE_HDR) or (lHdr.Magic = kNIFTI2_MAGIC_EMBEDDED_HDR ) then result := true else result :=false; //analyze end; function IsNifTi1Magic (var lHdr: TNIFTIhdr): boolean; begin if (lHdr.magic =kNIFTI_MAGIC_SEPARATE_HDR) or (lHdr.Magic = kNIFTI_MAGIC_EMBEDDED_HDR ) then result := true else result :=false; //analyze end; function IsNifTiMagic (var lHdr: TNIFTIhdr): boolean; begin if (IsNifTi1Magic(lHdr)) or (IsNifTi2Magic(lHdr)) then result := true else result :=false; //analyze end; function IsNIfTIHdrExt (var lFName: string):boolean; var lExt: string; begin lExt := UpCaseExt(lFName); if (lExt='.NII') or (lExt = '.HDR') or (lExt = '.NII.GZ') or (lExt = '.VOI') then result := true else result := false; end; function IsVOIROIExt (var lFName: string):boolean; var lExt: string; begin lExt := UpCaseExt(lFName); if (lExt = '.VOI') or (lExt = '.ROI') then result := true else result := false; end; function ComputeImageDataBytes32bpp (var lHdr: TMRIcroHdr): integer; var lDim, lSzInBits : integer; begin result := 0; with lHdr.NIFTIhdr do begin if Dim[0] < 1 then begin ShowMessage('NIFTI format error: datasets must have at least one dimension (dim[0] < 1).'); exit; end; lSzInBits := 32; //bits per voxel for lDim := 1 to 3 {Dim[0]} do lSzInBits := lSzInBits * Dim[lDim]; end; //with niftihdr result := (lSzInBits + 7) div 8; //+7 to ensure binary data not clipped end; //func ComputeImageDataBytes32bpp function ComputeImageDataBytes8bpp (var lHdr: TMRIcroHdr): integer; var lDim, lSzInBits : integer; begin result := 0; with lHdr.NIFTIhdr do begin if Dim[0] < 1 then begin ShowMessage('NIFTI format error: datasets must have at least one dimension (dim[0] < 1).'); exit; end; lSzInBits := 8; //bits per voxel for lDim := 1 to 3 {Dim[0]} do lSzInBits := lSzInBits * Dim[lDim]; end; //with niftihdr result := (lSzInBits + 7) div 8; //+7 to ensure binary data not clipped end; //func ComputeImageDataBytes8bpp function ComputeImageDataBytes (var lHdr: TMRIcroHdr): integer; var lDim, lSzInBits : integer; begin result := 0; with lHdr.NIFTIhdr do begin if Dim[0] < 1 then begin ShowMessage('NIFTI format error: datasets must have at least one dimension (dim[0] < 1).'); exit; end; lSzInBits := bitpix; //bits per voxel //showmessage(inttostr(Dim[0])); for lDim := 1 to 3 {Dim[0]} do lSzInBits := lSzInBits * Dim[lDim]; end; //with niftihdr result := (lSzInBits + 7) div 8; //+7 to ensure binary data not clipped end; //func ComputeImageDataBytes function orthogonalMatrix(var lHdr: TMRIcroHdr): boolean; var lM: TMatrix; lRow,lCol,lN0: integer; begin result := false; lM := Matrix3D ( lHdr.NIFTIhdr.srow_x[0],lHdr.NIFTIhdr.srow_x[1],lHdr.NIFTIhdr.srow_x[2],lHdr.NIFTIhdr.srow_x[3], // 3D "graphics" matrix lHdr.NIFTIhdr.srow_y[0],lHdr.NIFTIhdr.srow_y[1],lHdr.NIFTIhdr.srow_y[2],lHdr.NIFTIhdr.srow_y[3], // 3D "graphics" matrix lHdr.NIFTIhdr.srow_z[0],lHdr.NIFTIhdr.srow_z[1],lHdr.NIFTIhdr.srow_z[2],lHdr.NIFTIhdr.srow_z[3], // 3D "graphics" matrix 0,0,0,1); for lRow := 1 to 3 do begin lN0 := 0; for lCol := 1 to 3 do if lM.matrix[lRow,lCol] = 0 then inc(lN0); if lN0 <> 2 then exit; //exactly two values are zero end; for lCol := 1 to 3 do begin lN0 := 0; for lRow := 1 to 3 do if lM.matrix[lRow,lCol] = 0 then inc(lN0); if lN0 <> 2 then exit; //exactly two values are zero end; result := true; end; function EmptyRow (lRow: integer; var lM: TMatrix): boolean; begin //fx(lM.matrix[lRow,1],lM.matrix[lRow,2],lM.matrix[lRow,3]); if (abs(lM.matrix[lRow,1]) < 0.00000001) and (abs(lM.matrix[lRow,2]) < 0.00000001) and (abs(lM.matrix[lRow,3]) < 0.00000001) then result := true else result := false; end; procedure ReportMatrix (lStr: string;lM:TMatrix); begin ShowMessage(lStr+kCR+ RealToStr(lM.matrix[1,1],6)+','+RealToStr(lM.matrix[1,2],6)+','+RealToStr(lM.matrix[1,3],6)+','+RealToStr(lM.matrix[1,4],6)+ kCR+RealToStr(lM.matrix[2,1],6)+','+RealToStr(lM.matrix[2,2],6)+','+RealToStr(lM.matrix[2,3],6)+','+RealToStr(lM.matrix[2,4],6)+ kCR+RealToStr(lM.matrix[3,1],6)+','+RealToStr(lM.matrix[3,2],6)+','+RealToStr(lM.matrix[3,3],6)+','+RealToStr(lM.matrix[3,4],6)+ kCR+RealToStr(lM.matrix[4,1],6)+','+RealToStr(lM.matrix[4,2],6)+','+RealToStr(lM.matrix[4,3],6)+','+RealToStr(lM.matrix[4,4],6)); end; function EmptyMatrix(var lHdr: TMRIcroHdr): boolean; var lM: TMatrix; lRow,lCol: integer; begin result := false; lM := Matrix3D ( lHdr.NIFTIhdr.srow_x[0],lHdr.NIFTIhdr.srow_x[1],lHdr.NIFTIhdr.srow_x[2],lHdr.NIFTIhdr.srow_x[3], // 3D "graphics" matrix lHdr.NIFTIhdr.srow_y[0],lHdr.NIFTIhdr.srow_y[1],lHdr.NIFTIhdr.srow_y[2],lHdr.NIFTIhdr.srow_y[3], // 3D "graphics" matrix lHdr.NIFTIhdr.srow_z[0],lHdr.NIFTIhdr.srow_z[1],lHdr.NIFTIhdr.srow_z[2],lHdr.NIFTIhdr.srow_z[3], // 3D "graphics" matrix 0,0,0,1); if EmptyRow(1,lM) or EmptyRow(2,lM) or EmptyRow(3,lM) then begin ReportMatrix('Matrix appears bogus',lm); end else begin for lRow := 1 to 3 do begin {3/2008} for lCol := 1 to 4 do begin if (lRow = lCol) then begin if lM.matrix[lRow,lCol] <> 1 then exit; end else begin if lM.matrix[lRow,lCol] <> 0 then exit; end// unity matrix does not count - mriconvert creates bogus [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0] end; //each col end;//each row end;//not bogus result := true; end; procedure FromMatrix (M: TMatrix; var m11,m12,m13, m21,m22,m23, m31,m32,m33: DOUBLE) ; BEGIN m11 := M.Matrix[1,1]; m12 := M.Matrix[1,2]; m13 := M.Matrix[1,3]; m21 := M.Matrix[2,1]; m22 := M.Matrix[2,2]; m23 := M.Matrix[2,3]; m31 := M.Matrix[3,1]; m32 := M.Matrix[3,2]; m33 := M.Matrix[3,3]; END {FromMatrix3D}; function nifti_mat33_determ( R: TMatrix ):double; begin result := r.matrix[1,1]*r.matrix[2,2]*r.matrix[3,3] -r.matrix[1,1]*r.matrix[3,2]*r.matrix[2,3] -r.matrix[2,1]*r.matrix[1,2]*r.matrix[3,3] +r.matrix[2,1]*r.matrix[3,2]*r.matrix[1,3] +r.matrix[3,1]*r.matrix[1,2]*r.matrix[2,3] -r.matrix[3,1]*r.matrix[2,2]*r.matrix[1,3] ; end; procedure FixCrapMat(var lMat: TMatrix); var lVec000,lVec100,lVec010,lVec001: TVector; begin lVec000 := Vector3D (0, 0, 0); lVec100 := Vector3D (1, 0, 0); lVec010 := Vector3D (0, 1, 0); lVec001 := Vector3D (0, 0, 1); lVec000 := Transform (lVec000, lMat); lVec100 := Transform (lVec100, lMat); lVec010 := Transform (lVec010, lMat); lVec001 := Transform (lVec001, lMat); if SameVec(lVec000,lVec100) or SameVec(lVec000,lVec010) or SameVec(lVec000,lVec001) then begin lMat := eye3D; ShowMessage('Warning: the transformation matrix is corrupt [some dimensions have zero size]'); end; end; function nifti_mat33_rownorm( A: TMatrix ): single; //* max row norm of 3x3 matrix */ var r1,r2,r3: single ; begin r1 := abs(A.matrix[1,1])+abs(A.matrix[1,2])+abs(A.matrix[1,3]) ; r2 := abs(A.matrix[2,1])+abs(A.matrix[2,2])+abs(A.matrix[2,3]) ; r3 := abs(A.matrix[3,1])+abs(A.matrix[3,2])+abs(A.matrix[3,3]) ; if( r1 < r2 ) then r1 := r2 ; if( r1 < r3 ) then r1 := r3 ; result := r1 ; end; function nifti_mat33_colnorm( A: TMatrix ): single; //* max column norm of 3x3 matrix */ var r1,r2,r3: single ; begin r1 := abs(A.matrix[1,1])+abs(A.matrix[2,1])+abs(A.matrix[3,1]) ; r2 := abs(A.matrix[1,2])+abs(A.matrix[2,2])+abs(A.matrix[3,2]) ; r3 := abs(A.matrix[1,3])+abs(A.matrix[2,3])+abs(A.matrix[3,3]) ; if( r1 < r2 ) then r1 := r2 ; if( r1 < r3 ) then r1 := r3 ; result := r1 ; end; function nifti_mat33_inverse( R: TMatrix ): TMatrix; //* inverse of 3x3 matrix */ var r11,r12,r13,r21,r22,r23,r31,r32,r33 , deti: double ; Q: TMatrix ; begin FromMatrix(R,r11,r12,r13,r21,r22,r23,r31,r32,r33); deti := r11*r22*r33-r11*r32*r23-r21*r12*r33 +r21*r32*r13+r31*r12*r23-r31*r22*r13 ; if( deti <> 0.0 ) then deti := 1.0 / deti ; Q.matrix[1,1] := deti*( r22*r33-r32*r23) ; Q.matrix[1,2] := deti*(-r12*r33+r32*r13) ; Q.matrix[1,3] := deti*( r12*r23-r22*r13) ; Q.matrix[2,1] := deti*(-r21*r33+r31*r23) ; Q.matrix[2,2] := deti*( r11*r33-r31*r13) ; Q.matrix[2,3] := deti*(-r11*r23+r21*r13) ; Q.matrix[3,1] := deti*( r21*r32-r31*r22) ; Q.matrix[3,2] := deti*(-r11*r32+r31*r12) ; Q.matrix[3,3] := deti*( r11*r22-r21*r12) ; result := Q; end; function nifti_mat33_polar( A: TMatrix ): TMatrix; var k:integer; X , Y , Z: TMatrix ; dif,alp,bet,gam,gmi : single; begin dif := 1; k := 0; X := A ; // force matrix to be nonsingular //reportmatrix('x',X); gam := nifti_mat33_determ(X) ; while( gam = 0.0 )do begin //perturb matrix gam := 0.00001 * ( 0.001 + nifti_mat33_rownorm(X) ) ; X.matrix[1,1] := X.matrix[1,1]+gam ; X.matrix[2,2] := X.matrix[2,2]+gam ; X.matrix[3,3] := X.matrix[3,3] +gam ; gam := nifti_mat33_determ(X) ; end; while true do begin Y := nifti_mat33_inverse(X) ; if( dif > 0.3 )then begin // far from convergence alp := sqrt( nifti_mat33_rownorm(X) * nifti_mat33_colnorm(X) ) ; bet := sqrt( nifti_mat33_rownorm(Y) * nifti_mat33_colnorm(Y) ) ; gam := sqrt( bet / alp ) ; gmi := 1.0 / gam ; end else begin gam := 1.0; gmi := 1.0 ; //close to convergence end; Z.matrix[1,1] := 0.5 * ( gam*X.matrix[1,1] + gmi*Y.matrix[1,1] ) ; Z.matrix[1,2] := 0.5 * ( gam*X.matrix[1,2] + gmi*Y.matrix[2,1] ) ; Z.matrix[1,3] := 0.5 * ( gam*X.matrix[1,3] + gmi*Y.matrix[3,1] ) ; Z.matrix[2,1] := 0.5 * ( gam*X.matrix[2,1] + gmi*Y.matrix[1,2] ) ; Z.matrix[2,2] := 0.5 * ( gam*X.matrix[2,2] + gmi*Y.matrix[2,2] ) ; Z.matrix[2,3] := 0.5 * ( gam*X.matrix[2,3] + gmi*Y.matrix[3,2] ) ; Z.matrix[3,1] := 0.5 * ( gam*X.matrix[3,1] + gmi*Y.matrix[1,3] ) ; Z.matrix[3,2] := 0.5 * ( gam*X.matrix[3,2] + gmi*Y.matrix[2,3] ) ; Z.matrix[3,3] := 0.5 * ( gam*X.matrix[3,3] + gmi*Y.matrix[3,3] ) ; dif := abs(Z.matrix[1,1]-X.matrix[1,1])+abs(Z.matrix[1,2]-X.matrix[1,2]) +abs(Z.matrix[1,3]-X.matrix[1,3])+abs(Z.matrix[2,1]-X.matrix[2,1]) +abs(Z.matrix[2,2]-X.matrix[2,2])+abs(Z.matrix[2,3]-X.matrix[2,3]) +abs(Z.matrix[3,1]-X.matrix[3,1])+abs(Z.matrix[3,2]-X.matrix[3,2]) +abs(Z.matrix[3,3]-X.matrix[3,3]) ; k := k+1 ; if( k > 100) or (dif < 3.e-6 ) then begin result := Z; break ; //convergence or exhaustion end; X := Z ; end; result := Z ; end; procedure nifti_mat44_to_quatern( lR :TMatrix; var qb, qc, qd, qx, qy, qz, dx, dy, dz, qfac : single); var r11,r12,r13 , r21,r22,r23 , r31,r32,r33, xd,yd,zd , a,b,c,d : double; P,Q: TMatrix; //3x3 begin (* offset outputs are read write out of input matrix *) qx := lR.matrix[1,4]; qy := lR.matrix[2,4]; qz := lR.matrix[3,4]; (* load 3x3 matrix into local variables *) FromMatrix(lR,r11,r12,r13,r21,r22,r23,r31,r32,r33); (* compute lengths of each column; these determine grid spacings *) xd := sqrt( r11*r11 + r21*r21 + r31*r31 ) ; yd := sqrt( r12*r12 + r22*r22 + r32*r32 ) ; zd := sqrt( r13*r13 + r23*r23 + r33*r33 ) ; (* if a column length is zero, patch the trouble *) if( xd = 0.0 )then begin r11 := 1.0 ; r21 := 0; r31 := 0.0 ; xd := 1.0 ; end; if( yd = 0.0 )then begin r22 := 1.0 ; r12 := 0; r32 := 0.0 ; yd := 1.0 ; end; if( zd = 0.0 )then begin r33 := 1.0 ; r13 := 0; r23 := 0.0 ; zd := 1.0 ; end; (* assign the output lengths *) dx := xd; dy := yd; dz := zd; (* normalize the columns *) r11 := r11/xd ; r21 := r21/xd ; r31 := r31/xd ; r12 := r12/yd ; r22 := r22/yd ; r32 := r32/yd ; r13 := r13/zd ; r23 := r23/zd ; r33 := r33/zd ; (* At this point, the matrix has normal columns, but we have to allow for the fact that the hideous user may not have given us a matrix with orthogonal columns. So, now find the orthogonal matrix closest to the current matrix. One reason for using the polar decomposition to get this orthogonal matrix, rather than just directly orthogonalizing the columns, is so that inputting the inverse matrix to R will result in the inverse orthogonal matrix at this point. If we just orthogonalized the columns, this wouldn't necessarily hold. *) Q := Matrix2D (r11,r12,r13, // 2D "graphics" matrix r21,r22,r23, r31,r32,r33); P := nifti_mat33_polar(Q) ; (* P is orthog matrix closest to Q *) FromMatrix(P,r11,r12,r13,r21,r22,r23,r31,r32,r33); //ReportMatrix('xxx',Q); //ReportMatrix('svd',P); (* [ r11 r12 r13 ] *) (* at this point, the matrix [ r21 r22 r23 ] is orthogonal *) (* [ r31 r32 r33 ] *) (* compute the determinant to determine if it is proper *) zd := r11*r22*r33-r11*r32*r23-r21*r12*r33 +r21*r32*r13+r31*r12*r23-r31*r22*r13 ; (* should be -1 or 1 *) if( zd > 0 )then begin (* proper *) qfac := 1.0 ; end else begin (* improper ==> flip 3rd column *) qfac := -1.0 ; r13 := -r13 ; r23 := -r23 ; r33 := -r33 ; end; (* now, compute quaternion parameters *) a := r11 + r22 + r33 + 1.0; if( a > 0.5 ) then begin (* simplest case *) a := 0.5 * sqrt(a) ; b := 0.25 * (r32-r23) / a ; c := 0.25 * (r13-r31) / a ; d := 0.25 * (r21-r12) / a ; end else begin (* trickier case *) xd := 1.0 + r11 - (r22+r33) ; (* 4*b*b *) yd := 1.0 + r22 - (r11+r33) ; (* 4*c*c *) zd := 1.0 + r33 - (r11+r22) ; (* 4*d*d *) if( xd > 1.0 ) then begin b := 0.5 * sqrt(xd) ; c := 0.25* (r12+r21) / b ; d := 0.25* (r13+r31) / b ; a := 0.25* (r32-r23) / b ; end else if( yd > 1.0 ) then begin c := 0.5 * sqrt(yd) ; b := 0.25* (r12+r21) / c ; d := 0.25* (r23+r32) / c ; a := 0.25* (r13-r31) / c ; end else begin d := 0.5 * sqrt(zd) ; b := 0.25* (r13+r31) / d ; c := 0.25* (r23+r32) / d ; a := 0.25* (r21-r12) / d ; end; if( a < 0.0 )then begin b:=-b ; c:=-c ; d:=-d; {a:=-a; this is not used} end; end; qb := b ; qc := c ; qd := d ; //fx(qb,qc,qd); end; procedure nifti_quatern_to_mat44( var lR :TMatrix; var qb, qc, qd, qx, qy, qz, dx, dy, dz, qfac : single); var a,b,c,d,xd,yd,zd: double; begin //a := qb; b := qb; c := qc; d := qd; //* last row is always [ 0 0 0 1 ] */ lR.matrix[4,1] := 0; lR.matrix[4,2] := 0; lR.matrix[4,3] := 0; lR.matrix[4,4] := 1; //* compute a parameter from b,c,d */ a := 1.0 - (b*b + c*c + d*d) ; if( a < 1.e-7 ) then begin//* special case */ a := 1.0 / sqrt(b*b+c*c+d*d) ; b := b*a ; c := c*a ; d := d*a ;//* normalize (b,c,d) vector */ a := 0.0 ;//* a = 0 ==> 180 degree rotation */ end else begin a := sqrt(a) ; //* angle = 2*arccos(a) */ end; //* load rotation matrix, including scaling factors for voxel sizes */ if dx > 0 then xd := dx else xd := 1; if dy > 0 then yd := dy else yd := 1; if dz > 0 then zd := dz else zd := 1; if( qfac < 0.0 ) then zd := -zd ;//* left handedness? */ lR.matrix[1,1]:= (a*a+b*b-c*c-d*d) * xd ; lR.matrix[1,2]:= 2.0 * (b*c-a*d ) * yd ; lR.matrix[1,3]:= 2.0 * (b*d+a*c ) * zd ; lR.matrix[2,1]:= 2.0 * (b*c+a*d ) * xd ; lR.matrix[2,2]:= (a*a+c*c-b*b-d*d) * yd ; lR.matrix[2,3]:= 2.0 * (c*d-a*b ) * zd ; lR.matrix[3,1]:= 2.0 * (b*d-a*c ) * xd ; lR.matrix[3,2]:= 2.0 * (c*d+a*b ) * yd ; lR.matrix[3,3]:= (a*a+d*d-c*c-b*b) * zd ; //* load offsets */ lR.matrix[1,4]:= qx ; lR.matrix[2,4]:= qy ; lR.matrix[3,4]:= qz ; end; function TryQuat2Matrix( var lHdr: TNIfTIHdr ): boolean; var lR :TMatrix; begin result := false; if (lHdr.qform_code <= kNIFTI_XFORM_UNKNOWN) or (lHdr.qform_code > kNIFTI_XFORM_MNI_152) then exit; result := true; nifti_quatern_to_mat44(lR,lHdr.quatern_b,lHdr.quatern_c,lHdr.quatern_d, lHdr.qoffset_x,lHdr.qoffset_y,lHdr.qoffset_z, lHdr.pixdim[1],lHdr.pixdim[2],lHdr.pixdim[3], lHdr.pixdim[0]); lHdr.srow_x[0] := lR.matrix[1,1]; lHdr.srow_x[1] := lR.matrix[1,2]; lHdr.srow_x[2] := lR.matrix[1,3]; lHdr.srow_x[3] := lR.matrix[1,4]; lHdr.srow_y[0] := lR.matrix[2,1]; lHdr.srow_y[1] := lR.matrix[2,2]; lHdr.srow_y[2] := lR.matrix[2,3]; lHdr.srow_y[3] := lR.matrix[2,4]; lHdr.srow_z[0] := lR.matrix[3,1]; lHdr.srow_z[1] := lR.matrix[3,2]; lHdr.srow_z[2] := lR.matrix[3,3]; lHdr.srow_z[3] := lR.matrix[3,4]; lHdr.sform_code := 1; end; {procedure ReportMatrix (lM:TMatrix); var lStr: string; begin lStr := ( RealToStr(lM.matrix[1,1],6)+','+RealToStr(lM.matrix[1,2],6)+','+RealToStr(lM.matrix[1,3],6)+','+RealToStr(lM.matrix[1,4],6)) +kCR+( RealToStr(lM.matrix[2,1],6)+','+RealToStr(lM.matrix[2,2],6)+','+RealToStr(lM.matrix[2,3],6)+','+RealToStr(lM.matrix[2,4],6)) +kCR+( RealToStr(lM.matrix[3,1],6)+','+RealToStr(lM.matrix[3,2],6)+','+RealToStr(lM.matrix[3,3],6)+','+RealToStr(lM.matrix[3,4],6)) +kCR+( RealToStr(lM.matrix[4,1],6)+','+RealToStr(lM.matrix[4,2],6)+','+RealToStr(lM.matrix[4,3],6)+','+RealToStr(lM.matrix[4,4],6)); showmessage(lStr); end; } function FixDataType (var lHdr: TMRIcroHdr {; lCompress: boolean}): boolean; //correct mistakes of datatype and bitpix - especially for software which only sets one label 191; var ldatatypebpp,lbitpix: integer; begin result := true; lbitpix := lHdr.NIFTIhdr.bitpix; case lHdr.NIFTIhdr.datatype of kDT_BINARY : ldatatypebpp := 1; kDT_UNSIGNED_CHAR : ldatatypebpp := 8; // unsigned char (8 bits/voxel) kDT_SIGNED_SHORT : ldatatypebpp := 8; // signed short (16 bits/voxel) kDT_SIGNED_INT : ldatatypebpp := 32; // signed int (32 bits/voxel) kDT_FLOAT : ldatatypebpp := 32; // float (32 bits/voxel) kDT_COMPLEX : ldatatypebpp := 64; // complex (64 bits/voxel) kDT_DOUBLE : ldatatypebpp := 64; // double (64 bits/voxel) kDT_RGB : ldatatypebpp := 24; // RGB triple (24 bits/voxel) kDT_INT8 : ldatatypebpp := 8; // signed char (8 bits) kDT_UINT16 : ldatatypebpp := 16; // unsigned short (16 bits) kDT_UINT32 : ldatatypebpp := 32; // unsigned int (32 bits) kDT_INT64 : ldatatypebpp := 64; // long long (64 bits) kDT_UINT64 : ldatatypebpp := 64; // unsigned long long (64 bits) kDT_FLOAT128 : ldatatypebpp := 128; // long double (128 bits) kDT_COMPLEX128 : ldatatypebpp := 128; // double pair (128 bits) kDT_COMPLEX256 : ldatatypebpp := 256; // long double pair (256 bits) else ldatatypebpp := 0; end; if (ldatatypebpp = lHdr.NIFTIhdr.bitpix) and (ldatatypebpp <> 0) then exit; if (lbitpix = 0) and (ldatatypebpp <> 0) then begin //use bitpix from datatype... lHdr.NIFTIhdr.bitpix := ldatatypebpp; exit; end; if (lbitpix <> 0) and (ldatatypebpp = 0) then begin //assume bitpix is correct.... //note that several datatypes correspond to each bitpix, so assume most popular... case lbitpix of 1: lHdr.NIFTIhdr.datatype := kDT_BINARY; 8: lHdr.NIFTIhdr.datatype := kDT_UNSIGNED_CHAR; 16: lHdr.NIFTIhdr.datatype := kDT_SIGNED_SHORT; 24: lHdr.NIFTIhdr.datatype := kDT_RGB; 32: lHdr.NIFTIhdr.datatype := kDT_FLOAT; 64: lHdr.NIFTIhdr.datatype := kDT_DOUBLE; else goto 191; //impossible bitpix end; exit; end; 191: //Both bitpix and datatype are wrong... assume most popular format lHdr.NIFTIhdr.bitpix := 16; lHdr.NIFTIhdr.datatype := kDT_SIGNED_SHORT; //fx(lHdr.NIFTIhdr.bitpix, lHdr.NIFTIhdr.datatype); end; function NII1_2_NII2 ( lS: TNIfTIHdr1; var lD: TNIfTIHdr2): boolean; var i: integer; begin with lD do begin HdrSz := sizeof(TNIfTIHdr2);//B.HdrSz; for i := 1 to 10 do Data_Type[i]:= lS.Data_Type[i]; //unused for i := 1 to 18 do db_name[i]:= lS.db_name[i]; //unused extents:= lS.extents; session_error:= lS.session_error; regular:= lS.regular; ////unused: in Analyze 7.5 this must be 114 dim_info:= lS.dim_info; //MRI slice order for i := 0 to 7 do dim[i]:= lS.dim[i]; intent_p1:= lS.intent_p1; intent_p2:= lS.intent_p2; intent_p3:= lS.intent_p3; intent_code:= lS.intent_code; datatype:= lS.datatype; bitpix:= lS.bitpix; slice_start:= lS.slice_start; for i := 0 to 7 do pixdim[i] := lS.pixdim[i]; vox_offset:= round(lS.vox_offset); scl_slope:= lS.scl_slope; scl_inter:= lS.scl_inter; slice_end:= lS.slice_end; slice_code:= lS.slice_code; xyzt_units:= lS.xyzt_units; cal_max:=lS.cal_max; cal_min:=lS.cal_min; slice_duration:=lS.slice_duration; toffset:=lS.toffset; glmax:=lS.glmax; glmin:=lS.glmin; for i := 1 to 80 do descrip[i]:= lS.descrip[i]; for i := 1 to 24 do aux_file[i]:= lS.aux_file[i]; qform_code:=lS.qform_code; sform_code:=lS.sform_code; quatern_b:=lS.quatern_b; quatern_c:=lS.quatern_c; quatern_d:=lS.quatern_d; qoffset_x:=lS.qoffset_x; qoffset_y:=lS.qoffset_y; qoffset_z:=lS.qoffset_z; for i := 0 to 3 do begin srow_x[i]:= lS.srow_x[i]; srow_y[i]:= lS.srow_y[i]; srow_z[i]:= lS.srow_z[i]; end; for i := 1 to 16 do intent_name[i]:=lS.intent_name[i]; magic:=lS.magic; result := true; //unused_str:='NA '; end; //with A end; function NII2_2_NII1 ( lS: TNIfTIHdr2; var lD: TNIfTIHdr1): boolean; var i: integer; begin result := true; with lD do begin HdrSz := 348;//B.HdrSz; for i := 1 to 10 do Data_Type[i]:= lS.Data_Type[i]; //unused for i := 1 to 18 do db_name[i]:= lS.db_name[i]; //unused extents:= lS.extents; session_error:= lS.session_error; regular:= lS.regular; ////unused: in Analyze 7.5 this must be 114 dim_info:= lS.dim_info; //MRI slice order for i := 0 to 7 do begin if lS.dim[i] > 32767 then begin Showmessage('Error, NIfTI2 format image dimensions too large to be stored as a NIfTI1 image.'); result := false; end; dim[i]:= lS.dim[i]; end; intent_p1:= lS.intent_p1; intent_p2:= lS.intent_p2; intent_p3:= lS.intent_p3; intent_code:= lS.intent_code; datatype:= lS.datatype; bitpix:= lS.bitpix; slice_start:= lS.slice_start; for i := 0 to 7 do pixdim[i] := lS.pixdim[i]; vox_offset:= lS.vox_offset; scl_slope:= lS.scl_slope; scl_inter:= lS.scl_inter; slice_end:= lS.slice_end; slice_code:= lS.slice_code; xyzt_units:= lS.xyzt_units; cal_max:=lS.cal_max; cal_min:=lS.cal_min; slice_duration:=lS.slice_duration; toffset:=lS.toffset; glmax:=lS.glmax; glmin:=lS.glmin; for i := 1 to 80 do descrip[i]:= lS.descrip[i]; for i := 1 to 24 do aux_file[i]:= lS.aux_file[i]; qform_code:=lS.qform_code; sform_code:=lS.sform_code; quatern_b:=lS.quatern_b; quatern_c:=lS.quatern_c; quatern_d:=lS.quatern_d; qoffset_x:=lS.qoffset_x; qoffset_y:=lS.qoffset_y; qoffset_z:=lS.qoffset_z; for i := 0 to 3 do begin srow_x[i]:= lS.srow_x[i]; srow_y[i]:= lS.srow_y[i]; srow_z[i]:= lS.srow_z[i]; end; for i := 1 to 16 do intent_name[i]:=lS.intent_name[i]; magic:=lS.magic; //unused_str:='NA '; end; //with A end; function NIFTIhdr_LoadHdr (var lFilename: string; var lHdr: TMRIcroHdr): boolean; var lHdrFile: file; lOri: array [1..3] of single; lBuff: Bytep; lAHdr: TAnalyzeHdrSection; lHdr2: TNIfTIHdr2; lCompress: boolean; lReportedSz, lSwappedReportedSz,lHdrSz2,lHdrSz1,lFileSz: Longint; lExt: string; //1494 begin Result := false; //assume error if lFilename = '' then exit; lExt := UpCaseExt(lFilename); if lExt = '.IMG' then lFilename := changeFileExt(lFilename,'.hdr'); if (lExt = '.NII.GZ') or (lExt = '.VOI') then lCompress := true else lCompress := false; lHdrSz1 := sizeof(TniftiHdr1); lHdrSz2 := sizeof(TniftiHdr2); lFileSz := FSize (lFilename); if lFileSz = 0 then begin ShowMessage('Unable to find NIFTI header named '+lFilename); exit; end; if (lFileSz < lHdrSz1) and (not lCompress) then begin ShowMessage('Error in reading NIFTI header: NIfTI headers need to be at least '+inttostr(lHdrSz1)+ ' bytes: '+lFilename); exit; end; FileMode := 0; { Set file access to read only } if lCompress then begin//1388 lBuff := @lHdr; UnGZip(lFileName,lBuff,0,lHdrSz1); //1388 end else begin //if gzip {$I-} AssignFile(lHdrFile, lFileName); FileMode := 0; { Set file access to read only } Reset(lHdrFile, 1); {$I+} if ioresult <> 0 then begin ShowMessage('Error in reading NIFTI header.'+inttostr(IOResult)); FileMode := 2; exit; end; BlockRead(lHdrFile, lHdr, lHdrSz1); CloseFile(lHdrFile); end; FileMode := 2; if (IOResult <> 0) then exit; lReportedSz := lHdr.niftiHdr.HdrSz; lSwappedReportedSz := lReportedSz; swap4(lSwappedReportedSz); lHdr.NIFTIVersion := 1; if lReportedSz = lHdrSz1 then begin lHdr.DiskDataNativeEndian := true; end else if lSwappedReportedSz = lHdrSz1 then begin lHdr.DiskDataNativeEndian := false; NIFTIhdr_SwapBytes (lHdr.niftiHdr); end else if (lSwappedReportedSz = lHdrSz2) or (lReportedSz = lHdrSz2) then begin //reload header...nifti version 2 FileMode := 0; { Set file access to read only } if lCompress then begin//1388 lBuff := @lHdr2; UnGZip(lFileName,lBuff,0,lHdrSz2); //1388 end else begin //if gzip {$I-} AssignFile(lHdrFile, lFileName); FileMode := 0; { Set file access to read only } Reset(lHdrFile, 1); {$I+} if ioresult <> 0 then begin ShowMessage('Error in reading NIFTI header.'+inttostr(IOResult)); FileMode := 2; exit; end; BlockRead(lHdrFile, lHdr2, lHdrSz2); CloseFile(lHdrFile); end; FileMode := 2; lHdr.NIFTIVersion := 2; if not NII2_2_NII1(lHdr2,lHdr.NiftiHdr) then begin ShowMessage('Warning: compatibility with this version of NIfTI has not been tested.'); end; end else begin result := NIFTIhdr_LoadDCM (lFilename,lHdr); //2/2008 if not result then ShowMessage('Warning: the header file is not in NIfTi format [the first 4 bytes do not have the value 348]. Assuming big-endian data.'); exit; end; if (lHdr.NIFTIhdr.dim[0] > 7) or (lHdr.NIFTIhdr.dim[0] < 1) then begin //only 1..7 dims, so this ShowMessage('Illegal NIfTI Format Header: this header does not specify 1..7 dimensions.'); exit; end; FixDataType(lHdr); result := true; //tx('nHdr',lHdr.NIFTIhdr.srow_x[3]); lHdr.HdrFileName:= lFilename; if ((lHdr.niftiHdr.magic = kNIFTI_MAGIC_EMBEDDED_HDR) and (lFileSz > lHdrSz1)) or ((lHdr.niftiHdr.magic = kNIFTI2_MAGIC_EMBEDDED_HDR) and (lFileSz > lHdrSz2)) or (lExt = '.NII.GZ') or (lExt = '.VOI') or (lExt = '.NII'){1494} then lHdr.ImgFileName:= lFilename else lHdr.ImgFileName:= changefileext(lFilename,'.img'); if IsNifTiMagic(lHdr.niftiHdr) then begin //must match MAGMA in nifti_img lOri[1] := (lHdr.NIFTIhdr.dim[1]+1) div 2; lOri[2] := (lHdr.NIFTIhdr.dim[2]+1) div 2; lOri[3] := (lHdr.NIFTIhdr.dim[3]+1) div 2; //TryQuat2Matrix(lHdr.NiftiHdr); if (lHdr.NIFTIhdr.sform_code <= kNIFTI_XFORM_UNKNOWN) or (lHdr.NIFTIhdr.sform_code > kNIFTI_XFORM_MNI_152) then TryQuat2Matrix(lHdr.NiftiHdr); if emptymatrix(lHdr) then begin (*if HasQuat(lHdr.NiftiHdr) then //HasQuat will specify else*) begin lHdr.NIFTIhdr.srow_x[0] := lHdr.NIFTIhdr.pixdim[1]; lHdr.NIFTIhdr.srow_x[1] := 0; lHdr.NIFTIhdr.srow_x[2] := 0; lHdr.NIFTIhdr.srow_y[0] := 0; lHdr.NIFTIhdr.srow_y[1] := lHdr.NIFTIhdr.pixdim[2]; lHdr.NIFTIhdr.srow_y[2] := 0; lHdr.NIFTIhdr.srow_z[0] := 0; lHdr.NIFTIhdr.srow_z[1] := 0; lHdr.NIFTIhdr.srow_z[2] := lHdr.NIFTIhdr.pixdim[3]; lHdr.NIFTIhdr.srow_x[3] := -round(lHdr.NIFTIhdr.dim[1]*lHdr.NIFTIhdr.pixdim[1]*0.5); lHdr.NIFTIhdr.srow_y[3] := -round(lHdr.NIFTIhdr.dim[2]*lHdr.NIFTIhdr.pixdim[2]*0.5); lHdr.NIFTIhdr.srow_z[3] := -round(lHdr.NIFTIhdr.dim[3]*lHdr.NIFTIhdr.pixdim[3]*0.5); lHdr.NIFTIhdr.sform_code := 1; end; end; if (lHdr.NIFTIhdr.srow_x[0] > 0) and (lHdr.NIFTIhdr.srow_y[1] > 0) and (lHdr.NIFTIhdr.srow_z[2] > 0) and (lHdr.NIFTIhdr.srow_x[3] > 0) and (lHdr.NIFTIhdr.srow_y[3] > 0) and (lHdr.NIFTIhdr.srow_z[3] > 0) then begin lHdr.NIFTIhdr.srow_x[3] := -lHdr.NIFTIhdr.srow_x[3]; lHdr.NIFTIhdr.srow_y[3] := -lHdr.NIFTIhdr.srow_y[3]; lHdr.NIFTIhdr.srow_z[3] := -lHdr.NIFTIhdr.srow_z[3]; lHdr.NIFTIhdr.sform_code := 1; end; //added 4Mar2006 -> corrects for improperly signed offset values... lHdr.NIfTItransform := true;//NIfTI 12/2010 end else begin //not NIFT: Analyze lHdr.NIfTItransform := false;//Analyze if not lHdr.DiskDataNativeEndian then begin NIFTIhdr_SwapBytes (lHdr.niftiHdr); move(lHdr.niftiHdr,lAHdr,sizeof(lAHdr)); NIFTIhdr_SwapBytes (lHdr.niftiHdr); lAHdr.Originator[1] := swap(lAHdr.Originator[1]); lAHdr.Originator[2] := swap(lAHdr.Originator[2]); lAHdr.Originator[3] := swap(lAHdr.Originator[3]); end else move(lHdr.niftiHdr,lAHdr,sizeof(lAHdr)); lOri[1] :=lAHdr.Originator[1]; lOri[2] := lAHdr.Originator[2]; lOri[3] := lAHdr.Originator[3]; if (lOri[1]=76) and (lOri[2]=116) and (lOri[3]=64) and (lHdr.NIFTIhdr.dim[1]=151) and (lHdr.NIFTIhdr.dim[2]=188) and (lHdr.NIFTIhdr.dim[3]=154) then begin lOri[2] := 111; lOri[3] := 68; end; //2/2008 Juelich fudge factor if ((lOri[1]<1) or (lOri[1]> lHdr.NIFTIhdr.dim[1])) and ((lOri[2]<1) or (lOri[2]> lHdr.NIFTIhdr.dim[2])) and ((lOri[3]<1) or (lOri[3]> lHdr.NIFTIhdr.dim[3])) then begin lOri[1] := (lHdr.NIFTIhdr.dim[1]+1) / 2; //May07 use / not div lOri[2] := (lHdr.NIFTIhdr.dim[2]+1) / 2; //May07 use / not div lOri[3] := (lHdr.NIFTIhdr.dim[3]+1) / 2; //May07 use / not div : if 20 slices, then origin is between 10 and 11 end; //showmessage(inttostr(sizeof(lAHdr))+' '+realtostr(lHdr.Ori[1],1)+' '+ realtostr(lHdr.Ori[2],1)+' '+realtostr(lHdr.Ori[3],1) ); //DANGER: This header was from ANALYZE format, not NIFTI: make sure the rotation matrix is switched off NIFTIhdr_SetIdentityMatrix(lHdr); lHdr.NIFTIhdr.qform_code := kNIFTI_XFORM_UNKNOWN; lHdr.NIFTIhdr.sform_code := kNIFTI_XFORM_UNKNOWN; //test - input estimated orientation matrix lHdr.NIFTIhdr.sform_code := kNIFTI_XFORM_SCANNER_ANAT ; lHdr.NIFTIhdr.srow_x[0] := lHdr.NIFTIhdr.pixdim[1]; lHdr.NIFTIhdr.srow_y[1] := lHdr.NIFTIhdr.pixdim[2]; lHdr.NIFTIhdr.srow_z[2] := lHdr.NIFTIhdr.pixdim[3]; lHdr.NIFTIhdr.srow_x[3] := (lOri[1]-1)*-lHdr.NIFTIhdr.pixdim[1]; lHdr.NIFTIhdr.srow_y[3] := (lOri[2]-1)*-lHdr.NIFTIhdr.pixdim[2]; lHdr.NIFTIhdr.srow_z[3] := (lOri[3]-1)*-lHdr.NIFTIhdr.pixdim[3]; //fx(lHdr.NIFTIhdr.srow_z[3],lOri[3]); //end test //Warning: some of the NIFTI float values that do exist as integer values in Analyze may have bizarre values like +INF, -INF, NaN lHdr.NIFTIhdr.toffset := 0; lHdr.NIFTIhdr.intent_code := kNIFTI_INTENT_NONE; lHdr.NIFTIhdr.dim_info := kNIFTI_SLICE_SEQ_UNKNOWN + (kNIFTI_SLICE_SEQ_UNKNOWN shl 2) + (kNIFTI_SLICE_SEQ_UNKNOWN shl 4); //Freq, Phase and Slie all unknown lHdr.NIFTIhdr.xyzt_units := kNIFTI_UNITS_UNKNOWN; lHdr.NIFTIhdr.slice_duration := 0; //avoid +inf/-inf, NaN lHdr.NIFTIhdr.intent_p1 := 0; //avoid +inf/-inf, NaN lHdr.NIFTIhdr.intent_p2 := 0; //avoid +inf/-inf, NaN lHdr.NIFTIhdr.intent_p3 := 0; //avoid +inf/-inf, NaN lHdr.NIFTIhdr.pixdim[0] := 1; //QFactor should be 1 or -1 end; if (lHdr.NIFTIhdr.sform_code > kNIFTI_XFORM_UNKNOWN) and (lHdr.NIFTIhdr.sform_code <= kNIFTI_XFORM_MNI_152) then begin //DEC06 lHdr.Mat:= Matrix3D( lHdr.NIFTIhdr.srow_x[0],lHdr.NIFTIhdr.srow_x[1],lHdr.NIFTIhdr.srow_x[2],lHdr.NIFTIhdr.srow_x[3], // 3D "graphics" matrix lHdr.NIFTIhdr.srow_y[0],lHdr.NIFTIhdr.srow_y[1],lHdr.NIFTIhdr.srow_y[2],lHdr.NIFTIhdr.srow_y[3], // 3D "graphics" matrix lHdr.NIFTIhdr.srow_z[0],lHdr.NIFTIhdr.srow_z[1],lHdr.NIFTIhdr.srow_z[2],lHdr.NIFTIhdr.srow_z[3], // 3D "graphics" matrix 0,0,0,1); end else begin lHdr.Mat:= Matrix3D( lHdr.NIFTIhdr.pixdim[1],0,0,(lOri[1]-1)*-lHdr.NIFTIhdr.pixdim[1], // 3D "graphics" matrix 0,lHdr.NIFTIhdr.pixdim[2],0,(lOri[2]-1)*-lHdr.NIFTIhdr.pixdim[2], // 3D "graphics" matrix 0,0,lHdr.NIFTIhdr.pixdim[3],(lOri[3]-1)*-lHdr.NIFTIhdr.pixdim[3], // 3D "graphics" matrix 0,0,0,1); end; FixCrapMat(lHdr.Mat); //ReportMatrix(lHdr.mat); end; //func NIFTIhdr_LoadHdr procedure NIFTIhdr_SetIdentityMatrix (var lHdr: TMRIcroHdr); //create neutral rotation matrix var lInc: integer; begin with lHdr.NIFTIhdr do begin for lInc := 0 to 3 do srow_x[lInc] := 0; for lInc := 0 to 3 do srow_y[lInc] := 0; for lInc := 0 to 3 do srow_z[lInc] := 0; for lInc := 1 to 16 do intent_name[lInc] := chr(0); //next: create identity matrix: if code is switched on there will not be a problem srow_x[0] := 1; srow_y[1] := 1; srow_z[2] := 1; end; end; //proc NIFTIhdr_IdentityMatrix procedure NIFTIhdr_ClearHdr (var lHdr: TMRIcroHdr); //put sensible default values into header var lInc: byte; begin lHdr.NIFTIVersion := 1; lHdr.UsesCustomPalette := false; lHdr.DiskDataNativeEndian := true; lHdr.LutFromZero := false; lHdr.NIfTItransform := true;//assume genuine NIfTI, not Analyze with lHdr.NIFTIhdr do begin {set to 0} HdrSz := sizeof(TNIFTIhdr); for lInc := 1 to 10 do Data_Type[lInc] := chr(0); for lInc := 1 to 18 do db_name[lInc] := chr(0); extents:=0; session_error:= 0; regular:='r'{chr(0)}; dim_info:=(0); dim[0] := 4; for lInc := 1 to 7 do dim[lInc] := 0; intent_p1 := 0; intent_p2 := 0; intent_p3 := 0; intent_code:=0; datatype:=0 ; bitpix:=0; slice_start:=0; for lInc := 1 to 7 do pixdim[linc]:= 1.0; vox_offset:= 0.0; scl_slope := 1.0; scl_inter:= 0.0; slice_end:= 0; slice_code := 0; xyzt_units := 10; cal_max:= 0.0; cal_min:= 0.0; slice_duration:=0; toffset:= 0; glmax:= 0; glmin:= 0; for lInc := 1 to 80 do descrip[lInc] := chr(0);{80 spaces} for lInc := 1 to 24 do aux_file[lInc] := chr(0);{80 spaces} {below are standard settings which are not 0} bitpix := 16;//vc16; {8bits per pixel, e.g. unsigned char 136} DataType := 4;//vc4;{2=unsigned char, 4=16bit int 136} Dim[0] := 3; Dim[1] := 256; Dim[2] := 256; Dim[3] := 128; Dim[4] := 1; {n vols} Dim[5] := 1; Dim[6] := 1; Dim[7] := 1; glMin := 0; glMax := 255; qform_code := kNIFTI_XFORM_UNKNOWN; sform_code:= kNIFTI_XFORM_UNKNOWN; quatern_b := 0; quatern_c := 0; quatern_d := 0; qoffset_x := 0; qoffset_y := 0; qoffset_z := 0; NIFTIhdr_SetIdentityMatrix(lHdr); magic := kNIFTI_MAGIC_SEPARATE_HDR; end; //with the NIfTI header... with lHdr do begin ScrnBufferItems := 0; ImgBufferItems := 0; ImgBufferBPP := 0; RenderBufferItems := 0; ScrnBuffer:= nil; ImgBuffer := nil; end; end; //proc NIFTIhdr_ClearHdr function NIFTIhdr_SaveHdr2 (var lFilename: string; var lHdr1: TNIFTIHdr; lAllowOverwrite,lSPM2: boolean): boolean; overload; var lExt: string; lF: File; lOverwrite: boolean; lOutHdr,lHdr: TNIFTIHdr2; begin result := false; if not NII1_2_NII2(lHdr1,lHdr) then exit; if lHdr.magic = kNIFTI_MAGIC_EMBEDDED_HDR then lHdr.magic := kNIFTI2_MAGIC_EMBEDDED_HDR; if lHdr.magic = kNIFTI_MAGIC_SEPARATE_HDR then lHdr.magic := kNIFTI2_MAGIC_SEPARATE_HDR; lOverwrite := false; //will we overwrite existing file? result := false; //assume failure if lHdr.magic = kNIFTI2_MAGIC_EMBEDDED_HDR then begin lExt := UpCaseExt(lFileName); if (lExt = '.GZ') or (lExt = '.NII.GZ') then begin ShowMessage('Unable to save .nii.gz headers (first ungzip your image if you wish to edit the header)'); exit; end; lFilename := changefileext(lFilename,'.nii') end else lFilename := changefileext(lFilename,'.hdr'); if ((sizeof(TNIFTIhdr))> DiskFreeEx(lFileName)) then begin ShowMessage('There is not enough free space on the destination disk to save the header. '+kCR+ lFileName+ kCR+' Bytes Required: '+inttostr(sizeof(TNIFTIhdr)) ); exit; end; if Fileexists(lFileName) then begin if lAllowOverwrite then begin case MessageDlg('Do you wish to modify the existing file '+lFilename+'?', mtConfirmation,[mbYes, mbNo], 0) of { produce the message dialog box } 6: lOverwrite := true; //6= mrYes, 7=mrNo... not sure what this is for Linux. Hardcoded as we do not include Form values end;//case end else showmessage('Error: the file '+lFileName+' already exists.'); if not lOverwrite then Exit; end; if lHdr.magic = kNIFTI2_MAGIC_EMBEDDED_HDR then if lHdr.vox_offset < sizeof(TNIFTIHdr) then lHdr.vox_offset := sizeof(TNIFTIHdr); //embedded images MUST start after header if lHdr.magic = kNIFTI2_MAGIC_SEPARATE_HDR then lHdr.vox_offset := 0; //embedded images MUST start after header if lSPM2 then begin //SPM2 does not recognize NIfTI - origin values will be wrong lHdr.magic := 0; {lHdr.qform_code := 0; lHdr.sform_code:= 0; lHdr.quatern_b := 0; lHdr.quatern_c := 0; lHdr.quatern_d := 0; lHdr.qoffset_x := 0; lHdr.qoffset_y := 0; lHdr.qoffset_z := 0; } end; result := true; move(lHdr, lOutHdr, sizeof(lOutHdr)); Filemode := 1; AssignFile(lF, lFileName); {WIN} if lOverwrite then //this allows us to modify just the 348byte header of an existing NII header without touching image data Reset(lF,sizeof(TNIFTIhdr)) else Rewrite(lF,sizeof(TNIFTIhdr)); BlockWrite(lF,lOutHdr, 1 ); CloseFile(lF); Filemode := 2; end; //func NIFTIhdr_SaveHdr function NIFTIhdr_SaveHdr (var lFilename: string; var lHdr: TNIFTIHdr; lAllowOverwrite,lSPM2: boolean): boolean; overload; var lOutHdr: TNIFTIhdr; lExt: string; lF: File; lOverwrite: boolean; begin if (lHdr.magic = kNIFTI2_MAGIC_EMBEDDED_HDR) or (lHdr.Magic = kNIFTI2_MAGIC_SEPARATE_HDR) then begin result := NIFTIhdr_SaveHdr2(lFilename,lHdr,lAllowOverwrite,lSPM2); exit; end; lOverwrite := false; //will we overwrite existing file? result := false; //assume failure if lHdr.magic = kNIFTI_MAGIC_EMBEDDED_HDR then begin lExt := UpCaseExt(lFileName); if (lExt = '.GZ') or (lExt = '.NII.GZ') then begin ShowMessage('Unable to save .nii.gz headers (first ungzip your image if you wish to edit the header)'); exit; end; lFilename := changefileext(lFilename,'.nii') end else lFilename := changefileext(lFilename,'.hdr'); if ((sizeof(TNIFTIhdr))> DiskFreeEx(lFileName)) then begin ShowMessage('There is not enough free space on the destination disk to save the header. '+kCR+ lFileName+ kCR+' Bytes Required: '+inttostr(sizeof(TNIFTIhdr)) ); exit; end; if Fileexists(lFileName) then begin if lAllowOverwrite then begin case MessageDlg('Do you wish to modify the existing file '+lFilename+'?', mtConfirmation,[mbYes, mbNo], 0) of { produce the message dialog box } 6: lOverwrite := true; //6= mrYes, 7=mrNo... not sure what this is for Linux. Hardcoded as we do not include Form values end;//case end else showmessage('Error: the file '+lFileName+' already exists.'); if not lOverwrite then Exit; end; if lHdr.magic = kNIFTI_MAGIC_EMBEDDED_HDR then if lHdr.vox_offset < sizeof(TNIFTIHdr) then lHdr.vox_offset := sizeof(TNIFTIHdr); //embedded images MUST start after header if lHdr.magic = kNIFTI_MAGIC_SEPARATE_HDR then lHdr.vox_offset := 0; //embedded images MUST start after header if lSPM2 then begin //SPM2 does not recognize NIfTI - origin values will be wrong lHdr.magic := 0; end; result := true; move(lHdr, lOutHdr, sizeof(lOutHdr)); Filemode := 1; AssignFile(lF, lFileName); {WIN} if lOverwrite then //this allows us to modify just the 348byte header of an existing NII header without touching image data Reset(lF,sizeof(TNIFTIhdr)) else Rewrite(lF,sizeof(TNIFTIhdr)); BlockWrite(lF,lOutHdr, 1 {, NumWritten}); CloseFile(lF); Filemode := 2; end; //func NIFTIhdr_SaveHdr function NIFTIhdr_SaveHdr (var lFilename: string; var lHdr: TMRIcroHdr; lAllowOverwrite: boolean): boolean; overload; var lOutHdr: TNIFTIhdr; lExt: string; lF: File; lOverwrite: boolean; begin if (lHdr.NIFTIVersion = 2) or (lHdr.NIFTIhdr.magic = kNIFTI2_MAGIC_EMBEDDED_HDR) or (lHdr.NIFTIhdr.Magic = kNIFTI2_MAGIC_SEPARATE_HDR) then begin result := NIFTIhdr_SaveHdr2(lFilename,lHdr.NIFTIhdr,lAllowOverwrite,false); //666 byte swapping exit; end; lOverwrite := false; //will we overwrite existing file? result := false; //assume failure if lHdr.NIFTIhdr.magic = kNIFTI_MAGIC_EMBEDDED_HDR then begin lExt := UpCaseExt(lFileName); if (lExt = '.GZ') or (lExt = '.NII.GZ') then begin showmessage('Unable to save .nii.gz headers (first ungzip your image if you wish to edit the header)'); exit; end; lFilename := changefileext(lFilename,'.nii') end else lFilename := changefileext(lFilename,'.hdr'); if ((sizeof(TNIFTIhdr))> DiskFreeEx(lFileName)) then begin ShowMessage('There is not enough free space on the destination disk to save the header. '+kCR+ lFileName+ kCR+' Bytes Required: '+inttostr(sizeof(TNIFTIhdr)) ); exit; end; if Fileexists(lFileName) then begin if lAllowOverwrite then begin case MessageDlg('Do you wish to modify the existing file '+lFilename+'?', mtConfirmation,[mbYes, mbNo], 0) of { produce the message dialog box } 6: lOverwrite := true; //6= mrYes, 7=mrNo... not sure what this is for unix. Hardcoded as we do not include Form values end;//case end else showmessage('Error: the file '+lFileName+' already exists.'); if not lOverwrite then Exit; end; if lHdr.NIFTIhdr.magic = kNIFTI_MAGIC_EMBEDDED_HDR then if lHdr.NIFTIhdr.vox_offset < sizeof(TNIFTIHdr) then lHdr.NIFTIhdr.vox_offset := sizeof(TNIFTIHdr); //embedded images MUST start after header if lHdr.NIFTIhdr.magic = kNIFTI_MAGIC_SEPARATE_HDR then lHdr.NIFTIhdr.vox_offset := 0; //embedded images MUST start after header result := true; move(lHdr.NIFTIhdr, lOutHdr, sizeof(lOutHdr)); if lHdr.DiskDataNativeEndian= false then NIFTIhdr_SwapBytes (lOutHdr);{swap to big-endianformat} Filemode := 1; AssignFile(lF, lFileName); {WIN} if lOverwrite then //this allows us to modify just the 348byte header of an existing NII header without touching image data Reset(lF,sizeof(TNIFTIhdr)) else Rewrite(lF,sizeof(TNIFTIhdr)); BlockWrite(lF,lOutHdr, 1 {, NumWritten}); CloseFile(lF); Filemode := 2; end; //func NIFTIhdr_SaveHdr procedure NIFTIhdr_SwapBytes (var lAHdr: TNIFTIhdr); //Swap Byte order for the Analyze type var lInc: integer; begin with lAHdr do begin swap4(hdrsz); swap4(extents); session_error := swap(session_error); for lInc := 0 to 7 do dim[lInc] := swap(dim[lInc]); Xswap4r(intent_p1); Xswap4r(intent_p2); Xswap4r(intent_p3); intent_code:= swap(intent_code); datatype:= swap(datatype); bitpix := swap(bitpix); slice_start:= swap(slice_start); for lInc := 0 to 7 do Xswap4r(pixdim[linc]); Xswap4r(vox_offset); Xswap4r(scl_slope); Xswap4r(scl_inter); slice_end := swap(slice_end); Xswap4r(cal_max); Xswap4r(cal_min); Xswap4r(slice_duration); Xswap4r(toffset); swap4(glmax); swap4(glmin); qform_code := swap(qform_code); sform_code:= swap(sform_code); Xswap4r(quatern_b); Xswap4r(quatern_c); Xswap4r(quatern_d); Xswap4r(qoffset_x); Xswap4r(qoffset_y); Xswap4r(qoffset_z); for lInc := 0 to 3 do //alpha Xswap4r(srow_x[lInc]); for lInc := 0 to 3 do //alpha Xswap4r(srow_y[lInc]); for lInc := 0 to 3 do //alpha Xswap4r(srow_z[lInc]); end; //with NIFTIhdr end; //proc NIFTIhdr_SwapBytes end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/isgui.inc���������������������������������������������������0000664�0001750�0001750�00000000154�11542350054�020752� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{$DEFINE GUI} //use GUI if you are using a graphic user interface - anything else for console applications ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/gziod.pas���������������������������������������������������0000664�0001750�0001750�00000034015�11454071750�020770� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Unit gziod;//GZip input/output for delphi interface uses define_types,gzio,Windows,sysutils; procedure UnGZip (var lFname: string; var lBuf: ByteP{}; lOffset,lMaxSz: integer); //unzip procedure UnGZipCore (var infile : gzFile; var lBuf: ByteP; lReadBytes: integer; lWrite: boolean); function Gunzip (var FFileSource,FFileDestination: string): integer; procedure GZipBuffer(var lFilename: String;lxInBuffer: byteP;lInSize: Integer; lOverwritewarn: boolean); procedure GZipFile(lSrcName,lDestName: String;lDeleteSrc: boolean); procedure UnGZipFile (var lFname,lOUtname: string); //unzip implementation {$include isgui.inc} {$IFDEF GUI}uses dialogs;{$ELSE} uses dialogsx;{$ENDIF} function gz_compressBuffer (lxInBuffer: ByteP;lInSize: integer;outfile:gzFile): integer; var len : Integer; lInBufferPos,ioerr : integer; buf : packed array [0..Z_BUFSIZE-1] of byte; { Global uses BSS instead of stack } //lInBufPtr,lOutbufPtr: pointer; errorcode : byte; //fsize, lensize : DWord; function blocktransfer(var lInBuffer: ByteP; lSizeRequested: integer; var lSizeTransferred:integer): integer; begin result := 0; if lInBufferPos > lInSize then begin result := 666; exit; end else if (lInBufferPos + lSizeRequested) <= lInSize then lSizeTransferred := lSizeRequested else lSizeTransferred := lInSize-lInBufferPos; //for lC := 1 to lSizeTransferred do // buf[lC-1] := lInBuffer[lInBufferPos+lC] ; move(lInbuffer[lInBufferPos+1],buf,lSizeTransferred); //move(src,dest,count); lInBufferPos := lInBufferPos+lSizeTransferred; end; begin //showmessage(inttostr(Z_BUFSIZE)); lInBufferPos := 0; errorcode := 0; //Progress := 0; //fsize := lInSize; //lensize := 0; //if FProgressStep > 0 then DoOnProgress; while true do begin //lll{$I-}blockread (infile, buf, Z_BUFSIZE, len);{$I+} ioerr := blocktransfer(lxInBuffer,Z_BUFSIZE, len); if (ioerr <> 0) then begin errorcode := 1; break end; if (len = 0) then break; {$WARNINGS OFF}{Comparing signed and unsigned types} if (gzwrite (outfile, @buf, len) <> len) then begin {$WARNINGS OFF} errorcode := 2; break end; end; {WHILE} if (gzclose (outfile) <> 0{Z_OK}) then errorcode := 3; result := errorcode; end; procedure GZipBuffer(var lFilename: String;lxInBuffer: byteP;lInSize: Integer; lOverwritewarn: boolean); var FFileDestination,FGzipComments ,outmode,s : string; infile : file; outfile : gzFile; FCompressionLevel{,errorcode} : integer; flags : uInt; stream : gz_streamp; p : PChar; begin FGzipComments := ''; FFileDestination := lFilename; //if not GzExt(FFileDestination) then // FFileDestination := FFileDestination + '.gz'; FCompressionLevel := 6;//MainForm.CompressEdit.value; if (FCompressionLevel > 9) or (FCompressionLevel<0) then FCompressionLevel := 6; if lOverwritewarn and fileexists(FFileDestination) then begin {$IFDEF GUI} case MessageDlg('Overwrite the file '+FFileDestination+'?', mtConfirmation,[mbYes, mbAbort], 0) of { produce the message dialog box } id_Abort: exit; end; {$ELSE} case MsgDlg('Overwrite the file '+FFileDestination+'?', mtConfirmation,[mbYes, mbAbort], 0) of { produce the message dialog box } id_Abort: exit; end; {$ENDIF} end; //w adds .gz extension-> outmode := 'w '; outmode := 'w '; s := IntToStr(FCompressionLevel); outmode[2] := s[1]; outmode[3] := ' '; flags := ORIG_NAME; //if (comment in FGzipHeader) then flags := flags + COMMENT_; outfile := gzopenZ (FFileDestination, outmode, flags); //showmessage(FFileDestination); if (outfile = NIL) then begin //if FWindowOnError then {$IFDEF GUI} MessageDlg('Can''t open: '+FFileDestination, mtError, [mbAbort], 0); {$ELSE} MsgDlg('Can''t open: '+FFileDestination, mtError, [mbAbort], 0); {$ENDIF} close( infile); //errorcode := 2 exit; end else begin { if flags are set then write them } stream := gz_streamp(outfile); if {(zfilename in FGzipHeader)} true then begin //s := ExtractFilename(lInFileName); //s := ExtractFilename(FGzipFilename); s := ExtractFilename(changefileext(FFileDestination,'')); p := PChar(s); blockWrite( stream^.gzfile, p[0], length(s)+1); stream^.startpos := stream^.startpos + length(s) + 1 end; gz_compressBuffer (lxInBuffer,lInSize,outfile); end end; function gz_uncompress (infile:gzFile; var outfile:file;fsize:DWord{LongWord}) : integer; var len : integer; written : uInt; buf : packed array [0..Z_BUFSIZE-1] of byte; { Global uses BSS instead of stack } errorcode : byte; lensize : DWord{LongWord}; begin errorcode := 0; //FProgress := 0; lensize := 0; //if FProgressStep > 0 then DoOnProgress; while true do begin len := gzread (infile, @buf, Z_BUFSIZE); if (len < 0) then begin errorcode := 1; break end; if (len = 0) then break; {$I-} blockwrite (outfile, buf, len, written); {$I+} {$WARNINGS OFF}{Comparing signed and unsigned types} if (written <> len) then begin {$WARNINGS ON} errorcode := 2; break end; (*if FProgressStep > 0 then begin {$WARNINGS OFF} lensize := lensize + len; if ((lensize / fsize) * 100 >= FProgress + FProgressStep) or (lensize = fsize) then begin FProgress := Trunc((lensize / fsize) * 100); DoOnProgress end {$WARNINGS ON} end *) end; {WHILE} if (gzclose (infile) <> 0{Z_OK}) then begin {$IFDEF GUI} MessageDlg('gzclose Error.', mtError, [mbAbort], 0); {$ELSE} MsgDlg('gzclose Error.', mtError, [mbAbort], 0); {$ENDIF} errorcode := 3 end; gz_uncompress := errorcode end; function Gunzip (var FFileSource,FFileDestination: string): integer; var infile : gzFile; outfile : file; ioerr : integer; errorcode : integer; fsize : DWord{LongWord}; s : gz_streamp; begin errorcode := 0; infile := gzopenZ (FFileSource, 'r', 0); if (infile = NIL) then begin //if FWindowOnError then {$IFDEF GUI} MessageDlg('Can''t open: '+FFileSource, mtError, [mbAbort], 0); {$ELSE} MsgDlg('Can''t open: '+FFileSource, mtError, [mbAbort], 0); {$ENDIF} errorcode := 1 end else begin s := gz_streamp(infile); fsize := FileSize( s^.gzfile); AssignFile (outfile, FFileDestination); {$I-} Rewrite (outfile,1); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin //if FWindowOnError then {$IFDEF GUI} MessageDlg('Can''t create: '+FFileDestination, mtError, [mbAbort], 0); {$ELSE} MsgDlg('Can''t create: '+FFileDestination, mtError, [mbAbort], 0); {$ENDIF} errorcode := 2 end else begin { We could open all files, so time for uncompressing } gz_uncompress (infile, outfile, fsize); //if FDeleteSource then DeleteFile(FFileSource); {$I-} close (outfile); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin //if FWindowOnError then {$IFDEF GUI} MessageDlg('Can''t close file '+FFileDestination, mtError, [mbAbort], 0); {$ELSE} MsgDlg('Can''t close file '+FFileDestination, mtError, [mbAbort], 0); {$ENDIF} halt(1) end end end; Gunzip := errorcode end; procedure UnGZipCore (var infile : gzFile; var lBuf: ByteP; lReadBytes: integer; lWrite: boolean); const BUFLEN = 16384; var buf : packed array [0..BUFLEN-1] of byte; { Global uses BSS instead of stack } len,lI,written : integer; begin written := 0; if lReadBytes < 1 then exit; Len := lReadBytes div BUFLEN; if Len > 0 then for lI := 1 to Len do begin gzread (infile, @buf, BUFLEN {1388}); if lWrite then Move(buf,lbuf[Written+1],BUFLEN); Written := Written + BUFLEN; end; Len := lReadBytes mod BUFLEN; if Len = 0 then exit; gzread (infile, @buf, Len); if lWrite then Move(buf,lbuf[Written+1],len); end; //ungzipCore procedure UnGZip (var lFname: string; var lBuf: ByteP{}; lOffset,lMaxSz: integer); //unzip //1417z- offset const BUFLEN = 16384; var infile : gzFile; lbufsz,len,lI : integer; written : integer; buf : packed array [0..BUFLEN-1] of byte; { Global uses BSS instead of stack } begin infile := gzopenZ (lFName, 'r', 0); written := 0; if lOffset > 0 then begin Len := lOffset div BUFLEN; if Len > 0 then for lI := 1 to Len do gzread (infile, @buf, BUFLEN {1388}); Len := lOffset mod BUFLEN; gzread (infile, @buf, Len); end; lbufsz := BUFLEN; if lMaxSz < BUFLEN then lbufsz := lMaxSz; while true do begin len := gzread (infile, @buf, lbufsz); if (len < 0) then begin break end; if (len = 0) then break; if (Written+len) > lMaxSz then begin if Written < lMaxSz then Move(buf,lbuf[Written+1],lMaxSz-Written); //cr2007 break; end; Move(buf,lbuf[Written+1],len); Written := Written + len; end; {WHILE} gzclose (infile); end; procedure UnGZipFile (var lFname,lOUtname: string); //unzip //1417z- offset const bufsz = 16384; var infile : gzFile; len,lI : integer; //written : integer; lF: File; buf : packed array [0..bufsz-1] of byte; { Global uses BSS instead of stack } begin infile := gzopenZ (lFName, 'r', 0); //written := 0; //lbufsz := BUFLEN; Filemode := 1; AssignFile(lF, lOUtname); Rewrite(lF,1); while true do begin len := gzread (infile, @buf, bufsz); if (len < 0) then begin break end; if (len = 0) then break; BlockWrite(lF,buf, len); //Move(buf,lbuf[Written+1],len); //Written := Written + len; end; {WHILE} gzclose (infile); CloseFile(lF); Filemode := 2; //1366 end; function gz_compress (var infile:file; outfile:gzFile): integer; var len : uInt; ioerr : integer; buf : packed array [0..Z_BUFSIZE-1] of byte; { Global uses BSS instead of stack } errorcode : byte; // fsize, lensize : DWord; (*{$IFDEF VER100, VER90} fsize, lensize : DWord; {$ELSE} fsize, lensize : LongWord; {$ENDIF} *) begin errorcode := 0; //Progress := 0; //fsize := FileSize(infile); //lensize := 0; //if FProgressStep > 0 then DoOnProgress; while true do begin {$I-} blockread (infile, buf, Z_BUFSIZE, len); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin errorcode := 1; break end; if (len = 0) then break; {$WARNINGS OFF}{Comparing signed and unsigned types} if (gzwrite (outfile, @buf, len) <> len) then begin {$WARNINGS OFF} errorcode := 2; break end; (*if FProgressStep > 0 then begin {$WARNINGS OFF}{Calculate progress and raise event} lensize := lensize + len; if ((lensize / fsize) * 100 >= FProgress + FProgressStep) or (lensize = fsize) then begin FProgress := Trunc((lensize / fsize) * 100); DoOnProgress end {$WARNINGS ON} end *) end; {WHILE} closeFile (infile); if (gzclose (outfile) <> 0{Z_OK}) then errorcode := 3; gz_compress := errorcode; end; procedure GZipFile(lSrcName,lDestName: String;lDeleteSrc: boolean); var //FGzipHeader : THeader; //FCompressionLevel,FProgress,Progress: integer; FGzipFilename : string; FGzipComments : string; outmode : string; s : string; infile : file; outfile : gzFile; FCompressionLevel{,errorcode} : integer; flags : uInt; stream : gz_streamp; p : PChar; //lProceed: TModalResult; ioerr : integer; begin //FGzipHeader := [zFilename]; FGzipFilename:= lSrcName; FGzipComments := ''; //FProgress := 0; FCompressionLevel := 6; if (FCompressionLevel > 9) or (FCompressionLevel<0) then FCompressionLevel := 6; //MainForm.ProgressBar1.position :=1; //Gzip (lFile,lMulti); //FFileDestination := lSourceFile+'.gz'; //result := 2; //return error if user aborts if fileexists(lDestName) then begin {$IFDEF GUI} case MessageDlg('Overwrite the file '+lDestName+'?', mtConfirmation,[mbYes, mbAbort], 0) of { produce the message dialog box } id_Abort: exit; end; {$ELSE} case MsgDlg('Overwrite the file '+lDestName+'?', mtConfirmation,[mbYes, mbAbort], 0) of { produce the message dialog box } id_Abort: exit; end; {$ENDIF} end; AssignFile (infile, lSrcName); {$I-} Reset (infile,1); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin //if FWindowOnError then // MessageDlg('Can''t open: '+lSourceFile, mtError, [mbAbort], 0); //errorcode := 1 end else begin outmode := 'w '; s := IntToStr(FCompressionLevel); outmode[2] := s[1]; outmode[3] := ' '; (*case FCompressionType of Standard : outmode[3] := ' '; HuffmanOnly : outmode[3] := 'h'; Filtered : outmode[3] := 'f'; end;*) //flags := 0; //if (zfilename in FGzipHeader) then flags := ORIG_NAME; //if (comment in FGzipHeader) then flags := flags + COMMENT_; outfile := gzopenZ (lDestName, outmode, flags); if (outfile = NIL) then begin //if FWindowOnError then // MessageDlg('Can''t open: '+FFileDestination, mtError, [mbAbort], 0); close( infile); //errorcode := 2 exit; end else begin { if flags are set then write them } stream := gz_streamp(outfile); if {(zfilename in FGzipHeader)} true then begin s := ExtractFilename(lSrcName); p := PChar(s); blockWrite( stream^.gzfile, p[0], length(s)+1); stream^.startpos := stream^.startpos + length(s) + 1 end; {if (zcomment in FGzipHeader) then begin p := PChar(FGzipComments); blockWrite( stream^.gzfile, p[0], length(FGzipComments)+1); stream^.startpos := stream^.startpos + length(FGzipComments) + 1 end; } {errorcode :=} gz_compress(infile, outfile); {if errorcode <> 0 then errorcode := errorcode+100 else if FDeleteSource then erase (infile);} end end; if lDeleteSrc then erase (infile); end; end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/gzio2.pas���������������������������������������������������0000664�0001750�0001750�00000150522�11645607506�020716� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Unit gzio2; { Pascal unit based on gzio.c -- IO on .gz files Copyright (C) 1995-1998 Jean-loup Gailly. Define NO_DEFLATE to compile this file without the compression code Pascal tranlastion based on code contributed by Francisco Javier Crespo Copyright (C) 1998 by Jacques Nomssi Nzali For conditions of distribution and use, see copyright notice in readme.txt } {$H+} {$mode Delphi} interface {$I zconf.inc} uses {$ifdef UNIX} baseunix, {$else} dos, {$endif} sysutils,zbase, crc, zdeflate, zinflate,define_types; type gzFile = pointer; type z_off_t = longint; function Gunzip (var FFileSource,FFileDestination: string): integer; procedure GZipBuffer(var FGzipFilename,FFileDestination: String;lxInBuffer: byteP;lInSize: Integer; lOverwritewarn: boolean);overload; procedure GZipBuffer(var FFileDestination: String;lxInBuffer: byteP;lInSize: Integer; lOverwritewarn: boolean);overload; procedure UnGZip (var lInFname: string; var lBuf: ByteP{}; lOffset,lMaxSz: integer); //unzip procedure UnGZipCore (var infile : gzFile; var lBuf: ByteP; lReadBytes: integer; lWrite: boolean); procedure UnGZipFile (var lFname,lOUtname: string); //unzip function gzopen (path:string; mode:string) : gzFile; function gzread (f:gzFile; buf:pointer; len:cardinal) : integer; function gzgetc (f:gzfile) : integer; function gzgets (f:gzfile; buf:Pchar; len:integer) : Pchar; procedure GZipFile(lSrcName,lDestName: String); overload; procedure GZipFile(lSrcName,lDestName: String;lDeleteSrc: boolean);overload; {$ifndef NO_DEFLATE} function gzwrite (f:gzFile; buf:pointer; len:cardinal) : integer; function gzputc (f:gzfile; c:char) : integer; function gzputs (f:gzfile; s:Pchar) : integer; function gzflush (f:gzFile; flush:integer) : integer; {$ifdef GZ_FORMAT_STRING} function gzprintf (zfile : gzFile; const format : string; a : array of integer); { doesn't compile } {$endif} {$endif} function gzseek (f:gzfile; offset:z_off_t; whence:integer) : z_off_t; function gztell (f:gzfile) : z_off_t; function gzclose (f:gzFile) : integer; function gzerror (f:gzFile; var errnum:smallint) : string; function gzsetparams (f:gzfile; level:integer; strategy:integer) : integer; function gzrewind (f:gzFile) : integer; function gzeof (f:gzfile) : boolean; const SEEK_SET {: z_off_t} = 0; { seek from beginning of file } SEEK_CUR {: z_off_t} = 1; { seek from current position } SEEK_END {: z_off_t} = 2; implementation {$include isgui.inc} {$IFDEF GUI}uses dialogs;{$ELSE} uses dialogsx;{$ENDIF} const Z_EOF = -1; { same value as in STDIO.H } Z_BUFSIZE = 16384; { Z_PRINTF_BUFSIZE = 4096; } gz_magic : array[0..1] of byte = ($1F, $8B); { gzip magic header } { gzip flag byte } ASCII_FLAG = $01; { bit 0 set: file probably ascii text } HEAD_CRC = $02; { bit 1 set: header CRC present } EXTRA_FIELD = $04; { bit 2 set: extra field present } ORIG_NAME = $08; { bit 3 set: original file name present } COMMENT = $10; { bit 4 set: file comment present } RESERVED = $E0; { bits 5..7: reserved } type gz_stream = record stream : z_stream; z_err : integer; { error code for last stream operation } z_eof : boolean; { set if end of input file } gzfile : file; { .gz file } inbuf : Pbyte; { input buffer } outbuf : Pbyte; { output buffer } crc : cardinal; { crc32 of uncompressed data } //msg, zpath : string[255];//6666666666666666 { path name for debugging only - limit 79 chars } transparent : boolean; { true if input file is not a .gz file } mode : char; { 'w' or 'r' } startpos : longint; { start of compressed data in file (header skipped) } end; type gz_streamp = ^gz_stream; function destroy (var s:gz_streamp) : integer; forward; procedure check_header(s:gz_streamp); forward; procedure showmessagex(lStr: string); begin {$IFDEF GUI} showmessage(lStr); {$ELSE} msg(lStr); {$ENDIF} end; procedure UnGZip (var lInFname: string; var lBuf: ByteP; lOffset,lMaxSz: integer); //unzip const BUFLEN = 16384; var infile : gzFile; lFname : ansistring; lbufsz,len,lI : integer; written : integer; buf : packed array [0..BUFLEN-1] of byte; { Global uses BSS instead of stack } begin lFName := lInFName; //filemode := 1; //if lFName = 'z' then //showmessage('unzip'); //ImgForm.Caption := 'gz'; //ReadIntForm.GetInt('Multi-volume file, please select volume to view.',1,1,3); //infile := gzopenZ (lFName, 'r', 0); //showmessage(lFName); infile := gzopen (lFName, 'r'); written := 0; if lOffset > 0 then begin Len := lOffset div BUFLEN; if Len > 0 then for lI := 1 to Len do gzread (infile, @buf, BUFLEN {1388}); Len := lOffset mod BUFLEN; gzread (infile, @buf, Len); end; lbufsz := BUFLEN; if lMaxSz < BUFLEN then lbufsz := lMaxSz; while true do begin len := gzread (infile, @buf, lbufsz); if (len < 0) then begin break end; if (len = 0) then break; if (Written+len) > lMaxSz then begin if Written < lMaxSz then Move(buf,lbuf^[Written+1],lMaxSz-Written); //cr2007 break; end; Move(buf,lbuf^[Written+1],len); Written := Written + len; end; {WHILE} gzclose (infile); //filemode := 2; end; procedure UnGZipCore (var infile : gzFile; var lBuf: ByteP; lReadBytes: integer; lWrite: boolean); const BUFLEN = 16384; var buf : packed array [0..BUFLEN-1] of byte; { Global uses BSS instead of stack } len,lI,written : integer; begin written := 0; if lReadBytes < 1 then exit; Len := lReadBytes div BUFLEN; if Len > 0 then for lI := 1 to Len do begin gzread (infile, @buf, BUFLEN {1388}); if lWrite then Move(buf,lbuf[Written+1],BUFLEN); Written := Written + BUFLEN; end; Len := lReadBytes mod BUFLEN; if Len = 0 then exit; gzread (infile, @buf, Len); if lWrite then Move(buf,lbuf[Written+1],len); end; //ungzipCore procedure UnGZipFile (var lFname,lOUtname: string); //unzip const bufsz = 16384; var infile : gzFile; len,lI : integer; //written : integer; lF: File; buf : packed array [0..bufsz-1] of byte; { Global uses BSS instead of stack } begin //infile := gzopenZ (lFName, 'r', 0); infile := gzopen (lFName, 'r'); //written := 0; //lbufsz := BUFLEN; Filemode := 1; AssignFile(lF, lOUtname); Rewrite(lF,1); while true do begin len := gzread (infile, @buf, bufsz); if (len < 0) then begin break end; if (len = 0) then break; BlockWrite(lF,buf, len); //Move(buf,lbuf[Written+1],len); //Written := Written + len; end; {WHILE} gzclose (infile); CloseFile(lF); Filemode := 2; //1366 end; function gz_compress (var infile:file; outfile:gzFile): integer; var len : cardinal; ioerr : integer; buf : packed array [0..Z_BUFSIZE-1] of byte; { Global uses BSS instead of stack } errorcode : byte; fsize, lensize : DWord; begin errorcode := 0; //Progress := 0; fsize := FileSize(infile); lensize := 0; //if FProgressStep > 0 then DoOnProgress; while true do begin {$I-}blockread (infile, buf, Z_BUFSIZE, len);{$I+} ioerr := IOResult; if (ioerr <> 0) then begin errorcode := 1; break end; if (len = 0) then break; {$WARNINGS OFF}{Comparing signed and unsigned types} if (gzwrite (outfile, @buf, len) <> len) then begin {$WARNINGS OFF} errorcode := 2; break end; end; closeFile (infile); if (gzclose (outfile) <> 0{Z_OK}) then errorcode := 3; gz_compress := errorcode; end; // proc gz_compress procedure GZipFile(lSrcName,lDestName: String; lDeleteSrc: boolean); overload; var infile : file; outfile : gzFile; ioerr : integer; mode : string; begin //Msg('GZip ' + extractfilename(lSrcName)); //writeln(lSrcName+' -> GZ -> '+lDestName); mode := 'w6 '; Assign (infile, lSrcName); {$I-} Reset (infile,1); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin Showmessagex ('GZipFile error: '+inttostr(ioerr)); halt(1); end; outfile := gzopen (lDestName, mode); if (outfile = NIL) then begin Showmessagex('unable to create '+lDestName); exit; end; gz_compress(infile, outfile); if lDeleteSrc then erase (infile); end; procedure GZipFile(lSrcName,lDestName: String); overload; var FGzipFilename : string; FGzipComments : string; outmode : string; s,FFileDestination : string; infile : file; outfile : gzFile; FCompressionLevel{,errorcode} : integer; flags : Integer; stream : gz_streamp; //p : PChar; ioerr : integer; begin //FGzipHeader := [zFilename]; FGzipFilename:= lSrcName; FGzipComments := ''; FCompressionLevel := 6; //MainForm.ProgressBar1.position :=1; //Gzip (lFile,lMulti); FFileDestination := lDestName; //result := 2; //return error if user aborts (* if fileexists(FFileDestination) then begin case MessageDlg('Overwrite the file '+FFileDestination+'?', mtConfirmation,[mbYes, mbAbort], 0) of { produce the message dialog box } mrAbort: exit; end; end;*) AssignFile (infile, lSrcName); {$I-} Reset (infile,1); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin // Showmessage('Can''t open: '+lSrcName); //errorcode := 1 end else begin outmode := 'w '; //s := IntToStr(FCompressionLevel); outmode[2] := '6';//s[1]; outmode[3] := ' '; (*case FCompressionType of Standard : outmode[3] := ' '; HuffmanOnly : outmode[3] := 'h'; Filtered : outmode[3] := 'f'; end;*) //flags := 0; //if (zfilename in FGzipHeader) then flags := ORIG_NAME; //if (comment in FGzipHeader) then flags := flags + COMMENT_; outfile := gzopen (lSrcName, outmode); if (outfile = NIL) then begin //Showmessage('Can''t open: '+lSrcName); close( infile); exit; end else begin { if flags are set then write them } stream := gz_streamp(outfile); if {(zfilename in FGzipHeader)} true then begin s := lSrcName;//999 ExtractFilename(lSrcName); //p := PChar(s); blockWrite( stream^.gzfile, {p[0]}s, length(s)+1); stream^.startpos := stream^.startpos + length(s) + 1 end; gz_compress(infile, outfile); end end; end; procedure file_compress2 (filename,outname:string); var infile : file; outfile : gzFile; ioerr : integer; mode : string; begin mode := 'w6 '; Assign (infile, filename); {$I-} Reset (infile,1); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin writeln ('open error: ',ioerr); halt(1); end; outfile := gzopen (outname, mode); if (outfile = NIL) then begin //999 showmessage(' can''t gzopen '+outname); halt(1); end; gz_compress(infile, outfile); erase (infile); end; (*function gz_compressBuffer (lxInBuffer: ByteP;lInSize: integer;outfile:gzFile): integer; var len : Integer; lInBufferPos,ioerr : integer; buf : packed array [0..Z_BUFSIZE-1] of byte; { Global uses BSS instead of stack } //lInBufPtr,lOutbufPtr: pointer; errorcode : byte; //fsize, lensize : DWord; function blocktransfer(var lInBuffer: ByteP; lSizeRequested: integer; var lSizeTransferred:integer): integer; begin result := 0; if lInBufferPos > lInSize then begin result := 666; exit; end else if (lInBufferPos + lSizeRequested) <= lInSize then lSizeTransferred := lSizeRequested else lSizeTransferred := lInSize-lInBufferPos; //for lC := 1 to lSizeTransferred do // buf[lC-1] := lInBuffer[lInBufferPos+lC] ; move(lInbuffer[lInBufferPos+1],buf,lSizeTransferred); //move(src,dest,count); lInBufferPos := lInBufferPos+lSizeTransferred; end; begin lInBufferPos := 0; errorcode := 0; //Progress := 0; //fsize := lInSize; //lensize := 0; //if FProgressStep > 0 then DoOnProgress; while true do begin //lll{$I-}blockread (infile, buf, Z_BUFSIZE, len);{$I+} ioerr := blocktransfer(lxInBuffer,Z_BUFSIZE, len); if (ioerr <> 0) then begin errorcode := 1; break end; if (len = 0) then break; {$WARNINGS OFF}{Comparing signed and unsigned types} if (gzwrite (outfile, @buf, len) <> len) then begin {$WARNINGS OFF} errorcode := 2; break end; end; {WHILE} if (gzclose (outfile) <> 0{Z_OK}) then errorcode := 3; result := errorcode; end; procedure GZipBuffer(var FGzipFilename,FFileDestination: String;lxInBuffer: byteP;lInSize: Integer; lOverwritewarn: boolean); var FGzipComments ,outmode,s : string; infile : file; outfile : gzFile; FCompressionLevel : integer; flags : uInt; stream : gz_streamp; p : PChar; begin FGzipComments := ''; FCompressionLevel := 6; if (FCompressionLevel > 9) or (FCompressionLevel<0) then FCompressionLevel := 6; if lOverwritewarn and fileexists(FFileDestination) then begin case MessageDlg('Overwrite the file '+FFileDestination+'?', mtConfirmation,[mbYes, mbAbort], 0) of { produce the message dialog box } mrAbort: exit; end; end; //w adds .gz extension-> outmode := 'w '; outmode := 'w '; s := IntToStr(FCompressionLevel); outmode[2] := s[1]; outmode[3] := ' '; flags := ORIG_NAME; outfile := gzopenZ (FFileDestination, outmode, flags); if (outfile = NIL) then begin MessageDlg('Can''t open: '+FFileDestination, mtError, [mbAbort], 0); close( infile); exit; end else begin stream := gz_streamp(outfile); if {(zfilename in FGzipHeader)} true then begin //s := ExtractFilename(lInFileName); s := ExtractFilename(FGzipFilename); //p := PChar(s); blockWrite( stream^.gzfile,s , length(s)+1); stream^.startpos := stream^.startpos + length(s) + 1 end; gz_compressBuffer (lxInBuffer,lInSize,outfile); end end; *) { GZOPEN ==================================================================== Opens a gzip (.gz) file for reading or writing. As Pascal does not use file descriptors, the code has been changed to accept only path names. The mode parameter defaults to BINARY read or write operations ('r' or 'w') but can also include a compression level ('w9') or a strategy: Z_FILTERED as in 'w6f' or Z_HUFFMAN_ONLY as in 'w1h'. (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to open a file which is not in gzip format; in this case, gzread will directly read from the file without decompression. gzopen returns NIL if the file could not be opened (non-zero IOResult) or if there was insufficient memory to allocate the (de)compression state (zlib error is Z_MEM_ERROR). ============================================================================} (*function gzopenZ(sourceFilename:string; mode:string; flags:uInt) : gzFile; var i : uInt; err: int; level: int; strategy : int; { compression strategy } s : gz_streamp; path: string; {$IFDEF MSDOS} attr : word; { file attributes } {$ENDIF} {$IFNDEF NO_DEFLATE} gzheader : array [0..9] of byte; {$ENDIF} begin //wait(30); path := sourceFilename; GetMem (s,sizeof(gz_stream)); if not Assigned (s) then begin result := Z_NULL; exit; end; if (path='') then begin //999 Showmessage('Error with path'); result := Z_NULL; exit; end; //showmessage('gzOpenCompleted'); level := Z_DEFAULT_COMPRESSION; strategy := Z_DEFAULT_STRATEGY; s^.stream.zalloc := NIL; { (alloc_func)0 } s^.stream.zfree := NIL; { (free_func)0 } s^.stream.opaque := NIL; { (voidpf)0 } s^.stream.next_in := Z_NULL; s^.stream.next_out := Z_NULL; s^.stream.avail_in := 0; s^.stream.avail_out := 0; s^.z_err := Z_OK; s^.z_eof := false; s^.inbuf := Z_NULL; s^.outbuf := Z_NULL; s^.crc := crc32(0, Z_NULL, 0); s^.msg := ''; s^.transparent := false; s^.mode := chr(0); for i:=1 to Length(mode) do begin case mode[i] of 'r' : s^.mode := 'r'; 'w' : s^.mode := 'w'; '0'..'9' : level := Ord(mode[i])-Ord('0'); 'f' : strategy := Z_FILTERED; 'h' : strategy := Z_HUFFMAN_ONLY; end; end; //if (s^.mode='w') then begin path := path+'.gz'; end; s^.path := path; { limit to 255 chars } if (s^.mode=chr(0)) then begin destroyS(s); result := gzFile(Z_NULL); exit; end; if (s^.mode='w') then begin {$IFDEF NO_DEFLATE} err := Z_STREAM_ERROR; {$ELSE} err := deflateInit2 (s^.stream, level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); { windowBits is passed < 0 to suppress zlib header } GetMem (s^.outbuf, Z_BUFSIZE); s^.stream.next_out := s^.outbuf; {$ENDIF} if (err <> Z_OK) or (s^.outbuf = Z_NULL) then begin destroyS(s); result := gzFile(Z_NULL); exit; end; end else begin GetMem (s^.inbuf, Z_BUFSIZE); s^.stream.next_in := s^.inbuf; err := inflateInit2_ (s^.stream, -MAX_WBITS, ZLIB_VERSION, sizeof(z_stream)); { windowBits is passed < 0 to tell that there is no zlib header } if (err <> Z_OK) or (s^.inbuf = Z_NULL) then begin destroyS(s); result := gzFile(Z_NULL); exit; end; end; s^.stream.avail_out := Z_BUFSIZE; {$IFOPT I+} {$I-} {$define IOcheck} {$ENDIF} Assign (s^.gzfile, path {10/10/2006 s^.path}); //Assign (s^.gzfile, s^.path); {$ifdef MSDOS} GetFAttr(s^.gzfile, Attr); if (DosError <> 0) and (s^.mode='w') then ReWrite (s^.gzfile,1) else Reset (s^.gzfile,1); {$else} if {(not FileExists(s^.path)) and} (s^.mode='w') then // Vincent: changed IF because I don't want old data behind my // new made .gz-file ReWrite (s^.gzfile,1) else Reset (s^.gzfile,1); {$endif} {$IFDEF IOCheck} {$I+} {$ENDIF} if (IOResult <> 0) then begin destroyS(s); result := gzFile(Z_NULL); exit; end; if (s^.mode = 'w') then begin { Write a very simple .gz header } {$IFNDEF NO_DEFLATE} gzheader [0] := gz_magic [0]; gzheader [1] := gz_magic [1]; gzheader [2] := Z_DEFLATED; { method } gzheader [3] := flags; { flags } gzheader [4] := 0; { time[0] } gzheader [5] := 0; { time[1] } gzheader [6] := 0; { time[2] } gzheader [7] := 0; { time[3] } gzheader [8] := 0; { xflags } gzheader [9] := 0; { OS code = MS-DOS } blockwrite (s^.gzfile, gzheader, 10); s^.startpos := LONG(10); {$ENDIF} end else begin check_header(s); { skip the .gz header } {$WARNINGS OFF} { combining signed and unsigned types } s^.startpos := FilePos(s^.gzfile) - s^.stream.avail_in; {$WARNINGS ON} end; result := gzFile(s); end;//gzopenZ *) (*function StringMaxLen (var lInStr: ansistring; lMaxSz: integer): ansistring; var lPos: integer; begin //note: strings shortened to lMaxSz-1 //null termination requires one byte //e.g. size of 80 bytes can become a null terminated string with up to 79 characters if length(lInStr) >= lMaxSz then begin//crop string result := ''; for lPos := 1 to (lMaxSz-1) do result := result + lInStr[lPos]; end else result := lInStr; end; *) { GZOPEN ==================================================================== Opens a gzip (.gz) file for reading or writing. As Pascal does not use file descriptors, the code has been changed to accept only path names. The mode parameter defaults to BINARY read or write operations ('r' or 'w') but can also include a compression level ('w9') or a strategy: Z_FILTERED as in 'w6f' or Z_HUFFMAN_ONLY as in 'w1h'. (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to open a file which is not in gzip format; in this case, gzread will directly read from the file without decompression. gzopen returns nil if the file could not be opened (non-zero IOResult) or if there was insufficient memory to allocate the (de)compression state (zlib error is Z_MEM_ERROR). ============================================================================} function gzopen (path:string; mode:string) : gzFile; var i : cardinal; err : integer; level : integer; { compression level } strategy : integer; { compression strategy } s : gz_streamp; {$ifdef UNIX} info: stat; {$else} attr: word; {$endif} {$IFNDEF NO_DEFLATE} gzheader : array [0..9] of byte; {$ENDIF} begin if (path='') or (mode='') then begin gzopen := nil; exit; end; GetMem (s,sizeof(gz_stream)); if not Assigned (s) then begin gzopen := nil; exit; end; level := Z_DEFAULT_COMPRESSION; strategy := Z_DEFAULT_STRATEGY; s^.stream.next_in := nil; s^.stream.next_out := nil; s^.stream.avail_in := 0; s^.stream.avail_out := 0; s^.z_err := Z_OK; s^.z_eof := false; s^.inbuf := nil; s^.outbuf := nil; s^.crc := crc32(0, nil, 0); //s^.msg := ''; s^.transparent := false; s^.zpath := path; { limit to 255 chars } s^.mode := chr(0); for i:=1 to Length(mode) do begin case mode[i] of 'r' : s^.mode := 'r'; 'w' : s^.mode := 'w'; '0'..'9' : level := Ord(mode[i])-Ord('0'); 'f' : strategy := Z_FILTERED; 'h' : strategy := Z_HUFFMAN_ONLY; end; end; if (s^.mode=chr(0)) then begin destroy(s); gzopen := gzFile(nil); exit; end; if (s^.mode='w') then begin {$IFDEF NO_DEFLATE} err := Z_STREAM_ERROR; {$ELSE} err := deflateInit2 (s^.stream, level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); { windowBits is passed < 0 to suppress zlib header } GetMem (s^.outbuf, Z_BUFSIZE); s^.stream.next_out := s^.outbuf; {$ENDIF} if (err <> Z_OK) or (s^.outbuf = nil) then begin destroy(s); gzopen := gzFile(nil); exit; end; end else begin GetMem (s^.inbuf, Z_BUFSIZE); s^.stream.next_in := s^.inbuf; err := inflateInit2_ (s^.stream, -MAX_WBITS, ZLIB_VERSION, sizeof(z_stream)); { windowBits is passed < 0 to tell that there is no zlib header } if (err <> Z_OK) or (s^.inbuf = nil) then begin destroy(s); gzopen := gzFile(nil); exit; end; end; s^.stream.avail_out := Z_BUFSIZE; //showmessage(s^.path+' '+inttostr(length(path))); {$IFOPT I+} {$I-} {$define IOcheck} {$ENDIF} //11/11/07 Assign (s^.gzfile, s^.path); Assign (s^.gzfile, path); {$ifdef unix} if (fpstat(path,info)<0) and (s^.mode='w') then ReWrite (s^.gzfile,1) else Reset (s^.gzfile,1); {$else} GetFAttr(s^.gzfile, Attr); if (DosError <> 0) and (s^.mode='w') then ReWrite (s^.gzfile,1) else Reset (s^.gzfile,1); {$endif} {$IFDEF IOCheck} {$I+} {$ENDIF} if (IOResult <> 0) then begin destroy(s); gzopen := gzFile(nil); exit; end; if (s^.mode = 'w') then begin { Write a very simple .gz header } {$IFNDEF NO_DEFLATE} gzheader [0] := gz_magic [0]; gzheader [1] := gz_magic [1]; gzheader [2] := Z_DEFLATED; { method } gzheader [3] := 0; { flags } gzheader [4] := 0; { time[0] } gzheader [5] := 0; { time[1] } gzheader [6] := 0; { time[2] } gzheader [7] := 0; { time[3] } gzheader [8] := 0; { xflags } gzheader [9] := 0; { OS code = MS-DOS } blockwrite (s^.gzfile, gzheader, 10); s^.startpos := longint(10); {$ENDIF} end else begin check_header(s); { skip the .gz header } s^.startpos := FilePos(s^.gzfile) - s^.stream.avail_in; end; gzopen := gzFile(s); end; { GZSETPARAMS =============================================================== Update the compression level and strategy. ============================================================================} function gzsetparams (f:gzfile; level:integer; strategy:integer) : integer; var s : gz_streamp; written: integer; begin s := gz_streamp(f); if (s = nil) or (s^.mode <> 'w') then begin gzsetparams := Z_STREAM_ERROR; exit; end; { Make room to allow flushing } if (s^.stream.avail_out = 0) then begin s^.stream.next_out := s^.outbuf; blockwrite(s^.gzfile, s^.outbuf^, Z_BUFSIZE, written); if (written <> Z_BUFSIZE) then s^.z_err := Z_ERRNO; s^.stream.avail_out := Z_BUFSIZE; end; gzsetparams := deflateParams (s^.stream, level, strategy); end; { GET_BYTE ================================================================== Read a byte from a gz_stream. Updates next_in and avail_in. Returns EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. ============================================================================} function get_byte (s:gz_streamp) : integer; begin if (s^.z_eof = true) then begin get_byte := Z_EOF; exit; end; if (s^.stream.avail_in = 0) then begin {$I-} blockread (s^.gzfile, s^.inbuf^, Z_BUFSIZE, s^.stream.avail_in); {$I+} if (s^.stream.avail_in = 0) then begin s^.z_eof := true; if (IOResult <> 0) then s^.z_err := Z_ERRNO; get_byte := Z_EOF; exit; end; s^.stream.next_in := s^.inbuf; end; Dec(s^.stream.avail_in); get_byte := s^.stream.next_in^; Inc(s^.stream.next_in); end; { GETLONG =================================================================== Reads a Longint in LSB order from the given gz_stream. ============================================================================} { function getLong (s:gz_streamp) : cardinal; var x : array [0..3] of byte; i : byte; c : integer; n1 : longint; n2 : longint; begin for i:=0 to 3 do begin c := get_byte(s); if (c = Z_EOF) then s^.z_err := Z_DATA_ERROR; x[i] := (c and $FF) end; n1 := (ush(x[3] shl 8)) or x[2]; n2 := (ush(x[1] shl 8)) or x[0]; getlong := (n1 shl 16) or n2; end; } function getLong(s : gz_streamp) : cardinal; var x : packed array [0..3] of byte; c : integer; begin { x := cardinal(get_byte(s)); - you can't do this with TP, no unsigned longint } { the following assumes a little endian machine and TP } x[0] := Byte(get_byte(s)); x[1] := Byte(get_byte(s)); x[2] := Byte(get_byte(s)); c := get_byte(s); x[3] := Byte(c); if (c = Z_EOF) then s^.z_err := Z_DATA_ERROR; GetLong := cardinal(longint(x)); end; { CHECK_HEADER ============================================================== Check the gzip header of a gz_stream opened for reading. Set the stream mode to transparent if the gzip magic header is not present. Set s^.err to Z_DATA_ERROR if the magic header is present but the rest of the header is incorrect. IN assertion: the stream s has already been created sucessfully; s^.stream.avail_in is zero for the first time, but may be non-zero for concatenated .gz files ============================================================================} procedure check_header (s:gz_streamp); var method : integer; { method byte } flags : integer; { flags byte } len : cardinal; c : integer; begin { Check the gzip magic header } for len := 0 to 1 do begin c := get_byte(s); if (c <> gz_magic[len]) then begin if (len <> 0) then begin Inc(s^.stream.avail_in); Dec(s^.stream.next_in); end; if (c <> Z_EOF) then begin Inc(s^.stream.avail_in); Dec(s^.stream.next_in); s^.transparent := TRUE; end; if (s^.stream.avail_in <> 0) then s^.z_err := Z_OK else s^.z_err := Z_STREAM_END; exit; end; end; method := get_byte(s); flags := get_byte(s); if (method <> Z_DEFLATED) or ((flags and RESERVED) <> 0) then begin s^.z_err := Z_DATA_ERROR; exit; end; for len := 0 to 5 do get_byte(s); { Discard time, xflags and OS code } if ((flags and EXTRA_FIELD) <> 0) then begin { skip the extra field } len := cardinal(get_byte(s)); len := len + (cardinal(get_byte(s)) shr 8); { len is garbage if EOF but the loop below will quit anyway } while (len <> 0) and (get_byte(s) <> Z_EOF) do Dec(len); end; if ((flags and ORIG_NAME) <> 0) then begin { skip the original file name } repeat c := get_byte(s); until (c = 0) or (c = Z_EOF); end; if ((flags and COMMENT) <> 0) then begin { skip the .gz file comment } repeat c := get_byte(s); until (c = 0) or (c = Z_EOF); end; if ((flags and HEAD_CRC) <> 0) then begin { skip the header crc } get_byte(s); get_byte(s); end; if (s^.z_eof = true) then s^.z_err := Z_DATA_ERROR else s^.z_err := Z_OK; end; { DESTROY =================================================================== Cleanup then free the given gz_stream. Return a zlib error code. Try freeing in the reverse order of allocations. ============================================================================} function destroy (var s:gz_streamp) : integer; begin destroy := Z_OK; if not Assigned (s) then begin destroy := Z_STREAM_ERROR; exit; end; if (s^.stream.state <> nil) then begin if (s^.mode = 'w') then begin {$IFDEF NO_DEFLATE} destroy := Z_STREAM_ERROR; {$ELSE} destroy := deflateEnd(s^.stream); {$ENDIF} end else if (s^.mode = 'r') then begin destroy := inflateEnd(s^.stream); end; end; if (s^.zpath <> '') then begin {$I-} close(s^.gzfile); {$I+} if (IOResult <> 0) then destroy := Z_ERRNO; end; if (s^.z_err < 0) then destroy := s^.z_err; if Assigned (s^.inbuf) then FreeMem(s^.inbuf, Z_BUFSIZE); if Assigned (s^.outbuf) then FreeMem(s^.outbuf, Z_BUFSIZE); FreeMem(s, sizeof(gz_stream)); end; { GZREAD ==================================================================== Reads the given number of uncompressed bytes from the compressed file. If the input file was not in gzip format, gzread copies the given number of bytes into the buffer. gzread returns the number of uncompressed bytes actually read (0 for end of file, -1 for error). ============================================================================} function gzread (f:gzFile; buf:pointer; len:cardinal) : integer; var s : gz_streamp; start : Pbyte; next_out : Pbyte; n : cardinal; crclen : cardinal; { Buffer length to update CRC32 } filecrc : cardinal; { CRC32 stored in GZIP'ed file } filelen : cardinal; { Total lenght of uncompressed file } bytes : integer; { bytes actually read in I/O blockread } total_in : cardinal; total_out : cardinal; begin s := gz_streamp(f); start := Pbyte(buf); { starting point for crc computation } if (s = nil) or (s^.mode <> 'r') then begin gzread := Z_STREAM_ERROR; exit; end; if (s^.z_err = Z_DATA_ERROR) or (s^.z_err = Z_ERRNO) then begin gzread := -1; exit; end; if (s^.z_err = Z_STREAM_END) then begin gzread := 0; { EOF } exit; end; s^.stream.next_out := Pbyte(buf); s^.stream.avail_out := len; while (s^.stream.avail_out <> 0) do begin if (s^.transparent = true) then begin { Copy first the lookahead bytes: } n := s^.stream.avail_in; if (n > s^.stream.avail_out) then n := s^.stream.avail_out; if (n > 0) then begin move(s^.stream.next_in^,s^.stream.next_out^,n); inc (s^.stream.next_out, n); inc (s^.stream.next_in, n); dec (s^.stream.avail_out, n); dec (s^.stream.avail_in, n); end; if (s^.stream.avail_out > 0) then begin blockread (s^.gzfile, s^.stream.next_out^, s^.stream.avail_out, bytes); dec (s^.stream.avail_out, cardinal(bytes)); end; dec (len, s^.stream.avail_out); inc (s^.stream.total_in, cardinal(len)); inc (s^.stream.total_out, cardinal(len)); gzread := integer(len); exit; end; { IF transparent } if (s^.stream.avail_in = 0) and (s^.z_eof = false) then begin {$I-} blockread (s^.gzfile, s^.inbuf^, Z_BUFSIZE, s^.stream.avail_in); {$I+} if (s^.stream.avail_in = 0) then begin s^.z_eof := true; if (IOResult <> 0) then begin s^.z_err := Z_ERRNO; break; end; end; s^.stream.next_in := s^.inbuf; end; s^.z_err := inflate(s^.stream, Z_NO_FLUSH); if (s^.z_err = Z_STREAM_END) then begin crclen := 0; next_out := s^.stream.next_out; while (next_out <> start ) do begin dec (next_out); inc (crclen); { Hack because Pascal cannot substract pointers } end; { Check CRC and original size } s^.crc := crc32(s^.crc, start, crclen); start := s^.stream.next_out; filecrc := getLong (s); filelen := getLong (s); if (s^.crc <> filecrc) or (s^.stream.total_out <> filelen) then s^.z_err := Z_DATA_ERROR else begin { Check for concatenated .gz files: } check_header(s); if (s^.z_err = Z_OK) then begin total_in := s^.stream.total_in; total_out := s^.stream.total_out; inflateReset (s^.stream); s^.stream.total_in := total_in; s^.stream.total_out := total_out; s^.crc := crc32 (0, nil, 0); end; end; {IF-THEN-ELSE} end; if (s^.z_err <> Z_OK) or (s^.z_eof = true) then break; end; {WHILE} crclen := 0; next_out := s^.stream.next_out; while (next_out <> start ) do begin dec (next_out); inc (crclen); { Hack because Pascal cannot substract pointers } end; s^.crc := crc32 (s^.crc, start, crclen); gzread := integer(len - s^.stream.avail_out); end; { GZGETC ==================================================================== Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. ============================================================================} function gzgetc (f:gzfile) : integer; var c:byte; begin if (gzread (f,@c,1) = 1) then gzgetc := c else gzgetc := -1; end; { GZGETS ==================================================================== Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then Null-terminated. gzgets returns buf, or nil in case of error. The current implementation is not optimized at all. ============================================================================} function gzgets (f:gzfile; buf:Pchar; len:integer) : Pchar; var b : Pchar; { start of buffer } bytes : integer; { number of bytes read by gzread } gzchar : char; { char read by gzread } begin if (buf = nil) or (len <= 0) then begin gzgets := nil; exit; end; b := buf; repeat dec (len); bytes := gzread (f, buf, 1); gzchar := buf^; inc (buf); until (len = 0) or (bytes <> 1) or (gzchar = Chr(13)); buf^ := Chr(0); if (b = buf) and (len > 0) then gzgets := nil else gzgets := b; end; {$IFNDEF NO_DEFLATE} { GZWRITE =================================================================== Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes actually written (0 in case of error). ============================================================================} function gzwrite (f:gzfile; buf:pointer; len:cardinal) : integer; var s : gz_streamp; written : integer; begin s := gz_streamp(f); if (s = nil) or (s^.mode <> 'w') then begin gzwrite := Z_STREAM_ERROR; exit; end; s^.stream.next_in := Pbyte(buf); s^.stream.avail_in := len; while (s^.stream.avail_in <> 0) do begin if (s^.stream.avail_out = 0) then begin s^.stream.next_out := s^.outbuf; blockwrite (s^.gzfile, s^.outbuf^, Z_BUFSIZE, written); if (written <> Z_BUFSIZE) then begin s^.z_err := Z_ERRNO; break; end; s^.stream.avail_out := Z_BUFSIZE; end; s^.z_err := deflate(s^.stream, Z_NO_FLUSH); if (s^.z_err <> Z_OK) then break; end; {WHILE} s^.crc := crc32(s^.crc, buf, len); gzwrite := integer(len - s^.stream.avail_in); end; { =========================================================================== Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). } {$IFDEF GZ_FORMAT_STRING} function gzprintf (zfile : gzFile; const format : string; a : array of integer) : integer; var buf : array[0..Z_PRINTF_BUFSIZE-1] of char; len : integer; begin {$ifdef HAS_snprintf} snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); {$else} sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); {$endif} len := strlen(buf); { old sprintf doesn't return the nb of bytes written } if (len <= 0) return 0; gzprintf := gzwrite(file, buf, len); end; {$ENDIF} { GZPUTC ==================================================================== Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. ============================================================================} function gzputc (f:gzfile; c:char) : integer; begin if (gzwrite (f,@c,1) = 1) then {$IFDEF FPC} gzputc := integer(ord(c)) {$ELSE} gzputc := integer(c) {$ENDIF} else gzputc := -1; end; { GZPUTS ==================================================================== Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. ============================================================================} function gzputs (f:gzfile; s:Pchar) : integer; begin gzputs := gzwrite (f, pointer(s), strlen(s)); end; { DO_FLUSH ================================================================== Flushes all pending output into the compressed file. The parameter flush is as in the zdeflate() function. ============================================================================} function do_flush (f:gzfile; flush:integer) : integer; var len : cardinal; done : boolean; s : gz_streamp; written : integer; begin done := false; s := gz_streamp(f); if (s = nil) or (s^.mode <> 'w') then begin do_flush := Z_STREAM_ERROR; exit; end; s^.stream.avail_in := 0; { should be zero already anyway } while true do begin len := Z_BUFSIZE - s^.stream.avail_out; if (len <> 0) then begin {$I-} blockwrite(s^.gzfile, s^.outbuf^, len, written); {$I+} if (written <> len) then begin s^.z_err := Z_ERRNO; do_flush := Z_ERRNO; exit; end; s^.stream.next_out := s^.outbuf; s^.stream.avail_out := Z_BUFSIZE; end; if (done = true) then break; s^.z_err := deflate(s^.stream, flush); { Ignore the second of two consecutive flushes: } if (len = 0) and (s^.z_err = Z_BUF_ERROR) then s^.z_err := Z_OK; { deflate has finished flushing only when it hasn't used up all the available space in the output buffer: } done := (s^.stream.avail_out <> 0) or (s^.z_err = Z_STREAM_END); if (s^.z_err <> Z_OK) and (s^.z_err <> Z_STREAM_END) then break; end; {WHILE} if (s^.z_err = Z_STREAM_END) then do_flush:=Z_OK else do_flush:=s^.z_err; end; { GZFLUSH =================================================================== Flushes all pending output into the compressed file. The parameter flush is as in the zdeflate() function. The return value is the zlib error number (see function gzerror below). gzflush returns Z_OK if the flush parameter is Z_FINISH and all output could be flushed. gzflush should be called only when strictly necessary because it can degrade compression. ============================================================================} function gzflush (f:gzfile; flush:integer) : integer; var err : integer; s : gz_streamp; begin s := gz_streamp(f); err := do_flush (f, flush); if (err <> 0) then begin gzflush := err; exit; end; if (s^.z_err = Z_STREAM_END) then gzflush := Z_OK else gzflush := s^.z_err; end; {$ENDIF} (* NO DEFLATE *) { GZREWIND ================================================================== Rewinds input file. ============================================================================} function gzrewind (f:gzFile) : integer; var s:gz_streamp; begin s := gz_streamp(f); if (s = nil) or (s^.mode <> 'r') then begin gzrewind := -1; exit; end; s^.z_err := Z_OK; s^.z_eof := false; s^.stream.avail_in := 0; s^.stream.next_in := s^.inbuf; if (s^.startpos = 0) then begin { not a compressed file } {$I-} seek (s^.gzfile, 0); {$I+} gzrewind := 0; exit; end; inflateReset(s^.stream); {$I-} seek (s^.gzfile, s^.startpos); {$I+} gzrewind := integer(IOResult); exit; end; { GZSEEK ==================================================================== Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes from the beginning of the uncompressed stream. gzseek returns the resulting offset, or -1 in case of error. SEEK_END is not implemented, returns error. In this version of the library, gzseek can be extremely slow. ============================================================================} function gzseek (f:gzfile; offset:z_off_t; whence:integer) : z_off_t; var s : gz_streamp; size : cardinal; begin s := gz_streamp(f); if (s = nil) or (whence = SEEK_END) or (s^.z_err = Z_ERRNO) or (s^.z_err = Z_DATA_ERROR) then begin gzseek := z_off_t(-1); exit; end; if (s^.mode = 'w') then begin {$IFDEF NO_DEFLATE} gzseek := z_off_t(-1); exit; {$ELSE} if (whence = SEEK_SET) then dec(offset, s^.stream.total_out); if (offset < 0) then begin; gzseek := z_off_t(-1); exit; end; { At this point, offset is the number of zero bytes to write. } if s^.inbuf=nil then begin getmem(s^.inbuf,Z_BUFSIZE); fillchar(s^.inbuf^,Z_BUFSIZE,0); end; while (offset > 0) do begin size := Z_BUFSIZE; if (offset < Z_BUFSIZE) then size := cardinal(offset); size := gzwrite(f, s^.inbuf, size); if (size = 0) then begin gzseek := z_off_t(-1); exit; end; dec (offset,size); end; gzseek := z_off_t(s^.stream.total_in); exit; {$ENDIF} end; { Rest of function is for reading only } { compute absolute position } if (whence = SEEK_CUR) then inc (offset, s^.stream.total_out); if (offset < 0) then begin gzseek := z_off_t(-1); exit; end; if (s^.transparent = true) then begin s^.stream.avail_in := 0; s^.stream.next_in := s^.inbuf; {$I-} seek (s^.gzfile, offset); {$I+} if (IOResult <> 0) then begin gzseek := z_off_t(-1); exit; end; s^.stream.total_in := cardinal(offset); s^.stream.total_out := cardinal(offset); gzseek := z_off_t(offset); exit; end; { For a negative seek, rewind and use positive seek } if (cardinal(offset) >= s^.stream.total_out) then dec (offset, s^.stream.total_out) else if (gzrewind(f) <> 0) then begin gzseek := z_off_t(-1); exit; end; { offset is now the number of bytes to skip. } if (offset <> 0) and (s^.outbuf = nil) then GetMem (s^.outbuf, Z_BUFSIZE); while (offset > 0) do begin size := Z_BUFSIZE; if (offset < Z_BUFSIZE) then size := integer(offset); size := gzread (f, s^.outbuf, size); if (size <= 0) then begin gzseek := z_off_t(-1); exit; end; dec(offset, size); end; gzseek := z_off_t(s^.stream.total_out); end; { GZTELL ==================================================================== Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. ============================================================================} function gztell (f:gzfile) : z_off_t; begin gztell := gzseek (f, 0, SEEK_CUR); end; { GZEOF ===================================================================== Returns TRUE when EOF has previously been detected reading the given input stream, otherwise FALSE. ============================================================================} function gzeof (f:gzfile) : boolean; var s:gz_streamp; begin s := gz_streamp(f); if (s=nil) or (s^.mode<>'r') then gzeof := false else gzeof := s^.z_eof; end; { PUTLONG =================================================================== Outputs a Longint in LSB order to the given file ============================================================================} procedure putLong (var f:file; x:cardinal); var n : integer; c : byte; begin for n:=0 to 3 do begin c := x and $FF; blockwrite (f, c, 1); x := x shr 8; end; end; { GZCLOSE =================================================================== Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. The return value is the zlib error number (see function gzerror below). ============================================================================} function gzclose (f:gzFile) : integer; var err : integer; s : gz_streamp; begin s := gz_streamp(f); if (s = nil) then begin gzclose := Z_STREAM_ERROR; exit; end; if (s^.mode = 'w') then begin {$IFDEF NO_DEFLATE} gzclose := Z_STREAM_ERROR; exit; {$ELSE} err := do_flush (f, Z_FINISH); if (err <> Z_OK) then begin gzclose := destroy (gz_streamp(f)); exit; end; putLong (s^.gzfile, s^.crc); putLong (s^.gzfile, s^.stream.total_in); {$ENDIF} end; gzclose := destroy (gz_streamp(f)); end; { GZERROR =================================================================== Returns the error message for the last error which occured on the given compressed file. errnum is set to zlib error number. If an error occured in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. ============================================================================} function gzerror (f:gzfile; var errnum:smallint) : string; var m : string; s : gz_streamp; begin s := gz_streamp(f); if (s = nil) then begin errnum := Z_STREAM_ERROR; gzerror := zError(Z_STREAM_ERROR); end; errnum := s^.z_err; if (errnum = Z_OK) then begin gzerror := zError(Z_OK); exit; end; m := s^.stream.msg; if (errnum = Z_ERRNO) then m := ''; if (m = '') then m := zError(s^.z_err); //s^.msg := s^.path+': '+m; gzerror := 'GZ error';// s^.msg; end; procedure GZipBuffer(var FGzipFilename,FFileDestination: String;lxInBuffer: byteP;lInSize: Integer; lOverwritewarn: boolean);overload; var lTempName: string; lFdata: file; begin (*if lOverwritewarn and fileexists(FFileDestination) then begin case MessageDlg('Overwrite the file '+FFileDestination+'?', mtConfirmation,[mbYes, mbAbort], 0) of { produce the message dialog box } mrAbort: exit; end; end; //if overwrite *) lTempName := changefileext(FFileDestination,'.tmp'); assignfile(lFdata,lTempName ); filemode := 2; rewrite(lFdata,1); BlockWrite(lFdata,lxInBuffer^,lInSize); closefile(lFdata); file_compress2 (lTempName,FFileDestination ); end;//GZipBuffer procedure GZipBuffer(var FFileDestination: String;lxInBuffer: byteP;lInSize: Integer; lOverwritewarn: boolean); overload; var len,lInPos : cardinal; ioerr : integer; buf : packed array [0..Z_BUFSIZE-1] of byte; { Global uses BSS instead of stack } errorcode : byte; lensize : DWord; outfile : gzFile; mode,lDestName : string; begin if lInSize < 1 then exit; mode := 'w6 '; if not GzExt(FFileDestination) then lDestName := FFileDestination + '.gz' else lDestName := FFileDestination; outfile := gzopen (lDestName, mode); if (outfile = NIL) then begin Showmessagex('unable to create '+lDestName); exit; end; errorcode := 0; lensize := 0; lInPos := 1; while true do begin len := (lInSize-lInPos)+1; if len > Z_BUFSIZE then len := Z_BUFSIZE; if (len <= 0) then break; Move(lxInBuffer^[lInPos],buf[0],len); {$WARNINGS OFF}{Comparing signed and unsigned types} if (gzwrite (outfile, @buf, len) <> len) then begin {$WARNINGS OFF} errorcode := 2; break end; lInPos := lInPos + len; end; if (gzclose (outfile) <> 0) then errorcode := 3; //gz_compress := errorcode; end; // proc gz_compress function gz_uncompress (infile:gzFile; var outfile:file;fsize:DWord{LongWord}) : integer; var len : integer; written : Integer; buf : packed array [0..Z_BUFSIZE-1] of byte; { Global uses BSS instead of stack } errorcode : byte; lensize : DWord{LongWord}; begin errorcode := 0; //FProgress := 0; lensize := 0; //if FProgressStep > 0 then DoOnProgress; while true do begin len := gzread (infile, @buf, Z_BUFSIZE); if (len < 0) then begin errorcode := 1; break end; if (len = 0) then break; {$I-} blockwrite (outfile, buf, len, written); {$I+} {$WARNINGS OFF}{Comparing signed and unsigned types} if (written <> len) then begin {$WARNINGS ON} errorcode := 2; break end; (*if FProgressStep > 0 then begin {$WARNINGS OFF} lensize := lensize + len; if ((lensize / fsize) * 100 >= FProgress + FProgressStep) or (lensize = fsize) then begin FProgress := Trunc((lensize / fsize) * 100); DoOnProgress end {$WARNINGS ON} end *) end; {WHILE} if (gzclose (infile) <> 0{Z_OK}) then begin //if FWindowOnError then // MessageDlg('gzclose Error.', mtError, [mbAbort], 0); errorcode := 3 end; gz_uncompress := errorcode end; function Gunzip (var FFileSource,FFileDestination: string): integer; var infile : gzFile; outfile : file; ioerr : integer; errorcode : integer; fsize : DWord{LongWord}; s : gz_streamp; begin errorcode := 0; showmessagex('unGZip ' + extractfilename(FFileSource)); infile := gzopen (FFileSource, 'r'); if (infile = NIL) then begin //if FWindowOnError then // MessageDlg('Can''t open: '+FFileSource, mtError, [mbAbort], 0); errorcode := 1 end else begin s := gz_streamp(infile); fsize := FileSize( s^.gzfile); AssignFile (outfile, FFileDestination); {$I-} Rewrite (outfile,1); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin //if FWindowOnError then // MessageDlg('Can''t create: '+FFileDestination, mtError, [mbAbort], 0); errorcode := 2 end else begin { We could open all files, so time for uncompressing } gz_uncompress (infile, outfile, fsize); //if FDeleteSource then DeleteFile(FFileSource); {$I-} close (outfile); {$I+} ioerr := IOResult; if (ioerr <> 0) then begin //if FWindowOnError then // MessageDlg('Can''t close file '+FFileDestination, mtError, [mbAbort], 0); halt(1) end end end; Gunzip := errorcode end; end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/gui.inc�����������������������������������������������������0000664�0001750�0001750�00000000154�11542350054�020416� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{$DEFINE GUI} //use GUI if you are using a graphic user interface - anything else for console applications ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/GraphicsMathLibrary.pas�������������������������������������0000664�0001750�0001750�00000113416�11423560726�023560� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// The author gave written permission to distribute this file under the // same licensing terms as MRICRON. // // Graphics Math Library // // Copyright (C) 1982, 1985, 1992, 1995-1998 Earl F. Glynn, Overland Park, KS. // All Rights Reserved. E-Mail Address: EarlGlynn@att.net UNIT GraphicsMathLibrary; // Matrix/Vector Operations for 2D/3D Graphics} {$Include isgui.inc} INTERFACE USES SysUtils {$IFDEF GUI},Dialogs {$ENDIF}; CONST sizeUndefined = 1; size2D = 3; // 'size' of 2D homogeneous vector or transform matrix size3D = 4; // 'size' of 3D homogeneous vector or transform matrix TYPE EVectorError = CLASS(Exception); EMatrixError = CLASS(Exception); TAxis = (axisX, axisY, axisZ); TCoordinate = (coordCartesian, coordSpherical, coordCylindrical); TDimension = (dimen2D, dimen3D); // two- or three-dimensional TYPE TIndex = 1..4; // index of 'TMatrix' and 'TVector' TYPEs TMatrixI = // transformation 'matrix' RECORD size: TIndex; matrix: ARRAY[TIndex,TIndex] OF integer; END; TMatrix = // transformation 'matrix' RECORD size: TIndex; matrix: ARRAY[TIndex,TIndex] OF single //azx DOUBLE END; Trotation = (rotateClockwise, rotateCounterClockwise); // Normally the TVector TYPE is used to define 2D/3D homogenous // cartesian coordinates for graphics, i.e., (x,y,1) for 2D and // (x,y,z,1) for 3D. // // Cartesian coordinates can be converted to spherical (r, theta, phi), // or cylindrical coordinates (r,theta, z). Spherical or cylindrical // coordinates can be converted back to cartesian coordinates. TVector = RECORD size: TIndex; CASE INTEGER OF 0: (vector: ARRAY[TIndex] OF single); 1: (x: single; y: single; z: single; // contains 'h' for 2D cartesian vector h: single) END; TIntVector = RECORD size: TIndex; CASE INTEGER OF 0: (vector: ARRAY[TIndex] OF integer); 1: (x: integer; y: integer; z: integer; // contains 'h' for 2D cartesian vector h: integer) END; // Vector Operations // FUNCTION Vector2D (CONST xValue, yValue: DOUBLE): TVector; FUNCTION Vector3D (CONST xValue, yValue, zValue: DOUBLE): TVector; Function SameVec (const u,v: TVector): boolean; Function Eye3D: TMatrix; //returns identity matrix FUNCTION Transform (CONST u: TVector; CONST a: TMatrix): TVector; (* FUNCTION AddVectors (CONST u,v: TVector): TVector; // FUNCTION Transform (CONST u: TVector; CONST a: TMatrix): TVector; FUNCTION DotProduct (CONST u,v: TVector): DOUBLE; FUNCTION CrossProduct(CONST u,v: TVector): TVector; *) // Basic Matrix Operations FUNCTION Matrix2D (CONST m11,m12,m13, // 2D "graphics" matrix m21,m22,m23, m31,m32,m33: DOUBLE): TMatrix; FUNCTION Matrix3D (CONST m11,m12,m13,m14, // 3D "graphics" matrix m21,m22,m23,m24, m31,m32,m33,m34, m41,m42,m43,m44: DOUBLE): TMatrix; FUNCTION DotProduct (CONST u,v: TVector): DOUBLE; FUNCTION CrossProduct(CONST u,v: TVector): TVector; procedure NormalizeVector(var u: TVector); function nifti_mat33_determ( R: TMatrix ):double; //* determinant of 3x3 matrix */ procedure nifti_mat44_to_quatern( lR :TMatrix; var qb, qc, qd, qx, qy, qz, dx, dy, dz, qfac : single); FUNCTION MultiplyMatrices (CONST a,b: TMatrix): TMatrix; FUNCTION InvertMatrix3D (CONST Input:TMatrix): TMatrix; FUNCTION InvertMatrix (CONST a,b: TMatrix; VAR determinant: DOUBLE): TMatrix; // Transformation Matrices FUNCTION RotateMatrix (CONST dimension: TDimension; CONST xyz : TAxis; CONST angle : DOUBLE; CONST rotation : Trotation): TMatrix; // FUNCTION ScaleMatrix (CONST s: TVector): TMatrix; // FUNCTION TranslateMatrix (CONST t: TVector): TMatrix; FUNCTION ViewTransformMatrix (CONST coordinate: TCoordinate; CONST azimuth {or x}, elevation {or y}, distance {or z}: DOUBLE; CONST ScreenX, ScreenY, ScreenDistance: DOUBLE): TMatrix; // conversions // FUNCTION FromCartesian (CONST ToCoordinate: TCoordinate; CONST u: TVector): TVector; // FUNCTION ToCartesian (CONST FromCoordinate: TCoordinate; CONST u: TVector): TVector; //FUNCTION ToDegrees(CONST angle {radians}: DOUBLE): DOUBLE {degrees}; FUNCTION ToRadians(CONST angle {degrees}: DOUBLE): DOUBLE {radians}; // miscellaneous FUNCTION Defuzz(CONST x: DOUBLE): DOUBLE; { FUNCTION GetFuzz: DOUBLE; PROCEDURE SetFuzz(CONST x: DOUBLE); } IMPLEMENTATION Function Eye3D: TMatrix; //returns identity matrix begin result := Matrix3D (1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1); end; // 'Transform' multiplies a row 'vector' by a transformation 'matrix' // resulting in a new row 'vector'. The 'size' of the 'vector' and 'matrix' // must agree. To save execution time, the vectors are assumed to contain // a homogeneous coordinate. FUNCTION Transform (CONST u: TVector; CONST a: TMatrix): TVector; VAR i,k : TIndex; temp: DOUBLE; BEGIN RESULT.size := a.size; IF a.size = u.size THEN BEGIN FOR i := 1 TO a.size-1 DO BEGIN temp := 0.0; FOR k := 1 TO a.size DO BEGIN temp := temp + u.vector[k]*a.matrix[k,i]; END; RESULT.vector[i] := Defuzz(temp) END; RESULT.vector[a.size] := 1.0 {assume homogeneous coordinate} END ELSE raise EMatrixError.Create('Transform multiply error') END {Transform}; VAR fuzz : DOUBLE; FUNCTION DotProduct (CONST u,v: TVector): DOUBLE; VAR i: INTEGER; BEGIN IF (u.size = v.size) THEN BEGIN RESULT := 0.0; FOR i := 1 TO u.size-1 DO BEGIN RESULT := RESULT + u.vector[i] * v.vector[i]; END; END ELSE RAISE EMatrixError.Create('Vector dot product error') END; {DotProduct} FUNCTION CrossProduct(CONST u,v: TVector): TVector; BEGIN IF (u.size = v.size) AND (u.size = size3D) THEN BEGIN RESULT := Vector3D( u.y*v.z - v.y*u.z, -u.x*v.z + v.x*u.z, u.x*v.y - v.x*u.y) END ELSE RAISE EMatrixError.Create('Vector cross product error') END; {CrossProduct} procedure NormalizeVector(var u: TVector); var lSum: double; BEGIN lSum := sqrt((u.x*u.x)+(u.y*u.y)+(u.z*u.z)); if lSum <> 0 then u := Vector3D( u.x/lSum, u.y/lSum, u.z/lSum) END; {CrossProduct} procedure FromMatrix (M: TMatrix; var m11,m12,m13, m21,m22,m23, m31,m32,m33: DOUBLE) ; BEGIN m11 := M.Matrix[1,1]; m12 := M.Matrix[1,2]; m13 := M.Matrix[1,3]; m21 := M.Matrix[2,1]; m22 := M.Matrix[2,2]; m23 := M.Matrix[2,3]; m31 := M.Matrix[3,1]; m32 := M.Matrix[3,2]; m33 := M.Matrix[3,3]; END {FromMatrix3D}; function nifti_mat33_determ( R: TMatrix ):double; //* determinant of 3x3 matrix */ begin result := r.matrix[1,1]*r.matrix[2,2]*r.matrix[3,3] -r.matrix[1,1]*r.matrix[3,2]*r.matrix[2,3] -r.matrix[2,1]*r.matrix[1,2]*r.matrix[3,3] +r.matrix[2,1]*r.matrix[3,2]*r.matrix[1,3] +r.matrix[3,1]*r.matrix[1,2]*r.matrix[2,3] -r.matrix[3,1]*r.matrix[2,2]*r.matrix[1,3] ; end; function nifti_mat33_rownorm( A: TMatrix ): single; //* max row norm of 3x3 matrix */ var r1,r2,r3: single ; begin r1 := abs(A.matrix[1,1])+abs(A.matrix[1,2])+abs(A.matrix[1,3]) ; r2 := abs(A.matrix[2,1])+abs(A.matrix[2,2])+abs(A.matrix[2,3]) ; r3 := abs(A.matrix[3,1])+abs(A.matrix[3,2])+abs(A.matrix[3,3]) ; if( r1 < r2 ) then r1 := r2 ; if( r1 < r3 ) then r1 := r3 ; result := r1 ; end; function nifti_mat33_colnorm( A: TMatrix ): single; //* max column norm of 3x3 matrix */ var r1,r2,r3: single ; begin r1 := abs(A.matrix[1,1])+abs(A.matrix[2,1])+abs(A.matrix[3,1]) ; r2 := abs(A.matrix[1,2])+abs(A.matrix[2,2])+abs(A.matrix[3,2]) ; r3 := abs(A.matrix[1,3])+abs(A.matrix[2,3])+abs(A.matrix[3,3]) ; if( r1 < r2 ) then r1 := r2 ; if( r1 < r3 ) then r1 := r3 ; result := r1 ; end; function nifti_mat33_inverse( R: TMatrix ): TMatrix; //* inverse of 3x3 matrix */ var r11,r12,r13,r21,r22,r23,r31,r32,r33 , deti: double ; Q: TMatrix ; begin FromMatrix(R,r11,r12,r13,r21,r22,r23,r31,r32,r33); deti := r11*r22*r33-r11*r32*r23-r21*r12*r33 +r21*r32*r13+r31*r12*r23-r31*r22*r13 ; if( deti <> 0.0 ) then deti := 1.0 / deti ; Q.matrix[1,1] := deti*( r22*r33-r32*r23) ; Q.matrix[1,2] := deti*(-r12*r33+r32*r13) ; Q.matrix[1,3] := deti*( r12*r23-r22*r13) ; Q.matrix[2,1] := deti*(-r21*r33+r31*r23) ; Q.matrix[2,2] := deti*( r11*r33-r31*r13) ; Q.matrix[2,3] := deti*(-r11*r23+r21*r13) ; Q.matrix[3,1] := deti*( r21*r32-r31*r22) ; Q.matrix[3,2] := deti*(-r11*r32+r31*r12) ; Q.matrix[3,3] := deti*( r11*r22-r21*r12) ; result := Q; end; (*procedure ReportMatrix (lStr: string;lM:TMatrix); begin showmessage(lStr); showmessage( RealToStr(lM.matrix[1,1],6)+','+RealToStr(lM.matrix[1,2],6)+','+RealToStr(lM.matrix[1,3],6)+','+RealToStr(lM.matrix[1,4],6)); showmessage( RealToStr(lM.matrix[2,1],6)+','+RealToStr(lM.matrix[2,2],6)+','+RealToStr(lM.matrix[2,3],6)+','+RealToStr(lM.matrix[2,4],6)); showmessage( RealToStr(lM.matrix[3,1],6)+','+RealToStr(lM.matrix[3,2],6)+','+RealToStr(lM.matrix[3,3],6)+','+RealToStr(lM.matrix[3,4],6)); showmessage( RealToStr(lM.matrix[4,1],6)+','+RealToStr(lM.matrix[4,2],6)+','+RealToStr(lM.matrix[4,3],6)+','+RealToStr(lM.matrix[4,4],6)); end;*) (*---------------------------------------------------------------------------*) (*! polar decomposition of a 3x3 matrix This finds the closest orthogonal matrix to input A (in both the Frobenius and L2 norms). Algorithm is that from NJ Higham, SIAM J Sci Stat Comput, 7:1160-1174. *)(*-------------------------------------------------------------------------*) function nifti_mat33_polar( A: TMatrix ): TMatrix; const dif: single=1.0 ; k: integer=0 ; var X , Y , Z: TMatrix ; alp,bet,gam,gmi : single; begin X := A ; (* force matrix to be nonsingular *) //reportmatrix('x',X); gam := nifti_mat33_determ(X) ; while( gam = 0.0 )do begin (* perturb matrix *) gam := 0.00001 * ( 0.001 + nifti_mat33_rownorm(X) ) ; X.matrix[1,1] := X.matrix[1,1]+gam ; X.matrix[2,2] := X.matrix[2,2]+gam ; X.matrix[3,3] := X.matrix[3,3] +gam ; gam := nifti_mat33_determ(X) ; end; while true do begin Y := nifti_mat33_inverse(X) ; if( dif > 0.3 )then begin (* far from convergence *) alp := sqrt( nifti_mat33_rownorm(X) * nifti_mat33_colnorm(X) ) ; bet := sqrt( nifti_mat33_rownorm(Y) * nifti_mat33_colnorm(Y) ) ; gam := sqrt( bet / alp ) ; gmi := 1.0 / gam ; end else begin gam := 1.0; gmi := 1.0 ; (* close to convergence *) end; Z.matrix[1,1] := 0.5 * ( gam*X.matrix[1,1] + gmi*Y.matrix[1,1] ) ; Z.matrix[1,2] := 0.5 * ( gam*X.matrix[1,2] + gmi*Y.matrix[2,1] ) ; Z.matrix[1,3] := 0.5 * ( gam*X.matrix[1,3] + gmi*Y.matrix[3,1] ) ; Z.matrix[2,1] := 0.5 * ( gam*X.matrix[2,1] + gmi*Y.matrix[1,2] ) ; Z.matrix[2,2] := 0.5 * ( gam*X.matrix[2,2] + gmi*Y.matrix[2,2] ) ; Z.matrix[2,3] := 0.5 * ( gam*X.matrix[2,3] + gmi*Y.matrix[3,2] ) ; Z.matrix[3,1] := 0.5 * ( gam*X.matrix[3,1] + gmi*Y.matrix[1,3] ) ; Z.matrix[3,2] := 0.5 * ( gam*X.matrix[3,2] + gmi*Y.matrix[2,3] ) ; Z.matrix[3,3] := 0.5 * ( gam*X.matrix[3,3] + gmi*Y.matrix[3,3] ) ; dif := abs(Z.matrix[1,1]-X.matrix[1,1])+abs(Z.matrix[1,2]-X.matrix[1,2]) +abs(Z.matrix[1,3]-X.matrix[1,3])+abs(Z.matrix[2,1]-X.matrix[2,1]) +abs(Z.matrix[2,2]-X.matrix[2,2])+abs(Z.matrix[2,3]-X.matrix[2,3]) +abs(Z.matrix[3,1]-X.matrix[3,1])+abs(Z.matrix[3,2]-X.matrix[3,2]) +abs(Z.matrix[3,3]-X.matrix[3,3]) ; k := k+1 ; if( k > 100) or (dif < 3.e-6 ) then begin result := Z; break ; (* convergence or exhaustion *) end; X := Z ; end; result := Z ; end; procedure nifti_mat44_to_quatern( lR :TMatrix; var qb, qc, qd, qx, qy, qz, dx, dy, dz, qfac : single); var r11,r12,r13 , r21,r22,r23 , r31,r32,r33, xd,yd,zd , a,b,c,d : double; P,Q: TMatrix; //3x3 begin (* offset outputs are read write out of input matrix *) qx := lR.matrix[1,4]; qy := lR.matrix[2,4]; qz := lR.matrix[3,4]; (* load 3x3 matrix into local variables *) FromMatrix(lR,r11,r12,r13,r21,r22,r23,r31,r32,r33); (* compute lengths of each column; these determine grid spacings *) xd := sqrt( r11*r11 + r21*r21 + r31*r31 ) ; yd := sqrt( r12*r12 + r22*r22 + r32*r32 ) ; zd := sqrt( r13*r13 + r23*r23 + r33*r33 ) ; (* if a column length is zero, patch the trouble *) if( xd = 0.0 )then begin r11 := 1.0 ; r21 := 0; r31 := 0.0 ; xd := 1.0 ; end; if( yd = 0.0 )then begin r22 := 1.0 ; r12 := 0; r32 := 0.0 ; yd := 1.0 ; end; if( zd = 0.0 )then begin r33 := 1.0 ; r13 := 0; r23 := 0.0 ; zd := 1.0 ; end; (* assign the output lengths *) dx := xd; dy := yd; dz := zd; (* normalize the columns *) r11 := r11/xd ; r21 := r21/xd ; r31 := r31/xd ; r12 := r12/yd ; r22 := r22/yd ; r32 := r32/yd ; r13 := r13/zd ; r23 := r23/zd ; r33 := r33/zd ; (* At this point, the matrix has normal columns, but we have to allow for the fact that the hideous user may not have given us a matrix with orthogonal columns. So, now find the orthogonal matrix closest to the current matrix. One reason for using the polar decomposition to get this orthogonal matrix, rather than just directly orthogonalizing the columns, is so that inputting the inverse matrix to R will result in the inverse orthogonal matrix at this point. If we just orthogonalized the columns, this wouldn't necessarily hold. *) Q := Matrix2D (r11,r12,r13, // 2D "graphics" matrix r21,r22,r23, r31,r32,r33); P := nifti_mat33_polar(Q) ; (* P is orthog matrix closest to Q *) FromMatrix(P,r11,r12,r13,r21,r22,r23,r31,r32,r33); //ReportMatrix('xxx',Q); //ReportMatrix('svd',P); (* [ r11 r12 r13 ] *) (* at this point, the matrix [ r21 r22 r23 ] is orthogonal *) (* [ r31 r32 r33 ] *) (* compute the determinant to determine if it is proper *) zd := r11*r22*r33-r11*r32*r23-r21*r12*r33 +r21*r32*r13+r31*r12*r23-r31*r22*r13 ; (* should be -1 or 1 *) if( zd > 0 )then begin (* proper *) qfac := 1.0 ; end else begin (* improper ==> flip 3rd column *) qfac := -1.0 ; r13 := -r13 ; r23 := -r23 ; r33 := -r33 ; end; (* now, compute quaternion parameters *) a := r11 + r22 + r33 + 1.0; if( a > 0.5 ) then begin (* simplest case *) a := 0.5 * sqrt(a) ; b := 0.25 * (r32-r23) / a ; c := 0.25 * (r13-r31) / a ; d := 0.25 * (r21-r12) / a ; end else begin (* trickier case *) xd := 1.0 + r11 - (r22+r33) ; (* 4*b*b *) yd := 1.0 + r22 - (r11+r33) ; (* 4*c*c *) zd := 1.0 + r33 - (r11+r22) ; (* 4*d*d *) if( xd > 1.0 ) then begin b := 0.5 * sqrt(xd) ; c := 0.25* (r12+r21) / b ; d := 0.25* (r13+r31) / b ; a := 0.25* (r32-r23) / b ; end else if( yd > 1.0 ) then begin c := 0.5 * sqrt(yd) ; b := 0.25* (r12+r21) / c ; d := 0.25* (r23+r32) / c ; a := 0.25* (r13-r31) / c ; end else begin d := 0.5 * sqrt(zd) ; b := 0.25* (r13+r31) / d ; c := 0.25* (r23+r32) / d ; a := 0.25* (r21-r12) / d ; end; if( a < 0.0 )then begin b:=-b ; c:=-c ; d:=-d; {a:=-a; not used} end; end; qb := b ; qc := c ; qd := d ; end; //nifti_mat44_to_quatern // ************************* Vector Operations ************************* // This procedure defines two-dimensional homogeneous coordinates (x,y,1) // as a single 'vector' data element 'u'. The 'size' of a two-dimensional // homogenous vector is 3. // This procedure defines three-dimensional homogeneous coordinates // (x,y,z,1) as a single 'vector' data element 'u'. The 'size' of a // three-dimensional homogenous vector is 4. Function SameVec (const u,v: TVector): boolean; begin if (u.x=v.x) and (u.y=v.y) and (u.z=v.z) then result := true else result := false; end; FUNCTION Vector3D (CONST xValue, yValue, zValue: DOUBLE): TVector; BEGIN WITH RESULT DO BEGIN x := xValue; y := yValue; z := zValue; h := 1.0; // homogeneous coordinate size := size3D END END {Vector3D}; // AddVectors adds two vectors defined with homogeneous coordinates. FUNCTION AddVectors (CONST u,v: TVector): TVector; VAR i: TIndex; BEGIN IF (u.size IN [size2D..size3D]) AND (v.size IN [size2D..size3D]) AND (u.size = v.size) THEN BEGIN RESULT.size := u.size; FOR i := 1 TO u.size-1 DO {2D + 2D = 2D or 3D + 3D = 3D} BEGIN RESULT.vector[i] := u.vector[i] + v.vector[i] END; RESULT.vector[u.size] := 1.0 {homogeneous coordinate} END ELSE raise EVectorError.Create('Vector Addition Mismatch') END {AddVectors}; // *********************** Basic Matrix Operations ********************** FUNCTION Matrix2D (CONST m11,m12,m13, m21,m22,m23, m31,m32,m33: DOUBLE): TMatrix; BEGIN WITH RESULT DO BEGIN matrix[1,1] := m11; matrix[1,2] := m12; matrix[1,3] := m13; matrix[2,1] := m21; matrix[2,2] := m22; matrix[2,3] := m23; matrix[3,1] := m31; matrix[3,2] := m32; matrix[3,3] := m33; size := size2D END END {Matrix2D}; FUNCTION Matrix3D (CONST m11,m12,m13,m14, m21,m22,m23,m24, m31,m32,m33,m34, m41,m42,m43,m44: DOUBLE): TMatrix; BEGIN WITH RESULT DO BEGIN matrix[1,1] := m11; matrix[1,2] := m12; matrix[1,3] := m13; matrix[1,4] := m14; matrix[2,1] := m21; matrix[2,2] := m22; matrix[2,3] := m23; matrix[2,4] := m24; matrix[3,1] := m31; matrix[3,2] := m32; matrix[3,3] := m33; matrix[3,4] := m34; matrix[4,1] := m41; matrix[4,2] := m42; matrix[4,3] := m43; matrix[4,4] := m44; size := size3D END END {Matrix3D}; // Compound geometric transformation matrices can be formed by multiplying // simple transformation matrices. This procedure only multiplies together // matrices for two- or three-dimensional transformations, i.e., 3x3 or 4x4 // matrices. The multiplier and multiplicand must be of the same dimension. FUNCTION MultiplyMatrices (CONST a,b: TMatrix): TMatrix; VAR i,j,k: TIndex; temp : DOUBLE; BEGIN RESULT.size := a.size; IF a.size = b.size THEN FOR i := 1 TO a.size DO BEGIN FOR j := 1 TO a.size DO BEGIN temp := 0.0; FOR k := 1 TO a.size DO BEGIN temp := temp + a.matrix[i,k]*b.matrix[k,j]; END; RESULT.matrix[i,j] := Defuzz(temp) END END {$IFDEF GUI} ELSE Showmessage('MultiplyMatricesError'+inttostr(a.size)+'x'+inttostr(b.size)); {$ELSE} else writeln('MultiplyMatricesError'+inttostr(a.size)+'x'+inttostr(b.size)); {$ENDIF} //ELSE EMatrixError.Create('MultiplyMatrices error') END {MultiplyMatrices}; PROCEDURE lubksb(a: {glnpbynp}TMatrix; n: integer; indx: TIntVector; VAR b: TVector); VAR j,ip,ii,i: integer; sum: double; BEGIN ii := 0; FOR i := 1 TO n DO BEGIN ip := indx.vector[i]; sum := b.vector[ip]; b.vector[ip] := b.vector[i]; IF (ii <> 0) THEN BEGIN FOR j := ii TO i-1 DO BEGIN sum := sum-a.matrix[i,j]*b.vector[j] END END ELSE IF (sum <> 0.0) THEN BEGIN ii := i END; b.vector[i] := sum END; FOR i := n DOWNTO 1 DO BEGIN sum := b.vector[i]; IF (i < n) THEN BEGIN FOR j := i+1 TO n DO BEGIN sum := sum-a.matrix[i,j]*b.vector[j] END END; b.vector[i] := sum/a.matrix[i,i] END end; PROCEDURE ludcmp(VAR a: TMatrix; n: integer; VAR indx: TIntVector; VAR d: double); CONST tiny=1.0e-20; VAR k,j,imax,i: integer; sum,dum,big: real; vv: TVector; BEGIN d := 1.0; FOR i := 1 TO n DO BEGIN big := 0.0; FOR j := 1 TO n DO IF (abs(a.matrix[i,j]) > big) THEN big := abs(a.matrix[i,j]); IF (big = 0.0) THEN BEGIN writeln('pause in LUDCMP - singular matrix'); readln END; vv.vector[i] := 1.0/big END; FOR j := 1 TO n DO BEGIN FOR i := 1 TO j-1 DO BEGIN sum := a.matrix[i,j]; FOR k := 1 TO i-1 DO BEGIN sum := sum-a.matrix[i,k]*a.matrix[k,j] END; a.matrix[i,j] := sum END; big := 0.0; FOR i := j TO n DO BEGIN sum := a.matrix[i,j]; FOR k := 1 TO j-1 DO BEGIN sum := sum-a.matrix[i,k]*a.matrix[k,j] END; a.matrix[i,j] := sum; dum := vv.vector[i]*abs(sum); IF (dum > big) THEN BEGIN big := dum; imax := i END END; IF (j <> imax) THEN BEGIN FOR k := 1 TO n DO BEGIN dum := a.matrix[imax,k]; a.matrix[imax,k] := a.matrix[j,k]; a.matrix[j,k] := dum END; d := -d; vv.vector[imax] := vv.vector[j] END; indx.vector[j] := imax; IF (a.matrix[j,j] = 0.0) THEN a.matrix[j,j] := tiny; IF (j <> n) THEN BEGIN dum := 1.0/a.matrix[j,j]; FOR i := j+1 TO n DO BEGIN a.matrix[i,j] := a.matrix[i,j]*dum END END END; END; FUNCTION InvertMatrix3D (CONST Input:TMatrix): TMatrix; var n,i,j: integer; d: double; indx: tIntVector; col: tvector; a,y: TMatrix; begin a:= Input; n := 3; y.size := size3D; ludcmp(a,n,indx,d); for j := 1 to n do begin for i := 1 to n do col.vector[i] := 0; col.vector[j] := 1.0; lubksb(a,n,indx,col); for i := 1 to n do y.matrix[i,j] := col.vector[i]; end; result := y; end; // This procedure inverts a general transformation matrix. The user need // not form an inverse geometric transformation by keeping a product of // the inverses of simple geometric transformations: translations, rotations // and scaling. A determinant of zero indicates no inverse is possible for // a singular matrix. FUNCTION InvertMatrix (CONST a,b: TMatrix; VAR determinant: DOUBLE): TMatrix; VAR c : TMatrix; i,i_pivot: TIndex; i_flag : ARRAY[TIndex] OF BOOLEAN; j,j_pivot: TIndex; j_flag : ARRAY[TIndex] OF BOOLEAN; modulus : DOUBLE; n : TIndex; pivot : DOUBLE; pivot_col: ARRAY[TIndex] OF TIndex; pivot_row: ARRAY[TIndex] OF TIndex; temporary: DOUBLE; BEGIN c := a; // The matrix inversion algorithm used here WITH c DO // is similar to the "maximum pivot strategy" BEGIN // described in "Applied Numerical Methods" FOR i := 1 TO size DO // by Carnahan, Luther and Wilkes, BEGIN // pp. 282-284. i_flag[i] := TRUE; j_flag[i] := TRUE END; modulus := 1.0; i_pivot := 1; // avoid initialization warning j_pivot := 1; // avoid initialization warning FOR n := 1 TO size DO BEGIN pivot := 0.0; IF ABS(modulus) > 0.0 THEN BEGIN FOR i := 1 TO size DO IF i_flag[i] THEN FOR j := 1 TO size DO IF j_flag[j] THEN IF ABS(matrix[i,j]) > ABS(pivot) THEN BEGIN pivot := matrix[i,j]; // largest value on which to pivot i_pivot := i; // indices of pivot element j_pivot := j END; IF Defuzz(pivot) = 0 // If pivot is too small, consider THEN modulus := 0 // the matrix to be singular ELSE BEGIN pivot_row[n] := i_pivot; pivot_col[n] := j_pivot; i_flag[i_pivot] := FALSE; j_flag[j_pivot] := FALSE; FOR i := 1 TO size DO IF i <> i_pivot THEN FOR j := 1 TO size DO // pivot column unchanged for elements IF j <> j_pivot // not in pivot row or column ... THEN matrix[i,j] := (matrix[i,j]*matrix[i_pivot,j_pivot] - matrix[i_pivot,j]*matrix[i,j_pivot]) / modulus; // 2x2 minor / modulus FOR j := 1 TO size DO IF j <> j_pivot // change signs of elements in pivot row THEN matrix[i_pivot,j] := -matrix[i_pivot,j]; temporary := modulus; // exchange pivot element and modulus modulus := matrix[i_pivot,j_pivot]; matrix[i_pivot,j_pivot] := temporary END END END {FOR n} END {WITH}; determinant := Defuzz(modulus); IF determinant <> 0 THEN BEGIN RESULT.size := c.size; // The matrix inverse must be unscrambled FOR i := 1 TO c.size DO // if pivoting was not along main diagonal. FOR j := 1 TO c.size DO RESULT.matrix[pivot_row[i],pivot_col[j]] := Defuzz(c.matrix[i,j]/determinant) END ELSE EMatrixError.Create('InvertMatrix error') END {InvertMatrix}; // *********************** Transformation Matrices ******************** // This procedure defines a matrix for a two- or three-dimensional rotation. // To avoid possible confusion in the sense of the rotation, 'rotateClockwise' // or 'roCounterlcockwise' must always be specified along with the axis // of rotation. Two-dimensional rotations are assumed to be about the z-axis // in the x-y plane. // // A rotation about an arbitrary axis can be performed with the following // steps: // (1) Translate the object into a new coordinate system where (x,y,z) // maps into the origin (0,0,0). // (2) Perform appropriate rotations about the x and y axes of the // coordinate system so that the unit vector (a,b,c) is mapped into // the unit vector along the z axis. // (3) Perform the desired rotation about the z-axis of the new // coordinate system. // (4) Apply the inverse of step (2). // (5) Apply the inverse of step (1). FUNCTION RotateMatrix (CONST dimension: TDimension; CONST xyz : TAxis; CONST angle : DOUBLE; CONST rotation : Trotation): TMatrix; VAR cosx : DOUBLE; sinx : DOUBLE; TempAngle: DOUBLE; BEGIN TempAngle := angle; // Use TempAngle since "angle" is CONST parameter IF rotation = rotateCounterClockwise THEN TempAngle := -TempAngle; cosx := Defuzz( COS(TempAngle) ); sinx := Defuzz( SIN(TempAngle) ); CASE dimension OF dimen2D: CASE xyz OF axisX,axisY: EMatrixError.Create('Invalid 2D rotation matrix. Specify axisZ'); axisZ: RESULT := Matrix2D ( cosx, -sinx, 0, sinx, cosx, 0, 0, 0, 1) END; dimen3D: CASE xyz OF axisX: RESULT := Matrix3D ( 1, 0, 0, 0, 0, cosx, -sinx, 0, 0, sinx, cosx, 0, 0, 0, 0, 1); axisY: RESULT := Matrix3D ( cosx, 0, sinx, 0, 0, 1, 0, 0, -sinx, 0, cosx, 0, 0, 0, 0, 1); axisZ: RESULT := Matrix3D ( cosx, -sinx, 0, 0, sinx, cosx, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); END END END {RotateMatrix}; // 'ScaleMatrix' accepts a 'vector' containing the scaling factors for // each of the dimensions and creates a scaling matrix. The size // of the vector dictates the size of the resulting matrix. FUNCTION ScaleMatrix (CONST s: TVector): TMatrix; BEGIN CASE s.size OF size2D: RESULT := Matrix2D (s.x, 0, 0, 0, s.y, 0, 0, 0, 1); size3D: RESULT := Matrix3D (s.x, 0, 0, 0, 0, s.y, 0, 0, 0, 0, s.z, 0, 0, 0, 0, 1) END END {ScaleMatrix}; // 'TranslateMatrix' defines a translation transformation matrix. The // components of the vector 't' determine the translation components. // (Note: 'Translate' here is from kinematics in physics.) FUNCTION TranslateMatrix (CONST t: TVector): TMatrix; BEGIN CASE t.size OF size2D: RESULT := Matrix2D ( 1, 0, 0, 0, 1, 0, t.x, t.y, 1); size3D: RESULT := Matrix3D ( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, t.x, t.y, t.z, 1) END END {TranslateMatrix}; // 'ViewTransformMatrix' creates a transformation matrix for changing // from world coordinates to eye coordinates. The location of the 'eye' // from the 'object' is given in spherical (azimuth,elevation,distance) // coordinates or Cartesian (x,y,z) coordinates. The size of the screen // is 'ScreenX' units horizontally and 'ScreenY' units vertically. The // eye is 'ScreenDistance' units from the viewing screen. A large ratio // 'ScreenDistance/ScreenX (or ScreenY)' specifies a narrow aperature // -- a telephoto view. Conversely, a small ratio specifies a large // aperature -- a wide-angle view. This view transform matrix is very // useful as the default three-dimensional transformation matrix. Once // set, all points are automatically transformed. FUNCTION ViewTransformMatrix (CONST coordinate: TCoordinate; CONST azimuth {or x}, elevation {or y}, distance {or z}: DOUBLE; CONST ScreenX, ScreenY, ScreenDistance: DOUBLE): TMatrix; CONST HalfPI = PI / 2.0; VAR a : TMatrix; b : TMatrix; cosm : DOUBLE; // COS(-angle) hypotenuse: DOUBLE; sinm : DOUBLE; // SIN(-angle) temporary : DOUBLE; u : TVector; x : DOUBLE ABSOLUTE azimuth; // x and azimuth are synonyms y : DOUBLE ABSOLUTE elevation; // synonyms z : DOUBLE ABSOLUTE distance; // synonyms BEGIN CASE coordinate OF coordCartesian: u := Vector3D (-x, -y, -z); coordSpherical: BEGIN temporary := -distance * COS(elevation); u := Vector3D (temporary * COS(azimuth - HalfPI), temporary * SIN(azimuth - HalfPI), -distance * SIN(elevation)); END END; a := TranslateMatrix(u); // translate origin to 'eye' b := RotateMatrix (dimen3D, axisX, HalfPI, rotateClockwise); a := MultiplyMatrices(a,b); CASE coordinate OF coordCartesian: BEGIN temporary := SQR(x) + SQR(y); hypotenuse := SQRT(temporary); if hypotenuse <> 0 then begin cosm := -y/hypotenuse; sinm := x/hypotenuse; end else begin cosm := 1;//abba sinm := 0; end; b := Matrix3D ( cosm, 0, sinm, 0, 0, 1, 0, 0, -sinm, 0, cosm, 0, 0, 0, 0, 1); a := MultiplyMatrices (a,b); cosm := hypotenuse; hypotenuse := SQRT(temporary + SQR(z)); cosm := cosm/hypotenuse; sinm := -z/hypotenuse; b := Matrix3D ( 1, 0, 0, 0, 0, cosm, -sinm, 0, 0, sinm, cosm, 0, 0, 0, 0, 1) END; coordSpherical: BEGIN b := RotateMatrix (dimen3D,axisY,-azimuth,rotateCounterClockwise); a := MultiplyMatrices(a,b); b := RotateMatrix (dimen3D,axisX,elevation,rotateCounterClockwise); END END {CASE}; a := MultiplyMatrices (a,b); u := Vector3D (ScreenDistance/(0.5*ScreenX), ScreenDistance/(0.5*ScreenY),-1.0); b := ScaleMatrix (u); // reverse sense of z-axis; screen transformation RESULT := MultiplyMatrices (a,b); END {ViewTransformMatrix}; // *************************** Conversions ************************** // This function converts the vector parameter from Cartesian // coordinates to the specified type of coordinates. FUNCTION FromCartesian (CONST ToCoordinate: TCoordinate; CONST u: TVector): TVector; VAR phi : DOUBLE; r : DOUBLE; temp : DOUBLE; theta: DOUBLE; BEGIN IF ToCoordinate = coordCartesian THEN RESULT := u ELSE BEGIN RESULT.size := u.size; IF (u.size = size3D) AND (ToCoordinate = coordSpherical) THEN BEGIN // spherical 3D temp := SQR(u.x)+SQR(u.y); // (x,y,z) -> (r,theta,phi) r := SQRT(temp+SQR(u.z)); IF Defuzz(u.x) = 0.0 THEN theta := PI/4 ELSE theta := ARCTAN(u.y/u.x); IF Defuzz(u.z) = 0.0 THEN phi := PI/4 ELSE phi := ARCTAN(SQRT(temp)/u.z); RESULT.x := r; RESULT.y := theta; RESULT.z := phi END ELSE BEGIN // cylindrical 2D/3D or spherical 2D // (x,y) -> (r,theta) or (x,y,z) -> (r,theta,z) r := SQRT( SQR(u.x) + SQR(u.y) ); IF Defuzz(u.x) = 0.0 THEN theta := PI/4 ELSE theta := ARCTAN(u.y/u.x); RESULT.x := r; RESULT.y := theta END END END {FromCartesian}; // This function converts the vector parameter from specified coordinates // into Cartesian coordinates. FUNCTION ToCartesian (CONST FromCoordinate: TCoordinate; CONST u: TVector): TVector; VAR phi : DOUBLE; r : DOUBLE; sinphi: DOUBLE; theta : DOUBLE; BEGIN RESULT := u; IF FromCoordinate = coordCartesian THEN RESULT := u ELSE BEGIN RESULT.size := u.size; IF (u.size = size3D) AND (FromCoordinate = coordSpherical) THEN BEGIN // spherical 3D r := u.x; // (r,theta,phi) -> (x,y,z) theta := u.y; phi := u.z; sinphi := SIN(phi); RESULT.x := r * COS(theta) * sinphi; RESULT.y := r * SIN(theta) * sinphi; RESULT.z := r * COS(phi) END ELSE BEGIN // cylindrical 2D/3D or spherical 2D r := u.x; // (r,theta) -> (x,y) or (r,theta,z) -> (x,y,z) theta := u.y; RESULT.x := r * COS(theta); RESULT.y := r * SIN(theta) END END END {ToCartesian}; // Convert angle in degrees to radians. FUNCTION ToRadians (CONST angle: DOUBLE): DOUBLE; BEGIN RESULT := PI/180.0 * angle END; {ToRadians} // *************************** Miscellaneous ************************** // 'Defuzz' is used for comparisons and to avoid propagation of 'fuzzy', // nearly-zero values. DOUBLE calculations often result in 'fuzzy' values. // The term 'fuzz' was adapted from the APL language. FUNCTION Defuzz(CONST x: DOUBLE): DOUBLE; BEGIN IF ABS(x) < fuzz THEN RESULT := 0.0 ELSE RESULT := x END {Defuzz}; INITIALIZATION fuzz := 1.0E-6; END. {GraphicsMath UNIT} ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/distr.pas���������������������������������������������������0000664�0001750�0001750�00000041376�11326434462�021012� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� unit distr; interface {$Include isgui.inc} uses Math, {$IFDEF GUI}dialogs;{$ELSE} dialogsx;{$ENDIF} function TtoZ(t,df: extended): extended; function lnGamma(f:longint):extended; { Computes the logarithm of the gamma function at f/2. } function pGamma(f:longint;y:extended):extended; { Returns the right tail probability in the gamma distribution with lambda = f/2. } function pNormal(z:extended):extended; //function pNormalOld(z:extended):extended; //function pNormalOrig(z:extended):extended; //old //function pNormalOrig(u:extended):extended; //old { Returns the right tail probability in the normal distribution. } function pChi2(f:longint;y:extended):extended; { Returns the right tail probability in the chi square distribution with f degrees of freedom. } function pBeta(f1,f2:longint;y:extended):extended; { Returns the LEFT tail probability in the beta distribution with paramters lambda1=f1/2 and lambda2=f2/2. Use only f1 and f2 < 1E6. } function pFdistr(f1,f2:longint;y:extended):extended; { Returns the right tail probability in the F distribution with (f1,f2) degrees of freedom. Use only f1 and f2 < 1E6. } function pTdistr(f:longint;y:extended):extended; { Returns the right tail probability in the T distribution. Use only f < 1E6. } function pNormalInv(p:extended):extended; function pNormalInvQuickApprox(p : extended) : extended;//errors rise with Z>7 //function pNormalInvOld(p:extended):extended; { Inverse of pNormal. } function pGammaInv(f:longint;p:extended):extended; { Inverse of pGamma(f,*). } function pChi2Inv(f:longint;p:extended):extended; { Inverse of pChi2(f,*). } function pBetaInv(f1,f2:longint;p:extended):extended; { Inverse of pBeta(f1,f2,*) (notice: LEFT tail). } function pFdistrInv(f1,f2:longint;p:extended):extended; { 1-p percentile of F distribution. } function pTdistrInv(f:longint;p:extended):extended; { 1-p percentile of T distribution. } function pPoiss(lambda:extended; n:longint): extended; { Returns the right tail probability in the Poisson distribution. } function PoissCL(n:longint; p:extended): extended; { Lower 1-p confidence limits for lambda in Poisson distribution when n is observed. } function pBin(n,x:longint; p:extended): extended; { Returns the binomial right tail probability. } function BinCL(n,x:longint; pp:extended): extended; { Returns confidence limit for binomial probability parameter, i.e. inverse to pBin(n,*). } function ChiSq(x: double; n: integer): double; {---------------------------------------------------------------------------} implementation //uses stat; function ChiSq(x: double; n: integer): double; var p,t: double; var k,a: integer; begin p := exp(-0.5*x); if odd(n) then p := p * sqrt(2*x/Pi); k := round(n); while k >= 2 do begin p := p *x/k; k := k-2; end; t := p; a := round(n); while (t > 0.000001*p) do begin a := a+2; t := t*x/a; p := p + t; end; result := 1-p; end; function TtoZ(t,df: extended): extended; // Converts a t value to an approximate z value w.r.t the given df // s.t. std.norm.(z) = t(z, df) at the two-tail probability level. //from http://www.anu.edu.au/nceph/surfstat/surfstat-home/tables/t.php var A9,B9,T9,Z8, P7, B7: extended; begin A9 := df - 0.5; B9 := 48*A9*A9; T9 := t*t/df; if T9 >= 0.04 then Z8 :=A9*ln(1+T9) else Z8 := A9*(((1 - T9*0.75)*T9/3 - 0.5)*T9 + 1)*T9; P7 := ((0.4*Z8 + 3.3)*Z8 + 24)*Z8 + 85.5; B7 := 0.8*power(Z8, 2) + 100 + B9; result := (1 + (-P7/B7 + Z8 + 3)/B9)*sqrt(Z8); if t < 0 then result := -result; end; function lnGamma(f:longint):extended; var sum,y : extended; k : longint; begin y:=f/2; if f>500 then begin sum:= ln(2*pi)/2 + (y-1/2)*ln(y); sum:=sum -y + 1/(12*y); sum:=sum - 1/360/y/y/y; lnGamma:=sum; end else begin k:=f; sum:=0; while k>2 do begin k:=k-2; sum:=sum+ln(k/2); end; if k=1 then sum:=sum+ln(pi)/2; lnGamma:=sum; end; end; function pGamma(f:longint;y:extended):extended; var term,sum: extended; k : longint; begin if (y<=0) then pGamma:=1 else if (y<f/2) or (y<42) then begin term:=(f/2)*ln(y)-y-lnGamma(f+2); if term>-1000 then term:=exp(term) else term:=0; sum:=0; k:=0; while ((f+k)*term>(f+k-2*y)*1E-20) do begin sum:=sum+term; term:=2*term*y/(f+k+2); k:=k+2; end; pGamma:=abs(1-sum); end else begin term:=(f/2-1)*ln(y)-y-lnGamma(f); if term>-1000 then term:=exp(term) else term:=0; sum:=0; k:=0; while (term*y > (2*y-f+k)*0.5E-20) and (f-k>1) do begin sum:=sum+term; k:=k+2; term:=term*(f-k)/2/y; end; pGamma:=abs(sum); end; end; {---------------------------------------------------------------------------} function pNormal(z:extended):extended; const PiD2=Pi/2; var q: extended; begin q := z*z; if abs(z)>7.0 then result := (0.5)*(1-1/q+3/(q*q))*Exp(-q/2)/(Abs(z)*Sqrt(PiD2)) else result := pGamma(1,q/2)/2; if z<0 then result:=1-result; end; function pChi2(f:longint;y:extended):extended; begin pChi2:= pGamma(f,y/2); end; function pBeta0(f1,f2:longint; y:extended): extended; { Returns the left tail probability of the beta distribution with paramters lambda1=f1/2 and lambda2=f2/2. Use only f1+f2<40. Accuracy around +/- 1E-16 . } var sum,term : extended; k : longint; begin sum:=0; k:=0; term:=lnGamma(f1+f2)-lnGamma(f2); term:=term-lnGamma(f1+2)+f1*ln(y)/2; term:=exp(term); while (k<f2) or (abs(term) > 1E-20) do begin sum:=sum+term; k:=k+2; term:=-term*y*(f2-k)*(f1+k-2)/k/(f1+k); end; pBeta0:=sum; end; function pBeta(f1,f2:longint;y:extended):extended; var sum,term : extended; k : longint; intch : boolean; begin if (f1=f2) and (y=0.5) then pBeta:=0.5 else if y<=0 then pBeta:=0 else if y>=1 then pBeta:=1 else begin intch:=false; if y>(1-y) then begin intch:=true; k:=f1; f1:=f2; f2:=k; y:=1-y; end; if f1+f2<41 then sum:=pBeta0(f1,f2,y) else begin term:= (f2/2-1)*ln(1-y) + (f1/2)*ln(y) + lnGamma(f1+f2) - lnGamma(f1+2); term:=term - lnGamma(f2); if term > -1000 then term:=exp(term) else term:=0; if (term<1E-35) and (y<f1/(f1+f2)) then sum:=0 else if (term<1E-35) and (y>f1/(f1+f2)) then sum:=1 else begin k:=0; sum:=0; while (abs(term)>1E-25) or (y*(f2-k) > (1-y)*(f1+k)) do begin sum:=sum+term; k:=k+2; term:= term*y*(f2-k)/(1-y)/(f1+k); end; end; end; if intch then sum:=1-sum; pBeta:= abs(sum); end; end; function gammln (xx: double): double; {Numerical Recipes for Pascal, p 177} const stp = 2.50662827465; var x, tmp, ser: double; begin x := xx - 1.0; tmp := x + 5.5; tmp := (x + 0.5) * ln(tmp) - tmp; ser := 1.0 + 76.18009173 / (x + 1.0) - 86.50532033 / (x + 2.0) + 24.01409822 / (x + 3.0) - 1.231739516 / (x + 4.0) + 0.120858003e-2 / (x + 5.0) - 0.536382e-5 / (x + 6.0); gammln := tmp + ln(stp * ser) end; {procedure gammln} FUNCTION betacf(a,b,x: double): double; LABEL 1; CONST itmax=100; eps=3.0e-7; VAR tem,qap,qam,qab,em,d: double; bz,bpp,bp,bm,az,app: double; am,aold,ap: double; m: integer; BEGIN am := 1.0; bm := 1.0; az := 1.0; qab := a+b; qap := a+1.0; qam := a-1.0; bz := 1.0-qab*x/qap; FOR m := 1 TO itmax DO BEGIN em := m; tem := em+em; d := em*(b-m)*x/((qam+tem)*(a+tem)); ap := az+d*am; bp := bz+d*bm; d := -(a+em)*(qab+em)*x/((a+tem)*(qap+tem)); app := ap+d*az; bpp := bp+d*bz; aold := az; am := ap/bpp; bm := bp/bpp; az := app/bpp; bz := 1.0; IF ((abs(az-aold)) < (eps*abs(az))) THEN GOTO 1 END; writeln('pause in BETACF'); writeln('a or b too big, or itmax too small'); readln; 1: betacf := az END; FUNCTION betai(a,b,x: double): double; VAR bt: double; BEGIN IF ((x < 0.0) OR (x > 1.0)) THEN BEGIN writeln('pause in routine BETAI'); readln END; IF ((x = 0.0) OR (x = 1.0)) THEN bt := 0.0 ELSE bt := exp(gammln(a+b)-gammln(a)-gammln(b) +a*ln(x)+b*ln(1.0-x)); IF (x < ((a+1.0)/(a+b+2.0))) THEN betai := bt*betacf(a,b,x)/a ELSE betai := 1.0-bt*betacf(b,a,1.0-x)/b END; function pFdistr(f1,f2:longint;y:extended):extended; begin pFdistr:=pBeta(f2,f1,f2/(f1*y+f2)); end; function pTdistr(f:longint;y:extended):extended; begin if y = 0 then result := 0.5 else begin result := betai(0.5*f,0.5,f/(f+sqr(y)))/2; if y < 0 then result := 1-result; end; end;//from numerical recipes (*below x5 slower than numerical recipes! function pTdistr; //function pTdistr(f:longint;y:extended):extended; var p: extended; begin if y=0 then pTdistr:=0.5 else begin p:=f/(y*y+f); p:=pBeta(f,1,p); p:=p/2; if y<0 then p:=1-p; pTdistr:=p; end; end;*) {---------------------------------------------------------------------------} (*function pNormalInv(p:extended):extended; var v,dv,z: extended; begin v := 0.5; dv := 0.5; z := 0; while (dv>1e-15) do begin z:=1/v-1; dv:=dv/2; if(pNormal(z)>p) then v:=v-dv else v:=v+dv; end; result := z; end; *) function pNormalInv(p:extended):extended; var v,dv,z,tailp: extended; begin if p <= 0.5 then tailp := p else tailp := 1-p; if tailp = 0 then begin result := 9.2;//fails with Z<-9 exit; end; //showmessage('error'+realtostr(tailp,10)); //showmessage(realtostr(tailp,10)); v := 0.5; dv := 0.5; z := 0; while (dv>1e-15) do begin z:=1/v-1; dv:=dv/2; if(pNormal(z)>tailp) then v:=v-dv else v:=v+dv; end; if p <= 0.5 then result := z else result := -z; end; function zprob(p : extended {; VAR errorstate : boolean}) : extended; VAR z, xp, lim, p0, p1, p2, p3, p4, q0, q1, q2, q3, q4, Y : extended; begin // value of probability between approx. 0 and .5 entered in p and the // z value is returned z //errorstate := true; lim := 1E-19; p0 := -0.322232431088; p1 := -1.0; p2 := -0.342242088547; p3 := -0.0204231210245; p4 := -4.53642210148E-05; q0 := 0.099348462606; q1 := 0.588581570495; q2 := 0.531103462366; q3 := 0.10353775285; q4 := 0.0038560700634; xp := 0.0; if (p > 0.5) then p := 1 - p; if (p < lim) then //Z>9.5 Z<-9.5 z := -pNormalInv(p) //use slow method //z := xp else if (p = 0.5) then z := xp else begin Y := sqrt(ln(1.0 / (p * p))); xp := Y + ((((Y * p4 + p3) * Y + p2) * Y + p1) * Y + p0) / ((((Y * q4 + q3) * Y + q2) * Y + q1) * Y + q0); if (p < 0.5) then xp := -xp; z := xp; end; zprob := z; end; // End function zprob function pNormalInvQuickApprox(p : extended) : extended; var z, px : extended; // flag : boolean; begin // obtains the inverse of z, that is, the z for a probability associated // with a normally distributed z score. px := p; if (p > 0.5) then px := 1.0 - p; if px < 0.000000000000001 then z := -8 //lPs[lInc] := 0.000000000000001; else z := zprob(px{,flag}); if (p > 0.5) then z := abs(z); result := -z; end; //End of inversez Function (*function zprob(p : double {; VAR errorstate : boolean}) : double; VAR z, xp, lim, p0, p1, p2, p3, p4, q0, q1, q2, q3, q4, Y : double; begin // value of probability between approx. 0 and .5 entered in p and the // z value is returned z //errorstate := true; lim := 1E-19; p0 := -0.322232431088; p1 := -1.0; p2 := -0.342242088547; p3 := -0.0204231210245; p4 := -4.53642210148E-05; q0 := 0.099348462606; q1 := 0.588581570495; q2 := 0.531103462366; q3 := 0.10353775285; q4 := 0.0038560700634; xp := 0.0; if (p > 0.5) then p := 1 - p; if (p < lim) then z := xp else begin //errorstate := false; if (p = 0.5) then z := xp else begin Y := sqrt(ln(1.0 / (p * p))); xp := Y + ((((Y * p4 + p3) * Y + p2) * Y + p1) * Y + p0) / ((((Y * q4 + q3) * Y + q2) * Y + q1) * Y + q0); if (p < 0.5) then xp := -xp; z := xp; end; end; zprob := z; end; // End function zprob function pNormalInvQuickApprox(p : double) : double; var z, px : double; // flag : boolean; begin // obtains the inverse of z, that is, the z for a probability associated // with a normally distributed z score. px := p; if (p > 0.5) then px := 1.0 - p; z := zprob(px{,flag}); if (p > 0.5) then z := abs(z); result := -z; end; //End of inversez Function *) (*function pNormalInvOld; var pp,y,a,b,y0 :extended; begin y:= 0; y0:=1; pp:=0.5; while y0>1E-10 do begin y0:=y; a:=-ln(2*pi)/2-y*y/2; b:=y; if abs(b)<1E-2 then y:=y+(pp-p)*exp(-a) else y:=y+ln(1+b*(pp-p)*exp(-a))/b; pp:=pNormalOld(y); y0:=abs(y-y0); end; result:=y; end; (**) function pGammaInv(f:longint;p:extended):extended; var pp,y,y0,a,b,a0 :extended; begin a0:=-lnGamma(f); if f=1 then begin y:=pNormalInv(p/2); y:=y*y/2; end else begin if f>100 then begin y:= sqrt(2*f-1)+pNormalInv(p); y:=y*y/4; end else y:=f/2; y0:=1; pp:=pGamma(f,y); while y0>1E-7 do begin y0:=y; a:=a0+(f/2-1)*ln(y)-y; b:=(f/2-1)/y-1; if abs(b*(pp-p)*exp(-a))<1E-5 then y:=y+(pp-p)*exp(-a) else y:=y+ln(1+b*(pp-p)*exp(-a))/b; pp:=pGamma(f,y); y0:=abs(y-y0); end; end; pGammaInv:=y; end; function pChi2Inv(f:longint;p:extended):extended; var y:extended; begin y:=pGammaInv(f,p); pChi2Inv:=2*y; end; {---------------------------------------------------------------------------} function pBetaInv1(f1,f2:longint;p:extended):extended; var pp,y,y0,a,b,a0 :extended; begin if p<=0 then y:=0 else if p>=1 then y:=1 else if (f1=1) and (f2=1) then y:=sin(p*pi/2)*sin(p*pi/2) else if (f1=1) and (f2=2) then y:=p*p else if (f1=2) and (f2=1) then y:=1-(1-p)*(1-p) else if (f1=2) and (f2=2) then y:=p else begin a0:=-lnGamma(f1)-lnGamma(f2); a0:=a0+lnGamma(f1+f2); y:=f1/(f1+f2); if f1=1 then begin y:= pGammaInv(1,1-p); y:= 2*y/(2*y+f2-1/2); end; y0:=1; pp:=pBeta(f1,f2,y); while y0>1E-8 do begin a:=a0+(f1/2-1)*ln(y)+(f2/2-1)*ln(1-y); b:=(f1/2-1)/y-(f2/2-1)/(1-y); if abs(b*(pp-p))*exp(-a)<1E-5 then y0:=-(pp-p)*exp(-a) else y0:=ln(1-b*(pp-p)*exp(-a))/b; y:=y+y0; pp:=pBeta(f1,f2,y); y0:=abs(y0)/y/(1-y); end; end; pBetaInv1:=y; end; {---------------------------------------------------------------------------} function pBetaInv(f1,f2:longint;p:extended):extended; var y: extended; begin if f1<=f2 then y:=pBetaInv1(f1,f2,p) else y:= 1-pBetaInv1(f2,f1,1-p); pBetaInv := y; end; {---------------------------------------------------------------------------} function pFdistrInv(f1,f2:longint;p:extended):extended; var y : extended; begin y:=pBetaInv(f2,f1,p); if y = 0 then pFdistrInv:= 0 //infinityINF else pFdistrInv:=f2/f1*(1-y)/y; end; {---------------------------------------------------------------------------} function pTdistrInv(f:longint;p:extended):extended; var t:extended; begin if p<=0.5 then t:=sqrt(pFdistrInv(1,f,2*p)) else t:=-sqrt(pFdistrInv(1,f,2*(1-p))); pTdistrInv:=t; end; {---------------------------------------------------------------------------} function pPoiss(lambda:extended; n:longint): extended; begin pPoiss:= 1-pGamma(2*n,lambda); end; {---------------------------------------------------------------------------} function pBin(n,x:longint; p:extended): extended; begin pBin:= pBeta(2*x,2+2*(n-x),p); end; {---------------------------------------------------------------------------} function PoissCL(n:longint; p:extended): extended; begin PoissCL := pGammaInv(2*n,1-p); end; {---------------------------------------------------------------------------} function BinCL(n,x:longint; pp:extended): extended; begin BinCL:= pBetaInv(2*x,2+2*(n-x),pp); end; {---------------------------------------------------------------------------} end. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/DiskSpaceKludge.pas�����������������������������������������0000664�0001750�0001750�00000015201�11423560656�022656� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// The author gave written permission to distribute this file under the // same licensing terms as MRICRON. // Disk Space Kludge for Delphi 3 for > 2 GB disk drives // Works with Windows 95 OSR2 or later, Windows 98 or Windows 4.0 or later // See http://msdn.microsoft.com/library/sdkdoc/winbase/filesio_8bso.htm // // Use DiskSpaceKludge.DiskFree and DiskSpaceKludge.DiskSize now in D3 and // replace with equivalent SysUtils.DiskFree and SysUtils.DiskSize in D4 // efg, April 1999 UNIT DiskSpaceKludge; INTERFACE USES Windows; // GetDiskFreeSpace, BOOL TYPE TInteger8 = Comp; // 8-byte integer, since disk sizes may be > 2 GB pInteger8 = ^TInteger8; // Use Delphi 4 trick from D4 SysUtils.PAS VAR GetDiskFreeSpaceEx: FUNCTION (DirectoryName: pChar; FreeBytesAvailableToCaller: pInteger8; TotalNumberOfBytes : pInteger8; TotalNumberOfFreeBytes : pInteger8): BOOL StDCall = NIL; FUNCTION GetDiskFreeSpaceExA (DirectoryName: pChar; FreeBytesAvailableToCaller: pInteger8; TotalNumberOfBytes : pInteger8; TotalNumberOfFreeBytes : pInteger8): BOOL; StDCall; FUNCTION DiskFreeA(Drive: BYTE): TInteger8; FUNCTION DiskSize(Drive: BYTE): TInteger8; FUNCTION DiskFreeStr(DriveStr: String): TInteger8; FUNCTION DiskFreeEx (DriveStr: String): Integer; IMPLEMENTATION USES SysUtils; // StrCopy function DiskFreeEx (DriveStr: String): Integer; var lOutDisk: Integer; lDiskDir : string; lSize8: Tinteger8; begin lOutDisk := ord(upcase(DriveStr[1]))+1-ord('A'); if (lOutDisk >= ord('A')) and (lOutDisk <= ord('Z')) then begin DiskFreeEx := DiskFree(lOutDisk); end else begin lDiskDir :=(ExtractFileDrive(DriveStr))+'\'; lSize8 := DiskFreeStr (lDiskDir); if lSize8 > MaxINt then DiskFreeEx := MaxInt else DiskFreeEx := round(lSize8); end; end; /////////////////////////////////////////////////////////////////////////// FUNCTION GetDiskFreeSpaceExA; EXTERNAL KERNEL32 NAME 'GetDiskFreeSpaceExA'; /////////////////////////////////////////////////////////////////////////// // Borland's DiskFree and DiskSize in D3 SysUtils only return a 4-byte integer. // Use Integer8 here so values are meaningful on large disk drives. // These routines may be replaced in D4 with the same name functions that // return Int64 values. // DiskFree returns the number of free bytes on the specified drive number, // where 0 = Current, 1 = A, 2 = B, etc. DiskFree returns -1 if the drive // number is invalid. } FUNCTION DiskFreeA(Drive: BYTE): TInteger8; VAR FreeBytesAvailableToCaller: TInteger8; RootPath : ARRAY[0..4] OF CHAR; RootPtr : pChar; TotalNumberOfBytes : TInteger8; BEGIN RootPtr := NIL; IF Drive > 0 THEN BEGIN StrCopy(RootPath, 'A:\'); RootPath[0] := CHR(Drive + ORD('A') - 1); StrCopy(RootPath, 'C:\'); RootPtr := RootPath END; // Use NIL as third parameter, just like in D4 InternalGetDiskSpace routine IF GetDiskFreeSpaceEx(RootPtr, @FreeBytesAvailableToCaller, @TotalNumberOfBytes, NIL) THEN RESULT := FreeBytesAvailableToCaller ELSE RESULT := -1 END {DiskFree}; FUNCTION DiskFreeStr(DriveStr: String): TInteger8; VAR FreeBytesAvailableToCaller: TInteger8; RootPath : ARRAY[0..255] OF CHAR; RootPtr : pChar; TotalNumberOfBytes : TInteger8; BEGIN // RootPtr := NIL; // StrCopy(RootPath, DriveStr); { RootPath[0] := CHR(Drive + ORD('A') - 1); StrCopy(RootPath, 'C:\');} RootPtr := RootPath; StrPCopy(RootPtr,DriveStr); // Use NIL as third parameter, just like in D4 InternalGetDiskSpace routine IF GetDiskFreeSpaceEx(RootPtr, @FreeBytesAvailableToCaller, @TotalNumberOfBytes, NIL) THEN RESULT := FreeBytesAvailableToCaller ELSE RESULT := -1 END {DiskFree}; // DiskSize returns the size in bytes of the specified drive number, where // 0 = Current, 1 = A, 2 = B, etc. DiskSize returns -1 if the drive number // is invalid. } FUNCTION DiskSize(Drive: BYTE): TInteger8; VAR FreeBytesAvailableToCaller: TInteger8; RootPath : ARRAY[0..4] OF CHAR; RootPtr : pChar; TotalNumberOfBytes : TInteger8; BEGIN RootPtr := NIL; IF Drive > 0 THEN BEGIN StrCopy(RootPath, 'A:\'); RootPath[0] := CHR(Drive + ORD('A') - 1); RootPtr := RootPath END; // Use NIL as third parameter, just like in D4 InternalGetDiskSpace routine IF GetDiskFreeSpaceEx(RootPtr, @FreeBytesAvailableToCaller, @TotalNumberOfBytes, NIL) THEN RESULT := TotalNumberOfBytes ELSE RESULT := -1 END {DiskSize}; /////////////////////////////////////////////////////////////////////////// // Equivalent to Delphi 4 SysUtils.PAS routines FUNCTION BackfillGetDiskFreeSpaceEx(Directory: pChar; VAR FreeAvailable, TotalSpace: TInteger8; TotalFree: pInteger8): BOOL; StdCall; VAR BytesPerSector : DWORD; Dir : pChar; FreeClusters : DWORD; SectorsPerCluster: DWORD; Temp : TInteger8; TotalClusters : DWORD; BEGIN IF Directory <> NIL THEN Dir := Directory ELSE Dir := NIL; RESULT := GetDiskFreeSpaceA(Dir, SectorsPerCluster, BytesPerSector, FreeClusters, TotalClusters); Temp := SectorsPerCluster * BytesPerSector; FreeAvailable := Temp * FreeClusters; TotalSpace := Temp * TotalClusters END {BackfillGetDiskFreeSpaceEx}; PROCEDURE InitializeDriveSpacePointer; VAR Kernel: THandle; BEGIN Kernel := GetModuleHandle(Windows.Kernel32); IF Kernel <> 0 THEN @GetDiskFreeSpaceEx := GetProcAddress(Kernel, 'GetDiskFreeSpaceExA'); IF NOT Assigned(GetDiskFreespaceEx) THEN GetDiskFreeSpaceEx := @BackFillGetDiskFreeSpaceEx END {InitializeDriveSpacePointer}; INITIALIZATION InitializeDriveSpacePointer END. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/dicomhdr.pas������������������������������������������������0000664�0001750�0001750�00000047212�11326434462�021451� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit dicomhdr; {$H+} //Simple dicom to nifti translator interface uses {$IFNDEF FPC}Controls, {$ENDIF} SysUtils,define_types,classes,nifti_hdr,GraphicsMathLibrary; function NIFTIhdr_LoadDCM (var lFilename: string; var lHdr: TMRIcroHdr): boolean; type kDICOMStr = String[32]; DICOMdata = record XYZdim: array [1..4] of integer; XYZori: array [1..3] of integer; XYZmm: array [1..3] of double; Orient: array [1..6] of double; Float,file4D: boolean; PatientPosX,PatientPosY,PatientPosZ,AngulationAP,AngulationFH,AngulationRL: double; TE, TR,IntenScale,IntenIntercept,location{,DTIv1,DTIv2,DTIv3}: single; {Bval,}SlicesPer3DVol,SiemensInterleaved {0=no,1=yes,2=not defined},SiemensSlices,SiemensMosaicX,SiemensMosaicY, nDTIdir,AcquNum,ImageNum,SeriesNum,ImageStart,little_endian,Allocbits_per_pixel,SamplesPerPixel, PatientIDint,CSAImageHeaderInfoPos,CSAImageHeaderInfoSz,ManufacturerID: integer; PatientPos,PatientName,ProtocolName,StudyDate,StudyTime,PhilipsSliceOrient,PhaseEncoding: kDICOMStr; Filename: string[255]; end; implementation uses dialogs; procedure Msg(lStr: string); begin Showmessage(lStr); end; procedure clear_dicom_data (var lDicomdata:Dicomdata); var lI: integer; begin with lDicomData do begin lDicomData.CSAImageHeaderInfoPos := 0; lDicomData.CSAImageHeaderInfoSz := 0; for lI := 1 to 6 do Orient[lI] := 0; PatientIDInt := 0; ManufacturerID := 0; AngulationFH := 0; AngulationRL := 0; AngulationAP := 0; nDTIdir := 0; PhilipsSliceOrient := 'NA'; PhaseEncoding := 'NA'; PatientPos := 'NA'; file4D := false; PatientName := 'NO NAME'; StudyDate := ''; StudyTime := ''; TR := 0; TE := 0; Float := false; ImageNum := 0; SlicesPer3DVol := 0; SiemensInterleaved := 2; //0=no,1=yes,2=undefined SiemensSlices := 0; SiemensMosaicX := 1; SiemensMosaicY := 1; IntenScale := 1; IntenIntercept := 0; SeriesNum := 1; AcquNum := 0; ImageNum := 1; SamplesPerPixel := 1; XYZmm[1] := 1; XYZmm[2] := 1; XYZmm[3] := 1; XYZdim[1] := 1; XYZdim[2] := 1; XYZdim[3] := 1; XYZdim[4] := 1; lDicomData.XYZori[1] := 0; lDicomData.XYZori[2] := 0; lDicomData.XYZori[3] := 0; ImageStart := 0; Little_Endian := 0; Allocbits_per_pixel := 16;//bits Location:=0; PatientPosX := 0;//1392 PatientPosY := 0;//1392 PatientPosZ := 0;//1392 end; end; function NIFTIhdr_LoadDCM (var lFilename: string; var lHdr: TMRIcroHdr): boolean; var lDICOMdata: DICOMdata; const kMaxBuf = (256*256)-1; //bytes kMax16bit = (256*256)-1; kImageType = $0008+($0008 shl 16 ); kStudyDate = $0008+($0020 shl 16 ); kStudyTime = $0008+($0030 shl 16 ); kPatientName = $0010+($0010 shl 16 ); kSeq = $0018+($0020 shl 16 ); kZThick = $0018+($0050 shl 16 ); kTR = $0018+($0080 shl 16 ); kTE = $0018+($0081 shl 16 ); kEchoNum = $0018+($0086 shl 16 ); kZSpacing = $0018+($0088 shl 16 ); kProtocolName = $0018+($1030shl 16 ); kPatientPos = $0018+($5100 shl 16 ); kSeriesNum = $0020+($0011 shl 16 ); kAcquNum = $0020+($0012 shl 16 ); kImageNum = $0020+($0013 shl 16 ); kOrientation = $0020+($0037 shl 16 ); kLocation = $0020+($1041 shl 16 ); kDim3 = $0028+($0008 shl 16 ); kDim2 = $0028+($0010 shl 16 ); kDim1 = $0028+($0011 shl 16 ); kXYSpacing = $0028+($0030 shl 16 ); kPosition = $0020+($0032 shl 16 ); knVol = $0020+($0105 shl 16 ); kAlloc = $0028+($0100 shl 16 ); kIntercept = $0028+($1052 shl 16 ); kSlope = $0028+($1053 shl 16 ); kCSAImageHeaderInfo = $0029+($1010 shl 16 ); kSlicesPer3DVol = $2001+($1018 shl 16 ); kTransferSyntax = $0002+($0010 shl 16); kImageStart = $7FE0+($0010 shl 16 ); kMaxFloats = 6; var vr : array [1..2] of Char; lByteRA: Bytep; lFloatRA: array [1..kMaxFloats] of double; lBufferSz,lPos,lFileSz,lBuffStart: integer; lInFile: file; lBufferError: boolean; procedure Str2FloatNum ( lStr: string; lnFloats: integer); var lFStr: string; lP,lnF: integer; begin if (length(lStr) < 1) or (lnFloats < 1) or (lnFloats > kMaxFloats) then exit; for lnF := 1 to lnFloats do lFloatRA[lnF] := 1; lStr := lStr + ' '; //terminator lFStr := ''; lP := 1; lnF:= 0; while lP <= length(lStr) do begin if lStr[lP] in ['+','-','0'..'9','.','e','E'] then lFStr := lFStr + lStr[lP] else if (lFStr <> '') then begin inc(lnF); //if lnFloats = 6 then showmessage(lFStr); try lFloatRA[lnF] := strtofloat(lFStr); except on EConvertError do lFloatRA[lnF] := 1; end;//except if lnF = lnFloats then exit; lFStr := ''; end; inc(lP); end; end; //function Str2Float function GetByte (lFilePos: integer): byte; var lBufPos: integer; begin //the following error checking slows down reads a lot! //a simpler alternative would be to make the buffer size the same size as the entire image... //the current strategy saves memory and is faster for large images with small headers if lFilepos > lFileSz then begin lBufferError := true; result := 0; exit; end; lBufPos := lFilepos - lBuffStart+1; if (lBufPos > lBufferSz) or (lBufPos < 1) then begin //reload buffer if lFilePos+kMaxBuf > lFileSz then lBufferSz := lFileSz - (lFilePos) else lBufferSz := kMaxBuf; //read remaining AssignFile(lInFile, lFileName); FileMode := 0; //Set file access to read only Reset(lInFile, 1); seek(lInFile,lFilePos); BlockRead(lInFile, lByteRA^[1], lBufferSz); CloseFile(lInFile); FileMode := 2; lBuffStart := lFilePos; lBufPos := 1; end; result := lByteRA^[lBufPos]; end; function ReadInt4: integer; begin if lDicomData.little_endian = 0 then result := GetByte(lPos+3)+(GetByte(lPos+2) shl 8)+(GetByte(lPos+1) shl 16)+(GetByte(lPos) shl 24) else result := GetByte(lPos)+(GetByte(lPos+1) shl 8)+(GetByte(lPos+2) shl 16)+(GetByte(lPos+3) shl 24); inc(lPos,4); end; //function Read4 procedure ReadGroupElementLength(var lGroupElement,lLength: integer); begin lGroupElement := ReadInt4; vr[1] := chr(GetByte(lPos)); vr[2] := chr(GetByte(lPos+1)); if vr[2] < 'A' then begin //implicit vr with 32-bit length lLength := ReadInt4; exit; end; if (vr = 'UN') {2/2008} or (vr = 'OB') or (vr = 'OW') or (vr = 'SQ') then begin {explicit VR with 32-bit length} lPos := lPos + 4; {skip 2 byte string and 2 reserved bytes = 4 bytes = 2 words} lLength := ReadInt4;//Ord4(buf[lPos]) + $100 * (buf[lPos+1] + $100 * (buf[lPos+2] + $100 * buf[lPos+3])) end else begin {explicit VR with 16-bit length} if lDicomData.little_endian = 0 then lLength := (GetByte(lPos+3))+(GetByte(lPos+2) shl 8) else lLength := (GetByte(lPos+2))+(GetByte(lPos+3) shl 8);//GetLength := Ord4(buf[i+2]) + $100 * (buf[i+3]); lPos := lPos + 4; {skip 2 byte string and 2 length bytes = 4 bytes = 2 words} end; end; //procedure ReadGroupElementLength function DCMStr(lBytes: integer): string; var lC: integer; begin result := ''; if lBytes < 1 then exit; for lC := lPos to (lPos+(lBytes-1)) do result := result + char(GetByte(lC)); for lC := 1 to lBytes do if result[lC] in ['+','-','/','\',' ','0'..'9','a'..'z','A'..'Z','.'] then else result[lC] := ' '; end; //function DCMStr function DCMStr2Int (lBytes: integer): integer; var lErr: integer; lStr: string; begin lStr := DCMStr(lBytes); Val(lStr,result,lErr); end; //function DCMStr2Int procedure DCMStr2FloatNum (lBytes,lnFloats: integer); begin Str2FloatNum (DCMStr(lBytes), lnFloats); end; //function DCMStr2Float function DCMStr2Float (lBytes: integer): single; begin DCMStr2FloatNum (lBytes,1); result := lFloatRA[1]; end; //function DCMStr2Float procedure DCMStr2Float2 (lBytes: integer; var lF1,lF2: double); begin DCMStr2FloatNum (lBytes,3); lF1 := lFloatRA[1]; lF2 := lFloatRA[2]; end; //function DCMStr2Float2 procedure DCMStr2Float3 (lBytes: integer; var lF1,lF2,lF3: double); begin DCMStr2FloatNum (lBytes,3); lF1 := lFloatRA[1]; lF2 := lFloatRA[2]; lF3 := lFloatRA[3]; end; //function DCMStr2Float3 procedure DCMStr2Float6 (lBytes: integer; var lF1,lF2,lF3,lF4,lF5,lF6: double); begin DCMStr2FloatNum (lBytes,6); lF1 := lFloatRA[1]; lF2 := lFloatRA[2]; lF3 := lFloatRA[3]; lF4 := lFloatRA[4]; lF5 := lFloatRA[5]; lF6 := lFloatRA[6]; end; //function DCMStr2Float6 function DCMint (lBytes: integer): integer; //read 16 bit short integer begin if lBytes <= 2 then result := GetByte(lPos)+(GetByte(lPos+1) shl 8) //shortint vs word? else result := GetByte(lPos)+(GetByte(lPos+1) shl 8)+(GetByte(lPos+2) shl 16)+(GetByte(lPos+3) shl 24);; //byte order?? end; //function DCMint var lTempStr,lStr: string; lOffset,lTemp,lGroupElement,lLength,lEchoNum,lnVol: integer; lResearchMode: boolean; lThick: double; begin //function fast_read_dicom_data lOffset := 128; lnVol := 1; lEchoNum := 1; lThick := 0; clear_dicom_data(lDicomData); lDicomData.little_endian := 1; result := false; lResearchMode := false; lBufferError := false; lFileSz := FSize(lFilename); lBufferSz := lFileSz-lOffset; if lBufferSz < 512 then begin //showmessage('Error: File too small '+lFilename); exit; end; if lBufferSz > kMaxBuf then lBufferSz := kMaxBuf; GetMem(lByteRA,kMaxBuf); lBufferSz := lBufferSz; AssignFile(lInFile, lFileName); FileMode := 0; //Set file access to read only Reset(lInFile, 1); seek(lInFile,lOffset); BlockRead(lInFile, lByteRA^[1], lBufferSz); CloseFile(lInFile); FileMode := 2; lBuffStart := lOffset; lPos := lOffset; if lOffset = 128 then begin //DICOM files start with DICM at 128, Siemens shadow headers do not if DCMStr(4) <> 'DICM' then begin //Msg(DCMStr(4)+ ' <> DICM'); FreeMem(lByteRA); exit; end; lPos := lOffset + 4;//DICM read end;//Offset = 128 //next check VR if not( chr(GetByte(lPos+4)) in ['A'..'Z']) or not( chr(GetByte(lPos+5)) in ['A'..'Z']) then Msg('implicit VR untested'); //next check Endian lTemp := lPos; ReadGroupElementLength(lGroupElement,lLength); //if lLength > kMax16bit then // Msg('ByteSwapped'); lPos := lTemp; //end VR check while (lDICOMData.imagestart = 0) and (not lBufferError) do begin ReadGroupElementLength(lGroupElement,lLength); //if (lGroupElement and $FF) > $18 then // msg(VR+inttohex(lGroupElement,8)+' '+inttostr(lLength)); case lGroupElement of kTransferSyntax: begin lTempStr := (DCMStr(lLength)); if (length(lTempStr) >= 19) and (lTempStr[19] = '2') then lDicomData.little_endian := 0; end; kImageType : begin lTempStr := DCMStr(lLength); //read last word - ver\mosaic -> MOSAIC lStr := ''; lTemp := length(lTempStr); while (lTemp > 0) and (lTempStr[lTemp] in ['a'..'z','A'..'Z']) do begin lStr := upcase(lTempStr[lTemp])+lStr; dec(lTemp); end; if lStr = 'MOSAIC' then lDicomData.SiemensMosaicX := 2; //we need to read numaris for details... end; kStudyDate: lDicomData.StudyDate := DCMStr(lLength); kStudyTime : lDicomData.StudyTime := DCMStr(lLength); kPatientName : lDicomData.PatientName := DCMStr(lLength); kProtocolName : lDicomData.ProtocolName :=DCMStr(lLength); kPatientPos : lDicomData.PatientPos :=DCMStr(lLength); //should be HFS for Siemens = Head First Supine kSeriesNum : lDicomData.SeriesNum := DCMStr2Int(lLength); kAcquNum : lDicomData.AcquNum := DCMStr2Int(lLength); kSeq: begin if DCMStr(lLength) = 'RM' then lResearchMode := True; end; kImageNum : lDicomData.ImageNum := DCMStr2Int(lLength); kDim3 :lDicomData.XYZdim[3] := DCMStr2Int(lLength); kDim2 : lDicomData.XYZdim[2] := DCMint (lLength); kDim1 : lDicomData.XYZdim[1] := DCMint (lLength); kLocation : lDICOMData.Location := DCMStr2Float(lLength); kAlloc: lDicomData.Allocbits_per_pixel := DCMint (lLength); kTR : lDicomData.TR := DCMStr2Float(lLength); kTE: lDicomData.TE := DCMStr2Float(lLength); kEchoNum: lEchoNum := round (DCMStr2Float(lLength)); kSlope : lDICOMData.IntenScale := DCMStr2Float(lLength); kIntercept : lDICOMData.IntenIntercept := DCMStr2Float(lLength); kOrientation : DCMStr2Float6(lLength, lDicomData.Orient[1], lDicomData.Orient[2],lDicomData.Orient[3],lDicomData.Orient[4], lDicomData.Orient[5],lDicomData.Orient[6]); kPosition : DCMStr2Float3 (lLength,lDicomData.PatientPosX, lDicomData.PatientPosY,lDicomData.PatientPosZ); knVol: lnVol := round (DCMStr2Float(lLength)); kZThick: begin lThick := DCMStr2Float(lLength); lDICOMData.XYZmm[3] := lThick; end;//used differently by manufacturers kZSpacing: begin lDICOMData.XYZmm[3] := DCMStr2Float(lLength); if (lThick/2) > lDICOMdata.XYZmm[3] then lDICOMdata.XYZmm[3] := lDICOMdata.XYZmm[3] + lThick end; //used different by different manufacturers kXYSpacing: DCMStr2Float2 (lLength, lDICOMdata.XYZmm[2], lDICOMdata.XYZmm[1]); (*kCSAImageHeaderInfo: begin //order ICE,Acq,Num,Vector lDICOMdata.CSAImageHeaderInfoPos := lPos; lDICOMdata.CSAImageHeaderInfoSz := lLength; end; *) kSlicesPer3DVol: lDICOMData.SlicesPer3DVol := DCMint (lLength); kImageStart: lDICOMData.ImageStart := lPos ; //-1 as indexed from 0.. not 1.. end; //Case lGroupElement //Msg(VR+inttohex(lGroupElement and kMax16bit,4) +':'+inttohex( lGroupElement shr 16,4)+' '+inttostr(lLength)+'@'+inttostr(lPos) ); lPos := lPos + (lLength); end; //while imagestart=0 and not error //clean up if (lDicomData.SiemensMosaicX > 1) then lDicomData.AcquNum := 1; if (lEchoNum > 1) and (lEchoNum < 16) then lDicomData.AcquNum := lDicomData.AcquNum + (100*lEchoNum); if lResearchMode then lDicomData.SeriesNum := lDicomData.SeriesNum + 100; if (lDICOMData.SlicesPer3DVol > 0) and (lnVol > 1) and (lDicomdata.XYZdim[3] > 1) and (lDicomData.SlicesPer3DVol > 0)and ((lDicomdata.XYZdim[3] mod lDicomData.SlicesPer3DVol) = 0) then lDICOMdata.File4D := true; if not lBufferError then result := true; FreeMem(lByteRA); if result then begin lHdr.HdrFileName:= lFilename; lHdr.ImgFileName:= lFilename; lHdr.NIfTItransform := false;//Analyze case lDicomData.Allocbits_per_pixel of 8: lHdr.NiftiHdr.datatype := kDT_UNSIGNED_CHAR; 16: lHdr.NiftiHdr.datatype := kDT_SIGNED_SHORT; 32: begin if lDicomdata.Float then lHdr.NiftiHdr.datatype := kDT_SIGNED_INT else lHdr.NiftiHdr.datatype := kDT_FLOAT; // float (32 bits/voxel) end; else begin Msg('Unsupported DICOM bit-depth : +inttostr(lDicomData.Allocbits_per_pixel.'); result := false; end; end; lHdr.NIFTIhdr.vox_offset := lDicomData.ImageStart; lHdr.NIFTIhdr.bitpix := lDicomData.Allocbits_per_pixel; lHdr.NIFTIhdr.pixdim[1] := lDicomdata.XYZmm[1]; lHdr.NIFTIhdr.pixdim[2] := lDicomdata.XYZmm[2]; lHdr.NIFTIhdr.pixdim[3] := lDicomdata.XYZmm[3]; NIFTIhdr_SetIdentityMatrix(lHdr); lHdr.NIFTIhdr.dim[1] := lDicomdata.XYZdim[1]; lHdr.NIFTIhdr.dim[2] := lDicomdata.XYZdim[2]; lHdr.NIFTIhdr.dim[3] := lDicomdata.XYZdim[3]; lHdr.NIFTIhdr.dim[4] := lDicomdata.XYZdim[4]; if lHdr.NIFTIhdr.dim[4] < 2 then lHdr.NIFTIhdr.dim[0] := 3 else lHdr.NIFTIhdr.dim[0] := 4; lHdr.NIFTIhdr.qform_code := kNIFTI_XFORM_UNKNOWN; lHdr.NIFTIhdr.sform_code := kNIFTI_XFORM_UNKNOWN; //test - input estimated orientation matrix lHdr.NIFTIhdr.sform_code := kNIFTI_XFORM_SCANNER_ANAT ; lHdr.NIFTIhdr.srow_x[0] := lHdr.NIFTIhdr.pixdim[1]; lHdr.NIFTIhdr.srow_y[1] := lHdr.NIFTIhdr.pixdim[2]; lHdr.NIFTIhdr.srow_z[2] := lHdr.NIFTIhdr.pixdim[3]; lHdr.NIFTIhdr.srow_x[3] := (lHdr.NIFTIhdr.dim[1] /2)*-lHdr.NIFTIhdr.pixdim[1]; lHdr.NIFTIhdr.srow_y[3] := (lHdr.NIFTIhdr.dim[2] /2)*-lHdr.NIFTIhdr.pixdim[2]; lHdr.NIFTIhdr.srow_z[3] := (lHdr.NIFTIhdr.dim[3] /2)*-lHdr.NIFTIhdr.pixdim[3]; //fx(lHdr.NIFTIhdr.srow_z[3],lOri[3]); lHdr.Mat:= Matrix3D( lHdr.NIFTIhdr.srow_x[0],lHdr.NIFTIhdr.srow_x[1],lHdr.NIFTIhdr.srow_x[2],lHdr.NIFTIhdr.srow_x[3], // 3D "graphics" matrix lHdr.NIFTIhdr.srow_y[0],lHdr.NIFTIhdr.srow_y[1],lHdr.NIFTIhdr.srow_y[2],lHdr.NIFTIhdr.srow_y[3], // 3D "graphics" matrix lHdr.NIFTIhdr.srow_z[0],lHdr.NIFTIhdr.srow_z[1],lHdr.NIFTIhdr.srow_z[2],lHdr.NIFTIhdr.srow_z[3], // 3D "graphics" matrix 0,0,0,1); //Warning: some of the NIFTI float values that do exist as integer values in Analyze may have bizarre values like +INF, -INF, NaN lHdr.NIFTIhdr.toffset := 0; lHdr.NIFTIhdr.intent_code := kNIFTI_INTENT_NONE; lHdr.NIFTIhdr.dim_info := kNIFTI_SLICE_SEQ_UNKNOWN + (kNIFTI_SLICE_SEQ_UNKNOWN shl 2) + (kNIFTI_SLICE_SEQ_UNKNOWN shl 4); //Freq, Phase and Slie all unknown lHdr.NIFTIhdr.xyzt_units := kNIFTI_UNITS_UNKNOWN; lHdr.NIFTIhdr.slice_duration := 0; //avoid +inf/-inf, NaN lHdr.NIFTIhdr.intent_p1 := 0; //avoid +inf/-inf, NaN lHdr.NIFTIhdr.intent_p2 := 0; //avoid +inf/-inf, NaN lHdr.NIFTIhdr.intent_p3 := 0; //avoid +inf/-inf, NaN lHdr.NIFTIhdr.pixdim[0] := 1; //QFactor should be 1 or -1 lHdr.DiskDataNativeEndian := odd(lDicomData.little_endian); lHdr.NIFTIHdr.magic := kNIFTI_MAGIC_DCM; end; end; //function NIFTIhdr_LoadDCM end. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/dialogsx.pas������������������������������������������������0000664�0001750�0001750�00000006566�11530561026�021473� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit dialogsx; {$Include isgui.inc} {$H+} interface uses SysUtils,IniFiles; type TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbHelp); TMsgDlgButtons = set of TMsgDlgBtn; TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation, mtCustom); procedure Msg (lStr: string); procedure ShowMsg (lStr: string); procedure msgfx (a,b,c,d: double); overload; //fx used to help debugging - reports number values function MsgDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word; function GetInt(lStr: string; lMin,lDefault,lMax: integer): integer; procedure MyReadLn;//no GUI: waits for user function GetStr(lPrompt: string): string; //procedure vx (a,b,c,d: double); const mrCancel = 2; mrAbort = 1;// idAbort mrNo = 0; implementation {$IFDEF GUI}uses readint,dialogs,gui; {$ENDIF} procedure vx (a,b,c,d: double); //vx used to help debugging - reports number values begin msg(floattostr(a)+':'+floattostr(b)+':'+floattostr(c)+':'+floattostr(d)); end; procedure MyReadLn; {$IFDEF GUI} begin //do nothing end; {$ELSE} begin {$IFNDEF UNIX} if IsConsole then ReadLn; {$ENDIF} end; {$ENDIF} function MsgDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word; {$IFDEF GUI} var lDlgType : Dialogs.TMsgDlgType; lButtons: Dialogs.TMsgDlgButtons; begin lDlgType := Dialogs.TMsgDlgType(DlgType); lButtons:= Dialogs.TMsgDlgButtons(Buttons); result := MessageDlg(Msg, lDlgType, lButtons,HelpCtx); {$ELSE} begin result := 0; writeln('WARNING: dialogs not being used. Unabled to process this '+Msg); {$ENDIF} end; procedure ShowMsg (lStr: string); begin {$IFDEF GUI} ShowMessage(lStr); {$ELSE} writeln(lStr) {$ENDIF} end; procedure msgfx (a,b,c,d: double); overload; //fx used to help debugging - reports number values begin {$IFDEF GUI} msg(floattostr(a)+'x'+floattostr(b)+'x'+floattostr(c)+'x'+floattostr(d)); {$ELSE} msg(floattostr(a)+'x'+floattostr(b)+'x'+floattostr(c)+'x'+floattostr(d)); {$ENDIF} end; procedure Msg (lStr: string); begin {$IFDEF GUI} MainForm.Memo1.Lines.Add(lStr); MainForm.refresh; {$ELSE} writeln(lStr) {$ENDIF} end; function GetStr(lPrompt: string): string; {$IFDEF GUI} var lOK: boolean; begin lOK := InputQuery(lPrompt, lPrompt, result); if not lOK then result := ''; end; {$ELSE} var lS: string; begin writeln ( lPrompt); readln(lS); result := lS; end; {$ENDIF} function GetInt(lStr: string; lMin,lDefault,lMax: integer): integer; {$IFDEF GUI} begin //result := GetInt(lStr, lMin,lDefault,lMax); result := lDefault; Showmessage('Warning - unable to get values for '+lStr); end; {$ELSE} var lS: string; lError,lI: integer; begin writeln ( lStr+' ['+inttostr(lMin)+'..'+inttostr(lMax)+'], default '+inttostr(lDefault)); readln(lS); Val(lS,lI,lError); if lError = 0 then result := round(lI) else begin writeln(inttostr(lDefault)); result := lDefault; end; if result < lMin then result := lMin; if result > lMax then result := lMax; end; {$ENDIF} end. ������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/delphiselectfolder.pas��������������������������������������0000664�0001750�0001750�00000006114�11341743636�023520� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit delphiselectfolder; interface function BrowseForFolder(const browseTitle: String; const initialFolder: String = ''; mayCreateNewFolder: Boolean = False): String; function SelectDirectoryDelphi(const browseTitle: String; var Folder: String; mayCreateNewFolder: Boolean = False): boolean; implementation uses Windows, Forms, shlobj; function SelectDirectoryDelphi(const browseTitle: String; var Folder: String; mayCreateNewFolder: Boolean = False): boolean; var lTemp: string; begin result := false; lTemp := BrowseForFolder(browseTitle, Folder, mayCreateNewFolder); if (lTemp <> '') then begin Folder := lTemp; result := true; end; // end; var lg_StartFolder: String; //////////////////////////////////////////////////////////////////////// // Call back function used to set the initial browse directory. //////////////////////////////////////////////////////////////////////// function BrowseForFolderCallBack(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall; begin if uMsg = BFFM_INITIALIZED then SendMessage(Wnd,BFFM_SETSELECTION, 1, Integer(@lg_StartFolder[1])); result := 0; end; //////////////////////////////////////////////////////////////////////// // This function allows the user to browse for a folder // // Arguments:- // browseTitle : The title to display on the browse dialog. // initialFolder : Optional argument. Use to specify the folder // initially selected when the dialog opens. // mayCreateNewFolder : Flag indicating whether the user can create a // new folder. // // Returns: The empty string if no folder was selected (i.e. if the user // clicked cancel), otherwise the full folder path. //////////////////////////////////////////////////////////////////////// function BrowseForFolder(const browseTitle: String; const initialFolder: String =''; mayCreateNewFolder: Boolean = False): String; // With later versions of Delphi you may not need these constants. const BIF_NEWDIALOGSTYLE=$40; BIF_NONEWFOLDERBUTTON=$200; var browse_info: TBrowseInfo; folder: array[0..MAX_PATH] of char; find_context: PItemIDList; begin //-------------------------- // Initialise the structure. //-------------------------- FillChar(browse_info,SizeOf(browse_info),#0); lg_StartFolder := initialFolder; browse_info.pszDisplayName := @folder[0]; browse_info.lpszTitle := PChar(browseTitle); browse_info.ulFlags := BIF_RETURNONLYFSDIRS or BIF_NEWDIALOGSTYLE; if not mayCreateNewFolder then browse_info.ulFlags := browse_info.ulFlags or BIF_NONEWFOLDERBUTTON; browse_info.hwndOwner := Application.Handle; if initialFolder <> '' then browse_info.lpfn := BrowseForFolderCallBack; find_context := SHBrowseForFolder(browse_info); if Assigned(find_context) then begin if SHGetPathFromIDList(find_context,folder) then result := folder else result := ''; GlobalFreePtr(find_context); end else result := ''; end; end.����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/define_types.pas��������������������������������������������0000664�0001750�0001750�00000111364�11751725044�022337� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit define_types; interface {$H+} {$include isgui.inc} uses {$IFNDEF FPC} {$IFDEF GUI} FileCtrl, delphiselectfolder, {$ENDIF} DiskSpaceKludge, Controls, {$ELSE} {$IFDEF GUI} lclintf,LResources,{$ENDIF} {$ENDIF} {$IFNDEF Unix} Windows, {$ELSE} BaseUnix,{$IFDEF GUI} LCLType, {$ENDIF}//lclintf, LMessages,LCLType,//gettickcount {$ENDIF} SysUtils,classes,IniFiles, {$IFDEF GUI} forms,userdir, dialogs;{$ELSE} dialogsx;{$ENDIF} const kMRIcronVers = '5 May 2012'; NaN : double = 1/0; kMagicDouble : double = -111666222; kTxtFilter = 'Text (*.txt)|*.txt;*.csv|Comma Separated (*.csv)|*.csv'; kNIIFilter = 'NIfTI (*.nii)|*.nii'; kAnyFilter = 'Anything (*)|*'; kAnaHdrFilter = 'Analyze Header (*.hdr)|*.hdr'; kImgPlusVOIFilter = 'NIfTI/Analyze/VOI|*.hdr;*.nii;*.nii.gz;*.voi|NIfTI/Analyze Header (*.hdr;*.nii)|*.hdr;*.nii;*.nii.gz|Volume of interest (*.voi)|*.voi'; kImgFilter = 'NIfTI/Analyze Header (*.hdr;*.nii)|*.hdr;*.nii;*.nii.gz|Volume of interest (*.voi)|*.voi'; kHistoBins = 256;//numbers of bins for histogram/image balance PixelCountMax = 32768; kTab = chr(9); kEsc = chr(27); kCR = chr (13); kBS = #8 ; // Backspace kDel = #127 ; // Delete UNIXeoln = chr(10); kTextSep = kTab;//','; //',' for CSV, kTab for Tab-delimited values kLUTalpha = 255; //255 kVOI8bit = 1;//May07 100; {$IFDEF unix} PathDelim = '/'; {$ELSE} PathDelim = '\'; {$ENDIF} type TPSPlot = RECORD //peristimulus plot TRSec,BinWidthSec: single; nNegBins,nPosBins,SPMDefaultsStatsFmriT,SPMDefaultsStatsFmriT0: integer; TextOutput,GraphOutput, SliceTime,SavePSVol,BaselineCorrect,PctSignal,RemoveRegressorVariability,TemporalDeriv,PlotModel,Batch: boolean end; TRGBquad = PACKED RECORD {$IFDEF ENDIAN_BIG} //OSX PPC rgbreserved,rgbRed,rgbGreen,rgbBlue: byte; //rgbBlue,rgbGreen,rgbRed,rgbreserved: byte; {$ELSE} {$IFDEF UNIX} {$IFDEF DARWIN} rgbreserved,rgbRed,rgbGreen,rgbBlue: byte; {$ELSE} rgbRed,rgbGreen,rgbBlue,rgbreserved: byte; {$ENDIF} {$ELSE} //not unix - windows //rgbreserved,rgbRed,rgbGreen,rgbBlue: byte; rgbBlue,rgbGreen,rgbRed,rgbreserved: byte; {$ENDIF} // rgbBlue,rgbGreen,rgbRed,rgbreserved: byte; {$ENDIF} end; TStretchQuality = (sqLow, sqHigh); //TLUTrgb = array[0..255] of TRGBQuad; //TLUTtype = DWORD; TLUT = array[0..255] of TRGBQuad; kStr20 = string[20]; kStr50 = string[50]; kStr255 = string[255]; TCutout = RECORD Lo : array [1..3] of integer; Hi : array [1..3] of integer; end; int32 = LongInt; uint32 = Cardinal; int16 = SmallInt; uint16 = Word; int8 = ShortInt; uint8 = Byte; Int64RA = array [1..1] of int64; Int64p = ^Int64RA; SingleRA0 = array [0..0] of Single; Singlep0 = ^SingleRA0; ByteRA0 = array [0..0] of byte; Bytep0 = ^ByteRA0; WordRA0 = array [0..0] of Word; Wordp0 = ^WordRA0; SmallIntRA0 = array [0..0] of SmallInt; SMallIntp0 = ^SmallIntRA0; LongIntRA0 = array [0..0] of LongInt; LongIntp0 = ^LongIntRA0; DWordRA = array [1..1] of DWord; DWordp = ^DWordRA; ByteRA = array [1..1] of byte; Bytep = ^ByteRA; WordRA = array [1..1] of Word; Wordp = ^WordRA; SmallIntRA = array [1..1] of SmallInt; SMallIntp = ^SmallIntRA; LongIntRA = array [1..1] of LongInt; LongIntp = ^LongIntRA; SingleRA = array [1..1] of Single; Singlep = ^SingleRA; SingleRARA = array [1..1] of Singlep; SingleRAp = ^SingleRARA; DoubleRA = array [1..1] of Double; Doublep = ^DoubleRA; DoubleRA0 = array [0..0] of Double; Doublep0 = ^DoubleRA0; HistoRA = array [0..kHistoBins] of longint; HistoDoubleRA = array [0..kHistoBins] of double; //pRGBQuadArray = ^TRGBQuad; //TRGBQuadeArray = ARRAY[0..PixelCountMax-1] OF TRGBQuad; //RGBQuadRA = array [1..1] of TRGBQuad; //RGBQuadp = ^RGBQuadRA; TQuadRA = array [1..1] of TRGBQuad; RGBQuadp = ^TQuadRA; // pRGBTripleArray = ^TRGBTripleArray; // TRGBTripleArray = ARRAY[0..PixelCountMax-1] OF TRGBTriple; FUNCTION specialsingle (var s:single): boolean; //check if 32-bit float is Not-A-Number, infinity, etc function FSize (lFName: String): longint; function FileExistsEX(Name: String): Boolean; function ParseFileName (lFilewExt:String): string; function ParseFileFinalDir (lFileName:String): string; function ExtractFileDirWithPathDelim(lInFilename: string): string; function PadStr (lValIn, lPadLenIn: integer): string; function ChangeFileExtX( var lFilename: string; lExt: string): string; //function swap2i(SmallInt): Smallint; function swap4r4i (s:single): longint; //swap and convert: endian-swap and then typecast 32-bit float as 32-bit integer function conv4r4i (s:single): longint; //convert: typecast 32-bit float as 32-bit integer function swap8r(s : double):double; //endian-swap 64-bit float procedure pswap4i(var s : LongInt); //procedure to endian-swap 32-bit integer procedure pswap4r ( var s:single); //procedure to endian-swap 32-bit integer function swap64r(s : double):double; function specialdouble (d:double): boolean; function RealToStr(lR: double {was extended}; lDec: integer): string; function UpCaseExt(lFileName: string): string; function ExtGZ (lFilename: string): boolean; procedure swap4(var s : LongInt); procedure Xswap4r ( var s:single); function Bool2Char (lBool: boolean): char; function Char2Bool (lChar: char): boolean; function Log(X, Base: single): single; //procedure GZipBuffer(var FGzipFilename,FFileDestination: String;lxInBuffer: byteP;lInSize: Integer; lOverwritewarn: boolean); //procedure GZipBuffer(var FGzipFilename,FFileDestination: String;lxInBuffer: byteP;lInSize: Integer); {$IFNDEF FPC} function DiskFreeEx (DriveStr: String): Integer; {$ELSE} function DiskFreeEx (DriveStr: String): Int64; {$ENDIF} procedure SortSingle(var lLo,lHi: single); procedure SortInteger(var lLo,lHi: integer); function IniInt(lIniFile: TIniFile; lIdent: string; lDefault: integer): integer; function IniBool(var lIniFile: TIniFile; lIdent: string; lDefault: boolean): boolean; procedure CopyFileEX (lInName,lOutName: string); procedure CopyFileEXoverwrite (lInName,lOutName: string); procedure fx (a: double); overload; //fx used to help debugging - reports number values procedure fx (a,b: double); overload; procedure fx (a,b,c: double); overload; procedure fx (a,b,c,d: double); overload; function Swap2(s: smallint): smallint; //function DefaultsDir (lSubFolder: string): string; function ChangeFilePostfixExt (lInName,lPostfix,lExt: string): string; procedure SortCutout (var lCutout : TCutout); //ensure Lo < Hi function freeRam: Int64; function OKMsg(lMsg: string): boolean; //shows dialog with OK/Cancel returns true if user presses OK function DirExists (lFolderName: String): boolean; function FilenameParts (lInName: string; var lPath,lName,lExt: string): boolean; function AddIndexToFilename (lInName: string; lIndex: integer): string; procedure createArray64 (var ptr: pointer; var ra :Doublep0; Sz: integer); overload; procedure createArray64 (var ptr: pointer; var ra :Doublep; Sz: integer); overload; function GzExt(lFileName: string): boolean; function ChangeFilePrefixExt (lInName,lPrefix,lExt: string): string; function ChangeFilePrefix(lInName,lPrefix: string): string; function makesmallint (b0,b1: byte): smallint; function makesingle( b0,b1,b2,b3: byte): single; procedure SortInt (var lMin,lMax: integer); function Bound (lDefault,lMin,lMax: integer): integer; function IsNiftiExt(lStr: string): boolean; function IsExtNIFTIHdr(lStr: string): boolean; function IsVOIExt(lStr: string): boolean; //procedure ax(a,b,c,d,e,fx: double); procedure EnsureDirEndsWithPathDelim (var lDir: string); //function IsReadOnly(const FileName: string): Boolean;//I think this only works for existing files... not folders and new files function DirWritePermission(Where: string): Boolean; //I think this is better than above function ExtractDir (lFilepath: string): string; {$IFDEF GUI} function GetDirPrompt (lDefault: string): string; {$ENDIF} function Str2Int (lStr: string): integer; function ResetDefaults : boolean; implementation function ResetDefaults : boolean; const {$IFDEF LINUX} kKey = 'Right button'; {$ELSE} kKey = 'Shift key'; {$ENDIF} var lKey: boolean; begin result := false; {$IFDEF GUI} {$IFDEF LINUX} lKey := (GetKeyState(VK_RBUTTON) And $80)<>0; {$ELSE} lKey := (ssShift in KeyDataToShiftState(vk_Shift)); {$ENDIF} if not lKey then exit; {$IFDEF GUI} case MessageDlg(kKey+' down during launch: do you want to reset the default preferences?', mtConfirmation, [mbYes, mbNo], 0) of { produce the message dialog box } idYes: result := true; end; //case {$ENDIF} {$ENDIF} end; function Str2Int (lStr: string): integer; //robust stringtoint that strips out any junk so that "Implementation Version Name=MR.VB15A" returns 15 // warning, strips out decimals, so 15.3 will return 153! //warning also ignores minus sign so -5.21 will return 521! var Len,P: integer; S: string; begin result := 0; Len := length(lStr); if Len <1 then exit; S := ''; for P := 1 to Len do if lStr[P] in ['-','0'..'9'] then S := S + lStr[P]; if length(S) < 1 then exit; result := strtoint(S); end; {$IFDEF GUI} function GetDirPrompt (lDefault: string): string; // Old versions of Delphi have a clumsy SelectDirectory function, and locks the folder until you quit your application... var lD: string; begin lD := lDefault; if not DirExists(lD) then lD := UserDataFolder; result := lD; // Set the starting directory {$IFDEF FPC} //Delphi SelectDirectory uses FileCtrl //Lazarus SelectDirectory uses Dialogs chdir(result); //start search from previous dir... if SelectDirectory(result, [sdAllowCreate,sdPerformCreate,sdPrompt], 0) then begin chdir(result); exit; end; {$ELSE} if SelectDirectoryDelphi('Select folder', result, true) then exit; {$ENDIF} //if the user aborts, make sure we use the default directory... result := lD; end; {$ENDIF} //GUI function ExtractDir (lFilepath: string): string; //if passed file \usr\temp\data.txt returns \usr\temp\ //if passed dir \usr\temp returns \usr\temp\ //note returned always includes pathdelim var lName,lExt: string; begin FilenameParts (lFilepath,Result,lName,lExt); end; function DirWritePermission(Where: string): Boolean; {$IFDEF UNIX} //Uses BaseUnix; begin result := (fpAccess (ExtractDir(Where),W_OK)=0); end; {$ELSE} Var i : Longint; lFilename: string; Begin result := false; if length(Where) < 1 then exit; if DirExists (Where) then begin if Where[length(Where)] <> PathDelim then lFilename := Where + pathdelim + 'dummy.dum' else lFilename := Where + 'dummy.dum'; end else lFilename := Where; if fileexists (lFilename) then exit; //do not overwrite existing file i:=FileCreate (lFilename); if i=-1 then Halt(1); FileClose(i); DeleteFile(lFilename); result := true; end; {$ENDIF} (*function IsReadOnly(const FileName: string): Boolean; var sr: TSearchRec; begin // Assume not read only Result := False; if FindFirst(FileName, faAnyFile, sr) = 0 then begin Result := (sr.Attr and faReadOnly) <> 0; FindClose(sr); end; end; *) procedure EnsureDirEndsWithPathDelim (var lDir: string); begin if length(lDir) < 1 then exit; if lDir[length(lDir)] = pathdelim then exit; lDir := lDir + pathdelim; end; function AddIndexToFilename (lInName: string; lIndex: integer): string; var lPath,lName,lExt: string; begin result := ''; if not FilenameParts (lInName, lPath,lName,lExt) then exit; result := lPath+lName+inttostr(lIndex)+lExt; end; function Bound (lDefault,lMin,lMax: integer): integer; begin result := lDefault; if result < lMin then result := lMin; if result > lMax then result := lMax; end; function IsVOIExt(lStr: string): boolean; var lExt: string; begin result := false; lExt := UpCaseExt(lStr); if (lExt = '.VOI') then result := true; end; function IsNiftiExt(lStr: string): boolean; var lExt: string; begin result := false; lExt := UpCaseExt(lStr); if (lExt = '.NII') or (lExt = '.NII.GZ') then result := true; if (lExt = '.HDR') and (FSize(ChangeFileExt(lStr,'.img'))> 0) then result := true; if (lExt = '.IMG') and (FSize(ChangeFileExt(lStr,'.hdr'))> 0) then result := true; end; function IsExtNIFTIHdr(lStr: string): boolean; //detect hdr, nii,niigz var lExt: string; begin result := false; lExt := UpCaseExt(lStr); if (lExt = '.NII') or (lExt = '.NII.GZ') then result := true; if (lExt = '.HDR') and (FSize(ChangeFileExt(lStr,'.img'))> 0) then result := true; (*if (lExt = '.IMG') and (FSize(ChangeFileExt(lStr,'.hdr'))> 0) then result := true; *) end; procedure SortInt (var lMin,lMax: integer); var lSwap: integer; begin if lMin <= lMax then exit; lSwap := lMax; lMax := lMin; lMin := lSwap; end; function makesmallint (b0,b1: byte): smallint; type swaptype = packed record case byte of 0:(b0,b1 : byte); //word is 16 bit 1:(s:smallint); end; swaptypep = ^swaptype; var //inguy:swaptypep; outguy:swaptype; begin //inguy := @s; //assign address of s to inguy outguy.b0 := b0; outguy.b1 := b1; result:=outguy.s; end;//makesmallint function makesingle( b0,b1,b2,b3: byte): single; type swaptype = packed record case byte of 0:(b0,b1,b2,b3 : byte); //word is 16 bit 1:(long:single); end; swaptypep = ^swaptype; var outguy:swaptype; begin //inguy := @s; //assign address of s to inguy outguy.b0 := b0; outguy.b1 := b1; outguy.b2 := b2; outguy.b3 := b3; result:=outguy.long; end;//swap4r4i function ChangeFilePrefix(lInName,lPrefix: string): string; var lC,lLen,lPos: integer; lStr: string; begin //result := changefileext(lInName,lExt); result := lInName; lLen := length (result); if lLen < 1 then exit; lPos := lLen; while (lPos > 1) and (result[lPos] <> pathdelim) do dec(lPos); lStr := ''; for lC := 1 to lPos do lStr := lStr+result[lC]; lStr := lStr+lPrefix; if lPos < lLen then for lC := (lPos+1) to lLen do lStr := lStr+result[lC]; result := lStr; end; function ChangeFilePrefixExt (lInName,lPrefix,lExt: string): string; var lC,lLen,lPos: integer; lStr: string; begin result := changefileext(lInName,lExt); lLen := length (result); if lLen < 1 then exit; lPos := lLen; while (lPos > 1) and (result[lPos] <> pathdelim) do dec(lPos); lStr := ''; for lC := 1 to lPos do lStr := lStr+result[lC]; lStr := lStr+lPrefix; if lPos < lLen then begin lC := lPos+1; while (lC <= lLen) and (result[lC] <> '.') do begin lStr := lStr + result[lC]; inc(lC); end; end; lStr := lStr + lExt; result := lStr; end; function GzExt(lFileName: string): boolean; var lExt: string; begin lExt := UpCaseExt(lFilename); if (lExt = '.VOI') or (lExt = '.NII.GZ') or (lExt = '.GZ') then result := true else result := false; end; function FilenameParts (lInName: string; var lPath,lName,lExt: string): boolean; var lLen,lPos,lExtPos,lPathPos: integer; begin result := false; lPath := ''; lName := ''; lExt := ''; lLen := length(lInName); if lLen < 1 then exit; if DirExists(lInName) then begin //we have been passed a folder, not a file if lInName[lLen] = PathDelim then lPath := lInName else lPath := lInName + pathdelim; exit; end; //next find final pathdelim lPathPos := lLen; while (lPathPos > 0) and (lInName[lPathPos] <> '\') and (lInName[lPathPos] <> '/') do dec(lPathPos); if (lInName[lPathPos] = '\') or (lInName[lPathPos] = '/') then begin for lPos := 1 to lPathPos do lPath := lPath + lInName[lPos]; end; // else // dec(lPathPos); inc(lPathPos); //next find first ext //lExtPos := 1; lExtPos := length(lPath);//July 2009 -- beware of '.' in foldername... while (lExtPos <= lLen) and (lInName[lExtPos] <> '.') do inc(lExtPos); if (lInName[lExtPos] = '.') then begin for lPos := lExtPos to lLen do lExt := lExt + lInName[lPos]; end; // else // inc(lExtPos); dec(lExtPos); //next extract filename //fx(lPathPos,lExtPos); if (lPathPos <= lExtPos) then for lPos := lPathPos to lExtPos do lName := lName + lInName[lPos]; result := true; end; procedure createArray64 (var ptr: pointer; var ra :Doublep0; Sz: integer); overload; var i: integer; begin getmem(ptr,16+(sizeof(double)*Sz)); {$IFDEF FPC} ra := align(ptr,16); {$ELSE} ra := DoubleP0((integer(ptr) and $FFFFFFF0)+16); {$ENDIF} for i := (Sz-1) downto 0 do //initialise array ra^[i] := 0; end; procedure createArray64 (var ptr: pointer; var ra :Doublep; Sz: integer); overload; var i: integer; begin getmem(ptr,16+(sizeof(double)*Sz)); {$IFDEF FPC} ra := align(ptr,16); {$ELSE} ra := DoubleP((integer(ptr) and $FFFFFFF0)+16); {$ENDIF} for i := (Sz) downto 1 do //initialise array ra^[i] := 0; end; function OKMsg(lMsg: string): boolean; //shows dialog with OK/Cancel returns true if user presses OK begin result := false; {$IFDEF GUI} case MessageDlg(lMsg, mtConfirmation, [mbYes, mbCancel], 0) of idCancel {mrCancel}: exit; end; //case {$ELSE} case MsgDlg(lMsg, mtConfirmation, [mbYes, mbCancel], 0) of mrCancel: exit; end; //case {$ENDIF} result := true; end; (*function DirExists (lDir: String): boolean; var lSearchRec: TSearchRec; begin FindFirst(lDir, faAnyFile, lSearchRec); if (faDirectory and lSearchRec.attr) = faDirectory then DirExists := true else DirExists := false; FindClose(lSearchRec);{} end;*) {$IFNDEF GUI} {$IFNDEF FPC} //The FileCtrl unit is pretty bulky, and we only need this one call that it links from SysUtils function DirectoryExists(const Name: string): Boolean; var Code: Integer; begin Code := GetFileAttributes(PChar(Name)); Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0); end; {$ENDIF} {$ENDIF} function DirExists (lFolderName: string): boolean; (*{$IFNDEF GUI} var lSearchRec: TSearchRec; begin result := false; if fileexists(lFoldername) then //File not folder exit; Filemode := 0; //readonly if FindFirst(lFolderName, faDirectory, lSearchRec) = 0 then begin result := true; FindClose(lSearchRec); end else result := false; //some files found Filemode := 2; {$ELSE} *) begin result := DirectoryExists(lFolderName); //{$ENDIF} end; function freeRam: Int64; {$IFDEF UNIX} begin result := maxint; end; {$ELSE} var memory:TMemoryStatus; begin memory.dwLength:=sizeof(memory); GlobalMemoryStatus(memory); result := memory.dwavailPhys; //result := 1024; end; {$ENDIF} procedure SortCutout (var lCutout : TCutout); //ensure Lo < Hi var lInc,lSwap: integer; begin for lInc := 1 to 3 do if lCutout.Lo[lInc] > lCutout.Hi[lInc] then begin lSwap := lCutout.Lo[lInc]; lCutout.Lo[lInc] := lCutout.Hi[lInc]; lCutout.Hi[lInc] := lSwap; end; end; function ChangeFilePostfixExt (lInName,lPostfix,lExt: string): string; var lPath,lName,lExtIn: string; begin FilenameParts (lInName, lPath,lName,lExtIn); result := lPath+lName+lPostFix+lExt; //showmessage(result); end; (*var lC,lLen,lPos: integer; lStr: string; begin result := changefileext(lInName,lExt); lLen := length (result); if lLen < 1 then exit; lPos := lLen; while (lPos > 1) and (result[lPos] <> pathdelim) and (result[lPos] <> '.') do dec(lPos); if result[lPos] = '.' then dec(lPos); lStr := ''; for lC := 1 to lPos do lStr := lStr+result[lC]; lStr := lStr+lPostfix; if lPos < lLen then for lC := (lPos+1) to lLen do lStr := lStr+result[lC]; result := lStr; end; *) (*procedure ApplySaveDlgFilter (lSaveDlg: TSaveDialog); var lLen,lPos,lPipes,lPipesReq: integer; lExt: string; begin lPipesReq := (lSaveDlg.FilterIndex * 2)-1; if lPipesReq < 1 then exit; lLen := length(lSaveDlg.Filter); lPos := 1; lPipes := 0; while (lPos < lLen) and (lPipes < lPipesReq) do begin if lSaveDlg.Filter[lPos] = '|' then inc(lPipes); inc(lPos); end; if (lPos >= lLen) or (lPipes < lPipesReq) then exit; lExt := ''; while (lPos <= lLen) and (lSaveDlg.Filter[lPos] <> '|') do begin if lSaveDlg.Filter[lPos] <> '*' then lExt := lExt + lSaveDlg.Filter[lPos]; inc(lPos); end; if lExt <> '' then lSaveDlg.Filename := ChangeFileExt(lSaveDlg.Filename,lExt); end; *) (*function DefaultsDir (lSubFolder: string): string; //for Linux: DefaultsDir is ~/appname/SubFolder/, e.g. /home/username/mricron/subfolder/ //for Windows: DefaultsDir is in the location of the executable, e.g. c:\program files\mricron\subfolder\ //Note: Final character is pathdelim var lBaseDir: string; begin {$IFDEF Unix} lBaseDir := GetEnvironmentVariable ('HOME')+pathdelim+'.' +ParseFileName(ExtractFilename(paramstr(0) ) ); if not DirectoryExists(lBaseDir) then begin {$I-} MkDir(lBaseDir); if IOResult <> 0 then begin showmessage('Unble to create new folder '+lBaseDir); end; {$I+} end; lBaseDir := lBaseDir+pathdelim; {$ELSE} lBaseDir := extractfiledir(paramstr(0))+pathdelim; {$ENDIF} //if not DirectoryExists(extractfiledir(lBaseDir)) then //mkDir(extractfiledir(lBaseDir)); if lSubFolder <> '' then begin lBaseDir := lBaseDir + lSubFolder; if not DirectoryExists(lBaseDir) then begin {$I-} MkDir(lBaseDir); if IOResult <> 0 then begin showmessage('Unable to create new folder '+lBaseDir); end; {$I+} end; result := lBaseDir + pathdelim; end else result := lBaseDir; end; *) function Swap2(s : SmallInt): smallint; type swaptype = packed record case byte of 0:(Word1 : word); //word is 16 bit 1:(Small1: SmallInt); end; swaptypep = ^swaptype; var inguy:swaptypep; outguy:swaptype; begin inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word1); result :=outguy.Small1; end; procedure fx (a: double); overload; //fx used to help debugging - reports number values begin {$IFDEF GUI} showmessage(floattostr(a)); {$ELSE} msg(floattostr(a)); {$ENDIF} end; procedure fx (a,b: double); overload; //fx used to help debugging - reports number values begin {$IFDEF GUI} showmessage(floattostr(a)+'x'+floattostr(b)); {$ELSE} msg(floattostr(a)+'x'+floattostr(b)); {$ENDIF} end; procedure fx (a,b,c: double); overload; //fx used to help debugging - reports number values begin {$IFDEF GUI} showmessage(floattostr(a)+'x'+floattostr(b)+'x'+floattostr(c)); {$ELSE} msg(floattostr(a)+'x'+floattostr(b)+'x'+floattostr(c)); {$ENDIF} end; procedure fx (a,b,c,d: double); overload; //fx used to help debugging - reports number values begin {$IFDEF GUI} showmessage(floattostr(a)+'x'+floattostr(b)+'x'+floattostr(c)+'x'+floattostr(d)); {$ELSE} msg(floattostr(a)+'x'+floattostr(b)+'x'+floattostr(c)+'x'+floattostr(d)); {$ENDIF} end; procedure CopyFileEXoverwrite (lInName,lOutName: string); var lFSize: Integer; lBuff: bytep0; lFData: file; begin lFSize := FSize(lInName); if (lFSize < 1) then exit; assignfile(lFdata,lInName); filemode := 0; reset(lFdata,lFSize{1}); GetMem( lBuff, lFSize); BlockRead(lFdata, lBuff^, 1{lFSize}); closefile(lFdata); assignfile(lFdata,lOutName); filemode := 2; Rewrite(lFdata,lFSize); BlockWrite(lFdata,lBuff^, 1 {, NumWritten}); closefile(lFdata); freemem(lBuff); end; procedure CopyFileEX (lInName,lOutName: string); var lFSize: Integer; begin lFSize := FSize(lInName); if (lFSize < 1) or (fileexistsEX(lOutName)) then exit; CopyFileEXoverwrite (lInName,lOutName); end; function IniInt(lIniFile: TIniFile; lIdent: string; lDefault: integer): integer; var lStr: string; begin result := lDefault; lStr := lIniFile.ReadString('INT',lIdent, ''); if length(lStr) > 0 then result := StrToInt(lStr); end; //proc IniInt function IniBool(var lIniFile: TIniFile; lIdent: string; lDefault: boolean): boolean; var lStr: string; begin result := lDefault; lStr := lIniFile.ReadString('BOOL',lIdent, ''); //showmessage('x'+lStr+'x'); if length(lStr) > 0 then result := Char2Bool(lStr[1]); end; //nested IniBool procedure SortInteger(var lLo,lHi: integer); var lSwap: integer; begin if lLo > lHi then begin lSwap := lLo; lLo := lHi; lHi := lSwap; end; //if Lo>Hi end; //proc SortSingle procedure SortSingle(var lLo,lHi: single); var lSwap: single; begin if lLo > lHi then begin lSwap := lLo; lLo := lHi; lHi := lSwap; end; //if Lo>Hi end; //proc SortSingle {$IFDEF FPC} {$IFDEF UNIX} //FPC and Unix function DiskFreeEx (DriveStr: String): Int64; var lOutDisk: Integer; begin //lOutDisk := AddDisk(DriveStr); //result := DiskFree(lOutDisk); result := maxint; end; {$ELSE} //FPC and Windows function DiskFreeEx (DriveStr: String): Int64; var lOutDisk: Integer; begin lOutDisk := ord(upcase(DriveStr[1]))+1-ord('A'); if (lOutDisk >= 0) and (lOutDisk <= 26) then result := DiskFree(lOutDisk) else result := 0; //showmessage(DriveStr+'->*'+inttostr(lOutDisk)+'* :'+inttostr(result)); //showmessage(inttostr(DiskFree(0){current drive})+' :'+inttostr(DiskFree(3) {C drive})); end; {$ENDIF} {$ELSE} //Delphi Windows function DiskFreeEx (DriveStr: String): Integer; var lOutDisk: Integer; lDiskDir : string; lSize8: Tinteger8; begin lOutDisk := ord(upcase(DriveStr[1]))+1-ord('A'); if (lOutDisk >= ord('A')) and (lOutDisk <= ord('Z')) then begin DiskFreeEx := DiskFree(lOutDisk); end else begin lDiskDir :=(ExtractFileDrive(DriveStr))+'\'; lSize8 := DiskFreeStr (lDiskDir); if lSize8 > MaxINt then DiskFreeEx := MaxInt else DiskFreeEx := round(lSize8); end; end; {$ENDIF} function Log(X, Base: single): single; begin if X = 0 then result := 0 else Log := Ln(X) / Ln(Base); end; function Bool2Char (lBool: boolean): char; begin if lBool then result := '1' else result := '0'; end; function Char2Bool (lChar: char): boolean; begin if lChar = '1' then result := true else result := false; end; procedure Xswap4r ( var s:single); type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit end; swaptypep = ^swaptype; var inguy:swaptypep; outguy:swaptype; begin inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); inguy^.Word1 := outguy.Word1; inguy^.Word2 := outguy.Word2; end; procedure swap4(var s : LongInt); type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(Long:LongInt); end; swaptypep = ^swaptype; var inguy:swaptypep; outguy:swaptype; begin inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); s:=outguy.Long; end; function UpCaseExt(lFileName: string): string; var lI: integer; l2ndExt,lExt : string; begin lExt := ExtractFileExt(lFileName); if length(lExt) > 0 then for lI := 1 to length(lExt) do lExt[lI] := upcase(lExt[lI]); result := lExt; if lExt <> '.GZ' then exit; lI := length(lFileName) - 6; if li < 1 then exit; l2ndExt := upcase(lFileName[lI])+upcase(lFileName[lI+1])+upcase(lFileName[li+2])+upcase(lFileName[li+3]); if l2ndExt = '.NII' then result := '.NII.GZ' end; function ExtGZ (lFilename: string): boolean; var lI: integer; lExt : string; begin lExt := ExtractFileExt(lFileName); if length(lExt) > 0 then for lI := 1 to length(lExt) do lExt[lI] := upcase(lExt[lI]); if lExt = '.GZ' then result := true else result := false; end; function RealToStr(lR: double {was extended}; lDec: integer): string; begin RealTOStr := FloatToStrF(lR, ffFixed,7,lDec); end; FUNCTION specialdouble (d:double): boolean; //returns true if s is Infinity, NAN or Indeterminate //8byte IEEE: msb[63] = signbit, bits[52-62] exponent, bits[0..51] mantissa //exponent of all 1s = Infinity, NAN or Indeterminate CONST kSpecialExponent = 2047 shl 20; VAR Overlay: ARRAY[1..2] OF LongInt ABSOLUTE d; BEGIN IF ((Overlay[2] AND kSpecialExponent) = kSpecialExponent) THEN RESULT := true ELSE RESULT := false; END; function swap8r(s : double):double; type swaptype = packed record case byte of 0:(Word1,Word2,Word3,Word4 : word); //word is 16 bit 1:(float:double); end; swaptypep = ^swaptype; var inguy:swaptypep; outguy:swaptype; begin inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word4); outguy.Word2 := swap(inguy^.Word3); outguy.Word3 := swap(inguy^.Word2); outguy.Word4 := swap(inguy^.Word1); try result:=outguy.float; except result := 0; exit; end; end; //func swap8r procedure pswap4i(var s : LongInt); type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(Long:LongInt); end; swaptypep = ^swaptype; var inguy:swaptypep; outguy:swaptype; begin inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); s:=outguy.Long; end; //proc swap4 function swap64r(s : double):double; type swaptype = packed record case byte of 0:(Word1,Word2,Word3,Word4 : word); //word is 16 bit 1:(float:double); end; swaptypep = ^swaptype; var inguy:swaptypep; outguy:swaptype; begin inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word4); outguy.Word2 := swap(inguy^.Word3); outguy.Word3 := swap(inguy^.Word2); outguy.Word4 := swap(inguy^.Word1); try swap64r:=outguy.float; except swap64r := 0; exit; end;{} end; procedure pswap4r ( var s:single); type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit end; swaptypep = ^swaptype; var inguy:swaptypep; outguy:swaptype; begin inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); inguy^.Word1 := outguy.Word1; inguy^.Word2 := outguy.Word2; end; //proc Xswap4r function conv4r4i (s:single): longint; type swaptype = packed record case byte of 1:(long:longint); end; swaptypep = ^swaptype; var inguy:swaptypep; begin inguy := @s; //assign address of s to inguy conv4r4i:=inguy^.long; end; function swap4r4i (s:single): longint; type swaptype = packed record case byte of 0:(Word1,Word2 : word); //word is 16 bit 1:(long:longint); end; swaptypep = ^swaptype; var inguy:swaptypep; outguy:swaptype; begin inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word2); outguy.Word2 := swap(inguy^.Word1); swap4r4i:=outguy.long; end;//swap4r4i (*function ChangeFileExtX( var lFilename: string; lExt: string): string; begin result := ChangeFileExt(lFilename,lExt); end; *) function ChangeFileExtX(var lFilename: string; lExt: string): string; overload; //sees .nii.gz as single extension var lPath,lName,lOrigExt: string; begin if FilenameParts (lFilename, lPath,lName,lOrigExt) then begin //showmessage('12222'+lPath +'**'+lName+'**'+lOrigExt); result := lPath+lName+lExt; end else begin //showmessage('z'); result := ChangeFileExt(lFilename,lExt); end; end; function PadStr (lValIn, lPadLenIn: integer): string; var lOrigLen,lPad : integer; begin lOrigLen := length(inttostr(lValIn)); result := inttostr(lValIn); if lOrigLen < lPadLenIn then begin lOrigLen := lPadLenIn-lOrigLen; for lPad := 1 to lOrigLen do result := '0'+result; end; end; function ExtractFileDirWithPathDelim(lInFilename: string): string; //F:\filename.ext -> 'F:\' and F:\dir\filename.ext -> 'F:\dir\' //Despite documentation, Delphi3's ExtractFileDir does not always retain final pathdelim var lFilePath: string; begin result := ''; if DirExists(lInFilename) then lFilePath := lInFilename else lFilePath := ExtractFileDir(lInFilename); if length(lFilepath) < 1 then exit; if lFilePath[length(lFilepath)] <> pathdelim then lFilepath := lFilepath + pathdelim; //Delphi3 bug: sometimes forgets pathdelim result := lFilepath; end; function ParseFileFinalDir (lFileName:String): string; var lLen,lInc,lPos: integer; lInName,lName: String; begin lInName := extractfiledir(lFilename); lName := ''; lLen := length(lInName); if lLen < 1 then exit; lInc := lLen; repeat dec(lInc); until (lInName[lInc] = pathdelim) or (lInc = 1); if lInName[lInc] = pathdelim then inc(lInc); //if '\folder' then return 'folder' for lPos := lInc to lLen do lName := lName + lInName[lPos]; ParseFileFinalDir := lName; end; function ParseFileName (lFilewExt:String): string; var lLen,lInc: integer; lName: String; begin lName := ''; lLen := length(lFilewExt); lInc := lLen+1; if lLen > 0 then begin repeat dec(lInc); until (lFileWExt[lInc] = '.') or (lInc = 1); if (UpCaseExt(lFilewExt) = '.NII.GZ') and (lInc > 1) then repeat dec(lInc); until (lFileWExt[lInc] = '.') or (lInc = 1); end; if lInc > 1 then for lLen := 1 to (lInc - 1) do lName := lName + lFileWExt[lLen] else lName := lFilewExt; //no extension ParseFileName := lName; end; Function {TMainForm.}FileExistsEX(Name: String): Boolean; var F: File; begin result := false; if Name = '' then exit; result := FileExists(Name); if result then exit; //the next bit attempts to check for a file to avoid WinNT bug AssignFile(F, Name); {$I-} Reset(F); {$I+} Result:=IOresult = 0; if Result then CloseFile(F); end; function FSize (lFName: String): longint; var SearchRec: TSearchRec; begin result := 0; if not fileexistsex(lFName) then exit; FindFirst(lFName, faAnyFile, SearchRec); result := SearchRec.size; FindClose(SearchRec); end; procedure Xswap8r(var s : double); type swaptype = packed record case byte of 0:(Word1,Word2,Word3,Word4 : word); //word is 16 bit //1:(float:double); end; swaptypep = ^swaptype; var inguy:swaptypep; outguy:swaptype; begin inguy := @s; //assign address of s to inguy outguy.Word1 := swap(inguy^.Word4); outguy.Word2 := swap(inguy^.Word3); outguy.Word3 := swap(inguy^.Word2); outguy.Word4 := swap(inguy^.Word1); inguy^.Word1 := outguy.Word1; inguy^.Word2 := outguy.Word2; inguy^.Word3 := outguy.Word3; inguy^.Word4 := outguy.Word4; end; FUNCTION specialsingle (var s:single): boolean; //returns true if s is Infinity, NAN or Indeterminate //4byte IEEE: msb[31] = signbit, bits[23-30] exponent, bits[0..22] mantissa //exponent of all 1s = Infinity, NAN or Indeterminate CONST kSpecialExponent = 255 shl 23; VAR Overlay: LongInt ABSOLUTE s; BEGIN IF ((Overlay AND kSpecialExponent) = kSpecialExponent) THEN RESULT := true ELSE RESULT := false; END; end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/common/cpucount.pas������������������������������������������������0000664�0001750�0001750�00000004477�11326434462�021526� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit cpucount; interface //returns number of cores: a computer with two dual cores will report 4 function GetLogicalCpuCount: Integer; implementation {$Include isgui.inc} {$IFDEF UNIX} {$IFDEF Darwin} uses Process,SysUtils,Controls,classes,IniFiles, {$IFDEF GUI}dialogs;{$ELSE} dialogsx;{$ENDIF} function GetLogicalCpuCount: Integer; //returns number of CPUs for MacOSX computer //example - will return 4 if the computer has two dual core CPUs //requires Process in Uses Clause //see http://wiki.lazarus.freepascal.org/Executing_External_Programs var lProcess: TProcess; lLen,lPos: integer; lStr: string; lStringList: TStringList; begin Result := 1; lProcess := TProcess.Create(nil); lStringList := TStringList.Create; lProcess.CommandLine := 'sysctl hw.ncpu'; lProcess.Options := lProcess.Options + [poWaitOnExit, poUsePipes]; lProcess.Execute; lStringList.LoadFromStream(lProcess.Output); lLen := length(lStringList.Text); if lLen > 0 then begin lStr := ''; for lPos := 1 to lLen do if lStringList.Text[lPos] in ['0'..'9'] then lStr := lStr + lStringList.Text[lPos]; if length(lStr) > 0 then result := strtoint(lStr); end;//if at least one character returned if result < 1 then //just incase there is a horrible error, e.g. 0 result := 1; lStringList.Free; lProcess.Free; end; {$ELSE} //Not Darwin ... Assume Linux uses classes,sysutils; function GetLogicalCpuCount: Integer; var lS: TStringList; lFilename: string; lLine,lnLines: integer; begin result := 1; lFilename := '/proc/cpuinfo'; if not fileexists(lFilename) then exit; lS:= TStringList.Create; lS.LoadFromFile(lFilename); lnLines := lS.Count; if lnLines > 0 then begin result := 0; for lLine := 1 to lnLines do if lS[lLine-1] = '' then inc(result); end; if result < 1 then result := 1; lS.Free; end; {$ENDIF} //If Darwin Else Linux {$ELSE} //If UNIX ELSE NOT Unix uses Windows; function GetLogicalCpuCount: Integer; var SystemInfo: _SYSTEM_INFO; begin GetSystemInfo(SystemInfo); Result := SystemInfo.dwNumberOfProcessors; end; {$ENDIF} end. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/clustering.pas�����������������������������������������������������0000664�0001750�0001750�00000017727�11326434462�020557� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit clustering; //USED by stats to select only regions with a given number of connected/contiguous voxels interface uses define_types,dialogs,SysUtils,nifti_hdr,nifti_img; //procedure FindClusters (lMultiBuf: SingleP; lXdim, lYDim, lZDim, lThreshClusterSz: integer; lMinNeg, lMinPos: single); function ClusterFilterScrnImg (var lHdr: TMRIcroHdr; lThreshClusterSz: integer; lThresh: double ): boolean; implementation procedure FindClusters (var lHdr: TMRIcroHdr; lXdim, lYDim, lZDim, lThreshClusterSz: integer; lThresh: double); var lThreshClusterSzM1,lScaledThresh,lClusterSign,lClusterSz,lClusterFillValue,lQTail,lQHead,lSliceSz,lQSz,lInc,lVolSz: integer; lClusterBuff, lQra: LongIntP; lBuffIn32 : SingleP; lBuffIn16 : SmallIntP; lScaledThreshFloat: double; //lFdata: file;//abba - test const kFillValue = -2; Procedure IncQra(var lVal, lQSz: integer); begin inc(lVal); if lVal >= lQSz then lVal := 1; end; procedure Check(lPixel: integer); begin //if lClusterFillValue = kFillvalue then showmessage(inttostr(lPixel)+'@'); if (lClusterBuff^[lPixel]=lClusterSign) then begin//add item //if lClusterFillValue = kFillvalue then showmessage(inttostr(lPixel)); incQra(lQHead,lQSz); inc(lClusterSz); lClusterBuff^[lPixel] := lClusterFillValue; lQra^[lQHead] := lPixel; end; end; PROCEDURE RetirePixel; //FIFO cleanup , 1410: added 18-voxel check VAR lXDimM,lVal,lValX,lXPos,lYPos,lZPos: integer; BEGIN lVal := lQra^[lQTail]; if lVal = 0 then begin //should never happen: unmarked voxel = increment lQTail so not infinite loop incQra(lQTail,lQSz); //done with this pixel exit; end; lXpos := lVal mod lXdim; if lXpos = 0 then lXPos := lXdim; lYpos := (1+((lVal-1) div lXdim)) mod lYDim; if lYPos = 0 then lYPos := lYdim; lZpos := ((lVal-1) div lSliceSz)+1; if (lXPos <= 1) or (lXPos >= lXDim) or (lYPos <= 1) or (lYPos >= lYDim) or (lZPos <= 1) or (lZPos >= lZDim) then // retire and exit else begin lXDimM := lXDim; Check(lVal-1); //left Check(lVal+1); //right Check(lVal-lXDimM); //up Check(lVal+lXDimM); //down Check(lVal-lSliceSz); //up Check(lVal+lSliceSz); //down //check plane above lValX := lVal + lSLiceSz; Check(lValX-1); //left Check(lValX+1); //right Check(lValX-lXDimM); //up Check(lValX+lXDimM); //down //check plane below lValX := lVal - lSLiceSz; Check(lValX-1); //left Check(lValX+1); //right Check(lValX-lXDimM); //up Check(lValX+lXDimM); //down //check diagonals of current plane Check(lVal-lXDimM-1); //up, left Check(lVal-lXDimM+1); //up, right Check(lVal+lXDimM-1); //down, left Check(lVal+lXDimM+1); //down, right end;{} //not edge incQra(lQTail,lQSz); //done with this pixel END; procedure FillStart (lPt: integer); {FIFO algorithm: keep memory VERY low} var lI: integer; begin if (lClusterBuff^[lPt]<>lClusterSign) then exit; for lI := 1 to lQsz do lQra^[lI] := 0; lQHead := 0; lQTail := 1; Check(lPt); RetirePixel; // check that there was anything in the cluster at all //showmessage('head'+inttostr(lQHead)+'.'+inttostr(lQTail)); //if lQHead > 2 then begin // and do the recursion to get rid of it while ((lQHead+1) <> lQTail) do begin//complete until all voxels in buffer have been tested RetirePixel; if (lQHead = lQSz) and (lQTail = 1) then exit; //break condition: avoids possible infinite loop where QTail is being incremented but QHead is stuck at maximum value end; //end; //showmessage('alldone'); end; procedure SelectClusters (lSign: integer); var lInc: integer; begin for lInc := 1 to lVolSz do begin if lClusterBuff^[lInc] = lSign then begin // measure size of the cluster and fill it with kFillValue lClusterSz := 0; lClusterSign := lSign; lClusterFillValue := kFillValue; FillStart(lInc); // now fill the cluster with its size (=1 if the voxel was isolated) lClusterFillValue := lClusterSz; lClusterSign := kFillValue; //if lClusterSz > 1 then ShowMessage(inttostr(lClusterSz)+'@'+inttostr(lInc)); if lClusterSz > 1 then FillStart(lInc) else lClusterBuff^[lInc] := 1; //fill all voxels in cluster with size of voxel end; end; end; begin lVolSz := lXdim*lYdim*lZdim; lSliceSz := lXdim * lYdim; if (lXDim < 4) or (lYDim < 4) or (lZDim < 4) or (lVolSz < 1) then exit; GetMem(lClusterBuff, lVolSz* sizeof(LongInt)); for lInc := 1 to lVolSz do lClusterBuff^[lInc] := 0; if lHdr.ImgBufferBPP = 4 then begin lBuffIn32 := SingleP(lHdr.ImgBuffer); lScaledThreshFloat := Scaled2RawIntensity (lHdr, lThresh); for lInc := 1 to lVolSz do if lBuffIn32^[lInc] > lScaledThreshFloat then lClusterBuff^[lInc] := 1; lScaledThreshFloat := Scaled2RawIntensity (lHdr, -lThresh); for lInc := 1 to lVolSz do if lBuffIn32^[lInc] < lScaledThreshFloat then lClusterBuff^[lInc] := -1; end else if lHdr.ImgBufferBPP = 2 then begin //not 32bit - if 16bit input lBuffIn16 := SmallIntP(lHdr.ImgBuffer); lScaledThresh := round(Scaled2RawIntensity (lHdr, lThresh)); for lInc := 1 to lVolSz do if lBuffIn16^[lInc] > lScaledThresh then lClusterBuff^[lInc] := 1; lScaledThresh := round(Scaled2RawIntensity (lHdr, -lThresh)); for lInc := 1 to lVolSz do if lBuffIn16^[lInc] < lScaledThresh then lClusterBuff^[lInc] := -1; end else begin //not 16 or 32 bit input lScaledThresh := round(Scaled2RawIntensity (lHdr, lThresh)); for lInc := 1 to lVolSz do if lHdr.ImgBuffer^[lInc] > lScaledThresh then lClusterBuff^[lInc] := 1; lScaledThresh := round(Scaled2RawIntensity (lHdr, -lThresh)); for lInc := 1 to lVolSz do if lHdr.ImgBuffer^[lInc] < lScaledThresh then lClusterBuff^[lInc] := -1; end; //8-bit input lThreshClusterSzM1 := lThreshClusterSz; if lThreshClusterSzM1 < 1 then lThreshClusterSzM1 := 1; if (lThreshClusterSzM1 > 1) then begin //Next - START count cluster size lQSz := (lVolSz div 4)+8; GetMem(lQra,lQsz * sizeof(longint) ); //check positive clusters.... SelectClusters(1); //Check negative clusters SelectClusters(-1); Freemem(lQra); //END check clusters end; //only count clusters if minimum size > 1, otherwise simple intensity threshold... //NEXT: mask image data with cluster size if lHdr.ImgBufferBPP = 4 then begin lBuffIn32 := SingleP(lHdr.ImgBuffer); for lInc := 1 to lVolSz do if lClusterBuff^[lInc] < lThreshClusterSzM1 then lBuffIn32^[lInc] := 0; end else if lHdr.ImgBufferBPP = 2 then begin lBuffIn16 := SmallIntP(lHdr.ImgBuffer); for lInc := 1 to lVolSz do if lClusterBuff^[lInc] < lThreshClusterSzM1 then lBuffIn16^[lInc] := 0; end else begin for lInc := 1 to lVolSz do if lClusterBuff^[lInc] < lThreshClusterSzM1 then lHdr.ImgBuffer^[lInc] := 0; end; Freemem(lClusterBuff); end; function ClusterFilterScrnImg (var lHdr: TMRIcroHdr; lThreshClusterSz: integer; lThresh: double ): boolean; var lX,lY,lZ: integer; begin result := false; lX := lHdr.NIFTIhdr.Dim[1]; lY := lHdr.NIFTIhdr.Dim[2]; lZ := lHdr.NIFTIhdr.Dim[3]; if (lHdr.ImgBufferItems < (lX*lY*lZ)) then exit; FindClusters (lHdr, lX, lY, lZ, lThreshClusterSz, lThresh); result := true; end; end. �����������������������������������������mricron-0.20120505.1~dfsg.1.orig/changes.txt��������������������������������������������������������0000664�0001750�0001750�00000013506�11333006654�020027� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������2/2010 +dcm2niigui: help/preferences allows you to specifiy output folder. This can be a fixed location, or the user can be prompted with each conversion. +dcm2nii: option to process only specified files rather than searching all in folder. +MRIcron: Unix version: improved peristimulus plot data export (previous version only saved up to 255 characters per row) +MRIcron: Windows7 64-bit no longer reports floating point error. +dcm2niigui: Ability to select export directory. Previous version saved data to input directory. If you select Help/Preferences you can now select three modes: "Save to source folder" (default), "Prompt user for output folder", "Always save to...". -- "Prompt user for output folder" every time a series of images is dropped onto dcm2niigui, the user is requested to specify the output folder. -- "Always save to..." when this option is selected the user is requested to select an output folder. All future conversions are sent to this folder. +dcm2niigui: The ini files (stored in ~/.dcm2niigui for Unix and in the application directory for Windows) include two new properties: OutDirMode and OutDir -- "OutDirMode" this can have three values: 0="Save to source folder", 1="Prompt user for output folder", 2="Always save to..." -- "OutDir" This string lists the location for saving files if OutDirMode=2, and the starting location for selecting a folder for OutDirMode=1. If this is blank or a non-existent folder, it reverts to the users home directory (for Windows, this is the Documents folder). +dcm2niigui: If dcm2niigui is unable to find a ini file in ~/.dcm2niigui, it will open up the defaults file dcm2niigui.ini located in the same folder as the application. This allows Unix administrators give all users consistent settings tuned for their site (e.g. defaulting to SPM or FSL style files, etc). +dcm2niigui: Previous Linux 64-bit versions of dcm2niigui could have problems if the user did not have write permissions to the input images. This has been fixed. +dcm2niigui: now checks whether the user has write permission to the output directory, and gives the user a clear description of the problem if the output folder is read-only. ---- 2009 MRIcron +Images now shown with 2x2 row column format, with Coronal, Sagital on top row and Axial on second row. To return to old horizontal layout, choose Help/Preferences and select "All slices on single row" +Improved load of overlays on images with very few slices (I suggest you make sure View/3DSmoothOverlays is UNCHECKED if your background image only has a few slices). +The .ini file now includes the option "FlipAx=0", if you change this with a text-editor to read "FlipAx=1" and relaunch MRIcron the axial images will be displayed upside down (emulating ImageJ when viewing Analyze images). +Draw/Statistics/BatchProbMaps now reports mean instead of sum (with header text now saying "mean" instead of "filename). This ensures that one gets the same values as Draw/Descriptive (which reports mean, not sum). This also means that units are easier to interpret (as you do not have to divide the sum by the VOI's volume). +Removed View/Magnify tool from Windows version (I think there are better screen magnifiers). dcm2nii +4D par/rec files can now have different scaling factors +Philips has a new value in the ini file - use "PhilipsPrecise=0" to convert the DV (display values), use "PhilipsPrecise=1" for the FP (Floating point) values. Note that the raw image data is identical, this simply adjusts the scaling factor applied to the data. The "PhilipsPrecise=1" gives the correct values for Phase maps (from -Pi..+Pi) and diffusion images, but many people complain about the huge values generated for T1/T2 images where the scaling factor is arbitrary. In most cases, your selection will not influence data processing in any way (as fMRI/T1/T2 values are relative). +GE. Some GE scanners will interpolate images to simulate higher-resolution. If you set "UseGE_0021_104F=0" then you will get one image for the actual slices and one for the interpolated slices. If you set "UseGE_0021_104F=1" you will get a single large volume that combines the interpolated and actual slices. +Philips 4D DICOM image conversion is improved, but this format is changing very rapidly. My software assume all images in a 4D image have the same scaling factors. This is fine form images where signal is relative. However, when you have a image where the 4th dimesion is between modalities (e.g. some images have modulus and some have phase) then the scaling factor may not be preserved. The raw data is correct, but some images with absolute values (phase or diffusion) images may need rescaling. +When run from the command line, specifying folders is now case sensitive. This fix is specific for Linux users. NPM +VLSM commands - Previous version did not always conduct statistical tests on all the voxels (some ventral voxels might show Z=0). MRIcroGL +Render/Clip is now viewpoint independent. Previous version always cut slices from viewer's location, new version includes sliders to specify the elevation and azimuth of the clip plane. The scripting includes the new command "CLIPAZIMUTHELEVATION" as well as the old view-point dependent "clip" command. +Program should not crash if your video card can not support the input image (you will get a polite message describing the problem). +Help/Preferences adds a new rendering pull-down menu that allows you to choose between three rendering modes: standard (best quality, but slow), fast but blurry, and disabled. In the disabled mode you see orthogonal slices instead of a rendering, which is useful for slow video cards. +Better display of statistical images as background image (SPM uses 'Not A Number' values for areas where no statistics are calculated). +More significant digits for statistcal outputs. -------------------------------- ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/CarbonOpenDoc.pas��������������������������������������������������0000664�0001750�0001750�00000004335�11372303030�021026� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit CarbonOpenDoc; interface {$H+} uses //FPCMacOSAll, MacOSAll, CarbonProc; //type // TFormOpenFileMethod = procedure(const FileName : string) of object; //procedure InitOpenDocHandler(MethodToUse : TFormOpenFileMethod); procedure InitOpenDocHandler; implementation uses nifti_img_view; //var // OpenFileMethod : TFormOpenFileMethod; function OpenDocEventHandler(var theAppleEvent: AppleEvent; var reply: AppleEvent; handlerRefcon: SInt32): OSErr; stdcall; var DocList: AEDescList; FileCount: Integer; FileIdx: Integer; Keyword: AEKeyword; FileDesc: AEDesc; FileRef: FSRef; FileURL: CFURLRef; FileCFStr: CFStringRef; begin if OSError(AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, DocList), 'OpenDocEventHandler', '', 'AEGetParamDesc') then Exit; try if OSError(AECountItems(DocList, FileCount), 'OpenDocEventHandler', '', 'AECountItems') then Exit; for FileIdx := 1 to FileCount do begin if OSError(AEGetNthDesc(DocList, FileIdx, typeFSRef, @Keyword, FileDesc), 'OpenDocEventHandler', '', 'AEGetNthDesc') then Exit; if OSError(AEGetDescData(FileDesc, @FileRef, SizeOf(FSRef)), 'OpenDocEventHandler', '', 'AEGetDescData') then Exit; if OSError(AEDisposeDesc(FileDesc), 'OpenDocEventHandler', '', 'AEDisposeDesc') then Exit; FileURL := CFURLCreateFromFSRef(kCFAllocatorDefault, FileRef); FileCFStr := CFURLCopyFileSystemPath(FileURL, kCFURLPOSIXPathStyle); ImgForm.FormOpenFileMethod(CFStringToStr(FileCFStr)); //ImgForm.OpenFileMethod(CFStringToStr(FileCFStr)); FreeCFString(FileURL); FreeCFString(FileCFStr); end; finally AEDisposeDesc(DocList); end; end; {OpenDocEventHandler} procedure InitOpenDocHandler {(MethodToUse : TFormOpenFileMethod)}; begin //OpenFileMethod := MethodToUse; AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerUPP( AEEventHandlerProcPtr(Pointer(@OpenDocEventHandler))), 0, False); end; {InitOpenDocHandler} end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/���������������������������������������������������������������0000775�0001750�0001750�00000000000�11754254530�016441� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/zcolorbar.bmp��������������������������������������������������0000664�0001750�0001750�00000001626�10672753376�021155� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BM–������6���(������ ���������`�������������������џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€������  #(,16 9##:%%:'':)):++:--:00���������€€€€€€������,D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������������������������������������������������������������������€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€����������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/zcolor.png�����������������������������������������������������0000664�0001750�0001750�00000000300�11034403610�020432� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������ ���їRъ"���‡IDATxкэ’1Т0 EП§ЋђаЁ0tш 8ЃOЧм0p€0T ЌˆŒ|Y–џр7|["C4Љ›uНКŸн—~ ‹ћešмLJЬP цfи6ˆ�Х §Aп€Z{ўzŸПж{­”Nd&Гj&3™KRUTб‹ФОпњКŒњlA“б *mМќu����IENDЎB`‚��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/xbars.bmp������������������������������������������������������0000664�0001750�0001750�00000003366�10672754204�020271� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMі������6���(���������������Р�������������������џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ�РРРРРРРРРРРРРРРРРР��џ��џ��џРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРР��џ��џ��џРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРР��џ��џ��џРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРРР�џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ���џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���џ��џ��џ�џ��џ��џ��џ��џ��џ��џ�РРРРРРРРР�џ��џ��џ��џ��џ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/roihide.bmp����������������������������������������������������0000664�0001750�0001750�00000003366�10672754130�020573� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMі������6���(���������������Р�������������������џ��џ��џ��џ��џ�ЬЫЫаШТиРЋоЖ‘с­}рЊxнЏ…йЕ•бТДЬЫЪ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЯЬЩуШБђМћ­g№ЄUйЂOќ‡ў{ўz�ўz�ќ{ѕ†хЁbбСГ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�аЬШћШќМƒщЕvzвЊQмО­­dў}ўz�ўz�д(Ф—9ц†ћ|чžZЯЦО�џ��џ��џ��џ��џ��џ��џ��џ�ЬЬЫёЪЈќП‰ћВqfлМBуЫ™Иy§€ ўz�о‰SгЊ@нОЩ•4ўz�ўz�мЏ†�џ��џ��џ��џ��џ��џ��џ��џ��џ�уЫЖќСїЖyтБmЈМ‚ў+ў‚§zя€ kЦ’YаЅЙD§z�њ~ ЮЧР�џ��џ��џ��џ��џ��џ��џ��џ��џ�еЬТћФ”ќИ{ќЋcќŸKў’1ў…­ЄRрˆѓ б+ўz�ўz�ь•F�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЬЬЪіЧžќЛЪП‡ЩГrцžHЎЎeEлКSвЊї}ўz�ўz�§z�кВŒ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�щЩ­жШšMцв?шддЇZТЇXVгЋqУŒоŠўz�ўz�њ ЭЩХ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�лЪМшХ–fрЦ]нСПВo§Ž*ч%х†ўz�ўz�ўz�ъ˜M�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЮЫШљФ”љЗzгЗz§žHў‘/юŒ%Я’/і}ўz�ўz�йД“�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�кЫЌшПˆ§­f§ MшFlЫHйЗВЁJўz�јЬЩХ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�­дЩYцвСТ§ЃSљ˜=eаЇHйИЁЉ\§z�ш›T�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЩЭЧLыл­Ъœ§ІYљ›Cѓ’0ИЂOўz�§z�зЗš�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЬЫЫПЯЎћЖx§Љ^§Fў-ўƒўzїƒЬЪШ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�цЦЊќЙ}њ­fчЇZ§“2ў†ў{чžZ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�иЩМяП‰ЄЪbйЙЎЕtў‰§}еКЁ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЭЫЩјПŒqмР?шдФ§Œ%і‹(ЬЫЪ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ъУŸОЧ—…бЉыЂQ§+хЇm�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�оЧВќЗ{ї­eіЁN§’1дПЌ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�аЪХћКэГqœХ“ЖИЬЫЪ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЬЫЫђП’зН„Bцб‰жШ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�фФЈмН†‡аЈИЮШ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�жШМќЖyђБwЫЫЫ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЬЫЪїЛ…сП �џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/roifill.bmp����������������������������������������������������0000664�0001750�0001750�00000003366�10672753770�020621� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMі������6���(���������������Р�������������������џ��џ��џ��џ�ЫЫЬХХЭВВв››ик……н||по‰‰м’’кЇЇеССЮЫЫЬ�џ��џ��џ��џ��џ��џ��џ�ЪЪЬ­­гyyрFFэїќ��џ��џ��џ��џ��џ��џ��џ��џ��џ§--ѓwwрЦЦЭ�џ��џ��џ��џ��џ�..ђў��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џBBэЫЫЬ�џ��џ��џ��џ�ј��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��ўјPPъЂЂжЫЫЬ�џ��џ��џ��џ��џ�ССЮ]]цў��џ§љ''є66ёCCэQQъ__чllуоœœзЗЗаЈЈЋ___•••ЪЪЪ�џ��џ��џ��џ��џ��џ�ЩЩЬ--ђ  жФФЭЪЪЬЫЫЬ�џ��џ��џ��џ��џ��џ�ЧЧЧiiiF56ЗŠ‹u[\977ЈЈЈ�џ��џ��џ��џ��џ�‘‘й99№�џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЫЁЁЁ500•mnњКМ§СУќЧЩмГЕA89ŠŠŠЫЫЫ�џ��џ�ЫЫЬ55№``ц�џ��џ��џ��џ��џ��џ��џ�УУУ]]]P99рЁЂ§КЛ§РСќХЧќЫЭќавђЮаOFF�џ��џ�ЋЋгўvvр�џ��џ��џ��џ��џ�ЫЫЫ–––5--ІrsќВГ§ИЙ§ОП§УХќЩЫќЮаќджќймюгж:67ДДД�џ�rrс��џ}}п�џ��џ��џ��џ�МММQQQ`@@щž§БВ§ЖИ§МН§СУќЧЩќЬЮќвдќзкћнпћтхХЖИHHHЫЫЫIIы��џppт�џ��џ�ЪЪЪ‰‰‰8++Жvv§ЉЉ§ЎЏ§ДЕ§КЛ§ПСќХЧќЪЬќавќеиќлнћрућцщћыяYUVЈЈЈNNъ��џJJы�џ�ЕЕЕGEEpFFя™™ўЇЈ§­Ў§ВГ§ИЙ§ОП§УХќЩЫќЮаќджќймћпсћфчћщэћяѓВЎАccc––иў ћhhŠi@@ђ™™ўЅІўЋЌ§АБ§ЖЗ§МН§СУќЧШќЬЮќвдќзкќнпћтхћчыћэёїяѓONO———ЫЫЬк11№хь ˜$9Єmnќ­Ў§ДЕ§ЙЛ§ПСќХЦќЪЬќавќеиќлнћрућцщћыюњёєxuwrrrЫЫЫ�џ��џ�ЧЧШ76<ЮШёўі {^CFђАБ§НО§УФќШЪќЮаќгжќйлћосћфчћщэћяђІЂЄNNNЪЪЪ�џ��џ��џ��џ�jjjŸœ™RPћ��џ��ўИ6)7рЋЌќЦШќЬЮќбдќзйќмпћтхћчыћэ№ЭЦЩ878УУУ�џ��џ��џ��џ��џ�УУУ766ФПм§��џ��џи' 9рДЖќавќезќкнћрућхщћыючос766ГГГ�џ��џ��џ��џ��џ��џ��џ�ЂЂЂEDCЇЄюў��џ��џк*#:тОРќйлћосћуцћщьѕщэKIJ™™™�џ��џ��џ��џ��џ��џ��џ��џ��џ�ˆˆˆRPO•’№ў��џ��џг;3>ѓезћтфћчъњь№sopvvv�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ƒƒƒTRQ•‘яў��џ��џ ЊsgiћхшћыюЁ™œRRRЪЪЪ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�†††DBAЄЁл§��џ��ўXЯСФШОС:::ФФФ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЄЄЄ655ЇЃЏvsљў/.ЫTPQ756ЕЕЕ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�НННTTTUSRЛЗКкез œœœ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЫЊЊЊ^^^EEE‹‹‹�џ��џ��џ��џ��џ��џ��џ��џ��џ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/roiellipse.bmp�������������������������������������������������0000664�0001750�0001750�00000003366�10672754064�021325� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMі������6���(���������������Р�������������������џ��џ��џ��џ��џ��џ�ЩЩЬЇЇдŽŽл••йИИа�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЪЪЬої§љ ћ§==яЋЋг�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЪЪЬQQщ ћqqтЙЙа  жШШЬЅЅеEEэ ћ––и�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�mmуљЊЊгГГбCCѓїЫЫЬ�џ�ЫЫЬmmтњВВб�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЙЙа ћкЫЫЬmm№ttџ ћФФЭ�џ��џ�ЪЪЬ??юKKы�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�zzр%%єЪЪЬЪЪЬ––їaaџ��џzzп�џ��џ��џ�ŸŸжќФФЭ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�OOъYYш�џ��џ�˜˜о33§ ћк�џ��џ��џ��џ���џCCэ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�CCэggф�џ��џ�ЩЩЩWWxccwФФФ�џ���џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�џ��џ��џ��џ�TTщRRщ�џ��џ�–––���222ЧЧЧ��џ�џ�ФФЭќІІд�џ��џ��џ��џ��џ���џ�џ��џ��џ��џ�‚‚оіЩЩЬ�џ�€€€ccc������™™™��џ�џ�књШШЬ�џ��џ��џ��џ��џ���џ�џ��џ��џ��џ�ППЮњо�џ�†††iii������~~~��џ>>я++ѓ^^ц�џ��џ��џ��џ��џ��џ���џ�џ��џ��џ��џ��џ�~~о ћ™™и˜˜˜___���rrr��џ§їООЮ�џ��џ��џ��џ��џ��џ���џ�џ��џ��џ��џ��џ�ЫЫЬffфќ22ЪMMM���99n��џїЎЎв�џ��џ��џ��џ��џ��џ��џ���џ�џ��џ��џ��џ��џ��џ�ЫЫЬ——иCCь??L ��� r��џ�џ��џ��џ��џ��џ��џ��џ��џ��џ���џ�џ��џ��џ��џ��џ��џ��џ��џ�ЪЪЪNNN(((���+++��џ�џ��џ��џ��џ��џ��џ��џ��џ��џ���џ�џ��џ��џ��џ��џ��џ��џ��џ��џ�SSS+++���!!!��џ�џ��џ��џ��џ��џ��џ��џ��џ��џ���џ�џ��џ��џ��џ��џ��џ��џ��џ��џ�eee333�����џ�џ��џ��џ��џ��џ��џ��џ��џ��џ���џ�џ��џ��џ��џ��џ��џ��џ��џ��џ�}}}666�����џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�џ��џ��џ��џ��џ��џ��џ��џ��џ�ЅЅЅ"""����џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЩЩЩ���ЧЧЧ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�EEE���ЛЛЛ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ŒŒŒ������ЁЁЁ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ШШШ���ƒƒƒ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�xxx���eee�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/roi3d.bmp������������������������������������������������������0000664�0001750�0001750�00000003366�10672753722�020176� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMі������6���(���������������Р�������������������џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЬККа’’кyyрppтxxркЗЗаЫЫЬ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ФФЭzzр++ѓў��џ��џ��џ��џ��џў),єy|сТТЮ�џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЬ‘‘кї��ў��џ��џ��џ��џ��џ��џџ џџ'џ/>љ’™мЫЫЬ�џ��џ��џ��џ��џ��џ�ЪЪЬddхў��џ��џ��џ��џ��џ��џ��џџџ(џ"6џ)Aџ,Gџ-IўrшЩЪЬ�џ��џ��џ��џ�ЫЫЬ``х��ў��џ��џ��џ��џ��џ��џ��џџ џ)џ%=џ0Mџ8Zџ=bџ>dџ;_џs‡щЫЫЬ�џ��џ��џ�ˆˆмў��џ��џ��џ��џ��џ��џ��џ��џ џ"џ$9џ1Oџ=bџHrџN}џPџLyџCkў‘ р�џ��џ�РРЮљ��џ��џ��џ��џ��џ��џ��џ��џ��џ џ,џ+Eџ:]џHsџUˆџ_—џa›џ[‘џO~џJoћНСа�џ�ooт��џ��ѓ����J��0��,��@��w��рџџЈLL%L,L2M'>[2P‚FoаGqџ~‘ц�џ�$$ѕ��ё��0�������V��i�� �����дџ „���������������������� 4yHeїЪЪЬў��и��|��d��x��ў��џ��~��������k џ „������ KxпPж2P…��������#9ЕВЕг��џ��џ��џ��џ��џ��й��г��=��������‰ џ „������IuџP€џQ‚§ &������m–л��џ��џ��џ��џ��џ��1����������”��њџ„������:]џ?eџ@gџ 4������ e‰о��џ��џ��џ��ў��њ��Р��q�������W��§��џ�„������*Cџ.Jџ+Fы������ †м��ў��ш��E��"��7��я��п�� �������ё��џ��„������� }n#�������� фЅЅеї��ў��Š����������������y��ў��џ��„����������������������6�ЭњЧЧЬ``ц� џ�#џ�2ч�-­�&”� “�Ї��н��ў��џ��џ��й��Б��Б��Б��Б��В��Л��о��§��џPPъ�џ�ДЙбWќ�Tџ�Rџ�Pџ�Nџ�Lџ�Jџ�:џ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ§ЋЋг�џ��џ�h˜ф�fў�dџ�bџ�`џ�^џ�\џ�Zџ�Wџ�0џ�џ��џ��џ��џ��џ�џ�џ�'џ�8џ�@ў\{чЫЫЬ�џ��џ�ШЪЬ;Žя�xџ�uџ�sџ�qџ�oџ�lџ�kџ�iџ�Uџ�'џ�$џ�.џ�Aџ�Vџ�Zџ�Xџ�Vџ1nёХЧЭ�џ��џ��џ��џ�ТШЮ:›я�Šџ�ˆџ�†џ�ƒџ�џ�џ�|џ�zџ�xџ�vџ�tџ�qџ�oџ�mџ�kџ1~ђПФЮ�џ��џ��џ��џ��џ��џ�ЧЪЭbАхž§�›џ�™џ�–џ�”џ�’џ�џ�џ�Šџ�ˆџ�†џ�„џўZчФШЭ�џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЬЊХдFИьАќ�Ўџ�Ћџ�Љџ�Іџ�Єџ�Ёџ�žџ§BІэЄПеЫЫЬ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�МЪЯ‡Хн]УчFРэ;ПяDОэZНчƒРнЙШа�џ��џ��џ��џ��џ��џ��џ��џ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/reslicing.svg��������������������������������������������������0000664�0001750�0001750�00000020022�11045324334�021126� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="744.09448819" height="1052.3622047" id="svg2" sodipodi:version="0.32" inkscape:version="0.46" sodipodi:docname="reslicing.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:export-filename="C:\Documents and Settings\Admin\Desktop\image.png" inkscape:export-xdpi="200" inkscape:export-ydpi="200"> <defs id="defs4"> <inkscape:perspective sodipodi:type="inkscape:persp3d" inkscape:vp_x="0 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" id="perspective10" /> <inkscape:perspective id="perspective2467" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" /> </defs> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.1394642" inkscape:cx="333.03081" inkscape:cy="664.38863" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" inkscape:window-width="1280" inkscape:window-height="740" inkscape:window-x="-4" inkscape:window-y="-4" /> <metadata id="metadata7"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> </cc:Work> </rdf:RDF> </metadata> <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"> <rect style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.26454818;stroke-linecap:square;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="rect3325" width="756.53131" height="369.50735" x="-14.937018" y="178.24945" /> <g id="g3280" transform="translate(-8.7760542,1.1538605e-6)"> <rect ry="48.268299" y="194.79956" x="13.899533" height="298.67014" width="231.09453" id="rect2475" style="opacity:1;fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.22613287;stroke-linecap:square;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> <rect ry="0" y="259.4205" x="13.138862" height="169.42827" width="232.61589" id="rect3260" style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4.70479012;stroke-linecap:square;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> <image transform="matrix(0.9925462,0.1218693,-0.1218693,0.9925462,0,0)" xlink:href="C:\Documents and Settings\Admin\Desktop\resx2.png" sodipodi:absref="C:\Documents and Settings\Admin\Desktop\resx2.png" width="166.48691" height="123.87494" id="image2469" x="86.945564" y="265.15503" /> </g> <image y="285.70758" x="252.0018" id="image3262" height="123.87494" width="166.48691" sodipodi:absref="C:\Documents and Settings\Admin\Desktop\resx2.png" xlink:href="C:\Documents and Settings\Admin\Desktop\resx2.png" /> <image y="435.22598" x="-423.86765" id="image3264" height="123.87494" width="166.48691" sodipodi:absref="C:\Documents and Settings\Admin\Desktop\resx2.png" xlink:href="C:\Documents and Settings\Admin\Desktop\resx2.png" transform="matrix(0,-1,1,0,0,0)" /> <g id="g3301"> <rect y="245.90759" x="587.1828" height="182.41235" width="143.79771" id="rect3268" style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.42956602999999990;stroke-linecap:square;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> <image style="stroke:#0000ff;stroke-opacity:1;fill:#00d8ff;fill-opacity:1;stroke-width:1.3;stroke-miterlimit:4;stroke-dasharray:none" transform="matrix(0.1218693,-0.9925462,0.9925462,0.1218693,0,0)" xlink:href="C:\Documents and Settings\Admin\Desktop\resx2.png" sodipodi:absref="C:\Documents and Settings\Admin\Desktop\resx2.png" width="166.48691" height="123.87495" id="image3266" x="-337.52261" y="633.31537" /> </g> <flowRoot xml:space="preserve" id="flowRoot3272" style="font-size:36px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" transform="translate(57.044353,-35.135272)"><flowRegion id="flowRegion3274"><rect id="rect3276" width="202.72685" height="78.10688" x="27.205769" y="531.06458" style="font-size:36px" /></flowRegion><flowPara id="flowPara3278">Scan</flowPara></flowRoot> <flowRoot xml:space="preserve" id="flowRoot3285" style="font-size:36px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" transform="translate(256.87221,-35.574725)"><flowRegion id="flowRegion3287"><rect id="rect3289" width="202.72685" height="78.10688" x="27.205769" y="531.06458" style="font-size:36px" /></flowRegion><flowPara id="flowPara3291">Raw</flowPara></flowRoot> <text xml:space="preserve" style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" x="435.41766" y="528.93951" id="text3293"><tspan sodipodi:role="line" id="tspan3295" x="435.41766" y="528.93951">Ortho</tspan></text> <text xml:space="preserve" style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" x="573.07635" y="528.4317" id="text3297"><tspan sodipodi:role="line" id="tspan3299" x="573.07635" y="528.4317">Resliced</tspan></text> </g> </svg> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/render.png�����������������������������������������������������0000664�0001750�0001750�00000007351�11041142706�020422� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���@���@���Њiqо���sBIT|dˆ��� pHYs�� �� bLГо���tEXtSoftware�www.inkscape.org›ю<��fIDATxœэ›{T”еоЧ?{`df†; W/\я x!‘ьhZц9ОЉ/5R+ГŽцuuКgчд{ъœубь­Žfj†т%3Ќдz17 СФTDQA‘qИюїa&Цe€тЌ•пЕžХУoџіоп§}іГ/ЯoRђ[†ЂЛ t7ю анКwшnнпМ�ЖПF%BРD7ўИ\–RV§\,Иuѕ:@1 „ЕИ<л‘Е(Њу@6фH)ьR’-а%!l€Ї˜[геjw\]Q(lBСЕkчP*U89љpуFUUWЈЎОJ\$p8 ь�вЅ”ѕ&mфо„Р'��­VGtєƒx{‡Ѓг…aoЏЁЉЉ?ПhSОЭ›SЈЉЉ`юм­&[SSзЎѓч? 6v … чЮerў|6z§O-Ћ­в€эР)e]‡@'Ц�!Ф `рэNBТ† ™­m“піэK((јŒ5kђM6.”#G6˜•ЇPитюLLЬ4ЊЊЪHNо€”’ВВSфхэ!;{gЯu’RЮf„k RЪ›iG‡B,^z уОћV>!„…o^^}Эl:](eeЇhjjDЁА1KынћіяЙe]xzі#!Ё KЈЌМHNN*яS\œщ ќАBё№wkSЋBhw)B(HJZСФ‰k,aФЎ]Ћ(+;Mhh‚™нЫ+”††:ЪЫРгг\œ€€С”•цшбsфШzT*5*•{{ *•ЕкЇ0zєB гљєг—јўћ/=€—EBˆЙRЪ}].€Т 8єеh<INоDhшИ6§їэ{жтьь‹ƒƒЋYšГГ/*•šввшtaЁ ЉЉ№№Dєњ*jkЋаыЋЉЎ>CAС>љdAAУ>|))Љ\КTШЮЫљўћ/ННBˆРSRJГСЃУ!œ@п  aЄЄЄЂбxЕъ{іьЗlлƘ‹ПcоМ­ІSZšoсзЛї( ?gрРЬь … ={:уррТˆџнj/~ЧбЃА{їsdd|Р3Яfётƒ:єOvьјuu7ц� BˆЄ”йЗkлW‚BGрS ВWЏ<ўјўV_Qqžg№кk#ёђ сљчO1`Р$†pюм1 џЈЈIфхэiЕNЊЋЏЕЩЩЧ'’ЉSзВre6WЏž!5u9Bтуcѕъуєщ3 РФBˆЁЗkпmBиa˜r†zzіу‰'>Уо^kцS[[ЭЎ]+YН:„ыз/№ьГט5ы]ДZ�CЈЌ,хђх“fљњїПŸЪЪ \ИpмЂ^GGWЊЋЏоŽ`˜rчЬйLzњфч^{wї`–,љŠQЃцR "]qO‡Р0вvuѕgётtдjwГФуЧwБreŽлBrђПyњщCfѓ=€Їg?њіgїю5ф§§“—ЗлЂвž=]ИqЃэа!!c‰‹{”єє7M6!ܘё/F^HGŸ !FЕ–ПM„‰РBЅRХТ…{qvі5Ѕ54дБmлbж­{ИИGyюЙЂЃЇЖIrЪ”WШЪкNqq–™=*jЧ[ pЇWрVDEMцєщ#дзџМB0}њпИїоЇйивМ'1CЋ!\1LwLњоосІДЋWЯВvэ=dgЬSO}СФ‰kАЕЕЛ-СРРЁDEM&5ѕY3{пОqgRSSifwppЁІІті­nоНяAEEG,вІN]Kxx"€АюжєЖzРz@žим ЈЌ,хѕзуpttgе*г`г.Lžќ'O4ыCP*Uœ>§Е™ЏJЅFЏoџzЦжжŽ>}bЩШxŸ;—ГfM(6<L^оЄ”ЬšѕЎq*~H1Гe^ „�Sн˜=ћMvНОŠЗоJТУЃ7))Љ88XєІлТЫ+„ў§'r№рЯяЊ’рр‘2ѓUЉдджоАЊќАА{9vьCNžќ‚QЃцbcЃdнК)фцюDЋеёШ#ыЎo5/ш€[жB№К~Ыщюw~OSS#))Љfk}k0nмSМљfSІМŠ““7�§њХ“›ЛЫЬЯЮNMmmЕUe<ШШ$<=ћ™lZ­ŽДДUDEMbрР)DD$‘ŸПO$o€exгщB6ьчž’§1'OdС‚]г 5шл7''o >3йќ§c()Щ1ѓSЉ­@Ће™5 1q%dfn !с)cвЂц‡§Г�BˆРs�“&НhZпззпdћі%Œџ'мм‚Ќ"емнƒ)/?cњ_JiБ—0є�ы^жрррJTд$ђѓ? SІЏo€@рw`о’џРРЁfЫг‹ПЃgOgЦ_кiB�ееWqtќyoаиX‡RioцcЌыmСЧ'’K— LџѓИё6Ь˜”ДТЌ€€€!Ќ\™C=;L"3s+чЯgS_ЏЇwя{ kJkhЈEЉT™љЛКPWWCeхE3Л^џ›6ЭЃІцzЛыіё‰фђхBгзІ&бмћG !z(�„б@”““7I…ДЖЯo‰ККввVЗJьцЭйАa:/О8ˆE‹(,Lgїю5>ќ/nоќ‘њzKмнƒБЗзR\œifџњы@ЅвX%@mэ **ŠpttУп?Рaьs�†ŸнцоўvАЕЕу›o6š›–ЈЏз3bФlќ§akkЧ•+ЇШЩIeѓцGyц/rrR?~)R6™ђ!№ѓ‹цм9s^G|ќЋ8:9љръ`ж›""&oЧк Уу0rdrћ[н … C‡>BFЦћФЦЮ7Kгh<™5ЫАžВ‰ђђ8>›cЧЖŸПœœффьрЫ/пbіьїŒOџAf= Є$—ВВ"žn5П—^:kіП—WˆщVє\МНУqwЖКp#bcчqў|vЋ›#„Pрсб‡˜˜‡yьБМњъEІM{OЯ~”–žр•W†“–ЖšЦЦzќ§cЬШЪкN`р0œ{u˜Ѓ-Іr­ˆшг'ЖS…КЙ1aТГ|єб"ъъjк•G­vgьи'YН: ž${ї>ЯЫ/ССС•ШШћLœЌЌэФФLыG#ьэMcˆVФ‚a‘вY$&.УжжŽ;žБ*Ÿ­m&O~‰ЅKџ.”’’\о{o“&=RiЯЅK”•§`Ї9-Q­‚цЈMW,rlmэ˜3g3яГџ+VчТŠйDD$QYYЪлoODЏЏЂЄ$gg_Г-ygpЋ�JљŽ­яo…П ѓчLZкjОљц]Ћѓ+•*цЭлJЏ^Q\ИЧњѕQZz.ЌKјъ0mпMииt��сс‰Ьœљ›6ЭяvvŽ,\И''NœјŒТТє.{@�gЮ5оц+€`иšv%† ›ЩŒџфУSиВe!ж…ѓœœ|XДh/JЅ=ХХ™\ЙrЊMZЋЪ.(8`М=hƒ!ЖЇ‹ŽžŠЋk€Uн ~~б„„ŒeЯžчјюЛНєы7†ž=к_ЃёЂЎюEEGИyГ’††ZT* UUх””dsъд!ђђvѓСФн=иb7иЖm{’7*�– `№rdф},XАћŽЫоŽ ВВ”џР™3G‰_@Rвr‹`I[аыbХŠ`ЊЋЏтцDEE1MM88И еzЃеъ JbтRььяX^YYЋVѕИ xР Ш\УУ‰ODDR—ОsF?žЦЮЫ)/џ№№DbbІбПџ§w$ўХcыж'Т’%_ЂPимё;dkhjjфЏCQбa€wЅ”s„”!Ф PƒсЃddфDДZііZГKЃёhVо …ТњиЊ”Mœ8БŸЌЌэфцюЂОў&4hќЎе]gcc=kж„R^ўsчnэ№‚hзЎUьлїРy JJyнt> 9ќѕ0†Аѓ№;&„wї BBЦ–`ѕћ ††І“§1ЙЙ;YЖь(}ZѕЭЬмЦ† Ѓбxты;�НО Нў'jбhМpqёУХХgч^ЈеюІ№šJЅІЂЂ„ммTОњъHйд�ФJ)3 BˆоVˆN€і–Ыа5_І/66=ˆ‰yˆИИЧa•@ЋЁђ–RВd‰›q№ъ(ъ1Mп6:{B$$bЬРзЗ?qq) њ_э˜к‹хЫЙvэРр ч‰ъ0< _ †УX^ž3†‡vШў!Ѕ4лvй!)!„0xД™*•šaУaܘЧл=EЕ…ызKXЖЬ p—-? tПФ)1р~`!0ЖйFXиxту™dќ$eЖlYШW_§`Л”ВkЖ…ќ˜.D(А�УРЊУІ+..…‘#“л\йПџcX­'ЅќњYкЯёзјН€B!цА�УЙA”J{ z№№DBBЦЂбX%,)ЩсѓЯџТЗпnhІI)?щRnПі&„ё„˜L‹Ш”Ћk�jЕŽŽn455P\œе2DЎJ)7v9ŸюњХˆТ˜$�c€[п œ>о’R^љExќ'ќdІ9Lх И6_ @Ў”ВђЖЛЂюџКПљуђwшnнЛt7юЦ]К›@wуЎ�нM ЛqW€ю&анјЖЇаY€†kF����IENDЎB`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/refresh.bmp����������������������������������������������������0000664�0001750�0001750�00000003366�10672760274�020614� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMі������6���(���������������Р������������������ЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЪЪЭММаККбЧЧЭЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЗЗбggх**єў��џ��џўїQQы••кЫЫЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЪЪЭjjх§��џ��џ��џ��џ��џ��џ��џ��џ��џ##і’’кЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЄЄж##і��џ��џ��џў((ѕGGэTTъGGэї��џ��џ��џSSъШШЭЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЈЈе^^шмKKьƒƒоРРЯЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ  з00ѓ��џ��џ??яЩЩЭЬЬЬЬЬЬЬЬЬЬЬЬЫЫЬŒŒм//ѓ��џ��џиЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЪЪЭ]]ш��џ��џ^^чЬЬЬЬЬЬЬЬЬЈЈе--є��џ��џ��џ��џggхЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ\\ш��џўЇЇеЬЬЬЬЬЬ66ё§��џ��џ��џ��џ22ѓЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЪЪЬ77ё��џEEюЬЬЬЬЬЬЬЬЬ‡‡н��џ��џ ќџўУУЮЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЕЕв §ўРРЯЬЬЬЬЬЬŠŠмџˆˆнЬЬЬООаooуŸŸзЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ[[ш��џ‘‘лЬЬЬЬЬЬiiх66ђЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЈЈе��џttтЬЬЬЬЬЬJJэVVъЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЫЫЬќllфЬЬЬЬЬЬ99ёLLьЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ!!їyyсЬЬЬЬЬЬ99ё##іЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЫЫЬћ””кЬЬЬЬЬЬPPы��џЊЊдЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ——йННаЬЬЬЬЬЬ‰‰н��џЗЗбЬЬЬЬЬЬ}}р��џJJьЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ‚‚о§==№??яўџЧЧЭЬЬЬЬЬЬММа§џ••кЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЗЗбџ��џ��џ��џ��џBBюqqуЬЬЬЬЬЬTTъ��џњГГвЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ""ї��џ��џ��џ��џљ——йЬЬЬЬЬЬККаћ��џїДДвЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬWWщ��џ��џћkkфУУЮЬЬЬЬЬЬЬЬЬЬЬЬ––кў��џњмЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЌЌдлŒŒм22ђ€€пХХЮЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ‘‘л ќ��џ��џ((ѕhhх‰‰нл}}рYYщ$$і��џ��џјwwсХХЮЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЏЏг66ђ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џџSSъЧЧЭЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬܘ˜йEEю §��џ��џ��џ��џ��џў??яиЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬШШЭЄЄжˆˆн||р‚‚о››иТТЮЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/penauto.bmp����������������������������������������������������0000664�0001750�0001750�00000003366�10672753656�020637� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMі������6���(���������������Р�������������������џ��џ��џ��џ�ЩЩЬККаББвААвДДбММЯЦЦЭ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЪЪЬЄЄе{{п44ё33ђ33ђ33ё55ё77№CCэVVщooт‹‹л­­гШШЬ�џ��џ��џ��џ��џ��џ��џ��џ�  ж//ѓј——и::№33ђ33ђ33ђ33ђ33ђ33ђ33ђ33ђ33ђ33ёAAюuuрИИа�џ��џ��џ��џ��џ�ЋЋгbbћLLџљЧЧЬТТЮЏЏгЁЁжššи””йŒŒл‚‚оxxрmmу\\чBBю33ё33ђ==юККЯ�џ��џ��џ��џ�уГГџ<<џ��ў””й�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЩЩЬŽŽк33ђ33ђЅЅе�џ��џ��џ��џ�ŸŸл˜˜џ55џ��џ??ю�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЬ``х33ђSSщЩЩЬ�џ��џ��џ��џ�ЪЪЬvvфћ..ђЈЈд�џ��џ�џ��џ���џ��џ��џ��џ��џ��џ�ššз33ё<<яЕЕб�џ��џ��џ��џ��џ�ЬЬЬЉЉЉ;;C[[]ЙЙЙ�џ�џ��џ��џ��џ���џ��џ��џ��џ�ЪЪЬMMъ44ё™™и�џ��џ��џ��џ��џ��џ�ЬЬЬ@@@���ДДДџ��џ��џ��џ���џ��џ��џ��џ�ИИа44ё\\чЫЫЬ�џ��џ��џ��џ��џ��џ�ЫЫЫDDDPPP������bbb�џ�џ��џ���џ��џ��џ��џ��џ�ХХЭGGьJJыММЯ�џ��џ��џ��џ��џ��џ�ЫЫЫFFF___������???�џ��џ��џ��џ�џ��џ���џ��џ��џ�ББвIIыAAэ——иЫЫЬ�џ��џ��џ��џ��џ�IIIeee������000�џ��џ��џ�џ��џ��џ��џ���џ��џ��џ�ФФЭzzп77№]]чЕЕб�џ��џ��џ��џ�PPPiii������$$$�џ��џ��џ�џ��џ��џ��џ���џ��џ��џ��џ�ЫЫЬВВв[[ч::я‹‹лЪЪЬ�џ��џ�iii[[[�������џ��џ��џ��џ�џ��џ���џ��џ��џ��џ��џ��џ��џ�ЪЪЬ——и>>ю{{пЫЫЬ�џ�‘‘‘PPP����џ��џ��џ��џ��џ��џ��џ�џ��џ���џ��џ��џ��џ��џ�ЫЫЬ{{п;;яТТЭ�џ�ЛЛЛ::: ����џ��џ��џ��џ��џ��џ�џ��џ��џ��џ���џ��џ�ЫЫЬЖЖбllуSSщЉЉд�џ��џ�ЪЪЪ222���ЫЫЫ�џ��џ��џ��џ��џ�џ��џ��џ��џ��ЫЫЬЎЎгiiфbbхŸŸжЪЪЬ�џ��џ��џ��џ�KKK��� ЦЦЦ�џ��џ��џ��џ��џ��џ�џ��џ��  жnnтzzпЕЕбЫЫЬ�џ��џ��џ��џ��џ��џ�………���ЛЛЛ�џ��џ��џ��џ��џ��џ�ФФЭ••иЅЅеШШЬ�џ��џ��џ��џ��џ��џ��џ��џ��џ�ППП������ЃЃЃ�џ��џ��џ��џ��џ��џ�ЫЫЬ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�JJJ������„„„�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ІІІ���eee�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�AAA���FFF�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЊЊЊ%%%�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/pen.bmp��������������������������������������������������������0000664�0001750�0001750�00000003366�10672753624�017741� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMі������6���(���������������Р�������������������џ��џ��џ��џ�ЩЩЬККаББвААвДДбММЯЦЦЭ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЪЪЬЄЄе{{п44ё33ђ33ђ33ё55ё77№CCэVVщooт‹‹л­­гШШЬ�џ��џ��џ��џ��џ��џ��џ��џ�  ж//ѓј——и::№33ђ33ђ33ђ33ђ33ђ33ђ33ђ33ђ33ђ33ёAAюuuрИИа�џ��џ��џ��џ��џ�ЋЋгbbћLLџљЧЧЬТТЮЏЏгЁЁжššи””йŒŒл‚‚оxxрmmу\\чBBю33ё33ђ==юККЯ�џ��џ��џ��џ�уГГџ<<џ��ў””й�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЩЩЬŽŽк33ђ33ђЅЅе�џ��џ��џ��џ�ŸŸл˜˜џ55џ��џ??ю�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЬ``х33ђSSщЩЩЬ�џ��џ��џ��џ�ЪЪЬvvфћ..ђЈЈд�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ššз33ё<<яЕЕб�џ��џ��џ��џ��џ�ЬЬЬЉЉЉ;;C[[]ЙЙЙ�џ��џ��џ��џ��џ��џ��џ��џ��џ�ЪЪЬMMъ44ё™™и�џ��џ��џ��џ��џ��џ�ЬЬЬ@@@���ДДД�џ��џ��џ��џ��џ��џ��џ��џ�ИИа44ё\\чЫЫЬ�џ��џ��џ��џ��џ��џ�ЫЫЫDDDPPP������bbb�џ��џ��џ��џ��џ��џ��џ��џ�ХХЭGGьJJыММЯ�џ��џ��џ��џ��џ��џ�ЫЫЫFFF___������???�џ��џ��џ��џ��џ��џ��џ��џ��џ�ББвIIыAAэ——иЫЫЬ�џ��џ��џ��џ��џ�IIIeee������000�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ФФЭzzп77№]]чЕЕб�џ��џ��џ��џ�PPPiii������$$$�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЬВВв[[ч::я‹‹лЪЪЬ�џ��џ�iii[[[�������џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЪЪЬ——и>>ю{{пЫЫЬ�џ�‘‘‘PPP����џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЬ{{п;;яТТЭ�џ�ЛЛЛ::: ����џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЬЖЖбllуSSщЉЉд�џ��џ�ЪЪЪ222���ЫЫЫ�џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЬЎЎгiiфbbхŸŸжЪЪЬ�џ��џ��џ��џ�KKK��� ЦЦЦ�џ��џ��џ��џ��џ��џ��џ�ЪЪЬ  жnnтzzпЕЕбЫЫЬ�џ��џ��џ��џ��џ��џ�………���ЛЛЛ�џ��џ��џ��џ��џ��џ�ФФЭ••иЅЅеШШЬ�џ��џ��џ��џ��џ��џ��џ��џ��џ�ППП������ЃЃЃ�џ��џ��џ��џ��џ��џ�ЫЫЬ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�JJJ������„„„�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ІІІ���eee�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�AAA���FFF�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЊЊЊ%%%�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/pastedpic_08032008_133503.png����������������������������������0000664�0001750�0001750�00000137212�11045322770�022726� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���І���е���н>‹���sBIT|dˆ�� �IDATxœф}YŒ\чqѕЙНяЗїmzіщYH‘WЩ’(K`YP"# #тј!F‚�ёs€<ќ€'Пy`у‰#‰mРBlЩЕP"-šУu†ГOOOяћОќSќZЖœHЄ(9Й€ ‰œщОїЛѕU:uЊ> РџЏХХELNNТnЗ�L&ъѕ:L&zНЊе*њ§>zНЌV+ъѕ:ŒF#Ьf3:l6›ќЌЯчƒлэ†ХbС`@ЇгAЏзC>ŸGЇгAЋеТССюоНћ)?љoЦЅсџaNMM!‘H`nnƒfГ‡‡‡h4шt:‡ЈVЋа4M Ьd2Ёеj!‰ ŸЯУl6Уl6#“Щ`~~­V {{{˜››CБX„бhD0DН^‡гщ”ясчhš†^Џ‡VЋ…rЙŒƒƒlll|кKѓ™ЛўзцбЃGaБXpфШДZ-˜L& ‡C‹EX­Vфѓyєz=4 „Уa8NдыuX, �#ojГйЭfa0 ы:ƒL&ƒкэ6� бhˆwm4а4 VЋšІС`0��, t]‡Эf- hЕZ(•JИvэкЇЖVŸЅыЅaNMM!ТjЕ"‘H��Ње*ƒZ­:ŒF#jЕ\.<�мn7ŠХ"†УЁS>ŸЧp8„ЭfCЛн†Ўы0шѕzˆFЃаuЉT РШ8%Œ#УЖлэЈVЋђ9NšІСсpРыѕТчѓСd2!Nc}}FЃЭfFуџЄG§_c˜+++p:ˆD"Алэ0�F†’Ячсp8��‡‡‡pЙ\№zН№z͘˜˜€ЧуAЉT’ПЫfГˆЧу ЈVЋЈT*‡У№zНиииРђђ2jЕ~ўѓŸуёЧ‡еjХЭ›71;; ‹Х‚FЃ—Ы…L&ƒС€УУC4›MxН^ 4›M”ЫeLLL@г4 ˜ЭfИ\.Инn ‡CЬЯЯЃZ­"•JЁX,Ђ\.уЪ•+Ÿц?ды7о0чччqђфIиэv”J%ј§~ДZ-dГY4›Mљ9ЬТТтё82™Œ$.еjЙ\гггшt:h6›шt:ЈT*HЅRАZ­Алэh4˜˜˜@:FН^ЧЃ> Ч“ЩЋеŠl6‹nЗ Џз‹сpMгащtрp8рrЙP,‘Ячбh4аh4PЉTаяїЁiМ^/њ§>šЭ&&''%Б€nЗ‹fГ‰§§}TЋUЌ­­}ZKўPЎпXУ<qтt]ЧЬЬ ‚С jЕrЙrЙœdвУсFЃ>њ(‡рЫBЁ€С` †\,ёѓŸџйlэv‘H;;;ПђЛ€„щ`0ˆ\.ЧЧƒххeФb1LOOc0 T*ЁZ­�‰„dђ6› хrеjлллшvЛЈеjшt:№zНhЕZpЙ\�€~П›Э&ЩXПпG­VУіі6VWWЮ‚?фы7Ю0?їЙЯ!‹�ьvЛ„ТfГ ƒС�ƒС€FЃ`„эyфЬЮЮbooнnWЈœС`€ѕѕuьээсњѕыpЛн˜…Чуеj…еjХсс!._ОќЁїrєшQ„Уaєћ} ‡C1–BЁ�ЋеŠЅЅ%D"ј§~ tЛ]шКЏз ‹Х‚vЛ Гй ]зсt:qїю]˜L&F\Нz‹Эfеj&“ vЛ]0i8F*•BЛнF:Ц›oОљPжџa]П1†yфШ$“I„УaT*єz=yiЄzМ^/Кн.\.NŸ> —Ы…VЋ…­­- ,,,`oo?ћйЯЦВп“'OŠ7ГX,�Fиtuu…B›››cї355]з177]збnЗQ*•PЋеP*•P,Ёiіїїхw"‘–––L&…7eі?бjЕАДДЏз‹­­-b‡‡‡а4M6ЂлэкЪщtЂгщ P(`яНїоУy!Ÿ№ѕ™7ЬЩЩI9r“““шvЛBЯ t:8NX,t:ЌЌЌ #“Щ`ccКЎу№№ийй3”ЃGЂгщ  І‡иллCЉT‚еjE$бh”Ьиh4 D uЄы: l6Z­кэ6ŒFЃP@Fхry а�'&&FaЗлсёxJЅdFIЂnнК…bБ�(—Ыb”‡C2њ|>Лwя"•JсрррсОЈ|}І ѓќљѓ˜œœ„йl–?ЋT*їііАИИˆgŸ}нn•J‡‡‡( ˆХbАX,x§ѕзёЃ§H’ˆљљљБdХяїушбЃp8(•J(—ЫЈзы’Аєz=”Ыe�lH:ЩfГ�l6Ьf3Z­Ьf3ЌV+:ЌV+†УЁdс™LѕzыыыПєЌ8wюііі …077Mгрѓљ099 ‡УfГ‰T*…[Зnсрр�fГ‹Ус&“ ~П_>o}}?ћйЯ>Щзѓ‰^ŸIУ|ьБЧ099 Џз+aŽDИС`€бh„бhD<ЧSO=…^Џ‡›7oтрр�  xћэЗqѓцMмН{ёxGEЋе‚ХbгщD0„йl–jMЋеBЅRAЛн–r#yO‹Х“Щ�т N'Z­Z­–dе~П_№ЂгщD­VƒІiшїћ(•JЈзыЈVЋ0 (—Ы0шvЛ’aЧуqЄR)8N,//cbbSSSXXXВžїP,БЛЛ+›‘ЦjЕJтЕООŽ­­­пШ ў3e˜ 8zє(&&&аnЗбnЗбэv‘Щd`Гй„ќƒxюЙчрvЛqётEмО}=іœN'.]К„7п|SBйбЃGqќјq˜L& ЩžГй,677…і1›Эƒƒh6›pЙ\BзДZ-tЛ]X­VДлmhš&ЕясpˆnЗ Ѓб‡УvЛ —ЫПпЋе ‡УЇг ЧƒNЇƒƒƒєz=єz=˜ЭftЛ] ‡ЃWЩd$сaЖ­ы:ž{ю9|с _€ЭfC>ŸGГй„лэ–ћлллУхЫ—бjЕ$ќGЃQYЏ \МxёS{ЏчњЬцч>ї9ЬЭЭСbБеS(аnЗ%Ћ­зы8uъІІІАННT*…W^yР=кЦh4"›ЭbqqКЎуЬ™3˜˜˜Рp8DЇгСўў>іїїБЙЙ‰vЛ-хCГй,^иуёРnЗЃпяЃеj�Z­–Tl*• Z­ж/…х……єћ} Б4X—ЫЧ�pЛншѕzBs•Ыe4 x<xН^ЄR)ЄR)фr9tЛ]ДлmLMM!‰ ‰ ‘H`jj ћћћт]ЗЖЖАККŠээmt:x<шКŽP(„^Џ‡ееUќєЇ?}И/ѕ>.#€џїiпФoџіocnnN&“ Nљ|&“ &“ йl ИpсzН~ђ“ŸH8\[[CЉTOВДД„ХХEдj5œ8qГГГ‡Иxё".^МˆээmфѓyЁmHПиэvQ9Инn4›M!Щƒƒ2™ jЕšdд.— NЇ•J�рѕzБЙЙ‰h4*eХ~ПbБˆƒƒT*дj5 ‹E<ЖС`@ЉTЇы:–——сrЙP*•№юЛяткЕkИyѓІ(Ÿ, ьv;тё8’Щ$"‘4MC&“AЙ\4‹!‘H лэJѕYОLŸц—‡B!œ;wБX нnнnWBАлэFЛнF8ЦѓЯ?“Щ„Ÿќф'ђ{яМѓŽ,ўБcЧ0==nЗ рiЗлqщв%ЌЏЏЃ^Џcgg H$…BB Б&žЭf‘ЫхP*• iBЁМ\MгPЉT`6›сѕz…ъt:аuН^O„нnН^›››˜ŸŸ�С­ѕz]~.NЫs2ГX,RХђzНp:�FЩ?їG?њ€w8ˆЧушїћ№x<xђЩ' qѕъUT*ДZ-ƒA$ ƒA\КtщaМт}}j3у™gžСфф$Z­–xОtŸЯ‡ГgЯтќљѓјХ/~wоyGТѕјClll byyЁPh6›ˆD"pЙ\иппЧЕkзАООŽ ”ЫeФуqЬЭЭarrКЎ‹“м ѕ”ЬќН^/� VЋa8Туё  СсpˆЇ5›Эp8шїћШчѓшvЛpЛншїћ�FUЂ~ПС`�Mг il6|>ŸPMєšќіќЧh4 ‡911H$"ЃT*сеW_Ойl" aaa>ŸЕZ …BAЈЖp8Œ……xН^TЋUдjЕOуѕџЗзЇb˜ёxчЯŸ‡зыEЛнFН^ зh4FёјуУfГсЇ?§ЉаїОї=\ЙrЭfЧъ‡•ЗлС`€лЗocwwЋЋЋR€G}@�VЋU$k с­VKшRЉ„L&#КЬFЃЗл-4“*w#Uдl6‡CИнnс:){ГйlшїћВёмn7\.—№ЁfГFCBПбh”кЙеj•Њ•пяG  Ьl6cuu/^ФеЋWŒ"ŽЭfУЪЪ <ŠХ"ŠХ"rЙ� "%]ŸЕыЁІпяЧsЯ=]зEØЭfбщt`6›qіьY<џќѓ0 ИqуzНоџ}МђЪ+Јзы8~ќ8––– aЗлбnЗ%уЮfГh4Шd2c5j�H&“ˆЧуаu]Ъ“NЇS0$џЬсp ^Џ‹AЃ0ъt:…ЛьѕzАйlтu]ZˆќbЗл…ХbбqПпfРыѕТjЕТl6ЫgR(BC&4 Oa‰нn‡ХbІiˆЧу˜šš’ћ,—ЫшѕzШd2h4№ћ§˜žž†пяGЁPРССшRu]Чьь,t]џЬIыКaО№Т ˆFЃ‚Гvww�ГГГјќч?љљyМѕж[ђПџ§яуіэл…Bxц™gфЅ{<Инn„Уa4›M\НzЕZMМ)‡УrЙŒ™™D"‘ПLКІбhРсpРl6K’выѕрёx`БXФM&“KŠšІЁнnЃ\. сMЃЅТHг4Щвљфf›Э&Z­–$YмlќмbБˆfГ ЃбˆС` ,џ›јдjЕ"NуэЗпЦэлЗ…fK$ˆFЃ�€\.'е#ƒС€`0Зл­­­‡h ПўzЈ†љЅ/} ‘HDrЙ, њЬ3Я bmm яОћ.ŠХ"оzы-T*\Иpёx\Аa"‘‘E:Цўў>"‘BЁќНЧу‘Ь :‹‰Сx<  ‡C˜Эfєћ}с#- Ьf3Ње*Ьf3ќ~П„uŠŠйћC|ШdІйlЂVЋСbБРh4JŸЩtГй Ч#иБнn‹ќф{ГйЃFISЗл‘sН^oЏыњ˜Ёзj5tЛ]ј|>ЄR)ЌЎЎЂлэТсp`qq‹‹‹АX,HЇгШхrhЗлАлэ№ћ§˜šš�QN}šзC3ЬѓчЯc~~§~_D cЯ?џ<тё8Ў_ПŽ[Зnс?јVWW199‰GyЇOŸЦєє42™ŒPJлллиоо†ХbСдд”T‰ј’4Mƒйl–j‹лэF$‘аj6›Х˜ˆЉЗьѕzАлэЂ ч}ВM‚фЖІi�Fžж`0`0ˆˆƒž’FЯЇЭfƒЎыRХщvЛТP%Х„i8Ђнn‹WГйlђљќ˜ЧЌзыт]Ю;‡ХХEдыuМїо{Шd2ƒˆFЃТЂZ­Ђбh `fffГУсйlіa˜Х‡^Х0Яž=‹гЇOУh4Š@v8brrё`0ˆяџћјйЯ~†з_…BЩd=і˜рЇkзЎЁRЉРjЕbuuUJwёx\ДŠ‡CЪЬ(ј0›Э‡УіˆбиBAœIЃU?‡lAдuіz=љ zХ|>/ƒС јr0ˆСѓ~IТS-хp8Fсёx„"jЗл тЩˆG- "}cДнn‹a[,ЉŸпИq›››0 ˜™™A"‘@$С`Рцц&a4dУ}šžѓ7ЬЙЙ9<ћьГ0"а- XYYС—Оє%˜ЭfќЫПќ ^}ѕUМљц›h48wю–––Чбh4Ых$ нллЎ“ќпяЊ…œ$_&,EВ}XŽН8T*‘кщїћŠЩ)Кнn щ4dz^–PM&кэ6jЕšdтNЇSю‡‰ с�л&ьv;|>ŸdмКЎ�:ŽHшШƒђлэ6zНžдшеMEˆdЗлЁыКlюееUT*шКŽSЇN!™LЂбh VЋЁX,b0`bbB@ Xіѕ‰цдд.\И�Їг‰l6‹bБˆFЃx<Ž?ўу?F Р•+WАКК*„ё™3g033ƒnЗ‹FЃ!ЅСbБ(‹!ЫуёˆЫхrUjŠХ"њ§>ЬfГp•i0TK‚H!Б:Ѓ†azWv9Њ}цЊgЄБ›L&x<4 fщ$№NЇp”„УсPшЂRЉ$�’DБ‰Žв7RVѕz]ШxЗл ЛнЋеŠээmмКu §~_ЊEKKK(‹иоо–~)вXдЁ>Ќы5Ьчž{>ŸѕzЭfSJ‹№�Mг№Цoр;пљОџ§яceeO?§4fffФ#‘ йэvЁˆш…L&“а. чф%I|ГQ?KCыvЛBUбƒ`KbT=ПУсpHћ…Ьа !�ˆ'g‚С пщtJ;EЋеB8–8RFУсP~ЎP( VЋСnЗK3aŸЅVЋСjЕb0`ggGФ/ƒA6o"‘€нn—ЌнхrсфЩ“˜™™�ьььˆˆХl6#‰|*Цљ‰цK/Н„x<./vggЧŽУWОђLMMс?јўэпў —.]B2™ФйГgсvЛQ*•$Ќ1Елэc­ фIxŸ‘lgŸ8лrЙМ^/€1 ŠОƒ:�Ш0тKЖ> 8NщЦdжM%}ЉTBГй„Іi(‹т­iдdирѕzсrЙаh4GђыѕК<g0„пяGЗл•ЬœПKЏЪЬпoЕZ …ЄЪnЗcuuUФ, 8qт*• жзз% ‹FЃ0™LBы=Ќы1Ь .`zz•JE<хєє4Ођ•Џ`nnЏМђ ўюяў7nмРЙsчЄэ�ТсА”ккэЖTP‡д‘™8ябHіћ}1N†дRЉ„ЉЉ)8NiI їHН'ž‡b6~ ‡C„B!�#KЏЦЬоh4Šf“ф<3|Гй,r9BJчŠХ"l6›єС3ёшvЛЂЈgІišдЛ™˜Йнn!ц™QwЛ]ЄгiСŒLіHш‡УaLOOЃ^Џуж­[Иrх &''ёќѓЯУуё P( Z­"›ЭТхrISмУЌ=pУ<wю–——ЧнЙsnЗПѕ[П…ЧпўіЗёЗћЗиооЦЩ“'Чсѓљ0eкэЖє№№Я‘zчƒкJb;–ьh0­V ЛЛЛRcfљŠxŠŽ‰ЋјR{Нž`;т@Ће*†­Ž}сц!ЖЄЧЂRˆMrфn† P( RЉHRцѓљ`6›%лчP&9§~_&^„%ФЫЕZ ЕZ ‡‡‡т љ}дЗкl61ИRЉ„\.‡kзЎСуёHЂšЩdЩdЄJeБXpѓцЭi*Піz †ЙВВ‚'Ÿ|�Dc�єG„пћНпУПўыПт›пќ&vwwёдSOСчѓ‰– ]•JEШeЃб(ЦIВy8Jэœa˜ј€hПпGЕZE>Ÿ‡ЧуA0”№ @B0=Јпяу№№хrYx>r’мЬ|љќ†щjЕ*§?„"ЌЁsђŸБT*ЩЫЇЗdћ1?WЅŒ|>Ÿ<Б%еHФђеj˜žžF"‘™з‹ž”а)•JЁбh P(`zzГГГpЙ\888РўўО4Пйэvьээ=(sљЕз3LтDbЂrЙŒС`€sчЮсk_ћ.]К„ПќЫПФўў>fggЅDищt …DxЫ—ЯР,“!—сИg˜­VK0 �ig ВЦэvcbb�„ЎБX,’­ГŒIыќ †U“Щ$э УсP№.ПГеj ЦЄЧЃ‰Iа`0€ЭfƒбhИB!БУсЃ#^Єњ‡U,†cвM4јNЇƒFЃ!Я0E M л@Z­вщ4Z­–Шји‘yчЮ�Ряўюяbrr—.]‚ЩdB(’Сƒп|`†yўќyƒA4 ЄгiT*ЬЮЮтЏџњЏБЖЖ†o|уИ|љ2fggqњєiDЃQd2щб)‹BюВ%y6…Б|Ч И'І чЃїЌVЋB99Nщџ&жт %їзыѕd‰i5ЇŠœt7чЉЅM�Bqт›ЯчCЇгaЇОбВы‘ЦЦЊ“С`@ЅRбh”рѕz%ЬѓоЪхВD–§§}˜L&Фb1iћ%џIŒNЅПеj(•Ячqpp€УУC|ё‹_Фђђ2оџ}lnnЂеj %uћіэa2Піz †љТ /  Ё^Џ Б …№7ѓ7�€пљпСЭ›7‘L&qфШ,..b_Ф­…BA<=’ІiЂ”ЁŠœx(•J‰BF­а[$ЩЌоbБH;У1%K‹ФŽvЛ]Z‚йžРžqzлсp( 7=:Б'CЛнnGЏз|JЯGQDЪк€б�0rЖфG w'€Qч(C>Ѕm@@ ƒзы•y�ЃГŸ�ЖgГYœ9sŸћмч`ГйpљђeЉ(Й\.ДлmоЏйќкыО ѓФ‰8vь˜єшp\ЪŸўщŸ"‹сх—_ЦkЏН†rЙŒ'Ÿ| ( ‡Ув™HC Т№ЪžЭfБЛЛ+ш-ˆ“(Ў ЗdSЏзeЄ …СЄ‹žYMa’Х l4TвHЄ|ШВЙŒПЋі›SЖFЃe‘@5~Я"gKЄWхŸЉТ]зe"[P:Ž$=ѕz0™L˜žž–„ЭjЕ \Бйlh6›вFВНН-ŸС`PЊj›››xёХёшЃJЕХ‘P($нŸдuп†yсТQCs@дзОі5<ћьГјжЗО…њЇB:Ц‘#G№љЯ^д6/ј§~Љˆаl6›�љt:лЗoЃбhŒЕ-Ј=мў[ђчˆuM&г˜@ИЧѓQ`ЁišqЋе’>в]TІГбЫfГЁZ­J ›у[(‹#‹@ ‡^•“ф +дЭЦŸ'/ыїћсѓљ�`Ќ…—И’kS,QЏзEЄQ­V‡ъpq0ћw:"$ЦфРБ/~ё‹ˆХbШхrиккBЏзC"‘@ГйќDЇ#п—a>ћьГH&“hЗлЈVЋh6›јђ—ПŒ—^z пћої№ђЫ/ckk ггг8yђЄЈГ;666 ЧМ%a �vwwQ,ЅBЅ7%c.—K@>†h‚|R#ФX4Оœ~П/ЂeŠ…9‚&—ЫaƒС�.—KŒбхr dhЗл’P#RžИ‘ž“`Гй„UPћеъЩ9:Nј|>x<Сv ѕє–ьƒ'ЋАПП`0(єCЏ:Œ‹)z^~Оzџф+їїїqъд)œ:u §~kkk( ˜˜˜ЎгOтњи†ЙВВ"д˜]О№Т јГ?ћ3мЙsўч.Тг .Ш!Џз‹НН=X­VЉrиl6С‡L`ЪхВdЪlГ ‡Уд9ЭjЕJY’FЧ$„­ЗvЛ]^)О i!�R-‹8<<D6›•ЬŸX4П—"bŽГfGе: УnЗK:qu0”$…!;HЫ1ДЊlЏеjв›дjЕpчЮИ\.Фуq‰ф8­VЋxdunМŠuйуn2™Є%ЙZ­ЂZ­тиБc!vwwБЛЛ‹™™хШбy}lУ<wюœШЌЪх2мn7ўъЏў ‹_џњзe<ЩO<™™шКŽp8,^гхrIЕ„’2пФˆ�DkHЏGЭ%C#C(V@(b bЦЫяT;$Ће*кэЖаCѕz]№ћrHЄbЈЎ:ђF@m'я‘їMЏхt:EѓЩžs–b ˜иЉJ(Т т;z2`4чЩхrЩЦёљ|cŒ ›…Ф? „AvЛ]А&ыјKKK˜™™‘с]єИ§~џЉЅ,У<wю$ф6 ќўяџ>Nž<‰—_~пўіЗбjЕpєшQЬЭЭIFЫаЊ�MdФi4~П/aŽŠp5s%ўЂ о€ђ3’ТЌЌАъCяA|G\GЎ’ЦHƒХbтБШ?вРhшЄ‡�ШwиfaƒК1ИЁhЌЁš<‡‰ГіRЉ„нн]шК.]—ЄЂјьnЗ[Œе'�’ИnАtjЗлjgх”]зБЕЕ…l6 ]збl6?њш#цммЮ;ŸЯ'ZG“Щ„?љ“?СыЏПŽЏ§ыB Ÿ={VМH­V“’ердF’bЭš™5­бhŒе™„ В.жЂY;Ї—bТђ&‡e‘ЫdRСd†^Ы`0РяїУщtЪїѓљBЁ‚С ШжX? ЦNХ’JбёТš�� �IDAThhЊЁУhМAŽГP(ШЈnn�жњщЙnйlVУ2"�k'Q"�Ђb7™L8vьЮ;ПпZ­†T*56ШыAcЭ<№`aaAHeќЏ~ѕЋ˜ŸŸЧ7ПљMзЧ‡бhJЃP(  Ъ‚Gq!‡(mTКХbБ  "ŸЯЫB‡ЊЦЬВ!НЙ=ЪфhШќl†!†K–їh,­VKB4+&8@Œ‹ХSDЬPIEiЪЭjЕšPMЄoˆэ€{*%яќЧbБШД8Жѓ”nЗ ПпfГ)а€r7ТnBzmbmеЛ6›MtЛ]x<ЬЬЬ›NЇёкkЏ!™LŠD0 "N‹PћA_Щ0=*}!о333xц™gpчЮќћПџ;N:%Р8•JЩфr98NTЋU™„Fš†х5]звK№e‘ЯуТа;ь’РЈрž|(C!=Уѕ›T‘s3Й\.™сЮ~ сp(ƒ&''Ч(’ндhВОMмЦф‰Эf�Фx8щƒџЭHAoЦЄŠхX6ЩБS“ž‰ 1.ЃGЕZEН^—яќzp`„ыЙIшэ��Ш|ЯееUИ\.<ђШ#‡xу7аыѕрrЙH$h§#&KrTАx<|ўѓŸ‡лэЦ7Оё X­V,,,`~~7nмQЋлэ–ъ“ †Yв3GкS в9–…=леj>ŸVЋUTс|щlГЅaбЙ№|бjx%$рЌ‘“`xцр+bтX,&8”;˜еZ­Vё€ФœkPMЎz^&EdШ^pјlЅRI AЕZ•1ЭfSж€DF4b[xJ)ЎzН>2„џ‚nЗFБXlLцЖЛЛ‹›7oтќљѓ˜žž–KMгАВВ‚|>џщцммœУ8 \ИpыыыјюwП+‹FКЦ‡ЅЂСz7ИІiТU1Љ"bT†[Ѕ^ФfЊЧ žƒй'Ыq�Ц�Оœl6+XгуёHMžIOœ`вХ Ък9ЩyFББё/Щ{‹ „B$С9Єпя‹Ю“?OХ:kчєЦјЪъя QaћћћтЁ‰›ЭІф Œ"4ЖЕЕ5$ T*™рсїћ‰D$љЂ˜хA]†џщrќ]=�QїЛпХўў>Ў_ПŽееUмКu ‰DBž‰„ЎыR gї"[VйОЪ№ЭEЃСБЗ›дy:•фfrЂўЃŠihЌ~t:dГYёFcЌ–“вFЩх‘,ч&QЫЇхrY €Dдѓ(HЕ‡Œš”№™шU5M“ћb›8†M.—јoђЇ”фbwwW я‡‘>zЭНН=93 MffЅ}Фуёk‡Пt§Гђ'Ÿ|БX љ|FЃ‰D/НєЊе*ОёoH)ЋRЉ ‘HHE€p‰ф'=(Фƒб!OФD4тfЫ�ЄъC/EЕ:ЋI4Z5“*ШUЁ0gёхp@ЋС`@БX”suhhfГЕZMzд‰9iф*LЁЗgэžIПƒž™41%pЯѓЋOЏЦyFNЇS*Oьd"&Ѕp9ŸЯ оЭчѓТ€шК.}і„DС`Pр iРl6+Ц‰DЄХујёушїћИ{ї.Ње*ІЇЇбjЕX™ђЪOŸ>p8,овчѓсдЉSH$ј‡ј‡БYпgЮœA CярѕzМS}d2™P*•$ч0“Ж`XЃBˆUт)5<rАq‹ЬЂNRcRР№EVOтU=ЯЂ!1љ R‚ІтFо#žjЕ:v �gЋ“HW7cЃбџЖлэˆFЃ2ПHг4LMMЩ=гА YƒRЉ”Ь%Ый›ф;9TM|ŒFЃHюиF @Nур;р)WЎ\‘5~PзџШ0УсАМlж‰' i^{э5љЙd2)r+ЕV5Ba-XU‘*Ё`˜FЪВ ‹э$ЙЉЂсkš&…41У?чFв‹qЊE01ŠгщIZ.—“0HQsЁPЊ7Б2 —­ ”ё9 єћ}LNN ^ўUSAЈсd›J0ё{ ШћЊУ ƒ$8ŒNšІ! љЯЬ\ѕDŠŽ№T]2™ФккЎ^НŠщщiмН{W†Пђ;3™ BЁІІІ>єрЎj˜‰DBjд[[[2вХчѓс?џѓ?ЧX†pЃб86F…м"�С‡$бщщzНž4іГЮ 1)qЃŠщ˜yGёГHиЇЃG#AЭЊQЙ\FЋе‚ЎыcAm6Ѓ:‰aŽ/‚_Їг‰@ €Z­&X1—ЫaHzcrœЄЮјЙ„8™§BС`P˜ŠЇU Н/з^ŒœІЊ€„sVЇШзЊЊ{5qЬfГHЇгИuы"‘мn7BЁœ•щѓљŽaNOOcqqQ€ххeј§~Длmloo'Cj‚ъ†жЛ™ѕЉтXNТ`I’‰ Ћ3$ƒЙЈЌQЋmЛ4BіБДIЬ{Pi"nD8Z‹:HNЙ`єzНcGCЋЩ 7 pOšFБHЛн–ЁЎм�РНNHъ@ЙYЪTIwВTхВАjФС\ќsnjblЎ+Ыœф^ењ9‡ч~p€#`46ІP(рЮ;X^^ЦммЎ]Л†rЙŒX,†ЇŸ~ZftоЯѕпfх>ŸOц*FЃQ,,, ‰Шy7ъ№%ЕДFOCjHЭњШћqAV) P9G‚x~6 ОеjЩЁ4в($пšИѓ™PвЦ ›ЯЄЖЙ’ …BrŸЄdјљќ70ƒFСsЩеУTa2+-є|jBЧ$†Pƒо›Ž™77ё# ,›ЭЪї–ЈДз’ЊІnЗ;жЧ лфф$fўk�мЙsG№ЋЯч“ЃoЬfГєЏsДї'f˜ѓѓѓЂPщvЛˆХbXXX@ГйDЁPS•,.."‹ Žaџ ‚оЕqvобjЕš$|9ь)'УPЮ Iu‡У!“3˜Щ2срйф$ЧљтHсі!жДбьuЗлx<.sT‘1�щЂЂ›ФПУсРффЄt/ђžйAˆ fтjяЗVЙ1ЙЈ%ЎSБ =<7)C7Ѓ —­!мДЌ‚Q<BІЁRЉHgЕZqєшQyіNЇƒrЙŒээm�ЃщФЌZ­V<ђШ#ŸЌaƒA„УaЁ žxт ЃeKЅвиZr” ЗjшЁpTе0�ф`z–Ы>XБсЉ$ш™ЉГ—›ъ pкТјвшq ƒДаћ+ъКŽ`0(ј*—ЫёŽ”ы1ќЊX“ЦЉ”хœNzUC7‡‚kЇ&‚МGur2KŽŒ.Фкм0ф EјwL”hиAHN˜“Шp/іСЋйyЁP@Н^—уYžxт ј|>ёъЁ}?зЏ5LЪђ{НЮž=+JšЉЉ)ЂT*ЩЯ2ћcтУљBмЩщЄx8К…о‘aДеjIM˜ЦІ†kŸj$$“YuaIј’8Œ2:~G­p#šЭfфr9iU`"ЧюI h(Эfsl6ЧЕИ\.Фb1„B!сWЉNwЙ\‡У~)PЁб2мrS0|ЃЭЬжB•йшїћrD 0ЂЈ˜€Љl^лйй‘žТvЉр`DЖ—Ыe\О|Y&щMLLРыѕЂзыaffO?§є'c˜Т]6›MIz8Ч|{{{Ќ–ЊЮІьїћвКJЅ.r(B(’РЮ?�вzKЃgЭаЉіь�ЌJ-ІњB{!зщtŠ€ˆ+L&|>Ÿ0LЮиК@/NcВZ­вrСЄ†Ю'ЂзcВ‹Хdюe JФvЌЉНJЊР0Ь$‰•˜з4M6ŸкпCcSї„d RЉ€‰>11!ƒb9ЕУуё`qq�pѓцM)^Лv vЛ]l…Х€d2y_†љЁY95~FуЈiџљчŸG:Цсс!†У!._О<жТЩE!=уїћEqЎvћБт@кЈєfVШ&2zGŠ3HЊгPдI0Ђwbјч‹V1л�*ъyР.&ъt:(•JBEбјј‚Y.%fcƒкШ^†`6ОЉ:M&wФzŒ$l/!ЕFLHйыѕdц*фsrІqR[Ъ ЯЭХh“ЫхЦМињж[oсЉЇžТsЯ=‡їо{хr6› 3338~ќ8~ё‹_<XУdRЏз‘L&‘ЯчqхЪ1€t:=іѓЅRIŽD!_шѓљH$„FЂ8–иŠыѓљd>C­тPЩPOУстБIœ' •“: Sэ ч‹9˜|љ|>ФbББ^"~? ќ тO–)‰лHiЉ‰H0=%НЄ:ж†U/jI™ь0Y!ЛС2Љбh”FРrЙ,^šFNў—с^ѕ–ЊЄŽпMLэѕzEiЄŽћцUЋе …ЫхDiІыКœиf6›‘L&?Жa~h­ќБЧУьь,<NŸ> “Щ„ПџћПЧ7`БXpчЮЩЪЇІІDќJƒЂЊ…&1(3T>щ%†*�rl6›”.‚YКЄ@–^йЉъЋеЊdгLвMІбlЭ`0(їСj •ёTЎЋ8–›†/пяїK=[­ЄЈšJ†bGVn(f&gKКHУЦ<ВЄ–€{'Ѕ™ЭfЄR)сfY-Rkц4J§ˆYщэщPјоќ~П№ЭмЙ\NоЙйlЦ#<"їАДД—Ы…+WЎH1€Эkdg>ЪѕЁГйlJ{,ХОwюмСщгЇqxx(xM`3 И‰%ецЎ ^‚‚\ЮїсЌОTђ” Ÿl3ртГRBЌЦКЙ*;#­Єж’- тёИdД Сь™aŸ†ЮMCXСl…Е9N­Е—J%йЄєІєHћBШ0M8BoЋ €Щ№g cђљМ4‘•JЅБ(“ЯчEŽШВ$Б6Б(UW$лIВ3RP‘Ѕэыыышt:‡Уxы­З№Т /рФ‰xф‘G№Ю;я ^Џc~~+++ыфп_ы1“ЩфиN]YYлэЦюю.ЪхВаEœйШsf(qуд ро "uRUkHK;ЅgbO7„ $еEЄRшЅhPlРт}№ї™0бS‘ˆ')Nў•Ь[ŠYWf)’ 7У(я…/›оœ “)!7 €<?ё)# ‰y:ž@Ф�dІ%}БXLО‡$=Ё†ЫхЌЫЈФMs§њuYKžDјЕДДŸЯ'g~šЭfьюю пљQЎЭЪy#ў>љф“јъWПŠX,&;‰—ЧуA,о0‰ c0ˆЖ‘TН%Љў'їВFOGOHOЧŸхяЉ5mетв3ЎІiBmа№дPШJ �z/“Щ$ ХФljƒН+ZМ?r~*ЯјA Щ„…‘Fm‡PыфєЂќj+iьф*)є`‰›HeSКнюX‘ƒ€п …FGrгдLаKвёаЋb˜гггВР4Ќkkk2 —ЋдCRФC•HШЋч-H ЉэРН*KˆРJˆЮj™ь№џ™ГdШЈіŽScЪЫАIУgMŸ5сѓљdа�љLrƒќ^іЌЋj{Т ’ј™LFž‹"zoЕdЈЖѕвг~PЪЇђЄмD„P~ПсpX<9Ѓ! љp8,МЋЯч“шТЕчЛцЅŽhЌVЋ’шœ9sFJЏЫЫЫB3}”ыWbLОXfБ'OžФюю.оxу ёфЙPд№Бљ‰ъiuqш И�Ф“PЄЫPЅ6lёѓU !У(™§аќ\ziR3м§4bоwЅR‘MТ№Ц*ZЌзыBЉаш8ŒДPЇгA:уr‰mIФ“њљљЯ.ѓЯЃб(Nœ8!MzjЏ<3р'Ыb “›Š^–D;Н:хr‰DBЂ1/+UъДdj T=,0 нГГГвлУb…оТpцЬ\КtITіЊићО “7пэv‰Dрїћёуџ;;;тСTныѕ$a0 2ќєƒ•†!�"> VQевУб епcVЯ&,b/Žƒ&%дрш>ЕЌ*Че!ЭfSТuЃбQ1ЄšHыX­V™Ф№˜Ыхd#0ЫЇ0ЌВЅстХ‹Иuы–мЦЦ†У!{ь1 Ыф I)ЉTТ `ђе6ЊЖцччЅ"ЦviжьЩx�Œž™ŸOƒd ЖкЊЛЖЖ†sчЮ MДЕЕ…ѓчЯ‹.`mmMШїb˜.— гггrУХb7nм1555&wc(рCqЁ(В tŒѕYzbъ(Ж™№АмF9 “Ё˜YА:]иэv#ŸЯЫ V† vЛ-фz>ŸG.—CЅR‘АЦpLС1pOЅišxТbБ(ПZ­ЪŒNЋе*eЙp8,Н9мxЄ•†У!nпОџјЧ’DбрjЕ666АИИ(…Ъ uЄФчъH†№JЅ"ЌEЃбРтт"вщ4pєшQСљС`p ?гиyOjЃ йl{ЏРЈ›IP:ЦќќМ8'`фйЃб(Ў^НŠD"1ІNКoУdіЩЙш/Пќ2о}ї]ќу?ў#ŒFЃœ{ Œ@0ЧРЈВ/’Д|бйlхrѕz‡CNУ%< Ј7™L8<<уUoU.—%Ћemžžтƒм_TЅRСЦЦЎ\Й"*Mг0;;‹G}tЬЈ˜XX­VLLL`ggƒA€?aŒУс2$œчєAє­[З№ъЋЏJВРЭЧьКX,bss'OžЌЬЭЫŸcЫ3Ё‰oТвJt(ШЬЬЬHи‡УcЭgьЄd‚Dут{  ЋZ­buuёxБXL 3“Щ йlТщtЪYD.— ЫЫЫјХ/~16>ђО “Лƒ7{фШX,)7хѓљ1f>Ÿ—Z)У7L„ …‚(Хљє8<БVзuЄR)1Ќ\.7&цUћЌйoNƒVбиxfГйЫхD’ЖКК*‚†BЁ�ЃбˆЋWЏ"“Щ`bbЇNТєєєX{{m(Ф Јcvvfѓhш�ЯE'ЏШћ$5tхЪМљц›в|ЇišœРK,ЪyёLоT=)aMЏзЩ(CО’тaUl0‹Х„ЃeyЕнn‹�˜S:‘HЛЊI WKЬ @ІЮMNNЂX,ЂRЉШд9ѕ8Рb˜<ІVЋIIёъеЋ8<<”ФDeѓыѕКрKроќq‡ctRlБXКИ7,Šи!NЫё'NЇsЌіЭСА,SкlЃ“Р8‹’j&r}L6 ƒdЬДЩуёЛ+• ќqDЃQ™nСч!НCOУкЗ­Hё\П~ЏОњъи"z}fИLˆђљМT…Tз­гщˆH„kЫіе)�#7B& |fтшfГ)ЦФСuЃP…kЬQ;ћћћcя~ssЙ\NZw766dlL"‘РЦЦŒF#dоРЧ6L—Ы%-LD8‘8… ` 729ЂШ T*IiаfГЁT*Сl6IВ(##F$>U[ <”И€Qшœšš‚ЭfC*•BПп—АJьЦ0J#сё!l#mЃ*e …fggqъд)9"=H…BAФР=ŠHзuI’t]БЧѕызёУўp 3ЋD>Н*Б8'k„B!єћ}йtфЩJX­ЃўЙ\N’TfПаPбЮMгяїЃВќЩGn—ŠЌIХуqб10 ЊеjRžфџыїЁg-‹Щ(?д0ЩRКцѓљL&ёюЛяJЈT*в=ЗЗЗ'ЂПп/ф9ёZ>уKUiЏз+‹ЬŽF–Х�Œ%% /xЯЊхjъ(>†t*дН^/nнК%D51Љ—nЗ‹§§}9їЉЇžТЬЬŒˆЈд!žVћŠјyLжЎ]Л†ќрВ‰ˆHиT͘zDЇb0šP Ѕr›L0вщДАІiЂ…хtЮ‚Ђ3i4Ђ‡B%Џѓ~Й^МO–)Q “˜зчѓM}SЅˆѕњ%Уœ˜˜ H:†ЭfУ /М€ЅЅ%СœЌ|ЈдJГЈ™œкџЭJ ХБН^ѕzљ|^xIЏз‹JЅ‚BЁ ‡П3Д0Œ†B!ЬЯЯKШГйlвJ @МГxrj!Й1шБшщЙ)Лн.nмИRЉ„ГgЯbiiiLєЬЊƒС@ЮЯёx<bH/^ФыЏП.ИьЃ Ћ*\KЕЯ‡Аul&oLpˆ!ЭfГ< UќЄРWHОsнИV4>’ї.— Й\ƒС@ф†ЌŒ1кКг4 бh§~oНѕ�ШяО"|рГ~œC~Щ0Щqбp(јфТ’>b‰oqqQк ‡LjЈеjТ3Њ†ТЬ—ЅGU&Цpxxˆ›7obqqQ Ющtbzzёx\0( f№ Р€žЂеjЩ<Ыƒƒ їєBФWœШлыѕф€љѕѕuœ8qЇN’5 Їф‹&Ю.•JxчwЄВуvЛeИ>7ЊЊЛdBЩjкp8šИa0ЦЕЇзуws<™NЁу&#‹Až˜žŒ7‰Іic}]бhTцK‘щPЕ­ŒtЕZ С`Й\kkk8sцŒpШwяоХЪЪ €{эїm˜L"Nќq�РoМrЙ, НsчТсАTpђљМ”ыXЂЃQ+б@y†“V 8”taa‹йlсpКЎ#‘HШ‚2\Елm9h€*?‹CІГ#U~”й&3f�Т—v:ЌЏЏ#“Щ еjс‰'žЈ ЪФX>mЗGчсbтˆЖ4ЗлmGмаЄTЌV+RЉ”єz3CЇ‘q“ЉšKMгЄaŒх]&Hlu!d"7ЉišАФ–*ЕЅ4?ГRЉˆŠ‰,H2™кD­V“юCшlюЫ09vкjЕŠ1єz=М§іл2‰"сkзЎ€ьвнн]dГYё�КЎKN€NьмунXЪ$u‘Эfх ЩƒƒLNN"‹!‰Руёˆ‘jb;0GэЉ/„m0ˆŒŽо@х@kЕТс0ТсА$bЊbМRЉ`{{ЧŽ“Т€:њЏRЉРчѓсШ‘#ийй}€Хb‘™C‘H>Ÿ>ŸOšьŒFЃœЃУR i4PUГ мгcRЯ@#цкR­Ю УŠ€Б<€Ќ5›мjC MmTЫвщtZ†њ:Ъ?їm˜j-9`0р§їп#Ў?fyњ„е:šIюБRЉIKмJуdЅ€и“�›уGиbЛДД„h4* �K‹ме<п‰Ы‘§~сpXМБЎыBw‘m0Fc\М^/ђљМєГžœ+Ÿ—ЇKг‘šJЇг0™Lт5Юž= �ИzѕЊЬPR=;ёєФФііі„u№zН’\1ВАжЯr*K›ji—†Р*“)Ъбxњ^mwсцЋзыRнЂL‰ЃkљьЁъїћRj4cь эg_дYїe˜,ЦGЃQqѓœ"СвЋМшŠХ"‚С „šС`0FЈ3I!•СgтБЛЛ‹BЁ УјЙ”аБчrЙрїћЛЊ#Ќ™ˆpјљФœ@�ёxЅR @�сp@�{{{pЛнЂЂтЬNжy| в*єдLъш‰Ÿyц$“I‹EЄгiєћЃYE}а˜8vooљ|“““0 ВЉЩtаћГ|H|ЌzRСццци |эv[њјщѕˆOЉ# тчЉcM&‰ …Вй,Ў_ПŽ›7oт _ј‚Œ кнBА—Ыeдj5ј§~tЛ]Ёˆ/лэЖь>.Ќк*ЁVLX-Ђj‡$7wГ*аeoїЬНТPФd‰ €zў7I_?�ё&ЬžHvъёxААА0ІВЩfГ‡˜™™ІAвc­ЌЌрЅ—^’Ѓъ‚С p~ oъќJ5ЩYYYС‰'$лfї$Н6yA`ф™оѓљ<JЅ’@)UEФФ”Щ#pO>Шф„*{5‹Ї`[):žьA.–яEfм $цiЬj8Яd2т%ћ§О”’YџП/УdУT*•ТГЯ>‹D"t:-ЩћzxƒAЬЭЭ ЯЦD€сš­j™‹Яd„ЭћЬTUrœX€<†‹N.“ ­"mЃыКlИ~ПѕѕuIіи/Nкi~~šІ!‹5qуВ%–/ŒЁщjЗлИ}ћЖ tp:…BbLnЈ<88@Л=:х—™7ызTI™L&iуІP(Ll …‚$H*FTq(Ћr<ˆяHMь�ˆS Ёscq�ФЪЪ nоМ)Д шАюл0IЛ,..тФ‰�€ƒƒƒБцz&/МВй,тёИ,3Zђjм­фхHИЋ*Š xБц]*•`ГйЩdФCЊ­Єѕ Ь FуЗшёxЄљ‹Sнx†ЙеjE<‡бh”Ѓ”Y/oЗлиллC&“AЗл•іжЇˆ(šЦІіЩP НЙЙ)m­L|Јф|NЧ#UЃ`0(ь §~_ †JПЉТ�Ђщ$]ХBЏз“0mБX011!ПCuУ5.žЈЬ’%лc˜DЗlnnтдЉS0›ЭШчѓт”дЖпm˜єŽдPЃХЂ0тЉВйЌ%Ti?U)l,учЈJnЕ†ЁР\­п€“&2™L‚G{#Ѕљ9Є‰јчЬFUU9!VЋљ|‹‹‹тщ5MУжжnмИ ‡CLOOCг4Š—&нЃ6УfЄгiicfђЧб„фi�D(ТГ“ьvЛLW#ПЬФ„kAЯФ,^diЦ�� �IDATY№gйЏD‡AЇbхШnЗKЋжѕЉ'`жN†% JБ€Р4zm&jляЧ6LЕа_,бl6qэк5 lрхvЛQЉTP,111!˜‚†ХгГиЪР№ЮСѓe‚еЬ›FЅrЁT1Y,„B!ЩТkЕšД&[d2Ђіш0IbЖ9eЊ3fцщtZщ™iI1+AЙ\6›Mр€І ј|>LOOKѕ‹§><„‹Ђb1z"FV\JЅ‡єЮг“qŽRЃб­‚еjТс–Дs>;ŸŸтьNЇ# -`„зЉЂо“I“[Š‚уё8юоН+\Љe˜šškќи†ЩЃсp4%ЖZ­"‰ШЊjЕ:6ь€uщ~tІ7‡ ЈВ,�RUQ{PјГЄO€{ѓкIлlЖБsщдaWєTЮRФ^UєJœFEН:`Ÿž’ќффф$РXIMѕьщtzЌU–уU677Ѕ`@U=ϘдQёЯѓ„˜аQGHЄыКЬPbЅQØ@Ѕ=,ž‰ …$ђ0Dы3YЄ4ŽЮ€ь‚њЎ�H$$Žчš№§ЅR)шКŽлЗo‹P›6єQјЬ_2ЬѕѕuьээСh4bkk kkkЂрQПРK$)ўгщtфьVV8Š…a‚ …ФS„B!)З…B!0Ѕ!pёX†ф.ц‚ЋS$д0@<{Ўљїњ2['Ш'Л�@$]ьў$ТJkиTA9Инnј§~)з2)Ё›˜Iš:ЧbБ N ‡йh4ААА€@ S6TqEЏ7:ГЈT*!“Щˆ‚KЪˆШa v№ž ‘Иnd>њ§>ЂбЈŒЬQ‡C�L.—C$Стт"JЅІЇЇяЯ0ŒеW_zщ%МџўћИsчŽx!^ъЙ<ܘљШ­‘bрА|6КQ Іт"†"4gSђГT54‰ ž‹N8Р@cюU.€{§лќsVH*•Š„Ќ~П/}гяПџО`d†Hжљ™щnmma0ШY:œЏЉb=юЂЧуdeNвcл)ГfГ‰h4ŠызЏЫС]ЂKz‡Њпя‹ŒPU_•ЫeQ1ŠЉ 1%7?—m'єјjѓнўўўзЉіДыКŽ§§}ьььˆГ`AрО Глэb}}gЮœ iБXЦЦЃкˆ}Rи EъˆœУЇЎШ9дj5ё,ЕЉUв”’бk@gЋ�“ XВуџS@”Ячcf’Ёіэ,,,рЕз^У7Єˆ}ыLl$L’#НУ„Ј^ЏK’иэv3Jєz=ЉЫѓTŠX,†JЅ‚ЭЭMЉЄЈ§щ,љRчЪѕ!ћA\Шчц†`ђУMFЏЈv‹6˜L&•p“ЋЅ‡юѕвSRЗАА€wп}sssИrхЪ§&…ЃљјЅLTxQ<Р0C „јƒД Й2n>,Ё1]Зл•!•ш юMеe%ƒ‚fєН^O0‡ЃYкэЖdЅФƒ|Y*хУЌ’œЌšUњ§~ƒAllloH|ЪPЧHрѕzбjЕЩdАЛЛ‹d2)š�z'Ў9ЊЮfГX__GБXЏЛВВ‚p8,СЊV4•’,FЋutЌ ЧуA&“‘Є•ЕѓС` ЁšЮƒ№ˆм%Ћ~,Y >“ВAЕЋ•ыШD™REЎэGЙ~Ѕa`yyYИ-6P‘DцЅ†N–M&“Јжеr$"ЉT*вUЩOЩЮЭpB• 9єКTAБLVЉTd30ЃeœIУв№™эв б 3„‘Пьt:H&“X\\”ЖU2LШJЅƒ 3XYY‘gf‚Х C’ъ(–AЏ_ПŽL&#йѓЇbБ(–\ЅгщD.—ƒЫхЁ5{ЂшQѓљМЃHЇСЖ О+zrрž ™pРbБˆR=ІV“€{М2ЋOГГГыtо_i˜ƒС@І ‘ЋЃ˜W­“Гљ‰X†Ь\ ЫlQU3UR/ Рф‡^™ƒhаєp\X`Ф 0R,Сњ<a Žх;5)zЙжџU.P-ейlF8FЋеТжж–`рjЕ Џз‹сpˆЭЭM ‡ЃСЄ]ше>Iмгшй LZŠЕчx<.ќЇпя—aьOвu}LЊFЁw'žd›Н|ЛнЮ•ЩžˆщоЁ ЬT&@%ЃžŸt: Чƒt:уЧcqq—/_ОУdЈф.PЙTm+6Ф#ъ VВHk№ЅвK‘+0Ж  Ћl/ rЂ˜еzя0RVyш ЩЩБњЁы:bБ˜lŠei$*>cш!і"gZ(pћіmЙџNЇƒЛwя aЮЊŸƒЄИУс10БX ёxЫhОC Щd]#щ›љљy ЋLќилФdЮh4"“ЩРd2azzZZmљžшyј,ќ9B.:"›Э&CИ8Њ›ЦЧ„ Иw„4зŠŽ…‡OqcВџgqqё#ЋиЅaцѓyЌЏЏcgg ВгдУ;iАХb‘HDp––ЙЋ.ј@<Щ–№€/ˆIP0*ТjЕJ3ѕšЬ(iP ?\lNа`љŽДёЉЪа�Uэ%У1“›­­-Мїо{вrРћHЅRвcCЯЮоОt>_ПпGЁPРффЄD ЊАЪIcqЈ=%nЃ7dвжяїEŠFЬљЋЦёp}љЌЌЄЉ…B`›KПќl:+�ђйќL2d9Ш ЌЏЏф™:"†Ѕ5ˆЂ7R=&[,иDІЊЁеaVMъH-aБ{ВX,JЛ)�С™LXˆ-IшS—ШПгu•Jeь*жЌƒ”јшa)‚ НAo@M!0Кюьь`{{[яЅЅ%)&мО};;;˜ššТБcЧфМЧ­­-ьююbyyšІсњѕыr†$с‡ QXОeШЬхrc”q4ЯОTћƒ677Ѕ›‘}яЊ6†Ђ*иљЌќozEЪM&Ъх2677QЉTwЋЪ~ў. гnЗcaaA6ЌЕлm‰Оїe˜6›Mд,3№ІT>ŠG чr9Х7Ч<woЙ\–Ў;&*%УLесpGFмJЈNњрФ >4‡аsГeBзu„B!)…2;fW У[Їг‘6HАЛЛ‹L&#Щ BŽFЃШfГАлэикк‚ЎыxђЩ'‘L&хўhрœ(F‰D„rс‹RлPˆ9{Нž”@ЛнЎHи˜ФyН^”J%ЩДЩLЇRТЯЮ ­JiРЄЊшhjЕ2™ ВйЌxbžЊ'ъšЭ&жззБИИ(­Т™LFšял0 ТyšТU.3•JсбGEЅR‘ўС`€X,&/œŠob?%‰^ЏзQ(dц™Ё#‰HЈVЉˆI˜ЗZ-9ˆѕh`vіііG1Й� ˆ<Q–с\ЁШЦЦЂб(Ђб(…“ЧуxћэЗaЕŽNу V`4ўЛбhр?ўу?ЄњУ^#ПЬƒ­(ЃSC?=Н^:FЁP;у‘ЭййYLLLˆб‘ћЅЮ€хЪў+@$ђkЕšHИСЉСeтCц‚Тc6ы‹EЌ­­ лŠFЃˆХb˜˜˜РўўўƒС˜м5ЌVЈ§оЊsqqQ<Gž0[Є§<j+ŽŸЭя"LрC31aџЫžфбXъvЛиккBЛнF8†пя‡лэ–9IХbеjUш2 LиHt' ‡CД_, …ф\p> fyyYЮ/ЏT*В>ƒС@eЫХюю.ІІІ�@šгATс1 Š^J/j$U)UїLйњ@ЧР^*Jа˜№їй†С$БзыЩ`JрИйhьЊоЖйlbvvv,TЏ­­I#ы§^Џсpxь^O?§4Ž?‡Уз_яМѓЮЏx@аMzЁйlŽiыHЉ$-ei*Ц!vT…ЈьЪ#4ƒвŽЪ$@э".crCnЛн–ItдFьяя‹L‹FЏr•%АJХсАєšьЧёћ§тБеЙ?ф#xю:?!}355%УnyЄ з†јI 7Љ5*{ЈEАйlилл“ь<H#žЭfУццІ=MЦfmВŠCжB ѕ||Vў?љgzWuЂKЅRГ!ŠŠ/_О Ѓбˆ_|~ПЏМђЪиЯ?ј‡ˆ'žx‹sssЃЪиЏ2L&­VK„†Ѕj1Й�Фoj_8/ОhV\Ј,WUыэТЭ`ЕZež{З;:*%Ѓпя >dŸЯчЅC‘эВЬРY�а4Mˆg†hJе˜‘ђdЏl6+­#vЛ]АIшRЉ$=,œ„GЅ4Œѕd“Щ„••IžТсАдЩЋеъXI– 'ЧЊƒl6›ŒЋqЙ\ˆD"тM™€p.>EЫЕZ “““c &0*•ЧЄ’0Œн хУЪя“ыBhаnNaVЯ ”дЛяО‹rЙŒd2‰_|ЉT яМѓ€бp/љЫxёХёЯџќЯX[[УщгЇqєшбх№4PЕ~Ъ‹йЂZђRаHw№ЄжvЛ=>и+­žWШCPН^ЏєЋG’pWВC‘c\œNЇм+7т'*п)5 …BшvЛ2•Ž|(ySОаNЇ#чBвXШ<ЎаKrу’cFЃ˜•Фи*[ЉT`0„йpЛнcEŠ€eђљМld&PŒ<<і„^ta Н>пQГй”9[–:§~?ІІІDуЊ–JљoђкœP.—qчЮ1Ђ4ЇžмИq?ў8Юœ9#†ЩѓэПѓяр[пњ’Щ$оzы­‘тъW&Gћ§~™ЦS=&=ЧдБRСьxkk ;;;ТсU*•1Ю‹Г˜Ѕ3ыfћТђђ2fgg%œёЛЉtйккѓ`­жhВ/бu]Аb$}e8F2™ˆРьœсШlqьvЛЅ}x~~~LзHA%7C8ыбь2tЙ\X__—Фё{щtZ”EvЛ]І—˜L&)џ1IT[QдЎEvЎвш)˜&,ркd2”J%dџ?qпїu]PРиEYlпА ,:H€AIlЂЈb‰”eEХNБ“‰’Бц/™‰П$Ж'™Щ8<Щ;N\4Ж%EЖе,Щ’(Š’и ˆBєКРі^АXt`џрsЕH‰ЄJоŒ'C*ЖМп{їž{J8Œp8,'3Нђ=&&& T*бвв‹Х"Ѕ YыФ=I сцџЪd2№љ|hhhРC=$5xYYМУГwя^( МћюЛhmm…Эfћ№œтjР{ђлlš<ЁƒС Х<'„wјяyкdЯм+**фš DUUU%ќ>žXМтшѕ З1МI+уFЇ)k$Z­Fuuѕ6ё~ЖаyљН”Зl);lтЋ$l�я™{бD•*6fФуёИHy^О|Y…’’TWW <ФD k<ЕZН-š†79| ˆsr$c‰žІ™LƒAоO(’§7u:L&єzНpSљљб@-›$§ўE_L@іюн+nyйЦЗ%%%Иxё"мn7ЪЪЪЖИЁзл˜ццnyшyCxxOnZYY)œKЪЈвcЧШ‰€нЫQqDЧы9›s˜Gо&§Y‹ёЊZZZ‚^ЏGMMc‘\Ьђ„bБ`0(Œon<B< Ђn$ОY^^ŽX,&№ Џ~ƒС Œ)~nЙЙЙBшШЯЯТ5#yj№a0‚ЊT*шѕz919"хЉMьb1BIє%xaaA6oЇd2)Ў#фТr8BЃКК*• VЋU@ н8аx?Б‡+•J b011!аH&“hhh€йlF0Ф… ЧЧёЛп§###зѕѕr]RЎ@VPЖŽ˜sVкDГЋЅT6›,ЬТЖ,Tжe2iPx<ЯѕЩ“ф†"пt6›)//ƒAэЉфєƒПw}}Ыќ‹Ї IМš€0 hЏЭг$йљљyєѕѕ‰Ї9џќќ<t:ќ~?‚С  BЁ‰‰Е’sЪЯxЯˆŠkP ХVDŸЯч“‡˜YЖЌ%ЏdSDfєЪЪJ( СMI\ZZ‚ЫхЏM’>Ј=rЙ\E$ІSіŠD"Ј­­ХТТўщŸў uuuxт‰'ФЃ€ёл$ЙpŒŒ�ИŽЉзыЁRЉ …`Зл%„”а �466JQЭS’Їё>ЕZ …bЫЉ‚ьmbšй|KžЂм,ь Y№ZcУPZZ*Ьpжy|ry-VTTl#ьђпВ ‘‚ж4ФV …д\ыыышщщAEEЌV+�Ш”†m"‘€Ых’RD­V‹е 'MХХХвpšхѓљчфЩy{іШ0‰Hs‡EЪМGœц6??“Щ$šи'›*І|pѓRзУё!9ЎйŠдљљy!Wѓ–›ХЏ~ѕЋm^˜я_,СxэгmФуёˆIZEE…ИЃМ]—іЦiЏ ЦНqгё‹eNв7$›&F€№Ї ;n�вX‘#ШПЫЛgggј/((РŽ;›4ѓ хЩ411!зhі‰ЩRр95,ЌU€HgГ ‰DBœ3И‰iчТNZЏз ?SЇгI}Ъ“—ё$ƒƒƒˆЧуЈЏЏЖ§ъъ* ƒ`ЩєкииђžЄdBЉT й…яЇММ|лЦ“#ЪьЮž {ŠŠ ‹ђЖтѕЯ ИИ“““xчw>tSъbaa!jkkQ[[‹ŒŽŽЪІg™—є|шЦd­иаа 4-^Нl6HŠ TZZ*&њlŠјё$Є%rЖт’йиМв9ЩY^о  Х5ЩЊKKKАX,p:" Ыvу%vщѓљ„ЧHž'сžќKKKтЫDf=Щ!ХХ՘RЅ^ЏW6IШ<ѕˆ+hчнее…ЉЉ)xН^Љз­y<D"ёPЂЮ†V~ždџ”””Р`0`}}]дЉмŒР{o•P($46ў]іЯЂA.мlЫŠѕѕuЬЬЬмPдs$A,ƒJЅТпџ§п#“ЩрЉЇž*oтD"ёˆёыnLF#…єЬЬŒœx+++r ђщЮЭЭ•мJ]cБ˜аЧ8NуIУг˜_`kkЋЈщыИББ!Гtж6ёx\ј“$ћ§~ ўЩйw(B0ФЦЦ†\#мМЊ8ЖccAі8ы=žєсpuuuтGЦЁ/ƒС ѕб ~Б<iT*Ьf3VWWБcЧЂЇЇGF†.— 333ˆD"0 ЈЉЉ‘йz6гžЗ‰ЯчCyyЙŒI9ъЭ–†бX\\Фвв’4b,}x“Щ)п› *|>ќ~?Юœ9ѓ‘›’+™LBЋеТl6cttt›‡QUU•@Ў%TЛюф'‘H ББQœ1ЈНс;;;‹нЛw‹j’vЈl(JKKХР‰*У••ЩљІXŸ0‰Д\aэУ:ию­уїћхK� ›œЭБ7ћl6h,ХЋ—ЕьЦЦVОcYYjjjф‹І˜uGБdq"Хie!~ПЈЏЏ–}эя М8yЂY ХtЭу)ZXX(›…ш‰/œŽёѕzН2žЅ\˜%QyyЙHЅ].—МўP($NМТ9[ящщ‘ы§FФd RO;Nйkkkл‚PЭf3fff7џШЉRЉP__/&ODјйy“тrЙрp8Ф7=cyyYN!~IйЊ:r'IъeƒTXXˆp8,р3mW8›%U‹›žX%Џb†wrгБљ іG2/Oќ`0(Œ^™йiƒ‰DёxнннаjЕˆХbRу––– i™ЃFž^Z­ ‚cnll ЅЅEdƒA&C999hmmEII :::L&ХФuddDjњќќ|F™<0ЇuLЖс+№ž59с7жбWЏ^E8y4ЕEZ­ѕѕѕиии€гщDii)œN'њњњ>r3nлPYp"эНSЉвщ4"‘ьv;L&“Ь№ЏЮ_wcВЎˆFЃ0›Э())A …ѕцЉSЇамм,Т5ђЄ M$Т|!“†ѕ$kФееUxН^БdШq"AтD"!а!v~<U9r$xO€КT*Пп›Э&Zšw‘ˆ‘Щd$вfГ‰<™% k/’UhНG*­V8Ђd}Њеjблл‹КК:TVVŠЉЊеj•‰žъcccHЅRвUѓГаыѕ� FЏм„4ВЪЩЩйv kЕZLLLрТ… Иrх ’Щ$ЌV+rrrЄцkkk“M9::ŠњњzqŒО™EИиš6EЃQСGЋЊЊ„sЫ|Щ@ pЭ<ѓknLŸЯ‡ћяПFЃQЄЋ„[Шяуњб~„@ �Ће*;ѕ3ЌсXы0а иЊСхсvЛЧсѕzCфŒД,2‚јѓмnЗ€рœ‹“Ё”Щd`Гйd\Цk“P•^ЏЧккe‚‘M§ЪІлmll ІІFš%жh�фЯfNёдтыЇЪ”В ЪsЕZ­F�RЉ”LˆИдj5jjjL&_єz͘ššBnnЎlL2“x:‘?IКндд.\ИАЭ у§иуаа†††фЯЗВ)пП8‘ …B№zНhmmХТТЬf3ŠŠŠ066†d2љf№ћЙcЧŽmV4…пя‡ХbRЉм65x?Ш�/Нє‡дm‡CъNKШЖ!ёуРl8„'ѕбй2RЮ”wаЧ“н8Џ;Ющйig{ќффlљ]њ§~єїї#ЫiHє5йшш(ЦЧЧqша!”••СуёHЗМККeШњ—Ь*–<ЩI�оK5#Й‚шТцц&�ЬfГ№JщZBЅ%krООххeЉХ9:&ЎЎЎ……[ё„‰DsssBр§Ќ@&''EŒзвв‚ЕЕ5x<)GЎЕђџсўA�тK—.Щ`W @ФHРіЌёьХ7ŸM0омм„Эf{=vК”РUЋе‚яБesУ‰*kЈlЂ0З(Џ аЯk”uсъъ*fgg QZZ N'г(‹ХВˆЛЙЙЙmœЧi �yР8"e7K–йд4>\T"r6Э&ƒъG‹Х‚h4Šx<.„ЛxкГ.ЃнŒRЉ„пяЧђђ2†††АВђžaьџеІ Sz_Wmm-zzzЎЛ1ѓrrrО]\\ŒлoП]Каh4 ‹Х‚ЮЮNуЬ™3[gwН-‰HаS]]\н$———УnЗ “W5'4;eKh @›@ъƒ8ІЃA+% ќ7lNђѓѓ‡1;; •J…ЖЖ6™увЈ  �&“ ‘HSSSФЅеjбвв"Џ—Ќs’RИ 9qвB3ZпXЧЅƒg}ZXX(ЦF3ЪЫЫЅqр­АВВ‚`0ˆœœ)]вj0D'Ю) c iиџY.ГйŒКК:ДДДєЖООŽŽŽЄR)\Иp>Ÿo[`.W^]]нЗ_§u9r­­­B.,,DCCšššЩd099)uW Xрk­ккZиl6477 ї‘Fџќ’(§хЉШыœMс›lЅ#AmЮтїТFY[e{C:†нnНM6–Dчd2‰@ €ššqйX^^†нn——ЅoВ•8AagЮЦ‡fcй~LфLццn9Мб~[ЇгЁ  @,uВ!:6elIŒFЃ№љ|(**‚FЃЧццf)˜AјfЅДЗВДZ-jjjайй‰;vШP$NуsŸћœјЌFЃбkТEyГГГпЖлэ(//‡бh” ЩЩ“'бммŒЮЮN„B!єѕѕЩНККŠыО(Зл “Щ—ЫЗл-d቉ ,--! IPбттЂ\W<1WVV0;;‹Зп~[6;uКљxˆ40ђ“Щ$‚С ќ~?–––амм,юЗФ ƒЬЈГgј„šXПхччУjЕЪŸˆ.œW1OqvюФ=й dГ‹8%c$5і$оrЌИДД$щС`PІjБX щtыы[ЉСлЉ/))ЭfћЋе N‡ююnX­ViЖ>ЭЅзыбдд„={і`пО}hkkCnn.&''QRR‚лnЛ ƒƒƒТ }ПX-РЗуё84р“TЫнqЧP(xэЕз„177їЦђћзФФЦЦЦ0<< Злh4ŠЩЩIxН^ЬЯЯЃББQјw@@№Фd2‰щщiєѕѕarrR&9ЋЋЋЈЉЉ‘Іƒ„„lзВ……™ыkЕZ‰eБZ­‚хЉT*С#yёєтuЫ&,Л%С—гRе Бi ›ЭБY–eeeЈЈЈв-dЈьdОЕѕœp†ЏгщЩd0ћ{лCЃб(›žЗнеЋWёЮ;яРсp ЖЖГГГ0hjjB,C&“Й.†јI,­V‹лnЛ ‡Z­hhhРСƒqъд)ј§~|§ы_ЧУ?ŒееUŒŒŒlГщЩ№m`Ћiбh4X[лJ#‹Хb())A{{;ђђђd4АДДtSEѕќќ<fffрїћсёx a4‘JЅ№ж[o •““ƒўў~\ИpAШ БXLFu•••ВБI”%‡2# ЁИИZ­V”–|ГœЪp“[ЭЦљљy˜ЭfqŒЃўˆ|SjЃГЃcШ(Ї:‘в J”Гzє�тцс!//O`/bП<4ov�� �IDAT…I>fƒШY6я‚V0oqq.— .\€ЭfУwо‰D"Ч#ˆ _ЧЬЬЬЧиzО, L&ъыы…MžяK/Н„чŸР]wн…P(„Ы—/ЫП—I‚E&“^ЏG Рњњ:*++Бkз.ј§~ј§~W^ НбЕЖЖ†єііŠѓ-Ѕз#xН^єііb||ЫЫЫаh4PЋе№x<pЙ\ˆЧуАлэp8лШФ”H№K6 ‚+ D"ё”"; Џv6V$р3e=ЩЙoЖIгд(љх4ˆS4–!<ЩЖ!џ”D ЕZ-Œ|z1GœКЃL&#xЄйlFKK Š‹‹блл‹ЭЭM444`qqqСјгКвM&Ьf3КЛЛбдд$пггƒD";vрПўыП№њыЏуРАйl‘ю}Р>::Št:ккZ™юќќч?‡йl–+ЬыѕоR<ЦG­ь‰СG­l#„––A ***рїћЁеjeЃT*%CjJ‚ђ„sјхfз€*•Jš)ж‹”"ЪŒmnnŠо›ѓfЅR)з&ыbад!''G,]ШќI&“ЈЈЈdmm­pH~рь>™L" П`vvƒннн(((ЙОО^n,иl6йŸєт­Ф �œ={'Nœ@AAОєЅ/сћпџ>Юœ9ƒh4*и3зФh.— сpёxHЇгшщщСШШ,‹\IŒ‹ўПXххх˜››)›6 ЄЧБCŸŸ—Ћ€ŒY#VTT@Џз‹€‹з*7 �‘TчИ8eЖFž >;тl#2жй.Ьd§PYH3šVб=ЄЉЉIў­FЃA0�~``�ууушшш4„—ЖЖ6”—— ІH”рfm[nfххm…К=IЇг8~ќ8<zzzPUU…‡~їw‡ЅЅ%ќќч?пжP_S%9::*•Џ|х+BФhmm…УсЦњџеjkkУ<€ЦЦFщb +­ЏЏ‹Ж\ЉTЪиnssSNF­V+В vѓфƒ2˜є8ž”4В%ŠLrnp`ћ�‚ 'e” гЁ„\ОnJeБЌр$Œu™ѓбhЫЫЫBОнГgŸgffапп›Э&8/oŠХХEL|Zkcc+�u}}яОћ.ž{ю9x<$“IDЃQ|џћп�дддрзПў5о|ѓЭmџўКbДттbrхччУэvCЇгсшбЃxђЩ'хЊџЌW]]�H5;;+ƒvюЌщ2™­(ВЬѓђђф=E"љВy R“NvO@ЮœЋЊЊ„N]Ж]! Ы$FSЕHВ4qЯh4*D ВЖшWДЙЙ_M&Ы�nT`‹Ы@ОёёqX,иl6Н5Ё7ЂЄЄD_ёx333ТФџ4Vmm-ъыыБКК••™H$0==-<жЇŸ~*• ­­­˜››ћ@­{нщѕzQ^^ŽЧ{ щtЏПў:ЦЦЦаннНэкњЌWMM .\И€У‡ K%лƒœY@@@ˆФ:^Џ555Тз$-€Ј9зжж„k @Рs65йКsr(i&—‘ќCJ%xЊв 3‹ЁЊЊJўŽу[ђFiaC$ыL^ї4Ј­­…Ых’QхТТЪЫЫсѓљ Q__›Э&v.ДЂЁіžeЭЇЕшРG}C јњ ОїНяСl6_“|,]љћWUUЪЫЫбвв‚ššxН^МћюЛ8|ј0о|ѓMЁЉ}–ЋЋЋKЦ„—.]ТЦЦ†XП№Ы$“<ХьР�ZўˆM ЏгlяHЮМ9yЪОrYтА{&ЌDpž:j2јIRсѕЮnžџž%ЁЂlGfрНк–+№^ќ –гггH$"єЪ–o%ћ=??бhєКГъЛіьй#0А…њЬЬЬўНЙЙ)BОk­ыž˜GХWПњUh4œ:uJDdtж}ПgљЇНHІЕйlXXX€лэFOOІІІ T*Ёзы%ю€ј‘,LЌ0лжšaXМvйиБыЅq­Ш†ЃsкЪЪЪЖ:€\ѓЯ)eЩй›=л•——Є`жФЫЫЫ2DреN`aaƒAЄгЉT ^ЏWFАйl0˜™™Й)$фf—BЁРШШJJJажж&щЎknLrрйgŸХПќЫПрС„лэЦХ‹бввrC‚ЄOr cяоН!Т'К­б-‚Ш=u(ˆЂ™ЏJўџPЃЮ“‹Zт‘d S”F];7�бiN•­B$Б#лHŒвВЂHЄE7YC}ыЄAъ… $НŽК}ŒI*Іdйчѓ‰ 6нn7fffЎЩƒќ$Euеее"ЕfŽбЎk^хuuuјкзО†њњz?~\œlзззqхЪ”—— СїГ\ •вjЕтKФЂ™�=хЖМт™ж@$ЌvВxѕ“œœ­тщJ(‡f йf”gА>ЄL$™LJ-Щ.87w+ц™V:,5XKвŠ†ј(�!\SzђЦoРчѓЩяЃDƒcV�"!Ё}LЖf"‘­8Эn?щЕДД$ZT!b``р†qгœ˜еееxф‘Gpьи1Фb1hЕZДЕЕЁНН—.]ТѓЯ?@ �ЛнŽsчЮ}тoъУVnnЎH<Ьf3ьvЛшt�Ш‡Э8F#ЌŠш(˜уiШ“_EYtлрѕKbюццц6'cNrˆ]ђTX^^†зыbpnюV‚XЖ‡'ЩадиSчM(Šц^љљљG__ŸАНrrrАkз.п’BѓZ,2Sˆ%-`>ЭЋœЎ|йњјїЬ?l}`c*•Jx<ќХ_ќЦЧЧ100€ŽŽ=zЗнvОўѕЏуg?ћ™ЈђnжТјуЌёёq!Я*•JЈеjЙтЈy!ѓ†mIzиии€Щd’ыŽ$ жƒФї8І$ы‰›‰›’уIŽ:ySGYыNжŠ<mГ- Љ№‹$YƒМЮH$"RjкJEљ4l<ЋЊЊ›› ƒС ѕk&“ŒszzњSћžЈ№$I„v”7№Ћ<ТfГСd2amm §§§тSГАА ТxЎыuUŸжR*•‚E’§Э“ˆ3nB3dЕЬЯЯУуёiСfГРƘfжšœФАљ!Q—х@2™љOЭlkТMйВažЖ„hHРШ=ря! pн‹Ф}~~ѕѕѕЈЉЉ‘Сеj— RъЭb6›QUU%>E“““шээ•Žљ“^ …>њЈ”4%%%"OЮж}иКf966†БББm,uЏ6›Mд„vЛ~ПџSЅOeЏУ‡ЃЙЙY˜рБXL­V+„ 3xѕъU!V,..ЂККњX,AlŽ)"#k‡v'Ќе8-b РZ”Еlў&7;=–иMsJ”}Uгиђ)Ѕkлдд”ј?ё5qДЪк€XВЯЭЭEd(ТЙsчpњєщOѕ@QЉT8vь˜h‘Hžv:7\>\ЧМVko2™P^^‡У!ьЃœœœOѕZШ^еее˜ŸŸ—HИввRс.ІR)!XPЩ:/cчЮаjЕp:лєьLTуЉЦј”L&# Ofц[fлEГч•L0œАуйDВаЙЉ‡‡‡бгг#Џ‹‰jTklhhIЦкк€МжИ<].—\ŸщtsssxчwаггѓБ˜a7В…`>11ГйŒŽŽЌ­­!‹СяїфЯИюЦМжђћ§ащtАйl"%еыѕ"бќДзммœЄHаД‹Юм<###‚g2TWWЃОО^  ‚‚­lEŠпhЂР+˜ЖˆT6f;oЋЩцŠюqќПl–ВѕфTOR‹Уџ–Щd‹Х000€мм\hЕZдееAЉTТэvcaaGЌh, ,‹Ая9ђ 2x‡УшыыУщгЇqтФ ЬЮЮ"KSFЇOsщѕz466JVањњ:ьv;vюмљохѕжMmL`‹ЦдккŠццfй�щtњ3Ћ5iщBˆ%{=11™™477Ыu­VЋ%Ў#•JСd2ЩFс)У) bБ˜œŽФ$пЏ?ЂŒ—ѓiЪ$шњFxŸаЫГ^Кt CCCТЮ_]]Хшш(ЮŸ?ЕZ-Т=&ЅhЯ. Вбˆ3gЮрЭ7пФШШ’Щ$М^ЏдЇ‹‹‹*‰љЄ–NЇУО}ћD FqѕъU8TVVТхr}$ltнЩЯѕ›‹#GŽ`xx@�uuu˜žžОЁ#њу.NwŠ‹‹сt:ХC­VCЉTТbБˆ†‡Е0ЅНœЃГ)р" ˆѓяЉЉ)йФ;wюІИJЅZYш4ВтF'*Рњ‘6нДF$иЭјо4јU*М^/rssa4aЕZХc=л}ffF`!жЁ<еГЫ0‹Х‚ццfy >‹ЕЙЙ ‡У!ъеЋWёќѓЯ€H\>jнє‰IFћў§ћa0022"ьšЯтдdH(йѕ™Ь–_89‘4]ЭіЛф† K‚жйз0Э њњњрѓљфljjYC6СƒeZ­VdЗйS"КdPЬ“7''ЩdсpX Уј{.]К$VT7ђ=Б–%ЛЖЖЃб(АЕ1fffPUU…§ћїo›япQ&“С<€šš ДЕЕ‰бMl?Њ;Пщ377mmm��‡У!\HЃбxkят&WЖlИЕЕUBшдЫщ ™=ЌiиЌбAWЉTBЇг‰“Z^^fŸ‚бмм,P0[?КЋ‘%”ŸŸF#r]т›œНТЂ1ыOŽ'''хЕаOвхrIIХ(§нЉ!'g“яqmmMќ@еj5ЦЧЧсp8„&855ЕЭ"цг\Мy:;;сrЙ`4ёgіgјїџw)o>jнєЦФ“O>‰––Л]НzuuuиПџMљ'~мEй‰'„yC)7­BЁ€пяG~~><0kш-„ДAЙ-U‘ЙЙɘ™™СккьvЛ” й–а$oPыž1D)‚їЌ‡еjЕЄ˜щѕz™ќx<qГZ­pЛн№ћ§вY:!ЃССA!špжЯiPEEЊЋЋ‘JЅ`ЗлХКћг^ДЎ&B@цљдв[(KII‰ йPвMmЬююn�Р=їмƒK—.СщtЂЋЋK Ъ>Ћu-•_YY™Ш4 ,  …ИіЊT*ЈT*джжB­V#‘HРэvK:=49 ЂДИИИЕЕЕr*“0СiK рНŽ\ЋеbccC x­ЏЏczzZ&;Ь9/))зыE,C}}=ДZ­фa"cУЃбhфZцkЁљ‘Ће*ЋBЁИ)7ŽcЧŽс•W^ЙЅя…ѓx��NЇE­щёxPSSƒC‡‰5ЁУсРo~ѓœ>}РMlЬЎЎ.8ёЧIЅRЈ­­E2™„ЩdB(‚ЩdКЅ7ђI-Гй N‡ццf”””Ш’Е gэ*•JВК3™ŒZeiŸŸ/Йхє[Ђї{іX“"Жl/Qb „žјрF"$ Љo‰ТbБXNz_vўИ^Џ‡ЯчУЉSЇ„Ю—˜БЖЖ&ІЌkkk˜˜˜@ €ЧуA:†Z­Fyy9ъъъЄёт<ŸЦЊХХХЈЎЎЦч?џyќіЗПНщя!77>ŸOмVццц‹Х бhажж†x<.ZaaЁ &йE7М1 W—››‹КК:ДЖЖbii чЮУццІtшŸѕ2™LhjjBkk+Ž9"Y6м(№љ|’NЫ98“ШшзžM6`cEї^^ЧЬссѕMm8%Б .,,јNэаЦЦмn7bБ*++a0�@цкДamIФ€aУУУШЫЫC}}=2™ ЂбЈ™щ@B;њѓЯЛvэBwwЗАоM&&''‘Щd`БX`6›qіьYмyчТfК•хёxаппз^{ �dP№иcсWПњ №Эo~"-&‚ТuУ]ЙнnG{{Лђђђp№рA8фхх!HцЫЇЉ%ЙоъъъBgg'ŒFЃœ”tmЫЫЫCgg'ђђђЄуоsг О›ІЌLТ cƒЃ.J…%OYZГІЄW%у˜Гѕсyyy’ *=й˜Q{NСY €зыE__оyч cppPЄТ6›M”ёxrUvttHщЧбжжЛнŽЭЭMA&FGGqј№a;vLШЯє+ЭЫЫЛЅ.ОЎЎNœK4 VVVpќјqДЕЕсаЁC8x№ –––0>>.‘УУУxћэЗхg칉щїћ…”PXXЃбˆ]ЛvиВ,мБc.^МИЭ�ўГZЭЭЭвXPЎ-ъЇM cшRЉ&&&кЩБkjj„_i0„л‰DрїћQYYЙ-Ж…W&7 �Ё˜ЗHџtbŽє7bЪAx‹Х"^ѕЌ5­†ѓ§щЖƒƒƒФž={$Ѓ}ff333ащtтMГЎ`0ˆK—. ƒ‚“3кy+ œ9s?ќ0Nœ8qKHИ\.x<A*Ў\Й‚P(„ЂЂ"ё)эяяпі3nxc@Злэ’АХUXXˆІІ&X­VIV§Ќ%Ћ„^ъыыЗ Ы‰фt:ЅЖЂ$Ћ@fsд—mэBш€XгЌЎЎ"CЅR!‘HНŽТ/„йс+ ЄR)$“Iффф ЙЙY›”еђчˆtllL6eCCƒlКH$‚ббQ8NИ\.‚ьv;Аoп>y766Аwя^Ё fгѓP‡бйй …B––сЉоШъююЦвв’Pѓ˜}yяНїbjj .— бh?јСp№рAЙ<ДZ-М^япnЊ+яыыУЦЦіэл‡Ч\и5�„PќЬ3ЯмЬќи‹ЕЏЩdТљѓчЁRЉаоо.onюV€}пyч$ I›`Ч‰ ™ю$љ’ OMњТТ‚8YPoЮ‡ mй%гS“Œ ййY˜ЭfёRтмœцЎЗхцц nлннŽŽмvлmXXXРмм ƒHy™MЎVЋЅо­ЌЌDqq1‰l6›и в4иškkЕZДЗЗCЅRс№сУ�€7оxу†ЄmmmиП?ЂбЈм*KKKp8аыѕRЛ"‰```@є666аппуьз[чЯŸ—“’Юit.лммDMMЭMБ”?‰E}IYYrssёт‹/ЂИИ‹EF‡dnЯЭЭappPžЮЋWЏbЧŽhllD^^‰rrrааа „ nЮ––„B!Фb1ёБdо’ЌЋшДДД$П›ђ цъ№DŠD"аыѕbЖH$D<88ˆХХEиэvДЕЕсОћюУ‘#Gрёx …рёx№юЛя"‰ˆЉЋRЉ„Ус€Ус€С`в2ЭОјАzН^фччЃГГSlТГЕшfГљCSаT*t:рЧЉT ƒAfГ—/_Fww7BЁцччqсТьпП_&`ЁPGŽС[oН%?їІі™™”””`ddххх2&Бт§o№г^4Ћ*))Agg'цччёєгOуілoGKK‹\гNЇ'NœРцц&:;;бзз‡p8ŒЗоzKˆ!ЉT ЭЭЭ2ŠХbГДД„@ aФ<љс’ЩDќ“ЃPzEЃQљя,3И9xеЏЏЏУыѕJкЏpЅR‰ЖЖ6ќСќVVVрёxP]]‚‚єїїKƒЦ˜iз”›L&LOO‹Ы2­srr`2™ŸŸЏз‹њњz�[S"† |дAC{F#Ёеj•8ёииОѓя ММ/М№‚ИбЉT*ьпПџ?їІw‘гщХbAcc#<Юž=+3ыЛіьй�И|љ2Z[[Џы^l4kЄєЁ­­ ЉT gЯžХрр xpЎЏЏЃББ<№�JJJP^^.]р™3gАoп>Ic#Ц@ˆДГŽЧуИуŽ;DЮ@ЛmvК”фfKkiе @‚ hыHХ'%ЌyЃб(JKKБkз.ьмЙїмsдя…B())СНїо Ч#‘‰cccX\\„ЭfC(B*•‚гщ”ВƒŸЄї-..ТэvЫІt:xюЙчDўќQўFѓѓѓшяя„СfГAЇгI}Z__ЖЖ6ЩтќЫПќKБЏill”ККЌЌ эээRЇ^гЛшЃЃ№8c:йЪg:t>ј :::Аwя^1эзjЕиЕk*++QWW‡ююnфххсьйГxћэЗБИИЋеŠііvьлЗеееBrШЩЩAgg':;;бннЦЦF”––Ъ@€ѓvf10‹8!эЊI’HЅRТЕЬ&SЉШыœЦмиkkkВ!YЊT*ЄR)D"1БЅ5cww78€мм\ќЯџќž{ю9AEHŽвѕЯЬЬШTˆѓј`0ˆH$ВЭqNЁP`jjJЦІhoo�qTN&“иН{7ДZэGюК{,//K@+ (NЇSSSEnn.žxт джжТэvЃНН]ŒбВнAnš]l)yъДДДcš ђЧ1eш=k!ЪД;ЉЌЌ„бh„ЩdŸяввR™3фццТd2aЧŽ2х!n4бааАiS[[+fЌL`‚0йCЋЋЋтїS]]-мJ’”y…sS’wIз8J<&''ЗmЎЭЭMƒA,..Jк/SЪЊЋЋЁбhpўќyЬЯЯуР˜ŸŸ—0Ї эxг|7ŠvОББ:NІ2С`P %~VР–Q % ˜§}@W6ЙИББQ"hZZZ055ЕZh4Š;яМсp---Ј­­ХѓЯ?'N`aa“““hjjТ`4155…ЎЎ.5& i–nЙ ф %y ЛЛ‹‹‹›ЖPUU%мIвТ\.ЌVЋœtЋЋЋ˜››Ь 9f}зееIЇЊVЋрѓљ№ілoЃЉЉiл3>>.ЇЧ“TЊеjСDЩфgЗNO!FЗPэШЋЈРТТ‚€№сpxЫž€|YY  еj…ц6>>ŽббQ|ы[пBUU|>ŸјЕ aЦoll DFQJ<шЇЉRЉааа�ЃбЧƒ……Љ'|№AЌЌЌ`zzZ4P�Аwя^фццтўш№лпўV6F:эщѕz1cУМИИˆoћлhiiAWW—4n>њ(вщє6,ѓšГГГs›‰(пьћх999ащtbќўвK/},ОŸеjХэЗпЃбˆЦЦFиl6М№Т ШЫЫƒйlЁW}}=тё8jkkсѓљ`2™фъЅМ ЂЂ;vь@EE†‡‡ЁP(‹ХрvЛ…дБДД„;яМ‹чЯŸЧюнЛS+**BII fffD}ЩќЩОО>шt:ёЅЋG&“‘<qBOйѓwZ$ЊеjЙqVWWсёxdу0н#™LŠ1еььЌ\дiГЉS(Ј§}fN^^ъъъPTT—Ы%AЕ/ієє ‰`eefГ<ђТс0žzъ)дееaїюнђ]аtЬ`0ШgiЕZбжжFƒћюЛГГГH&“шъъBOOvэк%#`jјiАЫхvЛqсТ477cџў§ащt(++Cccу‡ЯЪїьйƒћяП%%%Алэт 000€`0Џз‹™™9zCЁ***PWW'јн­.ЕZ]ЛvсЫ_ў2ёвK/ЁЗЗWє:ЫЫЫЈЌЌ”џљ|>:ˆ1’”QTT$Їc]]†‡‡сѕzЁеjaБXрѓљ0::Š`eeMMMa}цЬ 3‡ЉЌЇVVVрѓљD*@7\B6ќ Hю !Ћпя‡FЃAYY™œP$0s#3жХjЕbii O=ѕ&''бвв"X+Gžsss2qšŸŸЧммœ|бiŽŒŒ ЊЊJђ…Š‹‹aГй№х/�Є1zП/Oe–,‹‹‹PЉT˜ŸŸЧааЄвбХ™S7ТdЋЋЋ’њ–ЭH&“јх/‰ЛяО{їю•П/**к8ёйммŒH$‚ЙЙ9i§ЛЛЛЁP(pтФ $ ДЗЗ# сРxшЁ‡ФS=CЃб|`|vЃЫh4т№сУЈЊЊТРР€xяЬЯЯЃЁЁAъ8`ЋŒFЃ2 >rфЮž= •J…`0Їг ЕZ Џз+_ЂRЉФНїо‹ЂЂ"ЬЭЭСщtb``@lЏ“ЩЄјЛŒ‰œY–œ ЭЮЮЂНН]j8цbrьHђ2ЏЕёёq‘X#.//УчѓAЃб •JЁЄЄDBэ�^|ёEј|>twwЃОО^ЎZцЂЧуqŒCЅRЩЈєwПћ*++Хэ8•JallLвхвщ4ОєЅ/Щg^VV†нЛwo%гƒЪЂiГXXX(7 щlЕЕЕ"ЮcpсТ…|Я'OžФПўыПт?јќнёуЧ?ќФL$Ђ™…лэућ––h4LOOУl6# стХ‹X__Ч›oО)t­[]:555�€;wbzzWЏ^“ђ"].—Oљe˜ЎЉЉA,C0ё&“AMMШxB^ИpƒƒƒPЉThjj- IЛ/В‹І7хњњК€Х ШіВ,--ХђђВЎ=$�� �IDATPыИy].—ИЮХb1"•JI [:– ЭёуЧ1<<,s|šАвТі<д OLLрмЙs())‘dКММ<9хTpша!IЋЖ†лnЛMў<::Š'NlkАШ­ЊЊ‚С`@,“IO<—ž§'F§§§Лцw}ќјq|їЛп…С`€зыХёуЧЗ§їtхЕЕЕhnn–WЃбˆ*/•JЁММEEEшээХхЫ—133ƒТТBєііJjк­Pјѕz=~јaЩњБZ­"ФъшшРњњ:"‘<\Ћt№u8лвПЦЧЧЅQaьАЭfCmm­@7Ќ›§~?fffDт@ч5В“(�ГйlТѓїWWW‹u57'7&uуЌе}>цццФ^Ће ЯznccCNыз^{ ЕЕЕ0™LbуЧњš‰VЋUš'fuwwcзЎ]иии€NЇУєє4._ОŒšš<ўјушшшиіЙћ|>TWW Tѓя|SSSP(ЈЌЌO‹Х“Щ„ббQHƒAqЉЊЊ‚ЭfC4…еjХ=їм#Б|зšбйxeeННН№СњРЦЬЯЯЧБcЧ VЋёъЋЏbvvsss2wЮЩЩA[[›g•J%ž~њitttмВ…2“М^/œN':„‚‚  7чУt2у5Лkз.$ xН^DЃQ( ёZ\\VwMM ŒFЃp6™аЕОО.аTaa!\.—РCэээ˜˜˜ŸIFљбфŸђ]њБfЄў%™LbrrRF“ …ƒХХХ’ЯC о… рvЛБkз.ДДДРjЕJ&<ЭВ …A�oП§6цццP__ЃбˆКК:<xkkkИяОћ№ЧќЧ"yШ^nЗ[Ш-Рж5ЮR€5oyyЙ$Sъ<44­V+ŽгЬ]чMАwя^ сфЩ“зѕ№ћ§шыыˆhл>|џ_ЬЮЮТчѓСnЗУbБРяїУh4Тh4 Sšпј‡ˆоо^єііЂЊЊ ѓѓѓЗ,Ѕ›d.—Ы…њњzбŠЯЯЯc||ƒѓѓѓИxё"‡‘JЅP]]-зŠЭfC&“нn‡^Џ—ŽвэvУbБ ИИѕѕѕXZZТЉSЇpтФ ЬЭЭЁНН­­­Алэp:ЈЈЈРхЫ—сvЛЁбhФ[hddDєAД5$н‹:"6‡<—––с`GЙ:N~ŽFЃAgg'ќqФb1„B!1n]XXл„RфЯ}юsјЗћ7�I�9rdї§ЫэvЃППzН‡ѓ7ƒ`0ˆџјЧ"^]]ХŽ;pъд)q!V(јЦ7ОлoП“““B!,**Buu5VWW…Iu+ы'&-љьvћ6maaЁ<I>Ÿ<ђ pђфIЉсHt­ЌЌМigъŸЩмцhёЩ'Ÿ”|№ђђrtuu‰!ЋС`@0D*•B8†пяG @(’ŸУ“•љцLЫЅЗ%чш4Sхѕm2™ гщ‡Хћ‡W3ikŒqЎЈЈ€Щd’ђ€2bF#рњтт"FGG…Д‹ХфъЇO'чєЇOŸЦнwпЧ{ {іь‘зCЉЦТТвщ4œNЇ0–ЌVЋLВоxу ЄгiŒŒŒШIxН544$†`DaX#Ђ  �.—KђиЫЫЫ‘NЇёџјвU CŠВb•J…ЋWЏо’4ИЮф'ЃКК=єŽ9‚ЭЭM455Ё  �WЎ\Сў§ћЧЅАЕZ­ЈЈЈ@ssГ№щё}ЃЋЅЅmmmˆХbP*•Ч•+W$K’9мvЛннн0™LшшшƒБбсpfГY|4KJJNЇБsчNвyš.//ЃЕЕХХХˆFЃАлэbўZTT$.ФЁPH&<œЇR)ёВX,аjЕт%Фы€4#Ьд$N@žD ўœББ1ј|>ьйГmmm"PлммD$‘:?cdd‡Bcc#ZZZ��џљŸџ)зЉ^ЏщЦЕжЦЦЖй_ћ§~TWWcss/М№‚јНsЌлдд„П§лП•‡ тђхЫТŸˆD"2ЙМeеь5іX,†K—. 4>>ŽййYМікkRя\Нzuлtll‚УFЃёxќ†u#дeSЅЈT*qётETTT ЕЕБX oОљ&юКы.фццТсp ИИVЋ/Пќ2мn7ЌVЋ  eŠ›пяђmbvьи!ѓхx�—/_†NЇ“ДЎь‰§fggQ\\,žeG2™мVcfgHвt0жoLЪаjЕаjЕpЙ\ђХvvv !˜7�Џ{ПпЙЙ9<ёФЈЉЉСџўяџТщtbzzjЕ_ўђ—1==-›rrrђša?њб„mеммŒССA9lx-{<,//ЃННїмsЯ~Ц3Я<#%œС`T�+#§КГrjR№Ь3Яр7Пљ <ˆЦЦFLMMсєщгHЅRb}mБXdFэ0эYnфRl ТЪЫЫсїћбккŠD"…… WНуŽ;рt:БИИЕZŽŽьлЗЭЭЭАйlТyЄ‰гщ”„4т„2‘™œœ„RЉФПјEЄR)ЬЭЭ‰і‡з“Ых’Ž}}}]t?œOг�€\чЌЛЈєћ§˜žž†BЁ€VЋ^Ібh„FЃ^Џ‡^Џ+Т’’Щт˜ŸщНїо ›Э†я~їЛшяя‡йlЦЋЏОŠўчАЅФЦќЧрмЙsшыыУСƒхѓ>yђ$†††d8С0bii zНчЮƒгщDee%zш!иэіmпйјCј§~”••ЩСтїћбооŽІІ&МђЪ+škџaыCйEЇOŸЦЅK—№o|>ј jjjамм, `Ы=ЖЋЋ v‰NЇСnЗЃГГѓ#_�‡PДОѕ­oЁЋЋKtоѕѕѕ2EаыѕxњщЇqъд))А9њbжЗBЁ€УсРЮ;%œояї aжщtТщt $TYY‰ћяПGMLuu5t:ЊЊЊL&БВВВMI)ъТТ‚LО8!bcEІІІ$ЗЭъъ*t:Œ,FЃ(IЃЃеMAAvюм‰={іРэvупјžyцD"ќќч?пЖqNœ8'Ÿ|/М№‚ШЋy@D"<ѕдSВ)N'FGGсrЙ„8Ќзыбйй)~›й™�№ƒќ@фОDшe2™`0> —И™ѕЁьЂP(FƒююnЌ­­I ќааL˜a4ЁеjaЕZeЃ@KAв‡-•J…Шѕ–L&ёјуcii ?љЩO›› ‹Х"щxўљч‰DфФ€K—.СхrauuUКоЯўѓ‰WTT$Екаа4R‰DBVWWeъCOJКrџIŸJ> JЅRвXPяуvЛE‹Яf…6и%%%АX,лL‘шBEEіэл‡ЁЁ!ќјЧ?ЦOњSAL|>тё8*++БЖЖ†_ўђ—јщO Џз‹ццfI‡‹D"ЈЏЏЧ[oН…ѓчЯЃЌЌ S.B>ЭЭЭђzеее%pгГЯ>‹Зп~[ђ„јФуqD"ќљŸџ9оzы-ќњзПўфКђїЏx<ŽУ‡CЋеbeee›У™BЁРћt:/|с ˆХb˜ŸŸG8–ЬNџУЎtГйŒццf ЦбЃGХ…іР0 0 xы­ЗАoп>8NЙŽˆA СщtJPы§їпІІ&ькЕ ЧG~~>ŒF#\.—�П>ŸOˆМЬ…BrM ЖЖVоYћ�D^СT_њQЬЯ‡„&lЁ€<PфyушбЃВљ 1<< Н^ЎЎ.œ={?ќс1>>.ОIЈЋЋCAAіяпp8ŒџјџDИњњzёuЪЩЩСддJKKQSSƒЉЉ)Фуqфцц" с№сУиП?&''a4QYY)шAYYjjj№ж[oЁЗЗWюUUU…B0ˆD"(**Тc=†чž{/Ојт-mJрhoNЇПјХ/№ЙЯ}NКйљљyœ?Z­]]]Б’™˜˜Iuжшшш@$СЩ“'З§Ž––ьнЛJЅRHЏР–p~||………0™L?ђd2‰/~ё‹иН{ЗАЗШ“ОИИ‡У!Б$�pџ§їcqqсpX4B жJ$HЇгаjЕPЋеRЏR^`0Аwя^МњъЋв№d“jЃб(ЪЫЫ… ЖВВ"Ђ7ТKbІAЊмъъ*�іяпT*…W^yEHШ?ћйЯ№Цo  J„JCCZZZ баа ШDGG‡4yt&Б# ЂББЗп~;"‘ˆ•‡††№WѕW(..ЦoМ!Oьv;N:…_|Qр3j˜ј}Йнnм}їн�ЖnЎГnˆљЮ;я|Єзы‘Щdайй‰3gЮˆћѕз_Чwо)c2ž@љыt:ьиБуууШЭЭнІYІЅ эѕЙGђхІУУУhkkУЃ>*nРй=А5R˜˜@&“СО№…m”Ћp8Œ@ €G}ыыы˜Х•+WЄЙЁЌ! s>‹€NЇƒС`Рфф$Š‹‹EїSXXˆx<.>яœ%3ЅТыѕТхrI„J<#r2ЭfГы�рнwпХ№№0FFFpљђeЄгi477cяоНШd2Ј­­щm&“A8Цwм ЈеjджжЂЏЏvЛ‡ТввЌVЋŒhяЛя>tww# КК@�/^ФхЫ—‹Х055%C z@§іЗПћnђш<ТѓюЛя†Ыхњи2юbАsœІVЋЁзы…юФy0IЇOŸЦwмВВ2ИнnqР ЇAaa!М^/666 зыaГйФF€H�˜ѓm2™$‚ŽnК?ў8ДZэ„RgЮœA(’BџЎЛю�ќтП@nn.ž|ђIЉW™eNа=™L TЕkз. QїЙнn!j,-- ЦюfrЂsўЮ)SЫbБЪЪЪPVV†ъъjq# @‘_(’ЬLЋе ƒС�ГйŒ={іШiX^^Џз‹ееU444@Ѓбˆ”"•JсРЈЎЎА™ЅгiTVVb}}Фшш(жззёз§з№x<8wюvяо–– ЁЗЗƒ---ФккšH›ЋЊЊ‰DDW�ђ'‚—_~Пќх/?§ @Hа­ЉлэFkkЋЈ<•J…žžљЂШ‚&CˆЙ/ь<iЉG>nЅR‰Gyнннƒy:PdЏЭЭM<ћьГТ•Э}тФ D"иl6МњъЋРХ‹qщв%9}шРAD!`Яž="эeаUqqБl2’7X;виŸз_EE…€шФ#љ)rышш€йlЦмм vюм)ŒSЇNстХ‹тЭЎVЋqчwЪ­EYЦЫ/П —Ы…o~ѓ›(**—‹ЂЂ"|ё‹_Фаннp8,ЬйГgQ[[+^N­­­xу7pюм9|х+_ЭfУ‹/ОˆT*…ЎЎ.8NпЙнnaIб!иуёршбЃhllФwОѓЩPџд7&�‰)QЋеЈЉЉССƒe4™NЇ ЁRЉPWW‡3gЮ`eeEЌѓВOAnдD"––‰ &~IbъЪЪ Ž;`ЋЩ0иииcІццfymO<ёЮŸ?‚‚q Q*•rUўѓŸGEEzzz0>>.i###˜œœD"‘€BЁ€^ЏЧќќМ䘊T zНыыыFUU•8WpЧ…КЦА*�"/X^^Цтт"‚Ср6iЏХbFЃЪЙ БX ЏМђ &''122"њ#ваH aгђц›o" ЂВВWЏ^Хцц&|>юКы.мvлmX]]Хддzzz}X\\ФхЫ—166&fЕМљіэ뇂‚?~›››АZ­”:ybbBМGщbЧёХ/~jЕ_§ъWЗеіЗВnZѓ3==я}я{в›L&(•JёяяяG{{ЛШ’Щ$”J%ђђђфЊЂЇ Н,+** гщф Ѓ6“ЩˆtТl6уЉЇžЏŸ—_~?ќАМ.ZmЧуqљ№_|ёEЂГГS4оЛvэТввЪЪЪPZZŠссa‰@W*•јкзО&„•?§г?ш) -‰HЌэy‚ађ…qДˆс B'­ щя …Щd№“ŸќЅЅЅ№zНr#e2)5Ю;‡ММ<hЕZlnnТэvcrr­­­ШЩЩA4ХsЯ='№^,ВŒRЉ”!Цќќ<ž|ђIс‰'žРъъ*._О Ч#њ+bЉUUUЈЊЊBII PSSƒщщi1™xэЕз>‘ДМ[RI[FZ—/_ЦЩ“'бзз‡љљy ЫISVV†ЙЙ9с'ВXІzасpH=™щdŠc"CSS.]К„‹/ŠUJ]]ЦЦЦфдьээEccЃt‹ћїяG0„VЋž&�œ;wJЅR’пrrr„y=::*уЬввR455 9euuCCCˆЧуАX,X[[Ѓ(&Œ•——‹Ц…Е"›Дœœј§~‹h|ЧE‡Эї‰DFqўќy�@)ƒС€ііvфццтъеЋ"з Žˆє1N‡ђђrЬЭЭ!•JIIAчb†аљ˜2‡УC‡Сщt §А  �FЃQ 3ЦQ—””vыvЛqша!477уџ§ПџїБ;rрcЈ$ГW8ож ”——cяоНr‚ё  H‰2кœœ\НzUX6йз|61ƒd‹‘‘455ЩмївЅK8wюъъъpьи1МњъЋАZ­8pр€hx<Ьf3rrr088(ъIвсДZ-BЁ’Щ$>ŒѕѕuLMMсьйГИуŽ;рrЙpхЪTUUIЦфћЏ)Ъu+**ЄqЁF†2Tp’!ФŒsц­777ЃАА~П+++0 bw=99‰ММ<Fєїї ƒЇ  @Jњ&энЛfГYђ6 E&a6›р­BзуH$"Žб===(**‘G­lтЬfГќѕэFЃQJˆObнђ‰yНEтУ‘#GPXXˆўў~с"rУбХЃЁЁщtZОжr(++“Ї’3ћЦЦF(•JI>`іњыЏУсpрёЧЧбЃGбдд$рўйГgЧбббН^гЇO#уШ‘#� Ї'НЯЩ х˜1 !‹9жккšј€r’“L&QVV†††дддHŠOЈММ<Фb1d2IгЭЯЯЧвв’:шVœэаFЎшммЊЊЊ бh$21‹I# зззбкк*бв”’ДТ8l’O‰„SnЛэ6м}їн8sц %ЋККZTЅJЅR|уЉ§ЩЯЯG"‘Рнwпt:gŸ}і–5_йып˜<!ыъъPVV†ёёqЙ2Вmќбии…Bщщiq`0йк999˜œœ„еj…BЁРйГgQVV&t|nЏз+ТЕВВ2єїїЃЗЗ>ŸO інn7z{{сѕzЎ1™LBя_XXРЮ;%Шэv#УfГ ‰b}}ѓѓѓLX OНЪЪJ‰dl™іє^_\\Ј…JФьXgъЮWVV0;;+]|^^žЬчгщ4 …ДvwwЃЖЖ™LF4эtyc9ГММ,яŸsљћяПkkkx§ѕз‘NЇ›,--ГYNюjkk‘NЇQZZ*ќ�/М№Т5щ7Л>ё @рNŸЯ‡h4*A—Є‚БNQЉT˜™™їоD"!ѓтX,†ššЙІš››ёюЛятФ‰bHSNOOЃПП}}}hгzz||\8‡EEEАX,Ђт&хяхЦйН{7ЬfГШfуёИhгГЩС—ЊT*‘^p3гЉCЁPРуё ЫUШ ™ЩdBII‰hзyjѓЊЎЈЈ@*•‚RЉDUUЊЋЋaЕZqџ§їУ`0РfГaпО}X\\ФЦЦќ~?–——a4E"QZZŠh4*$™љљyxН^ьйГ---8wю|>ŸИ0‡Уa‘сz<ЬЯЯ‹ЬввЊЊЊdГ;v щtnЗ[jлГnЩЛшFжщгЇPVV&ЄКaPш?99)№R,ƒTЮgЩ|Y[[УЅK—рёxL&Ѕр/++УнwплoП}›eK:FUU•ф+ ЦЫьь,о}ї]єііЪ&˜œœ€ОЁЁmmmrUгМ•зєЮ4™Lqщt:Бz!^Iх)Џv[Бйa0�ט^ЏW:рЪЪJмyчp8АлэЈ­­Њ'K###08x№ \щєэЄнсЦЦ†tЫё9N”——уиБcХеЋWeJGŠ`0DOO˜мj4qqcРU’dc}V”ŸкЦœ˜˜РммœШO—––ъaТ {ъ”)ЭN.KЅRђєпџ§пSЦг­ЈЈH`­V+'нзшЁi2™анн-yс„gh1MяKЕZ-žѓJЅRRЭ*++Хє€ђЮчЩюсУ‘­.%G•МХH$"1{ф@ ”––bhhHNЎЎЎ.™шTWWУbБ6мммŒЉЉ)ј|>ДЗЗ‹ЖŸІgLŽЃўgmmM ЂХХE,,,раЁC№љ|м•ё+zН^NLЛнŽъъj љЬЈ7?tш€-Єfіїўїw}*W9зтт"іэл‡ееUб———БЖЖ›Э†••ёvŸ˜˜€^Џy0ЭђйНЦb1ŒŽŽBЇг NнЫђђВH†щіЫ‰івмp>ј КЛЛQRR‡У!ŽуууbэЧQЈеjšœBЁ{A*EЉз)..FEEl64ИгЃˆѕ#Ї5М hіJ„€W~ii)іьйГйМMzЁRЉ„цG7ЦFЃQЩЉЄќиl6‹ллъъ**++Ѕ.uЙ\иБc>Œўў~Ў–——Q^^Žh4Š;w йnЗУfГЁЁЁWЎ\СЦЦ†pTwяоЪЪJшt:œ<yЏПўњЧо;ŸЊЫj&“A0ФоН{qётE1] ф€x<ŽЉЉ)‘СRсWRR"lAAˆБ&&ўo_мvyОћX‹7йВ%Y–,я›,яиNRHœАГ–4ЖТ†вaJh™N;lНщДгN™m‡щ]ІeКC aI $1„ФNт-ё[Жd[–,o’-K–тх\ј<я‘ГАќџЧМW IlщЇOяї.ЯrId™ypy5ЋЩŒСY@ЇгI#Ђзы!Nї3ю”KJJDb†ъstу …B(++УЅK—000�ƒС€ЉЉ)X,qЯћ$''Kѓ#u5EXO ’••“Щ$6/oНѕ–ш8qBžУРР�L&“h,yН^шёR2'66V(єRЋеиЙs'fgg——'„2. ђђђааа Z[Жl("œ066†ЂЂ"шtКџ":жэ*VqŽ.— eee0DrrВ ЛЭf3Оѕ­oЁИИXvдМТљ YЇQ€;k<ЪKOLLУc)ŽCHJSЋешююFGG‡ БЉGIp,5ЩУсА\ЯычHЁP`vvEEE2›LIIЉifЬP(Д†cЯкnєсЄbu7Фа ++ @@М+щџЭlъrЙdDGШ^(Тќќ<\.з[kЮ wKHH€нn—g … еjqљђeшt:”””Ш„Счѓ!66Vд8јyЉеъ5є‰џmг#ЯъџЫOЙNLMM‰hSyyЙа€Y4SџчG?њ Dщ‚ФzbU*•P( Ш­МЊH!&"<..Nъ"ђjˆђa§'цє}}}˜…бhЮJЅ’2CЃбРfГayyYяє>чf$ˆтY4ё XEыЧХХ m–џvvV�ИNЇ~ј!FGG‘——'>Œiii‚ёЄ0W||М”0УУУRвœŠc&ђ’–——aЕZбйй Їг)4mоB*•J †ф@E›’ћшЪіёЧУяї.eј‹ФКL�т=sїнw‹7"Ь~T,усQЉT0™LЂƒ9??›Э†’’X,„B! bll cccтeC]jІSoˆ˜L­V Пп/КDtDЃИUU• ђщЯШЮ€4=„”­ЌЌ@ЇгСl6 №899Y2!їл$ЅY,шѕzЙіеЦ‰{hЎ;†з_]lVоџ}ј|>дззKНШЕbnn.ВГГх‹Lгаp8,У„„yM—.]’…ЭИˆŽт|“зЙЯчУћяПЎЎЎ5 M?FGGЁеjсѕzБ{їn�&Ј^Џ—†шыкќ�ЋМЁœœ455сЭ7пз1ЮжBЁЊЊЊ000€‹/Ўq‰ _& тпј†шєPX_­V Ш€BN,ољсp>JыfГй,u їХЙЙЙhllФ< ]7�Щ~ьЪЭfГRr…шgБX еj%ƒr 4>>.й‘$ИииX“;EЕЧƒььlЬЮЮТсp ПП)AŸЙ��IDATvЛxшЁ‡““ƒ––иэvьиБѕѕѕ№x<вqsjAВгh›чp8PPP€ў№‡ƒшьь”:tyyЁPHжЇЫЫЫ8wюfggБiг&dff�ўќч?#‰ ''111(++ƒFЃСЃ> ЅR)NПT=љŸФКgL�brYXX(6vД6nkkАКo&BЅЛЛ[6/­­­X\\„Щdр{яНW†с~јЁЌ ШuЫК‰4%%ууу№љ|ШШШ@^^L&233QSSƒoМQ2WRR’ №333‘šš*_&�BџЮœTвещtВ-1 b˜РZЋIО^z ŽЖММŒЊЊ*455с†n€JЅ4з˜Dј„Уa@Ѓ +KЮŽƒС †††PUU…‡~�D$Ђ\"АQЃnчвв’М^`еЗ“zѓ:xх•W-G�ИуŽ;D‡ѓЫЦWr09kcЗ @>œССAaѓЅІІbџў§№x<јня~'мu зgdd ББ;vьРСƒЩ9%Ла‰‰ q‡ ’G0DZZš€}“““˜С,7;;+ЭJJJŠdTлsЎъѕzХSRЁPˆuЏCfKJИ,..Тэv‹q@jj*Š‹‹E ŠыW^ЙœПzН^1nнГgцццpцЬАDoo/М^/bccH‹щщi™RpМЕsчNМјт‹АZ­� .izН^�)))b0рїћХЃŸ�м~ћэ0™LВ2ЅУq{{Лдо|џљ2ё•˜ђp№Кyѓf ШœpbbИpс‚|гъыыqчwтаЁC‚eŒVželмИNЇG@Ќ\{fffbbbƒƒƒвPŠqьn'''бзз‡ііv<њшЃXZZТйГgE8rr—/__J•J…ЌЌ,сqе—““#њšМтууe”D9vє~П+++"ЊхvЛХQ—_€ЄЄ$мyчЈЈЈ@||<z{{188ˆЏ}эk(--…Ус€лэАJŒcgЭУ­T*aЗлсrЙАsчN]Ћр–ЉЉ)фццЪˆ‡™Ž[4Ъ- ”””ШП---EII‰Xm‡УadeeсьйГ�V•ч>,MхЖmлО4ю+٘4Oч šъДDlЗЖЖ"‰oљЙчžУ}їн‡]ЛvaяоНтЈ��|№€UИUuu5ž}іYЬЭЭ‰[||М vfggЇ911!, сТ… Ђstќјqœ>}Zd)~Jei/ЭA6п мюeЮ]>=wx=ШœГN:˜ЭЯЯceeПјХ/„œї—ПќIII8x№ \Уaо?чКЌЯ5 ЖoпFƒK—.сЕз^_Žг8јчЦŠяyvvіЊЯ“œЁH$"Њ'фќ�Р-Зм‚_|QfдХХХиКuы—:3_ЩСVГ&‘C4тPŠdddрћпџ>ќq<ѓЬ3вСРЫ/ПŒ“'OJ]DJiууу"˜Р:–*f ѓЗ(//‡УсРрр bccБАА�Їг‰H$"эбЕ3ЇС`РФФЦЧЧE5cyyYъbТЦИфFJЏзCЁPˆЏ["нy@{{{qётEМікkјф“OPUU%H%Ъ,O y‚E:::ал닇z+++xэЕзDД+ ŠАš-Y3“оl2™dтqe№љ0у_О|yhrr2žzъ) Iэ§eт+;˜ЬJ“^@‹пяъ�Q ЃЊУ`0‘>'')))xс…””„ЙЙ9Œ‰_ZZšРФXPТ%`rrХХХ(++C }њјPхŒыTвИYЂ§ _7љуqqq˜ššB$Ы“hќ"W‡œАмряЃeLL >Œ?§щO0›ЭиЙs'~іГŸЁЙЙYp�мъ(  zН^<ёФиЖmўіЗПСэvCЁP ВВRітЌgƒС и­(•JЄЅЅСjЕТjЕ^гъ{уЦp8Т,5™LшшшПSQQЊЊ*ЬЭЭaзЎ]ВYћ"Бюу"†FЃAaa!вггE�•�BАКѕж[…Gs-Сбœœtttˆ=ŸRЉ„еjEeeЅŒ†ШЦ‘Э  ХUуууQVV†gžy*• яОћЎЬрІІІ ‡У@ bџьМйаDo—Иsg3@f“““bvЪ бзз'ЄЖЅЅ%TWWcyyннн№zНb(@S­чŸеееxљх—eMI–*kSГйŒџўїПˆ‰‰С­ЗоŠ'Ÿ|�pьи1ёuАцy0“{Н^ё7bЉЇT*ЏR‹ЫЭЭХяџ{�@aaЁ”K‡mmmbЭВaУМїо{ащtbк№Eт+9˜›6mBii)>,ўдД сŽ˜Ѓœœ˜L&q ЩРj7?::ŠжжVмvлm2ПЄпРР€hёЈT*8NИ\.ЩШ\{†Уay]GŽA__ŸЌшп"j‰иJ.ИгЇќЗRЉЫ@~бˆY$ш™ѕГ9;gnЛДZ-ЖnнŠK—.смЙsЬЅщж /М€[oНJЅmmmЧШШ …”*•J&›7oЦСƒЌ–Q}}}Bс!фЌ“@—љљyЁMX,дееЩ]{tиэvДЕЕAЏзЏ  УщtЂККёёё8~ќ8*++єMŽдgХК_хйййhhh@AA<№]�ˆl їуt$АЦW0ZM#кrяJotН^ввR$$$`ttЫЫЫ‚ъž™™A{{;мn7 DѕwоСЇŸ~ŠддTtvvТсpH§фp8авв‚ .рьйГ–2„{рФюH‚ŽЧЧЧхР’Tцїћ…ЋN ВЧуСХ‹E€ЌЎЎЁPHєдwп}7233‘˜˜(сФ‰АлэВтМѓЮ;Ќ6‰ЇOŸFbbЂ�0ќ~П|yY–№Г"—httгггЈЈЈ@$-шЈЋЋе<f}т ЂyQеее8wю***§…ЮЭКLЊg\Кt /Ој"6lи +ЛgЂ]Оv=АЉгщ„нnGBBКЛЛёвK/ЩŸЕДДРщt"&&O<ё„HФX,(•J””” ЉЉ —/_Цєє4”JЅИ…БцЫЩЩС† рѕzбггƒsчЮЁЋЋ ccc8zє(ккк„YH ХЙіew­еj%,ЭU!QNЄjX,И\.1abэ{ѓЭ7УэvуЙчž“їйооƒС€ММ<єєє  ŠЎЛЫхТГЯ>+“о4мЧsљРљ-љшƒAоХ™3g VЋQZZzMcБ;wbзЎ]т8С[€('ЦmЗн—Ы…ффdlиАс ›u?˜n( мwп}ЈЉЉ‘К€P[IИђКИ2ИЇz(+с .рєщгhkkC$JEuu5ъъъ гщ еj…оњц›obhhH<€ŠŠŠpџ§їЃООЉЉЉx№СбииˆккZфччXЅџ~јс‡аыѕЂЬзB”8CCC2ф žІSTЕ‹‹‹ Ффф$Q[[‹;w"-- FЃQfЏяОћ.�`ыж­аjЕ‚œ››C}}=”JЅШт477ЫЁфШŒ–†мš-..bttЩЩЩ0 ЂСЩyhWW—мзѓЁр€žžЁc…Ъ …йnЗЃЉЉi5рѕbнkЬM›6С`0 ДДTŒŽ>јр™ЁЌn"уШ&":>ўјctwwЫњrЁPЛvэЕТТBДДДрЗП§-ЦЧЧQ[[‹7 JчмЙs8tшd5ЅR‰нЛwуц›oFwwЗ ЊGFF„ЪЊбh011ЕZŒŒ ˜ЭfИнnщоЉЇ+Wgjj*вггЅО$€e||\l ѕz="‘КЛЛx[SSЏз‹ЂЂ"YpˆОiг&TTT5ЙІІFРсpoМёќq�Ћ”лЎЎ.сіџ/Г3уkЕZЁќr.ЩцhlllЭљZQPP€ЃGТfГIB ІХdSRRpєшQіъююўЬŸЙюгd2aii wмq�рфЩ“2ЏcЩ}6А*Cрšž4�d`Ь5ВX455с‘GЏШЂЂ"БNБZ­b‰\RR‚ŒŒ 1HOOЧіэлњѕюЛят­ЗоЮtyy9 Q\\,ѓжh!…ХХEŒЩАzjjJє%i<Хыœ€aJ7rŸ>??мм\ЃММ"fАВВŸЯ'лЅИИ8TUUaЫ–-hllФюнЛeVЫЌ @<ЮЇЇЇ…LQГM›6‰5ŸнЃdєјчzБuыV$&& x9&&ЙЙЙшьь”њЕЁЁAЦmћїяџм+}]Ібh:/‹оуЧ‹Ъ‘,РjчH№№ѕbffFИAD[xAйe�ИџўћёиcсЎЛюТ=їмƒ›oОY.‚С |>L&8 œњњz�Ћ–uЏОњ*FFFpгM7aпО}ЈЉЉAmm-юКы.lкДIРЖDŠS ЦяїУяї эannN@nЗ{ ”ъq”"ЄWаюнЛqгM7AЏз#//sssb№ZQQБЦe,33S<,ЯŸ?…BжжV9МЯ?џМtСњгД>11ЅЅЅЈЊЊ �веsЛЕДДtЭэЯ•бииПпввRљ]FЃQ@:�№эo[T™?Џ Zзƒ™••…ЬЬLЙТЩuaжЃu‘ъЙЙЙ{ЛVŒ +!!AœИˆц‰жмДX,xќёЧёєгOуР‚ЌЈЈ”њО}ћpћэЗуŽ;ю@ee%Ž=Šя~їЛpЙ\xьБЧPRR‚ххe™1r8NŸKЅR‰Э›7‹О&�twwЫF*%%^ЏЃЃЃˆ‹‹E9~iDЪŽv‚eeepЛн 6{ќуёілoЫћœŸŸЧO~ђќѕЏ…ЧуСŽ;„˜ ƒС Ш!Њ…аx~~^ kф&ЭЯЯ‹Бщќќ<ВГГe^љYБaУСuF˜†НБфрЂхГb]&зUœGr B /g‹Ф+rfx-Т<эщ˜ѕˆ™ЄбІFЃСыЏП~ЭзЁP(аггƒююnAѕ“Й}ћv ДДДрџјьv;8€ІІ&$&&Тh4"!!.— ЕЕЕb авв‚ххeаБ+Ѕ{X0ПŽгввФ8–Р•ЅЅ%Œ!//сpXd#‘L&“d4‡УииXœ8qЭЭЭ�VБ‘HNN–ѕ)A3VЋUік111„Чу4ŸніэлЁеj%УS™zё_DіЅААPPѓFД8=ЯšлЬjЕтдЉSШЪЪКЪ#:жЕљЉЌЌDii)ОўѕЏKwnЗлсp8„Ѓ�­V+ќ–ЙЙ9сSGG-cccŠˆKPУ’P­ццf$''# тпџў7z{{EѓgddљљљHNN†Z­FWWl6rrrЁЁ!LMM‰Јеии˜ˆHбёЁЈЈ8uъ”l•вггMDЧ Ў�рt:сѓљфŠ,((&gnn. ƒшбž*# тА–››‹3gЮ@ЅR‰ŒјЪЪ тууЁP(Dг’ZHD-..ЎбзмДiєzН”§§§BЏащtˆD"_‘~сТ1, Ж;IЄ[˜ЭftwwЃЊЊ >ŸзќYы {#К'‰Шџу<Œ˜Хp8ŒёёqЌЌЌРщtЂПП{їюНъgё ˜ššТммœ№}Ш;бjЕАX,шяяЧ™3g„fЋT*бнн ‹Х‚ккZ477угO?E Ррр ^zщ%deeЁММЛvэТлoП-*ЛEEEBJS(Айl0‚зыEgg'‚С ИuЪЫЅлэ=$‚wЙщъшшYТмм\q ћЎбhD kзчѓЩ8ытХ‹8ўМ(жх§_йыддTx<lйВGdКй%їіі g‰чЩЩIИ\.фхх!''*• ccc‚” (,,9ШЯћМЙх!+€@ѓ€еОCЏзcnnn=ѕ•БЎW9g’фž ШJзПЩ$Eqcq­ 3щьјј™БˆьюъъB__ŸˆигzorrяПџ>ўѕЏсзПў5–——Q[[ЛІ6JMME8шwг�ŸŸ/0="В$чцц0<<,Њp<T …BјёfГY$Љ šŸŸъъjиl6БcЙс†011ііvlиАЙЙЙƒ8uъіьй#tЗлЁЁ!ј|>ИнnбюЄ–ЅBЁ@aaЁ|&FЦCМ-222`Гй$;В3OLLќB С ‚  ‰ƒХbЙ ѓАcЧИ\.^їpЎлUžŸŸ/цє›7oАjяF‰nЂšЖmл†7Ўй\­­­p80™L"Нœ••%ъЖЄв’ђK9цЂЂ"8ЄЄЄ ЌЌ ЁP%%%тГc0pфШДЗЗЫuЛДД$d8fЎ‰щЄxУТТ‚ЌЃAСйŠFе“щI_Ш‡~X {999xы­ЗD˜€ЄЏЪЪJ<xЉЉЉшыыУ=їмƒььlxН^œ<yRhЗl>шžšš*MIOO "‘ˆ№фбзз'rхххP*•BЗž››C8ўмyІС`@OOьЭ‰`љР‰‹^ЏЧG}$ƒљшŒЪXЗŒiГйФЉX=P\ч---! Š'#п@~~О4Jз >б'’КH, Шь„зы/AТ“““xђЩ'Бoп>,--СjЕтШ‘#шяя‡Z­†лэFkk+ ŠŠŠф5 ##CVЅƒAˆpЩЩЩbxЯЕ*k+ъQސ#%ІU*ЦЧЧЁбhрt:ё›пќSSSС›oО‰ . ЕЕU–�№Ћ_§J€Т{їюE(ZЃ`‹мм\,,, ПП_Д—233хK@xF>Ÿ###€зы…BЁXу†6;; ŸЯ‡ўѓŸŸћЙзееazzZ`‚ёёёшъъZоШЬЬDFFЦu3цКЬЪЪJLNNЪЈш?џљtнFЃQ|еd4зˆ\+ЈАFOoЂ^"‘ˆрЙъ#жрdBгјpОѓяр—Пќ%іэл‡oМ^Џэээb\511•J—Ы…ЉЉ)ŒŽŽЂЋЋ vЛ]]]8tшИЕѕєєШг0Ряї‹:0%� t˜ššжцТТFGGEIФуё`nnннн˜œœ`ЪѕфЃSRR№єгOK'млл‹••иэvиэvсщƒA$%%‰0Нˆтуу‹œœљтЯЬЬРnЗЫ—№=JЩ\\n�ЋŽЅСеœ;Ÿ<yRў^jjЊpрЏыr0ггг…6СXXXЃбŸЯ'o„Лc’РЂ78狉‰ ЩЬ<ѓѓѓТїžE$AMM "‘мn7‚С ˆŸЊT*Б*NNNЦшш(6nм(”Н^ФФDј|>>|---№x<XXXƒN§ѕииX˜Эf9є'ЇиъааЦЧЧ1::*йX0PЊžшЫЫЫШШШ€зыcЉŠŠ фччЃЎЎю3Wx{їю…йlЦ№№0<lГЈЖЧnœВ3T{cЙCїммњћћбее%ЦX„фБN<rфШšпЭУЧPЋе"м@,ЯЂН%щНAћКL›Э&€нММ<$$$ˆ3Q7‹‹‹"ЁBnЬШШШчfM‹Х"Г6ЦЧЧлЈеjЁеjЁзыЁT*…ОDэуќљѓ�V›ІОО>љЗ2c``�“““BюяяЧрр fggбггГцЇК[^^ЪЫЫ‘••…p8 Їг)’‹TQЋеHJJiН^Їг‰ЩЩIьнЛййй№љ|ТRЌЊЊТЖmлpљђeqD,ЫЕZііvЉgљхЅpДsFZZš БЅЄ"пˆЊФ]Y,–ЋъAJљ0jkkЅ<!iмљh€Nuu5FFFЎ™uj~ŒF# ФЭX=яНїžаmЉ&A48U3rss?sŒpъд)xН^dff О“у(юо …HШp—ž––‡У!Hy6<ЭЭЭhoo‡Ых‚VЋEПlІhЭGњW $Тйl6X­VИнn "//OДƒЂUоH4ЃШl__FFF`ЕZaБXpєшQLLL`Ы–-8pр�ЌV+ВВВ№мsЯЁЄЄ&“ ˜œœ„еjХљѓчqєшQTWW :ЈЎЎSSShll”u/бћfГYЈЭ—,,,ˆ+/apT~Žі Ѕы) cjjъUЭj[[†‡‡elХr�€4PД-єљ|шээНЊTY—ŒY]]}&зgyщщщ"E”!cŸмC“яBСд@ (6:jЕZрJЅR2mJJŠ\чХХХ$“ЩdBaa!šššАgЯTWWЃЈЈ@@э‘H7мpіяп={ірс‡Fqq1>љфLLLˆЉe[˜uЩ-зщtаh4ащt‚ЯчDSQQ‘€2ј~Ш4уаЁCјљЯ.BV555В){№СБcЧЄЄЄрвЅKЂ]Dђ_ДŽ(щ#&“I45‰@Ђ)Г;­)(іо{я}цgєШ#Шš<ѕp8|U=ЩqЧpбБnіДД4Ћv'lLˆ[dбЭБЫшшЈd)}qфqSšXumcМВВ‚єєtтЇ'31Юž=‹o~ѓ›иЖm4 ьvЛ\Л+++(++УввЬfГXЖатJфSmm-fffф`вRахrЩ6&++ щщщшяяЧ№№Аh щt:бKћэЗХД€ЂЏ” innFyy9Ž;ЕZŠŠ љ§ž%›”]}UUFGGсvЛ‘––&ZPмНrчѕzE№œ%о,\Ёв ˜ЄшпweСfГсЃ>пxКПњъЋЩcВШЬЬМ ХД.szzKKKђ†B! Iњзh4ШЫЫЯŸp8,~;W^ б€S�b§7??/зЛFЊ{­УкЪfГСяїУуё уьйØ™™AGG:::рp8P\\ŒттbьнЛЅЅЅreС5сЕрxd]†B!ДДДрмЙs‚ра›№7юЁЩЇ"ђ~№шt:ќјЧ?–gФz; ЁННƒƒƒ",-@PRR"_>�ѓыыыр/Ÿm лŠЯŸhЃp8,<ŸЯ' „кOšMNNЦ‰'>ѓ <ђШ#И|љВ@ўштжпп/Чяїcffцšр№u٘сpxЭЎ;Шh€з-92:Nj7`-зРUШщhO щSu˜ијјxqvиП?ќ~?Ž?. ‰ќќќ5„Дъъj� nNNNœ8!рлшрL0:шєРA;;v~а~ПNЇFЃqє З*fГ:ЕЕЕјф“Oфчў§я73›Э†cЧŽс–[nеjХ™3gdoџС ОО^”6jjjP]]-“ŠH$‚ссa9€“““kœъ–——…ЈчёxPPP€щщi‘п cЏ……ЄЅЅ}юєЄВВЗмr z{{Х_ˆЖомЇлl6Œ_“FГ.“›ЧD,ЄЙ&Ѓx*W…бЃЄы3*Ёr„›б§ XЋё�ЯЮЮЂААѕѕѕb(?33­V‹ЎЎ.МђЪ+ђ3шv;<<ŒЄЄ$„Ус5у —ЫuMрьЩ“'ŸŸŠŠ ЌЌЌˆFвќќ<ЮŸ?/cъh`rётEћйl6ЄЄЄр7озѓгŸўSSSxъЉЇ VЋqњєiФЧЧуќљѓxчw044„‰‰ ДДДрјƒМ&в;ш8722‚ссadffЪŸ i>‰~bЧЮйяШШˆ№‚(І@yD>ЗыХїОї=dee JI­Vуо{я…С`@ccЃ˜•] ƒћ�t{U кѓ����IENDЎB`‚��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/�����������������������������������������������������������0000775�0001750�0001750�00000000000�11754254530�017232� 5����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/refresh.png������������������������������������������������0000664�0001750�0001750�00000001273�11040062060�021360� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������!-���sBIT|dˆ��� pHYs��h��hHој���tEXtSoftware�www.inkscape.org›ю<��8IDATH‰­•OKaЦsƒ[’rBmиF.Иќ�n\~‚PDС / I›-51ZUрЂНаЦHhSт.ˆі3ˆ1ызbЮф8ЬН•њТaцœїЬѓмћОч<рвqXuЁMхAЋ№Dx.<ю }ћrJЌё&LKТœpUшЮ ‹‚a›ТCЁџџ R’a7Ро 5с„А–#Qј Œў;д…yс›А 3Бз%lЖ…[Bв˜�к…iс“А%м„BW.oXX.!љ%Ь–Р№:_ƒя”ќЫЊpCX-|ЦіЄП2;зGBKЈжфž:у8ws$яГ Ы�Vbу™ањЗвk@4UИ›…Œ`2я„оя‘Œ ;З%єT€:щZA_r˜ЅwлсЕW*РщМ9јоКМŠї‹рL8'^KсU+Рp.$ЧŽ„vтљЙ< Їм<"‚ѓёќ‚а7nTРј!+Љ7*Ra2 .фъwC˜: xkє’б[еlЃ/К/#йюьlVЊ9П%TРP…Ђ…Žфue5єІZBp_шŽїСа/CЯ†Љщl(Ђ[†sy]ЁАЁИ[І <-Д7“ыФTгЗKH6Ь$f"Жn:3цЭFmСяЈщ”ЪЌ™NГšщtЫюjЄйХ7Ћˆ~гyЛ™#Y4ЫІszЮtnO4ТIдц-“$}Р5рp*Кє2КЫiCП–}ўb&ЙП+Є����IENDЎB`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/pen24.png��������������������������������������������������0000664�0001750�0001750�00000001334�11036664230�020664� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������ўО K���sBIT|dˆ��� pHYs��У��УЎ`Zї���tEXtSoftware�www.inkscape.org›ю<��YIDATH‰­еOˆеUРёЯљНi|яЭшXQ”…š‹СЈ E`B •;ЉнЃкІEŸ+ЁVL‹Œv­\H‹Щ ’ТpYšJHQ‹6.ZєGPgц9Ž‹їгљЭkšо“9pроsЮ§оsЯ=її‹ЬT•ˆVq=sђЈ{”bл[xoо+є_рˆVя–г™uыfњx9>Н.рˆж&Tkzj]Рx –уПpnНР/UЦ_dNfo0ˆлDЌvё+С­иИБёrХ~с?WtћѓOМ*тˆˆнkeќєиXѓЁŠ}n­ldЮЫќ Чё‚ˆГ"об\оАсО}ЃЃѕъвЕСЫЬЪœР~,сМˆЖˆЂ€ёёGїЯЭнММAGцЇиƒW№uб*jЕтљ™™рЮ@рeйgqЖР#Ц№ШТТb5рц@ИˆD|‚№!ŽсБ‘‘К№Е 0Ћи#ѓ" aKГ9lqqЉ>еАŽЯё"оУG2чяИ‡ЦА……Лр_3'Џї‘ыgиН2/ѕ: ќvцЬЯ:yК—іAPи‹Ље wРWІЇo)фI<—9yВO№9Œ‹x}Uo6›уЙ}ћЗЩЩСЬд—В+ЩфFВГз/Л’эvf­–I'�ўe џ1ЉU}…щщЭЖnei NЩьЏ‡#ЦхrЖ OTнCNœ˜аnПЏ^gvі›ВžС“УhЉcи\ъ6<…(9Пы~У+5ющфЇфp2Uяџt6љ>9”lъ-SЌј§GlСwИПЬЌІћЂЎтќ_p—ЋЂWn|r4ЧЎŸtл����IENDЎB`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/magichat.png�����������������������������������������������0000664�0001750�0001750�00000001747�11040140676�021517� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������ѓ } ���sBIT|dˆ��� pHYs��ш��шЕ{Rk���tEXtSoftware�www.inkscape.org›ю<��dIDAT8•”]H›WЧoђ6j­u-Гу&sRЌЖn-NДCЧ ƒЖД4ЅlА‚BWJcаБ1лЭћ(ƒ]ЌьІ”ТЦF Ѕ D дьB[УjiŠZ]“j4ЎVsЮ›svSCtžчЯŸпџсс ЕfЃ{іЬЧ‘Уy7гиифЉKЁЮlІйд Ооїб‰“?Нблћuнџ68nЌzaСЙЗЉiШxЉњс‡щЬBЊгйœгvoДŽћ!wћF:CkНІјщ'ЖH$=‰Z)уŒ]ЁjДю˜|ЎšХЗ3™Œgw§‘h)B(€ыiз5p9Уœ=wžЃGЏђVЗoЅь}.ƒЯ?{Игn.t8–).ў‡БёWZЭ†сѕПњ5C”RН76оjЮЬЄˆХ5ёИыйЖјbУ.„ъ‘B18ИfЦЦ*0ЭЅЅKыЦXEpчіЉ^—+М;›+eiй@EggЖЖЛЬЭmуцЭз УпЈuЧшК™,ЇНѓЙœ… )vЛЂЋы6ЧћЩfэk(ђп~.vlYlJ$vВИhGH…ei„p y№ћїPX˜^c Ѕ:йзїО9xЋ–'OвHi4‹э`jЊ|EZkў­;юЌ"Bѕ<еуt=BZЙ•х`jЊœšš†‘пк<… pёћpЃ”ъЕНћЎSщІЌЌ™пџЈ'•к@oяuккювппТћ™ню>ЮЁz„TИ\ГTUMвбy‹ЙЙ’<СЎ]ѓИн ИG"Q Pmў§�Ж_~ž.RН›ЭZƒ{ˆFЫ p82�8Ў\щ"ђрѓЕАuЋ…iцђ1Œ/†Н‘Јu5I‰Zљˆ‘'6[Ык’Ї(+[ЄЖvšжжСр+ зХЄtИmRЈ)4B*„P˜іeТыxvh$“%”—'9vЬЯ… —ЉЈ˜Ћ�кM!еъM)•MJ…Э_~u€Ч\Лж€ahŠŠ,’ЩтёXZ*№к}§пљ~ћ5б?ŸЬжЭ'ГžššQ*+gАЌњњZ‰Хv<e0}™‰‰J.]:Фђr@fефЉњГ6MŸъюnЖЅR…UZ%Р4"OпППжуџz#ГЕ Ћ—i����IENDЎB`‚�������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/hires256b.png����������������������������������������������0000664�0001750�0001750�00000002267�11062565574�021465� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������эЃЌК���PLTE���€���€�€€���€€�€�€€€€€РРРџ���џ�џџ���џџ�џ�џџ€€€������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‘чЗ���tRNSџџџџџџџ�џџџџџџџ�џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЇѕЙ��� pHYs����=fƒЧ���QIDATxœcр‡N0€Г0ХQ%ФQ$Х‘%аЬ‡K ›b0`3*i>D.7"`ЂшЄЊNЫq;Зq ю@ФьИ# wдbи�œЄСИЌ„����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/hires256.png�����������������������������������������������0000664�0001750�0001750�00000002267�11062565530�021313� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������эЃЌК���PLTE���€���€�€€���€€�€�€€€€€РРРџ���џ�џџ���џџ�џ�џџ€€€������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‘чЗ���tRNSџџџџџџџ�џџџџџџџ�џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЇѕЙ��� pHYs����=fƒЧ���QIDATxкcр‡N0€Г0ХQ%ФQ$Х‘%аЬ‡K ›b0`3*i>D.7"n/Ь_д”Рi9nчті ю СˆИƒwDсŽZ {�œЄСK“єH����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/hires16winz.PNG��������������������������������������������0000664�0001750�0001750�00000000437�11062565764�022003� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������к}\ˆ���sRGB�ЎЮщ���gAMA��Б ќa��� cHRM��z&��€„��њ���€ш��u0��ъ`��:˜��pœКQ<���IDATHKэ•;Р ѕў‡6!M>К`‘&Œ6 УъАжюЅl(Wя&фqш8/J�fЧМ8ёmLŽЯ�’Ј�Щ  OЊeHмФŠH%ƒ:�Ъu�иЩЖ ВSЦ^§№v–(zАUѓЅyW1ЩЎfeMLаЭu�Hўєa8‚чIYц№ЦѕццВјGƒšз�ХфЛ�M™цc†ЁЛа����IENDЎB`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/hires16win.PNG���������������������������������������������0000664�0001750�0001750�00000000437�11062565746�021611� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������к}\ˆ���sRGB�ЎЮщ���gAMA��Б ќa��� cHRM��z&��€„��њ���€ш��u0��ъ`��:˜��pœКQ<���IDATHKэUA€ У—;_ŽЬФЁƒ–O’p!Ѕ]7663ЫiВv3ˆ8šsˆsб.ъmtсв[фЮ# (‘пAв,y„ЋЯЛБфQJк”?rY@%—r&пŽщRФGб"Т_ ыжйЈЙž)S‡х"к|VDf~зh+NdЊS—№?` пО z\ЋNфџ ŽLq";P ъЃqЧдEH����IENDЎB`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/hires16lx.png����������������������������������������������0000664�0001750�0001750�00000000324�11062541260�021553� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������к}\ˆ���sBIT|dˆ���‹IDATH‰е•KР DЁщ§Џ<]ЕI)•qQ–ц™T@ЊPѕЯmЉ“wаФƒШMё@9[тQ^ шомфН-"йт6ˆ‹мˆјэШžлЈ­џ(�P›lzЂЯkКвlЏ&\ДHhq<П€Mu?тcчf EM<І$Лђ= @ъEkB.ŽОB""ыСв����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/hires16b.png�����������������������������������������������0000664�0001750�0001750�00000000362�11062565256�021366� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������(SAЛ���0PLTE���€���€�€€���€€�€�€€€€€РРРџ���џ�џџ���џџ�џ�џџ€€€LЏ—=���tRNSџџџџџџџ�џџџџџџџ�ЉlQR��� pHYs����=fƒЧ���LIDATxк1� љџ:љN'ДU0нt Й4‡4rП Ž �Ш .”!(#3žAhcƒ Э“~ƒ-АеўЉу‡Z/gЕлZ&че1‚#˜з����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/hires16.png������������������������������������������������0000664�0001750�0001750�00000000365�11062564552�021225� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������(SAЛ���0PLTE���€���€�€€���€€�€�€€€€€РРРџ���џ�џџ���џџ�џ�џџџџџ{БФ���tRNSџџџџџџџџџџџџџџџ�р#]��� pHYs����=fƒЧ���OIDATxкЛ� CйƒTЮi…ќr(•ш3G$ Аt{Б%Бh()Ё$ƒюПe!$BH~pI”^Vўс1жѓбчtD˜сюиќьЧЯ‘ мY;����IENDЎB`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/hires.png��������������������������������������������������0000664�0001750�0001750�00000001032�11036666120�021041� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������к}\ˆ���sBIT|dˆ��� pHYs����YШіћ���tEXtSoftware�www.inkscape.org›ю<��—IDATH‰Е•?HQЦsЌ‚E,ЌЌK;%экXZœˆ!bl[‘ДjaЁW(;­Дс@!pv‹D,,QЩgБw8Оняпƒ)цлп№ ѓіН‡р>ˆqI$LА/‹TжAŸ2  Sp№ѓЭ3ˆMњwŽ gё9j]R˜vJ|УЌ' 7Сч@ы�z]^FкHVкW`б)% t4”A1йAЦЈr‚У€нj|D/§&_NЦlЮcѕФ&З@јчдЬђе$J)Л.^хfѓщЉbrŽй А]љж|Чь#вя7IeжC)Пrw З0Ї‚іfD‚у€лllоГZ=Ђф&›-ЃN9ъ&Ј™О8х0†єPџA{сџ Ш7~атЮЛ€=тыЅКц‘NЊI§f9`шsjiнcfсewЌЙМœaБ ŒИМЬ&Јšпƒxю… цZагœїРЌ(:х ˜@КJУk30ы~�œК€t”YгъGџђс†PаИёQ����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/hires.bmp��������������������������������������������������0000664�0001750�0001750�00000000576�11062564466�021060� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BM~������v���(�����������������������������������€��€���€€�€���€�€�€€��€€€�РРР���џ��џ���џџ�џ���џ�џ�џџ��џџџ�™™Ÿџљ™™Ÿџџџџ™™Ÿџџ™™™џџџџ™™Ÿџџљ™™Ÿџџџ™™Ÿџџџ™™™џџџ™™™™Ÿџљ™™Ÿџџџџ™™Ÿџџ™™™џџџџ™™Ÿџџљ™™Ÿџџџ™™Ÿџџџ™™™џџџ™™™™™џљ™™Ÿџџџџ™™™џџ™™™џџџџ™™™џџ™™™џџџџ™™™џџ™™™џџџџ™™™џџ™™™џџ™™™™™џљ™™Ÿџџ™™Ÿџџџ™™™џџџ™™Ÿџџљ™™Ÿџџџ™™Ÿџџ™™™џџ™™™™Ÿџљ™™Ÿџџ™™Ÿџџџ™™™џџџ™™Ÿџџљ™™Ÿџџџ™™Ÿџџ™™™џџџџ™™Ÿџљ™™Ÿџџџџ����������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/hat.png����������������������������������������������������0000664�0001750�0001750�00000001574�11036662306�020520� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������;‘~‚���sBIT|dˆ��� pHYs��J��J}ž<х���tEXtSoftware�www.inkscape.org›ю<��љIDAT8•’mHTYЦŸsюЕ™Љqt3hЇІЌйвАй4вЩB,шC!НP}\‚>}А7X v‹‚ˆО,,ЫYF!ИlR‘„іŠНbIwlЌ™Ц{—{Мџ{њрЕБ8ŸўЯчyЮљCJ‰|їh—ЕzЊ™”SAlїž іSЭѓ‚ПїP…А0з$4(,д{œ/5-п$В|SU[m{џўџ <s›м&БЅ–MY1њ8Žфе<1ыA‰.ЮіiЧ†ž'<•ЇяHХ8Тш›ŽТЖBeоЭUчLS“Š  Bэ7ЃўбKŠАX]uљЅв%ГКKjќнA€ШѓК_€‚АдFжscpWьa,ђa№УќЌ˜a­в5eG[f")1н~іОYяzБЪxtJst�ˆ�шЪыXу?Он_tг-H ЇЈ,5Љљ"ю'№к@ЯЂ@Щѕ…%Ў  ]й§гЩђCM‡ч„f>qXЮZeёW`жr­ЙніV­Ь 8OёІревЦЙ7МRђImгW5}YuTЧt3Ё тi/энЋ)|L!ЩeNЖ@�0)%ўъЇт‘TцreщЉ ЗущєsїіwПЌMID “уRВЯыэmLуЙoXЩ1Њ}џxg=v тrMАГјФњ}СПњ †ђиќ)Њ ЌLdЪЧ/=њхcCгоЇ|ж’YНюйEoœ!Г ГўўЩ:XQW4ƒ9Ѓ0lHh:‡f�~lїнj3L7•Иъ“wЁlў™ Bи$8С’ї–ЊпќœЇИ  Нg|FСџЛЅ%tl]k`я…cв• ѕЙ}D}р\йЊyЫЖVŸ-Ы­МЎЄ:fЮ ЮlOћЌИ\5 с QšїiЭЩЬИХFg,{Bёя`Ѓ‘w ѕiс4I%  РyvњІхˆЌN3PеаM#№,юс‰ @Р0€(€Л�nЫ6fРGА-ƒH&…~К����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/ellipse.png������������������������������������������������0000664�0001750�0001750�00000001423�11040060410�021351� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������к}\ˆ���sBIT|dˆ��� pHYs��‘��‘gЋЬн���tEXtSoftware�www.inkscape.org›ю<��IDATH‰Ѕ”MH”Q†Ÿ3ŽM#скŸс4’‹iaŒ‘RИH)\ф nŠZL.ТU-ТU.‚AД Ув-DZ„HX­кXh‹"Б”ЦпЗХ|3|ŽпL#8№нћžї}я§ЮНз$QP˜5�UЙр. Suќ3C—KXYЭа6`№hцГЁ)‚О0mIŠl‚Ё!цW€" ТW˜z&z‘ЊГs'Ч“АМ‡і0R5а АQƒuaЏЮ9УQipжџЗp (vОeƒЙ ЬB˜E1 ф.‰ћNg(/# м ѕџЪйEЬ>цсбdf[œƒђVœЮНГ№Јz€}Р МіЇ1+Я}жdжјеs›’t V=Ÿ$ж%Œ~ žЅчъъ.ОкДщЄ &ˆнЫЊЏШ‡Y%pИ‰д‡ДъЙ˜юm˜u™Хƒ55бЅЅ•4žє"љ№И’CигЄzt˜2ГbзEѕ4№MРs$Яx ьЊ"y8kўWБˆO Џ€х:цšы\…™ bVяЊ­Ml$.9Щ6’Gf] &Кюl‚x4 ‚8oЬЫваˆЋСєRпюрkвМŽbV’W^ZrњдLЮ,26>ў%ОџN еЧu e‚o‚[žчэйn, NAl/Ф†!жБЭЙ8ib‡`UpUрЯ!о,˜<”„"‘3*-§$И+(Ыo8+ј%\D!A\pЧЙщ‚­ Тъя—"‘”$ўm2й-x ˜rˆЬ F'\u40 56JА Ј(Ь`­йvADPфЋЁс…ZZ$ЫзЗќMЭп№€рМћёѓЪПQ Ж*eН#����IENDЎB`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/crosshairs.png���������������������������������������������0000664�0001750�0001750�00000000611�11040140754�022104� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������|fu���sBIT|dˆ��� pHYs��+��+ТаКќ���tEXtSoftware�www.inkscape.org›ю<��IDATH‰эдЏKƒQЦёЯя[TDP ТввжБ у &Ћ fХ8ЋПкў›Ц%йЂХdЗ ЦЅз2eММяDdœ‡ѓНю=WŒQ6шoа_Ыѓ"+‘vd.зŸˆŠ|сЄРkтеџ[E№_б >}xТ ŽэL}Ы! Г ЧŽ—КЖ\я=†С{ Л— …лŒ‘Žs+лёЌQWЕb |7їёгябП+XЂЭHŒдКDПЂќŸС!Є˜Ÿ,V=$Љ–rzЦyБРџвајуэЉa}ђШ}Їдhиus•3Q8Р[ЩфOГ ><)ЈŸcTрН`Gљe‚O$#'mўy����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/colorbarzero.png�������������������������������������������0000664�0001750�0001750�00000001200�11040140564�022421� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������ўЄл���sBIT|dˆ��� pHYs��w��wЏ’`(���tEXtSoftware�www.inkscape.org›ю<��§IDAT8­“БkSQЦч&/я…ф%$ЏъАCGу`ыаСЁЛtpШєџPь`ŽNт(Љ$Бш(tщвЁ:H bг'I^’у№ђЁД>Ю§чђ{Ю=ЂЊˆHIФМnFDM“|l“ЧIюЖZЧЯTЕ.€ rЩЬўєМвQ6[ИЎ‡ы^!є™ŒЧ(–NчpH&ЧˆrЫъЩжжЧlЕњhюфЄЕЦbж\юкуИjл)ЮB"‘$Ы#Ъmл0?Гнэњf{ћGб�Ыr~O>єЂVЉ<= ‚рr"Бюe xоl0 ,|яїЛйЫиммШ8ŽГo€WAаЮЋъ?џс"ЖОўrЦї§5QUŒ1o‰пs]ЯOЅђНDb4дє)ЦЧCžє–эіqЌйќфьээњОП(У=рЎˆ,‰˜|H…аЯ$D~u'wbєџЃ{ Н^яOw`џЊіЎ р5`Ћ*#Рћ$4jби4€z 6’ЊŠjРuр1P=нЩТ hYЄЙ0mяE @ь�,Ћџ мžHП?<ЌN+Щ] X@ш�‰q%_Ъ 7BІЫ"ѕТље-�ЫC:'R/ЧoРТ6НˆЄw`№|Ь5-бKЌEюt�JР№Шўя@ЯУ_ікібнц"����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/colorbar.png�����������������������������������������������0000664�0001750�0001750�00000000615�11036662370�021543� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������ ���Ч?‡ј���sBIT|dˆ��� pHYs��Б��БѕƒэI���tEXtSoftware�www.inkscape.org›ю<�� IDAT(‘Н“БjAEЯŒ3ыŒŽЛ…Ц˜mгKРЮ&љ ‹|Bў вБАHщˆM@ќDТкmt`7N Y,eѓрpяmоmо#„�0BЎ„{ \‹Rjя\g CрФ2Žo?ћ§ћ,IввЙ:ЮѕЈrЅж60ŒkЙ№yў­‹Yo:}MНї рнї›$щ昼E-ЂЈMГyт<WЊЕD)P ДцТЧqћ8skЃА^<I`ЄЕнQУL&Я;я§HVYдQ2мeYZ B8ъ:JЖл/­”:H`S‡n%ѓљЌkŒй(рХћŸežgДZI”з.ЯВъКоRя§„џј“?чЭ~uЧюІ|����IENDЎB`‚�������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/bucket24x.png����������������������������������������������0000664�0001750�0001750�00000002160�11040060222�021527� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������|fu���sBIT|dˆ��� pHYs����.Пм���tEXtSoftware�www.inkscape.org›ю<��эIDATH‰”}LUuЧП‡{яˆqх 1b™ЭšС*Е•ђЧ5џ@Фj QZР?шsИхЦщla5\!^Z ИZR8”S, ђzyН\Ѕ ЈsпўроЫхђ№лž=ПsžЯѓќОчљ=I,u ТО Р н)ЕЪ%F–•цЮЮs1‹ќ_єКр ќДgяgІ†ђ[nlcTTІьП>ёиЂqK�…mL5о/§•R\<ЉVГ.ъU~]P՘шьСеХm[\ЃйПщщˆЃ]}…%Є› PіжrtЭ{;GЙ1,Ѕаћ, ююџRфцt“љ›KЄ(N №є–xV^яс€IЂeXbн­ |"ЉаЋ–єa‘›3њG .’jЕ\Н=–Gг |`”йл%sЈ_тЃ‰ОЊœ№O,X< ЉжXQ=ЋтkЯЧ29ɘM 2[›evЖЫьы‘h”јчC‰я:7ЂгН{`QИ—WТєЬяЪ;ЂэртЈXfЄWАЖFсНпeўб(ГэОЬюй.Я#ѓ$Ÿ{6Га‡лX.N}ьОЦЧѓг‘Ў^Њп*1хЃCо–84Нўvя~ В ШŠƒЩ€, e@TИ\єБopАюŠ ьѓ��С~‰Aз ScЁO [ч)о4Л яёБуЭЗ№ЬІ0ˆ"АJDEZ=ЌЯ Q3НЏПн2•№іUн=чЃЇс‚ ž€rxЭЮё;к]lмUHH =h•а–`NB іъXўйŠ|›,i�V РчfѕCуY……њ†ч‘a!ьВЅІМсЎбЈкрžV‡4аb9К­­e{nnіэВВђ1Yтt№ЌDТ‚‰jjк05Хk6xЃеЮЬC‡й<ДЕЌЌ4;ыјёО^грl (ŠрtЂщїŸфvw›smpƒеЭjZ,_ž1[_ШЩ>YWђCщ_’ФЙе:œЈшRепFc_ihwь–Л�Ў€<БаеjSЕZяŒŒєзmі›ѓs[Zк•”ДМЛ&“yiPf.p˜€a SвэкїoJ(§хg‰е7жз*<™s}мЯ/щ ї˜{C/Эі' .–ФлћНфааŒо”#W'CBŽuљњ&q^Ж>№=€p�§�,Nж  Р=zЩЭЭѕ•‰‰ЩЫЄсŸ9:ˆ&0i›#ЫДхЖЮ?ЯІ‚mŠРЫЮp�5 uЧ2–�`Я|ВЈ ь"№-бVоNрIчЪgњ�СРN��ќ�јZНmџ/€^�&прGŠsсџVин5Б.A����IENDЎB`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/bucket24.png�����������������������������������������������0000664�0001750�0001750�00000002522�11036664744�021371� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������рw=ј���sBIT|dˆ��� pHYs��[��[цЭЮЫ���tEXtSoftware�www.inkscape.org›ю<��ЯIDATH‰•л‹[U‡П}ЮЮф$™$ssЦvк8ЕvЦjЕ:U”ъ‹ЂˆEАŠ>‰ Ј/^ўСAєE_DёС"*ш‹(Ј HЉ—ŠZ‘JE+еjg2ЙM&зЩЅ99ћтC'i&Же ЮйьѓћжoэЕїжZ†‡x@ р2`v0‡mXŒБd€lдЖѓЧ›‹ю0g8xKБЯmвВж"PИ/фђИь 4—Y‹ˆ†iOŽrіђ1lР й2ЮjЭ„^Ь?‘|Фзэ‰YѓЩгŸ,‘z8l?–Fp0X.GAђŽkEщЎыDmћЄ№ЗMрЇІDз aўeˆzf‡їХыW ЯПД№~х…Е‡у fП”ŸніНЇнcqНЉb|#Лљ‘SGGНУoІ.~jпjёўлхЩ‡_бз,џiП–ё?Iќ§Лz>0СЫЗ}^ž§шйЮйzHЈЎгйu{ЅЙџБBkёЁ*Žkмz>4uшЩЋ1Z\а\зђ…7ємъWv|DSЛ‚_R)1ŸЭ™p$ЈsГwŒняй>СЄ[&щдˆFPr~o%4ЗА>ўЭk)ЗUY7IŠz†ЂšЁЈgШЉYОѕяфШйЛб"Фж-Ђ“Яйœ˜и|zџНbїЋїОќжЮўtzŒуЇЂќ–Iв№У{>QWhВI[G№ЭШЦœa2кf2жaЯ\“љн^iЯўэ?О§йyјЈЩЪ `ЉPфOзлX,` §XoKjЭѕЖЄо’дл!ТR3ѓ‹њФУA­жаžXШ5<дZйzJё—Д–L~iКъ\Пиsк‹XXс…г 6Е>џм[ „Чъ�Ѕ H;@ЖTЖ5:“5њм‡Нш ˜ЭаСŽl: 6ˆLЌ[ еК�Ыi4‰љг ЇЕuƒAa=”Ёщ…Й0\Л^Ыˆ6š-=9cp—зЂtR7§ ­Ћњ†`і"nњ€ашКЕPXГž1И=@ Kiыuc3еNjпАпs2\ЎžЃa'Ц@з›Z3Вy"B`€ŒгHЫЖывHgmD)шЦ.ЏДчя<ЂFЇW6 ыѓтzу}0{#dЗМ2c ф‹6тК”iH�зЅЭу)ЕБ["Љ[vjљД,ўЕгiUfŒAє3пtгПъwдЦ@БDDV€s7&АВКЦі>`уюББ-хЮм–2эzL––З‰VeJtужXЇPnЄбIl_jЯ/ї\–+6b4Пін€ЅЕ’нѕ/@ЯОLЖќ™ыOУ)ЋДƒпђŒЖТр˜Ў?;МWkeBкАдXЫJБ„М`s9\cdЂmœЭ6и•š Ыƒ%ЪVЊЖПНƒt!ШЅЂчЂб$Є™F‹иџ\ Є54[И~—ш0 Ї#х Ёd‚рb€џ‚h Й‚lhІaуŸOЉ„уŸšЭ›іŠъ­ћDсњнЂ~)ШрЁгNўa“п3Г'NкiПKЕvFЮѕ�ё”К 8(%ЕцЯЃšЕ‰$:™ўX<I'ЊZГ#•*^Ѕ†W[ЗсtжŽж$]—я”трЃFZV7G<ЅЦ{€E!итКЬ иj,гЦ0ъ:T…CСZ2JБœ>lЄenXы­уї>t����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/autocontrast.png�������������������������������������������0000664�0001750�0001750�00000002507�11040057454�022464� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������!-���sBIT|dˆ��� pHYs��n��nKšc���tEXtSoftware�www.inkscape.org›ю<��ФIDATH‰…•]lSeЧџчэщщщзквuДeЋ…Ќ,Jк™‘Ќ|м,Ъзд($ФЙ3Fš wФ(\l7\•Ђ‚™bаY"У\‚Hlun0ЫњБгі|ДчуѕЂыF?ІOђцœѓœї§§ŸїyŸѓ†RŠеЌЛ;ёЬњѕёAЋеВХщtZZ<n]W AШцŠEa6•šЛ<6інзŠR|Иƒi&pрРщPЁ0qfѓцчz{zb-ЁPУѓ–š9В,сдЉѓаДEifцffІ_П{їчR=‹­wьиёЦ[ыж…=њ^аяЌDТдЮу8 …!gcЭО}dлЦ›їLLќўЫЊлЗПz~їю—w иŸжУWv!@Г(•ŠPJEя† =—z{З|:>ўыБ­[_|spppчоНіzhѕоdьіЪ3Ѕ@&›„ ,Та5”J"nпžЖј|Ўw}ОР ѓ7–СОО­Ч|Хб,j†ЬfРR{ Х4ВйGЅTU†ЊЪXX0јіір7 УЌЇ”Ъ,�„BkЮ8qМус™L<8д›І– Њ%ЈЊ Y (…Ѕ5$иееuР aцй§ћ_ъ…|АX*Qr\х:;Л€у Ÿ—šžAЎ,• 20™L;†БВсp8бппяЉ|llŸqљ‚�IV Š2(ЅЈ–5ЅЊЊ@SЈš]WkФгщДгd2ѕ2ёxќТЭ›7X–]Z\њi О‡,х!Ы$I€,WGВ$@’ШOјu]Ћ „ ‰|ТЖЖЖЊpMЇ8ю/мјmЊfћšVMCmJЊОz8�†BHqЙ\žЊѓкЕ‡џЛ Є^IMЉ&їѕЦВl+!Wu<пзŽDšЖ’[uЉRД&‚šЊ€xО6›<я„Щd^а4-ЭІгщyMгРВ,иЕ3 ŸЯ‚ЁЁo—ЪPпяFЙЬB‘-P+ХEiСƒ*Ьf+Ьf+!0 хВYЮЃ\.Т0ŒЋL8~gddфd,Ћй^2™Т‡ЦL2‰‹‡рtкkо—Ы@4ƒaААX „…Ў—Ё(HRV+CччgћШєєєхбббъЌГs-†‡пFwїS ЙЅа4€чАйжРщlƒЫ€гйЛ} xОkзЖu]'”в?Яž={'•J5€м.†‡п‡нn­Ћ@з–Е€уlАй<pЙАZнр8М^ УЅ”Ъ�nнКЕїаЁCЩf•`6Г „4ј+%@AЉ]WAЉJ)xžKнЛ7ё�Ъ–щуЩЩЩ†††„f"ѕFHeЈЊ‚RЉQЬ@ц!ŠYxН-ЅTjvŸ(f%р‰v=55ѕe<OpЗћ№сУЎџЈvWEЩCгDЈЊBXtvЖ—сбЩdђЮехЩеўR‘HdO"‘˜Мџ>§?kk[Gню Лh4кѓИЃ#ВЅžз АдЬ›6mњъШ‘#џ\П~н(‹ №ХХEъїћi,ЯGЃнŸ07c5§щЏЄ‚y:МрѓљЖy<žзыѕщКnd2™AІчццЎфrЙЫ”вGЋ1ў,пёТюo(Х����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/autoclose24.png��������������������������������������������0000664�0001750�0001750�00000001541�11040141030�022057� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������ўО K���sBIT|dˆ��� pHYs��У��УЎ`Zї���tEXtSoftware�www.inkscape.org›ю<��оIDATH‰­еMˆеeЧёЯЙ3щЬѕeЌШj G[ ‘ ‘уˆHэІZ4аЫ"ЂM‹0Œ 7l‘mZЙˆб ŠJ“šЪї+*t3Q-4БœœЙЇХНъюм)9pр<Яyў_Юљ=џчy"3-ЂЇ„70œйџœKДRƒЙGё$z/: бг‚MЕсШЌU+НО<+рˆž…(jКcVРx�Wжтуи7[рюBќ~fж/!ЂCDЃŸ Žш‰ Zзц6f~sK8КЮЋЇqŸˆ "VўWХ7ЗЕ•Џ*Ь5ЎЃђ"Nцй!™b юБ[Фу"ЪSРsч^vЯќљ-EТ4pФзwc‚ьЭT•)sTцfЌGћEє‰(• ГѓкѕccggG.“лp<ГышДF2ЧeОƒUИ•"zJMMЅ;GFІ€ЧЇ~9|;N’/4–ш‚н€[БЛ„kZ[чЬ›˜˜,.8S`ё9Й)ГыDC\Ф"оТ^М†-ЭИnоМuрП/†•Чˆ?XМkшУи\эШ*™‡ эхђ““•тђSЕjЛ‰uLЌЬМщlАлБЯуu™чЮЇ›‘­­sLL\�џ”й?\ ѓM fЎљЋA­яb%Кd~[Ÿ,сч;0>~ŽъІНR-шЫЕ8ЦфS %  ЇAЯƒ‡†Юl(UЇ;2ћЗEьmЇД8œй§л р}шё`Уl–ЫЙtщЇЩяЩ#ехЋћјž= 2SCgE’Щ?ЩѕyЙqу`іѕe65e2ОЬ{н TјbљŒа‹№j№IS1W24ДШ’%T*АуWW?Ќўe ЊБGjЃXVL7лКuГОО—ДД0:њЩmОьэŽЕОык0ПцmXTѓ,Gд8ЧTя№‚Це–J'Я$Їjэ§Ÿ&{’Ї“…ѕ2Х”ч?ЂЛpy­В&еuт~Ф~)ˆzћ‡Џ`6:кЄ����IENDЎB`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/new/3dx.png����������������������������������������������������0000664�0001750�0001750�00000001765�11036662152�020443� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������!-���sBIT|dˆ��� pHYs��€��€ќј>ѓ���tEXtSoftware�www.inkscape.org›ю<��rIDATH‰…•[h\U…П}Юм23™[h&ЇІ!Ь)Ђ$F x•V)ЈЈDhћ ЂЏ Jе‡Ђ ёЁ%>+јЂ"$m ŠPP €и—XL‹RbMf’щ\ЮђсЬLЮмъ?{fэuжк{џћ?ЧHЂgܘŽP`’ ‡Љ’Рт*>Ўрg•Xб?Н$LWƒ“фЮPхUD� š�Їхw?‹<С{|Јэџ7xвЅЪeF[„6oКЛкР№kњЎЗСНf?o#ЌqЏp7LuДЦY~зЛSц%іјВEМ}•№7Pьz†ъi<&/pMпюLš4~ЁFКЫЊмБTЏв�AРXlвЯ§lhЫ58h–1mŠyЧ*АьvОs|4k9р7‚юV+6(д Y†wQошv'Ѓtђ€<‚Y: ŠЗ~є~}^ bguШЃc–бšiђgœш#љаW ћ<иї= †,ЃAлjС,аR$(йж9—*жAAЛ [ G=}нУрГlJzhLыSЃšˆ†šјн~[ЪФ/[Р8И <,iрR§ ?�žяUЪXdфЧ9žK7с?*5ўŒ…[Рzћ3Iрuрžњџ3Р›Щp •м„L†“:˜j™к‹…6,`мК Ќ РљSмлJ_›A$ƒqN№У­BњЩЇу?!8с€ёœыщz ц=и$H3ё–Lg“š™бфшќьУ9iцСЦКzЊЧœm€d[*f“]9KЧєЩ‹Ho‘^žw;й˜%рY€ЋР5`Т-ќ`X'“рR4QHEм1І(С]щiљknўЛЬЧŸk4п)рW`0‡лк]УVЅЪуADƒ ЛQˆ`З {eиолЂxћ4К[кҘ“Рr/эfьV xvJђƒmƒу@ЁЦ@Й ;Ѕ“,ўИЕoрšœЧ˜9р;Jач‡€l5Ч]uШчTjs|ўѓљНѓ‹fЬгР"pЈЇ‰пvЯ?†ў>З7Оы^cхЪJ WRgBD0/Ј6^ri)–ВЉЊrщyGКiuџшяя& LžЗнєYЋTj7zIќplЬuРgˆЄ����IENDЎB`‚�����������mricron-0.20120505.1~dfsg.1.orig/btn/mini.svg�������������������������������������������������������0000664�0001750�0001750�00000032411�10713576170�020120� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg2256" sodipodi:version="0.32" inkscape:version="0.45.1" width="128" height="128" version="1.0" sodipodi:docbase="C:\mricron\html" sodipodi:docname="mini.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape"> <metadata id="metadata2261"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> </cc:Work> </rdf:RDF> </metadata> <defs id="defs2259"> <filter inkscape:collect="always" id="filter3324"> <feGaussianBlur inkscape:collect="always" stdDeviation="3.8223414" id="feGaussianBlur3326" /> </filter> <filter inkscape:collect="always" id="filter3502"> <feGaussianBlur inkscape:collect="always" stdDeviation="3.1080325" id="feGaussianBlur3504" /> </filter> <filter inkscape:collect="always" x="-0.068783067" width="1.1375661" y="-0.11711711" height="1.2342342" id="filter3528"> <feGaussianBlur inkscape:collect="always" stdDeviation="3.5630003" id="feGaussianBlur3530" /> </filter> <filter inkscape:collect="always" id="filter3740"> <feGaussianBlur inkscape:collect="always" stdDeviation="2.7552379" id="feGaussianBlur3742" /> </filter> <filter inkscape:collect="always" id="filter3886"> <feGaussianBlur inkscape:collect="always" stdDeviation="4.6432082" id="feGaussianBlur3888" /> </filter> <filter inkscape:collect="always" id="filter4027"> <feGaussianBlur inkscape:collect="always" stdDeviation="3.4304274" id="feGaussianBlur4029" /> </filter> </defs> <sodipodi:namedview inkscape:window-height="870" inkscape:window-width="1240" inkscape:pageshadow="2" inkscape:pageopacity="0.0" guidetolerance="10.0" gridtolerance="10.0" objecttolerance="10.0" borderopacity="1.0" bordercolor="#666666" pagecolor="#ffffff" id="base" inkscape:zoom="0.75061011" inkscape:cx="447.21723" inkscape:cy="-211.51769" inkscape:window-x="44" inkscape:window-y="0" inkscape:current-layer="svg2256" width="128px" height="128px" /> <g id="g2187" transform="matrix(0.1391938,0,0,0.1544313,1.9456067,-0.9518683)"> <path id="path2277" d="M 470.26695,122.56853 C 365.28205,122.51433 104.26695,154.59979 104.26695,154.59978 L 61.829448,179.25603 C 61.829448,179.25603 21.863248,302.11966 17.423248,430.88103 C 12.983148,559.64238 44.079448,694.3185 44.079448,694.31853 L 132.86075,749.56858 L 318.36075,735.75603 L 674.54825,734.75603 C 674.54825,734.75603 766.33255,519.66619 785.07945,464.41228 C 803.82635,409.15837 720.92325,186.16229 720.92325,186.16228 C 720.92325,186.16228 575.90705,127.97069 489.07945,123.03728 C 483.59105,122.72894 477.26595,122.57214 470.26695,122.56853 z M 452.54825,307.53728 C 520.08425,307.53729 574.89195,359.02356 574.89195,422.47478 C 574.89205,485.926 520.08425,537.44353 452.54825,537.44353 C 385.01215,537.44352 330.20445,485.926 330.20445,422.47478 C 330.20435,359.02356 385.01215,307.53728 452.54825,307.53728 z " style="fill:#aeaeae;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path3506" d="M 609.43985,154.60357 L 716.98765,188.15059 L 733.76115,227.61767 L 666.66715,190.12394 L 609.43985,154.60357 z " style="opacity:0.21666667;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3528)" /> <path id="path3336" d="M 66.767548,182.23053 L 53.940748,220.71093 L 75.647648,195.05733 L 85.514448,218.73758 L 128.92825,182.23053 L 275.94305,153.61689 L 329.22365,160.52363 L 379.54415,131.91 L 171.35535,149.67019 L 102.28795,158.55028 L 66.767548,182.23053 z " style="opacity:0.11111109;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3502)" /> <path sodipodi:nodetypes="ccscccsssc" id="path2281" d="M 467.79528,122.93964 C 283.97738,122.93964 131.89205,254.99623 131.89195,422.47478 C 131.89195,589.95333 281.07405,725.881 464.89195,725.88103 C 648.70985,725.88103 797.89205,589.95333 797.89195,422.47478 C 797.89195,254.99623 651.61318,122.93964 467.79528,122.93964 z M 474.76695,238.47478 C 587.23635,238.47479 678.51695,323.3403 678.51695,427.91228 C 678.51695,532.48427 587.23625,617.34978 474.76695,617.34978 C 362.29765,617.34976 271.01695,532.48426 271.01695,427.91228 C 271.01695,323.34031 362.29765,238.47478 474.76695,238.47478 z " style="opacity:1;fill:#009990;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> <path sodipodi:nodetypes="ccscsc" id="path3330" d="M 466.52265,725.68157 C 299.87515,725.68157 162.26495,611.74002 142.65745,468.59724 C 156.42695,468.85724 228.20685,714.18323 470.91455,708.76876 C 731.14935,702.96329 765.39815,528.42344 778.72845,487.00424 C 793.92915,472.92559 792.19825,449.23943 791.78785,460.80489 C 786.85445,600.80324 635.75525,722.72157 466.52265,725.68157 z " style="opacity:0.46111109;fill:#030103;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> <path id="path2294" d="M 474.76695,238.47478 C 362.29765,238.47478 271.01695,323.34031 271.01695,427.91228 C 271.01695,532.48426 362.29765,617.34976 474.76695,617.34978 C 587.23625,617.34978 678.51695,532.48427 678.51695,427.91228 C 678.51695,323.3403 587.23635,238.47479 474.76695,238.47478 z M 451.57945,320.34978 C 508.22255,320.3498 554.17325,366.55931 554.17325,423.47478 C 554.17315,480.39023 508.22255,526.56853 451.57945,526.56853 C 394.93625,526.56852 348.95445,480.39025 348.95445,423.47478 C 348.95435,366.55928 394.93635,320.34978 451.57945,320.34978 z " style="opacity:1;fill:#c0c0c0;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> <path sodipodi:nodetypes="ccccc" id="path2315" d="M 306.76523,520.33116 L 426.88496,525.12996 L 489.56056,590.7715 L 308.50345,604.52828 L 306.76523,520.33116 z " style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path sodipodi:nodetypes="cczc" id="path2279" d="M 108.20795,428.89977 L 60.847448,441.72657 C 60.847448,441.72657 62.080848,351.44563 72.687648,282.87158 C 83.294448,214.29753 104.26125,154.60357 104.26125,154.60357" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path sodipodi:nodetypes="cccccccc" id="path2309" d="M 751.52135,549.27437 L 751.52135,585.78141 L 720.93435,613.40837 L 561.09275,608.47498 L 530.50575,581.83471 L 526.55895,504.8739 L 735.73455,535.46089 L 751.52135,549.27437 z " style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path2311" d="M 531.49245,578.87467 L 384.47755,555.19443 L 452.55825,591.70148 L 562.07935,608.47498 L 531.49245,578.87467 z " style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path sodipodi:nodetypes="ccscsc" id="path2317" d="M 463.7235,127.87852 C 297.076,127.87852 157.53025,237.94896 137.92275,381.09174 C 149.7567,345.02397 227.41885,129.58569 470.12655,135.00016 C 730.36135,140.80563 760.66345,321.26554 773.99375,362.68474 C 789.19445,376.76339 790.39498,394.5644 788.9887,383.07743 C 772.44198,247.91796 643.8095,127.87849 463.7235,127.87852 z " style="opacity:0.3;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter3324)" /> <path sodipodi:nodetypes="cccccccc" id="path2305" d="M 382.50415,501.91387 L 365.73065,482.18033 L 629.38633,496.56043 L 711.06765,535.46089 L 683.13773,575.61175 L 547.27925,561.11449 L 541.20784,513.4511 L 382.50415,501.91387 z " style="fill:#848484;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path3328" d="M 634.10685,520.66073 L 384.47755,500.92719" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path sodipodi:nodetypes="ccccc" id="path2313" d="M 384.47755,555.19443 L 382.50415,500.92719 L 532.47905,511.78064 L 529.51905,578.87467 L 384.47755,555.19443 z " style="fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path sodipodi:nodetypes="ccscscsc" id="path2275" d="M 108.20795,429.88645 L 321.33025,431.8598 C 321.33025,431.8598 337.11705,439.75322 330.21025,528.55414 C 323.30355,617.35507 322.31685,735.75631 322.31685,735.75631 C 322.31685,735.75631 315.41015,749.56978 303.56995,750.55648 C 291.72985,751.54318 134.84825,750.55648 134.84825,750.55648 C 134.84825,750.55648 107.22135,642.02201 112.15475,556.18111 C 117.08805,470.34021 109.19465,428.89977 108.20795,429.88645 z " style="fill:#b4b4b4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path sodipodi:nodetypes="ccccccccccccc" id="path2307" d="M 629.11678,496.99938 L 634.16352,520.67963 L 650.13935,527.56747 L 657.93823,541.41875 L 672.64392,548.28769 L 680.53732,575.91464 L 826.11952,576.84462 L 834.90434,548.2665 L 848.05259,541.93894 L 855.42734,528.18433 L 871.55888,521.89313 L 877.24515,498.95384 L 629.11678,496.99938 z " style="fill:#acacac;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path sodipodi:nodetypes="cszccc" id="path3534" d="M 47.034048,692.34253 C 47.034048,692.34253 20.147048,566.78788 28.287148,529.54082 C 36.427248,492.29376 39.880548,565.8012 60.847448,582.82138 C 81.814348,599.84156 106.23465,589.72812 106.23465,589.72812 L 130.90155,745.62308 L 47.034048,692.34253 z " style="opacity:0.05;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3740)" /> <path sodipodi:nodetypes="cscscsc" id="path3744" d="M 117.08805,589.72812 C 219.70245,717.00945 313.43685,599.59489 319.35685,628.20852 C 325.27695,656.82215 308.50345,721.94284 308.50345,721.94284 C 308.50345,721.94284 290.74315,737.72967 280.87645,738.71635 C 271.00965,739.70301 138.79505,740.6897 138.79505,740.6897 C 138.79505,740.6897 123.00815,684.69578 118.07475,644.98203 C 113.14135,605.26828 117.08805,589.72812 117.08805,589.72812 z " style="opacity:0.04444442;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3886)" /> <path sodipodi:nodetypes="cccsccc" id="path3890" d="M 473.78025,229.59469 C 434.90905,229.59469 314.69695,282.2284 294.64115,319.47409 C 290.33955,354.11247 349.78446,363.88688 360.04246,359.01822 C 377.76996,330.10206 409.13294,310.56167 463.43924,312.53502 C 509.92934,314.25561 528.74162,338.97444 542.10032,364.69155 C 595.00092,374.15948 643.67325,321.97478 643.67325,321.97478 C 607.04255,271.60155 544.05705,229.5947 473.78025,229.59469 z " style="opacity:0.13888891;fill:#646464;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4027)" /> </g> </svg> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/magichat.png���������������������������������������������������0000664�0001750�0001750�00000001560�11036666304�020725� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������ЪЧЬW���sBIT|dˆ��� pHYs��h��hHој���tEXtSoftware�www.inkscape.org›ю<��эIDAT8•‘MhTW†Ÿ{чЮLgb†Q1 Ж f‘d†h …T‚RЌ˜2н(˜JКtск],Кqc;…RФBE.’.ZЁа(ДыO)ЩаNL2:цŠ‰ЮŸ™Пяž{OvBбЄФgsоїс}ПѓЁЕfЅћХ№•ƒЋiZkLV9"ъдБЃпДЏІЏ&Пл"ŽъQGо Q Ы*.|ў– ›АЌ2Ч_эJ&ї}Д&№ќЗ?Dдў` ŒmGYzщ;К&PDэQ­™ЬVRЉН\Кы]ш8NЊttЄЩхZQЁаg;_їYЏ?4nтР'зйАс1uщ •кŒˆў\5ёЛѓ7wh]щ|YQЋYфѓADžЇџ7QD%*cЃуz;ј§ЎH н0>аzфюЉызџ= ŽЂVїШf#8Ђq›ђаŠU/І~ эьљЁ/Ÿ@DсК‚ы:Фу‹MЫ a o€›кюіљъОb)М ž;ї3'ONбл›xи§ЦŒЙ\G_:=Фф”…HPx‰ЅŠI$Ђyё"аД~0Дж�|ЫкѓХэ>k’‰‰0ЖЧШ1?яQ*љё<р)№Ўж#žpљт­˜rdћСCпcšJЅž< зЈеТM`3А7џ]УЇІYЦu5`BбЂїУGœ9ѓЇOЇ ‡—ЖYїеŒ"*Q,†эgqБ@&у‹=Іб0ё<ЈV}џЦР уЦЕ_#Ж]x>oќЖgaс9relЛ@{ЛЭЬL mm ‚AЩЩHю7EдхQtХІКХЦEDїяGimU\Иpсс4лЖU—ыš"*!ЂQФуБkW–юnѕjП›LOЏуйГw(§M№}KDѕ‰Ѓ№ЈsћvŒЎXƒl6„ыz�<xхьйNццZаšр+ i‰ЃКEдўj…ў‡г[КЧЧ§Б™йВ*.А<œmЩ�?7ЕQ�џ�!~,&wћf����IENDЎB`‚������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/info.bmp�������������������������������������������������������0000664�0001750�0001750�00000003036�10672754332�020101� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BM������6���(���������������ш������������������ўўўўўўўўЬЪЬдТФмКМмКМмКМмОМЬЪЬўўўўўўўўўўўўўўЬЪЬдТФьЎЌќžœќšœќšœќšœќšœќšœєЂЄфЖДЬЪЬўўўўўўўўўўўЬЪЬьЊЌќšœќšœќšœќšœќšœќšœќšœќšœќІЄќЊЌќВДфТФЬЪЬўўўўўўўўдТФєžœќšœќšœœZ\ŒRTŒVT”VT”Z\”VT”Z\„^\МŠŒќОМќОМьТФЬЪЬўўўўўўдТФќžœќšœќšœќšœДjl”Z\D*,œrtдЂЄќЪЬќЮЬќЪЬєЦФЬЪЬўўўўЬЪЬєЂЄќšœќšœќšœќšœќšœќšœЌjlќЪЬќвдќкмќкмќждќвдфЪЬўўўўфВДќšœќšœќšœќšœќšœќšœќšœМrt ќвдќомќцфќъьќцфќкмќЮЬдЪЬўўЬЪЬќžœќšœќšœќšœќšœќšœќšœќšœФvtќждќтфќюьќієќюьќтфќждьЪЬЬЪЬўьЎЌќšœќšœќšœќšœќšœќšœќšœќšœФvtќвдќкмќтфќцфќтфќкмќЮЬќТФмЦФўьІЄќšœќšœќšœќšœќšœќšœќšœќšœМrtќЦФќвдќждќкмќждќЮЬќЦФќКМмТФўьЊЌќšœќšœќšœќšœќšœќšœtFDD&$ ќВДќЖДќКМќКМќКМќЖДќЎЌќІЄмКМўфВДќšœќšœќšœќšœќšœќšœфŠŒЬz|Дjl”VTlBD<&$ ќЂЄќЊЌќЎЌќЎЌќЎЌќЊЌќЂЄќžœдТФўдОМќšœќšœќšœќšœќšœќšœќšœќšœќšœќšœќšœќšœќšœќšœќžœќžœќžœќžœќšœќšœќžœЬЪЬўЬЪЬєІЄќІЄќІЄќІЄќІЄќІЄќЂЄќžœќšœќ–”ф†„ьŽŒќšœќšœќšœќšœќšœќšœќšœќšœфЎЌўўўмТФќЖДќЖДќЖДќВДќВДќВДќВДДvt d:<ќšœќšœќšœќšœќšœќžœќžœдЦФўўўЬЪЬєТФќТФќТФќТФќОМќОМќОМ4*,ќšœќЂЄќЊЌќВДќВДќВДфОМўўўўўЬЪЬєЮЬќЮЬќЮЬќЮЬќЪЬќЪЬЌŠŒ\FDќТФќТФќТФќТФќТФьТФЬЪЬўўўўўўЬЮЬєждќкмќкмќкмќждќждєЮЬмЖДьТФќвдќвдќвдќЮЬќЮЬфЪЬЬЪЬўўўўўўўўўфждќцфќцфќцфќтфќтфќтфќтфќомќомќомєждмЮЬўўўўўўўўўўўўЬЮЬфкмєцфќюьќђєќюьќюьќюььоммвдўўўўўўўўўўўўўўўўўЬЮЬдвдджддвддвдўўўўўўўўўў��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/icon.png�������������������������������������������������������0000664�0001750�0001750�00000007537�11041137602�020100� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���@���@���Њiqо���sBIT|dˆ��� pHYs��ц��ц ЅŽ���tEXtSoftware�www.inkscape.org›ю<��мIDATxœэ›yеyРЏЇgzюsoI 0$Ьa$&%ŒС8‚+–qB9P1NРIчИr ;ј(•ЉЄB\‘’‚ВBРТ6H"J XTFBчJ{Џfчи™щ™žщю—?^Яюьj…vYЩ›”ѕMНъЉнЉйї§оwwЏRђы,кbo`Бх,€ХоРbЫY�‹НХ§ }Џ˜г'$‹ž‚N'�бrm]3EЂT—3~Ж(r:�Д*ЋyЫзђОеЭ$Y\кpшУe9рв„В Ф Ё™JыођР…CМи˜4Sъ€э-—щ0~%ђa�ДžИ№S$€ŽA„ uТa @G y&o:PЌд]АlЈЧСbvg Ъ|Д*ЎЃ  ФpˆП.^Пp—иЕЮТъЊЫzЪN(HА$8ž’ЉўфoЖйнoь"ѓЦ.–ч ШКEОn‘w]rBPˆD)Ў\Э№эŸ!›€к[`Џ‡г c>�”ЙDчќžтQ$$‰cK"~rуКЮЦ>7,УD�]ъ!Rт ‰цњаY%e} і;Ž0‘ІR†rЬ TMАъ`YPЋсИ.НAƒ?z%[иШўЅqЊ@pHЙ@sаŒф­ЇЁNtЏшН№Yэй/ZXЋc2ІGD„ Ё Ÿє5НшвOPЎХ+РгТЌ)o‹RєQЉ€Y…К†QЋ*0ЅXtл–.хЧ~—]nžъЎх46LЙЫiашšЇRиtlбЖмК}їЦD,œ A˜0�ЎtБ…ƒƒ&5‚,!Цoa аPЮ^L*Н5J;"T*P­BУззлFj5cb*e†CAўщсoђјњ5<žющ0=аAˆmGЃч§€llˆЦе‘!Nœ A44,iQLiRUВ@ћˆŠe„%š–^D”TžqЈМЇcYJqWN™ŸЄ ŽЋ`˜( P`0ц[?Щ–sT<Ўsїы“�hU>@™Q@ћNwчЧžЯ§MŒX{FfˆУ/ќ СYЁ фЩSЄH™2’%јиDЂђd�аЄŠl  жЈ`ўiЛBПBauѕљ@x4ЄT€ъu(—!—…‰"НkЏц7}›=(Уš“5Ь`Кђ*ТЇ€ŽмжmgћWг"MЫ4"шшии˜ТЄH‘9ВоЋ@AЎмˆрюЩ"A^БрE1Ј 0_ЁvˆD н‰$Фb`3@�ŽЃf!Ѓ#TbQўњљ­lAЅYgО�NTОNЮ'Е'oэНвN{ EŠ!‚КЌS%ђфЩ’eŒ1Ž‹уфež &0…I‰Є!ла„чSRETŸPV НcЋUsT—Ѕqlа§B*i‡xј4&Ќ”*h–&`dL“лКƒћгP9„™�šURо"ЎЭњцЯ’‡ОдA‡–’) a ЅЄJ•"EВТSœуdЩ’'O‰І0ЉSЧхЃИь<ЁtlжЬM?wQЎ`Џ�ЛO)чгеЩЧ“аб н=аж‘(шКrP*гф‰џќ9л„“КCk/0эK„ Ф §iїщO”яы’]ZB$ Aƒ rфcŒ1֘#'sD jдhаРСAђБЩЈtЊŽЩмыMфaЄлK‰Е”K0Q€вRшъVЎa•5Ё€DЃаН†ИїŽЩ=ѕЖƒy2ЭFЅЉМ Ч эgюЯЎй-voьО8qtЉca‘#ЧCG9Тњшc€FХшЄпЗpY3Yл6—j дjД,pЏSŽG­№J04ћ`h�&Š єj ŸOХŽюа|ќх]З№РЈJпГЮ>Z(ПЏC#ѓЖѓі%лФЖ‡гЄƒqтј№QUВ"Ы ƒє‰>њшЃŸ~F!GŽ%ЊT[NОљZ;љgїгŠ~щНїе˜-99ŽЊВYш;ћіЊk>ЇRу41шY vƒoмs;w Јю„іМJšЇF#йЇѕ-J{ъ‘ЄL&$абЉQcœqф(G9Ц1dLŒMšН……‹;ЉКJ"—ЬšH@6ЗW œќsR);сYУЁ§pф0ŒgU)]Ѕ‘юƒh z– •Š<іхЯђ)T=3MєI�E ‚Dё‘ўОі§? юI‘ТР NМШ3Ь0b€9B–,EQЄJ•:uЯд]O™жуЛe\ѓЂqЪИŽ*“ГЧ•e8^е˜iSASh*&ФаНџР1Оѕў0Џ^дMž–xаД�?A4b[Е­kkд>ž–iТ„RPЦх8У 3,‡ЃфЩРЉЗЪUѓS`ќд�@YCНЙq8z‚Б10]w*0&LrС—яхоО>ДИТд0#Œ іЊxѕ )™QЂртbbRrЈ(_–eЊbъфgW|�^ ЯљЃЭ ‡c}pф Œ*ыУPЕ„Yс/оx— -Бщ>Рш§чт bФ@т’$@,Ц–IЗх%‘гЎъ§к“l§$тZ№ЦмДB(ІњcЁЉтЩ‚цѓ Њ4эџА‰ЏмqсХлV�њOХOW/•экub9чбN &›@ЙФUTi`bRЄЪ&§˜єar“§˜f‹Uм0Чт|tчЭ @+„‰" іƒ?��d2Њ—№ •‚ё,ї}эQўё_чp€’:ОeхќП—:ƒ$Њ„Љ1@�„„ёЁХ%Š’€Ыe“Im*ЙхТо2GјъGRМ“2А8EпКkоэ4БmaЈ"a!Mƒp’)ТЏНТmo}ЧVƒЋq�Эі_ЙK^m`xлГg,ЧЫ13gЭ ъGЅк ЊsŽ’rК1V…ЙvMлЃуЊь~sЦъ'ЏLяZ€ж˜0<љМš-€ ˆ‘д,>бщЙПЦžF7nHНG›ЅZ’–eЁк”ˆцHnŽтЖфs?ш+BЌZГ„mЉ�§Л‹м6jMQ…" � ‚eA.уЧН€(•ƒ€фZЇˆёˆзJHРс№с[„е ўfIШy+€ЊЄЎС\Нк=ЁюPт‡Ь• žMєїјэlUx>кЦЎ ІЉ TЭЉŒ0 "uџНЌYB\ЎПО“Bсr9b[Ћ kнW*.dDsъЄ1eъякМ2ѓоШ)Ф™Ы“<gУјžзmZСћ>Uд,TšЎ`šЊVp%hbjШ22Р5рeьмљ;„У‚; о ћECw‰<� ­bdIј6qђyЋщїяš�’)ЋюцT,tШј“lы‚пэ†нЃjѓ †рNU‰Э-k>—ф+žH,ы“8МїžŠ†AЯw ь іўЈСЪ‹j jЈXаМ›е*3OпГ�€Mpю)*;x–œ/рЎ№в€:Й…ˆЪя5Џч-?sЂы™Š?=8ŽšI›&L” ŸG?cхš"GЌ0n7•ŸЭI› n&oњ”ŒŒzЇЏ�Чдлd7ќЧ:Иѓ|/`-@yнЁђ{1ЃД%hВCae{uK…Юjj5Юћvƒиr‡о—$Ю<Ѓ”ЕѓƒŸўиLЖСцп€?П№УCа4Ѕ|2 СgLЙ’ъ+Џ€†hSПѕІŽЃ* лžlГƒ.—п$‰Чaп&ш/Эq'kПЧ? [<о~ŽQ_ ўю*јуѓUE7iž~"ЉцˆЁЪwUдЊЪ№књѕШц )iB˜ЙšbТХaY†я†=яBюƒ|5”ƒ_ўїьП{xogJqŽя6ˆќ§Zјt MsMSOGЄв*ш дщ[5(—Бoњ4;�Љ!eи7їЏŸ’юТЅ—Cк€ЪUАg3М{J3ќЊ/РЫЇ‡ЇпчФxZіЂJ аџz,ŸшЧГ‰^нŸ†Ž.BѓВmЋЙЂпЯюљ Ѓ ,�рпчЃјlй—~.;b:д.…ƒТлџ{FЧљј ьзЦ}У‚;Я3ћРкŠР~Tвб!йпЙhnЎрѓ:ПЮ.HІ КЃTЉ@>GёѓwёЭnѕэRХ…ˆЯ7,ФŠ7ЧЗXЦaю Р' r)чаIІЕX@;p+Эш„<ы~ Џч˜u^ъєC!Xv.ЌМDMކЊ Ћ& "}=ўпыVЖ&Їпт3Ре@‡їЇ3оJ{з3іTYŽЫчfЊ\УyЁвзЖ‘К,ˆP†яlƒ(SžM4M™ўХЋрќъn(хQOЦyј{[јч”ЪбЬчљ�!ТРР`Еw͘3ХчƒeЫрц›‘‰NЬZ‡unћФџlј—ёqz€e-ы [гавИp%єє(—ЉзЁTbќЂ•<№Шзxё$хѕЊœцѓ””&№КЗ”‘�>м\sдžЧQѓяD8LDЙ,ѓf!›нАе‘M!а–ДЗБ"e•ЯGЗыЂgкйїЗ›x)гI. еѕ3"ЯТž“Вl6#ФJр€ЛЮ}oSЊUиЛ–.Uƒ=з­s’~QJlрш3Я0АvПˆ‚_‘žКї2ыmѓгgОRюEЪП–Ђbќ/ќŽЃЃазЇ1Œ—9ХЭЮ p–ƒехДЊ,šдЬюыRЪ3Г@HјЌ„о“”Vs[š&egЇ”ыж“ФOї>Я€щ n—А}ъђœs~SJ•Еў˜c•„Ч$ц /сІ3ЕЇ…<)њсEˆp №T kЎvT8 �л€­Ј tfЖВ(�ўЩЏ§џ œАиXl9 `Б7АиrРbo`Бх,€ХоРbЫY�‹НХ–џыЖ—ЂТ‡"l����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/dti.svg��������������������������������������������������������0000664�0001750�0001750�00000630541�11040142772�017743� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg1141" sodipodi:version="0.32" inkscape:version="0.46" width="210mm" height="297mm" sodipodi:docname="dti.svg" sodipodi:docbase="C:\Documents and Settings\Chris Rorden\Desktop" inkscape:output_extension="org.inkscape.output.svg.inkscape"> <metadata id="metadata413"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> </cc:Work> </rdf:RDF> </metadata> <defs id="defs1143"> <inkscape:perspective sodipodi:type="inkscape:persp3d" inkscape:vp_x="0 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" id="perspective448" /> <linearGradient id="linearGradient1280"> <stop style="stop-color:#ffc000;stop-opacity:1.0000000;" offset="0.00000000" id="stop1281" /> <stop style="stop-color:#ff0000;stop-opacity:0.50000000;" offset="1.0000000" id="stop1283" /> </linearGradient> <linearGradient id="linearGradient1271"> <stop style="stop-color:#ffc87e;stop-opacity:1.0000000;" offset="0.00000000" id="stop1274" /> <stop style="stop-color:#ff0000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1279" /> </linearGradient> <linearGradient id="linearGradient1270"> <stop style="stop-color:#ffc000;stop-opacity:1.0000000;" offset="0.00000000" id="stop1271" /> <stop style="stop-color:#e84a50;stop-opacity:1.0000000;" offset="0.50000000" id="stop1273" /> <stop style="stop-color:#ff0000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1272" /> </linearGradient> <linearGradient id="linearGradient1608"> <stop style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.00000000" id="stop1609" /> <stop style="stop-color:#9999ff;stop-opacity:1.0000000;" offset="0.50000000" id="stop1611" /> <stop style="stop-color:#000000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1610" /> </linearGradient> <linearGradient id="linearGradient1563"> <stop style="stop-color:#898bdc;stop-opacity:1.0000000;" offset="0.00000000" id="stop1564" /> <stop style="stop-color:#000000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1565" /> </linearGradient> <linearGradient id="linearGradient1547"> <stop style="stop-color:#9999ff;stop-opacity:1.0000000;" offset="0.00000000" id="stop1548" /> <stop style="stop-color:#9999fd;stop-opacity:0.00000000;" offset="1.0000000" id="stop1549" /> </linearGradient> <linearGradient id="linearGradient1391"> <stop style="stop-color:#ffc000;stop-opacity:1.0000000;" offset="0.00000000" id="stop1392" /> <stop style="stop-color:#ff0000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1394" /> </linearGradient> <linearGradient id="linearGradient1111"> <stop style="stop-color:#e8e838;stop-opacity:1.0000000;" offset="0.00000000" id="stop1112" /> <stop style="stop-color:#ffff7f;stop-opacity:1.0000000;" offset="1.0000000" id="stop1114" /> </linearGradient> <linearGradient id="linearGradient1274"> <stop style="stop-color:#ff0400;stop-opacity:1.0000000;" offset="0.00000000" id="stop1275" /> <stop style="stop-color:#fd6972;stop-opacity:1.0000000;" offset="0.0099999998" id="stop1277" /> <stop style="stop-color:#ff0000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1276" /> </linearGradient> <linearGradient id="linearGradient1205"> <stop style="stop-color:#ffffff;stop-opacity:0.9;" offset="0.00000000" id="stop1206" /> <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1.00000000" id="stop1207" /> </linearGradient> <linearGradient id="linearGradient1172"> <stop style="stop-color:#ffffff;stop-opacity:0.3;" offset="0.00000000" id="stop1173" /> <stop style="stop-color:#ffffff;stop-opacity:0.8;" offset="1.00000000" id="stop1174" /> </linearGradient> <linearGradient id="linearGradient969"> <stop style="stop-color:#ffffff;stop-opacity:0.70196080;" offset="0.00000000" id="stop970" /> <stop style="stop-color:#9999ff;stop-opacity:0.70196080;" offset="1.0000000" id="stop971" /> </linearGradient> <linearGradient id="linearGradient684"> <stop style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.00000000" id="stop685" /> <stop style="stop-color:#9999ff;stop-opacity:1.0000000;" offset="1.0000000" id="stop686" /> </linearGradient> <linearGradient id="linearGradient671"> <stop style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.00000000" id="stop672" /> <stop style="stop-color:#ffffff;stop-opacity:0.00000000;" offset="1.0000000" id="stop673" /> </linearGradient> <linearGradient id="linearGradient594"> <stop style="stop-color:#fffbfb;stop-opacity:1.0000000;" offset="0.00000000" id="stop595" /> <stop style="stop-color:#0000c0;stop-opacity:1;" offset="1" id="stop596" /> </linearGradient> <linearGradient id="linearGradient1155"> <stop style="stop-color:#fffbfb;stop-opacity:1.0000000;" offset="0.00000000" id="stop1156" /> <stop style="stop-color:#9999ff;stop-opacity:1.0000000;" offset="1.0000000" id="stop1157" /> </linearGradient> <radialGradient xlink:href="#linearGradient1155" id="radialGradient1158" cx="0.21874997" cy="0.23437454" r="0.70745194" fx="0.21874997" fy="0.23437454" /> <radialGradient xlink:href="#linearGradient684" id="radialGradient1169" cx="0.77941167" cy="0.65624988" r="0.32758817" fx="0.77941167" fy="0.65624988" /> <linearGradient xlink:href="#linearGradient1155" id="linearGradient1170" x1="0.81756759" y1="0.35156253" x2="0.17567571" y2="0.75000000" /> <linearGradient xlink:href="#linearGradient594" id="linearGradient588" x1="321.4625" y1="541.3602" x2="354.41388" y2="556.75934" gradientTransform="scale(0.8041446,1.2435574)" gradientUnits="userSpaceOnUse" /> <linearGradient xlink:href="#linearGradient1547" id="linearGradient639" x1="0.47535211" y1="-0.11428571" x2="0.58802819" y2="0.96190476" /> <linearGradient xlink:href="#linearGradient1155" id="linearGradient643" x1="0.20312500" y1="0.10687023" x2="0.50000000" y2="0.88549620" /> <linearGradient xlink:href="#linearGradient1563" id="linearGradient670" x1="0.15079366" y1="0.11450382" x2="0.71428573" y2="0.42748091" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient683" x1="0.39084506" y1="-0.06603774" x2="0.59859157" y2="0.94339621" /> <linearGradient xlink:href="#linearGradient1608" id="linearGradient701" x1="0.0035211267" y1="0.42574257" x2="0.98591548" y2="0.42574257" /> <linearGradient xlink:href="#linearGradient671" id="linearGradient703" x1="0.45070422" y1="-0.93750000" x2="0.44366196" y2="1.21875000" /> <radialGradient xlink:href="#linearGradient1271" id="radialGradient704" cx="292.27442" cy="807.81573" r="24.522423" fx="292.27442" fy="807.81573" gradientUnits="userSpaceOnUse" /> <linearGradient xlink:href="#linearGradient969" id="linearGradient967" x1="0.39297354" y1="0.06249970" x2="0.46580359" y2="0.96093768" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient968" x1="0.08771923" y1="0.02343778" x2="0.55263156" y2="1.32031250" /> <linearGradient xlink:href="#linearGradient671" id="linearGradient1138" x1="0.50000000" y1="0.05468750" x2="0.71717173" y2="1.70312500" /> <linearGradient xlink:href="#linearGradient671" id="linearGradient1139" x1="-0.45833334" y1="0.19531250" x2="1.12500000" y2="0.71875000" /> <radialGradient xlink:href="#linearGradient969" id="radialGradient1140" cx="0.11029412" cy="0.06250000" r="1.26334059" fx="0.11029412" fy="0.06250000" /> <linearGradient xlink:href="#linearGradient1172" id="linearGradient1175" x1="0.91071421" y1="0.53906387" x2="0.46428558" y2="0.77343899" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient1202" x1="0.16197200" y1="-0.11904722" x2="0.32746491" y2="1.99999797" /> <radialGradient xlink:href="#linearGradient684" id="radialGradient1203" cx="0.77941167" cy="0.65624988" r="0.32758817" fx="0.77941167" fy="0.65624988" /> <radialGradient xlink:href="#linearGradient1547" id="radialGradient983" cx="0.73913020" cy="0.72519094" r="0.22669560" fx="0.73913020" fy="0.72519094" /> <radialGradient xlink:href="#linearGradient1205" id="radialGradient1066" cx="0.76470590" cy="0.76562488" r="0.29453236" fx="0.76470590" fy="0.76562482" /> <linearGradient xlink:href="#linearGradient1274" id="linearGradient1273" x1="-0.019230817" y1="-3.8570047e-008" x2="0.51923072" y2="0.87500006" /> <linearGradient xlink:href="#linearGradient1280" id="linearGradient1110" x1="459.4994" y1="1254.0935" x2="481.37598" y2="1325.9788" gradientTransform="matrix(1.6468933,0,0,0.6072039,-185.20999,91.717409)" gradientUnits="userSpaceOnUse" /> <linearGradient xlink:href="#linearGradient1111" id="linearGradient1118" x1="0.53521127" y1="1.0151515" x2="0.52816904" y2="0.015151516" /> <radialGradient xlink:href="#linearGradient1391" id="radialGradient1395" cx="0.69533569" cy="0.78121674" r="0.68209499" fx="0.69533557" fy="0.76559359" /> <radialGradient xlink:href="#linearGradient1547" id="radialGradient1442" cx="291.17355" cy="815.41846" r="18.939451" fx="290.62314" fy="814.83362" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient1604" x1="0.52343750" y1="0.0076335878" x2="1.0312500" y2="1.1297710" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient1617" x1="0.10920641" y1="-0.40239441" x2="1.2083132" y2="1.9653628" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient1618" x1="0.42672610" y1="-0.31047121" x2="1.0007051" y2="2.1198800" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient3181" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient3271" x1="299.8437" y1="1036.9841" x2="305.62924" y2="1092.2429" gradientTransform="matrix(1.646893,0,0,0.607204,-404.3959,232.2467)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient3289" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient4195" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.646893,0,0,0.607204,-404.3959,232.2467)" x1="299.8437" y1="1036.9841" x2="305.62924" y2="1092.2429" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient4197" gradientUnits="userSpaceOnUse" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient4209" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.646893,0,0,0.607204,-404.3959,232.2467)" x1="299.8437" y1="1036.9841" x2="305.62924" y2="1092.2429" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient4211" gradientUnits="userSpaceOnUse" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient4223" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.646893,0,0,0.607204,-404.3959,232.2467)" x1="299.8437" y1="1036.9841" x2="305.62924" y2="1092.2429" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient4225" gradientUnits="userSpaceOnUse" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1172" id="linearGradient3598" x1="339.63678" y1="379.11596" x2="335.35134" y2="381.36582" gradientTransform="matrix(0.758349,0,0,1.3186542,-197.63622,-8.8758783)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3600" x1="588.89265" y1="195.07545" x2="612.58524" y2="202.90803" gradientTransform="matrix(0.4268666,0,0,2.3426521,-197.63622,-8.8758783)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3627" x1="833.72519" y1="196.49355" x2="857.41778" y2="204.32614" gradientTransform="matrix(0.4268666,0,0,2.3426521,-108.85068,2.4284606)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1172" id="linearGradient3629" x1="477.45044" y1="381.63529" x2="473.165" y2="383.88514" gradientTransform="matrix(0.758349,0,0,1.3186542,-108.85068,2.4284606)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1608" id="linearGradient3646" x1="-196.8662" y1="425.48517" x2="-141.23934" y2="425.48517" gradientTransform="matrix(1.677741,0,0,0.5960396,144.06957,-177.72971)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient684" id="linearGradient3670" x1="326.75421" y1="743.24066" x2="335.31547" y2="852.86278" gradientTransform="scale(1.7571663,0.5690981)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient969" id="radialGradient3672" cx="524.70152" cy="475.22645" fx="524.70152" fy="475.22645" r="111.10576" gradientTransform="matrix(1.075993,0,0,0.9293741,-172.89681,-540.25849)" gradientUnits="userSpaceOnUse" /> <inkscape:perspective id="perspective2865" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_x="0 : 526.18109 : 1" sodipodi:type="inkscape:persp3d" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3657" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.4268666,0,0,2.3426521,490.80166,-298.10221)" x1="833.72519" y1="196.49355" x2="857.41778" y2="204.32614" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1172" id="linearGradient3659" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.758349,0,0,1.3186542,490.80166,-298.10221)" x1="477.45044" y1="381.63529" x2="473.165" y2="383.88514" /> </defs> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.6899736" inkscape:cx="259.81914" inkscape:cy="210.13786" inkscape:window-width="1096" inkscape:window-height="885" inkscape:window-x="2" inkscape:window-y="-2" showgrid="true" snaptogrid="false" showguides="true" snaptoguides="true" inkscape:current-layer="svg1141" inkscape:snap-global="false" gridtolerance="23"> <inkscape:grid type="xygrid" id="grid3676" visible="true" enabled="true" /> </sodipodi:namedview> <rect style="fill:#cccccc;fill-rule:evenodd;stroke:#000000;stroke-width:2.26807213pt" id="rect1183" width="802.11261" height="680.2215" x="-643.42822" y="163.21796" /> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;" id="rect1295" width="69.963570" height="45.246185" x="-101.75949" y="509.82691" transform="scale(-1.000000,1.000000)" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;fill-opacity:1.0000000;" id="rect1262" width="69.963570" height="45.246185" x="128.72227" y="535.48883" transform="translate(-91.26626,99.11160)" /> <path sodipodi:type="arc" style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000pt;" id="path1286" sodipodi:cx="88.389725" sodipodi:cy="698.28027" sodipodi:rx="18.305565" sodipodi:ry="18.305565" d="M 106.69529 698.28027 A 18.305565 18.305565 0 1 0 70.084160,698.28027 A 18.305565 18.305565 0 1 0 106.69529 698.28027 z" transform="translate(-17.25953,-39.22624)" /> <path sodipodi:type="arc" style="fill-rule:evenodd;stroke-width:1.0000000pt;" id="path1573" sodipodi:cx="496.47308" sodipodi:cy="894.01904" sodipodi:rx="26.543070" sodipodi:ry="26.543070" d="M 523.01615 894.01904 A 26.543070 26.543070 0 1 0 469.93001,894.01904 A 26.543070 26.543070 0 1 0 523.01615 894.01904 z" transform="translate(185.5400,-212.9984)" /> <path sodipodi:type="arc" style="fill:url(#radialGradient1395);fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;" id="path1343" sodipodi:cx="715.48608" sodipodi:cy="436.77219" sodipodi:rx="38.180180" sodipodi:ry="38.180180" d="M 753.66626 436.77219 A 38.180180 38.180180 0 1 0 677.30590,436.77219 A 38.180180 38.180180 0 1 0 753.66626 436.77219 z" transform="matrix(0.905654,0.000000,0.000000,0.919132,149.4257,12.54474)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0375195;" d="M 704.48491,415.34092 C 694.57329,417.80874 687.95315,428.45052 684.92534,434.86193 C 681.89753,441.01182 677.92934,447.28914 688.65031,452.73194 C 698.87767,454.00139 705.70466,453.64762 711.13899,450.11964 C 718.44814,445.58571 724.25946,439.88285 726.48955,434.60790 C 727.94598,431.77023 741.08206,432.37026 740.21539,430.37826 C 740.33314,426.85776 739.63744,419.26753 731.65870,414.99087 C 727.35252,412.29016 710.27910,412.15675 704.48491,415.34092 z " id="path1377" sodipodi:nodetypes="czcccccc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 175.16419,313.27629 C 170.59785,312.81843 161.53978,318.62958 157.57044,321.02629 C 146.72186,327.57680 135.88296,343.93132 135.88294,360.30754 C 135.88294,364.40161 132.43921,368.00533 137.35169,380.80754 C 143.39531,391.81829 170.06959,395.25262 170.28919,388.46379 C 170.50878,381.67497 166.19786,385.04854 171.50794,379.87004 C 171.67000,389.89820 175.12385,390.07619 174.97669,395.99504 C 174.88252,399.52179 174.69106,407.40659 176.03919,406.05754 L 177.97669,406.37004 L 177.97669,406.49504 L 178.35169,406.43254 L 180.28919,406.12004 C 181.63732,407.46909 181.44586,399.58428 181.35169,396.05754 C 181.20453,390.13869 184.65838,389.96069 184.82044,379.93254 C 190.13052,385.11104 185.81960,381.73746 186.03919,388.52629 C 186.25879,395.31512 212.93307,391.88078 218.97669,380.87004 C 223.88917,368.06783 220.44544,364.46410 220.44544,360.37004 C 220.44542,343.99382 209.60652,327.63929 198.75794,321.08879 C 194.78860,318.69208 185.73053,312.88092 181.16419,313.33879 C 179.64208,313.49141 178.61613,314.33756 178.44544,316.24504 L 177.64117,368.62731 L 177.88294,316.18254 C 177.71225,314.27507 176.68630,313.42891 175.16419,313.27629 z " id="path1150" sodipodi:nodetypes="ccccccccccccccccccccccc" /> <path style="fill:#ff0000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.68412900pt;" d="M 182.78509,493.16200 C 171.13638,496.94695 136.68072,486.89726 135.94501,503.73375 C 135.20931,520.57025 224.59784,516.52427 212.45865,506.21355 C 200.31947,495.90282 194.43381,489.37705 182.78509,493.16200 z " id="path1140" sodipodi:nodetypes="cczz" /> <g id="g1263" transform="matrix(0.908672,-0.417511,0.685493,0.785541,-67.19158,231.4487)"> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.99068832pt;" d="M 420.68026,157.78820 C 420.68026,143.66413 411.49144,115.33358 402.38342,106.84266 C 393.27539,98.351740 375.11992,98.368210 366.03210,106.84266 C 356.94426,115.31711 347.85643,143.56526 347.85643,157.68934 C 347.85643,171.81342 356.94426,185.93749 366.03210,191.58713 C 375.11992,197.23676 393.27539,197.22028 402.38342,191.58713 C 411.49144,185.95397 420.68026,171.91228 420.68026,157.78820 z " id="path1235" sodipodi:nodetypes="czzzzzz" transform="matrix(0.937345,0.000000,-0.521597,0.915342,214.7080,20.05502)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;" d="M 385.72466,104.99534 C 385.60653,104.99531 385.49150,105.02296 385.37337,105.02434 L 385.37337,105.05334 C 385.28545,105.04542 385.19871,105.02430 385.10991,105.02434 C 384.90297,105.02441 384.70203,105.07794 384.49516,105.08234 L 384.49516,105.19833 C 384.36904,105.18166 384.24249,105.16937 384.11460,105.16933 C 384.02579,105.16930 383.93906,105.19041 383.85113,105.19833 L 383.85113,105.16933 C 383.73301,105.16796 383.61798,105.14030 383.49985,105.14033 C 377.27858,105.14222 371.05063,107.10435 366.90157,110.99791 C 364.82705,112.94468 352.95338,129.00036 356.94846,131.76041 C 366.89106,139.03386 375.51079,117.62287 366.31609,135.38515 C 365.38960,141.48619 365.15147,144.66736 365.08659,146.25937 C 364.95557,143.34300 363.87193,136.50278 358.17796,133.18131 C 353.42130,130.46368 350.30330,154.46891 350.30330,157.71354 C 350.30330,170.69209 358.60347,183.66588 366.90157,188.85730 C 371.11000,191.49017 377.45333,192.75392 383.76331,192.71402 L 383.76331,192.74302 C 384.08594,192.74567 384.40678,192.71814 384.72935,192.71402 L 384.72935,192.56903 C 384.97331,192.57837 385.21671,192.60006 385.46120,192.59803 L 385.46120,192.56903 C 391.77118,192.60893 398.11451,191.34520 402.32294,188.71231 C 410.62104,183.52089 418.92121,170.54709 418.92121,157.56855 C 418.92121,154.32392 415.80320,130.31868 411.04655,133.03632 C 405.35258,136.35779 404.26894,143.19801 404.13792,146.11438 C 404.07304,144.52237 403.83491,141.34119 402.90841,135.24016 C 393.71372,117.47788 402.33345,138.88886 412.27605,131.61542 C 416.27113,128.85537 404.39746,112.79968 402.32294,110.85292 C 398.17388,106.95936 391.94593,104.99722 385.72466,104.99534 z " id="path1236" transform="matrix(0.937345,0.000000,-0.521597,0.915342,214.7080,20.05502)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;" d="M 380.33827,131.91200 C 380.67980,131.22522 379.75424,123.78448 378.33933,121.86149 C 376.92442,119.93850 374.82503,120.78615 374.48350,121.47293 C 374.14198,122.15971 376.25321,121.24535 377.66811,123.16834 C 379.08302,125.09132 379.99675,132.59878 380.33827,131.91200 z " id="path1237" sodipodi:nodetypes="czzzz" transform="matrix(0.937345,0.000000,-0.521597,0.915342,214.7080,20.05502)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.76453004pt;" d="M 374.01970,170.64672 C 371.03955,170.35930 370.44378,163.47294 368.37466,167.67389 C 366.21050,171.94993 370.67043,181.11939 371.06278,176.38002 C 371.36008,171.64067 376.90481,171.00921 374.01970,170.64672 z " id="path1238" sodipodi:nodetypes="czzz" transform="matrix(0.937345,0.000000,-0.521597,0.915342,214.7080,20.05502)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;" d="M 388.88624,131.76953 C 388.54471,131.08274 389.47027,123.64200 390.88518,121.71902 C 392.30008,119.79602 394.39948,120.64367 394.74101,121.33045 C 395.08253,122.01724 392.97130,121.10288 391.55640,123.02586 C 390.14149,124.94885 389.22776,132.45631 388.88624,131.76953 z " id="path1239" sodipodi:nodetypes="czzzz" transform="matrix(0.937345,0.000000,-0.521597,0.915342,214.7080,20.05502)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.76453004pt;" d="M 395.20481,170.50425 C 398.18496,170.21683 398.78073,163.33046 400.84985,167.53142 C 403.01401,171.80746 398.55408,180.97692 398.16173,176.23755 C 397.86443,171.49819 392.31970,170.86674 395.20481,170.50425 z " id="path1240" sodipodi:nodetypes="czzz" transform="matrix(0.937345,0.000000,-0.521597,0.915342,214.7080,20.05502)" /> </g> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:1.2724125pt;" d="M 496.61025,315.43263 C 487.70277,315.43523 472.41769,322.55172 466.47718,327.89823 C 454.59613,338.59121 447.94047,366.42388 447.94047,384.24553 C 447.94047,389.67769 447.95637,395.00686 448.18560,400.13622 L 542.84637,400.13622 C 543.08751,395.05165 543.13236,389.79833 543.13236,384.40325 C 543.13232,366.58163 539.47657,339.72728 527.56914,329.01351 C 521.61543,323.65662 505.51773,315.43003 496.61025,315.43263 z " id="path1063" sodipodi:nodetypes="cccccccc" /> <path style="fill-rule:evenodd;stroke:none;stroke-width:0.91963024pt;" d="M 342.97890,399.86026 L 434.73342,400.51279 L 433.34799,392.09524 C 432.07595,388.11087 427.72724,383.73612 426.88022,379.25826 C 425.59125,374.78040 431.80349,377.65786 431.05395,370.30329 C 430.30440,362.94871 428.89800,343.42434 418.26686,333.11605 C 407.32322,323.12026 398.18407,316.70378 378.78742,319.85497 C 360.64077,321.75616 350.23069,330.41956 342.83093,345.70413 C 335.23979,360.98870 343.64369,380.00725 343.40504,387.13431 L 342.97890,399.86026 z " id="path1052" sodipodi:nodetypes="ccczzzzzzc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.99068832pt;" d="M 320.29479,372.55062 C 320.29479,358.42655 311.10597,330.09600 301.99795,321.60508 C 292.88992,313.11416 274.73445,313.13063 265.64663,321.60508 C 256.55879,330.07953 247.47096,358.32768 247.47096,372.45176 C 247.47096,386.57584 256.55879,400.69991 265.64663,406.34955 C 274.73445,411.99918 292.88992,411.98270 301.99795,406.34955 C 311.10597,400.71639 320.29479,386.67470 320.29479,372.55062 z " id="path1005" sodipodi:nodetypes="czzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;fill-opacity:1.0000000;" d="M 285.33919,319.75776 C 285.22106,319.75773 285.10603,319.78538 284.98790,319.78676 L 284.98790,319.81576 C 284.89998,319.80784 284.81324,319.78672 284.72444,319.78676 C 284.51750,319.78683 284.31656,319.84036 284.10969,319.84476 L 284.10969,319.96075 C 283.98357,319.94408 283.85702,319.93179 283.72913,319.93175 C 283.64032,319.93172 283.55359,319.95283 283.46566,319.96075 L 283.46566,319.93175 C 283.34754,319.93038 283.23251,319.90272 283.11438,319.90275 C 276.89311,319.90464 270.66516,321.86677 266.51610,325.76033 C 264.44158,327.70710 252.56791,343.76278 256.56299,346.52283 C 266.50559,353.79628 275.12532,332.38529 265.93062,350.14757 C 265.00413,356.24861 264.76600,359.42978 264.70112,361.02179 C 264.57010,358.10542 263.48646,351.26520 257.79249,347.94373 C 253.03583,345.22610 249.91783,369.23133 249.91783,372.47596 C 249.91783,385.45451 258.21800,398.42830 266.51610,403.61972 C 270.72453,406.25259 277.06786,407.51634 283.37784,407.47644 L 283.37784,407.50544 C 283.70047,407.50809 284.02131,407.48056 284.34388,407.47644 L 284.34388,407.33145 C 284.58784,407.34079 284.83124,407.36248 285.07573,407.36045 L 285.07573,407.33145 C 291.38571,407.37135 297.72904,406.10762 301.93747,403.47473 C 310.23557,398.28331 318.53574,385.30951 318.53574,372.33097 C 318.53574,369.08634 315.41773,345.08110 310.66108,347.79874 C 304.96711,351.12021 303.88347,357.96043 303.75245,360.87680 C 303.68757,359.28479 303.44944,356.10361 302.52294,350.00258 C 293.32825,332.24030 301.94798,353.65128 311.89058,346.37784 C 315.88566,343.61779 304.01199,327.56210 301.93747,325.61534 C 297.78841,321.72178 291.56046,319.75964 285.33919,319.75776 z " id="path1044" /> <path sodipodi:type="arc" style="font-size:12;fill:#fffffd;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-dasharray:none;" id="path695" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(1.269231,0.000000,0.000000,1.209574,152.3260,-283.6191)" /> <path sodipodi:type="arc" style="font-size:12;fill:url(#linearGradient1202);fill-opacity:0.75;fill-rule:evenodd;stroke:#0050fb;stroke-width:2.47293;stroke-dasharray:none;stroke-opacity:1;" id="path1200" sodipodi:cx="604.88873291" sodipodi:cy="441.20190430" sodipodi:rx="44.21426392" sodipodi:ry="13.48378277" d="M 649.102997 441.201904 A 44.214264 13.483783 0 1 0 560.674469,441.201904 A 44.2143 13.4838 0 1 0 649.103 441.202 L 604.888733 441.201904 z" transform="matrix(1.042553,0.000000,0.000000,0.882208,-29.50271,47.34934)" inkscape:export-filename="C:\pas\mricron\btn\path.png" inkscape:export-xdpi="21.807127" inkscape:export-ydpi="21.807127" /> <path style="font-size:12;fill-opacity:0.70196;stroke:#1c66f9;stroke-width:9.25243;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99;fill:url(#linearGradient968);" d="M -49.21 243.091 C -46.9287 238.079 -38.9781 233.065 -32.1615 233.824 L 173.669 267.357 C 189.611 256.808 212.948 243.966 237.003 247.181 L 271.976 250.84 L 316.171 257.383 C 341.971 263.24 362.36 275.405 364.498 299.613 L 364.227 591.258 L -50.8332 491.502 L -49.21 243.091 z " id="path10" transform="matrix(0.180587,0.000000,0.000000,0.239519,475.9239,473.8713)" sodipodi:nodetypes="cccccccccc" /> <rect style="font-size:12;fill:none;fill-opacity:0.25;fill-rule:evenodd;stroke-width:0.0937284;stroke-opacity:0.53137;" id="rect1408" x="0.001633" y="142.499995" width="14.998365" height="14.994604" rx="0" ry="0" transform="matrix(15.78489,0.000000,0.000000,15.78489,215.6082,-1931.463)" /> <rect style="font-size:12;fill:none;fill-rule:evenodd;stroke-width:0.0520834;" id="rect702" width="25.000004" height="24.999990" x="24.999998" y="219.999988" transform="matrix(14.81984,0.000000,0.000000,14.99259,-23.10420,-2817.060)" /> <path style="font-size:12;fill:url(#linearGradient588);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.47847000000000001pt" d="M 260,712.36218 C 260.6888,710.6402 290,637.36218 290,637.36218 L 318.17786,717.86525 C 318.17786,717.86525 305,722.36218 290,722.36218 C 270,722.36218 259.65561,712.36218 260,712.36218 z" id="path593" sodipodi:nodetypes="ccczc" inkscape:export-filename="C:\pas\mricron\btn\new\magichat.png" inkscape:export-xdpi="25.411764" inkscape:export-ydpi="25.411764" /> <polygon sodipodi:type="star" style="font-size:12;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="polygon597" sodipodi:sides="6" sodipodi:cx="240.40767073" sodipodi:cy="577.30510872" sodipodi:r1="15.40403841" sodipodi:r2="7.70201920" sodipodi:arg1="0.65284663" sodipodi:arg2="1.17644541" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0.000000,0.000000,0.478471,170.7767,389.9823)" inkscape:export-filename="C:\pas\mricron\btn\new\magichat.png" inkscape:export-xdpi="22.14864" inkscape:export-ydpi="22.14864" /> <polygon sodipodi:type="star" style="font-size:12;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="polygon598" sodipodi:sides="6" sodipodi:cx="240.40767073" sodipodi:cy="577.30510872" sodipodi:r1="15.40403841" sodipodi:r2="7.70201920" sodipodi:arg1="0.65284663" sodipodi:arg2="1.17644541" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0.000000,0.000000,0.478471,161.8224,423.0443)" inkscape:export-filename="C:\pas\mricron\btn\new\magichat.png" inkscape:export-xdpi="22.14864" inkscape:export-ydpi="22.14864" /> <polygon sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon599" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,180.82663,405.61557)" inkscape:export-filename="C:\pas\mricron\btn\new\magichat.png" inkscape:export-xdpi="22.14864" inkscape:export-ydpi="22.14864" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z" /> <polygon sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon600" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,183.55602,422.73609)" inkscape:export-filename="C:\pas\mricron\btn\new\magichat.png" inkscape:export-xdpi="22.14864" inkscape:export-ydpi="22.14864" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z" /> <polygon sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon601" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,166.77658,438.30666)" inkscape:export-filename="C:\pas\mricron\btn\new\magichat.png" inkscape:export-xdpi="22.14864" inkscape:export-ydpi="22.14864" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z" /> <polygon sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon602" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,191.38779,434.54077)" inkscape:export-filename="C:\pas\mricron\btn\new\magichat.png" inkscape:export-xdpi="22.14864" inkscape:export-ydpi="22.14864" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z" /> <path style="font-size:12;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 274.11717,675.42762 C 272.59006,680.51787 272.50982,680.74799 270.97720,685.84931 L 272.11357,689.70698 L 274.49097,685.80445 L 278.91683,686.88101 L 276.71885,682.87382 L 279.87377,679.56938 L 275.31334,679.47966 L 274.11717,675.42762 z " id="path605" inkscape:export-filename="C:\pas\mricron\btn\new\magichat.png" inkscape:export-xdpi="22.14864" inkscape:export-ydpi="22.14864" /> <path style="font-size:12;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 292.16411,644.27745 L 290.93802,646.28105 L 286.49722,645.20449 L 288.69519,649.21168 L 285.55523,652.51612 L 290.11565,652.60584 L 291.40154,656.98683 L 293.77894,653.08431 L 295.40874,653.48802 L 292.16411,644.27745 z " id="path608" inkscape:export-xdpi="22.14864" inkscape:export-ydpi="22.14864" inkscape:export-filename="C:\pas\mricron\btn\new\magichat.png" /> <path sodipodi:type="arc" style="font-size:12;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-dasharray:none;" id="path651" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(1.269231,0.000000,0.000000,1.209574,-61.55729,-176.8490)" inkscape:export-filename="C:\pas\mricron\btn\new\autocontrast.png" inkscape:export-xdpi="22.289494" inkscape:export-ydpi="22.289494" /> <path style="font-size:12;fill:url(#linearGradient670);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-opacity:1;" d="M 295.69152,743.03173 L 295.69152,775.76582 L 271.65546,775.76582 L 271.65546,765.25764 C 271.65546,765.25764 271.67456,765.22685 247.26244,785.85819 L 271.13984,805.28697 L 271.13984,795.57258 L 295.69152,795.57258 L 295.69152,829.28944 C 315.20163,823.65675 329.48478,806.54705 329.48479,786.12279 C 329.48480,765.70248 315.19580,748.66784 295.69152,743.03173 z " id="path669" inkscape:export-filename="C:\pas\mricron\btn\new\autocontrast.png" inkscape:export-xdpi="22.289494" inkscape:export-ydpi="22.289494" /> <path style="font-size:12;fill:url(#linearGradient1170);fill-rule:evenodd;stroke:#000054;stroke-width:0.67086999999999997;stroke-linejoin:round;stroke-opacity:1" d="M 37.736449,210.52722 C 39.360943,210.15769 40.548315,209.21204 41.638551,208.17037 C 42.631649,207.06469 43.624746,205.57494 43.986449,204.08519 L 35.819276,193.99093 L 26.486449,203.31704 L 37.736449,210.52722 z " id="path709" sodipodi:nodetypes="cccccc" transform="matrix(4.130527,0.000000,0.000000,4.178675,143.9011,-279.6922)" inkscape:export-filename="C:\pas\mricron\btn\new\bucket24x.png" inkscape:export-xdpi="22.773436" inkscape:export-ydpi="22.773436" /> <path sodipodi:type="arc" style="font-size:12;fill:#f5f9ff;fill-rule:evenodd;stroke:#000054;stroke-width:10.78609999999999900;stroke-opacity:1" id="path587" sodipodi:cx="220.25373840" sodipodi:cy="529.07958984" sodipodi:rx="44.62657547" sodipodi:ry="78.45639801" d="M 264.880314 529.079590 A 44.626575 78.456398 0 1 0 175.627163,529.079590 A 44.6266 78.4564 0 1 0 264.88 529.08 L 220.253738 529.079590 z" transform="matrix(0.261130,0.000000,-0.220403,0.255703,330.6188,414.5732)" inkscape:export-filename="C:\pas\mricron\btn\new\bucket24x.png" inkscape:export-xdpi="22.773436" inkscape:export-ydpi="22.773436" /> <path style="font-size:12;fill:#ff0000;fill-rule:evenodd;stroke-width:1pt;" d="M 32.982608,203.39618 C 24.345244,202.82561 29.882675,210.68326 29.960475,211.32626 C 30.038375,211.96926 25.425954,213.06265 27.366549,215.37646 C 30.570035,217.69028 45.345484,218.46139 45.105684,214.83439 C 44.865884,211.20639 33.164810,212.24817 30.632114,211.28954 C 29.797246,209.02780 29.689118,205.41944 30.954356,204.34431 C 31.695306,203.86591 31.589790,205.17495 32.982608,203.39618 z " id="path711" transform="matrix(4.130527,0.000000,0.000000,4.178675,123.2485,-284.9157)" sodipodi:nodetypes="cccccsc" inkscape:export-filename="C:\pas\mricron\btn\new\bucket24x.png" inkscape:export-xdpi="22.773436" inkscape:export-ydpi="22.773436" /> <path style="font-size:12;fill:#ff0000;fill-rule:evenodd;stroke-width:10.7861;" d="M 564.64487,498.84975 C 545.78432,498.84975 507.75654,526.26504 479.76987,560.03725 C 456.70600,587.86900 447.66587,611.34624 455.73862,618.75600 C 480.65758,610.79895 518.18623,582.81638 547.11362,549.25600 C 560.29785,533.96018 569.66613,519.82649 574.98862,508.16225 C 574.60172,502.30556 571.27296,498.84975 564.64487,498.84975 z " id="path592" transform="matrix(0.278716,0.000000,0.000000,0.278716,129.6880,395.7771)" inkscape:export-filename="C:\pas\mricron\btn\new\bucket24x.png" inkscape:export-xdpi="22.773436" inkscape:export-ydpi="22.773436" /> <rect style="font-size:12.000000;fill:url(#linearGradient643);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000002;stroke-width:1.9439127;" id="rect642" width="71.981430" height="73.806518" x="355.56149" y="751.56487" /> <path style="font-size:12.000000;fill-rule:evenodd;stroke:#000002;stroke-width:1.9439127;" d="M 355.86912,768.41833 L 355.86912,825.08081 L 426.31248,825.08081 L 421.69830,821.88448 C 413.18767,816.07293 415.69984,808.37265 406.01003,809.09909 C 396.62784,809.24438 372.43926,821.89222 368.33775,814.53095 C 363.45690,807.88664 365.01940,752.99455 361.12114,759.56548 L 355.86912,768.41833 z " id="path640" sodipodi:nodetypes="cccczcsc" /> <rect style="font-size:12.000000;fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:4.1028190;" id="rect615" width="57.240670" height="49.173893" x="519.27698" y="1042.7878" transform="matrix(0.859371,-0.511353,0.000000,1.000000,0.000000,0.000000)" /> <text xml:space="preserve" style="font-size:48.000000;font-weight:bold;fill:#000000;stroke-width:1.0000000pt;font-family:Verdana;fill-opacity:1.0000000;" x="709.86213" y="1342.1935" id="text610" sodipodi:linespacing="100%" transform="matrix(0.632720,-0.387288,0.000000,0.813305,0.000000,0.000000)"><tspan x="709.86212" y="1342.1935" sodipodi:role="line" id="tspan613" style="fill:#000000;fill-opacity:1.0000000;">LR</tspan></text> <rect style="font-size:12.000000;fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:4.1239262;" id="rect627" width="57.831149" height="49.173893" x="-632.70609" y="457.02159" transform="matrix(-0.862456,-0.506131,0.000000,1.000000,0.000000,0.000000)" /> <text xml:space="preserve" style="font-size:48.000000;font-weight:bold;stroke-width:1.0000000pt;font-family:Verdana;" x="-858.67939" y="596.71201" id="text628" sodipodi:linespacing="100%" transform="matrix(-0.632720,-0.387288,0.000000,0.813305,0.000000,0.000000)"><tspan x="-858.67938" y="596.71204" sodipodi:role="line" id="tspan629">LR</tspan></text> <rect style="font-size:12.000000;fill:url(#linearGradient1617);fill-rule:evenodd;stroke:#000000;stroke-width:0.77675028pt;" id="rect648" width="56.066268" height="49.173893" x="649.12604" y="1116.5706" transform="matrix(0.852907,-0.522062,0.000000,1.000000,0.000000,0.000000)" /> <rect style="font-size:12.000000;fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.77675028pt;" id="rect649" width="56.066268" height="49.173893" x="-761.52524" y="380.12168" transform="matrix(-0.852907,-0.522062,0.000000,1.000000,0.000000,0.000000)" /> <path style="font-size:12.000000;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.4003696;fill-opacity:1.0000000;stroke-opacity:1.0000000;" d="M 586.02954,781.20391 C 576.62200,796.60958 567.62949,793.58791 569.22048,807.83469 C 571.77988,813.49422 577.86711,800.59504 591.84007,797.41464 C 597.37391,793.56282 600.31377,785.36998 593.29271,770.69383 C 584.81901,757.01251 564.65506,775.58222 560.50467,790.68280 C 556.35428,805.45774 563.75581,807.31272 569.01296,805.97641" id="path646" sodipodi:nodetypes="ccczzc" /> <path style="font-size:12.000000;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:2.4003696;" d="M 618.03676,782.42607 C 627.44430,797.83174 636.43680,794.81007 634.84582,809.05685 C 632.28642,814.71638 626.19918,801.81720 612.22623,798.63680 C 606.69238,794.78498 603.75252,786.59214 610.77359,771.91599 C 619.24729,758.23467 639.41124,776.80439 643.56163,791.90496 C 647.71201,806.67990 640.31049,808.53488 635.05334,807.19857" id="path650" sodipodi:nodetypes="ccczzc" /> <path sodipodi:type="arc" style="font-size:12;fill:url(#radialGradient1158);fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="path1411" d="M 69.375000 165.000000 A 4.375000 4.375000 0 1 0 60.625000,165.000000 A 4.375 4.375 0 1 0 69.375 165 L 65.000000 165.000000 z" sodipodi:cx="65.000000" sodipodi:cy="165.000000" sodipodi:rx="4.375000" sodipodi:ry="4.375000" transform="matrix(6.282797,0.000000,0.000000,6.282797,-36.58204,-479.7863)" /> <path style="font-size:12;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:39.4622;stroke-linecap:round;stroke-linejoin:round;" d="M 550.91978,487.64604 L 629.84423,566.57049" id="path1413" sodipodi:nodetypes="cc" transform="matrix(0.398026,0.000000,0.000000,0.398026,176.0698,386.3398)" /> <path sodipodi:type="arc" style="font-size:12;fill:url(#radialGradient1203);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87645;stroke-dasharray:none;" id="path682" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(1.269231,0.000000,0.000000,1.209574,46.26003,-283.6018)" /> <path style="font-size:12;fill:url(#linearGradient683);fill-opacity:0.38017;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 390.66521,633.72235 C 371.44051,633.72235 354.98613,644.70534 347.51136,660.37076 C 353.42953,663.40271 360.03471,666.27491 367.81906,664.18848 C 382.43619,660.99617 387.00568,653.47068 394.31424,650.27839 C 409.63412,649.70584 416.97120,657.57598 432.07387,657.23344 C 423.97641,643.28339 408.56719,633.72236 390.66521,633.72235 z " id="path687" /> <text xml:space="preserve" style="fill:black;fill-opacity:1;stroke:none;font-family:Palatino Linotype;font-style:normal;font-weight:bold;font-size:48;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;text-anchor:start;writing-mode:lr;" x="127.75068" y="373.16888" id="text688" sodipodi:linespacing="100%" transform="scale(2.880225,1.909157)"><tspan x="127.75068" y="373.16888" sodipodi:role="line" id="tspan693">i</tspan></text> <path style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 496.33119,633.22307 L 496.33119,725.97164 C 523.77846,725.97164 546.04854,705.21602 546.04851,679.61336 C 546.04851,654.01069 523.77844,633.22305 496.33119,633.22307 z " id="path700" /> <path style="font-size:12;fill:url(#linearGradient639);fill-opacity:0.49999997;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 496.76745,633.22395 C 477.54275,633.22395 461.08837,644.20694 453.61360,659.87236 C 459.53177,662.90431 466.13695,665.77651 473.92130,663.69008 C 488.53843,660.49777 493.10792,652.97228 500.41648,649.77999 C 515.73636,649.20744 523.07344,657.07758 538.17611,656.73504 C 530.07865,642.78499 514.66943,633.22396 496.76745,633.22395 z " id="path697" /> <g id="g708" transform="matrix(1.262750,0.000000,0.000000,1.262750,-71.71251,-181.4823)" style=""> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect705" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect706" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> <g id="g711" transform="matrix(1.262750,0.000000,0.000000,1.262750,10.32260,-181.7613)" style=""> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect712" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect713" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> <g id="g721" transform="matrix(0.878674,-0.906901,0.906901,0.878674,-460.8343,623.7427)" style="font-size:12;"> <g id="g722"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect723" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect724" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> <g id="g725" transform="translate(64.96544,-0.220965)"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect726" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect727" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> </g> <g id="g728" transform="matrix(1.073491e-5,-1.262750,1.262750,1.073491e-5,-178.5732,1437.573)" style="font-size:12;"> <g id="g729"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect730" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect731" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> <g id="g732" transform="translate(64.96544,-0.220965)"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect733" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect734" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> </g> <g id="g735" transform="matrix(0.893911,0.891887,-0.891887,0.893911,758.6406,-462.3620)" style="font-size:12;"> <g id="g736"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect737" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect738" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> <g id="g739" transform="translate(64.96544,-0.220965)"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect740" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect741" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> </g> <path style="font-size:12;fill:#e6e6e6;fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 683.81237,652.51288 C 671.83423,652.51288 661.58216,660.41352 656.92493,671.68248 C 660.61230,673.86352 664.72773,675.92965 669.57785,674.42877 C 678.68520,672.13237 681.53227,666.71889 686.08594,664.42251 C 695.63114,664.01065 700.20259,669.67205 709.61245,669.42564 C 704.56725,659.39064 694.96638,652.51289 683.81237,652.51288 z " id="path801" /> <path style="fill:#fb4100;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;" d="M 476.34114,554.66904 C 483.92112,533.01461 496.96853,549.86409 506.53666,550.82511 C 514.86216,550.34456 515.73201,524.39800 531.51319,528.72246 C 538.84464,531.28509 536.85645,548.74295 535.61383,558.03249 C 535.48959,568.60329 536.86193,580.71156 526.29423,589.74497 C 511.50642,601.90523 468.76115,575.84293 476.34114,554.66904 z " id="path760" sodipodi:nodetypes="ccccsz" /> <path style="font-size:12;stroke:#1c4ed9;stroke-width:10.9208;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216;fill:#4789f7;fill-opacity:1;" d="M -25.481958,248.26603 L 449.26700,273.43400 L 430.54500,310.73100 L -40.947002,275.21320 L -25.481958,248.26603 z " id="path279" transform="matrix(0.158157,4.271800e-2,5.364549e-3,0.156933,469.3436,553.4222)" sodipodi:nodetypes="ccccc" /> <path style="font-size:12;fill:url(#linearGradient967);fill-opacity:0.6993;stroke:#1c66fb;stroke-width:9.25243;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216;" d="M -49.210000,251.69600 C -50.453100,239.20100 -40.203100,227.28000 -26.572700,228.54900 L 168.87300,263.91600 L 168.28600,299.92400 L 253.04600,316.79000 L 253.93000,278.87900 L 343.03800,291.68700 C 354.24800,294.90300 361.40100,301.55900 364.49800,316.81800 L 362.20763,586.89881 L -28.092563,469.70606 L -49.210000,251.69600 z " id="path208" transform="matrix(0.171298,0.000000,6.402228e-2,0.215063,438.9690,493.7050)" sodipodi:nodetypes="ccccccccccc" /> <path style="font-size:12;fill-opacity:0.99;stroke:#0c1dfb;stroke-width:2.63195;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99;fill:url(#radialGradient1140);" d="M 557.37226,540.24997 C 557.04724,536.47774 559.72713,532.59711 563.29085,532.12238 L 643.91869,532.55043 C 646.84958,532.82956 648.71975,534.42669 649.52947,538.93308 L 649.45887,612.42139 L 641.22180,619.79126 L 564.84594,620.14154 L 557.39252,612.04259 L 557.37226,540.24997 z " id="path1131" sodipodi:nodetypes="ccccccccc" /> <path style="font-size:12;fill:url(#linearGradient1138);fill-opacity:0.6993;stroke:#1c2942;stroke-width:2.28142;stroke-opacity:0.99216;" d="M 582.66195,589.79239 L 627.14365,589.80274 L 627.52772,620.32722 L 582.36162,620.36346 L 582.66195,589.79239 z " id="path230" sodipodi:nodetypes="ccccc" /> <path style="font-size:12;fill:#ffffff;fill-opacity:0.99216;stroke:#1c2942;stroke-width:1.10123;stroke-opacity:0.99216;" d="M 568.04305,545.40016 L 562.27509,545.17995 L 562.26523,539.14553 L 568.02662,539.08853 L 568.04305,545.40016 z " id="path313" sodipodi:nodetypes="ccccc" /> <path style="font-size:12;fill-opacity:1;stroke:#0c5cff;stroke-width:2.20247;stroke-opacity:0.99216;fill:#fffffd;" d="M 572.55890,532.87597 L 635.43355,532.88839 L 635.97643,578.77497 L 572.13438,578.81877 L 572.55890,532.87597 z " id="path412" sodipodi:nodetypes="ccccc" /> <path style="font-size:12;fill:#1c2942;fill-opacity:0.992157;stroke-width:8.96855;" d="M 600.69196,615.30986 L 590.20322,615.52766 L 590.18460,593.72001 L 600.66094,593.93144 L 600.69196,615.30986 z " id="path415" sodipodi:nodetypes="ccccc" /> <path style="font-size:12;fill:#ffffff;fill-opacity:0.99216;stroke:#1c2942;stroke-width:1.10123;stroke-opacity:0.99216;" d="M 645.41453,544.95545 L 639.64657,544.73523 L 639.63671,538.70081 L 645.39810,538.64382 L 645.41453,544.95545 z " id="path420" sodipodi:nodetypes="ccccc" /> <path style="fill:#fb4100;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;" d="M 576.19524,551.65510 C 583.02443,538.35600 594.77948,548.70415 603.39989,549.29433 C 610.90075,548.99924 611.68442,533.06410 625.90249,535.71996 C 632.50774,537.29380 630.72141,567.64918 621.20046,573.19704 C 607.87739,580.66531 569.36604,564.65909 576.19524,551.65510 z " id="path1137" sodipodi:nodetypes="cccsz" /> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect1148" width="106.29921722" height="106.29921722" x="336.61416260" y="414.56689177" /> <path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 77.051277,408.7988 C 71.267817,417.21799 67.027117,423.63406 62.200887,434.68137 C 57.374657,446.11092 52.046077,474.37935 55.805647,479.02442 C 59.565217,483.66948 65.054177,480.60173 68.813737,476.487 C 72.573307,472.37227 70.668857,451.43553 71.855117,442.32214 C 72.728877,433.20875 75.073327,423.76954 77.051277,408.7988 z" id="path1163" sodipodi:nodetypes="czzzzc" /> <path style="fill:url(#linearGradient3600);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 63.057537,441.27138 C 61.657557,445.37446 60.025867,448.19672 58.857597,453.5806 C 57.689337,459.15077 56.021237,472.92733 56.931297,475.19109 C 57.841367,477.45485 59.170057,475.95979 60.080117,473.95448 C 60.990177,471.94918 60.529177,461.74571 60.816327,457.30432 C 61.027837,452.86292 62.578747,448.56734 63.057537,441.27138 z" id="path1164" sodipodi:nodetypes="czzzzc" /> <path style="font-size:12px;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke-width:1pt" d="M 65.027472,501.48235 C 51.407077,497.9052 50.454926,490.50156 53.966405,485.50879 C 55.290385,484.10977 58.403862,481.96591 60.211329,482.09583 C 62.018803,482.22576 63.57703,483.14148 65.898291,484.80391 C 71.165819,488.75376 61.235859,490.46929 65.027472,501.48235 z" id="path1165" sodipodi:nodetypes="ccszc" /> <path style="font-size:12px;fill:url(#linearGradient3598);fill-rule:evenodd;stroke-width:1pt" d="M 60.576947,496.88161 C 57.318997,496.05997 55.784737,496.21737 53.771847,491.29171 C 51.758957,486.67855 56.763437,485.16283 57.357717,484.53711 C 57.951997,483.91138 58.819637,484.32463 59.413917,484.87892 C 60.008197,485.4332 59.707157,488.25355 59.894667,489.48119 C 60.032787,490.70884 57.764297,492.83368 60.576947,496.88161 z" id="path1166" sodipodi:nodetypes="czzzzc" /> <path style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="path1178" d="M 132.76033,454.92476 C 133.58483,461.75504 110.61862,470.65746 109.69302,474.58544 C 107.79093,478.92593 122.67406,489.23041 118.64002,494.37156 C 116.06387,502.12143 76.332667,506.06522 67.089097,503.65943 C 65.935297,502.26703 65.735177,499.08018 67.848227,497.17509 C 73.487937,493.86766 101.21717,496.69665 110.37363,491.71974 C 111.17693,489.62848 100.67532,479.10788 103.89636,473.54283 C 107.27361,466.68575 127.96186,459.52712 127.6453,455.49314 C 124.66526,450.94096 101.5795,443.77841 98.841397,439.84805 C 98.841397,439.84805 128.87,449.20724 132.76033,454.92476 z" sodipodi:nodetypes="cccccccccc" /> <path style="fill:#000054;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1" d="M 379.19834,430.4644 C 375.81627,423.04655 369.17418,435.83206 364.34795,446.87937 C 359.52172,458.30892 354.19314,486.57735 357.95271,491.22242 C 361.71228,495.86748 367.20124,492.79973 370.9608,488.685 C 374.72037,484.57027 372.81592,463.63353 374.00218,454.52014 C 374.87594,445.40675 382.58041,437.88226 379.19834,430.4644 z" id="path1183" sodipodi:nodetypes="czzzzz" inkscape:export-filename="C:\pas\mricron\btn\new\autoclose24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" /> <path style="fill:url(#linearGradient1139);fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;" d="M 365.20460,453.46938 C 363.80462,457.57246 362.17293,460.39472 361.00466,465.77860 C 359.83640,471.34877 358.16830,485.12533 359.07836,487.38909 C 359.98843,489.65285 361.31712,488.15779 362.22718,486.15248 C 363.13724,484.14718 362.67624,473.94371 362.96339,469.50232 C 363.17490,465.06092 364.72581,460.76534 365.20460,453.46938 z " id="path1184" sodipodi:nodetypes="czzzzc" inkscape:export-filename="C:\pas\mricron\btn\new\autoclose24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" /> <path style="font-size:12;fill-rule:evenodd;stroke-width:1pt;fill:#ff0000;fill-opacity:1;" d="M 367.17453,513.68035 C 353.55414,510.10320 352.60199,502.69956 356.11346,497.70679 C 357.43744,496.30777 360.55092,494.16391 362.35839,494.29383 C 364.16586,494.42376 365.72409,495.33948 368.04535,497.00191 C 373.31288,500.95176 363.38292,502.66729 367.17453,513.68035 z " id="path1185" sodipodi:nodetypes="ccszc" inkscape:export-filename="C:\pas\mricron\btn\new\autoclose24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" /> <path style="font-size:12;fill:url(#linearGradient1175);fill-rule:evenodd;stroke-width:1pt;" d="M 362.72401,509.07961 C 359.46606,508.25797 357.93180,508.41537 355.91891,503.48971 C 353.90602,498.87655 358.91050,497.36083 359.50478,496.73511 C 360.09906,496.10938 360.96670,496.52263 361.56098,497.07692 C 362.15526,497.63120 361.85422,500.45155 362.04173,501.67919 C 362.17985,502.90684 359.91136,505.03168 362.72401,509.07961 z " id="path1186" sodipodi:nodetypes="czzzzc" inkscape:export-filename="C:\pas\mricron\btn\new\autoclose24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" /> <path style="fill:#ff0000;fill-rule:nonzero;stroke:none;fill-opacity:1;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt" id="path1187" d="M 434.90739,467.12276 C 435.73189,473.95304 412.76568,482.85546 411.84008,486.78344 C 409.93799,491.12393 424.82112,501.42841 420.78708,506.56956 C 418.21093,514.31943 378.47973,518.26322 369.23616,515.85743 C 368.08236,514.46503 367.88224,511.27818 369.99529,509.37309 C 375.63500,506.06566 403.36423,508.89465 412.52069,503.91774 C 413.32399,501.82648 402.82238,491.30588 406.04342,485.74083 C 409.42067,478.88375 430.10892,471.72512 429.79236,467.69114 C 426.81232,463.13896 403.72656,455.97641 400.98846,452.04605 C 400.98846,452.04605 431.01706,461.40524 434.90739,467.12276 z " sodipodi:nodetypes="cccccccccc" inkscape:export-filename="C:\pas\mricron\btn\new\autoclose24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" /> <path style="font-size:12;fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#0000c0;stroke-width:5;stroke-linecap:round;stroke-dasharray:5, 5;stroke-dashoffset:0;stroke-miterlimit:4;stroke-opacity:1" d="M 400.09965,456.6173 L 371.53803,505.58684" id="path1189" inkscape:export-filename="C:\pas\mricron\btn\new\autoclose24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" sodipodi:nodetypes="cc" /> <path style="fill:#fb4100;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;" d="M 561.65094,448.09913 C 571.11508,425.70443 587.40564,443.12995 599.35212,444.12377 C 609.74708,443.62687 610.83312,416.79324 630.53703,421.26553 C 639.69082,423.91576 637.21526,475.03199 624.02079,484.37417 C 605.55720,496.95021 552.18679,469.99689 561.65094,448.09913 z " id="path1196" sodipodi:nodetypes="cccsz" inkscape:export-filename="C:\pas\mricron\btn\path.png" inkscape:export-xdpi="21.807127" inkscape:export-ydpi="21.807127" /> <path style="font-size:12;fill:url(#radialGradient1140);fill-opacity:0.99;stroke:#0c1dfb;stroke-width:2.47208;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99;" d="M 555.37415,438.95253 C 566.02431,447.52015 591.18209,448.17514 604.56628,448.38069 C 617.95046,448.58624 641.07727,445.71069 647.53136,437.79076 L 639.22369,509.12451 C 628.37584,514.24774 616.58726,517.38839 602.91722,517.02493 C 589.24718,516.66148 572.12780,514.45376 562.84783,509.43353 L 555.37415,438.95253 z " id="path1199" sodipodi:nodetypes="czcczcc" inkscape:export-xdpi="21.807127" inkscape:export-ydpi="21.807127" inkscape:export-filename="C:\pas\mricron\btn\path.png" /> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect983" width="106.29922" height="106.29922" x="229.68997" y="308.89271" /> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect984" width="106.29922" height="106.29922" x="335.98920" y="308.89271" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;" d="M 279.95280,346.67442 C 280.29433,345.98764 279.36877,338.54690 277.95386,336.62391 C 276.53895,334.70092 274.43956,335.54857 274.09803,336.23535 C 273.75651,336.92213 275.86774,336.00777 277.28264,337.93076 C 278.69755,339.85374 279.61128,347.36120 279.95280,346.67442 z " id="path1018" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.76453004pt;" d="M 273.63423,385.40914 C 270.65408,385.12172 270.05831,378.23536 267.98919,382.43631 C 265.82503,386.71235 270.28496,395.88181 270.67731,391.14244 C 270.97461,386.40309 276.51934,385.77163 273.63423,385.40914 z " id="path1019" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;" d="M 288.50077,346.53195 C 288.15924,345.84516 289.08480,338.40442 290.49971,336.48144 C 291.91461,334.55844 294.01401,335.40609 294.35554,336.09287 C 294.69706,336.77966 292.58583,335.86530 291.17093,337.78828 C 289.75602,339.71127 288.84229,347.21873 288.50077,346.53195 z " id="path1036" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.76453004pt;" d="M 294.81934,385.26667 C 297.79949,384.97925 298.39526,378.09288 300.46438,382.29384 C 302.62854,386.56988 298.16861,395.73934 297.77626,390.99997 C 297.47896,386.26061 291.93423,385.62916 294.81934,385.26667 z " id="path1037" sodipodi:nodetypes="czzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 409.23451,358.84667 C 408.54949,363.52087 396.22993,361.07089 396.03530,368.76520 C 395.84067,375.96034 411.64662,377.37220 417.55186,375.25440 C 423.45711,373.13660 427.32607,369.84225 426.71517,362.54762 C 426.10429,355.25299 424.14266,336.89820 402.58195,326.37323 C 381.45319,316.34743 357.52241,330.01251 349.87361,344.61299 C 342.22480,359.71267 341.61655,375.00482 350.68776,369.51396 C 359.32701,364.52225 369.86822,348.78540 385.68092,346.96694 C 401.06163,345.14847 409.91950,355.17081 409.23451,358.84667 z " id="path1045" sodipodi:nodetypes="czzzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0877723pt;fill-opacity:1.0000000;" d="M 373.63251,370.33086 C 372.33483,368.22505 372.73946,360.23826 365.81846,361.79098 C 358.89746,363.34369 351.38109,370.76217 349.29735,373.43628 C 347.21361,376.11041 348.32990,380.85478 349.29735,381.97618 C 350.26481,383.09758 355.77183,383.70140 357.33465,385.08158 C 358.89746,386.46177 362.54401,391.63747 364.47891,391.29243 C 366.41382,390.94738 370.35806,386.80682 370.50689,385.08160 C 370.65573,383.35636 374.93016,372.43670 373.63251,370.33086 z " id="path1049" sodipodi:nodetypes="czzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:none;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 369.80420,399.98508 C 370.22508,395.78373 374.95545,379.12917 375.72069,374.09587 C 376.48592,369.06258 373.57804,371.60003 374.80242,369.35376 C 376.02678,367.10748 380.15902,361.82463 383.06689,360.61829 C 385.97478,359.41197 390.10702,360.11025 392.24966,361.23339 C 394.39230,362.35653 395.73146,366.10916 395.92276,367.35707 C 396.11406,368.60500 394.43057,370.01932 393.39750,369.60335 C 392.36444,369.18737 394.01446,362.68044 391.51002,364.68476 C 389.00558,366.86555 385.84845,370.56008 384.21474,372.09919 C 382.90569,373.63828 386.12783,372.84795 386.74001,374.09587 C 387.35219,375.34380 388.50003,377.42367 387.88785,379.58674 C 387.27565,381.74980 384.63561,385.70156 383.06689,387.07427 C 381.49816,388.44699 380.12076,385.78476 378.47552,387.82304 C 376.83027,389.86131 374.60431,398.21199 373.22688,400.16706 L 369.80420,399.98508 z " id="path1050" sodipodi:nodetypes="czzzzzzzzzzzzcc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;fill-opacity:1.0000000;stroke-dasharray:none;" d="M 368.64815,355.65182 C 369.07734,357.32494 370.41856,361.26175 371.38424,362.14751 C 372.34992,363.03329 374.41542,363.29574 374.76413,362.14751 C 375.11285,360.99928 372.77913,355.22533 378.62686,352.10871 C 384.63554,348.99209 394.02411,349.71383 396.97480,351.12452 C 399.92548,352.53519 404.88802,357.78424 400.19374,361.36016 C 396.30418,364.93605 405.74639,365.03448 407.75823,363.52538 C 409.77007,362.01628 412.69261,356.42939 410.09064,353.73925 C 407.48867,351.04912 400.89223,344.62204 394.77625,343.96592 C 388.66028,343.30978 374.03986,350.59961 372.02803,351.12452 C 369.85526,351.64942 368.21896,353.97868 368.64815,355.65182 z " id="path1051" sodipodi:nodetypes="czzzzzzzzzz" /> <g id="g1422"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.1655209pt;" d="M 500.15302,318.39576 C 498.63090,318.58535 497.62728,319.44559 497.45659,321.35308 L 496.27180,334.48360 L 495.12787,321.15593 C 494.44510,313.52598 480.11544,322.81032 474.82299,326.00594 C 463.97441,332.55643 453.12906,348.90299 453.12904,365.27921 C 453.12904,369.37327 450.53202,374.85695 458.19505,375.61014 C 471.12797,372.25560 475.71395,368.40706 475.88521,364.72718 C 475.97004,366.73597 472.22575,370.99591 477.19257,377.85771 C 471.88006,374.61864 449.68734,372.98113 454.59982,385.78334 C 460.64344,396.79407 487.30926,400.22178 487.52886,393.43295 C 487.74845,386.64413 493.79077,380.76155 483.19824,381.13048 C 485.89452,378.43241 492.43160,379.68832 495.12787,376.99022 L 496.31266,372.81053 L 497.66087,376.55648 C 500.35715,379.25456 506.64909,378.23526 509.34537,380.93333 C 500.48613,379.72791 504.79515,386.40754 505.01475,393.19637 C 505.23437,399.98518 531.94102,396.59692 537.98464,385.58618 C 542.89711,372.78397 520.66354,374.42148 515.35103,377.66055 C 520.31782,370.79874 516.57357,366.49938 516.65839,364.49060 C 516.82967,368.17046 521.41564,372.05845 534.34856,375.41298 C 542.01160,374.65978 539.45542,369.17610 539.45542,365.08206 C 539.45542,348.70583 528.61005,332.35928 517.76147,325.80879 C 513.79214,323.41205 504.71936,317.82698 500.15302,318.39576 z " id="path1060" sodipodi:nodetypes="cccccccccccccccccccccccc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt;" d="M 501.66595,339.08941 C 507.48057,336.85763 507.44235,336.64611 505.77764,338.68995 C 504.31721,340.73379 502.98053,336.92565 501.65049,348.68951 C 500.11618,360.84766 495.64707,341.51834 501.66595,339.08941 z " id="path1057" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt;" d="M 491.59647,339.30071 C 485.78186,337.06892 485.82008,336.85741 487.48479,338.90125 C 488.94522,340.94509 490.28190,337.13695 491.61194,348.90080 C 493.14625,361.05897 497.61536,341.72965 491.59647,339.30071 z " id="path1059" sodipodi:nodetypes="czzz" /> </g> <path sodipodi:type="arc" style="font-size:12;fill:url(#radialGradient983);fill-opacity:0.50000000;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none;" id="path1065" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(1.269231,0.000000,0.000000,1.209574,153.7331,-282.7179)" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt;" id="rect1074" width="42.038873" height="31.251435" x="577.48017" y="355.15182" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="59.518364" inkscape:export-ydpi="59.518364" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 590.00000,364.23718 C 600.00000,365.07051 608.75000,368.82051 614.37500,377.36218 C 620.00000,386.52885 619.37500,387.36218 619.37500,387.36218 C 619.37500,387.36218 620.62500,396.11218 608.75000,397.36218 C 596.87500,397.98718 583.56694,385.77747 569.81694,385.77747 C 556.69194,385.77747 551.87500,383.73242 553.75000,372.36218 C 555.62500,360.55000 569.06250,334.86218 591.87500,334.23718 C 614.68750,332.98718 635.31250,340.38301 643.75000,355.48718 C 651.56250,370.59135 647.81250,382.36218 643.12500,386.11218 C 638.43750,389.86218 627.70833,384.86218 619.37500,386.73718" id="path1067" sodipodi:nodetypes="czzzzzzzzz" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="59.518364" inkscape:export-ydpi="59.518364" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 605.62500,385.48718 C 598.12500,382.98718 595.00000,382.98718 588.12500,376.73718 C 581.25000,370.48718 580.00000,364.23718 580.00000,364.23718" id="path1068" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="59.518364" inkscape:export-ydpi="59.518364" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 597.50000,334.86218 C 598.12500,347.36218 604.92417,355.07014 602.71447,365.23480" id="path1069" sodipodi:nodetypes="cc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="59.518364" inkscape:export-ydpi="59.518364" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 610.90476,341.83916 C 625.49682,341.59591 628.11190,344.21099 630.20397,355.19433 C 635.95715,352.05623 638.95397,353.81615 640.20397,366.31615" id="path1070" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="59.518364" inkscape:export-ydpi="59.518364" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 620.21706,362.57924 C 620.21706,362.57924 610.95580,381.48089 620.33080,380.85589 C 629.70580,380.23089 626.05002,380.28181 628.70167,379.17696" id="path1071" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="59.518364" inkscape:export-ydpi="59.518364" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 565.74009,361.50702 C 565.74009,361.50702 568.88733,353.92082 576.86459,349.47516 C 584.84184,345.55251 590.33862,342.77797 590.55959,337.25370 L 589.89668,342.92311 C 589.16881,349.14804 598.53331,356.11130 595.55959,362.81588" id="path1072" sodipodi:nodetypes="czczz" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="59.518364" inkscape:export-ydpi="59.518364" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 606.88925,334.11254 C 612.15464,344.40283 608.33289,359.63174 612.31037,370.45931" id="path1073" sodipodi:nodetypes="cc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="59.518364" inkscape:export-ydpi="59.518364" /> <g id="g1132" transform="matrix(1.069142,0.000000,0.000000,1.032969,-32.93548,-15.76150)"> <g id="g1107" transform="matrix(0.841944,0.000000,0.000000,0.873445,74.35371,56.03641)"> <g id="g1099" transform="translate(1.325825,9.280777)"> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.65628657pt;" d="M 496.65430,493.31750 C 496.65430,484.55800 490.15222,466.98787 483.70730,461.72195 C 477.26238,456.45602 464.41541,456.46624 457.98479,461.72195 C 451.55416,466.97766 445.12353,484.49668 445.12353,493.25619 C 445.12353,502.01571 451.55416,510.77522 457.98479,514.27903 C 464.41541,517.78283 477.26238,517.77261 483.70730,514.27903 C 490.15222,510.78544 496.65430,502.07702 496.65430,493.31750 z " id="path1075" sodipodi:nodetypes="czzzzzz" /> <g id="g1093"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.60115390pt;" d="M 471.91942,460.57627 C 471.83583,460.57625 471.75443,460.59340 471.67084,460.59426 L 471.67084,460.61224 C 471.60863,460.60733 471.54725,460.59423 471.48442,460.59426 C 471.33798,460.59430 471.19580,460.62750 471.04941,460.63023 L 471.04941,460.70216 C 470.96017,460.69182 470.87062,460.68420 470.78013,460.68418 C 470.71728,460.68416 470.65591,460.69725 470.59369,460.70216 L 470.59369,460.68418 C 470.51011,460.68333 470.42871,460.66617 470.34512,460.66619 C 465.94290,460.66736 461.53595,461.88424 458.60004,464.29896 C 457.13209,465.50632 448.73018,475.46378 451.55713,477.17551 C 458.59260,481.68638 464.69200,468.40765 458.18575,479.42351 C 457.53016,483.20728 457.36165,485.18018 457.31574,486.16752 C 457.22303,484.35884 456.45624,480.11665 452.42714,478.05673 C 449.06128,476.37130 446.85496,491.25894 446.85496,493.27120 C 446.85496,501.32028 452.72823,509.36640 458.60004,512.58603 C 461.57796,514.21889 466.06655,515.00265 470.53155,514.97790 L 470.53155,514.99589 C 470.75985,514.99753 470.98688,514.98046 471.21513,514.97790 L 471.21513,514.88798 C 471.38776,514.89378 471.55999,514.90723 471.73299,514.90597 L 471.73299,514.88798 C 476.19799,514.91273 480.68658,514.12899 483.66451,512.49611 C 489.53631,509.27648 495.40958,501.23035 495.40958,493.18128 C 495.40958,491.16902 493.20325,476.28138 489.83741,477.96681 C 485.80830,480.02673 485.04151,484.26892 484.94880,486.07760 C 484.90289,485.09026 484.73439,483.11735 484.07879,479.33359 C 477.57255,468.31773 483.67194,481.59646 490.70741,477.08559 C 493.53436,475.37386 485.13245,465.41639 483.66451,464.20904 C 480.72859,461.79432 476.32164,460.57744 471.91942,460.57627 z " id="path1076" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.60115390pt;" d="M 468.10796,477.26953 C 468.34963,476.84360 467.69470,472.22898 466.69350,471.03637 C 465.69229,469.84376 464.20675,470.36946 463.96508,470.79539 C 463.72341,471.22132 465.21734,470.65425 466.21853,471.84686 C 467.21974,473.03946 467.86630,477.69546 468.10796,477.26953 z " id="path1077" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.50646687pt;" d="M 463.63689,501.29214 C 461.52811,501.11389 461.10654,496.84308 459.64241,499.44844 C 458.11103,502.10037 461.26692,507.78711 461.54455,504.84784 C 461.75492,501.90857 465.67842,501.51695 463.63689,501.29214 z " id="path1078" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.60115390pt;" d="M 474.15658,477.18117 C 473.91491,476.75523 474.56985,472.14061 475.57105,470.94801 C 476.57224,469.75540 478.05780,470.28110 478.29947,470.70703 C 478.54113,471.13296 477.04720,470.56589 476.04601,471.75849 C 475.04481,472.95110 474.39824,477.60710 474.15658,477.18117 z " id="path1079" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.50646687pt;" d="M 478.62766,501.20378 C 480.73643,501.02553 481.15801,496.75472 482.62213,499.36008 C 484.15351,502.01201 480.99763,507.69875 480.72000,504.75948 C 480.50963,501.82021 476.58613,501.42859 478.62766,501.20378 z " id="path1080" sodipodi:nodetypes="czzz" /> </g> </g> <g id="g1088" transform="matrix(0.528836,0.000000,0.000000,0.528836,234.0955,290.1247)"> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:1.2724125pt;" d="M 448.76081,243.24146 C 439.85333,243.24406 424.56825,250.36055 418.62774,255.70706 C 406.74669,266.40004 400.09103,294.23271 400.09103,312.05436 C 400.09103,317.48652 400.10693,322.81569 400.33616,327.94505 L 494.99693,327.94505 C 495.23807,322.86048 495.28292,317.60716 495.28292,312.21208 C 495.28288,294.39046 491.62713,267.53611 479.71970,256.82234 C 473.76599,251.46545 457.66829,243.23886 448.76081,243.24146 z " id="path1084" sodipodi:nodetypes="cccccccc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.1655209pt;" d="M 452.30358,246.20459 C 450.78146,246.39418 449.77784,247.25442 449.60715,249.16191 L 448.42236,262.29243 L 447.27843,248.96476 C 446.59566,241.33481 432.26600,250.61915 426.97355,253.81477 C 416.12497,260.36526 405.27962,276.71182 405.27960,293.08804 C 405.27960,297.18210 402.68258,302.66578 410.34561,303.41897 C 423.27853,300.06443 427.86451,296.21589 428.03577,292.53601 C 428.12060,294.54480 424.37631,298.80474 429.34313,305.66654 C 424.03062,302.42747 401.83790,300.78996 406.75038,313.59217 C 412.79400,324.60290 439.45982,328.03061 439.67942,321.24178 C 439.89901,314.45296 445.94133,308.57038 435.34880,308.93931 C 438.04508,306.24124 444.58216,307.49715 447.27843,304.79905 L 448.46322,300.61936 L 449.81143,304.36531 C 452.50771,307.06339 458.79965,306.04409 461.49593,308.74216 C 452.63669,307.53674 456.94571,314.21637 457.16531,321.00520 C 457.38493,327.79401 484.09158,324.40575 490.13520,313.39501 C 495.04767,300.59280 472.81410,302.23031 467.50159,305.46938 C 472.46838,298.60757 468.72413,294.30821 468.80895,292.29943 C 468.98023,295.97929 473.56620,299.86728 486.49912,303.22181 C 494.16216,302.46861 491.60598,296.98493 491.60598,292.89089 C 491.60598,276.51466 480.76061,260.16811 469.91203,253.61762 C 465.94270,251.22088 456.86992,245.63581 452.30358,246.20459 z " id="path1085" sodipodi:nodetypes="cccccccccccccccccccccccc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt;" d="M 453.81651,266.89824 C 459.63113,264.66646 459.59291,264.45494 457.92820,266.49878 C 456.46777,268.54262 455.13109,264.73448 453.80105,276.49834 C 452.26674,288.65649 447.79763,269.32717 453.81651,266.89824 z " id="path1086" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt;" d="M 443.74703,267.10954 C 437.93242,264.87775 437.97064,264.66624 439.63535,266.71008 C 441.09578,268.75392 442.43246,264.94578 443.76250,276.70963 C 445.29681,288.86780 449.76592,269.53848 443.74703,267.10954 z " id="path1087" sodipodi:nodetypes="czzz" /> </g> </g> <g id="g1126" transform="matrix(0.495484,0.000000,0.000000,0.495484,300.5956,311.9146)"> <path style="fill-rule:evenodd;stroke:none;stroke-width:0.91963024pt;" d="M 390.65866,301.36656 L 482.41318,302.01909 L 481.02775,293.60154 C 479.75571,289.61717 475.40700,285.24242 474.55998,280.76456 C 473.27101,276.28670 479.48325,279.16416 478.73371,271.80959 C 477.98416,264.45501 476.57776,244.93064 465.94662,234.62235 C 455.00298,224.62656 445.86383,218.21008 426.46718,221.36127 C 408.32053,223.26246 397.91045,231.92586 390.51069,247.21043 C 382.91955,262.49500 391.32345,281.51355 391.08480,288.64061 L 390.65866,301.36656 z " id="path1121" sodipodi:nodetypes="ccczzzzzzc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 456.91427,260.35297 C 456.22925,265.02717 443.90969,262.57719 443.71506,270.27150 C 443.52043,277.46664 459.32638,278.87850 465.23162,276.76070 C 471.13687,274.64290 475.00583,271.34855 474.39493,264.05392 C 473.78405,256.75929 471.82242,238.40450 450.26171,227.87953 C 429.13295,217.85373 405.20217,231.51881 397.55337,246.11929 C 389.90456,261.21897 389.29631,276.51112 398.36752,271.02026 C 407.00677,266.02855 417.54798,250.29170 433.36068,248.47324 C 448.74139,246.65477 457.59926,256.67711 456.91427,260.35297 z " id="path1122" sodipodi:nodetypes="czzzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0877723pt;fill-opacity:1.0000000;" d="M 421.31227,271.83716 C 420.01459,269.73135 420.41922,261.74456 413.49822,263.29728 C 406.57722,264.84999 399.06085,272.26847 396.97711,274.94258 C 394.89337,277.61671 396.00966,282.36108 396.97711,283.48248 C 397.94457,284.60388 403.45159,285.20770 405.01441,286.58788 C 406.57722,287.96807 410.22377,293.14377 412.15867,292.79873 C 414.09358,292.45368 418.03782,288.31312 418.18665,286.58790 C 418.33549,284.86266 422.60992,273.94300 421.31227,271.83716 z " id="path1123" sodipodi:nodetypes="czzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:none;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 417.48396,301.49138 C 417.90484,297.29003 422.63521,280.63547 423.40045,275.60217 C 424.16568,270.56888 421.25780,273.10633 422.48218,270.86006 C 423.70654,268.61378 427.83878,263.33093 430.74665,262.12459 C 433.65454,260.91827 437.78678,261.61655 439.92942,262.73969 C 442.07206,263.86283 443.41122,267.61546 443.60252,268.86337 C 443.79382,270.11130 442.11033,271.52562 441.07726,271.10965 C 440.04420,270.69367 441.69422,264.18674 439.18978,266.19106 C 436.68534,268.37185 433.52821,272.06638 431.89450,273.60549 C 430.58545,275.14458 433.80759,274.35425 434.41977,275.60217 C 435.03195,276.85010 436.17979,278.92997 435.56761,281.09304 C 434.95541,283.25610 432.31537,287.20786 430.74665,288.58057 C 429.17792,289.95329 427.80052,287.29106 426.15528,289.32934 C 424.51003,291.36761 422.28407,299.71829 420.90664,301.67336 L 417.48396,301.49138 z " id="path1124" sodipodi:nodetypes="czzzzzzzzzzzzcc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.1391397pt;fill-opacity:1.0000000;" d="M 416.32791,257.15812 C 416.75710,258.83124 418.09832,262.76805 419.06400,263.65381 C 420.02968,264.53959 422.09518,264.80204 422.44389,263.65381 C 422.79261,262.50558 420.45889,256.73163 426.30662,253.61501 C 432.31530,250.49839 441.70387,251.22013 444.65456,252.63082 C 447.60524,254.04149 452.56778,259.29054 447.87350,262.86646 C 443.98394,266.44235 453.42615,266.54078 455.43799,265.03168 C 457.44983,263.52258 460.37237,257.93569 457.77040,255.24555 C 455.16843,252.55542 448.57199,246.12834 442.45601,245.47222 C 436.34004,244.81608 421.71962,252.10591 419.70779,252.63082 C 417.53502,253.15572 415.89872,255.48498 416.32791,257.15812 z " id="path1125" sodipodi:nodetypes="czzzzzzzzzz" /> </g> </g> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect1173" width="106.29922" height="106.29922" x="442.28839" y="202.59353" /> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect1174" width="106.29922" height="106.29922" x="548.58759" y="202.59353" /> <rect style="fill:url(#linearGradient701);fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.7500000;stroke-dasharray:none;" id="rect1204" width="91.250000" height="30.000000" x="-328.75000" y="241.11218" ry="12.500000" transform="scale(-1.000000,1.000000)" inkscape:export-xdpi="24" inkscape:export-ydpi="24" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:1.2724125pt;" d="M 388.57383,213.13538 C 379.66635,213.13798 364.38127,220.25447 358.44076,225.60098 C 346.55971,236.29396 339.90405,264.12663 339.90405,281.94828 C 339.90405,287.38044 339.91995,292.70961 340.14918,297.83897 L 434.80995,297.83897 C 435.05109,292.75440 435.09594,287.50108 435.09594,282.10600 C 435.09590,264.28438 431.44015,237.43003 419.53272,226.71626 C 413.57901,221.35937 397.48131,213.13278 388.57383,213.13538 z " id="path1205" sodipodi:nodetypes="cccccccc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.1655209pt;" d="M 392.11660,216.09851 C 390.59448,216.28810 389.59086,217.14834 389.42017,219.05583 L 388.23538,232.18635 L 387.09145,218.85868 C 386.40868,211.22873 372.07902,220.51307 366.78657,223.70869 C 355.93799,230.25918 345.09264,246.60574 345.09262,262.98196 C 345.09262,267.07602 342.49560,272.55970 350.15863,273.31289 C 363.09155,269.95835 367.67753,266.10981 367.84879,262.42993 C 367.93362,264.43872 364.18933,268.69866 369.15615,275.56046 C 363.84364,272.32139 341.65092,270.68388 346.56340,283.48609 C 352.60702,294.49682 379.27284,297.92453 379.49244,291.13570 C 379.71203,284.34688 385.75435,278.46430 375.16182,278.83323 C 377.85810,276.13516 384.39518,277.39107 387.09145,274.69297 L 388.27624,270.51328 L 389.62445,274.25923 C 392.32073,276.95731 398.61267,275.93801 401.30895,278.63608 C 392.44971,277.43066 396.75873,284.11029 396.97833,290.89912 C 397.19795,297.68793 423.90460,294.29967 429.94822,283.28893 C 434.86069,270.48672 412.62712,272.12423 407.31461,275.36330 C 412.28140,268.50149 408.53715,264.20213 408.62197,262.19335 C 408.79325,265.87321 413.37922,269.76120 426.31214,273.11573 C 433.97518,272.36253 431.41900,266.87885 431.41900,262.78481 C 431.41900,246.40858 420.57363,230.06203 409.72505,223.51154 C 405.75572,221.11480 396.68294,215.52973 392.11660,216.09851 z " id="path1206" sodipodi:nodetypes="cccccccccccccccccccccccc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt;" d="M 393.62953,236.79216 C 399.44415,234.56038 399.40593,234.34886 397.74122,236.39270 C 396.28079,238.43654 394.94411,234.62840 393.61407,246.39226 C 392.07976,258.55041 387.61065,239.22109 393.62953,236.79216 z " id="path1207" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt;" d="M 383.56005,237.00346 C 377.74544,234.77167 377.78366,234.56016 379.44837,236.60400 C 380.90880,238.64784 382.24548,234.83970 383.57552,246.60355 C 385.10983,258.76172 389.57894,239.43240 383.56005,237.00346 z " id="path1209" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#00ff00;stroke-width:8.1250000;stroke-linecap:round;stroke-linejoin:bevel;stroke-dashoffset:12.500000;stroke-dasharray:none;" d="M 428.23716,300.72398 L 352.16975,226.74092" id="path1210" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ff0000;stroke-width:5;stroke-dasharray:none;stroke-opacity:1" d="M 845.47619,180.57813 C 845.47619,194.72313 833.99619,206.20313 819.85119,206.20313 C 805.70619,206.20313 794.22619,194.72313 794.22619,180.57813 C 794.22619,166.43313 805.70619,154.95313 819.85119,154.95313 C 833.99619,154.95313 845.47619,166.43313 845.47619,180.57813 z" id="path1291" inkscape:export-filename="C:\pas\mricron\btn\new\ellipse.png" inkscape:export-xdpi="23.179588" inkscape:export-ydpi="23.179588" /> <rect style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ff0000;stroke-width:4.56593418" id="rect1303" width="48.979599" height="47.110672" x="834.32587" y="135.24585" inkscape:export-filename="C:\pas\mricron\btn\new\ellipse.png" inkscape:export-xdpi="23.179588" inkscape:export-ydpi="23.179588" /> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect1092" width="106.29922" height="106.29922" x="549.21260" y="95.669265" /> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect1093" width="106.29922" height="106.29922" x="442.91338" y="95.669265" /> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect1094" width="106.29922" height="106.29922" x="336.61417" y="95.669265" /> <rect style="font-size:12.000000;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;" id="rect1095" width="106.29922" height="106.29922" x="230.31496" y="95.669269" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59819369pt;" d="M 307.52069,149.83649 C 307.73008,149.34971 307.16264,144.07588 306.29519,142.71291 C 305.42774,141.34993 304.14065,141.95073 303.93127,142.43750 C 303.72189,142.92428 305.01624,142.27620 305.88368,143.63917 C 306.75113,145.00214 307.31131,150.32326 307.52069,149.83649 z " id="path1097" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.50397291pt;" d="M 303.64692,177.29080 C 301.81986,177.08709 301.45461,172.20619 300.18608,175.18373 C 298.85928,178.21449 301.59356,184.71360 301.83410,181.35444 C 302.01637,177.99529 305.41572,177.54773 303.64692,177.29080 z " id="path1098" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59819369pt;" d="M 312.76126,149.73551 C 312.55187,149.24873 313.11931,143.97489 313.98676,142.61193 C 314.85420,141.24895 316.14130,141.84974 316.35068,142.33652 C 316.56006,142.82330 315.26571,142.17522 314.39827,143.53819 C 313.53082,144.90116 312.97063,150.22228 312.76126,149.73551 z " id="path1099" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.50397291pt;" d="M 316.63503,177.18982 C 318.46209,176.98611 318.82734,172.10520 320.09587,175.08275 C 321.42267,178.11351 318.68839,184.61262 318.44784,181.25346 C 318.26558,177.89431 314.86623,177.44675 316.63503,177.18982 z " id="path1100" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:none;stroke-width:0.99068832pt;fill:#f30000;fill-opacity:1.0000000;" d="M 277.51799,168.04576 C 277.51799,158.03493 271.88453,137.95486 266.30062,131.93668 C 260.71669,125.91850 249.58599,125.93017 244.01446,131.93668 C 238.44291,137.94318 232.87137,157.96485 232.87137,167.97569 C 232.87137,177.98652 238.44291,187.99735 244.01446,192.00169 C 249.58599,196.00603 260.71669,195.99435 266.30062,192.00169 C 271.88453,188.00903 277.51799,178.05659 277.51799,168.04576 z " id="path1101" sodipodi:nodetypes="czzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.59819369pt;" d="M 256.08751,130.62734 C 256.01509,130.62732 255.94457,130.64692 255.87215,130.64789 L 255.87215,130.66845 C 255.81824,130.66283 255.76507,130.64786 255.71062,130.64789 C 255.58375,130.64794 255.46056,130.68588 255.33374,130.68900 L 255.33374,130.77121 C 255.25641,130.75940 255.17883,130.75069 255.10042,130.75066 C 255.04598,130.75064 254.99280,130.76560 254.93890,130.77121 L 254.93890,130.75066 C 254.86648,130.74969 254.79596,130.73008 254.72353,130.73010 C 250.90942,130.73144 247.09120,132.12216 244.54751,134.88183 C 243.27567,136.26166 235.99620,147.64157 238.44549,149.59783 C 244.54107,154.75309 249.82562,139.57745 244.18857,152.16697 C 243.62056,156.49125 243.47456,158.74599 243.43479,159.87438 C 243.35446,157.80732 242.69011,152.95912 239.19927,150.60493 C 236.28307,148.67874 234.37149,165.69312 234.37149,167.99284 C 234.37149,177.19175 239.46014,186.38729 244.54751,190.06685 C 247.12760,191.93297 251.01655,192.82869 254.88505,192.80041 L 254.88505,192.82096 C 255.08285,192.82284 255.27955,192.80333 255.47731,192.80041 L 255.47731,192.69764 C 255.62688,192.70426 255.77610,192.71964 255.92599,192.71820 L 255.92599,192.69764 C 259.79450,192.72592 263.68345,191.83022 266.26354,189.96409 C 271.35091,186.28452 276.43955,177.08898 276.43955,167.89007 C 276.43955,165.59035 274.52797,148.57597 271.61178,150.50217 C 268.12094,152.85635 267.45658,157.70455 267.37626,159.77161 C 267.33648,158.64323 267.19049,156.38848 266.62248,152.06420 C 260.98542,139.47469 266.26998,154.65032 272.36556,149.49507 C 274.81485,147.53880 267.53538,136.15888 266.26354,134.77906 C 263.71984,132.01939 259.90163,130.62867 256.08751,130.62734 z " id="path1102" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59819369pt;" d="M 252.78524,149.70528 C 252.99463,149.21850 252.42719,143.94467 251.55974,142.58169 C 250.69229,141.21872 249.40520,141.81952 249.19582,142.30629 C 248.98644,142.79307 250.28079,142.14499 251.14823,143.50796 C 252.01568,144.87093 252.57586,150.19205 252.78524,149.70528 z " id="path1103" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.50397291pt;" d="M 248.91147,177.15959 C 247.08441,176.95588 246.71916,172.07498 245.45063,175.05252 C 244.12383,178.08328 246.85811,184.58239 247.09865,181.22323 C 247.28092,177.86408 250.68027,177.41652 248.91147,177.15959 z " id="path1104" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59819369pt;" d="M 258.02581,149.60430 C 257.81642,149.11751 258.38386,143.84368 259.25131,142.48072 C 260.11875,141.11774 261.40585,141.71853 261.61523,142.20531 C 261.82461,142.69209 260.53026,142.04401 259.66282,143.40697 C 258.79537,144.76995 258.23518,150.09107 258.02581,149.60430 z " id="path1105" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.50397291pt;" d="M 261.89958,177.05861 C 263.72664,176.85490 264.09189,171.97399 265.36042,174.95154 C 266.68722,177.98230 263.95294,184.48141 263.71239,181.12225 C 263.53013,177.76310 260.13078,177.31554 261.89958,177.05861 z " id="path1106" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.37908139pt;fill:#00f300;fill-opacity:1.0000000;" d="M 284.46583,153.19549 L 284.66716,159.20701 L 284.66716,159.51930 L 270.26011,159.51930 L 270.26011,172.16691 L 284.52875,172.16691 L 284.46583,178.49072 L 298.73447,165.84310 L 284.46583,153.19549 z " id="path1197" /> <g id="g1218" transform="matrix(0.937345,0.000000,-0.521597,0.915342,103.6709,16.62999)"> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.99068832pt;" d="M 420.68026,157.78820 C 420.68026,143.66413 411.49144,115.33358 402.38342,106.84266 C 393.27539,98.351740 375.11992,98.368210 366.03210,106.84266 C 356.94426,115.31711 347.85643,143.56526 347.85643,157.68934 C 347.85643,171.81342 356.94426,185.93749 366.03210,191.58713 C 375.11992,197.23676 393.27539,197.22028 402.38342,191.58713 C 411.49144,185.95397 420.68026,171.91228 420.68026,157.78820 z " id="path1198" sodipodi:nodetypes="czzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;fill-opacity:1.0000000;" d="M 385.72466,104.99534 C 385.60653,104.99531 385.49150,105.02296 385.37337,105.02434 L 385.37337,105.05334 C 385.28545,105.04542 385.19871,105.02430 385.10991,105.02434 C 384.90297,105.02441 384.70203,105.07794 384.49516,105.08234 L 384.49516,105.19833 C 384.36904,105.18166 384.24249,105.16937 384.11460,105.16933 C 384.02579,105.16930 383.93906,105.19041 383.85113,105.19833 L 383.85113,105.16933 C 383.73301,105.16796 383.61798,105.14030 383.49985,105.14033 C 377.27858,105.14222 371.05063,107.10435 366.90157,110.99791 C 364.82705,112.94468 352.95338,129.00036 356.94846,131.76041 C 366.89106,139.03386 375.51079,117.62287 366.31609,135.38515 C 365.38960,141.48619 365.15147,144.66736 365.08659,146.25937 C 364.95557,143.34300 363.87193,136.50278 358.17796,133.18131 C 353.42130,130.46368 350.30330,154.46891 350.30330,157.71354 C 350.30330,170.69209 358.60347,183.66588 366.90157,188.85730 C 371.11000,191.49017 377.45333,192.75392 383.76331,192.71402 L 383.76331,192.74302 C 384.08594,192.74567 384.40678,192.71814 384.72935,192.71402 L 384.72935,192.56903 C 384.97331,192.57837 385.21671,192.60006 385.46120,192.59803 L 385.46120,192.56903 C 391.77118,192.60893 398.11451,191.34520 402.32294,188.71231 C 410.62104,183.52089 418.92121,170.54709 418.92121,157.56855 C 418.92121,154.32392 415.80320,130.31868 411.04655,133.03632 C 405.35258,136.35779 404.26894,143.19801 404.13792,146.11438 C 404.07304,144.52237 403.83491,141.34119 402.90841,135.24016 C 393.71372,117.47788 402.33345,138.88886 412.27605,131.61542 C 416.27113,128.85537 404.39746,112.79968 402.32294,110.85292 C 398.17388,106.95936 391.94593,104.99722 385.72466,104.99534 z " id="path1201" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;" d="M 380.33827,131.91200 C 380.67980,131.22522 379.75424,123.78448 378.33933,121.86149 C 376.92442,119.93850 374.82503,120.78615 374.48350,121.47293 C 374.14198,122.15971 376.25321,121.24535 377.66811,123.16834 C 379.08302,125.09132 379.99675,132.59878 380.33827,131.91200 z " id="path1202" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.76453004pt;" d="M 374.01970,170.64672 C 371.03955,170.35930 370.44378,163.47294 368.37466,167.67389 C 366.21050,171.94993 370.67043,181.11939 371.06278,176.38002 C 371.36008,171.64067 376.90481,171.00921 374.01970,170.64672 z " id="path1203" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;" d="M 388.88624,131.76953 C 388.54471,131.08274 389.47027,123.64200 390.88518,121.71902 C 392.30008,119.79602 394.39948,120.64367 394.74101,121.33045 C 395.08253,122.01724 392.97130,121.10288 391.55640,123.02586 C 390.14149,124.94885 389.22776,132.45631 388.88624,131.76953 z " id="path1216" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.76453004pt;" d="M 395.20481,170.50425 C 398.18496,170.21683 398.78073,163.33046 400.84985,167.53142 C 403.01401,171.80746 398.55408,180.97692 398.16173,176.23755 C 397.86443,171.49819 392.31970,170.86674 395.20481,170.50425 z " id="path1217" sodipodi:nodetypes="czzz" /> </g> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.37908139pt;fill:#00f300;fill-opacity:1.0000000;" d="M 428.01911,162.01828 L 423.37484,168.02980 L 423.12311,168.34209 L 408.71606,168.34209 L 398.52142,180.98970 L 412.79006,180.98970 L 407.62982,187.31351 L 432.09311,174.66589 L 428.01911,162.01828 z " id="path1225" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.37908139pt;fill:#00f300;fill-opacity:1.0000000;" d="M 354.54175,137.59503 L 359.18602,131.58351 L 359.43775,131.27122 L 373.84480,131.27122 L 384.03944,118.62361 L 369.77080,118.62361 L 374.93104,112.29980 L 350.46775,124.94742 L 354.54175,137.59503 z " id="path1226" /> <path style="fill:url(#linearGradient1273);fill-rule:evenodd;stroke-width:0.70212674pt;fill-opacity:1.0000000;" d="M 467.37635,98.353752 C 463.50624,98.508099 459.42100,99.228043 455.01853,100.26653 C 449.14858,101.65118 445.35681,115.09401 447.03802,123.34197 C 448.71924,131.58992 453.74697,146.51332 454.11773,158.09757 L 460.40924,157.95512 C 460.70198,148.86493 458.20224,140.91179 457.10163,132.39714 C 456.41064,127.05144 453.86311,111.80425 462.99904,111.80425 L 470.06467,111.80425 L 470.06467,111.84495 L 478.04518,111.84495 C 487.18110,111.84495 484.61950,127.11248 483.92851,132.45819 C 482.82791,140.97284 480.32815,148.90562 480.62089,157.99581 L 486.91240,158.13826 C 487.28316,146.55402 492.31090,131.63062 493.99211,123.38267 C 495.67333,115.13471 491.88156,101.69188 486.01161,100.30723 C 480.65069,99.042651 475.78320,98.287415 471.17659,98.414798 L 471.17659,98.394449 C 469.92961,98.310515 468.66639,98.302304 467.37635,98.353752 z " id="path1231" transform="translate(43.75223,40.21670)" /> <rect style="fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.87235308pt;" id="rect1232" width="5.7452426" height="5.3810821" x="454.09512" y="152.41942" transform="translate(43.75223,40.21670)" /> <rect style="fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.87235308pt;" id="rect1233" width="5.7452426" height="5.3810821" x="481.16409" y="152.41943" transform="translate(43.75223,40.21670)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ff0000;stroke-width:5.0000000;stroke-opacity:1.0000000;stroke-linecap:round;stroke-dasharray:10.000000,10.000000;stroke-dashoffset:0.00000000;" d="M 555.46141,176.42468 C 559.55050,176.42960 566.62926,182.31051 567.72869,176.43945 C 568.82812,170.88089 576.44823,114.43157 580.80799,105.57330 C 585.16775,96.715032 581.98180,115.22882 595.40407,119.22734 C 609.13884,122.91336 613.18611,180.92271 621.29587,184.46848 C 629.40563,187.70175 630.95289,182.51721 635.31265,179.56445 C 639.67241,176.61170 641.84468,176.43945 646.20445,176.43945" id="path1280" sodipodi:nodetypes="czzzzzz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#040600;stroke-width:3.7500000;stroke-opacity:1.0000000;stroke-linecap:butt;stroke-dasharray:3.7500000,3.7500000;stroke-dashoffset:0.00000000;" d="M 555.25347,176.62690 C 559.34256,176.63182 566.42132,180.01273 567.52075,174.14167 C 568.62018,168.58311 571.24029,134.00879 575.60005,125.15052 C 579.95981,116.29225 583.02386,104.80604 596.13363,110.67956 C 608.93090,123.74058 622.04067,188.31243 625.15043,189.67070 C 627.32269,190.40397 630.74495,182.71943 635.10471,179.76667 C 639.46447,176.81392 641.63674,176.64167 645.99651,176.64167" id="path1281" sodipodi:nodetypes="czzzzzz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#040600;stroke-width:3.7500000;stroke-opacity:1.0000000;stroke-linecap:butt;stroke-dasharray:3.7500000,3.7500000;stroke-dashoffset:0.00000000;" d="M 557.12849,76.779411 C 561.21758,76.784331 568.29634,80.165241 569.39577,74.294181 C 570.49520,68.735621 573.11531,34.161301 577.47507,25.303031 C 581.83483,16.444761 584.89888,4.9585510 598.00865,10.832071 C 610.80592,23.893091 623.91569,88.464940 627.02545,89.823210 C 629.19771,90.556480 632.61997,82.871941 636.97973,79.919181 C 641.33949,76.966431 643.51176,76.794181 647.87153,76.794181" id="path1282" sodipodi:nodetypes="czzzzzz" /> <text xml:space="preserve" style="fill:#ff0000;fill-opacity:1.0000000;stroke:none;font-family:Arial;font-style:normal;font-weight:bold;font-size:36.000000;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;font-stretch:normal;font-variant:normal;text-anchor:start;writing-mode:lr;" x="383.35034" y="50.653559" id="text1283" sodipodi:linespacing="100%" transform="scale(1.505663,1.564296)"><tspan id="tspan1284" style="fill:#ff0000;fill-opacity:1.0000000;">?</tspan></text> <g id="g1163" transform="matrix(1.152996,0.000000,0.000000,1.000000,-68.02037,0.000000)"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.0770883;stroke-dasharray:none;" d="M 472.42571,238.27147 C 472.33405,238.27145 472.24478,238.29291 472.15311,238.29398 L 472.15311,238.31648 C 472.08489,238.31034 472.01758,238.29395 471.94867,238.29398 C 471.78809,238.29403 471.63216,238.33557 471.47163,238.33899 L 471.47163,238.42899 C 471.37376,238.41606 471.27556,238.40652 471.17632,238.40649 C 471.10740,238.40647 471.04010,238.42285 470.97187,238.42899 L 470.97187,238.40649 C 470.88021,238.40543 470.79094,238.38396 470.69928,238.38399 C 465.87162,238.38545 461.03877,239.90805 457.81913,242.92943 C 456.20932,244.44011 446.99543,256.89920 450.09559,259.04098 C 457.81097,264.68512 464.49982,248.07035 457.36480,261.85375 C 456.64585,266.58811 456.46107,269.05668 456.41072,270.29207 C 456.30905,268.02898 455.46815,262.72102 451.04967,260.14359 C 447.35854,258.03472 444.93899,276.66261 444.93899,279.18042 C 444.93899,289.25168 451.37986,299.31925 457.81913,303.34776 C 461.08484,305.39084 466.00722,306.37150 470.90372,306.34054 L 470.90372,306.36305 C 471.15408,306.36510 471.40305,306.34374 471.65336,306.34054 L 471.65336,306.22803 C 471.84267,306.23528 472.03155,306.25211 472.22127,306.25053 L 472.22127,306.22803 C 477.11777,306.25899 482.04015,305.27835 485.30586,303.23524 C 491.74513,299.20674 498.18600,289.13916 498.18600,279.06791 C 498.18600,276.55010 495.76645,257.92220 492.07532,260.03107 C 487.65684,262.60851 486.81594,267.91647 486.71427,270.17956 C 486.66392,268.94417 486.47914,266.47559 485.76018,261.74124 C 478.62517,247.95784 485.31402,264.57260 493.02940,258.92847 C 496.12956,256.78669 486.91567,244.32759 485.30586,242.81691 C 482.08622,239.79554 477.25337,238.27293 472.42571,238.27147 z " id="path1211" transform="matrix(0.896078,0.000000,0.000000,0.909383,46.81814,19.67645)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.70418520pt;" d="M 468.24591,259.15861 C 468.51094,258.62567 467.79271,252.85171 466.69475,251.35949 C 465.59679,249.86726 463.96768,250.52503 463.70265,251.05797 C 463.43764,251.59090 465.07594,250.88137 466.17389,252.37359 C 467.27185,253.86581 467.98090,259.69155 468.24591,259.15861 z " id="path1212" sodipodi:nodetypes="czzzz" transform="matrix(0.896078,0.000000,0.000000,0.909383,46.81814,19.67645)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt;" d="M 463.34275,289.21648 C 461.03017,288.99344 460.56786,283.64967 458.96224,286.90958 C 457.28286,290.22776 460.74374,297.34319 461.04820,293.66548 C 461.27890,289.98777 465.58157,289.49777 463.34275,289.21648 z " id="path1213" sodipodi:nodetypes="czzz" transform="matrix(0.896078,0.000000,0.000000,0.909383,46.81814,19.67645)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.70418520pt;" d="M 474.87908,259.04805 C 474.61405,258.51511 475.33228,252.74115 476.43024,251.24893 C 477.52819,249.75670 479.15731,250.41447 479.42234,250.94740 C 479.68735,251.48035 478.04905,250.77081 476.95110,252.26303 C 475.85314,253.75526 475.14409,259.58099 474.87908,259.04805 z " id="path1214" sodipodi:nodetypes="czzzz" transform="matrix(0.896078,0.000000,0.000000,0.909383,46.81814,19.67645)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt;" d="M 479.78224,289.10592 C 482.09482,288.88288 482.55713,283.53911 484.16275,286.79902 C 485.84213,290.11720 482.38125,297.23264 482.07679,293.55492 C 481.84609,289.87721 477.54342,289.38721 479.78224,289.10592 z " id="path1215" sodipodi:nodetypes="czzz" transform="matrix(0.896078,0.000000,0.000000,0.909383,46.81814,19.67645)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt;" d="M 479.78224,289.10592 C 482.09482,288.88288 482.55713,283.53911 484.16275,286.79902 C 485.84213,290.11720 482.38125,297.23264 482.07679,293.55492 C 481.84609,289.87721 477.54342,289.38721 479.78224,289.10592 z " id="path1245" sodipodi:nodetypes="czzz" transform="matrix(0.896078,0.000000,0.000000,0.909383,71.19322,13.47142)" /> <path transform="matrix(0.820025,0.000000,0.000000,0.858963,104.9588,28.96850)" style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.0770884;" d="M 472.42572,238.27147 C 466.99935,238.34460 460.99557,239.27928 457.24200,243.60560 C 454.27786,247.05912 447.54300,265.39403 446.58800,268.07554 C 444.99506,275.03305 443.89364,282.61304 446.99670,289.34223 C 449.98685,297.12243 456.23622,304.66231 464.92263,305.85892 C 470.66585,306.65810 476.71462,306.56039 482.24009,304.66227 C 488.70615,302.32029 492.95294,296.28794 495.73557,290.27853 C 498.36218,284.49691 498.76947,277.90311 497.25994,271.76637 C 496.60360,267.85969 495.93735,263.78918 493.70802,260.42078 C 490.47721,259.07927 488.59909,263.53006 487.49637,265.86353 C 487.00972,267.33824 486.63024,271.50536 486.49583,267.70454 C 486.56751,263.78501 485.27565,260.09141 483.12367,256.86000 C 483.47775,256.38368 486.42646,260.44859 488.46678,259.99317 C 492.66404,261.29430 494.92727,256.76681 492.55453,253.62131 C 490.80672,249.96760 488.38631,246.65200 485.92858,243.45619 C 482.48414,239.81958 477.32986,238.26882 472.42572,238.27147 z " id="path1151" sodipodi:nodetypes="cccccccccccccccc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.70418520pt;" d="M 469.29214,259.15861 C 471.28335,258.62567 470.01209,252.60872 468.91413,251.11650 C 467.81617,249.62427 460.51529,248.09514 463.70265,251.05797 C 467.13661,253.77781 467.05433,259.69155 469.29214,259.15861 z " id="path1242" sodipodi:nodetypes="czzz" transform="matrix(0.820025,0.000000,0.000000,0.858963,104.9588,28.96850)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt;" d="M 466.83017,280.96913 C 464.51759,280.74609 460.56786,283.64967 458.96224,286.90958 C 457.28286,290.22776 460.74374,297.34319 461.04820,293.66548 C 461.27890,289.98777 469.06899,281.25042 466.83017,280.96913 z " id="path1243" sodipodi:nodetypes="czzz" transform="matrix(0.820025,0.000000,0.000000,0.858963,104.9588,28.96850)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59100037pt;" d="M 493.43163,251.60533 C 491.79878,251.14755 492.84125,245.97921 493.74161,244.69745 C 494.64196,243.41568 500.62886,242.10222 498.01515,244.64717 C 495.19921,246.98342 495.26668,252.06310 493.43163,251.60533 z " id="path1152" sodipodi:nodetypes="czzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.5214069;" d="M 511.80663,239.60773 C 505.82577,239.32916 500.11547,244.27305 498.49491,246.98563 C 497.16791,249.22473 493.46139,261.39466 492.85327,264.14860 C 492.10462,268.10699 491.68917,272.26850 492.99906,276.15741 C 494.65527,281.44574 497.85490,286.62328 502.77269,289.10403 C 505.89347,290.48383 509.46589,290.71532 512.64653,290.47013 C 516.82711,290.39011 521.19160,289.06289 524.01723,285.66210 C 528.59029,280.58529 531.28514,273.27869 529.87427,266.31128 C 529.26796,262.87343 525.92547,250.57752 524.78129,248.36436 C 522.92298,245.30255 517.65774,239.61035 511.80663,239.60773 z " id="path1149" sodipodi:nodetypes="cccccccccc" /> </g> <path style="fill:#cccccc;fill-rule:nonzero;stroke:none;fill-opacity:1.0000000;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;" id="path1142" d="M 154.48440,498.48337 C 154.25849,492.81414 161.38338,496.65143 161.80515,496.90392 C 164.78182,498.61634 170.39318,504.14280 173.95269,504.05991 C 175.95558,503.84576 177.63390,502.63440 179.05959,501.28272 C 180.33976,499.99776 181.20682,498.58127 182.06397,497.00066 C 183.44438,494.70321 187.18348,487.99384 189.77932,488.11380 C 192.16403,488.34388 196.44293,490.85911 198.63874,491.77507 C 200.34301,492.48848 203.47991,491.83913 205.21157,492.48524 C 206.51580,492.94214 202.88897,499.07531 204.26060,499.25768 C 205.40017,499.35058 206.09747,498.86094 206.93516,498.11576 C 207.57391,497.51451 211.51747,500.31315 210.70090,501.08164 C 208.56717,502.98125 206.27814,503.85683 203.40943,503.55889 C 201.58416,503.29953 199.79391,502.83223 198.06231,502.20168 C 196.27903,501.51624 194.58389,500.64017 192.82470,499.89873 C 191.28048,499.25617 189.66739,498.59467 187.99351,498.39461 C 187.36694,498.35913 187.14450,498.30179 186.79211,498.84177 C 185.67318,500.80361 184.50376,502.56949 182.88013,504.16267 C 180.31823,506.51125 177.42085,508.14583 173.89191,508.33224 C 169.23300,508.20987 162.04502,509.96482 156.25203,500.75392 C 155.96788,500.55562 159.95745,495.74444 159.84831,498.48337 L 154.48440,498.48337 z " sodipodi:nodetypes="ccccccccccccccccccccc" /> <rect style="fill:#f9bac0;fill-rule:evenodd;stroke:#000000;stroke-width:0.49504948pt;" id="rect1120" width="12.250767" height="12.000593" x="141.62668" y="387.23074" ry="3.9226213" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <rect style="fill:url(#linearGradient1118);fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;" id="rect1117" width="53.347649" height="11.244847" x="150.89017" y="387.60864" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750000;" d="M 153.76675,391.00825 L 202.40725,390.74674 L 202.40725,390.74674" id="path1126" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750000;" d="M 153.76675,395.58464 L 202.40725,395.32313 L 202.40725,395.32313" id="path1128" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <path style="fill:#e49415;fill-rule:evenodd;stroke-width:1.0000000pt;fill-opacity:1.0000000;" d="M 204.76083,387.08564 L 226.72751,392.93844 L 205.02234,399.37652 L 204.76083,387.08564 z " id="path1129" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <path style="fill:#040023;fill-rule:evenodd;stroke-width:1.0000000pt;" d="M 219.01301,390.87754 L 227.25053,392.93225 L 219.11108,395.19241 L 219.01301,390.87754 z " id="path1132" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <g id="g1195" transform="matrix(0.789807,0.000000,0.000000,0.829148,40.60222,144.2242)"> <path sodipodi:type="arc" style="font-size:12;fill:url(#radialGradient1169);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87645;stroke-dasharray:none;" id="path1190" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(1.269231,0.000000,0.000000,1.209574,-184.6799,-194.3941)" /> <path style="font-size:12;fill:url(#linearGradient683);fill-opacity:0.38017;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 159.72524,722.93003 C 140.50054,722.93003 124.04616,733.91302 116.57139,749.57844 C 122.48956,752.61039 129.09474,755.48259 136.87909,753.39616 C 151.49622,750.20385 156.06571,742.67836 163.37427,739.48607 C 178.69415,738.91352 186.03123,746.78366 201.13390,746.44112 C 193.03644,732.49107 177.62722,722.93004 159.72524,722.93003 z " id="path1191" /> <text xml:space="preserve" style="fill:black;fill-opacity:1;stroke:none;font-family:Palatino Linotype;font-style:normal;font-weight:bold;font-size:48;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;text-anchor:start;writing-mode:lr;" x="47.569456" y="419.89508" id="text1192" sodipodi:linespacing="100%" transform="scale(2.880225,1.909157)"><tspan x="47.569454" y="419.89508" sodipodi:role="line" id="tspan1193">i</tspan></text> </g> <path style="fill:#fb4100;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;" d="M 157.91689,807.80962 C 166.13755,791.78371 180.28774,804.25361 190.66459,804.96480 C 199.69378,804.60921 200.63712,785.40677 217.75218,788.60718 C 225.70328,790.50372 223.55297,827.08308 212.09209,833.76845 C 196.05440,842.76799 149.69621,823.47991 157.91689,807.80962 z " id="path1179" sodipodi:nodetypes="cccsz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 135.72268,361.98087 C 134.67665,364.33444 139.37290,364.60684 143.68234,366.31209 C 147.99177,368.01734 152.43742,371.67846 155.07429,372.44119 C 160.34804,373.96665 169.84949,374.44608 173.64136,373.48722 C 177.43323,372.52836 177.12814,369.56460 177.82549,365.64199" id="path1135" sodipodi:nodetypes="cszzz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 163.44255,357.27376 C 158.21239,350.47455 167.88818,351.25907 168.41121,347.07494 C 171.02628,336.87613 161.08898,335.30708 161.08898,335.30708 C 161.08898,335.30708 167.10367,327.72334 168.67271,323.53921 C 163.44255,317.78603 163.96556,318.57056 155.85881,322.23167" id="path1138" sodipodi:nodetypes="ccccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 169.19573,382.90152 C 169.80591,375.31778 164.40140,374.66401 162.13500,373.48722" id="path1141" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 135.59193,366.63075 C 138.73003,373.95298 150.19280,376.35013 155.46655,377.87559" id="path1153" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 163.44255,357.27376 C 158.21239,350.47455 167.88818,351.25907 168.41121,347.07494 C 171.02628,336.87613 161.08898,335.30708 161.08898,335.30708 C 161.08898,335.30708 167.10367,327.72334 168.67271,323.53921 C 163.44255,317.78603 163.96556,318.57056 155.85881,322.23167" id="path1167" sodipodi:nodetypes="ccccc" transform="matrix(-1.000000,0.000000,0.000000,1.000000,355.9476,-0.390884)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 169.19573,382.90152 C 169.80591,375.31778 164.40140,374.66401 162.13500,373.48722" id="path1169" sodipodi:nodetypes="cz" transform="matrix(-1.000000,0.000000,0.000000,1.000000,355.9476,-0.390884)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 135.59193,366.63075 C 138.73003,373.95298 150.19280,376.35013 155.46655,377.87559" id="path1170" sodipodi:nodetypes="cz" transform="matrix(-1.000000,0.000000,0.000000,1.000000,355.9476,-0.390884)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 220.21273,361.50548 C 221.25876,363.85905 216.56251,364.13145 212.25307,365.83670 C 207.94364,367.54195 203.49799,371.20307 200.86112,371.96580 C 195.58737,373.49126 186.08592,373.97069 182.29405,373.01183 C 178.50218,372.05297 177.49973,366.73564 177.84841,362.29001" id="path1194" sodipodi:nodetypes="cszzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 140.95285,349.68999 C 133.28195,370.78498 141.91171,361.71936 146.70603,361.98087" id="path1195" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 214.47932,349.22398 C 222.15022,370.31897 213.52046,361.25335 208.72614,361.51486" id="path1218" sodipodi:nodetypes="cz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;fill-opacity:1.0000000;stroke-dasharray:none;" d="M 185.21408,214.81126 C 177.92178,214.84746 169.89667,216.34801 165.05912,222.33190 C 161.50198,226.47814 158.94781,231.38316 156.20835,236.05592 C 154.24583,240.57871 150.03197,261.81828 149.86587,269.23814 C 150.70984,281.21595 157.20263,293.02343 167.55100,299.31527 C 175.78925,303.36046 185.45955,303.01158 194.27144,301.44543 C 202.01619,299.89951 208.18824,294.32026 212.14021,287.69026 C 217.68379,279.16981 219.82461,268.45263 217.31152,258.53961 C 216.32638,253.20688 212.48476,234.67682 209.09445,230.93333 C 205.45913,224.31738 200.50275,217.42497 192.63972,215.77674 C 190.22232,215.12439 187.71654,214.81512 185.21408,214.81126 z " id="path1223" sodipodi:nodetypes="ccccccccccc" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 180.70208,215.01333 C 181.74811,215.62352 183.81774,213.67597 184.21000,227.75382 C 184.60226,241.83167 184.55612,297.03969 184.90479,299.48044 C 185.25346,301.65968 182.57494,302.51823 179.56086,302.28043" id="path1220" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 187.98937,214.98472 C 186.94334,215.59491 184.87371,213.64736 184.48145,227.72521 C 184.08919,241.80306 185.05990,297.38091 184.71123,299.82166 C 184.36256,302.00090 187.22600,302.30470 190.24007,302.06691" id="path1221" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 198.27418,254.64653 C 190.41203,244.47236 191.26648,241.49489 199.51959,235.25317 C 193.82983,232.56245 193.75599,229.68727 203.74206,223.38038" id="path1224" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 168.46763,255.66748 C 176.32978,245.49331 175.47533,242.51584 167.22222,236.27412 C 172.91198,233.58340 172.98582,230.70822 162.99975,224.40133" id="path1227" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 180.29127,257.60125 C 177.08610,261.85427 169.96690,256.58422 168.45677,255.56719 C 166.94664,254.55016 164.75849,259.45038 160.32055,257.97107 C 156.06753,256.49176 156.62226,252.23874 156.62226,252.23874" id="path1228" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 178.41857,269.78296 C 174.28883,271.44718 168.21022,264.73499 166.70009,263.71796 C 165.18996,262.70093 163.00181,267.60115 158.56387,266.12184 C 154.31085,264.64253 152.09187,253.73260 152.09187,253.73260" id="path1229" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 172.80225,296.62724 C 163.12509,284.60782 172.09341,288.02873 172.43243,282.01902 C 173.14127,276.37914 178.61280,275.40749 174.54738,276.22889 C 171.53434,276.86667 168.64169,272.21856 159.85827,276.10176" id="path1230" sodipodi:nodetypes="czsz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 187.87277,256.20713 C 191.07794,260.46015 198.19714,255.19010 199.70727,254.17307 C 201.21740,253.15604 203.40555,258.05626 207.84349,256.57695 C 212.09651,255.09764 211.54178,250.84462 211.54178,250.84462" id="path1232" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 188.17642,268.38884 C 192.30616,270.05306 199.95382,263.34087 201.46395,262.32384 C 202.97408,261.30681 205.16223,266.20703 209.60017,264.72772 C 213.85319,263.24841 216.07217,252.33848 216.07217,252.33848" id="path1233" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 196.93084,294.71010 C 206.60800,282.69068 197.63968,286.11159 197.30066,280.10188 C 196.59182,274.46200 191.12029,273.49035 195.18571,274.31175 C 198.19875,274.94953 201.09140,270.30142 209.87482,274.18462" id="path1234" sodipodi:nodetypes="czsz" /> <g id="g1278" transform="matrix(0.605285,0.000000,0.000000,0.597196,215.4523,158.0050)" style=""> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;fill-opacity:1.0000000;stroke-dasharray:none;" d="M 804.64950,250.44849 C 797.35720,250.48469 789.33209,251.98524 784.49454,257.96913 C 780.93740,262.11537 778.38323,267.02039 775.64377,271.69315 C 773.68125,276.21594 769.46739,297.45551 769.30129,304.87537 C 770.14526,316.85318 776.63805,328.66066 786.98642,334.95250 C 795.22467,338.99769 804.89497,338.64881 813.70686,337.08266 C 821.45161,335.53674 827.62366,329.95749 831.57563,323.32749 C 837.11921,314.80704 839.26003,304.08986 836.74694,294.17684 C 835.76180,288.84411 831.92018,270.31405 828.52987,266.57056 C 824.89455,259.95461 819.93817,253.06220 812.07514,251.41397 C 809.65774,250.76162 807.15196,250.45235 804.64950,250.44849 z " id="path1255" sodipodi:nodetypes="ccccccccccc" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 800.13750,250.65056 C 801.18353,251.26075 803.25316,249.31320 803.64542,263.39105 C 804.03768,277.46890 803.99154,332.67692 804.34021,335.11767 C 804.68888,337.29691 802.01036,338.15546 798.99628,337.91766" id="path1256" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 807.42479,250.62195 C 806.37876,251.23214 804.30913,249.28459 803.91687,263.36244 C 803.52461,277.44029 804.49532,333.01814 804.14665,335.45889 C 803.79798,337.63813 806.66142,337.94193 809.67549,337.70414" id="path1257" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 817.70960,290.28376 C 809.84745,280.10959 810.70190,277.13212 818.95501,270.89040 C 813.26525,268.19968 813.19141,265.32450 823.17748,259.01761" id="path1258" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 787.90305,291.30471 C 795.76520,281.13054 794.91075,278.15307 786.65764,271.91135 C 792.34740,269.22063 792.42124,266.34545 782.43517,260.03856" id="path1259" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 799.72669,293.23848 C 796.52152,297.49150 789.40232,292.22145 787.89219,291.20442 C 786.38206,290.18739 784.19391,295.08761 779.75597,293.60830 C 775.50295,292.12899 776.05768,287.87597 776.05768,287.87597" id="path1260" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 802.03812,301.75908 C 797.90838,303.42330 787.64564,300.37222 786.13551,299.35519 C 784.62538,298.33816 782.43723,303.23838 777.99929,301.75907 C 773.74627,300.27976 771.52729,289.36983 771.52729,289.36983" id="path1261" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 792.23767,329.12637 C 782.56051,317.10695 791.52883,320.52786 791.86785,314.51815 C 792.57669,308.87827 798.04822,307.90662 793.98280,308.72802 C 790.96976,309.36580 788.07711,304.71769 779.29369,308.60089" id="path1262" sodipodi:nodetypes="czsz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 807.30819,291.84436 C 810.51336,296.09738 817.63256,290.82733 819.14269,289.81030 C 820.65282,288.79327 822.84097,293.69349 827.27891,292.21418 C 831.53193,290.73487 830.97720,286.48185 830.97720,286.48185" id="path1263" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 804.99676,300.36496 C 809.12650,302.02918 819.38924,298.97810 820.89937,297.96107 C 822.40950,296.94404 824.59765,301.84426 829.03559,300.36495 C 833.28861,298.88564 835.50759,287.97571 835.50759,287.97571" id="path1264" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 814.79721,327.73225 C 824.47437,315.71283 815.50605,319.13374 815.16703,313.12403 C 814.45819,307.48415 808.98666,306.51250 813.05208,307.33390 C 816.06512,307.97168 818.95777,303.32357 827.74119,307.20677" id="path1265" sodipodi:nodetypes="czsz" /> </g> <g id="g1266" transform="matrix(0.487368,0.000000,0.000000,0.429443,313.4603,114.8768)" style=""> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 794.59961,348.91352 C 790.03327,348.45566 780.97520,354.26681 777.00586,356.66352 C 766.15728,363.21403 755.31838,379.56855 755.31836,395.94477 C 755.31836,400.03884 751.87463,403.64256 756.78711,416.44477 C 762.83073,427.45552 789.50501,430.88985 789.72461,424.10102 C 789.94420,417.31220 785.63328,420.68577 790.94336,415.50727 C 791.10542,425.53543 794.55927,425.71342 794.41211,431.63227 C 794.31794,435.15902 794.12648,443.04382 795.47461,441.69477 L 797.41211,442.00727 L 797.41211,442.13227 L 797.78711,442.06977 L 799.72461,441.75727 C 801.07274,443.10632 800.88128,435.22151 800.78711,431.69477 C 800.63995,425.77592 804.09380,425.59792 804.25586,415.56977 C 809.56594,420.74827 805.25502,417.37469 805.47461,424.16352 C 805.69421,430.95235 832.36849,427.51801 838.41211,416.50727 C 843.32459,403.70506 839.88086,400.10133 839.88086,396.00727 C 839.88084,379.63105 829.04194,363.27652 818.19336,356.72602 C 814.22402,354.32931 805.16595,348.51815 800.59961,348.97602 C 799.07750,349.12864 798.05155,349.97479 797.88086,351.88227 L 797.07659,404.26454 L 797.31836,351.81977 C 797.14767,349.91230 796.12172,349.06614 794.59961,348.91352 z " id="path1241" sodipodi:nodetypes="ccccccccccccccccccccccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 755.15810,397.61810 C 754.11207,399.97167 758.80832,400.24407 763.11776,401.94932 C 767.42719,403.65457 771.87284,407.31569 774.50971,408.07842 C 779.78346,409.60388 789.28491,410.08331 793.07678,409.12445 C 796.86865,408.16559 796.56356,405.20183 797.26091,401.27922" id="path1244" sodipodi:nodetypes="cszzz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 782.87797,392.91099 C 777.64781,386.11178 787.32360,386.89630 787.84663,382.71217 C 790.46170,372.51336 780.52440,370.94431 780.52440,370.94431 C 780.52440,370.94431 786.53909,363.36057 788.10813,359.17644 C 782.87797,353.42326 783.40098,354.20779 775.29423,357.86890" id="path1246" sodipodi:nodetypes="ccccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 788.63115,418.53875 C 789.24133,410.95501 783.83682,410.30124 781.57042,409.12445" id="path1247" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 755.02735,402.26798 C 758.16545,409.59021 769.62822,411.98736 774.90197,413.51282" id="path1248" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 811.94047,392.52010 C 817.17063,385.72089 807.49484,386.50541 806.97181,382.32128 C 804.35674,372.12247 814.29404,370.55342 814.29404,370.55342 C 814.29404,370.55342 808.27935,362.96968 806.71031,358.78555 C 811.94047,353.03237 811.41746,353.81690 819.52421,357.47801" id="path1249" sodipodi:nodetypes="ccccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 806.18729,418.14786 C 805.57711,410.56412 810.98162,409.91035 813.24802,408.73356" id="path1250" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 839.79109,401.87709 C 836.65299,409.19932 825.19022,411.59647 819.91647,413.12193" id="path1251" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 839.64815,397.14271 C 840.69418,399.49628 835.99793,399.76868 831.68849,401.47393 C 827.37906,403.17918 822.93341,406.84030 820.29654,407.60303 C 815.02279,409.12849 805.52134,409.60792 801.72947,408.64906 C 797.93760,407.69020 796.93515,402.37287 797.28383,397.92724" id="path1252" sodipodi:nodetypes="cszzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 760.38827,385.32722 C 752.71737,406.42221 761.34713,397.35659 766.14145,397.61810" id="path1253" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 833.91474,384.86121 C 841.58564,405.95620 832.95588,396.89058 828.16156,397.15209" id="path1254" sodipodi:nodetypes="cz" /> </g> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect1342" width="106.29922" height="106.29922" x="678.02699" y="257.57566" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt;" id="rect1300" width="42.038873" height="31.251435" x="577.48017" y="355.15182" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 585.39981,368.71772 C 595.39981,369.55105 611.65089,374.39889 615.88182,379.14146 C 620.11275,384.31923 621.65174,382.78809 623.97519,388.42080 C 625.83395,393.88440 626.66596,396.13459 614.79096,397.38459 C 602.91596,398.00959 579.84943,391.38777 567.95818,382.48985 C 556.06694,374.46233 550.94562,372.94946 552.82062,361.57922 C 554.69562,349.76704 569.06250,334.86218 591.87500,334.23718 C 614.68750,332.98718 635.31250,340.38301 643.75000,355.48718 C 651.56250,370.59135 648.46967,378.29310 643.78217,382.04310 C 639.09467,385.79310 631.44519,384.45036 623.11186,386.32536" id="path1301" sodipodi:nodetypes="czzzzzzzzz" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 611.66596,385.50959 C 604.16596,383.00959 590.35311,382.60170 583.47811,376.35170" id="path1302" sodipodi:nodetypes="cc" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 592.66063,336.86850 C 598.86190,345.30503 604.92417,355.07014 602.71447,365.23480" id="path1303" sodipodi:nodetypes="cc" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 609.51069,344.81342 C 624.10275,344.57017 628.11190,344.21099 630.20397,355.19433 C 635.95715,352.05623 638.95397,353.81615 640.20397,366.31615" id="path1304" sodipodi:nodetypes="ccc" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 620.21706,362.57924 C 620.21706,362.57924 610.95580,381.48089 620.33080,380.85589 C 629.70580,380.23089 626.05002,380.28181 628.70167,379.17696" id="path1305" sodipodi:nodetypes="ccc" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 565.74009,361.50702 C 565.74009,361.50702 574.14469,356.44952 582.12195,352.00386 C 590.09920,348.08121 587.55049,347.42089 587.77146,341.89662 L 591.98094,350.60103 C 595.33715,357.54102 598.53331,356.11130 595.55959,362.81588" id="path1306" sodipodi:nodetypes="czczz" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 601.31298,337.74082 C 614.47809,348.72995 606.47413,361.56650 612.31037,373.07050" id="path1307" sodipodi:nodetypes="cc" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0903397;" d="M 707.72710,418.48163 C 703.50641,414.69683 702.27080,417.21075 699.44787,417.57363" id="path1387" sodipodi:nodetypes="cc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0903397;" d="M 725.11736,413.48274 C 719.32763,412.83604 715.73844,415.08845 712.91551,415.45133" id="path1389" sodipodi:nodetypes="cc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0903397;" d="M 699.48958,421.09685 C 695.79191,420.95903 688.54161,427.33639 686.24170,435.60327" id="path1390" sodipodi:nodetypes="cc" /> <path style="font-size:12;fill:url(#linearGradient639);fill-opacity:0.49999997;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 282.25529,739.70004 C 263.03059,739.70004 246.57621,750.68303 239.10144,766.34845 C 245.01961,769.38040 251.62479,772.25260 259.40914,770.16617 C 274.02627,766.97386 278.59576,759.44837 285.90432,756.25608 C 301.22420,755.68353 308.56128,763.55367 323.66395,763.21113 C 315.56649,749.26108 300.15727,739.70005 282.25529,739.70004 z " id="path1561" inkscape:export-filename="C:\pas\mricron\btn\new\autocontrast.png" inkscape:export-xdpi="22.289494" inkscape:export-ydpi="22.289494" /> <path sodipodi:type="arc" style="font-size:12px;fill:url(#radialGradient3181);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" id="path1562" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" transform="matrix(1.269231,0,0,1.209574,-59.82695,-177.4099)" inkscape:export-filename="C:\pas\mricron\btn\new\autocontrast.png" inkscape:export-xdpi="22.289494" inkscape:export-ydpi="22.289494" /> <path sodipodi:type="arc" style="font-size:12;fill:url(#radialGradient983);fill-opacity:0.50000000;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none;" id="path1574" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(0.484769,0.000000,0.000000,0.461984,554.2006,323.4255)" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;fill-opacity:1.0000000;" id="rect1280" width="69.963570" height="45.246185" x="128.72227" y="535.48883" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt;" id="rect1278" width="42.038872" height="31.251434" x="158.54723" y="572.81548" transform="matrix(-0.578460,0.000000,0.000000,0.578460,265.2767,219.3138)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:4.1057291;" d="M 163.87618,583.27959 C 173.87618,584.11292 182.62618,587.86292 188.25118,596.40459 C 193.87618,605.57126 193.25118,606.40459 193.25118,606.40459 C 193.25118,606.40459 194.50118,615.15459 182.62618,616.40459 C 170.75118,617.02959 157.44312,604.81988 143.69312,604.81988 C 130.56812,604.81988 125.75118,602.77483 127.62618,591.40459 C 129.50118,579.59241 142.93868,553.90459 165.75118,553.27959 C 188.56368,552.02959 209.18868,559.42542 217.62618,574.52959 C 225.43868,589.63376 221.68868,601.40459 217.00118,605.15459 C 212.31368,608.90459 201.58451,603.90459 193.25118,605.77959" id="path1279" sodipodi:nodetypes="czzzzzzzzz" transform="matrix(-0.578460,0.000000,0.000000,0.578460,265.2767,219.3138)" /> <g id="g1249" transform="translate(-9.414290,-1.046033)" style=""> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;stroke-dasharray:none;" id="rect1289" width="69.963570" height="45.246185" x="128.72227" y="535.48883" transform="matrix(-1.000000,0.000000,0.000000,1.000000,355.1279,42.36432)" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt;" id="rect1291" width="42.038872" height="31.251434" x="158.54723" y="572.81548" transform="matrix(0.578460,0.000000,0.000000,0.578460,89.85120,261.6781)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:4.1057290;stroke-dasharray:none;" d="M 163.87618,583.27959 C 173.87618,584.11292 182.62618,587.86292 188.25118,596.40459 C 193.87618,605.57126 193.25118,606.40459 193.25118,606.40459 C 193.25118,606.40459 194.50118,615.15459 182.62618,616.40459 C 170.75118,617.02959 157.44312,604.81988 143.69312,604.81988 C 130.56812,604.81988 125.75118,602.77483 127.62618,591.40459 C 129.50118,579.59241 142.93868,553.90459 165.75118,553.27959 C 188.56368,552.02959 209.18868,559.42542 217.62618,574.52959 C 225.43868,589.63376 221.68868,601.40459 217.00118,605.15459 C 212.31368,608.90459 201.58451,603.90459 193.25118,605.77959" id="path1292" sodipodi:nodetypes="czzzzzzzzz" transform="matrix(0.578460,0.000000,0.000000,0.578460,89.85120,261.6781)" /> </g> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;" id="rect1268" width="69.963570" height="45.246185" x="128.72227" y="535.48883" transform="matrix(-1.000000,0.000000,0.000000,1.000000,254.4474,140.4299)" /> <path sodipodi:type="arc" style="fill:#9999ff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000pt;" id="path1285" sodipodi:cx="88.389725" sodipodi:cy="698.28027" sodipodi:rx="18.305565" sodipodi:ry="18.305565" d="M 106.69529 698.28027 A 18.305565 18.305565 0 1 0 70.084160,698.28027 A 18.305565 18.305565 0 1 0 106.69529 698.28027 z" transform="translate(3.138097,1.046032)" /> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;" id="rect1290" width="69.963570" height="45.246185" x="-120.45193" y="551.95033" transform="scale(-1.000000,1.000000)" /> <path style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-opacity:1.0000000;stroke-width:2.5000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 51.673228,577.76346 L 120.04088,577.76346" id="path1299" /> <path style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-opacity:1.0000000;stroke-width:2.5000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 88.241974,551.52936 L 87.447001,596.44531" id="path1300" sodipodi:nodetypes="cc" /> <rect style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;" id="rect1301" width="69.963570" height="45.246185" x="-120.25873" y="552.13202" transform="scale(-1.000000,1.000000)" /> <rect style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000pt;" id="rect1302" width="8.9940901" height="9.2751551" x="83.195328" y="573.14581" /> <path style="font-size:12.000000;fill:url(#linearGradient968);fill-opacity:0.70196003;stroke:#1c66f9;stroke-width:1.9242834;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99000001;" d="M 37.920277,322.15339 C 38.332250,320.95292 39.768025,319.75197 40.999014,319.93377 L 78.169327,327.96556 C 81.048244,325.43887 85.262603,322.36297 89.606623,323.13302 L 95.922292,324.00942 L 103.90333,325.57660 C 108.56248,326.97946 112.24447,329.89321 112.63056,335.69148 L 112.58162,405.54600 L 37.627148,381.65255 L 37.920277,322.15339 z " id="path1266" sodipodi:nodetypes="cccccccccc" /> <path style="font-size:12.000000;fill:#4789f7;stroke:#1c4ed9;stroke-width:1.7125434;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216002;" d="M 37.528348,381.35197 L 112.74823,405.58198 L 109.98730,410.63535 L 35.227003,384.92024 L 37.528348,381.35197 z " id="path1271" sodipodi:nodetypes="ccccc" /> <g id="g1279" transform="matrix(0.688750,0.000000,0.000000,0.640474,44.12231,204.0360)"> <path style="fill-rule:evenodd;stroke:none;stroke-width:0.91963024pt;" d="M 15.411826,279.67519 L 107.16635,280.32772 L 105.78092,271.91017 C 104.50888,267.92580 100.16017,263.55105 99.313146,259.07319 C 98.024176,254.59533 104.23642,257.47279 103.48688,250.11822 C 102.73733,242.76364 101.33093,223.23927 90.699786,212.93098 C 79.756146,202.93519 70.616996,196.51871 51.220346,199.66990 C 33.073696,201.57109 22.663616,210.23449 15.263856,225.51906 C 7.6727159,240.80363 16.076616,259.82218 15.837966,266.94924 L 15.411826,279.67519 z " id="path1273" sodipodi:nodetypes="ccczzzzzzc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 81.667436,238.66160 C 80.982416,243.33580 68.662856,240.88582 68.468226,248.58013 C 68.273596,255.77527 84.079546,257.18713 89.984786,255.06933 C 95.890036,252.95153 99.758996,249.65718 99.148096,242.36255 C 98.537216,235.06792 96.575586,216.71313 75.014876,206.18816 C 53.886116,196.16236 29.955336,209.82744 22.306536,224.42792 C 14.657726,239.52760 14.049476,254.81975 23.120686,249.32889 C 31.759936,244.33718 42.301146,228.60033 58.113846,226.78187 C 73.494556,224.96340 82.352426,234.98574 81.667436,238.66160 z " id="path1274" sodipodi:nodetypes="czzzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0877723pt;fill-opacity:1.0000000;" d="M 46.065436,250.14579 C 44.767756,248.03998 45.172386,240.05319 38.251386,241.60591 C 31.330386,243.15862 23.814016,250.57710 21.730276,253.25121 C 19.646536,255.92534 20.762826,260.66971 21.730276,261.79111 C 22.697736,262.91251 28.204756,263.51633 29.767576,264.89651 C 31.330386,266.27670 34.976936,271.45240 36.911836,271.10736 C 38.846746,270.76231 42.790986,266.62175 42.939816,264.89653 C 43.088656,263.17129 47.363086,252.25163 46.065436,250.14579 z " id="path1275" sodipodi:nodetypes="czzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:none;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 42.237126,279.80001 C 42.658006,275.59866 47.388376,258.94410 48.153616,253.91080 C 48.918846,248.87751 46.010966,251.41496 47.235346,249.16869 C 48.459706,246.92241 52.591946,241.63956 55.499816,240.43322 C 58.407706,239.22690 62.539946,239.92518 64.682586,241.04832 C 66.825226,242.17146 68.164386,245.92409 68.355686,247.17200 C 68.546986,248.41993 66.863496,249.83425 65.830426,249.41828 C 64.797366,249.00230 66.447386,242.49537 63.942946,244.49969 C 61.438506,246.68048 58.281376,250.37501 56.647666,251.91412 C 55.338616,253.45321 58.560756,252.66288 59.172936,253.91080 C 59.785116,255.15873 60.932956,257.23860 60.320776,259.40167 C 59.708576,261.56473 57.068536,265.51649 55.499816,266.88920 C 53.931086,268.26192 52.553686,265.59969 50.908446,267.63797 C 49.263196,269.67624 47.037236,278.02692 45.659806,279.98199 L 42.237126,279.80001 z " id="path1276" sodipodi:nodetypes="czzzzzzzzzzzzcc" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#800000;stroke-width:1.875;stroke-dasharray:none" d="M 41.081076,235.46675 C 41.510266,237.13987 42.851486,241.07668 43.817166,241.96244 C 44.782846,242.84822 46.848346,243.11067 47.197056,241.96244 C 47.545776,240.81421 45.212056,235.04026 51.059786,231.92364 C 57.068466,228.80702 66.457036,229.52876 69.407726,230.93945 C 72.358406,232.35012 77.320946,237.59917 72.626666,241.17509 C 68.737106,244.75098 78.179316,244.84941 80.191156,243.34031 C 82.202996,241.83121 85.125536,236.24432 82.523566,233.55418 C 79.921596,230.86405 73.325156,224.43697 67.209176,223.78085 C 61.093206,223.12471 46.472786,230.41454 44.460956,230.93945 C 42.288186,231.46435 40.651886,233.79361 41.081076,235.46675 z" id="path1277" sodipodi:nodetypes="czzzzzzzzzz" /> </g> <path style="font-size:12.000000;fill:url(#linearGradient967);fill-opacity:0.69929999;stroke:#1c66fb;stroke-width:1.7758849;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216002;" d="M 17.536640,337.89268 C 16.523741,335.20546 17.516336,332.64170 19.932441,332.91461 L 55.676174,340.52075 L 57.880936,348.26473 L 73.479955,351.89199 L 71.204233,343.73873 L 87.288253,346.49326 C 89.414399,347.18490 91.065826,348.61636 92.573252,351.89801 L 109.47210,409.98240 L 35.111516,384.77857 L 17.536640,337.89268 z " id="path1272" sodipodi:nodetypes="ccccccccccc" /> <g id="g1317"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.0770884;" d="M 472.42571,238.27147 C 472.33405,238.27145 472.24478,238.29291 472.15311,238.29398 L 472.15311,238.31648 C 472.08489,238.31034 472.01758,238.29395 471.94867,238.29398 C 471.78809,238.29403 471.63216,238.33557 471.47163,238.33899 L 471.47163,238.42899 C 471.37376,238.41606 471.27556,238.40652 471.17632,238.40649 C 471.10740,238.40647 471.04010,238.42285 470.97187,238.42899 L 470.97187,238.40649 C 470.88021,238.40543 470.79094,238.38396 470.69928,238.38399 C 465.87162,238.38545 461.03877,239.90805 457.81913,242.92943 C 456.20932,244.44011 446.99543,256.89920 450.09559,259.04098 C 457.81097,264.68512 464.49982,248.07035 457.36480,261.85375 C 456.64585,266.58811 456.46107,269.05668 456.41072,270.29207 C 456.30905,268.02898 455.46815,262.72102 451.04967,260.14359 C 447.35854,258.03472 444.93899,276.66261 444.93899,279.18042 C 444.93899,289.25168 451.37986,299.31925 457.81913,303.34776 C 461.08484,305.39084 466.00722,306.37150 470.90372,306.34054 L 470.90372,306.36305 C 471.15408,306.36510 471.40305,306.34374 471.65336,306.34054 L 471.65336,306.22803 C 471.84267,306.23528 472.03155,306.25211 472.22127,306.25053 L 472.22127,306.22803 C 477.11777,306.25899 482.04015,305.27835 485.30586,303.23524 C 491.74513,299.20674 498.18600,289.13916 498.18600,279.06791 C 498.18600,276.55010 495.76645,257.92220 492.07532,260.03107 C 487.65684,262.60851 486.81594,267.91647 486.71427,270.17956 C 486.66392,268.94417 486.47914,266.47559 485.76018,261.74124 C 478.62517,247.95784 485.31402,264.57260 493.02940,258.92847 C 496.12956,256.78669 486.91567,244.32759 485.30586,242.81691 C 482.08622,239.79554 477.25337,238.27293 472.42571,238.27147 z " id="path1267" transform="matrix(1.033174,0.000000,0.000000,0.909383,216.4479,268.3863)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.70418520pt;" d="M 468.24591,259.15861 C 468.51094,258.62567 467.79271,252.85171 466.69475,251.35949 C 465.59679,249.86726 463.96768,250.52503 463.70265,251.05797 C 463.43764,251.59090 465.07594,250.88137 466.17389,252.37359 C 467.27185,253.86581 467.98090,259.69155 468.24591,259.15861 z " id="path1270" sodipodi:nodetypes="czzzz" transform="matrix(1.033174,0.000000,0.000000,0.909383,216.4479,268.3863)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt;" d="M 463.34275,289.21648 C 461.03017,288.99344 460.56786,283.64967 458.96224,286.90958 C 457.28286,290.22776 460.74374,297.34319 461.04820,293.66548 C 461.27890,289.98777 465.58157,289.49777 463.34275,289.21648 z " id="path1278" sodipodi:nodetypes="czzz" transform="matrix(1.033174,0.000000,0.000000,0.909383,216.4479,268.3863)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.68256974pt;" d="M 708.64967,503.43717 C 708.37585,502.95253 709.11791,497.70179 710.25229,496.34479 C 711.38666,494.98778 713.06983,495.58594 713.34365,496.07058 C 713.61745,496.55524 711.92480,495.90999 710.79043,497.26699 C 709.65604,498.62400 708.92347,503.92182 708.64967,503.43717 z " id="path1283" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.57505898pt;" d="M 710.57739,531.81732 C 712.96669,531.61449 713.44433,526.75496 715.10322,529.71946 C 716.83831,532.73696 713.26262,539.20762 712.94806,535.86317 C 712.70970,532.51872 708.26430,532.07312 710.57739,531.81732 z " id="path1284" sodipodi:nodetypes="czzz" /> </g> <g id="g1329" transform="translate(-104.0802,-97.80402)"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.8718444;" d="M 841.03523,592.70109 C 835.90467,592.76390 830.22818,593.56676 826.67923,597.28291 C 823.87668,600.24935 817.50896,615.99836 816.60602,618.30168 C 815.09992,624.27793 814.05854,630.78886 816.99244,636.56898 C 819.81959,643.25189 825.72828,649.72836 833.94116,650.75621 C 839.37129,651.44267 845.09032,651.35874 850.31458,649.72833 C 856.42815,647.71665 860.44343,642.53509 863.07436,637.37323 C 865.55779,632.40703 865.94287,626.74320 864.51563,621.47197 C 863.89507,618.11627 856.12574,599.89965 853.80199,597.15457 C 850.54532,594.03086 845.67202,592.69881 841.03523,592.70109 z " id="path1288" sodipodi:nodetypes="cccccccccc" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.63460236pt;" d="M 838.07247,610.64237 C 839.95513,610.18459 838.75317,605.01626 837.71507,603.73449 C 836.67696,602.45272 829.77408,601.13926 832.78769,603.68422 C 836.03445,606.02046 835.95665,611.10014 838.07247,610.64237 z " id="path1289" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.53464689pt;" d="M 835.74471,629.37680 C 833.55820,629.18522 829.82379,631.67928 828.30569,634.47943 C 826.71786,637.32962 829.99008,643.44151 830.27794,640.28249 C 830.49606,637.12348 837.86149,629.61842 835.74471,629.37680 z " id="path1290" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.63460231pt;" d="M 842.27092,610.67154 C 840.38825,610.21376 841.59021,605.04542 842.62832,603.76366 C 843.66642,602.48189 850.56930,601.16843 847.55570,603.71338 C 844.30893,606.04963 844.38672,611.12931 842.27092,610.67154 z " id="path1293" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.53464689pt;" d="M 844.89363,628.76239 C 847.08014,628.57081 850.81456,631.06487 852.33265,633.86502 C 853.92048,636.71521 850.64827,642.82710 850.36040,639.66808 C 850.14228,636.50907 842.77686,629.00401 844.89363,628.76239 z " id="path1310" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> </g> <path sodipodi:type="arc" style="font-size:12px;fill:url(#radialGradient704);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87644994;stroke-dasharray:none" id="path1268" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711,796.11926 A 37.428738,37.428738 0 1 1 233.92963,796.11926 A 37.428738,37.428738 0 1 1 308.78711,796.11926 z" transform="matrix(1.269231,0,0,1.209574,239.61631,-65.007091)" inkscape:export-filename="C:\pas\mricron\btn\3dx.png" inkscape:export-xdpi="22.768808" inkscape:export-ydpi="22.768808" /> <path style="font-size:12px;fill:url(#linearGradient1110);fill-opacity:0.38016998;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 584.02153,852.31705 C 564.79683,852.31705 548.34245,863.30004 540.86768,878.96546 C 546.78585,881.99741 553.39103,884.86961 561.17538,882.78318 C 575.79251,879.59087 580.362,872.06538 587.67056,868.87309 C 602.99044,868.30054 610.32752,876.17068 625.43019,875.82814 C 617.33273,861.87809 601.92351,852.31706 584.02153,852.31705 z" id="path1269" inkscape:export-filename="C:\pas\mricron\btn\3dx.png" inkscape:export-xdpi="22.768808" inkscape:export-ydpi="22.768808" /> <text xml:space="preserve" style="font-size:53.10573959px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black" x="467.65067" y="1061.1675" id="text1284" sodipodi:linespacing="100%" transform="scale(1.1590137,0.8628026)" inkscape:export-filename="C:\pas\mricron\btn\3dx.png" inkscape:export-xdpi="22.768808" inkscape:export-ydpi="22.768808"><tspan x="467.65067" y="1061.1675" sodipodi:role="line" id="tspan1287">3D</tspan></text> <path style="font-size:12px;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 862.36154,831.74143 L 862.36154,924.49 C 889.80881,924.49 912.07889,903.73438 912.07886,878.13172 C 912.07886,852.52905 889.80879,831.74141 862.36154,831.74143 z " id="path3207" /> <g id="g4179"> <path transform="matrix(1.269231,0,0,1.209574,-252.0699,-51.3724)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path3205" style="font-size:12px;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> <path sodipodi:nodetypes="csccccccc" id="path2293" d="M 121.04942,876.41746 C 115.9942,876.41746 85.290278,896.93033 69.807528,903.81184 C 65.343898,905.79576 131.15987,906.55128 131.15987,906.55128 L 82.62969,924.35764 L 92.74016,875.04774 L 51.091495,891.29811 L 65.441938,915.45446 L 113.97211,928.4668 L 82.951128,953.93266" style="fill:none;fill-rule:evenodd;stroke:red;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path3209" d="M 92.371567,865.47065 C 73.146867,865.47065 56.692487,876.45364 49.217717,892.11906 C 55.135887,895.15101 61.741067,898.02321 69.525417,895.93678 C 84.142547,892.74447 88.712037,885.21898 96.020597,882.02669 C 111.34048,881.45414 118.67756,889.32428 133.78023,888.98174 C 125.68277,875.03169 110.27355,865.47066 92.371567,865.47065 z " style="font-size:12px;fill:url(#linearGradient3271);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" /> <path transform="matrix(1.269231,0,0,1.209574,-254.2131,-49.87948)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path3267" style="font-size:12px;fill:url(#radialGradient3289);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> </g> <g id="g4185" transform="matrix(0.587317,0,0,0.587317,135.8273,373.3777)"> <path transform="matrix(1.269231,0,0,1.209574,-252.0699,-51.3724)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4187" style="font-size:12px;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> <path sodipodi:nodetypes="csccccccc" id="path4189" d="M 121.04942,876.41746 C 115.9942,876.41746 85.290278,896.93033 69.807528,903.81184 C 65.343898,905.79576 131.15987,906.55128 131.15987,906.55128 L 82.62969,924.35764 L 92.74016,875.04774 L 51.091495,891.29811 L 65.441938,915.45446 L 113.97211,928.4668 L 82.951128,953.93266" style="fill:none;fill-rule:evenodd;stroke:red;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path4191" d="M 92.371567,865.47065 C 73.146867,865.47065 56.692487,876.45364 49.217717,892.11906 C 55.135887,895.15101 61.741067,898.02321 69.525417,895.93678 C 84.142547,892.74447 88.712037,885.21898 96.020597,882.02669 C 111.34048,881.45414 118.67756,889.32428 133.78023,888.98174 C 125.68277,875.03169 110.27355,865.47066 92.371567,865.47065 z " style="font-size:12px;fill:url(#linearGradient4195);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" /> <path transform="matrix(1.269231,0,0,1.209574,-254.2131,-49.87948)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4193" style="font-size:12px;fill:url(#radialGradient4197);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> </g> <g id="g4199" transform="matrix(0.75239,0,0,0.75239,212.8041,226.4211)"> <path transform="matrix(1.269231,0,0,1.209574,-252.0699,-51.3724)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4201" style="font-size:12px;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> <path sodipodi:nodetypes="csccccccc" id="path4203" d="M 121.04942,876.41746 C 115.9942,876.41746 85.290278,896.93033 69.807528,903.81184 C 65.343898,905.79576 131.15987,906.55128 131.15987,906.55128 L 82.62969,924.35764 L 92.74016,875.04774 L 51.091495,891.29811 L 65.441938,915.45446 L 113.97211,928.4668 L 82.951128,953.93266" style="fill:none;fill-rule:evenodd;stroke:red;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path4205" d="M 92.371567,865.47065 C 73.146867,865.47065 56.692487,876.45364 49.217717,892.11906 C 55.135887,895.15101 61.741067,898.02321 69.525417,895.93678 C 84.142547,892.74447 88.712037,885.21898 96.020597,882.02669 C 111.34048,881.45414 118.67756,889.32428 133.78023,888.98174 C 125.68277,875.03169 110.27355,865.47066 92.371567,865.47065 z " style="font-size:12px;fill:url(#linearGradient4209);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" /> <path transform="matrix(1.269231,0,0,1.209574,-254.2131,-49.87948)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4207" style="font-size:12px;fill:url(#radialGradient4211);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> </g> <g id="g4213" transform="matrix(0.355527,0,0,1.090014,324.7627,-82.64672)"> <path transform="matrix(1.269231,0,0,1.209574,-252.0699,-51.3724)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4215" style="font-size:12px;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> <path sodipodi:nodetypes="csccccccc" id="path4217" d="M 121.04942,876.41746 C 115.9942,876.41746 85.290278,896.93033 69.807528,903.81184 C 65.343898,905.79576 131.15987,906.55128 131.15987,906.55128 L 82.62969,924.35764 L 92.74016,875.04774 L 51.091495,891.29811 L 65.441938,915.45446 L 113.97211,928.4668 L 82.951128,953.93266" style="fill:none;fill-rule:evenodd;stroke:red;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path4219" d="M 92.371567,865.47065 C 73.146867,865.47065 56.692487,876.45364 49.217717,892.11906 C 55.135887,895.15101 61.741067,898.02321 69.525417,895.93678 C 84.142547,892.74447 88.712037,885.21898 96.020597,882.02669 C 111.34048,881.45414 118.67756,889.32428 133.78023,888.98174 C 125.68277,875.03169 110.27355,865.47066 92.371567,865.47065 z " style="font-size:12px;fill:url(#linearGradient4223);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" /> <path transform="matrix(1.269231,0,0,1.209574,-254.2131,-49.87948)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4221" style="font-size:12px;fill:url(#radialGradient4225);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> </g> <flowRoot xml:space="preserve" id="flowRoot4227" style="font-size:36px;font-weight:bold;fill:navy" transform="translate(33.72834,142.0141)"><flowRegion id="flowRegion4229"><rect id="rect4231" width="361.5441" height="35.503513" x="42.604218" y="822.77283" style="font-size:36px;font-weight:bold;fill:navy" /></flowRegion><flowPara id="flowPara4233">A B C D</flowPara></flowRoot> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" id="rect2823" width="42.038872" height="31.251434" x="844.13184" y="324.25101" inkscape:export-filename="C:\pas\mricron\btn\mricrogl256.png" inkscape:export-xdpi="234.8979" inkscape:export-ydpi="234.8979" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" d="M 856.65166,333.33636 C 866.65166,334.16969 875.40166,337.91969 881.02666,346.46136 C 886.65166,355.62803 886.02666,356.46136 886.02666,356.46136 C 886.02666,356.46136 887.27666,365.21136 875.40166,366.46136 C 863.52666,367.08636 850.2186,354.87665 836.4686,354.87665 C 823.3436,354.87665 818.52666,352.8316 820.40166,341.46136 C 822.27666,329.64918 835.71416,303.96136 858.52666,303.33636 C 881.33916,302.08636 901.96416,309.48219 910.40166,324.58636 C 918.21416,339.69053 914.46416,351.46136 909.77666,355.21136 C 905.08916,358.96136 894.35999,353.96136 886.02666,355.83636" id="path2825" sodipodi:nodetypes="czzzzzzzzz" inkscape:export-filename="C:\pas\mricron\btn\mricrogl256.png" inkscape:export-xdpi="234.8979" inkscape:export-ydpi="234.8979" /> <path style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" d="M 872.27666,354.58636 C 864.77666,352.08636 861.65166,352.08636 854.77666,345.83636 C 847.90166,339.58636 846.65166,333.33636 846.65166,333.33636" id="path2827" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\mricrogl256.png" inkscape:export-xdpi="234.8979" inkscape:export-ydpi="234.8979" /> <path style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" d="M 864.15166,303.96136 C 864.77666,316.46136 871.57583,324.16932 869.36613,334.33398" id="path2829" sodipodi:nodetypes="cc" inkscape:export-filename="C:\pas\mricron\btn\mricrogl256.png" inkscape:export-xdpi="234.8979" inkscape:export-ydpi="234.8979" /> <path style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" d="M 877.55642,310.93834 C 892.14848,310.69509 894.76356,313.31017 896.85563,324.29351 C 902.60881,321.15541 905.60563,322.91533 906.85563,335.41533" id="path2831" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\mricrogl256.png" inkscape:export-xdpi="234.8979" inkscape:export-ydpi="234.8979" /> <path style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" d="M 886.86872,331.67842 C 886.86872,331.67842 877.60746,350.58007 886.98246,349.95507 C 896.35746,349.33007 892.70168,349.38099 895.35333,348.27614" id="path2833" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\mricrogl256.png" inkscape:export-xdpi="234.8979" inkscape:export-ydpi="234.8979" /> <path style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" d="M 832.39175,330.6062 C 832.39175,330.6062 835.53899,323.02 843.51625,318.57434 C 851.4935,314.65169 856.99028,311.87715 857.21125,306.35288 L 856.54834,312.02229 C 855.82047,318.24722 865.18497,325.21048 862.21125,331.91506" id="path2835" sodipodi:nodetypes="czczz" inkscape:export-filename="C:\pas\mricron\btn\mricrogl256.png" inkscape:export-xdpi="234.8979" inkscape:export-ydpi="234.8979" /> <path style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" d="M 873.54091,303.21172 C 878.8063,313.50201 874.98455,328.73092 878.96203,339.55849" id="path2837" sodipodi:nodetypes="cc" inkscape:export-filename="C:\pas\mricron\btn\mricrogl256.png" inkscape:export-xdpi="234.8979" inkscape:export-ydpi="234.8979" /> <path style="fill:#000054;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 270.34766,432.89286 C 266.96559,425.47501 260.3235,438.26052 255.49727,449.30783 C 250.67104,460.73738 245.34246,489.00581 249.10203,493.65088 C 252.8616,498.29594 258.35056,495.22819 262.11012,491.11346 C 265.86969,486.99873 263.96524,466.06199 265.1515,456.9486 C 266.02526,447.83521 273.72973,440.31072 270.34766,432.89286 z" id="path3615" sodipodi:nodetypes="czzzzz" inkscape:export-filename="C:\pas\mricron\btn\pen24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" /> <path style="fill:url(#linearGradient3627);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 256.35392,455.89784 C 254.95394,460.00092 253.32225,462.82318 252.15398,468.20706 C 250.98572,473.77723 249.31762,487.55379 250.22768,489.81755 C 251.13775,492.08131 252.46644,490.58625 253.3765,488.58094 C 254.28656,486.57564 253.82556,476.37217 254.11271,471.93078 C 254.32422,467.48938 255.87513,463.1938 256.35392,455.89784 z" id="path3617" sodipodi:nodetypes="czzzzc" inkscape:export-filename="C:\pas\mricron\btn\pen24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" /> <path style="font-size:12px;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke-width:1pt" d="M 258.32385,516.10881 C 244.70346,512.53166 243.75131,505.12802 247.26278,500.13525 C 248.58676,498.73623 251.70024,496.59237 253.50771,496.72229 C 255.31518,496.85222 256.87341,497.76794 259.19467,499.43037 C 264.4622,503.38022 254.53224,505.09575 258.32385,516.10881 z" id="path3619" sodipodi:nodetypes="ccszc" inkscape:export-filename="C:\pas\mricron\btn\pen24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" /> <path style="font-size:12px;fill:url(#linearGradient3629);fill-rule:evenodd;stroke-width:1pt" d="M 253.87333,511.50807 C 250.61538,510.68643 249.08112,510.84383 247.06823,505.91817 C 245.05534,501.30501 250.05982,499.78929 250.6541,499.16357 C 251.24838,498.53784 252.11602,498.95109 252.7103,499.50538 C 253.30458,500.05966 253.00354,502.88001 253.19105,504.10765 C 253.32917,505.3353 251.06068,507.46014 253.87333,511.50807 z" id="path3621" sodipodi:nodetypes="czzzzc" inkscape:export-filename="C:\pas\mricron\btn\pen24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" /> <path style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="path3623" d="M 326.05671,469.55122 C 326.88121,476.3815 303.915,485.28392 302.9894,489.2119 C 301.08731,493.55239 315.97044,503.85687 311.9364,508.99802 C 309.36025,516.74789 269.62905,520.69168 260.38548,518.28589 C 259.23168,516.89349 259.03156,513.70664 261.14461,511.80155 C 266.78432,508.49412 294.51355,511.32311 303.67001,506.3462 C 304.47331,504.25494 293.9717,493.73434 297.19274,488.16929 C 300.56999,481.31221 321.25824,474.15358 320.94168,470.1196 C 317.96164,465.56742 294.87588,458.40487 292.13778,454.47451 C 292.13778,454.47451 322.16638,463.8337 326.05671,469.55122 z" sodipodi:nodetypes="cccccccccc" inkscape:export-filename="C:\pas\mricron\btn\pen24.png" inkscape:export-xdpi="24.462318" inkscape:export-ydpi="24.462318" /> <rect style="fill:url(#linearGradient3646);fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-dasharray:none" id="rect3644" width="91.25" height="30" x="-184.68044" y="63.382465" ry="12.5" transform="scale(-1,1)" inkscape:export-xdpi="22.535858" inkscape:export-ydpi="22.535858" inkscape:export-filename="C:\pas\mricron\btn\new\colorbarzero.png" /> <path style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.22945166;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 103.12986,109.15218 C 103.12986,114.14532 100.93311,118.19773 98.226386,118.19773 C 95.519665,118.19773 93.322908,114.14532 93.322908,109.15218 C 93.322908,104.15903 95.519665,100.10663 98.226386,100.10663 C 100.93311,100.10663 103.12986,104.15903 103.12986,109.15218 z" id="path3648" inkscape:export-filename="C:\pas\mricron\btn\new\colorbarzero.png" inkscape:export-xdpi="22.535858" inkscape:export-ydpi="22.535858" /> <path sodipodi:type="star" style="opacity:0.78534031000000004;fill:#0000c0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="path3650" sodipodi:sides="3" sodipodi:cx="139.64716" sodipodi:cy="147.0226" sodipodi:r1="9.4676037" sodipodi:r2="4.7338018" sodipodi:arg1="-1.5707963" sodipodi:arg2="-0.52359878" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 139.64716,137.55499 L 143.74675,144.6557 L 147.84634,151.7564 L 139.64716,151.7564 L 131.44797,151.7564 L 135.54756,144.6557 L 139.64716,137.55499 z" transform="matrix(1,0,0,1.3333333,-15.384856,-87.864153)" inkscape:export-filename="C:\pas\mricron\btn\new\colorbarzero.png" inkscape:export-xdpi="22.535858" inkscape:export-ydpi="22.535858" /> <path sodipodi:type="star" style="opacity:0.78534031000000004;fill:#0000c0;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="path3652" sodipodi:sides="3" sodipodi:cx="139.64716" sodipodi:cy="147.0226" sodipodi:r1="9.4676037" sodipodi:r2="4.7338018" sodipodi:arg1="-1.5707963" sodipodi:arg2="-0.52359878" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 139.64716,137.55499 L 143.74675,144.6557 L 147.84634,151.7564 L 139.64716,151.7564 L 131.44797,151.7564 L 135.54756,144.6557 L 139.64716,137.55499 z" transform="matrix(1,0,0,1.3333333,37.278685,-87.864153)" inkscape:export-filename="C:\pas\mricron\btn\new\colorbarzero.png" inkscape:export-xdpi="22.535858" inkscape:export-ydpi="22.535858" /> <path style="fill:none;fill-rule:evenodd;stroke:#0000c0;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 246.74941,-78.424713 L 339.05855,-78.424713" id="path3656" inkscape:export-filename="C:\pas\mricron\btn\new\crosshairs.png" inkscape:export-xdpi="20.607124" inkscape:export-ydpi="20.607124" /> <path style="fill:none;fill-rule:evenodd;stroke:#0000c0;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" d="M 269.23498,-111.56132 L 269.23498,-12.743213" id="path3660" inkscape:export-filename="C:\pas\mricron\btn\new\crosshairs.png" inkscape:export-xdpi="20.607124" inkscape:export-ydpi="20.607124" /> <path style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 246.74941,-37.595672 L 339.05855,-37.595672" id="path3658" inkscape:export-filename="C:\pas\mricron\btn\new\crosshairs.png" inkscape:export-xdpi="20.607124" inkscape:export-ydpi="20.607124" /> <path style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 301.18814,-111.56132 L 301.18814,-12.743208" id="path3662" inkscape:export-filename="C:\pas\mricron\btn\new\crosshairs.png" inkscape:export-xdpi="20.607124" inkscape:export-ydpi="20.607124" /> <path sodipodi:type="arc" style="font-size:12px;fill:url(#linearGradient3670);fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#0050fb;stroke-width:5.21357274;stroke-dasharray:none;stroke-opacity:1;stroke-miterlimit:4" id="path3664" sodipodi:cx="604.88873" sodipodi:cy="441.2019" sodipodi:rx="44.214264" sodipodi:ry="13.483783" d="M 649.103,441.2019 A 44.214264,13.483783 0 1 1 560.67447,441.2019 A 44.214264,13.483783 0 1 1 649.103,441.2019 z" transform="matrix(1.042553,0,0,0.882208,-202.39952,-492.90915)" inkscape:export-filename="C:\pas\mricron\btn\bucket24.png" inkscape:export-xdpi="21.807127" inkscape:export-ydpi="21.807127" /> <path style="fill:#fb4100;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 388.75413,-92.159361 C 398.21827,-114.55406 414.50883,-97.128541 426.45531,-96.134721 C 436.85027,-96.631621 437.93631,-123.46525 457.64022,-118.99296 C 466.79401,-116.34273 464.31845,-65.226501 451.12398,-55.884321 C 432.66039,-43.308281 379.28998,-70.261601 388.75413,-92.159361 z" id="path3666" sodipodi:nodetypes="cccsz" inkscape:export-filename="C:\pas\mricron\btn\bucket24.png" inkscape:export-xdpi="21.807127" inkscape:export-ydpi="21.807127" /> <path style="font-size:12px;fill:url(#radialGradient3672);fill-opacity:0.98999999000000005;stroke:#0c1dfb;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.98999999000000005;stroke-miterlimit:4;stroke-dasharray:none" d="M 382.47734,-101.30596 C 393.1275,-92.738341 418.28528,-92.083351 431.66947,-91.877801 C 445.05365,-91.672251 468.18046,-94.547801 474.63455,-102.46773 L 466.32688,-31.133981 C 455.47903,-26.010751 443.69045,-22.870101 430.02041,-23.233561 C 416.35037,-23.597011 399.23099,-25.804731 389.95102,-30.824961 L 382.47734,-101.30596 z" id="path3668" sodipodi:nodetypes="czcczcc" inkscape:export-xdpi="21.807127" inkscape:export-ydpi="21.807127" inkscape:export-filename="C:\pas\mricron\btn\bucket24.png" /> <rect style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.89315641;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="rect3682" width="19.872375" height="19.872383" x="575.12762" y="-127.5102" inkscape:export-filename="C:\pas\mricron\btn\hires.png" inkscape:export-xdpi="19.659172" inkscape:export-ydpi="19.659172" /> <rect style="font-size:12px;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt" id="rect3684" width="106.29922" height="106.29922" x="375" y="6.0629654" /> <rect style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.89315641;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="rect3700" width="19.872375" height="19.872383" x="595.12762" y="-107.5102" inkscape:export-filename="C:\pas\mricron\btn\hires.png" inkscape:export-xdpi="19.659172" inkscape:export-ydpi="19.659172" /> <rect style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.89315641;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="rect3702" width="19.872375" height="19.872383" x="615.12762" y="-87.510201" inkscape:export-filename="C:\pas\mricron\btn\hires.png" inkscape:export-xdpi="19.659172" inkscape:export-ydpi="19.659172" /> <rect style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.89315641;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="rect3704" width="19.872375" height="19.872383" x="595.12762" y="-67.637817" inkscape:export-filename="C:\pas\mricron\btn\hires.png" inkscape:export-xdpi="19.659172" inkscape:export-ydpi="19.659172" /> <rect style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.89315641;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="rect3706" width="19.872375" height="19.872383" x="575.12762" y="-47.637817" inkscape:export-filename="C:\pas\mricron\btn\hires.png" inkscape:export-xdpi="19.659172" inkscape:export-ydpi="19.659172" /> <path style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 625,-127.63782 L 665,-77.637811 L 625,-27.637811 L 645,-27.637811 L 685,-77.637811 L 645,-127.63782 L 625,-127.63782 z" id="path3708" inkscape:export-filename="C:\pas\mricron\btn\hires.png" inkscape:export-xdpi="19.659172" inkscape:export-ydpi="19.659172" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt" id="rect2871" width="42.038872" height="31.251434" x="545.31689" y="-195.52676" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="58.834469" inkscape:export-ydpi="58.834469" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" d="M 557.83671,-186.4414 C 567.83671,-185.60807 576.58671,-181.85807 582.21171,-173.3164 C 587.83671,-164.14973 587.21171,-163.3164 587.21171,-163.3164 C 587.21171,-163.3164 588.46171,-154.5664 576.58671,-153.3164 C 564.71171,-152.6914 551.40365,-164.90111 537.65365,-164.90111 C 524.52865,-164.90111 519.71171,-166.94616 521.58671,-178.3164 C 523.46171,-190.12858 536.89921,-215.8164 559.71171,-216.4414 C 582.52421,-217.6914 603.14921,-210.29557 611.58671,-195.1914 C 619.39921,-180.08723 615.64921,-168.3164 610.96171,-164.5664 C 606.27421,-160.8164 595.54504,-165.8164 587.21171,-163.9414" id="path2873" sodipodi:nodetypes="czzzzzzzzz" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="58.834469" inkscape:export-ydpi="58.834469" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 573.46171,-165.1914 C 565.96171,-167.6914 562.83671,-167.6914 555.96171,-173.9414 C 549.08671,-180.1914 547.83671,-186.4414 547.83671,-186.4414" id="path2875" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="58.834469" inkscape:export-ydpi="58.834469" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 565.33671,-215.8164 C 565.96171,-203.3164 572.76088,-195.60844 570.55118,-185.44378" id="path2877" sodipodi:nodetypes="cc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="58.834469" inkscape:export-ydpi="58.834469" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 578.74147,-208.83942 C 593.33353,-209.08267 595.94861,-206.46759 598.04068,-195.48425 C 603.79386,-198.62235 606.79068,-196.86243 608.04068,-184.36243" id="path2879" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="58.834469" inkscape:export-ydpi="58.834469" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 588.05377,-188.09934 C 588.05377,-188.09934 578.79251,-169.19769 588.16751,-169.82269 C 597.54251,-170.44769 593.88673,-170.39677 596.53838,-171.50162" id="path2881" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="58.834469" inkscape:export-ydpi="58.834469" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 533.5768,-189.17156 C 533.5768,-189.17156 536.72404,-196.75776 544.7013,-201.20342 C 552.67855,-205.12607 558.17533,-207.90061 558.3963,-213.42488 L 557.73339,-207.75547 C 557.00552,-201.53054 566.37002,-194.56728 563.3963,-187.8627" id="path2883" sodipodi:nodetypes="czczz" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="58.834469" inkscape:export-ydpi="58.834469" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 574.72596,-216.56604 C 579.99135,-206.27575 576.1696,-191.04684 580.14708,-180.21927" id="path2885" sodipodi:nodetypes="cc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="58.834469" inkscape:export-ydpi="58.834469" /> <path style="fill:#000054;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 870,132.36218 C 866.61793,124.94433 859.97584,137.72984 855.14961,148.77715 C 850.32338,160.2067 844.9948,188.47513 848.75437,193.1202 C 852.51394,197.76526 858.0029,194.69751 861.76246,190.58278 C 865.52203,186.46805 863.61758,165.53131 864.80384,156.41792 C 865.6776,147.30453 873.38207,139.78004 870,132.36218 z" id="path3649" sodipodi:nodetypes="czzzzz" inkscape:export-filename="C:\pas\mricron\btn\new\ellipse.png" inkscape:export-xdpi="23.179588" inkscape:export-ydpi="23.179588" /> <path style="fill:url(#linearGradient3657);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 856.00626,155.36716 C 854.60628,159.47024 852.97459,162.2925 851.80632,167.67638 C 850.63806,173.24655 848.96996,187.02311 849.88002,189.28687 C 850.79009,191.55063 852.11878,190.05557 853.02884,188.05026 C 853.9389,186.04496 853.4779,175.84149 853.76505,171.4001 C 853.97656,166.9587 855.52747,162.66312 856.00626,155.36716 z" id="path3651" sodipodi:nodetypes="czzzzc" inkscape:export-filename="C:\pas\mricron\btn\new\ellipse.png" inkscape:export-xdpi="23.179588" inkscape:export-ydpi="23.179588" /> <path style="font-size:12px;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke-width:1pt" d="M 857.97619,215.57813 C 844.3558,212.00098 843.40365,204.59734 846.91512,199.60457 C 848.2391,198.20555 851.35258,196.06169 853.16005,196.19161 C 854.96752,196.32154 856.52575,197.23726 858.84701,198.89969 C 864.11454,202.84954 854.18458,204.56507 857.97619,215.57813 z" id="path3653" sodipodi:nodetypes="ccszc" inkscape:export-filename="C:\pas\mricron\btn\new\ellipse.png" inkscape:export-xdpi="23.179588" inkscape:export-ydpi="23.179588" /> <path style="font-size:12px;fill:url(#linearGradient3659);fill-rule:evenodd;stroke-width:1pt" d="M 853.52567,210.97739 C 850.26772,210.15575 848.73346,210.31315 846.72057,205.38749 C 844.70768,200.77433 849.71216,199.25861 850.30644,198.63289 C 850.90072,198.00716 851.76836,198.42041 852.36264,198.9747 C 852.95692,199.52898 852.65588,202.34933 852.84339,203.57697 C 852.98151,204.80462 850.71302,206.92946 853.52567,210.97739 z" id="path3655" sodipodi:nodetypes="czzzzc" inkscape:export-filename="C:\pas\mricron\btn\new\ellipse.png" inkscape:export-xdpi="23.179588" inkscape:export-ydpi="23.179588" /> <path style="fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.17575848000000010px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 390.65262,1036.0046 C 384.32806,1048.6538 406.61585,1048.812 395.65262,1051.0046 C 370.65262,1056.0046 308.87744,994.76187 378.01952,968.07569 C 382.21768,966.45536 370.65262,961.00465 370.65262,961.00465 L 390.65262,966.00465 L 382.4278,982.48397 C 382.4278,982.48397 383.01418,970.71107 380.38642,972.15844 C 327.10227,1001.5074 370.65262,1026.0046 390.65262,1036.0046 z" id="path2868" sodipodi:nodetypes="csscccsc" inkscape:export-filename="C:\pas\mricron\btn\new\refresh.png" inkscape:export-xdpi="22.14864" inkscape:export-ydpi="22.14864" /> <path style="fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.17575848000000010px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 398.44156,972.80163 C 404.76612,960.15252 382.47833,959.99427 393.44156,957.80163 C 418.44156,952.80163 480.21674,1014.0444 411.07466,1040.7306 C 406.8765,1042.3509 418.44156,1047.8016 418.44156,1047.8016 L 398.44156,1042.8016 L 406.66638,1026.3223 C 406.66638,1026.3223 406.08,1038.0952 408.70776,1036.6478 C 461.99191,1007.2989 418.44156,982.80163 398.44156,972.80163 z" id="path2884" sodipodi:nodetypes="csscccsc" inkscape:export-filename="C:\pas\mricron\btn\new\refresh.png" inkscape:export-xdpi="22.14864" inkscape:export-ydpi="22.14864" /> </svg> ���������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/drawing4z.svg��������������������������������������������������0000664�0001750�0001750�00000455571�11041144020�021071� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="744.09448819" height="1052.3622047" id="svg2" sodipodi:version="0.32" inkscape:version="0.46" sodipodi:docbase="C:\Documents and Settings\Chris Rorden\My Documents\mx1390old\btn" sodipodi:docname="drawing4z.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape"> <defs id="defs4"> <inkscape:perspective sodipodi:type="inkscape:persp3d" inkscape:vp_x="0 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" id="perspective394" /> <linearGradient id="linearGradient17937"> <stop style="stop-color:#ffffff;stop-opacity:0.74226803;" offset="0" id="stop17939" /> <stop id="stop17945" offset="1" style="stop-color:#5fbcd3;stop-opacity:1;" /> </linearGradient> <radialGradient r="24.522423" fy="808.40576" fx="280.46881" cy="808.40576" cx="280.46881" gradientUnits="userSpaceOnUse" id="radialGradient2803" xlink:href="#linearGradient684" inkscape:collect="always" /> <radialGradient fy="812.97649" fx="289.25905" r="16.96986" cy="812.97649" cx="289.25905" id="radialGradient983" xlink:href="#linearGradient1547" gradientUnits="userSpaceOnUse" /> <radialGradient fy="807.81573" fx="292.27442" r="24.522423" cy="807.81573" cx="292.27442" id="radialGradient1203" xlink:href="#linearGradient684" gradientUnits="userSpaceOnUse" /> <linearGradient y2="852.86278" x2="335.31547" y1="743.24066" x1="326.75421" id="linearGradient1202" xlink:href="#linearGradient684" gradientTransform="scale(1.7571663,0.5690981)" gradientUnits="userSpaceOnUse" /> <linearGradient y2="389.11669" x2="206.25145" y1="386.86683" x1="210.53689" id="linearGradient1175" xlink:href="#linearGradient1172" gradientTransform="scale(0.758349,1.3186542)" gradientUnits="userSpaceOnUse" /> <linearGradient y2="207.27092" x2="383.23312" y1="199.43834" x1="359.54053" id="linearGradient1139" xlink:href="#linearGradient671" gradientTransform="scale(0.4268666,2.3426521)" gradientUnits="userSpaceOnUse" /> <radialGradient fy="807.81573" fx="292.27442" r="24.522423" cy="807.81573" cx="292.27442" id="radialGradient704" xlink:href="#linearGradient1271" gradientUnits="userSpaceOnUse" /> <linearGradient y2="2051.6487" x2="187.71159" y1="2042.7123" x1="187.74077" id="linearGradient703" xlink:href="#linearGradient671" gradientTransform="scale(3.0094286,0.332289)" gradientUnits="userSpaceOnUse" /> <linearGradient y2="1239.0289" x2="101.51829" y1="1187.1978" x1="90.8512" id="linearGradient683" xlink:href="#linearGradient684" gradientTransform="scale(1.6468933,0.6072039)" gradientUnits="userSpaceOnUse" /> <radialGradient fy="807.81573" fx="292.27442" r="24.522423" cy="807.81573" cx="292.27442" id="radialGradient1169" xlink:href="#linearGradient684" gradientUnits="userSpaceOnUse" /> <radialGradient fy="162.34375" fx="62.1875" r="7.0745194" cy="162.34375" cx="62.1875" id="radialGradient1158" xlink:href="#linearGradient1155" gradientUnits="userSpaceOnUse" /> <linearGradient id="linearGradient1155"> <stop id="stop1156" offset="0.00000000" style="stop-color:#fffbfb;stop-opacity:1.0000000;" /> <stop id="stop1157" offset="1.0000000" style="stop-color:#9999ff;stop-opacity:1.0000000;" /> </linearGradient> <linearGradient id="linearGradient594"> <stop id="stop595" offset="0.00000000" style="stop-color:#fffbfb;stop-opacity:1.0000000;" /> <stop id="stop596" offset="1.0000000" style="stop-color:#007aff;stop-opacity:1.0000000;" /> </linearGradient> <linearGradient id="linearGradient671"> <stop id="stop672" offset="0.00000000" style="stop-color:#ffffff;stop-opacity:1.0000000;" /> <stop id="stop673" offset="1.0000000" style="stop-color:#ffffff;stop-opacity:0.00000000;" /> </linearGradient> <linearGradient id="linearGradient684"> <stop id="stop685" offset="0.00000000" style="stop-color:#ffffff;stop-opacity:1.0000000;" /> <stop id="stop686" offset="1.0000000" style="stop-color:#9999ff;stop-opacity:1.0000000;" /> </linearGradient> <linearGradient id="linearGradient969"> <stop id="stop970" offset="0.00000000" style="stop-color:#ffffff;stop-opacity:0.70196080;" /> <stop id="stop971" offset="1.0000000" style="stop-color:#9999ff;stop-opacity:0.70196080;" /> </linearGradient> <linearGradient id="linearGradient1172"> <stop id="stop1173" offset="0.00000000" style="stop-color:#ffffff;stop-opacity:0.3;" /> <stop id="stop1174" offset="1.00000000" style="stop-color:#ffffff;stop-opacity:0.8;" /> </linearGradient> <linearGradient id="linearGradient1274"> <stop id="stop1275" offset="0.00000000" style="stop-color:#ff0400;stop-opacity:1.0000000;" /> <stop id="stop1277" offset="0.0099999998" style="stop-color:#fd6972;stop-opacity:1.0000000;" /> <stop id="stop1276" offset="1.0000000" style="stop-color:#ff0000;stop-opacity:1.0000000;" /> </linearGradient> <linearGradient id="linearGradient1111"> <stop id="stop1112" offset="0.00000000" style="stop-color:#e8e838;stop-opacity:1.0000000;" /> <stop id="stop1114" offset="1.0000000" style="stop-color:#ffff7f;stop-opacity:1.0000000;" /> </linearGradient> <linearGradient id="linearGradient1547"> <stop id="stop1548" offset="0.00000000" style="stop-color:#9999ff;stop-opacity:1.0000000;" /> <stop id="stop1549" offset="1.0000000" style="stop-color:#9999fd;stop-opacity:0.00000000;" /> </linearGradient> <linearGradient id="linearGradient1563"> <stop id="stop1564" offset="0.00000000" style="stop-color:#898bdc;stop-opacity:1.0000000;" /> <stop id="stop1565" offset="1.0000000" style="stop-color:#000000;stop-opacity:1.0000000;" /> </linearGradient> <linearGradient id="linearGradient1608"> <stop id="stop1609" offset="0.00000000" style="stop-color:#ffffff;stop-opacity:1.0000000;" /> <stop id="stop1611" offset="0.50000000" style="stop-color:#9999ff;stop-opacity:1.0000000;" /> <stop id="stop1610" offset="1.0000000" style="stop-color:#000000;stop-opacity:1.0000000;" /> </linearGradient> <linearGradient id="linearGradient1271"> <stop id="stop1274" offset="0.00000000" style="stop-color:#ffc87e;stop-opacity:1.0000000;" /> <stop id="stop1279" offset="1.0000000" style="stop-color:#ff0000;stop-opacity:1.0000000;" /> </linearGradient> <linearGradient id="linearGradient1280"> <stop id="stop1281" offset="0.00000000" style="stop-color:#ffc000;stop-opacity:1.0000000;" /> <stop id="stop1283" offset="1.0000000" style="stop-color:#ff0000;stop-opacity:0.50000000;" /> </linearGradient> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3036" x1="187.74077" y1="2042.7123" x2="187.71159" y2="2051.6487" gradientTransform="scale(3.0094286,0.332289)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3038" x1="187.74077" y1="2042.7123" x2="187.71159" y2="2051.6487" gradientTransform="scale(3.0094286,0.332289)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3040" x1="187.74077" y1="2042.7123" x2="187.71159" y2="2051.6487" gradientTransform="scale(3.0094286,0.332289)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3042" x1="187.74077" y1="2042.7123" x2="187.71159" y2="2051.6487" gradientTransform="scale(3.0094286,0.332289)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3044" x1="187.74077" y1="2042.7123" x2="187.71159" y2="2051.6487" gradientTransform="scale(3.0094286,0.332289)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3046" x1="187.74077" y1="2042.7123" x2="187.71159" y2="2051.6487" gradientTransform="scale(3.0094286,0.332289)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3048" x1="187.74077" y1="2042.7123" x2="187.71159" y2="2051.6487" gradientTransform="scale(3.0094286,0.332289)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient3062" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient3064" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1280" id="linearGradient3087" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.6468933,0,0,0.6072039,-707.89942,-735.8277)" x1="459.4994" y1="1254.0935" x2="481.37598" y2="1325.9788" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient969" id="linearGradient3103" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0923649,0,0,0.915445,-15.816734,-109.09188)" x1="48.734489" y1="368.05664" x2="55.008646" y2="445.4552" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient684" id="linearGradient3113" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.9373488,0,0,1.0668387,-15.816734,-109.09188)" x1="46.314715" y1="300.89402" x2="84.46981" y2="407.3278" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient3132" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.6468933,0,0,0.6072039,-15.816734,-109.09188)" x1="169.59108" y1="1212.3388" x2="175.37662" y2="1267.5976" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1111" id="linearGradient3202" gradientUnits="userSpaceOnUse" gradientTransform="matrix(2.5036225,0,0,0.5791021,-389.92538,-113.29149)" x1="85.863811" y1="835.45038" x2="85.679877" y2="809.33162" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1274" id="linearGradient3226" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.8935111,0,0,1.1191803,27.935496,-68.87518)" x1="498.83997" y1="87.851495" x2="527.61901" y2="134.61744" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1608" id="linearGradient3266" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.677741,0,0,0.5960396,15.816734,-109.09188)" x1="-196.8662" y1="425.48517" x2="-141.23934" y2="425.48517" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient969" id="radialGradient3315" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.075993,0,0,0.9293741,-15.816734,-109.09188)" cx="524.70152" cy="475.22645" fx="524.70152" fy="475.22645" r="111.10576" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1172" id="linearGradient3321" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.758349,0,0,1.3186542,-15.816734,-109.09188)" x1="477.45044" y1="381.63529" x2="473.165" y2="383.88514" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3325" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.4268666,0,0,2.3426521,-15.816734,-109.09188)" x1="833.72519" y1="196.49355" x2="857.41778" y2="204.32614" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1172" id="linearGradient3330" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.758349,0,0,1.3186542,-15.816734,-109.09188)" x1="339.63678" y1="379.11596" x2="335.35134" y2="381.36582" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3334" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.4268666,0,0,2.3426521,-15.816734,-109.09188)" x1="588.89265" y1="195.07545" x2="612.58524" y2="202.90803" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3344" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.2017735,0,0,0.8321036,-15.816734,-109.09188)" x1="503.37662" y1="709.5851" x2="511.95083" y2="774.66748" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient969" id="radialGradient3347" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0227134,0,0,0.977791,-15.816734,-109.09188)" cx="553.9061" cy="548.65722" fx="553.9061" fy="548.65722" r="117.12444" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient969" id="linearGradient3350" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1837429,0,5.9686051e-2,0.2004968,423.15227,384.61312)" x1="104.707" y1="264.74155" x2="133.43179" y2="619.09318" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient3383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.6468933,0,0,0.6072039,-15.816734,-109.09188)" x1="299.8437" y1="1036.9841" x2="305.62924" y2="1092.2429" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient684" id="linearGradient3389" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.6468933,0,0,0.6072039,-15.816734,-109.09188)" x1="231.07885" y1="1040.2823" x2="241.74594" y2="1092.1133" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient684" id="linearGradient3398" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0665122,0,0,0.9376353,-18.544492,-118.77326)" x1="614.02868" y1="1168.7988" x2="672.80902" y2="1295.4267" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1155" id="linearGradient3408" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.9878798,0,0,1.0122689,-15.816734,-109.09188)" x1="374.14027" y1="749.49296" x2="396.35611" y2="807.75935" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1155" id="linearGradient3414" gradientUnits="userSpaceOnUse" gradientTransform="matrix(4.2446192,0,0,4.0663556,128.08437,-388.78408)" x1="39.904693" y1="205.22107" x2="28.554472" y2="212.26643" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1563" id="linearGradient3417" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.9763285,0,0,1.0242454,-15.816734,-109.09188)" x1="265.95663" y1="735.08612" x2="313.4116" y2="761.44375" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient594" id="linearGradient3429" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.7771299,0,0,1.2867861,-15.816734,-109.09188)" x1="331.69558" y1="519.82318" x2="377.3627" y2="537.58599" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient684" id="linearGradient3434" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1943011,0,0,0.2226133,460.10717,364.77942)" x1="-16.929597" y1="255.77006" x2="166.53211" y2="767.53721" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient4441" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,0.4268666,-2.3426521,0,866.43476,213.19778)" x1="636.48645" y1="194.28539" x2="682.59552" y2="198.65256" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1563" id="linearGradient6399" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.9763285,0,0,1.0110532,-335.13691,-86.646504)" x1="265.95663" y1="735.08612" x2="313.4116" y2="761.44375" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient6401" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.6468933,0,0,0.6072039,-334.85916,-96.63329)" x1="169.59108" y1="1212.3388" x2="175.37662" y2="1267.5976" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient6403" gradientUnits="userSpaceOnUse" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" /> <filter inkscape:collect="always" x="-0.13659227" width="1.2731845" y="-0.19308964" height="1.3861793" id="filter3825"> <feGaussianBlur inkscape:collect="always" stdDeviation="2.9455487" id="feGaussianBlur3827" /> </filter> <filter inkscape:collect="always" id="filter3995"> <feGaussianBlur inkscape:collect="always" stdDeviation="0.81463544" id="feGaussianBlur3997" /> </filter> <filter inkscape:collect="always" id="filter4043"> <feGaussianBlur inkscape:collect="always" stdDeviation="1.3482482" id="feGaussianBlur4045" /> </filter> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient4653" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.4268666,0,0,2.3426521,-523.80121,11.023625)" x1="833.72519" y1="196.49355" x2="857.41778" y2="204.32614" /> <filter inkscape:collect="always" id="filter3943"> <feGaussianBlur inkscape:collect="always" stdDeviation="0.75213628" id="feGaussianBlur3945" /> </filter> <filter inkscape:collect="always" id="filter3996"> <feGaussianBlur inkscape:collect="always" stdDeviation="0.65992794" id="feGaussianBlur3998" /> </filter> <linearGradient inkscape:collect="always" xlink:href="#linearGradient17937" id="linearGradient2702" gradientUnits="userSpaceOnUse" x1="7.0675211" y1="508.37253" x2="10.845769" y2="525.86481" /> </defs> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.67332995" inkscape:cx="393.47267" inkscape:cy="497.65096" inkscape:document-units="px" inkscape:current-layer="layer1" inkscape:window-width="1280" inkscape:window-height="778" inkscape:window-x="0" inkscape:window-y="0" showgrid="false" /> <metadata id="metadata7"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> </cc:Work> </rdf:RDF> </metadata> <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"> <rect style="opacity:1;fill:none;fill-opacity:0;fill-rule:evenodd;stroke:#0000c0;stroke-width:2.65549850000000020;stroke-linecap:square;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="rect2766" width="94.651901" height="94.651901" x="782.50494" y="193.76978" ry="11.064577" inkscape:export-filename="C:\pas\mricron\btn\render.png" inkscape:export-xdpi="59.193832" inkscape:export-ydpi="59.193832" /> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.375" id="rect1295" width="69.96357" height="45.246185" x="-85.942757" y="400.73502" transform="scale(-1,1)" /> <rect style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.375" id="rect1262" width="69.96357" height="45.246185" x="21.639284" y="525.50854" /> <path sodipodi:type="arc" style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="path1286" sodipodi:cx="88.389725" sodipodi:cy="698.28027" sodipodi:rx="18.305565" sodipodi:ry="18.305565" d="M 106.69529 698.28027 A 18.305565 18.305565 0 1 1 70.08416,698.28027 A 18.305565 18.305565 0 1 1 106.69529 698.28027 z" transform="translate(-33.076264,-148.31812)" /> <path sodipodi:type="arc" style="fill-rule:evenodd;stroke-width:1pt" id="path1573" sodipodi:cx="496.47308" sodipodi:cy="894.01904" sodipodi:rx="26.54307" sodipodi:ry="26.54307" d="M 523.01615 894.01904 A 26.54307 26.54307 0 1 1 469.93001,894.01904 A 26.54307 26.54307 0 1 1 523.01615 894.01904 z" transform="translate(169.72327,-322.09028)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.03751945" d="M 688.66818,306.24904 C 678.75656,308.71686 672.13642,319.35864 669.10861,325.77005 C 666.0808,331.91994 662.11261,338.19726 672.83358,343.64006 C 683.06094,344.90951 689.88793,344.55574 695.32226,341.02776 C 702.63141,336.49383 708.44273,330.79097 710.67282,325.51602 C 712.12925,322.67835 725.26533,323.27838 724.39866,321.28638 C 724.51641,317.76588 723.82071,310.17565 715.84197,305.89899 C 711.53579,303.19828 694.46237,303.06487 688.66818,306.24904 z " id="path1377" sodipodi:nodetypes="czcccccc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 159.34746,204.18441 C 154.78112,203.72655 145.72305,209.5377 141.75371,211.93441 C 130.90513,218.48492 120.06623,234.83944 120.06621,251.21566 C 120.06621,255.30973 116.62248,258.91345 121.53496,271.71566 C 127.57858,282.72641 154.25286,286.16074 154.47246,279.37191 C 154.69205,272.58309 150.38113,275.95666 155.69121,270.77816 C 155.85327,280.80632 159.30712,280.98431 159.15996,286.90316 C 159.06579,290.42991 158.87433,298.31471 160.22246,296.96566 L 162.15996,297.27816 L 162.15996,297.40316 L 162.53496,297.34066 L 164.47246,297.02816 C 165.82059,298.37721 165.62913,290.4924 165.53496,286.96566 C 165.3878,281.04681 168.84165,280.86881 169.00371,270.84066 C 174.31379,276.01916 170.00287,272.64558 170.22246,279.43441 C 170.44206,286.22324 197.11634,282.7889 203.15996,271.77816 C 208.07244,258.97595 204.62871,255.37222 204.62871,251.27816 C 204.62869,234.90194 193.78979,218.54741 182.94121,211.99691 C 178.97187,209.6002 169.9138,203.78904 165.34746,204.24691 C 163.82535,204.39953 162.7994,205.24568 162.62871,207.15316 L 161.82444,259.53543 L 162.06621,207.09066 C 161.89552,205.18319 160.86957,204.33703 159.34746,204.18441 z " id="path1150" sodipodi:nodetypes="ccccccccccccccccccccccc" /> <path style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.684129pt" d="M 166.96836,384.07012 C 155.31965,387.85507 120.86399,377.80538 120.12828,394.64187 C 119.39258,411.47837 208.78111,407.43239 196.64192,397.12167 C 184.50274,386.81094 178.61708,380.28517 166.96836,384.07012 z " id="path1140" sodipodi:nodetypes="cczz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:1.27241249pt" d="M 480.79352,206.34075 C 471.88604,206.34335 456.60096,213.45984 450.66045,218.80635 C 438.7794,229.49933 432.12374,257.332 432.12374,275.15365 C 432.12374,280.58581 432.13964,285.91498 432.36887,291.04434 L 527.02964,291.04434 C 527.27078,285.95977 527.31563,280.70645 527.31563,275.31137 C 527.31559,257.48975 523.65984,230.6354 511.75241,219.92163 C 505.7987,214.56474 489.701,206.33815 480.79352,206.34075 z " id="path1063" sodipodi:nodetypes="cccccccc" /> <path style="fill-rule:evenodd;stroke:none;stroke-width:0.91963024pt" d="M 327.16217,290.76838 L 418.91669,291.42091 L 417.53126,283.00336 C 416.25922,279.01899 411.91051,274.64424 411.06349,270.16638 C 409.77452,265.68852 415.98676,268.56598 415.23722,261.21141 C 414.48767,253.85683 413.08127,234.33246 402.45013,224.02417 C 391.50649,214.02838 382.36734,207.6119 362.97069,210.76309 C 344.82404,212.66428 334.41396,221.32768 327.0142,236.61225 C 319.42306,251.89682 327.82696,270.91537 327.58831,278.04243 L 327.16217,290.76838 z " id="path1052" sodipodi:nodetypes="ccczzzzzzc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.99068832pt" d="M 304.47806,263.45874 C 304.47806,249.33467 295.28924,221.00412 286.18122,212.5132 C 277.07319,204.02228 258.91772,204.03875 249.8299,212.5132 C 240.74206,220.98765 231.65423,249.2358 231.65423,263.35988 C 231.65423,277.48396 240.74206,291.60803 249.8299,297.25767 C 258.91772,302.9073 277.07319,302.89082 286.18122,297.25767 C 295.28924,291.62451 304.47806,277.58282 304.47806,263.45874 z " id="path1005" sodipodi:nodetypes="czzzzzz" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt" d="M 269.52246,210.66588 C 269.40433,210.66585 269.2893,210.6935 269.17117,210.69488 L 269.17117,210.72388 C 269.08325,210.71596 268.99651,210.69484 268.90771,210.69488 C 268.70077,210.69495 268.49983,210.74848 268.29296,210.75288 L 268.29296,210.86887 C 268.16684,210.8522 268.04029,210.83991 267.9124,210.83987 C 267.82359,210.83984 267.73686,210.86095 267.64893,210.86887 L 267.64893,210.83987 C 267.53081,210.8385 267.41578,210.81084 267.29765,210.81087 C 261.07638,210.81276 254.84843,212.77489 250.69937,216.66845 C 248.62485,218.61522 236.75118,234.6709 240.74626,237.43095 C 250.68886,244.7044 259.30859,223.29341 250.11389,241.05569 C 249.1874,247.15673 248.94927,250.3379 248.88439,251.92991 C 248.75337,249.01354 247.66973,242.17332 241.97576,238.85185 C 237.2191,236.13422 234.1011,260.13945 234.1011,263.38408 C 234.1011,276.36263 242.40127,289.33642 250.69937,294.52784 C 254.9078,297.16071 261.25113,298.42446 267.56111,298.38456 L 267.56111,298.41356 C 267.88374,298.41621 268.20458,298.38868 268.52715,298.38456 L 268.52715,298.23957 C 268.77111,298.24891 269.01451,298.2706 269.259,298.26857 L 269.259,298.23957 C 275.56898,298.27947 281.91231,297.01574 286.12074,294.38285 C 294.41884,289.19143 302.71901,276.21763 302.71901,263.23909 C 302.71901,259.99446 299.601,235.98922 294.84435,238.70686 C 289.15038,242.02833 288.06674,248.86855 287.93572,251.78492 C 287.87084,250.19291 287.63271,247.01173 286.70621,240.9107 C 277.51152,223.14842 286.13125,244.5594 296.07385,237.28596 C 300.06893,234.52591 288.19526,218.47022 286.12074,216.52346 C 281.97168,212.6299 275.74373,210.66776 269.52246,210.66588 z " id="path1044" /> <path sodipodi:type="arc" style="font-size:12px;fill:#fffffd;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-dasharray:none" id="path695" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" transform="matrix(1.269231,0,0,1.209574,136.50927,-392.71098)" /> <path sodipodi:type="arc" style="font-size:12px;fill:url(#linearGradient1202);fill-opacity:0.75;fill-rule:evenodd;stroke:#0050fb;stroke-width:2.47292995;stroke-dasharray:none;stroke-opacity:1" id="path1200" sodipodi:cx="604.88873" sodipodi:cy="441.2019" sodipodi:rx="44.214264" sodipodi:ry="13.483783" d="M 649.103 441.2019 A 44.214264 13.483783 0 1 1 560.67447,441.2019 A 44.214264 13.483783 0 1 1 649.103 441.2019 z" transform="matrix(1.042553,0,0,0.882208,-45.319444,-61.74254)" /> <path style="font-size:12px;fill:url(#linearGradient3434);fill-opacity:0.70196001;stroke:#1c66f9;stroke-width:1.92428339;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.98999999" d="M 451.22048,423.00433 C 451.63246,421.80386 453.06823,420.60292 454.29922,420.78471 L 491.46953,428.8165 C 494.34845,426.28982 498.56281,423.21391 502.90683,423.98397 L 509.2225,424.86037 L 517.20354,426.42754 C 521.86269,427.8304 525.54468,430.74415 525.93077,436.54243 L 525.88183,506.39694 L 450.92735,482.50349 L 451.22048,423.00433 z " id="path10" sodipodi:nodetypes="cccccccccc" /> <rect style="font-size:12px;fill:none;fill-opacity:0.25;fill-rule:evenodd;stroke-width:0.0937284;stroke-opacity:0.53136998" id="rect1408" x="199.81725" y="208.79193" width="236.74754" height="236.68817" rx="0" ry="0" /> <rect style="font-size:12px;fill:none;fill-rule:evenodd;stroke-width:0.0520834" id="rect702" width="370.49606" height="374.81461" x="331.57504" y="372.21768" /> <path style="font-size:12px;fill:url(#linearGradient3429);fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:0.47846999pt" d="M 243.46953,613.59491 C 244.15833,611.87293 271.36555,520.95257 271.36555,520.95257 L 302.36113,608.77337 C 302.36113,608.77337 289.27411,618.07205 274.12072,618.07205 C 258.96732,620.13842 243.12514,613.59491 243.46953,613.59491 z " id="path593" sodipodi:nodetypes="ccccc" /> <polygon d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z " inkscape:randomized="0" inkscape:rounded="0" inkscape:flatsided="false" sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon597" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,154.95997,280.89042)" /> <polygon d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z " inkscape:randomized="0" inkscape:rounded="0" inkscape:flatsided="false" sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon598" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,146.00567,313.95242)" /> <polygon d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z " inkscape:randomized="0" inkscape:rounded="0" inkscape:flatsided="false" sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon599" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,162.53667,301.55422)" /> <polygon d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z " inkscape:randomized="0" inkscape:rounded="0" inkscape:flatsided="false" sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon600" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,160.81467,317.74072)" /> <polygon d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z " inkscape:randomized="0" inkscape:rounded="0" inkscape:flatsided="false" sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon601" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,146.69447,332.20542)" /> <polygon d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z " inkscape:randomized="0" inkscape:rounded="0" inkscape:flatsided="false" sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon602" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,170.11337,329.45022)" /> <path style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 258.30044,566.33574 C 256.77333,571.42599 256.69309,571.65611 255.16047,576.75743 L 256.29684,580.6151 L 258.67424,576.71257 L 263.1001,577.78913 L 260.90212,573.78194 L 264.05704,570.4775 L 259.49661,570.38778 L 258.30044,566.33574 z " id="path605" /> <path style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 276.34738,535.18557 L 275.12129,537.18917 L 270.68049,536.11261 L 272.87846,540.1198 L 269.7385,543.42424 L 274.29892,543.51396 L 275.58481,547.89495 L 277.96221,543.99243 L 279.59201,544.39614 L 276.34738,535.18557 z " id="path608" /> <path sodipodi:type="arc" style="font-size:12px;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-dasharray:none" id="path651" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" transform="matrix(1.269231,0,0,1.209574,-77.374024,-285.94088)" /> <path style="font-size:12px;fill:url(#linearGradient3417);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-opacity:1" d="M 279.87479,633.93985 L 279.87479,666.67394 L 255.83873,666.67394 L 255.83873,656.16576 C 255.83873,656.16576 255.85783,656.13497 231.44571,676.76631 L 255.32311,696.19509 L 255.32311,686.4807 L 279.87479,686.4807 L 279.87479,720.19756 C 299.3849,714.56487 313.66805,697.45517 313.66806,677.03091 C 313.66807,656.6106 299.37907,639.57596 279.87479,633.93985 z " id="path669" /> <path style="font-size:12px;fill:url(#linearGradient3414);fill-rule:evenodd;stroke:#000000;stroke-width:2.78715038;stroke-linejoin:round" d="M 283.95579,490.94075 C 290.66581,489.39661 295.57028,485.44504 300.07353,481.09224 C 304.17555,476.47196 308.27756,470.24678 309.77159,464.0216 L 276.03686,421.84097 L 237.48736,460.81175 L 283.95579,490.94075 z " id="path709" sodipodi:nodetypes="cccccc" /> <path sodipodi:type="arc" style="font-size:12px;fill:#f5f9ff;fill-rule:evenodd;stroke:#000000;stroke-width:10.78610039" id="path587" sodipodi:cx="220.25374" sodipodi:cy="529.07959" sodipodi:rx="44.626575" sodipodi:ry="78.456398" d="M 264.88031 529.07959 A 44.626575 78.456398 0 1 1 175.62716,529.07959 A 44.626575 78.456398 0 1 1 264.88031 529.07959 z" transform="matrix(0.26113,0,-0.220403,0.255703,314.80207,305.48132)" /> <path style="font-size:12px;fill:#ff0000;fill-rule:evenodd;stroke-width:1pt" d="M 243.66732,455.91895 C 207.99046,453.53473 230.86297,486.36929 231.18432,489.05618 C 231.50609,491.74307 212.45436,496.31199 220.47004,505.98065 C 233.70212,515.64935 294.73252,518.87157 293.74202,503.71551 C 292.75152,488.55528 244.41991,492.90854 233.95854,488.90274 C 230.5101,479.45166 230.06347,464.3735 235.28957,459.88088 C 238.35009,457.8818 237.91425,463.35185 243.66732,455.91895 z " id="path711" sodipodi:nodetypes="cccccsc" /> <path style="font-size:12px;fill:#ff0000;fill-rule:evenodd;stroke-width:10.78610039" d="M 271.24683,425.72263 C 265.99009,425.72263 255.39114,433.36371 247.59081,442.77656 C 241.16254,450.53372 238.64291,457.0772 240.89292,459.14242 C 247.83823,456.92466 258.29806,449.12547 266.36059,439.77166 C 270.03525,435.50847 272.64634,431.56918 274.1298,428.31817 C 274.02196,426.68582 273.09418,425.72263 271.24683,425.72263 z " id="path592" /> <rect style="font-size:12px;fill:url(#linearGradient3408);fill-opacity:1;fill-rule:evenodd;stroke:#000002;stroke-width:1.94391274" id="rect642" width="71.98143" height="73.806519" x="339.74475" y="642.47302" /> <path style="font-size:12px;fill-rule:evenodd;stroke:#000002;stroke-width:1.94391274" d="M 340.05239,659.32645 L 340.05239,715.98893 L 410.49575,715.98893 L 405.88157,712.7926 C 397.37094,706.98105 399.88311,699.28077 390.1933,700.00721 C 380.81111,700.1525 356.62253,712.80034 352.52102,705.43907 C 347.64017,698.79476 349.20267,643.90267 345.30441,650.4736 L 340.05239,659.32645 z " id="path640" sodipodi:nodetypes="cccczcsc" /> <rect style="font-size:12px;fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:4.10281944" id="rect615" width="57.240681" height="49.173893" x="496.88156" y="922.24396" transform="matrix(0.8593708,-0.5113529,0,1,0,0)" /> <text xml:space="preserve" style="font-size:34.43291092px;font-weight:bold;line-height:100%;fill:#000000;fill-opacity:1;stroke-width:1pt;font-family:Verdana" x="487.49341" y="857.62598" id="text610" sodipodi:linespacing="100%" transform="matrix(0.8820213,-0.5398853,0,1.1337595,0,0)"><tspan x="487.49341" y="857.62598" sodipodi:role="line" id="tspan613" style="fill:#000000;fill-opacity:1">LR</tspan></text> <rect style="font-size:12px;fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:4.12392521" id="rect627" width="57.83112" height="49.173893" x="-614.36664" y="357.21173" transform="matrix(-0.8624565,-0.5061313,0,1,0,0)" /> <text xml:space="preserve" style="font-size:34.43291092px;font-weight:bold;line-height:100%;stroke-width:1pt;font-family:Verdana" x="-598.04327" y="340.37064" id="text628" sodipodi:linespacing="100%" transform="matrix(-0.8820213,-0.5398853,0,1.1337595,0,0)"><tspan x="-598.04327" y="340.37064" sodipodi:role="line" id="tspan629">LR</tspan></text> <rect style="font-size:12px;fill:url(#linearGradient3398);fill-rule:evenodd;stroke:#000000;stroke-width:0.77675009pt" id="rect648" width="56.066242" height="49.173893" x="630.58124" y="997.7973" transform="matrix(0.8529074,-0.5220622,0,1,0,0)" /> <rect style="font-size:12px;fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.77675009pt" id="rect649" width="56.066242" height="49.173893" x="-742.98041" y="280.71118" transform="matrix(-0.8529074,-0.5220622,0,1,0,0)" /> <path style="font-size:12px;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.40036964;stroke-opacity:1" d="M 570.21281,672.11203 C 560.80527,687.5177 551.81276,684.49603 553.40375,698.74281 C 555.96315,704.40234 562.05038,691.50316 576.02334,688.32276 C 581.55718,684.47094 584.49704,676.2781 577.47598,661.60195 C 569.00228,647.92063 548.83833,666.49034 544.68794,681.59092 C 540.53755,696.36586 547.93908,698.22084 553.19623,696.88453" id="path646" sodipodi:nodetypes="ccczzc" /> <path style="font-size:12px;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:2.40036964" d="M 602.22003,673.33419 C 611.62757,688.73986 620.62007,685.71819 619.02909,699.96497 C 616.46969,705.6245 610.38245,692.72532 596.4095,689.54492 C 590.87565,685.6931 587.93579,677.50026 594.95686,662.82411 C 603.43056,649.14279 623.59451,667.71251 627.7449,682.81308 C 631.89528,697.58802 624.49376,699.443 619.23661,698.10669" id="path650" sodipodi:nodetypes="ccczzc" /> <path sodipodi:type="arc" style="font-size:12px;fill:url(#radialGradient1158);fill-rule:evenodd;stroke:#000000;stroke-width:1pt" id="path1411" d="M 69.375 165 A 4.375 4.375 0 1 1 60.625,165 A 4.375 4.375 0 1 1 69.375 165 z" sodipodi:cx="65" sodipodi:cy="165" sodipodi:rx="4.375" sodipodi:ry="4.375" transform="matrix(6.282797,0,0,6.282797,-52.398774,-588.87818)" /> <path style="font-size:12px;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:15.70698166;stroke-linecap:round;stroke-linejoin:round" d="M 379.53347,471.34372 L 410.94745,502.75771" id="path1413" sodipodi:nodetypes="cc" /> <path sodipodi:type="arc" style="font-size:12px;fill:url(#radialGradient1203);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87644994;stroke-dasharray:none" id="path682" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" transform="matrix(1.269231,0,0,1.209574,30.443296,-392.69368)" /> <path style="font-size:12px;fill:url(#linearGradient3389);fill-opacity:0.38016998;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 374.84848,524.63047 C 355.62378,524.63047 339.1694,535.61346 331.69463,551.27888 C 337.6128,554.31083 344.21798,557.18303 352.00233,555.0966 C 366.61946,551.90429 371.18895,544.3788 378.49751,541.18651 C 393.81739,540.61396 401.15447,548.4841 416.25714,548.14156 C 408.15968,534.19151 392.75046,524.63048 374.84848,524.63047 z " id="path687" /> <text xml:space="preserve" style="font-size:112.55771637px;font-style:normal;font-weight:bold;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Palatino Linotype" x="286.69199" y="741.06946" id="text688" sodipodi:linespacing="100%" transform="scale(1.2282659,0.814156)"><tspan x="286.69199" y="741.06946" sodipodi:role="line" id="tspan693">i</tspan></text> <path style="font-size:12px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 480.51446,524.13119 L 480.51446,616.87976 C 507.96173,616.87976 530.23181,596.12414 530.23178,570.52148 C 530.23178,544.91881 507.96171,524.13117 480.51446,524.13119 z " id="path700" /> <path style="font-size:12px;fill:url(#linearGradient3383);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 480.95072,524.13207 C 461.72602,524.13207 445.27164,535.11506 437.79687,550.78048 C 443.71504,553.81243 450.32022,556.68463 458.10457,554.5982 C 472.7217,551.40589 477.29119,543.8804 484.59975,540.68811 C 499.91963,540.11556 507.25671,547.9857 522.35938,547.64316 C 514.26192,533.69311 498.8527,524.13208 480.95072,524.13207 z " id="path697" /> <g id="g708" transform="matrix(1.26275,0,0,1.26275,-87.529244,-290.57418)"> <rect style="font-size:12px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="rect705" width="15.909903" height="6.6291261" x="557.73047" y="679.8053" ry="3.314563" /> <rect style="font-size:12px;fill:url(#linearGradient3036);fill-rule:evenodd;stroke-width:1pt" id="rect706" width="12.472398" height="1.377152" x="559.37109" y="680.06189" ry="0.68857598" rx="1.6909561" /> </g> <g id="g711" transform="matrix(1.26275,0,0,1.26275,-5.494134,-290.85318)"> <rect style="font-size:12px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="rect712" width="15.909903" height="6.6291261" x="557.73047" y="679.8053" ry="3.314563" /> <rect style="font-size:12px;fill:url(#linearGradient3038);fill-rule:evenodd;stroke-width:1pt" id="rect713" width="12.472398" height="1.377152" x="559.37109" y="680.06189" ry="0.68857598" rx="1.6909561" /> </g> <g id="g721" transform="matrix(0.878674,-0.906901,0.906901,0.878674,-476.65103,514.65082)" style="font-size:12px"> <g id="g722"> <rect style="font-size:12px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="rect723" width="15.909903" height="6.6291261" x="557.73047" y="679.8053" ry="3.314563" /> <rect style="font-size:12px;fill:url(#linearGradient3040);fill-rule:evenodd;stroke-width:1pt" id="rect724" width="12.472398" height="1.377152" x="559.37109" y="680.06189" ry="0.68857598" rx="1.6909561" /> </g> <g id="g725" transform="translate(64.96544,-0.220965)"> <rect style="font-size:12px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="rect726" width="15.909903" height="6.6291261" x="557.73047" y="679.8053" ry="3.314563" /> <rect style="font-size:12px;fill:url(#linearGradient3042);fill-rule:evenodd;stroke-width:1pt" id="rect727" width="12.472398" height="1.377152" x="559.37109" y="680.06189" ry="0.68857598" rx="1.6909561" /> </g> </g> <g id="g728" transform="matrix(1.073491e-5,-1.26275,1.26275,1.073491e-5,-194.38993,1328.4811)" style="font-size:12px"> <g id="g729"> <rect style="font-size:12px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="rect730" width="15.909903" height="6.6291261" x="557.73047" y="679.8053" ry="3.314563" /> <rect style="font-size:12px;fill:url(#linearGradient3044);fill-rule:evenodd;stroke-width:1pt" id="rect731" width="12.472398" height="1.377152" x="559.37109" y="680.06189" ry="0.68857598" rx="1.6909561" /> </g> <g id="g732" transform="translate(64.96544,-0.220965)"> <rect style="font-size:12px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="rect733" width="15.909903" height="6.6291261" x="557.73047" y="679.8053" ry="3.314563" /> <rect style="font-size:12px;fill:url(#linearGradient3046);fill-rule:evenodd;stroke-width:1pt" id="rect734" width="12.472398" height="1.377152" x="559.37109" y="680.06189" ry="0.68857598" rx="1.6909561" /> </g> </g> <g id="g735" transform="matrix(0.893911,0.891887,-0.891887,0.893911,742.82387,-571.45388)" style="font-size:12px"> <g id="g736"> <rect style="font-size:12px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="rect737" width="15.909903" height="6.6291261" x="557.73047" y="679.8053" ry="3.314563" /> <rect style="font-size:12px;fill:url(#linearGradient3048);fill-rule:evenodd;stroke-width:1pt" id="rect738" width="12.472398" height="1.377152" x="559.37109" y="680.06189" ry="0.68857598" rx="1.6909561" /> </g> <g id="g739" transform="translate(64.96544,-0.220965)"> <rect style="font-size:12px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="rect740" width="15.909903" height="6.6291261" x="557.73047" y="679.8053" ry="3.314563" /> <rect style="font-size:12px;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt" id="rect741" width="12.472398" height="1.377152" x="559.37109" y="680.06189" ry="0.68857598" rx="1.6909561" /> </g> </g> <path style="font-size:12px;fill:#e6e6e6;fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 667.99564,543.421 C 656.0175,543.421 645.76543,551.32164 641.1082,562.5906 C 644.79557,564.77164 648.911,566.83777 653.76112,565.33689 C 662.86847,563.04049 665.71554,557.62701 670.26921,555.33063 C 679.81441,554.91877 684.38586,560.58017 693.79572,560.33376 C 688.75052,550.29876 679.14965,543.42101 667.99564,543.421 z " id="path801" /> <path style="fill:#fb4100;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 460.52441,445.57716 C 468.10439,423.92273 481.1518,440.77221 490.71993,441.73323 C 499.04543,441.25268 499.91528,415.30612 515.69646,419.63058 C 523.02791,422.19321 521.03972,439.65107 519.7971,448.94061 C 519.67286,459.51141 521.0452,471.61968 510.4775,480.65309 C 495.68969,492.81335 452.94442,466.75105 460.52441,445.57716 z " id="path760" sodipodi:nodetypes="ccccsz" /> <path style="font-size:12px;fill:#4789f7;fill-opacity:1;stroke:#1c4ed9;stroke-width:1.71254337;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216003" d="M 450.82856,482.20291 L 526.04844,506.43293 L 523.28751,511.48629 L 448.52721,485.77118 L 450.82856,482.20291 z " id="path279" sodipodi:nodetypes="ccccc" /> <path style="font-size:12px;fill:url(#linearGradient3350);fill-opacity:0.69930001;stroke:#1c66fb;stroke-width:1.77588487;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216003" d="M 430.83685,438.74362 C 429.82395,436.0564 430.81654,433.49264 433.23265,433.76555 L 468.97638,441.37169 L 471.18114,449.11568 L 486.78016,452.74293 L 484.50444,444.58967 L 500.58846,447.3442 C 502.71461,448.03584 504.36603,449.4673 505.87346,452.74895 L 522.77231,510.83334 L 448.41172,485.62951 L 430.83685,438.74362 z " id="path208" sodipodi:nodetypes="ccccccccccc" /> <path style="font-size:12px;fill:url(#radialGradient3347);fill-opacity:0.98999999;stroke:#0c1dfb;stroke-width:2.6319499;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.98999999" d="M 541.55553,431.15809 C 541.23051,427.38586 543.9104,423.50523 547.47412,423.0305 L 628.10196,423.45855 C 631.03285,423.73768 632.90302,425.33481 633.71274,429.8412 L 633.64214,503.32951 L 625.40507,510.69938 L 549.02921,511.04966 L 541.57579,502.95071 L 541.55553,431.15809 z " id="path1131" sodipodi:nodetypes="ccccccccc" /> <path style="font-size:12px;fill:url(#linearGradient3344);fill-opacity:0.69930001;stroke:#1c2942;stroke-width:2.28141999;stroke-opacity:0.99216003" d="M 566.84522,480.70051 L 611.32692,480.71086 L 611.71099,511.23534 L 566.54489,511.27158 L 566.84522,480.70051 z " id="path230" sodipodi:nodetypes="ccccc" /> <path style="font-size:12px;fill:#ffffff;fill-opacity:0.99216003;stroke:#1c2942;stroke-width:1.10123003;stroke-opacity:0.99216003" d="M 552.22632,436.30828 L 546.45836,436.08807 L 546.4485,430.05365 L 552.20989,429.99665 L 552.22632,436.30828 z " id="path313" sodipodi:nodetypes="ccccc" /> <path style="font-size:12px;fill:#fffffd;fill-opacity:1;stroke:#0c5cff;stroke-width:2.20247006;stroke-opacity:0.99216003" d="M 556.74217,423.78409 L 619.61682,423.79651 L 620.1597,469.68309 L 556.31765,469.72689 L 556.74217,423.78409 z " id="path412" sodipodi:nodetypes="ccccc" /> <path style="font-size:12px;fill:#1c2942;fill-opacity:0.99215698;stroke-width:8.96854973" d="M 584.87523,506.21798 L 574.38649,506.43578 L 574.36787,484.62813 L 584.84421,484.83956 L 584.87523,506.21798 z " id="path415" sodipodi:nodetypes="ccccc" /> <path style="font-size:12px;fill:#ffffff;fill-opacity:0.99216003;stroke:#1c2942;stroke-width:1.10123003;stroke-opacity:0.99216003" d="M 629.5978,435.86357 L 623.82984,435.64335 L 623.81998,429.60893 L 629.58137,429.55194 L 629.5978,435.86357 z " id="path420" sodipodi:nodetypes="ccccc" /> <path style="fill:#fb4100;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 560.37851,442.56322 C 567.2077,429.26412 578.96275,439.61227 587.58316,440.20245 C 595.08402,439.90736 595.86769,423.97222 610.08576,426.62808 C 616.69101,428.20192 614.90468,458.5573 605.38373,464.10516 C 592.06066,471.57343 553.54931,455.56721 560.37851,442.56322 z " id="path1137" sodipodi:nodetypes="cccsz" /> <path style="fill:#000048;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 258.87077,308.5828 C 253.08731,317.00199 248.84661,323.41806 244.02038,334.46537 C 239.19415,345.89492 233.86557,374.16335 237.62514,378.80842 C 241.38471,383.45348 246.87367,380.38573 250.63323,376.271 C 254.3928,372.15627 252.48835,351.21953 253.67461,342.10614 C 254.54837,332.99275 256.89282,323.55354 258.87077,308.5828 z " id="path1163" sodipodi:nodetypes="czzzzc" /> <path style="fill:url(#linearGradient3334);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 244.87703,341.05538 C 243.47705,345.15846 241.84536,347.98072 240.67709,353.3646 C 239.50883,358.93477 237.84073,372.71133 238.75079,374.97509 C 239.66086,377.23885 240.98955,375.74379 241.89961,373.73848 C 242.80967,371.73318 242.34867,361.52971 242.63582,357.08832 C 242.84733,352.64692 244.39824,348.35134 244.87703,341.05538 z " id="path1164" sodipodi:nodetypes="czzzzc" /> <path style="font-size:12px;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke-width:1pt" d="M 246.84696,401.26635 C 233.22657,397.6892 232.27442,390.28556 235.78589,385.29279 C 237.10987,383.89377 240.22335,381.74991 242.03082,381.87983 C 243.83829,382.00976 245.39652,382.92548 247.71778,384.58791 C 252.98531,388.53776 243.05535,390.25329 246.84696,401.26635 z " id="path1165" sodipodi:nodetypes="ccszc" /> <path style="font-size:12px;fill:url(#linearGradient3330);fill-rule:evenodd;stroke-width:1pt" d="M 242.39644,396.66561 C 239.13849,395.84397 237.60423,396.00137 235.59134,391.07571 C 233.57845,386.46255 238.58293,384.94683 239.17721,384.32111 C 239.77149,383.69538 240.63913,384.10863 241.23341,384.66292 C 241.82769,385.2172 241.52665,388.03755 241.71416,389.26519 C 241.85228,390.49284 239.58379,392.61768 242.39644,396.66561 z " id="path1166" sodipodi:nodetypes="czzzzc" /> <path style="fill:#ff0000;fill-opacity:0.75;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="path1178" d="M 314.57982,354.70876 C 315.40432,361.53904 292.43811,370.44146 291.51251,374.36944 C 289.61042,378.70993 304.49355,389.01441 300.45951,394.15556 C 297.88336,401.90543 258.15216,405.84922 248.90859,403.44343 C 247.75479,402.05103 247.55467,398.86418 249.66772,396.95909 C 255.30743,393.65166 283.03666,396.48065 292.19312,391.50374 C 292.99642,389.41248 282.49481,378.89188 285.71585,373.32683 C 289.0931,366.46975 309.78135,359.31112 309.46479,355.27714 C 306.48475,350.72496 283.39899,343.56241 280.66089,339.63205 C 280.66089,339.63205 310.68949,348.99124 314.57982,354.70876 z " sodipodi:nodetypes="cccccccccc" /> <path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 363.38161,311.90492 C 357.59815,320.32411 353.35745,326.74018 348.53122,337.78749 C 343.70499,349.21704 338.37641,377.48547 342.13598,382.13054 C 345.89555,386.7756 351.38451,383.70785 355.14407,379.59312 C 358.90364,375.47839 356.99919,354.54165 358.18545,345.42826 C 359.05921,336.31487 361.40366,326.87566 363.38161,311.90492 z " id="path1183" sodipodi:nodetypes="czzzzc" /> <path style="fill:url(#linearGradient3325);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 349.38787,344.3775 C 347.98789,348.48058 346.3562,351.30284 345.18793,356.68672 C 344.01967,362.25689 342.35157,376.03345 343.26163,378.29721 C 344.1717,380.56097 345.50039,379.06591 346.41045,377.0606 C 347.32051,375.0553 346.85951,364.85183 347.14666,360.41044 C 347.35817,355.96904 348.90908,351.67346 349.38787,344.3775 z " id="path1184" sodipodi:nodetypes="czzzzc" /> <path style="font-size:12px;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke-width:1pt" d="M 351.3578,404.58847 C 337.73741,401.01132 336.78526,393.60768 340.29673,388.61491 C 341.62071,387.21589 344.73419,385.07203 346.54166,385.20195 C 348.34913,385.33188 349.90736,386.2476 352.22862,387.91003 C 357.49615,391.85988 347.56619,393.57541 351.3578,404.58847 z " id="path1185" sodipodi:nodetypes="ccszc" /> <path style="font-size:12px;fill:url(#linearGradient3321);fill-rule:evenodd;stroke-width:1pt" d="M 346.90728,399.98773 C 343.64933,399.16609 342.11507,399.32349 340.10218,394.39783 C 338.08929,389.78467 343.09377,388.26895 343.68805,387.64323 C 344.28233,387.0175 345.14997,387.43075 345.74425,387.98504 C 346.33853,388.53932 346.03749,391.35967 346.225,392.58731 C 346.36312,393.81496 344.09463,395.9398 346.90728,399.98773 z " id="path1186" sodipodi:nodetypes="czzzzc" /> <path style="fill:#ff0000;fill-opacity:0.75;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="path1187" d="M 419.09066,358.03088 C 419.91516,364.86116 396.94895,373.76358 396.02335,377.69156 C 394.12126,382.03205 409.00439,392.33653 404.97035,397.47768 C 402.3942,405.22755 362.663,409.17134 353.41943,406.76555 C 352.26563,405.37315 352.06551,402.1863 354.17856,400.28121 C 359.81827,396.97378 387.5475,399.80277 396.70396,394.82586 C 397.50726,392.7346 387.00565,382.214 390.22669,376.64895 C 393.60394,369.79187 414.29219,362.63324 413.97563,358.59926 C 410.99559,354.04708 387.90983,346.88453 385.17173,342.95417 C 385.17173,342.95417 415.20033,352.31336 419.09066,358.03088 z " sodipodi:nodetypes="cccccccccc" /> <path style="font-size:12px;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#00de00;stroke-width:3.88089991;stroke-linecap:round;stroke-dasharray:7.76179, 7.76179;stroke-dashoffset:0" d="M 385.46637,349.3006 L 352.76267,401.22876" id="path1189" /> <path style="fill:#fb4100;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 545.83421,339.00725 C 555.29835,316.61255 571.58891,334.03807 583.53539,335.03189 C 593.93035,334.53499 595.01639,307.70136 614.7203,312.17365 C 623.87409,314.82388 621.39853,365.94011 608.20406,375.28229 C 589.74047,387.85833 536.37006,360.90501 545.83421,339.00725 z " id="path1196" sodipodi:nodetypes="cccsz" /> <path style="font-size:12px;fill:url(#radialGradient3315);fill-opacity:0.98999999;stroke:#0c1dfb;stroke-width:2.47207999;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.98999999" d="M 539.55742,329.86065 C 550.20758,338.42827 575.36536,339.08326 588.74955,339.28881 C 602.13373,339.49436 625.26054,336.61881 631.71463,328.69888 L 623.40696,400.03263 C 612.55911,405.15586 600.77053,408.29651 587.10049,407.93305 C 573.43045,407.5696 556.31107,405.36188 547.0311,400.34165 L 539.55742,329.86065 z " id="path1199" sodipodi:nodetypes="czcczcc" /> <rect style="font-size:12px;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt" id="rect983" width="106.29922" height="106.29922" x="213.87325" y="199.80083" /> <rect style="font-size:12px;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt" id="rect984" width="106.29922" height="106.29922" x="320.17245" y="199.80083" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt" d="M 264.13607,237.58254 C 264.4776,236.89576 263.55204,229.45502 262.13713,227.53203 C 260.72222,225.60904 258.62283,226.45669 258.2813,227.14347 C 257.93978,227.83025 260.05101,226.91589 261.46591,228.83888 C 262.88082,230.76186 263.79455,238.26932 264.13607,237.58254 z " id="path1018" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.76453004pt" d="M 257.8175,276.31726 C 254.83735,276.02984 254.24158,269.14348 252.17246,273.34443 C 250.0083,277.62047 254.46823,286.78993 254.86058,282.05056 C 255.15788,277.31121 260.70261,276.67975 257.8175,276.31726 z " id="path1019" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt" d="M 272.68404,237.44007 C 272.34251,236.75328 273.26807,229.31254 274.68298,227.38956 C 276.09788,225.46656 278.19728,226.31421 278.53881,227.00099 C 278.88033,227.68778 276.7691,226.77342 275.3542,228.6964 C 273.93929,230.61939 273.02556,238.12685 272.68404,237.44007 z " id="path1036" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.76453004pt" d="M 279.00261,276.17479 C 281.98276,275.88737 282.57853,269.001 284.64765,273.20196 C 286.81181,277.478 282.35188,286.64746 281.95953,281.90809 C 281.66223,277.16873 276.1175,276.53728 279.00261,276.17479 z " id="path1037" sodipodi:nodetypes="czzz" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0507082pt" d="M 393.41778,249.75479 C 392.73276,254.42899 380.4132,251.97901 380.21857,259.67332 C 380.02394,266.86846 395.82989,268.28032 401.73513,266.16252 C 407.64038,264.04472 411.50934,260.75037 410.89844,253.45574 C 410.28756,246.16111 408.32593,227.80632 386.76522,217.28135 C 365.63646,207.25555 341.70568,220.92063 334.05688,235.52111 C 326.40807,250.62079 325.79982,265.91294 334.87103,260.42208 C 343.51028,255.43037 354.05149,239.69352 369.86419,237.87506 C 385.2449,236.05659 394.10277,246.07893 393.41778,249.75479 z " id="path1045" sodipodi:nodetypes="czzzzzzzz" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.08777227pt" d="M 357.81578,261.23898 C 356.5181,259.13317 356.92273,251.14638 350.00173,252.6991 C 343.08073,254.25181 335.56436,261.67029 333.48062,264.3444 C 331.39688,267.01853 332.51317,271.7629 333.48062,272.8843 C 334.44808,274.0057 339.9551,274.60952 341.51792,275.9897 C 343.08073,277.36989 346.72728,282.54559 348.66218,282.20055 C 350.59709,281.8555 354.54133,277.71494 354.69016,275.98972 C 354.839,274.26448 359.11343,263.34482 357.81578,261.23898 z " id="path1049" sodipodi:nodetypes="czzzzzzz" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.0507082pt" d="M 353.98747,290.8932 C 354.40835,286.69185 359.13872,270.03729 359.90396,265.00399 C 360.66919,259.9707 357.76131,262.50815 358.98569,260.26188 C 360.21005,258.0156 364.34229,252.73275 367.25016,251.52641 C 370.15805,250.32009 374.29029,251.01837 376.43293,252.14151 C 378.57557,253.26465 379.91473,257.01728 380.10603,258.26519 C 380.29733,259.51312 378.61384,260.92744 377.58077,260.51147 C 376.54771,260.09549 378.19773,253.58856 375.69329,255.59288 C 373.18885,257.77367 370.03172,261.4682 368.39801,263.00731 C 367.08896,264.5464 370.3111,263.75607 370.92328,265.00399 C 371.53546,266.25192 372.6833,268.33179 372.07112,270.49486 C 371.45892,272.65792 368.81888,276.60968 367.25016,277.98239 C 365.68143,279.35511 364.30403,276.69288 362.65879,278.73116 C 361.01354,280.76943 358.78758,289.12011 357.41015,291.07518 L 353.98747,290.8932 z " id="path1050" sodipodi:nodetypes="czzzzzzzzzzzzcc" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-dasharray:none" d="M 352.83142,246.55994 C 353.26061,248.23306 354.60183,252.16987 355.56751,253.05563 C 356.53319,253.94141 358.59869,254.20386 358.9474,253.05563 C 359.29612,251.9074 356.9624,246.13345 362.81013,243.01683 C 368.81881,239.90021 378.20738,240.62195 381.15807,242.03264 C 384.10875,243.44331 389.07129,248.69236 384.37701,252.26828 C 380.48745,255.84417 389.92966,255.9426 391.9415,254.4335 C 393.95334,252.9244 396.87588,247.33751 394.27391,244.64737 C 391.67194,241.95724 385.0755,235.53016 378.95952,234.87404 C 372.84355,234.2179 358.22313,241.50773 356.2113,242.03264 C 354.03853,242.55754 352.40223,244.8868 352.83142,246.55994 z " id="path1051" sodipodi:nodetypes="czzzzzzzzzz" /> <g id="g1422" transform="translate(-15.816734,-109.09188)"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.16552086pt" d="M 500.15302,318.39576 C 498.6309,318.58535 497.62728,319.44559 497.45659,321.35308 L 496.2718,334.4836 L 495.12787,321.15593 C 494.4451,313.52598 480.11544,322.81032 474.82299,326.00594 C 463.97441,332.55643 453.12906,348.90299 453.12904,365.27921 C 453.12904,369.37327 450.53202,374.85695 458.19505,375.61014 C 471.12797,372.2556 475.71395,368.40706 475.88521,364.72718 C 475.97004,366.73597 472.22575,370.99591 477.19257,377.85771 C 471.88006,374.61864 449.68734,372.98113 454.59982,385.78334 C 460.64344,396.79407 487.30926,400.22178 487.52886,393.43295 C 487.74845,386.64413 493.79077,380.76155 483.19824,381.13048 C 485.89452,378.43241 492.4316,379.68832 495.12787,376.99022 L 496.31266,372.81053 L 497.66087,376.55648 C 500.35715,379.25456 506.64909,378.23526 509.34537,380.93333 C 500.48613,379.72791 504.79515,386.40754 505.01475,393.19637 C 505.23437,399.98518 531.94102,396.59692 537.98464,385.58618 C 542.89711,372.78397 520.66354,374.42148 515.35103,377.66055 C 520.31782,370.79874 516.57357,366.49938 516.65839,364.4906 C 516.82967,368.17046 521.41564,372.05845 534.34856,375.41298 C 542.0116,374.65978 539.45542,369.1761 539.45542,365.08206 C 539.45542,348.70583 528.61005,332.35928 517.76147,325.80879 C 513.79214,323.41205 504.71936,317.82698 500.15302,318.39576 z " id="path1060" sodipodi:nodetypes="cccccccccccccccccccccccc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt" d="M 501.66595,339.08941 C 507.48057,336.85763 507.44235,336.64611 505.77764,338.68995 C 504.31721,340.73379 502.98053,336.92565 501.65049,348.68951 C 500.11618,360.84766 495.64707,341.51834 501.66595,339.08941 z " id="path1057" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt" d="M 491.59647,339.30071 C 485.78186,337.06892 485.82008,336.85741 487.48479,338.90125 C 488.94522,340.94509 490.2819,337.13695 491.61194,348.9008 C 493.14625,361.05897 497.61536,341.72965 491.59647,339.30071 z " id="path1059" sodipodi:nodetypes="czzz" /> </g> <path sodipodi:type="arc" style="font-size:12px;fill:url(#radialGradient3062);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" id="path1065" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" transform="matrix(1.269231,0,0,1.209574,137.91637,-391.80978)" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt" id="rect1074" width="42.038872" height="31.251434" x="806.71417" y="226.75293" inkscape:export-filename="C:\pas\mricron\btn\render.png" inkscape:export-xdpi="59.193832" inkscape:export-ydpi="59.193832" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none" d="M 819.23401,235.83827 C 829.23401,236.6716 837.98401,240.4216 843.60901,248.96327 C 849.23401,258.12994 848.60901,258.96327 848.60901,258.96327 C 848.60901,258.96327 849.85901,267.71327 837.98401,268.96327 C 826.10901,269.58827 812.80095,257.37856 799.05095,257.37856 C 785.92595,257.37856 781.10901,255.33351 782.98401,243.96327 C 784.85901,232.15109 798.29651,206.46327 821.10901,205.83827 C 843.92151,204.58827 864.54651,211.9841 872.98401,227.08827 C 880.79651,242.19244 877.04651,253.96327 872.35901,257.71327 C 867.67151,261.46327 856.94234,256.46327 848.60901,258.33827" id="path1067" sodipodi:nodetypes="czzzzzzzzz" inkscape:export-filename="C:\pas\mricron\btn\render.png" inkscape:export-xdpi="59.193832" inkscape:export-ydpi="59.193832" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 834.85901,257.08827 C 827.35901,254.58827 824.23401,254.58827 817.35901,248.33827 C 810.48401,242.08827 809.23401,235.83827 809.23401,235.83827" id="path1068" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\render.png" inkscape:export-xdpi="59.193832" inkscape:export-ydpi="59.193832" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 826.73401,206.46327 C 827.35901,218.96327 834.15818,226.67123 831.94848,236.83589" id="path1069" sodipodi:nodetypes="cc" inkscape:export-filename="C:\pas\mricron\btn\render.png" inkscape:export-xdpi="59.193832" inkscape:export-ydpi="59.193832" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 840.13877,213.44025 C 854.73083,213.197 857.34591,215.81208 859.43798,226.79542 C 865.19116,223.65732 868.18798,225.41724 869.43798,237.91724" id="path1070" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\render.png" inkscape:export-xdpi="59.193832" inkscape:export-ydpi="59.193832" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 849.45107,234.18033 C 849.45107,234.18033 840.18981,253.08198 849.56481,252.45698 C 858.93981,251.83198 855.28403,251.8829 857.93568,250.77805" id="path1071" sodipodi:nodetypes="ccc" inkscape:export-filename="C:\pas\mricron\btn\render.png" inkscape:export-xdpi="59.193832" inkscape:export-ydpi="59.193832" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 794.9741,233.10811 C 794.9741,233.10811 798.12134,225.52191 806.0986,221.07625 C 814.07585,217.1536 819.57263,214.37906 819.7936,208.85479 L 819.13069,214.5242 C 818.40282,220.74913 827.76732,227.71239 824.7936,234.41697" id="path1072" sodipodi:nodetypes="czczz" inkscape:export-filename="C:\pas\mricron\btn\render.png" inkscape:export-xdpi="59.193832" inkscape:export-ydpi="59.193832" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.875" d="M 836.12326,205.71363 C 841.38865,216.00392 837.5669,231.23283 841.54438,242.0604" id="path1073" sodipodi:nodetypes="cc" inkscape:export-filename="C:\pas\mricron\btn\render.png" inkscape:export-xdpi="59.193832" inkscape:export-ydpi="59.193832" /> <rect style="font-size:12px;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt" id="rect1173" width="106.29922" height="106.29922" x="426.47165" y="93.501656" /> <rect style="font-size:12px;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt" id="rect1174" width="106.29922" height="106.29922" x="532.77087" y="93.501656" /> <rect style="fill:url(#linearGradient3266);fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;stroke-dasharray:none" id="rect1204" width="91.25" height="30" x="-312.93326" y="132.02031" ry="12.5" transform="scale(-1,1)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:1.27241249pt" d="M 372.7571,104.0435 C 363.84962,104.0461 348.56454,111.16259 342.62403,116.5091 C 330.74298,127.20208 324.08732,155.03475 324.08732,172.8564 C 324.08732,178.28856 324.10322,183.61773 324.33245,188.74709 L 418.99322,188.74709 C 419.23436,183.66252 419.27921,178.4092 419.27921,173.01412 C 419.27917,155.1925 415.62342,128.33815 403.71599,117.62438 C 397.76228,112.26749 381.66458,104.0409 372.7571,104.0435 z " id="path1205" sodipodi:nodetypes="cccccccc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.16552086pt" d="M 376.29987,107.00663 C 374.77775,107.19622 373.77413,108.05646 373.60344,109.96395 L 372.41865,123.09447 L 371.27472,109.7668 C 370.59195,102.13685 356.26229,111.42119 350.96984,114.61681 C 340.12126,121.1673 329.27591,137.51386 329.27589,153.89008 C 329.27589,157.98414 326.67887,163.46782 334.3419,164.22101 C 347.27482,160.86647 351.8608,157.01793 352.03206,153.33805 C 352.11689,155.34684 348.3726,159.60678 353.33942,166.46858 C 348.02691,163.22951 325.83419,161.592 330.74667,174.39421 C 336.79029,185.40494 363.45611,188.83265 363.67571,182.04382 C 363.8953,175.255 369.93762,169.37242 359.34509,169.74135 C 362.04137,167.04328 368.57845,168.29919 371.27472,165.60109 L 372.45951,161.4214 L 373.80772,165.16735 C 376.504,167.86543 382.79594,166.84613 385.49222,169.5442 C 376.63298,168.33878 380.942,175.01841 381.1616,181.80724 C 381.38122,188.59605 408.08787,185.20779 414.13149,174.19705 C 419.04396,161.39484 396.81039,163.03235 391.49788,166.27142 C 396.46467,159.40961 392.72042,155.11025 392.80524,153.10147 C 392.97652,156.78133 397.56249,160.66932 410.49541,164.02385 C 418.15845,163.27065 415.60227,157.78697 415.60227,153.69293 C 415.60227,137.3167 404.7569,120.97015 393.90832,114.41966 C 389.93899,112.02292 380.86621,106.43785 376.29987,107.00663 z " id="path1206" sodipodi:nodetypes="cccccccccccccccccccccccc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt" d="M 377.8128,127.70028 C 383.62742,125.4685 383.5892,125.25698 381.92449,127.30082 C 380.46406,129.34466 379.12738,125.53652 377.79734,137.30038 C 376.26303,149.45853 371.79392,130.12921 377.8128,127.70028 z " id="path1207" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt" d="M 367.74332,127.91158 C 361.92871,125.67979 361.96693,125.46828 363.63164,127.51212 C 365.09207,129.55596 366.42875,125.74782 367.75879,137.51167 C 369.2931,149.66984 373.76221,130.34052 367.74332,127.91158 z " id="path1209" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#00ff00;stroke-width:8.125;stroke-linecap:round;stroke-linejoin:bevel;stroke-dasharray:none;stroke-dashoffset:12.5" d="M 412.42043,191.6321 L 336.35302,117.64904" id="path1210" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ff0000;stroke-width:5;stroke-dasharray:none;stroke-opacity:1" d="M 591.68327,168.2703 C 591.68327,182.4153 580.20327,193.8953 566.05827,193.8953 C 551.91327,193.8953 540.43327,182.4153 540.43327,168.2703 C 540.43327,154.1253 551.91327,142.6453 566.05827,142.6453 C 580.20327,142.6453 591.68327,154.1253 591.68327,168.2703 z " id="path1291" /> <g id="g1298" transform="translate(402.30827,-332.21688)"> <path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 176.78473,427.8954 C 171.00127,436.31459 166.76057,442.73066 161.93434,453.77797 C 157.10811,465.20752 151.77953,493.47595 155.5391,498.12102 C 159.29867,502.76608 164.78763,499.69833 168.54719,495.5836 C 172.30676,491.46887 170.40231,470.53213 171.58857,461.41874 C 172.46233,452.30535 174.80678,442.86614 176.78473,427.8954 z " id="path1294" sodipodi:nodetypes="czzzzc" /> <path style="fill:url(#linearGradient1139);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 162.79099,460.36798 C 161.39101,464.47106 159.75932,467.29332 158.59105,472.6772 C 157.42279,478.24737 155.75469,492.02393 156.66475,494.28769 C 157.57482,496.55145 158.90351,495.05639 159.81357,493.05108 C 160.72363,491.04578 160.26263,480.84231 160.54978,476.40092 C 160.76129,471.95952 162.3122,467.66394 162.79099,460.36798 z " id="path1295" sodipodi:nodetypes="czzzzc" /> <path style="font-size:12px;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke-width:1pt" d="M 164.76093,520.57895 C 151.14054,517.0018 150.18838,509.59815 153.69986,504.60539 C 155.02384,503.20637 158.13732,501.06251 159.94479,501.19243 C 161.75226,501.32236 163.31049,502.23808 165.63175,503.9005 C 170.89928,507.85036 160.96932,509.56589 164.76093,520.57895 z " id="path1296" sodipodi:nodetypes="ccszc" /> <path style="font-size:12px;fill:url(#linearGradient1175);fill-rule:evenodd;stroke-width:1pt" d="M 160.3104,515.97821 C 157.05245,515.15657 155.51819,515.31397 153.5053,510.38831 C 151.49241,505.77515 156.49689,504.25943 157.09117,503.63371 C 157.68545,503.00798 158.55309,503.42123 159.14737,503.97552 C 159.74165,504.5298 159.44061,507.35015 159.62812,508.57779 C 159.76624,509.80544 157.49775,511.93028 160.3104,515.97821 z " id="path1297" sodipodi:nodetypes="czzzzc" /> </g> <rect style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ff0000;stroke-width:4.56593418" id="rect1303" width="48.979599" height="47.110672" x="580.53296" y="122.93801" /> <rect style="font-size:12px;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt" id="rect1092" width="106.29922" height="106.29922" x="533.39587" y="-13.422614" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ff0000;stroke-width:5;stroke-linecap:round;stroke-dasharray:10, 10;stroke-dashoffset:0;stroke-opacity:1" d="M 539.64468,67.3328 C 543.73377,67.33772 550.81253,73.21863 551.91196,67.34757 C 553.01139,61.78901 560.6315,5.33969 564.99126,-3.51858 C 569.35102,-12.376848 566.16507,6.13694 579.58734,10.13546 C 593.32211,13.82148 597.36938,71.83083 605.47914,75.3766 C 613.5889,78.60987 615.13616,73.42533 619.49592,70.47257 C 623.85568,67.51982 626.02795,67.34757 630.38772,67.34757" id="path1280" sodipodi:nodetypes="czzzzzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#040600;stroke-width:3.75;stroke-linecap:butt;stroke-dasharray:3.75, 3.75;stroke-dashoffset:0;stroke-opacity:1" d="M 539.43674,67.53502 C 543.52583,67.53994 550.60459,70.92085 551.70402,65.04979 C 552.80345,59.49123 555.42356,24.91691 559.78332,16.05864 C 564.14308,7.20037 567.20713,-4.28584 580.3169,1.58768 C 593.11417,14.6487 606.22394,79.22055 609.3337,80.57882 C 611.50596,81.31209 614.92822,73.62755 619.28798,70.67479 C 623.64774,67.72204 625.82001,67.54979 630.17978,67.54979" id="path1281" sodipodi:nodetypes="czzzzzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#040600;stroke-width:3.75;stroke-linecap:butt;stroke-dasharray:3.75, 3.75;stroke-dashoffset:0;stroke-opacity:1" d="M 395.76647,77.589073 C 399.85556,77.593993 406.93432,80.974903 408.03375,75.103843 C 409.13318,69.545283 411.75329,34.970963 416.11305,26.112693 C 420.47281,17.254423 423.53686,5.7682122 436.64663,11.641733 C 449.4439,24.702753 462.55367,89.274602 465.66343,90.632872 C 467.83569,91.366142 471.25795,83.681603 475.61771,80.728843 C 479.97747,77.776093 482.14974,77.603843 486.50951,77.603843" id="path1282" sodipodi:nodetypes="czzzzzz" /> <g id="g1163" transform="matrix(1.152996,0,0,1,-83.837104,-109.09188)"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.07708836;stroke-dasharray:none" d="M 472.42571,238.27147 C 472.33405,238.27145 472.24478,238.29291 472.15311,238.29398 L 472.15311,238.31648 C 472.08489,238.31034 472.01758,238.29395 471.94867,238.29398 C 471.78809,238.29403 471.63216,238.33557 471.47163,238.33899 L 471.47163,238.42899 C 471.37376,238.41606 471.27556,238.40652 471.17632,238.40649 C 471.1074,238.40647 471.0401,238.42285 470.97187,238.42899 L 470.97187,238.40649 C 470.88021,238.40543 470.79094,238.38396 470.69928,238.38399 C 465.87162,238.38545 461.03877,239.90805 457.81913,242.92943 C 456.20932,244.44011 446.99543,256.8992 450.09559,259.04098 C 457.81097,264.68512 464.49982,248.07035 457.3648,261.85375 C 456.64585,266.58811 456.46107,269.05668 456.41072,270.29207 C 456.30905,268.02898 455.46815,262.72102 451.04967,260.14359 C 447.35854,258.03472 444.93899,276.66261 444.93899,279.18042 C 444.93899,289.25168 451.37986,299.31925 457.81913,303.34776 C 461.08484,305.39084 466.00722,306.3715 470.90372,306.34054 L 470.90372,306.36305 C 471.15408,306.3651 471.40305,306.34374 471.65336,306.34054 L 471.65336,306.22803 C 471.84267,306.23528 472.03155,306.25211 472.22127,306.25053 L 472.22127,306.22803 C 477.11777,306.25899 482.04015,305.27835 485.30586,303.23524 C 491.74513,299.20674 498.186,289.13916 498.186,279.06791 C 498.186,276.5501 495.76645,257.9222 492.07532,260.03107 C 487.65684,262.60851 486.81594,267.91647 486.71427,270.17956 C 486.66392,268.94417 486.47914,266.47559 485.76018,261.74124 C 478.62517,247.95784 485.31402,264.5726 493.0294,258.92847 C 496.12956,256.78669 486.91567,244.32759 485.30586,242.81691 C 482.08622,239.79554 477.25337,238.27293 472.42571,238.27147 z " id="path1211" transform="matrix(0.896078,0,0,0.909383,46.81814,19.67645)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.7041852pt" d="M 468.24591,259.15861 C 468.51094,258.62567 467.79271,252.85171 466.69475,251.35949 C 465.59679,249.86726 463.96768,250.52503 463.70265,251.05797 C 463.43764,251.5909 465.07594,250.88137 466.17389,252.37359 C 467.27185,253.86581 467.9809,259.69155 468.24591,259.15861 z " id="path1212" sodipodi:nodetypes="czzzz" transform="matrix(0.896078,0,0,0.909383,46.81814,19.67645)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt" d="M 463.34275,289.21648 C 461.03017,288.99344 460.56786,283.64967 458.96224,286.90958 C 457.28286,290.22776 460.74374,297.34319 461.0482,293.66548 C 461.2789,289.98777 465.58157,289.49777 463.34275,289.21648 z " id="path1213" sodipodi:nodetypes="czzz" transform="matrix(0.896078,0,0,0.909383,46.81814,19.67645)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.7041852pt" d="M 474.87908,259.04805 C 474.61405,258.51511 475.33228,252.74115 476.43024,251.24893 C 477.52819,249.7567 479.15731,250.41447 479.42234,250.9474 C 479.68735,251.48035 478.04905,250.77081 476.9511,252.26303 C 475.85314,253.75526 475.14409,259.58099 474.87908,259.04805 z " id="path1214" sodipodi:nodetypes="czzzz" transform="matrix(0.896078,0,0,0.909383,46.81814,19.67645)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt" d="M 479.78224,289.10592 C 482.09482,288.88288 482.55713,283.53911 484.16275,286.79902 C 485.84213,290.1172 482.38125,297.23264 482.07679,293.55492 C 481.84609,289.87721 477.54342,289.38721 479.78224,289.10592 z " id="path1215" sodipodi:nodetypes="czzz" transform="matrix(0.896078,0,0,0.909383,46.81814,19.67645)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt" d="M 479.78224,289.10592 C 482.09482,288.88288 482.55713,283.53911 484.16275,286.79902 C 485.84213,290.1172 482.38125,297.23264 482.07679,293.55492 C 481.84609,289.87721 477.54342,289.38721 479.78224,289.10592 z " id="path1245" sodipodi:nodetypes="czzz" transform="matrix(0.896078,0,0,0.909383,71.19322,13.47142)" /> <path transform="matrix(0.820025,0,0,0.858963,104.9588,28.9685)" style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.07708836" d="M 472.42572,238.27147 C 466.99935,238.3446 460.99557,239.27928 457.242,243.6056 C 454.27786,247.05912 447.543,265.39403 446.588,268.07554 C 444.99506,275.03305 443.89364,282.61304 446.9967,289.34223 C 449.98685,297.12243 456.23622,304.66231 464.92263,305.85892 C 470.66585,306.6581 476.71462,306.56039 482.24009,304.66227 C 488.70615,302.32029 492.95294,296.28794 495.73557,290.27853 C 498.36218,284.49691 498.76947,277.90311 497.25994,271.76637 C 496.6036,267.85969 495.93735,263.78918 493.70802,260.42078 C 490.47721,259.07927 488.59909,263.53006 487.49637,265.86353 C 487.00972,267.33824 486.63024,271.50536 486.49583,267.70454 C 486.56751,263.78501 485.27565,260.09141 483.12367,256.86 C 483.47775,256.38368 486.42646,260.44859 488.46678,259.99317 C 492.66404,261.2943 494.92727,256.76681 492.55453,253.62131 C 490.80672,249.9676 488.38631,246.652 485.92858,243.45619 C 482.48414,239.81958 477.32986,238.26882 472.42572,238.27147 z " id="path1151" sodipodi:nodetypes="cccccccccccccccc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.7041852pt" d="M 469.29214,259.15861 C 471.28335,258.62567 470.01209,252.60872 468.91413,251.1165 C 467.81617,249.62427 460.51529,248.09514 463.70265,251.05797 C 467.13661,253.77781 467.05433,259.69155 469.29214,259.15861 z " id="path1242" sodipodi:nodetypes="czzz" transform="matrix(0.820025,0,0,0.858963,104.9588,28.9685)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt" d="M 466.83017,280.96913 C 464.51759,280.74609 460.56786,283.64967 458.96224,286.90958 C 457.28286,290.22776 460.74374,297.34319 461.0482,293.66548 C 461.2789,289.98777 469.06899,281.25042 466.83017,280.96913 z " id="path1243" sodipodi:nodetypes="czzz" transform="matrix(0.820025,0,0,0.858963,104.9588,28.9685)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59100037pt" d="M 493.43163,251.60533 C 491.79878,251.14755 492.84125,245.97921 493.74161,244.69745 C 494.64196,243.41568 500.62886,242.10222 498.01515,244.64717 C 495.19921,246.98342 495.26668,252.0631 493.43163,251.60533 z " id="path1152" sodipodi:nodetypes="czzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.52140689" d="M 511.80663,239.60773 C 505.82577,239.32916 500.11547,244.27305 498.49491,246.98563 C 497.16791,249.22473 493.46139,261.39466 492.85327,264.1486 C 492.10462,268.10699 491.68917,272.2685 492.99906,276.15741 C 494.65527,281.44574 497.8549,286.62328 502.77269,289.10403 C 505.89347,290.48383 509.46589,290.71532 512.64653,290.47013 C 516.82711,290.39011 521.1916,289.06289 524.01723,285.6621 C 528.59029,280.58529 531.28514,273.27869 529.87427,266.31128 C 529.26796,262.87343 525.92547,250.57752 524.78129,248.36436 C 522.92298,245.30255 517.65774,239.61035 511.80663,239.60773 z " id="path1149" sodipodi:nodetypes="cccccccccc" /> </g> <path style="fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="path1142" d="M 138.66767,389.39149 C 138.44176,383.72226 145.56665,387.55955 145.98842,387.81204 C 148.96509,389.52446 154.57645,395.05092 158.13596,394.96803 C 160.13885,394.75388 161.81717,393.54252 163.24286,392.19084 C 164.52303,390.90588 165.39009,389.48939 166.24724,387.90878 C 167.62765,385.61133 171.36675,378.90196 173.96259,379.02192 C 176.3473,379.252 180.6262,381.76723 182.82201,382.68319 C 184.52628,383.3966 187.66318,382.74725 189.39484,383.39336 C 190.69907,383.85026 187.07224,389.98343 188.44387,390.1658 C 189.58344,390.2587 190.28074,389.76906 191.11843,389.02388 C 191.75718,388.42263 195.70074,391.22127 194.88417,391.98976 C 192.75044,393.88937 190.46141,394.76495 187.5927,394.46701 C 185.76743,394.20765 183.97718,393.74035 182.24558,393.1098 C 180.4623,392.42436 178.76716,391.54829 177.00797,390.80685 C 175.46375,390.16429 173.85066,389.50279 172.17678,389.30273 C 171.55021,389.26725 171.32777,389.20991 170.97538,389.74989 C 169.85645,391.71173 168.68703,393.47761 167.0634,395.07079 C 164.5015,397.41937 161.60412,399.05395 158.07518,399.24036 C 153.41627,399.11799 146.22829,400.87294 140.4353,391.66204 C 140.15115,391.46374 144.14072,386.65256 144.03158,389.39149 L 138.66767,389.39149 z " sodipodi:nodetypes="ccccccccccccccccccccc" /> <rect style="fill:#f9bac0;fill-rule:evenodd;stroke:#000000;stroke-width:0.59608836pt" id="rect1120" width="14.67272" height="14.527117" x="-220.29938" y="355.46417" ry="4.7484632" transform="matrix(0.6694625,-0.7428458,0.7836175,0.6212436,0,0)" /> <rect style="fill:url(#linearGradient3202);fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.20409851pt" id="rect1117" width="63.894375" height="13.612261" x="-209.20451" y="355.92163" transform="matrix(0.6694625,-0.7428458,0.7836175,0.6212436,0,0)" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.12771654" d="M 144.38317,376.51805 L 183.13574,333.04569 L 183.13574,333.04569" id="path1126" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.12771654" d="M 148.72431,379.95966 L 187.47688,336.4873 L 187.47688,336.4873" id="path1128" /> <path style="fill:#e49415;fill-opacity:1;fill-rule:evenodd;stroke-width:1pt" d="M 181.54997,328.19842 L 204.7151,313.05607 L 193.41872,337.20894 L 181.54997,328.19842 z " id="path1129" /> <path style="fill:#040023;fill-rule:evenodd;stroke-width:1pt" d="M 196.57455,318.36983 L 205.12859,312.58608 L 200.74625,321.52752 L 196.57455,318.36983 z " id="path1132" /> <g id="g1195" transform="matrix(0.789807,0,0,0.829148,24.785486,35.13232)"> <path sodipodi:type="arc" style="font-size:12px;fill:url(#radialGradient1169);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87644994;stroke-dasharray:none" id="path1190" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" transform="matrix(1.269231,0,0,1.209574,-184.6799,-194.3941)" /> <path style="font-size:12px;fill:url(#linearGradient683);fill-opacity:0.38016998;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 159.72524,722.93003 C 140.50054,722.93003 124.04616,733.91302 116.57139,749.57844 C 122.48956,752.61039 129.09474,755.48259 136.87909,753.39616 C 151.49622,750.20385 156.06571,742.67836 163.37427,739.48607 C 178.69415,738.91352 186.03123,746.78366 201.1339,746.44112 C 193.03644,732.49107 177.62722,722.93004 159.72524,722.93003 z " id="path1191" /> <text xml:space="preserve" style="font-size:48px;font-style:normal;font-weight:bold;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Palatino Linotype" x="47.569454" y="419.89508" id="text1192" sodipodi:linespacing="100%" transform="scale(2.880225,1.909157)"><tspan x="47.569454" y="419.89508" sodipodi:role="line" id="tspan1193">i</tspan></text> </g> <path style="fill:#fb4100;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 142.10016,698.71774 C 150.32082,682.69183 164.47101,695.16173 174.84786,695.87292 C 183.87705,695.51733 184.82039,676.31489 201.93545,679.5153 C 209.88655,681.41184 207.73624,717.9912 196.27536,724.67657 C 180.23767,733.67611 133.87948,714.38803 142.10016,698.71774 z " id="path1179" sodipodi:nodetypes="cccsz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 119.90595,252.88899 C 118.85992,255.24256 123.55617,255.51496 127.86561,257.22021 C 132.17504,258.92546 136.62069,262.58658 139.25756,263.34931 C 144.53131,264.87477 154.03276,265.3542 157.82463,264.39534 C 161.6165,263.43648 161.31141,260.47272 162.00876,256.55011" id="path1135" sodipodi:nodetypes="cszzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 147.62582,248.18188 C 142.39566,241.38267 152.07145,242.16719 152.59448,237.98306 C 155.20955,227.78425 145.27225,226.2152 145.27225,226.2152 C 145.27225,226.2152 151.28694,218.63146 152.85598,214.44733 C 147.62582,208.69415 148.14883,209.47868 140.04208,213.13979" id="path1138" sodipodi:nodetypes="ccccc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 153.379,273.80964 C 153.98918,266.2259 148.58467,265.57213 146.31827,264.39534" id="path1141" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 119.7752,257.53887 C 122.9133,264.8611 134.37607,267.25825 139.64982,268.78371" id="path1153" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 176.68832,247.791 C 181.91848,240.99179 172.24269,241.77631 171.71966,237.59218 C 169.10459,227.39337 179.04189,225.82432 179.04189,225.82432 C 179.04189,225.82432 173.0272,218.24058 171.45816,214.05645 C 176.68832,208.30327 176.16531,209.0878 184.27206,212.74891" id="path1167" sodipodi:nodetypes="ccccc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 170.93514,273.41876 C 170.32496,265.83502 175.72947,265.18125 177.99587,264.00446" id="path1169" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 204.53894,257.14799 C 201.40084,264.47022 189.93807,266.86737 184.66432,268.39283" id="path1170" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 204.396,252.4136 C 205.44203,254.76717 200.74578,255.03957 196.43634,256.74482 C 192.12691,258.45007 187.68126,262.11119 185.04439,262.87392 C 179.77064,264.39938 170.26919,264.87881 166.47732,263.91995 C 162.68545,262.96109 161.683,257.64376 162.03168,253.19813" id="path1194" sodipodi:nodetypes="cszzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 125.13612,240.59811 C 117.46522,261.6931 126.09498,252.62748 130.8893,252.88899" id="path1195" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 198.66259,240.1321 C 206.33349,261.22709 197.70373,252.16147 192.90941,252.42298" id="path1218" sodipodi:nodetypes="cz" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 169.39735,105.71938 C 162.10505,105.75558 154.07994,107.25613 149.24239,113.24002 C 145.68525,117.38626 143.13108,122.29128 140.39162,126.96404 C 138.4291,131.48683 134.21524,152.7264 134.04914,160.14626 C 134.89311,172.12407 141.3859,183.93155 151.73427,190.22339 C 159.97252,194.26858 169.64282,193.9197 178.45471,192.35355 C 186.19946,190.80763 192.37151,185.22838 196.32348,178.59838 C 201.86706,170.07793 204.00788,159.36075 201.49479,149.44773 C 200.50965,144.115 196.66803,125.58494 193.27772,121.84145 C 189.6424,115.2255 184.68602,108.33309 176.82299,106.68486 C 174.40559,106.03251 171.89981,105.72324 169.39735,105.71938 z " id="path1223" sodipodi:nodetypes="ccccccccccc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 164.88535,105.92145 C 165.93138,106.53164 168.00101,104.58409 168.39327,118.66194 C 168.78553,132.73979 168.73939,187.94781 169.08806,190.38856 C 169.43673,192.5678 166.75821,193.42635 163.74413,193.18855" id="path1220" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 172.17264,105.89284 C 171.12661,106.50303 169.05698,104.55548 168.66472,118.63333 C 168.27246,132.71118 169.24317,188.28903 168.8945,190.72978 C 168.54583,192.90902 171.40927,193.21282 174.42334,192.97503" id="path1221" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 182.45745,145.55465 C 174.5953,135.38048 175.44975,132.40301 183.70286,126.16129 C 178.0131,123.47057 177.93926,120.59539 187.92533,114.2885" id="path1224" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-dasharray:none" d="M 152.6509,146.5756 C 160.51305,136.40143 159.6586,133.42396 151.40549,127.18224 C 157.09525,124.49152 157.16909,121.61634 147.18302,115.30945" id="path1227" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 164.47454,148.50937 C 161.26937,152.76239 154.15017,147.49234 152.64004,146.47531 C 151.12991,145.45828 148.94176,150.3585 144.50382,148.87919 C 140.2508,147.39988 140.80553,143.14686 140.80553,143.14686" id="path1228" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 162.60184,160.69108 C 158.4721,162.3553 152.39349,155.64311 150.88336,154.62608 C 149.37323,153.60905 147.18508,158.50927 142.74714,157.02996 C 138.49412,155.55065 136.27514,144.64072 136.27514,144.64072" id="path1229" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 156.98552,187.53536 C 147.30836,175.51594 156.27668,178.93685 156.6157,172.92714 C 157.32454,167.28726 162.79607,166.31561 158.73065,167.13701 C 155.71761,167.77479 152.82496,163.12668 144.04154,167.00988" id="path1230" sodipodi:nodetypes="czsz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 172.05604,147.11525 C 175.26121,151.36827 182.38041,146.09822 183.89054,145.08119 C 185.40067,144.06416 187.58882,148.96438 192.02676,147.48507 C 196.27978,146.00576 195.72505,141.75274 195.72505,141.75274" id="path1232" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 172.35969,159.29696 C 176.48943,160.96118 184.13709,154.24899 185.64722,153.23196 C 187.15735,152.21493 189.3455,157.11515 193.78344,155.63584 C 198.03646,154.15653 200.25544,143.2466 200.25544,143.2466" id="path1233" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.70000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 181.11411,185.61822 C 190.79127,173.5988 181.82295,177.01971 181.48393,171.01 C 180.77509,165.37012 175.30356,164.39847 179.36898,165.21987 C 182.38202,165.85765 185.27467,161.20954 194.05809,165.09274" id="path1234" sodipodi:nodetypes="czsz" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt" id="rect1300" width="25.381052" height="18.778831" x="735.11206" y="593.82367" transform="matrix(0.932103,-0.3621934,0,1,0,0)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.09033966" d="M 689.65698,333.99075 C 695.28457,332.30474 704.43001,331.66408 706.81101,333.58867 C 709.192,335.77477 710.05808,334.51818 711.36562,337.39476 C 712.41166,340.27135 712.87988,341.44154 706.19712,344.78942 C 699.51435,347.76175 686.53346,348.8268 679.84155,346.0804 C 673.14965,343.85702 670.26758,344.06785 671.32275,336.82552 C 672.37792,329.31762 680.46301,317.21969 693.30095,311.8556 C 706.13889,306.11596 717.7458,306.04991 722.49408,313.28086 C 726.89063,320.64848 725.15011,325.95275 722.51218,329.23114 C 719.87425,332.50954 715.56943,333.37544 710.87978,336.32441" id="path1301" sodipodi:nodetypes="czzzzzzzzz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.09033966" d="M 704.43849,338.33715 C 700.2178,338.47498 692.4445,341.2504 688.57553,338.9982" id="path1302" sodipodi:nodetypes="cc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.09033966" d="M 693.74307,313.26495 C 697.23289,316.97836 700.64449,321.5205 699.40096,328.1116" id="path1303" sodipodi:nodetypes="cc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.09033966" d="M 703.2256,314.35433 C 711.43741,311.01724 713.69359,309.92471 714.87093,316.06706 C 718.10858,312.92332 719.79507,313.32552 720.49852,320.56336" id="path1304" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.09033966" d="M 709.2507,322.68851 C 709.2507,322.68851 704.03885,336.07162 709.31471,333.64598 C 714.59058,331.22034 712.53325,332.05037 714.02549,330.80662" id="path1305" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.09033966" d="M 678.5933,333.95697 C 678.5933,333.95697 683.32306,329.08006 687.81234,324.66426 C 692.30161,320.56274 690.8673,320.72329 690.99165,317.35547 L 693.36057,321.66539 C 695.24931,325.10168 697.04798,323.54365 695.37449,328.22267" id="path1306" sodipodi:nodetypes="czczz" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.09033966" d="M 698.61226,311.89707 C 706.02105,315.62151 701.51674,325.08519 704.80114,330.72165" id="path1307" sodipodi:nodetypes="cc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.09033966" d="M 691.91037,309.38975 C 687.68968,305.60495 686.45407,308.11887 683.63114,308.48175" id="path1387" sodipodi:nodetypes="cc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.09033966" d="M 709.30063,304.39086 C 703.5109,303.74416 699.92171,305.99657 697.09878,306.35945" id="path1389" sodipodi:nodetypes="cc" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.09033966" d="M 683.67285,312.00497 C 679.97518,311.86715 672.72488,318.24451 670.42497,326.51139" id="path1390" sodipodi:nodetypes="cc" /> <path style="font-size:12px;fill:url(#linearGradient3132);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 266.43856,630.60816 C 247.21386,630.60816 230.75948,641.59115 223.28471,657.25657 C 229.20288,660.28852 235.80806,663.16072 243.59241,661.07429 C 258.20954,657.88198 262.77903,650.35649 270.08759,647.1642 C 285.40747,646.59165 292.74455,654.46179 307.84722,654.11925 C 299.74976,640.1692 284.34054,630.60817 266.43856,630.60816 z " id="path1561" /> <path sodipodi:type="arc" style="font-size:12px;fill:url(#radialGradient3064);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" id="path1562" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" transform="matrix(1.269231,0,0,1.209574,-76.235414,-285.91008)" /> <path sodipodi:type="arc" style="font-size:12px;fill:url(#radialGradient983);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" id="path1574" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" transform="matrix(0.484769,0,0,0.461984,538.38387,214.33362)" /> <rect style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.375" id="rect1280" width="69.96357" height="45.246185" x="112.90554" y="426.39694" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt" id="rect1278" width="24.317806" height="18.077705" x="-157.74673" y="441.57275" transform="scale(-1,1)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.375" d="M 154.66415,447.62583 C 148.87955,448.10788 143.81803,450.2771 140.56419,455.21812 C 137.31035,460.52067 137.67189,461.00272 137.67189,461.00272 C 137.67189,461.00272 136.94882,466.06424 143.81803,466.78732 C 150.68724,467.14886 158.38542,460.08603 166.33925,460.08603 C 173.93154,460.08603 176.71794,458.90305 175.63333,452.32582 C 174.54872,445.49295 166.77566,430.63357 153.57954,430.27203 C 140.38342,429.54896 128.45269,433.82715 123.57193,442.56431 C 119.05271,451.30146 121.22194,458.11042 123.93347,460.27964 C 126.645,462.44887 132.85139,459.55657 137.67189,460.64118" id="path1279" sodipodi:nodetypes="czzzzzzzzz" /> <rect transform="scale(-1,1)" y="467.71524" x="-201.17461" height="45.246185" width="69.96357" id="rect1289" style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.375;stroke-dasharray:none" /> <rect y="482.89105" x="156.3334" height="18.077705" width="24.317806" id="rect1291" style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt" /> <path sodipodi:nodetypes="czzzzzzzzz" id="path1292" d="M 159.41599,488.9441 C 165.20059,489.42615 170.26212,491.59537 173.51595,496.53639 C 176.76979,501.83894 176.40825,502.32099 176.40825,502.32099 C 176.40825,502.32099 177.13133,507.38251 170.26212,508.10559 C 163.3929,508.46713 155.69472,501.4043 147.7409,501.4043 C 140.14861,501.4043 137.3622,500.22132 138.44682,493.64409 C 139.53143,486.81122 147.30448,471.95184 160.5006,471.5903 C 173.69672,470.86723 185.62746,475.14542 190.50822,483.88258 C 195.02743,492.61973 192.85821,499.42869 190.14668,501.59791 C 187.43515,503.76714 181.22875,500.87484 176.40825,501.95945" style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.375;stroke-dasharray:none" /> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.375" id="rect1268" width="69.96357" height="45.246185" x="-109.90839" y="566.82684" transform="scale(-1,1)" /> <path sodipodi:type="arc" style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="path1285" sodipodi:cx="88.389725" sodipodi:cy="698.28027" sodipodi:rx="18.305565" sodipodi:ry="18.305565" d="M 106.69529 698.28027 A 18.305565 18.305565 0 1 1 70.08416,698.28027 A 18.305565 18.305565 0 1 1 106.69529 698.28027 z" transform="translate(-12.678637,-108.04585)" /> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.375" id="rect1290" width="69.96357" height="45.246185" x="-104.63519" y="442.85843" transform="scale(-1,1)" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ff0000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 35.856494,468.67158 L 104.22415,468.67158" id="path1299" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ff0000;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="M 72.42524,442.43748 L 71.630267,487.35343" id="path1300" sodipodi:nodetypes="cc" /> <rect style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.375" id="rect1301" width="69.96357" height="45.246185" x="-104.44199" y="443.04013" transform="scale(-1,1)" /> <rect style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="rect1302" width="8.9940901" height="9.2751551" x="67.378593" y="464.05392" /> <path style="font-size:12px;fill:url(#linearGradient3113);fill-opacity:0.70196001;stroke:#1c66f9;stroke-width:1.92428339;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.98999999" d="M 22.103543,213.06151 C 22.515516,211.86104 23.951291,210.66009 25.18228,210.84189 L 62.352593,218.87368 C 65.23151,216.34699 69.445869,213.27109 73.789889,214.04114 L 80.105558,214.91754 L 88.086596,216.48472 C 92.745746,217.88758 96.427736,220.80133 96.813826,226.5996 L 96.764886,296.45412 L 21.810414,272.56067 L 22.103543,213.06151 z " id="path1266" sodipodi:nodetypes="cccccccccc" /> <path style="font-size:12px;fill:#4789f7;stroke:#1c4ed9;stroke-width:1.71254337;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216003" d="M 21.711614,272.26009 L 96.931496,296.4901 L 94.170566,301.54347 L 19.410269,275.82836 L 21.711614,272.26009 z " id="path1271" sodipodi:nodetypes="ccccc" /> <g id="g1279" transform="matrix(0.68875,0,0,0.640474,28.305576,94.94412)"> <path style="fill-rule:evenodd;stroke:none;stroke-width:0.91963024pt" d="M 15.411826,279.67519 L 107.16635,280.32772 L 105.78092,271.91017 C 104.50888,267.9258 100.16017,263.55105 99.313146,259.07319 C 98.024176,254.59533 104.23642,257.47279 103.48688,250.11822 C 102.73733,242.76364 101.33093,223.23927 90.699786,212.93098 C 79.756146,202.93519 70.616996,196.51871 51.220346,199.6699 C 33.073696,201.57109 22.663616,210.23449 15.263856,225.51906 C 7.6727159,240.80363 16.076616,259.82218 15.837966,266.94924 L 15.411826,279.67519 z " id="path1273" sodipodi:nodetypes="ccczzzzzzc" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.0507082pt" d="M 81.667436,238.6616 C 80.982416,243.3358 68.662856,240.88582 68.468226,248.58013 C 68.273596,255.77527 84.079546,257.18713 89.984786,255.06933 C 95.890036,252.95153 99.758996,249.65718 99.148096,242.36255 C 98.537216,235.06792 96.575586,216.71313 75.014876,206.18816 C 53.886116,196.16236 29.955336,209.82744 22.306536,224.42792 C 14.657726,239.5276 14.049476,254.81975 23.120686,249.32889 C 31.759936,244.33718 42.301146,228.60033 58.113846,226.78187 C 73.494556,224.9634 82.352426,234.98574 81.667436,238.6616 z " id="path1274" sodipodi:nodetypes="czzzzzzzz" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.08777227pt" d="M 46.065436,250.14579 C 44.767756,248.03998 45.172386,240.05319 38.251386,241.60591 C 31.330386,243.15862 23.814016,250.5771 21.730276,253.25121 C 19.646536,255.92534 20.762826,260.66971 21.730276,261.79111 C 22.697736,262.91251 28.204756,263.51633 29.767576,264.89651 C 31.330386,266.2767 34.976936,271.4524 36.911836,271.10736 C 38.846746,270.76231 42.790986,266.62175 42.939816,264.89653 C 43.088656,263.17129 47.363086,252.25163 46.065436,250.14579 z " id="path1275" sodipodi:nodetypes="czzzzzzz" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.0507082pt" d="M 42.237126,279.80001 C 42.658006,275.59866 47.388376,258.9441 48.153616,253.9108 C 48.918846,248.87751 46.010966,251.41496 47.235346,249.16869 C 48.459706,246.92241 52.591946,241.63956 55.499816,240.43322 C 58.407706,239.2269 62.539946,239.92518 64.682586,241.04832 C 66.825226,242.17146 68.164386,245.92409 68.355686,247.172 C 68.546986,248.41993 66.863496,249.83425 65.830426,249.41828 C 64.797366,249.0023 66.447386,242.49537 63.942946,244.49969 C 61.438506,246.68048 58.281376,250.37501 56.647666,251.91412 C 55.338616,253.45321 58.560756,252.66288 59.172936,253.9108 C 59.785116,255.15873 60.932956,257.2386 60.320776,259.40167 C 59.708576,261.56473 57.068536,265.51649 55.499816,266.8892 C 53.931086,268.26192 52.553686,265.59969 50.908446,267.63797 C 49.263196,269.67624 47.037236,278.02692 45.659806,279.98199 L 42.237126,279.80001 z " id="path1276" sodipodi:nodetypes="czzzzzzzzzzzzcc" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-dasharray:none" d="M 41.081076,235.46675 C 41.510266,237.13987 42.851486,241.07668 43.817166,241.96244 C 44.782846,242.84822 46.848346,243.11067 47.197056,241.96244 C 47.545776,240.81421 45.212056,235.04026 51.059786,231.92364 C 57.068466,228.80702 66.457036,229.52876 69.407726,230.93945 C 72.358406,232.35012 77.320946,237.59917 72.626666,241.17509 C 68.737106,244.75098 78.179316,244.84941 80.191156,243.34031 C 82.202996,241.83121 85.125536,236.24432 82.523566,233.55418 C 79.921596,230.86405 73.325156,224.43697 67.209176,223.78085 C 61.093206,223.12471 46.472786,230.41454 44.460956,230.93945 C 42.288186,231.46435 40.651886,233.79361 41.081076,235.46675 z " id="path1277" sodipodi:nodetypes="czzzzzzzzzz" /> </g> <path style="font-size:12px;fill:url(#linearGradient3103);fill-opacity:0.69930001;stroke:#1c66fb;stroke-width:1.77588487;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216003" d="M 1.719906,228.8008 C 0.707007,226.11358 1.699602,223.54982 4.115707,223.82273 L 39.85944,231.42887 L 42.064202,239.17285 L 57.663221,242.80011 L 55.387499,234.64685 L 71.471519,237.40138 C 73.597665,238.09302 75.249092,239.52448 76.756518,242.80613 L 93.655366,300.89052 L 19.294782,275.68669 L 1.719906,228.8008 z " id="path1272" sodipodi:nodetypes="ccccccccccc" /> <g id="g1317" transform="translate(-15.816734,-109.09188)"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.07708836" d="M 472.42571,238.27147 C 472.33405,238.27145 472.24478,238.29291 472.15311,238.29398 L 472.15311,238.31648 C 472.08489,238.31034 472.01758,238.29395 471.94867,238.29398 C 471.78809,238.29403 471.63216,238.33557 471.47163,238.33899 L 471.47163,238.42899 C 471.37376,238.41606 471.27556,238.40652 471.17632,238.40649 C 471.1074,238.40647 471.0401,238.42285 470.97187,238.42899 L 470.97187,238.40649 C 470.88021,238.40543 470.79094,238.38396 470.69928,238.38399 C 465.87162,238.38545 461.03877,239.90805 457.81913,242.92943 C 456.20932,244.44011 446.99543,256.8992 450.09559,259.04098 C 457.81097,264.68512 464.49982,248.07035 457.3648,261.85375 C 456.64585,266.58811 456.46107,269.05668 456.41072,270.29207 C 456.30905,268.02898 455.46815,262.72102 451.04967,260.14359 C 447.35854,258.03472 444.93899,276.66261 444.93899,279.18042 C 444.93899,289.25168 451.37986,299.31925 457.81913,303.34776 C 461.08484,305.39084 466.00722,306.3715 470.90372,306.34054 L 470.90372,306.36305 C 471.15408,306.3651 471.40305,306.34374 471.65336,306.34054 L 471.65336,306.22803 C 471.84267,306.23528 472.03155,306.25211 472.22127,306.25053 L 472.22127,306.22803 C 477.11777,306.25899 482.04015,305.27835 485.30586,303.23524 C 491.74513,299.20674 498.186,289.13916 498.186,279.06791 C 498.186,276.5501 495.76645,257.9222 492.07532,260.03107 C 487.65684,262.60851 486.81594,267.91647 486.71427,270.17956 C 486.66392,268.94417 486.47914,266.47559 485.76018,261.74124 C 478.62517,247.95784 485.31402,264.5726 493.0294,258.92847 C 496.12956,256.78669 486.91567,244.32759 485.30586,242.81691 C 482.08622,239.79554 477.25337,238.27293 472.42571,238.27147 z " id="path1267" transform="matrix(1.033174,0,0,0.909383,216.4479,268.3863)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.7041852pt" d="M 468.24591,259.15861 C 468.51094,258.62567 467.79271,252.85171 466.69475,251.35949 C 465.59679,249.86726 463.96768,250.52503 463.70265,251.05797 C 463.43764,251.5909 465.07594,250.88137 466.17389,252.37359 C 467.27185,253.86581 467.9809,259.69155 468.24591,259.15861 z " id="path1270" sodipodi:nodetypes="czzzz" transform="matrix(1.033174,0,0,0.909383,216.4479,268.3863)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt" d="M 463.34275,289.21648 C 461.03017,288.99344 460.56786,283.64967 458.96224,286.90958 C 457.28286,290.22776 460.74374,297.34319 461.0482,293.66548 C 461.2789,289.98777 465.58157,289.49777 463.34275,289.21648 z " id="path1278" sodipodi:nodetypes="czzz" transform="matrix(1.033174,0,0,0.909383,216.4479,268.3863)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.68256974pt" d="M 708.64967,503.43717 C 708.37585,502.95253 709.11791,497.70179 710.25229,496.34479 C 711.38666,494.98778 713.06983,495.58594 713.34365,496.07058 C 713.61745,496.55524 711.9248,495.90999 710.79043,497.26699 C 709.65604,498.624 708.92347,503.92182 708.64967,503.43717 z " id="path1283" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.57505898pt" d="M 710.57739,531.81732 C 712.96669,531.61449 713.44433,526.75496 715.10322,529.71946 C 716.83831,532.73696 713.26262,539.20762 712.94806,535.86317 C 712.7097,532.51872 708.2643,532.07312 710.57739,531.81732 z " id="path1284" sodipodi:nodetypes="czzz" /> </g> <g id="g1329" transform="translate(-119.89693,-206.8959)"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.87184441" d="M 841.03523,592.70109 C 835.90467,592.7639 830.22818,593.56676 826.67923,597.28291 C 823.87668,600.24935 817.50896,615.99836 816.60602,618.30168 C 815.09992,624.27793 814.05854,630.78886 816.99244,636.56898 C 819.81959,643.25189 825.72828,649.72836 833.94116,650.75621 C 839.37129,651.44267 845.09032,651.35874 850.31458,649.72833 C 856.42815,647.71665 860.44343,642.53509 863.07436,637.37323 C 865.55779,632.40703 865.94287,626.7432 864.51563,621.47197 C 863.89507,618.11627 856.12574,599.89965 853.80199,597.15457 C 850.54532,594.03086 845.67202,592.69881 841.03523,592.70109 z " id="path1288" sodipodi:nodetypes="cccccccccc" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.63460236pt" d="M 838.07247,610.64237 C 839.95513,610.18459 838.75317,605.01626 837.71507,603.73449 C 836.67696,602.45272 829.77408,601.13926 832.78769,603.68422 C 836.03445,606.02046 835.95665,611.10014 838.07247,610.64237 z " id="path1289" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.53464689pt" d="M 835.74471,629.3768 C 833.5582,629.18522 829.82379,631.67928 828.30569,634.47943 C 826.71786,637.32962 829.99008,643.44151 830.27794,640.28249 C 830.49606,637.12348 837.86149,629.61842 835.74471,629.3768 z " id="path1290" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.63460231pt" d="M 842.27092,610.67154 C 840.38825,610.21376 841.59021,605.04542 842.62832,603.76366 C 843.66642,602.48189 850.5693,601.16843 847.5557,603.71338 C 844.30893,606.04963 844.38672,611.12931 842.27092,610.67154 z " id="path1293" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.53464689pt" d="M 844.89363,628.76239 C 847.08014,628.57081 850.81456,631.06487 852.33265,633.86502 C 853.92048,636.71521 850.64827,642.8271 850.3604,639.66808 C 850.14228,636.50907 842.77686,629.00401 844.89363,628.76239 z " id="path1310" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> </g> <path sodipodi:type="arc" style="font-size:12px;fill:url(#radialGradient704);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87644994;stroke-dasharray:none" id="path1268" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" transform="matrix(1.269231,0,0,1.209574,-283.07311,-892.5522)" /> <path style="font-size:12px;fill:url(#linearGradient3087);fill-opacity:0.38016998;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 61.332105,24.771938 C 42.107405,24.771938 25.653025,35.754928 18.178255,51.420348 C 24.096425,54.452298 30.701605,57.324498 38.485955,55.238068 C 53.103085,52.045758 57.672575,44.520268 64.981135,41.327978 C 80.301015,40.755428 87.638095,48.625568 102.74077,48.283028 C 94.643305,34.332978 79.234085,24.771948 61.332105,24.771938 z " id="path1269" /> <text xml:space="preserve" style="font-size:53.10573959px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black" x="16.672869" y="102.03138" id="text1284" sodipodi:linespacing="100%" transform="scale(1.1590137,0.8628026)"><tspan x="16.672869" y="102.03138" sodipodi:role="line" id="tspan1287">3D</tspan></text> <path transform="matrix(1.002448,0,0,1.002916,-160.88153,-16.03236)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path2785" style="font-size:12px;fill:url(#radialGradient2803);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87644994;stroke-dasharray:none" sodipodi:type="arc" /> <g id="g3768" transform="matrix(0,1,-1,0,1076.3543,565.51512)"> <path sodipodi:nodetypes="cccsccsc" id="path3705" d="M 194.12568,840.84063 C 188.41896,847.02146 185.33319,854.75383 182.33294,863.19906 L 201.47506,868.27409 C 189.87912,850.75552 209.12233,847.41039 223.32691,857.48974 C 237.53151,867.56909 241.4625,879.07179 233.76248,898.27256 L 238.42629,908.56618 C 253.06732,892.90031 247.20739,863.37366 228.90023,852.45953 C 205.99771,838.8058 192.17055,859.34731 194.12568,840.84063 z " style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" /> <path sodipodi:nodetypes="cccsccsc" id="path3766" d="M 223.43826,925.93726 C 229.14498,919.75643 232.23075,912.02406 235.231,903.57883 L 216.08888,898.5038 C 227.68482,916.02237 208.44161,919.3675 194.23703,909.28815 C 180.03243,899.2088 176.10144,887.7061 183.80146,868.50533 L 179.13765,858.21171 C 164.49662,873.87758 170.35655,903.40423 188.66371,914.31836 C 211.56623,927.97209 225.39339,907.43058 223.43826,925.93726 z " style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" /> </g> <g id="g3772" transform="matrix(0,0.616295,-0.828342,0,1009.0693,633.18962)"> <path sodipodi:nodetypes="cccsccsc" id="path3774" d="M 194.12568,840.84063 C 188.41896,847.02146 185.33319,854.75383 182.33294,863.19906 L 201.47506,868.27409 C 189.87912,850.75552 209.12233,847.41039 223.32691,857.48974 C 237.53151,867.56909 241.4625,879.07179 233.76248,898.27256 L 238.42629,908.56618 C 253.06732,892.90031 247.20739,863.37366 228.90023,852.45953 C 205.99771,838.8058 192.17055,859.34731 194.12568,840.84063 z " style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" /> <path sodipodi:nodetypes="cccsccsc" id="path3776" d="M 223.43826,925.93726 C 229.14498,919.75643 232.23075,912.02406 235.231,903.57883 L 216.08888,898.5038 C 227.68482,916.02237 208.44161,919.3675 194.23703,909.28815 C 180.03243,899.2088 176.10144,887.7061 183.80146,868.50533 L 179.13765,858.21171 C 164.49662,873.87758 170.35655,903.40423 188.66371,914.31836 C 211.56623,927.97209 225.39339,907.43058 223.43826,925.93726 z " style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" /> </g> <path style="fill:url(#linearGradient4441);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 417.63823,503.43887 C 418.93809,498.49321 401.59543,483.35417 398.57534,480.66632 C 395.46997,477.90258 384.35781,464.40329 381.52358,466.5834 C 378.58446,468.84421 384.30056,470.67943 386.30587,471.58949 C 388.31117,472.49955 396.55321,481.98821 401.26761,486.50842 C 406.07073,491.11369 414.05679,499.07672 417.63823,503.43887 z " id="path4436" sodipodi:nodetypes="czzzzc" /> <g id="g2679" transform="translate(127.72341,250.99136)"> <path transform="matrix(1.269231,0,0,1.209574,-396.41645,-273.48229)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path6385" style="font-size:12px;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#9999ff;stroke-width:1.875;stroke-dasharray:none;stroke-opacity:1" sodipodi:type="arc" /> <path id="path6387" d="M -39.445387,646.81506 L -39.445387,679.12754 L -63.481447,679.12754 L -63.481447,668.7547 C -63.481447,668.7547 -63.462347,668.72431 -87.874467,689.08992 L -63.997067,708.26846 L -63.997067,698.67919 L -39.445387,698.67919 L -39.445387,731.96178 C -19.935277,726.40164 -5.6521274,709.51231 -5.6521174,689.35111 C -5.6521074,669.19381 -19.941107,652.37858 -39.445387,646.81506 z " style="font-size:12px;fill:url(#linearGradient6399);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-opacity:1" /> <path id="path6389" d="M -52.60387,643.06675 C -71.82857,643.06675 -88.28295,654.04974 -95.75772,669.71516 C -89.83955,672.74711 -83.23437,675.61931 -75.45002,673.53288 C -60.83289,670.34057 -56.2634,662.81508 -48.95484,659.62279 C -33.63496,659.05024 -26.29788,666.92038 -11.19521,666.57784 C -19.29267,652.62779 -34.70189,643.06676 -52.60387,643.06675 z " style="font-size:12px;fill:url(#linearGradient6401);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" /> <path transform="matrix(1.269231,0,3.7103497e-3,1.209574,-398.23172,-273.72923)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path6391" style="font-size:12px;fill:url(#radialGradient6403);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none;stroke-opacity:1" sodipodi:type="arc" /> </g> <flowRoot xml:space="preserve" id="flowRoot11253" transform="matrix(2.6418545,0,0,2.7544595,1761.6523,94.933864)"><flowRegion id="flowRegion11255"><rect id="rect11257" width="358.03708" height="133.35794" x="-489.9455" y="234.82002" /></flowRegion><flowPara id="flowPara11259">153 153 255</flowPara></flowRoot> <path style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#e80000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 279.19648,907.10288 C 273.31714,906.18832 254.20929,903.57528 250.19174,907.23353 C 246.5112,910.58491 242.70536,923.39061 246.66413,928.26851 C 249.47779,931.73543 254.82989,928.6278 267.82976,932.31872 C 280.82963,936.00964 287.11749,943.54535 298.66362,943.03218 C 307.48263,942.64023 308.06808,940.90589 310.29166,937.67545 C 312.40306,934.60797 310.81821,929.18158 310.42231,928.13786 C 308.98513,924.34895 302.44264,917.85122 297.87971,914.55004 C 293.19098,911.15785 282.07083,907.23354 279.19648,907.10288 z " id="path2678" sodipodi:nodetypes="czszssssc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="45.143608" inkscape:export-ydpi="45.143608" /> <path style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#e80000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 287.7957,882.82029 C 282.34097,888.30767 274.27322,923.4204 287.27309,927.11132 C 300.27296,930.80224 314.92255,930.76014 327.51389,932.86001 C 336.22135,934.31216 340.73969,924.10168 340.97106,920.18677 C 341.38398,913.19973 339.0792,901.48386 326.86063,890.92071 C 314.52634,880.25752 293.38107,877.20226 287.7957,882.82029 z " id="path2680" sodipodi:nodetypes="czsszz" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="45.143608" inkscape:export-ydpi="45.143608" /> <path style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:#e80000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 264.58065,887.18507 C 258.37906,892.56924 241.86857,906.00903 252.69131,914.75265 C 263.43519,923.43255 273.41622,925.32602 286.00756,927.42589 C 294.71502,928.87804 309.20089,895.65779 296.98232,885.09464 C 284.64803,874.43145 270.7074,881.86587 264.58065,887.18507 z " id="path2682" sodipodi:nodetypes="czszz" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="45.143608" inkscape:export-ydpi="45.143608" /> <path style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:#e80000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 290.92757,880.99004 C 289.79075,881.42333 288.84449,882.00654 288.14632,882.70879 C 282.69159,888.1962 274.6152,923.29912 287.61507,926.99004 C 287.79114,927.04003 287.96966,927.09766 288.14632,927.14629 C 296.8599,924.47318 308.74865,894.82709 297.33382,884.95879 C 295.23315,883.14273 293.07489,881.85608 290.92757,880.99004 z " id="path2684" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="45.143608" inkscape:export-ydpi="45.143608" /> <path style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#ffff00;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 259.64577,905.56358 C 255.38842,905.5919 251.77735,906.06674 250.27077,907.43858 C 249.91517,907.76238 249.52784,908.20395 249.17702,908.68858 C 249.1777,908.69901 249.1763,908.70941 249.17702,908.71983 C 249.33048,910.93718 250.38312,913.06611 252.73952,914.96983 C 263.48339,923.64972 273.49193,925.52621 286.08327,927.62608 C 289.84207,928.25294 294.65885,922.43464 297.95827,914.75108 C 293.26951,911.35891 282.14512,907.44424 279.27077,907.31358 C 275.59618,906.74198 266.74136,905.51637 259.64577,905.56358 z " id="path2686" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="45.143608" inkscape:export-ydpi="45.143608" /> <path style="fill:#ff00ff;fill-opacity:1;fill-rule:evenodd;stroke:#e80000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 280.82099,907.53045 C 280.06054,916.85265 281.46695,925.60102 287.60224,927.34295 C 295.24836,929.51385 303.44418,930.37199 311.47724,931.15545 C 311.25105,929.83044 310.91163,928.77791 310.75849,928.3742 C 309.3213,924.58531 302.79017,918.08163 298.22724,914.78045 C 294.06816,911.77148 284.85701,908.35766 280.82099,907.53045 z " id="path2688" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="45.143608" inkscape:export-ydpi="45.143608" /> <path style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffff00;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 280.77068,907.60226 C 280.00332,916.86703 281.43457,925.5553 287.66599,927.28675 C 287.78134,927.3188 287.89992,927.34855 288.01552,927.38004 C 291.46668,926.29971 295.38858,921.19722 298.21548,914.7546 C 294.07186,911.82087 284.99704,908.50815 280.77068,907.60226 z " id="path2690" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="45.143608" inkscape:export-ydpi="45.143608" /> <path style="fill:#fffcff;fill-opacity:0.76973683;fill-rule:evenodd;stroke:#e80000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3825)" d="M 264.58065,887.18507 C 258.37906,892.56924 241.86857,906.00903 252.69131,914.75265 C 258.06325,919.0926 259.85685,909.80969 258.75146,904.08527 C 258.17203,901.08461 279.46815,887.45077 280.8547,887.17526 C 289.36706,885.48382 309.20089,895.07445 296.98232,884.5113 C 284.64803,873.84811 270.7074,881.86587 264.58065,887.18507 z " id="path2692" sodipodi:nodetypes="czsszz" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="45.143608" inkscape:export-ydpi="45.143608" /> <path style="fill:#f0fcff;fill-opacity:1;fill-rule:evenodd;stroke:#e80000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4043);opacity:0.46111111" d="M 287.7957,882.82029 C 282.34097,888.30767 290.70403,885.01703 303.7039,888.70795 C 310.20384,890.55341 329.34209,902.71925 332.09568,913.03342 C 334.84928,923.34759 321.21822,931.81007 327.51389,932.86001 C 336.22135,934.31216 339.76745,924.1989 339.99882,920.28399 C 340.41174,913.29695 338.88475,902.16443 326.66618,891.60128 C 314.33189,880.93809 293.38107,877.20226 287.7957,882.82029 z " id="path3829" sodipodi:nodetypes="czssszz" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="45.143608" inkscape:export-ydpi="45.143608" /> <path style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#e80000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3995);opacity:0.46666667" d="M 279.19648,907.10288 C 273.31714,906.18832 254.20929,903.57528 250.19174,907.23353 C 246.5112,910.58491 246.55517,919.05709 251.0392,914.65718 C 254.14453,911.61011 297.80278,918.61376 300.78861,921.91578 C 303.86342,925.31622 308.06808,940.90589 310.29166,937.67545 C 312.40306,934.60797 310.81821,929.18158 310.42231,928.13786 C 308.98513,924.34895 302.44264,917.85122 297.87971,914.55004 C 293.19098,911.15785 282.07083,907.23354 279.19648,907.10288 z " id="path3857" sodipodi:nodetypes="czszsssc" inkscape:export-filename="C:\pas\mricron\btn\icon.png" inkscape:export-xdpi="45.143608" inkscape:export-ydpi="45.143608" /> <g id="g2692" transform="translate(674.26081,392.08118)"> <path sodipodi:nodetypes="cccccczcc" id="rect16944" d="M -101.23452,555.91137 L -135.72917,591.54155 L -135.67885,595.00168 C -135.67885,595.00168 -135.69605,596.90777 -134.07752,596.90776 L -63.022358,596.90776 C -61.344963,596.90776 -59.052197,595.93775 -57.904377,594.72045 C -57.904377,594.72045 -26.337149,560.6591 -25.935153,559.8182 C -25.515851,558.94109 -25.61801,554.93919 -25.61801,554.93919 L -101.23452,555.91137 z " style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1.58905315;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:14;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> <g transform="matrix(1,0,-0.7279374,0.7757272,410.51129,124.1268)" id="g16937"> <rect rx="2.2872064" style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:14;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="rect16931" width="76.767708" height="48.723415" x="-108.35294" y="554.36353" ry="2.8327568" /> <rect style="opacity:1;fill:#666666;fill-opacity:1;stroke:none;stroke-width:0.98140889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:14;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="rect16933" width="63.422516" height="22.064268" x="-101.68034" y="557.35358" ry="1.2828063" /> <rect style="opacity:1;fill:#999999;fill-opacity:1;stroke:none;stroke-width:0.98140889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:14;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="rect16935" width="19.798063" height="15.832203" x="-79.868118" y="583.83984" ry="0.92047691" /> </g> <rect transform="matrix(1,0,-0.1383274,0.9903866,0,0)" ry="2.8602536" y="510.54825" x="-26.254177" height="49.196362" width="76.767708" id="rect16919" style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1.80871499;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:14;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> <rect transform="matrix(1,0,-0.1383274,0.9903866,0,0)" y="514.40961" x="-20.871944" height="41.473679" width="66.003235" id="rect16921" style="fill:url(#linearGradient2702);fill-opacity:1;stroke:none;stroke-width:2.90499997;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> <path id="path16956" d="M -92.277435,594.51054 L -64.16994,594.51054" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> </g> <g id="g2685" transform="translate(582.18114,338.61556)"> <rect transform="matrix(0.9713022,0.2378487,-0.5171396,0.855901,0,0)" y="508.92459" x="94.426369" height="60.465881" width="77.145607" id="rect2697" style="opacity:1;fill:#9999ff;fill-opacity:1;stroke:#000000;stroke-width:7.98921967;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> <path sodipodi:nodetypes="cccccccccc" d="M -117.44468,481.34737 C -116.8448,484.69863 -133.55429,489.06659 -134.22773,490.99385 C -135.61163,493.12351 -124.78314,498.17939 -127.71818,500.70189 C -129.5925,504.50435 -158.49967,506.43937 -165.22499,505.25897 C -166.06446,504.57579 -166.21006,503.01216 -164.67268,502.07743 C -160.5694,500.45465 -140.39449,501.84269 -133.73254,499.40077 C -133.14809,498.3747 -140.78872,493.21278 -138.4452,490.4823 C -135.98802,487.11788 -120.9359,483.60551 -121.16622,481.62624 C -123.3344,479.39272 -140.13087,475.87842 -142.12303,473.95 C -142.12303,473.95 -120.27517,478.54207 -117.44468,481.34737 z " id="path4659" style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3996)" /> <rect transform="matrix(0.9713022,0.2378487,-0.5171396,0.855901,-1.485156,0)" y="508.17789" x="94.419182" height="60.465874" width="77.145607" id="rect2920" style="opacity:0.90659335;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.43310034;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter3943)" /> <path sodipodi:nodetypes="czzzzc" id="path4643" d="M -146.10287,435.77043 C -150.13633,433.93962 -160.81303,460.49087 -163.95326,471.903 C -167.02949,483.08255 -166.36953,503.35123 -164.3485,503.49605 C -162.07868,503.6587 -158.59997,498.57336 -157.34041,493.95863 C -156.09656,489.40146 -151.23529,478.15716 -150.04903,469.04377 C -149.17527,459.93038 -143.83082,437.24117 -146.10287,435.77043 z " style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> <path sodipodi:nodetypes="czzzzc" id="path4645" d="M -158.59661,464.49301 C -159.99659,468.59609 -161.62828,471.41835 -162.79655,476.80223 C -163.96481,482.3724 -165.63291,496.14896 -164.72285,498.41272 C -163.81278,500.67648 -162.48409,499.18142 -161.57403,497.17611 C -160.66397,495.17081 -161.12497,484.96734 -160.83782,480.52595 C -160.62631,476.08455 -159.0754,471.78897 -158.59661,464.49301 z " style="fill:url(#linearGradient4653);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> </g> </g> </svg> ���������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/colorzero.bmp��������������������������������������������������0000664�0001750�0001750�00000003256�10672753456�021176� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMЎ������6���(���������������x�������������������џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�����������џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�����������������џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��������џ��������џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��������џ��������џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��������џ��������џ��џ�����������������џ��џ��џ��џ��џ��џ��џ�����������������������џ��������џ��џ�����������������џ��џ��џ��џ��џ��џ��џ��������������������������������џ��џ�����������������џ��џ��џ��џ��џ��џ��џ�����������������џ�����������џ��џ��џ��џ�����������џ��џ��џ��џ��џ��џ��џ��џ��џ�����������џ��џ��џ��џ��џ��џ��џ��џ��џ�����������џ��џ��џ��џ��џ��џ��џ��џ��џ�����������џ��џ��џ���џ�џ��џ��џ��џ��џ��џ�����џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�����џ��џ��џ��џ���џ�џ��џ��џ��џ��џ��џ�����џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�����џ��џ�€€€€€€��џ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€������  #(,16 9##:%%:'':)):++:--:00���������€€€€€€������,D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������������������������������������������������������������������€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/colorbar.bmp���������������������������������������������������0000664�0001750�0001750�00000001626�10672753376�020763� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BM–������6���(������ ���������`�������������������џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€������  #(,16 9##:%%:'':)):++:--:00���������€€€€€€������,D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������.D((Y55oBB„OOš\\АiiХvvкƒƒёў››џЄЄџЌЌџЕЕџООџЦЦџззџррџџџ���€€€€€€������������������������������������������������������������������€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€����������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/bucket24.png���������������������������������������������������0000664�0001750�0001750�00000002160�11040060156�020554� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������|fu���sBIT|dˆ��� pHYs����.Пм���tEXtSoftware�www.inkscape.org›ю<��эIDATH‰”}LUuЧП‡{яˆqх 1b™ЭšС*Е•ђЧ5џ@Фj QZР?шsИхЦщla5\!^Z ИZR8”S, ђzyН\Ѕ ЈsпўроЫхђ№лž=ПsžЯѓќОчљ=I,u ТО Р н)ЕЪ%F–•цЮЮs1‹ќ_єКр ќДgяgІ†ђ[nlcTTІьП>ёиЂqK�…mL5о/§•R\<ЉVГ.ъU~]P՘шьСеХm[\ЃйПщщˆЃ]}…%Є› PіжrtЭ{;GЙ1,Ѕаћ, ююџRфцt“љ›KЄ(N №є–xV^яс€IЂeXbн­ |"ЉаЋ–єa‘›3њG .’jЕ\Н=–Gг |`”йл%sЈ_тЃ‰ОЊœ№O,X< ЉжXQ=ЋтkЯЧ29ɘM 2[›evЖЫьы‘h”јчC‰я:7ЂгН{`QИ—WТєЬяЪ;ЂэртЈXfЄWАЖFсНпeўб(ГэОЬюй.Я#ѓ$Ÿ{6Га‡лX.N}ьОЦЧѓг‘Ў^Њп*1хЃCо–84Нўvя~ В ШŠƒЩ€, e@TИ\єБopАюŠ ьѓ��С~‰Aз ScЁO [ч)о4Л яёБуЭЗ№ЬІ0ˆ"АJDEZ=ЌЯ Q3НЏПн2•№іUн=чЃЇс‚ ž€rxЭЮё;к]lмUHH =h•а–`NB іъXўйŠ|›,i�V РчfѕCуY……њ†ч‘a!ьВЅІМсЎбЈкрžV‡4аb9К­­e{nnіэВВђ1Yтt№ЌDТ‚‰jjк05Хk6xЃеЮЬC‡й<ДЕЌЌ4;ыјёО^грl (ŠрtЂщїŸфvw›smpƒеЭjZ,_ž1[_ШЩ>YWђCщ_’ФЙе:œЈшRепFc_ihwь–Л�Ў€<БаеjSЕZяŒŒєзmі›ѓs[Zк•”ДМЛ&“yiPf.p˜€a SвэкїoJ(§хg‰е7жз*<™s}мЯ/щ ї˜{C/Эі' .–ФлћНфааŒо”#W'CBŽuљњ&q^Ж>№=€p�§�,Nж  Р=zЩЭЭѕ•‰‰ЩЫЄсŸ9:ˆ&0i›#ЫДхЖЮ?ЯІ‚mŠРЫЮp�5 uЧ2–�`Я|ВЈ ь"№-бVоNрIчЪgњ�СРN��ќ�јZНmџ/€^�&прGŠsсџVин5Б.A����IENDЎB`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/blackbackbround.svg��������������������������������������������0000664�0001750�0001750�00000421247�11030424576�022277� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg1141" sodipodi:version="0.32" inkscape:version="0.46" width="210mm" height="297mm" sodipodi:docname="blackbackbround.svg" sodipodi:docbase="C:\Documents and Settings\Chris Rorden\Desktop" inkscape:output_extension="org.inkscape.output.svg.inkscape"> <metadata id="metadata413"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> </cc:Work> </rdf:RDF> </metadata> <defs id="defs1143"> <inkscape:perspective sodipodi:type="inkscape:persp3d" inkscape:vp_x="0 : 526.18109 : 1" inkscape:vp_y="0 : 1000 : 0" inkscape:vp_z="744.09448 : 526.18109 : 1" inkscape:persp3d-origin="372.04724 : 350.78739 : 1" id="perspective448" /> <linearGradient id="linearGradient1280"> <stop style="stop-color:#ffc000;stop-opacity:1.0000000;" offset="0.00000000" id="stop1281" /> <stop style="stop-color:#ff0000;stop-opacity:0.50000000;" offset="1.0000000" id="stop1283" /> </linearGradient> <linearGradient id="linearGradient1271"> <stop style="stop-color:#ffc87e;stop-opacity:1.0000000;" offset="0.00000000" id="stop1274" /> <stop style="stop-color:#ff0000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1279" /> </linearGradient> <linearGradient id="linearGradient1270"> <stop style="stop-color:#ffc000;stop-opacity:1.0000000;" offset="0.00000000" id="stop1271" /> <stop style="stop-color:#e84a50;stop-opacity:1.0000000;" offset="0.50000000" id="stop1273" /> <stop style="stop-color:#ff0000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1272" /> </linearGradient> <linearGradient id="linearGradient1608"> <stop style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.00000000" id="stop1609" /> <stop style="stop-color:#9999ff;stop-opacity:1.0000000;" offset="0.50000000" id="stop1611" /> <stop style="stop-color:#000000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1610" /> </linearGradient> <linearGradient id="linearGradient1563"> <stop style="stop-color:#898bdc;stop-opacity:1.0000000;" offset="0.00000000" id="stop1564" /> <stop style="stop-color:#000000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1565" /> </linearGradient> <linearGradient id="linearGradient1547"> <stop style="stop-color:#9999ff;stop-opacity:1.0000000;" offset="0.00000000" id="stop1548" /> <stop style="stop-color:#9999fd;stop-opacity:0.00000000;" offset="1.0000000" id="stop1549" /> </linearGradient> <linearGradient id="linearGradient1391"> <stop style="stop-color:#ffc000;stop-opacity:1.0000000;" offset="0.00000000" id="stop1392" /> <stop style="stop-color:#ff0000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1394" /> </linearGradient> <linearGradient id="linearGradient1111"> <stop style="stop-color:#e8e838;stop-opacity:1.0000000;" offset="0.00000000" id="stop1112" /> <stop style="stop-color:#ffff7f;stop-opacity:1.0000000;" offset="1.0000000" id="stop1114" /> </linearGradient> <linearGradient id="linearGradient1274"> <stop style="stop-color:#ff0400;stop-opacity:1.0000000;" offset="0.00000000" id="stop1275" /> <stop style="stop-color:#fd6972;stop-opacity:1.0000000;" offset="0.0099999998" id="stop1277" /> <stop style="stop-color:#ff0000;stop-opacity:1.0000000;" offset="1.0000000" id="stop1276" /> </linearGradient> <linearGradient id="linearGradient1205"> <stop style="stop-color:#ffffff;stop-opacity:0.9;" offset="0.00000000" id="stop1206" /> <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1.00000000" id="stop1207" /> </linearGradient> <linearGradient id="linearGradient1172"> <stop style="stop-color:#ffffff;stop-opacity:0.3;" offset="0.00000000" id="stop1173" /> <stop style="stop-color:#ffffff;stop-opacity:0.8;" offset="1.00000000" id="stop1174" /> </linearGradient> <linearGradient id="linearGradient969"> <stop style="stop-color:#ffffff;stop-opacity:0.70196080;" offset="0.00000000" id="stop970" /> <stop style="stop-color:#9999ff;stop-opacity:0.70196080;" offset="1.0000000" id="stop971" /> </linearGradient> <linearGradient id="linearGradient684"> <stop style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.00000000" id="stop685" /> <stop style="stop-color:#9999ff;stop-opacity:1.0000000;" offset="1.0000000" id="stop686" /> </linearGradient> <linearGradient id="linearGradient671"> <stop style="stop-color:#ffffff;stop-opacity:1.0000000;" offset="0.00000000" id="stop672" /> <stop style="stop-color:#ffffff;stop-opacity:0.00000000;" offset="1.0000000" id="stop673" /> </linearGradient> <linearGradient id="linearGradient594"> <stop style="stop-color:#fffbfb;stop-opacity:1.0000000;" offset="0.00000000" id="stop595" /> <stop style="stop-color:#007aff;stop-opacity:1.0000000;" offset="1.0000000" id="stop596" /> </linearGradient> <linearGradient id="linearGradient1155"> <stop style="stop-color:#fffbfb;stop-opacity:1.0000000;" offset="0.00000000" id="stop1156" /> <stop style="stop-color:#9999ff;stop-opacity:1.0000000;" offset="1.0000000" id="stop1157" /> </linearGradient> <radialGradient xlink:href="#linearGradient1155" id="radialGradient1158" cx="0.21874997" cy="0.23437454" r="0.70745194" fx="0.21874997" fy="0.23437454" /> <radialGradient xlink:href="#linearGradient684" id="radialGradient1169" cx="0.77941167" cy="0.65624988" r="0.32758817" fx="0.77941167" fy="0.65624988" /> <linearGradient xlink:href="#linearGradient1155" id="linearGradient1170" x1="39.904693" y1="205.22107" x2="28.554472" y2="212.26643" gradientTransform="matrix(4.2446192,0,0,4.0663556,526.57826,-780.11618)" gradientUnits="userSpaceOnUse" /> <linearGradient xlink:href="#linearGradient594" id="linearGradient588" x1="331.69558" y1="519.82318" x2="377.3627" y2="537.58599" gradientTransform="matrix(0.7771299,0,0,1.2867861,-1.839794,-597.93306)" gradientUnits="userSpaceOnUse" /> <linearGradient xlink:href="#linearGradient1547" id="linearGradient639" x1="0.47535211" y1="-0.11428571" x2="0.58802819" y2="0.96190476" /> <linearGradient xlink:href="#linearGradient1155" id="linearGradient643" x1="0.20312500" y1="0.10687023" x2="0.50000000" y2="0.88549620" /> <linearGradient xlink:href="#linearGradient1563" id="linearGradient670" x1="265.95663" y1="735.08612" x2="313.4116" y2="761.44375" gradientTransform="matrix(0.9763285,0,0,1.0242454,-241.01302,-713.84008)" gradientUnits="userSpaceOnUse" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient683" x1="0.39084506" y1="-0.06603774" x2="0.59859157" y2="0.94339621" /> <linearGradient xlink:href="#linearGradient1608" id="linearGradient701" x1="-196.8662" y1="425.48517" x2="-141.23934" y2="425.48517" gradientTransform="matrix(1.677741,0,0,0.5960396,114.06723,-183.9794)" gradientUnits="userSpaceOnUse" /> <linearGradient xlink:href="#linearGradient671" id="linearGradient703" x1="0.45070422" y1="-0.93750000" x2="0.44366196" y2="1.21875000" /> <radialGradient xlink:href="#linearGradient1271" id="radialGradient704" cx="292.27442" cy="807.81573" r="24.522423" fx="292.27442" fy="807.81573" gradientUnits="userSpaceOnUse" /> <linearGradient xlink:href="#linearGradient969" id="linearGradient967" x1="0.39297354" y1="0.06249970" x2="0.46580359" y2="0.96093768" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient968" x1="0.08771923" y1="0.02343778" x2="0.55263156" y2="1.32031250" /> <linearGradient xlink:href="#linearGradient671" id="linearGradient1138" x1="0.50000000" y1="0.05468750" x2="0.71717173" y2="1.70312500" /> <linearGradient xlink:href="#linearGradient671" id="linearGradient1139" x1="359.54053" y1="199.43834" x2="383.23312" y2="207.27092" gradientTransform="scale(0.4268666,2.3426521)" gradientUnits="userSpaceOnUse" /> <radialGradient xlink:href="#linearGradient969" id="radialGradient1140" cx="0.11029412" cy="0.06250000" r="1.26334059" fx="0.11029412" fy="0.06250000" /> <linearGradient xlink:href="#linearGradient1172" id="linearGradient1175" x1="210.53689" y1="386.86683" x2="206.25145" y2="389.11669" gradientTransform="scale(0.758349,1.3186542)" gradientUnits="userSpaceOnUse" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient1202" x1="0.16197200" y1="-0.11904722" x2="0.32746491" y2="1.99999797" /> <radialGradient xlink:href="#linearGradient684" id="radialGradient1203" cx="0.77941167" cy="0.65624988" r="0.32758817" fx="0.77941167" fy="0.65624988" /> <radialGradient xlink:href="#linearGradient1547" id="radialGradient983" cx="0.73913020" cy="0.72519094" r="0.22669560" fx="0.73913020" fy="0.72519094" /> <radialGradient xlink:href="#linearGradient1205" id="radialGradient1066" cx="0.76470590" cy="0.76562488" r="0.29453236" fx="0.76470590" fy="0.76562482" /> <linearGradient xlink:href="#linearGradient1274" id="linearGradient1273" x1="-0.019230817" y1="-3.8570047e-008" x2="0.51923072" y2="0.87500006" /> <linearGradient xlink:href="#linearGradient1280" id="linearGradient1110" x1="459.4994" y1="1254.0935" x2="481.37598" y2="1325.9788" gradientTransform="matrix(1.6468933,0,0,0.6072039,115.90702,-728.55844)" gradientUnits="userSpaceOnUse" /> <linearGradient xlink:href="#linearGradient1111" id="linearGradient1118" x1="0.53521127" y1="1.0151515" x2="0.52816904" y2="0.015151516" /> <radialGradient xlink:href="#linearGradient1391" id="radialGradient1395" cx="0.69533569" cy="0.78121674" r="0.68209499" fx="0.69533557" fy="0.76559359" /> <radialGradient xlink:href="#linearGradient1547" id="radialGradient1442" cx="291.17355" cy="815.41846" r="18.939451" fx="290.62314" fy="814.83362" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient1604" x1="0.52343750" y1="0.0076335878" x2="1.0312500" y2="1.1297710" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient1617" x1="0.10920641" y1="-0.40239441" x2="1.2083132" y2="1.9653628" /> <linearGradient xlink:href="#linearGradient684" id="linearGradient1618" x1="0.42672610" y1="-0.31047121" x2="1.0007051" y2="2.1198800" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient3271" x1="299.8437" y1="1036.9841" x2="305.62924" y2="1092.2429" gradientTransform="matrix(1.646893,0,0,0.607204,-404.3959,232.2467)" gradientUnits="userSpaceOnUse" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient3289" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient4195" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.646893,0,0,0.607204,-404.3959,232.2467)" x1="299.8437" y1="1036.9841" x2="305.62924" y2="1092.2429" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient4197" gradientUnits="userSpaceOnUse" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient4209" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.646893,0,0,0.607204,-404.3959,232.2467)" x1="299.8437" y1="1036.9841" x2="305.62924" y2="1092.2429" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient4211" gradientUnits="userSpaceOnUse" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient4223" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.646893,0,0,0.607204,-404.3959,232.2467)" x1="299.8437" y1="1036.9841" x2="305.62924" y2="1092.2429" /> <radialGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="radialGradient4225" gradientUnits="userSpaceOnUse" cx="289.25905" cy="812.97649" fx="289.25905" fy="812.97649" r="16.96986" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1547" id="linearGradient2823" x1="169.59108" y1="1212.3388" x2="175.37662" y2="1267.5976" gradientTransform="matrix(1.6468933,0,0,0.6072039,-241.01302,-713.84008)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1172" id="linearGradient2825" x1="339.63678" y1="379.11596" x2="335.35134" y2="381.36582" gradientTransform="matrix(0.758349,0,0,1.3186542,125.10599,-388.19654)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient2827" x1="588.89265" y1="195.07545" x2="612.58524" y2="202.90803" gradientTransform="matrix(0.4268666,0,0,2.3426521,125.10599,-388.19654)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1172" id="linearGradient2829" x1="477.45044" y1="381.63529" x2="473.165" y2="383.88514" gradientTransform="matrix(0.758349,0,0,1.3186542,156.38249,-391.87613)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient2831" x1="833.72519" y1="196.49355" x2="857.41778" y2="204.32614" gradientTransform="matrix(0.4268666,0,0,2.3426521,156.38249,-391.87613)" gradientUnits="userSpaceOnUse" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1172" id="linearGradient3604" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.758349,0,0,1.3186542,596.58502,-401.58502)" x1="210.53689" y1="386.86683" x2="206.25145" y2="389.11669" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient671" id="linearGradient3608" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.4268666,0,0,2.3426521,596.58502,-401.58502)" x1="359.54053" y1="199.43834" x2="383.23312" y2="207.27092" /> <linearGradient inkscape:collect="always" xlink:href="#linearGradient1608" id="linearGradient3613" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.677741,0,0,0.5960396,112.0526,-127.41089)" x1="-196.8662" y1="425.48517" x2="-141.23934" y2="425.48517" /> </defs> <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.130388" inkscape:cx="443.79091" inkscape:cy="943.32828" inkscape:window-width="1096" inkscape:window-height="675" inkscape:window-x="84" inkscape:window-y="-10" showgrid="false" snaptogrid="false" showguides="true" snaptoguides="true" inkscape:current-layer="svg1141" inkscape:snap-global="false"> <inkscape:grid type="xygrid" id="grid3623" /> </sodipodi:namedview> <rect style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffff00;stroke-width:9.29087925;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:18.58175977, 9.29087989;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="rect2821" width="962.55579" height="269.52261" x="-16.443275" y="16.154039" /> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;" id="rect1295" width="69.963570" height="45.246185" x="-101.75949" y="509.82691" transform="scale(-1.000000,1.000000)" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;fill-opacity:1.0000000;" id="rect1262" width="69.963570" height="45.246185" x="128.72227" y="535.48883" transform="translate(-91.26626,99.11160)" /> <path sodipodi:type="arc" style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000pt;" id="path1286" sodipodi:cx="88.389725" sodipodi:cy="698.28027" sodipodi:rx="18.305565" sodipodi:ry="18.305565" d="M 106.69529 698.28027 A 18.305565 18.305565 0 1 0 70.084160,698.28027 A 18.305565 18.305565 0 1 0 106.69529 698.28027 z" transform="translate(-17.25953,-39.22624)" /> <path sodipodi:type="arc" style="fill-rule:evenodd;stroke-width:1.0000000pt;" id="path1573" sodipodi:cx="496.47308" sodipodi:cy="894.01904" sodipodi:rx="26.543070" sodipodi:ry="26.543070" d="M 523.01615 894.01904 A 26.543070 26.543070 0 1 0 469.93001,894.01904 A 26.543070 26.543070 0 1 0 523.01615 894.01904 z" transform="translate(185.5400,-212.9984)" /> <path sodipodi:type="arc" style="fill:url(#radialGradient1395);fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;" id="path1343" sodipodi:cx="715.48608" sodipodi:cy="436.77219" sodipodi:rx="38.180180" sodipodi:ry="38.180180" d="M 753.66626 436.77219 A 38.180180 38.180180 0 1 0 677.30590,436.77219 A 38.180180 38.180180 0 1 0 753.66626 436.77219 z" transform="matrix(0.905654,0.000000,0.000000,0.919132,149.4257,12.54474)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0375195;" d="M 704.48491,415.34092 C 694.57329,417.80874 687.95315,428.45052 684.92534,434.86193 C 681.89753,441.01182 677.92934,447.28914 688.65031,452.73194 C 698.87767,454.00139 705.70466,453.64762 711.13899,450.11964 C 718.44814,445.58571 724.25946,439.88285 726.48955,434.60790 C 727.94598,431.77023 741.08206,432.37026 740.21539,430.37826 C 740.33314,426.85776 739.63744,419.26753 731.65870,414.99087 C 727.35252,412.29016 710.27910,412.15675 704.48491,415.34092 z " id="path1377" sodipodi:nodetypes="czcccccc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 175.16419,313.27629 C 170.59785,312.81843 161.53978,318.62958 157.57044,321.02629 C 146.72186,327.57680 135.88296,343.93132 135.88294,360.30754 C 135.88294,364.40161 132.43921,368.00533 137.35169,380.80754 C 143.39531,391.81829 170.06959,395.25262 170.28919,388.46379 C 170.50878,381.67497 166.19786,385.04854 171.50794,379.87004 C 171.67000,389.89820 175.12385,390.07619 174.97669,395.99504 C 174.88252,399.52179 174.69106,407.40659 176.03919,406.05754 L 177.97669,406.37004 L 177.97669,406.49504 L 178.35169,406.43254 L 180.28919,406.12004 C 181.63732,407.46909 181.44586,399.58428 181.35169,396.05754 C 181.20453,390.13869 184.65838,389.96069 184.82044,379.93254 C 190.13052,385.11104 185.81960,381.73746 186.03919,388.52629 C 186.25879,395.31512 212.93307,391.88078 218.97669,380.87004 C 223.88917,368.06783 220.44544,364.46410 220.44544,360.37004 C 220.44542,343.99382 209.60652,327.63929 198.75794,321.08879 C 194.78860,318.69208 185.73053,312.88092 181.16419,313.33879 C 179.64208,313.49141 178.61613,314.33756 178.44544,316.24504 L 177.64117,368.62731 L 177.88294,316.18254 C 177.71225,314.27507 176.68630,313.42891 175.16419,313.27629 z " id="path1150" sodipodi:nodetypes="ccccccccccccccccccccccc" /> <path style="fill:#ff0000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.68412900pt;" d="M 182.78509,493.16200 C 171.13638,496.94695 136.68072,486.89726 135.94501,503.73375 C 135.20931,520.57025 224.59784,516.52427 212.45865,506.21355 C 200.31947,495.90282 194.43381,489.37705 182.78509,493.16200 z " id="path1140" sodipodi:nodetypes="cczz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:1.2724125pt;" d="M 496.61025,315.43263 C 487.70277,315.43523 472.41769,322.55172 466.47718,327.89823 C 454.59613,338.59121 447.94047,366.42388 447.94047,384.24553 C 447.94047,389.67769 447.95637,395.00686 448.18560,400.13622 L 542.84637,400.13622 C 543.08751,395.05165 543.13236,389.79833 543.13236,384.40325 C 543.13232,366.58163 539.47657,339.72728 527.56914,329.01351 C 521.61543,323.65662 505.51773,315.43003 496.61025,315.43263 z " id="path1063" sodipodi:nodetypes="cccccccc" /> <path style="fill-rule:evenodd;stroke:none;stroke-width:0.91963024pt;" d="M 342.97890,399.86026 L 434.73342,400.51279 L 433.34799,392.09524 C 432.07595,388.11087 427.72724,383.73612 426.88022,379.25826 C 425.59125,374.78040 431.80349,377.65786 431.05395,370.30329 C 430.30440,362.94871 428.89800,343.42434 418.26686,333.11605 C 407.32322,323.12026 398.18407,316.70378 378.78742,319.85497 C 360.64077,321.75616 350.23069,330.41956 342.83093,345.70413 C 335.23979,360.98870 343.64369,380.00725 343.40504,387.13431 L 342.97890,399.86026 z " id="path1052" sodipodi:nodetypes="ccczzzzzzc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.99068832pt;" d="M 320.29479,372.55062 C 320.29479,358.42655 311.10597,330.09600 301.99795,321.60508 C 292.88992,313.11416 274.73445,313.13063 265.64663,321.60508 C 256.55879,330.07953 247.47096,358.32768 247.47096,372.45176 C 247.47096,386.57584 256.55879,400.69991 265.64663,406.34955 C 274.73445,411.99918 292.88992,411.98270 301.99795,406.34955 C 311.10597,400.71639 320.29479,386.67470 320.29479,372.55062 z " id="path1005" sodipodi:nodetypes="czzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;fill-opacity:1.0000000;" d="M 285.33919,319.75776 C 285.22106,319.75773 285.10603,319.78538 284.98790,319.78676 L 284.98790,319.81576 C 284.89998,319.80784 284.81324,319.78672 284.72444,319.78676 C 284.51750,319.78683 284.31656,319.84036 284.10969,319.84476 L 284.10969,319.96075 C 283.98357,319.94408 283.85702,319.93179 283.72913,319.93175 C 283.64032,319.93172 283.55359,319.95283 283.46566,319.96075 L 283.46566,319.93175 C 283.34754,319.93038 283.23251,319.90272 283.11438,319.90275 C 276.89311,319.90464 270.66516,321.86677 266.51610,325.76033 C 264.44158,327.70710 252.56791,343.76278 256.56299,346.52283 C 266.50559,353.79628 275.12532,332.38529 265.93062,350.14757 C 265.00413,356.24861 264.76600,359.42978 264.70112,361.02179 C 264.57010,358.10542 263.48646,351.26520 257.79249,347.94373 C 253.03583,345.22610 249.91783,369.23133 249.91783,372.47596 C 249.91783,385.45451 258.21800,398.42830 266.51610,403.61972 C 270.72453,406.25259 277.06786,407.51634 283.37784,407.47644 L 283.37784,407.50544 C 283.70047,407.50809 284.02131,407.48056 284.34388,407.47644 L 284.34388,407.33145 C 284.58784,407.34079 284.83124,407.36248 285.07573,407.36045 L 285.07573,407.33145 C 291.38571,407.37135 297.72904,406.10762 301.93747,403.47473 C 310.23557,398.28331 318.53574,385.30951 318.53574,372.33097 C 318.53574,369.08634 315.41773,345.08110 310.66108,347.79874 C 304.96711,351.12021 303.88347,357.96043 303.75245,360.87680 C 303.68757,359.28479 303.44944,356.10361 302.52294,350.00258 C 293.32825,332.24030 301.94798,353.65128 311.89058,346.37784 C 315.88566,343.61779 304.01199,327.56210 301.93747,325.61534 C 297.78841,321.72178 291.56046,319.75964 285.33919,319.75776 z " id="path1044" /> <path sodipodi:type="arc" style="font-size:12;fill:#fffffd;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.875;stroke-dasharray:none;" id="path695" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(1.269231,0.000000,0.000000,1.209574,152.3260,-283.6191)" /> <path sodipodi:type="arc" style="font-size:12;fill:url(#linearGradient1202);fill-opacity:0.75;fill-rule:evenodd;stroke:#0050fb;stroke-width:2.47293;stroke-dasharray:none;stroke-opacity:1;" id="path1200" sodipodi:cx="604.88873291" sodipodi:cy="441.20190430" sodipodi:rx="44.21426392" sodipodi:ry="13.48378277" d="M 649.102997 441.201904 A 44.214264 13.483783 0 1 0 560.674469,441.201904 A 44.2143 13.4838 0 1 0 649.103 441.202 L 604.888733 441.201904 z" transform="matrix(1.042553,0.000000,0.000000,0.882208,-29.50271,47.34934)" /> <path style="font-size:12;fill-opacity:0.70196;stroke:#1c66f9;stroke-width:9.25243;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99;fill:url(#linearGradient968);" d="M -49.21 243.091 C -46.9287 238.079 -38.9781 233.065 -32.1615 233.824 L 173.669 267.357 C 189.611 256.808 212.948 243.966 237.003 247.181 L 271.976 250.84 L 316.171 257.383 C 341.971 263.24 362.36 275.405 364.498 299.613 L 364.227 591.258 L -50.8332 491.502 L -49.21 243.091 z " id="path10" transform="matrix(0.180587,0.000000,0.000000,0.239519,475.9239,473.8713)" sodipodi:nodetypes="cccccccccc" /> <rect style="font-size:12;fill:none;fill-opacity:0.25;fill-rule:evenodd;stroke-width:0.0937284;stroke-opacity:0.53137;" id="rect1408" x="0.001633" y="142.499995" width="14.998365" height="14.994604" rx="0" ry="0" transform="matrix(15.78489,0.000000,0.000000,15.78489,215.6082,-1931.463)" /> <rect style="font-size:12;fill:none;fill-rule:evenodd;stroke-width:0.0520834;" id="rect702" width="25.000004" height="24.999990" x="24.999998" y="219.999988" transform="matrix(14.81984,0.000000,0.000000,14.99259,-23.10420,-2817.060)" /> <path style="font-size:12px;fill:url(#linearGradient588);fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:0.47846999pt" d="M 257.44647,124.75373 C 258.13527,123.03175 285.34249,32.111392 285.34249,32.111392 L 316.33807,119.93219 C 316.33807,119.93219 303.25105,129.23087 288.09766,129.23087 C 272.94426,131.29724 257.10208,124.75373 257.44647,124.75373 z" id="path593" sodipodi:nodetypes="ccccc" /> <polygon sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon597" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,168.93691,-207.95076)" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z" /> <polygon sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon598" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,159.98261,-174.88876)" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z" /> <polygon sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon599" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,176.51361,-187.28696)" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z" /> <polygon sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon600" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,174.79161,-171.10046)" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z" /> <polygon sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon601" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,160.67141,-156.63576)" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z" /> <polygon sodipodi:type="star" style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" id="polygon602" sodipodi:sides="6" sodipodi:cx="240.40767" sodipodi:cy="577.30511" sodipodi:r1="15.404038" sodipodi:r2="7.7020192" sodipodi:arg1="0.65284663" sodipodi:arg2="1.1764454" points="252.644,586.662 243.367,584.416 238.422,592.581 235.729,583.423 226.186,583.223 232.77,576.312 228.171,567.948 237.448,570.194 242.393,562.03 245.086,571.187 254.629,571.387 248.045,578.298 252.644,586.662 " transform="matrix(0.478471,0,0,0.478471,184.09031,-159.39096)" inkscape:flatsided="false" inkscape:rounded="0" inkscape:randomized="0" d="M 252.64399,586.6623 L 243.36685,584.41597 L 238.42227,592.58067 L 235.72908,583.42327 L 226.18595,583.22349 L 232.76989,576.31241 L 228.17135,567.94793 L 237.44848,570.19426 L 242.39307,562.02956 L 245.08626,571.18696 L 254.62939,571.38674 L 248.04545,578.29781 L 252.64399,586.6623 z" /> <path style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 272.27738,77.494562 C 270.75027,82.584812 270.67003,82.814932 269.13741,87.916252 L 270.27378,91.773922 L 272.65118,87.871392 L 277.07704,88.947952 L 274.87906,84.940762 L 278.03398,81.636322 L 273.47355,81.546602 L 272.27738,77.494562 z" id="path605" /> <path style="font-size:12px;fill:#ffff00;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 290.32432,46.344392 L 289.09823,48.347992 L 284.65743,47.271432 L 286.8554,51.278622 L 283.71544,54.583062 L 288.27586,54.672782 L 289.56175,59.053772 L 291.93915,55.151252 L 293.56895,55.554962 L 290.32432,46.344392 z" id="path608" /> <path sodipodi:type="arc" style="font-size:12px;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.875;stroke-dasharray:none" id="path651" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711,796.11926 A 37.428738,37.428738 0 1 1 233.92963,796.11926 A 37.428738,37.428738 0 1 1 308.78711,796.11926 z" transform="matrix(1.269231,0,0,1.209574,-302.57031,-890.68908)" /> <path style="font-size:12px;fill:url(#linearGradient670);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-opacity:1" d="M 54.678503,29.191648 L 54.678503,61.925738 L 30.642443,61.925738 L 30.642443,51.417558 C 30.642443,51.417558 30.661543,51.386768 6.2494227,72.018108 L 30.126823,91.446888 L 30.126823,81.732498 L 54.678503,81.732498 L 54.678503,115.44936 C 74.188613,109.81667 88.471763,92.706968 88.471773,72.282708 C 88.471783,51.862398 74.182783,34.827758 54.678503,29.191648 z" id="path669" /> <path style="font-size:12px;fill:url(#linearGradient1170);fill-rule:evenodd;stroke:#9999ff;stroke-width:2.78699999999999990;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 682.44968,99.608656 C 689.1597,98.06451 694.06417,94.112946 698.56742,89.760146 C 702.66943,85.139869 706.77145,78.914687 708.26547,72.689506 L 674.53074,30.508874 L 635.98125,69.479657 L 682.44968,99.608656 z" id="path709" sodipodi:nodetypes="cccccc" /> <path sodipodi:type="arc" style="font-size:12px;fill:#f5f9ff;fill-rule:evenodd;stroke:#9999ff;stroke-width:10.78610039000000000;stroke-opacity:1" id="path587" sodipodi:cx="220.25374" sodipodi:cy="529.07959" sodipodi:rx="44.626575" sodipodi:ry="78.456398" d="M 264.88031,529.07959 A 44.626575,78.456398 0 1 1 175.62716,529.07959 A 44.626575,78.456398 0 1 1 264.88031,529.07959 z" transform="matrix(0.26113,0,-0.220403,0.255703,713.29596,-85.850775)" /> <path style="font-size:12px;fill:#ff0000;fill-rule:evenodd;stroke-width:1pt" d="M 642.16121,64.586857 C 606.48435,62.202631 629.35685,95.037197 629.67821,97.724085 C 629.99998,100.41097 610.94825,104.97989 618.96393,114.64855 C 632.19601,124.31725 693.2264,127.53947 692.2359,112.38342 C 691.2454,97.223187 642.9138,101.57645 632.45243,97.570644 C 629.00399,88.119567 628.55736,73.041403 633.78346,68.548785 C 636.84397,66.549706 636.40814,72.019759 642.16121,64.586857 z" id="path711" sodipodi:nodetypes="cccccsc" /> <path style="font-size:12px;fill:#ff0000;fill-rule:evenodd;stroke-width:10.78610039" d="M 669.74072,34.390532 C 664.48398,34.390532 653.88503,42.031612 646.0847,51.444467 C 639.65643,59.201621 637.1368,65.745104 639.3868,67.810322 C 646.33212,65.592565 656.79195,57.793375 664.85448,48.43956 C 668.52913,44.176371 671.14022,40.237085 672.62369,36.986075 C 672.51585,35.353721 671.58807,34.390532 669.74072,34.390532 z" id="path592" /> <rect style="font-size:12.000000;fill:url(#linearGradient643);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000002;stroke-width:1.9439127;" id="rect642" width="71.981430" height="73.806518" x="355.56149" y="751.56487" /> <path style="font-size:12.000000;fill-rule:evenodd;stroke:#000002;stroke-width:1.9439127;" d="M 355.86912,768.41833 L 355.86912,825.08081 L 426.31248,825.08081 L 421.69830,821.88448 C 413.18767,816.07293 415.69984,808.37265 406.01003,809.09909 C 396.62784,809.24438 372.43926,821.89222 368.33775,814.53095 C 363.45690,807.88664 365.01940,752.99455 361.12114,759.56548 L 355.86912,768.41833 z " id="path640" sodipodi:nodetypes="cccczcsc" /> <rect style="font-size:12.000000;fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:4.1028190;" id="rect615" width="57.240670" height="49.173893" x="519.27698" y="1042.7878" transform="matrix(0.859371,-0.511353,0.000000,1.000000,0.000000,0.000000)" /> <text xml:space="preserve" style="font-size:48.000000;font-weight:bold;fill:#000000;stroke-width:1.0000000pt;font-family:Verdana;fill-opacity:1.0000000;" x="709.86213" y="1342.1935" id="text610" sodipodi:linespacing="100%" transform="matrix(0.632720,-0.387288,0.000000,0.813305,0.000000,0.000000)"><tspan x="709.86212" y="1342.1935" sodipodi:role="line" id="tspan613" style="fill:#000000;fill-opacity:1.0000000;">LR</tspan></text> <rect style="font-size:12.000000;fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:4.1239262;" id="rect627" width="57.831149" height="49.173893" x="-632.70609" y="457.02159" transform="matrix(-0.862456,-0.506131,0.000000,1.000000,0.000000,0.000000)" /> <text xml:space="preserve" style="font-size:48.000000;font-weight:bold;stroke-width:1.0000000pt;font-family:Verdana;" x="-858.67939" y="596.71201" id="text628" sodipodi:linespacing="100%" transform="matrix(-0.632720,-0.387288,0.000000,0.813305,0.000000,0.000000)"><tspan x="-858.67938" y="596.71204" sodipodi:role="line" id="tspan629">LR</tspan></text> <rect style="font-size:12.000000;fill:url(#linearGradient1617);fill-rule:evenodd;stroke:#000000;stroke-width:0.77675028pt;" id="rect648" width="56.066268" height="49.173893" x="649.12604" y="1116.5706" transform="matrix(0.852907,-0.522062,0.000000,1.000000,0.000000,0.000000)" /> <rect style="font-size:12.000000;fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.77675028pt;" id="rect649" width="56.066268" height="49.173893" x="-761.52524" y="380.12168" transform="matrix(-0.852907,-0.522062,0.000000,1.000000,0.000000,0.000000)" /> <path style="font-size:12.000000;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.4003696;fill-opacity:1.0000000;stroke-opacity:1.0000000;" d="M 586.02954,781.20391 C 576.62200,796.60958 567.62949,793.58791 569.22048,807.83469 C 571.77988,813.49422 577.86711,800.59504 591.84007,797.41464 C 597.37391,793.56282 600.31377,785.36998 593.29271,770.69383 C 584.81901,757.01251 564.65506,775.58222 560.50467,790.68280 C 556.35428,805.45774 563.75581,807.31272 569.01296,805.97641" id="path646" sodipodi:nodetypes="ccczzc" /> <path style="font-size:12.000000;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:2.4003696;" d="M 618.03676,782.42607 C 627.44430,797.83174 636.43680,794.81007 634.84582,809.05685 C 632.28642,814.71638 626.19918,801.81720 612.22623,798.63680 C 606.69238,794.78498 603.75252,786.59214 610.77359,771.91599 C 619.24729,758.23467 639.41124,776.80439 643.56163,791.90496 C 647.71201,806.67990 640.31049,808.53488 635.05334,807.19857" id="path650" sodipodi:nodetypes="ccczzc" /> <path sodipodi:type="arc" style="font-size:12;fill:url(#radialGradient1158);fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="path1411" d="M 69.375000 165.000000 A 4.375000 4.375000 0 1 0 60.625000,165.000000 A 4.375 4.375 0 1 0 69.375 165 L 65.000000 165.000000 z" sodipodi:cx="65.000000" sodipodi:cy="165.000000" sodipodi:rx="4.375000" sodipodi:ry="4.375000" transform="matrix(6.282797,0.000000,0.000000,6.282797,-36.58204,-479.7863)" /> <path style="font-size:12;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:39.4622;stroke-linecap:round;stroke-linejoin:round;" d="M 550.91978,487.64604 L 629.84423,566.57049" id="path1413" sodipodi:nodetypes="cc" transform="matrix(0.398026,0.000000,0.000000,0.398026,176.0698,386.3398)" /> <path sodipodi:type="arc" style="font-size:12;fill:url(#radialGradient1203);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87645;stroke-dasharray:none;" id="path682" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(1.269231,0.000000,0.000000,1.209574,46.26003,-283.6018)" /> <path style="font-size:12;fill:url(#linearGradient683);fill-opacity:0.38017;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 390.66521,633.72235 C 371.44051,633.72235 354.98613,644.70534 347.51136,660.37076 C 353.42953,663.40271 360.03471,666.27491 367.81906,664.18848 C 382.43619,660.99617 387.00568,653.47068 394.31424,650.27839 C 409.63412,649.70584 416.97120,657.57598 432.07387,657.23344 C 423.97641,643.28339 408.56719,633.72236 390.66521,633.72235 z " id="path687" /> <text xml:space="preserve" style="fill:black;fill-opacity:1;stroke:none;font-family:Palatino Linotype;font-style:normal;font-weight:bold;font-size:48;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;text-anchor:start;writing-mode:lr;" x="127.75068" y="373.16888" id="text688" sodipodi:linespacing="100%" transform="scale(2.880225,1.909157)"><tspan x="127.75068" y="373.16888" sodipodi:role="line" id="tspan693">i</tspan></text> <path style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 496.33119,633.22307 L 496.33119,725.97164 C 523.77846,725.97164 546.04854,705.21602 546.04851,679.61336 C 546.04851,654.01069 523.77844,633.22305 496.33119,633.22307 z " id="path700" /> <path style="font-size:12;fill:url(#linearGradient639);fill-opacity:0.49999997;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 496.76745,633.22395 C 477.54275,633.22395 461.08837,644.20694 453.61360,659.87236 C 459.53177,662.90431 466.13695,665.77651 473.92130,663.69008 C 488.53843,660.49777 493.10792,652.97228 500.41648,649.77999 C 515.73636,649.20744 523.07344,657.07758 538.17611,656.73504 C 530.07865,642.78499 514.66943,633.22396 496.76745,633.22395 z " id="path697" /> <g id="g708" transform="matrix(1.262750,0.000000,0.000000,1.262750,-71.71251,-181.4823)" style=""> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect705" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect706" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> <g id="g711" transform="matrix(1.262750,0.000000,0.000000,1.262750,10.32260,-181.7613)" style=""> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect712" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect713" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> <g id="g721" transform="matrix(0.878674,-0.906901,0.906901,0.878674,-460.8343,623.7427)" style="font-size:12;"> <g id="g722"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect723" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect724" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> <g id="g725" transform="translate(64.96544,-0.220965)"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect726" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect727" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> </g> <g id="g728" transform="matrix(1.073491e-5,-1.262750,1.262750,1.073491e-5,-178.5732,1437.573)" style="font-size:12;"> <g id="g729"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect730" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect731" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> <g id="g732" transform="translate(64.96544,-0.220965)"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect733" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect734" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> </g> <g id="g735" transform="matrix(0.893911,0.891887,-0.891887,0.893911,758.6406,-462.3620)" style="font-size:12;"> <g id="g736"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect737" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect738" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> <g id="g739" transform="translate(64.96544,-0.220965)"> <rect style="font-size:12;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;" id="rect740" width="15.90990257" height="6.62912607" x="557.73045492" y="679.80529213" ry="3.31456304" /> <rect style="font-size:12;fill:url(#linearGradient703);fill-rule:evenodd;stroke-width:1pt;" id="rect741" width="12.47239814" height="1.37715197" x="559.37109430" y="680.06188965" ry="0.68857598" rx="1.69095615" /> </g> </g> <path style="font-size:12;fill:#e6e6e6;fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 683.81237,652.51288 C 671.83423,652.51288 661.58216,660.41352 656.92493,671.68248 C 660.61230,673.86352 664.72773,675.92965 669.57785,674.42877 C 678.68520,672.13237 681.53227,666.71889 686.08594,664.42251 C 695.63114,664.01065 700.20259,669.67205 709.61245,669.42564 C 704.56725,659.39064 694.96638,652.51289 683.81237,652.51288 z " id="path801" /> <path style="fill:#fb4100;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;" d="M 476.34114,554.66904 C 483.92112,533.01461 496.96853,549.86409 506.53666,550.82511 C 514.86216,550.34456 515.73201,524.39800 531.51319,528.72246 C 538.84464,531.28509 536.85645,548.74295 535.61383,558.03249 C 535.48959,568.60329 536.86193,580.71156 526.29423,589.74497 C 511.50642,601.90523 468.76115,575.84293 476.34114,554.66904 z " id="path760" sodipodi:nodetypes="ccccsz" /> <path style="font-size:12;stroke:#1c4ed9;stroke-width:10.9208;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216;fill:#4789f7;fill-opacity:1;" d="M -25.481958,248.26603 L 449.26700,273.43400 L 430.54500,310.73100 L -40.947002,275.21320 L -25.481958,248.26603 z " id="path279" transform="matrix(0.158157,4.271800e-2,5.364549e-3,0.156933,469.3436,553.4222)" sodipodi:nodetypes="ccccc" /> <path style="font-size:12;fill:url(#linearGradient967);fill-opacity:0.6993;stroke:#1c66fb;stroke-width:9.25243;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216;" d="M -49.210000,251.69600 C -50.453100,239.20100 -40.203100,227.28000 -26.572700,228.54900 L 168.87300,263.91600 L 168.28600,299.92400 L 253.04600,316.79000 L 253.93000,278.87900 L 343.03800,291.68700 C 354.24800,294.90300 361.40100,301.55900 364.49800,316.81800 L 362.20763,586.89881 L -28.092563,469.70606 L -49.210000,251.69600 z " id="path208" transform="matrix(0.171298,0.000000,6.402228e-2,0.215063,438.9690,493.7050)" sodipodi:nodetypes="ccccccccccc" /> <path style="font-size:12;fill-opacity:0.99;stroke:#0c1dfb;stroke-width:2.63195;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99;fill:url(#radialGradient1140);" d="M 557.37226,540.24997 C 557.04724,536.47774 559.72713,532.59711 563.29085,532.12238 L 643.91869,532.55043 C 646.84958,532.82956 648.71975,534.42669 649.52947,538.93308 L 649.45887,612.42139 L 641.22180,619.79126 L 564.84594,620.14154 L 557.39252,612.04259 L 557.37226,540.24997 z " id="path1131" sodipodi:nodetypes="ccccccccc" /> <path style="font-size:12;fill:url(#linearGradient1138);fill-opacity:0.6993;stroke:#1c2942;stroke-width:2.28142;stroke-opacity:0.99216;" d="M 582.66195,589.79239 L 627.14365,589.80274 L 627.52772,620.32722 L 582.36162,620.36346 L 582.66195,589.79239 z " id="path230" sodipodi:nodetypes="ccccc" /> <path style="font-size:12;fill:#ffffff;fill-opacity:0.99216;stroke:#1c2942;stroke-width:1.10123;stroke-opacity:0.99216;" d="M 568.04305,545.40016 L 562.27509,545.17995 L 562.26523,539.14553 L 568.02662,539.08853 L 568.04305,545.40016 z " id="path313" sodipodi:nodetypes="ccccc" /> <path style="font-size:12;fill-opacity:1;stroke:#0c5cff;stroke-width:2.20247;stroke-opacity:0.99216;fill:#fffffd;" d="M 572.55890,532.87597 L 635.43355,532.88839 L 635.97643,578.77497 L 572.13438,578.81877 L 572.55890,532.87597 z " id="path412" sodipodi:nodetypes="ccccc" /> <path style="font-size:12;fill:#1c2942;fill-opacity:0.992157;stroke-width:8.96855;" d="M 600.69196,615.30986 L 590.20322,615.52766 L 590.18460,593.72001 L 600.66094,593.93144 L 600.69196,615.30986 z " id="path415" sodipodi:nodetypes="ccccc" /> <path style="font-size:12;fill:#ffffff;fill-opacity:0.99216;stroke:#1c2942;stroke-width:1.10123;stroke-opacity:0.99216;" d="M 645.41453,544.95545 L 639.64657,544.73523 L 639.63671,538.70081 L 645.39810,538.64382 L 645.41453,544.95545 z " id="path420" sodipodi:nodetypes="ccccc" /> <path style="fill:#fb4100;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;" d="M 576.19524,551.65510 C 583.02443,538.35600 594.77948,548.70415 603.39989,549.29433 C 610.90075,548.99924 611.68442,533.06410 625.90249,535.71996 C 632.50774,537.29380 630.72141,567.64918 621.20046,573.19704 C 607.87739,580.66531 569.36604,564.65909 576.19524,551.65510 z " id="path1137" sodipodi:nodetypes="cccsz" /> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect1148" width="106.29921722" height="106.29921722" x="336.61416260" y="414.56689177" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 399.79349,29.478141 C 394.01003,37.897331 389.76933,44.313401 384.9431,55.360711 C 380.11687,66.790261 374.78829,95.058691 378.54786,99.703761 C 382.30743,104.34882 387.79639,101.28107 391.55595,97.166341 C 395.31552,93.051611 393.41107,72.114871 394.59733,63.001481 C 395.47109,53.888091 397.81554,44.448881 399.79349,29.478141 z" id="path1163" sodipodi:nodetypes="czzzzc" /> <path style="fill:url(#linearGradient2827);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 385.79975,61.950721 C 384.39977,66.053801 382.76808,68.876061 381.59981,74.259941 C 380.43155,79.830111 378.76345,93.606671 379.67351,95.870431 C 380.58358,98.134191 381.91227,96.639131 382.82233,94.633821 C 383.73239,92.628521 383.27139,82.425051 383.55854,77.983661 C 383.77005,73.542261 385.32096,69.246681 385.79975,61.950721 z" id="path1164" sodipodi:nodetypes="czzzzc" /> <path style="font-size:12px;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke-width:1pt" d="M 387.76969,122.16169 C 374.14929,118.58454 373.19714,111.18089 376.70862,106.18812 C 378.0326,104.78911 381.14608,102.64524 382.95355,102.77517 C 384.76102,102.90509 386.31925,103.82082 388.64051,105.48324 C 393.90804,109.43309 383.97808,111.14862 387.76969,122.16169 z" id="path1165" sodipodi:nodetypes="ccszc" /> <path style="font-size:12px;fill:url(#linearGradient2825);fill-rule:evenodd;stroke-width:1pt" d="M 383.31916,117.56095 C 380.06121,116.73931 378.52695,116.89671 376.51406,111.97105 C 374.50117,107.35789 379.50565,105.84217 380.09993,105.21645 C 380.69421,104.59072 381.56185,105.00397 382.15613,105.55826 C 382.75041,106.11254 382.44937,108.93289 382.63688,110.16053 C 382.775,111.38818 380.50651,113.51302 383.31916,117.56095 z" id="path1166" sodipodi:nodetypes="czzzzc" /> <path style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="path1178" d="M 455.50254,75.604101 C 456.32704,82.434381 433.36083,91.336801 432.43523,95.264781 C 430.53314,99.605271 445.41627,109.90975 441.38223,115.0509 C 438.80608,122.80077 399.07488,126.74456 389.83131,124.33877 C 388.67751,122.94637 388.47739,119.75952 390.59044,117.85443 C 396.23015,114.547 423.95938,117.37599 433.11584,112.39908 C 433.91914,110.30782 423.41753,99.787221 426.63857,94.222171 C 430.01582,87.365091 450.70407,80.206461 450.38751,76.172481 C 447.40747,71.620301 424.32171,64.457751 421.58361,60.527391 C 421.58361,60.527391 451.61221,69.886581 455.50254,75.604101 z" sodipodi:nodetypes="cccccccccc" /> <path style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 535.58083,29.120673 C 529.79737,37.539863 525.55667,43.955933 520.73044,55.003243 C 515.90421,66.432793 510.57563,94.701223 514.3352,99.346293 C 518.09477,103.99135 523.58373,100.9236 527.34329,96.808873 C 531.10286,92.694143 529.19841,71.757403 530.38467,62.644013 C 531.25843,53.530623 533.60288,44.091413 535.58083,29.120673 z" id="path1183" sodipodi:nodetypes="czzzzc" /> <path style="fill:url(#linearGradient2831);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 521.58709,61.593253 C 520.18711,65.696333 518.55542,68.518593 517.38715,73.902473 C 516.21889,79.472643 514.55079,93.249203 515.46085,95.512963 C 516.37092,97.776723 517.69961,96.281663 518.60967,94.276353 C 519.51973,92.271053 519.05873,82.067583 519.34588,77.626193 C 519.55739,73.184793 521.1083,68.889213 521.58709,61.593253 z" id="path1184" sodipodi:nodetypes="czzzzc" /> <path style="font-size:12px;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke-width:1pt" d="M 523.55702,121.80422 C 509.93663,118.22707 508.98448,110.82343 512.49595,105.83066 C 513.81993,104.43164 516.93341,102.28778 518.74088,102.4177 C 520.54835,102.54763 522.10658,103.46335 524.42784,105.12578 C 529.69537,109.07563 519.76541,110.79116 523.55702,121.80422 z" id="path1185" sodipodi:nodetypes="ccszc" /> <path style="font-size:12px;fill:url(#linearGradient2829);fill-rule:evenodd;stroke-width:1pt" d="M 519.1065,117.20348 C 515.84855,116.38184 514.31429,116.53924 512.3014,111.61358 C 510.28851,107.00042 515.29299,105.4847 515.88727,104.85898 C 516.48155,104.23325 517.34919,104.6465 517.94347,105.20079 C 518.53775,105.75507 518.23671,108.57542 518.42422,109.80306 C 518.56234,111.03071 516.29385,113.15555 519.1065,117.20348 z" id="path1186" sodipodi:nodetypes="czzzzc" /> <path style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="path1187" d="M 591.28988,75.246633 C 592.11438,82.076913 569.14817,90.979333 568.22257,94.907313 C 566.32048,99.247803 581.20361,109.55228 577.16957,114.69343 C 574.59342,122.4433 534.86222,126.38709 525.61865,123.9813 C 524.46485,122.5889 524.26473,119.40205 526.37778,117.49696 C 532.01749,114.18953 559.74672,117.01852 568.90318,112.04161 C 569.70648,109.95035 559.20487,99.429753 562.42591,93.864703 C 565.80316,87.007623 586.49141,79.848993 586.17485,75.815013 C 583.19481,71.262833 560.10905,64.100283 557.37095,60.169923 C 557.37095,60.169923 587.39955,69.529113 591.28988,75.246633 z" sodipodi:nodetypes="cccccccccc" /> <path style="font-size:12px;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#00de00;stroke-width:3.88089991;stroke-linecap:round;stroke-dasharray:7.76179, 7.76179;stroke-dashoffset:0" d="M 557.66559,66.516353 L 524.96189,118.44451" id="path1189" /> <path style="fill:#fb4100;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;" d="M 561.65094,448.09913 C 571.11508,425.70443 587.40564,443.12995 599.35212,444.12377 C 609.74708,443.62687 610.83312,416.79324 630.53703,421.26553 C 639.69082,423.91576 637.21526,475.03199 624.02079,484.37417 C 605.55720,496.95021 552.18679,469.99689 561.65094,448.09913 z " id="path1196" sodipodi:nodetypes="cccsz" /> <path style="font-size:12;fill:url(#radialGradient1140);fill-opacity:0.99;stroke:#0c1dfb;stroke-width:2.47208;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99;" d="M 555.37415,438.95253 C 566.02431,447.52015 591.18209,448.17514 604.56628,448.38069 C 617.95046,448.58624 641.07727,445.71069 647.53136,437.79076 L 639.22369,509.12451 C 628.37584,514.24774 616.58726,517.38839 602.91722,517.02493 C 589.24718,516.66148 572.12780,514.45376 562.84783,509.43353 L 555.37415,438.95253 z " id="path1199" sodipodi:nodetypes="czcczcc" /> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect983" width="106.29922" height="106.29922" x="229.68997" y="308.89271" /> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect984" width="106.29922" height="106.29922" x="335.98920" y="308.89271" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;" d="M 279.95280,346.67442 C 280.29433,345.98764 279.36877,338.54690 277.95386,336.62391 C 276.53895,334.70092 274.43956,335.54857 274.09803,336.23535 C 273.75651,336.92213 275.86774,336.00777 277.28264,337.93076 C 278.69755,339.85374 279.61128,347.36120 279.95280,346.67442 z " id="path1018" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.76453004pt;" d="M 273.63423,385.40914 C 270.65408,385.12172 270.05831,378.23536 267.98919,382.43631 C 265.82503,386.71235 270.28496,395.88181 270.67731,391.14244 C 270.97461,386.40309 276.51934,385.77163 273.63423,385.40914 z " id="path1019" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.90746355pt;" d="M 288.50077,346.53195 C 288.15924,345.84516 289.08480,338.40442 290.49971,336.48144 C 291.91461,334.55844 294.01401,335.40609 294.35554,336.09287 C 294.69706,336.77966 292.58583,335.86530 291.17093,337.78828 C 289.75602,339.71127 288.84229,347.21873 288.50077,346.53195 z " id="path1036" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.76453004pt;" d="M 294.81934,385.26667 C 297.79949,384.97925 298.39526,378.09288 300.46438,382.29384 C 302.62854,386.56988 298.16861,395.73934 297.77626,390.99997 C 297.47896,386.26061 291.93423,385.62916 294.81934,385.26667 z " id="path1037" sodipodi:nodetypes="czzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 409.23451,358.84667 C 408.54949,363.52087 396.22993,361.07089 396.03530,368.76520 C 395.84067,375.96034 411.64662,377.37220 417.55186,375.25440 C 423.45711,373.13660 427.32607,369.84225 426.71517,362.54762 C 426.10429,355.25299 424.14266,336.89820 402.58195,326.37323 C 381.45319,316.34743 357.52241,330.01251 349.87361,344.61299 C 342.22480,359.71267 341.61655,375.00482 350.68776,369.51396 C 359.32701,364.52225 369.86822,348.78540 385.68092,346.96694 C 401.06163,345.14847 409.91950,355.17081 409.23451,358.84667 z " id="path1045" sodipodi:nodetypes="czzzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0877723pt;fill-opacity:1.0000000;" d="M 373.63251,370.33086 C 372.33483,368.22505 372.73946,360.23826 365.81846,361.79098 C 358.89746,363.34369 351.38109,370.76217 349.29735,373.43628 C 347.21361,376.11041 348.32990,380.85478 349.29735,381.97618 C 350.26481,383.09758 355.77183,383.70140 357.33465,385.08158 C 358.89746,386.46177 362.54401,391.63747 364.47891,391.29243 C 366.41382,390.94738 370.35806,386.80682 370.50689,385.08160 C 370.65573,383.35636 374.93016,372.43670 373.63251,370.33086 z " id="path1049" sodipodi:nodetypes="czzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:none;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 369.80420,399.98508 C 370.22508,395.78373 374.95545,379.12917 375.72069,374.09587 C 376.48592,369.06258 373.57804,371.60003 374.80242,369.35376 C 376.02678,367.10748 380.15902,361.82463 383.06689,360.61829 C 385.97478,359.41197 390.10702,360.11025 392.24966,361.23339 C 394.39230,362.35653 395.73146,366.10916 395.92276,367.35707 C 396.11406,368.60500 394.43057,370.01932 393.39750,369.60335 C 392.36444,369.18737 394.01446,362.68044 391.51002,364.68476 C 389.00558,366.86555 385.84845,370.56008 384.21474,372.09919 C 382.90569,373.63828 386.12783,372.84795 386.74001,374.09587 C 387.35219,375.34380 388.50003,377.42367 387.88785,379.58674 C 387.27565,381.74980 384.63561,385.70156 383.06689,387.07427 C 381.49816,388.44699 380.12076,385.78476 378.47552,387.82304 C 376.83027,389.86131 374.60431,398.21199 373.22688,400.16706 L 369.80420,399.98508 z " id="path1050" sodipodi:nodetypes="czzzzzzzzzzzzcc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;fill-opacity:1.0000000;stroke-dasharray:none;" d="M 368.64815,355.65182 C 369.07734,357.32494 370.41856,361.26175 371.38424,362.14751 C 372.34992,363.03329 374.41542,363.29574 374.76413,362.14751 C 375.11285,360.99928 372.77913,355.22533 378.62686,352.10871 C 384.63554,348.99209 394.02411,349.71383 396.97480,351.12452 C 399.92548,352.53519 404.88802,357.78424 400.19374,361.36016 C 396.30418,364.93605 405.74639,365.03448 407.75823,363.52538 C 409.77007,362.01628 412.69261,356.42939 410.09064,353.73925 C 407.48867,351.04912 400.89223,344.62204 394.77625,343.96592 C 388.66028,343.30978 374.03986,350.59961 372.02803,351.12452 C 369.85526,351.64942 368.21896,353.97868 368.64815,355.65182 z " id="path1051" sodipodi:nodetypes="czzzzzzzzzz" /> <g id="g1422"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.1655209pt;" d="M 500.15302,318.39576 C 498.63090,318.58535 497.62728,319.44559 497.45659,321.35308 L 496.27180,334.48360 L 495.12787,321.15593 C 494.44510,313.52598 480.11544,322.81032 474.82299,326.00594 C 463.97441,332.55643 453.12906,348.90299 453.12904,365.27921 C 453.12904,369.37327 450.53202,374.85695 458.19505,375.61014 C 471.12797,372.25560 475.71395,368.40706 475.88521,364.72718 C 475.97004,366.73597 472.22575,370.99591 477.19257,377.85771 C 471.88006,374.61864 449.68734,372.98113 454.59982,385.78334 C 460.64344,396.79407 487.30926,400.22178 487.52886,393.43295 C 487.74845,386.64413 493.79077,380.76155 483.19824,381.13048 C 485.89452,378.43241 492.43160,379.68832 495.12787,376.99022 L 496.31266,372.81053 L 497.66087,376.55648 C 500.35715,379.25456 506.64909,378.23526 509.34537,380.93333 C 500.48613,379.72791 504.79515,386.40754 505.01475,393.19637 C 505.23437,399.98518 531.94102,396.59692 537.98464,385.58618 C 542.89711,372.78397 520.66354,374.42148 515.35103,377.66055 C 520.31782,370.79874 516.57357,366.49938 516.65839,364.49060 C 516.82967,368.17046 521.41564,372.05845 534.34856,375.41298 C 542.01160,374.65978 539.45542,369.17610 539.45542,365.08206 C 539.45542,348.70583 528.61005,332.35928 517.76147,325.80879 C 513.79214,323.41205 504.71936,317.82698 500.15302,318.39576 z " id="path1060" sodipodi:nodetypes="cccccccccccccccccccccccc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt;" d="M 501.66595,339.08941 C 507.48057,336.85763 507.44235,336.64611 505.77764,338.68995 C 504.31721,340.73379 502.98053,336.92565 501.65049,348.68951 C 500.11618,360.84766 495.64707,341.51834 501.66595,339.08941 z " id="path1057" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt;" d="M 491.59647,339.30071 C 485.78186,337.06892 485.82008,336.85741 487.48479,338.90125 C 488.94522,340.94509 490.28190,337.13695 491.61194,348.90080 C 493.14625,361.05897 497.61536,341.72965 491.59647,339.30071 z " id="path1059" sodipodi:nodetypes="czzz" /> </g> <path sodipodi:type="arc" style="font-size:12;fill:url(#radialGradient983);fill-opacity:0.50000000;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none;" id="path1065" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(1.269231,0.000000,0.000000,1.209574,153.7331,-282.7179)" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt;" id="rect1074" width="42.038873" height="31.251435" x="577.48017" y="355.15182" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 590.00000,364.23718 C 600.00000,365.07051 608.75000,368.82051 614.37500,377.36218 C 620.00000,386.52885 619.37500,387.36218 619.37500,387.36218 C 619.37500,387.36218 620.62500,396.11218 608.75000,397.36218 C 596.87500,397.98718 583.56694,385.77747 569.81694,385.77747 C 556.69194,385.77747 551.87500,383.73242 553.75000,372.36218 C 555.62500,360.55000 569.06250,334.86218 591.87500,334.23718 C 614.68750,332.98718 635.31250,340.38301 643.75000,355.48718 C 651.56250,370.59135 647.81250,382.36218 643.12500,386.11218 C 638.43750,389.86218 627.70833,384.86218 619.37500,386.73718" id="path1067" sodipodi:nodetypes="czzzzzzzzz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 605.62500,385.48718 C 598.12500,382.98718 595.00000,382.98718 588.12500,376.73718 C 581.25000,370.48718 580.00000,364.23718 580.00000,364.23718" id="path1068" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 597.50000,334.86218 C 598.12500,347.36218 604.92417,355.07014 602.71447,365.23480" id="path1069" sodipodi:nodetypes="cc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 610.90476,341.83916 C 625.49682,341.59591 628.11190,344.21099 630.20397,355.19433 C 635.95715,352.05623 638.95397,353.81615 640.20397,366.31615" id="path1070" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 620.21706,362.57924 C 620.21706,362.57924 610.95580,381.48089 620.33080,380.85589 C 629.70580,380.23089 626.05002,380.28181 628.70167,379.17696" id="path1071" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 565.74009,361.50702 C 565.74009,361.50702 568.88733,353.92082 576.86459,349.47516 C 584.84184,345.55251 590.33862,342.77797 590.55959,337.25370 L 589.89668,342.92311 C 589.16881,349.14804 598.53331,356.11130 595.55959,362.81588" id="path1072" sodipodi:nodetypes="czczz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 606.88925,334.11254 C 612.15464,344.40283 608.33289,359.63174 612.31037,370.45931" id="path1073" sodipodi:nodetypes="cc" /> <g id="g1132" transform="matrix(1.069142,0.000000,0.000000,1.032969,-32.93548,-15.76150)"> <g id="g1107" transform="matrix(0.841944,0.000000,0.000000,0.873445,74.35371,56.03641)"> <g id="g1099" transform="translate(1.325825,9.280777)"> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.65628657pt;" d="M 496.65430,493.31750 C 496.65430,484.55800 490.15222,466.98787 483.70730,461.72195 C 477.26238,456.45602 464.41541,456.46624 457.98479,461.72195 C 451.55416,466.97766 445.12353,484.49668 445.12353,493.25619 C 445.12353,502.01571 451.55416,510.77522 457.98479,514.27903 C 464.41541,517.78283 477.26238,517.77261 483.70730,514.27903 C 490.15222,510.78544 496.65430,502.07702 496.65430,493.31750 z " id="path1075" sodipodi:nodetypes="czzzzzz" /> <g id="g1093"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.60115390pt;" d="M 471.91942,460.57627 C 471.83583,460.57625 471.75443,460.59340 471.67084,460.59426 L 471.67084,460.61224 C 471.60863,460.60733 471.54725,460.59423 471.48442,460.59426 C 471.33798,460.59430 471.19580,460.62750 471.04941,460.63023 L 471.04941,460.70216 C 470.96017,460.69182 470.87062,460.68420 470.78013,460.68418 C 470.71728,460.68416 470.65591,460.69725 470.59369,460.70216 L 470.59369,460.68418 C 470.51011,460.68333 470.42871,460.66617 470.34512,460.66619 C 465.94290,460.66736 461.53595,461.88424 458.60004,464.29896 C 457.13209,465.50632 448.73018,475.46378 451.55713,477.17551 C 458.59260,481.68638 464.69200,468.40765 458.18575,479.42351 C 457.53016,483.20728 457.36165,485.18018 457.31574,486.16752 C 457.22303,484.35884 456.45624,480.11665 452.42714,478.05673 C 449.06128,476.37130 446.85496,491.25894 446.85496,493.27120 C 446.85496,501.32028 452.72823,509.36640 458.60004,512.58603 C 461.57796,514.21889 466.06655,515.00265 470.53155,514.97790 L 470.53155,514.99589 C 470.75985,514.99753 470.98688,514.98046 471.21513,514.97790 L 471.21513,514.88798 C 471.38776,514.89378 471.55999,514.90723 471.73299,514.90597 L 471.73299,514.88798 C 476.19799,514.91273 480.68658,514.12899 483.66451,512.49611 C 489.53631,509.27648 495.40958,501.23035 495.40958,493.18128 C 495.40958,491.16902 493.20325,476.28138 489.83741,477.96681 C 485.80830,480.02673 485.04151,484.26892 484.94880,486.07760 C 484.90289,485.09026 484.73439,483.11735 484.07879,479.33359 C 477.57255,468.31773 483.67194,481.59646 490.70741,477.08559 C 493.53436,475.37386 485.13245,465.41639 483.66451,464.20904 C 480.72859,461.79432 476.32164,460.57744 471.91942,460.57627 z " id="path1076" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.60115390pt;" d="M 468.10796,477.26953 C 468.34963,476.84360 467.69470,472.22898 466.69350,471.03637 C 465.69229,469.84376 464.20675,470.36946 463.96508,470.79539 C 463.72341,471.22132 465.21734,470.65425 466.21853,471.84686 C 467.21974,473.03946 467.86630,477.69546 468.10796,477.26953 z " id="path1077" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.50646687pt;" d="M 463.63689,501.29214 C 461.52811,501.11389 461.10654,496.84308 459.64241,499.44844 C 458.11103,502.10037 461.26692,507.78711 461.54455,504.84784 C 461.75492,501.90857 465.67842,501.51695 463.63689,501.29214 z " id="path1078" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.60115390pt;" d="M 474.15658,477.18117 C 473.91491,476.75523 474.56985,472.14061 475.57105,470.94801 C 476.57224,469.75540 478.05780,470.28110 478.29947,470.70703 C 478.54113,471.13296 477.04720,470.56589 476.04601,471.75849 C 475.04481,472.95110 474.39824,477.60710 474.15658,477.18117 z " id="path1079" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.50646687pt;" d="M 478.62766,501.20378 C 480.73643,501.02553 481.15801,496.75472 482.62213,499.36008 C 484.15351,502.01201 480.99763,507.69875 480.72000,504.75948 C 480.50963,501.82021 476.58613,501.42859 478.62766,501.20378 z " id="path1080" sodipodi:nodetypes="czzz" /> </g> </g> <g id="g1088" transform="matrix(0.528836,0.000000,0.000000,0.528836,234.0955,290.1247)"> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:1.2724125pt;" d="M 448.76081,243.24146 C 439.85333,243.24406 424.56825,250.36055 418.62774,255.70706 C 406.74669,266.40004 400.09103,294.23271 400.09103,312.05436 C 400.09103,317.48652 400.10693,322.81569 400.33616,327.94505 L 494.99693,327.94505 C 495.23807,322.86048 495.28292,317.60716 495.28292,312.21208 C 495.28288,294.39046 491.62713,267.53611 479.71970,256.82234 C 473.76599,251.46545 457.66829,243.23886 448.76081,243.24146 z " id="path1084" sodipodi:nodetypes="cccccccc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.1655209pt;" d="M 452.30358,246.20459 C 450.78146,246.39418 449.77784,247.25442 449.60715,249.16191 L 448.42236,262.29243 L 447.27843,248.96476 C 446.59566,241.33481 432.26600,250.61915 426.97355,253.81477 C 416.12497,260.36526 405.27962,276.71182 405.27960,293.08804 C 405.27960,297.18210 402.68258,302.66578 410.34561,303.41897 C 423.27853,300.06443 427.86451,296.21589 428.03577,292.53601 C 428.12060,294.54480 424.37631,298.80474 429.34313,305.66654 C 424.03062,302.42747 401.83790,300.78996 406.75038,313.59217 C 412.79400,324.60290 439.45982,328.03061 439.67942,321.24178 C 439.89901,314.45296 445.94133,308.57038 435.34880,308.93931 C 438.04508,306.24124 444.58216,307.49715 447.27843,304.79905 L 448.46322,300.61936 L 449.81143,304.36531 C 452.50771,307.06339 458.79965,306.04409 461.49593,308.74216 C 452.63669,307.53674 456.94571,314.21637 457.16531,321.00520 C 457.38493,327.79401 484.09158,324.40575 490.13520,313.39501 C 495.04767,300.59280 472.81410,302.23031 467.50159,305.46938 C 472.46838,298.60757 468.72413,294.30821 468.80895,292.29943 C 468.98023,295.97929 473.56620,299.86728 486.49912,303.22181 C 494.16216,302.46861 491.60598,296.98493 491.60598,292.89089 C 491.60598,276.51466 480.76061,260.16811 469.91203,253.61762 C 465.94270,251.22088 456.86992,245.63581 452.30358,246.20459 z " id="path1085" sodipodi:nodetypes="cccccccccccccccccccccccc" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt;" d="M 453.81651,266.89824 C 459.63113,264.66646 459.59291,264.45494 457.92820,266.49878 C 456.46777,268.54262 455.13109,264.73448 453.80105,276.49834 C 452.26674,288.65649 447.79763,269.32717 453.81651,266.89824 z " id="path1086" sodipodi:nodetypes="czzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.98194113pt;" d="M 443.74703,267.10954 C 437.93242,264.87775 437.97064,264.66624 439.63535,266.71008 C 441.09578,268.75392 442.43246,264.94578 443.76250,276.70963 C 445.29681,288.86780 449.76592,269.53848 443.74703,267.10954 z " id="path1087" sodipodi:nodetypes="czzz" /> </g> </g> <g id="g1126" transform="matrix(0.495484,0.000000,0.000000,0.495484,300.5956,311.9146)"> <path style="fill-rule:evenodd;stroke:none;stroke-width:0.91963024pt;" d="M 390.65866,301.36656 L 482.41318,302.01909 L 481.02775,293.60154 C 479.75571,289.61717 475.40700,285.24242 474.55998,280.76456 C 473.27101,276.28670 479.48325,279.16416 478.73371,271.80959 C 477.98416,264.45501 476.57776,244.93064 465.94662,234.62235 C 455.00298,224.62656 445.86383,218.21008 426.46718,221.36127 C 408.32053,223.26246 397.91045,231.92586 390.51069,247.21043 C 382.91955,262.49500 391.32345,281.51355 391.08480,288.64061 L 390.65866,301.36656 z " id="path1121" sodipodi:nodetypes="ccczzzzzzc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 456.91427,260.35297 C 456.22925,265.02717 443.90969,262.57719 443.71506,270.27150 C 443.52043,277.46664 459.32638,278.87850 465.23162,276.76070 C 471.13687,274.64290 475.00583,271.34855 474.39493,264.05392 C 473.78405,256.75929 471.82242,238.40450 450.26171,227.87953 C 429.13295,217.85373 405.20217,231.51881 397.55337,246.11929 C 389.90456,261.21897 389.29631,276.51112 398.36752,271.02026 C 407.00677,266.02855 417.54798,250.29170 433.36068,248.47324 C 448.74139,246.65477 457.59926,256.67711 456.91427,260.35297 z " id="path1122" sodipodi:nodetypes="czzzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0877723pt;fill-opacity:1.0000000;" d="M 421.31227,271.83716 C 420.01459,269.73135 420.41922,261.74456 413.49822,263.29728 C 406.57722,264.84999 399.06085,272.26847 396.97711,274.94258 C 394.89337,277.61671 396.00966,282.36108 396.97711,283.48248 C 397.94457,284.60388 403.45159,285.20770 405.01441,286.58788 C 406.57722,287.96807 410.22377,293.14377 412.15867,292.79873 C 414.09358,292.45368 418.03782,288.31312 418.18665,286.58790 C 418.33549,284.86266 422.60992,273.94300 421.31227,271.83716 z " id="path1123" sodipodi:nodetypes="czzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:none;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 417.48396,301.49138 C 417.90484,297.29003 422.63521,280.63547 423.40045,275.60217 C 424.16568,270.56888 421.25780,273.10633 422.48218,270.86006 C 423.70654,268.61378 427.83878,263.33093 430.74665,262.12459 C 433.65454,260.91827 437.78678,261.61655 439.92942,262.73969 C 442.07206,263.86283 443.41122,267.61546 443.60252,268.86337 C 443.79382,270.11130 442.11033,271.52562 441.07726,271.10965 C 440.04420,270.69367 441.69422,264.18674 439.18978,266.19106 C 436.68534,268.37185 433.52821,272.06638 431.89450,273.60549 C 430.58545,275.14458 433.80759,274.35425 434.41977,275.60217 C 435.03195,276.85010 436.17979,278.92997 435.56761,281.09304 C 434.95541,283.25610 432.31537,287.20786 430.74665,288.58057 C 429.17792,289.95329 427.80052,287.29106 426.15528,289.32934 C 424.51003,291.36761 422.28407,299.71829 420.90664,301.67336 L 417.48396,301.49138 z " id="path1124" sodipodi:nodetypes="czzzzzzzzzzzzcc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.1391397pt;fill-opacity:1.0000000;" d="M 416.32791,257.15812 C 416.75710,258.83124 418.09832,262.76805 419.06400,263.65381 C 420.02968,264.53959 422.09518,264.80204 422.44389,263.65381 C 422.79261,262.50558 420.45889,256.73163 426.30662,253.61501 C 432.31530,250.49839 441.70387,251.22013 444.65456,252.63082 C 447.60524,254.04149 452.56778,259.29054 447.87350,262.86646 C 443.98394,266.44235 453.42615,266.54078 455.43799,265.03168 C 457.44983,263.52258 460.37237,257.93569 457.77040,255.24555 C 455.16843,252.55542 448.57199,246.12834 442.45601,245.47222 C 436.34004,244.81608 421.71962,252.10591 419.70779,252.63082 C 417.53502,253.15572 415.89872,255.48498 416.32791,257.15812 z " id="path1125" sodipodi:nodetypes="czzzzzzzzzz" /> </g> </g> <rect style="fill:url(#linearGradient701);fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.75000000000000000;stroke-dasharray:none" id="rect1204" width="91.25" height="30" x="-214.68277" y="57.132778" ry="12.5" transform="scale(-1,1)" /> <path style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ff0000;stroke-width:5;stroke-dasharray:none;stroke-opacity:1" d="M 785.96002,98.902159 C 785.96002,113.04716 774.48002,124.52716 760.33502,124.52716 C 746.19002,124.52716 734.71002,113.04716 734.71002,98.902159 C 734.71002,84.757159 746.19002,73.277159 760.33502,73.277159 C 774.48002,73.277159 785.96002,84.757159 785.96002,98.902159 z" id="path1291" /> <path sodipodi:nodetypes="czzzzc" id="path1294" d="M 773.36975,26.31038 C 767.58629,34.72957 763.34559,41.14564 758.51936,52.19295 C 753.69313,63.6225 748.36455,91.89093 752.12412,96.536 C 755.88369,101.18106 761.37265,98.11331 765.13221,93.99858 C 768.89178,89.88385 766.98733,68.94711 768.17359,59.83372 C 769.04735,50.72033 771.3918,41.28112 773.36975,26.31038 z" style="fill:#9999ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> <path sodipodi:nodetypes="czzzzc" id="path1295" d="M 759.37601,58.78296 C 757.97603,62.88604 756.34434,65.7083 755.17607,71.09218 C 754.00781,76.66235 752.33971,90.43891 753.24977,92.70267 C 754.15984,94.96643 755.48853,93.47137 756.39859,91.46606 C 757.30865,89.46076 756.84765,79.25729 757.1348,74.8159 C 757.34631,70.3745 758.89722,66.07892 759.37601,58.78296 z" style="fill:url(#linearGradient3608);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> <path sodipodi:nodetypes="ccszc" id="path1296" d="M 761.34595,118.99393 C 747.72556,115.41678 746.7734,108.01313 750.28488,103.02037 C 751.60886,101.62135 754.72234,99.47749 756.52981,99.60741 C 758.33728,99.73734 759.89551,100.65306 762.21677,102.31548 C 767.4843,106.26534 757.55434,107.98087 761.34595,118.99393 z" style="font-size:12px;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke-width:1pt" /> <path sodipodi:nodetypes="czzzzc" id="path1297" d="M 756.89542,114.39319 C 753.63747,113.57155 752.10321,113.72895 750.09032,108.80329 C 748.07743,104.19013 753.08191,102.67441 753.67619,102.04869 C 754.27047,101.42296 755.13811,101.83621 755.73239,102.3905 C 756.32667,102.94478 756.02563,105.76513 756.21314,106.99277 C 756.35126,108.22042 754.08277,110.34526 756.89542,114.39319 z" style="font-size:12px;fill:url(#linearGradient3604);fill-rule:evenodd;stroke-width:1pt" /> <rect style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ff0000;stroke-width:4.56593418" id="rect1303" width="48.979599" height="47.110672" x="774.80969" y="53.56987" /> <path style="fill:#cccccc;fill-rule:nonzero;stroke:none;fill-opacity:1.0000000;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;" id="path1142" d="M 154.48440,498.48337 C 154.25849,492.81414 161.38338,496.65143 161.80515,496.90392 C 164.78182,498.61634 170.39318,504.14280 173.95269,504.05991 C 175.95558,503.84576 177.63390,502.63440 179.05959,501.28272 C 180.33976,499.99776 181.20682,498.58127 182.06397,497.00066 C 183.44438,494.70321 187.18348,487.99384 189.77932,488.11380 C 192.16403,488.34388 196.44293,490.85911 198.63874,491.77507 C 200.34301,492.48848 203.47991,491.83913 205.21157,492.48524 C 206.51580,492.94214 202.88897,499.07531 204.26060,499.25768 C 205.40017,499.35058 206.09747,498.86094 206.93516,498.11576 C 207.57391,497.51451 211.51747,500.31315 210.70090,501.08164 C 208.56717,502.98125 206.27814,503.85683 203.40943,503.55889 C 201.58416,503.29953 199.79391,502.83223 198.06231,502.20168 C 196.27903,501.51624 194.58389,500.64017 192.82470,499.89873 C 191.28048,499.25617 189.66739,498.59467 187.99351,498.39461 C 187.36694,498.35913 187.14450,498.30179 186.79211,498.84177 C 185.67318,500.80361 184.50376,502.56949 182.88013,504.16267 C 180.31823,506.51125 177.42085,508.14583 173.89191,508.33224 C 169.23300,508.20987 162.04502,509.96482 156.25203,500.75392 C 155.96788,500.55562 159.95745,495.74444 159.84831,498.48337 L 154.48440,498.48337 z " sodipodi:nodetypes="ccccccccccccccccccccc" /> <rect style="fill:#f9bac0;fill-rule:evenodd;stroke:#000000;stroke-width:0.49504948pt;" id="rect1120" width="12.250767" height="12.000593" x="141.62668" y="387.23074" ry="3.9226213" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <rect style="fill:url(#linearGradient1118);fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;" id="rect1117" width="53.347649" height="11.244847" x="150.89017" y="387.60864" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750000;" d="M 153.76675,391.00825 L 202.40725,390.74674 L 202.40725,390.74674" id="path1126" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.93750000;" d="M 153.76675,395.58464 L 202.40725,395.32313 L 202.40725,395.32313" id="path1128" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <path style="fill:#e49415;fill-rule:evenodd;stroke-width:1.0000000pt;fill-opacity:1.0000000;" d="M 204.76083,387.08564 L 226.72751,392.93844 L 205.02234,399.37652 L 204.76083,387.08564 z " id="path1129" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <path style="fill:#040023;fill-rule:evenodd;stroke-width:1.0000000pt;" d="M 219.01301,390.87754 L 227.25053,392.93225 L 219.11108,395.19241 L 219.01301,390.87754 z " id="path1132" transform="matrix(0.801814,-0.889705,0.948595,0.752036,-334.0009,328.3647)" /> <g id="g1195" transform="matrix(0.789807,0.000000,0.000000,0.829148,40.60222,144.2242)"> <path sodipodi:type="arc" style="font-size:12;fill:url(#radialGradient1169);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87645;stroke-dasharray:none;" id="path1190" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(1.269231,0.000000,0.000000,1.209574,-184.6799,-194.3941)" /> <path style="font-size:12;fill:url(#linearGradient683);fill-opacity:0.38017;fill-rule:evenodd;stroke:none;stroke-width:1pt;" d="M 159.72524,722.93003 C 140.50054,722.93003 124.04616,733.91302 116.57139,749.57844 C 122.48956,752.61039 129.09474,755.48259 136.87909,753.39616 C 151.49622,750.20385 156.06571,742.67836 163.37427,739.48607 C 178.69415,738.91352 186.03123,746.78366 201.13390,746.44112 C 193.03644,732.49107 177.62722,722.93004 159.72524,722.93003 z " id="path1191" /> <text xml:space="preserve" style="fill:black;fill-opacity:1;stroke:none;font-family:Palatino Linotype;font-style:normal;font-weight:bold;font-size:48;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;text-anchor:start;writing-mode:lr;" x="47.569456" y="419.89508" id="text1192" sodipodi:linespacing="100%" transform="scale(2.880225,1.909157)"><tspan x="47.569454" y="419.89508" sodipodi:role="line" id="tspan1193">i</tspan></text> </g> <path style="fill:#fb4100;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;" d="M 157.91689,807.80962 C 166.13755,791.78371 180.28774,804.25361 190.66459,804.96480 C 199.69378,804.60921 200.63712,785.40677 217.75218,788.60718 C 225.70328,790.50372 223.55297,827.08308 212.09209,833.76845 C 196.05440,842.76799 149.69621,823.47991 157.91689,807.80962 z " id="path1179" sodipodi:nodetypes="cccsz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 135.72268,361.98087 C 134.67665,364.33444 139.37290,364.60684 143.68234,366.31209 C 147.99177,368.01734 152.43742,371.67846 155.07429,372.44119 C 160.34804,373.96665 169.84949,374.44608 173.64136,373.48722 C 177.43323,372.52836 177.12814,369.56460 177.82549,365.64199" id="path1135" sodipodi:nodetypes="cszzz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 163.44255,357.27376 C 158.21239,350.47455 167.88818,351.25907 168.41121,347.07494 C 171.02628,336.87613 161.08898,335.30708 161.08898,335.30708 C 161.08898,335.30708 167.10367,327.72334 168.67271,323.53921 C 163.44255,317.78603 163.96556,318.57056 155.85881,322.23167" id="path1138" sodipodi:nodetypes="ccccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 169.19573,382.90152 C 169.80591,375.31778 164.40140,374.66401 162.13500,373.48722" id="path1141" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 135.59193,366.63075 C 138.73003,373.95298 150.19280,376.35013 155.46655,377.87559" id="path1153" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 163.44255,357.27376 C 158.21239,350.47455 167.88818,351.25907 168.41121,347.07494 C 171.02628,336.87613 161.08898,335.30708 161.08898,335.30708 C 161.08898,335.30708 167.10367,327.72334 168.67271,323.53921 C 163.44255,317.78603 163.96556,318.57056 155.85881,322.23167" id="path1167" sodipodi:nodetypes="ccccc" transform="matrix(-1.000000,0.000000,0.000000,1.000000,355.9476,-0.390884)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 169.19573,382.90152 C 169.80591,375.31778 164.40140,374.66401 162.13500,373.48722" id="path1169" sodipodi:nodetypes="cz" transform="matrix(-1.000000,0.000000,0.000000,1.000000,355.9476,-0.390884)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 135.59193,366.63075 C 138.73003,373.95298 150.19280,376.35013 155.46655,377.87559" id="path1170" sodipodi:nodetypes="cz" transform="matrix(-1.000000,0.000000,0.000000,1.000000,355.9476,-0.390884)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 220.21273,361.50548 C 221.25876,363.85905 216.56251,364.13145 212.25307,365.83670 C 207.94364,367.54195 203.49799,371.20307 200.86112,371.96580 C 195.58737,373.49126 186.08592,373.97069 182.29405,373.01183 C 178.50218,372.05297 177.49973,366.73564 177.84841,362.29001" id="path1194" sodipodi:nodetypes="cszzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 140.95285,349.68999 C 133.28195,370.78498 141.91171,361.71936 146.70603,361.98087" id="path1195" sodipodi:nodetypes="cz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 214.47932,349.22398 C 222.15022,370.31897 213.52046,361.25335 208.72614,361.51486" id="path1218" sodipodi:nodetypes="cz" /> <g id="g1278" transform="matrix(0.605285,0.000000,0.000000,0.597196,215.4523,158.0050)" style=""> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;fill-opacity:1.0000000;stroke-dasharray:none;" d="M 804.64950,250.44849 C 797.35720,250.48469 789.33209,251.98524 784.49454,257.96913 C 780.93740,262.11537 778.38323,267.02039 775.64377,271.69315 C 773.68125,276.21594 769.46739,297.45551 769.30129,304.87537 C 770.14526,316.85318 776.63805,328.66066 786.98642,334.95250 C 795.22467,338.99769 804.89497,338.64881 813.70686,337.08266 C 821.45161,335.53674 827.62366,329.95749 831.57563,323.32749 C 837.11921,314.80704 839.26003,304.08986 836.74694,294.17684 C 835.76180,288.84411 831.92018,270.31405 828.52987,266.57056 C 824.89455,259.95461 819.93817,253.06220 812.07514,251.41397 C 809.65774,250.76162 807.15196,250.45235 804.64950,250.44849 z " id="path1255" sodipodi:nodetypes="ccccccccccc" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 800.13750,250.65056 C 801.18353,251.26075 803.25316,249.31320 803.64542,263.39105 C 804.03768,277.46890 803.99154,332.67692 804.34021,335.11767 C 804.68888,337.29691 802.01036,338.15546 798.99628,337.91766" id="path1256" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 807.42479,250.62195 C 806.37876,251.23214 804.30913,249.28459 803.91687,263.36244 C 803.52461,277.44029 804.49532,333.01814 804.14665,335.45889 C 803.79798,337.63813 806.66142,337.94193 809.67549,337.70414" id="path1257" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 817.70960,290.28376 C 809.84745,280.10959 810.70190,277.13212 818.95501,270.89040 C 813.26525,268.19968 813.19141,265.32450 823.17748,259.01761" id="path1258" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.7000000;stroke-dasharray:none;" d="M 787.90305,291.30471 C 795.76520,281.13054 794.91075,278.15307 786.65764,271.91135 C 792.34740,269.22063 792.42124,266.34545 782.43517,260.03856" id="path1259" sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 799.72669,293.23848 C 796.52152,297.49150 789.40232,292.22145 787.89219,291.20442 C 786.38206,290.18739 784.19391,295.08761 779.75597,293.60830 C 775.50295,292.12899 776.05768,287.87597 776.05768,287.87597" id="path1260" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 802.03812,301.75908 C 797.90838,303.42330 787.64564,300.37222 786.13551,299.35519 C 784.62538,298.33816 782.43723,303.23838 777.99929,301.75907 C 773.74627,300.27976 771.52729,289.36983 771.52729,289.36983" id="path1261" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 792.23767,329.12637 C 782.56051,317.10695 791.52883,320.52786 791.86785,314.51815 C 792.57669,308.87827 798.04822,307.90662 793.98280,308.72802 C 790.96976,309.36580 788.07711,304.71769 779.29369,308.60089" id="path1262" sodipodi:nodetypes="czsz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 807.30819,291.84436 C 810.51336,296.09738 817.63256,290.82733 819.14269,289.81030 C 820.65282,288.79327 822.84097,293.69349 827.27891,292.21418 C 831.53193,290.73487 830.97720,286.48185 830.97720,286.48185" id="path1263" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 804.99676,300.36496 C 809.12650,302.02918 819.38924,298.97810 820.89937,297.96107 C 822.40950,296.94404 824.59765,301.84426 829.03559,300.36495 C 833.28861,298.88564 835.50759,287.97571 835.50759,287.97571" id="path1264" sodipodi:nodetypes="czzz" /> <path style="fill:none;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:1.7000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 814.79721,327.73225 C 824.47437,315.71283 815.50605,319.13374 815.16703,313.12403 C 814.45819,307.48415 808.98666,306.51250 813.05208,307.33390 C 816.06512,307.97168 818.95777,303.32357 827.74119,307.20677" id="path1265" sodipodi:nodetypes="czsz" /> </g> <rect style="font-size:12;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;" id="rect1342" width="106.29922" height="106.29922" x="678.02699" y="257.57566" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt;" id="rect1300" width="42.038873" height="31.251435" x="577.48017" y="355.15182" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 585.39981,368.71772 C 595.39981,369.55105 611.65089,374.39889 615.88182,379.14146 C 620.11275,384.31923 621.65174,382.78809 623.97519,388.42080 C 625.83395,393.88440 626.66596,396.13459 614.79096,397.38459 C 602.91596,398.00959 579.84943,391.38777 567.95818,382.48985 C 556.06694,374.46233 550.94562,372.94946 552.82062,361.57922 C 554.69562,349.76704 569.06250,334.86218 591.87500,334.23718 C 614.68750,332.98718 635.31250,340.38301 643.75000,355.48718 C 651.56250,370.59135 648.46967,378.29310 643.78217,382.04310 C 639.09467,385.79310 631.44519,384.45036 623.11186,386.32536" id="path1301" sodipodi:nodetypes="czzzzzzzzz" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 611.66596,385.50959 C 604.16596,383.00959 590.35311,382.60170 583.47811,376.35170" id="path1302" sodipodi:nodetypes="cc" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 592.66063,336.86850 C 598.86190,345.30503 604.92417,355.07014 602.71447,365.23480" id="path1303" sodipodi:nodetypes="cc" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 609.51069,344.81342 C 624.10275,344.57017 628.11190,344.21099 630.20397,355.19433 C 635.95715,352.05623 638.95397,353.81615 640.20397,366.31615" id="path1304" sodipodi:nodetypes="ccc" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 620.21706,362.57924 C 620.21706,362.57924 610.95580,381.48089 620.33080,380.85589 C 629.70580,380.23089 626.05002,380.28181 628.70167,379.17696" id="path1305" sodipodi:nodetypes="ccc" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 565.74009,361.50702 C 565.74009,361.50702 574.14469,356.44952 582.12195,352.00386 C 590.09920,348.08121 587.55049,347.42089 587.77146,341.89662 L 591.98094,350.60103 C 595.33715,357.54102 598.53331,356.11130 595.55959,362.81588" id="path1306" sodipodi:nodetypes="czczz" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;" d="M 601.31298,337.74082 C 614.47809,348.72995 606.47413,361.56650 612.31037,373.07050" id="path1307" sodipodi:nodetypes="cc" transform="matrix(0.562759,-0.218675,0.000000,0.600895,376.0347,349.5343)" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0903397;" d="M 707.72710,418.48163 C 703.50641,414.69683 702.27080,417.21075 699.44787,417.57363" id="path1387" sodipodi:nodetypes="cc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0903397;" d="M 725.11736,413.48274 C 719.32763,412.83604 715.73844,415.08845 712.91551,415.45133" id="path1389" sodipodi:nodetypes="cc" /> <path style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0903397;" d="M 699.48958,421.09685 C 695.79191,420.95903 688.54161,427.33639 686.24170,435.60327" id="path1390" sodipodi:nodetypes="cc" /> <path style="font-size:12px;fill:url(#linearGradient2823);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 41.242273,25.859958 C 22.017573,25.859958 5.5631927,36.842948 -1.9115773,52.508368 C 4.0065927,55.540318 10.611773,58.412518 18.396123,56.326088 C 33.013253,53.133778 37.582743,45.608288 44.891303,42.415998 C 60.211183,41.843448 67.548263,49.713588 82.650933,49.371048 C 74.553473,35.420998 59.144253,25.859968 41.242273,25.859958 z" id="path1561" /> <path sodipodi:type="arc" style="font-size:12;fill:url(#radialGradient983);fill-opacity:0.50000000;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none;" id="path1574" sodipodi:cx="271.35836792" sodipodi:cy="796.11926270" sodipodi:rx="37.42873764" sodipodi:ry="37.42873764" d="M 308.787106 796.119263 A 37.428738 37.428738 0 1 0 233.929630,796.119263 A 37.4287 37.4287 0 1 0 308.787 796.119 L 271.358368 796.119263 z" transform="matrix(0.484769,0.000000,0.000000,0.461984,554.2006,323.4255)" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;fill-opacity:1.0000000;" id="rect1280" width="69.963570" height="45.246185" x="128.72227" y="535.48883" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt;" id="rect1278" width="42.038872" height="31.251434" x="158.54723" y="572.81548" transform="matrix(-0.578460,0.000000,0.000000,0.578460,265.2767,219.3138)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:4.1057291;" d="M 163.87618,583.27959 C 173.87618,584.11292 182.62618,587.86292 188.25118,596.40459 C 193.87618,605.57126 193.25118,606.40459 193.25118,606.40459 C 193.25118,606.40459 194.50118,615.15459 182.62618,616.40459 C 170.75118,617.02959 157.44312,604.81988 143.69312,604.81988 C 130.56812,604.81988 125.75118,602.77483 127.62618,591.40459 C 129.50118,579.59241 142.93868,553.90459 165.75118,553.27959 C 188.56368,552.02959 209.18868,559.42542 217.62618,574.52959 C 225.43868,589.63376 221.68868,601.40459 217.00118,605.15459 C 212.31368,608.90459 201.58451,603.90459 193.25118,605.77959" id="path1279" sodipodi:nodetypes="czzzzzzzzz" transform="matrix(-0.578460,0.000000,0.000000,0.578460,265.2767,219.3138)" /> <g id="g1249" transform="translate(-9.414290,-1.046033)" style=""> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;stroke-dasharray:none;" id="rect1289" width="69.963570" height="45.246185" x="128.72227" y="535.48883" transform="matrix(-1.000000,0.000000,0.000000,1.000000,355.1279,42.36432)" /> <rect style="fill:#9999ff;fill-rule:evenodd;stroke-width:0.84895535pt;" id="rect1291" width="42.038872" height="31.251434" x="158.54723" y="572.81548" transform="matrix(0.578460,0.000000,0.000000,0.578460,89.85120,261.6781)" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:4.1057290;stroke-dasharray:none;" d="M 163.87618,583.27959 C 173.87618,584.11292 182.62618,587.86292 188.25118,596.40459 C 193.87618,605.57126 193.25118,606.40459 193.25118,606.40459 C 193.25118,606.40459 194.50118,615.15459 182.62618,616.40459 C 170.75118,617.02959 157.44312,604.81988 143.69312,604.81988 C 130.56812,604.81988 125.75118,602.77483 127.62618,591.40459 C 129.50118,579.59241 142.93868,553.90459 165.75118,553.27959 C 188.56368,552.02959 209.18868,559.42542 217.62618,574.52959 C 225.43868,589.63376 221.68868,601.40459 217.00118,605.15459 C 212.31368,608.90459 201.58451,603.90459 193.25118,605.77959" id="path1292" sodipodi:nodetypes="czzzzzzzzz" transform="matrix(0.578460,0.000000,0.000000,0.578460,89.85120,261.6781)" /> </g> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;" id="rect1268" width="69.963570" height="45.246185" x="128.72227" y="535.48883" transform="matrix(-1.000000,0.000000,0.000000,1.000000,254.4474,140.4299)" /> <path sodipodi:type="arc" style="fill:#9999ff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000pt;" id="path1285" sodipodi:cx="88.389725" sodipodi:cy="698.28027" sodipodi:rx="18.305565" sodipodi:ry="18.305565" d="M 106.69529 698.28027 A 18.305565 18.305565 0 1 0 70.084160,698.28027 A 18.305565 18.305565 0 1 0 106.69529 698.28027 z" transform="translate(3.138097,1.046032)" /> <rect style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;" id="rect1290" width="69.963570" height="45.246185" x="-120.45193" y="551.95033" transform="scale(-1.000000,1.000000)" /> <path style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-opacity:1.0000000;stroke-width:2.5000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 51.673228,577.76346 L 120.04088,577.76346" id="path1299" /> <path style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-opacity:1.0000000;stroke-width:2.5000000;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.75;stroke-dasharray:none;" d="M 88.241974,551.52936 L 87.447001,596.44531" id="path1300" sodipodi:nodetypes="cc" /> <rect style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.3750000;" id="rect1301" width="69.963570" height="45.246185" x="-120.25873" y="552.13202" transform="scale(-1.000000,1.000000)" /> <rect style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000pt;" id="rect1302" width="8.9940901" height="9.2751551" x="83.195328" y="573.14581" /> <path style="font-size:12.000000;fill:url(#linearGradient968);fill-opacity:0.70196003;stroke:#1c66f9;stroke-width:1.9242834;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99000001;" d="M 37.920277,322.15339 C 38.332250,320.95292 39.768025,319.75197 40.999014,319.93377 L 78.169327,327.96556 C 81.048244,325.43887 85.262603,322.36297 89.606623,323.13302 L 95.922292,324.00942 L 103.90333,325.57660 C 108.56248,326.97946 112.24447,329.89321 112.63056,335.69148 L 112.58162,405.54600 L 37.627148,381.65255 L 37.920277,322.15339 z " id="path1266" sodipodi:nodetypes="cccccccccc" /> <path style="font-size:12.000000;fill:#4789f7;stroke:#1c4ed9;stroke-width:1.7125434;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216002;" d="M 37.528348,381.35197 L 112.74823,405.58198 L 109.98730,410.63535 L 35.227003,384.92024 L 37.528348,381.35197 z " id="path1271" sodipodi:nodetypes="ccccc" /> <g id="g1279" transform="matrix(0.688750,0.000000,0.000000,0.640474,44.12231,204.0360)"> <path style="fill-rule:evenodd;stroke:none;stroke-width:0.91963024pt;" d="M 15.411826,279.67519 L 107.16635,280.32772 L 105.78092,271.91017 C 104.50888,267.92580 100.16017,263.55105 99.313146,259.07319 C 98.024176,254.59533 104.23642,257.47279 103.48688,250.11822 C 102.73733,242.76364 101.33093,223.23927 90.699786,212.93098 C 79.756146,202.93519 70.616996,196.51871 51.220346,199.66990 C 33.073696,201.57109 22.663616,210.23449 15.263856,225.51906 C 7.6727159,240.80363 16.076616,259.82218 15.837966,266.94924 L 15.411826,279.67519 z " id="path1273" sodipodi:nodetypes="ccczzzzzzc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 81.667436,238.66160 C 80.982416,243.33580 68.662856,240.88582 68.468226,248.58013 C 68.273596,255.77527 84.079546,257.18713 89.984786,255.06933 C 95.890036,252.95153 99.758996,249.65718 99.148096,242.36255 C 98.537216,235.06792 96.575586,216.71313 75.014876,206.18816 C 53.886116,196.16236 29.955336,209.82744 22.306536,224.42792 C 14.657726,239.52760 14.049476,254.81975 23.120686,249.32889 C 31.759936,244.33718 42.301146,228.60033 58.113846,226.78187 C 73.494556,224.96340 82.352426,234.98574 81.667436,238.66160 z " id="path1274" sodipodi:nodetypes="czzzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.0877723pt;fill-opacity:1.0000000;" d="M 46.065436,250.14579 C 44.767756,248.03998 45.172386,240.05319 38.251386,241.60591 C 31.330386,243.15862 23.814016,250.57710 21.730276,253.25121 C 19.646536,255.92534 20.762826,260.66971 21.730276,261.79111 C 22.697736,262.91251 28.204756,263.51633 29.767576,264.89651 C 31.330386,266.27670 34.976936,271.45240 36.911836,271.10736 C 38.846746,270.76231 42.790986,266.62175 42.939816,264.89653 C 43.088656,263.17129 47.363086,252.25163 46.065436,250.14579 z " id="path1275" sodipodi:nodetypes="czzzzzzz" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:none;stroke-width:1.0507082pt;fill-opacity:1.0000000;" d="M 42.237126,279.80001 C 42.658006,275.59866 47.388376,258.94410 48.153616,253.91080 C 48.918846,248.87751 46.010966,251.41496 47.235346,249.16869 C 48.459706,246.92241 52.591946,241.63956 55.499816,240.43322 C 58.407706,239.22690 62.539946,239.92518 64.682586,241.04832 C 66.825226,242.17146 68.164386,245.92409 68.355686,247.17200 C 68.546986,248.41993 66.863496,249.83425 65.830426,249.41828 C 64.797366,249.00230 66.447386,242.49537 63.942946,244.49969 C 61.438506,246.68048 58.281376,250.37501 56.647666,251.91412 C 55.338616,253.45321 58.560756,252.66288 59.172936,253.91080 C 59.785116,255.15873 60.932956,257.23860 60.320776,259.40167 C 59.708576,261.56473 57.068536,265.51649 55.499816,266.88920 C 53.931086,268.26192 52.553686,265.59969 50.908446,267.63797 C 49.263196,269.67624 47.037236,278.02692 45.659806,279.98199 L 42.237126,279.80001 z " id="path1276" sodipodi:nodetypes="czzzzzzzzzzzzcc" /> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.8750000;fill-opacity:1.0000000;stroke-dasharray:none;" d="M 41.081076,235.46675 C 41.510266,237.13987 42.851486,241.07668 43.817166,241.96244 C 44.782846,242.84822 46.848346,243.11067 47.197056,241.96244 C 47.545776,240.81421 45.212056,235.04026 51.059786,231.92364 C 57.068466,228.80702 66.457036,229.52876 69.407726,230.93945 C 72.358406,232.35012 77.320946,237.59917 72.626666,241.17509 C 68.737106,244.75098 78.179316,244.84941 80.191156,243.34031 C 82.202996,241.83121 85.125536,236.24432 82.523566,233.55418 C 79.921596,230.86405 73.325156,224.43697 67.209176,223.78085 C 61.093206,223.12471 46.472786,230.41454 44.460956,230.93945 C 42.288186,231.46435 40.651886,233.79361 41.081076,235.46675 z " id="path1277" sodipodi:nodetypes="czzzzzzzzzz" /> </g> <path style="font-size:12.000000;fill:url(#linearGradient967);fill-opacity:0.69929999;stroke:#1c66fb;stroke-width:1.7758849;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.99216002;" d="M 17.536640,337.89268 C 16.523741,335.20546 17.516336,332.64170 19.932441,332.91461 L 55.676174,340.52075 L 57.880936,348.26473 L 73.479955,351.89199 L 71.204233,343.73873 L 87.288253,346.49326 C 89.414399,347.18490 91.065826,348.61636 92.573252,351.89801 L 109.47210,409.98240 L 35.111516,384.77857 L 17.536640,337.89268 z " id="path1272" sodipodi:nodetypes="ccccccccccc" /> <g id="g1317"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:2.0770884;" d="M 472.42571,238.27147 C 472.33405,238.27145 472.24478,238.29291 472.15311,238.29398 L 472.15311,238.31648 C 472.08489,238.31034 472.01758,238.29395 471.94867,238.29398 C 471.78809,238.29403 471.63216,238.33557 471.47163,238.33899 L 471.47163,238.42899 C 471.37376,238.41606 471.27556,238.40652 471.17632,238.40649 C 471.10740,238.40647 471.04010,238.42285 470.97187,238.42899 L 470.97187,238.40649 C 470.88021,238.40543 470.79094,238.38396 470.69928,238.38399 C 465.87162,238.38545 461.03877,239.90805 457.81913,242.92943 C 456.20932,244.44011 446.99543,256.89920 450.09559,259.04098 C 457.81097,264.68512 464.49982,248.07035 457.36480,261.85375 C 456.64585,266.58811 456.46107,269.05668 456.41072,270.29207 C 456.30905,268.02898 455.46815,262.72102 451.04967,260.14359 C 447.35854,258.03472 444.93899,276.66261 444.93899,279.18042 C 444.93899,289.25168 451.37986,299.31925 457.81913,303.34776 C 461.08484,305.39084 466.00722,306.37150 470.90372,306.34054 L 470.90372,306.36305 C 471.15408,306.36510 471.40305,306.34374 471.65336,306.34054 L 471.65336,306.22803 C 471.84267,306.23528 472.03155,306.25211 472.22127,306.25053 L 472.22127,306.22803 C 477.11777,306.25899 482.04015,305.27835 485.30586,303.23524 C 491.74513,299.20674 498.18600,289.13916 498.18600,279.06791 C 498.18600,276.55010 495.76645,257.92220 492.07532,260.03107 C 487.65684,262.60851 486.81594,267.91647 486.71427,270.17956 C 486.66392,268.94417 486.47914,266.47559 485.76018,261.74124 C 478.62517,247.95784 485.31402,264.57260 493.02940,258.92847 C 496.12956,256.78669 486.91567,244.32759 485.30586,242.81691 C 482.08622,239.79554 477.25337,238.27293 472.42571,238.27147 z " id="path1267" transform="matrix(1.033174,0.000000,0.000000,0.909383,216.4479,268.3863)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.70418520pt;" d="M 468.24591,259.15861 C 468.51094,258.62567 467.79271,252.85171 466.69475,251.35949 C 465.59679,249.86726 463.96768,250.52503 463.70265,251.05797 C 463.43764,251.59090 465.07594,250.88137 466.17389,252.37359 C 467.27185,253.86581 467.98090,259.69155 468.24591,259.15861 z " id="path1270" sodipodi:nodetypes="czzzz" transform="matrix(1.033174,0.000000,0.000000,0.909383,216.4479,268.3863)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.59326982pt;" d="M 463.34275,289.21648 C 461.03017,288.99344 460.56786,283.64967 458.96224,286.90958 C 457.28286,290.22776 460.74374,297.34319 461.04820,293.66548 C 461.27890,289.98777 465.58157,289.49777 463.34275,289.21648 z " id="path1278" sodipodi:nodetypes="czzz" transform="matrix(1.033174,0.000000,0.000000,0.909383,216.4479,268.3863)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.68256974pt;" d="M 708.64967,503.43717 C 708.37585,502.95253 709.11791,497.70179 710.25229,496.34479 C 711.38666,494.98778 713.06983,495.58594 713.34365,496.07058 C 713.61745,496.55524 711.92480,495.90999 710.79043,497.26699 C 709.65604,498.62400 708.92347,503.92182 708.64967,503.43717 z " id="path1283" sodipodi:nodetypes="czzzz" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.57505898pt;" d="M 710.57739,531.81732 C 712.96669,531.61449 713.44433,526.75496 715.10322,529.71946 C 716.83831,532.73696 713.26262,539.20762 712.94806,535.86317 C 712.70970,532.51872 708.26430,532.07312 710.57739,531.81732 z " id="path1284" sodipodi:nodetypes="czzz" /> </g> <g id="g1329" transform="translate(-104.0802,-97.80402)"> <path style="fill:#9999ff;fill-rule:evenodd;stroke:#000000;stroke-width:1.8718444;" d="M 841.03523,592.70109 C 835.90467,592.76390 830.22818,593.56676 826.67923,597.28291 C 823.87668,600.24935 817.50896,615.99836 816.60602,618.30168 C 815.09992,624.27793 814.05854,630.78886 816.99244,636.56898 C 819.81959,643.25189 825.72828,649.72836 833.94116,650.75621 C 839.37129,651.44267 845.09032,651.35874 850.31458,649.72833 C 856.42815,647.71665 860.44343,642.53509 863.07436,637.37323 C 865.55779,632.40703 865.94287,626.74320 864.51563,621.47197 C 863.89507,618.11627 856.12574,599.89965 853.80199,597.15457 C 850.54532,594.03086 845.67202,592.69881 841.03523,592.70109 z " id="path1288" sodipodi:nodetypes="cccccccccc" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.63460236pt;" d="M 838.07247,610.64237 C 839.95513,610.18459 838.75317,605.01626 837.71507,603.73449 C 836.67696,602.45272 829.77408,601.13926 832.78769,603.68422 C 836.03445,606.02046 835.95665,611.10014 838.07247,610.64237 z " id="path1289" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.53464689pt;" d="M 835.74471,629.37680 C 833.55820,629.18522 829.82379,631.67928 828.30569,634.47943 C 826.71786,637.32962 829.99008,643.44151 830.27794,640.28249 C 830.49606,637.12348 837.86149,629.61842 835.74471,629.37680 z " id="path1290" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.63460231pt;" d="M 842.27092,610.67154 C 840.38825,610.21376 841.59021,605.04542 842.62832,603.76366 C 843.66642,602.48189 850.56930,601.16843 847.55570,603.71338 C 844.30893,606.04963 844.38672,611.12931 842.27092,610.67154 z " id="path1293" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> <path style="fill-rule:evenodd;stroke:#000000;stroke-width:0.53464689pt;" d="M 844.89363,628.76239 C 847.08014,628.57081 850.81456,631.06487 852.33265,633.86502 C 853.92048,636.71521 850.64827,642.82710 850.36040,639.66808 C 850.14228,636.50907 842.77686,629.00401 844.89363,628.76239 z " id="path1310" sodipodi:nodetypes="czzz" transform="translate(-3.661113,-7.322226)" /> </g> <path sodipodi:type="arc" style="font-size:12px;fill:url(#radialGradient704);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.87644994;stroke-dasharray:none" id="path1268" sodipodi:cx="271.35837" sodipodi:cy="796.11926" sodipodi:rx="37.428738" sodipodi:ry="37.428738" d="M 308.78711,796.11926 A 37.428738,37.428738 0 1 1 233.92963,796.11926 A 37.428738,37.428738 0 1 1 308.78711,796.11926 z" transform="matrix(1.269231,0,0,1.209574,540.73332,-885.28294)" /> <path style="font-size:12px;fill:url(#linearGradient1110);fill-opacity:0.38016998;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 885.13854,32.041206 C 865.91384,32.041206 849.45946,43.024196 841.98469,58.689616 C 847.90286,61.721566 854.50804,64.593766 862.29239,62.507336 C 876.90952,59.315026 881.47901,51.789536 888.78757,48.597246 C 904.10745,48.024696 911.44453,55.894836 926.5472,55.552296 C 918.44974,41.602246 903.04052,32.041216 885.13854,32.041206 z" id="path1269" /> <text xml:space="preserve" style="font-size:53.10573959px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial Black" x="727.4552" y="110.45654" id="text1284" sodipodi:linespacing="100%" transform="scale(1.1590137,0.8628026)"><tspan x="727.4552" y="110.45654" sodipodi:role="line" id="tspan1287">3D</tspan></text> <path style="font-size:12px;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt" d="M 862.36154,831.74143 L 862.36154,924.49 C 889.80881,924.49 912.07889,903.73438 912.07886,878.13172 C 912.07886,852.52905 889.80879,831.74141 862.36154,831.74143 z " id="path3207" /> <g id="g4179"> <path transform="matrix(1.269231,0,0,1.209574,-252.0699,-51.3724)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path3205" style="font-size:12px;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> <path sodipodi:nodetypes="csccccccc" id="path2293" d="M 121.04942,876.41746 C 115.9942,876.41746 85.290278,896.93033 69.807528,903.81184 C 65.343898,905.79576 131.15987,906.55128 131.15987,906.55128 L 82.62969,924.35764 L 92.74016,875.04774 L 51.091495,891.29811 L 65.441938,915.45446 L 113.97211,928.4668 L 82.951128,953.93266" style="fill:none;fill-rule:evenodd;stroke:red;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path3209" d="M 92.371567,865.47065 C 73.146867,865.47065 56.692487,876.45364 49.217717,892.11906 C 55.135887,895.15101 61.741067,898.02321 69.525417,895.93678 C 84.142547,892.74447 88.712037,885.21898 96.020597,882.02669 C 111.34048,881.45414 118.67756,889.32428 133.78023,888.98174 C 125.68277,875.03169 110.27355,865.47066 92.371567,865.47065 z " style="font-size:12px;fill:url(#linearGradient3271);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" /> <path transform="matrix(1.269231,0,0,1.209574,-254.2131,-49.87948)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path3267" style="font-size:12px;fill:url(#radialGradient3289);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> </g> <g id="g4185" transform="matrix(0.587317,0,0,0.587317,135.8273,373.3777)"> <path transform="matrix(1.269231,0,0,1.209574,-252.0699,-51.3724)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4187" style="font-size:12px;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> <path sodipodi:nodetypes="csccccccc" id="path4189" d="M 121.04942,876.41746 C 115.9942,876.41746 85.290278,896.93033 69.807528,903.81184 C 65.343898,905.79576 131.15987,906.55128 131.15987,906.55128 L 82.62969,924.35764 L 92.74016,875.04774 L 51.091495,891.29811 L 65.441938,915.45446 L 113.97211,928.4668 L 82.951128,953.93266" style="fill:none;fill-rule:evenodd;stroke:red;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path4191" d="M 92.371567,865.47065 C 73.146867,865.47065 56.692487,876.45364 49.217717,892.11906 C 55.135887,895.15101 61.741067,898.02321 69.525417,895.93678 C 84.142547,892.74447 88.712037,885.21898 96.020597,882.02669 C 111.34048,881.45414 118.67756,889.32428 133.78023,888.98174 C 125.68277,875.03169 110.27355,865.47066 92.371567,865.47065 z " style="font-size:12px;fill:url(#linearGradient4195);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" /> <path transform="matrix(1.269231,0,0,1.209574,-254.2131,-49.87948)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4193" style="font-size:12px;fill:url(#radialGradient4197);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> </g> <g id="g4199" transform="matrix(0.75239,0,0,0.75239,212.8041,226.4211)"> <path transform="matrix(1.269231,0,0,1.209574,-252.0699,-51.3724)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4201" style="font-size:12px;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> <path sodipodi:nodetypes="csccccccc" id="path4203" d="M 121.04942,876.41746 C 115.9942,876.41746 85.290278,896.93033 69.807528,903.81184 C 65.343898,905.79576 131.15987,906.55128 131.15987,906.55128 L 82.62969,924.35764 L 92.74016,875.04774 L 51.091495,891.29811 L 65.441938,915.45446 L 113.97211,928.4668 L 82.951128,953.93266" style="fill:none;fill-rule:evenodd;stroke:red;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path4205" d="M 92.371567,865.47065 C 73.146867,865.47065 56.692487,876.45364 49.217717,892.11906 C 55.135887,895.15101 61.741067,898.02321 69.525417,895.93678 C 84.142547,892.74447 88.712037,885.21898 96.020597,882.02669 C 111.34048,881.45414 118.67756,889.32428 133.78023,888.98174 C 125.68277,875.03169 110.27355,865.47066 92.371567,865.47065 z " style="font-size:12px;fill:url(#linearGradient4209);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" /> <path transform="matrix(1.269231,0,0,1.209574,-254.2131,-49.87948)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4207" style="font-size:12px;fill:url(#radialGradient4211);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> </g> <g id="g4213" transform="matrix(0.355527,0,0,1.090014,324.7627,-82.64672)"> <path transform="matrix(1.269231,0,0,1.209574,-252.0699,-51.3724)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4215" style="font-size:12px;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> <path sodipodi:nodetypes="csccccccc" id="path4217" d="M 121.04942,876.41746 C 115.9942,876.41746 85.290278,896.93033 69.807528,903.81184 C 65.343898,905.79576 131.15987,906.55128 131.15987,906.55128 L 82.62969,924.35764 L 92.74016,875.04774 L 51.091495,891.29811 L 65.441938,915.45446 L 113.97211,928.4668 L 82.951128,953.93266" style="fill:none;fill-rule:evenodd;stroke:red;stroke-width:2.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> <path id="path4219" d="M 92.371567,865.47065 C 73.146867,865.47065 56.692487,876.45364 49.217717,892.11906 C 55.135887,895.15101 61.741067,898.02321 69.525417,895.93678 C 84.142547,892.74447 88.712037,885.21898 96.020597,882.02669 C 111.34048,881.45414 118.67756,889.32428 133.78023,888.98174 C 125.68277,875.03169 110.27355,865.47066 92.371567,865.47065 z " style="font-size:12px;fill:url(#linearGradient4223);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1pt" /> <path transform="matrix(1.269231,0,0,1.209574,-254.2131,-49.87948)" d="M 308.78711 796.11926 A 37.428738 37.428738 0 1 1 233.92963,796.11926 A 37.428738 37.428738 0 1 1 308.78711 796.11926 z" sodipodi:ry="37.428738" sodipodi:rx="37.428738" sodipodi:cy="796.11926" sodipodi:cx="271.35837" id="path4221" style="font-size:12px;fill:url(#radialGradient4225);fill-opacity:0.5;fill-rule:evenodd;stroke:none;stroke-width:1.875;stroke-dasharray:none" sodipodi:type="arc" /> </g> <flowRoot xml:space="preserve" id="flowRoot4227" style="font-size:36px;font-weight:bold;fill:navy" transform="translate(33.72834,142.0141)"><flowRegion id="flowRegion4229"><rect id="rect4231" width="361.5441" height="35.503513" x="42.604218" y="822.77283" style="font-size:36px;font-weight:bold;fill:navy" /></flowRegion><flowPara id="flowPara4233">A B C D</flowPara></flowRoot> <rect style="fill:url(#linearGradient3613);fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.75;stroke-dasharray:none" id="rect3611" width="91.25" height="30" x="-216.6974" y="113.70129" ry="12.5" transform="scale(-1,1)" /> <path sodipodi:type="arc" style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:2.78699993999999980;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" id="path3615" sodipodi:cx="133.34541" sodipodi:cy="168.70491" sodipodi:rx="6.5046539" sodipodi:ry="10.732679" d="M 139.85007,168.70491 A 6.5046539,10.732679 0 1 1 126.84076,168.70491 A 6.5046539,10.732679 0 1 1 139.85007,168.70491 z" transform="matrix(1.0175006,0,0,0.8287883,-2.3336285,26.932865)" /> <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 69.5998,-4.6441188 L 35.125132,-15.702031" id="path3621" /> <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 101.4726,-7.2459804 L 111.22959,-37.637817 L 121.63703,-8.5469113 L 101.4726,-7.2459804 z" id="path3625" /> <path style="fill:#ff0000;fill-rule:evenodd;stroke:none;stroke-width:0.80189854px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 148.33682,165.27754 L 155.34262,135.45182 C 155.34262,135.45182 161.4727,167.76301 160.59697,169.00575 C 160.59697,169.00575 157.49655,165.13261 155.57225,164.45262 C 153.64794,163.7726 148.33682,165.27754 148.33682,165.27754 z" id="path3627" sodipodi:nodetypes="ccczc" /> <path style="fill:#ff0000;fill-rule:evenodd;stroke:none;stroke-width:0.80189854px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M 207.91289,165.27754 L 214.91869,135.45182 C 214.91869,135.45182 221.04877,167.76301 220.17304,169.00575 C 220.17304,169.00575 217.07262,165.13261 215.14832,164.45262 C 213.22401,163.7726 207.91289,165.27754 207.91289,165.27754 z" id="path3629" sodipodi:nodetypes="ccczc" /> </svg> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/autocontrast.png�����������������������������������������������0000664�0001750�0001750�00000002507�11036663642�021702� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������!-���sBIT|dˆ��� pHYs��n��nKšc���tEXtSoftware�www.inkscape.org›ю<��ФIDATH‰…•]lSeЧџчэщщщзквuДeЋ…Ќ,Jк™‘Ќ|м,Ъзд($ФЙ3Fš wФ(\l7\•Ђ‚™bаY"У\‚Hlun0ЫњБгі|ДчуѕЂыF?ІOђцœѓœї§§ŸїyŸѓ†RŠеЌЛ;ёЬњѕёAЋеВХщtZZ<n]W AШцŠEa6•šЛ<6інзŠR|Иƒi&pрРщPЁ0qfѓцчz{zb-ЁPУѓ–š9В,сдЉѓаДEifцffІ_П{їчR=‹­wьиёЦ[ыж…=њ^аяЌDТдЮу8 …!gcЭО}dлЦ›їLLќўЫЊлЗПz~їю—w иŸжУWv!@Г(•ŠPJEя† =—z{З|:>ўыБ­[_|spppчоНіzhѕоdьіЪ3Ѕ@&›„ ,Та5”J"nпžЖј|Ўw}ОР ѓ7–СОО­Ч|Хб,j†ЬfРR{ Х4ВйGЅTU†ЊЪXX0јіір7 УЌЇ”Ъ,�„BkЮ8qМус™L<8д›І– Њ%ЈЊ Y (…Ѕ5$иееuР aцй§ћ_ъ…|АX*Qr\х:;Л€у Ÿ—šžAЎ,• 20™L;†БВсp8бппяЉ|llŸqљ‚�IV Š2(ЅЈ–5ЅЊЊ@SЈš]WkФгщДгd2ѕ2ёxќТЭ›7X–]Z\њi О‡,х!Ы$I€,WGВ$@’ШOјu]Ћ „ ‰|ТЖЖЖЊpMЇ8ю/мјmЊfћšVMCmJЊОz8�†BHqЙ\žЊѓкЕ‡џЛ Є^IMЉ&їѕЦВl+!Wu<пзŽDšЖ’[uЉRД&‚šЊ€xО6›<я„Щd^а4-ЭІгщyMгРВ,иЕ3 ŸЯ‚ЁЁo—ЪPпяFЙЬB‘-P+ХEiСƒ*Ьf+Ьf+!0 хВYЮЃ\.Т0ŒЋL8~gddфd,Ћй^2™Т‡ЦL2‰‹‡рtкkо—Ы@4ƒaААX „…Ў—Ё(HRV+CччgћШєєєхбббъЌГs-†‡пFwїS ЙЅа4€чАйжРщlƒЫ€гйЛ} xОkзЖu]'”в?Яž={'•J5€м.†‡п‡нn­Ћ@з–Е€уlАй<pЙАZнр8М^ УЅ”Ъ�nнКЕїаЁCЩf•`6Г „4ј+%@AЉ]WAЉJ)xžKнЛ7ё�Ъ–щуЩЩЩ†††„f"ѕFHeЈЊ‚RЉQЬ@ц!ŠYxН-ЅTjvŸ(f%р‰v=55ѕe<OpЗћ№сУЎџЈvWEЩCгDЈЊBXtvЖ—сбЩdђЮехЩеўR‘HdO"‘˜Мџ>§?kk[Gню Лh4кѓИЃ#ВЅžз АдЬ›6mњъШ‘#џ\П~н(‹ №ХХEъїћi,ЯGЃнŸ07c5§щЏЄ‚y:МрѓљЖy<žзыѕщКnd2™AІчццЎфrЙЫ”вGЋ1ў,пёТюo(Х����IENDЎB`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/btn/autocon.bmp����������������������������������������������������0000664�0001750�0001750�00000003366�10672753270�020624� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMі������6���(���������������Р�������������������џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЫККК–––xxxšššНННЫЫЫ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ФФФyyyZZZ}}}­­­ЬЬЬжжжЈЈЈTTT444‚‚‚ШШШ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЫŠŠŠ\\\ХХХџџџџџџџџџџџџџџџџџџ ŸŸ;00ž››ЫЫЫ�џ��џ��џ��џ��џ��џ��џ�ШШШaaažžž§§§џџџџџџџџџџџџџџџџџџџќќ­ЁЁ:##K--Q00K//ƒzzЫЫЫ�џ��џ��џ��џ��џ�ЪЪЪ[[[УУУџџџџџџџџџџџџџџџџџџџџџџџџўђђЛЁЁd<<|JJ„OOyIIa;;‚uuЫЫЫ�џ��џ��џ��џ�tttДДДџџџџџџџџџџџџџџџџџџџџџџџџџџџўщщЦЁЁˆQQЈeeЕmmЅccƒOO[88˜‘‘�џ��џ��џ�ЎЎЎvvvўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџўффЬЁЁ^^Щyyу‰‰Фvv—[[h??F11ООО�џ��џ�]]]ъъъџџџџџџџџџџџџџџџієєбШШџџџџџџџџџўххЬЁЁš]]ФvvкƒƒРss”YYf>>9##okk�џ�ПППoooџџџџџџџџџџџџџџџъфу‚a`Ї””џџџџџџџџџўыыФЁЁ€MMž__Љff›]]|KKT33*ЧЧЧДДДџџџџџџџџџџџџоааˆ]\pFE“zyЧММТЙЙНЖЖИЊЊ‘ww[77pDDxHHnBBW558!! ЅЅЅgggцццџџџџџџў§§еЙИ—`_‡USxKJiBA[98L0/=&&"'3@&&E))?&&- ��~~~ZZZћћћџџџќљљвІЅЌmkbaŽYX€POqGFb==T44E+*'    ���������lllZZZћћћџџџњєєЯš˜ДqoЅhf–^]ˆUTyLKjCB\99M0/0! ������������������lllhhhцццџџџџџџќњњгЈЇ­lkžcbZXQOrGFc>=T547"") ���������������~~~ŽŽŽГГГџџџџџџџџџўўўкМЛЇji—_^›poЗŸžЏš™Ї•”—‹‹k^^" ������������ЅЅЅРРРnnnџџџџўўџўўџ§§џўўуЯЯЃkjЖ‘џџџџџџџџџџџџВЊЊ* ������������ЧЧЧ�џ�b``ьууџђђџђђџђђџѓѓџєєэлкЧЇІџџџџџџџџџџџџДЌЌ1# ������ggg�џ��џ�ДВВ•~~ўххўццўццўччўччўшш§ччўѓѓџўўџџџџџџИЎ­9$#+  ННН�џ��џ��џ�•ˆˆЯЋЋўккўккўккўллўллўммўммўххўњњџџџЛААI--M//R21V44M..@((‹‹�џ��џ��џ��џ�ЪЪЪ™~~пЏЏўЮЮўЮЮўЯЯўЯЯўааўааўббўддўннжЉЉ”ZZ‹UU‚OOyIIh??xqqЫЫЫ�џ��џ��џ��џ��џ�ЪЩЩЊŠŠзœœ§ССўТТўУУўУУўФФўФФўХХўЦЦтЄЄЏjiЇee ``ˆSS‰~~ЫЫЫ�џ��џ��џ��џ��џ��џ��џ�ЫЫЫНЈЈШŠŠюЇЇўЗЗўЗЗўИИўИИўЙЙўЙЙъЂЂЦwwМrq—iiЉЃЃЫЫЫ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЪЧЧЧЇЇв’’ц••ёŸŸіЄЄїІІюžžж‹‹З„„ЎžžШШШ�џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ��џ�ЫЫЫЪУУЭЖЖЪЋЋЪЈЈУГГЦУУЫЫЫ�џ��џ��џ��џ��џ��џ��џ��џ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/bet.pas������������������������������������������������������������0000664�0001750�0001750�00000041765�11540214134�017137� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit bet; {$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Buttons, Spin,Process,nifti_img,define_types,CropEdges, userdir; type { TBETForm } TBETForm = class(TForm) Memo1: TMemo; SmoothnessEdit: TFloatSpinEdit; Panel1: TPanel; GoBtn: TSpeedButton; AboutBtn: TSpeedButton; CropBtn: TSpeedButton; procedure CropBtnClick(Sender: TObject); procedure GoBtnClick(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); private { private declarations } public { public declarations } end; var BETForm: TBETForm; implementation uses nifti_img_view; { TBETForm } procedure TBETForm.SpeedButton2Click(Sender: TObject); begin Showmessage('You can skull strip scans to allow you to render the surface of the brain.'+chr (13) + 'This uses Steve Smith''s Brain Extraction Tool [BET].'+chr (13)+ 'Default smoothness is 0.50, smaller values generate larger estimates of brain size.'+chr (13) +'http://www.fmrib.ox.ac.uk/fsl'); end; //lCmd := extractfilepath(paramstr(0))+'bet "'+lSourceFilename+'" "'+SaveDialog1.Filename // +'" -f '+floattostr(SmoothnessEdit.value{/100}); function PathExists (lCmd: string): boolean; begin result := false; if FSize(lCmd) < 1 then begin BETForm.Memo1.Lines.Add('Unable to find executable named '+lCmd); exit; end; result := true; end; procedure RunCmd (lCmd: string); var AProcess: TProcess; AStringList: TStringList; ACMD,PATH,FSLDIR,FSLCONF,lS,FULL: string; begin ACmd := lCmd; AProcess := TProcess.Create(nil); AStringList := TStringList.Create; //AProcess.CommandLine := lCmd; {$IFDEF UNIX} (*if direxists (gBGImg.FSLBASE) then BETForm.Memo1.Lines.Add('Using folder specified in mricron.ini file [FSLBASE] '+gBGImg.FSLBASE) else BETForm.Memo1.Lines.Add('Warning: unable to find folder specified in mricron.ini file [FSLBASE] '+gBGImg.FSLBASE); AProcess.Environment.Add(gBGImg.FSLBASE); lBinDir := gBGImg.FSLBASE+'/bin'; if direxists (lBinDir) then begin AProcess.Environment.Add(lBinDir); BETForm.Memo1.Lines.Add('Adding path to environment: '+lBinDir); end else BETForm.Memo1.Lines.Add('Warning: unable to find binary folder '+lBinDir);*) PATH:=GetEnvironmentVariable('PATH'); FSLDIR := gBGImg.FSLBASE; if (length(FSLDIR)<1) or (not DirExists(FSLDIR)) then begin if direxists (GetEnvironmentVariable('FSLDIR')) then FSLDIR:=GetEnvironmentVariable('FSLDIR'); end; if direxists (FSLDIR) then BETForm.Memo1.Lines.Add('Setting FSL folder (if incorrect edit FSLBASE in mricron):'+FSLDIR) else BETForm.Memo1.Lines.Add('Warning: unable to find folder specified in mricron.ini file [FSLBASE] '+FSLDIR); FULL := PATH+':'+FSLDIR+':'+FSLDIR+'/bin' ; lS := 'FSLDIR='+FSLDIR; BETForm.Memo1.Lines.Add(lS); AProcess.Environment.Add(lS); lS := 'LD_LIBRARY_PATH='+FSLDIR+'/bin'; BETForm.Memo1.Lines.Add(lS); AProcess.Environment.Add(lS); //lS := '. '+FSLDIR+'/etc/fslconf/fsl.sh'; //BETForm.Memo1.Lines.Add(lS); //AProcess.Environment.Add(lS); lS := 'PATH='+FULL; BETForm.Memo1.Lines.Add(lS); AProcess.Environment.Add(lS); //AProcess.Environment.Add(FULL); lS := 'FSLCLUSTER_MAILOPTS="n"'; BETForm.Memo1.Lines.Add(lS); AProcess.Environment.Add(lS); //lS := 'export '+FULL; //lS := 'export FSLDIR PATH'; //BETForm.Memo1.Lines.Add(lS); //AProcess.Environment.Add(lS); BETForm.Memo1.Lines.Add(gBGImg.FSLOUTPUTTYPE); AProcess.Environment.Add(gBGImg.FSLOUTPUTTYPE); {$ENDIF} AProcess.CommandLine := ACmd; AProcess.Options := AProcess.Options + [poWaitOnExit, poStderrToOutPut, poUsePipes]; BETForm.Memo1.Lines.Add(ACmd); AProcess.Execute; AStringList.LoadFromStream(AProcess.Output); BetForm.Memo1.Lines.AddStrings(AStringList); AStringList.Free; AProcess.Free; end; (*procedure RunCmdX; var AProcess: TProcess; AStringList: TStringList; lBinDir: string; begin AProcess := TProcess.Create(nil); AStringList := TStringList.Create; AProcess.CommandLine := 'bet /home/crlab/t.nii /home/crlab/xt.nii'; {$IFDEF UNIX} AProcess.Environment.Add('FSLOUTPUTTYPE=NIFTI_GZ'); AProcess.Environment.Add('/usr/local/fsl/'); AProcess.Environment.Add('/usr/local/fsl/bin'); AProcess.Environment.Add('FSLDIR=/usr/local/fsl'); //AProcess.Environment.Add('FSLOUTPUTTYPE=NIFTI_GZ'); {$ENDIF} AProcess.Options := AProcess.Options + [poWaitOnExit, poStderrToOutPut, poUsePipes]; AProcess.Execute; AStringList.LoadFromStream(AProcess.Output); BetForm.Memo1.Lines.AddStrings(AStringList); AStringList.Free; AProcess.Free; end;*) function DoBET(lInFile,lOutFile: string; lFrac: single):boolean; var lCmd: string; begin result := false; lCmd := extractfilepath(paramstr(0))+'bet'; {$IFNDEF Unix} lCmd := lCmd+'.exe'; {$ELSE} if not fileexists(lCmd) then begin lCmd := (gBGImg.FSLBASE+'/bin/bet'); if fileexists(lCmd) then BETForm.Memo1.Lines.Add('Using executable location from mricron.ini file [FSLBASE] '+lCmd) else BETForm.Memo1.Lines.Add('Unable to find executable suggested by mricron.ini file [FSLBASE] '+lCmd) end; {$ENDIF} if not PathExists (lCmd) then begin lCmd := '/usr/local/fsl/bin/bet_8UI'; if not PathExists (lCmd) then begin lCmd := '/usr/local/fsl/bin/bet'; if not PathExists (lCmd) then exit; end; end; //no bet in home folder... lCmd := lCmd+' "'+lInFile+'" "'+lOutFile +'" -R -f '+floattostr(lFrac); RunCmd(lCmd); (*AProcess := TProcess.Create(nil); {$IFDEF UNIX} AProcess.Environment.Add('FSLDIR=/usr/local/fsl'); AProcess.Environment.Add('FSLOUTPUTTYPE=NIFTI_GZ'); {$ENDIF} AProcess.CommandLine := lCmd; //AProcess.CommandLine := 'C:\bet "C:\txx.hdr" "C:\btxx.hdr" -f 0.5'; AProcess.Options := AProcess.Options + [poWaitOnExit]; AProcess.Execute; AProcess.Free; *) result := true; end; function Bright95Pct: byte;//returns intensity of 95th percentile var lPos,l5Pct,lCumulative: integer; lHisto: array [0..255] of integer; begin result := 0; if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems<1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems<>gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems) then exit; //next - create histogram of intensity for lPos := 0 to 255 do lHisto[lPos] := 0; for lPos := 1 to gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems do inc(lHisto[gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lPos]]); //next find 95th percentile l5Pct := (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems div 20); lCumulative := 0; lPos := 256; while (lPos > 0) and (lCumulative < l5Pct) do begin dec(lPos); lCumulative := lCumulative + lHisto[lPos]; end; result := lPos; end; procedure CropVOI (lVOIIntensity: byte); var lPos: integer; begin if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems<1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems<>gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems) then exit; for lPos := 1 to gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems do if gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lPos] = kVOI8bit then gMRIcroOverlay[kBGOverlayNum].ScrnBuffer^[lPos] := lVOIIntensity; end; procedure DeleteHdrImg(lFilename: string); begin //exit; if lFilename = '' then exit; DeleteFile(lFilename); if (UpCaseExt(lFileName)='.IMG') then DeleteFile(changefileext(lFilename,'.hdr')); if (UpCaseExt(lFileName)='.HDR') then DeleteFile(changefileext(lFilename,'.img')); end; function Mask8BitImg(lImgName,lMaskName: string): boolean; //should be two 8-bit image files of identical dimensions //all non-zero voxels in the mask are written with value of img //Warning - only works with .img files with zero voxoffset - can corrupt .nii files - would need to read header.... var lPos2,lPos,lC,lSz,lMaskSz,lBPP: integer; lImg,lMask: bytep; lInF: File; begin result := false; lSz := FSize(lImgName); lMaskSz := FSize(lMaskName); if lSz = lMaskSz then lBPP := 1 else if lSz = (2*lMaskSz) then lBPP := 2 else if lSz = (2*lMaskSz) then lBPP := 4 else lBPP := 0; if (lSz < 1) or (lBPP = 0 ) then exit; //next read mask GetMem(lMask,lSz); AssignFile(lInF, lMaskName); Reset(lInF,1); BlockRead(lInF, lMask^, lMaskSz); CloseFile(lInF); //next: read image GetMem(lImg,lSz); AssignFile(lInF, lImgName); Reset(lInF,1); BlockRead(lInF, lImg^, lSz); CloseFile(lInF); //next mask image for lPos := 1 to lMaskSz do if lMask^[lPos] = 0 then begin lPos2 := ((lPos-1)*lBPP); for lC := 1 to lBPP do lImg^[lC+lPos2] := 0; end; Freemem(lMask); //next save masked image AssignFile(lInF, lImgName); //1/2008.... //AssignFile(lInF, lMaskName); Rewrite(lInF,1); BlockWrite(lInF, lImg^, lSz); CloseFile(lInF); Freemem(lImg); result := true; end; (*function Mask8BitImg(lImgName,lMaskName: string): boolean;//should be two 8-bit image files of identical dimensions //all non-zero voxels in the mask are written with value of img //Note: the mask file is changed - not the image var lPos,lSz: integer; lImg,lMask: bytep; lInF: File; begin //showmessage( lMaskName+'xx'+lImgName); result := false; lSz := FSize(lImgName); if (lSz < 1) or (lSz <> FSize(lMaskName)) then exit; //fx(lSz,778899); //next read mask GetMem(lMask,lSz); AssignFile(lInF, lMaskName); Reset(lInF,1); BlockRead(lInF, lMask^, lSz); CloseFile(lInF); //next: read image GetMem(lImg,lSz); AssignFile(lInF, lImgName); Reset(lInF,1); BlockRead(lInF, lImg^, lSz); CloseFile(lInF); //next mask image for lPos := 1 to lSz do if lMask^[lPos] = 0 then lImg^[lPos] := 0; Freemem(lMask); //next save masked image AssignFile(lInF, lMaskName); Rewrite(lInF,1); BlockWrite(lInF, lImg^, lSz); CloseFile(lInF); Freemem(lImg); result := true; end;*) function DefaultsDirCmd: string; //Lazarus for Unix does not seem to execute TProcess commands to ~/.. we need to write them to /Home/chris/.. var lLen,lP: integer; lStr: string; begin {$IFDEF UNIX} lStr := extractfiledir(GetAppConfigFile(false)); lLen := length(lStr); if lLen < 1 then exit; lP := lLen; while (lP > 0) and (lStr[lP] <> '.') do dec(lP); if lP > 1 then begin for lLen := 1 to (lP-1) do result := result + lStr[lLen]; end; {$ELSE} //else ... assume windows result := DefaultsDir('') {$ENDIF} //showmessage('x'+result+'x'); end; procedure TBETForm.GoBtnClick(Sender: TObject); label 666; var lTempNameOrig,lTempName8bitMask,lTempBetName,lTempGZName: string; begin Memo1.Clear; Memo1.lines.add('Startup Timestamp: '+DateTimeToStr(Now)); if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1) then begin showmessage('BET error: please use File/Open to display the image you want to brain extract.'); end; //showmessage(DefaultsDirCmd); lTempNameOrig :=DefaultsDirCmd+'orig.hdr';//lTempNameOrig := extractfilepath(paramstr(0))+'orig.hdr'; SaveAsVOIorNIFTIcore (lTempNameOrig, gMRIcroOverlay[kBGOverlayNum].ImgBuffer,gMRIcroOverlay[kBGOverlayNum].ImgBufferItems, gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); //SaveAsVOIorNIFTIcore (lTempNameOrig, gMRIcroOverlay[kBGOverlayNum].ImgBuffer,gMRIcroOverlay[kBGOverlayNum].ImgBufferItems, gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems > 0 then begin case MessageDlg('Do you wish to protect tissue shown by the VOI drawing?', mtConfirmation, [mbYes, mbNo], 0) of mrYes: CropVOI(Bright95Pct); end; //case for protecting VOI ImgForm.CloseVOIClick(nil); end; if gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP <> 1 then Memo1.lines.add('Warning: converted image downsampled to 8-bit precision.'); lTempName8bitMask := DefaultsDirCmd+'temp8.hdr';//lTempName8bitMask := extractfilepath(paramstr(0))+'temp8.hdr'; SaveAsVOIorNIFTIcore (lTempName8bitMask, gMRIcroOverlay[kBGOverlayNum].ScrnBuffer,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems, 1,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); lTempName8bitMask := changefileext(lTempName8bitMask,'.hdr'); //SaveAs renames the .hdr to .img lTempBetName := DefaultsDirCmd+'btemp8.hdr';//lTempBetName := extractfilepath(paramstr(0))+'btemp8.hdr'; // showmessage(lTempBetName); if not DoBET(lTempName8bitMask,lTempBetName,SmoothnessEdit.value) then goto 666; Memo1.lines.add('Shutdown Timestamp: '+DateTimeToStr(Now)); if Fileexists(lTempBetName) then begin CopyFileEXoverwrite(lTempName8bitMask,lTempBetName); //the old version of BET corrupts some NIfTI information end else begin //assume new version of bet_8UI has saved as .nii.gz lTempGZName := ChangeFileExt(lTempBetName,'.nii.gz'); if not Fileexists(lTempGZName) then begin Memo1.lines.add('BET Error: unable to find BET image '+lTempBetName+ ' or '+lTempGZName); {$IFDEF Darwin} Memo1.lines.add(' Try relaunching MRIcron from the Terminal command line, e.g. /Applications/mricron.app/mricron &'); {$ENDIF} goto 666; end; //convert .nii.gz to hdr/.img so we can mask it... ImgForm.CloseImagesClick(nil); ImgForm.OpenAndDisplayImg(lTempGZName,True); SaveAsVOIorNIFTIcore (lTempBetName,gMRIcroOverlay[kBGOverlayNum].ScrnBuffer, gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems, 1,1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); DeleteHdrImg(lTempGZName); goto 666; // ImgForm.CloseImagesClick(nil); end; Mask8BitImg(changefileext(lTempNameOrig,'.img'),changefileext(lTempBetName,'.img')); ImgForm.OpenAndDisplayImg(lTempNameOrig,True); Memo1.lines.add('Use File/SaveAsNIfTI to save the stripped 8-bit image.'); 666: DeleteHdrImg(lTempBetName); DeleteHdrImg(lTempNameOrig); DeleteHdrImg(lTempName8bitMask); end; procedure TBETForm.CropBtnClick(Sender: TObject); begin CropEdgeForm.Show; end; (*var lTempNameOrig,lTempName8bitMask,lTempBetName: string; begin Memo1.Clear; Memo1.lines.add('Startup Timestamp: '+DateTimeToStr(Now)); if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 1) then begin showmessage('BET error: please use File/Open to display the image you want to brain extract.'); end; lTempNameOrig := ''; if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems > 0 then begin case MessageDlg('Do you wish to remove tissue shown by the VOI drawing?', mtConfirmation, [mbYes, mbNo], 0) of mrYes: CropVOI(0); else case MessageDlg('Do you wish to protect tissue shown by the VOI drawing?', mtConfirmation, [mbYes, mbNo], 0) of mrYes: begin lTempNameOrig := DefaultsDir('')+'orig8.hdr'; SaveAsVOIorNIFTIcore (lTempNameOrig, gMRIcroOverlay[kBGOverlayNum].ScrnBuffer,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems, 1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); CropVOI(Bright95Pct); end; end; //case for protecting VOI end; //case for deleting VOI ImgForm.CloseVOIClick(nil); end; if gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP <> 1 then Memo1.lines.add('Warning: converted image downsampled to 8-bit precision.'); lTempName8bitMask := DefaultsDir('')+'temp8.hdr'; SaveAsVOIorNIFTIcore (lTempName8bitMask, gMRIcroOverlay[kBGOverlayNum].ScrnBuffer,gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems, 1,gMRIcroOverlay[kBGOverlayNum].NiftiHdr); lTempName8bitMask := changefileext(lTempName8bitMask,'.hdr'); //SaveAs renames the .hdr to .img lTempBetName := DefaultsDir('')+'btemp8.hdr'; DoBET(lTempName8bitMask,lTempBetName,SmoothnessEdit.value); Memo1.lines.add('Shutdown Timestamp: '+DateTimeToStr(Now)); CopyFileEXoverwrite(lTempName8bitMask,lTempBetName); //the old version of BET corrupts some NIfTI information DeleteHdrImg(lTempName8bitMask); if lTempNameOrig <> '' then begin Mask8BitImg(changefileext(lTempNameOrig,'.img'),changefileext(lTempBetName,'.img')); DeleteHdrImg(lTempNameOrig); end; ImgForm.OpenAndDisplayImg(lTempBetName,True); Memo1.lines.add('Use File/SaveAsNIfTI to save the stripped 8-bit image.'); DeleteHdrImg(lTempBetName); end;*) (*procedure TBETForm.GoBtnClick(Sender: TObject); begin Memo1.Clear; Memo1.lines.add('Startup Timestamp: '+DateTimeToStr(Now)); DoBET('C:\txx.hdr','C:\btxx.hdr',SmoothnessEdit.value); Memo1.lines.add('Shutdown Timestamp: '+DateTimeToStr(Now)); end; *) initialization {$I bet.lrs} end. �����������mricron-0.20120505.1~dfsg.1.orig/bet.lrs������������������������������������������������������������0000664�0001750�0001750�00000003254�11540214134�017143� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ This is an automatically generated lazarus resource file } LazarusResources.Add('TBETForm','FORMDATA',[ 'TPF0'#8'TBETForm'#7'BETForm'#4'Left'#3#229#1#6'Height'#3'9'#1#3'Top'#3#27#2#5 +'Width'#3'!'#2#13'ActiveControl'#7#6'Panel1'#7'Caption'#6#16'Brain extractio' +'n'#12'ClientHeight'#3'9'#1#11'ClientWidth'#3'!'#2#21'Constraints.MaxHeight' +#3'9'#1#20'Constraints.MaxWidth'#3'!'#2#21'Constraints.MinHeight'#3'9'#1#20 +'Constraints.MinWidth'#3'!'#2#8'Position'#7#14'poScreenCenter'#10'LCLVersion' +#6#8'0.9.28.2'#0#5'TMemo'#5'Memo1'#4'Left'#2#0#6'Height'#3#25#1#3'Top'#2' '#5 +'Width'#3'!'#2#5'Align'#7#8'alClient'#8'TabOrder'#2#0#0#0#6'TPanel'#6'Panel1' +#4'Left'#2#0#6'Height'#2' '#3'Top'#2#0#5'Width'#3'!'#2#5'Align'#7#5'alTop'#10 +'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2' '#11'ClientWidth'#3'!'#2#8'TabO' +'rder'#2#1#0#12'TSpeedButton'#5'GoBtn'#4'Left'#2#8#6'Height'#2#25#3'Top'#2#2 +#5'Width'#2'X'#7'Caption'#6#2'Go'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7 +'OnClick'#7#10'GoBtnClick'#0#0#12'TSpeedButton'#8'AboutBtn'#4'Left'#2'd'#6'H' +'eight'#2#25#3'Top'#2#2#5'Width'#2'X'#7'Caption'#6#5'About'#5'Color'#7#9'clB' +'tnFace'#9'NumGlyphs'#2#0#7'OnClick'#7#17'SpeedButton2Click'#0#0#12'TSpeedBu' +'tton'#7'CropBtn'#4'Left'#3#192#0#6'Height'#2#25#3'Top'#2#2#5'Width'#2'X'#7 +'Caption'#6#10'Crop Edges'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClic' +'k'#7#12'CropBtnClick'#0#0#14'TFloatSpinEdit'#14'SmoothnessEdit'#4'Left'#3'4' +#1#6'Height'#2#27#3'Top'#2#5#5'Width'#2']'#9'Increment'#5#0#0#0#0#0#0#0#128 +#255'?'#8'MaxValue'#5#0#0#0#0#0#0#0#128#255'?'#8'MinValue'#5#0#0#0#0#0#0#0#0 +#0#0#8'TabOrder'#2#0#5'Value'#5#0#0#0#0#0#0#0#128#254'?'#0#0#0#0 ]); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/bet.lfm������������������������������������������������������������0000664�0001750�0001750�00000002724�11540214134�017122� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object BETForm: TBETForm Left = 485 Height = 313 Top = 539 Width = 545 ActiveControl = Panel1 Caption = 'Brain extraction' ClientHeight = 313 ClientWidth = 545 Constraints.MaxHeight = 313 Constraints.MaxWidth = 545 Constraints.MinHeight = 313 Constraints.MinWidth = 545 Position = poScreenCenter LCLVersion = '0.9.28.2' object Memo1: TMemo Left = 0 Height = 281 Top = 32 Width = 545 Align = alClient TabOrder = 0 end object Panel1: TPanel Left = 0 Height = 32 Top = 0 Width = 545 Align = alTop BevelOuter = bvNone ClientHeight = 32 ClientWidth = 545 TabOrder = 1 object GoBtn: TSpeedButton Left = 8 Height = 25 Top = 2 Width = 88 Caption = 'Go' Color = clBtnFace NumGlyphs = 0 OnClick = GoBtnClick end object AboutBtn: TSpeedButton Left = 100 Height = 25 Top = 2 Width = 88 Caption = 'About' Color = clBtnFace NumGlyphs = 0 OnClick = SpeedButton2Click end object CropBtn: TSpeedButton Left = 192 Height = 25 Top = 2 Width = 88 Caption = 'Crop Edges' Color = clBtnFace NumGlyphs = 0 OnClick = CropBtnClick end object SmoothnessEdit: TFloatSpinEdit Left = 308 Height = 27 Top = 5 Width = 93 Increment = 1 MaxValue = 1 MinValue = 0 TabOrder = 0 Value = 0.5 end end end ��������������������������������������������mricron-0.20120505.1~dfsg.1.orig/batchstatselect.pas������������������������������������������������0000664�0001750�0001750�00000004671�11425567150�021550� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit batchstatselect; {$H+} interface uses Classes, SysUtils,StrUtils, define_types, Dialogs; procedure GetFilesInDir (lDefaultFolder: string; var lFilenames: TStrings); implementation function IsStatHdr(lStr: string): boolean; //detects 'spmT_000*.hdr and zstat*.nii.gz //requires StrUtils var lExt: string; begin result := false; if not IsExtNIFTIHdr(lStr) then exit; if AnsiContainsText(lStr, 'spmT_') or AnsiContainsText(lStr, pathdelim+'zstat') then result := true; end; procedure FindNIIhdrRecursive (var lFolderNameIn: string; var lStringList : TStrings); var len: integer; lFolderName,lNewDir,lNewName,lExt: String; lSearchRec: TSearchRec; begin lFolderName := lFolderNameIn; if not DirExists (lFolderName) then begin lFolderName := ExtractFileDir(lFolderName); end; if (length(lFolderName) > 1) and (lFolderName[length(lFolderName)] <> PathDelim) then lNewDir := lFolderName+PathDelim; if DirExists (lNewDir) then begin {$IFDEF UNIX} if FindFirst(lNewDir+'*',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ELSE} if FindFirst(lNewDir+'*.*',faAnyFile-faSysFile,lSearchRec) = 0 then begin {$ENDIF} repeat lNewName := lNewDir+lSearchRec.Name; if (lSearchRec.Name = '.') or (lSearchRec.Name = '..') then //current or parent folder - do nothing else if DirExists(lNewName) then FindNIIhdrRecursive (lNewName, lStringList) else if IsStatHdr(lNewName) then lStringList.Add(lNewName); until (FindNext(lSearchRec) <> 0); end; //if findfirst FindClose(lSearchRec); end;//Direxists end; procedure FilterForText (lRequiredText: string; var lFilenames: TStrings); var i,len: integer; begin len := lFilenames.Count; if (length(lRequiredText) < 1) or (len < 1) then exit; for i := len-1 downto 0 do if not AnsiContainsText(lFilenames[i], lRequiredText) then lFilenames.Delete(i); end; procedure GetFilesInDir (lDefaultFolder: string; var lFilenames: TStrings); var lParentDir,lFilter : string; begin lParentDir := GetDirPrompt (lDefaultFolder); FindNIIhdrRecursive(lParentDir,lFilenames); lFilter := '.gfeat'; InputQuery('Filter data', 'Filter for statistical maps [e.g. ''.gfeat'' will only analyze files with this in their path. Set to blank to analyze all files',lFilter); FilterForText(lFilter,lFilenames); end; end. �����������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/batch.pas����������������������������������������������������������0000664�0001750�0001750�00000014372�11433456050�017446� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit batch; {$H+} interface uses {$IFNDEF UNIX} Windows, {$ELSE} lclintf,LCLType,LResources,BaseUnix, {$ENDIF} define_types; procedure BatchVOI; implementation uses Forms, //lclintf,LResources,{$IFNDEF Unix} Controls, {$ELSE}BaseUnix, LCLType,{$ENDIF} nifti_img, nifti_img_view, dialogs, nifti_hdr_view, text,sysutils,classes, fdr,batchstatselect; (*function LesionFrac (lOverlayNum: integer): double; var lLesionSum,lInten: double; lInc: integer; begin result := 0; if gMRIcroOverlay[lOverlayNum].ScrnBufferItems < 1 then exit; if gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems then exit; lLesionSum := 0; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin lInten := RawBGIntensity(lInc); if gMRIcroOverlay[lOverlayNum].ScrnBuffer[lInc] > 0 then lLesionSum := lLesionSum + lInten; end; //for each voxel result := lLesionSum; end;*) function VOIVol (lOverlayNum: integer): integer; var lInc,lVox: integer; begin result := 0; if gMRIcroOverlay[lOverlayNum].ScrnBufferItems < 1 then exit; if gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems then exit; lVox := 0; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then inc(lVox); end; //for each voxel result := lVox; end; //VOIVol function VOIMean (lOverlayNum: integer): double; var lSum,lInten,lVol: double; lInc: integer; begin result := 0; lVol := VOIVol(lOverlayNum); if lVol < 1 then exit; lSum := 0; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do begin lInten := RawBGIntensity(lInc); //Next line - only voxels that are part of VOI if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then lSum := lSum + lInten; end; //for each voxel result := lSum/lVol; end; //VOIMean function VOIMeanFrac10pct (lOverlayNum: integer; lMax: boolean): double; //if lMax is true, return top 10pct, if false return bottom var lSum: double; lVox,lInc,l10pct: integer; lRA: singlep; begin //proc ShowDescript result := 0; if gMRIcroOverlay[lOverlayNum].ScrnBufferItems < 1 then exit; if gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems then exit; //first - count number of voxels in ROI lVox := 0; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then inc(lVox); //next - get memory if lVox < 1 then exit; getmem(lRA,lVox * sizeof(single)); lVox := 0; for lInc := 1 to gMRIcroOverlay[lOverlayNum].ScrnBufferItems do if gMRIcroOverlay[lOverlayNum].ScrnBuffer^[lInc] > 0 then begin inc(lVox); lRA^[lVox] := RawBGIntensity(lInc); end; qsort(1, lVox,lRA); l10pct := round(lVox / 10); if l10pct < 1 then l10pct := 1; lSum := 0; if not lMax then begin //lower 10pct for lInc := 1 to l10pct do lSum := lSum + lRA^[lInc] end else begin //top 10pct for lInc := (lVox-l10pct+1) to lVox do lSum := lSum + lRA^[lInc]; end; result := lSum / l10pct; freemem(lRA); end; procedure BatchVOI; var lNumberofP,lP,lInc,lNumberofFiles,lLoop: integer; lFilename,lStr:string; lBGStrings : TStrings; begin for lInc := 1 to (knMaxOverlay-1) do FreeImgMemory(gMRIcroOverlay[lInc]); ImgForm.UpdateLayerMenu; lBGStrings := TStringList.Create; if (ssShift in KeyDataToShiftState(vk_Shift)) then begin GetFilesInDir(ExtractFileDir(HdrForm.OpenHdrDlg.Filename),lBGStrings) end else begin if not OpenDialogExecute(kImgFilter,'Select background images (stat maps)',true) then exit; lBGStrings.AddStrings(HdrForm.OpenHdrDlg.Files); end; lNumberofP:= lBGStrings.Count; if lNumberofP < 1 then begin lBGStrings.free; exit; end; if not OpenDialogExecute(kImgFilter,'Select overlay images (ROIs)',true) then exit; lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count; if lNumberofFiles < 1 then exit; TextForm.MemoT.Lines.Clear; lStr := 'Function'+kTextSep+'VOIname'+kTextSep+'VOIvol'; for lP := 1 to lNumberofP do lStr := lStr + kTextSep+(lBGStrings.Strings[lP-1]); TextForm.MemoT.lines.add(lStr); for lLoop := 1 to 3 do begin {if lLoop=3 then lStr := 'min10pct'+kSep+'Filename+'kSep+'Vol' else if lLoop=2 then lStr := 'max10pct'+Filename+'kSep+'Vol' else lStr := 'mean'+Filename+kSep'Vol';} for lInc:= 1 to lNumberofFiles do begin ImgForm.StatusLabel.Caption := inttostr(lInc)+'/'+inttostr(lNumberofFiles); IMgForm.refresh; if lLoop=3 then lStr := 'min10pct' else if lLoop=2 then lStr := 'max10pct' else lStr := 'mean'; lStr := lStr +kTextSep+ (HdrForm.OpenHdrDlg.Files[lInc-1]); for lP := 1 to lNumberofP do begin lFilename := lBGStrings.Strings[lP-1]; ImgForm.OpenAndDisplayImg(lFilename,True); lFilename := HdrForm.OpenHdrDlg.Files[lInc-1]; ImgForm.OverlayOpenCore ( lFilename, 2); if lP = 1 then lStr := lStr + kTextSep+ inttostr(VOIVol(2) ); if lLoop = 3 then lStr := lStr + kTextSep+ floattostr(VOIMeanFrac10Pct(2,false)) else if lLoop = 2 then lStr := lStr + kTextSep+ floattostr(VOIMeanFrac10Pct(2,true)) else lStr := lStr + kTextSep+ floattostr(VOIMean(2)); end; TextForm.MemoT.lines.add(lStr ); end; end;//lLoop FreeImgMemory(gMRIcroOverlay[2]); ImgForm.UpdateLayerMenu; //SaveDialog1.Filename := ExtractFileDirWithPathDelim(HdrForm.OpenHdrDlg.Files[0])+'desc.csv'; lBGStrings.Free; //ImgForm.SaveDialog1.Filename := ExtractFileDirWithPathDelim(gMRIcroOverlay[lOverlayNum].HdrFileName)+'desc.csv'; TextForm.Show; end; end. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/autoroi.pas��������������������������������������������������������0000664�0001750�0001750�00000051211�11540144452�020037� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit autoroi; interface uses {$IFNDEF FPC} RXSpin,capmenu, {$ELSE} Spin,lResources, {$ENDIF} {$IFNDEF Unix} Windows,{$ENDIF} SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls, define_types, ExtCtrls, nifti_img,nifti_img_view; type { TAutoROIForm } TAutoROIForm = class(TForm) OriginLabel: TLabel; OriginBtn: TSpeedButton; EdgeEdit: TSpinEdit; RadiusEdit: TSpinEdit; ErodeEdit: TSpinEdit; ROIconstraint: TComboBox; VarianceEdit: TSpinEdit; DiffLabel: TLabel; Label1: TLabel; Label2: TLabel; Label3: TLabel; AutoROIBtn: TSpeedButton; CancelBtn: TSpeedButton; Timer1: TTimer; Label4: TLabel; ExcludeBlackCheck: TCheckBox; procedure OriginBtnClick(Sender: TObject); procedure PreviewBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormHide(Sender: TObject); procedure AutoROIBtnClick(Sender: TObject); procedure CancelBtnClick(Sender: TObject); procedure AutoROIchange(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; procedure ROICluster ({lInROIBuf: bytep;} lXdim, lYDim, lZDim,lXOriginIn,lYOrigin,lZOrigin: integer; lDeleteNotFill: boolean); var AutoROIForm: TAutoROIForm; gOriginX,gOriginY,gOriginZ: integer; implementation {$IFNDEF FPC} {$R *.DFM} {$ENDIF} procedure TAutoROIForm.OriginBtnClick(Sender: TObject); begin gOriginX := ImgForm.XViewEdit.value; gOriginY := ImgForm.YViewEdit.value; gOriginZ := ImgForm.ZViewEdit.value; OriginLabel.Caption := 'Origin: '+inttostr(gOriginX)+'x'+inttostr(gOriginY)+'x'+inttostr(gOriginZ); PreviewBtnClick(sender); end; procedure TAutoROIForm.PreviewBtnClick(Sender: TObject); var lXmm,lYmm,lZmm,lSqrRadius: single; lExcludeBlackIfZero,//lX,lY,lZ, //abba {lMaxROISz,}lEdge,lOriginPos,lROISz,lOriginIntensity,lVariance,lXdim, lYDim, lZDim: integer; lErodeCycles,lQTail,lQHead,lSliceSz,lQSz,lInc,lVolSz{,lX,lY,lZ}: integer; lROIConstrain,lReadFilteredData: boolean; lQra: LongIntP; lSourceBuffer,lBuff,lPreErodeBuff: ByteP; const kFillValue = -2; Procedure IncQra(var lVal, lQSz: integer); begin inc(lVal); if lVal >= lQSz then lVal := 1; end; function UnsmoothedIntensity(lPixel: integer): integer; //1381 begin if lReadFilteredData then result := lBuff^[lPixel] else Result :=lSourceBuffer^[lPixel]; end; function MeanIntensity(lPixel: integer): integer; var lV: integer; begin if lReadFilteredData then result := lBuff^[lPixel] else if ((lPixel-lSliceSz) > 0) and ((lPixel+lSliceSz) <= lVolSz) then begin lV :=lSourceBuffer^[lPixel]+lSourceBuffer^[lPixel+1]+lSourceBuffer^[lPixel-1] //L/R +lSourceBuffer^[lPixel+lXdim]+lSourceBuffer^[lPixel-lXdim] //Anterior/Posterior +lSourceBuffer^[lPixel+lSliceSz]+lSourceBuffer^[lPixel-lSliceSz]; //Dorsal/Ventral result := lV div 7; end else result := lSourceBuffer^[lPixel];//1401 gImageBackupBuffer[lPixel] end; procedure Check(lPixel,lIntensity: integer); var lSmoothInten :integer; begin lSmoothInten := MeanIntensity(lPixel); if (lROIConstrain) and (gBGImg.VOIUndoVol^[lPixel] > 0) then //1410 //constrain else if (lBuff^[lPixel]<> 255) and (UnsmoothedIntensity(lPixel) > lExcludeBlackIfZero {1381}) and (abs(lSmoothInten-lIntensity)<=lEdge) and(abs(lSmoothInten-lOriginIntensity)<=lVariance) {}then begin//add item incQra(lQHead,lQSz); inc(lROISz); lBuff^[lPixel] := 255; lQra^[lQHead] := lPixel; end; end; PROCEDURE RetirePixel; //FIFO cleanup function WithinRadius(lXs,lYs,lZs:integer): boolean; begin if (sqr((lXs-gOriginX)*lXmm)+sqr((lYs-gOriginY)*lYmm)+sqr((lZs-gOriginZ)*lZmm)) > lSqrRadius then result := false else result := true; end; VAR lVal,lXPos,lYPos,lZPos,lIntensity: integer; BEGIN lVal := lQra^[lQTail]; lXpos := lVal mod lXdim; if lXpos = 0 then lXPos := lXdim; lYpos := (1+((lVal-1) div lXdim)) mod lYDim; if lYPos = 0 then lYPos := lYdim; lZpos := ((lVal-1) div lSliceSz)+1; if lReadFilteredData then lIntensity := 128 else lIntensity := lSourceBuffer^[lVal];//1401 gImageBackupBuffer[lVal]; if (lXpos > 1) and WithinRadius(lXpos-1,lYpos,lZpos) then Check(lVal -1,lIntensity);//check to left if (lXPos < lXDim) and (WithinRadius(lXpos+1,lYpos,lZpos)) then Check(lVal + 1,lIntensity); //check to right if (lYpos > 1) and (WithinRadius(lXpos,lYpos-1,lZpos)) then Check(lVal -lXdim,lIntensity);//check previous line if (lYPos < lYDim) and (WithinRadius(lXpos,lYpos+1,lZpos)) then Check(lVal + lXdim,lIntensity); //check next line if (lZpos > 1) and (WithinRadius(lXpos,lYpos,lZpos-1)) then Check(lVal -lSliceSz,lIntensity);//check previous slice if (lZPos < lZDim) and (WithinRadius(lXpos,lYpos,lZpos+1)) then Check(lVal + lSliceSz,lIntensity); //check next slice incQra(lQTail,lQSz); //done with this pixel END; procedure FillStart (lPt: integer); {FIFO algorithm: keep memory VERY low} var lI: integer; begin for lI := 1 to lQsz do lQra^[lI] := 0; lQHead := 0; lQTail := 1; lROISz := 0; Check(lPt,lOriginIntensity); RetirePixel; while ((lQHead+1) <> lQTail) do begin//complete until all voxels in buffer have been tested RetirePixel; if (lQHead = lQSz) and (lQTail = 1) then exit; //break condition: avoids possible infinite loop where QTail is being incremented but QHead is stuck at maximum value end; end; function ROIOnEdge (lVal: integer): boolean; BEGIN result := false; if lBuff^[lVal] <> 255 then exit; //not ROI - is not boundary //Find if ((lVal-lSliceSz) > 0) and ((lVal+lSliceSz) <= lVolSz) then begin if lBuff^[lVal+1] = 0 then result := true; if lBuff^[lVal-1] = 0 then result := true; if lBuff^[lVal+lXdim] = 0 then result := true; if lBuff^[lVal-lXdim] = 0 then result := true; if lBuff^[lVal+lSliceSz] = 0 then result := true; if lBuff^[lVal-lSliceSz] = 0 then result := true; end; end; function ZeroOnEdge (lVal: integer): boolean; BEGIN result := false; if lBuff^[lVal] <> 0 then exit; //not ROI - is not boundary //Find if ((lVal-lSliceSz) > 0) and ((lVal+lSliceSz) <= lVolSz) then begin if lBuff^[lVal+1] = 255 then result := true; if lBuff^[lVal-1] = 255 then result := true; if lBuff^[lVal+lXdim] = 255 then result := true; if lBuff^[lVal-lXdim] = 255 then result := true; if lBuff^[lVal+lSliceSz] = 255 then result := true; if lBuff^[lVal-lSliceSz] = 255 then result := true; end; end; begin //alfa666 if (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems<1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems<>gBGImg.VOIUndoVolItems) then exit; //if gImageBackupSz <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems then //UpdateBackupBuffer; lXdim := gBGImg.ScrnDim[1]; lYDim := gBGImg.ScrnDim[2]; lZDim := gBGImg.ScrnDim[3]; if (gBGImg.Scrnmm[1] = 0) or (gBGImg.Scrnmm[2]=0) or (gBGImg.Scrnmm[3]=0) then begin lXmm := 1; lYmm := 1; lZmm := 1; end else begin lXmm := gBGImg.Scrnmm[1]; lYmm := gBGImg.Scrnmm[2]; lZmm := gBGImg.Scrnmm[3]; end; lSliceSz := lXdim * lYdim; lVolSz := lSliceSz*lZdim; //lMaxROISz := round(PctImg.Value/100 * lVolSz); lOriginPos := gOriginX + ((gOriginY-1)*lXdim) + ((gOriginZ-1)*lSliceSz); if (lOriginPos < 1) or (lVolSz <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) or (lOriginPos > lVolSz) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems <> gBGImg.VOIUndoVolItems) then exit; {$IFNDEF FPC} lVariance := AutoROIForm.VarianceEdit.asinteger; //asinteger; lEdge := AutoROIForm.EdgeEdit.asinteger; lSqrRadius := sqr(AutoROIForm.RadiusEdit.asinteger); {$ELSE} lVariance := AutoROIForm.VarianceEdit.value; //asinteger; lEdge := AutoROIForm.EdgeEdit.value; lSqrRadius := sqr(AutoROIForm.RadiusEdit.value); {$ENDIF} if (lXDim < 4) or (lYDim < 4) or (lZDim < 4) or (lVolSz < 1) then exit; lSourceBuffer := gMRIcroOverlay[kBGOverlayNum].ScrnBuffer;//gBuffer; //Next - START count cluster size lQSz := (lVolSz div 4)+8; GetMem(lQra,lQsz * sizeof(longint) ); //check positive clusters.... Getmem(lBuff,lVolSz); FillChar(lBuff^,lVolSz, 0); //Move(gImageBackupBuffer^,lBuff^,lVolSz); if ExcludeBlackCheck.checked then //1381 lExcludeBlackIfZero := 0 //0 else lExcludeBlackIfZero := -1;//impossible 8-bit value: do not use this feature lOriginIntensity := lSourceBuffer^[lOriginPos]; //1401 gImageBackupBuffer[lOriginPos]; lReadFilteredData := false; //ROIconstrainCheck.enabled := (gROIBupSz > 1); //1410: next 3 lines ROIconstraint.enabled := (gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems > 1); //1410: next 3 lines if (ROIconstraint.ItemIndex = 2) and (ROIconstraint.enabled) then lROIConstrain := true else lROIconstrain := false; FillStart(lOriginPos); lROIConstrain := false;//1410 //START: ERODE/DILATE CYCLES {$IFNDEF FPC} lErodeCycles := AutoROIForm.ErodeEdit.asinteger; {$ELSE} lErodeCycles := AutoROIForm.ErodeEdit.value; {$ENDIF} if lErodeCycles > 0 then begin Getmem(lPreErodeBuff,lVolSz); Move(lBuff^,lPreErodeBuff^,lVolSz); for lQHead := 1 to lErodeCycles do begin//ERODE for lInc := 1 to lVolSz do if ROIonEdge(lInc) then lBuff^[lInc] :=254; for lInc := 1 to lVolSz do if lBuff^[lInc]=254 then lBuff^[lInc] := 0; //erode end;//for ErodeCycles = ERODE //SET ALL VOXELS THAT HAVE SURVIVED EROSION TO 128, WE THEN GROW THE ORIGIN for lInc := 1 to lVolSz do if lBuff^[lInc] =255 then lBuff^[lInc] := 128; //NOW - ONLY PRESERVE STUFF CONNECTED TO ORIGIN lBuff^[lOriginPos] := 128; lOriginIntensity := 128; lVariance := 2; lEdge := 2; lReadFilteredData := true; FillStart(lOriginPos); //SWITCH OFF ALL UNCONNECTED BLOBS for lInc := 1 to lVolSz do if lBuff^[lInc] =128 then lBuff^[lInc] := 0; //for lInc := 1 to lVolSz do // if lBuff[lInc] > 0 then showmessage(inttostr(lBuff[lInc]));// := 0; for lQHead := 1 to lErodeCycles do begin//DILATE for lInc := 1 to lVolSz do if (lPreErodeBuff^[lInc] = 255) and (ZeroonEdge(lInc)) then lBuff^[lInc] :=254; for lInc := 1 to lVolSz do if lBuff^[lInc]=254 then lBuff^[lInc] := 255; //erode end;//for ErodeCycles = DILATE Freemem(lPreErodeBuff); {} end; //ERODE cycles > 0 //END: ERODE/DILATE Freemem(lQra); ROIconstraint.enabled := (gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems > 1); //1410: next 3 lines if (ROIconstraint.ItemIndex = 1) and (ROIconstraint.enabled) then begin //delete ROI for lInc := 1 to gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems do //gROIBup if (lBuff^[lInc] = 255) then lBuff^[lInc] := 0 else lBuff^[lInc] := gBGImg.VOIUndoVol^[lInc]; end else (*if true {alfa (gDynSz > 1) and (gROIBupsz > 1) {and (gImageBackupSz = gDynSz){} then begin for lInc := 1 to gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems do if lBuff[lInc] = 255 then else if gImageBackupBuffer[lInc] = 255 then lBuff[lInc] := 255//255; else lBuff[lInc] := lSourceBuffer[lInc]; end else *) for lInc := 1 to lVolSz do if lBuff^[lInc] <> 255 then lBuff^[lInc] := gBGImg.VOIUndoVol^[lInc] else lBuff^[lInc] := kVOI8bit;//1401 gImageBackupBuffer[lInc]; Move(lBuff^,gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,lVolSz); Freemem(lBuff); //END check clusters ImgForm.RefreshImagesTimer.Enabled := true; end; procedure TAutoROIForm.FormShow(Sender: TObject); begin EnsureVOIOpen; CreateUndoVol; AutoROIForm.ModalResult := mrCancel; ROIconstraint.Enabled := (gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems > 1); OriginBtn.OnClick(sender); //DeleteCheck.enabled := (gROIBupSz > 1); //ROIConstrainCheck.enabled := (gROIBupSz > 1); end; procedure TAutoROIForm.FormCreate(Sender: TObject); begin {$IFNDEF FPC} ROIconstraint.SetItemIndex(0);//1410 {$ELSE} ROIconstraint.ItemIndex := (0);//1410 {$ENDIF} end; procedure TAutoROIForm.FormHide(Sender: TObject); begin // if (AutoROIForm.ModalResult = mrCancel) and (gBGImg.VOIUndoVolItems > 1) and (gBGImg.VOIUndoVolItems = gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems) then // Move(gImageBackupBuffer^,gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,gImageBackupSz); if (AutoROIForm.ModalResult = mrCancel) then UndoVolVOI; if not (AutoROIForm.ModalResult = mrCancel) then gBGImg.VOIchanged := true; //if gImageBackupSz <> 0 then Freemem(gImageBackupBuffer); //gImageBackupSz := 0; ImgForm.Fill3DBtn.Down := false; ImgForm.RefreshImagesTimer.Enabled := true; end; //Previous: create 3D ROI //Below fill bubbles in 3D ROIS //ROIcluster Follows (***********************************************************88 ************************************************************ **********************************************************) procedure ROICluster (lXdim, lYDim, lZDim,lXOriginIn,lYOrigin,lZOrigin: integer; lDeleteNotFill: boolean); var lVariability,lOrigin,lClusterInputValue,lClusterOutputValue, lClusterSz,lQTail, lXOrigin,lQHead,lSliceSz,lQSz,lInc,lVolSz: integer; lXInc,lYInc,lZInc,lSlicePos,lYPos, lMinX,lMaxX,lMinY,lMaxY,lMinZ,lMaxZ, lMinXBound,lMaxXBound,lMinYBound,lMaxYBound,lMinZBound,lMaxZBound: integer; lAtEdge: boolean; lROIBuf: bytep; lQra: LongIntP; const kFillValue = -2; Procedure IncQra(var lVal, lQSz: integer); begin inc(lVal); if lVal >= lQSz then lVal := 1; end; procedure Check(lPixel: integer); begin if (abs(lROIBuf^[lPixel] - lClusterInputValue)) <= lVariability then begin//add item incQra(lQHead,lQSz); inc(lClusterSz); lROIBuf^[lPixel] := lClusterOutputValue; lQra^[lQHead] := lPixel; end; end; PROCEDURE RetirePixel; //FIFO cleanup VAR lVal,lXPos,lYPos,lZPos: integer; BEGIN lVal := lQra^[lQTail]; lXpos := lVal mod lXdim; if lXpos = 0 then lXPos := lXdim; lYpos := (1+((lVal-1) div lXdim)) mod lYDim; if lYPos = 0 then lYPos := lYdim; lZpos := ((lVal-1) div lSliceSz)+1; if lXPos < lMinX then lMinX := lXPos; if lXPos > lMaxX then lMaxX := lXPos; if lXpos > lMinXBound then Check(lVal -1);//check to left if lXPos < lMaxXBound then Check(lVal + 1); //check to right if lYPos < lMinY then lMinY := lYPos; if lYPos > lMaxY then lMaxY := lYPos; if lYpos > lMinYBound then Check(lVal -lXdim);//check previous line if lYPos < lMaxYBound then Check(lVal + lXdim); //check next line if lZPos < lMinZ then lMinZ := lZPos; if lZPos > lMaxZ then lMaxZ := lZPos; if lZpos > lMinZBound then Check(lVal -lSliceSz);//check previous slice if lZPos < lMaxZBound then Check(lVal + lSliceSz); //check next slice incQra(lQTail,lQSz); //done with this pixel END; procedure FillStart (lPt: integer); {FIFO algorithm: keep memory VERY low} var lI: integer; begin //1414 follows for lI := 1 to lQsz do lQra^[lI] := 0; lQHead := 0; lQTail := 1; Check(lPt); RetirePixel; while ((lQHead+1) <> lQTail) do begin//complete until all voxels in buffer have been tested RetirePixel; if (lQHead = lQSz) and (lQTail = 1) then exit; //break condition: avoids possible infinite loop where QTail is being incremented but QHead is stuck at maximum value end; end; procedure SelectClusters (lInput,lOutput: integer); begin lClusterSz := 0; lClusterInputValue := lInput; lClusterOutputValue := lOutput; FillStart(lOrigin); end; function Lo (lVolumeEdge,lObjectEdge: integer): integer; begin if lVolumeEdge > lObjectEdge then result := lObjectEdge else begin lAtEdge := true; result := lVolumeEdge; end; end; function Hi (lVolumeEdge,lObjectEdge: integer): integer; begin if lVolumeEdge < lObjectEdge then result := lObjectEdge else begin lAtEdge := true; result := lVolumeEdge; end; end; begin lXOrigin := lXOriginIn; lVolSz := lXdim*lYdim*lZdim; if gMRIcroOverlay[kVOIOverlayNum].ScrnBufferItems <> lVolSz then begin showmessage('You need to draw or load a VOI in order to use the 3D bubble tool.'); exit; end; CreateUndoVol; lSliceSz := lXdim * lYdim; lMinX:=lXOrigin; lMaxX:=lXOrigin; lMinY:=lYOrigin; lMaxY:=lYOrigin; lMinZ:=lZOrigin; lMaxZ:=lZOrigin; lMinXBound := 1; lMaxXBound := lXDim; lMinYBound := 1; lMaxYBound := lYDim; lMinZBound := 1; lMaxZBound := lZDim; lOrigin := lXOrigin + ((lYOrigin-1)*lXdim)+((lZOrigin-1)*lSliceSz); if (lOrigin > lVolSz) or (lXDim < 4) or (lYDim < 4) or (lZDim < 4) or (lVolSz < 1) {or (gROIBupSz <> lVolSz )} then exit; if (gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lOrigin] = 0) then begin showmessage('You must click directly on a ROI to select it. The 3D ROI bubble tool will not work unless you choose the ROI you wish to fill/delete.'); exit; end; GetMem(lROIBuf, lVolSz); for lInc := 1 to lVolSz do if gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lInc] > 0 then//ROI lROIBuf^[lInc] := 1 else lROIBuf^[lInc] := 0; //BEGIN: define selected ROI contiguous cluster lQSz := (lVolSz div 4)+8; GetMem(lQra,lQsz * sizeof(longint) ); lVariability := 0; //only convert images that are exactly 1 SelectClusters(1,255); //selected 3D ROI is 255, other ROI = 1, nonROI 0 //END: define selected roi //BEGIN: either delete selected ROI, _OR_ fill bubbles in selected ROI if lDeleteNotFill then begin for lInc := 1 to lVolSz do if lROIBuf^[lInc] = 1 then //alfa lROIBuf^[lInc] := gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lInc] //a different ROI else lROIBuf^[lInc] := 0;//gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer[lInc]; //1402 selected ROI or non-ROI end else begin //fill bubbles in selected ROI //FindROIbounds; lMinXBound := Hi(1,lMinX-1); lMaxXBound := Lo(lXDim,lMaxX+1); lMinYBound := Hi(1,lMinY-1); lMaxYBound := Lo(lYDim,lMaxY+1); lMinZBound := Hi(1,lMinZ-1); lMaxZBound := Lo(lZDim,lMaxZ+1); lOrigin := (lMinXBound) + ((lMinYBound-1)*lXdim)+((lMinZBound-1)*lSliceSz); lVariability := 2;//convert voxels that are either 0 or 1 to 1 SelectClusters(1,128); //now bubbles trapped in volume are set to zero //we next need to distinguish bubbles from unmarked voxels outside the searched object boundary for lZInc := lMinZBound to lMaxZBound do begin lSlicePos := (lZInc-1) * lSliceSz; for lYInc := lMinYBound to lMaxYBound do begin lYPos := (lYInc-1) * lXDim; for lXInc := lMinXBound to lMaxXBound do begin lInc := lXInc + lYPos + lSlicePos; if lROIBuf^[lInc] = 0 then lROIBuf^[lInc] := 33; end; //for X end; //for Y end; //for Z for lInc := 1 to lVolSz do if lROIBuf^[lInc] = 33 then lROIBuf^[lInc] := kVOI8bit //bubble in selected ROI else lROIBuf^[lInc] := gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^[lInc]; end; Freemem(lQra); //BEGIN: CREATE 3D UNDO BUFFER (*if (gDynSz > 1) and (gDynSz = gImageBackupSz) then begin if (gUndoBufSz > 0) then freemem(gUndoBuffer); gUndoBufSz := gDynSz; getmem(gUndoBuffer,gDynSz); Move(gImageBackupBuffer^,gUndoBuffer^,gImageBackupSz); gSaveUndoBuf := true; end; (**) //END: CREATE 3D UNDO BUFFER //BEGIN: mopping up: prepare data for viewing, report ROI change Move(lROIBuf^,gMRIcroOverlay[kVOIOverlayNum].ScrnBuffer^,lVolSz); Freemem(lROIBuf); {} gBGImg.VOIchanged := true; //END: mopping up ImgForm.RefreshImagesTimer.enabled := true; end; (**) procedure TAutoROIForm.AutoROIBtnClick(Sender: TObject); begin AutoROIForm.ModalResult := mrOK; AutoROIForm.close; end; procedure TAutoROIForm.CancelBtnClick(Sender: TObject); begin AutoROIForm.close; end; procedure TAutoROIForm.AutoROIchange(Sender: TObject); begin if not AutoROIForm.visible then exit; Timer1.Enabled := true; end; procedure TAutoROIForm.Timer1Timer(Sender: TObject); begin Timer1.Enabled := false; PreviewBtnClick(sender); end; procedure TAutoROIForm.FormDestroy(Sender: TObject); begin //if gImageBackupSz <> 0 then Freemem(gImageBackupBuffer); //gImageBackupSz := 0; end; {$IFDEF FPC} initialization {$I autoroi.lrs} {$ENDIF} end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/autoroi.lrs��������������������������������������������������������0000664�0001750�0001750�00000007112�11540144452�020055� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ This is an automatically generated lazarus resource file } LazarusResources.Add('TAutoROIForm','FORMDATA',[ 'TPF0'#12'TAutoROIForm'#11'AutoROIForm'#4'Left'#3#17#3#6'Height'#3'c'#1#3'Top' +#3#200#0#5'Width'#3#9#1#18'HorzScrollBar.Page'#3#8#1#18'VertScrollBar.Page'#3 +'b'#1#13'ActiveControl'#7#12'VarianceEdit'#7'Caption'#6#10'Create ROI'#12'Cl' +'ientHeight'#3'c'#1#11'ClientWidth'#3#9#1#21'Constraints.MaxHeight'#3'c'#1#20 +'Constraints.MaxWidth'#3#9#1#21'Constraints.MinHeight'#3'c'#1#20'Constraints' +'.MinWidth'#3#9#1#9'Font.Name'#6#13'MS Sans Serif'#8'OnCreate'#7#10'FormCrea' +'te'#9'OnDestroy'#7#11'FormDestroy'#6'OnHide'#7#8'FormHide'#6'OnShow'#7#8'Fo' +'rmShow'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#8'0.9.28.2'#0#6'T' +'Label'#11'OriginLabel'#4'Left'#2#4#6'Height'#2#18#3'Top'#2'*'#5'Width'#2'0' +#7'Caption'#6#8'Origin: '#11'ParentColor'#8#0#0#12'TSpeedButton'#9'OriginBtn' +#4'Left'#2#7#6'Height'#2#25#4'Hint'#6'&You can also double-click on the imag' +'e'#3'Top'#2#5#5'Width'#2'r'#7'Caption'#6#12'Reset origin'#5'Color'#7#9'clBt' +'nFace'#9'NumGlyphs'#2#0#7'OnClick'#7#14'OriginBtnClick'#8'ShowHint'#9#14'Pa' +'rentShowHint'#8#0#0#6'TLabel'#9'DiffLabel'#4'Left'#2#12#6'Height'#2#18#3'To' +'p'#2'b'#5'Width'#3#147#0#7'Caption'#6#22'Difference from origin'#11'ParentC' +'olor'#8#0#0#6'TLabel'#6'Label1'#4'Left'#2#12#6'Height'#2#18#3'Top'#3#132#0#5 +'Width'#3#130#0#7'Caption'#6#18'Difference at edge'#11'ParentColor'#8#0#0#6 +'TLabel'#6'Label2'#4'Left'#2#12#6'Height'#2#18#3'Top'#3#167#0#5'Width'#2'U'#7 +'Caption'#6#11'Radius (mm)'#11'ParentColor'#8#0#0#6'TLabel'#6'Label3'#4'Left' +#2#12#6'Height'#2#18#3'Top'#3#202#0#5'Width'#3#129#0#7'Caption'#6#19'Erode/d' +'ilate cycles'#11'ParentColor'#8#0#0#12'TSpeedButton'#10'AutoROIBtn'#4'Left' +#2'8'#6'Height'#2#25#3'Top'#3'0'#1#5'Width'#2'A'#7'Caption'#6#5'Apply'#5'Col' +'or'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'OnClick'#7#15'AutoROIBtnClick'#0#0#12 +'TSpeedButton'#9'CancelBtn'#4'Left'#2'x'#6'Height'#2#25#3'Top'#3'0'#1#5'Widt' +'h'#2'A'#7'Caption'#6#6'Cancel'#5'Color'#7#9'clBtnFace'#9'NumGlyphs'#2#0#7'O' +'nClick'#7#14'CancelBtnClick'#0#0#6'TLabel'#6'Label4'#4'Left'#2#4#6'Height'#2 +#18#3'Top'#2'J'#5'Width'#2'O'#7'Caption'#6#11'Constraints'#11'ParentColor'#8 +#0#0#9'TCheckBox'#17'ExcludeBlackCheck'#4'Left'#2#12#6'Height'#2#21#3'Top'#3 +#236#0#5'Width'#3#230#0#7'Caption'#6#30'Zero intensity constrains edge'#7'On' +'Click'#7#13'AutoROIchange'#8'TabOrder'#2#0#0#0#9'TSpinEdit'#12'VarianceEdit' +#4'Left'#3#173#0#6'Height'#2#27#3'Top'#2'Z'#5'Width'#2'H'#8'MaxValue'#3#255#0 +#8'OnChange'#7#13'AutoROIchange'#8'TabOrder'#2#1#5'Value'#2#16#0#0#9'TSpinEd' +'it'#8'EdgeEdit'#4'Left'#3#173#0#6'Height'#2#27#3'Top'#2'~'#5'Width'#2'H'#8 +'MaxValue'#3#255#0#8'OnChange'#7#13'AutoROIchange'#8'TabOrder'#2#2#5'Value'#2 +#16#0#0#9'TSpinEdit'#10'RadiusEdit'#4'Left'#3#173#0#6'Height'#2#27#3'Top'#3 +#161#0#5'Width'#2'H'#8'MaxValue'#3#15''''#8'OnChange'#7#13'AutoROIchange'#8 +'TabOrder'#2#3#5'Value'#2' '#0#0#9'TSpinEdit'#9'ErodeEdit'#4'Left'#3#173#0#6 +'Height'#2#27#3'Top'#3#196#0#5'Width'#2'H'#8'MaxValue'#2#12#8'OnChange'#7#13 +'AutoROIchange'#8'TabOrder'#2#4#0#0#9'TComboBox'#13'ROIconstraint'#4'Left'#2 +#12#6'Height'#2#31#3'Top'#3#12#1#5'Width'#3#212#0#10'ItemHeight'#2#0#13'Item' +'s.Strings'#1#6#21'Append to current VOI'#6#23'Delete from current VOI'#6#25 +'Constain with current VOI'#0#8'OnChange'#7#13'AutoROIchange'#5'Style'#7#14 +'csDropDownList'#8'TabOrder'#2#5#0#0#6'TTimer'#6'Timer1'#7'Enabled'#8#8'Inte' +'rval'#3#144#1#7'OnTimer'#7#11'Timer1Timer'#4'left'#2'('#3'top'#2'"'#0#0#0 ]); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/autoroi.lfm��������������������������������������������������������0000664�0001750�0001750�00000006521�11540144452�020036� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object AutoROIForm: TAutoROIForm Left = 785 Height = 355 Top = 200 Width = 265 HorzScrollBar.Page = 264 VertScrollBar.Page = 354 ActiveControl = VarianceEdit Caption = 'Create ROI' ClientHeight = 355 ClientWidth = 265 Constraints.MaxHeight = 355 Constraints.MaxWidth = 265 Constraints.MinHeight = 355 Constraints.MinWidth = 265 Font.Name = 'MS Sans Serif' OnCreate = FormCreate OnDestroy = FormDestroy OnHide = FormHide OnShow = FormShow Position = poScreenCenter LCLVersion = '0.9.28.2' object OriginLabel: TLabel Left = 4 Height = 18 Top = 42 Width = 48 Caption = 'Origin: ' ParentColor = False end object OriginBtn: TSpeedButton Left = 7 Height = 25 Hint = 'You can also double-click on the image' Top = 5 Width = 114 Caption = 'Reset origin' Color = clBtnFace NumGlyphs = 0 OnClick = OriginBtnClick ShowHint = True ParentShowHint = False end object DiffLabel: TLabel Left = 12 Height = 18 Top = 98 Width = 147 Caption = 'Difference from origin' ParentColor = False end object Label1: TLabel Left = 12 Height = 18 Top = 132 Width = 130 Caption = 'Difference at edge' ParentColor = False end object Label2: TLabel Left = 12 Height = 18 Top = 167 Width = 85 Caption = 'Radius (mm)' ParentColor = False end object Label3: TLabel Left = 12 Height = 18 Top = 202 Width = 129 Caption = 'Erode/dilate cycles' ParentColor = False end object AutoROIBtn: TSpeedButton Left = 56 Height = 25 Top = 304 Width = 65 Caption = 'Apply' Color = clBtnFace NumGlyphs = 0 OnClick = AutoROIBtnClick end object CancelBtn: TSpeedButton Left = 120 Height = 25 Top = 304 Width = 65 Caption = 'Cancel' Color = clBtnFace NumGlyphs = 0 OnClick = CancelBtnClick end object Label4: TLabel Left = 4 Height = 18 Top = 74 Width = 79 Caption = 'Constraints' ParentColor = False end object ExcludeBlackCheck: TCheckBox Left = 12 Height = 21 Top = 236 Width = 230 Caption = 'Zero intensity constrains edge' OnClick = AutoROIchange TabOrder = 0 end object VarianceEdit: TSpinEdit Left = 173 Height = 27 Top = 90 Width = 72 MaxValue = 255 OnChange = AutoROIchange TabOrder = 1 Value = 16 end object EdgeEdit: TSpinEdit Left = 173 Height = 27 Top = 126 Width = 72 MaxValue = 255 OnChange = AutoROIchange TabOrder = 2 Value = 16 end object RadiusEdit: TSpinEdit Left = 173 Height = 27 Top = 161 Width = 72 MaxValue = 9999 OnChange = AutoROIchange TabOrder = 3 Value = 32 end object ErodeEdit: TSpinEdit Left = 173 Height = 27 Top = 196 Width = 72 MaxValue = 12 OnChange = AutoROIchange TabOrder = 4 end object ROIconstraint: TComboBox Left = 12 Height = 31 Top = 268 Width = 212 ItemHeight = 0 Items.Strings = ( 'Append to current VOI' 'Delete from current VOI' 'Constain with current VOI' ) OnChange = AutoROIchange Style = csDropDownList TabOrder = 5 end object Timer1: TTimer Enabled = False Interval = 400 OnTimer = Timer1Timer left = 40 top = 34 end end �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/about.pas����������������������������������������������������������0000664�0001750�0001750�00000002445�11545352326�017502� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������unit about; interface uses {$IFDEF FPC}LResources,{$ELSE} ShellAPI, {$ENDIF} {$IFNDEF Unix} Windows,{$ENDIF} SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, define_types; type { TAboutForm } TAboutForm = class(TForm) HomepageLabel: TLabel; Panel2: TPanel; Panel1: TPanel; ThreadLabel: TLabel; procedure FormCreate(Sender: TObject); procedure HomePageClick(Sender: TObject); procedure Panel1Click(Sender: TObject); procedure Panel1DragDrop(Sender, Source: TObject; X, Y: Integer); private { Private declarations } public { Public declarations } end; var AboutForm: TAboutForm; implementation {$IFNDEF FPC} {$R *.DFM} {$ENDIF} procedure TAboutForm.FormCreate(Sender: TObject); begin HomepageLabel.caption := 'www.mricro.com :: '+kMRIcronVers ; end; procedure TAboutForm.HomePageClick(Sender: TObject); begin {$IFDEF FPC} {$ELSE} ShellExecute (0, Nil, 'http://www.mricro.com', Nil, Nil, SW_ShowDefault); {$ENDIF} end; procedure TAboutForm.Panel1Click(Sender: TObject); begin end; procedure TAboutForm.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer); begin //showmessage('x'); end; {$IFDEF FPC} initialization {$I about.lrs} {$ENDIF} end. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/about.lrs����������������������������������������������������������0000664�0001750�0001750�00000003220�11545352326�017507� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ This is an automatically generated lazarus resource file } LazarusResources.Add('TAboutForm','FORMDATA',[ 'TPF0'#10'TAboutForm'#9'AboutForm'#4'Left'#3#147#2#6'Height'#2#127#3'Top'#3 +#150#0#5'Width'#3'G'#1#13'ActiveControl'#7#6'Panel1'#11'BorderIcons'#11#12'b' +'iSystemMenu'#0#11'BorderStyle'#7#8'bsDialog'#7'Caption'#6#8'About...'#12'Cl' +'ientHeight'#2#127#11'ClientWidth'#3'G'#1#21'Constraints.MaxHeight'#2#127#20 +'Constraints.MaxWidth'#3'G'#1#21'Constraints.MinHeight'#2#127#20'Constraints' +'.MinWidth'#3'G'#1#9'Font.Name'#6#13'MS Sans Serif'#8'OnCreate'#7#10'FormCre' +'ate'#8'Position'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29'#0#6'TPanel' +#6'Panel1'#4'Left'#2#0#6'Height'#2'0'#3'Top'#2#0#5'Width'#3'G'#1#5'Align'#7#5 +'alTop'#9'Alignment'#7#13'taLeftJustify'#10'BevelOuter'#7#6'bvNone'#7'Captio' +'n'#6#8' MRIcron'#10'Font.Color'#7#7'clBlack'#11'Font.Height'#2#237#9'Font.N' +'ame'#6#17'helvetica [adobe]'#10'Font.Style'#11#6'fsBold'#0#11'ParentColor'#8 +#10'ParentFont'#8#8'TabOrder'#2#0#7'OnClick'#7#11'Panel1Click'#10'OnDragDrop' +#7#14'Panel1DragDrop'#0#0#6'TPanel'#6'Panel2'#4'Left'#2#8#6'Height'#2'C'#3'T' +'op'#2'/'#5'Width'#3'3'#1#12'ClientHeight'#2'C'#11'ClientWidth'#3'3'#1#8'Tab' +'Order'#2#1#0#6'TLabel'#13'HomepageLabel'#4'Left'#2#0#6'Height'#2#20#3'Top'#2 +#10#5'Width'#3'1'#1#9'Alignment'#7#8'taCenter'#8'AutoSize'#8#7'Caption'#6#7 +'version'#11'ParentColor'#8#7'OnClick'#7#13'HomePageClick'#0#0#6'TLabel'#11 +'ThreadLabel'#4'Left'#2#1#6'Height'#2#20#3'Top'#2'$'#5'Width'#3'1'#1#9'Align' +'ment'#7#8'taCenter'#8'AutoSize'#8#7'Caption'#6#8' Threads'#11'ParentColor'#8 +#0#0#0#0 ]); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mricron-0.20120505.1~dfsg.1.orig/about.lfm����������������������������������������������������������0000664�0001750�0001750�00000002673�11545352326�017500� 0����������������������������������������������������������������������������������������������������ustar �michael�������������������������michael����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������object AboutForm: TAboutForm Left = 659 Height = 127 Top = 150 Width = 327 ActiveControl = Panel1 BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'About...' ClientHeight = 127 ClientWidth = 327 Constraints.MaxHeight = 127 Constraints.MaxWidth = 327 Constraints.MinHeight = 127 Constraints.MinWidth = 327 Font.Name = 'MS Sans Serif' OnCreate = FormCreate Position = poScreenCenter LCLVersion = '0.9.29' object Panel1: TPanel Left = 0 Height = 48 Top = 0 Width = 327 Align = alTop Alignment = taLeftJustify BevelOuter = bvNone Caption = ' MRIcron' Font.Color = clBlack Font.Height = -19 Font.Name = 'helvetica [adobe]' Font.Style = [fsBold] ParentColor = False ParentFont = False TabOrder = 0 OnClick = Panel1Click OnDragDrop = Panel1DragDrop end object Panel2: TPanel Left = 8 Height = 67 Top = 47 Width = 307 ClientHeight = 67 ClientWidth = 307 TabOrder = 1 object HomepageLabel: TLabel Left = 0 Height = 20 Top = 10 Width = 305 Alignment = taCenter AutoSize = False Caption = 'version' ParentColor = False OnClick = HomePageClick end object ThreadLabel: TLabel Left = 1 Height = 20 Top = 36 Width = 305 Alignment = taCenter AutoSize = False Caption = ' Threads' ParentColor = False end end end ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������